📄 tui-win.c
字号:
/* TUI window generic functions. Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Contributed by Hewlett-Packard Company. This file is part of GDB. 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 (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *//* This module contains procedures for handling tui window functions like resize, scrolling, scrolling, changing focus, etc. Author: Susan B. Macchia */#include "defs.h"#include "command.h"#include "symtab.h"#include "breakpoint.h"#include "frame.h"#include "cli/cli-cmds.h"#include "top.h"#include "source.h"#include "tui/tui.h"#include "tui/tui-data.h"#include "tui/tui-wingeneral.h"#include "tui/tui-stack.h"#include "tui/tui-regs.h"#include "tui/tui-disasm.h"#include "tui/tui-source.h"#include "tui/tui-winsource.h"#include "tui/tui-windata.h"#include "gdb_curses.h"#include "gdb_string.h"#include <ctype.h>#include "readline/readline.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 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_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);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 *);/***************************************** 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"/***************************************** PUBLIC FUNCTIONS***************************************/#ifndef ACS_LRCORNER# define ACS_LRCORNER '+'#endif#ifndef ACS_LLCORNER# define ACS_LLCORNER '+'#endif#ifndef ACS_ULCORNER# define ACS_ULCORNER '+'#endif#ifndef ACS_URCORNER# define ACS_URCORNER '+'#endif#ifndef ACS_HLINE# define ACS_HLINE '-'#endif#ifndef ACS_VLINE# define ACS_VLINE '|'#endif/* Possible values for tui-border-kind variable. */static const char *tui_border_kind_enums[] = { "space", "ascii", "acs", NULL};/* Possible values for tui-border-mode and tui-active-border-mode. */static const char *tui_border_mode_enums[] = { "normal", "standout", "reverse", "half", "half-standout", "bold", "bold-standout", NULL};struct tui_translate{ const char *name; int value;};/* Translation table for border-mode variables. The list of values must be terminated by a NULL. After the NULL value, an entry defines the default. */struct tui_translate tui_border_mode_translate[] = { { "normal", A_NORMAL }, { "standout", A_STANDOUT }, { "reverse", A_REVERSE }, { "half", A_DIM }, { "half-standout", A_DIM | A_STANDOUT }, { "bold", A_BOLD }, { "bold-standout", A_BOLD | A_STANDOUT }, { 0, 0 }, { "normal", A_NORMAL }};/* Translation tables for border-kind, one for each border character (see wborder, border curses operations). -1 is used to indicate the ACS because ACS characters are determined at run time by curses (depends on terminal). */struct tui_translate tui_border_kind_translate_vline[] = { { "space", ' ' }, { "ascii", '|' }, { "acs", -1 }, { 0, 0 }, { "ascii", '|' }};struct tui_translate tui_border_kind_translate_hline[] = { { "space", ' ' }, { "ascii", '-' }, { "acs", -1 }, { 0, 0 }, { "ascii", '-' }};struct tui_translate tui_border_kind_translate_ulcorner[] = { { "space", ' ' }, { "ascii", '+' }, { "acs", -1 }, { 0, 0 }, { "ascii", '+' }};struct tui_translate tui_border_kind_translate_urcorner[] = { { "space", ' ' }, { "ascii", '+' }, { "acs", -1 }, { 0, 0 }, { "ascii", '+' }};struct tui_translate tui_border_kind_translate_llcorner[] = { { "space", ' ' }, { "ascii", '+' }, { "acs", -1 }, { 0, 0 }, { "ascii", '+' }};struct tui_translate tui_border_kind_translate_lrcorner[] = { { "space", ' ' }, { "ascii", '+' }, { "acs", -1 }, { 0, 0 }, { "ascii", '+' }};/* Tui configuration variables controlled with set/show command. */const char *tui_active_border_mode = "bold-standout";const char *tui_border_mode = "normal";const char *tui_border_kind = "acs";/* Tui internal configuration variables. These variables are updated by tui_update_variables to reflect the tui configuration variables. */chtype tui_border_vline;chtype tui_border_hline;chtype tui_border_ulcorner;chtype tui_border_urcorner;chtype tui_border_llcorner;chtype tui_border_lrcorner;int tui_border_attrs;int tui_active_border_attrs;/* Identify the item in the translation table. When the item is not recognized, use the default entry. */static struct tui_translate *translate (const char *name, struct tui_translate *table){ while (table->name) { if (name && strcmp (table->name, name) == 0) return table; table++; } /* Not found, return default entry. */ table++; return table;}/* Update the tui internal configuration according to gdb settings. Returns 1 if the configuration has changed and the screen should be redrawn. */inttui_update_variables (void){ int need_redraw = 0; struct tui_translate *entry; entry = translate (tui_border_mode, tui_border_mode_translate); if (tui_border_attrs != entry->value) { tui_border_attrs = entry->value; need_redraw = 1; } entry = translate (tui_active_border_mode, tui_border_mode_translate); if (tui_active_border_attrs != entry->value) { tui_active_border_attrs = entry->value; need_redraw = 1; } /* If one corner changes, all characters are changed. Only check the first one. The ACS characters are determined at run time by curses terminal management. */ entry = translate (tui_border_kind, tui_border_kind_translate_lrcorner); if (tui_border_lrcorner != (chtype) entry->value) { tui_border_lrcorner = (entry->value < 0) ? ACS_LRCORNER : entry->value; need_redraw = 1; } entry = translate (tui_border_kind, tui_border_kind_translate_llcorner); tui_border_llcorner = (entry->value < 0) ? ACS_LLCORNER : entry->value; entry = translate (tui_border_kind, tui_border_kind_translate_ulcorner); tui_border_ulcorner = (entry->value < 0) ? ACS_ULCORNER : entry->value; entry = translate (tui_border_kind, tui_border_kind_translate_urcorner); tui_border_urcorner = (entry->value < 0) ? ACS_URCORNER : entry->value; entry = translate (tui_border_kind, tui_border_kind_translate_hline); tui_border_hline = (entry->value < 0) ? ACS_HLINE : entry->value; entry = translate (tui_border_kind, tui_border_kind_translate_vline); tui_border_vline = (entry->value < 0) ? ACS_VLINE : entry->value; return need_redraw;}static voidset_tui_cmd (char *args, int from_tty){}static voidshow_tui_cmd (char *args, int from_tty){}static struct cmd_list_element *tuilist;static voidtui_command (char *args, int from_tty){ printf_unfiltered ("\"tui\" must be followed by the name of a " "tui command.\n"); help_list (tuilist, "tui ", -1, gdb_stdout);}struct cmd_list_element **tui_get_cmd_list (void){ if (tuilist == 0) add_prefix_cmd ("tui", class_tui, tui_command, "Text User Interface commands.", &tuilist, "tui ", 0, &cmdlist); return &tuilist;}/* Function to initialize gdb commands, for tui window manipulation. */void_initialize_tui_win (void){ struct cmd_list_element *c; static struct cmd_list_element *tui_setlist; static struct cmd_list_element *tui_showlist; /* Define the classes of commands. They will appear in the help list in the reverse of this order. */ add_prefix_cmd ("tui", class_tui, set_tui_cmd, "TUI configuration variables", &tui_setlist, "set tui ", 0/*allow-unknown*/, &setlist); add_prefix_cmd ("tui", class_tui, show_tui_cmd, "TUI configuration variables", &tui_showlist, "show tui ", 0/*allow-unknown*/, &showlist); 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"); add_com ("winheight", class_tui, tui_set_win_height_command, "Set the height of a specified window.\n\Usage: winheight <win_name> [+ | -] <#lines>\n\Window names are:\n\src : the source window\n\cmd : the command window\n\asm : the disassembly window\n\regs : the register display\n"); add_com_alias ("wh", "winheight", class_tui, 0); add_info ("win", tui_all_windows_info, "List of all displayed windows.\n"); add_com ("focus", class_tui, tui_set_focus_command, "Set focus to named window or next/prev window.\n\Usage: focus {<win> | next | prev}\n\Valid Window names are:\n\src : the source window\n\asm : the disassembly window\n\regs : the register display\n\cmd : the command window\n"); add_com_alias ("fs", "focus", class_tui, 0); add_com ("+", class_tui, tui_scroll_forward_command, "Scroll window forward.\nUsage: + [win] [n]\n"); add_com ("-", class_tui, tui_scroll_backward_command, "Scroll window backward.\nUsage: - [win] [n]\n"); add_com ("<", class_tui, tui_scroll_left_command, "Scroll window forward.\nUsage: < [win] [n]\n"); add_com (">", class_tui, tui_scroll_right_command, "Scroll window backward.\nUsage: > [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. */ c = add_set_enum_cmd ("border-kind", no_class, tui_border_kind_enums, &tui_border_kind, "Set the kind of border for TUI windows.\n" "This variable controls the border of TUI windows:\n" "space use a white space\n" "ascii use ascii characters + - | for the border\n" "acs use the Alternate Character Set\n", &tui_setlist); deprecated_add_show_from_set (c, &tui_showlist); c = add_set_enum_cmd ("border-mode", no_class, tui_border_mode_enums, &tui_border_mode, "Set the attribute mode to use for the TUI window borders.\n" "This variable controls the attributes to use for the window borders:\n" "normal normal display\n" "standout use highlight mode of terminal\n" "reverse use reverse video mode\n" "half use half bright\n" "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\n", &tui_setlist); deprecated_add_show_from_set (c, &tui_showlist); c = add_set_enum_cmd ("active-border-mode", no_class, tui_border_mode_enums, &tui_active_border_mode, "Set the attribute mode to use for the active TUI window border.\n" "This variable controls the attributes to use for the active window border:\n" "normal normal display\n" "standout use highlight mode of terminal\n" "reverse use reverse video mode\n" "half use half bright\n" "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\n", &tui_setlist); deprecated_add_show_from_set (c, &tui_showlist);}/* Update gdb's knowledge of the terminal size. */voidtui_update_gdb_sizes (void){ char cmd[50]; int screenheight, screenwidth; rl_get_screen_size (&screenheight, &screenwidth); /* Set to TUI command window dimension or use readline values. */ sprintf (cmd, "set width %d", tui_active ? TUI_CMD_WIN->generic.width : screenwidth); execute_command (cmd, 0); sprintf (cmd, "set height %d", tui_active ? TUI_CMD_WIN->generic.height : screenheight); execute_command (cmd, 0);}/* Set the logical focus to win_info. */voidtui_set_win_focus_to (struct tui_win_info * win_info){ if (win_info != NULL) { struct tui_win_info * win_with_focus = tui_win_with_focus (); if (win_with_focus != NULL && win_with_focus->generic.type != CMD_WIN) tui_unhighlight_win (win_with_focus); tui_set_win_with_focus (win_info); if (win_info->generic.type != CMD_WIN) tui_highlight_win (win_info); }}voidtui_scroll_forward (struct tui_win_info * win_to_scroll, int num_to_scroll){ if (win_to_scroll != TUI_CMD_WIN) { int _num_to_scroll = num_to_scroll; if (num_to_scroll == 0) _num_to_scroll = win_to_scroll->generic.height - 3; /* ** If we are scrolling the source or disassembly window, do a ** "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) tui_vertical_source_scroll (FORWARD_SCROLL, _num_to_scroll); else if (win_to_scroll == TUI_DISASM_WIN) tui_vertical_disassem_scroll (FORWARD_SCROLL, _num_to_scroll); else if (win_to_scroll == TUI_DATA_WIN) tui_vertical_data_scroll (FORWARD_SCROLL, _num_to_scroll); }}voidtui_scroll_backward (struct tui_win_info * win_to_scroll, int num_to_scroll){ if (win_to_scroll != TUI_CMD_WIN) { int _num_to_scroll = num_to_scroll; if (num_to_scroll == 0) _num_to_scroll = win_to_scroll->generic.height - 3; /* ** If we are scrolling the source or disassembly window, do a ** "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) tui_vertical_source_scroll (BACKWARD_SCROLL, _num_to_scroll); else if (win_to_scroll == TUI_DISASM_WIN) tui_vertical_disassem_scroll (BACKWARD_SCROLL, _num_to_scroll); else if (win_to_scroll == TUI_DATA_WIN) tui_vertical_data_scroll (BACKWARD_SCROLL, _num_to_scroll); }}voidtui_scroll_left (struct tui_win_info * win_to_scroll, int num_to_scroll){ if (win_to_scroll != TUI_CMD_WIN) { int _num_to_scroll = num_to_scroll; if (_num_to_scroll == 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -