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 * 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.
49 #define SUPPORT_ANR_WITH_INPUT_EVENT
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_"
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))
62 #define MAX_MT_DEVICES 2
63 #define GESTURE_EQ_SIZE 256
65 #define GESTURE_RECOGNIZER_ONOFF "GESTURE_RECOGNIZER_ONOFF"
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)))
80 #define TAP_THRESHOLD 100//in pixel
81 #define SINGLE_TAP_TIMEOUT 100//in msec
82 #define DOUBLE_TAP_TIMEOUT 250//in msec
85 #define PALM_HORIZ_ARRAY_COUNT 3
86 #define PALM_VERTI_ARRAY_COUNT 4
89 typedef double XDouble;
90 #define XDoubleToFixed(f) ((XFixed) ((f) * 65536))
91 #define XFixedToDouble(f) (((XDouble) (f)) / 65536)
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))
111 FLICK_POINT_NONE = 0,
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
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
132 #define PALM_FLICK_DETECT_TIMEOUT 1000//ms
133 #define PALM_FLICK_MAX_TOUCH_MAJOR 130
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"
141 typedef enum _MTSyncType
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
150 typedef enum _EventHandleType
157 typedef enum _ErrorStatus
178 ET_Internal = 0xFF /* First byte */
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 */
189 uint32_t button; /**< Button number (also used in pointer emulating
191 uint32_t key; /**< Key code */
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 */
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 */
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 */
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 */
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 */
222 typedef struct _AnyEvent AnyEvent;
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 */
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 */
249 union _InternalEvent {
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. */
257 DeviceEvent device_event;
258 TouchCancelEvent touch_cancel_event;
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)
266 /* used as NULL-terminated list */
267 typedef struct _DevCursorNode {
270 struct _DevCursorNode* next;
271 } DevCursNodeRec, *DevCursNodePtr, *DevCursorList;
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;
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;
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 */
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;
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 */
330 unsigned rootlessUnhittable:1; /* doesn't hit-test */
334 typedef struct _IEvent {
335 InternalEvent *event;
338 } IEventRec, *IEventPtr;
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)
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)
361 #define GESTURE_FILTER_MASK_ALL 0x3f//(FlickFilterMask | PanFilterMask | PinchRotationFilterMask | TapFilterMask |TapNHoldFilterMask | HoldFilterMask)
363 #define WFlickFilterMask 0x01//(1 << 0)
364 #define WTapFilterMask 0x02//(1 << 1)
365 #define WHoldFilterMask 0x04//(1 << 2)
366 #define WPalmFlickFilterMask 0x08//(1 << 3)
368 #define GESTURE_WATCH_FILTER_MASK_ALL 0x07//(WFlickFilterMask | WTapFilterMask | WHoldFilterMask )
370 #define MTSYNC_FLAG_TOUCH 0x01//(1 << 0)
371 #define MTSYNC_FLAG_ROTARY 0x02//(1 << 1)
373 #define PALM_HOLD_TIME_THRESHOLD 150
375 typedef struct _tagTouchStatus
377 int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
386 Time ptime; //press time
387 Time mtime; //motion time
388 Time rtime; //current/previous release time
391 typedef struct _tagCurrentTouchStatus
393 int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
398 typedef struct _tagPalmDrvStatus
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;
409 typedef struct _GestureDeviceRec
412 int version; /* Driver version */
413 OsTimerPtr device_setting_timer;
417 int flick_pressed_point;
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
433 int singletap_threshold;
434 int doubletap_threshold;
435 int tripletap_threshold;
437 int num_tap_repeated;
439 double hold_area_threshold;
440 int hold_move_threshold;
441 int hold_time_threshold;
443 int palm_flick_time_threshold;
444 int palm_flick_max_tmajor_threshold;
445 int palm_flick_min_tmajor_threshold;
446 char *factory_cmdname;
448 int max_mt_tmajor[MAX_MT_DEVICES];
452 DeviceIntPtr hwkey_dev;
454 DeviceIntPtr rotary_dev;
455 unsigned char mtsync_flag;
456 int mtsync_total_count;
458 DeviceIntPtr power_device;
466 GestureGrabEventPtr GrabEvents;
467 Mask lastSelectedMask;
468 Window lastSelectedWin;
470 EventHandleType ehtype;
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;
483 PalmMiscInfo palm_misc;
490 pixman_region16_t area;
491 pixman_region16_t finger_rects[MAX_MT_DEVICES];
498 TouchStatus fingers[MAX_MT_DEVICES];
500 int event_sum[MAX_MT_DEVICES];
501 uint32_t recognized_gesture;
502 uint32_t filter_mask;
504 DeviceIntPtr this_device;
505 DeviceIntPtr mt_devices[MAX_MT_DEVICES];
506 DeviceIntPtr master_pointer;
507 DeviceIntPtr xtest_pointer;
509 WindowPtr anr_window;
510 } GestureDeviceRec, *GestureDevicePtr ;