From: jk7744.park Date: Sat, 24 Oct 2015 06:30:59 +0000 (+0900) Subject: tizen 2.4 release X-Git-Tag: accepted/tizen/2.4/mobile/20151029.042000^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8c8cf47d8495fe52fa279b43fcc5204818f2e3ef;hp=f04c89548b4b16d26281056d60bfcad599d09c21;p=adaptation%2Fxorg%2Fdriver%2Fxserver-xorg-input-gesture.git tizen 2.4 release --- diff --git a/mobile/COPYING b/mobile/COPYING old mode 100755 new mode 100644 diff --git a/mobile/configure.ac b/mobile/configure.ac index 16c2d38..4bcc73a 100644 --- a/mobile/configure.ac +++ b/mobile/configure.ac @@ -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. diff --git a/mobile/src/Makefile.am b/mobile/src/Makefile.am index 695f833..3507345 100644 --- a/mobile/src/Makefile.am +++ b/mobile/src/Makefile.am @@ -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 @@ -24,14 +24,14 @@ # -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 diff --git a/mobile/src/gesture.c b/mobile/src/gesture.c index c85ffed..1837671 100644 --- a/mobile/src/gesture.c +++ b/mobile/src/gesture.c @@ -74,6 +74,10 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "gesture.h" #include #include +#ifdef PANORAMIX +#include +#include +#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; inum_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; inum_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; inum_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; inum_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; inum_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; inum_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; inum_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; imt_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; imt_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; imt_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 = ¤t_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) { } - diff --git a/mobile/src/gesture.h b/mobile/src/gesture.h index 23bc008..3f94a29 100644 --- a/mobile/src/gesture.h +++ b/mobile/src/gesture.h @@ -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 + +#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_ diff --git a/packaging/xorg-x11-drv-gesture.spec b/packaging/xorg-x11-drv-gesture.spec index aac856c..447554f 100644 --- a/packaging/xorg-x11-drv-gesture.spec +++ b/packaging/xorg-x11-drv-gesture.spec @@ -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} diff --git a/wearable/configure.ac b/wearable/configure.ac index 109646d..00c1559 100644 --- a/wearable/configure.ac +++ b/wearable/configure.ac @@ -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. diff --git a/wearable/src/Makefile.am b/wearable/src/Makefile.am index 695f833..3507345 100644 --- a/wearable/src/Makefile.am +++ b/wearable/src/Makefile.am @@ -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 @@ -24,14 +24,14 @@ # -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 diff --git a/wearable/src/gesture.c b/wearable/src/gesture.c old mode 100644 new mode 100755 index 6c6b01e..b2ee346 --- a/wearable/src/gesture.c +++ b/wearable/src/gesture.c @@ -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 -#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; inum_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; inum_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; imt_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; imt_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; imt_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; } diff --git a/wearable/src/gesture.h b/wearable/src/gesture.h old mode 100644 new mode 100755 index e5c59ae..c69e6f9 --- a/wearable/src/gesture.h +++ b/wearable/src/gesture.h @@ -37,6 +37,16 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include +#ifdef ENABLE_TTRACE +#include + +#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;