windows-nt/Source/XPSP1/NT/sdktools/debuggers/windbg/cmnwin.h
2020-09-26 16:20:57 +08:00

510 lines
12 KiB
C++

/*++
Copyright (c) 1992-2001 Microsoft Corporation
Module Name:
cmnwin.h
Abstract:
Header for common window architecture functions.
Environment:
Win32, User Mode
--*/
// Millisecond delay value before evaluating input in
// edit boxes. Required because there's only a per-character
// change notification and we don't want to reevaluate on
// every character.
#define EDIT_DELAY 500
// Several windows have edit boxes for entering offset
// expressions.
#define MAX_OFFSET_EXPR (MAX_PATH + 64)
//
// Window-related options.
//
#define WOPT_AUTO_ARRANGE 0x00000001
#define WOPT_ARRANGE_ALL 0x00000002
#define WOPT_AUTO_DISASM 0x00000004
#define WOPT_OVERLAY_SOURCE 0x00000008
extern ULONG g_WinOptions;
extern ULONG g_AutoArrangeWarningCount;
enum
{
FONT_FIXED,
FONT_VARIABLE,
FONT_COUNT
};
struct INDEXED_FONT
{
HFONT Font;
TEXTMETRIC Metrics;
LOGFONT LogFont;
BOOL LogFontSet;
};
extern INDEXED_FONT g_Fonts[];
#define LINE_MARKERS 2
extern BOOL g_LineMarkers;
//----------------------------------------------------------------------------
//
// COMMONWIN_DATA and family.
//
//----------------------------------------------------------------------------
// List of all commonwin's still associated with an HWND.
// This list entry is a member of the commonwin and is
// different from the derivation list entry. Use
// the ACTIVE_WIN_ENTRY macro to get from an entry to
// the actual commonwin.
extern LIST_ENTRY g_ActiveWin;
#define ACTIVE_WIN_ENTRY(Entry) \
((PCOMMONWIN_DATA) \
((PUCHAR)(Entry) - FIELD_OFFSET(COMMONWIN_DATA, m_ActiveWin)))
struct COMMONWIN_CREATE_DATA
{
WIN_TYPES Type;
};
//
// Data common to all window structures
//
class COMMONWIN_DATA : public StateBuffer
{
public:
LIST_ENTRY m_ActiveWin;
SIZEL m_Size;
ULONG m_CausedArrange;
ULONG m_InAutoOp;
INDEXED_FONT* m_Font;
// Height of current font.
ULONG m_FontHeight;
// Height of window in lines of the current font, rounded down.
ULONG m_LineHeight;
// Toolbar if this window has one.
HWND m_Toolbar;
BOOL m_ShowToolbar;
int m_ToolbarHeight;
int m_MinToolbarWidth;
HWND m_ToolbarEdit;
COMMONWIN_DATA(ULONG ChangeBy);
virtual void Validate();
virtual void SetFont(ULONG FontIndex);
virtual BOOL CanCopy();
virtual BOOL CanCut();
virtual BOOL CanPaste();
virtual void Copy();
virtual void Cut();
virtual void Paste();
virtual BOOL CanSelectAll();
virtual void SelectAll();
virtual BOOL HasEditableProperties();
virtual BOOL EditProperties();
virtual HMENU GetContextMenu(void);
virtual void OnContextMenuSelection(UINT Item);
virtual BOOL CanGotoLine(void);
virtual void GotoLine(ULONG Line);
virtual void Find(PTSTR Text, ULONG Flags);
virtual BOOL CodeExprAtCaret(PSTR Expr, PULONG64 Offset);
virtual void ToggleBpAtCaret(void);
// Functions called in response to WM messages
virtual BOOL OnCreate(void);
virtual LRESULT OnCommand(WPARAM wParam, LPARAM lParam);
virtual void OnSetFocus(void);
virtual void OnSize(void);
virtual void OnButtonDown(ULONG Button);
virtual void OnButtonUp(ULONG Button);
virtual void OnMouseMove(ULONG Modifiers, ULONG X, ULONG Y);
virtual void OnTimer(WPARAM TimerId);
virtual LRESULT OnGetMinMaxInfo(LPMINMAXINFO Info);
virtual LRESULT OnVKeyToItem(WPARAM wParam, LPARAM lParam);
virtual LRESULT OnNotify(WPARAM wParam, LPARAM lParam);
virtual void OnUpdate(UpdateType Type);
virtual void OnDestroy(void);
virtual LRESULT OnOwnerDraw(UINT uMsg, WPARAM wParam, LPARAM lParam);
virtual ULONG GetWorkspaceSize(void);
virtual PUCHAR SetWorkspace(PUCHAR Data);
virtual PUCHAR ApplyWorkspace1(PUCHAR Data, PUCHAR End);
virtual void UpdateColors(void);
void UpdateSize(ULONG Width, ULONG Height);
void SetShowToolbar(BOOL Show);
static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg,
WPARAM wParam, LPARAM lParam);
};
typedef COMMONWIN_DATA *PCOMMONWIN_DATA;
//
// Data common to all window structures
// that only have one child
//
class SINGLE_CHILDWIN_DATA : public COMMONWIN_DATA
{
public:
HWND m_hwndChild;
SINGLE_CHILDWIN_DATA(ULONG ChangeBy);
virtual void Validate();
virtual void SetFont(ULONG FontIndex);
virtual BOOL CanCopy();
virtual BOOL CanCut();
virtual BOOL CanPaste();
virtual void Copy();
virtual void Cut();
virtual void Paste();
// Functions called in response to WM messages
virtual void OnSetFocus(void);
virtual void OnSize(void);
};
typedef SINGLE_CHILDWIN_DATA *PSINGLE_CHILDWIN_DATA;
#define IDC_PROCESS_TREE 1234
class PROCESS_THREAD_DATA : public SINGLE_CHILDWIN_DATA
{
public:
// Set in ReadState.
ULONG m_NumProcesses, m_TotalThreads;
PROCESS_THREAD_DATA();
virtual void Validate();
virtual HRESULT ReadState(void);
virtual BOOL OnCreate(void);
virtual LRESULT OnNotify(WPARAM wParam, LPARAM lParam);
virtual void OnUpdate(UpdateType Type);
void SetCurThreadFromProcessTreeItem(HWND Tree, HTREEITEM Sel);
};
typedef PROCESS_THREAD_DATA *PPROCESS_THREAD_DATA;
#define EHL_CURRENT_LINE 0x00000001
#define EHL_ENABLED_BP 0x00000002
#define EHL_DISABLED_BP 0x00000004
#define EHL_ANY_BP (EHL_ENABLED_BP | EHL_DISABLED_BP)
struct EDIT_HIGHLIGHT
{
EDIT_HIGHLIGHT* Next;
ULONG64 Data;
ULONG Line;
ULONG Flags;
};
class EDITWIN_DATA : public SINGLE_CHILDWIN_DATA
{
public:
// Total number of lines in the edit window.
ULONG m_TextLines;
EDIT_HIGHLIGHT* m_Highlights;
EDITWIN_DATA(ULONG ChangeBy);
virtual void Validate();
virtual void SetFont(ULONG FontIndex);
virtual BOOL CanSelectAll();
virtual void SelectAll();
virtual BOOL OnCreate(void);
virtual LRESULT OnNotify(WPARAM wParam, LPARAM lParam);
virtual void OnDestroy(void);
virtual void UpdateColors(void);
void SetCurrentLineHighlight(ULONG Line);
void RemoveCurrentLineHighlight(void)
{
SetCurrentLineHighlight(ULONG_MAX);
}
EDIT_HIGHLIGHT* GetLineHighlighting(ULONG Line);
void ApplyHighlight(EDIT_HIGHLIGHT* Hl);
EDIT_HIGHLIGHT* AddHighlight(ULONG Line, ULONG Flags);
void RemoveHighlight(ULONG Line, ULONG Flags);
void RemoveAllHighlights(ULONG Flags);
static void RemoveActiveWinHighlights(ULONG Types, ULONG Flags);
// Base implementation does nothing.
virtual void UpdateBpMarks(void);
int CheckForFileChanges(PCSTR File, FILETIME* LastWrite);
};
typedef EDITWIN_DATA *PEDITWIN_DATA;
class SCRATCH_PAD_DATA : public EDITWIN_DATA
{
public:
SCRATCH_PAD_DATA();
virtual void Validate();
virtual void Cut();
virtual void Paste();
virtual BOOL OnCreate(void);
};
typedef SCRATCH_PAD_DATA *PSCRATCH_PAD_DATA;
#define IDC_DISASM_PREVIOUS 1234
#define IDC_DISASM_NEXT 1235
class DISASMWIN_DATA : public EDITWIN_DATA
{
public:
char m_OffsetExpr[MAX_OFFSET_EXPR];
BOOL m_UpdateExpr;
HWND m_PreviousButton;
HWND m_NextButton;
// Set in ReadState.
ULONG64 m_FirstInstr;
ULONG64 m_PrimaryInstr;
ULONG64 m_LastInstr;
ULONG m_PrimaryLine;
ULONG m_TextOffset;
DISASMWIN_DATA();
virtual void Validate();
virtual HRESULT ReadState(void);
virtual BOOL CodeExprAtCaret(PSTR Expr, PULONG64 Offset);
virtual BOOL OnCreate(void);
virtual LRESULT OnCommand(WPARAM wParam, LPARAM lParam);
virtual void OnSize(void);
virtual void OnTimer(WPARAM TimerId);
virtual LRESULT OnNotify(WPARAM wParam, LPARAM lParam);
virtual void OnUpdate(UpdateType Type);
virtual void UpdateBpMarks(void);
void SetCurInstr(ULONG64 Offset);
void ScrollLower(void)
{
if (m_FirstInstr != 0)
{
SetCurInstr(m_FirstInstr);
}
}
void ScrollHigher(void)
{
if (m_LastInstr != 0)
{
SetCurInstr(m_LastInstr);
}
}
};
typedef DISASMWIN_DATA *PDISASMWIN_DATA;
// Array of active commonwin's indexed by WIN_TYPES.
extern PCOMMONWIN_DATA g_IndexedWin[];
extern HWND g_IndexedHwnd[];
#define GetWatchHwnd() g_IndexedHwnd[WATCH_WINDOW]
#define GetLocalsHwnd() g_IndexedHwnd[LOCALS_WINDOW]
#define GetCpuHwnd() g_IndexedHwnd[CPU_WINDOW]
#define GetDisasmHwnd() g_IndexedHwnd[DISASM_WINDOW]
#define GetCmdHwnd() g_IndexedHwnd[CMD_WINDOW]
#define GetScratchHwnd() g_IndexedHwnd[SCRATCH_PAD_WINDOW]
#define GetCallsHwnd() g_IndexedHwnd[CALLS_WINDOW]
#define GetQuickWatchHwnd() g_IndexedHwnd[QUICKW_WINDOW]
#define GetProcessThreadHwnd() g_IndexedHwnd[PROCESS_THREAD_WINDOW]
// Size of caption bar plus window frame.
#define WIN_EXTRA_HEIGHT \
(2 * GetSystemMetrics(SM_CYBORDER) + 3 * GetSystemMetrics(SM_CYFRAME) + \
GetSystemMetrics(SM_CYCAPTION))
// Attempt to make most text windows 80 chars wide by default.
// Most windows end up with a scroll bar so add that in on top.
#define WIDTH_80 \
(g_Fonts[FONT_FIXED].Metrics.tmAveCharWidth * 80 + GetSystemMetrics(SM_CXVSCROLL))
// Make all the left-side windows (command, stack, ...) 80 columns.
#define LEFT_SIDE_WIDTH WIDTH_80
// Require some space for left-side windows.
#define LEFT_SIDE_MIN_WIDTH \
(g_Fonts[FONT_FIXED].Metrics.tmAveCharWidth * 15 + GetSystemMetrics(SM_CXVSCROLL))
#define LEFT_SIDE_MIN_HEIGHT \
(g_Fonts[FONT_FIXED].Metrics.tmHeight * 5 + WIN_EXTRA_HEIGHT)
// Make all the right-side windows (cpu, ...) narrow.
#define RIGHT_SIDE_MIN_WIDTH_32 \
(g_Fonts[FONT_FIXED].Metrics.tmAveCharWidth * 15 + GetSystemMetrics(SM_CXVSCROLL))
#define RIGHT_SIDE_DESIRED_WIDTH_32 \
(g_Fonts[FONT_FIXED].Metrics.tmAveCharWidth * 25 + GetSystemMetrics(SM_CXVSCROLL))
#define RIGHT_SIDE_MIN_WIDTH_64 \
(g_Fonts[FONT_FIXED].Metrics.tmAveCharWidth * 20 + GetSystemMetrics(SM_CXVSCROLL))
#define RIGHT_SIDE_DESIRED_WIDTH_64 \
(g_Fonts[FONT_FIXED].Metrics.tmAveCharWidth * 30 + GetSystemMetrics(SM_CXVSCROLL))
#define DOC_WIDTH WIDTH_80
#define DISASM_WIDTH WIDTH_80
#define CMD_WIDTH WIDTH_80
#define CALLS_WIDTH WIDTH_80
// Give plenty of room for the command window.
#define CMD_HEIGHT \
(g_Fonts[FONT_FIXED].Metrics.tmHeight * 38)
#define CMD_MIN_HEIGHT \
(g_Fonts[FONT_FIXED].Metrics.tmHeight * 25)
#define CPU_WIDTH_32 RIGHT_SIDE_DESIRED_WIDTH_32
#define CPU_WIDTH_64 RIGHT_SIDE_DESIRED_WIDTH_64
#define CPU_HEIGHT g_MdiHeight
// Keep the calls window short but with enough lines to be useful.
#define CALLS_MIN_HEIGHT LEFT_SIDE_MIN_HEIGHT
#define CALLS_HEIGHT \
(g_Fonts[FONT_FIXED].Metrics.tmHeight * 10 + WIN_EXTRA_HEIGHT)
// Give the code windows enough lines to provide useful context.
#define DISASM_HEIGHT \
(g_Fonts[FONT_FIXED].Metrics.tmHeight * 30 + WIN_EXTRA_HEIGHT)
#define DOC_HEIGHT DISASM_HEIGHT
void Arrange(void);
BOOL IsAutoArranged(WIN_TYPES Type);
void DisplayAutoArrangeWarning(PCOMMONWIN_DATA CmnWin);
void UpdateSourceOverlay(void);
void SetAllFonts(ULONG FontIndex);
void CloseAllWindows(void);
void UpdateAllColors(void);
PCOMMONWIN_DATA FindNthWindow(ULONG Nth, ULONG Types);
void RicheditFind(HWND Edit,
PTSTR Text, ULONG Flags,
CHARRANGE* SaveSel, PULONG SaveFlags,
BOOL HideSel);
#define NTH_OPEN_ALWAYS 0xffffffff
HWND
New_OpenDebugWindow(
WIN_TYPES winType,
BOOL bUserActivated,
ULONG Nth
);
HWND
New_CreateWindow(
HWND hwndParent,
WIN_TYPES Type,
UINT uClassId,
UINT uWinTitle,
PRECT pRect
);
HWND
NewCmd_CreateWindow(
HWND
);
HWND
NewWatch_CreateWindow(
HWND
);
HWND
NewLocals_CreateWindow(
HWND
);
HWND
NewCpu_CreateWindow(
HWND
);
HWND
NewDisasm_CreateWindow(
HWND
);
HWND
NewQuickWatch_CreateWindow(
HWND
);
HWND
NewCalls_CreateWindow(
HWND
);
HWND
NewDoc_CreateWindow(
HWND
);
HWND
NewMemory_CreateWindow(
HWND
);
HWND
NewScratch_CreateWindow(
HWND
);
HWND
NewProcessThread_CreateWindow(
HWND
);
#undef DEFINE_GET_WINDATA
#define DEFINE_GET_WINDATA(ClassType, FuncName) \
class ClassType * Get##FuncName##WinData(HWND);
#include "fncdefs.h"
#undef DEFINE_GET_WINDATA