/*++

Copyright (c) 1992-2001  Microsoft Corporation

Module Name:

    Windbg.h

Abstract:

    Main header file for the Windbg debugger.

--*/

#if ! defined( _WINDBG_ )
#define _WINDBG_

//----------------------------------------------------------------------------
//
// Global limit constants.
//
//----------------------------------------------------------------------------

#define MAX_MSG_TXT         4096    //Max text width in message boxes

#define TMP_STRING_SIZE     8192    //All purpose strings

#define MAX_CMDLINE_TXT     8192    //Max size for command line
#define MAX_VAR_MSG_TXT     8192    //Max size of a message built at run-time

#define MAX_LINE_SIZE       512     //Max inside length of editor line
#define MAX_USER_LINE       MAX_LINE_SIZE //Max length of user line

//----------------------------------------------------------------------------
//
// UI constants.
//
//----------------------------------------------------------------------------

//
//  Private window messages
//

#define WU_UPDATE               (WM_USER + 0)
#define WU_INVALIDATE           (WM_USER + 1)
#define WU_START_ENGINE         (WM_USER + 2)
#define WU_ENGINE_STARTED       (WM_USER + 3)
#define WU_SWITCH_WORKSPACE     (WM_USER + 4)
#define WU_ENGINE_IDLE          (WM_USER + 5)
#define WU_RECONFIGURE          (WM_USER + 6)

// Position of window menu.
#define WINDOWMENU              4

// Position of file menu.
#define FILEMENU                0

// Toolbar control identifier.
#define ID_TOOLBAR              100

// Generic customize button ID.
#define ID_CUSTOMIZE            29876
// Generic show/hide toolbar button ID.
#define ID_SHOW_TOOLBAR         29877

// For MDI default menu handling.
#define IDM_FIRSTCHILD      30000

/*
**  Include the defines which are used have numbers for string
**      resources.
*/

#include "res_str.h"

//----------------------------------------------------------------------------
//
// Variables.
//
//----------------------------------------------------------------------------

// Set when the debugger is exiting.
extern BOOL g_Exit;

extern ULONG g_CommandLineStart;
extern BOOL g_QuietMode;
extern ULONG g_DefPriority;

typedef BOOL (WINAPI* PFN_FlashWindowEx)(PFLASHWINFO pfwi);

extern PFN_FlashWindowEx g_FlashWindowEx;

//Handle to instance data
extern HINSTANCE g_hInst;

//Main window frame
extern HWND g_hwndFrame;

// Handle to MDI client
extern HWND g_hwndMDIClient;

// Width and height of MDI client.
extern ULONG g_MdiWidth, g_MdiHeight;

//Handle to accelerator table
extern HACCEL g_hMainAccTable;

//Keyboard Hooks functions
extern HHOOK hKeyHook;

// menu that belongs to g_hwndFrame
extern HMENU g_hmenuMain;
extern HMENU g_hmenuMainSave;

//Window submenu
extern HMENU g_hmenuWindowSub;

// WinDBG title text
extern TCHAR g_MainTitleText[MAX_MSG_TXT];

extern TCHAR g_ExeFilePath[];
extern TCHAR g_DumpFilePath[];
extern TCHAR g_SrcFilePath[];

enum
{
    COL_PLAIN,
    COL_PLAIN_TEXT,
    COL_CURRENT_LINE,
    COL_CURRENT_LINE_TEXT,
    COL_BP_CURRENT_LINE,
    COL_BP_CURRENT_LINE_TEXT,
    COL_ENABLED_BP,
    COL_ENABLED_BP_TEXT,
    COL_DISABLED_BP,
    COL_DISABLED_BP_TEXT,
    
    COL_COUNT
};

#define OUT_MASK_COL_BASE  0xff00
#define OUT_MASK_COL_COUNT 66

#define USER_OUT_MASK_COL 64

struct INDEXED_COLOR
{
    PSTR Name;
    COLORREF Color;
    COLORREF Default;
    HBRUSH Brush;
};

extern INDEXED_COLOR g_Colors[];
extern INDEXED_COLOR g_OutMaskColors[];

#define CUSTCOL_COUNT 16

extern COLORREF g_CustomColors[];

//----------------------------------------------------------------------------
//
// Functions.
//
//----------------------------------------------------------------------------

LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);

void UpdateFrameTitle(void);
void SetTitleServerText(PCSTR Format, ...);
void SetTitleSessionText(PCSTR Format, ...);
void SetTitleExplicitText(PCSTR Text);
void UpdateTitleSessionText(void);

BOOL CreateUiInterfaces(BOOL Remote, LPTSTR CreateOptions);
void ReleaseUiInterfaces(void);
BOOL ParseCommandLine(BOOL FirstParse);

#define StartDebugging() \
    PostMessage(g_hwndFrame, WU_START_ENGINE, 0, 0)
void StopDebugging(BOOL UserRequest);
void TerminateApplication(BOOL Cancellable);

INDEXED_COLOR* GetIndexedColor(ULONG Index);
BOOL SetColor(ULONG Index, COLORREF Color);
BOOL GetOutMaskColors(ULONG Mask, COLORREF* Fg, COLORREF* Bg);

//----------------------------------------------------------------------------
//
// Macros.
//
//----------------------------------------------------------------------------

// Dbg have to be used for every assertion during Debugging time.
// If false Dbg Opens a fatal error message Box and Stops program

// Standard function to prompt an Assertion False
void ShowAssert(PTSTR condition, UINT line, PTSTR file);


// First, a sanity check
#ifdef Dbg
#undef Dbg
#endif


// Assert are assertions that will stay in final Release.
// If false Assert Opens a fatal error message Box and Stops program
#define RAssert(condition)  \
    {                               \
        if (!(condition))    \
        {                    \
            ShowAssert( _T(#condition), __LINE__, _T(__FILE__) );  \
        }                           \
    }


#ifdef DBG

#define Assert          RAssert
#define Dbg             RAssert

#else // !DBG

//#pragma warning(disable: 4553)      // disable warnings for pure expressions
//#pragma warning(disable: 4552)      // disable level 4 warnings
#define Assert(x)       ((void)0)
#define Dbg(condition)  condition

#endif

#endif // _WINDBG_