summaryrefslogtreecommitdiffstats
path: root/widget/windows/touchinjection_sdk80.h
blob: 7e9f5410d21f0046c55c1ced57a86372ff040184 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef touchinjection_sdk80_h
#define touchinjection_sdk80_h

#include <windows.h>

// Note, this isn't inclusive of all touch injection header info.
// You may need to add more to expand on current apis.

#ifndef TOUCH_FEEDBACK_DEFAULT

#  define TOUCH_FEEDBACK_DEFAULT 0x1
#  define TOUCH_FEEDBACK_INDIRECT 0x2
#  define TOUCH_FEEDBACK_NONE 0x3

enum POINTER_FEEDBACK_MODE {
  POINTER_FEEDBACK_DEFAULT =
      1,  // The injected pointer input feedback may get suppressed by the
          // end-user settings in the Pen and Touch control panel.
  POINTER_FEEDBACK_INDIRECT =
      2,  // The injected pointer input feedback overrides the end-user settings
          // in the Pen and Touch control panel.
  POINTER_FEEDBACK_NONE = 3,  // No touch visualizations.
};

enum {
  PT_POINTER = 0x00000001,   // Generic pointer
  PT_TOUCH = 0x00000002,     // Touch
  PT_PEN = 0x00000003,       // Pen
  PT_MOUSE = 0x00000004,     // Mouse
  PT_TOUCHPAD = 0x00000005,  // Touch pad
};

using POINTER_INPUT_TYPE = DWORD;
using POINTER_FLAGS = UINT32;

enum POINTER_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,
};

struct POINTER_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;
};

using TOUCH_FLAGS = UINT32;
using TOUCH_MASK = UINT32;

struct POINTER_TOUCH_INFO {
  POINTER_INFO pointerInfo;
  TOUCH_FLAGS touchFlags;
  TOUCH_MASK touchMask;
  RECT rcContact;
  RECT rcContactRaw;
  UINT32 orientation;
  UINT32 pressure;
};

#  define PEN_FLAG_NONE 0x00000000      // Default
#  define PEN_FLAG_BARREL 0x00000001    // The barrel button is pressed
#  define PEN_FLAG_INVERTED 0x00000002  // The pen is inverted
#  define PEN_FLAG_ERASER 0x00000004    // The eraser button is pressed

#  define PEN_MASK_NONE \
    0x00000000  // Default - none of the optional fields are valid
#  define PEN_MASK_PRESSURE 0x00000001  // The pressure field is valid
#  define PEN_MASK_ROTATION 0x00000002  // The rotation field is valid
#  define PEN_MASK_TILT_X 0x00000004    // The tiltX field is valid
#  define PEN_MASK_TILT_Y 0x00000008    // The tiltY field is valid

using PEN_FLAGS = UINT32;
using PEN_MASK = UINT32;

struct POINTER_PEN_INFO {
  POINTER_INFO pointerInfo;
  PEN_FLAGS penFlags;
  PEN_MASK penMask;
  UINT32 pressure;
  UINT32 rotation;
  INT32 tiltX;
  INT32 tiltY;
};

struct POINTER_TYPE_INFO {
  POINTER_INPUT_TYPE type;
  union {
    POINTER_TOUCH_INFO touchInfo;
    POINTER_PEN_INFO penInfo;
  };
};

#  define TOUCH_FLAG_NONE 0x00000000  // Default

#  define TOUCH_MASK_NONE \
    0x00000000  // Default - none of the optional fields are valid
#  define TOUCH_MASK_CONTACTAREA 0x00000001  // The rcContact field is valid
#  define TOUCH_MASK_ORIENTATION 0x00000002  // The orientation field is valid
#  define TOUCH_MASK_PRESSURE 0x00000004     // The pressure field is valid

#  define POINTER_FLAG_NONE 0x00000000          // Default
#  define POINTER_FLAG_NEW 0x00000001           // New pointer
#  define POINTER_FLAG_INRANGE 0x00000002       // Pointer has not departed
#  define POINTER_FLAG_INCONTACT 0x00000004     // Pointer is in contact
#  define POINTER_FLAG_FIRSTBUTTON 0x00000010   // Primary action
#  define POINTER_FLAG_SECONDBUTTON 0x00000020  // Secondary action
#  define POINTER_FLAG_THIRDBUTTON 0x00000040   // Third button
#  define POINTER_FLAG_FOURTHBUTTON 0x00000080  // Fourth button
#  define POINTER_FLAG_FIFTHBUTTON 0x00000100   // Fifth button
#  define POINTER_FLAG_PRIMARY 0x00002000       // Pointer is primary
#  define POINTER_FLAG_CONFIDENCE \
    0x00004000  // Pointer is considered unlikely to be accidental
#  define POINTER_FLAG_CANCELED \
    0x00008000  // Pointer is departing in an abnormal manner
#  define POINTER_FLAG_DOWN \
    0x00010000  // Pointer transitioned to down state (made contact)
#  define POINTER_FLAG_UPDATE 0x00020000  // Pointer update
#  define POINTER_FLAG_UP \
    0x00040000  // Pointer transitioned from down state (broke contact)
#  define POINTER_FLAG_WHEEL 0x00080000           // Vertical wheel
#  define POINTER_FLAG_HWHEEL 0x00100000          // Horizontal wheel
#  define POINTER_FLAG_CAPTURECHANGED 0x00200000  // Lost capture

#endif  // TOUCH_FEEDBACK_DEFAULT

#define TOUCH_FLAGS_CONTACTUPDATE \
  (POINTER_FLAG_UPDATE | POINTER_FLAG_INRANGE | POINTER_FLAG_INCONTACT)
#define TOUCH_FLAGS_CONTACTDOWN \
  (POINTER_FLAG_DOWN | POINTER_FLAG_INRANGE | POINTER_FLAG_INCONTACT)

using InitializeTouchInjectionPtr = BOOL(WINAPI*)(UINT32, DWORD);
using InjectTouchInputPtr = BOOL(WINAPI*)(UINT32, const POINTER_TOUCH_INFO*);

#if !defined(NTDDI_WIN10_RS5) || (NTDDI_VERSION < NTDDI_WIN10_RS5)
#  define HSYNTHETICPOINTERDEVICE intptr_t
#endif  // NTDDI_VERSION < NTDDI_WIN10_RS5

using CreateSyntheticPointerDevicePtr = HSYNTHETICPOINTERDEVICE(WINAPI*)(
    POINTER_INPUT_TYPE, ULONG, POINTER_FEEDBACK_MODE);
using DestroySyntheticPointerDevicePtr = void(WINAPI*)(HSYNTHETICPOINTERDEVICE);
using InjectSyntheticPointerInputPtr = BOOL(WINAPI*)(HSYNTHETICPOINTERDEVICE,
                                                     const POINTER_TYPE_INFO*,
                                                     UINT32);

#endif  // touchinjection_sdk80_h