/***************************************************************************\
*
* Module Name: PMWIN.H
*
* OS/2 Presentation Manager Window Manager include file
*
* Copyright (c) International Business Machines Corporation 1981, 1988-1990
*
* =======================================================================
*
* The folowing symbols are used in this file for conditional sections.
*
* If INCL_WIN is defined, all subcomponents are included.
*
* Subcomponents marked with "+" are partially included by default:
*
*   #define:                To include:
*
* + INCL_WINWINDOWMGR       General window management
* + INCL_WINMESSAGEMGR      Message management
* + INCL_WININPUT           Mouse and keyboard input
* + INCL_WINDIALOGS         Dialog boxes
* + INCL_WINSTATICS         Static controls
* + INCL_WINBUTTONS         Button controls
* + INCL_WINENTRYFIELDS     Entry Fields
*   INCL_WINMLE             Multiple Line Entry Fields
* + INCL_WINLISTBOXES       List box controls
* + INCL_WINMENUS           Menu controls
* + INCL_WINSCROLLBARS      Scroll bar controls
* + INCL_WINFRAMEMGR        Frame manager
*   INCL_WINFRAMECTLS       Frame controls (title bars & size border)
*   INCL_WINRECTANGLES      Rectangle routines
*   INCL_WINSYS             System values (and colors)
*   INCL_WINTIMER           Timer routines
* + INCL_WINACCELERATORS    Keyboard accelerators
*   INCL_WINTRACKRECT       WinTrackRect() function
*   INCL_WINCLIPBOARD       Clipboard manager
* + INCL_WINCURSORS         Text cursors
* + INCL_WINPOINTERS        Mouse pointers
*   INCL_WINHOOKS           Hook manager
* + INCL_WINSWITCHLIST      Shell Switch List API
*   INCL_WINPROGRAMLIST     Shell Program List API
*   INCL_WINSHELLDATA       Shell Data (?)
*   INCL_WINCOUNTRY         Country support
*   INCL_WINHEAP            Heap Manager
*   INCL_WINATOM            Atom Manager
*   INCL_WINCATCHTHROW      WinCatch/WinThrow support
*   INCL_WINERRORS          Error code definitions
*   INCL_NLS                DBCS window manager definition
* + INCL_WINHELP            Help Manager definitions
*   INCL_WINSEI             Set Error Info API
*   INCL_WINLOAD            Load/Delete Library/Procedure
*   INCL_WINTYPES           Definitions for Datatypes
*
\***************************************************************************/

#define INCL_WININCLUDED


#ifdef INCL_WIN

#define INCL_WINWINDOWMGR
#define INCL_WINMESSAGEMGR
#define INCL_WININPUT
#define INCL_WINDIALOGS
#define INCL_WINSTATICS
#define INCL_WINBUTTONS
#define INCL_WINENTRYFIELDS
#define INCL_WINMLE
#define INCL_WINLISTBOXES
#define INCL_WINMENUS
#define INCL_WINSCROLLBARS
#define INCL_WINFRAMEMGR
#define INCL_WINFRAMECTLS
#define INCL_WINRECTANGLES
#define INCL_WINSYS
#define INCL_WINTIMER
#define INCL_WINACCELERATORS
#define INCL_WINTRACKRECT
#define INCL_WINCLIPBOARD
#define INCL_WINCURSORS
#define INCL_WINPOINTERS
#define INCL_WINHOOKS
#define INCL_WINSWITCHLIST
#define INCL_WINPROGRAMLIST
#define INCL_WINSHELLDATA
#define INCL_WINCOUNTRY
#define INCL_WINHEAP
#define INCL_WINATOM
#define INCL_WINCATCHTHROW
#define INCL_WINERRORS
#define INCL_WINDDE
#define INCL_WINHELP
#define INCL_WINSEI
#define INCL_WINLOAD
#define INCL_WINTYPES

#else /* INCL_WIN */

#ifdef RC_INVOKED
#define INCL_WININPUT
#define INCL_WINDIALOGS
#define INCL_WINSTATICS
#define INCL_WINBUTTONS
#define INCL_WINENTRYFIELDS
#define INCL_WINLISTBOXES
#define INCL_WINMENUS
#define INCL_WINSCROLLBARS
#define INCL_WINFRAMEMGR
#define INCL_WINFRAMECTLS
#define INCL_WINACCELERATORS
#define INCL_WINPOINTERS
#define INCL_WINMESSAGEMGR
#define INCL_WINMLE
#define INCL_WINHELP
#endif /* RC_INVOKED */

#endif /* INCL_WIN */

/* ensure standard entry field defintions if MLE is defined */
#ifdef INCL_WINMLE
#ifndef INCL_WINENTRYFIELDS
#define INCL_WINENTRYFIELDS
#endif /* INCL_WINENTRYFIELDS */
#endif /* INCL_WINMLE */

/* INCL_WINCOMMON compatability */
#ifdef INCL_WINCOMMON
#define INCL_WINWINDOWMGR
#endif /* INCL_WINCOMMON */

#ifdef INCL_ERRORS
#define INCL_WINERRORS
#endif  /* INCL_ERRORS */

/***************************************************************************/
/***        General Window Management types, constants and macros        ***/

typedef VOID FAR *MPARAM;      /* mp    */
typedef MPARAM FAR *PMPARAM;   /* pmp   */
typedef VOID FAR *MRESULT;     /* mres  */
typedef MRESULT FAR *PMRESULT; /* pmres */

/* Macros to make an MPARAM from standard types. */
#define MPFROMP(p)                 ((MPARAM)(VOID FAR *)(p))
#define MPFROMHWND(hwnd)           ((MPARAM)(HWND)(hwnd))
#define MPFROMCHAR(ch)             ((MPARAM)(USHORT)(ch))
#define MPFROMSHORT(s)             ((MPARAM)(USHORT)(s))
#define MPFROM2SHORT(s1, s2)       ((MPARAM)MAKELONG(s1, s2))
#define MPFROMSH2CH(s, uch1, uch2) ((MPARAM)MAKELONG(s, MAKESHORT(uch1, uch2)))
#define MPFROMLONG(l)              ((MPARAM)(ULONG)(l))

/* Macros to extract standard types from an MPARAM */
#define PVOIDFROMMP(mp)            ((VOID FAR *)(mp))
#define HWNDFROMMP(mp)             ((HWND)(mp))
#define CHAR1FROMMP(mp)            ((UCHAR)(mp))
#define CHAR2FROMMP(mp)            ((UCHAR)((ULONG)mp >> 8))
#define CHAR3FROMMP(mp)            ((UCHAR)((ULONG)mp >> 16))
#define CHAR4FROMMP(mp)            ((UCHAR)((ULONG)mp >> 24))
#define SHORT1FROMMP(mp)           ((USHORT)(ULONG)(mp))
#define SHORT2FROMMP(mp)           ((USHORT)((ULONG)mp >> 16))
#define LONGFROMMP(mp)             ((ULONG)(mp))

/* Macros to make an MRESULT from standard types. */
#define MRFROMP(p)                 ((MRESULT)(VOID FAR *)(p))
#define MRFROMSHORT(s)             ((MRESULT)(USHORT)(s))
#define MRFROM2SHORT(s1, s2)       ((MRESULT)MAKELONG(s1, s2))
#define MRFROMLONG(l)              ((MRESULT)(ULONG)(l))

/* Macros to extract standard types from an MRESULT */
#define PVOIDFROMMR(mr)            ((VOID FAR *)(mr))
#define SHORT1FROMMR(mr)           ((USHORT)((ULONG)mr))
#define SHORT2FROMMR(mr)           ((USHORT)((ULONG)mr >> 16))
#define LONGFROMMR(mr)             ((ULONG)(mr))

typedef MRESULT (PASCAL FAR *PFNWP)(HWND, USHORT, MPARAM, MPARAM);

#ifndef INCL_SAADEFS
#define HWND_DESKTOP               (HWND)1
#define HWND_OBJECT                (HWND)2
#endif /* !INCL_SAADEFS */

#define HWND_TOP                   (HWND)3
#define HWND_BOTTOM                (HWND)4

#ifndef INCL_SAADEFS
#define HWND_THREADCAPTURE         (HWND)5
#endif /* !INCL_SAADEFS */


/* Standard Window Styles */

#define WS_VISIBLE                 0x80000000L
#define WS_DISABLED                0x40000000L
#define WS_CLIPCHILDREN            0x20000000L
#define WS_CLIPSIBLINGS            0x10000000L
#define WS_PARENTCLIP              0x08000000L
#define WS_SAVEBITS                0x04000000L
#define WS_SYNCPAINT               0x02000000L
#define WS_MINIMIZED               0x01000000L
#define WS_MAXIMIZED               0x00800000L

/* Dialog manager styles */

#define WS_GROUP                   0x00010000L
#define WS_TABSTOP                 0x00020000L
#define WS_MULTISELECT             0x00040000L


/* Class styles */

#define CS_MOVENOTIFY              0x00000001L
#define CS_SIZEREDRAW              0x00000004L
#define CS_HITTEST                 0x00000008L
#define CS_PUBLIC                  0x00000010L
#define CS_FRAME                   0x00000020L
#define CS_CLIPCHILDREN            0x20000000L
#define CS_CLIPSIBLINGS            0x10000000L
#define CS_PARENTCLIP              0x08000000L
#define CS_SAVEBITS                0x04000000L
#define CS_SYNCPAINT               0x02000000L

/***************************************************************************/
/****       Window Manager Subsection part 1                            ****/
#if (defined(INCL_WINWINDOWMGR) || !defined(INCL_NOCOMMON))

BOOL    APIENTRY WinRegisterClass(HAB hab, PSZ pszClassName, PFNWP pfnWndProc,
                                  ULONG flStyle, USHORT cbWindowData);

MRESULT APIENTRY WinDefWindowProc(HWND hwnd, USHORT msg, MPARAM mp1,
                                  MPARAM mp2);
BOOL    APIENTRY WinDestroyWindow(HWND hwnd);
BOOL    APIENTRY WinShowWindow(HWND hwnd, BOOL fShow);
BOOL    APIENTRY WinQueryWindowRect(HWND hwnd, PRECTL prclDest);

HPS   APIENTRY WinGetPS(HWND hwnd);
BOOL  APIENTRY WinReleasePS(HPS hps);
BOOL  APIENTRY WinEndPaint(HPS hps);
#ifndef INCL_SAADEFS
HPS   APIENTRY WinGetClipPS(HWND hwnd, HWND hwndClip, USHORT fs);
BOOL  APIENTRY WinIsWindowShowing(HWND hwnd);
#endif /* !INCL_SAADEFS */

HPS   APIENTRY WinBeginPaint(HWND hwnd, HPS hps, PRECTL prclPaint);
HDC   APIENTRY WinOpenWindowDC(HWND hwnd);

SHORT APIENTRY WinScrollWindow(HWND hwnd, SHORT dx, SHORT dy,
                               PRECTL prclScroll, PRECTL prclClip,
                               HRGN hrgnUpdate, PRECTL prclUpdate,
                               USHORT rgfsw);

/* WinGetClipPS() flags */

#ifndef INCL_SAADEFS
#define PSF_LOCKWINDOWUPDATE       0x0001
#define PSF_CLIPUPWARDS            0x0002
#define PSF_CLIPDOWNWARDS          0x0004
#define PSF_CLIPSIBLINGS           0x0008
#define PSF_CLIPCHILDREN           0x0010
#define PSF_PARENTCLIP             0x0020

#endif /* !INCL_SAADEFS */

/* WinScrollWindow() flags */

#define SW_SCROLLCHILDREN          0x0001
#define SW_INVALIDATERGN           0x0002

BOOL  APIENTRY WinFillRect(HPS hps, PRECTL prcl, LONG lColor);

/* WinInitialize/WinTerminate Interface declarations */

typedef struct _QVERSDATA { /* qver */
    USHORT   environment;
    USHORT   version;
} QVERSDATA;
typedef QVERSDATA FAR *PQVERSDATA;

#define QV_OS2                     0x0000
#define QV_CMS                     0x0001
#define QV_TSO                     0x0002
#define QV_TSOBATCH                0x0003
#define QV_OS400                   0x0004


ULONG  APIENTRY WinQueryVersion(HAB hab);
HAB    APIENTRY WinInitialize(USHORT);
BOOL   APIENTRY WinTerminate(HAB hab);

HAB    APIENTRY WinQueryAnchorBlock(HWND hwnd);

#endif /* INCL_WINWINDOWMGR | !INCL_NOCOMMON */
/******************  End of Window Manager COMMON section ******************/


HWND    APIENTRY WinCreateWindow(HWND hwndParent, PSZ pszClass, PSZ pszName,
                                 ULONG flStyle, SHORT x, SHORT y, SHORT cx,
                                 SHORT cy, HWND hwndOwner,
                                 HWND hwndInsertBehind, USHORT id,
                                 PVOID pCtlData, PVOID pPresParams);
BOOL    APIENTRY WinEnableWindow(HWND hwnd, BOOL fEnable);
BOOL    APIENTRY WinIsWindowEnabled(HWND hwnd);
BOOL    APIENTRY WinEnableWindowUpdate(HWND hwnd, BOOL fEnable);
BOOL    APIENTRY WinIsWindowVisible(HWND hwnd);
SHORT   APIENTRY WinQueryWindowText(HWND hwnd, SHORT cchBufferMax,
                                    PCH pchBuffer);
BOOL    APIENTRY WinSetWindowText(HWND hwnd, PSZ pszText);
SHORT   APIENTRY WinQueryWindowTextLength(HWND hwnd);
HWND    APIENTRY WinWindowFromID(HWND hwndParent, USHORT id);

BOOL    APIENTRY WinIsWindow(HAB hab, HWND hwnd);
HWND    APIENTRY WinQueryWindow(HWND hwnd, SHORT cmd, BOOL fLock);
SHORT   APIENTRY WinMultWindowFromIDs(HWND hwndParent, PHWND prghwnd,
                                      USHORT idFirst, USHORT idLast);

/* WinQueryWindow() codes */

#define QW_NEXT         0
#define QW_PREV         1
#define QW_TOP          2
#define QW_BOTTOM       3
#define QW_OWNER        4
#define QW_PARENT       5
#define QW_NEXTTOP      6
#define QW_PREVTOP      7
#define QW_FRAMEOWNER   8


BOOL   APIENTRY WinSetParent(HWND hwnd, HWND hwndNewParent, BOOL fRedraw);

BOOL   APIENTRY WinIsChild(HWND hwnd, HWND hwndParent);
BOOL   APIENTRY WinSetOwner(HWND hwnd, HWND hwndNewOwner);
#ifndef INCL_SAADEFS
BOOL   APIENTRY WinQueryWindowProcess(HWND hwnd, PPID ppid, PTID ptid);
#endif /* !INCL_SAADEFS */

HWND   APIENTRY WinQueryObjectWindow(HWND hwndDesktop);
HWND   APIENTRY WinQueryDesktopWindow(HAB hab, HDC hdc);

/*** Window positioning functions */

