/* General functions for the WDB TUI.
- Copyright (C) 1998-2019 Free Software Foundation, Inc.
+ Copyright (C) 1998-2020 Free Software Foundation, Inc.
Contributed by Hewlett-Packard Company.
#include "tui/tui-regs.h"
#include "tui/tui-stack.h"
#include "tui/tui-win.h"
+#include "tui/tui-wingeneral.h"
#include "tui/tui-winsource.h"
#include "tui/tui-source.h"
#include "target.h"
#include <ctype.h>
#include <signal.h>
#include <fcntl.h>
-#if 0
-#include <termio.h>
-#endif
#include <setjmp.h>
#include "gdb_curses.h"
#include "readline/readline.h"
/* Tells whether the TUI is active or not. */
-int tui_active = 0;
-static int tui_finish_init = 1;
+bool tui_active = false;
+static bool tui_finish_init = true;
enum tui_key_mode tui_current_key_mode = TUI_COMMAND_MODE;
/* TUI readline command.
Change the TUI layout to show a next layout.
This function is bound to CTRL-X 2. It is intended to provide
- a functionality close to the Emacs split-window command. We
- always show two windows (src+asm), (src+regs) or (asm+regs). */
+ a functionality close to the Emacs split-window command. */
static int
tui_rl_change_windows (int notused1, int notused2)
{
tui_rl_switch_mode (0 /* notused */, 0 /* notused */);
if (tui_active)
- {
- enum tui_layout_type new_layout;
-
- new_layout = tui_current_layout ();
+ tui_next_layout ();
- /* Select a new layout to have a rolling layout behavior with
- always two windows (except when undefined). */
- switch (new_layout)
- {
- case SRC_COMMAND:
- new_layout = SRC_DISASSEM_COMMAND;
- break;
-
- case DISASSEM_COMMAND:
- new_layout = SRC_DISASSEM_COMMAND;
- break;
-
- case SRC_DATA_COMMAND:
- new_layout = SRC_DISASSEM_COMMAND;
- break;
-
- case SRC_DISASSEM_COMMAND:
- new_layout = DISASSEM_DATA_COMMAND;
- break;
-
- case DISASSEM_DATA_COMMAND:
- new_layout = SRC_DATA_COMMAND;
- break;
-
- default:
- new_layout = SRC_COMMAND;
- break;
- }
- tui_set_layout (new_layout);
- }
return 0;
}
tui_rl_switch_mode (0 /* notused */, 0 /* notused */);
if (tui_active)
- {
- enum tui_layout_type new_layout;
-
- new_layout = tui_current_layout ();
+ tui_remove_some_windows ();
- /* Kill one window. */
- switch (new_layout)
- {
- case SRC_COMMAND:
- case SRC_DATA_COMMAND:
- case SRC_DISASSEM_COMMAND:
- default:
- new_layout = SRC_COMMAND;
- break;
-
- case DISASSEM_COMMAND:
- case DISASSEM_DATA_COMMAND:
- new_layout = DISASSEM_COMMAND;
- break;
- }
- tui_set_layout (new_layout);
- }
return 0;
}
/* Initialize readline and configure the keymap for the switching
key shortcut. */
void
-tui_initialize_readline (void)
+tui_ensure_readline_initialized ()
{
+ static bool initialized;
+
+ if (initialized)
+ return;
+ initialized = true;
+
int i;
Keymap tui_ctlx_keymap;
rl_bind_key_in_map ('q', tui_rl_next_keymap, tui_keymap);
rl_bind_key_in_map ('s', tui_rl_next_keymap, emacs_ctlx_keymap);
rl_bind_key_in_map ('s', tui_rl_next_keymap, tui_ctlx_keymap);
+
+ /* Initialize readline after the above. */
+ rl_initialize ();
}
/* Return the TERM variable from the environment, or "<unset>"
/* Don't try to setup curses (and print funny control
characters) if we're not outputting to a terminal. */
- if (!ui_file_isatty (gdb_stdout))
+ if (!gdb_stderr->isatty ())
error (_("Cannot enable the TUI when output is not a terminal"));
s = newterm (NULL, stdout, stdin);
def_prog_mode ();
tui_show_frame_info (0);
- tui_set_layout (SRC_COMMAND);
+ tui_set_initial_layout ();
tui_set_win_focus_to (TUI_SRC_WIN);
keypad (TUI_CMD_WIN->handle.get (), TRUE);
wrefresh (TUI_CMD_WIN->handle.get ());
- tui_finish_init = 0;
+ tui_finish_init = false;
}
else
{
clearok (stdscr, TRUE);
}
- /* Install the TUI specific hooks. */
- tui_install_hooks ();
- rl_startup_hook = tui_rl_startup_hook;
-
if (tui_update_variables ())
tui_rehighlight_all ();
tui_setup_io (1);
- tui_active = 1;
+ tui_active = true;
/* Resize windows before anything might display/refresh a
window. */
if (deprecated_safe_get_selected_frame ())
tui_show_frame_info (deprecated_safe_get_selected_frame ());
+ else
+ tui_display_main ();
+
+ /* Install the TUI specific hooks. This must be done after the call to
+ tui_display_main so that we don't detect the symtab changed event it
+ can cause. */
+ tui_install_hooks ();
+ rl_startup_hook = tui_rl_startup_hook;
/* Restore TUI keymap. */
tui_set_key_mode (tui_current_key_mode);
/* Update gdb's knowledge of its terminal. */
gdb_save_tty_state ();
- tui_active = 0;
+ tui_active = false;
tui_update_gdb_sizes ();
}
tui_disable ();
}
-#if 0
-/* Solaris <sys/termios.h> defines CTRL. */
-#ifndef CTRL
-#define CTRL(x) (x & ~0140)
-#endif
-
-#define FILEDES 2
-#define CHK(val, dft) (val<=0 ? dft : val)
-
-static void
-tui_reset (void)
-{
- struct termio mode;
-
- /* Reset the teletype mode bits to a sensible state.
- Copied tset.c. */
-#if defined (TIOCGETC)
- struct tchars tbuf;
-#endif /* TIOCGETC */
-#ifdef UCB_NTTY
- struct ltchars ltc;
-
- if (ldisc == NTTYDISC)
- {
- ioctl (FILEDES, TIOCGLTC, <c);
- ltc.t_suspc = CHK (ltc.t_suspc, CTRL ('Z'));
- ltc.t_dsuspc = CHK (ltc.t_dsuspc, CTRL ('Y'));
- ltc.t_rprntc = CHK (ltc.t_rprntc, CTRL ('R'));
- ltc.t_flushc = CHK (ltc.t_flushc, CTRL ('O'));
- ltc.t_werasc = CHK (ltc.t_werasc, CTRL ('W'));
- ltc.t_lnextc = CHK (ltc.t_lnextc, CTRL ('V'));
- ioctl (FILEDES, TIOCSLTC, <c);
- }
-#endif /* UCB_NTTY */
-#ifdef TIOCGETC
- ioctl (FILEDES, TIOCGETC, &tbuf);
- tbuf.t_intrc = CHK (tbuf.t_intrc, CTRL ('?'));
- tbuf.t_quitc = CHK (tbuf.t_quitc, CTRL ('\\'));
- tbuf.t_startc = CHK (tbuf.t_startc, CTRL ('Q'));
- tbuf.t_stopc = CHK (tbuf.t_stopc, CTRL ('S'));
- tbuf.t_eofc = CHK (tbuf.t_eofc, CTRL ('D'));
- /* brkc is left alone. */
- ioctl (FILEDES, TIOCSETC, &tbuf);
-#endif /* TIOCGETC */
- mode.sg_flags &= ~(RAW
-#ifdef CBREAK
- | CBREAK
-#endif /* CBREAK */
- | VTDELAY | ALLDELAY);
- mode.sg_flags |= XTABS | ECHO | CRMOD | ANYP;
-}
-#endif
-
-void
-tui_show_source ()
-{
- struct symtab_and_line cursal = get_current_source_symtab_and_line ();
-
- /* Make sure that the source window is displayed. */
- tui_add_win_to_layout (SRC_WIN);
-
- tui_update_source_windows_with_line (cursal.symtab, cursal.line);
- tui_update_locator_fullname (cursal.symtab);
-}
-
void
tui_show_assembly (struct gdbarch *gdbarch, CORE_ADDR addr)
{
+ tui_suppress_output suppress;
tui_add_win_to_layout (DISASSEM_WIN);
tui_update_source_windows_with_addr (gdbarch, addr);
}
bool
tui_is_window_visible (enum tui_win_type type)
{
- if (tui_active == 0)
+ if (!tui_active)
return false;
if (tui_win_list[type] == 0)
return tui_win_list[type]->is_visible ();
}
-int
+bool
tui_get_command_dimension (unsigned int *width,
unsigned int *height)
{
if (!tui_active || (TUI_CMD_WIN == NULL))
- {
- return 0;
- }
+ return false;
*width = TUI_CMD_WIN->width;
*height = TUI_CMD_WIN->height;
- return 1;
+ return true;
}
+void _initialize_tui ();
void
-_initialize_tui (void)
+_initialize_tui ()
{
struct cmd_list_element **tuicmd;
tuicmd = tui_get_cmd_list ();
add_cmd ("enable", class_tui, tui_enable_command,
- _("Enable TUI display mode."),
+ _("Enable TUI display mode.\n\
+Usage: tui enable"),
tuicmd);
add_cmd ("disable", class_tui, tui_disable_command,
- _("Disable TUI display mode."),
+ _("Disable TUI display mode.\n\
+Usage: tui disable"),
tuicmd);
}