tizen 2.4 release accepted/tizen_2.4_mobile tizen_2.4 accepted/tizen/2.4/mobile/20151029.042000 submit/tizen_2.4/20151028.062438 tizen_2.4_mobile_release
authorjk7744.park <jk7744.park@samsung.com>
Sat, 24 Oct 2015 06:30:59 +0000 (15:30 +0900)
committerjk7744.park <jk7744.park@samsung.com>
Sat, 24 Oct 2015 06:30:59 +0000 (15:30 +0900)
mobile/COPYING [changed mode: 0755->0644]
mobile/configure.ac
mobile/src/Makefile.am
mobile/src/gesture.c
mobile/src/gesture.h
packaging/xorg-x11-drv-gesture.spec
wearable/configure.ac
wearable/src/Makefile.am
wearable/src/gesture.c [changed mode: 0644->0755]
wearable/src/gesture.h [changed mode: 0644->0755]

old mode 100755 (executable)
new mode 100644 (file)
index 16c2d38..4bcc73a 100644 (file)
@@ -61,6 +61,10 @@ AC_ARG_WITH([sdkdir], [],
     [sdkdir=`$PKG_CONFIG --variable=sdkdir xorg-server`])
 AC_SUBST([sdkdir])
 
+# ttrace support
+PKG_CHECK_MODULES(TTRACE, [ttrace],
+               AC_DEFINE(ENABLE_TTRACE, 1, [ttrace available]));
+
 # Checks for libraries.
 
 # Checks for header files.
index 695f833..3507345 100644 (file)
@@ -1,4 +1,4 @@
-#  Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved 
+#  Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
 #
 #  Permission to use, copy, modify, distribute, and sell this software and its
 #  documentation for any purpose is hereby granted without fee, provided that
 # -avoid-version prevents gratuitous .0.0.0 version numbers on the end
 # _ladir passes a dummy rpath to libtool so the thing will actually link
 # TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc.
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(XORG_CFLAGS) $(TTRACE_CFLAGS)
 
 @DRIVER_NAME@_drv_la_LTLIBRARIES = @DRIVER_NAME@_drv.la
-@DRIVER_NAME@_drv_la_LDFLAGS = -module -avoid-version
+@DRIVER_NAME@_drv_la_LDFLAGS = -module -avoid-version $(TTRACE_LIBS)
 @DRIVER_NAME@_drv_ladir = @inputdir@
 
 INCLUDES=-I$(top_srcdir)/include/
 
 @DRIVER_NAME@_drv_la_SOURCES = @DRIVER_NAME@.c \
-                               @DRIVER_NAME@.h 
+                               @DRIVER_NAME@.h
 
index c85ffed..1837671 100644 (file)
@@ -74,6 +74,10 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "gesture.h"
 #include <xorg/mi.h>
 #include <xdbg.h>
+#ifdef PANORAMIX
+#include <xorg/panoramiX.h>
+#include <xorg/panoramiXsrv.h>
+#endif
 
 #define MGEST  XDBG_M('G','E','S','T')
 
@@ -95,8 +99,17 @@ extern char *strcasestr(const char *s, const char *find);
 extern ScreenPtr miPointerCurrentScreen(void);
 extern EventQueuePtr mieqGetEventQueuePtr();
 
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+static void GestureAlloc(int capability);
+static void GestureDeAlloc(void);
+static void GesturePalmAlloc(int capability);
+static void GesturePalmDeAlloc(void);
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
+
 static Bool GestureIsEventInMIEQ(int finger_index, enum EventType type);
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
 static int GestureGetFingerIndexFromDevice(DeviceIntPtr device);
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 static int GestureGetDeviceIdFromFingerIndex(int finger_index);
 static Bool GestureIsPalmEventInMIEQ(void);
 static Bool GestureIsPalmEvent(InternalEvent *event);
@@ -134,6 +147,10 @@ void GestureCbEventsGrabbed(Mask *pGrabMask, GestureGrabEventPtr *pGrabEvent);
 void GestureCbEventsSelected(Window win, Mask *pEventMask);
 WindowPtr GestureGetEventsWindow(void);
 static Bool GestureHasFingersEvents(int eventType);
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+int GestureGetTouchIndex(int deviceid, int touchid, int evtype);
+int GestureFindTouchIndex(int deviceid, int touchid, int evtype);
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
 //Enqueued event handlers and enabler/disabler
 static ErrorStatus GestureEnableEventHandler(InputInfoPtr pInfo);
@@ -146,17 +163,16 @@ void GestureHandleMotionEvent(int screen_num, InternalEvent *ev, DeviceIntPtr de
 void GestureHandleKeyPressEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device);
 void GestureHandleKeyReleaseEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device);
 
+void GestureHandleRawButtonPressEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device);
+void GestureHandleRawButtonReleaseEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device);
+void GestureHandleRawMotionEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device);
+
 static void GestureRegisterDeviceInfo(DeviceIntPtr device);
 
 //Gesture recognizer helper
-#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 21
-static Bool PointInBorderSize(WindowPtr pWin, int x, int y);
-#endif
+Bool PointInBorderSize(WindowPtr pWin, int x, int y);
 static WindowPtr GestureWindowOnXY(int x, int y);
 Bool GestureHasFingerEventMask(int eventType, int num_finger);
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-static int get_distance(int x1, int y1, int x2, int y2);
-#endif
 static double get_angle(int x1, int y1, int x2, int y2);
 
 //Gesture recognizer and handlers