/* WinSetMultWindowPos() structure */

typedef struct _SWP { /* swp */
    USHORT  fs;
    SHORT   cy;
    SHORT   cx;
    SHORT   y;
    SHORT   x;
    HWND    hwndInsertBehind;
    HWND    hwnd;
} SWP;
typedef SWP FAR *PSWP;

BOOL   APIENTRY WinSetWindowPos(HWND hwnd, HWND hwndInsertBehind, SHORT x,
                                SHORT y, SHORT cx, SHORT cy, USHORT fs);
BOOL   APIENTRY WinQueryWindowPos(HWND hwnd, PSWP pswp);
BOOL   APIENTRY WinSetMultWindowPos(HAB hab, PSWP pswp, USHORT cswp);

/* Values returned from WM_ADJUSTWINDOWPOS and passed to WM_WINDOWPOSCHANGED */

#define AWP_MINIMIZED              0x00010000L
#define AWP_MAXIMIZED              0x00020000L
#define AWP_RESTORED               0x00040000L
#define AWP_ACTIVATE               0x00080000L
#define AWP_DEACTIVATE             0x00100000L

/* WinSetWindowPos() flags */

#define SWP_SIZE                   0x0001
#define SWP_MOVE                   0x0002
#define SWP_ZORDER                 0x0004
#define SWP_SHOW                   0x0008
#define SWP_HIDE                   0x0010
#define SWP_NOREDRAW               0x0020
#define SWP_NOADJUST               0x0040
#define SWP_ACTIVATE               0x0080
#define SWP_DEACTIVATE             0x0100
#define SWP_EXTSTATECHANGE         0x0200
#define SWP_MINIMIZE               0x0400
#define SWP_MAXIMIZE               0x0800
#define SWP_RESTORE                0x1000
#define SWP_FOCUSACTIVATE          0x2000
#define SWP_FOCUSDEACTIVATE        0x4000

/* Window painting */

BOOL  APIENTRY WinUpdateWindow(HWND hwnd);

BOOL  APIENTRY WinInvalidateRect(HWND hwnd, PRECTL pwrc, BOOL fIncludeChildren);
BOOL  APIENTRY WinInvalidateRegion(HWND hwnd, HRGN hrgn,
                                   BOOL fIncludeChildren);


/* Drawing helpers */

BOOL  APIENTRY WinInvertRect(HPS hps, PRECTL prcl);
BOOL  APIENTRY WinDrawBitmap(HPS hpsDst, HBITMAP hbm, PRECTL pwrcSrc,
                             PPOINTL pptlDst, LONG clrFore, LONG clrBack,
                             USHORT fs);

/* WinDrawBitmap() flags */

#define DBM_NORMAL                 0x0000
#define DBM_INVERT                 0x0001
#define DBM_HALFTONE               0x0002
#define DBM_STRETCH                0x0004
#define DBM_IMAGEATTRS             0x0008


SHORT APIENTRY WinDrawText(HPS hps, SHORT cchText, PCH lpchText, PRECTL prcl,
                           LONG clrFore, LONG clrBack, USHORT rgfCmd);
/*
 * WinDrawText() codes:
 * From DT_LEFT to DT_EXTERNALLEADING, the codes are designed to be OR'ed with
 * SS_TEXT to create variations of the basic text static item.
 */
#define DT_LEFT                    0x0000
#define DT_EXTERNALLEADING         0x0080
#define DT_CENTER                  0x0100
#define DT_RIGHT                   0x0200
#define DT_TOP                     0x0000
#define DT_VCENTER                 0x0400
#define DT_BOTTOM                  0x0800
#define DT_HALFTONE                0x1000
#define DT_MNEMONIC                0x2000
#define DT_WORDBREAK               0x4000
#define DT_ERASERECT               0x8000
#define DT_QUERYEXTENT             0x0002
#define DT_TEXTATTRS               0x0040


BOOL APIENTRY WinDrawBorder(HPS hps, PRECTL prcl, SHORT cx, SHORT cy,
                            LONG clrFore, LONG clrBack, USHORT rgfCmd);

/* WinDrawBorder() flags */

#define DB_PATCOPY                 0x0000
#define DB_PATINVERT               0x0001
#define DB_DESTINVERT              0x0002
#define DB_AREAMIXMODE             0x0003

#define DB_ROP                     0x0007
#define DB_INTERIOR                0x0008
#define DB_AREAATTRS               0x0010
#define DB_STANDARD                0x0100
#define DB_DLGBORDER               0x0200



/** Resource loading functions */

SHORT   APIENTRY WinLoadString(HAB hab, HMODULE hmod, USHORT id, SHORT cchMax,
                               PSZ pchBuffer);
#ifndef INCL_SAADEFS
SHORT   APIENTRY WinLoadMessage(HAB hab, HMODULE hmod, USHORT id, SHORT cchMax,
                                PSZ pchBuffer);


#endif /* !INCL_SAADEFS */

/***************************************************************************/
/****                 Window Manager Subsection part 2                  ****/
#if (defined(INCL_WINWINDOWMGR) || !defined(INCL_NOCOMMON))

BOOL APIENTRY WinSetActiveWindow(HWND hwndDesktop, HWND hwnd);

#endif /* Window Manager COMMON subsection */

#ifdef INCL_WINWINDOWMGR
/* WM_CREATE structure */

typedef struct _CREATESTRUCT { /* crst */
    PVOID   pPresParams;
    PVOID   pCtlData;
    USHORT  id;
    HWND    hwndInsertBehind;
    HWND    hwndOwner;
    SHORT   cy;
    SHORT   cx;
    SHORT   y;
    SHORT   x;
    ULONG   flStyle;
    PSZ     pszText;
    PSZ     pszClass;
    HWND    hwndParent;
} CREATESTRUCT;
typedef CREATESTRUCT FAR *PCREATESTRUCT;

/* WinQueryClassInfo() structure */

typedef struct _CLASSINFO { /* clsi */
    ULONG   flClassStyle;
    PFNWP   pfnWindowProc;
    USHORT  cbWindowData;
} CLASSINFO;
typedef CLASSINFO FAR *PCLASSINFO;

#ifndef INCL_SAADEFS
PFNWP  APIENTRY WinSubclassWindow(HWND hwnd, PFNWP pfnwp);
#endif /* !INCL_SAADEFS */

SHORT  APIENTRY WinQueryClassName(HWND hwnd, SHORT cchMax, PCH pch);
BOOL   APIENTRY WinQueryClassInfo(HAB hab, PSZ pszClassName,
                                  PCLASSINFO pClassInfo);

HWND   APIENTRY WinQueryActiveWindow(HWND hwndDesktop, BOOL fLock);

#ifndef INCL_SAADEFS
BOOL   APIENTRY WinIsThreadActive(HAB hab);
#endif /* !INCL_SAADEFS */
HWND   APIENTRY WinQuerySysModalWindow(HWND hwndDesktop, BOOL fLock);

HWND   APIENTRY WinLockWindow(HWND hwnd, BOOL fLock);
#ifndef INCL_SAADEFS
BOOL   APIENTRY WinRegisterWindowDestroy(HWND hwnd, BOOL fRegister);
#endif /* !INCL_SAADEFS */
BOOL   APIENTRY WinSetSysModalWindow(HWND hwndDesktop, HWND hwnd);

SHORT  APIENTRY WinQueryWindowLockCount(HWND hwnd);

#ifndef INCL_SAADEFS
USHORT APIENTRY WinQueryWindowUShort(HWND hwnd, SHORT index);
BOOL   APIENTRY WinSetWindowUShort(HWND hwnd, SHORT index, USHORT us);
ULONG  APIENTRY WinQueryWindowULong(HWND hwnd, SHORT index);
BOOL   APIENTRY WinSetWindowULong(HWND hwnd, SHORT index, ULONG ul);
PVOID  APIENTRY WinQueryWindowPtr(HWND hwnd, SHORT index);
BOOL   APIENTRY WinSetWindowPtr(HWND hwnd, SHORT index, PVOID p);
BOOL   APIENTRY WinSetWindowBits(HWND hwnd, SHORT index, ULONG flData,
                                 ULONG flMask);

/* Standard WinQueryWindowUShort/ULong() indices */

#define QWS_USER                   0
#define QWS_ID                     (-1)
#define QWS_MIN                    (-1)

#define QWL_USER                   0
#define QWL_STYLE                  (-2)
#define QWP_PFNWP                  (-3)
#define QWL_HMQ                    (-4)
#define QWL_MIN                    (-4)

/* WC_FRAME WinQueryWindowUShort/ULong() indices */

#define QWL_HHEAP                  0x0004
#define QWL_HWNDFOCUSSAVE          0x0018

#define QWS_FLAGS                  0x0008
#define QWS_RESULT                 0x000a
#define QWS_XRESTORE               0x000c
#define QWS_YRESTORE               0x000e
#define QWS_CXRESTORE              0x0010
#define QWS_CYRESTORE              0x0012
#define QWS_XMINIMIZE              0x0014
#define QWS_YMINIMIZE              0x0016


/* Window enumeration */

typedef LHANDLE HENUM;  /* henum */

HENUM APIENTRY WinBeginEnumWindows(HWND hwnd);
HWND  APIENTRY WinGetNextWindow(HENUM henum);
BOOL  APIENTRY WinEndEnumWindows(HENUM henum);

#endif /* !INCL_SAADEFS */

HWND  APIENTRY WinWindowFromPoint(HWND hwnd, PPOINTL pptl, BOOL fChildren,
                                  BOOL fLock);
BOOL  APIENTRY WinMapWindowPoints(HWND hwndFrom, HWND hwndTo, PPOINTL prgptl,
                                  SHORT cwpt);

/* More window painting functions */

BOOL  APIENTRY WinValidateRect(HWND hwnd, PRECTL prcl, BOOL fIncludeChildren);
BOOL  APIENTRY WinValidateRegion(HWND hwnd, HRGN hrgn, BOOL fIncludeChildren);
#ifndef INCL_SAADEFS
HWND  APIENTRY WinWindowFromDC(HDC hdc);
HDC   APIENTRY WinQueryWindowDC(HWND hwnd);
HPS   APIENTRY WinGetScreenPS(HWND hwndDesktop);
BOOL  APIENTRY WinLockWindowUpdate(HWND hwndDesktop, HWND hwndLockUpdate);
BOOL  APIENTRY WinLockVisRegions(HWND hwndDesktop, BOOL fLock);
#endif /* !INCL_SAADEFS */
BOOL  APIENTRY WinQueryUpdateRect(HWND hwnd, PRECTL prcl);
SHORT APIENTRY WinQueryUpdateRegion(HWND hwnd, HRGN hrgn);
SHORT APIENTRY WinExcludeUpdateRegion(HPS hps, HWND hwnd);

#endif /* INCL_WINWINDOWMGR */

#if (defined(INCL_WINMESSAGEMGR) || !defined(INCL_NOCOMMON))

/* QMSG structure */

typedef struct _QMSG { /* qmsg */
    HWND    hwnd;
    USHORT  msg;
    MPARAM  mp1;
    MPARAM  mp2;
    ULONG   time;
    POINTL  ptl;
} QMSG;
typedef QMSG FAR *PQMSG;

typedef LHANDLE HMQ;    /* hmq */

/*
** This is the standard function definition for window procedures.
** Typically they are names like "XxxxxxxxWndProc", where the prefix
** "Xxxxxxxxx" is replaced by some name descriptive of the window procedure
** being declared.  Window procedures must be EXPORTED in the definitions
** file used by the linker.
**
** MRESULT EXPENTRY MyclassWndProc(HWND hwnd,   ** window handle        **
**                                 USHORT msg,  ** message number       **
**                                 MPARAM mp1,  ** 1st (packed) parms   **
**                                 MPARAM mp2); ** 2nd (packed) parms   **
*/

/* Standard Window Messages */

#define WM_NULL                    0x0000
#define WM_CREATE                  0x0001
#define WM_DESTROY                 0x0002

#ifndef INCL_SAADEFS
#define WM_OTHERWINDOWDESTROYED    0x0003
#endif /* !INCL_SAADEFS */

#define WM_ENABLE                  0x0004
#define WM_SHOW                    0x0005
#define WM_MOVE                    0x0006
#define WM_SIZE                    0x0007
#define WM_ADJUSTWINDOWPOS         0x0008

#define WM_CALCVALIDRECTS          0x0009

#define WM_SETWINDOWPARAMS         0x000a
#define WM_QUERYWINDOWPARAMS       0x000b
#define WM_HITTEST                 0x000c
#define WM_ACTIVATE                0x000d
#define WM_SETFOCUS                0x000f
#define WM_SETSELECTION            0x0010

/* language support Winproc */
#define WM_PPAINT                  0x0011
#define WM_PSETFOCUS               0x0012
#define WM_PSYSCOLORCHANGE         0x0013
#define WM_PSIZE                   0x0014
#define WM_PACTIVATE               0x0015
#define WM_PCONTROL                0x0016


#define WM_COMMAND                 0x0020
#define WM_SYSCOMMAND              0x0021
#define WM_HELP                    0x0022
#define WM_PAINT                   0x0023

#ifndef INCL_SAADEFS
#define WM_TIMER                   0x0024
#define WM_SEM1                    0x0025
#define WM_SEM2                    0x0026
#define WM_SEM3                    0x0027
#define WM_SEM4                    0x0028
#endif /* !INCL_SAADEFS */

#define WM_CLOSE                   0x0029
#define WM_QUIT                    0x002a
#define WM_SYSCOLORCHANGE          0x002b
#define WM_SYSVALUECHANGED         0x002d
#define WM_APPTERMINATENOTIFY      0x002e
#define WM_PRESPARAMCHANGED        0x002f

/* Control notification messages */

#define WM_CONTROL                 0x0030
#define WM_VSCROLL                 0x0031
#define WM_HSCROLL                 0x0032
#define WM_INITMENU                0x0033
#define WM_MENUSELECT              0x0034
#define WM_MENUEND                 0x0035
#define WM_DRAWITEM                0x0036
#define WM_MEASUREITEM             0x0037
#define WM_CONTROLPOINTER          0x0038
#define WM_CONTROLHEAP             0x0039
#define WM_QUERYDLGCODE            0x003a
#define WM_INITDLG                 0x003b
#define WM_SUBSTITUTESTRING        0x003c
#define WM_MATCHMNEMONIC           0x003d
#define WM_SAVEAPPLICATION         0x003e

/* Reserve a range of messages for help manager.  This range includes  */
/* public messages, defined below, and private ones, which need to be  */
/* reserved here to prevent clashing with application messages         */

#define WM_HELPBASE                0x0F00 /* Start of msgs for help manager   */
#define WM_HELPTOP                 0x0FFF /* End of msgs for help manager     */

#define WM_USER                    0x1000

/* WM_COMMAND msg source codes */

#define CMDSRC_PUSHBUTTON          1
#define CMDSRC_MENU                2
#define CMDSRC_ACCELERATOR         3
#define CMDSRC_OTHER               0

/*
 * The following structure and macro are used to access the
 * WM_COMMAND, WM_HELP, and WM_SYSCOMMAND message parameters:
 */
typedef struct _COMMANDMSG { /* commandmsg */
    USHORT  source;          /* mp2 */
    BOOL    fMouse;
    USHORT  cmd;             /* mp1 */
    USHORT  unused;
} CMDMSG;

#define COMMANDMSG(pmsg) \
        ((struct _COMMANDMSG FAR *)((PBYTE)pmsg - sizeof(MPARAM) * 2))

/*
 * The following structure is used by the WinQueryQueueInfo() routine
 */
typedef struct _MQINFO { /* mqi */
    USHORT  cb;
    PID     pid;
    TID     tid;
    USHORT  cmsgs;
    PVOID   pReserved;
} MQINFO;
typedef MQINFO FAR *PMQINFO;


MRESULT APIENTRY WinSendMsg(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2);
HMQ     APIENTRY WinCreateMsgQueue(HAB hab, SHORT cmsg);
BOOL    APIENTRY WinDestroyMsgQueue(HMQ hmq);
BOOL    APIENTRY WinQueryQueueInfo(HMQ hmq, PMQINFO pmqi, USHORT cbCopy);

#ifndef INCL_SAADEFS
BOOL    APIENTRY WinCancelShutdown(HMQ hmq, BOOL fCancelAlways);
#endif /* INCL_SAADEFS */

BOOL    APIENTRY WinGetMsg(HAB hab, PQMSG pqmsg, HWND hwndFilter,
                           USHORT msgFilterFirst, USHORT msgFilterLast);
BOOL    APIENTRY WinPeekMsg(HAB hab, PQMSG pqmsg, HWND hwndFilter,
                            USHORT msgFilterFirst, USHORT msgFilterLast,
                            USHORT fs);

MRESULT APIENTRY WinDispatchMsg(HAB hab, PQMSG pqmsg);

BOOL    APIENTRY WinPostMsg(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2);
BOOL    APIENTRY WinRegisterUserMsg(HAB hab, USHORT msgid, SHORT datatype1,
                                    SHORT dir1, SHORT datatype2, SHORT dir2,
                                    SHORT datatyper);
BOOL    APIENTRY WinRegisterUserDatatype(HAB hab, SHORT datatype,
                                         SHORT count, PSHORT types);
BOOL    APIENTRY WinSetMsgMode(HAB hab, PSZ classname,
                               SHORT control);
BOOL    APIENTRY WinSetSynchroMode(HAB hab, SHORT mode);

/* WinPeekMsg() constants */

#define PM_REMOVE                  0x0001
#define PM_NOREMOVE                0x0000

/* WinRegisterUserDatatype datatypes defined in separate file */
#ifdef INCL_WINTYPES
  #include <pmtypes.h>
#endif /*INCL_WINTYPES*/

/* WinRegisterUserMsg direction codes */

#define RUM_IN                     1
#define RUM_OUT                    2
#define RUM_INOUT                  3

/* WinSetMsgMode constants */

#define SMD_DELAYED                0x0001
#define SMD_IMMEDIATE              0x0002

/* WinSetSynchroMode constants */

#define SSM_SYNCHRONOUS            0x0001
#define SSM_ASYNCHRONOUS           0x0002
#define SSM_MIXED                  0x0003

#endif /* WINMESSAGEMGR || !INCL_NOCOMMON       */

#ifdef INCL_WINMESSAGEMGR

/* WM_CALCVALIDRECTS return flags */

#define CVR_ALIGNLEFT               0x0001
#define CVR_ALIGNBOTTOM             0x0002
#define CVR_ALIGNRIGHT              0x0004
#define CVR_ALIGNTOP                0x0008
#define CVR_REDRAW                  0x0010


/* WM_HITTEST return codes */

#define HT_NORMAL                  0
#define HT_TRANSPARENT             (-1)
#define HT_DISCARD                 (-2)
#define HT_ERROR                   (-3)


/* WM_SET/QUERYWINDOWPARAMS structures and flags */

typedef struct _WNDPARAMS { /* wprm */
    USHORT  fsStatus;
    USHORT  cchText;
    PSZ     pszText;
    USHORT  cbPresParams;
    PVOID   pPresParams;
    USHORT  cbCtlData;
    PVOID   pCtlData;
} WNDPARAMS;
typedef WNDPARAMS FAR *PWNDPARAMS;

/* Flags used by WM_SET/QUERYWINDOWPARAMS */

#define WPM_TEXT                   0x0001
#define WPM_CTLDATA                0x0002
#define WPM_PRESPARAMS             0x0004
#define WPM_CCHTEXT                0x0008
#define WPM_CBCTLDATA              0x0010
#define WPM_CBPRESPARAMS           0x0020

#ifndef INCL_SAADEFS
BOOL    APIENTRY WinInSendMsg(HAB hab);

#endif /* INCL_SAADEFS */

BOOL    APIENTRY WinBroadcastMsg(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2,
                                 USHORT rgf);

/* WinBroadcastMsg codes */

#define BMSG_POST                  0x0000
#define BMSG_SEND                  0x0001
#define BMSG_POSTQUEUE             0x0002
#define BMSG_DESCENDANTS           0x0004
#define BMSG_FRAMEONLY             0x0008



BOOL  APIENTRY WinWaitMsg(HAB hab, USHORT msgFirst, USHORT msgLast);

#ifndef INCL_SAADEFS
ULONG APIENTRY WinQueryQueueStatus(HWND hwndDesktop);

/* WinQueryQueueStatus() constants */

#define QS_KEY                     0x0001
#define QS_MOUSEBUTTON             0x0002
#define QS_MOUSEMOVE               0x0004
#define QS_MOUSE                   0x0006   /* QS_MOUSEMOVE|QS_MOUSEBUTTON */
#define QS_TIMER                   0x0008
#define QS_PAINT                   0x0010
#define QS_POSTMSG                 0x0020
#define QS_SEM1                    0x0040
#define QS_SEM2                    0x0080
#define QS_SEM3                    0x0100
#define QS_SEM4                    0x0200
#define QS_SENDMSG                 0x0400


BOOL  APIENTRY WinQueryMsgPos(HAB hab, PPOINTL pptl);
ULONG APIENTRY WinQueryMsgTime(HAB hab);

USHORT APIENTRY WinMsgSemWait(HSEM hsem, LONG dtTimeout);
USHORT APIENTRY WinMsgMuxSemWait(PUSHORT pisemCleared, PVOID pmxsl,
                                 LONG dtTimeout);
#endif /* !INCL_SAADEFS */
BOOL  APIENTRY WinPostQueueMsg(HMQ hmq, USHORT msg, MPARAM mp1, MPARAM mp2);


/* WinSetMsgInterest()/WinSetClassMsgInterest() constants */
#define SMIM_ALL                   0x0EFF
#define SMI_NOINTEREST             0x0001
#define SMI_INTEREST               0x0002
#define SMI_RESET                  0x0004
#define SMI_AUTODISPATCH           0x0008

BOOL  APIENTRY WinSetMsgInterest(HWND hwnd, USHORT msg_class, SHORT control);
BOOL  APIENTRY WinSetClassMsgInterest(HAB hab, PSZ pszClassName,
                                      USHORT msg_class, SHORT control);

#endif /* INCL_WINMESSAGEMGR */

/*** Keyboard and mouse */

#if (defined(INCL_WININPUT) || !defined(INCL_NOCOMMON))

/*** Keyboard and mouse input COMMON subsection */
BOOL  APIENTRY WinSetFocus(HWND hwndDesktop, HWND hwndSetFocus);
BOOL  APIENTRY WinFocusChange(HWND hwndDesktop, HWND hwndSetFocus,
                              USHORT fsFocusChange);

#define FC_NOSETFOCUS              0x0001
#define FC_NOBRINGTOTOP            FC_NOSETFOCUS
#define FC_NOLOSEFOCUS             0x0002
#define FC_NOBRINGTOPFIRSTWINDOW   FC_NOLOSEFOCUS
#define FC_NOSETACTIVEFOCUS        0x0003
#define FC_NOSETACTIVE             0x0004
#define FC_NOLOSEACTIVE            0x0008
#define FC_NOSETSELECTION          0x0010
#define FC_NOLOSESELECTION         0x0020

#define QFC_NEXTINCHAIN            0x0001
#define QFC_ACTIVE                 0x0002
#define QFC_FRAME                  0x0003
#define QFC_SELECTACTIVE           0x0004

#endif  /* Keyboard and mouse input COMMON subsection */

#ifdef INCL_WININPUT

#ifndef INCL_SAADEFS
BOOL  APIENTRY WinSetCapture(HWND hwndDesktop, HWND hwnd);
#endif /* !INCL_SAADEFS */
HWND  APIENTRY WinQueryCapture(HWND hwndDesktop, BOOL fLock);

/* Mouse input messages */

#ifndef INCL_SAADEFS
#define WM_MOUSEFIRST              0x0070
#define WM_MOUSELAST               0x0079
#define WM_BUTTONCLICKFIRST        0x0071
#define WM_BUTTONCLICKLAST         0x0079
#endif /* !INCL_SAADEFS */
#define WM_MOUSEMOVE               0x0070

#define WM_BUTTON1DOWN             0x0071

#define WM_BUTTON1UP               0x0072
#define WM_BUTTON1DBLCLK           0x0073
#define WM_BUTTON2DOWN             0x0074
#define WM_BUTTON2UP               0x0075
#define WM_BUTTON2DBLCLK           0x0076
#ifndef INCL_SAADEFS
#define WM_BUTTON3DOWN             0x0077
#define WM_BUTTON3UP               0x0078
#define WM_BUTTON3DBLCLK           0x0079
#endif /* !INCL_SAADEFS */

HWND  APIENTRY WinQueryFocus(HWND hwndDesktop, BOOL fLock);


/* Key/Character input messages */

#define WM_CHAR                    0x007a
#define WM_VIOCHAR                 0x007b

/* WM_CHAR fs field bits */

#define KC_CHAR                    0x0001
#define KC_VIRTUALKEY              0x0002
#define KC_SCANCODE                0x0004

#define KC_SHIFT                   0x0008
#define KC_CTRL                    0x0010
#define KC_ALT                     0x0020
#define KC_KEYUP                   0x0040
#define KC_PREVDOWN                0x0080
#define KC_LONEKEY                 0x0100
#define KC_DEADKEY                 0x0200
#define KC_COMPOSITE               0x0400
#define KC_INVALIDCOMP             0x0800

#ifndef INCL_SAADEFS
#define KC_TOGGLE                  0x1000
#define KC_INVALIDCHAR             0x2000
#define KC_DBCSRSRVD1              0x4000
#define KC_DBCSRSRVD2              0x8000
#endif /* !INCL_SAADEFS */

/*
 * The following structure and macro are used to access the
 * WM_MOUSEMOVE, and WM_BUTTON message parameters
 */
typedef struct _MOUSEMSG { /* mousemsg */
    USHORT  codeHitTest;   /* mp2      */
    USHORT  unused;
    SHORT   x;             /* mp1      */
    SHORT   y;
} MSEMSG;

#define MOUSEMSG(pmsg) \
        ((struct _MOUSEMSG FAR *)((PBYTE)pmsg - sizeof(MPARAM) * 2))

/*
 * The following structure and macro are used to access the
 * WM_CHAR message parameters.
 */
typedef struct _CHARMSG { /* charmsg */
    USHORT  chr;          /* mp2     */
    USHORT  vkey;
    USHORT  fs;           /* mp1     */
    UCHAR   cRepeat;
    UCHAR   scancode;
} CHRMSG;

#define CHARMSG(pmsg) \
        ((struct _CHARMSG FAR *)((PBYTE)pmsg - sizeof(MPARAM) * 2))

/*** Virtual key values */

#define VK_BUTTON1                 0x01
#define VK_BUTTON2                 0x02
#define VK_BUTTON3                 0x03
#define VK_BREAK                   0x04
#define VK_BACKSPACE               0x05
#define VK_TAB                     0x06
#define VK_BACKTAB                 0x07
#define VK_NEWLINE                 0x08
#define VK_SHIFT                   0x09
#define VK_CTRL                    0x0A
#define VK_ALT                     0x0B
#define VK_ALTGRAF                 0x0C
#define VK_PAUSE                   0x0D
#define VK_CAPSLOCK                0x0E
#define VK_ESC                     0x0F
#define VK_SPACE                   0x10
#define VK_PAGEUP                  0x11
#define VK_PAGEDOWN                0x12
#define VK_END                     0x13
#define VK_HOME                    0x14
#define VK_LEFT                    0x15
#define VK_UP                      0x16
#define VK_RIGHT                   0x17
#define VK_DOWN                    0x18
#define VK_PRINTSCRN               0x19
#define VK_INSERT                  0x1A
#define VK_DELETE                  0x1B
#define VK_SCRLLOCK                0x1C
#define VK_NUMLOCK                 0x1D
#define VK_ENTER                   0x1E
#define VK_SYSRQ                   0x1F
#define VK_F1                      0x20
#define VK_F2                      0x21
#define VK_F3                      0x22
#define VK_F4                      0x23
#define VK_F5                      0x24
#define VK_F6                      0x25
#define VK_F7                      0x26
#define VK_F8                      0x27
#define VK_F9                      0x28
#define VK_F10                     0x29
#define VK_F11                     0x2A
#define VK_F12                     0x2B
#define VK_F13                     0x2C
#define VK_F14                     0x2D
#define VK_F15                     0x2E
#define VK_F16                     0x2F
#define VK_F17                     0x30
#define VK_F18                     0x31
#define VK_F19                     0x32
#define VK_F20                     0x33
#define VK_F21                     0x34
#define VK_F22                     0x35
#define VK_F23                     0x36
#define VK_F24                     0x37


#define VK_MENU                    VK_F10
#ifdef INCL_NLS
#define VK_DBCSFIRST               0x0080
#define VK_DBCSLAST                0x00ff
#endif /* INCL_NLS */

#define VK_USERFIRST               0x0100
#define VK_USERLAST                0x01ff

#ifndef INCL_SAADEFS

SHORT APIENTRY WinGetKeyState(HWND hwndDesktop, SHORT vkey);
SHORT APIENTRY WinGetPhysKeyState(HWND hwndDesktop, SHORT sc);
BOOL  APIENTRY WinEnablePhysInput(HWND hwndDesktop, BOOL fEnable);
BOOL  APIENTRY WinIsPhysInputEnabled(HWND hwndDesktop);
BOOL  APIENTRY WinSetKeyboardStateTable(HWND hwndDesktop,
                                        PBYTE pKeyStateTable, BOOL fSet);


/* Journal Notification messages  */
#define WM_JOURNALNOTIFY           0x007c

/*** Define the valid commands (lParm1) for journal notify message */
#define JRN_QUEUESTATUS            0x00000001L
#define JRN_PHYSKEYSTATE           0x00000002L

#endif /* !INCL_SAADEFS */
#endif /* INCL_WININPUT */


/**** Dialog Manager */

