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