1019 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			1019 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /***************************************************************************\
 | |
| *
 | |
| * 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 <limits.h>             // 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<Gadget *> (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<Gadget *> (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 type, class arg>
 | |
| class Delegate
 | |
| {
 | |
| public:
 | |
|     typedef HRESULT (CALLBACK type::*Proc)(arg * p1);
 | |
| 
 | |
|     static inline Delegate<type, arg>
 | |
|     Build(type * pvThis, Proc pfn) 
 | |
|     {
 | |
|         Delegate<type, arg> 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<DUser::Gadget, EventMsg> EventDelegate;
 | |
| #define EVENT_DELEGATE(instance, function) \
 | |
|     DUser::EventDelegate::Build(reinterpret_cast<DUser::Gadget *>(instance), \
 | |
|             reinterpret_cast<DUser::EventDelegate::Proc>(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<class t, class m>
 | |
| inline void *
 | |
| Method(HRESULT (t::*pfn)(m * pmsg))
 | |
| {
 | |
|     union
 | |
|     {
 | |
|        HRESULT (t::*in)(m * pmsg);
 | |
|        void * out;
 | |
|     };
 | |
| 
 | |
|     in = pfn;
 | |
|     return out;
 | |
| }
 | |
| 
 | |
| template<class t, class m>
 | |
| 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
 |