]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/tui/tui-hooks.c
Remove unnecessary function prototypes.
[thirdparty/binutils-gdb.git] / gdb / tui / tui-hooks.c
CommitLineData
2611b1a5 1/* GDB hooks for TUI.
f33c6cbf 2
61baf725 3 Copyright (C) 2001-2017 Free Software Foundation, Inc.
2611b1a5
SC
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
2611b1a5
SC
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
2611b1a5
SC
19
20#include "defs.h"
21#include "symtab.h"
22#include "inferior.h"
23#include "command.h"
24#include "bfd.h"
25#include "symfile.h"
26#include "objfiles.h"
27#include "target.h"
28#include "gdbcore.h"
29#include "event-loop.h"
2b68e2c5 30#include "event-top.h"
2611b1a5
SC
31#include "frame.h"
32#include "breakpoint.h"
2b68e2c5
SC
33#include "ui-out.h"
34#include "top.h"
06d3b283 35#include "observer.h"
2611b1a5
SC
36#include <unistd.h>
37#include <fcntl.h>
38
d7b2e967 39#include "tui/tui.h"
6a83354a 40#include "tui/tui-hooks.h"
d7b2e967
AC
41#include "tui/tui-data.h"
42#include "tui/tui-layout.h"
43#include "tui/tui-io.h"
44#include "tui/tui-regs.h"
45#include "tui/tui-win.h"
46#include "tui/tui-stack.h"
47#include "tui/tui-windata.h"
48#include "tui/tui-winsource.h"
2611b1a5 49
6a83354a 50#include "gdb_curses.h"
96ec9981 51
4a1bcc8c
MK
52/* This redefines CTRL if it is not already defined, so it must come
53 after terminal state releated include files like <term.h> and
54 "gdb_curses.h". */
55#include "readline/readline.h"
56
2611b1a5
SC
57static void
58tui_new_objfile_hook (struct objfile* objfile)
59{
60 if (tui_active)
1f393769 61 tui_display_main ();
2611b1a5
SC
62}
63
3adda9d8 64/* Prevent recursion of deprecated_register_changed_hook(). */
2611b1a5
SC
65static int tui_refreshing_registers = 0;
66
a9bd710f
PP
67/* Observer for the register_changed notification. */
68
2611b1a5 69static void
a9bd710f 70tui_register_changed (struct frame_info *frame, int regno)
2611b1a5
SC
71{
72 struct frame_info *fi;
73
a9bd710f
PP
74 /* The frame of the register that was changed may differ from the selected
75 frame, but we only want to show the register values of the selected frame.
76 And even if the frames differ a register change made in one can still show
77 up in the other. So we always use the selected frame here, and ignore
78 FRAME. */
206415a3
DJ
79 fi = get_selected_frame (NULL);
80 if (tui_refreshing_registers == 0)
2611b1a5
SC
81 {
82 tui_refreshing_registers = 1;
edae1ccf 83 tui_check_data_values (fi);
2611b1a5
SC
84 tui_refreshing_registers = 0;
85 }
86}
87
2611b1a5
SC
88/* Breakpoint creation hook.
89 Update the screen to show the new breakpoint. */
90static void
8d3788bd 91tui_event_create_breakpoint (struct breakpoint *b)
2611b1a5 92{
00b2bad4 93 tui_update_all_breakpoint_info ();
2611b1a5
SC
94}
95
96/* Breakpoint deletion hook.
97 Refresh the screen to update the breakpoint marks. */
98static void
8d3788bd 99tui_event_delete_breakpoint (struct breakpoint *b)
2611b1a5 100{
00b2bad4 101 tui_update_all_breakpoint_info ();
2611b1a5
SC
102}
103
104static void
8d3788bd 105tui_event_modify_breakpoint (struct breakpoint *b)
2611b1a5 106{
00b2bad4 107 tui_update_all_breakpoint_info ();
2611b1a5
SC
108}
109
0986c744
PP
110/* Refresh TUI's frame and register information. This is a hook intended to be
111 used to update the screen after potential frame and register changes.
112
bbcbf914
PP
113 REGISTERS_TOO_P controls whether to refresh our register information even
114 if frame information hasn't changed. */
0986c744 115
2611b1a5 116static void
0986c744 117tui_refresh_frame_and_register_information (int registers_too_p)
2611b1a5
SC
118{
119 struct frame_info *fi;
f23d1b92 120 CORE_ADDR pc;
0a75489f 121 struct cleanup *old_chain;
bbcbf914 122 int frame_info_changed_p;
2611b1a5 123
0986c744 124 if (!has_stack_frames ())
3adda9d8
DJ
125 return;
126
0a75489f
PP
127 old_chain = make_cleanup_restore_target_terminal ();
128 target_terminal_ours_for_output ();
129
3adda9d8 130 fi = get_selected_frame (NULL);
1cc6d956
MS
131 /* Ensure that symbols for this frame are read in. Also, determine
132 the source language of this frame, and switch to it if
133 desired. */
f23d1b92 134 if (get_frame_pc_if_available (fi, &pc))
2611b1a5
SC
135 {
136 struct symtab *s;
f23d1b92 137
34248c3a 138 s = find_pc_line_symtab (pc);
1cc6d956 139 /* elz: This if here fixes the problem with the pc not being
f23d1b92
PA
140 displayed in the tui asm layout, with no debug symbols. The
141 value of s would be 0 here, and select_source_symtab would
142 abort the command by calling the 'error' function. */
2611b1a5 143 if (s)
f23d1b92
PA
144 select_source_symtab (s);
145 }
146
147 /* Display the frame position (even if there is no symbols or the PC
148 is not known). */
bbcbf914 149 frame_info_changed_p = tui_show_frame_info (fi);
f23d1b92
PA
150
151 /* Refresh the register window if it's visible. */
bbcbf914
PP
152 if (tui_is_window_visible (DATA_WIN)
153 && (frame_info_changed_p || registers_too_p))
f23d1b92
PA
154 {
155 tui_refreshing_registers = 1;
156 tui_check_data_values (fi);
157 tui_refreshing_registers = 0;
2611b1a5 158 }
0a75489f
PP
159
160 do_cleanups (old_chain);
2611b1a5
SC
161}
162
0986c744
PP
163/* Dummy callback for deprecated_print_frame_info_listing_hook which is called
164 from print_frame_info. */
165
2611b1a5 166static void
0986c744
PP
167tui_dummy_print_frame_info_listing_hook (struct symtab *s,
168 int line,
169 int stopline,
170 int noerror)
2611b1a5 171{
2611b1a5
SC
172}
173
d69e6a33
SC
174/* Perform all necessary cleanups regarding our module's inferior data
175 that is required after the inferior INF just exited. */
176
cda8ab40 177static void
d69e6a33 178tui_inferior_exit (struct inferior *inf)
cda8ab40 179{
d69e6a33
SC
180 /* Leave the SingleKey mode to make sure the gdb prompt is visible. */
181 tui_set_key_mode (TUI_COMMAND_MODE);
47d3492a 182 tui_show_frame_info (0);
cda8ab40
SC
183 tui_display_main ();
184}
185
0986c744
PP
186/* Observer for the before_prompt notification. */
187
188static void
189tui_before_prompt (const char *current_gdb_prompt)
190{
191 /* This refresh is intended to catch changes to the selected frame following
192 a call to "up", "down" or "frame". As such we don't necessarily want to
bbcbf914
PP
193 refresh registers here unless the frame actually changed by one of these
194 commands. Registers will otherwise be refreshed after a normal stop or by
195 our tui_register_changed_hook. */
0986c744
PP
196 tui_refresh_frame_and_register_information (/*registers_too_p=*/0);
197}
198
199/* Observer for the normal_stop notification. */
200
201static void
202tui_normal_stop (struct bpstats *bs, int print_frame)
203{
204 /* This refresh is intended to catch changes to the selected frame and to
205 registers following a normal stop. */
206 tui_refresh_frame_and_register_information (/*registers_too_p=*/1);
207}
208
383f836e
TT
209/* Observers created when installing TUI hooks. */
210static struct observer *tui_bp_created_observer;
211static struct observer *tui_bp_deleted_observer;
212static struct observer *tui_bp_modified_observer;
d69e6a33 213static struct observer *tui_inferior_exit_observer;
0986c744
PP
214static struct observer *tui_before_prompt_observer;
215static struct observer *tui_normal_stop_observer;
a9bd710f 216static struct observer *tui_register_changed_observer;
383f836e 217
2611b1a5
SC
218/* Install the TUI specific hooks. */
219void
220tui_install_hooks (void)
221{
0986c744
PP
222 /* If this hook is not set to something then print_frame_info will
223 assume that the CLI, not the TUI, is active, and will print the frame info
224 for us in such a way that we are not prepared to handle. This hook is
225 otherwise effectively obsolete. */
9a2b4c1b 226 deprecated_print_frame_info_listing_hook
0986c744 227 = tui_dummy_print_frame_info_listing_hook;
2611b1a5 228
2611b1a5 229 /* Install the event hooks. */
383f836e
TT
230 tui_bp_created_observer
231 = observer_attach_breakpoint_created (tui_event_create_breakpoint);
232 tui_bp_deleted_observer
233 = observer_attach_breakpoint_deleted (tui_event_delete_breakpoint);
234 tui_bp_modified_observer
235 = observer_attach_breakpoint_modified (tui_event_modify_breakpoint);
d69e6a33
SC
236 tui_inferior_exit_observer
237 = observer_attach_inferior_exit (tui_inferior_exit);
0986c744
PP
238 tui_before_prompt_observer
239 = observer_attach_before_prompt (tui_before_prompt);
240 tui_normal_stop_observer
241 = observer_attach_normal_stop (tui_normal_stop);
a9bd710f
PP
242 tui_register_changed_observer
243 = observer_attach_register_changed (tui_register_changed);
2611b1a5
SC
244}
245
246/* Remove the TUI specific hooks. */
247void
248tui_remove_hooks (void)
249{
9a4105ab
AC
250 deprecated_print_frame_info_listing_hook = 0;
251 deprecated_query_hook = 0;
383f836e
TT
252 /* Remove our observers. */
253 observer_detach_breakpoint_created (tui_bp_created_observer);
254 tui_bp_created_observer = NULL;
255 observer_detach_breakpoint_deleted (tui_bp_deleted_observer);
256 tui_bp_deleted_observer = NULL;
257 observer_detach_breakpoint_modified (tui_bp_modified_observer);
258 tui_bp_modified_observer = NULL;
d69e6a33
SC
259 observer_detach_inferior_exit (tui_inferior_exit_observer);
260 tui_inferior_exit_observer = NULL;
0986c744
PP
261 observer_detach_before_prompt (tui_before_prompt_observer);
262 tui_before_prompt_observer = NULL;
263 observer_detach_normal_stop (tui_normal_stop_observer);
264 tui_normal_stop_observer = NULL;
a9bd710f
PP
265 observer_detach_register_changed (tui_register_changed_observer);
266 tui_register_changed_observer = NULL;
2611b1a5
SC
267}
268
021e7609
AC
269void
270_initialize_tui_hooks (void)
2611b1a5 271{
2611b1a5 272 /* Install the permanent hooks. */
06d3b283 273 observer_attach_new_objfile (tui_new_objfile_hook);
2611b1a5 274}