aboutsummaryrefslogtreecommitdiff
path: root/gdb/tui/tui.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/tui/tui.c')
-rw-r--r--gdb/tui/tui.c112
1 files changed, 93 insertions, 19 deletions
diff --git a/gdb/tui/tui.c b/gdb/tui/tui.c
index ae22249..370afb4 100644
--- a/gdb/tui/tui.c
+++ b/gdb/tui/tui.c
@@ -37,6 +37,7 @@
#include "tuiLayout.h"
#include "tuiIO.h"
#include "tuiRegs.h"
+#include "tuiStack.h"
#include "tuiWin.h"
#include "readline/readline.h"
#include "target.h"
@@ -76,6 +77,91 @@ tui_switch_mode (void)
return 0;
}
+/* 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). */
+static int
+tui_change_windows (void)
+{
+ if (!tui_active)
+ tui_switch_mode ();
+
+ if (tui_active)
+ {
+ TuiLayoutType new_layout;
+ TuiRegisterDisplayType regs_type = TUI_UNDEFINED_REGS;
+
+ new_layout = currentLayout ();
+
+ /* 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;
+ }
+ tuiSetLayout (new_layout, regs_type);
+ }
+ return 0;
+}
+
+
+/* Delete the second TUI window to only show one. */
+static int
+tui_delete_other_windows (void)
+{
+ if (!tui_active)
+ tui_switch_mode ();
+
+ if (tui_active)
+ {
+ TuiLayoutType new_layout;
+ TuiRegisterDisplayType regs_type = TUI_UNDEFINED_REGS;
+
+ new_layout = currentLayout ();
+
+ /* 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;
+ }
+ tuiSetLayout (new_layout, regs_type);
+ }
+ return 0;
+}
+
/* Initialize readline and configure the keymap for the switching
key shortcut. */
void
@@ -87,6 +173,8 @@ tui_initialize_readline ()
rl_bind_key_in_map ('a', tui_switch_mode, emacs_ctlx_keymap);
rl_bind_key_in_map ('A', tui_switch_mode, emacs_ctlx_keymap);
rl_bind_key_in_map (CTRL ('A'), tui_switch_mode, emacs_ctlx_keymap);
+ rl_bind_key_in_map ('1', tui_delete_other_windows, emacs_ctlx_keymap);
+ rl_bind_key_in_map ('2', tui_change_windows, emacs_ctlx_keymap);
}
/* Enter in the tui mode (curses).
@@ -108,8 +196,8 @@ tui_enable (void)
w = initscr ();
- cbreak();
- noecho();
+ cbreak ();
+ noecho ();
/*timeout (1);*/
nodelay(w, FALSE);
nl();
@@ -122,6 +210,7 @@ tui_enable (void)
tuiSetLocatorContent (0);
showLayout (SRC_COMMAND);
tuiSetWinFocusTo (srcWin);
+ keypad (cmdWin->generic.handle, TRUE);
wrefresh (cmdWin->generic.handle);
tui_finish_init = 0;
}
@@ -136,6 +225,8 @@ tui_enable (void)
/* Install the TUI specific hooks. */
tui_install_hooks ();
+ tui_update_variables ();
+
tui_setup_io (1);
tui_version = 1;
@@ -213,23 +304,6 @@ strcat_to_buf (char *buf, int buflen, char *itemToAdd)
else
strncat (buf, itemToAdd, (buflen - strlen (buf)));
}
-
- return;
-} /* strcat_to_buf */
-
-/* VARARGS */
-void
-strcat_to_buf_with_fmt (char *buf, int bufLen, char *format, ...)
-{
- char *linebuffer;
- struct cleanup *old_cleanups;
- va_list args;
- va_start (args, format);
- vasprintf (&linebuffer, format, args);
- old_cleanups = make_cleanup (xfree, linebuffer);
- strcat_to_buf (buf, bufLen, linebuffer);
- do_cleanups (old_cleanups);
- va_end (args);
}
#if 0