#if (defined(INCL_WINDIALOGS) || !defined(INCL_NOCOMMON))
/**** Dialog Manager COMMON subsection */

/*
** This is the standard function definition for dialog procedures.
** Typically they are names like "XxxxxxxxDlgProc", where the prefix
** "Xxxxxxxxx" is replaced by some name descriptive of the dialog procedure
** being declared.  Dialog procedures must be EXPORTED in the definitions
** file used by the linker.  The dialog procedure declaration is identical
** to that for window procedures.
**
** MRESULT EXPENTRY MydialogDlgProc(HWND hwnd,   ** window handle        **
**                                  USHORT msg,  ** message number       **
**                                  MPARAM mp1,  ** 1st (packed) parms   **
**                                  MPARAM mp2); ** 2nd (packed) parms   **
*/

BOOL    APIENTRY WinGetDlgMsg(HWND hwndDlg, PQMSG pqmsg);


HWND    APIENTRY WinLoadDlg(HWND hwndParent, HWND hwndOwner, PFNWP pfnDlgProc,
                            HMODULE hmod, USHORT idDlg, PVOID pCreateParams);
USHORT  APIENTRY WinDlgBox(HWND hwndParent, HWND hwndOwner, PFNWP pfnDlgProc,
                           HMODULE hmod, USHORT idDlg, PVOID pCreateParams);

BOOL    APIENTRY WinDismissDlg(HWND hwndDlg, USHORT usResult);

BOOL    APIENTRY WinQueryDlgItemShort(HWND hwndDlg, USHORT idItem,
                                      PSHORT pResult, BOOL fSigned);
BOOL    APIENTRY WinSetDlgItemShort(HWND hwndDlg, USHORT idItem,
                                    USHORT usValue, BOOL fSigned);
BOOL    APIENTRY WinSetDlgItemText(HWND hwndDlg, USHORT idItem, PSZ pszText);
USHORT  APIENTRY WinQueryDlgItemText(HWND hwndDlg, USHORT idItem,
                                     SHORT cchBufferMax, PSZ pchBuffer);
SHORT   APIENTRY WinQueryDlgItemTextLength(HWND hwndDlg, USHORT idItem);

MRESULT APIENTRY WinDefDlgProc(HWND hwndDlg, USHORT msg, MPARAM mp1,
                               MPARAM mp2);

/* Special item IDs */

#ifndef INCL_SAADEFS
#define DID_OK      1
#define DID_CANCEL  2
#define DID_ERROR   0xffff
#endif /* !INCL_SAADEFS */

BOOL APIENTRY WinAlarm(HWND hwndDesktop, USHORT rgfType);

/* WinAlarm Codes */

#define WA_WARNING                 0
#define WA_NOTE                    1
#define WA_ERROR                   2
#define WA_CWINALARMS              3

USHORT APIENTRY WinMessageBox(HWND hwndParent, HWND hwndOwner, PSZ pszText,
                              PSZ pszCaption, USHORT idWindow, USHORT flStyle);

/* Message box types */

#define MB_OK                      0x0000
#define MB_OKCANCEL                0x0001
#define MB_RETRYCANCEL             0x0002
#define MB_ABORTRETRYIGNORE        0x0003
#define MB_YESNO                   0x0004
#define MB_YESNOCANCEL             0x0005
#define MB_CANCEL                  0x0006
#define MB_ENTER                   0x0007
#define MB_ENTERCANCEL             0x0008

#define MB_NOICON                  0x0000
#define MB_CUANOTIFICATION         0x0000
#define MB_ICONQUESTION            0x0010
#define MB_ICONEXCLAMATION         0x0020
#define MB_CUAWARNING              0x0020
#define MB_ICONASTERISK            0x0030
#define MB_ICONHAND                0x0040
#define MB_CUACRITICAL             0x0040
#define MB_QUERY                   MB_ICONQUESTION
#define MB_WARNING                 MB_CUAWARNING
#define MB_INFORMATION             MB_ICONASTERISK
#define MB_CRITICAL                MB_CUACRITICAL
#define MB_ERROR                   MB_CRITICAL

#define MB_DEFBUTTON1              0x0000
#define MB_DEFBUTTON2              0x0100
#define MB_DEFBUTTON3              0x0200

#define MB_APPLMODAL               0x0000
#define MB_SYSTEMMODAL             0x1000
#define MB_HELP                    0x2000
#define MB_MOVEABLE                0x4000


/* Message box return codes */

#define MBID_OK                    1
#define MBID_CANCEL                2
#define MBID_ABORT                 3
#define MBID_RETRY                 4
#define MBID_IGNORE                5
#define MBID_YES                   6
#define MBID_NO                    7
#define MBID_HELP                  8
#define MBID_ENTER                 9
#define MBID_ERROR                 0xffff

#endif /* Dialog Manager COMMON subsection */


#ifdef INCL_WINDIALOGS

/* Dialog codes: returned by WM_QUERYDLGCODE msg     */

#define DLGC_ENTRYFIELD    0x0001  /* Entry field item understands EM_SETSEL) */
#define DLGC_BUTTON        0x0002  /* Button item                             */
#define DLGC_RADIOBUTTON   0x0004  /* Radio button                            */
#define DLGC_STATIC        0x0008  /* Static item                             */
#define DLGC_DEFAULT       0x0010  /* Default push button                     */
#define DLGC_PUSHBUTTON    0x0020  /* Normal (Non-default) push button        */
#define DLGC_CHECKBOX      0x0040  /* Check box button control                */
#define DLGC_SCROLLBAR     0x0080  /* Scroll bar                              */
#define DLGC_MENU          0x0100  /* Menu                                    */
#define DLGC_TABONCLICK    0x0200
#define DLGC_MLE           0x0400  /* Multiple Line Entry                     */


USHORT  APIENTRY WinProcessDlg(HWND hwndDlg);
USHORT  APIENTRY WinStartDlg(HWND hwndDlg);
MRESULT APIENTRY WinSendDlgItemMsg(HWND hwndDlg, USHORT idItem, USHORT msg,
                                   MPARAM mp1, MPARAM mp2);
BOOL    APIENTRY WinMapDlgPoints(HWND hwndDlg, PPOINTL prgwptl, USHORT cwpt,
                                 BOOL fCalcWindowCoords);
HWND    APIENTRY WinEnumDlgItem(HWND hwndDlg, HWND hwnd, USHORT code,
                                BOOL fLock);
SHORT   APIENTRY WinSubstituteStrings(HWND hwnd, PSZ pszSrc, SHORT cchDstMax,
                                      PSZ pszDst);

/* WinEnumDlgItem() constants
 *
 * In OS/2 1.2, WinEnumDlgItem() can enumerate a window such that the
 * selection cursor may be moved  according to CUA (Common User Access)
 * rules.
 */

#define EDI_FIRSTTABITEM           0
#define EDI_LASTTABITEM            1
#define EDI_NEXTTABITEM            2
#define EDI_PREVTABITEM            3
#define EDI_FIRSTGROUPITEM         4
#define EDI_LASTGROUPITEM          5
#define EDI_NEXTGROUPITEM          6
#define EDI_PREVGROUPITEM          7

/*** Dialog template definitions */

/* Variable-sized dialog template items: */

typedef struct _DLGTITEM { /* dlgti */
    USHORT  fsItemStatus;
    USHORT  cChildren;
    USHORT  cchClassName;
    USHORT  offClassName;
    USHORT  cchText;
    USHORT  offText;
    ULONG   flStyle;
    SHORT   x;
    SHORT   y;
    SHORT   cx;
    SHORT   cy;
    USHORT  id;
    USHORT  offPresParams;
    USHORT  offCtlData;
} DLGTITEM;
typedef DLGTITEM FAR *PDLGTITEM;

/* Dialog Template structure */

typedef struct _DLGTEMPLATE { /* dlgt */
    USHORT   cbTemplate;
    USHORT   type;
    USHORT   codepage;
    USHORT   offadlgti;
    USHORT   fsTemplateStatus;
    USHORT   iItemFocus;
    USHORT   coffPresParams;
    DLGTITEM adlgti[1];
} DLGTEMPLATE;
typedef DLGTEMPLATE FAR *PDLGTEMPLATE;

HWND   APIENTRY WinCreateDlg(HWND hwndParent, HWND hwndOwner, PFNWP pfnDlgProc,
                             PDLGTEMPLATE pdlgt, PVOID pCreateParams);


#endif /* INCL_WINDIALOGS */


#ifdef INCL_WINSTATICS

/*** Static Control Manager */

/* Static control styles:
 *
 * NOTE: the top 9 bits of the LOWORD of the window flStyle are used for
 * DT_* flags.  The lower 7 bits are for SS_* styles.  This gives us up
 * to 128 distinct static control types (we currently use 11 of them).
 */
#define SS_TEXT                    0x0001L
#define SS_GROUPBOX                0x0002L

#ifndef INCL_SAADEFS
#define SS_ICON                    0x0003L
#define SS_BITMAP                  0x0004L
#endif /* !INCL_SAADEFS */
#define SS_FGNDRECT                0x0005L
#ifndef INCL_SAADEFS
#define SS_HALFTONERECT            0x0006L
#endif /* !INCL_SAADEFS */
#define SS_BKGNDRECT               0x0007L
#define SS_FGNDFRAME               0x0008L
#ifndef INCL_SAADEFS
#define SS_HALFTONEFRAME           0x0009L
#endif /* !INCL_SAADEFS */
#define SS_BKGNDFRAME              0x000aL
#define SS_SYSICON                 0x000bL

/* Static control class name */

#define WC_STATIC            ((PSZ)0xffff0005L)

/* Static control messages */

#define SM_SETHANDLE               0x0100
#define SM_QUERYHANDLE             0x0101

#endif /* INCL_WINSTATICS */


#ifdef INCL_WINBUTTONS
/**** Button Controls Subsection */

/* Button control styles */

#define BS_PUSHBUTTON              0L
#define BS_CHECKBOX                1L
#define BS_AUTOCHECKBOX            2L
#define BS_RADIOBUTTON             3L
#define BS_AUTORADIOBUTTON         4L
#define BS_3STATE                  5L
#define BS_AUTO3STATE              6L

#ifndef INCL_SAADEFS
#define BS_USERBUTTON              7L
#endif /* !INCL_SAADEFS */

#define BS_HELP                    0x0100L
#define BS_SYSCOMMAND              0x0200L
#define BS_DEFAULT                 0x0400L
#define BS_NOPOINTERFOCUS          0x0800L
#define BS_NOBORDER                0x1000L
#define BS_NOCURSORSELECT          0x2000L


/* Button class name */

#define WC_BUTTON       ((PSZ)0xffff0003L)


#ifndef INCL_SAADEFS
typedef struct _BTNCDATA { /* btncd */
    USHORT  cb;
    USHORT  fsCheckState;
    USHORT  fsHiliteState;
} BTNCDATA;
typedef BTNCDATA FAR *PBTNCDATA;
#endif /* !INCL_SAADEFS */

/* User button structure (passed in WM_CONTROL msg) */

#ifndef INCL_SAADEFS
typedef struct _USERBUTTON { /* ubtn */
    HWND    hwnd;
    HPS     hps;
    USHORT  fsState;
    USHORT  fsStateOld;
} USERBUTTON;
typedef USERBUTTON FAR *PUSERBUTTON;
#endif /* !INCL_SAADEFS */

/* Button control messages */

#define BM_CLICK                   0x0120
#define BM_QUERYCHECKINDEX         0x0121
#define BM_QUERYHILITE             0x0122
#define BM_SETHILITE               0x0123
#define BM_QUERYCHECK              0x0124
#define BM_SETCHECK                0x0125
#define BM_SETDEFAULT              0x0126

/* Button notification codes */

#define BN_CLICKED                 1
#define BN_DBLCLICKED              2
#define BN_PAINT                   3

/* BN_PAINT button draw state codes (must be in high byte) */

#ifndef INCL_SAADEFS
#define BDS_HILITED                0x0100
#define BDS_DISABLED               0x0200
#define BDS_DEFAULT                0x0400

#endif /* !INCL_SAADEFS */

#endif /* INCL_WINBUTTONS */


#ifdef INCL_WINENTRYFIELDS
/**** Entryfield controls Subsection */

/* Entry field  styles */

#define ES_LEFT                    0x00000000L
#define ES_CENTER                  0x00000001L
#define ES_RIGHT                   0x00000002L

#ifndef INCL_SAADEFS
#define ES_AUTOSCROLL              0x00000004L
#endif /* !INCL_SAADEFS */

#define ES_MARGIN                  0x00000008L
#define ES_AUTOTAB                 0x00000010L
#define ES_READONLY                0x00000020L
#define ES_COMMAND                 0x00000040L
#define ES_UNREADABLE              0x00000080L
#define ES_PICTUREMASK             0x00000100L

#ifdef INCL_NLS
#define ES_ANY                     0x00000000L
#define ES_SBCS                    0x00001000L
#define ES_DBCS                    0x00002000L
#define ES_MIXED                   0x00003000L   /* ES_SBCS | ES_DBCS */
#endif /* INCL_NLS */

#define WC_COMBOBOX          ((PSZ)0xffff0002L)

/*
 * combo box styles
 */
#define CBS_SIMPLE                 0x0001L
#define CBS_DROPDOWN               0x0002L
#define CBS_DROPDOWNLIST           0x0004L

/*
 *IDs of combobox entry field and listbox.
 */
#define CBID_LIST                  0x029A
#define CBID_EDIT                  0x029B

#define CBM_SHOWLIST               0x0170
#define CBM_HILITE                 0x0171
#define CBM_ISLISTSHOWING          0x0172

#define CBN_EFCHANGE               1
#define CBN_EFSCROLL               2
#define CBN_MEMERROR               3
#define CBN_LBSELECT               4
#define CBN_LBSCROLL               5
#define CBN_SHOWLIST               6
#define CBN_ENTER                  7

#define WC_ENTRYFIELD        ((PSZ)0xffff0006L)

#ifndef INCL_SAADEFS
typedef struct _ENTRYFDATA { /* efd */
    USHORT  cb;
    USHORT  cchEditLimit;
    USHORT  ichMinSel;
    USHORT  ichMaxSel;
} ENTRYFDATA;
typedef ENTRYFDATA FAR *PENTRYFDATA;

#endif /* !INCL_SAADEFS */

/* Entry Field  messages */

#define EM_QUERYCHANGED            0x0140
#define EM_QUERYSEL                0x0141
#define EM_SETSEL                  0x0142
#define EM_SETTEXTLIMIT            0x0143

#ifndef INCL_SAADEFS
#define EM_CUT                     0x0144
#define EM_COPY                    0x0145
#endif /* !INCL_SAADEFS */
#define EM_CLEAR                   0x0146
#ifndef INCL_SAADEFS
#define EM_PASTE                   0x0147
#endif /* !INCL_SAADEFS */
#define EM_QUERYFIRSTCHAR          0x0148
#define EM_SETFIRSTCHAR            0x0149
#ifndef INCL_SAADEFS
#define EM_QUERYREADONLY           0x014a
#define EM_SETREADONLY             0x014b
#define EM_SETINSERTMODE           0x014c
#endif /* !INCL_SAADEFS */

