/* TUI layout window management. 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. */ #include "defs.h" #include "command.h" #include "symtab.h" #include "frame.h" #include "source.h" #include #include "tui/tui.h" #include "tui/tui-data.h" #include "tui/tui-windata.h" #include "tui/tui-wingeneral.h" #include "tui/tui-stack.h" #include "tui/tui-regs.h" #include "tui/tui-win.h" #include "tui/tui-winsource.h" #include "tui/tui-disasm.h" #ifdef HAVE_NCURSES_H #include #else #ifdef HAVE_CURSES_H #include #endif #endif /******************************* ** Static Local Decls ********************************/ static void showLayout (enum tui_layout_type); static void _initGenWinInfo (struct tui_gen_win_info *, enum tui_win_type, int, int, int, int); static void _initAndMakeWin (void **, enum tui_win_type, int, int, int, int, int); static void _showSourceOrDisassemAndCommand (enum tui_layout_type); static void _makeSourceOrDisassemWindow (struct tui_win_info * *, enum tui_win_type, int, int); static void _makeCommandWindow (struct tui_win_info * *, int, int); static void _makeSourceWindow (struct tui_win_info * *, int, int); static void _makeDisassemWindow (struct tui_win_info * *, int, int); static void _makeDataWindow (struct tui_win_info * *, int, int); static void _showSourceCommand (void); static void _showDisassemCommand (void); static void _showSourceDisassemCommand (void); static void _showData (enum tui_layout_type); static enum tui_layout_type _nextLayout (void); static enum tui_layout_type _prevLayout (void); static void _tuiLayout_command (char *, int); static void _tuiToggleLayout_command (char *, int); static void _tuiToggleSplitLayout_command (char *, int); static CORE_ADDR _extractDisplayStartAddr (void); static void _tuiHandleXDBLayout (struct tui_layout_def *); /*************************************** ** DEFINITIONS ***************************************/ #define LAYOUT_USAGE "Usage: layout prev | next | \n" /* Show the screen layout defined. */ static void showLayout (enum tui_layout_type layout) { enum tui_layout_type curLayout = tui_current_layout (); if (layout != curLayout) { /* ** Since the new layout may cause changes in window size, we ** should free the content and reallocate on next display of ** source/asm */ tui_free_all_source_wins_content (); tui_clear_source_windows (); if (layout == SRC_DATA_COMMAND || layout == DISASSEM_DATA_COMMAND) { _showData (layout); tui_refresh_all (tui_win_list); } else { /* First make the current layout be invisible */ tui_make_all_invisible (); tui_make_invisible (tui_locator_win_info_ptr ()); switch (layout) { /* Now show the new layout */ case SRC_COMMAND: _showSourceCommand (); tui_add_to_source_windows (TUI_SRC_WIN); break; case DISASSEM_COMMAND: _showDisassemCommand (); tui_add_to_source_windows (TUI_DISASM_WIN); break; case SRC_DISASSEM_COMMAND: _showSourceDisassemCommand (); tui_add_to_source_windows (TUI_SRC_WIN); tui_add_to_source_windows (TUI_DISASM_WIN); break; default: break; } } } } /* Function to set the layout to SRC_COMMAND, DISASSEM_COMMAND, SRC_DISASSEM_COMMAND, SRC_DATA_COMMAND, or DISASSEM_DATA_COMMAND. If the layout is SRC_DATA_COMMAND, DISASSEM_DATA_COMMAND, or UNDEFINED_LAYOUT, then the data window is populated according to regs_display_type. */ enum tui_status tui_set_layout (enum tui_layout_type layoutType, enum tui_register_display_type regs_display_type) { enum tui_status status = TUI_SUCCESS; if (layoutType != UNDEFINED_LAYOUT || regs_display_type != TUI_UNDEFINED_REGS) { enum tui_layout_type curLayout = tui_current_layout (), newLayout = UNDEFINED_LAYOUT; int regsPopulate = FALSE; CORE_ADDR addr = _extractDisplayStartAddr (); struct tui_win_info * newWinWithFocus = (struct tui_win_info *) NULL; struct tui_win_info * winWithFocus = tui_win_with_focus (); struct tui_layout_def * layoutDef = tui_layout_def (); if (layoutType == UNDEFINED_LAYOUT && regs_display_type != TUI_UNDEFINED_REGS) { if (curLayout == SRC_DISASSEM_COMMAND) newLayout = DISASSEM_DATA_COMMAND; else if (curLayout == SRC_COMMAND || curLayout == SRC_DATA_COMMAND) newLayout = SRC_DATA_COMMAND; else if (curLayout == DISASSEM_COMMAND || curLayout == DISASSEM_DATA_COMMAND) newLayout = DISASSEM_DATA_COMMAND; } else newLayout = layoutType; regsPopulate = (newLayout == SRC_DATA_COMMAND || newLayout == DISASSEM_DATA_COMMAND || regs_display_type != TUI_UNDEFINED_REGS); if (newLayout != curLayout || regs_display_type != TUI_UNDEFINED_REGS) { if (newLayout != curLayout) { showLayout (newLayout); /* ** Now determine where focus should be */ if (winWithFocus != TUI_CMD_WIN) { switch (newLayout) { case SRC_COMMAND: tui_set_win_focus_to (TUI_SRC_WIN); layoutDef->display_mode = SRC_WIN; layoutDef->split = FALSE; break; case DISASSEM_COMMAND: /* the previous layout was not showing ** code. this can happen if there is no ** source available: ** 1. if the source file is in another dir OR ** 2. if target was compiled without -g ** We still want to show the assembly though! */ addr = tui_get_begin_asm_address (); tui_set_win_focus_to (TUI_DISASM_WIN); layoutDef->display_mode = DISASSEM_WIN; layoutDef->split = FALSE; break; case SRC_DISASSEM_COMMAND: /* the previous layout was not showing ** code. this can happen if there is no ** source available: ** 1. if the source file is in another dir OR ** 2. if target was compiled without -g ** We still want to show the assembly though! */ addr = tui_get_begin_asm_address (); if (winWithFocus == TUI_SRC_WIN) tui_set_win_focus_to (TUI_SRC_WIN); else tui_set_win_focus_to (TUI_DISASM_WIN); layoutDef->split = TRUE; break; case SRC_DATA_COMMAND: if (winWithFocus != TUI_DATA_WIN) tui_set_win_focus_to (TUI_SRC_WIN); else tui_set_win_focus_to (TUI_DATA_WIN); layoutDef->display_mode = SRC_WIN; layoutDef->split = FALSE; break; case DISASSEM_DATA_COMMAND: /* the previous layout was not showing ** code. this can happen if there is no ** source available: ** 1. if the source file is in another dir OR ** 2. if target was compiled without -g ** We still want to show the assembly though! */ addr = tui_get_begin_asm_address (); if (winWithFocus != TUI_DATA_WIN) tui_set_win_focus_to (TUI_DISASM_WIN); else tui_set_win_focus_to (TUI_DATA_WIN); layoutDef->display_mode = DISASSEM_WIN; layoutDef->split = FALSE; break; default: break; } } if (newWinWithFocus != (struct tui_win_info *) NULL) tui_set_win_focus_to (newWinWithFocus); /* ** Now update the window content */ if (!regsPopulate && (newLayout == SRC_DATA_COMMAND || newLayout == DISASSEM_DATA_COMMAND)) tui_display_all_data (); tui_update_source_windows_with_addr (addr); } if (regsPopulate) { layoutDef->regs_display_type = (regs_display_type == TUI_UNDEFINED_REGS ? TUI_GENERAL_REGS : regs_display_type); tui_show_registers (layoutDef->regs_display_type); } } } else status = TUI_FAILURE; return status; } /* Add the specified window to the layout in a logical way. This means setting up the most logical layout given the window to be added. */ void tui_add_win_to_layout (enum tui_win_type type) { enum tui_layout_type curLayout = tui_current_layout (); switch (type) { case SRC_WIN: if (curLayout != SRC_COMMAND && curLayout != SRC_DISASSEM_COMMAND && curLayout != SRC_DATA_COMMAND) { tui_clear_source_windows_detail (); if (curLayout == DISASSEM_DATA_COMMAND) showLayout (SRC_DATA_COMMAND); else showLayout (SRC_COMMAND); } break; case DISASSEM_WIN: if (curLayout != DISASSEM_COMMAND && curLayout != SRC_DISASSEM_COMMAND && curLayout != DISASSEM_DATA_COMMAND) { tui_clear_source_windows_detail (); if (curLayout == SRC_DATA_COMMAND) showLayout (DISASSEM_DATA_COMMAND); else showLayout (DISASSEM_COMMAND); } break; case DATA_WIN: if (curLayout != SRC_DATA_COMMAND && curLayout != DISASSEM_DATA_COMMAND) { if (curLayout == DISASSEM_COMMAND) showLayout (DISASSEM_DATA_COMMAND); else showLayout (SRC_DATA_COMMAND); } break; default: break; } return; } /* tuiAddWinToLayout */ /* ** tuiDefaultWinHeight(). ** Answer the height of a window. If it hasn't been created yet, ** answer what the height of a window would be based upon its ** type and the layout. */ int tuiDefaultWinHeight (enum tui_win_type type, enum tui_layout_type layout) { int h; if (tui_win_list[type] != (struct tui_win_info *) NULL) h = tui_win_list[type]->generic.height; else { switch (layout) { case SRC_COMMAND: case DISASSEM_COMMAND: if (TUI_CMD_WIN == NULL) h = tui_term_height () / 2; else h = tui_term_height () - TUI_CMD_WIN->generic.height; break; case SRC_DISASSEM_COMMAND: case SRC_DATA_COMMAND: case DISASSEM_DATA_COMMAND: if (TUI_CMD_WIN == NULL) h = tui_term_height () / 3; else h = (tui_term_height () - TUI_CMD_WIN->generic.height) / 2; break; default: h = 0; break; } } return h; } /* tuiDefaultWinHeight */ /* Answer the height of a window. If it hasn't been created yet, answer what the height of a window would be based upon its type and the layout. */ int tui_default_win_viewport_height (enum tui_win_type type, enum tui_layout_type layout) { int h; h = tuiDefaultWinHeight (type, layout); if (tui_win_list[type] == TUI_CMD_WIN) h -= 1; else h -= 2; return h; } /* tuiDefaultWinViewportHeight */ /* ** _initialize_tuiLayout(). ** Function to initialize gdb commands, for tui window layout ** manipulation. */ void _initialize_tuiLayout (void) { add_com ("layout", class_tui, _tuiLayout_command, "Change the layout of windows.\n\ Usage: layout prev | next | \n\ Layout names are:\n\ src : Displays source and command windows.\n\ asm : Displays disassembly and command windows.\n\ split : Displays source, disassembly and command windows.\n\ regs : Displays register window. If existing layout\n\ is source/command or assembly/command, the \n\ register window is displayed. If the\n\ source/assembly/command (split) is displayed, \n\ the register window is displayed with \n\ the window that has current logical focus.\n"); if (xdb_commands) { add_com ("td", class_tui, _tuiToggleLayout_command, "Toggle between Source/Command and Disassembly/Command layouts.\n"); add_com ("ts", class_tui, _tuiToggleSplitLayout_command, "Toggle between Source/Command or Disassembly/Command and \n\ Source/Disassembly/Command layouts.\n"); } } /************************* ** STATIC LOCAL FUNCTIONS **************************/ /* ** _tuiSetLayoutTo() ** Function to set the layout to SRC, ASM, SPLIT, NEXT, PREV, DATA, REGS, ** $REGS, $GREGS, $FREGS, $SREGS. */ enum tui_status tui_set_layout_for_display_command (const char *layoutName) { enum tui_status status = TUI_SUCCESS; if (layoutName != (char *) NULL) { register int i; register char *bufPtr; enum tui_layout_type newLayout = UNDEFINED_LAYOUT; enum tui_register_display_type dpyType = TUI_UNDEFINED_REGS; enum tui_layout_type curLayout = tui_current_layout (); bufPtr = (char *) xstrdup (layoutName); for (i = 0; (i < strlen (layoutName)); i++) bufPtr[i] = toupper (bufPtr[i]); /* First check for ambiguous input */ if (strlen (bufPtr) <= 1 && (*bufPtr == 'S' || *bufPtr == '$')) { warning ("Ambiguous command input.\n"); status = TUI_FAILURE; } else { if (subset_compare (bufPtr, "SRC")) newLayout = SRC_COMMAND; else if (subset_compare (bufPtr, "ASM")) newLayout = DISASSEM_COMMAND; else if (subset_compare (bufPtr, "SPLIT")) newLayout = SRC_DISASSEM_COMMAND; else if (subset_compare (bufPtr, "REGS") || subset_compare (bufPtr, TUI_GENERAL_SPECIAL_REGS_NAME) || subset_compare (bufPtr, TUI_GENERAL_REGS_NAME) || subset_compare (bufPtr, TUI_FLOAT_REGS_NAME) || subset_compare (bufPtr, TUI_SPECIAL_REGS_NAME)) { if (curLayout == SRC_COMMAND || curLayout == SRC_DATA_COMMAND) newLayout = SRC_DATA_COMMAND; else newLayout = DISASSEM_DATA_COMMAND; /* could ifdef out the following code. when compile with -z, there are null pointer references that cause a core dump if 'layout regs' is the first layout command issued by the user. HP has asked us to hook up this code - edie epstein */ if (subset_compare (bufPtr, TUI_FLOAT_REGS_NAME)) { if (TUI_DATA_WIN->detail.data_display_info.regs_display_type != TUI_SFLOAT_REGS && TUI_DATA_WIN->detail.data_display_info.regs_display_type != TUI_DFLOAT_REGS) dpyType = TUI_SFLOAT_REGS; else dpyType = TUI_DATA_WIN->detail.data_display_info.regs_display_type; } else if (subset_compare (bufPtr, TUI_GENERAL_SPECIAL_REGS_NAME)) dpyType = TUI_GENERAL_AND_SPECIAL_REGS; else if (subset_compare (bufPtr, TUI_GENERAL_REGS_NAME)) dpyType = TUI_GENERAL_REGS; else if (subset_compare (bufPtr, TUI_SPECIAL_REGS_NAME)) dpyType = TUI_SPECIAL_REGS; else if (TUI_DATA_WIN) { if (TUI_DATA_WIN->detail.data_display_info.regs_display_type != TUI_UNDEFINED_REGS) dpyType = TUI_DATA_WIN->detail.data_display_info.regs_display_type; else dpyType = TUI_GENERAL_REGS; } /* end of potential ifdef */ /* if ifdefed out code above, then assume that the user wishes to display the general purpose registers */ /* dpyType = TUI_GENERAL_REGS; */ } else if (subset_compare (bufPtr, "NEXT")) newLayout = _nextLayout (); else if (subset_compare (bufPtr, "PREV")) newLayout = _prevLayout (); else status = TUI_FAILURE; xfree (bufPtr); tui_set_layout (newLayout, dpyType); } } else status = TUI_FAILURE; return status; } static CORE_ADDR _extractDisplayStartAddr (void) { enum tui_layout_type curLayout = tui_current_layout (); CORE_ADDR addr; CORE_ADDR pc; struct symtab_and_line cursal = get_current_source_symtab_and_line (); switch (curLayout) { case SRC_COMMAND: case SRC_DATA_COMMAND: find_line_pc (cursal.symtab, TUI_SRC_WIN->detail.source_info.start_line_or_addr.line_no, &pc); addr = pc; break; case DISASSEM_COMMAND: case SRC_DISASSEM_COMMAND: case DISASSEM_DATA_COMMAND: addr = TUI_DISASM_WIN->detail.source_info.start_line_or_addr.addr; break; default: addr = 0; break; } return addr; } /* _extractDisplayStartAddr */ static void _tuiHandleXDBLayout (struct tui_layout_def * layoutDef) { if (layoutDef->split) { tui_set_layout (SRC_DISASSEM_COMMAND, TUI_UNDEFINED_REGS); tui_set_win_focus_to (tui_win_list[layoutDef->display_mode]); } else { if (layoutDef->display_mode == SRC_WIN) tui_set_layout (SRC_COMMAND, TUI_UNDEFINED_REGS); else tui_set_layout (DISASSEM_DATA_COMMAND, layoutDef->regs_display_type); } return; } /* _tuiHandleXDBLayout */ static void _tuiToggleLayout_command (char *arg, int fromTTY) { struct tui_layout_def * layoutDef = tui_layout_def (); /* Make sure the curses mode is enabled. */ tui_enable (); if (layoutDef->display_mode == SRC_WIN) layoutDef->display_mode = DISASSEM_WIN; else layoutDef->display_mode = SRC_WIN; if (!layoutDef->split) _tuiHandleXDBLayout (layoutDef); } static void _tuiToggleSplitLayout_command (char *arg, int fromTTY) { struct tui_layout_def * layoutDef = tui_layout_def (); /* Make sure the curses mode is enabled. */ tui_enable (); layoutDef->split = (!layoutDef->split); _tuiHandleXDBLayout (layoutDef); } static void _tuiLayout_command (char *arg, int fromTTY) { /* 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); } /* ** _nextLayout(). ** Answer the previous layout to cycle to. */ static enum tui_layout_type _nextLayout (void) { enum tui_layout_type newLayout; newLayout = tui_current_layout (); if (newLayout == UNDEFINED_LAYOUT) newLayout = SRC_COMMAND; else { newLayout++; if (newLayout == UNDEFINED_LAYOUT) newLayout = SRC_COMMAND; } return newLayout; } /* _nextLayout */ /* ** _prevLayout(). ** Answer the next layout to cycle to. */ static enum tui_layout_type _prevLayout (void) { enum tui_layout_type newLayout; newLayout = tui_current_layout (); if (newLayout == SRC_COMMAND) newLayout = DISASSEM_DATA_COMMAND; else { newLayout--; if (newLayout == UNDEFINED_LAYOUT) newLayout = DISASSEM_DATA_COMMAND; } return newLayout; } /* _prevLayout */ /* ** _makeCommandWindow(). */ static void _makeCommandWindow (struct tui_win_info * * winInfoPtr, int height, int originY) { _initAndMakeWin ((void **) winInfoPtr, CMD_WIN, height, tui_term_width (), 0, originY, DONT_BOX_WINDOW); (*winInfoPtr)->can_highlight = FALSE; return; } /* _makeCommandWindow */ /* ** _makeSourceWindow(). */ static void _makeSourceWindow (struct tui_win_info * * winInfoPtr, int height, int originY) { _makeSourceOrDisassemWindow (winInfoPtr, SRC_WIN, height, originY); return; } /* _makeSourceWindow */ /* ** _makeDisassemWindow(). */ static void _makeDisassemWindow (struct tui_win_info * * winInfoPtr, int height, int originY) { _makeSourceOrDisassemWindow (winInfoPtr, DISASSEM_WIN, height, originY); return; } /* _makeDisassemWindow */ /* ** _makeDataWindow(). */ static void _makeDataWindow (struct tui_win_info * * winInfoPtr, int height, int originY) { _initAndMakeWin ((void **) winInfoPtr, DATA_WIN, height, tui_term_width (), 0, originY, BOX_WINDOW); return; } /* _makeDataWindow */ /* ** _showSourceCommand(). ** Show the Source/Command layout */ static void _showSourceCommand (void) { _showSourceOrDisassemAndCommand (SRC_COMMAND); return; } /* _showSourceCommand */ /* ** _showDisassemCommand(). ** Show the Dissassem/Command layout */ static void _showDisassemCommand (void) { _showSourceOrDisassemAndCommand (DISASSEM_COMMAND); return; } /* _showDisassemCommand */ /* ** _showSourceDisassemCommand(). ** Show the Source/Disassem/Command layout */ static void _showSourceDisassemCommand (void) { if (tui_current_layout () != SRC_DISASSEM_COMMAND) { int cmdHeight, srcHeight, asmHeight; if (TUI_CMD_WIN != NULL) cmdHeight = TUI_CMD_WIN->generic.height; else cmdHeight = tui_term_height () / 3; srcHeight = (tui_term_height () - cmdHeight) / 2; asmHeight = tui_term_height () - (srcHeight + cmdHeight); if (TUI_SRC_WIN == NULL) _makeSourceWindow (&TUI_SRC_WIN, srcHeight, 0); else { _initGenWinInfo (&TUI_SRC_WIN->generic, TUI_SRC_WIN->generic.type, srcHeight, TUI_SRC_WIN->generic.width, TUI_SRC_WIN->detail.source_info.execution_info->width, 0); TUI_SRC_WIN->can_highlight = TRUE; _initGenWinInfo (TUI_SRC_WIN->detail.source_info.execution_info, EXEC_INFO_WIN, srcHeight, 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) { _makeDisassemWindow (&TUI_DISASM_WIN, asmHeight, srcHeight - 1); _initAndMakeWin ((void **) & locator, LOCATOR_WIN, 2 /* 1 */ , tui_term_width (), 0, (srcHeight + asmHeight) - 1, DONT_BOX_WINDOW); } else { _initGenWinInfo (locator, LOCATOR_WIN, 2 /* 1 */ , tui_term_width (), 0, (srcHeight + asmHeight) - 1); TUI_DISASM_WIN->detail.source_info.has_locator = TRUE; _initGenWinInfo ( &TUI_DISASM_WIN->generic, TUI_DISASM_WIN->generic.type, asmHeight, TUI_DISASM_WIN->generic.width, TUI_DISASM_WIN->detail.source_info.execution_info->width, srcHeight - 1); _initGenWinInfo (TUI_DISASM_WIN->detail.source_info.execution_info, EXEC_INFO_WIN, asmHeight, 3, 0, srcHeight - 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) _makeCommandWindow (&TUI_CMD_WIN, cmdHeight, tui_term_height () - cmdHeight); else { _initGenWinInfo (&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); } return; } /* _showSourceDisassemCommand */ /* ** _showData(). ** Show the Source/Data/Command or the Dissassembly/Data/Command layout */ static void _showData (enum tui_layout_type newLayout) { int totalHeight = (tui_term_height () - TUI_CMD_WIN->generic.height); int srcHeight, dataHeight; enum tui_win_type winType; struct tui_gen_win_info * locator = tui_locator_win_info_ptr (); dataHeight = totalHeight / 2; srcHeight = totalHeight - dataHeight; tui_make_all_invisible (); tui_make_invisible (locator); _makeDataWindow (&TUI_DATA_WIN, dataHeight, 0); TUI_DATA_WIN->can_highlight = TRUE; if (newLayout == SRC_DATA_COMMAND) winType = SRC_WIN; else winType = DISASSEM_WIN; if (tui_win_list[winType] == NULL) { if (winType == SRC_WIN) _makeSourceWindow (&tui_win_list[winType], srcHeight, dataHeight - 1); else _makeDisassemWindow (&tui_win_list[winType], srcHeight, dataHeight - 1); _initAndMakeWin ((void **) & locator, LOCATOR_WIN, 2 /* 1 */ , tui_term_width (), 0, totalHeight - 1, DONT_BOX_WINDOW); } else { _initGenWinInfo (&tui_win_list[winType]->generic, tui_win_list[winType]->generic.type, srcHeight, tui_win_list[winType]->generic.width, tui_win_list[winType]->detail.source_info.execution_info->width, dataHeight - 1); _initGenWinInfo (tui_win_list[winType]->detail.source_info.execution_info, EXEC_INFO_WIN, srcHeight, 3, 0, dataHeight - 1); tui_make_visible (&tui_win_list[winType]->generic); tui_make_visible (tui_win_list[winType]->detail.source_info.execution_info); _initGenWinInfo (locator, LOCATOR_WIN, 2 /* 1 */ , tui_term_width (), 0, totalHeight - 1); } tui_win_list[winType]->detail.source_info.has_locator = TRUE; tui_make_visible (locator); tui_show_locator_content (); tui_add_to_source_windows (tui_win_list[winType]); tui_set_current_layout_to (newLayout); return; } /* _showData */ /* ** _initGenWinInfo(). */ static void _initGenWinInfo (struct tui_gen_win_info * winInfo, enum tui_win_type type, int height, int width, int originX, int originY) { int h = height; winInfo->type = type; winInfo->width = width; winInfo->height = h; if (h > 1) { winInfo->viewport_height = h - 1; if (winInfo->type != CMD_WIN) winInfo->viewport_height--; } else winInfo->viewport_height = 1; winInfo->origin.x = originX; winInfo->origin.y = originY; return; } /* _initGenWinInfo */ /* ** _initAndMakeWin(). */ static void _initAndMakeWin (void ** winInfoPtr, enum tui_win_type winType, int height, int width, int originX, int originY, int boxIt) { void *opaqueWinInfo = *winInfoPtr; struct tui_gen_win_info * generic; if (opaqueWinInfo == NULL) { if (tui_win_is_auxillary (winType)) opaqueWinInfo = (void *) tui_alloc_generic_win_info (); else opaqueWinInfo = (void *) tui_alloc_win_info (winType); } if (tui_win_is_auxillary (winType)) generic = (struct tui_gen_win_info *) opaqueWinInfo; else generic = &((struct tui_win_info *) opaqueWinInfo)->generic; if (opaqueWinInfo != NULL) { _initGenWinInfo (generic, winType, height, width, originX, originY); if (!tui_win_is_auxillary (winType)) { if (generic->type == CMD_WIN) ((struct tui_win_info *) opaqueWinInfo)->can_highlight = FALSE; else ((struct tui_win_info *) opaqueWinInfo)->can_highlight = TRUE; } tui_make_window (generic, boxIt); } *winInfoPtr = opaqueWinInfo; } /* ** _makeSourceOrDisassemWindow(). */ static void _makeSourceOrDisassemWindow (struct tui_win_info * * winInfoPtr, enum tui_win_type type, int height, int originY) { 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 (); _initAndMakeWin ((void **) & execution_info, EXEC_INFO_WIN, height, 3, 0, originY, DONT_BOX_WINDOW); /* ** Now create the source window. */ _initAndMakeWin ((void **) winInfoPtr, type, height, tui_term_width () - execution_info->width, execution_info->width, originY, BOX_WINDOW); (*winInfoPtr)->detail.source_info.execution_info = execution_info; return; } /* _makeSourceOrDisassemWindow */ /* ** _showSourceOrDisassemAndCommand(). ** Show the Source/Command or the Disassem layout */ static void _showSourceOrDisassemAndCommand (enum tui_layout_type layoutType) { if (tui_current_layout () != layoutType) { struct tui_win_info * *winInfoPtr; int srcHeight, cmdHeight; struct tui_gen_win_info * locator = tui_locator_win_info_ptr (); if (TUI_CMD_WIN != NULL) cmdHeight = TUI_CMD_WIN->generic.height; else cmdHeight = tui_term_height () / 3; srcHeight = tui_term_height () - cmdHeight; if (layoutType == SRC_COMMAND) winInfoPtr = &TUI_SRC_WIN; else winInfoPtr = &TUI_DISASM_WIN; if ((*winInfoPtr) == NULL) { if (layoutType == SRC_COMMAND) _makeSourceWindow (winInfoPtr, srcHeight - 1, 0); else _makeDisassemWindow (winInfoPtr, srcHeight - 1, 0); _initAndMakeWin ((void **) & locator, LOCATOR_WIN, 2 /* 1 */ , tui_term_width (), 0, srcHeight - 1, DONT_BOX_WINDOW); } else { _initGenWinInfo (locator, LOCATOR_WIN, 2 /* 1 */ , tui_term_width (), 0, srcHeight - 1); (*winInfoPtr)->detail.source_info.has_locator = TRUE; _initGenWinInfo ( &(*winInfoPtr)->generic, (*winInfoPtr)->generic.type, srcHeight - 1, (*winInfoPtr)->generic.width, (*winInfoPtr)->detail.source_info.execution_info->width, 0); _initGenWinInfo ((*winInfoPtr)->detail.source_info.execution_info, EXEC_INFO_WIN, srcHeight - 1, 3, 0, 0); (*winInfoPtr)->can_highlight = TRUE; tui_make_visible (&(*winInfoPtr)->generic); tui_make_visible ((*winInfoPtr)->detail.source_info.execution_info); } if ((*winInfoPtr) != NULL) { (*winInfoPtr)->detail.source_info.has_locator = TRUE; tui_make_visible (locator); tui_show_locator_content (); tui_show_source_content (*winInfoPtr); if (TUI_CMD_WIN == NULL) { _makeCommandWindow (&TUI_CMD_WIN, cmdHeight, srcHeight); tui_refresh_win (&TUI_CMD_WIN->generic); } else { _initGenWinInfo (&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 (layoutType); } return; } /* _showSourceOrDisassemAndCommand */