321 lines
11 KiB
C
321 lines
11 KiB
C
/* GDK - The GIMP Drawing Kit
|
|
* Copyright (C) 2021 the GTK team
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/* This code is derived from portions provided by the mingw-w64 project
|
|
* (mingw-w64.org), originally licensed under the Zope Public License
|
|
* (ZPL) version 2.1, with modifications made on May 12, 2021.
|
|
* Legal notice of the Zope Public License version 2.1 follows:
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* 1. Redistributions in source code must retain the accompanying copyright
|
|
* notice, this list of conditions, and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the accompanying
|
|
* copyright notice, this list of conditions, and the following disclaimer
|
|
* in the documentation and/or other materials provided with the
|
|
* distribution.
|
|
* 3. Names of the copyright holders must not be used to endorse or promote
|
|
* products derived from this software without prior written permission
|
|
* from the copyright holders.
|
|
* 4. The right to distribute this software or to use it for any purpose does
|
|
* not give you the right to use Servicemarks (sm) or Trademarks (tm) of
|
|
* the copyright holders. Use of them is covered by separate agreement
|
|
* with the copyright holders.
|
|
* 5. If any files are modified, you must cause the modified files to carry
|
|
* prominent notices stating that you changed the files and the date of
|
|
* any change.
|
|
*/
|
|
|
|
#ifndef POINTER_FLAG_NONE
|
|
|
|
#include <windows.h>
|
|
#include <tchar.h>
|
|
|
|
#define WM_POINTERDEVICECHANGE 0x238
|
|
#define WM_POINTERDEVICEINRANGE 0x239
|
|
#define WM_POINTERDEVICEOUTOFRANGE 0x23a
|
|
|
|
#define WM_NCPOINTERUPDATE 0x0241
|
|
#define WM_NCPOINTERDOWN 0x0242
|
|
#define WM_NCPOINTERUP 0x0243
|
|
#define WM_POINTERUPDATE 0x0245
|
|
#define WM_POINTERDOWN 0x0246
|
|
#define WM_POINTERUP 0x0247
|
|
#define WM_POINTERENTER 0x0249
|
|
#define WM_POINTERLEAVE 0x024a
|
|
#define WM_POINTERACTIVATE 0x024b
|
|
#define WM_POINTERCAPTURECHANGED 0x024c
|
|
#define WM_TOUCHHITTESTING 0x024d
|
|
#define WM_POINTERWHEEL 0x024e
|
|
#define WM_POINTERHWHEEL 0x024f
|
|
#define DM_POINTERHITTEST 0x0250
|
|
#define WM_POINTERROUTEDTO 0x0251
|
|
#define WM_POINTERROUTEDAWAY 0x0252
|
|
#define WM_POINTERROUTEDRELEASED 0x0253
|
|
|
|
#define POINTER_FLAG_NONE 0x00000000
|
|
#define POINTER_FLAG_NEW 0x00000001
|
|
#define POINTER_FLAG_INRANGE 0x00000002
|
|
#define POINTER_FLAG_INCONTACT 0x00000004
|
|
#define POINTER_FLAG_FIRSTBUTTON 0x00000010
|
|
#define POINTER_FLAG_SECONDBUTTON 0x00000020
|
|
#define POINTER_FLAG_THIRDBUTTON 0x00000040
|
|
#define POINTER_FLAG_FOURTHBUTTON 0x00000080
|
|
#define POINTER_FLAG_FIFTHBUTTON 0x00000100
|
|
#define POINTER_FLAG_PRIMARY 0x00002000
|
|
#define POINTER_FLAG_CONFIDENCE 0x00004000
|
|
#define POINTER_FLAG_CANCELED 0x00008000
|
|
#define POINTER_FLAG_DOWN 0x00010000
|
|
#define POINTER_FLAG_UPDATE 0x00020000
|
|
#define POINTER_FLAG_UP 0x00040000
|
|
#define POINTER_FLAG_WHEEL 0x00080000
|
|
#define POINTER_FLAG_HWHEEL 0x00100000
|
|
#define POINTER_FLAG_CAPTURECHANGED 0x00200000
|
|
#define POINTER_FLAG_HASTRANSFORM 0x00400000
|
|
|
|
#define POINTER_MOD_SHIFT (0x0004)
|
|
#define POINTER_MOD_CTRL (0x0008)
|
|
|
|
#define TOUCH_FLAG_NONE 0x00000000
|
|
|
|
#define TOUCH_MASK_NONE 0x00000000
|
|
#define TOUCH_MASK_CONTACTAREA 0x00000001
|
|
#define TOUCH_MASK_ORIENTATION 0x00000002
|
|
#define TOUCH_MASK_PRESSURE 0x00000004
|
|
|
|
#define PEN_FLAG_NONE 0x00000000
|
|
#define PEN_FLAG_BARREL 0x00000001
|
|
#define PEN_FLAG_INVERTED 0x00000002
|
|
#define PEN_FLAG_ERASER 0x00000004
|
|
|
|
#define PEN_MASK_NONE 0x00000000
|
|
#define PEN_MASK_PRESSURE 0x00000001
|
|
#define PEN_MASK_ROTATION 0x00000002
|
|
#define PEN_MASK_TILT_X 0x00000004
|
|
#define PEN_MASK_TILT_Y 0x00000008
|
|
|
|
#define POINTER_MESSAGE_FLAG_NEW 0x00000001
|
|
#define POINTER_MESSAGE_FLAG_INRANGE 0x00000002
|
|
#define POINTER_MESSAGE_FLAG_INCONTACT 0x00000004
|
|
#define POINTER_MESSAGE_FLAG_FIRSTBUTTON 0x00000010
|
|
#define POINTER_MESSAGE_FLAG_SECONDBUTTON 0x00000020
|
|
#define POINTER_MESSAGE_FLAG_THIRDBUTTON 0x00000040
|
|
#define POINTER_MESSAGE_FLAG_FOURTHBUTTON 0x00000080
|
|
#define POINTER_MESSAGE_FLAG_FIFTHBUTTON 0x00000100
|
|
#define POINTER_MESSAGE_FLAG_PRIMARY 0x00002000
|
|
#define POINTER_MESSAGE_FLAG_CONFIDENCE 0x00004000
|
|
#define POINTER_MESSAGE_FLAG_CANCELED 0x00008000
|
|
|
|
#define GET_POINTERID_WPARAM(wParam) (LOWORD (wParam))
|
|
#define IS_POINTER_FLAG_SET_WPARAM(wParam, flag) (((DWORD)HIWORD (wParam) &(flag)) == (flag))
|
|
#define IS_POINTER_NEW_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_NEW)
|
|
#define IS_POINTER_INRANGE_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_INRANGE)
|
|
#define IS_POINTER_INCONTACT_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_INCONTACT)
|
|
#define IS_POINTER_FIRSTBUTTON_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_FIRSTBUTTON)
|
|
#define IS_POINTER_SECONDBUTTON_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_SECONDBUTTON)
|
|
#define IS_POINTER_THIRDBUTTON_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_THIRDBUTTON)
|
|
#define IS_POINTER_FOURTHBUTTON_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_FOURTHBUTTON)
|
|
#define IS_POINTER_FIFTHBUTTON_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_FIFTHBUTTON)
|
|
#define IS_POINTER_PRIMARY_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_PRIMARY)
|
|
#define HAS_POINTER_CONFIDENCE_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_CONFIDENCE)
|
|
#define IS_POINTER_CANCELED_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_CANCELED)
|
|
|
|
#define PA_ACTIVATE MA_ACTIVATE
|
|
#define PA_NOACTIVATE MA_NOACTIVATE
|
|
|
|
typedef DWORD POINTER_INPUT_TYPE;
|
|
typedef UINT32 POINTER_FLAGS;
|
|
typedef UINT32 TOUCH_FLAGS;
|
|
typedef UINT32 TOUCH_MASK;
|
|
typedef UINT32 PEN_FLAGS;
|
|
typedef UINT32 PEN_MASK;
|
|
|
|
enum tagPOINTER_INPUT_TYPE {
|
|
PT_POINTER = 0x00000001,
|
|
PT_TOUCH = 0x00000002,
|
|
PT_PEN = 0x00000003,
|
|
PT_MOUSE = 0x00000004,
|
|
PT_TOUCHPAD = 0x00000005
|
|
};
|
|
|
|
typedef enum tagFEEDBACK_TYPE {
|
|
FEEDBACK_TOUCH_CONTACTVISUALIZATION = 1,
|
|
FEEDBACK_PEN_BARRELVISUALIZATION = 2,
|
|
FEEDBACK_PEN_TAP = 3,
|
|
FEEDBACK_PEN_DOUBLETAP = 4,
|
|
FEEDBACK_PEN_PRESSANDHOLD = 5,
|
|
FEEDBACK_PEN_RIGHTTAP = 6,
|
|
FEEDBACK_TOUCH_TAP = 7,
|
|
FEEDBACK_TOUCH_DOUBLETAP = 8,
|
|
FEEDBACK_TOUCH_PRESSANDHOLD = 9,
|
|
FEEDBACK_TOUCH_RIGHTTAP = 10,
|
|
FEEDBACK_GESTURE_PRESSANDTAP = 11,
|
|
FEEDBACK_MAX = 0xffffffff
|
|
} FEEDBACK_TYPE;
|
|
|
|
typedef enum tagPOINTER_BUTTON_CHANGE_TYPE {
|
|
POINTER_CHANGE_NONE,
|
|
POINTER_CHANGE_FIRSTBUTTON_DOWN,
|
|
POINTER_CHANGE_FIRSTBUTTON_UP,
|
|
POINTER_CHANGE_SECONDBUTTON_DOWN,
|
|
POINTER_CHANGE_SECONDBUTTON_UP,
|
|
POINTER_CHANGE_THIRDBUTTON_DOWN,
|
|
POINTER_CHANGE_THIRDBUTTON_UP,
|
|
POINTER_CHANGE_FOURTHBUTTON_DOWN,
|
|
POINTER_CHANGE_FOURTHBUTTON_UP,
|
|
POINTER_CHANGE_FIFTHBUTTON_DOWN,
|
|
POINTER_CHANGE_FIFTHBUTTON_UP,
|
|
} POINTER_BUTTON_CHANGE_TYPE;
|
|
|
|
typedef struct tagPOINTER_INFO {
|
|
POINTER_INPUT_TYPE pointerType;
|
|
UINT32 pointerId;
|
|
UINT32 frameId;
|
|
POINTER_FLAGS pointerFlags;
|
|
HANDLE sourceDevice;
|
|
HWND hwndTarget;
|
|
POINT ptPixelLocation;
|
|
POINT ptHimetricLocation;
|
|
POINT ptPixelLocationRaw;
|
|
POINT ptHimetricLocationRaw;
|
|
DWORD dwTime;
|
|
UINT32 historyCount;
|
|
INT32 InputData;
|
|
DWORD dwKeyStates;
|
|
UINT64 PerformanceCount;
|
|
POINTER_BUTTON_CHANGE_TYPE ButtonChangeType;
|
|
} POINTER_INFO;
|
|
|
|
typedef struct tagPOINTER_TOUCH_INFO {
|
|
POINTER_INFO pointerInfo;
|
|
TOUCH_FLAGS touchFlags;
|
|
TOUCH_MASK touchMask;
|
|
RECT rcContact;
|
|
RECT rcContactRaw;
|
|
UINT32 orientation;
|
|
UINT32 pressure;
|
|
} POINTER_TOUCH_INFO;
|
|
|
|
typedef struct tagPOINTER_PEN_INFO {
|
|
POINTER_INFO pointerInfo;
|
|
PEN_FLAGS penFlags;
|
|
PEN_MASK penMask;
|
|
UINT32 pressure;
|
|
UINT32 rotation;
|
|
INT32 tiltX;
|
|
INT32 tiltY;
|
|
} POINTER_PEN_INFO;
|
|
|
|
typedef enum {
|
|
POINTER_FEEDBACK_DEFAULT = 1,
|
|
POINTER_FEEDBACK_INDIRECT = 2,
|
|
POINTER_FEEDBACK_NONE = 3
|
|
} POINTER_FEEDBACK_MODE;
|
|
|
|
typedef struct tagUSAGE_PROPERTIES {
|
|
USHORT level;
|
|
USHORT page;
|
|
USHORT usage;
|
|
INT32 logicalMinimum;
|
|
INT32 logicalMaximum;
|
|
USHORT unit;
|
|
USHORT exponent;
|
|
BYTE count;
|
|
INT32 physicalMinimum;
|
|
INT32 physicalMaximum;
|
|
} USAGE_PROPERTIES, *PUSAGE_PROPERTIES;
|
|
|
|
typedef struct tagPOINTER_TYPE_INFO {
|
|
POINTER_INPUT_TYPE type;
|
|
union {
|
|
POINTER_TOUCH_INFO touchInfo;
|
|
POINTER_PEN_INFO penInfo;
|
|
} DUMMYUNIONNAME;
|
|
} POINTER_TYPE_INFO, *PPOINTER_TYPE_INFO;
|
|
|
|
#define POINTER_DEVICE_PRODUCT_STRING_MAX 520
|
|
#define PDC_ARRIVAL 0x001
|
|
#define PDC_REMOVAL 0x002
|
|
#define PDC_ORIENTATION_0 0x004
|
|
#define PDC_ORIENTATION_90 0x008
|
|
#define PDC_ORIENTATION_180 0x010
|
|
#define PDC_ORIENTATION_270 0x020
|
|
#define PDC_MODE_DEFAULT 0x040
|
|
#define PDC_MODE_CENTERED 0x080
|
|
#define PDC_MAPPING_CHANGE 0x100
|
|
#define PDC_RESOLUTION 0x200
|
|
#define PDC_ORIGIN 0x400
|
|
#define PDC_MODE_ASPECTRATIOPRESERVED 0x800
|
|
|
|
typedef enum tagPOINTER_DEVICE_TYPE {
|
|
POINTER_DEVICE_TYPE_INTEGRATED_PEN = 0x00000001,
|
|
POINTER_DEVICE_TYPE_EXTERNAL_PEN = 0x00000002,
|
|
POINTER_DEVICE_TYPE_TOUCH = 0x00000003,
|
|
POINTER_DEVICE_TYPE_TOUCH_PAD = 0x00000004,
|
|
POINTER_DEVICE_TYPE_MAX = 0xffffffff
|
|
} POINTER_DEVICE_TYPE;
|
|
|
|
typedef struct tagPOINTER_DEVICE_INFO {
|
|
DWORD displayOrientation;
|
|
HANDLE device;
|
|
POINTER_DEVICE_TYPE pointerDeviceType;
|
|
HMONITOR monitor;
|
|
ULONG startingCursorId;
|
|
USHORT maxActiveContacts;
|
|
WCHAR productString[POINTER_DEVICE_PRODUCT_STRING_MAX];
|
|
} POINTER_DEVICE_INFO;
|
|
|
|
typedef struct tagPOINTER_DEVICE_PROPERTY {
|
|
INT32 logicalMin;
|
|
INT32 logicalMax;
|
|
INT32 physicalMin;
|
|
INT32 physicalMax;
|
|
UINT32 unit;
|
|
UINT32 unitExponent;
|
|
USHORT usagePageId;
|
|
USHORT usageId;
|
|
} POINTER_DEVICE_PROPERTY;
|
|
|
|
typedef enum tagPOINTER_DEVICE_CURSOR_TYPE {
|
|
POINTER_DEVICE_CURSOR_TYPE_UNKNOWN = 0x00000000,
|
|
POINTER_DEVICE_CURSOR_TYPE_TIP = 0x00000001,
|
|
POINTER_DEVICE_CURSOR_TYPE_ERASER = 0x00000002,
|
|
POINTER_DEVICE_CURSOR_TYPE_MAX = 0xffffffff
|
|
} POINTER_DEVICE_CURSOR_TYPE;
|
|
|
|
typedef struct tagPOINTER_DEVICE_CURSOR_INFO {
|
|
UINT32 cursorId;
|
|
POINTER_DEVICE_CURSOR_TYPE cursor;
|
|
} POINTER_DEVICE_CURSOR_INFO;
|
|
|
|
#endif /* POINTER_FLAG_NONE */
|
|
|
|
#if WINVER < 0x0601
|
|
|
|
typedef struct tagGESTURECONFIG {
|
|
DWORD dwID;
|
|
DWORD dwWant;
|
|
DWORD dwBlock;
|
|
} GESTURECONFIG,*PGESTURECONFIG;
|
|
|
|
#endif /* WINVER < 0x0601 */
|
|
|
|
#ifndef MICROSOFT_TABLETPENSERVICE_PROPERTY
|
|
#define MICROSOFT_TABLETPENSERVICE_PROPERTY _T("MicrosoftTabletPenServiceProperty")
|
|
#endif
|