/* TUI window generic functions.
- Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006, 2007
- Free Software Foundation, Inc.
+ Copyright (C) 1998-2004, 2006-2012 Free Software Foundation, Inc.
Contributed by Hewlett-Packard Company.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* This module contains procedures for handling tui window functions
like resize, scrolling, scrolling, changing focus, etc.
#include "tui/tui-source.h"
#include "tui/tui-winsource.h"
#include "tui/tui-windata.h"
+#include "tui/tui-win.h"
#include "gdb_curses.h"
#include <ctype.h>
#include "readline/readline.h"
+#include <signal.h>
+
/*******************************
** Static Local Decls
********************************/
static void make_visible_with_new_height (struct tui_win_info *);
-static void make_invisible_and_set_new_height (struct tui_win_info *, int);
-static enum tui_status tui_adjust_win_heights (struct tui_win_info *, int);
+static void make_invisible_and_set_new_height (struct tui_win_info *,
+ int);
+static enum tui_status tui_adjust_win_heights (struct tui_win_info *,
+ int);
static int new_height_ok (struct tui_win_info *, int);
static void tui_set_tab_width_command (char *, int);
static void tui_refresh_all_command (char *, int);
static void tui_scroll_backward_command (char *, int);
static void tui_scroll_left_command (char *, int);
static void tui_scroll_right_command (char *, int);
-static void parse_scrolling_args (char *, struct tui_win_info **, int *);
+static void parse_scrolling_args (char *,
+ struct tui_win_info **,
+ int *);
/***************************************
** DEFINITIONS
***************************************/
-#define WIN_HEIGHT_USAGE "Usage: winheight <win_name> [+ | -] <#lines>\n"
-#define XDBWIN_HEIGHT_USAGE "Usage: w <#lines>\n"
-#define FOCUS_USAGE "Usage: focus {<win> | next | prev}\n"
+#define WIN_HEIGHT_USAGE "Usage: winheight <win_name> [+ | -] <#lines>\n"
+#define XDBWIN_HEIGHT_USAGE "Usage: w <#lines>\n"
+#define FOCUS_USAGE "Usage: focus {<win> | next | prev}\n"
/***************************************
** PUBLIC FUNCTIONS
#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",
/* Tui configuration variables controlled with set/show command. */
const char *tui_active_border_mode = "bold-standout";
static void
-show_tui_active_border_mode (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
+show_tui_active_border_mode (struct ui_file *file,
+ int from_tty,
+ struct cmd_list_element *c,
+ const char *value)
{
fprintf_filtered (file, _("\
The attribute mode to use for the active TUI window border is \"%s\".\n"),
const char *tui_border_mode = "normal";
static void
-show_tui_border_mode (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
+show_tui_border_mode (struct ui_file *file,
+ int from_tty,
+ struct cmd_list_element *c,
+ const char *value)
{
fprintf_filtered (file, _("\
The attribute mode to use for the TUI window borders is \"%s\".\n"),
const char *tui_border_kind = "acs";
static void
-show_tui_border_kind (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
+show_tui_border_kind (struct ui_file *file,
+ int from_tty,
+ struct cmd_list_element *c,
+ const char *value)
{
fprintf_filtered (file, _("The kind of border for TUI windows is \"%s\".\n"),
value);
return &tuilist;
}
-/* Function to initialize gdb commands, for tui window manipulation. */
+/* Function to initialize gdb commands, for tui window
+ manipulation. */
+
+/* Provide a prototype to silence -Wmissing-prototypes. */
+extern initialize_file_ftype _initialize_tui_win;
+
void
_initialize_tui_win (void)
{
- struct cmd_list_element *c;
static struct cmd_list_element *tui_setlist;
static struct cmd_list_element *tui_showlist;
void
-tui_scroll_forward (struct tui_win_info *win_to_scroll, int num_to_scroll)
+tui_scroll_forward (struct tui_win_info *win_to_scroll,
+ int num_to_scroll)
{
if (win_to_scroll != TUI_CMD_WIN)
{
}
void
-tui_scroll_backward (struct tui_win_info *win_to_scroll, int num_to_scroll)
+tui_scroll_backward (struct tui_win_info *win_to_scroll,
+ int num_to_scroll)
{
if (win_to_scroll != TUI_CMD_WIN)
{
void
-tui_scroll_left (struct tui_win_info *win_to_scroll, int num_to_scroll)
+tui_scroll_left (struct tui_win_info *win_to_scroll,
+ int num_to_scroll)
{
if (win_to_scroll != TUI_CMD_WIN)
{
"psuedo" scroll since not all of the source is in memory,
only what is in the viewport. If win_to_scroll is the command
window do nothing since the term should handle it. */
- if (win_to_scroll == TUI_SRC_WIN || win_to_scroll == TUI_DISASM_WIN)
- tui_horizontal_source_scroll (win_to_scroll, LEFT_SCROLL, _num_to_scroll);
+ if (win_to_scroll == TUI_SRC_WIN
+ || win_to_scroll == TUI_DISASM_WIN)
+ tui_horizontal_source_scroll (win_to_scroll, LEFT_SCROLL,
+ _num_to_scroll);
}
}
void
-tui_scroll_right (struct tui_win_info *win_to_scroll, int num_to_scroll)
+tui_scroll_right (struct tui_win_info *win_to_scroll,
+ int num_to_scroll)
{
if (win_to_scroll != TUI_CMD_WIN)
{
"psuedo" scroll since not all of the source is in memory,
only what is in the viewport. If win_to_scroll is the command
window do nothing since the term should handle it. */
- if (win_to_scroll == TUI_SRC_WIN || win_to_scroll == TUI_DISASM_WIN)
- tui_horizontal_source_scroll (win_to_scroll, RIGHT_SCROLL, _num_to_scroll);
+ if (win_to_scroll == TUI_SRC_WIN
+ || win_to_scroll == TUI_DISASM_WIN)
+ tui_horizontal_source_scroll (win_to_scroll, RIGHT_SCROLL,
+ _num_to_scroll);
}
}
tui_refresh_all (tui_win_list);
for (type = SRC_WIN; type < MAX_MAJOR_WINDOWS; type++)
{
- if (tui_win_list[type] && tui_win_list[type]->generic.is_visible)
+ if (tui_win_list[type]
+ && tui_win_list[type]->generic.is_visible)
{
switch (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)
{
tui_update_gdb_sizes ();
tui_set_term_height_to (screenheight);
tui_set_term_width_to (screenwidth);
- if (cur_layout == SRC_DISASSEM_COMMAND ||
- cur_layout == SRC_DATA_COMMAND || cur_layout == DISASSEM_DATA_COMMAND)
+ if (cur_layout == SRC_DISASSEM_COMMAND
+ || cur_layout == SRC_DATA_COMMAND
+ || cur_layout == DISASSEM_DATA_COMMAND)
num_wins_displayed++;
split_diff = height_diff / num_wins_displayed;
cmd_split_diff = split_diff;
else
new_height = first_win->generic.height + split_diff;
+ locator->origin.y = new_height + 1;
make_invisible_and_set_new_height (first_win, new_height);
TUI_CMD_WIN->generic.origin.y = locator->origin.y + 1;
TUI_CMD_WIN->generic.width += width_diff;
{
first_win = TUI_DATA_WIN;
first_win->generic.width += width_diff;
- second_win = (struct tui_win_info *) (tui_source_windows ())->list[0];
+ second_win = (struct tui_win_info *)
+ (tui_source_windows ())->list[0];
second_win->generic.width += width_diff;
}
/* Change the first window's height/width. */
/* Change the command window's height/width. */
TUI_CMD_WIN->generic.origin.y = locator->origin.y + 1;
- make_invisible_and_set_new_height (
- TUI_CMD_WIN, TUI_CMD_WIN->generic.height + cmd_split_diff);
+ make_invisible_and_set_new_height (TUI_CMD_WIN,
+ TUI_CMD_WIN->generic.height
+ + cmd_split_diff);
make_visible_with_new_height (first_win);
make_visible_with_new_height (second_win);
make_visible_with_new_height (TUI_CMD_WIN);
they get created again when called for with the new size. */
for (win_type = SRC_WIN; (win_type < MAX_MAJOR_WINDOWS); win_type++)
{
- if (win_type != CMD_WIN && (tui_win_list[win_type] != NULL)
+ if (win_type != CMD_WIN
+ && (tui_win_list[win_type] != NULL)
&& !tui_win_list[win_type]->generic.is_visible)
{
tui_free_window (tui_win_list[win_type]);
tui_win_list[win_type] = (struct tui_win_info *) NULL;
}
}
- tui_set_win_resized_to (TRUE);
/* Turn keypad back on, unless focus is in the command
window. */
if (win_with_focus != TUI_CMD_WIN)
}
}
-
+#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). */
-void
+static void
tui_sigwinch_handler (int signal)
{
/* Say that a resize was done so that the readline can do it later
when appropriate. */
tui_set_win_resized_to (TRUE);
}
+#endif
+/* Initializes SIGWINCH signal handler for the tui. */
+void
+tui_initialize_win (void)
+{
+#ifdef SIGWINCH
+#ifdef HAVE_SIGACTION
+ struct sigaction old_winch;
+
+ memset (&old_winch, 0, sizeof (old_winch));
+ old_winch.sa_handler = &tui_sigwinch_handler;
+ sigaction (SIGWINCH, &old_winch, NULL);
+#else
+ signal (SIGWINCH, &tui_sigwinch_handler);
+#endif
+#endif
+}
/*************************
else
win_info = tui_partial_win_by_name (buf_ptr);
- if (win_info == (struct tui_win_info *) NULL || !win_info->generic.is_visible)
+ if (win_info == (struct tui_win_info *) NULL
+ || !win_info->generic.is_visible)
warning (_("Invalid window specified. \n\
The window name specified must be valid and visible.\n"));
else
tui_refresh_data_win ();
xfree (buf_ptr);
printf_filtered (_("Focus set to %s window.\n"),
- tui_win_name ((struct tui_gen_win_info *) tui_win_with_focus ()));
+ tui_win_name ((struct tui_gen_win_info *)
+ tui_win_with_focus ()));
}
else
warning (_("Incorrect Number of Arguments.\n%s"), FOCUS_USAGE);
struct tui_win_info *win_with_focus = tui_win_with_focus ();
for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++)
- if (tui_win_list[type] && tui_win_list[type]->generic.is_visible)
+ if (tui_win_list[type]
+ && tui_win_list[type]->generic.is_visible)
{
if (win_with_focus == tui_win_list[type])
printf_filtered (" %s\t(%d lines) <has focus>\n",
wname[i] = toupper (wname[i]);
win_info = tui_partial_win_by_name (wname);
- if (win_info == (struct tui_win_info *) NULL || !win_info->generic.is_visible)
+ if (win_info == (struct tui_win_info *) NULL
+ || !win_info->generic.is_visible)
warning (_("Invalid window specified. \n\
The window name specified must be valid and visible.\n"));
else
{ /* 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)
+ 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);
}
/* Function to adjust all window heights around the primary. */
static enum tui_status
-tui_adjust_win_heights (struct tui_win_info *primary_win_info, int new_height)
+tui_adjust_win_heights (struct tui_win_info *primary_win_info,
+ int new_height)
{
enum tui_status status = TUI_FAILURE;
enum tui_layout_type cur_layout = tui_current_layout ();
diff = (new_height - primary_win_info->generic.height) * (-1);
- if (cur_layout == SRC_COMMAND || cur_layout == DISASSEM_COMMAND)
+ if (cur_layout == SRC_COMMAND
+ || cur_layout == DISASSEM_COMMAND)
{
struct tui_win_info *src_win_info;
first_win,
first_win->generic.height + first_split_diff);
second_win->generic.origin.y = first_win->generic.height - 1;
- make_invisible_and_set_new_height (
- second_win, second_win->generic.height + second_split_diff);
+ make_invisible_and_set_new_height (second_win,
+ second_win->generic.height
+ + second_split_diff);
TUI_CMD_WIN->generic.origin.y = locator->origin.y + 1;
make_invisible_and_set_new_height (TUI_CMD_WIN, new_height);
}
if ((TUI_CMD_WIN->generic.height + diff) < 1)
{
int i;
+
for (i = TUI_CMD_WIN->generic.height + diff;
(i < 1); i++)
if (primary_win_info == first_win)
if ((TUI_CMD_WIN->generic.height + diff) < 1)
make_invisible_and_set_new_height (TUI_CMD_WIN, 1);
else
- make_invisible_and_set_new_height (
- TUI_CMD_WIN, TUI_CMD_WIN->generic.height + diff);
+ make_invisible_and_set_new_height (TUI_CMD_WIN,
+ TUI_CMD_WIN->generic.height + diff);
}
make_visible_with_new_height (TUI_CMD_WIN);
make_visible_with_new_height (second_win);
with the targer) invisible, and set the new height and
location. */
static void
-make_invisible_and_set_new_height (struct tui_win_info *win_info, int height)
+make_invisible_and_set_new_height (struct tui_win_info *win_info,
+ int height)
{
int i;
struct tui_gen_win_info *gen_win_info;
/* Delete all data item windows. */
for (i = 0; i < win_info->generic.content_size; i++)
{
- gen_win_info = (struct tui_gen_win_info *) & ((struct tui_win_element *)
- win_info->generic.content[i])->which_element.data_window;
+ gen_win_info = (struct tui_gen_win_info *)
+ &((struct tui_win_element *)
+ win_info->generic.content[i])->which_element.data_window;
tui_delete_win (gen_win_info->handle);
gen_win_info->handle = (WINDOW *) NULL;
}
tui_make_visible (win_info->detail.source_info.execution_info);
if (win_info->generic.content != NULL)
{
+ struct gdbarch *gdbarch = win_info->detail.source_info.gdbarch;
struct tui_line_or_address line_or_addr;
struct symtab_and_line cursal
= get_current_source_symtab_and_line ();
line_or_addr = win_info->detail.source_info.start_line_or_addr;
tui_free_win_content (&win_info->generic);
- tui_update_source_window (win_info, cursal.symtab, line_or_addr, TRUE);
+ tui_update_source_window (win_info, gdbarch,
+ cursal.symtab, line_or_addr, TRUE);
}
else if (deprecated_safe_get_selected_frame () != NULL)
{
struct tui_line_or_address line;
- struct symtab_and_line cursal = get_current_source_symtab_and_line ();
+ struct symtab_and_line cursal
+ = get_current_source_symtab_and_line ();
struct frame_info *frame = deprecated_safe_get_selected_frame ();
+ struct gdbarch *gdbarch = get_frame_arch (frame);
s = find_pc_symtab (get_frame_pc (frame));
if (win_info->generic.type == SRC_WIN)
line.loa = LOA_ADDRESS;
find_line_pc (s, cursal.line, &line.u.addr);
}
- tui_update_source_window (win_info, s, line, TRUE);
+ tui_update_source_window (win_info, gdbarch, s, line, TRUE);
}
if (tui_win_has_locator (win_info))
{
case CMD_WIN:
win_info->detail.command_info.cur_line = 0;
win_info->detail.command_info.curch = 0;
+#ifdef HAVE_WRESIZE
+ wresize (TUI_CMD_WIN->generic.handle,
+ TUI_CMD_WIN->generic.height,
+ TUI_CMD_WIN->generic.width);
+#endif
+ mvwin (TUI_CMD_WIN->generic.handle,
+ TUI_CMD_WIN->generic.origin.y,
+ TUI_CMD_WIN->generic.origin.x);
wmove (win_info->generic.handle,
win_info->detail.command_info.cur_line,
win_info->detail.command_info.curch);
static int
-new_height_ok (struct tui_win_info *primary_win_info, int new_height)
+new_height_ok (struct tui_win_info *primary_win_info,
+ int new_height)
{
int ok = (new_height < tui_term_height ());
diff = (new_height - primary_win_info->generic.height) * (-1);
if (cur_layout == SRC_COMMAND || cur_layout == DISASSEM_COMMAND)
{
- ok = ((primary_win_info->generic.type == CMD_WIN &&
- new_height <= (tui_term_height () - 4) &&
- new_height >= MIN_CMD_WIN_HEIGHT) ||
- (primary_win_info->generic.type != CMD_WIN &&
- new_height <= (tui_term_height () - 2) &&
- new_height >= MIN_WIN_HEIGHT));
+ ok = ((primary_win_info->generic.type == CMD_WIN
+ && new_height <= (tui_term_height () - 4)
+ && new_height >= MIN_CMD_WIN_HEIGHT)
+ || (primary_win_info->generic.type != CMD_WIN
+ && new_height <= (tui_term_height () - 2)
+ && new_height >= MIN_WIN_HEIGHT));
if (ok)
{ /* Check the total height. */
struct tui_win_info *win_info;
/* Locator included since first & second win share a line. */
ok = ((first_win->generic.height +
second_win->generic.height + diff) >=
- (MIN_WIN_HEIGHT * 2) &&
- new_height >= MIN_CMD_WIN_HEIGHT);
+ (MIN_WIN_HEIGHT * 2)
+ && new_height >= MIN_CMD_WIN_HEIGHT);
if (ok)
{
- total_height = new_height + (first_win->generic.height +
- second_win->generic.height + diff);
+ total_height = new_height +
+ (first_win->generic.height +
+ second_win->generic.height + diff);
min_height = MIN_CMD_WIN_HEIGHT;
}
}
/* Now make sure that the proposed total height doesn't
exceed the old total height. */
if (ok)
- ok = (new_height >= min_height && total_height <= cur_total_height);
+ ok = (new_height >= min_height
+ && total_height <= cur_total_height);
}
}
static void
-parse_scrolling_args (char *arg, struct tui_win_info **win_to_scroll,
+parse_scrolling_args (char *arg,
+ struct tui_win_info **win_to_scroll,
int *num_to_scroll)
{
if (num_to_scroll)
;
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 ||
- !(*win_to_scroll)->generic.is_visible)
+ if (*win_to_scroll == (struct tui_win_info *) NULL
+ || !(*win_to_scroll)->generic.is_visible)
error (_("Invalid window specified. \n\
The window name specified must be valid and visible.\n"));
else if (*win_to_scroll == TUI_CMD_WIN)