tizen 2.4 release
[adaptation/xorg/driver/xserver-xorg-input-gesture.git] / mobile / 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 #ifndef ABS_CNT
45 #define ABS_CNT (ABS_MAX+1)
46 #endif
47
48 #ifdef ENABLE_TTRACE
49 #include <ttrace.h>
50
51 #define TTRACE_BEGIN(NAME) traceBegin(TTRACE_TAG_INPUT, NAME)
52 #define TTRACE_END() traceEnd(TTRACE_TAG_INPUT)
53 #else //ENABLE_TTRACE
54 #define TTRACE_BEGIN(NAME)
55 #define TTRACE_END()
56 #endif //ENABLE_TTRACE
57
58 /**
59  * If there's touch event in pointed window and there's no reponse, we just assume that client looks like deadlock.
60  * In this case, we will make a popup window and terminate application.
61  * To support this feature, we use SUPPORT_ANR_WITH_INPUT_EVENT flag.
62  */
63 #define SUPPORT_ANR_WITH_INPUT_EVENT
64
65 #define NUM_PASSKEYS    20
66
67 #define SYSCALL(call) while (((call) == -1) && (errno == EINTR))
68 #define RootWindow(dev) dev->spriteInfo->sprite->spriteTrace[0]
69 #define CLIENT_BITS(id) ((id) & RESOURCE_CLIENT_MASK)
70 #define CLIENT_ID(id) ((int)(CLIENT_BITS(id) >> CLIENTOFFSET))
71
72 #define MAX_MT_DEVICES          10
73 #define GESTURE_EQ_SIZE 256
74
75 #define GESTURE_RECOGNIZER_ONOFF        "GESTURE_RECOGNIZER_ONOFF"
76 #define GESTURE_PALM_REJECTION_MODE     "GESTURE_PALM_REJECTION_MODE"
77 #define CHECK_APPLICATION_NOT_RESPONSE_IN_INPUT_EVENT "_CHECK_APPLICATION_NOT_RESPONSE_IN_INPUT_EVENT_"
78 #define ANR_EVENT_WINDOW "_ANR_EVENT_WINDOW_"
79 #define GESTURE_WINDOW_STACK_CHANGED "GESTURE_WINDOW_STACK_CHANGED"
80
81 #define FINGER_WIDTH            10
82 #define FINGER_HEIGHT           10
83 #define FINGER_WIDTH_2T 20
84 #define FINGER_HEIGHT_2T        20
85 #define AREA_CENTER_X(extents)  ((extents)->x1 + (((extents)->x2-(extents)->x1)/2))
86 #define AREA_CENTER_Y(extents)  ((extents)->y1 + (((extents)->y2-(extents)->y1)/2))
87 #define AREA_SIZE(extents)              (ABS((extents)->x2-(extents)->x1)*ABS((extents)->y2-(extents)->y1))
88 #define INBOX(r,x,y)                            ( ((r)->x2 >  x) && ((r)->x1 <= x) && ((r)->y2 >  y) && ((r)->y1 <= y) )
89 #define AREA_HEIGHT(extents)    (((extents)->y2)-((extents)->y1))
90 #define AREA_WIDTH(extents)     (((extents)->x2)-((extents)->x1))
91 #define AREA_DIAG_LEN(extents)  sqrt((AREA_WIDTH(extents)*AREA_WIDTH(extents))+(AREA_HEIGHT(extents)*AREA_HEIGHT(extents)))
92
93 //tap
94 #define TAP_THRESHOLD                   100//in pixel
95 #define SINGLE_TAP_TIMEOUT              100//in msec
96 #define DOUBLE_TAP_TIMEOUT      250//in msec
97
98 //pinch rotation
99 #define ZOOM_THRESHOLD                  0.05f
100 #define ANGLE_THRESHOLD         0.1f
101
102 typedef int XFixed;
103 typedef double XDouble;
104 #define XDoubleToFixed(f)    ((XFixed) ((f) * 65536))
105 #define XFixedToDouble(f)    (((XDouble) (f)) / 65536)
106
107 #define MIN(x, y) (((x) < (y)) ? (x) : (y))
108 #define MAX(x, y) (((x) > (y)) ? (x) : (y))
109 #define ABS(x) (((x) < 0) ? -(x) : (x))
110
111 enum
112 {
113         FLICK_NORTHWARD = 0,
114         FLICK_NORTHEASTWARD,
115         FLICK_EASTWARD,
116         FLICK_SOUTHEASTWARD,
117         FLICK_SOUTHWARD,
118         FLICK_SOUTHWESTWARD,
119         FLICK_WESTWARD,
120         FLICK_NORTHWESTWARD
121 };
122
123 /* Gesture query devices infomation and register handlers
124   * if a device_control function is called using DEVICE_READY */
125 #define DEVICE_READY 11
126
127 #define SCREEN_WIDTH                            720
128 #define SCREEN_HEIGHT                           1280
129
130 #define PAN_AREA_THRESHOLD                      10000//=100pixel * 100pixel
131 #define PAN_MOVE_THRESHOLD                      5//pixel
132 #define PAN_UPDATE_MOVE_THRESHOLD       3//pixel
133 #define PAN_TIME_THRESHOLD                      300//ms
134
135 #define PINCHROTATION_TIME_THRESHOLD            500//ms
136 #define PINCHROTATION_INIT_DIST_THRESHOLD       25.0f
137 #define PINCHROTATION_INIT_ANGLE_THRESHOLD      0.2f
138 #define PINCHROTATION_DIST_THRESHOLD            25.0f
139 #define PINCHROTATION_ANGLE_THRESHOLD           0.2f
140
141 #define HOLD_AREA_THRESHOLD                     2500//=50pixel * 50pixel
142 #define HOLD_MOVE_THRESHOLD                     10//pixel
143 #define HOLD_TIME_THRESHOLD                     500//ms
144
145 #define TAP_AREA_THRESHOLD                      30000//= 300pixel * 100pixel
146 #define TAP_MOVE_THRESHOLD                      300//pixel
147 #define SGL_FINGER_TIME_THRESHOLD       50//ms
148 #define SGL_TAP_TIME_THRESHOLD          200//ms
149 #define DBL_TAP_TIME_THRESHOLD          400//ms
150 #define MAX_TAP_REPEATS                         2
151
152 #define TAPNHOLD_AREA_THRESHOLD                 4900//= 70pixel * 70pixel
153 #define TAPNHOLD_MOVE_THRESHOLD                 50//pixel
154 #define TAPNHOLD_TAP_TIME_THRESHOLD             200//ms
155 #define TAPNHOLD_INTV_TIME_THRESHOLD            200//ms
156 #define TAPNHOLD_HOLD_TIME_THRESHOLD    500//ms
157
158 #define FLICK_AREA_THRESHOLD                    22500//=150pixel * 150pixel
159 #define FLICK_AREA_TIMEOUT                              700//ms
160 #define FLICK_MOVE_THRESHOLD                    100//pixel
161 #define FLICK_MOVE_TIMEOUT                              1000//ms
162
163 #define RAD_90DEG  M_PI_2
164 #define RAD_180DEG M_PI
165 #define RAD_270DEG (M_PI_2 * 3)
166 #define RAD_360DEG (M_PI * 2)
167 #define MIN_RAD (RAD_90DEG / 4)
168 #define MAX_RAD ((RAD_90DEG / 4) * 3)
169 #define RAD_180DEG_MIN (RAD_90DEG + MIN_RAD)
170 #define RAD_180DEG_MAX (RAD_90DEG + MAX_RAD)
171
172 #define rad2degree(r) ((r) * 180/M_PI)
173
174 #define AXIS_LABEL_PROP_ABS_X           "Abs X"
175 #define AXIS_LABEL_PROP_ABS_Y           "Abs Y"
176 #define AXIS_LABEL_PROP_ABS_Z           "Abs Z"
177 #define AXIS_LABEL_PROP_ABS_RX          "Abs Rotary X"
178 #define AXIS_LABEL_PROP_ABS_RY          "Abs Rotary Y"
179 #define AXIS_LABEL_PROP_ABS_RZ          "Abs Rotary Z"
180 #define AXIS_LABEL_PROP_ABS_THROTTLE    "Abs Throttle"
181 #define AXIS_LABEL_PROP_ABS_RUDDER      "Abs Rudder"
182 #define AXIS_LABEL_PROP_ABS_WHEEL       "Abs Wheel"
183 #define AXIS_LABEL_PROP_ABS_GAS         "Abs Gas"
184 #define AXIS_LABEL_PROP_ABS_BRAKE       "Abs Brake"
185 #define AXIS_LABEL_PROP_ABS_HAT0X       "Abs Hat 0 X"
186 #define AXIS_LABEL_PROP_ABS_HAT0Y       "Abs Hat 0 Y"
187 #define AXIS_LABEL_PROP_ABS_HAT1X       "Abs Hat 1 X"
188 #define AXIS_LABEL_PROP_ABS_HAT1Y       "Abs Hat 1 Y"
189 #define AXIS_LABEL_PROP_ABS_HAT2X       "Abs Hat 2 X"
190 #define AXIS_LABEL_PROP_ABS_HAT2Y       "Abs Hat 2 Y"
191 #define AXIS_LABEL_PROP_ABS_HAT3X       "Abs Hat 3 X"
192 #define AXIS_LABEL_PROP_ABS_HAT3Y       "Abs Hat 3 Y"
193 #define AXIS_LABEL_PROP_ABS_PRESSURE    "Abs Pressure"
194 #define AXIS_LABEL_PROP_ABS_DISTANCE    "Abs Distance"
195 #define AXIS_LABEL_PROP_ABS_TILT_X      "Abs Tilt X"
196 #define AXIS_LABEL_PROP_ABS_TILT_Y      "Abs Tilt Y"
197 #define AXIS_LABEL_PROP_ABS_TOOL_WIDTH  "Abs Tool Width"
198 #define AXIS_LABEL_PROP_ABS_VOLUME      "Abs Volume"
199 #define AXIS_LABEL_PROP_ABS_MT_SLOT     "Abs MT Slot"
200 #define AXIS_LABEL_PROP_ABS_MT_TOUCH_MAJOR "Abs MT Touch Major"
201 #define AXIS_LABEL_PROP_ABS_MT_TOUCH_MINOR "Abs MT Touch Minor"
202 #define AXIS_LABEL_PROP_ABS_MT_WIDTH_MAJOR "Abs MT Width Major"
203 #define AXIS_LABEL_PROP_ABS_MT_WIDTH_MINOR "Abs MT Width Minor"
204 #define AXIS_LABEL_PROP_ABS_MT_ORIENTATION "Abs MT Orientation"
205 #define AXIS_LABEL_PROP_ABS_MT_POSITION_X  "Abs MT Position X"
206 #define AXIS_LABEL_PROP_ABS_MT_POSITION_Y  "Abs MT Position Y"
207 #define AXIS_LABEL_PROP_ABS_MT_TOOL_TYPE   "Abs MT Tool Type"
208 #define AXIS_LABEL_PROP_ABS_MT_BLOB_ID     "Abs MT Blob ID"
209 #define AXIS_LABEL_PROP_ABS_MT_TRACKING_ID "Abs MT Tracking ID"
210 #define AXIS_LABEL_PROP_ABS_MT_PRESSURE    "Abs MT Pressure"
211 #define AXIS_LABEL_PROP_ABS_MT_DISTANCE    "Abs MT Distance"
212 #define AXIS_LABEL_PROP_ABS_MT_ANGLE       "Abs MT Angle/MT Component"
213 #define AXIS_LABEL_PROP_ABS_MT_PALM        "Abs MT Palm/MT Sumsize"
214 #define AXIS_LABEL_PROP_ABS_MISC           "Abs Misc"
215
216 #ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
217 #define GESTURE_TOUCH_PRESS ET_TouchBegin
218 #define GESTURE_TOUCH_MOTION ET_TouchUpdate
219 #define GESTURE_TOUCH_RELEASE ET_TouchEnd
220
221 #define GESTURE_RAW_TOUCH_PRESS ET_RawTouchBegin
222 #define GESTURE_RAW_TOUCH_MOTION ET_RawTouchUpdate
223 #define GESTURE_RAW_TOUCH_RELEASE ET_RawTouchEnd
224 #else //_SUPPORT_EVDEVMULTITOUCH_DRV_
225 #define GESTURE_TOUCH_PRESS ET_ButtonPress
226 #define GESTURE_TOUCH_MOTION ET_Motion
227 #define GESTURE_TOUCH_RELEASE ET_ButtonRelease
228
229 #define GESTURE_RAW_TOUCH_PRESS ET_RawButtonPress
230 #define GESTURE_RAW_TOUCH_MOTION ET_RawMotion
231 #define GESTURE_RAW_TOUCH_RELEASE ET_RawButtonRelease
232 #endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
233
234 typedef enum _MTSyncType
235 {
236         MTOUCH_FRAME_SYNC_END,
237         MTOUCH_FRAME_SYNC_BEGIN,
238         MTOUCH_FRAME_SYNC_UPDATE
239 } MTSyncType;
240
241 typedef enum _EventHandleType
242 {
243         PROPAGATE_EVENTS,
244         KEEP_EVENTS,
245         IGNORE_EVENTS
246 } EventHandleType;
247
248 typedef enum _ErrorStatus
249 {
250         ERROR_NONE,
251         ERROR_ABNORMAL,
252         ERROR_INVALPTR,
253         ERROR_EQFULL,
254         ERROR_ALLOCFAIL
255 } ErrorStatus;
256
257 enum EventType
258 {
259     ET_KeyPress = 2,
260     ET_KeyRelease,
261 #ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
262     ET_ButtonPress,
263     ET_ButtonRelease,
264     ET_Motion,
265 #else //_SUPPORT_EVDEVMULTITOUCH_DRV_
266     ET_TouchBegin = 7,
267     ET_TouchUpdate,
268     ET_TouchEnd,
269     ET_TouchOwnership,
270 #endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
271     /*
272     ...
273     */
274 #ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
275     ET_RawButtonPress = 22,
276     ET_RawButtonRelease,
277     ET_RawMotion,
278 #else //_SUPPORT_EVDEVMULTITOUCH_DRV_
279     ET_RawTouchBegin = 25,
280     ET_RawTouchUpdate,
281     ET_RawTouchEnd,
282 #endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
283     ET_TouchCancel = 31,
284     ET_MTSync = 0x7E,
285     ET_Internal = 0xFF /* First byte */
286 };
287
288 struct _DeviceEvent {
289     unsigned char header; /**< Always ET_Internal */
290     enum EventType type;  /**< One of EventType */
291     int length;           /**< Length in bytes */
292     Time time;            /**< Time in ms */
293     int deviceid;         /**< Device to post this event for */
294     int sourceid;         /**< The physical source device */
295     union {
296         uint32_t button;  /**< Button number (also used in pointer emulating
297                                touch events) */
298         uint32_t key;     /**< Key code */
299     } detail;
300     uint32_t touchid;     /**< Touch ID (client_id) */
301     int16_t root_x;       /**< Pos relative to root window in integral data */
302     float root_x_frac;    /**< Pos relative to root window in frac part */
303     int16_t root_y;       /**< Pos relative to root window in integral part */
304     float root_y_frac;    /**< Pos relative to root window in frac part */
305     uint8_t buttons[(MAX_BUTTONS + 7) / 8];  /**< Button mask */
306     struct {
307         uint8_t mask[(MAX_VALUATORS + 7) / 8];/**< Valuator mask */
308         uint8_t mode[(MAX_VALUATORS + 7) / 8];/**< Valuator mode (Abs or Rel)*/
309         double data[MAX_VALUATORS];           /**< Valuator data */
310     } valuators;
311     struct {
312         uint32_t base;    /**< XKB base modifiers */
313         uint32_t latched; /**< XKB latched modifiers */
314         uint32_t locked;  /**< XKB locked modifiers */
315         uint32_t effective;/**< XKB effective modifiers */
316     } mods;
317     struct {
318         uint8_t base;    /**< XKB base group */
319         uint8_t latched; /**< XKB latched group */
320         uint8_t locked;  /**< XKB locked group */
321         uint8_t effective;/**< XKB effective group */
322     } group;
323     Window root;      /**< Root window of the event */
324     int corestate;    /**< Core key/button state BEFORE the event */
325     int key_repeat;   /**< Internally-generated key repeat event */
326     uint32_t flags;   /**< Flags to be copied into the generated event */
327     uint32_t resource; /**< Touch event resource, only for TOUCH_REPLAYING */
328 };
329
330 typedef struct _AnyEvent AnyEvent;
331 struct _AnyEvent
332 {
333     unsigned char header; /**< Always ET_Internal */
334     enum EventType type;  /**< One of EventType */
335     int length;           /**< Length in bytes */
336     Time time;            /**< Time in ms */
337     int deviceid;
338     MTSyncType sync;
339     int x;
340     int y;
341 };
342
343 typedef struct _TouchCancelEvent TouchCancelEvent;
344 struct _TouchCancelEvent {
345     unsigned char header; /**< Always ET_Internal */
346     enum EventType type;  /**< ET_TouchOwnership */
347     int length;           /**< Length in bytes */
348     Time time;            /**< Time in ms */
349     int deviceid;         /**< Device to post this event for */
350     int sourceid;         /**< The physical source device */
351     uint32_t resource;    /**< Provoking grab or event selection */
352     uint32_t flags;       /**< Flags to be copied into the generated event */
353 };
354
355 typedef struct _RawDeviceEvent RawDeviceEvent;
356 struct _RawDeviceEvent {
357     unsigned char header; /**<  Always ET_Internal */
358     enum EventType type;  /**<  ET_Raw */
359     int length;           /**<  Length in bytes */
360     Time time;            /**<  Time in ms */
361     int deviceid;         /**< Device to post this event for */
362     int sourceid;         /**< The physical source device */
363     union {
364         uint32_t button;  /**< Button number */
365         uint32_t key;     /**< Key code */
366     } detail;
367     struct {
368         uint8_t mask[(MAX_VALUATORS + 7) / 8];/**< Valuator mask */
369         double data[MAX_VALUATORS];           /**< Valuator data */
370         double data_raw[MAX_VALUATORS];       /**< Valuator data as posted */
371     } valuators;
372     uint32_t flags;       /**< Flags to be copied into the generated event */
373 };
374
375
376 union _InternalEvent {
377         struct {
378             unsigned char header; /**< Always ET_Internal */
379             enum EventType type;  /**< One of ET_* */
380             int length;           /**< Length in bytes */
381             Time time;            /**< Time in ms. */
382         } any;
383         AnyEvent any_event;
384         DeviceEvent device_event;
385         RawDeviceEvent raw_event;
386         TouchCancelEvent touch_cancel_event;
387 };
388
389 #define wUseDefault(w,field,def)        ((w)->optional ? (w)->optional->field : def)
390 #define wBoundingShape(w)       wUseDefault(w, boundingShape, NULL)
391 #define wInputShape(w)          wUseDefault(w, inputShape, NULL)
392 #define wBorderWidth(w)         ((int) (w)->borderWidth)
393
394 /* used as NULL-terminated list */
395 typedef struct _DevCursorNode {
396     CursorPtr                   cursor;
397     DeviceIntPtr                dev;
398     struct _DevCursorNode*      next;
399 } DevCursNodeRec, *DevCursNodePtr, *DevCursorList;
400
401 typedef struct _WindowOpt {
402     CursorPtr cursor;           /* default: window.cursorNone */
403     VisualID visual;            /* default: same as parent */
404     Colormap colormap;          /* default: same as parent */
405     Mask dontPropagateMask;     /* default: window.dontPropagate */
406     Mask otherEventMasks;       /* default: 0 */
407     struct _OtherClients *otherClients; /* default: NULL */
408     struct _GrabRec *passiveGrabs;      /* default: NULL */
409     PropertyPtr userProps;      /* default: NULL */
410     CARD32 backingBitPlanes;    /* default: ~0L */
411     CARD32 backingPixel;        /* default: 0 */
412     RegionPtr boundingShape;    /* default: NULL */
413     RegionPtr clipShape;        /* default: NULL */
414     RegionPtr inputShape;       /* default: NULL */
415     struct _OtherInputMasks *inputMasks;        /* default: NULL */
416     DevCursorList deviceCursors;        /* default: NULL */
417 } WindowOptRec, *WindowOptPtr;
418
419 typedef struct _Window {
420     DrawableRec         drawable;
421     PrivateRec          *devPrivates;
422     WindowPtr           parent;         /* ancestor chain */
423     WindowPtr           nextSib;        /* next lower sibling */
424     WindowPtr           prevSib;        /* next higher sibling */
425     WindowPtr           firstChild;     /* top-most child */
426     WindowPtr           lastChild;      /* bottom-most child */
427     RegionRec           clipList;       /* clipping rectangle for output */
428     RegionRec           borderClip;     /* NotClippedByChildren + border */
429     union _Validate     *valdata;
430     RegionRec           winSize;
431     RegionRec           borderSize;
432     DDXPointRec         origin;         /* position relative to parent */
433     unsigned short      borderWidth;
434     unsigned short      deliverableEvents; /* all masks from all clients */
435     Mask                eventMask;      /* mask from the creating client */
436     PixUnion            background;
437     PixUnion            border;
438     pointer             backStorage;    /* null when BS disabled */
439     WindowOptPtr        optional;
440     unsigned            backgroundState:2; /* None, Relative, Pixel, Pixmap */
441     unsigned            borderIsPixel:1;
442     unsigned            cursorIsNone:1; /* else real cursor (might inherit) */
443     unsigned            backingStore:2;
444     unsigned            saveUnder:1;
445     unsigned            DIXsaveUnder:1;
446     unsigned            bitGravity:4;
447     unsigned            winGravity:4;
448     unsigned            overrideRedirect:1;
449     unsigned            visibility:2;
450     unsigned            mapped:1;
451     unsigned            realized:1;     /* ancestors are all mapped */
452     unsigned            viewable:1;     /* realized && InputOutput */
453     unsigned            dontPropagate:3;/* index into DontPropagateMasks */
454     unsigned            forcedBS:1;     /* system-supplied backingStore */
455     unsigned            redirectDraw:2; /* COMPOSITE rendering redirect */
456     unsigned            forcedBG:1;     /* must have an opaque background */
457 #ifdef ROOTLESS
458     unsigned            rootlessUnhittable:1;   /* doesn't hit-test */
459 #endif
460
461 #define COMPOSITE
462 #ifdef COMPOSITE
463     unsigned damagedDescendants:1;      /* some descendants are damaged */
464     unsigned inhibitBGPaint:1;  /* paint the background? */
465 #endif
466 } WindowRec;
467
468 typedef struct _IEvent {
469         InternalEvent *event;
470         int screen_num;
471         DeviceIntPtr device;
472 } IEventRec, *IEventPtr;
473
474 enum
475 {
476         BTN_RELEASED,
477         BTN_PRESSED,
478         BTN_MOVING
479 };
480
481 #define PressFlagFlick                  0x01//(1 << 0)
482 #define PressFlagPan                            0x02//(1 << 1)
483 #define PressFlagPinchRotation  0x04//(1 << 2)
484 #define PressFlagTap                            0x08//(1 << 3)
485 #define PressFlagTapNHold               0x10//(1 << 4)
486 #define PressFlagHold                   0x20//(1 << 5)
487
488 #define FlickFilterMask                 0x01//(1 << 0)
489 #define PanFilterMask                   0x02//(1 << 1)
490 #define PinchRotationFilterMask 0x04//(1 << 2)
491 #define TapFilterMask                   0x08//(1 << 3)
492 #define TapNHoldFilterMask              0x10//(1 << 4)
493 #define HoldFilterMask                  0x20//(1 << 5)
494
495 #define GESTURE_FILTER_MASK_ALL 0x3f//(FlickFilterMask | PanFilterMask | PinchRotationFilterMask | TapFilterMask |TapNHoldFilterMask | HoldFilterMask)
496
497 #define PalmFlickHorizFilterMask                0x01//(1 << 0)
498 #define PalmFlickVertiFilterMask                0x02//(1 << 1)
499
500 #define GESTURE_PALM_FILTER_MASK_ALL    0x03//(PalmFlickHorizFilterMask | PalmFlickVertiFilterMask)
501
502 typedef struct _tagTouchStatus
503 {
504         int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
505 #ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
506         int touchid;
507 #endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
508         uint32_t flags;
509
510         int px;         //press x
511         int py;         //press y
512         int mx;         //motion x
513         int my;         //motion y
514         int rx;         //release x
515         int ry;         //release y
516         Time ptime;     //press time
517         Time mtime;     //motion time
518         Time rtime;     //current/previous release time
519 } TouchStatus;
520
521 typedef struct _tagCurrentTouchStatus
522 {
523         int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
524
525         int cx;         //current x
526         int cy;         //current y
527 } CurTouchStatus;
528
529 //palm global
530 #define PALM_MIN_TOUCH_MAJOR                            30
531 #define PALM_MIN_WIDTH_MAJOR                            40
532 #define PALM_MIN_TOUCH_MAJOR_BEZEL                      16
533 #define PALM_MIN_WIDTH_MAJOR_BEZEL                      24
534 #define PALM_BEZEL                                                      33
535
536 //palm flick
537 #define PALM_FLICK_INITIAL_TIMEOUT                      300//ms
538 #define PALM_FLICK_FALSE_TIMEOUT                        900//ms
539 #define PALM_FLICK_DETECT_TIMEOUT                       2000//ms
540 #define PALM_HORIZ_ARRAY_COUNT                          4
541 #define PALM_VERTI_ARRAY_COUNT                          7
542 #define PALM_FLICK_MIN_PALM                                     1
543 #define PALM_FLICK_MIN_BASE_WIDTH                       30
544 #define PALM_FLICK_HORIZ_MAX_BASE_WIDTH         400
545 #define PALM_FLICK_VERTI_MAX_BASE_WIDTH         300
546 #define PALM_FALSE_FLICK_BASE_WIDTH                     8
547 #define PALM_FLICK_TOUCH_MAJOR                          80
548 #define PALM_FLICK_FINGER_MIN_TOUCH_MAJOR       15
549 #define PALM_FLICK_HORIZ_MAX_MOVE_Y                     400
550 #define PALM_FLICK_VERTI_MAX_MOVE_X                     300
551
552 //palm tap
553 #define PALM_MIN_MAJOR                                  200
554 #define PALM_SGL_TAP_TIMEOUT                    200//ms
555 #define PALM_DBL_TAP_TIMEOUT                    300//ms
556 #define PALM_TAP_MIN_DEVIATION                  100
557 #define PALM_TAP_FALSE_DEVIATION                20
558 #define PALM_TAP_FALSE_SIZE                             3
559
560 //palm hold
561 #define PALM_HOLD_TIME_THRESHOLD                        150
562
563 typedef struct _tagPalmTouchInfo
564 {
565         int touch_status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
566
567         int x;
568         int y;
569         double wmajor;//Value of valuator ABS_MT_WIDTH_MAJOR
570         double tmajor;//Value of valuator ABS_MT_TOUCH_MAJOR
571         double tminor;//Value of valuator ABS_MT_TOUCH_MINOR
572         double tangle;//Value of valuator ABS_MT_ANGLE
573         double tpalm;//Value of valuator ABS_MT_PALM
574 } PalmTouchInfo, *PalmTouchInfoPtr;
575
576 typedef struct _tagQueuedTouchInfo
577 {
578         int devid;
579         int pressed;
580 }QueuedTouchInfo;
581
582 typedef struct _tagPalmStatus
583 {
584         int palmflag;
585         double sum_size;
586         double max_eccen;
587         double max_angle;
588         double max_wmajor;
589         double max_tmajor;
590         double max_tminor;
591         double biggest_tmajor;
592         double biggest_wmajor;
593         double bigger_wmajor;
594         int max_size_idx;
595         int max_touched;
596         int cur_touched;
597         double dispersionX;
598         double deviationX;
599         double dispersionY;
600         double deviationY;
601         int cx;
602         int cy;
603         int max_palm;
604         int single_timer_expired;
605
606         OsTimerPtr palm_single_finger_timer;
607 #ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
608         PalmTouchInfo pti[MAX_MT_DEVICES];
609         QueuedTouchInfo qti[MAX_MT_DEVICES+1];
610         pixman_region16_t finger_rects[MAX_MT_DEVICES];
611 #else //_SUPPORT_EVDEVMULTITOUCH_DRV_
612         PalmTouchInfo *pti;
613         QueuedTouchInfo *qti;
614         pixman_region16_t *finger_rects;
615 #endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
616         pixman_region16_t area;
617 } PalmStatus, *PalmStatusPtr;
618
619 typedef struct _tagPalmDrvStatus
620 {
621         int enabled;
622         int scrn_width;
623         int scrn_height;
624         unsigned int half_scrn_area_size;
625         int horiz_coord[PALM_HORIZ_ARRAY_COUNT];
626         int verti_coord[PALM_VERTI_ARRAY_COUNT];
627 } PalmMiscInfo, *PalmMiscInfoPtr;
628
629 typedef struct _tagStylusStatus
630 {
631 #ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
632         CurTouchStatus t_status[MAX_MT_DEVICES];
633 #else //_SUPPORT_EVDEVMULTITOUCH_DRV_
634         CurTouchStatus *t_status;
635 #endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
636         int stylus_id;
637         Bool pen_detected;
638         Bool fake_events;
639 } StylusInfo, *StylusInfoPtr;
640
641 typedef struct _GestureDeviceRec
642 {
643         char *device;
644         int version;        /* Driver version */
645         OsTimerPtr device_setting_timer;
646
647         int is_active;
648
649         int screen_width;
650         int screen_height;
651
652         int pinchrotation_time_threshold;
653         double pinchrotation_dist_threshold;
654         double pinchrotation_angle_threshold;
655
656         int singlefinger_threshold;
657         int singletap_threshold;
658         int doubletap_threshold;
659
660         int palm_min_touch_major;
661         int palm_min_width_major;
662         int palm_min_touch_major_bezel;
663         int palm_min_width_major_bezel;
664         int palm_bezel;
665
666         int touchkey_id;
667         MTSyncType mtsync_status;
668         StylusInfo stylusInfo;
669         int palm_rejection_mode;
670         Bool palm_detected;
671         Bool no_palm_events;
672
673         int pass_keycodes[NUM_PASSKEYS];
674
675         WindowPtr pRootWin;
676         Window gestureWin;
677         int num_mt_devices;
678
679         Mask grabMask;
680         Mask eventMask;
681         GestureGrabEventPtr GrabEvents;
682         Mask lastSelectedMask;
683         Window lastSelectedWin;
684
685         EventHandleType ehtype;
686         IEventPtr       EQ;
687         int headEQ;
688         int tailEQ;
689
690         int hold_detector_activate;
691         int has_hold_grabmask;
692         pixman_region16_t chold_area;
693 #ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
694         CurTouchStatus cts[MAX_MT_DEVICES];
695 #else //_SUPPORT_EVDEVMULTITOUCH_DRV_
696         CurTouchStatus *cts;
697 #endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
698 #ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
699         CurTouchStatus last_touches[MAX_MT_DEVICES];
700 #else //_SUPPORT_EVDEVMULTITOUCH_DRV_
701         CurTouchStatus *last_touches;
702 #endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
703         Bool touch_cancel_status;
704         Bool hold_detected;
705
706         PalmStatus palm;
707         PalmMiscInfo palm_misc;
708         int wmajor_idx;
709         int tmajor_idx;
710         int tminor_idx;
711         int tangle_idx;
712         int tpalm_idx;
713         int mt_px_idx;
714         int mt_py_idx;
715         int mt_tool_idx;
716
717         pixman_region16_t area;
718 #ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
719         pixman_region16_t finger_rects[MAX_MT_DEVICES];
720 #else //_SUPPORT_EVDEVMULTITOUCH_DRV_
721         pixman_region16_t *finger_rects;
722 #endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
723
724         WindowPtr pTempWin;
725         WindowPtr pTempPalmWin;
726         int inc_num_pressed;
727
728         int first_fingerid;
729         int num_pressed;
730         int zoom_enabled;
731         int enqueue_fulled;
732         int tap_repeated;
733 #ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
734         TouchStatus fingers[MAX_MT_DEVICES];
735 #else //_SUPPORT_EVDEVMULTITOUCH_DRV_
736         TouchStatus *fingers;
737 #endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
738
739 #ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
740         int event_sum[MAX_MT_DEVICES];
741 #else //_SUPPORT_EVDEVMULTITOUCH_DRV_
742         int *event_sum;
743 #endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
744         uint32_t recognized_gesture;
745         uint32_t filter_mask;
746         uint32_t palm_filter_mask;
747         uint32_t recognized_palm;
748 #ifdef _F_SUPPORT_BEZEL_FLICK_
749         uint32_t bezel_filter_mask;
750         uint32_t bezel_recognized_mask;
751 #endif
752
753         DeviceIntPtr this_device;
754 #ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
755         DeviceIntPtr mt_devices[MAX_MT_DEVICES];
756 #else //_SUPPORT_EVDEVMULTITOUCH_DRV_
757         DeviceIntPtr mt_devices;
758 #endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
759         DeviceIntPtr master_pointer;
760         DeviceIntPtr xtest_pointer;
761         WindowPtr anr_window;
762
763         int stylus_able;
764         int support_palm;
765 } GestureDeviceRec, *GestureDevicePtr ;
766
767 #endif//_GESTURE_H_