xserver: Branch 'mpx' - 8 commits
Peter Hutterer
whot at kemper.freedesktop.org
Tue Apr 29 00:10:59 PDT 2008
Xi/exevents.c | 108 +++++++++++++++++++++++++------
Xi/exglobals.h | 1
Xi/extinit.c | 5 +
Xi/listdev.c | 2
dix/getevents.c | 28 +++-----
hw/xfree86/common/xf86DGA.c | 153 +++++++++-----------------------------------
include/exevents.h | 6 +
include/input.h | 6 +
include/inputstr.h | 2
mi/mieq.c | 37 ++++++----
10 files changed, 173 insertions(+), 175 deletions(-)
New commits:
commit 18b33dd4ff46f63bad70b493b1d0b0758c961ada
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date: Tue Apr 29 15:24:55 2008 +0930
Xi: stop excessive use of _X_EXPORT.
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 68e82dd..761950e 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -107,7 +107,7 @@ RegisterOtherDevice(DeviceIntPtr device)
device->public.realInputProc = ProcessOtherEvent;
}
-_X_EXPORT Bool
+Bool
IsPointerEvent(xEvent* xE)
{
switch(xE->u.u.type)
@@ -490,7 +490,7 @@ DeepCopyFeedbackClasses(DeviceIntPtr from, DeviceIntPtr to)
* Saves a few memory allocations.
*/
-_X_EXPORT void
+void
DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
{
ClassesPtr classes;
@@ -778,7 +778,7 @@ ChangeMasterDeviceClasses(DeviceIntPtr device,
#define DEFAULT 0
#define DONT_PROCESS 1
#define IS_REPEAT 2
-_X_EXPORT int
+int
UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
{
int i;
diff --git a/Xi/extinit.c b/Xi/extinit.c
index 99ace89..1d68d1e 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -966,7 +966,7 @@ IResetProc(ExtensionEntry * unused)
*
*/
-_X_EXPORT Bool
+Bool
DeviceIsPointerType(DeviceIntPtr dev)
{
if (dev_type[1].type == dev->type)
diff --git a/Xi/listdev.c b/Xi/listdev.c
index c484dcc..ce549da 100644
--- a/Xi/listdev.c
+++ b/Xi/listdev.c
@@ -93,7 +93,7 @@ SProcXListInputDevices(ClientPtr client)
*
*/
-_X_EXPORT void
+void
SizeDeviceInfo(DeviceIntPtr d, int *namesize, int *size)
{
int chunks;
commit 2b179c32ac40f5258d95ae16da96a79fa8eea696
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date: Tue Apr 29 15:15:16 2008 +0930
include: add declaration for CopyGetMasterEvent to shut up compiler warning.
diff --git a/include/input.h b/include/input.h
index 0c993ee..10dadfe 100644
--- a/include/input.h
+++ b/include/input.h
@@ -512,12 +512,18 @@ extern Bool RegisterPairingClient(ClientPtr client);
extern DeviceIntPtr GuessFreePointerDevice(void);
extern DeviceIntPtr NextFreePointerDevice(void);
+extern void CopyGetMasterEvent(DeviceIntPtr mdev,
+ xEvent* original,
+ xEvent** master,
+ int count);
+
extern int AllocMasterDevice(ClientPtr client,
char* name,
DeviceIntPtr* ptr,
DeviceIntPtr* keybd);
extern void DeepCopyDeviceClasses(DeviceIntPtr from,
DeviceIntPtr to);
+
extern void FreeDeviceClass(int type, pointer* class);
extern void FreeFeedbackClass(int type, pointer* class);
extern void FreeAllDeviceClasses(ClassesPtr classes);
commit ff36753755360aaa16ab8604a0ab78123884b57d
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date: Tue Apr 29 14:53:41 2008 +0930
mi: call the custom event handlers for both MD and SD.
diff --git a/mi/mieq.c b/mi/mieq.c
index 082ebab..9f81867 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -313,16 +313,7 @@ mieqProcessInputEvents(void)
NewCurrentScreen (e->pDev, DequeueScreen(e->pDev), x, y);
}
else {
- /* If someone's registered a custom event handler, let them
- * steal it. */
- if (miEventQueue.handlers[e->events->event->u.u.type]) {
- miEventQueue.handlers[e->events->event->u.u.type](
- DequeueScreen(e->pDev)->myNum,
- e->events->event,
- e->pDev,
- e->nevents);
- return;
- }
+ mieqHandler handler;
/* FIXME: Bad hack. The only event where we actually get multiple
* events at once is a DeviceMotionNotify followed by
@@ -350,13 +341,27 @@ mieqProcessInputEvents(void)
} else
master_event = NULL;
- /* process slave first, then master */
- e->pDev->public.processInputProc(event, e->pDev, e->nevents);
-
- if (!e->pDev->isMaster && e->pDev->u.master)
+ /* If someone's registered a custom event handler, let them
+ * steal it. */
+ if ((handler = miEventQueue.handlers[e->events->event->u.u.type]))
{
- e->pDev->u.master->public.processInputProc(master_event,
- e->pDev->u.master, e->nevents);
+ handler(DequeueScreen(e->pDev)->myNum, e->events->event,
+ e->pDev, e->nevents);
+ if (!e->pDev->isMaster && e->pDev->u.master)
+ {
+ handler(DequeueScreen(e->pDev->u.master)->myNum,
+ e->events->event, e->pDev->u.master, e->nevents);
+ }
+ } else
+ {
+ /* process slave first, then master */
+ e->pDev->public.processInputProc(event, e->pDev, e->nevents);
+
+ if (!e->pDev->isMaster && e->pDev->u.master)
+ {
+ e->pDev->u.master->public.processInputProc(master_event,
+ e->pDev->u.master, e->nevents);
+ }
}
if (e->nevents > 1)
commit ec2fca7e6f7ce8fdf33d959b7adeaae935ec4b37
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date: Tue Apr 29 14:40:44 2008 +0930
xfree86: DGA needs to call into Xi.
Two steps: first use UpdateDeviceState() instead of replicating the device
changing code. And emulate XI events instead of core events.
diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index 89fdec6..9c79505 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -46,6 +46,7 @@
#include <xkbsrv.h>
#endif
#include "xf86Xinput.h"
+#include "exglobals.h"
#include "mi.h"
@@ -1025,17 +1026,12 @@ static Mask filters[] =
static void
DGAProcessKeyboardEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr keybd)
{
- int key, bit;
- register BYTE *kptr;
- register int i;
- register CARD8 modifiers;
- register CARD16 mask;
int coreEquiv;
- xEvent core;
+ xEvent xi;
KeyClassPtr keyc = keybd->key;
DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(pScreen);
DeviceIntPtr pointer = GetPairedDevice(keybd);
-
+
coreEquiv = de->u.u.type - *XDGAEventBase;
/*
@@ -1046,59 +1042,10 @@ DGAProcessKeyboardEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr keybd)
de->u.event.screen = pScreen->myNum;
de->u.event.state = keyc->state | pointer->button->state;
- /*
- * Keep the core state in sync by duplicating what
- * CoreProcessKeyboardEvent does
- */
- key = de->u.u.detail;
- kptr = &keyc->down[key >> 3];
- bit = 1 << (key & 7);
- modifiers = keyc->modifierMap[key];
- switch (coreEquiv)
- {
- case KeyPress:
- pointer->valuator->motionHintWindow = NullWindow;
- *kptr |= bit;
- keyc->prev_state = keyc->state;
-#ifdef XKB
- if (noXkbExtension)
-#endif
- {
-
- for (i = 0, mask = 1; modifiers; i++, mask <<= 1)
- {
- if (mask & modifiers)
- {
- /* This key affects modifier "i" */
- keyc->modifierKeyCount[i]++;
- keyc->state |= mask;
- modifiers &= ~mask;
- }
- }
- }
- break;
- case KeyRelease:
- pointer->valuator->motionHintWindow = NullWindow;
- *kptr &= ~bit;
- keyc->prev_state = keyc->state;
-#ifdef XKB
- if (noXkbExtension)
-#endif
- {
- for (i = 0, mask = 1; modifiers; i++, mask <<= 1)
- {
- if (mask & modifiers) {
- /* This key affects modifier "i" */
- if (--keyc->modifierKeyCount[i] <= 0) {
- keyc->state &= ~mask;
- keyc->modifierKeyCount[i] = 0;
- }
- modifiers &= ~mask;
- }
- }
- }
- break;
- }
+ de->u.u.type = (IEventBase - 1) + coreEquiv; /* change to XI event */
+ UpdateDeviceState(keybd, de);
+ de->u.u.type = *XDGAEventBase + coreEquiv; /* change back */
+
/*
* Deliver the DGA event
*/
@@ -1113,17 +1060,16 @@ DGAProcessKeyboardEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr keybd)
/* If the keyboard is actively grabbed, deliver a grabbed core event */
if (keybd->deviceGrab.grab && !keybd->deviceGrab.fromPassiveGrab)
{
- /* I've got no clue if that is correct but only working on core
- * grabs seems the right thing here. (whot) */
- core.u.u.type = coreEquiv;
- core.u.u.detail = de->u.u.detail;
- core.u.keyButtonPointer.time = de->u.event.time;
- core.u.keyButtonPointer.eventX = de->u.event.dx;
- core.u.keyButtonPointer.eventY = de->u.event.dy;
- core.u.keyButtonPointer.rootX = de->u.event.dx;
- core.u.keyButtonPointer.rootY = de->u.event.dy;
- core.u.keyButtonPointer.state = de->u.event.state;
- DeliverGrabbedEvent (&core, keybd, FALSE, 1);
+ xi.u.u.type = (IEventBase - 1) + coreEquiv;
+ xi.u.u.detail = de->u.u.detail;
+ xi.u.keyButtonPointer.time = de->u.event.time;
+ xi.u.keyButtonPointer.eventX = de->u.event.dx;
+ xi.u.keyButtonPointer.eventY = de->u.event.dy;
+ xi.u.keyButtonPointer.rootX = de->u.event.dx;
+ xi.u.keyButtonPointer.rootY = de->u.event.dy;
+ xi.u.keyButtonPointer.state = de->u.event.state;
+ ((deviceKeyButtonPointer*)&xi)->deviceid = keybd->id;
+ DeliverGrabbedEvent (&xi, keybd, FALSE, 1);
}
}
}
@@ -1132,9 +1078,9 @@ static void
DGAProcessPointerEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr mouse)
{
ButtonClassPtr butc = mouse->button;
- int coreEquiv;
+ int coreEquiv;
DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(pScreen);
- xEvent core;
+ xEvent xi;
coreEquiv = de->u.u.type - *XDGAEventBase;
/*
@@ -1142,44 +1088,11 @@ DGAProcessPointerEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr mouse)
*/
de->u.event.screen = pScreen->myNum;
de->u.event.state = butc->state | GetPairedDevice(mouse)->key->state;
- /*
- * Keep the core state in sync by duplicating what
- * CoreProcessPointerEvent does
- */
- if (coreEquiv != MotionNotify)
- {
- int key;
- BYTE *kptr;
- int bit;
-
- key = de->u.u.detail;
- kptr = &butc->down[key >> 3];
- bit = 1 << (key & 7);
- switch (coreEquiv)
- {
- case ButtonPress:
- mouse->valuator->motionHintWindow = NullWindow;
- if (!(*kptr & bit))
- butc->buttonsDown++;
- butc->motionMask = ButtonMotionMask;
- *kptr |= bit;
- if (key <= 5)
- butc->state |= (Button1Mask >> 1) << key;
- break;
- case ButtonRelease:
- mouse->valuator->motionHintWindow = NullWindow;
- if (*kptr & bit)
- --butc->buttonsDown;
- if (!butc->buttonsDown)
- butc->motionMask = 0;
- *kptr &= ~bit;
- if (key == 0)
- return;
- if (key <= 5)
- butc->state &= ~((Button1Mask >> 1) << key);
- break;
- }
- }
+
+ de->u.u.type = (IEventBase - 1) + coreEquiv; /* change to XI event */
+ UpdateDeviceState(mouse, de);
+ de->u.u.type = *XDGAEventBase + coreEquiv; /* change back */
+
/*
* Deliver the DGA event
*/
@@ -1194,15 +1107,15 @@ DGAProcessPointerEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr mouse)
/* If the pointer is actively grabbed, deliver a grabbed core event */
if (mouse->deviceGrab.grab && !mouse->deviceGrab.fromPassiveGrab)
{
- core.u.u.type = coreEquiv;
- core.u.u.detail = de->u.u.detail;
- core.u.keyButtonPointer.time = de->u.event.time;
- core.u.keyButtonPointer.eventX = de->u.event.dx;
- core.u.keyButtonPointer.eventY = de->u.event.dy;
- core.u.keyButtonPointer.rootX = de->u.event.dx;
- core.u.keyButtonPointer.rootY = de->u.event.dy;
- core.u.keyButtonPointer.state = de->u.event.state;
- DeliverGrabbedEvent (&core, mouse, FALSE, 1);
+ xi.u.u.type = (IEventBase - 1 ) + coreEquiv;
+ xi.u.u.detail = de->u.u.detail;
+ xi.u.keyButtonPointer.time = de->u.event.time;
+ xi.u.keyButtonPointer.eventX = de->u.event.dx;
+ xi.u.keyButtonPointer.eventY = de->u.event.dy;
+ xi.u.keyButtonPointer.rootX = de->u.event.dx;
+ xi.u.keyButtonPointer.rootY = de->u.event.dy;
+ xi.u.keyButtonPointer.state = de->u.event.state;
+ DeliverGrabbedEvent (&xi, mouse, FALSE, 1);
}
}
}
commit 8208b842b7dd3b30bafdd74147bdfa63bc00cc40
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date: Tue Apr 29 14:19:42 2008 +0930
Xi: add IEventBase global variable. Stores event base for X Input events.
diff --git a/Xi/exglobals.h b/Xi/exglobals.h
index 4c23d84..0b1caf9 100644
--- a/Xi/exglobals.h
+++ b/Xi/exglobals.h
@@ -37,6 +37,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#define EXGLOBALS_H 1
extern int IReqCode;
+extern int IEventBase;
extern int BadDevice;
extern int BadMode;
extern int DeviceBusy;
diff --git a/Xi/extinit.c b/Xi/extinit.c
index a647b9e..99ace89 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -277,6 +277,7 @@ static int (*SProcIVector[])(ClientPtr) = {
*/
int IReqCode = 0;
+int IEventBase = 0;
int BadDevice = 0;
static int BadEvent = 1;
int BadMode = 2;
@@ -885,6 +886,7 @@ RestoreExtensionEvents(void)
int i, j;
IReqCode = 0;
+ IEventBase = 0;
for (i = 0; i < ExtEventIndex - 1; i++) {
if ((EventInfo[i].type >= LASTEvent) && (EventInfo[i].type < 128))
@@ -1122,6 +1124,7 @@ XInputExtensionInit(void)
SProcIDispatch, IResetProc, StandardMinorOpcode);
if (extEntry) {
IReqCode = extEntry->base;
+ IEventBase = extEntry->eventBase;
AllExtensionVersions[IReqCode - 128] = thisversion;
MakeDeviceTypeAtoms();
RT_INPUTCLIENT = CreateNewResourceType((DeleteType) InputClientGone);
commit 46340b740640b76b52b8e69bc67f9201c7e974c3
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date: Tue Apr 29 14:17:48 2008 +0930
Xi: change UpdateDeviceState to be _X_EXPORT.
diff --git a/Xi/exevents.c b/Xi/exevents.c
index bbe70e4..68e82dd 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -778,7 +778,7 @@ ChangeMasterDeviceClasses(DeviceIntPtr device,
#define DEFAULT 0
#define DONT_PROCESS 1
#define IS_REPEAT 2
-static int
+_X_EXPORT int
UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
{
int i;
diff --git a/include/exevents.h b/include/exevents.h
index 8d5d5dd..664e236 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -44,6 +44,12 @@ typedef struct _XIClientRec {
extern void RegisterOtherDevice (
DeviceIntPtr /* device */);
+extern int
+UpdateDeviceState (
+ DeviceIntPtr /* device */,
+ xEventPtr /* xE */,
+ int /* count */);
+
extern void ProcessOtherEvent (
xEventPtr /* FIXME deviceKeyButtonPointer * xE */,
DeviceIntPtr /* other */,
commit 3a922c5d07509703a3eeda2bbec6f332e6b0ffac
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date: Mon Apr 28 17:32:54 2008 +0930
Xi: apply ValuatorEvent data to the device's valuators.
After UpdateDeviceState, the device has the current position in absolute
coordinates, the event has the correct valuator data to be delivered to the
client.
diff --git a/Xi/exevents.c b/Xi/exevents.c
index a83d5ed..bbe70e4 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -823,6 +823,7 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
if ((++xV)->type == DeviceValuator) {
int *axisvals;
int first = xV->first_valuator;
+ BOOL change = FALSE;
if (xV->num_valuators &&
(!v || (xV->num_valuators &&
@@ -830,24 +831,91 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
FatalError("Bad valuators reported for device %s\n",
device->name);
if (v && v->axisVal) {
+ /* The device always stores values in absolute. Only the
+ * delivery mode changes.
+ * If device is mode Absolute, and event is Relative
+ * dev += event
+ * event = dev
+ * If device is mode Absolute, and event is Absolute
+ * dev = event
+ * If device is mode Relative, and event is Absolute
+ * swap = (event - device)
+ * dev = event
+ * event = delta
+ * If device is mode Relative, and event is Relative
+ * dev += event
+ *
+ * XXX: axis clipping for relative events?
+ */
axisvals = v->axisVal;
- switch (xV->num_valuators) {
- case 6:
- *(axisvals + first + 5) = xV->valuator5;
- case 5:
- *(axisvals + first + 4) = xV->valuator4;
- case 4:
- *(axisvals + first + 3) = xV->valuator3;
- case 3:
- *(axisvals + first + 2) = xV->valuator2;
- case 2:
- *(axisvals + first + 1) = xV->valuator1;
- case 1:
- *(axisvals + first) = xV->valuator0;
- case 0:
- default:
- break;
- }
+ if (xV->sequenceNumber & Absolute) {
+ int delta;
+ if (v->mode == Relative) /* device reports relative */
+ {
+ change = TRUE;
+ xV->sequenceNumber &= ~Absolute;
+ }
+
+ switch (xV->num_valuators) {
+ case 6:
+ if (change) delta = xV->valuator5 - *(axisvals + first + 5);
+ *(axisvals + first + 5) = xV->valuator5;
+ if (change) xV->valuator5 = delta;
+ case 5:
+ if (change) delta = xV->valuator4 - *(axisvals + first + 4);
+ *(axisvals + first + 4) = xV->valuator4;
+ if (change) xV->valuator4 = delta;
+ case 4:
+ if (change) delta = xV->valuator3 - *(axisvals + first + 3);
+ *(axisvals + first + 3) = xV->valuator3;
+ if (change) xV->valuator3 = delta;
+ case 3:
+ if (change) delta = xV->valuator2 - *(axisvals + first + 2);
+ *(axisvals + first + 2) = xV->valuator2;
+ if (change) xV->valuator2 = delta;
+ case 2:
+ if (change) delta = xV->valuator1 - *(axisvals + first + 1);
+ *(axisvals + first + 1) = xV->valuator1;
+ if (change) xV->valuator1 = delta;
+ case 1:
+ if (change) delta = xV->valuator0 - *(axisvals + first);
+ *(axisvals + first) = xV->valuator0;
+ if (change) xV->valuator0 = delta;
+ case 0:
+ default:
+ break;
+ }
+ } else { /* event is relative */
+ if (v->mode == Absolute) /* device reports absolute */
+ {
+ change = TRUE;
+ xV->sequenceNumber |= Absolute;
+ }
+
+ switch (xV->num_valuators) {
+ case 6:
+ *(axisvals + first + 5) += xV->valuator5;
+ if (change) xV->valuator5 = *(axisvals + first + 5);
+ case 5:
+ *(axisvals + first + 4) += xV->valuator4;
+ if (change) xV->valuator4 = *(axisvals + first + 4);
+ case 4:
+ *(axisvals + first + 3) += xV->valuator3;
+ if (change) xV->valuator3 = *(axisvals + first + 3);
+ case 3:
+ *(axisvals + first + 2) += xV->valuator2;
+ if (change) xV->valuator2 = *(axisvals + first + 2);
+ case 2:
+ *(axisvals + first + 1) += xV->valuator1;
+ if (change) xV->valuator1 = *(axisvals + first + 1);
+ case 1:
+ *(axisvals + first) += xV->valuator0;
+ if (change) xV->valuator0 = *(axisvals + first);
+ case 0:
+ default:
+ break;
+ }
+ }
}
}
}
diff --git a/include/inputstr.h b/include/inputstr.h
index 8c1d5fc..d117e55 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -174,7 +174,7 @@ typedef struct _ValuatorClassRec {
AxisInfoPtr axes;
unsigned short numAxes;
- int *axisVal;
+ int *axisVal; /* always absolute, but device-coord system */
int dxremaind, dyremaind; /* for acceleration */
CARD8 mode;
} ValuatorClassRec, *ValuatorClassPtr;
commit f2a20294fe26f4c9d245d24d065331fefd8f830d
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date: Mon Apr 28 16:56:22 2008 +0930
dix: store all valuators as they come from the device in the valuator events.
The event's sequenceNumber is mis-used to determine whether the values are
relative or absolute.
diff --git a/dix/getevents.c b/dix/getevents.c
index d352ebe..0a44a80 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -386,13 +386,15 @@ clipValuators(DeviceIntPtr pDev, int first_valuator, int num_valuators,
* Fills events with valuator events for pDev, as given by the other
* parameters.
*
+ * Note that we mis-use the sequence number to store the absolute bit.
+ *
* FIXME: Need to fix ValuatorClassRec to store all the valuators as
* last posted, not just x and y; otherwise relative non-x/y
* valuators, though a very narrow use case, will be broken.
*/
static EventList *
-getValuatorEvents(EventList *events, DeviceIntPtr pDev, int first_valuator,
- int num_valuators, int *valuators) {
+getValuatorEvents(EventList *events, DeviceIntPtr pDev, int absolute,
+ int first_valuator, int num_valuators, int *valuators) {
deviceValuator *xv;
int i = 0, final_valuator = first_valuator + num_valuators;
@@ -419,6 +421,8 @@ getValuatorEvents(EventList *events, DeviceIntPtr pDev, int first_valuator,
if (i + 6 < final_valuator)
xv->deviceid |= MORE_EVENTS;
+
+ xv->sequenceNumber = (absolute) ? Absolute : Relative;
}
return events;
@@ -561,8 +565,8 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
if (num_valuators) {
kbp->deviceid |= MORE_EVENTS;
clipValuators(pDev, first_valuator, num_valuators, valuators);
- events = getValuatorEvents(events, pDev, first_valuator,
- num_valuators, valuators);
+ events = getValuatorEvents(events, pDev, FALSE /* relative */,
+ first_valuator, num_valuators, valuators);
}
return numEvents;
@@ -751,14 +755,6 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
* to the current screen. Right now, we only have one history buffer,
* so we don't set this for both the device and core.*/
miPointerSetPosition(pDev, &x, &y, ms);
-
- /* Drop x and y back into the valuators list, if they were originally
- * present. */
- if (first_valuator == 0 && num_valuators >= 1)
- valuators[0] = x;
- if (first_valuator <= 1 && num_valuators >= (2 - first_valuator))
- valuators[1 - first_valuator] = y;
-
updateMotionHistory(pDev, ms, first_valuator, num_valuators, valuators);
pDev->lastx = x;
@@ -791,8 +787,8 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
if (num_valuators) {
kbp->deviceid |= MORE_EVENTS;
clipValuators(pDev, first_valuator, num_valuators, valuators);
- events = getValuatorEvents(events, pDev, first_valuator,
- num_valuators, valuators);
+ events = getValuatorEvents(events, pDev, (flags & POINTER_ABSOLUTE),
+ first_valuator, num_valuators, valuators);
}
return num_events;
@@ -859,8 +855,8 @@ GetProximityEvents(EventList *events, DeviceIntPtr pDev, int type,
kbp->deviceid |= MORE_EVENTS;
events++;
clipValuators(pDev, first_valuator, num_valuators, valuators);
- events = getValuatorEvents(events, pDev, first_valuator,
- num_valuators, valuators);
+ events = getValuatorEvents(events, pDev, False /* relative */,
+ first_valuator, num_valuators, valuators);
}
return num_events;
More information about the xorg-commit
mailing list