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

📄 tui.c

📁 gdb-6.0 linux 下的调试工具
💻 C
📖 第 1 页 / 共 2 页
字号:
}/* Initialize readline and configure the keymap for the switching   key shortcut.  */voidtui_initialize_readline (){  int i;  Keymap tui_ctlx_keymap;  rl_initialize ();  rl_add_defun ("tui-switch-mode", tui_rl_switch_mode, -1);  rl_add_defun ("gdb-command", tui_rl_command_key, -1);  rl_add_defun ("next-keymap", tui_rl_next_keymap, -1);  tui_keymap = rl_make_bare_keymap ();  tui_ctlx_keymap = rl_make_bare_keymap ();  tui_readline_standard_keymap = rl_get_keymap ();  for (i = 0; tui_commands[i].cmd; i++)    rl_bind_key_in_map (tui_commands[i].key, tui_rl_command_key, tui_keymap);  rl_generic_bind (ISKMAP, "\\C-x", (char*) tui_ctlx_keymap, tui_keymap);  /* Bind all other keys to tui_rl_command_mode so that we switch     temporarily from SingleKey mode and can enter a gdb command.  */  for (i = ' '; i < 0x7f; i++)    {      int j;      for (j = 0; tui_commands[j].cmd; j++)        if (tui_commands[j].key == i)          break;      if (tui_commands[j].cmd)        continue;      rl_bind_key_in_map (i, tui_rl_command_mode, tui_keymap);    }  rl_bind_key_in_map ('a', tui_rl_switch_mode, emacs_ctlx_keymap);  rl_bind_key_in_map ('a', tui_rl_switch_mode, tui_ctlx_keymap);  rl_bind_key_in_map ('A', tui_rl_switch_mode, emacs_ctlx_keymap);  rl_bind_key_in_map ('A', tui_rl_switch_mode, tui_ctlx_keymap);  rl_bind_key_in_map (CTRL ('A'), tui_rl_switch_mode, emacs_ctlx_keymap);  rl_bind_key_in_map (CTRL ('A'), tui_rl_switch_mode, tui_ctlx_keymap);  rl_bind_key_in_map ('1', tui_rl_delete_other_windows, emacs_ctlx_keymap);  rl_bind_key_in_map ('1', tui_rl_delete_other_windows, tui_ctlx_keymap);  rl_bind_key_in_map ('2', tui_rl_change_windows, emacs_ctlx_keymap);  rl_bind_key_in_map ('2', tui_rl_change_windows, tui_ctlx_keymap);  rl_bind_key_in_map ('o', tui_rl_other_window, emacs_ctlx_keymap);  rl_bind_key_in_map ('o', tui_rl_other_window, tui_ctlx_keymap);  rl_bind_key_in_map ('q', tui_rl_next_keymap, tui_keymap);  rl_bind_key_in_map ('s', tui_rl_next_keymap, emacs_ctlx_keymap);  rl_bind_key_in_map ('s', tui_rl_next_keymap, tui_ctlx_keymap);}/* Enter in the tui mode (curses).   When in normal mode, it installs the tui hooks in gdb, redirects   the gdb output, configures the readline to work in tui mode.   When in curses mode, it does nothing.  */voidtui_enable (void){  if (tui_active)    return;  /* To avoid to initialize curses when gdb starts, there is a defered     curses initialization.  This initialization is made only once     and the first time the curses mode is entered.  */  if (tui_finish_init)    {      WINDOW *w;      w = initscr ();        cbreak ();      noecho ();      /*timeout (1);*/      nodelay(w, FALSE);      nl();      keypad (w, TRUE);      rl_initialize ();      setTermHeightTo (LINES);      setTermWidthTo (COLS);      def_prog_mode ();      tuiShowFrameInfo (0);      tuiSetLayout (SRC_COMMAND, TUI_UNDEFINED_REGS);      tuiSetWinFocusTo (srcWin);      keypad (cmdWin->generic.handle, TRUE);      wrefresh (cmdWin->generic.handle);      tui_finish_init = 0;    }  else    {     /* Save the current gdb setting of the terminal.        Curses will restore this state when endwin() is called.  */     def_shell_mode ();     clearok (stdscr, TRUE);   }  /* Install the TUI specific hooks.  */  tui_install_hooks ();  rl_startup_hook = tui_rl_startup_hook;  tui_update_variables ();    tui_setup_io (1);  tui_active = 1;  if (deprecated_selected_frame)     tuiShowFrameInfo (deprecated_selected_frame);  /* Restore TUI keymap.  */  tui_set_key_mode (tui_current_key_mode);  tuiRefreshAll ();  /* Update gdb's knowledge of its terminal.  */  target_terminal_save_ours ();  tui_update_gdb_sizes ();}/* Leave the tui mode.   Remove the tui hooks and configure the gdb output and readline   back to their original state.  The curses mode is left so that   the terminal setting is restored to the point when we entered.  */voidtui_disable (void){  if (!tui_active)    return;  /* Restore initial readline keymap.  */  rl_set_keymap (tui_readline_standard_keymap);  /* Remove TUI hooks.  */  tui_remove_hooks ();  rl_startup_hook = 0;  rl_already_prompted = 0;  /* Leave curses and restore previous gdb terminal setting.  */  endwin ();  /* gdb terminal has changed, update gdb internal copy of it     so that terminal management with the inferior works.  */  tui_setup_io (0);  /* Update gdb's knowledge of its terminal.  */  target_terminal_save_ours ();  tui_active = 0;  tui_update_gdb_sizes ();}/* Wrapper on top of free() to ensure that input address   is greater than 0x0.  */voidtuiFree (char *ptr){  if (ptr != (char *) NULL)    {      xfree (ptr);    }}voidstrcat_to_buf (char *buf, int buflen, const char *itemToAdd){  if (itemToAdd != (char *) NULL && buf != (char *) NULL)    {      if ((strlen (buf) + strlen (itemToAdd)) <= buflen)	strcat (buf, itemToAdd);      else	strncat (buf, itemToAdd, (buflen - strlen (buf)));    }}#if 0/* Solaris <sys/termios.h> defines CTRL. */#ifndef CTRL#define CTRL(x)         (x & ~0140)#endif#define FILEDES         2#define CHK(val, dft)   (val<=0 ? dft : val)static void_tuiReset (void){  struct termio mode;  /*     ** reset the teletype mode bits to a sensible state.     ** Copied tset.c   */#if ! defined (USG) && defined (TIOCGETC)  struct tchars tbuf;#endif /* !USG && TIOCGETC */#ifdef UCB_NTTY  struct ltchars ltc;  if (ldisc == NTTYDISC)    {      ioctl (FILEDES, TIOCGLTC, &ltc);      ltc.t_suspc = CHK (ltc.t_suspc, CTRL ('Z'));      ltc.t_dsuspc = CHK (ltc.t_dsuspc, CTRL ('Y'));      ltc.t_rprntc = CHK (ltc.t_rprntc, CTRL ('R'));      ltc.t_flushc = CHK (ltc.t_flushc, CTRL ('O'));      ltc.t_werasc = CHK (ltc.t_werasc, CTRL ('W'));      ltc.t_lnextc = CHK (ltc.t_lnextc, CTRL ('V'));      ioctl (FILEDES, TIOCSLTC, &ltc);    }#endif /* UCB_NTTY */#ifndef USG#ifdef TIOCGETC  ioctl (FILEDES, TIOCGETC, &tbuf);  tbuf.t_intrc = CHK (tbuf.t_intrc, CTRL ('?'));  tbuf.t_quitc = CHK (tbuf.t_quitc, CTRL ('\\'));  tbuf.t_startc = CHK (tbuf.t_startc, CTRL ('Q'));  tbuf.t_stopc = CHK (tbuf.t_stopc, CTRL ('S'));  tbuf.t_eofc = CHK (tbuf.t_eofc, CTRL ('D'));  /* brkc is left alone */  ioctl (FILEDES, TIOCSETC, &tbuf);#endif /* TIOCGETC */  mode.sg_flags &= ~(RAW#ifdef CBREAK		     | CBREAK#endif /* CBREAK */		     | VTDELAY | ALLDELAY);  mode.sg_flags |= XTABS | ECHO | CRMOD | ANYP;#else /*USG */  ioctl (FILEDES, TCGETA, &mode);  mode.c_cc[VINTR] = CHK (mode.c_cc[VINTR], CTRL ('?'));  mode.c_cc[VQUIT] = CHK (mode.c_cc[VQUIT], CTRL ('\\'));  mode.c_cc[VEOF] = CHK (mode.c_cc[VEOF], CTRL ('D'));  mode.c_iflag &= ~(IGNBRK | PARMRK | INPCK | INLCR | IGNCR | IUCLC | IXOFF);  mode.c_iflag |= (BRKINT | ISTRIP | ICRNL | IXON);  mode.c_oflag &= ~(OLCUC | OCRNL | ONOCR | ONLRET | OFILL | OFDEL |		    NLDLY | CRDLY | TABDLY | BSDLY | VTDLY | FFDLY);  mode.c_oflag |= (OPOST | ONLCR);  mode.c_cflag &= ~(CSIZE | PARODD | CLOCAL);#ifndef hp9000s800  mode.c_cflag |= (CS8 | CREAD);#else /*hp9000s800 */  mode.c_cflag |= (CS8 | CSTOPB | CREAD);#endif /* hp9000s800 */  mode.c_lflag &= ~(XCASE | ECHONL | NOFLSH);  mode.c_lflag |= (ISIG | ICANON | ECHO | ECHOK);  ioctl (FILEDES, TCSETAW, &mode);#endif /* USG */  return;}				/* _tuiReset */#endifvoidtui_show_source (const char *file, int line){  struct symtab_and_line cursal = get_current_source_symtab_and_line ();  /* make sure that the source window is displayed */  tuiAddWinToLayout (SRC_WIN);  tuiUpdateSourceWindowsWithLine (cursal.symtab, line);  tuiUpdateLocatorFilename (file);}voidtui_show_assembly (CORE_ADDR addr){  tuiAddWinToLayout (DISASSEM_WIN);  tuiUpdateSourceWindowsWithAddr (addr);}inttui_is_window_visible (TuiWinType type){  if (tui_active == 0)    return 0;  if (winList[type] == 0)    return 0;    return winList[type]->generic.isVisible;}inttui_get_command_dimension (int *width, int *height){  if (!tui_active || !m_winPtrNotNull (cmdWin))    {      return 0;    }    *width = cmdWin->generic.width;  *height = cmdWin->generic.height;  return 1;}

⌨️ 快捷键说明

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