Mercurial > foo_out_sdl
diff foosdk/sdk/libPPUI/gesture.h @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/libPPUI/gesture.h Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,264 @@ +#pragma once + +#ifndef WM_GESTURE + +#define WM_GESTURE 0x0119 +#define WM_GESTURENOTIFY 0x011A + + +DECLARE_HANDLE(HGESTUREINFO); + + +/* + * Gesture flags - GESTUREINFO.dwFlags + */ +#define GF_BEGIN 0x00000001 +#define GF_INERTIA 0x00000002 +#define GF_END 0x00000004 + +/* + * Gesture IDs + */ +#define GID_BEGIN 1 +#define GID_END 2 +#define GID_ZOOM 3 +#define GID_PAN 4 +#define GID_ROTATE 5 +#define GID_TWOFINGERTAP 6 +#define GID_PRESSANDTAP 7 +#define GID_ROLLOVER GID_PRESSANDTAP + +/* + * Gesture information structure + * - Pass the HGESTUREINFO received in the WM_GESTURE message lParam into the + * GetGestureInfo function to retrieve this information. + * - If cbExtraArgs is non-zero, pass the HGESTUREINFO received in the WM_GESTURE + * message lParam into the GetGestureExtraArgs function to retrieve extended + * argument information. + */ +typedef struct tagGESTUREINFO { + UINT cbSize; // size, in bytes, of this structure (including variable length Args field) + DWORD dwFlags; // see GF_* flags + DWORD dwID; // gesture ID, see GID_* defines + HWND hwndTarget; // handle to window targeted by this gesture + POINTS ptsLocation; // current location of this gesture + DWORD dwInstanceID; // internally used + DWORD dwSequenceID; // internally used + ULONGLONG ullArguments; // arguments for gestures whose arguments fit in 8 BYTES + UINT cbExtraArgs; // size, in bytes, of extra arguments, if any, that accompany this gesture +} GESTUREINFO, *PGESTUREINFO; +typedef GESTUREINFO const * PCGESTUREINFO; + + +/* + * Gesture notification structure + * - The WM_GESTURENOTIFY message lParam contains a pointer to this structure. + * - The WM_GESTURENOTIFY message notifies a window that gesture recognition is + * in progress and a gesture will be generated if one is recognized under the + * current gesture settings. + */ +typedef struct tagGESTURENOTIFYSTRUCT { + UINT cbSize; // size, in bytes, of this structure + DWORD dwFlags; // unused + HWND hwndTarget; // handle to window targeted by the gesture + POINTS ptsLocation; // starting location + DWORD dwInstanceID; // internally used +} GESTURENOTIFYSTRUCT, *PGESTURENOTIFYSTRUCT; + +/* + * Gesture argument helpers + * - Angle should be a double in the range of -2pi to +2pi + * - Argument should be an unsigned 16-bit value + */ +#define GID_ROTATE_ANGLE_TO_ARGUMENT(_arg_) ((USHORT)((((_arg_) + 2.0 * 3.14159265) / (4.0 * 3.14159265)) * 65535.0)) +#define GID_ROTATE_ANGLE_FROM_ARGUMENT(_arg_) ((((double)(_arg_) / 65535.0) * 4.0 * 3.14159265) - 2.0 * 3.14159265) + +/* + * Gesture information retrieval + * - HGESTUREINFO is received by a window in the lParam of a WM_GESTURE message. + */ +WINUSERAPI +BOOL +WINAPI +GetGestureInfo( + __in HGESTUREINFO hGestureInfo, + __out PGESTUREINFO pGestureInfo); + + + +/* + * Gesture extra arguments retrieval + * - HGESTUREINFO is received by a window in the lParam of a WM_GESTURE message. + * - Size, in bytes, of the extra argument data is available in the cbExtraArgs + * field of the GESTUREINFO structure retrieved using the GetGestureInfo function. + */ +WINUSERAPI +BOOL +WINAPI +GetGestureExtraArgs( + __in HGESTUREINFO hGestureInfo, + __in UINT cbExtraArgs, + __out_bcount(cbExtraArgs) PBYTE pExtraArgs); + +/* + * Gesture information handle management + * - If an application processes the WM_GESTURE message, then once it is done + * with the associated HGESTUREINFO, the application is responsible for + * closing the handle using this function. Failure to do so may result in + * process memory leaks. + * - If the message is instead passed to DefWindowProc, or is forwarded using + * one of the PostMessage or SendMessage class of API functions, the handle + * is transfered with the message and need not be closed by the application. + */ +WINUSERAPI +BOOL +WINAPI +CloseGestureInfoHandle( + __in HGESTUREINFO hGestureInfo); + + +/* + * Gesture configuration structure + * - Used in SetGestureConfig and GetGestureConfig + * - Note that any setting not included in either GESTURECONFIG.dwWant or + * GESTURECONFIG.dwBlock will use the parent window's preferences or + * system defaults. + */ +typedef struct tagGESTURECONFIG { + DWORD dwID; // gesture ID + DWORD dwWant; // settings related to gesture ID that are to be turned on + DWORD dwBlock; // settings related to gesture ID that are to be turned off +} GESTURECONFIG, *PGESTURECONFIG; + +/* + * Gesture configuration flags - GESTURECONFIG.dwWant or GESTURECONFIG.dwBlock + */ + +/* + * Common gesture configuration flags - set GESTURECONFIG.dwID to zero + */ +#define GC_ALLGESTURES 0x00000001 + +/* + * Zoom gesture configuration flags - set GESTURECONFIG.dwID to GID_ZOOM + */ +#define GC_ZOOM 0x00000001 + +/* + * Pan gesture configuration flags - set GESTURECONFIG.dwID to GID_PAN + */ +#define GC_PAN 0x00000001 +#define GC_PAN_WITH_SINGLE_FINGER_VERTICALLY 0x00000002 +#define GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY 0x00000004 +#define GC_PAN_WITH_GUTTER 0x00000008 +#define GC_PAN_WITH_INERTIA 0x00000010 + +/* + * Rotate gesture configuration flags - set GESTURECONFIG.dwID to GID_ROTATE + */ +#define GC_ROTATE 0x00000001 + +/* + * Two finger tap gesture configuration flags - set GESTURECONFIG.dwID to GID_TWOFINGERTAP + */ +#define GC_TWOFINGERTAP 0x00000001 + +/* + * PressAndTap gesture configuration flags - set GESTURECONFIG.dwID to GID_PRESSANDTAP + */ +#define GC_PRESSANDTAP 0x00000001 +#define GC_ROLLOVER GC_PRESSANDTAP + +#define GESTURECONFIGMAXCOUNT 256 // Maximum number of gestures that can be included + // in a single call to SetGestureConfig / GetGestureConfig + +WINUSERAPI +BOOL +WINAPI +SetGestureConfig( + __in HWND hwnd, // window for which configuration is specified + __in DWORD dwReserved, // reserved, must be 0 + __in UINT cIDs, // count of GESTURECONFIG structures + __in_ecount(cIDs) PGESTURECONFIG pGestureConfig, // array of GESTURECONFIG structures, dwIDs will be processed in the + // order specified and repeated occurances will overwrite previous ones + __in UINT cbSize); // sizeof(GESTURECONFIG) + + + + +#define GCF_INCLUDE_ANCESTORS 0x00000001 // If specified, GetGestureConfig returns consolidated configuration + // for the specified window and it's parent window chain + +WINUSERAPI +BOOL +WINAPI +GetGestureConfig( + __in HWND hwnd, // window for which configuration is required + __in DWORD dwReserved, // reserved, must be 0 + __in DWORD dwFlags, // see GCF_* flags + __in PUINT pcIDs, // *pcIDs contains the size, in number of GESTURECONFIG structures, + // of the buffer pointed to by pGestureConfig + __inout_ecount(*pcIDs) PGESTURECONFIG pGestureConfig, + // pointer to buffer to receive the returned array of GESTURECONFIG structures + __in UINT cbSize); // sizeof(GESTURECONFIG) + + + +typedef BOOL +(WINAPI *pGetGestureInfo_t)( + __in HGESTUREINFO hGestureInfo, + __out PGESTUREINFO pGestureInfo); + +typedef BOOL +(WINAPI * pCloseGestureInfoHandle_t)( + __in HGESTUREINFO hGestureInfo); + +typedef BOOL +(WINAPI * pSetGestureConfig_t) ( + __in HWND hwnd, // window for which configuration is specified + __in DWORD dwReserved, // reserved, must be 0 + __in UINT cIDs, // count of GESTURECONFIG structures + __in_ecount(cIDs) PGESTURECONFIG pGestureConfig, // array of GESTURECONFIG structures, dwIDs will be processed in the + // order specified and repeated occurances will overwrite previous ones + __in UINT cbSize); // sizeof(GESTURECONFIG) + +class CGestureAPI { +public: + CGestureAPI() { + HMODULE dll = GetModuleHandle(_T("user32.dll")); + + Bind(GetGestureInfo, dll, "GetGestureInfo"); + Bind(CloseGestureInfoHandle, dll, "CloseGestureInfoHandle"); + Bind(SetGestureConfig, dll, "SetGestureConfig"); + } + + bool IsAvailable() { + return this->GetGestureInfo != NULL; + } + + pGetGestureInfo_t GetGestureInfo; + pCloseGestureInfoHandle_t CloseGestureInfoHandle; + pSetGestureConfig_t SetGestureConfig; +private: + template<typename func_t> static void Bind(func_t & f, HMODULE dll, const char * name) { + f = reinterpret_cast<func_t>(GetProcAddress(dll, name)); + } +}; +#else + +class CGestureAPI { +public: + inline static bool IsAvailable() { return true; } + inline static BOOL GetGestureInfo(HGESTUREINFO hGestureInfo, PGESTUREINFO pGestureInfo) { + return ::GetGestureInfo(hGestureInfo, pGestureInfo); + } + inline static BOOL CloseGestureInfoHandle(HGESTUREINFO hGestureInfo) { + return ::CloseGestureInfoHandle(hGestureInfo); + } + + inline static BOOL SetGestureConfig(HWND hwnd, DWORD dwReserved, UINT cIDs, PGESTURECONFIG pGestureConfig, UINT cbSize) { + return ::SetGestureConfig(hwnd, dwReserved, cIDs, pGestureConfig, cbSize); + } +}; +#endif +
