xserver: Branch 'master'
Peter Hutterer
whot at kemper.freedesktop.org
Thu Feb 15 01:59:37 EET 2007
dix/getevents.c | 55 ++++++++++++++++++++++++++++++-------------------------
mi/mipointer.c | 23 +++++++++++++++++++++++
2 files changed, 53 insertions(+), 25 deletions(-)
New commits:
diff-tree d570ff7c81858a3174686b46a088f67563b4a2d5 (from 81aa7f059d3cfd8d28420b7932b8ff7e06d67979)
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date: Wed Feb 14 17:09:33 2007 +1030
fix: WarpCursor needs to send MotionNotify.
diff --git a/dix/getevents.c b/dix/getevents.c
index 8b2a44d..935112d 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -489,6 +489,7 @@ GetPointerEvents(xEvent *events, DeviceI
Bool sendValuators = (type == MotionNotify || flags & POINTER_ABSOLUTE);
DeviceIntPtr cp = inputInfo.pointer;
int x = 0, y = 0;
+ Bool coreOnly = (pDev == inputInfo.pointer);
/* Sanity checks. */
if (type != MotionNotify && type != ButtonPress && type != ButtonRelease)
@@ -497,7 +498,7 @@ GetPointerEvents(xEvent *events, DeviceI
if ((type == ButtonPress || type == ButtonRelease) && !pDev->button)
return 0;
- if (pDev->coreEvents)
+ if (!coreOnly && pDev->coreEvents)
num_events = 2;
else
num_events = 1;
@@ -507,7 +508,7 @@ GetPointerEvents(xEvent *events, DeviceI
}
/* 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;
@@ -521,10 +522,6 @@ GetPointerEvents(xEvent *events, DeviceI
ms = GetTimeInMillis();
- kbp = (deviceKeyButtonPointer *) events;
- kbp->time = ms;
- kbp->deviceid = pDev->id;
-
/* Set x and y based on whether this is absolute or relative, and
* accelerate if we need to. */
if (flags & POINTER_ABSOLUTE) {
@@ -602,29 +599,37 @@ GetPointerEvents(xEvent *events, DeviceI
pDev->valuator->lastx = x;
pDev->valuator->lasty = y;
- if (type == MotionNotify) {
- kbp->type = DeviceMotionNotify;
- }
- else {
- if (type == ButtonPress)
- kbp->type = DeviceButtonPress;
- else if (type == ButtonRelease)
- kbp->type = DeviceButtonRelease;
- kbp->detail = pDev->button->map[buttons];
- }
+ if (!coreOnly)
+ {
+ kbp = (deviceKeyButtonPointer *) events;
+ kbp->time = ms;
+ kbp->deviceid = pDev->id;
+
+ if (type == MotionNotify) {
+ kbp->type = DeviceMotionNotify;
+ }
+ else {
+ if (type == ButtonPress)
+ kbp->type = DeviceButtonPress;
+ else if (type == ButtonRelease)
+ kbp->type = DeviceButtonRelease;
+ kbp->detail = pDev->button->map[buttons];
+ }
- kbp->root_x = x;
- kbp->root_y = y;
+ 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);
+ events++;
+ if (sendValuators) {
+ kbp->deviceid |= MORE_EVENTS;
+ clipValuators(pDev, first_valuator, num_valuators, valuators);
+ events = getValuatorEvents(events, pDev, first_valuator,
+ num_valuators, valuators);
+ }
}
- if (pDev->coreEvents) {
+ /* for some reason inputInfo.pointer does not have coreEvents set */
+ if (coreOnly || pDev->coreEvents) {
events->u.u.type = type;
events->u.keyButtonPointer.time = ms;
events->u.keyButtonPointer.rootX = x;
diff --git a/mi/mipointer.c b/mi/mipointer.c
index dbe2aae..c28911b 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -474,6 +474,10 @@ void
miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y,
unsigned long time)
{
+ xEvent* events;
+ int i, nevents;
+ int valuators[2];
+
SetupScreen(pScreen);
if (pDev && (pDev->coreEvents || pDev == inputInfo.pointer) &&
@@ -488,4 +492,23 @@ miPointerMoved (DeviceIntPtr pDev, Scree
miPointer.x = x;
miPointer.y = y;
miPointer.pScreen = pScreen;
+
+ /* generate motion notify */
+ valuators[0] = x;
+ valuators[1] = y;
+
+ events = (xEvent*)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+ if (!events)
+ {
+ FatalError("Could not allocate event store.\n");
+ return;
+ }
+
+ nevents = GetPointerEvents(events, pDev, MotionNotify, 0,
+ POINTER_ABSOLUTE, 0, 2, valuators);
+
+ for (i = 0; i < nevents; i++)
+ mieqEnqueue(pDev, &events[i]);
+
+ xfree(events);
}
More information about the xorg-commit
mailing list