xserver: Branch 'glucose-2' - 39 commits

Alan Hourihane alanh at kemper.freedesktop.org
Thu Jun 5 03:42:57 PDT 2008


 Xext/xtest.c                          |  310 +++++++++++-----------------------
 config/hal.c                          |    2 
 dix/devices.c                         |    7 
 dix/events.c                          |   17 -
 dix/getevents.c                       |    5 
 glx/glapi.c                           |    3 
 hw/dmx/dmxcursor.c                    |   13 +
 hw/dmx/dmxgc.c                        |    2 
 hw/dmx/dmxinit.c                      |    5 
 hw/dmx/input/dmxevents.c              |    2 
 hw/dmx/input/dmxinputinit.c           |   33 +--
 hw/dmx/input/dmxxinput.c              |    3 
 hw/kdrive/ephyr/ephyr.c               |    8 
 hw/kdrive/ephyr/ephyrinit.c           |    8 
 hw/kdrive/src/kinput.c                |   20 +-
 hw/xfree86/common/xf86Xinput.c        |   37 ++--
 hw/xquartz/Makefile.am                |    4 
 hw/xquartz/darwinEvents.c             |   55 +++---
 hw/xquartz/mach-startup/Makefile.am   |   22 +-
 hw/xquartz/mach-startup/bundle-main.c |   83 ++-------
 hw/xquartz/mach-startup/stub.c        |   99 ++++++----
 include/Makefile.am                   |    4 
 include/xkbsrv.h                      |    4 
 mi/mieq.c                             |    6 
 mi/miinitext.c                        |    2 
 mi/misprite.c                         |   10 -
 xkb/xkbInit.c                         |   18 +
 27 files changed, 368 insertions(+), 414 deletions(-)

New commits:
commit c72a02a3962aef859a36b1f76ba71fcbce7c39d5
Merge: d2193a6... d25ffcf...
Author: Alan Hourihane <alanh at tungstengraphics.com>
Date:   Thu Jun 5 11:42:47 2008 +0100

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into glucose-2

commit d25ffcfbfcfe8e059f2889873c9dbe76a28ad00c
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Thu Jun 5 15:29:35 2008 +0930

    mi: protect against possible NULL-pointer dereference.

