]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/tui/tui-hooks.c
Update years in copyright notice for the GDB files.
[thirdparty/binutils-gdb.git] / gdb / tui / tui-hooks.c
CommitLineData
2611b1a5 1/* GDB hooks for TUI.
f33c6cbf 2
8acc9f48 3 Copyright (C) 2001-2013 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
57int tui_target_has_run = 0;
58
2611b1a5
SC
59static void
60tui_new_objfile_hook (struct objfile* objfile)
61{
62 if (tui_active)
1f393769 63 tui_display_main ();
2611b1a5
SC
64}
65
a0b31db1 66static int ATTRIBUTE_PRINTF (1, 0)
5b6fe301 67tui_query_hook (const char *msg, va_list argp)
2611b1a5
SC
68{
69 int retval;
70 int ans2;
71 int answer;
b09846a9
PA
72 char *question;
73 struct cleanup *old_chain;
74
75 /* Format the question outside of the loop, to avoid reusing
76 ARGP. */
77 question = xstrvprintf (msg, argp);
78 old_chain = make_cleanup (xfree, question);
2611b1a5 79
2611b1a5
SC
80 echo ();
81 while (1)
82 {
1cc6d956 83 wrap_here (""); /* Flush any buffered output. */
2611b1a5
SC
84 gdb_flush (gdb_stdout);
85
b09846a9 86 fputs_filtered (question, gdb_stdout);
a3f17187 87 printf_filtered (_("(y or n) "));
2611b1a5
SC
88
89 wrap_here ("");
90 gdb_flush (gdb_stdout);
91
92 answer = tui_getc (stdin);
93 clearerr (stdin); /* in case of C-d */
94 if (answer == EOF) /* C-d */
95 {
96 retval = 1;
97 break;
98 }
1cc6d956 99 /* Eat rest of input line, to EOF or newline. */
2611b1a5
SC
100 if (answer != '\n')
101 do
102 {
103 ans2 = tui_getc (stdin);
104 clearerr (stdin);
105 }
106 while (ans2 != EOF && ans2 != '\n' && ans2 != '\r');
107
108 if (answer >= 'a')
109 answer -= 040;
110 if (answer == 'Y')
111 {
112 retval = 1;
113 break;
114 }
115 if (answer == 'N')
116 {
117 retval = 0;
118 break;
119 }
a3f17187 120 printf_filtered (_("Please answer y or n.\n"));
2611b1a5
SC
121 }
122 noecho ();
b09846a9
PA
123
124 do_cleanups (old_chain);
2611b1a5
SC
125 return retval;
126}
127
3adda9d8 128/* Prevent recursion of deprecated_register_changed_hook(). */
2611b1a5
SC
129static int tui_refreshing_registers = 0;
130
2611b1a5
SC
131static void
132tui_register_changed_hook (int regno)
133{
134 struct frame_info *fi;
135
206415a3
DJ
136 fi = get_selected_frame (NULL);
137 if (tui_refreshing_registers == 0)
2611b1a5
SC
138 {
139 tui_refreshing_registers = 1;
edae1ccf 140 tui_check_data_values (fi);
2611b1a5
SC
141 tui_refreshing_registers = 0;
142 }
143}
144
2611b1a5
SC
145/* Breakpoint creation hook.
146 Update the screen to show the new breakpoint. */
147static void
8d3788bd 148tui_event_create_breakpoint (struct breakpoint *b)
2611b1a5 149{
00b2bad4 150 tui_update_all_breakpoint_info ();
2611b1a5
SC
151}
152
153/* Breakpoint deletion hook.
154 Refresh the screen to update the breakpoint marks. */
155static void
8d3788bd 156tui_event_delete_breakpoint (struct breakpoint *b)
2611b1a5 157{
00b2bad4 158 tui_update_all_breakpoint_info ();
2611b1a5
SC
159}
160
161static void
8d3788bd 162tui_event_modify_breakpoint (struct breakpoint *b)
2611b1a5 163{
00b2bad4 164 tui_update_all_breakpoint_info ();
2611b1a5
SC
165}
166
4ca4d161 167/* Called when a command is about to proceed the inferior. */
2611b1a5 168
4ca4d161
SC
169static void
170tui_about_to_proceed (void)
171{
2611b1a5
SC
172 /* Leave tui mode (optional). */
173#if 0
174 if (tui_active)
175 {
176 target_terminal_ours ();
177 endwin ();
178 target_terminal_inferior ();
179 }
180#endif
181 tui_target_has_run = 1;
2611b1a5
SC
182}
183
184/* The selected frame has changed. This is happens after a target
1cc6d956
MS
185 stop or when the user explicitly changes the frame
186 (up/down/thread/...). */
2611b1a5
SC
187static void
188tui_selected_frame_level_changed_hook (int level)
189{
190 struct frame_info *fi;
f23d1b92 191 CORE_ADDR pc;
2611b1a5 192
3adda9d8
DJ
193 /* Negative level means that the selected frame was cleared. */
194 if (level < 0)
195 return;
196
197 fi = get_selected_frame (NULL);
1cc6d956
MS
198 /* Ensure that symbols for this frame are read in. Also, determine
199 the source language of this frame, and switch to it if
200 desired. */
f23d1b92 201 if (get_frame_pc_if_available (fi, &pc))
2611b1a5
SC
202 {
203 struct symtab *s;
f23d1b92
PA
204
205 s = find_pc_symtab (pc);
1cc6d956 206 /* elz: This if here fixes the problem with the pc not being
f23d1b92
PA
207 displayed in the tui asm layout, with no debug symbols. The
208 value of s would be 0 here, and select_source_symtab would
209 abort the command by calling the 'error' function. */
2611b1a5 210 if (s)
f23d1b92
PA
211 select_source_symtab (s);
212 }
213
214 /* Display the frame position (even if there is no symbols or the PC
215 is not known). */
216 tui_show_frame_info (fi);
217
218 /* Refresh the register window if it's visible. */
219 if (tui_is_window_visible (DATA_WIN))
220 {
221 tui_refreshing_registers = 1;
222 tui_check_data_values (fi);
223 tui_refreshing_registers = 0;
2611b1a5
SC
224 }
225}
226
227/* Called from print_frame_info to list the line we stopped in. */
228static void
08ef48c5
MS
229tui_print_frame_info_listing_hook (struct symtab *s,
230 int line,
231 int stopline,
232 int noerror)
2611b1a5
SC
233{
234 select_source_symtab (s);
206415a3 235 tui_show_frame_info (get_selected_frame (NULL));
2611b1a5
SC
236}
237
d69e6a33
SC
238/* Perform all necessary cleanups regarding our module's inferior data
239 that is required after the inferior INF just exited. */
240
cda8ab40 241static void
d69e6a33 242tui_inferior_exit (struct inferior *inf)
cda8ab40 243{
d69e6a33
SC
244 /* Leave the SingleKey mode to make sure the gdb prompt is visible. */
245 tui_set_key_mode (TUI_COMMAND_MODE);
47d3492a 246 tui_show_frame_info (0);
cda8ab40
SC
247 tui_display_main ();
248}
249
383f836e
TT
250/* Observers created when installing TUI hooks. */
251static struct observer *tui_bp_created_observer;
252static struct observer *tui_bp_deleted_observer;
253static struct observer *tui_bp_modified_observer;
d69e6a33 254static struct observer *tui_inferior_exit_observer;
4ca4d161 255static struct observer *tui_about_to_proceed_observer;
383f836e 256
2611b1a5
SC
257/* Install the TUI specific hooks. */
258void
259tui_install_hooks (void)
260{
9a2b4c1b
MS
261 deprecated_selected_frame_level_changed_hook
262 = tui_selected_frame_level_changed_hook;
263 deprecated_print_frame_info_listing_hook
264 = tui_print_frame_info_listing_hook;
2611b1a5 265
9a4105ab 266 deprecated_query_hook = tui_query_hook;
2611b1a5
SC
267
268 /* Install the event hooks. */
383f836e
TT
269 tui_bp_created_observer
270 = observer_attach_breakpoint_created (tui_event_create_breakpoint);
271 tui_bp_deleted_observer
272 = observer_attach_breakpoint_deleted (tui_event_delete_breakpoint);
273 tui_bp_modified_observer
274 = observer_attach_breakpoint_modified (tui_event_modify_breakpoint);
d69e6a33
SC
275 tui_inferior_exit_observer
276 = observer_attach_inferior_exit (tui_inferior_exit);
4ca4d161
SC
277 tui_about_to_proceed_observer
278 = observer_attach_about_to_proceed (tui_about_to_proceed);
2611b1a5 279
9a4105ab 280 deprecated_register_changed_hook = tui_register_changed_hook;
2611b1a5
SC
281}
282
283/* Remove the TUI specific hooks. */
284void
285tui_remove_hooks (void)
286{
9a4105ab
AC
287 deprecated_selected_frame_level_changed_hook = 0;
288 deprecated_print_frame_info_listing_hook = 0;
289 deprecated_query_hook = 0;
9a4105ab 290 deprecated_register_changed_hook = 0;
2611b1a5 291
383f836e
TT
292 /* Remove our observers. */
293 observer_detach_breakpoint_created (tui_bp_created_observer);
294 tui_bp_created_observer = NULL;
295 observer_detach_breakpoint_deleted (tui_bp_deleted_observer);
296 tui_bp_deleted_observer = NULL;
297 observer_detach_breakpoint_modified (tui_bp_modified_observer);
298 tui_bp_modified_observer = NULL;
d69e6a33
SC
299 observer_detach_inferior_exit (tui_inferior_exit_observer);
300 tui_inferior_exit_observer = NULL;
4ca4d161
SC
301 observer_detach_about_to_proceed (tui_about_to_proceed_observer);
302 tui_about_to_proceed_observer = NULL;
2611b1a5
SC
303}
304
021e7609 305void _initialize_tui_hooks (void);
2b68e2c5 306
021e7609
AC
307void
308_initialize_tui_hooks (void)
2611b1a5 309{
2611b1a5 310 /* Install the permanent hooks. */
06d3b283 311 observer_attach_new_objfile (tui_new_objfile_hook);
2611b1a5 312}