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
148 typedef enum _EventHandleType
155 typedef enum _ErrorStatus
175 ET_Internal = 0xFF /* First byte */
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 */
186 uint32_t button; /**< Button number (also used in pointer emulating
188 uint32_t key; /**< Key code */
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 */
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 */
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 */
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 */
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 */
219 typedef struct _AnyEvent AnyEvent;
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 */
232 union _InternalEvent {
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. */
240 DeviceEvent device_event;
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)
248 /* used as NULL-terminated list */
249 typedef struct _DevCursorNode {
252 struct _DevCursorNode* next;
253 } DevCursNodeRec, *DevCursNodePtr, *DevCursorList;
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;
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;
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 */
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;
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 */
312 unsigned rootlessUnhittable:1; /* doesn't hit-test */
316 typedef struct _IEvent {
317 InternalEvent *event;
320 } IEventRec, *IEventPtr;
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)
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)
343 #define GESTURE_FILTER_MASK_ALL 0x3f//(FlickFilterMask | PanFilterMask | PinchRotationFilterMask | TapFilterMask |TapNHoldFilterMask | HoldFilterMask)
345 #define WFlickFilterMask 0x01//(1 << 0)
346 #define WTapFilterMask 0x02//(1 << 1)
347 #define WHoldFilterMask 0x04//(1 << 2)
348 #define WPalmFlickFilterMask 0x08//(1 << 3)
350 #define GESTURE_WATCH_FILTER_MASK_ALL 0x07//(WFlickFilterMask | WTapFilterMask | WHoldFilterMask )
352 #define PALM_HOLD_TIME_THRESHOLD 150
354 typedef struct _tagTouchStatus
356 int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
365 Time ptime; //press time
366 Time mtime; //motion time
367 Time rtime; //current/previous release time
370 typedef struct _tagCurrentTouchStatus
372 int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
377 typedef struct _tagPalmDrvStatus
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;
388 typedef struct _GestureDeviceRec
391 int version; /* Driver version */
392 OsTimerPtr device_setting_timer;
396 int flick_pressed_point;
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
412 int singletap_threshold;
413 int doubletap_threshold;
414 int tripletap_threshold;
416 int num_tap_repeated;
418 double hold_area_threshold;
419 int hold_move_threshold;
420 int hold_time_threshold;
422 int palm_flick_time_threshold;
423 int palm_flick_max_tmajor_threshold;
424 int palm_flick_min_tmajor_threshold;
425 char *factory_cmdname;
427 int max_mt_tmajor[MAX_MT_DEVICES];
431 DeviceIntPtr hwkey_dev;
432 MTSyncType mtsync_status;
433 int mtsync_total_count;
435 DeviceIntPtr power_device;
443 GestureGrabEventPtr GrabEvents;
444 Mask lastSelectedMask;
445 Window lastSelectedWin;
447 EventHandleType ehtype;
452 int hold_detector_activate;
453 int has_hold_grabmask;
454 pixman_region16_t chold_area;
455 CurTouchStatus cts[MAX_MT_DEVICES];
458 PalmMiscInfo palm_misc;
465 pixman_region16_t area;
466 pixman_region16_t finger_rects[MAX_MT_DEVICES];
473 TouchStatus fingers[MAX_MT_DEVICES];
475 int event_sum[MAX_MT_DEVICES];
476 uint32_t recognized_gesture;
477 uint32_t filter_mask;
479 DeviceIntPtr this_device;
480 DeviceIntPtr mt_devices[MAX_MT_DEVICES];
481 DeviceIntPtr master_pointer;
482 DeviceIntPtr xtest_pointer;
484 WindowPtr anr_window;
485 } GestureDeviceRec, *GestureDevicePtr ;