@@ -166,9 +182,6 @@ void GestureRecognize_GroupPan(int type, InternalEvent *ev, DeviceIntPtr device,
 void GestureRecognize_GroupTap(int type, InternalEvent *ev, DeviceIntPtr device, int idx, int timer_expired);
 void GestureRecognize_GroupTapNHold(int type, InternalEvent *ev, DeviceIntPtr device, int idx, int timer_expired);
 void GestureRecognize_GroupHold(int type, InternalEvent *ev, DeviceIntPtr device, int idx, int timer_expired);
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-int GestureBezelAngleRecognize(int type, int distance, double angle);
-#endif
 void GestureHandleGesture_Flick(int num_of_fingers, int distance, Time duration, int direction);
 void GestureHandleGesture_Tap(int num_finger, int tap_repeat, int cx, int cy);
 void GestureHandleGesture_PinchRotation(int num_of_fingers, double zoom, double angle, int distance, int cx, int cy, int kinds);
@@ -189,6 +202,7 @@ static void GesturePalmDataUpdate(int idx, int type, InternalEvent *ev, DeviceIn
 static void GesturePalmUpdateAreaInfo(int type, int idx);
 void GesturePalmRecognize(int type, InternalEvent *ev, DeviceIntPtr device);
 
+TouchPointInfoPtr GestureTouchFindByClientID(DeviceIntPtr dev);
 void GestureGenerateTouchCancelEvent(void);
 
 static void GestureDPMSCallback(CallbackListPtr *pcbl, void *unused, void *calldata);
@@ -214,6 +228,8 @@ static Atom prop_anr_event_window = None;
 static Window prop_anr_event_window_xid = None;
 #endif
 
+static Atom prop_gesture_window_stack_changed = None;
+
 GestureDevicePtr g_pGesture = NULL;
 _X_EXPORT InputDriverRec GESTURE = {
     1,
@@ -306,18 +322,64 @@ _GestureFindANRWindow(DeviceIntPtr device)
 }
 #endif
 
-#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 21
+#ifdef PANORAMIX
 static Bool
+XineramaSetWindowPntrs(DeviceIntPtr pDev, WindowPtr pWin)
+{
+    SpritePtr pSprite = pDev->spriteInfo->sprite;
+
+    if (pWin == screenInfo.screens[0]->root) {
+        int i;
+
+        FOR_NSCREENS(i)
+            pSprite->windows[i] = screenInfo.screens[i]->root;
+    }
+    else {
+        PanoramiXRes *win;
+        int rc, i;
+
+        rc = dixLookupResourceByType((void **) &win, pWin->drawable.id,
+                                     XRT_WINDOW, serverClient, DixReadAccess);
+        if (rc != Success)
+            return FALSE;
+
+        FOR_NSCREENS(i) {
+            rc = dixLookupWindow(pSprite->windows + i, win->info[i].id,
+                                 serverClient, DixReadAccess);
+            if (rc != Success)  /* window is being unmapped */
+                return FALSE;
+        }
+    }
+    return TRUE;
+}
+#endif
+
+Bool
 PointInBorderSize(WindowPtr pWin, int x, int y)
 {
     BoxRec box;
-    if (pixman_region_contains_point (&pWin->borderSize, x, y, &box))
-    {
+
+    if (RegionContainsPoint(&pWin->borderSize, x, y, &box))
         return TRUE;
+
+#ifdef PANORAMIX
+    if (!noPanoramiXExtension &&
+        XineramaSetWindowPntrs(inputInfo.pointer, pWin)) {
+        SpritePtr pSprite = inputInfo.pointer->spriteInfo->sprite;
+        int i;
+
+        FOR_NSCREENS_FORWARD_SKIP(i) {
+            if (RegionContainsPoint(&pSprite->windows[i]->borderSize,
+                                    x + screenInfo.screens[0]->x -
+                                    screenInfo.screens[i]->x,
+                                    y + screenInfo.screens[0]->y -
+                                    screenInfo.screens[i]->y, &box))
+                return TRUE;
+        }
     }
+#endif
     return FALSE;
 }
-#endif
 
 static WindowPtr
 GestureWindowOnXY(int x, int y)
@@ -363,9 +425,8 @@ GestureWindowOnXY(int x, int y)
                pSprite->spriteTrace = realloc(pSprite->spriteTrace,
                                    pSprite->spriteTraceSize*sizeof(WindowPtr));
                if (!pSprite->spriteTrace) {
-                   return NULL;
+                       return NULL;
                }
-
            }
            pSprite->spriteTrace[pSprite->spriteTraceGood++] = pWin;
            pWin = pWin->firstChild;
@@ -406,33 +467,6 @@ GestureHasFingerEventMask(int eventType, int num_finger)
        return ret;
 }
 
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-static int
-get_distance(int _x1, int _y1, int _x2, int _y2)
-{
-       int xx, yy;
-       xx = ABS(_x2 - _x1);
-       yy = ABS(_y2 - _y1);
-
-       if(xx && yy)
-       {
-               return (int)sqrt(pow(xx, 2) + pow(yy, 2));
-       }
-       else if(xx)
-       {
-               return yy;
-       }
-       else if(yy)
-       {
-               return xx;
-       }
-       else
-       {
-               return 0;
-       }
-}
-#endif//_F_SUPPORT_BEZEL_FLICK_
-
 static double
 get_angle(int _x1, int _y1, int _x2, int _y2)
 {
@@ -490,6 +524,58 @@ get_angle(int _x1, int _y1, int _x2, int _y2)
      }
 }
 
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+int
+GestureGetTouchIndex(int deviceid, int touchid, int evtype)
+{
+    int idx=0, i=0;
+
+    for (i=0; i<g_pGesture->num_mt_devices; i++)
+    {
+        if (g_pGesture->fingers[i].touchid == touchid)
+        {
+            return i;
+        }
+    }
+    ErrorF("[GestureGetTouchIndex] Failed to get touch index, devid: %d, touchid: %d, evsystem: %d\n", deviceid, touchid, evtype);
+    return -1;
+}
+
+int
+GestureFindTouchIndex(int deviceid, int touchid, int evtype)
+{
+    int idx=-1, i=0;
+
+    if (deviceid == g_pGesture->master_pointer->id)
+        return -1;
+
+    for (i=0; i<g_pGesture->num_mt_devices; i++)
+    {
+        if (evtype == ET_TouchBegin)
+        {
+            if (g_pGesture->fingers[i].status == BTN_RELEASED)
+            {
+                g_pGesture->fingers[i].status = BTN_PRESSED;
+                g_pGesture->fingers[i].touchid = touchid;
+                return i;
+            }
+        }
+        else if (evtype == ET_TouchUpdate || evtype == ET_TouchEnd)
+        {
+            if (g_pGesture->fingers[i].touchid == touchid)
+            {
+                g_pGesture->fingers[i].status = (evtype == ET_TouchEnd)?BTN_RELEASED:BTN_MOVING;
+                return i;
+            }
+        }
+    }
+    XDBG_WARNING(MGEST, "Failed to find touch index, devid: %d, touchid: %d, evtype: %d\n", deviceid, touchid, evtype);
+    return -1;
+}
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
+
+
+
 void
 GestureHandleGesture_Flick(int num_of_fingers, int distance, Time duration, int direction)
 {
@@ -509,12 +595,6 @@ GestureHandleGesture_Flick(int num_of_fingers, int distance, Time duration, int
                if(direction == FLICK_NORTHWARD || direction == FLICK_SOUTHWARD)
                        g_pGesture->recognized_palm |= PalmFlickVertiFilterMask;
        }
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-       else if(num_of_fingers == 1)
-       {
-               g_pGesture->bezel_recognized_mask |= BezelFlickFilterMask;
-       }
-#endif
        else
                g_pGesture->recognized_gesture |= FlickFilterMask;
 
@@ -830,7 +910,11 @@ static void GestureHoldDetector(int type, InternalEvent *ev, DeviceIntPtr device
 
                        //Initialize a set of variables
                        num_pressed = 0;
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
                        memset(&g_pGesture->cts, 0, sizeof(g_pGesture->cts));
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+                       memset(g_pGesture->cts, 0, g_pGesture->num_mt_devices*sizeof(CurTouchStatus));
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
                        pixman_region_init(&g_pGesture->chold_area);
 #ifdef __HOLD_DETECTOR_DEBUG__
                        XDBG_DEBUG(MGEST, "[%d] Initialize...\n", __LINE__);
@@ -846,7 +930,7 @@ static void GestureHoldDetector(int type, InternalEvent *ev, DeviceIntPtr device
                        XDBG_DEBUG(MGEST, "has_hold_grabmask=0 and g_pGesture->hold_detector_activate=0\n");
 #endif//__HOLD_DETECTOR_DEBUG__
                        return;
-               }               
+               }
        }
 
        if( IGNORE_EVENTS == g_pGesture->ehtype ||
@@ -857,7 +941,7 @@ static void GestureHoldDetector(int type, InternalEvent *ev, DeviceIntPtr device
 #endif//__HOLD_DETECTOR_DEBUG__
                return;
        }
-
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        for( i = 0 ; i < g_pGesture->num_mt_devices ; i++ )
        {
                if( device->id == g_pGesture->mt_devices[i]->id )
@@ -867,10 +951,14 @@ static void GestureHoldDetector(int type, InternalEvent *ev, DeviceIntPtr device
                }
        }
        if( (idx < 0) || ((MAX_MT_DEVICES-1) < idx )) return;
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       idx = GestureGetTouchIndex(device->id, ev->device_event.touchid, type);
+       if( (idx < 0) || ((g_pGesture->num_mt_devices -1) < idx )) return;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
        switch( type )
        {
-               case ET_ButtonPress:
+               case GESTURE_TOUCH_PRESS:
                        g_pGesture->cts[idx].status = BTN_PRESSED;
                        g_pGesture->cts[idx].cx = ev->device_event.root_x;
                        g_pGesture->cts[idx].cy = ev->device_event.root_y;
@@ -905,7 +993,7 @@ static void GestureHoldDetector(int type, InternalEvent *ev, DeviceIntPtr device
                        }
                        break;
 
-               case ET_Motion:
+               case GESTURE_TOUCH_MOTION:
                        if(BTN_RELEASED == g_pGesture->cts[idx].status)
                                return;
 
@@ -939,7 +1027,7 @@ static void GestureHoldDetector(int type, InternalEvent *ev, DeviceIntPtr device
                        }
                        break;
 
-               case ET_ButtonRelease:
+               case GESTURE_TOUCH_RELEASE:
                        g_pGesture->cts[idx].status = BTN_RELEASED;
                        g_pGesture->cts[idx].cx = ev->device_event.root_x;
                        g_pGesture->cts[idx].cy = ev->device_event.root_y;
@@ -1001,12 +1089,7 @@ GestureRecognize_GroupPinchRotation(int type, InternalEvent *ev, DeviceIntPtr de
        static Time base_time = 0;
        Time current_time;
 
-       if(g_pGesture->recognized_palm || g_pGesture->enqueue_fulled == 1 || g_pGesture->hold_detected
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-                       || g_pGesture->bezel_recognized_mask)
-#else
-                       )
-#endif
+       if(g_pGesture->recognized_palm || g_pGesture->enqueue_fulled == 1 || g_pGesture->hold_detected)
                goto cleanup_pinchrotation;
 
        if( timer_expired )
@@ -1028,7 +1111,7 @@ GestureRecognize_GroupPinchRotation(int type, InternalEvent *ev, DeviceIntPtr de
 
        switch( type )
        {
-               case ET_ButtonPress:
+                case GESTURE_TOUCH_PRESS:
                        g_pGesture->fingers[idx].flags |= PressFlagPinchRotation;
 
                        if( g_pGesture->num_pressed < 2 )
@@ -1074,7 +1157,7 @@ GestureRecognize_GroupPinchRotation(int type, InternalEvent *ev, DeviceIntPtr de
 #endif//__DETAIL_DEBUG__
                        break;
 
-               case ET_Motion:
+               case GESTURE_TOUCH_MOTION:
                        if( !(g_pGesture->fingers[idx].flags & PressFlagPinchRotation) )
                                break;
 
@@ -1187,7 +1270,7 @@ gesture_begin_handle:
                        }
                        break;
 
-               case ET_ButtonRelease:
+               case GESTURE_TOUCH_RELEASE:
                        if( state != GestureEnd && num_pressed >= 2)
                        {
 #ifdef __DETAIL_DEBUG__
@@ -1268,17 +1351,12 @@ GestureRecognize_GroupFlick(int type, InternalEvent *ev, DeviceIntPtr device, in
        int area_size;
        int flicked = 0;
 
-       if(g_pGesture->recognized_palm || g_pGesture->enqueue_fulled == 1 || g_pGesture->hold_detected
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-               || g_pGesture->bezel_recognized_mask)
-#else
-               )
-#endif
+       if(g_pGesture->recognized_palm || g_pGesture->enqueue_fulled == 1 || g_pGesture->hold_detected)
                goto cleanup_flick;
 
        switch( type )
        {
-               case ET_ButtonPress:
+                case GESTURE_TOUCH_PRESS:
                        g_pGesture->fingers[idx].flags |= PressFlagFlick;
                        if( g_pGesture->num_pressed < 2 )
                                return;
@@ -1297,7 +1375,7 @@ GestureRecognize_GroupFlick(int type, InternalEvent *ev, DeviceIntPtr device, in
 #endif//__DETAIL_DEBUG__
                        break;
 
-               case ET_Motion:
+               case GESTURE_TOUCH_MOTION:
                        if( !(g_pGesture->fingers[idx].flags & PressFlagFlick ) )
                                break;
 
@@ -1339,7 +1417,7 @@ GestureRecognize_GroupFlick(int type, InternalEvent *ev, DeviceIntPtr device, in
                        }
                        break;
 
-               case ET_ButtonRelease:
+               case GESTURE_TOUCH_RELEASE:
                        if( g_pGesture->num_pressed )
                                break;
 
@@ -1418,12 +1496,7 @@ GestureRecognize_GroupPan(int type, InternalEvent *ev, DeviceIntPtr device, int
        static OsTimerPtr pan_event_timer = NULL;
        static int event_type = GestureNotifyPan;
 
-       if(g_pGesture->recognized_palm || g_pGesture->enqueue_fulled == 1 || g_pGesture->hold_detected
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-               || g_pGesture->bezel_recognized_mask)
-#else
-               )
-#endif
+       if(g_pGesture->recognized_palm || g_pGesture->enqueue_fulled == 1 || g_pGesture->hold_detected)
                goto cleanup_pan;
 
        if( timer_expired )
@@ -1448,7 +1521,7 @@ GestureRecognize_GroupPan(int type, InternalEvent *ev, DeviceIntPtr device, int
 
        switch( type )
        {
-               case ET_ButtonPress:
+                case GESTURE_TOUCH_PRESS:
                        g_pGesture->fingers[idx].flags |= PressFlagPan;
 
                        if( g_pGesture->num_pressed < 2 )
@@ -1481,7 +1554,7 @@ GestureRecognize_GroupPan(int type, InternalEvent *ev, DeviceIntPtr device, int
 #endif//__DETAIL_DEBUG__
                        break;
 
-               case ET_Motion:
+               case GESTURE_TOUCH_MOTION:
                        if( !(g_pGesture->fingers[idx].flags & PressFlagPan ) )
                                break;
 
@@ -1528,7 +1601,7 @@ GestureRecognize_GroupPan(int type, InternalEvent *ev, DeviceIntPtr device, int
                                        {
                                                TimerCancel(pan_event_timer);
                                                pan_event_timer = NULL;
-                                               
+
                                                if( GestureHasFingerEventMask(GestureNotifyPan, num_pressed) )
                                                {
                                                        GestureHandleGesture_Pan(num_pressed, prev_cx, prev_cy, direction, distance, current_time-prev_time, GestureBegin);
@@ -1559,7 +1632,7 @@ GestureRecognize_GroupPan(int type, InternalEvent *ev, DeviceIntPtr device, int
                        }
                        break;
 
-               case ET_ButtonRelease:
+               case GESTURE_TOUCH_RELEASE:
                        if( state != GestureEnd && num_pressed >= 2)
                        {
 #ifdef __DETAIL_DEBUG__
@@ -1645,12 +1718,7 @@ GestureRecognize_GroupTap(int type, InternalEvent *ev, DeviceIntPtr device, int
        static OsTimerPtr tap_event_timer = NULL;
        static int event_type = GestureNotifyTap;
 
-       if(g_pGesture->recognized_palm || g_pGesture->enqueue_fulled == 1 || g_pGesture->hold_detected
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-               || g_pGesture->bezel_recognized_mask)
-#else
-               )
-#endif
+       if(g_pGesture->recognized_palm || g_pGesture->enqueue_fulled == 1 || g_pGesture->hold_detected)
                goto cleanup_tap;
 
        if( timer_expired )
@@ -1706,7 +1774,7 @@ GestureRecognize_GroupTap(int type, InternalEvent *ev, DeviceIntPtr device, int
 
        switch( type )
        {
-               case ET_ButtonPress:
+                case GESTURE_TOUCH_PRESS:
                        g_pGesture->fingers[idx].flags |= PressFlagTap;
 
                        if( g_pGesture->num_pressed < 2 )
@@ -1734,7 +1802,7 @@ GestureRecognize_GroupTap(int type, InternalEvent *ev, DeviceIntPtr device, int
 #endif//__DETAIL_DEBUG__
                        break;
 
-               case ET_Motion:
+               case GESTURE_TOUCH_MOTION:
                        if( !(g_pGesture->fingers[idx].flags & PressFlagTap ) )
                                break;
 
@@ -1784,7 +1852,7 @@ GestureRecognize_GroupTap(int type, InternalEvent *ev, DeviceIntPtr device, int
                        }
                        break;
 
-               case ET_ButtonRelease:
+               case GESTURE_TOUCH_RELEASE:
                        if( g_pGesture->num_pressed )
                        {
                                break;
@@ -1884,12 +1952,7 @@ GestureRecognize_GroupTapNHold(int type, InternalEvent *ev, DeviceIntPtr device,
        Time interval = 0;
        Time holdtime = 0;
 
-       if(g_pGesture->recognized_palm || g_pGesture->enqueue_fulled == 1 || g_pGesture->hold_detected
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-               || g_pGesture->bezel_recognized_mask)
-#else
-               )
-#endif
+       if(g_pGesture->recognized_palm || g_pGesture->enqueue_fulled == 1 || g_pGesture->hold_detected)
                goto cleanup_tapnhold;
 
        if( timer_expired )
@@ -1944,7 +2007,7 @@ GestureRecognize_GroupTapNHold(int type, InternalEvent *ev, DeviceIntPtr device,
 
        switch( type )
        {
-               case ET_ButtonPress:
+                case GESTURE_TOUCH_PRESS:
                        g_pGesture->fingers[idx].flags |= PressFlagTapNHold;
 
                        if( g_pGesture->num_pressed < 2 )
@@ -1992,7 +2055,7 @@ GestureRecognize_GroupTapNHold(int type, InternalEvent *ev, DeviceIntPtr device,
 #endif//__DETAIL_DEBUG__
                        break;
 
-               case ET_Motion:
+               case GESTURE_TOUCH_MOTION:
                        if( !(g_pGesture->fingers[idx].flags & PressFlagTapNHold ) )
                                break;
 
@@ -2044,7 +2107,7 @@ GestureRecognize_GroupTapNHold(int type, InternalEvent *ev, DeviceIntPtr device,
                        }
                        break;
 
-               case ET_ButtonRelease:
+               case GESTURE_TOUCH_RELEASE:
                        if( state != GestureEnd && num_pressed >= 2)
                        {
 #ifdef __DETAIL_DEBUG__
@@ -2153,12 +2216,7 @@ void GestureRecognize_GroupHold(int type, InternalEvent *ev, DeviceIntPtr device
        static OsTimerPtr hold_event_timer = NULL;
        static int event_type = GestureNotifyHold;
 
-       if(g_pGesture->recognized_palm || g_pGesture->enqueue_fulled == 1 || g_pGesture->hold_detected
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-               || g_pGesture->bezel_recognized_mask)
-#else
-               )
-#endif
+       if(g_pGesture->recognized_palm || g_pGesture->enqueue_fulled == 1 || g_pGesture->hold_detected)
                goto cleanup_hold;
 
        if( timer_expired )
@@ -2189,7 +2247,7 @@ void GestureRecognize_GroupHold(int type, InternalEvent *ev, DeviceIntPtr device
 
        switch( type )
        {
-               case ET_ButtonPress:
+                case GESTURE_TOUCH_PRESS:
                        g_pGesture->fingers[idx].flags |= PressFlagHold;
 
                        if( g_pGesture->num_pressed < 2 )
@@ -2223,7 +2281,7 @@ void GestureRecognize_GroupHold(int type, InternalEvent *ev, DeviceIntPtr device
 #endif//__DETAIL_DEBUG__
                        break;
 
-               case ET_Motion:
+               case GESTURE_TOUCH_MOTION:
                        if( !(g_pGesture->fingers[idx].flags & PressFlagHold ) )
                                break;
 
@@ -2271,7 +2329,7 @@ void GestureRecognize_GroupHold(int type, InternalEvent *ev, DeviceIntPtr device
                        }
                        break;
 
-               case ET_ButtonRelease:
+               case GESTURE_TOUCH_RELEASE:
                        if( state != GestureEnd && num_pressed >= 2)
                        {
 #ifdef __DETAIL_DEBUG__
@@ -2316,60 +2374,6 @@ cleanup_hold:
        return;
 }
 
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-int
-GestureBezelAngleRecognize(int type, int distance, double angle)
-{
-       if (distance < g_pGesture->bezel.flick_distance)
-       {
-#ifdef __BEZEL_DEBUG__
-               XDBG_DEBUG(MGEST, "distance(%d) < flick_distance(%d)\n", distance, g_pGesture->bezel.flick_distance);
-#endif//__BEZEL_DEBUG__
-               return 0;
-       }
-       switch(type)
-       {
-               case BEZEL_TOP_LEFT:
-                       break;
-               case BEZEL_TOP_RIGHT:
-                       break;
-               case BEZEL_BOTTOM_LEFT:
-                       if( (g_pGesture->bezel.min_rad< angle) && (angle < g_pGesture->bezel.max_rad) )
-                       {
-#ifdef __BEZEL_DEBUG__
-                               XDBG_DEBUG(MGEST, "bottom_left bezel success....\n");
-#endif//__BEZEL_DEBUG__
-                               return 1;
-                       }
-                       else
-                       {
-#ifdef __BEZEL_DEBUG__
-                               XDBG_DEBUG(MGEST, "bottom_left bezel failed....\n");
-#endif//__BEZEL_DEBUG__
-                               return 0;
-                       }
-               case BEZEL_BOTTOM_RIGHT:
-                       if( (g_pGesture->bezel.min_180_rad< angle) && (angle < g_pGesture->bezel.max_180_rad))
-                       {
-#ifdef __BEZEL_DEBUG__
-                               XDBG_DEBUG(MGEST, "bottom_right bezel success...\n");
-#endif//__BEZEL_DEBUG__
-                               return 1;
-                       }
-                       else
-                       {
-#ifdef __BEZEL_DEBUG__
-                               XDBG_DEBUG(MGEST, "bottom_right bezel failed....\n");
-#endif//__BEZEL_DEBUG__
-                               return 0;
-                       }
-               default:
-                       return 0;
-       }
-       return 0;
-}
-#endif
-
 static inline void
 GestureEnableDisable()
 {
@@ -2388,6 +2392,7 @@ GestureCbEventsGrabbed(Mask *pGrabMask, GestureGrabEventPtr *pGrabEvent)
 {
        g_pGesture->grabMask = *pGrabMask;
        g_pGesture->GrabEvents = (GestureGrabEventPtr)pGrabEvent;
+       ErrorF("grabMask: 0x%x, grabwin: 0x%x\n", g_pGesture->GrabEvents->pGestureGrabWinInfo->window);
        GestureEnableDisable();
 }
 
@@ -2455,30 +2460,16 @@ nonempty_eventmask:
        mask = (GESTURE_FILTER_MASK_ALL & ~(g_pGesture->grabMask | g_pGesture->eventMask));
 
 #ifdef __DETAIL_DEBUG__
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-       XDBG_DEBUG(MGEST, "g_pGesture->filter_mask=0x%x, mask=0x%x, palm_filter_mask=0x%x bezel_filter_mask=0x%x\n", g_pGesture->filter_mask, mask, g_pGesture->palm_filter_mask, g_pGesture->bezel_filter_mask);
-#else
        XDBG_DEBUG(MGEST, "g_pGesture->filter_mask=0x%x, mask=0x%x, palm_filter_mask=0x%x\n", g_pGesture->filter_mask, mask, g_pGesture->palm_filter_mask);
-#endif
 #endif//__DETAIL_DEBUG__
        g_pGesture->palm_filter_mask = 0;
        if(mask & FlickFilterMask)
        {
                g_pGesture->palm_filter_mask |= PalmFlickHorizFilterMask;
                g_pGesture->palm_filter_mask |= PalmFlickVertiFilterMask;
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-               g_pGesture->bezel_filter_mask |= BezelFlickFilterMask;
-#endif
        }
        if(!(mask & FlickFilterMask))
        {
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-               if(!(g_pGesture->GrabEvents[GestureNotifyFlick].pGestureGrabWinInfo[1].window))
-               {
-                       g_pGesture->bezel_filter_mask |= BezelFlickFilterMask;
-               }
-               else
-#endif
                if(!(g_pGesture->GrabEvents[GestureNotifyFlick].pGestureGrabWinInfo[0].window))
                {
                        g_pGesture->palm_filter_mask |= PalmFlickHorizFilterMask;
@@ -2487,18 +2478,14 @@ nonempty_eventmask:
        }
        if(!g_pGesture->palm.palmflag)
        {
-               if(!GestureHasFingersEvents(HoldFilterMask))
+               if(!GestureHasFingersEvents(GestureNotifyHold))
                        mask |= HoldFilterMask;
-               if(!GestureHasFingersEvents(FlickFilterMask))
+               if(!GestureHasFingersEvents(GestureNotifyFlick))
                        mask |= FlickFilterMask;
                g_pGesture->filter_mask = mask;
        }
 #ifdef __DETAIL_DEBUG__
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-       XDBG_DEBUG(MGEST, "g_pGesture->filter_mask=0x%x, palm_filter_mask: 0x%x, bezel_filter_mask=0x%x\n", g_pGesture->filter_mask, g_pGesture->palm_filter_mask, g_pGesture->bezel_filter_mask);
-#else
        XDBG_DEBUG(MGEST, "g_pGesture->filter_mask=0x%x, palm_filter_mask: 0x%x\n", g_pGesture->filter_mask, g_pGesture->palm_filter_mask);
-#endif
 #endif//__DETAIL_DEBUG__
 
        return pWin;
@@ -2509,7 +2496,11 @@ GestureHasFingersEvents(int eventType)
 {
        int i=0;
        Mask eventmask = (1L << eventType);
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        for(i=2; i<MAX_MT_DEVICES; i++)
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       for(i=2; i<g_pGesture->num_mt_devices; i++)
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
        {
                if( (g_pGesture->grabMask & eventmask) &&
                (g_pGesture->GrabEvents[eventType].pGestureGrabWinInfo[i].window != None) )
@@ -2576,23 +2567,6 @@ GestureEventTimerHandler(OsTimerPtr timer, CARD32 time, pointer arg)
        return 0;
 }
 
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-static CARD32
-GestureBezelSingleFingerTimerHandler(OsTimerPtr timer, CARD32 time, pointer arg)
-{
-       BezelFlickStatusPtr pBezel = &g_pGesture->bezel;
-
-       if( pBezel->is_active != BEZEL_NONE )
-       {
-               pBezel->is_active = BEZEL_END;
-#ifdef __BEZEL_DEBUG__
-               XDBG_DEBUG(MGEST, "end\n");
-#endif//__BEZEL_DEBUG__
-       }
-       return 0;
-}
-#endif
-
 static CARD32
 GestureSingleFingerTimerHandler(OsTimerPtr timer, CARD32 time, pointer arg)
 {
@@ -2657,12 +2631,11 @@ GesturePalmGetHorizIndexWithX(int x, int type)
        return ret_idx;
 
 index_check:
-
-       if(type == ET_ButtonPress)
+       if(type == GESTURE_TOUCH_PRESS)
        {
                pressed_idx = ret_idx;
        }
-       else if(type == ET_ButtonRelease)
+       else if(type == GESTURE_TOUCH_RELEASE)
        {
                if((pressed_idx <= 1) && (ret_idx >= (PALM_HORIZ_ARRAY_COUNT-2)))
                {
@@ -2720,8 +2693,7 @@ GesturePalmGetVertiIndexWithY(int y, int type)
        return ret_idx;
 
 index_check:
-
-       if(type == ET_ButtonPress)
+       if(type == GESTURE_TOUCH_PRESS)
        {
                if((ret_idx <= 1) || (ret_idx >=(PALM_VERTI_ARRAY_COUNT-2)))
                {
@@ -2739,7 +2711,7 @@ index_check:
                }
 
        }
-       else if(type == ET_ButtonRelease)
+       else if(type == GESTURE_TOUCH_RELEASE)
        {
                if((pressed_idx <= 1) && (ret_idx >= (PALM_VERTI_ARRAY_COUNT-2)))
                {
@@ -2824,12 +2796,7 @@ GesturePalmRecognize_FlickHorizen(int type, int idx)
        }
 
        if(g_pGesture->recognized_gesture || g_pGesture->hold_detected ||
-               (g_pGesture->recognized_palm && !(g_pGesture->recognized_palm & PalmFlickHorizFilterMask)) || (g_pGesture->palm_filter_mask & PalmFlickHorizFilterMask)
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-               || g_pGesture->bezel_recognized_mask)
-#else
-               )
-#endif
+               (g_pGesture->recognized_palm && !(g_pGesture->recognized_palm & PalmFlickHorizFilterMask)) || (g_pGesture->palm_filter_mask & PalmFlickHorizFilterMask))
        {
 #ifdef __PALM_GESTURE_LOG__
                XDBG_DEBUG(MGEST, "zoom_enabled: %d\n", g_pGesture->zoom_enabled);
@@ -2840,7 +2807,7 @@ GesturePalmRecognize_FlickHorizen(int type, int idx)
        }
        switch( type )
        {
-               case ET_ButtonPress:
+               case GESTURE_TOUCH_PRESS:
                        if(!is_flicking)
                                break;
                        if(!base_width_size || pPalm->cur_touched > curTouched)
@@ -2895,7 +2862,7 @@ GesturePalmRecognize_FlickHorizen(int type, int idx)
                        num_pressed++;
                        break;
 
-               case ET_Motion:
+               case GESTURE_TOUCH_MOTION:
                        if(!num_pressed || !is_flicking)
                        {
 #ifdef __PALM_GESTURE_LOG__
@@ -3004,7 +2971,7 @@ GesturePalmRecognize_FlickHorizen(int type, int idx)
                        }
                        break;
 
-               case ET_ButtonRelease:
+               case GESTURE_TOUCH_RELEASE:
                        release_flag = 1;
                        if(--num_pressed < 0)
                                num_pressed = 0;
@@ -3145,12 +3112,7 @@ GesturePalmRecognize_FlickVertical(int type,int idx)
        }
 
        if(g_pGesture->recognized_gesture || g_pGesture->hold_detected ||
-               (g_pGesture->recognized_palm && !(g_pGesture->recognized_palm & PalmFlickVertiFilterMask)) || (g_pGesture->palm_filter_mask & PalmFlickVertiFilterMask)
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-               || g_pGesture->bezel_recognized_mask)
-#else
-               )
-#endif
+               (g_pGesture->recognized_palm && !(g_pGesture->recognized_palm & PalmFlickVertiFilterMask)) || (g_pGesture->palm_filter_mask & PalmFlickVertiFilterMask))
        {
 #ifdef __PALM_GESTURE_LOG__
                XDBG_DEBUG(MGEST, "zoom_enabled: %d\n", g_pGesture->zoom_enabled);
@@ -3170,7 +3132,7 @@ GesturePalmRecognize_FlickVertical(int type,int idx)
 
        switch( type )
        {
-               case ET_ButtonPress:
+               case GESTURE_TOUCH_PRESS:
                        if(!is_flicking)
                                break;
                        if(!base_height_size || pPalm->cur_touched > curTouched)
@@ -3228,7 +3190,7 @@ GesturePalmRecognize_FlickVertical(int type,int idx)
                        num_pressed++;
                        break;
 
-               case ET_Motion:
+               case GESTURE_TOUCH_MOTION:
                        if(!num_pressed|| !is_flicking)
                                break;
 
@@ -3305,7 +3267,7 @@ GesturePalmRecognize_FlickVertical(int type,int idx)
                        }
                        break;
 
-               case ET_ButtonRelease:
+               case GESTURE_TOUCH_RELEASE:
                        release_flag = 1;
 
                        if(--num_pressed < 0)
@@ -3486,6 +3448,9 @@ GesturePalmGetAbsAxisInfo(DeviceIntPtr dev)
        g_pGesture->mt_tool_idx = -1;
 
        memset(&g_pGesture->palm, 0, sizeof(PalmStatus));
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+       GesturePalmAlloc(g_pGesture->num_mt_devices);
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
        if (!dev || !dev->valuator)
                goto out;
@@ -3578,7 +3543,11 @@ GesturePalmGetAbsAxisInfo(DeviceIntPtr dev)
        pPalm = &g_pGesture->palm;
        pixman_region_init(&pPalm->area);
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        for( i = 0 ; i < MAX_MT_DEVICES ; i++ )
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       for( i = 0 ; i < g_pGesture->num_mt_devices; i++ )
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
        {
                pixman_region_init_rect (&pPalm->finger_rects[i], 0, 0, FINGER_WIDTH_2T, FINGER_HEIGHT_2T);
        }
@@ -3653,7 +3622,7 @@ GesturePalmDataUpdate(int idx, int type, InternalEvent *ev, DeviceIntPtr device)
 
        switch(type)
        {
-               case ET_ButtonPress:
+               case GESTURE_TOUCH_PRESS:
                        if (!pPalm->pti[idx].touch_status)
                        {
                                pPalm->cur_touched++;
@@ -3667,7 +3636,7 @@ GesturePalmDataUpdate(int idx, int type, InternalEvent *ev, DeviceIntPtr device)
 #endif
                        break;
 
-               case ET_ButtonRelease:
+               case GESTURE_TOUCH_RELEASE:
                        if (pPalm->pti[idx].touch_status)
                        {
                                --pPalm->cur_touched;
@@ -3690,7 +3659,7 @@ GesturePalmDataUpdate(int idx, int type, InternalEvent *ev, DeviceIntPtr device)
 #endif
                        break;
 
-               case ET_Motion:
+               case GESTURE_TOUCH_MOTION:
                        pPalm->pti[idx].x = de->root_x;
                        pPalm->pti[idx].y = de->root_y;
 
@@ -3814,7 +3783,7 @@ GesturePalmUpdateAreaInfo(int type, int idx)
 
        switch(type)
        {
-               case ET_ButtonPress:
+               case GESTURE_TOUCH_PRESS:
                        pPalm->finger_rects[idx].extents.x1 = pPalm->pti[idx].x - FINGER_WIDTH;
                        pPalm->finger_rects[idx].extents.x2 = pPalm->pti[idx].x + FINGER_WIDTH;
                        pPalm->finger_rects[idx].extents.y1 = pPalm->pti[idx].y - FINGER_HEIGHT;
@@ -3847,10 +3816,10 @@ GesturePalmUpdateAreaInfo(int type, int idx)
                        }
                        break;
 
-               case ET_ButtonRelease:
+               case GESTURE_TOUCH_RELEASE:
                        break;
 
-               case ET_Motion:
+               case GESTURE_TOUCH_MOTION:
                        if (!pPalm->pti[idx].touch_status || (pPalm->pti[idx].tmajor == 0))
                                return;
                        pPalm->finger_rects[idx].extents.x1 = pPalm->pti[idx].x - FINGER_WIDTH;
@@ -3901,7 +3870,11 @@ GesturePalmRecognize(int type, InternalEvent *ev, DeviceIntPtr device)
        if( device->id < g_pGesture->first_fingerid )
                return;
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        idx = GestureGetFingerIndexFromDevice(device);
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       idx = GestureGetTouchIndex(device->id, ev->device_event.touchid, type);
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
        if( idx < 0 )
                return;
 
@@ -3937,7 +3910,7 @@ GesturePalmRecognize(int type, InternalEvent *ev, DeviceIntPtr device)
 #endif
        switch(type)
        {
-               case ET_ButtonPress:
+               case GESTURE_TOUCH_PRESS:
                        if( idx == 0 )
                                event_sum_palm_first_finger = BTN_PRESSED;
                        else if( idx == 1)
@@ -3953,7 +3926,7 @@ GesturePalmRecognize(int type, InternalEvent *ev, DeviceIntPtr device)
                                TimerCancel(pPalm->palm_single_finger_timer);
                        }
                        break;
-               case ET_Motion:
+               case GESTURE_TOUCH_MOTION:
                        if(pPalm->cur_touched == 0 || pPalm->pti[idx].touch_status != 1)
                        {
                                return;
@@ -4038,7 +4011,7 @@ GesturePalmRecognize(int type, InternalEvent *ev, DeviceIntPtr device)
                                calc_touched = 0;
                        }
                        break;
-               case ET_ButtonRelease:
+               case GESTURE_TOUCH_RELEASE:
                        if( idx == 0 )
                                event_sum_palm_first_finger = BTN_RELEASED;
                        else if( idx == 1)
@@ -4072,7 +4045,11 @@ GesturePalmRecognize(int type, InternalEvent *ev, DeviceIntPtr device)
        {
                pixman_region_init(&pPalm->area);
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
                for( i = 0 ; i < MAX_MT_DEVICES ; i++ )
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+               for( i = 0 ; i < g_pGesture->num_mt_devices; i++ )
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
                {
                        pixman_region_init_rect (&pPalm->finger_rects[i], 0, 0, FINGER_WIDTH_2T, FINGER_HEIGHT_2T);
                }
@@ -4081,15 +4058,15 @@ GesturePalmRecognize(int type, InternalEvent *ev, DeviceIntPtr device)
 
        switch(type)
        {
-               case ET_ButtonPress:
+               case GESTURE_TOUCH_PRESS:
                        break;
 
-               case ET_ButtonRelease:
+               case GESTURE_TOUCH_RELEASE:
                        if(( g_pGesture->palm_filter_mask == GESTURE_PALM_FILTER_MASK_ALL ) && ( pPalm->cur_touched == 0))
                                goto flush_or_drop;
                        break;
 
-               case ET_Motion:
+               case GESTURE_TOUCH_MOTION:
                        break;
        }
 #ifdef __PALM_DETAIL_LOG__
@@ -4122,213 +4099,6 @@ flush_or_drop:
 
 }
 
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-void
-GestureBezelRecognize(int type, InternalEvent *ev, DeviceIntPtr device)
-{
-       static OsTimerPtr bezel_finger_timer = NULL;
-
-       BezelFlickStatusPtr pBezel = &g_pGesture->bezel;
-       int direction = 0;
-       int distance;
-       double angle;
-       static Time base_time = 0;
-       int idx = -1;
-       int i;
-       static int px=-1, py=-1;
-       static int mx=-1, my=-1;
-       static int rx=-1, ry=-1;
-       static int event_count=0;
-
-       if(g_pGesture->enqueue_fulled == 1)
-       {
-#ifdef __BEZEL_DEBUG__
-               XDBG_DEBUG(MGEST, "EQ Event is full.... palm recognize drop..\n");
-#endif//__BEZEL_DEBUG__
-               goto bezel_failed;
-       }
-
-       if( (PROPAGATE_EVENTS == g_pGesture->ehtype) || (device->id != g_pGesture->first_fingerid) )
-               return;
-
-       for( i = 0 ; i < g_pGesture->num_mt_devices ; i++ )
-       {
-               if( device->id == g_pGesture->mt_devices[i]->id )
-               {
-                       idx = i;
-                       break;
-               }
-       }
-#ifdef __BEZEL_DEBUG__
-       XDBG_DEBUG(MGEST, "[type: %d][g_pGesture->num_pressed=%d, x,y(%d, %d) ]\n", type, g_pGesture->num_pressed, ev->device_event.root_x, ev->device_event.root_x);
-       XDBG_DEBUG(MGEST, "[filter_mask: 0x%x, bezel_filter_mask: 0x%x, palm_filter_mask: 0x%x\n", g_pGesture->filter_mask, g_pGesture->bezel_filter_mask, g_pGesture->palm_filter_mask);
-#endif//__BEZEL_DEBUG__
-
-       if (idx < 0)
-               return;
-       if(g_pGesture->recognized_gesture || g_pGesture->recognized_palm)
-               goto bezel_failed;
-       if(g_pGesture->num_pressed > 1)
-       {
-#ifdef __BEZEL_DEBUG__
-               XDBG_DEBUG(MGEST, "Not single finger g_pGesture->num_pressed: %d\n", g_pGesture->num_pressed);
-#endif//__BEZEL_DEBUG__
-               goto bezel_failed;
-       }
-       if(pBezel->is_active == BEZEL_END)
-       {
-#ifdef __BEZEL_DEBUG__
-               XDBG_DEBUG(MGEST, "Bezel state is END pBezel->is_active: %d\n", pBezel->is_active);
-               XDBG_DEBUG(MGEST, "[filter_mask: 0x%x, bezel_filter_mask: 0x%x, palm_filter_mask: 0x%x\n", g_pGesture->filter_mask, g_pGesture->bezel_filter_mask, g_pGesture->palm_filter_mask);
-#endif//__BEZEL_DEBUG__
-               goto bezel_failed;
-       }
-
-       switch(type)
-       {
-               case ET_ButtonPress:
-                       base_time = GetTimeInMillis();
-                       px = ev->device_event.root_x;
-                       py = ev->device_event.root_y;
-#ifdef __BEZEL_DEBUG__
-                       XDBG_DEBUG(MGEST, "[P] pBezel->is_active: %d, g_pGesture->num_pressed: %d, idx: %d\n", pBezel->is_active, g_pGesture->num_pressed, idx);
-                       XDBG_DEBUG(MGEST, "[P] g_pGesture->fingers[%d].p: (%d, %d)\n", idx, px,py);
-#endif//__BEZEL_DEBUG__
-                       if( (pBezel->is_active == BEZEL_ON) && ((g_pGesture->num_pressed == 1) && (idx == 0)) )
-                       {
-                               if( ( px < pBezel->top_left.width) && ( py < pBezel->top_left.height) )
-                               {
-#ifdef __BEZEL_DEBUG__
-                                       XDBG_DEBUG(MGEST, "[P] top_left\n");
-#endif//__BEZEL_DEBUG__
-                                       pBezel->is_active = BEZEL_START;
-                                       pBezel->bezelStatus = BEZEL_TOP_LEFT;
-                               }
-                               else if( (px > (720 - pBezel->top_right.width)) && ( py < pBezel->top_right.height) )
-                               {
-#ifdef __BEZEL_DEBUG__
-                                       XDBG_DEBUG(MGEST, "[P] top_right\n");
-#endif//__BEZEL_DEBUG__
-                                       pBezel->is_active = BEZEL_START;
-                                       pBezel->bezelStatus = BEZEL_TOP_RIGHT;
-                               }
-                               else if( (px < pBezel->bottom_left.width) && ( py > (1280 - pBezel->bottom_left.height)) )
-                               {
-#ifdef __BEZEL_DEBUG__
-                                       XDBG_DEBUG(MGEST, "[P] bottom_left\n");
-#endif//__BEZEL_DEBUG__
-                                       pBezel->is_active = BEZEL_START;
-                                       pBezel->bezelStatus = BEZEL_BOTTOM_LEFT;
-                               }
-                               else if( (px > (720 - pBezel->bottom_right.width)) && ( py > (1280 - pBezel->bottom_right.height)) )
-                               {
-#ifdef __BEZEL_DEBUG__
-                                       XDBG_DEBUG(MGEST, "[P] bottom_right\n");
-#endif//__BEZEL_DEBUG__
-                                       pBezel->is_active = BEZEL_START;
-                                       pBezel->bezelStatus = BEZEL_BOTTOM_RIGHT;
-                               }
-                               else
-                               {
-#ifdef __BEZEL_DEBUG__
-                                       XDBG_DEBUG(MGEST, "[P] None\n");
-#endif//__BEZEL_DEBUG__
-                                       pBezel->bezelStatus = NO_BEZEL;
-                                       goto bezel_failed;
-                               }
-                       }
-                       if(pBezel->is_active == BEZEL_START)
-                       {
-                               bezel_finger_timer = TimerSet(bezel_finger_timer, 0, 500, GestureBezelSingleFingerTimerHandler, NULL);
-                       }
-                       else
-                       {
-                               TimerCancel(bezel_finger_timer);
-                       }
-                       break;
-               case ET_Motion:
-                       if(px <0 || py < 0)
-                               return;
-                       mx = ev->device_event.root_x;
-                       my = ev->device_event.root_y;
-                       event_count++;
-                       if( (g_pGesture->bezel.bezel_angle_moving_check) && (event_count >= 10))
-                       {
-                               angle = get_angle(px, py, mx, my);
-                               event_count = 0;
-                               if(!GestureBezelAngleRecognize(pBezel->bezelStatus, pBezel->flick_distance, angle))
-                               {
-#ifdef __BEZEL_DEBUG__
-                                       XDBG_DEBUG(MGEST, "[M] moving limit!\n");
-#endif//__BEZEL_DEBUG__
-                                       TimerCancel(bezel_finger_timer);
-                                       goto bezel_failed;
-                               }
-                       }
-                       break;
-               case ET_ButtonRelease:
-                       rx = ev->device_event.root_x;
-                       ry = ev->device_event.root_y;
-                       if( (g_pGesture->num_pressed == 0) && (g_pGesture->inc_num_pressed == 1) && (pBezel->is_active == BEZEL_START) )
-                       {
-                               angle = get_angle(px, py, rx, ry);
-                               distance = get_distance(px, py, rx, ry);
-                               Time duration = GetTimeInMillis() - base_time;
-#ifdef __BEZEL_DEBUG__
-                               XDBG_DEBUG(MGEST, "[R] bezelStatus: %d, distance: %d, angle: %lf\n", pBezel->bezelStatus, distance, angle);
-#endif//__BEZEL_DEBUG__
-                               int res = GestureBezelAngleRecognize(pBezel->bezelStatus, distance, angle);
-                               if(res)
-                               {
-#ifdef __BEZEL_DEBUG__
-                                       XDBG_DEBUG(MGEST, "[R] Bezel Success\n");
-#endif//__BEZEL_DEBUG__
-                                       pBezel->is_active = BEZEL_DONE;
-                                       g_pGesture->filter_mask = GESTURE_FILTER_MASK_ALL;
-                                       g_pGesture->palm_filter_mask = GESTURE_PALM_FILTER_MASK_ALL;
-                                       TimerCancel(bezel_finger_timer);
-
-                                       if( (0.0 < angle) && (angle < RAD_90DEG))
-                                               direction = FLICK_NORTHEASTWARD;
-                                       else if(angle < RAD_180DEG)
-                                               direction = FLICK_NORTHWESTWARD;
-
-                                       if( GestureHasFingerEventMask(GestureNotifyFlick, 1) )
-                                               GestureHandleGesture_Flick(1, distance, duration, direction);
-                                       goto bezel_cleanup;
-                               }
-#ifdef __BEZEL_DEBUG__
-                               XDBG_DEBUG(MGEST, "[R] Bezel failed\n");
-#endif//__BEZEL_DEBUG__
-                               goto bezel_failed;
-                       }
-                       break;
-       }
-       return;
-bezel_failed:
-#ifdef __BEZEL_DEBUG__
-       XDBG_DEBUG(MGEST, "[F] Bezel failed\n");
-#endif//__BEZEL_DEBUG__
-       pBezel->is_active = BEZEL_END;
-       g_pGesture->bezel_filter_mask |= BezelFlickFilterMask;
-       goto bezel_cleanup;
-       return;
-bezel_cleanup:
-#ifdef __BEZEL_DEBUG__
-       XDBG_DEBUG(MGEST, "[F] Bezel cleanup\n");
-#endif//__BEZEL_DEBUG__
-       TimerCancel(bezel_finger_timer);
-       if( ERROR_INVALPTR == GestureFlushOrDrop() )
-       {
-               GestureControl(g_pGesture->this_device, DEVICE_OFF);
-       }
-       bezel_finger_timer = NULL;
-       base_time = 0;
-       px=py=mx=my=rx=ry=-1;
-       event_count = 0;
-}
-#endif
-
 static EventQueuePtr
 GestureGetMIEQ(void)
 {
@@ -4456,7 +4226,7 @@ GestureIsPalmEvent(InternalEvent *event)
        double touch_major = 0.0f;
        double touch_palm = 0.0f;
 
-       if (event->any.type != ET_ButtonPress && event->any.type != ET_Motion && event->any.type != ET_ButtonRelease)
+       if (event->any.type != GESTURE_TOUCH_PRESS && event->any.type != GESTURE_TOUCH_MOTION && event->any.type != GESTURE_TOUCH_RELEASE)
                return FALSE;
 
        DeviceEvent *de = &event->device_event;
@@ -4485,11 +4255,11 @@ GestureIsPalmEvent(InternalEvent *event)
        return FALSE;
 }
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
 static int
 GestureGetFingerIndexFromDevice(DeviceIntPtr device)
 {
        int i;
-
        for( i = 0 ; i < g_pGesture->num_mt_devices ; i++ )
        {
                if( device->id == g_pGesture->mt_devices[i]->id )
@@ -4497,17 +4267,23 @@ GestureGetFingerIndexFromDevice(DeviceIntPtr device)
                        return i;
                }
        }
-
        return -1;
 }
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
 static int
 GestureGetDeviceIdFromFingerIndex(int finger_index)
 {
        if (g_pGesture->num_mt_devices <= finger_index)
                return -1;
+       if (!(g_pGesture->mt_devices))
+               return -1;
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        return g_pGesture->mt_devices[finger_index]->id;
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       return g_pGesture->mt_devices->id;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 }
 
 
@@ -4522,26 +4298,25 @@ GestureRecognize(int type, InternalEvent *ev, DeviceIntPtr device)
                device->id < g_pGesture->first_fingerid )
                return;
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        idx = GestureGetFingerIndexFromDevice(device);
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       idx = GestureGetTouchIndex(device->id, ev->device_event.touchid, type);
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
        if( idx < 0 )
                return;
 #ifdef __DETAIL_DEBUG__
-       XDBG_DEBUG(MGEST, "[type: %d][g_pGesture->num_pressed=%d, x,y(%d, %d) ]\n", type, g_pGesture->num_pressed, ev->device_event.root_x, ev->device_event.root_x);
+       XDBG_DEBUG(MGEST, "[type: %d,ehtype: %d][g_pGesture->num_pressed=%d, x,y(%d, %d) ]\n", type, g_pGesture->ehtype, g_pGesture->num_pressed, ev->device_event.root_x, ev->device_event.root_x);
        XDBG_DEBUG(MGEST, "[inc_num_pressed: %d]\n", g_pGesture->inc_num_pressed);
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-       XDBG_DEBUG(MGEST, "[filter_mask: 0x%x, bezel_filter_mask: 0x%x, palm_filter_mask: 0x%x\n", g_pGesture->filter_mask, g_pGesture->bezel_filter_mask, g_pGesture->palm_filter_mask);
-       XDBG_DEBUG(MGEST, "[recognized_gesture: 0x%x, bezel_recognize_mask: 0x%x, recognized_palm: 0x%x\n", g_pGesture->recognized_gesture, g_pGesture->bezel_recognized_mask, g_pGesture->recognized_palm);
-#else
        XDBG_DEBUG(MGEST, "[filter_mask: 0x%x, palm_filter_mask: 0x%x\n", g_pGesture->filter_mask, g_pGesture->palm_filter_mask);
        XDBG_DEBUG(MGEST, "[recognized_gesture: 0x%x, recognized_palm: 0x%x\n", g_pGesture->recognized_gesture, g_pGesture->recognized_palm);
-#endif
 #endif//__DETAIL_DEBUG__
 
 
        switch( type )
        {
-               case ET_ButtonPress:
+               case GESTURE_TOUCH_PRESS:
                        if( idx == 0 )
                                g_pGesture->event_sum[0] = BTN_PRESSED;
                        g_pGesture->fingers[idx].ptime = ev->any.time;
@@ -4587,12 +4362,12 @@ GestureRecognize(int type, InternalEvent *ev, DeviceIntPtr device)
                                pixman_region_union(&g_pGesture->area, &g_pGesture->area, &g_pGesture->finger_rects[i]);
                        }
 #ifdef __DETAIL_DEBUG__
-                       XDBG_DEBUG(MGEST, "[M][g_pGesture->inc_num_pressed=%d] AREA_SIZE(area)=%d\n", g_pGesture->inc_num_pressed, AREA_SIZE(&g_pGesture->area.extents));
+                       XDBG_DEBUG(MGEST, "[P][g_pGesture->inc_num_pressed=%d] AREA_SIZE(area)=%d\n", g_pGesture->inc_num_pressed, AREA_SIZE(&g_pGesture->area.extents));
 #endif//__DETAIL_DEBUG__
 
                        break;
 
-               case ET_Motion:
+               case GESTURE_TOUCH_MOTION:
                        if( !g_pGesture->fingers[idx].ptime )
                                return;
 
@@ -4613,7 +4388,7 @@ GestureRecognize(int type, InternalEvent *ev, DeviceIntPtr device)
                                                XDBG_DEBUG(MGEST, "single finger!\n");
 #endif//__DETAIL_DEBUG__
                                                Bool exist;
-                                               exist = GestureIsEventInMIEQ(1, ET_ButtonPress);
+                                               exist = GestureIsEventInMIEQ(1, GESTURE_TOUCH_PRESS);
 #ifdef __DETAIL_DEBUG__
                                                XDBG_DEBUG(MGEST, "two finger touch in queue, exist: %d\n", exist);
 #endif//__DETAIL_DEBUG__
@@ -4643,7 +4418,7 @@ GestureRecognize(int type, InternalEvent *ev, DeviceIntPtr device)
                                                XDBG_DEBUG(MGEST, "tap repeat Moving Limit Exceeded.\n");
 #endif//__DETAIL_DEBUG__
                                                Bool exist;
-                                               exist = GestureIsEventInMIEQ(1, ET_ButtonPress);
+                                               exist = GestureIsEventInMIEQ(1, GESTURE_TOUCH_PRESS);
 #ifdef __DETAIL_DEBUG__
                                                XDBG_DEBUG(MGEST, "two finger touch in queue, exist: %d\n", exist);
 #endif//__DETAIL_DEBUG__
@@ -4673,7 +4448,7 @@ GestureRecognize(int type, InternalEvent *ev, DeviceIntPtr device)
 #endif//__DETAIL_DEBUG__
                        break;
 
-               case ET_ButtonRelease:
+               case GESTURE_TOUCH_RELEASE:
                        g_pGesture->fingers[idx].rtime = ev->any.time;
                        g_pGesture->fingers[idx].rx = ev->device_event.root_x;
                        g_pGesture->fingers[idx].ry = ev->device_event.root_y;
@@ -4718,13 +4493,8 @@ GestureRecognize(int type, InternalEvent *ev, DeviceIntPtr device)
        }
 
 #ifdef __DETAIL_DEBUG__
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-       XDBG_DEBUG(MGEST, "[filter_mask: 0x%x, bezel_filter_mask: 0x%x, palm_filter_mask: 0x%x\n", g_pGesture->filter_mask, g_pGesture->bezel_filter_mask, g_pGesture->palm_filter_mask);
-       XDBG_DEBUG(MGEST, "[recognized_gesture: 0x%x, bezel_recognize_mask: 0x%x, recognized_palm: 0x%x\n", g_pGesture->recognized_gesture, g_pGesture->bezel_recognized_mask, g_pGesture->recognized_palm);
-#else
-       XDBG_DEBUG(MGEST, "[filter_mask: 0x%x, palm_filter_mask: 0x%x\n", g_pGesture->filter_mask, g_pGesture->palm_filter_mask);
-       XDBG_DEBUG(MGEST, "[recognized_gesture: 0x%x, recognized_palm: 0x%x\n", g_pGesture->recognized_gesture, g_pGesture->recognized_palm);
-#endif
+       XDBG_DEBUG(MGEST, "[ehtype: %d][filter_mask: 0x%x, palm_filter_mask: 0x%x]\n", g_pGesture->ehtype, g_pGesture->filter_mask, g_pGesture->palm_filter_mask);
+       XDBG_DEBUG(MGEST, "[recognized_gesture: 0x%x, recognized_palm: 0x%x]\n", g_pGesture->recognized_gesture, g_pGesture->recognized_palm);
 #endif//__DETAIL_DEBUG__
 
        if( g_pGesture->filter_mask == GESTURE_FILTER_MASK_ALL )
@@ -4764,24 +4534,19 @@ ErrorStatus GestureFlushOrDrop(void)
 #ifdef __DETAIL_DEBUG__
        XDBG_DEBUG(MGEST, "recognized_gesture: 0x%x, filter_mask: 0x%x\n", g_pGesture->recognized_gesture, g_pGesture->filter_mask);
        XDBG_DEBUG(MGEST, "recognized_palm: 0x%x, palm_filter_mask: 0x%x\n", g_pGesture->recognized_palm, g_pGesture->palm_filter_mask);
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-       XDBG_DEBUG(MGEST, "bezel_recognized_mask: 0x%x, bezel_filter_mask: 0x%x\n", g_pGesture->bezel_recognized_mask, g_pGesture->bezel_filter_mask);
-#endif
 #endif//__DETAIL_DEBUG__
 
-       if(g_pGesture->recognized_gesture || g_pGesture->recognized_palm
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-                || g_pGesture->bezel_recognized_mask)
-#else
-               )
-#endif
+       if(g_pGesture->recognized_gesture || g_pGesture->recognized_palm)
        {
                g_pGesture->ehtype = IGNORE_EVENTS;
                GestureEventsDrop();
                if(g_pGesture->recognized_palm)
                        err = GestureRegionsReinit();
-       //memset(pPalm->pti, 0, sizeof(pPalm->pti[MAX_MT_DEVICES]));
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
                for(i=0; i<MAX_MT_DEVICES; i++)
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+               for(i=0; i<g_pGesture->num_mt_devices; i++)
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
                {
                        pPalm->pti[i].touch_status = 0;
                        pPalm->pti[i].tangle = 0.0f;
@@ -4793,12 +4558,7 @@ ErrorStatus GestureFlushOrDrop(void)
                if( ERROR_NONE != err )
                        return err;
        }
-       else if((g_pGesture->filter_mask == GESTURE_FILTER_MASK_ALL) && (g_pGesture->palm_filter_mask == GESTURE_PALM_FILTER_MASK_ALL)
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-               && (g_pGesture->bezel_filter_mask == BezelFlickFilterMask))
-#else
-               )
-#endif
+       else if((g_pGesture->filter_mask == GESTURE_FILTER_MASK_ALL) && (g_pGesture->palm_filter_mask == GESTURE_PALM_FILTER_MASK_ALL))
        {
                g_pGesture->ehtype = PROPAGATE_EVENTS;
                if (g_pGesture->palm_rejection_mode == 1 && g_pGesture->palm_detected == TRUE)
@@ -4812,7 +4572,11 @@ ErrorStatus GestureFlushOrDrop(void)
                                return err;
                }
                err = GestureRegionsReinit();
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
                for(i=0; i<MAX_MT_DEVICES; i++)
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+               for(i=0; i<g_pGesture->num_mt_devices; i++)
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
                {
                        pPalm->pti[i].touch_status = 0;
                        pPalm->pti[i].tangle = 0.0f;
@@ -4837,9 +4601,6 @@ GestureHandleMTSyncEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
 {
        int i;
        PalmStatusPtr pPalm = &g_pGesture->palm;
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-       BezelFlickStatusPtr pBezel = &g_pGesture->bezel;
-#endif
 #ifdef __DEBUG_EVENT_HANDLER__
        XDBG_DEBUG(MGEST, "(%d:%d) time:%d cur:%d\n",
                        ev->any_event.deviceid, ev->any_event.sync, (int)ev->any.time, (int)GetTimeInMillis());
@@ -4868,11 +4629,6 @@ GestureHandleMTSyncEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
                        pPalm->biggest_wmajor = 0;
                        pPalm->bigger_wmajor = 0;
                        g_pGesture->enqueue_fulled = 0;
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-                       pBezel->is_active = BEZEL_ON;
-                       g_pGesture->bezel_filter_mask = 0;
-                       g_pGesture->bezel_recognized_mask = 0;
-#endif
                        for( i=0 ; i < g_pGesture->num_mt_devices ; i++ )
                                g_pGesture->fingers[i].ptime = 0;
                }
@@ -4881,7 +4637,7 @@ GestureHandleMTSyncEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
                g_pGesture->no_palm_events = FALSE;
                g_pGesture->stylusInfo.fake_events = FALSE;
                g_pGesture->palm_detected = FALSE;
-               memset(&g_pGesture->last_touches, 0, sizeof(g_pGesture->last_touches));
+               memset(g_pGesture->last_touches, 0, g_pGesture->num_mt_devices*sizeof(CurTouchStatus));
        }
        else if( MTOUCH_FRAME_SYNC_END == ev->any_event.sync )
        {
@@ -4890,6 +4646,8 @@ GestureHandleMTSyncEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
 #endif//__DEBUG_EVENT_HANDLER
                g_pGesture->mtsync_status = MTOUCH_FRAME_SYNC_END;
                g_pGesture->touch_cancel_status = FALSE;
+               for( i=0 ; i < g_pGesture->num_mt_devices ; i++ )
+                       g_pGesture->fingers[i].status = BTN_RELEASED;
 
                if(g_pGesture->is_active)
                {
@@ -4906,12 +4664,12 @@ GestureHandleMTSyncEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
                        g_pGesture->event_sum[0] = 0;
                        pPalm->max_touched = 0;
                        g_pGesture->hold_detected = FALSE;
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-                       pBezel->is_active = BEZEL_END;
-                       g_pGesture->bezel_filter_mask = BezelFlickFilterMask;
-#endif
                }
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
                for(i=0; i<MAX_MT_DEVICES; i++)
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+               for(i=0; i<g_pGesture->num_mt_devices; i++)
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
                {
                        g_pGesture->stylusInfo.t_status[i].status = BTN_RELEASED;
                }
@@ -4932,13 +4690,13 @@ GestureGetMTToolValuator(InternalEvent *ev, DeviceIntPtr device)
                return -1;
        }
 
-       if (0 > mt_tool_idx)
+       if (mt_tool_idx < 0)
        {
                XDBG_WARNING(MGEST, "One or more of axes are not supported !\n");
                return -1;
        }
 
-       if (ev->any.type == ET_ButtonPress || ev->any.type == ET_ButtonRelease)
+       if (ev->any.type == GESTURE_TOUCH_PRESS || ev->any.type == GESTURE_TOUCH_RELEASE)
        {
                if (device->id == g_pGesture->master_pointer->id && g_pGesture->stylusInfo.stylus_id == g_pGesture->first_fingerid)
                        de->valuators.data[mt_tool_idx] = 1;
@@ -4957,7 +4715,11 @@ GestureRegisterTouchInfo(InternalEvent *ev, DeviceIntPtr device)
 {
        int idx;
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        idx = GestureGetFingerIndexFromDevice(device);
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       idx = GestureGetTouchIndex(device->id, ev->device_event.touchid, ev->device_event.type);
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
        if (idx < 0)
        {
                if (device->id != g_pGesture->master_pointer->id)
@@ -4966,14 +4728,14 @@ GestureRegisterTouchInfo(InternalEvent *ev, DeviceIntPtr device)
        }
        switch(ev->any.type)
        {
-               case ET_ButtonPress:
+               case GESTURE_TOUCH_PRESS:
                        g_pGesture->stylusInfo.t_status[idx].status = BTN_PRESSED;
                        break;
-               case ET_Motion:
+               case GESTURE_TOUCH_MOTION:
                        if (g_pGesture->stylusInfo.t_status[idx].status == BTN_PRESSED)
                                g_pGesture->stylusInfo.t_status[idx].status = BTN_MOVING;
                        break;
-               case ET_ButtonRelease:
+               case GESTURE_TOUCH_RELEASE:
                        g_pGesture->stylusInfo.t_status[idx].status = BTN_RELEASED;
                        break;
                default:
@@ -4998,7 +4760,7 @@ GestureSetToolData(InternalEvent *ev, double val_tool)
                return;
        }
 
-       if (0 > mt_tool_idx)
+       if (mt_tool_idx < 0)
        {
                XDBG_WARNING(MGEST, "One or more of axes are not supported !\n");
                return;
@@ -5023,33 +4785,49 @@ GestureCleanupTouch(int screen_num, InternalEvent *ev, DeviceIntPtr device)
        {
                g_pGesture->stylusInfo.pen_detected = TRUE;
                g_pGesture->stylusInfo.fake_events = TRUE;
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
                for(i=0; i<MAX_MT_DEVICES; i++)
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+               for(i=0; i<g_pGesture->num_mt_devices; i++)
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
                {
                        if (g_pGesture->stylusInfo.t_status[i].status == BTN_PRESSED || g_pGesture->stylusInfo.t_status[i].status == BTN_MOVING)
                        {
                                InternalEvent release_ev;
                                memcpy(&release_ev, ev, sizeof(InternalEvent));
                                release_ev.any.time = ev->any.time;
-                               release_ev.any.type = ET_ButtonRelease;
+                               release_ev.any.type = GESTURE_TOUCH_RELEASE;
 
                                release_ev.device_event.detail.button = 1;
-                               release_ev.device_event.type = ET_ButtonRelease;
+                               release_ev.device_event.type = GESTURE_TOUCH_RELEASE;
                                release_ev.device_event.root_x = g_pGesture->stylusInfo.t_status[i].cx;
                                release_ev.device_event.root_y = g_pGesture->stylusInfo.t_status[i].cy;
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
                                release_ev.device_event.deviceid = g_pGesture->mt_devices[i]->id;
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+                               release_ev.device_event.deviceid = g_pGesture->mt_devices->id;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
+
                                g_pGesture->stylusInfo.t_status[i].status = BTN_RELEASED;
                                GestureSetToolData(&release_ev, (double)0);
-
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
                                GestureHandleButtonReleaseEvent(screen_num, &release_ev, g_pGesture->mt_devices[i]);
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+                               GestureHandleButtonReleaseEvent(screen_num, &release_ev, g_pGesture->mt_devices);
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
                                if (g_pGesture->mt_devices[i]->id == g_pGesture->first_fingerid)
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+                               if (i == 0)
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
                                {
                                        InternalEvent release_mev;
                                        memcpy(&release_mev, ev, sizeof(InternalEvent));
                                        release_mev.any.time = ev->any.time;
-                                       release_mev.any.type = ET_ButtonRelease;
+                                       release_mev.any.type = GESTURE_TOUCH_RELEASE;
 
                                        release_mev.device_event.detail.button = 1;
-                                       release_mev.device_event.type = ET_ButtonRelease;
+                                       release_mev.device_event.type = GESTURE_TOUCH_RELEASE;
                                        release_mev.device_event.root_x = g_pGesture->stylusInfo.t_status[i].cx;
                                        release_mev.device_event.root_y = g_pGesture->stylusInfo.t_status[i].cy;
                                        release_mev.device_event.deviceid = g_pGesture->master_pointer->id;
@@ -5076,11 +4854,11 @@ GestureChangeEventToFirstFingerEvent(int screen_num, InternalEvent *ev, DeviceIn
 
        switch(ev->any.type)
        {
-               case ET_ButtonPress:
+               case GESTURE_TOUCH_PRESS:
                        if(!(device->id < g_pGesture->first_fingerid))
                                g_pGesture->num_pressed++;
                        break;
-               case ET_ButtonRelease:
+               case GESTURE_TOUCH_RELEASE:
                        if(!(device->id < g_pGesture->first_fingerid))
                                g_pGesture->num_pressed--;
                        break;
@@ -5088,7 +4866,11 @@ GestureChangeEventToFirstFingerEvent(int screen_num, InternalEvent *ev, DeviceIn
                        break;
        }
        memcpy(&master_ev, ev, sizeof(InternalEvent));
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        g_pGesture->mt_devices[0]->public.processInputProc(ev, g_pGesture->mt_devices[0]);
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       g_pGesture->mt_devices->public.processInputProc(ev, g_pGesture->mt_devices);
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
        master_ev.device_event.deviceid = g_pGesture->master_pointer->id;
        g_pGesture->master_pointer->public.processInputProc(&master_ev, g_pGesture->master_pointer);
@@ -5097,23 +4879,38 @@ GestureChangeEventToFirstFingerEvent(int screen_num, InternalEvent *ev, DeviceIn
 void
 GestureHandleButtonPressEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
 {
+       int idx = 0;
+
+       TTRACE_BEGIN("XORG:GESTURE:BUTTON_PRESS");
 #ifdef __DEBUG_EVENT_HANDLER__
-       XDBG_DEBUG(MGEST, "mode: %d devid=%d time:%d cur: %d (%d, %d)\n",
-               g_pGesture->ehtype, device->id, ev->any.time, GetTimeInMillis(), ev->device_event.root_x, ev->device_event.root_y);
+       XDBG_DEBUG(MGEST, "mode: %d devid=%d touchid: %d, time:%d cur: %d (%d, %d)\n",
+               g_pGesture->ehtype, device->id, ev->device_event.touchid, ev->any.time, GetTimeInMillis(), ev->device_event.root_x, ev->device_event.root_y);
 #endif//__DEBUG_EVENT_HANDLER__
-       int idx=0;
        if (g_pGesture->touch_cancel_status == TRUE)
        {
                XDBG_DEBUG(MGEST, "Ignore Button Press event after touch cancel generated. \n");
                return;
        }
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        idx = GestureGetFingerIndexFromDevice(device);
+
        if (0 <= idx)
        {
                g_pGesture->last_touches[idx].status = BTN_PRESSED;
                g_pGesture->last_touches[idx].cx = ev->device_event.root_x;
                g_pGesture->last_touches[idx].cy = ev->device_event.root_y;
        }
+#else
+       idx = GestureFindTouchIndex(ev->device_event.deviceid, ev->device_event.touchid, ev->device_event.type);
+       if (idx < 0 && ev->device_event.deviceid != g_pGesture->master_pointer->id) {
+               device->public.processInputProc(ev, device);
+               goto out;
+       }
+
+       g_pGesture->last_touches[idx].status = BTN_PRESSED;
+       g_pGesture->last_touches[idx].cx = ev->device_event.root_x;
+       g_pGesture->last_touches[idx].cy = ev->device_event.root_y;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
        if (g_pGesture->stylus_able)
        {
@@ -5140,13 +4937,13 @@ GestureHandleButtonPressEvent(int screen_num, InternalEvent *ev, DeviceIntPtr de
                        {
                                if (!(g_pGesture->stylusInfo.stylus_id == g_pGesture->first_fingerid && device->id == g_pGesture->master_pointer->id))
                                {
-                                       return;
+                                       goto out;
                                }
                        }
                        else if (device->id != g_pGesture->first_fingerid)
                        {
                                GestureChangeEventToFirstFingerEvent(screen_num, ev, device);
-                               return;
+                               goto out;
                        }
                }
        }
@@ -5157,29 +4954,28 @@ GestureHandleButtonPressEvent(int screen_num, InternalEvent *ev, DeviceIntPtr de
                        if( ERROR_INVALPTR == GestureEnqueueEvent(screen_num, ev,  device) )
                        {
                                GestureControl(g_pGesture->this_device, DEVICE_OFF);
-                               return;
+                               goto out;
                        }
                        if( g_pGesture->num_mt_devices )
                        {
                                if(!(device->id < g_pGesture->first_fingerid))
                                        g_pGesture->num_pressed++;
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-                               if(!(g_pGesture->bezel_filter_mask == BezelFlickFilterMask))
-                                       GestureBezelRecognize(ET_ButtonPress, ev, device);
-#endif
                                if(!(g_pGesture->filter_mask == GESTURE_FILTER_MASK_ALL))
-                                       GestureRecognize(ET_ButtonPress, ev, device);
+                                       GestureRecognize(GESTURE_TOUCH_PRESS, ev, device);
                                if(!(g_pGesture->palm_filter_mask == GESTURE_PALM_FILTER_MASK_ALL))
                                {
                                        if (PalmRecognize)
-                                               _GESTUREPALMRECOGNIZE_(PalmRecognize, ET_ButtonPress, ev, device)
+                                               _GESTUREPALMRECOGNIZE_(PalmRecognize, GESTURE_TOUCH_PRESS, ev, device)
                                        else
-                                               g_pGesture->ehtype = PROPAGATE_EVENTS;
+                                       {
+                                               g_pGesture->palm_filter_mask = GESTURE_PALM_FILTER_MASK_ALL;
+                                               GestureFlushOrDrop();
+                                       }
                                }
                        }
                        else
                                device->public.processInputProc(ev, device);
-                       GestureHoldDetector(ET_ButtonPress, ev, device);
+                       GestureHoldDetector(GESTURE_TOUCH_PRESS, ev, device);
                        break;
 
                case PROPAGATE_EVENTS:
@@ -5193,50 +4989,64 @@ GestureHandleButtonPressEvent(int screen_num, InternalEvent *ev, DeviceIntPtr de
                        {
                                device->public.processInputProc(ev, device);
                        }
-                       GestureHoldDetector(ET_ButtonPress, ev, device);
+                       GestureHoldDetector(GESTURE_TOUCH_PRESS, ev, device);
                        break;
 
                case IGNORE_EVENTS:
                        if(!(device->id < g_pGesture->first_fingerid))
                                g_pGesture->num_pressed++;
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-                       if(!(g_pGesture->bezel_filter_mask == BezelFlickFilterMask))
-                               GestureBezelRecognize(ET_ButtonPress, ev, device);
-#endif
                        if(!(g_pGesture->filter_mask == GESTURE_FILTER_MASK_ALL))
-                               GestureRecognize(ET_ButtonPress, ev, device);
+                               GestureRecognize(GESTURE_TOUCH_PRESS, ev, device);
                        if(!(g_pGesture->palm_filter_mask == GESTURE_PALM_FILTER_MASK_ALL))
                        {
                                if (PalmRecognize)
-                                       _GESTUREPALMRECOGNIZE_(PalmRecognize, ET_ButtonPress, ev, device);
+                                       _GESTUREPALMRECOGNIZE_(PalmRecognize, GESTURE_TOUCH_PRESS, ev, device);
                        }
                        break;
 
                default:
                        break;
        }
+out:
+       TTRACE_END();
+       return;
 }
 
 void
 GestureHandleMotionEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
 {
+       int idx = 0;
+
+       TTRACE_BEGIN("XORG:GESTURE:MOTION");
 #ifdef __DEBUG_EVENT_HANDLER__
-       XDBG_DEBUG(MGEST, "mode: %d devid=%d time:%d cur: %d (%d, %d)\n",
-               g_pGesture->ehtype, device->id, ev->any.time, GetTimeInMillis(), ev->device_event.root_x, ev->device_event.root_y);
+       XDBG_DEBUG(MGEST, "mode: %d devid=%d touchid: %d, time:%d cur: %d (%d, %d)\n",
+               g_pGesture->ehtype, device->id, ev->device_event.touchid, ev->any.time, GetTimeInMillis(), ev->device_event.root_x, ev->device_event.root_y);
 #endif//__DEBUG_EVENT_HANDLER__
-       int idx=0;
        if (g_pGesture->touch_cancel_status == TRUE)
        {
                XDBG_DEBUG(MGEST, "Ignore Button Press event after touch cancel generated. \n");
                return;
        }
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        idx = GestureGetFingerIndexFromDevice(device);
+
        if (0 <= idx)
        {
                g_pGesture->last_touches[idx].status = BTN_MOVING;
                g_pGesture->last_touches[idx].cx = ev->device_event.root_x;
                g_pGesture->last_touches[idx].cy = ev->device_event.root_y;
        }
+#else
+       idx = GestureFindTouchIndex(ev->device_event.deviceid, ev->device_event.touchid, ev->device_event.type);
+       if (idx < 0 && ev->device_event.deviceid != g_pGesture->master_pointer->id) {
+               device->public.processInputProc(ev, device);
+               goto out;
+       }
+
+       g_pGesture->last_touches[idx].status = BTN_MOVING;
+       g_pGesture->last_touches[idx].cx = ev->device_event.root_x;
+       g_pGesture->last_touches[idx].cy = ev->device_event.root_y;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
        if (g_pGesture->stylus_able)
        {
@@ -5263,13 +5073,13 @@ GestureHandleMotionEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
                        {
                                if (!(g_pGesture->stylusInfo.stylus_id == g_pGesture->first_fingerid && device->id == g_pGesture->master_pointer->id))
                                {
-                                       return;
+                                       goto out;
                                }
                        }
                        else if (device->id != g_pGesture->first_fingerid)
                        {
                                GestureChangeEventToFirstFingerEvent(screen_num, ev, device);
-                               return;
+                               goto out;
                        }
                }
        }
@@ -5280,27 +5090,26 @@ GestureHandleMotionEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
                        if( ERROR_INVALPTR == GestureEnqueueEvent(screen_num, ev,  device) )
                        {
                                GestureControl(g_pGesture->this_device, DEVICE_OFF);
-                               return;
+                               goto out;
                        }
                        if( g_pGesture->num_mt_devices )
                        {
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-                               if(!(g_pGesture->bezel_filter_mask == BezelFlickFilterMask))
-                                       GestureBezelRecognize(ET_Motion, ev, device);
-#endif
                                if(!(g_pGesture->filter_mask == GESTURE_FILTER_MASK_ALL))
-                                       GestureRecognize(ET_Motion, ev, device);
+                                       GestureRecognize(GESTURE_TOUCH_MOTION, ev, device);
                                if(!(g_pGesture->palm_filter_mask == GESTURE_PALM_FILTER_MASK_ALL))
                                {
                                        if (PalmRecognize)
-                                               _GESTUREPALMRECOGNIZE_(PalmRecognize, ET_Motion, ev, device)
+                                               _GESTUREPALMRECOGNIZE_(PalmRecognize, GESTURE_TOUCH_MOTION, ev, device)
                                        else
-                                               g_pGesture->ehtype = PROPAGATE_EVENTS;
+                                       {
+                                               g_pGesture->palm_filter_mask = GESTURE_PALM_FILTER_MASK_ALL;
+                                               GestureFlushOrDrop();
+                                       }
                                }
                        }
                        else
                                device->public.processInputProc(ev, device);
-                       GestureHoldDetector(ET_Motion, ev, device);
+                       GestureHoldDetector(GESTURE_TOUCH_MOTION, ev, device);
                        break;
 
                case PROPAGATE_EVENTS:
@@ -5312,49 +5121,64 @@ GestureHandleMotionEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
                        {
                                device->public.processInputProc(ev, device);
                        }
-                       GestureHoldDetector(ET_Motion, ev, device);
+                       GestureHoldDetector(GESTURE_TOUCH_MOTION, ev, device);
                        break;
 
                case IGNORE_EVENTS:
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-                       if(!(g_pGesture->bezel_filter_mask == BezelFlickFilterMask))
-                               GestureBezelRecognize(ET_Motion, ev, device);
-#endif
                        if(!(g_pGesture->filter_mask == GESTURE_FILTER_MASK_ALL))
-                               GestureRecognize(ET_Motion, ev, device);
+                               GestureRecognize(GESTURE_TOUCH_MOTION, ev, device);
                        if(!(g_pGesture->palm_filter_mask == GESTURE_PALM_FILTER_MASK_ALL))
                        {
                                if (PalmRecognize)
-                                       _GESTUREPALMRECOGNIZE_(PalmRecognize, ET_Motion, ev, device);
+                                       _GESTUREPALMRECOGNIZE_(PalmRecognize, GESTURE_TOUCH_MOTION, ev, device);
                        }
                        break;
 
                default:
                        break;
        }
-
+out:
+       TTRACE_END();
+       return;
 }
 
 void
 GestureHandleButtonReleaseEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
 {
-#ifdef __DEBUG_EVENT_HANDLER__
-       XDBG_DEBUG(MGEST, "mode: %d devid=%d time:%d cur: %d (%d, %d)\n",
-               g_pGesture->ehtype, device->id, ev->any.time, GetTimeInMillis(), ev->device_event.root_x, ev->device_event.root_y);
+       int idx = 0;
+
+       TTRACE_BEGIN("XORG:GESTURE:BUTTON_RELEASE");
+#if 1//def __DEBUG_EVENT_HANDLER__
+       XDBG_DEBUG(MGEST, "mode: %d devid=%d touchid: %d, time:%d cur: %d (%d, %d)\n",
+               g_pGesture->ehtype, device->id, ev->device_event.touchid, ev->any.time, GetTimeInMillis(), ev->device_event.root_x, ev->device_event.root_y);
 #endif//__DEBUG_EVENT_HANDLER__
-       int idx=0;
        if (g_pGesture->touch_cancel_status == TRUE)
        {
                XDBG_DEBUG(MGEST, "Ignore Button Press event after touch cancel generated. \n");
                return;
        }
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        idx = GestureGetFingerIndexFromDevice(device);
+
        if (0 <= idx)
        {
                g_pGesture->last_touches[idx].status = BTN_RELEASED;
                g_pGesture->last_touches[idx].cx = ev->device_event.root_x;
                g_pGesture->last_touches[idx].cy = ev->device_event.root_y;
        }
+#else
+       idx = GestureFindTouchIndex(ev->device_event.deviceid, ev->device_event.touchid, ev->device_event.type);
+       if (idx < 0 && ev->device_event.deviceid != g_pGesture->master_pointer->id) {
+               device->public.processInputProc(ev, device);
+               goto out;
+       }
+
+       g_pGesture->last_touches[idx].status = BTN_RELEASED;
+       g_pGesture->last_touches[idx].cx = ev->device_event.root_x;
+       g_pGesture->last_touches[idx].cy = ev->device_event.root_y;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
+
+
 
        if (g_pGesture->stylus_able)
        {
@@ -5385,13 +5209,13 @@ GestureHandleButtonReleaseEvent(int screen_num, InternalEvent *ev, DeviceIntPtr
                        {
                                if (!(g_pGesture->stylusInfo.stylus_id == g_pGesture->first_fingerid && device->id == g_pGesture->master_pointer->id))
                                {
-                                       return;
+                                       goto out;
                                }
                        }
                        else if (device->id != g_pGesture->first_fingerid)
                        {
                                GestureChangeEventToFirstFingerEvent(screen_num, ev, device);
-                               return;
+                               goto out;
                        }
                }
        }
@@ -5402,34 +5226,33 @@ deliver_event:
                        if( ERROR_INVALPTR == GestureEnqueueEvent(screen_num, ev,  device) )
                        {
                                GestureControl(g_pGesture->this_device, DEVICE_OFF);
-                               return;
+                               goto out;
                        }
                        if( g_pGesture->num_mt_devices )
                        {
                                if(!(device->id < g_pGesture->first_fingerid))
                                        g_pGesture->num_pressed--;
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-                               if(!(g_pGesture->bezel_filter_mask == BezelFlickFilterMask))
-                                       GestureBezelRecognize(ET_ButtonRelease, ev, device);
-#endif
                                if(!(g_pGesture->filter_mask == GESTURE_FILTER_MASK_ALL))
-                                       GestureRecognize(ET_ButtonRelease, ev, device);
+                                       GestureRecognize(GESTURE_TOUCH_RELEASE, ev, device);
                                if(!(g_pGesture->palm_filter_mask == GESTURE_PALM_FILTER_MASK_ALL))
                                {
                                        if (PalmRecognize)
-                                               _GESTUREPALMRECOGNIZE_(PalmRecognize, ET_ButtonRelease, ev, device)
+                                               _GESTUREPALMRECOGNIZE_(PalmRecognize, GESTURE_TOUCH_RELEASE, ev, device)
                                        else
-                                               g_pGesture->num_mt_devices = PROPAGATE_EVENTS;
+                                       {
+                                               g_pGesture->palm_filter_mask = GESTURE_PALM_FILTER_MASK_ALL;
+                                               GestureFlushOrDrop();
+                                       }
                                }
                        }
                        else
                                device->public.processInputProc(ev, device);
-                       GestureHoldDetector(ET_ButtonRelease, ev, device);
+                       GestureHoldDetector(GESTURE_TOUCH_RELEASE, ev, device);
                        break;
 
                case PROPAGATE_EVENTS:
 #ifdef SUPPORT_ANR_WITH_INPUT_EVENT
-                     if( IsMaster(device) && ev->any.type == ET_ButtonRelease )
+                     if( IsMaster(device) && ev->any.type == GESTURE_TOUCH_RELEASE )
                      {
                          if( g_pGesture->anr_window == NULL )
                          {
@@ -5467,33 +5290,33 @@ deliver_event:
                        {
                                device->public.processInputProc(ev, device);
                        }
-                       GestureHoldDetector(ET_ButtonRelease, ev, device);
+                       GestureHoldDetector(GESTURE_TOUCH_RELEASE, ev, device);
                        break;
 
                case IGNORE_EVENTS:
                        if(!(device->id < g_pGesture->first_fingerid))
                                g_pGesture->num_pressed--;
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-                       if(!(g_pGesture->bezel_filter_mask == BezelFlickFilterMask))
-                               GestureBezelRecognize(ET_ButtonRelease, ev, device);
-#endif
                        if(!(g_pGesture->filter_mask == GESTURE_FILTER_MASK_ALL))
-                               GestureRecognize(ET_ButtonRelease, ev, device);
+                               GestureRecognize(GESTURE_TOUCH_RELEASE, ev, device);
                        if(!(g_pGesture->palm_filter_mask == GESTURE_PALM_FILTER_MASK_ALL))
                        {
                                if (PalmRecognize)
-                                       _GESTUREPALMRECOGNIZE_(PalmRecognize, ET_ButtonRelease, ev, device);
+                                       _GESTUREPALMRECOGNIZE_(PalmRecognize, GESTURE_TOUCH_RELEASE, ev, device);
                        }
                        break;
 
                default:
                        break;
        }
+out:
+       TTRACE_END();
+       return;
 }
 
 void
 GestureHandleKeyPressEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
 {
+       TTRACE_BEGIN("XORG:GESTURE:KEY_PRESS");
 #ifdef __DEBUG_EVENT_HANDLER__
        XDBG_DEBUG(MGEST, "devid=%d time:%d cur:%d\n", device->id, ev->any.time, GetTimeInMillis());
 #endif//__DEBUG_EVENT_HANDLER__
@@ -5518,6 +5341,7 @@ GestureHandleKeyPressEvent(int screen_num, InternalEvent *ev, DeviceIntPtr devic
                        }
 
                        XDBG_SECURE(MGEST, "Ignore KeyPress (devid:%d, keycode:%d) during LCD Off!\n", device->id, ev->device_event.detail.key);
+                       TTRACE_END();
                        return;
                }
        }
@@ -5547,43 +5371,95 @@ handle_keypress:
                        XDBG_INFO(MGEST, "Ignore TouchKey KEY_BACK (devid:%d)\n", device->id);
                else
                        XDBG_SECURE(MGEST, "Ignore TouchKey KeyPress (devid:%d, keycode:%d)\n", device->id, ev->device_event.detail.key);
+               TTRACE_END();
                return;
        }
-
+       TTRACE_END();
        device->public.processInputProc(ev, device);
 }
 
 void
 GestureHandleKeyReleaseEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
 {
+       TTRACE_BEGIN("XORG:GESTURE:KEY_RELEASE");
        if (g_pGesture->pass_keycodes[3] == ev->device_event.detail.key)
        {
                XDBG_SECURE(MGEST, "TIME = %d, keycode = %d\n", ev->any.time, ev->device_event.detail.key);
        }
+       TTRACE_END();
     device->public.processInputProc(ev, device);
 }
 
+void GestureHandleRawButtonPressEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
+{
+       int i;
+       TTRACE_BEGIN("XORG:GESTURE:RAW_BUTTON_PRESS");
+
+       if (g_pGesture->touch_cancel_status == TRUE)
+       {
+               XDBG_DEBUG(MGEST, "Ignore Raw Button Press event after touch cancel generated. \n");
+               TTRACE_END();
+               return;
+       }
+       TTRACE_END();
+       device->public.processInputProc(ev, device);
+}
+
+void GestureHandleRawButtonReleaseEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
+{
+       int i;
+       TTRACE_BEGIN("XORG:GESTURE:RAW_BUTTON_RELEASE");
+
+       if (g_pGesture->touch_cancel_status == TRUE)
+       {
+               XDBG_DEBUG(MGEST, "Ignore Raw Button Release event after touch cancel generated. \n");
+               TTRACE_END();
+               return;
+       }
+       TTRACE_END();
+       device->public.processInputProc(ev, device);
+}
+
+void GestureHandleRawMotionEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
+{
+       int i;
+       TTRACE_BEGIN("XORG:GESTURE:RAW_MOTION");
+
+       if (g_pGesture->touch_cancel_status == TRUE)
+       {
+               XDBG_DEBUG(MGEST, "Ignore Raw Motion event after touch cancel generated. \n");
+               TTRACE_END();
+               return;
+       }
+       TTRACE_END();
+       device->public.processInputProc(ev, device);
+}
+
 static ErrorStatus
 GestureEnableEventHandler(InputInfoPtr pInfo)
  {
        Bool res;
        GestureDevicePtr pGesture = pInfo->private;
 
+       TTRACE_BEGIN("XORG:GESTURE:ENABLE_EVENT_HANDLER");
+
        res = GestureInstallResourceStateHooks();
 
        if( !res )
        {
                XDBG_ERROR(MGEST, "Failed on GestureInstallResourceStateHooks() !\n");
+               TTRACE_END();
                return ERROR_ABNORMAL;
        }
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        res = GestureSetMaxNumberOfFingers((int)MAX_MT_DEVICES);
-
        if( !res )
        {
                XDBG_ERROR(MGEST, "Failed on GestureSetMaxNumberOfFingers(%d) !\n", (int)MAX_MT_DEVICES);
                goto failed;
        }
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
        res = GestureRegisterCallbacks(GestureCbEventsGrabbed, GestureCbEventsSelected);
 
@@ -5593,12 +5469,16 @@ GestureEnableEventHandler(InputInfoPtr pInfo)
                goto failed;
        }
 
+       GestureRegisterDeviceInfo(pInfo->dev);
+
+       TTRACE_END();
        return ERROR_NONE;
 
 failed:
        GestureUninstallResourceStateHooks();
        GestureUnsetMaxNumberOfFingers();
 
+       TTRACE_END();
        return ERROR_ABNORMAL;
 }
 
@@ -5609,10 +5489,13 @@ GestureDisableEventHandler(void)
 
        mieqSetHandler(ET_KeyPress, NULL);
        mieqSetHandler(ET_KeyRelease, NULL);
-       mieqSetHandler(ET_ButtonPress, NULL);
-       mieqSetHandler(ET_ButtonRelease, NULL);
-       mieqSetHandler(ET_Motion, NULL);
+       mieqSetHandler(GESTURE_TOUCH_PRESS, NULL);
+       mieqSetHandler(GESTURE_TOUCH_RELEASE, NULL);
+       mieqSetHandler(GESTURE_TOUCH_MOTION, NULL);
        mieqSetHandler(ET_MTSync, NULL);
+       mieqSetHandler(GESTURE_RAW_TOUCH_PRESS, NULL);
+       mieqSetHandler(GESTURE_RAW_TOUCH_RELEASE, NULL);
+       mieqSetHandler(GESTURE_RAW_TOUCH_MOTION, NULL);
 
        err = GestureFiniEQ();
 
@@ -5638,12 +5521,16 @@ GestureRegisterDeviceInfo(DeviceIntPtr device)
        int idx = 0;
        int i;
 
-       XDBG_INFO(MGEST, "Get devices information\n");
+       TTRACE_BEGIN("XORG:GESTURE:REGISTER_DEVICE");
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        for (i=0; i<MAX_MT_DEVICES; i++)
        {
                pGesture->mt_devices[i] = NULL;
        }
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       pGesture->mt_devices = NULL;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
        for( dev = inputInfo.pointer ; dev; dev = dev->next )
        {
@@ -5663,6 +5550,7 @@ GestureRegisterDeviceInfo(DeviceIntPtr device)
 
                if(IsPointerDevice(dev))
                {
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
                        if( idx >= MAX_MT_DEVICES )
                        {
                                XDBG_WARNING(MGEST, "Number of mt device is over MAX_MT_DEVICES(%d) !\n",
@@ -5673,10 +5561,27 @@ GestureRegisterDeviceInfo(DeviceIntPtr device)
                        {
                                pGesture->mt_devices[idx] = dev;
                                XDBG_INFO(MGEST, "[id:%d] MT device[%d] name=%s\n", dev->id, idx, pGesture->mt_devices[idx]->name);
-                               ErrorF("[id:%d] MT device[%d] name=%s\n", dev->id, idx, pGesture->mt_devices[idx]->name);
                                GesturePalmGetAbsAxisInfo(dev);
                                idx++;
                        }
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+                       if (strcasestr(dev->name, "Touchscreen"))
+                       {
+                               pGesture->mt_devices = dev;
+                               XDBG_INFO(MGEST, "[id: %d] MT device name=%s\n", dev->id, pGesture->mt_devices->name);
+                               TouchClassPtr touchInfo = dev->touch;
+                               if (touchInfo)
+                               {
+                                       XDBG_INFO(MGEST, "touchInfo state: %d, num_touches: %d, max_touches: %d\n",
+                                               touchInfo->state, touchInfo->num_touches, touchInfo->max_touches);
+                                       idx = touchInfo->max_touches;
+                               }
+                               else
+                               {
+                                       XDBG_INFO(MGEST, "device(%d) hasn't touch class\n", dev->id);
+                               }
+                       }
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
                }
        }
 
@@ -5685,6 +5590,7 @@ GestureRegisterDeviceInfo(DeviceIntPtr device)
                XDBG_ERROR(MGEST, "Failed to get info of master pointer or XTest pointer !\n");
                pGesture->num_mt_devices = 0;
 
+               TTRACE_END();
                return;
        }
 
@@ -5694,12 +5600,29 @@ GestureRegisterDeviceInfo(DeviceIntPtr device)
        {
                XDBG_ERROR(MGEST, "Failed to mt device information !\n");
                pGesture->num_mt_devices = 0;
-       pGesture->first_fingerid = -1;
+               pGesture->first_fingerid = -1;
+
+               TTRACE_END();
                return;
        }
-
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        pGesture->first_fingerid = pGesture->mt_devices[0]->id;
        memset(pGesture->fingers, 0, sizeof(TouchStatus)*pGesture->num_mt_devices);
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       GestureAlloc(pGesture->num_mt_devices);
+       pGesture->first_fingerid = pGesture->mt_devices->id;
+       GesturePalmGetAbsAxisInfo(pGesture->mt_devices);
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
+
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+       Bool res = GestureSetMaxNumberOfFingers(g_pGesture->num_mt_devices);
+
+       if( !res )
+       {
+               XDBG_ERROR(MGEST, "Failed on GestureSetMaxNumberOfFingers(%d) !\n", g_pGesture->num_mt_devices);
+               goto failed;
+       }
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
        pGesture->pRootWin = RootWindow(pGesture->master_pointer);
 
@@ -5728,17 +5651,22 @@ GestureRegisterDeviceInfo(DeviceIntPtr device)
 
        mieqSetHandler(ET_KeyPress, GestureHandleKeyPressEvent);
        mieqSetHandler(ET_KeyRelease, GestureHandleKeyReleaseEvent);
-       mieqSetHandler(ET_ButtonPress, GestureHandleButtonPressEvent);
-       mieqSetHandler(ET_ButtonRelease, GestureHandleButtonReleaseEvent);
-       mieqSetHandler(ET_Motion, GestureHandleMotionEvent);
+       mieqSetHandler(GESTURE_TOUCH_PRESS, GestureHandleButtonPressEvent);
+       mieqSetHandler(GESTURE_TOUCH_RELEASE, GestureHandleButtonReleaseEvent);
+       mieqSetHandler(GESTURE_TOUCH_MOTION, GestureHandleMotionEvent);
+       mieqSetHandler(GESTURE_RAW_TOUCH_PRESS, GestureHandleRawButtonPressEvent);
+       mieqSetHandler(GESTURE_RAW_TOUCH_RELEASE, GestureHandleRawButtonReleaseEvent);
+       mieqSetHandler(GESTURE_RAW_TOUCH_MOTION, GestureHandleRawMotionEvent);
        mieqSetHandler(ET_MTSync, GestureHandleMTSyncEvent);
 
+       TTRACE_END();
        return;
 
 failed:
-
        GestureUninstallResourceStateHooks();
        GestureUnsetMaxNumberOfFingers();
+
+       TTRACE_END();
 }
 
 BOOL
@@ -5753,67 +5681,146 @@ IsXTestDevice(DeviceIntPtr dev, DeviceIntPtr master)
        return (dev->xtest_master_id != 0);
 }
 
+TouchPointInfoPtr
+GestureTouchFindByClientID(DeviceIntPtr dev)
+{
+    TouchClassPtr t = dev->touch;
+    TouchPointInfoPtr ti;
+    int i;
+
+    if (!t)
+        return NULL;
+
+    for (i = 0; i < t->num_touches; i++) {
+        ti = &t->touches[i];
+        if (ti->active)
+            return ti;
+    }
+
+    return NULL;
+}
+
 void
 GestureGenerateTouchCancelEvent(void)
 {
-    int i;
-    Bool canceled_touch_index[MAX_MT_DEVICES] = {FALSE, };
+    InternalEvent cancel_event;
+    TouchPointInfoPtr ti, pressed_touch_info, ti_master;
+    TouchListener *listener, *listener_master;
+    TouchClassPtr current_touch_class;
+    int i, idx;
 
-    if (g_pGesture->mtsync_status == MTOUCH_FRAME_SYNC_END)
+    TTRACE_BEGIN("XORG:GESTURE:GENERATE_TOUCHCANCEL");
+
+    memset(&cancel_event, 0, sizeof(InternalEvent));
+
+    if (g_pGesture->mtsync_status == MTOUCH_FRAME_SYNC_END || g_pGesture->touch_cancel_status == TRUE)
     {
-        XDBG_DEBUG(MGEST, "no Touch(%d)\n", g_pGesture->mtsync_status);
+        XDBG_DEBUG(MGEST, "no Touch(%d) or Cancel events already generated(%d).\n", g_pGesture->mtsync_status, g_pGesture->touch_cancel_status);
+        TTRACE_END();
         return;
     }
 
-    for (i=0; i<MAX_MT_DEVICES; i++)
+    if (!g_pGesture->mt_devices)
     {
-        if (!(g_pGesture->mt_devices[i]->button->buttonsDown)) continue;
-        InternalEvent cancel_event;
-
-        cancel_event.touch_cancel_event.header = ET_Internal;
-        cancel_event.touch_cancel_event.type = ET_TouchCancel;
-        cancel_event.touch_cancel_event.length = sizeof(TouchCancelEvent);
-        cancel_event.touch_cancel_event.time = CurrentTime;
-        cancel_event.touch_cancel_event.deviceid = g_pGesture->mt_devices[i]->id;
-
-        cancel_event.touch_cancel_event.sourceid = g_pGesture->mt_devices[i]->id;
-        cancel_event.touch_cancel_event.resource = 0;
-        cancel_event.touch_cancel_event.flags = 0;
-
-        g_pGesture->mt_devices[i]->public.processInputProc(&cancel_event, g_pGesture->mt_devices[i]);
-        canceled_touch_index[i] = TRUE;
-        g_pGesture->touch_cancel_status = TRUE;
+        XDBG_DEBUG(MGEST, "Multi touch device is not registered\n");
+        TTRACE_END();
+        return;
     }
 
-    for (i=0; i<MAX_MT_DEVICES; i++)
+    cancel_event.touch_cancel_event.header = ET_Internal;
+    cancel_event.touch_cancel_event.type = ET_TouchCancel;
+    cancel_event.touch_cancel_event.length = sizeof(TouchCancelEvent);
+    cancel_event.touch_cancel_event.time = CurrentTime;
+    cancel_event.touch_cancel_event.deviceid = g_pGesture->mt_devices->id;
+
+    ti = GestureTouchFindByClientID(g_pGesture->mt_devices);
+    cancel_event.touch_cancel_event.sourceid = ti?ti->sourceid:0;
+    listener = ti?ti->listeners:NULL;
+    cancel_event.touch_cancel_event.resource = listener?listener->listener:0;
+    cancel_event.touch_cancel_event.flags = 0;
+
+    ti_master = GestureTouchFindByClientID(g_pGesture->master_pointer);
+
+    if (!ti || !ti_master)
     {
-        if (canceled_touch_index[i] == FALSE) continue;
-        InternalEvent release_event;
-        InternalEvent release_event_master;
-
-        memset(&release_event, 0, sizeof(InternalEvent));
-
-        release_event.device_event.header = ET_Internal;
-        release_event.device_event.type = ET_ButtonRelease;
-        release_event.device_event.length = sizeof(DeviceEvent);
-        release_event.device_event.time = CurrentTime;
-        release_event.device_event.deviceid = g_pGesture->mt_devices[i]->id;
-        release_event.device_event.sourceid = g_pGesture->mt_devices[i]->button->sourceid;
-        release_event.device_event.detail.button = 1;
-        release_event.device_event.root_x = g_pGesture->last_touches[i].cx;
-        release_event.device_event.root_y = g_pGesture->last_touches[i].cy;
-        if (g_pGesture->mt_devices[i]->id == g_pGesture->first_fingerid)
-        {
-            memcpy(&release_event_master, &release_event, sizeof(InternalEvent));
-            release_event_master.device_event.deviceid = g_pGesture->master_pointer->id;
-        }
+        XDBG_WARNING(MGEST, "Currently touches are released some other reasons: (touch reject)\n");
+        TTRACE_END();
+        return;
+    }
 
-        g_pGesture->mt_devices[i]->public.processInputProc(&release_event, g_pGesture->mt_devices[i]);
-        if (g_pGesture->mt_devices[i]->id == g_pGesture->first_fingerid)
-        {
-            g_pGesture->master_pointer->public.processInputProc(&release_event_master, g_pGesture->master_pointer);
+    g_pGesture->mt_devices->public.processInputProc(&cancel_event, g_pGesture->mt_devices);
+
+    current_touch_class = g_pGesture->mt_devices->touch;
+
+    XDBG_DEBUG(MGEST, "Generate Touch Cancel event\n");
+
+    if (current_touch_class)
+    {
+        for (i = 0; i < current_touch_class->num_touches; i++) {
+            pressed_touch_info = &current_touch_class->touches[i];
+            if (pressed_touch_info->active) {
+                idx = GestureGetTouchIndex(pressed_touch_info->sourceid, pressed_touch_info->client_id, ET_TouchCancel);
+                InternalEvent release_event;
+                InternalEvent release_event_master;
+
+                InternalEvent raw_release_event;
+                InternalEvent raw_release_event_master;
+
+                memset(&release_event, 0, sizeof(InternalEvent));
+                memset(&raw_release_event, 0, sizeof(InternalEvent));
+
+                raw_release_event.raw_event.header = ET_Internal;
+                raw_release_event.raw_event.type = ET_RawTouchEnd;
+                raw_release_event.raw_event.length = sizeof(RawDeviceEvent);
+                raw_release_event.raw_event.time = CurrentTime;
+                raw_release_event.raw_event.deviceid = g_pGesture->mt_devices->id;
+                raw_release_event.raw_event.sourceid = g_pGesture->mt_devices->button->sourceid;
+                raw_release_event.raw_event.detail.button = pressed_touch_info->client_id;
+                raw_release_event.raw_event.valuators.mask[0] = 0x3;
+                raw_release_event.raw_event.valuators.data_raw[0] = raw_release_event.raw_event.valuators.data[0] = g_pGesture->last_touches[idx].cx * 1.0;
+                raw_release_event.raw_event.valuators.data_raw[1] = raw_release_event.raw_event.valuators.data[1] = g_pGesture->last_touches[idx].cy * 1.0;
+
+                memcpy(&raw_release_event_master, &raw_release_event, sizeof(InternalEvent));
+                raw_release_event_master.raw_event.deviceid = g_pGesture->master_pointer->id;
+
+                g_pGesture->mt_devices->public.processInputProc(&raw_release_event, g_pGesture->mt_devices);
+                g_pGesture->master_pointer->public.processInputProc(&raw_release_event_master, g_pGesture->master_pointer);
+
+                release_event.device_event.header = ET_Internal;
+                release_event.device_event.type = ET_TouchEnd;
+                release_event.device_event.length = sizeof(DeviceEvent);
+                release_event.device_event.time = CurrentTime;
+                release_event.device_event.deviceid = g_pGesture->mt_devices->id;
+                release_event.device_event.sourceid = g_pGesture->mt_devices->button->sourceid;
+                release_event.device_event.touchid = pressed_touch_info->client_id;
+
+                release_event.device_event.root_x = g_pGesture->last_touches[idx].cx;
+                release_event.device_event.root_y = g_pGesture->last_touches[idx].cy;
+
+                memcpy(&release_event_master, &release_event, sizeof(InternalEvent));
+                release_event_master.device_event.deviceid = g_pGesture->master_pointer->id;
+
+                if (ti && ti->emulate_pointer)
+                {
+                    release_event.device_event.flags |= TOUCH_POINTER_EMULATED;
+                    release_event.device_event.detail.button = 1;
+                }
+                if (ti_master && ti_master->emulate_pointer)
+                {
+                    release_event_master.device_event.flags |= TOUCH_POINTER_EMULATED;
+                    release_event_master.device_event.detail.button = 1;
+                }
+
+//                XDBG_DEBUG(MGEST, "Generate a touch end event for index: %d\n", idx);
+                g_pGesture->mt_devices->public.processInputProc(&release_event, g_pGesture->mt_devices);
+                g_pGesture->master_pointer->public.processInputProc(&release_event_master, g_pGesture->master_pointer);
+
+                g_pGesture->touch_cancel_status = TRUE;
+            }
         }
     }
+
+    TTRACE_END();
 }
 
 static void
@@ -5821,12 +5828,102 @@ GestureDPMSCallback(CallbackListPtr *pcbl, void *unused, void *calldata)
 {
     int dpmsLevel = *(int *)calldata;
 
+    XDBG_DEBUG(MGEST, "TouchCancel mtsync_status: %d, dpmslevel: %d\n", g_pGesture->mtsync_status, dpmsLevel);
+
     if ((DPMSModeOff == dpmsLevel) && (MTOUCH_FRAME_SYNC_END != g_pGesture->mtsync_status)) {
         XDBG_DEBUG(MGEST, "TouchCancel dpmslevel: %d\n", dpmsLevel);
         GestureGenerateTouchCancelEvent();
     }
 }
 
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+static void
+GestureAlloc(int capability)
+{
+       if (!g_pGesture)
+       {
+               ErrorF("[GestureAlloc] Failed to allocate a gesture drv's structures\n");
+               return;
+       }
+
+       g_pGesture->cts = (CurTouchStatus *)calloc(capability, sizeof(CurTouchStatus));
+       g_pGesture->finger_rects = (pixman_region16_t *)calloc(capability, sizeof(pixman_region16_t));
+       g_pGesture->fingers = (TouchStatus *)calloc(capability, sizeof(TouchStatus));
+       g_pGesture->event_sum= (int *)calloc(capability, sizeof(int));
+       g_pGesture->stylusInfo.t_status = (CurTouchStatus *)calloc(capability, sizeof(CurTouchStatus));
+       g_pGesture->last_touches = (CurTouchStatus *)calloc(capability, sizeof(CurTouchStatus));
+}
+
+static void
+GestureDealloc()
+{
+       if (!g_pGesture)
+       {
+               ErrorF("[GestureDealloc] Failed to free a gesture drv's structures\n");
+               return;
+       }
+
+       if (g_pGesture->cts) {
+               free(g_pGesture->cts);
+               g_pGesture->cts = NULL;
+       }
+       if (g_pGesture->finger_rects) {
+               free(g_pGesture->finger_rects);
+               g_pGesture->finger_rects = NULL;
+       }
+       if (g_pGesture->fingers) {
+               free(g_pGesture->fingers);
+               g_pGesture->fingers = NULL;
+       }
+       if (g_pGesture->event_sum) {
+               free(g_pGesture->event_sum);
+               g_pGesture->event_sum = NULL;
+       }
+       if (g_pGesture->last_touches) {
+               free(g_pGesture->last_touches);
+               g_pGesture->last_touches = NULL;
+       }
+}
+
+static void
+GesturePalmAlloc(int capability)
+{
+       if (!g_pGesture)
+       {
+               ErrorF("[GesturePalmAlloc] Failed to allocate a gesture drv's palm structures\n");
+               return;
+       }
+
+       g_pGesture->palm.pti = (PalmTouchInfo *)calloc(capability, sizeof(PalmTouchInfo));
+       g_pGesture->palm.qti = (QueuedTouchInfo *)calloc(capability+1, sizeof(QueuedTouchInfo));
+       g_pGesture->palm.finger_rects = (pixman_region16_t *)calloc(capability, sizeof(pixman_region16_t));
+}
+
+static void
+GesturePalmDealloc(int capability)
+{
+       if (!g_pGesture)
+       {
+               ErrorF("[GesturePalmDealloc] Failed to allocate a gesture drv's palm structures\n");
+               return;
+       }
+
+       if (g_pGesture->palm.pti) {
+               free(g_pGesture->palm.pti);
+               g_pGesture->palm.pti = NULL;
+       }
+       if (g_pGesture->palm.qti) {
+               free(g_pGesture->palm.qti);
+               g_pGesture->palm.qti = NULL;
+       }
+       if (g_pGesture->palm.finger_rects) {
+               free(g_pGesture->palm.finger_rects);
+               g_pGesture->palm.finger_rects = NULL;
+       }
+}
+
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
+
 void
 GestureEnable(int enable, Bool prop, DeviceIntPtr dev)
 {
@@ -5857,7 +5954,11 @@ GestureRegionsInit(void)
        pixman_region_init(&g_pGesture->area);
        pixman_region_init(&pPalm->area);
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        for( i = 0 ; i < MAX_MT_DEVICES ; i++ )
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       for( i = 0 ; i < g_pGesture->num_mt_devices; i++ )
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
        {
                pixman_region_init_rect (&g_pGesture->finger_rects[i], 0, 0, FINGER_WIDTH_2T, FINGER_HEIGHT_2T);
                pixman_region_init_rect (&pPalm->finger_rects[i], 0, 0, FINGER_WIDTH_2T, FINGER_HEIGHT_2T);
@@ -5880,7 +5981,11 @@ GestureRegionsReinit(void)
        pixman_region_init(&g_pGesture->area);
        pixman_region_init(&pPalm->area);
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        for( i = 0 ; i < MAX_MT_DEVICES ; i++ )
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       for( i = 0 ; i < g_pGesture->num_mt_devices; i++ )
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
        {
                pixman_region_init_rect (&pPalm->finger_rects[i], 0, 0, FINGER_WIDTH_2T, FINGER_HEIGHT_2T);
        }
@@ -6005,18 +6110,8 @@ GestureEnqueueEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
                                GesturePalmRecognize_FlickVertical(ev->any.type, 0);
                        }
                }
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-               if(!(g_pGesture->bezel_filter_mask == BezelFlickFilterMask))
-               {
-                       GestureBezelRecognize(ev->any.type, ev, device);
-               }
-#endif
                g_pGesture->filter_mask = GESTURE_FILTER_MASK_ALL;
                g_pGesture->palm_filter_mask = GESTURE_PALM_FILTER_MASK_ALL;
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-               g_pGesture->bezel_filter_mask = BezelFlickFilterMask;
-               g_pGesture->bezel_recognized_mask = 0;
-#endif
                g_pGesture->recognized_gesture = 0;
                g_pGesture->recognized_palm = 0;
                if( ERROR_INVALPTR == GestureFlushOrDrop() )
@@ -6029,16 +6124,16 @@ GestureEnqueueEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
 #ifdef __DETAIL_DEBUG__
        switch( ev->any.type )
        {
-               case ET_ButtonPress:
-                       XDBG_DEBUG(MGEST, "ET_ButtonPress (id:%d)\n", device->id);
+               case GESTURE_TOUCH_PRESS:
+                       XDBG_DEBUG(MGEST, "Press (id:%d)\n", device->id);
                        break;
 
-               case ET_ButtonRelease:
-                       XDBG_DEBUG(MGEST, "ET_ButtonRelease (id:%d)\n", device->id);
+               case GESTURE_TOUCH_RELEASE:
+                       XDBG_DEBUG(MGEST, "Release (id:%d)\n", device->id);
                        break;
 
-               case ET_Motion:
-                       XDBG_DEBUG(MGEST, "ET_Motion (id:%d)\n", device->id);
+               case GESTURE_TOUCH_MOTION:
+                       XDBG_DEBUG(MGEST, "Motion (id:%d)\n", device->id);
                        break;
        }
 #endif//__DETAIL_DEBUG__
@@ -6057,9 +6152,12 @@ GestureEventsFlush(void)
        int i, j;
        DeviceIntPtr device;
 
+       TTRACE_BEGIN("XORG:GESTURE:FLUSH_EVENT");
+
        if( !g_pGesture->EQ )
        {
                XDBG_ERROR(MGEST, "Invalid pointer access !\n");
+               TTRACE_END();
                return ERROR_INVALPTR;
        }
 
@@ -6071,31 +6169,35 @@ GestureEventsFlush(void)
        {
                device = g_pGesture->EQ[i].device;
 #ifdef __DETAIL_DEBUG__
-               if(g_pGesture->EQ[i].event->any.type != ET_Motion)
+               if(g_pGesture->EQ[i].event->any.type != GESTURE_TOUCH_MOTION)
                        XDBG_DEBUG(MGEST, "[%d] type: %d\n", device->id, g_pGesture->EQ[i].event->any.type);
 #endif//__DETAIL_DEBUG__
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
                for(j = 0 ; j < MAX_MT_DEVICES+1 ; j++)
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+               for(j = 0 ; j < (g_pGesture->num_mt_devices+1) ; j++)
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
                {
                        if(g_pGesture->palm.qti[j].devid == device->id)
                        {
 #ifdef __DETAIL_DEBUG__
-                               if(g_pGesture->EQ[i].event->any.type != ET_Motion)
+                               if(g_pGesture->EQ[i].event->any.type != GESTURE_TOUCH_MOTION)
                                        XDBG_DEBUG(MGEST, "[%d] type: %d(pressed: %d) time: %d\n", device->id, g_pGesture->EQ[i].event->any.type, g_pGesture->palm.qti[j].pressed, GetTimeInMillis());
 #endif//__DETAIL_DEBUG__
-                               if( (g_pGesture->palm.qti[j].pressed == 0) && (g_pGesture->EQ[i].event->any.type == ET_ButtonRelease) )
+                               if( (g_pGesture->palm.qti[j].pressed == 0) && (g_pGesture->EQ[i].event->any.type == GESTURE_TOUCH_RELEASE) )
                                {
                                        XDBG_WARNING(MGEST, "Enqueued event..ButtonRelease with no ButtonPress !(devid: %d)\n", device->id);
-                                       g_pGesture->EQ[i].event->any.type = ET_ButtonPress;
+                                       g_pGesture->EQ[i].event->any.type = GESTURE_TOUCH_PRESS;
                                        device->public.processInputProc(g_pGesture->EQ[i].event, device);
-                                       g_pGesture->EQ[i].event->any.type = ET_ButtonRelease;
+                                       g_pGesture->EQ[i].event->any.type = GESTURE_TOUCH_RELEASE;
                                        g_pGesture->palm.qti[j].pressed = 0;
                                }
-                               else if(g_pGesture->EQ[i].event->any.type == ET_ButtonPress)
+                               else if(g_pGesture->EQ[i].event->any.type == GESTURE_TOUCH_PRESS)
                                {
                                        g_pGesture->palm.qti[j].pressed = 1;
                                }
-                               else if( (g_pGesture->palm.qti[j].pressed == 1) && (g_pGesture->EQ[i].event->any.type == ET_ButtonRelease))
+                               else if( (g_pGesture->palm.qti[j].pressed == 1) && (g_pGesture->EQ[i].event->any.type == GESTURE_TOUCH_RELEASE))
                                {
                                        g_pGesture->palm.qti[j].pressed = 0;
                                }
@@ -6108,18 +6210,27 @@ GestureEventsFlush(void)
                        }
                }
 #ifdef __DETAIL_DEBUG__
-               if(g_pGesture->EQ[i].event->any.type != ET_Motion)
+               if(g_pGesture->EQ[i].event->any.type != GESTURE_TOUCH_MOTION)
                        XDBG_DEBUG(MGEST, "!!! [%d] type: %d\n", device->id, g_pGesture->EQ[i].event->any.type);
 #endif
                device->public.processInputProc(g_pGesture->EQ[i].event, device);
        }
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        memset(g_pGesture->palm.qti, 0, sizeof(g_pGesture->palm.qti[MAX_MT_DEVICES+1]));
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       memset(g_pGesture->palm.qti, 0, sizeof(g_pGesture->palm.qti[(g_pGesture->num_mt_devices+1)]));
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        for( i = 0 ; i < MAX_MT_DEVICES ; i++ )
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       for( i = 0 ; i < g_pGesture->num_mt_devices; i++ )
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
                g_pGesture->event_sum[i] = 0;
 
        g_pGesture->headEQ = g_pGesture->tailEQ = 0;//Free EQ
 
+       TTRACE_END();
        return ERROR_NONE;
 }
 
@@ -6160,6 +6271,9 @@ GestureInitProperty(DeviceIntPtr dev)
                return;
 
        XISetDevicePropertyDeletable(dev, prop_gesture_palm_rejection_mode, FALSE);
+
+       prop_gesture_window_stack_changed = MakeAtom(GESTURE_WINDOW_STACK_CHANGED, strlen(GESTURE_WINDOW_STACK_CHANGED), TRUE);
+       XISetDevicePropertyDeletable(dev, prop_gesture_window_stack_changed, FALSE);
 }
 
 static int
@@ -6200,7 +6314,7 @@ GestureSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
                                return Success;
                        }
 
-                       sprintf(buf, "stylus_enable,%d", !!(g_pGesture->palm_rejection_mode));
+                       snprintf(buf, sizeof(buf), "stylus_enable,%d", !!(g_pGesture->palm_rejection_mode));
                        XDBG_DEBUG(MGEST, "stylus_changed: %d!\n", !!(g_pGesture->palm_rejection_mode));
 
                        ret = write(fd, buf, strlen(buf));
@@ -6232,6 +6346,17 @@ GestureSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
                        close(fd_result);
                }
        }
+       else if(prop_gesture_window_stack_changed == atom)
+       {
+               if( val->format != 8 || val->type != XA_INTEGER || val->size != 1 )
+                       return BadMatch;
+
+               if( !checkonly )
+               {
+                       XDBG_DEBUG(MGEST, "stack chagned\n");
+                       GestureGenerateTouchCancelEvent();
+               }
+       }
 
        return Success;
 }
@@ -6240,11 +6365,12 @@ GestureSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
 static int
 GestureInit(DeviceIntPtr device)
 {
+    TTRACE_BEGIN("XORG:GESTURE:INIT");
 #ifdef HAVE_PROPERTIES
        GestureInitProperty(device);
        XIRegisterPropertyHandler(device, GestureSetProperty, NULL, NULL);
 #endif
-
+    TTRACE_END();
        return Success;
 }
 
@@ -6271,15 +6397,15 @@ GesturePreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
 {
     int rc = BadAlloc;
     GestureDevicePtr    pGesture;
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-    BezelFlickStatusPtr pBezel;
-#endif
+
+    TTRACE_BEGIN("XORG:GESTURE:PREINIT");
 
     pGesture = calloc(1, sizeof(GestureDeviceRec));
 
     if (!pGesture) {
         pInfo->private = NULL;
         //xf86DeleteInput(pInfo, 0);
+        TTRACE_END();
         goto error;
     }
 
@@ -6322,29 +6448,6 @@ GesturePreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
 
     pGesture->gestureWin = None;
 
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-    pBezel = &pGesture->bezel;
-    pBezel->is_active = xf86SetIntOption(pInfo->options, "Bezel_Activate", 0);
-    pBezel->top_left.width = xf86SetIntOption(pInfo->options, "Bezel_Top_Left_Width", 0);
-    pBezel->top_left.height = xf86SetIntOption(pInfo->options, "Bezel_Top_Left_Height", 0);
-    pBezel->top_right.width = xf86SetIntOption(pInfo->options, "Bezel_Top_Right_Width", 0);
-    pBezel->top_right.height = xf86SetIntOption(pInfo->options, "Bezel_Top_Right_Height", 0);
-    pBezel->bottom_left.width = xf86SetIntOption(pInfo->options, "Bezel_Bottom_Left_Width", 0);
-    pBezel->bottom_left.height = xf86SetIntOption(pInfo->options, "Bezel_Bottom_Left_Height", 0);
-    pBezel->bottom_right.width = xf86SetIntOption(pInfo->options, "Bezel_Bottom_Right_Width", 0);
-    pBezel->bottom_right.height = xf86SetIntOption(pInfo->options, "Bezel_Bottom_Right_Height", 0);
-    pBezel->flick_distance = xf86SetIntOption(pInfo->options, "Bezel_Flick_Distance", 0);
-    pBezel->bezel_angle_ratio = xf86SetIntOption(pInfo->options, "Bezel_Flick_Angle_Ratio", 0);
-    pBezel->bezel_angle_moving_check = xf86SetIntOption(pInfo->options, "Bezel_Flick_Angle_Moving_Check", 0);
-#ifdef __BEZEL_DEBUG__
-       XDBG_DEBUG(MGEST, "[BEZEL] top_left.width: %d, top_left.height: %d\n", pBezel->top_left.width, pBezel->top_left.height);
-       XDBG_DEBUG(MGEST, "[BEZEL] top_right.width: %d, top_right.height: %d\n", pBezel->top_right.width, pBezel->top_right.height);
-       XDBG_DEBUG(MGEST, "[BEZEL] bottom_left.width: %d, bottom_left.height: %d\n", pBezel->bottom_left.width, pBezel->bottom_left.height);
-       XDBG_DEBUG(MGEST, "[BEZEL] bottom_right.width: %d, bottom_right.height: %d\n", pBezel->bottom_right.width, pBezel->bottom_right.height);
-       XDBG_DEBUG(MGEST, "[BEZEL] flick_distance: %d, bezel_angle_ratio: %d, bezel_angle_moving_check: %d\n", pBezel->flick_distance, pBezel->bezel_angle_ratio, pBezel->bezel_angle_moving_check);
-#endif//__BEZEL_DEBUG__
-#endif
-
        pGesture->pinchrotation_time_threshold = xf86SetIntOption(pInfo->options, "PinchRotationTimeThresHold", PINCHROTATION_TIME_THRESHOLD);
        pGesture->pinchrotation_dist_threshold = xf86SetRealOption(pInfo->options, "PinchRotationDistThresHold", PINCHROTATION_DIST_THRESHOLD);
        pGesture->pinchrotation_angle_threshold = xf86SetRealOption(pInfo->options, "PinchRotationAngleThresHold", PINCHROTATION_ANGLE_THRESHOLD);
@@ -6362,22 +6465,7 @@ GesturePreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
                pGesture->ehtype = KEEP_EVENTS;
        else
                pGesture->ehtype = PROPAGATE_EVENTS;
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-       if(pBezel->bezel_angle_ratio > 0)
-       {
-               pBezel->min_rad = (RAD_90DEG / pBezel->bezel_angle_ratio);
-               pBezel->max_rad = ((RAD_90DEG / pBezel->bezel_angle_ratio) * (pBezel->bezel_angle_ratio-1));
-               pBezel->min_180_rad = (RAD_90DEG + pBezel->min_rad);
-               pBezel->max_180_rad = (RAD_90DEG + pBezel->max_rad);
-       }
-       else
-       {
-               pBezel->min_rad = MIN_RAD;
-               pBezel->max_rad = MAX_RAD;
-               pBezel->min_180_rad = RAD_180DEG_MIN;
-               pBezel->max_180_rad = RAD_180DEG_MAX;
-       }
-#endif
+
     pGesture->lastSelectedWin = None;
     pGesture->touchkey_id = 0;
     pGesture->mtsync_status = MTOUCH_FRAME_SYNC_END;
@@ -6397,22 +6485,34 @@ GesturePreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
        g_pGesture->palm.palm_single_finger_timer = NULL;
        g_pGesture->enqueue_fulled = 0;
        g_pGesture->zoom_enabled = 0;
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        memset(g_pGesture->palm.qti, 0, sizeof(g_pGesture->palm.qti[MAX_MT_DEVICES+1]));
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       g_pGesture->palm.pti = NULL;
+       g_pGesture->palm.qti = NULL;
+       g_pGesture->palm.finger_rects = NULL;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
        g_pGesture->palm_rejection_mode = 0;
        g_pGesture->palm_detected = FALSE;
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        memset(g_pGesture->stylusInfo.t_status, 0, sizeof(g_pGesture->stylusInfo.t_status[MAX_MT_DEVICES]));
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       g_pGesture->stylusInfo.t_status = NULL;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
        g_pGesture->stylusInfo.stylus_id = 0;
        g_pGesture->stylusInfo.pen_detected = FALSE;
-
        g_pGesture->touch_cancel_status = FALSE;
 
+    TTRACE_END();
+
     return Success;
 
 error:
     if (pInfo->fd >= 0)
         close(pInfo->fd);
+    TTRACE_END();
     return rc;
 }
 
@@ -6474,6 +6574,7 @@ device_off:
             /* free what we have to free */
             break;
       case DEVICE_READY:
+      xf86Msg(X_INFO, "%s: device ready.\n", pInfo->name);
             GestureRegisterDeviceInfo(device);
             break;
     }
@@ -6484,4 +6585,3 @@ static void
 GestureReadInput(InputInfoPtr pInfo)
 {
 }
-
index 23bc008..3f94a29 100644 (file)
@@ -45,6 +45,16 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define ABS_CNT (ABS_MAX+1)
 #endif
 
+#ifdef ENABLE_TTRACE
+#include <ttrace.h>
+
+#define TTRACE_BEGIN(NAME) traceBegin(TTRACE_TAG_INPUT, NAME)
+#define TTRACE_END() traceEnd(TTRACE_TAG_INPUT)
+#else //ENABLE_TTRACE
+#define TTRACE_BEGIN(NAME)
+#define TTRACE_END()
+#endif //ENABLE_TTRACE
+
 /**
  * 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.
@@ -66,6 +76,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #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 GESTURE_WINDOW_STACK_CHANGED "GESTURE_WINDOW_STACK_CHANGED"
 
 #define FINGER_WIDTH           10
 #define FINGER_HEIGHT          10
@@ -202,11 +213,29 @@ enum
 #define AXIS_LABEL_PROP_ABS_MT_PALM        "Abs MT Palm/MT Sumsize"
 #define AXIS_LABEL_PROP_ABS_MISC           "Abs Misc"
 
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+#define GESTURE_TOUCH_PRESS ET_TouchBegin
+#define GESTURE_TOUCH_MOTION ET_TouchUpdate
+#define GESTURE_TOUCH_RELEASE ET_TouchEnd
+
+#define GESTURE_RAW_TOUCH_PRESS ET_RawTouchBegin
+#define GESTURE_RAW_TOUCH_MOTION ET_RawTouchUpdate
+#define GESTURE_RAW_TOUCH_RELEASE ET_RawTouchEnd
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+#define GESTURE_TOUCH_PRESS ET_ButtonPress
+#define GESTURE_TOUCH_MOTION ET_Motion
+#define GESTURE_TOUCH_RELEASE ET_ButtonRelease
+
+#define GESTURE_RAW_TOUCH_PRESS ET_RawButtonPress
+#define GESTURE_RAW_TOUCH_MOTION ET_RawMotion
+#define GESTURE_RAW_TOUCH_RELEASE ET_RawButtonRelease
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
 typedef enum _MTSyncType
 {
        MTOUCH_FRAME_SYNC_END,
-       MTOUCH_FRAME_SYNC_BEGIN
+       MTOUCH_FRAME_SYNC_BEGIN,
+       MTOUCH_FRAME_SYNC_UPDATE
 } MTSyncType;
 
 typedef enum _EventHandleType
@@ -229,12 +258,28 @@ enum EventType
 {
     ET_KeyPress = 2,
     ET_KeyRelease,
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
     ET_ButtonPress,
     ET_ButtonRelease,
     ET_Motion,
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+    ET_TouchBegin = 7,
+    ET_TouchUpdate,
+    ET_TouchEnd,
+    ET_TouchOwnership,
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
     /*
     ...
     */
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
+    ET_RawButtonPress = 22,
+    ET_RawButtonRelease,
+    ET_RawMotion,
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+    ET_RawTouchBegin = 25,
+    ET_RawTouchUpdate,
+    ET_RawTouchEnd,
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
     ET_TouchCancel = 31,
     ET_MTSync = 0x7E,
     ET_Internal = 0xFF /* First byte */
@@ -279,6 +324,7 @@ struct _DeviceEvent {
     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 */
+    uint32_t resource; /**< Touch event resource, only for TOUCH_REPLAYING */
 };
 
 typedef struct _AnyEvent AnyEvent;
@@ -306,6 +352,25 @@ struct _TouchCancelEvent {
     uint32_t flags;       /**< Flags to be copied into the generated event */
 };
 
+typedef struct _RawDeviceEvent RawDeviceEvent;
+struct _RawDeviceEvent {
+    unsigned char header; /**<  Always ET_Internal */
+    enum EventType type;  /**<  ET_Raw */
+    int length;           /**<  Length in bytes */
+    Time time;            /**<  Time in ms */
+    int deviceid;         /**< Device to post this event for */
+    int sourceid;         /**< The physical source device */
+    union {
+        uint32_t button;  /**< Button number */
+        uint32_t key;     /**< Key code */
+    } detail;
+    struct {
+        uint8_t mask[(MAX_VALUATORS + 7) / 8];/**< Valuator mask */
+        double data[MAX_VALUATORS];           /**< Valuator data */
+        double data_raw[MAX_VALUATORS];       /**< Valuator data as posted */
+    } valuators;
+    uint32_t flags;       /**< Flags to be copied into the generated event */
+};
 
 
 union _InternalEvent {
@@ -317,6 +382,7 @@ union _InternalEvent {
        } any;
        AnyEvent any_event;
        DeviceEvent device_event;
+       RawDeviceEvent raw_event;
        TouchCancelEvent touch_cancel_event;
 };
 
@@ -333,21 +399,21 @@ typedef struct _DevCursorNode {
 } DevCursNodeRec, *DevCursNodePtr, *DevCursorList;
 
 typedef struct _WindowOpt {
-    VisualID           visual;            /* default: same as parent */
-    CursorPtr          cursor;            /* default: window.cursorNone */
-    Colormap           colormap;          /* default: same as parent */
-    Mask               dontPropagateMask; /* default: window.dontPropagate */
-    Mask               otherEventMasks;   /* default: 0 */
-    struct _OtherClients *otherClients;           /* default: NULL */
-    struct _GrabRec    *passiveGrabs;     /* default: NULL */
-    PropertyPtr                userProps;         /* default: NULL */
-    unsigned long      backingBitPlanes;  /* default: ~0L */
-    unsigned long      backingPixel;      /* default: 0 */
-    RegionPtr          boundingShape;     /* default: NULL */
-    RegionPtr          clipShape;         /* default: NULL */
-    RegionPtr          inputShape;        /* default: NULL */
-    struct _OtherInputMasks *inputMasks;   /* default: NULL */
-    DevCursorList       deviceCursors;     /* default: NULL */
+    CursorPtr cursor;           /* default: window.cursorNone */
+    VisualID visual;            /* default: same as parent */
+    Colormap colormap;          /* default: same as parent */
+    Mask dontPropagateMask;     /* default: window.dontPropagate */
+    Mask otherEventMasks;       /* default: 0 */
+    struct _OtherClients *otherClients; /* default: NULL */
+    struct _GrabRec *passiveGrabs;      /* default: NULL */
+    PropertyPtr userProps;      /* default: NULL */
+    CARD32 backingBitPlanes;    /* default: ~0L */
+    CARD32 backingPixel;        /* default: 0 */
+    RegionPtr boundingShape;    /* default: NULL */
+    RegionPtr clipShape;        /* default: NULL */
+    RegionPtr inputShape;       /* default: NULL */
+    struct _OtherInputMasks *inputMasks;        /* default: NULL */
+    DevCursorList deviceCursors;        /* default: NULL */
 } WindowOptRec, *WindowOptPtr;
 
 typedef struct _Window {
@@ -391,6 +457,12 @@ typedef struct _Window {
 #ifdef ROOTLESS
     unsigned           rootlessUnhittable:1;   /* doesn't hit-test */
 #endif
+
+#define COMPOSITE
+#ifdef COMPOSITE
+    unsigned damagedDescendants:1;      /* some descendants are damaged */
+    unsigned inhibitBGPaint:1;  /* paint the background? */
+#endif
 } WindowRec;
 
 typedef struct _IEvent {
@@ -406,26 +478,6 @@ enum
        BTN_MOVING
 };
 
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-enum
-{
-       BEZEL_NONE,
-       BEZEL_ON,
-       BEZEL_START,
-       BEZEL_DONE,
-       BEZEL_END
-};
-
-enum
-{
-       NO_BEZEL,
-       BEZEL_TOP_LEFT,
-       BEZEL_TOP_RIGHT,
-       BEZEL_BOTTOM_LEFT,
-       BEZEL_BOTTOM_RIGHT
-};
-#endif
-
 #define PressFlagFlick                 0x01//(1 << 0)
 #define PressFlagPan                           0x02//(1 << 1)
 #define PressFlagPinchRotation 0x04//(1 << 2)
@@ -447,13 +499,12 @@ enum
 
 #define GESTURE_PALM_FILTER_MASK_ALL   0x03//(PalmFlickHorizFilterMask | PalmFlickVertiFilterMask)
 
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-#define BezelFlickFilterMask           0x01//(1 << 0)
-#endif
-
 typedef struct _tagTouchStatus
 {
        int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+       int touchid;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
        uint32_t flags;
 
        int px;         //press x
@@ -553,10 +604,16 @@ typedef struct _tagPalmStatus
        int single_timer_expired;
 
        OsTimerPtr palm_single_finger_timer;
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        PalmTouchInfo pti[MAX_MT_DEVICES];
        QueuedTouchInfo qti[MAX_MT_DEVICES+1];
-       pixman_region16_t area;
        pixman_region16_t finger_rects[MAX_MT_DEVICES];
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       PalmTouchInfo *pti;
+       QueuedTouchInfo *qti;
+       pixman_region16_t *finger_rects;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       pixman_region16_t area;
 } PalmStatus, *PalmStatusPtr;
 
 typedef struct _tagPalmDrvStatus
@@ -571,36 +628,16 @@ typedef struct _tagPalmDrvStatus
 
 typedef struct _tagStylusStatus
 {
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        CurTouchStatus t_status[MAX_MT_DEVICES];
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       CurTouchStatus *t_status;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
        int stylus_id;
        Bool pen_detected;
        Bool fake_events;
 } StylusInfo, *StylusInfoPtr;
 
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-typedef struct _tagBezelStatus
-{
-       int width;
-       int height;
-}BezelStatus, *BezelStatusPtr;
-typedef struct _tagBezelFlickStatus
-{
-       int is_active;
-       BezelStatus top_left;
-       BezelStatus top_right;
-       BezelStatus bottom_left;
-       BezelStatus bottom_right;
-       int flick_distance;
-       int bezel_angle_ratio;
-       double min_rad;
-       double max_rad;
-       double min_180_rad;
-       double max_180_rad;
-       int bezel_angle_moving_check;
-       int bezelStatus;
-}BezelFlickStatus, *BezelFlickStatusPtr;
-#endif
-
 typedef struct _GestureDeviceRec
 {
        char *device;
@@ -653,8 +690,16 @@ typedef struct _GestureDeviceRec
        int hold_detector_activate;
        int has_hold_grabmask;
        pixman_region16_t chold_area;
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        CurTouchStatus cts[MAX_MT_DEVICES];
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       CurTouchStatus *cts;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        CurTouchStatus last_touches[MAX_MT_DEVICES];
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       CurTouchStatus *last_touches;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
        Bool touch_cancel_status;
        Bool hold_detected;
 
@@ -670,7 +715,11 @@ typedef struct _GestureDeviceRec
        int mt_tool_idx;
 
        pixman_region16_t area;
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        pixman_region16_t finger_rects[MAX_MT_DEVICES];
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       pixman_region16_t *finger_rects;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
        WindowPtr pTempWin;
        WindowPtr pTempPalmWin;
@@ -681,9 +730,17 @@ typedef struct _GestureDeviceRec
        int zoom_enabled;
        int enqueue_fulled;
        int tap_repeated;
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        TouchStatus fingers[MAX_MT_DEVICES];
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       TouchStatus *fingers;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        int event_sum[MAX_MT_DEVICES];
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       int *event_sum;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
        uint32_t recognized_gesture;
        uint32_t filter_mask;
        uint32_t palm_filter_mask;
@@ -694,16 +751,17 @@ typedef struct _GestureDeviceRec
 #endif
 
        DeviceIntPtr this_device;
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        DeviceIntPtr mt_devices[MAX_MT_DEVICES];
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       DeviceIntPtr mt_devices;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
        DeviceIntPtr master_pointer;
        DeviceIntPtr xtest_pointer;
-#ifdef _F_SUPPORT_BEZEL_FLICK_
-       BezelFlickStatus bezel;
-#endif
-    WindowPtr anr_window;
+       WindowPtr anr_window;
 
-    int stylus_able;
-    int support_palm;
+       int stylus_able;
+       int support_palm;
 } GestureDeviceRec, *GestureDevicePtr ;
 
 #endif//_GESTURE_H_
index aac856c..447554f 100644 (file)
@@ -1,7 +1,7 @@
 #sbs-git:slp/pkgs/xorg/driver/xserver-xorg-input-gesture xorg-x11-drv-gesture 0.1.0 fb1092a8ea453d658b38d5c28e67a58462d7c931
 Name:  xorg-x11-drv-gesture
 Summary:    X.Org X server -- Xserver gesture driver
-Version: 0.1.60
+Version: 0.1.62
 Release:    1
 VCS:        adaptation/xorg/driver/xserver-xorg-input-gesture#xorg-x11-drv-gesture-0.1.2-8-6-g7c67de9af10190753599a01144e865bf0a341604
 Group:      System/X Hardware Support
@@ -17,6 +17,10 @@ BuildRequires:  pkgconfig(dlog)
 %if "%{?tizen_profile_name}" == "mobile"
 BuildRequires:  pkgconfig(xdbg)
 %endif
+%if "%{?tizen_profile_name}" == "tv"
+BuildRequires:  pkgconfig(xdbg)
+%endif
+BuildRequires: pkgconfig(ttrace)
 
 %description
  This package provides the driver for recognizing gesture(s) using button
@@ -43,7 +47,7 @@ cd mobile
 %endif
 
 #%autogen -ivf
-%reconfigure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS"
+%reconfigure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info CFLAGS="$CFLAGS " LDFLAGS="$LDFLAGS"
 
 make %{?jobs:-j%jobs}
 
index 109646d..00c1559 100644 (file)
@@ -1,4 +1,4 @@
-#  Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved 
+#  Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
 #
 #  Permission to use, copy, modify, distribute, and sell this software and its
 #  documentation for any purpose is hereby granted without fee, provided that
@@ -61,6 +61,10 @@ AC_ARG_WITH([sdkdir], [],
     [sdkdir=`$PKG_CONFIG --variable=sdkdir xorg-server`])
 AC_SUBST([sdkdir])
 
+# ttrace support
+PKG_CHECK_MODULES(TTRACE, [ttrace],
+               AC_DEFINE(ENABLE_TTRACE, 1, [ttrace available]));
+
 # Checks for libraries.
 
 # Checks for header files.
index 695f833..3507345 100644 (file)
@@ -1,4 +1,4 @@
-#  Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved 
+#  Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
 #
 #  Permission to use, copy, modify, distribute, and sell this software and its
 #  documentation for any purpose is hereby granted without fee, provided that
 # -avoid-version prevents gratuitous .0.0.0 version numbers on the end
 # _ladir passes a dummy rpath to libtool so the thing will actually link
 # TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc.
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(XORG_CFLAGS) $(TTRACE_CFLAGS)
 
 @DRIVER_NAME@_drv_la_LTLIBRARIES = @DRIVER_NAME@_drv.la
-@DRIVER_NAME@_drv_la_LDFLAGS = -module -avoid-version
+@DRIVER_NAME@_drv_la_LDFLAGS = -module -avoid-version $(TTRACE_LIBS)
 @DRIVER_NAME@_drv_ladir = @inputdir@
 
 INCLUDES=-I$(top_srcdir)/include/
 
 @DRIVER_NAME@_drv_la_SOURCES = @DRIVER_NAME@.c \
-                               @DRIVER_NAME@.h 
+                               @DRIVER_NAME@.h
 
old mode 100644 (file)
new mode 100755 (executable)
index 6c6b01e..b2ee346
@@ -62,6 +62,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //#define __DEBUG_EVENT_HANDLER__
 //#define __PalmFlick_DEBUG__
 //#define __HOLD_DETECTOR_DEBUG__
+//#define __DEBUG_EVENT_MOTION_HANDLER__
 
 #ifdef __PalmFlick_DEBUG__
 #define PalmFlickDebugPrint ErrorF
@@ -96,11 +97,9 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "gesture.h"
 #include <xorg/mi.h>
 
-#define LOG_TAG        "GESTURE"
+#define LOG_TAG "GESTURE"
 #include "dlog.h"
 
-
-
 char *strcasestr(const char *s, const char *find);
 extern ScreenPtr miPointerCurrentScreen(void);
 static void printk(const char* fmt, ...) __attribute__((format(printf, 1, 0)));
@@ -131,12 +130,19 @@ void GestureEnable(int enable, Bool prop, DeviceIntPtr dev);
 void GestureCbEventsGrabbed(Mask *pGrabMask, GestureGrabEventPtr *pGrabEvent);
 void GestureCbEventsSelected(Window win, Mask *pEventMask);
 WindowPtr GestureGetEventsWindow(void);
-static int GestureGetFingerIndexFromDevice(DeviceIntPtr device);
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+int GestureGetTouchIndex(int deviceid, int touchid, int evtype);
+int GestureFindTouchIndex(int deviceid, int touchid, int evtype);
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+static void GestureAlloc(int capability);
+static void GestureDeAlloc(void);
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
 //Enqueued event handlers and enabler/disabler
 static ErrorStatus GestureEnableEventHandler(InputInfoPtr pInfo);
 static ErrorStatus GestureDisableEventHandler(void);
-static CARD32 GestureTimerHandler(OsTimerPtr timer, CARD32 time, pointer arg);
+static void GestureRegisterDeviceInfo(DeviceIntPtr device);
 static CARD32 GestureEventTimerHandler(OsTimerPtr timer, CARD32 time, pointer arg);
 void GestureHandleMTSyncEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device);
 void GestureHandleButtonPressEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device);
@@ -171,10 +177,6 @@ static void GestureHoldDetector(int type, InternalEvent *ev, DeviceIntPtr device
 static int GesturePalmGetScreenInfo();
 static int GesturePalmGetHorizIndexWithX(int current_x, int idx, int type);
 
-void GestureGenerateTouchCancelEvent(void);
-
-static void GestureDPMSCallback(CallbackListPtr *pcbl, void *unused, void *calldata);
-
 #ifdef HAVE_PROPERTIES
 //function related property handling
 static void GestureInitProperty(DeviceIntPtr dev);
@@ -189,7 +191,6 @@ static Atom prop_anr_event_window = None;
 static Window prop_anr_event_window_xid = None;
 #endif
 
-
 GestureDevicePtr g_pGesture = NULL;
 _X_EXPORT InputDriverRec GESTURE = {
     1,
@@ -223,8 +224,6 @@ _X_EXPORT XF86ModuleData gestureModuleData =
     &GestureUnplug
 };
 
-extern CallbackListPtr DPMSCallback;
-
 static void
 printk(const char* fmt, ...)
 {
@@ -339,9 +338,6 @@ GestureWindowOnXY(int x, int y)
                             pSprite->spriteTraceSize += 10;
                             pSprite->spriteTrace = realloc(pSprite->spriteTrace,
                                     pSprite->spriteTraceSize*sizeof(WindowPtr));
-                            if (!pSprite->spriteTrace) {
-                                return NULL;
-                            }
                         }
                         pSprite->spriteTrace[pSprite->spriteTraceGood++] = pWin;
                         pWin = pWin->firstChild;
@@ -401,6 +397,52 @@ GestureEventTimerHandler(OsTimerPtr timer, CARD32 time, pointer arg)
 
     return 0;
 }
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+int
+GestureGetTouchIndex(int deviceid, int touchid, int evtype)
+{
+    int idx=0, i=0;
+
+    for (i=0; i<g_pGesture->num_mt_devices; i++)
+    {
+        if (g_pGesture->fingers[i].touchid == touchid)
+        {
+            return i;
+        }
+    }
+    ErrorF("[GestureGetTouchIndex] Failed to get touch index, devid: %d, touchid: %d, evsystem: %d\n", deviceid, touchid, evtype);
+    return -1;
+}
+
+int
+GestureFindTouchIndex(int deviceid, int touchid, int evtype)
+{
+    int idx=-1, i=0;
+
+    for (i=0; i<g_pGesture->num_mt_devices; i++)
+    {
+        if (evtype == ET_TouchBegin)
+        {
+            if (g_pGesture->fingers[i].status == BTN_RELEASED)
+            {
+                g_pGesture->fingers[i].status = BTN_PRESSED;
+                g_pGesture->fingers[i].touchid = touchid;
+                return i;
+            }
+        }
+        else if (evtype == ET_TouchUpdate || evtype == ET_TouchEnd)
+        {
+            if (g_pGesture->fingers[i].touchid == touchid)
+            {
+                g_pGesture->fingers[i].status = (evtype == ET_TouchEnd)?BTN_RELEASED:BTN_MOVING;
+                return i;
+            }
+        }
+    }
+    ErrorF("[GesutreFindTouchIndex] Failed to find touch index, devid: %d, touchid: %d, evtype: %d\n", deviceid, touchid, evtype);
+    return -1;
+}
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
 void
 GestureHandleGesture_Tap(int num_finger, int tap_repeat, int cx, int cy)
@@ -448,6 +490,38 @@ GestureHandleGesture_Tap(int num_finger, int tap_repeat, int cx, int cy)
 void
 GestureHandleGesture_Flick(int num_of_fingers, int distance, Time duration, int direction)
 {
+    DeviceIntPtr dev;
+    if (!g_pGesture->hwkey_dev)
+    {
+        for (dev = inputInfo.keyboard ; dev; dev = dev->next)
+        {
+            if (g_pGesture->hwkey_name && !strncmp(dev->name, g_pGesture->hwkey_name, strlen(dev->name)))
+            {
+                g_pGesture->hwkey_id = dev->id;
+                g_pGesture->hwkey_dev = dev;
+
+                ErrorF("[GestureTimerHandler] hwkey_name has been found. hwkey_id=%d (hwkey_dev->name:%s)\n", g_pGesture->hwkey_id, g_pGesture->hwkey_dev->name);
+                break;
+            }
+            else if (!strcasestr(dev->name, "keyboard") && strcasestr(dev->name, "key") && !IsXTestDevice(dev, NULL) && !IsMaster(dev))
+            {
+                g_pGesture->hwkey_id = dev->id;
+                g_pGesture->hwkey_dev = dev;
+
+                ErrorF("[GestureTimerHandler] hwkey has been found. hwkey_id=%d (hwkey_dev->name:%s)\n", g_pGesture->hwkey_id, g_pGesture->hwkey_dev->name);
+                break;
+            }
+        }
+
+        if (!g_pGesture->hwkey_id)
+        {
+            g_pGesture->hwkey_id = inputInfo.keyboard->id;
+            g_pGesture->hwkey_dev = inputInfo.keyboard;
+
+            ErrorF("[GestureTimerHandler] No hwkey has been found. Back key will go through VCK. hwkey_id=%d (hwkey_dev->name:%s)\n",
+                g_pGesture->hwkey_id, g_pGesture->hwkey_dev->name);
+        }
+    }
     if (num_of_fingers == 0)
     {
         Window target_win;
@@ -632,7 +706,7 @@ GestureRecognize_GroupTap(int type, InternalEvent *ev, DeviceIntPtr device, int
 
     switch (type)
     {
-        case ET_ButtonPress:
+        case GESTURE_TOUCH_PRESS:
             g_pGesture->fingers[idx].flags |= PressFlagTap;
 
             if (g_pGesture->num_pressed < 2)
@@ -659,7 +733,7 @@ GestureRecognize_GroupTap(int type, InternalEvent *ev, DeviceIntPtr device, int
             DetailDebugPrint("[GroupTap][P] num_pressed=%d, area_size=%d, base_mx=%d, base_my=%d\n", num_pressed, base_area_size, g_pGesture->fingers[idx].px, g_pGesture->fingers[idx].py);
             break;
 
-        case ET_Motion:
+        case GESTURE_TOUCH_MOTION:
             if (!(g_pGesture->fingers[idx].flags & PressFlagTap))
             {
                 break;
@@ -707,7 +781,7 @@ GestureRecognize_GroupTap(int type, InternalEvent *ev, DeviceIntPtr device, int
             }
             break;
 
-        case ET_ButtonRelease:
+        case GESTURE_TOUCH_RELEASE:
             if (g_pGesture->num_pressed)
             {
                 DetailDebugPrint("[GroupTap][R] Second finger doesn't come up. g_pGesture->num_pressed=%d\n", g_pGesture->num_pressed);
@@ -841,7 +915,7 @@ GestureRecognize_GroupFlick(int type, InternalEvent *ev, DeviceIntPtr device, in
 
     switch (type)
     {
-        case ET_ButtonPress:
+        case GESTURE_TOUCH_PRESS:
             g_pGesture->fingers[idx].flags = PressFlagFlick;
             base_time = GetTimeInMillis();
             num_pressed = g_pGesture->num_pressed;
@@ -894,7 +968,7 @@ GestureRecognize_GroupFlick(int type, InternalEvent *ev, DeviceIntPtr device, in
 
             break;
 
-        case ET_Motion:
+        case GESTURE_TOUCH_MOTION:
 
             motion_count++;
 
@@ -1111,7 +1185,7 @@ GestureRecognize_GroupFlick(int type, InternalEvent *ev, DeviceIntPtr device, in
             }
             break;
 
-        case ET_ButtonRelease:
+        case GESTURE_TOUCH_RELEASE:
             DetailDebugPrint("[GroupFlick][R][F] 16\n");
             goto cleanup_flick;
             break;
@@ -1184,7 +1258,7 @@ void GestureRecognize_GroupHold(int type, InternalEvent *ev, DeviceIntPtr device
 
     switch (type)
     {
-        case ET_ButtonPress:
+        case GESTURE_TOUCH_PRESS:
             g_pGesture->fingers[idx].flags |= PressFlagHold;
 
             if (g_pGesture->num_pressed < 2)
@@ -1224,7 +1298,7 @@ void GestureRecognize_GroupHold(int type, InternalEvent *ev, DeviceIntPtr device
 
             break;
 
-        case ET_Motion:
+        case GESTURE_TOUCH_MOTION:
             if (!(g_pGesture->fingers[idx].flags & PressFlagHold))
             {
                 DetailDebugPrint("[GroupHold][M] No PressFlagHold\n");
@@ -1278,7 +1352,7 @@ void GestureRecognize_GroupHold(int type, InternalEvent *ev, DeviceIntPtr device
             }
             break;
 
-        case ET_ButtonRelease:
+        case GESTURE_TOUCH_RELEASE:
             if (state != GestureEnd && num_pressed >= 2)
             {
                 DetailDebugPrint("[GroupHold][R] No num_finger changed ! num_pressed=%d, g_pGesture->num_pressed=%d\n", num_pressed, g_pGesture->num_pressed);
@@ -1361,10 +1435,10 @@ GestureRecognize_PalmFlick(int type, InternalEvent *ev, DeviceIntPtr device, int
 {
     // static int num_pressed = 0;
     static int base_time = 0, current_time = 0;
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
     static int base_x[MAX_MT_DEVICES] = {0}, base_y[MAX_MT_DEVICES] = {0};
     static int update_x[MAX_MT_DEVICES] = {0}, update_y[MAX_MT_DEVICES] = {0};
 
-
     static int current_x[MAX_MT_DEVICES] = {0}, current_y[MAX_MT_DEVICES] = {0};
     static Bool press_status[MAX_MT_DEVICES] = {FALSE, FALSE};
     static Bool release_status[MAX_MT_DEVICES] = {FALSE, FALSE};
@@ -1377,6 +1451,23 @@ GestureRecognize_PalmFlick(int type, InternalEvent *ev, DeviceIntPtr device, int
     static Bool is_tmajor_invalid[MAX_MT_DEVICES] = {TRUE, TRUE};
 
     static int mt_sync_count[MAX_MT_DEVICES] = {0};
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+    int *base_x = g_pGesture->palmFlickInfo.base_x, *base_y = g_pGesture->palmFlickInfo.base_y;
+    int *update_x = g_pGesture->palmFlickInfo.update_x, *update_y = g_pGesture->palmFlickInfo.update_y;
+
+    int *current_x = g_pGesture->palmFlickInfo.current_x, *current_y = g_pGesture->palmFlickInfo.current_y;
+    Bool *press_status = g_pGesture->palmFlickInfo.press_status;
+    Bool *release_status = g_pGesture->palmFlickInfo.release_status;
+
+    int *line_idx = g_pGesture->palmFlickInfo.line_idx, *prev_line_idx = g_pGesture->palmFlickInfo.prev_line_idx, *press_idx = g_pGesture->palmFlickInfo.press_idx;
+    Bool *is_line_invalid = g_pGesture->palmFlickInfo.is_line_invalid;
+
+    int *max_tmajor = g_pGesture->palmFlickInfo.max_tmajor;
+    static int total_max_tmajor = 0;
+    Bool *is_tmajor_invalid = g_pGesture->palmFlickInfo.is_tmajor_invalid;
+
+    int *mt_sync_count = g_pGesture->palmFlickInfo.mt_sync_count;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
     static Bool is_palm = FALSE;
     PalmMiscInfoPtr pPalmMisc = &g_pGesture->palm_misc;
@@ -1401,7 +1492,7 @@ GestureRecognize_PalmFlick(int type, InternalEvent *ev, DeviceIntPtr device, int
 
     switch (type)
     {
-        case ET_ButtonPress:
+        case GESTURE_TOUCH_PRESS:
 
             if (!is_palm)
             {
@@ -1458,7 +1549,7 @@ GestureRecognize_PalmFlick(int type, InternalEvent *ev, DeviceIntPtr device, int
 
             break;
 
-        case ET_Motion:
+        case GESTURE_TOUCH_MOTION:
 
             if (total_max_tmajor > g_pGesture->palm_flick_max_tmajor_threshold)
             {
@@ -1607,7 +1698,7 @@ GestureRecognize_PalmFlick(int type, InternalEvent *ev, DeviceIntPtr device, int
 
             break;
 
-        case ET_ButtonRelease:
+        case GESTURE_TOUCH_RELEASE:
             current_x[idx] = g_pGesture->fingers[idx].mx;
             current_y[idx] = g_pGesture->fingers[idx].my;
             release_status[idx] = TRUE;
@@ -1717,8 +1808,11 @@ flick_failed:
 cleanup_flick:
 
     DetailDebugPrint("[PalmFlick][R] cleanup_flick\n");
-
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
     for (int i = 0; i < MAX_MT_DEVICES; i++)
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+    for (int i = 0; i < g_pGesture->num_mt_devices; i++)
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
     {
         base_x[i] = 0;
         base_y[i] = 0;
@@ -1749,7 +1843,11 @@ GesturePalmGetHorizIndexWithX(int current_x, int idx, int type)
 {
     int i;
     int ret_idx = -1;
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
     static int pressed_idx[MAX_MT_DEVICES] = {-1, -1};
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+    int *pressed_idx = g_pGesture->palmInfo.pressed_idx;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
     PalmMiscInfoPtr pPalmMisc = &g_pGesture->palm_misc;
 
     for (i = 0; i < PALM_HORIZ_ARRAY_COUNT; i++)
@@ -1768,7 +1866,7 @@ GesturePalmGetHorizIndexWithX(int current_x, int idx, int type)
 
 index_check:
 
-    if (type == ET_ButtonPress)
+    if (type == GESTURE_TOUCH_PRESS)
     {
         pressed_idx[idx] = ret_idx;
 
@@ -1782,12 +1880,12 @@ index_check:
         DetailDebugPrint("[GesturePalmGetHorizIndexWithX][P] pressed_idx=%d\n", pressed_idx[idx]);
     }
 
-    else if (type == ET_Motion)
+    else if (type == GESTURE_TOUCH_MOTION)
     {
         DetailDebugPrint("[GesturePalmGetHorizIndexWithX][M] moving x=%d, idx=%d, pressed_idx=%d\n", current_x, idx, pressed_idx[idx]);
     }
 
-    else if (type == ET_ButtonRelease)
+    else if (type == GESTURE_TOUCH_RELEASE)
     {
         if ((pressed_idx[idx] == 0) && (ret_idx == (PALM_HORIZ_ARRAY_COUNT - 1)))
         {
@@ -1980,20 +2078,24 @@ static void GestureHoldDetector(int type, InternalEvent *ev, DeviceIntPtr device
 
     HoldDetectorDebugPrint("[GestureHoldDetector] g_pGesture->num_mt_devices:%d\n", g_pGesture->num_mt_devices);
 
-    for (i = 0; i < g_pGesture->num_mt_devices; i++)
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
+    for( i = 0 ; i < g_pGesture->num_mt_devices ; i++ )
     {
-        if ( device->id == g_pGesture->mt_devices[i]->id)
+        if( device->id == g_pGesture->mt_devices[i]->id )
         {
             idx = i;
-            HoldDetectorDebugPrint("[GestureHoldDetector] idx:%d\n", idx);
             break;
         }
     }
-    if ((idx < 0) || ((MAX_MT_DEVICES-1) < idx)) return;
+    if( (idx < 0) || ((MAX_MT_DEVICES-1) < idx )) return;
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+    idx = GestureGetTouchIndex(device->id, ev->device_event.touchid, type);
+    if( (idx < 0) || ((g_pGesture->num_mt_devices -1) < idx )) return;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
     switch (type)
     {
-        case ET_ButtonPress:
+        case GESTURE_TOUCH_PRESS:
             g_pGesture->cts[idx].status = BTN_PRESSED;
             g_pGesture->cts[idx].cx = ev->device_event.root_x;
             g_pGesture->cts[idx].cy = ev->device_event.root_y;
@@ -2033,7 +2135,7 @@ static void GestureHoldDetector(int type, InternalEvent *ev, DeviceIntPtr device
             }
             break;
 
-        case ET_Motion:
+        case GESTURE_TOUCH_MOTION:
             if (BTN_RELEASED == g_pGesture->cts[idx].status)
                 return;
 
@@ -2073,7 +2175,7 @@ static void GestureHoldDetector(int type, InternalEvent *ev, DeviceIntPtr device
             }
             break;
 
-        case ET_ButtonRelease:
+        case GESTURE_TOUCH_RELEASE:
             g_pGesture->cts[idx].status = BTN_RELEASED;
             g_pGesture->cts[idx].cx = ev->device_event.root_x;
             g_pGesture->cts[idx].cy = ev->device_event.root_y;
@@ -2279,22 +2381,6 @@ GestureSingleFingerTimerHandler(OsTimerPtr timer, CARD32 time, pointer arg)
     return 0;
 }
 
-static int
-GestureGetFingerIndexFromDevice(DeviceIntPtr device)
-{
-    int i;
-
-    for( i = 0 ; i < g_pGesture->num_mt_devices ; i++ )
-    {
-        if( device->id == g_pGesture->mt_devices[i]->id )
-        {
-            return i;
-        }
-    }
-
-    return -1;
-}
-
 void
 GestureRecognize(int type, InternalEvent *ev, DeviceIntPtr device)
 {
@@ -2306,15 +2392,25 @@ GestureRecognize(int type, InternalEvent *ev, DeviceIntPtr device)
     {
         return;
     }
-
-    idx = GestureGetFingerIndexFromDevice(device);
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
+    for (i = 0; i < g_pGesture->num_mt_devices; i++)
+    {
+        if (device->id == g_pGesture->mt_devices[i]->id)
+        {
+            idx = i;
+            break;
+        }
+    }
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+    idx = GestureGetTouchIndex(device->id, ev->device_event.touchid, type);
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
     if (idx < 0)
         return;
 
     switch (type)
     {
-        case ET_ButtonPress:
+        case GESTURE_TOUCH_PRESS:
             if (idx == 0)
             {
                 g_pGesture->event_sum[0] = BTN_PRESSED;
@@ -2437,7 +2533,7 @@ GestureRecognize(int type, InternalEvent *ev, DeviceIntPtr device)
             }
             break;
 
-        case ET_Motion:
+        case GESTURE_TOUCH_MOTION:
 
             if (!g_pGesture->fingers[idx].ptime)
             {
@@ -2479,7 +2575,7 @@ GestureRecognize(int type, InternalEvent *ev, DeviceIntPtr device)
 
             break;
 
-        case ET_ButtonRelease:
+        case GESTURE_TOUCH_RELEASE:
             g_pGesture->fingers[idx].rtime = ev->any.time;
             g_pGesture->fingers[idx].rx = ev->device_event.root_x;
             g_pGesture->fingers[idx].ry = ev->device_event.root_y;
@@ -2624,10 +2720,23 @@ GestureHandleMTSyncEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
     switch(ev->any_event.sync)
     {
     case ROTARY_FRAME_SYNC_BEGIN:
-        if (g_pGesture->mt_devices[0] && (g_pGesture->mtsync_flag & MTSYNC_FLAG_TOUCH))
+        if (!g_pGesture->rotary_id) {
+            g_pGesture->rotary_id = device->id;
+            g_pGesture->rotary_dev = device;
+        }
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
+        if (g_pGesture->mt_devices[0]
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+        if (g_pGesture->mt_devices
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
+        && (g_pGesture->mtsync_flag & MTSYNC_FLAG_TOUCH))
         {
             int zero = 0;
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
             xf86PostButtonEvent(g_pGesture->mt_devices[0], 0, Button1, 0, 0, 2, &zero, &zero);
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+            xf86PostButtonEvent(g_pGesture->mt_devices, 0, Button1, 0, 0, 2, &zero, &zero);
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
         }
         g_pGesture->mtsync_flag |= MTSYNC_FLAG_ROTARY;
         DetailDebugPrint("[GestureHandleMTSyncEvent] Rotary input starts. Now touch events are dropped!\n");
@@ -2646,7 +2755,7 @@ GestureHandleMTSyncEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
         g_pGesture->num_pressed = 0;
         g_pGesture->has_hold_grabmask = 0;
         g_pGesture->mtsync_total_count = 0;
-        memset(&g_pGesture->last_touches, 0, sizeof(g_pGesture->last_touches));
+
         for (i=0; i < g_pGesture->num_mt_devices; i++)
         {
             g_pGesture->fingers[i].ptime = 0;
@@ -2712,23 +2821,19 @@ void GestureEmulateHWKey(DeviceIntPtr dev, int keycode)
 void
 GestureHandleButtonPressEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
 {
+    TTRACE_BEGIN("XORG:GESTURE:BUTTON_PRESS");
 #ifdef __DEBUG_EVENT_HANDLER__
     DetailDebugPrint("[GestureHandleButtonPressEvent] devid=%d time:%d cur:%d (%d, %d)\n", device->id, ev->any.time, GetTimeInMillis(), ev->device_event.root_x, ev->device_event.root_y);
 #endif//__DEBUG_EVENT_HANDLER__
-    int idx=0;
-    if (g_pGesture->touch_cancel_status == TRUE)
-    {
-        DetailDebugPrint("[GestureHandleButtonPressEvent] Ignore Button Press event after touch cancel generated. \n");
-        return;
-    }
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+    int idx = 0;
 
-    idx = GestureGetFingerIndexFromDevice(device);
-    if (0 <= idx)
-    {
-        g_pGesture->last_touches[idx].status = BTN_PRESSED;
-        g_pGesture->last_touches[idx].cx = ev->device_event.root_x;
-        g_pGesture->last_touches[idx].cy = ev->device_event.root_y;
+    idx = GestureFindTouchIndex(ev->device_event.deviceid, ev->device_event.touchid, ev->device_event.type);
+    if (idx < 0 && ev->device_event.deviceid != g_pGesture->master_pointer->id) {
+        device->public.processInputProc(ev, device);
+        goto out;
     }
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
     if (g_pGesture->ehtype != KEEP_EVENTS)
     {
@@ -2752,59 +2857,58 @@ GestureHandleButtonPressEvent(int screen_num, InternalEvent *ev, DeviceIntPtr de
             if (ERROR_INVALPTR == GestureEnqueueEvent(screen_num, ev, device))
             {
                 GestureControl(g_pGesture->this_device, DEVICE_OFF);
-                return;
+                goto out;
             }
 
             if (g_pGesture->num_mt_devices)
             {
-                GestureRecognize(ET_ButtonPress, ev, device);
+                GestureRecognize(GESTURE_TOUCH_PRESS, ev, device);
             }
             else
             {
                 device->public.processInputProc(ev, device);
             }
 
-            GestureHoldDetector(ET_ButtonPress, ev, device);
+            GestureHoldDetector(GESTURE_TOUCH_PRESS, ev, device);
             break;
 
         case PROPAGATE_EVENTS:
             DetailDebugPrint("[GestureHandleButtonPressEvent] PROPAGATE_EVENT\n");
 
             device->public.processInputProc(ev, device);
-            GestureHoldDetector(ET_ButtonPress, ev, device);
+            GestureHoldDetector(GESTURE_TOUCH_PRESS, ev, device);
             break;
 
         case IGNORE_EVENTS:
             DetailDebugPrint("[GestureHandleButtonPressEvent] IGNORE_EVENTS\n");
 
-            GestureRecognize(ET_ButtonPress, ev, device);
+            GestureRecognize(GESTURE_TOUCH_PRESS, ev, device);
             break;
 
         default:
             break;
     }
+out:
+    TTRACE_END();
+    return;
 }
 
 void
 GestureHandleMotionEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
 {
+    TTRACE_BEGIN("XORG:GESTURE:MOTION");
 #ifdef __DEBUG_EVENT_MOTION_HANDLER__
     DetailDebugPrint("[GestureHandleMotionEvent] devid=%d time:%d cur:%d (%d, %d)\n", device->id, ev->any.time, GetTimeInMillis(), ev->device_event.root_x, ev->device_event.root_y);
 #endif
-    int idx=0;
-    if (g_pGesture->touch_cancel_status == TRUE)
-    {
-        DetailDebugPrint("[GestureHandleButtonPressEvent] Ignore Button Press event after touch cancel generated. \n");
-        return;
-    }
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+    int idx = 0;
 
-    idx = GestureGetFingerIndexFromDevice(device);
-    if (0 <= idx)
-    {
-        g_pGesture->last_touches[idx].status = BTN_MOVING;
-        g_pGesture->last_touches[idx].cx = ev->device_event.root_x;
-        g_pGesture->last_touches[idx].cy = ev->device_event.root_y;
+    idx = GestureFindTouchIndex(ev->device_event.deviceid, ev->device_event.touchid, ev->device_event.type);
+    if (idx < 0 && ev->device_event.deviceid != g_pGesture->master_pointer->id) {
+        device->public.processInputProc(ev, device);
+        goto out;
     }
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
     if (g_pGesture->ehtype != KEEP_EVENTS)
     {
@@ -2826,56 +2930,54 @@ GestureHandleMotionEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
             if (ERROR_INVALPTR == GestureEnqueueEvent(screen_num, ev, device))
             {
                 GestureControl(g_pGesture->this_device, DEVICE_OFF);
-                return;
+                goto out;
             }
 
             if (g_pGesture->num_mt_devices)
             {
-                GestureRecognize(ET_Motion, ev, device);
+                GestureRecognize(GESTURE_TOUCH_MOTION, ev, device);
             }
             else
             {
                 device->public.processInputProc(ev, device);
             }
 
-            GestureHoldDetector(ET_Motion, ev, device);
+            GestureHoldDetector(GESTURE_TOUCH_MOTION, ev, device);
             break;
 
         case PROPAGATE_EVENTS:
             device->public.processInputProc(ev, device);
-            GestureHoldDetector(ET_Motion, ev, device);
+            GestureHoldDetector(GESTURE_TOUCH_MOTION, ev, device);
             break;
 
         case IGNORE_EVENTS:
-            GestureRecognize(ET_Motion, ev, device);
+            GestureRecognize(GESTURE_TOUCH_MOTION, ev, device);
             break;
 
         default:
             break;
     }
-
+out:
+    TTRACE_END();
+    return;
 }
 
 void
 GestureHandleButtonReleaseEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
 {
+    TTRACE_BEGIN("XORG:GESTURE:BUTTON_RELEASE");
 #ifdef __DEBUG_EVENT_HANDLER__
     DetailDebugPrint("[GestureHandleButtonReleaseEvent] devid=%d time:%d cur:%d (%d, %d)\n", device->id, ev->any.time, GetTimeInMillis(), ev->device_event.root_x, ev->device_event.root_y);
 #endif
-    int idx=0;
-    if (g_pGesture->touch_cancel_status == TRUE)
-    {
-        DetailDebugPrint("[GestureHandleButtonPressEvent] Ignore Button Press event after touch cancel generated. \n");
-        return;
-    }
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+    int idx = 0;
 
-    idx = GestureGetFingerIndexFromDevice(device);
-    if (0 <= idx)
-    {
-        g_pGesture->last_touches[idx].status = BTN_RELEASED;
-        g_pGesture->last_touches[idx].cx = ev->device_event.root_x;
-        g_pGesture->last_touches[idx].cy = ev->device_event.root_y;
+    idx = GestureFindTouchIndex(ev->device_event.deviceid, ev->device_event.touchid, ev->device_event.type);
+    if (idx < 0 && ev->device_event.deviceid != g_pGesture->master_pointer->id) {
+        device->public.processInputProc(ev, device);
+        goto out;
     }
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
     if (g_pGesture->ehtype != KEEP_EVENTS)
     {
@@ -2897,30 +2999,30 @@ GestureHandleButtonReleaseEvent(int screen_num, InternalEvent *ev, DeviceIntPtr
     switch (g_pGesture->ehtype)
     {
         case KEEP_EVENTS:
-            DetailDebugPrint("[GestureHandleButtonReleaseEvent] KEEP_EVENT\n");
+            DetailDebugPrint("[GestureHandleButtonPressEvent] KEEP_EVENT\n");
 
             if (ERROR_INVALPTR == GestureEnqueueEvent(screen_num, ev,  device))
             {
                 GestureControl(g_pGesture->this_device, DEVICE_OFF);
-                return;
+                goto out;
             }
 
             if (g_pGesture->num_mt_devices)
             {
-                GestureRecognize(ET_ButtonRelease, ev, device);
+                GestureRecognize(GESTURE_TOUCH_RELEASE, ev, device);
             }
             else
             {
                 device->public.processInputProc(ev, device);
             }
 
-            GestureHoldDetector(ET_ButtonRelease, ev, device);
+            GestureHoldDetector(GESTURE_TOUCH_RELEASE, ev, device);
             break;
 
         case PROPAGATE_EVENTS:
-            DetailDebugPrint("[GestureHandleButtonReleaseEvent] PROPAGATE_EVENTS\n");
+            DetailDebugPrint("[GestureHandleButtonPressEvent] PROPAGATE_EVENTS\n");
 #ifdef SUPPORT_ANR_WITH_INPUT_EVENT
-                     if( IsMaster(device) && ev->any.type == ET_ButtonRelease )
+                     if( IsMaster(device) && ev->any.type == GESTURE_TOUCH_RELEASE )
                      {
                          if( g_pGesture->anr_window == NULL )
                          {
@@ -2949,7 +3051,7 @@ GestureHandleButtonReleaseEvent(int screen_num, InternalEvent *ev, DeviceIntPtr
                      }
 #endif
             device->public.processInputProc(ev, device);
-            GestureHoldDetector(ET_ButtonRelease, ev, device);
+            GestureHoldDetector(GESTURE_TOUCH_RELEASE, ev, device);
 #if 0
             GestureEmulateHWKey(g_pGesture->hwkey_dev, g_pGesture->hwkeycode_flick_down);
             GestureEmulateHWKey(g_pGesture->hwkey_dev, g_pGesture->hwkeycode_flick_up);
@@ -2958,17 +3060,21 @@ GestureHandleButtonReleaseEvent(int screen_num, InternalEvent *ev, DeviceIntPtr
 
         case IGNORE_EVENTS:
             DetailDebugPrint("[GestureHandleButtonReleaseEvent] IGNORE_EVENTS\n");
-            GestureRecognize(ET_ButtonRelease, ev, device);
+            GestureRecognize(GESTURE_TOUCH_RELEASE, ev, device);
             break;
 
         default:
             break;
     }
+out:
+    TTRACE_END();
+    return;
 }
 
 void
 GestureHandleKeyPressEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
 {
+    TTRACE_BEGIN("XORG:GESTURE:KEY_PRESS");
     if ((ev->device_event.detail.key == 124) && (g_pGesture->power_pressed != 0))
     {
         g_pGesture->power_pressed = 2;
@@ -2977,12 +3083,14 @@ GestureHandleKeyPressEvent(int screen_num, InternalEvent *ev, DeviceIntPtr devic
         DetailDebugPrint("[GestureHandleKeyPressEvent] power key pressed devid: %d, hwkey_id: %d\n", device->id, g_pGesture->hwkey_id);
         DetailDebugPrint("[GestureHandleKeyPressEvent] power_pressed: %d\n", g_pGesture->power_pressed);
     }
+    TTRACE_END();
     device->public.processInputProc(ev, device);
 }
 
 void
 GestureHandleKeyReleaseEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
 {
+    TTRACE_BEGIN("XORG:GESTURE:KEY_RELEASE");
     if ((ev->device_event.detail.key == 124) && (g_pGesture->power_pressed != 0))
     {
         g_pGesture->power_pressed = 1;
@@ -2991,6 +3099,7 @@ GestureHandleKeyReleaseEvent(int screen_num, InternalEvent *ev, DeviceIntPtr dev
         DetailDebugPrint("[GestureHandleKeyReleaseEvent] power key released devid: %d, hwkey_id: %d\n", device->id, g_pGesture->hwkey_id);
         DetailDebugPrint("[GestureHandleKeyReleaseEvent] power_pressed: %d\n", g_pGesture->power_pressed);
     }
+    TTRACE_END();
     device->public.processInputProc(ev, device);
 }
 
@@ -3036,21 +3145,25 @@ GestureEnableEventHandler(InputInfoPtr pInfo)
     Bool res;
     GestureDevicePtr pGesture = pInfo->private;
 
+    TTRACE_BEGIN("XORG:GESTURE:ENABLE_EVENT_HANDLER");
+
     res = GestureInstallResourceStateHooks();
 
     if (!res)
     {
         ErrorF("[GestureEnableEventHandler] Failed on GestureInstallResourceStateHooks() !\n");
+        TTRACE_END();
         return ERROR_ABNORMAL;
     }
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
     res = GestureSetMaxNumberOfFingers((int)MAX_MT_DEVICES);
-
     if (!res)
     {
         ErrorF("[GestureEnableEventHandler] Failed on GestureSetMaxNumberOfFingers(%d) !\n", (int)MAX_MT_DEVICES);
         goto failed;
     }
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
     res = GestureRegisterCallbacks(GestureCbEventsGrabbed, GestureCbEventsSelected);
 
@@ -3060,20 +3173,16 @@ GestureEnableEventHandler(InputInfoPtr pInfo)
         goto failed;
     }
 
-    pGesture->device_setting_timer = TimerSet(pGesture->device_setting_timer, 0, 5000, GestureTimerHandler, pInfo);
-
-    if (!pGesture->device_setting_timer)
-    {
-        ErrorF("[GestureEnableEventHandler] Failed to set time for detecting devices !\n");
-        goto failed;
-    }
+    GestureRegisterDeviceInfo(pInfo->dev);
 
+    TTRACE_END();
     return ERROR_NONE;
 
 failed:
     GestureUninstallResourceStateHooks();
     GestureUnsetMaxNumberOfFingers();
 
+    TTRACE_END();
     return ERROR_ABNORMAL;
 }
 
@@ -3082,9 +3191,9 @@ GestureDisableEventHandler(void)
 {
     ErrorStatus err = ERROR_NONE;
 
-    mieqSetHandler(ET_ButtonPress, NULL);
-    mieqSetHandler(ET_ButtonRelease, NULL);
-    mieqSetHandler(ET_Motion, NULL);
+    mieqSetHandler(GESTURE_TOUCH_PRESS, NULL);
+    mieqSetHandler(GESTURE_TOUCH_RELEASE, NULL);
+    mieqSetHandler(GESTURE_TOUCH_MOTION, NULL);
     mieqSetHandler(ET_KeyPress, NULL);
     mieqSetHandler(ET_KeyRelease, NULL);
     mieqSetHandler(ET_MTSync, NULL);
@@ -3102,147 +3211,239 @@ GestureDisableEventHandler(void)
     return err;
 }
 
-static CARD32
-GestureTimerHandler(OsTimerPtr timer, CARD32 time, pointer arg)
+static void
+GestureRegisterDeviceInfo(DeviceIntPtr device)
 {
-    InputInfoPtr pInfo = (InputInfoPtr)arg;
-    GestureDevicePtr pGesture;
-    int idx;
-    DeviceIntPtr dev;
-
-    if (!pInfo)
-    {
-        ErrorF("[GestureTimerHandler][%s] pInfo is NULL !\n");
-        goto failed;
-    }
-
-    pGesture = pInfo->private;
-
-    idx = 0;
-    for (dev = inputInfo.pointer; dev; dev = dev->next)
-    {
-        if (IsMaster(dev) && IsPointerDevice(dev))
-        {
-            pGesture->master_pointer = dev;
-            ErrorF("[GestureTimerHandler][id:%d] Master Pointer=%s\n", dev->id, pGesture->master_pointer->name);
-            continue;
-        }
-
-        if (IsXTestDevice(dev, NULL) && IsPointerDevice(dev))
-        {
-            pGesture->xtest_pointer = dev;
-            ErrorF("[GestureTimerHandler][id:%d] XTest Pointer=%s\n", dev->id, pGesture->xtest_pointer->name);
-            continue;
-        }
-
-        if (IsPointerDevice(dev))
-        {
-            if (idx >= MAX_MT_DEVICES)
-            {
-                ErrorF("[GestureTimerHandler] Number of mt device is over MAX_MT_DEVICES(%d) !\n", MAX_MT_DEVICES);
-                continue;
-            }
-            pGesture->mt_devices[idx] = dev;
-            ErrorF("[GestureTimerHandler][id:%d] MT device[%d] name=%s\n", dev->id, idx, pGesture->mt_devices[idx]->name);
-            GesturePalmGetAbsAxisInfo(dev);
-            idx++;
-        }
-    }
-
-    for (dev = inputInfo.keyboard ; dev; dev = dev->next)
-    {
-        if (g_pGesture->hwkey_name && !strncmp(dev->name, g_pGesture->hwkey_name, strlen(dev->name)))
-        {
-            g_pGesture->hwkey_id = dev->id;
-            g_pGesture->hwkey_dev = dev;
-
-            ErrorF("[GestureTimerHandler] hwkey_name has been found. hwkey_id=%d (hwkey_dev->name:%s)\n", g_pGesture->hwkey_id, g_pGesture->hwkey_dev->name);
-            break;
-        }
-        else if (!strncmp(dev->name, "tizen_rotary", strlen(dev->name)))
-        {
-            g_pGesture->rotary_id = dev->id;
-            g_pGesture->rotary_dev = dev;
-
-            ErrorF("[GestureTimerHandler] rotary_name has been found. rotary_id=%d (rotary_dev->name:%s)\n", g_pGesture->rotary_id, g_pGesture->rotary_dev->name);
-            break;
-        }
-        else if (!strcasestr(dev->name, "keyboard") && strcasestr(dev->name, "key") && !IsXTestDevice(dev, NULL) && !IsMaster(dev))
-        {
-            g_pGesture->hwkey_id = dev->id;
-            g_pGesture->hwkey_dev = dev;
-
-            ErrorF("[GestureTimerHandler] hwkey has been found. hwkey_id=%d (hwkey_dev->name:%s)\n", g_pGesture->hwkey_id, g_pGesture->hwkey_dev->name);
-            break;
-        }
-    }
-
-    if (!g_pGesture->hwkey_id)
-    {
-        g_pGesture->hwkey_id = inputInfo.keyboard->id;
-        g_pGesture->hwkey_dev = inputInfo.keyboard;
-
-        ErrorF("[GestureTimerHandler] No hwkey has been found. Back key will go through VCK. hwkey_id=%d (hwkey_dev->name:%s)\n",
-                g_pGesture->hwkey_id, g_pGesture->hwkey_dev->name);
-    }
-
-    if (!pGesture->master_pointer || !pGesture->xtest_pointer)
-    {
-        ErrorF("[GestureTimerHandler] Failed to get info of master pointer or XTest pointer !\n");
-        pGesture->device_setting_timer = TimerSet(pGesture->device_setting_timer, 0, 0, NULL, NULL);
-        pGesture->num_mt_devices = 0;
-
-        return 0;
-    }
-
-    TimerCancel(pGesture->device_setting_timer);
-    pGesture->device_setting_timer = NULL;
-    pGesture->num_mt_devices = idx;
-
-    if (!pGesture->num_mt_devices)
-    {
-        ErrorF("[GestureTimerHandler] Failed to mt device information !\n");
-        TimerCancel(pGesture->device_setting_timer);
-        pGesture->device_setting_timer = NULL;
-        pGesture->num_mt_devices = 0;
-        pGesture->first_fingerid = -1;
-        return 0;
-    }
-
-    pGesture->first_fingerid = pGesture->mt_devices[0]->id;
-    memset(pGesture->fingers, 0, sizeof(TouchStatus)*pGesture->num_mt_devices);
-    pGesture->pRootWin = RootWindow(pGesture->master_pointer);
-
-    if (g_pGesture->palm_misc.enabled)
-    {
-        GesturePalmGetScreenInfo();
-    }
+       InputInfoPtr  pInfo = device->public.devicePrivate;
+       GestureDevicePtr pGesture = pInfo->private;
+       DeviceIntPtr dev;
+       ScreenPtr pScreen = miPointerCurrentScreen();
+       int width = 0, height = 0;
+       int idx = 0;
+       int i;
+
+       TTRACE_BEGIN("XORG:GESTURE:REGISTER_DEVICE");
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
+       for (i=0; i<MAX_MT_DEVICES; i++)
+       {
+               pGesture->mt_devices[i] = NULL;
+       }
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       pGesture->mt_devices = NULL;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
+
+       for( dev = inputInfo.pointer ; dev; dev = dev->next )
+       {
+               if(IsMaster(dev) && IsPointerDevice(dev))
+               {
+                       pGesture->master_pointer = dev;
+                       ErrorF("[id:%d] Master Pointer=%s\n", dev->id, pGesture->master_pointer->name);
+                       continue;
+               }
+
+               if(IsXTestDevice(dev, NULL) && IsPointerDevice(dev))
+               {
+                       pGesture->xtest_pointer = dev;
+                       ErrorF("[id:%d] XTest Pointer=%s\n", dev->id, pGesture->xtest_pointer->name);
+                       continue;
+               }
+
+               if(IsPointerDevice(dev))
+               {
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
+                       if( idx >= MAX_MT_DEVICES )
+                       {
+                               ErrorF("Number of mt device is over MAX_MT_DEVICES(%d) !\n", MAX_MT_DEVICES);
+                               continue;
+                       }
+                       if (strcasestr(dev->name, "Touchscreen"))
+                       {
+                               pGesture->mt_devices[idx] = dev;
+                               ErrorF("[id:%d] MT device[%d] name=%s\n", dev->id, idx, pGesture->mt_devices[idx]->name);
+                               GesturePalmGetAbsAxisInfo(dev);
+                               idx++;
+                       }
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+                       if (strcasestr(dev->name, "Touchscreen"))
+                       {
+                               pGesture->mt_devices = dev;
+                               ErrorF("[id: %d] MT device name=%s\n", dev->id, pGesture->mt_devices->name);
+                               TouchClassPtr touchInfo = dev->touch;
+                               if (touchInfo)
+                               {
+                                       ErrorF("touchInfo state: %d, num_touches: %d, max_touches: %d\n",
+                                               touchInfo->state, touchInfo->num_touches, touchInfo->max_touches);
+                                       idx = touchInfo->max_touches;
+                               }
+                               else
+                               {
+                                       ErrorF("device(%d) hasn't touch class\n", dev->id);
+                               }
+                       }
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
+               }
+       }
+
+       if( !pGesture->master_pointer || !pGesture->xtest_pointer )
+       {
+               ErrorF("Failed to get info of master pointer or XTest pointer !\n");
+               pGesture->num_mt_devices = 0;
+
+               TTRACE_END();
+               return;
+       }
+
+       pGesture->num_mt_devices = idx;
+
+       if( !pGesture->num_mt_devices )
+       {
+               ErrorF("Failed to mt device information !\n");
+               pGesture->num_mt_devices = 0;
+               pGesture->first_fingerid = -1;
+
+               TTRACE_END();
+               return;
+       }
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
+       pGesture->first_fingerid = pGesture->mt_devices[0]->id;
+       memset(pGesture->fingers, 0, sizeof(TouchStatus)*pGesture->num_mt_devices);
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       GestureAlloc(pGesture->num_mt_devices);
+       pGesture->first_fingerid = pGesture->mt_devices->id;
+       GesturePalmGetAbsAxisInfo(dev);
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
+
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+       Bool res = GestureSetMaxNumberOfFingers(g_pGesture->num_mt_devices);
+
+       if( !res )
+       {
+               ErrorF("Failed on GestureSetMaxNumberOfFingers(%d) !\n", g_pGesture->num_mt_devices);
+               goto failed;
+       }
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
+
+       pGesture->pRootWin = RootWindow(pGesture->master_pointer);
+
+       if(g_pGesture->palm_misc.enabled)
+               GesturePalmGetScreenInfo();
+
+       g_pGesture->pTempWin = NULL;
+       g_pGesture->inc_num_pressed = 0;
+
+       if( ERROR_NONE != GestureRegionsInit() || ERROR_NONE != GestureInitEQ() )
+       {
+               goto failed;
+       }
+
+       mieqSetHandler(ET_KeyPress, GestureHandleKeyPressEvent);
+       mieqSetHandler(ET_KeyRelease, GestureHandleKeyReleaseEvent);
+       mieqSetHandler(GESTURE_TOUCH_PRESS, GestureHandleButtonPressEvent);
+       mieqSetHandler(GESTURE_TOUCH_RELEASE, GestureHandleButtonReleaseEvent);
+       mieqSetHandler(GESTURE_TOUCH_MOTION, GestureHandleMotionEvent);
+       mieqSetHandler(ET_MTSync, GestureHandleMTSyncEvent);
+
+       TTRACE_END();
+       return;
 
-    g_pGesture->pTempWin = NULL;
-    g_pGesture->inc_num_pressed = 0;
-
-    if (ERROR_NONE != GestureRegionsInit() || ERROR_NONE != GestureInitEQ())
-    {
-        goto failed;
-    }
-
-    mieqSetHandler(ET_ButtonPress, GestureHandleButtonPressEvent);
-    mieqSetHandler(ET_ButtonRelease, GestureHandleButtonReleaseEvent);
-    mieqSetHandler(ET_Motion, GestureHandleMotionEvent);
-    mieqSetHandler(ET_KeyPress, GestureHandleKeyPressEvent);
-    mieqSetHandler(ET_KeyRelease, GestureHandleKeyReleaseEvent);
+failed:
+       GestureUninstallResourceStateHooks();
+       GestureUnsetMaxNumberOfFingers();
+       TTRACE_END();
+}
 
-    //if ( pGesture->is_active)
-    mieqSetHandler(ET_MTSync, GestureHandleMTSyncEvent);
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+static void
+GestureAlloc(int capability)
+{
+       if (!g_pGesture)
+       {
+               ErrorF("[GestureAlloc] Failed to allocate a gesture drv's structures\n");
+               return;
+       }
+
+       g_pGesture->cts = (CurTouchStatus *)calloc(capability, sizeof(CurTouchStatus));
+       g_pGesture->finger_rects = (pixman_region16_t *)calloc(capability, sizeof(pixman_region16_t));
+       g_pGesture->fingers = (TouchStatus *)calloc(capability, sizeof(TouchStatus));
+       g_pGesture->event_sum= (int *)calloc(capability, sizeof(int));
+       g_pGesture->max_mt_tmajor = (int *)calloc(capability, sizeof(int));
+
+       /* g_pGesture->palmFlickInfo */
+       {
+               g_pGesture->palmFlickInfo.base_x = (int *)calloc(capability, sizeof(int));
+               g_pGesture->palmFlickInfo.base_y = (int *)calloc(capability, sizeof(int));
+               g_pGesture->palmFlickInfo.update_x = (int *)calloc(capability, sizeof(int));
+               g_pGesture->palmFlickInfo.update_y = (int *)calloc(capability, sizeof(int));
+
+               g_pGesture->palmFlickInfo.current_x = (int *)calloc(capability, sizeof(int));
+               g_pGesture->palmFlickInfo.current_y = (int *)calloc(capability, sizeof(int));
+               g_pGesture->palmFlickInfo.press_status = (Bool *)calloc(capability, sizeof(Bool));
+               g_pGesture->palmFlickInfo.release_status = (Bool *)calloc(capability, sizeof(Bool));
+
+               g_pGesture->palmFlickInfo.line_idx = (int *)calloc(capability, sizeof(int));
+               g_pGesture->palmFlickInfo.prev_line_idx = (int *)calloc(capability, sizeof(int));
+               g_pGesture->palmFlickInfo.press_idx = (int *)calloc(capability, sizeof(int));
+               g_pGesture->palmFlickInfo.is_line_invalid = (Bool *)calloc(capability, sizeof(Bool));
+
+               g_pGesture->palmFlickInfo.max_tmajor = (int *)calloc(capability, sizeof(int));
+               g_pGesture->palmFlickInfo.is_tmajor_invalid = (Bool *)calloc(capability, sizeof(Bool));
+               g_pGesture->palmFlickInfo.mt_sync_count = (int *)calloc(capability, sizeof(int));
+       }
+       /* g_pGesture->palmInfo */
+       {
+               g_pGesture->palmInfo.pressed_idx = (int *)calloc(capability, sizeof(int));
+       }
+}
 
-    return 0;
+#define GFree(x) \
+       if(x) { \
+               free(x); \
+               x=NULL; \
+       } \
 
-failed:
-    GestureUninstallResourceStateHooks();
-    GestureUnsetMaxNumberOfFingers();
-
-    return 0;
+static void
+GestureDealloc()
+{
+       if (!g_pGesture)
+       {
+               ErrorF("[GestureDealloc] Failed to free a gesture drv's structures\n");
+               return;
+       }
+
+       GFree(g_pGesture->cts)
+       GFree(g_pGesture->finger_rects)
+       GFree(g_pGesture->fingers)
+       GFree(g_pGesture->event_sum)
+       GFree(g_pGesture->max_mt_tmajor)
+
+       /* g_pGesture->palmFlickInfo */
+       {
+               GFree(g_pGesture->palmFlickInfo.base_x)
+               GFree(g_pGesture->palmFlickInfo.base_y)
+               GFree(g_pGesture->palmFlickInfo.update_x)
+               GFree(g_pGesture->palmFlickInfo.update_y)
+
+               GFree(g_pGesture->palmFlickInfo.current_x)
+               GFree(g_pGesture->palmFlickInfo.current_y)
+               GFree(g_pGesture->palmFlickInfo.press_status)
+               GFree(g_pGesture->palmFlickInfo.release_status)
+
+               GFree(g_pGesture->palmFlickInfo.line_idx)
+               GFree(g_pGesture->palmFlickInfo.prev_line_idx)
+               GFree(g_pGesture->palmFlickInfo.press_idx)
+               GFree(g_pGesture->palmFlickInfo.is_line_invalid)
+
+               GFree(g_pGesture->palmFlickInfo.max_tmajor)
+               GFree(g_pGesture->palmFlickInfo.is_tmajor_invalid)
+               GFree(g_pGesture->palmFlickInfo.mt_sync_count)
+       }
+       /* g_pGesture->palmInfo */
+       {
+               GFree(g_pGesture->palmInfo.pressed_idx)
+       }
 }
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
+
 
 BOOL
 IsXTestDevice(DeviceIntPtr dev, DeviceIntPtr master)
@@ -3261,81 +3462,6 @@ IsXTestDevice(DeviceIntPtr dev, DeviceIntPtr master)
 }
 
 void
-GestureGenerateTouchCancelEvent(void)
-{
-    int i;
-    Bool canceled_touch_index[MAX_MT_DEVICES] = {FALSE, };
-
-    if (g_pGesture->mtsync_flag & MTSYNC_FLAG_TOUCH)
-    {
-        ErrorF("no Touch(%d)\n", g_pGesture->mtsync_flag);
-        return;
-    }
-
-    for (i=0; i<MAX_MT_DEVICES; i++)
-    {
-        if (!(g_pGesture->mt_devices[i]->button->buttonsDown)) continue;
-        InternalEvent cancel_event;
-
-        cancel_event.touch_cancel_event.header = ET_Internal;
-        cancel_event.touch_cancel_event.type = ET_TouchCancel;
-        cancel_event.touch_cancel_event.length = sizeof(TouchCancelEvent);
-        cancel_event.touch_cancel_event.time = CurrentTime;
-        cancel_event.touch_cancel_event.deviceid = g_pGesture->mt_devices[i]?g_pGesture->mt_devices[i]->id:0;
-
-        cancel_event.touch_cancel_event.sourceid = g_pGesture->mt_devices[i]?g_pGesture->mt_devices[i]->id:0;
-        cancel_event.touch_cancel_event.resource = 0;
-        cancel_event.touch_cancel_event.flags = 0;
-
-        g_pGesture->mt_devices[i]->public.processInputProc(&cancel_event, g_pGesture->mt_devices[i]);
-        canceled_touch_index[i] = TRUE;
-        g_pGesture->touch_cancel_status = TRUE;
-    }
-
-    for (i=0; i<MAX_MT_DEVICES; i++)
-    {
-        if (canceled_touch_index[i] == FALSE) continue;
-        InternalEvent release_event;
-        InternalEvent release_event_master;
-
-        memset(&release_event, 0, sizeof(InternalEvent));
-
-        release_event.device_event.header = ET_Internal;
-        release_event.device_event.type = ET_ButtonRelease;
-        release_event.device_event.length = sizeof(DeviceEvent);
-        release_event.device_event.time = CurrentTime;
-        release_event.device_event.deviceid = g_pGesture->mt_devices[i]->id;
-        release_event.device_event.sourceid = g_pGesture->mt_devices[i]->button->sourceid;
-        release_event.device_event.detail.button = 1;
-        release_event.device_event.root_x = g_pGesture->last_touches[i].cx;
-        release_event.device_event.root_y = g_pGesture->last_touches[i].cy;
-        if (g_pGesture->mt_devices[i]->id == g_pGesture->first_fingerid)
-        {
-            memcpy(&release_event_master, &release_event, sizeof(InternalEvent));
-            release_event_master.device_event.deviceid = g_pGesture->master_pointer->id;
-        }
-
-        g_pGesture->mt_devices[i]->public.processInputProc(&release_event, g_pGesture->mt_devices[i]);
-        if (g_pGesture->mt_devices[i]->id == g_pGesture->first_fingerid)
-        {
-            g_pGesture->master_pointer->public.processInputProc(&release_event_master, g_pGesture->master_pointer);
-        }
-        g_pGesture->touch_cancel_status = TRUE;
-    }
-}
-
-static void
-GestureDPMSCallback(CallbackListPtr *pcbl, void *unused, void *calldata)
-{
-    int dpmsLevel = *(int *)calldata;
-
-    if ((DPMSModeOff == dpmsLevel) && (MTSYNC_FLAG_TOUCH & g_pGesture->mtsync_flag)) {
-        ErrorF("TouchCancel dpmslevel: %d, g_pGesture->mtsync_flag: %d\n", dpmsLevel, g_pGesture->mtsync_flag);
-        GestureGenerateTouchCancelEvent();
-    }
-}
-
-void
 GestureEnable(int enable, Bool prop, DeviceIntPtr dev)
 {
     if ((!enable) && (g_pGesture->is_active))
@@ -3380,8 +3506,11 @@ GestureRegionsInit(void)
     }
 
     pixman_region_init(&g_pGesture->area);
-
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
     for (i = 0; i < MAX_MT_DEVICES; i++)
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+    for (i = 0; i < g_pGesture->num_mt_devices; i++)
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
     {
         pixman_region_init_rect(&g_pGesture->finger_rects[i], 0, 0, FINGER_WIDTH_2T, FINGER_HEIGHT_2T);
     }
@@ -3495,16 +3624,16 @@ GestureEnqueueEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
 
     switch (ev->any.type)
     {
-        case ET_ButtonPress:
-            DetailDebugPrint("[GestureEnqueueEvent] ET_ButtonPress (id:%d)\n", device->id);
+        case GESTURE_TOUCH_PRESS:
+            DetailDebugPrint("[GestureEnqueueEvent] Press (id:%d)\n", device->id);
             break;
 
-        case ET_ButtonRelease:
-            DetailDebugPrint("[GestureEnqueueEvent] ET_ButtonRelease (id:%d)\n", device->id);
+        case GESTURE_TOUCH_RELEASE:
+            DetailDebugPrint("[GestureEnqueueEvent] Releae (id:%d)\n", device->id);
             break;
 
-        case ET_Motion:
-            DetailDebugPrint("[GestureEnqueueEvent] ET_Motion (id:%d)\n", device->id);
+        case GESTURE_TOUCH_MOTION:
+            DetailDebugPrint("[GestureEnqueueEvent] Motion (id:%d)\n", device->id);
             break;
     }
 
@@ -3522,9 +3651,12 @@ GestureEventsFlush(void)
     int i;
     DeviceIntPtr device;
 
+    TTRACE_BEGIN("XORG:GESTURE:FLUSH_EVENT");
+
     if (!g_pGesture->EQ)
     {
         ErrorF("[GestureEventsFlush] Invalid pointer access !\n");
+        TTRACE_END();
         return ERROR_INVALPTR;
     }
 
@@ -3536,13 +3668,18 @@ GestureEventsFlush(void)
         device->public.processInputProc(g_pGesture->EQ[i].event, device);
     }
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
     for (i = 0; i < MAX_MT_DEVICES; i++)
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+    for (i = 0; i < g_pGesture->num_mt_devices; i++)
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
     {
         g_pGesture->event_sum[i] = 0;
     }
 
     g_pGesture->headEQ = g_pGesture->tailEQ = 0;//Free EQ
 
+    TTRACE_END();
     return ERROR_NONE;
 }
 
@@ -3598,11 +3735,13 @@ GestureSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
 static int
 GestureInit(DeviceIntPtr device)
 {
+    TTRACE_BEGIN("XORG:GESTURE:INIT");
 #ifdef HAVE_PROPERTIES
     GestureInitProperty(device);
     XIRegisterPropertyHandler(device, GestureSetProperty, NULL, NULL);
 #endif
     //GestureEnable(1, FALSE, g_pGesture->this_device);
+    TTRACE_END();
     return Success;
 }
 
@@ -3630,6 +3769,8 @@ GesturePreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
     int rc = BadAlloc;
     GestureDevicePtr pGesture;
 
+    TTRACE_BEGIN("XORG:GESTURE:PREINIT");
+
     pGesture = calloc(1, sizeof(GestureDeviceRec));
 
     if (!pGesture)
@@ -3680,6 +3821,8 @@ GesturePreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
     pGesture->activate_flick_up = xf86SetIntOption(pInfo->options, "ActivateFlickUp", 0);
     pGesture->activate_flick_right = xf86SetIntOption(pInfo->options, "ActivateFlickRight", 0);
     pGesture->factory_cmdname = xf86SetStrOption(pInfo->options, "FactoryCmdName", NULL);
+    pGesture->rotary_id = 0;
+    pGesture->rotary_dev = NULL;
 
     ErrorF("[X11][%s] ###############################################################\n", __FUNCTION__);
     ErrorF("[X11][%s] screen_width=%d, screen_height=%d\n", __FUNCTION__,
@@ -3715,13 +3858,13 @@ GesturePreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
 
     pInfo->fd = -1;
 
-    g_pGesture->touch_cancel_status = FALSE;
-
+    TTRACE_END();
     return Success;
 
 error:
     if (pInfo->fd >= 0)
         close(pInfo->fd);
+    TTRACE_END();
     return rc;
 }
 
@@ -3760,14 +3903,11 @@ GestureControl(DeviceIntPtr device, int what)
             pGesture->num_mt_devices = 0;
             if (ERROR_ABNORMAL == GestureEnableEventHandler(pInfo))
                 goto device_off;
-            if (!AddCallback(&DPMSCallback, GestureDPMSCallback, NULL))
-                ErrorF("[Gesture]Failed to Add DPMS CallBack\n");
             break;
 
         case DEVICE_OFF:
 device_off:
             GestureDisableEventHandler();
-            DeleteCallback(&DPMSCallback, GestureDPMSCallback, NULL);
             GestureFini(device);
             pGesture->this_device = NULL;
             xf86Msg(X_INFO, "%s: Off.\n", pInfo->name);
@@ -3782,6 +3922,10 @@ device_off:
         case DEVICE_CLOSE:
             /* free what we have to free */
             break;
+      case DEVICE_READY:
+      xf86Msg(X_INFO, "%s: device ready.\n", pInfo->name);
+            GestureRegisterDeviceInfo(device);
+            break;
     }
     return Success;
 }
old mode 100644 (file)
new mode 100755 (executable)
index e5c59ae..c69e6f9
@@ -37,6 +37,16 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include <X11/extensions/gestureconst.h>
 #include <pixman.h>
 
+#ifdef ENABLE_TTRACE
+#include <ttrace.h>
+
+#define TTRACE_BEGIN(NAME) traceBegin(TTRACE_TAG_INPUT, NAME)
+#define TTRACE_END() traceEnd(TTRACE_TAG_INPUT)
+#else //ENABLE_TTRACE
+#define TTRACE_BEGIN(NAME)
+#define TTRACE_END()
+#endif //ENABLE_TTRACE
+
 #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3
 #define HAVE_PROPERTIES 1
 #endif
@@ -116,6 +126,10 @@ enum
        FLICK_POINT_MAX
 };
 
+/* Gesture query devices infomation and register handlers
+  * if a device_control function is called using DEVICE_READY */
+#define DEVICE_READY 11
+
 #define TAP_AREA_THRESHOLD                     10000//= 100pixel * 100pixel
 #define TAP_MOVE_THRESHOLD                     35//pixel
 #define SGL_TAP_TIME_THRESHOLD         300//ms
@@ -138,6 +152,16 @@ enum
 #define AXIS_LABEL_PROP_ABS_MT_TOUCH_MINOR "Abs MT Touch Minor"
 #define AXIS_LABEL_PROP_ABS_MT_PALM        "Abs MT Palm/MT Sumsize"
 
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+#define GESTURE_TOUCH_PRESS ET_TouchBegin
+#define GESTURE_TOUCH_MOTION ET_TouchUpdate
+#define GESTURE_TOUCH_RELEASE ET_TouchEnd
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+#define GESTURE_TOUCH_PRESS ET_ButtonPress
+#define GESTURE_TOUCH_MOTION ET_Motion
+#define GESTURE_TOUCH_RELEASE ET_ButtonRelease
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
+
 typedef enum _MTSyncType
 {
        MTOUCH_FRAME_SYNC_END,
@@ -167,13 +191,19 @@ enum EventType
 {
     ET_KeyPress = 2,
     ET_KeyRelease,
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
     ET_ButtonPress,
     ET_ButtonRelease,
     ET_Motion,
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+    ET_TouchBegin = 7,
+    ET_TouchUpdate,
+    ET_TouchEnd,
+    ET_TouchOwnership,
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
     /*
     ...
     */
-    ET_TouchCancel = 31,
     ET_MTSync = 0x7E,
     ET_Internal = 0xFF /* First byte */
 };
@@ -217,6 +247,7 @@ struct _DeviceEvent {
     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 */
+    uint32_t resource; /**< Touch event resource, only for TOUCH_REPLAYING */
 };
 
 typedef struct _AnyEvent AnyEvent;
@@ -232,20 +263,6 @@ 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 */
@@ -255,7 +272,6 @@ union _InternalEvent {
        } any;
        AnyEvent any_event;
        DeviceEvent device_event;
-       TouchCancelEvent touch_cancel_event;
 };
 
 #define wUseDefault(w,field,def)       ((w)->optional ? (w)->optional->field : def)
@@ -271,21 +287,21 @@ typedef struct _DevCursorNode {
 } DevCursNodeRec, *DevCursNodePtr, *DevCursorList;
 
 typedef struct _WindowOpt {
-    VisualID           visual;            /* default: same as parent */
-    CursorPtr          cursor;            /* default: window.cursorNone */
-    Colormap           colormap;          /* default: same as parent */
-    Mask               dontPropagateMask; /* default: window.dontPropagate */
-    Mask               otherEventMasks;   /* default: 0 */
-    struct _OtherClients *otherClients;           /* default: NULL */
-    struct _GrabRec    *passiveGrabs;     /* default: NULL */
-    PropertyPtr                userProps;         /* default: NULL */
-    unsigned long      backingBitPlanes;  /* default: ~0L */
-    unsigned long      backingPixel;      /* default: 0 */
-    RegionPtr          boundingShape;     /* default: NULL */
-    RegionPtr          clipShape;         /* default: NULL */
-    RegionPtr          inputShape;        /* default: NULL */
-    struct _OtherInputMasks *inputMasks;   /* default: NULL */
-    DevCursorList       deviceCursors;     /* default: NULL */
+    CursorPtr cursor;           /* default: window.cursorNone */
+    VisualID visual;            /* default: same as parent */
+    Colormap colormap;          /* default: same as parent */
+    Mask dontPropagateMask;     /* default: window.dontPropagate */
+    Mask otherEventMasks;       /* default: 0 */
+    struct _OtherClients *otherClients; /* default: NULL */
+    struct _GrabRec *passiveGrabs;      /* default: NULL */
+    PropertyPtr userProps;      /* default: NULL */
+    CARD32 backingBitPlanes;    /* default: ~0L */
+    CARD32 backingPixel;        /* default: 0 */
+    RegionPtr boundingShape;    /* default: NULL */
+    RegionPtr clipShape;        /* default: NULL */
+    RegionPtr inputShape;       /* default: NULL */
+    struct _OtherInputMasks *inputMasks;        /* default: NULL */
+    DevCursorList deviceCursors;        /* default: NULL */
 } WindowOptRec, *WindowOptPtr;
 
 typedef struct _Window {
@@ -329,6 +345,12 @@ typedef struct _Window {
 #ifdef ROOTLESS
     unsigned           rootlessUnhittable:1;   /* doesn't hit-test */
 #endif
+
+#define COMPOSITE
+#ifdef COMPOSITE
+    unsigned damagedDescendants:1;      /* some descendants are damaged */
+    unsigned inhibitBGPaint:1;  /* paint the background? */
+#endif
 } WindowRec;
 
 typedef struct _IEvent {
@@ -375,6 +397,9 @@ enum
 typedef struct _tagTouchStatus
 {
        int status;//One of BTN_RELEASED, BTN_PRESSED and BTN_MOVING
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+       int touchid;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
        uint32_t flags;
 
        int px;         //press x
@@ -405,6 +430,34 @@ typedef struct _tagPalmDrvStatus
        int verti_coord[PALM_VERTI_ARRAY_COUNT];
 } PalmMiscInfo, *PalmMiscInfoPtr;
 
+#ifndef _SUPPORT_EVDEVMULTITOUCH_DRV_
+typedef struct _tagPalmInfo
+{
+       int *pressed_idx;
+}PalmInfo, *PalmInfoPtr;
+
+typedef struct _tagPalmFlickInfo
+{
+       int *base_x;
+       int *base_y;
+       int *update_x;
+       int *update_y;
+
+       int *current_x;
+       int *current_y;
+       Bool *press_status;
+       Bool *release_status;
+
+       int *line_idx;
+       int *prev_line_idx;
+       int *press_idx;
+       Bool *is_line_invalid;
+
+       int *max_tmajor;
+       Bool *is_tmajor_invalid;
+       int *mt_sync_count;
+} PalmFlickInfo, *PalmFlickInfoPtr;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
 typedef struct _GestureDeviceRec
 {
@@ -445,7 +498,11 @@ typedef struct _GestureDeviceRec
        int palm_flick_min_tmajor_threshold;
        char *factory_cmdname;
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        int max_mt_tmajor[MAX_MT_DEVICES];
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV
+       int *max_mt_tmajor;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV
 
        int hwkey_id;
        char *hwkey_name;
@@ -475,9 +532,11 @@ typedef struct _GestureDeviceRec
        int hold_detector_activate;
        int has_hold_grabmask;
        pixman_region16_t chold_area;
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        CurTouchStatus cts[MAX_MT_DEVICES];
-       CurTouchStatus last_touches[MAX_MT_DEVICES];
-       Bool touch_cancel_status;
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       CurTouchStatus *cts;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
        Bool hold_detected;
 
        PalmMiscInfo palm_misc;
@@ -488,21 +547,39 @@ typedef struct _GestureDeviceRec
        int mt_py_idx;
 
        pixman_region16_t area;
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        pixman_region16_t finger_rects[MAX_MT_DEVICES];
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       pixman_region16_t *finger_rects;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
        WindowPtr pTempWin;
        int inc_num_pressed;
 
        int first_fingerid;
        int num_pressed;
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        TouchStatus fingers[MAX_MT_DEVICES];
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       TouchStatus *fingers;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
 
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        int event_sum[MAX_MT_DEVICES];
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       int *event_sum;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
        uint32_t recognized_gesture;
        uint32_t filter_mask;
 
        DeviceIntPtr this_device;
+#ifdef _SUPPORT_EVDEVMULTITOUCH_DRV_
        DeviceIntPtr mt_devices[MAX_MT_DEVICES];
+#else //_SUPPORT_EVDEVMULTITOUCH_DRV_
+       DeviceIntPtr mt_devices;
+       PalmFlickInfo palmFlickInfo;
+       PalmInfo palmInfo;
+#endif //_SUPPORT_EVDEVMULTITOUCH_DRV_
        DeviceIntPtr master_pointer;
        DeviceIntPtr xtest_pointer;