/* Entry Field notification messages */

#define EN_SETFOCUS                0x0001
#define EN_KILLFOCUS               0x0002
#define EN_CHANGE                  0x0004
#define EN_SCROLL                  0x0008
#ifndef INCL_SAADEFS
#define EN_MEMERROR                0x0010
#define EN_OVERFLOW                0x0020
#define EN_INSERTMODETOGGLE        0x0040
#endif /* !INCL_SAADEFS */

#endif /* INCL_WINENTRYFIELDS */


/*  Multiple Line Entrys */
#ifdef INCL_WINMLE
#define WC_MLE     ((PSZ)0xffff000aL)
#include <pmmle.h>
#endif /* !INCL_WINMLE */


#ifdef INCL_WINLISTBOXES

/**** Listboxes */

/* List box styles */

#define LS_MULTIPLESEL             0x00000001L

#ifndef INCL_SAADEFS
#define LS_OWNERDRAW               0x00000002L
#endif /* !INCL_SAADEFS */

#define LS_NOADJUSTPOS             0x00000004L
#define LS_HORZSCROLL              0x00000008L


/* Listbox class name */

#define WC_LISTBOX           ((PSZ)0xffff0007L)

/* List box notification messages */

#define LN_SELECT                  1
#define LN_SETFOCUS                2
#define LN_KILLFOCUS               3
#define LN_SCROLL                  4
#define LN_ENTER                   5

/* List box messages */

#define LM_QUERYITEMCOUNT          0x0160
#define LM_INSERTITEM              0x0161
#define LM_SETTOPINDEX             0x0162
#define LM_DELETEITEM              0x0163
#define LM_SELECTITEM              0x0164
#define LM_QUERYSELECTION          0x0165
#define LM_SETITEMTEXT             0x0166
#define LM_QUERYITEMTEXTLENGTH     0x0167
#define LM_QUERYITEMTEXT           0x0168

#define LM_SETITEMHANDLE           0x0169
#define LM_QUERYITEMHANDLE         0x016a
#define LM_SEARCHSTRING            0x016b
#define LM_SETITEMHEIGHT           0x016c
#define LM_QUERYTOPINDEX           0x016d
#define LM_DELETEALL               0x016e

/* List box constants */

#define LIT_ERROR                  (-3)
#define LIT_MEMERROR               (-2)
#define LIT_NONE                   (-1)
#define LIT_FIRST                  (-1)

/* For LM_INSERTITEM msg */

#define LIT_END                    (-1)
#define LIT_SORTASCENDING          (-2)
#define LIT_SORTDESCENDING         (-3)

/* For LM_SEARCHSTRING msg */

#define LSS_SUBSTRING              0x0001
#define LSS_PREFIX                 0x0002
#define LSS_CASESENSITIVE          0x0004


#endif /* INCL_WINLISTBOXES */


#ifdef INCL_WINMENUS

/**** Menu Manager Subsection */

/* Menu control styles */

#define MS_ACTIONBAR               0x00000001L
#define MS_TITLEBUTTON             0x00000002L
#define MS_VERTICALFLIP            0x00000004L

HWND APIENTRY WinLoadMenu(HWND hwndFrame, HMODULE hmod, USHORT idMenu);

/* Menu class name */

#define WC_MENU              ((PSZ)0xffff0004L)

/* Menu control messages */

#define MM_INSERTITEM              0x0180
#define MM_DELETEITEM              0x0181
#define MM_QUERYITEM               0x0182
#define MM_SETITEM                 0x0183
#define MM_QUERYITEMCOUNT          0x0184
#define MM_STARTMENUMODE           0x0185
#define MM_ENDMENUMODE             0x0186
#define MM_DISMISSMENU             0x0187
#define MM_REMOVEITEM              0x0188
#define MM_SELECTITEM              0x0189
#define MM_QUERYSELITEMID          0x018a
#define MM_QUERYITEMTEXT           0x018b
#define MM_QUERYITEMTEXTLENGTH     0x018c
#define MM_SETITEMHANDLE           0x018d
#define MM_SETITEMTEXT             0x018e
#define MM_ITEMPOSITIONFROMID      0x018f
#define MM_ITEMIDFROMPOSITION      0x0190
#define MM_QUERYITEMATTR           0x0191
#define MM_SETITEMATTR             0x0192
#define MM_ISITEMVALID             0x0193

HWND APIENTRY WinCreateMenu(HWND hwndParent, PVOID lpmt);

/* Owner Item Structure (Also used for listboxes) */

#ifndef INCL_SAADEFS
typedef struct _OWNERITEM { /* oi */
    HWND    hwnd;
    HPS     hps;
    USHORT  fsState;
    USHORT  fsAttribute;
    USHORT  fsStateOld;
    USHORT  fsAttributeOld;
    RECTL   rclItem;
    SHORT   idItem; /* This field contains idItem for menus, iItem for lb. */
    ULONG   hItem;
} OWNERITEM;
typedef OWNERITEM FAR *POWNERITEM;
#endif /* !INCL_SAADEFS */

/* Menu item */

typedef struct _MENUITEM { /* mi */
    SHORT   iPosition;
    USHORT  afStyle;
    USHORT  afAttribute;
    USHORT  id;
    HWND    hwndSubMenu;
    ULONG   hItem;
} MENUITEM;
typedef MENUITEM FAR *PMENUITEM;

#define MIT_END                    (-1)
#define MIT_NONE                   (-1)
#define MIT_MEMERROR               (-1)
#define MIT_ERROR                  (-1)
#define MID_NONE                   MIT_NONE
#define MID_ERROR                  (-1)

/* Menu item styles & attributes */

#define MIS_TEXT                   0x0001

#ifndef INCL_SAADEFS
#define MIS_BITMAP                 0x0002
#endif /* !INCL_SAADEFS */
#define MIS_SEPARATOR              0x0004

#ifndef INCL_SAADEFS
#define MIS_OWNERDRAW              0x0008
#endif /* !INCL_SAADEFS */

#define MIS_SUBMENU                0x0010
#define MIS_MULTMENU               0x0020      /* multiple choice submenu     */
#define MIS_SYSCOMMAND             0x0040
#define MIS_HELP                   0x0080
#define MIS_STATIC                 0x0100
#define MIS_BUTTONSEPARATOR        0x0200
#define MIS_BREAK                  0x0400
#define MIS_BREAKSEPARATOR         0x0800
#define MIS_GROUP                  0x1000      /* multiple choice group start */
/* In multiple choice submenus a style of 'single' denotes the item is a
** radiobutton.  Absence of this style defaults the item to a checkbox.       */
#define MIS_SINGLE                 0x2000

#define MIA_NODISMISS              0x0020
#define MIA_FRAMED                 0x1000
#define MIA_CHECKED                0x2000
#define MIA_DISABLED               0x4000
#define MIA_HILITED                0x8000

#endif /* INCL_WINMENUS */


#ifdef INCL_WINSCROLLBARS

/*** Scroll Bar controls Subsection */

/* Scroll Bar styles */

#define SBS_HORZ                   0L
#define SBS_VERT                   1L
#define SBS_THUMBSIZE              2L
#define SBS_AUTOTRACK              4L

/* Scroll bar class name */


#define WC_SCROLLBAR         ((PSZ)0xffff0008L)

/* Scroll Bar messages */

#define SBM_SETSCROLLBAR           0x01a0
#define SBM_SETPOS                 0x01a1
#define SBM_QUERYPOS               0x01a2
#define SBM_QUERYRANGE             0x01a3
#define SBM_SETTHUMBSIZE           0x01a6

/* Scroll Bar Commands */

#define SB_LINEUP                  1
#define SB_LINEDOWN                2
#define SB_LINELEFT                1
#define SB_LINERIGHT               2
#define SB_PAGEUP                  3
#define SB_PAGEDOWN                4
#define SB_PAGELEFT                3
#define SB_PAGERIGHT               4
#define SB_SLIDERTRACK             5
#define SB_SLIDERPOSITION          6
#define SB_ENDSCROLL               7


#ifndef INCL_SAADEFS
typedef struct _SBCDATA { /* sbcd */
    USHORT  cb;
    USHORT  sHilite;      /* reserved, should be set to zero */
    SHORT   posFirst;
    SHORT   posLast;
    SHORT   posThumb;
    SHORT   cVisible;
    SHORT   cTotal;
} SBCDATA;
typedef SBCDATA FAR *PSBCDATA;
#endif /* !INCL_SAADEFS */

#endif /* INCL_WINSCROLLBARS */


#if (defined(INCL_WINFRAMEMGR) || !defined(INCL_NOCOMMON))
/*** Frame Manager Common subsection */

typedef struct _FRAMECDATA { /* fcdata */
    USHORT  cb;
    ULONG   flCreateFlags;
    HMODULE hmodResources;
    USHORT  idResources;
} FRAMECDATA;
typedef FRAMECDATA FAR *PFRAMECDATA;

/* Frame window styles */

#define FCF_TITLEBAR               0x00000001L
#define FCF_SYSMENU                0x00000002L
#define FCF_MENU                   0x00000004L
#define FCF_SIZEBORDER             0x00000008L
#define FCF_MINBUTTON              0x00000010L
#define FCF_MAXBUTTON              0x00000020L
#define FCF_MINMAX                 0x00000030L /* minmax means BOTH buttons */
#define FCF_VERTSCROLL             0x00000040L
#define FCF_HORZSCROLL             0x00000080L
#define FCF_DLGBORDER              0x00000100L
#define FCF_BORDER                 0x00000200L
#define FCF_SHELLPOSITION          0x00000400L
#define FCF_TASKLIST               0x00000800L
#define FCF_NOBYTEALIGN            0x00001000L
#define FCF_NOMOVEWITHOWNER        0x00002000L
#define FCF_ICON                   0x00004000L
#define FCF_ACCELTABLE             0x00008000L
#define FCF_SYSMODAL               0x00010000L
#define FCF_SCREENALIGN            0x00020000L
#define FCF_MOUSEALIGN             0x00040000L
/* New values to enable multiple palettes.  Note that if none of the four   */
/* styles specified below are used then we default to the 'system' palette  */
#define FCF_PALETTE_NORMAL         0x00080000L /* normal palette            */
#define FCF_PALETTE_HELP           0x00100000L /* help palette              */
#define FCF_PALETTE_POPUPODD       0x00200000L /* odd level popup palette   */
#define FCF_PALETTE_POPUPEVEN      0x00400000L /* even level popup palette  */
/* FCF_ 0x00800000L is reserved */
#ifdef INCL_NLS
#define FCF_DBE_APPSTAT            0x80000000L
#endif /* INCL_NLS */

/* FCF_TITLEBAR | FCF_SYSMENU | FCF_MENU | FCF_SIZEBORDER | FCF_MINMAX |
   FCF_ICON | FCF_ACCELTABLE | FCF_SHELLPOSITION | FCF_TASKLIST | FCF_PALETTE_NORMAL */
#define FCF_STANDARD            0x0008CC3FL


#define FS_ICON                    0x00000001L
#define FS_ACCELTABLE              0x00000002L

#ifndef INCL_SAADEFS
#define FS_SHELLPOSITION           0x00000004L
#endif /* !INCL_SAADEFS */

#define FS_TASKLIST                0x00000008L
#define FS_NOBYTEALIGN             0x00000010L
#define FS_NOMOVEWITHOWNER         0x00000020L
#define FS_SYSMODAL                0x00000040L
#define FS_DLGBORDER               0x00000080L
#define FS_BORDER                  0x00000100L
#define FS_SCREENALIGN             0x00000200L
#define FS_MOUSEALIGN              0x00000400L
#define FS_SIZEBORDER              0x00000800L
#ifdef INCL_NLS
#define FS_DBE_APPSTAT             0x00008000L
#endif /* INCL_NLS */

/* FS_ICON | FS_ACCELTABLE | FS_SHELLPOSITION | FS_TASKLIST */
#define FS_STANDARD                0x0000000FL


/* Frame Window Flags accessed via WinSet/QueryWindowUShort(QWS_FLAGS) */

#ifndef INCL_SAADEFS
#define FF_FLASHWINDOW             0x0001
#define FF_ACTIVE                  0x0002
#define FF_FLASHHILITE             0x0004
#define FF_OWNERHIDDEN             0x0008
#define FF_DLGDISMISSED            0x0010
#define FF_OWNERDISABLED           0x0020
#define FF_SELECTED                0x0040
#define FF_NOACTIVATESWP           0x0080
#endif /* !INCL_SAADEFS */


HWND  APIENTRY WinCreateStdWindow(HWND hwndParent, ULONG flStyle,
                                  PULONG pflCreateFlags, PSZ pszClientClass,
                                  PSZ pszTitle, ULONG styleClient, HMODULE hmod,
                                  USHORT idResources, PHWND phwndClient);


#endif /* Frame Manager Common subsection */


#ifdef INCL_WINFRAMEMGR

BOOL  APIENTRY WinFlashWindow(HWND hwndFrame, BOOL fFlash);

/* Frame window related messages */

#define WM_FLASHWINDOW             0x0040
#define WM_FORMATFRAME             0x0041
#define WM_UPDATEFRAME             0x0042
#define WM_FOCUSCHANGE             0x0043

#define WM_SETBORDERSIZE           0x0044
#define WM_TRACKFRAME              0x0045
#define WM_MINMAXFRAME             0x0046
#define WM_SETICON                 0x0047
#define WM_QUERYICON               0x0048
#define WM_SETACCELTABLE           0x0049
#define WM_QUERYACCELTABLE         0x004a
#define WM_TRANSLATEACCEL          0x004b
#define WM_QUERYTRACKINFO          0x004c
#define WM_QUERYBORDERSIZE         0x004d
#define WM_NEXTMENU                0x004e
#define WM_ERASEBACKGROUND         0x004f
#define WM_QUERYFRAMEINFO          0x0050
/* Note 0x0051/5 are reserved */
#define WM_QUERYFOCUSCHAIN         0x0051
#define WM_CALCFRAMERECT           0x0053
#define WM_WINDOWPOSCHANGED        0x0055
#define WM_QUERYFRAMECTLCOUNT      0x0059
#ifndef INCL_SAADEFS
/* Note 0x005A is reserved */
#define WM_QUERYHELPINFO           0x005B
#define WM_SETHELPINFO             0x005C
#define WM_ERROR                   0x005D


/* WM_QUERYFRAMEINFO constants */

#define FI_FRAME                   0x00000001L
#define FI_OWNERHIDE               0x00000002L
#define FI_ACTIVATEOK              0x00000004L
#define FI_NOMOVEWITHOWNER         0x00000008L


#endif /* !INCL_SAADEFS */

/* Frame class name */

#define WC_FRAME             ((PSZ)0xffff0001L)

BOOL  APIENTRY WinCreateFrameControls(HWND hwndFrame, PFRAMECDATA pfcdata,
                                      PSZ pszTitle);

