xserver: Branch 'mpx' - 6 commits

Peter Hutterer whot at kemper.freedesktop.org
Wed May 14 00:21:18 PDT 2008


 Xext/xtest.c                |   34 ++++++++++++++++++++++++++++------
 dix/devices.c               |    4 ++--
 dix/main.c                  |    2 +-
 hw/dmx/dmxcursor.c          |   18 +++++++++---------
 hw/dmx/dmxcursor.h          |    2 +-
 hw/dmx/dmxinput.h           |    4 ++--
 hw/dmx/input/dmxeq.c        |    8 +++++---
 hw/dmx/input/dmxevents.c    |   27 ++++++++++++++-------------
 hw/dmx/input/dmxinputinit.c |    2 +-
 include/input.h             |    4 +---
 mi/mipointer.c              |    4 ++--
 11 files changed, 66 insertions(+), 43 deletions(-)

New commits:
commit 68b4f250eef441a3d75e3b9b2665a51d3a1538d6
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Wed May 14 16:18:48 2008 +0930

    dmx: fix build.
    
    Just because it builds, doesn't mean it works.

diff --git a/hw/dmx/dmxcursor.c b/hw/dmx/dmxcursor.c
index 8a80116..3dcbc33 100644
--- a/hw/dmx/dmxcursor.c
+++ b/hw/dmx/dmxcursor.c
@@ -178,14 +178,14 @@ static void dmxCrossScreen(ScreenPtr pScreen, Bool entering)
 {
 }
 
-static void dmxWarpCursor(ScreenPtr pScreen, int x, int y)
+static void dmxWarpCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
 {
     DMXDBG3("dmxWarpCursor(%d,%d,%d)\n", pScreen->myNum, x, y);
 #if 11 /*BP*/
     /* This call is depracated.  Replace with???? */
-    miPointerWarpCursor(pScreen, x, y);
+    miPointerWarpCursor(pDev, pScreen, x, y);
 #else
-    pScreen->SetCursorPosition(pScreen, x, y, FALSE);
+    pScreen->SetCursorPosition(pDev, pScreen, x, y, FALSE);
 #endif
 }
 
@@ -753,7 +753,7 @@ static void _dmxSetCursor(ScreenPtr pScreen, CursorPtr pCursor, int x, int y)
     if (dmxScreen->beDisplay) dmxSync(dmxScreen, TRUE);
 }
 
-static Bool dmxRealizeCursor(ScreenPtr pScreen, CursorPtr pCursor)
+static Bool dmxRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
 {
     DMXScreenInfo *start = &dmxScreens[pScreen->myNum];
     DMXScreenInfo *pt;
@@ -771,7 +771,7 @@ static Bool dmxRealizeCursor(ScreenPtr pScreen, CursorPtr pCursor)
     return TRUE;
 }
 
-static Bool dmxUnrealizeCursor(ScreenPtr pScreen, CursorPtr pCursor)
+static Bool dmxUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
 {
     DMXScreenInfo *start = &dmxScreens[pScreen->myNum];
     DMXScreenInfo *pt;
@@ -794,14 +794,14 @@ static CursorPtr dmxFindCursor(DMXScreenInfo *start)
     DMXScreenInfo *pt;
 
     if (!start || !start->over)
-        return GetSpriteCursor();
+        return GetSpriteCursor(inputInfo.pointer);
     for (pt = start->over; /* condition at end of loop */; pt = pt->over) {
         if (pt->cursor)
             return pt->cursor;
         if (pt == start)
             break;
     }
-    return GetSpriteCursor();
+    return GetSpriteCursor(inputInfo.pointer);
 }
 
 /** Move the cursor to coordinates (\a x, \a y)on \a pScreen.  This
@@ -813,7 +813,7 @@ static CursorPtr dmxFindCursor(DMXScreenInfo *start)
  * back-end screens and see if they contain the global coord.  If so, call
  * _dmxMoveCursor() (XWarpPointer) to position the pointer on that screen.
  */
-void dmxMoveCursor(ScreenPtr pScreen, int x, int y)
+void dmxMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
 {
     DMXScreenInfo *start = &dmxScreens[pScreen->myNum];
     DMXScreenInfo *pt;
@@ -860,7 +860,7 @@ void dmxMoveCursor(ScreenPtr pScreen, int x, int y)
     }
 }
 
