📄 tui-layout.c
字号:
static voidtui_handle_xdb_layout (struct tui_layout_def * layout_def){ if (layout_def->split) { tui_set_layout (SRC_DISASSEM_COMMAND, TUI_UNDEFINED_REGS); tui_set_win_focus_to (tui_win_list[layout_def->display_mode]); } else { if (layout_def->display_mode == SRC_WIN) tui_set_layout (SRC_COMMAND, TUI_UNDEFINED_REGS); else tui_set_layout (DISASSEM_DATA_COMMAND, layout_def->regs_display_type); }}static voidtui_toggle_layout_command (char *arg, int from_tty){ struct tui_layout_def * layout_def = tui_layout_def (); /* Make sure the curses mode is enabled. */ tui_enable (); if (layout_def->display_mode == SRC_WIN) layout_def->display_mode = DISASSEM_WIN; else layout_def->display_mode = SRC_WIN; if (!layout_def->split) tui_handle_xdb_layout (layout_def);}static voidtui_toggle_split_layout_command (char *arg, int from_tty){ struct tui_layout_def * layout_def = tui_layout_def (); /* Make sure the curses mode is enabled. */ tui_enable (); layout_def->split = (!layout_def->split); tui_handle_xdb_layout (layout_def);}static voidtui_layout_command (char *arg, int from_tty){ /* Make sure the curses mode is enabled. */ tui_enable (); /* Switch to the selected layout. */ if (tui_set_layout_for_display_command (arg) != TUI_SUCCESS) warning ("Invalid layout specified.\n%s", LAYOUT_USAGE);}/* Answer the previous layout to cycle to. */static enum tui_layout_typenext_layout (void){ enum tui_layout_type new_layout; new_layout = tui_current_layout (); if (new_layout == UNDEFINED_LAYOUT) new_layout = SRC_COMMAND; else { new_layout++; if (new_layout == UNDEFINED_LAYOUT) new_layout = SRC_COMMAND; } return new_layout;}/* Answer the next layout to cycle to. */static enum tui_layout_typeprev_layout (void){ enum tui_layout_type new_layout; new_layout = tui_current_layout (); if (new_layout == SRC_COMMAND) new_layout = DISASSEM_DATA_COMMAND; else { new_layout--; if (new_layout == UNDEFINED_LAYOUT) new_layout = DISASSEM_DATA_COMMAND; } return new_layout;}static voidmake_command_window (struct tui_win_info * * win_info_ptr, int height, int origin_y){ init_and_make_win ((void **) win_info_ptr, CMD_WIN, height, tui_term_width (), 0, origin_y, DONT_BOX_WINDOW); (*win_info_ptr)->can_highlight = FALSE;}/* ** make_source_window(). */static voidmake_source_window (struct tui_win_info * * win_info_ptr, int height, int origin_y){ make_source_or_disasm_window (win_info_ptr, SRC_WIN, height, origin_y); return;} /* make_source_window *//* ** make_disasm_window(). */static voidmake_disasm_window (struct tui_win_info * * win_info_ptr, int height, int origin_y){ make_source_or_disasm_window (win_info_ptr, DISASSEM_WIN, height, origin_y); return;} /* make_disasm_window */static voidmake_data_window (struct tui_win_info * * win_info_ptr, int height, int origin_y){ init_and_make_win ((void **) win_info_ptr, DATA_WIN, height, tui_term_width (), 0, origin_y, BOX_WINDOW);}/* Show the Source/Command layout. */static voidshow_source_command (void){ show_source_or_disasm_and_command (SRC_COMMAND);}/* Show the Dissassem/Command layout. */static voidshow_disasm_command (void){ show_source_or_disasm_and_command (DISASSEM_COMMAND);}/* Show the Source/Disassem/Command layout. */static voidshow_source_disasm_command (void){ if (tui_current_layout () != SRC_DISASSEM_COMMAND) { int cmd_height, src_height, asm_height; if (TUI_CMD_WIN != NULL) cmd_height = TUI_CMD_WIN->generic.height; else cmd_height = tui_term_height () / 3; src_height = (tui_term_height () - cmd_height) / 2; asm_height = tui_term_height () - (src_height + cmd_height); if (TUI_SRC_WIN == NULL) make_source_window (&TUI_SRC_WIN, src_height, 0); else { init_gen_win_info (&TUI_SRC_WIN->generic, TUI_SRC_WIN->generic.type, src_height, TUI_SRC_WIN->generic.width, TUI_SRC_WIN->detail.source_info.execution_info->width, 0); TUI_SRC_WIN->can_highlight = TRUE; init_gen_win_info (TUI_SRC_WIN->detail.source_info.execution_info, EXEC_INFO_WIN, src_height, 3, 0, 0); tui_make_visible (&TUI_SRC_WIN->generic); tui_make_visible (TUI_SRC_WIN->detail.source_info.execution_info); TUI_SRC_WIN->detail.source_info.has_locator = FALSE;; } if (TUI_SRC_WIN != NULL) { struct tui_gen_win_info * locator = tui_locator_win_info_ptr (); tui_show_source_content (TUI_SRC_WIN); if (TUI_DISASM_WIN == NULL) { make_disasm_window (&TUI_DISASM_WIN, asm_height, src_height - 1); init_and_make_win ((void **) & locator, LOCATOR_WIN, 2 /* 1 */ , tui_term_width (), 0, (src_height + asm_height) - 1, DONT_BOX_WINDOW); } else { init_gen_win_info (locator, LOCATOR_WIN, 2 /* 1 */ , tui_term_width (), 0, (src_height + asm_height) - 1); TUI_DISASM_WIN->detail.source_info.has_locator = TRUE; init_gen_win_info ( &TUI_DISASM_WIN->generic, TUI_DISASM_WIN->generic.type, asm_height, TUI_DISASM_WIN->generic.width, TUI_DISASM_WIN->detail.source_info.execution_info->width, src_height - 1); init_gen_win_info (TUI_DISASM_WIN->detail.source_info.execution_info, EXEC_INFO_WIN, asm_height, 3, 0, src_height - 1); TUI_DISASM_WIN->can_highlight = TRUE; tui_make_visible (&TUI_DISASM_WIN->generic); tui_make_visible (TUI_DISASM_WIN->detail.source_info.execution_info); } if (TUI_DISASM_WIN != NULL) { TUI_SRC_WIN->detail.source_info.has_locator = FALSE; TUI_DISASM_WIN->detail.source_info.has_locator = TRUE; tui_make_visible (locator); tui_show_locator_content (); tui_show_source_content (TUI_DISASM_WIN); if (TUI_CMD_WIN == NULL) make_command_window (&TUI_CMD_WIN, cmd_height, tui_term_height () - cmd_height); else { init_gen_win_info (&TUI_CMD_WIN->generic, TUI_CMD_WIN->generic.type, TUI_CMD_WIN->generic.height, TUI_CMD_WIN->generic.width, 0, TUI_CMD_WIN->generic.origin.y); TUI_CMD_WIN->can_highlight = FALSE; tui_make_visible (&TUI_CMD_WIN->generic); } if (TUI_CMD_WIN != NULL) tui_refresh_win (&TUI_CMD_WIN->generic); } } tui_set_current_layout_to (SRC_DISASSEM_COMMAND); }}/* Show the Source/Data/Command or the Dissassembly/Data/Command layout. */static voidshow_data (enum tui_layout_type new_layout){ int total_height = (tui_term_height () - TUI_CMD_WIN->generic.height); int src_height, data_height; enum tui_win_type win_type; struct tui_gen_win_info * locator = tui_locator_win_info_ptr (); data_height = total_height / 2; src_height = total_height - data_height; tui_make_all_invisible (); tui_make_invisible (locator); make_data_window (&TUI_DATA_WIN, data_height, 0); TUI_DATA_WIN->can_highlight = TRUE; if (new_layout == SRC_DATA_COMMAND) win_type = SRC_WIN; else win_type = DISASSEM_WIN; if (tui_win_list[win_type] == NULL) { if (win_type == SRC_WIN) make_source_window (&tui_win_list[win_type], src_height, data_height - 1); else make_disasm_window (&tui_win_list[win_type], src_height, data_height - 1); init_and_make_win ((void **) & locator, LOCATOR_WIN, 2 /* 1 */ , tui_term_width (), 0, total_height - 1, DONT_BOX_WINDOW); } else { init_gen_win_info (&tui_win_list[win_type]->generic, tui_win_list[win_type]->generic.type, src_height, tui_win_list[win_type]->generic.width, tui_win_list[win_type]->detail.source_info.execution_info->width, data_height - 1); init_gen_win_info (tui_win_list[win_type]->detail.source_info.execution_info, EXEC_INFO_WIN, src_height, 3, 0, data_height - 1); tui_make_visible (&tui_win_list[win_type]->generic); tui_make_visible (tui_win_list[win_type]->detail.source_info.execution_info); init_gen_win_info (locator, LOCATOR_WIN, 2 /* 1 */ , tui_term_width (), 0, total_height - 1); } tui_win_list[win_type]->detail.source_info.has_locator = TRUE; tui_make_visible (locator); tui_show_locator_content (); tui_add_to_source_windows (tui_win_list[win_type]); tui_set_current_layout_to (new_layout);}/* ** init_gen_win_info(). */static voidinit_gen_win_info (struct tui_gen_win_info * win_info, enum tui_win_type type, int height, int width, int origin_x, int origin_y){ int h = height; win_info->type = type; win_info->width = width; win_info->height = h; if (h > 1) { win_info->viewport_height = h - 1; if (win_info->type != CMD_WIN) win_info->viewport_height--; } else win_info->viewport_height = 1; win_info->origin.x = origin_x; win_info->origin.y = origin_y; return;} /* init_gen_win_info *//* ** init_and_make_win(). */static voidinit_and_make_win (void ** win_info_ptr, enum tui_win_type win_type, int height, int width, int origin_x, int origin_y, int box_it){ void *opaque_win_info = *win_info_ptr; struct tui_gen_win_info * generic; if (opaque_win_info == NULL) { if (tui_win_is_auxillary (win_type)) opaque_win_info = (void *) tui_alloc_generic_win_info (); else opaque_win_info = (void *) tui_alloc_win_info (win_type); } if (tui_win_is_auxillary (win_type)) generic = (struct tui_gen_win_info *) opaque_win_info; else generic = &((struct tui_win_info *) opaque_win_info)->generic; if (opaque_win_info != NULL) { init_gen_win_info (generic, win_type, height, width, origin_x, origin_y); if (!tui_win_is_auxillary (win_type)) { if (generic->type == CMD_WIN) ((struct tui_win_info *) opaque_win_info)->can_highlight = FALSE; else ((struct tui_win_info *) opaque_win_info)->can_highlight = TRUE; } tui_make_window (generic, box_it); } *win_info_ptr = opaque_win_info;}static voidmake_source_or_disasm_window (struct tui_win_info * * win_info_ptr, enum tui_win_type type, int height, int origin_y){ struct tui_gen_win_info * execution_info = (struct tui_gen_win_info *) NULL; /* ** Create the exeuction info window. */ if (type == SRC_WIN) execution_info = tui_source_exec_info_win_ptr (); else execution_info = tui_disassem_exec_info_win_ptr (); init_and_make_win ((void **) & execution_info, EXEC_INFO_WIN, height, 3, 0, origin_y, DONT_BOX_WINDOW); /* ** Now create the source window. */ init_and_make_win ((void **) win_info_ptr, type, height, tui_term_width () - execution_info->width, execution_info->width, origin_y, BOX_WINDOW); (*win_info_ptr)->detail.source_info.execution_info = execution_info;}/* Show the Source/Command or the Disassem layout. */static voidshow_source_or_disasm_and_command (enum tui_layout_type layout_type){ if (tui_current_layout () != layout_type) { struct tui_win_info * *win_info_ptr; int src_height, cmd_height; struct tui_gen_win_info * locator = tui_locator_win_info_ptr (); if (TUI_CMD_WIN != NULL) cmd_height = TUI_CMD_WIN->generic.height; else cmd_height = tui_term_height () / 3; src_height = tui_term_height () - cmd_height; if (layout_type == SRC_COMMAND) win_info_ptr = &TUI_SRC_WIN; else win_info_ptr = &TUI_DISASM_WIN; if ((*win_info_ptr) == NULL) { if (layout_type == SRC_COMMAND) make_source_window (win_info_ptr, src_height - 1, 0); else make_disasm_window (win_info_ptr, src_height - 1, 0); init_and_make_win ((void **) & locator, LOCATOR_WIN, 2 /* 1 */ , tui_term_width (), 0, src_height - 1, DONT_BOX_WINDOW); } else { init_gen_win_info (locator, LOCATOR_WIN, 2 /* 1 */ , tui_term_width (), 0, src_height - 1); (*win_info_ptr)->detail.source_info.has_locator = TRUE; init_gen_win_info ( &(*win_info_ptr)->generic, (*win_info_ptr)->generic.type, src_height - 1, (*win_info_ptr)->generic.width, (*win_info_ptr)->detail.source_info.execution_info->width, 0); init_gen_win_info ((*win_info_ptr)->detail.source_info.execution_info, EXEC_INFO_WIN, src_height - 1, 3, 0, 0); (*win_info_ptr)->can_highlight = TRUE; tui_make_visible (&(*win_info_ptr)->generic); tui_make_visible ((*win_info_ptr)->detail.source_info.execution_info); } if ((*win_info_ptr) != NULL) { (*win_info_ptr)->detail.source_info.has_locator = TRUE; tui_make_visible (locator); tui_show_locator_content (); tui_show_source_content (*win_info_ptr); if (TUI_CMD_WIN == NULL) { make_command_window (&TUI_CMD_WIN, cmd_height, src_height); tui_refresh_win (&TUI_CMD_WIN->generic); } else { init_gen_win_info (&TUI_CMD_WIN->generic, TUI_CMD_WIN->generic.type, TUI_CMD_WIN->generic.height, TUI_CMD_WIN->generic.width, TUI_CMD_WIN->generic.origin.x, TUI_CMD_WIN->generic.origin.y); TUI_CMD_WIN->can_highlight = FALSE; tui_make_visible (&TUI_CMD_WIN->generic); } } tui_set_current_layout_to (layout_type); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -