Rollback : Modify gesture driver code to use ET_Touch* events instead of using ET_But...
[platform/adaptation/xf86-input-gesture.git] / src / gesture.h
1 /**************************************************************************
2
3 xserver-xorg-input-gesture
4
5 Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
6
7 Contact: Sung-Jin Park <sj76.park@samsung.com>
8          Sangjin LEE <lsj119@samsung.com>
9
10 Permission is hereby granted, free of charge, to any person obtaining a
11 copy of this software and associated documentation files (the
12 "Software"), to deal in the Software without restriction, including
13 without limitation the rights to use, copy, modify, merge, publish,
14 distribute, sub license, and/or sell copies of the Software, and to
15 permit persons to whom the Software is furnished to do so, subject to
16 the following conditions:
17
18 The above copyright notice and this permission notice (including the
19 next paragraph) shall be included in all copies or substantial portions
20 of the Software.
21
22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
25 IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
26 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
27 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
28 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29
30 **************************************************************************/
31
32 #ifndef _GESTURE_H_
33 #define _GESTURE_H_
34
35 #include <xorg/events.h>
36 #include <xorg/gestureext.h>
37 #include <X11/extensions/gestureconst.h>
38 #include <pixman.h>
39
40 #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3
41 #define HAVE_PROPERTIES 1
42 #endif
43
44 #define SYSCALL(call) while (((call) == -1) && (errno == EINTR))
45 #define RootWindow(dev) dev->spriteInfo->sprite->spriteTrace[0]
46 #define CLIENT_BITS(id) ((id) & RESOURCE_CLIENT_MASK)
47 #define CLIENT_ID(id) ((int)(CLIENT_BITS(id) >> CLIENTOFFSET))
48
49 #define MAX_MT_DEVICES          3
50 #define GESTURE_EQ_SIZE 256
51
52 #define GESTURE_RECOGNIZER_ONOFF        "GESTURE_RECOGNIZER_ONOFF"
53
54 #define FINGER_WIDTH            10
55 #define FINGER_HEIGHT           10
56 #define FINGER_WIDTH_2T 20
57 #define FINGER_HEIGHT_2T        20
58 #define AREA_CENTER_X(extents)  ((extents)->x1 + (((extents)->x2-(extents)->x1)/2))
59 #define AREA_CENTER_Y(extents)  ((extents)->y1 + (((extents)->y2-(extents)->y1)/2))
60 #define AREA_SIZE(extents)              (ABS((extents)->x2-(extents)->x1)*ABS((extents)->y2-(extents)->y1))
61 #define INBOX(r,x,y)                            ( ((r)->x2 >  x) && ((r)->x1 <= x) && ((r)->y2 >  y) && ((r)->y1 <= y) )
62 #define AREA_HEIGHT(extents)    (((extents)->y2)-((extents)->y1))
63 #define AREA_WIDTH(extents)     (((extents)->x2)-((extents)->x1))
64 #define AREA_DIAG_LEN(extents)  sqrt((AREA_WIDTH(extents)*AREA_WIDTH(extents))+(AREA_HEIGHT(extents)*AREA_HEIGHT(extents)))
65
66 //tap
67 #define TAP_THRESHOLD                   100//in pixel
68 #define SINGLE_TAP_TIMEOUT              100//in msec
69 #define DOUBLE_TAP_TIMEOUT      250//in msec
70
71 //pinch rotation
72 #define ZOOM_THRESHOLD                  0.05f
73 #define ANGLE_THRESHOLD         0.1f
74
75 typedef int XFixed;
76 typedef double XDouble;
77 #define XDoubleToFixed(f)    ((XFixed) ((f) * 65536))
78 #define XFixedToDouble(f)    (((XDouble) (f)) / 65536)
79
80 #define MIN(x, y) (((x) < (y)) ? (x) : (y))
81 #define MAX(x, y) (((x) > (y)) ? (x) : (y))
82 #define ABS(x) (((x) < 0) ? -(x) : (x))
83
84 enum
85 {
86         FLICK_NORTHWARD = 0,
87         FLICK_NORTHEASTWARD,
88         FLICK_EASTWARD,
89         FLICK_SOUTHEASTWARD,
90         FLICK_SOUTHWARD,
91         FLICK_SOUTHWESTWARD,
92         FLICK_WESTWARD,
93         FLICK_NORTHWESTWARD
94 };
95
96 #define PAN_AREA_THRESHOLD                      10000//=100pixel * 100pixel
97 #define PAN_MOVE_THRESHOLD                      5//pixel
98 #define PAN_UPDATE_MOVE_THRESHOLD       3//pixel
99 #define PAN_TIME_THRESHOLD                      300//ms
100
101 #define PINCHROTATION_TIME_THRESHOLD            500//ms
102 #define PINCHROTATION_INIT_DIST_THRESHOLD       25.0f
103 #define PINCHROTATION_INIT_ANGLE_THRESHOLD      0.2f
104 #define PINCHROTATION_DIST_THRESHOLD            25.0f
105 #define PINCHROTATION_ANGLE_THRESHOLD           0.2f
106
107 #define HOLD_AREA_THRESHOLD                     2500//=50pixel * 50pixel
108 #define HOLD_MOVE_THRESHOLD                     10//pixel
109 #define HOLD_TIME_THRESHOLD                     500//ms
110
111 #define TAP_AREA_THRESHOLD                      10000//= 100pixel * 100pixel
112 #define TAP_MOVE_THRESHOLD                      70//pixel
113 #define SGL_TAP_TIME_THRESHOLD          200//ms
114 #define DBL_TAP_TIME_THRESHOLD          200//ms
115 #define MAX_TAP_REPEATS                         3
116
117 #define TAPNHOLD_AREA_THRESHOLD                 4900//= 70pixel * 70pixel
118 #define TAPNHOLD_MOVE_THRESHOLD                 50//pixel
119 #define TAPNHOLD_TAP_TIME_THRESHOLD             200//ms
120 #define TAPNHOLD_INTV_TIME_THRESHOLD            200//ms
121 #define TAPNHOLD_HOLD_TIME_THRESHOLD    500//ms
122
123 #define FLICK_AREA_THRESHOLD                    22500//=150pixel * 150pixel
124 #define FLICK_AREA_TIMEOUT                              700//ms
125 #define FLICK_MOVE_THRESHOLD                    100//pixel
126 #define FLICK_MOVE_TIMEOUT                              1000//ms
127
128 #define RAD_90DEG  M_PI_2
129 #define RAD_180DEG M_PI
130 #define RAD_270DEG (M_PI_2 * 3)
131 #define RAD_360DEG (M_PI * 2)
132 #define rad2degree(r) ((r) * 180/M_PI)
133
134 typedef enum _MTSyncType
135 {
136         MTOUCH_FRAME_SYNC_END,
137         MTOUCH_FRAME_SYNC_BEGIN
138 } MTSyncType;
139
140 typedef enum _EventHandleType
141 {
142         PROPAGATE_EVENTS,
143         KEEP_EVENTS,
144         IGNORE_EVENTS
145 } EventHandleType;
146
147 typedef enum _ErrorStatus
148 {
149         ERROR_NONE,
150         ERROR_ABNORMAL,
151         ERROR_INVALPTR,
152         ERROR_EQFULL,
153         ERROR_ALLOCFAIL
154 } ErrorStatus;
155
156 enum EventType
157 {
158     ET_KeyPress = 2,
159     ET_KeyRelease,
160     ET_ButtonPress,
161     ET_ButtonRelease,
162     ET_Motion,
163     /*
164     ...
165     */
166     ET_MTSync = 0x7E,
167     ET_Internal = 0xFF /* First byte */
168 };
169
170 struct _DeviceEvent {
171     unsigned char header; /**< Always ET_Internal */
172     enum EventType type;  /**< One of EventType */
173     int length;           /**< Length in bytes */
174     Time time;            /**< Time in ms */
175     int deviceid;         /**< Device to post this event for */
176     int sourceid;         /**< The physical source device */
177     union {
178         uint32_t button;  /**< Button number (also used in pointer emulating
179                                touch events) */
180         uint32_t key;     /**< Key code */
181     } detail;
182     uint32_t touchid;     /**< Touch ID (client_id) */
183     int16_t root_x;       /**< Pos relative to root window in integral data */
184     float root_x_frac;    /**< Pos relative to root window in frac part */
185     int16_t root_y;       /**< Pos relative to root window in integral part */
186     float root_y_frac;    /**< Pos relative to root window in frac part */
187     uint8_t buttons[(MAX_BUTTONS + 7) / 8];  /**< Button mask */
188     struct {
189         uint8_t mask[(MAX_VALUATORS + 7) / 8];/**< Valuator mask */
190         uint8_t mode[(MAX_VALUATORS + 7) / 8];/**< Valuator mode (Abs or Rel)*/
191         double data[MAX_VALUATORS];           /**< Valuator data */
192     } valuators;
193     struct {
194         uint32_t base;    /**< XKB base modifiers */
195         uint32_t latched; /**< XKB latched modifiers */
196         uint32_t locked;  /**< XKB locked modifiers */
197         uint32_t effective;/**< XKB effective modifiers */
198     } mods;
199     struct {
200         uint8_t base;    /**< XKB base group */
201         uint8_t latched; /**< XKB latched group */
202         uint8_t locked;  /**< XKB locked group */
203         uint8_t effective;/**< XKB effective group */
204     } group;
205     Window root;      /**< Root window of the event */
206     int corestate;    /**< Core key/button state BEFORE the event */
207     int key_repeat;   /**< Internally-generated key repeat event */
208     uint32_t flags;   /**< Flags to be copied into the generated event */
209 };
210
211 typedef struct _AnyEvent AnyEvent;
212 struct _AnyEvent
213 {
214     unsigned char header; /**< Always ET_Internal */
215     enum EventType type;  /**< One of EventType */
216     int length;           /**< Length in bytes */
217     Time time;            /**< Time in ms */
218     int deviceid;
219     MTSyncType sync;
220     int x;
221     int y;
222 };
223
224 union _InternalEvent {
225         struct {
226             unsigned char header; /**< Always ET_Internal */
227             enum EventType type;  /**< One of ET_* */
228             int length;           /**< Length in bytes */
229             Time time;            /**< Time in ms. */
230         } any;
231         AnyEvent any_event;
232         DeviceEvent device_event;
233 };
234
235 #define wUseDefault(w,field,def)        ((w)->optional ? (w)->optional->field : def)
236 #define wBoundingShape(w)       wUseDefault(w, boundingShape, NULL)
237 #define wInputShape(w)          wUseDefault(w, inputShape, NULL)
238 #define wBorderWidth(w)         ((int) (w)->borderWidth)
239
240 /* used as NULL-terminated list */
241 typedef struct _DevCursorNode {
242     CursorPtr                   cursor;
243     DeviceIntPtr                dev;
244     struct _DevCursorNode*      next;
245 } DevCursNodeRec, *DevCursNodePtr, *DevCursorList;
246
247 typedef struct _WindowOpt {
248     VisualID            visual;            /* default: same as parent */
249     CursorPtr           cursor;            /* default: window.cursorNone */
250     Colormap            colormap;          /* default: same as parent */
251     Mask                dontPropagateMask; /* default: window.dontPropagate */
252     Mask                otherEventMasks;   /* default: 0 */
253     struct _OtherClients *otherClients;    /* default: NULL */
254     struct _GrabRec     *passiveGrabs;     /* default: NULL */
255     PropertyPtr         userProps;         /* default: NULL */
256     unsigned long       backingBitPlanes;  /* default: ~0L */
257     unsigned long       backingPixel;      /* default: 0 */
258     RegionPtr           boundingShape;     /* default: NULL */
259     RegionPtr           clipShape;         /* default: NULL */
260     RegionPtr           inputShape;        /* default: NULL */
261     struct _OtherInputMasks *inputMasks;   /* default: NULL */
262     DevCursorList       deviceCursors;     /* default: NULL */
263 } WindowOptRec, *WindowOptPtr;
264
265 typedef struct _Window {
266     DrawableRec         drawable;
267     PrivateRec          *devPrivates;
268     WindowPtr           parent;         /* ancestor chain */
269     WindowPtr           nextSib;        /* next lower sibling */
270     WindowPtr           prevSib;        /* next higher sibling */
271     WindowPtr           firstChild;     /* top-most child */
272     WindowPtr           lastChild;      /* bottom-most child */
273     RegionRec           clipList;       /* clipping rectangle for output */
274     RegionRec           borderClip;     /* NotClippedByChildren + border */
275     union _Validate     *valdata;
276     RegionRec           winSize;
277     RegionRec           borderSize;
278     DDXPointRec         origin;         /* position relative to parent */
279     unsigned short      borderWidth;
280     unsigned short      deliverableEvents; /* all masks from all clients */
281     Mask                eventMask;      /* mask from the creating client */
282     PixUnion            background;
283     PixUnion            border;
284     pointer             backStorage;    /* null when BS disabled */
285     WindowOptPtr        optional;
286     unsigned            backgroundState:2; /* None, Relative, Pixel, Pixmap */
287     unsigned            borderIsPixel:1;
288     unsigned            cursorIsNone:1; /* else real cursor (might inherit) */
289     unsigned            backingStore:2;
290     unsigned            saveUnder:1;
291     unsigned            DIXsaveUnder:1;
292     unsigned            bitGravity:4;
293     unsigned            winGravity:4;
294     unsigned            overrideRedirect:1;
295     unsigned            visibility:2;
296     unsigned            mapped:1;
297     unsigned            realized:1;     /* ancestors are all mapped */
298     unsigned            viewable:1;     /* realized && InputOutput */
299     unsigned            dontPropagate:3;/* index into DontPropagateMasks */
300     unsigned            forcedBS:1;     /* system-supplied backingStore */
301     unsigned            redirectDraw:2; /* COMPOSITE rendering redirect */
302     unsigned            forcedBG:1;     /* must have an opaque background */
303 #ifdef ROOTLESS
304     unsigned            rootlessUnhittable:1;   /* doesn't hit-test */
305 #endif
306 } WindowRec;
307
308 typedef struct _IEvent {
309         InternalEvent *event;
310         int screen_num;
311         DeviceIntPtr device;
312 } IEventRec, *IEventPtr;
313
314 enum
315 {
316         BTN_RELEASED,
317         BTN_PRESSED,
318         BTN_MOVING
319 };
320
321 #define PressFlagFlick                  0x01//(1 << 0)
322 #define PressFlagPan                            0x02//(1 << 1)
323 #define PressFlagPinchRotation  0x04//(1 << 2)
324 #define PressFlagTap                            0x08//(1 << 3)
325 #define PressFlagTapNHold               0x10//(1 << 4)
326 #define PressFlagHold                   0x20//(1 << 5)
327
328 #define FlickFilterMask                 0x01//(1 << 0)
329 #define PanFilterMask                   0x02//(1 << 1)
330 #define PinchRotationFilterMask 0x04//(1 << 2)
331 #define TapFilterMask                   0x08//(1 << 3)
332 #define TapNHoldFilterMask              0x10//(1 << 4)
333 #define HoldFilterMask                  0x20//(1 << 5)
334
335 #define GESTURE_FILTER_MASK_ALL 0x3f//(FlickFilterMask | PanFilterMask | PinchRotationFilterMask | TapFilterMask |TapNHoldFilterMask | HoldFilterMask)
336
337 typedef struct _tagTouchStatus
338 {
339         int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
340         uint32_t flags;
341
342         int px;         //press x
343         int py;         //press y
344         int mx;         //motion x
345         int my;         //motion y
346         int rx;         //release x
347         int ry;         //release y
348         Time ptime;     //press time
349         Time mtime;     //motion time
350         Time rtime;     //current/previous release time
351 } TouchStatus;
352
353 typedef struct _GestureDeviceRec
354 {
355         char *device;
356         int version;        /* Driver version */
357         OsTimerPtr device_setting_timer;
358
359         int is_active;
360
361         WindowPtr pRootWin;
362         Window gestureWin;
363         int num_mt_devices;
364
365         Mask grabMask;
366         Mask eventMask;
367         GestureGrabEventPtr GrabEvents;
368         Mask lastSelectedMask;
369         Window lastSelectedWin;
370
371         EventHandleType ehtype;
372         IEventPtr       EQ;
373         int headEQ;
374         int tailEQ;
375
376         pixman_region16_t area;
377         pixman_region16_t finger_rects[MAX_MT_DEVICES];
378
379         WindowPtr pTempWin;
380         int inc_num_pressed;
381
382         int first_fingerid;
383         int num_pressed;
384         TouchStatus fingers[MAX_MT_DEVICES];
385
386         int event_sum[MAX_MT_DEVICES];
387         uint32_t recognized_gesture;
388         uint32_t filter_mask;
389
390         DeviceIntPtr this_device;
391         DeviceIntPtr mt_devices[MAX_MT_DEVICES];
392         DeviceIntPtr master_pointer;
393         DeviceIntPtr xtest_pointer;
394 } GestureDeviceRec, *GestureDevicePtr ;
395
396 #endif//_GESTURE_H_