1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 
5 #ifndef touchinjection_sdk80_h
6 #define touchinjection_sdk80_h
7 
8 #include <windows.h>
9 
10 // Note, this isn't inclusive of all touch injection header info.
11 // You may need to add more to expand on current apis.
12 
13 #ifndef TOUCH_FEEDBACK_DEFAULT
14 
15 #  define TOUCH_FEEDBACK_DEFAULT 0x1
16 #  define TOUCH_FEEDBACK_INDIRECT 0x2
17 #  define TOUCH_FEEDBACK_NONE 0x3
18 
19 enum POINTER_FEEDBACK_MODE {
20   POINTER_FEEDBACK_DEFAULT =
21       1,  // The injected pointer input feedback may get suppressed by the
22           // end-user settings in the Pen and Touch control panel.
23   POINTER_FEEDBACK_INDIRECT =
24       2,  // The injected pointer input feedback overrides the end-user settings
25           // in the Pen and Touch control panel.
26   POINTER_FEEDBACK_NONE = 3,  // No touch visualizations.
27 };
28 
29 enum {
30   PT_POINTER = 0x00000001,   // Generic pointer
31   PT_TOUCH = 0x00000002,     // Touch
32   PT_PEN = 0x00000003,       // Pen
33   PT_MOUSE = 0x00000004,     // Mouse
34   PT_TOUCHPAD = 0x00000005,  // Touch pad
35 };
36 
37 using POINTER_INPUT_TYPE = DWORD;
38 using POINTER_FLAGS = UINT32;
39 
40 enum POINTER_BUTTON_CHANGE_TYPE {
41   POINTER_CHANGE_NONE,
42   POINTER_CHANGE_FIRSTBUTTON_DOWN,
43   POINTER_CHANGE_FIRSTBUTTON_UP,
44   POINTER_CHANGE_SECONDBUTTON_DOWN,
45   POINTER_CHANGE_SECONDBUTTON_UP,
46   POINTER_CHANGE_THIRDBUTTON_DOWN,
47   POINTER_CHANGE_THIRDBUTTON_UP,
48   POINTER_CHANGE_FOURTHBUTTON_DOWN,
49   POINTER_CHANGE_FOURTHBUTTON_UP,
50   POINTER_CHANGE_FIFTHBUTTON_DOWN,
51   POINTER_CHANGE_FIFTHBUTTON_UP,
52 };
53 
54 struct POINTER_INFO {
55   POINTER_INPUT_TYPE pointerType;
56   UINT32 pointerId;
57   UINT32 frameId;
58   POINTER_FLAGS pointerFlags;
59   HANDLE sourceDevice;
60   HWND hwndTarget;
61   POINT ptPixelLocation;
62   POINT ptHimetricLocation;
63   POINT ptPixelLocationRaw;
64   POINT ptHimetricLocationRaw;
65   DWORD dwTime;
66   UINT32 historyCount;
67   INT32 InputData;
68   DWORD dwKeyStates;
69   UINT64 PerformanceCount;
70   POINTER_BUTTON_CHANGE_TYPE ButtonChangeType;
71 };
72 
73 using TOUCH_FLAGS = UINT32;
74 using TOUCH_MASK = UINT32;
75 
76 struct POINTER_TOUCH_INFO {
77   POINTER_INFO pointerInfo;
78   TOUCH_FLAGS touchFlags;
79   TOUCH_MASK touchMask;
80   RECT rcContact;
81   RECT rcContactRaw;
82   UINT32 orientation;
83   UINT32 pressure;
84 };
85 
86 #  define PEN_FLAG_NONE 0x00000000      // Default
87 #  define PEN_FLAG_BARREL 0x00000001    // The barrel button is pressed
88 #  define PEN_FLAG_INVERTED 0x00000002  // The pen is inverted
89 #  define PEN_FLAG_ERASER 0x00000004    // The eraser button is pressed
90 
91 #  define PEN_MASK_NONE \
92     0x00000000  // Default - none of the optional fields are valid
93 #  define PEN_MASK_PRESSURE 0x00000001  // The pressure field is valid
94 #  define PEN_MASK_ROTATION 0x00000002  // The rotation field is valid
95 #  define PEN_MASK_TILT_X 0x00000004    // The tiltX field is valid
96 #  define PEN_MASK_TILT_Y 0x00000008    // The tiltY field is valid
97 
98 using PEN_FLAGS = UINT32;
99 using PEN_MASK = UINT32;
100 
101 struct POINTER_PEN_INFO {
102   POINTER_INFO pointerInfo;
103   PEN_FLAGS penFlags;
104   PEN_MASK penMask;
105   UINT32 pressure;
106   UINT32 rotation;
107   INT32 tiltX;
108   INT32 tiltY;
109 };
110 
111 struct POINTER_TYPE_INFO {
112   POINTER_INPUT_TYPE type;
113   union {
114     POINTER_TOUCH_INFO touchInfo;
115     POINTER_PEN_INFO penInfo;
116   };
117 };
118 
119 #  define TOUCH_FLAG_NONE 0x00000000  // Default
120 
121 #  define TOUCH_MASK_NONE \
122     0x00000000  // Default - none of the optional fields are valid
123 #  define TOUCH_MASK_CONTACTAREA 0x00000001  // The rcContact field is valid
124 #  define TOUCH_MASK_ORIENTATION 0x00000002  // The orientation field is valid
125 #  define TOUCH_MASK_PRESSURE 0x00000004     // The pressure field is valid
126 
127 #  define POINTER_FLAG_NONE 0x00000000          // Default
128 #  define POINTER_FLAG_NEW 0x00000001           // New pointer
129 #  define POINTER_FLAG_INRANGE 0x00000002       // Pointer has not departed
130 #  define POINTER_FLAG_INCONTACT 0x00000004     // Pointer is in contact
131 #  define POINTER_FLAG_FIRSTBUTTON 0x00000010   // Primary action
132 #  define POINTER_FLAG_SECONDBUTTON 0x00000020  // Secondary action
133 #  define POINTER_FLAG_THIRDBUTTON 0x00000040   // Third button
134 #  define POINTER_FLAG_FOURTHBUTTON 0x00000080  // Fourth button
135 #  define POINTER_FLAG_FIFTHBUTTON 0x00000100   // Fifth button
136 #  define POINTER_FLAG_PRIMARY 0x00002000       // Pointer is primary
137 #  define POINTER_FLAG_CONFIDENCE \
138     0x00004000  // Pointer is considered unlikely to be accidental
139 #  define POINTER_FLAG_CANCELED \
140     0x00008000  // Pointer is departing in an abnormal manner
141 #  define POINTER_FLAG_DOWN \
142     0x00010000  // Pointer transitioned to down state (made contact)
143 #  define POINTER_FLAG_UPDATE 0x00020000  // Pointer update
144 #  define POINTER_FLAG_UP \
145     0x00040000  // Pointer transitioned from down state (broke contact)
146 #  define POINTER_FLAG_WHEEL 0x00080000           // Vertical wheel
147 #  define POINTER_FLAG_HWHEEL 0x00100000          // Horizontal wheel
148 #  define POINTER_FLAG_CAPTURECHANGED 0x00200000  // Lost capture
149 
150 #endif  // TOUCH_FEEDBACK_DEFAULT
151 
152 #define TOUCH_FLAGS_CONTACTUPDATE \
153   (POINTER_FLAG_UPDATE | POINTER_FLAG_INRANGE | POINTER_FLAG_INCONTACT)
154 #define TOUCH_FLAGS_CONTACTDOWN \
155   (POINTER_FLAG_DOWN | POINTER_FLAG_INRANGE | POINTER_FLAG_INCONTACT)
156 
157 using InitializeTouchInjectionPtr = BOOL(WINAPI*)(UINT32, DWORD);
158 using InjectTouchInputPtr = BOOL(WINAPI*)(UINT32, const POINTER_TOUCH_INFO*);
159 
160 #if !defined(NTDDI_WIN10_RS5) || (NTDDI_VERSION < NTDDI_WIN10_RS5)
161 #  define HSYNTHETICPOINTERDEVICE intptr_t
162 #endif  // NTDDI_VERSION < NTDDI_WIN10_RS5
163 
164 using CreateSyntheticPointerDevicePtr = HSYNTHETICPOINTERDEVICE(WINAPI*)(
165     POINTER_INPUT_TYPE, ULONG, POINTER_FEEDBACK_MODE);
166 using DestroySyntheticPointerDevicePtr = void(WINAPI*)(HSYNTHETICPOINTERDEVICE);
167 using InjectSyntheticPointerInputPtr = BOOL(WINAPI*)(HSYNTHETICPOINTERDEVICE,
168                                                      const POINTER_TYPE_INFO*,
169                                                      UINT32);
170 
171 #endif  // touchinjection_sdk80_h
172