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)
48 #define NUM_PASSKEYS 20
50 #define SYSCALL(call) while (((call) == -1) && (errno == EINTR))
51 #define RootWindow(dev) dev->spriteInfo->sprite->spriteTrace[0]
52 #define CLIENT_BITS(id) ((id) & RESOURCE_CLIENT_MASK)
53 #define CLIENT_ID(id) ((int)(CLIENT_BITS(id) >> CLIENTOFFSET))
55 #define MAX_MT_DEVICES 10
56 #define GESTURE_EQ_SIZE 256
58 #define GESTURE_RECOGNIZER_ONOFF "GESTURE_RECOGNIZER_ONOFF"
60 #define FINGER_WIDTH 10
61 #define FINGER_HEIGHT 10
62 #define FINGER_WIDTH_2T 20
63 #define FINGER_HEIGHT_2T 20
64 #define AREA_CENTER_X(extents) ((extents)->x1 + (((extents)->x2-(extents)->x1)/2))
65 #define AREA_CENTER_Y(extents) ((extents)->y1 + (((extents)->y2-(extents)->y1)/2))
66 #define AREA_SIZE(extents) (ABS((extents)->x2-(extents)->x1)*ABS((extents)->y2-(extents)->y1))
67 #define INBOX(r,x,y) ( ((r)->x2 > x) && ((r)->x1 <= x) && ((r)->y2 > y) && ((r)->y1 <= y) )
68 #define AREA_HEIGHT(extents) (((extents)->y2)-((extents)->y1))
69 #define AREA_WIDTH(extents) (((extents)->x2)-((extents)->x1))
70 #define AREA_DIAG_LEN(extents) sqrt((AREA_WIDTH(extents)*AREA_WIDTH(extents))+(AREA_HEIGHT(extents)*AREA_HEIGHT(extents)))
73 #define TAP_THRESHOLD 100//in pixel
74 #define SINGLE_TAP_TIMEOUT 100//in msec
75 #define DOUBLE_TAP_TIMEOUT 250//in msec
78 #define ZOOM_THRESHOLD 0.05f
79 #define ANGLE_THRESHOLD 0.1f
82 typedef double XDouble;
83 #define XDoubleToFixed(f) ((XFixed) ((f) * 65536))
84 #define XFixedToDouble(f) (((XDouble) (f)) / 65536)
86 #define MIN(x, y) (((x) < (y)) ? (x) : (y))
87 #define MAX(x, y) (((x) > (y)) ? (x) : (y))
88 #define ABS(x) (((x) < 0) ? -(x) : (x))
102 #define PAN_AREA_THRESHOLD 10000//=100pixel * 100pixel
103 #define PAN_MOVE_THRESHOLD 5//pixel
104 #define PAN_UPDATE_MOVE_THRESHOLD 3//pixel
105 #define PAN_TIME_THRESHOLD 300//ms
107 #define PINCHROTATION_TIME_THRESHOLD 500//ms
108 #define PINCHROTATION_INIT_DIST_THRESHOLD 25.0f
109 #define PINCHROTATION_INIT_ANGLE_THRESHOLD 0.2f
110 #define PINCHROTATION_DIST_THRESHOLD 25.0f
111 #define PINCHROTATION_ANGLE_THRESHOLD 0.2f
113 #define HOLD_AREA_THRESHOLD 2500//=50pixel * 50pixel
114 #define HOLD_MOVE_THRESHOLD 10//pixel
115 #define HOLD_TIME_THRESHOLD 500//ms
117 #define TAP_AREA_THRESHOLD 10000//= 100pixel * 100pixel
118 #define TAP_MOVE_THRESHOLD 200//pixel
119 #define SGL_FINGER_TIME_THRESHOLD 50//ms
120 #define SGL_TAP_TIME_THRESHOLD 200//ms
121 #define DBL_TAP_TIME_THRESHOLD 400//ms
122 #define MAX_TAP_REPEATS 3
124 #define TAPNHOLD_AREA_THRESHOLD 4900//= 70pixel * 70pixel
125 #define TAPNHOLD_MOVE_THRESHOLD 50//pixel
126 #define TAPNHOLD_TAP_TIME_THRESHOLD 200//ms
127 #define TAPNHOLD_INTV_TIME_THRESHOLD 200//ms
128 #define TAPNHOLD_HOLD_TIME_THRESHOLD 500//ms
130 #define FLICK_AREA_THRESHOLD 22500//=150pixel * 150pixel
131 #define FLICK_AREA_TIMEOUT 700//ms
132 #define FLICK_MOVE_THRESHOLD 100//pixel
133 #define FLICK_MOVE_TIMEOUT 1000//ms
135 #define RAD_90DEG M_PI_2
136 #define RAD_180DEG M_PI
137 #define RAD_270DEG (M_PI_2 * 3)
138 #define RAD_360DEG (M_PI * 2)
139 #define MIN_RAD (RAD_90DEG / 4)
140 #define MAX_RAD ((RAD_90DEG / 4) * 3)
141 #define RAD_180DEG_MIN (RAD_90DEG + MIN_RAD)
142 #define RAD_180DEG_MAX (RAD_90DEG + MAX_RAD)
144 #define rad2degree(r) ((r) * 180/M_PI)
146 #define AXIS_LABEL_PROP_ABS_X "Abs X"
147 #define AXIS_LABEL_PROP_ABS_Y "Abs Y"
148 #define AXIS_LABEL_PROP_ABS_Z "Abs Z"
149 #define AXIS_LABEL_PROP_ABS_RX "Abs Rotary X"
150 #define AXIS_LABEL_PROP_ABS_RY "Abs Rotary Y"
151 #define AXIS_LABEL_PROP_ABS_RZ "Abs Rotary Z"
152 #define AXIS_LABEL_PROP_ABS_THROTTLE "Abs Throttle"
153 #define AXIS_LABEL_PROP_ABS_RUDDER "Abs Rudder"
154 #define AXIS_LABEL_PROP_ABS_WHEEL "Abs Wheel"
155 #define AXIS_LABEL_PROP_ABS_GAS "Abs Gas"
156 #define AXIS_LABEL_PROP_ABS_BRAKE "Abs Brake"
157 #define AXIS_LABEL_PROP_ABS_HAT0X "Abs Hat 0 X"
158 #define AXIS_LABEL_PROP_ABS_HAT0Y "Abs Hat 0 Y"
159 #define AXIS_LABEL_PROP_ABS_HAT1X "Abs Hat 1 X"
160 #define AXIS_LABEL_PROP_ABS_HAT1Y "Abs Hat 1 Y"
161 #define AXIS_LABEL_PROP_ABS_HAT2X "Abs Hat 2 X"
162 #define AXIS_LABEL_PROP_ABS_HAT2Y "Abs Hat 2 Y"
163 #define AXIS_LABEL_PROP_ABS_HAT3X "Abs Hat 3 X"
164 #define AXIS_LABEL_PROP_ABS_HAT3Y "Abs Hat 3 Y"
165 #define AXIS_LABEL_PROP_ABS_PRESSURE "Abs Pressure"
166 #define AXIS_LABEL_PROP_ABS_DISTANCE "Abs Distance"
167 #define AXIS_LABEL_PROP_ABS_TILT_X "Abs Tilt X"
168 #define AXIS_LABEL_PROP_ABS_TILT_Y "Abs Tilt Y"
169 #define AXIS_LABEL_PROP_ABS_TOOL_WIDTH "Abs Tool Width"
170 #define AXIS_LABEL_PROP_ABS_VOLUME "Abs Volume"
171 #define AXIS_LABEL_PROP_ABS_MT_SLOT "Abs MT Slot"
172 #define AXIS_LABEL_PROP_ABS_MT_TOUCH_MAJOR "Abs MT Touch Major"
173 #define AXIS_LABEL_PROP_ABS_MT_TOUCH_MINOR "Abs MT Touch Minor"
174 #define AXIS_LABEL_PROP_ABS_MT_WIDTH_MAJOR "Abs MT Width Major"
175 #define AXIS_LABEL_PROP_ABS_MT_WIDTH_MINOR "Abs MT Width Minor"
176 #define AXIS_LABEL_PROP_ABS_MT_ORIENTATION "Abs MT Orientation"
177 #define AXIS_LABEL_PROP_ABS_MT_POSITION_X "Abs MT Position X"
178 #define AXIS_LABEL_PROP_ABS_MT_POSITION_Y "Abs MT Position Y"
179 #define AXIS_LABEL_PROP_ABS_MT_TOOL_TYPE "Abs MT Tool Type"
180 #define AXIS_LABEL_PROP_ABS_MT_BLOB_ID "Abs MT Blob ID"
181 #define AXIS_LABEL_PROP_ABS_MT_TRACKING_ID "Abs MT Tracking ID"
182 #define AXIS_LABEL_PROP_ABS_MT_PRESSURE "Abs MT Pressure"
183 #define AXIS_LABEL_PROP_ABS_MT_DISTANCE "Abs MT Distance"
184 #define AXIS_LABEL_PROP_ABS_MT_ANGLE "Abs MT Angle/MT Component"
185 #define AXIS_LABEL_PROP_ABS_MT_PALM "Abs MT Palm/MT Sumsize"
186 #define AXIS_LABEL_PROP_ABS_MISC "Abs Misc"
189 typedef enum _MTSyncType
191 MTOUCH_FRAME_SYNC_END,
192 MTOUCH_FRAME_SYNC_BEGIN
195 typedef enum _EventHandleType
202 typedef enum _ErrorStatus
222 ET_Internal = 0xFF /* First byte */
225 struct _DeviceEvent {
226 unsigned char header; /**< Always ET_Internal */
227 enum EventType type; /**< One of EventType */
228 int length; /**< Length in bytes */
229 Time time; /**< Time in ms */
230 int deviceid; /**< Device to post this event for */
231 int sourceid; /**< The physical source device */
233 uint32_t button; /**< Button number (also used in pointer emulating
235 uint32_t key; /**< Key code */
237 uint32_t touchid; /**< Touch ID (client_id) */
238 int16_t root_x; /**< Pos relative to root window in integral data */
239 float root_x_frac; /**< Pos relative to root window in frac part */
240 int16_t root_y; /**< Pos relative to root window in integral part */
241 float root_y_frac; /**< Pos relative to root window in frac part */
242 uint8_t buttons[(MAX_BUTTONS + 7) / 8]; /**< Button mask */
244 uint8_t mask[(MAX_VALUATORS + 7) / 8];/**< Valuator mask */
245 uint8_t mode[(MAX_VALUATORS + 7) / 8];/**< Valuator mode (Abs or Rel)*/
246 double data[MAX_VALUATORS]; /**< Valuator data */
249 uint32_t base; /**< XKB base modifiers */
250 uint32_t latched; /**< XKB latched modifiers */
251 uint32_t locked; /**< XKB locked modifiers */
252 uint32_t effective;/**< XKB effective modifiers */
255 uint8_t base; /**< XKB base group */
256 uint8_t latched; /**< XKB latched group */
257 uint8_t locked; /**< XKB locked group */
258 uint8_t effective;/**< XKB effective group */
260 Window root; /**< Root window of the event */
261 int corestate; /**< Core key/button state BEFORE the event */
262 int key_repeat; /**< Internally-generated key repeat event */
263 uint32_t flags; /**< Flags to be copied into the generated event */
266 typedef struct _AnyEvent AnyEvent;
269 unsigned char header; /**< Always ET_Internal */
270 enum EventType type; /**< One of EventType */
271 int length; /**< Length in bytes */
272 Time time; /**< Time in ms */
279 union _InternalEvent {
281 unsigned char header; /**< Always ET_Internal */
282 enum EventType type; /**< One of ET_* */
283 int length; /**< Length in bytes */
284 Time time; /**< Time in ms. */
287 DeviceEvent device_event;
290 #define wUseDefault(w,field,def) ((w)->optional ? (w)->optional->field : def)
291 #define wBoundingShape(w) wUseDefault(w, boundingShape, NULL)
292 #define wInputShape(w) wUseDefault(w, inputShape, NULL)
293 #define wBorderWidth(w) ((int) (w)->borderWidth)
295 /* used as NULL-terminated list */
296 typedef struct _DevCursorNode {
299 struct _DevCursorNode* next;
300 } DevCursNodeRec, *DevCursNodePtr, *DevCursorList;
302 typedef struct _WindowOpt {
303 VisualID visual; /* default: same as parent */
304 CursorPtr cursor; /* default: window.cursorNone */
305 Colormap colormap; /* default: same as parent */
306 Mask dontPropagateMask; /* default: window.dontPropagate */
307 Mask otherEventMasks; /* default: 0 */
308 struct _OtherClients *otherClients; /* default: NULL */
309 struct _GrabRec *passiveGrabs; /* default: NULL */
310 PropertyPtr userProps; /* default: NULL */
311 unsigned long backingBitPlanes; /* default: ~0L */
312 unsigned long backingPixel; /* default: 0 */
313 RegionPtr boundingShape; /* default: NULL */
314 RegionPtr clipShape; /* default: NULL */
315 RegionPtr inputShape; /* default: NULL */
316 struct _OtherInputMasks *inputMasks; /* default: NULL */
317 DevCursorList deviceCursors; /* default: NULL */
318 } WindowOptRec, *WindowOptPtr;
320 typedef struct _Window {
321 DrawableRec drawable;
322 PrivateRec *devPrivates;
323 WindowPtr parent; /* ancestor chain */
324 WindowPtr nextSib; /* next lower sibling */
325 WindowPtr prevSib; /* next higher sibling */
326 WindowPtr firstChild; /* top-most child */
327 WindowPtr lastChild; /* bottom-most child */
328 RegionRec clipList; /* clipping rectangle for output */
329 RegionRec borderClip; /* NotClippedByChildren + border */
330 union _Validate *valdata;
332 RegionRec borderSize;
333 DDXPointRec origin; /* position relative to parent */
334 unsigned short borderWidth;
335 unsigned short deliverableEvents; /* all masks from all clients */
336 Mask eventMask; /* mask from the creating client */
339 pointer backStorage; /* null when BS disabled */
340 WindowOptPtr optional;
341 unsigned backgroundState:2; /* None, Relative, Pixel, Pixmap */
342 unsigned borderIsPixel:1;
343 unsigned cursorIsNone:1; /* else real cursor (might inherit) */
344 unsigned backingStore:2;
345 unsigned saveUnder:1;
346 unsigned DIXsaveUnder:1;
347 unsigned bitGravity:4;
348 unsigned winGravity:4;
349 unsigned overrideRedirect:1;
350 unsigned visibility:2;
352 unsigned realized:1; /* ancestors are all mapped */
353 unsigned viewable:1; /* realized && InputOutput */
354 unsigned dontPropagate:3;/* index into DontPropagateMasks */
355 unsigned forcedBS:1; /* system-supplied backingStore */
356 unsigned redirectDraw:2; /* COMPOSITE rendering redirect */
357 unsigned forcedBG:1; /* must have an opaque background */
359 unsigned rootlessUnhittable:1; /* doesn't hit-test */
363 typedef struct _IEvent {
364 InternalEvent *event;
367 } IEventRec, *IEventPtr;
376 #ifdef _F_SUPPORT_BEZEL_FLICK_
396 #define PressFlagFlick 0x01//(1 << 0)
397 #define PressFlagPan 0x02//(1 << 1)
398 #define PressFlagPinchRotation 0x04//(1 << 2)
399 #define PressFlagTap 0x08//(1 << 3)
400 #define PressFlagTapNHold 0x10//(1 << 4)
401 #define PressFlagHold 0x20//(1 << 5)
403 #define FlickFilterMask 0x01//(1 << 0)
404 #define PanFilterMask 0x02//(1 << 1)
405 #define PinchRotationFilterMask 0x04//(1 << 2)
406 #define TapFilterMask 0x08//(1 << 3)
407 #define TapNHoldFilterMask 0x10//(1 << 4)
408 #define HoldFilterMask 0x20//(1 << 5)
410 #define GESTURE_FILTER_MASK_ALL 0x3f//(FlickFilterMask | PanFilterMask | PinchRotationFilterMask | TapFilterMask |TapNHoldFilterMask | HoldFilterMask)
412 #define PalmHoldFilterMask 0x01//(1 << 0)
413 #define PalmFlickHorizFilterMask 0x02//(1 << 1)
414 #define PalmFlickVertiFilterMask 0x04//(1 << 2)
416 #define GESTURE_PALM_FILTER_MASK_ALL 0x07//(PalmHoldFilterMask | PalmFlickHorizFilterMask | PalmFlickVertiFilterMask)
418 #ifdef _F_SUPPORT_BEZEL_FLICK_
419 #define BezelFlickFilterMask 0x01//(1 << 0)
422 typedef struct _tagTouchStatus
424 int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
433 Time ptime; //press time
434 Time mtime; //motion time
435 Time rtime; //current/previous release time
438 typedef struct _tagCurrentTouchStatus
440 int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
447 #define PALM_FLICK_INITIAL_TIMEOUT 300//ms
448 #define PALM_FLICK_FALSE_TIMEOUT 900//ms
449 #define PALM_FLICK_DETECT_TIMEOUT 2000//ms
450 #define PALM_HORIZ_ARRAY_COUNT 4
451 #define PALM_VERTI_ARRAY_COUNT 7
452 #define PALM_FLICK_MIN_PALM 1
453 #define PALM_FLICK_MIN_BASE_WIDTH 30
454 #define PALM_FLICK_HORIZ_MAX_BASE_WIDTH 400
455 #define PALM_FLICK_VERTI_MAX_BASE_WIDTH 300
456 #define PALM_FALSE_FLICK_BASE_WIDTH 8
457 #define PALM_FLICK_TOUCH_MAJOR 80
458 #define PALM_FLICK_FINGER_MIN_TOUCH_MAJOR 15
459 #define PALM_FLICK_HORIZ_MAX_MOVE_Y 300
460 #define PALM_FLICK_VERTI_MAX_MOVE_X 300
463 #define PALM_MIN_MAJOR 200
464 #define PALM_SGL_TAP_TIMEOUT 200//ms
465 #define PALM_DBL_TAP_TIMEOUT 300//ms
466 #define PALM_TAP_MIN_DEVIATION 100
467 #define PALM_TAP_FALSE_DEVIATION 20
468 #define PALM_TAP_FALSE_SIZE 3
471 #define PALM_HOLD_TIME_THRESHOLD 150
472 #define PALM_HOLD_UPDATE_THRESHOLD 500
473 #define PALM_HOLD_MIN_DEVIATION 120
474 #define PALM_HOLD_MIN_FINGER 4
475 #define PALM_HOLD_MIN_BASE_WIDTH 400
476 #define PALM_HOLD_FALSE_WIDTH 10
477 #define PALM_HOLD_FINGER_MIN_TOUCH_MAJOR 10
478 #define PALM_HOLD_FINGER_MIN_WIDTH_MAJOR 15
480 typedef struct _tagPalmTouchInfo
482 int touch_status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
486 double wmajor;//Value of valuator ABS_MT_WIDTH_MAJOR
487 double tmajor;//Value of valuator ABS_MT_TOUCH_MAJOR
488 double tminor;//Value of valuator ABS_MT_TOUCH_MINOR
489 double tangle;//Value of valuator ABS_MT_ANGLE
490 double tpalm;//Value of valuator ABS_MT_PALM
491 } PalmTouchInfo, *PalmTouchInfoPtr;
493 typedef struct _tagQueuedTouchInfo
499 typedef struct _tagPalmStatus
508 double biggest_tmajor;
509 double biggest_wmajor;
510 double bigger_wmajor;
521 int single_timer_expired;
523 OsTimerPtr palm_single_finger_timer;
524 PalmTouchInfo pti[MAX_MT_DEVICES];
525 QueuedTouchInfo qti[MAX_MT_DEVICES+1];
526 pixman_region16_t area;
527 pixman_region16_t finger_rects[MAX_MT_DEVICES];
528 } PalmStatus, *PalmStatusPtr;
530 typedef struct _tagPalmDrvStatus
535 unsigned int half_scrn_area_size;
536 int horiz_coord[PALM_HORIZ_ARRAY_COUNT];
537 int verti_coord[PALM_VERTI_ARRAY_COUNT];
538 } PalmMiscInfo, *PalmMiscInfoPtr;
540 #ifdef _F_SUPPORT_BEZEL_FLICK_
541 typedef struct _tagBezelStatus
545 }BezelStatus, *BezelStatusPtr;
546 typedef struct _tagBezelFlickStatus
549 BezelStatus top_left;
550 BezelStatus top_right;
551 BezelStatus bottom_left;
552 BezelStatus bottom_right;
554 int bezel_angle_ratio;
559 int bezel_angle_moving_check;
561 }BezelFlickStatus, *BezelFlickStatusPtr;
564 typedef struct _GestureDeviceRec
567 int version; /* Driver version */
568 OsTimerPtr device_setting_timer;
572 int pinchrotation_time_threshold;
573 double pinchrotation_dist_threshold;
574 double pinchrotation_angle_threshold;
576 int singlefinger_threshold;
577 int singletap_threshold;
578 int doubletap_threshold;
581 MTSyncType mtsync_status;
583 int pass_keycodes[NUM_PASSKEYS];
591 GestureGrabEventPtr GrabEvents;
592 Mask lastSelectedMask;
593 Window lastSelectedWin;
595 EventHandleType ehtype;
600 int hold_detector_activate;
601 int has_hold_grabmask;
602 pixman_region16_t chold_area;
603 CurTouchStatus cts[MAX_MT_DEVICES];
606 PalmMiscInfo palm_misc;
615 pixman_region16_t area;
616 pixman_region16_t finger_rects[MAX_MT_DEVICES];
619 WindowPtr pTempPalmWin;
627 TouchStatus fingers[MAX_MT_DEVICES];
629 int event_sum[MAX_MT_DEVICES];
630 uint32_t recognized_gesture;
631 uint32_t filter_mask;
632 uint32_t palm_filter_mask;
633 uint32_t recognized_palm;
634 #ifdef _F_SUPPORT_BEZEL_FLICK_
635 uint32_t bezel_filter_mask;
636 uint32_t bezel_recognized_mask;
639 DeviceIntPtr this_device;
640 DeviceIntPtr mt_devices[MAX_MT_DEVICES];
641 DeviceIntPtr master_pointer;
642 DeviceIntPtr xtest_pointer;
643 #ifdef _F_SUPPORT_BEZEL_FLICK_
644 BezelFlickStatus bezel;
646 } GestureDeviceRec, *GestureDevicePtr ;