1 /**************************************************************************
3 xserver-xorg-input-gesture
5 Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
7 Contact: Sung-Jin Park <sj76.park@samsung.com>
8 Sangjin LEE <lsj119@samsung.com>
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:
18 The above copyright notice and this permission notice (including the
19 next paragraph) shall be included in all copies or substantial portions
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.
30 **************************************************************************/
35 #include <xorg/events.h>
36 #include <xorg/gestureext.h>
37 #include <X11/extensions/gestureconst.h>
40 #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3
41 #define HAVE_PROPERTIES 1
45 #define ABS_CNT (ABS_MAX+1)
51 #define TTRACE_BEGIN(NAME) traceBegin(TTRACE_TAG_INPUT, NAME)
52 #define TTRACE_END() traceEnd(TTRACE_TAG_INPUT)
54 #define TTRACE_BEGIN(NAME)
56 #endif //ENABLE_TTRACE
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.
63 #define SUPPORT_ANR_WITH_INPUT_EVENT
65 #define NUM_PASSKEYS 20
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))
72 #define MAX_MT_DEVICES 10
73 #define GESTURE_EQ_SIZE 256
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"
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)))
94 #define TAP_THRESHOLD 100//in pixel
95 #define SINGLE_TAP_TIMEOUT 100//in msec
96 #define DOUBLE_TAP_TIMEOUT 250//in msec
99 #define ZOOM_THRESHOLD 0.05f
100 #define ANGLE_THRESHOLD 0.1f
103 typedef double XDouble;
104 #define XDoubleToFixed(f) ((XFixed) ((f) * 65536))
105 #define XFixedToDouble(f) (((XDouble) (f)) / 65536)
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))
123 /* Gesture query devices infomation and register handlers
124 * if a device_control function is called using DEVICE_READY */
125 #define DEVICE_READY 11
127 #define SCREEN_WIDTH 720
128 #define SCREEN_HEIGHT 1280
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
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
141 #define HOLD_AREA_THRESHOLD 2500//=50pixel * 50pixel
142 #define HOLD_MOVE_THRESHOLD 10//pixel
143 #define HOLD_TIME_THRESHOLD 500//ms
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
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
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
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)
172 #define rad2degree(r) ((r) * 180/M_PI)
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"
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
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
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_
234 typedef enum _MTSyncType
236 MTOUCH_FRAME_SYNC_END,
237 MTOUCH_FRAME_SYNC_BEGIN,
238 MTOUCH_FRAME_SYNC_UPDATE
241 typedef enum _EventHandleType
248 typedef enum _ErrorStatus
261 #ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
265 #else //_SUPPORT_EVDEVMULTITOUCH_DRV_
270 #endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
274 #ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
275 ET_RawButtonPress = 22,
278 #else //_SUPPORT_EVDEVMULTITOUCH_DRV_
279 ET_RawTouchBegin = 25,
282 #endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
285 ET_Internal = 0xFF /* First byte */
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 */
296 uint32_t button; /**< Button number (also used in pointer emulating
298 uint32_t key; /**< Key code */
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 */
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 */
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 */
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 */
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 */
330 typedef struct _AnyEvent AnyEvent;
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 */
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 */
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 */
364 uint32_t button; /**< Button number */
365 uint32_t key; /**< Key code */
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 */
372 uint32_t flags; /**< Flags to be copied into the generated event */
376 union _InternalEvent {
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. */
384 DeviceEvent device_event;
385 RawDeviceEvent raw_event;
386 TouchCancelEvent touch_cancel_event;
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)
394 /* used as NULL-terminated list */
395 typedef struct _DevCursorNode {
398 struct _DevCursorNode* next;
399 } DevCursNodeRec, *DevCursNodePtr, *DevCursorList;
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;
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;
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 */
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;
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 */
458 unsigned rootlessUnhittable:1; /* doesn't hit-test */
463 unsigned damagedDescendants:1; /* some descendants are damaged */
464 unsigned inhibitBGPaint:1; /* paint the background? */
468 typedef struct _IEvent {
469 InternalEvent *event;
472 } IEventRec, *IEventPtr;
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)
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)
495 #define GESTURE_FILTER_MASK_ALL 0x3f//(FlickFilterMask | PanFilterMask | PinchRotationFilterMask | TapFilterMask |TapNHoldFilterMask | HoldFilterMask)
497 #define PalmFlickHorizFilterMask 0x01//(1 << 0)
498 #define PalmFlickVertiFilterMask 0x02//(1 << 1)
500 #define GESTURE_PALM_FILTER_MASK_ALL 0x03//(PalmFlickHorizFilterMask | PalmFlickVertiFilterMask)
502 typedef struct _tagTouchStatus
504 int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
505 #ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
507 #endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
516 Time ptime; //press time
517 Time mtime; //motion time
518 Time rtime; //current/previous release time
521 typedef struct _tagCurrentTouchStatus
523 int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
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
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
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
561 #define PALM_HOLD_TIME_THRESHOLD 150
563 typedef struct _tagPalmTouchInfo
565 int touch_status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
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;
576 typedef struct _tagQueuedTouchInfo
582 typedef struct _tagPalmStatus
591 double biggest_tmajor;
592 double biggest_wmajor;
593 double bigger_wmajor;
604 int single_timer_expired;
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_
613 QueuedTouchInfo *qti;
614 pixman_region16_t *finger_rects;
615 #endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
616 pixman_region16_t area;
617 } PalmStatus, *PalmStatusPtr;
619 typedef struct _tagPalmDrvStatus
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;
629 typedef struct _tagStylusStatus
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_
639 } StylusInfo, *StylusInfoPtr;
641 typedef struct _GestureDeviceRec
644 int version; /* Driver version */
645 OsTimerPtr device_setting_timer;
652 int pinchrotation_time_threshold;
653 double pinchrotation_dist_threshold;
654 double pinchrotation_angle_threshold;
656 int singlefinger_threshold;
657 int singletap_threshold;
658 int doubletap_threshold;
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;
667 MTSyncType mtsync_status;
668 StylusInfo stylusInfo;
669 int palm_rejection_mode;
673 int pass_keycodes[NUM_PASSKEYS];
681 GestureGrabEventPtr GrabEvents;
682 Mask lastSelectedMask;
683 Window lastSelectedWin;
685 EventHandleType ehtype;
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_
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;
707 PalmMiscInfo palm_misc;
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_
725 WindowPtr pTempPalmWin;
733 #ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
734 TouchStatus fingers[MAX_MT_DEVICES];
735 #else //_SUPPORT_EVDEVMULTITOUCH_DRV_
736 TouchStatus *fingers;
737 #endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
739 #ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
740 int event_sum[MAX_MT_DEVICES];
741 #else //_SUPPORT_EVDEVMULTITOUCH_DRV_
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;
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;
765 } GestureDeviceRec, *GestureDevicePtr ;