1b725ae77Skettenis /* General functions for the WDB TUI.
2b725ae77Skettenis
3b725ae77Skettenis Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
4b725ae77Skettenis Foundation, Inc.
5b725ae77Skettenis
6b725ae77Skettenis Contributed by Hewlett-Packard Company.
7b725ae77Skettenis
8b725ae77Skettenis This file is part of GDB.
9b725ae77Skettenis
10b725ae77Skettenis This program is free software; you can redistribute it and/or modify
11b725ae77Skettenis it under the terms of the GNU General Public License as published by
12b725ae77Skettenis the Free Software Foundation; either version 2 of the License, or
13b725ae77Skettenis (at your option) any later version.
14b725ae77Skettenis
15b725ae77Skettenis This program is distributed in the hope that it will be useful,
16b725ae77Skettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
17b725ae77Skettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18b725ae77Skettenis GNU General Public License for more details.
19b725ae77Skettenis
20b725ae77Skettenis You should have received a copy of the GNU General Public License
21b725ae77Skettenis along with this program; if not, write to the Free Software
22b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
23b725ae77Skettenis Boston, MA 02111-1307, USA. */
24b725ae77Skettenis
25b725ae77Skettenis #include "defs.h"
26b725ae77Skettenis #include "gdbcmd.h"
27b725ae77Skettenis #include "tui/tui.h"
28b725ae77Skettenis #include "tui/tui-hooks.h"
29b725ae77Skettenis #include "tui/tui-data.h"
30b725ae77Skettenis #include "tui/tui-layout.h"
31b725ae77Skettenis #include "tui/tui-io.h"
32b725ae77Skettenis #include "tui/tui-regs.h"
33b725ae77Skettenis #include "tui/tui-stack.h"
34b725ae77Skettenis #include "tui/tui-win.h"
35b725ae77Skettenis #include "tui/tui-winsource.h"
36b725ae77Skettenis #include "tui/tui-windata.h"
37b725ae77Skettenis #include "target.h"
38b725ae77Skettenis #include "frame.h"
39b725ae77Skettenis #include "breakpoint.h"
40b725ae77Skettenis #include "inferior.h"
41b725ae77Skettenis #include "symtab.h"
42b725ae77Skettenis #include "source.h"
43b725ae77Skettenis
44b725ae77Skettenis #include <stdio.h>
45b725ae77Skettenis #include <stdlib.h>
46b725ae77Skettenis #include <ctype.h>
47b725ae77Skettenis #ifdef HAVE_TERM_H
48b725ae77Skettenis #include <term.h>
49b725ae77Skettenis #endif
50b725ae77Skettenis #include <signal.h>
51b725ae77Skettenis #include <fcntl.h>
52b725ae77Skettenis #if 0
53b725ae77Skettenis #include <termio.h>
54b725ae77Skettenis #endif
55b725ae77Skettenis #include <setjmp.h>
56b725ae77Skettenis
57b725ae77Skettenis #include "gdb_curses.h"
58b725ae77Skettenis
59b725ae77Skettenis /* This redefines CTRL if it is not already defined, so it must come
60b725ae77Skettenis after terminal state releated include files like <term.h> and
61*11efff7fSkettenis "gdb_curses.h". */
62b725ae77Skettenis #include "readline/readline.h"
63b725ae77Skettenis
64b725ae77Skettenis /* Tells whether the TUI is active or not. */
65b725ae77Skettenis int tui_active = 0;
66b725ae77Skettenis static int tui_finish_init = 1;
67b725ae77Skettenis
68b725ae77Skettenis enum tui_key_mode tui_current_key_mode = TUI_COMMAND_MODE;
69b725ae77Skettenis
70b725ae77Skettenis struct tui_char_command
71b725ae77Skettenis {
72b725ae77Skettenis unsigned char key;
73b725ae77Skettenis const char* cmd;
74b725ae77Skettenis };
75b725ae77Skettenis
76b725ae77Skettenis /* Key mapping to gdb commands when the TUI is using the single key mode. */
77b725ae77Skettenis static const struct tui_char_command tui_commands[] = {
78b725ae77Skettenis { 'c', "continue" },
79b725ae77Skettenis { 'd', "down" },
80b725ae77Skettenis { 'f', "finish" },
81b725ae77Skettenis { 'n', "next" },
82b725ae77Skettenis { 'r', "run" },
83b725ae77Skettenis { 's', "step" },
84b725ae77Skettenis { 'u', "up" },
85b725ae77Skettenis { 'v', "info locals" },
86b725ae77Skettenis { 'w', "where" },
87b725ae77Skettenis { 0, 0 },
88b725ae77Skettenis };
89b725ae77Skettenis
90b725ae77Skettenis static Keymap tui_keymap;
91b725ae77Skettenis static Keymap tui_readline_standard_keymap;
92b725ae77Skettenis
93b725ae77Skettenis /* TUI readline command.
94b725ae77Skettenis Switch the output mode between TUI/standard gdb. */
95b725ae77Skettenis static int
tui_rl_switch_mode(int notused1,int notused2)96b725ae77Skettenis tui_rl_switch_mode (int notused1, int notused2)
97b725ae77Skettenis {
98b725ae77Skettenis if (tui_active)
99b725ae77Skettenis {
100b725ae77Skettenis tui_disable ();
101b725ae77Skettenis rl_prep_terminal (0);
102b725ae77Skettenis }
103b725ae77Skettenis else
104b725ae77Skettenis {
105b725ae77Skettenis rl_deprep_terminal ();
106b725ae77Skettenis tui_enable ();
107b725ae77Skettenis }
108b725ae77Skettenis
109b725ae77Skettenis /* Clear the readline in case switching occurred in middle of something. */
110b725ae77Skettenis if (rl_end)
111b725ae77Skettenis rl_kill_text (0, rl_end);
112b725ae77Skettenis
113b725ae77Skettenis /* Since we left the curses mode, the terminal mode is restored to
114b725ae77Skettenis some previous state. That state may not be suitable for readline
115b725ae77Skettenis to work correctly (it may be restored in line mode). We force an
116b725ae77Skettenis exit of the current readline so that readline is re-entered and it
117b725ae77Skettenis will be able to setup the terminal for its needs. By re-entering
118b725ae77Skettenis in readline, we also redisplay its prompt in the non-curses mode. */
119b725ae77Skettenis rl_newline (1, '\n');
120b725ae77Skettenis
121b725ae77Skettenis /* Make sure the \n we are returning does not repeat the last command. */
122b725ae77Skettenis dont_repeat ();
123b725ae77Skettenis return 0;
124b725ae77Skettenis }
125b725ae77Skettenis
126b725ae77Skettenis /* TUI readline command.
127b725ae77Skettenis Change the TUI layout to show a next layout.
128b725ae77Skettenis This function is bound to CTRL-X 2. It is intended to provide
129b725ae77Skettenis a functionality close to the Emacs split-window command. We always
130b725ae77Skettenis show two windows (src+asm), (src+regs) or (asm+regs). */
131b725ae77Skettenis static int
tui_rl_change_windows(int notused1,int notused2)132b725ae77Skettenis tui_rl_change_windows (int notused1, int notused2)
133b725ae77Skettenis {
134b725ae77Skettenis if (!tui_active)
135b725ae77Skettenis tui_rl_switch_mode (0/*notused*/, 0/*notused*/);
136b725ae77Skettenis
137b725ae77Skettenis if (tui_active)
138b725ae77Skettenis {
139b725ae77Skettenis enum tui_layout_type new_layout;
140b725ae77Skettenis enum tui_register_display_type regs_type = TUI_UNDEFINED_REGS;
141b725ae77Skettenis
142b725ae77Skettenis new_layout = tui_current_layout ();
143b725ae77Skettenis
144b725ae77Skettenis /* Select a new layout to have a rolling layout behavior
145b725ae77Skettenis with always two windows (except when undefined). */
146b725ae77Skettenis switch (new_layout)
147b725ae77Skettenis {
148b725ae77Skettenis case SRC_COMMAND:
149b725ae77Skettenis new_layout = SRC_DISASSEM_COMMAND;
150b725ae77Skettenis break;
151b725ae77Skettenis
152b725ae77Skettenis case DISASSEM_COMMAND:
153b725ae77Skettenis new_layout = SRC_DISASSEM_COMMAND;
154b725ae77Skettenis break;
155b725ae77Skettenis
156b725ae77Skettenis case SRC_DATA_COMMAND:
157b725ae77Skettenis new_layout = SRC_DISASSEM_COMMAND;
158b725ae77Skettenis break;
159b725ae77Skettenis
160b725ae77Skettenis case SRC_DISASSEM_COMMAND:
161b725ae77Skettenis new_layout = DISASSEM_DATA_COMMAND;
162b725ae77Skettenis break;
163b725ae77Skettenis
164b725ae77Skettenis case DISASSEM_DATA_COMMAND:
165b725ae77Skettenis new_layout = SRC_DATA_COMMAND;
166b725ae77Skettenis break;
167b725ae77Skettenis
168b725ae77Skettenis default:
169b725ae77Skettenis new_layout = SRC_COMMAND;
170b725ae77Skettenis break;
171b725ae77Skettenis }
172b725ae77Skettenis tui_set_layout (new_layout, regs_type);
173b725ae77Skettenis }
174b725ae77Skettenis return 0;
175b725ae77Skettenis }
176b725ae77Skettenis
177b725ae77Skettenis /* TUI readline command.
178b725ae77Skettenis Delete the second TUI window to only show one. */
179b725ae77Skettenis static int
tui_rl_delete_other_windows(int notused1,int notused2)180b725ae77Skettenis tui_rl_delete_other_windows (int notused1, int notused2)
181b725ae77Skettenis {
182b725ae77Skettenis if (!tui_active)
183b725ae77Skettenis tui_rl_switch_mode (0/*notused*/, 0/*notused*/);
184b725ae77Skettenis
185b725ae77Skettenis if (tui_active)
186b725ae77Skettenis {
187b725ae77Skettenis enum tui_layout_type new_layout;
188b725ae77Skettenis enum tui_register_display_type regs_type = TUI_UNDEFINED_REGS;
189b725ae77Skettenis
190b725ae77Skettenis new_layout = tui_current_layout ();
191b725ae77Skettenis
192b725ae77Skettenis /* Kill one window. */
193b725ae77Skettenis switch (new_layout)
194b725ae77Skettenis {
195b725ae77Skettenis case SRC_COMMAND:
196b725ae77Skettenis case SRC_DATA_COMMAND:
197b725ae77Skettenis case SRC_DISASSEM_COMMAND:
198b725ae77Skettenis default:
199b725ae77Skettenis new_layout = SRC_COMMAND;
200b725ae77Skettenis break;
201b725ae77Skettenis
202b725ae77Skettenis case DISASSEM_COMMAND:
203b725ae77Skettenis case DISASSEM_DATA_COMMAND:
204b725ae77Skettenis new_layout = DISASSEM_COMMAND;
205b725ae77Skettenis break;
206b725ae77Skettenis }
207b725ae77Skettenis tui_set_layout (new_layout, regs_type);
208b725ae77Skettenis }
209b725ae77Skettenis return 0;
210b725ae77Skettenis }
211b725ae77Skettenis
212b725ae77Skettenis /* TUI readline command.
213b725ae77Skettenis Switch the active window to give the focus to a next window. */
214b725ae77Skettenis static int
tui_rl_other_window(int count,int key)215b725ae77Skettenis tui_rl_other_window (int count, int key)
216b725ae77Skettenis {
217b725ae77Skettenis struct tui_win_info * win_info;
218b725ae77Skettenis
219b725ae77Skettenis if (!tui_active)
220b725ae77Skettenis tui_rl_switch_mode (0/*notused*/, 0/*notused*/);
221b725ae77Skettenis
222b725ae77Skettenis win_info = tui_next_win (tui_win_with_focus ());
223b725ae77Skettenis if (win_info)
224b725ae77Skettenis {
225b725ae77Skettenis tui_set_win_focus_to (win_info);
226b725ae77Skettenis if (TUI_DATA_WIN && TUI_DATA_WIN->generic.is_visible)
227b725ae77Skettenis tui_refresh_data_win ();
228b725ae77Skettenis keypad (TUI_CMD_WIN->generic.handle, (win_info != TUI_CMD_WIN));
229b725ae77Skettenis }
230b725ae77Skettenis return 0;
231b725ae77Skettenis }
232b725ae77Skettenis
233b725ae77Skettenis /* TUI readline command.
234b725ae77Skettenis Execute the gdb command bound to the specified key. */
235b725ae77Skettenis static int
tui_rl_command_key(int count,int key)236b725ae77Skettenis tui_rl_command_key (int count, int key)
237b725ae77Skettenis {
238b725ae77Skettenis int i;
239b725ae77Skettenis
240b725ae77Skettenis reinitialize_more_filter ();
241b725ae77Skettenis for (i = 0; tui_commands[i].cmd; i++)
242b725ae77Skettenis {
243b725ae77Skettenis if (tui_commands[i].key == key)
244b725ae77Skettenis {
245b725ae77Skettenis /* Must save the command because it can be modified
246b725ae77Skettenis by execute_command. */
247b725ae77Skettenis char* cmd = alloca (strlen (tui_commands[i].cmd) + 1);
248b725ae77Skettenis strcpy (cmd, tui_commands[i].cmd);
249b725ae77Skettenis execute_command (cmd, TRUE);
250b725ae77Skettenis return 0;
251b725ae77Skettenis }
252b725ae77Skettenis }
253b725ae77Skettenis return 0;
254b725ae77Skettenis }
255b725ae77Skettenis
256b725ae77Skettenis /* TUI readline command.
257b725ae77Skettenis Temporarily leave the TUI SingleKey mode to allow editing
258b725ae77Skettenis a gdb command with the normal readline. Once the command
259b725ae77Skettenis is executed, the TUI SingleKey mode is installed back. */
260b725ae77Skettenis static int
tui_rl_command_mode(int count,int key)261b725ae77Skettenis tui_rl_command_mode (int count, int key)
262b725ae77Skettenis {
263b725ae77Skettenis tui_set_key_mode (TUI_ONE_COMMAND_MODE);
264b725ae77Skettenis return rl_insert (count, key);
265b725ae77Skettenis }
266b725ae77Skettenis
267b725ae77Skettenis /* TUI readline command.
268b725ae77Skettenis Switch between TUI SingleKey mode and gdb readline editing. */
269b725ae77Skettenis static int
tui_rl_next_keymap(int notused1,int notused2)270b725ae77Skettenis tui_rl_next_keymap (int notused1, int notused2)
271b725ae77Skettenis {
272b725ae77Skettenis if (!tui_active)
273b725ae77Skettenis tui_rl_switch_mode (0/*notused*/, 0/*notused*/);
274b725ae77Skettenis
275b725ae77Skettenis tui_set_key_mode (tui_current_key_mode == TUI_COMMAND_MODE
276b725ae77Skettenis ? TUI_SINGLE_KEY_MODE : TUI_COMMAND_MODE);
277b725ae77Skettenis return 0;
278b725ae77Skettenis }
279b725ae77Skettenis
280b725ae77Skettenis /* Readline hook to redisplay ourself the gdb prompt.
281b725ae77Skettenis In the SingleKey mode, the prompt is not printed so that
282b725ae77Skettenis the command window is cleaner. It will be displayed if
283b725ae77Skettenis we temporarily leave the SingleKey mode. */
284b725ae77Skettenis static int
tui_rl_startup_hook(void)285b725ae77Skettenis tui_rl_startup_hook (void)
286b725ae77Skettenis {
287b725ae77Skettenis rl_already_prompted = 1;
288b725ae77Skettenis if (tui_current_key_mode != TUI_COMMAND_MODE)
289b725ae77Skettenis tui_set_key_mode (TUI_SINGLE_KEY_MODE);
290b725ae77Skettenis tui_redisplay_readline ();
291b725ae77Skettenis return 0;
292b725ae77Skettenis }
293b725ae77Skettenis
294b725ae77Skettenis /* Change the TUI key mode by installing the appropriate readline keymap. */
295b725ae77Skettenis void
tui_set_key_mode(enum tui_key_mode mode)296b725ae77Skettenis tui_set_key_mode (enum tui_key_mode mode)
297b725ae77Skettenis {
298b725ae77Skettenis tui_current_key_mode = mode;
299b725ae77Skettenis rl_set_keymap (mode == TUI_SINGLE_KEY_MODE
300b725ae77Skettenis ? tui_keymap : tui_readline_standard_keymap);
301b725ae77Skettenis tui_show_locator_content ();
302b725ae77Skettenis }
303b725ae77Skettenis
304b725ae77Skettenis /* Initialize readline and configure the keymap for the switching
305b725ae77Skettenis key shortcut. */
306b725ae77Skettenis void
tui_initialize_readline(void)307b725ae77Skettenis tui_initialize_readline (void)
308b725ae77Skettenis {
309b725ae77Skettenis int i;
310b725ae77Skettenis Keymap tui_ctlx_keymap;
311b725ae77Skettenis
312b725ae77Skettenis rl_initialize ();
313b725ae77Skettenis
314b725ae77Skettenis rl_add_defun ("tui-switch-mode", tui_rl_switch_mode, -1);
315b725ae77Skettenis rl_add_defun ("gdb-command", tui_rl_command_key, -1);
316b725ae77Skettenis rl_add_defun ("next-keymap", tui_rl_next_keymap, -1);
317b725ae77Skettenis
318b725ae77Skettenis tui_keymap = rl_make_bare_keymap ();
319b725ae77Skettenis tui_ctlx_keymap = rl_make_bare_keymap ();
320b725ae77Skettenis tui_readline_standard_keymap = rl_get_keymap ();
321b725ae77Skettenis
322b725ae77Skettenis for (i = 0; tui_commands[i].cmd; i++)
323b725ae77Skettenis rl_bind_key_in_map (tui_commands[i].key, tui_rl_command_key, tui_keymap);
324b725ae77Skettenis
325b725ae77Skettenis rl_generic_bind (ISKMAP, "\\C-x", (char*) tui_ctlx_keymap, tui_keymap);
326b725ae77Skettenis
327b725ae77Skettenis /* Bind all other keys to tui_rl_command_mode so that we switch
328b725ae77Skettenis temporarily from SingleKey mode and can enter a gdb command. */
329b725ae77Skettenis for (i = ' '; i < 0x7f; i++)
330b725ae77Skettenis {
331b725ae77Skettenis int j;
332b725ae77Skettenis
333b725ae77Skettenis for (j = 0; tui_commands[j].cmd; j++)
334b725ae77Skettenis if (tui_commands[j].key == i)
335b725ae77Skettenis break;
336b725ae77Skettenis
337b725ae77Skettenis if (tui_commands[j].cmd)
338b725ae77Skettenis continue;
339b725ae77Skettenis
340b725ae77Skettenis rl_bind_key_in_map (i, tui_rl_command_mode, tui_keymap);
341b725ae77Skettenis }
342b725ae77Skettenis
343b725ae77Skettenis rl_bind_key_in_map ('a', tui_rl_switch_mode, emacs_ctlx_keymap);
344b725ae77Skettenis rl_bind_key_in_map ('a', tui_rl_switch_mode, tui_ctlx_keymap);
345b725ae77Skettenis rl_bind_key_in_map ('A', tui_rl_switch_mode, emacs_ctlx_keymap);
346b725ae77Skettenis rl_bind_key_in_map ('A', tui_rl_switch_mode, tui_ctlx_keymap);
347b725ae77Skettenis rl_bind_key_in_map (CTRL ('A'), tui_rl_switch_mode, emacs_ctlx_keymap);
348b725ae77Skettenis rl_bind_key_in_map (CTRL ('A'), tui_rl_switch_mode, tui_ctlx_keymap);
349b725ae77Skettenis rl_bind_key_in_map ('1', tui_rl_delete_other_windows, emacs_ctlx_keymap);
350b725ae77Skettenis rl_bind_key_in_map ('1', tui_rl_delete_other_windows, tui_ctlx_keymap);
351b725ae77Skettenis rl_bind_key_in_map ('2', tui_rl_change_windows, emacs_ctlx_keymap);
352b725ae77Skettenis rl_bind_key_in_map ('2', tui_rl_change_windows, tui_ctlx_keymap);
353b725ae77Skettenis rl_bind_key_in_map ('o', tui_rl_other_window, emacs_ctlx_keymap);
354b725ae77Skettenis rl_bind_key_in_map ('o', tui_rl_other_window, tui_ctlx_keymap);
355b725ae77Skettenis rl_bind_key_in_map ('q', tui_rl_next_keymap, tui_keymap);
356b725ae77Skettenis rl_bind_key_in_map ('s', tui_rl_next_keymap, emacs_ctlx_keymap);
357b725ae77Skettenis rl_bind_key_in_map ('s', tui_rl_next_keymap, tui_ctlx_keymap);
358b725ae77Skettenis }
359b725ae77Skettenis
360b725ae77Skettenis /* Enter in the tui mode (curses).
361b725ae77Skettenis When in normal mode, it installs the tui hooks in gdb, redirects
362b725ae77Skettenis the gdb output, configures the readline to work in tui mode.
363b725ae77Skettenis When in curses mode, it does nothing. */
364b725ae77Skettenis void
tui_enable(void)365b725ae77Skettenis tui_enable (void)
366b725ae77Skettenis {
367b725ae77Skettenis if (tui_active)
368b725ae77Skettenis return;
369b725ae77Skettenis
370b725ae77Skettenis /* To avoid to initialize curses when gdb starts, there is a defered
371b725ae77Skettenis curses initialization. This initialization is made only once
372b725ae77Skettenis and the first time the curses mode is entered. */
373b725ae77Skettenis if (tui_finish_init)
374b725ae77Skettenis {
375b725ae77Skettenis WINDOW *w;
376b725ae77Skettenis
377b725ae77Skettenis w = initscr ();
378b725ae77Skettenis
379b725ae77Skettenis cbreak ();
380b725ae77Skettenis noecho ();
381b725ae77Skettenis /*timeout (1);*/
382b725ae77Skettenis nodelay(w, FALSE);
383b725ae77Skettenis nl();
384b725ae77Skettenis keypad (w, TRUE);
385b725ae77Skettenis rl_initialize ();
386b725ae77Skettenis tui_set_term_height_to (LINES);
387b725ae77Skettenis tui_set_term_width_to (COLS);
388b725ae77Skettenis def_prog_mode ();
389b725ae77Skettenis
390b725ae77Skettenis tui_show_frame_info (0);
391b725ae77Skettenis tui_set_layout (SRC_COMMAND, TUI_UNDEFINED_REGS);
392b725ae77Skettenis tui_set_win_focus_to (TUI_SRC_WIN);
393b725ae77Skettenis keypad (TUI_CMD_WIN->generic.handle, TRUE);
394b725ae77Skettenis wrefresh (TUI_CMD_WIN->generic.handle);
395b725ae77Skettenis tui_finish_init = 0;
396b725ae77Skettenis }
397b725ae77Skettenis else
398b725ae77Skettenis {
399b725ae77Skettenis /* Save the current gdb setting of the terminal.
400b725ae77Skettenis Curses will restore this state when endwin() is called. */
401b725ae77Skettenis def_shell_mode ();
402b725ae77Skettenis clearok (stdscr, TRUE);
403b725ae77Skettenis }
404b725ae77Skettenis
405b725ae77Skettenis /* Install the TUI specific hooks. */
406b725ae77Skettenis tui_install_hooks ();
407b725ae77Skettenis rl_startup_hook = tui_rl_startup_hook;
408b725ae77Skettenis
409b725ae77Skettenis tui_update_variables ();
410b725ae77Skettenis
411b725ae77Skettenis tui_setup_io (1);
412b725ae77Skettenis
413b725ae77Skettenis tui_active = 1;
414b725ae77Skettenis if (deprecated_selected_frame)
415b725ae77Skettenis tui_show_frame_info (deprecated_selected_frame);
416b725ae77Skettenis
417b725ae77Skettenis /* Restore TUI keymap. */
418b725ae77Skettenis tui_set_key_mode (tui_current_key_mode);
419b725ae77Skettenis tui_refresh_all_win ();
420b725ae77Skettenis
421b725ae77Skettenis /* Update gdb's knowledge of its terminal. */
422b725ae77Skettenis target_terminal_save_ours ();
423b725ae77Skettenis tui_update_gdb_sizes ();
424b725ae77Skettenis }
425b725ae77Skettenis
426b725ae77Skettenis /* Leave the tui mode.
427b725ae77Skettenis Remove the tui hooks and configure the gdb output and readline
428b725ae77Skettenis back to their original state. The curses mode is left so that
429b725ae77Skettenis the terminal setting is restored to the point when we entered. */
430b725ae77Skettenis void
tui_disable(void)431b725ae77Skettenis tui_disable (void)
432b725ae77Skettenis {
433b725ae77Skettenis if (!tui_active)
434b725ae77Skettenis return;
435b725ae77Skettenis
436b725ae77Skettenis /* Restore initial readline keymap. */
437b725ae77Skettenis rl_set_keymap (tui_readline_standard_keymap);
438b725ae77Skettenis
439b725ae77Skettenis /* Remove TUI hooks. */
440b725ae77Skettenis tui_remove_hooks ();
441b725ae77Skettenis rl_startup_hook = 0;
442b725ae77Skettenis rl_already_prompted = 0;
443b725ae77Skettenis
444b725ae77Skettenis /* Leave curses and restore previous gdb terminal setting. */
445b725ae77Skettenis endwin ();
446b725ae77Skettenis
447b725ae77Skettenis /* gdb terminal has changed, update gdb internal copy of it
448b725ae77Skettenis so that terminal management with the inferior works. */
449b725ae77Skettenis tui_setup_io (0);
450b725ae77Skettenis
451b725ae77Skettenis /* Update gdb's knowledge of its terminal. */
452b725ae77Skettenis target_terminal_save_ours ();
453b725ae77Skettenis
454b725ae77Skettenis tui_active = 0;
455b725ae77Skettenis tui_update_gdb_sizes ();
456b725ae77Skettenis }
457b725ae77Skettenis
458b725ae77Skettenis void
strcat_to_buf(char * buf,int buflen,const char * item_to_add)459b725ae77Skettenis strcat_to_buf (char *buf, int buflen, const char *item_to_add)
460b725ae77Skettenis {
461b725ae77Skettenis if (item_to_add != (char *) NULL && buf != (char *) NULL)
462b725ae77Skettenis {
463b725ae77Skettenis if ((strlen (buf) + strlen (item_to_add)) <= buflen)
464b725ae77Skettenis strcat (buf, item_to_add);
465b725ae77Skettenis else
466b725ae77Skettenis strncat (buf, item_to_add, (buflen - strlen (buf)));
467b725ae77Skettenis }
468b725ae77Skettenis }
469b725ae77Skettenis
470b725ae77Skettenis #if 0
471b725ae77Skettenis /* Solaris <sys/termios.h> defines CTRL. */
472b725ae77Skettenis #ifndef CTRL
473b725ae77Skettenis #define CTRL(x) (x & ~0140)
474b725ae77Skettenis #endif
475b725ae77Skettenis
476b725ae77Skettenis #define FILEDES 2
477b725ae77Skettenis #define CHK(val, dft) (val<=0 ? dft : val)
478b725ae77Skettenis
479b725ae77Skettenis static void
480b725ae77Skettenis tui_reset (void)
481b725ae77Skettenis {
482b725ae77Skettenis struct termio mode;
483b725ae77Skettenis
484b725ae77Skettenis /*
485b725ae77Skettenis ** reset the teletype mode bits to a sensible state.
486b725ae77Skettenis ** Copied tset.c
487b725ae77Skettenis */
488*11efff7fSkettenis #if defined (TIOCGETC)
489b725ae77Skettenis struct tchars tbuf;
490*11efff7fSkettenis #endif /* TIOCGETC */
491b725ae77Skettenis #ifdef UCB_NTTY
492b725ae77Skettenis struct ltchars ltc;
493b725ae77Skettenis
494b725ae77Skettenis if (ldisc == NTTYDISC)
495b725ae77Skettenis {
496b725ae77Skettenis ioctl (FILEDES, TIOCGLTC, <c);
497b725ae77Skettenis ltc.t_suspc = CHK (ltc.t_suspc, CTRL ('Z'));
498b725ae77Skettenis ltc.t_dsuspc = CHK (ltc.t_dsuspc, CTRL ('Y'));
499b725ae77Skettenis ltc.t_rprntc = CHK (ltc.t_rprntc, CTRL ('R'));
500b725ae77Skettenis ltc.t_flushc = CHK (ltc.t_flushc, CTRL ('O'));
501b725ae77Skettenis ltc.t_werasc = CHK (ltc.t_werasc, CTRL ('W'));
502b725ae77Skettenis ltc.t_lnextc = CHK (ltc.t_lnextc, CTRL ('V'));
503b725ae77Skettenis ioctl (FILEDES, TIOCSLTC, <c);
504b725ae77Skettenis }
505b725ae77Skettenis #endif /* UCB_NTTY */
506b725ae77Skettenis #ifdef TIOCGETC
507b725ae77Skettenis ioctl (FILEDES, TIOCGETC, &tbuf);
508b725ae77Skettenis tbuf.t_intrc = CHK (tbuf.t_intrc, CTRL ('?'));
509b725ae77Skettenis tbuf.t_quitc = CHK (tbuf.t_quitc, CTRL ('\\'));
510b725ae77Skettenis tbuf.t_startc = CHK (tbuf.t_startc, CTRL ('Q'));
511b725ae77Skettenis tbuf.t_stopc = CHK (tbuf.t_stopc, CTRL ('S'));
512b725ae77Skettenis tbuf.t_eofc = CHK (tbuf.t_eofc, CTRL ('D'));
513b725ae77Skettenis /* brkc is left alone */
514b725ae77Skettenis ioctl (FILEDES, TIOCSETC, &tbuf);
515b725ae77Skettenis #endif /* TIOCGETC */
516b725ae77Skettenis mode.sg_flags &= ~(RAW
517b725ae77Skettenis #ifdef CBREAK
518b725ae77Skettenis | CBREAK
519b725ae77Skettenis #endif /* CBREAK */
520b725ae77Skettenis | VTDELAY | ALLDELAY);
521b725ae77Skettenis mode.sg_flags |= XTABS | ECHO | CRMOD | ANYP;
522b725ae77Skettenis
523b725ae77Skettenis return;
524b725ae77Skettenis }
525b725ae77Skettenis #endif
526b725ae77Skettenis
527b725ae77Skettenis void
tui_show_source(const char * file,int line)528b725ae77Skettenis tui_show_source (const char *file, int line)
529b725ae77Skettenis {
530b725ae77Skettenis struct symtab_and_line cursal = get_current_source_symtab_and_line ();
531b725ae77Skettenis /* make sure that the source window is displayed */
532b725ae77Skettenis tui_add_win_to_layout (SRC_WIN);
533b725ae77Skettenis
534b725ae77Skettenis tui_update_source_windows_with_line (cursal.symtab, line);
535b725ae77Skettenis tui_update_locator_filename (file);
536b725ae77Skettenis }
537b725ae77Skettenis
538b725ae77Skettenis void
tui_show_assembly(CORE_ADDR addr)539b725ae77Skettenis tui_show_assembly (CORE_ADDR addr)
540b725ae77Skettenis {
541b725ae77Skettenis tui_add_win_to_layout (DISASSEM_WIN);
542b725ae77Skettenis tui_update_source_windows_with_addr (addr);
543b725ae77Skettenis }
544b725ae77Skettenis
545b725ae77Skettenis int
tui_is_window_visible(enum tui_win_type type)546b725ae77Skettenis tui_is_window_visible (enum tui_win_type type)
547b725ae77Skettenis {
548b725ae77Skettenis if (tui_active == 0)
549b725ae77Skettenis return 0;
550b725ae77Skettenis
551b725ae77Skettenis if (tui_win_list[type] == 0)
552b725ae77Skettenis return 0;
553b725ae77Skettenis
554b725ae77Skettenis return tui_win_list[type]->generic.is_visible;
555b725ae77Skettenis }
556b725ae77Skettenis
557b725ae77Skettenis int
tui_get_command_dimension(int * width,int * height)558b725ae77Skettenis tui_get_command_dimension (int *width, int *height)
559b725ae77Skettenis {
560b725ae77Skettenis if (!tui_active || (TUI_CMD_WIN == NULL))
561b725ae77Skettenis {
562b725ae77Skettenis return 0;
563b725ae77Skettenis }
564b725ae77Skettenis
565b725ae77Skettenis *width = TUI_CMD_WIN->generic.width;
566b725ae77Skettenis *height = TUI_CMD_WIN->generic.height;
567b725ae77Skettenis return 1;
568b725ae77Skettenis }
569