/* TUI window generic functions.
- Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006, 2007, 2008,
- 2009, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 1998-2015 Free Software Foundation, Inc.
Contributed by Hewlett-Packard Company.
#include "cli/cli-cmds.h"
#include "top.h"
#include "source.h"
+#include "event-loop.h"
#include "tui/tui.h"
+#include "tui/tui-io.h"
#include "tui/tui-data.h"
#include "tui/tui-wingeneral.h"
#include "tui/tui-stack.h"
#include "tui/tui-win.h"
#include "gdb_curses.h"
-
-#include "gdb_string.h"
#include <ctype.h>
#include "readline/readline.h"
static void tui_set_tab_width_command (char *, int);
static void tui_refresh_all_command (char *, int);
static void tui_set_win_height_command (char *, int);
-static void tui_xdb_set_win_height_command (char *, int);
static void tui_all_windows_info (char *, int);
static void tui_set_focus_command (char *, int);
static void tui_scroll_forward_command (char *, int);
#endif
/* Possible values for tui-border-kind variable. */
-static const char *tui_border_kind_enums[] = {
+static const char *const tui_border_kind_enums[] = {
"space",
"ascii",
"acs",
};
/* Possible values for tui-border-mode and tui-active-border-mode. */
-static const char *tui_border_mode_enums[] = {
+static const char *const tui_border_mode_enums[] = {
"normal",
"standout",
"reverse",
{
printf_unfiltered (_("\"tui\" must be followed by the name of a "
"tui command.\n"));
- help_list (tuilist, "tui ", -1, gdb_stdout);
+ help_list (tuilist, "tui ", all_commands, gdb_stdout);
}
struct cmd_list_element **
return &tuilist;
}
+/* The set_func hook of "set tui ..." commands that affect the window
+ borders on the TUI display. */
+void
+tui_set_var_cmd (char *null_args, int from_tty, struct cmd_list_element *c)
+{
+ if (tui_update_variables () && tui_active)
+ tui_rehighlight_all ();
+}
+
/* Function to initialize gdb commands, for tui window
manipulation. */
add_com ("refresh", class_tui, tui_refresh_all_command,
_("Refresh the terminal display.\n"));
- if (xdb_commands)
- add_com_alias ("U", "refresh", class_tui, 0);
add_com ("tabset", class_tui, tui_set_tab_width_command, _("\
Set the width (in characters) of tab stops.\n\
Usage: tabset <n>\n"));
Scroll window backward.\n\
Usage: - [win] [n]\n"));
add_com ("<", class_tui, tui_scroll_left_command, _("\
-Scroll window forward.\n\
+Scroll window text to the left.\n\
Usage: < [win] [n]\n"));
add_com (">", class_tui, tui_scroll_right_command, _("\
-Scroll window backward.\n\
+Scroll window text to the right.\n\
Usage: > [win] [n]\n"));
- if (xdb_commands)
- add_com ("w", class_xdb, tui_xdb_set_win_height_command, _("\
-XDB compatibility command for setting the height of a command window.\n\
-Usage: w <#lines>\n"));
/* Define the tui control variables. */
add_setshow_enum_cmd ("border-kind", no_class, tui_border_kind_enums,
space use a white space\n\
ascii use ascii characters + - | for the border\n\
acs use the Alternate Character Set"),
- NULL,
+ tui_set_var_cmd,
show_tui_border_kind,
&tui_setlist, &tui_showlist);
half-standout use half bright and standout mode\n\
bold use extra bright or bold\n\
bold-standout use extra bright or bold with standout mode"),
- NULL,
+ tui_set_var_cmd,
show_tui_border_mode,
&tui_setlist, &tui_showlist);
half-standout use half bright and standout mode\n\
bold use extra bright or bold\n\
bold-standout use extra bright or bold with standout mode"),
- NULL,
+ tui_set_var_cmd,
show_tui_active_border_mode,
&tui_setlist, &tui_showlist);
}
void
tui_update_gdb_sizes (void)
{
- char cmd[50];
-
- /* Set to TUI command window dimension or use readline values. */
- sprintf (cmd, "set width %d",
- tui_active ? TUI_CMD_WIN->generic.width : tui_term_width());
- execute_command (cmd, 0);
- sprintf (cmd, "set height %d",
- tui_active ? TUI_CMD_WIN->generic.height : tui_term_height());
- execute_command (cmd, 0);
+ int width, height;
+
+ if (tui_active)
+ {
+ width = TUI_CMD_WIN->generic.width;
+ height = TUI_CMD_WIN->generic.height;
+ }
+ else
+ {
+ width = tui_term_width ();
+ height = tui_term_height ();
+ }
+
+ set_screen_width_and_height (width, height);
}
void
tui_refresh_all_win (void)
{
- enum tui_win_type type;
+ int type;
clearok (curscr, TRUE);
tui_refresh_all (tui_win_list);
tui_show_locator_content ();
}
+void
+tui_rehighlight_all (void)
+{
+ int type;
+
+ for (type = SRC_WIN; type < MAX_MAJOR_WINDOWS; type++)
+ tui_check_and_display_highlight_if_needed (tui_win_list[type]);
+}
-/* Resize all the windows based on the the terminal size. This
- function gets called from within the readline sinwinch handler. */
+/* Resize all the windows based on the terminal size. This function
+ gets called from within the readline sinwinch handler. */
void
tui_resize_all (void)
{
struct tui_win_info *first_win;
struct tui_win_info *second_win;
struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
- enum tui_win_type win_type;
+ int win_type;
int new_height, split_diff, cmd_split_diff, num_wins_displayed = 2;
#ifdef HAVE_RESIZE_TERM
if (height_diff < 0)
cmd_split_diff--;
else
- cmd_split_diff++;
- }
+ cmd_split_diff++;
+ }
/* Now adjust each window. */
- clear ();
+ /* erase + clearok are used instead of a straightforward clear as
+ AIX 5.3 does not define clear. */
+ erase ();
+ clearok (curscr, TRUE);
refresh ();
switch (cur_layout)
- {
+ {
case SRC_COMMAND:
case DISASSEM_COMMAND:
first_win = (struct tui_win_info *) (tui_source_windows ())->list[0];
}
#ifdef SIGWINCH
-/* SIGWINCH signal handler for the tui. This signal handler is always
- called, even when the readline package clears signals because it is
- set as the old_sigwinch() (TUI only). */
+/* Token for use by TUI's asynchronous SIGWINCH handler. */
+static struct async_signal_handler *tui_sigwinch_token;
+
+/* TUI's SIGWINCH signal handler. */
static void
tui_sigwinch_handler (int signal)
{
- /* Say that a resize was done so that the readline can do it later
- when appropriate. */
+ mark_async_signal_handler (tui_sigwinch_token);
tui_set_win_resized_to (TRUE);
}
+
+/* Callback for asynchronously resizing TUI following a SIGWINCH signal. */
+static void
+tui_async_resize_screen (gdb_client_data arg)
+{
+ rl_resize_terminal ();
+
+ if (!tui_active)
+ {
+ int screen_height, screen_width;
+
+ rl_get_screen_size (&screen_height, &screen_width);
+ set_screen_width_and_height (screen_width, screen_height);
+
+ /* win_resized is left set so that the next call to tui_enable()
+ resizes the TUI windows. */
+ }
+ else
+ {
+ tui_resize_all ();
+ tui_refresh_all_win ();
+ tui_update_gdb_sizes ();
+ tui_set_win_resized_to (FALSE);
+ tui_redisplay_readline ();
+ }
+}
#endif
-/* Initializes SIGWINCH signal handler for the tui. */
+/* Initialize TUI's SIGWINCH signal handler. Note that the handler is not
+ uninstalled when we exit TUI, so the handler should not assume that TUI is
+ always active. */
void
tui_initialize_win (void)
{
#ifdef SIGWINCH
+ tui_sigwinch_token
+ = create_async_signal_handler (tui_async_resize_screen, NULL);
+
+ {
#ifdef HAVE_SIGACTION
- struct sigaction old_winch;
+ struct sigaction old_winch;
- memset (&old_winch, 0, sizeof (old_winch));
- old_winch.sa_handler = &tui_sigwinch_handler;
- sigaction (SIGWINCH, &old_winch, NULL);
+ memset (&old_winch, 0, sizeof (old_winch));
+ old_winch.sa_handler = &tui_sigwinch_handler;
+#ifdef SA_RESTART
+ old_winch.sa_flags = SA_RESTART;
+#endif
+ sigaction (SIGWINCH, &old_winch, NULL);
#else
- signal (SIGWINCH, &tui_sigwinch_handler);
+ signal (SIGWINCH, &tui_sigwinch_handler);
#endif
+ }
#endif
}
static void
tui_all_windows_info (char *arg, int from_tty)
{
- enum tui_win_type type;
+ int type;
struct tui_win_info *win_with_focus = tui_win_with_focus ();
for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++)
}
-/* Set the height of the specified window. */
+/* Set the tab width of the specified window. */
static void
tui_set_tab_width_command (char *arg, int from_tty)
{
ts = atoi (arg);
if (ts > 0)
- tui_set_default_tab_len (ts);
+ {
+ tui_set_default_tab_len (ts);
+ /* We don't really change the height of any windows, but
+ calling these 2 functions causes a complete regeneration
+ and redisplay of the window's contents, which will take
+ the new tab width into account. */
+ if (tui_win_list[SRC_WIN]
+ && tui_win_list[SRC_WIN]->generic.is_visible)
+ {
+ make_invisible_and_set_new_height (TUI_SRC_WIN,
+ TUI_SRC_WIN->generic.height);
+ make_visible_with_new_height (TUI_SRC_WIN);
+ }
+ if (tui_win_list[DISASSEM_WIN]
+ && tui_win_list[DISASSEM_WIN]->generic.is_visible)
+ {
+ make_invisible_and_set_new_height (TUI_DISASM_WIN,
+ TUI_DISASM_WIN->generic.height);
+ make_visible_with_new_height (TUI_DISASM_WIN);
+ }
+ }
else
warning (_("Tab widths greater than 0 must be specified."));
}
tui_set_win_height (arg, from_tty);
}
-
-/* XDB Compatibility command for setting the window height. This will
- increase or decrease the command window by the specified
- amount. */
-static void
-tui_xdb_set_win_height (char *arg, int from_tty)
-{
- /* Make sure the curses mode is enabled. */
- tui_enable ();
- if (arg != (char *) NULL)
- {
- int input_no = atoi (arg);
-
- if (input_no > 0)
- { /* Add 1 for the locator. */
- int new_height = tui_term_height () - (input_no + 1);
-
- if (!new_height_ok (tui_win_list[CMD_WIN], new_height)
- || tui_adjust_win_heights (tui_win_list[CMD_WIN],
- new_height) == TUI_FAILURE)
- warning (_("Invalid window height specified.\n%s"),
- XDBWIN_HEIGHT_USAGE);
- }
- else
- warning (_("Invalid window height specified.\n%s"),
- XDBWIN_HEIGHT_USAGE);
- }
- else
- warning (_("Invalid window height specified.\n%s"), XDBWIN_HEIGHT_USAGE);
-}
-
-/* Set the height of the specified window, with va_list. */
-static void
-tui_xdb_set_win_height_command (char *arg, int from_tty)
-{
- tui_xdb_set_win_height (arg, from_tty);
-}
-
-
/* Function to adjust all window heights around the primary. */
static enum tui_status
tui_adjust_win_heights (struct tui_win_info *primary_win_info,
struct frame_info *frame = deprecated_safe_get_selected_frame ();
struct gdbarch *gdbarch = get_frame_arch (frame);
- s = find_pc_symtab (get_frame_pc (frame));
+ s = find_pc_line_symtab (get_frame_pc (frame));
if (win_info->generic.type == SRC_WIN)
{
line.loa = LOA_LINE;
;
if (*buf_ptr != (char) 0)
- wname = buf_ptr;
+ {
+ wname = buf_ptr;
+
+ /* Validate the window name. */
+ for (i = 0; i < strlen (wname); i++)
+ wname[i] = toupper (wname[i]);
+ }
else
wname = "?";
- /* Validate the window name. */
- for (i = 0; i < strlen (wname); i++)
- wname[i] = toupper (wname[i]);
*win_to_scroll = tui_partial_win_by_name (wname);
if (*win_to_scroll == (struct tui_win_info *) NULL