mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-31 06:05:44 +00:00
fe4bf5159a
--HG-- extra : rebase_source : e7f460a18397aa903fb2ba3f9ba7e5fe67d76db6
412 lines
19 KiB
C++
412 lines
19 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
/*
|
|
* nsWindowDbg - Debug related utilities for nsWindow.
|
|
*/
|
|
|
|
#include "nsWindowDbg.h"
|
|
|
|
#ifdef PR_LOGGING
|
|
extern PRLogModuleInfo* gWindowsLog;
|
|
#endif
|
|
|
|
#if defined(POPUP_ROLLUP_DEBUG_OUTPUT) || defined(EVENT_DEBUG_OUTPUT) || 1
|
|
|
|
typedef struct {
|
|
const char * mStr;
|
|
long mId;
|
|
} EventMsgInfo;
|
|
|
|
#if defined(POPUP_ROLLUP_DEBUG_OUTPUT)
|
|
MSGFEventMsgInfo gMSGFEvents[] = {
|
|
"MSGF_DIALOGBOX", 0,
|
|
"MSGF_MESSAGEBOX", 1,
|
|
"MSGF_MENU", 2,
|
|
"MSGF_SCROLLBAR", 5,
|
|
"MSGF_NEXTWINDOW", 6,
|
|
"MSGF_MAX", 8,
|
|
"MSGF_USER", 4096,
|
|
NULL, 0};
|
|
#endif
|
|
|
|
EventMsgInfo gAllEvents[] = {
|
|
{"WM_NULL", 0x0000},
|
|
{"WM_CREATE", 0x0001},
|
|
{"WM_DESTROY", 0x0002},
|
|
{"WM_MOVE", 0x0003},
|
|
{"WM_SIZE", 0x0005},
|
|
{"WM_ACTIVATE", 0x0006},
|
|
{"WM_SETFOCUS", 0x0007},
|
|
{"WM_KILLFOCUS", 0x0008},
|
|
{"WM_ENABLE", 0x000A},
|
|
{"WM_SETREDRAW", 0x000B},
|
|
{"WM_SETTEXT", 0x000C},
|
|
{"WM_GETTEXT", 0x000D},
|
|
{"WM_GETTEXTLENGTH", 0x000E},
|
|
{"WM_PAINT", 0x000F},
|
|
{"WM_CLOSE", 0x0010},
|
|
{"WM_QUERYENDSESSION", 0x0011},
|
|
{"WM_QUIT", 0x0012},
|
|
{"WM_QUERYOPEN", 0x0013},
|
|
{"WM_ERASEBKGND", 0x0014},
|
|
{"WM_SYSCOLORCHANGE", 0x0015},
|
|
{"WM_ENDSESSION", 0x0016},
|
|
{"WM_SHOWWINDOW", 0x0018},
|
|
{"WM_SETTINGCHANGE", 0x001A},
|
|
{"WM_DEVMODECHANGE", 0x001B},
|
|
{"WM_ACTIVATEAPP", 0x001C},
|
|
{"WM_FONTCHANGE", 0x001D},
|
|
{"WM_TIMECHANGE", 0x001E},
|
|
{"WM_CANCELMODE", 0x001F},
|
|
{"WM_SETCURSOR", 0x0020},
|
|
{"WM_MOUSEACTIVATE", 0x0021},
|
|
{"WM_CHILDACTIVATE", 0x0022},
|
|
{"WM_QUEUESYNC", 0x0023},
|
|
{"WM_GETMINMAXINFO", 0x0024},
|
|
{"WM_PAINTICON", 0x0026},
|
|
{"WM_ICONERASEBKGND", 0x0027},
|
|
{"WM_NEXTDLGCTL", 0x0028},
|
|
{"WM_SPOOLERSTATUS", 0x002A},
|
|
{"WM_DRAWITEM", 0x002B},
|
|
{"WM_MEASUREITEM", 0x002C},
|
|
{"WM_DELETEITEM", 0x002D},
|
|
{"WM_VKEYTOITEM", 0x002E},
|
|
{"WM_CHARTOITEM", 0x002F},
|
|
{"WM_SETFONT", 0x0030},
|
|
{"WM_GETFONT", 0x0031},
|
|
{"WM_SETHOTKEY", 0x0032},
|
|
{"WM_GETHOTKEY", 0x0033},
|
|
{"WM_QUERYDRAGICON", 0x0037},
|
|
{"WM_COMPAREITEM", 0x0039},
|
|
{"WM_GETOBJECT", 0x003D},
|
|
{"WM_COMPACTING", 0x0041},
|
|
{"WM_COMMNOTIFY", 0x0044},
|
|
{"WM_WINDOWPOSCHANGING", 0x0046},
|
|
{"WM_WINDOWPOSCHANGED", 0x0047},
|
|
{"WM_POWER", 0x0048},
|
|
{"WM_COPYDATA", 0x004A},
|
|
{"WM_CANCELJOURNAL", 0x004B},
|
|
{"WM_NOTIFY", 0x004E},
|
|
{"WM_INPUTLANGCHANGEREQUEST", 0x0050},
|
|
{"WM_INPUTLANGCHANGE", 0x0051},
|
|
{"WM_TCARD", 0x0052},
|
|
{"WM_HELP", 0x0053},
|
|
{"WM_USERCHANGED", 0x0054},
|
|
{"WM_NOTIFYFORMAT", 0x0055},
|
|
{"WM_CONTEXTMENU", 0x007B},
|
|
{"WM_STYLECHANGING", 0x007C},
|
|
{"WM_STYLECHANGED", 0x007D},
|
|
{"WM_DISPLAYCHANGE", 0x007E},
|
|
{"WM_GETICON", 0x007F},
|
|
{"WM_SETICON", 0x0080},
|
|
{"WM_NCCREATE", 0x0081},
|
|
{"WM_NCDESTROY", 0x0082},
|
|
{"WM_NCCALCSIZE", 0x0083},
|
|
{"WM_NCHITTEST", 0x0084},
|
|
{"WM_NCPAINT", 0x0085},
|
|
{"WM_NCACTIVATE", 0x0086},
|
|
{"WM_GETDLGCODE", 0x0087},
|
|
{"WM_SYNCPAINT", 0x0088},
|
|
{"WM_NCMOUSEMOVE", 0x00A0},
|
|
{"WM_NCLBUTTONDOWN", 0x00A1},
|
|
{"WM_NCLBUTTONUP", 0x00A2},
|
|
{"WM_NCLBUTTONDBLCLK", 0x00A3},
|
|
{"WM_NCRBUTTONDOWN", 0x00A4},
|
|
{"WM_NCRBUTTONUP", 0x00A5},
|
|
{"WM_NCRBUTTONDBLCLK", 0x00A6},
|
|
{"WM_NCMBUTTONDOWN", 0x00A7},
|
|
{"WM_NCMBUTTONUP", 0x00A8},
|
|
{"WM_NCMBUTTONDBLCLK", 0x00A9},
|
|
{"EM_GETSEL", 0x00B0},
|
|
{"EM_SETSEL", 0x00B1},
|
|
{"EM_GETRECT", 0x00B2},
|
|
{"EM_SETRECT", 0x00B3},
|
|
{"EM_SETRECTNP", 0x00B4},
|
|
{"EM_SCROLL", 0x00B5},
|
|
{"EM_LINESCROLL", 0x00B6},
|
|
{"EM_SCROLLCARET", 0x00B7},
|
|
{"EM_GETMODIFY", 0x00B8},
|
|
{"EM_SETMODIFY", 0x00B9},
|
|
{"EM_GETLINECOUNT", 0x00BA},
|
|
{"EM_LINEINDEX", 0x00BB},
|
|
{"EM_SETHANDLE", 0x00BC},
|
|
{"EM_GETHANDLE", 0x00BD},
|
|
{"EM_GETTHUMB", 0x00BE},
|
|
{"EM_LINELENGTH", 0x00C1},
|
|
{"EM_REPLACESEL", 0x00C2},
|
|
{"EM_GETLINE", 0x00C4},
|
|
{"EM_LIMITTEXT", 0x00C5},
|
|
{"EM_CANUNDO", 0x00C6},
|
|
{"EM_UNDO", 0x00C7},
|
|
{"EM_FMTLINES", 0x00C8},
|
|
{"EM_LINEFROMCHAR", 0x00C9},
|
|
{"EM_SETTABSTOPS", 0x00CB},
|
|
{"EM_SETPASSWORDCHAR", 0x00CC},
|
|
{"EM_EMPTYUNDOBUFFER", 0x00CD},
|
|
{"EM_GETFIRSTVISIBLELINE", 0x00CE},
|
|
{"EM_SETREADONLY", 0x00CF},
|
|
{"EM_SETWORDBREAKPROC", 0x00D0},
|
|
{"EM_GETWORDBREAKPROC", 0x00D1},
|
|
{"EM_GETPASSWORDCHAR", 0x00D2},
|
|
{"EM_SETMARGINS", 0x00D3},
|
|
{"EM_GETMARGINS", 0x00D4},
|
|
{"EM_GETLIMITTEXT", 0x00D5},
|
|
{"EM_POSFROMCHAR", 0x00D6},
|
|
{"EM_CHARFROMPOS", 0x00D7},
|
|
{"EM_SETIMESTATUS", 0x00D8},
|
|
{"EM_GETIMESTATUS", 0x00D9},
|
|
{"SBM_SETPOS", 0x00E0},
|
|
{"SBM_GETPOS", 0x00E1},
|
|
{"SBM_SETRANGE", 0x00E2},
|
|
{"SBM_SETRANGEREDRAW", 0x00E6},
|
|
{"SBM_GETRANGE", 0x00E3},
|
|
{"SBM_ENABLE_ARROWS", 0x00E4},
|
|
{"SBM_SETSCROLLINFO", 0x00E9},
|
|
{"SBM_GETSCROLLINFO", 0x00EA},
|
|
{"WM_KEYDOWN", 0x0100},
|
|
{"WM_KEYUP", 0x0101},
|
|
{"WM_CHAR", 0x0102},
|
|
{"WM_DEADCHAR", 0x0103},
|
|
{"WM_SYSKEYDOWN", 0x0104},
|
|
{"WM_SYSKEYUP", 0x0105},
|
|
{"WM_SYSCHAR", 0x0106},
|
|
{"WM_SYSDEADCHAR", 0x0107},
|
|
{"WM_KEYLAST", 0x0108},
|
|
{"WM_IME_STARTCOMPOSITION", 0x010D},
|
|
{"WM_IME_ENDCOMPOSITION", 0x010E},
|
|
{"WM_IME_COMPOSITION", 0x010F},
|
|
{"WM_INITDIALOG", 0x0110},
|
|
{"WM_COMMAND", 0x0111},
|
|
{"WM_SYSCOMMAND", 0x0112},
|
|
{"WM_TIMER", 0x0113},
|
|
{"WM_HSCROLL", 0x0114},
|
|
{"WM_VSCROLL", 0x0115},
|
|
{"WM_INITMENU", 0x0116},
|
|
{"WM_INITMENUPOPUP", 0x0117},
|
|
{"WM_MENUSELECT", 0x011F},
|
|
{"WM_MENUCHAR", 0x0120},
|
|
{"WM_ENTERIDLE", 0x0121},
|
|
{"WM_MENURBUTTONUP", 0x0122},
|
|
{"WM_MENUDRAG", 0x0123},
|
|
{"WM_MENUGETOBJECT", 0x0124},
|
|
{"WM_UNINITMENUPOPUP", 0x0125},
|
|
{"WM_MENUCOMMAND", 0x0126},
|
|
{"WM_CHANGEUISTATE", 0x0127},
|
|
{"WM_UPDATEUISTATE", 0x0128},
|
|
{"WM_CTLCOLORMSGBOX", 0x0132},
|
|
{"WM_CTLCOLOREDIT", 0x0133},
|
|
{"WM_CTLCOLORLISTBOX", 0x0134},
|
|
{"WM_CTLCOLORBTN", 0x0135},
|
|
{"WM_CTLCOLORDLG", 0x0136},
|
|
{"WM_CTLCOLORSCROLLBAR", 0x0137},
|
|
{"WM_CTLCOLORSTATIC", 0x0138},
|
|
{"CB_GETEDITSEL", 0x0140},
|
|
{"CB_LIMITTEXT", 0x0141},
|
|
{"CB_SETEDITSEL", 0x0142},
|
|
{"CB_ADDSTRING", 0x0143},
|
|
{"CB_DELETESTRING", 0x0144},
|
|
{"CB_DIR", 0x0145},
|
|
{"CB_GETCOUNT", 0x0146},
|
|
{"CB_GETCURSEL", 0x0147},
|
|
{"CB_GETLBTEXT", 0x0148},
|
|
{"CB_GETLBTEXTLEN", 0x0149},
|
|
{"CB_INSERTSTRING", 0x014A},
|
|
{"CB_RESETCONTENT", 0x014B},
|
|
{"CB_FINDSTRING", 0x014C},
|
|
{"CB_SELECTSTRING", 0x014D},
|
|
{"CB_SETCURSEL", 0x014E},
|
|
{"CB_SHOWDROPDOWN", 0x014F},
|
|
{"CB_GETITEMDATA", 0x0150},
|
|
{"CB_SETITEMDATA", 0x0151},
|
|
{"CB_GETDROPPEDCONTROLRECT", 0x0152},
|
|
{"CB_SETITEMHEIGHT", 0x0153},
|
|
{"CB_GETITEMHEIGHT", 0x0154},
|
|
{"CB_SETEXTENDEDUI", 0x0155},
|
|
{"CB_GETEXTENDEDUI", 0x0156},
|
|
{"CB_GETDROPPEDSTATE", 0x0157},
|
|
{"CB_FINDSTRINGEXACT", 0x0158},
|
|
{"CB_SETLOCALE", 0x0159},
|
|
{"CB_GETLOCALE", 0x015A},
|
|
{"CB_GETTOPINDEX", 0x015b},
|
|
{"CB_SETTOPINDEX", 0x015c},
|
|
{"CB_GETHORIZONTALEXTENT", 0x015d},
|
|
{"CB_SETHORIZONTALEXTENT", 0x015e},
|
|
{"CB_GETDROPPEDWIDTH", 0x015f},
|
|
{"CB_SETDROPPEDWIDTH", 0x0160},
|
|
{"CB_INITSTORAGE", 0x0161},
|
|
{"CB_MSGMAX", 0x0162},
|
|
{"LB_ADDSTRING", 0x0180},
|
|
{"LB_INSERTSTRING", 0x0181},
|
|
{"LB_DELETESTRING", 0x0182},
|
|
{"LB_SELITEMRANGEEX", 0x0183},
|
|
{"LB_RESETCONTENT", 0x0184},
|
|
{"LB_SETSEL", 0x0185},
|
|
{"LB_SETCURSEL", 0x0186},
|
|
{"LB_GETSEL", 0x0187},
|
|
{"LB_GETCURSEL", 0x0188},
|
|
{"LB_GETTEXT", 0x0189},
|
|
{"LB_GETTEXTLEN", 0x018A},
|
|
{"LB_GETCOUNT", 0x018B},
|
|
{"LB_SELECTSTRING", 0x018C},
|
|
{"LB_DIR", 0x018D},
|
|
{"LB_GETTOPINDEX", 0x018E},
|
|
{"LB_FINDSTRING", 0x018F},
|
|
{"LB_GETSELCOUNT", 0x0190},
|
|
{"LB_GETSELITEMS", 0x0191},
|
|
{"LB_SETTABSTOPS", 0x0192},
|
|
{"LB_GETHORIZONTALEXTENT", 0x0193},
|
|
{"LB_SETHORIZONTALEXTENT", 0x0194},
|
|
{"LB_SETCOLUMNWIDTH", 0x0195},
|
|
{"LB_ADDFILE", 0x0196},
|
|
{"LB_SETTOPINDEX", 0x0197},
|
|
{"LB_GETITEMRECT", 0x0198},
|
|
{"LB_GETITEMDATA", 0x0199},
|
|
{"LB_SETITEMDATA", 0x019A},
|
|
{"LB_SELITEMRANGE", 0x019B},
|
|
{"LB_SETANCHORINDEX", 0x019C},
|
|
{"LB_GETANCHORINDEX", 0x019D},
|
|
{"LB_SETCARETINDEX", 0x019E},
|
|
{"LB_GETCARETINDEX", 0x019F},
|
|
{"LB_SETITEMHEIGHT", 0x01A0},
|
|
{"LB_GETITEMHEIGHT", 0x01A1},
|
|
{"LB_FINDSTRINGEXACT", 0x01A2},
|
|
{"LB_SETLOCALE", 0x01A5},
|
|
{"LB_GETLOCALE", 0x01A6},
|
|
{"LB_SETCOUNT", 0x01A7},
|
|
{"LB_INITSTORAGE", 0x01A8},
|
|
{"LB_ITEMFROMPOINT", 0x01A9},
|
|
{"LB_MSGMAX", 0x01B0},
|
|
{"WM_MOUSEMOVE", 0x0200},
|
|
{"WM_LBUTTONDOWN", 0x0201},
|
|
{"WM_LBUTTONUP", 0x0202},
|
|
{"WM_LBUTTONDBLCLK", 0x0203},
|
|
{"WM_RBUTTONDOWN", 0x0204},
|
|
{"WM_RBUTTONUP", 0x0205},
|
|
{"WM_RBUTTONDBLCLK", 0x0206},
|
|
{"WM_MBUTTONDOWN", 0x0207},
|
|
{"WM_MBUTTONUP", 0x0208},
|
|
{"WM_MBUTTONDBLCLK", 0x0209},
|
|
{"WM_MOUSEWHEEL", 0x020A},
|
|
{"WM_MOUSEHWHEEL", 0x020E},
|
|
{"WM_PARENTNOTIFY", 0x0210},
|
|
{"WM_ENTERMENULOOP", 0x0211},
|
|
{"WM_EXITMENULOOP", 0x0212},
|
|
{"WM_NEXTMENU", 0x0213},
|
|
{"WM_SIZING", 0x0214},
|
|
{"WM_CAPTURECHANGED", 0x0215},
|
|
{"WM_MOVING", 0x0216},
|
|
{"WM_POWERBROADCAST", 0x0218},
|
|
{"WM_DEVICECHANGE", 0x0219},
|
|
{"WM_MDICREATE", 0x0220},
|
|
{"WM_MDIDESTROY", 0x0221},
|
|
{"WM_MDIACTIVATE", 0x0222},
|
|
{"WM_MDIRESTORE", 0x0223},
|
|
{"WM_MDINEXT", 0x0224},
|
|
{"WM_MDIMAXIMIZE", 0x0225},
|
|
{"WM_MDITILE", 0x0226},
|
|
{"WM_MDICASCADE", 0x0227},
|
|
{"WM_MDIICONARRANGE", 0x0228},
|
|
{"WM_MDIGETACTIVE", 0x0229},
|
|
{"WM_MDISETMENU", 0x0230},
|
|
{"WM_ENTERSIZEMOVE", 0x0231},
|
|
{"WM_EXITSIZEMOVE", 0x0232},
|
|
{"WM_DROPFILES", 0x0233},
|
|
{"WM_MDIREFRESHMENU", 0x0234},
|
|
{"WM_IME_SETCONTEXT", 0x0281},
|
|
{"WM_IME_NOTIFY", 0x0282},
|
|
{"WM_IME_CONTROL", 0x0283},
|
|
{"WM_IME_COMPOSITIONFULL", 0x0284},
|
|
{"WM_IME_SELECT", 0x0285},
|
|
{"WM_IME_CHAR", 0x0286},
|
|
{"WM_IME_REQUEST", 0x0288},
|
|
{"WM_IME_KEYDOWN", 0x0290},
|
|
{"WM_IME_KEYUP", 0x0291},
|
|
{"WM_NCMOUSEHOVER", 0x02A0},
|
|
{"WM_MOUSEHOVER", 0x02A1},
|
|
{"WM_MOUSELEAVE", 0x02A3},
|
|
{"WM_CUT", 0x0300},
|
|
{"WM_COPY", 0x0301},
|
|
{"WM_PASTE", 0x0302},
|
|
{"WM_CLEAR", 0x0303},
|
|
{"WM_UNDO", 0x0304},
|
|
{"WM_RENDERFORMAT", 0x0305},
|
|
{"WM_RENDERALLFORMATS", 0x0306},
|
|
{"WM_DESTROYCLIPBOARD", 0x0307},
|
|
{"WM_DRAWCLIPBOARD", 0x0308},
|
|
{"WM_PAINTCLIPBOARD", 0x0309},
|
|
{"WM_VSCROLLCLIPBOARD", 0x030A},
|
|
{"WM_SIZECLIPBOARD", 0x030B},
|
|
{"WM_ASKCBFORMATNAME", 0x030C},
|
|
{"WM_CHANGECBCHAIN", 0x030D},
|
|
{"WM_HSCROLLCLIPBOARD", 0x030E},
|
|
{"WM_QUERYNEWPALETTE", 0x030F},
|
|
{"WM_PALETTEISCHANGING", 0x0310},
|
|
{"WM_PALETTECHANGED", 0x0311},
|
|
{"WM_HOTKEY", 0x0312},
|
|
{"WM_PRINT", 0x0317},
|
|
{"WM_PRINTCLIENT", 0x0318},
|
|
{"WM_THEMECHANGED", 0x031A},
|
|
{"WM_HANDHELDFIRST", 0x0358},
|
|
{"WM_HANDHELDLAST", 0x035F},
|
|
{"WM_AFXFIRST", 0x0360},
|
|
{"WM_AFXLAST", 0x037F},
|
|
{"WM_PENWINFIRST", 0x0380},
|
|
{"WM_PENWINLAST", 0x038F},
|
|
{"WM_APP", 0x8000},
|
|
{"WM_DWMCOMPOSITIONCHANGED", 0x031E},
|
|
{"WM_DWMNCRENDERINGCHANGED", 0x031F},
|
|
{"WM_DWMCOLORIZATIONCOLORCHANGED", 0x0320},
|
|
{"WM_DWMWINDOWMAXIMIZEDCHANGE", 0x0321},
|
|
{"WM_DWMSENDICONICTHUMBNAIL", 0x0323},
|
|
{"WM_DWMSENDICONICLIVEPREVIEWBITMAP", 0x0326},
|
|
{"WM_TABLET_QUERYSYSTEMGESTURESTATUS", 0x02CC},
|
|
{"WM_GESTURE", 0x0119},
|
|
{"WM_GESTURENOTIFY", 0x011A},
|
|
{"WM_GETTITLEBARINFOEX", 0x033F},
|
|
{NULL, 0x0}
|
|
};
|
|
|
|
static long gEventCounter = 0;
|
|
static long gLastEventMsg = 0;
|
|
|
|
void PrintEvent(UINT msg, bool aShowAllEvents, bool aShowMouseMoves)
|
|
{
|
|
int inx = 0;
|
|
while (gAllEvents[inx].mId != (long)msg && gAllEvents[inx].mStr != NULL) {
|
|
inx++;
|
|
}
|
|
if (aShowAllEvents || (!aShowAllEvents && gLastEventMsg != (long)msg)) {
|
|
if (aShowMouseMoves || (!aShowMouseMoves && msg != 0x0020 && msg != 0x0200 && msg != 0x0084)) {
|
|
PR_LOG(gWindowsLog, PR_LOG_ALWAYS,
|
|
("%6d - 0x%04X %s\n", gEventCounter++, msg,
|
|
gAllEvents[inx].mStr ? gAllEvents[inx].mStr : "Unknown"));
|
|
gLastEventMsg = msg;
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif // defined(POPUP_ROLLUP_DEBUG_OUTPUT) || defined(EVENT_DEBUG_OUTPUT)
|
|
|
|
#ifdef DEBUG
|
|
void DDError(const char *msg, HRESULT hr)
|
|
{
|
|
/*XXX make nicer */
|
|
PR_LOG(gWindowsLog, PR_LOG_ERROR,
|
|
("direct draw error %s: 0x%08lx\n", msg, hr));
|
|
}
|
|
#endif
|
|
|
|
#ifdef DEBUG_VK
|
|
bool is_vk_down(int vk)
|
|
{
|
|
SHORT st = GetKeyState(vk);
|
|
#ifdef DEBUG
|
|
PR_LOG(gWindowsLog, PR_LOG_ALWAYS, ("is_vk_down vk=%x st=%x\n",vk, st));
|
|
#endif
|
|
return (st < 0);
|
|
}
|
|
#endif
|