mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:51:15 +08:00
Add gdb.events.tui_enabled
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>
This commit is contained in:
parent
893e4fd623
commit
76367d2314
2
gdb/NEWS
2
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
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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 */
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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"
|
||||
|
@ -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)
|
||||
|
@ -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. */
|
||||
|
Loading…
Reference in New Issue
Block a user