*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / tui / tui-hooks.c
CommitLineData
2611b1a5 1/* GDB hooks for TUI.
f33c6cbf 2
0fb0cc75 3 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
698ba934 4 Free Software Foundation, Inc.
2611b1a5
SC
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
2611b1a5
SC
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
2611b1a5
SC
20
21#include "defs.h"
22#include "symtab.h"
23#include "inferior.h"
24#include "command.h"
25#include "bfd.h"
26#include "symfile.h"
27#include "objfiles.h"
28#include "target.h"
29#include "gdbcore.h"
30#include "event-loop.h"
2b68e2c5 31#include "event-top.h"
2611b1a5
SC
32#include "frame.h"
33#include "breakpoint.h"
2b68e2c5
SC
34#include "ui-out.h"
35#include "top.h"
06d3b283 36#include "observer.h"
2611b1a5
SC
37#include <unistd.h>
38#include <fcntl.h>
39
d7b2e967 40#include "tui/tui.h"
6a83354a 41#include "tui/tui-hooks.h"
d7b2e967
AC
42#include "tui/tui-data.h"
43#include "tui/tui-layout.h"
44#include "tui/tui-io.h"
45#include "tui/tui-regs.h"
46#include "tui/tui-win.h"
47#include "tui/tui-stack.h"
48#include "tui/tui-windata.h"
49#include "tui/tui-winsource.h"
2611b1a5 50
6a83354a 51#include "gdb_curses.h"
96ec9981 52
4a1bcc8c
MK
53/* This redefines CTRL if it is not already defined, so it must come
54 after terminal state releated include files like <term.h> and
55 "gdb_curses.h". */
56#include "readline/readline.h"
57
2611b1a5
SC
58int tui_target_has_run = 0;
59
2611b1a5
SC
60static void
61tui_new_objfile_hook (struct objfile* objfile)
62{
63 if (tui_active)
1f393769 64 tui_display_main ();
2611b1a5
SC
65}
66
bee0189a 67static int ATTR_FORMAT (printf, 1, 0)
5b6fe301 68tui_query_hook (const char *msg, va_list argp)
2611b1a5
SC
69{
70 int retval;
71 int ans2;
72 int answer;
73
2611b1a5
SC
74 echo ();
75 while (1)
76 {
1cc6d956 77 wrap_here (""); /* Flush any buffered output. */
2611b1a5
SC
78 gdb_flush (gdb_stdout);
79
80 vfprintf_filtered (gdb_stdout, msg, argp);
a3f17187 81 printf_filtered (_("(y or n) "));
2611b1a5
SC
82
83 wrap_here ("");
84 gdb_flush (gdb_stdout);
85
86 answer = tui_getc (stdin);
87 clearerr (stdin); /* in case of C-d */
88 if (answer == EOF) /* C-d */
89 {
90 retval = 1;
91 break;
92 }
1cc6d956 93 /* Eat rest of input line, to EOF or newline. */
2611b1a5
SC
94 if (answer != '\n')
95 do
96 {
97 ans2 = tui_getc (stdin);
98 clearerr (stdin);
99 }
100 while (ans2 != EOF && ans2 != '\n' && ans2 != '\r');
101
102 if (answer >= 'a')
103 answer -= 040;
104 if (answer == 'Y')
105 {
106 retval = 1;
107 break;
108 }
109 if (answer == 'N')
110 {
111 retval = 0;
112 break;
113 }
a3f17187 114 printf_filtered (_("Please answer y or n.\n"));
2611b1a5
SC
115 }
116 noecho ();
117 return retval;
118}
119
3adda9d8 120/* Prevent recursion of deprecated_register_changed_hook(). */
2611b1a5
SC
121static int tui_refreshing_registers = 0;
122
2611b1a5
SC
123static void
124tui_register_changed_hook (int regno)
125{
126 struct frame_info *fi;
127
206415a3
DJ
128 fi = get_selected_frame (NULL);
129 if (tui_refreshing_registers == 0)
2611b1a5
SC
130 {
131 tui_refreshing_registers = 1;
edae1ccf 132 tui_check_data_values (fi);
2611b1a5
SC
133 tui_refreshing_registers = 0;
134 }
135}
136
2611b1a5
SC
137/* Breakpoint creation hook.
138 Update the screen to show the new breakpoint. */
139static void
140tui_event_create_breakpoint (int number)
141{
00b2bad4 142 tui_update_all_breakpoint_info ();
2611b1a5
SC
143}
144
145/* Breakpoint deletion hook.
146 Refresh the screen to update the breakpoint marks. */
147static void
148tui_event_delete_breakpoint (int number)
149{
00b2bad4 150 tui_update_all_breakpoint_info ();
2611b1a5
SC
151}
152
153static void
154tui_event_modify_breakpoint (int number)
155{
00b2bad4 156 tui_update_all_breakpoint_info ();
2611b1a5
SC
157}
158
2611b1a5
SC
159/* Called when going to wait for the target.
160 Leave curses mode and setup program mode. */
161static ptid_t
08ef48c5 162tui_target_wait_hook (ptid_t pid,
47608cb1 163 struct target_waitstatus *status, int options)
2611b1a5
SC
164{
165 ptid_t res;
166
167 /* Leave tui mode (optional). */
168#if 0
169 if (tui_active)
170 {
171 target_terminal_ours ();
172 endwin ();
173 target_terminal_inferior ();
174 }
175#endif
176 tui_target_has_run = 1;
47608cb1 177 res = target_wait (pid, status, options);
2611b1a5
SC
178
179 if (tui_active)
180 {
181 /* TODO: need to refresh (optional). */
182 }
183 return res;
184}
185
186/* The selected frame has changed. This is happens after a target
1cc6d956
MS
187 stop or when the user explicitly changes the frame
188 (up/down/thread/...). */
2611b1a5
SC
189static void
190tui_selected_frame_level_changed_hook (int level)
191{
192 struct frame_info *fi;
193
3adda9d8
DJ
194 /* Negative level means that the selected frame was cleared. */
195 if (level < 0)
196 return;
197
198 fi = get_selected_frame (NULL);
1cc6d956
MS
199 /* Ensure that symbols for this frame are read in. Also, determine
200 the source language of this frame, and switch to it if
201 desired. */
2611b1a5
SC
202 if (fi)
203 {
204 struct symtab *s;
205
f70a7d61 206 s = find_pc_symtab (get_frame_pc (fi));
1cc6d956
MS
207 /* elz: This if here fixes the problem with the pc not being
208 displayed in the tui asm layout, with no debug symbols. The
209 value of s would be 0 here, and select_source_symtab would
210 abort the command by calling the 'error' function. */
2611b1a5 211 if (s)
90949d06
SC
212 select_source_symtab (s);
213
214 /* Display the frame position (even if there is no symbols). */
47d3492a 215 tui_show_frame_info (fi);
2611b1a5
SC
216
217 /* Refresh the register window if it's visible. */
218 if (tui_is_window_visible (DATA_WIN))
219 {
220 tui_refreshing_registers = 1;
edae1ccf 221 tui_check_data_values (fi);
2611b1a5
SC
222 tui_refreshing_registers = 0;
223 }
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
cda8ab40
SC
238/* Called when the target process died or is detached.
239 Update the status line. */
240static void
241tui_detach_hook (void)
242{
47d3492a 243 tui_show_frame_info (0);
cda8ab40
SC
244 tui_display_main ();
245}
246
383f836e
TT
247/* Observers created when installing TUI hooks. */
248static struct observer *tui_bp_created_observer;
249static struct observer *tui_bp_deleted_observer;
250static struct observer *tui_bp_modified_observer;
251
2611b1a5
SC
252/* Install the TUI specific hooks. */
253void
254tui_install_hooks (void)
255{
9a4105ab
AC
256 deprecated_target_wait_hook = tui_target_wait_hook;
257 deprecated_selected_frame_level_changed_hook = tui_selected_frame_level_changed_hook;
258 deprecated_print_frame_info_listing_hook = tui_print_frame_info_listing_hook;
2611b1a5 259
9a4105ab 260 deprecated_query_hook = tui_query_hook;
2611b1a5
SC
261
262 /* Install the event hooks. */
383f836e
TT
263 tui_bp_created_observer
264 = observer_attach_breakpoint_created (tui_event_create_breakpoint);
265 tui_bp_deleted_observer
266 = observer_attach_breakpoint_deleted (tui_event_delete_breakpoint);
267 tui_bp_modified_observer
268 = observer_attach_breakpoint_modified (tui_event_modify_breakpoint);
2611b1a5 269
9a4105ab
AC
270 deprecated_register_changed_hook = tui_register_changed_hook;
271 deprecated_detach_hook = tui_detach_hook;
2611b1a5
SC
272}
273
274/* Remove the TUI specific hooks. */
275void
276tui_remove_hooks (void)
277{
9a4105ab
AC
278 deprecated_target_wait_hook = 0;
279 deprecated_selected_frame_level_changed_hook = 0;
280 deprecated_print_frame_info_listing_hook = 0;
281 deprecated_query_hook = 0;
9a4105ab
AC
282 deprecated_register_changed_hook = 0;
283 deprecated_detach_hook = 0;
2611b1a5 284
383f836e
TT
285 /* Remove our observers. */
286 observer_detach_breakpoint_created (tui_bp_created_observer);
287 tui_bp_created_observer = NULL;
288 observer_detach_breakpoint_deleted (tui_bp_deleted_observer);
289 tui_bp_deleted_observer = NULL;
290 observer_detach_breakpoint_modified (tui_bp_modified_observer);
291 tui_bp_modified_observer = NULL;
2611b1a5
SC
292}
293
021e7609 294void _initialize_tui_hooks (void);
2b68e2c5 295
021e7609
AC
296void
297_initialize_tui_hooks (void)
2611b1a5 298{
2611b1a5 299 /* Install the permanent hooks. */
06d3b283 300 observer_attach_new_objfile (tui_new_objfile_hook);
2611b1a5 301}
This page took 1.215093 seconds and 4 git commands to generate.