BOOL  APIENTRY WinCalcFrameRect(HWND hwndFrame, PRECTL prcl, BOOL fClient);

BOOL  APIENTRY WinGetMinPosition(HWND hwnd, PSWP pswp, PPOINTL pptl);
#ifndef INCL_SAADEFS
BOOL  APIENTRY WinGetMaxPosition(HWND hwnd, PSWP pswp);
#endif /* !INCL_SAADEFS */

/* Frame control IDs    */

#define FID_SYSMENU                0x8002
#define FID_TITLEBAR               0x8003
#define FID_MINMAX                 0x8004
#define FID_MENU                   0x8005
#define FID_VERTSCROLL             0x8006
#define FID_HORZSCROLL             0x8007
#define FID_CLIENT                 0x8008
/* Note 0x8009 is reserved */
#define FID_DBE_APPSTAT            0x8010
#define FID_DBE_KBDSTAT            0x8011
#define FID_DBE_PECIC              0x8012
#define FID_DBE_KKPOPUP            0x8013

/* Standard WM_SYSCOMMAND command values */

#define SC_SIZE                    0x8000
#define SC_MOVE                    0x8001
#define SC_MINIMIZE                0x8002
#define SC_MAXIMIZE                0x8003
#define SC_CLOSE                   0x8004
#define SC_NEXT                    0x8005
#define SC_APPMENU                 0x8006
#define SC_SYSMENU                 0x8007
#define SC_RESTORE                 0x8008
#define SC_NEXTFRAME               0x8009
#define SC_NEXTWINDOW              0x8010
#ifndef INCL_SAADEFS
#define SC_TASKMANAGER             0x8011
#define SC_HELPKEYS                0x8012
#define SC_HELPINDEX               0x8013
#define SC_HELPEXTENDED            0x8014
#define SC_SWITCHPANELIDS          0x8015
#define SC_DBE_FIRST               0x8018
#define SC_DBE_LAST                0x801F

#endif /* !INCL_SAADEFS */

#endif /* INCL_WINFRAMEMGR */

/*** Frame controls */

#ifdef INCL_WINFRAMECTLS

/** Title bar controls */

/* Title bar control class name */

#define WC_TITLEBAR          ((PSZ)0xffff0009L)

/* Title bar control messages */

#define TBM_SETHILITE              0x01e3
#define TBM_QUERYHILITE            0x01e4
#define TBM_TRACKMOVE              0x01e5

#endif /* INCL_WINFRAMECTLS */

#ifdef INCL_WINRECTANGLES
/*** Rectangle routines */

BOOL APIENTRY WinCopyRect(HAB hab, PRECTL prclDst, PRECTL prclSrc);

#ifndef INCL_SAADEFS
BOOL APIENTRY WinSetRect(HAB hab, PRECTL prcl, SHORT xLeft, SHORT yBottom,
                         SHORT xRight, SHORT yTop);
BOOL APIENTRY WinIsRectEmpty(HAB hab, PRECTL prcl);
BOOL APIENTRY WinEqualRect(HAB hab, PRECTL prcl1, PRECTL prcl2);
BOOL APIENTRY WinSetRectEmpty(HAB hab, PRECTL prcl);
BOOL APIENTRY WinOffsetRect(HAB hab, PRECTL prcl, SHORT cx, SHORT cy);
BOOL APIENTRY WinInflateRect(HAB hab, PRECTL prcl, SHORT cx, SHORT cy);
BOOL APIENTRY WinPtInRect(HAB hab, PRECTL prcl, PPOINTL pptl);
BOOL APIENTRY WinIntersectRect(HAB hab, PRECTL prclDst, PRECTL prclSrc1,
                               PRECTL prclSrc2);
BOOL APIENTRY WinUnionRect(HAB hab, PRECTL prclDst, PRECTL prclSrc1,
                           PRECTL prclSrc2);
BOOL APIENTRY WinSubtractRect(HAB hab, PRECTL prclDst, PRECTL prclSrc1,
                              PRECTL prclSrc2);
BOOL APIENTRY WinMakeRect(HAB hab, PWRECT pwrc);
BOOL APIENTRY WinMakePoints(HAB hab, PWPOINT pwpt, USHORT cwpt);
#endif /* !INCL_SAADEFS */

#endif /* INCL_WINRECTANGLES */


#ifdef INCL_WINSYS

/*** System values */

LONG APIENTRY WinQuerySysValue(HWND hwndDesktop, SHORT iSysValue);
BOOL  APIENTRY WinSetSysValue(HWND hwndDesktop, SHORT iSysValue, LONG lValue);

#define SV_SWAPBUTTON              0
#define SV_DBLCLKTIME              1
#define SV_CXDBLCLK                2
#define SV_CYDBLCLK                3
#define SV_CXSIZEBORDER            4
#define SV_CYSIZEBORDER            5
#define SV_ALARM                   6

#ifndef INCL_SAADEFS
#define SV_RESERVEDFIRST1          7
#define SV_RESERVEDLAST1           8
#endif /* !INCL_SAADEFS */

#define SV_CURSORRATE              9
#define SV_FIRSTSCROLLRATE         10
#define SV_SCROLLRATE              11
#define SV_NUMBEREDLISTS           12
#define SV_WARNINGFREQ             13
#define SV_NOTEFREQ                14
#define SV_ERRORFREQ               15
#define SV_WARNINGDURATION         16
#define SV_NOTEDURATION            17
#define SV_ERRORDURATION           18

#ifndef INCL_SAADEFS
#define SV_RESERVEDFIRST           19
#define SV_RESERVEDLAST            19
#endif /* !INCL_SAADEFS */

#define SV_CXSCREEN                20
#define SV_CYSCREEN                21
#define SV_CXVSCROLL               22
#define SV_CYHSCROLL               23
#define SV_CYVSCROLLARROW          24
#define SV_CXHSCROLLARROW          25
#define SV_CXBORDER                26
#define SV_CYBORDER                27
#define SV_CXDLGFRAME              28
#define SV_CYDLGFRAME              29
#define SV_CYTITLEBAR              30
#define SV_CYVSLIDER               31
#define SV_CXHSLIDER               32
#define SV_CXMINMAXBUTTON          33
#define SV_CYMINMAXBUTTON          34
#define SV_CYMENU                  35
#define SV_CXFULLSCREEN            36
#define SV_CYFULLSCREEN            37
#define SV_CXICON                  38
#define SV_CYICON                  39
#define SV_CXPOINTER               40
#define SV_CYPOINTER               41

#define SV_DEBUG                   42
#define SV_CMOUSEBUTTONS           43
#define SV_POINTERLEVEL            44
#define SV_CURSORLEVEL             45
#define SV_TRACKRECTLEVEL          46

#ifndef INCL_SAADEFS
#define SV_CTIMERS                 47
#endif /* !INCL_SAADEFS */

#define SV_MOUSEPRESENT            48

#define SV_CXBYTEALIGN             49
#define SV_CYBYTEALIGN             50

/* The following value enables any greater value to be set by WinSetSysVlaue. */
/* Values of 51-55 are spare for extra non-settable system values             */
/* This is to enable the setting of SV_EXTRAKEYBEEP by applications.          */

#define SV_NOTRESERVED             56
#define SV_EXTRAKEYBEEP            57

/* The following system value controls whether PM controls the keyboard      */
/* lights for light key keystrokes (else applications will)                  */
#define SV_SETLIGHTS               58
#define SV_INSERTMODE              59


#define SV_MENUROLLDOWNDELAY       64
#define SV_MENUROLLUPDELAY         65
#define SV_ALTMNEMONIC             66
#define SV_TASKLISTMOUSEACCESS     67
/* The following is the total number of system values */
#define SV_CSYSVALUES              68

#define SV_CPOINTERBUTTONS         69
#define SV_CXALIGN                 70
#define SV_CYALIGN                 71
#define SV_MNEMONICSENABLED        72

/*
 * Presentation parameter structures.
 */
typedef struct _PARAM { /* param */
    ULONG   id;
    ULONG   cb;
    BYTE    ab[1];
} PARAM;
typedef PARAM NEAR *NPPARAM;
typedef PARAM FAR  *PPARAM;

typedef struct _PRESPARAMS { /* pres */
    ULONG   cb;
    PARAM   aparam[1];
} PRESPARAMS;
typedef PRESPARAMS NEAR *NPPRESPARAMS;
typedef PRESPARAMS FAR  *PPRESPARAMS;


/*
 * Presentation parameter APIs
 */
BOOL  APIENTRY WinSetPresParam(HWND hwnd, ULONG id, ULONG cbParam, PVOID pbParam);
ULONG APIENTRY WinQueryPresParam(HWND hwnd, ULONG id1, ULONG id2, PULONG pulId,
                                 ULONG cbBuf, PVOID pbBuf, USHORT fs);
BOOL  APIENTRY WinRemovePresParam(HWND hwnd, ULONG id);

/*
 * Presentation parameter types.
 */

#define PP_FOREGROUNDCOLOR                  1L
#define PP_FOREGROUNDCOLORINDEX             2L
#define PP_BACKGROUNDCOLOR                  3L
#define PP_BACKGROUNDCOLORINDEX             4L
#define PP_HILITEFOREGROUNDCOLOR            5L
#define PP_HILITEFOREGROUNDCOLORINDEX       6L
#define PP_HILITEBACKGROUNDCOLOR            7L
#define PP_HILITEBACKGROUNDCOLORINDEX       8L
#define PP_DISABLEDFOREGROUNDCOLOR          9L
#define PP_DISABLEDFOREGROUNDCOLORINDEX     10L
#define PP_DISABLEDBACKGROUNDCOLOR          11L
#define PP_DISABLEDBACKGROUNDCOLORINDEX     12L
#define PP_BORDERCOLOR                      13L
#define PP_BORDERCOLORINDEX                 14L
#define PP_FONTNAMESIZE                     15L
#define PP_FONTHANDLE                       16L

/*
 * Flags for WinQueryPresParams()
 */
#define QPF_NOINHERIT            0x0001 /* Don't inherit                      */
#define QPF_ID1COLORINDEX        0x0002 /* Convert id1 color index into RGB   */
#define QPF_ID2COLORINDEX        0x0004 /* Convert id2 color index into RGB   */
#define QPF_PURERGBCOLOR         0x0008 /* Return pure RGB colors             */
#define QPF_VALIDFLAGS           0x000F /* Valid WinQueryPresParams() flags.  */

/*** System color functions */

LONG APIENTRY WinQuerySysColor(HWND hwndDesktop, LONG clr, LONG lReserved);
BOOL APIENTRY WinSetSysColors(HWND hwndDesktop, ULONG flOptions,
                              ULONG flFormat, LONG clrFirst, ULONG cclr,
                              PLONG pclr);
#define SYSCLR_BUTTONLIGHT              (-41L)
#define SYSCLR_BUTTONMIDDLE             (-40L)
#define SYSCLR_BUTTONDARK               (-39L)
#define SYSCLR_BUTTONDEFAULT            (-38L)
#define SYSCLR_TITLEBOTTOM              (-37L)
#define SYSCLR_SHADOW                   (-36L)
#define SYSCLR_ICONTEXT                 (-35L)
#define SYSCLR_DIALOGBACKGROUND         (-34L)
#define SYSCLR_HILITEFOREGROUND         (-33L)
#define SYSCLR_HILITEBACKGROUND         (-32L)
#define SYSCLR_INACTIVETITLETEXTBGND    (-31L)
#define SYSCLR_ACTIVETITLETEXTBGND      (-30L)
#define SYSCLR_INACTIVETITLETEXT        (-29L)
#define SYSCLR_ACTIVETITLETEXT          (-28L)
#define SYSCLR_OUTPUTTEXT               (-27L)
#define SYSCLR_WINDOWSTATICTEXT         (-26L)
#define SYSCLR_SCROLLBAR                (-25L)
#define SYSCLR_BACKGROUND               (-24L)
#define SYSCLR_ACTIVETITLE              (-23L)
#define SYSCLR_INACTIVETITLE            (-22L)
#define SYSCLR_MENU                     (-21L)
#define SYSCLR_WINDOW                   (-20L)
#define SYSCLR_WINDOWFRAME              (-19L)
#define SYSCLR_MENUTEXT                 (-18L)
#define SYSCLR_WINDOWTEXT               (-17L)
#define SYSCLR_TITLETEXT                (-16L)
#define SYSCLR_ACTIVEBORDER             (-15L)
#define SYSCLR_INACTIVEBORDER           (-14L)
#define SYSCLR_APPWORKSPACE             (-13L)
#define SYSCLR_HELPBACKGROUND           (-12L)
#define SYSCLR_HELPTEXT                 (-11L)
#define SYSCLR_HELPHILITE               (-10L)

#define SYSCLR_CSYSCOLORS               32L

#endif /* INCL_WINSYS */


#ifdef INCL_WINTIMER
/**** Timer manager */

#ifndef INCL_SAADEFS
USHORT APIENTRY WinStartTimer(HAB hab, HWND hwnd, USHORT idTimer,
                              USHORT dtTimeout);
BOOL   APIENTRY WinStopTimer(HAB hab, HWND hwnd, USHORT idTimer);
ULONG  APIENTRY WinGetCurrentTime(HAB hab);

#define TID_CURSOR          0xffff  /* Reserved cursor timer ID              */
#define TID_SCROLL          0xfffe  /* Reserved scrolling timer ID           */
#define TID_FLASHWINDOW     0xfffd  /* Reserved for window flashing timer ID */
#define TID_USERMAX         0x7fff  /* Maximum user timer ID                 */
#endif /* !INCL_SAADEFS */

#endif /* INCL_WINTIMER */


#ifdef INCL_WINACCELERATORS
/**** Accelerator functions */

/* ACCEL fs bits
 *
 * NOTE: the first six AF_ code bits have the same value
 * as their KC_ counterparts
 */
#ifndef INCL_SAADEFS
#define AF_CHAR                    0x0001
#define AF_VIRTUALKEY              0x0002
#define AF_SCANCODE                0x0004
#define AF_SHIFT                   0x0008
#define AF_CONTROL                 0x0010
#define AF_ALT                     0x0020
#define AF_LONEKEY                 0x0040
#define AF_SYSCOMMAND              0x0100
#define AF_HELP                    0x0200
#endif /* !INCL_SAADEFS */

typedef LHANDLE HACCEL; /* haccel */

typedef struct _ACCEL { /* acc */
    USHORT  fs;
    USHORT  key;
    USHORT  cmd;
} ACCEL;
typedef ACCEL FAR *PACCEL;

typedef struct _ACCELTABLE { /* acct  */
    USHORT  cAccel;
    USHORT  codepage;
    ACCEL   aaccel[1];
} ACCELTABLE;
typedef ACCELTABLE FAR *PACCELTABLE;

HACCEL APIENTRY WinLoadAccelTable(HAB hab, HMODULE hmod, USHORT idAccelTable);
HACCEL APIENTRY WinCreateAccelTable(HAB hab, PACCELTABLE pAccelTable);
BOOL   APIENTRY WinDestroyAccelTable(HACCEL haccel);
USHORT APIENTRY WinCopyAccelTable(HACCEL haccel, PACCELTABLE pAccelTable,
                                  USHORT cbCopyMax);
