📄 tui-win.c
字号:
_num_to_scroll = 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 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); }}voidtui_scroll_right (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 = 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 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); }}/* Scroll a window. Arguments are passed through a va_list. */voidtui_scroll (enum tui_scroll_direction direction, struct tui_win_info * win_to_scroll, int num_to_scroll){ switch (direction) { case FORWARD_SCROLL: tui_scroll_forward (win_to_scroll, num_to_scroll); break; case BACKWARD_SCROLL: tui_scroll_backward (win_to_scroll, num_to_scroll); break; case LEFT_SCROLL: tui_scroll_left (win_to_scroll, num_to_scroll); break; case RIGHT_SCROLL: tui_scroll_right (win_to_scroll, num_to_scroll); break; default: break; }}voidtui_refresh_all_win (void){ enum tui_win_type type; clearok (curscr, TRUE); 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) { switch (type) { case SRC_WIN: case DISASSEM_WIN: tui_show_source_content (tui_win_list[type]); tui_check_and_display_highlight_if_needed (tui_win_list[type]); tui_erase_exec_info_content (tui_win_list[type]); tui_update_exec_info (tui_win_list[type]); break; case DATA_WIN: tui_refresh_data_win (); break; default: break; } } } tui_show_locator_content ();}/* Resize all the windows based on the the terminal size. This function gets called from within the readline sinwinch handler. */voidtui_resize_all (void){ int height_diff, width_diff; int screenheight, screenwidth; rl_get_screen_size (&screenheight, &screenwidth); width_diff = screenwidth - tui_term_width (); height_diff = screenheight - tui_term_height (); if (height_diff || width_diff) { enum tui_layout_type cur_layout = tui_current_layout (); struct tui_win_info * win_with_focus = tui_win_with_focus (); struct tui_win_info *first_win; struct tui_win_info *second_win; struct tui_gen_win_info * locator = tui_locator_win_info_ptr (); enum tui_win_type win_type; int new_height, split_diff, cmd_split_diff, num_wins_displayed = 2;#ifdef HAVE_RESIZE_TERM resize_term (screenheight, screenwidth);#endif /* turn keypad off while we resize */ if (win_with_focus != TUI_CMD_WIN) keypad (TUI_CMD_WIN->generic.handle, FALSE); 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) num_wins_displayed++; split_diff = height_diff / num_wins_displayed; cmd_split_diff = split_diff; if (height_diff % num_wins_displayed) { if (height_diff < 0) cmd_split_diff--; else cmd_split_diff++; } /* now adjust each window */ clear (); refresh (); switch (cur_layout) { case SRC_COMMAND: case DISASSEM_COMMAND: first_win = (struct tui_win_info *) (tui_source_windows ())->list[0]; first_win->generic.width += width_diff; locator->width += width_diff; /* check for invalid heights */ if (height_diff == 0) new_height = first_win->generic.height; else if ((first_win->generic.height + split_diff) >= (screenheight - MIN_CMD_WIN_HEIGHT - 1)) new_height = screenheight - MIN_CMD_WIN_HEIGHT - 1; else if ((first_win->generic.height + split_diff) <= 0) new_height = MIN_WIN_HEIGHT; else new_height = first_win->generic.height + split_diff; 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; new_height = screenheight - TUI_CMD_WIN->generic.origin.y; make_invisible_and_set_new_height (TUI_CMD_WIN, new_height); make_visible_with_new_height (first_win); make_visible_with_new_height (TUI_CMD_WIN); if (first_win->generic.content_size <= 0) tui_erase_source_content (first_win, EMPTY_SOURCE_PROMPT); break; default: if (cur_layout == SRC_DISASSEM_COMMAND) { first_win = TUI_SRC_WIN; first_win->generic.width += width_diff; second_win = TUI_DISASM_WIN; second_win->generic.width += width_diff; } else { first_win = TUI_DATA_WIN; first_win->generic.width += width_diff; second_win = (struct tui_win_info *) (tui_source_windows ())->list[0]; second_win->generic.width += width_diff; } /* Change the first window's height/width */ /* check for invalid heights */ if (height_diff == 0) new_height = first_win->generic.height; else if ((first_win->generic.height + second_win->generic.height + (split_diff * 2)) >= (screenheight - MIN_CMD_WIN_HEIGHT - 1)) new_height = (screenheight - MIN_CMD_WIN_HEIGHT - 1) / 2; else if ((first_win->generic.height + split_diff) <= 0) new_height = MIN_WIN_HEIGHT; else new_height = first_win->generic.height + split_diff; make_invisible_and_set_new_height (first_win, new_height); locator->width += width_diff; /* Change the second window's height/width */ /* check for invalid heights */ if (height_diff == 0) new_height = second_win->generic.height; else if ((first_win->generic.height + second_win->generic.height + (split_diff * 2)) >= (screenheight - MIN_CMD_WIN_HEIGHT - 1)) { new_height = screenheight - MIN_CMD_WIN_HEIGHT - 1; if (new_height % 2) new_height = (new_height / 2) + 1; else new_height /= 2; } else if ((second_win->generic.height + split_diff) <= 0) new_height = MIN_WIN_HEIGHT; else new_height = second_win->generic.height + split_diff; second_win->generic.origin.y = first_win->generic.height - 1; make_invisible_and_set_new_height (second_win, new_height); /* 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_visible_with_new_height (first_win); make_visible_with_new_height (second_win); make_visible_with_new_height (TUI_CMD_WIN); if (first_win->generic.content_size <= 0) tui_erase_source_content (first_win, EMPTY_SOURCE_PROMPT); if (second_win->generic.content_size <= 0) tui_erase_source_content (second_win, EMPTY_SOURCE_PROMPT); break; } /* ** Now remove all invisible windows, and their content so that 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) && !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) keypad (TUI_CMD_WIN->generic.handle, TRUE); }}/* 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). */voidtui_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);}/*************************** STATIC LOCAL FUNCTIONS**************************/static voidtui_scroll_forward_command (char *arg, int from_tty){ int num_to_scroll = 1; struct tui_win_info * win_to_scroll; /* Make sure the curses mode is enabled. */ tui_enable (); if (arg == (char *) NULL) parse_scrolling_args (arg, &win_to_scroll, (int *) NULL); else parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll); tui_scroll (FORWARD_SCROLL, win_to_scroll, num_to_scroll);}static voidtui_scroll_backward_command (char *arg, int from_tty){ int num_to_scroll = 1; struct tui_win_info * win_to_scroll; /* Make sure the curses mode is enabled. */ tui_enable (); if (arg == (char *) NULL) parse_scrolling_args (arg, &win_to_scroll, (int *) NULL); else parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll); tui_scroll (BACKWARD_SCROLL, win_to_scroll, num_to_scroll);}static voidtui_scroll_left_command (char *arg, int from_tty){ int num_to_scroll; struct tui_win_info * win_to_scroll; /* Make sure the curses mode is enabled. */ tui_enable (); parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll); tui_scroll (LEFT_SCROLL, win_to_scroll, num_to_scroll);}static voidtui_scroll_right_command (char *arg, int from_tty){ int num_to_scroll; struct tui_win_info * win_to_scroll; /* Make sure the curses mode is enabled. */ tui_enable (); parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll); tui_scroll (RIGHT_SCROLL, win_to_scroll, num_to_scroll);}/* Set focus to the window named by 'arg'. */static voidtui_set_focus (char *arg, int from_tty){ if (arg != (char *) NULL) { char *buf_ptr = (char *) xstrdup (arg); int i; struct tui_win_info * win_info = (struct tui_win_info *) NULL; for (i = 0; (i < strlen (buf_ptr)); i++) buf_ptr[i] = toupper (arg[i]); if (subset_compare (buf_ptr, "NEXT")) win_info = tui_next_win (tui_win_with_focus ()); else if (subset_compare (buf_ptr, "PREV")) win_info = tui_prev_win (tui_win_with_focus ()); else win_info = tui_partial_win_by_name (buf_ptr); 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_set_win_focus_to (win_info); keypad (TUI_CMD_WIN->generic.handle, (win_info != TUI_CMD_WIN)); } if (TUI_DATA_WIN && TUI_DATA_WIN->generic.is_visible) 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 ())); } else warning ("Incorrect Number of Arguments.\n%s", FOCUS_USAGE);}static voidtui_set_focus_command (char *arg, int from_tty){ /* Make sure the curses mode is enabled. */ tui_enable (); tui_set_focus (arg, from_tty);}static voidtui_all_windows_info (char *arg, int from_tty){ enum tui_win_type type; 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 (win_with_focus == tui_win_list[type]) printf_filtered (" %s\t(%d lines) <has focus>\n", tui_win_name (&tui_win_list[type]->generic), tui_win_list[type]->generic.height); else printf_filtered (" %s\t(%d lines)\n", tui_win_name (&tui_win_list[type]->generic), tui_win_list[type]->generic.height); }}static voidtui_refresh_all_command (char *arg, int from_tty){ /* Make sure the curses mode is enabled. */ tui_enable (); tui_refresh_all_win ();}/* Set the height of the specified window. */static voidtui_set_tab_width_command (char *arg, int from_tty){ /* Make sure the curses mode is enabled. */ tui_enable (); if (arg != (char *) NULL) { int ts; ts = atoi (arg); if (ts > 0) tui_set_default_tab_len (ts); else warning ("Tab widths greater than 0 must be specified.\n"); }}/* Set the height of the specified window. */static voidtui_set_win_height (char *arg, int from_tty){ /* Make sure the curses mode is enabled. */ tui_enable (); if (arg != (char *) NULL) { char *buf = xstrdup (arg); char *buf_ptr = buf; char *wname = (char *) NULL; int new_height, i; struct tui_win_info * win_info; wname = buf_ptr; buf_ptr = strchr (buf_ptr, ' '); if (buf_ptr != (char *) NULL) { *buf_ptr = (char) 0; /* ** Validate the window name */ for (i = 0; i < strlen (wname); i++) 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) warning ("Invalid window specified. \n\The window name specified must be valid and visible.\n"); else { /* Process the size */ while (*(++buf_ptr) == ' ') ; if (*buf_ptr != (char) 0) { int negate = FALSE; int fixed_size = TRUE; int input_no;; if (*buf_ptr == '+' || *buf_ptr == '-') { if (*buf_ptr == '-') negate = TRUE; fixed_size = FALSE; buf_ptr++; } input_no = atoi (buf_ptr); if (input_no > 0) { if (negate) input_no *= (-1); if (fixed_size) new_height = input_no; else new_height = win_info->generic.height + input_no; /* ** Now change the window's height, and adjust all ** other windows around it */ if (tui_adjust_win_heights (win_info, new_height) == TUI_FAILURE) warning ("Invalid window height specified.\n%s", WIN_HEIGHT_USAGE); else tui_update_gdb_sizes (); } else warning ("Invalid window height specified.\n%s", WIN_HEIGHT_USAGE); } } } else printf_filtered (WIN_HEIGHT_USAGE); if (buf != (char *) NULL) xfree (buf);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -