1 /* General functions for the WDB TUI.
3 Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation,
6 Contributed by Hewlett-Packard Company.
8 This file is part of GDB.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330,
23 Boston, MA 02111-1307, USA. */
25 /* FIXME: cagney/2002-02-28: The GDB coding standard indicates that
26 "defs.h" should be included first. Unfortunatly some systems
27 (currently Debian GNU/Linux) include the <stdbool.h> via <curses.h>
28 and they clash with "bfd.h"'s definiton of true/false. The correct
29 fix is to remove true/false from "bfd.h", however, until that
30 happens, hack around it by including "config.h" and <curses.h>
59 #include "tuiLayout.h"
64 #include "tuiSourceWin.h"
65 #include "readline/readline.h"
68 #include "breakpoint.h"
71 /* Tells whether the TUI is active or not. */
73 static int tui_finish_init
= 1;
75 /* Switch the output mode between TUI/standard gdb. */
77 tui_rl_switch_mode (void)
84 printf_filtered ("Left the TUI mode\n");
88 rl_deprep_terminal ();
90 printf_filtered ("Entered the TUI mode\n");
93 /* Clear the readline in case switching occurred in middle of something. */
95 rl_kill_text (0, rl_end
);
97 /* Since we left the curses mode, the terminal mode is restored to
98 some previous state. That state may not be suitable for readline
99 to work correctly (it may be restored in line mode). We force an
100 exit of the current readline so that readline is re-entered and it
101 will be able to setup the terminal for its needs. By re-entering
102 in readline, we also redisplay its prompt in the non-curses mode. */
103 rl_newline (1, '\n');
105 /* Make sure the \n we are returning does not repeat the last command. */
110 /* TUI readline command.
111 Change the TUI layout to show a next layout.
112 This function is bound to CTRL-X 2. It is intended to provide
113 a functionality close to the Emacs split-window command. We always
114 show two windows (src+asm), (src+regs) or (asm+regs). */
116 tui_rl_change_windows (void)
119 tui_rl_switch_mode ();
123 TuiLayoutType new_layout
;
124 TuiRegisterDisplayType regs_type
= TUI_UNDEFINED_REGS
;
126 new_layout
= currentLayout ();
128 /* Select a new layout to have a rolling layout behavior
129 with always two windows (except when undefined). */
133 new_layout
= SRC_DISASSEM_COMMAND
;
136 case DISASSEM_COMMAND
:
137 new_layout
= SRC_DISASSEM_COMMAND
;
140 case SRC_DATA_COMMAND
:
141 new_layout
= SRC_DISASSEM_COMMAND
;
144 case SRC_DISASSEM_COMMAND
:
145 new_layout
= DISASSEM_DATA_COMMAND
;
148 case DISASSEM_DATA_COMMAND
:
149 new_layout
= SRC_DATA_COMMAND
;
153 new_layout
= SRC_COMMAND
;
156 tuiSetLayout (new_layout
, regs_type
);
161 /* TUI readline command.
162 Delete the second TUI window to only show one. */
164 tui_rl_delete_other_windows (void)
167 tui_rl_switch_mode ();
171 TuiLayoutType new_layout
;
172 TuiRegisterDisplayType regs_type
= TUI_UNDEFINED_REGS
;
174 new_layout
= currentLayout ();
176 /* Kill one window. */
180 case SRC_DATA_COMMAND
:
181 case SRC_DISASSEM_COMMAND
:
183 new_layout
= SRC_COMMAND
;
186 case DISASSEM_COMMAND
:
187 case DISASSEM_DATA_COMMAND
:
188 new_layout
= DISASSEM_COMMAND
;
191 tuiSetLayout (new_layout
, regs_type
);
196 /* Initialize readline and configure the keymap for the switching
199 tui_initialize_readline ()
203 rl_add_defun ("tui-switch-mode", tui_rl_switch_mode
, -1);
204 rl_bind_key_in_map ('a', tui_rl_switch_mode
, emacs_ctlx_keymap
);
205 rl_bind_key_in_map ('A', tui_rl_switch_mode
, emacs_ctlx_keymap
);
206 rl_bind_key_in_map (CTRL ('A'), tui_rl_switch_mode
, emacs_ctlx_keymap
);
207 rl_bind_key_in_map ('1', tui_rl_delete_other_windows
, emacs_ctlx_keymap
);
208 rl_bind_key_in_map ('2', tui_rl_change_windows
, emacs_ctlx_keymap
);
211 /* Enter in the tui mode (curses).
212 When in normal mode, it installs the tui hooks in gdb, redirects
213 the gdb output, configures the readline to work in tui mode.
214 When in curses mode, it does nothing. */
221 /* To avoid to initialize curses when gdb starts, there is a defered
222 curses initialization. This initialization is made only once
223 and the first time the curses mode is entered. */
237 setTermHeightTo (LINES
);
238 setTermWidthTo (COLS
);
241 tuiShowFrameInfo (0);
242 tuiSetLayout (SRC_COMMAND
, TUI_UNDEFINED_REGS
);
243 tuiSetWinFocusTo (srcWin
);
244 keypad (cmdWin
->generic
.handle
, TRUE
);
245 wrefresh (cmdWin
->generic
.handle
);
250 /* Save the current gdb setting of the terminal.
251 Curses will restore this state when endwin() is called. */
253 clearok (stdscr
, TRUE
);
256 /* Install the TUI specific hooks. */
257 tui_install_hooks ();
259 tui_update_variables ();
266 tuiShowFrameInfo (selected_frame
);
270 /* Update gdb's knowledge of its terminal. */
271 target_terminal_save_ours ();
272 tui_update_gdb_sizes ();
275 /* Leave the tui mode.
276 Remove the tui hooks and configure the gdb output and readline
277 back to their original state. The curses mode is left so that
278 the terminal setting is restored to the point when we entered. */
285 /* Remove TUI hooks. */
288 /* Leave curses and restore previous gdb terminal setting. */
291 /* gdb terminal has changed, update gdb internal copy of it
292 so that terminal management with the inferior works. */
295 /* Update gdb's knowledge of its terminal. */
296 target_terminal_save_ours ();
300 tui_update_gdb_sizes ();
303 /* Wrapper on top of free() to ensure that input address
304 is greater than 0x0. */
308 if (ptr
!= (char *) NULL
)
315 strcat_to_buf (char *buf
, int buflen
, const char *itemToAdd
)
317 if (itemToAdd
!= (char *) NULL
&& buf
!= (char *) NULL
)
319 if ((strlen (buf
) + strlen (itemToAdd
)) <= buflen
)
320 strcat (buf
, itemToAdd
);
322 strncat (buf
, itemToAdd
, (buflen
- strlen (buf
)));
327 /* Solaris <sys/termios.h> defines CTRL. */
329 #define CTRL(x) (x & ~0140)
333 #define CHK(val, dft) (val<=0 ? dft : val)
341 ** reset the teletype mode bits to a sensible state.
344 #if ! defined (USG) && defined (TIOCGETC)
346 #endif /* !USG && TIOCGETC */
350 if (ldisc
== NTTYDISC
)
352 ioctl (FILEDES
, TIOCGLTC
, <c
);
353 ltc
.t_suspc
= CHK (ltc
.t_suspc
, CTRL ('Z'));
354 ltc
.t_dsuspc
= CHK (ltc
.t_dsuspc
, CTRL ('Y'));
355 ltc
.t_rprntc
= CHK (ltc
.t_rprntc
, CTRL ('R'));
356 ltc
.t_flushc
= CHK (ltc
.t_flushc
, CTRL ('O'));
357 ltc
.t_werasc
= CHK (ltc
.t_werasc
, CTRL ('W'));
358 ltc
.t_lnextc
= CHK (ltc
.t_lnextc
, CTRL ('V'));
359 ioctl (FILEDES
, TIOCSLTC
, <c
);
361 #endif /* UCB_NTTY */
364 ioctl (FILEDES
, TIOCGETC
, &tbuf
);
365 tbuf
.t_intrc
= CHK (tbuf
.t_intrc
, CTRL ('?'));
366 tbuf
.t_quitc
= CHK (tbuf
.t_quitc
, CTRL ('\\'));
367 tbuf
.t_startc
= CHK (tbuf
.t_startc
, CTRL ('Q'));
368 tbuf
.t_stopc
= CHK (tbuf
.t_stopc
, CTRL ('S'));
369 tbuf
.t_eofc
= CHK (tbuf
.t_eofc
, CTRL ('D'));
370 /* brkc is left alone */
371 ioctl (FILEDES
, TIOCSETC
, &tbuf
);
372 #endif /* TIOCGETC */
373 mode
.sg_flags
&= ~(RAW
377 | VTDELAY
| ALLDELAY
);
378 mode
.sg_flags
|= XTABS
| ECHO
| CRMOD
| ANYP
;
380 ioctl (FILEDES
, TCGETA
, &mode
);
381 mode
.c_cc
[VINTR
] = CHK (mode
.c_cc
[VINTR
], CTRL ('?'));
382 mode
.c_cc
[VQUIT
] = CHK (mode
.c_cc
[VQUIT
], CTRL ('\\'));
383 mode
.c_cc
[VEOF
] = CHK (mode
.c_cc
[VEOF
], CTRL ('D'));
385 mode
.c_iflag
&= ~(IGNBRK
| PARMRK
| INPCK
| INLCR
| IGNCR
| IUCLC
| IXOFF
);
386 mode
.c_iflag
|= (BRKINT
| ISTRIP
| ICRNL
| IXON
);
387 mode
.c_oflag
&= ~(OLCUC
| OCRNL
| ONOCR
| ONLRET
| OFILL
| OFDEL
|
388 NLDLY
| CRDLY
| TABDLY
| BSDLY
| VTDLY
| FFDLY
);
389 mode
.c_oflag
|= (OPOST
| ONLCR
);
390 mode
.c_cflag
&= ~(CSIZE
| PARODD
| CLOCAL
);
392 mode
.c_cflag
|= (CS8
| CREAD
);
393 #else /*hp9000s800 */
394 mode
.c_cflag
|= (CS8
| CSTOPB
| CREAD
);
395 #endif /* hp9000s800 */
396 mode
.c_lflag
&= ~(XCASE
| ECHONL
| NOFLSH
);
397 mode
.c_lflag
|= (ISIG
| ICANON
| ECHO
| ECHOK
);
398 ioctl (FILEDES
, TCSETAW
, &mode
);
406 tui_show_source (const char *file
, int line
)
408 /* make sure that the source window is displayed */
409 tuiAddWinToLayout (SRC_WIN
);
411 tuiUpdateSourceWindowsWithLine (current_source_symtab
, line
);
412 tuiUpdateLocatorFilename (file
);
416 tui_show_assembly (CORE_ADDR addr
)
418 tuiAddWinToLayout (DISASSEM_WIN
);
419 tuiUpdateSourceWindowsWithAddr (addr
);
423 tui_is_window_visible (TuiWinType type
)
425 if (tui_version
== 0)
428 if (winList
[type
] == 0)
431 return winList
[type
]->generic
.isVisible
;
435 tui_get_command_dimension (int *width
, int *height
)
437 if (!tui_version
|| !m_winPtrNotNull (cmdWin
))
442 *width
= cmdWin
->generic
.width
;
443 *height
= cmdWin
->generic
.height
;