BOOL   APIENTRY WinTranslateAccel(HAB hab, HWND hwnd, HACCEL haccel,
                                  PQMSG pqmsg);
BOOL   APIENTRY WinSetAccelTable(HAB hab, HACCEL haccel, HWND hwndFrame);
HACCEL APIENTRY WinQueryAccelTable(HAB hab, HWND hwndFrame);

#endif /* INCL_WINACCELERATORS */

/**** Extended Attribute Flags (Association Table) */

#define EAF_DEFAULTOWNER           0x0001
#define EAF_UNCHANGEABLE           0x0002
#define EAF_REUSEICON              0x0004

/*** WinTrackRect() information */

#ifdef INCL_WINTRACKRECT

/* WinTrackRect() tracking information structure */

typedef struct _TRACKINFO { /* ti */
    SHORT   cxBorder;
    SHORT   cyBorder;
    SHORT   cxGrid;
    SHORT   cyGrid;
    SHORT   cxKeyboard;
    SHORT   cyKeyboard;
    RECTL   rclTrack;
    RECTL   rclBoundary;
    POINTL  ptlMinTrackSize;
    POINTL  ptlMaxTrackSize;
    USHORT  fs;
} TRACKINFO;
typedef TRACKINFO FAR *PTRACKINFO;

#ifndef INCL_SAADEFS
BOOL APIENTRY WinTrackRect(HWND hwnd, HPS hps, PTRACKINFO pti);
BOOL APIENTRY WinShowTrackRect(HWND hwnd, BOOL fShow);

/* WinTrackRect() flags */

#define TF_LEFT                    0x0001
#define TF_TOP                     0x0002
#define TF_RIGHT                   0x0004
#define TF_BOTTOM                  0x0008
/* TF_MOVE = TF_LEFT | TF_TOP | TF_RIGHT | TF_BOTTOM */
#define TF_MOVE                    0x000F

#define TF_SETPOINTERPOS           0x0010
#define TF_GRID                    0x0020
#define TF_STANDARD                0x0040
#define TF_ALLINBOUNDARY           0x0080
#define TF_VALIDATETRACKRECT       0x0100
#define TF_PARTINBOUNDARY          0x0200

#endif /* !INCL_SAADEFS */

#endif /* INCL_WINTRACKRECT */


/**** Clipboard Manager */

#ifdef INCL_WINCLIPBOARD

/* Clipboard messages */

#ifndef INCL_SAADEFS
#define WM_RENDERFMT               0x0060
#define WM_RENDERALLFMTS           0x0061
#define WM_DESTROYCLIPBOARD        0x0062
#define WM_PAINTCLIPBOARD          0x0063
#define WM_SIZECLIPBOARD           0x0064
#define WM_HSCROLLCLIPBOARD        0x0065
#define WM_VSCROLLCLIPBOARD        0x0066
#define WM_DRAWCLIPBOARD           0x0067

/* Standard Clipboard formats */

#define CF_TEXT                    1
#define CF_BITMAP                  2
#define CF_DSPTEXT                 3
#define CF_DSPBITMAP               4
#define CF_METAFILE                5
#define CF_DSPMETAFILE             6

BOOL   APIENTRY WinSetClipbrdOwner(HAB hab, HWND hwnd);
BOOL   APIENTRY WinSetClipbrdData(HAB hab, ULONG ulData, USHORT fmt, USHORT rgfFmtInfo);
ULONG  APIENTRY WinQueryClipbrdData(HAB hab, USHORT fmt);
BOOL   APIENTRY WinQueryClipbrdFmtInfo(HAB hab, USHORT fmt,
                                       PUSHORT prgfFmtInfo);
BOOL   APIENTRY WinSetClipbrdViewer(HAB hab, HWND hwndNewClipViewer);

/* WinSetClipbrdData() flags */

#define CFI_OWNERFREE              0x0001
#define CFI_OWNERDISPLAY           0x0002
#define CFI_SELECTOR               0x0100
#define CFI_HANDLE                 0x0200

#endif /* !INCL_SAADEFS */

USHORT APIENTRY WinEnumClipbrdFmts(HAB hab, USHORT fmt);
BOOL   APIENTRY WinEmptyClipbrd(HAB hab);
BOOL   APIENTRY WinOpenClipbrd(HAB hab);
BOOL   APIENTRY WinCloseClipbrd(HAB hab);
HWND   APIENTRY WinQueryClipbrdOwner(HAB hab, BOOL fLock);
HWND   APIENTRY WinQueryClipbrdViewer(HAB hab, BOOL fLock);

#endif /* INCL_WINCLIPBOARD */


#if (defined(INCL_WINCURSORS) || !defined(INCL_NOCOMMON))
/**** Cursor manager common subsection */

BOOL APIENTRY WinDestroyCursor(HWND hwnd);
BOOL APIENTRY WinShowCursor(HWND hwnd, BOOL fShow);
BOOL APIENTRY WinCreateCursor(HWND hwnd, SHORT x, SHORT y, SHORT cx, SHORT cy,
                              USHORT fs, PRECTL prclClip);

/* WinCreateCursor() flags */

#define CURSOR_SOLID               0x0000
#define CURSOR_HALFTONE            0x0001
#define CURSOR_FRAME               0x0002
#define CURSOR_FLASH               0x0004
#define CURSOR_SETPOS              0x8000


#endif /* Cursor manager common subsection */

#ifdef INCL_WINCURSORS

typedef struct _CURSORINFO { /* csri */
    HWND    hwnd;
    SHORT   x;
    SHORT   y;
    SHORT   cx;
    SHORT   cy;
    USHORT  fs;
    RECTL   rclClip;
} CURSORINFO;
typedef CURSORINFO FAR *PCURSORINFO;

BOOL APIENTRY WinQueryCursorInfo(HWND hwndDesktop, PCURSORINFO pCursorInfo);

#endif /* INCL_WINCURSORS */

typedef LHANDLE HPOINTER;   /* hptr */

#ifdef INCL_WINPOINTERS
/**** Pointer manager */

BOOL     APIENTRY WinSetPointer(HWND hwndDesktop, HPOINTER hptrNew);
BOOL     APIENTRY WinShowPointer(HWND hwndDesktop, BOOL fShow);
HPOINTER APIENTRY WinQuerySysPointer(HWND hwndDesktop, SHORT iptr, BOOL fLoad);


/* System pointers (NOTE: these are 1-based) */

#ifdef LATER

#define SPTR_ARROW                 1
#define SPTR_TEXT                  2
#define SPTR_WAIT                  3
#define SPTR_MOVE                  4
#define SPTR_SIZENWSE              5
#define SPTR_SIZENESW              6
#define SPTR_SIZEWE                7
#define SPTR_SIZENS                8
#define SPTR_APPICON               9

#define SPTR_ICONINFORMATION       10
#define SPTR_ICONQUESTION          11
#define SPTR_ICONERROR             12
#define SPTR_ICONWARNING           13

#define SPTR_CPTR                  13    /* Count of pointers loaded by PMWIN */

#define SPTR_ILLEGAL               14
#define SPTR_FILE                  15
#define SPTR_FOLDER                16
#define SPTR_MULTFILE              17
#define SPTR_PROGRAM               18

#else

#define SPTR_ARROW                 1
#define SPTR_TEXT                  2
#define SPTR_WAIT                  3
#define SPTR_SIZE                  4
#define SPTR_MOVE                  5
#define SPTR_SIZENWSE              6
#define SPTR_SIZENESW              7
#define SPTR_SIZEWE                8
#define SPTR_SIZENS                9
#define SPTR_APPICON               10
#define SPTR_ICONINFORMATION       11
#define SPTR_ICONQUESTION          12
#define SPTR_ICONERROR             13
#define SPTR_ICONWARNING           14
#define SPTR_CPTR                  14    /* count loaded by pmwin */

#define SPTR_ILLEGAL               18
#define SPTR_FILE                  19
#define SPTR_FOLDER                20
#define SPTR_MULTFILE              21
#define SPTR_PROGRAM               22

/* backward compatibility */
#define SPTR_HANDICON         SPTR_ICONERROR
#define SPTR_QUESICON         SPTR_ICONQUESTION
#define SPTR_BANGICON         SPTR_ICONWARNING
#define SPTR_NOTEICON         SPTR_ICONINFORMATION

#endif /* LATER */



HPOINTER APIENTRY WinLoadPointer(HWND hwndDesktop, HMODULE hmod, USHORT idres);
BOOL     APIENTRY WinDestroyPointer(HPOINTER hptr);
HPOINTER APIENTRY WinCreatePointer(HWND hwndDesktop, HBITMAP hbmPointer,
                                   BOOL fPointer, SHORT xHotspot,
                                   SHORT yHotspot);

HPOINTER APIENTRY WinQueryPointer(HWND hwndDesktop);
BOOL     APIENTRY WinSetPointerPos(HWND hwndDesktop, SHORT x, SHORT y);
BOOL     APIENTRY WinQueryPointerPos(HWND hwndDesktop, PPOINTL pptl);

typedef struct _POINTERINFO { /* ptri */
    BOOL    fPointer;
    SHORT   xHotspot;
    SHORT   yHotspot;
    HBITMAP hbmPointer;
    HBITMAP hbmColor;
} POINTERINFO;
typedef POINTERINFO FAR *PPOINTERINFO;

HPOINTER APIENTRY WinCreatePointerIndirect(HWND hwndDesktop, PPOINTERINFO pptri);
BOOL     APIENTRY WinQueryPointerInfo(HPOINTER hptr,
                                      PPOINTERINFO pPointerInfo);
BOOL     APIENTRY WinDrawPointer(HPS hps, SHORT x, SHORT y, HPOINTER hptr,
                                 USHORT fs);



/* WinDrawPointer() constants */

#define DP_NORMAL                  0x0000
#define DP_HALFTONED               0x0001
#define DP_INVERTED                0x0002


HBITMAP APIENTRY WinGetSysBitmap(HWND hwndDesktop, USHORT ibm);

/* System bitmaps (NOTE: these are 1-based) */

#define SBMP_OLD_SYSMENU           1
#define SBMP_OLD_SBUPARROW         2
#define SBMP_OLD_SBDNARROW         3
#define SBMP_OLD_SBRGARROW         4
#define SBMP_OLD_SBLFARROW         5
#define SBMP_MENUCHECK             6
#define SBMP_CHECKBOXES            7
#define SBMP_BTNCORNERS            8
#define SBMP_OLD_MINBUTTON         9
#define SBMP_OLD_MAXBUTTON         10
#define SBMP_OLD_RESTOREBUTTON     11
#define SBMP_OLD_CHILDSYSMENU      12
#define SBMP_DRIVE                 15
#define SBMP_FILE                  16
#define SBMP_FOLDER                17
#define SBMP_TREEPLUS              18
#define SBMP_TREEMINUS             19
#define SBMP_PROGRAM               22
#define SBMP_MENUATTACHED          23
#define SBMP_SIZEBOX               24

#define SBMP_SYSMENU               25
#define SBMP_MINBUTTON             26
#define SBMP_MAXBUTTON             27
#define SBMP_RESTOREBUTTON         28
#define SBMP_CHILDSYSMENU          29
#define SBMP_SYSMENUDEP            30
#define SBMP_MINBUTTONDEP          31
#define SBMP_MAXBUTTONDEP          32
#define SBMP_RESTOREBUTTONDEP      33
#define SBMP_CHILDSYSMENUDEP       34
#define SBMP_SBUPARROW             35
#define SBMP_SBDNARROW             36
#define SBMP_SBLFARROW             37
#define SBMP_SBRGARROW             38
#define SBMP_SBUPARROWDEP          39
#define SBMP_SBDNARROWDEP          40
#define SBMP_SBLFARROWDEP          41
#define SBMP_SBRGARROWDEP          42
#define SBMP_SBUPARROWDIS          43
#define SBMP_SBDNARROWDIS          44
#define SBMP_SBLFARROWDIS          45
#define SBMP_SBRGARROWDIS          46
#define SBMP_COMBODOWN             47

#endif /* INCL_WINPOINTERS */


/**** Hook manager */

#ifdef INCL_WINHOOKS

#ifndef INCL_SAADEFS
BOOL APIENTRY WinSetHook(HAB hab, HMQ hmq, SHORT iHook, PFN pfnHook,
                         HMODULE hmod);
BOOL APIENTRY WinReleaseHook(HAB hab, HMQ hmq, SHORT iHook, PFN pfnHook,
                             HMODULE hmod);
BOOL APIENTRY WinCallMsgFilter(HAB hab, PQMSG pqmsg, USHORT msgf);


/* Hook codes */

#define HK_SENDMSG                 0
    /* VOID EXPENTRY SendMsgHook(HAB hab,               ** installer's hab      **
                                 PSMHSTRUCT psmh,       ** p send msg struct    **
                                 BOOL fInterTask);      ** between threads      */
#define HK_INPUT                   1
    /* BOOL EXPENTRY InputHook(HAB hab,                 ** installer's hab      **
                               PQMSG pQmsg,             ** p qmsg               **
                               USHORT fs);              ** remove/noremove      */
#define HK_MSGFILTER               2
    /* BOOL EXPENTRY MsgFilterHook(HAB hab,             ** installer's hab      **
                                   PQMSG pQmsg,         ** p qmsg               **
                                   USHORT msgf);        ** filter flag          */
#define HK_JOURNALRECORD           3
    /* VOID EXPENTRY JournalRecordHook(HAB hab,         ** installer's hab      **
                                       PQMSG pQmsg);    ** p qmsg               */
#define HK_JOURNALPLAYBACK         4
    /* ULONG EXPENTRY JournalPlaybackHook(HAB hab,      **installer's hab       **
                                          BOOL fSkip,   ** skip messages        **
                                          PQMSG pQmsg); ** p qmsg               */
#define HK_HELP                    5
    /* BOOL EXPENTRY HelpHook(HAB hab,                  ** installer's hab      **
                              USHORT usMode,            ** mode                 **
                              USHORT idTopic,           ** main topic           **
                              USHORT idSubTopic,        ** sub topic            **
                              PRECTL prcPosition);      ** associated position  */

#define HK_LOADER                  6
    /* BOOL EXPENTRY LoaderHook(HAB hab,                ** installer's hab      **
                                SHORT idContext,        ** who called hook      **
                                PSZ pszLibname,         ** lib name string      **
                                PHLIB hlib,             ** p to lib handle      **
                                PSZ pszProcname,        ** procedure name       **
                                PFNWP wndProc);         ** window procedure     */
#define HK_REGISTERUSERMSG         7
    /* BOOL EXPENTRY RegisterUserHook(HAB hab,          ** installer's hab      **
                                    ULONG cUshort,      ** entries in arRMP     **
                                    PUSHORT arRMP,      ** RMP array            **
                                    PBOOL fRegistered); ** msg parms already reg*/
