gdb: add interp::on_user_selected_context_changed method
Same as previous patches, but for user_selected_context_changed. Change-Id: I40de15be897671227d4bcf3e747f0fd595f0d5be
This commit is contained in:
parent
2736b77153
commit
77cd03e27c
12 changed files with 67 additions and 84 deletions
|
@ -67,15 +67,6 @@ cli_interp::cli_interp (const char *name)
|
|||
/* Suppress notification struct. */
|
||||
struct cli_suppress_notification cli_suppress_notification;
|
||||
|
||||
/* Returns the INTERP's data cast as cli_interp_base if INTERP is a
|
||||
console-like interpreter, and returns NULL otherwise. */
|
||||
|
||||
static cli_interp_base *
|
||||
as_cli_interp_base (interp *interp)
|
||||
{
|
||||
return dynamic_cast<cli_interp_base *> (interp);
|
||||
}
|
||||
|
||||
/* See cli-interp.h.
|
||||
|
||||
Breakpoint hits should always be mirrored to a console. Deciding
|
||||
|
@ -164,10 +155,8 @@ cli_interp_base::on_command_error ()
|
|||
display_gdb_prompt (NULL);
|
||||
}
|
||||
|
||||
/* Observer for the user_selected_context_changed notification. */
|
||||
|
||||
static void
|
||||
cli_base_on_user_selected_context_changed (user_selected_what selection)
|
||||
void
|
||||
cli_interp_base::on_user_selected_context_changed (user_selected_what selection)
|
||||
{
|
||||
/* This event is suppressed. */
|
||||
if (cli_suppress_notification.user_selected_context)
|
||||
|
@ -175,19 +164,12 @@ cli_base_on_user_selected_context_changed (user_selected_what selection)
|
|||
|
||||
thread_info *tp = inferior_ptid != null_ptid ? inferior_thread () : nullptr;
|
||||
|
||||
SWITCH_THRU_ALL_UIS ()
|
||||
{
|
||||
cli_interp_base *cli = as_cli_interp_base (top_level_interpreter ());
|
||||
if (cli == nullptr)
|
||||
continue;
|
||||
if (selection & USER_SELECTED_INFERIOR)
|
||||
print_selected_inferior (this->interp_ui_out ());
|
||||
|
||||
if (selection & USER_SELECTED_INFERIOR)
|
||||
print_selected_inferior (cli->interp_ui_out ());
|
||||
|
||||
if (tp != nullptr
|
||||
&& ((selection & (USER_SELECTED_THREAD | USER_SELECTED_FRAME))))
|
||||
print_selected_thread_frame (cli->interp_ui_out (), selection);
|
||||
}
|
||||
if (tp != nullptr
|
||||
&& ((selection & (USER_SELECTED_THREAD | USER_SELECTED_FRAME))))
|
||||
print_selected_thread_frame (this->interp_ui_out (), selection);
|
||||
}
|
||||
|
||||
/* pre_command_loop implementation. */
|
||||
|
@ -347,8 +329,4 @@ void
|
|||
_initialize_cli_interp ()
|
||||
{
|
||||
interp_factory_register (INTERP_CONSOLE, cli_interp_factory);
|
||||
|
||||
/* Note these all work for both the CLI and TUI interpreters. */
|
||||
gdb::observers::user_selected_context_changed.attach
|
||||
(cli_base_on_user_selected_context_changed, "cli-interp-base");
|
||||
}
|
||||
|
|
|
@ -40,6 +40,7 @@ public:
|
|||
void on_no_history () override;
|
||||
void on_sync_execution_done () override;
|
||||
void on_command_error () override;
|
||||
void on_user_selected_context_changed (user_selected_what selection) override;
|
||||
|
||||
private:
|
||||
struct saved_output_files
|
||||
|
|
|
@ -745,7 +745,7 @@ inferior_command (const char *args, int from_tty)
|
|||
switch_to_thread (tp);
|
||||
}
|
||||
|
||||
gdb::observers::user_selected_context_changed.notify
|
||||
notify_user_selected_context_changed
|
||||
(USER_SELECTED_INFERIOR
|
||||
| USER_SELECTED_THREAD
|
||||
| USER_SELECTED_FRAME);
|
||||
|
@ -754,7 +754,7 @@ inferior_command (const char *args, int from_tty)
|
|||
{
|
||||
switch_to_inferior_no_thread (inf);
|
||||
|
||||
gdb::observers::user_selected_context_changed.notify
|
||||
notify_user_selected_context_changed
|
||||
(USER_SELECTED_INFERIOR);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6283,6 +6283,14 @@ notify_normal_stop (bpstat *bs, int print_frame)
|
|||
gdb::observers::normal_stop.notify (bs, print_frame);
|
||||
}
|
||||
|
||||
/* See infrun.h. */
|
||||
|
||||
void notify_user_selected_context_changed (user_selected_what selection)
|
||||
{
|
||||
interps_notify_user_selected_context_changed (selection);
|
||||
gdb::observers::user_selected_context_changed.notify (selection);
|
||||
}
|
||||
|
||||
/* Come here when the program has stopped with a signal. */
|
||||
|
||||
static void
|
||||
|
|
|
@ -218,6 +218,9 @@ extern void notify_signal_received (gdb_signal sig);
|
|||
normally. */
|
||||
extern void notify_normal_stop (bpstat *bs, int print_frame);
|
||||
|
||||
/* Notify interpreters and observers that the user focus has changed. */
|
||||
extern void notify_user_selected_context_changed (user_selected_what selection);
|
||||
|
||||
/* Several print_*_reason helper functions to print why the inferior
|
||||
has stopped to the passed in UIOUT. */
|
||||
|
||||
|
|
|
@ -438,6 +438,14 @@ interps_notify_exited (int status)
|
|||
interps_notify (&interp::on_exited, status);
|
||||
}
|
||||
|
||||
/* See interps.h. */
|
||||
|
||||
void
|
||||
interps_notify_user_selected_context_changed (user_selected_what selection)
|
||||
{
|
||||
interps_notify (&interp::on_user_selected_context_changed, selection);
|
||||
}
|
||||
|
||||
/* This just adds the "interpreter-exec" command. */
|
||||
void _initialize_interpreter ();
|
||||
void
|
||||
|
|
|
@ -110,6 +110,10 @@ public:
|
|||
command on this interpreter. */
|
||||
virtual void on_command_error () {}
|
||||
|
||||
/* Notify the interpreter that the user focus has changed. */
|
||||
virtual void on_user_selected_context_changed (user_selected_what selection)
|
||||
{}
|
||||
|
||||
private:
|
||||
/* The memory for this is static, it comes from literal strings (e.g. "cli"). */
|
||||
const char *m_name;
|
||||
|
@ -217,6 +221,10 @@ extern void interps_notify_no_history ();
|
|||
status STATUS. */
|
||||
extern void interps_notify_exited (int status);
|
||||
|
||||
/* Notify all interpreters that the user focus has changed. */
|
||||
extern void interps_notify_user_selected_context_changed
|
||||
(user_selected_what selection);
|
||||
|
||||
/* well-known interpreters */
|
||||
#define INTERP_CONSOLE "console"
|
||||
#define INTERP_MI2 "mi2"
|
||||
|
|
|
@ -1087,60 +1087,40 @@ mi_memory_changed (struct inferior *inferior, CORE_ADDR memaddr,
|
|||
}
|
||||
}
|
||||
|
||||
/* Emit an event when the selection context (inferior, thread, frame)
|
||||
changed. */
|
||||
|
||||
static void
|
||||
mi_user_selected_context_changed (user_selected_what selection)
|
||||
void
|
||||
mi_interp::on_user_selected_context_changed (user_selected_what selection)
|
||||
{
|
||||
struct thread_info *tp;
|
||||
|
||||
/* Don't send an event if we're responding to an MI command. */
|
||||
if (mi_suppress_notification.user_selected_context)
|
||||
return;
|
||||
|
||||
if (inferior_ptid != null_ptid)
|
||||
tp = inferior_thread ();
|
||||
else
|
||||
tp = NULL;
|
||||
thread_info *tp = inferior_ptid != null_ptid ? inferior_thread () : nullptr;
|
||||
ui_out *mi_uiout = this->interp_ui_out ();
|
||||
ui_out_redirect_pop redirect_popper (mi_uiout, this->event_channel);
|
||||
|
||||
SWITCH_THRU_ALL_UIS ()
|
||||
target_terminal::scoped_restore_terminal_state term_state;
|
||||
target_terminal::ours_for_output ();
|
||||
|
||||
if (selection & USER_SELECTED_INFERIOR)
|
||||
print_selected_inferior (this->cli_uiout);
|
||||
|
||||
if (tp != NULL
|
||||
&& (selection & (USER_SELECTED_THREAD | USER_SELECTED_FRAME)))
|
||||
{
|
||||
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
|
||||
struct ui_out *mi_uiout;
|
||||
print_selected_thread_frame (this->cli_uiout, selection);
|
||||
|
||||
if (mi == NULL)
|
||||
continue;
|
||||
gdb_printf (this->event_channel, "thread-selected,id=\"%d\"",
|
||||
tp->global_num);
|
||||
|
||||
mi_uiout = top_level_interpreter ()->interp_ui_out ();
|
||||
|
||||
ui_out_redirect_pop redirect_popper (mi_uiout, mi->event_channel);
|
||||
|
||||
target_terminal::scoped_restore_terminal_state term_state;
|
||||
target_terminal::ours_for_output ();
|
||||
|
||||
if (selection & USER_SELECTED_INFERIOR)
|
||||
print_selected_inferior (mi->cli_uiout);
|
||||
|
||||
if (tp != NULL
|
||||
&& (selection & (USER_SELECTED_THREAD | USER_SELECTED_FRAME)))
|
||||
if (tp->state != THREAD_RUNNING)
|
||||
{
|
||||
print_selected_thread_frame (mi->cli_uiout, selection);
|
||||
|
||||
gdb_printf (mi->event_channel,
|
||||
"thread-selected,id=\"%d\"",
|
||||
tp->global_num);
|
||||
|
||||
if (tp->state != THREAD_RUNNING)
|
||||
{
|
||||
if (has_stack_frames ())
|
||||
print_stack_frame_to_uiout (mi_uiout, get_selected_frame (NULL),
|
||||
1, SRC_AND_LOC, 1);
|
||||
}
|
||||
if (has_stack_frames ())
|
||||
print_stack_frame_to_uiout (mi_uiout, get_selected_frame (NULL),
|
||||
1, SRC_AND_LOC, 1);
|
||||
}
|
||||
|
||||
gdb_flush (mi->event_channel);
|
||||
}
|
||||
|
||||
gdb_flush (this->event_channel);
|
||||
}
|
||||
|
||||
ui_out *
|
||||
|
@ -1234,6 +1214,4 @@ _initialize_mi_interp ()
|
|||
gdb::observers::command_param_changed.attach (mi_command_param_changed,
|
||||
"mi-interp");
|
||||
gdb::observers::memory_changed.attach (mi_memory_changed, "mi-interp");
|
||||
gdb::observers::user_selected_context_changed.attach
|
||||
(mi_user_selected_context_changed, "mi-interp");
|
||||
}
|
||||
|
|
|
@ -49,6 +49,7 @@ public:
|
|||
void on_no_history () override;
|
||||
void on_sync_execution_done () override;
|
||||
void on_command_error () override;
|
||||
void on_user_selected_context_changed (user_selected_what selection) override;
|
||||
|
||||
/* MI's output channels */
|
||||
mi_console_file *out;
|
||||
|
|
|
@ -2138,7 +2138,7 @@ mi_cmd_execute (struct mi_parse *parse)
|
|||
|
||||
if (!parse->cmd->preserve_user_selected_context ()
|
||||
&& current_user_selected_context.has_changed ())
|
||||
gdb::observers::user_selected_context_changed.notify
|
||||
interps_notify_user_selected_context_changed
|
||||
(USER_SELECTED_THREAD | USER_SELECTED_FRAME);
|
||||
}
|
||||
|
||||
|
|
|
@ -1831,7 +1831,7 @@ select_frame_command_core (frame_info_ptr fi, bool ignored)
|
|||
frame_info_ptr prev_frame = get_selected_frame ();
|
||||
select_frame (fi);
|
||||
if (get_selected_frame () != prev_frame)
|
||||
gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME);
|
||||
notify_user_selected_context_changed (USER_SELECTED_FRAME);
|
||||
}
|
||||
|
||||
/* The core of all the "frame" sub-commands. Select frame FI, and if this
|
||||
|
@ -1844,7 +1844,7 @@ frame_command_core (frame_info_ptr fi, bool ignored)
|
|||
frame_info_ptr prev_frame = get_selected_frame ();
|
||||
select_frame (fi);
|
||||
if (get_selected_frame () != prev_frame)
|
||||
gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME);
|
||||
notify_user_selected_context_changed (USER_SELECTED_FRAME);
|
||||
else
|
||||
print_selected_thread_frame (current_uiout, USER_SELECTED_FRAME);
|
||||
}
|
||||
|
@ -2644,7 +2644,7 @@ static void
|
|||
up_command (const char *count_exp, int from_tty)
|
||||
{
|
||||
up_silently_base (count_exp);
|
||||
gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME);
|
||||
notify_user_selected_context_changed (USER_SELECTED_FRAME);
|
||||
}
|
||||
|
||||
/* Select the frame down one or COUNT_EXP stack levels from the previously
|
||||
|
@ -2683,7 +2683,7 @@ static void
|
|||
down_command (const char *count_exp, int from_tty)
|
||||
{
|
||||
down_silently_base (count_exp);
|
||||
gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME);
|
||||
notify_user_selected_context_changed (USER_SELECTED_FRAME);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -1846,10 +1846,8 @@ thread_command (const char *tidstr, int from_tty)
|
|||
| USER_SELECTED_FRAME);
|
||||
}
|
||||
else
|
||||
{
|
||||
gdb::observers::user_selected_context_changed.notify
|
||||
(USER_SELECTED_THREAD | USER_SELECTED_FRAME);
|
||||
}
|
||||
notify_user_selected_context_changed
|
||||
(USER_SELECTED_THREAD | USER_SELECTED_FRAME);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue