1b725ae77Skettenis /* GDB hooks for TUI.
2b725ae77Skettenis
3b725ae77Skettenis Copyright 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4b725ae77Skettenis
5b725ae77Skettenis This file is part of GDB.
6b725ae77Skettenis
7b725ae77Skettenis This program is free software; you can redistribute it and/or modify
8b725ae77Skettenis it under the terms of the GNU General Public License as published by
9b725ae77Skettenis the Free Software Foundation; either version 2 of the License, or
10b725ae77Skettenis (at your option) any later version.
11b725ae77Skettenis
12b725ae77Skettenis This program is distributed in the hope that it will be useful,
13b725ae77Skettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
14b725ae77Skettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15b725ae77Skettenis GNU General Public License for more details.
16b725ae77Skettenis
17b725ae77Skettenis You should have received a copy of the GNU General Public License
18b725ae77Skettenis along with this program; if not, write to the Free Software
19b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
20b725ae77Skettenis Boston, MA 02111-1307, USA. */
21b725ae77Skettenis
22b725ae77Skettenis #include "defs.h"
23b725ae77Skettenis #include "symtab.h"
24b725ae77Skettenis #include "inferior.h"
25b725ae77Skettenis #include "command.h"
26b725ae77Skettenis #include "bfd.h"
27b725ae77Skettenis #include "symfile.h"
28b725ae77Skettenis #include "objfiles.h"
29b725ae77Skettenis #include "target.h"
30b725ae77Skettenis #include "gdbcore.h"
31b725ae77Skettenis #include "event-loop.h"
32b725ae77Skettenis #include "event-top.h"
33b725ae77Skettenis #include "frame.h"
34b725ae77Skettenis #include "breakpoint.h"
35b725ae77Skettenis #include "gdb-events.h"
36b725ae77Skettenis #include "ui-out.h"
37b725ae77Skettenis #include "top.h"
38b725ae77Skettenis #include <unistd.h>
39b725ae77Skettenis #include <fcntl.h>
40b725ae77Skettenis
41b725ae77Skettenis #include "tui/tui.h"
42b725ae77Skettenis #include "tui/tui-hooks.h"
43b725ae77Skettenis #include "tui/tui-data.h"
44b725ae77Skettenis #include "tui/tui-layout.h"
45b725ae77Skettenis #include "tui/tui-io.h"
46b725ae77Skettenis #include "tui/tui-regs.h"
47b725ae77Skettenis #include "tui/tui-win.h"
48b725ae77Skettenis #include "tui/tui-stack.h"
49b725ae77Skettenis #include "tui/tui-windata.h"
50b725ae77Skettenis #include "tui/tui-winsource.h"
51b725ae77Skettenis
52b725ae77Skettenis #include "gdb_curses.h"
53b725ae77Skettenis
54*11efff7fSkettenis /* This redefines CTRL if it is not already defined, so it must come
55*11efff7fSkettenis after terminal state releated include files like <term.h> and
56*11efff7fSkettenis "gdb_curses.h". */
57*11efff7fSkettenis #include "readline/readline.h"
58*11efff7fSkettenis
59b725ae77Skettenis int tui_target_has_run = 0;
60b725ae77Skettenis
61b725ae77Skettenis static void (* tui_target_new_objfile_chain) (struct objfile*);
62b725ae77Skettenis
63b725ae77Skettenis static void
tui_new_objfile_hook(struct objfile * objfile)64b725ae77Skettenis tui_new_objfile_hook (struct objfile* objfile)
65b725ae77Skettenis {
66b725ae77Skettenis if (tui_active)
67b725ae77Skettenis tui_display_main ();
68b725ae77Skettenis
69b725ae77Skettenis if (tui_target_new_objfile_chain)
70b725ae77Skettenis tui_target_new_objfile_chain (objfile);
71b725ae77Skettenis }
72b725ae77Skettenis
73b725ae77Skettenis static int
tui_query_hook(const char * msg,va_list argp)74b725ae77Skettenis tui_query_hook (const char * msg, va_list argp)
75b725ae77Skettenis {
76b725ae77Skettenis int retval;
77b725ae77Skettenis int ans2;
78b725ae77Skettenis int answer;
79b725ae77Skettenis
80b725ae77Skettenis /* Automatically answer "yes" if input is not from a terminal. */
81b725ae77Skettenis if (!input_from_terminal_p ())
82b725ae77Skettenis return 1;
83b725ae77Skettenis
84b725ae77Skettenis echo ();
85b725ae77Skettenis while (1)
86b725ae77Skettenis {
87b725ae77Skettenis wrap_here (""); /* Flush any buffered output */
88b725ae77Skettenis gdb_flush (gdb_stdout);
89b725ae77Skettenis
90b725ae77Skettenis vfprintf_filtered (gdb_stdout, msg, argp);
91b725ae77Skettenis printf_filtered ("(y or n) ");
92b725ae77Skettenis
93b725ae77Skettenis wrap_here ("");
94b725ae77Skettenis gdb_flush (gdb_stdout);
95b725ae77Skettenis
96b725ae77Skettenis answer = tui_getc (stdin);
97b725ae77Skettenis clearerr (stdin); /* in case of C-d */
98b725ae77Skettenis if (answer == EOF) /* C-d */
99b725ae77Skettenis {
100b725ae77Skettenis retval = 1;
101b725ae77Skettenis break;
102b725ae77Skettenis }
103b725ae77Skettenis /* Eat rest of input line, to EOF or newline */
104b725ae77Skettenis if (answer != '\n')
105b725ae77Skettenis do
106b725ae77Skettenis {
107b725ae77Skettenis ans2 = tui_getc (stdin);
108b725ae77Skettenis clearerr (stdin);
109b725ae77Skettenis }
110b725ae77Skettenis while (ans2 != EOF && ans2 != '\n' && ans2 != '\r');
111b725ae77Skettenis
112b725ae77Skettenis if (answer >= 'a')
113b725ae77Skettenis answer -= 040;
114b725ae77Skettenis if (answer == 'Y')
115b725ae77Skettenis {
116b725ae77Skettenis retval = 1;
117b725ae77Skettenis break;
118b725ae77Skettenis }
119b725ae77Skettenis if (answer == 'N')
120b725ae77Skettenis {
121b725ae77Skettenis retval = 0;
122b725ae77Skettenis break;
123b725ae77Skettenis }
124b725ae77Skettenis printf_filtered ("Please answer y or n.\n");
125b725ae77Skettenis }
126b725ae77Skettenis noecho ();
127b725ae77Skettenis return retval;
128b725ae77Skettenis }
129b725ae77Skettenis
130*11efff7fSkettenis /* Prevent recursion of deprecated_registers_changed_hook(). */
131b725ae77Skettenis static int tui_refreshing_registers = 0;
132b725ae77Skettenis
133b725ae77Skettenis static void
tui_registers_changed_hook(void)134b725ae77Skettenis tui_registers_changed_hook (void)
135b725ae77Skettenis {
136b725ae77Skettenis struct frame_info *fi;
137b725ae77Skettenis
138b725ae77Skettenis fi = deprecated_selected_frame;
139b725ae77Skettenis if (fi && tui_refreshing_registers == 0)
140b725ae77Skettenis {
141b725ae77Skettenis tui_refreshing_registers = 1;
142b725ae77Skettenis #if 0
143b725ae77Skettenis tui_check_data_values (fi);
144b725ae77Skettenis #endif
145b725ae77Skettenis tui_refreshing_registers = 0;
146b725ae77Skettenis }
147b725ae77Skettenis }
148b725ae77Skettenis
149b725ae77Skettenis static void
tui_register_changed_hook(int regno)150b725ae77Skettenis tui_register_changed_hook (int regno)
151b725ae77Skettenis {
152b725ae77Skettenis struct frame_info *fi;
153b725ae77Skettenis
154b725ae77Skettenis fi = deprecated_selected_frame;
155b725ae77Skettenis if (fi && tui_refreshing_registers == 0)
156b725ae77Skettenis {
157b725ae77Skettenis tui_refreshing_registers = 1;
158b725ae77Skettenis tui_check_data_values (fi);
159b725ae77Skettenis tui_refreshing_registers = 0;
160b725ae77Skettenis }
161b725ae77Skettenis }
162b725ae77Skettenis
163b725ae77Skettenis /* Breakpoint creation hook.
164b725ae77Skettenis Update the screen to show the new breakpoint. */
165b725ae77Skettenis static void
tui_event_create_breakpoint(int number)166b725ae77Skettenis tui_event_create_breakpoint (int number)
167b725ae77Skettenis {
168b725ae77Skettenis tui_update_all_breakpoint_info ();
169b725ae77Skettenis }
170b725ae77Skettenis
171b725ae77Skettenis /* Breakpoint deletion hook.
172b725ae77Skettenis Refresh the screen to update the breakpoint marks. */
173b725ae77Skettenis static void
tui_event_delete_breakpoint(int number)174b725ae77Skettenis tui_event_delete_breakpoint (int number)
175b725ae77Skettenis {
176b725ae77Skettenis tui_update_all_breakpoint_info ();
177b725ae77Skettenis }
178b725ae77Skettenis
179b725ae77Skettenis static void
tui_event_modify_breakpoint(int number)180b725ae77Skettenis tui_event_modify_breakpoint (int number)
181b725ae77Skettenis {
182b725ae77Skettenis tui_update_all_breakpoint_info ();
183b725ae77Skettenis }
184b725ae77Skettenis
185b725ae77Skettenis static void
tui_event_default(int number)186b725ae77Skettenis tui_event_default (int number)
187b725ae77Skettenis {
188b725ae77Skettenis ;
189b725ae77Skettenis }
190b725ae77Skettenis
191b725ae77Skettenis static struct gdb_events *tui_old_event_hooks;
192b725ae77Skettenis
193b725ae77Skettenis static struct gdb_events tui_event_hooks =
194b725ae77Skettenis {
195b725ae77Skettenis tui_event_create_breakpoint,
196b725ae77Skettenis tui_event_delete_breakpoint,
197b725ae77Skettenis tui_event_modify_breakpoint,
198b725ae77Skettenis tui_event_default,
199b725ae77Skettenis tui_event_default,
200b725ae77Skettenis tui_event_default
201b725ae77Skettenis };
202b725ae77Skettenis
203b725ae77Skettenis /* Called when going to wait for the target.
204b725ae77Skettenis Leave curses mode and setup program mode. */
205b725ae77Skettenis static ptid_t
tui_target_wait_hook(ptid_t pid,struct target_waitstatus * status)206b725ae77Skettenis tui_target_wait_hook (ptid_t pid, struct target_waitstatus *status)
207b725ae77Skettenis {
208b725ae77Skettenis ptid_t res;
209b725ae77Skettenis
210b725ae77Skettenis /* Leave tui mode (optional). */
211b725ae77Skettenis #if 0
212b725ae77Skettenis if (tui_active)
213b725ae77Skettenis {
214b725ae77Skettenis target_terminal_ours ();
215b725ae77Skettenis endwin ();
216b725ae77Skettenis target_terminal_inferior ();
217b725ae77Skettenis }
218b725ae77Skettenis #endif
219b725ae77Skettenis tui_target_has_run = 1;
220b725ae77Skettenis res = target_wait (pid, status);
221b725ae77Skettenis
222b725ae77Skettenis if (tui_active)
223b725ae77Skettenis {
224b725ae77Skettenis /* TODO: need to refresh (optional). */
225b725ae77Skettenis }
226b725ae77Skettenis return res;
227b725ae77Skettenis }
228b725ae77Skettenis
229b725ae77Skettenis /* The selected frame has changed. This is happens after a target
230b725ae77Skettenis stop or when the user explicitly changes the frame (up/down/thread/...). */
231b725ae77Skettenis static void
tui_selected_frame_level_changed_hook(int level)232b725ae77Skettenis tui_selected_frame_level_changed_hook (int level)
233b725ae77Skettenis {
234b725ae77Skettenis struct frame_info *fi;
235b725ae77Skettenis
236b725ae77Skettenis fi = deprecated_selected_frame;
237b725ae77Skettenis /* Ensure that symbols for this frame are read in. Also, determine the
238b725ae77Skettenis source language of this frame, and switch to it if desired. */
239b725ae77Skettenis if (fi)
240b725ae77Skettenis {
241b725ae77Skettenis struct symtab *s;
242b725ae77Skettenis
243b725ae77Skettenis s = find_pc_symtab (get_frame_pc (fi));
244b725ae77Skettenis /* elz: this if here fixes the problem with the pc not being displayed
245b725ae77Skettenis in the tui asm layout, with no debug symbols. The value of s
246b725ae77Skettenis would be 0 here, and select_source_symtab would abort the
247b725ae77Skettenis command by calling the 'error' function */
248b725ae77Skettenis if (s)
249b725ae77Skettenis select_source_symtab (s);
250b725ae77Skettenis
251b725ae77Skettenis /* Display the frame position (even if there is no symbols). */
252b725ae77Skettenis tui_show_frame_info (fi);
253b725ae77Skettenis
254b725ae77Skettenis /* Refresh the register window if it's visible. */
255b725ae77Skettenis if (tui_is_window_visible (DATA_WIN))
256b725ae77Skettenis {
257b725ae77Skettenis tui_refreshing_registers = 1;
258b725ae77Skettenis tui_check_data_values (fi);
259b725ae77Skettenis tui_refreshing_registers = 0;
260b725ae77Skettenis }
261b725ae77Skettenis }
262b725ae77Skettenis }
263b725ae77Skettenis
264b725ae77Skettenis /* Called from print_frame_info to list the line we stopped in. */
265b725ae77Skettenis static void
tui_print_frame_info_listing_hook(struct symtab * s,int line,int stopline,int noerror)266b725ae77Skettenis tui_print_frame_info_listing_hook (struct symtab *s, int line,
267b725ae77Skettenis int stopline, int noerror)
268b725ae77Skettenis {
269b725ae77Skettenis select_source_symtab (s);
270b725ae77Skettenis tui_show_frame_info (deprecated_selected_frame);
271b725ae77Skettenis }
272b725ae77Skettenis
273b725ae77Skettenis /* Called when the target process died or is detached.
274b725ae77Skettenis Update the status line. */
275b725ae77Skettenis static void
tui_detach_hook(void)276b725ae77Skettenis tui_detach_hook (void)
277b725ae77Skettenis {
278b725ae77Skettenis tui_show_frame_info (0);
279b725ae77Skettenis tui_display_main ();
280b725ae77Skettenis }
281b725ae77Skettenis
282b725ae77Skettenis /* Install the TUI specific hooks. */
283b725ae77Skettenis void
tui_install_hooks(void)284b725ae77Skettenis tui_install_hooks (void)
285b725ae77Skettenis {
286*11efff7fSkettenis deprecated_target_wait_hook = tui_target_wait_hook;
287*11efff7fSkettenis deprecated_selected_frame_level_changed_hook = tui_selected_frame_level_changed_hook;
288*11efff7fSkettenis deprecated_print_frame_info_listing_hook = tui_print_frame_info_listing_hook;
289b725ae77Skettenis
290*11efff7fSkettenis deprecated_query_hook = tui_query_hook;
291b725ae77Skettenis
292b725ae77Skettenis /* Install the event hooks. */
293*11efff7fSkettenis tui_old_event_hooks = deprecated_set_gdb_event_hooks (&tui_event_hooks);
294b725ae77Skettenis
295*11efff7fSkettenis deprecated_registers_changed_hook = tui_registers_changed_hook;
296*11efff7fSkettenis deprecated_register_changed_hook = tui_register_changed_hook;
297*11efff7fSkettenis deprecated_detach_hook = tui_detach_hook;
298b725ae77Skettenis }
299b725ae77Skettenis
300b725ae77Skettenis /* Remove the TUI specific hooks. */
301b725ae77Skettenis void
tui_remove_hooks(void)302b725ae77Skettenis tui_remove_hooks (void)
303b725ae77Skettenis {
304*11efff7fSkettenis deprecated_target_wait_hook = 0;
305*11efff7fSkettenis deprecated_selected_frame_level_changed_hook = 0;
306*11efff7fSkettenis deprecated_print_frame_info_listing_hook = 0;
307*11efff7fSkettenis deprecated_query_hook = 0;
308*11efff7fSkettenis deprecated_registers_changed_hook = 0;
309*11efff7fSkettenis deprecated_register_changed_hook = 0;
310*11efff7fSkettenis deprecated_detach_hook = 0;
311b725ae77Skettenis
312b725ae77Skettenis /* Restore the previous event hooks. */
313*11efff7fSkettenis deprecated_set_gdb_event_hooks (tui_old_event_hooks);
314b725ae77Skettenis }
315b725ae77Skettenis
316b725ae77Skettenis void _initialize_tui_hooks (void);
317b725ae77Skettenis
318b725ae77Skettenis void
_initialize_tui_hooks(void)319b725ae77Skettenis _initialize_tui_hooks (void)
320b725ae77Skettenis {
321b725ae77Skettenis /* Install the permanent hooks. */
322*11efff7fSkettenis tui_target_new_objfile_chain = deprecated_target_new_objfile_hook;
323*11efff7fSkettenis deprecated_target_new_objfile_hook = tui_new_objfile_hook;
324b725ae77Skettenis }
325