⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tui-win.c

📁 这个是LINUX下的GDB调度工具的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/* 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 + -