]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Add gdb.events.tui_enabled
authorTom Tromey <tromey@adacore.com>
Wed, 25 Sep 2024 14:27:51 +0000 (08:27 -0600)
committerTom Tromey <tromey@adacore.com>
Fri, 1 Nov 2024 17:06:47 +0000 (11:06 -0600)
This adds a new event source so that Python scripts can track whether
or not the TUI is presently enabled.

v2 of the patch renames "status" -> "enabled".

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32162
Reviewed-By: Eli Zaretskii <eliz@gnu.org>
Reviewed-by: Keith Seitz <keiths@redhat.com>
gdb/NEWS
gdb/doc/python.texi
gdb/observable.c
gdb/observable.h
gdb/python/py-all-events.def
gdb/python/py-event-types.def
gdb/python/py-tui.c
gdb/testsuite/gdb.python/tui-window.exp
gdb/testsuite/gdb.python/tui-window.py
gdb/tui/tui.c

index 42b8a88fd8a43a16dca0abc5e7b9b1874602890b..678d031b02fdc934f9b2b629f46d516ce19000f2 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -56,6 +56,8 @@
   ** Added gdb.record.clear.  Clears the trace data of the current recording.
      This forces re-decoding of the trace for successive commands.
 
+  ** Added the new event source gdb.tui_enabled.
+
 * Debugger Adapter Protocol changes
 
   ** The "scopes" request will now return a scope holding global
index 22f0e6c6d0a83bbefd8aaf304dff8c12edd60730..b68fe0440ab57ef6c7a07e4a1587bd5bb41a9960 100644 (file)
@@ -4081,6 +4081,16 @@ The @code{gdb.Progspace} that is about to be removed from
 @value{GDBN}.
 @end defvar
 
+@item events.tui_enabled
+This is emitted when the TUI is enabled or disabled.  The event is of
+type @code{gdb.TuiEnabledEvent}, which has a single read-only
+attribute:
+
+@defvar TuiStatusEvent.enabled
+If the TUI has just been enabled, this is @code{True}; otherwise it is
+@code{False}.
+@end defvar
+
 @end table
 
 @node Threads In Python
index 7816d214ad8bb452db6fb3875c716183d7a1f95d..cc1b01df99bc949a6f09febe37d343e039bcd390 100644 (file)
@@ -75,6 +75,7 @@ DEFINE_OBSERVABLE (target_pre_wait);
 DEFINE_OBSERVABLE (target_post_wait);
 DEFINE_OBSERVABLE (new_program_space);
 DEFINE_OBSERVABLE (free_program_space);
+DEFINE_OBSERVABLE (tui_enabled);
 
 } /* namespace observers */
 } /* namespace gdb */
index 2aa3ef3fd4eec27a9ca024d584c2b6a30e39d930..06c0cf1dae8d5ef8300e7ea81b3f0315003a1948 100644 (file)
@@ -253,6 +253,8 @@ extern observable <program_space */* pspace */> new_program_space;
 /* The program space PSPACE is about to be deleted.  */
 extern observable <program_space */* pspace */> free_program_space;
 
+extern observable<bool /* enabled */> tui_enabled;
+
 } /* namespace observers */
 
 } /* namespace gdb */
index 4df5541f9699a81481daf74de7f8ee258934285b..f315e75b5e73b44041eca6b70e9a0b4d70049cb0 100644 (file)
@@ -45,3 +45,4 @@ GDB_PY_DEFINE_EVENT(connection_removed)
 GDB_PY_DEFINE_EVENT(executable_changed)
 GDB_PY_DEFINE_EVENT(new_progspace)
 GDB_PY_DEFINE_EVENT(free_progspace)
+GDB_PY_DEFINE_EVENT(tui_enabled)
index f43a51b5ed4a704cc30eadf77bbe694358f9d37b..e22f042bd6b353695a5664a42c004dc7a3d8d31b 100644 (file)
@@ -140,3 +140,8 @@ GDB_PY_DEFINE_EVENT_TYPE (free_progspace,
                          "FreeProgspaceEvent",
                          "GDB free Progspace event object",
                          event_object_type);
+
+GDB_PY_DEFINE_EVENT_TYPE (tui_enabled,
+                         "TuiEnabledEvent",
+                         "GDB TUI enabled event object",
+                         event_object_type);
index afa6f36baeb376c4b0c85d8d84a0ead6793d0923..09f0a603ea0a3d0b61a87b97286eb38e62f8ff9f 100644 (file)
@@ -36,6 +36,9 @@
 #include "tui/tui-layout.h"
 #include "tui/tui-wingeneral.h"
 #include "tui/tui-winsource.h"
+#include "observable.h"
+#include "py-events.h"
+#include "py-event.h"
 
 class tui_py_window;
 
@@ -616,6 +619,29 @@ PyTypeObject gdbpy_tui_window_object_type =
   0,                             /* tp_alloc */
 };
 
+/* Called when TUI is enabled or disabled.  */
+
+static void
+gdbpy_tui_enabled (bool state)
+{
+  gdbpy_enter enter_py;
+
+  if (evregpy_no_listeners_p (gdb_py_events.tui_enabled))
+    return;
+
+  gdbpy_ref<> event_obj = create_event_object (&tui_enabled_event_object_type);
+  if (event_obj == nullptr)
+    {
+      gdbpy_print_stack ();
+      return;
+    }
+
+  gdbpy_ref<> code (PyBool_FromLong (state));
+  if (evpy_add_attribute (event_obj.get (), "enabled", code.get ()) < 0
+      || evpy_emit_event (event_obj.get (), gdb_py_events.tui_enabled) < 0)
+    gdbpy_print_stack ();
+}
+
 #endif /* TUI */
 
 /* Initialize this module.  */
@@ -627,6 +653,8 @@ gdbpy_initialize_tui ()
   gdbpy_tui_window_object_type.tp_new = PyType_GenericNew;
   if (gdbpy_type_ready (&gdbpy_tui_window_object_type) < 0)
     return -1;
+
+  gdb::observers::tui_enabled.attach (gdbpy_tui_enabled, "py-tui");
 #endif /* TUI */
 
   return 0;
index e7ff1621fe8e950f318d06d0feb2287bd5fed01a..c521dcc4076791123acafa4d6385c66cd3b2d1fe 100644 (file)
@@ -43,6 +43,9 @@ if {![Term::enter_tui]} {
     return
 }
 
+Term::command "python print('tui_enabled=' + str(tui_enabled))"
+Term::check_contents "tui start event" "tui_enabled=True"
+
 Term::command "layout test"
 Term::check_contents "test title" \
     "This Is The Title"
@@ -63,3 +66,8 @@ Term::resize 51 51
 Term::check_contents "Window was updated" "Test: 2"
 
 Term::command "layout fail"
+
+Term::command "tui disable"
+gdb_test "python print('tui_enabled=' + str(tui_enabled))" \
+    "tui_enabled=False" \
+    "tui disable event"
index d031f72873543bec940d00d576104852d56c45db..0661acccab5053323d5f14c711b9db9e6ae4cc2a 100644 (file)
@@ -20,6 +20,9 @@ import gdb
 the_window = None
 
 
+tui_enabled = False
+
+
 class TestWindow:
     def __init__(self, win):
         global the_window
@@ -62,3 +65,11 @@ def change_window_title():
 
 
 gdb.register_window_type("fail", failwin)
+
+
+def set_tui_enabled(ev):
+    global tui_enabled
+    tui_enabled = ev.enabled
+
+
+gdb.events.tui_enabled.connect(set_tui_enabled)
index bc96cd85d59a40ed84e61c97b2b3bd55da534030..59aa1bc1483c92cf33c4499ce5cdd61451f33d8c 100644 (file)
@@ -40,6 +40,7 @@
 #include "terminal.h"
 #include "top.h"
 #include "ui.h"
+#include "observable.h"
 
 #include <fcntl.h>
 
@@ -509,6 +510,8 @@ tui_enable (void)
   /* Update gdb's knowledge of its terminal.  */
   gdb_save_tty_state ();
   tui_update_gdb_sizes ();
+
+  gdb::observers::tui_enabled.notify (true);
 }
 
 /* Leave the tui mode.
@@ -547,6 +550,8 @@ tui_disable (void)
 
   tui_active = false;
   tui_update_gdb_sizes ();
+
+  gdb::observers::tui_enabled.notify (false);
 }
 
 /* Command wrapper for enabling tui mode.  */