diff --git a/mi/misprite.c b/mi/misprite.c
index 25f6b6f..b8df5eb 100644
--- a/mi/misprite.c
+++ b/mi/misprite.c
@@ -460,7 +460,7 @@ miSpriteBlockHandler (int i, pointer blockData, pointer pTimeout,
     pPriv = (miSpriteScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
 						miSpriteScreenKey);
     SCREEN_PROLOGUE(pScreen, BlockHandler);
-    
+
     (*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask);
 
     SCREEN_EPILOGUE(pScreen, BlockHandler);
@@ -470,8 +470,8 @@ miSpriteBlockHandler (int i, pointer blockData, pointer pTimeout,
         if (DevHasCursor(pDev))
         {
             pCursorInfo = MISPRITE(pDev);
-            if (!pCursorInfo->isUp 
-                    && pCursorInfo->pScreen == pScreen 
+            if (pCursorInfo && !pCursorInfo->isUp
+                    && pCursorInfo->pScreen == pScreen
                     && pCursorInfo->shouldBeUp)
             {
                 SPRITE_DEBUG (("BlockHandler restore\n"));
@@ -484,8 +484,8 @@ miSpriteBlockHandler (int i, pointer blockData, pointer pTimeout,
         if (DevHasCursor(pDev))
         {
             pCursorInfo = MISPRITE(pDev);
-            if (!pCursorInfo->isUp && 
-                    pCursorInfo->pScreen == pScreen && 
+            if (pCursorInfo && !pCursorInfo->isUp &&
+                    pCursorInfo->pScreen == pScreen &&
                     pCursorInfo->shouldBeUp)
             {
                 SPRITE_DEBUG (("BlockHandler restore\n"));
commit 874dcdb3bdb9320aae252d3c7927d412685059d5
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Thu Jun 5 15:38:48 2008 +0930

    dmx: remove a ifndef XINPUT, XINPUT is always defined now.

diff --git a/hw/dmx/input/dmxinputinit.c b/hw/dmx/input/dmxinputinit.c
index 0b9335b..a0eb80f 100644
--- a/hw/dmx/input/dmxinputinit.c
+++ b/hw/dmx/input/dmxinputinit.c
@@ -1079,13 +1079,6 @@ void dmxInputInit(DMXInputInfo *dmxInput)
     
     for (i = 0; i < dmxInput->numDevs; i++) {
         DMXLocalInputInfoPtr dmxLocal = dmxInput->devs[i];
-#ifndef XINPUT
-        if (!dmxLocal->isCore)
-            dmxLog(dmxFatal,
-                   "This server was not compiled to support the XInput"
-                   " extension, but %s is not a core device.\n",
-                   dmxLocal->name);
-#endif
         dmxLocal->pDevice = dmxAddDevice(dmxLocal);
         if (dmxLocal->isCore) {
             if (dmxLocal->type == DMX_LOCAL_MOUSE)
commit 52752911ea8470dd8805f5e6c3febb9e1e1cc4b3
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Wed Jun 4 17:04:16 2008 +0930

    dmx: don't free event list after use.

diff --git a/hw/dmx/input/dmxevents.c b/hw/dmx/input/dmxevents.c
index 1d0e872..4b51ffd 100644
--- a/hw/dmx/input/dmxevents.c
+++ b/hw/dmx/input/dmxevents.c
@@ -237,7 +237,6 @@ static void enqueueMotion(DevicePtr pDev, int x, int y)
                                POINTER_ABSOLUTE, 0, 2, valuators);
     for (i = 0; i < nevents; i++)
        mieqEnqueue(p, (events + i)->event);
-    xfree(events);
     return;
 }
 
@@ -709,7 +708,6 @@ void dmxEnqueue(DevicePtr pDev, int type, int detail, KeySym keySym,
                                    valuators);
         for (i = 0; i < nevents; i++)
             mieqEnqueue(p, (events + i)->event);
-        xfree(events);
         return;
 
     case MotionNotify:
commit 5c5e58124581b845a6bfa7a2991a4e0ee7f7ebdb
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Wed Jun 4 16:58:31 2008 +0930

    dmx: add an XFlush.
    
    Beats me why we need it, but without it we get segfaults lateron.

diff --git a/hw/dmx/dmxinit.c b/hw/dmx/dmxinit.c
index 6d466c4..760fccf 100644
--- a/hw/dmx/dmxinit.c
+++ b/hw/dmx/dmxinit.c
@@ -778,6 +778,8 @@ void InitOutput(ScreenInfo *pScreenInfo, int argc, char *argv[])
 
 		/* Hand out the glx configs to glx extension */
 		GlxSetVisualConfigs(nconfigs, configs, (void**)configprivs);
+
+                XFlush(dmxScreen->beDisplay);
 	    }
 	}
 #endif  /* GLXEXT */
commit 246c10441bbf62646b77993b55233d5ceb93a81f
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Wed Jun 4 16:37:25 2008 +0930

    dmx: fix false memory allocation.
    
    beNumVisuals and the number of GLX Visuals can be significantly different.

diff --git a/hw/dmx/dmxinit.c b/hw/dmx/dmxinit.c
index 366bd14..6d466c4 100644
--- a/hw/dmx/dmxinit.c
+++ b/hw/dmx/dmxinit.c
@@ -746,8 +746,7 @@ void InitOutput(ScreenInfo *pScreenInfo, int argc, char *argv[])
 		nconfigs = dmxScreen->numGlxVisuals;
 	    }
 
-	    configprivs = xalloc(dmxScreen->beNumVisuals *
-				 sizeof(dmxGlxVisualPrivate*));
+	    configprivs = xalloc(nconfigs * sizeof(dmxGlxVisualPrivate*));
 
 	    if (configs != NULL && configprivs != NULL) {
 
commit 17cd26225749a1daf7460b44e52f43082399b265
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Wed Jun 4 16:05:36 2008 +0930

    dmx: don't dereference a nullpointer.

diff --git a/hw/dmx/dmxcursor.c b/hw/dmx/dmxcursor.c
index 2a596a1..6218dc3 100644
--- a/hw/dmx/dmxcursor.c
+++ b/hw/dmx/dmxcursor.c
@@ -733,7 +733,7 @@ static void _dmxSetCursor(ScreenPtr pScreen, CursorPtr pCursor, int x, int y)
 
     if (pCursor) {
 	dmxCursorPrivPtr  pCursorPriv = DMX_GET_CURSOR_PRIV(pCursor, pScreen);
-	if (dmxScreen->curCursor != pCursorPriv->cursor) {
+	if (pCursorPriv && dmxScreen->curCursor != pCursorPriv->cursor) {
 	    if (dmxScreen->beDisplay)
 		XDefineCursor(dmxScreen->beDisplay, dmxScreen->scrnWin,
 			      pCursorPriv->cursor);
commit 75eb635e3543fcb731331d01f50e62b696967667
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Tue Jun 3 22:25:33 2008 +0930

    dmx: add stubs for DeviceCursorInitialize, DeviceCursorCleanup

diff --git a/hw/dmx/dmxcursor.c b/hw/dmx/dmxcursor.c
index 3dcbc33..2a596a1 100644
--- a/hw/dmx/dmxcursor.c
+++ b/hw/dmx/dmxcursor.c
@@ -969,10 +969,21 @@ void dmxCheckCursor(void)
     DMXDBG2("   leave dmxCheckCursor %d %d\n", x, y);
 }
 
+static Bool dmxDeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScr)
+{
+    return TRUE;
+}
+
+static void dmxDeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScr)
+{
+}
+
 miPointerSpriteFuncRec dmxPointerSpriteFuncs =
 {
     dmxRealizeCursor,
     dmxUnrealizeCursor,
     dmxSetCursor,
     dmxMoveCursor,
+    dmxDeviceCursorInitialize,
+    dmxDeviceCursorCleanup
 };
commit 3ff2f3a00ef3c484d1d53569b6cbc1f25dc6bd35
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Tue Jun 3 22:17:14 2008 +0930

    dmx: for now, don't acknowledge SDs.

diff --git a/hw/dmx/input/dmxinputinit.c b/hw/dmx/input/dmxinputinit.c
index 4713c1b..0b9335b 100644
--- a/hw/dmx/input/dmxinputinit.c
+++ b/hw/dmx/input/dmxinputinit.c
@@ -921,6 +921,7 @@ static void dmxInputScanForExtensions(DMXInputInfo *dmxInput, int doXI)
                     }
                 }
                 break;
+#if 0
             case IsXExtensionDevice:
             case IsXExtensionKeyboard:
             case IsXExtensionPointer:
@@ -942,6 +943,7 @@ static void dmxInputScanForExtensions(DMXInputInfo *dmxInput, int doXI)
                     }
                 }
                 break;
+#endif
             }
         }
         XFreeDeviceList(devices);
commit 5bcd9e8953dfb5f13e90baeebea1f6eac797644b
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Tue Jun 3 22:01:43 2008 +0930

    dmx: learn about the existence of IsXExtensionPointer and IsXExtensionKeyboard

diff --git a/hw/dmx/input/dmxinputinit.c b/hw/dmx/input/dmxinputinit.c
index da1e731..4713c1b 100644
--- a/hw/dmx/input/dmxinputinit.c
+++ b/hw/dmx/input/dmxinputinit.c
@@ -883,9 +883,11 @@ static void dmxInputScanForExtensions(DMXInputInfo *dmxInput, int doXI)
         for (i = 0; i < num; i++) {
             const char *use = "Unknown";
             switch (devices[i].use) {
-            case IsXPointer:         use = "XPointer";         break;
-            case IsXKeyboard:        use = "XKeyboard";        break;
-            case IsXExtensionDevice: use = "XExtensionDevice"; break;
+            case IsXPointer:           use = "XPointer";         break;
+            case IsXKeyboard:          use = "XKeyboard";        break;
+            case IsXExtensionDevice:   use = "XExtensionDevice"; break;
+            case IsXExtensionPointer:  use = "XExtensionPointer"; break;
+            case IsXExtensionKeyboard: use = "XExtensionKeyboard"; break;
             }
             dmxLogInput(dmxInput, "  %2d %-10.10s %-16.16s\n",
                         devices[i].id,
@@ -920,6 +922,8 @@ static void dmxInputScanForExtensions(DMXInputInfo *dmxInput, int doXI)
                 }
                 break;
             case IsXExtensionDevice:
+            case IsXExtensionKeyboard:
+            case IsXExtensionPointer:
                 if (doXI) {
                     if (!dmxInput->numDevs) {
                         dmxLog(dmxWarning,
commit 8da8a0fec4b1b9d9208635dedb2f449dc99e0004
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Tue Jun 3 21:59:33 2008 +0930

    dmx: claim we support XI 2.
    
    We don't really, yet, but at least we get the full device list this way.

diff --git a/hw/dmx/input/dmxinputinit.c b/hw/dmx/input/dmxinputinit.c
index 1adfb41..da1e731 100644
--- a/hw/dmx/input/dmxinputinit.c
+++ b/hw/dmx/input/dmxinputinit.c
@@ -865,7 +865,7 @@ static void dmxInputScanForExtensions(DMXInputInfo *dmxInput, int doXI)
     
     /* Print out information about the XInput Extension. */
     handler = XSetExtensionErrorHandler(dmxInputExtensionErrorHandler);
-    ext     = XGetExtensionVersion(display, INAME);
+    ext     = XQueryInputVersion(display, XI_2_Major, XI_2_Minor);
     XSetExtensionErrorHandler(handler);
     
     if (!ext || ext == (XExtensionVersion *)NoSuchExtension) {
commit 6f1d5147cb394b7c83c4c1447c78890fa2b40a45
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Tue Jun 3 21:36:03 2008 +0930

    dmx: fix a segfault caused by GC devPrivates never being initalised.

diff --git a/hw/dmx/dmxgc.c b/hw/dmx/dmxgc.c
index ce1730c..eb21d3c 100644
--- a/hw/dmx/dmxgc.c
+++ b/hw/dmx/dmxgc.c
@@ -85,6 +85,8 @@ static GCOps dmxGCOps = {
 /** Initialize the GC on \a pScreen */
 Bool dmxInitGC(ScreenPtr pScreen)
 {
+    if (!dixRequestPrivate(dmxGCPrivateKey, sizeof(dmxGCPrivRec)))
+            return FALSE;
     return TRUE;
 }
 
commit d10ba4591a599a317093ffcbdd7cece11ab6de26
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Tue Jun 3 21:28:26 2008 +0930

    dmx: some more build fixes.

diff --git a/hw/dmx/input/dmxinputinit.c b/hw/dmx/input/dmxinputinit.c
index 277e164..1adfb41 100644
--- a/hw/dmx/input/dmxinputinit.c
+++ b/hw/dmx/input/dmxinputinit.c
@@ -476,15 +476,11 @@ static int dmxDeviceOnOff(DeviceIntPtr pDevice, int what)
             break;
         }
         if (info.keyClass) {
-#if 00 /*BP*/
-            InitKeyClassDeviceStruct(pDevice, &info.keySyms, info.modMap);
-#else
             DevicePtr pDev = (DevicePtr) pDevice;
             InitKeyboardDeviceStruct(pDev,
                                      &info.keySyms,
                                      info.modMap,
                                      dmxBell, dmxKbdCtrl);
-#endif
         }
         if (info.buttonClass) {
             InitButtonClassDeviceStruct(pDevice, info.numButtons, info.map);
@@ -492,13 +488,7 @@ static int dmxDeviceOnOff(DeviceIntPtr pDevice, int what)
         if (info.valuatorClass) {
             if (info.numRelAxes && dmxLocal->sendsCore) {
                 InitValuatorClassDeviceStruct(pDevice, info.numRelAxes,
-#if 00 /*BP*/
-                                              miPointerGetMotionEvents,
-                                              miPointerGetMotionBufferSize(),
-#else
-                                              GetMotionHistory,
                                               GetMaximumEventsNum(),
-#endif
                                               Relative);
                 for (i = 0; i < info.numRelAxes; i++)
                     InitValuatorAxisStruct(pDevice, i, info.minval[0],
@@ -506,7 +496,6 @@ static int dmxDeviceOnOff(DeviceIntPtr pDevice, int what)
                                            info.minres[0], info.maxres[0]);
             } else if (info.numRelAxes) {
                 InitValuatorClassDeviceStruct(pDevice, info.numRelAxes,
-                                              dmxPointerGetMotionEvents,
                                               dmxPointerGetMotionBufferSize(),
                                               Relative);
                 for (i = 0; i < info.numRelAxes; i++)
@@ -515,7 +504,6 @@ static int dmxDeviceOnOff(DeviceIntPtr pDevice, int what)
                                            info.minres[0], info.maxres[0]);
             } else if (info.numAbsAxes) {
                 InitValuatorClassDeviceStruct(pDevice, info.numAbsAxes,
-                                              dmxPointerGetMotionEvents,
                                               dmxPointerGetMotionBufferSize(),
                                               Absolute);
                 for (i = 0; i < info.numAbsAxes; i++)
diff --git a/hw/dmx/input/dmxxinput.c b/hw/dmx/input/dmxxinput.c
index 692e647..97f4392 100644
--- a/hw/dmx/input/dmxxinput.c
+++ b/hw/dmx/input/dmxxinput.c
@@ -93,12 +93,9 @@ int ChangePointerDevice(DeviceIntPtr old_dev,
 
                                 /* Switch the motion history buffers */
     if (dmxLocalOld->savedMotionProc) {
-        old_dev->valuator->GetMotionProc   = dmxLocalOld->savedMotionProc;
         old_dev->valuator->numMotionEvents = dmxLocalOld->savedMotionEvents;
     }
-    dmxLocalNew->savedMotionProc       = new_dev->valuator->GetMotionProc;
     dmxLocalNew->savedMotionEvents     = new_dev->valuator->numMotionEvents;
-    new_dev->valuator->GetMotionProc   = GetMotionHistory;
     new_dev->valuator->numMotionEvents = GetMaximumEventsNum();
                                 /* Switch our notion of core pointer */
     dmxLocalOld->isCore         = 0;
commit 8d4d0b47a07a298a20ffae9fefe96c8c7ca9dccc
Author: Paulo Cesar Pereira de Andrade <pcpa at mandriva.com.br>
Date:   Thu Jun 5 09:19:16 2008 +0930

    gl: include assert.h if we're compiling with DEBUG.
    
    Signed-off-by: Peter Hutterer <peter at cs.unisa.edu.au>

diff --git a/glx/glapi.c b/glx/glapi.c
index c4d101a..94a8043 100644
--- a/glx/glapi.c
+++ b/glx/glapi.c
@@ -63,6 +63,9 @@
 
 #include <stdlib.h>
 #include <string.h>
+#ifdef DEBUG
+#include <assert.h>
+#endif
 
 #include "glapi.h"
 #include "glapioffsets.h"
commit 8644aa47177bf20f3aa85181032ce75c08270fc5
Author: Paulo Cesar Pereira de Andrade <pcpa at mandriva.com.br>
Date:   Thu Jun 5 08:55:09 2008 +0930

    mi: minor build fix when compiling with debug enabled.
    
    Signed-off-by: Peter Hutterer <peter at cs.unisa.edu.au>

diff --git a/mi/mieq.c b/mi/mieq.c
index a1f9cc6..91b7a51 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -255,8 +255,8 @@ ChangeDeviceID(DeviceIntPtr dev, xEvent* event)
             // do nothing or drink a beer. your choice.
         } else
             DebugF("[mi] Unknown generic event (%d/%d), cannot change id.\n",
-                    ((xGenericEvent*)ev)->extension,
-                    ((xGenericEvent*)ev)->evtype);
+                    ((xGenericEvent*)event)->extension,
+                    ((xGenericEvent*)event)->evtype);
     } else
         DebugF("[mi] Unknown event type (%d), cannot change id.\n", type);
 }
commit fbf4b5f16ac23359872361c8c95a617fe8c92292
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Wed Jun 4 11:10:46 2008 +0930

    dix: set dst->mapWidth when allocating a new map.

diff --git a/dix/devices.c b/dix/devices.c
index efdc0c9..c83f2fc 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1046,6 +1046,7 @@ SetKeySymsMap(KeySymsPtr dst, KeySymsPtr src)
         if (!map)
             return FALSE;
         dst->map = map;
+        dst->mapWidth = src->mapWidth;
     }
     memmove((char *)&dst->map[rowDif * dst->mapWidth],
 	    (char *)src->map,
commit ff3adf3e564d94fea18e48f966de40a7ded1279e
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Wed Jun 4 11:10:11 2008 +0930

    xkb: reset xkb_cached_map on CloseDownDevices.
    
    Could lead to some invalid pointers in the second server generation.

diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c
index 47ad553..0aaa037 100644
--- a/xkb/xkbInit.c
+++ b/xkb/xkbInit.c
@@ -292,6 +292,9 @@ XkbDeleteRulesDflts()
     XkbVariantDflt = NULL;
     _XkbFree(XkbOptionsDflt);
     XkbOptionsDflt = NULL;
+
+    XkbFreeKeyboard(xkb_cached_map, XkbAllComponentsMask, True);
+    xkb_cached_map = NULL;
 }
 
 /***====================================================================***/
commit 40855d8000b9b9f4e6c6b4317542378ecf516345
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Wed Jun 4 12:19:28 2008 -0700

    XQuartz: Removed async debugging sleep
    (cherry picked from commit 7812a8bdf9fab651ea5c07b852b2999547ec628d)

diff --git a/hw/xquartz/darwinEvents.c b/hw/xquartz/darwinEvents.c
index 1e79cd3..151aaa0 100644
--- a/hw/xquartz/darwinEvents.c
+++ b/hw/xquartz/darwinEvents.c
@@ -101,8 +101,10 @@ static inline void darwinEvents_lock(void) {
          * when darwinEvents == NULL
          *
          * TODO: Cleanup this race more elegantly.
+         *
+         * For some reason, xinitrc doesn't run until after this anyways... =/
+         * sleep(2);
          */
-        sleep(2);
     }
 }
 
diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index 1c32518..d7b6c37 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -160,9 +160,7 @@ static void accept_fd_handoff(int connected_fd) {
     if(launchd_fd == -1)
         fprintf(stderr, "Error receiving $DISPLAY file descriptor, no descriptor received? %d\n", launchd_fd);
         
-    fprintf(stderr, "Received new DISPLAY fd (1): %d\n", launchd_fd);
-    sleep(10);
-    fprintf(stderr, "Received new DISPLAY fd (2): %d\n", launchd_fd);
+    fprintf(stderr, "Received new DISPLAY fd: %d\n", launchd_fd);
     DarwinListenOnOpenFD(launchd_fd);
 }
 
@@ -354,6 +352,9 @@ int main(int argc, char **argv, char **envp) {
             /* Could open the display, start the launcher */
             XCloseDisplay(display);
             
+            /* TODO: Clean up this race better... givint xinitrc time to run. */
+            sleep(2);
+            
             return execute(command_from_prefs("app_to_run", DEFAULT_CLIENT));
         }
     }
commit ee86b751192b690973ee2a1446a406bc721ce8eb
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Wed Jun 4 12:01:19 2008 -0700

    XQuartz: use a condition variable to signal when darwinEvents is ready rather than polling
    (cherry picked from commit ff1c443cadf11d12a7d939e51194f6105153870e)

diff --git a/hw/xquartz/darwinEvents.c b/hw/xquartz/darwinEvents.c
index 0ecb064..1e79cd3 100644
--- a/hw/xquartz/darwinEvents.c
+++ b/hw/xquartz/darwinEvents.c
@@ -80,21 +80,36 @@ void QuartzModeEQInit(void);
 static int old_flags = 0;  // last known modifier state
 
 static xEvent *darwinEvents = NULL;
-static pthread_mutex_t darwinEvents_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static pthread_mutex_t mieq_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t mieq_ready_cond = PTHREAD_COND_INITIALIZER;
 
 static inline void darwinEvents_lock(void) {
     int err;
-    if((err = pthread_mutex_lock(&darwinEvents_mutex))) {
-        ErrorF("%s:%s:%d: Failed to lock darwinEvents_mutex: %d\n",
+    if((err = pthread_mutex_lock(&mieq_lock))) {
+        ErrorF("%s:%s:%d: Failed to lock mieq_lock: %d\n",
                __FILE__, __FUNCTION__, __LINE__, err);
         spewCallStack();
     }
+    if(darwinEvents == NULL) {
+        pthread_cond_wait(&mieq_ready_cond, &mieq_lock);
+
+        /* We want to give xinit time to finish running xinitrc before we accept
+         * the launchd socket connection.
+         *
+         * Yes, we lock then immediately unlock because the lock does a cond_wait
+         * when darwinEvents == NULL
+         *
+         * TODO: Cleanup this race more elegantly.
+         */
+        sleep(2);
+    }
 }
 
 static inline void darwinEvents_unlock(void) {
     int err;
-    if((err = pthread_mutex_unlock(&darwinEvents_mutex))) {
-        ErrorF("%s:%s:%d: Failed to unlock darwinEvents_mutex: %d\n",
+    if((err = pthread_mutex_unlock(&mieq_lock))) {
+        ErrorF("%s:%s:%d: Failed to unlock mieq_lock: %d\n",
                __FILE__, __FUNCTION__, __LINE__, err);
         spewCallStack();
     }
@@ -333,11 +348,17 @@ Bool DarwinEQInit(void) {
     
     QuartzModeEQInit();
 
-    if (!darwinEvents)
+    if (!darwinEvents) {
         darwinEvents = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
-    if (!darwinEvents)
-        FatalError("Couldn't allocate event buffer\n");
-    
+        
+        if (!darwinEvents)
+            FatalError("Couldn't allocate event buffer\n");
+        
+        darwinEvents_lock();
+        pthread_cond_broadcast(&mieq_ready_cond);
+        darwinEvents_unlock();
+    }
+
     return TRUE;
 }
 
@@ -453,7 +474,6 @@ void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int poin
                                       POINTER_ABSOLUTE, 0, dev==darwinTablet?5:2, valuators);
         for(i=0; i<num_events; i++) mieqEnqueue (dev, &darwinEvents[i]);
         DarwinPokeEQ();
-
     } darwinEvents_unlock();
 }
 
@@ -578,13 +598,8 @@ void DarwinSendDDXEvent(int type, int argc, ...) {
         va_end (args);
     }
 
-    /* If we're called from something other than the X server thread, we need
-     * to wait for the X server to setup darwinEvents.
-     */
-    while(darwinEvents == NULL) {
-        usleep(250000);
-    }
-
-    mieqEnqueue(darwinPointer, &xe);
-    DarwinPokeEQ();
+    darwinEvents_lock(); {
+        mieqEnqueue(darwinPointer, &xe);
+        DarwinPokeEQ();
+    } darwinEvents_unlock();
 }
diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index 9a50668..1c32518 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -412,11 +412,6 @@ int main(int argc, char **argv, char **envp) {
 }
 #else
 void *add_launchd_display_thread(void *data) {
-    /* TODO: Really fix this race... we want xinitrc to finish before connections
-     *       are accepted on the launchd socket.
-     */
-    sleep(2);
-    
     /* Start listening on the launchd fd */
     int launchd_fd = launchd_display_fd();
     if(launchd_fd != -1) {
commit 38da26cd36957a45b2a47ef124282f7d863a9fd3
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Wed Jun 4 11:35:24 2008 -0700

    XQuartz: Don't forget to destroy the mutex and cond after we're done with them
    (cherry picked from commit c3558bb8cd889e5b957190e9f5d23afad1e17b72)

diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index 67c338f..9a50668 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -203,15 +203,15 @@ static void socket_handoff_thread(void *arg) {
         fprintf(stderr, "Failed to create socket: %s - %s\n", filename, strerror(errno));
 
         data->retval = EXIT_FAILURE;
-        pthread_mutex_unlock(&data->lock);
         pthread_cond_broadcast(&data->cond);
+        pthread_mutex_unlock(&data->lock);
         return;
     }
 
     /* Let the dispatch thread now tell the caller that we're ready */
     data->retval = EXIT_SUCCESS;
-    pthread_mutex_unlock(&data->lock);
     pthread_cond_broadcast(&data->cond);
+    pthread_mutex_unlock(&data->lock);
     
     if(connect(handoff_fd, servaddr, servaddr_len) < 0) {
         fprintf(stderr, "Failed to connect to socket: %s - %s\n", filename, strerror(errno));
@@ -227,6 +227,7 @@ static void socket_handoff_thread(void *arg) {
 kern_return_t do_prep_fd_handoff(mach_port_t port, string_t socket_filename) {
     handoff_data_t handoff_data;
 
+    /* Initialize our data */
     pthread_mutex_init(&handoff_data.lock, NULL);
     pthread_cond_init(&handoff_data.cond, NULL);
     strlcpy(handoff_data.socket_filename, socket_filename, STRING_T_SIZE); 
@@ -234,9 +235,15 @@ kern_return_t do_prep_fd_handoff(mach_port_t port, string_t socket_filename) {
     pthread_mutex_lock(&handoff_data.lock);
     
     create_thread(socket_handoff_thread, &handoff_data);
-    
+
+    /* Wait for our return value */
     pthread_cond_wait(&handoff_data.cond, &handoff_data.lock);
+    pthread_mutex_unlock(&handoff_data.lock);
 
+    /* Cleanup */
+    pthread_cond_destroy(&handoff_data.cond);
+    pthread_mutex_destroy(&handoff_data.lock);
+    
     return handoff_data.retval;
 }
 
commit ea40fcf4344c6e918d3be34354528940b05a70f3
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Wed Jun 4 11:18:52 2008 -0700

    XQuartz: Fork for trigger
    (cherry picked from commit dd0f8a0f59593d7831fe09a2a086fcd57c84910e)

diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index 943ec54..67c338f 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -79,12 +79,6 @@ static pthread_t create_thread(void *func, void *arg) {
 }
 
 #ifdef NEW_LAUNCH_METHOD
-struct arg {
-    int argc;
-    char **argv;
-    char **envp;
-};
-
 /*** Mach-O IPC Stuffs ***/
 
 union MaxMsgSize {
@@ -368,12 +362,6 @@ int main(int argc, char **argv, char **envp) {
 }
 
 #ifdef NEW_LAUNCH_METHOD
-static void startup_trigger_thread(void *arg) {
-    struct arg args = *((struct arg *)arg);
-    free(arg);
-    startup_trigger(args.argc, args.argv, args.envp);
-}
-
 /*** Main ***/
 int main(int argc, char **argv, char **envp) {
     Bool listenOnly = FALSE;
@@ -400,21 +388,13 @@ int main(int argc, char **argv, char **envp) {
      * thread handle it.
      */
     if(!listenOnly) {
-        struct arg *args = (struct arg*)malloc(sizeof(struct arg));
-        if(!args) {
-            fprintf(stderr, "Memory allocation error.\n");
-            return EXIT_FAILURE;
+        if(fork() == 0) {
+            return startup_trigger(argc, argv, envp);
         }
-        
-        args->argc = argc;
-        args->argv = argv;
-        args->envp = envp;
-        
-        create_thread(startup_trigger_thread, args);
     }
     
     /* Main event loop */
-    fprintf(stderr, "Statrup coming...\n");
+    fprintf(stderr, "Waiting for startup parameters via Mach IPC.\n");
     kr = mach_msg_server(mach_startup_server, mxmsgsz, mp, 0);
     if (kr != KERN_SUCCESS) {
         fprintf(stderr, "org.x.X11(mp): %s\n", mach_error_string(kr));
commit 2393dae6ffff7db8281a7977039450e8754cc19f
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Tue Jun 3 00:06:26 2008 -0700

    XQuartz: Switched over to new startup path for testing.  Cleaned it up a bit.  Server still crashes when using the icon to launch =/
    (cherry picked from commit 7f840e9dc180421eaa9b0ea3ab993fdd5b2466e5)

diff --git a/hw/xquartz/Makefile.am b/hw/xquartz/Makefile.am
index cc39c9d..69778c1 100644
--- a/hw/xquartz/Makefile.am
+++ b/hw/xquartz/Makefile.am
@@ -7,8 +7,8 @@ AM_CPPFLAGS = \
 	-DINXQUARTZ \
 	-DUSE_NEW_CLUT \
 	-DXFree86Server \
-	-I$(top_srcdir)/miext/rootless
-#	-DNEW_LAUNCH_METHOD
+	-I$(top_srcdir)/miext/rootless \
+	-DNEW_LAUNCH_METHOD
 
 SUBDIRS = bundle . GL xpr mach-startup doc
 
diff --git a/hw/xquartz/mach-startup/Makefile.am b/hw/xquartz/mach-startup/Makefile.am
index 11f6ba6..59018a9 100644
--- a/hw/xquartz/mach-startup/Makefile.am
+++ b/hw/xquartz/mach-startup/Makefile.am
@@ -1,18 +1,18 @@
 AM_CPPFLAGS = \
 	-DBUILD_DATE=\"$(BUILD_DATE)\" \
-	-DXSERVER_VERSION=\"$(VERSION)\"
-#	-DNEW_LAUNCH_METHOD -DNEW_LAUNCH_METHOD_2
+	-DXSERVER_VERSION=\"$(VERSION)\" \
+	-DNEW_LAUNCH_METHOD -DNEW_LAUNCH_METHOD_2
 
 x11appdir = $(APPLE_APPLICATIONS_DIR)/X11.app/Contents/MacOS
 x11app_PROGRAMS = X11
 
 dist_X11_SOURCES = \
-	bundle-main.c \
-	launchd_fd.c
+	bundle-main.c
+#	launchd_fd.c
 
-#nodist_X11_SOURCES = \
-#	mach_startupServer.c \
-#	mach_startupUser.c
+nodist_X11_SOURCES = \
+	mach_startupServer.c \
+	mach_startupUser.c
 
 X11_LDADD = \
 	$(top_builddir)/hw/xquartz/libXquartz.la \
@@ -34,11 +34,11 @@ X11_LDFLAGS =  \
 bin_PROGRAMS = Xquartz
 
 dist_Xquartz_SOURCES = \
-	stub.c
-#	launchd_fd.c
+	stub.c \
+	launchd_fd.c
 
-#nodist_Xquartz_SOURCES = \
-#	mach_startupUser.c
+nodist_Xquartz_SOURCES = \
+	mach_startupUser.c
 
 Xquartz_LDFLAGS =  \
 	-Wl,-framework,CoreServices
diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index 0068e02..943ec54 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -48,9 +48,9 @@
 #include "mach_startupServer.h"
 
 #include "launchd_fd.h"
+/* From darwinEvents.c ... but don't want to pull in all the server cruft */
 void DarwinListenOnOpenFD(int fd);
 
-
 #define DEFAULT_CLIENT "/usr/X11/bin/xterm"
 #define DEFAULT_STARTX "/usr/X11/bin/startx"
 #define DEFAULT_SHELL  "/bin/sh"
@@ -124,9 +124,6 @@ static mach_port_t checkin_or_register(char *bname) {
 }
 
 /*** $DISPLAY handoff ***/
-/* From darwinEvents.c ... but don't want to pull in all the server cruft */
-void DarwinListenOnOpenFD(int fd);
-
 static void accept_fd_handoff(int connected_fd) {
     int launchd_fd;
     
@@ -169,7 +166,9 @@ static void accept_fd_handoff(int connected_fd) {
     if(launchd_fd == -1)
         fprintf(stderr, "Error receiving $DISPLAY file descriptor, no descriptor received? %d\n", launchd_fd);
         
-    fprintf(stderr, "Received new DISPLAY fd: %d\n", launchd_fd);
+    fprintf(stderr, "Received new DISPLAY fd (1): %d\n", launchd_fd);
+    sleep(10);
+    fprintf(stderr, "Received new DISPLAY fd (2): %d\n", launchd_fd);
     DarwinListenOnOpenFD(launchd_fd);
 }
 
@@ -189,7 +188,7 @@ static void socket_handoff_thread(void *arg) {
     struct sockaddr_un servaddr_un;
     struct sockaddr *servaddr;
     socklen_t servaddr_len;
-    int handoff_fd, connected_fd;
+    int handoff_fd;
 
     /* We need to save it since data dies after we pthread_cond_broadcast */
     strlcpy(filename, data->socket_filename, STRING_T_SIZE); 
@@ -208,40 +207,27 @@ static void socket_handoff_thread(void *arg) {
     handoff_fd = socket(AF_UNIX, SOCK_STREAM, 0);
     if(handoff_fd == 0) {
         fprintf(stderr, "Failed to create socket: %s - %s\n", filename, strerror(errno));
+
         data->retval = EXIT_FAILURE;
-        return;
-    }
-    
-    if(bind(handoff_fd, servaddr, servaddr_len) != 0) {
-        fprintf(stderr, "Failed to bind socket: %s - %s\n", filename, strerror(errno));
-        data->retval = EXIT_FAILURE;
-        return;
-    }
-    
-    if(listen(handoff_fd, 10) != 0) {
-        fprintf(stderr, "Failed to listen to socket: %s - %s\n", filename, strerror(errno));
-        data->retval = EXIT_FAILURE;
+        pthread_mutex_unlock(&data->lock);
+        pthread_cond_broadcast(&data->cond);
         return;
     }
 
-    /* Let the dispatch thread now tell the caller that we're listening */
+    /* Let the dispatch thread now tell the caller that we're ready */
     data->retval = EXIT_SUCCESS;
     pthread_mutex_unlock(&data->lock);
     pthread_cond_broadcast(&data->cond);
     
-    connected_fd = accept(handoff_fd, NULL, NULL);
-    
-    if(connected_fd == -1) {
-        fprintf(stderr, "Failed to accept incoming connection on socket: %s - %s\n", filename, strerror(errno));
+    if(connect(handoff_fd, servaddr, servaddr_len) < 0) {
+        fprintf(stderr, "Failed to connect to socket: %s - %s\n", filename, strerror(errno));
         return;
     }
 
     /* Now actually get the passed file descriptor from this connection */
-    accept_fd_handoff(connected_fd);
+    accept_fd_handoff(handoff_fd);
 
-    close(connected_fd);
     close(handoff_fd);
-    unlink(filename);
 }
 
 kern_return_t do_prep_fd_handoff(mach_port_t port, string_t socket_filename) {
@@ -273,9 +259,11 @@ kern_return_t do_start_x11_server(mach_port_t port, string_array_t argv,
     if(!_argv || !_envp) {
         return KERN_FAILURE;
     }
-    
+
+    fprintf(stderr, "X11.app: do_start_x11_server(): argc=%d\n", argvCnt);
     for(i=0; i < argvCnt; i++) {
         _argv[i] = argv[i];
+        fprintf(stderr, "\targv[%u] = %s\n", (unsigned)i, argv[i]);
     }
     _argv[argvCnt] = NULL;
     
diff --git a/hw/xquartz/mach-startup/stub.c b/hw/xquartz/mach-startup/stub.c
index 854b71c..d48ae74 100644
--- a/hw/xquartz/mach-startup/stub.c
+++ b/hw/xquartz/mach-startup/stub.c
@@ -113,9 +113,53 @@ static void set_x11_path() {
     }
 }
 
+#ifdef NEW_LAUNCH_METHOD
+static int create_socket(char *filename_out) {
+    struct sockaddr_un servaddr_un;
+    struct sockaddr *servaddr;
+    socklen_t servaddr_len;
+    int ret_fd;
+    size_t try, try_max;
+
+    for(try=0, try_max=5; try < try_max; try++) {
+        tmpnam(filename_out);
+
+        /* Setup servaddr_un */
+        memset (&servaddr_un, 0, sizeof (struct sockaddr_un));
+        servaddr_un.sun_family = AF_UNIX;
+        strlcpy(servaddr_un.sun_path, filename_out, sizeof(servaddr_un.sun_path));
+        
+        servaddr = (struct sockaddr *) &servaddr_un;
+        servaddr_len = sizeof(struct sockaddr_un) - sizeof(servaddr_un.sun_path) + strlen(filename_out);
+        
+        ret_fd = socket(PF_UNIX, SOCK_STREAM, 0);
+        if(ret_fd == 0) {
+            fprintf(stderr, "Failed to create socket (try %d / %d): %s - %s\n", (int)try+1, (int)try_max, filename_out, strerror(errno));
+            continue;
+        }
+        
+        if(bind(ret_fd, servaddr, servaddr_len) != 0) {
+            fprintf(stderr, "Failed to bind socket: %s - %s\n", filename_out, strerror(errno));
+            close(ret_fd);
+            return 0;
+        }
+
+        if(listen(ret_fd, 10) != 0) {
+            fprintf(stderr, "Failed to listen to socket: %s - %s\n", filename_out, strerror(errno));
+            close(ret_fd);
+            return 0;
+        }
+        
+        return ret_fd;
+    }
+    
+    return 0;
+}
+
 static void send_fd_handoff(int handoff_fd, int launchd_fd) {
     char databuf[] = "display";
     struct iovec iov[1];
+    int connected_fd;
     
     iov[0].iov_base = databuf;
     iov[0].iov_len  = sizeof(databuf);
@@ -143,44 +187,21 @@ static void send_fd_handoff(int handoff_fd, int launchd_fd) {
     
     *((int*)CMSG_DATA(cmsg)) = launchd_fd;
     
-    if (sendmsg(handoff_fd, &msg, 0) < 0) {
-        fprintf(stderr, "Error sending $DISPLAY file descriptor: %s\n", strerror(errno));
+    connected_fd = accept(handoff_fd, NULL, NULL);
+    if(connected_fd == -1) {
+        fprintf(stderr, "Failed to accept incoming connection on socket: %s\n", strerror(errno));
         return;
     }
-
-    fprintf(stderr, "send %d %d %d %s\n", handoff_fd, launchd_fd, errno, strerror(errno));
-}
-
-static void handoff_fd(const char *filename, int launchd_fd) {
-    struct sockaddr_un servaddr_un;
-    struct sockaddr *servaddr;
-    socklen_t servaddr_len;
-    int handoff_fd;
-
-    /* Setup servaddr_un */
-    memset (&servaddr_un, 0, sizeof (struct sockaddr_un));
-    servaddr_un.sun_family = AF_UNIX;
-    strlcpy(servaddr_un.sun_path, filename, sizeof(servaddr_un.sun_path));
-
-    servaddr = (struct sockaddr *) &servaddr_un;
-    servaddr_len = sizeof(struct sockaddr_un) - sizeof(servaddr_un.sun_path) + strlen(filename);
-
-    handoff_fd = socket(PF_UNIX, SOCK_STREAM, 0);
-    if(handoff_fd == 0) {
-        fprintf(stderr, "Failed to create socket: %s - %s\n", filename, strerror(errno));
-        return;
-    }
-
-    if(connect(handoff_fd, servaddr, servaddr_len) < 0) {
-        fprintf(stderr, "Failed to establish connection on socket: %s - %s\n", filename, strerror(errno));
+    
+    if(sendmsg(connected_fd, &msg, 0) < 0) {
+        fprintf(stderr, "Error sending $DISPLAY file descriptor: %s\n", strerror(errno));
         return;
     }
 
-    fprintf(stderr, "Socket: %s\n", filename);
-
-    send_fd_handoff(handoff_fd, launchd_fd);
-    close(handoff_fd);
+    close(connected_fd);
+    fprintf(stderr, "send %d %d %d %s\n", handoff_fd, launchd_fd, errno, strerror(errno));
 }
+#endif
 
 int main(int argc, char **argv, char **envp) {
 #ifdef NEW_LAUNCH_METHOD
@@ -191,7 +212,7 @@ int main(int argc, char **argv, char **envp) {
     string_array_t newargv;
     size_t i;
     int launchd_fd;
-    string_t handoff_socket;
+    string_t handoff_socket_filename;
 #endif
 
     if(argc == 2 && !strcmp(argv[1], "-version")) {
@@ -241,9 +262,15 @@ int main(int argc, char **argv, char **envp) {
     
     /* Handoff the $DISPLAY FD */
     if(launchd_fd != -1) {
-        tmpnam(handoff_socket);
-        if(prep_fd_handoff(mp, handoff_socket) == KERN_SUCCESS) {
-            handoff_fd(handoff_socket, launchd_fd);
+        int handoff_fd = create_socket(handoff_socket_filename);
+        
+        if((handoff_fd != 0) &&
+           (prep_fd_handoff(mp, handoff_socket_filename) == KERN_SUCCESS)) {
+            send_fd_handoff(handoff_fd, launchd_fd);
+            
+            // Cleanup
+            close(handoff_fd);
+            unlink(handoff_socket_filename);
         } else {
             fprintf(stderr, "Unable to hand of $DISPLAY file descriptor\n");
         }
commit 45b661c67aca1a728f1793dd94d701488f1f196c
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Wed Jun 4 13:39:39 2008 +0930

    dix: Fix build with --disable-xinerama #16204
    
    X.Org Bug 16204 <http://bugs.freedesktop.org/show_bug.cgi?id=16204>

diff --git a/dix/events.c b/dix/events.c
index cec12f0..79d9373 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -782,8 +782,8 @@ XineramaChangeToCursor(DeviceIntPtr pDev, CursorPtr cursor)
 }
 
 #else
-#define SyntheticMotion(x, y) \
-     PostSyntheticMotion(x, y, \
+#define SyntheticMotion(dev, x, y) \
+     PostSyntheticMotion(dev, x, y, \
                          0, \
                          syncEvents.playingEvents ? \
                            syncEvents.time.milliseconds : \
commit 26e7e69ab893d1f2b35213250ada40ec90944f62
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Mon Jun 2 11:04:41 2008 +0930

    kdrive: don't post motion event if there was no motion. #16179
    
    Based on the patch by Tomas Janousek.
    
    X.Org Bug 16179 <http://bugs.freedesktop.org/show_bug.cgi?id=16179>

diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 5c686b6..3f81b65 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -2074,7 +2074,7 @@ KdEnqueuePointerEvent(KdPointerInfo *pi, unsigned long flags, int rx, int ry,
     int           (*matrix)[3] = kdPointerMatrix.matrix;
     unsigned long button;
     int           n;
-    int           dixflags;
+    int           dixflags = 0;
 
     if (!pi)
 	return;
@@ -2105,11 +2105,15 @@ KdEnqueuePointerEvent(KdPointerInfo *pi, unsigned long flags, int rx, int ry,
     z = rz;
 
     if (flags & KD_MOUSE_DELTA)
-        dixflags = POINTER_RELATIVE & POINTER_ACCELERATE;
-    else
-        dixflags = POINTER_ABSOLUTE;
-
-    _KdEnqueuePointerEvent(pi, MotionNotify, x, y, z, 0, dixflags, FALSE);
+    {
+        if (x || y || z)
+            dixflags = POINTER_RELATIVE & POINTER_ACCELERATE;
+    } else if (x != pi->dixdev->last.valuators[0] ||
+                y != pi->dixdev->last.valuators[1])
+            dixflags = POINTER_ABSOLUTE;
+
+    if (dixflags)
+        _KdEnqueuePointerEvent(pi, MotionNotify, x, y, z, 0, dixflags, FALSE);
 
     buttons = flags;
 
commit ac1db454497ff1839aa7f7ee0649ede112824ed9
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Mon Jun 2 10:40:10 2008 +0930

    xfree86: suspend signals while removing a device (corrected version).
    
    Block/Release is now symmetrical.

diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index efebf19..c6a4ef6 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -475,28 +475,31 @@ DeleteInputDeviceRequest(DeviceIntPtr pDev)
         drv = pInfo->drv;
         idev = pInfo->conf_idev;
     }
-    RemoveDevice(pDev);
 
-    if (pDev->isMaster)
-        return;
+    OsBlockSignals();
+    RemoveDevice(pDev);
 
-    if(drv->UnInit)
-        drv->UnInit(drv, pInfo, 0);
-    else
-        xf86DeleteInput(pInfo, 0);
+    if (!pDev->isMaster)
+    {
+        if(drv->UnInit)
+            drv->UnInit(drv, pInfo, 0);
+        else
+            xf86DeleteInput(pInfo, 0);
 
-    /* devices added through HAL aren't in the config layout */
-    it = xf86ConfigLayout.inputs;
-    while(*it && *it != idev)
-        it++;
+        /* devices added through HAL aren't in the config layout */
+        it = xf86ConfigLayout.inputs;
+        while(*it && *it != idev)
+            it++;
 
-    if (!(*it)) /* end of list, not in the layout */
-    {
-        xfree(idev->driver);
-        xfree(idev->identifier);
-        xf86optionListFree(idev->commonOptions);
-        xfree(idev);
+        if (!(*it)) /* end of list, not in the layout */
+        {
+            xfree(idev->driver);
+            xfree(idev->identifier);
+            xf86optionListFree(idev->commonOptions);
+            xfree(idev);
+        }
     }
+    OsReleaseSignals();
 }
 
 /* 
commit 95ecaa411aefbcd8e2e00814132cb07b4be4e5bf
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Mon Jun 2 10:38:45 2008 +0930

    Revert "xfree86: suspend signals while removing a device."
    
    Left the signals blocked hanging after removing a master device.
    
    This reverts commit 74372fd0049676787904f1f9f80f836b97f5f60e.

diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 2ae4630..efebf19 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -475,7 +475,6 @@ DeleteInputDeviceRequest(DeviceIntPtr pDev)
         drv = pInfo->drv;
         idev = pInfo->conf_idev;
     }
-    OsBlockSignals();
     RemoveDevice(pDev);
 
     if (pDev->isMaster)
@@ -485,7 +484,6 @@ DeleteInputDeviceRequest(DeviceIntPtr pDev)
         drv->UnInit(drv, pInfo, 0);
     else
         xf86DeleteInput(pInfo, 0);
-    OsReleaseSignals();
 
     /* devices added through HAL aren't in the config layout */
     it = xf86ConfigLayout.inputs;
commit 5ba07cb54803b8c63e25e8ca1f1787860f684612
Author: Tiago Vignatti <vignatti at c3sl.ufpr.br>
Date:   Sun Jun 1 18:31:52 2008 -0300

    kdrive: changes ephyr API according mpx merge.
    
    This fix host-cursor in Xephyr server.
    
    Signed-off-by: Tiago Vignatti <vignatti at c3sl.ufpr.br>
    Signed-off-by: Peter Hutterer <peter at cs.unisa.edu.au>

diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c
index d0fa998..e5b16c9 100644
--- a/hw/kdrive/ephyr/ephyr.c
+++ b/hw/kdrive/ephyr/ephyr.c
@@ -837,7 +837,7 @@ ephyrCrossScreen (ScreenPtr pScreen, Bool entering)
 int ephyrCurScreen; /*current event screen*/
 
 static void
-ephyrWarpCursor (ScreenPtr pScreen, int x, int y)
+ephyrWarpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
 {
     ephyrBlockSigio ();
     ephyrCurScreen = pScreen->myNum;
@@ -849,7 +849,9 @@ miPointerScreenFuncRec ephyrPointerScreenFuncs =
 {
   ephyrCursorOffScreen,
   ephyrCrossScreen,
-  ephyrWarpCursor
+  ephyrWarpCursor,
+  NULL,
+  NULL
 };
 
 #ifdef XF86DRI
@@ -911,7 +913,7 @@ ephyrPoll(void)
                   if (ev.data.mouse_motion.screen >= 0)
                     {
                       ephyrWarpCursor
-                            (screenInfo.screens[ev.data.mouse_motion.screen],
+                            (inputInfo.pointer, screenInfo.screens[ev.data.mouse_motion.screen],
                              ev.data.mouse_motion.x,
                              ev.data.mouse_motion.y );
                     }
diff --git a/hw/kdrive/ephyr/ephyrinit.c b/hw/kdrive/ephyr/ephyrinit.c
index e00791c..1ec98fc 100644
--- a/hw/kdrive/ephyr/ephyrinit.c
+++ b/hw/kdrive/ephyr/ephyrinit.c
@@ -290,12 +290,18 @@ ephyrMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
   ;
 }
 
+static Bool
+ephyrDeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
+{
+  return TRUE;
+}
+
 miPointerSpriteFuncRec EphyrPointerSpriteFuncs = {
 	ephyrRealizeCursor,
 	ephyrUnrealizeCursor,
 	ephyrSetCursor,
 	ephyrMoveCursor,
-        NULL,
+    ephyrDeviceCursorInitialize,
         NULL
 };
 
commit 5a3d06b8f42473cea3741dc722a775deaa2b73f6
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Sun Jun 1 15:20:42 2008 +0930

    xkb: delete default rules when devices are closed.
    
    We only have one set of default rules options in xkb. When the second keyboard
    is brought up with Xkb options specified, these new options overwrite the old.
    In future server generations, the rules used for the VCK are a mixture of the
    default ones and ones previously specified for other keyboards. Simply
    resetting the xkb default rules to NULL avoids this issue.
    
    Reproducable by setting XkbLayout "de" and XkbVariant "nodeadkeys". In the
    second server generation, the VCK has "us(nodeadkeys)". This again produces a
    SIGABRT when the first key is hit.
    
    I could not figure out why the SIGABRT happens. This patch is avoiding the
    issue rather than fixing it.

diff --git a/dix/devices.c b/dix/devices.c
index 08520eb..efdc0c9 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -847,6 +847,9 @@ CloseDownDevices(void)
     inputInfo.off_devices = NULL;
     inputInfo.keyboard = NULL;
     inputInfo.pointer = NULL;
+#ifdef XKB
+    XkbDeleteRulesDflts();
+#endif
 }
 
 /**
diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index 7db9eef..e2fff4e 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -899,6 +899,10 @@ extern	void	XkbSetRulesDflts(
 	char *			/* options */
 );
 
+extern	void	XkbDeleteRulesDflts(
+	void
+);
+
 extern	void	XkbInitDevice(
 	DeviceIntPtr 	/* pXDev */
 );
diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c
index 0d5d15e..47ad553 100644
--- a/xkb/xkbInit.c
+++ b/xkb/xkbInit.c
@@ -279,6 +279,21 @@ XkbSetRulesDflts(char *rulesFile,char *model,char *layout,
     return;
 }
 
+void
+XkbDeleteRulesDflts()
+{
+    _XkbFree(XkbRulesFile);
+    XkbRulesFile = NULL;
+    _XkbFree(XkbModelDflt);
+    XkbModelDflt = NULL;
+    _XkbFree(XkbLayoutDflt);
+    XkbLayoutDflt = NULL;
+    _XkbFree(XkbVariantDflt);
+    XkbVariantDflt = NULL;
+    _XkbFree(XkbOptionsDflt);
+    XkbOptionsDflt = NULL;
+}
+
 /***====================================================================***/
 
 #include "xkbDflts.h"
commit 5ebe76f13fb6e96cebe5a386024a73eceeb828ff
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Sat May 31 22:13:03 2008 +0930

    config: init dev to NULL to shut up a valgrind warning.

diff --git a/config/hal.c b/config/hal.c
index 1d62a1d..f4eb438 100644
--- a/config/hal.c
+++ b/config/hal.c
@@ -173,7 +173,7 @@ device_added(LibHalContext *hal_ctx, const char *udi)
 {
     char *path = NULL, *driver = NULL, *name = NULL, *config_info = NULL;
     InputOption *options = NULL, *tmpo = NULL;
-    DeviceIntPtr dev;
+    DeviceIntPtr dev = NULL;
     DBusError error;
     struct xkb_options xkb_opts = {0};
 
commit a7ae9cbd78193fdafcafd5d7af1f6fabbb434628
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Sat May 31 20:44:58 2008 +0930

    dix: don't read valuators past numAxes.

diff --git a/dix/getevents.c b/dix/getevents.c
index 37bd203..fc07496 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -428,6 +428,8 @@ updateMotionHistory(DeviceIntPtr pDev, CARD32 ms, int first_valuator,
 
         for (i = first_valuator; i < first_valuator + num_valuators; i++)
         {
+            if (i >= v->numAxes)
+                break;
             memcpy(buff, &v->axes[i].min_value, sizeof(INT32));
             buff += sizeof(INT32);
             memcpy(buff, &v->axes[i].max_value, sizeof(INT32));
commit f79ad5674ed41c3626e8055cd2bac0135de928c6
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Sat May 31 18:46:35 2008 +0930

    kdrive: fix up callers to KdQueueEvent, need to pass xEvent, not EventListPtr

diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 005465f..5c686b6 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -1981,7 +1981,7 @@ KdReleaseAllKeys (void)
                 GetEventList(&kdEvents);
                 nEvents = GetKeyboardEvents(kdEvents, ki->dixdev, KeyRelease, key);
                 for (i = 0; i < nEvents; i++)
-                    KdQueueEvent (ki->dixdev, kdEvents + i);
+                    KdQueueEvent (ki->dixdev, (kdEvents + i)->event);
             }
         }
     }
@@ -2046,7 +2046,7 @@ KdEnqueueKeyboardEvent(KdKeyboardInfo   *ki,
         GetEventList(&kdEvents);
         nEvents = GetKeyboardEvents(kdEvents, ki->dixdev, type, key_code);
         for (i = 0; i < nEvents; i++)
-            KdQueueEvent(ki->dixdev, kdEvents);
+            KdQueueEvent(ki->dixdev, (kdEvents + i)->event);
     }
     else {
         ErrorF("driver %s wanted to post scancode %d outside of [%d, %d]!\n",
@@ -2148,7 +2148,7 @@ _KdEnqueuePointerEvent (KdPointerInfo *pi, int type, int x, int y, int z,
     nEvents = GetPointerEvents(kdEvents, pi->dixdev, type, b, absrel,
                                0, 3, valuators);
     for (i = 0; i < nEvents; i++)
-        KdQueueEvent(pi->dixdev, kdEvents + i);
+        KdQueueEvent(pi->dixdev, (kdEvents + i)->event);
 }
 
 void
commit 58d12c99abc4d06cb8b43386d4bcd126f0bedf83
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Sat May 31 18:45:11 2008 +0930

    mi: Remove #ifdef XINPUT, kdrive otherwise won't get events.

diff --git a/mi/miinitext.c b/mi/miinitext.c
index 94becd2..3740daa 100644
--- a/mi/miinitext.c
+++ b/mi/miinitext.c
@@ -475,9 +475,7 @@ InitExtensions(int argc, char *argv[])
 #ifdef MULTIBUFFER
     if (!noMultibufferExtension) MultibufferExtensionInit();
 #endif
-#if defined(XINPUT)
     if (!noXInputExtension) XInputExtensionInit();
-#endif
 #ifdef XTEST
     if (!noTestExtensions) XTestExtensionInit();
 #endif
commit 942086fc965fc9a24be2db4f537f0ff54db51083
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Sat May 31 18:17:49 2008 +0930

    dix: ProcQueryPointer doesn't need special grab handling, PickPointer does it

diff --git a/dix/events.c b/dix/events.c
index 73b7fa0..cec12f0 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -5410,7 +5410,6 @@ ProcQueryPointer(ClientPtr client)
     xQueryPointerReply rep;
     WindowPtr pWin, t;
     DeviceIntPtr mouse = PickPointer(client);
-    DeviceIntPtr dev;
     SpritePtr pSprite;
     int rc;
     REQUEST(xResourceReq);
@@ -5423,18 +5422,6 @@ ProcQueryPointer(ClientPtr client)
     if (rc != Success)
 	return rc;
 
-    for (dev = inputInfo.devices; dev; dev = dev->next)
-    {
-        if (dev->isMaster && IsPointerDevice(dev) &&
-                dev->deviceGrab.grab && dev->deviceGrab.grab->coreGrab &&
-                SameClient(dev->deviceGrab.grab, client))
-        {
-            /* special case, we have a grab on the device so we need to return
-             * this one */
-            mouse = dev;
-        }
-    }
-
     pSprite = mouse->spriteInfo->sprite;
     if (mouse->valuator->motionHintWindow)
 	MaybeStopHint(mouse, client);
diff --git a/hw/kdrive/ephyr/ephyrinit.c b/hw/kdrive/ephyr/ephyrinit.c
index d415fe7..e00791c 100644
--- a/hw/kdrive/ephyr/ephyrinit.c
+++ b/hw/kdrive/ephyr/ephyrinit.c
@@ -295,6 +295,8 @@ miPointerSpriteFuncRec EphyrPointerSpriteFuncs = {
 	ephyrUnrealizeCursor,
 	ephyrSetCursor,
 	ephyrMoveCursor,
+        NULL,
+        NULL
 };
 
 
commit 6cecae0e8651b1fa58b3cd0e0a636db46f56f6a6
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Sat May 31 13:12:53 2008 +0930

    dix: Remove superfluous comment.
    
    This code can handle devices with < 2 valuators now.

diff --git a/dix/getevents.c b/dix/getevents.c
index b5657a8..37bd203 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -893,8 +893,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
         return 0;
     /* FIXME: I guess it should, in theory, be possible to post button events
      *        from devices without valuators. */
-    /* This method require at least valuator 0&1 defined on the InputDevice */
-    if (!pDev->valuator || pDev->valuator->numAxes < 2)
+    if (!pDev->valuator)
         return 0;
     if (type == MotionNotify && num_valuators <= 0)
         return 0;
commit 105d28652d1fb80dd8ce8511e2605dccc8812e99
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Fri May 30 15:20:35 2008 +0930

    Xext: use GPE/GKE from XTestFakeInput #16145
    
    This commit fixes two problems:
    1) XTFI used to assemble the event itself, then passed it to the device. It's
    much easier to just pass the variables into GPE/GKE and let the DIX do the
    rest.
    
    2) XTFI would pass the VCP/VCK as default device to event processing. As a
    result, updating LEDs would be updated on the VCK, not on the actual keyboard.
    Instead, we now pass the events through the last-used SD, thus toggling the
    LEDs on the last keyboard that sent through this MD.
    
    Also some cleanup in XTFI to merge validity checks a bit closer together
    rather than having several different sections.
    
    This breaks XTestFakeMotion with Xinerama though.
    
    X.Org Bug 16145 <http://bugs.freedesktop.org/show_bug.cgi?id=16145>

diff --git a/Xext/xtest.c b/Xext/xtest.c
index 9bd26ba..ad70aa8 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -42,6 +42,7 @@
 #include "scrnintstr.h"
 #include "dixevents.h"
 #include "sleepuntil.h"
+#include "mi.h"
 #define _XTEST_SERVER_
 #include <X11/extensions/XTest.h>
 #include <X11/extensions/xteststr.h>
@@ -164,8 +165,13 @@ ProcXTestFakeInput(client)
     WindowPtr root;
     Bool extension = FALSE;
     deviceValuator *dv = NULL;
-    int base;
-    int *values;
+    int valuators[MAX_VALUATORS] = {0};
+    int numValuators = 0;
+    int firstValuator;
+    EventListPtr events;
+    int nevents;
+    int i;
+    int base = 0;
 
     nev = (stuff->length << 2) - sizeof(xReq);
     if ((nev % sizeof(xEvent)) || !nev)
@@ -177,6 +183,18 @@ ProcXTestFakeInput(client)
 
     if (type >= EXTENSION_EVENT_BASE)
     {
+        extension = TRUE;
+
+        /* check device */
+        rc = dixLookupDevice(&dev, stuff->deviceid & 0177, client,
+                DixWriteAccess);
+        if (rc != Success)
+        {
+            client->errorValue = stuff->deviceid & 0177;
+            return rc;
+        }
+
+        /* check type */
         type -= DeviceValuator;
         switch (type) {
             case XI_DeviceKeyPress:
@@ -191,12 +209,31 @@ ProcXTestFakeInput(client)
                 client->errorValue = ev->u.u.type;
                 return BadValue;
         }
+
+        /* check validity */
         if (nev == 1 && type == XI_DeviceMotionNotify)
             return BadLength; /* DevMotion must be followed by DevValuator */
+
         if (type == XI_DeviceMotionNotify)
-            base = ((deviceValuator *)(ev+1))->first_valuator;
-        else
-            base = 0;
+        {
+            firstValuator = ((deviceValuator *)(ev+1))->first_valuator;
+            if (firstValuator > dev->valuator->numAxes)
+            {
+                client->errorValue = ev->u.u.type;
+                return BadValue;
+            }
+        } else
+            firstValuator = 0;
+
+        if (nev == 1 && type == XI_DeviceMotionNotify && !dev->valuator)
+        {
+            client->errorValue = dv->first_valuator;
+            return BadValue;
+        }
+
+
+        /* check validity of valuator events */
+        base = firstValuator;
         for (n = 1; n < nev; n++)
         {
             dv = (deviceValuator *)(ev + n);
@@ -210,17 +247,32 @@ ProcXTestFakeInput(client)
                 client->errorValue = dv->first_valuator;
                 return BadValue;
             }
-            if (!dv->num_valuators || dv->num_valuators > 6)
+            switch(dv->num_valuators)
+            {
+                case 6: valuators[base + 5] = dv->valuator5;
+                case 5: valuators[base + 4] = dv->valuator4;
+                case 4: valuators[base + 3] = dv->valuator3;
+                case 3: valuators[base + 2] = dv->valuator2;
+                case 2: valuators[base + 1] = dv->valuator1;
+                case 1: valuators[base] = dv->valuator0;
+                        break;
+                default:
+                        client->errorValue = dv->num_valuators;
+                        return BadValue;
+            }
+
+            base += dv->num_valuators;
+            numValuators += dv->num_valuators;
+
+            if (firstValuator + numValuators > dev->valuator->numAxes)
             {
                 client->errorValue = dv->num_valuators;
                 return BadValue;
             }
-            base += dv->num_valuators;
         }
         type = type - XI_DeviceKeyPress + KeyPress;
-        extension = TRUE;
-    }
-    else
+
+    } else
     {
         if (nev != 1)
             return BadLength;
@@ -228,34 +280,26 @@ ProcXTestFakeInput(client)
         {
             case KeyPress:
             case KeyRelease:
-            case MotionNotify:
+                dev = PickKeyboard(client);
+                break;
             case ButtonPress:
             case ButtonRelease:
+                dev = PickPointer(client);
+                break;
+            case MotionNotify:
+                dev = PickPointer(client);
+                valuators[0] = ev->u.keyButtonPointer.rootX;
+                valuators[1] = ev->u.keyButtonPointer.rootY;
+                numValuators = 2;
+                firstValuator = 0;
                 break;
             default:
                 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 (dev->u.lastSlave)
+            dev = dev->u.lastSlave;
     }
 
     /* If the event has a time set, wait for it to pass */
@@ -288,37 +332,10 @@ ProcXTestFakeInput(client)
         return Success;
     }
 
-    if (extension)
-    {
-        rc = dixLookupDevice(&dev, stuff->deviceid & 0177, client,
-                DixWriteAccess);
-        if (rc != Success)
-        {
-            client->errorValue = stuff->deviceid & 0177;
-            return rc;
-        }
-        if (nev > 1)
-        {
-            dv = (deviceValuator *)(ev + 1);
-            if (!dev->valuator || dv->first_valuator >= dev->valuator->numAxes)
-            {
-                client->errorValue = dv->first_valuator;
-                return BadValue;
-            }
-            if (dv->first_valuator + dv->num_valuators >
-                    dev->valuator->numAxes)
-            {
-                client->errorValue = dv->num_valuators;
-                return BadValue;
-            }
-        }
-    }
     switch (type)
     {
         case KeyPress:
         case KeyRelease:
-            if (!extension)
-                dev = PickKeyboard(client);
             if (ev->u.u.detail < dev->key->curKeySyms.minKeyCode ||
                     ev->u.u.detail > dev->key->curKeySyms.maxKeyCode)
             {
@@ -327,66 +344,13 @@ ProcXTestFakeInput(client)
             }
             break;
         case MotionNotify:
-            if (extension)
-            {
-                if (ev->u.u.detail != xFalse && ev->u.u.detail != xTrue)
-                {
-                    client->errorValue = ev->u.u.detail;
-                    return BadValue;
-                }
-                /* detail is True for relative coordinates */
-                if (ev->u.u.detail == xTrue && dev->valuator->mode == Absolute)
-                {
-                    values = dev->valuator->axisVal + dv->first_valuator;
-                    for (n = 1; n < nev; n++)
-                    {
-                        dv = (deviceValuator *)(ev + n);
-                        switch (dv->num_valuators)
-                        {
-                            case 6:
-                                dv->valuator5 += values[5];
-                            case 5:
-                                dv->valuator4 += values[4];
-                            case 4:
-                                dv->valuator3 += values[3];
-                            case 3:
-                                dv->valuator2 += values[2];
-                            case 2:
-                                dv->valuator1 += values[1];
-                            case 1:
-                                dv->valuator0 += values[0];
-                        }
-                        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. */
-
-                ev->u.keyButtonPointer.root = None;
-                dv = (deviceValuator*)(ev + 1);
-                if (dv->num_valuators && dv->first_valuator == 0)
-                    ev->u.keyButtonPointer.rootX = dv->valuator0;
-                else
-                    ev->u.keyButtonPointer.rootX = 0;
-
-                /* XXX: AFAIK, XI requires always sending _all_ valuators,
-                 * i.e. you can't just send vals 3 - 7. (whot) */
-                if (dv->num_valuators > 1 && dv->first_valuator == 0)
-                    ev->u.keyButtonPointer.rootY = dv->valuator1;
-                else
-                    ev->u.keyButtonPointer.rootY = 0;
-            }
-
-            if (!dev)
-                dev = PickPointer(client);
-            if (ev->u.keyButtonPointer.root == None)
+            /* broken lib, XI events have root uninitialized */
+            if (extension || ev->u.keyButtonPointer.root == None)
                 root = GetCurrentRootWindow(dev);
             else
             {
-                rc = dixLookupWindow(&root, ev->u.keyButtonPointer.root, client,
-                        DixGetAttrAccess);
+                rc = dixLookupWindow(&root, ev->u.keyButtonPointer.root,
+                                     client, DixGetAttrAccess);
                 if (rc != Success)
                     return rc;
                 if (root->parent)
@@ -395,91 +359,23 @@ ProcXTestFakeInput(client)
                     return BadValue;
                 }
             }
-            if (ev->u.u.detail == xTrue)
-            {
-                int x, y;
-                if (!extension || !dev->valuator->mode == Absolute)
-                {
-                    /* if Absolute, rootX already has the final coords. */
-                    GetSpritePosition(dev, &x, &y);
-                    ev->u.keyButtonPointer.rootX += x;
-                    ev->u.keyButtonPointer.rootY += y;
-                }
-            }
-            else if (ev->u.u.detail != xFalse)
+            if (ev->u.u.detail != xTrue && ev->u.u.detail != xFalse)
             {
                 client->errorValue = ev->u.u.detail;
                 return BadValue;
             }
 
-#ifdef PANORAMIX
-            if (!noPanoramiXExtension) {
-                ScreenPtr pScreen = root->drawable.pScreen;
-                BoxRec    box;
-                int       i;
-                int       x = ev->u.keyButtonPointer.rootX + panoramiXdataPtr[0].x;
-                int       y = ev->u.keyButtonPointer.rootY + panoramiXdataPtr[0].y;
-                if (!POINT_IN_REGION(pScreen, &XineramaScreenRegions[pScreen->myNum],
-                            x, y, &box)) {
-                    FOR_NSCREENS(i) {
-                        if (i == pScreen->myNum) continue;
-                        if (POINT_IN_REGION(pScreen,
-                                    &XineramaScreenRegions[i],
-                                    x, y, &box)) {
-                            root = WindowTable[i];
-                            x   -= panoramiXdataPtr[i].x;
-                            y   -= panoramiXdataPtr[i].y;
-                            ev->u.keyButtonPointer.rootX = x;
-                            ev->u.keyButtonPointer.rootY = y;
-                            break;
-                        }
-                    }
-                }
-            }
-#endif
+            /* FIXME: Xinerama! */
 
-            if (ev->u.keyButtonPointer.rootX < 0)
-                ev->u.keyButtonPointer.rootX = 0;
-            else if (ev->u.keyButtonPointer.rootX >= root->drawable.width)
-                ev->u.keyButtonPointer.rootX = root->drawable.width - 1;
-            if (ev->u.keyButtonPointer.rootY < 0)
-                ev->u.keyButtonPointer.rootY = 0;
-            else if (ev->u.keyButtonPointer.rootY >= root->drawable.height)
-                ev->u.keyButtonPointer.rootY = root->drawable.height - 1;
-
-#ifdef PANORAMIX
-            if ((!noPanoramiXExtension
-                        && root->drawable.pScreen->myNum
-                        != XineramaGetCursorScreen(dev))
-                    || (noPanoramiXExtension && root != GetCurrentRootWindow(dev)))
-
-#else
-                if (root != GetCurrentRootWindow(dev))
-#endif
-                {
-                    NewCurrentScreen(dev, root->drawable.pScreen,
-                            ev->u.keyButtonPointer.rootX,
-                            ev->u.keyButtonPointer.rootY);
-                    return client->noClientException;
-                }
-            /* Only update sprite for MDs and floating SDs */
-            if (dev->isMaster || (!dev->isMaster && !dev->u.master))
-            {
-                (*root->drawable.pScreen->SetCursorPosition)
-                    (dev, root->drawable.pScreen,
-                     ev->u.keyButtonPointer.rootX,
-                     ev->u.keyButtonPointer.rootY, FALSE);
-            }
-            dev->last.valuators[0] = ev->u.keyButtonPointer.rootX;
-            dev->last.valuators[1] = ev->u.keyButtonPointer.rootY;
             break;
         case ButtonPress:
         case ButtonRelease:
             if (!extension)
+            {
                 dev = PickPointer(client);
-
-            ev->u.keyButtonPointer.rootX = dev->last.valuators[0];
-            ev->u.keyButtonPointer.rootY = dev->last.valuators[1];
+                if (dev->u.lastSlave)
+                    dev = dev->u.lastSlave;
+            }
             if (!ev->u.u.detail || ev->u.u.detail > dev->button->numButtons)
             {
                 client->errorValue = ev->u.u.detail;
@@ -489,19 +385,31 @@ 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;
-        CopyGetMasterEvent(dev->u.master, ev, &master_event, nev);
-        (*dev->public.processInputProc)(ev, dev, nev);
-        (*dev->public.processInputProc)(master_event, dev->u.master, nev);
-        xfree(master_event);
-    } else
-        (*dev->public.processInputProc)(ev, dev, nev);
-    if (!extension && type == MotionNotify)
-        xfree(ev);
+
+    GetEventList(&events);
+    switch(type) {
+        case MotionNotify:
+            nevents = GetPointerEvents(events, dev, type, 0,
+                            (ev->u.u.detail == xFalse) ?  POINTER_ABSOLUTE : 0,
+                            firstValuator, numValuators, valuators);
+            break;
+        case ButtonPress:
+        case ButtonRelease:
+            nevents = GetPointerEvents(events, dev, type, ev->u.u.detail,
+                                       POINTER_ABSOLUTE, firstValuator,
+                                       numValuators, valuators);
+            break;
+        case KeyPress:
+        case KeyRelease:
+            nevents = GetKeyboardEvents(events, dev, type, ev->u.u.detail);
+            break;
+    }
+
+    OsBlockSignals();
+    for (i = 0; i < nevents; i++)
+        mieqEnqueue(dev, events->event);
+    OsReleaseSignals();
+
     return client->noClientException;
 }
 
commit 341a61b608873c77b1a17fe7d145ed3ad716e5a3
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Sat May 31 12:01:47 2008 +0930

    mi: reduce noisyness. DebugF is enough if device ID can't be changed.
    
    Also - printing out the event type is actually helpful.

diff --git a/mi/mieq.c b/mi/mieq.c
index 830bab8..a1f9cc6 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -254,9 +254,11 @@ ChangeDeviceID(DeviceIntPtr dev, xEvent* event)
         {
             // do nothing or drink a beer. your choice.
         } else
-            ErrorF("[mi] Unknown generic event, cannot change id.\n");
+            DebugF("[mi] Unknown generic event (%d/%d), cannot change id.\n",
+                    ((xGenericEvent*)ev)->extension,
+                    ((xGenericEvent*)ev)->evtype);
     } else
-        ErrorF("[mi] Unknown event type, cannot change id.\n");
+        DebugF("[mi] Unknown event type (%d), cannot change id.\n", type);
 }
 
 /**
commit 62c1a32976d571f3ced1812b8b96ed5a8e658b4a
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Sat May 31 10:24:37 2008 +0930

    dix: null out dummyDev, otherwise Xephyr dereferences random pointers.
    
    SendEventToAllWindow eventually causes a IsInterferingGrab(), which attempts
    to dereference dev->deviceGrab.grab.

diff --git a/dix/devices.c b/dix/devices.c
index 60d48b2..08520eb 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -376,7 +376,8 @@ ActivateDevice(DeviceIntPtr dev)
     ev.time = currentTime.milliseconds;
     ev.devchange = DeviceAdded;
     ev.deviceid = dev->id;
-    dummyDev.id = 0;
+
+    memset(&dummyDev, 0, sizeof(DeviceIntRec));
     SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
                           (xEvent *) &ev, 1);
 
commit 150c2f55a508ed24b230f68e30ec140c0901d9ae
Author: Julien Cristau <jcristau at debian.org>
Date:   Fri May 23 03:09:04 2008 +0200

    Add xkbstr.h and xkbsrv.h to sdk_HEADERS

diff --git a/include/Makefile.am b/include/Makefile.am
index 673a976..7d5fee7 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -50,10 +50,12 @@ sdk_HEADERS =		\
 	validate.h	\
 	window.h	\
 	windowstr.h	\
+	xkbsrv.h	\
+	xkbstr.h	\
 	xorg-server.h
 endif
 
 AM_CFLAGS = $(DIX_CFLAGS)
 
 EXTRA_DIST = $(sdk_HEADERS) do-not-use-config.h dix-config.h xorg-config.h \
-	xkb-config.h xkbfile.h xkbsrv.h xkbstr.h
+	xkb-config.h xkbfile.h
commit f9bcecbe51e4cf0cb2d82ad953f8c6741ed5558b
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Thu May 29 17:42:49 2008 +0930

    Xext: only free events in case of core motion events.

diff --git a/Xext/xtest.c b/Xext/xtest.c
index 58e20ef..9bd26ba 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -500,7 +500,7 @@ ProcXTestFakeInput(client)
         xfree(master_event);
     } else
         (*dev->public.processInputProc)(ev, dev, nev);
-    if (!extension)
+    if (!extension && type == MotionNotify)
         xfree(ev);
     return client->noClientException;
 }


More information about the xorg-commit mailing list