master
  1/**
  2 * This file has no copyright assigned and is placed in the Public Domain.
  3 * This file is part of the mingw-w64 runtime package.
  4 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
  5 */
  6
  7#ifndef INTERACTION_CONTEXT_H
  8#define INTERACTION_CONTEXT_H
  9
 10#include <winapifamily.h>
 11
 12#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
 13
 14#include <float.h>
 15#include <windows.h>
 16
 17#if defined(__cplusplus)
 18extern "C" {
 19#endif
 20
 21#if (NTDDI_VERSION >= NTDDI_WIN8)
 22
 23typedef enum INTERACTION_ID {
 24  INTERACTION_ID_NONE = 0x00000000,
 25  INTERACTION_ID_MANIPULATION = 0x00000001,
 26  INTERACTION_ID_TAP = 0x00000002,
 27  INTERACTION_ID_SECONDARY_TAP = 0x00000003,
 28  INTERACTION_ID_HOLD = 0x00000004,
 29  INTERACTION_ID_DRAG = 0x00000005,
 30  INTERACTION_ID_CROSS_SLIDE = 0x00000006,
 31  INTERACTION_ID_MAX = 0xffffffff
 32} INTERACTION_ID;
 33
 34typedef enum INTERACTION_FLAGS {
 35  INTERACTION_FLAG_NONE = 0x00000000,
 36  INTERACTION_FLAG_BEGIN = 0x00000001,
 37  INTERACTION_FLAG_END = 0x00000002,
 38  INTERACTION_FLAG_CANCEL = 0x00000004,
 39  INTERACTION_FLAG_INERTIA = 0x00000008,
 40  INTERACTION_FLAG_MAX = 0xffffffff
 41} INTERACTION_FLAGS;
 42
 43DEFINE_ENUM_FLAG_OPERATORS(INTERACTION_FLAGS);
 44
 45typedef enum INTERACTION_CONFIGURATION_FLAGS {
 46  INTERACTION_CONFIGURATION_FLAG_NONE = 0x00000000,
 47  INTERACTION_CONFIGURATION_FLAG_MANIPULATION = 0x00000001,
 48  INTERACTION_CONFIGURATION_FLAG_MANIPULATION_TRANSLATION_X = 0x00000002,
 49  INTERACTION_CONFIGURATION_FLAG_MANIPULATION_TRANSLATION_Y = 0x00000004,
 50  INTERACTION_CONFIGURATION_FLAG_MANIPULATION_ROTATION = 0x00000008,
 51  INTERACTION_CONFIGURATION_FLAG_MANIPULATION_SCALING = 0x00000010,
 52  INTERACTION_CONFIGURATION_FLAG_MANIPULATION_TRANSLATION_INERTIA = 0x00000020,
 53  INTERACTION_CONFIGURATION_FLAG_MANIPULATION_ROTATION_INERTIA = 0x00000040,
 54  INTERACTION_CONFIGURATION_FLAG_MANIPULATION_SCALING_INERTIA = 0x00000080,
 55  INTERACTION_CONFIGURATION_FLAG_MANIPULATION_RAILS_X = 0x00000100,
 56  INTERACTION_CONFIGURATION_FLAG_MANIPULATION_RAILS_Y = 0x00000200,
 57  INTERACTION_CONFIGURATION_FLAG_MANIPULATION_EXACT = 0x00000400,
 58  INTERACTION_CONFIGURATION_FLAG_MANIPULATION_MULTIPLE_FINGER_PANNING = 0x00000800,
 59  INTERACTION_CONFIGURATION_FLAG_CROSS_SLIDE = 0x00000001,
 60  INTERACTION_CONFIGURATION_FLAG_CROSS_SLIDE_HORIZONTAL = 0x00000002,
 61  INTERACTION_CONFIGURATION_FLAG_CROSS_SLIDE_SELECT = 0x00000004,
 62  INTERACTION_CONFIGURATION_FLAG_CROSS_SLIDE_SPEED_BUMP = 0x00000008,
 63  INTERACTION_CONFIGURATION_FLAG_CROSS_SLIDE_REARRANGE = 0x00000010,
 64  INTERACTION_CONFIGURATION_FLAG_CROSS_SLIDE_EXACT = 0x00000020,
 65  INTERACTION_CONFIGURATION_FLAG_TAP = 0x00000001,
 66  INTERACTION_CONFIGURATION_FLAG_TAP_DOUBLE = 0x00000002
 67#if (NTDDI_VERSION >= NTDDI_WIN10_VB)
 68  ,INTERACTION_CONFIGURATION_FLAG_TAP_MULTIPLE_FINGER = 0x00000004
 69#endif
 70  ,INTERACTION_CONFIGURATION_FLAG_SECONDARY_TAP = 0x00000001
 71  ,INTERACTION_CONFIGURATION_FLAG_HOLD = 0x00000001
 72  ,INTERACTION_CONFIGURATION_FLAG_HOLD_MOUSE = 0x00000002
 73#if (NTDDI_VERSION >= NTDDI_WIN10_VB)
 74  ,INTERACTION_CONFIGURATION_FLAG_HOLD_MULTIPLE_FINGER = 0x00000004
 75#endif
 76  ,INTERACTION_CONFIGURATION_FLAG_DRAG = 0x00000001
 77  ,INTERACTION_CONFIGURATION_FLAG_MAX = 0xffffffff
 78} INTERACTION_CONFIGURATION_FLAGS;
 79
 80DEFINE_ENUM_FLAG_OPERATORS(INTERACTION_CONFIGURATION_FLAGS);
 81
 82typedef enum INERTIA_PARAMETER {
 83  INERTIA_PARAMETER_TRANSLATION_DECELERATION = 0x00000001,
 84  INERTIA_PARAMETER_TRANSLATION_DISPLACEMENT = 0x00000002,
 85  INERTIA_PARAMETER_ROTATION_DECELERATION = 0x00000003,
 86  INERTIA_PARAMETER_ROTATION_ANGLE = 0x00000004,
 87  INERTIA_PARAMETER_EXPANSION_DECELERATION = 0x00000005,
 88  INERTIA_PARAMETER_EXPANSION_EXPANSION = 0x00000006,
 89  INERTIA_PARAMETER_MAX = 0xffffffff
 90} INERTIA_PARAMETER;
 91
 92typedef enum INTERACTION_STATE {
 93  INTERACTION_STATE_IDLE = 0x00000000,
 94  INTERACTION_STATE_IN_INTERACTION = 0x00000001,
 95  INTERACTION_STATE_POSSIBLE_DOUBLE_TAP = 0x00000002,
 96  INTERACTION_STATE_MAX = 0xffffffff
 97} INTERACTION_STATE;
 98
 99typedef enum INTERACTION_CONTEXT_PROPERTY {
100  INTERACTION_CONTEXT_PROPERTY_MEASUREMENT_UNITS = 0x00000001,
101  INTERACTION_CONTEXT_PROPERTY_INTERACTION_UI_FEEDBACK = 0x00000002,
102  INTERACTION_CONTEXT_PROPERTY_FILTER_POINTERS = 0x00000003,
103  INTERACTION_CONTEXT_PROPERTY_MAX = 0xffffffff
104} INTERACTION_CONTEXT_PROPERTY;
105
106typedef enum CROSS_SLIDE_THRESHOLD {
107  CROSS_SLIDE_THRESHOLD_SELECT_START = 0x00000000,
108  CROSS_SLIDE_THRESHOLD_SPEED_BUMP_START = 0x00000001,
109  CROSS_SLIDE_THRESHOLD_SPEED_BUMP_END = 0x00000002,
110  CROSS_SLIDE_THRESHOLD_REARRANGE_START = 0x00000003,
111  CROSS_SLIDE_THRESHOLD_COUNT = 0x00000004,
112  CROSS_SLIDE_THRESHOLD_MAX = 0xffffffff
113} CROSS_SLIDE_THRESHOLD;
114
115#define CROSS_SLIDE_THRESHOLD_INVALID_VALUE FLT_MAX
116
117typedef enum CROSS_SLIDE_FLAGS {
118  CROSS_SLIDE_FLAGS_NONE = 0x00000000,
119  CROSS_SLIDE_FLAGS_SELECT = 0x00000001,
120  CROSS_SLIDE_FLAGS_SPEED_BUMP = 0x00000002,
121  CROSS_SLIDE_FLAGS_REARRANGE = 0x00000004,
122  CROSS_SLIDE_FLAGS_MAX = 0xffffffff
123} CROSS_SLIDE_FLAGS;
124
125DEFINE_ENUM_FLAG_OPERATORS(CROSS_SLIDE_FLAGS);
126
127typedef enum MOUSE_WHEEL_PARAMETER {
128  MOUSE_WHEEL_PARAMETER_CHAR_TRANSLATION_X = 0x00000001,
129  MOUSE_WHEEL_PARAMETER_CHAR_TRANSLATION_Y = 0x00000002,
130  MOUSE_WHEEL_PARAMETER_DELTA_SCALE = 0x00000003,
131  MOUSE_WHEEL_PARAMETER_DELTA_ROTATION = 0x00000004,
132  MOUSE_WHEEL_PARAMETER_PAGE_TRANSLATION_X = 0x00000005,
133  MOUSE_WHEEL_PARAMETER_PAGE_TRANSLATION_Y = 0x00000006,
134  MOUSE_WHEEL_PARAMETER_MAX = 0xffffffff
135} MOUSE_WHEEL_PARAMETER;
136
137#if (NTDDI_VERSION >= NTDDI_WIN10_VB)
138typedef enum TAP_PARAMETER {
139  TAP_PARAMETER_MIN_CONTACT_COUNT = 0x00000000,
140  TAP_PARAMETER_MAX_CONTACT_COUNT = 0x00000001,
141  TAP_PARAMETER_MAX = 0xffffffff
142} TAP_PARAMETER;
143
144typedef enum HOLD_PARAMETER {
145  HOLD_PARAMETER_MIN_CONTACT_COUNT = 0x00000000,
146  HOLD_PARAMETER_MAX_CONTACT_COUNT = 0x00000001,
147  HOLD_PARAMETER_THRESHOLD_RADIUS = 0x00000002,
148  HOLD_PARAMETER_THRESHOLD_START_DELAY = 0x00000003,
149  HOLD_PARAMETER_MAX = 0xffffffff
150} HOLD_PARAMETER;
151
152typedef enum TRANSLATION_PARAMETER {
153  TRANSLATION_PARAMETER_MIN_CONTACT_COUNT = 0x00000000,
154  TRANSLATION_PARAMETER_MAX_CONTACT_COUNT = 0x00000001,
155  TRANSLATION_PARAMETER_MAX = 0xffffffff
156} TRANSLATION_PARAMETER;
157#endif
158
159typedef enum MANIPULATION_RAILS_STATE {
160  MANIPULATION_RAILS_STATE_UNDECIDED = 0x00000000,
161  MANIPULATION_RAILS_STATE_FREE = 0x00000001,
162  MANIPULATION_RAILS_STATE_RAILED = 0x00000002,
163  MANIPULATION_RAILS_STATE_MAX = 0xffffffff
164} MANIPULATION_RAILS_STATE;
165
166typedef struct MANIPULATION_TRANSFORM {
167  float translationX;
168  float translationY;
169  float scale;
170  float expansion;
171  float rotation;
172} MANIPULATION_TRANSFORM;
173
174typedef struct MANIPULATION_VELOCITY {
175  float velocityX;
176  float velocityY;
177  float velocityExpansion;
178  float velocityAngular;
179} MANIPULATION_VELOCITY;
180
181typedef struct INTERACTION_ARGUMENTS_MANIPULATION {
182  MANIPULATION_TRANSFORM delta;
183  MANIPULATION_TRANSFORM cumulative;
184  MANIPULATION_VELOCITY velocity;
185  MANIPULATION_RAILS_STATE railsState;
186} INTERACTION_ARGUMENTS_MANIPULATION;
187
188typedef struct INTERACTION_ARGUMENTS_TAP {
189  UINT32 count;
190} INTERACTION_ARGUMENTS_TAP;
191
192typedef struct INTERACTION_ARGUMENTS_CROSS_SLIDE {
193  CROSS_SLIDE_FLAGS flags;
194} INTERACTION_ARGUMENTS_CROSS_SLIDE;
195
196typedef struct INTERACTION_CONTEXT_OUTPUT {
197  INTERACTION_ID interactionId;
198  INTERACTION_FLAGS interactionFlags;
199  POINTER_INPUT_TYPE inputType;
200  float x;
201  float y;
202  union {
203    INTERACTION_ARGUMENTS_MANIPULATION manipulation;
204    INTERACTION_ARGUMENTS_TAP tap;
205    INTERACTION_ARGUMENTS_CROSS_SLIDE crossSlide;
206  } arguments;
207} INTERACTION_CONTEXT_OUTPUT;
208
209#if (NTDDI_VERSION >= NTDDI_WIN10_VB)
210typedef struct INTERACTION_CONTEXT_OUTPUT2 {
211  INTERACTION_ID interactionId;
212  INTERACTION_FLAGS interactionFlags;
213  POINTER_INPUT_TYPE inputType;
214  UINT32 contactCount;
215  UINT32 currentContactCount;
216  float x;
217  float y;
218  union {
219    INTERACTION_ARGUMENTS_MANIPULATION manipulation;
220    INTERACTION_ARGUMENTS_TAP tap;
221    INTERACTION_ARGUMENTS_CROSS_SLIDE crossSlide;
222  } arguments;
223} INTERACTION_CONTEXT_OUTPUT2;
224#endif
225
226typedef struct INTERACTION_CONTEXT_CONFIGURATION {
227  INTERACTION_ID interactionId;
228  INTERACTION_CONFIGURATION_FLAGS enable;
229} INTERACTION_CONTEXT_CONFIGURATION;
230
231typedef struct CROSS_SLIDE_PARAMETER {
232  CROSS_SLIDE_THRESHOLD threshold;
233  float distance;
234} CROSS_SLIDE_PARAMETER;
235
236typedef void(CALLBACK *INTERACTION_CONTEXT_OUTPUT_CALLBACK)(void *clientData, const INTERACTION_CONTEXT_OUTPUT *output);
237
238#if (NTDDI_VERSION >= NTDDI_WIN10_VB)
239typedef void(CALLBACK *INTERACTION_CONTEXT_OUTPUT_CALLBACK2)(void *clientData, const INTERACTION_CONTEXT_OUTPUT2 *output);
240#endif
241
242DECLARE_HANDLE(HINTERACTIONCONTEXT);
243
244#define INTERACTION_CONTEXT_CONFIGURATION_DEFAULT                         \
245{                                                                         \
246    {INTERACTION_ID_MANIPULATION,                                         \
247        INTERACTION_CONFIGURATION_FLAG_MANIPULATION |                     \
248        INTERACTION_CONFIGURATION_FLAG_MANIPULATION_TRANSLATION_X |       \
249        INTERACTION_CONFIGURATION_FLAG_MANIPULATION_TRANSLATION_Y |       \
250        INTERACTION_CONFIGURATION_FLAG_MANIPULATION_ROTATION |            \
251        INTERACTION_CONFIGURATION_FLAG_MANIPULATION_SCALING |             \
252        INTERACTION_CONFIGURATION_FLAG_MANIPULATION_TRANSLATION_INERTIA | \
253        INTERACTION_CONFIGURATION_FLAG_MANIPULATION_ROTATION_INERTIA |    \
254        INTERACTION_CONFIGURATION_FLAG_MANIPULATION_SCALING_INERTIA},     \
255    {INTERACTION_ID_TAP,                                                  \
256        INTERACTION_CONFIGURATION_FLAG_TAP},                              \
257    {INTERACTION_ID_SECONDARY_TAP,                                        \
258        INTERACTION_CONFIGURATION_FLAG_SECONDARY_TAP},                    \
259    {INTERACTION_ID_HOLD,                                                 \
260        INTERACTION_CONFIGURATION_FLAG_HOLD},                             \
261    {INTERACTION_ID_DRAG,                                                 \
262        INTERACTION_CONFIGURATION_FLAG_NONE},                             \
263    {INTERACTION_ID_CROSS_SLIDE,                                          \
264        INTERACTION_CONFIGURATION_FLAG_NONE}                              \
265}                                                                         \
266
267#define INERTIA_PARAMETER_INVALID_VALUE FLT_MAX
268
269HRESULT WINAPI CreateInteractionContext(HINTERACTIONCONTEXT *interactionContext);
270HRESULT WINAPI DestroyInteractionContext(HINTERACTIONCONTEXT interactionContext);
271HRESULT WINAPI RegisterOutputCallbackInteractionContext(HINTERACTIONCONTEXT interactionContext, INTERACTION_CONTEXT_OUTPUT_CALLBACK outputCallback, void *clientData);
272#if (NTDDI_VERSION >= NTDDI_WIN10_VB)
273HRESULT WINAPI RegisterOutputCallbackInteractionContext2(HINTERACTIONCONTEXT interactionContext, INTERACTION_CONTEXT_OUTPUT_CALLBACK2 outputCallback, void *clientData);
274#endif
275HRESULT WINAPI SetInteractionConfigurationInteractionContext(HINTERACTIONCONTEXT interactionContext, UINT32 configurationCount, const INTERACTION_CONTEXT_CONFIGURATION *configuration);
276HRESULT WINAPI GetInteractionConfigurationInteractionContext(HINTERACTIONCONTEXT interactionContext, UINT32 configurationCount, INTERACTION_CONTEXT_CONFIGURATION *configuration);
277HRESULT WINAPI SetPropertyInteractionContext(HINTERACTIONCONTEXT interactionContext, INTERACTION_CONTEXT_PROPERTY contextProperty, UINT32 value);
278HRESULT WINAPI GetPropertyInteractionContext(HINTERACTIONCONTEXT interactionContext, INTERACTION_CONTEXT_PROPERTY contextProperty, UINT32 *value);
279HRESULT WINAPI SetInertiaParameterInteractionContext(HINTERACTIONCONTEXT interactionContext, INERTIA_PARAMETER inertiaParameter, float value);
280HRESULT WINAPI GetInertiaParameterInteractionContext(HINTERACTIONCONTEXT interactionContext, INERTIA_PARAMETER inertiaParameter, float *value);
281HRESULT WINAPI SetCrossSlideParametersInteractionContext(HINTERACTIONCONTEXT interactionContext, UINT32 parameterCount, CROSS_SLIDE_PARAMETER *crossSlideParameters);
282HRESULT WINAPI GetCrossSlideParameterInteractionContext(HINTERACTIONCONTEXT interactionContext, CROSS_SLIDE_THRESHOLD threshold, float *distance);
283#if (NTDDI_VERSION >= NTDDI_WIN10_VB)
284HRESULT WINAPI SetTapParameterInteractionContext(HINTERACTIONCONTEXT interactionContext, TAP_PARAMETER parameter, float value);
285HRESULT WINAPI GetTapParameterInteractionContext(HINTERACTIONCONTEXT interactionContext, TAP_PARAMETER parameter, float *value);
286HRESULT WINAPI SetHoldParameterInteractionContext(HINTERACTIONCONTEXT interactionContext, HOLD_PARAMETER parameter, float value);
287HRESULT WINAPI GetHoldParameterInteractionContext(HINTERACTIONCONTEXT interactionContext, HOLD_PARAMETER parameter, float *value);
288HRESULT WINAPI SetTranslationParameterInteractionContext(HINTERACTIONCONTEXT interactionContext, TRANSLATION_PARAMETER parameter, float value);
289HRESULT WINAPI GetTranslationParameterInteractionContext(HINTERACTIONCONTEXT interactionContext, TRANSLATION_PARAMETER parameter, float *value);
290#endif
291HRESULT WINAPI SetMouseWheelParameterInteractionContext(HINTERACTIONCONTEXT interactionContext, MOUSE_WHEEL_PARAMETER parameter, float value);
292HRESULT WINAPI GetMouseWheelParameterInteractionContext(HINTERACTIONCONTEXT interactionContext, MOUSE_WHEEL_PARAMETER parameter, float *value);
293HRESULT WINAPI ResetInteractionContext(HINTERACTIONCONTEXT interactionContext);
294HRESULT WINAPI GetStateInteractionContext(HINTERACTIONCONTEXT interactionContext, const POINTER_INFO *pointerInfo, INTERACTION_STATE *state);
295HRESULT WINAPI AddPointerInteractionContext(HINTERACTIONCONTEXT interactionContext, UINT32 pointerId);
296HRESULT WINAPI RemovePointerInteractionContext(HINTERACTIONCONTEXT interactionContext, UINT32 pointerId);
297HRESULT WINAPI ProcessPointerFramesInteractionContext(HINTERACTIONCONTEXT interactionContext, UINT32 entriesCount, UINT32 pointerCount, const POINTER_INFO *pointerInfo);
298HRESULT WINAPI BufferPointerPacketsInteractionContext(HINTERACTIONCONTEXT interactionContext, UINT32 entriesCount, const POINTER_INFO *pointerInfo);
299HRESULT WINAPI ProcessBufferedPacketsInteractionContext(HINTERACTIONCONTEXT interactionContext);
300HRESULT WINAPI ProcessInertiaInteractionContext(HINTERACTIONCONTEXT interactionContext);
301HRESULT WINAPI StopInteractionContext(HINTERACTIONCONTEXT interactionContext);
302HRESULT WINAPI SetPivotInteractionContext(HINTERACTIONCONTEXT interactionContext, float x, float y, float radius);
303
304#endif /* (NTDDI_VERSION >= NTDDI_WIN8) */
305
306#if defined(__cplusplus)
307}
308#endif
309
310#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
311
312#endif /* INTERACTION_CONTEXT_H */