/***************************************************************************\ * * File: DUserCore.h * * Description: * DUserCore.h defines the DirectUser/Core, the low-level composition engine. * * Copyright (C) 2000 by Microsoft Corporation. All rights reserved. * \***************************************************************************/ #if !defined(INC__DUserCore_h__INCLUDED) #define INC__DUserCore_h__INCLUDED /* * Include dependencies */ #include // Standard constants #ifdef __cplusplus extern "C" { #endif /***************************************************************************\ * * Basics * \***************************************************************************/ DECLARE_HANDLE(HGADGET); DECLARE_HANDLE(HDCONTEXT); DECLARE_HANDLE(HCLASS); DUSER_API BOOL WINAPI DeleteHandle(HANDLE h); DUSER_API BOOL WINAPI IsStartDelete(HANDLE h, BOOL * pfStarted); #define IGTM_MIN (0) // + #define IGTM_NONE (0) // | No special threading model #define IGTM_SINGLE (1) // | Single threaded application #define IGTM_SEPARATE (2) // | MT with single thread per context #define IGTM_MAX (2) // + #define IGMM_MIN (1) // + #define IGMM_COMPATIBLE (1) // | Core running in Compatible mode #define IGMM_ADVANCED (2) // | Core running in Advanced mode #define IGMM_STANDARD (3) // | Standard mode on Whistler #define IGMM_MAX (3) // + #define IGPM_MIN (0) // + #define IGPM_BLEND (0) // | Optimize for blend between speed / size #define IGPM_SPEED (1) // | Optimize for pure speed #define IGPM_SIZE (2) // | Optimize for minimum working set #define IGPM_MAX (2) // + typedef struct tagINITGADGET { DWORD cbSize; // Size of structure UINT nThreadMode; // Threading model UINT nMsgMode; // DirectUser/Core messaging subsystem mode UINT nPerfMode; // Performance tuning mode UINT nDevice; // Rendering device HDCONTEXT hctxShare; // Existing context to share with } INITGADGET; DUSER_API HDCONTEXT WINAPI InitGadgets(INITGADGET * pInit); DUSER_API HRESULT WINAPI DUserGetThreadContext(HDCONTEXT * phctx); #define IGC_MIN (1) #define IGC_GDIPLUS (1) // GDI+ #define IGC_MAX (1) DUSER_API BOOL WINAPI InitGadgetComponent(UINT nOptionalComponent); DUSER_API BOOL WINAPI UninitGadgetComponent(UINT nOptionalComponent); DUSER_API HDCONTEXT WINAPI GetContext(HANDLE h); DUSER_API BOOL WINAPI IsInsideContext(HANDLE h); #ifdef __cplusplus #define BEGIN_STRUCT(name, baseclass) \ struct name : baseclass { #define END_STRUCT(name) \ }; #define FORWARD_STRUCT(name) \ struct name; #else #define BEGIN_STRUCT(name, baseclass) \ typedef struct tag##name { \ baseclass; #define END_STRUCT(name) \ } name; #define FORWARD_STRUCT(name) \ typedef struct name; #endif /***************************************************************************\ * * Messaging and Events * \***************************************************************************/ #define GMF_DIRECT 0x00000000 // + When message reaches hgadMsg #define GMF_ROUTED 0x00000001 // | Before message reaches hgadMsg #define GMF_BUBBLED 0x00000002 // | After message reaches hgadMsg #define GMF_EVENT 0x00000003 // | After message becomes an event #define GMF_DESTINATION 0x00000003 // + Destination of message typedef int MSGID; typedef int PRID; // New Messages typedef struct tagGMSG { DWORD cbSize; // (REQUIRED) Size of message in bytes MSGID nMsg; // (REQUIRED) Gadget message } GMSG; BEGIN_STRUCT(MethodMsg, GMSG) END_STRUCT(MethodMsg) BEGIN_STRUCT(EventMsg, MethodMsg) HGADGET hgadMsg; // (REQUIRED) Gadget that message is "about" UINT nMsgFlags; // Flags about message END_STRUCT(EventMsg) #define GET_EVENT_DEST(pmsg) \ (pmsg->nMsgFlags & GMF_DESTINATION) #define SET_EVENT_DEST(pmsg, dest) \ (pmsg->nMsgFlags = ((pmsg->nMsgFlags & ~GMF_DESTINATION) | (dest & GMF_DESTINATION))) #define DEFINE_EVENT(event, guid) \ struct __declspec(uuid(guid)) event /***************************************************************************\ * * Gadget Classes * \***************************************************************************/ #ifndef __cplusplus #error Requires C++ to compile #endif }; // extern "C" namespace DUser { // Forward declarations class Gadget; class SGadget; struct MessageInfoStub; }; DUSER_API HRESULT WINAPI DUserDeleteGadget(DUser::Gadget * pg); DUSER_API HGADGET WINAPI DUserCastHandle(DUser::Gadget * pg); namespace DUser { #define dapi #define devent // // Core Classes // class Gadget { public: void * m_pDummy; inline HGADGET GetHandle() const { return DUserCastHandle(const_cast (this)); } inline void Delete() { DUserDeleteGadget(this); } HRESULT CallStubMethod(MethodMsg * pmsg); HRESULT CallSuperMethod(MethodMsg * pmsg, void * pMT); UINT CallStubEvent(EventMsg * pmsg, int nEventMsg); UINT CallSuperEvent(EventMsg * pmsg, void * pMT, int nEventMsg); enum ConstructCommand { ccSuper = 0, // Construct the super-class ccSetThis = 1, // Set this pointer }; struct ConstructInfo { }; }; class SGadget { public: Gadget * m_pgad; static HCLASS s_hclSuper; inline HGADGET GetHandle() const { return DUserCastHandle(const_cast (m_pgad)); } inline void Delete() { DUserDeleteGadget(m_pgad); } }; typedef HRESULT (SGadget::*MethodProc)(MethodMsg * pmsg); typedef HRESULT (SGadget::*EventProc)(EventMsg * pmsg); interface ISimpleImage; interface ISimpleText; BEGIN_ENUM(GraphicsType) Min = 0, None = 0, HDC = 1, GpGraphics = 2, D3d8Device = 3, D3d7Device = 4, Max = 4, END_ENUM() BEGIN_ENUM(AlphaType) Min = 0, None = 0, Normal = 1, Premultiplied = 2, Max = 2, END_ENUM() interface __declspec(uuid("{8C99782F-3B31-4965-823D-F7D86F0D3FA0}")) ISurface; interface ISurface : IUnknown { STDMETHOD(GetType)(GraphicsType * ptype) PURE; STDMETHOD(GetAlphaType)(AlphaType * pat) PURE; STDMETHOD(GetBitmapSize)(DirectUser::Geometry::SizeF * psizefPxl) PURE; STDMETHOD(GetSurfaceSize)(DirectUser::Geometry::SizeF * psizefPxl) PURE; STDMETHOD(GetRawSurface)(void ** ppRawSurface) PURE; STDMETHOD(GetGenerationCount)(int * pcGeneration) PURE; STDMETHOD(NotifyDestroyedOwner)() PURE; #if DBG STDMETHOD(DEBUG_SetDescription)(LPCWSTR pszDescription) PURE; #endif }; interface __declspec(uuid("{EFA21455-188D-49e4-893D-7F90B6BBC7BF}")) ISurfaceOwner; interface ISurfaceOwner : IUnknown { STDMETHOD(GetSurface)(ISurface ** ppSurface) PURE; STDMETHOD(OnLostSurface)(bool fNewSurface) PURE; STDMETHOD(OnDeviceDestroy)() PURE; }; BEGIN_ENUM(SurfaceOptions) Durable = 0x00000001, // Surface contents are memory backed pExternal = 0x40000000, // INTERNAL: Surface was externally allocated Valid = Durable, // Valid flags pValidInternal = // INTERNAL: Valid external & internal flags Valid | pExternal END_ENUM() interface __declspec(uuid("{8B88AAF5-4F0D-44a0-ADC9-A7CE1970E11F}")) IDevice; interface IDevice : IUnknown { STDMETHOD(GetType)(GraphicsType * ptype) PURE; STDMETHOD(OpenDevice)(REFIID riid, void ** ppvDevice) PURE; STDMETHOD(CloseDevice)() PURE; STDMETHOD(CreateSurface)(ISurfaceOwner * pOwner, DirectUser::Geometry::Size sizeRequestPxl, AlphaType at, UINT nFlags, ISurface ** ppSurface) PURE; STDMETHOD(MarkInvalidContent)() PURE; }; interface __declspec(uuid("{7F9AAAF0-41E9-4e69-907A-11784B892DF6}")) ID3d7Device; interface ID3d7Device : IUnknown { STDMETHOD(CreateSurface)(ISurfaceOwner * pOwner, IUnknown * pRawSurface, DirectUser::Geometry::Size sizeRequestPxl, AlphaType at, ISurface ** ppSurface) PURE; STDMETHOD(GetCaps)(void * pvCaps) PURE; STDMETHOD(BeginVideoSurfaceAllocation)() PURE; STDMETHOD(EndVideoSurfaceAllocation)() PURE; }; #if DBG interface __declspec(uuid("{D4302C96-F44D-42f8-A2A1-C4E8FF896302}")) IDebugDevice; interface IDebugDevice : IUnknown { STDMETHOD(Invoke)(LPCWSTR pszCommand) PURE; }; #endif interface __declspec(uuid("{5AE21A59-F163-41d7-ACF7-C2F643D39711}")) IGraphics; interface IGraphics : IUnknown { STDMETHOD(GetType)(GraphicsType * ptype) PURE; STDMETHOD(OpenGraphics)(REFIID riid, void ** ppvDevice) PURE; STDMETHOD(CloseGraphics)() PURE; }; interface __declspec(uuid("{03AB8158-6646-4c2f-B97A-8A2EE13BABCE}")) ID3d7Graphics; interface ID3d7Graphics : public IUnknown { STDMETHOD(GetVertexAlpha)(BYTE * pbAlpha) PURE; STDMETHOD(PushVertexAlpha)(BYTE bAlpha) PURE; STDMETHOD(PopVertexAlpha)() PURE; STDMETHOD(TransformPoints)(DirectUser::Geometry::PointF * rgptfIn, int cPts) PURE; }; interface __declspec(uuid("{4F6A8A17-67B1-4ecd-B344-FD7B83C02C82}")) IRenderOperation; interface IRenderOperation : public IUnknown { STDMETHOD(Before)(IGraphics * pgr, DirectUser::Geometry::RectF rcfGadgetPxl) PURE; STDMETHOD(After)() PURE; STDMETHOD(CleanUp)() PURE; }; interface __declspec(uuid("{6CDAF326-1C4E-4a50-B02E-60BA14545178}")) ISimpleSession; interface ISimpleSession : IUnknown { STDMETHOD(CreateImage)(HBITMAP hbmp, BOOL fPreMultiplied, ISimpleImage ** ppImg) PURE; STDMETHOD(LoadImage)(LPCWSTR pszFileName, ISimpleImage ** ppImg) PURE; STDMETHOD(LoadImage)(HINSTANCE hinstance, LPCWSTR pszName, LPCWSTR pszType, ISimpleImage ** ppImg) PURE; STDMETHOD(LoadImage)(IStream * pStream, ISimpleImage ** ppImg) PURE; STDMETHOD(CreateText)(LPCWSTR pszText, ISimpleText ** ppText) PURE; STDMETHOD(CreateSolidFillRO)(DUser::Color clr, DUser::IRenderOperation ** pproNew) PURE; STDMETHOD(CreateSolidFillRO)(DUser::Color clr, DirectUser::Geometry::RectF rcfDest, DUser::IRenderOperation ** pproNew) PURE; STDMETHOD(CreateSurfaceRO)(ISurface * psrf, IRenderOperation ** pproNew) PURE; STDMETHOD(CreateSurfaceRO)(ISurface * psrf, DirectUser::Geometry::RectF rcfSrc, DirectUser::Geometry::RectF rcfDest, IRenderOperation ** pproNew) PURE; STDMETHOD(CreateDDrawRO)(IUnknown * pdds, DirectUser::Geometry::RectF rcfSrc, DirectUser::Geometry::RectF rcfDest, IRenderOperation ** pproNew) PURE; STDMETHOD(CreateDDrawSolidFillRO)(DUser::Color clr, DirectUser::Geometry::RectF rcfDest, DUser::IRenderOperation ** pproNew) PURE; }; interface __declspec(uuid("{D79ADD77-2F8F-470e-B964-025CBD947985}")) ISimpleImage; interface ISimpleImage : IUnknown { STDMETHOD(GetType)(GraphicsType * ptype) PURE; STDMETHOD(GetSize)(DirectUser::Geometry::Size * psizePxl) PURE; STDMETHOD(CreateRenderOperation)(IRenderOperation ** pproNew) PURE; STDMETHOD(CreateRenderOperation)(DirectUser::Geometry::RectF rcfSrc, IRenderOperation ** pproNew) PURE; STDMETHOD(CreateRenderOperation)(DirectUser::Geometry::RectF rcfSrc, DirectUser::Geometry::RectF rcfDst, IRenderOperation ** pproNew) PURE; }; interface __declspec(uuid("{46CB2632-90D4-4c05-87E6-6959F15A0431}")) ISimpleText; interface ISimpleText : IUnknown { STDMETHOD(GetType)(GraphicsType * ptype) PURE; STDMETHOD(GetText)(LPWSTR psz, int cch) PURE; STDMETHOD(SetText)(LPCWSTR psz, int cch) PURE; STDMETHOD(GetFont)(HFONT* phfont) PURE; STDMETHOD(SetFont)(HFONT hfont) PURE; STDMETHOD(GetScale)(DirectUser::Geometry::SizeF * psizefScale) PURE; STDMETHOD(SetScale)(DirectUser::Geometry::SizeF sizefScale) PURE; STDMETHOD(GetColor)(DUser::Color* pclr) PURE; STDMETHOD(SetColor)(DUser::Color clr) PURE; STDMETHOD(GetBkColor)(DUser::Color* pclr) PURE; STDMETHOD(SetBkColor)(DUser::Color clr) PURE; STDMETHOD(GetFlags)(UINT* puFlags) PURE; STDMETHOD(SetFlags)(UINT uFlags) PURE; STDMETHOD(SetMaxWidth)(int nMaxWidth) PURE; STDMETHOD(GetCharacterSpacing)(float * pflFactor) PURE; STDMETHOD(SetCharacterSpacing)(float flFactor) PURE; STDMETHOD(ComputeSize)(DirectUser::Geometry::Size * psizeActualPxl) PURE; STDMETHOD(CreateRenderOperation)(IRenderOperation ** pproNew) PURE; STDMETHOD(CreateRenderOperation)(DirectUser::Geometry::RectF rcfSrc, IRenderOperation ** pproNew) PURE; }; /* interface __declspec(uuid("{B4F564EF-4816-484a-8A41-97D9C0AA5E1C}")) ISimpleModel; interface ISimpleModel : IUnknown { STDMETHOD(CreateRenderOperation)(IRenderOperation ** pproNew) PURE; }; */ // // Delegate support // template class Delegate { public: typedef HRESULT (CALLBACK type::*Proc)(arg * p1); static inline Delegate Build(type * pvThis, Proc pfn) { Delegate d; d.m_pvThis = pvThis; d.m_pfn = pfn; return d; } inline HRESULT Invoke(arg * p1) { return (m_pvThis->*m_pfn)(p1); } type * m_pvThis; Proc m_pfn; }; typedef Delegate EventDelegate; #define EVENT_DELEGATE(instance, function) \ DUser::EventDelegate::Build(reinterpret_cast(instance), \ reinterpret_cast(function)) // // Typedef's // typedef HRESULT (CALLBACK * ConstructProc)(DUser::Gadget::ConstructCommand cmd, HCLASS hclCur, DUser::Gadget * pg, void * pvData); typedef HRESULT (CALLBACK * PromoteProc)(ConstructProc pfnCS, HCLASS hclCur, DUser::Gadget * pg, DUser::Gadget::ConstructInfo * pmicData); typedef HCLASS (CALLBACK * DemoteProc)(HCLASS hclCur, DUser::Gadget * pg, void * pvData); // // Message information and class structures // template inline void * Method(HRESULT (t::*pfn)(m * pmsg)) { union { HRESULT (t::*in)(m * pmsg); void * out; }; in = pfn; return out; } template inline void * Event(HRESULT (t::*pfn)(m * pmsg)) { union { HRESULT (t::*in)(m * pmsg); void * out; }; in = pfn; return out; } struct MessageInfoGuts { void * pfn; // IN: Implementation function LPCWSTR pszMsgName; // IN: Name }; struct MessageClassGuts { DWORD cbSize; // IN: Structure size DWORD nClassVersion; // IN: This class's version LPCWSTR pszClassName; // IN: Name of new class LPCWSTR pszSuperName; // IN: Name of super-class MessageInfoGuts * // IN: Message information rgMsgInfo; int cMsgs; // IN: Number of messages being registered PromoteProc pfnPromote; // IN: Promotion function DemoteProc pfnDemote; // IN: Demotion function HCLASS hclNew; // OUT: Newly created class HCLASS hclSuper; // OUT: Newly created class's super }; struct MessageInfoStub { int cbSlotOffset; // OUT: Message slot offset LPCWSTR pszMsgName; // IN: Name }; struct MessageClassStub { DWORD cbSize; DWORD nClassVersion; LPCWSTR pszClassName; DUser::MessageInfoStub * rgMsgInfo; int cMsgs; }; struct MessageClassSuper { DWORD cbSize; DWORD nClassVersion; LPCWSTR pszClassName; void * pmt; }; }; // namespace DUser extern "C" { #define DRS_IMMEDIATE 0x00000001 #define DRS_VALID (DRS_IMMEDIATE) DUSER_API HCLASS WINAPI DUserRegisterGuts(DUser::MessageClassGuts * pmc); DUSER_API HCLASS WINAPI DUserRegisterStub(DUser::MessageClassStub * pmc, UINT nFlags); DUSER_API HCLASS WINAPI DUserRegisterSuper(DUser::MessageClassSuper * pmc); DUSER_API HCLASS WINAPI DUserFindClass(LPCWSTR pszName, DWORD nVersion); DUSER_API DUser::Gadget * WINAPI DUserBuildGadget(HCLASS hcl, DUser::Gadget::ConstructInfo * pmicData); #define GCC_INPUT 0x00000001 #define GCC_VALID (GCC_INPUT) DUSER_API HRESULT WINAPI DUserBuildHWndContainer(HWND hwnd, UINT nFlags, HCLASS hclRoot, DUser::Gadget ** ppgvRoot); DUSER_API HRESULT WINAPI DUserGetDevice(DUser::IDevice ** ppDevice); DUSER_API HRESULT WINAPI DUserBuildSession(DUser::IDevice * pDevice, DUser::ISimpleSession ** ppSession); DUSER_API BOOL WINAPI DUserClassInstanceOf(HCLASS hclSrc, HCLASS hclTest); DUSER_API BOOL WINAPI DUserInstanceOf(DUser::Gadget * pg, HCLASS hclTest); DUSER_API DUser::Gadget * WINAPI DUserCastClass(DUser::Gadget * pg, HCLASS hclTest); DUSER_API DUser::Gadget * WINAPI DUserCastDirect(HGADGET hgad); DUSER_API void * WINAPI DUserGetGutsData(DUser::Gadget * pg, HCLASS hclData); /***************************************************************************\ * * Messages * \***************************************************************************/ // Core messages #define GM_EVENT 32768 #define GM_DESTROY (1 + GM_EVENT) #define GM_PAINT (2 + GM_EVENT) #define GM_INPUT (3 + GM_EVENT) #define GM_CHANGESTATE (4 + GM_EVENT) #define GM_CHANGERECT (5 + GM_EVENT) #define GM_CHANGESTYLE (6 + GM_EVENT) #define GM_QUERY (7 + GM_EVENT) #define GM_SYNCADAPTOR (8 + GM_EVENT) #define GM_LOSTDEVICE (9 + GM_EVENT) #define GM_USER (1024 + GM_EVENT) // Starting point for user messages #define GM_REGISTER (1000000 + GM_EVENT) // Starting point for registered messages // Win32 Messages // TODO: Move these to winuser.h #define WM_GETROOTGADGET (WM_USER - 1) // Message filtering #define GMFI_PAINT 0x00000001 #define GMFI_INPUTKEYBOARD 0x00000002 #define GMFI_INPUTMOUSE 0x00000004 #define GMFI_INPUTMOUSEMOVE 0x00000008 #define GMFI_CHANGESTATE 0x00000010 #define GMFI_CHANGERECT 0x00000020 #define GMFI_CHANGESTYLE 0x00000040 #define GMFI_ALL 0xFFFFFFFF #define GMFI_VALID (GMFI_PAINT | \ GMFI_INPUTKEYBOARD | GMFI_INPUTMOUSE | GMFI_INPUTMOUSEMOVE | \ GMFI_CHANGESTATE | GMFI_CHANGERECT | GMFI_CHANGESTYLE) #define GDESTROY_START 1 // Gadget has started the destruction process #define GDESTROY_FINAL 2 // Gadget has been fully destroyed BEGIN_STRUCT(GMSG_DESTROY, EventMsg) UINT nCode; // Destruction code END_STRUCT(GMSG_DESTROY) #define GINPUT_MOUSE 0 #define GINPUT_KEYBOARD 1 #define GINPUT_JOYSTICK 2 BEGIN_STRUCT(GMSG_INPUT, EventMsg) UINT nDevice; // Input device UINT nCode; // Specific action UINT nModifiers; // ctrl, alt, shift, leftbutton, middlebutton, rightbutton LONG lTime; // Time when message was sent END_STRUCT(GMSG_INPUT) #define GMOUSE_MOVE 0 #define GMOUSE_DOWN 1 #define GMOUSE_UP 2 #define GMOUSE_DRAG 3 #define GMOUSE_HOVER 4 #define GMOUSE_WHEEL 5 #define GMOUSE_MAX 5 #define GBUTTON_NONE 0 #define GBUTTON_LEFT 1 #define GBUTTON_RIGHT 2 #define GBUTTON_MIDDLE 3 #define GBUTTON_MAX 3 #define GMODIFIER_LCONTROL 0x00000001 #define GMODIFIER_RCONTROL 0x00000002 #define GMODIFIER_LSHIFT 0x00000004 #define GMODIFIER_RSHIFT 0x00000008 #define GMODIFIER_LALT 0x00000010 #define GMODIFIER_RALT 0x00000020 #define GMODIFIER_LBUTTON 0x00000040 #define GMODIFIER_RBUTTON 0x00000080 #define GMODIFIER_MBUTTON 0x00000100 #define GMODIFIER_CONTROL (GMODIFIER_LCONTROL | GMODIFIER_RCONTROL) #define GMODIFIER_SHIFT (GMODIFIER_LSHIFT | GMODIFIER_RSHIFT) #define GMODIFIER_ALT (GMODIFIER_LALT | GMODIFIER_RALT) BEGIN_STRUCT(GMSG_MOUSE, GMSG_INPUT) POINT ptClientPxl; // Mouse location in client coordinates BYTE bButton; // Mouse button UINT nFlags; // Misc. flags END_STRUCT(GMSG_MOUSE) BEGIN_STRUCT(GMSG_MOUSEDRAG, GMSG_MOUSE) SIZE sizeDelta; // Mouse drag distance BOOL fWithin; // Mouse within gadget's bounds END_STRUCT(GMSG_MOUSEDRAG) BEGIN_STRUCT(GMSG_MOUSECLICK, GMSG_MOUSE) UINT cClicks; // number of clicks in "quick" succession END_STRUCT(GMSG_MOUSECLICK) BEGIN_STRUCT(GMSG_MOUSEWHEEL, GMSG_MOUSE) short sWheel; // Wheel position END_STRUCT(GMSG_MOUSEWHEEL) #define GKEY_DOWN 0 #define GKEY_UP 1 #define GKEY_CHAR 2 #define GKEY_SYSDOWN 3 #define GKEY_SYSUP 4 #define GKEY_SYSCHAR 5 BEGIN_STRUCT(GMSG_KEYBOARD, GMSG_INPUT) WCHAR ch; // Character WORD cRep; // Repeat count WORD wFlags; // Misc. flags END_STRUCT(GMSG_KEYBOARD) BEGIN_STRUCT(PaintMsg, EventMsg) DUser::GraphicsType nSurfaceType; // Surface type DirectUser::Geometry::RectF rcfGadgetPxl; // Logical position of Gadget DirectUser::Geometry::RectF rcfInvalidPxl; // Invalid rectangle in client coordinates DUser::IGraphics * pgr; // Graphics to draw into END_STRUCT(PaintMsg) #define GSTATE_KEYBOARDFOCUS 0 #define GSTATE_MOUSEFOCUS 1 #define GSTATE_ACTIVE 2 #define GSTATE_CAPTURE 3 #define GSC_SET 0 #define GSC_LOST 1 BEGIN_STRUCT(GMSG_CHANGESTATE, EventMsg) UINT nCode; // Change command HGADGET hgadSet; // Gadget that is receiving the "state" HGADGET hgadLost; // Gadget that is loosing the "state" UINT nCmd; // Action that occurred END_STRUCT(GMSG_CHANGESTATE) BEGIN_STRUCT(GMSG_CHANGESTYLE, EventMsg) UINT nNewStyle; // New style UINT nOldStyle; // Old style END_STRUCT(GMSG_CHANGESTYLE) BEGIN_STRUCT(GMSG_CHANGERECT, EventMsg) RECT rcNewRect; UINT nFlags; END_STRUCT(GMSG_CHANGERECT) #define GQUERY_HITTEST 5 #define GQUERY_PADDING 6 BEGIN_STRUCT(GMSG_QUERY, EventMsg) UINT nCode; // Query command END_STRUCT(GMSG_QUERY) #define GQHT_NOWHERE 0 // Location is not "inside" #define GQHT_INSIDE 1 // Location is generically "inside" #define GQHT_CHILD 2 // Location is inside child specified by pvResultData // (NOT YET IMPLEMENTED) BEGIN_STRUCT(GMSG_QUERYHITTEST, GMSG_QUERY) POINT ptClientPxl; // Location in client pixels UINT nResultCode; // Result code void * pvResultData; // Extra result information END_STRUCT(GMSG_QUERYHITTEST) BEGIN_STRUCT(GMSG_QUERYPADDING, GMSG_QUERY) RECT rcPadding; // Extra padding around content END_STRUCT(GMSG_QUERYPADDING) #define GSYNC_RECT (1) #define GSYNC_XFORM (2) #define GSYNC_STYLE (3) #define GSYNC_PARENT (4) BEGIN_STRUCT(GMSG_SYNCADAPTOR, EventMsg) UINT nCode; // Change code END_STRUCT(GMSG_SYNCADAPTOR) BEGIN_STRUCT(GMSG_LOSTDEVICE, EventMsg) BOOL fLost; // FALSE -> device was lost, else device came back END_STRUCT(GMSG_LOSTDEVICE) typedef HRESULT (CALLBACK * GADGETPROC)(HGADGET hgadCur, void * pvCur, EventMsg * pMsg); #define SGM_FULL 0x00000001 // Route and bubble the message #define SGM_RECEIVECONTEXT 0x00000002 // Use the receiving Gadget's Context #define SGM_VALID (SGM_FULL | SGM_RECEIVECONTEXT) typedef struct tagFGM_INFO { EventMsg* pmsg; // Message to fire UINT nFlags; // Flags modifying message being fired HRESULT hr; // Result of message (if send) void * pvReserved; // Reserved } FGM_INFO; #define FGMQ_SEND 1 // Standard "Send" message queue #define FGMQ_POST 2 // Standard "Post" message queue DUSER_API HRESULT WINAPI DUserSendMethod(DUser::Gadget * pgadMsg, MethodMsg * pmsg); DUSER_API HRESULT WINAPI DUserPostMethod(DUser::Gadget * pgadMsg, MethodMsg * pmsg); DUSER_API HRESULT WINAPI DUserSendEvent(EventMsg * pmsg, UINT nFlags); DUSER_API HRESULT WINAPI DUserPostEvent(EventMsg * pmsg, UINT nFlags); DUSER_API BOOL WINAPI FireGadgetMessages(FGM_INFO * rgFGM, int cMsgs, UINT idQueue); DUSER_API UINT WINAPI GetGadgetMessageFilter(HGADGET hgad, void * pvCookie); DUSER_API BOOL WINAPI SetGadgetMessageFilter(HGADGET hgad, void * pvCookie, UINT nNewFilter, UINT nMask); DUSER_API MSGID WINAPI RegisterGadgetMessage(const GUID * pguid); DUSER_API MSGID WINAPI RegisterGadgetMessageString(LPCWSTR pszName); DUSER_API BOOL WINAPI UnregisterGadgetMessage(const GUID * pguid); DUSER_API BOOL WINAPI UnregisterGadgetMessageString(LPCWSTR pszName); DUSER_API BOOL WINAPI FindGadgetMessages(const GUID ** rgpguid, MSGID * rgnMsg, int cMsgs); DUSER_API BOOL WINAPI AddGadgetMessageHandler(HGADGET hgadMsg, MSGID nMsg, HGADGET hgadHandler); DUSER_API BOOL WINAPI RemoveGadgetMessageHandler(HGADGET hgadMsg, MSGID nMsg, HGADGET hgadHandler); DUSER_API BOOL WINAPI GetMessageExA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); DUSER_API BOOL WINAPI GetMessageExW(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); DUSER_API BOOL WINAPI PeekMessageExA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg); DUSER_API BOOL WINAPI PeekMessageExW(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg); DUSER_API BOOL WINAPI WaitMessageEx(); #ifdef UNICODE #define GetMessageEx GetMessageExW #define PeekMessageEx PeekMessageExW #else #define GetMessageEx GetMessageExA #define PeekMessageEx PeekMessageExA #endif /***************************************************************************\ * * Construction, Tree management * \***************************************************************************/ #define GC_HWNDHOST 0x00000001 // + Host inside an HWND #define GC_NCHOST 0x00000002 // | Host inside Non-client of HWND #define GC_COMPLEX 0x00000004 // | Complex TreeGadget #define GC_SIMPLE 0x00000005 // | Simple TreeGadget #define GC_DETACHED 0x00000006 // | Detached TreeGadget #define GC_MESSAGE 0x00000007 // | Message-only Gadget #define GC_TYPE 0x0000000F // + Type of Gadget to create #define GC_VALID (GC_TYPE) DUSER_API HGADGET WINAPI CreateGadget(HANDLE hParent, UINT nFlags, GADGETPROC pfnProc, void * pvGadgetData); DUSER_API HRESULT WINAPI DUserBuildHWndContainer2(HWND hwnd, UINT nFlags, GADGETPROC pfnProc, void * pvData, HGADGET * phgadRoot); #define GENUM_CURRENT 0x00000001 // Starting node in enumeration #define GENUM_SIBLINGS 0x00000002 // Siblings of starting node in enumeration // + Type of enumeration (exclusive) #define GENUM_PARENTSUP 0x00000004 // | Parents of this node going up #define GENUM_PARENTSDOWN 0x00000008 // | Parents of this node going down #define GENUM_SHALLOWCHILD 0x0000000C // | Shallow children #define GENUM_DEEPCHILD 0x00000010 // + Deep children #define GENUM_TYPE (GENUM_PARENTSUP | GENUM_PARENTSDOWN | \ GENUM_SHALLOWCHILD | GENUM_DEEPCHILD) #define GENUM_MODIFYTREE 0x00000020 // Allow modifying the Tree during enumeration #define GENUM_VALID (GENUM_CURRENT | GENUM_SIBLINGS | GENUM_TYPE | GENUM_MODIFYTREE) typedef BOOL (CALLBACK * GADGETENUMPROC)(HGADGET hgad, void * pvData); DUSER_API BOOL WINAPI EnumGadgets(HGADGET hgadEnum, GADGETENUMPROC pfnProc, void * pvData, UINT nFlags); #define GORDER_MIN 0 #define GORDER_ANY 0 // Order does not matter #define GORDER_BEFORE 1 // Move this gadget in-front of sibling #define GORDER_BEHIND 2 // Move this gadget behind sibling #define GORDER_TOP 3 // Move to front of sibling z-order #define GORDER_BOTTOM 4 // Move to bottom of sibling z-order #define GORDER_FORWARD 5 // Move forward in z-order #define GORDER_BACKWARD 6 // Move backward in z-order #define GORDER_MAX 6 DUSER_API BOOL WINAPI SetGadgetOrder(HGADGET hgadMove, HGADGET hgadOther, UINT nCmd); DUSER_API BOOL WINAPI SetGadgetParent(HGADGET hgadMove, HGADGET hgadParent, HGADGET hgadOther, UINT nCmd); #define GR_MIN 0 #define GR_PARENT 0 #define GR_NEXT 1 #define GR_PREV 2 #define GR_TOPCHILD 3 #define GR_BOTTOMCHILD 4 #define GR_ROOT 5 #define GR_MAX 5 DUSER_API HGADGET WINAPI GetGadgetRelative(HGADGET hgad, UINT nCmd); /***************************************************************************\ * * Styles and properties * \***************************************************************************/ #define GS_VISIBLE 0x00000001 // Drawing is visible #define GS_ENABLED 0x00000002 // Input in "enabled" #define GS_KEYBOARDFOCUS 0x00000004 // Gadget can receive keyboard focus #define GS_MOUSEFOCUS 0x00000008 // Gadget can receive mouse focus #define GS_CLIPINSIDE 0x00000010 // Clip drawing inside this Gadget #define GS_HREDRAW 0x00000020 // Redraw entire Gadget if resized horizontally #define GS_VREDRAW 0x00000040 // Redraw entire Gadget if resized vertically #define GS_ZEROORIGIN 0x00000080 // Set origin to (0,0) #define GS_CUSTOMHITTEST 0x00000100 // Requires custom hit-testing #define GS_ADAPTOR 0x00000200 // Requires extra notifications to host #define GS_NORESETINVALID 0x00000400 // Once invalidated, Gadget stays invalid #define GS_VALID (GS_VISIBLE | GS_ENABLED | GS_KEYBOARDFOCUS | GS_MOUSEFOCUS | \ GS_CLIPINSIDE | GS_HREDRAW | GS_VREDRAW | GS_ZEROORIGIN | \ GS_CUSTOMHITTEST | GS_ADAPTOR | GS_NORESETINVALID) DUSER_API UINT WINAPI GetGadgetStyle(HGADGET hgad); DUSER_API BOOL WINAPI SetGadgetStyle(HGADGET hgadChange, UINT nNewStyle, UINT nMask); DUSER_API HGADGET WINAPI GetGadgetFocus(); DUSER_API BOOL WINAPI SetGadgetFocus(HGADGET hgadFocus); DUSER_API BOOL WINAPI IsGadgetParentChainStyle(HGADGET hgad, UINT nStyle, BOOL * pfVisible, UINT nFlags); inline BOOL IsGadgetVisible(HGADGET hgad, BOOL * pfVisible, UINT nFlags) { return IsGadgetParentChainStyle(hgad, GS_VISIBLE, pfVisible, nFlags); } inline BOOL IsGadgetEnabled(HGADGET hgad, BOOL * pfEnabled, UINT nFlags) { return IsGadgetParentChainStyle(hgad, GS_ENABLED, pfEnabled, nFlags); } DUSER_API PRID WINAPI RegisterGadgetProperty(const GUID * pguid); DUSER_API BOOL WINAPI UnregisterGadgetProperty(const GUID * pguid); DUSER_API BOOL WINAPI GetGadgetProperty(HGADGET hgad, PRID id, void ** ppvValue); DUSER_API BOOL WINAPI SetGadgetProperty(HGADGET hgad, PRID id, void * pvValue); DUSER_API BOOL WINAPI RemoveGadgetProperty(HGADGET hgad, PRID id); struct GADGET_DESCRIPTION { DWORD cbSize; wchar_t szName[128]; wchar_t szType[128]; wchar_t szStyle[1024]; }; DUSER_API BOOL WINAPI GetGadgetDescription(HGADGET hgad, GADGET_DESCRIPTION * pgd); DUSER_API BOOL WINAPI SetGadgetDescription(HGADGET hgad, const GADGET_DESCRIPTION * pgd); /***************************************************************************\ * * Painting, Transforms * \***************************************************************************/ #define BLEND_OPAQUE 255 #define BLEND_TRANSPARENT 0 #define PI 3.14159265359 #define IG_ME 0x00000001 #define IG_CHILDREN 0x00000002 #define IG_VALID (IG_ME | IG_CHILDREN) DUSER_API BOOL WINAPI InvalidateGadget(HGADGET hgad, UINT nFlags); /***************************************************************************\ * * Position * \***************************************************************************/ #define SGR_MOVE 0x00000001 // Gadget is being moved #define SGR_SIZE 0x00000002 // Gadget is being resized #define SGR_CHANGEMASK (SGR_MOVE | SGR_SIZE) #define SGR_NOINVALIDATE 0x00000200 // Don't automatically invalidate #define SGR_VALID_SET (SGR_CHANGEMASK | SGR_NOINVALIDATE) DUSER_API BOOL WINAPI GetGadgetSize(HGADGET hgad, DirectUser::Geometry::Size * psizeLogicalPxl); DUSER_API BOOL WINAPI GetGadgetRect(HGADGET hgad, RECT * prcPxl, UINT nFlags); DUSER_API BOOL WINAPI SetGadgetRect(HGADGET hgadChange, int x, int y, int w, int h, UINT nFlags); DUSER_API HGADGET WINAPI FindGadgetFromPoint(HGADGET hgadRoot, POINT ptContainerPxl, UINT nStyle, POINT * pptClientPxl); DUSER_API BOOL WINAPI MapGadgetPoints(HGADGET hgadFrom, HGADGET hgadTo, POINT * rgptClientPxl, int cPts); /***************************************************************************\ * * Tickets * \***************************************************************************/ DUSER_API DWORD WINAPI GetGadgetTicket(HGADGET hgad); DUSER_API HGADGET WINAPI LookupGadgetTicket(DWORD dwTicket); /***************************************************************************\ * * Special hooks for different containers * \***************************************************************************/ DUSER_API BOOL WINAPI ForwardGadgetMessage(HGADGET hgadRoot, UINT nMsg, WPARAM wParam, LPARAM lParam, LRESULT * pr); #define GDRAW_SHOW 0x00000001 #define GDRAW_VALID (GDRAW_SHOW) DUSER_API HRESULT WINAPI DrawGadgetTree(HGADGET hgadDraw, HDC hdcDraw, const RECT * prcDraw, UINT nFlags); typedef BOOL (CALLBACK* ATTACHWNDPROC)(void * pvThis, HWND hwnd, UINT nMsg, WPARAM wParam, LPARAM lParam, LRESULT * plRet); DUSER_API BOOL WINAPI AttachWndProcA(HWND hwnd, ATTACHWNDPROC pfn, void * pvThis); DUSER_API BOOL WINAPI AttachWndProcW(HWND hwnd, ATTACHWNDPROC pfn, void * pvThis); DUSER_API BOOL WINAPI DetachWndProc(HWND hwnd, ATTACHWNDPROC pfn, void * pvThis); #ifdef UNICODE #define AttachWndProc AttachWndProcW #else #define AttachWndProc AttachWndProcA #endif #ifdef __cplusplus }; // extern "C" #endif #endif // INC__DUserCore_h__INCLUDED