tizen 2.3 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 } MTSyncType;
147
148 typedef enum _EventHandleType
149 {
150         PROPAGATE_EVENTS,
151         KEEP_EVENTS,
152         IGNORE_EVENTS
153 } EventHandleType;
154
155 typedef enum _ErrorStatus
156 {
157         ERROR_NONE,
158         ERROR_ABNORMAL,
159         ERROR_INVALPTR,
160         ERROR_EQFULL,
161         ERROR_ALLOCFAIL
162 } ErrorStatus;
163
164 enum EventType
165 {
166     ET_KeyPress = 2,
167     ET_KeyRelease,
168     ET_ButtonPress,
169     ET_ButtonRelease,
170     ET_Motion,
171     /*
172     ...
173     */
174     ET_MTSync = 0x7E,
175     ET_Internal = 0xFF /* First byte */
176 };
177
178 struct _DeviceEvent {
179     unsigned char header; /**< Always ET_Internal */
180     enum EventType type;  /**< One of EventType */
181     int length;           /**< Length in bytes */
182     Time time;            /**< Time in ms */
183     int deviceid;         /**< Device to post this event for */
184     int sourceid;         /**< The physical source device */
185     union {
186         uint32_t button;  /**< Button number (also used in pointer emulating
187                                touch events) */
188         uint32_t key;     /**< Key code */
189     } detail;
190     uint32_t touchid;     /**< Touch ID (client_id) */
191     int16_t root_x;       /**< Pos relative to root window in integral data */
192     float root_x_frac;    /**< Pos relative to root window in frac part */
193     int16_t root_y;       /**< Pos relative to root window in integral part */
194     float root_y_frac;    /**< Pos relative to root window in frac part */
195     uint8_t buttons[(MAX_BUTTONS + 7) / 8];  /**< Button mask */
196     struct {
197         uint8_t mask[(MAX_VALUATORS + 7) / 8];/**< Valuator mask */
198         uint8_t mode[(MAX_VALUATORS + 7) / 8];/**< Valuator mode (Abs or Rel)*/
199         double data[MAX_VALUATORS];           /**< Valuator data */
200     } valuators;
201     struct {
202         uint32_t base;    /**< XKB base modifiers */
203         uint32_t latched; /**< XKB latched modifiers */
204         uint32_t locked;  /**< XKB locked modifiers */
205         uint32_t effective;/**< XKB effective modifiers */
206     } mods;
207     struct {
208         uint8_t base;    /**< XKB base group */
209         uint8_t latched; /**< XKB latched group */
210         uint8_t locked;  /**< XKB locked group */
211         uint8_t effective;/**< XKB effective group */
212     } group;
213     Window root;      /**< Root window of the event */
214     int corestate;    /**< Core key/button state BEFORE the event */
215     int key_repeat;   /**< Internally-generated key repeat event */
216     uint32_t flags;   /**< Flags to be copied into the generated event */
217 };
218
219 typedef struct _AnyEvent AnyEvent;
220 struct _AnyEvent
221 {
222     unsigned char header; /**< Always ET_Internal */
223     enum EventType type;  /**< One of EventType */
224     int length;           /**< Length in bytes */
225     Time time;            /**< Time in ms */
226     int deviceid;
227     MTSyncType sync;
228     int x;
229     int y;
230 };
231
232 union _InternalEvent {
233         struct {
234             unsigned char header; /**< Always ET_Internal */
235             enum EventType type;  /**< One of ET_* */
236             int length;           /**< Length in bytes */
237             Time time;            /**< Time in ms. */
238         } any;
239         AnyEvent any_event;
240         DeviceEvent device_event;
241 };
242
243 #define wUseDefault(w,field,def)        ((w)->optional ? (w)->optional->field : def)
244 #define wBoundingShape(w)       wUseDefault(w, boundingShape, NULL)
245 #define wInputShape(w)          wUseDefault(w, inputShape, NULL)
246 #define wBorderWidth(w)         ((int) (w)->borderWidth)
247
248 /* used as NULL-terminated list */
249 typedef struct _DevCursorNode {
250     CursorPtr                   cursor;
251     DeviceIntPtr                dev;
252     struct _DevCursorNode*      next;
253 } DevCursNodeRec, *DevCursNodePtr, *DevCursorList;
254
255 typedef struct _WindowOpt {
256     VisualID            visual;            /* default: same as parent */
257     CursorPtr           cursor;            /* default: window.cursorNone */
258     Colormap            colormap;          /* default: same as parent */
259     Mask                dontPropagateMask; /* default: window.dontPropagate */
260     Mask                otherEventMasks;   /* default: 0 */
261     struct _OtherClients *otherClients;    /* default: NULL */
262     struct _GrabRec     *passiveGrabs;     /* default: NULL */
263     PropertyPtr         userProps;         /* default: NULL */
264     unsigned long       backingBitPlanes;  /* default: ~0L */
265     unsigned long       backingPixel;      /* default: 0 */
266     RegionPtr           boundingShape;     /* default: NULL */
267     RegionPtr           clipShape;         /* default: NULL */
268     RegionPtr           inputShape;        /* default: NULL */
269     struct _OtherInputMasks *inputMasks;   /* default: NULL */
270     DevCursorList       deviceCursors;     /* default: NULL */
271 } WindowOptRec, *WindowOptPtr;
272
273 typedef struct _Window {
274     DrawableRec         drawable;
275     PrivateRec          *devPrivates;
276     WindowPtr           parent;         /* ancestor chain */
277     WindowPtr           nextSib;        /* next lower sibling */
278     WindowPtr           prevSib;        /* next higher sibling */
279     WindowPtr           firstChild;     /* top-most child */
280     WindowPtr           lastChild;      /* bottom-most child */
281     RegionRec           clipList;       /* clipping rectangle for output */
282     RegionRec           borderClip;     /* NotClippedByChildren + border */
283     union _Validate     *valdata;
284     RegionRec           winSize;
285     RegionRec           borderSize;
286     DDXPointRec         origin;         /* position relative to parent */
287     unsigned short      borderWidth;
288     unsigned short      deliverableEvents; /* all masks from all clients */
289     Mask                eventMask;      /* mask from the creating client */
290     PixUnion            background;
291     PixUnion            border;
292     pointer             backStorage;    /* null when BS disabled */
293     WindowOptPtr        optional;
294     unsigned            backgroundState:2; /* None, Relative, Pixel, Pixmap */
295     unsigned            borderIsPixel:1;
296     unsigned            cursorIsNone:1; /* else real cursor (might inherit) */
297     unsigned            backingStore:2;
298     unsigned            saveUnder:1;
299     unsigned            DIXsaveUnder:1;
300     unsigned            bitGravity:4;
301     unsigned            winGravity:4;
302     unsigned            overrideRedirect:1;
303     unsigned            visibility:2;
304     unsigned            mapped:1;
305     unsigned            realized:1;     /* ancestors are all mapped */
306     unsigned            viewable:1;     /* realized && InputOutput */
307     unsigned            dontPropagate:3;/* index into DontPropagateMasks */
308     unsigned            forcedBS:1;     /* system-supplied backingStore */
309     unsigned            redirectDraw:2; /* COMPOSITE rendering redirect */
310     unsigned            forcedBG:1;     /* must have an opaque background */
311 #ifdef ROOTLESS
312     unsigned            rootlessUnhittable:1;   /* doesn't hit-test */
313 #endif
314 } WindowRec;
315
316 typedef struct _IEvent {
317         InternalEvent *event;
318         int screen_num;
319         DeviceIntPtr device;
320 } IEventRec, *IEventPtr;
321
322 enum
323 {
324         BTN_RELEASED,
325         BTN_PRESSED,
326         BTN_MOVING
327 };
328
329 #define PressFlagFlick                  0x01//(1 << 0)
330 #define PressFlagPan                            0x02//(1 << 1)
331 #define PressFlagPinchRotation  0x04//(1 << 2)
332 #define PressFlagTap                            0x08//(1 << 3)
333 #define PressFlagTapNHold               0x10//(1 << 4)
334 #define PressFlagHold                   0x20//(1 << 5)
335
336 #define FlickFilterMask                 0x01//(1 << 0)
337 #define PanFilterMask                   0x02//(1 << 1)
338 #define PinchRotationFilterMask 0x04//(1 << 2)
339 #define TapFilterMask                   0x08//(1 << 3)
340 #define TapNHoldFilterMask              0x10//(1 << 4)
341 #define HoldFilterMask                  0x20//(1 << 5)
342
343 #define GESTURE_FILTER_MASK_ALL 0x3f//(FlickFilterMask | PanFilterMask | PinchRotationFilterMask | TapFilterMask |TapNHoldFilterMask | HoldFilterMask)
344
345 #define WFlickFilterMask                                0x01//(1 << 0)
346 #define WTapFilterMask                          0x02//(1 << 1)
347 #define WHoldFilterMask                         0x04//(1 << 2)
348 #define WPalmFlickFilterMask                    0x08//(1 << 3)
349
350 #define GESTURE_WATCH_FILTER_MASK_ALL   0x07//(WFlickFilterMask | WTapFilterMask | WHoldFilterMask )
351
352 #define PALM_HOLD_TIME_THRESHOLD 150
353
354 typedef struct _tagTouchStatus
355 {
356         int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
357         uint32_t flags;
358
359         int px;         //press x
360         int py;         //press y
361         int mx;         //motion x
362         int my;         //motion y
363         int rx;         //release x
364         int ry;         //release y
365         Time ptime;     //press time
366         Time mtime;     //motion time
367         Time rtime;     //current/previous release time
368 } TouchStatus;
369
370 typedef struct _tagCurrentTouchStatus
371 {
372         int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
373         int cx;         //current x
374         int cy;         //current y
375 } CurTouchStatus;
376
377 typedef struct _tagPalmDrvStatus
378 {
379         int enabled;
380         int scrn_width;
381         int scrn_height;
382         unsigned int half_scrn_area_size;
383         int horiz_coord[PALM_HORIZ_ARRAY_COUNT];
384         int verti_coord[PALM_VERTI_ARRAY_COUNT];
385 } PalmMiscInfo, *PalmMiscInfoPtr;
386
387
388 typedef struct _GestureDeviceRec
389 {
390         char *device;
391         int version;        /* Driver version */
392         OsTimerPtr device_setting_timer;
393
394         int is_active;
395         int power_pressed;
396         int flick_pressed_point;
397         int flick_direction;
398
399         int hwkeycode_flick_down;
400         int hwkeycode_flick_up;
401         int shutdown_keycode;
402         int flick_press_area;
403         int flick_press_area_left;
404         int flick_press_area_left_right;
405         int flick_minimum_height;
406         int activate_flick_down;//up to down
407         int activate_flick_up;//down to up
408         int activate_flick_right;//left to right
409         int screen_width;
410         int screen_height;
411
412         int singletap_threshold;
413         int doubletap_threshold;
414         int tripletap_threshold;
415
416         int num_tap_repeated;
417
418         double hold_area_threshold;
419         int hold_move_threshold;
420         int hold_time_threshold;
421
422         int palm_flick_time_threshold;
423         int palm_flick_max_tmajor_threshold;
424         int palm_flick_min_tmajor_threshold;
425         char *factory_cmdname;
426
427         int max_mt_tmajor[MAX_MT_DEVICES];
428
429         int hwkey_id;
430         char *hwkey_name;
431         DeviceIntPtr hwkey_dev;
432         MTSyncType mtsync_status;
433         int mtsync_total_count;
434
435         DeviceIntPtr power_device;
436
437         WindowPtr pRootWin;
438         Window gestureWin;
439         int num_mt_devices;
440
441         Mask grabMask;
442         Mask eventMask;
443         GestureGrabEventPtr GrabEvents;
444         Mask lastSelectedMask;
445         Window lastSelectedWin;
446
447         EventHandleType ehtype;
448         IEventPtr       EQ;
449         int headEQ;
450         int tailEQ;
451
452         int hold_detector_activate;
453         int has_hold_grabmask;
454         pixman_region16_t chold_area;
455         CurTouchStatus cts[MAX_MT_DEVICES];
456         Bool hold_detected;
457
458         PalmMiscInfo palm_misc;
459         int tmajor_idx;
460         int tminor_idx;
461         int tpalm_idx;
462         int mt_px_idx;
463         int mt_py_idx;
464
465         pixman_region16_t area;
466         pixman_region16_t finger_rects[MAX_MT_DEVICES];
467
468         WindowPtr pTempWin;
469         int inc_num_pressed;
470
471         int first_fingerid;
472         int num_pressed;
473         TouchStatus fingers[MAX_MT_DEVICES];
474
475         int event_sum[MAX_MT_DEVICES];
476         uint32_t recognized_gesture;
477         uint32_t filter_mask;
478
479         DeviceIntPtr this_device;
480         DeviceIntPtr mt_devices[MAX_MT_DEVICES];
481         DeviceIntPtr master_pointer;
482         DeviceIntPtr xtest_pointer;
483
484         WindowPtr anr_window;
485 } GestureDeviceRec, *GestureDevicePtr ;
486
487 #endif//_GESTURE_H_