1999-04-16 03:35:26 +02:00
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** tuiLayout.c
|
|
|
|
** This module contains procedures for handling the layout of the windows.
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
|
|
#include "defs.h"
|
|
|
|
#include "command.h"
|
|
|
|
#include "symtab.h"
|
|
|
|
#include "frame.h"
|
|
|
|
|
|
|
|
#include "tui.h"
|
|
|
|
#include "tuiData.h"
|
|
|
|
#include "tuiGeneralWin.h"
|
|
|
|
#include "tuiStack.h"
|
|
|
|
#include "tuiRegs.h"
|
|
|
|
#include "tuiDisassem.h"
|
|
|
|
|
|
|
|
/*******************************
|
|
|
|
** Static Local Decls
|
|
|
|
********************************/
|
|
|
|
|
|
|
|
static void _initGenWinInfo PARAMS
|
|
|
|
((TuiGenWinInfoPtr, TuiWinType, int, int, int, int));
|
|
|
|
static void _initAndMakeWin PARAMS
|
|
|
|
((Opaque *, TuiWinType, int, int, int, int, int));
|
|
|
|
static void _showSourceOrDisassemAndCommand PARAMS
|
|
|
|
((TuiLayoutType));
|
|
|
|
static void _makeSourceOrDisassemWindow PARAMS
|
|
|
|
((TuiWinInfoPtr *, TuiWinType, int, int));
|
|
|
|
static void _makeCommandWindow PARAMS ((TuiWinInfoPtr *, int, int));
|
|
|
|
static void _makeSourceWindow PARAMS ((TuiWinInfoPtr *, int, int));
|
|
|
|
static void _makeDisassemWindow PARAMS
|
|
|
|
((TuiWinInfoPtr *, int, int));
|
|
|
|
static void _makeDataWindow PARAMS ((TuiWinInfoPtr *, int, int));
|
|
|
|
static void _showSourceCommand PARAMS ((void));
|
|
|
|
static void _showDisassemCommand PARAMS ((void));
|
|
|
|
static void _showSourceDisassemCommand PARAMS ((void));
|
|
|
|
static void _showData PARAMS ((TuiLayoutType));
|
|
|
|
static TuiLayoutType _nextLayout PARAMS ((void));
|
|
|
|
static TuiLayoutType _prevLayout PARAMS ((void));
|
|
|
|
static void _tuiLayout_command PARAMS ((char *, int));
|
|
|
|
static void _tuiToggleLayout_command PARAMS ((char *, int));
|
|
|
|
static void _tui_vToggleLayout_command PARAMS ((va_list));
|
|
|
|
static void _tuiToggleSplitLayout_command PARAMS ((char *, int));
|
|
|
|
static void _tui_vToggleSplitLayout_command PARAMS ((va_list));
|
|
|
|
static Opaque _extractDisplayStartAddr PARAMS ((void));
|
|
|
|
static void _tuiHandleXDBLayout PARAMS ((TuiLayoutDefPtr));
|
|
|
|
static TuiStatus _tuiSetLayoutTo PARAMS ((char *));
|
|
|
|
|
|
|
|
|
|
|
|
/***************************************
|
|
|
|
** DEFINITIONS
|
|
|
|
***************************************/
|
|
|
|
|
|
|
|
#define LAYOUT_USAGE "Usage: layout prev | next | <layout_name> \n"
|
|
|
|
|
|
|
|
/***************************************
|
|
|
|
** Static Local Data
|
|
|
|
***************************************/
|
|
|
|
static TuiLayoutType lastLayout = UNDEFINED_LAYOUT;
|
|
|
|
|
|
|
|
/***************************************
|
|
|
|
** PUBLIC FUNCTIONS
|
|
|
|
***************************************/
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** showLayout().
|
|
|
|
** Show the screen layout defined
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
void
|
|
|
|
#ifdef __STDC__
|
|
|
|
showLayout (
|
|
|
|
TuiLayoutType layout)
|
|
|
|
#else
|
|
|
|
showLayout (layout)
|
|
|
|
TuiLayoutType layout;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
TuiLayoutType curLayout = currentLayout ();
|
|
|
|
|
|
|
|
if (layout != curLayout)
|
|
|
|
{
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** Since the new layout may cause changes in window size, we
|
|
|
|
** should free the content and reallocate on next display of
|
|
|
|
** source/asm
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
tuiClearAllSourceWinsContent (NO_EMPTY_SOURCE_PROMPT);
|
|
|
|
freeAllSourceWinsContent ();
|
|
|
|
clearSourceWindows ();
|
|
|
|
if (layout == SRC_DATA_COMMAND || layout == DISASSEM_DATA_COMMAND)
|
|
|
|
{
|
|
|
|
_showData (layout);
|
|
|
|
refreshAll (winList);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* First make the current layout be invisible */
|
|
|
|
m_allBeInvisible ();
|
|
|
|
m_beInvisible (locatorWinInfoPtr ());
|
|
|
|
|
|
|
|
switch (layout)
|
|
|
|
{
|
|
|
|
/* Now show the new layout */
|
|
|
|
case SRC_COMMAND:
|
|
|
|
_showSourceCommand ();
|
|
|
|
addToSourceWindows (srcWin);
|
|
|
|
break;
|
|
|
|
case DISASSEM_COMMAND:
|
|
|
|
_showDisassemCommand ();
|
|
|
|
addToSourceWindows (disassemWin);
|
|
|
|
break;
|
|
|
|
case SRC_DISASSEM_COMMAND:
|
|
|
|
_showSourceDisassemCommand ();
|
|
|
|
addToSourceWindows (srcWin);
|
|
|
|
addToSourceWindows (disassemWin);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* showLayout */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** tuiSetLayout()
|
|
|
|
** 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 regsDisplayType.
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
TuiStatus
|
|
|
|
#ifdef __STDC__
|
|
|
|
tuiSetLayout (
|
|
|
|
TuiLayoutType layoutType,
|
|
|
|
TuiRegisterDisplayType regsDisplayType)
|
|
|
|
#else
|
|
|
|
tuiSetLayout (layoutType, regsDisplayType)
|
|
|
|
TuiLayoutType layoutType;
|
|
|
|
TuiRegisterDisplayType regsDisplayType;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
TuiStatus status = TUI_SUCCESS;
|
|
|
|
|
|
|
|
if (layoutType != UNDEFINED_LAYOUT || regsDisplayType != TUI_UNDEFINED_REGS)
|
|
|
|
{
|
|
|
|
TuiLayoutType curLayout = currentLayout (), newLayout = UNDEFINED_LAYOUT;
|
|
|
|
int regsPopulate = FALSE;
|
|
|
|
Opaque addr = _extractDisplayStartAddr ();
|
|
|
|
TuiWinInfoPtr newWinWithFocus = (TuiWinInfoPtr) NULL, winWithFocus = tuiWinWithFocus ();
|
|
|
|
TuiLayoutDefPtr layoutDef = tuiLayoutDef ();
|
|
|
|
|
|
|
|
|
|
|
|
if (layoutType == UNDEFINED_LAYOUT &&
|
|
|
|
regsDisplayType != 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 ||
|
|
|
|
regsDisplayType != TUI_UNDEFINED_REGS);
|
|
|
|
if (newLayout != curLayout || regsDisplayType != TUI_UNDEFINED_REGS)
|
|
|
|
{
|
|
|
|
if (newLayout != curLayout)
|
|
|
|
{
|
|
|
|
if (winWithFocus != cmdWin)
|
|
|
|
tuiClearWinFocus ();
|
|
|
|
showLayout (newLayout);
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** Now determine where focus should be
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
if (winWithFocus != cmdWin)
|
|
|
|
{
|
|
|
|
switch (newLayout)
|
|
|
|
{
|
|
|
|
case SRC_COMMAND:
|
|
|
|
tuiSetWinFocusTo (srcWin);
|
|
|
|
layoutDef->displayMode = SRC_WIN;
|
|
|
|
layoutDef->split = FALSE;
|
|
|
|
break;
|
|
|
|
case DISASSEM_COMMAND:
|
|
|
|
/* the previous layout was not showing
|
1999-07-07 22:19:36 +02:00
|
|
|
** 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!
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
addr = vcatch_errors ((OpaqueFuncPtr)
|
|
|
|
tuiGetBeginAsmAddress);
|
|
|
|
tuiSetWinFocusTo (disassemWin);
|
|
|
|
layoutDef->displayMode = DISASSEM_WIN;
|
|
|
|
layoutDef->split = FALSE;
|
|
|
|
break;
|
|
|
|
case SRC_DISASSEM_COMMAND:
|
|
|
|
/* the previous layout was not showing
|
1999-07-07 22:19:36 +02:00
|
|
|
** 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!
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
addr = vcatch_errors ((OpaqueFuncPtr)
|
|
|
|
tuiGetBeginAsmAddress);
|
|
|
|
if (winWithFocus == srcWin)
|
|
|
|
tuiSetWinFocusTo (srcWin);
|
|
|
|
else
|
|
|
|
tuiSetWinFocusTo (disassemWin);
|
|
|
|
layoutDef->split = TRUE;
|
|
|
|
break;
|
|
|
|
case SRC_DATA_COMMAND:
|
|
|
|
if (winWithFocus != dataWin)
|
|
|
|
tuiSetWinFocusTo (srcWin);
|
|
|
|
else
|
|
|
|
tuiSetWinFocusTo (dataWin);
|
|
|
|
layoutDef->displayMode = SRC_WIN;
|
|
|
|
layoutDef->split = FALSE;
|
|
|
|
break;
|
|
|
|
case DISASSEM_DATA_COMMAND:
|
|
|
|
/* the previous layout was not showing
|
1999-07-07 22:19:36 +02:00
|
|
|
** 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!
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
addr = vcatch_errors ((OpaqueFuncPtr)
|
|
|
|
tuiGetBeginAsmAddress);
|
|
|
|
if (winWithFocus != dataWin)
|
|
|
|
tuiSetWinFocusTo (disassemWin);
|
|
|
|
else
|
|
|
|
tuiSetWinFocusTo (dataWin);
|
|
|
|
layoutDef->displayMode = DISASSEM_WIN;
|
|
|
|
layoutDef->split = FALSE;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (newWinWithFocus != (TuiWinInfoPtr) NULL)
|
|
|
|
tuiSetWinFocusTo (newWinWithFocus);
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** Now update the window content
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
if (!regsPopulate &&
|
|
|
|
(newLayout == SRC_DATA_COMMAND ||
|
|
|
|
newLayout == DISASSEM_DATA_COMMAND))
|
|
|
|
tuiDisplayAllData ();
|
|
|
|
|
|
|
|
tuiUpdateSourceWindowsWithAddr (addr);
|
|
|
|
}
|
|
|
|
if (regsPopulate)
|
|
|
|
{
|
|
|
|
layoutDef->regsDisplayType =
|
|
|
|
(regsDisplayType == TUI_UNDEFINED_REGS ?
|
|
|
|
TUI_GENERAL_REGS : regsDisplayType);
|
|
|
|
tuiShowRegisters (layoutDef->regsDisplayType);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
status = TUI_FAILURE;
|
|
|
|
|
|
|
|
return status;
|
|
|
|
} /* tuiSetLayout */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** tui_vSetLayoutTo()
|
|
|
|
** Function to set the layout to SRC, ASM, SPLIT, NEXT, PREV, DATA,
|
|
|
|
** REGS, $REGS, $GREGS, $FREGS, $SREGS with arguments in a va_list
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
TuiStatus
|
|
|
|
#ifdef __STDC__
|
|
|
|
tui_vSetLayoutTo (
|
|
|
|
va_list args)
|
|
|
|
#else
|
|
|
|
tui_vSetLayoutTo (args)
|
|
|
|
va_list args;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
char *layoutName;
|
|
|
|
|
|
|
|
layoutName = va_arg (args, char *);
|
|
|
|
|
|
|
|
return (_tuiSetLayoutTo (layoutName));
|
|
|
|
} /* tui_vSetLayoutTo */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** tuiAddWinToLayout().
|
|
|
|
** 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.
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
void
|
|
|
|
#ifdef __STDC__
|
|
|
|
tuiAddWinToLayout (
|
|
|
|
TuiWinType type)
|
|
|
|
#else
|
|
|
|
tuiAddWinToLayout (type)
|
|
|
|
TuiWinType type;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
TuiLayoutType curLayout = currentLayout ();
|
|
|
|
|
|
|
|
switch (type)
|
|
|
|
{
|
|
|
|
case SRC_WIN:
|
|
|
|
if (curLayout != SRC_COMMAND &&
|
|
|
|
curLayout != SRC_DISASSEM_COMMAND &&
|
|
|
|
curLayout != SRC_DATA_COMMAND)
|
|
|
|
{
|
|
|
|
clearSourceWindowsDetail ();
|
|
|
|
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)
|
|
|
|
{
|
|
|
|
clearSourceWindowsDetail ();
|
|
|
|
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 */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** tui_vAddWinToLayout().
|
|
|
|
** Add the specified window to the layout in a logical way,
|
|
|
|
** with arguments in a va_list.
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
void
|
|
|
|
#ifdef __STDC__
|
|
|
|
tui_vAddWinToLayout (
|
|
|
|
va_list args)
|
|
|
|
#else
|
|
|
|
tui_vAddWinToLayout (args)
|
|
|
|
va_list args;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
TuiWinType type = va_arg (args, TuiWinType);
|
|
|
|
|
|
|
|
tuiAddWinToLayout (type);
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* tui_vAddWinToLayout */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** 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.
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
int
|
|
|
|
#ifdef __STDC__
|
|
|
|
tuiDefaultWinHeight (
|
|
|
|
TuiWinType type,
|
|
|
|
TuiLayoutType layout)
|
|
|
|
#else
|
|
|
|
tuiDefaultWinHeight (type, layout)
|
|
|
|
TuiWinType type;
|
|
|
|
TuiLayoutType layout;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
int h;
|
|
|
|
|
|
|
|
if (winList[type] != (TuiWinInfoPtr) NULL)
|
|
|
|
h = winList[type]->generic.height;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
switch (layout)
|
|
|
|
{
|
|
|
|
case SRC_COMMAND:
|
|
|
|
case DISASSEM_COMMAND:
|
|
|
|
if (m_winPtrIsNull (cmdWin))
|
|
|
|
h = termHeight () / 2;
|
|
|
|
else
|
|
|
|
h = termHeight () - cmdWin->generic.height;
|
|
|
|
break;
|
|
|
|
case SRC_DISASSEM_COMMAND:
|
|
|
|
case SRC_DATA_COMMAND:
|
|
|
|
case DISASSEM_DATA_COMMAND:
|
|
|
|
if (m_winPtrIsNull (cmdWin))
|
|
|
|
h = termHeight () / 3;
|
|
|
|
else
|
|
|
|
h = (termHeight () - cmdWin->generic.height) / 2;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
h = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return h;
|
|
|
|
} /* tuiDefaultWinHeight */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** tuiDefaultWinViewportHeight().
|
|
|
|
** 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.
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
int
|
|
|
|
#ifdef __STDC__
|
|
|
|
tuiDefaultWinViewportHeight (
|
|
|
|
TuiWinType type,
|
|
|
|
TuiLayoutType layout)
|
|
|
|
#else
|
|
|
|
tuiDefaultWinViewportHeight (type, layout)
|
|
|
|
TuiWinType type;
|
|
|
|
TuiLayoutType layout;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
int h;
|
|
|
|
|
|
|
|
h = tuiDefaultWinHeight (type, layout);
|
|
|
|
|
|
|
|
if (winList[type] == cmdWin)
|
|
|
|
h -= 1;
|
|
|
|
else
|
|
|
|
h -= 2;
|
|
|
|
|
|
|
|
return h;
|
|
|
|
} /* tuiDefaultWinViewportHeight */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** _initialize_tuiLayout().
|
|
|
|
** Function to initialize gdb commands, for tui window layout
|
|
|
|
** manipulation.
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
void
|
|
|
|
_initialize_tuiLayout ()
|
|
|
|
{
|
|
|
|
if (tui_version)
|
|
|
|
{
|
|
|
|
add_com ("layout", class_tui, _tuiLayout_command,
|
|
|
|
"Change the layout of windows.\n\
|
|
|
|
Usage: layout prev | next | <layout_name> \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");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* _intialize_tuiLayout */
|
|
|
|
|
|
|
|
|
|
|
|
/*************************
|
|
|
|
** STATIC LOCAL FUNCTIONS
|
|
|
|
**************************/
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** _tuiSetLayoutTo()
|
|
|
|
** Function to set the layout to SRC, ASM, SPLIT, NEXT, PREV, DATA, REGS,
|
|
|
|
** $REGS, $GREGS, $FREGS, $SREGS.
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
static TuiStatus
|
|
|
|
#ifdef __STDC__
|
|
|
|
_tuiSetLayoutTo (
|
|
|
|
char *layoutName)
|
|
|
|
#else
|
|
|
|
_tuiSetLayoutTo (layoutName)
|
|
|
|
char *layoutName;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
TuiStatus status = TUI_SUCCESS;
|
|
|
|
|
|
|
|
if (layoutName != (char *) NULL)
|
|
|
|
{
|
|
|
|
register int i;
|
|
|
|
register char *bufPtr;
|
|
|
|
TuiLayoutType newLayout = UNDEFINED_LAYOUT;
|
|
|
|
TuiRegisterDisplayType dpyType = TUI_UNDEFINED_REGS;
|
|
|
|
TuiLayoutType curLayout = currentLayout ();
|
|
|
|
|
|
|
|
bufPtr = (char *) tuiStrDup (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 (subsetCompare (bufPtr, "SRC"))
|
|
|
|
newLayout = SRC_COMMAND;
|
|
|
|
else if (subsetCompare (bufPtr, "ASM"))
|
|
|
|
newLayout = DISASSEM_COMMAND;
|
|
|
|
else if (subsetCompare (bufPtr, "SPLIT"))
|
|
|
|
newLayout = SRC_DISASSEM_COMMAND;
|
|
|
|
else if (subsetCompare (bufPtr, "REGS") ||
|
|
|
|
subsetCompare (bufPtr, TUI_GENERAL_SPECIAL_REGS_NAME) ||
|
|
|
|
subsetCompare (bufPtr, TUI_GENERAL_REGS_NAME) ||
|
|
|
|
subsetCompare (bufPtr, TUI_FLOAT_REGS_NAME) ||
|
|
|
|
subsetCompare (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 (subsetCompare (bufPtr, TUI_FLOAT_REGS_NAME))
|
|
|
|
{
|
|
|
|
if (dataWin->detail.dataDisplayInfo.regsDisplayType !=
|
|
|
|
TUI_SFLOAT_REGS &&
|
|
|
|
dataWin->detail.dataDisplayInfo.regsDisplayType !=
|
|
|
|
TUI_DFLOAT_REGS)
|
|
|
|
dpyType = TUI_SFLOAT_REGS;
|
|
|
|
else
|
|
|
|
dpyType =
|
|
|
|
dataWin->detail.dataDisplayInfo.regsDisplayType;
|
|
|
|
}
|
|
|
|
else if (subsetCompare (bufPtr,
|
|
|
|
TUI_GENERAL_SPECIAL_REGS_NAME))
|
|
|
|
dpyType = TUI_GENERAL_AND_SPECIAL_REGS;
|
|
|
|
else if (subsetCompare (bufPtr, TUI_GENERAL_REGS_NAME))
|
|
|
|
dpyType = TUI_GENERAL_REGS;
|
|
|
|
else if (subsetCompare (bufPtr, TUI_SPECIAL_REGS_NAME))
|
|
|
|
dpyType = TUI_SPECIAL_REGS;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (dataWin->detail.dataDisplayInfo.regsDisplayType !=
|
|
|
|
TUI_UNDEFINED_REGS)
|
|
|
|
dpyType =
|
|
|
|
dataWin->detail.dataDisplayInfo.regsDisplayType;
|
|
|
|
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 (subsetCompare (bufPtr, "NEXT"))
|
|
|
|
newLayout = _nextLayout ();
|
|
|
|
else if (subsetCompare (bufPtr, "PREV"))
|
|
|
|
newLayout = _prevLayout ();
|
|
|
|
else
|
|
|
|
status = TUI_FAILURE;
|
|
|
|
free (bufPtr);
|
|
|
|
|
|
|
|
tuiSetLayout (newLayout, dpyType);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
status = TUI_FAILURE;
|
|
|
|
|
|
|
|
return status;
|
|
|
|
} /* _tuiSetLayoutTo */
|
|
|
|
|
|
|
|
|
|
|
|
static Opaque
|
|
|
|
#ifdef __STDC__
|
|
|
|
_extractDisplayStartAddr (void)
|
|
|
|
#else
|
|
|
|
_extractDisplayStartAddr ()
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
TuiLayoutType curLayout = currentLayout ();
|
|
|
|
Opaque addr;
|
|
|
|
|
|
|
|
switch (curLayout)
|
|
|
|
{
|
|
|
|
case SRC_COMMAND:
|
|
|
|
case SRC_DATA_COMMAND:
|
|
|
|
addr = (Opaque) find_line_pc (
|
|
|
|
current_source_symtab,
|
|
|
|
srcWin->detail.sourceInfo.startLineOrAddr.lineNo);
|
|
|
|
break;
|
|
|
|
case DISASSEM_COMMAND:
|
|
|
|
case SRC_DISASSEM_COMMAND:
|
|
|
|
case DISASSEM_DATA_COMMAND:
|
|
|
|
addr = disassemWin->detail.sourceInfo.startLineOrAddr.addr;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
addr = (Opaque) NULL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return addr;
|
|
|
|
} /* _extractDisplayStartAddr */
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
#ifdef __STDC__
|
|
|
|
_tuiHandleXDBLayout (
|
|
|
|
TuiLayoutDefPtr layoutDef)
|
|
|
|
#else
|
|
|
|
_tuiHandleXDBLayout (layoutDef)
|
|
|
|
TuiLayoutDefPtr layoutDef;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
if (layoutDef->split)
|
|
|
|
{
|
|
|
|
tuiSetLayout (SRC_DISASSEM_COMMAND, TUI_UNDEFINED_REGS);
|
|
|
|
tuiSetWinFocusTo (winList[layoutDef->displayMode]);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (layoutDef->displayMode == SRC_WIN)
|
|
|
|
tuiSetLayout (SRC_COMMAND, TUI_UNDEFINED_REGS);
|
|
|
|
else
|
|
|
|
tuiSetLayout (DISASSEM_DATA_COMMAND, layoutDef->regsDisplayType);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* _tuiHandleXDBLayout */
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
#ifdef __STDC__
|
|
|
|
_tuiToggleLayout_command (
|
|
|
|
char *arg,
|
|
|
|
int fromTTY)
|
|
|
|
#else
|
|
|
|
_tuiToggleLayout_command (arg, fromTTY)
|
|
|
|
char *arg;
|
|
|
|
int fromTTY;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
tuiDo ((TuiOpaqueFuncPtr) _tui_vToggleLayout_command, arg, fromTTY);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
#ifdef __STDC__
|
|
|
|
_tui_vToggleLayout_command (
|
|
|
|
va_list args)
|
|
|
|
#else
|
|
|
|
_tui_vToggleLayout_command (args)
|
|
|
|
va_list args;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
TuiLayoutDefPtr layoutDef = tuiLayoutDef ();
|
|
|
|
|
|
|
|
if (layoutDef->displayMode == SRC_WIN)
|
|
|
|
layoutDef->displayMode = DISASSEM_WIN;
|
|
|
|
else
|
|
|
|
layoutDef->displayMode = SRC_WIN;
|
|
|
|
|
|
|
|
if (!layoutDef->split)
|
|
|
|
_tuiHandleXDBLayout (layoutDef);
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* _tuiToggleLayout_command */
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
#ifdef __STDC__
|
|
|
|
_tuiToggleSplitLayout_command (
|
|
|
|
char *arg,
|
|
|
|
int fromTTY)
|
|
|
|
#else
|
|
|
|
_tuiToggleSplitLayout_command (arg, fromTTY)
|
|
|
|
char *arg;
|
|
|
|
int fromTTY;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
tuiDo ((TuiOpaqueFuncPtr) _tui_vToggleSplitLayout_command, arg, fromTTY);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
#ifdef __STDC__
|
|
|
|
_tui_vToggleSplitLayout_command (
|
|
|
|
va_list args)
|
|
|
|
#else
|
|
|
|
_tui_vToggleSplitLayout_command (args)
|
|
|
|
va_list args;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
TuiLayoutDefPtr layoutDef = tuiLayoutDef ();
|
|
|
|
|
|
|
|
layoutDef->split = (!layoutDef->split);
|
|
|
|
_tuiHandleXDBLayout (layoutDef);
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* _tui_vToggleSplitLayout_command */
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
#ifdef __STDC__
|
|
|
|
_tuiLayout_command (
|
|
|
|
char *arg,
|
|
|
|
int fromTTY)
|
|
|
|
#else
|
|
|
|
_tuiLayout_command (arg, fromTTY)
|
|
|
|
char *arg;
|
|
|
|
int fromTTY;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
if ((TuiStatus) tuiDo (
|
|
|
|
(TuiOpaqueFuncPtr) tui_vSetLayoutTo, arg) != TUI_SUCCESS)
|
|
|
|
warning ("Invalid layout specified.\n%s" LAYOUT_USAGE);
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* _tuiLayout_command */
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** _nextLayout().
|
|
|
|
** Answer the previous layout to cycle to.
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
static TuiLayoutType
|
|
|
|
#ifdef __STDC__
|
|
|
|
_nextLayout (void)
|
|
|
|
#else
|
|
|
|
_nextLayout ()
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
TuiLayoutType newLayout;
|
|
|
|
|
|
|
|
newLayout = currentLayout ();
|
|
|
|
if (newLayout == UNDEFINED_LAYOUT)
|
|
|
|
newLayout = SRC_COMMAND;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
newLayout++;
|
|
|
|
if (newLayout == UNDEFINED_LAYOUT)
|
|
|
|
newLayout = SRC_COMMAND;
|
|
|
|
}
|
|
|
|
|
|
|
|
return newLayout;
|
|
|
|
} /* _nextLayout */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** _prevLayout().
|
|
|
|
** Answer the next layout to cycle to.
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
static TuiLayoutType
|
|
|
|
#ifdef __STDC__
|
|
|
|
_prevLayout (void)
|
|
|
|
#else
|
|
|
|
_prevLayout ()
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
TuiLayoutType newLayout;
|
|
|
|
|
|
|
|
newLayout = currentLayout ();
|
|
|
|
if (newLayout == SRC_COMMAND)
|
|
|
|
newLayout = DISASSEM_DATA_COMMAND;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
newLayout--;
|
|
|
|
if (newLayout == UNDEFINED_LAYOUT)
|
|
|
|
newLayout = DISASSEM_DATA_COMMAND;
|
|
|
|
}
|
|
|
|
|
|
|
|
return newLayout;
|
|
|
|
} /* _prevLayout */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** _makeCommandWindow().
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
static void
|
|
|
|
#ifdef __STDC__
|
|
|
|
_makeCommandWindow (
|
|
|
|
TuiWinInfoPtr * winInfoPtr,
|
|
|
|
int height,
|
|
|
|
int originY)
|
|
|
|
#else
|
|
|
|
_makeCommandWindow (winInfoPtr, height, originY)
|
|
|
|
TuiWinInfoPtr *winInfoPtr;
|
|
|
|
int height;
|
|
|
|
int originY;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
_initAndMakeWin ((Opaque *) winInfoPtr,
|
|
|
|
CMD_WIN,
|
|
|
|
height,
|
|
|
|
termWidth (),
|
|
|
|
0,
|
|
|
|
originY,
|
|
|
|
DONT_BOX_WINDOW);
|
|
|
|
|
|
|
|
(*winInfoPtr)->canHighlight = FALSE;
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* _makeCommandWindow */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** _makeSourceWindow().
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
static void
|
|
|
|
#ifdef __STDC__
|
|
|
|
_makeSourceWindow (
|
|
|
|
TuiWinInfoPtr * winInfoPtr,
|
|
|
|
int height,
|
|
|
|
int originY)
|
|
|
|
#else
|
|
|
|
_makeSourceWindow (winInfoPtr, height, originY)
|
|
|
|
TuiWinInfoPtr *winInfoPtr;
|
|
|
|
int height;
|
|
|
|
int originY;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
_makeSourceOrDisassemWindow (winInfoPtr, SRC_WIN, height, originY);
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* _makeSourceWindow */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** _makeDisassemWindow().
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
static void
|
|
|
|
#ifdef __STDC__
|
|
|
|
_makeDisassemWindow (
|
|
|
|
TuiWinInfoPtr * winInfoPtr,
|
|
|
|
int height,
|
|
|
|
int originY)
|
|
|
|
#else
|
|
|
|
_makeDisassemWindow (winInfoPtr, height, originY)
|
|
|
|
TuiWinInfoPtr *winInfoPtr;
|
|
|
|
int height;
|
|
|
|
int originY;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
_makeSourceOrDisassemWindow (winInfoPtr, DISASSEM_WIN, height, originY);
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* _makeDisassemWindow */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** _makeDataWindow().
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
static void
|
|
|
|
#ifdef __STDC__
|
|
|
|
_makeDataWindow (
|
|
|
|
TuiWinInfoPtr * winInfoPtr,
|
|
|
|
int height,
|
|
|
|
int originY)
|
|
|
|
#else
|
|
|
|
_makeDataWindow (winInfoPtr, height, originY)
|
|
|
|
TuiWinInfoPtr *winInfoPtr;
|
|
|
|
int height;
|
|
|
|
int originY;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
_initAndMakeWin ((Opaque *) winInfoPtr,
|
|
|
|
DATA_WIN,
|
|
|
|
height,
|
|
|
|
termWidth (),
|
|
|
|
0,
|
|
|
|
originY,
|
|
|
|
BOX_WINDOW);
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* _makeDataWindow */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** _showSourceCommand().
|
|
|
|
** Show the Source/Command layout
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
static void
|
|
|
|
#ifdef __STDC__
|
|
|
|
_showSourceCommand (void)
|
|
|
|
#else
|
|
|
|
_showSourceCommand ()
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
_showSourceOrDisassemAndCommand (SRC_COMMAND);
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* _showSourceCommand */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** _showDisassemCommand().
|
|
|
|
** Show the Dissassem/Command layout
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
static void
|
|
|
|
#ifdef __STDC__
|
|
|
|
_showDisassemCommand (void)
|
|
|
|
#else
|
|
|
|
_showDisassemCommand ()
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
_showSourceOrDisassemAndCommand (DISASSEM_COMMAND);
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* _showDisassemCommand */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** _showSourceDisassemCommand().
|
|
|
|
** Show the Source/Disassem/Command layout
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
static void
|
|
|
|
#ifdef __STDC__
|
|
|
|
_showSourceDisassemCommand (void)
|
|
|
|
#else
|
|
|
|
_showSourceDisassemCommand ()
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
|
|
|
|
|
|
|
|
if (currentLayout () != SRC_DISASSEM_COMMAND)
|
|
|
|
{
|
|
|
|
int cmdHeight, srcHeight, asmHeight;
|
|
|
|
|
|
|
|
if (m_winPtrNotNull (cmdWin))
|
|
|
|
cmdHeight = cmdWin->generic.height;
|
|
|
|
else
|
|
|
|
cmdHeight = termHeight () / 3;
|
|
|
|
|
|
|
|
srcHeight = (termHeight () - cmdHeight) / 2;
|
|
|
|
asmHeight = termHeight () - (srcHeight + cmdHeight);
|
|
|
|
|
|
|
|
if (m_winPtrIsNull (srcWin))
|
|
|
|
_makeSourceWindow (&srcWin, srcHeight, 0);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_initGenWinInfo (&srcWin->generic,
|
|
|
|
srcWin->generic.type,
|
|
|
|
srcHeight,
|
|
|
|
srcWin->generic.width,
|
|
|
|
srcWin->detail.sourceInfo.executionInfo->width,
|
|
|
|
0);
|
|
|
|
srcWin->canHighlight = TRUE;
|
|
|
|
_initGenWinInfo (srcWin->detail.sourceInfo.executionInfo,
|
|
|
|
EXEC_INFO_WIN,
|
|
|
|
srcHeight,
|
|
|
|
3,
|
|
|
|
0,
|
|
|
|
0);
|
|
|
|
m_beVisible (srcWin);
|
|
|
|
m_beVisible (srcWin->detail.sourceInfo.executionInfo);
|
|
|
|
srcWin->detail.sourceInfo.hasLocator = FALSE;;
|
|
|
|
}
|
|
|
|
if (m_winPtrNotNull (srcWin))
|
|
|
|
{
|
|
|
|
TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
|
|
|
|
|
|
|
|
tuiShowSourceContent (srcWin);
|
|
|
|
if (m_winPtrIsNull (disassemWin))
|
|
|
|
{
|
|
|
|
_makeDisassemWindow (&disassemWin, asmHeight, srcHeight - 1);
|
|
|
|
_initAndMakeWin ((Opaque *) & locator,
|
|
|
|
LOCATOR_WIN,
|
|
|
|
2 /* 1 */ ,
|
|
|
|
termWidth (),
|
|
|
|
0,
|
|
|
|
(srcHeight + asmHeight) - 1,
|
|
|
|
DONT_BOX_WINDOW);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_initGenWinInfo (locator,
|
|
|
|
LOCATOR_WIN,
|
|
|
|
2 /* 1 */ ,
|
|
|
|
termWidth (),
|
|
|
|
0,
|
|
|
|
(srcHeight + asmHeight) - 1);
|
|
|
|
disassemWin->detail.sourceInfo.hasLocator = TRUE;
|
|
|
|
_initGenWinInfo (
|
|
|
|
&disassemWin->generic,
|
|
|
|
disassemWin->generic.type,
|
|
|
|
asmHeight,
|
|
|
|
disassemWin->generic.width,
|
|
|
|
disassemWin->detail.sourceInfo.executionInfo->width,
|
|
|
|
srcHeight - 1);
|
|
|
|
_initGenWinInfo (disassemWin->detail.sourceInfo.executionInfo,
|
|
|
|
EXEC_INFO_WIN,
|
|
|
|
asmHeight,
|
|
|
|
3,
|
|
|
|
0,
|
|
|
|
srcHeight - 1);
|
|
|
|
disassemWin->canHighlight = TRUE;
|
|
|
|
m_beVisible (disassemWin);
|
|
|
|
m_beVisible (disassemWin->detail.sourceInfo.executionInfo);
|
|
|
|
}
|
|
|
|
if (m_winPtrNotNull (disassemWin))
|
|
|
|
{
|
|
|
|
srcWin->detail.sourceInfo.hasLocator = FALSE;
|
|
|
|
disassemWin->detail.sourceInfo.hasLocator = TRUE;
|
|
|
|
m_beVisible (locator);
|
|
|
|
tuiShowLocatorContent ();
|
|
|
|
tuiShowSourceContent (disassemWin);
|
|
|
|
|
|
|
|
if (m_winPtrIsNull (cmdWin))
|
|
|
|
_makeCommandWindow (&cmdWin,
|
|
|
|
cmdHeight,
|
|
|
|
termHeight () - cmdHeight);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_initGenWinInfo (&cmdWin->generic,
|
|
|
|
cmdWin->generic.type,
|
|
|
|
cmdWin->generic.height,
|
|
|
|
cmdWin->generic.width,
|
|
|
|
0,
|
|
|
|
cmdWin->generic.origin.y);
|
|
|
|
cmdWin->canHighlight = FALSE;
|
|
|
|
m_beVisible (cmdWin);
|
|
|
|
}
|
|
|
|
if (m_winPtrNotNull (cmdWin))
|
|
|
|
tuiRefreshWin (&cmdWin->generic);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
setCurrentLayoutTo (SRC_DISASSEM_COMMAND);
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* _showSourceDisassemCommand */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** _showData().
|
|
|
|
** Show the Source/Data/Command or the Dissassembly/Data/Command layout
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
static void
|
|
|
|
#ifdef __STDC__
|
|
|
|
_showData (
|
|
|
|
TuiLayoutType newLayout)
|
|
|
|
#else
|
|
|
|
_showData (newLayout)
|
|
|
|
TuiLayoutType newLayout;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
int totalHeight = (termHeight () - cmdWin->generic.height);
|
|
|
|
int srcHeight, dataHeight;
|
|
|
|
TuiWinType winType;
|
|
|
|
TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
|
|
|
|
|
|
|
|
|
|
|
|
dataHeight = totalHeight / 2;
|
|
|
|
srcHeight = totalHeight - dataHeight;
|
|
|
|
m_allBeInvisible ();
|
|
|
|
m_beInvisible (locator);
|
|
|
|
_makeDataWindow (&dataWin, dataHeight, 0);
|
|
|
|
dataWin->canHighlight = TRUE;
|
|
|
|
if (newLayout == SRC_DATA_COMMAND)
|
|
|
|
winType = SRC_WIN;
|
|
|
|
else
|
|
|
|
winType = DISASSEM_WIN;
|
|
|
|
if (m_winPtrIsNull (winList[winType]))
|
|
|
|
{
|
|
|
|
if (winType == SRC_WIN)
|
|
|
|
_makeSourceWindow (&winList[winType], srcHeight, dataHeight - 1);
|
|
|
|
else
|
|
|
|
_makeDisassemWindow (&winList[winType], srcHeight, dataHeight - 1);
|
|
|
|
_initAndMakeWin ((Opaque *) & locator,
|
|
|
|
LOCATOR_WIN,
|
|
|
|
2 /* 1 */ ,
|
|
|
|
termWidth (),
|
|
|
|
0,
|
|
|
|
totalHeight - 1,
|
|
|
|
DONT_BOX_WINDOW);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_initGenWinInfo (&winList[winType]->generic,
|
|
|
|
winList[winType]->generic.type,
|
|
|
|
srcHeight,
|
|
|
|
winList[winType]->generic.width,
|
|
|
|
winList[winType]->detail.sourceInfo.executionInfo->width,
|
|
|
|
dataHeight - 1);
|
|
|
|
_initGenWinInfo (winList[winType]->detail.sourceInfo.executionInfo,
|
|
|
|
EXEC_INFO_WIN,
|
|
|
|
srcHeight,
|
|
|
|
3,
|
|
|
|
0,
|
|
|
|
dataHeight - 1);
|
|
|
|
m_beVisible (winList[winType]);
|
|
|
|
m_beVisible (winList[winType]->detail.sourceInfo.executionInfo);
|
|
|
|
_initGenWinInfo (locator,
|
|
|
|
LOCATOR_WIN,
|
|
|
|
2 /* 1 */ ,
|
|
|
|
termWidth (),
|
|
|
|
0,
|
|
|
|
totalHeight - 1);
|
|
|
|
}
|
|
|
|
winList[winType]->detail.sourceInfo.hasLocator = TRUE;
|
|
|
|
m_beVisible (locator);
|
|
|
|
tuiShowLocatorContent ();
|
|
|
|
addToSourceWindows (winList[winType]);
|
|
|
|
setCurrentLayoutTo (newLayout);
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* _showData */
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** _initGenWinInfo().
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
static void
|
|
|
|
#ifdef __STDC__
|
|
|
|
_initGenWinInfo (
|
|
|
|
TuiGenWinInfoPtr winInfo,
|
|
|
|
TuiWinType type,
|
|
|
|
int height,
|
|
|
|
int width,
|
|
|
|
int originX,
|
|
|
|
int originY)
|
|
|
|
#else
|
|
|
|
_initGenWinInfo (winInfo, type, height, width, originX, originY)
|
|
|
|
TuiGenWinInfoPtr winInfo;
|
|
|
|
TuiWinType type;
|
|
|
|
int height;
|
|
|
|
int width;
|
|
|
|
int originX;
|
|
|
|
int originY;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
int h = height;
|
|
|
|
|
|
|
|
winInfo->type = type;
|
|
|
|
winInfo->width = width;
|
|
|
|
winInfo->height = h;
|
|
|
|
if (h > 1)
|
|
|
|
{
|
|
|
|
winInfo->viewportHeight = h - 1;
|
|
|
|
if (winInfo->type != CMD_WIN)
|
|
|
|
winInfo->viewportHeight--;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
winInfo->viewportHeight = 1;
|
|
|
|
winInfo->origin.x = originX;
|
|
|
|
winInfo->origin.y = originY;
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* _initGenWinInfo */
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** _initAndMakeWin().
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
static void
|
|
|
|
#ifdef __STDC__
|
|
|
|
_initAndMakeWin (
|
|
|
|
Opaque * winInfoPtr,
|
|
|
|
TuiWinType winType,
|
|
|
|
int height,
|
|
|
|
int width,
|
|
|
|
int originX,
|
|
|
|
int originY,
|
|
|
|
int boxIt)
|
|
|
|
#else
|
|
|
|
_initAndMakeWin (winInfoPtr, winType, height, width, originX, originY, boxIt)
|
|
|
|
Opaque *winInfoPtr;
|
|
|
|
TuiWinType winType;
|
|
|
|
int height;
|
|
|
|
int width;
|
|
|
|
int originX;
|
|
|
|
int originY;
|
|
|
|
int boxIt;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
Opaque opaqueWinInfo = *winInfoPtr;
|
|
|
|
TuiGenWinInfoPtr generic;
|
|
|
|
|
|
|
|
if (opaqueWinInfo == (Opaque) NULL)
|
|
|
|
{
|
|
|
|
if (m_winIsAuxillary (winType))
|
|
|
|
opaqueWinInfo = (Opaque) allocGenericWinInfo ();
|
|
|
|
else
|
|
|
|
opaqueWinInfo = (Opaque) allocWinInfo (winType);
|
|
|
|
}
|
|
|
|
if (m_winIsAuxillary (winType))
|
|
|
|
generic = (TuiGenWinInfoPtr) opaqueWinInfo;
|
|
|
|
else
|
|
|
|
generic = &((TuiWinInfoPtr) opaqueWinInfo)->generic;
|
|
|
|
|
|
|
|
if (opaqueWinInfo != (Opaque) NULL)
|
|
|
|
{
|
|
|
|
_initGenWinInfo (generic, winType, height, width, originX, originY);
|
|
|
|
if (!m_winIsAuxillary (winType))
|
|
|
|
{
|
|
|
|
if (generic->type == CMD_WIN)
|
|
|
|
((TuiWinInfoPtr) opaqueWinInfo)->canHighlight = FALSE;
|
|
|
|
else
|
|
|
|
((TuiWinInfoPtr) opaqueWinInfo)->canHighlight = TRUE;
|
|
|
|
}
|
|
|
|
makeWindow (generic, boxIt);
|
|
|
|
if (winType == LOCATOR_WIN)
|
|
|
|
tuiClearLocatorDisplay ();
|
|
|
|
echo ();
|
|
|
|
}
|
|
|
|
*winInfoPtr = opaqueWinInfo;
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* _initAndMakeWin */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** _makeSourceOrDisassemWindow().
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
static void
|
|
|
|
#ifdef __STDC__
|
|
|
|
_makeSourceOrDisassemWindow (
|
|
|
|
TuiWinInfoPtr * winInfoPtr,
|
|
|
|
TuiWinType type,
|
|
|
|
int height,
|
|
|
|
int originY)
|
|
|
|
#else
|
|
|
|
_makeSourceOrDisassemWindow (winInfoPtr, type, height, originY)
|
|
|
|
TuiWinInfoPtr *winInfoPtr;
|
|
|
|
TuiWinType type;
|
|
|
|
int height;
|
|
|
|
int originY;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
TuiGenWinInfoPtr executionInfo = (TuiGenWinInfoPtr) NULL;
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** Create the exeuction info window.
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
if (type == SRC_WIN)
|
|
|
|
executionInfo = sourceExecInfoWinPtr ();
|
|
|
|
else
|
|
|
|
executionInfo = disassemExecInfoWinPtr ();
|
|
|
|
_initAndMakeWin ((Opaque *) & executionInfo,
|
|
|
|
EXEC_INFO_WIN,
|
|
|
|
height,
|
|
|
|
3,
|
|
|
|
0,
|
|
|
|
originY,
|
|
|
|
DONT_BOX_WINDOW);
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** Now create the source window.
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
_initAndMakeWin ((Opaque *) winInfoPtr,
|
|
|
|
type,
|
|
|
|
height,
|
|
|
|
termWidth () - executionInfo->width,
|
|
|
|
executionInfo->width,
|
|
|
|
originY,
|
|
|
|
BOX_WINDOW);
|
|
|
|
|
|
|
|
(*winInfoPtr)->detail.sourceInfo.executionInfo = executionInfo;
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* _makeSourceOrDisassemWindow */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
1999-07-07 22:19:36 +02:00
|
|
|
** _showSourceOrDisassemAndCommand().
|
|
|
|
** Show the Source/Command or the Disassem layout
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
static void
|
|
|
|
#ifdef __STDC__
|
|
|
|
_showSourceOrDisassemAndCommand (
|
|
|
|
TuiLayoutType layoutType)
|
|
|
|
#else
|
|
|
|
_showSourceOrDisassemAndCommand (layoutType)
|
|
|
|
TuiLayoutType layoutType;
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
if (currentLayout () != layoutType)
|
|
|
|
{
|
|
|
|
TuiWinInfoPtr *winInfoPtr;
|
|
|
|
int areaLeft;
|
|
|
|
int srcHeight, cmdHeight;
|
|
|
|
TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
|
|
|
|
|
|
|
|
if (m_winPtrNotNull (cmdWin))
|
|
|
|
cmdHeight = cmdWin->generic.height;
|
|
|
|
else
|
|
|
|
cmdHeight = termHeight () / 3;
|
|
|
|
srcHeight = termHeight () - cmdHeight;
|
|
|
|
|
|
|
|
|
|
|
|
if (layoutType == SRC_COMMAND)
|
|
|
|
winInfoPtr = &srcWin;
|
|
|
|
else
|
|
|
|
winInfoPtr = &disassemWin;
|
|
|
|
|
|
|
|
if (m_winPtrIsNull (*winInfoPtr))
|
|
|
|
{
|
|
|
|
if (layoutType == SRC_COMMAND)
|
|
|
|
_makeSourceWindow (winInfoPtr, srcHeight - 1, 0);
|
|
|
|
else
|
|
|
|
_makeDisassemWindow (winInfoPtr, srcHeight - 1, 0);
|
|
|
|
_initAndMakeWin ((Opaque *) & locator,
|
|
|
|
LOCATOR_WIN,
|
|
|
|
2 /* 1 */ ,
|
|
|
|
termWidth (),
|
|
|
|
0,
|
|
|
|
srcHeight - 1,
|
|
|
|
DONT_BOX_WINDOW);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_initGenWinInfo (locator,
|
|
|
|
LOCATOR_WIN,
|
|
|
|
2 /* 1 */ ,
|
|
|
|
termWidth (),
|
|
|
|
0,
|
|
|
|
srcHeight - 1);
|
|
|
|
(*winInfoPtr)->detail.sourceInfo.hasLocator = TRUE;
|
|
|
|
_initGenWinInfo (
|
|
|
|
&(*winInfoPtr)->generic,
|
|
|
|
(*winInfoPtr)->generic.type,
|
|
|
|
srcHeight - 1,
|
|
|
|
(*winInfoPtr)->generic.width,
|
|
|
|
(*winInfoPtr)->detail.sourceInfo.executionInfo->width,
|
|
|
|
0);
|
|
|
|
_initGenWinInfo ((*winInfoPtr)->detail.sourceInfo.executionInfo,
|
|
|
|
EXEC_INFO_WIN,
|
|
|
|
srcHeight - 1,
|
|
|
|
3,
|
|
|
|
0,
|
|
|
|
0);
|
|
|
|
(*winInfoPtr)->canHighlight = TRUE;
|
|
|
|
m_beVisible (*winInfoPtr);
|
|
|
|
m_beVisible ((*winInfoPtr)->detail.sourceInfo.executionInfo);
|
|
|
|
}
|
|
|
|
if (m_winPtrNotNull (*winInfoPtr))
|
|
|
|
{
|
|
|
|
(*winInfoPtr)->detail.sourceInfo.hasLocator = TRUE;
|
|
|
|
m_beVisible (locator);
|
|
|
|
tuiShowLocatorContent ();
|
|
|
|
tuiShowSourceContent (*winInfoPtr);
|
|
|
|
|
|
|
|
if (m_winPtrIsNull (cmdWin))
|
|
|
|
{
|
|
|
|
_makeCommandWindow (&cmdWin, cmdHeight, srcHeight);
|
|
|
|
tuiRefreshWin (&cmdWin->generic);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_initGenWinInfo (&cmdWin->generic,
|
|
|
|
cmdWin->generic.type,
|
|
|
|
cmdWin->generic.height,
|
|
|
|
cmdWin->generic.width,
|
|
|
|
cmdWin->generic.origin.x,
|
|
|
|
cmdWin->generic.origin.y);
|
|
|
|
cmdWin->canHighlight = FALSE;
|
|
|
|
m_beVisible (cmdWin);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
setCurrentLayoutTo (layoutType);
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
} /* _showSourceOrDisassemAndCommand */
|