tizen 2.3.1 release
[adaptation/xorg/driver/xserver-xorg-input-gesture.git] / wearable / src / gesture.h
old mode 100755 (executable)
new mode 100644 (file)
similarity index 69%
rename from src/gesture.h
rename to wearable/src/gesture.h
index 8f7bed0..e5c59ae
@@ -41,12 +41,25 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #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"
@@ -68,9 +81,9 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #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;
@@ -93,54 +106,51 @@ enum
        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;
 
@@ -163,12 +173,12 @@ enum EventType
     /*
     ...
     */
+    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 */
@@ -176,19 +186,20 @@ struct _DeviceEvent
     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 */
@@ -202,9 +213,10 @@ struct _DeviceEvent
         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;
@@ -220,6 +232,20 @@ struct _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 */
@@ -229,6 +255,7 @@ union _InternalEvent {
        } any;
        AnyEvent any_event;
        DeviceEvent device_event;
+       TouchCancelEvent touch_cancel_event;
 };
 
 #define wUseDefault(w,field,def)       ((w)->optional ? (w)->optional->field : def)
@@ -333,6 +360,18 @@ enum
 
 #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
@@ -349,6 +388,24 @@ typedef struct _tagTouchStatus
        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;
@@ -356,6 +413,49 @@ typedef struct _GestureDeviceRec
        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;
@@ -364,12 +464,29 @@ typedef struct _GestureDeviceRec
        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];
 
@@ -388,6 +505,8 @@ typedef struct _GestureDeviceRec
        DeviceIntPtr mt_devices[MAX_MT_DEVICES];
        DeviceIntPtr master_pointer;
        DeviceIntPtr xtest_pointer;
+
+       WindowPtr anr_window;
 } GestureDeviceRec, *GestureDevicePtr ;
 
 #endif//_GESTURE_H_