diff --git a/dix/getevents.c b/dix/getevents.c index 8eaacf146..f9e6962c2 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -481,6 +481,9 @@ GetKeyboardValuatorEvents(xEvent *events, DeviceIntPtr pDev, int type, * events is not NULL-terminated; the return value is the number of events. * The DDX is responsible for allocating the event structure in the first * place via GetMaximumEventsNum(), and for freeing it. + * + * If flag has POINTER_CORE_ONLY set, no XI or valuator event will be + * generated. */ _X_EXPORT int GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons, @@ -494,6 +497,7 @@ GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons, Bool sendValuators = (type == MotionNotify || flags & POINTER_ABSOLUTE); DeviceIntPtr pointer = NULL; int x = 0, y = 0; + Bool coreOnly = (flags & POINTER_CORE_ONLY); /* Sanity checks. */ if (type != MotionNotify && type != ButtonPress && type != ButtonRelease) @@ -502,7 +506,7 @@ GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons, if ((type == ButtonPress || type == ButtonRelease) && !pDev->button) return 0; - if (pDev->coreEvents || pDev->isMPDev) + if (!coreOnly && (pDev->coreEvents || pDev->isMPDev)) num_events = 2; else num_events = 1; @@ -512,7 +516,7 @@ GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons, } /* Do we need to send a DeviceValuator event? */ - if (sendValuators) { + if (!coreOnly & sendValuators) { if ((((num_valuators - 1) / 6) + 1) > MAX_VALUATOR_EVENTS) num_valuators = MAX_VALUATOR_EVENTS * 6; num_events += ((num_valuators - 1) / 6) + 1; @@ -608,16 +612,19 @@ GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons, kbp->root_x = x; kbp->root_y = y; - events++; - if (sendValuators) { - kbp->deviceid |= MORE_EVENTS; - clipValuators(pDev, first_valuator, num_valuators, valuators); - events = getValuatorEvents(events, pDev, first_valuator, - num_valuators, valuators); + if (!coreOnly) + { + events++; + if (sendValuators) { + kbp->deviceid |= MORE_EVENTS; + clipValuators(pDev, first_valuator, num_valuators, valuators); + events = getValuatorEvents(events, pDev, first_valuator, + num_valuators, valuators); + } } /* MPX devices always send core events */ - if (pDev->coreEvents || pDev->isMPDev) { + if (coreOnly || pDev->coreEvents || pDev->isMPDev) { events->u.u.type = type; events->u.keyButtonPointer.time = ms; events->u.keyButtonPointer.rootX = x; diff --git a/include/input.h b/include/input.h index 96a28a5a1..f7d12cb5c 100644 --- a/include/input.h +++ b/include/input.h @@ -62,6 +62,7 @@ SOFTWARE. #define POINTER_RELATIVE (1 << 1) #define POINTER_ABSOLUTE (1 << 2) #define POINTER_ACCELERATE (1 << 3) +#define POINTER_CORE_ONLY (1 << 4) /* do not generate XI event */ #define MAP_LENGTH 256 #define DOWN_LENGTH 32 /* 256/8 => number of bytes to hold 256 bits */ diff --git a/mi/mipointer.c b/mi/mipointer.c index 1474cb9be..432333d44 100644 --- a/mi/mipointer.c +++ b/mi/mipointer.c @@ -540,6 +540,10 @@ void miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y, unsigned long time) { + xEvent* events; + int i, nevents; + int valuators[2]; + int flags; miPointerPtr pPointer = MIPOINTER(pDev); SetupScreen(pScreen); @@ -556,4 +560,29 @@ miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y, pPointer->x = x; pPointer->y = y; pPointer->pScreen = pScreen; + + /* generate event here */ + valuators[0] = x; + valuators[1] = y; + events = (xEvent*)xcalloc(sizeof(xEvent), GetMaximumEventsNum()); + if (!events) + { + FatalError("Could not allocate event store.\n"); + return; + } + + flags = POINTER_ABSOLUTE; + + /* If called from ProcWarpCursor, pDev is the VCP and we must not generate + an XI event. */ + if (pDev == inputInfo.pointer) + flags |= POINTER_CORE_ONLY; + + nevents = GetPointerEvents(events, pDev, MotionNotify, 0, + flags, 0, 2, valuators); + + for (i = 0; i < nevents; i++) + mieqEnqueue(pDev, &events[i]); + + xfree(events); }