#define HAVE_PROPERTIES 1
#endif
+/**
+ * If there's touch event in pointed window and there's no reponse, we just assume that client looks like deadlock.
+ * In this case, we will make a popup window and terminate application.
+ * To support this feature, we use SUPPORT_ANR_WITH_INPUT_EVENT flag.
+ */
+#define SUPPORT_ANR_WITH_INPUT_EVENT
+
+#define GESTURE_RECOGNIZER_ONOFF "GESTURE_RECOGNIZER_ONOFF"
+#define GESTURE_PALM_REJECTION_MODE "GESTURE_PALM_REJECTION_MODE"
+#define CHECK_APPLICATION_NOT_RESPONSE_IN_INPUT_EVENT "_CHECK_APPLICATION_NOT_RESPONSE_IN_INPUT_EVENT_"
+#define ANR_EVENT_WINDOW "_ANR_EVENT_WINDOW_"
+
+
#define SYSCALL(call) while (((call) == -1) && (errno == EINTR))
#define RootWindow(dev) dev->spriteInfo->sprite->spriteTrace[0]
#define CLIENT_BITS(id) ((id) & RESOURCE_CLIENT_MASK)
#define CLIENT_ID(id) ((int)(CLIENT_BITS(id) >> CLIENTOFFSET))
-#define MAX_MT_DEVICES 3
+#define MAX_MT_DEVICES 2
#define GESTURE_EQ_SIZE 256
#define GESTURE_RECOGNIZER_ONOFF "GESTURE_RECOGNIZER_ONOFF"
#define SINGLE_TAP_TIMEOUT 100//in msec
#define DOUBLE_TAP_TIMEOUT 250//in msec
-//pinch rotation
-#define ZOOM_THRESHOLD 0.05f
-#define ANGLE_THRESHOLD 0.1f
+//palm
+#define PALM_HORIZ_ARRAY_COUNT 3
+#define PALM_VERTI_ARRAY_COUNT 4
typedef int XFixed;
typedef double XDouble;
FLICK_NORTHWESTWARD
};
-#define PAN_AREA_THRESHOLD 10000//=100pixel * 100pixel
-#define PAN_MOVE_THRESHOLD 5//pixel
-#define PAN_UPDATE_MOVE_THRESHOLD 3//pixel
-#define PAN_TIME_THRESHOLD 300//ms
-
-#define PINCHROTATION_TIME_THRESHOLD 500//ms
-#define PINCHROTATION_INIT_DIST_THRESHOLD 25.0f
-#define PINCHROTATION_INIT_ANGLE_THRESHOLD 0.2f
-#define PINCHROTATION_DIST_THRESHOLD 25.0f
-#define PINCHROTATION_ANGLE_THRESHOLD 0.2f
-
-#define HOLD_AREA_THRESHOLD 2500//=50pixel * 50pixel
-#define HOLD_MOVE_THRESHOLD 10//pixel
-#define HOLD_TIME_THRESHOLD 500//ms
+enum
+{
+ FLICK_POINT_NONE = 0,
+ FLICK_POINT_UP,
+ FLICK_POINT_RIGHT,
+ FLICK_POINT_DOWN,
+ FLICK_POINT_LEFT,
+ FLICK_POINT_MAX
+};
#define TAP_AREA_THRESHOLD 10000//= 100pixel * 100pixel
-#define TAP_MOVE_THRESHOLD 70//pixel
-#define SGL_TAP_TIME_THRESHOLD 200//ms
+#define TAP_MOVE_THRESHOLD 35//pixel
+#define SGL_TAP_TIME_THRESHOLD 300//ms
#define DBL_TAP_TIME_THRESHOLD 200//ms
-#define MAX_TAP_REPEATS 3
-
-#define TAPNHOLD_AREA_THRESHOLD 4900//= 70pixel * 70pixel
-#define TAPNHOLD_MOVE_THRESHOLD 50//pixel
-#define TAPNHOLD_TAP_TIME_THRESHOLD 200//ms
-#define TAPNHOLD_INTV_TIME_THRESHOLD 200//ms
-#define TAPNHOLD_HOLD_TIME_THRESHOLD 500//ms
+#define MAX_TAP_REPEATS 3
#define FLICK_AREA_THRESHOLD 22500//=150pixel * 150pixel
#define FLICK_AREA_TIMEOUT 700//ms
#define FLICK_MOVE_THRESHOLD 100//pixel
#define FLICK_MOVE_TIMEOUT 1000//ms
+#define FLICK_FALSE_Y_DIFF_COUNT 7
+#define FLICK_FALSE_X_DIFF_COUNT 5
+
+#define PALM_FLICK_DETECT_TIMEOUT 1000//ms
+#define PALM_FLICK_MAX_TOUCH_MAJOR 130
-#define RAD_90DEG M_PI_2
-#define RAD_180DEG M_PI
-#define RAD_270DEG (M_PI_2 * 3)
-#define RAD_360DEG (M_PI * 2)
-#define rad2degree(r) ((r) * 180/M_PI)
+#define AXIS_LABEL_PROP_ABS_MT_TRACKING_ID "Abs MT Tracking ID"
+#define AXIS_LABEL_PROP_ABS_MT_SLOT "Abs MT Slot"
+#define AXIS_LABEL_PROP_ABS_MT_TOUCH_MAJOR "Abs MT Touch Major"
+#define AXIS_LABEL_PROP_ABS_MT_TOUCH_MINOR "Abs MT Touch Minor"
+#define AXIS_LABEL_PROP_ABS_MT_PALM "Abs MT Palm/MT Sumsize"
typedef enum _MTSyncType
{
MTOUCH_FRAME_SYNC_END,
- MTOUCH_FRAME_SYNC_BEGIN
+ MTOUCH_FRAME_SYNC_BEGIN,
+ MTOUCH_FRAME_SYNC_UPDATE,
+ ROTARY_FRAME_SYNC_END,
+ ROTARY_FRAME_SYNC_BEGIN
} MTSyncType;
typedef enum _EventHandleType
{
- KEEP_EVENTS,
PROPAGATE_EVENTS,
+ KEEP_EVENTS,
IGNORE_EVENTS
} EventHandleType;
/*
...
*/
+ ET_TouchCancel = 31,
ET_MTSync = 0x7E,
ET_Internal = 0xFF /* First byte */
};
-struct _DeviceEvent
-{
+struct _DeviceEvent {
unsigned char header; /**< Always ET_Internal */
enum EventType type; /**< One of EventType */
int length; /**< Length in bytes */
int deviceid; /**< Device to post this event for */
int sourceid; /**< The physical source device */
union {
- uint32_t button; /**< Button number */
+ uint32_t button; /**< Button number (also used in pointer emulating
+ touch events) */
uint32_t key; /**< Key code */
} detail;
+ uint32_t touchid; /**< Touch ID (client_id) */
int16_t root_x; /**< Pos relative to root window in integral data */
float root_x_frac; /**< Pos relative to root window in frac part */
int16_t root_y; /**< Pos relative to root window in integral part */
float root_y_frac; /**< Pos relative to root window in frac part */
- uint8_t buttons[(MAX_BUTTONS + 7)/8]; /**< Button mask */
+ uint8_t buttons[(MAX_BUTTONS + 7) / 8]; /**< Button mask */
struct {
- uint8_t mask[(MAX_VALUATORS + 7)/8]; /**< Valuator mask */
- uint8_t mode[(MAX_VALUATORS + 7)/8]; /**< Valuator mode (Abs or Rel)*/
- int32_t data[MAX_VALUATORS]; /**< Valuator data */
- int32_t data_frac[MAX_VALUATORS]; /**< Fractional part for data */
+ uint8_t mask[(MAX_VALUATORS + 7) / 8];/**< Valuator mask */
+ uint8_t mode[(MAX_VALUATORS + 7) / 8];/**< Valuator mode (Abs or Rel)*/
+ double data[MAX_VALUATORS]; /**< Valuator data */
} valuators;
struct {
uint32_t base; /**< XKB base modifiers */
uint8_t locked; /**< XKB locked group */
uint8_t effective;/**< XKB effective group */
} group;
- Window root; /**< Root window of the event */
+ Window root; /**< Root window of the event */
int corestate; /**< Core key/button state BEFORE the event */
int key_repeat; /**< Internally-generated key repeat event */
+ uint32_t flags; /**< Flags to be copied into the generated event */
};
typedef struct _AnyEvent AnyEvent;
int y;
};
+typedef struct _TouchCancelEvent TouchCancelEvent;
+struct _TouchCancelEvent {
+ unsigned char header; /**< Always ET_Internal */
+ enum EventType type; /**< ET_TouchOwnership */
+ int length; /**< Length in bytes */
+ Time time; /**< Time in ms */
+ int deviceid; /**< Device to post this event for */
+ int sourceid; /**< The physical source device */
+ uint32_t resource; /**< Provoking grab or event selection */
+ uint32_t flags; /**< Flags to be copied into the generated event */
+};
+
+
+
union _InternalEvent {
struct {
unsigned char header; /**< Always ET_Internal */
} any;
AnyEvent any_event;
DeviceEvent device_event;
+ TouchCancelEvent touch_cancel_event;
};
#define wUseDefault(w,field,def) ((w)->optional ? (w)->optional->field : def)
#define GESTURE_FILTER_MASK_ALL 0x3f//(FlickFilterMask | PanFilterMask | PinchRotationFilterMask | TapFilterMask |TapNHoldFilterMask | HoldFilterMask)
+#define WFlickFilterMask 0x01//(1 << 0)
+#define WTapFilterMask 0x02//(1 << 1)
+#define WHoldFilterMask 0x04//(1 << 2)
+#define WPalmFlickFilterMask 0x08//(1 << 3)
+
+#define GESTURE_WATCH_FILTER_MASK_ALL 0x07//(WFlickFilterMask | WTapFilterMask | WHoldFilterMask )
+
+#define MTSYNC_FLAG_TOUCH 0x01//(1 << 0)
+#define MTSYNC_FLAG_ROTARY 0x02//(1 << 1)
+
+#define PALM_HOLD_TIME_THRESHOLD 150
+
typedef struct _tagTouchStatus
{
int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
Time rtime; //current/previous release time
} TouchStatus;
+typedef struct _tagCurrentTouchStatus
+{
+ int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
+ int cx; //current x
+ int cy; //current y
+} CurTouchStatus;
+
+typedef struct _tagPalmDrvStatus
+{
+ int enabled;
+ int scrn_width;
+ int scrn_height;
+ unsigned int half_scrn_area_size;
+ int horiz_coord[PALM_HORIZ_ARRAY_COUNT];
+ int verti_coord[PALM_VERTI_ARRAY_COUNT];
+} PalmMiscInfo, *PalmMiscInfoPtr;
+
+
typedef struct _GestureDeviceRec
{
char *device;
OsTimerPtr device_setting_timer;
int is_active;
+ int power_pressed;
+ int flick_pressed_point;
+ int flick_direction;
+
+ int hwkeycode_flick_down;
+ int hwkeycode_flick_up;
+ int shutdown_keycode;
+ int flick_press_area;
+ int flick_press_area_left;
+ int flick_press_area_left_right;
+ int flick_minimum_height;
+ int activate_flick_down;//up to down
+ int activate_flick_up;//down to up
+ int activate_flick_right;//left to right
+ int screen_width;
+ int screen_height;
+
+ int singletap_threshold;
+ int doubletap_threshold;
+ int tripletap_threshold;
+
+ int num_tap_repeated;
+
+ double hold_area_threshold;
+ int hold_move_threshold;
+ int hold_time_threshold;
+
+ int palm_flick_time_threshold;
+ int palm_flick_max_tmajor_threshold;
+ int palm_flick_min_tmajor_threshold;
+ char *factory_cmdname;
+
+ int max_mt_tmajor[MAX_MT_DEVICES];
+
+ int hwkey_id;
+ char *hwkey_name;
+ DeviceIntPtr hwkey_dev;
+ int rotary_id;
+ DeviceIntPtr rotary_dev;
+ unsigned char mtsync_flag;
+ int mtsync_total_count;
+
+ DeviceIntPtr power_device;
WindowPtr pRootWin;
Window gestureWin;
Mask grabMask;
Mask eventMask;
GestureGrabEventPtr GrabEvents;
+ Mask lastSelectedMask;
+ Window lastSelectedWin;
EventHandleType ehtype;
IEventPtr EQ;
int headEQ;
int tailEQ;
+ int hold_detector_activate;
+ int has_hold_grabmask;
+ pixman_region16_t chold_area;
+ CurTouchStatus cts[MAX_MT_DEVICES];
+ CurTouchStatus last_touches[MAX_MT_DEVICES];
+ Bool touch_cancel_status;
+ Bool hold_detected;
+
+ PalmMiscInfo palm_misc;
+ int tmajor_idx;
+ int tminor_idx;
+ int tpalm_idx;
+ int mt_px_idx;
+ int mt_py_idx;
+
pixman_region16_t area;
pixman_region16_t finger_rects[MAX_MT_DEVICES];
DeviceIntPtr mt_devices[MAX_MT_DEVICES];
DeviceIntPtr master_pointer;
DeviceIntPtr xtest_pointer;
+
+ WindowPtr anr_window;
} GestureDeviceRec, *GestureDevicePtr ;
#endif//_GESTURE_H_