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

📄 tuiwin.c

📁 gdb-6.0 linux 下的调试工具
💻 C
📖 第 1 页 / 共 3 页
字号:
/* TUI window generic functions.   Copyright 1998, 1999, 2000, 2001, 2002, 2003 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.h"#include "tuiData.h"#include "tuiGeneralWin.h"#include "tuiStack.h"#include "tuiRegs.h"#include "tuiDisassem.h"#include "tuiSource.h"#include "tuiSourceWin.h"#include "tuiDataWin.h"#ifdef HAVE_NCURSES_H       #include <ncurses.h>#else#ifdef HAVE_CURSES_H#include <curses.h>#endif#endif#include <string.h>#include <ctype.h>#include <readline/readline.h>/********************************* Static Local Decls********************************/static void _makeVisibleWithNewHeight (TuiWinInfoPtr);static void _makeInvisibleAndSetNewHeight (TuiWinInfoPtr, int);static TuiStatus _tuiAdjustWinHeights (TuiWinInfoPtr, int);static int _newHeightOk (TuiWinInfoPtr, int);static void _tuiSetTabWidth_command (char *, int);static void _tuiRefreshAll_command (char *, int);static void _tuiSetWinHeight_command (char *, int);static void _tuiXDBsetWinHeight_command (char *, int);static void _tuiAllWindowsInfo (char *, int);static void _tuiSetFocus_command (char *, int);static void _tuiScrollForward_command (char *, int);static void _tuiScrollBackward_command (char *, int);static void _tuiScrollLeft_command (char *, int);static void _tuiScrollRight_command (char *, int);static void _parseScrollingArgs (char *, TuiWinInfoPtr *, 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 (){  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){}/*   ** _initialize_tuiWin().   **        Function to initialize gdb commands, for tui window manipulation. */void_initialize_tuiWin (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_cmd ("tui", class_tui, NULL,	   "Text User Interface commands.",	   &cmdlist);  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, _tuiRefreshAll_command,           "Refresh the terminal display.\n");  if (xdb_commands)    add_com_alias ("U", "refresh", class_tui, 0);  add_com ("tabset", class_tui, _tuiSetTabWidth_command,           "Set the width (in characters) of tab stops.\n\Usage: tabset <n>\n");  add_com ("winheight", class_tui, _tuiSetWinHeight_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", _tuiAllWindowsInfo,            "List of all displayed windows.\n");  add_com ("focus", class_tui, _tuiSetFocus_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, _tuiScrollForward_command,           "Scroll window forward.\nUsage: + [win] [n]\n");  add_com ("-", class_tui, _tuiScrollBackward_command,           "Scroll window backward.\nUsage: - [win] [n]\n");  add_com ("<", class_tui, _tuiScrollLeft_command,           "Scroll window forward.\nUsage: < [win] [n]\n");  add_com (">", class_tui, _tuiScrollRight_command,           "Scroll window backward.\nUsage: > [win] [n]\n");  if (xdb_commands)    add_com ("w", class_xdb, _tuiXDBsetWinHeight_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);  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);  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);  add_show_from_set (c, &tui_showlist);}/* Update gdb's knowledge of the terminal size.  */voidtui_update_gdb_sizes (){  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 ? cmdWin->generic.width : screenwidth);  execute_command (cmd, 0);  sprintf (cmd, "set height %d",           tui_active ? cmdWin->generic.height : screenheight);  execute_command (cmd, 0);}/*   ** tuiSetWinFocusTo   **        Set the logical focus to winInfo */voidtuiSetWinFocusTo (TuiWinInfoPtr winInfo){  if (m_winPtrNotNull (winInfo))    {      TuiWinInfoPtr winWithFocus = tuiWinWithFocus ();      if (m_winPtrNotNull (winWithFocus) &&	  winWithFocus->generic.type != CMD_WIN)	unhighlightWin (winWithFocus);      tuiSetWinWithFocus (winInfo);      if (winInfo->generic.type != CMD_WIN)	highlightWin (winInfo);    }  return;}				/* tuiSetWinFocusTo *//*   ** tuiScrollForward(). */voidtuiScrollForward (TuiWinInfoPtr winToScroll, int numToScroll){  if (winToScroll != cmdWin)    {      int _numToScroll = numToScroll;      if (numToScroll == 0)	_numToScroll = winToScroll->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 winToScroll is the         ** command window do nothing since the term should handle it.       */      if (winToScroll == srcWin)	tuiVerticalSourceScroll (FORWARD_SCROLL, _numToScroll);      else if (winToScroll == disassemWin)	tuiVerticalDisassemScroll (FORWARD_SCROLL, _numToScroll);      else if (winToScroll == dataWin)	tuiVerticalDataScroll (FORWARD_SCROLL, _numToScroll);    }  return;}				/* tuiScrollForward *//*   ** tuiScrollBackward(). */voidtuiScrollBackward (TuiWinInfoPtr winToScroll, int numToScroll){  if (winToScroll != cmdWin)    {      int _numToScroll = numToScroll;      if (numToScroll == 0)	_numToScroll = winToScroll->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 winToScroll is the         ** command window do nothing since the term should handle it.       */      if (winToScroll == srcWin)	tuiVerticalSourceScroll (BACKWARD_SCROLL, _numToScroll);      else if (winToScroll == disassemWin)	tuiVerticalDisassemScroll (BACKWARD_SCROLL, _numToScroll);      else if (winToScroll == dataWin)	tuiVerticalDataScroll (BACKWARD_SCROLL, _numToScroll);    }  return;}				/* tuiScrollBackward *//*   ** tuiScrollLeft(). */voidtuiScrollLeft (TuiWinInfoPtr winToScroll, int numToScroll){  if (winToScroll != cmdWin)    {      int _numToScroll = numToScroll;      if (_numToScroll == 0)	_numToScroll = 1;      /*         ** 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 winToScroll is the         ** command window do nothing since the term should handle it.       */      if (winToScroll == srcWin || winToScroll == disassemWin)	tuiHorizontalSourceScroll (winToScroll, LEFT_SCROLL, _numToScroll);    }  return;}				/* tuiScrollLeft *//*   ** tuiScrollRight(). */voidtuiScrollRight (TuiWinInfoPtr winToScroll, int numToScroll){  if (winToScroll != cmdWin)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -