xref: /openbsd-src/gnu/usr.bin/binutils/gdb/tui/tui.c (revision 11efff7f3ac2b3cfeff0c0cddc14294d9b3aca4f)
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, &ltc);
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, &ltc);
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