tizen 2.3.1 release
[adaptation/xorg/driver/xserver-xorg-input-gesture.git] / wearable / 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 /**
45  * If there's touch event in pointed window and there's no reponse, we just assume that client looks like deadlock.
46  * In this case, we will make a popup window and terminate application.
47  * To support this feature, we use SUPPORT_ANR_WITH_INPUT_EVENT flag.
48  */
49 #define SUPPORT_ANR_WITH_INPUT_EVENT
50
51 #define GESTURE_RECOGNIZER_ONOFF        "GESTURE_RECOGNIZER_ONOFF"
52 #define GESTURE_PALM_REJECTION_MODE     "GESTURE_PALM_REJECTION_MODE"
53 #define CHECK_APPLICATION_NOT_RESPONSE_IN_INPUT_EVENT "_CHECK_APPLICATION_NOT_RESPONSE_IN_INPUT_EVENT_"
54 #define ANR_EVENT_WINDOW "_ANR_EVENT_WINDOW_"
55
56
57 #define SYSCALL(call) while (((call) == -1) && (errno == EINTR))
58 #define RootWindow(dev) dev->spriteInfo->sprite->spriteTrace[0]
59 #define CLIENT_BITS(id) ((id) & RESOURCE_CLIENT_MASK)
60 #define CLIENT_ID(id) ((int)(CLIENT_BITS(id) >> CLIENTOFFSET))
61
62 #define MAX_MT_DEVICES          2
63 #define GESTURE_EQ_SIZE 256
64
65 #define GESTURE_RECOGNIZER_ONOFF        "GESTURE_RECOGNIZER_ONOFF"
66
67 #define FINGER_WIDTH            10
68 #define FINGER_HEIGHT           10
69 #define FINGER_WIDTH_2T 20
70 #define FINGER_HEIGHT_2T        20
71 #define AREA_CENTER_X(extents)  ((extents)->x1 + (((extents)->x2-(extents)->x1)/2))
72 #define AREA_CENTER_Y(extents)  ((extents)->y1 + (((extents)->y2-(extents)->y1)/2))
73 #define AREA_SIZE(extents)              (ABS((extents)->x2-(extents)->x1)*ABS((extents)->y2-(extents)->y1))
74 #define INBOX(r,x,y)                            ( ((r)->x2 >  x) && ((r)->x1 <= x) && ((r)->y2 >  y) && ((r)->y1 <= y) )
75 #define AREA_HEIGHT(extents)    (((extents)->y2)-((extents)->y1))
76 #define AREA_WIDTH(extents)     (((extents)->x2)-((extents)->x1))
77 #define AREA_DIAG_LEN(extents)  sqrt((AREA_WIDTH(extents)*AREA_WIDTH(extents))+(AREA_HEIGHT(extents)*AREA_HEIGHT(extents)))
78
79 //tap
80 #define TAP_THRESHOLD                   100//in pixel
81 #define SINGLE_TAP_TIMEOUT              100//in msec
82 #define DOUBLE_TAP_TIMEOUT      250//in msec
83
84 //palm
85 #define PALM_HORIZ_ARRAY_COUNT 3
86 #define PALM_VERTI_ARRAY_COUNT 4
87
88 typedef int XFixed;
89 typedef double XDouble;
90 #define XDoubleToFixed(f)    ((XFixed) ((f) * 65536))
91 #define XFixedToDouble(f)    (((XDouble) (f)) / 65536)
92
93 #define MIN(x, y) (((x) < (y)) ? (x) : (y))
94 #define MAX(x, y) (((x) > (y)) ? (x) : (y))
95 #define ABS(x) (((x) < 0) ? -(x) : (x))
96
97 enum
98 {
99         FLICK_NORTHWARD = 0,
100         FLICK_NORTHEASTWARD,
101         FLICK_EASTWARD,
102         FLICK_SOUTHEASTWARD,
103         FLICK_SOUTHWARD,
104         FLICK_SOUTHWESTWARD,
105         FLICK_WESTWARD,
106         FLICK_NORTHWESTWARD
107 };
108
109 enum
110 {
111         FLICK_POINT_NONE = 0,
112         FLICK_POINT_UP,
113         FLICK_POINT_RIGHT,
114         FLICK_POINT_DOWN,
115         FLICK_POINT_LEFT,
116         FLICK_POINT_MAX
117 };
118
119 #define TAP_AREA_THRESHOLD                      10000//= 100pixel * 100pixel
120 #define TAP_MOVE_THRESHOLD                      35//pixel
121 #define SGL_TAP_TIME_THRESHOLD          300//ms
122 #define DBL_TAP_TIME_THRESHOLD          200//ms
123 #define MAX_TAP_REPEATS             3
124
125 #define FLICK_AREA_THRESHOLD                    22500//=150pixel * 150pixel
126 #define FLICK_AREA_TIMEOUT                              700//ms
127 #define FLICK_MOVE_THRESHOLD                    100//pixel
128 #define FLICK_MOVE_TIMEOUT                              1000//ms
129 #define FLICK_FALSE_Y_DIFF_COUNT                7
130 #define FLICK_FALSE_X_DIFF_COUNT                5
131
132 #define PALM_FLICK_DETECT_TIMEOUT                       1000//ms
133 #define PALM_FLICK_MAX_TOUCH_MAJOR              130
134
135 #define AXIS_LABEL_PROP_ABS_MT_TRACKING_ID "Abs MT Tracking ID"
136 #define AXIS_LABEL_PROP_ABS_MT_SLOT     "Abs MT Slot"
137 #define AXIS_LABEL_PROP_ABS_MT_TOUCH_MAJOR "Abs MT Touch Major"
138 #define AXIS_LABEL_PROP_ABS_MT_TOUCH_MINOR "Abs MT Touch Minor"
139 #define AXIS_LABEL_PROP_ABS_MT_PALM        "Abs MT Palm/MT Sumsize"
140
141 typedef enum _MTSyncType
142 {
143         MTOUCH_FRAME_SYNC_END,
144         MTOUCH_FRAME_SYNC_BEGIN,
145         MTOUCH_FRAME_SYNC_UPDATE,
146         ROTARY_FRAME_SYNC_END,
147         ROTARY_FRAME_SYNC_BEGIN
148 } MTSyncType;
149
150 typedef enum _EventHandleType
151 {
152         PROPAGATE_EVENTS,
153         KEEP_EVENTS,
154         IGNORE_EVENTS
155 } EventHandleType;
156
157 typedef enum _ErrorStatus
158 {
159         ERROR_NONE,
160         ERROR_ABNORMAL,
161         ERROR_INVALPTR,
162         ERROR_EQFULL,
163         ERROR_ALLOCFAIL
164 } ErrorStatus;
165
166 enum EventType
167 {
168     ET_KeyPress = 2,
169     ET_KeyRelease,
170     ET_ButtonPress,
171     ET_ButtonRelease,
172     ET_Motion,
173     /*
174     ...
175     */
176     ET_TouchCancel = 31,
177     ET_MTSync = 0x7E,
178     ET_Internal = 0xFF /* First byte */
179 };
180
181 struct _DeviceEvent {
182     unsigned char header; /**< Always ET_Internal */
183     enum EventType type;  /**< One of EventType */
184     int length;           /**< Length in bytes */
185     Time time;            /**< Time in ms */
186     int deviceid;         /**< Device to post this event for */
187     int sourceid;         /**< The physical source device */
188     union {
189         uint32_t button;  /**< Button number (also used in pointer emulating
190                                touch events) */
191         uint32_t key;     /**< Key code */
192     } detail;
193     uint32_t touchid;     /**< Touch ID (client_id) */
194     int16_t root_x;       /**< Pos relative to root window in integral data */
195     float root_x_frac;    /**< Pos relative to root window in frac part */
196     int16_t root_y;       /**< Pos relative to root window in integral part */
197     float root_y_frac;    /**< Pos relative to root window in frac part */
198     uint8_t buttons[(MAX_BUTTONS + 7) / 8];  /**< Button mask */
199     struct {
200         uint8_t mask[(MAX_VALUATORS + 7) / 8];/**< Valuator mask */
201         uint8_t mode[(MAX_VALUATORS + 7) / 8];/**< Valuator mode (Abs or Rel)*/
202         double data[MAX_VALUATORS];           /**< Valuator data */
203     } valuators;
204     struct {
205         uint32_t base;    /**< XKB base modifiers */
206         uint32_t latched; /**< XKB latched modifiers */
207         uint32_t locked;  /**< XKB locked modifiers */
208         uint32_t effective;/**< XKB effective modifiers */
209     } mods;
210     struct {
211         uint8_t base;    /**< XKB base group */
212         uint8_t latched; /**< XKB latched group */
213         uint8_t locked;  /**< XKB locked group */
214         uint8_t effective;/**< XKB effective group */
215     } group;
216     Window root;      /**< Root window of the event */
217     int corestate;    /**< Core key/button state BEFORE the event */
218     int key_repeat;   /**< Internally-generated key repeat event */
219     uint32_t flags;   /**< Flags to be copied into the generated event */
220 };
221
222 typedef struct _AnyEvent AnyEvent;
223 struct _AnyEvent
224 {
225     unsigned char header; /**< Always ET_Internal */
226     enum EventType type;  /**< One of EventType */
227     int length;           /**< Length in bytes */
228     Time time;            /**< Time in ms */
229     int deviceid;
230     MTSyncType sync;
231     int x;
232     int y;
233 };
234
235 typedef struct _TouchCancelEvent TouchCancelEvent;
236 struct _TouchCancelEvent {
237     unsigned char header; /**< Always ET_Internal */
238     enum EventType type;  /**< ET_TouchOwnership */
239     int length;           /**< Length in bytes */
240     Time time;            /**< Time in ms */
241     int deviceid;         /**< Device to post this event for */
242     int sourceid;         /**< The physical source device */
243     uint32_t resource;    /**< Provoking grab or event selection */
244     uint32_t flags;       /**< Flags to be copied into the generated event */
245 };
246
247
248
249 union _InternalEvent {
250         struct {
251             unsigned char header; /**< Always ET_Internal */
252             enum EventType type;  /**< One of ET_* */
253             int length;           /**< Length in bytes */
254             Time time;            /**< Time in ms. */
255         } any;
256         AnyEvent any_event;
257         DeviceEvent device_event;
258         TouchCancelEvent touch_cancel_event;
259 };
260
261 #define wUseDefault(w,field,def)        ((w)->optional ? (w)->optional->field : def)
262 #define wBoundingShape(w)       wUseDefault(w, boundingShape, NULL)
263 #define wInputShape(w)          wUseDefault(w, inputShape, NULL)
264 #define wBorderWidth(w)         ((int) (w)->borderWidth)
265
266 /* used as NULL-terminated list */
267 typedef struct _DevCursorNode {
268     CursorPtr                   cursor;
269     DeviceIntPtr                dev;
270     struct _DevCursorNode*      next;
271 } DevCursNodeRec, *DevCursNodePtr, *DevCursorList;
272
273 typedef struct _WindowOpt {
274     VisualID            visual;            /* default: same as parent */
275     CursorPtr           cursor;            /* default: window.cursorNone */
276     Colormap            colormap;          /* default: same as parent */
277     Mask                dontPropagateMask; /* default: window.dontPropagate */
278     Mask                otherEventMasks;   /* default: 0 */
279     struct _OtherClients *otherClients;    /* default: NULL */
280     struct _GrabRec     *passiveGrabs;     /* default: NULL */
281     PropertyPtr         userProps;         /* default: NULL */
282     unsigned long       backingBitPlanes;  /* default: ~0L */
283     unsigned long       backingPixel;      /* default: 0 */
284     RegionPtr           boundingShape;     /* default: NULL */
285     RegionPtr           clipShape;         /* default: NULL */
286     RegionPtr           inputShape;        /* default: NULL */
287     struct _OtherInputMasks *inputMasks;   /* default: NULL */
288     DevCursorList       deviceCursors;     /* default: NULL */
289 } WindowOptRec, *WindowOptPtr;
290
291 typedef struct _Window {
292     DrawableRec         drawable;
293     PrivateRec          *devPrivates;
294     WindowPtr           parent;         /* ancestor chain */
295     WindowPtr           nextSib;        /* next lower sibling */
296     WindowPtr           prevSib;        /* next higher sibling */
297     WindowPtr           firstChild;     /* top-most child */
298     WindowPtr           lastChild;      /* bottom-most child */
299     RegionRec           clipList;       /* clipping rectangle for output */
300     RegionRec           borderClip;     /* NotClippedByChildren + border */
301     union _Validate     *valdata;
302     RegionRec           winSize;
303     RegionRec           borderSize;
304     DDXPointRec         origin;         /* position relative to parent */
305     unsigned short      borderWidth;
306     unsigned short      deliverableEvents; /* all masks from all clients */
307     Mask                eventMask;      /* mask from the creating client */
308     PixUnion            background;
309     PixUnion            border;
310     pointer             backStorage;    /* null when BS disabled */
311     WindowOptPtr        optional;
312     unsigned            backgroundState:2; /* None, Relative, Pixel, Pixmap */
313     unsigned            borderIsPixel:1;
314     unsigned            cursorIsNone:1; /* else real cursor (might inherit) */
315     unsigned            backingStore:2;
316     unsigned            saveUnder:1;
317     unsigned            DIXsaveUnder:1;
318     unsigned            bitGravity:4;
319     unsigned            winGravity:4;
320     unsigned            overrideRedirect:1;
321     unsigned            visibility:2;
322     unsigned            mapped:1;
323     unsigned            realized:1;     /* ancestors are all mapped */
324     unsigned            viewable:1;     /* realized && InputOutput */
325     unsigned            dontPropagate:3;/* index into DontPropagateMasks */
326     unsigned            forcedBS:1;     /* system-supplied backingStore */
327     unsigned            redirectDraw:2; /* COMPOSITE rendering redirect */
328     unsigned            forcedBG:1;     /* must have an opaque background */
329 #ifdef ROOTLESS
330     unsigned            rootlessUnhittable:1;   /* doesn't hit-test */
331 #endif
332 } WindowRec;
333
334 typedef struct _IEvent {
335         InternalEvent *event;
336         int screen_num;
337         DeviceIntPtr device;
338 } IEventRec, *IEventPtr;
339
340 enum
341 {
342         BTN_RELEASED,
343         BTN_PRESSED,
344         BTN_MOVING
345 };
346
347 #define PressFlagFlick                  0x01//(1 << 0)
348 #define PressFlagPan                            0x02//(1 << 1)
349 #define PressFlagPinchRotation  0x04//(1 << 2)
350 #define PressFlagTap                            0x08//(1 << 3)
351 #define PressFlagTapNHold               0x10//(1 << 4)
352 #define PressFlagHold                   0x20//(1 << 5)
353
354 #define FlickFilterMask                 0x01//(1 << 0)
355 #define PanFilterMask                   0x02//(1 << 1)
356 #define PinchRotationFilterMask 0x04//(1 << 2)
357 #define TapFilterMask                   0x08//(1 << 3)
358 #define TapNHoldFilterMask              0x10//(1 << 4)
359 #define HoldFilterMask                  0x20//(1 << 5)
360
361 #define GESTURE_FILTER_MASK_ALL 0x3f//(FlickFilterMask | PanFilterMask | PinchRotationFilterMask | TapFilterMask |TapNHoldFilterMask | HoldFilterMask)
362
363 #define WFlickFilterMask                                0x01//(1 << 0)
364 #define WTapFilterMask                          0x02//(1 << 1)
365 #define WHoldFilterMask                         0x04//(1 << 2)
366 #define WPalmFlickFilterMask                    0x08//(1 << 3)
367
368 #define GESTURE_WATCH_FILTER_MASK_ALL   0x07//(WFlickFilterMask | WTapFilterMask | WHoldFilterMask )
369
370 #define MTSYNC_FLAG_TOUCH 0x01//(1 << 0)
371 #define MTSYNC_FLAG_ROTARY 0x02//(1 << 1)
372
373 #define PALM_HOLD_TIME_THRESHOLD 150
374
375 typedef struct _tagTouchStatus
376 {
377         int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
378         uint32_t flags;
379
380         int px;         //press x
381         int py;         //press y
382         int mx;         //motion x
383         int my;         //motion y
384         int rx;         //release x
385         int ry;         //release y
386         Time ptime;     //press time
387         Time mtime;     //motion time
388         Time rtime;     //current/previous release time
389 } TouchStatus;
390
391 typedef struct _tagCurrentTouchStatus
392 {
393         int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
394         int cx;         //current x
395         int cy;         //current y
396 } CurTouchStatus;
397
398 typedef struct _tagPalmDrvStatus
399 {
400         int enabled;
401         int scrn_width;
402         int scrn_height;
403         unsigned int half_scrn_area_size;
404         int horiz_coord[PALM_HORIZ_ARRAY_COUNT];
405         int verti_coord[PALM_VERTI_ARRAY_COUNT];
406 } PalmMiscInfo, *PalmMiscInfoPtr;
407
408
409 typedef struct _GestureDeviceRec
410 {
411         char *device;
412         int version;        /* Driver version */
413         OsTimerPtr device_setting_timer;
414
415         int is_active;
416         int power_pressed;
417         int flick_pressed_point;
418         int flick_direction;
419
420         int hwkeycode_flick_down;
421         int hwkeycode_flick_up;
422         int shutdown_keycode;
423         int flick_press_area;
424         int flick_press_area_left;
425         int flick_press_area_left_right;
426         int flick_minimum_height;
427         int activate_flick_down;//up to down
428         int activate_flick_up;//down to up
429         int activate_flick_right;//left to right
430         int screen_width;
431         int screen_height;
432
433         int singletap_threshold;
434         int doubletap_threshold;
435         int tripletap_threshold;
436
437         int num_tap_repeated;
438
439         double hold_area_threshold;
440         int hold_move_threshold;
441         int hold_time_threshold;
442
443         int palm_flick_time_threshold;
444         int palm_flick_max_tmajor_threshold;
445         int palm_flick_min_tmajor_threshold;
446         char *factory_cmdname;
447
448         int max_mt_tmajor[MAX_MT_DEVICES];
449
450         int hwkey_id;
451         char *hwkey_name;
452         DeviceIntPtr hwkey_dev;
453         int rotary_id;
454         DeviceIntPtr rotary_dev;
455         unsigned char mtsync_flag;
456         int mtsync_total_count;
457
458         DeviceIntPtr power_device;
459
460         WindowPtr pRootWin;
461         Window gestureWin;
462         int num_mt_devices;
463
464         Mask grabMask;
465         Mask eventMask;
466         GestureGrabEventPtr GrabEvents;
467         Mask lastSelectedMask;
468         Window lastSelectedWin;
469
470         EventHandleType ehtype;
471         IEventPtr       EQ;
472         int headEQ;
473         int tailEQ;
474
475         int hold_detector_activate;
476         int has_hold_grabmask;
477         pixman_region16_t chold_area;
478         CurTouchStatus cts[MAX_MT_DEVICES];
479         CurTouchStatus last_touches[MAX_MT_DEVICES];
480         Bool touch_cancel_status;
481         Bool hold_detected;
482
483         PalmMiscInfo palm_misc;
484         int tmajor_idx;
485         int tminor_idx;
486         int tpalm_idx;
487         int mt_px_idx;
488         int mt_py_idx;
489
490         pixman_region16_t area;
491         pixman_region16_t finger_rects[MAX_MT_DEVICES];
492
493         WindowPtr pTempWin;
494         int inc_num_pressed;
495
496         int first_fingerid;
497         int num_pressed;
498         TouchStatus fingers[MAX_MT_DEVICES];
499
500         int event_sum[MAX_MT_DEVICES];
501         uint32_t recognized_gesture;
502         uint32_t filter_mask;
503
504         DeviceIntPtr this_device;
505         DeviceIntPtr mt_devices[MAX_MT_DEVICES];
506         DeviceIntPtr master_pointer;
507         DeviceIntPtr xtest_pointer;
508
509         WindowPtr anr_window;
510 } GestureDeviceRec, *GestureDevicePtr ;
511
512 #endif//_GESTURE_H_