1 /* General functions for the WDB TUI.
2 Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
3 Contributed by Hewlett-Packard Company.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
37 #include "tuiLayout.h"
42 #include "tuiSourceWin.h"
43 #include "readline/readline.h"
46 #include "breakpoint.h"
49 /* Tells whether the TUI is active or not. */
51 static int tui_finish_init
= 1;
53 /* Switch the output mode between TUI/standard gdb. */
55 tui_switch_mode (void)
62 printf_filtered ("Left the TUI mode\n");
66 rl_deprep_terminal ();
68 printf_filtered ("Entered the TUI mode\n");
71 /* Clear the readline in case switching occurred in middle of something. */
73 rl_kill_text (0, rl_end
);
75 /* Since we left the curses mode, the terminal mode is restored to
76 some previous state. That state may not be suitable for readline
77 to work correctly (it may be restored in line mode). We force an
78 exit of the current readline so that readline is re-entered and it
79 will be able to setup the terminal for its needs. By re-entering
80 in readline, we also redisplay its prompt in the non-curses mode. */
83 /* Make sure the \n we are returning does not repeat the last command. */
88 /* Change the TUI layout to show a next layout.
89 This function is bound to CTRL-X 2. It is intended to provide
90 a functionality close to the Emacs split-window command. We always
91 show two windows (src+asm), (src+regs) or (asm+regs). */
93 tui_change_windows (void)
100 TuiLayoutType new_layout
;
101 TuiRegisterDisplayType regs_type
= TUI_UNDEFINED_REGS
;
103 new_layout
= currentLayout ();
105 /* Select a new layout to have a rolling layout behavior
106 with always two windows (except when undefined). */
110 new_layout
= SRC_DISASSEM_COMMAND
;
113 case DISASSEM_COMMAND
:
114 new_layout
= SRC_DISASSEM_COMMAND
;
117 case SRC_DATA_COMMAND
:
118 new_layout
= SRC_DISASSEM_COMMAND
;
121 case SRC_DISASSEM_COMMAND
:
122 new_layout
= DISASSEM_DATA_COMMAND
;
125 case DISASSEM_DATA_COMMAND
:
126 new_layout
= SRC_DATA_COMMAND
;
130 new_layout
= SRC_COMMAND
;
133 tuiSetLayout (new_layout
, regs_type
);
139 /* Delete the second TUI window to only show one. */
141 tui_delete_other_windows (void)
148 TuiLayoutType new_layout
;
149 TuiRegisterDisplayType regs_type
= TUI_UNDEFINED_REGS
;
151 new_layout
= currentLayout ();
153 /* Kill one window. */
157 case SRC_DATA_COMMAND
:
158 case SRC_DISASSEM_COMMAND
:
160 new_layout
= SRC_COMMAND
;
163 case DISASSEM_COMMAND
:
164 case DISASSEM_DATA_COMMAND
:
165 new_layout
= DISASSEM_COMMAND
;
168 tuiSetLayout (new_layout
, regs_type
);
173 /* Initialize readline and configure the keymap for the switching
176 tui_initialize_readline ()
180 rl_add_defun ("tui-switch-mode", tui_switch_mode
, -1);
181 rl_bind_key_in_map ('a', tui_switch_mode
, emacs_ctlx_keymap
);
182 rl_bind_key_in_map ('A', tui_switch_mode
, emacs_ctlx_keymap
);
183 rl_bind_key_in_map (CTRL ('A'), tui_switch_mode
, emacs_ctlx_keymap
);
184 rl_bind_key_in_map ('1', tui_delete_other_windows
, emacs_ctlx_keymap
);
185 rl_bind_key_in_map ('2', tui_change_windows
, emacs_ctlx_keymap
);
188 /* Enter in the tui mode (curses).
189 When in normal mode, it installs the tui hooks in gdb, redirects
190 the gdb output, configures the readline to work in tui mode.
191 When in curses mode, it does nothing. */
198 /* To avoid to initialize curses when gdb starts, there is a defered
199 curses initialization. This initialization is made only once
200 and the first time the curses mode is entered. */
214 setTermHeightTo (LINES
);
215 setTermWidthTo (COLS
);
218 tuiSetLocatorContent (0);
219 showLayout (SRC_COMMAND
);
220 tuiSetWinFocusTo (srcWin
);
221 keypad (cmdWin
->generic
.handle
, TRUE
);
222 wrefresh (cmdWin
->generic
.handle
);
227 /* Save the current gdb setting of the terminal.
228 Curses will restore this state when endwin() is called. */
230 clearok (stdscr
, TRUE
);
233 /* Install the TUI specific hooks. */
234 tui_install_hooks ();
236 tui_update_variables ();
245 /* Leave the tui mode.
246 Remove the tui hooks and configure the gdb output and readline
247 back to their original state. The curses mode is left so that
248 the terminal setting is restored to the point when we entered. */
255 /* Remove TUI hooks. */
258 /* Leave curses and restore previous gdb terminal setting. */
261 /* gdb terminal has changed, update gdb internal copy of it
262 so that terminal management with the inferior works. */
269 /* Wrapper on top of free() to ensure that input address
270 is greater than 0x0. */
274 if (ptr
!= (char *) NULL
)
280 /* Determine what the low address will be to display in the TUI's
281 disassembly window. This may or may not be the same as the
282 low address input. */
284 tuiGetLowDisassemblyAddress (CORE_ADDR low
, CORE_ADDR pc
)
289 /* Determine where to start the disassembly so that the pc is about in the
290 middle of the viewport. */
291 for (line
= 0, newLow
= pc
;
293 line
< (tuiDefaultWinViewportHeight (DISASSEM_WIN
,
294 DISASSEM_COMMAND
) / 2));)
298 newLow
-= sizeof (bfd_getb32 (buffer
));
306 strcat_to_buf (char *buf
, int buflen
, char *itemToAdd
)
308 if (itemToAdd
!= (char *) NULL
&& buf
!= (char *) NULL
)
310 if ((strlen (buf
) + strlen (itemToAdd
)) <= buflen
)
311 strcat (buf
, itemToAdd
);
313 strncat (buf
, itemToAdd
, (buflen
- strlen (buf
)));
318 /* Solaris <sys/termios.h> defines CTRL. */
320 #define CTRL(x) (x & ~0140)
324 #define CHK(val, dft) (val<=0 ? dft : val)
332 ** reset the teletype mode bits to a sensible state.
335 #if ! defined (USG) && defined (TIOCGETC)
337 #endif /* !USG && TIOCGETC */
341 if (ldisc
== NTTYDISC
)
343 ioctl (FILEDES
, TIOCGLTC
, <c
);
344 ltc
.t_suspc
= CHK (ltc
.t_suspc
, CTRL ('Z'));
345 ltc
.t_dsuspc
= CHK (ltc
.t_dsuspc
, CTRL ('Y'));
346 ltc
.t_rprntc
= CHK (ltc
.t_rprntc
, CTRL ('R'));
347 ltc
.t_flushc
= CHK (ltc
.t_flushc
, CTRL ('O'));
348 ltc
.t_werasc
= CHK (ltc
.t_werasc
, CTRL ('W'));
349 ltc
.t_lnextc
= CHK (ltc
.t_lnextc
, CTRL ('V'));
350 ioctl (FILEDES
, TIOCSLTC
, <c
);
352 #endif /* UCB_NTTY */
355 ioctl (FILEDES
, TIOCGETC
, &tbuf
);
356 tbuf
.t_intrc
= CHK (tbuf
.t_intrc
, CTRL ('?'));
357 tbuf
.t_quitc
= CHK (tbuf
.t_quitc
, CTRL ('\\'));
358 tbuf
.t_startc
= CHK (tbuf
.t_startc
, CTRL ('Q'));
359 tbuf
.t_stopc
= CHK (tbuf
.t_stopc
, CTRL ('S'));
360 tbuf
.t_eofc
= CHK (tbuf
.t_eofc
, CTRL ('D'));
361 /* brkc is left alone */
362 ioctl (FILEDES
, TIOCSETC
, &tbuf
);
363 #endif /* TIOCGETC */
364 mode
.sg_flags
&= ~(RAW
368 | VTDELAY
| ALLDELAY
);
369 mode
.sg_flags
|= XTABS
| ECHO
| CRMOD
| ANYP
;
371 ioctl (FILEDES
, TCGETA
, &mode
);
372 mode
.c_cc
[VINTR
] = CHK (mode
.c_cc
[VINTR
], CTRL ('?'));
373 mode
.c_cc
[VQUIT
] = CHK (mode
.c_cc
[VQUIT
], CTRL ('\\'));
374 mode
.c_cc
[VEOF
] = CHK (mode
.c_cc
[VEOF
], CTRL ('D'));
376 mode
.c_iflag
&= ~(IGNBRK
| PARMRK
| INPCK
| INLCR
| IGNCR
| IUCLC
| IXOFF
);
377 mode
.c_iflag
|= (BRKINT
| ISTRIP
| ICRNL
| IXON
);
378 mode
.c_oflag
&= ~(OLCUC
| OCRNL
| ONOCR
| ONLRET
| OFILL
| OFDEL
|
379 NLDLY
| CRDLY
| TABDLY
| BSDLY
| VTDLY
| FFDLY
);
380 mode
.c_oflag
|= (OPOST
| ONLCR
);
381 mode
.c_cflag
&= ~(CSIZE
| PARODD
| CLOCAL
);
383 mode
.c_cflag
|= (CS8
| CREAD
);
384 #else /*hp9000s800 */
385 mode
.c_cflag
|= (CS8
| CSTOPB
| CREAD
);
386 #endif /* hp9000s800 */
387 mode
.c_lflag
&= ~(XCASE
| ECHONL
| NOFLSH
);
388 mode
.c_lflag
|= (ISIG
| ICANON
| ECHO
| ECHOK
);
389 ioctl (FILEDES
, TCSETAW
, &mode
);
397 tui_show_source (const char *file
, int line
)
399 /* make sure that the source window is displayed */
400 tuiAddWinToLayout (SRC_WIN
);
402 tuiUpdateSourceWindowsWithLine (current_source_symtab
, line
);
403 tuiUpdateLocatorFilename (file
);
407 tui_show_assembly (CORE_ADDR addr
)
409 tuiAddWinToLayout (DISASSEM_WIN
);
410 tuiUpdateSourceWindowsWithAddr (addr
);
414 tui_is_window_visible (TuiWinType type
)
416 if (tui_version
== 0)
419 if (winList
[type
] == 0)
422 return winList
[type
]->generic
.isVisible
;
426 tui_get_command_dimension (int *width
, int *height
)
428 if (!tui_version
|| !m_winPtrNotNull (cmdWin
))
433 *width
= cmdWin
->generic
.width
;
434 *height
= cmdWin
->generic
.height
;