-static void dmxSetCursor(ScreenPtr pScreen, CursorPtr pCursor, int x, int y)
+static void dmxSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor, int x, int y)
 {
     DMXScreenInfo *start = &dmxScreens[pScreen->myNum];
     DMXScreenInfo *pt;
diff --git a/hw/dmx/dmxcursor.h b/hw/dmx/dmxcursor.h
index d909bd0..da8ea5e 100644
--- a/hw/dmx/dmxcursor.h
+++ b/hw/dmx/dmxcursor.h
@@ -55,7 +55,7 @@ extern void dmxReInitOrigins(void);
 extern void dmxInitOrigins(void);
 extern void dmxInitOverlap(void);
 extern void dmxCursorNoMulti(void);
-extern void dmxMoveCursor(ScreenPtr pScreen, int x, int y);
+extern void dmxMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y);
 extern void dmxCheckCursor(void);
 extern int  dmxOnScreen(int x, int y, DMXScreenInfo *dmxScreen);
 extern void dmxHideCursor(DMXScreenInfo *dmxScreen);
diff --git a/hw/dmx/dmxinput.h b/hw/dmx/dmxinput.h
index 8a3ccdc..7af7b18 100644
--- a/hw/dmx/dmxinput.h
+++ b/hw/dmx/dmxinput.h
@@ -141,8 +141,8 @@ extern void dmxUpdateWindowInfo(DMXUpdateType type, WindowPtr pWindow);
 
 /* These functions are defined in input/dmxeq.c */
 extern Bool dmxeqInitialized(void);
-extern void dmxeqEnqueue(xEvent *e);
-extern void dmxeqSwitchScreen(ScreenPtr pScreen, Bool fromDIX);
+extern void dmxeqEnqueue(DeviceIntPtr pDev, xEvent *e);
+extern void dmxeqSwitchScreen(DeviceIntPtr pDev, ScreenPtr pScreen, Bool fromDIX);
 
 /* This type is used in input/dmxevents.c.  Also, these functions are
  * defined in input/dmxevents.c */
diff --git a/hw/dmx/input/dmxeq.c b/hw/dmx/input/dmxeq.c
index afa2b2c..86ba960 100644
--- a/hw/dmx/input/dmxeq.c
+++ b/hw/dmx/input/dmxeq.c
@@ -99,6 +99,7 @@ typedef struct _Event {
     xEvent	   event;    /**< Event. */
     ScreenPtr	   pScreen;  /**< Screen on which event occurred. */
     deviceValuator valuator; /**< XInput device valuator information. */
+    DeviceIntPtr   pDev;
 } EventRec, *EventPtr;
 
 /** Event queue. */
@@ -154,7 +155,7 @@ Bool dmxeqInit(DevicePtr pKbd, DevicePtr pPtr)
  * called from regular code.
  */
 
