Change-Id: I12f277c968b2f53118fec6b09ba49c84d9a75e1c
Name: xorg-x11-drv-gesture
Summary: X.Org X server -- Xserver gesture driver
Version: 0.1.2
Name: xorg-x11-drv-gesture
Summary: X.Org X server -- Xserver gesture driver
Version: 0.1.2
Group: System/X Hardware Support
License: MIT
Source0: %{name}-%{version}.tar.gz
Group: System/X Hardware Support
License: MIT
Source0: %{name}-%{version}.tar.gz
#include "config.h"
#endif
#include "config.h"
#endif
-#include <xorg/inputstr.h>
#include <linux/input.h>
#include <linux/types.h>
#include <linux/input.h>
#include <linux/types.h>
#include <xorg/mi.h>
//Basic functions
#include <xorg/mi.h>
//Basic functions
-static int GesturePreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags);
+static InputInfoPtr GesturePreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags);
static void GestureUnInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags);
static pointer GesturePlug(pointer module, pointer options, int *errmaj, int *errmin);
static void GestureUnplug(pointer p);
static void GestureUnInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags);
static pointer GesturePlug(pointer module, pointer options, int *errmaj, int *errmin);
static void GestureUnplug(pointer p);
void GestureCbEventsGrabbed(Mask *pGrabMask, GestureGrabEventPtr *pGrabEvent);
void GestureCbEventsSelected(Window win, Mask *pEventMask);
WindowPtr GestureGetEventsWindow(void);
void GestureCbEventsGrabbed(Mask *pGrabMask, GestureGrabEventPtr *pGrabEvent);
void GestureCbEventsSelected(Window win, Mask *pEventMask);
WindowPtr GestureGetEventsWindow(void);
-static uint32_t GestureTouchFindDDXIDByTouchID(DeviceIntPtr device, uint32_t touchid);
//Enqueued event handlers and enabler/disabler
static ErrorStatus GestureEnableEventHandler(InputInfoPtr pInfo);
//Enqueued event handlers and enabler/disabler
static ErrorStatus GestureEnableEventHandler(InputInfoPtr pInfo);
static CARD32 GestureTimerHandler(OsTimerPtr timer, CARD32 time, pointer arg);
static CARD32 GestureEventTimerHandler(OsTimerPtr timer, CARD32 time, pointer arg);
void GestureHandleMTSyncEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device);
static CARD32 GestureTimerHandler(OsTimerPtr timer, CARD32 time, pointer arg);
static CARD32 GestureEventTimerHandler(OsTimerPtr timer, CARD32 time, pointer arg);
void GestureHandleMTSyncEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device);
-void GestureHandleTouchBeginEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device);
-void GestureHandleTouchUpdateEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device);
-void GestureHandleTouchEndEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device);
+void GestureHandleButtonPressEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device);
+void GestureHandleButtonReleaseEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device);
+void GestureHandleMotionEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device);
//Gesture recognizer helper
static Bool PointInBorderSize(WindowPtr pWin, int x, int y);
//Gesture recognizer helper
static Bool PointInBorderSize(WindowPtr pWin, int x, int y);
void GestureHandleGesture_Hold(int num_fingers, int cx, int cy, Time holdtime, int kinds);
void GestureHandleGesture_TapNHold(int num_fingers, int cx, int cy, Time interval, Time holdtime, int kinds);
void GestureHandleGesture_Pan(int num_fingers, short int dx, short int dy, int direction, int distance, Time duration, int kinds);
void GestureHandleGesture_Hold(int num_fingers, int cx, int cy, Time holdtime, int kinds);
void GestureHandleGesture_TapNHold(int num_fingers, int cx, int cy, Time interval, Time holdtime, int kinds);
void GestureHandleGesture_Pan(int num_fingers, short int dx, short int dy, int direction, int distance, Time duration, int kinds);
-void GestureRecognize(int type, InternalEvent *ev, DeviceIntPtr device, int idx);
+void GestureRecognize(int type, InternalEvent *ev, DeviceIntPtr device);
ErrorStatus GestureFlushOrDrop(void);
#ifdef HAVE_PROPERTIES
ErrorStatus GestureFlushOrDrop(void);
#ifdef HAVE_PROPERTIES
g_pGesture->fingers[idx].flags |= PressFlagPinchRotation;
if( g_pGesture->num_pressed < 2 )
g_pGesture->fingers[idx].flags |= PressFlagPinchRotation;
if( g_pGesture->num_pressed < 2 )
#endif//__DETAIL_DEBUG__
break;
#endif//__DETAIL_DEBUG__
break;
if( !(g_pGesture->fingers[idx].flags & PressFlagPinchRotation) )
break;
if( !(g_pGesture->fingers[idx].flags & PressFlagPinchRotation) )
break;
if( state != GestureEnd && num_pressed >= 2)
{
#ifdef __DETAIL_DEBUG__
if( state != GestureEnd && num_pressed >= 2)
{
#ifdef __DETAIL_DEBUG__
if( g_pGesture->filter_mask == GESTURE_FILTER_MASK_ALL )
{
if( g_pGesture->filter_mask == GESTURE_FILTER_MASK_ALL )
{
+#if 1//def __DETAIL_DEBUG__
ErrorF("[GroupPinchRotation][cleanup] GestureFlushOrDrop() !\n");
#endif//__DETAIL_DEBUG__
ErrorF("[GroupPinchRotation][cleanup] GestureFlushOrDrop() !\n");
#endif//__DETAIL_DEBUG__
g_pGesture->fingers[idx].flags |= PressFlagFlick;
if( g_pGesture->num_pressed < 2 )
g_pGesture->fingers[idx].flags |= PressFlagFlick;
if( g_pGesture->num_pressed < 2 )
#endif//__DETAIL_DEBUG__
break;
#endif//__DETAIL_DEBUG__
break;
if( !(g_pGesture->fingers[idx].flags & PressFlagFlick ) )
break;
if( !(g_pGesture->fingers[idx].flags & PressFlagFlick ) )
break;
if( g_pGesture->num_pressed )
break;
if( g_pGesture->num_pressed )
break;
g_pGesture->fingers[idx].flags |= PressFlagPan;
if( g_pGesture->num_pressed < 2 )
g_pGesture->fingers[idx].flags |= PressFlagPan;
if( g_pGesture->num_pressed < 2 )
#endif//__DETAIL_DEBUG__
break;
#endif//__DETAIL_DEBUG__
break;
if( !(g_pGesture->fingers[idx].flags & PressFlagPan ) )
break;
if( !(g_pGesture->fingers[idx].flags & PressFlagPan ) )
break;
cx = AREA_CENTER_X(&g_pGesture->area.extents);
cy = AREA_CENTER_Y(&g_pGesture->area.extents);
cx = AREA_CENTER_X(&g_pGesture->area.extents);
cy = AREA_CENTER_Y(&g_pGesture->area.extents);
#ifdef __DETAIL_DEBUG__
ErrorF("[GroupPan][M] cx=%d, prev_cx=%d, diff=%d\n", cx, prev_cx, ABS(cx-prev_cx));
ErrorF("[GroupPan][M] cy=%d, prev_cy=%d, diff=%d\n", cy, prev_cy, ABS(cy-prev_cy));
#ifdef __DETAIL_DEBUG__
ErrorF("[GroupPan][M] cx=%d, prev_cx=%d, diff=%d\n", cx, prev_cx, ABS(cx-prev_cx));
ErrorF("[GroupPan][M] cy=%d, prev_cy=%d, diff=%d\n", cy, prev_cy, ABS(cy-prev_cy));
if( state != GestureEnd && num_pressed >= 2)
{
#ifdef __DETAIL_DEBUG__
if( state != GestureEnd && num_pressed >= 2)
{
#ifdef __DETAIL_DEBUG__
if( num_pressed )
{
#ifdef __DETAIL_DEBUG__
if( num_pressed )
{
#ifdef __DETAIL_DEBUG__
- ErrorF("[GroupTap][Timer][state=1] Tap time expired !(num_pressed=%d, tap_repeat=%d)\n", num_pressed, tap_repeat);
+ ErrorF("[GroupTap][Timer][state=1] Tap time expired !(num_pressed=%d, tap_repeat=%d)\n", tap_repeat, num_pressed, tap_repeat);
#endif//__DETAIL_DEBUG__
state = 0;
goto cleanup_tap;
#endif//__DETAIL_DEBUG__
state = 0;
goto cleanup_tap;
g_pGesture->fingers[idx].flags |= PressFlagTap;
if( g_pGesture->num_pressed < 2 )
g_pGesture->fingers[idx].flags |= PressFlagTap;
if( g_pGesture->num_pressed < 2 )
#endif//__DETAIL_DEBUG__
break;
#endif//__DETAIL_DEBUG__
break;
if( !(g_pGesture->fingers[idx].flags & PressFlagTap ) )
break;
if( !(g_pGesture->fingers[idx].flags & PressFlagTap ) )
break;
if( g_pGesture->num_pressed )
break;
if( g_pGesture->num_pressed )
break;
g_pGesture->fingers[idx].flags |= PressFlagTapNHold;
if( g_pGesture->num_pressed < 2 )
g_pGesture->fingers[idx].flags |= PressFlagTapNHold;
if( g_pGesture->num_pressed < 2 )
#endif//__DETAIL_DEBUG__
break;
#endif//__DETAIL_DEBUG__
break;
if( !(g_pGesture->fingers[idx].flags & PressFlagTapNHold ) )
break;
if( !(g_pGesture->fingers[idx].flags & PressFlagTapNHold ) )
break;
if( state != GestureEnd && num_pressed >= 2)
{
#ifdef __DETAIL_DEBUG__
if( state != GestureEnd && num_pressed >= 2)
{
#ifdef __DETAIL_DEBUG__
g_pGesture->fingers[idx].flags |= PressFlagHold;
if( g_pGesture->num_pressed < 2 )
g_pGesture->fingers[idx].flags |= PressFlagHold;
if( g_pGesture->num_pressed < 2 )
#endif//__DETAIL_DEBUG__
break;
#endif//__DETAIL_DEBUG__
break;
if( !(g_pGesture->fingers[idx].flags & PressFlagHold ) )
break;
if( !(g_pGesture->fingers[idx].flags & PressFlagHold ) )
break;
if( state != GestureEnd && num_pressed >= 2)
{
#ifdef __DETAIL_DEBUG__
if( state != GestureEnd && num_pressed >= 2)
{
#ifdef __DETAIL_DEBUG__
g_pGesture->lastSelectedMask = g_pGesture->eventMask;
}
g_pGesture->lastSelectedMask = g_pGesture->eventMask;
}
- if((!g_pGesture->eventMask) && (!g_pGesture->grabMask))
+ if( !g_pGesture->eventMask && !g_pGesture->grabMask)
{
#ifdef __DETAIL_DEBUG__
ErrorF("[X11][GestureGetEventsWindow] No grabbed events or no events were selected for window(0x%x) !\n", pWin->drawable.id);
{
#ifdef __DETAIL_DEBUG__
ErrorF("[X11][GestureGetEventsWindow] No grabbed events or no events were selected for window(0x%x) !\n", pWin->drawable.id);
-static uint32_t
-GestureTouchFindDDXIDByTouchID(DeviceIntPtr device, uint32_t touchid)
+void
+GestureRecognize(int type, InternalEvent *ev, DeviceIntPtr device)
- DDXTouchPointInfoPtr ti;
-
- for( i = 0 ; i < g_pGesture->num_touches ; i++ )
- {
-#ifdef __DETAIL_DEBUG__
- ErrorF("[X11][GestureTouchFindDDXIDByTouchID][check existence] fingers[%d].touchid=%d, touchid=%d\n", i, g_pGesture->fingers[i].touchid, touchid);
-#endif//__DETAIL_DEBUG__
-
- if(g_pGesture->fingers[i].touchid == touchid)
- {
-#ifdef __DETAIL_DEBUG__
- ErrorF("[X11][GestureTouchFindDDXIDByTouchID][exist] ddx_id=%d was found !\n", i);
-#endif//__DETAIL_DEBUG__
+ static OsTimerPtr single_finger_timer = NULL;
+ int idx = -1;
- return (uint32_t)i;
- }
- }
+ if( PROPAGATE_EVENTS == g_pGesture->ehtype ||
+ device->id < g_pGesture->first_fingerid )
+ return;
- for( i = 0 ; i < device->last.num_touches ; i++)
+ for( i = 0 ; i < g_pGesture->num_mt_devices ; i++ )
- ti = &device->last.touches[i];
-
-#ifdef __DETAIL_DEBUG__
- ErrorF("[X11][GestureTouchFindDDXIDByTouchID][alloc new] i=%d, ti->client_id=%d, touchid=%d, ti->ddx_id=%d, ti->active=%d\n", i, ti->client_id, touchid, ti->ddx_id, ti->active);
-#endif//__DETAIL_DEBUG__
-
- if(ti->client_id == touchid)
+ if( device->id == g_pGesture->mt_devices[i]->id )
-#ifdef __DETAIL_DEBUG__
- ErrorF("[X11][GestureTouchFindDDXIDByTouchID][new] ddx_id=%d was found !\n", ti->ddx_id);
-#endif//__DETAIL_DEBUG__
-
- g_pGesture->fingers[ti->ddx_id].touchid = touchid;
- return ti->ddx_id;
- return (uint32_t)-1;
-}
-
-void
-GestureRecognize(int type, InternalEvent *ev, DeviceIntPtr device, int idx)
-{
- int i;
- static OsTimerPtr single_finger_timer = NULL;
-
-#ifdef __DETAIL_DEBUG__
- ErrorF("[X11][GestureRecognize] ev->any.type=%d, type=%d, device->id=%d\n", ev->any.type, type, device->id);
-#endif//__DETAIL_DEBUG__
-
- if((PROPAGATE_EVENTS == g_pGesture->ehtype) || (device->id != g_pGesture->first_fingerid))
-#ifdef __DETAIL_DEBUG__
- ErrorF("[X11][GestureRecognize] idx=%d\n", idx);
-#endif//__DETAIL_DEBUG__
-
if( idx == 0 )
g_pGesture->event_sum[0] = BTN_PRESSED;
g_pGesture->fingers[idx].ptime = ev->any.time;
if( idx == 0 )
g_pGesture->event_sum[0] = BTN_PRESSED;
g_pGesture->fingers[idx].ptime = ev->any.time;
TimerCancel(single_finger_timer);
}
TimerCancel(single_finger_timer);
}
- if( g_pGesture->num_pressed > g_pGesture->num_touches )
- g_pGesture->num_pressed = g_pGesture->num_touches;
+ if( g_pGesture->num_pressed > g_pGesture->num_mt_devices )
+ g_pGesture->num_pressed = g_pGesture->num_mt_devices;
if( !g_pGesture->pTempWin || g_pGesture->num_pressed != g_pGesture->inc_num_pressed )
{
if( !g_pGesture->pTempWin || g_pGesture->num_pressed != g_pGesture->inc_num_pressed )
{
if( !g_pGesture->fingers[idx].ptime )
return;
if( !g_pGesture->fingers[idx].ptime )
return;
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;
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;
g_pGesture->recognized_gesture = 0;
g_pGesture->num_pressed = 0;
g_pGesture->recognized_gesture = 0;
g_pGesture->num_pressed = 0;
- for( i=0 ; i < g_pGesture->num_touches ; i++ )
- {
+ for( i=0 ; i < g_pGesture->num_mt_devices ; i++ )
g_pGesture->fingers[i].ptime = 0;
g_pGesture->fingers[i].ptime = 0;
- g_pGesture->fingers[i].touchid = -1;
- }
}
else if( MTOUCH_FRAME_SYNC_END == ev->any_event.sync )
{
}
else if( MTOUCH_FRAME_SYNC_END == ev->any_event.sync )
{
-void GestureHandleTouchBeginEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
+void
+GestureHandleButtonPressEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
- int idx = -1;
- int touchid;
#ifdef __DEBUG_EVENT_HANDLER__
#ifdef __DEBUG_EVENT_HANDLER__
- ErrorF("[X11][GestureHandleTouchBeginEvent] devid=%d, touchid=%d, time:%d cur:%d\n", device->id, ev->device_event.touchid, ev->any.time, GetTimeInMillis());
+ ErrorF("[X11][GestureHandleButtonPEvent] devid=%d time:%d cur:%d\n", device->id, ev->any.time, GetTimeInMillis());
#endif//__DEBUG_EVENT_HANDLER__
switch( g_pGesture->ehtype )
{
case KEEP_EVENTS:
#endif//__DEBUG_EVENT_HANDLER__
switch( g_pGesture->ehtype )
{
case KEEP_EVENTS:
- if( !g_pGesture->num_touches )
- {
- device->public.processInputProc(ev, device);
- return;
- }
-
if( ERROR_INVALPTR == GestureEnqueueEvent(screen_num, ev, device) )
{
GestureControl(g_pGesture->this_device, DEVICE_OFF);
return;
}
if( ERROR_INVALPTR == GestureEnqueueEvent(screen_num, ev, device) )
{
GestureControl(g_pGesture->this_device, DEVICE_OFF);
return;
}
- if(device->id != g_pGesture->first_fingerid)
- return;
-
- touchid = ev->device_event.touchid;
- idx = GestureTouchFindDDXIDByTouchID(device, touchid);
-
- if( idx >= 0 )
- GestureRecognize(ET_TouchBegin, ev, device, idx);
+ if( g_pGesture->num_mt_devices )
+ GestureRecognize(ET_ButtonPress, ev, device);
+ else
+ device->public.processInputProc(ev, device);
break;
case PROPAGATE_EVENTS:
break;
case PROPAGATE_EVENTS:
break;
case IGNORE_EVENTS:
break;
case IGNORE_EVENTS:
- touchid = ev->device_event.touchid;
- idx = GestureTouchFindDDXIDByTouchID(device, touchid);
-
- if( idx >= 0 )
- GestureRecognize(ET_TouchBegin, ev, device, idx);
+ GestureRecognize(ET_ButtonPress, ev, device);
-void GestureHandleTouchUpdateEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
+void
+GestureHandleMotionEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
- int idx = -1;
- int touchid;
#ifdef __DEBUG_EVENT_HANDLER__
#ifdef __DEBUG_EVENT_HANDLER__
- ErrorF("[X11][GestureHandleTouchUpdateEvent] devid=%d, touchid=%d, time:%d cur:%d\n", device->id, ev->device_event.touchid, ev->any.time, GetTimeInMillis());
+ ErrorF("[X11][GestureHandleMotionEvent] devid=%d time:%d cur:%d\n", device->id, ev->any.time, GetTimeInMillis());
#endif//__DEBUG_EVENT_HANDLER__
switch( g_pGesture->ehtype )
{
case KEEP_EVENTS:
#endif//__DEBUG_EVENT_HANDLER__
switch( g_pGesture->ehtype )
{
case KEEP_EVENTS:
- if( !g_pGesture->num_touches )
- {
- device->public.processInputProc(ev, device);
- return;
- }
-
if( ERROR_INVALPTR == GestureEnqueueEvent(screen_num, ev, device) )
{
GestureControl(g_pGesture->this_device, DEVICE_OFF);
return;
}
if( ERROR_INVALPTR == GestureEnqueueEvent(screen_num, ev, device) )
{
GestureControl(g_pGesture->this_device, DEVICE_OFF);
return;
}
- if(device->id != g_pGesture->first_fingerid)
- return;
-
- touchid = ev->device_event.touchid;
- idx = GestureTouchFindDDXIDByTouchID(device, touchid);
-
- if( idx >= 0 )
- GestureRecognize(ET_TouchUpdate, ev, device, idx);
+ if( g_pGesture->num_mt_devices )
+ GestureRecognize(ET_Motion, ev, device);
+ else
+ device->public.processInputProc(ev, device);
break;
case PROPAGATE_EVENTS:
break;
case PROPAGATE_EVENTS:
break;
case IGNORE_EVENTS:
break;
case IGNORE_EVENTS:
- touchid = ev->device_event.touchid;
- idx = GestureTouchFindDDXIDByTouchID(device, touchid);
-
- if( idx >= 0 )
- GestureRecognize(ET_TouchUpdate, ev, device, idx);
+ GestureRecognize(ET_Motion, ev, device);
-void GestureHandleTouchEndEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
+void
+GestureHandleButtonReleaseEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
- int idx = -1;
- int touchid;
#ifdef __DEBUG_EVENT_HANDLER__
#ifdef __DEBUG_EVENT_HANDLER__
- ErrorF("[X11][GestureHandleTouchEndEvent] devid=%d, touchid=%d, time:%d cur:%d\n", device->id, ev->device_event.touchid, ev->any.time, GetTimeInMillis());
+ ErrorF("[X11][GestureHandleButtonREvent] devid=%d time:%d cur:%d\n", device->id, ev->any.time, GetTimeInMillis());
#endif//__DEBUG_EVENT_HANDLER__
switch( g_pGesture->ehtype )
{
case KEEP_EVENTS:
#endif//__DEBUG_EVENT_HANDLER__
switch( g_pGesture->ehtype )
{
case KEEP_EVENTS:
- if( !g_pGesture->num_touches )
- {
- device->public.processInputProc(ev, device);
- return;
- }
-
if( ERROR_INVALPTR == GestureEnqueueEvent(screen_num, ev, device) )
{
GestureControl(g_pGesture->this_device, DEVICE_OFF);
return;
}
if( ERROR_INVALPTR == GestureEnqueueEvent(screen_num, ev, device) )
{
GestureControl(g_pGesture->this_device, DEVICE_OFF);
return;
}
- if(device->id != g_pGesture->first_fingerid)
- return;
-
- touchid = ev->device_event.touchid;
- idx = GestureTouchFindDDXIDByTouchID(device, touchid);
-
- if( idx >= 0 )
- {
- GestureRecognize(ET_TouchEnd, ev, device, idx);
- g_pGesture->fingers[idx].touchid = -1;
- }
+ if( g_pGesture->num_mt_devices )
+ GestureRecognize(ET_ButtonRelease, ev, device);
+ else
+ device->public.processInputProc(ev, device);
break;
case PROPAGATE_EVENTS:
break;
case PROPAGATE_EVENTS:
break;
case IGNORE_EVENTS:
break;
case IGNORE_EVENTS:
- touchid = ev->device_event.touchid;
- idx = GestureTouchFindDDXIDByTouchID(device, touchid);
-
- if( idx >= 0 )
- GestureRecognize(ET_TouchEnd, ev, device, idx);
+ GestureRecognize(ET_ButtonRelease, ev, device);
+ res = GestureSetMaxNumberOfFingers((int)MAX_MT_DEVICES);
+
+ if( !res )
+ {
+ ErrorF("[X11][GestureEnableEventHandler] Failed on GestureSetMaxNumberOfFingers(%d) !\n", (int)MAX_MT_DEVICES);
+ goto failed;
+ }
+
res = GestureRegisterCallbacks(GestureCbEventsGrabbed, GestureCbEventsSelected);
if( !res )
res = GestureRegisterCallbacks(GestureCbEventsGrabbed, GestureCbEventsSelected);
if( !res )
{
ErrorStatus err = ERROR_NONE;
{
ErrorStatus err = ERROR_NONE;
- mieqSetHandler(ET_TouchBegin, NULL);
- mieqSetHandler(ET_TouchUpdate, NULL);
- mieqSetHandler(ET_TouchEnd, NULL);
+ mieqSetHandler(ET_ButtonPress, NULL);
+ mieqSetHandler(ET_ButtonRelease, NULL);
+ mieqSetHandler(ET_Motion, NULL);
mieqSetHandler(ET_MTSync, NULL);
err = GestureFiniEQ();
mieqSetHandler(ET_MTSync, NULL);
err = GestureFiniEQ();
InputInfoPtr pInfo = (InputInfoPtr)arg;
GestureDevicePtr pGesture = pInfo->private;
InputInfoPtr pInfo = (InputInfoPtr)arg;
GestureDevicePtr pGesture = pInfo->private;
DeviceIntPtr dev;
for( dev = inputInfo.pointer ; dev; dev = dev->next )
{
DeviceIntPtr dev;
for( dev = inputInfo.pointer ; dev; dev = dev->next )
{
- if(IsPointerDevice(dev) && dev->touch)
+ if(IsPointerDevice(dev))
- pGesture->num_touches = dev->touch->num_touches + 1;
- pGesture->first_fingerid = dev->id;
-#ifdef __DETAIL_DEBUG__
- ErrorF("[X11][GestureTimerHandler] num_touches = %d, first_fingerid=%d\n", pGesture->num_touches, pGesture->first_fingerid);
-#endif//__DETAIL_DEBUG__
+ if( idx >= MAX_MT_DEVICES )
+ {
+ ErrorF("[X11][GestureTimerHandler] Number of mt device is over MAX_MT_DEVICES(%d) !\n",
+ MAX_MT_DEVICES);
+ continue;
+ }
+ pGesture->mt_devices[idx] = dev;
+ ErrorF("[X11][GestureTimerHandler][id:%d] MT device[%d] name=%s\n", dev->id, idx, pGesture->mt_devices[idx]->name);
+ idx++;
{
ErrorF("[X11][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);
{
ErrorF("[X11][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_touches = 0;
+ pGesture->num_mt_devices = 0;
return 0;
}
pGesture->device_setting_timer = TimerSet(pGesture->device_setting_timer, 0, 0, NULL, NULL);
return 0;
}
pGesture->device_setting_timer = TimerSet(pGesture->device_setting_timer, 0, 0, NULL, NULL);
+ pGesture->num_mt_devices = idx;
- if( !pGesture->num_touches )
+ if( !pGesture->num_mt_devices )
{
ErrorF("[X11][GestureTimerHandler] Failed to mt device information !\n");
pGesture->device_setting_timer = TimerSet(pGesture->device_setting_timer, 0, 0, NULL, NULL);
{
ErrorF("[X11][GestureTimerHandler] Failed to mt device information !\n");
pGesture->device_setting_timer = TimerSet(pGesture->device_setting_timer, 0, 0, NULL, NULL);
- pGesture->first_fingerid = -1;
+ pGesture->num_mt_devices = 0;
+ pGesture->first_fingerid = -1;
- res = GestureSetMaxNumberOfFingers((int)pGesture->num_touches);
-
- if( !res )
- {
- ErrorF("[X11][GestureTimerHandler] Failed on GestureSetMaxNumberOfFingers(%d) !\n", (int)pGesture->num_touches);
- goto failed;
- }
-
- pGesture->finger_rects = (pixman_region16_t *)calloc(sizeof(pixman_region16_t), pGesture->num_touches);
- pGesture->fingers = (TouchStatus *)calloc(sizeof(TouchStatus), pGesture->num_touches);
- pGesture->event_sum = (int *)calloc(sizeof(int), pGesture->num_touches);
-
- if( !pGesture->finger_rects || !pGesture->fingers || !pGesture->event_sum)
- {
- ErrorF("[X11][GestureTimerHandler] Failed to allocate memory for finger information\n");
- goto failed;
- }
-
+ pGesture->first_fingerid = pGesture->mt_devices[0]->id;
+ memset(pGesture->fingers, 0, sizeof(TouchStatus)*pGesture->num_mt_devices);
pGesture->pRootWin = RootWindow(pGesture->master_pointer);
g_pGesture->pTempWin = NULL;
g_pGesture->inc_num_pressed = 0;
pGesture->pRootWin = RootWindow(pGesture->master_pointer);
g_pGesture->pTempWin = NULL;
g_pGesture->inc_num_pressed = 0;
- mieqSetHandler(ET_TouchBegin, GestureHandleTouchBeginEvent);
- mieqSetHandler(ET_TouchEnd, GestureHandleTouchEndEvent);
- mieqSetHandler(ET_TouchUpdate, GestureHandleTouchUpdateEvent);
+ mieqSetHandler(ET_ButtonPress, GestureHandleButtonPressEvent);
+ mieqSetHandler(ET_ButtonRelease, GestureHandleButtonReleaseEvent);
+ mieqSetHandler(ET_Motion, GestureHandleMotionEvent);
if( pGesture->is_active )
mieqSetHandler(ET_MTSync, GestureHandleMTSyncEvent);
if( pGesture->is_active )
mieqSetHandler(ET_MTSync, GestureHandleMTSyncEvent);
- pGesture->num_touches = 0;
GestureUninstallResourceStateHooks();
GestureUnsetMaxNumberOfFingers();
GestureUninstallResourceStateHooks();
GestureUnsetMaxNumberOfFingers();
pixman_region_init(&g_pGesture->area);
pixman_region_init(&g_pGesture->area);
- for( i = 0 ; i < g_pGesture->num_touches; i++ )
+ for( i = 0 ; i < MAX_MT_DEVICES ; i++ )
{
pixman_region_init_rect (&g_pGesture->finger_rects[i], 0, 0, FINGER_WIDTH_2T, FINGER_HEIGHT_2T);
}
{
pixman_region_init_rect (&g_pGesture->finger_rects[i], 0, 0, FINGER_WIDTH_2T, FINGER_HEIGHT_2T);
}
if( tail >= GESTURE_EQ_SIZE )
{
if( tail >= GESTURE_EQ_SIZE )
{
- ErrorF("[X11][GestureEnqueueEvent] Gesture EQ is full...Force Gesture Flush \n");
+ ErrorF("[X11][GestureEnqueueEvent] Gesture EQ is full !\n");
printk("[X11][GestureEnqueueEvent] Gesture EQ is full...Force Gesture Flush !\n");
GestureEventsFlush();
return ERROR_EQFULL;
printk("[X11][GestureEnqueueEvent] Gesture EQ is full...Force Gesture Flush !\n");
GestureEventsFlush();
return ERROR_EQFULL;
#ifdef __DETAIL_DEBUG__
switch( ev->any.type )
{
#ifdef __DETAIL_DEBUG__
switch( ev->any.type )
{
- case ET_TouchBegin:
- ErrorF("[X11][GestureEnqueueEvent] ET_TouchBegin (id:%d)\n", device->id);
+ case ET_ButtonPress:
+ ErrorF("[X11][GestureEnqueueEvent] ET_ButtonPress (id:%d)\n", device->id);
- case ET_TouchEnd:
- ErrorF("[X11][GestureEnqueueEvent] ET_TouchEnd (id:%d)\n", device->id);
+ case ET_ButtonRelease:
+ ErrorF("[X11][GestureEnqueueEvent] ET_ButtonRelease (id:%d)\n", device->id);
- case ET_TouchUpdate:
- ErrorF("[X11][GestureEnqueueEvent] ET_TouchUpdate (id:%d)\n", device->id);
+ case ET_Motion:
+ ErrorF("[X11][GestureEnqueueEvent] ET_Motion (id:%d)\n", device->id);
break;
}
#endif//__DETAIL_DEBUG__
break;
}
#endif//__DETAIL_DEBUG__
device->public.processInputProc(g_pGesture->EQ[i].event, device);
}
device->public.processInputProc(g_pGesture->EQ[i].event, device);
}
- for( i = 0 ; i < g_pGesture->num_touches; i++ )
+ for( i = 0 ; i < MAX_MT_DEVICES ; i++ )
g_pGesture->event_sum[i] = 0;
g_pGesture->headEQ = g_pGesture->tailEQ = 0;//Free EQ
g_pGesture->event_sum[i] = 0;
g_pGesture->headEQ = g_pGesture->tailEQ = 0;//Free EQ
GesturePreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
{
int rc = BadAlloc;
GesturePreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
{
int rc = BadAlloc;
pGesture->is_active = xf86SetIntOption(pInfo->options, "Activate", 0);
pGesture->gestureWin = None;
pGesture->lastSelectedWin = None;
pGesture->is_active = xf86SetIntOption(pInfo->options, "Activate", 0);
pGesture->gestureWin = None;
pGesture->lastSelectedWin = None;
- pGesture->num_touches = GESTURE_MAX_TOUCH;
g_pGesture->grabMask = g_pGesture->eventMask = 0;
xf86Msg(X_INFO, "%s: Using device %s.\n", pInfo->name, pGesture->device);
g_pGesture->grabMask = g_pGesture->eventMask = 0;
xf86Msg(X_INFO, "%s: Using device %s.\n", pInfo->name, pGesture->device);
xf86ProcessCommonOptions(pInfo, pInfo->options);
pInfo->fd = -1;
xf86ProcessCommonOptions(pInfo, pInfo->options);
pInfo->fd = -1;
device->public.on = TRUE;
pGesture->this_device = device;
device->public.on = TRUE;
pGesture->this_device = device;
- GestureSetMaxNumberOfFingers((int)pGesture->num_touches);
+ pGesture->num_mt_devices = 0;
if( ERROR_ABNORMAL == GestureEnableEventHandler(pInfo) )
goto device_off;
break;
if( ERROR_ABNORMAL == GestureEnableEventHandler(pInfo) )
goto device_off;
break;
#define CLIENT_BITS(id) ((id) & RESOURCE_CLIENT_MASK)
#define CLIENT_ID(id) ((int)(CLIENT_BITS(id) >> CLIENTOFFSET))
#define CLIENT_BITS(id) ((id) & RESOURCE_CLIENT_MASK)
#define CLIENT_ID(id) ((int)(CLIENT_BITS(id) >> CLIENTOFFSET))
-#define GESTURE_MAX_TOUCH sizeof(unsigned short)
+#define MAX_MT_DEVICES 3
#define GESTURE_EQ_SIZE 256
#define GESTURE_RECOGNIZER_ONOFF "GESTURE_RECOGNIZER_ONOFF"
#define GESTURE_EQ_SIZE 256
#define GESTURE_RECOGNIZER_ONOFF "GESTURE_RECOGNIZER_ONOFF"
ET_ButtonPress,
ET_ButtonRelease,
ET_Motion,
ET_ButtonPress,
ET_ButtonRelease,
ET_Motion,
- ET_TouchBegin,
- ET_TouchUpdate,
- ET_TouchEnd,
- ET_TouchOwnership,
Time ptime; //press time
Time mtime; //motion time
Time rtime; //current/previous release time
Time ptime; //press time
Time mtime; //motion time
Time rtime; //current/previous release time
- uint32_t touchid;//touch client_id
} TouchStatus;
typedef struct _GestureDeviceRec
} TouchStatus;
typedef struct _GestureDeviceRec
WindowPtr pRootWin;
Window gestureWin;
WindowPtr pRootWin;
Window gestureWin;
- unsigned short num_touches;
Mask grabMask;
Mask eventMask;
Mask grabMask;
Mask eventMask;
int tailEQ;
pixman_region16_t area;
int tailEQ;
pixman_region16_t area;
- pixman_region16_t *finger_rects;
+ pixman_region16_t finger_rects[MAX_MT_DEVICES];
WindowPtr pTempWin;
int inc_num_pressed;
int first_fingerid;
int num_pressed;
WindowPtr pTempWin;
int inc_num_pressed;
int first_fingerid;
int num_pressed;
+ TouchStatus fingers[MAX_MT_DEVICES];
+ int event_sum[MAX_MT_DEVICES];
uint32_t recognized_gesture;
uint32_t filter_mask;
DeviceIntPtr this_device;
uint32_t recognized_gesture;
uint32_t filter_mask;
DeviceIntPtr this_device;
+ DeviceIntPtr mt_devices[MAX_MT_DEVICES];
DeviceIntPtr master_pointer;
DeviceIntPtr xtest_pointer;
} GestureDeviceRec, *GestureDevicePtr ;
DeviceIntPtr master_pointer;
DeviceIntPtr xtest_pointer;
} GestureDeviceRec, *GestureDevicePtr ;