#define HK_MSGCONTROL              8
    /* BOOL EXPENTRY MsgControlHook(HAB hab,            ** installer's hab      **
                                    SHORT idContext,    ** who called hook      **
                                    HWND hwnd,          ** SEI window handle    **
                                    PSZ pszClassname,   ** window class name    **
                                    USHORT usMsgclass,  ** interested msg class **
                                    SHORT idControl,    ** SMI_*                **
                                    PBOOL fSuccess);    ** mode already set     */
#define HK_PLIST_ENTRY             9
    /* BOOL EXPENTRY ProgramListEntryHook(HAB hab,      ** installer's hab      **
                       PPRFHOOKPARMS pProfileHookParams,** data                 **
                       PBOOL fNoExecute);               ** cease hook processing*/
#define HK_PLIST_EXIT              10
    /* BOOL EXPENTRY ProgramListExitHook(HAB hab,       ** installer's hab      **
                PPRFHOOKPARMS pProfileHookParams);      ** data                 */
#define HK_FINDWORD                11
    /* BOOL EXPENTRY FindWordHook(usCodepage,           ** code page to use     **
                                  PSZ pszText,          ** text to break        **
                                  ULONG cb,             ** maximum text size    **
                                  ULONG ich,            ** break 'near' here    **
                                  PULONG pichStart,     ** where break began    **
                                  PULONG pichEnd,       ** where break ended    **
                                  PULONG pichNext);     ** where next word begin*/
#define HK_CODEPAGECHANGED         12
    /* VOID EXPENTRY CodePageChangedHook(HMQ hmq,       ** msg q handle         **
                                  USHORT usOldCodepage, ** old code page        **
                                  USHORT usNewCodepage);** new code page        */

#define HMQ_CURRENT          ((HMQ)1)

/* WH_MSGFILTER context codes */

#define MSGF_DIALOGBOX             1
#define MSGF_MESSAGEBOX            2
#define MSGF_TRACK                 8

/* HK_HELP Help modes */

#define HLPM_FRAME              (-1)
#define HLPM_WINDOW             (-2)
#define HLPM_MENU               (-3)

/* HK_SENDMSG structure */

typedef struct _SMHSTRUCT { /* smhs */
    MPARAM  mp2;
    MPARAM  mp1;
    USHORT  msg;
    HWND    hwnd;
} SMHSTRUCT;
typedef SMHSTRUCT FAR *PSMHSTRUCT;

/*HK_LOADER context codes */

#define LHK_DELETEPROC             1
#define LHK_DELETELIB              2
#define LHK_LOADPROC               3
#define LHK_LOADLIB                4

/*HK_MSGCONTROL context codes */

#define MCHK_MSGINTEREST           1
#define MCHK_CLASSMSGINTEREST      2
#define MCHK_SYNCHRONISATION       3
#define MCHK_MSGMODE               4

/*HK_REGISTERUSERMSG conext codes */

#define RUMHK_DATATYPE             1
#define RUMHK_MSG                  2

#endif /* INCL_SAADEFS */

#endif /* INCL_WINHOOKS */

/*
 * Include Shell API
 */
#ifndef INCL_SAADEFS
#include <pmshl.h>      /* OS/2 Shell definitions */
#endif /* !INCL_SAADEFS */

#ifdef INCL_WINCOUNTRY

USHORT  APIENTRY WinQueryCp(HMQ hmq);

#ifndef INCL_SAADEFS
BOOL    APIENTRY WinSetCp(HMQ hmq, USHORT idCodePage);
USHORT  APIENTRY WinQueryCpList(HAB hab, USHORT ccpMax, PUSHORT prgcp);
BOOL    APIENTRY WinCpTranslateString(HAB hab, USHORT cpSrc, PSZ pszSrc,
                                      USHORT cpDst, USHORT cchDestMax,
                                      PSZ pchDest);
UCHAR   APIENTRY WinCpTranslateChar(HAB hab, USHORT cpSrc, UCHAR chSrc,
                                    USHORT cpDst);

USHORT  APIENTRY WinUpper(HAB hab, USHORT idcp, USHORT idcc, PSZ psz);
USHORT  APIENTRY WinUpperChar(HAB hab, USHORT idcp, USHORT idcc, USHORT c);
PSZ     APIENTRY WinNextChar(HAB hab, USHORT idcp, USHORT idcc, PSZ psz);
PSZ     APIENTRY WinPrevChar(HAB hab, USHORT idcp, USHORT idcc, PSZ pszStart,
                             PSZ psz);
USHORT  APIENTRY WinCompareStrings(HAB hab, USHORT idcp, USHORT idcc, PSZ psz1,
                                   PSZ psz2, USHORT reserved);
#define WCS_ERROR                  0
#define WCS_EQ                     1
#define WCS_LT                     2
#define WCS_GT                     3

#endif /* !INCL_SAADEFS */

#endif /* INCL_WINCOUNTRY */



/* Heap Manager Interface declarations */

#ifdef INCL_WINHEAP

#ifndef INCL_SAADEFS
typedef LHANDLE HHEAP;

HHEAP       APIENTRY WinCreateHeap(USHORT selHeapBase, USHORT cbHeap,
                                   USHORT cbGrow, USHORT chMinDed,
                                   USHORT cbMaxDed, USHORT fOptions);
HHEAP       APIENTRY WinDestroyHeap(HHEAP hHeap);
USHORT      APIENTRY WinAvailMem(HHEAP hHeap, BOOL fCompact, USHORT cbMinFree);
NPBYTE      APIENTRY WinAllocMem(HHEAP hHeap, USHORT cb);
NPBYTE      APIENTRY WinReallocMem(HHEAP hHeap, NPBYTE npMem,
                                   USHORT cbOld, USHORT cbNew);
NPBYTE      APIENTRY WinFreeMem(HHEAP hHeap, NPBYTE npMem, USHORT cbMem);
PVOID       APIENTRY WinLockHeap(HHEAP hHeap);

#define HM_MOVEABLE                0x0001      /* Parameters to WinCreateHeap */
#define HM_VALIDSIZE               0x0002
#endif /* !INCL_SAADEFS */

#endif  /* INCL_WINHEAP */


/*** Atom Manager Interface declarations */

#ifdef INCL_WINATOM

#ifndef INCL_SAADEFS
typedef LHANDLE  HATOMTBL;
typedef USHORT   ATOM;

HATOMTBL APIENTRY WinQuerySystemAtomTable(VOID);
HATOMTBL APIENTRY WinCreateAtomTable(USHORT cbInitial, USHORT cBuckets);
HATOMTBL APIENTRY WinDestroyAtomTable(HATOMTBL hAtomTbl);
ATOM     APIENTRY WinAddAtom(HATOMTBL hAtomTbl, PSZ pszAtomName);
ATOM     APIENTRY WinFindAtom(HATOMTBL hAtomTbl, PSZ pszAtomName);
ATOM     APIENTRY WinDeleteAtom(HATOMTBL hAtomTbl, ATOM atom);
USHORT   APIENTRY WinQueryAtomUsage(HATOMTBL hAtomTbl, ATOM atom);
USHORT   APIENTRY WinQueryAtomLength(HATOMTBL hAtomTbl, ATOM atom);
USHORT   APIENTRY WinQueryAtomName(HATOMTBL hAtomTbl, ATOM atom, PSZ pchBuffer,
                                   USHORT cchBufferMax);

#define MAKEINTATOM(a)  ((PCH)MAKEULONG(a, 0xffff))
#endif /* !INCL_SAADEFS */

#endif /* INCL_WINATOM */


/*** Catch/Throw Interface declarations */

#ifdef INCL_WINCATCHTHROW

#ifndef INCL_SAADEFS
typedef struct _CATCHBUF {  /* ctchbf */
    ULONG   reserved[ 4 ];
} CATCHBUF;
typedef CATCHBUF FAR *PCATCHBUF;

SHORT   APIENTRY    WinCatch(PCATCHBUF pcatchbuf);
VOID    APIENTRY    WinThrow(PCATCHBUF pcatchbuf, SHORT nThrowBack);
#endif /* !INCL_SAADEFS */

#endif /* INCL_WINCATCHTHROW */



#ifdef INCL_WINERRORS

#include <pmerr.h>

/* Error codes for debugging support                                       */
/* 0x1001 - 0x1021, 0x1034, 0x1036 - 0x1060 are reserved                   */

#define WINDBG_HWND_NOT_DESTROYED           0x1022
#define WINDBG_HPTR_NOT_DESTROYED           0x1023
#define WINDBG_HACCEL_NOT_DESTROYED         0x1024
#define WINDBG_HENUM_NOT_DESTROYED          0x1025
#define WINDBG_VISRGN_SEM_BUSY              0x1026
#define WINDBG_USER_SEM_BUSY                0x1027
#define WINDBG_DC_CACHE_BUSY                0x1028
#define WINDBG_HOOK_STILL_INSTALLED         0x1029
#define WINDBG_WINDOW_STILL_LOCKED          0x102a
#define WINDBG_UPDATEPS_ASSERTION_FAIL      0x102b
#define WINDBG_SENDMSG_WITHIN_USER_SEM      0x102c
#define WINDBG_USER_SEM_NOT_ENTERED         0x102d
#define WINDBG_PROC_NOT_EXPORTED            0x102e
#define WINDBG_BAD_SENDMSG_HWND             0x102f
#define WINDBG_ABNORMAL_EXIT                0x1030
#define WINDBG_INTERNAL_REVISION            0x1031
#define WINDBG_INITSYSTEM_FAILED            0x1032
#define WINDBG_HATOMTBL_NOT_DESTROYED       0x1033
#define WINDBG_WINDOW_UNLOCK_WAIT           0x1035

/* Get/Set Error Information Interface declarations */

typedef struct _ERRINFO { /* erri */
    USHORT  cbFixedErrInfo;
    ERRORID idError;
    USHORT  cDetailLevel;
    USHORT  offaoffszMsg;
    USHORT  offBinaryData;
} ERRINFO;
typedef ERRINFO FAR *PERRINFO;

ERRORID     APIENTRY    WinGetLastError(HAB hab);
PERRINFO    APIENTRY    WinGetErrorInfo(HAB hab);
BOOL        APIENTRY    WinFreeErrorInfo(PERRINFO perrinfo);

#endif  /* INCL_WINERRORS */

#ifndef INCL_SAADEFS
/* include SetErrorInfo */
#ifdef INCL_WINSEI
  #ifndef SEI_PMWINP
    #define SEI_PMWIN
    #include <pmsei.h>
  #endif /* SEI_PMWINP */
#endif /* INCL_WINSEI  */
#endif /* INCL_SAADEFS */

#ifndef INCL_SAADEFS
#ifdef  INCL_WINDDE

/* Dynamic Data Exchange (DDE) Structure Declaration */

typedef struct _DDEINIT { /* ddei */
    USHORT  cb;
    PSZ     pszAppName;
    PSZ     pszTopic;
} DDEINIT;
typedef DDEINIT FAR *PDDEINIT;

typedef struct _DDESTRUCT { /* dde */
    ULONG   cbData;
    USHORT  fsStatus;
    USHORT  usFormat;
    USHORT  offszItemName;
    USHORT  offabData;
} DDESTRUCT;
typedef DDESTRUCT FAR *PDDESTRUCT;

/* DDE constants for wStatus field */
#define DDE_FACK                   0x0001
#define DDE_FBUSY                  0x0002
#define DDE_FNODATA                0x0004
#define DDE_FACKREQ                0x0008
#define DDE_FRESPONSE              0x0010
#define DDE_NOTPROCESSED           0x0020
#define DDE_FRESERVED              0x00C0
#define DDE_FAPPSTATUS             0xFF00

/* DDE public formats */

#define DDEFMT_TEXT                0x0001

/* Dynamic Data Exchange (DDE) Routines */

BOOL    APIENTRY WinDdeInitiate(HWND hwndClient, PSZ pszAppName,
                                PSZ pszTopicName);
MRESULT APIENTRY WinDdeRespond(HWND hwndClient, HWND hwndServer,
                               PSZ pszAppName, PSZ pszTopicName);
BOOL    APIENTRY WinDdePostMsg(HWND hwndTo, HWND hwndFrom, USHORT wm,
                               PDDESTRUCT pddeSt, BOOL fRetry);

/* Dynamic Data Exchange (DDE) Messages */

#define WM_DDE_FIRST               0x00A0
#define WM_DDE_INITIATE            0x00A0
#define WM_DDE_REQUEST             0x00A1
#define WM_DDE_ACK                 0x00A2
#define WM_DDE_DATA                0x00A3
#define WM_DDE_ADVISE              0x00A4
#define WM_DDE_UNADVISE            0x00A5
#define WM_DDE_POKE                0x00A6
#define WM_DDE_EXECUTE             0x00A7
#define WM_DDE_TERMINATE           0x00A8
#define WM_DDE_INITIATEACK         0x00A9
#define WM_DDE_LAST                0x00AF

/* DDE helper macros */

#define DDES_PSZITEMNAME(pddes) \
        (((PSZ)pddes) + ((PDDESTRUCT)pddes)->offszItemName)

#define DDES_PABDATA(pddes)       \
        (((PBYTE)pddes) + ((PDDESTRUCT)pddes)->offabData)

#define SELTOPDDES(sel)             ((PDDESTRUCT)MAKEP(sel, 0))
#define PDDESTOSEL(pddes)           (SELECTOROF(pddes))
#define PDDEITOSEL(pddei)           (SELECTOROF(pddei))

#endif /* INCL_WINDDE */
#endif /* !INCL_SAADEFS */

#ifdef INCL_WINWINDOWMGR
#define WM_QUERYCONVERTPOS         0x00b0

/* Return values for WM_QUERYCONVERTPOS */
#define QCP_CONVERT                0x0001
#define QCP_NOCONVERT              0x0000

#endif  /* INCL_WINWINDOWMGR */


#ifdef INCL_WINHELP
  #include <pmhelp.h>
#endif /* INCL_WINHELP */

/*Load/Delete Library/Procedure */

typedef HMODULE HLIB;
typedef PHMODULE PHLIB;

#ifdef INCL_WINLOAD
BOOL    APIENTRY WinDeleteProcedure(HAB hab, PFNWP wndproc);
BOOL    APIENTRY WinDeleteLibrary(HAB hab, HLIB libhandle);
PFNWP   APIENTRY WinLoadProcedure(HAB hab, HLIB libhandle, PSZ procname);
HLIB    APIENTRY WinLoadLibrary(HAB hab, PSZ libname);
#endif /* INCL_WINLOAD */


#ifdef INCL_REMAPDLL
#define STR_DLLNAME "keyremap"
#endif /*INCL_REMAPDLL*/

#ifdef INCL_NLS

#define WM_DBCSFIRST               0x00b0
#define WM_DBCSLAST                0x00cf
#define WC_APPSTAT           ((PSZ)0xffff0010L)
#define WC_KBDSTAT           ((PSZ)0xffff0011L)
#define WC_PECIC             ((PSZ)0xffff0012L)
#define WC_DBE_KKPOPUP       ((PSZ)0xffff0013L)

#endif /* INCL_NLS */