-void dmxeqEnqueue(xEvent *e)
+void dmxeqEnqueue(DeviceIntPtr pDev, xEvent *e)
 {
     HWEventQueueType oldtail, newtail;
     Bool             isMotion;
@@ -179,6 +180,7 @@ void dmxeqEnqueue(xEvent *e)
 
                                 /* Store the event in the queue */
     dmxEventQueue.events[oldtail].event   = *e;
+    dmxEventQueue.events[oldtail].pDev    = pDev;
                             /* If this is an XInput event, store the
                              * valuator event, too */
     deviceKeyButtonPointer *ev = (deviceKeyButtonPointer *)e;
@@ -197,7 +199,7 @@ void dmxeqEnqueue(xEvent *e)
 
 /** Make \a pScreen the new screen for enqueueing events.  If \a fromDIX
  * is TRUE, also make \a pScreen the new screen for dequeuing events. */
-void dmxeqSwitchScreen(ScreenPtr pScreen, Bool fromDIX)
+void dmxeqSwitchScreen(DeviceIntPtr pDev, ScreenPtr pScreen, Bool fromDIX)
 {
     dmxEventQueue.pEnqueueScreen = pScreen;
     if (fromDIX) dmxEventQueue.pDequeueScreen = pScreen;
@@ -258,7 +260,7 @@ void dmxeqProcessInputEvents(void)
 	    y = e->event.u.keyButtonPointer.rootY;
 	    if (dmxEventQueue.head == QUEUE_SIZE - 1) dmxEventQueue.head = 0;
 	    else                                      ++dmxEventQueue.head;
-	    NewCurrentScreen(dmxEventQueue.pDequeueScreen, x, y);
+	    NewCurrentScreen(e->pDev, dmxEventQueue.pDequeueScreen, x, y);
 	} else {
 	    xe[0] = e->event;
 	    if (dmxEventQueue.head == QUEUE_SIZE - 1) dmxEventQueue.head = 0;
diff --git a/hw/dmx/input/dmxevents.c b/hw/dmx/input/dmxevents.c
index 2e24ff4..1d0e872 100644
--- a/hw/dmx/input/dmxevents.c
+++ b/hw/dmx/input/dmxevents.c
@@ -201,7 +201,7 @@ static void dmxEnqueueExtEvent(DMXLocalInputInfoPtr dmxLocal, xEvent *e,
 
     if (block)
         dmxSigioBlock();
-    dmxeqEnqueue(xE);
+    dmxeqEnqueue(pDevice, xE);
     if (block)
         dmxSigioUnblock();
 }
@@ -227,14 +227,16 @@ static void enqueueMotion(DevicePtr pDev, int x, int y)
     GETDMXLOCALFROMPDEV;
     DeviceIntPtr p = dmxLocal->pDevice;
     int i, nevents, valuators[3];
-    xEvent *events = Xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+    EventListPtr events;
     int detail = 0;  /* XXX should this be mask of pressed buttons? */
     valuators[0] = x;
     valuators[1] = y;
+
+    GetEventList(&events);
     nevents = GetPointerEvents(events, p, MotionNotify, detail,
                                POINTER_ABSOLUTE, 0, 2, valuators);
     for (i = 0; i < nevents; i++)
-       mieqEnqueue(p, events + i);
+       mieqEnqueue(p, (events + i)->event);
     xfree(events);
     return;
 }
@@ -419,7 +421,7 @@ static void dmxExtMotion(DMXLocalInputInfoPtr dmxLocal,
     if (block)
         dmxSigioBlock();
     dmxPointerPutMotionEvent(pDevice, firstAxis, axesCount, v, xev->time);
-    dmxeqEnqueue(xE);
+    dmxeqEnqueue(pDevice, xE);
     if (block)
         dmxSigioUnblock();
 }
@@ -434,6 +436,7 @@ static int dmxTranslateAndEnqueueExtEvent(DMXLocalInputInfoPtr dmxLocal,
     int                    event   = -1;
     XDeviceKeyEvent        *ke     = (XDeviceKeyEvent *)e;
     XDeviceMotionEvent     *me     = (XDeviceMotionEvent *)e;
+    DeviceIntPtr           pDevice = dmxLocal->pDevice;
 
     if (!e)
         return -1;          /* No extended event passed, cannot handle */
@@ -499,7 +502,7 @@ static int dmxTranslateAndEnqueueExtEvent(DMXLocalInputInfoPtr dmxLocal,
 
         if (block)
             dmxSigioBlock();
-        dmxeqEnqueue(xE);
+        dmxeqEnqueue(pDevice, xE);
         if (block)
             dmxSigioUnblock();
         break;
@@ -674,7 +677,7 @@ void dmxEnqueue(DevicePtr pDev, int type, int detail, KeySym keySym,
     xEvent xE;
     DeviceIntPtr p = dmxLocal->pDevice;
     int i, nevents, valuators[3];
-    xEvent *events;
+    EventListPtr events;
 
     DMXDBG2("dmxEnqueue: Enqueuing type=%d detail=0x%0x\n", type, detail);
 
@@ -688,25 +691,24 @@ void dmxEnqueue(DevicePtr pDev, int type, int detail, KeySym keySym,
         if (dmxLocal->sendsCore && dmxLocal != dmxLocalCoreKeyboard)
             xE.u.u.detail = dmxFixup(pDev, detail, keySym);
 
-        events = Xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+        GetEventList(&events);
         /*ErrorF("KEY %d  sym %d\n", detail, (int) keySym);*/
         nevents = GetKeyboardEvents(events, p, type, detail);
         for (i = 0; i < nevents; i++)
-            mieqEnqueue(p, events + i);
-        xfree(events);
+            mieqEnqueue(p, (events + i)->event);
         return;
 
     case ButtonPress:
     case ButtonRelease:
         detail = dmxGetButtonMapping(dmxLocal, detail);
-        events = Xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+        GetEventList(&events);
         nevents = GetPointerEvents(events, p, type, detail,
                                    POINTER_ABSOLUTE,
                                    0,   /* first_valuator = 0 */
                                    0,   /* num_valuators = 0 */
                                    valuators);
         for (i = 0; i < nevents; i++)
-            mieqEnqueue(p, events + i);
+            mieqEnqueue(p, (events + i)->event);
         xfree(events);
         return;
 
@@ -718,8 +720,7 @@ void dmxEnqueue(DevicePtr pDev, int type, int detail, KeySym keySym,
         nevents = GetPointerEvents(events, p, type, detail, 
                                    POINTER_ABSOLUTE, 0, 3, valuators);
         for (i = 0; i < nevents; i++)
-            mieqEnqueue(p, events + i);
-        xfree(events);
+            mieqEnqueue(p, (events + i)->event);
         return;
 
     case EnterNotify:
diff --git a/hw/dmx/input/dmxinputinit.c b/hw/dmx/input/dmxinputinit.c
index 7b5cc73..277e164 100644
--- a/hw/dmx/input/dmxinputinit.c
+++ b/hw/dmx/input/dmxinputinit.c
@@ -755,7 +755,7 @@ static DeviceIntPtr dmxAddDevice(DMXLocalInputInfoPtr dmxLocal)
     if (!name || !registerProcPtr)
         dmxLog(dmxFatal, "Cannot add device %s\n", dmxLocal->name);
 
-    pDevice                       = AddInputDevice(dmxDeviceOnOff, TRUE);
+    pDevice                       = AddInputDevice(serverClient, dmxDeviceOnOff, TRUE);
     if (!pDevice) {
         dmxLog(dmxError, "Too many devices -- cannot add device %s\n",
                dmxLocal->name);
commit 00db0f35acc00cb771ab1c23f35b0db1c25d81bb
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Wed May 14 15:29:28 2008 +0930

    dix: InitAndStartDevices doesn't need a window parameter.
    
    Leftover from the old pointer-keyboard pairing code, obsolete and gone now.

diff --git a/dix/devices.c b/dix/devices.c
index 644ee29..05a6b51 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -539,7 +539,7 @@ InitCoreDevices(void)
  * @return Success or error code on failure.
  */
 int
-InitAndStartDevices(WindowPtr root)
+InitAndStartDevices()
 {
     DeviceIntPtr dev, next;
 
diff --git a/dix/main.c b/dix/main.c
index 5dce3df..42d3309 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -412,7 +412,7 @@ int main(int argc, char *argv[], char *envp[])
 
         InitCoreDevices();
 	InitInput(argc, argv);
-	if (InitAndStartDevices(WindowTable[0]) != Success)
+	if (InitAndStartDevices() != Success)
 	    FatalError("failed to initialize core devices");
 
 	dixSaveScreens(serverClient, SCREEN_SAVER_FORCER, ScreenSaverReset);
diff --git a/include/input.h b/include/input.h
index ec6ac90..13902d7 100644
--- a/include/input.h
+++ b/include/input.h
@@ -231,9 +231,7 @@ extern Bool ActivateDevice(
 extern Bool DisableDevice(
     DeviceIntPtr /*device*/);
 
-extern int InitAndStartDevices(
-    WindowPtr /*root*/);
-
+extern int InitAndStartDevices(void);
 
 extern void CloseDownDevices(void);
 
commit da728f2127aaa5c1ed5d22bb9f3d0c8ff19e4933
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Wed May 14 15:17:05 2008 +0930

    dix: don't use serverClient in AddInputDevice, use the one supplied instead.
    
    We pass in the client that wants to create the device anyway, lets use the
    parameter instead of hardcoding the serverClient.
    
    Wow. I hope this is merge detritus, otherwise it'd be a sign that I didn't
    have enough coffee that day.

diff --git a/dix/devices.c b/dix/devices.c
index 82eece7..644ee29 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -169,7 +169,7 @@ AddInputDevice(ClientPtr client, DeviceProc deviceProc, Bool autoStart)
 
     /*  security creation/labeling check
      */
-    if (XaceHook(XACE_DEVICE_ACCESS, serverClient, dev, DixCreateAccess)) {
+    if (XaceHook(XACE_DEVICE_ACCESS, client, dev, DixCreateAccess)) {
 	xfree(dev);
 	return NULL;
     }
commit a6659291c798f417a76d9aa7944694ff27c01fa7
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Wed May 14 09:42:50 2008 +0930

    mi: protect against NULL-pointer dereference.
    
    Required by the recent patch to use a NullCursor instead of UndisplayCursor().

diff --git a/mi/mipointer.c b/mi/mipointer.c
index 8243947..2c226dc 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -357,7 +357,7 @@ miPointerWarpCursor (pDev, pScreen, x, y)
     	{
 	    pPointer->devx = x;
 	    pPointer->devy = y;
-	    if(!pPointer->pCursor->bits->emptyMask)
+	    if(pPointer->pCursor && !pPointer->pCursor->bits->emptyMask)
 		(*pScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y);
     	}
 	pPointer->x = x;
@@ -541,7 +541,7 @@ miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y,
     {
 	pPointer->devx = x;
 	pPointer->devy = y;
-	if(!pPointer->pCursor->bits->emptyMask)
+	if(pPointer->pCursor && !pPointer->pCursor->bits->emptyMask)
 	    (*pScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y);
     }
 
commit dc3aba8a559d4304844ee1cc306c577a63b82762
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Tue May 13 14:37:26 2008 +0930

    Xext: emulate XI events from core events when faking input.
    
    We need XI events for event processing, so lets get rid of the pure core
    events ASAP.

diff --git a/Xext/xtest.c b/Xext/xtest.c
index e96375d..791f6a2 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -52,6 +52,7 @@
 #include "modinit.h"
 
 extern int DeviceValuator;
+extern int DeviceMotionNotify;
 
 #ifdef PANORAMIX
 #include "panoramiX.h"
@@ -235,6 +236,26 @@ ProcXTestFakeInput(client)
                 client->errorValue = ev->u.u.type;
                 return BadValue;
         }
+
+        ev->u.u.type += (DeviceValuator - 1);
+        if (ev->u.u.type == DeviceMotionNotify)
+        {
+            /* fake up valuator */
+            xEvent *ne = xalloc(2 * sizeof(xEvent));
+            if (ne) {
+                memcpy(ne, ev, sizeof(xEvent));
+                memcpy(&ne[1], ev, sizeof(xEvent));
+                ev = ne;
+
+                dv = (deviceValuator*)(ne + 1);
+                dv->type = DeviceValuator;
+                dv->first_valuator = 0;
+                dv->num_valuators = 2;
+                dv->valuator0 = ev->u.keyButtonPointer.rootX;
+                dv->valuator1 = ev->u.keyButtonPointer.rootY;
+                nev = 2;
+            }
+        }
     }
 
     /* If the event has a time set, wait for it to pass */
@@ -338,6 +359,7 @@ ProcXTestFakeInput(client)
                         values += 6;
                     }
                 }
+
                 /* For XI events, the actual event is mostly unset. Since we
                  * want to update the sprite nontheless, we need to fake up
                  * sane values for the event. */
@@ -468,6 +490,7 @@ ProcXTestFakeInput(client)
     if (screenIsSaved == SCREEN_SAVER_ON)
         dixSaveScreens(serverClient, SCREEN_SAVER_OFF, ScreenSaverReset);
     ev->u.keyButtonPointer.time = currentTime.milliseconds;
+
     if (!dev->isMaster && dev->u.master)
     {   /* duplicate and route through master */
         xEvent *master_event = NULL;
@@ -477,6 +500,8 @@ ProcXTestFakeInput(client)
         xfree(master_event);
     } else
         (*dev->public.processInputProc)(ev, dev, nev);
+    if (extension)
+        xfree(ev);
     return client->noClientException;
 }
 
commit 8b3802d32041547fd6ed5393a56281c5c83d260e
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Tue May 13 13:47:52 2008 +0930

    Xext: core button events have rootX/Y unset too.

diff --git a/Xext/xtest.c b/Xext/xtest.c
index e11f358..e96375d 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -455,12 +455,9 @@ ProcXTestFakeInput(client)
         case ButtonRelease:
             if (!extension)
                 dev = PickPointer(client);
-            else
-            {
-                /* For XI events, the rootX/Y is unset. */
-                ev->u.keyButtonPointer.rootX = dev->lastx;
-                ev->u.keyButtonPointer.rootY = dev->lasty;
-            }
+
+            ev->u.keyButtonPointer.rootX = dev->lastx;
+            ev->u.keyButtonPointer.rootY = dev->lasty;
             if (!ev->u.u.detail || ev->u.u.detail > dev->button->numButtons)
             {
                 client->errorValue = ev->u.u.detail;


More information about the xorg-commit mailing list