xserver: Branch 'dri2-swapbuffers' - 491 commits

Kristian Høgsberg krh at kemper.freedesktop.org
Thu Jul 16 14:03:54 PDT 2009


Rebased ref, commits from common ancestor:
commit aa0a83813085994e814821e9446a407d714e6499
Author: Jesse Barnes <jbarnes at virtuousgeek.org>
Date:   Thu Jul 16 09:01:17 2009 -0400

    DRI2: add support for SwapBuffers request
    
    Support the new SwapBuffers DRI2 protocol request.  Requires that low
    level drivers have a SwapBuffers callback themselves.

diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index ed7fb4c..3426f67 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -70,6 +70,7 @@ struct __GLXDRIscreen {
 
     const __DRIcoreExtension *core;
     const __DRIdri2Extension *dri2;
+    const __DRI2flushExtension *flush;
     const __DRIcopySubBufferExtension *copySubBuffer;
     const __DRIswapControlExtension *swapControl;
     const __DRItexBufferExtension *texBuffer;
@@ -132,17 +133,6 @@ __glXDRIdrawableCopySubBuffer(__GLXdrawable *drawable,
 		   DRI2BufferFrontLeft, DRI2BufferBackLeft);
 }
 
-static GLboolean
-__glXDRIdrawableSwapBuffers(__GLXdrawable *drawable)
-{
-    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
-
-    __glXDRIdrawableCopySubBuffer(drawable, 0, 0,
-				  private->width, private->height);
-
-    return TRUE;
-}
-
 static void
 __glXDRIdrawableWaitX(__GLXdrawable *drawable)
 {
@@ -177,6 +167,20 @@ __glXDRIdrawableWaitGL(__GLXdrawable *drawable)
 		   DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
 }
 
+static GLboolean
+__glXDRIdrawableSwapBuffers(__GLXdrawable *drawable)
+{
+    __GLXDRIdrawable *priv = (__GLXDRIdrawable *) drawable;
+    __GLXDRIscreen *screen = priv->screen;
+
+    if (!DRI2SwapBuffers(drawable->pDraw))
+	return FALSE;
+
+    (*screen->flush->flushInvalidate)(priv->driDrawable);
+
+    return TRUE;
+}
+
 static int
 __glXDRIdrawableSwapInterval(__GLXdrawable *drawable, int interval)
 {
@@ -643,6 +647,10 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
 	    extensions[i]->version >= __DRI_DRI2_VERSION) {
 		screen->dri2 = (const __DRIdri2Extension *) extensions[i];
 	}
+	if (strcmp(extensions[i]->name, __DRI2_FLUSH) == 0 &&
+	    extensions[i]->version >= __DRI2_FLUSH_VERSION) {
+		screen->flush = (__DRI2flushExtension *) extensions[i];
+	}
     }
 
     if (screen->core == NULL || screen->dri2 == NULL) {
diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
index 8795cd1..1ed2814 100644
--- a/hw/xfree86/dri2/dri2.c
+++ b/hw/xfree86/dri2/dri2.c
@@ -67,6 +67,7 @@ typedef struct _DRI2Screen {
     DRI2CreateBufferProcPtr	 CreateBuffer;
     DRI2DestroyBufferProcPtr	 DestroyBuffer;
     DRI2CopyRegionProcPtr	 CopyRegion;
+    DRI2SwapBuffersProcPtr	 SwapBuffers;
 
     HandleExposuresProcPtr       HandleExposures;
 } DRI2ScreenRec, *DRI2ScreenPtr;
@@ -337,6 +338,46 @@ DRI2CopyRegion(DrawablePtr pDraw, RegionPtr pRegion,
     return Success;
 }
 
+Bool
+DRI2SwapBuffers(DrawablePtr pDraw)
+{
+    DRI2ScreenPtr   ds = DRI2GetScreen(pDraw->pScreen);
+    DRI2DrawablePtr pPriv;
+    DRI2BufferPtr   pDestBuffer, pSrcBuffer;
+    int		    i;
+
+    pPriv = DRI2GetDrawable(pDraw);
+    if (pPriv == NULL)
+	return FALSE;
+
+    pDestBuffer = NULL;
+    pSrcBuffer = NULL;
+    for (i = 0; i < pPriv->bufferCount; i++)
+    {
+	if (pPriv->buffers[i]->attachment == DRI2BufferFrontLeft)
+	    pDestBuffer = pPriv->buffers[i];
+	if (pPriv->buffers[i]->attachment == DRI2BufferBackLeft)
+	    pSrcBuffer = pPriv->buffers[i];
+    }
+    if (pSrcBuffer == NULL || pDestBuffer == NULL)
+	return FALSE;
+
+    if (!(*ds->SwapBuffers)(pDraw, pDestBuffer, pSrcBuffer)) {
+	BoxRec box;
+	RegionRec region;
+
+	box.x1 = 0;
+	box.y1 = 0;
+	box.x2 = pDraw->width;
+	box.y2 = pDraw->height;
+	REGION_INIT(drawable->pDraw->pScreen, &region, &box, 0);
+	if (DRI2CopyRegion(pDraw, &region, DRI2BufferFrontLeft, DRI2BufferBackLeft) != Success)
+	    return FALSE;
+    }
+
+    return TRUE;
+}
+
 void
 DRI2DestroyDrawable(DrawablePtr pDraw)
 {
@@ -414,7 +455,7 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
     if (info->version < 3)
 	return FALSE;
 
-    ds = xalloc(sizeof *ds);
+    ds = xcalloc(1, sizeof *ds);
     if (!ds)
 	return FALSE;
 
@@ -426,6 +467,9 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
     ds->DestroyBuffer  = info->DestroyBuffer;
     ds->CopyRegion     = info->CopyRegion;
 
+    if (info->version >= 4)
+	ds->SwapBuffers = info->SwapBuffers;
+
     dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, ds);
 
     xf86DrvMsg(pScreen->myNum, X_INFO, "[DRI2] Setup complete\n");
diff --git a/hw/xfree86/dri2/dri2.h b/hw/xfree86/dri2/dri2.h
index 175471a..a392d83 100644
--- a/hw/xfree86/dri2/dri2.h
+++ b/hw/xfree86/dri2/dri2.h
@@ -58,6 +58,9 @@ typedef void		(*DRI2CopyRegionProcPtr)(DrawablePtr pDraw,
 						 RegionPtr pRegion,
 						 DRI2BufferPtr pDestBuffer,
 						 DRI2BufferPtr pSrcBuffer);
+typedef Bool		(*DRI2SwapBuffersProcPtr)(DrawablePtr pDraw,
+						  DRI2BufferPtr pFrontBuffer,
+						  DRI2BufferPtr pBackBuffer);
 
 typedef void		(*DRI2WaitProcPtr)(WindowPtr pWin,
 					   unsigned int sequence);
@@ -82,7 +85,7 @@ typedef struct {
     DRI2CreateBufferProcPtr	CreateBuffer;
     DRI2DestroyBufferProcPtr	DestroyBuffer;
     DRI2CopyRegionProcPtr	CopyRegion;
-    DRI2WaitProcPtr		Wait;
+    DRI2SwapBuffersProcPtr	SwapBuffers;
 
 }  DRI2InfoRec, *DRI2InfoPtr;
 
@@ -137,4 +140,6 @@ extern _X_EXPORT DRI2BufferPtr *DRI2GetBuffersWithFormat(DrawablePtr pDraw,
 	int *width, int *height, unsigned int *attachments, int count,
 	int *out_count);
 
+extern _X_EXPORT Bool DRI2SwapBuffers(DrawablePtr pDraw);
+
 #endif
diff --git a/hw/xfree86/dri2/dri2ext.c b/hw/xfree86/dri2/dri2ext.c
index 029dce8..9f5a196 100644
--- a/hw/xfree86/dri2/dri2ext.c
+++ b/hw/xfree86/dri2/dri2ext.c
@@ -80,7 +80,7 @@ ProcDRI2QueryVersion(ClientPtr client)
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
     rep.majorVersion = 1;
-    rep.minorVersion = 1;
+    rep.minorVersion = 2;
 
     if (client->swapped) {
     	swaps(&rep.sequenceNumber, n);
@@ -322,6 +322,24 @@ ProcDRI2CopyRegion(ClientPtr client)
 }
 
 static int
+ProcDRI2SwapBuffers(ClientPtr client)
+{
+    REQUEST(xDRI2SwapBuffersReq);
+    DrawablePtr pDrawable;
+    int status;
+
+    REQUEST_SIZE_MATCH(xDRI2SwapBuffersReq);
+
+    if (!validDrawable(client, stuff->drawable, &pDrawable, &status))
+	return status;
+
+    if (!DRI2SwapBuffers(pDrawable))
+	return BadAlloc;
+
+    return client->noClientException;
+}
+
+static int
 ProcDRI2Dispatch (ClientPtr client)
 {
     REQUEST(xReq);
@@ -349,6 +367,8 @@ ProcDRI2Dispatch (ClientPtr client)
 	return ProcDRI2CopyRegion(client);
     case X_DRI2GetBuffersWithFormat:
 	return ProcDRI2GetBuffersWithFormat(client);
+    case X_DRI2SwapBuffers:
+	return ProcDRI2SwapBuffers(client);
     default:
 	return BadRequest;
     }
commit 693babbf12cc7969c3e211c4037c7af0d41c13e9
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jul 15 12:30:02 2009 +1000

    xkb: Remove XKMformat.h include from xkbsrv.h into the files that need it.
    
    xkbsrv.h is used by drivers, they don't need the XKM format and shouldn't
    require it.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index 48891fd..1c4378a 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -947,7 +947,6 @@ extern int XkbGetKeysym(
         DeviceEvent*            /* event*/);
 
 #include "xkbfile.h"
-#include <X11/extensions/XKMformat.h>
 #include "xkbrules.h"
 
 #define	_XkbListKeycodes	0
diff --git a/xkb/xkb.c b/xkb/xkb.c
index c17250a..b0d92b7 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -40,6 +40,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #include "xkb.h"
 
 #include <X11/extensions/XI.h>
+#include <X11/extensions/XKMformat.h>
 
 int		XkbEventBase;
 static	int	XkbErrorBase;
diff --git a/xkb/xkbfmisc.c b/xkb/xkbfmisc.c
index aa660df..52ef636 100644
--- a/xkb/xkbfmisc.c
+++ b/xkb/xkbfmisc.c
@@ -34,6 +34,7 @@
 
 #include <X11/Xos.h>
 #include <X11/Xfuncs.h>
+#include <X11/extensions/XKMformat.h>
 
 #include <X11/X.h>
 #include <X11/keysym.h>
diff --git a/xkb/xkbout.c b/xkb/xkbout.c
index 8913d8e..b1c30d0 100644
--- a/xkb/xkbout.c
+++ b/xkb/xkbout.c
@@ -36,6 +36,7 @@
 #include <X11/X.h>
 #include <X11/keysym.h>
 #include <X11/Xproto.h>
+#include <X11/extensions/XKMformat.h>
 #include "misc.h"
 #include "inputstr.h"
 #include "dix.h"
diff --git a/xkb/xkbtext.c b/xkb/xkbtext.c
index 2f58199..95ad013 100644
--- a/xkb/xkbtext.c
+++ b/xkb/xkbtext.c
@@ -36,6 +36,7 @@
 
 #include <X11/X.h>
 #include <X11/Xproto.h>
+#include <X11/extensions/XKMformat.h>
 #include "misc.h"
 #include "inputstr.h"
 #include "dix.h"
diff --git a/xkb/xkmread.c b/xkb/xkmread.c
index 3e05679..6623d1b 100644
--- a/xkb/xkmread.c
+++ b/xkb/xkmread.c
@@ -36,6 +36,7 @@
 #include <X11/X.h>
 #include <X11/Xproto.h>
 #include <X11/keysym.h>
+#include <X11/extensions/XKMformat.h>
 #include "misc.h"
 #include "inputstr.h"
 #include "xkbstr.h"
commit 35ff5cd26eb7564fefebf238e30b8d43cbb4dc25
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jul 15 10:29:46 2009 +1000

    dix: fix wrong raw valuator copy
    
    internal events keep valuator data at the index for the valuator, not like
    the wire events that start with first_valuator.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/getevents.c b/dix/getevents.c
index 13e7576..a421073 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -155,10 +155,9 @@ set_raw_valuators(RawDeviceEvent *event, int first, int num, int *valuators, int
 {
     int i;
     for (i = first; i < first + num; i++)
-    {
         SetBit(event->valuators.mask, i);
-        data[i] = valuators[i - first];
-    }
+
+    memcpy(&data[first], valuators, num * sizeof(uint32_t));
 }
 
 
commit 975bf60a82f863e3bdc36fc3f8201b48a4d1e6f7
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jul 15 10:29:19 2009 +1000

    dix: use sizeof(FP3232) instead of 2 * sizeof(int32_t).
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index 765c84b..039a17f 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -469,8 +469,8 @@ eventToRawEvent(RawDeviceEvent *ev, xEvent **xi)
     FP3232 *axisval;
 
     nvals = count_bits(ev->valuators.mask, sizeof(ev->valuators.mask)/sizeof(ev->valuators.mask[0]));
-    len += nvals * (2 * sizeof(uint32_t)) * 2; /* 8 byte per valuator, once
-                                                   raw, once processed */
+    len += nvals * sizeof(FP3232) * 2; /* 8 byte per valuator, once
+                                    raw, once processed */
     vallen = bytes_to_int32(bits_to_bytes(MAX_VALUATORS));
     len += vallen * 4; /* valuators mask */
 
commit d040af7fa3c7314917414a28d723bdda3c4289c3
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jul 13 15:09:38 2009 +1000

    Update to type-specific raw events - require inputproto 1.9.99.14.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 85baa03..984bc07 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -986,7 +986,11 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
 
     CHECKEVENT(ev);
 
-    if (ev->any.type == ET_Raw)
+    if (ev->any.type == ET_RawKeyPress ||
+        ev->any.type == ET_RawKeyRelease ||
+        ev->any.type == ET_RawButtonPress ||
+        ev->any.type == ET_RawButtonRelease ||
+        ev->any.type == ET_RawMotion)
     {
         ProcessRawEvent((RawDeviceEvent*)ev, device);
         return;
diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 2baae77..d7b1644 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -102,6 +102,18 @@ ProcXISelectEvents(ClientPtr client)
                 return BadValue;
         }
 
+        /* Raw events may only be selected on root windows */
+        if (win->parent && evmask->mask_len >= 1)
+        {
+            unsigned char *bits = (unsigned char*)&evmask[1];
+            if (BitIsOn(bits, XI_RawKeyPress) ||
+                BitIsOn(bits, XI_RawKeyRelease) ||
+                BitIsOn(bits, XI_RawButtonPress) ||
+                BitIsOn(bits, XI_RawButtonRelease) ||
+                BitIsOn(bits, XI_RawMotion))
+                return BadValue;
+        }
+
         if ((evmask->mask_len * 4) >= (XI2LASTEVENT + 8)/8)
         {
             unsigned char *bits = (unsigned char*)&evmask[1];
diff --git a/configure.ac b/configure.ac
index 43288c1..cd11f21 100644
--- a/configure.ac
+++ b/configure.ac
@@ -704,7 +704,7 @@ XEXT_LIB='$(top_builddir)/Xext/libXext.la'
 XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
 
 dnl Core modules for most extensions, et al.
-REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.11] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.13] [kbproto >= 1.0.3]"
+REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.11] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.14] [kbproto >= 1.0.3]"
 REQUIRED_LIBS="xfont xau fontenc [pixman-1 >= 0.15.14]"
 
 dnl HAVE_DBUS is true if we actually have the D-Bus library, whereas
diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index 8d9a329..765c84b 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -94,7 +94,11 @@ EventToCore(InternalEvent *event, xEvent *core)
             break;
         case ET_ProximityIn:
         case ET_ProximityOut:
-        case ET_Raw:
+        case ET_RawKeyPress:
+        case ET_RawKeyRelease:
+        case ET_RawButtonPress:
+        case ET_RawButtonRelease:
+        case ET_RawMotion:
             return BadMatch;
         default:
             /* XXX: */
@@ -135,7 +139,11 @@ EventToXI(InternalEvent *ev, xEvent **xi, int *count)
         case ET_ProximityOut:
             return eventToKeyButtonPointer((DeviceEvent*)ev, xi, count);
         case ET_DeviceChanged:
-        case ET_Raw:
+        case ET_RawKeyPress:
+        case ET_RawKeyRelease:
+        case ET_RawButtonPress:
+        case ET_RawButtonRelease:
+        case ET_RawMotion:
             *count = 0;
             *xi = NULL;
             return BadMatch;
@@ -182,7 +190,11 @@ EventToXI2(InternalEvent *ev, xEvent **xi)
             return BadMatch;
         case ET_DeviceChanged:
             return eventToClassesChanged((DeviceChangedEvent*)ev, xi);
-        case ET_Raw:
+        case ET_RawKeyPress:
+        case ET_RawKeyRelease:
+        case ET_RawButtonPress:
+        case ET_RawButtonRelease:
+        case ET_RawMotion:
             return eventToRawEvent((RawDeviceEvent*)ev, xi);
 
     }
@@ -469,7 +481,6 @@ eventToRawEvent(RawDeviceEvent *ev, xEvent **xi)
     raw->evtype         = GetXI2Type((InternalEvent*)ev);
     raw->time           = ev->time;
     raw->length         = bytes_to_int32(len - sizeof(xEvent));
-    raw->eventtype      = ev->subtype;
     raw->detail         = ev->detail.button;
     raw->deviceid       = ev->deviceid;
     raw->valuators_len  = vallen;
@@ -552,7 +563,11 @@ GetXI2Type(InternalEvent *event)
         case ET_Leave:          xi2type = XI_Leave;            break;
         case ET_Hierarchy:      xi2type = XI_HierarchyChanged; break;
         case ET_DeviceChanged:  xi2type = XI_DeviceChanged;    break;
-        case ET_Raw:            xi2type = XI_RawEvent;         break;
+        case ET_RawKeyPress:    xi2type = XI_RawKeyPress;      break;
+        case ET_RawKeyRelease:  xi2type = XI_RawKeyRelease;    break;
+        case ET_RawButtonPress: xi2type = XI_RawButtonPress;   break;
+        case ET_RawButtonRelease: xi2type = XI_RawButtonRelease; break;
+        case ET_RawMotion:      xi2type = XI_RawMotion;        break;
         case ET_FocusIn:        xi2type = XI_FocusIn;          break;
         case ET_FocusOut:       xi2type = XI_FocusOut;         break;
         default:
diff --git a/dix/events.c b/dix/events.c
index 91a0833..f6369f6 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2188,7 +2188,11 @@ FixUpEventFromWindow(
     {
         xXIDeviceEvent* event = (xXIDeviceEvent*)xE;
 
-        if (event->evtype == XI_RawEvent)
+        if (event->evtype == XI_RawKeyPress ||
+            event->evtype == XI_RawKeyRelease ||
+            event->evtype == XI_RawButtonPress ||
+            event->evtype == XI_RawButtonRelease ||
+            event->evtype == XI_RawMotion)
             return;
 
         event->root = RootWindow(pDev)->drawable.id;
diff --git a/dix/getevents.c b/dix/getevents.c
index fcac056..13e7576 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -138,14 +138,12 @@ init_event(DeviceIntPtr dev, DeviceEvent* event, Time ms)
 }
 
 static void
-init_raw(DeviceIntPtr dev, RawDeviceEvent *event, Time ms, int subtype,
-         int detail)
+init_raw(DeviceIntPtr dev, RawDeviceEvent *event, Time ms, int type, int detail)
 {
     memset(event, 0, sizeof(RawDeviceEvent));
     event->header = ET_Internal;
     event->length = sizeof(RawDeviceEvent);
-    event->type = ET_Raw;
-    event->subtype = subtype;
+    event->type = ET_RawKeyPress - ET_KeyPress + type;
     event->time = ms;
     event->deviceid = dev->id;
     event->sourceid = dev->id;
diff --git a/include/events.h b/include/events.h
index d34637e..4b0c6dc 100644
--- a/include/events.h
+++ b/include/events.h
@@ -41,6 +41,7 @@
  * protocol.
  *
  * Note: Keep KeyPress to Motion aligned with the core events.
+ *       Keep ET_Raw* in the same order as KeyPress - Motion
  */
 enum {
     ET_KeyPress = 2,
@@ -59,7 +60,11 @@ enum {
 #if XFreeXDGA
     ET_DGAEvent,
 #endif
-    ET_Raw,
+    ET_RawKeyPress,
+    ET_RawKeyRelease,
+    ET_RawButtonPress,
+    ET_RawButtonRelease,
+    ET_RawMotion,
     ET_Internal = 0xFF /* First byte */
 } EventType;
 
@@ -193,8 +198,6 @@ typedef struct
     int type;             /**<  ET_Raw */
     int length;           /**<  Length in bytes */
     Time time;            /**<  Time in ms */
-    int subtype;          /**<  KeyPress, KeyRelease, ButtonPress,
-                                ButtonRelease, MotionNotify */
     int deviceid;         /**< Device to post this event for */
     int sourceid;         /**< The physical source device */
     union {
diff --git a/include/inputstr.h b/include/inputstr.h
index 73750e0..29ad5a8 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -69,7 +69,7 @@ SOFTWARE.
  * events to the protocol, the server will not support these events until
  * this number here is bumped.
  */
-#define XI2LASTEVENT    13 /* XI_PropertyEvent */
+#define XI2LASTEVENT    17 /* XI_RawMotion */
 #define XI2MASKSIZE     ((XI2LASTEVENT + 7)/8) /* no of bits for masks */
 
 /**
diff --git a/mi/mieq.c b/mi/mieq.c
index 0f07b16..fd2de0e 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -281,7 +281,11 @@ ChangeDeviceID(DeviceIntPtr dev, InternalEvent* event)
 	case ET_DGAEvent:
 	    break;
 #endif
-        case ET_Raw:
+        case ET_RawKeyPress:
+        case ET_RawKeyRelease:
+        case ET_RawButtonPress:
+        case ET_RawButtonRelease:
+        case ET_RawMotion:
             event->raw.deviceid = dev->id;
             break;
         default:
commit 81b64f668541217c1c9518ac4a7e3fdf0a6e4002
Author: Fredrik Höglund <fredrik at kde.org>
Date:   Wed Jul 15 00:38:01 2009 +0200

    Require renderproto >= 0.11 and pixman-1 >= 0.15.14 for the new blend modes.

diff --git a/configure.ac b/configure.ac
index be39c76..43288c1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -704,8 +704,8 @@ XEXT_LIB='$(top_builddir)/Xext/libXext.la'
 XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
 
 dnl Core modules for most extensions, et al.
-REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.9.3] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.13] [kbproto >= 1.0.3]"
-REQUIRED_LIBS="xfont xau fontenc [pixman-1 >= 0.15.12]"
+REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.11] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.13] [kbproto >= 1.0.3]"
+REQUIRED_LIBS="xfont xau fontenc [pixman-1 >= 0.15.14]"
 
 dnl HAVE_DBUS is true if we actually have the D-Bus library, whereas
 dnl CONFIG_DBUS_API is true if we want to enable the D-Bus config
commit 0ce42adbf4cff9e7f049d9fc79d588ece5936177
Author: Fredrik Höglund <fredrik at kde.org>
Date:   Wed Jul 15 00:37:05 2009 +0200

    Render: Add support for the PDF blend mode operators.

diff --git a/render/render.c b/render/render.c
index 0e850e3..995ebd9 100644
--- a/render/render.c
+++ b/render/render.c
@@ -681,6 +681,8 @@ PictOpValid (CARD8 op)
 	return TRUE;
     if (PictOpConjointMinimum <= op && op <= PictOpConjointMaximum)
 	return TRUE;
+    if (PictOpBlendMinimum <= op && op <= PictOpBlendMaximum)
+	return TRUE;
     return FALSE;
 }
 
commit 686e4867302a741f3029c4105b997d0f0ac7c13c
Author: Tiago Vignatti <tiago.vignatti at nokia.com>
Date:   Tue Jul 14 17:11:13 2009 +0300

    xfree86: remove a bunch of unused pci headers
    
    Signed-off-by: Tiago Vignatti <tiago.vignatti at nokia.com>

diff --git a/hw/xfree86/common/xf86Privstr.h b/hw/xfree86/common/xf86Privstr.h
index 52960e5..1a2f736 100644
--- a/hw/xfree86/common/xf86Privstr.h
+++ b/hw/xfree86/common/xf86Privstr.h
@@ -34,7 +34,6 @@
 #ifndef _XF86PRIVSTR_H
 #define _XF86PRIVSTR_H
 
-#include "xf86Pci.h"
 #include "xf86str.h"
 
 typedef enum {
diff --git a/hw/xfree86/os-support/shared/stdResource.c b/hw/xfree86/os-support/shared/stdResource.c
index 9db349b..491b4ce 100644
--- a/hw/xfree86/os-support/shared/stdResource.c
+++ b/hw/xfree86/os-support/shared/stdResource.c
@@ -35,14 +35,10 @@
 #include "xf86.h"
 #include "xf86Priv.h"
 #include "xf86Privstr.h"
-#include "xf86Pci.h"
 #define NEED_OS_RAC_PROTOS
 #include "xf86_OSlib.h"
 #include "xf86Resources.h"
 
-/* Avoid Imakefile changes */
-#include "bus/Pci.h"
-
 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \
 	defined(__NetBSD__) || defined(__OpenBSD__) || \
 	defined(__DragonFly__) || defined(__sun) || defined(__GNU__)
diff --git a/hw/xfree86/os-support/xf86_OSproc.h b/hw/xfree86/os-support/xf86_OSproc.h
index 507db18..0f16607 100644
--- a/hw/xfree86/os-support/xf86_OSproc.h
+++ b/hw/xfree86/os-support/xf86_OSproc.h
@@ -68,10 +68,6 @@
 #ifndef _XF86_OSPROC_H
 #define _XF86_OSPROC_H
 
-#ifdef XF86_OS_PRIVS
-#include "xf86Pci.h"
-#endif
-
 /*
  * The actual prototypes have been pulled into this seperate file so
  * that they can can be used without pulling in all of the OS specific
diff --git a/hw/xfree86/ramdac/xf86RamDacCmap.c b/hw/xfree86/ramdac/xf86RamDacCmap.c
index 600fe3f..c6dc831 100644
--- a/hw/xfree86/ramdac/xf86RamDacCmap.c
+++ b/hw/xfree86/ramdac/xf86RamDacCmap.c
@@ -39,9 +39,6 @@
 #include "colormapst.h"
 #include "xf86RamDacPriv.h"
 
-#include "xf86PciInfo.h"
-#include "xf86Pci.h"
-
 void
 RamDacLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, LOCO *colors,
 		 VisualPtr pVisual)
commit cc575a3ba4a52265e410b325c2291fe900a54f33
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jun 12 11:38:46 2009 +1000

    test: add tests for ProcXIGetClientPointer.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/test/xi2/Makefile.am b/test/xi2/Makefile.am
index ad2d4a2..c565442 100644
--- a/test/xi2/Makefile.am
+++ b/test/xi2/Makefile.am
@@ -4,7 +4,8 @@ check_PROGRAMS =  \
 	protocol-xiquerydevice \
 	protocol-xiselectevents \
 	protocol-xigetselectedevents \
-        protocol-xisetclientpointer
+        protocol-xisetclientpointer \
+        protocol-xigetclientpointer
 
 TESTS=$(check_PROGRAMS)
 
@@ -18,16 +19,19 @@ protocol_xiquerydevice_LDADD=$(TEST_LDADD)
 protocol_xiselectevents_LDADD=$(TEST_LDADD)
 protocol_xigetselectedevents_LDADD=$(TEST_LDADD)
 protocol_xisetclientpointer_LDADD=$(TEST_LDADD)
+protocol_xigetclientpointer_LDADD=$(TEST_LDADD)
 
 protocol_xiqueryversion_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,WriteToClient
 protocol_xiquerydevice_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,WriteToClient
 protocol_xiselectevents_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,dixLookupWindow -Wl,-wrap,XISetEventMask
 protocol_xigetselectedevents_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,WriteToClient -Wl,-wrap,dixLookupWindow -Wl,-wrap,AddResource
 protocol_xisetclientpointer_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,dixLookupClient
+protocol_xigetclientpointer_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,WriteToClient -Wl,-wrap,dixLookupClient
 
 protocol_xiqueryversion_SOURCES=$(COMMON_SOURCES) protocol-xiqueryversion.c
 protocol_xiquerydevice_SOURCES=$(COMMON_SOURCES) protocol-xiquerydevice.c
 protocol_xiselectevents_SOURCES=$(COMMON_SOURCES) protocol-xiselectevents.c
 protocol_xigetselectedevents_SOURCES=$(COMMON_SOURCES) protocol-xigetselectedevents.c
 protocol_xisetclientpointer_SOURCES=$(COMMON_SOURCES) protocol-xisetclientpointer.c
+protocol_xigetclientpointer_SOURCES=$(COMMON_SOURCES) protocol-xigetclientpointer.c
 endif
diff --git a/test/xi2/protocol-xigetclientpointer.c b/test/xi2/protocol-xigetclientpointer.c
new file mode 100644
index 0000000..d4923f3
--- /dev/null
+++ b/test/xi2/protocol-xigetclientpointer.c
@@ -0,0 +1,169 @@
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ *  Permission is hereby granted, free of charge, to any person obtaining a
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ *  Software is furnished to do so, subject to the following conditions:
+ *
+ *  The above copyright notice and this permission notice (including the next
+ *  paragraph) shall be included in all copies or substantial portions of the
+ *  Software.
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *  DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+/*
+ * Protocol testing for XIGetClientPointer request.
+ */
+#include <stdint.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/extensions/XI2proto.h>
+#include "inputstr.h"
+#include "windowstr.h"
+#include "scrnintstr.h"
+#include "xigetclientpointer.h"
+#include "exevents.h"
+
+#include "protocol-common.h"
+#include <glib.h>
+
+#define FAKE_WINDOW_ID  12345
+
+struct {
+    int cp_is_set;
+    DeviceIntPtr dev;
+    int win;
+} test_data;
+
+static ClientRec client_window;
+static ClientRec client_request;
+
+int __wrap_dixLookupClient(ClientPtr *pClient, XID rid, ClientPtr client, Mask access)
+{
+    if (rid == ROOT_WINDOW_ID)
+        return BadWindow;
+
+    if (rid == CLIENT_WINDOW_ID)
+    {
+        *pClient = &client_window;
+        return Success;
+    }
+
+    return __real_dixLookupClient(pClient, rid, client, access);
+}
+
+
+static void reply_XIGetClientPointer(ClientPtr client, int len, char *data, void *userdata)
+{
+    xXIGetClientPointerReply *rep = (xXIGetClientPointerReply*)data;
+
+    if (client->swapped)
+    {
+        char n;
+        swapl(&rep->length, n);
+        swaps(&rep->sequenceNumber, n);
+        swaps(&rep->deviceid, n);
+    }
+
+    reply_check_defaults(rep, len, XIGetClientPointer);
+
+    g_assert(rep->set == test_data.cp_is_set);
+    if (rep->set)
+        g_assert(rep->deviceid == test_data.dev->id);
+}
+
+static void request_XIGetClientPointer(ClientPtr client, xXIGetClientPointerReq* req, int error)
+{
+    char n;
+    int rc;
+
+    test_data.win = req->win;
+
+    rc = ProcXIGetClientPointer(&client_request);
+    g_assert(rc == error);
+
+    if (rc == BadWindow)
+        g_assert(client_request.errorValue == req->win);
+
+    client_request.swapped = TRUE;
+    swapl(&req->win, n);
+    swaps(&req->length, n);
+    rc = SProcXIGetClientPointer(&client_request);
+    g_assert(rc == error);
+
+    if (rc == BadWindow)
+        g_assert(client_request.errorValue == req->win);
+
+}
+
+static void test_XIGetClientPointer(void)
+{
+    xXIGetClientPointerReq request;
+
+    request_init(&request, XIGetClientPointer);
+
+    request.win = CLIENT_WINDOW_ID;
+
+
+    reply_handler = reply_XIGetClientPointer;
+
+    client_request = init_client(request.length, &request);
+
+    g_test_message("Testing invalid window 12345");
+    request.win = FAKE_WINDOW_ID;
+    request_XIGetClientPointer(&client_request, &request, BadWindow);
+
+    test_data.cp_is_set = FALSE;
+
+    g_test_message("Testing window None, unset ClientPointer.");
+    request.win = None;
+    request_XIGetClientPointer(&client_request, &request, Success);
+
+    g_test_message("Testing valid window, unset ClientPointer.");
+    request.win = CLIENT_WINDOW_ID;
+    request_XIGetClientPointer(&client_request, &request, Success);
+
+    g_test_message("Testing valid window, set ClientPointer.");
+    client_window.clientPtr = devices.vcp;
+    test_data.dev = devices.vcp;
+    test_data.cp_is_set = TRUE;
+    request.win = CLIENT_WINDOW_ID;
+    request_XIGetClientPointer(&client_request, &request, Success);
+
+    client_window.clientPtr = NULL;
+
+    g_test_message("Testing window None, set ClientPointer.");
+    client_request.clientPtr = devices.vcp;
+    test_data.dev = devices.vcp;
+    test_data.cp_is_set = TRUE;
+    request.win = None;
+    request_XIGetClientPointer(&client_request, &request, Success);
+}
+
+int main(int argc, char** argv)
+{
+    g_test_init(&argc, &argv,NULL);
+    g_test_bug_base("https://bugzilla.freedesktop.org/show_bug.cgi?id=");
+
+    init_simple();
+    client_window = init_client(0, NULL);
+
+
+    g_test_add_func("/xi2/protocol/XIGetClientPointer", test_XIGetClientPointer);
+
+    return g_test_run();
+}
commit 92b0065a19dcde50494d2528e19a4ee76723b3da
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jun 12 11:38:00 2009 +1000

    test: add ProcXISetClientPointer tests.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/test/xi2/Makefile.am b/test/xi2/Makefile.am
index 6a2618b..ad2d4a2 100644
--- a/test/xi2/Makefile.am
+++ b/test/xi2/Makefile.am
@@ -3,7 +3,8 @@ check_PROGRAMS =  \
 	protocol-xiqueryversion \
 	protocol-xiquerydevice \
 	protocol-xiselectevents \
-	protocol-xigetselectedevents
+	protocol-xigetselectedevents \
+        protocol-xisetclientpointer
 
 TESTS=$(check_PROGRAMS)
 
@@ -16,14 +17,17 @@ protocol_xiqueryversion_LDADD=$(TEST_LDADD)
 protocol_xiquerydevice_LDADD=$(TEST_LDADD)
 protocol_xiselectevents_LDADD=$(TEST_LDADD)
 protocol_xigetselectedevents_LDADD=$(TEST_LDADD)
+protocol_xisetclientpointer_LDADD=$(TEST_LDADD)
 
 protocol_xiqueryversion_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,WriteToClient
 protocol_xiquerydevice_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,WriteToClient
 protocol_xiselectevents_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,dixLookupWindow -Wl,-wrap,XISetEventMask
 protocol_xigetselectedevents_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,WriteToClient -Wl,-wrap,dixLookupWindow -Wl,-wrap,AddResource
+protocol_xisetclientpointer_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,dixLookupClient
 
 protocol_xiqueryversion_SOURCES=$(COMMON_SOURCES) protocol-xiqueryversion.c
 protocol_xiquerydevice_SOURCES=$(COMMON_SOURCES) protocol-xiquerydevice.c
 protocol_xiselectevents_SOURCES=$(COMMON_SOURCES) protocol-xiselectevents.c
 protocol_xigetselectedevents_SOURCES=$(COMMON_SOURCES) protocol-xigetselectedevents.c
+protocol_xisetclientpointer_SOURCES=$(COMMON_SOURCES) protocol-xisetclientpointer.c
 endif
diff --git a/test/xi2/protocol-xisetclientpointer.c b/test/xi2/protocol-xisetclientpointer.c
new file mode 100644
index 0000000..e72d016
--- /dev/null
+++ b/test/xi2/protocol-xisetclientpointer.c
@@ -0,0 +1,149 @@
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ *  Permission is hereby granted, free of charge, to any person obtaining a
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ *  Software is furnished to do so, subject to the following conditions:
+ *
+ *  The above copyright notice and this permission notice (including the next
+ *  paragraph) shall be included in all copies or substantial portions of the
+ *  Software.
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *  DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+/*
+ * Protocol testing for XISetClientPointer request.
+ *
+ * Tests include:
+ * BadDevice of all devices except master pointers.
+ * Success for a valid window.
+ * Success for window None.
+ * BadWindow for invalid windows.
+ */
+#include <stdint.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/extensions/XI2proto.h>
+#include "inputstr.h"
+#include "windowstr.h"
+#include "extinit.h" /* for XInputExtensionInit */
+#include "scrnintstr.h"
+#include "xisetclientpointer.h"
+#include "exevents.h"
+
+#include "protocol-common.h"
+#include <glib.h>
+
+static ClientRec client_window;
+static ClientRec client_request;
+
+int __wrap_dixLookupClient(ClientPtr *pClient, XID rid, ClientPtr client, Mask access)
+{
+    if (rid == ROOT_WINDOW_ID)
+        return BadWindow;
+
+    if (rid == CLIENT_WINDOW_ID)
+    {
+        *pClient = &client_window;
+        return Success;
+    }
+
+    return __real_dixLookupClient(pClient, rid, client, access);
+}
+
+static void request_XISetClientPointer(xXISetClientPointerReq* req, int error)
+{
+    char n;
+    int rc;
+    client_request = init_client(req->length, req);
+
+    rc = ProcXISetClientPointer(&client_request);
+    g_assert(rc == error);
+
+    if (rc == BadDevice)
+        g_assert(client_request.errorValue == req->deviceid);
+
+    client_request.swapped = TRUE;
+    swapl(&req->win, n);
+    swaps(&req->length, n);
+    swaps(&req->deviceid, n);
+    rc = SProcXISetClientPointer(&client_request);
+    g_assert(rc == error);
+
+    if (rc == BadDevice)
+        g_assert(client_request.errorValue == req->deviceid);
+
+}
+
+static void test_XISetClientPointer(void)
+{
+    int i;
+    xXISetClientPointerReq request;
+
+    request_init(&request, XISetClientPointer);
+
+    request.win = CLIENT_WINDOW_ID;
+
+    g_test_message("Testing BadDevice error for XIAllDevices and XIMasterDevices.");
+    request.deviceid = XIAllDevices;
+    request_XISetClientPointer(&request, BadDevice);
+
+    request.deviceid = XIAllMasterDevices;
+    request_XISetClientPointer(&request, BadDevice);
+
+    g_test_message("Testing Success for VCP and VCK.");
+    request.deviceid = devices.vcp->id; /* 2 */
+    request_XISetClientPointer(&request, Success);
+    g_assert(client_window.clientPtr->id == 2);
+
+    request.deviceid = devices.vck->id; /* 3 */
+    request_XISetClientPointer(&request, Success);
+    g_assert(client_window.clientPtr->id == 2);
+
+    g_test_message("Testing BadDevice error for all other devices.");
+    for (i = 4; i <= 0xFFFF; i++)
+    {
+        request.deviceid = i;
+        request_XISetClientPointer(&request, BadDevice);
+    }
+
+    g_test_message("Testing window None");
+    request.win = None;
+    request.deviceid = devices.vcp->id; /* 2 */
+    request_XISetClientPointer(&request, Success);
+    g_assert(client_request.clientPtr->id == 2);
+
+    g_test_message("Testing invalid window 12345");
+    request.win = 12345;
+    request.deviceid = devices.vcp->id;
+    request_XISetClientPointer(&request, BadWindow);
+
+}
+
+
+int main(int argc, char** argv)
+{
+    g_test_init(&argc, &argv,NULL);
+    g_test_bug_base("https://bugzilla.freedesktop.org/show_bug.cgi?id=");
+
+    init_simple();
+    client_window = init_client(0, NULL);
+
+    g_test_add_func("/xi2/protocol/XISetClientPointer", test_XISetClientPointer);
+
+    return g_test_run();
+}
commit 019bc9d70c5b3beb69ca20b6bca3551e00415992
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jun 12 11:37:17 2009 +1000

    test: add ProcXIGetSelectedEvents tests.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/test/xi2/Makefile.am b/test/xi2/Makefile.am
index 8699299..6a2618b 100644
--- a/test/xi2/Makefile.am
+++ b/test/xi2/Makefile.am
@@ -2,7 +2,8 @@ if UNITTESTS
 check_PROGRAMS =  \
 	protocol-xiqueryversion \
 	protocol-xiquerydevice \
-	protocol-xiselectevents
+	protocol-xiselectevents \
+	protocol-xigetselectedevents
 
 TESTS=$(check_PROGRAMS)
 
@@ -14,12 +15,15 @@ COMMON_SOURCES=protocol-common.h protocol-common.c
 protocol_xiqueryversion_LDADD=$(TEST_LDADD)
 protocol_xiquerydevice_LDADD=$(TEST_LDADD)
 protocol_xiselectevents_LDADD=$(TEST_LDADD)
+protocol_xigetselectedevents_LDADD=$(TEST_LDADD)
 
 protocol_xiqueryversion_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,WriteToClient
 protocol_xiquerydevice_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,WriteToClient
 protocol_xiselectevents_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,dixLookupWindow -Wl,-wrap,XISetEventMask
+protocol_xigetselectedevents_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,WriteToClient -Wl,-wrap,dixLookupWindow -Wl,-wrap,AddResource
 
 protocol_xiqueryversion_SOURCES=$(COMMON_SOURCES) protocol-xiqueryversion.c
 protocol_xiquerydevice_SOURCES=$(COMMON_SOURCES) protocol-xiquerydevice.c
 protocol_xiselectevents_SOURCES=$(COMMON_SOURCES) protocol-xiselectevents.c
+protocol_xigetselectedevents_SOURCES=$(COMMON_SOURCES) protocol-xigetselectedevents.c
 endif
diff --git a/test/xi2/protocol-xigetselectedevents.c b/test/xi2/protocol-xigetselectedevents.c
new file mode 100644
index 0000000..97aae15
--- /dev/null
+++ b/test/xi2/protocol-xigetselectedevents.c
@@ -0,0 +1,241 @@
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ *  Permission is hereby granted, free of charge, to any person obtaining a
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ *  Software is furnished to do so, subject to the following conditions:
+ *
+ *  The above copyright notice and this permission notice (including the next
+ *  paragraph) shall be included in all copies or substantial portions of the
+ *  Software.
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *  DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+/*
+ * Protocol testing for XIGetSelectedEvents request.
+ *
+ * Tests include:
+ * BadWindow on wrong window.
+ * Zero-length masks if no masks are set.
+ * Valid masks for valid devices.
+ * Masks set on non-existent devices are not returned.
+ *
+ * Note that this test is not connected to the XISelectEvents request.
+ */
+#include <stdint.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/extensions/XI2proto.h>
+#include "inputstr.h"
+#include "windowstr.h"
+#include "extinit.h" /* for XInputExtensionInit */
+#include "scrnintstr.h"
+#include "xiselectev.h"
+#include "exevents.h"
+
+#include "protocol-common.h"
+#include <glib.h>
+
+static void reply_XIGetSelectedEvents(ClientPtr client, int len, char *data, void *userdata);
+static void reply_XIGetSelectedEvents_data(ClientPtr client, int len, char *data, void *userdata);
+
+
+struct {
+    int num_masks_expected;
+    unsigned char mask[MAXDEVICES][XI2LASTEVENT]; /* intentionally bigger */
+    int mask_len;
+} test_data;
+
+/* dixLookupWindow requires a lot of setup not necessary for this test.
+ * Simple wrapper that returns either one of the fake root window or the
+ * fake client window. If the requested ID is neither of those wanted,
+ * return whatever the real dixLookupWindow does.
+ */
+int __wrap_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access)
+{
+    if (id == root.drawable.id)
+    {
+        *win = &root;
+        return Success;
+    } else if (id == window.drawable.id)
+    {
+        *win = &window;
+        return Success;
+    }
+
+    return __real_dixLookupWindow(win, id, client, access);
+}
+
+/* AddResource is called from XISetSEventMask, we don't need this */
+Bool __wrap_AddResource(XID id, RESTYPE type, pointer value)
+{
+    return TRUE;
+}
+
+static void reply_XIGetSelectedEvents(ClientPtr client, int len, char *data, void *userdata)
+{
+    xXIGetSelectedEventsReply *rep = (xXIGetSelectedEventsReply*)data;
+
+    if (client->swapped)
+    {
+        char n;
+        swapl(&rep->length, n);
+        swaps(&rep->sequenceNumber, n);
+        swaps(&rep->num_masks, n);
+    }
+
+    reply_check_defaults(rep, len, XIGetSelectedEvents);
+
+    g_assert(rep->num_masks == test_data.num_masks_expected);
+
+    reply_handler = reply_XIGetSelectedEvents_data;
+}
+
+static void reply_XIGetSelectedEvents_data(ClientPtr client, int len, char *data, void *userdata)
+{
+    int i;
+    xXIEventMask *mask;
+    unsigned char *bitmask;
+
+    mask = (xXIEventMask*)data;
+    for (i = 0; i < test_data.num_masks_expected; i++)
+    {
+        if (client->swapped)
+        {
+            char n;
+            swaps(&mask->deviceid, n);
+            swaps(&mask->mask_len, n);
+        }
+
+        g_assert(mask->deviceid < 6);
+        g_assert(mask->mask_len <= (((XI2LASTEVENT + 8)/8) + 3)/4) ;
+
+        bitmask = (unsigned char*)&mask[1];
+        g_assert(memcmp(bitmask,
+                    test_data.mask[mask->deviceid],
+                    mask->mask_len * 4) == 0);
+
+        mask = (xXIEventMask*)((char*)mask + mask->mask_len * 4 + sizeof(xXIEventMask));
+    }
+
+
+}
+
+static void request_XIGetSelectedEvents(xXIGetSelectedEventsReq* req, int error)
+{
+    char n;
+    int rc;
+    ClientRec client;
+    client = init_client(req->length, req);
+
+    reply_handler = reply_XIGetSelectedEvents;
+
+    rc = ProcXIGetSelectedEvents(&client);
+    g_assert(rc == error);
+
+    reply_handler = reply_XIGetSelectedEvents;
+    client.swapped = TRUE;
+    swapl(&req->win, n);
+    swaps(&req->length, n);
+    rc = SProcXIGetSelectedEvents(&client);
+    g_assert(rc == error);
+}
+
+static void test_XIGetSelectedEvents(void)
+{
+    int i, j;
+    xXIGetSelectedEventsReq request;
+    ClientRec client = init_client(0, NULL);
+    unsigned char *mask;
+    DeviceIntRec dev;
+
+    request_init(&request, XIGetSelectedEvents);
+
+    g_test_message("Testing for BadWindow on invalid window.");
+    request.win = None;
+    request_XIGetSelectedEvents(&request, BadWindow);
+
+    g_test_message("Testing for zero-length (unset) masks.");
+    /* No masks set yet */
+    test_data.num_masks_expected = 0;
+    request.win = ROOT_WINDOW_ID;
+    request_XIGetSelectedEvents(&request, Success);
+
+    request.win = CLIENT_WINDOW_ID;
+    request_XIGetSelectedEvents(&request, Success);
+
+    memset(test_data.mask, 0,
+           sizeof(test_data.mask));
+
+    g_test_message("Testing for valid masks");
+    memset(&dev, 0, sizeof(dev)); /* dev->id is enough for XISetEventMask */
+    request.win = ROOT_WINDOW_ID;
+
+    /* devices 6 - MAXDEVICES don't exist, they mustn't be included in the
+     * reply even if a mask is set */
+    for (j = 0; j < MAXDEVICES; j++)
+    {
+        test_data.num_masks_expected = min(j + 1, devices.num_devices + 2);
+        dev.id = j;
+        mask = test_data.mask[j];
+        /* bits one-by-one */
+        for (i = 0; i < XI2LASTEVENT; i++)
+        {
+            SetBit(mask, i);
+            XISetEventMask(&dev, &root, &client, (i + 8)/8, mask);
+            request_XIGetSelectedEvents(&request, Success);
+            ClearBit(mask, i);
+        }
+
+        /* all valid mask bits */
+        for (i = 0; i < XI2LASTEVENT; i++)
+        {
+            SetBit(mask, i);
+            XISetEventMask(&dev, &root, &client, (i + 8)/8, mask);
+            request_XIGetSelectedEvents(&request, Success);
+        }
+    }
+
+    g_test_message("Testing removing all masks");
+    /* Unset all masks one-by-one */
+    for (j = MAXDEVICES - 1; j >= 0; j--)
+    {
+        if (j < devices.num_devices + 2)
+            test_data.num_masks_expected--;
+
+        mask = test_data.mask[j];
+        memset(mask, 0, XI2LASTEVENT);
+
+        dev.id = j;
+        XISetEventMask(&dev, &root, &client, 0, NULL);
+
+        request_XIGetSelectedEvents(&request, Success);
+    }
+}
+
+int main(int argc, char** argv)
+{
+    g_test_init(&argc, &argv,NULL);
+    g_test_bug_base("https://bugzilla.freedesktop.org/show_bug.cgi?id=");
+
+    init_simple();
+
+    g_test_add_func("/xi2/protocol/XIGetSelectedEvents", test_XIGetSelectedEvents);
+
+    return g_test_run();
+}
+
commit 8579d39c12b065d8e82fe75af4b254c8ad4f4ab8
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jun 12 11:36:22 2009 +1000

    test: add ProcXISelectEvents tests.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/test/xi2/Makefile.am b/test/xi2/Makefile.am
index 58556cb..8699299 100644
--- a/test/xi2/Makefile.am
+++ b/test/xi2/Makefile.am
@@ -1,7 +1,8 @@
 if UNITTESTS
 check_PROGRAMS =  \
 	protocol-xiqueryversion \
-	protocol-xiquerydevice
+	protocol-xiquerydevice \
+	protocol-xiselectevents
 
 TESTS=$(check_PROGRAMS)
 
@@ -12,10 +13,13 @@ COMMON_SOURCES=protocol-common.h protocol-common.c
 
 protocol_xiqueryversion_LDADD=$(TEST_LDADD)
 protocol_xiquerydevice_LDADD=$(TEST_LDADD)
+protocol_xiselectevents_LDADD=$(TEST_LDADD)
 
 protocol_xiqueryversion_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,WriteToClient
 protocol_xiquerydevice_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,WriteToClient
+protocol_xiselectevents_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,dixLookupWindow -Wl,-wrap,XISetEventMask
 
 protocol_xiqueryversion_SOURCES=$(COMMON_SOURCES) protocol-xiqueryversion.c
 protocol_xiquerydevice_SOURCES=$(COMMON_SOURCES) protocol-xiquerydevice.c
+protocol_xiselectevents_SOURCES=$(COMMON_SOURCES) protocol-xiselectevents.c
 endif
diff --git a/test/xi2/protocol-xiselectevents.c b/test/xi2/protocol-xiselectevents.c
new file mode 100644
index 0000000..825eeb6
--- /dev/null
+++ b/test/xi2/protocol-xiselectevents.c
@@ -0,0 +1,321 @@
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ *  Permission is hereby granted, free of charge, to any person obtaining a
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ *  Software is furnished to do so, subject to the following conditions:
+ *
+ *  The above copyright notice and this permission notice (including the next
+ *  paragraph) shall be included in all copies or substantial portions of the
+ *  Software.
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *  DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+/*
+ * Protocol testing for XISelectEvents request.
+ *
+ * Test approach:
+ *
+ * Wrap XISetEventMask to intercept when the server tries to apply the event
+ * mask. Ensure that the mask passed in is equivalent to the one supplied by
+ * the client. Ensure that invalid devices and invalid masks return errors
+ * as appropriate.
+ *
+ * Tests included:
+ * BadValue for num_masks < 0
+ * BadWindow for invalid windows
+ * BadDevice for non-existing devices
+ * BadImplemenation for devices >= 0xFF
+ * BadValue if HierarchyChanged bit is set for devices other than
+ *          XIAllDevices
+ * BadValue for invalid mask bits
+ * Sucecss for excessive mask lengths
+ *
+ */
+
+#include <stdint.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/extensions/XI2proto.h>
+#include "inputstr.h"
+#include "windowstr.h"
+#include "extinit.h" /* for XInputExtensionInit */
+#include "scrnintstr.h"
+#include "xiselectev.h"
+
+#include "protocol-common.h"
+#include <glib.h>
+
+static unsigned char *data[4096 * 16]; /* the request data buffer */
+
+void __wrap_XISetEventMask(DeviceIntPtr dev, WindowPtr win, int len, unsigned char* mask)
+{
+}
+
+/* dixLookupWindow requires a lot of setup not necessary for this test.
+ * Simple wrapper that returns either one of the fake root window or the
+ * fake client window. If the requested ID is neither of those wanted,
+ * return whatever the real dixLookupWindow does.
+ */
+int __wrap_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access)
+{
+    if (id == root.drawable.id)
+    {
+        *win = &root;
+        return Success;
+    } else if (id == window.drawable.id)
+    {
+        *win = &window;
+        return Success;
+    }
+
+    return __real_dixLookupWindow(win, id, client, access);
+}
+
+
+static void request_XISelectEvent(xXISelectEventsReq *req, int error)
+{
+    char n;
+    int i;
+    int rc;
+    ClientRec client;
+    xXIEventMask *mask, *next;
+
+    req->length = (sz_xXISelectEventsReq/4) + req->num_masks;
+    client = init_client(req->length, req);
+
+    rc = ProcXISelectEvents(&client);
+    g_assert(rc == error);
+
+    client.swapped = TRUE;
+
+    mask = (xXIEventMask*)&req[1];
+    for (i = 0; i < req->num_masks; i++)
+    {
+        next = (xXIEventMask*)((char*)mask) + mask->mask_len;
+        swaps(&mask->deviceid, n);
+        swaps(&mask->mask_len, n);
+        mask = next;
+    }
+
+    swapl(&req->win, n);
+    swaps(&req->length, n);
+    swaps(&req->num_masks, n);
+    rc = SProcXISelectEvents(&client);
+    g_assert(rc == error);
+}
+
+static void request_XISelectEvents_masks(xXISelectEventsReq *req)
+{
+    int i, j;
+    xXIEventMask *mask;
+    int nmasks = (XI_LASTEVENT + 7)/8;
+    unsigned char *bits;
+
+    mask = (xXIEventMask*)&req[1];
+    req->win = ROOT_WINDOW_ID;
+
+    /* if a clients submits more than 100 masks, consider it insane and untested */
+    for (i = 1; i <= 1000; i++)
+    {
+        req->num_masks = i;
+        mask->deviceid = XIAllDevices;
+
+        /* Test 0:
+         * mask_len is 0 -> Success
+         */
+        mask->mask_len = 0;
+        request_XISelectEvent(req, Success);
+
+        /* Test 1:
+         * mask may be larger than needed for XI_LASTEVENT.
+         * Test setting each valid mask bit, while leaving unneeded bits 0.
+         * -> Success
+         */
+        bits = (unsigned char*)&mask[1];
+        mask->mask_len = (nmasks + 3)/4 * 10;
+        memset(bits, 0, mask->mask_len * 4);
+        for (j = 0; j <= XI_LASTEVENT; j++)
+        {
+            SetBit(bits, j);
+            request_XISelectEvent(req, Success);
+            ClearBit(bits, j);
+        }
+
+        /* Test 2:
+         * mask may be larger than needed for XI_LASTEVENT.
+         * Test setting all valid mask bits, while leaving unneeded bits 0.
+         * -> Success
+         */
+        bits = (unsigned char*)&mask[1];
+        mask->mask_len = (nmasks + 3)/4 * 10;
+        memset(bits, 0, mask->mask_len * 4);
+
+        for (j = 0; j <= XI_LASTEVENT; j++)
+        {
+            SetBit(bits, j);
+            request_XISelectEvent(req, Success);
+        }
+
+        /* Test 3:
+         * mask is larger than needed for XI_LASTEVENT. If any unneeded bit
+         * is set -> BadValue
+         */
+        bits = (unsigned char*)&mask[1];
+        mask->mask_len = (nmasks + 3)/4 * 10;
+        memset(bits, 0, mask->mask_len * 4);
+
+        for (j = XI_LASTEVENT + 1; j < mask->mask_len * 4; j++)
+        {
+            SetBit(bits, j);
+            request_XISelectEvent(req, BadValue);
+            ClearBit(bits, j);
+        }
+
+        /* Test 4:
+         * Mask len is a sensible length, only valid bits are set -> Success
+         */
+        bits = (unsigned char*)&mask[1];
+        mask->mask_len = (nmasks + 3)/4;
+        memset(bits, 0, mask->mask_len * 4);
+        for (j = 0; j <= XI_LASTEVENT; j++)
+        {
+            SetBit(bits, j);
+            request_XISelectEvent(req, Success);
+        }
+
+        /* Test 5:
+         * HierarchyChanged bit is BadValue for devices other than
+         * XIAllDevices
+         */
+        bits = (unsigned char*)&mask[1];
+        mask->mask_len = (nmasks + 3)/4;
+        memset(bits, 0, mask->mask_len * 4);
+        SetBit(bits, XI_HierarchyChanged);
+        mask->deviceid = XIAllDevices;
+        request_XISelectEvent(req, Success);
+        for (j = 1; j < devices.num_devices; j++)
+        {
+            mask->deviceid = j;
+            request_XISelectEvent(req, BadValue);
+        }
+
+        /* Test 6:
+         * All bits set minus hierarchy changed bit -> Success
+         */
+        bits = (unsigned char*)&mask[1];
+        mask->mask_len = (nmasks + 3)/4;
+        memset(bits, 0, mask->mask_len * 4);
+        for (j = 0; j <= XI_LASTEVENT; j++)
+            SetBit(bits, j);
+        ClearBit(bits, XI_HierarchyChanged);
+        for (j = 1; j < 6; j++)
+        {
+            mask->deviceid = j;
+            request_XISelectEvent(req, Success);
+        }
+
+        mask = (xXIEventMask*)((char*)mask + sizeof(xXIEventMask) + mask->mask_len * 4);
+    }
+}
+
+static void test_XISelectEvents(void)
+{
+    int i;
+    xXIEventMask *mask;
+    xXISelectEventsReq *req;
+    req = (xXISelectEventsReq*)data;
+
+    request_init(req, XISelectEvents);
+
+    g_test_message("Testing for BadValue on zero-length masks");
+    /* zero masks are BadValue, regardless of the window */
+    req->num_masks = 0;
+
+    req->win = None;
+    request_XISelectEvent(req, BadValue);
+
+    req->win = ROOT_WINDOW_ID;
+    request_XISelectEvent(req, BadValue);
+
+    req->win = CLIENT_WINDOW_ID;
+    request_XISelectEvent(req, BadValue);
+
+    g_test_message("Testing for BadWindow.");
+    /* None window is BadWindow, regardless of the masks.
+     * We don't actually need to set the masks here, BadWindow must occur
+     * before checking the masks.
+     */
+    req->win = None;
+    req->num_masks = 1;
+    request_XISelectEvent(req, BadWindow);
+
+    req->num_masks = 2;
+    request_XISelectEvent(req, BadWindow);
+
+    req->num_masks = 0xFF;
+    request_XISelectEvent(req, BadWindow);
+
+    /* request size is 3, so 0xFFFC is the highest num_mask that doesn't
+     * overflow req->length */
+    req->num_masks = 0xFFFC;
+    request_XISelectEvent(req, BadWindow);
+
+    g_test_message("Triggering num_masks/length overflow");
+    /* Integer overflow - req->length can't hold that much */
+    req->num_masks = 0xFFFF;
+    request_XISelectEvent(req, BadLength);
+
+    /* testing various device ids */
+    req->win = ROOT_WINDOW_ID;
+    req->num_masks = 1;
+
+    g_test_message("Testing existing device ids.");
+    for (i = 0; i < 6; i++)
+    {
+        mask = (xXIEventMask*)&req[1];
+        mask->deviceid = i;
+        mask->mask_len = 1;
+        request_XISelectEvent(req, Success);
+    }
+
+    g_test_message("Testing non-existing device ids.");
+    for (i = 6; i <= 0xFFFF; i++)
+    {
+        req->win = ROOT_WINDOW_ID;
+        req->num_masks = 1;
+        mask = (xXIEventMask*)&req[1];
+        mask->deviceid = i;
+        mask->mask_len = 1;
+        request_XISelectEvent(req, BadDevice);
+    }
+
+    request_XISelectEvents_masks(req);
+}
+
+int main(int argc, char** argv)
+{
+    g_test_init(&argc, &argv,NULL);
+    g_test_bug_base("https://bugzilla.freedesktop.org/show_bug.cgi?id=");
+
+    init_simple();
+
+    g_test_add_func("/xi2/protocol/XISelectEvents", test_XISelectEvents);
+
+    return g_test_run();
+}
+
commit 60b7a7990003a22be5cc26ebe4d8d2d0803b97de
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jun 12 11:33:22 2009 +1000

    test: add ProcXIQueryDevice tests.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/test/xi2/Makefile.am b/test/xi2/Makefile.am
index e9f9a06..58556cb 100644
--- a/test/xi2/Makefile.am
+++ b/test/xi2/Makefile.am
@@ -1,6 +1,7 @@
 if UNITTESTS
 check_PROGRAMS =  \
-	protocol-xiqueryversion
+	protocol-xiqueryversion \
+	protocol-xiquerydevice
 
 TESTS=$(check_PROGRAMS)
 
@@ -10,8 +11,11 @@ TEST_LDADD=../libxservertest.la $(XORG_SYS_LIBS) $(XSERVER_SYS_LIBS) $(GLIB_LIBS
 COMMON_SOURCES=protocol-common.h protocol-common.c
 
 protocol_xiqueryversion_LDADD=$(TEST_LDADD)
+protocol_xiquerydevice_LDADD=$(TEST_LDADD)
 
 protocol_xiqueryversion_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,WriteToClient
+protocol_xiquerydevice_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,WriteToClient
 
 protocol_xiqueryversion_SOURCES=$(COMMON_SOURCES) protocol-xiqueryversion.c
+protocol_xiquerydevice_SOURCES=$(COMMON_SOURCES) protocol-xiquerydevice.c
 endif
diff --git a/test/xi2/protocol-xiquerydevice.c b/test/xi2/protocol-xiquerydevice.c
new file mode 100644
index 0000000..508fc4d
--- /dev/null
+++ b/test/xi2/protocol-xiquerydevice.c
@@ -0,0 +1,316 @@
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ *  Permission is hereby granted, free of charge, to any person obtaining a
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ *  Software is furnished to do so, subject to the following conditions:
+ *
+ *  The above copyright notice and this permission notice (including the next
+ *  paragraph) shall be included in all copies or substantial portions of the
+ *  Software.
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *  DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdint.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/extensions/XI2proto.h>
+#include <X11/Xatom.h>
+#include "inputstr.h"
+#include "extinit.h"
+#include "scrnintstr.h"
+#include "xkbsrv.h"
+
+#include "xiquerydevice.h"
+
+#include "protocol-common.h"
+#include <glib.h>
+/*
+ * Protocol testing for XIQueryDevice request and reply.
+ *
+ * Test approach:
+ * Wrap WriteToClient to intercept server's reply. ProcXIQueryDevice returns
+ * data in two batches, once for the request, once for the trailing data
+ * with the device information.
+ * Repeatedly test with varying deviceids and check against data in reply.
+ */
+
+struct test_data {
+    int which_device;
+    int num_devices_in_reply;
+};
+
+static void reply_XIQueryDevice_data(ClientPtr client, int len, char *data, void *userdata);
+static void reply_XIQueryDevice(ClientPtr client, int len, char* data, void *userdata);
+
+/* reply handling for the first bytes that constitute the reply */
+static void reply_XIQueryDevice(ClientPtr client, int len, char* data, void *userdata)
+{
+    xXIQueryDeviceReply *rep = (xXIQueryDeviceReply*)data;
+    struct test_data *querydata = (struct test_data*)userdata;
+
+    if (client->swapped)
+    {
+        char n;
+        swapl(&rep->length, n);
+        swaps(&rep->sequenceNumber, n);
+        swaps(&rep->num_devices, n);
+    }
+
+    reply_check_defaults(rep, len, XIQueryDevice);
+
+    if (querydata->which_device == XIAllDevices)
+        g_assert(rep->num_devices == devices.num_devices);
+    else if (querydata->which_device == XIAllMasterDevices)
+        g_assert(rep->num_devices == devices.num_master_devices);
+    else
+        g_assert(rep->num_devices == 1);
+
+    querydata->num_devices_in_reply = rep->num_devices;
+    reply_handler = reply_XIQueryDevice_data;
+}
+
+/* reply handling for the trailing bytes that constitute the device info */
+static void reply_XIQueryDevice_data(ClientPtr client, int len, char *data, void *userdata)
+{
+    char n;
+    int i, j;
+    struct test_data *querydata = (struct test_data*)userdata;
+
+    DeviceIntPtr dev;
+    xXIDeviceInfo *info = (xXIDeviceInfo*)data;
+    xXIAnyInfo *any;
+
+    for (i = 0; i < querydata->num_devices_in_reply; i++)
+    {
+        if (client->swapped)
+        {
+            swaps(&info->deviceid, n);
+            swaps(&info->attachment, n);
+            swaps(&info->use, n);
+            swaps(&info->num_classes, n);
+            swaps(&info->name_len, n);
+        }
+
+        if (querydata->which_device > XIAllMasterDevices)
+            g_assert(info->deviceid == querydata->which_device);
+
+        g_assert(info->deviceid >=  2); /* 0 and 1 is reserved */
+
+
+        switch(info->deviceid)
+        {
+            case 2:  /* VCP */
+                dev = devices.vcp;
+                g_assert(info->use == XIMasterPointer);
+                g_assert(info->attachment == devices.vck->id);
+                g_assert(info->num_classes == 3); /* 2 axes + button */
+                break;
+            case 3:  /* VCK */
+                dev = devices.vck;
+                g_assert(info->use == XIMasterKeyboard);
+                g_assert(info->attachment == devices.vcp->id);
+                g_assert(info->num_classes == 1);
+                break;
+            case 4:  /* mouse */
+                dev = devices.mouse;
+                g_assert(info->use == XISlavePointer);
+                g_assert(info->attachment == devices.vcp->id);
+                g_assert(info->num_classes == 3); /* 2 axes + button */
+                break;
+            case 5:  /* keyboard */
+                dev = devices.kbd;
+                g_assert(info->use == XISlaveKeyboard);
+                g_assert(info->attachment == devices.vck->id);
+                g_assert(info->num_classes == 1);
+                break;
+
+            default:
+                /* We shouldn't get here */
+                g_assert(0);
+                break;
+        }
+        g_assert(info->enabled == dev->enabled);
+        g_assert(info->name_len == strlen(dev->name));
+        g_assert(strncmp((char*)&info[1], dev->name, info->name_len) == 0);
+
+        any = (xXIAnyInfo*)((char*)&info[1] + ((info->name_len + 3)/4) * 4);
+        for (j = 0; j < info->num_classes; j++)
+        {
+            if (client->swapped)
+            {
+                swaps(&any->type, n);
+                swaps(&any->length, n);
+                swaps(&any->sourceid, n);
+            }
+
+            switch(info->deviceid)
+            {
+                case 3: /* VCK and kbd have the same properties */
+                case 5:
+                    {
+                        int k;
+                        xXIKeyInfo *ki = (xXIKeyInfo*)any;
+                        XkbDescPtr xkb = devices.vck->key->xkbInfo->desc;
+                        uint32_t *kc;
+
+                        if (client->swapped)
+                            swaps(&ki->num_keycodes, n);
+
+                        g_assert(any->type == XIKeyClass);
+                        g_assert(ki->num_keycodes == (xkb->max_key_code - xkb->min_key_code + 1));
+                        g_assert(any->length == (2 + ki->num_keycodes));
+
+                        kc = (uint32_t*)&ki[1];
+                        for (k = 0; k < ki->num_keycodes; k++, kc++)
+                        {
+                            if (client->swapped)
+                                swapl(kc, n);
+
+                            g_assert(*kc >= xkb->min_key_code);
+                            g_assert(*kc <= xkb->max_key_code);
+                        }
+                        break;
+                    }
+                case 2: /* VCP and mouse have the same properties */
+                case 4:
+                    {
+                        g_assert(any->type == XIButtonClass ||
+                                any->type == XIValuatorClass);
+
+                        if (any->type == XIButtonClass)
+                        {
+                            int len;
+                            xXIButtonInfo *bi = (xXIButtonInfo*)any;
+
+                            if (client->swapped)
+                                swaps(&bi->num_buttons, n);
+
+                            g_assert(bi->num_buttons == devices.vcp->button->numButtons);
+
+                            len = 2 + bi->num_buttons + bytes_to_int32(bits_to_bytes(bi->num_buttons));
+                            g_assert(bi->length == len);
+                        } else if (any->type == XIValuatorClass)
+                        {
+                            xXIValuatorInfo *vi = (xXIValuatorInfo*)any;
+
+                            if (client->swapped)
+                            {
+                                swaps(&vi->number, n);
+                                swapl(&vi->label, n);
+                                swapl(&vi->min.integral, n);
+                                swapl(&vi->min.frac, n);
+                                swapl(&vi->max.integral, n);
+                                swapl(&vi->max.frac, n);
+                                swapl(&vi->resolution, n);
+                            }
+
+                            g_assert(vi->length == 11);
+                            g_assert(vi->number == 0 ||
+                                     vi->number == 1);
+                            g_assert(vi->mode == XIModeRelative);
+                            /* device was set up as relative, so standard
+                             * values here. */
+                            g_assert(vi->min.integral == -1);
+                            g_assert(vi->min.frac == 0);
+                            g_assert(vi->max.integral == -1);
+                            g_assert(vi->max.frac == 0);
+                            g_assert(vi->resolution == 0);
+                        }
+                    }
+                    break;
+            }
+            any = (xXIAnyInfo*)(((char*)any) + any->length * 4);
+        }
+
+        info = (xXIDeviceInfo*)any;
+    }
+}
+
+static void request_XIQueryDevice(struct test_data *querydata,
+                                 int deviceid, int error)
+{
+    int rc;
+    char n;
+    ClientRec client;
+    xXIQueryDeviceReq request;
+
+    request_init(&request, XIQueryDevice);
+    client = init_client(request.length, &request);
+    reply_handler = reply_XIQueryDevice;
+
+    querydata->which_device = deviceid;
+
+    request.deviceid = deviceid;
+    rc = ProcXIQueryDevice(&client);
+    g_assert(rc == error);
+
+    if (rc != Success)
+        g_assert(client.errorValue == deviceid);
+
+    reply_handler = reply_XIQueryDevice;
+
+    client.swapped = TRUE;
+    swaps(&request.length, n);
+    swaps(&request.deviceid, n);
+    rc = SProcXIQueryDevice(&client);
+    g_assert(rc == error);
+
+    if (rc != Success)
+        g_assert(client.errorValue == deviceid);
+}
+
+static void test_XIQueryDevice(void)
+{
+    int i;
+    xXIQueryDeviceReq request;
+    struct test_data data;
+
+    reply_handler = reply_XIQueryDevice;
+    userdata = &data;
+    request_init(&request, XIQueryDevice);
+
+    g_test_message("Testing XIAllDevices.");
+    request_XIQueryDevice(&data, XIAllDevices, Success);
+    g_test_message("Testing XIAllMasterDevices.");
+    request_XIQueryDevice(&data, XIAllMasterDevices, Success);
+
+    g_test_message("Testing existing device ids.");
+    for (i = 2; i < 6; i++)
+        request_XIQueryDevice(&data, i, Success);
+
+    g_test_message("Testing non-existing device ids.");
+    for (i = 6; i <= 0xFFFF; i++)
+        request_XIQueryDevice(&data, i, BadDevice);
+
+
+    reply_handler = NULL;
+
+}
+
+int main(int argc, char** argv)
+{
+    g_test_init(&argc, &argv,NULL);
+    g_test_bug_base("https://bugzilla.freedesktop.org/show_bug.cgi?id=");
+
+    init_simple();
+
+    g_test_add_func("/dix/xi2protocol/XIQueryDevice", test_XIQueryDevice);
+
+    return g_test_run();
+}
+
commit 441c91be05912e2665cc1d3ee72fb70dcd32e7a2
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jun 12 11:32:15 2009 +1000

    test: Add ProcXIQueryVersion tests.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/test/xi2/Makefile.am b/test/xi2/Makefile.am
index 0185c31..e9f9a06 100644
--- a/test/xi2/Makefile.am
+++ b/test/xi2/Makefile.am
@@ -1,6 +1,17 @@
 if UNITTESTS
+check_PROGRAMS =  \
+	protocol-xiqueryversion
+
+TESTS=$(check_PROGRAMS)
+
 AM_CFLAGS = $(DIX_CFLAGS) $(GLIB_CFLAGS) @XORG_CFLAGS@
 INCLUDES = @XORG_INCS@
 TEST_LDADD=../libxservertest.la $(XORG_SYS_LIBS) $(XSERVER_SYS_LIBS) $(GLIB_LIBS)
 COMMON_SOURCES=protocol-common.h protocol-common.c
+
+protocol_xiqueryversion_LDADD=$(TEST_LDADD)
+
+protocol_xiqueryversion_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,WriteToClient
+
+protocol_xiqueryversion_SOURCES=$(COMMON_SOURCES) protocol-xiqueryversion.c
 endif
diff --git a/test/xi2/protocol-xiqueryversion.c b/test/xi2/protocol-xiqueryversion.c
new file mode 100644
index 0000000..46e62ac
--- /dev/null
+++ b/test/xi2/protocol-xiqueryversion.c
@@ -0,0 +1,186 @@
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ *  Permission is hereby granted, free of charge, to any person obtaining a
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ *  Software is furnished to do so, subject to the following conditions:
+ *
+ *  The above copyright notice and this permission notice (including the next
+ *  paragraph) shall be included in all copies or substantial portions of the
+ *  Software.
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *  DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+/*
+ * Protocol testing for XIQueryVersion request and reply.
+ *
+ * Test approach:
+ * Wrap WriteToClient to intercept the server's reply.
+ * Repeatedly test a client/server version combination, compare version in
+ * reply with versions given. Version must be equal to either
+ * server version or client version, whichever is smaller.
+ * Client version less than 2 must return BadValue.
+ */
+
+#include <stdint.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/extensions/XI2proto.h>
+#include "inputstr.h"
+#include "extinit.h" /* for XInputExtensionInit */
+#include "scrnintstr.h"
+#include "xiqueryversion.h"
+
+#include "protocol-common.h"
+#include <glib.h>
+
+extern XExtensionVersion XIVersion;
+
+struct test_data {
+    int major_client;
+    int minor_client;
+    int major_server;
+    int minor_server;
+};
+
+static void reply_XIQueryVersion(ClientPtr client, int len, char* data, void *userdata)
+{
+    xXIQueryVersionReply *rep = (xXIQueryVersionReply*)data;
+    struct test_data *versions = (struct test_data*)userdata;
+    unsigned int sver, cver, ver;
+
+    if (client->swapped)
+    {
+        char n;
+        swapl(&rep->length, n);
+        swaps(&rep->sequenceNumber, n);
+        swaps(&rep->major_version, n);
+        swaps(&rep->minor_version, n);
+    }
+
+    reply_check_defaults(rep, len, XIQueryVersion);
+
+    g_assert(rep->length == 0);
+
+    sver = versions->major_server * 1000 + versions->minor_server;
+    cver = versions->major_client * 1000 + versions->minor_client;
+    ver = rep->major_version * 1000 + rep->minor_version;
+
+    g_assert(ver >= 2000);
+    g_assert((sver > cver) ? ver == cver : ver == sver);
+}
+
+/**
+ * Run a single test with server version smaj.smin and client
+ * version cmaj.cmin. Verify that return code is equal to 'error'.
+ *
+ * Test is run normal, then for a swapped client.
+ */
+static void request_XIQueryVersion(int smaj, int smin, int cmaj, int cmin, int error)
+{
+    char n;
+    int rc;
+    struct test_data versions;
+    xXIQueryVersionReq request;
+    ClientRec client;
+
+    request_init(&request, XIQueryVersion);
+    client = init_client(request.length, &request);
+    userdata = (void*)&versions;
+
+    /* Change the server to support smaj.smin */
+    XIVersion.major_version = smaj;
+    XIVersion.minor_version = smin;
+
+    /* remember versions we send and expect */
+    versions.major_client = cmaj;
+    versions.minor_client = cmin;
+    versions.major_server = XIVersion.major_version;
+    versions.minor_server = XIVersion.minor_version;
+
+    request.major_version = versions.major_client;
+    request.minor_version = versions.minor_client;
+    rc = ProcXIQueryVersion(&client);
+    g_assert(rc == error);
+
+    client.swapped = TRUE;
+
+    swaps(&request.length, n);
+    swaps(&request.major_version, n);
+    swaps(&request.minor_version, n);
+
+    rc = SProcXIQueryVersion(&client);
+    g_assert(rc == error);
+}
+
+/* Client version less than 2.0 must return BadValue, all other combinations
+ * Success */
+static void test_XIQueryVersion(void)
+{
+    reply_handler = reply_XIQueryVersion;
+
+    g_test_message("Server version 2.0 - client versions [1..3].0");
+    /* some simple tests to catch common errors quickly */
+    request_XIQueryVersion(2, 0, 1, 0, BadValue);
+    request_XIQueryVersion(2, 0, 2, 0, Success);
+    request_XIQueryVersion(2, 0, 3, 0, Success);
+
+    g_test_message("Server version 3.0 - client versions [1..3].0");
+    request_XIQueryVersion(3, 0, 1, 0, BadValue);
+    request_XIQueryVersion(3, 0, 2, 0, Success);
+    request_XIQueryVersion(3, 0, 3, 0, Success);
+
+    g_test_message("Server version 2.0 - client versions [1..3].[1..3]");
+    request_XIQueryVersion(2, 0, 1, 1, BadValue);
+    request_XIQueryVersion(2, 0, 2, 2, Success);
+    request_XIQueryVersion(2, 0, 3, 3, Success);
+
+    g_test_message("Server version 2.2 - client versions [1..3].0");
+    request_XIQueryVersion(2, 2, 1, 0, BadValue);
+    request_XIQueryVersion(2, 2, 2, 0, Success);
+    request_XIQueryVersion(2, 2, 3, 0, Success);
+
+#if 0
+    /* this one takes a while */
+    unsigned int cmin, cmaj, smin, smaj;
+
+    g_test_message("Testing all combinations.");
+    for (smaj = 2; smaj <= 0xFFFF; smaj++)
+        for (smin = 0; smin <= 0xFFFF; smin++)
+            for (cmin = 0; cmin <= 0xFFFF; cmin++)
+                for (cmaj = 0; cmaj <= 0xFFFF; cmaj++)
+                {
+                    int error = (cmaj < 2) ? BadValue : Success;
+                    request_XIQueryVersion(smaj, smin, cmaj, cmin, error);
+                }
+
+#endif
+
+    reply_handler = NULL;
+}
+
+int main(int argc, char** argv)
+{
+    g_test_init(&argc, &argv,NULL);
+    g_test_bug_base("https://bugzilla.freedesktop.org/show_bug.cgi?id=");
+
+    init_simple();
+
+    g_test_add_func("/xi2/protocol/XIQueryVersion", test_XIQueryVersion);
+
+    return g_test_run();
+}
commit 1d635ae65b217e124b3bd5a8844e73f447eb1b79
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jun 12 11:30:53 2009 +1000

    test: add xi2 directory, prepare for protocol testing.
    
    These two files provide a couple of common defines, functions and variables
    that will be used in a number of protocol tests.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/configure.ac b/configure.ac
index 25c5c5e..be39c76 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2012,5 +2012,6 @@ hw/kdrive/linux/Makefile
 hw/kdrive/sdl/Makefile
 hw/kdrive/src/Makefile
 test/Makefile
+test/xi2/Makefile
 xorg-server.pc
 ])
diff --git a/test/Makefile.am b/test/Makefile.am
index c5fc4cd..df08b5b 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -1,4 +1,5 @@
 if UNITTESTS
+SUBDIRS= . xi2
 check_PROGRAMS = xkb input
 check_LTLIBRARIES = libxservertest.la
 
diff --git a/test/xi2/Makefile.am b/test/xi2/Makefile.am
new file mode 100644
index 0000000..0185c31
--- /dev/null
+++ b/test/xi2/Makefile.am
@@ -0,0 +1,6 @@
+if UNITTESTS
+AM_CFLAGS = $(DIX_CFLAGS) $(GLIB_CFLAGS) @XORG_CFLAGS@
+INCLUDES = @XORG_INCS@
+TEST_LDADD=../libxservertest.la $(XORG_SYS_LIBS) $(XSERVER_SYS_LIBS) $(GLIB_LIBS)
+COMMON_SOURCES=protocol-common.h protocol-common.c
+endif
diff --git a/test/xi2/protocol-common.c b/test/xi2/protocol-common.c
new file mode 100644
index 0000000..1a4ad24
--- /dev/null
+++ b/test/xi2/protocol-common.c
@@ -0,0 +1,132 @@
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ *  Permission is hereby granted, free of charge, to any person obtaining a
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ *  Software is furnished to do so, subject to the following conditions:
+ *
+ *  The above copyright notice and this permission notice (including the next
+ *  paragraph) shall be included in all copies or substantial portions of the
+ *  Software.
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *  DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdint.h>
+#include "extinit.h" /* for XInputExtensionInit */
+#include <glib.h>
+
+#include "protocol-common.h"
+
+struct devices devices;
+WindowRec root;
+WindowRec window;
+
+void *userdata;
+
+/**
+ * Create and init 2 master devices (VCP + VCK) and two slave devices, one
+ * default mouse, one default keyboard.
+ */
+struct devices init_devices(void)
+{
+    ClientRec client;
+    struct devices devices;
+
+    client = init_client(0, NULL);
+
+    AllocDevicePair(&client, "Virtual core", &devices.vcp, &devices.vck, TRUE);
+    inputInfo.pointer = devices.vcp;
+    inputInfo.keyboard = devices.vck;
+    ActivateDevice(devices.vcp, FALSE);
+    ActivateDevice(devices.vck, FALSE);
+    EnableDevice(devices.vcp, FALSE);
+    EnableDevice(devices.vck, FALSE);
+
+    AllocDevicePair(&client, "", &devices.mouse, &devices.kbd, FALSE);
+    ActivateDevice(devices.mouse, FALSE);
+    ActivateDevice(devices.kbd, FALSE);
+    EnableDevice(devices.mouse, FALSE);
+    EnableDevice(devices.kbd, FALSE);
+
+    devices.num_devices = 4;
+    devices.num_master_devices = 2;
+
+    return devices;
+}
+
+
+/* Create minimal client, with the given buffer and len as request buffer */
+ClientRec init_client(int len, void *data)
+{
+    ClientRec client = { 0 };
+
+    /* we store the privates now and reassign it after the memset. this way
+     * we can share them across multiple test runs and don't have to worry
+     * about freeing them after each test run. */
+    PrivateRec *privates = client.devPrivates;
+
+    client.index = CLIENT_INDEX;
+    client.clientAsMask = CLIENT_MASK;
+    client.sequence = CLIENT_SEQUENCE;
+    client.req_len = len;
+
+    client.requestBuffer = data;
+    client.devPrivates = privates;
+    return client;
+}
+
+void init_window(WindowPtr window, WindowPtr parent, int id)
+{
+    memset(window, 0, sizeof(window));
+
+    window->drawable.id = id;
+    window->parent = parent;
+    window->optional = xcalloc(1, sizeof(WindowOptRec));
+    g_assert(window->optional);
+}
+
+/* Needed for the screen setup, otherwise we crash during sprite initialization */
+static Bool device_cursor_init(DeviceIntPtr dev, ScreenPtr screen) { return TRUE; }
+void init_simple(void)
+{
+    static ScreenRec screen;
+
+    screenInfo.arraySize = MAXSCREENS;
+    screenInfo.numScreens = 1;
+    screenInfo.screens[0] = &screen;
+
+    screen.myNum = 0;
+    screen.id = 100;
+    screen.width = 640;
+    screen.height = 480;
+    screen.DeviceCursorInitialize = device_cursor_init;
+
+    dixResetPrivates();
+    XInputExtensionInit();
+    init_window(&root, NULL, ROOT_WINDOW_ID);
+    init_window(&window, &root, CLIENT_WINDOW_ID);
+
+    devices = init_devices();
+}
+
+void __wrap_WriteToClient(ClientPtr client, int len, void *data)
+{
+    g_assert(reply_handler != NULL);
+
+    (*reply_handler)(client, len, data, userdata);
+}
+
diff --git a/test/xi2/protocol-common.h b/test/xi2/protocol-common.h
new file mode 100644
index 0000000..bf8b875
--- /dev/null
+++ b/test/xi2/protocol-common.h
@@ -0,0 +1,143 @@
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ *  Permission is hereby granted, free of charge, to any person obtaining a
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ *  Software is furnished to do so, subject to the following conditions:
+ *
+ *  The above copyright notice and this permission notice (including the next
+ *  paragraph) shall be included in all copies or substantial portions of the
+ *  Software.
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *  DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include "scrnintstr.h"
+#include "exevents.h"
+
+#ifndef PROTOCOL_COMMON_H
+#define PROTOCOL_COMMON_H
+
+extern int BadDevice;
+
+/* Check default values in a reply */
+#define reply_check_defaults(rep, len, type) \
+    { \
+        g_assert((len) >= sz_x##type##Reply); \
+        g_assert((rep)->repType == X_Reply); \
+        g_assert((rep)->RepType == X_##type); \
+        g_assert((rep)->sequenceNumber == CLIENT_SEQUENCE); \
+        g_assert((rep)->length >= (sz_x##type##Reply - 32)/4); \
+    }
+
+/* initialise default values for request */
+#define request_init(req, type) \
+    { \
+        (req)->reqType = 128; /* doesn't matter */ \
+        (req)->ReqType = X_##type; \
+        (req)->length = (sz_x##type##Req >> 2); \
+    }
+
+
+/* Various defines used in the tests. Some tests may use different values
+ * than these defaults */
+/* default client index */
+#define CLIENT_INDEX            1
+/* default client mask for resources and windows */
+#define CLIENT_MASK             ((CLIENT_INDEX) << CLIENTOFFSET)
+/* default client sequence number for replies */
+#define CLIENT_SEQUENCE         0x100
+/* default root window id */
+#define ROOT_WINDOW_ID          0x10
+/* default client window id */
+#define CLIENT_WINDOW_ID        0x100001
+
+/* Various structs used throughout the tests */
+
+
+/* The default devices struct, contains one pointer + keyboard and the
+ * matching master devices. Initialize with init_devices() if needed. */
+struct devices {
+    DeviceIntPtr vcp;
+    DeviceIntPtr vck;
+    DeviceIntPtr mouse;
+    DeviceIntPtr kbd;
+
+    int num_devices;
+    int num_master_devices;
+} devices;
+
+/**
+ * The set of default devices available in all tests if necessary.
+ */
+extern struct devices devices;
+
+/**
+ * test-specific userdata, passed into the reply handler.
+ */
+extern void *userdata;
+/**
+ * The reply handler called from WriteToClient. Set this handler if you need
+ * to check the reply values.
+ */
+void (*reply_handler)(ClientPtr client, int len, char *data, void *userdata);
+
+/**
+ * Semi-initialized root window. initialized by init().
+ */
+extern WindowRec root;
+/**
+ * Semi-initialized top-level window. initialized by init().
+ */
+extern WindowRec window;
+
+/* various simple functions for quick setup */
+/**
+ * Initialize the above struct with default devices and return the struct.
+ * Usually not needed if you call ::init_simple.
+ */
+struct devices init_devices(void);
+/**
+ * Init a mostly zeroed out client with default values for index and mask.
+ */
+ClientRec init_client(int request_len, void *request_data);
+/**
+ * Init a mostly zeroed out window with the given window ID.
+ * Usually not needed if you call ::init_simple which sets up root and
+ * window.
+ */
+void init_window(WindowPtr window, WindowPtr parent, int id);
+/**
+ * Create a very simple setup that provides the minimum values for most
+ * tests, including a screen, the root and client window and the default
+ * device setup.
+ */
+void init_simple(void);
+
+/* Declarations for various overrides in the test files. */
+void __wrap_WriteToClient(ClientPtr client, int len, void *data);
+void __wrap_XISetEventMask(DeviceIntPtr dev, WindowPtr win, int len, unsigned char* mask);
+int __wrap_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access);
+int __real_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access);
+Bool __wrap_AddResource(XID id, RESTYPE type, pointer value);
+int __wrap_dixLookupClient(ClientPtr *c, XID id, ClientPtr client, Mask access);
+int __real_dixLookupClient(ClientPtr *c, XID id, ClientPtr client, Mask access);
+
+
+#endif /* PROTOCOL_COMMON_H */
+
commit 4b93413b2a490a74de2e27b37268332b609ac872
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jul 14 11:20:01 2009 +1000

    Add test subdir to base Makefile.am
    
    If unittests are enabled, make will build those as well - spotting potential
    build errors in the tests faster. Furthermore, this allows for the tests to
    be run from the top-level directory.
    This patch removes the "run make check to build the test suite" message
    since that'd pop up after every build now.
    
    If unittests are disabled, this change has no effect.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Makefile.am b/Makefile.am
index dea6fa4..4ee1e17 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -38,7 +38,8 @@ SUBDIRS = \
 	$(GLX_DIR) \
 	exa \
 	config \
-	hw
+	hw \
+	test
 
 aclocaldir = $(datadir)/aclocal
 aclocal_DATA = xorg-server.m4
diff --git a/test/Makefile.am b/test/Makefile.am
index dbad93b..c5fc4cd 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -33,7 +33,4 @@ CLEANFILES=libxservertest.c
 libxservertest.c:
 	touch $@
 
-all:
-	@echo "Run 'make check' to run the test suite"
-
 endif
commit e2226f3cd7d1bef598f9657b756a171b02f1a299
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jul 6 14:57:04 2009 +1000

    dbe: switch to byte counting functions
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dbe/dbe.c b/dbe/dbe.c
index b8f61e7..a4f853d 100644
--- a/dbe/dbe.c
+++ b/dbe/dbe.c
@@ -741,7 +741,7 @@ ProcDbeGetVisualInfo(ClientPtr client)
 
     rep.type           = X_Reply;
     rep.sequenceNumber = client->sequence;
-    rep.length         = length >> 2;
+    rep.length         = bytes_to_int32(length);
     rep.m              = count;
 
     if (client->swapped)
commit 3e1a054423c22f0e35f25127dde1ea8263892480
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jul 6 14:24:45 2009 +1000

    record: switch to byte counting functions
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/record/record.c b/record/record.c
index 3c4bb9e..fd88552 100644
--- a/record/record.c
+++ b/record/record.c
@@ -372,7 +372,8 @@ RecordAProtocolElement(RecordContextPtr pContext, ClientPtr pClient,
 
 	replylen = pRep->length;
 	if (recordingClientSwapped) swapl(&replylen, n);
-	replylen += numElemHeaders + (datalen >> 2) + (futurelen >> 2);
+	replylen += numElemHeaders + bytes_to_int32(datalen) +
+            bytes_to_int32(futurelen);
 	if (recordingClientSwapped) swapl(&replylen, n);
 	pRep->length = replylen;
     } /* end if not continued reply */
@@ -480,7 +481,7 @@ RecordABigRequest(RecordContextPtr pContext, ClientPtr client, xReq *stuff)
 			   (pointer)stuff, SIZEOF(xReq), bytesLeft);
 
     /* reinsert the extended length field that was squished out */
-    bigLength = client->req_len + (sizeof(bigLength) >> 2);
+    bigLength = client->req_len + bytes_to_int32(sizeof(bigLength));
     if (client->swapped)
 	swapl(&bigLength, n);
     RecordAProtocolElement(pContext, client, XRecordFromClient,
@@ -2279,8 +2280,8 @@ ProcRecordGetContext(ClientPtr client)
     {
 	rep.nClients += pRCAP->numClients;
 	rep.length += pRCAP->numClients *
-		( (sizeof(xRecordClientInfo) >> 2) +
-		  pri->nRanges * (sizeof(xRecordRange) >> 2));
+		( bytes_to_int32(sizeof(xRecordClientInfo)) +
+		  pri->nRanges * bytes_to_int32(sizeof(xRecordRange)));
     }
 
     /* write the reply header */
@@ -2579,13 +2580,13 @@ SwapCreateRegister(xRecordRegisterClientsReq *stuff)
     swapl(&stuff->nClients, n);
     swapl(&stuff->nRanges, n);
     pClientID = (XID *)&stuff[1];
-    if (stuff->nClients > stuff->length - (sz_xRecordRegisterClientsReq >> 2))
+    if (stuff->nClients > stuff->length - bytes_to_int32(sz_xRecordRegisterClientsReq))
 	return BadLength;
     for (i = 0; i < stuff->nClients; i++, pClientID++)
     {
 	swapl(pClientID, n);
     }
-    if (stuff->nRanges > stuff->length - (sz_xRecordRegisterClientsReq >> 2)
+    if (stuff->nRanges > stuff->length - bytes_to_int32(sz_xRecordRegisterClientsReq)
 	- stuff->nClients)
 	return BadLength;
     RecordSwapRanges((xRecordRange *)pClientID, stuff->nRanges);
commit 089c460058c4e6814d98d40179eb4c731f37fa80
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jul 6 14:22:40 2009 +1000

    xkb: switch to byte counting functions
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/xkb/xkb.c b/xkb/xkb.c
index e4e84ce..c17250a 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -667,8 +667,8 @@ ProcXkbGetControls(ClientPtr client)
     
     xkb = dev->key->xkbInfo->desc->ctrls;
     rep.type = X_Reply;
-    rep.length = (SIZEOF(xkbGetControlsReply)-
-		  SIZEOF(xGenericReply)) >> 2;
+    rep.length = bytes_to_int32(SIZEOF(xkbGetControlsReply)-
+		  SIZEOF(xGenericReply));
     rep.sequenceNumber = client->sequence;
     rep.deviceID = ((DeviceIntPtr)dev)->id;
     rep.numGroups = xkb->num_groups;
commit 0dc11da57562a7bbb6830ab657a2b818c596a537
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jul 6 12:41:29 2009 +1000

    ephyr: switch to byte counting functions
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/kdrive/ephyr/ephyrdriext.c b/hw/kdrive/ephyr/ephyrdriext.c
index 6e915ab..84885d8 100644
--- a/hw/kdrive/ephyr/ephyrdriext.c
+++ b/hw/kdrive/ephyr/ephyrdriext.c
@@ -701,8 +701,8 @@ ProcXF86DRIOpenConnection (register ClientPtr client)
     rep.busIdStringLength = 0;
     if (busIdString)
 	rep.busIdStringLength = strlen(busIdString);
-    rep.length = (SIZEOF(xXF86DRIOpenConnectionReply) - SIZEOF(xGenericReply) +
-                  ((rep.busIdStringLength + 3) & ~3)) >> 2;
+    rep.length = bytes_to_int32(SIZEOF(xXF86DRIOpenConnectionReply) - SIZEOF(xGenericReply) +
+                  pad_to_int32(rep.busIdStringLength));
 
     rep.hSAREALow  = (CARD32)(hSAREA & 0xffffffff);
 #if defined(LONG64) && !defined(__linux__)
@@ -789,9 +789,9 @@ ProcXF86DRIGetClientDriverName (register ClientPtr client)
     rep.clientDriverNameLength = 0;
     if (clientDriverName)
 	rep.clientDriverNameLength = strlen(clientDriverName);
-    rep.length = (SIZEOF(xXF86DRIGetClientDriverNameReply) - 
+    rep.length = bytes_to_int32(SIZEOF(xXF86DRIGetClientDriverNameReply) -
 			SIZEOF(xGenericReply) +
-			((rep.clientDriverNameLength + 3) & ~3)) >> 2;
+			pad_to_int32(rep.clientDriverNameLength));
 
     WriteToClient(client, 
 	sizeof(xXF86DRIGetClientDriverNameReply), (char *)&rep);
@@ -1235,7 +1235,7 @@ ProcXF86DRIGetDrawableInfo (register ClientPtr client)
     EPHYR_LOG ("num host clip rects:%d\n", (int)rep.numClipRects) ;
     EPHYR_LOG ("num host back clip rects:%d\n", (int)rep.numBackClipRects) ;
 
-    rep.length = ((rep.length + 3) & ~3) >> 2;
+    rep.length = bytes_to_int32(rep.length);
 
     WriteToClient(client, sizeof(xXF86DRIGetDrawableInfoReply), (char *)&rep);
 
@@ -1297,9 +1297,9 @@ ProcXF86DRIGetDeviceInfo (register ClientPtr client)
 
     rep.length = 0;
     if (rep.devPrivateSize) {
-        rep.length = (SIZEOF(xXF86DRIGetDeviceInfoReply) - 
+        rep.length = bytes_to_int32(SIZEOF(xXF86DRIGetDeviceInfoReply) -
                 SIZEOF(xGenericReply) +
-                ((rep.devPrivateSize + 3) & ~3)) >> 2;
+                pad_to_int32(rep.devPrivateSize));
     }
 
     WriteToClient(client, sizeof(xXF86DRIGetDeviceInfoReply), (char *)&rep);
diff --git a/hw/kdrive/ephyr/ephyrhostglx.c b/hw/kdrive/ephyr/ephyrhostglx.c
index a05bba2..728687b 100644
--- a/hw/kdrive/ephyr/ephyrhostglx.c
+++ b/hw/kdrive/ephyr/ephyrhostglx.c
@@ -428,7 +428,7 @@ ephyrHostGLXSendClientInfo (int32_t a_major, int32_t a_minor,
     req->minor = a_minor;
 
     size = strlen (a_extension_list) + 1;
-    req->length += (size + 3) >> 2;
+    req->length += bytes_to_int32(size);
     req->numbytes = size;
     Data (dpy, a_extension_list, size);
 
commit 34bfaa9d9ecd90cfe8413bc275179fdcc193eab3
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jul 6 12:29:26 2009 +1000

    xfixes: switch to byte counting functions
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/xfixes/cursor.c b/xfixes/cursor.c
index 534c826..698e4d5 100644
--- a/xfixes/cursor.c
+++ b/xfixes/cursor.c
@@ -488,7 +488,7 @@ ProcXFixesGetCursorName (ClientPtr client)
     len = strlen (str);
     
     reply.type = X_Reply;
-    reply.length = (len + 3) >> 2;
+    reply.length = bytes_to_int32(len);
     reply.sequenceNumber = client->sequence;
     reply.atom = pCursor->name;
     reply.nbytes = len;
@@ -545,7 +545,7 @@ ProcXFixesGetCursorImageAndName (ClientPtr client)
     npixels = width * height;
     name = pCursor->name ? NameForAtom (pCursor->name) : "";
     nbytes = strlen (name);
-    nbytesRound = (nbytes + 3) & ~3;
+    nbytesRound = pad_to_int32(nbytes);
     rep = xalloc (sizeof (xXFixesGetCursorImageAndNameReply) +
 		  npixels * sizeof (CARD32) + nbytesRound);
     if (!rep)
@@ -553,7 +553,7 @@ ProcXFixesGetCursorImageAndName (ClientPtr client)
 
     rep->type = X_Reply;
     rep->sequenceNumber = client->sequence;
-    rep->length = npixels + (nbytesRound >> 2);
+    rep->length = npixels + bytes_to_int32(nbytesRound);
     rep->width = width;
     rep->height = height;
     rep->x = x;
commit e216527107fda470b92b7e526f3db22465962a43
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jul 6 12:27:23 2009 +1000

    render: switch to byte counting functions
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/render/render.c b/render/render.c
index 5622994..0e850e3 100644
--- a/render/render.c
+++ b/render/render.c
@@ -369,7 +369,7 @@ ProcRenderQueryPictFormats (ClientPtr client)
 	return BadAlloc;
     reply->type = X_Reply;
     reply->sequenceNumber = client->sequence;
-    reply->length = (rlength - sizeof(xGenericReply)) >> 2;
+    reply->length = bytes_to_int32(rlength - sizeof(xGenericReply));
     reply->numFormats = nformat;
     reply->numScreens = numScreens;
     reply->numDepths = ndepth;
@@ -537,7 +537,7 @@ ProcRenderQueryPictIndexValues (ClientPtr client)
 
     reply->type = X_Reply;
     reply->sequenceNumber = client->sequence;
-    reply->length = (rlength - sizeof(xGenericReply)) >> 2;
+    reply->length = bytes_to_int32(rlength - sizeof(xGenericReply));
     reply->numIndexValues = num;
 
     values = (xIndexValue *) (reply + 1);
@@ -594,7 +594,7 @@ ProcRenderCreatePicture (ClientPtr client)
 
     if (pFormat->depth != pDrawable->depth)
 	return BadMatch;
-    len = client->req_len - (sizeof(xRenderCreatePictureReq) >> 2);
+    len = client->req_len - bytes_to_int32(sizeof(xRenderCreatePictureReq));
     if (Ones(stuff->mask) != len)
 	return BadLength;
     
@@ -623,7 +623,7 @@ ProcRenderChangePicture (ClientPtr client)
     VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess,
 		    RenderErrBase + BadPicture);
 
-    len = client->req_len - (sizeof(xRenderChangePictureReq) >> 2);
+    len = client->req_len - bytes_to_int32(sizeof(xRenderChangePictureReq));
     if (Ones(stuff->mask) != len)
 	return BadLength;
     
@@ -1235,7 +1235,7 @@ ProcRenderFreeGlyphs (ClientPtr client)
 	client->errorValue = stuff->glyphset;
 	return (rc == BadValue) ? RenderErrBase + BadGlyphSet : rc;
     }
-    nglyph = ((client->req_len << 2) - sizeof (xRenderFreeGlyphsReq)) >> 2;
+    nglyph = bytes_to_int32((client->req_len << 2) - sizeof (xRenderFreeGlyphsReq));
     gids = (CARD32 *) (stuff + 1);
     while (nglyph-- > 0)
     {
@@ -1735,7 +1735,7 @@ ProcRenderQueryFilters (ClientPtr client)
 	    nbytesName += 1 + strlen (ps->filterAliases[i].alias);
 	nnames = ps->nfilters + ps->nfilterAliases;
     }
-    len = ((nnames + 1) >> 1) + ((nbytesName + 3) >> 2);
+    len = ((nnames + 1) >> 1) + bytes_to_int32(nbytesName);
     total_bytes = sizeof (xRenderQueryFiltersReply) + (len << 2);
     reply = (xRenderQueryFiltersReply *) xalloc (total_bytes);
     if (!reply)
@@ -1827,7 +1827,7 @@ ProcRenderSetPictureFilter (ClientPtr client)
     VERIFY_PICTURE (pPicture, stuff->picture, client, DixSetAttrAccess,
 		    RenderErrBase + BadPicture);
     name = (char *) (stuff + 1);
-    params = (xFixed *) (name + ((stuff->nbytes + 3) & ~3));
+    params = (xFixed *) (name + pad_to_int32(stuff->nbytes));
     nparams = ((xFixed *) stuff + client->req_len) - params;
     result = SetPictureFilter (pPicture, name, stuff->nbytes, params, nparams);
     return result;
@@ -1849,7 +1849,7 @@ ProcRenderCreateAnimCursor (ClientPtr client)
     LEGAL_NEW_RESOURCE(stuff->cid, client);
     if (client->req_len & 1)
 	return BadLength;
-    ncursor = (client->req_len - (SIZEOF(xRenderCreateAnimCursorReq) >> 2)) >> 1;
+    ncursor = (client->req_len - (bytes_to_int32(sizeof(xRenderCreateAnimCursorReq)))) >> 1;
     cursors = xalloc (ncursor * (sizeof (CursorPtr) + sizeof (CARD32)));
     if (!cursors)
 	return BadAlloc;
commit 1d6b71b8d0dc24355e84391ba413170a03ccdbf4
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jul 6 12:25:39 2009 +1000

    os: switch to byte counting functions
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/os/access.c b/os/access.c
index 3447876..6576579 100644
--- a/os/access.c
+++ b/os/access.c
@@ -1458,7 +1458,7 @@ GetHosts (
     for (host = validhosts; host; host = host->next)
     {
 	nHosts++;
-	n += (((host->len + 3) >> 2) << 2) + sizeof(xHostEntry);
+	n += pad_to_int32(host->len) + sizeof(xHostEntry);
     }
     if (n)
     {
@@ -1474,7 +1474,7 @@ GetHosts (
 	    ((xHostEntry *)ptr)->length = len;
 	    ptr += sizeof(xHostEntry);
 	    acopy (host->addr, ptr, len);
-	    ptr += ((len + 3) >> 2) << 2;
+	    ptr += pad_to_int32(len);
         }
     } else {
 	*data = NULL;
diff --git a/os/io.c b/os/io.c
index 45e1938..53b37b7 100644
--- a/os/io.c
+++ b/os/io.c
@@ -273,7 +273,7 @@ ReadRequestFromClient(ClientPtr client)
 	    if (gotnow < sizeof(xBigReq))
 	    {
 		/* Still need more data to tell just how big. */
-		needed = sizeof(xBigReq) >> 2; /* needed is in CARD32s now */
+		needed = bytes_to_int32(sizeof(xBigReq)); /* needed is in CARD32s now */
 		need_header = TRUE;
 	    }
 	    else
@@ -377,7 +377,7 @@ ReadRequestFromClient(ClientPtr client)
 	    {
 		move_header = TRUE;
 		if (gotnow < sizeof(xBigReq))
-		    needed = sizeof(xBigReq) >> 2;
+		    needed = bytes_to_int32(sizeof(xBigReq));
 		else
 		    needed = get_big_req_len(request, client);
 	    }
@@ -445,7 +445,7 @@ ReadRequestFromClient(ClientPtr client)
 	oci->bufptr += (sizeof(xBigReq) - sizeof(xReq));
 	*(xReq *)oci->bufptr = *request;
 	oci->lenLastReq -= (sizeof(xBigReq) - sizeof(xReq));
-	client->req_len -= (sizeof(xBigReq) - sizeof(xReq)) >> 2;
+	client->req_len -= bytes_to_int32(sizeof(xBigReq) - sizeof(xReq));
     }
     client->requestBuffer = (pointer)oci->bufptr;
 #ifdef DEBUG_COMMUNICATION
commit 86b239ff9c4d01685c357ca2b1ef761d167e3224
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jul 6 12:24:27 2009 +1000

    randr: switch to byte counting functions
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 32a0992..0e14b36 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -775,7 +775,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
     int			    rc, i, j;
     
     REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigReq);
-    numOutputs = (stuff->length - (SIZEOF (xRRSetCrtcConfigReq) >> 2));
+    numOutputs = (stuff->length - bytes_to_int32(SIZEOF (xRRSetCrtcConfigReq)));
     
     VERIFY_RR_CRTC(stuff->crtc, crtc, DixSetAttrAccess);
 
@@ -1205,7 +1205,7 @@ ProcRRGetCrtcGamma (ClientPtr client)
 
     reply.type = X_Reply;
     reply.sequenceNumber = client->sequence;
-    reply.length = (len + 3) >> 2;
+    reply.length = bytes_to_int32(len);
     reply.size = crtc->gammaSize;
     if (client->swapped) {
 	swaps (&reply.sequenceNumber, n);
@@ -1234,7 +1234,7 @@ ProcRRSetCrtcGamma (ClientPtr client)
     REQUEST_AT_LEAST_SIZE(xRRSetCrtcGammaReq);
     VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
     
-    len = client->req_len - (sizeof (xRRSetCrtcGammaReq) >> 2);
+    len = client->req_len - bytes_to_int32(sizeof (xRRSetCrtcGammaReq));
     if (len < (stuff->size * 3 + 1) >> 1)
 	return BadLength;
 
@@ -1274,7 +1274,7 @@ ProcRRSetCrtcTransform (ClientPtr client)
 
     filter = (char *) (stuff + 1);
     nbytes = stuff->nbytesFilter;
-    params = (xFixed *) (filter + ((nbytes + 3) & ~3));
+    params = (xFixed *) (filter + pad_to_int32(nbytes));
     nparams = ((xFixed *) stuff + client->req_len) - params;
     if (nparams < 0)
 	return BadLength;
@@ -1295,7 +1295,7 @@ transform_filter_length (RRTransformPtr transform)
 	return 0;
     nbytes = strlen (transform->filter->name);
     nparams = transform->nparams;
-    return ((nbytes + 3) & ~3) + (nparams * sizeof (xFixed));
+    return pad_to_int32(nbytes) + (nparams * sizeof (xFixed));
 }
 
 static int
@@ -1334,7 +1334,7 @@ transform_encode (ClientPtr client, xRenderTransform *wire, PictTransform *pict)
 {
     xRenderTransform_from_PictTransform (wire, pict);
     if (client->swapped)
-	SwapLongs ((CARD32 *) wire, sizeof (xRenderTransform) >> 2);
+	SwapLongs ((CARD32 *) wire, bytes_to_int32(sizeof(xRenderTransform)));
 }
 
 int
@@ -1363,7 +1363,7 @@ ProcRRGetCrtcTransform (ClientPtr client)
     extra = (char *) (reply + 1);
     reply->type = X_Reply;
     reply->sequenceNumber = client->sequence;
-    reply->length = (CrtcTransformExtra + nextra) >> 2;
+    reply->length = bytes_to_int32(CrtcTransformExtra + nextra);
 
     reply->hasTransforms = crtc->transforms;
 
diff --git a/randr/rrmode.c b/randr/rrmode.c
index 2a10076..3d053bc 100644
--- a/randr/rrmode.c
+++ b/randr/rrmode.c
@@ -297,10 +297,10 @@ ProcRRCreateMode (ClientPtr client)
     
     modeInfo = &stuff->modeInfo;
     name = (char *) (stuff + 1);
-    units_after = (stuff->length - (sizeof (xRRCreateModeReq) >> 2));
+    units_after = (stuff->length - bytes_to_int32(sizeof (xRRCreateModeReq)));
 
     /* check to make sure requested name fits within the data provided */
-    if ((int) (modeInfo->nameLength + 3) >> 2 > units_after)
+    if (bytes_to_int32(modeInfo->nameLength) > units_after)
 	return BadLength;
 
     mode = RRModeCreateUser (pScreen, modeInfo, name, &error);
diff --git a/randr/rroutput.c b/randr/rroutput.c
index 127497e..2eff8c1 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -455,7 +455,7 @@ ProcRRGetOutputInfo (ClientPtr client)
 
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
-    rep.length = OutputInfoExtra >> 2;
+    rep.length = bytes_to_int32(OutputInfoExtra);
     rep.timestamp = pScrPriv->lastSetTime.milliseconds;
     rep.crtc = output->crtc ? output->crtc->id : None;
     rep.mmWidth = output->mmWidth;
@@ -468,14 +468,14 @@ ProcRRGetOutputInfo (ClientPtr client)
     rep.nClones = output->numClones;
     rep.nameLength = output->nameLength;
     
-    extraLen = ((output->numCrtcs + 
+    extraLen = ((output->numCrtcs +
 		 output->numModes + output->numUserModes +
 		 output->numClones +
-		 ((rep.nameLength + 3) >> 2)) << 2);
+		 bytes_to_int32(rep.nameLength)) << 2);
 
     if (extraLen)
     {
-	rep.length += extraLen >> 2;
+	rep.length += bytes_to_int32(extraLen);
 	extra = xalloc (extraLen);
 	if (!extra)
 	    return BadAlloc;
diff --git a/randr/rrproperty.c b/randr/rrproperty.c
index 775d9e2..6187b85 100644
--- a/randr/rrproperty.c
+++ b/randr/rrproperty.c
@@ -429,7 +429,7 @@ ProcRRListOutputProperties (ClientPtr client)
             return(BadAlloc);
 
     rep.type = X_Reply;
-    rep.length = (numProps * sizeof(Atom)) >> 2;
+    rep.length = bytes_to_int32(numProps * sizeof(Atom));
     rep.sequenceNumber = client->sequence;
     rep.nAtoms = numProps;
     if (client->swapped) 
@@ -510,7 +510,7 @@ ProcRRConfigureOutputProperty (ClientPtr client)
 
     VERIFY_RR_OUTPUT(stuff->output, output, DixReadAccess);
     
-    num_valid = stuff->length - (sizeof (xRRConfigureOutputPropertyReq) >> 2);
+    num_valid = stuff->length - bytes_to_int32(sizeof (xRRConfigureOutputPropertyReq));
     return RRConfigureOutputProperty (output, stuff->property,
 				      stuff->pending, stuff->range,
 				      FALSE, num_valid, 
@@ -544,7 +544,7 @@ ProcRRChangeOutputProperty (ClientPtr client)
         return BadValue;
     }
     len = stuff->nUnits;
-    if (len > ((0xffffffff - sizeof(xChangePropertyReq)) >> 2))
+    if (len > bytes_to_int32((0xffffffff - sizeof(xChangePropertyReq))))
 	return BadLength;
     sizeInBytes = format>>3;
     totalSize = len * sizeInBytes;
@@ -708,7 +708,7 @@ ProcRRGetOutputProperty (ClientPtr client)
     }
     reply.bytesAfter = n - (ind + len);
     reply.format = prop_value->format;
-    reply.length = (len + 3) >> 2;
+    reply.length = bytes_to_int32(len);
     if (prop_value->format)
 	reply.nItems = len / (prop_value->format / 8);
     else
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index a919ffd..97b8b96 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -381,8 +381,8 @@ rrGetScreenResources(ClientPtr client, Bool query)
 
 	rep.length = (pScrPriv->numCrtcs + 
 		      pScrPriv->numOutputs + 
-		      num_modes * (SIZEOF(xRRModeInfo) >> 2) +
-		      ((rep.nbytesNames + 3) >> 2));
+		      num_modes * bytes_to_int32(SIZEOF(xRRModeInfo)) +
+		      bytes_to_int32(rep.nbytesNames));
 	
 	extraLen = rep.length << 2;
 	if (extraLen)
@@ -455,7 +455,7 @@ rrGetScreenResources(ClientPtr client, Bool query)
 	    names += mode->mode.nameLength;
 	}
     	xfree (modes);
-	assert (((((char *) names - (char *) extra) + 3) >> 2) == rep.length);
+	assert (bytes_to_int32((char *) names - (char *) extra) == rep.length);
     }
     
     if (client->swapped) {
@@ -726,7 +726,7 @@ ProcRRGetScreenInfo (ClientPtr client)
 	if (data8 - (CARD8 *) extra != extraLen)
 	    FatalError ("RRGetScreenInfo bad extra len %ld != %ld\n",
 			(unsigned long)(data8 - (CARD8 *) extra), extraLen);
-	rep.length =  (extraLen + 3) >> 2;
+	rep.length =  bytes_to_int32(extraLen);
     }
     if (client->swapped) {
 	swaps(&rep.sequenceNumber, n);
diff --git a/randr/rrsdispatch.c b/randr/rrsdispatch.c
index f6821c3..e16090a 100644
--- a/randr/rrsdispatch.c
+++ b/randr/rrsdispatch.c
@@ -375,10 +375,10 @@ SProcRRSetCrtcTransform (ClientPtr client)
     REQUEST_AT_LEAST_SIZE(xRRSetCrtcTransformReq);
     swaps(&stuff->length, n);
     swapl(&stuff->crtc, n);
-    SwapLongs((CARD32 *)&stuff->transform, (sizeof(xRenderTransform)) >> 2);
+    SwapLongs((CARD32 *)&stuff->transform, bytes_to_int32(sizeof(xRenderTransform)));
     swaps(&stuff->nbytesFilter, n);
     filter = (char *)(stuff + 1);
-    params = (CARD32 *) (filter + ((stuff->nbytesFilter + 3) & ~3));
+    params = (CARD32 *) (filter + pad_to_int32(stuff->nbytesFilter));
     nparams = ((CARD32 *) stuff + client->req_len) - params;
     if (nparams < 0)
 	return BadLength;
diff --git a/randr/rrxinerama.c b/randr/rrxinerama.c
index d81a857..97be7c1 100644
--- a/randr/rrxinerama.c
+++ b/randr/rrxinerama.c
@@ -313,7 +313,7 @@ ProcRRXineramaQueryScreens(ClientPtr client)
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
     rep.number = RRXineramaScreenCount (pScreen);
-    rep.length = rep.number * sz_XineramaScreenInfo >> 2;
+    rep.length = bytes_to_int32(rep.number * sz_XineramaScreenInfo);
     if(client->swapped) {
 	register int n;
 	swaps(&rep.sequenceNumber, n);
commit 7b9e84e320a6f6449fe7bc58a8d6a094ae37b86c
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jul 6 12:20:21 2009 +1000

    Xext: switch to byte counting functions
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xext/mbuf.c b/Xext/mbuf.c
index 09399b6..55e732a 100644
--- a/Xext/mbuf.c
+++ b/Xext/mbuf.c
@@ -430,7 +430,7 @@ ProcCreateImageBuffers (client)
     int				len, nbuf, i, err, rc;
 
     REQUEST_AT_LEAST_SIZE (xMbufCreateImageBuffersReq);
-    len = stuff->length - (sizeof(xMbufCreateImageBuffersReq) >> 2);
+    len = stuff->length - bytes_to_int32(sizeof(xMbufCreateImageBuffersReq));
     if (len == 0)
 	return BadLength;
     rc = dixLookupWindow(&pWin, stuff->window, client, DixUnknownAccess);
@@ -498,7 +498,7 @@ ProcDisplayImageBuffers (client)
     
 
     REQUEST_AT_LEAST_SIZE (xMbufDisplayImageBuffersReq);
-    nbuf = stuff->length - (sizeof (xMbufDisplayImageBuffersReq) >> 2);
+    nbuf = stuff->length - bytes_to_int32(sizeof (xMbufDisplayImageBuffersReq));
     if (!nbuf)
 	return Success;
     minDelay = stuff->minDelay;
@@ -592,7 +592,7 @@ ProcSetMBufferAttributes (client)
     pMultibuffers = (MultibuffersPtr)LookupIDByType (pWin->drawable.id, MultibuffersResType);
     if (!pMultibuffers)
 	return BadMatch;
-    len = stuff->length - (sizeof (xMbufSetMBufferAttributesReq) >> 2);
+    len = stuff->length - bytes_to_int32(sizeof (xMbufSetMBufferAttributesReq));
     vmask = stuff->valueMask;
     if (len != Ones (vmask))
 	return BadLength;
@@ -687,7 +687,7 @@ ProcSetBufferAttributes (client)
     pMultibuffer = (MultibufferPtr) LookupIDByType (stuff->buffer, MultibufferResType);
     if (!pMultibuffer)
 	return MultibufferErrorBase + MultibufferBadBuffer;
-    len = stuff->length - (sizeof (xMbufSetBufferAttributesReq) >> 2);
+    len = stuff->length - bytes_to_int32(sizeof (xMbufSetBufferAttributesReq));
     vmask = stuff->valueMask;
     if (len != Ones (vmask))
 	return BadLength;
@@ -787,7 +787,7 @@ ProcGetBufferInfo (client)
 
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
-    rep.length = nInfo * (sizeof (xMbufBufferInfo) >> 2);
+    rep.length = nInfo * bytes_to_int32(sizeof (xMbufBufferInfo));
     rep.normalInfo = nInfo;
     rep.stereoInfo = 0;
     if (client->swapped)
diff --git a/Xext/panoramiX.c b/Xext/panoramiX.c
index 4ab6f6b..c5fb700 100644
--- a/Xext/panoramiX.c
+++ b/Xext/panoramiX.c
@@ -669,7 +669,7 @@ Bool PanoramiXCreateConnectionBlock(void)
 	length += (depth->nVisuals * sizeof(xVisualType));
     }
 
-    connSetupPrefix.length = length >> 2;
+    connSetupPrefix.length = bytes_to_int32(length);
 
     for (i = 0; i < PanoramiXNumDepths; i++)
 	xfree(PanoramiXDepths[i].vids);
@@ -1053,7 +1053,7 @@ ProcXineramaQueryScreens(ClientPtr client)
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
     rep.number = (noPanoramiXExtension) ? 0 : PanoramiXNumScreens;
-    rep.length = rep.number * sz_XineramaScreenInfo >> 2;
+    rep.length = bytes_to_int32(rep.number * sz_XineramaScreenInfo);
     if (client->swapped) {
 	int n;
 	swaps (&rep.sequenceNumber, n);
diff --git a/Xext/panoramiXprocs.c b/Xext/panoramiXprocs.c
index 8b51009..6834efb 100644
--- a/Xext/panoramiXprocs.c
+++ b/Xext/panoramiXprocs.c
@@ -74,7 +74,7 @@ int PanoramiXCreateWindow(ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xCreateWindowReq);
     
-    len = client->req_len - (sizeof(xCreateWindowReq) >> 2);
+    len = client->req_len - bytes_to_int32(sizeof(xCreateWindowReq));
     if (Ones(stuff->mask) != len)
         return BadLength;
 
@@ -179,7 +179,7 @@ int PanoramiXChangeWindowAttributes(ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xChangeWindowAttributesReq);
     
-    len = client->req_len - (sizeof(xChangeWindowAttributesReq) >> 2);
+    len = client->req_len - bytes_to_int32(sizeof(xChangeWindowAttributesReq));
     if (Ones(stuff->valueMask) != len)
         return BadLength;
 
@@ -456,7 +456,7 @@ int PanoramiXConfigureWindow(ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xConfigureWindowReq);
 
-    len = client->req_len - (sizeof(xConfigureWindowReq) >> 2);
+    len = client->req_len - bytes_to_int32(sizeof(xConfigureWindowReq));
     if (Ones(stuff->mask) != len)
         return BadLength;
 
@@ -734,7 +734,7 @@ int PanoramiXCreateGC(ClientPtr client)
     REQUEST_AT_LEAST_SIZE(xCreateGCReq);
     
     client->errorValue = stuff->gc;
-    len = client->req_len - (sizeof(xCreateGCReq) >> 2);
+    len = client->req_len - bytes_to_int32(sizeof(xCreateGCReq));
     if (Ones(stuff->mask) != len)
         return BadLength;
 
@@ -813,7 +813,7 @@ int PanoramiXChangeGC(ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xChangeGCReq);
     
-    len = client->req_len - (sizeof(xChangeGCReq) >> 2);
+    len = client->req_len - bytes_to_int32(sizeof(xChangeGCReq));
     if (Ones(stuff->mask) != len)
         return BadLength;
 
@@ -1299,7 +1299,7 @@ int PanoramiXPolyPoint(ClientPtr client)
 	return (result == BadValue) ? BadGC : result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-    npoint = ((client->req_len << 2) - sizeof(xPolyPointReq)) >> 2;
+    npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyPointReq));
     if (npoint > 0) {
         origPts = xalloc(npoint * sizeof(xPoint));
         memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint));
@@ -1359,7 +1359,7 @@ int PanoramiXPolyLine(ClientPtr client)
 	return (result == BadValue) ? BadGC : result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-    npoint = ((client->req_len << 2) - sizeof(xPolyLineReq)) >> 2;
+    npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyLineReq));
     if (npoint > 0){
         origPts = xalloc(npoint * sizeof(xPoint));
         memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint));
@@ -1605,7 +1605,7 @@ int PanoramiXFillPoly(ClientPtr client)
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
-    count = ((client->req_len << 2) - sizeof(xFillPolyReq)) >> 2;
+    count = bytes_to_int32((client->req_len << 2) - sizeof(xFillPolyReq));
     if (count > 0){
 	locPts = xalloc(count * sizeof(DDXPointRec));
 	memcpy((char *)locPts, (char *)&stuff[1], count * sizeof(DDXPointRec));
@@ -1895,7 +1895,7 @@ int PanoramiXGetImage(ClientPtr client)
 
     }
 
-    xgi.length = (length + 3) >> 2;
+    xgi.length = bytes_to_int32(length);
 
     if (widthBytesLine == 0 || h == 0)
 	linesPerBuf = 0;
diff --git a/Xext/saver.c b/Xext/saver.c
index b59f769..06dbc73 100644
--- a/Xext/saver.c
+++ b/Xext/saver.c
@@ -875,7 +875,7 @@ ScreenSaverSetAttributes (ClientPtr client)
     if (ret != Success)
 	return ret;
 
-    len = stuff->length -  (sizeof(xScreenSaverSetAttributesReq) >> 2);
+    len = stuff->length -  bytes_to_int32(sizeof(xScreenSaverSetAttributesReq));
     if (Ones(stuff->mask) != len)
         return BadLength;
     if (!stuff->width || !stuff->height)
@@ -1267,7 +1267,7 @@ ProcScreenSaverSetAttributes (ClientPtr client)
        if (status != Success)
            return (status == BadValue) ? BadDrawable : status;
 
-       len = stuff->length -  (sizeof(xScreenSaverSetAttributesReq) >> 2);
+       len = stuff->length -  bytes_to_int32(sizeof(xScreenSaverSetAttributesReq));
        if (Ones(stuff->mask) != len)
            return BadLength;
 
diff --git a/Xext/security.c b/Xext/security.c
index bae95a3..8b72e17 100644
--- a/Xext/security.c
+++ b/Xext/security.c
@@ -450,9 +450,9 @@ ProcSecurityGenerateAuthorization(
     /* check request length */
 
     REQUEST_AT_LEAST_SIZE(xSecurityGenerateAuthorizationReq);
-    len = SIZEOF(xSecurityGenerateAuthorizationReq) >> 2;
-    len += (stuff->nbytesAuthProto + (unsigned)3) >> 2;
-    len += (stuff->nbytesAuthData  + (unsigned)3) >> 2;
+    len = bytes_to_int32(SIZEOF(xSecurityGenerateAuthorizationReq));
+    len += bytes_to_int32(stuff->nbytesAuthProto);
+    len += bytes_to_int32(stuff->nbytesAuthData);
     values = ((CARD32 *)stuff) + len;
     len += Ones(stuff->valueMask);
     if (client->req_len != len)
@@ -520,7 +520,7 @@ ProcSecurityGenerateAuthorization(
     }
 
     protoname = (char *)&stuff[1];
-    protodata = protoname + ((stuff->nbytesAuthProto + (unsigned)3) >> 2);
+    protodata = protoname + bytes_to_int32(stuff->nbytesAuthProto);
 
     /* call os layer to generate the authorization */
 
@@ -580,7 +580,7 @@ ProcSecurityGenerateAuthorization(
     /* tell client the auth id and data */
 
     rep.type = X_Reply;
-    rep.length = (authdata_len + 3) >> 2;
+    rep.length = bytes_to_int32(authdata_len);
     rep.sequenceNumber = client->sequence;
     rep.authId = authId;
     rep.dataLength = authdata_len;
@@ -688,10 +688,10 @@ SProcSecurityGenerateAuthorization(
     swaps(&stuff->nbytesAuthProto, n);
     swaps(&stuff->nbytesAuthData, n);
     swapl(&stuff->valueMask, n);
-    values_offset = ((stuff->nbytesAuthProto + (unsigned)3) >> 2) +
-		    ((stuff->nbytesAuthData + (unsigned)3) >> 2);
+    values_offset = bytes_to_int32(stuff->nbytesAuthProto) +
+		    bytes_to_int32(stuff->nbytesAuthData);
     if (values_offset > 
-	stuff->length - (sz_xSecurityGenerateAuthorizationReq >> 2))
+	stuff->length - bytes_to_int32(sz_xSecurityGenerateAuthorizationReq))
 	return BadLength;
     values = (CARD32 *)(&stuff[1]) + values_offset;
     nvalues = (((CARD32 *)stuff) + stuff->length) - values;
diff --git a/Xext/shape.c b/Xext/shape.c
index 5977296..a5ae455 100644
--- a/Xext/shape.c
+++ b/Xext/shape.c
@@ -1069,7 +1069,7 @@ ProcShapeGetRectangles (ClientPtr client)
     }
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
-    rep.length = (nrects * sizeof (xRectangle)) >> 2;
+    rep.length = bytes_to_int32(nrects * sizeof (xRectangle));
     rep.ordering = YXBanded;
     rep.nrects = nrects;
     if (client->swapped) {
diff --git a/Xext/sync.c b/Xext/sync.c
index d7ab63c..a38ec7b 100644
--- a/Xext/sync.c
+++ b/Xext/sync.c
@@ -1179,7 +1179,7 @@ ProcSyncListSystemCounters(ClientPtr client)
     {
 	char *name = SysCounterList[i]->pSysCounterInfo->name;
 	/* pad to 4 byte boundary */
-	len += (sz_xSyncSystemCounter + strlen(name) + 3) & ~3;
+	len += pad_to_int32(sz_xSyncSystemCounter + strlen(name));
     }
 
     if (len)
@@ -1189,7 +1189,7 @@ ProcSyncListSystemCounters(ClientPtr client)
 	    return BadAlloc;
     }
 
-    rep.length = len >> 2;
+    rep.length = bytes_to_int32(len);
 
     if (client->swapped)
     {
@@ -1223,7 +1223,7 @@ ProcSyncListSystemCounters(ClientPtr client)
 	pname_in_reply = ((char *)walklist) + sz_xSyncSystemCounter;
 	strncpy(pname_in_reply, psci->name, namelen);
 	walklist = (xSyncSystemCounter *) (((char *)walklist) +
-				((sz_xSyncSystemCounter + namelen + 3) & ~3));
+				pad_to_int32(sz_xSyncSystemCounter + namelen));
     }
 
     WriteToClient(client, sizeof(rep), (char *) &rep);
@@ -1600,7 +1600,7 @@ ProcSyncCreateAlarm(ClientPtr client)
     LEGAL_NEW_RESOURCE(stuff->id, client);
 
     vmask = stuff->valueMask;
-    len = client->req_len - (sizeof(xSyncCreateAlarmReq) >> 2);
+    len = client->req_len - bytes_to_int32(sizeof(xSyncCreateAlarmReq));
     /* the "extra" call to Ones accounts for the presence of 64 bit values */
     if (len != (Ones(vmask) + Ones(vmask & (XSyncCAValue|XSyncCADelta))))
 	return BadLength;
@@ -1681,7 +1681,7 @@ ProcSyncChangeAlarm(ClientPtr client)
 	return (status == BadValue) ? SyncErrorBase + XSyncBadAlarm : status;
 
     vmask = stuff->valueMask;
-    len = client->req_len - (sizeof(xSyncChangeAlarmReq) >> 2);
+    len = client->req_len - bytes_to_int32(sizeof(xSyncChangeAlarmReq));
     /* the "extra" call to Ones accounts for the presence of 64 bit values */
     if (len != (Ones(vmask) + Ones(vmask & (XSyncCAValue|XSyncCADelta))))
 	return BadLength;
@@ -1720,7 +1720,7 @@ ProcSyncQueryAlarm(ClientPtr client)
 	return (rc == BadValue) ? SyncErrorBase + XSyncBadAlarm : rc;
 
     rep.type = X_Reply;
-    rep.length = (sizeof(xSyncQueryAlarmReply) - sizeof(xGenericReply)) >> 2;
+    rep.length = bytes_to_int32(sizeof(xSyncQueryAlarmReply) - sizeof(xGenericReply));
     rep.sequenceNumber = client->sequence;
 
     pTrigger = &pAlarm->trigger;
diff --git a/Xext/xf86bigfont.c b/Xext/xf86bigfont.c
index 7d4c697..9e0b5ea 100644
--- a/Xext/xf86bigfont.c
+++ b/Xext/xf86bigfont.c
@@ -629,7 +629,7 @@ ProcXF86BigfontQueryFont(
 	    return BadAlloc;
 	}
 	reply->type = X_Reply;
-	reply->length = (rlength - sizeof(xGenericReply)) >> 2;
+	reply->length = bytes_to_int32(rlength - sizeof(xGenericReply));
 	reply->sequenceNumber = client->sequence;
 	reply->minBounds = pFont->info.ink_minbounds;
 	reply->maxBounds = pFont->info.ink_maxbounds;
diff --git a/Xext/xres.c b/Xext/xres.c
index 5c04c11..9dd08b1 100644
--- a/Xext/xres.c
+++ b/Xext/xres.c
@@ -75,7 +75,7 @@ ProcXResQueryClients (ClientPtr client)
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
     rep.num_clients = num_clients;
-    rep.length = rep.num_clients * sz_xXResClient >> 2;
+    rep.length = bytes_to_int32(rep.num_clients * sz_xXResClient);
     if (client->swapped) {
         int n;
         swaps (&rep.sequenceNumber, n);
@@ -144,7 +144,7 @@ ProcXResQueryClientResources (ClientPtr client)
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
     rep.num_types = num_types;
-    rep.length = rep.num_types * sz_xXResType >> 2;
+    rep.length = bytes_to_int32(rep.num_types * sz_xXResType);
     if (client->swapped) {
         int n;
         swaps (&rep.sequenceNumber, n);
diff --git a/Xext/xselinux.c b/Xext/xselinux.c
index 8054230..d718951 100644
--- a/Xext/xselinux.c
+++ b/Xext/xselinux.c
@@ -1283,7 +1283,7 @@ SELinuxSendContextReply(ClientPtr client, security_id_t sid)
     }
 
     rep.type = X_Reply;
-    rep.length = (len + 3) >> 2;
+    rep.length = bytes_to_int32(len);
     rep.sequenceNumber = client->sequence;
     rep.context_len = len;
 
@@ -1510,8 +1510,8 @@ SELinuxPopulateItem(SELinuxListItemRec *i, PrivateRec **privPtr, CARD32 id,
 	return BadValue;
 
     i->id = id;
-    i->octx_len = (strlen(i->octx) + 4) >> 2;
-    i->dctx_len = (strlen(i->dctx) + 4) >> 2;
+    i->octx_len = bytes_to_int32(strlen(i->octx) + 1);
+    i->dctx_len = bytes_to_int32(strlen(i->dctx) + 1);
 
     *size += i->octx_len + i->dctx_len + 3;
     return Success;
diff --git a/Xext/xvdisp.c b/Xext/xvdisp.c
index fcb61e4..3bff2ec 100644
--- a/Xext/xvdisp.c
+++ b/Xext/xvdisp.c
@@ -423,12 +423,12 @@ ProcXvQueryAdaptors(ClientPtr client)
   pa = pxvs->pAdaptors;
   while (na--)
     {
-      totalSize += (strlen(pa->name) + 3) & ~3;
+      totalSize += pad_to_int32(strlen(pa->name));
       totalSize += pa->nFormats * sz_xvFormat;
       pa++;
     }
 
-  rep.length = totalSize >> 2;
+  rep.length = bytes_to_int32(totalSize);
 
   _WriteQueryAdaptorsReply(client, &rep);
 
@@ -498,11 +498,11 @@ ProcXvQueryEncodings(ClientPtr client)
   totalSize = ne * sz_xvEncodingInfo;
   while (ne--)
     {
-      totalSize += (strlen(pe->name) + 3) & ~3;
+      totalSize += pad_to_int32(strlen(pe->name));
       pe++;
     }
 
-  rep.length = totalSize >> 2;
+  rep.length = bytes_to_int32(totalSize);
 
   _WriteQueryEncodingsReply(client, &rep);
 
@@ -923,7 +923,7 @@ ProcXvQueryPortAttributes(ClientPtr client)
   for(i = 0, pAtt = pPort->pAdaptor->pAttributes; 
       i < pPort->pAdaptor->nAttributes; i++, pAtt++) 
   {    
-      rep.text_size += (strlen(pAtt->name) + 1 + 3) & ~3L;
+      rep.text_size += pad_to_int32(strlen(pAtt->name) + 1);
   }
 
   rep.length = (pPort->pAdaptor->nAttributes * sz_xvAttributeInfo)
@@ -939,7 +939,7 @@ ProcXvQueryPortAttributes(ClientPtr client)
       Info.flags = pAtt->flags;
       Info.min = pAtt->min_value;
       Info.max = pAtt->max_value;
-      Info.size = (size + 3) & ~3L;
+      Info.size = pad_to_int32(size);
 
       _WriteAttributeInfo(client, &Info);
 
@@ -999,7 +999,7 @@ ProcXvPutImage(ClientPtr client)
   size = (*pPort->pAdaptor->ddQueryImageAttributes)(client, 
 			pPort, pImage, &width, &height, NULL, NULL);
   size += sizeof(xvPutImageReq);
-  size = (size + 3) >> 2;
+  size = bytes_to_int32(size);
   
   if((width < stuff->width) || (height < stuff->height))
      return BadValue;
@@ -1203,7 +1203,7 @@ ProcXvListImageFormats(ClientPtr client)
   rep.type = X_Reply;
   rep.sequenceNumber = client->sequence;
   rep.num_formats = pPort->pAdaptor->nImages;
-  rep.length = pPort->pAdaptor->nImages * sz_xvImageFormatInfo >> 2;
+  rep.length = bytes_to_int32(pPort->pAdaptor->nImages * sz_xvImageFormatInfo);
 
   _WriteListImageFormatsReply(client, &rep);
 
diff --git a/Xext/xvmc.c b/Xext/xvmc.c
index 879a222..b7bb0fc 100644
--- a/Xext/xvmc.c
+++ b/Xext/xvmc.c
@@ -153,7 +153,7 @@ ProcXvMCListSurfaceTypes(ClientPtr client)
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
     rep.num = (adaptor) ? adaptor->num_surfaces : 0;
-    rep.length = rep.num * sizeof(xvmcSurfaceInfo) >> 2;
+    rep.length = bytes_to_int32(rep.num * sizeof(xvmcSurfaceInfo));
  
     WriteToClient(client, sizeof(xvmcListSurfaceTypesReply), (char*)&rep);
 
@@ -519,7 +519,7 @@ ProcXvMCListSubpictureTypes(ClientPtr client)
     if(surface->compatible_subpictures) 
 	rep.num = surface->compatible_subpictures->num_xvimages;
 
-    rep.length = rep.num * sizeof(xvImageFormatInfo) >> 2;
+    rep.length = bytes_to_int32(rep.num * sizeof(xvImageFormatInfo));
 
     WriteToClient(client, sizeof(xvmcListSubpictureTypesReply), (char*)&rep);
 
@@ -588,8 +588,8 @@ ProcXvMCGetDRInfo(ClientPtr client)
     rep.major = pScreenPriv->major;
     rep.minor = pScreenPriv->minor;
     rep.patchLevel = pScreenPriv->patchLevel;
-    rep.nameLen = (strlen(pScreenPriv->clientDriverName) + 4) >> 2;
-    rep.busIDLen = (strlen(pScreenPriv->busID) + 4) >> 2;
+    rep.nameLen = bytes_to_int32(strlen(pScreenPriv->clientDriverName) + 1);
+    rep.busIDLen = bytes_to_int32(strlen(pScreenPriv->busID) + 1);
 
     rep.length = rep.nameLen + rep.busIDLen;
     rep.nameLen <<=2;
commit aa19d355125a10b1a385c8f134d68e79d3d609c7
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jul 10 14:25:22 2009 +1000

    xwin: switch to byte counting functions
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xwin/wincursor.c b/hw/xwin/wincursor.c
index bda057b..ce98162 100644
--- a/hw/xwin/wincursor.c
+++ b/hw/xwin/wincursor.c
@@ -43,8 +43,6 @@
 
 extern Bool	g_fSoftwareCursor;
 
-#define BYTE_COUNT(x) (((x) + 7) / 8)
-
 #define BRIGHTNESS(x) (x##Red * 0.299 + x##Green * 0.587 + x##Blue * 0.114)
 
 #if 0
@@ -199,7 +197,7 @@ winLoadCursor (ScreenPtr pScreen, CursorPtr pCursor, int screen)
   /* Get the number of bytes required to store the whole cursor image 
    * This is roughly (sm_cx * sm_cy) / 8 
    * round up to 8 pixel boundary so we can convert whole bytes */
-  nBytes = BYTE_COUNT(pScreenPriv->cursor.sm_cx) * pScreenPriv->cursor.sm_cy;
+  nBytes = bits_to_bytes(pScreenPriv->cursor.sm_cx) * pScreenPriv->cursor.sm_cy;
 
   /* Get the effective width and height */
   nCX = min(pScreenPriv->cursor.sm_cx, pCursor->bits->width);
@@ -214,11 +212,11 @@ winLoadCursor (ScreenPtr pScreen, CursorPtr pCursor, int screen)
    * The first is for an empty mask */
   if (pCursor->bits->emptyMask)
     {
-      int x, y, xmax = BYTE_COUNT(nCX);
+      int x, y, xmax = bits_to_bytes(nCX);
       for (y = 0; y < nCY; ++y)
 	for (x = 0; x < xmax; ++x)
 	  {
-	    int nWinPix = BYTE_COUNT(pScreenPriv->cursor.sm_cx) * y + x;
+	    int nWinPix = bits_to_bytes(pScreenPriv->cursor.sm_cx) * y + x;
 	    int nXPix = BitmapBytePad(pCursor->bits->width) * y + x;
 
 	    pAnd[nWinPix] = 0;
@@ -230,11 +228,11 @@ winLoadCursor (ScreenPtr pScreen, CursorPtr pCursor, int screen)
     }
   else
     {
-      int x, y, xmax = BYTE_COUNT(nCX);
+      int x, y, xmax = bits_to_bytes(nCX);
       for (y = 0; y < nCY; ++y)
 	for (x = 0; x < xmax; ++x)
 	  {
-	    int nWinPix = BYTE_COUNT(pScreenPriv->cursor.sm_cx) * y + x;
+	    int nWinPix = bits_to_bytes(pScreenPriv->cursor.sm_cx) * y + x;
 	    int nXPix = BitmapBytePad(pCursor->bits->width) * y + x;
 
 	    unsigned char mask = pCursor->bits->mask[nXPix];
@@ -323,7 +321,7 @@ winLoadCursor (ScreenPtr pScreen, CursorPtr pCursor, int screen)
 		    (*pCur++) = 0;
 		  else /* Within X11 icon bounds */
 		    {
-		      int nWinPix = BYTE_COUNT(pScreenPriv->cursor.sm_cx) * y + (x/8);
+		      int nWinPix = bits_to_bytes(pScreenPriv->cursor.sm_cx) * y + (x/8);
 
 		      bit = pAnd[nWinPix];
 		      bit = bit & (1<<(7-(x&7)));
commit 0b4e6af857bcc5513e4c19912a54656d4696e56d
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jul 6 12:12:57 2009 +1000

    xquartz: switch to byte counting functions
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Signed-off-by: Jeremy Huddleston <jeremyhu at apple.com>

diff --git a/hw/xquartz/pseudoramiX.c b/hw/xquartz/pseudoramiX.c
index f4ceff3..1de7af6 100644
--- a/hw/xquartz/pseudoramiX.c
+++ b/hw/xquartz/pseudoramiX.c
@@ -307,7 +307,7 @@ static int ProcPseudoramiXQueryScreens(ClientPtr client)
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
     rep.number = noPseudoramiXExtension ? 0 : pseudoramiXNumScreens;
-    rep.length = rep.number * sz_XineramaScreenInfo >> 2;
+    rep.length = bytes_to_int32(rep.number * sz_XineramaScreenInfo);
     if (client->swapped) {
 	register int n;
 	swaps (&rep.sequenceNumber, n);
diff --git a/hw/xquartz/xpr/xprCursor.c b/hw/xquartz/xpr/xprCursor.c
index 4345bee..8c47b67 100644
--- a/hw/xquartz/xpr/xprCursor.c
+++ b/hw/xquartz/xpr/xprCursor.c
@@ -128,7 +128,7 @@ load_cursor(CursorPtr src, int screen)
 
             while (ycount-- > 0)
             {
-                xcount = (src->bits->width + 7) / 8;
+                xcount = bits_to_bytes(src->bits->width);
                 sptr = srow; mptr = mrow;
                 dptr = drow;
 
commit ad508c93c239a5ba8381000c031e96caf2769265
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jul 6 12:12:20 2009 +1000

    xfree86: switch to byte counting functions
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index f83bcd5..25aa4f5 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -1178,7 +1178,7 @@ DGAGetOldDGAMode(int index)
 
    w = pScrn->currentMode->HDisplay;
    h = pScrn->currentMode->VDisplay;
-   p = ((pScrn->displayWidth * (pScrn->bitsPerPixel >> 3)) + 3) & ~3L;
+   p = pad_to_int32(pScrn->displayWidth * bits_to_bytes(pScrn->bitsPerPixel));
 
    for(i = 0; i < pScreenPriv->numModes; i++) {
 	mode = &(pScreenPriv->modes[i]);
diff --git a/hw/xfree86/dixmods/extmod/xf86dga2.c b/hw/xfree86/dixmods/extmod/xf86dga2.c
index 46aa8b8..6286659 100644
--- a/hw/xfree86/dixmods/extmod/xf86dga2.c
+++ b/hw/xfree86/dixmods/extmod/xf86dga2.c
@@ -159,7 +159,7 @@ ProcXDGAOpenFramebuffer(ClientPtr client)
     }
 
     nameSize = deviceName ? (strlen(deviceName) + 1) : 0;
-    rep.length = (nameSize + 3) >> 2;
+    rep.length = bytes_to_int32(nameSize);
 
     WriteToClient(client, sizeof(xXDGAOpenFramebufferReply), (char *)&rep);
     if(rep.length)
@@ -225,10 +225,10 @@ ProcXDGAQueryModes(ClientPtr client)
 
     size = num * sz_xXDGAModeInfo;
     for(i = 0; i < num; i++)
-	size += (strlen(mode[i].name) + 4) & ~3L;  /* plus NULL */
+	size += pad_to_int32(strlen(mode[i].name) + 1);  /* plus NULL */
 
     rep.number = num;
-    rep.length = size >> 2;
+    rep.length = bytes_to_int32(size);
 
     WriteToClient(client, sz_xXDGAQueryModesReply, (char*)&rep);
 
@@ -389,7 +389,7 @@ ProcXDGASetMode(ClientPtr client)
     info.reserved1 = mode.reserved1;
     info.reserved2 = mode.reserved2;
 
-    rep.length = (sz_xXDGAModeInfo + info.name_size) >> 2;
+    rep.length = bytes_to_int32(sz_xXDGAModeInfo + info.name_size);
 
     WriteToClient(client, sz_xXDGASetModeReply, (char*)&rep);
     WriteToClient(client, sz_xXDGAModeInfo, (char*)(&info));
diff --git a/hw/xfree86/dixmods/extmod/xf86vmode.c b/hw/xfree86/dixmods/extmod/xf86vmode.c
index bd6c594..2e82f33 100644
--- a/hw/xfree86/dixmods/extmod/xf86vmode.c
+++ b/hw/xfree86/dixmods/extmod/xf86vmode.c
@@ -414,11 +414,11 @@ ProcXF86VidModeGetModeLine(ClientPtr client)
     REQUEST_SIZE_MATCH(xXF86VidModeGetModeLineReq);
     rep.type = X_Reply;
     if (ver < 2) {
-	rep.length = (SIZEOF(xXF86OldVidModeGetModeLineReply) -
-			SIZEOF(xGenericReply)) >> 2;
+	rep.length = bytes_to_int32(SIZEOF(xXF86OldVidModeGetModeLineReply) -
+			SIZEOF(xGenericReply));
     } else {
-	rep.length = (SIZEOF(xXF86VidModeGetModeLineReply) -
-			SIZEOF(xGenericReply)) >> 2;
+	rep.length = bytes_to_int32(SIZEOF(xXF86VidModeGetModeLineReply) -
+			SIZEOF(xGenericReply));
     }
     rep.sequenceNumber = client->sequence;
 
@@ -670,10 +670,10 @@ ProcXF86VidModeAddModeLine(ClientPtr client)
 
     if (ver < 2) {
 	REQUEST_AT_LEAST_SIZE(xXF86OldVidModeAddModeLineReq);
-	len = client->req_len - (sizeof(xXF86OldVidModeAddModeLineReq) >> 2);
+	len = client->req_len - bytes_to_int32(sizeof(xXF86OldVidModeAddModeLineReq));
     } else {
 	REQUEST_AT_LEAST_SIZE(xXF86VidModeAddModeLineReq);
-	len = client->req_len - (sizeof(xXF86VidModeAddModeLineReq) >> 2);
+	len = client->req_len - bytes_to_int32(sizeof(xXF86VidModeAddModeLineReq));
     }
     if (len != stuff->privsize)
 	return BadLength;
@@ -809,10 +809,10 @@ ProcXF86VidModeDeleteModeLine(ClientPtr client)
 
     if (ver < 2) {
 	REQUEST_AT_LEAST_SIZE(xXF86OldVidModeDeleteModeLineReq);
-	len = client->req_len - (sizeof(xXF86OldVidModeDeleteModeLineReq) >> 2);
+	len = client->req_len - bytes_to_int32(sizeof(xXF86OldVidModeDeleteModeLineReq));
     } else {
 	REQUEST_AT_LEAST_SIZE(xXF86VidModeDeleteModeLineReq);
-	len = client->req_len - (sizeof(xXF86VidModeDeleteModeLineReq) >> 2);
+	len = client->req_len - bytes_to_int32(sizeof(xXF86VidModeDeleteModeLineReq));
     }
     if (len != stuff->privsize) {
 	if (xf86GetVerbosity() > DEFAULT_XF86VIDMODE_VERBOSITY) {
@@ -923,10 +923,10 @@ ProcXF86VidModeModModeLine(ClientPtr client)
 
     if (ver < 2) {
 	REQUEST_AT_LEAST_SIZE(xXF86OldVidModeModModeLineReq);
-	len = client->req_len - (sizeof(xXF86OldVidModeModModeLineReq) >> 2);
+	len = client->req_len - bytes_to_int32(sizeof(xXF86OldVidModeModModeLineReq));
     } else {
 	REQUEST_AT_LEAST_SIZE(xXF86VidModeModModeLineReq);
-	len = client->req_len - (sizeof(xXF86VidModeModModeLineReq) >> 2);
+	len = client->req_len - bytes_to_int32(sizeof(xXF86VidModeModModeLineReq));
     }
     if (len != stuff->privsize)
 	return BadLength;
@@ -1052,10 +1052,10 @@ ProcXF86VidModeValidateModeLine(ClientPtr client)
     if (ver < 2) {
 	REQUEST_AT_LEAST_SIZE(xXF86OldVidModeValidateModeLineReq);
 	len = client->req_len -
-			(sizeof(xXF86OldVidModeValidateModeLineReq) >> 2);
+			bytes_to_int32(sizeof(xXF86OldVidModeValidateModeLineReq));
     } else {
 	REQUEST_AT_LEAST_SIZE(xXF86VidModeValidateModeLineReq);
-	len = client->req_len - (sizeof(xXF86VidModeValidateModeLineReq) >> 2);
+	len = client->req_len - bytes_to_int32(sizeof(xXF86VidModeValidateModeLineReq));
     }
     if (len != stuff->privsize)
 	return BadLength;
@@ -1107,8 +1107,8 @@ status_reply:
       xfree(modetmp);
 
     rep.type = X_Reply;
-    rep.length = (SIZEOF(xXF86VidModeValidateModeLineReply)
-   			 - SIZEOF(xGenericReply)) >> 2;
+    rep.length = bytes_to_int32(SIZEOF(xXF86VidModeValidateModeLineReply)
+			 - SIZEOF(xGenericReply));
     rep.sequenceNumber = client->sequence;
     rep.status = status;
     if (client->swapped) {
@@ -1185,10 +1185,10 @@ ProcXF86VidModeSwitchToMode(ClientPtr client)
 
     if (ver < 2) {
 	REQUEST_AT_LEAST_SIZE(xXF86OldVidModeSwitchToModeReq);
-	len = client->req_len - (sizeof(xXF86OldVidModeSwitchToModeReq) >> 2);
+	len = client->req_len - bytes_to_int32(sizeof(xXF86OldVidModeSwitchToModeReq));
     } else {
 	REQUEST_AT_LEAST_SIZE(xXF86VidModeSwitchToModeReq);
-	len = client->req_len - (sizeof(xXF86VidModeSwitchToModeReq) >> 2);
+	len = client->req_len - bytes_to_int32(sizeof(xXF86VidModeSwitchToModeReq));
     }
     if (len != stuff->privsize)
 	return BadLength;
@@ -1289,10 +1289,10 @@ ProcXF86VidModeGetMonitor(ClientPtr client)
 				  VIDMODE_MON_MODEL, 0)).ptr);
     else
 	rep.modelLength = 0;
-    rep.length = (SIZEOF(xXF86VidModeGetMonitorReply) - SIZEOF(xGenericReply) +
+    rep.length = bytes_to_int32(SIZEOF(xXF86VidModeGetMonitorReply) - SIZEOF(xGenericReply) +
 		  (nHsync + nVrefresh) * sizeof(CARD32) +
-	          ((rep.vendorLength + 3) & ~3) +
-		  ((rep.modelLength + 3) & ~3)) >> 2;
+	          pad_to_int32(rep.vendorLength) +
+		  pad_to_int32(rep.modelLength));
     rep.sequenceNumber = client->sequence;
     rep.nhsync = nHsync;
     rep.nvsync = nVrefresh;
@@ -1413,8 +1413,8 @@ ProcXF86VidModeGetDotClocks(ClientPtr client)
     numClocks = VidModeGetNumOfClocks(stuff->screen, &ClockProg);
 
     rep.type = X_Reply;
-    rep.length = (SIZEOF(xXF86VidModeGetDotClocksReply)
-		    - SIZEOF(xGenericReply) + numClocks) >> 2;
+    rep.length = bytes_to_int32(SIZEOF(xXF86VidModeGetDotClocksReply)
+		    - SIZEOF(xGenericReply) + numClocks);
     rep.sequenceNumber = client->sequence;
     rep.clocks = numClocks;
     rep.maxclocks = MAXCLOCKS;
diff --git a/hw/xfree86/dri/xf86dri.c b/hw/xfree86/dri/xf86dri.c
index 902fe12..d3e5e68 100644
--- a/hw/xfree86/dri/xf86dri.c
+++ b/hw/xfree86/dri/xf86dri.c
@@ -214,8 +214,8 @@ ProcXF86DRIOpenConnection(
     rep.busIdStringLength = 0;
     if (busIdString)
 	rep.busIdStringLength = strlen(busIdString);
-    rep.length = (SIZEOF(xXF86DRIOpenConnectionReply) - SIZEOF(xGenericReply) +
-                  ((rep.busIdStringLength + 3) & ~3)) >> 2;
+    rep.length = bytes_to_int32(SIZEOF(xXF86DRIOpenConnectionReply) - SIZEOF(xGenericReply) +
+                  pad_to_int32(rep.busIdStringLength));
 
     rep.hSAREALow  = (CARD32)(hSAREA & 0xffffffff);
 #if defined(LONG64) && !defined(__linux__)
@@ -300,9 +300,9 @@ ProcXF86DRIGetClientDriverName(
     rep.clientDriverNameLength = 0;
     if (clientDriverName)
 	rep.clientDriverNameLength = strlen(clientDriverName);
-    rep.length = (SIZEOF(xXF86DRIGetClientDriverNameReply) - 
+    rep.length = bytes_to_int32(SIZEOF(xXF86DRIGetClientDriverNameReply) -
 			SIZEOF(xGenericReply) +
-			((rep.clientDriverNameLength + 3) & ~3)) >> 2;
+			pad_to_int32(rep.clientDriverNameLength));
 
     WriteToClient(client, 
 	sizeof(xXF86DRIGetClientDriverNameReply), (char *)&rep);
@@ -515,7 +515,7 @@ ProcXF86DRIGetDrawableInfo(
        rep.length += sizeof(drm_clip_rect_t) * rep.numClipRects;
     }
     
-    rep.length = ((rep.length + 3) & ~3) >> 2;
+    rep.length = bytes_to_int32(rep.length);
 
     WriteToClient(client, sizeof(xXF86DRIGetDrawableInfoReply), (char *)&rep);
 
@@ -574,9 +574,9 @@ ProcXF86DRIGetDeviceInfo(
 
     rep.length = 0;
     if (rep.devPrivateSize) {
-	rep.length = (SIZEOF(xXF86DRIGetDeviceInfoReply) - 
+	rep.length = bytes_to_int32(SIZEOF(xXF86DRIGetDeviceInfoReply) -
 		      SIZEOF(xGenericReply) +
-		      ((rep.devPrivateSize + 3) & ~3)) >> 2;
+		      pad_to_int32(rep.devPrivateSize));
     }
 
     WriteToClient(client, sizeof(xXF86DRIGetDeviceInfoReply), (char *)&rep);
diff --git a/hw/xfree86/modes/xf86Modes.c b/hw/xfree86/modes/xf86Modes.c
index 74d8648..0449af2 100644
--- a/hw/xfree86/modes/xf86Modes.c
+++ b/hw/xfree86/modes/xf86Modes.c
@@ -123,7 +123,7 @@ unsigned int
 xf86ModeBandwidth(DisplayModePtr mode, int depth)
 {
     float a_active, a_total, active_percent, pixels_per_second;
-    int bytes_per_pixel = (depth + 7) / 8;
+    int bytes_per_pixel = bits_to_bytes(depth);
 
     if (!mode->HTotal || !mode->VTotal || !mode->Clock)
 	return 0;
diff --git a/hw/xfree86/os-support/linux/lnx_font.c b/hw/xfree86/os-support/linux/lnx_font.c
index 5b2696a..d6fc283 100644
--- a/hw/xfree86/os-support/linux/lnx_font.c
+++ b/hw/xfree86/os-support/linux/lnx_font.c
@@ -168,7 +168,7 @@ lnx_savefont(void)
 	return FALSE;
     }
 
-    size = (width + 7)/8 * 32 * charcount;
+    size = bits_to_bytes(width) * 32 * charcount;
     fontdata = (unsigned char *)xnfalloc(size);
     if (!fontdata) {
 	xf86Msg(X_WARNING,
diff --git a/hw/xfree86/xaa/xaaFillRect.c b/hw/xfree86/xaa/xaaFillRect.c
index 7c319bb..0b83ef3 100644
--- a/hw/xfree86/xaa/xaaFillRect.c
+++ b/hw/xfree86/xaa/xaaFillRect.c
@@ -812,7 +812,7 @@ WriteColumn(
 
     src = pSrc + (yoff * srcwidth);
 
-    dwords = ((w * Bpp) + 3) >> 2;
+    dwords = bytes_to_int32(w * Bpp);
 
     if((infoRec->ImageWriteFlags & CPU_TRANSFER_PAD_QWORD) && 
                                                 ((dwords * h) & 0x01)) {
diff --git a/hw/xfree86/xaa/xaaImage.c b/hw/xfree86/xaa/xaaImage.c
index 85461c8..4933bee 100644
--- a/hw/xfree86/xaa/xaaImage.c
+++ b/hw/xfree86/xaa/xaaImage.c
@@ -92,7 +92,7 @@ XAAWritePixmap32To24(
    int trans
 ){
     XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
-    int count, dwords = ((w * 3) + 3) >> 2;
+    int count, dwords = bytes_to_int32(w * 3);
     CARD32 *src, *dst;
     Bool PlusOne = FALSE;
 
@@ -227,7 +227,7 @@ XAAWritePixmap (
 
 BAD_ALIGNMENT:
 
-    dwords = ((w * Bpp) + 3) >> 2;
+    dwords = bytes_to_int32(w * Bpp);
 
     if((infoRec->ImageWriteFlags & CPU_TRANSFER_PAD_QWORD) && 
 						((dwords * h) & 0x01)) {
@@ -351,7 +351,7 @@ XAAWritePixmapScanline (
 
 BAD_ALIGNMENT:
 
-    dwords = ((w * Bpp) + 3) >> 2;
+    dwords = bytes_to_int32(w * Bpp);
 
     (*infoRec->SetupForScanlineImageWrite)(
 				pScrn, rop, planemask, trans, bpp, depth);
diff --git a/hw/xfree86/xaa/xaaPCache.c b/hw/xfree86/xaa/xaaPCache.c
index dbbeac6..7e3011b 100644
--- a/hw/xfree86/xaa/xaaPCache.c
+++ b/hw/xfree86/xaa/xaaPCache.c
@@ -1556,7 +1556,7 @@ XAACacheMonoStipple(ScrnInfoPtr pScrn, PixmapPtr pPix)
    } else 		funcNo = 2;
 
    pad = BitmapBytePad(pCache->w * bpp);
-   dwords = pad >> 2;
+   dwords = bytes_to_int32(pad);
    dstPtr = data = (unsigned char*)xalloc(pad * pCache->h);
    srcPtr = (unsigned char*)pPix->devPrivate.ptr;
 
commit c20304226b3ca2f8d0a4f4866480b0d71913941c
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jul 6 12:07:00 2009 +1000

    glx: switch to byte counting functions
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/glx/indirect_util.c b/glx/indirect_util.c
index 58c194c..4430910 100644
--- a/glx/indirect_util.c
+++ b/glx/indirect_util.c
@@ -126,7 +126,7 @@ __glXSendReply( ClientPtr client, const void * data, size_t elements,
         elements = 0;
     }
     else if ( (elements > 1) || always_array ) {
-        reply_ints = ((elements * element_size) + 3) >> 2;
+        reply_ints = bytes_to_int32(elements * element_size);
     }
 
     __glXReply.length =         reply_ints;
@@ -174,7 +174,7 @@ __glXSendReplySwap( ClientPtr client, const void * data, size_t elements,
         elements = 0;
     }
     else if ( (elements > 1) || always_array ) {
-        reply_ints = ((elements * element_size) + 3) >> 2;
+        reply_ints = bytes_to_int32(elements * element_size);
     }
 
     __glXReply.length =         bswap_32( reply_ints );
diff --git a/glx/rensize.c b/glx/rensize.c
index 5c6b150..8a58e08 100644
--- a/glx/rensize.c
+++ b/glx/rensize.c
@@ -195,7 +195,7 @@ int __glXImageSize( GLenum format, GLenum type, GLenum target,
 	} else {
 	    groupsPerRow = w;
 	}
-	rowSize = (groupsPerRow + 7) >> 3;
+	rowSize = bits_to_bytes(groupsPerRow);
 	padding = (rowSize % alignment);
 	if (padding) {
 	    rowSize += alignment - padding;
commit 87ce93c9973067255b4197d82772f83cd4ea5d27
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jul 6 12:06:47 2009 +1000

    dmx: switch to byte counting functions
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/dmx/dmx.c b/hw/dmx/dmx.c
index 56e5bb6..87d408d 100644
--- a/hw/dmx/dmx.c
+++ b/hw/dmx/dmx.c
@@ -360,10 +360,10 @@ static int ProcDMXGetScreenAttributes(ClientPtr client)
     rep.rootWindowYorigin   = attr.rootWindowYorigin;
                                  
     length                  = attr.displayName ? strlen(attr.displayName) : 0;
-    paddedLength            = (length + 3) & ~3;
+    paddedLength            = pad_to_int32(length);
     rep.type                = X_Reply;
     rep.sequenceNumber      = client->sequence;
-    rep.length              = paddedLength >> 2;
+    rep.length              = bytes_to_int32(paddedLength);
     rep.displayNameLength   = length;
 
     if (client->swapped) {
@@ -405,7 +405,7 @@ static int ProcDMXChangeScreensAttributes(ClientPtr client)
     
 
     REQUEST_AT_LEAST_SIZE(xDMXChangeScreensAttributesReq);
-    len = client->req_len - (sizeof(xDMXChangeScreensAttributesReq) >> 2);
+    len = client->req_len - bytes_to_int32(sizeof(xDMXChangeScreensAttributesReq));
     if (len < stuff->screenCount + stuff->maskCount)
         return BadLength;
 
@@ -474,8 +474,8 @@ static int ProcDMXAddScreen(ClientPtr client)
     int                    paddedLength;
 
     REQUEST_AT_LEAST_SIZE(xDMXAddScreenReq);
-    paddedLength = (stuff->displayNameLength + 3) & ~3;
-    len          = client->req_len - (sizeof(xDMXAddScreenReq) >> 2);
+    paddedLength = pad_to_int32(stuff->displayNameLength);
+    len          = client->req_len - bytes_to_int32(sizeof(xDMXAddScreenReq));
     if (len != Ones(stuff->valueMask) + paddedLength/4)
         return BadLength;
 
@@ -795,10 +795,10 @@ static int ProcDMXGetInputAttributes(ClientPtr client)
     rep.detached       = attr.detached;
     
     length             = attr.name ? strlen(attr.name) : 0;
-    paddedLength       = (length + 3) & ~3;
+    paddedLength       = pad_to_int32(length);
     rep.type           = X_Reply;
     rep.sequenceNumber = client->sequence;
-    rep.length         = paddedLength >> 2;
+    rep.length         = bytes_to_int32(paddedLength);
     rep.nameLength     = length;
     if (client->swapped) {
     	swaps(&rep.sequenceNumber, n);
@@ -828,7 +828,7 @@ static int ProcDMXAddInput(ClientPtr client)
     int                    id     = -1;
 
     REQUEST_AT_LEAST_SIZE(xDMXAddInputReq);
-    paddedLength = (stuff->displayNameLength + 3) & ~3;
+    paddedLength = pad_to_int32(stuff->displayNameLength);
     len          = client->req_len - (sizeof(xDMXAddInputReq) >> 2);
     if (len != Ones(stuff->valueMask) + paddedLength/4)
         return BadLength;
@@ -997,7 +997,7 @@ static int SProcDMXAddScreen(ClientPtr client)
     REQUEST_AT_LEAST_SIZE(xDMXAddScreenReq);
     swapl(&stuff->displayNameLength, n);
     swapl(&stuff->valueMask, n);
-    paddedLength = (stuff->displayNameLength + 3) & ~3;
+    paddedLength = pad_to_int32(stuff->displayNameLength);
     SwapLongs((CARD32 *)(stuff+1), LengthRestL(stuff) - paddedLength/4);
     return ProcDMXAddScreen(client);
 }
@@ -1077,7 +1077,7 @@ static int SProcDMXAddInput(ClientPtr client)
     REQUEST_AT_LEAST_SIZE(xDMXAddInputReq);
     swapl(&stuff->displayNameLength, n);
     swapl(&stuff->valueMask, n);
-    paddedLength = (stuff->displayNameLength + 3) & ~3;
+    paddedLength = pad_to_int32(stuff->displayNameLength);
     SwapLongs((CARD32 *)(stuff+1), LengthRestL(stuff) - paddedLength/4);
     return ProcDMXAddInput(client);
 }
diff --git a/hw/dmx/glxProxy/glxsingle.c b/hw/dmx/glxProxy/glxsingle.c
index 4d2d45b..dcc6040 100644
--- a/hw/dmx/glxProxy/glxsingle.c
+++ b/hw/dmx/glxProxy/glxsingle.c
@@ -902,7 +902,7 @@ int __glXDisp_ReadPixels(__GLXclientState *cl, GLbyte *pc)
 		   else {
 		      /* this is a GL_BITMAP pixel type, should copy bits */
 		      int r;
-		      int src_rowsize = ((sw * ebits) + 7) / 8;
+		      int src_rowsize = bits_to_bytes(sw * ebits);
 		      int src_pad = src_rowsize % 4;
                       if ( src_pad ) {
 			 src_rowsize += (4 - src_pad);
commit dc82e11e509ecf586d77c3e7c1325d515509ce51
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jul 6 12:03:34 2009 +1000

    exa: switch to byte counting functions.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Acked-by: Michel Dänzer <michel at daenzer.net>

diff --git a/exa/exa.c b/exa/exa.c
index d04ea71..608c81f 100644
--- a/exa/exa.c
+++ b/exa/exa.c
@@ -236,7 +236,7 @@ exaSetAccelBlock(ExaScreenPrivPtr pExaScr, ExaPixmapPrivPtr pExaPixmap,
     pExaPixmap->accel_blocked = 0;
 
     if (pExaScr->info->maxPitchPixels) {
-        int max_pitch = pExaScr->info->maxPitchPixels * (bpp + 7) / 8;
+        int max_pitch = pExaScr->info->maxPitchPixels * bits_to_bytes(bpp);
 
         if (pExaPixmap->fb_pitch > max_pitch)
             pExaPixmap->accel_blocked |= EXA_RANGE_PITCH;
@@ -258,9 +258,9 @@ exaSetFbPitch(ExaScreenPrivPtr pExaScr, ExaPixmapPrivPtr pExaPixmap,
               int w, int h, int bpp)
 {
     if (pExaScr->info->flags & EXA_OFFSCREEN_ALIGN_POT && w != 1)
-        pExaPixmap->fb_pitch = ((1 << (exaLog2(w - 1) + 1)) * bpp + 7) / 8;
+        pExaPixmap->fb_pitch = bits_to_bytes((1 << (exaLog2(w - 1) + 1)) * bpp);
     else
-        pExaPixmap->fb_pitch = (w * bpp + 7) / 8;
+        pExaPixmap->fb_pitch = bits_to_bytes(w * bpp);
 
     pExaPixmap->fb_pitch = EXA_ALIGN(pExaPixmap->fb_pitch,
                                      pExaScr->info->pixmapPitchAlign);
commit 2d35ea8d957a955e1200ba2b14424bddfe1f4148
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jul 3 16:50:03 2009 +1000

    dix: switch to byte-counting functions.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/devices.c b/dix/devices.c
index 9f2cb2b..4d006b1 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1532,7 +1532,7 @@ ProcSetModifierMapping(ClientPtr client)
     REQUEST_AT_LEAST_SIZE(xSetModifierMappingReq);
 
     if (client->req_len != ((stuff->numKeyPerModifier << 1) +
-			    (sizeof (xSetModifierMappingReq) >> 2)))
+                bytes_to_int32(sizeof(xSetModifierMappingReq))))
 	return BadLength;
 
     rep.type = X_Reply;
@@ -1591,7 +1591,7 @@ ProcChangeKeyboardMapping(ClientPtr client)
     int rc;
     REQUEST_AT_LEAST_SIZE(xChangeKeyboardMappingReq);
 
-    len = client->req_len - (sizeof(xChangeKeyboardMappingReq) >> 2);
+    len = client->req_len - bytes_to_int32(sizeof(xChangeKeyboardMappingReq));
     if (len != (stuff->keyCodes * stuff->keySymsPerKeyCode))
             return BadLength;
 
@@ -1650,7 +1650,8 @@ ProcSetPointerMapping(ClientPtr client)
     REQUEST(xSetPointerMappingReq);
     REQUEST_AT_LEAST_SIZE(xSetPointerMappingReq);
 
-    if (client->req_len != (sizeof(xSetPointerMappingReq)+stuff->nElts+3) >> 2)
+    if (client->req_len !=
+            bytes_to_int32(sizeof(xSetPointerMappingReq) + stuff->nElts))
 	return BadLength;
     rep.type = X_Reply;
     rep.length = 0;
@@ -2229,7 +2230,7 @@ ProcGetMotionEvents(ClientPtr client)
 		nEvents++;
 	    }
     }
-    rep.length = nEvents * (sizeof(xTimecoord) >> 2);
+    rep.length = nEvents * bytes_to_int32(sizeof(xTimecoord));
     rep.nEvents = nEvents;
     WriteReplyToClient(client, sizeof(xGetMotionEventsReply), &rep);
     if (nEvents)
diff --git a/dix/dispatch.c b/dix/dispatch.c
index 86db92f..4df775d 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -513,7 +513,7 @@ CreateConnectionBlock(void)
     QueryMinMaxKeyCodes(&setup.minKeyCode, &setup.maxKeyCode);
 
     lenofblock = sizeof(xConnSetup) +
-            ((setup.nbytesVendor + 3) & ~3) +
+            pad_to_int32(setup.nbytesVendor) +
 	    (setup.numFormats * sizeof(xPixmapFormat)) +
             (setup.numRoots * sizeof(xWindowRoot));
     ConnectionInfo = xalloc(lenofblock);
@@ -638,7 +638,7 @@ ProcCreateWindow(ClientPtr client)
     rc = dixLookupWindow(&pParent, stuff->parent, client, DixAddAccess);
     if (rc != Success)
         return rc;
-    len = client->req_len - (sizeof(xCreateWindowReq) >> 2);
+    len = client->req_len - bytes_to_int32(sizeof(xCreateWindowReq));
     if (Ones(stuff->mask) != len)
         return BadLength;
     if (!stuff->width || !stuff->height)
@@ -681,7 +681,7 @@ ProcChangeWindowAttributes(ClientPtr client)
     rc = dixLookupWindow(&pWin, stuff->window, client, access_mode);
     if (rc != Success)
         return rc;
-    len = client->req_len - (sizeof(xChangeWindowAttributesReq) >> 2);
+    len = client->req_len - bytes_to_int32(sizeof(xChangeWindowAttributesReq));
     if (len != Ones(stuff->valueMask))
         return BadLength;
     result =  ChangeWindowAttributes(pWin, 
@@ -885,7 +885,7 @@ ProcConfigureWindow(ClientPtr client)
 			 DixManageAccess|DixSetAttrAccess);
     if (rc != Success)
         return rc;
-    len = client->req_len - (sizeof(xConfigureWindowReq) >> 2);
+    len = client->req_len - bytes_to_int32(sizeof(xConfigureWindowReq));
     if (Ones((Mask)stuff->mask) != len)
         return BadLength;
     result =  ConfigureWindow(pWin, (Mask)stuff->mask, (XID *) &stuff[1], 
@@ -1013,7 +1013,7 @@ ProcQueryTree(ClientPtr client)
     }
     
     reply.nChildren = numChildren;
-    reply.length = (numChildren * sizeof(Window)) >> 2;
+    reply.length = bytes_to_int32(numChildren * sizeof(Window));
     
     WriteReplyToClient(client, sizeof(xQueryTreeReply), &reply);
     if (numChildren)
@@ -1070,7 +1070,7 @@ ProcGetAtomName(ClientPtr client)
 	len = strlen(str);
 	memset(&reply, 0, sizeof(xGetAtomNameReply));
 	reply.type = X_Reply;
-	reply.length = (len + 3) >> 2;
+	reply.length = bytes_to_int32(len);
 	reply.sequenceNumber = client->sequence;
 	reply.nameLength = len;
 	WriteReplyToClient(client, sizeof(xGetAtomNameReply), &reply);
@@ -1310,7 +1310,7 @@ ProcQueryFont(ClientPtr client)
 	}
 
 	reply->type = X_Reply;
-	reply->length = (rlength - sizeof(xGenericReply)) >> 2;
+	reply->length = bytes_to_int32(rlength - sizeof(xGenericReply));
 	reply->sequenceNumber = client->sequence;
 	QueryFont( pFont, reply, nprotoxcistructs);
 
@@ -1344,7 +1344,7 @@ ProcQueryTextExtents(ClientPtr client)
     if (rc != Success)
 	return (rc == BadValue) ? BadFont: rc;
 
-    length = client->req_len - (sizeof(xQueryTextExtentsReq) >> 2);
+    length = client->req_len - bytes_to_int32(sizeof(xQueryTextExtentsReq));
     length = length << 1;
     if (stuff->oddLength)
     {
@@ -1512,7 +1512,7 @@ ProcCreateGC(ClientPtr client)
     if (rc != Success)
 	return rc;
 
-    len = client->req_len -  (sizeof(xCreateGCReq) >> 2);
+    len = client->req_len -  bytes_to_int32(sizeof(xCreateGCReq));
     if (len != Ones(stuff->mask))
         return BadLength;
     pGC = (GC *)CreateGC(pDraw, stuff->mask, (XID *) &stuff[1], &error,
@@ -1537,7 +1537,7 @@ ProcChangeGC(ClientPtr client)
     if (result != Success)
 	return result;
 
-    len = client->req_len -  (sizeof(xChangeGCReq) >> 2);
+    len = client->req_len -  bytes_to_int32(sizeof(xChangeGCReq));
     if (len != Ones(stuff->mask))
         return BadLength;
 
@@ -1787,7 +1787,7 @@ ProcPolyPoint(ClientPtr client)
         return BadValue;
     }
     VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess); 
-    npoint = ((client->req_len << 2) - sizeof(xPolyPointReq)) >> 2;
+    npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyPointReq));
     if (npoint)
         (*pGC->ops->PolyPoint)(pDraw, pGC, stuff->coordMode, npoint,
 			  (xPoint *) &stuff[1]);
@@ -1810,7 +1810,7 @@ ProcPolyLine(ClientPtr client)
         return BadValue;
     }
     VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
-    npoint = ((client->req_len << 2) - sizeof(xPolyLineReq)) >> 2;
+    npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyLineReq));
     if (npoint > 1)
 	(*pGC->ops->Polylines)(pDraw, pGC, stuff->coordMode, npoint, 
 			      (DDXPointPtr) &stuff[1]);
@@ -1898,7 +1898,7 @@ ProcFillPoly(ClientPtr client)
     }
 
     VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
-    things = ((client->req_len << 2) - sizeof(xFillPolyReq)) >> 2;
+    things = bytes_to_int32((client->req_len << 2) - sizeof(xFillPolyReq));
     if (things)
         (*pGC->ops->FillPolygon) (pDraw, pGC, stuff->shape,
 			 stuff->coordMode, things,
@@ -2042,8 +2042,8 @@ ProcPutImage(ClientPtr client)
     tmpImage = (char *)&stuff[1];
     lengthProto = length;
 	
-    if (((((lengthProto * stuff->height) + (unsigned)3) >> 2) + 
-	(sizeof(xPutImageReq) >> 2)) != client->req_len)
+    if ((bytes_to_int32(lengthProto * stuff->height) +
+	bytes_to_int32(sizeof(xPutImageReq))) != client->req_len)
 	return BadLength;
 
     ReformatImage (tmpImage, lengthProto * stuff->height, 
@@ -2143,7 +2143,7 @@ DoGetImage(ClientPtr client, int format, Drawable drawable,
 	*(xGetImageReply *)pBuf = xgi;
 	pBuf += sz_xGetImageReply;
     } else {
-	xgi.length = (xgi.length + 3) >> 2;
+	xgi.length = bytes_to_int32(xgi.length);
 	if (widthBytesLine == 0 || height == 0)
 	    linesPerBuf = 0;
 	else if (widthBytesLine >= IMAGE_BUFSIZE)
@@ -2705,7 +2705,7 @@ ProcAllocColorCells (ClientPtr client)
 #endif
 	{
 	    accr.type = X_Reply;
-	    accr.length = length >> 2;
+	    accr.length = bytes_to_int32(length);
 	    accr.sequenceNumber = client->sequence;
 	    accr.nPixels = npixels;
 	    accr.nMasks = nmasks;
@@ -2769,7 +2769,7 @@ ProcAllocColorPlanes(ClientPtr client)
 	    else
 	        return rc;
 	}
-	acpr.length = length >> 2;
+	acpr.length = bytes_to_int32(length);
 #ifdef PANORAMIX
 	if (noPanoramiXExtension || !pcmp->pScreen->myNum)
 #endif
@@ -2804,7 +2804,7 @@ ProcFreeColors(ClientPtr client)
 
 	if(pcmp->flags & AllAllocated)
 	    return(BadAccess);
-	count = ((client->req_len << 2)- sizeof(xFreeColorsReq)) >> 2;
+	count = bytes_to_int32((client->req_len << 2) - sizeof(xFreeColorsReq));
 	rc = FreeColors(pcmp, client->index, count,
 	    (Pixel *)&stuff[1], (Pixel)stuff->planeMask);
         if (client->noClientException != Success)
@@ -2907,7 +2907,7 @@ ProcQueryColors(ClientPtr client)
 	xrgb 			*prgbs;
 	xQueryColorsReply	qcr;
 
-	count = ((client->req_len << 2) - sizeof(xQueryColorsReq)) >> 2;
+	count = bytes_to_int32((client->req_len << 2) - sizeof(xQueryColorsReq));
 	prgbs = xcalloc(1, count * sizeof(xrgb));
 	if(!prgbs && count)
             return(BadAlloc);
@@ -2924,7 +2924,7 @@ ProcQueryColors(ClientPtr client)
 	}
 	memset(&qcr, 0, sizeof(xQueryColorsReply));
 	qcr.type = X_Reply;
-	qcr.length = (count * sizeof(xrgb)) >> 2;
+	qcr.length = bytes_to_int32(count * sizeof(xrgb));
 	qcr.sequenceNumber = client->sequence;
 	qcr.nColors = count;
 	WriteReplyToClient(client, sizeof(xQueryColorsReply), &qcr);
@@ -3294,7 +3294,7 @@ ProcListHosts(ClientPtr client)
     reply.type = X_Reply;
     reply.sequenceNumber = client->sequence;
     reply.nHosts = nHosts;
-    reply.length = len >> 2;
+    reply.length = bytes_to_int32(len);
     WriteReplyToClient(client, sizeof(xListHostsReply), &reply);
     if (nHosts)
     {
@@ -3427,7 +3427,7 @@ ProcGetFontPath(ClientPtr client)
 
     reply.type = X_Reply;
     reply.sequenceNumber = client->sequence;
-    reply.length = (stringLens + numpaths + 3) >> 2;
+    reply.length = bytes_to_int32(stringLens + numpaths);
     reply.nPaths = numpaths;
 
     WriteReplyToClient(client, sizeof(xGetFontPathReply), &reply);
@@ -3656,7 +3656,7 @@ ClientPtr NextAvailableClient(pointer ospriv)
 	return (ClientPtr)NULL;
     }
     data.reqType = 1;
-    data.length = (sz_xReq + sz_xConnClientPrefix) >> 2;
+    data.length = bytes_to_int32(sz_xReq + sz_xConnClientPrefix);
     if (!InsertFakeRequest(client, (char *)&data, sz_xReq))
     {
 	FreeClientResources(client);
@@ -3696,8 +3696,8 @@ ProcInitialConnection(ClientPtr client)
 	SwapConnClientPrefix(prefix);
     }
     stuff->reqType = 2;
-    stuff->length += ((prefix->nbytesAuthProto + (unsigned)3) >> 2) +
-		     ((prefix->nbytesAuthString + (unsigned)3) >> 2);
+    stuff->length += bytes_to_int32(prefix->nbytesAuthProto) +
+		     bytes_to_int32(prefix->nbytesAuthString);
     if (client->swapped)
     {
 	swaps(&stuff->length, whichbyte);
@@ -3721,7 +3721,7 @@ SendConnSetup(ClientPtr client, char *reason)
 
 	csp.success = xFalse;
 	csp.lengthReason = strlen(reason);
-	csp.length = (csp.lengthReason + (unsigned)3) >> 2;
+	csp.length = bytes_to_int32(csp.lengthReason);
 	csp.majorVersion = X_PROTOCOL;
 	csp.minorVersion = X_PROTOCOL_REVISION;
 	if (client->swapped)
@@ -3812,7 +3812,7 @@ ProcEstablishConnection(ClientPtr client)
 
     prefix = (xConnClientPrefix *)((char *)stuff + sz_xReq);
     auth_proto = (char *)prefix + sz_xConnClientPrefix;
-    auth_string = auth_proto + ((prefix->nbytesAuthProto + 3) & ~3);
+    auth_string = auth_proto + pad_to_int32(prefix->nbytesAuthProto);
     if ((prefix->majorVersion != X_PROTOCOL) ||
 	(prefix->minorVersion != X_PROTOCOL_REVISION))
 	reason = "Protocol version mismatch";
diff --git a/dix/dixfonts.c b/dix/dixfonts.c
index 8b6e7a3..7d7ae71 100644
--- a/dix/dixfonts.c
+++ b/dix/dixfonts.c
@@ -792,7 +792,7 @@ finish:
 
     memset(&reply, 0, sizeof(xListFontsReply));
     reply.type = X_Reply;
-    reply.length = (stringLens + nnames + 3) >> 2;
+    reply.length = bytes_to_int32(stringLens + nnames);
     reply.nFonts = nnames;
     reply.sequenceNumber = client->sequence;
 
@@ -817,7 +817,7 @@ finish:
 	}
     }
     nnames = reply.nFonts;
-    reply.length = (stringLens + nnames + 3) >> 2;
+    reply.length = bytes_to_int32(stringLens + nnames);
     client->pSwapReplyFunc = ReplySwapVector[X_ListFonts];
     WriteSwappedDataToClient(client, sizeof(xListFontsReply), &reply);
     (void) WriteToClient(client, stringLens + nnames, bufferStart);
@@ -1057,9 +1057,9 @@ doListFontsWithInfo(ClientPtr client, LFWIclosurePtr c)
 		namelen = strlen(name);
 	    }
 	    reply->type = X_Reply;
-	    reply->length = (sizeof *reply - sizeof(xGenericReply) +
+	    reply->length = bytes_to_int32(sizeof *reply - sizeof(xGenericReply) +
 			     pFontInfo->nprops * sizeof(xFontProp) +
-			     namelen + 3) >> 2;
+			     namelen);
 	    reply->sequenceNumber = client->sequence;
 	    reply->nameLength = namelen;
 	    reply->minBounds = pFontInfo->ink_minbounds;
@@ -1097,8 +1097,8 @@ finish:
     bzero((char *) &finalReply, sizeof(xListFontsWithInfoReply));
     finalReply.type = X_Reply;
     finalReply.sequenceNumber = client->sequence;
-    finalReply.length = (sizeof(xListFontsWithInfoReply)
-		     - sizeof(xGenericReply)) >> 2;
+    finalReply.length = bytes_to_int32(sizeof(xListFontsWithInfoReply)
+		     - sizeof(xGenericReply));
     WriteSwappedDataToClient(client, length, &finalReply);
 bail:
     if (c->slept)
diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index a65bf68..8d9a329 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -389,13 +389,13 @@ eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
     /* FIXME: this should just send the buttons we have, not MAX_BUTTONs. Same
      * with MAX_VALUATORS below */
     /* btlen is in 4 byte units */
-    btlen = (((MAX_BUTTONS + 7)/8) + 3)/4;
+    btlen = bytes_to_int32(bits_to_bytes(MAX_BUTTONS));
     len += btlen * 4; /* buttonmask len */
 
 
     vallen = count_bits(ev->valuators.mask, sizeof(ev->valuators.mask)/sizeof(ev->valuators.mask[0]));
     len += vallen * 2 * sizeof(uint32_t); /* axisvalues */
-    vallen = (((MAX_VALUATORS + 7)/8) + 3)/4;
+    vallen = bytes_to_int32(bits_to_bytes(MAX_VALUATORS));
     len += vallen * 4; /* valuators mask */
 
     *xi = xcalloc(1, len);
@@ -404,7 +404,7 @@ eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
     xde->extension      = IReqCode;
     xde->evtype         = GetXI2Type((InternalEvent*)ev);
     xde->time           = ev->time;
-    xde->length         = (len - sizeof(xEvent) + 3)/4;
+    xde->length         = bytes_to_int32(len - sizeof(xEvent));
     xde->detail         = ev->detail.button;
     xde->root           = ev->root;
     xde->buttons_len    = btlen;
@@ -459,7 +459,7 @@ eventToRawEvent(RawDeviceEvent *ev, xEvent **xi)
     nvals = count_bits(ev->valuators.mask, sizeof(ev->valuators.mask)/sizeof(ev->valuators.mask[0]));
     len += nvals * (2 * sizeof(uint32_t)) * 2; /* 8 byte per valuator, once
                                                    raw, once processed */
-    vallen = (((MAX_VALUATORS + 7)/8) + 3)/4;
+    vallen = bytes_to_int32(bits_to_bytes(MAX_VALUATORS));
     len += vallen * 4; /* valuators mask */
 
     *xi = xcalloc(1, len);
@@ -468,7 +468,7 @@ eventToRawEvent(RawDeviceEvent *ev, xEvent **xi)
     raw->extension      = IReqCode;
     raw->evtype         = GetXI2Type((InternalEvent*)ev);
     raw->time           = ev->time;
-    raw->length         = (len - sizeof(xEvent) + 3)/4;
+    raw->length         = bytes_to_int32(len - sizeof(xEvent));
     raw->eventtype      = ev->subtype;
     raw->detail         = ev->detail.button;
     raw->deviceid       = ev->deviceid;
diff --git a/dix/events.c b/dix/events.c
index 52f8b0d..91a0833 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4221,8 +4221,8 @@ DeviceEnterLeaveEvent(
         (mode == XINotifyPassiveUngrab && type == XI_Enter))
         return;
 
-    btlen = (mouse->button) ? (mouse->button->numButtons + 7)/8 : 0;
-    btlen = (btlen + 3)/4;
+    btlen = (mouse->button) ? bits_to_bytes(mouse->button->numButtons) : 0;
+    btlen = bytes_to_int32(btlen);
     len = sizeof(xXIEnterEvent) + btlen * 4;
 
     event = xcalloc(1, len);
diff --git a/dix/extension.c b/dix/extension.c
index c768ccb..fb83af1 100644
--- a/dix/extension.c
+++ b/dix/extension.c
@@ -324,7 +324,7 @@ ProcListExtensions(ClientPtr client)
 	    for (j = extensions[i]->num_aliases; --j >= 0;)
 		total_length += strlen(extensions[i]->aliases[j]) + 1;
 	}
-        reply.length = (total_length + 3) >> 2;
+        reply.length = bytes_to_int32(total_length);
 	buffer = bufptr = xalloc(total_length);
 	if (!buffer)
 	    return(BadAlloc);
diff --git a/dix/property.c b/dix/property.c
index d63b8f4..20c18d7 100644
--- a/dix/property.c
+++ b/dix/property.c
@@ -218,7 +218,7 @@ ProcChangeProperty(ClientPtr client)
         return BadValue;
     }
     len = stuff->nUnits;
-    if (len > ((0xffffffff - sizeof(xChangePropertyReq)) >> 2))
+    if (len > bytes_to_int32(0xffffffff - sizeof(xChangePropertyReq)))
 	return BadLength;
     sizeInBytes = format>>3;
     totalSize = len * sizeInBytes;
@@ -532,7 +532,7 @@ ProcGetProperty(ClientPtr client)
 
     reply.bytesAfter = n - (ind + len);
     reply.format = pProp->format;
-    reply.length = (len + 3) >> 2;
+    reply.length = bytes_to_int32(len);
     reply.nItems = len / (pProp->format / 8 );
     reply.propertyType = pProp->type;
 
@@ -606,7 +606,7 @@ ProcListProperties(ClientPtr client)
 
     xlpr.type = X_Reply;
     xlpr.nProperties = numProps;
-    xlpr.length = (numProps * sizeof(Atom)) >> 2;
+    xlpr.length = bytes_to_int32(numProps * sizeof(Atom));
     xlpr.sequenceNumber = client->sequence;
     WriteReplyToClient(client, sizeof(xGenericReply), &xlpr);
     if (numProps)
diff --git a/dix/swaprep.c b/dix/swaprep.c
index 8624216..12c6dbd 100644
--- a/dix/swaprep.c
+++ b/dix/swaprep.c
@@ -731,7 +731,7 @@ SLHostsExtend(ClientPtr pClient, int size, char *buf)
 	int len = host->length;
         char n;
 	swaps (&host->length, n);
-	bufT += sizeof (xHostEntry) + (((len + 3) >> 2) << 2);
+	bufT += sizeof (xHostEntry) + pad_to_int32(len);
 	}
     (void)WriteToClient (pClient, size, buf);
 }
@@ -1222,7 +1222,7 @@ SwapConnSetupInfo(
     pInfoT += sizeof(xConnSetup);
 
     /* Copy the vendor string */
-    i = (pConnSetup->nbytesVendor + 3) & ~3;
+    i = pad_to_int32(pConnSetup->nbytesVendor);
     memcpy(pInfoT, pInfo, i);
     pInfo += i;
     pInfoT += i;
diff --git a/dix/window.c b/dix/window.c
index 99b594b..32e26d9 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -1457,8 +1457,8 @@ GetWindowAttributes(WindowPtr pWin, ClientPtr client, xGetWindowAttributesReply
 	wa->backingStore = NotUseful;
     else
 	wa->backingStore = pWin->backingStore;
-    wa->length = (sizeof(xGetWindowAttributesReply) -
-		 sizeof(xGenericReply)) >> 2;
+    wa->length = bytes_to_int32(sizeof(xGetWindowAttributesReply) -
+		 sizeof(xGenericReply));
     wa->sequenceNumber = client->sequence;
     wa->backingBitPlanes =  wBackingBitPlanes (pWin);
     wa->backingPixel =  wBackingPixel (pWin);
commit 7dd415aa6a3959f15276741db168ba264948ecfe
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jul 3 13:57:14 2009 +1000

    Xi: use byte-counting macros instead of manual calculation.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/chgdctl.c b/Xi/chgdctl.c
index 89e5a2d..901a0e4 100644
--- a/Xi/chgdctl.c
+++ b/Xi/chgdctl.c
@@ -142,7 +142,7 @@ ProcXChangeDeviceControl(ClientPtr client)
     REQUEST(xChangeDeviceControlReq);
     REQUEST_AT_LEAST_SIZE(xChangeDeviceControlReq);
 
-    len = stuff->length - (sizeof(xChangeDeviceControlReq) >> 2);
+    len = stuff->length - bytes_to_int32(sizeof(xChangeDeviceControlReq));
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixManageAccess);
     if (ret != Success)
         goto out;
@@ -155,8 +155,8 @@ ProcXChangeDeviceControl(ClientPtr client)
     switch (stuff->control) {
     case DEVICE_RESOLUTION:
 	r = (xDeviceResolutionCtl *) & stuff[1];
-	if ((len < (sizeof(xDeviceResolutionCtl) >> 2)) ||
-	    (len != (sizeof(xDeviceResolutionCtl) >> 2) + r->num_valuators)) {
+	if ((len < bytes_to_int32(sizeof(xDeviceResolutionCtl))) ||
+	    (len != bytes_to_int32(sizeof(xDeviceResolutionCtl)) + r->num_valuators)) {
             ret = BadLength;
             goto out;
 	}
diff --git a/Xi/chgfctl.c b/Xi/chgfctl.c
index e193e13..9189702 100644
--- a/Xi/chgfctl.c
+++ b/Xi/chgfctl.c
@@ -441,14 +441,14 @@ ProcXChangeFeedbackControl(ClientPtr client)
     REQUEST(xChangeFeedbackControlReq);
     REQUEST_AT_LEAST_SIZE(xChangeFeedbackControlReq);
 
-    len = stuff->length - (sizeof(xChangeFeedbackControlReq) >> 2);
+    len = stuff->length - bytes_to_int32(sizeof(xChangeFeedbackControlReq));
     rc = dixLookupDevice(&dev, stuff->deviceid, client, DixManageAccess);
     if (rc != Success)
 	return rc;
 
     switch (stuff->feedbackid) {
     case KbdFeedbackClass:
-	if (len != (sizeof(xKbdFeedbackCtl) >> 2))
+	if (len != bytes_to_int32(sizeof(xKbdFeedbackCtl)))
 	    return BadLength;
 
 	for (k = dev->kbdfeed; k; k = k->next)
@@ -457,7 +457,7 @@ ProcXChangeFeedbackControl(ClientPtr client)
 					 (xKbdFeedbackCtl *) & stuff[1]);
 	break;
     case PtrFeedbackClass:
-	if (len != (sizeof(xPtrFeedbackCtl) >> 2))
+	if (len != bytes_to_int32(sizeof(xPtrFeedbackCtl)))
 	    return BadLength;
 
 	for (p = dev->ptrfeed; p; p = p->next)
@@ -473,7 +473,7 @@ ProcXChangeFeedbackControl(ClientPtr client)
 	if (client->swapped) {
 	    swaps(&f->num_keysyms, n);
 	}
-	if (len != ((sizeof(xStringFeedbackCtl) >> 2) + f->num_keysyms))
+	if (len != (bytes_to_int32(sizeof(xStringFeedbackCtl)) + f->num_keysyms))
 	    return BadLength;
 
 	for (s = dev->stringfeed; s; s = s->next)
@@ -483,7 +483,7 @@ ProcXChangeFeedbackControl(ClientPtr client)
 	break;
     }
     case IntegerFeedbackClass:
-	if (len != (sizeof(xIntegerFeedbackCtl) >> 2))
+	if (len != bytes_to_int32(sizeof(xIntegerFeedbackCtl)))
 	    return BadLength;
 
 	for (i = dev->intfeed; i; i = i->next)
@@ -492,7 +492,7 @@ ProcXChangeFeedbackControl(ClientPtr client)
 					     (xIntegerFeedbackCtl *)&stuff[1]);
 	break;
     case LedFeedbackClass:
-	if (len != (sizeof(xLedFeedbackCtl) >> 2))
+	if (len != bytes_to_int32(sizeof(xLedFeedbackCtl)))
 	    return BadLength;
 
 	for (l = dev->leds; l; l = l->next)
@@ -501,7 +501,7 @@ ProcXChangeFeedbackControl(ClientPtr client)
 					 (xLedFeedbackCtl *) & stuff[1]);
 	break;
     case BellFeedbackClass:
-	if (len != (sizeof(xBellFeedbackCtl) >> 2))
+	if (len != bytes_to_int32(sizeof(xBellFeedbackCtl)))
 	    return BadLength;
 
 	for (b = dev->bell; b; b = b->next)
diff --git a/Xi/chgkmap.c b/Xi/chgkmap.c
index 854c17f..e4b9e15 100644
--- a/Xi/chgkmap.c
+++ b/Xi/chgkmap.c
@@ -107,7 +107,7 @@ ProcXChangeDeviceKeyMapping(ClientPtr client)
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixManageAccess);
     if (ret != Success)
 	return ret;
-    len = stuff->length - (sizeof(xChangeDeviceKeyMappingReq) >> 2);
+    len = stuff->length - bytes_to_int32(sizeof(xChangeDeviceKeyMappingReq));
 
     ret = ChangeKeyMapping(client, dev, len, DeviceMappingNotify,
 			   stuff->firstKeyCode, stuff->keyCodes,
diff --git a/Xi/chgprop.c b/Xi/chgprop.c
index d8e37a7..d24a246 100644
--- a/Xi/chgprop.c
+++ b/Xi/chgprop.c
@@ -104,7 +104,7 @@ ProcXChangeDeviceDontPropagateList(ClientPtr client)
     REQUEST(xChangeDeviceDontPropagateListReq);
     REQUEST_AT_LEAST_SIZE(xChangeDeviceDontPropagateListReq);
 
-    if (stuff->length != (sizeof(xChangeDeviceDontPropagateListReq) >> 2) +
+    if (stuff->length != bytes_to_int32(sizeof(xChangeDeviceDontPropagateListReq)) +
 	stuff->count)
 	return BadLength;
 
diff --git a/Xi/exevents.c b/Xi/exevents.c
index c575bb4..85baa03 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -686,7 +686,7 @@ XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master, DeviceChanged
     {
         len += sizeof(xXIButtonInfo);
         len += dce->buttons.num_buttons * sizeof(Atom); /* button names */
-        len += ((((dce->buttons.num_buttons + 7)/8) + 3)/4) * 4;
+        len += pad_to_int32(bits_to_bytes(dce->buttons.num_buttons));
     }
     if (dce->num_valuators)
         len += sizeof(xXIValuatorInfo) * dce->num_valuators;
@@ -714,7 +714,7 @@ XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master, DeviceChanged
     dcce->sourceid     = device->id;
     dcce->reason       = (dce->flags & DEVCHANGE_DEVICE_CHANGE) ? XIDeviceChange : XISlaveSwitch;
     dcce->num_classes  = 0;
-    dcce->length = (len - sizeof(xEvent))/4;
+    dcce->length = bytes_to_int32(len - sizeof(xEvent));
 
     ptr = (char*)&dcce[1];
     if (dce->buttons.num_buttons)
@@ -1249,15 +1249,15 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
     mouse = (IsMaster(dev) || dev->u.master) ? GetMaster(dev, MASTER_POINTER) : dev;
 
     /* XI 2 event */
-    btlen = (mouse->button) ? (mouse->button->numButtons + 7)/8 : 0;
-    btlen = (btlen + 3)/4;
+    btlen = (mouse->button) ? bits_to_bytes(mouse->button->numButtons) : 0;
+    btlen = bytes_to_int32(btlen);
     len = sizeof(xXIFocusInEvent) + btlen * 4;
 
     xi2event = xcalloc(1, len);
     xi2event->type         = GenericEvent;
     xi2event->extension    = IReqCode;
     xi2event->evtype       = type;
-    xi2event->length       = (len - sizeof(xEvent))/4;
+    xi2event->length       = bytes_to_int32(len - sizeof(xEvent));
     xi2event->buttons_len  = btlen;
     xi2event->detail       = detail;
     xi2event->time         = currentTime.milliseconds;
diff --git a/Xi/getbmap.c b/Xi/getbmap.c
index 4a788c6..e2d5897 100644
--- a/Xi/getbmap.c
+++ b/Xi/getbmap.c
@@ -109,7 +109,7 @@ ProcXGetDeviceButtonMapping(ClientPtr client)
 	return BadMatch;
 
     rep.nElts = b->numButtons;
-    rep.length = (rep.nElts + (4 - 1)) / 4;
+    rep.length = bytes_to_int32(rep.nElts);
     WriteReplyToClient(client, sizeof(xGetDeviceButtonMappingReply), &rep);
     (void)WriteToClient(client, rep.nElts, (char *)&b->map[1]);
     return Success;
diff --git a/Xi/getdctl.c b/Xi/getdctl.c
index abb4f99..68181fa 100644
--- a/Xi/getdctl.c
+++ b/Xi/getdctl.c
@@ -306,7 +306,7 @@ ProcXGetDeviceControl(ClientPtr client)
 	break;
     }
 
-    rep.length = (total_length + 3) >> 2;
+    rep.length = bytes_to_int32(total_length);
     WriteReplyToClient(client, sizeof(xGetDeviceControlReply), &rep);
     WriteToClient(client, total_length, savbuf);
     xfree(savbuf);
diff --git a/Xi/getfctl.c b/Xi/getfctl.c
index 3a6dd45..607765e 100644
--- a/Xi/getfctl.c
+++ b/Xi/getfctl.c
@@ -358,7 +358,7 @@ ProcXGetFeedbackControl(ClientPtr client)
     for (b = dev->bell; b; b = b->next)
 	CopySwapBellFeedback(client, b, &buf);
 
-    rep.length = (total_length + 3) >> 2;
+    rep.length = bytes_to_int32(total_length);
     WriteReplyToClient(client, sizeof(xGetFeedbackControlReply), &rep);
     WriteToClient(client, total_length, savbuf);
     xfree(savbuf);
diff --git a/Xi/getprop.c b/Xi/getprop.c
index dfa27f5..1f28a8a 100644
--- a/Xi/getprop.c
+++ b/Xi/getprop.c
@@ -120,7 +120,7 @@ ProcXGetDeviceDontPropagateList(ClientPtr client)
 	if (count) {
 	    rep.count = count;
 	    buf = (XEventClass *) xalloc(rep.count * sizeof(XEventClass));
-	    rep.length = (rep.count * sizeof(XEventClass) + 3) >> 2;
+	    rep.length = bytes_to_int32(rep.count * sizeof(XEventClass));
 
 	    tbuf = buf;
 	    for (i = 0; i < EMASKSIZE; i++)
diff --git a/Xi/getselev.c b/Xi/getselev.c
index ea9bd9b..90f6284 100644
--- a/Xi/getselev.c
+++ b/Xi/getselev.c
@@ -131,7 +131,7 @@ ProcXGetSelectedExtensionEvents(ClientPtr client)
 
 	total_length = (rep.all_clients_count + rep.this_client_count) *
 	    sizeof(XEventClass);
-	rep.length = (total_length + 3) >> 2;
+	rep.length = bytes_to_int32(total_length);
 	buf = (XEventClass *) xalloc(total_length);
 
 	tclient = buf;
diff --git a/Xi/getvers.c b/Xi/getvers.c
index c8eacc1..c8e9ebc 100644
--- a/Xi/getvers.c
+++ b/Xi/getvers.c
@@ -96,8 +96,8 @@ ProcXGetExtensionVersion(ClientPtr client)
     REQUEST(xGetExtensionVersionReq);
     REQUEST_AT_LEAST_SIZE(xGetExtensionVersionReq);
 
-    if (stuff->length != (sizeof(xGetExtensionVersionReq) +
-			  stuff->nbytes + 3) >> 2)
+    if (stuff->length != bytes_to_int32(sizeof(xGetExtensionVersionReq) +
+			  stuff->nbytes))
 	return BadLength;
 
     memset(&rep, 0, sizeof(xGetExtensionVersionReply));
diff --git a/Xi/grabdev.c b/Xi/grabdev.c
index e1d430a..a7e46fe 100644
--- a/Xi/grabdev.c
+++ b/Xi/grabdev.c
@@ -84,7 +84,7 @@ SProcXGrabDevice(ClientPtr client)
     swapl(&stuff->time, n);
     swaps(&stuff->event_count, n);
 
-    if (stuff->length != (sizeof(xGrabDeviceReq) >> 2) + stuff->event_count)
+    if (stuff->length != bytes_to_int32(sizeof(xGrabDeviceReq)) + stuff->event_count)
        return BadLength;
     
     SwapLongs((CARD32 *) (&stuff[1]), stuff->event_count);
@@ -110,7 +110,7 @@ ProcXGrabDevice(ClientPtr client)
     REQUEST(xGrabDeviceReq);
     REQUEST_AT_LEAST_SIZE(xGrabDeviceReq);
 
-    if (stuff->length != (sizeof(xGrabDeviceReq) >> 2) + stuff->event_count)
+    if (stuff->length != bytes_to_int32(sizeof(xGrabDeviceReq)) + stuff->event_count)
 	return BadLength;
 
     rep.repType = X_Reply;
diff --git a/Xi/grabdevb.c b/Xi/grabdevb.c
index 58fb73b..e235f53 100644
--- a/Xi/grabdevb.c
+++ b/Xi/grabdevb.c
@@ -110,7 +110,7 @@ ProcXGrabDeviceButton(ClientPtr client)
     REQUEST_AT_LEAST_SIZE(xGrabDeviceButtonReq);
 
     if (stuff->length !=
-	(sizeof(xGrabDeviceButtonReq) >> 2) + stuff->event_count)
+	bytes_to_int32(sizeof(xGrabDeviceButtonReq)) + stuff->event_count)
 	return BadLength;
 
     ret = dixLookupDevice(&dev, stuff->grabbed_device, client, DixGrabAccess);
diff --git a/Xi/grabdevk.c b/Xi/grabdevk.c
index 9ae38f0..b34867b 100644
--- a/Xi/grabdevk.c
+++ b/Xi/grabdevk.c
@@ -107,7 +107,7 @@ ProcXGrabDeviceKey(ClientPtr client)
     REQUEST(xGrabDeviceKeyReq);
     REQUEST_AT_LEAST_SIZE(xGrabDeviceKeyReq);
 
-    if (stuff->length != (sizeof(xGrabDeviceKeyReq) >> 2) + stuff->event_count)
+    if (stuff->length != bytes_to_int32(sizeof(xGrabDeviceKeyReq)) + stuff->event_count)
 	return BadLength;
 
     ret = dixLookupDevice(&dev, stuff->grabbed_device, client, DixGrabAccess);
diff --git a/Xi/gtmotion.c b/Xi/gtmotion.c
index 55d45a3..8e91c5a 100644
--- a/Xi/gtmotion.c
+++ b/Xi/gtmotion.c
@@ -136,7 +136,7 @@ ProcXGetDeviceMotionEvents(ClientPtr client)
 					(ScreenPtr) NULL, FALSE);
     }
     if (rep.nEvents > 0) {
-	length = (rep.nEvents * size + 3) >> 2;
+	length = bytes_to_int32(rep.nEvents * size);
 	rep.length = length;
     }
     nEvents = rep.nEvents;
diff --git a/Xi/listdev.c b/Xi/listdev.c
index 1c847fb..563fc07 100644
--- a/Xi/listdev.c
+++ b/Xi/listdev.c
@@ -409,7 +409,7 @@ ProcXListInputDevices(ClientPtr client)
         ListDeviceInfo(client, d, dev++, &devbuf, &classbuf, &namebuf);
     }
     rep.ndevices = numdevs;
-    rep.length = (total_length + 3) >> 2;
+    rep.length = bytes_to_int32(total_length);
     WriteReplyToClient(client, sizeof(xListInputDevicesReply), &rep);
     WriteToClient(client, total_length, savbuf);
     xfree(savbuf);
diff --git a/Xi/opendev.c b/Xi/opendev.c
index 46d55a8..3844d25 100644
--- a/Xi/opendev.c
+++ b/Xi/opendev.c
@@ -150,7 +150,7 @@ ProcXOpenDevice(ClientPtr client)
     }
     evbase[j].class = OtherClass;
     evbase[j++].event_type_base = event_base[OtherClass];
-    rep.length = (j * sizeof(xInputClassInfo) + 3) >> 2;
+    rep.length = bytes_to_int32(j * sizeof(xInputClassInfo));
     rep.num_classes = j;
     WriteReplyToClient(client, sizeof(xOpenDeviceReply), &rep);
     WriteToClient(client, j * sizeof(xInputClassInfo), (char *)evbase);
diff --git a/Xi/queryst.c b/Xi/queryst.c
index c6858e4..60ec32e 100644
--- a/Xi/queryst.c
+++ b/Xi/queryst.c
@@ -161,7 +161,7 @@ ProcXQueryDeviceState(ClientPtr client)
     }
 
     rep.num_classes = num_classes;
-    rep.length = (total_length + 3) >> 2;
+    rep.length = bytes_to_int32(total_length);
     WriteReplyToClient(client, sizeof(xQueryDeviceStateReply), &rep);
     if (total_length > 0)
 	WriteToClient(client, total_length, savbuf);
diff --git a/Xi/selectev.c b/Xi/selectev.c
index 013fdc9..031e602 100644
--- a/Xi/selectev.c
+++ b/Xi/selectev.c
@@ -154,7 +154,7 @@ ProcXSelectExtensionEvent(ClientPtr client)
     REQUEST(xSelectExtensionEventReq);
     REQUEST_AT_LEAST_SIZE(xSelectExtensionEventReq);
 
-    if (stuff->length != (sizeof(xSelectExtensionEventReq) >> 2) + stuff->count)
+    if (stuff->length != bytes_to_int32(sizeof(xSelectExtensionEventReq)) + stuff->count)
 	return BadLength;
 
     ret = dixLookupWindow(&pWin, stuff->window, client, DixReceiveAccess);
diff --git a/Xi/sendexev.c b/Xi/sendexev.c
index 63b45ee..8629dd2 100644
--- a/Xi/sendexev.c
+++ b/Xi/sendexev.c
@@ -89,8 +89,8 @@ SProcXSendExtensionEvent(ClientPtr client)
     swapl(&stuff->destination, n);
     swaps(&stuff->count, n);
 
-    if (stuff->length != (sizeof(xSendExtensionEventReq) >> 2) + stuff->count +
-       (stuff->num_events * (sizeof(xEvent) >> 2)))
+    if (stuff->length != bytes_to_int32(sizeof(xSendExtensionEventReq)) + stuff->count +
+       bytes_to_int32(stuff->num_events * sizeof(xEvent)))
        return BadLength;
 
     eventP = (xEvent *) & stuff[1];
@@ -126,8 +126,8 @@ ProcXSendExtensionEvent(ClientPtr client)
     REQUEST(xSendExtensionEventReq);
     REQUEST_AT_LEAST_SIZE(xSendExtensionEventReq);
 
-    if (stuff->length != (sizeof(xSendExtensionEventReq) >> 2) + stuff->count +
-	(stuff->num_events * (sizeof(xEvent) >> 2)))
+    if (stuff->length != bytes_to_int32(sizeof(xSendExtensionEventReq)) + stuff->count +
+	(stuff->num_events * bytes_to_int32(sizeof(xEvent))))
 	return BadLength;
 
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixWriteAccess);
diff --git a/Xi/setbmap.c b/Xi/setbmap.c
index e7b8d4a..37c40e4 100644
--- a/Xi/setbmap.c
+++ b/Xi/setbmap.c
@@ -94,8 +94,8 @@ ProcXSetDeviceButtonMapping(ClientPtr client)
     REQUEST(xSetDeviceButtonMappingReq);
     REQUEST_AT_LEAST_SIZE(xSetDeviceButtonMappingReq);
 
-    if (stuff->length != (sizeof(xSetDeviceButtonMappingReq) +
-			  stuff->map_length + 3) >> 2)
+    if (stuff->length !=
+        bytes_to_int32(sizeof(xSetDeviceButtonMappingReq) + stuff->map_length))
 	return BadLength;
 
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixManageAccess);
diff --git a/Xi/setdval.c b/Xi/setdval.c
index fe5f316..b384f0d 100644
--- a/Xi/setdval.c
+++ b/Xi/setdval.c
@@ -100,7 +100,7 @@ ProcXSetDeviceValuators(ClientPtr client)
     rep.status = Success;
     rep.sequenceNumber = client->sequence;
 
-    if (stuff->length != (sizeof(xSetDeviceValuatorsReq) >> 2) +
+    if (stuff->length != bytes_to_int32(sizeof(xSetDeviceValuatorsReq)) +
 	stuff->num_valuators)
 	return BadLength;
 
diff --git a/Xi/setmmap.c b/Xi/setmmap.c
index ffcc7f3..cbe5dc8 100644
--- a/Xi/setmmap.c
+++ b/Xi/setmmap.c
@@ -96,8 +96,8 @@ ProcXSetDeviceModifierMapping(ClientPtr client)
     REQUEST(xSetDeviceModifierMappingReq);
     REQUEST_AT_LEAST_SIZE(xSetDeviceModifierMappingReq);
 
-    if (stuff->length != ((sizeof(xSetDeviceModifierMappingReq) >> 2) +
-                          (stuff->numKeyPerModifier << 1)))
+    if (stuff->length != bytes_to_int32(sizeof(xSetDeviceModifierMappingReq)) +
+                          (stuff->numKeyPerModifier << 1))
         return BadLength;
 
     rep.repType = X_Reply;
diff --git a/Xi/xichangehierarchy.c b/Xi/xichangehierarchy.c
index 656515b..9f52b6d 100644
--- a/Xi/xichangehierarchy.c
+++ b/Xi/xichangehierarchy.c
@@ -112,7 +112,7 @@ void XISendDeviceHierarchyEvent(int flags[MAXDEVICES])
         }
     }
 
-    ev->length = (ev->num_info * sizeof(xXIHierarchyInfo))/4;
+    ev->length = bytes_to_int32(ev->num_info * sizeof(xXIHierarchyInfo));
 
     dummyDev.id = XIAllDevices;
     SendEventToAllWindows(&dummyDev, (XI_HierarchyChangedMask >> 8), (xEvent*)ev, 1);
diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c
index 55f20c4..0a47e31 100644
--- a/Xi/xiproperty.c
+++ b/Xi/xiproperty.c
@@ -903,7 +903,7 @@ ProcXChangeDeviceProperty (ClientPtr client)
                                stuff->format, stuff->mode, stuff->nUnits);
 
     len = stuff->nUnits;
-    if (len > ((0xffffffff - sizeof(xChangeDevicePropertyReq)) >> 2))
+    if (len > (bytes_to_int32(0xffffffff - sizeof(xChangeDevicePropertyReq))))
         return BadLength;
 
     totalSize = len * (stuff->format/8);
@@ -972,7 +972,7 @@ ProcXGetDeviceProperty (ClientPtr client)
     reply.format = format;
     reply.bytesAfter = bytes_after;
     reply.propertyType = type;
-    reply.length = (length + 3) >> 2;
+    reply.length = bytes_to_int32(length);
 
     if (stuff->delete && (reply.bytesAfter == 0))
         send_property_event(dev, stuff->property, XIPropertyDeleted);
@@ -1146,7 +1146,7 @@ ProcXIChangeProperty(ClientPtr client)
     rc = check_change_property(client, stuff->property, stuff->type,
                                stuff->format, stuff->mode, stuff->num_items);
     len = stuff->num_items;
-    if (len > ((0xffffffff - sizeof(xXIChangePropertyReq)) >> 2))
+    if (len > bytes_to_int32(0xffffffff - sizeof(xXIChangePropertyReq)))
         return BadLength;
 
     totalSize = len * (stuff->format/8);
@@ -1215,7 +1215,7 @@ ProcXIGetProperty(ClientPtr client)
     reply.format = format;
     reply.bytes_after = bytes_after;
     reply.type = type;
-    reply.length = (length + 3)/4;
+    reply.length = bytes_to_int32(length);
 
     if (length && stuff->delete && (reply.bytes_after == 0))
         send_property_event(dev, stuff->property, XIPropertyDeleted);
diff --git a/Xi/xiquerydevice.c b/Xi/xiquerydevice.c
index 33628a6..68d91fa 100644
--- a/Xi/xiquerydevice.c
+++ b/Xi/xiquerydevice.c
@@ -200,7 +200,7 @@ SizeDeviceInfo(DeviceIntPtr dev)
     int len = sizeof(xXIDeviceInfo);
 
     /* 4-padded name */
-    len += (((strlen(dev->name) + 3)/4)*4);
+    len += pad_to_int32(strlen(dev->name));
 
     return len + SizeDeviceClasses(dev);
 
@@ -218,7 +218,7 @@ SizeDeviceClasses(DeviceIntPtr dev)
     {
         len += sizeof(xXIButtonInfo);
         len += dev->button->numButtons * sizeof(Atom);
-        len += ((((dev->button->numButtons + 7)/8) + 3)/4) * 4;
+        len += pad_to_int32(bits_to_bytes(dev->button->numButtons));
     }
 
     if (dev->key)
@@ -246,11 +246,12 @@ ListButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info)
     int mask_len;
     int i;
 
-    mask_len = (((dev->button->numButtons + 7)/8) + 3)/4; /* 4-byte units*/
+    mask_len = bytes_to_int32(bits_to_bytes(dev->button->numButtons));
 
     info->type = ButtonClass;
     info->num_buttons = dev->button->numButtons;
-    info->length = sizeof(xXIButtonInfo)/4 + mask_len + info->num_buttons;
+    info->length = bytes_to_int32(sizeof(xXIButtonInfo)) +
+                   info->num_buttons + mask_len;
     info->sourceid = dev->button->sourceid;
 
     bits = (unsigned char*)&info[1];
@@ -400,7 +401,7 @@ ListDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info)
     info->enabled = dev->enabled;
     total_len = sizeof(xXIDeviceInfo);
 
-    len = ((info->name_len + 3)/4) * 4;
+    len = pad_to_int32(info->name_len);
     memset(any, 0, len);
     strncpy(any, dev->name, info->name_len);
     any += len;
@@ -456,7 +457,7 @@ SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info)
     int i;
 
     /* Skip over name */
-    any += (((info->name_len + 3)/4) * 4);
+    any += pad_to_int32(info->name_len);
 
     for (i = 0; i < info->num_classes; i++)
     {
diff --git a/Xi/xiquerypointer.c b/Xi/xiquerypointer.c
index 2222873..da1d101 100644
--- a/Xi/xiquerypointer.c
+++ b/Xi/xiquerypointer.c
@@ -126,7 +126,7 @@ ProcXIQueryPointer(ClientPtr client)
     if (pDev->button)
     {
         int i, down;
-        rep.buttons_len = (((pDev->button->numButtons + 7)/8) + 3)/4;
+        rep.buttons_len = bytes_to_int32(bits_to_bytes(pDev->button->numButtons));
         rep.length += rep.buttons_len;
         buttons = xcalloc(rep.buttons_len, 4);
         if (!buttons)
diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 750ae61..2baae77 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -196,7 +196,7 @@ ProcXIGetSelectedEvents(ClientPtr client)
         return Success;
     }
 
-    buffer = xcalloc(MAXDEVICES, sizeof(xXIEventMask) + ((XI2MASKSIZE + 3)/4) * 4);
+    buffer = xcalloc(MAXDEVICES, sizeof(xXIEventMask) + pad_to_int32(XI2MASKSIZE));
     if (!buffer)
         return BadAlloc;
 
commit 912402fd71144bcee255141efe12a78abad39240
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 29 13:09:57 2009 +1000

    include: introduce byte counting functions.
    
    This patch adds the following three functions:
     bits_to_bytes(bits) - the number of bytes needed to hold 'bits'
     bytes_to_int32(bytes) - the number of 4-byte units to hold 'bytes'
     pad_to_int32(bytes) - the closest multiple of 4 equal to or larger than
                            'bytes'.
    
    All three operations are common in protocol processing and currently the
    server has ((foo + 7)/8 + 3)/4 operations all over the place. A common set
    of functions reduce the error rate of these (albeit simple) calculations and
    improve readability of the code.
    
    The functions do not check for overflow.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/misc.h b/include/misc.h
index 61dd947..877c682 100644
--- a/include/misc.h
+++ b/include/misc.h
@@ -180,6 +180,36 @@ typedef struct _xReq *xReqPtr;
 
 #endif
 
+/**
+ * Calculate the number of bytes needed to hold bits.
+ * @param bits The minimum number of bits needed.
+ * @return The number of bytes needed to hold bits.
+ */
+static inline int
+bits_to_bytes(const int bits) {
+    return ((bits + 7) >> 3);
+}
+/**
+ * Calculate the number of 4-byte units needed to hold the given number of
+ * bytes.
+ * @param bytes The minimum number of bytes needed.
+ * @return The number of 4-byte units needed to hold bytes.
+ */
+static inline int
+bytes_to_int32(const int bytes) {
+    return (((bytes) + 3) >> 2);
+}
+
+/**
+ * Calculate the number of bytes (in multiples of 4) needed to hold bytes.
+ * @param bytes The minimum number of bytes needed.
+ * @return The closest multiple of 4 that is equal or higher than bytes.
+ */
+static inline int
+pad_to_int32(const int bytes) {
+    return (((bytes) + 3) & ~3);
+}
+
 /* some macros to help swap requests, replies, and events */
 
 #define LengthRestB(stuff) \
diff --git a/test/input.c b/test/input.c
index bb32491..e2faaef 100644
--- a/test/input.c
+++ b/test/input.c
@@ -678,6 +678,44 @@ static void dix_grab_matching(void)
     g_assert(rc == TRUE);
 }
 
+static void include_byte_padding_macros(void)
+{
+    int i;
+    g_test_message("Testing bits_to_bytes()");
+
+    /* the macros don't provide overflow protection */
+    for (i = 0; i < INT_MAX - 7; i++)
+    {
+        int expected_bytes;
+        expected_bytes = (i + 7)/8;
+
+        g_assert(bits_to_bytes(i) >= i/8);
+        g_assert((bits_to_bytes(i) * 8) - i <= 7);
+    }
+
+    g_test_message("Testing bytes_to_int32()");
+    for (i = 0; i < INT_MAX - 3; i++)
+    {
+        int expected_4byte;
+        expected_4byte = (i + 3)/4;
+
+        g_assert(bytes_to_int32(i) <= i);
+        g_assert((bytes_to_int32(i) * 4) - i <= 3);
+    }
+
+    g_test_message("Testing pad_to_int32");
+
+    for (i = 0; i < INT_MAX - 3; i++)
+    {
+        int expected_bytes;
+        expected_bytes = ((i + 3)/4) * 4;
+
+        g_assert(pad_to_int32(i) >= i);
+        g_assert(pad_to_int32(i) - i <= 3);
+    }
+
+}
+
 int main(int argc, char** argv)
 {
     g_test_init(&argc, &argv,NULL);
@@ -688,6 +726,7 @@ int main(int argc, char** argv)
     g_test_add_func("/dix/input/check-grab-values", dix_check_grab_values);
     g_test_add_func("/dix/input/xi2-struct-sizes", xi2_struct_sizes);
     g_test_add_func("/dix/input/grab_matching", dix_grab_matching);
+    g_test_add_func("/include/byte_padding_macros", include_byte_padding_macros);
 
     return g_test_run();
 }
commit 2c535b6f13ffbf2c4ac59834dae39bb8e172c003
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jul 14 08:58:23 2009 +1000

    dix: don't send presence events for attaching/detaching slave devices.
    
    The code that didn't list attached slave devices for XI1 clients doesn't
    exist anymore, so there's no need for these presence events.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/devices.c b/dix/devices.c
index 8fac981..9f2cb2b 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -2391,11 +2391,6 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
         InitializeSprite(dev, currentRoot);
         dev->spriteInfo->spriteOwner = FALSE;
         dev->spriteInfo->paired = dev;
-
-        /* Floating an SD makes it appear to XI 1 clients */
-        SendDevicePresenceEvent(dev->id, DeviceAdded);
-        if (dev->enabled)
-            SendDevicePresenceEvent(dev->id, DeviceEnabled);
     } else
     {
         dev->spriteInfo->sprite = master->spriteInfo->sprite;
@@ -2403,14 +2398,6 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
         dev->spriteInfo->spriteOwner = FALSE;
 
         RecalculateMasterButtons(master);
-
-        if (!oldmaster)
-        {
-            /* Attaching a floating SD makes it disappear to XI 1 clients */
-            if (dev->enabled)
-                SendDevicePresenceEvent(dev->id, DeviceDisabled);
-            SendDevicePresenceEvent(dev->id, DeviceRemoved);
-        }
     }
 
     /* If we were connected to master device before, this MD may need to
commit 0c0ef42292f4c910c73b308cd75d77637312da53
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Jul 12 21:43:06 2009 +1000

    dix: Remove temporary detachment of slave devices.
    
    Previously, an active grab on an attached slave device would send the device
    floating for the duration of the grab. This breaks existing XI applications
    (e.g. the GIMP) since they grab all devices automatically - resulting in the
    loss of control over the VCP.
    
    The behaviour of extended input devices during a grab in relation to the
    core pointer is not specified in the XI protocol specification.
    The removal of the temporary detachment restores the behaviour of extended
    input devices as present in currently released servers - even if a device is
    grabbed, an event from this device will result in an event from the core
    pointer.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/events.c b/dix/events.c
index 81e5b6d..52f8b0d 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -1444,54 +1444,6 @@ CheckGrabForSyncs(DeviceIntPtr thisDev, Bool thisMode, Bool otherMode)
     ComputeFreezes();
 }
 
-/* Only ever used if a grab is called on an attached slave device. */
-static int GrabPrivateKeyIndex;
-static DevPrivateKey GrabPrivateKey = &GrabPrivateKeyIndex;
-
-/**
- * Save the device's master device in the devPrivates. This needs to be done
- * if a client directly grabs a slave device that is attached to a master. For
- * the duration of the grab, the device is detached, ungrabbing re-attaches it
- * though.
- *
- * We store the ID of the master device only in case the master disappears
- * while the device has a grab.
- */
-static void
-DetachFromMaster(DeviceIntPtr dev)
-{
-    int id;
-    if (!dev->u.master)
-        return;
-
-    id = dev->u.master->id;
-
-    dixSetPrivate(&dev->devPrivates, GrabPrivateKey, (void *)id);
-    AttachDevice(NULL, dev, NULL);
-}
-
-static void
-ReattachToOldMaster(DeviceIntPtr dev)
-{
-    int id;
-    void *p;
-    DeviceIntPtr master = NULL;
-
-    if (IsMaster(dev))
-        return;
-
-
-    p = dixLookupPrivate(&dev->devPrivates, GrabPrivateKey);
-    id = (int)p; /* silence gcc warnings */
-    dixLookupDevice(&master, id, serverClient, DixUseAccess);
-
-    if (master)
-    {
-        AttachDevice(serverClient, dev, master);
-        dixSetPrivate(&dev->devPrivates, GrabPrivateKey, NULL);
-    }
-}
-
 /**
  * Activate a pointer grab on the given device. A pointer grab will cause all
  * core pointer events of this device to be delivered to the grabbing client only.
@@ -1517,10 +1469,6 @@ ActivatePointerGrab(DeviceIntPtr mouse, GrabPtr grab,
                         : mouse->spriteInfo->sprite->win;
     Bool isPassive = autoGrab & ~ImplicitGrabMask;
 
-    /* slave devices need to float for the duration of the grab. */
-    if (!(autoGrab & ImplicitGrabMask) && !IsMaster(mouse))
-        DetachFromMaster(mouse);
-
     if (grab->confineTo)
     {
 	if (grab->confineTo->drawable.pScreen
@@ -1555,8 +1503,6 @@ DeactivatePointerGrab(DeviceIntPtr mouse)
 {
     GrabPtr grab = mouse->deviceGrab.grab;
     DeviceIntPtr dev;
-    Bool wasImplicit = (mouse->deviceGrab.fromPassiveGrab &&
-                        mouse->deviceGrab.implicitGrab);
 
     mouse->valuator->motionHintWindow = NullWindow;
     mouse->deviceGrab.grab = NullGrab;
@@ -1576,9 +1522,6 @@ DeactivatePointerGrab(DeviceIntPtr mouse)
     if (grab->cursor)
 	FreeCursor(grab->cursor, (Cursor)0);
 
-    if (!wasImplicit)
-        ReattachToOldMaster(mouse);
-
     ComputeFreezes();
 }
 
@@ -1593,10 +1536,6 @@ ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time, Bool pass
     GrabInfoPtr grabinfo = &keybd->deviceGrab;
     WindowPtr oldWin;
 
-    /* slave devices need to float for the duration of the grab. */
-    if (!(passive & ImplicitGrabMask) && !IsMaster(keybd))
-        DetachFromMaster(keybd);
-
     if (grabinfo->grab)
 	oldWin = grabinfo->grab->window;
     else if (keybd->focus)
@@ -1629,8 +1568,6 @@ DeactivateKeyboardGrab(DeviceIntPtr keybd)
     DeviceIntPtr dev;
     WindowPtr focusWin = keybd->focus ? keybd->focus->win
                                            : keybd->spriteInfo->sprite->win;
-    Bool wasImplicit = (keybd->deviceGrab.fromPassiveGrab &&
-                        keybd->deviceGrab.implicitGrab);
 
     if (focusWin == FollowKeyboardWin)
 	focusWin = inputInfo.keyboard->focus->win;
@@ -1647,9 +1584,6 @@ DeactivateKeyboardGrab(DeviceIntPtr keybd)
     }
     DoFocusEvents(keybd, grab->window, focusWin, NotifyUngrab);
 
-    if (!wasImplicit)
-        ReattachToOldMaster(keybd);
-
     ComputeFreezes();
 }
 
commit 9f1570c8f4f549cdd2fbae1234011290fcc73e18
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jun 26 09:12:47 2009 +1000

    input: include effective modifiers in device events.
    
    Require inputproto 1.9.99.13
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 34fdf50..c575bb4 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1026,10 +1026,12 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
         event->mods.base = state->base_mods;
         event->mods.latched = state->latched_mods;
         event->mods.locked = state->locked_mods;
+        event->mods.effective = state->mods;
 
         event->group.base = state->base_group;
         event->group.latched = state->latched_group;
         event->group.locked = state->locked_group;
+        event->group.effective = state->group;
     }
 
     ret = UpdateDeviceState(device, event);
@@ -1274,10 +1276,12 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
         xi2event->mods.base_mods = dev->key->xkbInfo->state.base_mods;
         xi2event->mods.latched_mods = dev->key->xkbInfo->state.latched_mods;
         xi2event->mods.locked_mods = dev->key->xkbInfo->state.locked_mods;
+        xi2event->mods.effective_mods = dev->key->xkbInfo->state.mods;
 
         xi2event->group.base_group = dev->key->xkbInfo->state.base_group;
         xi2event->group.latched_group = dev->key->xkbInfo->state.latched_group;
         xi2event->group.locked_group = dev->key->xkbInfo->state.locked_group;
+        xi2event->group.effective_group = dev->key->xkbInfo->state.group;
     }
 
     FixUpEventFromWindow(dev, (xEvent*)xi2event, pWin, None, FALSE);
diff --git a/configure.ac b/configure.ac
index a2e0080..25c5c5e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -704,7 +704,7 @@ XEXT_LIB='$(top_builddir)/Xext/libXext.la'
 XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
 
 dnl Core modules for most extensions, et al.
-REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.9.3] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.12] [kbproto >= 1.0.3]"
+REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.9.3] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.13] [kbproto >= 1.0.3]"
 REQUIRED_LIBS="xfont xau fontenc [pixman-1 >= 0.15.12]"
 
 dnl HAVE_DBUS is true if we actually have the D-Bus library, whereas
diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index ac2b0c3..a65bf68 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -417,10 +417,12 @@ eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
     xde->mods.base_mods         = ev->mods.base;
     xde->mods.latched_mods      = ev->mods.latched;
     xde->mods.locked_mods       = ev->mods.locked;
+    xde->mods.effective_mods    = ev->mods.effective;
 
     xde->group.base_group       = ev->group.base;
     xde->group.latched_group    = ev->group.latched;
     xde->group.locked_group     = ev->group.locked;
+    xde->group.effective_group  = ev->group.effective;
 
     ptr = (char*)&xde[1];
     for (i = 0; i < sizeof(ev->buttons) * 8; i++)
diff --git a/include/events.h b/include/events.h
index f6405c5..d34637e 100644
--- a/include/events.h
+++ b/include/events.h
@@ -101,11 +101,13 @@ typedef struct
         uint32_t base;    /**< XKB base modifiers */
         uint32_t latched; /**< XKB latched modifiers */
         uint32_t locked;  /**< XKB locked modifiers */
+        uint32_t effective;/**< XKB effective modifiers */
     } mods;
     struct {
         uint8_t base;    /**< XKB base group */
         uint8_t latched; /**< XKB latched group */
         uint8_t locked;  /**< XKB locked group */
+        uint8_t effective;/**< XKB effective group */
     } group;
     Window      root; /**< Root window of the event */
     int corestate;    /**< Core key/button state BEFORE the event */
commit 78aedbe609e309446e71835ed15e4557d3ccf723
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Fri Jul 10 17:35:57 2009 -0700

    Fix int10 module build after typo in commit 2638e9899
    
    Signed-off-by: Alan Coopersmith <alan.coopersmith at sun.com>

diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am
index 957cb17..898c9b8 100644
--- a/hw/xfree86/Makefile.am
+++ b/hw/xfree86/Makefile.am
@@ -30,7 +30,7 @@ endif
 
 DOC_SUBDIR = doc
 
-SUBDIRS = common ddc i2c x86emu $(INT10MODULE) fbdevhw os-support parser \
+SUBDIRS = common ddc i2c x86emu $(INT10_SUBDIR) fbdevhw os-support parser \
 	  ramdac shadowfb $(VBE_SUBDIR) $(VGAHW_SUBDIR) $(XAA_SUBDIR) \
 	  xf8_16bpp loader dixmods exa modes \
 	  $(DRI_SUBDIR) $(DRI2_SUBDIR) $(XF86UTILS_SUBDIR) $(DOC_SUBDIR)
commit 35758544813f156eaac28844e693b2a28f6de316
Author: Michel Dänzer <daenzer at vmware.com>
Date:   Fri Jul 10 20:06:02 2009 +0200

    EXA: Only pass CT_YXBANDED to RECTS_TO_REGION() if that is really true.
    
    Fixes http://bugs.freedesktop.org/show_bug.cgi?id=22642 .

diff --git a/exa/exa_accel.c b/exa/exa_accel.c
index 39f3437..001a4f0 100644
--- a/exa/exa_accel.c
+++ b/exa/exa_accel.c
@@ -394,6 +394,7 @@ exaHWCopyNtoN (DrawablePtr    pSrcDrawable,
 
     if (rects) {
 	int i;
+	int ordering;
 
 	for (i = 0; i < nbox; i++) {
 	    rects[i].x = pbox[i].x1 + dx + src_off_x;
@@ -402,7 +403,16 @@ exaHWCopyNtoN (DrawablePtr    pSrcDrawable,
 	    rects[i].height = pbox[i].y2 - pbox[i].y1;
 	}
 
-	srcregion  = RECTS_TO_REGION(pScreen, nbox, rects, CT_YXBANDED);
+	/* This must match the miRegionCopy() logic for reversing rect order */
+	if (nbox == 1 || (dx > 0 && dy > 0) ||
+	    (pDstDrawable != pSrcDrawable &&
+	     (pDstDrawable->type != DRAWABLE_WINDOW ||
+	      pSrcDrawable->type != DRAWABLE_WINDOW)))
+	    ordering = CT_YXBANDED;
+	else
+	    ordering = CT_UNSORTED;
+
+	srcregion  = RECTS_TO_REGION(pScreen, nbox, rects, ordering);
 	xfree(rects);
 
 	if (!pGC || !exaGCReadsDestination(pDstDrawable, pGC->planemask,
commit 2638e9899e57d9b25a2cade3247083a6e101dee2
Author: Tiago Vignatti <tiago.vignatti at nokia.com>
Date:   Fri Jul 10 16:09:08 2009 +0300

    configure: introduce --{enable,disable}-int10-module
    
    Not all chipsets need to rely on the int10 scheme to do its daily work.
    
    Well, the ideal would be to remove all int10 module from the server. I'll try
    to provide some patches "soon" for this. Something like:
        http://cgit.freedesktop.org/~vignatti/libx86/
    
    Signed-off-by: Tiago Vignatti <tiago.vignatti at nokia.com>
    Acked-by: Oliver McFadden <oliver.mcfadden at nokia.com>

diff --git a/configure.ac b/configure.ac
index 07bb05a..a2e0080 100644
--- a/configure.ac
+++ b/configure.ac
@@ -585,6 +585,7 @@ AC_ARG_ENABLE(xfree86-utils,     AS_HELP_STRING([--enable-xfree86-utils], [Build
 AC_ARG_ENABLE(xaa,               AS_HELP_STRING([--enable-xaa], [Build XAA (default: enabled)]), [XAA=$enableval], [XAA=yes])
 AC_ARG_ENABLE(vgahw,          AS_HELP_STRING([--enable-vgahw], [Build Xorg with vga access (default: enabled)]), [VGAHW=$enableval], [VGAHW=yes])
 AC_ARG_ENABLE(vbe,            AS_HELP_STRING([--enable-vbe], [Build Xorg with VBE module (default: enabled)]), [VBE=$enableval], [VBE=yes])
+AC_ARG_ENABLE(int10-module,     AS_HELP_STRING([--enable-int10-module], [Build Xorg with int10 module (default: enabled)]), [INT10MODULE=$enableval], [INT10MODULE=yes])
 
 dnl DDXes.
 AC_ARG_ENABLE(xorg,    	      AS_HELP_STRING([--enable-xorg], [Build Xorg server (default: auto)]), [XORG=$enableval], [XORG=auto])
@@ -1027,6 +1028,7 @@ AM_CONDITIONAL(XF86UTILS, test "x$XF86UTILS" = xyes)
 AM_CONDITIONAL(XAA, test "x$XAA" = xyes)
 AM_CONDITIONAL(VGAHW, test "x$VGAHW" = xyes)
 AM_CONDITIONAL(VBE, test "x$VBE" = xyes)
+AM_CONDITIONAL(INT10MODULE, test "x$INT10MODULE" = xyes)
 
 AC_DEFINE(SHAPE, 1, [Support SHAPE extension])
 
diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am
index 6154d7f..957cb17 100644
--- a/hw/xfree86/Makefile.am
+++ b/hw/xfree86/Makefile.am
@@ -24,9 +24,13 @@ if VBE
 VBE_SUBDIR = vbe
 endif
 
+if INT10MODULE
+INT10_SUBDIR = int10
+endif
+
 DOC_SUBDIR = doc
 
-SUBDIRS = common ddc i2c x86emu int10 fbdevhw os-support parser \
+SUBDIRS = common ddc i2c x86emu $(INT10MODULE) fbdevhw os-support parser \
 	  ramdac shadowfb $(VBE_SUBDIR) $(VGAHW_SUBDIR) $(XAA_SUBDIR) \
 	  xf8_16bpp loader dixmods exa modes \
 	  $(DRI_SUBDIR) $(DRI2_SUBDIR) $(XF86UTILS_SUBDIR) $(DOC_SUBDIR)
commit 42d95a38535f382bfb2ddfaef93839ab9bbf584f
Author: Tiago Vignatti <tiago.vignatti at nokia.com>
Date:   Fri Jul 10 15:54:07 2009 +0300

    configure: introduce --{enable,disable}-vbe
    
    Not all drivers need this kind of access as well.
    
    Signed-off-by: Tiago Vignatti <tiago.vignatti at nokia.com>
    Acked-by: Oliver McFadden <oliver.mcfadden at nokia.com>

diff --git a/configure.ac b/configure.ac
index c81874b..07bb05a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -584,6 +584,7 @@ AC_ARG_ENABLE(config-hal,     AS_HELP_STRING([--disable-config-hal], [Build HAL
 AC_ARG_ENABLE(xfree86-utils,     AS_HELP_STRING([--enable-xfree86-utils], [Build xfree86 DDX utilities (default: enabled)]), [XF86UTILS=$enableval], [XF86UTILS=yes])
 AC_ARG_ENABLE(xaa,               AS_HELP_STRING([--enable-xaa], [Build XAA (default: enabled)]), [XAA=$enableval], [XAA=yes])
 AC_ARG_ENABLE(vgahw,          AS_HELP_STRING([--enable-vgahw], [Build Xorg with vga access (default: enabled)]), [VGAHW=$enableval], [VGAHW=yes])
+AC_ARG_ENABLE(vbe,            AS_HELP_STRING([--enable-vbe], [Build Xorg with VBE module (default: enabled)]), [VBE=$enableval], [VBE=yes])
 
 dnl DDXes.
 AC_ARG_ENABLE(xorg,    	      AS_HELP_STRING([--enable-xorg], [Build Xorg server (default: auto)]), [XORG=$enableval], [XORG=auto])
@@ -1025,6 +1026,7 @@ XI_INC='-I$(top_srcdir)/Xi'
 AM_CONDITIONAL(XF86UTILS, test "x$XF86UTILS" = xyes)
 AM_CONDITIONAL(XAA, test "x$XAA" = xyes)
 AM_CONDITIONAL(VGAHW, test "x$VGAHW" = xyes)
+AM_CONDITIONAL(VBE, test "x$VBE" = xyes)
 
 AC_DEFINE(SHAPE, 1, [Support SHAPE extension])
 
diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am
index df311b4..6154d7f 100644
--- a/hw/xfree86/Makefile.am
+++ b/hw/xfree86/Makefile.am
@@ -20,10 +20,14 @@ if VGAHW
 VGAHW_SUBDIR = vgahw
 endif
 
+if VBE
+VBE_SUBDIR = vbe
+endif
+
 DOC_SUBDIR = doc
 
 SUBDIRS = common ddc i2c x86emu int10 fbdevhw os-support parser \
-	  ramdac shadowfb vbe $(VGAHW_SUBDIR) $(XAA_SUBDIR) \
+	  ramdac shadowfb $(VBE_SUBDIR) $(VGAHW_SUBDIR) $(XAA_SUBDIR) \
 	  xf8_16bpp loader dixmods exa modes \
 	  $(DRI_SUBDIR) $(DRI2_SUBDIR) $(XF86UTILS_SUBDIR) $(DOC_SUBDIR)
 
commit 53d64930513fecaa417bb5a922966b45c9ff8679
Author: Tiago Vignatti <tiago.vignatti at nokia.com>
Date:   Fri Jul 10 15:38:51 2009 +0300

    configure: introduce --{enable,disable}-vgahw
    
    Not all drivers need this kind of access.
    
    Signed-off-by: Tiago Vignatti <tiago.vignatti at nokia.com>
    Acked-by: Oliver McFadden <oliver.mcfadden at nokia.com>

diff --git a/configure.ac b/configure.ac
index 65a17de..c81874b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -583,6 +583,7 @@ AC_ARG_ENABLE(config-dbus,    AS_HELP_STRING([--enable-config-dbus], [Build D-BU
 AC_ARG_ENABLE(config-hal,     AS_HELP_STRING([--disable-config-hal], [Build HAL support (default: auto)]), [CONFIG_HAL=$enableval], [CONFIG_HAL=auto])
 AC_ARG_ENABLE(xfree86-utils,     AS_HELP_STRING([--enable-xfree86-utils], [Build xfree86 DDX utilities (default: enabled)]), [XF86UTILS=$enableval], [XF86UTILS=yes])
 AC_ARG_ENABLE(xaa,               AS_HELP_STRING([--enable-xaa], [Build XAA (default: enabled)]), [XAA=$enableval], [XAA=yes])
+AC_ARG_ENABLE(vgahw,          AS_HELP_STRING([--enable-vgahw], [Build Xorg with vga access (default: enabled)]), [VGAHW=$enableval], [VGAHW=yes])
 
 dnl DDXes.
 AC_ARG_ENABLE(xorg,    	      AS_HELP_STRING([--enable-xorg], [Build Xorg server (default: auto)]), [XORG=$enableval], [XORG=auto])
@@ -1023,6 +1024,7 @@ XI_INC='-I$(top_srcdir)/Xi'
 
 AM_CONDITIONAL(XF86UTILS, test "x$XF86UTILS" = xyes)
 AM_CONDITIONAL(XAA, test "x$XAA" = xyes)
+AM_CONDITIONAL(VGAHW, test "x$VGAHW" = xyes)
 
 AC_DEFINE(SHAPE, 1, [Support SHAPE extension])
 
@@ -1557,7 +1559,6 @@ if test "x$XORG" = xyes; then
 	AC_DEFINE(NEED_XF86_TYPES, 1, [Need XFree86 typedefs])
 	AC_DEFINE(NEED_XF86_PROTOTYPES, 1, [Need XFree86 helper functions])
 	AC_DEFINE(__XSERVERNAME__, "Xorg", [Name of X server])
-	AC_DEFINE(WITH_VGAHW, 1, [Building vgahw module])
 	AC_DEFINE_DIR(__XCONFIGFILE__, XF86CONFIGFILE, [Name of configuration file])
 	AC_DEFINE_DIR(XF86CONFIGFILE, XF86CONFIGFILE, [Name of configuration file])
 	AC_DEFINE_DIR(DEFAULT_MODULE_PATH, moduledir, [Default module search path])
@@ -1565,6 +1566,9 @@ if test "x$XORG" = xyes; then
 	AC_DEFINE_DIR(DEFAULT_LOGPREFIX, LOGPREFIX, [Default log location])
 	AC_DEFINE_UNQUOTED(__VENDORDWEBSUPPORT__, ["$VENDOR_WEB"], [Vendor web address for support])
 	AC_DEFINE(XSERVER_LIBPCIACCESS, 1, [Use libpciaccess for all pci manipulation])
+	if test "x$VGAHW" = xyes; then
+		AC_DEFINE(WITH_VGAHW, 1, [Building vgahw module])
+	fi
 
 	driverdir="$moduledir/drivers"
 	AC_SUBST([moduledir])
diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am
index eb487f6..df311b4 100644
--- a/hw/xfree86/Makefile.am
+++ b/hw/xfree86/Makefile.am
@@ -16,10 +16,14 @@ if XAA
 XAA_SUBDIR = xaa
 endif
 
+if VGAHW
+VGAHW_SUBDIR = vgahw
+endif
+
 DOC_SUBDIR = doc
 
 SUBDIRS = common ddc i2c x86emu int10 fbdevhw os-support parser \
-	  ramdac shadowfb vbe vgahw $(XAA_SUBDIR) \
+	  ramdac shadowfb vbe $(VGAHW_SUBDIR) $(XAA_SUBDIR) \
 	  xf8_16bpp loader dixmods exa modes \
 	  $(DRI_SUBDIR) $(DRI2_SUBDIR) $(XF86UTILS_SUBDIR) $(DOC_SUBDIR)
 
commit aafcae79d17c1f802bc880d2142af7171fed75d8
Author: Tiago Vignatti <tiago.vignatti at nokia.com>
Date:   Fri Jul 10 14:56:31 2009 +0300

    xfree86: remove unused vbe header file
    
    Signed-off-by: Tiago Vignatti <tiago.vignatti at nokia.com>
    Acked-by: Oliver McFadden <oliver.mcfadden at nokia.com>

diff --git a/hw/xfree86/common/xf86ShowOpts.c b/hw/xfree86/common/xf86ShowOpts.c
index 622e261..04a9a8b 100644
--- a/hw/xfree86/common/xf86ShowOpts.c
+++ b/hw/xfree86/common/xf86ShowOpts.c
@@ -45,7 +45,6 @@
 #include "xf86Parser.h"
 #include "xf86tokens.h"
 #include "Configint.h"
-#include "vbe.h"
 #include "xf86DDC.h"
 #if defined(__sparc__) && !defined(__OpenBSD__)
 #include "xf86Bus.h"
commit 3711d68f657c77b947cc4670cc4eac4f62de3af8
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jul 10 11:10:30 2009 +1000

    Revert "XKB: Sanitise * actions" commits (#19602)
    
    Reverts the following four patches:
    
    feb757f384382c7782ceac55 "XKB: Sanitise vmods for redirected keys"
    b5f49382fe48f0a762d9a15f "XKB: Sanitise ctrls action"
    1bd7fd195d85681e722161f8 "XKB: Sanitise pointer actions"
    61c508fa78aa08ea2666fde9 "XKB: Sanitise vmods in actions"
    
    Strictly speaking, the structs used in the server are not part of the client
    ABI. Practically, they are as we copy from the wire straight into the
    structs. Changing the struct sizes breaks various wire/server conversions.
    
    Even when the structs have the same size, some internal magic causes
    conversions to fail. Visible by diffing the output files of:
    setxkbmap -layout de; xkbcomp -xkb :0 busted.xkb
    setxkbmap -layout de -print | xkbcomp -xkb - correct.xkb
    
    Interestingly enough, busted.xkb is the working one although the output is
    incorrect. Revert the four offending patches until the exact cause of this
    breakage can be determined.
    
    This patch restores functionality to Level3 modifiers.
    
    X.Org Bug 19602 <http://bugs.freedesktop.org/show_bug.cgi?id=19602>
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/xkbstr.h b/include/xkbstr.h
index ec19b30..4afe010 100644
--- a/include/xkbstr.h
+++ b/include/xkbstr.h
@@ -123,8 +123,14 @@ typedef struct _XkbModAction {
 	unsigned char	flags;
 	unsigned char	mask;
 	unsigned char	real_mods;
-        unsigned int    vmods;
+        /* FIXME: Make this an int. */
+	unsigned char	vmods1;
+	unsigned char	vmods2;
 } XkbModAction;
+#define	XkbModActionVMods(a) ((short) (((a)->vmods1 << 8) | (a)->vmods2))
+#define	XkbSetModActionVMods(a,v) \
+	((a)->vmods1 = (((v) >> 8) & 0xff), \
+         (a)->vmods2 = (v) & 0xff)
 
 typedef struct _XkbGroupAction {
 	unsigned char	type;
@@ -143,15 +149,23 @@ typedef struct _XkbISOAction {
         /* FIXME: Make this an int. */
 	char		group_XXX;
 	unsigned char	affect;
-	unsigned int	vmods;
+	unsigned char	vmods1;
+	unsigned char	vmods2;
 } XkbISOAction;
 
 typedef struct _XkbPtrAction {
 	unsigned char	type;
 	unsigned char	flags;
-	int	        x;
-	int	        y;
+        /* FIXME: Make this an int. */
+	unsigned char	high_XXX;
+	unsigned char	low_XXX;
+	unsigned char	high_YYY;
+	unsigned char	low_YYY;
 } XkbPtrAction;
+#define	XkbPtrActionX(a)      (Xkb2CharsToInt((a)->high_XXX,(a)->low_XXX))
+#define	XkbPtrActionY(a)      (Xkb2CharsToInt((a)->high_YYY,(a)->low_YYY))
+#define	XkbSetPtrActionX(a,x) (XkbIntTo2Chars(x,(a)->high_XXX,(a)->low_XXX))
+#define	XkbSetPtrActionY(a,y) (XkbIntTo2Chars(y,(a)->high_YYY,(a)->low_YYY))
 
 typedef struct _XkbPtrBtnAction {
 	unsigned char	type;
@@ -180,8 +194,20 @@ typedef struct _XkbSwitchScreenAction {
 typedef struct _XkbCtrlsAction {
 	unsigned char	type;
 	unsigned char	flags;
-	unsigned long	ctrls;
+        /* FIXME: Make this an int. */
+	unsigned char	ctrls3;
+	unsigned char	ctrls2;
+	unsigned char	ctrls1;
+	unsigned char	ctrls0;
 } XkbCtrlsAction;
+#define	XkbActionSetCtrls(a, c) ((a)->ctrls3 = ((c) >> 24) & 0xff, \
+                                 (a)->ctrls2 = ((c) >> 16) & 0xff, \
+                                 (a)->ctrls1 = ((c) >> 8) & 0xff, \
+                                 (a)->ctrls0 = (c) & 0xff)
+#define	XkbActionCtrls(a) ((((unsigned int)(a)->ctrls3)<<24)|\
+			   (((unsigned int)(a)->ctrls2)<<16)|\
+			   (((unsigned int)(a)->ctrls1)<<8)|\
+                           ((unsigned int) (a)->ctrls0))
 
 typedef struct _XkbMessageAction {
 	unsigned char	type;
@@ -194,10 +220,23 @@ typedef struct	_XkbRedirectKeyAction {
 	unsigned char	new_key;
 	unsigned char	mods_mask;
 	unsigned char	mods;
-	unsigned int	vmods_mask;
-	unsigned int	vmods;
+        /* FIXME: Make this an int. */
+	unsigned char	vmods_mask0;
+	unsigned char	vmods_mask1;
+	unsigned char	vmods0;
+	unsigned char	vmods1;
 } XkbRedirectKeyAction;
 
+#define	XkbSARedirectVMods(a)		((((unsigned int)(a)->vmods1)<<8)|\
+					((unsigned int)(a)->vmods0))
+/* FIXME: This is blatantly not setting vmods.   Yeesh. */
+#define	XkbSARedirectSetVMods(a,m)	(((a)->vmods_mask1=(((m)>>8)&0xff)),\
+					 ((a)->vmods_mask0=((m)&0xff)))
+#define	XkbSARedirectVModsMask(a)	((((unsigned int)(a)->vmods_mask1)<<8)|\
+					((unsigned int)(a)->vmods_mask0))
+#define	XkbSARedirectSetVModsMask(a,m)	(((a)->vmods_mask1=(((m)>>8)&0xff)),\
+					 ((a)->vmods_mask0=((m)&0xff)))
+
 typedef struct _XkbDeviceBtnAction {
 	unsigned char	type;
 	unsigned char	flags;
diff --git a/xkb/XKBMisc.c b/xkb/XKBMisc.c
index 9cb7061..8679060 100644
--- a/xkb/XKBMisc.c
+++ b/xkb/XKBMisc.c
@@ -343,7 +343,7 @@ unsigned	tmp;
 	case XkbSA_SetMods: case XkbSA_LatchMods: case XkbSA_LockMods:
 	    if (act->mods.flags&XkbSA_UseModMapMods)
 		act->mods.real_mods= act->mods.mask= mods;
-	    if ((tmp= act->mods.vmods)!=0) {
+	    if ((tmp= XkbModActionVMods(&act->mods))!=0) {
 		XkbVirtualModsToReal(xkb,tmp,&tmp);
 		act->mods.mask|= tmp;
 	    }
@@ -351,7 +351,7 @@ unsigned	tmp;
 	case XkbSA_ISOLock:
 	    if (act->iso.flags&XkbSA_UseModMapMods)
 		act->iso.real_mods= act->iso.mask= mods;
-	    if ((tmp= act->iso.vmods)!=0) {
+	    if ((tmp= XkbModActionVMods(&act->iso))!=0) {
 		XkbVirtualModsToReal(xkb,tmp,&tmp);
 		act->iso.mask|= tmp;
 	    }
@@ -666,7 +666,7 @@ unsigned int	tmp;
 
     switch (act->type) {
 	case XkbSA_SetMods: case XkbSA_LatchMods: case XkbSA_LockMods:
-	    if (((tmp= act->mods.vmods)&changed)!=0) {
+	    if (((tmp= XkbModActionVMods(&act->mods))&changed)!=0) {
 		XkbVirtualModsToReal(xkb,tmp,&tmp);
 		act->mods.mask= act->mods.real_mods;
 		act->mods.mask|= tmp;
@@ -674,7 +674,7 @@ unsigned int	tmp;
 	    }
 	    break;
 	case XkbSA_ISOLock:
-	    if ((((tmp= act->iso.vmods)!=0)&changed)!=0) {
+	    if ((((tmp= XkbModActionVMods(&act->iso))!=0)&changed)!=0) {
 		XkbVirtualModsToReal(xkb,tmp,&tmp);
 		act->iso.mask= act->iso.real_mods;
 		act->iso.mask|= tmp;
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index 417c617..5909b06 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -523,15 +523,15 @@ Bool	accel;
 	xkbi->mouseKeysCounter= 0;
 	xkbi->mouseKey= keycode;
 	accel= ((pAction->ptr.flags&XkbSA_NoAcceleration)==0);
-	x= pAction->ptr.x;
-	y= pAction->ptr.y;
+	x= XkbPtrActionX(&pAction->ptr);
+	y= XkbPtrActionY(&pAction->ptr);
 	XkbDDXFakePointerMotion(pAction->ptr.flags,x,y);
 	AccessXCancelRepeatKey(xkbi,keycode);
 	xkbi->mouseKeysAccel= accel&&
 		(xkbi->desc->ctrls->enabled_ctrls&XkbMouseKeysAccelMask);
 	xkbi->mouseKeysFlags= pAction->ptr.flags;
-	xkbi->mouseKeysDX= x;
-	xkbi->mouseKeysDY= y;
+	xkbi->mouseKeysDX= XkbPtrActionX(&pAction->ptr);
+	xkbi->mouseKeysDY= XkbPtrActionY(&pAction->ptr);
 	xkbi->mouseKeyTimer= TimerSet(xkbi->mouseKeyTimer, 0,
 				xkbi->desc->ctrls->mk_delay,
 				_XkbPtrAccelExpire,(pointer)xkbi);
@@ -671,7 +671,7 @@ XkbEventCauseRec	cause;
 	filter->keycode = keycode;
 	filter->active = 1;
 	filter->filterOthers = 0;
-	change= pAction->ctrls.ctrls;
+	change= XkbActionCtrls(&pAction->ctrls);
 	filter->priv = change;
 	filter->filter = _XkbFilterControls;
 	filter->upAction = *pAction;
@@ -834,8 +834,8 @@ ProcessInputProc backupproc;
         ev.type = ET_KeyPress;
         ev.detail.key = pAction->redirect.new_key;
 
-        mask= pAction->redirect.vmods_mask;
-        mods= pAction->redirect.vmods;
+        mask= XkbSARedirectVModsMask(&pAction->redirect);
+        mods= XkbSARedirectVMods(&pAction->redirect);
         if (mask) XkbVirtualModsToReal(xkbi->desc,mask,&mask);
         if (mods) XkbVirtualModsToReal(xkbi->desc,mods,&mods);
         mask|= pAction->redirect.mods_mask;
@@ -865,8 +865,8 @@ ProcessInputProc backupproc;
         ev.type = ET_KeyRelease;
         ev.detail.key = filter->upAction.redirect.new_key;
 
-        mask= filter->upAction.redirect.vmods_mask;
-        mods= filter->upAction.redirect.vmods;
+        mask= XkbSARedirectVModsMask(&filter->upAction.redirect);
+        mods= XkbSARedirectVMods(&filter->upAction.redirect);
         if (mask) XkbVirtualModsToReal(xkbi->desc,mask,&mask);
         if (mods) XkbVirtualModsToReal(xkbi->desc,mods,&mods);
         mask|= filter->upAction.redirect.mods_mask;
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index 0bd41cd..e25247f 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -183,13 +183,13 @@ register unsigned	tmp;
 	case XkbSA_SetMods: case XkbSA_LatchMods: case XkbSA_LockMods:
 	    if (act->mods.flags&XkbSA_UseModMapMods)
 		act->mods.real_mods= act->mods.mask= mods;
-	    if ((tmp= act->mods.vmods)!=0)
+	    if ((tmp= XkbModActionVMods(&act->mods))!=0)
 		act->mods.mask|= XkbMaskForVMask(xkb,tmp);
 	    break;
 	case XkbSA_ISOLock:
 	    if (act->iso.flags&XkbSA_UseModMapMods)
 		act->iso.real_mods= act->iso.mask= mods;
-	    if ((tmp= act->iso.vmods)!=0)
+	    if ((tmp= XkbModActionVMods(&act->iso))!=0)
 		act->iso.mask|= XkbMaskForVMask(xkb,tmp);
 	    break;
     }
diff --git a/xkb/xkbtext.c b/xkb/xkbtext.c
index 836d47e..2f58199 100644
--- a/xkb/xkbtext.c
+++ b/xkb/xkbtext.c
@@ -682,7 +682,7 @@ XkbModAction *	act;
 unsigned	tmp;
 
     act= &action->mods;
-    tmp= act->vmods;
+    tmp= XkbModActionVMods(act);
     TryCopyStr(buf,"modifiers=",sz);
     if (act->flags&XkbSA_UseModMapMods)
 	  TryCopyStr(buf,"modMapMods",sz);
@@ -735,8 +735,8 @@ int		x,y;
 char		tbuf[32];
 
     act= &action->ptr;
-    x= act->x;
-    y= act->y;
+    x= XkbPtrActionX(act);
+    y= XkbPtrActionY(act);
     if ((act->flags&XkbSA_MoveAbsoluteX)||(x<0))
 	 sprintf(tbuf,"x=%d",x);
     else sprintf(tbuf,"x=+%d",x);
@@ -822,7 +822,7 @@ char		tbuf[64];
     }
     else {
 	unsigned tmp;
-	tmp= act->vmods;
+	tmp= XkbModActionVMods(act);
 	TryCopyStr(buf,"modifiers=",sz);
 	if (act->flags&XkbSA_UseModMapMods)
 	     TryCopyStr(buf,"modMapMods",sz);
@@ -894,7 +894,7 @@ unsigned		tmp;
 char			tbuf[32];
 
     act= &action->ctrls;
-    tmp= act->ctrls;
+    tmp= XkbActionCtrls(act);
     TryCopyStr(buf,"controls=",sz);
     if (tmp==0)
 	TryCopyStr(buf,"none",sz);
@@ -1010,8 +1010,8 @@ unsigned		vmods,vmods_mask;
 
     act= &action->redirect;
     kc= act->new_key;
-    vmods= act->vmods;
-    vmods_mask= act->vmods_mask;
+    vmods= XkbSARedirectVMods(act);
+    vmods_mask= XkbSARedirectVModsMask(act);
     if (xkb && xkb->names && xkb->names->keys && (kc<=xkb->max_key_code) &&
 				(xkb->names->keys[kc].name[0]!='\0')) {
 	char *kn;
diff --git a/xkb/xkmread.c b/xkb/xkmread.c
index 206c403..3e05679 100644
--- a/xkb/xkmread.c
+++ b/xkb/xkmread.c
@@ -457,7 +457,8 @@ XkbAction               *act;
             act->mods.flags = wire.actionData[0];
             act->mods.mask = wire.actionData[1];
             act->mods.real_mods = wire.actionData[2];
-            act->mods.vmods = (wire.actionData[3] << 8) | wire.actionData[4];
+            act->mods.vmods1 = wire.actionData[3];
+            act->mods.vmods2 = wire.actionData[4];
             break;
         case XkbSA_SetGroup:
         case XkbSA_LatchGroup:
@@ -467,8 +468,10 @@ XkbAction               *act;
             break;
         case XkbSA_MovePtr:
             act->ptr.flags = wire.actionData[0];
-            act->ptr.x = (wire.actionData[1] << 8) | wire.actionData[2];
-            act->ptr.y = (wire.actionData[3] << 8) | wire.actionData[4];
+            act->ptr.high_XXX = wire.actionData[1];
+            act->ptr.low_XXX = wire.actionData[2];
+            act->ptr.high_YYY = wire.actionData[3];
+            act->ptr.low_YYY = wire.actionData[4];
             break;
         case XkbSA_PtrBtn:
         case XkbSA_LockPtrBtn:
@@ -494,7 +497,8 @@ XkbAction               *act;
             act->iso.real_mods = wire.actionData[2];
             act->iso.group_XXX = wire.actionData[3];
             act->iso.affect = wire.actionData[4];
-            act->iso.vmods = (wire.actionData[5] << 8) | wire.actionData[6];
+            act->iso.vmods1 = wire.actionData[5];
+            act->iso.vmods2 = wire.actionData[6];
             break;
         case XkbSA_SwitchScreen:
             act->screen.flags = wire.actionData[0];
@@ -503,19 +507,19 @@ XkbAction               *act;
         case XkbSA_SetControls:
         case XkbSA_LockControls:
             act->ctrls.flags = wire.actionData[0];
-            act->ctrls.ctrls = (wire.actionData[1] << 24) | \
-                               (wire.actionData[2] << 16) | \
-                               (wire.actionData[3] << 8) | \
-                               wire.actionData[4];
+            act->ctrls.ctrls3 = wire.actionData[1];
+            act->ctrls.ctrls2 = wire.actionData[2];
+            act->ctrls.ctrls1 = wire.actionData[3];
+            act->ctrls.ctrls0 = wire.actionData[4];
             break;
         case XkbSA_RedirectKey:
             act->redirect.new_key = wire.actionData[0];
             act->redirect.mods_mask = wire.actionData[1];
             act->redirect.mods = wire.actionData[2];
-            act->redirect.vmods_mask = (wire.actionData[3] << 8) | \
-                                       wire.actionData[4];
-            act->redirect.vmods = (wire.actionData[5] << 8) | \
-                                  wire.actionData[6];
+            act->redirect.vmods_mask0 = wire.actionData[3];
+            act->redirect.vmods_mask1 = wire.actionData[4];
+            act->redirect.vmods0 = wire.actionData[4];
+            act->redirect.vmods1 = wire.actionData[5];
             break;
         case XkbSA_DeviceValuator:
             act->devval.device = wire.actionData[0];
commit 08df24555cb432eb0d90a3f63275e9485e777c4c
Author: Soren Sandmann Pedersen <ssp at redhat.com>
Date:   Thu Jul 9 17:23:04 2009 -0400

    Reserve space for two GC values in copy_drawable().
    
    Pointed out by Pierre Willenbrock.

diff --git a/fb/fbpict.c b/fb/fbpict.c
index c5199af..dd9cefe 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -275,7 +275,7 @@ copy_drawable (DrawablePtr pDraw)
     PixmapPtr pPixmap;
     GCPtr pGC;
     int width, height;
-    ChangeGCVal gcv[1];
+    ChangeGCVal gcv[2];
     
     width = pDraw->width;
     height = pDraw->height;
commit 3c53f3241319d96affad2f4539f7661e02e80521
Author: Adam Jackson <ajax at redhat.com>
Date:   Thu Jul 9 17:21:07 2009 -0400

    Since font modules are dead, don't mention them in xorg-server.pc

diff --git a/configure.ac b/configure.ac
index e47b60e..65a17de 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1583,12 +1583,10 @@ if test "x$XORG" = xyes; then
 	abi_videodrv=`extract_abi VIDEODRV`
 	abi_xinput=`extract_abi XINPUT`
 	abi_extension=`extract_abi EXTENSION`
-	abi_font=`extract_abi FONT`
 	AC_SUBST([abi_ansic])
 	AC_SUBST([abi_videodrv])
 	AC_SUBST([abi_xinput])
 	AC_SUBST([abi_extension])
-	AC_SUBST([abi_font])
 fi
 AM_CONDITIONAL([XORG], [test "x$XORG" = xyes])
 AM_CONDITIONAL([XORG_BUS_LINUXPCI], [test "x$xorg_bus_linuxpci" = xyes])
diff --git a/xorg-server.pc.in b/xorg-server.pc.in
index 7547aa3..3d58dab 100644
--- a/xorg-server.pc.in
+++ b/xorg-server.pc.in
@@ -9,7 +9,6 @@ abi_ansic=@abi_ansic@
 abi_videodrv=@abi_videodrv@
 abi_xinput=@abi_xinput@
 abi_extension=@abi_extension@
-abi_font=@abi_font@
 
 Name: xorg-server
 Description: Modular X.Org X Server
commit e812103382a7bc3f7ba8b2f44ab97960dec265a9
Author: Adam Jackson <ajax at redhat.com>
Date:   Thu Jul 9 10:58:17 2009 -0400

    config: drop i810.
    
    The driver assuredly no longer builds against 1.7.  Please don't feel
    compelled to fix it.

diff --git a/hw/xfree86/common/xf86AutoConfig.c b/hw/xfree86/common/xf86AutoConfig.c
index ada1ca5..bc4c80b 100644
--- a/hw/xfree86/common/xf86AutoConfig.c
+++ b/hw/xfree86/common/xf86AutoConfig.c
@@ -176,7 +176,6 @@ videoPtrToDriverList(struct pci_device *dev,
                 break; /* "hooray" for poulsbo */
 	    } else {
 		driverList[0] = "intel";
-		driverList[1] = "i810";
 	    }
 	    break;
 	case 0x102b:		    driverList[0] = "mga";	break;
commit 55ac155d42268009eaecbc183329a8744d6ae48c
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Tue Jul 7 16:59:39 2009 -0700

    Xephyr & Xserver man page fixes
    
    Xephyr(1): Fix quote formatting, add missing ' to contraction
    Xserver(1): Add Xephyr(1) & startx(1) to SEE ALSO section
    
    Signed-off-by: Alan Coopersmith <alan.coopersmith at sun.com>

diff --git a/doc/Xserver.man.pre b/doc/Xserver.man.pre
index 12b4cd4..6154191 100644
--- a/doc/Xserver.man.pre
+++ b/doc/Xserver.man.pre
@@ -581,13 +581,13 @@ Security: \fIXsecurity\fP(__miscmansuffix__), \fIxauth\fP(1), \fIXau\fP(1),
 \fIxdm\fP(1), \fIxhost\fP(1), \fIxfwp\fP(1),
 .I "Security Extension Specification"
 .PP
-Starting the server: \fIxdm\fP(1), \fIxinit\fP(1)
+Starting the server: \fIstartx\fP(1), \fIxdm\fP(1), \fIxinit\fP(1)
 .PP
 Controlling the server once started: \fIxset\fP(1), \fIxsetroot\fP(1),
 \fIxhost\fP(1)
 .PP
 Server-specific man pages:
-\fIXorg\fP(1), \fIXdmx\fP(1), \fIXnest\fP(1),
+\fIXorg\fP(1), \fIXdmx\fP(1), \fIXephyr\fP(1), \fIXnest\fP(1),
 \fIXvfb\fP(1), \fIXDarwin\fP(1), \fIXWin\fP(1).
 .PP
 Server internal documentation:
diff --git a/hw/kdrive/ephyr/Xephyr.man.pre b/hw/kdrive/ephyr/Xephyr.man.pre
index 7f0e811..f5e8b98 100644
--- a/hw/kdrive/ephyr/Xephyr.man.pre
+++ b/hw/kdrive/ephyr/Xephyr.man.pre
@@ -23,8 +23,8 @@ Xephyr - X server outputting to a window on a pre-existing X display
 .IR ... ]
 .SH DESCRIPTION
 .B Xephyr
-is a a kdrive server that outputs to a window on a pre-existing
-'host' X display.
+is a a kdrive server that outputs to a window on a pre-existing "host"
+X display.
 Think
 .I Xnest
 but with support for modern extensions like composite, damage and randr.
@@ -75,7 +75,7 @@ round it. It doesn't appear to break anything however.
 .IP \(bu 2
 Keyboard handling is basic but works.
 .TP \(bu 2
-Mouse button 5 probably wont work.
+Mouse button 5 probably won't work.
 .SH "SEE ALSO"
 X(__miscmansuffix__), Xserver(__appmansuffix__)
 .SH AUTHOR
commit 36dc66ae79b6e1cbe0a23587e32aebb68365b0d0
Author: Michael Lorenz <macallan at netbsd.org>
Date:   Tue Jul 7 20:21:39 2009 -0400

    The way XaceHook() mixes struct initializers and va_arg() is not portable and
    gives bogus data on sparc and probably others leading to a crash.
    
    Fix:
    Don't use initializers, instead set each member directly to enforce order.
    
    Signed-off-by: Eamon Walsh <ewalsh at tycho.nsa.gov>

diff --git a/Xext/xace.c b/Xext/xace.c
index 6eaba6d..5b9a840 100644
--- a/Xext/xace.c
+++ b/Xext/xace.c
@@ -100,114 +100,104 @@ int XaceHook(int hook, ...)
     switch (hook)
     {
 	case XACE_RESOURCE_ACCESS: {
-	    XaceResourceAccessRec rec = {
-		va_arg(ap, ClientPtr),
-		va_arg(ap, XID),
-		va_arg(ap, RESTYPE),
-		va_arg(ap, pointer),
-		va_arg(ap, RESTYPE),
-		va_arg(ap, pointer),
-		va_arg(ap, Mask),
-		Success /* default allow */
-	    };
+	    XaceResourceAccessRec rec;
+	    rec.client = va_arg(ap, ClientPtr);
+	    rec.id = va_arg(ap, XID);
+	    rec.rtype = va_arg(ap, RESTYPE);
+	    rec.res = va_arg(ap, pointer);
+	    rec.ptype = va_arg(ap, RESTYPE);
+	    rec.parent = va_arg(ap, pointer);
+	    rec.access_mode = va_arg(ap, Mask);
+	    rec.status = Success; /* default allow */
 	    calldata = &rec;
 	    prv = &rec.status;
 	    break;
 	}
 	case XACE_DEVICE_ACCESS: {
-	    XaceDeviceAccessRec rec = {
-		va_arg(ap, ClientPtr),
-		va_arg(ap, DeviceIntPtr),
-		va_arg(ap, Mask),
-		Success /* default allow */
-	    };
+	    XaceDeviceAccessRec rec;
+	    rec.client = va_arg(ap, ClientPtr);
+	    rec.dev = va_arg(ap, DeviceIntPtr);
+	    rec.access_mode = va_arg(ap, Mask);
+	    rec.status = Success; /* default allow */
 	    calldata = &rec;
 	    prv = &rec.status;
 	    break;
 	}
 	case XACE_SEND_ACCESS: {
-	    XaceSendAccessRec rec = {
-		va_arg(ap, ClientPtr),
-		va_arg(ap, DeviceIntPtr),
-		va_arg(ap, WindowPtr),
-		va_arg(ap, xEventPtr),
-		va_arg(ap, int),
-		Success /* default allow */
-	    };
+	    XaceSendAccessRec rec;
+	    rec.client = va_arg(ap, ClientPtr);
+	    rec.dev = va_arg(ap, DeviceIntPtr);
+	    rec.pWin = va_arg(ap, WindowPtr);
+	    rec.events = va_arg(ap, xEventPtr);
+	    rec.count = va_arg(ap, int);
+	    rec.status = Success; /* default allow */
 	    calldata = &rec;
 	    prv = &rec.status;
 	    break;
 	}
 	case XACE_RECEIVE_ACCESS: {
-	    XaceReceiveAccessRec rec = {
-		va_arg(ap, ClientPtr),
-		va_arg(ap, WindowPtr),
-		va_arg(ap, xEventPtr),
-		va_arg(ap, int),
-		Success /* default allow */
-	    };
+	    XaceReceiveAccessRec rec;
+	    rec.client = va_arg(ap, ClientPtr);
+	    rec.pWin = va_arg(ap, WindowPtr);
+	    rec.events = va_arg(ap, xEventPtr);
+	    rec.count = va_arg(ap, int);
+	    rec.status = Success; /* default allow */
 	    calldata = &rec;
 	    prv = &rec.status;
 	    break;
 	}
 	case XACE_CLIENT_ACCESS: {
-	    XaceClientAccessRec rec = {
-		va_arg(ap, ClientPtr),
-		va_arg(ap, ClientPtr),
-		va_arg(ap, Mask),
-		Success /* default allow */
-	    };
+	    XaceClientAccessRec rec;
+	    rec.client = va_arg(ap, ClientPtr);
+	    rec.target = va_arg(ap, ClientPtr);
+	    rec.access_mode = va_arg(ap, Mask);
+	    rec.status = Success; /* default allow */
 	    calldata = &rec;
 	    prv = &rec.status;
 	    break;
 	}
 	case XACE_EXT_ACCESS: {
-	    XaceExtAccessRec rec = {
-		va_arg(ap, ClientPtr),
-		va_arg(ap, ExtensionEntry*),
-		DixGetAttrAccess,
-		Success /* default allow */
-	    };
+	    XaceExtAccessRec rec;
+	    rec.client = va_arg(ap, ClientPtr);
+	    rec.ext = va_arg(ap, ExtensionEntry*);
+	    rec.access_mode = DixGetAttrAccess;
+	    rec.status = Success; /* default allow */
 	    calldata = &rec;
 	    prv = &rec.status;
 	    break;
 	}
 	case XACE_SERVER_ACCESS: {
-	    XaceServerAccessRec rec = {
-		va_arg(ap, ClientPtr),
-		va_arg(ap, Mask),
-		Success /* default allow */
-	    };
+	    XaceServerAccessRec rec;
+	    rec.client = va_arg(ap, ClientPtr);
+	    rec.access_mode = va_arg(ap, Mask);
+	    rec.status = Success; /* default allow */
 	    calldata = &rec;
 	    prv = &rec.status;
 	    break;
 	}
 	case XACE_SCREEN_ACCESS:
 	case XACE_SCREENSAVER_ACCESS: {
-	    XaceScreenAccessRec rec = {
-		va_arg(ap, ClientPtr),
-		va_arg(ap, ScreenPtr),
-		va_arg(ap, Mask),
-		Success /* default allow */
-	    };
+	    XaceScreenAccessRec rec;
+	    rec.client = va_arg(ap, ClientPtr);
+	    rec.screen = va_arg(ap, ScreenPtr);
+	    rec.access_mode = va_arg(ap, Mask);
+	    rec.status = Success; /* default allow */
 	    calldata = &rec;
 	    prv = &rec.status;
 	    break;
 	}
 	case XACE_AUTH_AVAIL: {
-	    XaceAuthAvailRec rec = {
-		va_arg(ap, ClientPtr),
-		va_arg(ap, XID)
-	    };
+	    XaceAuthAvailRec rec;
+	    rec.client = va_arg(ap, ClientPtr);
+	    rec.authId = va_arg(ap, XID);
 	    calldata = &rec;
 	    break;
 	}
 	case XACE_KEY_AVAIL: {
-	    XaceKeyAvailRec rec = {
-		va_arg(ap, xEventPtr),
-		va_arg(ap, DeviceIntPtr),
-		va_arg(ap, int)
-	    };
+	    XaceKeyAvailRec rec;
+	    rec.event = va_arg(ap, xEventPtr);
+	    rec.keybd = va_arg(ap, DeviceIntPtr);
+	    rec.count = va_arg(ap, int);
 	    calldata = &rec;
 	    break;
 	}
commit 48a9d65b88f56d1f8ab3bf824a4fe48c2f68725f
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Sun Jul 5 16:06:32 2009 +0100

    Cygwin/X: Window positioning improvements for multiwindow mode
    
    A few tweaks to winUpdateWindowPosition():
    
    * Don't allow window decoration to disappear off to top or left edge of the
    display as a result of adjustments to add decoration for the window style
    
    * Honour the position requested by window geometry for the client area (so
    windows which save their position don't get moved by the decoration width
    every time they are created) (unless we need to bump it away from top or left edges)
    
    * Fix an issue with initial window placement being offscreen on multimonitor
    systems when some monitors have negative coordinates (are to the left of or
    above the primary monitor)
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/winmultiwindowwm.c b/hw/xwin/winmultiwindowwm.c
index 8560c6c..18d9aed 100644
--- a/hw/xwin/winmultiwindowwm.c
+++ b/hw/xwin/winmultiwindowwm.c
@@ -1605,6 +1605,7 @@ winApplyHints (Display *pDisplay, Window iWindow, HWND hWnd, HWND *zstyle)
 void
 winUpdateWindowPosition (HWND hWnd, Bool reshape, HWND *zstyle)
 {
+  int iX, iY, iWidth, iHeight;
   int	iDx, iDy;
   RECT	rcNew;
   WindowPtr	pWin = GetProp (hWnd, WIN_WINDOW_PROP);
@@ -1614,8 +1615,16 @@ winUpdateWindowPosition (HWND hWnd, Bool reshape, HWND *zstyle)
   pDraw = &pWin->drawable;
   if (!pDraw) return;
 
+  /* Get the X and Y location of the X window */
+  iX = pWin->drawable.x + GetSystemMetrics (SM_XVIRTUALSCREEN);
+  iY = pWin->drawable.y + GetSystemMetrics (SM_YVIRTUALSCREEN);
+
+  /* Get the height and width of the X window */
+  iWidth = pWin->drawable.width;
+  iHeight = pWin->drawable.height;
+
   /* Setup a rectangle with the X window position and size */
-  SetRect (&rcNew, pDraw->x, pDraw->y, pDraw->x + pDraw->width, pDraw->y + pDraw->height);
+  SetRect (&rcNew, iX, iY, iX + iWidth, iY + iHeight);
 
 #if 0
   ErrorF ("winUpdateWindowPosition - (%d, %d)-(%d, %d)\n",
@@ -1625,15 +1634,20 @@ winUpdateWindowPosition (HWND hWnd, Bool reshape, HWND *zstyle)
 
   AdjustWindowRectEx (&rcNew, GetWindowLongPtr (hWnd, GWL_STYLE), FALSE, WS_EX_APPWINDOW);
 
-  /* Calculate position deltas */
-  iDx = pDraw->x - rcNew.left;
-  iDy = pDraw->y - rcNew.top;
+  /* Don't allow window decoration to disappear off to top-left as a result of this adjustment */
+  if (rcNew.left < GetSystemMetrics(SM_XVIRTUALSCREEN))
+    {
+      iDx = GetSystemMetrics(SM_XVIRTUALSCREEN) - rcNew.left;
+      rcNew.left += iDx;
+      rcNew.right += iDx;
+    }
 
-  /* Calculate new rectangle */
-  rcNew.left += iDx;
-  rcNew.right += iDx;
-  rcNew.top += iDy;
-  rcNew.bottom += iDy;
+  if (rcNew.top < GetSystemMetrics(SM_YVIRTUALSCREEN))
+    {
+      iDy = GetSystemMetrics(SM_YVIRTUALSCREEN) - rcNew.top;
+      rcNew.top += iDy;
+      rcNew.bottom += iDy;
+    }
 
 #if 0
   ErrorF ("winUpdateWindowPosition - (%d, %d)-(%d, %d)\n",
@@ -1644,7 +1658,7 @@ winUpdateWindowPosition (HWND hWnd, Bool reshape, HWND *zstyle)
   /* Position the Windows window */
   SetWindowPos (hWnd, *zstyle, rcNew.left, rcNew.top,
 	rcNew.right - rcNew.left, rcNew.bottom - rcNew.top,
-	SWP_NOMOVE | ((reshape) ? 0 : SWP_NOREDRAW));
+	0);
 
   if (reshape)
   {
commit 5aec72745232dd61e60cfbf3acc4628d4fcd0315
Author: Keith Packard <keithp at keithp.com>
Date:   Mon Jul 6 11:53:02 2009 -0700

    Remove old DRI2 buffer alloc/free interfaces
    
    These old interfaces are no longer supported by the server, removing them
    requires bumping the video driver ABI. Note that this is not guaranteed to
    be the last change in ABI version 6.
    
    Signed-off-by: Keith Packard <keithp at keithp.com>
    Reviewed-by: Eric Anholt <eric at anholt.net>

diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
index ded5216..4c64c35 100644
--- a/hw/xfree86/common/xf86Module.h
+++ b/hw/xfree86/common/xf86Module.h
@@ -82,7 +82,7 @@ typedef enum {
  * mask is 0xFFFF0000.
  */
 #define ABI_ANSIC_VERSION	SET_ABI_VERSION(0, 4)
-#define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(5, 0)
+#define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(6, 0)
 #define ABI_XINPUT_VERSION	SET_ABI_VERSION(7, 0)
 #define ABI_EXTENSION_VERSION	SET_ABI_VERSION(2, 0)
 #define ABI_FONT_VERSION	SET_ABI_VERSION(0, 6)
diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
index 3e8a7d4..8795cd1 100644
--- a/hw/xfree86/dri2/dri2.c
+++ b/hw/xfree86/dri2/dri2.c
@@ -53,7 +53,7 @@ typedef struct _DRI2Drawable {
     unsigned int	 refCount;
     int			 width;
     int			 height;
-    DRI2Buffer2Ptr	*buffers;
+    DRI2BufferPtr	*buffers;
     int			 bufferCount;
     unsigned int	 pendingSequence;
 } DRI2DrawableRec, *DRI2DrawablePtr;
@@ -64,9 +64,6 @@ typedef struct _DRI2Screen {
     int				 fd;
     unsigned int		 lastSequence;
 
-    DRI2CreateBuffersProcPtr	 CreateBuffers;
-    DRI2DestroyBuffersProcPtr	 DestroyBuffers;
-
     DRI2CreateBufferProcPtr	 CreateBuffer;
     DRI2DestroyBufferProcPtr	 DestroyBuffer;
     DRI2CopyRegionProcPtr	 CopyRegion;
@@ -155,13 +152,13 @@ find_attachment(DRI2DrawablePtr pPriv, unsigned attachment)
     return -1;
 }
 
-static DRI2Buffer2Ptr
+static DRI2BufferPtr
 allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds,
 			 DRI2DrawablePtr pPriv,
 			 unsigned int attachment, unsigned int format,
 			 int dimensions_match)
 {
-    DRI2Buffer2Ptr buffer;
+    DRI2BufferPtr buffer;
     int old_buf;
 
     old_buf = find_attachment(pPriv, attachment);
@@ -178,14 +175,14 @@ allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds,
     return buffer;
 }
 
-static DRI2Buffer2Ptr *
+static DRI2BufferPtr *
 do_get_buffers(DrawablePtr pDraw, int *width, int *height,
 	       unsigned int *attachments, int count, int *out_count,
 	       int has_format)
 {
     DRI2ScreenPtr   ds = DRI2GetScreen(pDraw->pScreen);
     DRI2DrawablePtr pPriv = DRI2GetDrawable(pDraw);
-    DRI2Buffer2Ptr  *buffers;
+    DRI2BufferPtr  *buffers;
     int need_real_front = 0;
     int need_fake_front = 0;
     int have_fake_front = 0;
@@ -205,154 +202,64 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
 
     buffers = xalloc((count + 1) * sizeof(buffers[0]));
 
-    if (ds->CreateBuffer) {
-	/* Version 2 API with CreateBuffer */
-	for (i = 0; i < count; i++) {
-	    const unsigned attachment = *(attachments++);
-	    const unsigned format = (has_format) ? *(attachments++) : 0;
-
-	    buffers[i] = allocate_or_reuse_buffer(pDraw, ds, pPriv, attachment,
-						  format, dimensions_match);
-
-	    /* If the drawable is a window and the front-buffer is requested,
-	     * silently add the fake front-buffer to the list of requested
-	     * attachments.  The counting logic in the loop accounts for the case
-	     * where the client requests both the fake and real front-buffer.
-	     */
-	    if (attachment == DRI2BufferBackLeft) {
-		need_real_front++;
-		front_format = format;
-	    }
-
-	    if (attachment == DRI2BufferFrontLeft) {
-		need_real_front--;
-		front_format = format;
-
-		if (pDraw->type == DRAWABLE_WINDOW) {
-		    need_fake_front++;
-		}
-	    }
-
-	    if (pDraw->type == DRAWABLE_WINDOW) {
-		if (attachment == DRI2BufferFakeFrontLeft) {
-		    need_fake_front--;
-		    have_fake_front = 1;
-		}
-	    }
-	}
-
-	if (need_real_front > 0) {
-	    buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv,
-						    DRI2BufferFrontLeft,
-						    front_format, dimensions_match);
-	}
-
-	if (need_fake_front > 0) {
-	    buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv,
-						    DRI2BufferFakeFrontLeft,
-						    front_format, dimensions_match);
-	    have_fake_front = 1;
+    for (i = 0; i < count; i++) {
+	const unsigned attachment = *(attachments++);
+	const unsigned format = (has_format) ? *(attachments++) : 0;
+
+	buffers[i] = allocate_or_reuse_buffer(pDraw, ds, pPriv, attachment,
+					      format, dimensions_match);
+
+	/* If the drawable is a window and the front-buffer is requested,
+	 * silently add the fake front-buffer to the list of requested
+	 * attachments.  The counting logic in the loop accounts for the case
+	 * where the client requests both the fake and real front-buffer.
+	 */
+	if (attachment == DRI2BufferBackLeft) {
+	    need_real_front++;
+	    front_format = format;
 	}
 
-	*out_count = i;
+	if (attachment == DRI2BufferFrontLeft) {
+	    need_real_front--;
+	    front_format = format;
 
-
-	if (pPriv->buffers != NULL) {
-	    for (i = 0; i < pPriv->bufferCount; i++) {
-		if (pPriv->buffers[i] != NULL) {
-		    (*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
-		}
+	    if (pDraw->type == DRAWABLE_WINDOW) {
+		need_fake_front++;
 	    }
-
-	    xfree(pPriv->buffers);
 	}
-    } else {
-	DRI2BufferPtr	buffers1;
-	unsigned int	temp_buf[32];
-	unsigned int	*temp = temp_buf;
-	int		i;
-	int		buffers_match = 1;
-
-	/* Version 1 API with CreateBuffers */
 
-	if ((count + 1) > 32) {
-	    temp = xalloc((count + 1) * sizeof(temp[0]));
-	}
-
-	for (i = 0; i < count; i++) {
-	    const unsigned attachment = *(attachments++);
-
-	    /* Version 1 doesn't deal with the format at all */
-	    if (has_format)
-		attachments++;
-
-	    /*
-	     * Make sure the client also gets the front buffer when
-	     * it asks for a back buffer
-	     */
-	    if (attachment == DRI2BufferBackLeft)
-		need_real_front++;
-
-	    /*
-	     * If the drawable is a window and the front-buffer is requested,
-	     * silently add the fake front-buffer to the list of requested
-	     * attachments.  The counting logic in the loop accounts for the
-	     * case where the client requests both the fake and real
-	     * front-buffer.
-	     */
-	    if (attachment == DRI2BufferFrontLeft) {
-		need_real_front--;
-		if (pDraw->type == DRAWABLE_WINDOW)
-		    need_fake_front++;
-	    }
-	    if (pDraw->type == DRAWABLE_WINDOW &&
-		attachment == DRI2BufferFakeFrontLeft)
-	    {
+	if (pDraw->type == DRAWABLE_WINDOW) {
+	    if (attachment == DRI2BufferFakeFrontLeft) {
 		need_fake_front--;
 		have_fake_front = 1;
 	    }
-
-	    temp[i] = attachment;
-	}
-
-	if (need_real_front > 0)
-	    temp[count++] = DRI2BufferFrontLeft;
-
-	if (need_fake_front > 0) {
-	    temp[count++] = DRI2BufferFakeFrontLeft;
-	    have_fake_front = 1;
 	}
+    }
 
-	if (count != pPriv->bufferCount)
-	    buffers_match = 0;
-	else {
-	    for (i = 0; i < count; i++)
-		if (pPriv->buffers[i]->attachment != temp[i]) {
-		    buffers_match = 0;
-		    break;
-		}
-	}
-	if (pPriv->buffers == NULL || !dimensions_match || !buffers_match)
-	{
-            buffers1 = (*ds->CreateBuffers)(pDraw, temp, count);
-	    if (pPriv->buffers != NULL)
-		(*ds->DestroyBuffers)(pDraw, (DRI2BufferPtr) pPriv->buffers[0],
-				      pPriv->bufferCount);
-	}
-	else
-	    buffers1 = (DRI2BufferPtr) pPriv->buffers[0];
+    if (need_real_front > 0) {
+	buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv,
+						DRI2BufferFrontLeft,
+						front_format, dimensions_match);
+    }
 
-        for (i = 0; i < count; i++)
-	    buffers[i] = (DRI2Buffer2Ptr) &buffers1[i];
+    if (need_fake_front > 0) {
+	buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv,
+						DRI2BufferFakeFrontLeft,
+						front_format, dimensions_match);
+	have_fake_front = 1;
+    }
 
-        *out_count = count;
+    *out_count = i;
 
-	if (pPriv->buffers)
-	    xfree (pPriv->buffers);
 
-	if (temp != temp_buf) {
-	    xfree(temp);
+    if (pPriv->buffers != NULL) {
+	for (i = 0; i < pPriv->bufferCount; i++) {
+	    if (pPriv->buffers[i] != NULL) {
+		(*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
+	    }
 	}
+
+	xfree(pPriv->buffers);
     }
 
     pPriv->buffers = buffers;
@@ -384,7 +291,7 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
     return pPriv->buffers;
 }
 
-DRI2Buffer2Ptr *
+DRI2BufferPtr *
 DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
 	       unsigned int *attachments, int count, int *out_count)
 {
@@ -392,7 +299,7 @@ DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
 			  out_count, FALSE);
 }
 
-DRI2Buffer2Ptr *
+DRI2BufferPtr *
 DRI2GetBuffersWithFormat(DrawablePtr pDraw, int *width, int *height,
 			 unsigned int *attachments, int count, int *out_count)
 {
@@ -449,14 +356,8 @@ DRI2DestroyDrawable(DrawablePtr pDraw)
     if (pPriv->buffers != NULL) {
 	int i;
 
-	if (ds->DestroyBuffer) {
-	    for (i = 0; i < pPriv->bufferCount; i++) {
-		(*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
-	    }
-	} else {
-	    (*ds->DestroyBuffers)(pDraw, (DRI2BufferPtr) pPriv->buffers[0],
-				  pPriv->bufferCount);
-	}
+	for (i = 0; i < pPriv->bufferCount; i++)
+	    (*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
 
 	xfree(pPriv->buffers);
     }
@@ -510,6 +411,9 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
 {
     DRI2ScreenPtr ds;
 
+    if (info->version < 3)
+	return FALSE;
+
     ds = xalloc(sizeof *ds);
     if (!ds)
 	return FALSE;
@@ -518,32 +422,8 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
     ds->driverName     = info->driverName;
     ds->deviceName     = info->deviceName;
 
-    /* Prefer the new one-at-a-time buffer API */
-    if (info->version >= 2 && info->CreateBuffer && info->DestroyBuffer) {
-	ds->CreateBuffer   = info->CreateBuffer;
-	ds->DestroyBuffer  = info->DestroyBuffer;
-	ds->CreateBuffers  = NULL;
-	ds->DestroyBuffers = NULL;
-    } else if (info->CreateBuffers && info->DestroyBuffers) {
-	xf86DrvMsg(pScreen->myNum, X_WARNING,
-		   "[DRI2] Version 1 API (broken front buffer rendering)\n");
-	ds->CreateBuffer   = NULL;
-	ds->DestroyBuffer  = NULL;
-	ds->CreateBuffers  = info->CreateBuffers;
-	ds->DestroyBuffers = info->DestroyBuffers;
-    } else {
-	xf86DrvMsg(pScreen->myNum, X_ERROR,
-		   "[DRI2] Missing buffer management functions\n");
-	xfree(ds);
-	return FALSE;
-    }
-
-    if (!info->CopyRegion) {
-	xf86DrvMsg(pScreen->myNum, X_ERROR,
-		   "[DRI2] Missing copy region function\n");
-	xfree(ds);
-	return FALSE;
-    }
+    ds->CreateBuffer   = info->CreateBuffer;
+    ds->DestroyBuffer  = info->DestroyBuffer;
     ds->CopyRegion     = info->CopyRegion;
 
     dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, ds);
diff --git a/hw/xfree86/dri2/dri2.h b/hw/xfree86/dri2/dri2.h
index 22ee983..175471a 100644
--- a/hw/xfree86/dri2/dri2.h
+++ b/hw/xfree86/dri2/dri2.h
@@ -35,26 +35,18 @@
 
 #include <X11/extensions/dri2tokens.h>
 
-/* Version 1 structure (for ABI compatibility) */
+/* Version 2 structure (with format at the end) */
 typedef struct {
     unsigned int attachment;
     unsigned int name;
     unsigned int pitch;
     unsigned int cpp;
     unsigned int flags;
+    unsigned int format;
     void *driverPrivate;
 } DRI2BufferRec, *DRI2BufferPtr;
 
-/* Version 2 structure (with format at the end) */
-typedef struct {
-    unsigned int attachment;
-    unsigned int name;
-    unsigned int pitch;
-    unsigned int cpp;
-    unsigned int flags;
-    void *driverPrivate;
-    unsigned int format;
-} DRI2Buffer2Rec, *DRI2Buffer2Ptr;
+typedef DRI2BufferRec DRI2Buffer2Rec, *DRI2Buffer2Ptr;
 
 typedef DRI2BufferPtr	(*DRI2CreateBuffersProcPtr)(DrawablePtr pDraw,
 						    unsigned int *attachments,
@@ -70,16 +62,16 @@ typedef void		(*DRI2CopyRegionProcPtr)(DrawablePtr pDraw,
 typedef void		(*DRI2WaitProcPtr)(WindowPtr pWin,
 					   unsigned int sequence);
 
-typedef DRI2Buffer2Ptr	(*DRI2CreateBufferProcPtr)(DrawablePtr pDraw,
+typedef DRI2BufferPtr	(*DRI2CreateBufferProcPtr)(DrawablePtr pDraw,
 						   unsigned int attachment,
 						   unsigned int format);
 typedef void		(*DRI2DestroyBufferProcPtr)(DrawablePtr pDraw,
-						    DRI2Buffer2Ptr buffer);
+						    DRI2BufferPtr buffer);
 
 /**
  * Version of the DRI2InfoRec structure defined in this header
  */
-#define DRI2INFOREC_VERSION 2
+#define DRI2INFOREC_VERSION 3
 
 typedef struct {
     unsigned int version;	/**< Version of this struct */
@@ -87,18 +79,10 @@ typedef struct {
     const char *driverName;
     const char *deviceName;
 
-    DRI2CreateBuffersProcPtr	CreateBuffers;
-    DRI2DestroyBuffersProcPtr	DestroyBuffers;
-    DRI2CopyRegionProcPtr	CopyRegion;
-    DRI2WaitProcPtr		Wait;
-
-    /**
-     * \name Fields added in version 2 of the structure.
-     */
-    /*@{*/
     DRI2CreateBufferProcPtr	CreateBuffer;
     DRI2DestroyBufferProcPtr	DestroyBuffer;
-    /*@}*/
+    DRI2CopyRegionProcPtr	CopyRegion;
+    DRI2WaitProcPtr		Wait;
 
 }  DRI2InfoRec, *DRI2InfoPtr;
 
@@ -119,7 +103,7 @@ extern _X_EXPORT int DRI2CreateDrawable(DrawablePtr pDraw);
 
 extern _X_EXPORT void DRI2DestroyDrawable(DrawablePtr pDraw);
 
-extern _X_EXPORT DRI2Buffer2Ptr *DRI2GetBuffers(DrawablePtr pDraw,
+extern _X_EXPORT DRI2BufferPtr *DRI2GetBuffers(DrawablePtr pDraw,
 			     int *width,
 			     int *height,
 			     unsigned int *attachments,
@@ -149,7 +133,7 @@ extern _X_EXPORT int DRI2CopyRegion(DrawablePtr pDraw,
  */
 extern _X_EXPORT void DRI2Version(int *major, int *minor);
 
-extern _X_EXPORT DRI2Buffer2Ptr *DRI2GetBuffersWithFormat(DrawablePtr pDraw,
+extern _X_EXPORT DRI2BufferPtr *DRI2GetBuffersWithFormat(DrawablePtr pDraw,
 	int *width, int *height, unsigned int *attachments, int count,
 	int *out_count);
 
diff --git a/hw/xfree86/dri2/dri2ext.c b/hw/xfree86/dri2/dri2ext.c
index ea160ac..029dce8 100644
--- a/hw/xfree86/dri2/dri2ext.c
+++ b/hw/xfree86/dri2/dri2ext.c
@@ -195,7 +195,7 @@ ProcDRI2DestroyDrawable(ClientPtr client)
 
 static void
 send_buffers_reply(ClientPtr client, DrawablePtr pDrawable,
-		   DRI2Buffer2Ptr *buffers, int count, int width, int height)
+		   DRI2BufferPtr *buffers, int count, int width, int height)
 {
     xDRI2GetBuffersReply rep;
     int skip = 0;
@@ -245,7 +245,7 @@ ProcDRI2GetBuffers(ClientPtr client)
 {
     REQUEST(xDRI2GetBuffersReq);
     DrawablePtr pDrawable;
-    DRI2Buffer2Ptr *buffers;
+    DRI2BufferPtr *buffers;
     int status, width, height, count;
     unsigned int *attachments;
 
@@ -268,7 +268,7 @@ ProcDRI2GetBuffersWithFormat(ClientPtr client)
 {
     REQUEST(xDRI2GetBuffersReq);
     DrawablePtr pDrawable;
-    DRI2Buffer2Ptr *buffers;
+    DRI2BufferPtr *buffers;
     int status, width, height, count;
     unsigned int *attachments;
 
commit 2e2c5b216cc1c7a9bc26bd2c68226aaed5fc52ca
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Jul 1 14:01:57 2009 -0700

    dri2: Preserve compatibility with 1.6 DRI2 API/ABI
    
    The old DRI2 buffer allocation API wasn't great, but there's no reason to
    make the server stop working with those drivers. This patch has the
    X server adapting to the API provided by the driver, using the new API where
    available and falling back to the old API as necessary. A warning will be
    placed in the log file when the old API is in use.
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
index aead33b..3e8a7d4 100644
--- a/hw/xfree86/dri2/dri2.c
+++ b/hw/xfree86/dri2/dri2.c
@@ -53,7 +53,7 @@ typedef struct _DRI2Drawable {
     unsigned int	 refCount;
     int			 width;
     int			 height;
-    DRI2BufferPtr	*buffers;
+    DRI2Buffer2Ptr	*buffers;
     int			 bufferCount;
     unsigned int	 pendingSequence;
 } DRI2DrawableRec, *DRI2DrawablePtr;
@@ -63,6 +63,10 @@ typedef struct _DRI2Screen {
     const char			*deviceName;
     int				 fd;
     unsigned int		 lastSequence;
+
+    DRI2CreateBuffersProcPtr	 CreateBuffers;
+    DRI2DestroyBuffersProcPtr	 DestroyBuffers;
+
     DRI2CreateBufferProcPtr	 CreateBuffer;
     DRI2DestroyBufferProcPtr	 DestroyBuffer;
     DRI2CopyRegionProcPtr	 CopyRegion;
@@ -133,17 +137,17 @@ DRI2CreateDrawable(DrawablePtr pDraw)
 }
 
 static int
-find_attachment(DRI2BufferPtr *buffer_list, int count, unsigned attachment)
+find_attachment(DRI2DrawablePtr pPriv, unsigned attachment)
 {
     int i;
 
-    if (buffer_list == NULL) {
+    if (pPriv->buffers == NULL) {
 	return -1;
     }
 
-    for (i = 0; i < count; i++) {
-	if ((buffer_list[i] != NULL)
-	    && (buffer_list[i]->attachment == attachment)) {
+    for (i = 0; i < pPriv->bufferCount; i++) {
+	if ((pPriv->buffers[i] != NULL)
+	    && (pPriv->buffers[i]->attachment == attachment)) {
 	    return i;
 	}
     }
@@ -151,16 +155,16 @@ find_attachment(DRI2BufferPtr *buffer_list, int count, unsigned attachment)
     return -1;
 }
 
-static DRI2BufferPtr
+static DRI2Buffer2Ptr
 allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds,
 			 DRI2DrawablePtr pPriv,
 			 unsigned int attachment, unsigned int format,
 			 int dimensions_match)
 {
-    DRI2BufferPtr buffer;
+    DRI2Buffer2Ptr buffer;
     int old_buf;
 
-    old_buf = find_attachment(pPriv->buffers, pPriv->bufferCount, attachment);
+    old_buf = find_attachment(pPriv, attachment);
 
     if ((old_buf < 0)
 	|| !dimensions_match
@@ -174,14 +178,14 @@ allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds,
     return buffer;
 }
 
-static DRI2BufferPtr *
+static DRI2Buffer2Ptr *
 do_get_buffers(DrawablePtr pDraw, int *width, int *height,
 	       unsigned int *attachments, int count, int *out_count,
 	       int has_format)
 {
     DRI2ScreenPtr   ds = DRI2GetScreen(pDraw->pScreen);
     DRI2DrawablePtr pPriv = DRI2GetDrawable(pDraw);
-    DRI2BufferPtr  *buffers;
+    DRI2Buffer2Ptr  *buffers;
     int need_real_front = 0;
     int need_fake_front = 0;
     int have_fake_front = 0;
@@ -201,68 +205,156 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
 
     buffers = xalloc((count + 1) * sizeof(buffers[0]));
 
-    for (i = 0; i < count; i++) {
-	const unsigned attachment = *(attachments++);
-	const unsigned format = (has_format) ? *(attachments++) : 0;
+    if (ds->CreateBuffer) {
+	/* Version 2 API with CreateBuffer */
+	for (i = 0; i < count; i++) {
+	    const unsigned attachment = *(attachments++);
+	    const unsigned format = (has_format) ? *(attachments++) : 0;
+
+	    buffers[i] = allocate_or_reuse_buffer(pDraw, ds, pPriv, attachment,
+						  format, dimensions_match);
+
+	    /* If the drawable is a window and the front-buffer is requested,
+	     * silently add the fake front-buffer to the list of requested
+	     * attachments.  The counting logic in the loop accounts for the case
+	     * where the client requests both the fake and real front-buffer.
+	     */
+	    if (attachment == DRI2BufferBackLeft) {
+		need_real_front++;
+		front_format = format;
+	    }
+
+	    if (attachment == DRI2BufferFrontLeft) {
+		need_real_front--;
+		front_format = format;
+
+		if (pDraw->type == DRAWABLE_WINDOW) {
+		    need_fake_front++;
+		}
+	    }
 
-	buffers[i] = allocate_or_reuse_buffer(pDraw, ds, pPriv, attachment,
-					      format, dimensions_match);
+	    if (pDraw->type == DRAWABLE_WINDOW) {
+		if (attachment == DRI2BufferFakeFrontLeft) {
+		    need_fake_front--;
+		    have_fake_front = 1;
+		}
+	    }
+	}
 
+	if (need_real_front > 0) {
+	    buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv,
+						    DRI2BufferFrontLeft,
+						    front_format, dimensions_match);
+	}
 
-	/* If the drawable is a window and the front-buffer is requested,
-	 * silently add the fake front-buffer to the list of requested
-	 * attachments.  The counting logic in the loop accounts for the case
-	 * where the client requests both the fake and real front-buffer.
-	 */
-	if (attachment == DRI2BufferBackLeft) {
-	    need_real_front++;
-	    front_format = format;
+	if (need_fake_front > 0) {
+	    buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv,
+						    DRI2BufferFakeFrontLeft,
+						    front_format, dimensions_match);
+	    have_fake_front = 1;
 	}
 
-	if (attachment == DRI2BufferFrontLeft) {
-	    need_real_front--;
-	    front_format = format;
+	*out_count = i;
 
-	    if (pDraw->type == DRAWABLE_WINDOW) {
-		need_fake_front++;
+
+	if (pPriv->buffers != NULL) {
+	    for (i = 0; i < pPriv->bufferCount; i++) {
+		if (pPriv->buffers[i] != NULL) {
+		    (*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
+		}
 	    }
+
+	    xfree(pPriv->buffers);
+	}
+    } else {
+	DRI2BufferPtr	buffers1;
+	unsigned int	temp_buf[32];
+	unsigned int	*temp = temp_buf;
+	int		i;
+	int		buffers_match = 1;
+
+	/* Version 1 API with CreateBuffers */
+
+	if ((count + 1) > 32) {
+	    temp = xalloc((count + 1) * sizeof(temp[0]));
 	}
 
-	if (pDraw->type == DRAWABLE_WINDOW) {
-	    if (attachment == DRI2BufferFakeFrontLeft) {
+	for (i = 0; i < count; i++) {
+	    const unsigned attachment = *(attachments++);
+
+	    /* Version 1 doesn't deal with the format at all */
+	    if (has_format)
+		attachments++;
+
+	    /*
+	     * Make sure the client also gets the front buffer when
+	     * it asks for a back buffer
+	     */
+	    if (attachment == DRI2BufferBackLeft)
+		need_real_front++;
+
+	    /*
+	     * If the drawable is a window and the front-buffer is requested,
+	     * silently add the fake front-buffer to the list of requested
+	     * attachments.  The counting logic in the loop accounts for the
+	     * case where the client requests both the fake and real
+	     * front-buffer.
+	     */
+	    if (attachment == DRI2BufferFrontLeft) {
+		need_real_front--;
+		if (pDraw->type == DRAWABLE_WINDOW)
+		    need_fake_front++;
+	    }
+	    if (pDraw->type == DRAWABLE_WINDOW &&
+		attachment == DRI2BufferFakeFrontLeft)
+	    {
 		need_fake_front--;
 		have_fake_front = 1;
 	    }
+
+	    temp[i] = attachment;
 	}
-    }
 
-    if (need_real_front > 0) {
-	buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv,
-						DRI2BufferFrontLeft,
-						front_format, dimensions_match);
-    }
+	if (need_real_front > 0)
+	    temp[count++] = DRI2BufferFrontLeft;
 
-    if (need_fake_front > 0) {
-	buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv,
-						DRI2BufferFakeFrontLeft,
-						front_format, dimensions_match);
-	have_fake_front = 1;
-    }
+	if (need_fake_front > 0) {
+	    temp[count++] = DRI2BufferFakeFrontLeft;
+	    have_fake_front = 1;
+	}
+
+	if (count != pPriv->bufferCount)
+	    buffers_match = 0;
+	else {
+	    for (i = 0; i < count; i++)
+		if (pPriv->buffers[i]->attachment != temp[i]) {
+		    buffers_match = 0;
+		    break;
+		}
+	}
+	if (pPriv->buffers == NULL || !dimensions_match || !buffers_match)
+	{
+            buffers1 = (*ds->CreateBuffers)(pDraw, temp, count);
+	    if (pPriv->buffers != NULL)
+		(*ds->DestroyBuffers)(pDraw, (DRI2BufferPtr) pPriv->buffers[0],
+				      pPriv->bufferCount);
+	}
+	else
+	    buffers1 = (DRI2BufferPtr) pPriv->buffers[0];
 
-    *out_count = i;
+        for (i = 0; i < count; i++)
+	    buffers[i] = (DRI2Buffer2Ptr) &buffers1[i];
 
+        *out_count = count;
 
-    if (pPriv->buffers != NULL) {
-	for (i = 0; i < pPriv->bufferCount; i++) {
-	    if (pPriv->buffers[i] != NULL) {
-		(*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
-	    }
-	}
+	if (pPriv->buffers)
+	    xfree (pPriv->buffers);
 
-	xfree(pPriv->buffers);
+	if (temp != temp_buf) {
+	    xfree(temp);
+	}
     }
 
-
     pPriv->buffers = buffers;
     pPriv->bufferCount = *out_count;
     pPriv->width = pDraw->width;
@@ -292,7 +384,7 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
     return pPriv->buffers;
 }
 
-DRI2BufferPtr *
+DRI2Buffer2Ptr *
 DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
 	       unsigned int *attachments, int count, int *out_count)
 {
@@ -300,7 +392,7 @@ DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
 			  out_count, FALSE);
 }
 
-DRI2BufferPtr *
+DRI2Buffer2Ptr *
 DRI2GetBuffersWithFormat(DrawablePtr pDraw, int *width, int *height,
 			 unsigned int *attachments, int count, int *out_count)
 {
@@ -326,13 +418,13 @@ DRI2CopyRegion(DrawablePtr pDraw, RegionPtr pRegion,
     for (i = 0; i < pPriv->bufferCount; i++)
     {
 	if (pPriv->buffers[i]->attachment == dest)
-	    pDestBuffer = pPriv->buffers[i];
+	    pDestBuffer = (DRI2BufferPtr) pPriv->buffers[i];
 	if (pPriv->buffers[i]->attachment == src)
-	    pSrcBuffer = pPriv->buffers[i];
+	    pSrcBuffer = (DRI2BufferPtr) pPriv->buffers[i];
     }
     if (pSrcBuffer == NULL || pDestBuffer == NULL)
 	return BadValue;
-		
+
     (*ds->CopyRegion)(pDraw, pRegion, pDestBuffer, pSrcBuffer);
 
     return Success;
@@ -349,7 +441,7 @@ DRI2DestroyDrawable(DrawablePtr pDraw)
     pPriv = DRI2GetDrawable(pDraw);
     if (pPriv == NULL)
 	return;
-    
+
     pPriv->refCount--;
     if (pPriv->refCount > 0)
 	return;
@@ -357,8 +449,13 @@ DRI2DestroyDrawable(DrawablePtr pDraw)
     if (pPriv->buffers != NULL) {
 	int i;
 
-	for (i = 0; i < pPriv->bufferCount; i++) {
-	    (*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
+	if (ds->DestroyBuffer) {
+	    for (i = 0; i < pPriv->bufferCount; i++) {
+		(*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
+	    }
+	} else {
+	    (*ds->DestroyBuffers)(pDraw, (DRI2BufferPtr) pPriv->buffers[0],
+				  pPriv->bufferCount);
 	}
 
 	xfree(pPriv->buffers);
@@ -417,18 +514,36 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
     if (!ds)
 	return FALSE;
 
-    if ((info->version < 2)
-	|| (info->CreateBuffer == NULL)
-	|| (info->DestroyBuffer == NULL)) {
-	return FALSE;
-    }
-
-
     ds->fd	       = info->fd;
     ds->driverName     = info->driverName;
     ds->deviceName     = info->deviceName;
-    ds->CreateBuffer   = info->CreateBuffer;
-    ds->DestroyBuffer  = info->DestroyBuffer;
+
+    /* Prefer the new one-at-a-time buffer API */
+    if (info->version >= 2 && info->CreateBuffer && info->DestroyBuffer) {
+	ds->CreateBuffer   = info->CreateBuffer;
+	ds->DestroyBuffer  = info->DestroyBuffer;
+	ds->CreateBuffers  = NULL;
+	ds->DestroyBuffers = NULL;
+    } else if (info->CreateBuffers && info->DestroyBuffers) {
+	xf86DrvMsg(pScreen->myNum, X_WARNING,
+		   "[DRI2] Version 1 API (broken front buffer rendering)\n");
+	ds->CreateBuffer   = NULL;
+	ds->DestroyBuffer  = NULL;
+	ds->CreateBuffers  = info->CreateBuffers;
+	ds->DestroyBuffers = info->DestroyBuffers;
+    } else {
+	xf86DrvMsg(pScreen->myNum, X_ERROR,
+		   "[DRI2] Missing buffer management functions\n");
+	xfree(ds);
+	return FALSE;
+    }
+
+    if (!info->CopyRegion) {
+	xf86DrvMsg(pScreen->myNum, X_ERROR,
+		   "[DRI2] Missing copy region function\n");
+	xfree(ds);
+	return FALSE;
+    }
     ds->CopyRegion     = info->CopyRegion;
 
     dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, ds);
diff --git a/hw/xfree86/dri2/dri2.h b/hw/xfree86/dri2/dri2.h
index b3d02a9..22ee983 100644
--- a/hw/xfree86/dri2/dri2.h
+++ b/hw/xfree86/dri2/dri2.h
@@ -35,16 +35,27 @@
 
 #include <X11/extensions/dri2tokens.h>
 
+/* Version 1 structure (for ABI compatibility) */
 typedef struct {
     unsigned int attachment;
     unsigned int name;
     unsigned int pitch;
     unsigned int cpp;
     unsigned int flags;
-    unsigned int format;
     void *driverPrivate;
 } DRI2BufferRec, *DRI2BufferPtr;
 
+/* Version 2 structure (with format at the end) */
+typedef struct {
+    unsigned int attachment;
+    unsigned int name;
+    unsigned int pitch;
+    unsigned int cpp;
+    unsigned int flags;
+    void *driverPrivate;
+    unsigned int format;
+} DRI2Buffer2Rec, *DRI2Buffer2Ptr;
+
 typedef DRI2BufferPtr	(*DRI2CreateBuffersProcPtr)(DrawablePtr pDraw,
 						    unsigned int *attachments,
 						    int count);
@@ -59,11 +70,11 @@ typedef void		(*DRI2CopyRegionProcPtr)(DrawablePtr pDraw,
 typedef void		(*DRI2WaitProcPtr)(WindowPtr pWin,
 					   unsigned int sequence);
 
-typedef DRI2BufferPtr	(*DRI2CreateBufferProcPtr)(DrawablePtr pDraw,
+typedef DRI2Buffer2Ptr	(*DRI2CreateBufferProcPtr)(DrawablePtr pDraw,
 						   unsigned int attachment,
 						   unsigned int format);
 typedef void		(*DRI2DestroyBufferProcPtr)(DrawablePtr pDraw,
-						    DRI2BufferPtr buffer);
+						    DRI2Buffer2Ptr buffer);
 
 /**
  * Version of the DRI2InfoRec structure defined in this header
@@ -108,7 +119,7 @@ extern _X_EXPORT int DRI2CreateDrawable(DrawablePtr pDraw);
 
 extern _X_EXPORT void DRI2DestroyDrawable(DrawablePtr pDraw);
 
-extern _X_EXPORT DRI2BufferPtr *DRI2GetBuffers(DrawablePtr pDraw,
+extern _X_EXPORT DRI2Buffer2Ptr *DRI2GetBuffers(DrawablePtr pDraw,
 			     int *width,
 			     int *height,
 			     unsigned int *attachments,
@@ -138,7 +149,7 @@ extern _X_EXPORT int DRI2CopyRegion(DrawablePtr pDraw,
  */
 extern _X_EXPORT void DRI2Version(int *major, int *minor);
 
-extern _X_EXPORT DRI2BufferPtr *DRI2GetBuffersWithFormat(DrawablePtr pDraw,
+extern _X_EXPORT DRI2Buffer2Ptr *DRI2GetBuffersWithFormat(DrawablePtr pDraw,
 	int *width, int *height, unsigned int *attachments, int count,
 	int *out_count);
 
diff --git a/hw/xfree86/dri2/dri2ext.c b/hw/xfree86/dri2/dri2ext.c
index 029dce8..ea160ac 100644
--- a/hw/xfree86/dri2/dri2ext.c
+++ b/hw/xfree86/dri2/dri2ext.c
@@ -195,7 +195,7 @@ ProcDRI2DestroyDrawable(ClientPtr client)
 
 static void
 send_buffers_reply(ClientPtr client, DrawablePtr pDrawable,
-		   DRI2BufferPtr *buffers, int count, int width, int height)
+		   DRI2Buffer2Ptr *buffers, int count, int width, int height)
 {
     xDRI2GetBuffersReply rep;
     int skip = 0;
@@ -245,7 +245,7 @@ ProcDRI2GetBuffers(ClientPtr client)
 {
     REQUEST(xDRI2GetBuffersReq);
     DrawablePtr pDrawable;
-    DRI2BufferPtr *buffers;
+    DRI2Buffer2Ptr *buffers;
     int status, width, height, count;
     unsigned int *attachments;
 
@@ -268,7 +268,7 @@ ProcDRI2GetBuffersWithFormat(ClientPtr client)
 {
     REQUEST(xDRI2GetBuffersReq);
     DrawablePtr pDrawable;
-    DRI2BufferPtr *buffers;
+    DRI2Buffer2Ptr *buffers;
     int status, width, height, count;
     unsigned int *attachments;
 
commit 7c7f0c2c6a04f7044d5ce69e97a615735e5831f1
Author: Søren Sandmann Pedersen <sandmann at redhat.com>
Date:   Fri Jul 3 14:36:54 2009 -0400

    Use IncludeInferiors when copying windows before compositing.
    
    Part of bug 22484.

diff --git a/fb/fbpict.c b/fb/fbpict.c
index 32052e9..c5199af 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -159,9 +159,9 @@ fbComposite (CARD8      op,
 {
     pixman_image_t *src, *mask, *dest;
     
-    miCompositeSourceValidate (pSrc, xSrc - xDst, ySrc - yDst, width, height);
+    miCompositeSourceValidate (pSrc, xSrc, ySrc, width, height);
     if (pMask)
-	miCompositeSourceValidate (pMask, xMask - xDst, yMask - yDst, width, height);
+	miCompositeSourceValidate (pMask, xMask, yMask, width, height);
     
     src = image_from_pict (pSrc, TRUE, TRUE);
     mask = image_from_pict (pMask, TRUE, TRUE);
@@ -295,7 +295,8 @@ copy_drawable (DrawablePtr pDraw)
     
     /* First fill the pixmap with zeros */
     gcv[0].val = 0x00000000;
-    dixChangeGC (NullClient, pGC, GCBackground, NULL, gcv);
+    gcv[1].val = IncludeInferiors;
+    dixChangeGC (NullClient, pGC, GCBackground | GCSubwindowMode, NULL, gcv);
     ValidateGC ((DrawablePtr)pPixmap, pGC);
     miClearDrawable ((DrawablePtr)pPixmap, pGC);
     
commit 43ee8d2ead862f84a4526a472519663ef27a8d6a
Author: Matthias Hopf <mhopf at suse.de>
Date:   Wed Jun 24 18:26:23 2009 +0200

    Unclaim PCI slot if driver probing fails.
    
    Otherwise no subsequent driver will be able to claim this pci slot.
    Example for this: fbdev tries to claim, but framebuffer device is not
    available. Later on VESA cannot claim the device.

diff --git a/hw/xfree86/common/xf86.h b/hw/xfree86/common/xf86.h
index e49f28d..f863840 100644
--- a/hw/xfree86/common/xf86.h
+++ b/hw/xfree86/common/xf86.h
@@ -97,6 +97,7 @@ extern _X_EXPORT Bool VTSwitchEnabled;	/* kbd driver */
 extern _X_EXPORT Bool xf86CheckPciSlot( const struct pci_device * );
 extern _X_EXPORT int xf86ClaimPciSlot( struct pci_device *, DriverPtr drvp,
 		     int chipset, GDevPtr dev, Bool active);
+extern _X_EXPORT void xf86UnclaimPciSlot(struct pci_device *);
 extern _X_EXPORT Bool xf86ParsePciBusString(const char *busID, int *bus, int *device,
 			   int *func);
 extern _X_EXPORT Bool xf86ComparePciBusString(const char *busID, int bus, int device, int func);
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index 11f4cf1..e77ffab 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -495,7 +495,8 @@ probe_devices_from_device_sections(DriverPtr drvp)
 		    if ((*drvp->PciProbe)(drvp, entry, pPci,
 					  devices[j].match_data)) {
 			foundScreen = TRUE;
-		    }
+		    } else
+			xf86UnclaimPciSlot(pPci);
 		}
 
 		break;
diff --git a/hw/xfree86/common/xf86pciBus.c b/hw/xfree86/common/xf86pciBus.c
index 586973b..9a9ae40 100644
--- a/hw/xfree86/common/xf86pciBus.c
+++ b/hw/xfree86/common/xf86pciBus.c
@@ -753,6 +753,25 @@ xf86ClaimPciSlot(struct pci_device * d, DriverPtr drvp,
 }
 
 /*
+ * Unclaim PCI slot, e.g. if probing failed, so that a different driver can claim.
+ */
+void
+xf86UnclaimPciSlot(struct pci_device *d)
+{
+    int i;
+
+    for (i = 0; i < xf86NumEntities; i++) {
+	const EntityPtr p = xf86Entities[i];
+
+	if ((p->bus.type == BUS_PCI) && (p->bus.id.pci == d)) {
+	    /* Probably the slot should be deallocated? */
+	    p->bus.type = BUS_NONE;
+	    return;
+	}
+    }
+}
+
+/*
  * Parse a BUS ID string, and return the PCI bus parameters if it was
  * in the correct format for a PCI bus id.
  */
commit 73abdc94c3cceadeda26a9b6bd3cdfecf0df8db2
Author: RALOVICH, Kristóf <tade60 at freemail.hu>
Date:   Sun Jul 5 16:42:54 2009 +0200

    glx: damage is only used with DRI
    
    Signed-off-by: Tiago Vignatti <tiago.vignatti at nokia.com>

diff --git a/glx/glxdrawable.h b/glx/glxdrawable.h
index 0215b3b..3f165ed 100644
--- a/glx/glxdrawable.h
+++ b/glx/glxdrawable.h
@@ -35,8 +35,6 @@
  * Silicon Graphics, Inc.
  */
 
-#include <damage.h>
-
 /* We just need to avoid clashing with DRAWABLE_{WINDOW,PIXMAP} */
 enum {
     GLX_DRAWABLE_WINDOW,
diff --git a/glx/glxdri.c b/glx/glxdri.c
index 5fb75a4..c9d226b 100644
--- a/glx/glxdri.c
+++ b/glx/glxdri.c
@@ -38,6 +38,7 @@
 
 #include <windowstr.h>
 #include <os.h>
+#include <damage.h>
 
 #define _XF86DRI_SERVER_
 #include <drm_sarea.h>
commit 7208a0f032d487bd3bc9809800f4557f1da1e2db
Author: RALOVICH, Kristóf <tade60 at freemail.hu>
Date:   Mon Jun 29 15:18:56 2009 +0200

    glx: remove Xgl leftover
    
    GlxSetRenderTables was only used by the long gone Xgl.
    
    Signed-off-by: Tiago Vignatti <tiago.vignatti at nokia.com>

diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index d4ff7da..f5632d1 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -51,12 +51,6 @@
 #include "indirect_table.h"
 #include "indirect_util.h"
 
-void
-GlxSetRenderTables (struct _glapi_table *table)
-{
-    _glapi_set_dispatch (table);
-}
-
 static int
 validGlxScreen(ClientPtr client, int screen, __GLXscreen **pGlxScreen, int *err)
 {
diff --git a/glx/glxserver.h b/glx/glxserver.h
index 3e44b71..46c9382 100644
--- a/glx/glxserver.h
+++ b/glx/glxserver.h
@@ -94,9 +94,6 @@ void GlxExtensionInit(void);
 void GlxSetVisualConfigs(int nconfigs, 
                          void *configs, void **privates);
 
-struct _glapi_table;
-void GlxSetRenderTables (struct _glapi_table *table);
-
 void __glXScreenInitVisuals(__GLXscreen *screen);
 
 /*
commit 89cf81cd85919e3dbb5adff5e6c6056c7990b60f
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jul 3 10:29:40 2009 +1000

    Xext: return BadValue for XTestFakeInput on unsupported capabilities.
    
    Calling XTestFakeDevice*Event on a device that doesn't allow the matching
    event returns BadValue.
    
    Reported-by: Florian Echtler
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xext/xtest.c b/Xext/xtest.c
index 67f12ac..cbbc51a 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -189,11 +189,34 @@ ProcXTestFakeInput(ClientPtr client)
         switch (type) {
             case XI_DeviceKeyPress:
             case XI_DeviceKeyRelease:
+                if (!dev->key)
+                {
+                    client->errorValue = ev->u.u.type;
+                    return BadValue;
+                }
+                break;
             case XI_DeviceButtonPress:
             case XI_DeviceButtonRelease:
+                if (!dev->button)
+                {
+                    client->errorValue = ev->u.u.type;
+                    return BadValue;
+                }
+                break;
             case XI_DeviceMotionNotify:
+                if (!dev->valuator)
+                {
+                    client->errorValue = ev->u.u.type;
+                    return BadValue;
+                }
+                break;
             case XI_ProximityIn:
             case XI_ProximityOut:
+                if (!dev->proximity)
+                {
+                    client->errorValue = ev->u.u.type;
+                    return BadValue;
+                }
                 break;
             default:
                 client->errorValue = ev->u.u.type;
commit b773b4e8e0087993406d1d8c2df895db4d6301ff
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jul 6 11:04:47 2009 +1000

    s/MAX_DEVICES/MAXDEVICES/ updates.
    
    The number of input devices is MAXDEVICES, not MAX_DEVICES (f781a752e6)
    Two comments updated to refer to MAXDEVICES.
    
    MAX_FUNCS in sigio.c was set to 16 if MAX_DEVICES was undefined. If more
    than 15 physical input devices were present, this could result in a
    failure to install the SIGIO handler for any device above 15.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/os-support/shared/sigio.c b/hw/xfree86/os-support/shared/sigio.c
index 5ba0b7e..44136cc 100644
--- a/hw/xfree86/os-support/shared/sigio.c
+++ b/hw/xfree86/os-support/shared/sigio.c
@@ -75,11 +75,11 @@
 #  define O_ASYNC FASYNC
 #endif
 
-#ifdef MAX_DEVICES
-/* MAX_DEVICES represents the maximimum number of input devices usable
+#ifdef MAXDEVICES
+/* MAXDEVICES represents the maximimum number of input devices usable
  * at the same time plus one entry for DRM support.
  */
-# define MAX_FUNCS   (MAX_DEVICES + 1)
+# define MAX_FUNCS   (MAXDEVICES + 1)
 #else
 # define MAX_FUNCS 16
 #endif
diff --git a/include/inputstr.h b/include/inputstr.h
index b284ea4..73750e0 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -119,7 +119,7 @@ typedef struct _InputClients {
  * OtherInputMasks struct and exactly one InputClients struct hanging off
  * inputClients. Each further client appends to the inputClients list.
  * Each Mask field is per-device, with the device id as the index.
- * Exception: for non-device events (Presence events), the MAX_DEVICES
+ * Exception: for non-device events (Presence events), the MAXDEVICES
  * deviceid is used.
  */
 typedef struct _OtherInputMasks {
diff --git a/mi/midispcur.c b/mi/midispcur.c
index 7b3ce29..3fb7e02 100644
--- a/mi/midispcur.c
+++ b/mi/midispcur.c
@@ -51,7 +51,7 @@ in this Software without prior written authorization from The Open Group.
 # include   "picturestr.h"
 #endif
 
-# include "inputstr.h" /* for MAX_DEVICES */
+# include "inputstr.h"
 
 /* per-screen private data */
 static int miDCScreenKeyIndex;
commit 183c075d2f9d5f6effa1ce7ab135fb0c2e46085a
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jul 3 13:26:48 2009 +1000

    dix: always init the full button map to default values (#22594)
    
    Master devices must have the standard button map applied for all buttons to
    ensure buttons larger than 7 (the default for MDs) are mapped appropriately.
    
    We can't copy the button map from SDs to MDs since that breaks the chained
    button mapping. However, by ensuring all buttons (even non-existing ones)
    are mapped, devices that send such buttons continue to work.
    
    X.Org Bug 22594 <http://bugs.freedesktop.org/show_bug.cgi?id=22594>
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/devices.c b/dix/devices.c
index e000f29..8fac981 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1172,6 +1172,8 @@ InitButtonClassDeviceStruct(DeviceIntPtr dev, int numButtons, Atom* labels,
     butc->sourceid = dev->id;
     for (i = 1; i <= numButtons; i++)
 	butc->map[i] = map[i];
+    for (i = numButtons + 1; i < MAP_LENGTH; i++)
+        butc->map[i] = i;
     memcpy(butc->labels, labels, numButtons * sizeof(Atom));
     dev->button = butc;
     return TRUE;
commit 744bb559826ede37a77e9000b6c620eaa6a3c837
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jul 3 13:58:38 2009 +1000

    Xext: remove unused variable 'it'.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xext/xtest.c b/Xext/xtest.c
index 4f5c527..67f12ac 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -270,8 +270,6 @@ ProcXTestFakeInput(ClientPtr client)
 
     } else
     {
-        DeviceIntPtr it;
-
         if (nev != 1)
             return BadLength;
         switch (type)
commit fd4eed69e40cf090aa16e79a8596eb1442461829
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Jul 2 15:24:54 2009 -0700

    dri2: Enable GLX_SGI_make_current_read when the DRI driver supports it.
    
    This matches idr's 82f150d73cc9a7d8eaf7241a51b03af05bcec159 for DRI1.

diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index 529b2df..ed7fb4c 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -551,6 +551,15 @@ initializeExtensions(__GLXDRIscreen *screen)
     LogMessage(X_INFO, "AIGLX: enabled GLX_MESA_copy_sub_buffer\n");
 
     for (i = 0; extensions[i]; i++) {
+#ifdef __DRI_READ_DRAWABLE
+	if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
+	    __glXEnableExtension(screen->glx_enable_bits,
+				 "GLX_SGI_make_current_read");
+
+	    LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_make_current_read\n");
+	}
+#endif
+
 #ifdef __DRI_SWAP_CONTROL
 	if (strcmp(extensions[i]->name, __DRI_SWAP_CONTROL) == 0) {
 	    screen->swapControl =
commit d6b8205e699c0c62af76c4a9cbff1402337927b3
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Fri Jul 3 19:25:33 2009 -0700

    XQuartz: ProcAppleWMAttachTransient to play nice with the new Dock in SL
    (cherry picked from commit ddc0242d8f291d0f961ba9aa8c883e39861ce2ad)

diff --git a/configure.ac b/configure.ac
index 8f00e28..e47b60e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1679,7 +1679,7 @@ if test "x$XQUARTZ" = xyes; then
 
 	CFLAGS="${CFLAGS} -DROOTLESS_WORKAROUND -DROOTLESS_SAFEALPHA -DNO_ALLOCA"
 
-	PKG_CHECK_MODULES(XPBPROXY, [applewmproto >= 1.2] [applewm >= 1.2] xfixes fixesproto x11)
+	PKG_CHECK_MODULES(XPBPROXY, [applewmproto >= 1.3] [applewm >= 1.3] xfixes fixesproto x11)
 
 	if test "x$STANDALONE_XPBPROXY" = xyes ; then
 		AC_DEFINE(STANDALONE_XPBPROXY,1,[Build a standalone xpbproxy])
diff --git a/hw/xquartz/applewm.c b/hw/xquartz/applewm.c
index 418c5de..ad38583 100644
--- a/hw/xquartz/applewm.c
+++ b/hw/xquartz/applewm.c
@@ -512,6 +512,36 @@ ProcAppleWMSendPSN(register ClientPtr client)
 }
 
 static int
+ProcAppleWMAttachTransient(register ClientPtr client)
+{
+    WindowPtr pWinChild, pWinParent;
+    REQUEST(xAppleWMAttachTransientReq);
+    int err;
+    
+    REQUEST_SIZE_MATCH(xAppleWMAttachTransientReq);
+    
+    if(!appleWMProcs->AttachTransient)
+        return BadRequest;
+
+    if (Success != dixLookupWindow(&pWinChild, stuff->child, client, DixReadAccess))
+        return BadValue;
+
+    if(stuff->parent) {
+        if(Success != dixLookupWindow(&pWinParent, stuff->parent, client, DixReadAccess))
+            return BadValue;
+    } else {
+        pWinParent = NULL;
+    }
+
+    err = appleWMProcs->AttachTransient(pWinChild, pWinParent);
+    if (err != Success) {
+        return err;
+    }
+
+    return (client->noClientException);
+}
+
+static int
 ProcAppleWMSetCanQuit(
     register ClientPtr client
 )
@@ -673,6 +703,8 @@ ProcAppleWMDispatch (
         return ProcAppleWMFrameDraw(client);
     case X_AppleWMSendPSN:
         return ProcAppleWMSendPSN(client);
+    case X_AppleWMAttachTransient:
+        return ProcAppleWMAttachTransient(client);
     default:
         return BadRequest;
     }
diff --git a/hw/xquartz/applewmExt.h b/hw/xquartz/applewmExt.h
index 3fc3766..5ef8b54 100644
--- a/hw/xquartz/applewmExt.h
+++ b/hw/xquartz/applewmExt.h
@@ -46,6 +46,7 @@ typedef int (*FrameDrawProc)(WindowPtr pWin, int class, unsigned int attr,
                              unsigned int title_len,
                              const unsigned char *title_bytes);
 typedef int (*SendPSNProc)(uint32_t hi, uint32_t lo);
+typedef int (*AttachTransientProc)(WindowPtr pWinChild, WindowPtr pWinParent);
 
 /*
  * AppleWM implementation function list
@@ -58,6 +59,7 @@ typedef struct _AppleWMProcs {
     FrameHitTestProc FrameHitTest;
     FrameDrawProc FrameDraw;
     SendPSNProc SendPSN;
+    AttachTransientProc AttachTransient;
 } AppleWMProcsRec, *AppleWMProcsPtr;
 
 void AppleWMExtensionInit(
diff --git a/hw/xquartz/xpr/xprAppleWM.c b/hw/xquartz/xpr/xprAppleWM.c
index 9c44e20..0a25719 100644
--- a/hw/xquartz/xpr/xprAppleWM.c
+++ b/hw/xquartz/xpr/xprAppleWM.c
@@ -82,6 +82,34 @@ static int xprSetWindowLevel(
     return Success;
 }
 
+#if defined(XPLUGIN_VERSION) && XPLUGIN_VERSION >= 3
+static int xprAttachTransient(WindowPtr pWinChild, WindowPtr pWinParent) {
+    xp_window_id child_wid, parent_wid; 
+    xp_window_changes wc;
+
+    child_wid = x_cvt_vptr_to_uint(RootlessFrameForWindow(pWinChild, TRUE));
+    if (child_wid == 0)
+        return BadWindow;
+
+    if(pWinParent) {
+        parent_wid = x_cvt_vptr_to_uint(RootlessFrameForWindow(pWinParent, TRUE));
+        if (parent_wid == 0)
+            return BadWindow;
+    } else {
+        parent_wid = 0;
+    }
+     
+    wc.transient_for = parent_wid;
+
+    RootlessStopDrawing (pWinChild, FALSE);
+
+    if (xp_configure_window(child_wid, XP_ATTACH_TRANSIENT, &wc) != Success) {
+        return BadValue;
+    }
+
+    return Success;    
+}
+#endif
 
 static int xprFrameDraw(
     WindowPtr pWin,
@@ -114,9 +142,14 @@ static AppleWMProcsRec xprAppleWMProcs = {
     xp_frame_get_rect,
     xp_frame_hit_test,
     xprFrameDraw,
-#if defined(XPLUGIN_VERSION) && XPLUGIN_VERSION >= 2
-    xp_set_dock_proxy
+#if defined(XPLUGIN_VERSION) && XPLUGIN_VERSION >= 3
+    xp_set_dock_proxy,
+    xprAttachTransient
+#elif defined(XPLUGIN_VERSION) && XPLUGIN_VERSION >= 2
+    xp_set_dock_proxy,
+    NULL
 #else
+    NULL,
     NULL
 #endif
 };
commit a49ae50370ec94e08e7dec3c742d33e20e79ef36
Author: Colin Harrison <colin.harrison at virgin.net>
Date:   Mon Jun 29 22:55:52 2009 +0100

    Xming: Apply window style hints in -multiwindow mode
    
    Remove frames from 'dock' windows and make them topmost in -multiwindow mode.
    Remove frames from windows with MOTIF_WM_HINTS of no decorations in -multiwindow mode.
    Apply some _NET_WM_STATE hints in -multiwindow mode.
    Apply window styles overrides from .rc file
    Correctly update region of shaped windows when applying styles
    
    Copyright (C) Colin Harrison 2005-2009
    http://www.straightrunning.com/XmingNotes/
    http://sourceforge.net/projects/xming/

diff --git a/hw/xwin/winmultiwindowwm.c b/hw/xwin/winmultiwindowwm.c
index 7421379..8560c6c 100644
--- a/hw/xwin/winmultiwindowwm.c
+++ b/hw/xwin/winmultiwindowwm.c
@@ -1,5 +1,6 @@
 /*
  *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
+ *Copyright (C) Colin Harrison 2005-2009
  *
  *Permission is hereby granted, free of charge, to any person obtaining
  * a copy of this software and associated documentation files (the
@@ -26,6 +27,7 @@
  *from the XFree86 Project.
  *
  * Authors:	Kensuke Matsuzaki
+ *              Colin Harrison
  */
 
 /* X headers */
@@ -56,6 +58,11 @@
 #include "objbase.h"
 #include "ddraw.h"
 #include "winwindow.h"
+#include "winprefs.h"
+#include "window.h"
+#include "pixmapstr.h"
+#include "windowstr.h"
+
 #ifdef XWIN_MULTIWINDOWEXTWM
 #include <X11/extensions/windowswmstr.h>
 #else
@@ -65,6 +72,8 @@
 #endif
 
 extern void winDebug(const char *format, ...);
+extern void winReshapeMultiWindow(WindowPtr pWin);
+extern void winUpdateRgnMultiWindow(WindowPtr pWin);
 
 #ifndef CYGDEBUG
 #define CYGDEBUG NO
@@ -186,6 +195,11 @@ PreserveWin32Stack(WMInfoPtr pWMInfo, Window iWindow, UINT direction);
 static Bool
 CheckAnotherWindowManager (Display *pDisplay, DWORD dwScreen);
 
+static void
+winApplyHints (Display *pDisplay, Window iWindow, HWND hWnd, HWND *zstyle);
+
+void
+winUpdateWindowPosition (HWND hWnd, Bool reshape, HWND *zstyle);
 
 /*
  * Local globals
@@ -240,6 +254,12 @@ PushMessage (WMMsgQueuePtr pQueue, WMMsgNodePtr pNode)
     case WM_WM_MAP:
       ErrorF ("\tWM_WM_MAP\n");
       break;
+    case WM_WM_MAP2:
+      ErrorF ("\tWM_WM_MAP2\n");
+      break;
+    case WM_WM_MAP3:
+      ErrorF ("\tWM_WM_MAP3\n");
+      break;
     case WM_WM_UNMAP:
       ErrorF ("\tWM_WM_UNMAP\n");
       break;
@@ -700,10 +720,42 @@ winMultiWindowWMProc (void *pArg)
 			   1);
 	  UpdateName (pWMInfo, pNode->msg.iWindow);
 	  winUpdateIcon (pNode->msg.iWindow);
-#if 0
-	  /* Handles the case where there are AOT windows above it in W32 */
-	  PreserveWin32Stack (pWMInfo, pNode->msg.iWindow, GW_HWNDPREV);
+	  break;
+
+	case WM_WM_MAP2:
+#if CYGMULTIWINDOW_DEBUG
+	  ErrorF ("\tWM_WM_MAP2\n");
 #endif
+	  XChangeProperty (pWMInfo->pDisplay,
+			   pNode->msg.iWindow,
+			   pWMInfo->atmPrivMap,
+			   XA_INTEGER,//pWMInfo->atmPrivMap,
+			   32,
+			   PropModeReplace,
+			   (unsigned char *) &(pNode->msg.hwndWindow),
+			   1);
+	  break;
+
+	case WM_WM_MAP3:
+#if CYGMULTIWINDOW_DEBUG
+	  ErrorF ("\tWM_WM_MAP3\n");
+#endif
+	  /* Put a note as to the HWND associated with this Window */
+	  XChangeProperty (pWMInfo->pDisplay,
+			   pNode->msg.iWindow,
+			   pWMInfo->atmPrivMap,
+			   XA_INTEGER,//pWMInfo->atmPrivMap,
+			   32,
+			   PropModeReplace,
+			   (unsigned char *) &(pNode->msg.hwndWindow),
+			   1);
+	  UpdateName (pWMInfo, pNode->msg.iWindow);
+	  winUpdateIcon (pNode->msg.iWindow);
+	  {
+	    HWND zstyle = HWND_NOTOPMOST;
+	    winApplyHints (pWMInfo->pDisplay, pNode->msg.iWindow, pNode->msg.hwndWindow, &zstyle);
+	    winUpdateWindowPosition (pNode->msg.hwndWindow, TRUE, &zstyle);
+	  }
 	  break;
 
 	case WM_WM_UNMAP:
@@ -1435,3 +1487,168 @@ winDeinitMultiWindowWM (void)
   ErrorF ("winDeinitMultiWindowWM - Noting shutdown in progress\n");
   g_shutdown = TRUE;
 }
+
+/* Windows window styles */
+#define HINT_NOFRAME	(1l<<0)
+#define HINT_BORDER	(1L<<1)
+#define HINT_SIZEBOX	(1l<<2)
+#define HINT_CAPTION	(1l<<3)
+/* These two are used on their own */
+#define HINT_MAX	(1L<<0)
+#define HINT_MIN	(1L<<1)
+
+static void
+winApplyHints (Display *pDisplay, Window iWindow, HWND hWnd, HWND *zstyle)
+{
+  static Atom		windowState, motif_wm_hints, windowType;
+  static Atom		hiddenState, fullscreenState, belowState, aboveState;
+  static Atom		dockWindow;
+  static int		generation;
+  Atom			type, *pAtom = NULL;
+  int			format;
+  unsigned long		hint = 0, maxmin = 0, style, nitems = 0 , left = 0;
+  WindowPtr		pWin = GetProp (hWnd, WIN_WINDOW_PROP);
+
+  if (!hWnd) return;
+  if (!IsWindow (hWnd)) return;
+
+  if (generation != serverGeneration) {
+      generation = serverGeneration;
+      windowState = XInternAtom(pDisplay, "_NET_WM_STATE", False);
+      motif_wm_hints = XInternAtom(pDisplay, "_MOTIF_WM_HINTS", False);
+      windowType = XInternAtom(pDisplay, "_NET_WM_WINDOW_TYPE", False);
+      hiddenState = XInternAtom(pDisplay, "_NET_WM_STATE_HIDDEN", False);
+      fullscreenState = XInternAtom(pDisplay, "_NET_WM_STATE_FULLSCREEN", False);
+      belowState = XInternAtom(pDisplay, "_NET_WM_STATE_BELOW", False);
+      aboveState = XInternAtom(pDisplay, "_NET_WM_STATE_ABOVE", False);
+      dockWindow = XInternAtom(pDisplay, "_NET_WM_WINDOW_TYPE_DOCK", False);
+  }
+
+  if (XGetWindowProperty(pDisplay, iWindow, windowState, 0L,
+			 1L, False, XA_ATOM, &type, &format,
+			 &nitems, &left, (unsigned char **)&pAtom) == Success)
+  {
+    if (pAtom && nitems == 1)
+    {
+      if (*pAtom == hiddenState) maxmin |= HINT_MIN;
+      else if (*pAtom == fullscreenState) maxmin |= HINT_MAX;
+      if (*pAtom == belowState) *zstyle = HWND_BOTTOM;
+      else if (*pAtom == aboveState) *zstyle = HWND_TOPMOST;
+    }
+    if (pAtom) XFree(pAtom);
+  }
+
+  nitems = left = 0;
+  MwmHints *mwm_hint = NULL;
+  if (XGetWindowProperty(pDisplay, iWindow, motif_wm_hints, 0L,
+			 PropMwmHintsElements, False, motif_wm_hints, &type, &format,
+			 &nitems, &left, (unsigned char **)&mwm_hint) == Success)
+  {
+    if (mwm_hint && nitems == PropMwmHintsElements && (mwm_hint->flags & MwmHintsDecorations))
+    {
+      if (!mwm_hint->decorations) hint |= HINT_NOFRAME;
+      else if (!(mwm_hint->decorations & MwmDecorAll))
+      {
+	if (mwm_hint->decorations & MwmDecorBorder) hint |= HINT_BORDER;
+	if (mwm_hint->decorations & MwmDecorHandle) hint |= HINT_SIZEBOX;
+	if (mwm_hint->decorations & MwmDecorTitle) hint |= HINT_CAPTION;
+      }
+    }
+    if (mwm_hint) XFree(mwm_hint);
+  }
+
+  nitems = left = 0;
+  pAtom = NULL;
+  if (XGetWindowProperty(pDisplay, iWindow, windowType, 0L,
+			 1L, False, XA_ATOM, &type, &format,
+			 &nitems, &left, (unsigned char **)&pAtom) == Success)
+  {
+    if (pAtom && nitems == 1)
+    {
+      if (*pAtom == dockWindow)
+      {
+	hint = (hint & ~HINT_NOFRAME) | HINT_SIZEBOX; /* Xming puts a sizebox on dock windows */
+	*zstyle = HWND_TOPMOST;
+      }
+    }
+    if (pAtom) XFree(pAtom);
+  }
+
+  /* Apply Styles, overriding hint settings from above */
+  style = winOverrideStyle((unsigned long)pWin);
+  if (style & STYLE_TOPMOST) *zstyle = HWND_TOPMOST;
+  else if (style & STYLE_MAXIMIZE) maxmin = (hint & ~HINT_MIN) | HINT_MAX;
+  else if (style & STYLE_MINIMIZE) maxmin = (hint & ~HINT_MAX) | HINT_MIN;
+  else if (style & STYLE_BOTTOM) *zstyle = HWND_BOTTOM;
+
+  if (maxmin & HINT_MAX) SendMessage(hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
+  else if (maxmin & HINT_MIN) SendMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
+
+  if (style & STYLE_NOTITLE)
+	hint = (hint & ~HINT_NOFRAME & ~HINT_BORDER & ~HINT_CAPTION) | HINT_SIZEBOX;
+  else if (style & STYLE_OUTLINE)
+	hint = (hint & ~HINT_NOFRAME & ~HINT_SIZEBOX & ~HINT_CAPTION) | HINT_BORDER;
+  else if (style & STYLE_NOFRAME)
+	hint = (hint & ~HINT_BORDER & ~HINT_CAPTION & ~HINT_SIZEBOX) | HINT_NOFRAME;
+
+  style = GetWindowLongPtr(hWnd, GWL_STYLE) & ~WS_CAPTION & ~WS_SIZEBOX; /* Just in case */
+  if (!style) return;
+  if (!hint) /* All on, but no resize of children is allowed */
+    style = style | WS_CAPTION | (GetParent(hWnd) ? 0 : WS_SIZEBOX);
+  else if (hint & HINT_NOFRAME); /* All off, so do nothing */
+  else style = style | ((hint & HINT_BORDER) ? WS_BORDER : 0) |
+		((hint & HINT_SIZEBOX) ? (GetParent(hWnd) ? 0 : WS_SIZEBOX) : 0) |
+		((hint & HINT_CAPTION) ? WS_CAPTION : 0);
+  SetWindowLongPtr (hWnd, GWL_STYLE, style);
+}
+
+void
+winUpdateWindowPosition (HWND hWnd, Bool reshape, HWND *zstyle)
+{
+  int	iDx, iDy;
+  RECT	rcNew;
+  WindowPtr	pWin = GetProp (hWnd, WIN_WINDOW_PROP);
+  DrawablePtr	pDraw = NULL;
+
+  if (!pWin) return;
+  pDraw = &pWin->drawable;
+  if (!pDraw) return;
+
+  /* Setup a rectangle with the X window position and size */
+  SetRect (&rcNew, pDraw->x, pDraw->y, pDraw->x + pDraw->width, pDraw->y + pDraw->height);
+
+#if 0
+  ErrorF ("winUpdateWindowPosition - (%d, %d)-(%d, %d)\n",
+	  rcNew.left, rcNew.top,
+	  rcNew.right, rcNew.bottom);
+#endif
+
+  AdjustWindowRectEx (&rcNew, GetWindowLongPtr (hWnd, GWL_STYLE), FALSE, WS_EX_APPWINDOW);
+
+  /* Calculate position deltas */
+  iDx = pDraw->x - rcNew.left;
+  iDy = pDraw->y - rcNew.top;
+
+  /* Calculate new rectangle */
+  rcNew.left += iDx;
+  rcNew.right += iDx;
+  rcNew.top += iDy;
+  rcNew.bottom += iDy;
+
+#if 0
+  ErrorF ("winUpdateWindowPosition - (%d, %d)-(%d, %d)\n",
+	  rcNew.left, rcNew.top,
+	  rcNew.right, rcNew.bottom);
+#endif
+
+  /* Position the Windows window */
+  SetWindowPos (hWnd, *zstyle, rcNew.left, rcNew.top,
+	rcNew.right - rcNew.left, rcNew.bottom - rcNew.top,
+	SWP_NOMOVE | ((reshape) ? 0 : SWP_NOREDRAW));
+
+  if (reshape)
+  {
+    winReshapeMultiWindow(pWin);
+    winUpdateRgnMultiWindow(pWin);
+  }
+}
diff --git a/hw/xwin/winmultiwindowwndproc.c b/hw/xwin/winmultiwindowwndproc.c
index 3138229..543a165 100644
--- a/hw/xwin/winmultiwindowwndproc.c
+++ b/hw/xwin/winmultiwindowwndproc.c
@@ -51,6 +51,8 @@ extern Bool			g_fKeyboardHookLL;
 extern Bool			g_fSoftwareCursor;
 extern Bool			g_fButton[3];
 
+extern void winUpdateWindowPosition (HWND hWnd, Bool reshape, HWND *zstyle);
+
 
 /*
  * Local globals
@@ -421,6 +423,8 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
       SetWindowRgn (hwnd, hRgnWindow, TRUE);
       DeleteObject(hRgnWindow);
 
+      SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)XMING_SIGNATURE);
+
       return 0;
 
     case WM_INIT_SYS_MENU:
@@ -865,94 +869,51 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
       if (!wParam)
 	return 0;
 
-      /* Tell X to map the window */
-      MapWindow (pWin, wClient(pWin));
-
       /* */
       if (!pWin->overrideRedirect)
 	{
-	  DWORD		dwExStyle;
-	  DWORD		dwStyle;
-	  RECT		rcNew;
-	  int		iDx, iDy;
-	      
 	  /* Flag that this window needs to be made active when clicked */
 	  SetProp (hwnd, WIN_NEEDMANAGE_PROP, (HANDLE) 1);
 
-	  /* Get the standard and extended window style information */
-	  dwExStyle = GetWindowLongPtr (hwnd, GWL_EXSTYLE);
-	  dwStyle = GetWindowLongPtr (hwnd, GWL_STYLE);
-
-	  /* */
-	  if (dwExStyle != WS_EX_APPWINDOW)
+	  if (!(GetWindowLongPtr (hwnd, GWL_EXSTYLE) & WS_EX_APPWINDOW))
 	    {
-	      /* Setup a rectangle with the X window position and size */
-	      SetRect (&rcNew,
-		       pDraw->x,
-		       pDraw->y,
-		       pDraw->x + pDraw->width,
-		       pDraw->y + pDraw->height);
-
-#if 0
-	      ErrorF ("winTopLevelWindowProc - (%d, %d)-(%d, %d)\n",
-		      rcNew.left, rcNew.top,
-		      rcNew.right, rcNew.bottom);
-#endif
-
-	      /* */
-	      AdjustWindowRectEx (&rcNew,
-				  WS_POPUP | WS_SIZEBOX | WS_OVERLAPPEDWINDOW,
-				  FALSE,
-				  WS_EX_APPWINDOW);
-
-	      /* Calculate position deltas */
-	      iDx = pDraw->x - rcNew.left;
-	      iDy = pDraw->y - rcNew.top;
-
-	      /* Calculate new rectangle */
-	      rcNew.left += iDx;
-	      rcNew.right += iDx;
-	      rcNew.top += iDy;
-	      rcNew.bottom += iDy;
-
-#if 0
-	      ErrorF ("winTopLevelWindowProc - (%d, %d)-(%d, %d)\n",
-		      rcNew.left, rcNew.top,
-		      rcNew.right, rcNew.bottom);
-#endif
+	      HWND		zstyle = HWND_NOTOPMOST;
 
 	      /* Set the window extended style flags */
 	      SetWindowLongPtr (hwnd, GWL_EXSTYLE, WS_EX_APPWINDOW);
 
+	      /* Set the transient style flags */
+	      if (GetParent(hwnd)) SetWindowLongPtr (hwnd, GWL_STYLE,
+		   WS_POPUP | WS_OVERLAPPED | WS_SYSMENU | WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
 	      /* Set the window standard style flags */
-	      SetWindowLongPtr (hwnd, GWL_STYLE,
-				WS_POPUP | WS_SIZEBOX | WS_OVERLAPPEDWINDOW);
-
-	      /* Position the Windows window */
-	      SetWindowPos (hwnd, HWND_TOP,
-			    rcNew.left, rcNew.top,
-			    rcNew.right - rcNew.left, rcNew.bottom - rcNew.top,
-			    SWP_NOMOVE | SWP_FRAMECHANGED
-			    | SWP_SHOWWINDOW | SWP_NOACTIVATE);
+	      else SetWindowLongPtr (hwnd, GWL_STYLE,
+		   (WS_POPUP | WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS)
+		   & ~WS_CAPTION & ~WS_SIZEBOX);
 
-	      /* Bring the Windows window to the foreground */
+	      winUpdateWindowPosition (hwnd, FALSE, &zstyle);
 	      SetForegroundWindow (hwnd);
 	    }
+	  wmMsg.msg = WM_WM_MAP3;
 	}
       else /* It is an overridden window so make it top of Z stack */
 	{
 #if CYGWINDOWING_DEBUG
 	  ErrorF ("overridden window is shown\n");
 #endif
-	  SetWindowPos (hwnd, HWND_TOPMOST, 0, 0, 0, 0,
-			SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+	  HWND forHwnd = GetForegroundWindow();
+	  if (forHwnd != NULL)
+	  {
+	    if (GetWindowLongPtr(forHwnd, GWLP_USERDATA) & (LONG_PTR)XMING_SIGNATURE)
+	    {
+	      if (GetWindowLongPtr(forHwnd, GWL_EXSTYLE) & WS_EX_TOPMOST)
+		SetWindowPos (hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+	      else
+		SetWindowPos (hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+	    }
+	  }
+	  wmMsg.msg = WM_WM_MAP2;
 	}
 	  
-      /* Setup the Window Manager message */
-      wmMsg.msg = WM_WM_MAP;
-      wmMsg.iWidth = pDraw->width;
-      wmMsg.iHeight = pDraw->height;
-
       /* Tell our Window Manager thread to map the window */
       if (fWMMsgInitialized)
 	winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
diff --git a/hw/xwin/winwindow.h b/hw/xwin/winwindow.h
index 38db55f..86c0943 100644
--- a/hw/xwin/winwindow.h
+++ b/hw/xwin/winwindow.h
@@ -2,6 +2,7 @@
 #define _WINWINDOW_H_
 /*
  *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
+ *Copyright (C) Colin Harrison 2005-2009
  *
  *Permission is hereby granted, free of charge, to any person obtaining
  * a copy of this software and associated documentation files (the
@@ -28,6 +29,7 @@
  *from the XFree86 Project.
  *
  * Authors:	Kensuke Matsuzaki
+ *              Colin Harrison
  */
 
 #ifndef NO
@@ -60,6 +62,8 @@
 #define CYGWINDOWING_DEBUG	NO
 #endif
 
+#define XMING_SIGNATURE		0x12345678L
+
 typedef struct _winPrivScreenRec *winPrivScreenPtr;
 
 
@@ -111,9 +115,25 @@ typedef struct _winWMMessageRec{
 #define		WM_WM_NAME_EVENT	(WM_USER + 9)
 #define		WM_WM_HINTS_EVENT	(WM_USER + 10)
 #define		WM_WM_CHANGE_STATE	(WM_USER + 11)
+#define		WM_WM_MAP2		(WM_USER + 12)
+#define		WM_WM_MAP3		(WM_USER + 13)
 #define		WM_MANAGE		(WM_USER + 100)
 #define		WM_UNMANAGE		(WM_USER + 102)
 
+#define		MwmHintsDecorations	(1L << 1)
+
+#define		MwmDecorAll		(1l << 0)
+#define		MwmDecorBorder		(1l << 1)
+#define		MwmDecorHandle		(1l << 2)
+#define		MwmDecorTitle		(1l << 3)
+
+/* This structure only contains 3 elements... the Motif 2.0 structure
+contains 5... we only need the first 3... so that is all we will define */
+typedef struct MwmHints {
+  unsigned long		flags, functions, decorations;
+} MwmHints;
+#define		PropMwmHintsElements	3
+
 void
 winSendMessageToWM (void *pWMInfo, winWMMessagePtr msg);
 
commit 17e67c407d130c325d3899c18d68b8eef6a88bea
Author: Joe Krahn <jkrahn at nc.rr.com>
Date:   Wed Jun 24 23:32:09 2009 +0100

    Cygwin/X: Change to a single native window class for all X windows
    
    from fd.o Bugzilla #4491:
    
    There is no point in having one class for every window, aside from trying to
    set custom icons via the class, which we no longer do, so converted to using
    a single class for all client windows.
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/windialogs.c b/hw/xwin/windialogs.c
index 5d6bd24..0cfddc6 100755
--- a/hw/xwin/windialogs.c
+++ b/hw/xwin/windialogs.c
@@ -54,6 +54,10 @@ extern Bool			g_fClipboardStarted;
 #endif
 extern Bool			g_fSoftwareCursor;
 
+#if defined(XWIN_MULTIWINDOW)
+extern HICON                    g_hIconX;
+extern HICON                    g_hSmallIconX;
+#endif
 
 /*
  * Local function prototypes
@@ -229,8 +233,16 @@ winInitDialog (HWND hwndDlg)
 		SWP_NOSIZE | SWP_FRAMECHANGED);
   }
 
-  /* Set icon to standard app icon */
+#ifdef XWIN_MULTIWINDOW
+  if (g_hIconX) hIcon=g_hIconX;
+  else
+#endif
   hIcon = LoadIcon (g_hInstance, MAKEINTRESOURCE(IDI_XWIN));
+
+#ifdef XWIN_MULTIWINDOW
+  if (g_hSmallIconX) hIconSmall=g_hSmallIconX;
+  else
+#endif
   hIconSmall = LoadImage (g_hInstance,
                         MAKEINTRESOURCE(IDI_XWIN), IMAGE_ICON,
                         GetSystemMetrics(SM_CXSMICON),
@@ -252,7 +264,7 @@ winDisplayExitDialog (winPrivScreenPtr pScreenPriv)
   int i;
   int liveClients = 0;
 
-  /* Count up running clinets (clients[0] is serverClient) */
+  /* Count up running clients (clients[0] is serverClient) */
   for (i = 1; i < currentMaxClients; i++)
     if (clients[i] != NullClient)	
       liveClients++;
diff --git a/hw/xwin/winmultiwindowwindow.c b/hw/xwin/winmultiwindowwindow.c
index f4f61a8..f9ada7c 100644
--- a/hw/xwin/winmultiwindowwindow.c
+++ b/hw/xwin/winmultiwindowwindow.c
@@ -44,7 +44,9 @@
  * External global variables
  */
 
-extern HWND			g_hDlgDepthChange;
+extern HICON		g_hIconX;
+extern HICON		g_hSmallIconX;
+extern HWND		g_hDlgDepthChange;
 
 /*
  * Prototypes for local functions
@@ -74,6 +76,34 @@ winFindWindow (pointer value, XID id, pointer cdata);
 
 #define SubStrSend(pWin,pParent) (StrSend(pWin) || SubSend(pParent))
 
+void winInitMultiWindowClass(void)
+{
+  static wATOM atomXWinClass=0;
+  WNDCLASSEX wcx;
+
+  if (atomXWinClass==0)
+  {
+    /* Setup our window class */
+    wcx.cbSize=sizeof(WNDCLASSEX);
+    wcx.style = CS_HREDRAW | CS_VREDRAW;
+    wcx.lpfnWndProc = winTopLevelWindowProc;
+    wcx.cbClsExtra = 0;
+    wcx.cbWndExtra = 0;
+    wcx.hInstance = g_hInstance;
+    wcx.hIcon = g_hIconX;
+    wcx.hCursor = 0;
+    wcx.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
+    wcx.lpszMenuName = NULL;
+    wcx.lpszClassName = WINDOW_CLASS_X;
+    wcx.hIconSm = g_hSmallIconX;
+
+#if CYGMULTIWINDOW_DEBUG
+    ErrorF ("winCreateWindowsWindow - Creating class: %s\n", WINDOW_CLASS_X);
+#endif
+
+    atomXWinClass = RegisterClassEx (&wcx);
+  }
+}
 
 /*
  * CreateWindow - See Porting Layer Definition - p. 37
@@ -477,18 +507,15 @@ winCreateWindowsWindow (WindowPtr pWin)
   int			iHeight;
   HWND			hWnd;
   HWND			hFore = NULL;
-  WNDCLASSEX		wc;
   winWindowPriv(pWin);
   HICON			hIcon;
   HICON			hIconSmall;
-#define CLASS_NAME_LENGTH 512
-  char                  pszClass[CLASS_NAME_LENGTH], pszWindowID[12];
-  char                  *res_name, *res_class, *res_role;
-  static int		s_iWindowID = 0;
   winPrivScreenPtr	pScreenPriv = pWinPriv->pScreenPriv;
   WinXSizeHints         hints;
   WindowPtr		pDaddy;
 
+  winInitMultiWindowClass();
+
 #if CYGMULTIWINDOW_DEBUG
   ErrorF ("winCreateWindowsWindow - pWin: %08x\n", pWin);
 #endif
@@ -510,58 +537,6 @@ winCreateWindowsWindow (WindowPtr pWin)
   iWidth = pWin->drawable.width;
   iHeight = pWin->drawable.height;
 
-  winSelectIcons(pWin, &hIcon, &hIconSmall); 
-
-  /* Set standard class name prefix so we can identify window easily */
-  strncpy (pszClass, WINDOW_CLASS_X, sizeof(pszClass));
-
-  if (winMultiWindowGetClassHint (pWin, &res_name, &res_class))
-    {
-      strncat (pszClass, "-", 1);
-      strncat (pszClass, res_name, CLASS_NAME_LENGTH - strlen (pszClass));
-      strncat (pszClass, "-", 1);
-      strncat (pszClass, res_class, CLASS_NAME_LENGTH - strlen (pszClass));
-      
-      /* Check if a window class is provided by the WM_WINDOW_ROLE property,
-       * if not use the WM_CLASS information.
-       * For further information see:
-       * http://tronche.com/gui/x/icccm/sec-5.html
-       */ 
-      if (winMultiWindowGetWindowRole (pWin, &res_role) )
-	{
-	  strcat (pszClass, "-");
-	  strcat (pszClass, res_role);
-	  free (res_role);
-	}
-
-      free (res_name);
-      free (res_class);
-    }
-
-  /* Add incrementing window ID to make unique class name */
-  snprintf (pszWindowID, sizeof(pszWindowID), "-%x", s_iWindowID++);
-  pszWindowID[sizeof(pszWindowID)-1] = 0;
-  strcat (pszClass, pszWindowID);
-
-#if CYGMULTIWINDOW_DEBUG
-  ErrorF ("winCreateWindowsWindow - Creating class: %s\n", pszClass);
-#endif
-
-  /* Setup our window class */
-  wc.cbSize = sizeof(wc);
-  wc.style = CS_HREDRAW | CS_VREDRAW;
-  wc.lpfnWndProc = winTopLevelWindowProc;
-  wc.cbClsExtra = 0;
-  wc.cbWndExtra = 0;
-  wc.hInstance = g_hInstance;
-  wc.hIcon = hIcon;
-  wc.hIconSm = hIconSmall;
-  wc.hCursor = 0;
-  wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
-  wc.lpszMenuName = NULL;
-  wc.lpszClassName = pszClass;
-  RegisterClassEx (&wc);
-
     if (winMultiWindowGetTransientFor (pWin, &pDaddy))
     {
       if (pDaddy)
@@ -575,7 +550,7 @@ winCreateWindowsWindow (WindowPtr pWin)
   /* Make it OVERLAPPED in create call since WS_POPUP doesn't support */
   /* CW_USEDEFAULT, change back to popup after creation */
   hWnd = CreateWindowExA (WS_EX_TOOLWINDOW,	/* Extended styles */
-			  pszClass,		/* Class name */
+			  WINDOW_CLASS_X,	/* Class name */
 			  WINDOW_TITLE_X,	/* Window name */
 			  WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
 			  iX,			/* Horizontal position */
@@ -591,6 +566,12 @@ winCreateWindowsWindow (WindowPtr pWin)
       ErrorF ("winCreateWindowsWindow - CreateWindowExA () failed: %d\n",
 	      (int) GetLastError ());
     }
+  pWinPriv->hWnd = hWnd;
+
+  /* Set application or .XWinrc defined Icons */
+  winSelectIcons(pWin, &hIcon, &hIconSmall);
+  if (hIcon) SendMessage (hWnd, WM_SETICON, ICON_BIG, (LPARAM) hIcon);
+  if (hIconSmall) SendMessage (hWnd, WM_SETICON, ICON_SMALL, (LPARAM) hIconSmall);
  
   /* Change style back to popup, already placed... */
   SetWindowLong (hWnd, GWL_STYLE, WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
@@ -599,15 +580,13 @@ winCreateWindowsWindow (WindowPtr pWin)
   /* Make sure it gets the proper system menu for a WS_POPUP, too */
   GetSystemMenu (hWnd, TRUE);
 
-  pWinPriv->hWnd = hWnd;
-
   /* Cause any .XWinrc menus to be added in main WNDPROC */
   PostMessage (hWnd, WM_INIT_SYS_MENU, 0, 0);
   
-  SetProp (pWinPriv->hWnd, WIN_WID_PROP, (HANDLE) winGetWindowID(pWin));
+  SetProp (hWnd, WIN_WID_PROP, (HANDLE) winGetWindowID(pWin));
 
   /* Flag that this Windows window handles its own activation */
-  SetProp (pWinPriv->hWnd, WIN_NEEDMANAGE_PROP, (HANDLE) 0);
+  SetProp (hWnd, WIN_NEEDMANAGE_PROP, (HANDLE) 0);
 
   /* Call engine-specific create window procedure */
   (*pScreenPriv->pwinFinishCreateWindowsWindow) (pWin);
@@ -624,11 +603,6 @@ winDestroyWindowsWindow (WindowPtr pWin)
 {
   MSG			msg;
   winWindowPriv(pWin);
-  HICON			hiconClass;
-  HICON			hiconSmClass;
-  HMODULE		hInstance;
-  int			iReturn;
-  char			pszClass[512];
   BOOL			oldstate = winInDestroyWindowsWindow;
   
 #if CYGMULTIWINDOW_DEBUG
@@ -641,12 +615,6 @@ winDestroyWindowsWindow (WindowPtr pWin)
 
   winInDestroyWindowsWindow = TRUE;
 
-  /* Store the info we need to destroy after this window is gone */
-  hInstance = (HINSTANCE) GetClassLong (pWinPriv->hWnd, GCL_HMODULE);
-  hiconClass = (HICON) GetClassLong (pWinPriv->hWnd, GCL_HICON);
-  hiconSmClass = (HICON) GetClassLong (pWinPriv->hWnd, GCL_HICONSM);
-  iReturn = GetClassName (pWinPriv->hWnd, pszClass, 512);
-  
   SetProp (pWinPriv->hWnd, WIN_WINDOW_PROP, NULL);
   /* Destroy the Windows window */
   DestroyWindow (pWinPriv->hWnd);
@@ -663,22 +631,6 @@ winDestroyWindowsWindow (WindowPtr pWin)
 	}
     }
 
-  /* Only if we were able to get the name */
-  if (iReturn)
-    { 
-#if CYGMULTIWINDOW_DEBUG
-      ErrorF ("winDestroyWindowsWindow - Unregistering %s: ", pszClass);
-#endif
-      iReturn = UnregisterClass (pszClass, hInstance);
-      
-#if CYGMULTIWINDOW_DEBUG
-      ErrorF ("winDestroyWindowsWindow - %d Deleting Icon: ", iReturn);
-#endif
-      
-      winDestroyIcon(hiconClass);
-      winDestroyIcon(hiconSmClass);
-    }
-
   winInDestroyWindowsWindow = oldstate;
 
 #if CYGMULTIWINDOW_DEBUG
commit 2c69deb92e11542f615df0f24fdc03e3b4415475
Author: Rémi Cardona <remi at gentoo.org>
Date:   Fri Jul 3 10:51:50 2009 +0200

    configure: libXinerama isn't needed anymore
    
    since libXinerama commit 90d4d23bf2e94721149ddc0a80093b10a82e8845 and
    xineramaproto commit 21477147613c28c968b5e1eb9d8aea7017dd399d, the
    server no longer needs libXinerama.
    
    Signed-off-by: Rémi Cardona <remi at gentoo.org>

diff --git a/configure.ac b/configure.ac
index 150ecd2..8f00e28 100644
--- a/configure.ac
+++ b/configure.ac
@@ -935,7 +935,7 @@ AM_CONDITIONAL(XINERAMA, [test "x$XINERAMA" = xyes])
 if test "x$XINERAMA" = xyes; then
 	AC_DEFINE(XINERAMA, 1, [Support Xinerama extension])
 	AC_DEFINE(PANORAMIX, 1, [Internal define for Xinerama])
-	REQUIRED_MODULES="$REQUIRED_MODULES xineramaproto xinerama"
+	REQUIRED_MODULES="$REQUIRED_MODULES xineramaproto"
 fi
 
 AM_CONDITIONAL(XACE, [test "x$XACE" = xyes])
commit 97e29ffb5bf04a9d8280f1fa32ceced148503492
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jul 3 09:52:04 2009 +1000

    xfree86: fix wrong IsMaster() check causing crashes.
    
    Crashes caused by dereferencing NULL if the path was executed for a floating
    slave device.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/ramdac/xf86Cursor.c b/hw/xfree86/ramdac/xf86Cursor.c
index b474ff3..6b71f46 100644
--- a/hw/xfree86/ramdac/xf86Cursor.c
+++ b/hw/xfree86/ramdac/xf86Cursor.c
@@ -303,8 +303,7 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
 
     if (pCurs == NullCursor) {	/* means we're supposed to remove the cursor */
         if (ScreenPriv->SWCursor ||
-            !(pDev == inputInfo.pointer || !IsMaster(pDev) &&
-                GetMaster(pDev->u.master, MASTER_POINTER) == inputInfo.pointer))
+            !(GetMaster(pDev, MASTER_POINTER) == inputInfo.pointer))
                 (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor, x, y);
         else if (ScreenPriv->isUp) {
             xf86SetCursor(pScreen, NullCursor, x, y);
commit 50a2a8dc76645d8736f7d712f0ef05f23089407e
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jul 3 09:18:57 2009 +1000

    Fix IsXtstDevice - returns false positives since 0814f511d5.
    
    Missing check for the value of 'mid' returned false positives if master was
    NULL.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/devices.c b/dix/devices.c
index a99d046..e000f29 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -2625,16 +2625,23 @@ int AllocXtstDevice (ClientPtr client, char* name,
 BOOL
 IsXtstDevice(DeviceIntPtr dev, DeviceIntPtr master)
 {
+    int is_xtst = FALSE;
     int mid;
     void *tmp; /* shut up, gcc! */
 
     if (IsMaster(dev))
-        return FALSE;
+        return is_xtst;
 
     tmp = dixLookupPrivate(&dev->devPrivates, XTstDevicePrivateKey);
     mid = (int)tmp;
 
-    return (!master || mid == master->id);
+    /* deviceid 0 is reserved for XIAllDevices, non-zero mid means xtst
+     * device */
+    if ((!master && mid) ||
+        (master && mid == master->id))
+        is_xtst = TRUE;
+
+    return is_xtst;
 }
 
 /**
commit 3525d140567e0ad5f0184e4b37893c47239e1628
Author: Felix Kuehling <felix.kuehling at amd.com>
Date:   Tue Jun 30 20:07:30 2009 -0400

    Export symbols needed by the RandR implementation in fglrx
    
    GIT change
    http://cgit.freedesktop.org/xorg/xserver/commit/?id=45c8bd0fe54273039fdaa1eeeafb81b5774f2c75
    changed the default symbol visibility of the Xserver. As a result 2 symbols
    that are needed by the RandR 1.2/1.3 implementation in the fglrx driver are no
    longer visible:
    
    xf86configptr
    xf86CursorScreenKey
    
    We would like to get these two symbols _X_EXPORT'ed before Xserver 1.7 is
    released. Otherwise it will be problematic for fglrx to support RandR 1.3 on
    Xserver 1.7.
    
    In the future, we may want to sync our RandR implementation to later versions
    of the RandR implementation in hw/xfree86/modes. Therefore it would be nice if
    all symbols used by the Xserver RandR implementation were _X_EXPORT'ed in the
    future.

diff --git a/hw/xfree86/common/xf86Config.h b/hw/xfree86/common/xf86Config.h
index a174e46..5318894 100644
--- a/hw/xfree86/common/xf86Config.h
+++ b/hw/xfree86/common/xf86Config.h
@@ -41,7 +41,7 @@
 /*
  * global structure that holds the result of parsing the config file
  */
-extern XF86ConfigPtr xf86configptr;
+extern _X_EXPORT XF86ConfigPtr xf86configptr;
 #endif
 
 typedef enum _ConfigStatus {
diff --git a/hw/xfree86/common/xf86Globals.c b/hw/xfree86/common/xf86Globals.c
index a14f20c..7bcbc94 100644
--- a/hw/xfree86/common/xf86Globals.c
+++ b/hw/xfree86/common/xf86Globals.c
@@ -43,6 +43,7 @@
 #include "xf86Parser.h"
 #include "xf86Xinput.h"
 #include "xf86InPriv.h"
+#include "xf86Config.h"
 
 /* Globals that video drivers may access */
 
diff --git a/hw/xfree86/ramdac/xf86CursorPriv.h b/hw/xfree86/ramdac/xf86CursorPriv.h
index f82be2e..32be9c2 100644
--- a/hw/xfree86/ramdac/xf86CursorPriv.h
+++ b/hw/xfree86/ramdac/xf86CursorPriv.h
@@ -45,6 +45,6 @@ Bool xf86InitHardwareCursor(ScreenPtr pScreen, xf86CursorInfoPtr infoPtr);
 
 CARD32 xf86ReverseBitOrder(CARD32 data);
 
-extern DevPrivateKey xf86CursorScreenKey;
+extern _X_EXPORT DevPrivateKey xf86CursorScreenKey;
 
 #endif /* _XF86CURSORPRIV_H */
commit e13605ea40cfc671314a0086c75b917564298b55
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 23 14:09:22 2009 +1000

    dix: introduce "Xtst Device" label property.
    
    Xtst devices get this property assigned automatically so they can be
    detected easily by a client.
    The property is read-only.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c
index 396061f..55f20c4 100644
--- a/Xi/xiproperty.c
+++ b/Xi/xiproperty.c
@@ -51,6 +51,7 @@ static struct dev_properties
     char *name;
 } dev_properties[] = {
     {0, XI_PROP_ENABLED},
+    {0, XI_PROP_XTST_DEVICE},
     {0, XATOM_FLOAT},
     {0, ACCEL_PROP_PROFILE_NUMBER},
     {0, ACCEL_PROP_CONSTANT_DECELERATION},
diff --git a/dix/devices.c b/dix/devices.c
index b7f2192..a99d046 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -2563,6 +2563,19 @@ AllocDevicePair (ClientPtr client, char* name,
 }
 
 /**
+ * Don't allow changing the Xtst property.
+ */
+static int
+DeviceSetXtstProperty(DeviceIntPtr dev, Atom property,
+                      XIPropertyValuePtr prop, BOOL checkonly)
+{
+    if (property == XIGetKnownProperty(XI_PROP_XTST_DEVICE))
+        return BadAccess;
+
+    return Success;
+}
+
+/**
  * Allocate a device pair that is initialised as a slave
  * device with properties that identify the devices as belonging
  * to XTest subsystem.
@@ -2576,6 +2589,7 @@ int AllocXtstDevice (ClientPtr client, char* name,
     int retval;
     int len = strlen(name);
     char *xtstname = xcalloc(len + 6, 1 );
+    char dummy = 1;
 
     strncpy( xtstname, name, len);
     strncat( xtstname, " Xtst", 5 );
@@ -2588,6 +2602,17 @@ int AllocXtstDevice (ClientPtr client, char* name,
 
     xfree( xtstname );
 
+    XIChangeDeviceProperty(*ptr, XIGetKnownProperty(XI_PROP_XTST_DEVICE),
+                           XA_INTEGER, 8, PropModeReplace, 1, &dummy,
+                           FALSE);
+    XISetDevicePropertyDeletable(*ptr, XIGetKnownProperty(XI_PROP_XTST_DEVICE), FALSE);
+    XIRegisterPropertyHandler(*ptr, DeviceSetXtstProperty, NULL, NULL);
+    XIChangeDeviceProperty(*keybd, XIGetKnownProperty(XI_PROP_XTST_DEVICE),
+                           XA_INTEGER, 8, PropModeReplace, 1, &dummy,
+                           FALSE);
+    XISetDevicePropertyDeletable(*keybd, XIGetKnownProperty(XI_PROP_XTST_DEVICE), FALSE);
+    XIRegisterPropertyHandler(*keybd, DeviceSetXtstProperty, NULL, NULL);
+
     return retval;
 }
 
diff --git a/include/xserver-properties.h b/include/xserver-properties.h
index 9b3b7bf..0f18dbc 100644
--- a/include/xserver-properties.h
+++ b/include/xserver-properties.h
@@ -32,6 +32,8 @@
 
 /* BOOL. 0 - device disabled, 1 - device enabled */
 #define XI_PROP_ENABLED      "Device Enabled"
+/* BOOL. If present, device is a virtual Xtst device */
+#define XI_PROP_XTST_DEVICE  "Xtst Device"
 
 /* Pointer acceleration properties */
 /* INTEGER of any format */
commit 0814f511d56a89c7b1868b17eba7a89f990b9ab1
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 23 10:50:52 2009 +1000

    input: store the master device's ID in the devPrivate for XTest devices.
    
    Rather than storing a simple boolean in the devPrivate for XTest devices,
    store the actual master device's id (since it is constant for the life of
    the device anyway).
    
    Callers should use GetXtstDevice now instead of digging around in the
    devPrivates themselves.
    
    This patch allows for a cleanup in the creation of new master devices since
    GetMaster and GetXtstDevice spare the need for loops, IsPointer checks and
    similar.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Acked-by: Benjamin Close <Benjamin.Close at clearchain.com>

diff --git a/Xext/xtest.c b/Xext/xtest.c
index 32abe2a..4f5c527 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -56,7 +56,6 @@
 
 extern int DeviceValuator;
 extern int DeviceMotionNotify;
-extern DevPrivateKey XTstDevicePrivateKey;
 
 #ifdef PANORAMIX
 #include "panoramiX.h"
@@ -299,14 +298,7 @@ ProcXTestFakeInput(ClientPtr client)
                 return BadValue;
         }
 
-        /* When faking core events through XTest, we always fake through the
-         * virtual test device.
-         */
-        for(it = inputInfo.devices; it ; it = it->next )
-            if( !IsMaster(it) && it->u.master == dev &&
-                    dixLookupPrivate(&it->devPrivates, XTstDevicePrivateKey ))
-                break;
-        dev= it;
+        dev = GetXtstDevice(dev);
     }
 
     /* If the event has a time set, wait for it to pass */
diff --git a/Xi/xichangehierarchy.c b/Xi/xichangehierarchy.c
index 137c209..656515b 100644
--- a/Xi/xichangehierarchy.c
+++ b/Xi/xichangehierarchy.c
@@ -186,8 +186,9 @@ ProcXIChangeHierarchy(ClientPtr client)
                     if (!c->send_core)
                         ptr->coreEvents = keybd->coreEvents =  FALSE;
 
-		    /* Allocate virtual slave devices for xtest events */
-                    rc = AllocXtstDevice(client, name, &xtstptr, &xtstkeybd);
+                    /* Allocate virtual slave devices for xtest events */
+                    rc = AllocXtstDevice(client, name, &xtstptr, &xtstkeybd,
+                                         ptr, keybd);
                     if (rc != Success)
                     {
 
@@ -231,7 +232,6 @@ ProcXIChangeHierarchy(ClientPtr client)
             case XIRemoveMaster:
                 {
                     xXIRemoveMasterInfo* r = (xXIRemoveMasterInfo*)any;
-                    DeviceIntPtr xtstdevice;
 
                     if (r->return_mode != XIAttachToMaster &&
                             r->return_mode != XIFloating)
@@ -257,69 +257,33 @@ ProcXIChangeHierarchy(ClientPtr client)
                         goto unwind;
                     }
 
-                    for(xtstdevice = inputInfo.devices; xtstdevice ; xtstdevice = xtstdevice->next )
-                        if (IsXtstDevice(xtstdevice, ptr))
-                            break;
 
-                    rc = dixLookupDevice(&xtstptr, xtstdevice->id, client,
+                    ptr = GetMaster(ptr, MASTER_POINTER);
+                    rc = dixLookupDevice(&ptr,
+                                         ptr->id,
+                                         client,
+                                         DixDestroyAccess);
+                    if (rc != Success)
+                        goto unwind;
+                    keybd = GetMaster(ptr, MASTER_KEYBOARD);
+                    rc = dixLookupDevice(&keybd,
+                                         keybd->id,
+                                         client,
                                          DixDestroyAccess);
                     if (rc != Success)
                         goto unwind;
 
-                    /* find keyboards to destroy */
-                    if (IsPointerDevice(ptr))
-                    {
-                        rc = dixLookupDevice(&keybd,
-                                             ptr->spriteInfo->paired->id,
-                                             client,
-                                             DixDestroyAccess);
-                        if (rc != Success)
-                            goto unwind;
-
-                    }
-                    else
-                    {
-                        keybd = ptr;
-                        rc = dixLookupDevice(&ptr,
-                                             keybd->spriteInfo->paired->id,
-                                             client,
-                                             DixDestroyAccess);
-                        if (rc != Success)
-                            goto unwind;
-
-                    }
-
-                    /* handle xtst pointer / keyboard slave devices */
-                    if ( IsPointerDevice(xtstptr))
-                    {
-                        /* Search the matching keyboard */
-                        for(xtstdevice = inputInfo.devices; xtstdevice ; xtstdevice = xtstdevice->next )
-                            if(IsKeyboardDevice(xtstdevice) && IsXtstDevice(xtstdevice, keybd))
-                                break;
-
-                        rc = dixLookupDevice(&xtstkeybd,
-                                             xtstdevice->id,
-                                             client,
-                                             DixDestroyAccess);
-
-                        if (rc != Success)
-                            goto unwind;
-                    }
-                    else
-                    {
-                        xtstkeybd = xtstptr;
-                        /* Search the matching pointer */
-                        for(xtstdevice = inputInfo.devices; xtstdevice ; xtstdevice = xtstdevice->next )
-                            if(IsPointerDevice(xtstdevice) && IsXtstDevice(xtstdevice, ptr))
-                                break;
-                        rc = dixLookupDevice(&xtstptr,
-                                             xtstdevice->id,
-                                             client,
-                                             DixDestroyAccess);
+                    xtstptr = GetXtstDevice(ptr);
+                    rc = dixLookupDevice(&xtstptr, xtstptr->id, client,
+                                         DixDestroyAccess);
+                    if (rc != Success)
+                        goto unwind;
 
-                        if (rc != Success)
-                            goto unwind;
-                    }
+                    xtstkeybd = GetXtstDevice(keybd);
+                    rc = dixLookupDevice(&xtstkeybd, xtstkeybd->id, client,
+                                         DixDestroyAccess);
+                    if (rc != Success)
+                        goto unwind;
 
                     /* Disabling sends the devices floating, reattach them if
                      * desired. */
diff --git a/dix/devices.c b/dix/devices.c
index 2d77657..b7f2192 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -639,8 +639,8 @@ InitCoreDevices(void)
       is a slave device to inputInfo master devices
      */
     if(AllocXtstDevice(serverClient, "Virtual core",
-                       &vxtstpointer,
-                       &vxtstkeyboard) != Success)
+                       &vxtstpointer, &vxtstkeyboard,
+                       inputInfo.pointer, inputInfo.keyboard) != Success)
         FatalError("Failed to allocate XTst devices");
 
     if (ActivateDevice(vxtstpointer, TRUE) != Success ||
@@ -2570,7 +2570,8 @@ AllocDevicePair (ClientPtr client, char* name,
  * still need to be called.
  */
 int AllocXtstDevice (ClientPtr client, char* name,
-		 DeviceIntPtr* ptr, DeviceIntPtr* keybd)
+                     DeviceIntPtr* ptr, DeviceIntPtr* keybd,
+                     DeviceIntPtr master_ptr, DeviceIntPtr master_keybd)
 {
     int retval;
     int len = strlen(name);
@@ -2581,8 +2582,8 @@ int AllocXtstDevice (ClientPtr client, char* name,
 
     retval = AllocDevicePair( client, xtstname, ptr, keybd, FALSE);
     if ( retval == Success ){
-	dixSetPrivate(&((*ptr)->devPrivates), XTstDevicePrivateKey, (void *)True );
-	dixSetPrivate(&((*keybd)->devPrivates), XTstDevicePrivateKey,(void *)True);
+        dixSetPrivate(&((*ptr)->devPrivates), XTstDevicePrivateKey, (void *)master_ptr->id);
+        dixSetPrivate(&((*keybd)->devPrivates), XTstDevicePrivateKey, (void *)master_keybd->id);
     }
 
     xfree( xtstname );
@@ -2599,6 +2600,33 @@ int AllocXtstDevice (ClientPtr client, char* name,
 BOOL
 IsXtstDevice(DeviceIntPtr dev, DeviceIntPtr master)
 {
-    return (!IsMaster(dev) && (!master || dev->u.master == master) &&
-           ( dixLookupPrivate(&dev->devPrivates, XTstDevicePrivateKey) != NULL));
+    int mid;
+    void *tmp; /* shut up, gcc! */
+
+    if (IsMaster(dev))
+        return FALSE;
+
+    tmp = dixLookupPrivate(&dev->devPrivates, XTstDevicePrivateKey);
+    mid = (int)tmp;
+
+    return (!master || mid == master->id);
 }
+
+/**
+ * @return The X Test virtual device for the given master.
+ */
+DeviceIntPtr
+GetXtstDevice(DeviceIntPtr master)
+{
+    DeviceIntPtr it;
+
+    for (it = inputInfo.devices; it; it = it->next)
+    {
+        if (IsXtstDevice(it, master))
+            return it;
+    }
+
+    /* This only happens if master is a slave device. don't do that */
+    return NULL;
+}
+
diff --git a/include/input.h b/include/input.h
index 1dfbbff..40ba660 100644
--- a/include/input.h
+++ b/include/input.h
@@ -496,8 +496,11 @@ extern int change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *map,
 extern int AllocXtstDevice(ClientPtr client,
                              char* name,
                              DeviceIntPtr* ptr,
-                             DeviceIntPtr* keybd);
+                             DeviceIntPtr* keybd,
+                             DeviceIntPtr master_ptr,
+                             DeviceIntPtr master_keybd);
 extern BOOL IsXtstDevice(DeviceIntPtr dev, DeviceIntPtr master);
+extern DeviceIntPtr GetXtstDevice(DeviceIntPtr master);
 
 /* misc event helpers */
 extern Mask GetEventFilter(DeviceIntPtr dev, xEvent *event);
commit 1bcc0d3c244ce7d9f5cbab626aa5fd5784b41a1c
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 22 16:55:12 2009 +1000

    input: abstract Xtst device lookup
    
    The callers should need to use the dev privates key to look up xtest
    devices.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Acked-by: Benjamin Close <Benjamin.Close at clearchain.com>

diff --git a/Xi/xichangehierarchy.c b/Xi/xichangehierarchy.c
index 917a0d7..137c209 100644
--- a/Xi/xichangehierarchy.c
+++ b/Xi/xichangehierarchy.c
@@ -54,8 +54,6 @@
 
 #include "xichangehierarchy.h"
 
-extern DevPrivateKey XTstDevicePrivateKey;
-
 /**
  * Send the current state of the device hierarchy to all clients.
  */
@@ -260,8 +258,7 @@ ProcXIChangeHierarchy(ClientPtr client)
                     }
 
                     for(xtstdevice = inputInfo.devices; xtstdevice ; xtstdevice = xtstdevice->next )
-                        if( !IsMaster(xtstdevice) && xtstdevice->u.master == ptr &&
-                            dixLookupPrivate(&xtstdevice->devPrivates, XTstDevicePrivateKey ))
+                        if (IsXtstDevice(xtstdevice, ptr))
                             break;
 
                     rc = dixLookupDevice(&xtstptr, xtstdevice->id, client,
@@ -297,10 +294,7 @@ ProcXIChangeHierarchy(ClientPtr client)
                     {
                         /* Search the matching keyboard */
                         for(xtstdevice = inputInfo.devices; xtstdevice ; xtstdevice = xtstdevice->next )
-                            if( !IsMaster(xtstdevice) &&
-                                xtstdevice->u.master == keybd &&
-                                IsKeyboardDevice(xtstdevice) &&
-                                dixLookupPrivate(&xtstdevice->devPrivates, XTstDevicePrivateKey ))
+                            if(IsKeyboardDevice(xtstdevice) && IsXtstDevice(xtstdevice, keybd))
                                 break;
 
                         rc = dixLookupDevice(&xtstkeybd,
@@ -316,11 +310,7 @@ ProcXIChangeHierarchy(ClientPtr client)
                         xtstkeybd = xtstptr;
                         /* Search the matching pointer */
                         for(xtstdevice = inputInfo.devices; xtstdevice ; xtstdevice = xtstdevice->next )
-                            if( !IsMaster(xtstdevice) &&
-                                xtstdevice->u.master == ptr &&
-                                IsPointerDevice(xtstdevice) &&
-                                dixLookupPrivate(&xtstdevice->devPrivates, XTstDevicePrivateKey )
-                              )
+                            if(IsPointerDevice(xtstdevice) && IsXtstDevice(xtstdevice, ptr))
                                 break;
                         rc = dixLookupDevice(&xtstptr,
                                              xtstdevice->id,
@@ -412,7 +402,6 @@ ProcXIChangeHierarchy(ClientPtr client)
             case XIDetachSlave:
                 {
                     xXIDetachSlaveInfo* c = (xXIDetachSlaveInfo*)any;
-                    DeviceIntPtr *xtstdevice;
 
                     rc = dixLookupDevice(&ptr, c->deviceid, client,
                                           DixManageAccess);
@@ -426,11 +415,8 @@ ProcXIChangeHierarchy(ClientPtr client)
                         goto unwind;
                     }
 
-                    xtstdevice = dixLookupPrivate( &ptr->devPrivates,
-                                                   XTstDevicePrivateKey );
-
                     /* Don't allow changes to Xtst Devices, these are fixed */
-                    if( xtstdevice )
+                    if (IsXtstDevice(ptr, NULL))
                     {
                         client->errorValue = c->deviceid;
                         rc = BadDevice;
@@ -445,7 +431,6 @@ ProcXIChangeHierarchy(ClientPtr client)
                 {
                     xXIAttachSlaveInfo* c = (xXIAttachSlaveInfo*)any;
                     DeviceIntPtr newmaster;
-                    DeviceIntPtr *xtstdevice;
 
                     rc = dixLookupDevice(&ptr, c->deviceid, client,
                                           DixManageAccess);
@@ -459,11 +444,8 @@ ProcXIChangeHierarchy(ClientPtr client)
                         goto unwind;
                     }
 
-                    xtstdevice = dixLookupPrivate( &ptr->devPrivates,
-                                                   XTstDevicePrivateKey );
-
                     /* Don't allow changes to Xtst Devices, these are fixed */
-                    if( xtstdevice )
+                    if (IsXtstDevice(ptr, NULL))
                     {
                         client->errorValue = c->deviceid;
                         rc = BadDevice;
diff --git a/dix/devices.c b/dix/devices.c
index b237e03..2d77657 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -2589,3 +2589,16 @@ int AllocXtstDevice (ClientPtr client, char* name,
 
     return retval;
 }
+
+/**
+ * If master is NULL, return TRUE if the given device is an xtest device or
+ * FALSE otherwise.
+ * If master is not NULL, return TRUE if the given device is this master's
+ * xtest device.
+ */
+BOOL
+IsXtstDevice(DeviceIntPtr dev, DeviceIntPtr master)
+{
+    return (!IsMaster(dev) && (!master || dev->u.master == master) &&
+           ( dixLookupPrivate(&dev->devPrivates, XTstDevicePrivateKey) != NULL));
+}
diff --git a/include/input.h b/include/input.h
index 9711fa8..1dfbbff 100644
--- a/include/input.h
+++ b/include/input.h
@@ -497,6 +497,7 @@ extern int AllocXtstDevice(ClientPtr client,
                              char* name,
                              DeviceIntPtr* ptr,
                              DeviceIntPtr* keybd);
+extern BOOL IsXtstDevice(DeviceIntPtr dev, DeviceIntPtr master);
 
 /* misc event helpers */
 extern Mask GetEventFilter(DeviceIntPtr dev, xEvent *event);
commit 34424fab9abd7a4ca11036be25414129980db0e0
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 23 11:50:29 2009 +1000

    dix: set the client's error value to the bad deviceid in check_butmap_change.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/inpututils.c b/dix/inpututils.c
index 8194e69..378deb0 100644
--- a/dix/inpututils.c
+++ b/dix/inpututils.c
@@ -45,11 +45,17 @@ check_butmap_change(DeviceIntPtr dev, CARD8 *map, int len, CARD32 *errval_out,
     int i, ret;
 
     if (!dev || !dev->button)
+    {
+        client->errorValue = (dev) ? dev->id : 0;
         return BadDevice;
+    }
 
     ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
     if (ret != Success)
+    {
+        client->errorValue = dev->id;
         return ret;
+    }
 
     for (i = 0; i < len; i++) {
         if (dev->button->map[i + 1] != map[i] && dev->button->down[i + 1])
commit da04e8f1354fa9d253443489dc002b16f94d6fab
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Tue Jun 30 17:52:42 2009 -0400

    dix/property.c: use memcpy where appropriate.
    
    Signed-off-by: Eamon Walsh <ewalsh at tycho.nsa.gov>

diff --git a/dix/property.c b/dix/property.c
index 9aaf248..d63b8f4 100644
--- a/dix/property.c
+++ b/dix/property.c
@@ -255,7 +255,7 @@ dixChangeWindowProperty(ClientPtr pClient, WindowPtr pWin, Atom property,
     PropertyPtr pProp;
     PropertyRec savedProp;
     int sizeInBytes, totalSize, rc;
-    pointer data;
+    unsigned char *data;
     Mask access_mode;
 
     sizeInBytes = format>>3;
@@ -278,12 +278,11 @@ dixChangeWindowProperty(ClientPtr pClient, WindowPtr pWin, Atom property,
 	    xfree(pProp);
 	    return(BadAlloc);
 	}
+        memcpy(data, value, totalSize);
         pProp->propertyName = property;
         pProp->type = type;
         pProp->format = format;
         pProp->data = data;
-	if (len)
-	    memmove((char *)data, (char *)value, totalSize);
 	pProp->size = len;
 	pProp->devPrivates = NULL;
 	rc = XaceHookPropertyAccess(pClient, pWin, &pProp,
@@ -317,9 +316,8 @@ dixChangeWindowProperty(ClientPtr pClient, WindowPtr pWin, Atom property,
 	    data = xalloc(totalSize);
 	    if (!data && len)
 		return(BadAlloc);
+	    memcpy(data, value, totalSize);
 	    pProp->data = data;
-	    if (len)
-		memmove((char *)pProp->data, (char *)value, totalSize);
 	    pProp->size = len;
     	    pProp->type = type;
 	    pProp->format = format;
@@ -334,10 +332,8 @@ dixChangeWindowProperty(ClientPtr pClient, WindowPtr pWin, Atom property,
 	    if (!data)
 		return(BadAlloc);
 	    memcpy(data, pProp->data, pProp->size * sizeInBytes);
+	    memcpy(data + pProp->size * sizeInBytes, value, totalSize);
             pProp->data = data;
-	    memmove(&((char *)data)[pProp->size * sizeInBytes], 
-		    (char *)value,
-		  totalSize);
             pProp->size += len;
 	}
         else if (mode == PropModePrepend)
@@ -345,9 +341,8 @@ dixChangeWindowProperty(ClientPtr pClient, WindowPtr pWin, Atom property,
             data = xalloc(sizeInBytes * (len + pProp->size));
 	    if (!data)
 		return(BadAlloc);
-	    memmove(&((char *)data)[totalSize], (char *)pProp->data, 
-		  (int)(pProp->size * sizeInBytes));
-            memmove((char *)data, (char *)value, totalSize);
+            memcpy(data + totalSize, pProp->data, pProp->size * sizeInBytes);
+            memcpy(data, value, totalSize);
             pProp->data = data;
             pProp->size += len;
 	}
commit 65d74d93145d22b68bad5728a7ebe38dc662cb21
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Wed May 20 21:32:54 2009 +0100

    Cygwin/X: Fix multiwindow extwm mode to build again
    
    Build and link with rootless extension
    Update Xwin code for removal of RootlessAccelInit()
    Fix Xwin code which now has a collision with the type name EventType
    
    Based on patches from Colin Harrison, Jon Turney and Yaakov Selkowitz
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/configure.ac b/configure.ac
index 0fca440..150ecd2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1617,6 +1617,7 @@ fi
 AC_MSG_RESULT([$XWIN])
 
 if test "x$XWIN" = xyes; then
+	PKG_CHECK_EXISTS([windowswmproto], [WINDOWSWM=yes], [WINDOWSWM=no])
 	AC_DEFINE_UNQUOTED(XORG_VERSION_CURRENT, [$VENDOR_RELEASE], [Current Xorg version])
 	AC_CHECK_TOOL(WINDRES, windres)
 	case $host_os in
@@ -1625,7 +1626,7 @@ if test "x$XWIN" = xyes; then
 			PKG_CHECK_MODULES([XWINMODULES],[x11 xdmcp xau xfont])
 			AC_DEFINE(HAS_DEVWINDOWS,1,[Cygwin has /dev/windows for signaling new win32 messages])
 			AC_DEFINE(ROOTLESS,1,[Build Rootless code])
-			CFLAGS="$CFLAGS -DFD_SETSIZE=256"
+			CFLAGS="$CFLAGS -DFD_SETSIZE=256 -DROOTLESS_WORKAROUND"
 			;;
 		mingw*)
 			XWIN_SERVER_NAME=Xming
@@ -1658,7 +1659,7 @@ if test "x$XWIN" = xyes; then
 fi
 AM_CONDITIONAL(XWIN, [test "x$XWIN" = xyes])
 AM_CONDITIONAL(XWIN_MULTIWINDOW, [test "x$XWIN" = xyes])
-AM_CONDITIONAL(XWIN_MULTIWINDOWEXTWM, [test "x$XWIN" = xyes && false])
+AM_CONDITIONAL(XWIN_MULTIWINDOWEXTWM, [test "x$XWIN" = xyes && test "x$WINDOWSWM" = xyes])
 AM_CONDITIONAL(XWIN_CLIPBOARD, [test "x$XWIN" = xyes])
 AM_CONDITIONAL(XWIN_GLX_WINDOWS, [test "x$XWIN" = xyes && false])
 AM_CONDITIONAL(XWIN_NATIVEGDI, [test "x$XWIN" = xyes && false])
diff --git a/hw/xwin/Makefile.am b/hw/xwin/Makefile.am
index aab4b08..2c7972a 100644
--- a/hw/xwin/Makefile.am
+++ b/hw/xwin/Makefile.am
@@ -34,6 +34,7 @@ SRCS_MULTIWINDOWEXTWM = \
 	winwin32rootlesswndproc.c \
 	winwindowswm.c
 DEFS_MULTIWINDOWEXTWM = -DXWIN_MULTIWINDOWEXTWM
+MULTIWINDOWEXTWM_LIBS = $(top_builddir)/miext/rootless/librootless.la
 endif
 
 if XWIN_NATIVEGDI
@@ -147,7 +148,7 @@ XWin_SOURCES = $(SRCS)
 INCLUDES = -I$(top_srcdir)/miext/rootless
 
 XWin_DEPENDENCIES = $(XWIN_LIBS)
-XWin_LDADD = $(XWIN_LIBS) $(MAIN_LIB) $(XSERVER_LIBS) $(XSERVER_SYS_LIBS) $(XWIN_SYS_LIBS)
+XWin_LDADD = $(MULTIWINDOWEXTWM_LIBS) $(XWIN_LIBS) $(MAIN_LIB) $(XSERVER_LIBS) $(XSERVER_SYS_LIBS) $(XWIN_SYS_LIBS)
 
 .rc.o:
 	$(WINDRES) --use-temp-file -i $< --input-format=rc -o $@ -O coff -DPROJECT_NAME=\"$(VENDOR_NAME_SHORT)\"
diff --git a/hw/xwin/winmultiwindowwm.c b/hw/xwin/winmultiwindowwm.c
index 194dbf6..7421379 100644
--- a/hw/xwin/winmultiwindowwm.c
+++ b/hw/xwin/winmultiwindowwm.c
@@ -57,7 +57,7 @@
 #include "ddraw.h"
 #include "winwindow.h"
 #ifdef XWIN_MULTIWINDOWEXTWM
-#include "windowswmstr.h"
+#include <X11/extensions/windowswmstr.h>
 #else
 /* We need the native HWND atom for intWM, so for consistency use the
    same name as extWM would if we were building with enabled... */
diff --git a/hw/xwin/winscrinit.c b/hw/xwin/winscrinit.c
index 96778ab..eab0c6c 100644
--- a/hw/xwin/winscrinit.c
+++ b/hw/xwin/winscrinit.c
@@ -378,22 +378,6 @@ winFinishScreenInitFB (int index,
   pScreen->blockData = pScreen;
   pScreen->wakeupData = pScreen;
 
-#ifdef XWIN_MULTIWINDOWEXTWM
-  /*
-   * Setup acceleration for multi-window external window manager mode.
-   * To be compatible with the Damage extension, this must be done
-   * before calling miDCInitialize, which calls DamageSetup.
-   */
-  if (pScreenInfo->fMWExtWM)
-    {
-      if (!RootlessAccelInit (pScreen))
-        {
-          ErrorF ("winFinishScreenInitFB - RootlessAccelInit () failed\n");
-          return FALSE;
-        }
-    }
-#endif
-
 #ifdef RENDER
   /* Render extension initialization, calls miPictureInit */
   if (!fbPictureInit (pScreen, NULL, 0))
diff --git a/hw/xwin/winwindowswm.c b/hw/xwin/winwindowswm.c
index 2eecd6b..61972c9 100755
--- a/hw/xwin/winwindowswm.c
+++ b/hw/xwin/winwindowswm.c
@@ -50,7 +50,7 @@ static DISPATCH_PROC(SProcWindowsWMDispatch);
 static unsigned char WMReqCode = 0;
 static int WMEventBase = 0;
 
-static RESTYPE ClientType, EventType; /* resource types for event masks */
+static RESTYPE ClientType, eventResourceType; /* resource types for event masks */
 static XID eventResource;
 
 /* Currently selected events */
@@ -85,10 +85,10 @@ winWindowsWMExtensionInit ()
   ExtensionEntry* extEntry;
 
   ClientType = CreateNewResourceType(WMFreeClient);
-  EventType = CreateNewResourceType(WMFreeEvents);
+  eventResourceType = CreateNewResourceType(WMFreeEvents);
   eventResource = FakeClientID(0);
 
-  if (ClientType && EventType &&
+  if (ClientType && eventResourceType &&
       (extEntry = AddExtension(WINDOWSWMNAME,
 			       WindowsWMNumberEvents,
 			       WindowsWMNumberErrors,
@@ -147,7 +147,7 @@ WMFreeClient (pointer data, XID id)
   WMEventPtr   *pHead, pCur, pPrev;
 
   pEvent = (WMEventPtr) data;
-  pHead = (WMEventPtr *) LookupIDByType(eventResource, EventType);
+  pHead = (WMEventPtr *) LookupIDByType(eventResource, eventResourceType);
   if (pHead)
     {
       pPrev = 0;
@@ -193,7 +193,7 @@ ProcWindowsWMSelectInput (register ClientPtr client)
 
   REQUEST_SIZE_MATCH (xWindowsWMSelectInputReq);
   pHead = (WMEventPtr *)SecurityLookupIDByType(client, eventResource,
-					       EventType, DixWriteAccess);
+					       eventResourceType, DixWriteAccess);
   if (stuff->mask != 0)
     {
       if (pHead)
@@ -235,7 +235,7 @@ ProcWindowsWMSelectInput (register ClientPtr client)
 	{
 	  pHead = (WMEventPtr *) xalloc (sizeof (WMEventPtr));
 	  if (!pHead ||
-	      !AddResource (eventResource, EventType, (pointer)pHead))
+	      !AddResource (eventResource, eventResourceType, (pointer)pHead))
 	    {
 	      FreeResource (clientResource, RT_NONE);
 	      return BadAlloc;
@@ -293,7 +293,7 @@ winWindowsWMSendEvent (int type, unsigned int mask, int which, int arg,
   ErrorF ("winWindowsWMSendEvent %d %d %d %d,  %d %d - %d %d\n",
 	  type, mask, which, arg, x, y, w, h);
 #endif
-  pHead = (WMEventPtr *) LookupIDByType(eventResource, EventType);
+  pHead = (WMEventPtr *) LookupIDByType(eventResource, eventResourceType);
   if (!pHead)
     return;
   for (pEvent = *pHead; pEvent; pEvent = pEvent->next)
diff --git a/miext/Makefile.am b/miext/Makefile.am
index f138963..73a6577 100644
--- a/miext/Makefile.am
+++ b/miext/Makefile.am
@@ -5,4 +5,7 @@ endif
 if XQUARTZ
 SUBDIRS += rootless
 endif
+if XWIN
+SUBDIRS += rootless
+endif
 DIST_SUBDIRS = damage shadow cw rootless
commit 638ca9a7a2363757dc5b5d456e10d34f6f158885
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Mon May 18 18:14:41 2009 +0100

    Cygwin/X: Avoid a visual glitch on window move in rootless modes
    
    Handle and ignore WM_ERASEBKGND since we repaint the entire invalidated region anyhow
    (this avoids a white flickering on window resize)
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/winmultiwindowwndproc.c b/hw/xwin/winmultiwindowwndproc.c
index bd9edcb..3138229 100644
--- a/hw/xwin/winmultiwindowwndproc.c
+++ b/hw/xwin/winmultiwindowwndproc.c
@@ -453,6 +453,14 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
       HandleCustomWM_INITMENU ((unsigned long)hwnd, wParam);
       break;
 
+    case WM_ERASEBKGND:
+      /*
+       * Pretend that we did erase the background but we don't care,
+       * since we repaint the entire region anyhow
+       * This avoids some flickering when resizing.
+       */
+      return TRUE;
+
     case WM_PAINT:
       /* Only paint if our window handle is valid */
       if (hwndScreen == NULL)
diff --git a/hw/xwin/winwin32rootlesswndproc.c b/hw/xwin/winwin32rootlesswndproc.c
index e624ded..4d7afee 100755
--- a/hw/xwin/winwin32rootlesswndproc.c
+++ b/hw/xwin/winwin32rootlesswndproc.c
@@ -783,6 +783,17 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
       SendMessage (hwndScreen, message, wParam, lParam);
       return 0;
 
+    case WM_ERASEBKGND:
+#if CYGDEBUG
+      winDebug ("winMWExtWMWindowProc - WM_ERASEBKGND\n");
+#endif
+      /*
+       * Pretend that we did erase the background but we don't care,
+       * since we repaint the entire region anyhow
+       * This avoids some flickering when resizing.
+       */
+      return TRUE;
+
     case WM_PAINT:
     
       /* BeginPaint gives us an hdc that clips to the invalidated region */
commit b718b2e0880cf2b969675da98d5ef8a4a01ca5d6
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Mon May 18 18:14:09 2009 +0100

    Cygwin/X: Allow pointer warping to work in rootless modes
    
    Mouse pointer warping in multiwindow/rootless mode was never implemented,
    due to concerns that moving the mouse pointer without asking might be rude
    
    This patch allows X applications to move the mouse pointer in rootless modes,
    Let's hope they don't abuse this privilege ;-)
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/wincursor.c b/hw/xwin/wincursor.c
index 9525608..bda057b 100644
--- a/hw/xwin/wincursor.c
+++ b/hw/xwin/wincursor.c
@@ -95,8 +95,16 @@ winPointerWarpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
       return;
     }
 
-  /* Only update the Windows cursor position if we are active */
-  if (pScreenPriv->hwndScreen == GetForegroundWindow ())
+  /*
+     Only update the Windows cursor position if root window is active,
+     or we are in a rootless mode
+  */
+  if ((pScreenPriv->hwndScreen == GetForegroundWindow ())
+      || pScreenPriv->pScreenInfo->fRootless
+#ifdef XWIN_MULTIWINDOW
+      || pScreenPriv->pScreenInfo->fMultiWindow
+#endif
+      )
     {
       /* Get the client area coordinates */
       GetClientRect (pScreenPriv->hwndScreen, &rcClient);
commit 85614946ba3d5a233eece612afc7f09572a347c2
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Mon May 18 18:13:08 2009 +0100

    Cygwin/X: Improve mouse tracking for moving/resizing undecorated windows
    
    In -multiwindow mode, tell Windows we wish to capture the mouse when a button
    is down.  This causes Windows to continue to send movement events for the mouse
    even if the mouse pointer moves outside the window frame.
    
    This helps greatly with undecorated windows which have regions you can grab
    to move (e.g. gmplayer, xine control panels) or resize (e.g. Songbird) the
    window, as it means the window continues to receive the mouse motion even if the
    mouse pointer  moves out of the window (which presumably happens if we don't
    manage to update the window fast enough to track the mouse pointer)
    
    Consolidate the multiple instances of the code to start the mouse position
    polling timer into a new function winStartMousePolling(), and use that to
    restart the polling timer when we release the mouse.
    
    Also, start the timer on WM_SHOW, so that xeyes will track the mouse position
    when it is first shown, even if the mouse doesn't enter it's window
    (You probably need focus-stealing turned off to see this problem)
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/winmultiwindowwndproc.c b/hw/xwin/winmultiwindowwndproc.c
index becae29..bd9edcb 100644
--- a/hw/xwin/winmultiwindowwndproc.c
+++ b/hw/xwin/winmultiwindowwndproc.c
@@ -290,6 +290,20 @@ static void winRaiseWindow(WindowPtr pWin)
   }
 }
 
+static
+void winStartMousePolling(winPrivScreenPtr s_pScreenPriv)
+{
+  /*
+   * Timer to poll mouse position.  This is needed to make
+   * programs like xeyes follow the mouse properly when the
+   * mouse pointer is outside of any X window.
+   */
+  if (g_uipMousePollingTimerID == 0)
+    g_uipMousePollingTimerID = SetTimer (s_pScreenPriv->hwndScreen,
+					 WIN_POLLING_MOUSE_TIMER_ID,
+					 MOUSE_POLLING_INTERVAL,
+					 NULL);
+}
 
 /*
  * winTopLevelWindowProc - Window procedure for all top-level Windows windows.
@@ -565,15 +579,8 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
 	  ShowCursor (TRUE);
 	}
 
-      /*
-       * Timer to poll mouse events.  This is needed to make
-       * programs like xeyes follow the mouse properly.
-       */
-      if (g_uipMousePollingTimerID == 0)
-	g_uipMousePollingTimerID = SetTimer (s_pScreenPriv->hwndScreen,
-					     WIN_POLLING_MOUSE_TIMER_ID,
-					     MOUSE_POLLING_INTERVAL,
-					     NULL);
+      winStartMousePolling(s_pScreenPriv);
+
       break;
 
     case WM_MOUSELEAVE:
@@ -589,15 +596,8 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
 	  ShowCursor (TRUE);
 	}
 
-      /*
-       * Timer to poll mouse events.  This is needed to make
-       * programs like xeyes follow the mouse properly.
-       */
-      if (g_uipMousePollingTimerID == 0)
-	g_uipMousePollingTimerID = SetTimer (s_pScreenPriv->hwndScreen,
-					     WIN_POLLING_MOUSE_TIMER_ID,
-					     MOUSE_POLLING_INTERVAL,
-					     NULL);
+      winStartMousePolling(s_pScreenPriv);
+
       return 0;
 
     case WM_LBUTTONDBLCLK:
@@ -605,12 +605,15 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
       if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
 	break;
       g_fButton[0] = TRUE;
+      SetCapture(hwnd);
       return winMouseButtonsHandle (s_pScreen, ButtonPress, Button1, wParam);
-      
+
     case WM_LBUTTONUP:
       if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
 	break;
       g_fButton[0] = FALSE;
+      ReleaseCapture();
+      winStartMousePolling(s_pScreenPriv);
       return winMouseButtonsHandle (s_pScreen, ButtonRelease, Button1, wParam);
 
     case WM_MBUTTONDBLCLK:
@@ -618,35 +621,45 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
       if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
 	break;
       g_fButton[1] = TRUE;
+      SetCapture(hwnd);
       return winMouseButtonsHandle (s_pScreen, ButtonPress, Button2, wParam);
-      
+
     case WM_MBUTTONUP:
       if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
 	break;
       g_fButton[1] = FALSE;
+      ReleaseCapture();
+      winStartMousePolling(s_pScreenPriv);
       return winMouseButtonsHandle (s_pScreen, ButtonRelease, Button2, wParam);
-      
+
     case WM_RBUTTONDBLCLK:
     case WM_RBUTTONDOWN:
       if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
 	break;
       g_fButton[2] = TRUE;
+      SetCapture(hwnd);
       return winMouseButtonsHandle (s_pScreen, ButtonPress, Button3, wParam);
-      
+
     case WM_RBUTTONUP:
       if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
 	break;
       g_fButton[2] = FALSE;
+      ReleaseCapture();
+      winStartMousePolling(s_pScreenPriv);
       return winMouseButtonsHandle (s_pScreen, ButtonRelease, Button3, wParam);
 
     case WM_XBUTTONDBLCLK:
     case WM_XBUTTONDOWN:
       if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
 	break;
+	SetCapture(hwnd);
       return winMouseButtonsHandle (s_pScreen, ButtonPress, HIWORD(wParam) + 5, wParam);
+
     case WM_XBUTTONUP:
       if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
 	break;
+      ReleaseCapture();
+      winStartMousePolling(s_pScreenPriv);
       return winMouseButtonsHandle (s_pScreen, ButtonRelease, HIWORD(wParam) + 5, wParam);
 
     case WM_MOUSEWHEEL:
@@ -936,6 +949,8 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
       if (fWMMsgInitialized)
 	winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
 
+      winStartMousePolling(s_pScreenPriv);
+
       return 0;
 
     case WM_SIZING:
commit f351c10a9774cc0ea2cbb58f00f07ece7f7c6e73
Author: Yaakov Selkowitz <yselkowitz at users.sourceforge.net>
Date:   Mon Jan 5 16:17:30 2009 +0000

    Cygwin/X: Man page fixes
    
    Correct path names in man pages, using cpprules.in
    Install XWinrc man page into section 5
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/Makefile.am b/hw/xwin/Makefile.am
index 0ecb526..aab4b08 100644
--- a/hw/xwin/Makefile.am
+++ b/hw/xwin/Makefile.am
@@ -158,7 +158,7 @@ winprefsyacc.h: winprefsyacc.c
 winprefslex.c: winprefslex.l winprefsyacc.c winprefsyacc.h
 
 BUILT_SOURCES = winprefsyacc.h winprefsyacc.c winprefslex.c
-CLEANFILES = $(BUILT_SOURCES)
+CLEANFILES = $(BUILT_SOURCES) $(appman_DATA) $(fileman_DATA) XWin.man XWinrc.man
 
 AM_YFLAGS = -d
 AM_LFLAGS = -i
@@ -166,15 +166,34 @@ AM_CFLAGS = -DHAVE_XWIN_CONFIG_H $(DIX_CFLAGS) \
             $(XWINMODULES_CFLAGS) \
             -DXFree86Server
 
-dist_man1_MANS = XWin.man XWinrc.man
-
 GLX_EXTRAS = \
 	glx/glwindows.h \
 	glx/glwrap.c \
 	glx/indirect.c
 
+MAN_SRCS = XWin.man.pre XWinrc.man.pre
+
+appmandir = $(APP_MAN_DIR)
+appman_DATA = XWin.$(APP_MAN_SUFFIX)
+
+filemandir = $(FILE_MAN_DIR)
+fileman_DATA = XWinrc.$(FILE_MAN_SUFFIX)
+
+XWin.$(APP_MAN_SUFFIX): XWin.man
+	-rm -f XWin.$(APP_MAN_SUFFIX)
+	$(LN_S) XWin.man XWin.$(APP_MAN_SUFFIX)
+
+XWinrc.$(FILE_MAN_SUFFIX): XWinrc.man
+	-rm -f XWinrc.$(FILE_MAN_SUFFIX)
+	$(LN_S) XWinrc.man XWinrc.$(FILE_MAN_SUFFIX)
+
+EXTRAMANDEFS = -D__logdir__=$(logdir) -D__sysconfdir__=$(sysconfdir) -D__datadir__=$(datadir)
+
+include $(top_srcdir)/cpprules.in
+
 EXTRA_DIST = \
 	$(GLX_EXTRAS) \
+	$(MAN_SRCS) \
 	_usr_X11R6_lib_X11_system.XWinrc \
 	X-boxed.ico \
 	X.ico \
diff --git a/hw/xwin/XWin.man b/hw/xwin/XWin.man
deleted file mode 100644
index 4e70c19..0000000
--- a/hw/xwin/XWin.man
+++ /dev/null
@@ -1,287 +0,0 @@
-.TH XWIN 1 __vendorversion__
-.SH NAME
-XWin \- X Server for the Cygwin environment on Microsoft Windows
-
-
-.SH SYNOPSIS
-.B XWin
-[ options ] ...
-
-
-.SH DESCRIPTION
-.I XWin is an X Server for the X Window System on the Cygwin environment
-running on Microsoft Windows.
-
-
-.SH MODES
-\fIXWin\fP can operate in five different and incompatible modes:
-.br
-* \fISingle Window\fP: This is the default option.  The X server
-appears as a single Windows window and all X windows are contained
-within this window.  This mode requires an external window manager.
-.br
-* \fINo Decoration\fP: This mode is like single window mode except
-that the X server window does not have a title bar or border, thus
-maximizing the amount of space available for X windows within the X
-server window.  This mode requires an external window manager.
-.br
-* \fIFull Screen\fP: This mode is like single window mode except that
-the X server window takes the full screen, covering completely the
-Windows desktop.  This mode requires an external window manager.
-.br
-* \fIRootless\fP: The X server works on a window covering the whole
-screen but the root window (traditionally covered with an X hatch
-pattern) is hidden from view.  This mode requires an external window
-manager.
-.br
-* \fIMulti-Window\fP: In this mode \fIXWin\fP uses its own integrated
-window manager in order to handle the top-level X windows, in such a
-way that they appear as normal Windows windows.
-.PP
-NOTE: \fIMulti-Window\fP mode will crash if an external window manager
-such as \fItwm\fP or \fIfvwm\fP is launched since \fIMulti-Window\fP
-uses its own internal window manager; all other modes require an
-external window manager in order to move, resize, and perform other
-operations on the individual X windows.
-
-
-.SH LOG
-As it runs \fIXWin\fP writes messages indicating the most relevant events
-to  the console
-from which it was called and to a log file that by default is located at
-\fI/tmp/XWin.log\fP.  This file is mainly for debugging purposes.
-
-
-.SH PREFERENCES FILE
-On startup \fIXWin\fP looks for the file \fI$HOME/.XWinrc\fP or, if
-the previous file does not exist,
-\fI/usr/X11R6/lib/X11/system.XWinrc\fP.  \fI.XWinrc\fP allows setting
-preferences for the following:
-.br
-1- To include items into the menu associated with the \fIXWin\fP icon
-which is in the \fIWindows\fP system tray.  This functions in all
-modes that have a tray icon.
-.br
-2- To include items in the menu which is associated with the Windows
-window that \fIXWin -multiwindow\fP produces for each top-level X
-window.  That can be done both for the generic case and for particular
-programs.
-.br
-3- To change the icon that is associated to the Windows window that
-\fIXWin -multiwindow\fP produces for each top-level X-window.  Again,
-that can be done both for the generic case and for particular
-programs.
-.PP
-The format of the \fI.XWinrc\fP file is given in the man page XWinrc(5).
-
-
-.SH OPTIONS
-In addition to the normal server options described in the \fIXserver(1)\fP
-manual page, \fIXWin\fP accepts the following command line switches,
-\fIall\fP of which are optional:
-.TP 8
-.B \-clipboard
-Enables the integration
-between the Cygwin/X clipboard and Windows clipboard.  Do not use in
-conjunction with the \fIxwinclip\fP program.
-.TP 8
-.B "\-clipupdates \fInum_boxes\fP"
-Specify an optional threshold, above which the boxes in a shadow
-update operation will be collected into a GDI clipping region.  The
-clipping region is then used to do a single bit block transfer that is
-constrained to the updated area by the clipping region.  There is some
-overhead involved in creating, installing, destroying, and removing
-the clipping region, thus there may not be much benefit for a small
-number of boxes (less than 10).  It is even possible that this
-functionality does not provide a benefit at any number of boxes; we
-can only determine the usefulness of this feature through testing.
-This parameter works in conjunction with engines 1, 2, and 4 (Shadow
-GDI, Shadow DirectDraw, and Shadow DirectDraw Non-Locking,
-respectively).
-.TP 8
-.B "\-emulate3buttons \fItimeout\fP"
-Emulate a three button mouse; pressing both buttons within
-.I timeout
-milliseconds causes an emulated middle button press.  The default 
-.I timeout
-is 50 milliseconds.  Note that most mice with scroll wheel have middle
-button functionality, usually you will need this option only if you have
-a two button mouse without scroll wheel.
-.TP 8
-.B \-emulatepseudo
-Create a depth 8 PseudoColor visual when running in depths 15, 16, 24,
-or 32, collectively known as TrueColor depths.
- At this date (April 2004) this option is not still operative.
-.TP 8
-.B "\-engine \fIengine_type_id\fP"
-This option, which is intended for Cygwin/X developers,
-overrides the server's automatically supported engine type.  This
-parameter will be ignored if the specified engine type is not
-supported on the current system.  The supported engine type ids are 1
-- Shadow GDI, 2 - Shadow DirectDraw, and 4 - Shadow DirectDraw4.
-Additionally, there is a barely functional experimental engine type id
-16 - Native GDI.
-.TP 8
-.B "\-fullscreen [-depth \fIdepth\fP] [-refresh \fIrate_in_Hz\fP]"
-Run the server in fullscreen mode, as opposed to the default windowed
-mode.
-.TP 8
-.B "\-depth \fIdepth\fP"
-Specify the color depth, in bits per pixel, to use when running in
-fullscreen with a DirectDraw engine.  This parameter is ignored if
-\fB\-fullscreen\fP is not specified.
-.TP 8
-.B "\-refresh \fIrate_in_Hz\fP"
-Specify an optional refresh rate to use when running in
-fullscreen with a DirectDraw engine.  This parameter is ignored if
-\fB\-fullscreen\fP is not specified.
-.TP 8
-.B \-help
-Write a help text to the console and to the log file.
-.TP 8
-.B \-ignoreinput
-Ignore keyboard and mouse input.  This is usually only used for testing
-and debugging purposes.
-.TP 8
-.B \-[no]keyhook
-Enable [disable] a low-level keyboard hook for catching
-special key combinations like Alt+Tab and passing them to the X
-Server instead of letting \fIWindows\fP handle them.
-.TP 8
-.B \-lesspointer
-Hide the Windows mouse cursor when the mouse is over any Cygwin/X
-window (regardless of whether that window is active or inactive).  This
-prevents the Windows mouse cursor from being placed overtop of the X
-cursor.
-.TP 8
-.B "\-logfile \fIFile_Name\fP"
-Change the log file from the default located at \fI/tmp/XWin.log\fP to
-the one indicated by \fIFile_Name\fP.
-.TP 8
-.B "\-logverbose \fIlevel\fP"
-Control the degree of verbosity of the log messages with the integer
-parameter \fIlevel\fP.  For \fIlevel\fP=0 only fatal errors are
-reported, for \fIlevel\fP=1 (default) simple information about
-configuration is also given, for \fIlevel\fP=2 a detailed log
-information (including trace and debug output) is produced.  Bigger
-values will yield a still more detailed debug output.  At this date
-(April 2004) the option is still not fully operative; the default
-value is 2 and the output is insensitive to the level value.
-.TP 8
-.B \-multimonitors
-Create a root window that covers all monitors on a system with
-multiple monitors.
-.TP 8
-.B \-multiwindow
-Start the integrated \fIWindowsi\fP-based window manager, which launches each
-top-level X window in its own \fIWindows\fP window.  Not to be used together
-with \fB\-rootless\fP nor \fB\-fullscreen\fP.
-.TP 8
-.B \-nodecoration
-Do not give the Cygwin/X window a Windows window border, title bar,
-etc.  This parameter only applies to windowed mode screens, i.e., this
-parameter is ignored when the \fB\-fullscreen\fP parameter is specified.
-.TP 8
-.B \-nounicodeclipboard
-Do not use Unicode clipboard even if NT-based platform.
-.TP 8
-.B \-rootless
-Run the server in rootless mode.  Not to be used with \fB\-multiwindow\fP
-nor with \fB\-fullscreen\fP.
-.TP 8
-.B "\-screen \fIscreen_number\fP \fIwidth\fP \fIheight\fP"
-This parameter may be used to specify the
-.I screen_number,
-.I height,
-and
-.I width
-of one or several Cygwin/X screens; each Cygwin/X screen will be
-opened in its own window.  When using multiple screens, be sure not to
-duplicate any screen numbers.
-.I XWin
-default behavior is to create a single screen that is roughly
-the size of the current Windows display area.
-Screen specific parameters, such as \fB\-fullscreen\fP, can be applied as a
-default to all screens by placing those screen specific parameters
-before any \fB\-screen\fP parameter.  Screen specific parameters placed after
-the first \fB\-screen\fP parameter will apply only to the immediately
-preceeding \fB\-screen\fP parameter.
-.TP 8
-.B \-scrollbars
-In windowed mode, allow screens bigger than the Windows desktop.
-Moreover, if the window has decorations, one can now resize it.
-.TP 8
-.B \-[no]trayicon
-Do not create a tray icon.  Default is to create one
-icon per screen.  You can globally disable tray icons with
-\fB\-notrayicon\fP, then enable it for specific screens with
-\fB\-trayicon\fP for those screens.
-.TP 8
-.B \-[no]unixkill
-Enable or disable the \fICtrl-Alt-Backspace\fP key combination as a
-signal to exit the X Server.  The \fICtrl-Alt-Backspace\fP key combination
-is disabled by default.
-.TP 8
-.B \-[no]winkill
-Enable or disable the \fIAlt-F4\fP key combination as a signal to exit the
-X Server.
-The \fIAlt-F4\fP key combination is enabled by default.
-.TP 8
-.B \-swcursor
-Disable the usage of the windows cursor and use the X11 software cursor instead.
-.B \-silent-dup-error
-If another instance of XWin is found running, exit silently and don't display 
-the error messge.
-.TP 8
-.B "\-xkblayout \fIlayout\fP"
-.TP 8
-.B "\-xkbmodel \fImodel\fP"
-.TP 8
-.B "\-xkboptions \fIoption\fP"
-.TP 8
-.B "\-xkbrules \fIrule\fP"
-.TP 8
-.B "\-xkbvariant \fIvariant\fp"
-These options implement the xkeyboard extension for loading
-a particular keyboard map as the X server starts.  The behavior is similar
-to the \fIsetxkbmap\fP program.  The layout data is located at
-\fI/usr/X11R6/lib/X11/xkb/\fP.  Additional information is found in the
-README files therein and in the man page of \fIsetxkbmap\fP.  For example
-in order to load a German layout for a pc105 keyboard one uses
-the options:
-.br
-.I " \-xkblayout de \-xkbmodel pc105"
-.PP
-Alternatively one may use the \fIsetxkbmap\fP program after XWin is
-running or even the \fIxmodmap\fP program for loading the old-style
-keyboard maps.
-
-
-.SH "SEE ALSO"
-X(__miscmansuffix__), Xserver(1), xdm(1), xinit(1), XWinrc(1), setxkbmap(1)
-
-
-.SH BUGS
-.I XWin
-and this man page still have many limitations.  Some of the more obvious
-ones are:
-.br
-- The display mode can not be changed once the X server has started.
-.br
-- The XWin software is developing rapidly; it is therefore likely that
-this man page is not up to date.  It is always prudent to 
-look also at the output of \fIXWin -help\fP and to the Cygwin/X User Guide
-at /usr/share/doc/cygwin-x-doc-x.x.x/ug/cygwin-x-ug.xxx in order to
-check the options that are operative.
-
-
-.SH AUTHORS
-This list is by no means complete, but direct contributors to the
-Cygwin/X project include (in alphabetical order by last name): Stuart
-Adamson, Michael Bax, Jehan Bing, Lev Bishop, Dr. Peter Busch, Biju G
-C, Robert Collins, Nick Crabtree, Early Ehlinger, Christopher Faylor,
-John Fortin, Brian Genisio, Fabrizio Gennari, Alexander Gottwald, Ralf
-Habacker, Colin Harrison, Matthieu Herrb, Alan Hourihane, Pierre A
-Humblet, Harold L Hunt II, Dakshinamurthy Karra, Kensuke Matsuzaki,
-Takuma Murakami, Earle F. Philhower III, Benjamin Riefenstahl, Suhaib
-Siddiqi, Jack Tanner, and Nicholas Wourms.
diff --git a/hw/xwin/XWin.man.pre b/hw/xwin/XWin.man.pre
new file mode 100644
index 0000000..9649e2e
--- /dev/null
+++ b/hw/xwin/XWin.man.pre
@@ -0,0 +1,288 @@
+.TH XWIN 1 __vendorversion__
+.SH NAME
+XWin \- X Server for the Cygwin environment on Microsoft Windows
+
+
+.SH SYNOPSIS
+.B XWin
+[ options ] ...
+
+
+.SH DESCRIPTION
+.I XWin is an X Server for the X Window System on the Cygwin environment
+running on Microsoft Windows.
+
+
+.SH MODES
+\fIXWin\fP can operate in five different and incompatible modes:
+.br
+* \fISingle Window\fP: This is the default option.  The X server
+appears as a single Windows window and all X windows are contained
+within this window.  This mode requires an external window manager.
+.br
+* \fINo Decoration\fP: This mode is like single window mode except
+that the X server window does not have a title bar or border, thus
+maximizing the amount of space available for X windows within the X
+server window.  This mode requires an external window manager.
+.br
+* \fIFull Screen\fP: This mode is like single window mode except that
+the X server window takes the full screen, covering completely the
+Windows desktop.  This mode requires an external window manager.
+.br
+* \fIRootless\fP: The X server works on a window covering the whole
+screen but the root window (traditionally covered with an X hatch
+pattern) is hidden from view.  This mode requires an external window
+manager.
+.br
+* \fIMulti-Window\fP: In this mode \fIXWin\fP uses its own integrated
+window manager in order to handle the top-level X windows, in such a
+way that they appear as normal Windows windows.
+.PP
+NOTE: \fIMulti-Window\fP mode will crash if an external window manager
+such as \fItwm\fP or \fIfvwm\fP is launched since \fIMulti-Window\fP
+uses its own internal window manager; all other modes require an
+external window manager in order to move, resize, and perform other
+operations on the individual X windows.
+
+
+.SH LOG
+As it runs \fIXWin\fP writes messages indicating the most relevant events
+to  the console
+from which it was called and to a log file that by default is located at \fI
+__logdir__/XWin.0.log\fP.  This file is mainly for debugging purposes.
+
+
+.SH PREFERENCES FILE
+On startup \fIXWin\fP looks for the file \fI$HOME/.XWinrc\fP or, if
+the previous file does not exist, \fI
+__sysconfdir__/X11/system.XWinrc\fP.  \fI.XWinrc\fP allows setting
+preferences for the following:
+.br
+1- To include items into the menu associated with the \fIXWin\fP icon
+which is in the \fIWindows\fP system tray.  This functions in all
+modes that have a tray icon.
+.br
+2- To include items in the menu which is associated with the Windows
+window that \fIXWin -multiwindow\fP produces for each top-level X
+window.  That can be done both for the generic case and for particular
+programs.
+.br
+3- To change the icon that is associated to the Windows window that
+\fIXWin -multiwindow\fP produces for each top-level X-window.  Again,
+that can be done both for the generic case and for particular
+programs.
+.PP
+The format of the \fI.XWinrc\fP file is given in the man page XWinrc(5).
+
+
+.SH OPTIONS
+In addition to the normal server options described in the \fIXserver(1)\fP
+manual page, \fIXWin\fP accepts the following command line switches,
+\fIall\fP of which are optional:
+.TP 8
+.B \-clipboard
+Enables the integration
+between the Cygwin/X clipboard and Windows clipboard.  Do not use in
+conjunction with the \fIxwinclip\fP program.
+.TP 8
+.B "\-clipupdates \fInum_boxes\fP"
+Specify an optional threshold, above which the boxes in a shadow
+update operation will be collected into a GDI clipping region.  The
+clipping region is then used to do a single bit block transfer that is
+constrained to the updated area by the clipping region.  There is some
+overhead involved in creating, installing, destroying, and removing
+the clipping region, thus there may not be much benefit for a small
+number of boxes (less than 10).  It is even possible that this
+functionality does not provide a benefit at any number of boxes; we
+can only determine the usefulness of this feature through testing.
+This parameter works in conjunction with engines 1, 2, and 4 (Shadow
+GDI, Shadow DirectDraw, and Shadow DirectDraw Non-Locking,
+respectively).
+.TP 8
+.B "\-emulate3buttons \fItimeout\fP"
+Emulate a three button mouse; pressing both buttons within
+.I timeout
+milliseconds causes an emulated middle button press.  The default
+.I timeout
+is 50 milliseconds.  Note that most mice with scroll wheel have middle
+button functionality, usually you will need this option only if you have
+a two button mouse without scroll wheel.
+.TP 8
+.B \-emulatepseudo
+Create a depth 8 PseudoColor visual when running in depths 15, 16, 24,
+or 32, collectively known as TrueColor depths.
+ At this date (April 2004) this option is not still operative.
+.TP 8
+.B "\-engine \fIengine_type_id\fP"
+This option, which is intended for Cygwin/X developers,
+overrides the server's automatically supported engine type.  This
+parameter will be ignored if the specified engine type is not
+supported on the current system.  The supported engine type ids are 1
+- Shadow GDI, 2 - Shadow DirectDraw, and 4 - Shadow DirectDraw4.
+Additionally, there is a barely functional experimental engine type id
+16 - Native GDI.
+.TP 8
+.B "\-fullscreen [-depth \fIdepth\fP] [-refresh \fIrate_in_Hz\fP]"
+Run the server in fullscreen mode, as opposed to the default windowed
+mode.
+.TP 8
+.B "\-depth \fIdepth\fP"
+Specify the color depth, in bits per pixel, to use when running in
+fullscreen with a DirectDraw engine.  This parameter is ignored if
+\fB\-fullscreen\fP is not specified.
+.TP 8
+.B "\-refresh \fIrate_in_Hz\fP"
+Specify an optional refresh rate to use when running in
+fullscreen with a DirectDraw engine.  This parameter is ignored if
+\fB\-fullscreen\fP is not specified.
+.TP 8
+.B \-help
+Write a help text to the console and to the log file.
+.TP 8
+.B \-ignoreinput
+Ignore keyboard and mouse input.  This is usually only used for testing
+and debugging purposes.
+.TP 8
+.B \-[no]keyhook
+Enable [disable] a low-level keyboard hook for catching
+special key combinations like Alt+Tab and passing them to the X
+Server instead of letting \fIWindows\fP handle them.
+.TP 8
+.B \-lesspointer
+Hide the Windows mouse cursor when the mouse is over any Cygwin/X
+window (regardless of whether that window is active or inactive).  This
+prevents the Windows mouse cursor from being placed overtop of the X
+cursor.
+.TP 8
+.B "\-logfile \fIFile_Name\fP"
+Change the log file from the default located at \fI
+__logdir__/XWin.0.log\fP to the one indicated by \fIFile_Name\fP.
+.TP 8
+.B "\-logverbose \fIlevel\fP"
+Control the degree of verbosity of the log messages with the integer
+parameter \fIlevel\fP.  For \fIlevel\fP=0 only fatal errors are
+reported, for \fIlevel\fP=1 (default) simple information about
+configuration is also given, for \fIlevel\fP=2 a detailed log
+information (including trace and debug output) is produced.  Bigger
+values will yield a still more detailed debug output.  At this date
+(April 2004) the option is still not fully operative; the default
+value is 2 and the output is insensitive to the level value.
+.TP 8
+.B \-multimonitors
+Create a root window that covers all monitors on a system with
+multiple monitors.
+.TP 8
+.B \-multiwindow
+Start the integrated \fIWindowsi\fP-based window manager, which launches each
+top-level X window in its own \fIWindows\fP window.  Not to be used together
+with \fB\-rootless\fP nor \fB\-fullscreen\fP.
+.TP 8
+.B \-nodecoration
+Do not give the Cygwin/X window a Windows window border, title bar,
+etc.  This parameter only applies to windowed mode screens, i.e., this
+parameter is ignored when the \fB\-fullscreen\fP parameter is specified.
+.TP 8
+.B \-nounicodeclipboard
+Do not use Unicode clipboard even if NT-based platform.
+.TP 8
+.B \-rootless
+Run the server in rootless mode.  Not to be used with \fB\-multiwindow\fP
+nor with \fB\-fullscreen\fP.
+.TP 8
+.B "\-screen \fIscreen_number\fP \fIwidth\fP \fIheight\fP"
+This parameter may be used to specify the
+.I screen_number,
+.I height,
+and
+.I width
+of one or several Cygwin/X screens; each Cygwin/X screen will be
+opened in its own window.  When using multiple screens, be sure not to
+duplicate any screen numbers.
+.I XWin
+default behavior is to create a single screen that is roughly
+the size of the current Windows display area.
+Screen specific parameters, such as \fB\-fullscreen\fP, can be applied as a
+default to all screens by placing those screen specific parameters
+before any \fB\-screen\fP parameter.  Screen specific parameters placed after
+the first \fB\-screen\fP parameter will apply only to the immediately
+preceeding \fB\-screen\fP parameter.
+.TP 8
+.B \-scrollbars
+In windowed mode, allow screens bigger than the Windows desktop.
+Moreover, if the window has decorations, one can now resize it.
+.TP 8
+.B \-[no]trayicon
+Do not create a tray icon.  Default is to create one
+icon per screen.  You can globally disable tray icons with
+\fB\-notrayicon\fP, then enable it for specific screens with
+\fB\-trayicon\fP for those screens.
+.TP 8
+.B \-[no]unixkill
+Enable or disable the \fICtrl-Alt-Backspace\fP key combination as a
+signal to exit the X Server.  The \fICtrl-Alt-Backspace\fP key combination
+is disabled by default.
+.TP 8
+.B \-[no]winkill
+Enable or disable the \fIAlt-F4\fP key combination as a signal to exit the
+X Server.
+The \fIAlt-F4\fP key combination is enabled by default.
+.TP 8
+.B \-swcursor
+Disable the usage of the windows cursor and use the X11 software cursor instead.
+.TP 8
+.B \-silent-dup-error
+If another instance of XWin is found running, exit silently and don't display
+the error message.
+.TP 8
+.B "\-xkblayout \fIlayout\fP"
+.TP 8
+.B "\-xkbmodel \fImodel\fP"
+.TP 8
+.B "\-xkboptions \fIoption\fP"
+.TP 8
+.B "\-xkbrules \fIrule\fP"
+.TP 8
+.B "\-xkbvariant \fIvariant\fp"
+These options implement the xkeyboard extension for loading
+a particular keyboard map as the X server starts.  The behavior is similar
+to the \fIsetxkbmap\fP program.  The layout data is located at \fI
+__datadir__/X11/xkb/\fP.  Additional information is found in the
+README files therein and in the man page of \fIsetxkbmap\fP.  For example
+in order to load a German layout for a pc105 keyboard one uses
+the options:
+.br
+.I " \-xkblayout de \-xkbmodel pc105"
+.PP
+Alternatively one may use the \fIsetxkbmap\fP program after XWin is
+running or even the \fIxmodmap\fP program for loading the old-style
+keyboard maps.
+
+
+.SH "SEE ALSO"
+X(__miscmansuffix__), Xserver(1), xdm(1), xinit(1), XWinrc(__filemansuffix__), setxkbmap(1)
+
+
+.SH BUGS
+.I XWin
+and this man page still have many limitations.  Some of the more obvious
+ones are:
+.br
+- The display mode can not be changed once the X server has started.
+.br
+- The XWin software is developing rapidly; it is therefore likely that
+this man page is not up to date.  It is always prudent to
+look also at the output of \fIXWin -help\fP and to the Cygwin/X User Guide
+at /usr/share/doc/cygwin-x-doc-x.x.x/ug/cygwin-x-ug.xxx in order to
+check the options that are operative.
+
+
+.SH AUTHORS
+This list is by no means complete, but direct contributors to the
+Cygwin/X project include (in alphabetical order by last name): Stuart
+Adamson, Michael Bax, Jehan Bing, Lev Bishop, Dr. Peter Busch, Biju G
+C, Robert Collins, Nick Crabtree, Early Ehlinger, Christopher Faylor,
+John Fortin, Brian Genisio, Fabrizio Gennari, Alexander Gottwald, Ralf
+Habacker, Colin Harrison, Matthieu Herrb, Alan Hourihane, Pierre A
+Humblet, Harold L Hunt II, Dakshinamurthy Karra, Kensuke Matsuzaki,
+Takuma Murakami, Earle F. Philhower III, Benjamin Riefenstahl, Suhaib
+Siddiqi, Jack Tanner, and Nicholas Wourms.
diff --git a/hw/xwin/XWinrc.man b/hw/xwin/XWinrc.man
deleted file mode 100755
index 8e2498c..0000000
--- a/hw/xwin/XWinrc.man
+++ /dev/null
@@ -1,247 +0,0 @@
-.TH XWIN 5 __vendorversion__
-
-
-.SH NAME
-XWinrc\- XWin Server Resource Configuration File.
-
-
-.SH DESCRIPTION
-The X Server for the X Window System on the Cygwin/X environment
-running on Microsoft Windows, \fIXWin\fP can be optionally configured
-with the \fIXWinrc\fP file.  A system-wide configuration file should
-be placed in \fI/usr/X11R6/lib/X11/system.XWinrc\fP, a per-user file
-should be put at \fI$HOME/.XWinrc\fP.  The \fIsystem.XWinrc\fP file is
-read only if no \fI$HOME/.XWinrc\fP exist.
-.PP
-With the \fI.XWinrc\fP configuration file it is possible to do the
-following:
-.PP
-1- To include items into the menu associated with the \fIXWin\fP icon
-which is in the \fIWindows\fP system tray.  This feature functions in
-all XWin modes that have such tray icon.
-.PP
-2- To include items into the menu which is associated with the
-\fIWindows\fP window that \fIXWin -multiwindow\fP produces for each
-top-level X-window.  That can be done both for the generic case and
-for particular programs.
-.PP
-3- To change the icon that is associated to the \fIWindows\fP window
-that \fIXWin -multiwindow\fP produces for each top-level X-window.
-Again, that can be done both for the generic case and for particular
-programs.  The new icons associated should be \fIWindows\fP format
-icons \fI.ico\fP.
-.PP
-4- To change the style that is associated to the \fIWindows\fP window
-that \fI-multiwindow\fP produces for  each  top-level  X window.   Again,
-that can be done both for the generic case and for particular programs.
-
-
-.SH FILE FORMAT
-.B Keywords
-are case insensitive, but in this document they will be written
-completely capitalized.
-.PP
-.B Comments
-are legal pretty much anywhere you can have an end-of-line; they
-begin with "#" or "//" and go to the end-of-line.
-.PP
-Quote marks in strings are optional unless the string has included spaces,
-or could be parsed, ambiguously, as a misplaced keyword.
-.PP
-There are four kinds of instructions: miscellaneous, menu, icon and style.
-
-
-.SH Miscellaneous instruction
-.TP 8
-.B DEBUG \fIString\fP
-The \fIString\fP is printed to the XWin.log file.
-
-.TP 8
-.B TRAYICON \fIicon-specifier\fB
-The \fBTRAYICON\fP keyword changes the icon \fIXWin\fP displays in the
-system tray area.
-
-.TP 8
-.B SILENTEXIT
-The \fBSILENTEXIT\fP keyword, which takes no parameters, disables the
-exit confirmation dialog.
-
-
-.SH Menu instructions
-.TP 8
-.B MENU \fIMenu_Name\fP {
-.br
-.B       \fIMenu_Item_Line\fP
-.br
-.B       \fIMenu_Item_Line\fP
-.br
-.B        \fI...\fP
-.br
-.B }
-.br
-This instruction defines a menu and asigns a \fIMenu_Name\fP to it.
-\fIMenu_Item_Line\fP are lines  of any of the following types:
-.TP 8
-.B \t SEPARATOR
-.TP 8
-.B  \t \fIItem_Label\fP  EXEC \fICommand\fP
-.TP 8
-.B \t \fIItem_Label\fP  MENU \fIpreviously-defined-menu-name\fP
-.TP 8
-.B \t \fIItem_Label\fP  ALWAYSONTOP
-.TP 8
-.B \t \fIItem_Label\fP  RELOAD
-.br
-The \fIItem_Label\fP is the string that is written in the menu item.
-.br
-\fICommand\fP is a string with the command that will be executed by /bin/sh.
-Here paths should be \fICYGWIN\fP style (e.g. /usr/local/bin/myprogram).
-A string "%display%" appearing in the \fICommand\fP will be replaced
-with the proper display variable (i.e. 127.0.0.1:<display>.0).
-.br
-\fBALWAYSONTOP\fP sets the window to which the menu is associated to
-display above all others.
-.br
-\fBRELOAD\fP causes the XWinrc file to be reloaded and icons and menus
-regenerated.
-.TP 8
-.B ROOTMENU \fIpreviously-defined-menu-name\fP
-Includes the items in the indicated menu into the menu associated with
-\fIXWin\fP that appears in the system tray.
-.TP 8
-.B DEFAULTSYSMENU \fIpreviously-defined-menu-name\fP ATSTART|ATEND
-Includes the items in the indicated menu into the menu associated with
-generic top-level X-Windows in the \fIXWin\fP \fImultiwindow\fP mode.  The
-keywords \fBATSTART\fP and \fBATEND\fP indicate if such items should be
-included at the start or at the end of the menu.
-.TP 8
-.B SYSMENU {
-  \fIclass-or-name-of-window\fP \fIdefined-menu-name\fP \fBATSTART|ATEND\fP
-.br
-  \fI...\fP
-.br
-  \fB}\fP
-.br
-Associates a specific menu to a specified window class or name
-in \fI-multiwindow\fP mode. The keywords ATSTART or ATEND indicate if
-such items should be included at the start or at the end of the menu.
-
-
-.SH Icon Instructions
-When specifying an \fIicon-file\fP in the following commands several different formats are allowed:
-.br
-\fB"NAME.ICO"\fP\fI of an .ico format file\fP
-.br
-\t \t ("cygwin.ico", "apple.ico")
-.br
-\fB"NAME.DLL,nn"\fP\fI of a .DLL and icon index\fP
-.br
-\t \t ("c:\\windows\\system32\\shell32.dll,4" is the default folder icon)
-.br
-\fB",nnn"\fP\fI index into XWin.EXE internal ICON resources\fP
-.br
-\t \t (",101" is the 1st icon inside \fIXWin.EXE\fP)
-.TP 8
-.B ICONDIRECTORY \fIWindows-path-to-icon-directory\fP
-Defines the default directory to search for \ficon-file\fP files.
-It should be a \fIWindows\fP style path (e.g. C:\\cygwin\\usr\\local\\icons).
-.TP 8
-.B DEFAULTICON \fIicon-file\fP
-Defines a replacement for the standard X icon for applications without
-specified icons.
-.TP 8
-.B ICONS {
-.br
- \fIclass-or-name-of-window\fP \fIicon-file\fP
-.br
-  \fI...\fP
-.br
-  \fB}\fP
-.br
-Defines icon replacements windows matching the specified window class or names.
-If multiple name or class matches occur for a window, only the first one
-will be used.
-
-.SH Style Instructions
-.TP 8
-.B STYLES {
-\fIclass-or-name-of-window\fP \fIstyle-keyword-1\fP \fIstyle-keyword-2\fP
-.br
-  \fI...\fP
-.br
-\fB}\fP
-
-Associates specific styles to a specified window class or name
-in \fI-multiwindow\fP mode.  If multiple class or name matches occur,
-for a window, only the first one will be used.
-
-The style keywords indicate the following:
-
-\fIstyle-keyword-1\fP
-
-\fBTOPMOST\fP
-.br
-Open the class or name above all NOTOPMOST Microsoft Windows
-.br
-\fBMAXIMIZE\fP
-.br
-Start the class or name fullscreen.
-.br
-\fBMINIMIZE\fP
-.br
-Start the class or name iconic.
-.br
-\fBBOTTOM\fP
-.br
-Open the class or name below all Windows windows.
-.br
-
-\fIstyle-keyword-2\fP
-
-\fBNOTITLE\fP
-.br
-No Windows title bar, for the class or name.
-.br
-\fBOUTLINE\fP
-.br
-No Windows title bar and just a thin-line border, for the class or name.
-.br
-\fBNOFRAME\fP
-.br
-No Windows title bar or border, for the class or name.
-
-One keyword in \fIstyle-keyword-1\fP can be used with one keyword in \fIstyle-keyword-2\fP,
-or any keyword can be used singly.
-
-
-.SH EXAMPLE
-.TP 8
-This example adds an Xterm menu item to the system tray icon
-\fBMENU systray {
-.br
-\t xterm  EXEC "xterm -display %display% -sb -sl 999"
-.br
-\t SEPARATOR
-.br
-}
-.br
-ROOTMENU systray
-\fP
-
-.TP 8
-This example makes an oclock window frameless in \fI-multiwindow\fP mode
-\fBSTYLES {
-.br
-\t oclock NOFRAME
-.br
-}
-
-
-
-.SH "SEE ALSO"
- XWin(1)
-
-
-.SH AUTHOR
-The XWinrc feature of XWin was written primarily by Earle F. Philhower
-III.  Extended for style configuration by Colin Harrison.
diff --git a/hw/xwin/XWinrc.man.pre b/hw/xwin/XWinrc.man.pre
new file mode 100755
index 0000000..4fb436d
--- /dev/null
+++ b/hw/xwin/XWinrc.man.pre
@@ -0,0 +1,248 @@
+.TH XWIN 5 __vendorversion__
+
+
+.SH NAME
+XWinrc\- XWin Server Resource Configuration File.
+
+
+.SH DESCRIPTION
+The X Server for the X Window System on the Cygwin/X environment
+running on Microsoft Windows, \fIXWin\fP can be optionally configured
+with the \fIXWinrc\fP file.  A system-wide configuration file should
+be placed in \fI
+__sysconfdir__/X11/system.XWinrc\fP, a per-user file
+should be put at \fI$HOME/.XWinrc\fP.  The \fIsystem.XWinrc\fP file is
+read only if no \fI$HOME/.XWinrc\fP exist.
+.PP
+With the \fI.XWinrc\fP configuration file it is possible to do the
+following:
+.PP
+1- To include items into the menu associated with the \fIXWin\fP icon
+which is in the \fIWindows\fP system tray.  This feature functions in
+all XWin modes that have such tray icon.
+.PP
+2- To include items into the menu which is associated with the
+\fIWindows\fP window that \fIXWin -multiwindow\fP produces for each
+top-level X-window.  That can be done both for the generic case and
+for particular programs.
+.PP
+3- To change the icon that is associated to the \fIWindows\fP window
+that \fIXWin -multiwindow\fP produces for each top-level X-window.
+Again, that can be done both for the generic case and for particular
+programs.  The new icons associated should be \fIWindows\fP format
+icons \fI.ico\fP.
+.PP
+4- To change the style that is associated to the \fIWindows\fP window
+that \fI-multiwindow\fP produces for  each  top-level  X window.   Again,
+that can be done both for the generic case and for particular programs.
+
+
+.SH FILE FORMAT
+.B Keywords
+are case insensitive, but in this document they will be written
+completely capitalized.
+.PP
+.B Comments
+are legal pretty much anywhere you can have an end-of-line; they
+begin with "#" or "//" and go to the end-of-line.
+.PP
+Quote marks in strings are optional unless the string has included spaces,
+or could be parsed, ambiguously, as a misplaced keyword.
+.PP
+There are four kinds of instructions: miscellaneous, menu, icon and style.
+
+
+.SH Miscellaneous instruction
+.TP 8
+.B DEBUG \fIString\fP
+The \fIString\fP is printed to the XWin log file.
+
+.TP 8
+.B TRAYICON \fIicon-specifier\fB
+The \fBTRAYICON\fP keyword changes the icon \fIXWin\fP displays in the
+system tray area.
+
+.TP 8
+.B SILENTEXIT
+The \fBSILENTEXIT\fP keyword, which takes no parameters, disables the
+exit confirmation dialog.
+
+
+.SH Menu instructions
+.TP 8
+.B MENU \fIMenu_Name\fP {
+.br
+.B       \fIMenu_Item_Line\fP
+.br
+.B       \fIMenu_Item_Line\fP
+.br
+.B        \fI...\fP
+.br
+.B }
+.br
+This instruction defines a menu and asigns a \fIMenu_Name\fP to it.
+\fIMenu_Item_Line\fP are lines  of any of the following types:
+.TP 8
+.B \t SEPARATOR
+.TP 8
+.B  \t \fIItem_Label\fP  EXEC \fICommand\fP
+.TP 8
+.B \t \fIItem_Label\fP  MENU \fIpreviously-defined-menu-name\fP
+.TP 8
+.B \t \fIItem_Label\fP  ALWAYSONTOP
+.TP 8
+.B \t \fIItem_Label\fP  RELOAD
+.br
+The \fIItem_Label\fP is the string that is written in the menu item.
+.br
+\fICommand\fP is a string with the command that will be executed by /bin/sh.
+Here paths should be \fICYGWIN\fP style (e.g. /usr/local/bin/myprogram).
+A string "%display%" appearing in the \fICommand\fP will be replaced
+with the proper display variable (i.e. 127.0.0.1:<display>.0).
+.br
+\fBALWAYSONTOP\fP sets the window to which the menu is associated to
+display above all others.
+.br
+\fBRELOAD\fP causes the XWinrc file to be reloaded and icons and menus
+regenerated.
+.TP 8
+.B ROOTMENU \fIpreviously-defined-menu-name\fP
+Includes the items in the indicated menu into the menu associated with
+\fIXWin\fP that appears in the system tray.
+.TP 8
+.B DEFAULTSYSMENU \fIpreviously-defined-menu-name\fP ATSTART|ATEND
+Includes the items in the indicated menu into the menu associated with
+generic top-level X-Windows in the \fIXWin\fP \fImultiwindow\fP mode.  The
+keywords \fBATSTART\fP and \fBATEND\fP indicate if such items should be
+included at the start or at the end of the menu.
+.TP 8
+.B SYSMENU {
+  \fIclass-or-name-of-window\fP \fIdefined-menu-name\fP \fBATSTART|ATEND\fP
+.br
+  \fI...\fP
+.br
+  \fB}\fP
+.br
+Associates a specific menu to a specified window class or name
+in \fI-multiwindow\fP mode. The keywords ATSTART or ATEND indicate if
+such items should be included at the start or at the end of the menu.
+
+
+.SH Icon Instructions
+When specifying an \fIicon-file\fP in the following commands several different formats are allowed:
+.br
+\fB"NAME.ICO"\fP\fI of an .ico format file\fP
+.br
+\t \t ("cygwin.ico", "apple.ico")
+.br
+\fB"NAME.DLL,nn"\fP\fI of a .DLL and icon index\fP
+.br
+\t \t ("c:\\windows\\system32\\shell32.dll,4" is the default folder icon)
+.br
+\fB",nnn"\fP\fI index into XWin.EXE internal ICON resources\fP
+.br
+\t \t (",101" is the 1st icon inside \fIXWin.EXE\fP)
+.TP 8
+.B ICONDIRECTORY \fIWindows-path-to-icon-directory\fP
+Defines the default directory to search for \ficon-file\fP files.
+It should be a \fIWindows\fP style path (e.g. C:\\cygwin\\usr\\local\\icons).
+.TP 8
+.B DEFAULTICON \fIicon-file\fP
+Defines a replacement for the standard X icon for applications without
+specified icons.
+.TP 8
+.B ICONS {
+.br
+ \fIclass-or-name-of-window\fP \fIicon-file\fP
+.br
+  \fI...\fP
+.br
+  \fB}\fP
+.br
+Defines icon replacements windows matching the specified window class or names.
+If multiple name or class matches occur for a window, only the first one
+will be used.
+
+.SH Style Instructions
+.TP 8
+.B STYLES {
+\fIclass-or-name-of-window\fP \fIstyle-keyword-1\fP \fIstyle-keyword-2\fP
+.br
+  \fI...\fP
+.br
+\fB}\fP
+
+Associates specific styles to a specified window class or name
+in \fI-multiwindow\fP mode.  If multiple class or name matches occur,
+for a window, only the first one will be used.
+
+The style keywords indicate the following:
+
+\fIstyle-keyword-1\fP
+
+\fBTOPMOST\fP
+.br
+Open the class or name above all NOTOPMOST Microsoft Windows
+.br
+\fBMAXIMIZE\fP
+.br
+Start the class or name fullscreen.
+.br
+\fBMINIMIZE\fP
+.br
+Start the class or name iconic.
+.br
+\fBBOTTOM\fP
+.br
+Open the class or name below all Windows windows.
+.br
+
+\fIstyle-keyword-2\fP
+
+\fBNOTITLE\fP
+.br
+No Windows title bar, for the class or name.
+.br
+\fBOUTLINE\fP
+.br
+No Windows title bar and just a thin-line border, for the class or name.
+.br
+\fBNOFRAME\fP
+.br
+No Windows title bar or border, for the class or name.
+
+One keyword in \fIstyle-keyword-1\fP can be used with one keyword in \fIstyle-keyword-2\fP,
+or any keyword can be used singly.
+
+
+.SH EXAMPLE
+.TP 8
+This example adds an Xterm menu item to the system tray icon
+\fBMENU systray {
+.br
+\t xterm  EXEC "xterm -display %display% -sb -sl 999"
+.br
+\t SEPARATOR
+.br
+}
+.br
+ROOTMENU systray
+\fP
+
+.TP 8
+This example makes an oclock window frameless in \fI-multiwindow\fP mode
+\fBSTYLES {
+.br
+\t oclock NOFRAME
+.br
+}
+
+
+
+.SH "SEE ALSO"
+ XWin(1)
+
+
+.SH AUTHOR
+The XWinrc feature of XWin was written primarily by Earle F. Philhower
+III.  Extended for style configuration by Colin Harrison.
commit 5c1afac5eea1d8327c74342d12d082b75f0cebde
Author: Adam Jackson <ajax at redhat.com>
Date:   Mon Jun 29 11:16:16 2009 -0400

    EDID: Fix timing class names to match the spec

diff --git a/hw/xfree86/ddc/print_edid.c b/hw/xfree86/ddc/print_edid.c
index c2723da..cebca47 100644
--- a/hw/xfree86/ddc/print_edid.c
+++ b/hw/xfree86/ddc/print_edid.c
@@ -231,7 +231,7 @@ print_established_timings(int scrnIndex, struct established_timings *t)
     unsigned char c;
 
     if (t->t1 || t->t2 || t->t_manu)
-	xf86DrvMsg(scrnIndex,X_INFO,"Supported VESA Video Modes:\n");
+	xf86DrvMsg(scrnIndex,X_INFO,"Supported established timings:\n");
     c=t->t1;
     if (c&0x80) xf86DrvMsg(scrnIndex,X_INFO,"720x400 at 70Hz\n");
     if (c&0x40) xf86DrvMsg(scrnIndex,X_INFO,"720x400 at 88Hz\n");
@@ -263,7 +263,7 @@ print_std_timings(int scrnIndex, struct std_timings *t)
     for (i=0;i<STD_TIMINGS;i++) {
 	if (t[i].hsize > 256) {  /* sanity check */
 	    if (!done) {
-		xf86DrvMsg(scrnIndex,X_INFO,"Supported Future Video Modes:\n");
+		xf86DrvMsg(scrnIndex,X_INFO,"Supported standard timings:\n");
 		done = 1;
 	    }
 	    xf86DrvMsg(scrnIndex,X_INFO,
@@ -296,7 +296,7 @@ print_detailed_timings(int scrnIndex, struct detailed_timings *t)
 {
 
     if (t->clock > 15000000) {  /* sanity check */
-	xf86DrvMsg(scrnIndex,X_INFO,"Supported additional Video Mode:\n");
+	xf86DrvMsg(scrnIndex,X_INFO,"Supported detailed timing:\n");
 	xf86DrvMsg(scrnIndex,X_INFO,"clock: %.1f MHz   ",t->clock/1000000.0);
 	xf86ErrorF("Image Size:  %i x %i mm\n",t->h_size,t->v_size); 
 	xf86DrvMsg(scrnIndex,X_INFO,
commit bf0f3b8f2bc830c8bd6f8f9410b89394b8d96257
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 29 13:31:02 2009 +1000

    test: fix build error introduced by XINPUT_ABI 7
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/test/input.c b/test/input.c
index b80e1f5..bb32491 100644
--- a/test/input.c
+++ b/test/input.c
@@ -52,13 +52,14 @@ static void dix_init_valuators(void)
     ValuatorClassPtr val;
     const int num_axes = 2;
     int i;
+    Atom atoms[MAX_VALUATORS] = { 0 };
 
 
     memset(&dev, 0, sizeof(DeviceIntRec));
     dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */
 
-    g_assert(InitValuatorClassDeviceStruct(NULL, 0, 0, 0) == FALSE);
-    g_assert(InitValuatorClassDeviceStruct(&dev, num_axes, 0, Absolute));
+    g_assert(InitValuatorClassDeviceStruct(NULL, 0, atoms, 0, 0) == FALSE);
+    g_assert(InitValuatorClassDeviceStruct(&dev, num_axes, atoms, 0, Absolute));
 
     val = dev.valuator;
     g_assert(val);
commit cbeb6a73c44143674a700d36a7e9804d41003a4f
Author: Thomas Jaeger <ThJaeger at gmail.com>
Date:   Sat Jun 20 20:17:41 2009 -0400

    dix: report subpixel coordinates for high-resolution devices
    
    Acked-by: Simon Thum <simon.thum at gmx.de>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/getevents.c b/dix/getevents.c
index c510122..fcac056 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -240,10 +240,11 @@ CreateClassesChangedEvent(EventList* event,
  * Rescale the coord between the two axis ranges.
  */
 static int
-rescaleValuatorAxis(int coord, AxisInfoPtr from, AxisInfoPtr to,
+rescaleValuatorAxis(int coord, float remainder, float *remainder_return, AxisInfoPtr from, AxisInfoPtr to,
                     int defmax)
 {
-    int fmin = 0, tmin = 0, fmax = defmax, tmax = defmax;
+    int fmin = 0, tmin = 0, fmax = defmax, tmax = defmax, coord_return;
+    float value;
 
     if(from && from->min_value < from->max_value) {
         fmin = from->min_value;
@@ -254,14 +255,23 @@ rescaleValuatorAxis(int coord, AxisInfoPtr from, AxisInfoPtr to,
         tmax = to->max_value;
     }
 
-    if(fmin == tmin && fmax == tmax)
+    if(fmin == tmin && fmax == tmax) {
+        if (remainder_return)
+            *remainder_return = remainder;
         return coord;
+    }
 
-    if(fmax == fmin) /* avoid division by 0 */
+    if(fmax == fmin) { /* avoid division by 0 */
+        if (remainder_return)
+            *remainder_return = 0.0;
         return 0;
+    }
 
-    return lroundf(((float)(coord - fmin)) * (tmax - tmin) /
-                 (fmax - fmin)) + tmin;
+    value = (coord + remainder - fmin) * (tmax - tmin) / (fmax - fmin) + tmin;
+    coord_return = lroundf(value);
+    if (remainder_return)
+        *remainder_return = value - coord_return;
+    return coord_return;
 }
 
 /**
@@ -289,9 +299,11 @@ updateSlaveDeviceCoords(DeviceIntPtr master, DeviceIntPtr pDev)
 
     /* scale back to device coordinates */
     if(pDev->valuator->numAxes > 0)
-        pDev->last.valuators[0] = rescaleValuatorAxis(pDev->last.valuators[0], NULL, pDev->valuator->axes + 0, scr->width);
+        pDev->last.valuators[0] = rescaleValuatorAxis(pDev->last.valuators[0], pDev->last.remainder[0],
+                        &pDev->last.remainder[0], NULL, pDev->valuator->axes + 0, scr->width);
     if(pDev->valuator->numAxes > 1)
-        pDev->last.valuators[1] = rescaleValuatorAxis(pDev->last.valuators[1], NULL, pDev->valuator->axes + 1, scr->height);
+        pDev->last.valuators[1] = rescaleValuatorAxis(pDev->last.valuators[1], pDev->last.remainder[1],
+                        &pDev->last.remainder[0], NULL, pDev->valuator->axes + 1, scr->height);
 
     /* calculate the other axis as well based on info from the old
      * slave-device. If the old slave had less axes than this one,
@@ -304,6 +316,8 @@ updateSlaveDeviceCoords(DeviceIntPtr master, DeviceIntPtr pDev)
             else
                 pDev->last.valuators[i] =
                     rescaleValuatorAxis(pDev->last.valuators[i],
+                            pDev->last.remainder[i],
+                            &pDev->last.remainder[i],
                             lastSlave->valuator->axes + i,
                             pDev->valuator->axes + i, 0);
         }
@@ -410,7 +424,7 @@ GetMotionHistory(DeviceIntPtr pDev, xTimecoord **buff, unsigned long start,
                 /* scale to screen coords */
                 to = &core_axis;
                 to->max_value = pScreen->width;
-                coord = rescaleValuatorAxis(coord, &from, to, pScreen->width);
+                coord = rescaleValuatorAxis(coord, 0.0, NULL, &from, to, pScreen->width);
 
                 memcpy(corebuf, &coord, sizeof(INT16));
                 corebuf++;
@@ -421,7 +435,7 @@ GetMotionHistory(DeviceIntPtr pDev, xTimecoord **buff, unsigned long start,
                 memcpy(&coord, icbuf++, sizeof(INT32));
 
                 to->max_value = pScreen->height;
-                coord = rescaleValuatorAxis(coord, &from, to, pScreen->height);
+                coord = rescaleValuatorAxis(coord, 0.0, NULL, &from, to, pScreen->height);
                 memcpy(corebuf, &coord, sizeof(INT16));
 
             } else if (IsMaster(pDev))
@@ -456,7 +470,7 @@ GetMotionHistory(DeviceIntPtr pDev, xTimecoord **buff, unsigned long start,
                         dflt = 0;
 
                     /* scale from stored range into current range */
-                    coord = rescaleValuatorAxis(coord, &from, to, 0);
+                    coord = rescaleValuatorAxis(coord, 0.0, NULL, &from, to, 0);
                     memcpy(ocbuf, &coord, sizeof(INT32));
                     ocbuf++;
                 }
@@ -745,26 +759,36 @@ accelPointer(DeviceIntPtr dev, int first, int num, int *valuators, CARD32 ms)
  * @param dev The device to be moved.
  * @param x Pointer to current x-axis value, may be modified.
  * @param y Pointer to current y-axis value, may be modified.
+ * @param x_frac Fractional part of current x-axis value, may be modified.
+ * @param y_frac Fractional part of current y-axis value, may be modified.
  * @param scr Screen the device's sprite is currently on.
  * @param screenx Screen x coordinate the sprite is on after the update.
  * @param screeny Screen y coordinate the sprite is on after the update.
+ * @param screenx_frac Fractional part of screen x coordinate, as above.
+ * @param screeny_frac Fractional part of screen y coordinate, as above.
  */
 static void
-positionSprite(DeviceIntPtr dev, int *x, int *y,
-               ScreenPtr scr, int *screenx, int *screeny)
+positionSprite(DeviceIntPtr dev, int *x, int *y, float x_frac, float y_frac,
+               ScreenPtr scr, int *screenx, int *screeny, float *screenx_frac, float *screeny_frac)
 {
     int old_screenx, old_screeny;
 
     /* scale x&y to screen */
-    if (dev->valuator->numAxes > 0)
-        *screenx = rescaleValuatorAxis(*x, dev->valuator->axes + 0, NULL, scr->width);
-    else
+    if (dev->valuator->numAxes > 0) {
+        *screenx = rescaleValuatorAxis(*x, x_frac, screenx_frac,
+                dev->valuator->axes + 0, NULL, scr->width);
+    } else {
         *screenx = dev->last.valuators[0];
+        *screenx_frac = dev->last.remainder[0];
+    }
 
-    if (dev->valuator->numAxes > 1 )
-        *screeny = rescaleValuatorAxis(*y, dev->valuator->axes + 1, NULL, scr->height);
-    else
+    if (dev->valuator->numAxes > 1) {
+        *screeny = rescaleValuatorAxis(*y, y_frac, screeny_frac,
+                dev->valuator->axes + 1, NULL, scr->height);
+    } else {
         *screeny = dev->last.valuators[1];
+        *screeny_frac = dev->last.remainder[1];
+    }
 
     old_screenx = *screenx;
     old_screeny = *screeny;
@@ -773,27 +797,31 @@ positionSprite(DeviceIntPtr dev, int *x, int *y,
     miPointerSetPosition(dev, screenx, screeny);
 
     if (dev->u.master) {
-        dev->u.master->last.valuators[0] = dev->last.valuators[0];
-        dev->u.master->last.valuators[1] = dev->last.valuators[1];
+        dev->u.master->last.valuators[0] = *screenx;
+        dev->u.master->last.valuators[1] = *screeny;
+        dev->u.master->last.remainder[0] = *screenx_frac;
+        dev->u.master->last.remainder[1] = *screeny_frac;
     }
 
     /* Crossed screen? Scale back to device coordiantes */
     if(*screenx != old_screenx)
     {
         scr = miPointerGetScreen(dev);
-        *x = rescaleValuatorAxis(*screenx, NULL,
+        *x = rescaleValuatorAxis(*screenx, *screenx_frac, &x_frac, NULL,
                                 dev->valuator->axes + 0, scr->width);
     }
     if(*screeny != old_screeny)
     {
         scr = miPointerGetScreen(dev);
-        *y = rescaleValuatorAxis(*screeny, NULL,
+        *y = rescaleValuatorAxis(*screeny, *screeny_frac, &y_frac, NULL,
                                  dev->valuator->axes + 1, scr->height);
     }
 
     /* dropy x/y (device coordinates) back into valuators for next event */
     dev->last.valuators[0] = *x;
     dev->last.valuators[1] = *y;
+    dev->last.remainder[0] = x_frac;
+    dev->last.remainder[1] = y_frac;
 }
 
 /**
@@ -1018,6 +1046,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
     RawDeviceEvent    *raw;
     int x = 0, y = 0, /* device coords */
         cx, cy; /* only screen coordinates */
+    float x_frac = 0.0, y_frac = 0.0, cx_frac, cy_frac;
     ScreenPtr scr = miPointerGetScreen(pDev);
 
     /* refuse events from disabled devices */
@@ -1050,26 +1079,31 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
         {
 
             if (num_valuators >= 1 && first_valuator == 0)
-                valuators[0] = rescaleValuatorAxis(valuators[0], NULL,
+                valuators[0] = rescaleValuatorAxis(valuators[0], 0.0, &x_frac, NULL,
                         pDev->valuator->axes + 0,
                         scr->width);
             if (first_valuator <= 1 && num_valuators >= (2 - first_valuator))
-                valuators[1 - first_valuator] = rescaleValuatorAxis(valuators[1 - first_valuator], NULL,
+                valuators[1 - first_valuator] = rescaleValuatorAxis(valuators[1 - first_valuator], 0.0, &y_frac, NULL,
                         pDev->valuator->axes + 1,
                         scr->height);
         }
 
         moveAbsolute(pDev, &x, &y, first_valuator, num_valuators, valuators);
     } else {
-        if (flags & POINTER_ACCELERATE)
+        if (flags & POINTER_ACCELERATE) {
             accelPointer(pDev, first_valuator, num_valuators, valuators, ms);
+            /* The pointer acceleration code modifies the fractional part
+             * in-place, so we need to extract this information first */
+            x_frac = pDev->last.remainder[0];
+            y_frac = pDev->last.remainder[1];
+        }
         moveRelative(pDev, &x, &y, first_valuator, num_valuators, valuators);
     }
 
     set_raw_valuators(raw, first_valuator, num_valuators, valuators,
             raw->valuators.data);
 
-    positionSprite(pDev, &x, &y, scr, &cx, &cy);
+    positionSprite(pDev, &x, &y, x_frac, y_frac, scr, &cx, &cy, &cx_frac, &cy_frac);
     updateHistory(pDev, first_valuator, num_valuators, ms);
 
     /* Update the valuators with the true value sent to the client*/
@@ -1102,8 +1136,8 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
 
     event->root_x = cx; /* root_x/y always in screen coords */
     event->root_y = cy;
-    event->root_x_frac = pDev->last.remainder[0];
-    event->root_y_frac = pDev->last.remainder[1];
+    event->root_x_frac = cx_frac;
+    event->root_y_frac = cy_frac;
 
     set_valuators(pDev, event, first_valuator, num_valuators, valuators);
 
commit 069b4c5f0a38649de73d1e0f70ee81bf862399dd
Author: Simon Thum <simon.thum at gmx.de>
Date:   Sat Jun 20 18:57:22 2009 +0200

    dix: make part of ptrveloc.h internal
    
    Though this is a SDK header, some functions are intended solely
    for the server.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/ptrveloc.h b/include/ptrveloc.h
index 317bc26..fa2156b 100644
--- a/include/ptrveloc.h
+++ b/include/ptrveloc.h
@@ -106,7 +106,7 @@ BasicComputeAcceleration(DeviceIntPtr dev, DeviceVelocityPtr vel,
 extern _X_EXPORT void
 FreeVelocityData(DeviceVelocityPtr vel);
 
-extern _X_EXPORT BOOL
+extern _X_INTERNAL BOOL
 InitializePredictableAccelerationProperties(DeviceIntPtr dev);
 
 extern _X_EXPORT int
@@ -119,14 +119,14 @@ extern _X_EXPORT void
 SetDeviceSpecificAccelerationProfile(DeviceVelocityPtr vel,
                                      PointerAccelerationProfileFunc profile);
 
-extern _X_EXPORT void
+extern _X_INTERNAL void
 AccelerationDefaultCleanup(DeviceIntPtr dev);
 
-extern _X_EXPORT void
+extern _X_INTERNAL void
 acceleratePointerPredictable(DeviceIntPtr dev, int first_valuator,
                              int num_valuators, int *valuators, int evtime);
 
-extern _X_EXPORT void
+extern _X_INTERNAL void
 acceleratePointerLightweight(DeviceIntPtr dev, int first_valuator,
                              int num_valuators, int *valuators, int ignored);
 
commit 2830e8493757e0da1253fe5ab280562b84730e77
Author: Simon Thum <simon.thum at gmx.de>
Date:   Wed Jun 24 11:33:19 2009 +0200

    dix: rename pDev->dev, pVel->vel for consistency
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c
index a0a4d2e..37c8e51 100644
--- a/dix/ptrveloc.c
+++ b/dix/ptrveloc.c
@@ -61,12 +61,12 @@
 
 /* fwds */
 int
-SetAccelerationProfile(DeviceVelocityPtr s, int profile_num);
+SetAccelerationProfile(DeviceVelocityPtr vel, int profile_num);
 static float
 SimpleSmoothProfile(DeviceIntPtr dev, DeviceVelocityPtr vel, float velocity,
                     float threshold, float acc);
 static PointerAccelerationProfileFunc
-GetAccelerationProfile(DeviceVelocityPtr s, int profile_num);
+GetAccelerationProfile(DeviceVelocityPtr vel, int profile_num);
 
 /*#define PTRACCEL_DEBUGGING*/
 
@@ -87,21 +87,21 @@ GetAccelerationProfile(DeviceVelocityPtr s, int profile_num);
  * Init struct so it should match the average case
  */
 void
-InitVelocityData(DeviceVelocityPtr s)
+InitVelocityData(DeviceVelocityPtr vel)
 {
-    memset(s, 0, sizeof(DeviceVelocityRec));
-
-    s->corr_mul = 10.0;      /* dots per 10 milisecond should be usable */
-    s->const_acceleration = 1.0;   /* no acceleration/deceleration  */
-    s->reset_time = 300;
-    s->use_softening = 1;
-    s->min_acceleration = 1.0; /* don't decelerate */
-    s->max_rel_diff = 0.2;
-    s->max_diff = 1.0;
-    s->initial_range = 2;
-    s->average_accel = TRUE;
-    SetAccelerationProfile(s, AccelProfileClassic);
-    InitTrackers(s, 16);
+    memset(vel, 0, sizeof(DeviceVelocityRec));
+
+    vel->corr_mul = 10.0;      /* dots per 10 milisecond should be usable */
+    vel->const_acceleration = 1.0;   /* no acceleration/deceleration  */
+    vel->reset_time = 300;
+    vel->use_softening = 1;
+    vel->min_acceleration = 1.0; /* don't decelerate */
+    vel->max_rel_diff = 0.2;
+    vel->max_diff = 1.0;
+    vel->initial_range = 2;
+    vel->average_accel = TRUE;
+    SetAccelerationProfile(vel, AccelProfileClassic);
+    InitTrackers(vel, 16);
 }
 
 
@@ -109,9 +109,9 @@ InitVelocityData(DeviceVelocityPtr s)
  * Clean up
  */
 void
-FreeVelocityData(DeviceVelocityPtr s){
-    xfree(s->tracker);
-    SetAccelerationProfile(s, PROFILE_UNINITIALIZE);
+FreeVelocityData(DeviceVelocityPtr vel){
+    xfree(vel->tracker);
+    SetAccelerationProfile(vel, PROFILE_UNINITIALIZE);
 }
 
 
@@ -119,15 +119,15 @@ FreeVelocityData(DeviceVelocityPtr s){
  *  dix uninit helper, called through scheme
  */
 void
-AccelerationDefaultCleanup(DeviceIntPtr pDev)
+AccelerationDefaultCleanup(DeviceIntPtr dev)
 {
     /*sanity check*/
-    if( pDev->valuator->accelScheme.AccelSchemeProc == acceleratePointerPredictable
-            && pDev->valuator->accelScheme.accelData != NULL){
-        pDev->valuator->accelScheme.AccelSchemeProc = NULL;
-        FreeVelocityData(pDev->valuator->accelScheme.accelData);
-        xfree(pDev->valuator->accelScheme.accelData);
-        pDev->valuator->accelScheme.accelData = NULL;
+    if( dev->valuator->accelScheme.AccelSchemeProc == acceleratePointerPredictable
+            && dev->valuator->accelScheme.accelData != NULL){
+        dev->valuator->accelScheme.AccelSchemeProc = NULL;
+        FreeVelocityData(dev->valuator->accelScheme.accelData);
+        xfree(dev->valuator->accelScheme.accelData);
+        dev->valuator->accelScheme.accelData = NULL;
     }
 }
 
@@ -143,7 +143,7 @@ static int
 AccelSetProfileProperty(DeviceIntPtr dev, Atom atom,
                         XIPropertyValuePtr val, BOOL checkOnly)
 {
-    DeviceVelocityPtr pVel;
+    DeviceVelocityPtr vel;
     int profile, *ptr = &profile;
     int rc;
     int nelem = 1;
@@ -151,8 +151,8 @@ AccelSetProfileProperty(DeviceIntPtr dev, Atom atom,
     if (atom != XIGetKnownProperty(ACCEL_PROP_PROFILE_NUMBER))
         return Success;
 
-    pVel = GetDevicePredictableAccelData(dev);
-    if (!pVel)
+    vel = GetDevicePredictableAccelData(dev);
+    if (!vel)
         return BadValue;
     rc = XIPropToInt(val, &nelem, &ptr);
 
@@ -161,18 +161,18 @@ AccelSetProfileProperty(DeviceIntPtr dev, Atom atom,
         if (rc)
             return rc;
 
-        if (GetAccelerationProfile(pVel, profile) == NULL)
+        if (GetAccelerationProfile(vel, profile) == NULL)
             return BadValue;
     } else
-	SetAccelerationProfile(pVel, profile);
+	SetAccelerationProfile(vel, profile);
 
     return Success;
 }
 
 static void
-AccelInitProfileProperty(DeviceIntPtr dev, DeviceVelocityPtr pVel)
+AccelInitProfileProperty(DeviceIntPtr dev, DeviceVelocityPtr vel)
 {
-    int profile = pVel->statistics.profile_number;
+    int profile = vel->statistics.profile_number;
     Atom prop_profile_number = XIGetKnownProperty(ACCEL_PROP_PROFILE_NUMBER);
 
     XIChangeDeviceProperty(dev, prop_profile_number, XA_INTEGER, 32,
@@ -188,7 +188,7 @@ static int
 AccelSetDecelProperty(DeviceIntPtr dev, Atom atom,
                       XIPropertyValuePtr val, BOOL checkOnly)
 {
-    DeviceVelocityPtr pVel;
+    DeviceVelocityPtr vel;
     float v, *ptr = &v;
     int rc;
     int nelem = 1;
@@ -196,8 +196,8 @@ AccelSetDecelProperty(DeviceIntPtr dev, Atom atom,
     if (atom != XIGetKnownProperty(ACCEL_PROP_CONSTANT_DECELERATION))
         return Success;
 
-    pVel = GetDevicePredictableAccelData(dev);
-    if (!pVel)
+    vel = GetDevicePredictableAccelData(dev);
+    if (!vel)
         return BadValue;
     rc = XIPropToFloat(val, &nelem, &ptr);
 
@@ -209,15 +209,15 @@ AccelSetDecelProperty(DeviceIntPtr dev, Atom atom,
     }
 
     if(v >= 1.0f)
-	pVel->const_acceleration = 1/v;
+	vel->const_acceleration = 1/v;
 
     return Success;
 }
 
 static void
-AccelInitDecelProperty(DeviceIntPtr dev, DeviceVelocityPtr pVel)
+AccelInitDecelProperty(DeviceIntPtr dev, DeviceVelocityPtr vel)
 {
-    float fval = 1.0/pVel->const_acceleration;
+    float fval = 1.0/vel->const_acceleration;
     Atom prop_const_decel = XIGetKnownProperty(ACCEL_PROP_CONSTANT_DECELERATION);
     XIChangeDeviceProperty(dev, prop_const_decel,
                            XIGetKnownProperty(XATOM_FLOAT), 32,
@@ -234,7 +234,7 @@ static int
 AccelSetAdaptDecelProperty(DeviceIntPtr dev, Atom atom,
                            XIPropertyValuePtr val, BOOL checkOnly)
 {
-    DeviceVelocityPtr pVel;
+    DeviceVelocityPtr veloc;
     float v, *ptr = &v;
     int rc;
     int nelem = 1;
@@ -242,8 +242,8 @@ AccelSetAdaptDecelProperty(DeviceIntPtr dev, Atom atom,
     if (atom != XIGetKnownProperty(ACCEL_PROP_ADAPTIVE_DECELERATION))
         return Success;
 
-    pVel = GetDevicePredictableAccelData(dev);
-    if (!pVel)
+    veloc = GetDevicePredictableAccelData(dev);
+    if (!veloc)
         return BadValue;
     rc = XIPropToFloat(val, &nelem, &ptr);
 
@@ -255,15 +255,15 @@ AccelSetAdaptDecelProperty(DeviceIntPtr dev, Atom atom,
     }
 
     if(v >= 1.0f)
-	pVel->min_acceleration = 1/v;
+	veloc->min_acceleration = 1/v;
 
     return Success;
 }
 
 static void
-AccelInitAdaptDecelProperty(DeviceIntPtr dev, DeviceVelocityPtr pVel)
+AccelInitAdaptDecelProperty(DeviceIntPtr dev, DeviceVelocityPtr vel)
 {
-    float fval = 1.0/pVel->min_acceleration;
+    float fval = 1.0/vel->min_acceleration;
     Atom prop_adapt_decel = XIGetKnownProperty(ACCEL_PROP_ADAPTIVE_DECELERATION);
 
     XIChangeDeviceProperty(dev, prop_adapt_decel, XIGetKnownProperty(XATOM_FLOAT), 32,
@@ -280,7 +280,7 @@ static int
 AccelSetScaleProperty(DeviceIntPtr dev, Atom atom,
                       XIPropertyValuePtr val, BOOL checkOnly)
 {
-    DeviceVelocityPtr pVel;
+    DeviceVelocityPtr vel;
     float v, *ptr = &v;
     int rc;
     int nelem = 1;
@@ -288,8 +288,8 @@ AccelSetScaleProperty(DeviceIntPtr dev, Atom atom,
     if (atom != XIGetKnownProperty(ACCEL_PROP_VELOCITY_SCALING))
         return Success;
 
-    pVel = GetDevicePredictableAccelData(dev);
-    if (!pVel)
+    vel = GetDevicePredictableAccelData(dev);
+    if (!vel)
         return BadValue;
     rc = XIPropToFloat(val, &nelem, &ptr);
 
@@ -302,15 +302,15 @@ AccelSetScaleProperty(DeviceIntPtr dev, Atom atom,
     }
 
     if(v > 0)
-	pVel->corr_mul = v;
+	vel->corr_mul = v;
 
     return Success;
 }
 
 static void
-AccelInitScaleProperty(DeviceIntPtr dev, DeviceVelocityPtr pVel)
+AccelInitScaleProperty(DeviceIntPtr dev, DeviceVelocityPtr vel)
 {
-    float fval = pVel->corr_mul;
+    float fval = vel->corr_mul;
     Atom prop_velo_scale = XIGetKnownProperty(ACCEL_PROP_VELOCITY_SCALING);
 
     XIChangeDeviceProperty(dev, prop_velo_scale, XIGetKnownProperty(XATOM_FLOAT), 32,
@@ -320,17 +320,17 @@ AccelInitScaleProperty(DeviceIntPtr dev, DeviceVelocityPtr pVel)
 }
 
 BOOL
-InitializePredictableAccelerationProperties(DeviceIntPtr device)
+InitializePredictableAccelerationProperties(DeviceIntPtr dev)
 {
-    DeviceVelocityPtr  pVel = GetDevicePredictableAccelData(device);
+    DeviceVelocityPtr  vel = GetDevicePredictableAccelData(dev);
 
-    if(!pVel)
+    if(!vel)
 	return FALSE;
 
-    AccelInitProfileProperty(device, pVel);
-    AccelInitDecelProperty(device, pVel);
-    AccelInitAdaptDecelProperty(device, pVel);
-    AccelInitScaleProperty(device, pVel);
+    AccelInitProfileProperty(dev, vel);
+    AccelInitDecelProperty(dev, vel);
+    AccelInitAdaptDecelProperty(dev, vel);
+    AccelInitScaleProperty(dev, vel);
     return TRUE;
 }
 
@@ -339,16 +339,16 @@ InitializePredictableAccelerationProperties(DeviceIntPtr device)
  ********************/
 
 void
-InitTrackers(DeviceVelocityPtr s, int ntracker)
+InitTrackers(DeviceVelocityPtr vel, int ntracker)
 {
     if(ntracker < 1){
 	ErrorF("(dix ptracc) invalid number of trackers\n");
 	return;
     }
-    xfree(s->tracker);
-    s->tracker = (MotionTrackerPtr)xalloc(ntracker * sizeof(MotionTracker));
-    memset(s->tracker, 0, ntracker * sizeof(MotionTracker));
-    s->num_tracker = ntracker;
+    xfree(vel->tracker);
+    vel->tracker = (MotionTrackerPtr)xalloc(ntracker * sizeof(MotionTracker));
+    memset(vel->tracker, 0, ntracker * sizeof(MotionTracker));
+    vel->num_tracker = ntracker;
 }
 
 /**
@@ -437,22 +437,22 @@ GetDirection(int dx, int dy){
 #define TRACKER_INDEX(s, d) (((s)->num_tracker + (s)->cur_tracker - (d)) % (s)->num_tracker)
 
 static inline void
-FeedTrackers(DeviceVelocityPtr s, int dx, int dy, int cur_t)
+FeedTrackers(DeviceVelocityPtr vel, int dx, int dy, int cur_t)
 {
     int n;
-    for(n = 0; n < s->num_tracker; n++){
-	s->tracker[n].dx += dx;
-	s->tracker[n].dy += dy;
+    for(n = 0; n < vel->num_tracker; n++){
+	vel->tracker[n].dx += dx;
+	vel->tracker[n].dy += dy;
     }
-    n = (s->cur_tracker + 1) % s->num_tracker;
-    s->tracker[n].dx = 0;
-    s->tracker[n].dy = 0;
-    s->tracker[n].time = cur_t;
-    s->tracker[n].dir = GetDirection(dx, dy);
+    n = (vel->cur_tracker + 1) % vel->num_tracker;
+    vel->tracker[n].dx = 0;
+    vel->tracker[n].dy = 0;
+    vel->tracker[n].time = cur_t;
+    vel->tracker[n].dir = GetDirection(dx, dy);
     DebugAccelF("(dix prtacc) motion [dx: %i dy: %i dir:%i diff: %i]\n",
-                dx, dy, s->tracker[n].dir,
-                cur_t - s->tracker[s->cur_tracker].time);
-    s->cur_tracker = n;
+                dx, dy, vel->tracker[n].dir,
+                cur_t - vel->tracker[vel->cur_tracker].time);
+    vel->cur_tracker = n;
 }
 
 /**
@@ -461,11 +461,11 @@ FeedTrackers(DeviceVelocityPtr s, int dx, int dy, int cur_t)
  * This assumes linear motion.
  */
 static float
-CalcTracker(DeviceVelocityPtr s, int offset, int cur_t){
-    int index = TRACKER_INDEX(s, offset);
-    float dist = sqrt(  s->tracker[index].dx * s->tracker[index].dx
-                      + s->tracker[index].dy * s->tracker[index].dy);
-    int dtime = cur_t - s->tracker[index].time;
+CalcTracker(DeviceVelocityPtr vel, int offset, int cur_t){
+    int index = TRACKER_INDEX(vel, offset);
+    float dist = sqrt(  vel->tracker[index].dx * vel->tracker[index].dx
+                      + vel->tracker[index].dy * vel->tracker[index].dy);
+    int dtime = cur_t - vel->tracker[index].time;
     if(dtime > 0)
 	return (dist / dtime);
     else
@@ -479,19 +479,19 @@ CalcTracker(DeviceVelocityPtr s, int offset, int cur_t){
  * May return 0.
  */
 static float
-QueryTrackers(DeviceVelocityPtr s, int cur_t){
+QueryTrackers(DeviceVelocityPtr vel, int cur_t){
     int n, offset, dir = 255, i = -1, age_ms;
     /* initial velocity: a low-offset, valid velocity */
     float iveloc = 0, res = 0, tmp, vdiff;
-    float vfac =  s->corr_mul * s->const_acceleration; /* premultiply */
+    float vfac =  vel->corr_mul * vel->const_acceleration; /* premultiply */
     /* loop from current to older data */
-    for(offset = 1; offset < s->num_tracker; offset++){
-	n = TRACKER_INDEX(s, offset);
+    for(offset = 1; offset < vel->num_tracker; offset++){
+	n = TRACKER_INDEX(vel, offset);
 
-	age_ms = cur_t - s->tracker[n].time;
+	age_ms = cur_t - vel->tracker[n].time;
 
 	/* bail out if data is too old and protect from overrun */
-	if (age_ms >= s->reset_time || age_ms < 0) {
+	if (age_ms >= vel->reset_time || age_ms < 0) {
 	    DebugAccelF("(dix prtacc) query: tracker too old\n");
 	    break;
 	}
@@ -502,7 +502,7 @@ QueryTrackers(DeviceVelocityPtr s, int cur_t){
 	 * even more precision we could subdivide as a final step, so possible
 	 * non-linearities are accounted for.
 	 */
-	dir &= s->tracker[n].dir;
+	dir &= vel->tracker[n].dir;
 	if(dir == 0){
 	    DebugAccelF("(dix prtacc) query: no longer linear\n");
 	    /* instead of breaking it we might also inspect the partition after,
@@ -510,16 +510,16 @@ QueryTrackers(DeviceVelocityPtr s, int cur_t){
 	    break;
 	}
 
-	tmp = CalcTracker(s, offset, cur_t) * vfac;
+	tmp = CalcTracker(vel, offset, cur_t) * vfac;
 
-	if ((iveloc == 0 || offset <= s->initial_range) && tmp != 0) {
+	if ((iveloc == 0 || offset <= vel->initial_range) && tmp != 0) {
 	    /* set initial velocity and result */
 	    res = iveloc = tmp;
 	    i = offset;
 	} else if (iveloc != 0 && tmp != 0) {
 	    vdiff = fabs(iveloc - tmp);
-	    if (vdiff <= s->max_diff ||
-		vdiff/(iveloc + tmp) < s->max_rel_diff) {
+	    if (vdiff <= vel->max_diff ||
+		vdiff/(iveloc + tmp) < vel->max_rel_diff) {
 		/* we're in range with the initial velocity,
 		 * so this result is likely better
 		 * (it contains more information). */
@@ -534,17 +534,17 @@ QueryTrackers(DeviceVelocityPtr s, int cur_t){
 	    }
 	}
     }
-    if(offset == s->num_tracker){
+    if(offset == vel->num_tracker){
 	DebugAccelF("(dix prtacc) query: last tracker in effect\n");
-	i = s->num_tracker-1;
+	i = vel->num_tracker-1;
     }
     if(i>=0){
-        n = TRACKER_INDEX(s, i);
+        n = TRACKER_INDEX(vel, i);
 	DebugAccelF("(dix prtacc) result: offset %i [dx: %i dy: %i diff: %i]\n",
 	            i,
-	            s->tracker[n].dx,
-	            s->tracker[n].dy,
-	            cur_t - s->tracker[n].time);
+	            vel->tracker[n].dx,
+	            vel->tracker[n].dy,
+	            cur_t - vel->tracker[n].time);
     }
     return res;
 }
@@ -557,20 +557,20 @@ QueryTrackers(DeviceVelocityPtr s, int cur_t){
  */
 short
 ProcessVelocityData2D(
-    DeviceVelocityPtr s,
+    DeviceVelocityPtr vel,
     int dx,
     int dy,
     int time)
 {
     float velocity;
 
-    s->last_velocity = s->velocity;
+    vel->last_velocity = vel->velocity;
 
-    FeedTrackers(s, dx, dy, time);
+    FeedTrackers(vel, dx, dy, time);
 
-    velocity = QueryTrackers(s, time);
+    velocity = QueryTrackers(vel, time);
 
-    s->velocity = velocity;
+    vel->velocity = velocity;
     return velocity == 0;
 }
 
@@ -594,23 +594,23 @@ ApplySimpleSoftening(int od, int d)
 
 static void
 ApplySofteningAndConstantDeceleration(
-        DeviceVelocityPtr s,
+        DeviceVelocityPtr vel,
         int dx,
         int dy,
         float* fdx,
         float* fdy,
         short do_soften)
 {
-    if (do_soften && s->use_softening) {
-        *fdx = ApplySimpleSoftening(s->last_dx, dx);
-        *fdy = ApplySimpleSoftening(s->last_dy, dy);
+    if (do_soften && vel->use_softening) {
+        *fdx = ApplySimpleSoftening(vel->last_dx, dx);
+        *fdy = ApplySimpleSoftening(vel->last_dy, dy);
     } else {
         *fdx = dx;
         *fdy = dy;
     }
 
-    *fdx *= s->const_acceleration;
-    *fdy *= s->const_acceleration;
+    *fdx *= vel->const_acceleration;
+    *fdy *= vel->const_acceleration;
 }
 
 /*
@@ -853,14 +853,14 @@ NoProfile(
 
 static PointerAccelerationProfileFunc
 GetAccelerationProfile(
-    DeviceVelocityPtr s,
+    DeviceVelocityPtr vel,
     int profile_num)
 {
     switch(profile_num){
         case AccelProfileClassic:
             return ClassicProfile;
         case AccelProfileDeviceSpecific:
-            return s->deviceSpecificProfile;
+            return vel->deviceSpecificProfile;
         case AccelProfilePolynomial:
             return PolynomialAccelerationProfile;
         case AccelProfileSmoothLinear:
@@ -890,23 +890,23 @@ GetAccelerationProfile(
  */
 int
 SetAccelerationProfile(
-    DeviceVelocityPtr s,
+    DeviceVelocityPtr vel,
     int profile_num)
 {
     PointerAccelerationProfileFunc profile;
-    profile = GetAccelerationProfile(s, profile_num);
+    profile = GetAccelerationProfile(vel, profile_num);
 
     if(profile == NULL && profile_num != PROFILE_UNINITIALIZE)
 	return FALSE;
 
-    if(s->profile_private != NULL){
+    if(vel->profile_private != NULL){
         /* Here one could free old profile-private data */
-        xfree(s->profile_private);
-        s->profile_private = NULL;
+        xfree(vel->profile_private);
+        vel->profile_private = NULL;
     }
     /* Here one could init profile-private data */
-    s->Profile = profile;
-    s->statistics.profile_number = profile_num;
+    vel->Profile = profile;
+    vel->statistics.profile_number = profile_num;
     return TRUE;
 }
 
@@ -926,11 +926,11 @@ SetAccelerationProfile(
  */
 void
 SetDeviceSpecificAccelerationProfile(
-        DeviceVelocityPtr s,
+        DeviceVelocityPtr vel,
         PointerAccelerationProfileFunc profile)
 {
-    if(s)
-	s->deviceSpecificProfile = profile;
+    if(vel)
+	vel->deviceSpecificProfile = profile;
 }
 
 /**
@@ -939,19 +939,19 @@ SetDeviceSpecificAccelerationProfile(
  */
 DeviceVelocityPtr
 GetDevicePredictableAccelData(
-	DeviceIntPtr pDev)
+	DeviceIntPtr dev)
 {
     /*sanity check*/
-    if(!pDev){
+    if(!dev){
 	ErrorF("[dix] accel: DeviceIntPtr was NULL");
 	return NULL;
     }
-    if( pDev->valuator &&
-	pDev->valuator->accelScheme.AccelSchemeProc ==
+    if( dev->valuator &&
+	dev->valuator->accelScheme.AccelSchemeProc ==
 	    acceleratePointerPredictable &&
-	pDev->valuator->accelScheme.accelData != NULL){
+	dev->valuator->accelScheme.accelData != NULL){
 
-	return (DeviceVelocityPtr)pDev->valuator->accelScheme.accelData;
+	return (DeviceVelocityPtr)dev->valuator->accelScheme.accelData;
     }
     return NULL;
 }
@@ -967,7 +967,7 @@ GetDevicePredictableAccelData(
  */
 void
 acceleratePointerPredictable(
-    DeviceIntPtr pDev,
+    DeviceIntPtr dev,
     int first_valuator,
     int num_valuators,
     int *valuators,
@@ -977,7 +977,7 @@ acceleratePointerPredictable(
     int dx = 0, dy = 0;
     int *px = NULL, *py = NULL;
     DeviceVelocityPtr velocitydata =
-	(DeviceVelocityPtr) pDev->valuator->accelScheme.accelData;
+	(DeviceVelocityPtr) dev->valuator->accelScheme.accelData;
     float fdx, fdy, tmp; /* no need to init */
     Bool soften = TRUE;
 
@@ -1004,12 +1004,12 @@ acceleratePointerPredictable(
             soften = FALSE;
         }
 
-        if (pDev->ptrfeed && pDev->ptrfeed->ctrl.num) {
+        if (dev->ptrfeed && dev->ptrfeed->ctrl.num) {
             /* invoke acceleration profile to determine acceleration */
-            mult = ComputeAcceleration (pDev, velocitydata,
-					pDev->ptrfeed->ctrl.threshold,
-					(float)pDev->ptrfeed->ctrl.num /
-					(float)pDev->ptrfeed->ctrl.den);
+            mult = ComputeAcceleration (dev, velocitydata,
+					dev->ptrfeed->ctrl.threshold,
+					(float)dev->ptrfeed->ctrl.num /
+					(float)dev->ptrfeed->ctrl.den);
 
             if(mult != 1.0 || velocitydata->const_acceleration != 1.0) {
                 ApplySofteningAndConstantDeceleration( velocitydata,
@@ -1018,21 +1018,22 @@ acceleratePointerPredictable(
 						       (mult > 1.0) && soften);
 
                 if (dx) {
-                    tmp = mult * fdx + pDev->last.remainder[0];
+                    tmp = mult * fdx + dev->last.remainder[0];
                     /* Since it may not be apparent: lrintf() does not offer
                      * strong statements about rounding; however because we
                      * process each axis conditionally, there's no danger
                      * of a toggling remainder. Its lack of guarantees likely
                      * makes it faster on the average target. */
                     *px = lrintf(tmp);
-                    pDev->last.remainder[0] = tmp - (float)*px;
+                    dev->last.remainder[0] = tmp - (float)*px;
                 }
                 if (dy) {
-                    tmp = mult * fdy + pDev->last.remainder[1];
+                    tmp = mult * fdy + dev->last.remainder[1];
                     *py = lrintf(tmp);
-                    pDev->last.remainder[1] = tmp - (float)*py;
+                    dev->last.remainder[1] = tmp - (float)*py;
                 }
-                DebugAccelF("pos (%i | %i) remainders x: %.3f y: %.3f delta x:%.3f y:%.3f\n", *px, *py, pDev->last.remainder[0], pDev->last.remainder[1], fdx, fdy);
+                DebugAccelF("pos (%i | %i) remainders x: %.3f y: %.3f delta x:%.3f y:%.3f\n",
+                            *px, *py, dev->last.remainder[0], dev->last.remainder[1], fdx, fdy);
             }
         }
     }
@@ -1049,7 +1050,7 @@ acceleratePointerPredictable(
  */
 void
 acceleratePointerLightweight(
-    DeviceIntPtr pDev,
+    DeviceIntPtr dev,
     int first_valuator,
     int num_valuators,
     int *valuators,
@@ -1074,48 +1075,48 @@ acceleratePointerLightweight(
     if (!dx && !dy)
         return;
 
-    if (pDev->ptrfeed && pDev->ptrfeed->ctrl.num) {
+    if (dev->ptrfeed && dev->ptrfeed->ctrl.num) {
         /* modeled from xf86Events.c */
-        if (pDev->ptrfeed->ctrl.threshold) {
-            if ((abs(dx) + abs(dy)) >= pDev->ptrfeed->ctrl.threshold) {
-                pDev->last.remainder[0] = ((float)dx *
-                                             (float)(pDev->ptrfeed->ctrl.num)) /
-                                             (float)(pDev->ptrfeed->ctrl.den) +
-                                            pDev->last.remainder[0];
+        if (dev->ptrfeed->ctrl.threshold) {
+            if ((abs(dx) + abs(dy)) >= dev->ptrfeed->ctrl.threshold) {
+                dev->last.remainder[0] = ((float)dx *
+                                             (float)(dev->ptrfeed->ctrl.num)) /
+                                             (float)(dev->ptrfeed->ctrl.den) +
+                                            dev->last.remainder[0];
                 if (px) {
-                    *px = (int)pDev->last.remainder[0];
-                    pDev->last.remainder[0] = pDev->last.remainder[0] -
+                    *px = (int)dev->last.remainder[0];
+                    dev->last.remainder[0] = dev->last.remainder[0] -
                                                 (float)(*px);
                 }
 
-                pDev->last.remainder[1] = ((float)dy *
-                                             (float)(pDev->ptrfeed->ctrl.num)) /
-                                             (float)(pDev->ptrfeed->ctrl.den) +
-                                            pDev->last.remainder[1];
+                dev->last.remainder[1] = ((float)dy *
+                                             (float)(dev->ptrfeed->ctrl.num)) /
+                                             (float)(dev->ptrfeed->ctrl.den) +
+                                            dev->last.remainder[1];
                 if (py) {
-                    *py = (int)pDev->last.remainder[1];
-                    pDev->last.remainder[1] = pDev->last.remainder[1] -
+                    *py = (int)dev->last.remainder[1];
+                    dev->last.remainder[1] = dev->last.remainder[1] -
                                                 (float)(*py);
                 }
             }
         }
         else {
 	    mult = pow((float)dx * (float)dx + (float)dy * (float)dy,
-                       ((float)(pDev->ptrfeed->ctrl.num) /
-                        (float)(pDev->ptrfeed->ctrl.den) - 1.0) /
+                       ((float)(dev->ptrfeed->ctrl.num) /
+                        (float)(dev->ptrfeed->ctrl.den) - 1.0) /
                        2.0) / 2.0;
             if (dx) {
-                pDev->last.remainder[0] = mult * (float)dx +
-                                            pDev->last.remainder[0];
-                *px = (int)pDev->last.remainder[0];
-                pDev->last.remainder[0] = pDev->last.remainder[0] -
+                dev->last.remainder[0] = mult * (float)dx +
+                                            dev->last.remainder[0];
+                *px = (int)dev->last.remainder[0];
+                dev->last.remainder[0] = dev->last.remainder[0] -
                                             (float)(*px);
             }
             if (dy) {
-                pDev->last.remainder[1] = mult * (float)dy +
-                                            pDev->last.remainder[1];
-                *py = (int)pDev->last.remainder[1];
-                pDev->last.remainder[1] = pDev->last.remainder[1] -
+                dev->last.remainder[1] = mult * (float)dy +
+                                            dev->last.remainder[1];
+                *py = (int)dev->last.remainder[1];
+                dev->last.remainder[1] = dev->last.remainder[1] -
                                             (float)(*py);
             }
         }
diff --git a/include/ptrveloc.h b/include/ptrveloc.h
index 70d1789..317bc26 100644
--- a/include/ptrveloc.h
+++ b/include/ptrveloc.h
@@ -91,10 +91,10 @@ typedef struct _DeviceVelocityRec {
 
 
 extern _X_EXPORT void
-InitVelocityData(DeviceVelocityPtr s);
+InitVelocityData(DeviceVelocityPtr vel);
 
 extern _X_EXPORT void
-InitTrackers(DeviceVelocityPtr s, int ntracker);
+InitTrackers(DeviceVelocityPtr vel, int ntracker);
 
 extern _X_EXPORT short
 ProcessVelocityData2D(DeviceVelocityPtr vel, int dx, int dy, int time);
@@ -110,24 +110,24 @@ extern _X_EXPORT BOOL
 InitializePredictableAccelerationProperties(DeviceIntPtr dev);
 
 extern _X_EXPORT int
-SetAccelerationProfile(DeviceVelocityPtr s, int profile_num);
+SetAccelerationProfile(DeviceVelocityPtr vel, int profile_num);
 
 extern _X_EXPORT DeviceVelocityPtr
-GetDevicePredictableAccelData(DeviceIntPtr pDev);
+GetDevicePredictableAccelData(DeviceIntPtr dev);
 
 extern _X_EXPORT void
-SetDeviceSpecificAccelerationProfile(DeviceVelocityPtr s,
+SetDeviceSpecificAccelerationProfile(DeviceVelocityPtr vel,
                                      PointerAccelerationProfileFunc profile);
 
 extern _X_EXPORT void
-AccelerationDefaultCleanup(DeviceIntPtr pDev);
+AccelerationDefaultCleanup(DeviceIntPtr dev);
 
 extern _X_EXPORT void
-acceleratePointerPredictable(DeviceIntPtr pDev, int first_valuator,
+acceleratePointerPredictable(DeviceIntPtr dev, int first_valuator,
                              int num_valuators, int *valuators, int evtime);
 
 extern _X_EXPORT void
-acceleratePointerLightweight(DeviceIntPtr pDev, int first_valuator,
-                         int num_valuators, int *valuators, int ignore);
+acceleratePointerLightweight(DeviceIntPtr dev, int first_valuator,
+                             int num_valuators, int *valuators, int ignored);
 
 #endif  /* POINTERVELOCITY_H */
commit 373e8c960d00e2b8c2250dd3f66859b081e14854
Author: Simon Thum <simon.thum at gmx.de>
Date:   Wed Jun 24 11:16:24 2009 +0200

    dix: improve pointer acceleration API
    
    This makes the ptr accel api actually sensible from a driver
    perspective, since it avoids superfluous device lookups.
    Also, makes independent accel contexts possible.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c
index dd26477..a0a4d2e 100644
--- a/dix/ptrveloc.c
+++ b/dix/ptrveloc.c
@@ -63,7 +63,7 @@
 int
 SetAccelerationProfile(DeviceVelocityPtr s, int profile_num);
 static float
-SimpleSmoothProfile(DeviceVelocityPtr pVel, float velocity,
+SimpleSmoothProfile(DeviceIntPtr dev, DeviceVelocityPtr vel, float velocity,
                     float threshold, float acc);
 static PointerAccelerationProfileFunc
 GetAccelerationProfile(DeviceVelocityPtr s, int profile_num);
@@ -108,7 +108,7 @@ InitVelocityData(DeviceVelocityPtr s)
 /**
  * Clean up
  */
-static void
+void
 FreeVelocityData(DeviceVelocityPtr s){
     xfree(s->tracker);
     SetAccelerationProfile(s, PROFILE_UNINITIALIZE);
@@ -555,7 +555,7 @@ QueryTrackers(DeviceVelocityPtr s, int cur_t){
  * Perform velocity approximation based on 2D 'mickeys' (mouse motion delta).
  * return true if non-visible state reset is suggested
  */
-static short
+short
 ProcessVelocityData2D(
     DeviceVelocityPtr s,
     int dx,
@@ -616,19 +616,20 @@ ApplySofteningAndConstantDeceleration(
 /*
  * compute the acceleration for given velocity and enforce min_acceleartion
  */
-static float
+float
 BasicComputeAcceleration(
-    DeviceVelocityPtr pVel,
+    DeviceIntPtr dev,
+    DeviceVelocityPtr vel,
     float velocity,
     float threshold,
     float acc){
 
     float result;
-    result = pVel->Profile(pVel, velocity, threshold, acc);
+    result = vel->Profile(dev, vel, velocity, threshold, acc);
 
     /* enforce min_acceleration */
-    if (result < pVel->min_acceleration)
-	result = pVel->min_acceleration;
+    if (result < vel->min_acceleration)
+	result = vel->min_acceleration;
     return result;
 }
 
@@ -637,6 +638,7 @@ BasicComputeAcceleration(
  */
 static float
 ComputeAcceleration(
+    DeviceIntPtr dev,
     DeviceVelocityPtr vel,
     float threshold,
     float acc){
@@ -655,9 +657,11 @@ ComputeAcceleration(
 	 * current and previous velocity.
 	 * Though being the more natural choice, it causes a minor delay
 	 * in comparison, so it can be disabled. */
-	res = BasicComputeAcceleration(vel, vel->velocity, threshold, acc);
-	res += BasicComputeAcceleration(vel, vel->last_velocity, threshold, acc);
-	res += 4.0f * BasicComputeAcceleration(vel,
+	res = BasicComputeAcceleration(
+	          dev, vel, vel->velocity, threshold, acc);
+	res += BasicComputeAcceleration(
+	          dev, vel, vel->last_velocity, threshold, acc);
+	res += 4.0f * BasicComputeAcceleration(dev, vel,
 	                   (vel->last_velocity + vel->velocity) / 2,
 	                   threshold, acc);
 	res /= 6.0f;
@@ -665,7 +669,8 @@ ComputeAcceleration(
 	            vel->velocity, vel->last_velocity, res);
         return res;
     }else{
-	res = BasicComputeAcceleration(vel, vel->velocity, threshold, acc);
+	res = BasicComputeAcceleration(dev, vel,
+	                               vel->velocity, threshold, acc);
 	DebugAccelF("(dix ptracc) profile sample [%.2f] is %.3f\n",
                vel->velocity, res);
 	return res;
@@ -682,7 +687,8 @@ ComputeAcceleration(
  */
 static float
 PolynomialAccelerationProfile(
-    DeviceVelocityPtr pVel,
+    DeviceIntPtr dev,
+    DeviceVelocityPtr vel,
     float velocity,
     float ignored,
     float acc)
@@ -697,18 +703,21 @@ PolynomialAccelerationProfile(
  */
 static float
 ClassicProfile(
-    DeviceVelocityPtr pVel,
+    DeviceIntPtr dev,
+    DeviceVelocityPtr vel,
     float velocity,
     float threshold,
     float acc)
 {
-    if (threshold) {
-	return SimpleSmoothProfile (pVel,
+    if (threshold > 0) {
+	return SimpleSmoothProfile (dev,
+	                            vel,
 	                            velocity,
                                     threshold,
                                     acc);
     } else {
-	return PolynomialAccelerationProfile (pVel,
+	return PolynomialAccelerationProfile (dev,
+	                                      vel,
 	                                      velocity,
                                               0,
                                               acc);
@@ -726,7 +735,8 @@ ClassicProfile(
  */
 static float
 PowerProfile(
-    DeviceVelocityPtr pVel,
+    DeviceIntPtr dev,
+    DeviceVelocityPtr vel,
     float velocity,
     float threshold,
     float acc)
@@ -736,9 +746,9 @@ PowerProfile(
     acc = (acc-1.0) * 0.1f + 1.0; /* without this, acc of 2 is unuseable */
 
     if (velocity <= threshold)
-        return pVel->min_acceleration;
+        return vel->min_acceleration;
     vel_dist = velocity - threshold;
-    return (pow(acc, vel_dist)) * pVel->min_acceleration;
+    return (pow(acc, vel_dist)) * vel->min_acceleration;
 }
 
 
@@ -763,7 +773,8 @@ CalcPenumbralGradient(float x){
  */
 static float
 SimpleSmoothProfile(
-    DeviceVelocityPtr pVel,
+    DeviceIntPtr dev,
+    DeviceVelocityPtr vel,
     float velocity,
     float threshold,
     float acc)
@@ -788,7 +799,8 @@ SimpleSmoothProfile(
  */
 static float
 SmoothLinearProfile(
-    DeviceVelocityPtr pVel,
+    DeviceIntPtr dev,
+    DeviceVelocityPtr vel,
     float velocity,
     float threshold,
     float acc)
@@ -811,14 +823,15 @@ SmoothLinearProfile(
         res = nv * 2.0f / M_PI  /* steepness of gradient at 0.5 */
               + 1.0f; /* gradient crosses 2|1 */
     }
-    res += pVel->min_acceleration;
+    res += vel->min_acceleration;
     return res;
 }
 
 
 static float
 LinearProfile(
-    DeviceVelocityPtr pVel,
+    DeviceIntPtr dev,
+    DeviceVelocityPtr vel,
     float velocity,
     float threshold,
     float acc)
@@ -829,7 +842,8 @@ LinearProfile(
 
 static float
 NoProfile(
-    DeviceVelocityPtr pVel,
+    DeviceIntPtr dev,
+    DeviceVelocityPtr vel,
     float velocity,
     float threshold,
     float acc)
@@ -992,7 +1006,7 @@ acceleratePointerPredictable(
 
         if (pDev->ptrfeed && pDev->ptrfeed->ctrl.num) {
             /* invoke acceleration profile to determine acceleration */
-            mult = ComputeAcceleration (velocitydata,
+            mult = ComputeAcceleration (pDev, velocitydata,
 					pDev->ptrfeed->ctrl.threshold,
 					(float)pDev->ptrfeed->ctrl.num /
 					(float)pDev->ptrfeed->ctrl.den);
diff --git a/include/ptrveloc.h b/include/ptrveloc.h
index 83d188c..70d1789 100644
--- a/include/ptrveloc.h
+++ b/include/ptrveloc.h
@@ -1,6 +1,6 @@
 /*
  *
- * Copyright © 2006-2008 Simon Thum             simon dot thum at gmx dot de
+ * Copyright © 2006-2009 Simon Thum             simon dot thum at gmx dot de
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -47,8 +47,8 @@ struct _DeviceVelocityRec;
  * returns actual acceleration depending on velocity, acceleration control,...
  */
 typedef float (*PointerAccelerationProfileFunc)
-              (struct _DeviceVelocityRec* /*pVel*/,
-               float /*velocity*/, float /*threshold*/, float /*acc*/);
+              (DeviceIntPtr dev, struct _DeviceVelocityRec* vel,
+               float velocity, float threshold, float accelCoeff);
 
 /**
  * a motion history, with just enough information to
@@ -96,8 +96,18 @@ InitVelocityData(DeviceVelocityPtr s);
 extern _X_EXPORT void
 InitTrackers(DeviceVelocityPtr s, int ntracker);
 
+extern _X_EXPORT short
+ProcessVelocityData2D(DeviceVelocityPtr vel, int dx, int dy, int time);
+
+extern _X_EXPORT float
+BasicComputeAcceleration(DeviceIntPtr dev, DeviceVelocityPtr vel,
+    float velocity, float threshold, float acc);
+
+extern _X_EXPORT void
+FreeVelocityData(DeviceVelocityPtr vel);
+
 extern _X_EXPORT BOOL
-InitializePredictableAccelerationProperties(DeviceIntPtr pDev);
+InitializePredictableAccelerationProperties(DeviceIntPtr dev);
 
 extern _X_EXPORT int
 SetAccelerationProfile(DeviceVelocityPtr s, int profile_num);
commit b8050bb6deebdb1ee60731f63884ffca575c09ce
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Sat Jun 27 15:28:34 2009 -0700

    XQuartz: Don't leave zombied processes at startup
    (cherry picked from commit 40c1406830588fa85d880e9f4e9ca570db1db306)

diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index fd70f26..ef5d757 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -44,6 +44,7 @@
 #include <sys/un.h>
 
 #include <sys/time.h>
+#include <fcntl.h>
 
 #include <mach/mach.h>
 #include <mach/mach_error.h>
@@ -514,8 +515,43 @@ int main(int argc, char **argv, char **envp) {
      * thread handle it.
      */
     if(!listenOnly) {
-        if(fork() == 0) {
-            return startup_trigger(argc, argv, envp);
+        pid_t child1, child2;
+        int status;
+
+        /* Do the fork-twice trick to avoid having to reap zombies */
+        child1 = fork();
+        switch (child1) {
+            case -1:                                /* error */
+                break;
+
+            case 0:                                 /* child1 */
+                child2 = fork();
+
+                switch (child2) {
+                    int max_files, i;
+
+                    case -1:                            /* error */
+                        break;
+
+                    case 0:                             /* child2 */
+                        /* close all open files except for standard streams */
+                        max_files = sysconf(_SC_OPEN_MAX);
+                        for(i = 3; i < max_files; i++)
+                            close(i);
+
+                        /* ensure stdin is on /dev/null */
+                        close(0);
+                        open("/dev/null", O_RDONLY);
+
+                        return startup_trigger(argc, argv, envp);
+
+                    default:                            /* parent (child1) */
+                        _exit(0);
+                }
+                break;
+
+            default:                                /* parent */
+              waitpid(child1, &status, 0);
         }
     }
     
commit aaff92c8c22a47804a21010d023ef76d82e7ec7e
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Sat Jun 27 14:40:03 2009 -0700

    XQuartz: 64bit fix for screen origin in AppleWM
    (cherry picked from commit 60a757d2802a5c34acd91ca9a052937b5a169ede)

diff --git a/hw/xquartz/applewm.c b/hw/xquartz/applewm.c
index ebfd256..418c5de 100644
--- a/hw/xquartz/applewm.c
+++ b/hw/xquartz/applewm.c
@@ -137,7 +137,7 @@ AppleWMSetScreenOrigin(
     WindowPtr pWin
 )
 {
-    long data[2];
+    int32_t data[2];
 
     data[0] = (dixScreenOrigins[pWin->drawable.pScreen->myNum].x
                 + darwinMainScreenX);
commit cabcc1a7ad697dde915794ddcea6a300f66b0a28
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Sat Jun 27 10:40:59 2009 -0700

    XQuartz: More localization updates
    (cherry picked from commit 5925c1f48ad05bf94195b986c1fdefc52a20ae42)

diff --git a/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/designable.nib
index ab78847..61c130c 100644
--- a/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/designable.nib
@@ -2,13 +2,13 @@
 <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">10A314</string>
-		<string key="IBDocument.InterfaceBuilderVersion">718</string>
-		<string key="IBDocument.AppKitVersion">1013</string>
-		<string key="IBDocument.HIToolboxVersion">415.00</string>
+		<string key="IBDocument.SystemVersion">10A354</string>
+		<string key="IBDocument.InterfaceBuilderVersion">729</string>
+		<string key="IBDocument.AppKitVersion">1019</string>
+		<string key="IBDocument.HIToolboxVersion">421.00</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
-			<string key="NS.object.0">718</string>
+			<string key="NS.object.0">729</string>
 		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
diff --git a/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/keyedobjects.nib
index 5e6d2f0..8093366 100644
Binary files a/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/Italian.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/Italian.lproj/main.nib/designable.nib
index dc9548f..ab4fb44 100644
--- a/hw/xquartz/bundle/Resources/Italian.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/Italian.lproj/main.nib/designable.nib
@@ -1,13 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">9C31</string>
-		<string key="IBDocument.InterfaceBuilderVersion">677</string>
-		<string key="IBDocument.AppKitVersion">949.26</string>
-		<string key="IBDocument.HIToolboxVersion">352.00</string>
+		<string key="IBDocument.SystemVersion">10A354</string>
+		<string key="IBDocument.InterfaceBuilderVersion">728</string>
+		<string key="IBDocument.AppKitVersion">1019</string>
+		<string key="IBDocument.HIToolboxVersion">421.00</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+			<string key="NS.object.0">728</string>
+		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
+			<integer value="29"/>
 		</object>
 		<object class="NSArray" key="IBDocument.PluginDependencies">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -15,7 +20,7 @@
 		</object>
 		<object class="NSMutableDictionary" key="IBDocument.Metadata">
 			<bool key="EncodedWithXMLCoder">YES</bool>
-			<object class="NSArray" key="dict.sortedKeys">
+			<object class="NSArray" key="dict.sortedKeys" id="0">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 			</object>
 			<object class="NSMutableArray" key="dict.values">
@@ -302,8 +307,8 @@
 								<object class="NSMenuItem" id="1036389925">
 									<reference key="NSMenu" ref="96874957"/>
 									<string key="NSTitle">Naviga tra le finestre</string>
-									<string key="NSKeyEquiv">`</string>
-									<int key="NSKeyEquivModMask">1048840</int>
+									<string key="NSKeyEquiv">&lt;</string>
+									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
@@ -311,8 +316,8 @@
 								<object class="NSMenuItem" id="369641893">
 									<reference key="NSMenu" ref="96874957"/>
 									<string key="NSTitle">Inverti navigazione tra le finestre</string>
-									<string key="NSKeyEquiv">~</string>
-									<int key="NSKeyEquivModMask">1179914</int>
+									<string key="NSKeyEquiv">&gt;</string>
+									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
@@ -428,7 +433,7 @@
 													<string key="NSContents">Emula mouse a tre pulsanti</string>
 													<object class="NSFont" key="NSSupport" id="463863101">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">1044</int>
 													</object>
 													<reference key="NSControlView" ref="119157981"/>
@@ -459,7 +464,7 @@
 													<string key="NSContents">Se abilitati, gli equivalenti da tastiera della barra dei menu potrebbero interferire con le applicazioni X11 che utilizzano il modificatore Meta.</string>
 													<object class="NSFont" key="NSSupport" id="26">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.100000e+01</double>
+														<double key="NSSize">11</double>
 														<int key="NSfFlags">3100</int>
 													</object>
 													<string key="NSPlaceholderString"/>
@@ -470,7 +475,7 @@
 														<string key="NSColorName">controlColor</string>
 														<object class="NSColor" key="NSColor" id="239012588">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2ODY1AA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -534,8 +539,7 @@ Q29tYW5kby4KA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="666057093">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">Q29uc2VudGUgbGUgbW9kaWZpY2hlIGRlbCBtZW51IHRhc3RpZXJhIHBlciByaXNjcml2ZXJlIGwnYXR0
-dWFsZSBtYXBwYSBkZWkgdGFzdGkgWDExLg</string>
+													<string key="NSContents">Consente le modifiche del menu tastiera per riscrivere l'attuale mappa dei tasti X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="31160162"/>
@@ -613,8 +617,7 @@ dWFsZSBtYXBwYSBkZWkgdGFzdGkgWDExLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="624655599">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">SSBiaXAgZGkgWDExIHV0aWxpenplcmFubm8gbCdhdnZpc28gc2lzdGVtYSwgY29tZSBkZWZpbml0byBu
-ZWwgcGFubmVsbG8gUHJlZmVyZW56ZSBkaSBTaXN0ZW1hIGRlZ2xpIEVmZmV0dGkgc29ub3JpLg</string>
+													<string key="NSContents">I bip di X11 utilizzeranno l'avviso sistema, come definito nel pannello Preferenze di Sistema degli Effetti sonori.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="1039016593"/>
@@ -637,7 +640,7 @@ ZWwgcGFubmVsbG8gUHJlZmVyZW56ZSBkaSBTaXN0ZW1hIGRlZ2xpIEVmZmV0dGkgc29ub3JpLg</stri
 													<int key="NSButtonFlags2">1</int>
 													<object class="NSFont" key="NSAlternateImage">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">16</int>
 													</object>
 													<string key="NSAlternateContents"/>
@@ -704,6 +707,7 @@ ZWwgcGFubmVsbG8gUHJlZmVyZW56ZSBkaSBTaXN0ZW1hIGRlZ2xpIEVmZmV0dGkgc29ub3JpLg</stri
 																<reference key="NSTarget" ref="633115429"/>
 															</object>
 														</object>
+														<reference key="NSMenuFont" ref="463863101"/>
 													</object>
 													<int key="NSPreferredEdge">3</int>
 													<bool key="NSUsesItemFromMenu">YES</bool>
@@ -754,7 +758,7 @@ ZWwgcGFubmVsbG8gUHJlZmVyZW56ZSBkaSBTaXN0ZW1hIGRlZ2xpIEVmZmV0dGkgc29ub3JpLg</stri
 												<object class="NSButtonCell" key="NSCell" id="631531164">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">TW9kYWxpdMOgIGEgdHV0dG8gc2NoZXJtbw</string>
+													<string key="NSContents">Modalità a tutto schermo</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477203622"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -776,8 +780,7 @@ ZWwgcGFubmVsbG8gUHJlZmVyZW56ZSBkaSBTaXN0ZW1hIGRlZ2xpIEVmZmV0dGkgc29ub3JpLg</stri
 												<object class="NSButtonCell" key="NSCell" id="917248662">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">TW9zdHJhIGF1dG9tYXRpY2FtZW50ZSBsYSBiYXJyYSBkZWkgbWVudSBpbiBtb2RhbGl0w6AgYSB0dXR0
-byBzY2hlcm1vA</string>
+													<string key="NSContents">Mostra automaticamente la barra dei menu in modalità a tutto schermo</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="57246850"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -799,9 +802,7 @@ byBzY2hlcm1vA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="761107402">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWJpbGl0YSBsYSBmaW5lc3RyYSByb290IGRpIFgxMS4gVXRpbGl6emEgbGEgY29tYmluYXppb25lIGRp
-IHRhc3RpIENvbWFuZG8tT3B6aW9uZS1BIHBlciBhdHRpdmFyZSBlIGRpc2F0dGl2YXJlIGxhIG1vZGFs
-aXTDoCBhIHR1dHRvIHNjaGVybW8uA</string>
+													<string key="NSContents">Abilita la finestra root di X11. Utilizza la combinazione di tasti Comando-Opzione-A per attivare e disattivare la modalità a tutto schermo.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="298603383"/>
@@ -856,9 +857,7 @@ aXTDoCBhIHR1dHRvIHNjaGVybW8uA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="572508492">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWJpbGl0YSBsJ2VsZW1lbnRvIOKAnGNvcGlh4oCdIGRlbCBtZW51IGUgY29uc2VudGkgbGEgc2luY3Jv
-bml6emF6aW9uZSBkZWdsaSBhcHB1bnRpIGRpIE9TWCBlIGkgYnVmZmVyIENMSVBCT0FSRCBlIFBSSU1B
-UlkgZGkgWDExLg</string>
+													<string key="NSContents">Abilita l'elemento “copia” del menu e consenti la sincronizzazione degli appunti di OSX e i buffer CLIPBOARD e PRIMARY di X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="386152084"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1032,9 +1031,7 @@ UlkgZGkgWDExLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="399127858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">UXVhbmRvIGlsIHJpcXVhZHJvIMOoIGF0dGl2YXRvLCBmYWNlbmRvIGNsaWMgc3UgdW5hIGZpbmVzdHJh
-IGluYXR0aXZhLCBpbCBjbGljIGRlbCBtb3VzZSBwYXNzZXLDoCBhIHRhbGUgZmluZXN0cmEgZSBsYSBh
-dHRpdmVyw6AuA</string>
+													<string key="NSContents">Quando il riquadro è attivato, facendo clic su una finestra inattiva, il clic del mouse passerà a tale finestra e la attiverà.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="290578835"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1072,8 +1069,7 @@ dHRpdmVyw6AuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="183409141">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">TGEgbWVzc2EgYSBmdW9jbyBkZWxsYSBmaW5lc3RyYSBkaSBYMTEgYXZ2aWVuZSBtZWRpYW50ZSBpbCBj
-dXJzb3JlLiBRdWVzdG8gcHXDsiBhdmVyZSBlZmZldHRpIGNvbnRyb3Byb2R1Y2VudGkuA</string>
+													<string key="NSContents">La messa a fuoco della finestra di X11 avviene mediante il cursore. Questo può avere effetti controproducenti.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="138261120"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1111,9 +1107,7 @@ dXJzb3JlLiBRdWVzdG8gcHXDsiBhdmVyZSBlZmZldHRpIGNvbnRyb3Byb2R1Y2VudGkuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="989804990">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">UXVhbmRvIGlsIHJpcXVhZHJvIMOoIGF0dGl2YXRvLCBsYSBjcmVhemlvbmUgZGkgdW5hIG51b3ZhIGZp
-bmVzdHJhIGRpIFgxMSBmYXLDoCBzcG9zdGFyZSBYMTEuYXBwIGluIHByaW1vIHBpYW5vIChpbnZlY2Ug
-ZGkgRmluZGVyLmFwcCwgVGVybWluYWwuYXBwLCBldGMuKQ</string>
+													<string key="NSContents">Quando il riquadro è attivato, la creazione di una nuova finestra di X11 farà spostare X11.app in primo piano (invece di Finder.app, Terminal.app, etc.)</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="57161931"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1186,10 +1180,7 @@ ZGkgRmluZGVyLmFwcCwgVGVybWluYWwuYXBwLCBldGMuKQ</string>
 												<object class="NSTextFieldCell" key="NSCell" id="53243865">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWxsJ2F2dmlvIGRpIFgxMSB2ZXJyYW5ubyBjcmVhdGUgbGUgY2hpYXZpIFhhdXRob3JpdHkgcGVyIGls
-IGNvbnRyb2xsbyBkJ2FjY2Vzc28uIFNlIGwnaW5kaXJpenpvIElQIGRlbCBzaXN0ZW1hIGNhbWJpYSwg
-dGFsaSBjaGlhdmkgbm9uIHNvbm8gcGnDuSB2YWxpZGUuIFF1ZXN0YSBzaXR1YXppb25lIHBvdHJlYmJl
-IGJsb2NjYXJlIGwnYXZ2aW8gZGVsbGUgYXBwbGljYXppb25pIFgxMS4</string>
+													<string key="NSContents">All'avvio di X11 verranno create le chiavi Xauthority per il controllo d'accesso. Se l'indirizzo IP del sistema cambia, tali chiavi non sono più valide. Questa situazione potrebbe bloccare l'avvio delle applicazioni X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="168436707"/>
@@ -1206,10 +1197,7 @@ IGJsb2NjYXJlIGwnYXZ2aW8gZGVsbGUgYXBwbGljYXppb25pIFgxMS4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="390084685">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">U2UgcG9zc2liaWxlLCBwZXIgZ2FyYW50aXJlIGxhIHNpY3VyZXp6YSBkZWwgc2lzdGVtYSBkZXZlIGVz
-c2VyZSBpbm9sdHJlIGFiaWxpdGF0YSBsYSBmdW56aW9uZSBBdXRlbnRpY2EgY29ubmVzc2lvbmkuIFF1
-YW5kbyBxdWVzdGEgZnVuemlvbmUgbm9uIMOoIGF0dGl2YSwgbm9uIHNvbm8gY29uc2VudGl0ZSBsZSBj
-b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
+													<string key="NSContents">Se possibile, per garantire la sicurezza del sistema deve essere inoltre abilitata la funzione Autentica connessioni. Quando questa funzione non è attiva, non sono consentite le connessioni dalle applicazioni remote.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="363817195"/>
@@ -1355,17 +1343,17 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 											<object class="NSMutableArray" key="NSTableColumns">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<object class="NSTableColumn" id="938444323">
-													<double key="NSWidth">1.327310e+02</double>
-													<double key="NSMinWidth">6.273100e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">132.73100280761719</double>
+													<double key="NSMinWidth">62.730998992919922</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Nome</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor" id="113872566">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+															<bytes key="NSWhite">MC4zMzMzMzI5ODU2AA</bytes>
 														</object>
 														<object class="NSColor" key="NSTextColor" id="249576247">
 															<int key="NSColorSpace">6</int>
@@ -1394,12 +1382,12 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 													<string key="NSHeaderToolTip"/>
 												</object>
 												<object class="NSTableColumn" id="84282687">
-													<double key="NSWidth">1.100000e+02</double>
-													<double key="NSMinWidth">4.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">110</double>
+													<double key="NSMinWidth">40</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Comando</string>
 														<reference key="NSSupport" ref="26"/>
 														<reference key="NSBackgroundColor" ref="113872566"/>
@@ -1422,12 +1410,12 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 													<string key="NSHeaderToolTip"/>
 												</object>
 												<object class="NSTableColumn" id="242608782">
-													<double key="NSWidth">8.100000e+01</double>
-													<double key="NSMinWidth">1.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">81</double>
+													<double key="NSMinWidth">10</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">67239424</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Abbreviazione</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor">
@@ -1444,7 +1432,7 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 														<string key="NSContents">Cella di testo</string>
 														<object class="NSFont" key="NSSupport">
 															<string key="NSName">LucidaGrande</string>
-															<double key="NSSize">1.200000e+01</double>
+															<double key="NSSize">12</double>
 															<int key="NSfFlags">16</int>
 														</object>
 														<string key="NSPlaceholderString"/>
@@ -1465,8 +1453,8 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 													<string key="NSHeaderToolTip"/>
 												</object>
 											</object>
-											<double key="NSIntercellSpacingWidth">3.000000e+00</double>
-											<double key="NSIntercellSpacingHeight">2.000000e+00</double>
+											<double key="NSIntercellSpacingWidth">3</double>
+											<double key="NSIntercellSpacingHeight">2</double>
 											<reference key="NSBackgroundColor" ref="822946413"/>
 											<object class="NSColor" key="NSGridColor">
 												<int key="NSColorSpace">6</int>
@@ -1477,12 +1465,15 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 													<bytes key="NSWhite">MC41AA</bytes>
 												</object>
 											</object>
-											<double key="NSRowHeight">1.700000e+01</double>
+											<double key="NSRowHeight">17</double>
 											<int key="NSTvFlags">1379958784</int>
+											<reference key="NSDelegate"/>
+											<reference key="NSDataSource"/>
 											<int key="NSColumnAutoresizingStyle">1</int>
 											<int key="NSDraggingSourceMaskForLocal">-1</int>
 											<int key="NSDraggingSourceMaskForNonLocal">0</int>
 											<bool key="NSAllowsTypeSelect">YES</bool>
+											<int key="NSTableViewDraggingDestinationStyle">0</int>
 										</object>
 									</object>
 									<string key="NSFrame">{{1, 17}, {333, 198}}</string>
@@ -1499,7 +1490,7 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 									<reference key="NSSuperview" ref="1063387772"/>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">9.949238e-01</double>
+									<double key="NSPercent">0.99492377042770386</double>
 								</object>
 								<object class="NSScroller" id="17278747">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1509,7 +1500,7 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 									<int key="NSsFlags">1</int>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">6.885246e-01</double>
+									<double key="NSPercent">0.68852460384368896</double>
 								</object>
 								<object class="NSClipView" id="672307654">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1610,7 +1601,7 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 								</object>
 								<object class="NSMenuItem" id="1032342329">
 									<reference key="NSMenu" ref="48278059"/>
-									<string type="base64-UTF8" key="NSTitle">UGVyc29uYWxpenph4oCmA</string>
+									<string key="NSTitle">Personalizza…</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -2185,28 +2176,26 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="IBObjectRecord">
 						<int key="objectID">0</int>
-						<object class="NSArray" key="object" id="330408435">
-							<bool key="EncodedWithXMLCoder">YES</bool>
-						</object>
+						<reference key="object" ref="0"/>
 						<reference key="children" ref="904585544"/>
 						<nil key="parent"/>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-2</int>
 						<reference key="object" ref="815810918"/>
-						<reference key="parent" ref="330408435"/>
-						<string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">File's Owner</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-1</int>
 						<reference key="object" ref="941939442"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">First Responder</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-3</int>
 						<reference key="object" ref="951368722"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">Application</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2220,7 +2209,7 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 							<reference ref="868031522"/>
 							<reference ref="551174276"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">MainMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2465,7 +2454,7 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 					<object class="IBObjectRecord">
 						<int key="objectID">196</int>
 						<reference key="object" ref="485884620"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">X11Controller</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2475,7 +2464,7 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="941366957"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">PrefsPanel</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2739,7 +2728,7 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="85544634"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">EditPrograms</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2762,7 +2751,7 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 							<reference ref="318286212"/>
 							<reference ref="511651072"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">DockMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -3314,10 +3303,8 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 			</object>
 			<object class="NSMutableDictionary" key="flattenedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSMutableArray" key="dict.sortedKeys">
+				<object class="NSArray" key="dict.sortedKeys">
 					<bool key="EncodedWithXMLCoder">YES</bool>
-					<string>-1.IBPluginDependency</string>
-					<string>-2.IBPluginDependency</string>
 					<string>-3.IBPluginDependency</string>
 					<string>-3.ImportedFromIB2</string>
 					<string>100292.IBPluginDependency</string>
@@ -3373,7 +3360,6 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 					<string>169.editorWindowContentRectSynchronizationRect</string>
 					<string>19.IBPluginDependency</string>
 					<string>19.ImportedFromIB2</string>
-					<string>196.IBPluginDependency</string>
 					<string>196.ImportedFromIB2</string>
 					<string>200295.IBPluginDependency</string>
 					<string>200295.IBShouldRemoveOnLegacySave</string>
@@ -3388,6 +3374,7 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 					<string>24.ImportedFromIB2</string>
 					<string>24.editorWindowContentRectSynchronizationRect</string>
 					<string>244.IBEditorWindowLastContentRect</string>
+					<string>244.IBPluginDependency</string>
 					<string>244.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>244.IBWindowTemplateEditedContentRect</string>
 					<string>244.ImportedFromIB2</string>
@@ -3407,6 +3394,7 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 					<string>272.IBPluginDependency</string>
 					<string>272.ImportedFromIB2</string>
 					<string>285.IBEditorWindowLastContentRect</string>
+					<string>285.IBPluginDependency</string>
 					<string>285.IBViewEditorWindowController.showingBoundsRectangles</string>
 					<string>285.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>285.IBWindowTemplateEditedContentRect</string>
@@ -3607,13 +3595,11 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="1" id="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3634,272 +3620,271 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{168, 821}, {113, 23}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{202, 626}, {154, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
+					<string>{{421, 858}, {302, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>{{349, 858}, {315, 153}}</string>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{271, 666}, {301, 153}}</string>
 					<string>{{437, 548}, {664, 308}}</string>
-					<boolean value="NO" id="6"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="NO"/>
 					<string>{{437, 548}, {664, 308}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{184, 290}, {481, 345}}</string>
-					<integer value="0" id="8"/>
-					<reference ref="9"/>
+					<integer value="0"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{58, 803}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{100, 746}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{67, 585}, {546, 271}}</string>
-					<reference ref="9"/>
-					<reference ref="6"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
+					<boolean value="NO"/>
 					<string>{{67, 585}, {546, 271}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{433, 406}, {486, 327}}</string>
-					<reference ref="8"/>
-					<reference ref="9"/>
+					<integer value="0"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>{{145, 1011}, {336, 20}}</string>
+					<integer value="1"/>
+					<string>{{145, 1011}, {415, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{67, 819}, {336, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{20, 641}, {218, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{79, 616}, {218, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 				</object>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -3907,9 +3892,7 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 			<nil key="activeLocalization"/>
 			<object class="NSMutableDictionary" key="localizations">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -3947,6 +3930,15 @@ b25uZXNzaW9uaSBkYWxsZSBhcHBsaWNhemlvbmkgcmVtb3RlLg</string>
 			</object>
 		</object>
 		<int key="IBDocument.localizationMode">0</int>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+			<integer value="1050" key="NS.object.0"/>
+		</object>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+			<integer value="3000" key="NS.object.0"/>
+		</object>
+		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
 		<string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
 		<int key="IBDocument.defaultPropertyAccessControl">3</int>
 	</data>
diff --git a/hw/xquartz/bundle/Resources/Italian.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/Italian.lproj/main.nib/keyedobjects.nib
index 7cbaca9..c7fe4d2 100644
Binary files a/hw/xquartz/bundle/Resources/Italian.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/Italian.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/ru.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/ru.lproj/main.nib/designable.nib
index ed66de2..a695588 100644
--- a/hw/xquartz/bundle/Resources/ru.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/ru.lproj/main.nib/designable.nib
@@ -306,7 +306,7 @@
 								<object class="NSMenuItem" id="1036389925">
 									<reference key="NSMenu" ref="96874957"/>
 									<string key="NSTitle">Последовательное переключение окон</string>
-									<string key="NSKeyEquiv">'</string>
+									<string key="NSKeyEquiv">`</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
@@ -315,7 +315,7 @@
 								<object class="NSMenuItem" id="369641893">
 									<reference key="NSMenu" ref="96874957"/>
 									<string key="NSTitle">Обратное последовательное переключение окон</string>
-									<string key="NSKeyEquiv">'</string>
+									<string key="NSKeyEquiv">`</string>
 									<int key="NSKeyEquivModMask">1179648</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
diff --git a/hw/xquartz/bundle/Resources/ru.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/ru.lproj/main.nib/keyedobjects.nib
index 22f08fa..44f0970 100644
Binary files a/hw/xquartz/bundle/Resources/ru.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/ru.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/sv.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/sv.lproj/main.nib/designable.nib
index 695ad42..bee1e1b 100644
--- a/hw/xquartz/bundle/Resources/sv.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/sv.lproj/main.nib/designable.nib
@@ -3,12 +3,12 @@
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
 		<string key="IBDocument.SystemVersion">10A354</string>
-		<string key="IBDocument.InterfaceBuilderVersion">728</string>
+		<string key="IBDocument.InterfaceBuilderVersion">729</string>
 		<string key="IBDocument.AppKitVersion">1019</string>
 		<string key="IBDocument.HIToolboxVersion">421.00</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
-			<string key="NS.object.0">728</string>
+			<string key="NS.object.0">729</string>
 		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -397,7 +397,7 @@
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="941366957">
 					<nil key="NSNextResponder"/>
@@ -474,7 +474,7 @@
 														<string key="NSColorName">controlColor</string>
 														<object class="NSColor" key="NSColor" id="832012125">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2ODY1AA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -1248,7 +1248,7 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSFrameAutosaveName">x11_prefs</string>
 			</object>
 			<object class="NSWindowTemplate" id="604417141">
@@ -1261,7 +1261,7 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="85544634">
 					<nil key="NSNextResponder"/>
@@ -1560,7 +1560,7 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSFrameAutosaveName">x11_apps</string>
 			</object>
 			<object class="NSMenu" id="294137138">
diff --git a/hw/xquartz/bundle/Resources/sv.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/sv.lproj/main.nib/keyedobjects.nib
index 7ecbca0..b70556e 100644
Binary files a/hw/xquartz/bundle/Resources/sv.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/sv.lproj/main.nib/keyedobjects.nib differ
commit 31166c2ae0ce898c96995a8b16b58b127dc85a2f
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Fri Jun 26 16:51:22 2009 -0400

    xace: add a new hook for checking property content after it has been set.
    
    Allows security modules to enforce what property contents can be set by
    clients.  Uses the new DixPostAccess bit to distinguish between the
    existing call made during the lookup (with the old property data) and
    this new call.  Note that this only applies to writes, prepends, or
    appends to existing properties; for new properties the existing
    DixCreateAccess hook call may be used since it includes the new data.
    
    Refer to the XACE-Spec document in xorg-docs, section "Property Access."
    
    Signed-off-by: Eamon Walsh <ewalsh at tycho.nsa.gov>

diff --git a/dix/property.c b/dix/property.c
index 0929dca..9aaf248 100644
--- a/dix/property.c
+++ b/dix/property.c
@@ -253,6 +253,7 @@ dixChangeWindowProperty(ClientPtr pClient, WindowPtr pWin, Atom property,
 			pointer value, Bool sendevent)
 {
     PropertyPtr pProp;
+    PropertyRec savedProp;
     int sizeInBytes, totalSize, rc;
     pointer data;
     Mask access_mode;
@@ -307,15 +308,16 @@ dixChangeWindowProperty(ClientPtr pClient, WindowPtr pWin, Atom property,
 	    return(BadMatch);
         if ((pProp->type != type) && (mode != PropModeReplace))
             return(BadMatch);
+
+	/* save the old values for later */
+	savedProp = *pProp;
+
         if (mode == PropModeReplace)
         {
-	    if (totalSize != pProp->size * (pProp->format >> 3))
-	    {
-	    	data = (pointer)xrealloc(pProp->data, totalSize);
-	    	if (!data && len)
-		    return(BadAlloc);
-            	pProp->data = data;
-	    }
+	    data = xalloc(totalSize);
+	    if (!data && len)
+		return(BadAlloc);
+	    pProp->data = data;
 	    if (len)
 		memmove((char *)pProp->data, (char *)value, totalSize);
 	    pProp->size = len;
@@ -328,10 +330,10 @@ dixChangeWindowProperty(ClientPtr pClient, WindowPtr pWin, Atom property,
 	}
         else if (mode == PropModeAppend)
         {
-	    data = (pointer)xrealloc(pProp->data,
-				     sizeInBytes * (len + pProp->size));
+	    data = xalloc((pProp->size + len) * sizeInBytes);
 	    if (!data)
 		return(BadAlloc);
+	    memcpy(data, pProp->data, pProp->size * sizeInBytes);
             pProp->data = data;
 	    memmove(&((char *)data)[pProp->size * sizeInBytes], 
 		    (char *)value,
@@ -346,10 +348,20 @@ dixChangeWindowProperty(ClientPtr pClient, WindowPtr pWin, Atom property,
 	    memmove(&((char *)data)[totalSize], (char *)pProp->data, 
 		  (int)(pProp->size * sizeInBytes));
             memmove((char *)data, (char *)value, totalSize);
-	    xfree(pProp->data);
             pProp->data = data;
             pProp->size += len;
 	}
+
+	/* Allow security modules to check the new content */
+	access_mode |= DixPostAccess;
+	rc = XaceHookPropertyAccess(pClient, pWin, &pProp, access_mode);
+	if (rc == Success)
+	    xfree(savedProp.data);
+	else {
+	    xfree(pProp->data);
+	    *pProp = savedProp;
+	    return rc;
+	}
     }
     else
 	return rc;
commit 51105de9b0d865c4b5e5a7d9ab23c89d808d1cfa
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Fri Jun 26 16:50:12 2009 -0400

    xselinux: ignore property hook calls with the new Post access mode bit set.
    
    Signed-off-by: Eamon Walsh <ewalsh at tycho.nsa.gov>

diff --git a/Xext/xselinux.c b/Xext/xselinux.c
index 9898b29..8054230 100644
--- a/Xext/xselinux.c
+++ b/Xext/xselinux.c
@@ -913,6 +913,10 @@ SELinuxProperty(CallbackListPtr *pcbl, pointer unused, pointer calldata)
     security_id_t tsid;
     int rc;
 
+    /* Don't care about the new content check */
+    if (rec->access_mode & DixPostAccess)
+	return;
+
     subj = dixLookupPrivate(&rec->client->devPrivates, subjectKey);
     obj = dixLookupPrivate(&pProp->devPrivates, objectKey);
 
commit 10812204b3415c969bcebd3215e84d758a0b4dd8
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Fri Jun 26 16:48:24 2009 -0400

    dix: add a new DixAccess bit, "DixPostAccess".
    
    This will be used for follow-up checks after a client has written something,
    for security modules that enforce a set of valid values a client can set.
    
    Signed-off-by: Eamon Walsh <ewalsh at tycho.nsa.gov>

diff --git a/include/dixaccess.h b/include/dixaccess.h
index 3c62ee3..7180acd 100644
--- a/include/dixaccess.h
+++ b/include/dixaccess.h
@@ -49,5 +49,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define DixManageAccess		(1<<25)	/* manage object */
 #define DixDebugAccess		(1<<26)	/* debug object */
 #define DixBellAccess		(1<<27)	/* audible sound */
+#define DixPostAccess		(1<<28) /* post or follow-up call */
 
 #endif /* DIX_ACCESS_H */
commit 9480725af0275b72b24b9e1cb3b68d5b97288d01
Author: Rémi Cardona <remi at gentoo.org>
Date:   Wed Jun 24 10:12:50 2009 +0200

    xfree86: DIST_SUBDIRS should not contain variables
    
    This patch reverts a change done in commit
    800d4ceb946c93724661ebfd28afb658ca63b6b1 to add conditional XAA support
    
    Signed-off-by: Rémi Cardona <remi at gentoo.org>

diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am
index 9d5731d..eb487f6 100644
--- a/hw/xfree86/Makefile.am
+++ b/hw/xfree86/Makefile.am
@@ -24,7 +24,7 @@ SUBDIRS = common ddc i2c x86emu int10 fbdevhw os-support parser \
 	  $(DRI_SUBDIR) $(DRI2_SUBDIR) $(XF86UTILS_SUBDIR) $(DOC_SUBDIR)
 
 DIST_SUBDIRS = common ddc i2c x86emu int10 fbdevhw os-support \
-               parser ramdac shadowfb vbe vgahw $(XAA_SUBDIR) \
+               parser ramdac shadowfb vbe vgahw xaa \
                xf8_16bpp loader dixmods dri dri2 exa modes \
 	       utils doc
 
commit 84662e40c3d4141ebb298a1ad714f75056a4ab74
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Thu Jun 18 23:19:21 2009 -0400

    Xi: check for GetAttr permission when listing or querying devices.
    
    If the check fails, leave the device off the returned list of info
    structures.  Under XI2, this may cause inconsistent views of the device
    topology after a change (for example, devices disappearing from view,
    or showing as attached to a master that cannot be seen).  More work is
    needed to deal with topology changes and device relabeling.
    
    Signed-off-by: Eamon Walsh <ewalsh at tycho.nsa.gov>

diff --git a/Xi/listdev.c b/Xi/listdev.c
index 95c1532..1c847fb 100644
--- a/Xi/listdev.c
+++ b/Xi/listdev.c
@@ -306,6 +306,25 @@ ListDeviceInfo(ClientPtr client, DeviceIntPtr d, xDeviceInfoPtr dev,
     CopySwapClasses(client, d, &dev->num_classes, classbuf);
 }
 
+/***********************************************************************
+ *
+ * This procedure checks if a device should be left off the list.
+ *
+ */
+
+static Bool
+ShouldSkipDevice(ClientPtr client, DeviceIntPtr d)
+{
+    /* don't send master devices other than VCP/VCK */
+    if (!IsMaster(d) || d == inputInfo.pointer || d == inputInfo.keyboard)
+    {
+        int rc = XaceHook(XACE_DEVICE_ACCESS, client, d, DixGetAttrAccess);
+        if (rc == Success)
+            return FALSE;
+    }
+    return TRUE;
+}
+
 
 /***********************************************************************
  *
@@ -323,12 +342,10 @@ ProcXListInputDevices(ClientPtr client)
     xListInputDevicesReply rep;
     int numdevs = 0;
     int namesize = 1;	/* need 1 extra byte for strcpy */
-    int rc, size = 0;
+    int i = 0, size = 0;
     int total_length;
-    char *devbuf;
-    char *classbuf;
-    char *namebuf;
-    char *savbuf;
+    char *devbuf, *classbuf, *namebuf, *savbuf;
+    Bool *skip;
     xDeviceInfo *dev;
     DeviceIntPtr d;
 
@@ -343,55 +360,51 @@ ProcXListInputDevices(ClientPtr client)
 
     AddOtherInputDevices();
 
-    for (d = inputInfo.devices; d; d = d->next) {
-        if (IsMaster(d) &&
-                d != inputInfo.pointer &&
-                d != inputInfo.keyboard)
-            continue; /* don't send master devices other than VCP/VCK */
+    /* allocate space for saving skip value */
+    skip = xcalloc(sizeof(Bool), inputInfo.numDevices);
+    if (!skip)
+        return BadAlloc;
+
+    /* figure out which devices to skip */
+    numdevs = 0;
+    for (d = inputInfo.devices; d; d = d->next, i++) {
+        skip[i] = ShouldSkipDevice(client, d);
+        if (skip[i])
+            continue;
 
-        rc = XaceHook(XACE_DEVICE_ACCESS, client, d, DixGetAttrAccess);
-        if (rc != Success)
-            return rc;
         SizeDeviceInfo(d, &namesize, &size);
         numdevs++;
     }
 
-    for (d = inputInfo.off_devices; d; d = d->next) {
-        if (IsMaster(d) &&
-                d != inputInfo.pointer &&
-                d != inputInfo.keyboard)
-            continue; /* don't send master devices other than VCP/VCK */
+    for (d = inputInfo.off_devices; d; d = d->next, i++) {
+        skip[i] = ShouldSkipDevice(client, d);
+        if (skip[i])
+            continue;
 
-        rc = XaceHook(XACE_DEVICE_ACCESS, client, d, DixGetAttrAccess);
-        if (rc != Success)
-            return rc;
         SizeDeviceInfo(d, &namesize, &size);
         numdevs++;
     }
 
+    /* allocate space for reply */
     total_length = numdevs * sizeof(xDeviceInfo) + size + namesize;
     devbuf = (char *)xcalloc(1, total_length);
     classbuf = devbuf + (numdevs * sizeof(xDeviceInfo));
     namebuf = classbuf + size;
     savbuf = devbuf;
 
+    /* fill in and send reply */
+    i = 0;
     dev = (xDeviceInfoPtr) devbuf;
-    for (d = inputInfo.devices; d; d = d->next)
-    {
-        if (IsMaster(d) &&
-                d != inputInfo.pointer &&
-                d != inputInfo.keyboard)
-            continue; /* don't count master devices other than VCP/VCK */
+    for (d = inputInfo.devices; d; d = d->next, i++) {
+        if (skip[i])
+            continue;
 
         ListDeviceInfo(client, d, dev++, &devbuf, &classbuf, &namebuf);
     }
 
-    for (d = inputInfo.off_devices; d; d = d->next)
-    {
-        if (IsMaster(d) &&
-                d != inputInfo.pointer &&
-                d != inputInfo.keyboard)
-            continue; /* don't count master devices other than VCP/VCK */
+    for (d = inputInfo.off_devices; d; d = d->next, i++) {
+        if (skip[i])
+            continue;
 
         ListDeviceInfo(client, d, dev++, &devbuf, &classbuf, &namebuf);
     }
@@ -400,6 +413,7 @@ ProcXListInputDevices(ClientPtr client)
     WriteReplyToClient(client, sizeof(xListInputDevicesReply), &rep);
     WriteToClient(client, total_length, savbuf);
     xfree(savbuf);
+    xfree(skip);
     return Success;
 }
 
diff --git a/Xi/xiquerydevice.c b/Xi/xiquerydevice.c
index 6aa1685..33628a6 100644
--- a/Xi/xiquerydevice.c
+++ b/Xi/xiquerydevice.c
@@ -40,9 +40,11 @@
 #include "xkbsrv.h"
 #include "xserver-properties.h"
 #include "exevents.h"
+#include "xace.h"
 
 #include "xiquerydevice.h"
 
+static Bool ShouldSkipDevice(ClientPtr client, int deviceid, DeviceIntPtr d);
 static int ListDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info);
 static int SizeDeviceInfo(DeviceIntPtr dev);
 static void SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info);
@@ -65,8 +67,9 @@ ProcXIQueryDevice(ClientPtr client)
     xXIQueryDeviceReply rep;
     DeviceIntPtr dev = NULL;
     int rc = Success;
-    int len = 0;
+    int i = 0, len = 0;
     char *info, *ptr;
+    Bool *skip = NULL;
 
     REQUEST(xXIQueryDeviceReq);
     REQUEST_SIZE_MATCH(xXIQueryDeviceReq);
@@ -79,28 +82,27 @@ ProcXIQueryDevice(ClientPtr client)
             client->errorValue = stuff->deviceid;
             return rc;
         }
-    }
-
-    if (dev)
         len += SizeDeviceInfo(dev);
+    }
     else
     {
-        len = 0;
-        for (dev = inputInfo.devices; dev; dev = dev->next)
+        skip = xcalloc(sizeof(Bool), inputInfo.numDevices);
+        if (!skip)
+            return BadAlloc;
+
+        for (dev = inputInfo.devices; dev; dev = dev->next, i++)
         {
-            if (stuff->deviceid == XIAllDevices ||
-                (stuff->deviceid == XIAllMasterDevices && IsMaster(dev)))
+            skip[i] = ShouldSkipDevice(client, stuff->deviceid, dev);
+            if (!skip[i])
                 len += SizeDeviceInfo(dev);
         }
 
-        for (dev = inputInfo.off_devices; dev; dev = dev->next)
+        for (dev = inputInfo.off_devices; dev; dev = dev->next, i++)
         {
-            if (stuff->deviceid == XIAllDevices ||
-                (stuff->deviceid == XIAllMasterDevices && IsMaster(dev)))
+            skip[i] = ShouldSkipDevice(client, stuff->deviceid, dev);
+            if (!skip[i])
                 len += SizeDeviceInfo(dev);
         }
-
-        dev = NULL;
     }
 
     info = xcalloc(1, len);
@@ -124,10 +126,10 @@ ProcXIQueryDevice(ClientPtr client)
         rep.num_devices = 1;
     } else
     {
-        for (dev = inputInfo.devices; dev; dev = dev->next)
+        i = 0;
+        for (dev = inputInfo.devices; dev; dev = dev->next, i++)
         {
-            if (stuff->deviceid == XIAllDevices ||
-                    (stuff->deviceid == XIAllMasterDevices && IsMaster(dev)))
+            if (!skip[i])
             {
                 len = ListDeviceInfo(dev, (xXIDeviceInfo*)info);
                 if (client->swapped)
@@ -137,10 +139,9 @@ ProcXIQueryDevice(ClientPtr client)
             }
         }
 
-        for (dev = inputInfo.off_devices; dev; dev = dev->next)
+        for (dev = inputInfo.off_devices; dev; dev = dev->next, i++)
         {
-            if (stuff->deviceid == XIAllDevices ||
-                    (stuff->deviceid == XIAllMasterDevices && IsMaster(dev)))
+            if (!skip[i])
             {
                 len = ListDeviceInfo(dev, (xXIDeviceInfo*)info);
                 if (client->swapped)
@@ -154,6 +155,7 @@ ProcXIQueryDevice(ClientPtr client)
     WriteReplyToClient(client, sizeof(xXIQueryDeviceReply), &rep);
     WriteToClient(client, rep.length * 4, ptr);
     xfree(ptr);
+    xfree(skip);
     return rc;
 }
 
@@ -172,6 +174,21 @@ SRepXIQueryDevice(ClientPtr client, int size, xXIQueryDeviceReply *rep)
 }
 
 
+/**
+ * @return Whether the device should be included in the returned list.
+ */
+static Bool
+ShouldSkipDevice(ClientPtr client, int deviceid, DeviceIntPtr dev)
+{
+    /* if all devices are not being queried, only master devices are */
+    if (deviceid == XIAllDevices || IsMaster(dev))
+    {
+        int rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixGetAttrAccess);
+        if (rc == Success)
+            return FALSE;
+    }
+    return TRUE;
+}
 
 /**
  * @return The number of bytes needed to store this device's xXIDeviceInfo
commit 00bc8d34c68dab6c818cd1c7e03e9992d1d0cbfc
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Thu Jun 18 21:41:17 2009 -0400

    Xi: check for Use permission on the device in SetClientPointer().
    
    Presumably, some intelligent, XI2-aware management app will be calling
    XISetClientPointer on behalf of other clients; this check makes sure
    the target client has permission on the device.
    
    Requires changing the prototype to return status code instead of Bool.
    
    Signed-off-by: Eamon Walsh <ewalsh at tycho.nsa.gov>
    Acked-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xisetclientpointer.c b/Xi/xisetclientpointer.c
index 2736185..09db8ff 100644
--- a/Xi/xisetclientpointer.c
+++ b/Xi/xisetclientpointer.c
@@ -98,10 +98,11 @@ ProcXISetClientPointer(ClientPtr client)
     } else
         targetClient = client;
 
-    if (!SetClientPointer(targetClient, pDev))
+    rc = SetClientPointer(targetClient, pDev);
+    if (rc != Success)
     {
         client->errorValue = stuff->deviceid;
-        return BadDevice;
+        return rc;
     }
 
     return Success;
diff --git a/dix/events.c b/dix/events.c
index 43e1bd2..81e5b6d 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -5699,21 +5699,25 @@ WriteEventsToClient(ClientPtr pClient, int count, xEvent *events)
  * PickPointer()).
  * If a keyboard is needed, the first keyboard paired with the CP is used.
  */
-Bool
+int
 SetClientPointer(ClientPtr client, DeviceIntPtr device)
 {
+    int rc = XaceHook(XACE_DEVICE_ACCESS, client, device, DixUseAccess);
+    if (rc != Success)
+	return rc;
+
     if (!IsMaster(device))
     {
         ErrorF("[dix] Need master device for ClientPointer. This is a bug.\n");
-        return FALSE;
+        return BadDevice;
     } else if (!device->spriteInfo->spriteOwner)
     {
         ErrorF("[dix] Device %d does not have a sprite. "
                 "Cannot be ClientPointer\n", device->id);
-        return FALSE;
+        return BadDevice;
     }
     client->clientPtr = device;
-    return TRUE;
+    return Success;
 }
 
 /* PickPointer will pick an appropriate pointer for the given client.
diff --git a/include/dix.h b/include/dix.h
index c4a6394..c6e52e7 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -485,7 +485,7 @@ extern _X_EXPORT int TryClientEvents(
 
 extern _X_EXPORT void WindowsRestructured(void);
 
-extern Bool SetClientPointer(
+extern int SetClientPointer(
         ClientPtr /* client */,
         DeviceIntPtr /* device */);
 
commit 119b96667778391436998c76a68bf64e746c9e08
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Thu Jun 18 21:02:28 2009 -0400

    Xi: fix up access modes for calls to dixLookupDevice().
    
    New access modes are being passed to the device access hook for XI2:
    DixCreateAccess for creating a new master device;
    DixAdd/RemoveAccess for attaching/removing slave devices to a master; and
    DixListProp/GetProp/SetPropAccess for device properties.
    
    Refer to the XACE-Spec document in xorg-docs, section "Device Access."
    
    Signed-off-by: Eamon Walsh <ewalsh at tycho.nsa.gov>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index e54af09..34fdf50 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -2000,7 +2000,7 @@ CheckDeviceGrabAndHintWindow(WindowPtr pWin, int type,
     DeviceIntPtr dev;
 
     dixLookupDevice(&dev, xE->deviceid & DEVICE_BITS, serverClient,
-		    DixReadAccess);
+		    DixGrabAccess);
     if (!dev)
         return;
 
diff --git a/Xi/grabdev.c b/Xi/grabdev.c
index adcd7e7..e1d430a 100644
--- a/Xi/grabdev.c
+++ b/Xi/grabdev.c
@@ -184,7 +184,7 @@ CreateMaskFromList(ClientPtr client, XEventClass * list, int count,
 	if (device > 255) /* FIXME: we only use 7 bit for devices? */
 	    return BadClass;
 
-	rc = dixLookupDevice(&tdev, device, client, DixReadAccess);
+	rc = dixLookupDevice(&tdev, device, client, DixUseAccess);
 	if (rc != BadDevice && rc != Success)
 	    return rc;
 	if (rc == BadDevice || (dev != NULL && tdev != dev))
diff --git a/Xi/grabdevb.c b/Xi/grabdevb.c
index 7cd5cc4..58fb73b 100644
--- a/Xi/grabdevb.c
+++ b/Xi/grabdevb.c
@@ -119,14 +119,14 @@ ProcXGrabDeviceButton(ClientPtr client)
 
     if (stuff->modifier_device != UseXKeyboard) {
 	ret = dixLookupDevice(&mdev, stuff->modifier_device, client,
-			      DixReadAccess);
+			      DixUseAccess);
 	if (ret != Success)
 	    return ret;
 	if (mdev->key == NULL)
 	    return BadMatch;
     } else {
 	mdev = PickKeyboard(client);
-	ret = XaceHook(XACE_DEVICE_ACCESS, client, mdev, DixReadAccess);
+	ret = XaceHook(XACE_DEVICE_ACCESS, client, mdev, DixUseAccess);
 	if (ret != Success)
 	    return ret;
     }
diff --git a/Xi/grabdevk.c b/Xi/grabdevk.c
index 5ffecd2..9ae38f0 100644
--- a/Xi/grabdevk.c
+++ b/Xi/grabdevk.c
@@ -116,14 +116,14 @@ ProcXGrabDeviceKey(ClientPtr client)
 
     if (stuff->modifier_device != UseXKeyboard) {
 	ret = dixLookupDevice(&mdev, stuff->modifier_device, client,
-			      DixReadAccess);
+			      DixUseAccess);
 	if (ret != Success)
 	    return ret;
 	if (mdev->key == NULL)
 	    return BadMatch;
     } else {
 	mdev = PickKeyboard(client);
-	ret = XaceHook(XACE_DEVICE_ACCESS, client, mdev, DixReadAccess);
+	ret = XaceHook(XACE_DEVICE_ACCESS, client, mdev, DixUseAccess);
 	if (ret != Success)
 	    return ret;
     }
diff --git a/Xi/stubs.c b/Xi/stubs.c
index 229394b..400e937 100644
--- a/Xi/stubs.c
+++ b/Xi/stubs.c
@@ -153,7 +153,7 @@ AddOtherInputDevices(void)
 void
 OpenInputDevice(DeviceIntPtr dev, ClientPtr client, int *status)
 {
-    *status = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixReadAccess);
+    *status = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixUseAccess);
 }
 
 /****************************************************************************
diff --git a/Xi/xichangecursor.c b/Xi/xichangecursor.c
index 7517d2c..dc33d70 100644
--- a/Xi/xichangecursor.c
+++ b/Xi/xichangecursor.c
@@ -95,7 +95,7 @@ int ProcXIChangeCursor(ClientPtr client)
     else
     {
 	rc = dixLookupResourceByType((pointer *)&pCursor, stuff->cursor,
-				     RT_CURSOR, client, DixReadAccess);
+				     RT_CURSOR, client, DixUseAccess);
 	if (rc != Success)
 	    return (rc == BadValue) ? BadCursor : rc;
     }
diff --git a/Xi/xichangehierarchy.c b/Xi/xichangehierarchy.c
index 5401554..917a0d7 100644
--- a/Xi/xichangehierarchy.c
+++ b/Xi/xichangehierarchy.c
@@ -340,7 +340,7 @@ ProcXIChangeHierarchy(ClientPtr client)
                                      newkeybd;
 
                         rc = dixLookupDevice(&newptr, r->return_pointer,
-                                             client, DixWriteAccess);
+                                             client, DixAddAccess);
                         if (rc != Success)
                             goto unwind;
 
@@ -352,7 +352,7 @@ ProcXIChangeHierarchy(ClientPtr client)
                         }
 
                         rc = dixLookupDevice(&newkeybd, r->return_keyboard,
-                                             client, DixWriteAccess);
+                                             client, DixAddAccess);
                         if (rc != Success)
                             goto unwind;
 
@@ -415,7 +415,7 @@ ProcXIChangeHierarchy(ClientPtr client)
                     DeviceIntPtr *xtstdevice;
 
                     rc = dixLookupDevice(&ptr, c->deviceid, client,
-                                          DixWriteAccess);
+                                          DixManageAccess);
                     if (rc != Success)
                        goto unwind;
 
@@ -448,7 +448,7 @@ ProcXIChangeHierarchy(ClientPtr client)
                     DeviceIntPtr *xtstdevice;
 
                     rc = dixLookupDevice(&ptr, c->deviceid, client,
-                                          DixWriteAccess);
+                                          DixManageAccess);
                     if (rc != Success)
                        goto unwind;
 
@@ -471,7 +471,7 @@ ProcXIChangeHierarchy(ClientPtr client)
                     }
 
                     rc = dixLookupDevice(&newmaster, c->new_master,
-                            client, DixWriteAccess);
+                            client, DixAddAccess);
                     if (rc != Success)
                         goto unwind;
                     if (!IsMaster(newmaster))
diff --git a/Xi/xigetclientpointer.c b/Xi/xigetclientpointer.c
index 859d3fd..401e89f 100644
--- a/Xi/xigetclientpointer.c
+++ b/Xi/xigetclientpointer.c
@@ -68,7 +68,7 @@ int ProcXIGetClientPointer(ClientPtr client)
     if (stuff->win != None)
     {
         rc = dixLookupClient(&winclient, stuff->win, client,
-                DixWriteAccess);
+                DixGetAttrAccess);
 
         if (rc != Success)
             return BadWindow;
diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c
index cd49460..396061f 100644
--- a/Xi/xiproperty.c
+++ b/Xi/xiproperty.c
@@ -858,7 +858,7 @@ ProcXListDeviceProperties (ClientPtr client)
     REQUEST(xListDevicePropertiesReq);
     REQUEST_SIZE_MATCH(xListDevicePropertiesReq);
 
-    rc = dixLookupDevice (&dev, stuff->deviceid, client, DixReadAccess);
+    rc = dixLookupDevice (&dev, stuff->deviceid, client, DixListPropAccess);
     if (rc != Success)
         return rc;
 
@@ -894,7 +894,7 @@ ProcXChangeDeviceProperty (ClientPtr client)
     REQUEST_AT_LEAST_SIZE(xChangeDevicePropertyReq);
     UpdateCurrentTime();
 
-    rc = dixLookupDevice (&dev, stuff->deviceid, client, DixWriteAccess);
+    rc = dixLookupDevice (&dev, stuff->deviceid, client, DixSetPropAccess);
     if (rc != Success)
         return rc;
 
@@ -922,7 +922,7 @@ ProcXDeleteDeviceProperty (ClientPtr client)
 
     REQUEST_SIZE_MATCH(xDeleteDevicePropertyReq);
     UpdateCurrentTime();
-    rc =  dixLookupDevice (&dev, stuff->deviceid, client, DixWriteAccess);
+    rc =  dixLookupDevice (&dev, stuff->deviceid, client, DixSetPropAccess);
     if (rc != Success)
         return rc;
 
@@ -951,8 +951,8 @@ ProcXGetDeviceProperty (ClientPtr client)
     if (stuff->delete)
         UpdateCurrentTime();
     rc = dixLookupDevice (&dev, stuff->deviceid, client,
-                           stuff->delete ? DixWriteAccess :
-                           DixReadAccess);
+                           stuff->delete ? DixSetPropAccess :
+                           DixGetPropAccess);
     if (rc != Success)
         return rc;
 
@@ -1102,7 +1102,7 @@ ProcXIListProperties(ClientPtr client)
     REQUEST(xXIListPropertiesReq);
     REQUEST_SIZE_MATCH(xXIListPropertiesReq);
 
-    rc = dixLookupDevice (&dev, stuff->deviceid, client, DixReadAccess);
+    rc = dixLookupDevice (&dev, stuff->deviceid, client, DixListPropAccess);
     if (rc != Success)
         return rc;
 
@@ -1138,7 +1138,7 @@ ProcXIChangeProperty(ClientPtr client)
     REQUEST_AT_LEAST_SIZE(xXIChangePropertyReq);
     UpdateCurrentTime();
 
-    rc = dixLookupDevice (&dev, stuff->deviceid, client, DixWriteAccess);
+    rc = dixLookupDevice (&dev, stuff->deviceid, client, DixSetPropAccess);
     if (rc != Success)
         return rc;
 
@@ -1165,7 +1165,7 @@ ProcXIDeleteProperty(ClientPtr client)
 
     REQUEST_SIZE_MATCH(xXIDeletePropertyReq);
     UpdateCurrentTime();
-    rc =  dixLookupDevice (&dev, stuff->deviceid, client, DixWriteAccess);
+    rc =  dixLookupDevice (&dev, stuff->deviceid, client, DixSetPropAccess);
     if (rc != Success)
         return rc;
 
@@ -1195,8 +1195,8 @@ ProcXIGetProperty(ClientPtr client)
     if (stuff->delete)
         UpdateCurrentTime();
     rc = dixLookupDevice (&dev, stuff->deviceid, client,
-                           stuff->delete ? DixWriteAccess :
-                           DixReadAccess);
+                           stuff->delete ? DixSetPropAccess :
+                           DixGetPropAccess);
     if (rc != Success)
         return rc;
 
diff --git a/Xi/xiquerypointer.c b/Xi/xiquerypointer.c
index e770e84..2222873 100644
--- a/Xi/xiquerypointer.c
+++ b/Xi/xiquerypointer.c
@@ -91,7 +91,7 @@ ProcXIQueryPointer(ClientPtr client)
         return BadDevice;
     }
 
-    rc = dixLookupWindow(&pWin, stuff->win, client, DixReadAccess);
+    rc = dixLookupWindow(&pWin, stuff->win, client, DixGetAttrAccess);
     if (rc != Success)
     {
         SendErrorToClient(client, IReqCode, X_XIQueryPointer,
diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index a8763a2..750ae61 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -87,7 +87,7 @@ ProcXISelectEvents(ClientPtr client)
     {
         if (evmask->deviceid != XIAllDevices &&
             evmask->deviceid != XIAllMasterDevices)
-            rc = dixLookupDevice(&dev, evmask->deviceid, client, DixReadAccess);
+            rc = dixLookupDevice(&dev, evmask->deviceid, client, DixUseAccess);
         else {
             /* XXX: XACE here? */
         }
@@ -127,7 +127,7 @@ ProcXISelectEvents(ClientPtr client)
             dummy.id = evmask->deviceid;
             dev = &dummy;
         } else
-            dixLookupDevice(&dev, evmask->deviceid, client, DixReadAccess);
+            dixLookupDevice(&dev, evmask->deviceid, client, DixUseAccess);
         XISetEventMask(dev, win, client, evmask->mask_len * 4, (unsigned char*)&evmask[1]);
         evmask = (xXIEventMask*)(((unsigned char*)evmask) + evmask->mask_len * 4);
         evmask++;
@@ -169,7 +169,7 @@ ProcXIGetSelectedEvents(ClientPtr client)
     REQUEST(xXIGetSelectedEventsReq);
     REQUEST_SIZE_MATCH(xXIGetSelectedEventsReq);
 
-    rc = dixLookupWindow(&win, stuff->win, client, DixReceiveAccess);
+    rc = dixLookupWindow(&win, stuff->win, client, DixGetAttrAccess);
     if (rc != Success)
         return rc;
 
@@ -208,7 +208,7 @@ ProcXIGetSelectedEvents(ClientPtr client)
 
         if (i > 2)
         {
-            rc = dixLookupDevice(&dev, i, client, DixReadAccess);
+            rc = dixLookupDevice(&dev, i, client, DixGetAttrAccess);
             if (rc != Success)
                 continue;
         }
diff --git a/Xi/xisetclientpointer.c b/Xi/xisetclientpointer.c
index afc13d6..2736185 100644
--- a/Xi/xisetclientpointer.c
+++ b/Xi/xisetclientpointer.c
@@ -72,7 +72,7 @@ ProcXISetClientPointer(ClientPtr client)
     REQUEST_SIZE_MATCH(xXISetClientPointerReq);
 
 
-    rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixWriteAccess);
+    rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixManageAccess);
     if (rc != Success)
     {
         client->errorValue = stuff->deviceid;
@@ -90,7 +90,7 @@ ProcXISetClientPointer(ClientPtr client)
     if (stuff->win != None)
     {
         rc = dixLookupClient(&targetClient, stuff->win, client,
-                DixWriteAccess);
+                DixManageAccess);
 
         if (rc != Success)
             return BadWindow;
diff --git a/Xi/xiwarppointer.c b/Xi/xiwarppointer.c
index 105c87a..bf361db 100644
--- a/Xi/xiwarppointer.c
+++ b/Xi/xiwarppointer.c
@@ -85,7 +85,7 @@ ProcXIWarpPointer(ClientPtr client)
 
     if (stuff->dst_win != None)
     {
-        rc = dixLookupWindow(&dest, stuff->dst_win, client, DixReadAccess);
+        rc = dixLookupWindow(&dest, stuff->dst_win, client, DixGetAttrAccess);
         if (rc != Success)
         {
             return rc;
@@ -101,7 +101,7 @@ ProcXIWarpPointer(ClientPtr client)
         int winX, winY;
         WindowPtr src;
 
-        rc = dixLookupWindow(&src, stuff->src_win, client, DixReadAccess);
+        rc = dixLookupWindow(&src, stuff->src_win, client, DixGetAttrAccess);
         if (rc != Success)
         {
             return rc;
commit 07c36e4fdcd93df3d33bdab6cca4780ebc9c1f54
Author: Dave Airlie <airlied at redhat.com>
Date:   Wed Jun 10 13:33:47 2009 +1000

    dix/resource: fix use after free in resource code with DRI
    
    LookupClientResourceComplex is used by DRI1 code to find and free a DRI
    drawable in a callback, however when the DRI code returns this->value
    is now pointing at freed memory. It seemed easiest to store the value
    to a temporary and return it afterwards.
    
    Another option might be a new FreeClientResourceComplex or one that
    also returns the id, so we can free it using an alternative means.
    
    found using valgrind.
    
    amended along ajax's suggestions

diff --git a/dix/resource.c b/dix/resource.c
index 73bc3a9..d3641df 100644
--- a/dix/resource.c
+++ b/dix/resource.c
@@ -707,7 +707,8 @@ LookupClientResourceComplex(
     pointer cdata
 ){
     ResourcePtr *resources;
-    ResourcePtr this;
+    ResourcePtr this, next;
+    pointer value;
     int i;
 
     if (!client)
@@ -715,10 +716,13 @@ LookupClientResourceComplex(
 
     resources = clientTable[client->index].resources;
     for (i = 0; i < clientTable[client->index].buckets; i++) {
-        for (this = resources[i]; this; this = this->next) {
+        for (this = resources[i]; this; this = next) {
+	    next = this->next;
 	    if (!type || this->type == type) {
-		if((*func)(this->value, this->id, cdata))
-		    return this->value;
+		/* workaround func freeing the type as DRI1 does */
+		value = this->value;
+		if((*func)(value, this->id, cdata))
+		    return value;
 	    }
 	}
     }
commit 184deb9bc325eb7aa7eb7b7d4f98aa917f0269cb
Author: Dave Airlie <airlied at redhat.com>
Date:   Wed Jun 24 10:40:05 2009 +1000

    GLX: make function static.
    
    This function isn't called from anywhere else and I don't think it shuold be.

diff --git a/glx/glxext.c b/glx/glxext.c
index a571ec9..19d70d4 100644
--- a/glx/glxext.c
+++ b/glx/glxext.c
@@ -171,7 +171,7 @@ void __glXAddToContextList(__GLXcontext *cx)
     glxAllContexts = cx;
 }
 
-void __glXRemoveFromContextList(__GLXcontext *cx)
+static void __glXRemoveFromContextList(__GLXcontext *cx)
 {
     __GLXcontext *c, *prev;
 
commit 9d85b56078ec05da1369ca22930d8eb214c389db
Author: Dave Airlie <airlied at redhat.com>
Date:   Wed Jun 24 10:38:49 2009 +1000

    GLX: note the implicit flushes with ReadPixels in indirect contexts.
    
    This just notes the flush has occured when readpixels returns, and
    fixes the glean test.

diff --git a/glx/singlepix.c b/glx/singlepix.c
index 7b2cb4c..a0a6a79 100644
--- a/glx/singlepix.c
+++ b/glx/singlepix.c
@@ -91,6 +91,7 @@ int __glXDisp_ReadPixels(__GLXclientState *cl, GLbyte *pc)
 	__GLX_SEND_HEADER();
 	__GLX_SEND_VOID_ARRAY(compsize);
     }
+    __GLX_NOTE_FLUSHED_CMDS(cx);
     return Success;
 }
 
diff --git a/glx/singlepixswap.c b/glx/singlepixswap.c
index 143f204..a7febc9 100644
--- a/glx/singlepixswap.c
+++ b/glx/singlepixswap.c
@@ -102,6 +102,7 @@ int __glXDispSwap_ReadPixels(__GLXclientState *cl, GLbyte *pc)
 	__GLX_SEND_HEADER();
 	__GLX_SEND_VOID_ARRAY(compsize);
     }
+    __GLX_NOTE_FLUSHED_CMDS(cx);
     return Success;
 }
 
commit e341512bfa40dd98853a20596dc65dcac4dcaa37
Author: Thomas Jaeger <ThJaeger at gmail.com>
Date:   Sat Jun 20 21:37:59 2009 -0400

    dix: update a comment
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/getevents.c b/dix/getevents.c
index 9a68bf0..c510122 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -1016,7 +1016,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
     CARD32 ms;
     DeviceEvent *event;
     RawDeviceEvent    *raw;
-    int x = 0, y = 0, /* switches between device and screen coords */
+    int x = 0, y = 0, /* device coords */
         cx, cy; /* only screen coordinates */
     ScreenPtr scr = miPointerGetScreen(pDev);
 
commit 5cbd4d3d6e54d202ecdbb527b57aaefeb8435600
Author: Thomas Jaeger <ThJaeger at gmail.com>
Date:   Sat Jun 20 20:17:04 2009 -0400

    dix: do away with an instance of temporary in-place modification
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/getevents.c b/dix/getevents.c
index b71e980..9a68bf0 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -753,6 +753,8 @@ static void
 positionSprite(DeviceIntPtr dev, int *x, int *y,
                ScreenPtr scr, int *screenx, int *screeny)
 {
+    int old_screenx, old_screeny;
+
     /* scale x&y to screen */
     if (dev->valuator->numAxes > 0)
         *screenx = rescaleValuatorAxis(*x, dev->valuator->axes + 0, NULL, scr->width);
@@ -764,12 +766,11 @@ positionSprite(DeviceIntPtr dev, int *x, int *y,
     else
         *screeny = dev->last.valuators[1];
 
-    dev->last.valuators[0] = *screenx;
-    dev->last.valuators[1] = *screeny;
-
+    old_screenx = *screenx;
+    old_screeny = *screeny;
     /* This takes care of crossing screens for us, as well as clipping
      * to the current screen. */
-    miPointerSetPosition(dev, &dev->last.valuators[0], &dev->last.valuators[1]);
+    miPointerSetPosition(dev, screenx, screeny);
 
     if (dev->u.master) {
         dev->u.master->last.valuators[0] = dev->last.valuators[0];
@@ -777,18 +778,16 @@ positionSprite(DeviceIntPtr dev, int *x, int *y,
     }
 
     /* Crossed screen? Scale back to device coordiantes */
-    if(*screenx != dev->last.valuators[0])
+    if(*screenx != old_screenx)
     {
         scr = miPointerGetScreen(dev);
-        *x = rescaleValuatorAxis(dev->last.valuators[0], NULL,
+        *x = rescaleValuatorAxis(*screenx, NULL,
                                 dev->valuator->axes + 0, scr->width);
-        *screenx = dev->last.valuators[0];
     }
-    if(*screeny != dev->last.valuators[1])
+    if(*screeny != old_screeny)
     {
         scr = miPointerGetScreen(dev);
-        *screeny = dev->last.valuators[1];
-        *y = rescaleValuatorAxis(dev->last.valuators[1], NULL,
+        *y = rescaleValuatorAxis(*screeny, NULL,
                                  dev->valuator->axes + 1, scr->height);
     }
 
commit 94cdc1ef0a72802573a11ba292e2f5cc8474aa8e
Author: Thomas Jaeger <ThJaeger at gmail.com>
Date:   Mon Jun 22 13:00:37 2009 -0400

    dix: deal with first_valuator > 0 correctly if POINTER_SCREEN is set
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/getevents.c b/dix/getevents.c
index a08d4b2..b71e980 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -1050,11 +1050,12 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
         if (flags & POINTER_SCREEN) /* valuators are in screen coords */
         {
 
-            valuators[0] = rescaleValuatorAxis(valuators[0], NULL,
-                    pDev->valuator->axes + 0,
-                    scr->width);
-            if (num_valuators > 1)
-                valuators[1] = rescaleValuatorAxis(valuators[1], NULL,
+            if (num_valuators >= 1 && first_valuator == 0)
+                valuators[0] = rescaleValuatorAxis(valuators[0], NULL,
+                        pDev->valuator->axes + 0,
+                        scr->width);
+            if (first_valuator <= 1 && num_valuators >= (2 - first_valuator))
+                valuators[1 - first_valuator] = rescaleValuatorAxis(valuators[1 - first_valuator], NULL,
                         pDev->valuator->axes + 1,
                         scr->height);
         }
commit 21cbb4c9de44e2629dc0fa6f647ce2d139f2cef0
Author: Oliver McFadden <oliver.mcfadden at nokia.com>
Date:   Wed Jun 24 00:24:44 2009 +0300

    xorg-server.h.in: Export the X Access Control Extension (XACE), too.
    
    Acked-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/include/xorg-server.h.in b/include/xorg-server.h.in
index 3189ff3..957a030 100644
--- a/include/xorg-server.h.in
+++ b/include/xorg-server.h.in
@@ -187,4 +187,7 @@
 /* Use libpciaccess */
 #undef XSERVER_LIBPCIACCESS
 
+/* X Access Control Extension */
+#undef XACE
+
 #endif /* _XORG_SERVER_H_ */
commit 800d4ceb946c93724661ebfd28afb658ca63b6b1
Author: Tiago Vignatti <tiago.vignatti at nokia.com>
Date:   Wed Jun 24 00:13:32 2009 +0300

    configure: Provide the --enable/disable-xaa option.
    
    Acked-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/configure.ac b/configure.ac
index f9a967c..0fca440 100644
--- a/configure.ac
+++ b/configure.ac
@@ -582,6 +582,7 @@ AC_ARG_ENABLE(dpms,           AS_HELP_STRING([--disable-dpms], [Build DPMS exten
 AC_ARG_ENABLE(config-dbus,    AS_HELP_STRING([--enable-config-dbus], [Build D-BUS API support (default: no)]), [CONFIG_DBUS_API=$enableval], [CONFIG_DBUS_API=no])
 AC_ARG_ENABLE(config-hal,     AS_HELP_STRING([--disable-config-hal], [Build HAL support (default: auto)]), [CONFIG_HAL=$enableval], [CONFIG_HAL=auto])
 AC_ARG_ENABLE(xfree86-utils,     AS_HELP_STRING([--enable-xfree86-utils], [Build xfree86 DDX utilities (default: enabled)]), [XF86UTILS=$enableval], [XF86UTILS=yes])
+AC_ARG_ENABLE(xaa,               AS_HELP_STRING([--enable-xaa], [Build XAA (default: enabled)]), [XAA=$enableval], [XAA=yes])
 
 dnl DDXes.
 AC_ARG_ENABLE(xorg,    	      AS_HELP_STRING([--enable-xorg], [Build Xorg server (default: auto)]), [XORG=$enableval], [XORG=auto])
@@ -1021,6 +1022,7 @@ XI_LIB='$(top_builddir)/Xi/libXi.la'
 XI_INC='-I$(top_srcdir)/Xi'
 
 AM_CONDITIONAL(XF86UTILS, test "x$XF86UTILS" = xyes)
+AM_CONDITIONAL(XAA, test "x$XAA" = xyes)
 
 AC_DEFINE(SHAPE, 1, [Support SHAPE extension])
 
diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am
index 3b9ff9c..9d5731d 100644
--- a/hw/xfree86/Makefile.am
+++ b/hw/xfree86/Makefile.am
@@ -12,15 +12,19 @@ if XF86UTILS
 XF86UTILS_SUBDIR = utils
 endif
 
+if XAA
+XAA_SUBDIR = xaa
+endif
+
 DOC_SUBDIR = doc
 
 SUBDIRS = common ddc i2c x86emu int10 fbdevhw os-support parser \
-	  ramdac shadowfb vbe vgahw xaa \
+	  ramdac shadowfb vbe vgahw $(XAA_SUBDIR) \
 	  xf8_16bpp loader dixmods exa modes \
 	  $(DRI_SUBDIR) $(DRI2_SUBDIR) $(XF86UTILS_SUBDIR) $(DOC_SUBDIR)
 
 DIST_SUBDIRS = common ddc i2c x86emu int10 fbdevhw os-support \
-               parser ramdac shadowfb vbe vgahw xaa \
+               parser ramdac shadowfb vbe vgahw $(XAA_SUBDIR) \
                xf8_16bpp loader dixmods dri dri2 exa modes \
 	       utils doc
 
commit ce3d539ac6ecab3e343cef7c4dc112bc82ea3b02
Author: Oliver McFadden <oliver.mcfadden at nokia.com>
Date:   Wed Jun 24 00:08:51 2009 +0300

    xf86Config: Avoid attempting to load non-compiled modules.
    
    Acked-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 24049aa..60e66ab 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -108,12 +108,18 @@ extern DeviceAssocRec mouse_assoc;
 
 static ModuleDefault ModuleDefaults[] = {
     {.name = "extmod",   .toLoad = TRUE,    .load_opt=NULL},
+#ifdef DBE
     {.name = "dbe",      .toLoad = TRUE,    .load_opt=NULL},
+#endif
+#ifdef GLXEXT
     {.name = "glx",      .toLoad = TRUE,    .load_opt=NULL},
+#endif
 #ifdef XRECORD
     {.name = "record",   .toLoad = TRUE,    .load_opt=NULL},
 #endif
+#ifdef XF86DRI
     {.name = "dri",      .toLoad = TRUE,    .load_opt=NULL},
+#endif
 #ifdef DRI2
     {.name = "dri2",     .toLoad = TRUE,    .load_opt=NULL},
 #endif
commit 33e25143361d63ea776dfafeeb6d4ffb2f6fd8d4
Author: Yaakov Selkowitz <yselkowitz at users.sourceforge.net>
Date:   Fri May 15 22:42:30 2009 +0100

    Cygwin/X: add hebrew to autodetected keyboard layouts
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/winlayouts.h b/hw/xwin/winlayouts.h
index 1fd3457..d1d21a1 100644
--- a/hw/xwin/winlayouts.h
+++ b/hw/xwin/winlayouts.h
@@ -63,6 +63,7 @@ WinKBLayoutRec winKBLayouts[] =
     {  0x80c, -1, "pc105", "be",      NULL, NULL, "French (Belgian)"},
     {  0xc0c, -1, "pc105", "ca",      "fr", NULL, "French (Canada)"},
     { 0x100c, -1, "pc105", "ch",      "fr", NULL, "French (Switzerland)"},
+    {  0x40d, -1, "pc105", "il",      NULL, NULL, "Hebrew"},
     {  0x40e, -1, "pc105", "hu",      NULL, NULL, "Hungarian"},
     {  0x40f, -1, "pc105", "is",      NULL, NULL, "Icelandic"},
     {  0x410, -1, "pc105", "it",      NULL, NULL, "Italian"},
commit b079945c39e2a72220b46953352e24c3a74ef39a
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Fri Feb 20 15:21:35 2009 +0000

    Cygwin/X: more warnings fixes
    
    More warning fixes, mainly removing casts on function return values
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/winclipboardwndproc.c b/hw/xwin/winclipboardwndproc.c
index 65faedf..292ca87 100644
--- a/hw/xwin/winclipboardwndproc.c
+++ b/hw/xwin/winclipboardwndproc.c
@@ -38,9 +38,6 @@
 #include "winclipboard.h"
 #include "misc.h"
 
-extern void		winFixClipboardChain();
-
-
 /*
  * Constants
  */
diff --git a/hw/xwin/windialogs.c b/hw/xwin/windialogs.c
index 274c046..5d6bd24 100755
--- a/hw/xwin/windialogs.c
+++ b/hw/xwin/windialogs.c
@@ -311,7 +311,7 @@ winDisplayExitDialog (winPrivScreenPtr pScreenPriv)
   
   /* Set focus to the Cancel button */
   PostMessage (g_hDlgExit, WM_NEXTDLGCTL,
-	       (int) GetDlgItem (g_hDlgExit, IDCANCEL), TRUE);
+	       GetDlgItem (g_hDlgExit, IDCANCEL), TRUE);
 }
 
 #define CONNECTED_CLIENTS_FORMAT	"There are currently %d clients connected."
@@ -579,7 +579,7 @@ winDisplayAboutDialog (winPrivScreenPtr pScreenPriv)
   
   /* Set focus to the OK button */
   PostMessage (g_hDlgAbout, WM_NEXTDLGCTL,
-	       (int) GetDlgItem (g_hDlgAbout, IDOK), TRUE);
+	       GetDlgItem (g_hDlgAbout, IDOK), TRUE);
 }
 
 
@@ -660,7 +660,7 @@ winAboutDlgProc (HWND hwndDialog, UINT message,
 
 	case ID_ABOUT_CHANGELOG:
 	  {
-	    int			iReturn;
+	    HINSTANCE iReturn;
 #ifdef __CYGWIN__
 	    const char *	pszCygPath = "/usr/X11R6/share/doc/"
 	      "xorg-x11-xwin/changelog.html";
@@ -673,12 +673,12 @@ winAboutDlgProc (HWND hwndDialog, UINT message,
 		    "devel/server/changelog.html";
 #endif
 	    
-	    iReturn = (int) ShellExecute (NULL,
-					  "open",
-					  pszWinPath,
-					  NULL,
-					  NULL,
-					  SW_MAXIMIZE);
+	    iReturn = ShellExecute (NULL,
+                                    "open",
+                                    pszWinPath,
+                                    NULL,
+                                    NULL,
+                                    SW_MAXIMIZE);
 	    if (iReturn < 32)
 	      {
 		ErrorF ("winAboutDlgProc - WM_COMMAND - ID_ABOUT_CHANGELOG - "
@@ -693,12 +693,12 @@ winAboutDlgProc (HWND hwndDialog, UINT message,
 	    const char *	pszPath = "http://x.cygwin.com/";
 	    int			iReturn;
 	    
-	    iReturn = (int) ShellExecute (NULL,
-					  "open",
-					  pszPath,
-					  NULL,
-					  NULL,
-					  SW_MAXIMIZE);
+	    iReturn = ShellExecute (NULL,
+                                    "open",
+                                    pszPath,
+                                    NULL,
+                                    NULL,
+                                    SW_MAXIMIZE);
 	    if (iReturn < 32)
 	      {
 		ErrorF ("winAboutDlgProc - WM_COMMAND - ID_ABOUT_WEBSITE - "
@@ -713,12 +713,12 @@ winAboutDlgProc (HWND hwndDialog, UINT message,
 	    const char *	pszPath = "http://x.cygwin.com/docs/ug/";
 	    int			iReturn;
 	    
-	    iReturn = (int) ShellExecute (NULL,
-					  "open",
-					  pszPath,
-					  NULL,
-					  NULL,
-					  SW_MAXIMIZE);
+	    iReturn = ShellExecute (NULL,
+                                    "open",
+                                    pszPath,
+                                    NULL,
+                                    NULL,
+                                    SW_MAXIMIZE);
 	    if (iReturn < 32)
 	      {
 		ErrorF ("winAboutDlgProc - WM_COMMAND - ID_ABOUT_UG - "
@@ -733,12 +733,12 @@ winAboutDlgProc (HWND hwndDialog, UINT message,
 	    const char *	pszPath = "http://x.cygwin.com/docs/faq/";
 	    int			iReturn;
 	    
-	    iReturn = (int) ShellExecute (NULL,
-					  "open",
-					  pszPath,
-					  NULL,
-					  NULL,
-					  SW_MAXIMIZE);
+	    iReturn = ShellExecute (NULL,
+                                    "open",
+                                    pszPath,
+                                    NULL,
+                                    NULL,
+                                    SW_MAXIMIZE);
 	    if (iReturn < 32)
 	      {
 		ErrorF ("winAboutDlgProc - WM_COMMAND - ID_ABOUT_FAQ - "
diff --git a/hw/xwin/winmultiwindowicons.c b/hw/xwin/winmultiwindowicons.c
index 8200aad..a23f962 100644
--- a/hw/xwin/winmultiwindowicons.c
+++ b/hw/xwin/winmultiwindowicons.c
@@ -37,6 +37,9 @@
 #include "winprefs.h"
 
 
+#include "propertyst.h"
+#include "windowstr.h"
+
 /*
  * External global variables
  */
diff --git a/hw/xwin/winshaddd.c b/hw/xwin/winshaddd.c
index 6e1f973..8334441 100644
--- a/hw/xwin/winshaddd.c
+++ b/hw/xwin/winshaddd.c
@@ -42,7 +42,7 @@
  */
 
 extern HWND			g_hDlgExit;
-
+extern char *g_pszLogFile;
 
 /*
  * FIXME: Headers are broken, DEFINE_GUID doesn't work correctly,
@@ -646,7 +646,6 @@ winShadowUpdateDD (ScreenPtr pScreen,
   /* Has our memory pointer changed? */
   if (pScreenInfo->pfb != pScreenPriv->pddsdShadow->lpSurface)
     {
-      extern char *g_pszLogFile;
       ErrorF ("winShadowUpdateDD - Memory location of the shadow "
 	      "surface has changed, trying to update the root window "
 	      "pixmap header to point to the new address.  If you get "
commit e79db6a97d02c8a256a4a7e145ea0b48b5a084ab
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Wed Feb 11 23:00:58 2009 +0000

    Cygwin/X: Remove an obsolete mention of xf86Config
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/InitOutput.c b/hw/xwin/InitOutput.c
index 2d17aaf..2f4b0d2 100644
--- a/hw/xwin/InitOutput.c
+++ b/hw/xwin/InitOutput.c
@@ -956,7 +956,7 @@ InitOutput (ScreenInfo *screenInfo, int argc, char *argv[])
   if (!winReadConfigfile ())
     winErrorFVerb (1, "InitOutput - Error reading config file\n");
 #else
-  winMsg(X_INFO, "XF86Config is not supported\n");
+  winMsg(X_INFO, "xorg.conf is not supported\n");
   winMsg(X_INFO, "See http://x.cygwin.com/docs/faq/cygwin-x-faq.html "
          "for more information\n");
   winConfigFiles ();
commit 3020b1d43e34fca08cd51f7c7c8ed51497d49ef3
Author: Michel Dänzer <daenzer at vmware.com>
Date:   Tue Jun 23 16:45:40 2009 +0200

    glx: Clean up more thoroughly if the drawable of a current context goes away.
    
    Fixes crash when restarting compiz, due to cl->currentContexts[x] being stale.

diff --git a/glx/glxext.c b/glx/glxext.c
index 520eb2e..a571ec9 100644
--- a/glx/glxext.c
+++ b/glx/glxext.c
@@ -128,8 +128,31 @@ static Bool DrawableGone(__GLXdrawable *glxPriv, XID xid)
 
     for (c = glxAllContexts; c; c = c->next) {
 	if (c->isCurrent && (c->drawPriv == glxPriv || c->readPriv == glxPriv)) {
+	    int i;
+
 	    (*c->loseCurrent)(c);
-	    __glXFlushContextCache();
+	    c->isCurrent = GL_FALSE;
+	    if (c == __glXLastContext)
+		__glXFlushContextCache();
+
+	    for (i = 1; i < currentMaxClients; i++) {
+		if (clients[i]) {
+		    __GLXclientState *cl = glxGetClient(clients[i]);
+
+		    if (cl->inUse) {
+			int j;
+
+			for (j = 0; j < cl->numCurrentContexts; j++) {
+			    if (cl->currentContexts[j] == c)
+				cl->currentContexts[j] = NULL;
+			}
+		    }
+		}
+	    }
+
+	    if (!c->idExists) {
+		__glXFreeContext(c);
+	    }
 	}
 	if (c->drawPriv == glxPriv)
 	    c->drawPriv = NULL;
commit df597709d71f47b8516e27c6fb1bfffd59de5e48
Author: Michel Dänzer <daenzer at vmware.com>
Date:   Tue Jun 23 16:45:39 2009 +0200

    dri2: Don't crash if pPriv is NULL.

diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
index 385c5e8..aead33b 100644
--- a/hw/xfree86/dri2/dri2.c
+++ b/hw/xfree86/dri2/dri2.c
@@ -186,10 +186,18 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
     int need_fake_front = 0;
     int have_fake_front = 0;
     int front_format = 0;
-    const int dimensions_match = (pDraw->width == pPriv->width)
-	&& (pDraw->height == pPriv->height);
+    int dimensions_match;
     int i;
 
+    if (!pPriv) {
+	*width = pDraw->width;
+	*height = pDraw->height;
+	*out_count = 0;
+	return NULL;
+    }
+
+    dimensions_match = (pDraw->width == pPriv->width)
+	&& (pDraw->height == pPriv->height);
 
     buffers = xalloc((count + 1) * sizeof(buffers[0]));
 
commit 048697ccfa31cf7f7a29afa90a2f702d43efb7d4
Author: Ben Skeggs <bskeggs at redhat.com>
Date:   Wed May 27 15:24:34 2009 +1000

    quirk: use first detailed timing as preferred for PEA prod 9003 (rh#492359)
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/modes/xf86EdidModes.c b/hw/xfree86/modes/xf86EdidModes.c
index 50b669c..e7cb167 100644
--- a/hw/xfree86/modes/xf86EdidModes.c
+++ b/hw/xfree86/modes/xf86EdidModes.c
@@ -210,6 +210,11 @@ static Bool quirk_first_detailed_preferred (int scrnIndex, xf86MonPtr DDC)
 	DDC->vendor.prod_id == 2423)
 	return TRUE;
 
+    /* Peacock Ergovision 19.  See rh#492359 */
+    if (memcmp (DDC->vendor.name, "PEA", 4) == 0 &&
+	DDC->vendor.prod_id == 9003)
+	return TRUE;
+
     return FALSE;
 }
 
commit 07154db4a8b96467785fd6be93d20379acacffa8
Author: Ben Gamari <bgamari.foss at gmail.com>
Date:   Mon Jun 22 08:59:45 2009 -0400

    Xi: Remove redundant and incorrect butmap range check
    
    Maps are CARD8s, therefore checking for values above 255 is completely
    unnecessary. Moreover, 0 is a valid value for maps, so the check wasn't
    even correct to begin with. This fixes bug #22392, which was uncovered
    by commit 280b7f92d729ec910ffa3d18dce7bbc215be7a3c.
    
    Signed-off-by: Ben Gamari <bgamari.foss at gmail.com>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/inpututils.c b/dix/inpututils.c
index 79b6ab7..8194e69 100644
--- a/dix/inpututils.c
+++ b/dix/inpututils.c
@@ -54,12 +54,6 @@ check_butmap_change(DeviceIntPtr dev, CARD8 *map, int len, CARD32 *errval_out,
     for (i = 0; i < len; i++) {
         if (dev->button->map[i + 1] != map[i] && dev->button->down[i + 1])
             return MappingBusy;
-
-        if (map[i] < 1 || map[i] > 255) {
-            if (errval_out)
-                *errval_out = map[i];
-            return -1;
-        }
     }
 
     return Success;
commit 96706c24bd57fbd9b11e5bd5e38d05d81b90aebe
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 18 15:40:08 2009 +1000

    dix: fix wrong indices in set_valuator.
    
    Reported-by: Thomas Jaeger
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/getevents.c b/dix/getevents.c
index 7c018c1..a08d4b2 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -175,8 +175,8 @@ set_valuators(DeviceIntPtr dev, DeviceEvent* event, int first_valuator,
         SetBit(event->valuators.mask, i);
         if (dev->valuator->mode == Absolute)
             SetBit(event->valuators.mode, i);
-        event->valuators.data_frac[first_valuator + i] =
-            dev->last.remainder[first_valuator + i] * (1 << 16) * (1 << 16);
+        event->valuators.data_frac[i] =
+            dev->last.remainder[i] * (1 << 16) * (1 << 16);
     }
 
     memcpy(&event->valuators.data[first_valuator],
commit ae20e748cd3a656173e1f50109bfd4af0712bb87
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Fri Jun 19 21:16:10 2009 -0700

    XQuartz: More localization updates
    (cherry picked from commit 7fbe974246f54535c545861a57c043d80e127ee7)

diff --git a/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/keyedobjects.nib
index ea9418e..5e6d2f0 100644
Binary files a/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/French.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/French.lproj/main.nib/designable.nib
index bb698af..635ed78 100644
--- a/hw/xquartz/bundle/Resources/French.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/French.lproj/main.nib/designable.nib
@@ -1,13 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">9C31</string>
-		<string key="IBDocument.InterfaceBuilderVersion">677</string>
-		<string key="IBDocument.AppKitVersion">949.26</string>
-		<string key="IBDocument.HIToolboxVersion">352.00</string>
+		<string key="IBDocument.SystemVersion">10A354</string>
+		<string key="IBDocument.InterfaceBuilderVersion">728</string>
+		<string key="IBDocument.AppKitVersion">1019</string>
+		<string key="IBDocument.HIToolboxVersion">421.00</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+			<string key="NS.object.0">728</string>
+		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
+			<integer value="29"/>
 		</object>
 		<object class="NSArray" key="IBDocument.PluginDependencies">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -15,7 +20,7 @@
 		</object>
 		<object class="NSMutableDictionary" key="IBDocument.Metadata">
 			<bool key="EncodedWithXMLCoder">YES</bool>
-			<object class="NSArray" key="dict.sortedKeys">
+			<object class="NSArray" key="dict.sortedKeys" id="0">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 			</object>
 			<object class="NSMutableArray" key="dict.values">
@@ -60,7 +65,7 @@
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="139290918">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">w4AgcHJvcG9zIGTigJlYMTE</string>
+									<string key="NSTitle">À propos d’X11</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
@@ -68,7 +73,7 @@
 								</object>
 								<object class="NSMenuItem" id="386173216">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">UHLDqWbDqXJlbmNlc+KApg</string>
+									<string key="NSTitle">Préférences…</string>
 									<string key="NSKeyEquiv">,</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -118,7 +123,7 @@
 								</object>
 								<object class="NSMenuItem" id="6876565">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">QmFzY3VsZXIgZW4gbW9kZSBwbGVpbiDDqWNyYW4</string>
+									<string key="NSTitle">Basculer en mode plein écran</string>
 									<string key="NSKeyEquiv">a</string>
 									<int key="NSKeyEquivModMask">1572864</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -215,7 +220,7 @@
 								</object>
 								<object class="NSMenuItem" id="1065386165">
 									<reference key="NSMenu" ref="981161348"/>
-									<string type="base64-UTF8" key="NSTitle">UGVyc29ubmFsaXNlcuKApg</string>
+									<string key="NSTitle">Personnaliser…</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -227,7 +232,7 @@
 					</object>
 					<object class="NSMenuItem" id="200491363">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle">w4lkaXRpb24</string>
+						<string key="NSTitle">Édition</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -235,7 +240,7 @@
 						<reference key="NSMixedImage" ref="351811234"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="526778998">
-							<string type="base64-UTF8" key="NSTitle">w4lkaXRpb24</string>
+							<string key="NSTitle">Édition</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="185296989">
@@ -252,7 +257,7 @@
 					</object>
 					<object class="NSMenuItem" id="931553638">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle">RmVuw6p0cmU</string>
+						<string key="NSTitle">Fenêtre</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -260,7 +265,7 @@
 						<reference key="NSMixedImage" ref="351811234"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="96874957">
-							<string type="base64-UTF8" key="NSTitle">RmVuw6p0cmU</string>
+							<string key="NSTitle">Fenêtre</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="984461797">
@@ -283,7 +288,7 @@
 								</object>
 								<object class="NSMenuItem" id="1066447520">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">UsOpZHVpcmUvYWdyYW5kaXI</string>
+									<string key="NSTitle">Réduire/agrandir</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -303,7 +308,7 @@
 								</object>
 								<object class="NSMenuItem" id="1036389925">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">RmFpcmUgZMOpZmlsZXIgbGVzIGZlbsOqdHJlcw</string>
+									<string key="NSTitle">Faire défiler les fenêtres</string>
 									<string key="NSKeyEquiv">`</string>
 									<int key="NSKeyEquivModMask">1048840</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -312,9 +317,9 @@
 								</object>
 								<object class="NSMenuItem" id="369641893">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">RmFpcmUgZMOpZmlsZXIgbGVzIGZlbsOqdHJlcyBlbiBzZW5zIGludmVyc2U</string>
-									<string key="NSKeyEquiv">~</string>
-									<int key="NSKeyEquivModMask">1179914</int>
+									<string key="NSTitle">Faire défiler les fenêtres en sens inverse</string>
+									<string key="NSKeyEquiv">`</string>
+									<int key="NSKeyEquivModMask">1179648</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
@@ -390,7 +395,7 @@
 				<int key="NSWindowBacking">2</int>
 				<string key="NSWindowRect">{{414, 406}, {582, 308}}</string>
 				<int key="NSWTFlags">1350041600</int>
-				<string type="base64-UTF8" key="NSWindowTitle">UHLDqWbDqXJlbmNlcyBk4oCZWDExA</string>
+				<string key="NSWindowTitle">Préférences d’X11</string>
 				<string key="NSWindowClass">NSPanel</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
@@ -427,10 +432,10 @@
 												<object class="NSButtonCell" key="NSCell" id="990762273">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">w4ltdWxlciB1bmUgc291cmlzIMOgIHRyb2lzIGJvdXRvbnM</string>
+													<string key="NSContents">Émuler une souris à trois boutons</string>
 													<object class="NSFont" key="NSSupport" id="463863101">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">1044</int>
 													</object>
 													<reference key="NSControlView" ref="119157981"/>
@@ -458,12 +463,10 @@
 												<object class="NSTextFieldCell" key="NSCell" id="391919450">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">UXVhbmQgY2V0dGUgb3B0aW9uIGVzdCBhY3RpdsOpZSwgbGVzIHRvdWNoZXMgw6lxdWl2YWxlbnRlcyBk
-ZSBsYSBiYXJyZSBkZXMgbWVudXMgcGV1dmVudCBwZXJ0dXJiZXIgbGVzIGFwcGxpY2F0aW9ucyBYMTEg
-cXVpIHV0aWxpc2VudCBsZSBtb2RpZmljYXRldXIgZCdpbnN0cnVjdGlvbnMgdmlydHVlbGxlcy4</string>
+													<string key="NSContents">Quand cette option est activée, les touches équivalentes de la barre des menus peuvent perturber les applications X11 qui utilisent le modificateur d'instructions virtuelles.</string>
 													<object class="NSFont" key="NSSupport" id="26">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.100000e+01</double>
+														<double key="NSSize">11</double>
 														<int key="NSfFlags">3100</int>
 													</object>
 													<string key="NSPlaceholderString"/>
@@ -474,7 +477,7 @@ cXVpIHV0aWxpc2VudCBsZSBtb2RpZmljYXRldXIgZCdpbnN0cnVjdGlvbnMgdmlydHVlbGxlcy4</str
 														<string key="NSColorName">controlColor</string>
 														<object class="NSColor" key="NSColor" id="603033258">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2ODY1AA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -516,7 +519,7 @@ A</string>
 												<object class="NSButtonCell" key="NSCell" id="940564599">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">QWN0aXZlciBsZXMgdG91Y2hlcyDDqXF1aXZhbGVudGVzIHNvdXMgWDExA</string>
+													<string key="NSContents">Activer les touches équivalentes sous X11</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="842100515"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -538,8 +541,7 @@ A</string>
 												<object class="NSTextFieldCell" key="NSCell" id="666057093">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QXV0b3Jpc2UgbGVzIG1vZGlmaWNhdGlvbnMgZHUgbWVudSBkJ2VudHLDqWUgcG91ciByZW1wbGFjZXIg
-bGEgZGlzcG9zaXRpb24gZGVzIHRvdWNoZXMgZHUgY2xhdmllciBYMTEuA</string>
+													<string key="NSContents">Autorise les modifications du menu d'entrée pour remplacer la disposition des touches du clavier X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="31160162"/>
@@ -556,7 +558,7 @@ bGEgZGlzcG9zaXRpb24gZGVzIHRvdWNoZXMgZHUgY2xhdmllciBYMTEuA</string>
 												<object class="NSButtonCell" key="NSCell" id="967619578">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">VXRpbGlzZXIgbGEgZGlzcG9zaXRpb24gZGVzIHRvdWNoZXMgZHUgY2xhdmllciBkdSBzeXN0w6htZQ</string>
+													<string key="NSContents">Utiliser la disposition des touches du clavier du système</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="179949713"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -573,7 +575,7 @@ bGEgZGlzcG9zaXRpb24gZGVzIHRvdWNoZXMgZHUgY2xhdmllciBYMTEuA</string>
 										<string key="NSFrame">{{10, 33}, {536, 246}}</string>
 										<reference key="NSSuperview" ref="448510093"/>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">RW50csOpZQ</string>
+									<string key="NSLabel">Entrée</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -595,7 +597,7 @@ bGEgZGlzcG9zaXRpb24gZGVzIHRvdWNoZXMgZHUgY2xhdmllciBYMTEuA</string>
 												<object class="NSButtonCell" key="NSCell" id="1016069354">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">VXRpbGlzZXIgbCdlZmZldCBkJ2F2ZXJ0aXNzZW1lbnQgZHUgc3lzdMOobWU</string>
+													<string key="NSContents">Utiliser l'effet d'avertissement du système</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="418227126"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -617,9 +619,7 @@ bGEgZGlzcG9zaXRpb24gZGVzIHRvdWNoZXMgZHUgY2xhdmllciBYMTEuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="624655599">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">TGVzIHNvbnMgw6ltaXMgcGFyIFgxMSB1dGlsaXNlcm9udCBsJ2F2ZXJ0aXNzZW1lbnQgc3RhbmRhcmQg
-ZHUgc3lzdMOobWUsIGNvbW1lIGTDqWZpbmkgZGFucyBsZSBwYW5uZWF1IEVmZmV0cyBzb25vcmVzIGRl
-cyBQcsOpZsOpcmVuY2VzIFN5c3TDqG1lLg</string>
+													<string key="NSContents">Les sons émis par X11 utiliseront l'avertissement standard du système, comme défini dans le panneau Effets sonores des Préférences Système.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="1039016593"/>
@@ -642,7 +642,7 @@ cyBQcsOpZsOpcmVuY2VzIFN5c3TDqG1lLg</string>
 													<int key="NSButtonFlags2">1</int>
 													<object class="NSFont" key="NSAlternateImage">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">16</int>
 													</object>
 													<string key="NSAlternateContents"/>
@@ -709,6 +709,7 @@ cyBQcsOpZsOpcmVuY2VzIFN5c3TDqG1lLg</string>
 																<reference key="NSTarget" ref="633115429"/>
 															</object>
 														</object>
+														<reference key="NSMenuFont" ref="463863101"/>
 													</object>
 													<int key="NSPreferredEdge">3</int>
 													<bool key="NSUsesItemFromMenu">YES</bool>
@@ -742,7 +743,7 @@ cyBQcsOpZsOpcmVuY2VzIFN5c3TDqG1lLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="311969422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">Q2V0dGUgb3B0aW9uIHByZW5kIGVmZmV0IGF1IHByb2NoYWluIGxhbmNlbWVudCBk4oCZWDExLg</string>
+													<string key="NSContents">Cette option prend effet au prochain lancement d’X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="86150604"/>
@@ -759,7 +760,7 @@ cyBQcsOpZsOpcmVuY2VzIFN5c3TDqG1lLg</string>
 												<object class="NSButtonCell" key="NSCell" id="631531164">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">TW9kZSBwbGVpbiDDqWNyYW4</string>
+													<string key="NSContents">Mode plein écran</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477203622"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -781,8 +782,7 @@ cyBQcsOpZsOpcmVuY2VzIFN5c3TDqG1lLg</string>
 												<object class="NSButtonCell" key="NSCell" id="917248662">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">QWZmaWNoZXIgYXV0b21hdGlxdWVtZW50IGxhIGJhcnJlIGRlcyBtZW51cyBlbiBtb2RlIHBsZWluIMOp
-Y3Jhbg</string>
+													<string key="NSContents">Afficher automatiquement la barre des menus en mode plein écran</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="57246850"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -804,9 +804,7 @@ Y3Jhbg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="761107402">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWN0aXZlIGxhIGZlbsOqdHJlIHJvb3QgWDExLiBVdGlsaXNleiBsZSByYWNjb3VyY2kgY2xhdmllciBD
-b21tYW5kZcKgKyBPcHRpb27CoCsgQSBwb3VyIG91dnJpciBldCBmZXJtZXIgbGUgbW9kZSBwbGVpbiDD
-qWNyYW4uA</string>
+													<string key="NSContents">Active la fenêtre root X11. Utilisez le raccourci clavier Commande + Option + A pour ouvrir et fermer le mode plein écran.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="298603383"/>
@@ -861,9 +859,7 @@ qWNyYW4uA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="572508492">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWN0aXZlIGxhIGNvbW1hbmRlIGRlIG1lbnUgwqvCoENvcGllciDCuyBldCBwZXJtZXQgbGEgc3luY2hy
-b25pc2F0aW9uIGVudHJlIGxlIHByZXNzZS1wYXBpZXJzIGRlIE9TWCwgY2VsdWkgZGUgWDExIChDTElQ
-Qk9BUkQpIGV0IGxlcyBtw6ltb2lyZXMgdGFtcG9ucyBwcmluY2lwYWxlcyAoUFJJTUFSWSkuA</string>
+													<string key="NSContents">Active la commande de menu « Copier » et permet la synchronisation entre le presse-papiers de OSX, celui de X11 (CLIPBOARD) et les mémoires tampons principales (PRIMARY).</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="386152084"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -879,8 +875,7 @@ Qk9BUkQpIGV0IGxlcyBtw6ltb2lyZXMgdGFtcG9ucyBwcmluY2lwYWxlcyAoUFJJTUFSWSkuA</strin
 												<object class="NSButtonCell" key="NSCell" id="501304422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">TWV0dHJlIMOgIGpvdXIgQ0xJUEJPQVJEIGxvcnNxdWUgbGUgcHJlc3NlLXBhcGllcnMgZXN0IG1vZGlm
-acOpLg</string>
+													<string key="NSContents">Mettre à jour CLIPBOARD lorsque le presse-papiers est modifié.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477050998"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -902,8 +897,7 @@ acOpLg</string>
 												<object class="NSButtonCell" key="NSCell" id="510771323">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">TWV0dHJlIMOgIGpvdXIgUFJJTUFSWSAoY2xpYyBjZW50cmFsKSBsb3JzcXVlIGxlIHByZXNzZS1wYXBp
-ZXJzIGVzdCBtb2RpZmnDqS4</string>
+													<string key="NSContents">Mettre à jour PRIMARY (clic central) lorsque le presse-papiers est modifié.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="765780304"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -925,8 +919,7 @@ ZXJzIGVzdCBtb2RpZmnDqS4</string>
 												<object class="NSButtonCell" key="NSCell" id="897099877">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">TWV0dHJlIMOgIGpvdXIgbGUgcHJlc3NlLXBhcGllcnMgZMOocyBsYSBzw6lsZWN0aW9uIGRlIG5vdXZl
-YXUgdGV4dGUuA</string>
+													<string key="NSContents">Mettre à jour le presse-papiers dès la sélection de nouveau texte.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="1002778833"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -948,8 +941,7 @@ YXUgdGV4dGUuA</string>
 												<object class="NSButtonCell" key="NSCell" id="619977658">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">TWV0dHJlIMOgIGpvdXIgbGUgcHJlc3NlLXBhcGllcnMgbG9yc3F1ZSBDTElQQk9BUkQgZXN0IG1vZGlm
-acOpLg</string>
+													<string key="NSContents">Mettre à jour le presse-papiers lorsque CLIPBOARD est modifié.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="487809555"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -971,8 +963,7 @@ acOpLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="461823902">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">RMOpc2FjdGl2ZXogY2V0dGUgb3B0aW9uIHNpIHZvdXMgdm91bGV6IHV0aWxpc2VyIHhjbGlwYm9hcmQs
-IGtsaXBwZXIsIG91IHRvdXQgYXV0cmUgZ2VzdGlvbm5haXJlIGRlIHByZXNzZS1wYXBpZXJzIFgxMS4</string>
+													<string key="NSContents">Désactivez cette option si vous voulez utiliser xclipboard, klipper, ou tout autre gestionnaire de presse-papiers X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="620944856"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1020,7 +1011,7 @@ IGtsaXBwZXIsIG91IHRvdXQgYXV0cmUgZ2VzdGlvbm5haXJlIGRlIHByZXNzZS1wYXBpZXJzIFgxMS4<
 												<object class="NSButtonCell" key="NSCell" id="259618205">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">QWN0aXZhdGlvbiBkZXMgZmVuw6p0cmVzIGluYWN0aXZlcyBlbiB1biBjbGljA</string>
+													<string key="NSContents">Activation des fenêtres inactives en un clic</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="657659108"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1042,9 +1033,7 @@ IGtsaXBwZXIsIG91IHRvdXQgYXV0cmUgZ2VzdGlvbm5haXJlIGRlIHByZXNzZS1wYXBpZXJzIFgxMS4<
 												<object class="NSTextFieldCell" key="NSCell" id="399127858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">RW4gY2FzIGTigJlhY3RpdmF0aW9uIGRlIGNldHRlIG9wdGlvbiwgc2kgdm91cyBjbGlxdWV6IHN1ciB1
-bmUgZmVuw6p0cmUgaW5hY3RpdmUsIGNlbGxlLWNpIGRldmllbmRyYSBhY3RpdmUgZXQgbGUgY2xpYyBz
-ZXJhIGVmZmVjdGlmLg</string>
+													<string key="NSContents">En cas d’activation de cette option, si vous cliquez sur une fenêtre inactive, celle-ci deviendra active et le clic sera effectif.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="290578835"/>
@@ -1061,7 +1050,7 @@ ZXJhIGVmZmVjdGlmLg</string>
 												<object class="NSButtonCell" key="NSCell" id="959555182">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">QWN0aXZhdGlvbiBkZXMgZmVuw6p0cmVzIHN1cnZvbMOpZXMgcGFyIGxhIHNvdXJpcw</string>
+													<string key="NSContents">Activation des fenêtres survolées par la souris</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="992839333"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1083,8 +1072,7 @@ ZXJhIGVmZmVjdGlmLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="183409141">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">TOKAmWFjdGl2YXRpb24gZGVzIGZlbsOqdHJlcyBYMTEgc3VpdCBsZSBjdXJzZXVyLiBDZWNpIGNvbXBv
-cnRlIGRlcyBlZmZldHMgYWR2ZXJzZXMuA</string>
+													<string key="NSContents">L’activation des fenêtres X11 suit le curseur. Ceci comporte des effets adverses.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="138261120"/>
@@ -1101,7 +1089,7 @@ cnRlIGRlcyBlZmZldHMgYWR2ZXJzZXMuA</string>
 												<object class="NSButtonCell" key="NSCell" id="556463187">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">QWN0aXZhdGlvbiBkZXMgbm91dmVsbGVzIGZlbsOqdHJlcw</string>
+													<string key="NSContents">Activation des nouvelles fenêtres</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="128352289"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1123,9 +1111,7 @@ cnRlIGRlcyBlZmZldHMgYWR2ZXJzZXMuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="989804990">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">TG9yc3F1ZSBjZXR0ZSBvcHRpb24gZXN0IGFjdGl2w6llLCBsYSBjcsOpYXRpb24gZOKAmXVuZSBub3V2
-ZWxsZSBmZW7DqnRyZSBYMTEgZmFpdCBwYXNzZXIgWDExLmFwcCBhdSBwcmVtaWVyIHBsYW4gKGF1IGxp
-ZXUgZGUgRmluZGVyLmFwcCwgVGVybWluYWwuYXBwLCBldGMuKQ</string>
+													<string key="NSContents">Lorsque cette option est activée, la création d’une nouvelle fenêtre X11 fait passer X11.app au premier plan (au lieu de Finder.app, Terminal.app, etc.)</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="57161931"/>
@@ -1136,7 +1122,7 @@ ZXUgZGUgRmluZGVyLmFwcCwgVGVybWluYWwuYXBwLCBldGMuKQ</string>
 										</object>
 										<string key="NSFrame">{{10, 33}, {536, 246}}</string>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">RmVuw6p0cmVzA</string>
+									<string key="NSLabel">Fenêtres</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -1177,7 +1163,7 @@ ZXUgZGUgRmluZGVyLmFwcCwgVGVybWluYWwuYXBwLCBldGMuKQ</string>
 												<object class="NSButtonCell" key="NSCell" id="489340979">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">QXV0b3Jpc2VyIGxlcyBjb25uZXhpb25zIGRlIGNsaWVudHMgcsOpc2VhdQ</string>
+													<string key="NSContents">Autoriser les connexions de clients réseau</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="700826966"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1199,10 +1185,7 @@ ZXUgZGUgRmluZGVyLmFwcCwgVGVybWluYWwuYXBwLCBldGMuKQ</string>
 												<object class="NSTextFieldCell" key="NSCell" id="53243865">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">TGUgbGFuY2VtZW50IGTigJlYMTEgY3LDqWVyYSBkZXMgdG91Y2hlcyBkZSBjb250csO0bGUgZCdhY2PD
-qHMgWGF1dGhvcml0eS4gU2kgbCdhZHJlc3NlIElQIGR1IHN5c3TDqG1lIGNoYW5nZSwgY2VzIHRvdWNo
-ZXMgbmUgc2Vyb250IHBsdXMgdmFsaWRlcywgY2UgcXVpIHJpc3F1ZXJhIGQnZW1ww6pjaGVyIGxlIGxh
-bmNlbWVudCBkZXMgYXBwbGljYXRpb25zIFgxMS4</string>
+													<string key="NSContents">Le lancement d’X11 créera des touches de contrôle d'accès Xauthority. Si l'adresse IP du système change, ces touches ne seront plus valides, ce qui risquera d'empêcher le lancement des applications X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="168436707"/>
@@ -1219,10 +1202,7 @@ bmNlbWVudCBkZXMgYXBwbGljYXRpb25zIFgxMS4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="390084685">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">RW4gY2FzIGQnYWN0aXZhdGlvbiBkZSBjZXR0ZSBvcHRpb24sIMKrwqBBdXRoZW50aWZpZXIgbGVzIGNv
-bm5leGlvbnPCoMK7IGRvaXQgYXVzc2kgw6p0cmUgYWN0aXbDqWUgcG91ciBnYXJhbnRpciBsYSBzw6lj
-dXJpdMOpIGR1IHN5c3TDqG1lLiBFbiBjYXMgZGUgZMOpc2FjdGl2YXRpb24sIGxlcyBjb25uZXhpb25z
-IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
+													<string key="NSContents">En cas d'activation de cette option, « Authentifier les connexions » doit aussi être activée pour garantir la sécurité du système. En cas de désactivation, les connexions à partir d'applications distantes sont interdites.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="363817195"/>
@@ -1239,7 +1219,7 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="283628678">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">Q2VzIG9wdGlvbnMgcHJlbm5lbnQgZWZmZXQgYXUgcHJvY2hhaW4gbGFuY2VtZW50IGTigJlYMTEuA</string>
+													<string key="NSContents">Ces options prennent effet au prochain lancement d’X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="223835729"/>
@@ -1250,7 +1230,7 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 										</object>
 										<string key="NSFrame">{{10, 33}, {536, 246}}</string>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">U8OpY3VyaXTDqQ</string>
+									<string key="NSLabel">Sécurité</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -1278,7 +1258,7 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 				<int key="NSWindowBacking">2</int>
 				<string key="NSWindowRect">{{302, 440}, {548, 271}}</string>
 				<int key="NSWTFlags">1350041600</int>
-				<string type="base64-UTF8" key="NSWindowTitle">TWVudSBkZSBsJ2FwcGxpY2F0aW9uIFgxMQ</string>
+				<string key="NSWindowTitle">Menu de l'application X11</string>
 				<string key="NSWindowClass">NSPanel</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
@@ -1368,17 +1348,17 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 											<object class="NSMutableArray" key="NSTableColumns">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<object class="NSTableColumn" id="938444323">
-													<double key="NSWidth">1.550000e+02</double>
-													<double key="NSMinWidth">6.273100e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">155</double>
+													<double key="NSMinWidth">62.730998992919922</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Nom</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor" id="113872566">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+															<bytes key="NSWhite">MC4zMzMzMzI5ODU2AA</bytes>
 														</object>
 														<object class="NSColor" key="NSTextColor" id="249576247">
 															<int key="NSColorSpace">6</int>
@@ -1407,12 +1387,12 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 													<string key="NSHeaderToolTip"/>
 												</object>
 												<object class="NSTableColumn" id="84282687">
-													<double key="NSWidth">1.000000e+02</double>
-													<double key="NSMinWidth">4.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">100</double>
+													<double key="NSMinWidth">40</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Commande</string>
 														<reference key="NSSupport" ref="26"/>
 														<reference key="NSBackgroundColor" ref="113872566"/>
@@ -1435,12 +1415,12 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 													<string key="NSHeaderToolTip"/>
 												</object>
 												<object class="NSTableColumn" id="242608782">
-													<double key="NSWidth">6.900000e+01</double>
-													<double key="NSMinWidth">1.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">69</double>
+													<double key="NSMinWidth">10</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">67239424</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Raccourci</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor">
@@ -1457,7 +1437,7 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 														<string key="NSContents">Text Cell</string>
 														<object class="NSFont" key="NSSupport">
 															<string key="NSName">LucidaGrande</string>
-															<double key="NSSize">1.200000e+01</double>
+															<double key="NSSize">12</double>
 															<int key="NSfFlags">16</int>
 														</object>
 														<string key="NSPlaceholderString"/>
@@ -1478,8 +1458,8 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 													<string key="NSHeaderToolTip"/>
 												</object>
 											</object>
-											<double key="NSIntercellSpacingWidth">3.000000e+00</double>
-											<double key="NSIntercellSpacingHeight">2.000000e+00</double>
+											<double key="NSIntercellSpacingWidth">3</double>
+											<double key="NSIntercellSpacingHeight">2</double>
 											<reference key="NSBackgroundColor" ref="822946413"/>
 											<object class="NSColor" key="NSGridColor">
 												<int key="NSColorSpace">6</int>
@@ -1490,12 +1470,15 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 													<bytes key="NSWhite">MC41AA</bytes>
 												</object>
 											</object>
-											<double key="NSRowHeight">1.700000e+01</double>
+											<double key="NSRowHeight">17</double>
 											<int key="NSTvFlags">1379958784</int>
+											<reference key="NSDelegate"/>
+											<reference key="NSDataSource"/>
 											<int key="NSColumnAutoresizingStyle">1</int>
 											<int key="NSDraggingSourceMaskForLocal">-1</int>
 											<int key="NSDraggingSourceMaskForNonLocal">0</int>
 											<bool key="NSAllowsTypeSelect">YES</bool>
+											<int key="NSTableViewDraggingDestinationStyle">0</int>
 										</object>
 									</object>
 									<string key="NSFrame">{{1, 17}, {333, 198}}</string>
@@ -1512,7 +1495,7 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 									<reference key="NSSuperview" ref="1063387772"/>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">9.949238e-01</double>
+									<double key="NSPercent">0.99492377042770386</double>
 								</object>
 								<object class="NSScroller" id="17278747">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1522,7 +1505,7 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 									<int key="NSsFlags">1</int>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">9.708455e-01</double>
+									<double key="NSPercent">0.97084552049636841</double>
 								</object>
 								<object class="NSClipView" id="672307654">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1560,7 +1543,7 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 							<object class="NSButtonCell" key="NSCell" id="1025474039">
 								<int key="NSCellFlags">-2080244224</int>
 								<int key="NSCellFlags2">137887744</int>
-								<string type="base64-UTF8" key="NSContents">QWpvdXRlciB1biDDqWzDqW1lbnQ</string>
+								<string key="NSContents">Ajouter un élément</string>
 								<reference key="NSSupport" ref="463863101"/>
 								<reference key="NSControlView" ref="758204686"/>
 								<int key="NSButtonFlags">-2038284033</int>
@@ -1623,7 +1606,7 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 								</object>
 								<object class="NSMenuItem" id="1032342329">
 									<reference key="NSMenu" ref="48278059"/>
-									<string type="base64-UTF8" key="NSTitle">UGVyc29ubmFsaXNlcuKApg</string>
+									<string key="NSTitle">Personnaliser…</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -2198,28 +2181,26 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="IBObjectRecord">
 						<int key="objectID">0</int>
-						<object class="NSArray" key="object" id="330408435">
-							<bool key="EncodedWithXMLCoder">YES</bool>
-						</object>
+						<reference key="object" ref="0"/>
 						<reference key="children" ref="904585544"/>
 						<nil key="parent"/>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-2</int>
 						<reference key="object" ref="815810918"/>
-						<reference key="parent" ref="330408435"/>
-						<string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">File's Owner</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-1</int>
 						<reference key="object" ref="941939442"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">First Responder</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-3</int>
 						<reference key="object" ref="951368722"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">Application</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2233,7 +2214,7 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 							<reference ref="868031522"/>
 							<reference ref="551174276"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">MainMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2478,7 +2459,7 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 					<object class="IBObjectRecord">
 						<int key="objectID">196</int>
 						<reference key="object" ref="485884620"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">X11Controller</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2488,7 +2469,7 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="941366957"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">PrefsPanel</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2752,7 +2733,7 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="85544634"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">EditPrograms</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2775,7 +2756,7 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 							<reference ref="318286212"/>
 							<reference ref="511651072"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">DockMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -3327,10 +3308,8 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 			</object>
 			<object class="NSMutableDictionary" key="flattenedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSMutableArray" key="dict.sortedKeys">
+				<object class="NSArray" key="dict.sortedKeys">
 					<bool key="EncodedWithXMLCoder">YES</bool>
-					<string>-1.IBPluginDependency</string>
-					<string>-2.IBPluginDependency</string>
 					<string>-3.IBPluginDependency</string>
 					<string>-3.ImportedFromIB2</string>
 					<string>100292.IBPluginDependency</string>
@@ -3341,7 +3320,6 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 					<string>100363.IBPluginDependency</string>
 					<string>100364.IBPluginDependency</string>
 					<string>100365.IBPluginDependency</string>
-					<string>100365.IBPropertyAccessControl</string>
 					<string>100368.IBPluginDependency</string>
 					<string>100369.IBPluginDependency</string>
 					<string>100370.IBPluginDependency</string>
@@ -3356,7 +3334,6 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 					<string>100385.IBPluginDependency</string>
 					<string>100386.IBPluginDependency</string>
 					<string>100541.IBPluginDependency</string>
-					<string>100541.IBPropertyAccessControl</string>
 					<string>100543.IBPluginDependency</string>
 					<string>129.IBPluginDependency</string>
 					<string>129.ImportedFromIB2</string>
@@ -3373,7 +3350,6 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 					<string>144.IBPluginDependency</string>
 					<string>144.ImportedFromIB2</string>
 					<string>145.IBPluginDependency</string>
-					<string>145.IBPropertyAccessControl</string>
 					<string>145.ImportedFromIB2</string>
 					<string>149.IBPluginDependency</string>
 					<string>149.ImportedFromIB2</string>
@@ -3389,7 +3365,6 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 					<string>169.editorWindowContentRectSynchronizationRect</string>
 					<string>19.IBPluginDependency</string>
 					<string>19.ImportedFromIB2</string>
-					<string>196.IBPluginDependency</string>
 					<string>196.ImportedFromIB2</string>
 					<string>200295.IBPluginDependency</string>
 					<string>200295.IBShouldRemoveOnLegacySave</string>
@@ -3404,7 +3379,7 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 					<string>24.ImportedFromIB2</string>
 					<string>24.editorWindowContentRectSynchronizationRect</string>
 					<string>244.IBEditorWindowLastContentRect</string>
-					<string>244.IBPropertyAccessControl</string>
+					<string>244.IBPluginDependency</string>
 					<string>244.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>244.IBWindowTemplateEditedContentRect</string>
 					<string>244.ImportedFromIB2</string>
@@ -3414,7 +3389,6 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 					<string>244.windowTemplate.maxSize</string>
 					<string>244.windowTemplate.minSize</string>
 					<string>245.IBPluginDependency</string>
-					<string>245.IBPropertyAccessControl</string>
 					<string>245.ImportedFromIB2</string>
 					<string>269.IBPluginDependency</string>
 					<string>269.ImportedFromIB2</string>
@@ -3425,7 +3399,7 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 					<string>272.IBPluginDependency</string>
 					<string>272.ImportedFromIB2</string>
 					<string>285.IBEditorWindowLastContentRect</string>
-					<string>285.IBPropertyAccessControl</string>
+					<string>285.IBPluginDependency</string>
 					<string>285.IBViewEditorWindowController.showingBoundsRectangles</string>
 					<string>285.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>285.IBWindowTemplateEditedContentRect</string>
@@ -3436,28 +3410,22 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 					<string>285.windowTemplate.maxSize</string>
 					<string>285.windowTemplate.minSize</string>
 					<string>286.IBPluginDependency</string>
-					<string>286.IBPropertyAccessControl</string>
 					<string>286.ImportedFromIB2</string>
 					<string>29.IBEditorWindowLastContentRect</string>
 					<string>29.IBPluginDependency</string>
 					<string>29.ImportedFromIB2</string>
 					<string>29.editorWindowContentRectSynchronizationRect</string>
 					<string>292.IBPluginDependency</string>
-					<string>292.IBPropertyAccessControl</string>
 					<string>292.ImportedFromIB2</string>
 					<string>293.IBPluginDependency</string>
-					<string>293.IBPropertyAccessControl</string>
 					<string>293.ImportedFromIB2</string>
 					<string>295.IBPluginDependency</string>
-					<string>295.IBPropertyAccessControl</string>
 					<string>295.ImportedFromIB2</string>
 					<string>296.IBPluginDependency</string>
 					<string>296.ImportedFromIB2</string>
 					<string>297.IBPluginDependency</string>
-					<string>297.IBPropertyAccessControl</string>
 					<string>297.ImportedFromIB2</string>
 					<string>298.IBPluginDependency</string>
-					<string>298.IBPropertyAccessControl</string>
 					<string>298.ImportedFromIB2</string>
 					<string>300295.IBPluginDependency</string>
 					<string>300295.IBShouldRemoveOnLegacySave</string>
@@ -3466,162 +3434,113 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 					<string>300337.IBPluginDependency</string>
 					<string>300337.ImportedFromIB2</string>
 					<string>300338.IBPluginDependency</string>
-					<string>300338.IBPropertyAccessControl</string>
 					<string>300338.ImportedFromIB2</string>
 					<string>300358.IBPluginDependency</string>
-					<string>300358.IBPropertyAccessControl</string>
 					<string>300358.ImportedFromIB2</string>
 					<string>300359.IBPluginDependency</string>
-					<string>300359.IBPropertyAccessControl</string>
 					<string>300359.ImportedFromIB2</string>
 					<string>300360.IBPluginDependency</string>
 					<string>300361.IBPluginDependency</string>
 					<string>300362.IBPluginDependency</string>
-					<string>300362.IBPropertyAccessControl</string>
 					<string>300362.ImportedFromIB2</string>
 					<string>300363.IBPluginDependency</string>
 					<string>300364.IBPluginDependency</string>
-					<string>300364.IBPropertyAccessControl</string>
 					<string>300364.ImportedFromIB2</string>
 					<string>300365.IBPluginDependency</string>
-					<string>300365.IBPropertyAccessControl</string>
 					<string>300368.IBPluginDependency</string>
-					<string>300368.IBPropertyAccessControl</string>
 					<string>300368.ImportedFromIB2</string>
 					<string>300369.IBPluginDependency</string>
 					<string>300370.IBPluginDependency</string>
-					<string>300370.IBPropertyAccessControl</string>
 					<string>300370.ImportedFromIB2</string>
 					<string>300371.IBPluginDependency</string>
 					<string>300421.IBPluginDependency</string>
-					<string>300421.IBPropertyAccessControl</string>
 					<string>300421.ImportedFromIB2</string>
 					<string>300422.IBPluginDependency</string>
-					<string>300422.IBPropertyAccessControl</string>
 					<string>300422.ImportedFromIB2</string>
 					<string>300423.IBPluginDependency</string>
-					<string>300423.IBPropertyAccessControl</string>
 					<string>300423.ImportedFromIB2</string>
 					<string>300424.IBPluginDependency</string>
-					<string>300424.IBPropertyAccessControl</string>
 					<string>300424.ImportedFromIB2</string>
 					<string>300440.IBPluginDependency</string>
-					<string>300440.IBPropertyAccessControl</string>
 					<string>300441.IBPluginDependency</string>
-					<string>300441.IBPropertyAccessControl</string>
 					<string>300447.IBPluginDependency</string>
-					<string>300447.IBPropertyAccessControl</string>
 					<string>300447.ImportedFromIB2</string>
 					<string>300450.IBPluginDependency</string>
-					<string>300450.IBPropertyAccessControl</string>
 					<string>300451.IBPluginDependency</string>
-					<string>300451.IBPropertyAccessControl</string>
 					<string>300451.ImportedFromIB2</string>
 					<string>300452.IBPluginDependency</string>
-					<string>300452.IBPropertyAccessControl</string>
 					<string>300453.IBPluginDependency</string>
-					<string>300453.IBPropertyAccessControl</string>
 					<string>300453.ImportedFromIB2</string>
 					<string>300454.IBPluginDependency</string>
-					<string>300454.IBPropertyAccessControl</string>
 					<string>300455.IBPluginDependency</string>
-					<string>300455.IBPropertyAccessControl</string>
 					<string>300455.ImportedFromIB2</string>
 					<string>300456.IBPluginDependency</string>
-					<string>300456.IBPropertyAccessControl</string>
 					<string>300457.IBPluginDependency</string>
-					<string>300457.IBPropertyAccessControl</string>
 					<string>300457.ImportedFromIB2</string>
 					<string>300458.IBPluginDependency</string>
-					<string>300458.IBPropertyAccessControl</string>
 					<string>300459.IBPluginDependency</string>
-					<string>300459.IBPropertyAccessControl</string>
 					<string>300459.ImportedFromIB2</string>
 					<string>300460.IBPluginDependency</string>
-					<string>300460.IBPropertyAccessControl</string>
 					<string>300472.IBPluginDependency</string>
-					<string>300472.IBPropertyAccessControl</string>
 					<string>300472.ImportedFromIB2</string>
 					<string>300473.IBPluginDependency</string>
-					<string>300473.IBPropertyAccessControl</string>
 					<string>305.IBPluginDependency</string>
 					<string>305.ImportedFromIB2</string>
 					<string>310.IBPluginDependency</string>
-					<string>310.IBPropertyAccessControl</string>
 					<string>310.ImportedFromIB2</string>
 					<string>348.IBPluginDependency</string>
-					<string>348.IBPropertyAccessControl</string>
 					<string>348.ImportedFromIB2</string>
 					<string>349.IBPluginDependency</string>
 					<string>349.ImportedFromIB2</string>
 					<string>350.IBPluginDependency</string>
-					<string>350.IBPropertyAccessControl</string>
 					<string>350.ImportedFromIB2</string>
 					<string>351.IBPluginDependency</string>
-					<string>351.IBPropertyAccessControl</string>
 					<string>351.ImportedFromIB2</string>
 					<string>352.IBPluginDependency</string>
 					<string>352.ImportedFromIB2</string>
 					<string>353.IBPluginDependency</string>
 					<string>353.ImportedFromIB2</string>
 					<string>354.IBPluginDependency</string>
-					<string>354.IBPropertyAccessControl</string>
 					<string>354.ImportedFromIB2</string>
 					<string>363.IBPluginDependency</string>
-					<string>363.IBPropertyAccessControl</string>
 					<string>363.ImportedFromIB2</string>
 					<string>364.IBPluginDependency</string>
-					<string>364.IBPropertyAccessControl</string>
 					<string>364.ImportedFromIB2</string>
 					<string>365.IBPluginDependency</string>
-					<string>365.IBPropertyAccessControl</string>
 					<string>365.ImportedFromIB2</string>
 					<string>368.IBPluginDependency</string>
-					<string>368.IBPropertyAccessControl</string>
 					<string>368.ImportedFromIB2</string>
 					<string>369.IBPluginDependency</string>
-					<string>369.IBPropertyAccessControl</string>
 					<string>369.ImportedFromIB2</string>
 					<string>370.IBPluginDependency</string>
-					<string>370.IBPropertyAccessControl</string>
 					<string>370.ImportedFromIB2</string>
 					<string>371.IBPluginDependency</string>
-					<string>371.IBPropertyAccessControl</string>
 					<string>371.ImportedFromIB2</string>
 					<string>372.IBPluginDependency</string>
-					<string>372.IBPropertyAccessControl</string>
 					<string>372.ImportedFromIB2</string>
 					<string>374.IBPluginDependency</string>
-					<string>374.IBPropertyAccessControl</string>
 					<string>374.ImportedFromIB2</string>
 					<string>375.IBPluginDependency</string>
-					<string>375.IBPropertyAccessControl</string>
 					<string>375.ImportedFromIB2</string>
 					<string>376.IBPluginDependency</string>
-					<string>376.IBPropertyAccessControl</string>
 					<string>376.ImportedFromIB2</string>
 					<string>377.IBPluginDependency</string>
-					<string>377.IBPropertyAccessControl</string>
 					<string>377.ImportedFromIB2</string>
 					<string>379.IBPluginDependency</string>
-					<string>379.IBPropertyAccessControl</string>
 					<string>379.ImportedFromIB2</string>
 					<string>380.IBPluginDependency</string>
 					<string>380.ImportedFromIB2</string>
 					<string>381.IBPluginDependency</string>
 					<string>381.ImportedFromIB2</string>
 					<string>382.IBPluginDependency</string>
-					<string>382.IBPropertyAccessControl</string>
 					<string>382.ImportedFromIB2</string>
 					<string>383.IBPluginDependency</string>
 					<string>383.ImportedFromIB2</string>
 					<string>384.IBPluginDependency</string>
 					<string>384.ImportedFromIB2</string>
 					<string>385.IBPluginDependency</string>
-					<string>385.IBPropertyAccessControl</string>
 					<string>385.ImportedFromIB2</string>
 					<string>386.IBPluginDependency</string>
-					<string>386.IBPropertyAccessControl</string>
 					<string>386.ImportedFromIB2</string>
 					<string>419.IBPluginDependency</string>
 					<string>419.ImportedFromIB2</string>
@@ -3654,10 +3573,8 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 					<string>538.IBPluginDependency</string>
 					<string>538.ImportedFromIB2</string>
 					<string>541.IBPluginDependency</string>
-					<string>541.IBPropertyAccessControl</string>
 					<string>541.ImportedFromIB2</string>
 					<string>543.IBPluginDependency</string>
-					<string>543.IBPropertyAccessControl</string>
 					<string>543.ImportedFromIB2</string>
 					<string>544.IBPluginDependency</string>
 					<string>544.ImportedFromIB2</string>
@@ -3683,18 +3600,17 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="1" id="9"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3" id="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3709,336 +3625,271 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{168, 821}, {113, 23}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{202, 626}, {154, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
+					<string>{{371, 858}, {365, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>{{349, 858}, {315, 153}}</string>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{271, 666}, {301, 153}}</string>
 					<string>{{437, 548}, {582, 308}}</string>
-					<reference ref="11"/>
-					<boolean value="NO" id="6"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="NO"/>
 					<string>{{437, 548}, {582, 308}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{184, 290}, {481, 345}}</string>
-					<integer value="0" id="8"/>
-					<reference ref="9"/>
+					<integer value="0"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{58, 803}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{100, 746}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{68, 585}, {548, 271}}</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
-					<reference ref="6"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
+					<boolean value="NO"/>
 					<string>{{68, 585}, {548, 271}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{433, 406}, {486, 327}}</string>
-					<reference ref="8"/>
-					<reference ref="9"/>
+					<integer value="0"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
-					<string>{{145, 1011}, {336, 20}}</string>
+					<integer value="1"/>
+					<string>{{145, 1011}, {356, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{67, 819}, {336, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>{{20, 641}, {218, 203}}</string>
+					<integer value="1"/>
+					<string>{{157, 808}, {290, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{79, 616}, {218, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 				</object>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -4046,9 +3897,7 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 			<nil key="activeLocalization"/>
 			<object class="NSMutableDictionary" key="localizations">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -4086,7 +3935,16 @@ IMOgIHBhcnRpciBkJ2FwcGxpY2F0aW9ucyBkaXN0YW50ZXMgc29udCBpbnRlcmRpdGVzLg</string>
 			</object>
 		</object>
 		<int key="IBDocument.localizationMode">0</int>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+			<integer value="1050" key="NS.object.0"/>
+		</object>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+			<integer value="3000" key="NS.object.0"/>
+		</object>
+		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
 		<string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
-		<int key="IBDocument.defaultPropertyAccessControl">1</int>
+		<int key="IBDocument.defaultPropertyAccessControl">3</int>
 	</data>
 </archive>
diff --git a/hw/xquartz/bundle/Resources/French.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/French.lproj/main.nib/keyedobjects.nib
index bbbf0e4..9bf0d4d 100644
Binary files a/hw/xquartz/bundle/Resources/French.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/French.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/German.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/German.lproj/main.nib/designable.nib
index 12517fe..9eaf8fa 100644
--- a/hw/xquartz/bundle/Resources/German.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/German.lproj/main.nib/designable.nib
@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.05">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">10A222</string>
-		<string key="IBDocument.InterfaceBuilderVersion">708</string>
-		<string key="IBDocument.AppKitVersion">994.5</string>
-		<string key="IBDocument.HIToolboxVersion">404.00</string>
+		<string key="IBDocument.SystemVersion">10A354</string>
+		<string key="IBDocument.InterfaceBuilderVersion">728</string>
+		<string key="IBDocument.AppKitVersion">1019</string>
+		<string key="IBDocument.HIToolboxVersion">421.00</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
-			<string key="NS.object.0">708</string>
+			<string key="NS.object.0">728</string>
 		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -19,7 +19,7 @@
 		</object>
 		<object class="NSMutableDictionary" key="IBDocument.Metadata">
 			<bool key="EncodedWithXMLCoder">YES</bool>
-			<object class="NSArray" key="dict.sortedKeys">
+			<object class="NSArray" key="dict.sortedKeys" id="0">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 			</object>
 			<object class="NSMutableArray" key="dict.values">
@@ -64,7 +64,7 @@
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="139290918">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">w5xiZXIgWDExA</string>
+									<string key="NSTitle">Ãœber X11</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
@@ -72,7 +72,7 @@
 								</object>
 								<object class="NSMenuItem" id="386173216">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">RWluc3RlbGx1bmdlbiDigKY</string>
+									<string key="NSTitle">Einstellungen …</string>
 									<string key="NSKeyEquiv">,</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -217,7 +217,7 @@
 								</object>
 								<object class="NSMenuItem" id="1065386165">
 									<reference key="NSMenu" ref="981161348"/>
-									<string type="base64-UTF8" key="NSTitle">QW5wYXNzZW4g4oCmA</string>
+									<string key="NSTitle">Anpassen …</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -267,7 +267,7 @@
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="984461797">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">U2NobGllw59lbg</string>
+									<string key="NSTitle">Schließen</string>
 									<string key="NSKeyEquiv">w</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -305,18 +305,18 @@
 								</object>
 								<object class="NSMenuItem" id="1036389925">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">Vm9yd8OkcnRzIGJsw6R0dGVybg</string>
-									<string key="NSKeyEquiv">`</string>
-									<int key="NSKeyEquivModMask">1048840</int>
+									<string key="NSTitle">Vorwärts blättern</string>
+									<string key="NSKeyEquiv">&lt;</string>
+									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
 								</object>
 								<object class="NSMenuItem" id="369641893">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">UsO8Y2t3w6RydHMgYmzDpHR0ZXJuA</string>
-									<string key="NSKeyEquiv">~</string>
-									<int key="NSKeyEquivModMask">1179914</int>
+									<string key="NSTitle">Rückwärts blättern</string>
+									<string key="NSKeyEquiv">&gt;</string>
+									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
@@ -397,7 +397,7 @@
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="941366957">
 					<nil key="NSNextResponder"/>
@@ -460,9 +460,7 @@
 												<object class="NSTextFieldCell" key="NSCell" id="391919450">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QmVpIEFrdGl2aWVydW5nIGvDtm5uZW4gZGllIFRhc3RlbmVudHNwcmVjaHVuZ2VuIGbDvHIgZGllIE1l
-bsO8bGVpc3RlIGRpZSBYMTEtUHJvZ3JhbW1lIHN0w7ZyZW4sIGRpZSBNZXRhLVNvbmRlcnRhc3RlbiB2
-ZXJ3ZW5kZW4uA</string>
+													<string key="NSContents">Bei Aktivierung können die Tastenentsprechungen für die Menüleiste die X11-Programme stören, die Meta-Sondertasten verwenden.</string>
 													<object class="NSFont" key="NSSupport" id="26">
 														<string key="NSName">LucidaGrande</string>
 														<double key="NSSize">11</double>
@@ -476,7 +474,7 @@ ZXJ3ZW5kZW4uA</string>
 														<string key="NSColorName">controlColor</string>
 														<object class="NSColor" key="NSColor" id="705970636">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2NwA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2ODY1AA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -540,8 +538,7 @@ dmllcmVuLgo</string>
 												<object class="NSTextFieldCell" key="NSCell" id="666057093">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QmVpIEFrdGl2aWVydW5nIGthbm4gSWhyZSBha3R1ZWxsZSBYMTEtS2V5bWFwIGR1cmNoIMOEbmRlcnVu
-Z2VuIGRlcyBUYXN0YXR1cm1lbsO8cyDDvGJlcnNjaHJpZWJlbiB3ZXJkZW4uA</string>
+													<string key="NSContents">Bei Aktivierung kann Ihre aktuelle X11-Keymap durch Änderungen des Tastaturmenüs überschrieben werden.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="31160162"/>
@@ -619,8 +616,7 @@ Z2VuIGRlcyBUYXN0YXR1cm1lbsO8cyDDvGJlcnNjaHJpZWJlbiB3ZXJkZW4uA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="624655599">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">WDExIHZlcndlbmRldCBhbHMgYWt1c3Rpc2NoZW4gU2lnbmFsdG9uIGRlbiBTdGFuZGFyZC1XYXJudG9u
-LCB3aWUgaW4gZGVyIFN5c3RlbWVpbnN0ZWxsdW5nIOKAnlRvbmVmZmVrdGXigJwgZmVzdGdlbGVndC4</string>
+													<string key="NSContents">X11 verwendet als akustischen Signalton den Standard-Warnton, wie in der Systemeinstellung „Toneffekte“ festgelegt.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="1039016593"/>
@@ -744,7 +740,7 @@ LCB3aWUgaW4gZGVyIFN5c3RlbWVpbnN0ZWxsdW5nIOKAnlRvbmVmZmVrdGXigJwgZmVzdGdlbGVndC4<
 												<object class="NSTextFieldCell" key="NSCell" id="311969422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">RGllc2UgT3B0aW9uIHdpcmQgYmVpbSBuw6RjaHN0ZW4gU3RhcnQgdm9uIFgxMSB3aXJrc2FtLg</string>
+													<string key="NSContents">Diese Option wird beim nächsten Start von X11 wirksam.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="86150604"/>
@@ -783,7 +779,7 @@ LCB3aWUgaW4gZGVyIFN5c3RlbWVpbnN0ZWxsdW5nIOKAnlRvbmVmZmVrdGXigJwgZmVzdGdlbGVndC4<
 												<object class="NSButtonCell" key="NSCell" id="917248662">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">TWVuw7xsZWlzdGUgYXV0b21hdGlzY2ggaW0gVm9sbGJpbGRtb2R1cyBhbnplaWdlbg</string>
+													<string key="NSContents">Menüleiste automatisch im Vollbildmodus anzeigen</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="57246850"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -860,9 +856,7 @@ LCB3aWUgaW4gZGVyIFN5c3RlbWVpbnN0ZWxsdW5nIOKAnlRvbmVmZmVrdGXigJwgZmVzdGdlbGVndC4<
 												<object class="NSTextFieldCell" key="NSCell" id="572508492">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWt0aXZpZXJ0IGRhcyBNZW7DvG9iamVrdCDigJ5Lb3BpZXJlbuKAnCB1bmQgZXJtw7ZnbGljaHQgZGll
-IFN5bmNocm9uaXNpZXJ1bmcgendpc2NoZW4gZGVtIOKAnk9TWCBQYXN0ZWJvYXJk4oCcIHVuZCBkZW4g
-UHVmZmVyc3BlaWNoZXJuIOKAnkNMSVBCT0FSROKAnCB1bmQg4oCeUFJJTUFSWeKAnCB2b24gWDExLg</string>
+													<string key="NSContents">Aktiviert das Menüobjekt „Kopieren“ und ermöglicht die Synchronisierung zwischen dem „OSX Pasteboard“ und den Pufferspeichern „CLIPBOARD“ und „PRIMARY“ von X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="386152084"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -878,8 +872,7 @@ UHVmZmVyc3BlaWNoZXJuIOKAnkNMSVBCT0FSROKAnCB1bmQg4oCeUFJJTUFSWeKAnCB2b24gWDExLg</
 												<object class="NSButtonCell" key="NSCell" id="501304422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">4oCeQ0xJUEJPQVJE4oCcIGFrdHVhbGlzaWVyZW4sIHdlbm4gZGllIFp3aXNjaGVuYWJsYWdlIHNpY2gg
-w6RuZGVydC4</string>
+													<string key="NSContents">„CLIPBOARD“ aktualisieren, wenn die Zwischenablage sich ändert.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477050998"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -924,8 +917,7 @@ KSwgCndlbm4gZGllIFp3aXNjaGVuYWJsYWdlIHNpY2ggw6RuZGVydC4</string>
 												<object class="NSButtonCell" key="NSCell" id="897099877">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">RGllIFp3aXNjaGVuYWJsYWdlIHNvZm9ydCBha3R1YWxpc2llcmVuLCB3ZW5uIG5ldWVyIFRleHQgYXVz
-Z2V3w6RobHQgd2lyZC4</string>
+													<string key="NSContents">Die Zwischenablage sofort aktualisieren, wenn neuer Text ausgewählt wird.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="1002778833"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -947,8 +939,7 @@ Z2V3w6RobHQgd2lyZC4</string>
 												<object class="NSButtonCell" key="NSCell" id="619977658">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">RGllIFp3aXNjaGVuYWJsYWdlIGFrdHVhbGlzaWVyZW4sIHdlbm4g4oCeQ0xJUEJPQVJE4oCcIHNpY2gg
-w6RuZGVydC4</string>
+													<string key="NSContents">Die Zwischenablage aktualisieren, wenn „CLIPBOARD“ sich ändert.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="487809555"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -970,9 +961,7 @@ w6RuZGVydC4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="461823902">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">RGVha3RpdmllcmVuIFNpZSBkaWVzZSBPcHRpb24sIHdlbm4gU2llIOKAnnhjbGlwYm9hcmTigJwsIOKA
-nmtsaXBwZXLigJwgb2RlciBlaW5lbiBiZWxpZWJpZ2VuIGFuZGVyZW4gWDExLVp3aXNjaGVuYWJsYWdl
-LU1hbmFnZXIgdmVyd2VuZGVuIG3DtmNodGVuLg</string>
+													<string key="NSContents">Deaktivieren Sie diese Option, wenn Sie „xclipboard“, „klipper“ oder einen beliebigen anderen X11-Zwischenablage-Manager verwenden möchten.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="620944856"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -988,8 +977,7 @@ LU1hbmFnZXIgdmVyd2VuZGVuIG3DtmNodGVuLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="994587858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QXVmZ3J1bmQgdm9uIEVpbnNjaHLDpG5rdW5nZW4gaW0gWDExLVByb3Rva29sbCBmdW5rdGlvbmllcnQg
-ZGllc2UgT3B0aW9uIGluIG1hbmNoZW4gUHJvZ3JhbW1lbiB1LiBVLiBuaWNodCBpbW1lci4</string>
+													<string key="NSContents">Aufgrund von Einschränkungen im X11-Protokoll funktioniert diese Option in manchen Programmen u. U. nicht immer.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="522511724"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1043,8 +1031,7 @@ ZGllc2UgT3B0aW9uIGluIG1hbmNoZW4gUHJvZ3JhbW1lbiB1LiBVLiBuaWNodCBpbW1lci4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="399127858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QmVpIEFrdGl2aWVydW5nIHdpcmQgYmVpbSBLbGlja2VuIGF1ZiBlaW4gaW5ha3RpdmVzIEZlbnN0ZXIg
-ZGVyIE1hdXNrbGljayB6dXPDpHR6bGljaCBhbiBkaWVzZXMgRmVuc3RlciB3ZWl0ZXJnZWdlYmVuLg</string>
+													<string key="NSContents">Bei Aktivierung wird beim Klicken auf ein inaktives Fenster der Mausklick zusätzlich an dieses Fenster weitergegeben.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="290578835"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1120,9 +1107,7 @@ ZGVyIE1hdXNrbGljayB6dXPDpHR6bGljaCBhbiBkaWVzZXMgRmVuc3RlciB3ZWl0ZXJnZWdlYmVuLg</
 												<object class="NSTextFieldCell" key="NSCell" id="989804990">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QmVpIEFrdGl2aWVydW5nIHdpcmQgYmVpbSBFcnpldWdlbiBlaW5lcyBuZXVlbiBYMTEtRmVuc3RlcnMg
-ZGFzIOKAnlgxMS5hcHDigJwgaW4gZGVuIFZvcmRlcmdydW5kIGdlYnJhY2h0IChhbnN0ZWxsZSB2b24g
-4oCeRmluZGVyLmFwcOKAnCwg4oCeVGVybWluYWwuYXBw4oCcIHVzdy4pLg</string>
+													<string key="NSContents">Bei Aktivierung wird beim Erzeugen eines neuen X11-Fensters das „X11.app“ in den Vordergrund gebracht (anstelle von „Finder.app“, „Terminal.app“ usw.).</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="57161931"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1195,11 +1180,7 @@ ZGFzIOKAnlgxMS5hcHDigJwgaW4gZGVuIFZvcmRlcmdydW5kIGdlYnJhY2h0IChhbnN0ZWxsZSB2b24g
 												<object class="NSTextFieldCell" key="NSCell" id="53243865">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QmVpbSBTdGFydGVuIHZvbiBYMTEgd2VyZGVuIFhhdXRob3JpdHktU2NobMO8c3NlbCB6dXIgWnVncmlm
-ZnNrb250cm9sbGUgZXJzdGVsbHQuIFdlbm4gc2ljaCBkaWUgSVAtQWRyZXNzZSBkZXMgU3lzdGVtcyDD
-pG5kZXJ0LCBzaW5kIGRpZXNlIFNjaGzDvHNzZWwgbmljaHQgbWVociBnw7xsdGlnLiBNw7ZnbGljaGVy
-d2Vpc2Uga8O2bm5lbiBkaWUgWDExLVByb2dyYW1tZSBkYW5uIG5pY2h0IG1laHIgZ2VzdGFydGV0IHdl
-cmRlbi4</string>
+													<string key="NSContents">Beim Starten von X11 werden Xauthority-Schlüssel zur Zugriffskontrolle erstellt. Wenn sich die IP-Adresse des Systems ändert, sind diese Schlüssel nicht mehr gültig. Möglicherweise können die X11-Programme dann nicht mehr gestartet werden.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="168436707"/>
@@ -1216,10 +1197,7 @@ cmRlbi4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="390084685">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QmVpIEFrdGl2aWVydW5nIG11c3Mg4oCeVmVyYmluZHVuZ2VuIElkZW50aWZpemllcmVu4oCcIGViZW5m
-YWxscyBha3RpdmllcnQgc2VpbiwgZGFtaXQgZGllIFNpY2hlcmhlaXQgZGVzIFN5c3RlbSBnZXfDpGhy
-bGVpc3RldCBpc3QuIEJlaSBEZWFrdGl2aWVydW5nIHNpbmQgVmVyYmluZHVuZ2VuIHZvbiBlbnRmZXJu
-dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
+													<string key="NSContents">Bei Aktivierung muss „Verbindungen Identifizieren“ ebenfalls aktiviert sein, damit die Sicherheit des System gewährleistet ist. Bei Deaktivierung sind Verbindungen von entfernten Programmen nicht erlaubt.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="363817195"/>
@@ -1236,7 +1214,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="283628678">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">RGllc2UgT3B0aW9uZW4gd2VyZGVuIGJlaW0gbsOkY2hzdGVuIFN0YXJ0IHZvbiBYMTEgd2lya3NhbS4</string>
+													<string key="NSContents">Diese Optionen werden beim nächsten Start von X11 wirksam.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="223835729"/>
@@ -1267,7 +1245,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSFrameAutosaveName">x11_prefs</string>
 			</object>
 			<object class="NSWindowTemplate" id="604417141">
@@ -1275,12 +1253,12 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 				<int key="NSWindowBacking">2</int>
 				<string key="NSWindowRect">{{360, 400}, {512, 271}}</string>
 				<int key="NSWTFlags">1350041600</int>
-				<string type="base64-UTF8" key="NSWindowTitle">WDExLVByb2dyYW1tbWVuw7w</string>
+				<string key="NSWindowTitle">X11-Programmmenü</string>
 				<string key="NSWindowClass">NSPanel</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="85544634">
 					<nil key="NSNextResponder"/>
@@ -1365,17 +1343,17 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 											<object class="NSMutableArray" key="NSTableColumns">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<object class="NSTableColumn" id="938444323">
-													<double key="NSWidth">122.73099999999999</double>
-													<double key="NSMinWidth">62.731000000000002</double>
+													<double key="NSWidth">122.73100280761719</double>
+													<double key="NSMinWidth">62.730998992919922</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Name</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor" id="113872566">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+															<bytes key="NSWhite">MC4zMzMzMzI5ODU2AA</bytes>
 														</object>
 														<object class="NSColor" key="NSTextColor" id="249576247">
 															<int key="NSColorSpace">6</int>
@@ -1407,8 +1385,8 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 													<double key="NSMinWidth">40</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Befehl</string>
 														<reference key="NSSupport" ref="26"/>
 														<reference key="NSBackgroundColor" ref="113872566"/>
@@ -1434,8 +1412,8 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 													<double key="NSMinWidth">10</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">67239424</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Kurzbefehl</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor">
@@ -1492,6 +1470,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 											<int key="NSDraggingSourceMaskForLocal">-1</int>
 											<int key="NSDraggingSourceMaskForNonLocal">0</int>
 											<bool key="NSAllowsTypeSelect">YES</bool>
+											<int key="NSTableViewDraggingDestinationStyle">0</int>
 										</object>
 									</object>
 									<string key="NSFrame">{{1, 17}, {301, 198}}</string>
@@ -1508,7 +1487,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 									<reference key="NSSuperview" ref="1063387772"/>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">0.99492380000000002</double>
+									<double key="NSPercent">0.99492377042770386</double>
 								</object>
 								<object class="NSScroller" id="17278747">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1518,7 +1497,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 									<int key="NSsFlags">1</int>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">0.68852460000000004</double>
+									<double key="NSPercent">0.68852460384368896</double>
 								</object>
 								<object class="NSClipView" id="672307654">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1556,7 +1535,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 							<object class="NSButtonCell" key="NSCell" id="1025474039">
 								<int key="NSCellFlags">-2080244224</int>
 								<int key="NSCellFlags2">137887744</int>
-								<string type="base64-UTF8" key="NSContents">T2JqZWt0IGhpbnp1ZsO8Z2VuA</string>
+								<string key="NSContents">Objekt hinzufügen</string>
 								<reference key="NSSupport" ref="463863101"/>
 								<reference key="NSControlView" ref="758204686"/>
 								<int key="NSButtonFlags">-2038284033</int>
@@ -1575,11 +1554,11 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSFrameAutosaveName">x11_apps</string>
 			</object>
 			<object class="NSMenu" id="294137138">
-				<string type="base64-UTF8" key="NSTitle">TWVuw7w</string>
+				<string key="NSTitle">Menü</string>
 				<object class="NSMutableArray" key="NSMenuItems">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="NSMenuItem" id="318286212">
@@ -1619,7 +1598,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 								</object>
 								<object class="NSMenuItem" id="1032342329">
 									<reference key="NSMenu" ref="48278059"/>
-									<string type="base64-UTF8" key="NSTitle">QW5wYXNzZW4g4oCmA</string>
+									<string key="NSTitle">Anpassen …</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -2194,28 +2173,26 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="IBObjectRecord">
 						<int key="objectID">0</int>
-						<object class="NSArray" key="object" id="330408435">
-							<bool key="EncodedWithXMLCoder">YES</bool>
-						</object>
+						<reference key="object" ref="0"/>
 						<reference key="children" ref="904585544"/>
 						<nil key="parent"/>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-2</int>
 						<reference key="object" ref="815810918"/>
-						<reference key="parent" ref="330408435"/>
-						<string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">File's Owner</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-1</int>
 						<reference key="object" ref="941939442"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">First Responder</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-3</int>
 						<reference key="object" ref="951368722"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">Application</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2229,7 +2206,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 							<reference ref="868031522"/>
 							<reference ref="551174276"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">MainMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2474,7 +2451,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 					<object class="IBObjectRecord">
 						<int key="objectID">196</int>
 						<reference key="object" ref="485884620"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">X11Controller</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2484,7 +2461,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="941366957"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">PrefsPanel</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2748,7 +2725,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="85544634"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">EditPrograms</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2771,7 +2748,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 							<reference ref="318286212"/>
 							<reference ref="511651072"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">DockMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -3325,6 +3302,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 				<bool key="EncodedWithXMLCoder">YES</bool>
 				<object class="NSArray" key="dict.sortedKeys">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<string>-3.IBPluginDependency</string>
 					<string>-3.ImportedFromIB2</string>
 					<string>100292.IBPluginDependency</string>
 					<string>100293.IBPluginDependency</string>
@@ -3613,6 +3591,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 				</object>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3661,7 +3640,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
-					<string>{{168, 821}, {113, 23}}</string>
+					<string>{{300, 813}, {136, 23}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>{{202, 626}, {154, 153}}</string>
@@ -3676,7 +3655,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
-					<string>{{349, 858}, {315, 153}}</string>
+					<string>{{390, 683}, {240, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>{{271, 666}, {301, 153}}</string>
@@ -3694,7 +3673,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
-					<string>{{58, 803}, {155, 33}}</string>
+					<string>{{203, 803}, {150, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>{{100, 746}, {155, 33}}</string>
@@ -3884,7 +3863,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
-					<string>{{20, 641}, {218, 203}}</string>
+					<string>{{157, 633}, {309, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>{{79, 616}, {218, 203}}</string>
@@ -3902,9 +3881,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -3912,9 +3889,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 			<nil key="activeLocalization"/>
 			<object class="NSMutableDictionary" key="localizations">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -3952,6 +3927,15 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 			</object>
 		</object>
 		<int key="IBDocument.localizationMode">0</int>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+			<integer value="1050" key="NS.object.0"/>
+		</object>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+			<integer value="3000" key="NS.object.0"/>
+		</object>
+		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
 		<string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
 		<int key="IBDocument.defaultPropertyAccessControl">3</int>
 	</data>
diff --git a/hw/xquartz/bundle/Resources/German.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/German.lproj/main.nib/keyedobjects.nib
index a017a7f..2e0b337 100644
Binary files a/hw/xquartz/bundle/Resources/German.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/German.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/designable.nib
index adbcd6f..57b0629 100644
--- a/hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/designable.nib
@@ -2,13 +2,13 @@
 <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">10A314</string>
-		<string key="IBDocument.InterfaceBuilderVersion">718</string>
-		<string key="IBDocument.AppKitVersion">1013</string>
-		<string key="IBDocument.HIToolboxVersion">415.00</string>
+		<string key="IBDocument.SystemVersion">10A354</string>
+		<string key="IBDocument.InterfaceBuilderVersion">728</string>
+		<string key="IBDocument.AppKitVersion">1019</string>
+		<string key="IBDocument.HIToolboxVersion">421.00</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
-			<string key="NS.object.0">718</string>
+			<string key="NS.object.0">728</string>
 		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -306,8 +306,8 @@
 								<object class="NSMenuItem" id="1036389925">
 									<reference key="NSMenu" ref="96874957"/>
 									<string key="NSTitle">Recorrer ventanas</string>
-									<string key="NSKeyEquiv">`</string>
-									<int key="NSKeyEquivModMask">1048840</int>
+									<string key="NSKeyEquiv">&lt;</string>
+									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
@@ -315,8 +315,8 @@
 								<object class="NSMenuItem" id="369641893">
 									<reference key="NSMenu" ref="96874957"/>
 									<string key="NSTitle">Recorrer ventanas al revés</string>
-									<string key="NSKeyEquiv">~</string>
-									<int key="NSKeyEquivModMask">1179914</int>
+									<string key="NSKeyEquiv">&gt;</string>
+									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
@@ -397,10 +397,10 @@
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="941366957">
-					<reference key="NSNextResponder"/>
+					<nil key="NSNextResponder"/>
 					<int key="NSvFlags">256</int>
 					<object class="NSMutableArray" key="NSSubviews">
 						<bool key="EncodedWithXMLCoder">YES</bool>
@@ -409,7 +409,6 @@
 							<int key="NSvFlags">256</int>
 							<string key="NSFrame">{{13, 10}, {593, 292}}</string>
 							<reference key="NSSuperview" ref="941366957"/>
-							<reference key="NSWindow"/>
 							<object class="NSMutableArray" key="NSTabViewItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSTabViewItem" id="287591690">
@@ -426,7 +425,6 @@
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{18, 210}, {402, 18}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
-												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="990762273">
 													<int key="NSCellFlags">67239424</int>
@@ -458,7 +456,6 @@
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{36, 40}, {501, 42}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
-												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="391919450">
 													<int key="NSCellFlags">67239424</int>
@@ -477,7 +474,7 @@
 														<string key="NSColorName">controlColor</string>
 														<object class="NSColor" key="NSColor" id="193651701">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2ODY1AA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -496,7 +493,6 @@
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{36, 170}, {501, 34}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
-												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="649334366">
 													<int key="NSCellFlags">67239424</int>
@@ -515,7 +511,6 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{18, 88}, {402, 18}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
-												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="940564599">
 													<int key="NSCellFlags">67239424</int>
@@ -538,7 +533,6 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{36, 112}, {501, 28}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
-												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="666057093">
 													<int key="NSCellFlags">67239424</int>
@@ -556,7 +550,6 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{18, 146}, {402, 18}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
-												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="967619578">
 													<int key="NSCellFlags">67239424</int>
@@ -577,7 +570,6 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 										</object>
 										<string key="NSFrame">{{10, 33}, {573, 246}}</string>
 										<reference key="NSSuperview" ref="448510093"/>
-										<reference key="NSWindow"/>
 									</object>
 									<string key="NSLabel">Entrada</string>
 									<reference key="NSColor" ref="57160303"/>
@@ -657,7 +649,7 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 													<int key="NSPeriodicInterval">75</int>
 													<object class="NSMenuItem" key="NSMenuItem" id="616492372">
 														<reference key="NSMenu" ref="341113515"/>
-														<string key="NSTitle">Desde la pantalla</string>
+														<string key="NSTitle">De la pantalla</string>
 														<string key="NSKeyEquiv"/>
 														<int key="NSKeyEquivModMask">1048576</int>
 														<int key="NSMnemonicLoc">2147483647</int>
@@ -1248,12 +1240,10 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 						</object>
 					</object>
 					<string key="NSFrameSize">{619, 308}</string>
-					<reference key="NSSuperview"/>
-					<reference key="NSWindow"/>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1280, 938}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSFrameAutosaveName">x11_prefs</string>
 			</object>
 			<object class="NSWindowTemplate" id="604417141">
@@ -1266,10 +1256,10 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="85544634">
-					<reference key="NSNextResponder"/>
+					<nil key="NSNextResponder"/>
 					<int key="NSvFlags">256</int>
 					<object class="NSMutableArray" key="NSSubviews">
 						<bool key="EncodedWithXMLCoder">YES</bool>
@@ -1278,7 +1268,6 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 							<int key="NSvFlags">265</int>
 							<string key="NSFrame">{{340, 191}, {110, 32}}</string>
 							<reference key="NSSuperview" ref="85544634"/>
-							<reference key="NSWindow"/>
 							<bool key="NSEnabled">YES</bool>
 							<object class="NSButtonCell" key="NSCell" id="143554520">
 								<int key="NSCellFlags">67239424</int>
@@ -1302,7 +1291,6 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 							<int key="NSvFlags">265</int>
 							<string key="NSFrame">{{340, 159}, {110, 32}}</string>
 							<reference key="NSSuperview" ref="85544634"/>
-							<reference key="NSWindow"/>
 							<bool key="NSEnabled">YES</bool>
 							<object class="NSButtonCell" key="NSCell" id="8201128">
 								<int key="NSCellFlags">67239424</int>
@@ -1336,14 +1324,12 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 											<int key="NSvFlags">256</int>
 											<string key="NSFrameSize">{301, 198}</string>
 											<reference key="NSSuperview" ref="580565898"/>
-											<reference key="NSWindow"/>
 											<bool key="NSEnabled">YES</bool>
 											<object class="NSTableHeaderView" key="NSHeaderView" id="792419186">
 												<reference key="NSNextResponder" ref="672307654"/>
 												<int key="NSvFlags">256</int>
 												<string key="NSFrameSize">{301, 17}</string>
 												<reference key="NSSuperview" ref="672307654"/>
-												<reference key="NSWindow"/>
 												<reference key="NSTableView" ref="905092943"/>
 											</object>
 											<object class="_NSCornerView" key="NSCornerView" id="898633680">
@@ -1351,7 +1337,6 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{302, 0}, {16, 17}}</string>
 												<reference key="NSSuperview" ref="1063387772"/>
-												<reference key="NSWindow"/>
 											</object>
 											<object class="NSMutableArray" key="NSTableColumns">
 												<bool key="EncodedWithXMLCoder">YES</bool>
@@ -1366,7 +1351,7 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor" id="113872566">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+															<bytes key="NSWhite">MC4zMzMzMzI5ODU2AA</bytes>
 														</object>
 														<object class="NSColor" key="NSTextColor" id="336770154">
 															<int key="NSColorSpace">6</int>
@@ -1374,7 +1359,7 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 															<string key="NSColorName">disabledControlTextColor</string>
 															<object class="NSColor" key="NSColor">
 																<int key="NSColorSpace">3</int>
-																<bytes key="NSWhite">MC4zMzMzMzMzMzMzAA</bytes>
+																<bytes key="NSWhite">MC4zMzMzMzMzNDMzAA</bytes>
 															</object>
 														</object>
 													</object>
@@ -1494,7 +1479,6 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 									</object>
 									<string key="NSFrame">{{1, 17}, {301, 198}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
-									<reference key="NSWindow"/>
 									<reference key="NSNextKeyView" ref="905092943"/>
 									<reference key="NSDocView" ref="905092943"/>
 									<reference key="NSBGColor" ref="812484075"/>
@@ -1505,7 +1489,6 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 									<int key="NSvFlags">256</int>
 									<string key="NSFrame">{{302, 17}, {15, 198}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
-									<reference key="NSWindow"/>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
 									<double key="NSPercent">0.99492377042770386</double>
@@ -1515,11 +1498,10 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 									<int key="NSvFlags">256</int>
 									<string key="NSFrame">{{1, 215}, {301, 15}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
-									<reference key="NSWindow"/>
 									<int key="NSsFlags">1</int>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">0.99668874172185429</double>
+									<double key="NSPercent">0.99668872356414795</double>
 								</object>
 								<object class="NSClipView" id="672307654">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1530,7 +1512,6 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 									</object>
 									<string key="NSFrame">{{1, 0}, {301, 17}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
-									<reference key="NSWindow"/>
 									<reference key="NSNextKeyView" ref="792419186"/>
 									<reference key="NSDocView" ref="792419186"/>
 									<reference key="NSBGColor" ref="812484075"/>
@@ -1540,7 +1521,6 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 							</object>
 							<string key="NSFrame">{{20, 20}, {318, 231}}</string>
 							<reference key="NSSuperview" ref="85544634"/>
-							<reference key="NSWindow"/>
 							<reference key="NSNextKeyView" ref="580565898"/>
 							<int key="NSsFlags">50</int>
 							<reference key="NSVScroller" ref="842897584"/>
@@ -1555,7 +1535,6 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 							<int key="NSvFlags">265</int>
 							<string key="NSFrame">{{340, 223}, {114, 32}}</string>
 							<reference key="NSSuperview" ref="85544634"/>
-							<reference key="NSWindow"/>
 							<bool key="NSEnabled">YES</bool>
 							<object class="NSButtonCell" key="NSCell" id="1025474039">
 								<int key="NSCellFlags">-2080244224</int>
@@ -1576,12 +1555,10 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 						</object>
 					</object>
 					<string key="NSFrameSize">{454, 271}</string>
-					<reference key="NSSuperview"/>
-					<reference key="NSWindow"/>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1280, 938}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSFrameAutosaveName">x11_apps</string>
 			</object>
 			<object class="NSMenu" id="294137138">
@@ -3683,7 +3660,7 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
-					<string>{{349, 858}, {315, 153}}</string>
+					<string>{{373, 858}, {257, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>{{271, 666}, {301, 153}}</string>
@@ -3720,7 +3697,7 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
-					<string>{{145, 1011}, {336, 20}}</string>
+					<string>{{145, 1012}, {375, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>{{67, 819}, {336, 20}}</string>
@@ -3894,7 +3871,7 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
-					<string>{{20, 641}, {218, 203}}</string>
+					<string>{{157, 809}, {339, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>{{79, 616}, {218, 203}}</string>
diff --git a/hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/keyedobjects.nib
index 6d445d1..1277632 100644
Binary files a/hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/da.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/da.lproj/main.nib/designable.nib
index e0c838b..d20b182 100644
--- a/hw/xquartz/bundle/Resources/da.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/da.lproj/main.nib/designable.nib
@@ -1,13 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">9C31</string>
-		<string key="IBDocument.InterfaceBuilderVersion">677</string>
-		<string key="IBDocument.AppKitVersion">949.26</string>
-		<string key="IBDocument.HIToolboxVersion">352.00</string>
+		<string key="IBDocument.SystemVersion">10A354</string>
+		<string key="IBDocument.InterfaceBuilderVersion">728</string>
+		<string key="IBDocument.AppKitVersion">1019</string>
+		<string key="IBDocument.HIToolboxVersion">421.00</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+			<string key="NS.object.0">728</string>
+		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
+			<integer value="29"/>
 		</object>
 		<object class="NSArray" key="IBDocument.PluginDependencies">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -15,7 +20,7 @@
 		</object>
 		<object class="NSMutableDictionary" key="IBDocument.Metadata">
 			<bool key="EncodedWithXMLCoder">YES</bool>
-			<object class="NSArray" key="dict.sortedKeys">
+			<object class="NSArray" key="dict.sortedKeys" id="0">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 			</object>
 			<object class="NSMutableArray" key="dict.values">
@@ -116,7 +121,7 @@
 								</object>
 								<object class="NSMenuItem" id="6876565">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">U2zDpSBGdWxkIHNrw6ZybSB0aWwgb2cgZnJhA</string>
+									<string key="NSTitle">Slå Fuld skærm til og fra</string>
 									<string key="NSKeyEquiv">a</string>
 									<int key="NSKeyEquivModMask">1572864</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -301,18 +306,18 @@
 								</object>
 								<object class="NSMenuItem" id="1036389925">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">R2VubmVtZ8OlIHZpbmR1ZXI</string>
-									<string key="NSKeyEquiv">`</string>
-									<int key="NSKeyEquivModMask">1048840</int>
+									<string key="NSTitle">Gennemgå vinduer</string>
+									<string key="NSKeyEquiv">&lt;</string>
+									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
 								</object>
 								<object class="NSMenuItem" id="369641893">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">R2VubmVtZ8OlIHZpbmR1ZXIgbW9kc2F0A</string>
-									<string key="NSKeyEquiv">~</string>
-									<int key="NSKeyEquivModMask">1179914</int>
+									<string key="NSTitle">Gennemgå vinduer modsat</string>
+									<string key="NSKeyEquiv">&gt;</string>
+									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
@@ -354,7 +359,7 @@
 					</object>
 					<object class="NSMenuItem" id="551174276">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle">SGrDpmxwA</string>
+						<string key="NSTitle">Hjælp</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -362,12 +367,12 @@
 						<reference key="NSMixedImage" ref="351811234"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="511848303">
-							<string type="base64-UTF8" key="NSTitle">SGrDpmxwA</string>
+							<string key="NSTitle">Hjælp</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="504984881">
 									<reference key="NSMenu" ref="511848303"/>
-									<string type="base64-UTF8" key="NSTitle">WDExLWhqw6ZscA</string>
+									<string key="NSTitle">X11-hjælp</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -428,7 +433,7 @@
 													<string key="NSContents">Emuler mus med tre knapper</string>
 													<object class="NSFont" key="NSSupport" id="463863101">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">1044</int>
 													</object>
 													<reference key="NSControlView" ref="119157981"/>
@@ -456,12 +461,10 @@
 												<object class="NSTextFieldCell" key="NSCell" id="391919450">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">TsOlciB0YXN0YXR1cmdlbnZlamUgcMOlIG1lbnVsaW5qZW4gZXIgc2zDpWV0IHRpbCwga2FuIGRlIGhp
-bmRyZSBYMTEtcHJvZ3JhbW1lciwgZGVyIGJydWdlciAiTWV0YSBtb2RpZmllciIsIGkgYXQgZnVuZ2Vy
-ZS4</string>
+													<string key="NSContents">Når tastaturgenveje på menulinjen er slået til, kan de hindre X11-programmer, der bruger "Meta modifier", i at fungere.</string>
 													<object class="NSFont" key="NSSupport" id="26">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.100000e+01</double>
+														<double key="NSSize">11</double>
 														<int key="NSfFlags">3100</int>
 													</object>
 													<string key="NSPlaceholderString"/>
@@ -472,7 +475,7 @@ ZS4</string>
 														<string key="NSColorName">controlColor</string>
 														<object class="NSColor" key="NSColor" id="351482758">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2ODY1AA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -514,7 +517,7 @@ ZW4uCg</string>
 												<object class="NSButtonCell" key="NSCell" id="940564599">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">U2zDpSB0YXN0YXR1cmdlbnZlamUgdGlsIHVuZGVyIFgxMQ</string>
+													<string key="NSContents">Slå tastaturgenveje til under X11</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="842100515"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -536,8 +539,7 @@ ZW4uCg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="666057093">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">U2lrcmVyLCBhdCDDpm5kcmluZ2VyIGthbiBvdmVyc2tyaXZlIGRlbiBha3R1ZWxsZSBYMTEtdGFzdG92
-ZXJzaWd0Lg</string>
+													<string key="NSContents">Sikrer, at ændringer kan overskrive den aktuelle X11-tastoversigt.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="31160162"/>
@@ -554,7 +556,7 @@ ZXJzaWd0Lg</string>
 												<object class="NSButtonCell" key="NSCell" id="967619578">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">RsO4bGcgc3lzdGVtZXRzIHRhc3RhdHVybGF5b3V0A</string>
+													<string key="NSContents">Følg systemets tastaturlayout</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="179949713"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -638,7 +640,7 @@ ZXJzaWd0Lg</string>
 													<int key="NSButtonFlags2">1</int>
 													<object class="NSFont" key="NSAlternateImage">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">16</int>
 													</object>
 													<string key="NSAlternateContents"/>
@@ -649,7 +651,7 @@ ZXJzaWd0Lg</string>
 													<int key="NSPeriodicInterval">75</int>
 													<object class="NSMenuItem" key="NSMenuItem" id="616492372">
 														<reference key="NSMenu" ref="341113515"/>
-														<string type="base64-UTF8" key="NSTitle">RnJhIHNrw6ZybQ</string>
+														<string key="NSTitle">Fra skærm</string>
 														<string key="NSKeyEquiv"/>
 														<int key="NSKeyEquivModMask">1048576</int>
 														<int key="NSMnemonicLoc">2147483647</int>
@@ -705,6 +707,7 @@ ZXJzaWd0Lg</string>
 																<reference key="NSTarget" ref="633115429"/>
 															</object>
 														</object>
+														<reference key="NSMenuFont" ref="463863101"/>
 													</object>
 													<int key="NSPreferredEdge">3</int>
 													<bool key="NSUsesItemFromMenu">YES</bool>
@@ -738,7 +741,7 @@ ZXJzaWd0Lg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="311969422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">RGVubmUgaW5kc3RpbGxpbmcgdHLDpmRlciBpIGtyYWZ0LCBuw6VyIFgxMSBzdGFydGVzIGlnZW4uA</string>
+													<string key="NSContents">Denne indstilling træder i kraft, når X11 startes igen.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="86150604"/>
@@ -755,7 +758,7 @@ ZXJzaWd0Lg</string>
 												<object class="NSButtonCell" key="NSCell" id="631531164">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">RnVsZCBza8Omcm0</string>
+													<string key="NSContents">Fuld skærm</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477203622"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -777,7 +780,7 @@ ZXJzaWd0Lg</string>
 												<object class="NSButtonCell" key="NSCell" id="917248662">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">VmlzIGF1dG9tYXRpc2sgbWVudWxpbmplbiwgbsOlciBkZXIgYnJ1Z2VzIGZ1bGQgc2vDpnJtA</string>
+													<string key="NSContents">Vis automatisk menulinjen, når der bruges fuld skærm</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="57246850"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -799,8 +802,7 @@ ZXJzaWd0Lg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="761107402">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">U2zDpXIgWDExIHJvb3QtdmluZHVldCB0aWwuIEJydWcgS29tbWFuZG8tQWx0ZXJuYXRpdi1BIHRpbCBh
-dCBzbMOlIGZ1bmt0aW9uZW4gZnVsZCBza8Omcm0gdGlsIG9nIGZyYS4</string>
+													<string key="NSContents">Slår X11 root-vinduet til. Brug Kommando-Alternativ-A til at slå funktionen fuld skærm til og fra.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="298603383"/>
@@ -833,7 +835,7 @@ dCBzbMOlIGZ1bmt0aW9uZW4gZnVsZCBza8Omcm0gdGlsIG9nIGZyYS4</string>
 												<object class="NSButtonCell" key="NSCell" id="718083688">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">U2zDpSBzeW5rcm9uaXNlcmluZyB0aWw</string>
+													<string key="NSContents">Slå synkronisering til</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="878106058"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -855,9 +857,7 @@ dCBzbMOlIGZ1bmt0aW9uZW4gZnVsZCBza8Omcm0gdGlsIG9nIGZyYS4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="572508492">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">U2zDpXIga29tbWFuZG9lbiAia29waWVyIiB0aWwgb2cgZ8O4ciBkZXQgbXVsaWd0IGF0IHN5bmtyb25p
-c2VyZSBtZWxsZW0gT1NYLW9wc2xhZ3N0YXZsZW4gb2cgWDExLVVES0xJUFNIT0xERVJFTiBvZyBkZSBQ
-UklNw4ZSRSBidWZmZXJlLg</string>
+													<string key="NSContents">Slår kommandoen "kopier" til og gør det muligt at synkronisere mellem OSX-opslagstavlen og X11-UDKLIPSHOLDEREN og de PRIMÆRE buffere.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="386152084"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -873,7 +873,7 @@ UklNw4ZSRSBidWZmZXJlLg</string>
 												<object class="NSButtonCell" key="NSCell" id="501304422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">T3BkYXRlciBVREtMSVBTSE9MREVSLCBuw6VyIG9wc2xhZ3N0YXZsZW4gw6ZuZHJlcy4</string>
+													<string key="NSContents">Opdater UDKLIPSHOLDER, når opslagstavlen ændres.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477050998"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -895,8 +895,7 @@ UklNw4ZSRSBidWZmZXJlLg</string>
 												<object class="NSButtonCell" key="NSCell" id="510771323">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">T3BkYXRlciBQUklNw4ZSRSAoa2xpayBpIG1pZHRlbiksIG7DpXIgb3BzbGFnc3RhdmxlbiDDpm5kcmVz
-Lg</string>
+													<string key="NSContents">Opdater PRIMÆRE (klik i midten), når opslagstavlen ændres.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="765780304"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -918,7 +917,7 @@ Lg</string>
 												<object class="NSButtonCell" key="NSCell" id="897099877">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">T3BkYXRlciBvcHNsYWdzdGF2bGUgbWVkIGRldCBzYW1tZSwgbsOlciBueSB0ZWtzdCB2w6ZsZ2VzLg</string>
+													<string key="NSContents">Opdater opslagstavle med det samme, når ny tekst vælges.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="1002778833"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -940,7 +939,7 @@ Lg</string>
 												<object class="NSButtonCell" key="NSCell" id="619977658">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">T3BkYXRlciBvcHNsYWdzdGF2bGUsIG7DpXIgVURLTElQU0hPTERFUkVOIMOmbmRyZXMuA</string>
+													<string key="NSContents">Opdater opslagstavle, når UDKLIPSHOLDEREN ændres.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="487809555"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -962,9 +961,7 @@ Lg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="461823902">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">U2zDpSBkZW5uZSBpbmRzdGlsbGluZyBmcmEsIGh2aXMgZHUgaWtrZSB2aWwgYnJ1Z2UgeGNsaXBib2Fy
-ZCwga2xpcHBlciBlbGxlciBhbmRyZSBYMTEtdsOmcmt0w7hqZXIgdGlsIGFkbWluaXN0cmF0aW9uIGFm
-IHVka2xpcHNob2xkZXJlbi4</string>
+													<string key="NSContents">Slå denne indstilling fra, hvis du ikke vil bruge xclipboard, klipper eller andre X11-værktøjer til administration af udklipsholderen.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="620944856"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -980,8 +977,7 @@ IHVka2xpcHNob2xkZXJlbi4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="994587858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">UGdhLiBiZWdyw6Zuc25pbmdlciBpIFgxMS1wcm90b2tvbGxlbiB2aXJrZXIgZGVubmUgaW5kc3RpbGxp
-bmcgbcOlc2tlIGlra2UgaSBub2dsZSBwcm9ncmFtbWVyLg</string>
+													<string key="NSContents">Pga. begrænsninger i X11-protokollen virker denne indstilling måske ikke i nogle programmer.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="522511724"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1035,9 +1031,7 @@ bmcgbcOlc2tlIGlra2UgaSBub2dsZSBwcm9ncmFtbWVyLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="399127858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">TsOlciBkZW5uZSBtdWxpZ2hlZCBlciBzbMOlZXQgdGlsLCB2aWwgbXVzZW4sIG7DpXIgZHUga2xpa2tl
-ciBww6UgZXQgcGFzc2l2dCB2aW5kdWUsIGtsaWtrZSBpZ2VubmVtIHZpbmR1ZXQgdWQgb3ZlciBhdCBn
-w7hyZSBkZXQgYWt0aXZ0Lg</string>
+													<string key="NSContents">Når denne mulighed er slået til, vil musen, når du klikker på et passivt vindue, klikke igennem vinduet ud over at gøre det aktivt.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="290578835"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1053,7 +1047,7 @@ w7hyZSBkZXQgYWt0aXZ0Lg</string>
 												<object class="NSButtonCell" key="NSCell" id="959555182">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">Rm9rdXMgZsO4bGdlciBtdXNlbg</string>
+													<string key="NSContents">Fokus følger musen</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="992839333"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1075,7 +1069,7 @@ w7hyZSBkZXQgYWt0aXZ0Lg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="183409141">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">Rm9rdXMgaSBYMTEtdmluZHVldCBmw7hsZ2VyIG1hcmvDuHJlbg</string>
+													<string key="NSContents">Fokus i X11-vinduet følger markøren</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="138261120"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1091,7 +1085,7 @@ w7hyZSBkZXQgYWt0aXZ0Lg</string>
 												<object class="NSButtonCell" key="NSCell" id="556463187">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">Rm9rdXMgcMOlIG55ZSB2aW5kdWVyA</string>
+													<string key="NSContents">Fokus på nye vinduer</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="128352289"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1113,9 +1107,7 @@ w7hyZSBkZXQgYWt0aXZ0Lg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="989804990">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">TsOlciBkZW5uZSBtdWxpZ2hlZCBlciBzbMOlZXQgdGlsLCB2aWwgcHJvZ3JhbW1ldCBYMTEsIG7DpXIg
-ZGVyIG9wcmV0dGVzIGV0IG55dCBYMTEtdmluZHVlLCBhbmJyaW5nZXMgZm9ycmVzdCAoaSBzdGVkZXQg
-Zm9yIEZpbmRlciwgVGVybWluYWwgb3N2LikuA</string>
+													<string key="NSContents">Når denne mulighed er slået til, vil programmet X11, når der oprettes et nyt X11-vindue, anbringes forrest (i stedet for Finder, Terminal osv.).</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="57161931"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1166,7 +1158,7 @@ Zm9yIEZpbmRlciwgVGVybWluYWwgb3N2LikuA</string>
 												<object class="NSButtonCell" key="NSCell" id="489340979">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">VGlsbGFkIGZvcmJpbmRlbHNlciBmcmEgbmV0dsOmcmtza2xpZW50ZXI</string>
+													<string key="NSContents">Tillad forbindelser fra netværksklienter</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="700826966"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1188,9 +1180,7 @@ Zm9yIEZpbmRlciwgVGVybWluYWwgb3N2LikuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="53243865">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">TsOlciBYMTEgc3RhcnRlcywgb3ByZXR0ZXMgWGF1dGhvcml0eS10YXN0ZXIgdGlsIGFkZ2FuZ3Nrb250
-cm9sLiBIdmlzIHN5c3RlbWV0cyBJUC1hZHJlc3NlIMOmbmRyZXMsIGJsaXZlciBkaXNzZSB0YXN0ZXIg
-dWd5bGRpZ2UsIG9nIGRldCBrYW4gZm9yaGluZHJlIFgxMS1wcm9ncmFtbWVyIGkgYXQgc3RhcnRlLg</string>
+													<string key="NSContents">Når X11 startes, oprettes Xauthority-taster til adgangskontrol. Hvis systemets IP-adresse ændres, bliver disse taster ugyldige, og det kan forhindre X11-programmer i at starte.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="168436707"/>
@@ -1207,9 +1197,7 @@ dWd5bGRpZ2UsIG9nIGRldCBrYW4gZm9yaGluZHJlIFgxMS1wcm9ncmFtbWVyIGkgYXQgc3RhcnRlLg</
 												<object class="NSTextFieldCell" key="NSCell" id="390084685">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">SHZpcyBkZSBlciBzbMOlZXQgdGlsLCBza2FsIEdvZGtlbmQgZm9yYmluZGVsc2VyIG9nc8OlIHNsw6Vz
-IHRpbCBmb3IgYXQgc2lrcmUgc3lzdGVtZXRzIHNpa2tlcmhlZC4gTsOlciBkZSBlciBzbMOlZXQgZnJh
-LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
+													<string key="NSContents">Hvis de er slået til, skal Godkend forbindelser også slås til for at sikre systemets sikkerhed. Når de er slået fra, tillades forbindelser fra eksterne programmer ikke.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="363817195"/>
@@ -1226,7 +1214,7 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="283628678">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">RGlzc2UgaW5kc3RpbGxpbmdlciB0csOmZGVyIGkga3JhZnQsIG7DpXIgWDExIHN0YXJ0ZXMgaWdlbi4</string>
+													<string key="NSContents">Disse indstillinger træder i kraft, når X11 startes igen.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="223835729"/>
@@ -1355,17 +1343,17 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 											<object class="NSMutableArray" key="NSTableColumns">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<object class="NSTableColumn" id="938444323">
-													<double key="NSWidth">1.227310e+02</double>
-													<double key="NSMinWidth">6.273100e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">122.73100280761719</double>
+													<double key="NSMinWidth">62.730998992919922</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Navn</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor" id="113872566">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+															<bytes key="NSWhite">MC4zMzMzMzI5ODU2AA</bytes>
 														</object>
 														<object class="NSColor" key="NSTextColor" id="249576247">
 															<int key="NSColorSpace">6</int>
@@ -1393,12 +1381,12 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 												<object class="NSTableColumn" id="84282687">
-													<double key="NSWidth">1.000000e+02</double>
-													<double key="NSMinWidth">4.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">100</double>
+													<double key="NSMinWidth">40</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Kommando</string>
 														<reference key="NSSupport" ref="26"/>
 														<reference key="NSBackgroundColor" ref="113872566"/>
@@ -1420,12 +1408,12 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 												<object class="NSTableColumn" id="242608782">
-													<double key="NSWidth">6.900000e+01</double>
-													<double key="NSMinWidth">1.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">69</double>
+													<double key="NSMinWidth">10</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">67239424</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Genvej</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor">
@@ -1442,7 +1430,7 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 														<string key="NSContents">Text Cell</string>
 														<object class="NSFont" key="NSSupport">
 															<string key="NSName">LucidaGrande</string>
-															<double key="NSSize">1.200000e+01</double>
+															<double key="NSSize">12</double>
 															<int key="NSfFlags">16</int>
 														</object>
 														<string key="NSPlaceholderString"/>
@@ -1462,8 +1450,8 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 											</object>
-											<double key="NSIntercellSpacingWidth">3.000000e+00</double>
-											<double key="NSIntercellSpacingHeight">2.000000e+00</double>
+											<double key="NSIntercellSpacingWidth">3</double>
+											<double key="NSIntercellSpacingHeight">2</double>
 											<reference key="NSBackgroundColor" ref="822946413"/>
 											<object class="NSColor" key="NSGridColor">
 												<int key="NSColorSpace">6</int>
@@ -1474,12 +1462,15 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 													<bytes key="NSWhite">MC41AA</bytes>
 												</object>
 											</object>
-											<double key="NSRowHeight">1.700000e+01</double>
+											<double key="NSRowHeight">17</double>
 											<int key="NSTvFlags">1379958784</int>
+											<reference key="NSDelegate"/>
+											<reference key="NSDataSource"/>
 											<int key="NSColumnAutoresizingStyle">1</int>
 											<int key="NSDraggingSourceMaskForLocal">-1</int>
 											<int key="NSDraggingSourceMaskForNonLocal">0</int>
 											<bool key="NSAllowsTypeSelect">YES</bool>
+											<int key="NSTableViewDraggingDestinationStyle">0</int>
 										</object>
 									</object>
 									<string key="NSFrame">{{1, 17}, {301, 198}}</string>
@@ -1496,7 +1487,7 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 									<reference key="NSSuperview" ref="1063387772"/>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">9.949238e-01</double>
+									<double key="NSPercent">0.99492377042770386</double>
 								</object>
 								<object class="NSScroller" id="17278747">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1506,7 +1497,7 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 									<int key="NSsFlags">1</int>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">6.885246e-01</double>
+									<double key="NSPercent">0.68852460384368896</double>
 								</object>
 								<object class="NSClipView" id="672307654">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1544,7 +1535,7 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 							<object class="NSButtonCell" key="NSCell" id="1025474039">
 								<int key="NSCellFlags">-2080244224</int>
 								<int key="NSCellFlags2">137887744</int>
-								<string type="base64-UTF8" key="NSContents">VGlsZsO4aiBlbW5lA</string>
+								<string key="NSContents">Tilføj emne</string>
 								<reference key="NSSupport" ref="463863101"/>
 								<reference key="NSControlView" ref="758204686"/>
 								<int key="NSButtonFlags">-2038284033</int>
@@ -1607,7 +1598,7 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 								</object>
 								<object class="NSMenuItem" id="1032342329">
 									<reference key="NSMenu" ref="48278059"/>
-									<string type="base64-UTF8" key="NSTitle">SW5kc3RpbOKApg</string>
+									<string key="NSTitle">Indstil…</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -2182,28 +2173,26 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="IBObjectRecord">
 						<int key="objectID">0</int>
-						<object class="NSArray" key="object" id="330408435">
-							<bool key="EncodedWithXMLCoder">YES</bool>
-						</object>
+						<reference key="object" ref="0"/>
 						<reference key="children" ref="904585544"/>
 						<nil key="parent"/>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-2</int>
 						<reference key="object" ref="815810918"/>
-						<reference key="parent" ref="330408435"/>
-						<string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">File's Owner</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-1</int>
 						<reference key="object" ref="941939442"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">First Responder</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-3</int>
 						<reference key="object" ref="951368722"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">Application</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2217,7 +2206,7 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 							<reference ref="868031522"/>
 							<reference ref="551174276"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">MainMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2462,7 +2451,7 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 					<object class="IBObjectRecord">
 						<int key="objectID">196</int>
 						<reference key="object" ref="485884620"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">X11Controller</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2472,7 +2461,7 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="941366957"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">PrefsPanel</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2736,7 +2725,7 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="85544634"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">EditPrograms</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2759,7 +2748,7 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 							<reference ref="318286212"/>
 							<reference ref="511651072"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">DockMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -3311,10 +3300,8 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 			</object>
 			<object class="NSMutableDictionary" key="flattenedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSMutableArray" key="dict.sortedKeys">
+				<object class="NSArray" key="dict.sortedKeys">
 					<bool key="EncodedWithXMLCoder">YES</bool>
-					<string>-1.IBPluginDependency</string>
-					<string>-2.IBPluginDependency</string>
 					<string>-3.IBPluginDependency</string>
 					<string>-3.ImportedFromIB2</string>
 					<string>100292.IBPluginDependency</string>
@@ -3339,7 +3326,6 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 					<string>100385.IBPluginDependency</string>
 					<string>100386.IBPluginDependency</string>
 					<string>100541.IBPluginDependency</string>
-					<string>100541.IBPropertyAccessControl</string>
 					<string>100543.IBPluginDependency</string>
 					<string>129.IBPluginDependency</string>
 					<string>129.ImportedFromIB2</string>
@@ -3356,7 +3342,6 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 					<string>144.IBPluginDependency</string>
 					<string>144.ImportedFromIB2</string>
 					<string>145.IBPluginDependency</string>
-					<string>145.IBPropertyAccessControl</string>
 					<string>145.ImportedFromIB2</string>
 					<string>149.IBPluginDependency</string>
 					<string>149.ImportedFromIB2</string>
@@ -3372,7 +3357,6 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 					<string>169.editorWindowContentRectSynchronizationRect</string>
 					<string>19.IBPluginDependency</string>
 					<string>19.ImportedFromIB2</string>
-					<string>196.IBPluginDependency</string>
 					<string>196.ImportedFromIB2</string>
 					<string>200295.IBPluginDependency</string>
 					<string>200295.IBShouldRemoveOnLegacySave</string>
@@ -3387,7 +3371,7 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 					<string>24.ImportedFromIB2</string>
 					<string>24.editorWindowContentRectSynchronizationRect</string>
 					<string>244.IBEditorWindowLastContentRect</string>
-					<string>244.IBPropertyAccessControl</string>
+					<string>244.IBPluginDependency</string>
 					<string>244.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>244.IBWindowTemplateEditedContentRect</string>
 					<string>244.ImportedFromIB2</string>
@@ -3397,7 +3381,6 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 					<string>244.windowTemplate.maxSize</string>
 					<string>244.windowTemplate.minSize</string>
 					<string>245.IBPluginDependency</string>
-					<string>245.IBPropertyAccessControl</string>
 					<string>245.ImportedFromIB2</string>
 					<string>269.IBPluginDependency</string>
 					<string>269.ImportedFromIB2</string>
@@ -3408,6 +3391,7 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 					<string>272.IBPluginDependency</string>
 					<string>272.ImportedFromIB2</string>
 					<string>285.IBEditorWindowLastContentRect</string>
+					<string>285.IBPluginDependency</string>
 					<string>285.IBViewEditorWindowController.showingBoundsRectangles</string>
 					<string>285.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>285.IBWindowTemplateEditedContentRect</string>
@@ -3432,10 +3416,8 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 					<string>296.IBPluginDependency</string>
 					<string>296.ImportedFromIB2</string>
 					<string>297.IBPluginDependency</string>
-					<string>297.IBPropertyAccessControl</string>
 					<string>297.ImportedFromIB2</string>
 					<string>298.IBPluginDependency</string>
-					<string>298.IBPropertyAccessControl</string>
 					<string>298.ImportedFromIB2</string>
 					<string>300295.IBPluginDependency</string>
 					<string>300295.IBShouldRemoveOnLegacySave</string>
@@ -3444,160 +3426,113 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 					<string>300337.IBPluginDependency</string>
 					<string>300337.ImportedFromIB2</string>
 					<string>300338.IBPluginDependency</string>
-					<string>300338.IBPropertyAccessControl</string>
 					<string>300338.ImportedFromIB2</string>
 					<string>300358.IBPluginDependency</string>
-					<string>300358.IBPropertyAccessControl</string>
 					<string>300358.ImportedFromIB2</string>
 					<string>300359.IBPluginDependency</string>
-					<string>300359.IBPropertyAccessControl</string>
 					<string>300359.ImportedFromIB2</string>
 					<string>300360.IBPluginDependency</string>
 					<string>300361.IBPluginDependency</string>
 					<string>300362.IBPluginDependency</string>
-					<string>300362.IBPropertyAccessControl</string>
 					<string>300362.ImportedFromIB2</string>
 					<string>300363.IBPluginDependency</string>
 					<string>300364.IBPluginDependency</string>
-					<string>300364.IBPropertyAccessControl</string>
 					<string>300364.ImportedFromIB2</string>
 					<string>300365.IBPluginDependency</string>
 					<string>300368.IBPluginDependency</string>
-					<string>300368.IBPropertyAccessControl</string>
 					<string>300368.ImportedFromIB2</string>
 					<string>300369.IBPluginDependency</string>
 					<string>300370.IBPluginDependency</string>
-					<string>300370.IBPropertyAccessControl</string>
 					<string>300370.ImportedFromIB2</string>
 					<string>300371.IBPluginDependency</string>
 					<string>300421.IBPluginDependency</string>
-					<string>300421.IBPropertyAccessControl</string>
 					<string>300421.ImportedFromIB2</string>
 					<string>300422.IBPluginDependency</string>
-					<string>300422.IBPropertyAccessControl</string>
 					<string>300422.ImportedFromIB2</string>
 					<string>300423.IBPluginDependency</string>
-					<string>300423.IBPropertyAccessControl</string>
 					<string>300423.ImportedFromIB2</string>
 					<string>300424.IBPluginDependency</string>
-					<string>300424.IBPropertyAccessControl</string>
 					<string>300424.ImportedFromIB2</string>
 					<string>300440.IBPluginDependency</string>
-					<string>300440.IBPropertyAccessControl</string>
 					<string>300441.IBPluginDependency</string>
-					<string>300441.IBPropertyAccessControl</string>
 					<string>300447.IBPluginDependency</string>
-					<string>300447.IBPropertyAccessControl</string>
 					<string>300447.ImportedFromIB2</string>
 					<string>300450.IBPluginDependency</string>
-					<string>300450.IBPropertyAccessControl</string>
 					<string>300451.IBPluginDependency</string>
-					<string>300451.IBPropertyAccessControl</string>
 					<string>300451.ImportedFromIB2</string>
 					<string>300452.IBPluginDependency</string>
-					<string>300452.IBPropertyAccessControl</string>
 					<string>300453.IBPluginDependency</string>
-					<string>300453.IBPropertyAccessControl</string>
 					<string>300453.ImportedFromIB2</string>
 					<string>300454.IBPluginDependency</string>
-					<string>300454.IBPropertyAccessControl</string>
 					<string>300455.IBPluginDependency</string>
-					<string>300455.IBPropertyAccessControl</string>
 					<string>300455.ImportedFromIB2</string>
 					<string>300456.IBPluginDependency</string>
-					<string>300456.IBPropertyAccessControl</string>
 					<string>300457.IBPluginDependency</string>
-					<string>300457.IBPropertyAccessControl</string>
 					<string>300457.ImportedFromIB2</string>
 					<string>300458.IBPluginDependency</string>
-					<string>300458.IBPropertyAccessControl</string>
 					<string>300459.IBPluginDependency</string>
-					<string>300459.IBPropertyAccessControl</string>
 					<string>300459.ImportedFromIB2</string>
 					<string>300460.IBPluginDependency</string>
-					<string>300460.IBPropertyAccessControl</string>
 					<string>300472.IBPluginDependency</string>
-					<string>300472.IBPropertyAccessControl</string>
 					<string>300472.ImportedFromIB2</string>
 					<string>300473.IBPluginDependency</string>
-					<string>300473.IBPropertyAccessControl</string>
 					<string>305.IBPluginDependency</string>
 					<string>305.ImportedFromIB2</string>
 					<string>310.IBPluginDependency</string>
 					<string>310.ImportedFromIB2</string>
 					<string>348.IBPluginDependency</string>
-					<string>348.IBPropertyAccessControl</string>
 					<string>348.ImportedFromIB2</string>
 					<string>349.IBPluginDependency</string>
 					<string>349.ImportedFromIB2</string>
 					<string>350.IBPluginDependency</string>
-					<string>350.IBPropertyAccessControl</string>
 					<string>350.ImportedFromIB2</string>
 					<string>351.IBPluginDependency</string>
-					<string>351.IBPropertyAccessControl</string>
 					<string>351.ImportedFromIB2</string>
 					<string>352.IBPluginDependency</string>
 					<string>352.ImportedFromIB2</string>
 					<string>353.IBPluginDependency</string>
 					<string>353.ImportedFromIB2</string>
 					<string>354.IBPluginDependency</string>
-					<string>354.IBPropertyAccessControl</string>
 					<string>354.ImportedFromIB2</string>
 					<string>363.IBPluginDependency</string>
-					<string>363.IBPropertyAccessControl</string>
 					<string>363.ImportedFromIB2</string>
 					<string>364.IBPluginDependency</string>
-					<string>364.IBPropertyAccessControl</string>
 					<string>364.ImportedFromIB2</string>
 					<string>365.IBPluginDependency</string>
-					<string>365.IBPropertyAccessControl</string>
 					<string>365.ImportedFromIB2</string>
 					<string>368.IBPluginDependency</string>
-					<string>368.IBPropertyAccessControl</string>
 					<string>368.ImportedFromIB2</string>
 					<string>369.IBPluginDependency</string>
-					<string>369.IBPropertyAccessControl</string>
 					<string>369.ImportedFromIB2</string>
 					<string>370.IBPluginDependency</string>
-					<string>370.IBPropertyAccessControl</string>
 					<string>370.ImportedFromIB2</string>
 					<string>371.IBPluginDependency</string>
-					<string>371.IBPropertyAccessControl</string>
 					<string>371.ImportedFromIB2</string>
 					<string>372.IBPluginDependency</string>
-					<string>372.IBPropertyAccessControl</string>
 					<string>372.ImportedFromIB2</string>
 					<string>374.IBPluginDependency</string>
-					<string>374.IBPropertyAccessControl</string>
 					<string>374.ImportedFromIB2</string>
 					<string>375.IBPluginDependency</string>
-					<string>375.IBPropertyAccessControl</string>
 					<string>375.ImportedFromIB2</string>
 					<string>376.IBPluginDependency</string>
-					<string>376.IBPropertyAccessControl</string>
 					<string>376.ImportedFromIB2</string>
 					<string>377.IBPluginDependency</string>
-					<string>377.IBPropertyAccessControl</string>
 					<string>377.ImportedFromIB2</string>
 					<string>379.IBPluginDependency</string>
-					<string>379.IBPropertyAccessControl</string>
 					<string>379.ImportedFromIB2</string>
 					<string>380.IBPluginDependency</string>
 					<string>380.ImportedFromIB2</string>
 					<string>381.IBPluginDependency</string>
 					<string>381.ImportedFromIB2</string>
 					<string>382.IBPluginDependency</string>
-					<string>382.IBPropertyAccessControl</string>
 					<string>382.ImportedFromIB2</string>
 					<string>383.IBPluginDependency</string>
 					<string>383.ImportedFromIB2</string>
 					<string>384.IBPluginDependency</string>
 					<string>384.ImportedFromIB2</string>
 					<string>385.IBPluginDependency</string>
-					<string>385.IBPropertyAccessControl</string>
 					<string>385.ImportedFromIB2</string>
 					<string>386.IBPluginDependency</string>
-					<string>386.IBPropertyAccessControl</string>
 					<string>386.ImportedFromIB2</string>
 					<string>419.IBPluginDependency</string>
 					<string>419.ImportedFromIB2</string>
@@ -3630,10 +3565,8 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 					<string>538.IBPluginDependency</string>
 					<string>538.ImportedFromIB2</string>
 					<string>541.IBPluginDependency</string>
-					<string>541.IBPropertyAccessControl</string>
 					<string>541.ImportedFromIB2</string>
 					<string>543.IBPluginDependency</string>
-					<string>543.IBPropertyAccessControl</string>
 					<string>543.ImportedFromIB2</string>
 					<string>544.IBPluginDependency</string>
 					<string>544.ImportedFromIB2</string>
@@ -3659,13 +3592,11 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="1" id="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3684,329 +3615,273 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3" id="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{168, 821}, {113, 23}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{202, 626}, {154, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
+					<string>{{375, 858}, {261, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>{{349, 858}, {315, 153}}</string>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{271, 666}, {301, 153}}</string>
 					<string>{{437, 548}, {484, 308}}</string>
-					<reference ref="11"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="NO"/>
 					<string>{{437, 548}, {484, 308}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{184, 290}, {481, 345}}</string>
-					<integer value="0" id="8"/>
-					<reference ref="9"/>
+					<integer value="0"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{58, 803}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{100, 746}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{68, 585}, {454, 271}}</string>
-					<reference ref="9"/>
-					<reference ref="9"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
+					<integer value="1"/>
 					<string>{{68, 585}, {454, 271}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{433, 406}, {486, 327}}</string>
-					<reference ref="8"/>
-					<reference ref="9"/>
+					<integer value="0"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>{{145, 1011}, {336, 20}}</string>
+					<integer value="1"/>
+					<string>{{145, 1011}, {366, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{67, 819}, {336, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{20, 641}, {218, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{79, 616}, {218, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 				</object>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -4014,9 +3889,7 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 			<nil key="activeLocalization"/>
 			<object class="NSMutableDictionary" key="localizations">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -4054,7 +3927,16 @@ LCB0aWxsYWRlcyBmb3JiaW5kZWxzZXIgZnJhIGVrc3Rlcm5lIHByb2dyYW1tZXIgaWtrZS4</string>
 			</object>
 		</object>
 		<int key="IBDocument.localizationMode">0</int>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+			<integer value="1050" key="NS.object.0"/>
+		</object>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+			<integer value="3000" key="NS.object.0"/>
+		</object>
+		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
 		<string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
-		<int key="IBDocument.defaultPropertyAccessControl">1</int>
+		<int key="IBDocument.defaultPropertyAccessControl">3</int>
 	</data>
 </archive>
diff --git a/hw/xquartz/bundle/Resources/da.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/da.lproj/main.nib/keyedobjects.nib
index e1c0a2e..73c762c 100644
Binary files a/hw/xquartz/bundle/Resources/da.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/da.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/fi.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/fi.lproj/main.nib/designable.nib
index dbdfc1e..05c2b0f 100644
--- a/hw/xquartz/bundle/Resources/fi.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/fi.lproj/main.nib/designable.nib
@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.05">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">10A222</string>
-		<string key="IBDocument.InterfaceBuilderVersion">708</string>
-		<string key="IBDocument.AppKitVersion">994.5</string>
-		<string key="IBDocument.HIToolboxVersion">404.00</string>
+		<string key="IBDocument.SystemVersion">10A354</string>
+		<string key="IBDocument.InterfaceBuilderVersion">728</string>
+		<string key="IBDocument.AppKitVersion">1019</string>
+		<string key="IBDocument.HIToolboxVersion">421.00</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
-			<string key="NS.object.0">708</string>
+			<string key="NS.object.0">728</string>
 		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -19,7 +19,7 @@
 		</object>
 		<object class="NSMutableDictionary" key="IBDocument.Metadata">
 			<bool key="EncodedWithXMLCoder">YES</bool>
-			<object class="NSArray" key="dict.sortedKeys">
+			<object class="NSArray" key="dict.sortedKeys" id="0">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 			</object>
 			<object class="NSMutableArray" key="dict.values">
@@ -120,7 +120,7 @@
 								</object>
 								<object class="NSMenuItem" id="6876565">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">VmFpaGRhIGtva28gbsOkeXTDtm4gdGlsYQ</string>
+									<string key="NSTitle">Vaihda koko näytön tila</string>
 									<string key="NSKeyEquiv">a</string>
 									<int key="NSKeyEquivModMask">1572864</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -140,7 +140,7 @@
 								</object>
 								<object class="NSMenuItem" id="301008465">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">S8OkdGtlIFgxMQ</string>
+									<string key="NSTitle">Kätke X11</string>
 									<string key="NSKeyEquiv">h</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -150,7 +150,7 @@
 								</object>
 								<object class="NSMenuItem" id="206802571">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">S8OkdGtlIG11dXQ</string>
+									<string key="NSTitle">Kätke muut</string>
 									<string key="NSKeyEquiv">h</string>
 									<int key="NSKeyEquivModMask">1572864</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -159,7 +159,7 @@
 								</object>
 								<object class="NSMenuItem" id="1023546148">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">TsOkeXTDpCBrYWlra2k</string>
+									<string key="NSTitle">Näytä kaikki</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -276,7 +276,7 @@
 								</object>
 								<object class="NSMenuItem" id="677652931">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">UGllbmVubsOkA</string>
+									<string key="NSTitle">Pienennä</string>
 									<string key="NSKeyEquiv">m</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -285,7 +285,7 @@
 								</object>
 								<object class="NSMenuItem" id="1066447520">
 									<reference key="NSMenu" ref="96874957"/>
-									<string key="NSTitle">Zoomaus</string>
+									<string key="NSTitle">Zoomaa</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -305,18 +305,18 @@
 								</object>
 								<object class="NSMenuItem" id="1036389925">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">S8OkeSBpa2t1bm9pdGEgbMOkcGk</string>
-									<string key="NSKeyEquiv">`</string>
-									<int key="NSKeyEquivModMask">1048840</int>
+									<string key="NSTitle">Käy ikkunoita läpi</string>
+									<string key="NSKeyEquiv">&lt;</string>
+									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
 								</object>
 								<object class="NSMenuItem" id="369641893">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">S8OkeSBpa2t1bm9pdGEgbMOkcGkga8Okw6RudGVpc2Vzc8OkIGrDpHJqZXN0eWtzZXNzw6Q</string>
-									<string key="NSKeyEquiv">~</string>
-									<int key="NSKeyEquivModMask">1179914</int>
+									<string key="NSTitle">Käy ikkunoita läpi käänteisessä järjestyksessä</string>
+									<string key="NSKeyEquiv">&gt;</string>
+									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
@@ -397,7 +397,7 @@
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="941366957">
 					<nil key="NSNextResponder"/>
@@ -429,7 +429,7 @@
 												<object class="NSButtonCell" key="NSCell" id="990762273">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">RW11bG9pIGtvbG1lbsOkcHDDpGltaXN0w6QgaGlpcnTDpA</string>
+													<string key="NSContents">Emuloi kolmenäppäimistä hiirtä</string>
 													<object class="NSFont" key="NSSupport" id="463863101">
 														<string key="NSName">LucidaGrande</string>
 														<double key="NSSize">13</double>
@@ -460,9 +460,7 @@
 												<object class="NSTextFieldCell" key="NSCell" id="391919450">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">S3VuIGvDpHl0w7Zzc8OkLCB2YWxpa2tvcml2aW4gbsOkcHDDpGludmFzdGluZWV0IHNhYXR0YXZhdCBo
-w6Rpcml0w6QgWDExLW9oamVsbWlhLCBqb3RrYSBrw6R5dHTDpHbDpHQgTWV0YS1tdXVudG9uw6RwcMOk
-aW50w6QuA</string>
+													<string key="NSContents">Kun käytössä, valikkorivin näppäinvastineet saattavat häiritä X11-ohjelmia, jotka käyttävät Meta-muuntonäppäintä.</string>
 													<object class="NSFont" key="NSSupport" id="26">
 														<string key="NSName">LucidaGrande</string>
 														<double key="NSSize">11</double>
@@ -476,7 +474,7 @@ aW50w6QuA</string>
 														<string key="NSColorName">controlColor</string>
 														<object class="NSColor" key="NSColor" id="402953799">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2NwA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2ODY1AA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -517,7 +515,7 @@ dGFpIEtvbWVudG8tbsOkcHDDpGltacOkIHBhaW5ldHR1bmEgb3NvaXRldHRhZXNzYS4KA</string>
 												<object class="NSButtonCell" key="NSCell" id="940564599">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">T3RhIGvDpHl0dMO2w7ZuIG7DpHBww6RpbnZhc3RpbmVldCBYMTE6c3PDpA</string>
+													<string key="NSContents">Ota käyttöön näppäinvastineet X11:ssä</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="842100515"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -539,8 +537,7 @@ dGFpIEtvbWVudG8tbsOkcHDDpGltacOkIHBhaW5ldHR1bmEgb3NvaXRldHRhZXNzYS4KA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="666057093">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">U2FsbGkgc3nDtnR0w7Z2YWxpa29uIG11dXRvc3RlbiBrb3J2YXRhIG55a3lpbmVuIFgxMS1uw6RwcMOk
-aW5rYXJ0dGEuA</string>
+													<string key="NSContents">Salli syöttövalikon muutosten korvata nykyinen X11-näppäinkartta.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="31160162"/>
@@ -557,7 +554,7 @@ aW5rYXJ0dGEuA</string>
 												<object class="NSButtonCell" key="NSCell" id="967619578">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">Tm91ZGF0YSBqw6RyamVzdGVsbcOkbiBuw6RwcMOkaW5hc2V0dGVsdWE</string>
+													<string key="NSContents">Noudata järjestelmän näppäinasettelua</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="179949713"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -574,7 +571,7 @@ aW5rYXJ0dGEuA</string>
 										<string key="NSFrame">{{10, 33}, {474, 261}}</string>
 										<reference key="NSSuperview" ref="448510093"/>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">U3nDtnRlA</string>
+									<string key="NSLabel">Syöte</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -596,7 +593,7 @@ aW5rYXJ0dGEuA</string>
 												<object class="NSButtonCell" key="NSCell" id="1016069354">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">S8OkeXTDpCBqw6RyamVzdGVsbcOkbiB2YXJvaXR1c3RlaG9zdGV0dGE</string>
+													<string key="NSContents">Käytä järjestelmän varoitustehostetta</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="418227126"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -618,9 +615,7 @@ aW5rYXJ0dGEuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="624655599">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">WDExOm4gw6TDpG5pbWVya2l0IGvDpHl0dMOkdsOkdCBub3JtYWFsaWEgasOkcmplc3RlbG3DpHZhcm9p
-dHVzdGEsIGpva2EgbcOkw6RyaXRlbGzDpMOkbiDDhMOkbml0ZWhvc3RlZXQtasOkcmplc3RlbG3DpGFz
-ZXR1c3BhbmVlbGlzc2EuA</string>
+													<string key="NSContents">X11:n äänimerkit käyttävät normaalia järjestelmävaroitusta, joka määritellään Äänitehosteet-järjestelmäasetuspaneelissa.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="1039016593"/>
@@ -654,7 +649,7 @@ ZXR1c3BhbmVlbGlzc2EuA</string>
 													<int key="NSPeriodicInterval">75</int>
 													<object class="NSMenuItem" key="NSMenuItem" id="616492372">
 														<reference key="NSMenu" ref="341113515"/>
-														<string type="base64-UTF8" key="NSTitle">TsOkeXTDtmx0w6Q</string>
+														<string key="NSTitle">Näytöltä</string>
 														<string key="NSKeyEquiv"/>
 														<int key="NSKeyEquivModMask">1048576</int>
 														<int key="NSMnemonicLoc">2147483647</int>
@@ -675,7 +670,7 @@ ZXR1c3BhbmVlbGlzc2EuA</string>
 															<reference ref="616492372"/>
 															<object class="NSMenuItem" id="759499526">
 																<reference key="NSMenu" ref="341113515"/>
-																<string type="base64-UTF8" key="NSTitle">MjU2IHbDpHJpw6Q</string>
+																<string key="NSTitle">256 väriä</string>
 																<string key="NSKeyEquiv"/>
 																<int key="NSKeyEquivModMask">1048576</int>
 																<int key="NSMnemonicLoc">2147483647</int>
@@ -744,8 +739,7 @@ ZXR1c3BhbmVlbGlzc2EuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="311969422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">VMOkbcOkIHZhbGludGEgdHVsZWUgdm9pbWFhbiwga3VuIFgxMSBhdmF0YWFuIHNldXJhYXZhbiBrZXJy
-YW4uA</string>
+													<string key="NSContents">Tämä valinta tulee voimaan, kun X11 avataan seuraavan kerran.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="86150604"/>
@@ -762,7 +756,7 @@ YW4uA</string>
 												<object class="NSButtonCell" key="NSCell" id="631531164">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">S29rbyBuw6R5dMO2biB0aWxhA</string>
+													<string key="NSContents">Koko näytön tila</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477203622"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -784,7 +778,7 @@ YW4uA</string>
 												<object class="NSButtonCell" key="NSCell" id="917248662">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">TsOkeXTDpCB2YWxpa2tvcml2aSBhdXRvbWFhdHRpc2VzdGkga29rbyBuw6R5dMO2biB0aWxhc3NhA</string>
+													<string key="NSContents">Näytä valikkorivi automaattisesti koko näytön tilassa</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="57246850"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -806,8 +800,7 @@ YW4uA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="761107402">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">T3R0YWEga8OkeXR0w7bDtm4gWDExOm4ganV1cmktaWtrdW5hbi4gVm9pdCBzaWlydHnDpCBrb2tvIG7D
-pHl0w7ZuIHRpbGFhbiBqYSBzaWl0w6QgcG9pcyBwYWluYW1hbGxhIEtvbWVudG8tT3B0aW8tQS4</string>
+													<string key="NSContents">Ottaa käyttöön X11:n juuri-ikkunan. Voit siirtyä koko näytön tilaan ja siitä pois painamalla Komento-Optio-A.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="298603383"/>
@@ -840,7 +833,7 @@ pHl0w7ZuIHRpbGFhbiBqYSBzaWl0w6QgcG9pcyBwYWluYW1hbGxhIEtvbWVudG8tT3B0aW8tQS4</str
 												<object class="NSButtonCell" key="NSCell" id="718083688">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">T3RhIHN5bmtyb25vaW50aSBrw6R5dHTDtsO2bg</string>
+													<string key="NSContents">Ota synkronointi käyttöön</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="878106058"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -862,9 +855,7 @@ pHl0w7ZuIHRpbGFhbiBqYSBzaWl0w6QgcG9pcyBwYWluYW1hbGxhIEtvbWVudG8tT3B0aW8tQS4</str
 												<object class="NSTextFieldCell" key="NSCell" id="572508492">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">T3R0YWEga8OkeXR0w7bDtm4gS29waW9pLXZhbGlra29rb2h0ZWVuIGphIG1haGRvbGxpc3RhYSBzeW5r
-cm9ub2lubmluIE1hYyBPUyBYOm4gbGVpa2Vww7Z5ZMOkbiBqYSBYMTE6biBsZWlrZXDDtnlkw6RuIGph
-IGVuc2lzaWphaXNlbiB2YWxpbm5hbiBwdXNrdXJpbiB2w6RsaWxsw6QuA</string>
+													<string key="NSContents">Ottaa käyttöön Kopioi-valikkokohteen ja mahdollistaa synkronoinnin Mac OS X:n leikepöydän ja X11:n leikepöydän ja ensisijaisen valinnan puskurin välillä.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="386152084"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -880,8 +871,7 @@ IGVuc2lzaWphaXNlbiB2YWxpbm5hbiBwdXNrdXJpbiB2w6RsaWxsw6QuA</string>
 												<object class="NSButtonCell" key="NSCell" id="501304422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">UMOkaXZpdMOkIFgxMTpuIGxlaWtlcMO2eXTDpCwga3VuIE1hYyBPUyBYOm4gbGVpa2Vww7Z5dMOkIG11
-dXR0dXUuA</string>
+													<string key="NSContents">Päivitä X11:n leikepöytä, kun Mac OS X:n leikepöytä muuttuu.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477050998"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -903,8 +893,7 @@ dXR0dXUuA</string>
 												<object class="NSButtonCell" key="NSCell" id="510771323">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">UMOkaXZpdMOkIFgxMTpuIGVuc2lzaWphaW5lbiB2YWxpbnRhIChrZXNraW9zb2l0dXMpLCBrdW4gTWFj
-IE9TIFg6biBsZWlrZXDDtnl0w6QgbXV1dHR1dS4</string>
+													<string key="NSContents">Päivitä X11:n ensisijainen valinta (keskiosoitus), kun Mac OS X:n leikepöytä muuttuu.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="765780304"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -926,8 +915,7 @@ IE9TIFg6biBsZWlrZXDDtnl0w6QgbXV1dHR1dS4</string>
 												<object class="NSButtonCell" key="NSCell" id="897099877">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">UMOkaXZpdMOkIE1hYyBPUyBYOm4gbGVpa2Vww7Z5dMOkIGhldGksIGt1biB1dXR0YSB0ZWtzdGnDpCB2
-YWxpdGFhbi4</string>
+													<string key="NSContents">Päivitä Mac OS X:n leikepöytä heti, kun uutta tekstiä valitaan.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="1002778833"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -949,8 +937,7 @@ YWxpdGFhbi4</string>
 												<object class="NSButtonCell" key="NSCell" id="619977658">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">UMOkaXZpdMOkIE1hYyBPUyBYOm4gbGVpa2Vww7Z5dMOkIGhldGksIGt1biBYMTE6biBsZWlrZXDDtnl0
-w6QgbXV1dHR1dS4</string>
+													<string key="NSContents">Päivitä Mac OS X:n leikepöytä heti, kun X11:n leikepöytä muuttuu.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="487809555"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -972,8 +959,7 @@ w6QgbXV1dHR1dS4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="461823902">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">UG9pc3RhIHTDpG3DpCB2YWxpbnRhIGvDpHl0w7ZzdMOkLCBqb3MgaGFsdWF0IGvDpHl0dMOkw6QgeGNs
-aXBib2FyZGlhLCBrbGlwcGVyacOkIHRhaSBtdXV0YSBYMTEtbGVpa2Vww7Z5dMOkb2hqZWxtYWEuA</string>
+													<string key="NSContents">Poista tämä valinta käytöstä, jos haluat käyttää xclipboardia, klipperiä tai muuta X11-leikepöytäohjelmaa.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="620944856"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -989,8 +975,7 @@ aXBib2FyZGlhLCBrbGlwcGVyacOkIHRhaSBtdXV0YSBYMTEtbGVpa2Vww7Z5dMOkb2hqZWxtYWEuA</s
 												<object class="NSTextFieldCell" key="NSCell" id="994587858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">WDExLXByb3Rva29sbGFuIHJham9pdHVzdGVuIHZ1b2tzaSB0w6Rtw6QgdmFsaW50YSBlaSB2w6RsdHTD
-pG3DpHR0w6QgYWluYSB0b2ltaSBrYWlraXNzYSBvaGplbG1pc3NhLg</string>
+													<string key="NSContents">X11-protokollan rajoitusten vuoksi tämä valinta ei välttämättä aina toimi kaikissa ohjelmissa.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="522511724"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1000,7 +985,7 @@ pG3DpHR0w6QgYWluYSB0b2ltaSBrYWlraXNzYSBvaGplbG1pc3NhLg</string>
 										</object>
 										<string key="NSFrame">{{10, 33}, {474, 261}}</string>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">TGVpa2Vww7Z5dMOkA</string>
+									<string key="NSLabel">Leikepöytä</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -1016,13 +1001,13 @@ pG3DpHR0w6QgYWluYSB0b2ltaSBrYWlraXNzYSBvaGplbG1pc3NhLg</string>
 											<object class="NSButton" id="657659108">
 												<reference key="NSNextResponder" ref="184765684"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{15, 227}, {245, 18}}</string>
+												<string key="NSFrame">{{15, 227}, {299, 18}}</string>
 												<reference key="NSSuperview" ref="184765684"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="259618205">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">T3NvaXRhIGluYWt0aWl2aXN0ZW4gaWtrdW5vaWRlbiBsw6RwaQ</string>
+													<string key="NSContents">Huomioi osoitukset ei-aktiivisiin ikkunoihin</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="657659108"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1044,9 +1029,7 @@ pG3DpHR0w6QgYWluYSB0b2ltaSBrYWlraXNzYSBvaGplbG1pc3NhLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="399127858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">S3VuIGvDpHl0w7Zzc8OkLCBpbmFrdGlpdmlzZW4gaWtrdW5hbiBvc29pdHRhbWluZW4gc2FhIGhpaXJl
-biBvc29pdHVrc2VuIGt1bGtlbWFhbiBreXNlaXNlbGxlIGlra3VuYWxsZSBzZW4gYWt0aXZvaW1pc2Vu
-IGxpc8Oka3NpLg</string>
+													<string key="NSContents">Kun käytössä, ei-aktiivisen ikkunan osoittaminen saa hiiren osoituksen kulkemaan kyseiselle ikkunalle sen aktivoimisen lisäksi.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="290578835"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1062,7 +1045,7 @@ IGxpc8Oka3NpLg</string>
 												<object class="NSButtonCell" key="NSCell" id="959555182">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">S29oZGlzdHVzIHNldXJhYSBoaWlydMOkA</string>
+													<string key="NSContents">Kohdistus seuraa hiirtä</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="992839333"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1084,8 +1067,7 @@ IGxpc8Oka3NpLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="183409141">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">WDExOm4gaWtrdW5ha29oZGlzdHVzIHNldXJhYSBvc29pdGludGEuIFTDpGxsw6Qgb24gam9pdGFraW4g
-aGFpdHRhdmFpa3V0dWtzaWEuA</string>
+													<string key="NSContents">X11:n ikkunakohdistus seuraa osoitinta. Tällä on joitakin haittavaikutuksia.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="138261120"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1123,9 +1105,7 @@ aGFpdHRhdmFpa3V0dWtzaWEuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="989804990">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">S3VuIGvDpHl0w7Zzc8OkLCB1dWRlbiBYMTEtaWtrdW5hbiBsdW9taW5lbiBzYWEgWDExLmFwcGluIHNp
-aXJ0eW3DpMOkbiBldHVhbGFsbGUgKEZpbmRlci5hcHBpbiwgUMOkw6R0ZS5hcHBpbiBqbmUuIHNpamFz
-dGEpLg</string>
+													<string key="NSContents">Kun käytössä, uuden X11-ikkunan luominen saa X11.appin siirtymään etualalle (Finder.appin, Pääte.appin jne. sijasta).</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="57161931"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1198,10 +1178,7 @@ dGEpLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="53243865">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">WDExOm4gYXZhYW1pbmVuIGx1byBYYXV0aG9yaXR5LXDDpMOkc3luaGFsbGludGEtYXZhaW1pYS4gSm9z
-IGrDpHJqZXN0ZWxtw6RuIElQLW9zb2l0ZSBtdXV0dHV1LCBuw6Rpc3TDpCBhdmFpbWlzdGEgdHVsZWUg
-dmlyaGVlbGxpc2nDpCwgbWlrw6Qgc2FhdHRhYSBlc3TDpMOkIFgxMS1vaGplbG1pYSBhdmF1dHVtYXN0
-YS4</string>
+													<string key="NSContents">X11:n avaaminen luo Xauthority-pääsynhallinta-avaimia. Jos järjestelmän IP-osoite muuttuu, näistä avaimista tulee virheellisiä, mikä saattaa estää X11-ohjelmia avautumasta.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="168436707"/>
@@ -1218,10 +1195,7 @@ YS4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="390084685">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">Sm9zIHTDpG3DpCBvdGV0YWFuIGvDpHl0dMO2w7ZuLCDigJ1Ub2Rlbm5hIHlodGV5ZGV04oCdIHBpdMOk
-w6QgbXnDtnMgb3R0YWEga8OkeXR0w7bDtm4gasOkcmplc3RlbG3DpG4gdHVydmFsbGlzdXVkZW4gdmFy
-bWlzdGFtaXNla3NpLiBLdW4gdMOkbcOkIG9uIHBvaXMga8OkeXTDtnN0w6QsIHlodGV5a3Npw6QgZXTD
-pG9oamVsbWlzdGEgZWkgc2FsbGl0YS4</string>
+													<string key="NSContents">Jos tämä otetaan käyttöön, ”Todenna yhteydet” pitää myös ottaa käyttöön järjestelmän turvallisuuden varmistamiseksi. Kun tämä on pois käytöstä, yhteyksiä etäohjelmista ei sallita.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="363817195"/>
@@ -1238,8 +1212,7 @@ pG9oamVsbWlzdGEgZWkgc2FsbGl0YS4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="283628678">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">TsOkbcOkIHZhbGlubmF0IHR1bGV2YXQgdm9pbWFhbiwga3VuIFgxMSBhdmF0YWFuIHNldXJhYXZhbiBr
-ZXJyYW4uA</string>
+													<string key="NSContents">Nämä valinnat tulevat voimaan, kun X11 avataan seuraavan kerran.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="223835729"/>
@@ -1270,7 +1243,7 @@ ZXJyYW4uA</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1280, 938}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSFrameAutosaveName">x11_prefs</string>
 			</object>
 			<object class="NSWindowTemplate" id="604417141">
@@ -1283,7 +1256,7 @@ ZXJyYW4uA</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="85544634">
 					<nil key="NSNextResponder"/>
@@ -1368,17 +1341,17 @@ ZXJyYW4uA</string>
 											<object class="NSMutableArray" key="NSTableColumns">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<object class="NSTableColumn" id="938444323">
-													<double key="NSWidth">121.73099999999999</double>
-													<double key="NSMinWidth">62.731000000000002</double>
+													<double key="NSWidth">121.73100280761719</double>
+													<double key="NSMinWidth">62.730998992919922</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Nimi</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor" id="113872566">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+															<bytes key="NSWhite">MC4zMzMzMzI5ODU2AA</bytes>
 														</object>
 														<object class="NSColor" key="NSTextColor" id="249576247">
 															<int key="NSColorSpace">6</int>
@@ -1410,8 +1383,8 @@ ZXJyYW4uA</string>
 													<double key="NSMinWidth">40</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Komento</string>
 														<reference key="NSSupport" ref="26"/>
 														<reference key="NSBackgroundColor" ref="113872566"/>
@@ -1437,8 +1410,8 @@ ZXJyYW4uA</string>
 													<double key="NSMinWidth">10</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">67239424</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Oikotie</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor">
@@ -1495,6 +1468,7 @@ ZXJyYW4uA</string>
 											<int key="NSDraggingSourceMaskForLocal">-1</int>
 											<int key="NSDraggingSourceMaskForNonLocal">0</int>
 											<bool key="NSAllowsTypeSelect">YES</bool>
+											<int key="NSTableViewDraggingDestinationStyle">0</int>
 										</object>
 									</object>
 									<string key="NSFrame">{{1, 17}, {301, 198}}</string>
@@ -1511,7 +1485,7 @@ ZXJyYW4uA</string>
 									<reference key="NSSuperview" ref="1063387772"/>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">0.99492380000000002</double>
+									<double key="NSPercent">0.99492377042770386</double>
 								</object>
 								<object class="NSScroller" id="17278747">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1521,7 +1495,7 @@ ZXJyYW4uA</string>
 									<int key="NSsFlags">1</int>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">0.68852460000000004</double>
+									<double key="NSPercent">0.68852460384368896</double>
 								</object>
 								<object class="NSClipView" id="672307654">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1559,7 +1533,7 @@ ZXJyYW4uA</string>
 							<object class="NSButtonCell" key="NSCell" id="1025474039">
 								<int key="NSCellFlags">-2080244224</int>
 								<int key="NSCellFlags2">137887744</int>
-								<string type="base64-UTF8" key="NSContents">TGlzw6TDpCBrb2hkZQ</string>
+								<string key="NSContents">Lisää kohde</string>
 								<reference key="NSSupport" ref="463863101"/>
 								<reference key="NSControlView" ref="758204686"/>
 								<int key="NSButtonFlags">-2038284033</int>
@@ -1578,7 +1552,7 @@ ZXJyYW4uA</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1280, 938}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSFrameAutosaveName">x11_apps</string>
 			</object>
 			<object class="NSMenu" id="294137138">
@@ -1622,7 +1596,7 @@ ZXJyYW4uA</string>
 								</object>
 								<object class="NSMenuItem" id="1032342329">
 									<reference key="NSMenu" ref="48278059"/>
-									<string type="base64-UTF8" key="NSTitle">TXVva2thYeKApg</string>
+									<string key="NSTitle">Muokkaa…</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -2197,28 +2171,26 @@ ZXJyYW4uA</string>
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="IBObjectRecord">
 						<int key="objectID">0</int>
-						<object class="NSArray" key="object" id="330408435">
-							<bool key="EncodedWithXMLCoder">YES</bool>
-						</object>
+						<reference key="object" ref="0"/>
 						<reference key="children" ref="904585544"/>
 						<nil key="parent"/>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-2</int>
 						<reference key="object" ref="815810918"/>
-						<reference key="parent" ref="330408435"/>
-						<string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">File's Owner</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-1</int>
 						<reference key="object" ref="941939442"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">First Responder</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-3</int>
 						<reference key="object" ref="951368722"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">Application</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2232,7 +2204,7 @@ ZXJyYW4uA</string>
 							<reference ref="868031522"/>
 							<reference ref="551174276"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">MainMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2477,7 +2449,7 @@ ZXJyYW4uA</string>
 					<object class="IBObjectRecord">
 						<int key="objectID">196</int>
 						<reference key="object" ref="485884620"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">X11Controller</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2487,7 +2459,7 @@ ZXJyYW4uA</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="941366957"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">PrefsPanel</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2751,7 +2723,7 @@ ZXJyYW4uA</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="85544634"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">EditPrograms</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2774,7 +2746,7 @@ ZXJyYW4uA</string>
 							<reference ref="318286212"/>
 							<reference ref="511651072"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">DockMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -3328,6 +3300,7 @@ ZXJyYW4uA</string>
 				<bool key="EncodedWithXMLCoder">YES</bool>
 				<object class="NSArray" key="dict.sortedKeys">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<string>-3.IBPluginDependency</string>
 					<string>-3.ImportedFromIB2</string>
 					<string>100292.IBPluginDependency</string>
 					<string>100293.IBPluginDependency</string>
@@ -3701,6 +3674,7 @@ ZXJyYW4uA</string>
 				</object>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3773,7 +3747,7 @@ ZXJyYW4uA</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="3"/>
 					<integer value="1"/>
-					<string>{{349, 858}, {315, 153}}</string>
+					<string>{{363, 683}, {389, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>{{271, 666}, {301, 153}}</string>
@@ -4075,9 +4049,7 @@ ZXJyYW4uA</string>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -4085,9 +4057,7 @@ ZXJyYW4uA</string>
 			<nil key="activeLocalization"/>
 			<object class="NSMutableDictionary" key="localizations">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -4125,6 +4095,15 @@ ZXJyYW4uA</string>
 			</object>
 		</object>
 		<int key="IBDocument.localizationMode">0</int>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+			<integer value="1050" key="NS.object.0"/>
+		</object>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+			<integer value="3000" key="NS.object.0"/>
+		</object>
+		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
 		<string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
 		<int key="IBDocument.defaultPropertyAccessControl">1</int>
 	</data>
diff --git a/hw/xquartz/bundle/Resources/fi.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/fi.lproj/main.nib/keyedobjects.nib
index dfb04f1..433c99f 100644
Binary files a/hw/xquartz/bundle/Resources/fi.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/fi.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/no.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/no.lproj/main.nib/designable.nib
index fdd53fe..ffca828 100644
--- a/hw/xquartz/bundle/Resources/no.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/no.lproj/main.nib/designable.nib
@@ -1,11 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">9C31</string>
-		<string key="IBDocument.InterfaceBuilderVersion">677</string>
-		<string key="IBDocument.AppKitVersion">949.26</string>
-		<string key="IBDocument.HIToolboxVersion">352.00</string>
+		<string key="IBDocument.SystemVersion">10A354</string>
+		<string key="IBDocument.InterfaceBuilderVersion">728</string>
+		<string key="IBDocument.AppKitVersion">1019</string>
+		<string key="IBDocument.HIToolboxVersion">421.00</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+			<string key="NS.object.0">728</string>
+		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
 		</object>
@@ -15,7 +19,7 @@
 		</object>
 		<object class="NSMutableDictionary" key="IBDocument.Metadata">
 			<bool key="EncodedWithXMLCoder">YES</bool>
-			<object class="NSArray" key="dict.sortedKeys">
+			<object class="NSArray" key="dict.sortedKeys" id="0">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 			</object>
 			<object class="NSMutableArray" key="dict.values">
@@ -116,7 +120,7 @@
 								</object>
 								<object class="NSMenuItem" id="6876565">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">U2zDpSBmdWxsc2tqZXJtbW9kdXMgcMOlL2F2A</string>
+									<string key="NSTitle">Slå fullskjermmodus på/av</string>
 									<string key="NSKeyEquiv">a</string>
 									<int key="NSKeyEquivModMask">1572864</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -302,8 +306,8 @@
 								<object class="NSMenuItem" id="1036389925">
 									<reference key="NSMenu" ref="96874957"/>
 									<string key="NSTitle">Bla gjennom vinduer</string>
-									<string key="NSKeyEquiv">`</string>
-									<int key="NSKeyEquivModMask">1048840</int>
+									<string key="NSKeyEquiv">&lt;</string>
+									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
@@ -311,8 +315,8 @@
 								<object class="NSMenuItem" id="369641893">
 									<reference key="NSMenu" ref="96874957"/>
 									<string key="NSTitle">Bla baklengs gjennom vinduer</string>
-									<string key="NSKeyEquiv">~</string>
-									<int key="NSKeyEquivModMask">1179914</int>
+									<string key="NSKeyEquiv">&gt;</string>
+									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
@@ -330,7 +334,7 @@
 								</object>
 								<object class="NSMenuItem" id="276216762">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">TGVnZyBhbGxlIMO4dmVyc3Q</string>
+									<string key="NSTitle">Legg alle øverst</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -428,7 +432,7 @@
 													<string key="NSContents">Emuler mus med tre knapper</string>
 													<object class="NSFont" key="NSSupport" id="463863101">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">1044</int>
 													</object>
 													<reference key="NSControlView" ref="119157981"/>
@@ -456,11 +460,10 @@
 												<object class="NSTextFieldCell" key="NSCell" id="391919450">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">TsOlciBha3RpdmVydCwga2FuIHRhc3RhdHVya29tbWFuZG9lciBmb3IgbWVueWxpbmplbiBrb21tZSBp
-IGtvbmZsaWt0IG1lZCBYMTEtcHJvZ3JhbW1lciBzb20gYnJ1a2VyIG1ldGF0YXN0ZW4uA</string>
+													<string key="NSContents">NÃ¥r aktivert, kan tastaturkommandoer for menylinjen komme i konflikt med X11-programmer som bruker metatasten.</string>
 													<object class="NSFont" key="NSSupport" id="26">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.100000e+01</double>
+														<double key="NSSize">11</double>
 														<int key="NSfFlags">3100</int>
 													</object>
 													<string key="NSPlaceholderString"/>
@@ -471,7 +474,7 @@ IGtvbmZsaWt0IG1lZCBYMTEtcHJvZ3JhbW1lciBzb20gYnJ1a2VyIG1ldGF0YXN0ZW4uA</string>
 														<string key="NSColorName">controlColor</string>
 														<object class="NSColor" key="NSColor" id="120476036">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2ODY1AA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -534,8 +537,7 @@ IMOlIGFrdGl2ZXJlIGRlbiBtaWR0cmUgZWxsZXIgaMO4eXJlIG11c2VrbmFwcGVuLgo</string>
 												<object class="NSTextFieldCell" key="NSCell" id="666057093">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">R2lyIGRlZyBtdWxpZ2hldCB0aWwgw6UgbGVnZ2UgaW5uIG1lbnllbmRyaW5nZXIgc29tIG92ZXJza3Jp
-dmVyIGRlbiBuw6V2w6ZyZW5kZSBYMTEtdGFzdGF0dXJsYXlvdXRlbi4</string>
+													<string key="NSContents">Gir deg mulighet til å legge inn menyendringer som overskriver den nåværende X11-tastaturlayouten.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="31160162"/>
@@ -552,7 +554,7 @@ dmVyIGRlbiBuw6V2w6ZyZW5kZSBYMTEtdGFzdGF0dXJsYXlvdXRlbi4</string>
 												<object class="NSButtonCell" key="NSCell" id="967619578">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">RsO4bGcgc3lzdGVtZXRzIHRhc3RhdHVybGF5b3V0A</string>
+													<string key="NSContents">Følg systemets tastaturlayout</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="179949713"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -636,7 +638,7 @@ dmVyIGRlbiBuw6V2w6ZyZW5kZSBYMTEtdGFzdGF0dXJsYXlvdXRlbi4</string>
 													<int key="NSButtonFlags2">1</int>
 													<object class="NSFont" key="NSAlternateImage">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">16</int>
 													</object>
 													<string key="NSAlternateContents"/>
@@ -703,6 +705,7 @@ dmVyIGRlbiBuw6V2w6ZyZW5kZSBYMTEtdGFzdGF0dXJsYXlvdXRlbi4</string>
 																<reference key="NSTarget" ref="633115429"/>
 															</object>
 														</object>
+														<reference key="NSMenuFont" ref="463863101"/>
 													</object>
 													<int key="NSPreferredEdge">3</int>
 													<bool key="NSUsesItemFromMenu">YES</bool>
@@ -797,8 +800,7 @@ dmVyIGRlbiBuw6V2w6ZyZW5kZSBYMTEtdGFzdGF0dXJsYXlvdXRlbi4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="761107402">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWt0aXZlcmVyIFgxMS1yb3R2aW5kdWV0LiBTbMOlIGZ1bGxza2plcm1tb2R1cyBww6Ugb2cgYXYgdmVk
-IMOlIHRyeWtrZSBww6UgS29tbWFuZG8tVGlsdmFsZy1BIHNhbXRpZGlnLg</string>
+													<string key="NSContents">Aktiverer X11-rotvinduet. Slå fullskjermmodus på og av ved å trykke på Kommando-Tilvalg-A samtidig.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="298603383"/>
@@ -853,9 +855,7 @@ IMOlIHRyeWtrZSBww6UgS29tbWFuZG8tVGlsdmFsZy1BIHNhbXRpZGlnLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="572508492">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWt0aXZlcmVyIMKra29waWVywrstbWVueW9iamVrdGV0IG9nIGdqw7hyIGRldCBtdWxpZyDDpSBzeW5r
-cm9uaXNlcmUgbWVsbG9tIGJ1ZnJlbmUgaSBPU1ggUGFzdGVib2FyZCwgWDExIENMSVBCT0FSRCBvZyBQ
-UklNQVJZLg</string>
+													<string key="NSContents">Aktiverer «kopier»-menyobjektet og gjør det mulig å synkronisere mellom bufrene i OSX Pasteboard, X11 CLIPBOARD og PRIMARY.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="386152084"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -871,7 +871,7 @@ UklNQVJZLg</string>
 												<object class="NSButtonCell" key="NSCell" id="501304422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">T3BwZGF0ZXIgQ0xJUEJPQVJEIG7DpXIgVXRrbGlwcCBlbmRyZXMuA</string>
+													<string key="NSContents">Oppdater CLIPBOARD når Utklipp endres.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477050998"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -893,7 +893,7 @@ UklNQVJZLg</string>
 												<object class="NSButtonCell" key="NSCell" id="510771323">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">T3BwZGF0ZXIgUFJJTUFSWSAobWlkdGtsaWtrKSBOw6VyIFV0a2xpcHAgZW5kcmVzLg</string>
+													<string key="NSContents">Oppdater PRIMARY (midtklikk) NÃ¥r Utklipp endres.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="765780304"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -915,7 +915,7 @@ UklNQVJZLg</string>
 												<object class="NSButtonCell" key="NSCell" id="897099877">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">T3BkYXRlciBVdGtsaXBwIG7DpXIgbnkgdGVrc3QgbWFya2VyZXMuA</string>
+													<string key="NSContents">Opdater Utklipp når ny tekst markeres.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="1002778833"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -937,7 +937,7 @@ UklNQVJZLg</string>
 												<object class="NSButtonCell" key="NSCell" id="619977658">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">T3BwZGF0ZXIgVXRrbGlwcCBuw6VyIENMSVBCT0FSRCBlbmRyZXMuA</string>
+													<string key="NSContents">Oppdater Utklipp når CLIPBOARD endres.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="487809555"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -959,8 +959,7 @@ UklNQVJZLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="461823902">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">RGVha3RpdmVyIGRldHRlIHZhbGdldCBodmlzIGR1IHZpbCBicnVrZSB4Y2xpcGJvYXJkLCBrbGlwcGVy
-IGVsbGVyIGFuZHJlIFgxMS11dGtsaXBwc2jDpW5kdGVyZXJlLg</string>
+													<string key="NSContents">Deaktiver dette valget hvis du vil bruke xclipboard, klipper eller andre X11-utklippshåndterere.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="620944856"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -976,8 +975,7 @@ IGVsbGVyIGFuZHJlIFgxMS11dGtsaXBwc2jDpW5kdGVyZXJlLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="994587858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">UMOlIGdydW5uIGF2IGJlZ3JlbnNuaW5nZXIgaSBYMTEtcHJvdG9rb2xsZW4sIGVyIGRldCBtdWxpZyBh
-dCBkZXR0ZSB2YWxnZXQgaWtrZSBmdW5nZXJlciBpIGFsbGUgcHJvZ3JhbW1lci4</string>
+													<string key="NSContents">PÃ¥ grunn av begrensninger i X11-protokollen, er det mulig at dette valget ikke fungerer i alle programmer.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="522511724"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1031,9 +1029,7 @@ dCBkZXR0ZSB2YWxnZXQgaWtrZSBmdW5nZXJlciBpIGFsbGUgcHJvZ3JhbW1lci4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="399127858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">TsOlciBkZW5uZSBmdW5rc2pvbmVuIGVyIGFrdGl2ZXJ0LCByZWdpc3RyZXJlcyBtdXNla2xpa2sgaSBp
-bmFrdGl2ZSB2aW5kdWVyIG7DpXIgZHUga2xpa2tlciBpIGRlbSwgaSB0aWxsZWdnIHRpbCBhdCB2aW5k
-dWVuZSBha3RpdmVyZXMuA</string>
+													<string key="NSContents">Når denne funksjonen er aktivert, registreres museklikk i inaktive vinduer når du klikker i dem, i tillegg til at vinduene aktiveres.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="290578835"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1049,7 +1045,7 @@ dWVuZSBha3RpdmVyZXMuA</string>
 												<object class="NSButtonCell" key="NSCell" id="959555182">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">Rm9rdXMgZsO4bGdlciBtdXNlbg</string>
+													<string key="NSContents">Fokus følger musen</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="992839333"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1071,8 +1067,7 @@ dWVuZSBha3RpdmVyZXMuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="183409141">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">WDExLXZpbmR1Zm9rdXMgZsO4bGdlciBtYXJrw7hyZW4uIEthbiB2w6ZyZSB1cHJha3Rpc2sgaSBicnVr
-Lg</string>
+													<string key="NSContents">X11-vindufokus følger markøren. Kan være upraktisk i bruk.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="138261120"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1088,7 +1083,7 @@ Lg</string>
 												<object class="NSButtonCell" key="NSCell" id="556463187">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">Rm9rdXNlciBww6UgbnllIHZpbmR1ZXI</string>
+													<string key="NSContents">Fokuser på nye vinduer</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="128352289"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1110,9 +1105,7 @@ Lg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="989804990">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">TsOlciBkZW5uZSBmdW5rc2pvbmVuIGVyIGFrdGl2ZXJ0LCBsZWdnZXMgWDExLmFwcCDDuHZlcnN0IChp
-IHN0ZWRldCBmb3IgRmluZGVyLmFwcCwgVGVybWluYWwuYXBwIG9zdi4pIG7DpXIgZHUgb3BwcmV0dGVy
-IGV0IG55dHQgWDExLXZpbmR1Lg</string>
+													<string key="NSContents">Når denne funksjonen er aktivert, legges X11.app øverst (i stedet for Finder.app, Terminal.app osv.) når du oppretter et nytt X11-vindu.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="57161931"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1185,10 +1178,7 @@ IGV0IG55dHQgWDExLXZpbmR1Lg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="53243865">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">TsOlciBkdSBzdGFydGVyIFgxMSwgb3BwcmV0dGVzIGRldCBYYXV0aG9yaXR5LXRpbGdhbmdza29udHJv
-bGx0YXN0ZXIuIEh2aXMgbWFza2luZW5zIElQLWFkcmVzc2UgZW5kcmVzLCBrYW4gaWtrZSBkaXNzZSB0
-YXN0ZW5lIGJydWtlcywgbm9lIHNvbSBrYW4gaGluZHJlIFgxMS1wcm9ncmFtbWVyIGZyYSDDpSBzdGFy
-dGUuA</string>
+													<string key="NSContents">Når du starter X11, opprettes det Xauthority-tilgangskontrolltaster. Hvis maskinens IP-adresse endres, kan ikke disse tastene brukes, noe som kan hindre X11-programmer fra å starte.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="168436707"/>
@@ -1205,9 +1195,7 @@ dGUuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="390084685">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">SHZpcyBkZXR0ZSBlciBha3RpdmVydCwgbcOlIGR1IGZvciDDpSBzaWtyZSBzeXN0ZW1ldCwgb2dzw6Ug
-YWt0aXZlcmUgR29ka2plbm4gdGlsa29ibGluZ2VyLiBOw6VyIGRldHRlIGlra2UgZXIgYWt0aXZlcnQs
-IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</string>
+													<string key="NSContents">Hvis dette er aktivert, må du for å sikre systemet, også aktivere Godkjenn tilkoblinger. Når dette ikke er aktivert, er tilkoblinger fra eksterne programmer ikke tillatt.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="363817195"/>
@@ -1353,17 +1341,17 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 											<object class="NSMutableArray" key="NSTableColumns">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<object class="NSTableColumn" id="938444323">
-													<double key="NSWidth">1.217310e+02</double>
-													<double key="NSMinWidth">6.273100e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">121.73100280761719</double>
+													<double key="NSMinWidth">62.730998992919922</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Navn</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor" id="113872566">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+															<bytes key="NSWhite">MC4zMzMzMzI5ODU2AA</bytes>
 														</object>
 														<object class="NSColor" key="NSTextColor" id="249576247">
 															<int key="NSColorSpace">6</int>
@@ -1391,12 +1379,12 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 												<object class="NSTableColumn" id="84282687">
-													<double key="NSWidth">9.900000e+01</double>
-													<double key="NSMinWidth">4.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">99</double>
+													<double key="NSMinWidth">40</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Kommando</string>
 														<reference key="NSSupport" ref="26"/>
 														<reference key="NSBackgroundColor" ref="113872566"/>
@@ -1418,12 +1406,12 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 												<object class="NSTableColumn" id="242608782">
-													<double key="NSWidth">7.100000e+01</double>
-													<double key="NSMinWidth">1.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">71</double>
+													<double key="NSMinWidth">10</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">67239424</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Snarvei</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor">
@@ -1440,7 +1428,7 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 														<string key="NSContents">Tekstrute</string>
 														<object class="NSFont" key="NSSupport">
 															<string key="NSName">LucidaGrande</string>
-															<double key="NSSize">1.200000e+01</double>
+															<double key="NSSize">12</double>
 															<int key="NSfFlags">16</int>
 														</object>
 														<string key="NSPlaceholderString"/>
@@ -1460,8 +1448,8 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 											</object>
-											<double key="NSIntercellSpacingWidth">3.000000e+00</double>
-											<double key="NSIntercellSpacingHeight">2.000000e+00</double>
+											<double key="NSIntercellSpacingWidth">3</double>
+											<double key="NSIntercellSpacingHeight">2</double>
 											<reference key="NSBackgroundColor" ref="822946413"/>
 											<object class="NSColor" key="NSGridColor">
 												<int key="NSColorSpace">6</int>
@@ -1472,16 +1460,20 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 													<bytes key="NSWhite">MC41AA</bytes>
 												</object>
 											</object>
-											<double key="NSRowHeight">1.700000e+01</double>
+											<double key="NSRowHeight">17</double>
 											<int key="NSTvFlags">1379958784</int>
+											<reference key="NSDelegate"/>
+											<reference key="NSDataSource"/>
 											<int key="NSColumnAutoresizingStyle">1</int>
 											<int key="NSDraggingSourceMaskForLocal">-1</int>
 											<int key="NSDraggingSourceMaskForNonLocal">0</int>
 											<bool key="NSAllowsTypeSelect">YES</bool>
+											<int key="NSTableViewDraggingDestinationStyle">0</int>
 										</object>
 									</object>
 									<string key="NSFrame">{{1, 17}, {301, 198}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
+									<reference key="NSNextKeyView" ref="905092943"/>
 									<reference key="NSDocView" ref="905092943"/>
 									<reference key="NSBGColor" ref="812484075"/>
 									<int key="NScvFlags">4</int>
@@ -1493,7 +1485,7 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 									<reference key="NSSuperview" ref="1063387772"/>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">9.949238e-01</double>
+									<double key="NSPercent">0.99492377042770386</double>
 								</object>
 								<object class="NSScroller" id="17278747">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1503,7 +1495,7 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 									<int key="NSsFlags">1</int>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">6.885246e-01</double>
+									<double key="NSPercent">0.68852460384368896</double>
 								</object>
 								<object class="NSClipView" id="672307654">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1514,6 +1506,7 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 									</object>
 									<string key="NSFrame">{{1, 0}, {301, 17}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
+									<reference key="NSNextKeyView" ref="792419186"/>
 									<reference key="NSDocView" ref="792419186"/>
 									<reference key="NSBGColor" ref="812484075"/>
 									<int key="NScvFlags">4</int>
@@ -1522,6 +1515,7 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 							</object>
 							<string key="NSFrame">{{20, 20}, {318, 231}}</string>
 							<reference key="NSSuperview" ref="85544634"/>
+							<reference key="NSNextKeyView" ref="580565898"/>
 							<int key="NSsFlags">50</int>
 							<reference key="NSVScroller" ref="842897584"/>
 							<reference key="NSHScroller" ref="17278747"/>
@@ -1602,7 +1596,7 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 								</object>
 								<object class="NSMenuItem" id="1032342329">
 									<reference key="NSMenu" ref="48278059"/>
-									<string type="base64-UTF8" key="NSTitle">VGlscGFzc+KApg</string>
+									<string key="NSTitle">Tilpass…</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -2177,28 +2171,26 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="IBObjectRecord">
 						<int key="objectID">0</int>
-						<object class="NSArray" key="object" id="330408435">
-							<bool key="EncodedWithXMLCoder">YES</bool>
-						</object>
+						<reference key="object" ref="0"/>
 						<reference key="children" ref="904585544"/>
 						<nil key="parent"/>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-2</int>
 						<reference key="object" ref="815810918"/>
-						<reference key="parent" ref="330408435"/>
-						<string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">File's Owner</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-1</int>
 						<reference key="object" ref="941939442"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">First Responder</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-3</int>
 						<reference key="object" ref="951368722"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">Application</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2212,7 +2204,7 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 							<reference ref="868031522"/>
 							<reference ref="551174276"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">MainMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2457,7 +2449,7 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 					<object class="IBObjectRecord">
 						<int key="objectID">196</int>
 						<reference key="object" ref="485884620"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">X11Controller</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2467,7 +2459,7 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="941366957"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">PrefsPanel</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2731,7 +2723,7 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="85544634"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">EditPrograms</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2754,7 +2746,7 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 							<reference ref="318286212"/>
 							<reference ref="511651072"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">DockMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -3306,10 +3298,8 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 			</object>
 			<object class="NSMutableDictionary" key="flattenedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSMutableArray" key="dict.sortedKeys">
+				<object class="NSArray" key="dict.sortedKeys">
 					<bool key="EncodedWithXMLCoder">YES</bool>
-					<string>-1.IBPluginDependency</string>
-					<string>-2.IBPluginDependency</string>
 					<string>-3.IBPluginDependency</string>
 					<string>-3.ImportedFromIB2</string>
 					<string>100292.IBPluginDependency</string>
@@ -3370,7 +3360,6 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 					<string>169.editorWindowContentRectSynchronizationRect</string>
 					<string>19.IBPluginDependency</string>
 					<string>19.ImportedFromIB2</string>
-					<string>196.IBPluginDependency</string>
 					<string>196.ImportedFromIB2</string>
 					<string>200295.IBPluginDependency</string>
 					<string>200295.IBPropertyAccessControl</string>
@@ -3389,6 +3378,7 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 					<string>24.ImportedFromIB2</string>
 					<string>24.editorWindowContentRectSynchronizationRect</string>
 					<string>244.IBEditorWindowLastContentRect</string>
+					<string>244.IBPluginDependency</string>
 					<string>244.IBPropertyAccessControl</string>
 					<string>244.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>244.IBWindowTemplateEditedContentRect</string>
@@ -3410,6 +3400,7 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 					<string>272.IBPluginDependency</string>
 					<string>272.ImportedFromIB2</string>
 					<string>285.IBEditorWindowLastContentRect</string>
+					<string>285.IBPluginDependency</string>
 					<string>285.IBPropertyAccessControl</string>
 					<string>285.IBViewEditorWindowController.showingBoundsRectangles</string>
 					<string>285.IBViewEditorWindowController.showingLayoutRectangles</string>
@@ -3683,20 +3674,18 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="1" id="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3" id="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3711,355 +3700,354 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{168, 821}, {113, 23}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{202, 626}, {154, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
+					<string>{{375, 858}, {283, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
-					<string>{{349, 858}, {315, 153}}</string>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{271, 666}, {301, 153}}</string>
 					<string>{{437, 548}, {484, 308}}</string>
-					<reference ref="11"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="3"/>
 					<boolean value="NO"/>
 					<string>{{437, 548}, {484, 308}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{184, 290}, {481, 345}}</string>
-					<integer value="0" id="8"/>
-					<reference ref="9"/>
+					<integer value="0"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{58, 803}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{100, 746}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{68, 585}, {485, 271}}</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
-					<reference ref="9"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="3"/>
+					<integer value="1"/>
+					<integer value="1"/>
 					<string>{{68, 585}, {485, 271}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{433, 406}, {486, 327}}</string>
-					<reference ref="8"/>
-					<reference ref="9"/>
+					<integer value="0"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
-					<string>{{145, 1011}, {336, 20}}</string>
+					<integer value="3"/>
+					<integer value="1"/>
+					<string>{{145, 1011}, {354, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{67, 819}, {336, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{20, 641}, {218, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{79, 616}, {218, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 				</object>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -4067,9 +4055,7 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 			<nil key="activeLocalization"/>
 			<object class="NSMutableDictionary" key="localizations">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -4107,6 +4093,15 @@ IGVyIHRpbGtvYmxpbmdlciBmcmEgZWtzdGVybmUgcHJvZ3JhbW1lciBpa2tlIHRpbGxhdHQuA</strin
 			</object>
 		</object>
 		<int key="IBDocument.localizationMode">0</int>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+			<integer value="1050" key="NS.object.0"/>
+		</object>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+			<integer value="3000" key="NS.object.0"/>
+		</object>
+		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
 		<string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
 		<int key="IBDocument.defaultPropertyAccessControl">1</int>
 	</data>
diff --git a/hw/xquartz/bundle/Resources/no.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/no.lproj/main.nib/keyedobjects.nib
index 9c096b9..982fa01 100644
Binary files a/hw/xquartz/bundle/Resources/no.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/no.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/pl.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/pl.lproj/main.nib/designable.nib
index 9e99f1c..870b49f 100644
--- a/hw/xquartz/bundle/Resources/pl.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/pl.lproj/main.nib/designable.nib
@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.05">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">10A222</string>
-		<string key="IBDocument.InterfaceBuilderVersion">708</string>
-		<string key="IBDocument.AppKitVersion">994.5</string>
-		<string key="IBDocument.HIToolboxVersion">404.00</string>
+		<string key="IBDocument.SystemVersion">10A354</string>
+		<string key="IBDocument.InterfaceBuilderVersion">728</string>
+		<string key="IBDocument.AppKitVersion">1019</string>
+		<string key="IBDocument.HIToolboxVersion">421.00</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
-			<string key="NS.object.0">708</string>
+			<string key="NS.object.0">728</string>
 		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -19,7 +19,7 @@
 		</object>
 		<object class="NSMutableDictionary" key="IBDocument.Metadata">
 			<bool key="EncodedWithXMLCoder">YES</bool>
-			<object class="NSArray" key="dict.sortedKeys">
+			<object class="NSArray" key="dict.sortedKeys" id="0">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 			</object>
 			<object class="NSMutableArray" key="dict.values">
@@ -64,7 +64,7 @@
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="139290918">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">WDEx4oCmA</string>
+									<string key="NSTitle">X11…</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
@@ -72,7 +72,7 @@
 								</object>
 								<object class="NSMenuItem" id="386173216">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">UHJlZmVyZW5jamXigKY</string>
+									<string key="NSTitle">Preferencje…</string>
 									<string key="NSKeyEquiv">,</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -92,7 +92,7 @@
 								</object>
 								<object class="NSMenuItem" id="32285361">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">VXPFgnVnaQ</string>
+									<string key="NSTitle">Usługi</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -100,7 +100,7 @@
 									<reference key="NSMixedImage" ref="351811234"/>
 									<string key="NSAction">submenuAction:</string>
 									<object class="NSMenu" key="NSSubmenu" id="821388474">
-										<string type="base64-UTF8" key="NSTitle">VXPFgnVnaQ</string>
+										<string key="NSTitle">Usługi</string>
 										<object class="NSMutableArray" key="NSMenuItems">
 											<bool key="EncodedWithXMLCoder">YES</bool>
 										</object>
@@ -120,7 +120,7 @@
 								</object>
 								<object class="NSMenuItem" id="6876565">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">UHJ6ZcWCxIVjemFqIHBlxYJueSBla3Jhbg</string>
+									<string key="NSTitle">Przełączaj pełny ekran</string>
 									<string key="NSKeyEquiv">a</string>
 									<int key="NSKeyEquivModMask">1572864</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -150,7 +150,7 @@
 								</object>
 								<object class="NSMenuItem" id="206802571">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">VWtyeWogcG96b3N0YcWCZQ</string>
+									<string key="NSTitle">Ukryj pozostałe</string>
 									<string key="NSKeyEquiv">h</string>
 									<int key="NSKeyEquivModMask">1572864</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -159,7 +159,7 @@
 								</object>
 								<object class="NSMenuItem" id="1023546148">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">UG9rYcW8IHdzenlzdGtpZQ</string>
+									<string key="NSTitle">Pokaż wszystkie</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -180,7 +180,7 @@
 								</object>
 								<object class="NSMenuItem" id="274138642">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">WmFrb8WEY3ogWDExA</string>
+									<string key="NSTitle">Zakończ X11</string>
 									<string key="NSKeyEquiv">q</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -217,7 +217,7 @@
 								</object>
 								<object class="NSMenuItem" id="1065386165">
 									<reference key="NSMenu" ref="981161348"/>
-									<string type="base64-UTF8" key="NSTitle">RG9zdG9zdWrigKY</string>
+									<string key="NSTitle">Dostosuj…</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -305,18 +305,18 @@
 								</object>
 								<object class="NSMenuItem" id="1036389925">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">UHJ6ZcWCxIVjemFqIHBvbWnEmWR6eSBva25hbWk</string>
+									<string key="NSTitle">Przełączaj pomiędzy oknami</string>
 									<string key="NSKeyEquiv">`</string>
-									<int key="NSKeyEquivModMask">1048840</int>
+									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
 								</object>
 								<object class="NSMenuItem" id="369641893">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">UHJ6ZcWCxIVjemFqIHdzdGVjeiBwb21pxJlkenkgb2tuYW1pA</string>
-									<string key="NSKeyEquiv">~</string>
-									<int key="NSKeyEquivModMask">1179914</int>
+									<string key="NSTitle">Przełączaj wstecz pomiędzy oknami</string>
+									<string key="NSKeyEquiv">`</string>
+									<int key="NSKeyEquivModMask">1179648</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
@@ -334,7 +334,7 @@
 								</object>
 								<object class="NSMenuItem" id="276216762">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">VW1pZcWbxIcgd3N6eXN0a28gbmEgd2llcnpjaHU</string>
+									<string key="NSTitle">Umieść wszystko na wierzchu</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -397,7 +397,7 @@
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="941366957">
 					<nil key="NSNextResponder"/>
@@ -460,8 +460,7 @@
 												<object class="NSTextFieldCell" key="NSCell" id="391919450">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">R2R5IHfFgsSFY3pvbmUsIHLDs3dub3dhxbxuaWtpIGtsYXdpc3pvd2UgcGFza2EgbWVudSBtb2fEhSBr
-b2xpZG93YcSHIHogcHJvZ3JhbWFtaSBYMTEgdcW8eXdhasSFY3ltaSBtb2R5ZmlrYXRvcmEgTWV0YS4</string>
+													<string key="NSContents">Gdy włączone, równoważniki klawiszowe paska menu mogą kolidować z programami X11 używającymi modyfikatora Meta.</string>
 													<object class="NSFont" key="NSSupport" id="26">
 														<string key="NSName">LucidaGrande</string>
 														<double key="NSSize">11</double>
@@ -475,7 +474,7 @@ b2xpZG93YcSHIHogcHJvZ3JhbWFtaSBYMTEgdcW8eXdhasSFY3ltaSBtb2R5ZmlrYXRvcmEgTWV0YS4<
 														<string key="NSColorName">controlColor</string>
 														<object class="NSColor" key="NSColor" id="905683795">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2NwA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2ODY1AA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -516,7 +515,7 @@ dWplIMWbcm9ka293eSBsdWIgcHJhd3kgcHJ6eWNpc2sgbXlzenkuCg</string>
 												<object class="NSButtonCell" key="NSCell" id="940564599">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">V8WCxIVjeiByw7N3bm93YcW8bmlraSBrbGF3aXN6b3dlIHcgxZtyb2Rvd2lza3UgWDExA</string>
+													<string key="NSContents">Włącz równoważniki klawiszowe w środowisku X11</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="842100515"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -538,8 +537,7 @@ dWplIMWbcm9ka293eSBsdWIgcHJhd3kgcHJ6eWNpc2sgbXlzenkuCg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="666057093">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">VW1vxbxsaXdpYSB6YXN0xIVwaWVuaWUgYmllxbzEhWNlaiBtYXB5IGtsYXdpc3p5IFgxMSB6bWlhbmFt
-aSB3IG1lbnUgd2VqxZtjaWEuA</string>
+													<string key="NSContents">Umożliwia zastąpienie bieżącej mapy klawiszy X11 zmianami w menu wejścia.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="31160162"/>
@@ -556,7 +554,7 @@ aSB3IG1lbnUgd2VqxZtjaWEuA</string>
 												<object class="NSButtonCell" key="NSCell" id="967619578">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">U3Rvc3VqIHN5c3RlbW93eSB1a8WCYWQga2xhd2lhdHVyeQ</string>
+													<string key="NSContents">Stosuj systemowy układ klawiatury</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="179949713"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -573,7 +571,7 @@ aSB3IG1lbnUgd2VqxZtjaWEuA</string>
 										<string key="NSFrame">{{10, 33}, {538, 246}}</string>
 										<reference key="NSSuperview" ref="448510093"/>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">V2VqxZtjaWU</string>
+									<string key="NSLabel">Wejście</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -595,7 +593,7 @@ aSB3IG1lbnUgd2VqxZtjaWEuA</string>
 												<object class="NSButtonCell" key="NSCell" id="1016069354">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">S29yenlzdGFqIHogc3lzdGVtb3d5Y2ggZMW6d2nEmWvDs3cga29tdW5pa2F0w7N3A</string>
+													<string key="NSContents">Korzystaj z systemowych dźwięków komunikatów</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="418227126"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -617,9 +615,7 @@ aSB3IG1lbnUgd2VqxZtjaWEuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="624655599">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">WDExIGLEmWR6aWUga29yenlzdGHFgiB6ZSBzdGFuZGFyZG93eWNoIHN5c3RlbW93eWNoIGTFundpxJlr
-w7N3IGtvbXVuaWthdMOzdywgemRlZmluaW93YW55Y2ggbmEga2FyY2llIHByZWZlcmVuY2ppIEVmZWt0
-eSBkxbp3acSZa293ZS4</string>
+													<string key="NSContents">X11 będzie korzystał ze standardowych systemowych dźwięków komunikatów, zdefiniowanych na karcie preferencji Efekty dźwiękowe.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="1039016593"/>
@@ -674,7 +670,7 @@ eSBkxbp3acSZa293ZS4</string>
 															<reference ref="616492372"/>
 															<object class="NSMenuItem" id="759499526">
 																<reference key="NSMenu" ref="341113515"/>
-																<string type="base64-UTF8" key="NSTitle">MjU2IGtvbG9yw7N3A</string>
+																<string key="NSTitle">256 kolorów</string>
 																<string key="NSKeyEquiv"/>
 																<int key="NSKeyEquivModMask">1048576</int>
 																<int key="NSMnemonicLoc">2147483647</int>
@@ -686,7 +682,7 @@ eSBkxbp3acSZa293ZS4</string>
 															</object>
 															<object class="NSMenuItem" id="543935434">
 																<reference key="NSMenu" ref="341113515"/>
-																<string type="base64-UTF8" key="NSTitle">VHlzacSFY2U</string>
+																<string key="NSTitle">TysiÄ…ce</string>
 																<string key="NSKeyEquiv"/>
 																<int key="NSKeyEquivModMask">1048576</int>
 																<int key="NSMnemonicLoc">2147483647</int>
@@ -743,7 +739,7 @@ eSBkxbp3acSZa293ZS4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="311969422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">T3BjamEgYsSZZHppZSBha3R5d25hIHBvIHBvbm93bnltIHVydWNob21pZW5pdSBYMTEuA</string>
+													<string key="NSContents">Opcja będzie aktywna po ponownym uruchomieniu X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="86150604"/>
@@ -760,7 +756,7 @@ eSBkxbp3acSZa293ZS4</string>
 												<object class="NSButtonCell" key="NSCell" id="631531164">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">VHJ5YiBwZcWCbmVnbyBla3JhbnU</string>
+													<string key="NSContents">Tryb pełnego ekranu</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477203622"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -782,7 +778,7 @@ eSBkxbp3acSZa293ZS4</string>
 												<object class="NSButtonCell" key="NSCell" id="917248662">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">UG9rYXp1aiBhdXRvbS4gcGFzZWsgbWVudSB3IHRyeWJpZSBwZcWCbmVnbyBla3JhbnU</string>
+													<string key="NSContents">Pokazuj autom. pasek menu w trybie pełnego ekranu</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="57246850"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -804,8 +800,7 @@ eSBkxbp3acSZa293ZS4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="761107402">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">V8WCxIVjemEgb2tubyBnxYLDs3duZSBYMTEuIERvIHfFgsSFY3phbmlhIGkgd3nFgsSFY3phbmlhIHRy
-eWJ1IHBlxYJuZWdvIGVrcmFudSBzxYJ1xbzEhSBrbGF3aXN6ZSBDb21tYW5kLU9wY2phLUEuA</string>
+													<string key="NSContents">Włącza okno główne X11. Do włączania i wyłączania trybu pełnego ekranu służą klawisze Command-Opcja-A.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="298603383"/>
@@ -816,7 +811,7 @@ eWJ1IHBlxYJuZWdvIGVrcmFudSBzxYJ1xbzEhSBrbGF3aXN6ZSBDb21tYW5kLU9wY2phLUEuA</strin
 										</object>
 										<string key="NSFrame">{{10, 33}, {538, 246}}</string>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">V3lqxZtjaWU</string>
+									<string key="NSLabel">Wyjście</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -838,7 +833,7 @@ eWJ1IHBlxYJuZWdvIGVrcmFudSBzxYJ1xbzEhSBrbGF3aXN6ZSBDb21tYW5kLU9wY2phLUEuA</strin
 												<object class="NSButtonCell" key="NSCell" id="718083688">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">V8WCxIVjeiBzeW5jaHJvbml6YWNqxJk</string>
+													<string key="NSContents">WÅ‚Ä…cz synchronizacjÄ™</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="878106058"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -860,8 +855,7 @@ eWJ1IHBlxYJuZWdvIGVrcmFudSBzxYJ1xbzEhSBrbGF3aXN6ZSBDb21tYW5kLU9wY2phLUEuA</strin
 												<object class="NSTextFieldCell" key="NSCell" id="572508492">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWt0eXd1amUgbWVudSBrb3Bpb3dhbmlhIGkgdW1vxbxsaXdpYSBzeW5jaHJvbml6b3dhbmllIHNjaG93
-a2EgT1PCoFggeiBidWZvcmFtaSBYMTEgKENMSVBCT0FSRCBpIFBSSU1BUlkpLg</string>
+													<string key="NSContents">Aktywuje menu kopiowania i umożliwia synchronizowanie schowka OS X z buforami X11 (CLIPBOARD i PRIMARY).</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="386152084"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -899,8 +893,7 @@ a2EgT1PCoFggeiBidWZvcmFtaSBYMTEgKENMSVBCT0FSRCBpIFBSSU1BUlkpLg</string>
 												<object class="NSButtonCell" key="NSCell" id="510771323">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">VWFrdHVhbG5pYWogYnVmb3IgUFJJTUFSWSAoxZtyb2Rrb3d5IHByenljaXNrIG15c3p5KSB6bWlhbmFt
-aSBTY2hvd2thA</string>
+													<string key="NSContents">Uaktualniaj bufor PRIMARY (środkowy przycisk myszy) zmianami Schowka</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="765780304"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -966,8 +959,7 @@ aSBTY2hvd2thA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="461823902">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">V3nFgsSFY3plbmllIG9wY2ppIHBvendhbGEga29yenlzdGHEhyB6IG1lbmVkxbxlcsOzdyBzY2hvd2th
-IFgxMSB0YWtpY2ggamFrIG5wLiB4Y2xpcGJvYXJkIGx1Yiwga2xpcHBlci4</string>
+													<string key="NSContents">Wyłączenie opcji pozwala korzystać z menedżerów schowka X11 takich jak np. xclipboard lub, klipper.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="620944856"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -983,8 +975,7 @@ IFgxMSB0YWtpY2ggamFrIG5wLiB4Y2xpcGJvYXJkIGx1Yiwga2xpcHBlci4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="994587858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">WiBwb3dvZHUgb2dyYW5pY3plxYQgcHJvdG9rb8WCdSBYMTEgZnVua2NqYSBtb8W8ZSBjemFzYW1pIG5p
-ZSBkemlhxYJhxIcgdyBuaWVrdMOzcnljaCBwcm9ncmFtYWNoLg</string>
+													<string key="NSContents">Z powodu ograniczeń protokołu X11 funkcja może czasami nie działać w niektórych programach.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="522511724"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1016,7 +1007,7 @@ ZSBkemlhxYJhxIcgdyBuaWVrdMOzcnljaCBwcm9ncmFtYWNoLg</string>
 												<object class="NSButtonCell" key="NSCell" id="259618205">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">Rm9rdXMgdyBuaWVha3R5d255bSBva25pZSBqZWRueW0ga2xpa25pxJljaWVtA</string>
+													<string key="NSContents">Fokus w nieaktywnym oknie jednym kliknięciem</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="657659108"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1038,8 +1029,7 @@ ZSBkemlhxYJhxIcgdyBuaWVrdMOzcnljaCBwcm9ncmFtYWNoLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="399127858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">R2R5IHfFgsSFY3pvbmUsIGtsaWtuacSZY2llIG5pZWFrdHl3bmVnbyBva25hIHBvd29kdWplIGplZ28g
-dWFrdHl3bmllbmllIGkgcHJ6ZW5pZXNpZW5pZSBkbyBuaWVnbyBmb2t1c3UuA</string>
+													<string key="NSContents">Gdy włączone, kliknięcie nieaktywnego okna powoduje jego uaktywnienie i przeniesienie do niego fokusu.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="290578835"/>
@@ -1056,7 +1046,7 @@ dWFrdHl3bmllbmllIGkgcHJ6ZW5pZXNpZW5pZSBkbyBuaWVnbyBmb2t1c3UuA</string>
 												<object class="NSButtonCell" key="NSCell" id="959555182">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">Rm9rdXMgcG9kxIXFvGEgemEgbXlzesSFA</string>
+													<string key="NSContents">Fokus podąża za myszą</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="992839333"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1078,8 +1068,7 @@ dWFrdHl3bmllbmllIGkgcHJ6ZW5pZXNpZW5pZSBkbyBuaWVnbyBmb2t1c3UuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="183409141">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">Rm9rdXMgb2tpZW4gWDExIHBvZMSFxbxhIHphIGt1cnNvcmVtIChtYSB0byBwZXduZSBuaWVrb3J6eXN0
-bmUgc2t1dGtpKS4</string>
+													<string key="NSContents">Fokus okien X11 podąża za kursorem (ma to pewne niekorzystne skutki).</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="138261120"/>
@@ -1118,9 +1107,7 @@ bmUgc2t1dGtpKS4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="989804990">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">R2R5IHfFgsSFY3pvbmUsIG90d2FyY2llIG5vd2VnbyBva25hIFgxMSBwb3dvZHVqZSB1bWllc3pjemVu
-aWUgcHJvZ3JhbXUgWDExLmFwcCBuYSB3aWVyemNodSAoemFtaWFzdCBGaW5kZXIuYXBwLCBUZXJtaW5h
-bC5hcHAgaXRkLikuA</string>
+													<string key="NSContents">Gdy włączone, otwarcie nowego okna X11 powoduje umieszczenie programu X11.app na wierzchu (zamiast Finder.app, Terminal.app itd.).</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="57161931"/>
@@ -1150,7 +1137,7 @@ bC5hcHAgaXRkLikuA</string>
 												<object class="NSButtonCell" key="NSCell" id="189594322">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">VXdpZXJ6eXRlbG5pYWogcG/FgsSFY3plbmlhA</string>
+													<string key="NSContents">Uwierzytelniaj połączenia</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="989050925"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1172,7 +1159,7 @@ bC5hcHAgaXRkLikuA</string>
 												<object class="NSButtonCell" key="NSCell" id="489340979">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">UG96d8OzbCBuYSBwb8WCxIVjemVuaWEgb2Qga2xpZW50w7N3IHNpZWNpb3d5Y2g</string>
+													<string key="NSContents">Pozwól na połączenia od klientów sieciowych</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="700826966"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1194,10 +1181,7 @@ bC5hcHAgaXRkLikuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="53243865">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">VXJ1Y2hvbWllbmllIFgxMSB1dHdvcnp5IGtsdWN6ZSBrb250cm9saSBkb3N0xJlwdSBYYXV0aG9yaXR5
-LiBKZcWbbGkgYWRyZXMgSVAgc3lzdGVtdSB6bWllbmkgc2nEmSwga2x1Y3plIHRlIHN0cmFjxIUgd2HF
-vG5vxZvEhywgY28gbW/FvGUgdW5pZW1vxbxsaXdpxIcgdXJ1Y2hhbWlhbmllIHByb2dyYW3Ds3cgWDEx
-Lg</string>
+													<string key="NSContents">Uruchomienie X11 utworzy klucze kontroli dostępu Xauthority. Jeśli adres IP systemu zmieni się, klucze te stracą ważność, co może uniemożliwić uruchamianie programów X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="168436707"/>
@@ -1214,10 +1198,7 @@ Lg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="390084685">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">R2R5IHBvbGUgamVzdCB6YXpuYWN6b25lLCBkbGEgYmV6cGllY3plxYRzdHdhIHfFgsSFY3pvbmEgbXVz
-aSBiecSHIHRha8W8ZSBvcGNqYSBVd2llcnp5dGVsbmlhaiBwb8WCxIVjemVuaWEuIEdkeSBwb2xlIG5p
-ZSBqZXN0IHphem5hY3pvbmUsIHBvxYLEhWN6ZW5pYSB6ZSB6ZGFsbnljaCBwcm9ncmFtw7N3IG5pZSBz
-xIUgZG96d29sb25lLg</string>
+													<string key="NSContents">Gdy pole jest zaznaczone, dla bezpieczeństwa włączona musi być także opcja Uwierzytelniaj połączenia. Gdy pole nie jest zaznaczone, połączenia ze zdalnych programów nie są dozwolone.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="363817195"/>
@@ -1234,7 +1215,7 @@ xIUgZG96d29sb25lLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="283628678">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">VGUgb3BjamUgYsSZZMSFIGFrdHl3bmUgcG8gbmFzdMSZcG55bSB1cnVjaG9taWVuaXUgWDExLg</string>
+													<string key="NSContents">Te opcje będą aktywne po następnym uruchomieniu X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="223835729"/>
@@ -1265,7 +1246,7 @@ xIUgZG96d29sb25lLg</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSFrameAutosaveName">x11_prefs</string>
 			</object>
 			<object class="NSWindowTemplate" id="604417141">
@@ -1278,7 +1259,7 @@ xIUgZG96d29sb25lLg</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="85544634">
 					<nil key="NSNextResponder"/>
@@ -1317,7 +1298,7 @@ xIUgZG96d29sb25lLg</string>
 							<object class="NSButtonCell" key="NSCell" id="8201128">
 								<int key="NSCellFlags">67239424</int>
 								<int key="NSCellFlags2">137887744</int>
-								<string type="base64-UTF8" key="NSContents">VXN1xYQ</string>
+								<string key="NSContents">Usuń</string>
 								<reference key="NSSupport" ref="463863101"/>
 								<reference key="NSControlView" ref="492358940"/>
 								<int key="NSButtonFlags">-2038284033</int>
@@ -1363,17 +1344,17 @@ xIUgZG96d29sb25lLg</string>
 											<object class="NSMutableArray" key="NSTableColumns">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<object class="NSTableColumn" id="938444323">
-													<double key="NSWidth">122.73099999999999</double>
-													<double key="NSMinWidth">62.731000000000002</double>
+													<double key="NSWidth">122.73100280761719</double>
+													<double key="NSMinWidth">62.730998992919922</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Nazwa</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor" id="113872566">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+															<bytes key="NSWhite">MC4zMzMzMzI5ODU2AA</bytes>
 														</object>
 														<object class="NSColor" key="NSTextColor" id="249576247">
 															<int key="NSColorSpace">6</int>
@@ -1385,7 +1366,7 @@ xIUgZG96d29sb25lLg</string>
 													<object class="NSTextFieldCell" key="NSDataCell" id="825378892">
 														<int key="NSCellFlags">338820672</int>
 														<int key="NSCellFlags2">1024</int>
-														<string type="base64-UTF8" key="NSContents">S29tw7Nya2EgdGVrc3Rvd2E</string>
+														<string key="NSContents">Komórka tekstowa</string>
 														<reference key="NSSupport" ref="463863101"/>
 														<string key="NSPlaceholderString"/>
 														<reference key="NSControlView" ref="905092943"/>
@@ -1406,8 +1387,8 @@ xIUgZG96d29sb25lLg</string>
 													<double key="NSMinWidth">40</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Polecenie</string>
 														<reference key="NSSupport" ref="26"/>
 														<reference key="NSBackgroundColor" ref="113872566"/>
@@ -1416,7 +1397,7 @@ xIUgZG96d29sb25lLg</string>
 													<object class="NSTextFieldCell" key="NSDataCell" id="432610585">
 														<int key="NSCellFlags">338820672</int>
 														<int key="NSCellFlags2">1024</int>
-														<string type="base64-UTF8" key="NSContents">S29tw7Nya2EgdGVrc3Rvd2E</string>
+														<string key="NSContents">Komórka tekstowa</string>
 														<reference key="NSSupport" ref="463863101"/>
 														<string key="NSPlaceholderString"/>
 														<reference key="NSControlView" ref="905092943"/>
@@ -1434,9 +1415,9 @@ xIUgZG96d29sb25lLg</string>
 													<double key="NSMinWidth">10</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">67239424</int>
-														<int key="NSCellFlags2">0</int>
-														<string type="base64-UTF8" key="NSContents">U2tyw7N0A</string>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
+														<string key="NSContents">Skrót</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor">
 															<int key="NSColorSpace">6</int>
@@ -1449,7 +1430,7 @@ xIUgZG96d29sb25lLg</string>
 													<object class="NSTextFieldCell" key="NSDataCell" id="34714764">
 														<int key="NSCellFlags">338820672</int>
 														<int key="NSCellFlags2">1024</int>
-														<string type="base64-UTF8" key="NSContents">S29tw7Nya2EgdGVrc3Rvd2E</string>
+														<string key="NSContents">Komórka tekstowa</string>
 														<object class="NSFont" key="NSSupport">
 															<string key="NSName">LucidaGrande</string>
 															<double key="NSSize">12</double>
@@ -1493,6 +1474,7 @@ xIUgZG96d29sb25lLg</string>
 											<int key="NSDraggingSourceMaskForLocal">-1</int>
 											<int key="NSDraggingSourceMaskForNonLocal">0</int>
 											<bool key="NSAllowsTypeSelect">YES</bool>
+											<int key="NSTableViewDraggingDestinationStyle">0</int>
 										</object>
 									</object>
 									<string key="NSFrame">{{1, 17}, {301, 198}}</string>
@@ -1509,7 +1491,7 @@ xIUgZG96d29sb25lLg</string>
 									<reference key="NSSuperview" ref="1063387772"/>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">0.99492380000000002</double>
+									<double key="NSPercent">0.99492377042770386</double>
 								</object>
 								<object class="NSScroller" id="17278747">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1519,7 +1501,7 @@ xIUgZG96d29sb25lLg</string>
 									<int key="NSsFlags">1</int>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">0.68852460000000004</double>
+									<double key="NSPercent">0.68852460384368896</double>
 								</object>
 								<object class="NSClipView" id="672307654">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1576,7 +1558,7 @@ xIUgZG96d29sb25lLg</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSFrameAutosaveName">x11_apps</string>
 			</object>
 			<object class="NSMenu" id="294137138">
@@ -1620,7 +1602,7 @@ xIUgZG96d29sb25lLg</string>
 								</object>
 								<object class="NSMenuItem" id="1032342329">
 									<reference key="NSMenu" ref="48278059"/>
-									<string type="base64-UTF8" key="NSTitle">RG9zdG9zdWrigKY</string>
+									<string key="NSTitle">Dostosuj…</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -2195,28 +2177,26 @@ xIUgZG96d29sb25lLg</string>
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="IBObjectRecord">
 						<int key="objectID">0</int>
-						<object class="NSArray" key="object" id="330408435">
-							<bool key="EncodedWithXMLCoder">YES</bool>
-						</object>
+						<reference key="object" ref="0"/>
 						<reference key="children" ref="904585544"/>
 						<nil key="parent"/>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-2</int>
 						<reference key="object" ref="815810918"/>
-						<reference key="parent" ref="330408435"/>
-						<string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">File's Owner</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-1</int>
 						<reference key="object" ref="941939442"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">First Responder</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-3</int>
 						<reference key="object" ref="951368722"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">Application</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2230,7 +2210,7 @@ xIUgZG96d29sb25lLg</string>
 							<reference ref="868031522"/>
 							<reference ref="551174276"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">MainMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2475,7 +2455,7 @@ xIUgZG96d29sb25lLg</string>
 					<object class="IBObjectRecord">
 						<int key="objectID">196</int>
 						<reference key="object" ref="485884620"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">X11Controller</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2485,7 +2465,7 @@ xIUgZG96d29sb25lLg</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="941366957"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">PrefsPanel</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2749,7 +2729,7 @@ xIUgZG96d29sb25lLg</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="85544634"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">EditPrograms</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2772,7 +2752,7 @@ xIUgZG96d29sb25lLg</string>
 							<reference ref="318286212"/>
 							<reference ref="511651072"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">DockMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -3326,6 +3306,7 @@ xIUgZG96d29sb25lLg</string>
 				<bool key="EncodedWithXMLCoder">YES</bool>
 				<object class="NSArray" key="dict.sortedKeys">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<string>-3.IBPluginDependency</string>
 					<string>-3.ImportedFromIB2</string>
 					<string>100292.IBPluginDependency</string>
 					<string>100293.IBPluginDependency</string>
@@ -3349,7 +3330,6 @@ xIUgZG96d29sb25lLg</string>
 					<string>100385.IBPluginDependency</string>
 					<string>100386.IBPluginDependency</string>
 					<string>100541.IBPluginDependency</string>
-					<string>100541.IBPropertyAccessControl</string>
 					<string>100543.IBPluginDependency</string>
 					<string>129.IBPluginDependency</string>
 					<string>129.ImportedFromIB2</string>
@@ -3366,7 +3346,6 @@ xIUgZG96d29sb25lLg</string>
 					<string>144.IBPluginDependency</string>
 					<string>144.ImportedFromIB2</string>
 					<string>145.IBPluginDependency</string>
-					<string>145.IBPropertyAccessControl</string>
 					<string>145.ImportedFromIB2</string>
 					<string>149.IBPluginDependency</string>
 					<string>149.ImportedFromIB2</string>
@@ -3397,7 +3376,6 @@ xIUgZG96d29sb25lLg</string>
 					<string>24.editorWindowContentRectSynchronizationRect</string>
 					<string>244.IBEditorWindowLastContentRect</string>
 					<string>244.IBPluginDependency</string>
-					<string>244.IBPropertyAccessControl</string>
 					<string>244.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>244.IBWindowTemplateEditedContentRect</string>
 					<string>244.ImportedFromIB2</string>
@@ -3407,7 +3385,6 @@ xIUgZG96d29sb25lLg</string>
 					<string>244.windowTemplate.maxSize</string>
 					<string>244.windowTemplate.minSize</string>
 					<string>245.IBPluginDependency</string>
-					<string>245.IBPropertyAccessControl</string>
 					<string>245.ImportedFromIB2</string>
 					<string>269.IBPluginDependency</string>
 					<string>269.ImportedFromIB2</string>
@@ -3443,10 +3420,8 @@ xIUgZG96d29sb25lLg</string>
 					<string>296.IBPluginDependency</string>
 					<string>296.ImportedFromIB2</string>
 					<string>297.IBPluginDependency</string>
-					<string>297.IBPropertyAccessControl</string>
 					<string>297.ImportedFromIB2</string>
 					<string>298.IBPluginDependency</string>
-					<string>298.IBPropertyAccessControl</string>
 					<string>298.ImportedFromIB2</string>
 					<string>300295.IBPluginDependency</string>
 					<string>300295.IBShouldRemoveOnLegacySave</string>
@@ -3455,143 +3430,99 @@ xIUgZG96d29sb25lLg</string>
 					<string>300337.IBPluginDependency</string>
 					<string>300337.ImportedFromIB2</string>
 					<string>300338.IBPluginDependency</string>
-					<string>300338.IBPropertyAccessControl</string>
 					<string>300338.ImportedFromIB2</string>
 					<string>300358.IBPluginDependency</string>
-					<string>300358.IBPropertyAccessControl</string>
 					<string>300358.ImportedFromIB2</string>
 					<string>300359.IBPluginDependency</string>
-					<string>300359.IBPropertyAccessControl</string>
 					<string>300359.ImportedFromIB2</string>
 					<string>300360.IBPluginDependency</string>
 					<string>300361.IBPluginDependency</string>
 					<string>300362.IBPluginDependency</string>
-					<string>300362.IBPropertyAccessControl</string>
 					<string>300362.ImportedFromIB2</string>
 					<string>300363.IBPluginDependency</string>
 					<string>300364.IBPluginDependency</string>
-					<string>300364.IBPropertyAccessControl</string>
 					<string>300364.ImportedFromIB2</string>
 					<string>300365.IBPluginDependency</string>
 					<string>300368.IBPluginDependency</string>
-					<string>300368.IBPropertyAccessControl</string>
 					<string>300368.ImportedFromIB2</string>
 					<string>300369.IBPluginDependency</string>
 					<string>300370.IBPluginDependency</string>
-					<string>300370.IBPropertyAccessControl</string>
 					<string>300370.ImportedFromIB2</string>
 					<string>300371.IBPluginDependency</string>
 					<string>300421.IBPluginDependency</string>
-					<string>300421.IBPropertyAccessControl</string>
 					<string>300421.ImportedFromIB2</string>
 					<string>300422.IBPluginDependency</string>
-					<string>300422.IBPropertyAccessControl</string>
 					<string>300422.ImportedFromIB2</string>
 					<string>300423.IBPluginDependency</string>
-					<string>300423.IBPropertyAccessControl</string>
 					<string>300423.ImportedFromIB2</string>
 					<string>300424.IBPluginDependency</string>
-					<string>300424.IBPropertyAccessControl</string>
 					<string>300424.ImportedFromIB2</string>
 					<string>300440.IBPluginDependency</string>
-					<string>300440.IBPropertyAccessControl</string>
 					<string>300441.IBPluginDependency</string>
-					<string>300441.IBPropertyAccessControl</string>
 					<string>300447.IBPluginDependency</string>
-					<string>300447.IBPropertyAccessControl</string>
 					<string>300447.ImportedFromIB2</string>
 					<string>300450.IBPluginDependency</string>
-					<string>300450.IBPropertyAccessControl</string>
 					<string>300451.IBPluginDependency</string>
-					<string>300451.IBPropertyAccessControl</string>
 					<string>300451.ImportedFromIB2</string>
 					<string>300452.IBPluginDependency</string>
-					<string>300452.IBPropertyAccessControl</string>
 					<string>300453.IBPluginDependency</string>
-					<string>300453.IBPropertyAccessControl</string>
 					<string>300453.ImportedFromIB2</string>
 					<string>300454.IBPluginDependency</string>
-					<string>300454.IBPropertyAccessControl</string>
 					<string>300455.IBPluginDependency</string>
-					<string>300455.IBPropertyAccessControl</string>
 					<string>300455.ImportedFromIB2</string>
 					<string>300456.IBPluginDependency</string>
-					<string>300456.IBPropertyAccessControl</string>
 					<string>300457.IBPluginDependency</string>
-					<string>300457.IBPropertyAccessControl</string>
 					<string>300457.ImportedFromIB2</string>
 					<string>300458.IBPluginDependency</string>
-					<string>300458.IBPropertyAccessControl</string>
 					<string>300459.IBPluginDependency</string>
-					<string>300459.IBPropertyAccessControl</string>
 					<string>300459.ImportedFromIB2</string>
 					<string>300460.IBPluginDependency</string>
-					<string>300460.IBPropertyAccessControl</string>
 					<string>300472.IBPluginDependency</string>
-					<string>300472.IBPropertyAccessControl</string>
 					<string>300472.ImportedFromIB2</string>
 					<string>300473.IBPluginDependency</string>
-					<string>300473.IBPropertyAccessControl</string>
 					<string>305.IBPluginDependency</string>
 					<string>305.ImportedFromIB2</string>
 					<string>310.IBPluginDependency</string>
 					<string>310.ImportedFromIB2</string>
 					<string>348.IBPluginDependency</string>
-					<string>348.IBPropertyAccessControl</string>
 					<string>348.ImportedFromIB2</string>
 					<string>349.IBPluginDependency</string>
 					<string>349.ImportedFromIB2</string>
 					<string>350.IBPluginDependency</string>
-					<string>350.IBPropertyAccessControl</string>
 					<string>350.ImportedFromIB2</string>
 					<string>351.IBPluginDependency</string>
-					<string>351.IBPropertyAccessControl</string>
 					<string>351.ImportedFromIB2</string>
 					<string>352.IBPluginDependency</string>
 					<string>352.ImportedFromIB2</string>
 					<string>353.IBPluginDependency</string>
 					<string>353.ImportedFromIB2</string>
 					<string>354.IBPluginDependency</string>
-					<string>354.IBPropertyAccessControl</string>
 					<string>354.ImportedFromIB2</string>
 					<string>363.IBPluginDependency</string>
-					<string>363.IBPropertyAccessControl</string>
 					<string>363.ImportedFromIB2</string>
 					<string>364.IBPluginDependency</string>
-					<string>364.IBPropertyAccessControl</string>
 					<string>364.ImportedFromIB2</string>
 					<string>365.IBPluginDependency</string>
-					<string>365.IBPropertyAccessControl</string>
 					<string>365.ImportedFromIB2</string>
 					<string>368.IBPluginDependency</string>
-					<string>368.IBPropertyAccessControl</string>
 					<string>368.ImportedFromIB2</string>
 					<string>369.IBPluginDependency</string>
-					<string>369.IBPropertyAccessControl</string>
 					<string>369.ImportedFromIB2</string>
 					<string>370.IBPluginDependency</string>
-					<string>370.IBPropertyAccessControl</string>
 					<string>370.ImportedFromIB2</string>
 					<string>371.IBPluginDependency</string>
-					<string>371.IBPropertyAccessControl</string>
 					<string>371.ImportedFromIB2</string>
 					<string>372.IBPluginDependency</string>
-					<string>372.IBPropertyAccessControl</string>
 					<string>372.ImportedFromIB2</string>
 					<string>374.IBPluginDependency</string>
-					<string>374.IBPropertyAccessControl</string>
 					<string>374.ImportedFromIB2</string>
 					<string>375.IBPluginDependency</string>
-					<string>375.IBPropertyAccessControl</string>
 					<string>375.ImportedFromIB2</string>
 					<string>376.IBPluginDependency</string>
-					<string>376.IBPropertyAccessControl</string>
 					<string>376.ImportedFromIB2</string>
 					<string>377.IBPluginDependency</string>
-					<string>377.IBPropertyAccessControl</string>
 					<string>377.ImportedFromIB2</string>
 					<string>379.IBPluginDependency</string>
-					<string>379.IBPropertyAccessControl</string>
 					<string>379.ImportedFromIB2</string>
 					<string>380.IBEditorWindowLastContentRect</string>
 					<string>380.IBPluginDependency</string>
@@ -3599,17 +3530,14 @@ xIUgZG96d29sb25lLg</string>
 					<string>381.IBPluginDependency</string>
 					<string>381.ImportedFromIB2</string>
 					<string>382.IBPluginDependency</string>
-					<string>382.IBPropertyAccessControl</string>
 					<string>382.ImportedFromIB2</string>
 					<string>383.IBPluginDependency</string>
 					<string>383.ImportedFromIB2</string>
 					<string>384.IBPluginDependency</string>
 					<string>384.ImportedFromIB2</string>
 					<string>385.IBPluginDependency</string>
-					<string>385.IBPropertyAccessControl</string>
 					<string>385.ImportedFromIB2</string>
 					<string>386.IBPluginDependency</string>
-					<string>386.IBPropertyAccessControl</string>
 					<string>386.ImportedFromIB2</string>
 					<string>419.IBPluginDependency</string>
 					<string>419.ImportedFromIB2</string>
@@ -3642,10 +3570,8 @@ xIUgZG96d29sb25lLg</string>
 					<string>538.IBPluginDependency</string>
 					<string>538.ImportedFromIB2</string>
 					<string>541.IBPluginDependency</string>
-					<string>541.IBPropertyAccessControl</string>
 					<string>541.ImportedFromIB2</string>
 					<string>543.IBPluginDependency</string>
-					<string>543.IBPropertyAccessControl</string>
 					<string>543.ImportedFromIB2</string>
 					<string>544.IBPluginDependency</string>
 					<string>544.ImportedFromIB2</string>
@@ -3670,6 +3596,7 @@ xIUgZG96d29sb25lLg</string>
 				</object>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3693,7 +3620,6 @@ xIUgZG96d29sb25lLg</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
@@ -3710,7 +3636,6 @@ xIUgZG96d29sb25lLg</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
@@ -3735,13 +3660,12 @@ xIUgZG96d29sb25lLg</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
-					<string>{{349, 858}, {315, 153}}</string>
+					<string>{{347, 683}, {337, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>{{271, 666}, {301, 153}}</string>
 					<string>{{437, 548}, {584, 308}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<boolean value="NO"/>
 					<string>{{437, 548}, {584, 308}}</string>
 					<integer value="1"/>
@@ -3751,7 +3675,6 @@ xIUgZG96d29sb25lLg</string>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
@@ -3787,10 +3710,8 @@ xIUgZG96d29sb25lLg</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
@@ -3799,143 +3720,99 @@ xIUgZG96d29sb25lLg</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>{{523, 716}, {155, 83}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3943,17 +3820,14 @@ xIUgZG96d29sb25lLg</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
@@ -3986,10 +3860,8 @@ xIUgZG96d29sb25lLg</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
@@ -4015,9 +3887,7 @@ xIUgZG96d29sb25lLg</string>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -4025,9 +3895,7 @@ xIUgZG96d29sb25lLg</string>
 			<nil key="activeLocalization"/>
 			<object class="NSMutableDictionary" key="localizations">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -4065,7 +3933,16 @@ xIUgZG96d29sb25lLg</string>
 			</object>
 		</object>
 		<int key="IBDocument.localizationMode">0</int>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+			<integer value="1050" key="NS.object.0"/>
+		</object>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+			<integer value="3000" key="NS.object.0"/>
+		</object>
+		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
 		<string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
-		<int key="IBDocument.defaultPropertyAccessControl">1</int>
+		<int key="IBDocument.defaultPropertyAccessControl">3</int>
 	</data>
 </archive>
diff --git a/hw/xquartz/bundle/Resources/pl.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/pl.lproj/main.nib/keyedobjects.nib
index 363a2ac..0173351 100644
Binary files a/hw/xquartz/bundle/Resources/pl.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/pl.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/designable.nib
index 1bab3a8..05dbb32 100644
--- a/hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/designable.nib
@@ -1,11 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">9G55</string>
-		<string key="IBDocument.InterfaceBuilderVersion">677.1</string>
-		<string key="IBDocument.AppKitVersion">949.43</string>
-		<string key="IBDocument.HIToolboxVersion">353.00</string>
+		<string key="IBDocument.SystemVersion">10A354</string>
+		<string key="IBDocument.InterfaceBuilderVersion">728</string>
+		<string key="IBDocument.AppKitVersion">1019</string>
+		<string key="IBDocument.HIToolboxVersion">421.00</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+			<string key="NS.object.0">728</string>
+		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
 		</object>
@@ -15,7 +19,7 @@
 		</object>
 		<object class="NSMutableDictionary" key="IBDocument.Metadata">
 			<bool key="EncodedWithXMLCoder">YES</bool>
-			<object class="NSArray" key="dict.sortedKeys">
+			<object class="NSArray" key="dict.sortedKeys" id="0">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 			</object>
 			<object class="NSMutableArray" key="dict.values">
@@ -68,7 +72,7 @@
 								</object>
 								<object class="NSMenuItem" id="386173216">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">UHJlZmVyw6puY2lhcy4uLg</string>
+									<string key="NSTitle">Preferências...</string>
 									<string key="NSKeyEquiv">,</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -88,7 +92,7 @@
 								</object>
 								<object class="NSMenuItem" id="32285361">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">U2VydmnDp29zA</string>
+									<string key="NSTitle">Serviços</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -96,7 +100,7 @@
 									<reference key="NSMixedImage" ref="833942997"/>
 									<string key="NSAction">submenuAction:</string>
 									<object class="NSMenu" key="NSSubmenu" id="821388474">
-										<string type="base64-UTF8" key="NSTitle">U2VydmnDp29zA</string>
+										<string key="NSTitle">Serviços</string>
 										<object class="NSMutableArray" key="NSMenuItems">
 											<bool key="EncodedWithXMLCoder">YES</bool>
 										</object>
@@ -116,7 +120,7 @@
 								</object>
 								<object class="NSMenuItem" id="6876565">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">QWx0ZXJuYXIgZWNyw6MgY29tcGxldG8</string>
+									<string key="NSTitle">Alternar ecrã completo</string>
 									<string key="NSKeyEquiv">a</string>
 									<int key="NSKeyEquivModMask">1572864</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -146,7 +150,7 @@
 								</object>
 								<object class="NSMenuItem" id="206802571">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">T2N1bHRhciBvdXRyYXMgYXBsaWNhw6fDtWVzA</string>
+									<string key="NSTitle">Ocultar outras aplicações</string>
 									<string key="NSKeyEquiv">h</string>
 									<int key="NSKeyEquivModMask">1572864</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -189,7 +193,7 @@
 					</object>
 					<object class="NSMenuItem" id="868031522">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle">QXBsaWNhw6fDtWVzA</string>
+						<string key="NSTitle">Aplicações</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -197,7 +201,7 @@
 						<reference key="NSMixedImage" ref="833942997"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="981161348">
-							<string type="base64-UTF8" key="NSTitle">QXBsaWNhw6fDtWVzA</string>
+							<string key="NSTitle">Aplicações</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="390088328">
@@ -225,7 +229,7 @@
 					</object>
 					<object class="NSMenuItem" id="200491363">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle">RWRpw6fDo28</string>
+						<string key="NSTitle">Edição</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -233,7 +237,7 @@
 						<reference key="NSMixedImage" ref="833942997"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="526778998">
-							<string type="base64-UTF8" key="NSTitle">RWRpw6fDo28</string>
+							<string key="NSTitle">Edição</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="185296989">
@@ -302,8 +306,8 @@
 								<object class="NSMenuItem" id="1036389925">
 									<reference key="NSMenu" ref="96874957"/>
 									<string key="NSTitle">Percorrer janelas</string>
-									<string key="NSKeyEquiv">`</string>
-									<int key="NSKeyEquivModMask">1048840</int>
+									<string key="NSKeyEquiv">)</string>
+									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
 									<reference key="NSMixedImage" ref="833942997"/>
@@ -311,8 +315,8 @@
 								<object class="NSMenuItem" id="369641893">
 									<reference key="NSMenu" ref="96874957"/>
 									<string key="NSTitle">Percorrer janelas no sentido inverso</string>
-									<string key="NSKeyEquiv">~</string>
-									<int key="NSKeyEquivModMask">1179914</int>
+									<string key="NSKeyEquiv">(</string>
+									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
 									<reference key="NSMixedImage" ref="833942997"/>
@@ -388,7 +392,7 @@
 				<int key="NSWindowBacking">2</int>
 				<string key="NSWindowRect">{{319, 328}, {633, 308}}</string>
 				<int key="NSWTFlags">1350041600</int>
-				<string type="base64-UTF8" key="NSWindowTitle">UHJlZmVyw6puY2lhcyBkbyBYMTE</string>
+				<string key="NSWindowTitle">Preferências do X11</string>
 				<string key="NSWindowClass">NSPanel</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
@@ -425,10 +429,10 @@
 												<object class="NSButtonCell" key="NSCell" id="990762273">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">U2ltdWxhciByYXRvIGRlIHRyw6pzIGJvdMO1ZXM</string>
+													<string key="NSContents">Simular rato de três botões</string>
 													<object class="NSFont" key="NSSupport" id="463863101">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">1044</int>
 													</object>
 													<reference key="NSControlView" ref="119157981"/>
@@ -456,12 +460,10 @@
 												<object class="NSTextFieldCell" key="NSCell" id="391919450">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">U2UgZXN0aXZlcmVtIGFjdGl2YXMsIGFzIHRlY2xhcyBlcXVpdmFsZW50ZXMgZGEgYmFycmEgZGUgbWVu
-dXMgcG9kZW0gaW50ZXJmZXJpciBuYXMgYXBsaWNhw6fDtWVzIFgxMSBxdWUgdXRpbGl6YW0gbyBtb2Rp
-ZmljYWRvciBNZXRhLg</string>
+													<string key="NSContents">Se estiverem activas, as teclas equivalentes da barra de menus podem interferir nas aplicações X11 que utilizam o modificador Meta.</string>
 													<object class="NSFont" key="NSSupport" id="26">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.100000e+01</double>
+														<double key="NSSize">11</double>
 														<int key="NSfFlags">3100</int>
 													</object>
 													<string key="NSPlaceholderString"/>
@@ -472,7 +474,7 @@ ZmljYWRvciBNZXRhLg</string>
 														<string key="NSColorName">controlColor</string>
 														<object class="NSColor" key="NSColor" id="854255273">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2ODY1AA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -513,7 +515,7 @@ cmEgYWN0aXZhciBvcyBib3TDtWVzIGNlbnRyYWwgb3UgZGlyZWl0byBkbyByYXRvLgo</string>
 												<object class="NSButtonCell" key="NSCell" id="940564599">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">QWN0aXZhciBhcyBlcXVpdmFsw6puY2lhcyBkZSB0ZWNsYWRvIHBhcmEgWDExA</string>
+													<string key="NSContents">Activar as equivalências de teclado para X11</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="842100515"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -535,8 +537,7 @@ cmEgYWN0aXZhciBvcyBib3TDtWVzIGNlbnRyYWwgb3UgZGlyZWl0byBkbyByYXRvLgo</string>
 												<object class="NSTextFieldCell" key="NSCell" id="666057093">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">UGVybWl0ZSBxdWUgYWx0ZXJhw6fDtWVzIGRvIG1lbnUgZGUgZW50cmFkYSBzZSBzb2JyZXBvbmhhbSBh
-byBhY3R1YWwgbWFwYSBkZSB0ZWNsYXMgZG8gWDExLg</string>
+													<string key="NSContents">Permite que alterações do menu de entrada se sobreponham ao actual mapa de teclas do X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="31160162"/>
@@ -553,7 +554,7 @@ byBhY3R1YWwgbWFwYSBkZSB0ZWNsYXMgZG8gWDExLg</string>
 												<object class="NSButtonCell" key="NSCell" id="967619578">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">U2VndWlyIGEgZGlzcG9zacOnw6NvIGRvIHRlY2xhZG8gZG8gc2lzdGVtYQ</string>
+													<string key="NSContents">Seguir a disposição do teclado do sistema</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="179949713"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -614,9 +615,7 @@ byBhY3R1YWwgbWFwYSBkZSB0ZWNsYXMgZG8gWDExLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="624655599">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">T3Mgc2luYWlzIHNvbm9yb3MgZG8gWDExIHV0aWxpemFyw6NvIG8gYWxlcnRhIHBhZHLDo28gZG8gc2lz
-dGVtYSwgdGFsIGNvbW8gZXN0aXZlciBkZWZpbmlkbyBlbSBFZmVpdG9zIHNvbm9yb3MsIG5hcyBwcmVm
-ZXLDqm5jaWFzIGRvIHNpc3RlbWEuA</string>
+													<string key="NSContents">Os sinais sonoros do X11 utilizarão o alerta padrão do sistema, tal como estiver definido em Efeitos sonoros, nas preferências do sistema.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="1039016593"/>
@@ -639,7 +638,7 @@ ZXLDqm5jaWFzIGRvIHNpc3RlbWEuA</string>
 													<int key="NSButtonFlags2">1</int>
 													<object class="NSFont" key="NSAlternateImage">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">16</int>
 													</object>
 													<string key="NSAlternateContents"/>
@@ -695,7 +694,7 @@ ZXLDqm5jaWFzIGRvIHNpc3RlbWEuA</string>
 															</object>
 															<object class="NSMenuItem" id="836673018">
 																<reference key="NSMenu" ref="341113515"/>
-																<string type="base64-UTF8" key="NSTitle">TWlsaMO1ZXM</string>
+																<string key="NSTitle">Milhões</string>
 																<string key="NSKeyEquiv"/>
 																<int key="NSKeyEquivModMask">1048576</int>
 																<int key="NSMnemonicLoc">2147483647</int>
@@ -706,6 +705,7 @@ ZXLDqm5jaWFzIGRvIHNpc3RlbWEuA</string>
 																<reference key="NSTarget" ref="633115429"/>
 															</object>
 														</object>
+														<reference key="NSMenuFont" ref="463863101"/>
 													</object>
 													<int key="NSPreferredEdge">3</int>
 													<bool key="NSUsesItemFromMenu">YES</bool>
@@ -739,8 +739,7 @@ ZXLDqm5jaWFzIGRvIHNpc3RlbWEuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="311969422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">RXN0YSBvcMOnw6NvIGVudHJhcsOhIGVtIHZpZ29yIGRhIHByw7N4aW1hIHZleiBxdWUgbyBYMTEgZm9y
-IGV4ZWN1dGFkby4</string>
+													<string key="NSContents">Esta opção entrará em vigor da próxima vez que o X11 for executado.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="86150604"/>
@@ -757,7 +756,7 @@ IGV4ZWN1dGFkby4</string>
 												<object class="NSButtonCell" key="NSCell" id="631531164">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">TW9kbyBlY3LDoyBjb21wbGV0bw</string>
+													<string key="NSContents">Modo ecrã completo</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477203622"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -779,8 +778,7 @@ IGV4ZWN1dGFkby4</string>
 												<object class="NSButtonCell" key="NSCell" id="917248662">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">TW9zdHJhciBhdXRvbWF0aWNhbWVudGUgYSBiYXJyYSBkZSBtZW51cyBlbSBtb2RvIGRlIGVjcsOjIGNv
-bXBsZXRvA</string>
+													<string key="NSContents">Mostrar automaticamente a barra de menus em modo de ecrã completo</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="57246850"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -802,9 +800,7 @@ bXBsZXRvA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="761107402">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWN0aXZhIGEgamFuZWxhIHJhaXogZG8gWDExLiBVdGlsaXplIGEgY29tYmluYcOnw6NvIGRlIHRlY2xh
-cyBDb21hbmRvLU9ww6fDo28tQSBwYXJhIGVudHJhciBlIHNhaXIgZG8gbW9kbyBkZSBlY3LDoyBjb21w
-bGV0by4</string>
+													<string key="NSContents">Activa a janela raiz do X11. Utilize a combinação de teclas Comando-Opção-A para entrar e sair do modo de ecrã completo.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="298603383"/>
@@ -815,7 +811,7 @@ bGV0by4</string>
 										</object>
 										<string key="NSFrame">{{10, 33}, {587, 246}}</string>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">U2HDrWRhA</string>
+									<string key="NSLabel">Saída</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -837,7 +833,7 @@ bGV0by4</string>
 												<object class="NSButtonCell" key="NSCell" id="718083688">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">QWN0aXZhciBzaW5jcm9uaXphw6fDo28</string>
+													<string key="NSContents">Activar sincronização</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="878106058"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -859,9 +855,7 @@ bGV0by4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="572508492">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWN0aXZhIG8gaXRlbSBkZSBtZW51ICJjb3BpYXIiIGUgcGVybWl0ZSBhIHNpbmNyb25pemHDp8OjbyBl
-bnRyZSBhIMOhcmVhIGRlIGNvbGFnZW0gZG8gT1MgWCBlIG9zIGJ1ZmZlcnMgQ0xJUEJPQVJEIGUgUFJJ
-TUFSWSBkbyBYMTEuA</string>
+													<string key="NSContents">Activa o item de menu "copiar" e permite a sincronização entre a área de colagem do OS X e os buffers CLIPBOARD e PRIMARY do X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="386152084"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -877,7 +871,7 @@ TUFSWSBkbyBYMTEuA</string>
 												<object class="NSButtonCell" key="NSCell" id="501304422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">QWN0dWFsaXphciBDTElQQk9BUkQgcXVhbmRvIGEgw6FyZWEgZGUgY29sYWdlbSBtdWRhci4</string>
+													<string key="NSContents">Actualizar CLIPBOARD quando a área de colagem mudar.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477050998"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -899,8 +893,7 @@ TUFSWSBkbyBYMTEuA</string>
 												<object class="NSButtonCell" key="NSCell" id="510771323">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">QWN0dWFsaXphciBQUklNQVJZIChjbGlxdWUgY29tIG8gYm90w6NvIGNlbnRyYWwpIHF1YW5kbyBhIMOh
-cmVhIGRlIGNvbGFnZW0gbXVkYXIuA</string>
+													<string key="NSContents">Actualizar PRIMARY (clique com o botão central) quando a área de colagem mudar.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="765780304"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -922,8 +915,7 @@ cmVhIGRlIGNvbGFnZW0gbXVkYXIuA</string>
 												<object class="NSButtonCell" key="NSCell" id="897099877">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">QWN0dWFsaXphciBhIMOhcmVhIGRlIGNvbGFnZW0gaW1lZGlhdGFtZW50ZSBxdWFuZG8gZm9yIHNlbGVj
-Y2lvbmFkbyB0ZXh0byBub3ZvLg</string>
+													<string key="NSContents">Actualizar a área de colagem imediatamente quando for seleccionado texto novo.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="1002778833"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -945,7 +937,7 @@ Y2lvbmFkbyB0ZXh0byBub3ZvLg</string>
 												<object class="NSButtonCell" key="NSCell" id="619977658">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">QWN0dWFsaXphciBhIMOhcmVhIGRlIGNvbGFnZW0gcXVhbmRvIG8gQ0xJUEJPQVJEIG11ZGFyLg</string>
+													<string key="NSContents">Actualizar a área de colagem quando o CLIPBOARD mudar.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="487809555"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -967,8 +959,7 @@ Y2lvbmFkbyB0ZXh0byBub3ZvLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="461823902">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">RGVzYWN0aXZlIGVzdGEgb3DDp8OjbyBzZSBwcmV0ZW5kZXIgdXRpbGl6YXIgbyB4Y2xpcGJvYXJkLCBv
-IGtsaXBwZXIgb3UgcXVhbHF1ZXIgb3V0cm8gZ2VzdG9yIGRlIGNsaXBib2FyZCBYMTEuA</string>
+													<string key="NSContents">Desactive esta opção se pretender utilizar o xclipboard, o klipper ou qualquer outro gestor de clipboard X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="620944856"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -984,8 +975,7 @@ IGtsaXBwZXIgb3UgcXVhbHF1ZXIgb3V0cm8gZ2VzdG9yIGRlIGNsaXBib2FyZCBYMTEuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="994587858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">RGV2aWRvIGEgbGltaXRhw6fDtWVzIGRvIHByb3RvY29sbyBYMTEsIGVzdGEgb3DDp8OjbyBuZW0gc2Vt
-cHJlIGZ1bmNpb25hcsOhIGVtIGFsZ3VtYXMgYXBsaWNhw6fDtWVzLg</string>
+													<string key="NSContents">Devido a limitações do protocolo X11, esta opção nem sempre funcionará em algumas aplicações.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="522511724"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -995,7 +985,7 @@ cHJlIGZ1bmNpb25hcsOhIGVtIGFsZ3VtYXMgYXBsaWNhw6fDtWVzLg</string>
 										</object>
 										<string key="NSFrame">{{10, 33}, {587, 246}}</string>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">w4FyZWEgZGUgY29sYWdlbQ</string>
+									<string key="NSLabel">Área de colagem</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -1039,9 +1029,7 @@ cHJlIGZ1bmNpb25hcsOhIGVtIGFsZ3VtYXMgYXBsaWNhw6fDtWVzLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="399127858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">U2UgYXNzaW5hbGFyIGVzdGEgb3DDp8OjbywgYW8gY2xpY2FyIG51bWEgamFuZWxhIGluYWN0aXZhLCBv
-IGNsaXF1ZSBuw6NvIHPDsyBhIHRyYXogcGFyYSBhIGZyZW50ZSBjb21vIGFjdGl2YSBhIGphbmVsYSBj
-b21wbGV0YW1lbnRlLiA</string>
+													<string key="NSContents">Se assinalar esta opção, ao clicar numa janela inactiva, o clique não só a traz para a frente como activa a janela completamente. </string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="290578835"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1117,9 +1105,7 @@ b21wbGV0YW1lbnRlLiA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="989804990">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QSBjcmlhw6fDo28gZGUgdW1hIG5vdmEgamFuZWxhIFgxMSBmYXogY29tIHF1ZSBYMTEuYXBwIHZlbmhh
-IHBhcmEgcHJpbWVpcm8gcGxhbm8gKGVtIHZleiBkZSBGaW5kZXIuYXBwLCBUZXJtaW5hbC5hcHAsIGV0
-Yy4pLg</string>
+													<string key="NSContents">A criação de uma nova janela X11 faz com que X11.app venha para primeiro plano (em vez de Finder.app, Terminal.app, etc.).</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="57161931"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1148,7 +1134,7 @@ Yy4pLg</string>
 												<object class="NSButtonCell" key="NSCell" id="189594322">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">QXV0ZW50aWNhciBsaWdhw6fDtWVzA</string>
+													<string key="NSContents">Autenticar ligações</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="989050925"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1170,7 +1156,7 @@ Yy4pLg</string>
 												<object class="NSButtonCell" key="NSCell" id="489340979">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">UGVybWl0aXIgbGlnYcOnw7VlcyBkZSBjbGllbnRlcyBkYSByZWRlA</string>
+													<string key="NSContents">Permitir ligações de clientes da rede</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="700826966"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1192,10 +1178,7 @@ Yy4pLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="53243865">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">TGFuw6dhciBvIFgxMSBjcmlhIGNoYXZlcyBYYXV0aG9yaXR5IGRlIGNvbnRyb2xvIGRlIGFjZXNzby4g
-U2UgbyBlbmRlcmXDp28gSVAgZG8gc2lzdGVtYSBmb3IgYWx0ZXJhZG8sIGVzdGFzIGNoYXZlcyBwZXJk
-ZW0gYSB2YWxpZGFkZSwgcG9kZW5kbywgYXNzaW0sICBpbXBvc3NpYmlsaXRhciBhIGV4ZWN1w6fDo28g
-ZGFzIGFwbGljYcOnw7VlcyBYMTEuA</string>
+													<string key="NSContents">Lançar o X11 cria chaves Xauthority de controlo de acesso. Se o endereço IP do sistema for alterado, estas chaves perdem a validade, podendo, assim,  impossibilitar a execução das aplicações X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="168436707"/>
@@ -1212,10 +1195,7 @@ ZGFzIGFwbGljYcOnw7VlcyBYMTEuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="390084685">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">U2UgYWN0aXZhciBlc3RhIG9ww6fDo28sIHByZWNpc2EgaWd1YWxtZW50ZSBkZSBhY3RpdmFyIGEgb3DD
-p8OjbyDigJxBdXRlbnRpY2FyIGxpZ2HDp8O1ZXPigJ0gcGFyYSBnYXJhbnRpciBhIHNlZ3VyYW7Dp2Eg
-ZG8gc2lzdGVtYS4gU2UgbsOjbyBhY3RpdmFyIGVzdGEgb3DDp8OjbywgbsOjbyBzw6NvIHBlcm1pdGlk
-YXMgbGlnYcOnw7VlcyBhIHBhcnRpciBkZSBhcGxpY2HDp8O1ZXMgcmVtb3Rhcy4</string>
+													<string key="NSContents">Se activar esta opção, precisa igualmente de activar a opção “Autenticar ligações” para garantir a segurança do sistema. Se não activar esta opção, não são permitidas ligações a partir de aplicações remotas.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="363817195"/>
@@ -1232,8 +1212,7 @@ YXMgbGlnYcOnw7VlcyBhIHBhcnRpciBkZSBhcGxpY2HDp8O1ZXMgcmVtb3Rhcy4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="283628678">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">RXN0YXMgb3DDp8O1ZXMgZW50cmFyw6NvIGVtIHZpZ29yIGRhIHByw7N4aW1hIHZleiBxdWUgbyBYMTEg
-Zm9yIGV4ZWN1dGFkby4</string>
+													<string key="NSContents">Estas opções entrarão em vigor da próxima vez que o X11 for executado.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="223835729"/>
@@ -1244,7 +1223,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 										</object>
 										<string key="NSFrame">{{10, 33}, {587, 246}}</string>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">U2VndXJhbsOnYQ</string>
+									<string key="NSLabel">Segurança</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -1272,7 +1251,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				<int key="NSWindowBacking">2</int>
 				<string key="NSWindowRect">{{360, 400}, {477, 271}}</string>
 				<int key="NSWTFlags">1350041600</int>
-				<string type="base64-UTF8" key="NSWindowTitle">TWVudSBBcGxpY2HDp8OjbyBkbyBYMTE</string>
+				<string key="NSWindowTitle">Menu Aplicação do X11</string>
 				<string key="NSWindowClass">NSPanel</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
@@ -1362,17 +1341,17 @@ Zm9yIGV4ZWN1dGFkby4</string>
 											<object class="NSMutableArray" key="NSTableColumns">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<object class="NSTableColumn" id="938444323">
-													<double key="NSWidth">9.973100e+01</double>
-													<double key="NSMinWidth">6.273100e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">99.731002807617188</double>
+													<double key="NSMinWidth">62.730998992919922</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Nome</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor" id="113872566">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+															<bytes key="NSWhite">MC4zMzMzMzI5ODU2AA</bytes>
 														</object>
 														<object class="NSColor" key="NSTextColor" id="249576247">
 															<int key="NSColorSpace">6</int>
@@ -1384,7 +1363,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 													<object class="NSTextFieldCell" key="NSDataCell" id="825378892">
 														<int key="NSCellFlags">338820672</int>
 														<int key="NSCellFlags2">1024</int>
-														<string type="base64-UTF8" key="NSContents">Q8OpbHVsYSBkZSB0ZXh0bw</string>
+														<string key="NSContents">Célula de texto</string>
 														<reference key="NSSupport" ref="463863101"/>
 														<string key="NSPlaceholderString"/>
 														<reference key="NSControlView" ref="905092943"/>
@@ -1400,12 +1379,12 @@ Zm9yIGV4ZWN1dGFkby4</string>
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 												<object class="NSTableColumn" id="84282687">
-													<double key="NSWidth">1.010000e+02</double>
-													<double key="NSMinWidth">4.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">101</double>
+													<double key="NSMinWidth">40</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Comando</string>
 														<reference key="NSSupport" ref="26"/>
 														<reference key="NSBackgroundColor" ref="113872566"/>
@@ -1414,7 +1393,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 													<object class="NSTextFieldCell" key="NSDataCell" id="432610585">
 														<int key="NSCellFlags">338820672</int>
 														<int key="NSCellFlags2">1024</int>
-														<string type="base64-UTF8" key="NSContents">Q8OpbHVsYSBkZSB0ZXh0bw</string>
+														<string key="NSContents">Célula de texto</string>
 														<reference key="NSSupport" ref="463863101"/>
 														<string key="NSPlaceholderString"/>
 														<reference key="NSControlView" ref="905092943"/>
@@ -1427,12 +1406,12 @@ Zm9yIGV4ZWN1dGFkby4</string>
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 												<object class="NSTableColumn" id="242608782">
-													<double key="NSWidth">6.900000e+01</double>
-													<double key="NSMinWidth">1.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">69</double>
+													<double key="NSMinWidth">10</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">67239424</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Atalho</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor">
@@ -1446,10 +1425,10 @@ Zm9yIGV4ZWN1dGFkby4</string>
 													<object class="NSTextFieldCell" key="NSDataCell" id="34714764">
 														<int key="NSCellFlags">338820672</int>
 														<int key="NSCellFlags2">1024</int>
-														<string type="base64-UTF8" key="NSContents">Q8OpbHVsYSBkZSB0ZXh0bw</string>
+														<string key="NSContents">Célula de texto</string>
 														<object class="NSFont" key="NSSupport">
 															<string key="NSName">LucidaGrande</string>
-															<double key="NSSize">1.200000e+01</double>
+															<double key="NSSize">12</double>
 															<int key="NSfFlags">16</int>
 														</object>
 														<string key="NSPlaceholderString"/>
@@ -1469,8 +1448,8 @@ Zm9yIGV4ZWN1dGFkby4</string>
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 											</object>
-											<double key="NSIntercellSpacingWidth">3.000000e+00</double>
-											<double key="NSIntercellSpacingHeight">2.000000e+00</double>
+											<double key="NSIntercellSpacingWidth">3</double>
+											<double key="NSIntercellSpacingHeight">2</double>
 											<reference key="NSBackgroundColor" ref="822946413"/>
 											<object class="NSColor" key="NSGridColor">
 												<int key="NSColorSpace">6</int>
@@ -1481,16 +1460,20 @@ Zm9yIGV4ZWN1dGFkby4</string>
 													<bytes key="NSWhite">MC41AA</bytes>
 												</object>
 											</object>
-											<double key="NSRowHeight">1.700000e+01</double>
+											<double key="NSRowHeight">17</double>
 											<int key="NSTvFlags">1379958784</int>
+											<reference key="NSDelegate"/>
+											<reference key="NSDataSource"/>
 											<int key="NSColumnAutoresizingStyle">1</int>
 											<int key="NSDraggingSourceMaskForLocal">-1</int>
 											<int key="NSDraggingSourceMaskForNonLocal">0</int>
 											<bool key="NSAllowsTypeSelect">YES</bool>
+											<int key="NSTableViewDraggingDestinationStyle">0</int>
 										</object>
 									</object>
 									<string key="NSFrame">{{1, 17}, {279, 198}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
+									<reference key="NSNextKeyView" ref="905092943"/>
 									<reference key="NSDocView" ref="905092943"/>
 									<reference key="NSBGColor" ref="812484075"/>
 									<int key="NScvFlags">4</int>
@@ -1502,7 +1485,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 									<reference key="NSSuperview" ref="1063387772"/>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">9.949238e-01</double>
+									<double key="NSPercent">0.99492377042770386</double>
 								</object>
 								<object class="NSScroller" id="17278747">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1512,7 +1495,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 									<int key="NSsFlags">1</int>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">6.885246e-01</double>
+									<double key="NSPercent">0.68852460384368896</double>
 								</object>
 								<object class="NSClipView" id="672307654">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1523,6 +1506,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 									</object>
 									<string key="NSFrame">{{1, 0}, {279, 17}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
+									<reference key="NSNextKeyView" ref="792419186"/>
 									<reference key="NSDocView" ref="792419186"/>
 									<reference key="NSBGColor" ref="812484075"/>
 									<int key="NScvFlags">4</int>
@@ -1531,6 +1515,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 							</object>
 							<string key="NSFrame">{{20, 20}, {296, 231}}</string>
 							<reference key="NSSuperview" ref="85544634"/>
+							<reference key="NSNextKeyView" ref="580565898"/>
 							<int key="NSsFlags">50</int>
 							<reference key="NSVScroller" ref="842897584"/>
 							<reference key="NSHScroller" ref="17278747"/>
@@ -1587,7 +1572,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 					</object>
 					<object class="NSMenuItem" id="511651072">
 						<reference key="NSMenu" ref="294137138"/>
-						<string type="base64-UTF8" key="NSTitle">QXBsaWNhw6fDtWVzA</string>
+						<string key="NSTitle">Aplicações</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -1595,7 +1580,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 						<reference key="NSMixedImage" ref="833942997"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="48278059">
-							<string type="base64-UTF8" key="NSTitle">QXBsaWNhw6fDtWVzA</string>
+							<string key="NSTitle">Aplicações</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="563798000">
@@ -1611,7 +1596,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 								</object>
 								<object class="NSMenuItem" id="1032342329">
 									<reference key="NSMenu" ref="48278059"/>
-									<string type="base64-UTF8" key="NSTitle">UGVyc29uYWxpemFy4oCmA</string>
+									<string key="NSTitle">Personalizar…</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -2186,28 +2171,26 @@ Zm9yIGV4ZWN1dGFkby4</string>
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="IBObjectRecord">
 						<int key="objectID">0</int>
-						<object class="NSArray" key="object" id="330408435">
-							<bool key="EncodedWithXMLCoder">YES</bool>
-						</object>
+						<reference key="object" ref="0"/>
 						<reference key="children" ref="904585544"/>
 						<nil key="parent"/>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-2</int>
 						<reference key="object" ref="815810918"/>
-						<reference key="parent" ref="330408435"/>
-						<string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">File's Owner</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-1</int>
 						<reference key="object" ref="941939442"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">First Responder</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-3</int>
 						<reference key="object" ref="951368722"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">Application</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2221,7 +2204,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 							<reference ref="868031522"/>
 							<reference ref="551174276"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">MainMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2466,7 +2449,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 					<object class="IBObjectRecord">
 						<int key="objectID">196</int>
 						<reference key="object" ref="485884620"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">X11Controller</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2476,7 +2459,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="941366957"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">PrefsPanel</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2740,7 +2723,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="85544634"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">EditPrograms</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2763,7 +2746,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 							<reference ref="318286212"/>
 							<reference ref="511651072"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">DockMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -3315,10 +3298,8 @@ Zm9yIGV4ZWN1dGFkby4</string>
 			</object>
 			<object class="NSMutableDictionary" key="flattenedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSMutableArray" key="dict.sortedKeys">
+				<object class="NSArray" key="dict.sortedKeys">
 					<bool key="EncodedWithXMLCoder">YES</bool>
-					<string>-1.IBPluginDependency</string>
-					<string>-2.IBPluginDependency</string>
 					<string>-3.IBPluginDependency</string>
 					<string>-3.ImportedFromIB2</string>
 					<string>100292.IBPluginDependency</string>
@@ -3343,7 +3324,6 @@ Zm9yIGV4ZWN1dGFkby4</string>
 					<string>100385.IBPluginDependency</string>
 					<string>100386.IBPluginDependency</string>
 					<string>100541.IBPluginDependency</string>
-					<string>100541.IBPropertyAccessControl</string>
 					<string>100543.IBPluginDependency</string>
 					<string>129.IBPluginDependency</string>
 					<string>129.ImportedFromIB2</string>
@@ -3360,7 +3340,6 @@ Zm9yIGV4ZWN1dGFkby4</string>
 					<string>144.IBPluginDependency</string>
 					<string>144.ImportedFromIB2</string>
 					<string>145.IBPluginDependency</string>
-					<string>145.IBPropertyAccessControl</string>
 					<string>145.ImportedFromIB2</string>
 					<string>149.IBPluginDependency</string>
 					<string>149.ImportedFromIB2</string>
@@ -3376,7 +3355,6 @@ Zm9yIGV4ZWN1dGFkby4</string>
 					<string>169.editorWindowContentRectSynchronizationRect</string>
 					<string>19.IBPluginDependency</string>
 					<string>19.ImportedFromIB2</string>
-					<string>196.IBPluginDependency</string>
 					<string>196.ImportedFromIB2</string>
 					<string>200295.IBPluginDependency</string>
 					<string>200295.IBShouldRemoveOnLegacySave</string>
@@ -3391,7 +3369,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 					<string>24.ImportedFromIB2</string>
 					<string>24.editorWindowContentRectSynchronizationRect</string>
 					<string>244.IBEditorWindowLastContentRect</string>
-					<string>244.IBPropertyAccessControl</string>
+					<string>244.IBPluginDependency</string>
 					<string>244.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>244.IBWindowTemplateEditedContentRect</string>
 					<string>244.ImportedFromIB2</string>
@@ -3401,7 +3379,6 @@ Zm9yIGV4ZWN1dGFkby4</string>
 					<string>244.windowTemplate.maxSize</string>
 					<string>244.windowTemplate.minSize</string>
 					<string>245.IBPluginDependency</string>
-					<string>245.IBPropertyAccessControl</string>
 					<string>245.ImportedFromIB2</string>
 					<string>269.IBPluginDependency</string>
 					<string>269.ImportedFromIB2</string>
@@ -3412,6 +3389,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 					<string>272.IBPluginDependency</string>
 					<string>272.ImportedFromIB2</string>
 					<string>285.IBEditorWindowLastContentRect</string>
+					<string>285.IBPluginDependency</string>
 					<string>285.IBViewEditorWindowController.showingBoundsRectangles</string>
 					<string>285.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>285.IBWindowTemplateEditedContentRect</string>
@@ -3436,10 +3414,8 @@ Zm9yIGV4ZWN1dGFkby4</string>
 					<string>296.IBPluginDependency</string>
 					<string>296.ImportedFromIB2</string>
 					<string>297.IBPluginDependency</string>
-					<string>297.IBPropertyAccessControl</string>
 					<string>297.ImportedFromIB2</string>
 					<string>298.IBPluginDependency</string>
-					<string>298.IBPropertyAccessControl</string>
 					<string>298.ImportedFromIB2</string>
 					<string>300295.IBPluginDependency</string>
 					<string>300295.IBShouldRemoveOnLegacySave</string>
@@ -3448,160 +3424,113 @@ Zm9yIGV4ZWN1dGFkby4</string>
 					<string>300337.IBPluginDependency</string>
 					<string>300337.ImportedFromIB2</string>
 					<string>300338.IBPluginDependency</string>
-					<string>300338.IBPropertyAccessControl</string>
 					<string>300338.ImportedFromIB2</string>
 					<string>300358.IBPluginDependency</string>
-					<string>300358.IBPropertyAccessControl</string>
 					<string>300358.ImportedFromIB2</string>
 					<string>300359.IBPluginDependency</string>
-					<string>300359.IBPropertyAccessControl</string>
 					<string>300359.ImportedFromIB2</string>
 					<string>300360.IBPluginDependency</string>
 					<string>300361.IBPluginDependency</string>
 					<string>300362.IBPluginDependency</string>
-					<string>300362.IBPropertyAccessControl</string>
 					<string>300362.ImportedFromIB2</string>
 					<string>300363.IBPluginDependency</string>
 					<string>300364.IBPluginDependency</string>
-					<string>300364.IBPropertyAccessControl</string>
 					<string>300364.ImportedFromIB2</string>
 					<string>300365.IBPluginDependency</string>
 					<string>300368.IBPluginDependency</string>
-					<string>300368.IBPropertyAccessControl</string>
 					<string>300368.ImportedFromIB2</string>
 					<string>300369.IBPluginDependency</string>
 					<string>300370.IBPluginDependency</string>
-					<string>300370.IBPropertyAccessControl</string>
 					<string>300370.ImportedFromIB2</string>
 					<string>300371.IBPluginDependency</string>
 					<string>300421.IBPluginDependency</string>
-					<string>300421.IBPropertyAccessControl</string>
 					<string>300421.ImportedFromIB2</string>
 					<string>300422.IBPluginDependency</string>
-					<string>300422.IBPropertyAccessControl</string>
 					<string>300422.ImportedFromIB2</string>
 					<string>300423.IBPluginDependency</string>
-					<string>300423.IBPropertyAccessControl</string>
 					<string>300423.ImportedFromIB2</string>
 					<string>300424.IBPluginDependency</string>
-					<string>300424.IBPropertyAccessControl</string>
 					<string>300424.ImportedFromIB2</string>
 					<string>300440.IBPluginDependency</string>
-					<string>300440.IBPropertyAccessControl</string>
 					<string>300441.IBPluginDependency</string>
-					<string>300441.IBPropertyAccessControl</string>
 					<string>300447.IBPluginDependency</string>
-					<string>300447.IBPropertyAccessControl</string>
 					<string>300447.ImportedFromIB2</string>
 					<string>300450.IBPluginDependency</string>
-					<string>300450.IBPropertyAccessControl</string>
 					<string>300451.IBPluginDependency</string>
-					<string>300451.IBPropertyAccessControl</string>
 					<string>300451.ImportedFromIB2</string>
 					<string>300452.IBPluginDependency</string>
-					<string>300452.IBPropertyAccessControl</string>
 					<string>300453.IBPluginDependency</string>
-					<string>300453.IBPropertyAccessControl</string>
 					<string>300453.ImportedFromIB2</string>
 					<string>300454.IBPluginDependency</string>
-					<string>300454.IBPropertyAccessControl</string>
 					<string>300455.IBPluginDependency</string>
-					<string>300455.IBPropertyAccessControl</string>
 					<string>300455.ImportedFromIB2</string>
 					<string>300456.IBPluginDependency</string>
-					<string>300456.IBPropertyAccessControl</string>
 					<string>300457.IBPluginDependency</string>
-					<string>300457.IBPropertyAccessControl</string>
 					<string>300457.ImportedFromIB2</string>
 					<string>300458.IBPluginDependency</string>
-					<string>300458.IBPropertyAccessControl</string>
 					<string>300459.IBPluginDependency</string>
-					<string>300459.IBPropertyAccessControl</string>
 					<string>300459.ImportedFromIB2</string>
 					<string>300460.IBPluginDependency</string>
-					<string>300460.IBPropertyAccessControl</string>
 					<string>300472.IBPluginDependency</string>
-					<string>300472.IBPropertyAccessControl</string>
 					<string>300472.ImportedFromIB2</string>
 					<string>300473.IBPluginDependency</string>
-					<string>300473.IBPropertyAccessControl</string>
 					<string>305.IBPluginDependency</string>
 					<string>305.ImportedFromIB2</string>
 					<string>310.IBPluginDependency</string>
 					<string>310.ImportedFromIB2</string>
 					<string>348.IBPluginDependency</string>
-					<string>348.IBPropertyAccessControl</string>
 					<string>348.ImportedFromIB2</string>
 					<string>349.IBPluginDependency</string>
 					<string>349.ImportedFromIB2</string>
 					<string>350.IBPluginDependency</string>
-					<string>350.IBPropertyAccessControl</string>
 					<string>350.ImportedFromIB2</string>
 					<string>351.IBPluginDependency</string>
-					<string>351.IBPropertyAccessControl</string>
 					<string>351.ImportedFromIB2</string>
 					<string>352.IBPluginDependency</string>
 					<string>352.ImportedFromIB2</string>
 					<string>353.IBPluginDependency</string>
 					<string>353.ImportedFromIB2</string>
 					<string>354.IBPluginDependency</string>
-					<string>354.IBPropertyAccessControl</string>
 					<string>354.ImportedFromIB2</string>
 					<string>363.IBPluginDependency</string>
-					<string>363.IBPropertyAccessControl</string>
 					<string>363.ImportedFromIB2</string>
 					<string>364.IBPluginDependency</string>
-					<string>364.IBPropertyAccessControl</string>
 					<string>364.ImportedFromIB2</string>
 					<string>365.IBPluginDependency</string>
-					<string>365.IBPropertyAccessControl</string>
 					<string>365.ImportedFromIB2</string>
 					<string>368.IBPluginDependency</string>
-					<string>368.IBPropertyAccessControl</string>
 					<string>368.ImportedFromIB2</string>
 					<string>369.IBPluginDependency</string>
-					<string>369.IBPropertyAccessControl</string>
 					<string>369.ImportedFromIB2</string>
 					<string>370.IBPluginDependency</string>
-					<string>370.IBPropertyAccessControl</string>
 					<string>370.ImportedFromIB2</string>
 					<string>371.IBPluginDependency</string>
-					<string>371.IBPropertyAccessControl</string>
 					<string>371.ImportedFromIB2</string>
 					<string>372.IBPluginDependency</string>
-					<string>372.IBPropertyAccessControl</string>
 					<string>372.ImportedFromIB2</string>
 					<string>374.IBPluginDependency</string>
-					<string>374.IBPropertyAccessControl</string>
 					<string>374.ImportedFromIB2</string>
 					<string>375.IBPluginDependency</string>
-					<string>375.IBPropertyAccessControl</string>
 					<string>375.ImportedFromIB2</string>
 					<string>376.IBPluginDependency</string>
-					<string>376.IBPropertyAccessControl</string>
 					<string>376.ImportedFromIB2</string>
 					<string>377.IBPluginDependency</string>
-					<string>377.IBPropertyAccessControl</string>
 					<string>377.ImportedFromIB2</string>
 					<string>379.IBPluginDependency</string>
-					<string>379.IBPropertyAccessControl</string>
 					<string>379.ImportedFromIB2</string>
 					<string>380.IBPluginDependency</string>
 					<string>380.ImportedFromIB2</string>
 					<string>381.IBPluginDependency</string>
 					<string>381.ImportedFromIB2</string>
 					<string>382.IBPluginDependency</string>
-					<string>382.IBPropertyAccessControl</string>
 					<string>382.ImportedFromIB2</string>
 					<string>383.IBPluginDependency</string>
 					<string>383.ImportedFromIB2</string>
 					<string>384.IBPluginDependency</string>
 					<string>384.ImportedFromIB2</string>
 					<string>385.IBPluginDependency</string>
-					<string>385.IBPropertyAccessControl</string>
 					<string>385.ImportedFromIB2</string>
 					<string>386.IBPluginDependency</string>
-					<string>386.IBPropertyAccessControl</string>
 					<string>386.ImportedFromIB2</string>
 					<string>419.IBPluginDependency</string>
 					<string>419.ImportedFromIB2</string>
@@ -3634,10 +3563,8 @@ Zm9yIGV4ZWN1dGFkby4</string>
 					<string>538.IBPluginDependency</string>
 					<string>538.ImportedFromIB2</string>
 					<string>541.IBPluginDependency</string>
-					<string>541.IBPropertyAccessControl</string>
 					<string>541.ImportedFromIB2</string>
 					<string>543.IBPluginDependency</string>
-					<string>543.IBPropertyAccessControl</string>
 					<string>543.ImportedFromIB2</string>
 					<string>544.IBPluginDependency</string>
 					<string>544.ImportedFromIB2</string>
@@ -3663,13 +3590,11 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="1" id="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3688,329 +3613,273 @@ Zm9yIGV4ZWN1dGFkby4</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3" id="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{168, 821}, {113, 23}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{202, 626}, {154, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
+					<string>{{356, 858}, {322, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>{{349, 858}, {315, 153}}</string>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{271, 666}, {301, 153}}</string>
 					<string>{{437, 548}, {633, 308}}</string>
-					<reference ref="11"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="0"/>
 					<string>{{437, 548}, {633, 308}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{184, 290}, {633, 308}}</string>
-					<boolean value="NO" id="6"/>
-					<reference ref="9"/>
+					<boolean value="NO"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{58, 803}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{100, 746}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{68, 585}, {477, 271}}</string>
-					<reference ref="9"/>
-					<reference ref="6"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
+					<boolean value="NO"/>
 					<string>{{68, 585}, {477, 271}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{433, 406}, {486, 327}}</string>
-					<reference ref="6"/>
-					<reference ref="9"/>
+					<boolean value="NO"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>{{145, 1011}, {336, 20}}</string>
+					<integer value="1"/>
+					<string>{{145, 1011}, {340, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{67, 819}, {336, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{20, 641}, {218, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{79, 616}, {218, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 				</object>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -4018,9 +3887,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 			<nil key="activeLocalization"/>
 			<object class="NSMutableDictionary" key="localizations">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -4058,7 +3925,16 @@ Zm9yIGV4ZWN1dGFkby4</string>
 			</object>
 		</object>
 		<int key="IBDocument.localizationMode">0</int>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+			<integer value="1050" key="NS.object.0"/>
+		</object>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+			<integer value="3000" key="NS.object.0"/>
+		</object>
+		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
 		<string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
-		<int key="IBDocument.defaultPropertyAccessControl">1</int>
+		<int key="IBDocument.defaultPropertyAccessControl">3</int>
 	</data>
 </archive>
diff --git a/hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/keyedobjects.nib
index 74a1efe..452b14a 100644
Binary files a/hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/ru.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/ru.lproj/main.nib/designable.nib
index 275182e..ed66de2 100644
--- a/hw/xquartz/bundle/Resources/ru.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/ru.lproj/main.nib/designable.nib
@@ -1,11 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">9C31</string>
-		<string key="IBDocument.InterfaceBuilderVersion">677</string>
-		<string key="IBDocument.AppKitVersion">949.26</string>
-		<string key="IBDocument.HIToolboxVersion">352.00</string>
+		<string key="IBDocument.SystemVersion">10A354</string>
+		<string key="IBDocument.InterfaceBuilderVersion">728</string>
+		<string key="IBDocument.AppKitVersion">1019</string>
+		<string key="IBDocument.HIToolboxVersion">421.00</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+			<string key="NS.object.0">728</string>
+		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
 		</object>
@@ -15,7 +19,7 @@
 		</object>
 		<object class="NSMutableDictionary" key="IBDocument.Metadata">
 			<bool key="EncodedWithXMLCoder">YES</bool>
-			<object class="NSArray" key="dict.sortedKeys">
+			<object class="NSArray" key="dict.sortedKeys" id="0">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 			</object>
 			<object class="NSMutableArray" key="dict.values">
@@ -60,7 +64,7 @@
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="139290918">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">0J4g0L/RgNC+0LPRgNCw0LzQvNC1IFgxMQ</string>
+									<string key="NSTitle">О программе X11</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
@@ -68,7 +72,7 @@
 								</object>
 								<object class="NSMenuItem" id="386173216">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">0J3QsNGB0YLRgNC+0LnQutC44oCmA</string>
+									<string key="NSTitle">Настройки…</string>
 									<string key="NSKeyEquiv">,</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -88,7 +92,7 @@
 								</object>
 								<object class="NSMenuItem" id="32285361">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">0KHQu9GD0LbQsdGLA</string>
+									<string key="NSTitle">Службы</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -96,7 +100,7 @@
 									<reference key="NSMixedImage" ref="351811234"/>
 									<string key="NSAction">submenuAction:</string>
 									<object class="NSMenu" key="NSSubmenu" id="821388474">
-										<string type="base64-UTF8" key="NSTitle">0KHQu9GD0LbQsdGLA</string>
+										<string key="NSTitle">Службы</string>
 										<object class="NSMutableArray" key="NSMenuItems">
 											<bool key="EncodedWithXMLCoder">YES</bool>
 										</object>
@@ -116,8 +120,7 @@
 								</object>
 								<object class="NSMenuItem" id="6876565">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">0J/QtdGA0LXQutC70Y7Rh9C10L3QuNC1INC/0L7Qu9C90L7RjdC60YDQsNC90L3QvtCz0L4g0YDQtdC2
-0LjQvNCwA</string>
+									<string key="NSTitle">Переключение полноэкранного режима</string>
 									<string key="NSKeyEquiv">a</string>
 									<int key="NSKeyEquivModMask">1572864</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -137,7 +140,7 @@
 								</object>
 								<object class="NSMenuItem" id="301008465">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">0KHQutGA0YvRgtGMIFgxMQ</string>
+									<string key="NSTitle">Скрыть X11</string>
 									<string key="NSKeyEquiv">h</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -147,7 +150,7 @@
 								</object>
 								<object class="NSMenuItem" id="206802571">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">0KHQutGA0YvRgtGMINC+0YHRgtCw0LvRjNC90YvQtQ</string>
+									<string key="NSTitle">Скрыть остальные</string>
 									<string key="NSKeyEquiv">h</string>
 									<int key="NSKeyEquivModMask">1572864</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -156,7 +159,7 @@
 								</object>
 								<object class="NSMenuItem" id="1023546148">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">0J/QvtC60LDQt9Cw0YLRjCDQstGB0LU</string>
+									<string key="NSTitle">Показать все</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -177,7 +180,7 @@
 								</object>
 								<object class="NSMenuItem" id="274138642">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">0JfQsNCy0LXRgNGI0LjRgtGMIFgxMQ</string>
+									<string key="NSTitle">Завершить X11</string>
 									<string key="NSKeyEquiv">q</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -190,7 +193,7 @@
 					</object>
 					<object class="NSMenuItem" id="868031522">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle">0J/RgNC+0LPRgNCw0LzQvNGLA</string>
+						<string key="NSTitle">Программы</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -198,7 +201,7 @@
 						<reference key="NSMixedImage" ref="351811234"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="981161348">
-							<string type="base64-UTF8" key="NSTitle">0J/RgNC+0LPRgNCw0LzQvNGLA</string>
+							<string key="NSTitle">Программы</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="390088328">
@@ -214,7 +217,7 @@
 								</object>
 								<object class="NSMenuItem" id="1065386165">
 									<reference key="NSMenu" ref="981161348"/>
-									<string type="base64-UTF8" key="NSTitle">0J3QsNGB0YLRgNC+0LjRgtGM4oCmA</string>
+									<string key="NSTitle">Настроить…</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -226,7 +229,7 @@
 					</object>
 					<object class="NSMenuItem" id="200491363">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle">0J/RgNCw0LLQutCwA</string>
+						<string key="NSTitle">Правка</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -234,12 +237,12 @@
 						<reference key="NSMixedImage" ref="351811234"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="526778998">
-							<string type="base64-UTF8" key="NSTitle">0J/RgNCw0LLQutCwA</string>
+							<string key="NSTitle">Правка</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="185296989">
 									<reference key="NSMenu" ref="526778998"/>
-									<string type="base64-UTF8" key="NSTitle">0JrQvtC/0LjRgNC+0LLQsNGC0Yw</string>
+									<string key="NSTitle">Копировать</string>
 									<string key="NSKeyEquiv">c</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -251,7 +254,7 @@
 					</object>
 					<object class="NSMenuItem" id="931553638">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle">0J7QutC90L4</string>
+						<string key="NSTitle">Окно</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -259,12 +262,12 @@
 						<reference key="NSMixedImage" ref="351811234"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="96874957">
-							<string type="base64-UTF8" key="NSTitle">0J7QutC90L4</string>
+							<string key="NSTitle">Окно</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="984461797">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">0JfQsNC60YDRi9GC0Yw</string>
+									<string key="NSTitle">Закрыть</string>
 									<string key="NSKeyEquiv">w</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -273,7 +276,7 @@
 								</object>
 								<object class="NSMenuItem" id="677652931">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">0KPQsdGA0LDRgtGMINCyIERvY2s</string>
+									<string key="NSTitle">Убрать в Dock</string>
 									<string key="NSKeyEquiv">m</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -282,7 +285,7 @@
 								</object>
 								<object class="NSMenuItem" id="1066447520">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">0JjQt9C80LXQvdC40YLRjCDQvNCw0YHRiNGC0LDQsQ</string>
+									<string key="NSTitle">Изменить масштаб</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -302,20 +305,18 @@
 								</object>
 								<object class="NSMenuItem" id="1036389925">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">0J/QvtGB0LvQtdC00L7QstCw0YLQtdC70YzQvdC+0LUg0L/QtdGA0LXQutC70Y7Rh9C10L3QuNC1INC+
-0LrQvtC9A</string>
-									<string key="NSKeyEquiv">`</string>
-									<int key="NSKeyEquivModMask">1048840</int>
+									<string key="NSTitle">Последовательное переключение окон</string>
+									<string key="NSKeyEquiv">'</string>
+									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
 								</object>
 								<object class="NSMenuItem" id="369641893">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">0J7QsdGA0LDRgtC90L7QtSDQv9C+0YHQu9C10LTQvtCy0LDRgtC10LvRjNC90L7QtSDQv9C10YDQtdC6
-0LvRjtGH0LXQvdC40LUg0L7QutC+0L0</string>
-									<string key="NSKeyEquiv">~</string>
-									<int key="NSKeyEquivModMask">1179914</int>
+									<string key="NSTitle">Обратное последовательное переключение окон</string>
+									<string key="NSKeyEquiv">'</string>
+									<int key="NSKeyEquivModMask">1179648</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
@@ -333,7 +334,7 @@
 								</object>
 								<object class="NSMenuItem" id="276216762">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">0JLRgdC1INC+0LrQvdCwIOKAkyDQvdCwINC/0LXRgNC10LTQvdC40Lkg0L/Qu9Cw0L0</string>
+									<string key="NSTitle">Все окна – на передний план</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -357,7 +358,7 @@
 					</object>
 					<object class="NSMenuItem" id="551174276">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle">0KHQv9GA0LDQstC60LA</string>
+						<string key="NSTitle">Справка</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -365,12 +366,12 @@
 						<reference key="NSMixedImage" ref="351811234"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="511848303">
-							<string type="base64-UTF8" key="NSTitle">0KHQv9GA0LDQstC60LA</string>
+							<string key="NSTitle">Справка</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="504984881">
 									<reference key="NSMenu" ref="511848303"/>
-									<string type="base64-UTF8" key="NSTitle">0KHQv9GA0LDQstC60LAgWDExA</string>
+									<string key="NSTitle">Справка X11</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -391,7 +392,7 @@
 				<int key="NSWindowBacking">2</int>
 				<string key="NSWindowRect">{{266, 364}, {604, 308}}</string>
 				<int key="NSWTFlags">1350041600</int>
-				<string type="base64-UTF8" key="NSWindowTitle">0J3QsNGB0YLRgNC+0LnQutC4IFgxMQ</string>
+				<string key="NSWindowTitle">Настройки X11</string>
 				<string key="NSWindowClass">NSPanel</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
@@ -428,10 +429,10 @@
 												<object class="NSButtonCell" key="NSCell" id="990762273">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">0K3QvNGD0LvQuNGA0L7QstCw0YLRjCDRgtGA0LXRhdC60L3QvtC/0L7Rh9C90YPRjiDQvNGL0YjRjA</string>
+													<string key="NSContents">Эмулировать трехкнопочную мышь</string>
 													<object class="NSFont" key="NSSupport" id="463863101">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">1044</int>
 													</object>
 													<reference key="NSControlView" ref="119157981"/>
@@ -459,13 +460,10 @@
 												<object class="NSTextFieldCell" key="NSCell" id="391919450">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">0JXRgdC70Lgg0LLQutC70Y7Rh9C10L3Qviwg0Y3QutCy0LjQstCw0LvQtdC90YLRiyDQutC70LDQstC4
-0Ygg0YHRgtGA0L7QutC4INC80LXQvdGOINC80L7Qs9GD0YIg0L/QtdGA0LXRgdC10LrQsNGC0YzRgdGP
-INGBINGN0LrQstC40LLQsNC70LXQvdGC0LDQvNC4INCyINC/0YDQvtCz0YDQsNC80LzQsNGFIFgxMSwg
-0LjRgdC/0L7Qu9GM0LfRg9GO0YnQuNGFINC80LXRgtCwLdC80L7QtNC40YTQuNC60LDRgtC+0YAuA</string>
+													<string key="NSContents">Если включено, эквиваленты клавиш строки меню могут пересекаться с эквивалентами в программах X11, использующих мета-модификатор.</string>
 													<object class="NSFont" key="NSSupport" id="26">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.100000e+01</double>
+														<double key="NSSize">11</double>
 														<int key="NSfFlags">3100</int>
 													</object>
 													<string key="NSPlaceholderString"/>
@@ -476,7 +474,7 @@ INGBINGN0LrQstC40LLQsNC70LXQvdGC0LDQvNC4INCyINC/0YDQvtCz0YDQsNC80LzQsNGFIFgxMSwg
 														<string key="NSColorName">controlColor</string>
 														<object class="NSColor" key="NSColor" id="393768457">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2ODY1AA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -518,7 +516,7 @@ INGBINGN0LrQstC40LLQsNC70LXQvdGC0LDQvNC4INCyINC/0YDQvtCz0YDQsNC80LzQsNGFIFgxMSwg
 												<object class="NSButtonCell" key="NSCell" id="940564599">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">0JLQutC70Y7Rh9C40YLRjCDRjdC60LLQuNCy0LDQu9C10L3RgtGLINC60LvQsNCy0LjRiCDQsiBYMTE</string>
+													<string key="NSContents">Включить эквиваленты клавиш в X11</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="842100515"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -540,9 +538,7 @@ INGBINGN0LrQstC40LLQsNC70LXQvdGC0LDQvNC4INCyINC/0YDQvtCz0YDQsNC80LzQsNGFIFgxMSwg
 												<object class="NSTextFieldCell" key="NSCell" id="666057093">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">0KDQsNC30YDQtdGI0LDRgtGMINC40LfQvNC10L3QtdC90LjRjyDQvNC10L3RjiDQstGF0L7QtNCwINC0
-0LvRjyDQv9C10YDQtdC30LDQv9C40YHQuCDRgtC10LrRg9GJ0LXQuSBYMTEt0LrQsNGA0YLRiyDQutC7
-0Y7Rh9C10LkuA</string>
+													<string key="NSContents">Разрешать изменения меню ввода для перезаписи текущей X11-карты ключей.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="31160162"/>
@@ -559,8 +555,7 @@ INGBINGN0LrQstC40LLQsNC70LXQvdGC0LDQvNC4INCyINC/0YDQvtCz0YDQsNC80LzQsNGFIFgxMSwg
 												<object class="NSButtonCell" key="NSCell" id="967619578">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">0KHQu9C10LTQvtCy0LDRgtGMINGB0LjRgdGC0LXQvNC90L7QuSDRgNCw0YHQutC70LDQtNC60LUg0LrQ
-u9Cw0LLQuNCw0YLRg9GA0Ys</string>
+													<string key="NSContents">Следовать системной раскладке клавиатуры</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="179949713"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -577,7 +572,7 @@ u9Cw0LLQuNCw0YLRg9GA0Ys</string>
 										<string key="NSFrame">{{10, 33}, {558, 246}}</string>
 										<reference key="NSSuperview" ref="448510093"/>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">0JLRhdC+0LQ</string>
+									<string key="NSLabel">Вход</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -599,8 +594,7 @@ u9Cw0LLQuNCw0YLRg9GA0Ys</string>
 												<object class="NSButtonCell" key="NSCell" id="1016069354">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">0JjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGMINGB0LjRgdGC0LXQvNC90YvQuSDRjdGE0YTQtdC60YIg0L/R
-gNC10LTRg9C/0YDQtdC20LTQtdC90LjQuQ</string>
+													<string key="NSContents">Использовать системный эффект предупреждений</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="418227126"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -622,11 +616,7 @@ gNC10LTRg9C/0YDQtdC20LTQtdC90LjQuQ</string>
 												<object class="NSTextFieldCell" key="NSCell" id="624655599">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">0JfQstGD0LrQvtCy0YvQtSDRgdC40LPQvdCw0LvRiyBYMTEg0LHRg9C00YPRgiDQuNGB0L/QvtC70YzQ
-t9C+0LLQsNGC0Ywg0YHRgtCw0L3QtNCw0YDRgtC90YvQtSDRgdC40YHRgtC10LzQvdGL0LUg0L/RgNC1
-0LTRg9C/0YDQtdC20LTQtdC90LjRjywg0LrQsNC6INGN0YLQviDQvtC/0YDQtdC00LXQu9C10L3QviDQ
-siDQv9Cw0L3QtdC70LggwqvQl9Cy0YPQutC+0LLRi9C1INGN0YTRhNC10LrRgtGLwrsg0KHQuNGB0YLQ
-tdC80L3Ri9GFINC90LDRgdGC0YDQvtC10LouA</string>
+													<string key="NSContents">Звуковые сигналы X11 будут использовать стандартные системные предупреждения, как это определено в панели «Звуковые эффекты» Системных настроек.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="1039016593"/>
@@ -649,7 +639,7 @@ tdC80L3Ri9GFINC90LDRgdGC0YDQvtC10LouA</string>
 													<int key="NSButtonFlags2">1</int>
 													<object class="NSFont" key="NSAlternateImage">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">16</int>
 													</object>
 													<string key="NSAlternateContents"/>
@@ -660,7 +650,7 @@ tdC80L3Ri9GFINC90LDRgdGC0YDQvtC10LouA</string>
 													<int key="NSPeriodicInterval">75</int>
 													<object class="NSMenuItem" key="NSMenuItem" id="616492372">
 														<reference key="NSMenu" ref="341113515"/>
-														<string type="base64-UTF8" key="NSTitle">0KEg0Y3QutGA0LDQvdCwA</string>
+														<string key="NSTitle">С экрана</string>
 														<string key="NSKeyEquiv"/>
 														<int key="NSKeyEquivModMask">1048576</int>
 														<int key="NSMnemonicLoc">2147483647</int>
@@ -681,7 +671,7 @@ tdC80L3Ri9GFINC90LDRgdGC0YDQvtC10LouA</string>
 															<reference ref="616492372"/>
 															<object class="NSMenuItem" id="759499526">
 																<reference key="NSMenu" ref="341113515"/>
-																<string type="base64-UTF8" key="NSTitle">MjU2INGG0LLQtdGC0L7Qsg</string>
+																<string key="NSTitle">256 цветов</string>
 																<string key="NSKeyEquiv"/>
 																<int key="NSKeyEquivModMask">1048576</int>
 																<int key="NSMnemonicLoc">2147483647</int>
@@ -693,7 +683,7 @@ tdC80L3Ri9GFINC90LDRgdGC0YDQvtC10LouA</string>
 															</object>
 															<object class="NSMenuItem" id="543935434">
 																<reference key="NSMenu" ref="341113515"/>
-																<string type="base64-UTF8" key="NSTitle">0KLRi9GB0Y/Rh9C4A</string>
+																<string key="NSTitle">Тысячи</string>
 																<string key="NSKeyEquiv"/>
 																<int key="NSKeyEquivModMask">1048576</int>
 																<int key="NSMnemonicLoc">2147483647</int>
@@ -705,7 +695,7 @@ tdC80L3Ri9GFINC90LDRgdGC0YDQvtC10LouA</string>
 															</object>
 															<object class="NSMenuItem" id="836673018">
 																<reference key="NSMenu" ref="341113515"/>
-																<string type="base64-UTF8" key="NSTitle">0JzQuNC70LvQuNC+0L3Riw</string>
+																<string key="NSTitle">Миллионы</string>
 																<string key="NSKeyEquiv"/>
 																<int key="NSKeyEquivModMask">1048576</int>
 																<int key="NSMnemonicLoc">2147483647</int>
@@ -716,6 +706,7 @@ tdC80L3Ri9GFINC90LDRgdGC0YDQvtC10LouA</string>
 																<reference key="NSTarget" ref="633115429"/>
 															</object>
 														</object>
+														<reference key="NSMenuFont" ref="463863101"/>
 													</object>
 													<int key="NSPreferredEdge">3</int>
 													<bool key="NSUsesItemFromMenu">YES</bool>
@@ -749,8 +740,7 @@ tdC80L3Ri9GFINC90LDRgdGC0YDQvtC10LouA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="311969422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">0K3RgtC+0YIg0L/QsNGA0LDQvNC10YLRgCDQstGB0YLRg9C/0LjRgiDQsiDRgdC40LvRgyDQv9GA0Lgg
-0YHQu9C10LTRg9GO0YnQtdC8INC30LDQv9GD0YHQutC1IFgxMS4</string>
+													<string key="NSContents">Этот параметр вступит в силу при следующем запуске X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="86150604"/>
@@ -767,7 +757,7 @@ tdC80L3Ri9GFINC90LDRgdGC0YDQvtC10LouA</string>
 												<object class="NSButtonCell" key="NSCell" id="631531164">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">0J/QvtC70L3QvtGN0LrRgNCw0L3QvdGL0Lkg0YDQtdC20LjQvA</string>
+													<string key="NSContents">Полноэкранный режим</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477203622"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -789,8 +779,7 @@ tdC80L3Ri9GFINC90LDRgdGC0YDQvtC10LouA</string>
 												<object class="NSButtonCell" key="NSCell" id="917248662">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">0JDQstGC0L7QvNCw0YLQuNGH0LXRgdC60Lgg0L/QvtC60LDQt9GL0LLQsNGC0Ywg0YHRgtGA0L7QutGD
-INC80LXQvdGOINCyINC/0L7Qu9C90L7RjdC60YDQsNC90L3QvtC8INGA0LXQttC40LzQtQ</string>
+													<string key="NSContents">Автоматически показывать строку меню в полноэкранном режиме</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="57246850"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -812,10 +801,7 @@ INC80LXQvdGOINCyINC/0L7Qu9C90L7RjdC60YDQsNC90L3QvtC8INGA0LXQttC40LzQtQ</string>
 												<object class="NSTextFieldCell" key="NSCell" id="761107402">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">0JLQutC70Y7Rh9Cw0LXRgiDQutC+0YDQvdC10LLQvtC1INC+0LrQvdC+IFgxMS4g0JjRgdC/0L7Qu9GM
-0LfRg9C50YLQtSDRgdC+0YfQtdGC0LDQvdC40LUg0LrQu9Cw0LLQuNGIIMKrQ29tbWFuZC1PcHRpb24t
-QcK7INC00LvRjyDQstC60LvRjtGH0LXQvdC40Y8g0Lgg0LLRi9C60LvRjtGH0LXQvdC40Y8g0L/QvtC7
-0L3QvtGN0LrRgNCw0L3QvdC+0LPQviDRgNC10LbQuNC80LAuA</string>
+													<string key="NSContents">Включает корневое окно X11. Используйте сочетание клавиш «Command-Option-A» для включения и выключения полноэкранного режима.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="298603383"/>
@@ -826,7 +812,7 @@ QcK7INC00LvRjyDQstC60LvRjtGH0LXQvdC40Y8g0Lgg0LLRi9C60LvRjtGH0LXQvdC40Y8g0L/QvtC7
 										</object>
 										<string key="NSFrame">{{10, 33}, {558, 246}}</string>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">0JLRi9GF0L7QtA</string>
+									<string key="NSLabel">Выход</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -848,7 +834,7 @@ QcK7INC00LvRjyDQstC60LvRjtGH0LXQvdC40Y8g0Lgg0LLRi9C60LvRjtGH0LXQvdC40Y8g0L/QvtC7
 												<object class="NSButtonCell" key="NSCell" id="718083688">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">0JLQutC70Y7Rh9C40YLRjCDRgdC40L3RhdGA0L7QvdC40LfQsNGG0LjRjg</string>
+													<string key="NSContents">Включить синхронизацию</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="878106058"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -870,10 +856,7 @@ QcK7INC00LvRjyDQstC60LvRjtGH0LXQvdC40Y8g0Lgg0LLRi9C60LvRjtGH0LXQvdC40Y8g0L/QvtC7
 												<object class="NSTextFieldCell" key="NSCell" id="572508492">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">0JLQutC70Y7Rh9Cw0LXRgiDQvtCx0YrQtdC60YIg0LzQtdC90Y4gwqvQmtC+0L/QuNGA0L7QstCw0YLR
-jMK7INC4INGA0LDQt9GA0LXRiNCw0LXRgiDRgdC40L3RhdGA0L7QvdC40LfQsNGG0LjRjiDQvNC10LbQ
-tNGDINCx0YPRhNC10YDQvtC8INC+0LHQvNC10L3QsCBPUyBYINC4INCx0YPRhNC10YDQsNC80LggWDEx
-IENMSVBCT0FSRC9QUklNQVJZLg</string>
+													<string key="NSContents">Включает объект меню «Копировать» и разрешает синхронизацию между буфером обмена OS X и буферами X11 CLIPBOARD/PRIMARY.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="386152084"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -889,8 +872,7 @@ IENMSVBCT0FSRC9QUklNQVJZLg</string>
 												<object class="NSButtonCell" key="NSCell" id="501304422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">0J7QsdC90L7QstC40YLRjCBDTElQQk9BUkQg0L/RgNC4INC40LfQvNC10L3QtdC90LjRj9GFINCyINCx
-0YPRhNC10YDQtSDQvtCx0LzQtdC90LAuA</string>
+													<string key="NSContents">Обновить CLIPBOARD при изменениях в буфере обмена.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477050998"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -912,9 +894,7 @@ IENMSVBCT0FSRC9QUklNQVJZLg</string>
 												<object class="NSButtonCell" key="NSCell" id="510771323">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">0J7QsdC90L7QstC40YLRjCBQUklNQVJZICjRgdGA0LXQtNC90Y/RjyDQutC90L7Qv9C60LAg0LzRi9GI
-0LgpINC/0YDQuCDQuNC30LzQtdC90LXQvdC40Y/RhSDQsiDQkdGD0YTQtdGA0LUg0L7QsdC80LXQvdCw
-Lg</string>
+													<string key="NSContents">Обновить PRIMARY (средняя кнопка мыши) при изменениях в Буфере обмена.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="765780304"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -936,8 +916,7 @@ Lg</string>
 												<object class="NSButtonCell" key="NSCell" id="897099877">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">0J7QsdC90L7QstC40YLRjCDQkdGD0YTQtdGAINC+0LHQvNC10L3QsCDRgdGA0LDQt9GDINC/0L7RgdC7
-0LUg0LLRi9Cx0L7RgNCwINC90L7QstC+0LPQviDRgtC10LrRgdGC0LAuA</string>
+													<string key="NSContents">Обновить Буфер обмена сразу после выбора нового текста.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="1002778833"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -959,8 +938,7 @@ Lg</string>
 												<object class="NSButtonCell" key="NSCell" id="619977658">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">0J7QsdC90L7QstC40YLRjCDQsdGD0YTQtdGAINC+0LHQvNC10L3QsCDQv9GA0Lgg0LjQt9C80LXQvdC1
-0L3QuNGP0YUg0LIgQ0xJUEJPQVJELg</string>
+													<string key="NSContents">Обновить буфер обмена при изменениях в CLIPBOARD.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="487809555"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -982,10 +960,7 @@ Lg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="461823902">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">0J7RgtC60LvRjtGH0LjRgtC1INGN0YLQvtGCINC/0LDRgNCw0LzQtdGC0YAsINC10YHQu9C4INGF0L7R
-gtC40YLQtSDQuNGB0L/QvtC70YzQt9C+0LLQsNGC0YwgeGNsaXBib2FyZCwga2xpcHBlciDQuNC70Lgg
-0LjQvdGD0Y4g0LTRgNGD0LPRg9GOINC/0YDQvtCz0YDQsNC80LzRgy3QvNC10L3QtdC00LbQtdGAINCx
-0YPRhNC10YDQsCDQvtCx0LzQtdC90LAgWDExLg</string>
+													<string key="NSContents">Отключите этот параметр, если хотите использовать xclipboard, klipper или иную другую программу-менеджер буфера обмена X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="620944856"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1001,10 +976,7 @@ gtC40YLQtSDQuNGB0L/QvtC70YzQt9C+0LLQsNGC0YwgeGNsaXBib2FyZCwga2xpcHBlciDQuNC70Lgg
 												<object class="NSTextFieldCell" key="NSCell" id="994587858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">0JIg0YHQstGP0LfQuCDRgSDQvtCz0YDQsNC90LjRh9C10L3QuNGP0LzQuCDQsiDQv9GA0L7RgtC+0LrQ
-vtC70LUgWDExINGN0YLQvtGCINC/0LDRgNCw0LzQtdGC0YAsINCy0L7Qt9C80L7QttC90L4sINCyINC9
-0LXQutC+0YLQvtGA0YvRhSDQv9GA0L7Qs9GA0LDQvNC80LDRhSDQuNC90L7Qs9C00LAg0YDQsNCx0L7R
-gtCw0YLRjCDQvdC1INCx0YPQtNC10YIuA</string>
+													<string key="NSContents">В связи с ограничениями в протоколе X11 этот параметр, возможно, в некоторых программах иногда работать не будет.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="522511724"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1014,7 +986,7 @@ gtCw0YLRjCDQvdC1INCx0YPQtNC10YIuA</string>
 										</object>
 										<string key="NSFrame">{{10, 33}, {558, 246}}</string>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">0JHRg9GE0LXRgCDQvtCx0LzQtdC90LA</string>
+									<string key="NSLabel">Буфер обмена</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -1036,8 +1008,7 @@ gtCw0YLRjCDQvdC1INCx0YPQtNC10YIuA</string>
 												<object class="NSButtonCell" key="NSCell" id="259618205">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">0KHQutCy0L7Qt9C90L7QtSDQvdCw0LbQsNGC0LjQtSDQvdC10LDQutGC0LjQstC90YvRhSDQvtC60L7Q
-vQ</string>
+													<string key="NSContents">Сквозное нажатие неактивных окон</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="657659108"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1059,10 +1030,7 @@ vQ</string>
 												<object class="NSTextFieldCell" key="NSCell" id="399127858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">0JXRgdC70Lgg0LLQutC70Y7Rh9C10L3Qviwg0L3QsNC20LDRgtC40LUg0L3QtdCw0LrRgtC40LLQvdC+
-0LPQviDQvtC60L3QsCDQv9C+0LLQu9C10YfQtdGCINC30LAg0YHQvtCx0L7QuSDQvdC1INGC0L7Qu9GM
-0LrQviDQtdCz0L4g0LDQutGC0LjQstCw0YbQuNGOLCDQvdC+INC4INGB0LrQstC+0LfQvdC+0LUg0L/R
-gNC+0YXQvtC20LTQtdC90LjQtSDQvNGL0YjQuCDQuiDRjdGC0L7QvNGDINC+0LrQvdGDLg</string>
+													<string key="NSContents">Если включено, нажатие неактивного окна повлечет за собой не только его активацию, но и сквозное прохождение мыши к этому окну.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="290578835"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1078,7 +1046,7 @@ gNC+0YXQvtC20LTQtdC90LjQtSDQvNGL0YjQuCDQuiDRjdGC0L7QvNGDINC+0LrQvdGDLg</string>
 												<object class="NSButtonCell" key="NSCell" id="959555182">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">0KTQvtC60YPRgSDRgdC70LXQtNGD0LXRgiDQt9CwINC80YvRiNGM0Y4</string>
+													<string key="NSContents">Фокус следует за мышью</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="992839333"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1100,9 +1068,7 @@ gNC+0YXQvtC20LTQtdC90LjQtSDQvNGL0YjQuCDQuiDRjdGC0L7QvNGDINC+0LrQvdGDLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="183409141">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">0KTQvtC60YPRgSDQvtC60L3QsCBYMTEg0YHQu9C10LTRg9C10YIg0LfQsCDQtNCy0LjQttC10L3QuNC1
-0Lwg0LrRg9GA0YHQvtGA0LAsINGH0YLQviDQuNC80LXQtdGCINC90LXQutC+0YLQvtGA0YvQtSDQvtGC
-0YDQuNGG0LDRgtC10LvRjNC90YvQtSDQv9C+0YHQu9C10LTRgdGC0LLQuNGPLg</string>
+													<string key="NSContents">Фокус окна X11 следует за движением курсора, что имеет некоторые отрицательные последствия.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="138261120"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1118,7 +1084,7 @@ gNC+0YXQvtC20LTQtdC90LjQtSDQvNGL0YjQuCDQuiDRjdGC0L7QvNGDINC+0LrQvdGDLg</string>
 												<object class="NSButtonCell" key="NSCell" id="556463187">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">0KTQvtC60YPRgSDigJMg0L3QsCDQvdC+0LLRi9C1INC+0LrQvdCwA</string>
+													<string key="NSContents">Фокус – на новые окна</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="128352289"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1140,10 +1106,7 @@ gNC+0YXQvtC20LTQtdC90LjQtSDQvNGL0YjQuCDQuiDRjdGC0L7QvNGDINC+0LrQvdGDLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="989804990">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">0JXRgdC70Lgg0LLQutC70Y7Rh9C10L3Qviwg0YHQvtC30LTQsNC90LjQtSDQvdC+0LLQvtCz0L4g0L7Q
-utC90LAgWDExINC/0L7QstC70LXRh9C10YIg0LfQsCDRgdC+0LHQvtC5INC/0LXRgNC10LzQtdGJ0LXQ
-vdC40LUg0L3QsCDQv9C10YDQtdC00L3QuNC5INC/0LvQsNC9IFgxMS5hcHAgKNCy0LzQtdGB0YLQviBG
-aW5kZXIuYXBwLCBUZXJtaW5hbC5hcHAg0Lgg0YIu0LQuKQ</string>
+													<string key="NSContents">Если включено, создание нового окна X11 повлечет за собой перемещение на передний план X11.app (вместо Finder.app, Terminal.app и т.д.)</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="57161931"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1153,7 +1116,7 @@ aW5kZXIuYXBwLCBUZXJtaW5hbC5hcHAg0Lgg0YIu0LQuKQ</string>
 										</object>
 										<string key="NSFrame">{{10, 33}, {558, 246}}</string>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">0J7QutC90LA</string>
+									<string key="NSLabel">Окна</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -1172,8 +1135,7 @@ aW5kZXIuYXBwLCBUZXJtaW5hbC5hcHAg0Lgg0YIu0LQuKQ</string>
 												<object class="NSButtonCell" key="NSCell" id="189594322">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">0J/RgNC+0LLQtdGA0Y/RgtGMINC40LTQtdC90YLQuNGE0LjQutCw0YbQuNC4INC/0L7QtNC60LvRjtGH
-0LXQvdC40Lk</string>
+													<string key="NSContents">Проверять идентификации подключений</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="989050925"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1195,8 +1157,7 @@ aW5kZXIuYXBwLCBUZXJtaW5hbC5hcHAg0Lgg0YIu0LQuKQ</string>
 												<object class="NSButtonCell" key="NSCell" id="489340979">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">0KDQsNC30YDQtdGI0LDRgtGMINC/0L7QtNC60LvRjtGH0LXQvdC40Y8g0LjQtyDQutC70LjQtdC90YLR
-gdC60LjRhSDRgdC10YLQtdC5A</string>
+													<string key="NSContents">Разрешать подключения из клиентских сетей</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="700826966"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1218,12 +1179,7 @@ gdC60LjRhSDRgdC10YLQtdC5A</string>
 												<object class="NSTextFieldCell" key="NSCell" id="53243865">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">0JfQsNC/0YPRgdC6IFgxMSDRgdC+0LfQtNCw0YHRgiDQutC70Y7Rh9C4INC00L7RgdGC0YPQv9CwLdC6
-0L7QvdGC0YDQvtC70Y8gWGF1dGhvcml0eS4g0JXRgdC70Lgg0YHQuNGB0YLQtdC80L3Ri9C5IElQLdCw
-0LTRgNC10YEg0LjQt9C80LXQvdGP0LXRgtGB0Y8sINGN0YLQuCDQutC70Y7Rh9C4INGB0YLQsNC90L7Q
-stGP0YLRgdGPINC90LXQtNC10LnRgdGC0LLQuNGC0LXQu9GM0L3Ri9C80LgsINGH0YLQviDQvNC+0LbQ
-tdGCINC/0YDQtdC/0Y/RgtGB0YLQstC+0LLQsNGC0Ywg0LfQsNC/0YPRgdC60YMg0L/RgNC+0LPRgNCw
-0LzQvCBYMTEuA</string>
+													<string key="NSContents">Запуск X11 создаст ключи доступа-контроля Xauthority. Если системный IP-адрес изменяется, эти ключи становятся недействительными, что может препятствовать запуску программ X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="168436707"/>
@@ -1240,12 +1196,7 @@ tdGCINC/0YDQtdC/0Y/RgtGB0YLQstC+0LLQsNGC0Ywg0LfQsNC/0YPRgdC60YMg0L/RgNC+0LPRgNCw
 												<object class="NSTextFieldCell" key="NSCell" id="390084685">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">0JXRgdC70Lgg0LLQutC70Y7Rh9C10L3Qviwg0L/RgNC+0LLQtdGA0LrQsCDQuNC00LXQvdGC0LjRhNC4
-0LrQsNGG0LjQuCDQv9C+0LTQutC70Y7Rh9C10L3QuNC5INC00L7Qu9C20L3QsCDQsdGL0YLRjCDRgtCw
-0LrQttC1INCy0LrQu9GO0YfQtdC90LAg0LTQu9GPINCz0LDRgNCw0L3RgtC40Lgg0YDQsNCx0L7RgtGL
-INGB0LjRgdGC0LXQvNGLINCx0LXQt9C+0L/QsNGB0L3QvtGB0YLQuC4g0JXRgdC70Lgg0LLRi9C60LvR
-jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
-0YDQvtCz0YDQsNC80Lwg0L3QtdC00L7RgdGC0YPQv9C90YsuA</string>
+													<string key="NSContents">Если включено, проверка идентификации подключений должна быть также включена для гарантии работы системы безопасности. Если выключено, подключения из удаленных программ недоступны.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="363817195"/>
@@ -1262,8 +1213,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 												<object class="NSTextFieldCell" key="NSCell" id="283628678">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">0K3RgtC4INC/0LDRgNCw0LzQtdGC0YDRiyDQstGB0YLRg9C/0Y/RgiDQsiDRgdC40LvRgyDQv9GA0Lgg
-0YHQu9C10LTRg9GO0YnQtdC8INC30LDQv9GD0YHQutC1IFgxMS4</string>
+													<string key="NSContents">Эти параметры вступят в силу при следующем запуске X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="223835729"/>
@@ -1274,7 +1224,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 										</object>
 										<string key="NSFrame">{{10, 33}, {558, 246}}</string>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">0JHQtdC30L7Qv9Cw0YHQvdC+0YHRgtGMA</string>
+									<string key="NSLabel">Безопасность</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -1302,7 +1252,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 				<int key="NSWindowBacking">2</int>
 				<string key="NSWindowRect">{{302, 440}, {504, 271}}</string>
 				<int key="NSWTFlags">1350041600</int>
-				<string type="base64-UTF8" key="NSWindowTitle">0J/RgNC+0LPRgNCw0LzQvNC90L7QtSDQvNC10L3RjiBYMTE</string>
+				<string key="NSWindowTitle">Программное меню X11</string>
 				<string key="NSWindowClass">NSPanel</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
@@ -1323,7 +1273,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 							<object class="NSButtonCell" key="NSCell" id="143554520">
 								<int key="NSCellFlags">67239424</int>
 								<int key="NSCellFlags2">137887744</int>
-								<string type="base64-UTF8" key="NSContents">0JTRg9Cx0LvQuNGA0L7QstCw0YLRjA</string>
+								<string key="NSContents">Дублировать</string>
 								<reference key="NSSupport" ref="463863101"/>
 								<reference key="NSControlView" ref="671954382"/>
 								<int key="NSButtonFlags">-2038284033</int>
@@ -1346,7 +1296,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 							<object class="NSButtonCell" key="NSCell" id="8201128">
 								<int key="NSCellFlags">67239424</int>
 								<int key="NSCellFlags2">137887744</int>
-								<string type="base64-UTF8" key="NSContents">0KPQtNCw0LvQuNGC0Yw</string>
+								<string key="NSContents">Удалить</string>
 								<reference key="NSSupport" ref="463863101"/>
 								<reference key="NSControlView" ref="492358940"/>
 								<int key="NSButtonFlags">-2038284033</int>
@@ -1392,17 +1342,17 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 											<object class="NSMutableArray" key="NSTableColumns">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<object class="NSTableColumn" id="938444323">
-													<double key="NSWidth">1.387310e+02</double>
-													<double key="NSMinWidth">6.273100e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">138.73101806640625</double>
+													<double key="NSMinWidth">62.730998992919922</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
-														<string type="base64-UTF8" key="NSContents">0JjQvNGPA</string>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
+														<string key="NSContents">Имя</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor" id="113872566">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+															<bytes key="NSWhite">MC4zMzMzMzI5ODU2AA</bytes>
 														</object>
 														<object class="NSColor" key="NSTextColor" id="249576247">
 															<int key="NSColorSpace">6</int>
@@ -1430,13 +1380,13 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 												<object class="NSTableColumn" id="84282687">
-													<double key="NSWidth">1.160000e+02</double>
-													<double key="NSMinWidth">4.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">116</double>
+													<double key="NSMinWidth">40</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
-														<string type="base64-UTF8" key="NSContents">0JrQvtC80LDQvdC00LA</string>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
+														<string key="NSContents">Команда</string>
 														<reference key="NSSupport" ref="26"/>
 														<reference key="NSBackgroundColor" ref="113872566"/>
 														<reference key="NSTextColor" ref="249576247"/>
@@ -1457,13 +1407,13 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 												<object class="NSTableColumn" id="242608782">
-													<double key="NSWidth">8.699998e+01</double>
-													<double key="NSMinWidth">1.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">86.999969482421875</double>
+													<double key="NSMinWidth">10</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">67239424</int>
-														<int key="NSCellFlags2">0</int>
-														<string type="base64-UTF8" key="NSContents">0KHQvtGHLiDQutC7Lg</string>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
+														<string key="NSContents">Соч. кл.</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor">
 															<int key="NSColorSpace">6</int>
@@ -1479,7 +1429,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 														<string key="NSContents">Text Cell</string>
 														<object class="NSFont" key="NSSupport">
 															<string key="NSName">LucidaGrande</string>
-															<double key="NSSize">1.200000e+01</double>
+															<double key="NSSize">12</double>
 															<int key="NSfFlags">16</int>
 														</object>
 														<string key="NSPlaceholderString"/>
@@ -1499,8 +1449,8 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 											</object>
-											<double key="NSIntercellSpacingWidth">3.000000e+00</double>
-											<double key="NSIntercellSpacingHeight">2.000000e+00</double>
+											<double key="NSIntercellSpacingWidth">3</double>
+											<double key="NSIntercellSpacingHeight">2</double>
 											<reference key="NSBackgroundColor" ref="822946413"/>
 											<object class="NSColor" key="NSGridColor">
 												<int key="NSColorSpace">6</int>
@@ -1511,12 +1461,15 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 													<bytes key="NSWhite">MC41AA</bytes>
 												</object>
 											</object>
-											<double key="NSRowHeight">1.700000e+01</double>
+											<double key="NSRowHeight">17</double>
 											<int key="NSTvFlags">1379958784</int>
+											<reference key="NSDelegate"/>
+											<reference key="NSDataSource"/>
 											<int key="NSColumnAutoresizingStyle">1</int>
 											<int key="NSDraggingSourceMaskForLocal">-1</int>
 											<int key="NSDraggingSourceMaskForNonLocal">0</int>
 											<bool key="NSAllowsTypeSelect">YES</bool>
+											<int key="NSTableViewDraggingDestinationStyle">0</int>
 										</object>
 									</object>
 									<string key="NSFrame">{{1, 17}, {351, 198}}</string>
@@ -1533,7 +1486,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 									<reference key="NSSuperview" ref="1063387772"/>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">9.949238e-01</double>
+									<double key="NSPercent">0.99492377042770386</double>
 								</object>
 								<object class="NSScroller" id="17278747">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1543,7 +1496,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 									<int key="NSsFlags">1</int>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">6.885246e-01</double>
+									<double key="NSPercent">0.68852460384368896</double>
 								</object>
 								<object class="NSClipView" id="672307654">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1581,7 +1534,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 							<object class="NSButtonCell" key="NSCell" id="1025474039">
 								<int key="NSCellFlags">-2080244224</int>
 								<int key="NSCellFlags2">137887744</int>
-								<string type="base64-UTF8" key="NSContents">0JTQvtCxLiDQvtCx0YrQtdC60YI</string>
+								<string key="NSContents">Доб. объект</string>
 								<reference key="NSSupport" ref="463863101"/>
 								<reference key="NSControlView" ref="758204686"/>
 								<int key="NSButtonFlags">-2038284033</int>
@@ -1604,7 +1557,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 				<string key="NSFrameAutosaveName">x11_apps</string>
 			</object>
 			<object class="NSMenu" id="294137138">
-				<string type="base64-UTF8" key="NSTitle">0JzQtdC90Y4</string>
+				<string key="NSTitle">Меню</string>
 				<object class="NSMutableArray" key="NSMenuItems">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="NSMenuItem" id="318286212">
@@ -1620,7 +1573,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 					</object>
 					<object class="NSMenuItem" id="511651072">
 						<reference key="NSMenu" ref="294137138"/>
-						<string type="base64-UTF8" key="NSTitle">0J/RgNC+0LPRgNCw0LzQvNGLA</string>
+						<string key="NSTitle">Программы</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -1628,7 +1581,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 						<reference key="NSMixedImage" ref="351811234"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="48278059">
-							<string type="base64-UTF8" key="NSTitle">0J/RgNC+0LPRgNCw0LzQvNGLA</string>
+							<string key="NSTitle">Программы</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="563798000">
@@ -1644,7 +1597,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 								</object>
 								<object class="NSMenuItem" id="1032342329">
 									<reference key="NSMenu" ref="48278059"/>
-									<string type="base64-UTF8" key="NSTitle">0J3QsNGB0YLRgNC+0LjRgtGM4oCmA</string>
+									<string key="NSTitle">Настроить…</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -2219,28 +2172,26 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="IBObjectRecord">
 						<int key="objectID">0</int>
-						<object class="NSArray" key="object" id="330408435">
-							<bool key="EncodedWithXMLCoder">YES</bool>
-						</object>
+						<reference key="object" ref="0"/>
 						<reference key="children" ref="904585544"/>
 						<nil key="parent"/>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-2</int>
 						<reference key="object" ref="815810918"/>
-						<reference key="parent" ref="330408435"/>
-						<string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">File's Owner</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-1</int>
 						<reference key="object" ref="941939442"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">First Responder</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-3</int>
 						<reference key="object" ref="951368722"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">Application</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2254,7 +2205,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 							<reference ref="868031522"/>
 							<reference ref="551174276"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">MainMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2499,7 +2450,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 					<object class="IBObjectRecord">
 						<int key="objectID">196</int>
 						<reference key="object" ref="485884620"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">X11Controller</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2509,7 +2460,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="941366957"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">PrefsPanel</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2773,7 +2724,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="85544634"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">EditPrograms</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2796,7 +2747,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 							<reference ref="318286212"/>
 							<reference ref="511651072"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">DockMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -3348,10 +3299,8 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 			</object>
 			<object class="NSMutableDictionary" key="flattenedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSMutableArray" key="dict.sortedKeys">
+				<object class="NSArray" key="dict.sortedKeys">
 					<bool key="EncodedWithXMLCoder">YES</bool>
-					<string>-1.IBPluginDependency</string>
-					<string>-2.IBPluginDependency</string>
 					<string>-3.IBPluginDependency</string>
 					<string>-3.ImportedFromIB2</string>
 					<string>100292.IBPluginDependency</string>
@@ -3407,7 +3356,6 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 					<string>169.editorWindowContentRectSynchronizationRect</string>
 					<string>19.IBPluginDependency</string>
 					<string>19.ImportedFromIB2</string>
-					<string>196.IBPluginDependency</string>
 					<string>196.ImportedFromIB2</string>
 					<string>200295.IBPluginDependency</string>
 					<string>200295.IBShouldRemoveOnLegacySave</string>
@@ -3422,6 +3370,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 					<string>24.ImportedFromIB2</string>
 					<string>24.editorWindowContentRectSynchronizationRect</string>
 					<string>244.IBEditorWindowLastContentRect</string>
+					<string>244.IBPluginDependency</string>
 					<string>244.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>244.IBWindowTemplateEditedContentRect</string>
 					<string>244.ImportedFromIB2</string>
@@ -3441,6 +3390,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 					<string>272.IBPluginDependency</string>
 					<string>272.ImportedFromIB2</string>
 					<string>285.IBEditorWindowLastContentRect</string>
+					<string>285.IBPluginDependency</string>
 					<string>285.IBViewEditorWindowController.showingBoundsRectangles</string>
 					<string>285.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>285.IBWindowTemplateEditedContentRect</string>
@@ -3642,13 +3592,13 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="1" id="9"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3667,275 +3617,272 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{168, 821}, {113, 23}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{202, 626}, {154, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
+					<string>{{371, 858}, {437, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>{{349, 858}, {315, 153}}</string>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{271, 666}, {301, 153}}</string>
 					<string>{{437, 548}, {604, 308}}</string>
-					<boolean value="NO" id="6"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="NO"/>
 					<string>{{437, 548}, {604, 308}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{184, 290}, {481, 345}}</string>
-					<integer value="0" id="8"/>
-					<reference ref="9"/>
+					<integer value="0"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{58, 803}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{100, 746}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{68, 585}, {504, 271}}</string>
-					<reference ref="9"/>
-					<reference ref="6"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
+					<boolean value="NO"/>
 					<string>{{68, 585}, {504, 271}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{433, 406}, {486, 327}}</string>
-					<reference ref="8"/>
-					<reference ref="9"/>
+					<integer value="0"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>{{145, 1011}, {336, 20}}</string>
+					<integer value="1"/>
+					<string>{{145, 1011}, {369, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{67, 819}, {336, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{528, 715}, {148, 83}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>{{20, 641}, {218, 203}}</string>
+					<integer value="1"/>
+					<string>{{157, 808}, {372, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{79, 616}, {218, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 				</object>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -3943,9 +3890,7 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 			<nil key="activeLocalization"/>
 			<object class="NSMutableDictionary" key="localizations">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -3983,6 +3928,15 @@ jtGH0LXQvdC+LCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC40Lcg0YPQtNCw0LvQtdC90L3Ri9GFINC/
 			</object>
 		</object>
 		<int key="IBDocument.localizationMode">0</int>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+			<integer value="1050" key="NS.object.0"/>
+		</object>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+			<integer value="3000" key="NS.object.0"/>
+		</object>
+		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
 		<string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
 		<int key="IBDocument.defaultPropertyAccessControl">3</int>
 	</data>
diff --git a/hw/xquartz/bundle/Resources/ru.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/ru.lproj/main.nib/keyedobjects.nib
index 3ead930..22f08fa 100644
Binary files a/hw/xquartz/bundle/Resources/ru.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/ru.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/sv.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/sv.lproj/main.nib/designable.nib
index 808d57c..695ad42 100644
--- a/hw/xquartz/bundle/Resources/sv.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/sv.lproj/main.nib/designable.nib
@@ -2,13 +2,13 @@
 <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">10A314</string>
-		<string key="IBDocument.InterfaceBuilderVersion">718</string>
-		<string key="IBDocument.AppKitVersion">1013</string>
-		<string key="IBDocument.HIToolboxVersion">415.00</string>
+		<string key="IBDocument.SystemVersion">10A354</string>
+		<string key="IBDocument.InterfaceBuilderVersion">728</string>
+		<string key="IBDocument.AppKitVersion">1019</string>
+		<string key="IBDocument.HIToolboxVersion">421.00</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
-			<string key="NS.object.0">718</string>
+			<string key="NS.object.0">728</string>
 		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -306,8 +306,8 @@
 								<object class="NSMenuItem" id="1036389925">
 									<reference key="NSMenu" ref="96874957"/>
 									<string key="NSTitle">Bläddra genom fönster</string>
-									<string key="NSKeyEquiv">`</string>
-									<int key="NSKeyEquivModMask">1048840</int>
+									<string key="NSKeyEquiv">&lt;</string>
+									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
@@ -315,8 +315,8 @@
 								<object class="NSMenuItem" id="369641893">
 									<reference key="NSMenu" ref="96874957"/>
 									<string key="NSTitle">Bläddra genom fönster baklänges</string>
-									<string key="NSKeyEquiv">~</string>
-									<int key="NSKeyEquivModMask">1179914</int>
+									<string key="NSKeyEquiv">&gt;</string>
+									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
 									<reference key="NSMixedImage" ref="351811234"/>
@@ -397,7 +397,7 @@
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="941366957">
 					<nil key="NSNextResponder"/>
@@ -474,7 +474,7 @@
 														<string key="NSColorName">controlColor</string>
 														<object class="NSColor" key="NSColor" id="832012125">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2ODY1AA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -1248,7 +1248,7 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSFrameAutosaveName">x11_prefs</string>
 			</object>
 			<object class="NSWindowTemplate" id="604417141">
@@ -1261,7 +1261,7 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="85544634">
 					<nil key="NSNextResponder"/>
@@ -1346,8 +1346,8 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 											<object class="NSMutableArray" key="NSTableColumns">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<object class="NSTableColumn" id="938444323">
-													<double key="NSWidth">122.73099999999999</double>
-													<double key="NSMinWidth">62.731000000000002</double>
+													<double key="NSWidth">122.73100280761719</double>
+													<double key="NSMinWidth">62.730998992919922</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
 														<int key="NSCellFlags">75628096</int>
@@ -1356,7 +1356,7 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor" id="113872566">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+															<bytes key="NSWhite">MC4zMzMzMzI5ODU2AA</bytes>
 														</object>
 														<object class="NSColor" key="NSTextColor" id="249576247">
 															<int key="NSColorSpace">6</int>
@@ -1493,7 +1493,7 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 									<reference key="NSSuperview" ref="1063387772"/>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">0.99492380000000002</double>
+									<double key="NSPercent">0.99492377042770386</double>
 								</object>
 								<object class="NSScroller" id="17278747">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1503,7 +1503,7 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 									<int key="NSsFlags">1</int>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">0.68852460000000004</double>
+									<double key="NSPercent">0.68852460384368896</double>
 								</object>
 								<object class="NSClipView" id="672307654">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1560,7 +1560,7 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSFrameAutosaveName">x11_apps</string>
 			</object>
 			<object class="NSMenu" id="294137138">
@@ -3332,7 +3332,6 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 					<string>100385.IBPluginDependency</string>
 					<string>100386.IBPluginDependency</string>
 					<string>100541.IBPluginDependency</string>
-					<string>100541.IBPropertyAccessControl</string>
 					<string>100543.IBPluginDependency</string>
 					<string>129.IBPluginDependency</string>
 					<string>129.ImportedFromIB2</string>
@@ -3349,7 +3348,6 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 					<string>144.IBPluginDependency</string>
 					<string>144.ImportedFromIB2</string>
 					<string>145.IBPluginDependency</string>
-					<string>145.IBPropertyAccessControl</string>
 					<string>145.ImportedFromIB2</string>
 					<string>149.IBPluginDependency</string>
 					<string>149.ImportedFromIB2</string>
@@ -3380,7 +3378,6 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 					<string>24.editorWindowContentRectSynchronizationRect</string>
 					<string>244.IBEditorWindowLastContentRect</string>
 					<string>244.IBPluginDependency</string>
-					<string>244.IBPropertyAccessControl</string>
 					<string>244.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>244.IBWindowTemplateEditedContentRect</string>
 					<string>244.ImportedFromIB2</string>
@@ -3390,7 +3387,6 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 					<string>244.windowTemplate.maxSize</string>
 					<string>244.windowTemplate.minSize</string>
 					<string>245.IBPluginDependency</string>
-					<string>245.IBPropertyAccessControl</string>
 					<string>245.ImportedFromIB2</string>
 					<string>269.IBPluginDependency</string>
 					<string>269.ImportedFromIB2</string>
@@ -3426,10 +3422,8 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 					<string>296.IBPluginDependency</string>
 					<string>296.ImportedFromIB2</string>
 					<string>297.IBPluginDependency</string>
-					<string>297.IBPropertyAccessControl</string>
 					<string>297.ImportedFromIB2</string>
 					<string>298.IBPluginDependency</string>
-					<string>298.IBPropertyAccessControl</string>
 					<string>298.ImportedFromIB2</string>
 					<string>300295.IBPluginDependency</string>
 					<string>300295.IBShouldRemoveOnLegacySave</string>
@@ -3438,143 +3432,99 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 					<string>300337.IBPluginDependency</string>
 					<string>300337.ImportedFromIB2</string>
 					<string>300338.IBPluginDependency</string>
-					<string>300338.IBPropertyAccessControl</string>
 					<string>300338.ImportedFromIB2</string>
 					<string>300358.IBPluginDependency</string>
-					<string>300358.IBPropertyAccessControl</string>
 					<string>300358.ImportedFromIB2</string>
 					<string>300359.IBPluginDependency</string>
-					<string>300359.IBPropertyAccessControl</string>
 					<string>300359.ImportedFromIB2</string>
 					<string>300360.IBPluginDependency</string>
 					<string>300361.IBPluginDependency</string>
 					<string>300362.IBPluginDependency</string>
-					<string>300362.IBPropertyAccessControl</string>
 					<string>300362.ImportedFromIB2</string>
 					<string>300363.IBPluginDependency</string>
 					<string>300364.IBPluginDependency</string>
-					<string>300364.IBPropertyAccessControl</string>
 					<string>300364.ImportedFromIB2</string>
 					<string>300365.IBPluginDependency</string>
 					<string>300368.IBPluginDependency</string>
-					<string>300368.IBPropertyAccessControl</string>
 					<string>300368.ImportedFromIB2</string>
 					<string>300369.IBPluginDependency</string>
 					<string>300370.IBPluginDependency</string>
-					<string>300370.IBPropertyAccessControl</string>
 					<string>300370.ImportedFromIB2</string>
 					<string>300371.IBPluginDependency</string>
 					<string>300421.IBPluginDependency</string>
-					<string>300421.IBPropertyAccessControl</string>
 					<string>300421.ImportedFromIB2</string>
 					<string>300422.IBPluginDependency</string>
-					<string>300422.IBPropertyAccessControl</string>
 					<string>300422.ImportedFromIB2</string>
 					<string>300423.IBPluginDependency</string>
-					<string>300423.IBPropertyAccessControl</string>
 					<string>300423.ImportedFromIB2</string>
 					<string>300424.IBPluginDependency</string>
-					<string>300424.IBPropertyAccessControl</string>
 					<string>300424.ImportedFromIB2</string>
 					<string>300440.IBPluginDependency</string>
-					<string>300440.IBPropertyAccessControl</string>
 					<string>300441.IBPluginDependency</string>
-					<string>300441.IBPropertyAccessControl</string>
 					<string>300447.IBPluginDependency</string>
-					<string>300447.IBPropertyAccessControl</string>
 					<string>300447.ImportedFromIB2</string>
 					<string>300450.IBPluginDependency</string>
-					<string>300450.IBPropertyAccessControl</string>
 					<string>300451.IBPluginDependency</string>
-					<string>300451.IBPropertyAccessControl</string>
 					<string>300451.ImportedFromIB2</string>
 					<string>300452.IBPluginDependency</string>
-					<string>300452.IBPropertyAccessControl</string>
 					<string>300453.IBPluginDependency</string>
-					<string>300453.IBPropertyAccessControl</string>
 					<string>300453.ImportedFromIB2</string>
 					<string>300454.IBPluginDependency</string>
-					<string>300454.IBPropertyAccessControl</string>
 					<string>300455.IBPluginDependency</string>
-					<string>300455.IBPropertyAccessControl</string>
 					<string>300455.ImportedFromIB2</string>
 					<string>300456.IBPluginDependency</string>
-					<string>300456.IBPropertyAccessControl</string>
 					<string>300457.IBPluginDependency</string>
-					<string>300457.IBPropertyAccessControl</string>
 					<string>300457.ImportedFromIB2</string>
 					<string>300458.IBPluginDependency</string>
-					<string>300458.IBPropertyAccessControl</string>
 					<string>300459.IBPluginDependency</string>
-					<string>300459.IBPropertyAccessControl</string>
 					<string>300459.ImportedFromIB2</string>
 					<string>300460.IBPluginDependency</string>
-					<string>300460.IBPropertyAccessControl</string>
 					<string>300472.IBPluginDependency</string>
-					<string>300472.IBPropertyAccessControl</string>
 					<string>300472.ImportedFromIB2</string>
 					<string>300473.IBPluginDependency</string>
-					<string>300473.IBPropertyAccessControl</string>
 					<string>305.IBPluginDependency</string>
 					<string>305.ImportedFromIB2</string>
 					<string>310.IBPluginDependency</string>
 					<string>310.ImportedFromIB2</string>
 					<string>348.IBPluginDependency</string>
-					<string>348.IBPropertyAccessControl</string>
 					<string>348.ImportedFromIB2</string>
 					<string>349.IBPluginDependency</string>
 					<string>349.ImportedFromIB2</string>
 					<string>350.IBPluginDependency</string>
-					<string>350.IBPropertyAccessControl</string>
 					<string>350.ImportedFromIB2</string>
 					<string>351.IBPluginDependency</string>
-					<string>351.IBPropertyAccessControl</string>
 					<string>351.ImportedFromIB2</string>
 					<string>352.IBPluginDependency</string>
 					<string>352.ImportedFromIB2</string>
 					<string>353.IBPluginDependency</string>
 					<string>353.ImportedFromIB2</string>
 					<string>354.IBPluginDependency</string>
-					<string>354.IBPropertyAccessControl</string>
 					<string>354.ImportedFromIB2</string>
 					<string>363.IBPluginDependency</string>
-					<string>363.IBPropertyAccessControl</string>
 					<string>363.ImportedFromIB2</string>
 					<string>364.IBPluginDependency</string>
-					<string>364.IBPropertyAccessControl</string>
 					<string>364.ImportedFromIB2</string>
 					<string>365.IBPluginDependency</string>
-					<string>365.IBPropertyAccessControl</string>
 					<string>365.ImportedFromIB2</string>
 					<string>368.IBPluginDependency</string>
-					<string>368.IBPropertyAccessControl</string>
 					<string>368.ImportedFromIB2</string>
 					<string>369.IBPluginDependency</string>
-					<string>369.IBPropertyAccessControl</string>
 					<string>369.ImportedFromIB2</string>
 					<string>370.IBPluginDependency</string>
-					<string>370.IBPropertyAccessControl</string>
 					<string>370.ImportedFromIB2</string>
 					<string>371.IBPluginDependency</string>
-					<string>371.IBPropertyAccessControl</string>
 					<string>371.ImportedFromIB2</string>
 					<string>372.IBPluginDependency</string>
-					<string>372.IBPropertyAccessControl</string>
 					<string>372.ImportedFromIB2</string>
 					<string>374.IBPluginDependency</string>
-					<string>374.IBPropertyAccessControl</string>
 					<string>374.ImportedFromIB2</string>
 					<string>375.IBPluginDependency</string>
-					<string>375.IBPropertyAccessControl</string>
 					<string>375.ImportedFromIB2</string>
 					<string>376.IBPluginDependency</string>
-					<string>376.IBPropertyAccessControl</string>
 					<string>376.ImportedFromIB2</string>
 					<string>377.IBPluginDependency</string>
-					<string>377.IBPropertyAccessControl</string>
 					<string>377.ImportedFromIB2</string>
 					<string>379.IBPluginDependency</string>
-					<string>379.IBPropertyAccessControl</string>
 					<string>379.ImportedFromIB2</string>
 					<string>380.IBEditorWindowLastContentRect</string>
 					<string>380.IBPluginDependency</string>
@@ -3582,17 +3532,14 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 					<string>381.IBPluginDependency</string>
 					<string>381.ImportedFromIB2</string>
 					<string>382.IBPluginDependency</string>
-					<string>382.IBPropertyAccessControl</string>
 					<string>382.ImportedFromIB2</string>
 					<string>383.IBPluginDependency</string>
 					<string>383.ImportedFromIB2</string>
 					<string>384.IBPluginDependency</string>
 					<string>384.ImportedFromIB2</string>
 					<string>385.IBPluginDependency</string>
-					<string>385.IBPropertyAccessControl</string>
 					<string>385.ImportedFromIB2</string>
 					<string>386.IBPluginDependency</string>
-					<string>386.IBPropertyAccessControl</string>
 					<string>386.ImportedFromIB2</string>
 					<string>419.IBPluginDependency</string>
 					<string>419.ImportedFromIB2</string>
@@ -3626,10 +3573,8 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 					<string>538.IBPluginDependency</string>
 					<string>538.ImportedFromIB2</string>
 					<string>541.IBPluginDependency</string>
-					<string>541.IBPropertyAccessControl</string>
 					<string>541.ImportedFromIB2</string>
 					<string>543.IBPluginDependency</string>
-					<string>543.IBPropertyAccessControl</string>
 					<string>543.ImportedFromIB2</string>
 					<string>544.IBPluginDependency</string>
 					<string>544.ImportedFromIB2</string>
@@ -3678,7 +3623,6 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
@@ -3695,7 +3639,6 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
@@ -3720,13 +3663,12 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
-					<string>{{349, 858}, {315, 153}}</string>
+					<string>{{357, 683}, {307, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>{{271, 666}, {301, 153}}</string>
 					<string>{{444, 200}, {484, 308}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<boolean value="NO"/>
 					<string>{{444, 200}, {484, 308}}</string>
 					<integer value="1"/>
@@ -3736,7 +3678,6 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
@@ -3772,10 +3713,8 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
@@ -3784,143 +3723,99 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>{{530, 368}, {171, 83}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3928,17 +3823,14 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
@@ -3972,10 +3864,8 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3"/>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
@@ -3983,7 +3873,7 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
-					<string>{{20, 641}, {218, 203}}</string>
+					<string>{{157, 633}, {230, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>{{79, 616}, {218, 203}}</string>
@@ -4057,6 +3947,6 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 		</object>
 		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
 		<string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
-		<int key="IBDocument.defaultPropertyAccessControl">1</int>
+		<int key="IBDocument.defaultPropertyAccessControl">3</int>
 	</data>
 </archive>
diff --git a/hw/xquartz/bundle/Resources/sv.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/sv.lproj/main.nib/keyedobjects.nib
index ae0faf9..7ecbca0 100644
Binary files a/hw/xquartz/bundle/Resources/sv.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/sv.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/zh_CN.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/zh_CN.lproj/main.nib/designable.nib
index db95a4e..4a1f083 100644
--- a/hw/xquartz/bundle/Resources/zh_CN.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/zh_CN.lproj/main.nib/designable.nib
@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.050000190734863">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">10A222</string>
-		<string key="IBDocument.InterfaceBuilderVersion">708</string>
-		<string key="IBDocument.AppKitVersion">994.5</string>
-		<string key="IBDocument.HIToolboxVersion">404.00</string>
+		<string key="IBDocument.SystemVersion">10A314</string>
+		<string key="IBDocument.InterfaceBuilderVersion">718</string>
+		<string key="IBDocument.AppKitVersion">1013</string>
+		<string key="IBDocument.HIToolboxVersion">415.00</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
-			<string key="NS.object.0">708</string>
+			<string key="NS.object.0">718</string>
 		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -19,7 +19,7 @@
 		</object>
 		<object class="NSMutableDictionary" key="IBDocument.Metadata">
 			<bool key="EncodedWithXMLCoder">YES</bool>
-			<object class="NSArray" key="dict.sortedKeys">
+			<object class="NSArray" key="dict.sortedKeys" id="0">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 			</object>
 			<object class="NSMutableArray" key="dict.values">
@@ -64,7 +64,7 @@
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="139290918">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">5YWz5LqOIFgxMQ</string>
+									<string key="NSTitle">关于 X11</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="531645050"/>
@@ -72,7 +72,7 @@
 								</object>
 								<object class="NSMenuItem" id="386173216">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">5YGP5aW96K6+572u4oCmA</string>
+									<string key="NSTitle">偏好设置…</string>
 									<string key="NSKeyEquiv">,</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -92,7 +92,7 @@
 								</object>
 								<object class="NSMenuItem" id="32285361">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">5pyN5YqhA</string>
+									<string key="NSTitle">服务</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -100,7 +100,7 @@
 									<reference key="NSMixedImage" ref="351811234"/>
 									<string key="NSAction">submenuAction:</string>
 									<object class="NSMenu" key="NSSubmenu" id="821388474">
-										<string type="base64-UTF8" key="NSTitle">5pyN5YqhA</string>
+										<string key="NSTitle">服务</string>
 										<object class="NSMutableArray" key="NSMenuItems">
 											<bool key="EncodedWithXMLCoder">YES</bool>
 										</object>
@@ -120,7 +120,7 @@
 								</object>
 								<object class="NSMenuItem" id="6876565">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">5byA5YWz5YWo5bGP5bmVA</string>
+									<string key="NSTitle">开关全屏幕</string>
 									<string key="NSKeyEquiv">a</string>
 									<int key="NSKeyEquivModMask">1572864</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -140,7 +140,7 @@
 								</object>
 								<object class="NSMenuItem" id="301008465">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">6ZqQ6JePIFgxMQ</string>
+									<string key="NSTitle">隐藏 X11</string>
 									<string key="NSKeyEquiv">h</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -150,7 +150,7 @@
 								</object>
 								<object class="NSMenuItem" id="206802571">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">6ZqQ6JeP5YW25LuWA</string>
+									<string key="NSTitle">隐藏其他</string>
 									<string key="NSKeyEquiv">h</string>
 									<int key="NSKeyEquivModMask">1572864</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -159,7 +159,7 @@
 								</object>
 								<object class="NSMenuItem" id="1023546148">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">5YWo6YOo5pi+56S6A</string>
+									<string key="NSTitle">全部显示</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -180,7 +180,7 @@
 								</object>
 								<object class="NSMenuItem" id="274138642">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">6YCA5Ye6IFgxMQ</string>
+									<string key="NSTitle">退出 X11</string>
 									<string key="NSKeyEquiv">q</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -193,7 +193,7 @@
 					</object>
 					<object class="NSMenuItem" id="868031522">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle">5bqU55So56iL5bqPA</string>
+						<string key="NSTitle">应用程序</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -201,7 +201,7 @@
 						<reference key="NSMixedImage" ref="351811234"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="981161348">
-							<string type="base64-UTF8" key="NSTitle">5bqU55So56iL5bqPA</string>
+							<string key="NSTitle">应用程序</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="390088328">
@@ -217,7 +217,7 @@
 								</object>
 								<object class="NSMenuItem" id="1065386165">
 									<reference key="NSMenu" ref="981161348"/>
-									<string type="base64-UTF8" key="NSTitle">6Ieq5a6a4oCmA</string>
+									<string key="NSTitle">自定…</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -229,7 +229,7 @@
 					</object>
 					<object class="NSMenuItem" id="200491363">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle">57yW6L6RA</string>
+						<string key="NSTitle">编辑</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -237,12 +237,12 @@
 						<reference key="NSMixedImage" ref="351811234"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="526778998">
-							<string type="base64-UTF8" key="NSTitle">57yW6L6RA</string>
+							<string key="NSTitle">编辑</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="185296989">
 									<reference key="NSMenu" ref="526778998"/>
-									<string type="base64-UTF8" key="NSTitle">5ou36LSdA</string>
+									<string key="NSTitle">拷贝</string>
 									<string key="NSKeyEquiv">c</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -254,7 +254,7 @@
 					</object>
 					<object class="NSMenuItem" id="931553638">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle">56qX5Y+jA</string>
+						<string key="NSTitle">窗口</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -262,12 +262,12 @@
 						<reference key="NSMixedImage" ref="351811234"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="96874957">
-							<string type="base64-UTF8" key="NSTitle">56qX5Y+jA</string>
+							<string key="NSTitle">窗口</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="984461797">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">5YWz6ZetA</string>
+									<string key="NSTitle">关闭</string>
 									<string key="NSKeyEquiv">w</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -276,7 +276,7 @@
 								</object>
 								<object class="NSMenuItem" id="677652931">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">5pyA5bCP5YyWA</string>
+									<string key="NSTitle">最小化</string>
 									<string key="NSKeyEquiv">m</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -285,7 +285,7 @@
 								</object>
 								<object class="NSMenuItem" id="1066447520">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">57yp5pS+A</string>
+									<string key="NSTitle">缩放</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -305,7 +305,7 @@
 								</object>
 								<object class="NSMenuItem" id="1036389925">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">5b6q546v5pi+56S656qX5Y+jA</string>
+									<string key="NSTitle">循环显示窗口</string>
 									<string key="NSKeyEquiv">`</string>
 									<int key="NSKeyEquivModMask">1048840</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -314,7 +314,7 @@
 								</object>
 								<object class="NSMenuItem" id="369641893">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">5b6q546v5pi+56S656qX5Y+jA</string>
+									<string key="NSTitle">循环显示窗口</string>
 									<string key="NSKeyEquiv">~</string>
 									<int key="NSKeyEquivModMask">1179914</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -334,7 +334,7 @@
 								</object>
 								<object class="NSMenuItem" id="276216762">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">5YmN572u5YWo6YOo56qX5Y+jA</string>
+									<string key="NSTitle">前置全部窗口</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -358,7 +358,7 @@
 					</object>
 					<object class="NSMenuItem" id="551174276">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle">5biu5YqpA</string>
+						<string key="NSTitle">帮助</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -366,12 +366,12 @@
 						<reference key="NSMixedImage" ref="351811234"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="511848303">
-							<string type="base64-UTF8" key="NSTitle">5biu5YqpA</string>
+							<string key="NSTitle">帮助</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="504984881">
 									<reference key="NSMenu" ref="511848303"/>
-									<string type="base64-UTF8" key="NSTitle">WDExIOW4ruWKqQ</string>
+									<string key="NSTitle">X11 帮助</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -392,15 +392,15 @@
 				<int key="NSWindowBacking">2</int>
 				<string key="NSWindowRect">{{240, 335}, {484, 308}}</string>
 				<int key="NSWTFlags">1350041600</int>
-				<string type="base64-UTF8" key="NSWindowTitle">WDExIOWBj+Wlveiuvue9rg</string>
+				<string key="NSWindowTitle">X11 偏好设置</string>
 				<string key="NSWindowClass">NSPanel</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="941366957">
-					<reference key="NSNextResponder"/>
+					<nil key="NSNextResponder"/>
 					<int key="NSvFlags">256</int>
 					<object class="NSMutableArray" key="NSSubviews">
 						<bool key="EncodedWithXMLCoder">YES</bool>
@@ -409,7 +409,6 @@
 							<int key="NSvFlags">256</int>
 							<string key="NSFrame">{{13, 10}, {458, 292}}</string>
 							<reference key="NSSuperview" ref="941366957"/>
-							<reference key="NSWindow"/>
 							<object class="NSMutableArray" key="NSTabViewItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSTabViewItem" id="287591690">
@@ -426,12 +425,11 @@
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{18, 210}, {402, 18}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
-												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="990762273">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">5qih5ouf5LiJ5oyJ6ZSu6byg5qCHA</string>
+													<string key="NSContents">模拟三按键鼠标</string>
 													<object class="NSFont" key="NSSupport" id="463863101">
 														<string key="NSName">LucidaGrande</string>
 														<double key="NSSize">13</double>
@@ -458,13 +456,11 @@
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{36, 45}, {385, 31}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
-												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="391919450">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">5ZCv55So5pe277yM6I+c5Y2V5qCP562J5pWI6ZSu5Y+v6IO95Lya5bmy5omw5L2/55So5YWD5L+u6aWw
-6ZSu55qEIFgxMSDlupTnlKjnqIvluo/jgII</string>
+													<string key="NSContents">启用时,菜单栏等效键可能会干扰使用元修饰键的 X11 应用程序。</string>
 													<object class="NSFont" key="NSSupport" id="26">
 														<string key="NSName">LucidaGrande</string>
 														<double key="NSSize">11</double>
@@ -478,7 +474,7 @@
 														<string key="NSColorName">controlColor</string>
 														<object class="NSColor" key="NSColor" id="379024898">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -497,7 +493,6 @@
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{36, 162}, {385, 42}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
-												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="649334366">
 													<int key="NSCellFlags">67239424</int>
@@ -516,12 +511,11 @@ moTpvKDmoIfmjInplK7jgIIKA</string>
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{18, 82}, {402, 18}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
-												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="940564599">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">5ZyoIFgxMSDnjq/looPkuIvlkK/nlKjnrYnmlYjplK4</string>
+													<string key="NSContents">在 X11 环境下启用等效键</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="842100515"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -539,13 +533,11 @@ moTpvKDmoIfmjInplK7jgIIKA</string>
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{36, 126}, {385, 14}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
-												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="666057093">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">5YWB6K646L+b6KGM6L6T5YWl6I+c5Y2V5pu05pS55Lul6KaG55uW5b2T5YmN55qEIFgxMSDplK7nm5jm
-mKDlsITjgII</string>
+													<string key="NSContents">允许进行输入菜单更改以覆盖当前的 X11 键盘映射。</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="31160162"/>
@@ -558,12 +550,11 @@ mKDlsITjgII</string>
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{18, 146}, {402, 18}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
-												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="967619578">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">5L6d54Wn57O757uf6ZSu55uY5biD5bGAA</string>
+													<string key="NSContents">依照系统键盘布局</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="179949713"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -579,9 +570,8 @@ mKDlsITjgII</string>
 										</object>
 										<string key="NSFrame">{{10, 33}, {438, 246}}</string>
 										<reference key="NSSuperview" ref="448510093"/>
-										<reference key="NSWindow"/>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">6L6T5YWlA</string>
+									<string key="NSLabel">输入</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -603,7 +593,7 @@ mKDlsITjgII</string>
 												<object class="NSButtonCell" key="NSCell" id="1016069354">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">5L2/55So57O757uf6K2m5oql5pWI5p6cA</string>
+													<string key="NSContents">使用系统警报效果</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="418227126"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -625,8 +615,7 @@ mKDlsITjgII</string>
 												<object class="NSTextFieldCell" key="NSCell" id="624655599">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">WDExIOitpuesm+WwhuS9v+eUqOagh+WHhueahOezu+e7n+itpuaKpe+8jOWFt+S9k+WmguKAnOWjsOmf
-s+aViOaenOKAneezu+e7n+WBj+Wlveiuvue9rumdouadv+S4reaJgOWumuS5ieOAgg</string>
+													<string key="NSContents">X11 警笛将使用标准的系统警报,具体如“声音效果”系统偏好设置面板中所定义。</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="1039016593"/>
@@ -660,7 +649,7 @@ s+aViOaenOKAneezu+e7n+WBj+Wlveiuvue9rumdouadv+S4reaJgOWumuS5ieOAgg</string>
 													<int key="NSPeriodicInterval">75</int>
 													<object class="NSMenuItem" key="NSMenuItem" id="616492372">
 														<reference key="NSMenu" ref="341113515"/>
-														<string type="base64-UTF8" key="NSTitle">5LuO5pi+56S65ZmoA</string>
+														<string key="NSTitle">从显示器</string>
 														<string key="NSKeyEquiv"/>
 														<int key="NSKeyEquivModMask">1048576</int>
 														<int key="NSMnemonicLoc">2147483647</int>
@@ -681,7 +670,7 @@ s+aViOaenOKAneezu+e7n+WBj+Wlveiuvue9rumdouadv+S4reaJgOWumuS5ieOAgg</string>
 															<reference ref="616492372"/>
 															<object class="NSMenuItem" id="759499526">
 																<reference key="NSMenu" ref="341113515"/>
-																<string type="base64-UTF8" key="NSTitle">MjU2IOenjeminOiJsg</string>
+																<string key="NSTitle">256 种颜色</string>
 																<string key="NSKeyEquiv"/>
 																<int key="NSKeyEquivModMask">1048576</int>
 																<int key="NSMnemonicLoc">2147483647</int>
@@ -693,7 +682,7 @@ s+aViOaenOKAneezu+e7n+WBj+Wlveiuvue9rumdouadv+S4reaJgOWumuS5ieOAgg</string>
 															</object>
 															<object class="NSMenuItem" id="543935434">
 																<reference key="NSMenu" ref="341113515"/>
-																<string type="base64-UTF8" key="NSTitle">5LiK5LiH56eNA</string>
+																<string key="NSTitle">上万种</string>
 																<string key="NSKeyEquiv"/>
 																<int key="NSKeyEquivModMask">1048576</int>
 																<int key="NSMnemonicLoc">2147483647</int>
@@ -705,7 +694,7 @@ s+aViOaenOKAneezu+e7n+WBj+Wlveiuvue9rumdouadv+S4reaJgOWumuS5ieOAgg</string>
 															</object>
 															<object class="NSMenuItem" id="836673018">
 																<reference key="NSMenu" ref="341113515"/>
-																<string type="base64-UTF8" key="NSTitle">5LiK5Y2D5LiH56eNA</string>
+																<string key="NSTitle">上千万种</string>
 																<string key="NSKeyEquiv"/>
 																<int key="NSKeyEquivModMask">1048576</int>
 																<int key="NSMnemonicLoc">2147483647</int>
@@ -750,7 +739,7 @@ s+aViOaenOKAneezu+e7n+WBj+Wlveiuvue9rumdouadv+S4reaJgOWumuS5ieOAgg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="311969422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">5q2k6YCJ6aG55Lya5Zyo5YaN5qyh5byA5ZCvIFgxMSDml7bnlJ/mlYjjgII</string>
+													<string key="NSContents">此选项会在再次开启 X11 时生效。</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="86150604"/>
@@ -767,7 +756,7 @@ s+aViOaenOKAneezu+e7n+WBj+Wlveiuvue9rumdouadv+S4reaJgOWumuS5ieOAgg</string>
 												<object class="NSButtonCell" key="NSCell" id="631531164">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">5YWo5bGP5bmV5qih5byPA</string>
+													<string key="NSContents">全屏幕模式</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477203622"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -789,7 +778,7 @@ s+aViOaenOKAneezu+e7n+WBj+Wlveiuvue9rumdouadv+S4reaJgOWumuS5ieOAgg</string>
 												<object class="NSButtonCell" key="NSCell" id="917248662">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">5Lul5YWo5bGP5bmV5qih5byP6Ieq5Yqo5pi+56S66I+c5Y2V5qCPA</string>
+													<string key="NSContents">以全屏幕模式自动显示菜单栏</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="57246850"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -811,8 +800,7 @@ s+aViOaenOKAneezu+e7n+WBj+Wlveiuvue9rumdouadv+S4reaJgOWumuS5ieOAgg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="761107402">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">5ZCv55SoIFgxMSDmoLnnqpflj6PjgILkvb/nlKggQ29tbWFuZC1PcHRpb24tQSDlh7vplK7mnaXov5vl
-haXlkoznprvlvIDlhajlsY/luZXmqKHlvI/jgII</string>
+													<string key="NSContents">启用 X11 根窗口。使用 Command-Option-A 击键来进入和离开全屏幕模式。</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="298603383"/>
@@ -823,7 +811,7 @@ haXlkoznprvlvIDlhajlsY/luZXmqKHlvI/jgII</string>
 										</object>
 										<string key="NSFrame">{{10, 33}, {438, 246}}</string>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">6L6T5Ye6A</string>
+									<string key="NSLabel">输出</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -845,7 +833,7 @@ haXlkoznprvlvIDlhajlsY/luZXmqKHlvI/jgII</string>
 												<object class="NSButtonCell" key="NSCell" id="718083688">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">5ZCv55So5ZCM5q2lA</string>
+													<string key="NSContents">启用同步</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="878106058"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -867,8 +855,7 @@ haXlkoznprvlvIDlhajlsY/luZXmqKHlvI/jgII</string>
 												<object class="NSTextFieldCell" key="NSCell" id="572508492">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">5ZCv55So4oCc5ou36LSd4oCd6I+c5Y2V6aG55bm25YWB6K64IE9TWOKAnOeymOi0tOadv+KAneS4jiBY
-MTEgQ0xJUEJPQVJEIOWSjCBQUklNQVJZIOe8k+WGsuWMuuS5i+mXtOWQjOatpeOAgg</string>
+													<string key="NSContents">启用“拷贝”菜单项并允许 OSX“粘贴板”与 X11 CLIPBOARD 和 PRIMARY 缓冲区之间同步。</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="386152084"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -884,7 +871,7 @@ MTEgQ0xJUEJPQVJEIOWSjCBQUklNQVJZIOe8k+WGsuWMuuS5i+mXtOWQjOatpeOAgg</string>
 												<object class="NSButtonCell" key="NSCell" id="501304422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">4oCc57KY6LS05p2/4oCd5Y+Y5YyW5pe25pu05pawIENMSVBCT0FSROOAgg</string>
+													<string key="NSContents">“粘贴板”变化时更新 CLIPBOARD。</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477050998"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -906,7 +893,7 @@ MTEgQ0xJUEJPQVJEIOWSjCBQUklNQVJZIOe8k+WGsuWMuuS5i+mXtOWQjOatpeOAgg</string>
 												<object class="NSButtonCell" key="NSCell" id="510771323">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">4oCc57KY6LS05p2/4oCd5Y+Y5YyW5pe25pu05pawIFBSSU1BUlnvvIjkuK3plK7ngrnmjInvvInjgII</string>
+													<string key="NSContents">“粘贴板”变化时更新 PRIMARY(中键点按)。</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="765780304"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -928,7 +915,7 @@ MTEgQ0xJUEJPQVJEIOWSjCBQUklNQVJZIOe8k+WGsuWMuuS5i+mXtOWQjOatpeOAgg</string>
 												<object class="NSButtonCell" key="NSCell" id="897099877">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">6YCJ5a6a5paw5paH5pys5pe256uL5Y2z5pu05paw4oCc57KY6LS05p2/4oCd44CCA</string>
+													<string key="NSContents">选定新文本时立即更新“粘贴板”。</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="1002778833"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -950,7 +937,7 @@ MTEgQ0xJUEJPQVJEIOWSjCBQUklNQVJZIOe8k+WGsuWMuuS5i+mXtOWQjOatpeOAgg</string>
 												<object class="NSButtonCell" key="NSCell" id="619977658">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">Q0xJUEJPQVJEIOWPmOWMluaXtuabtOaWsOKAnOeymOi0tOadv+KAneOAgg</string>
+													<string key="NSContents">CLIPBOARD 变化时更新“粘贴板”。</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="487809555"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -972,8 +959,7 @@ MTEgQ0xJUEJPQVJEIOWSjCBQUklNQVJZIOe8k+WGsuWMuuS5i+mXtOWQjOatpeOAgg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="461823902">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">5aaC5p6c5oKo5oOz6KaB5L2/55SoIHhjbGlwYm9hcmTjgIFrbGlwcGVyIOaIluWFtuS7luS7u+S9lSBY
-MTEg5aS557q45p2/566h55CG56iL5bqP77yM6K+35YGc55So5q2k6YCJ6aG544CCA</string>
+													<string key="NSContents">如果您想要使用 xclipboard、klipper 或其他任何 X11 夹纸板管理程序,请停用此选项。</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="620944856"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -989,8 +975,7 @@ MTEg5aS557q45p2/566h55CG56iL5bqP77yM6K+35YGc55So5q2k6YCJ6aG544CCA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="994587858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">55Sx5LqOIFgxMSDljY/orq7kuK3nmoTpmZDliLbvvIzmraTpgInpobnlnKjmn5DkupvlupTnlKjnqIvl
-uo/kuK3lj6/og73ml6Dms5Xlt6XkvZzjgII</string>
+													<string key="NSContents">由于 X11 协议中的限制,此选项在某些应用程序中可能无法工作。</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="522511724"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1000,7 +985,7 @@ uo/kuK3lj6/og73ml6Dms5Xlt6XkvZzjgII</string>
 										</object>
 										<string key="NSFrame">{{10, 33}, {438, 246}}</string>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">57KY6LS05p2/A</string>
+									<string key="NSLabel">粘贴板</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -1022,7 +1007,7 @@ uo/kuK3lj6/og73ml6Dms5Xlt6XkvZzjgII</string>
 												<object class="NSButtonCell" key="NSCell" id="259618205">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">54K55oyJ5ZCE5Liq5LiN5rS76LeD56qX5Y+jA</string>
+													<string key="NSContents">点按各个不活跃窗口</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="657659108"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1044,8 +1029,7 @@ uo/kuK3lj6/og73ml6Dms5Xlt6XkvZzjgII</string>
 												<object class="NSTextFieldCell" key="NSCell" id="399127858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">5ZCv55So5pe277yM54K55oyJ5LiN5rS76LeD56qX5Y+j5Lya5r+A5rS756qX5Y+j77yM6Zmk5q2k5Lul
-5aSW77yM6L+Y5bCG5a+86Ie06byg5qCH54K55oyJ5Lyg6YCS5Yiw6K+l56qX5Y+j44CCA</string>
+													<string key="NSContents">启用时,点按不活跃窗口会激活窗口,除此以外,还将导致鼠标点按传递到该窗口。</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="290578835"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1061,7 +1045,7 @@ uo/kuK3lj6/og73ml6Dms5Xlt6XkvZzjgII</string>
 												<object class="NSButtonCell" key="NSCell" id="959555182">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">54Sm54K56Lef6ZqP6byg5qCHA</string>
+													<string key="NSContents">焦点跟随鼠标</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="992839333"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1083,8 +1067,7 @@ uo/kuK3lj6/og73ml6Dms5Xlt6XkvZzjgII</string>
 												<object class="NSTextFieldCell" key="NSCell" id="183409141">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">WDExIOeql+WPo+eEpueCuei3n+maj+WFieagh+OAgui/meS8muS6p+eUn+S4gOS6m+S4jeWlveeahOaV
-iOaenOOAgg</string>
+													<string key="NSContents">X11 窗口焦点跟随光标。这会产生一些不好的效果。</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="138261120"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1100,7 +1083,7 @@ iOaenOOAgg</string>
 												<object class="NSButtonCell" key="NSCell" id="556463187">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">6IGa54Sm5paw56qX5Y+jA</string>
+													<string key="NSContents">聚焦新窗口</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="128352289"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1122,9 +1105,7 @@ iOaenOOAgg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="989804990">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">5ZCv55So5pe277yM5Yib5bu65pawIFgxMSDnqpflj6PlsIblr7zoh7QgWDExLmFwcCDnp7vliLDmnIDl
-iY3pnaLvvIjogIzkuI3mmK8gRmluZGVyLmFwcOOAgee7iOerry5hcHAg562J5bqU55So56iL5bqP56e7
-5Yiw5pyA5YmN6Z2i77yJ44CCA</string>
+													<string key="NSContents">启用时,创建新 X11 窗口将导致 X11.app 移到最前面(而不是 Finder.app、终端.app 等应用程序移到最前面)。</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="57161931"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1134,7 +1115,7 @@ iY3pnaLvvIjogIzkuI3mmK8gRmluZGVyLmFwcOOAgee7iOerry5hcHAg562J5bqU55So56iL5bqP56e7
 										</object>
 										<string key="NSFrame">{{10, 33}, {438, 246}}</string>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">56qX5Y+jA</string>
+									<string key="NSLabel">窗口</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -1153,7 +1134,7 @@ iY3pnaLvvIjogIzkuI3mmK8gRmluZGVyLmFwcOOAgee7iOerry5hcHAg562J5bqU55So56iL5bqP56e7
 												<object class="NSButtonCell" key="NSCell" id="189594322">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">6Ym05a6a6L+e5o6lA</string>
+													<string key="NSContents">鉴定连接</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="989050925"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1175,7 +1156,7 @@ iY3pnaLvvIjogIzkuI3mmK8gRmluZGVyLmFwcOOAgee7iOerry5hcHAg562J5bqU55So56iL5bqP56e7
 												<object class="NSButtonCell" key="NSCell" id="489340979">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">5YWB6K645LuO572R57uc5a6i5oi356uv6L+e5o6lA</string>
+													<string key="NSContents">允许从网络客户端连接</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="700826966"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1197,9 +1178,7 @@ iY3pnaLvvIjogIzkuI3mmK8gRmluZGVyLmFwcOOAgee7iOerry5hcHAg562J5bqU55So56iL5bqP56e7
 												<object class="NSTextFieldCell" key="NSCell" id="53243865">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">5byA5ZCvIFgxMSDlsIbliJvlu7ogWGF1dGhvcml0eSDorr/pl67mjqfliLbmjInplK7jgILlpoLmnpzn
-s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
-77yM6L+Z5Y+v6IO95Lya6Zi75q2iIFgxMSDlupTnlKjnqIvluo/lvIDlkK/jgII</string>
+													<string key="NSContents">开启 X11 将创建 Xauthority 访问控制按键。如果系统的 IP 地址已更改,这些按键会变成无效的,这可能会阻止 X11 应用程序开启。</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="168436707"/>
@@ -1216,9 +1195,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 												<object class="NSTextFieldCell" key="NSCell" id="390084685">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">5aaC5p6c5bey5ZCv55So77yM5YiZ5b+F6aG75Lmf5ZCv55So6Ym05a6a6L+e5o6l5Lul56Gu5L+d57O7
-57uf5a6J5YWo44CC5ZCv55So5pe277yM5LiN5YWB6K645LuO6L+c56iL5bqU55So56iL5bqP6L+e5o6l
-44CCA</string>
+													<string key="NSContents">如果已启用,则必须也启用鉴定连接以确保系统安全。停用时,不允许远程应用程序的连接。</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="363817195"/>
@@ -1235,7 +1212,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 												<object class="NSTextFieldCell" key="NSCell" id="283628678">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">6L+Z5Lqb6YCJ6aG55Lya5Zyo5LiL5LiA5qyh5byA5ZCvIFgxMSDml7bnlJ/mlYjjgII</string>
+													<string key="NSContents">这些选项会在下一次开启 X11 时生效。</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="223835729"/>
@@ -1246,7 +1223,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 										</object>
 										<string key="NSFrame">{{10, 33}, {438, 246}}</string>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">5a6J5YWo5oCnA</string>
+									<string key="NSLabel">安全性</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -1263,12 +1240,10 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 						</object>
 					</object>
 					<string key="NSFrameSize">{484, 308}</string>
-					<reference key="NSSuperview"/>
-					<reference key="NSWindow"/>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1280, 938}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSFrameAutosaveName">x11_prefs</string>
 			</object>
 			<object class="NSWindowTemplate" id="604417141">
@@ -1276,12 +1251,12 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 				<int key="NSWindowBacking">2</int>
 				<string key="NSWindowRect">{{279, 416}, {454, 271}}</string>
 				<int key="NSWTFlags">1350041600</int>
-				<string type="base64-UTF8" key="NSWindowTitle">WDExIOW6lOeUqOeoi+W6j+iPnOWNlQ</string>
+				<string key="NSWindowTitle">X11 应用程序菜单</string>
 				<string key="NSWindowClass">NSPanel</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="85544634">
 					<nil key="NSNextResponder"/>
@@ -1297,7 +1272,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 							<object class="NSButtonCell" key="NSCell" id="143554520">
 								<int key="NSCellFlags">67239424</int>
 								<int key="NSCellFlags2">137887744</int>
-								<string type="base64-UTF8" key="NSContents">5aSN5Yi2A</string>
+								<string key="NSContents">复制</string>
 								<reference key="NSSupport" ref="463863101"/>
 								<reference key="NSControlView" ref="671954382"/>
 								<int key="NSButtonFlags">-2038284033</int>
@@ -1320,7 +1295,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 							<object class="NSButtonCell" key="NSCell" id="8201128">
 								<int key="NSCellFlags">67239424</int>
 								<int key="NSCellFlags2">137887744</int>
-								<string type="base64-UTF8" key="NSContents">5Y675o6JA</string>
+								<string key="NSContents">去掉</string>
 								<reference key="NSSupport" ref="463863101"/>
 								<reference key="NSControlView" ref="492358940"/>
 								<int key="NSButtonFlags">-2038284033</int>
@@ -1370,9 +1345,9 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 													<double key="NSMinWidth">62.730998992919922</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
-														<string type="base64-UTF8" key="NSContents">5ZCN56ewA</string>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
+														<string key="NSContents">名称</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor" id="113872566">
 															<int key="NSColorSpace">3</int>
@@ -1409,9 +1384,9 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 													<double key="NSMinWidth">40</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
-														<string type="base64-UTF8" key="NSContents">5ZG95LukA</string>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
+														<string key="NSContents">命令</string>
 														<reference key="NSSupport" ref="26"/>
 														<reference key="NSBackgroundColor" ref="113872566"/>
 														<reference key="NSTextColor" ref="249576247"/>
@@ -1437,9 +1412,9 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 													<double key="NSMinWidth">10</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">67239424</int>
-														<int key="NSCellFlags2">0</int>
-														<string type="base64-UTF8" key="NSContents">5b+r5o23A</string>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
+														<string key="NSContents">快捷</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor">
 															<int key="NSColorSpace">6</int>
@@ -1496,6 +1471,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 											<int key="NSDraggingSourceMaskForLocal">-1</int>
 											<int key="NSDraggingSourceMaskForNonLocal">0</int>
 											<bool key="NSAllowsTypeSelect">YES</bool>
+											<int key="NSTableViewDraggingDestinationStyle">0</int>
 										</object>
 									</object>
 									<string key="NSFrame">{{1, 17}, {301, 198}}</string>
@@ -1560,7 +1536,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 							<object class="NSButtonCell" key="NSCell" id="1025474039">
 								<int key="NSCellFlags">-2080244224</int>
 								<int key="NSCellFlags2">137887744</int>
-								<string type="base64-UTF8" key="NSContents">5re75Yqg6aG5A</string>
+								<string key="NSContents">添加项</string>
 								<reference key="NSSupport" ref="463863101"/>
 								<reference key="NSControlView" ref="758204686"/>
 								<int key="NSButtonFlags">-2038284033</int>
@@ -1579,11 +1555,11 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1280, 938}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSFrameAutosaveName">x11_apps</string>
 			</object>
 			<object class="NSMenu" id="294137138">
-				<string type="base64-UTF8" key="NSTitle">6I+c5Y2VA</string>
+				<string key="NSTitle">菜单</string>
 				<object class="NSMutableArray" key="NSMenuItems">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="NSMenuItem" id="318286212">
@@ -1599,7 +1575,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 					</object>
 					<object class="NSMenuItem" id="511651072">
 						<reference key="NSMenu" ref="294137138"/>
-						<string type="base64-UTF8" key="NSTitle">5bqU55So56iL5bqPA</string>
+						<string key="NSTitle">应用程序</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -1607,7 +1583,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 						<reference key="NSMixedImage" ref="351811234"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="48278059">
-							<string type="base64-UTF8" key="NSTitle">5bqU55So56iL5bqPA</string>
+							<string key="NSTitle">应用程序</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="563798000">
@@ -1623,7 +1599,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 								</object>
 								<object class="NSMenuItem" id="1032342329">
 									<reference key="NSMenu" ref="48278059"/>
-									<string type="base64-UTF8" key="NSTitle">6Ieq5a6a4oCmA</string>
+									<string key="NSTitle">自定…</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -2198,28 +2174,26 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="IBObjectRecord">
 						<int key="objectID">0</int>
-						<object class="NSArray" key="object" id="330408435">
-							<bool key="EncodedWithXMLCoder">YES</bool>
-						</object>
+						<reference key="object" ref="0"/>
 						<reference key="children" ref="904585544"/>
 						<nil key="parent"/>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-2</int>
 						<reference key="object" ref="815810918"/>
-						<reference key="parent" ref="330408435"/>
-						<string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">File's Owner</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-1</int>
 						<reference key="object" ref="941939442"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">First Responder</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-3</int>
 						<reference key="object" ref="951368722"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">Application</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2233,7 +2207,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 							<reference ref="868031522"/>
 							<reference ref="551174276"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">MainMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2478,7 +2452,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 					<object class="IBObjectRecord">
 						<int key="objectID">196</int>
 						<reference key="object" ref="485884620"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">X11Controller</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2488,7 +2462,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="941366957"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">PrefsPanel</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2752,7 +2726,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="85544634"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">EditPrograms</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2775,7 +2749,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 							<reference ref="318286212"/>
 							<reference ref="511651072"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">DockMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -3329,6 +3303,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 				<bool key="EncodedWithXMLCoder">YES</bool>
 				<object class="NSArray" key="dict.sortedKeys">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<string>-3.IBPluginDependency</string>
 					<string>-3.ImportedFromIB2</string>
 					<string>100292.IBPluginDependency</string>
 					<string>100293.IBPluginDependency</string>
@@ -3616,6 +3591,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 				</object>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3904,9 +3880,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -3914,9 +3888,7 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 			<nil key="activeLocalization"/>
 			<object class="NSMutableDictionary" key="localizations">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -3954,6 +3926,15 @@ s7vnu5/nmoQgSVAg5Zyw5Z2A5bey5pu05pS577yM6L+Z5Lqb5oyJ6ZSu5Lya5Y+Y5oiQ5peg5pWI55qE
 			</object>
 		</object>
 		<int key="IBDocument.localizationMode">0</int>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+			<integer value="1050" key="NS.object.0"/>
+		</object>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+			<integer value="3000" key="NS.object.0"/>
+		</object>
+		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
 		<string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
 		<int key="IBDocument.defaultPropertyAccessControl">3</int>
 	</data>
diff --git a/hw/xquartz/bundle/Resources/zh_CN.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/zh_CN.lproj/main.nib/keyedobjects.nib
index 260d3ab..dc29ffa 100644
Binary files a/hw/xquartz/bundle/Resources/zh_CN.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/zh_CN.lproj/main.nib/keyedobjects.nib differ
commit 30df49f54945e75f033a0eb6445c26d37eb33c5e
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Thu Jun 18 23:15:47 2009 -0400

    Xi: fix 2 memory leaks.
    
    In ProcXIQueryDevice() and XISendDeviceHierarchyEvent().
    
    Signed-off-by: Eamon Walsh <ewalsh at tycho.nsa.gov>

diff --git a/Xi/xichangehierarchy.c b/Xi/xichangehierarchy.c
index ef6c394..5401554 100644
--- a/Xi/xichangehierarchy.c
+++ b/Xi/xichangehierarchy.c
@@ -118,6 +118,7 @@ void XISendDeviceHierarchyEvent(int flags[MAXDEVICES])
 
     dummyDev.id = XIAllDevices;
     SendEventToAllWindows(&dummyDev, (XI_HierarchyChangedMask >> 8), (xEvent*)ev, 1);
+    xfree(ev);
 }
 
 
diff --git a/Xi/xiquerydevice.c b/Xi/xiquerydevice.c
index b316c86..6aa1685 100644
--- a/Xi/xiquerydevice.c
+++ b/Xi/xiquerydevice.c
@@ -153,6 +153,7 @@ ProcXIQueryDevice(ClientPtr client)
 
     WriteReplyToClient(client, sizeof(xXIQueryDeviceReply), &rep);
     WriteToClient(client, rep.length * 4, ptr);
+    xfree(ptr);
     return rc;
 }
 
commit eb35402d0a5290e8a73d7d1e92f173294c364cc2
Author: Adam Jackson <ajax at redhat.com>
Date:   Fri Jun 19 12:42:07 2009 -0400

    pci: Dump vendor/devices ids in the printed device list

diff --git a/hw/xfree86/common/xf86pciBus.c b/hw/xfree86/common/xf86pciBus.c
index 854a837..586973b 100644
--- a/hw/xfree86/common/xf86pciBus.c
+++ b/hw/xfree86/common/xf86pciBus.c
@@ -417,18 +417,16 @@ xf86PciProbe(void)
 	if (xf86IsPrimaryPci(info))
 	    prim = "*";
 
-	xf86Msg( X_PROBED, "PCI:%s(%u@%u:%u:%u) ", prim, info->domain,
-		 info->bus, info->dev, info->func );
+	xf86Msg(X_PROBED, "PCI:%s(%u:%u:%u:%u) %04x:%04x:%04x:%04x ", prim,
+		info->domain, info->bus, info->dev, info->func,
+		info->vendor_id, info->device_id,
+		info->subvendor_id, info->subdevice_id);
 
 	if (vendorname)
 	    xf86ErrorF("%s ", vendorname);
-	else
-	    xf86ErrorF("unknown vendor (0x%04x) ", info->vendor_id);
 
 	if (chipname)
 	    xf86ErrorF("%s ", chipname);
-	else
-	    xf86ErrorF("unknown chipset (0x%04x) ", info->device_id);
 
 	xf86ErrorF("rev %d", info->revision);
 
commit c733660428c0a7c1d11f7bd21e23e1bb934d352e
Author: Søren Sandmann Pedersen <sandmann at redhat.com>
Date:   Fri Jun 19 08:37:18 2009 -0400

    Use pixman_version_string() instead of PIXMAN_VERSION_STRING
    
    Pointed out by Julien Cristau.

diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index 543d11c..11f4cf1 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -218,7 +218,7 @@ xf86PrintBanner(void)
 #if defined(BUILDERSTRING)
   ErrorF("%s \n",BUILDERSTRING);
 #endif
-  ErrorF("Current version of pixman: %s\n", PIXMAN_VERSION_STRING);
+  ErrorF("Current version of pixman: %s\n", pixman_version_string());
   ErrorF("\tBefore reporting problems, check "__VENDORDWEBSUPPORT__"\n"
 	 "\tto make sure that you have the latest version.\n");
 }
commit aef6b904ebf0d7de6259058606c7c04ea177bda3
Author: Dave Airlie <airlied at panoply-rh.(none)>
Date:   Thu Mar 13 16:16:46 2008 +1000

    fbdev: make entity fail if PCI claimed already.
    
    bad kitty fbdev, been shipping this in Fedora for a while now

diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c
index 8382d91..0d732d0 100644
--- a/hw/xfree86/common/xf86Bus.c
+++ b/hw/xfree86/common/xf86Bus.c
@@ -428,6 +428,9 @@ xf86GetEntityInfo(int entityIndex)
     EntityInfoPtr pEnt;
     int i;
     
+    if (entityIndex == -1)
+	return NULL;
+
     if (entityIndex >= xf86NumEntities)
 	return NULL;
     
diff --git a/hw/xfree86/common/xf86fbBus.c b/hw/xfree86/common/xf86fbBus.c
index a189639..90e6eb0 100644
--- a/hw/xfree86/common/xf86fbBus.c
+++ b/hw/xfree86/common/xf86fbBus.c
@@ -57,6 +57,13 @@ xf86ClaimFbSlot(DriverPtr drvp, int chipset, GDevPtr dev, Bool active)
 {
     EntityPtr p;
     int num;
+
+    if (pciSlotClaimed)
+	return -1;
+#if defined(__sparc__) || defined (__sparc64__)
+    if (sbusSlotClaimed)
+	return -1;
+#endif
     
     num = xf86AllocateEntity();
     p = xf86Entities[num];
commit 3efb23a6c40dc3583d083d25ada3853ecc56000d
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Thu Jun 18 19:35:22 2009 -0400

    xselinux: Add new device permissions for XI2.
    
    Refects the ability of clients to add/remove devices and device properties.
    
    Signed-off-by: Eamon Walsh <ewalsh at tycho.nsa.gov>

diff --git a/Xext/xselinux.h b/Xext/xselinux.h
index 1c3efc9..065ff8d 100644
--- a/Xext/xselinux.h
+++ b/Xext/xselinux.h
@@ -377,14 +377,14 @@ static struct security_class_mapping map[] = {
           "",			/* DixCreateAccess */
           "getattr",		/* DixGetAttrAccess */
           "setattr",		/* DixSetAttrAccess */
-          "",			/* DixListPropAccess */
-          "",			/* DixGetPropAccess */
-          "",			/* DixSetPropAccess */
+          "list_property",	/* DixListPropAccess */
+          "get_property",	/* DixGetPropAccess */
+          "set_property",	/* DixSetPropAccess */
           "getfocus",		/* DixGetFocusAccess */
           "setfocus",		/* DixSetFocusAccess */
           "",			/* DixListAccess */
-          "",			/* DixAddAccess */
-          "",			/* DixRemoveAccess */
+          "add",		/* DixAddAccess */
+          "remove",		/* DixRemoveAccess */
           "",			/* DixHideAccess */
           "",			/* DixShowAccess */
           "",			/* DixBlendAccess */
commit 1e060c3d8b13d352a58fc65980cb9a3c6cb5718f
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Thu Jun 18 18:48:24 2009 -0400

    xselinux: Move the security class mapping to the header file.
    
    Take the mapping of DixAccess bits to Flask permissions, move it
    into the header file, break up the extremely long lines, and
    annotate the permission names with the bit being referenced.
    
    Signed-off-by: Eamon Walsh <ewalsh at tycho.nsa.gov>

diff --git a/Xext/xselinux.c b/Xext/xselinux.c
index 3a6f096..9898b29 100644
--- a/Xext/xselinux.c
+++ b/Xext/xselinux.c
@@ -49,6 +49,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "scrnintstr.h"
 #include "selection.h"
 #include "xacestr.h"
+#define _XSELINUX_NEED_FLASK
 #include "xselinux.h"
 #include "../os/osdep.h"
 #include "modinit.h"
@@ -133,32 +134,6 @@ static unsigned numKnownEvents;
 static SELinuxAtomRec *knownAtoms;
 static unsigned numKnownAtoms;
 
-/* dynamically allocated security classes and permissions */
-static struct security_class_mapping map[] = {
-    { "x_drawable", { "read", "write", "destroy", "create", "getattr", "setattr", "list_property", "get_property", "set_property", "", "", "list_child", "add_child", "remove_child", "hide", "show", "blend", "override", "", "", "", "", "send", "receive", "", "manage", NULL }},
-    { "x_screen", { "", "", "", "", "getattr", "setattr", "saver_getattr", "saver_setattr", "", "", "", "", "", "", "hide_cursor", "show_cursor", "saver_hide", "saver_show", NULL }},
-    { "x_gc", { "", "", "destroy", "create", "getattr", "setattr", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "use", NULL }},
-    { "x_font", { "", "", "destroy", "create", "getattr", "", "", "", "", "", "", "", "add_glyph", "remove_glyph", "", "", "", "", "", "", "", "", "", "", "use", NULL }},
-    { "x_colormap", { "read", "write", "destroy", "create", "getattr", "", "", "", "", "", "", "", "add_color", "remove_color", "", "", "", "", "", "", "install", "uninstall", "", "", "use", NULL }},
-    { "x_property", { "read", "write", "destroy", "create", "getattr", "setattr", "", "", "", "", "", "", "", "", "", "", "write", NULL }},
-    { "x_selection", { "read", "", "", "setattr", "getattr", "setattr", NULL }},
-    { "x_cursor", { "read", "write", "destroy", "create", "getattr", "setattr", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "use", NULL }},
-    { "x_client", { "", "", "destroy", "", "getattr", "setattr", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "manage", NULL }},
-    { "x_device", { "read", "write", "", "", "getattr", "setattr", "", "", "", "getfocus", "setfocus", "", "", "", "", "", "", "grab", "freeze", "force_cursor", "", "", "", "", "use", "manage", "", "bell", NULL }},
-    { "x_server", { "record", "", "", "", "getattr", "setattr", "", "", "", "", "", "", "", "", "", "", "", "grab", "", "", "", "", "", "", "", "manage", "debug", NULL }},
-    { "x_extension", { "", "", "", "", "query", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "use", NULL }},
-    { "x_event", { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "send", "receive", NULL }},
-    { "x_synthetic_event", { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "send", "receive", NULL }},
-    { "x_resource", { "read", "write", "write", "write", "read", "write", "read", "read", "write", "read", "write", "read", "write", "write", "write", "read", "read", "write", "write", "write", "write", "write", "write", "read", "read", "write", "read", "write", NULL }},
-    { NULL }
-};
-
-/* x_resource "read" bits from the list above */
-#define SELinuxReadMask (DixReadAccess|DixGetAttrAccess|DixListPropAccess| \
-			 DixGetPropAccess|DixGetFocusAccess|DixListAccess| \
-			 DixShowAccess|DixBlendAccess|DixReceiveAccess| \
-			 DixUseAccess|DixDebugAccess)
-
 /* forward declarations */
 static void SELinuxScreen(CallbackListPtr *, pointer, pointer);
 
diff --git a/Xext/xselinux.h b/Xext/xselinux.h
index 7c3ffdc..1c3efc9 100644
--- a/Xext/xselinux.h
+++ b/Xext/xselinux.h
@@ -139,6 +139,7 @@ typedef struct {
 } SELinuxListItemsReply;
 
 
+#ifdef _XSELINUX_NEED_FLASK
 /* Private Flask definitions */
 #define SECCLASS_X_DRAWABLE		1
 #define SECCLASS_X_SCREEN		2
@@ -156,4 +157,395 @@ typedef struct {
 #define SECCLASS_X_FAKEEVENT		14
 #define SECCLASS_X_RESOURCE		15
 
+/* Mapping from DixAccess bits to Flask permissions */
+static struct security_class_mapping map[] = {
+    { "x_drawable",
+        { "read",		/* DixReadAccess */
+          "write",		/* DixWriteAccess */
+          "destroy",		/* DixDestroyAccess */
+          "create",		/* DixCreateAccess */
+          "getattr",		/* DixGetAttrAccess */
+          "setattr",		/* DixSetAttrAccess */
+          "list_property",	/* DixListPropAccess */
+          "get_property",	/* DixGetPropAccess */
+          "set_property",	/* DixSetPropAccess */
+          "",			/* DixGetFocusAccess */
+          "",			/* DixSetFocusAccess */
+          "list_child",		/* DixListAccess */
+          "add_child",		/* DixAddAccess */
+          "remove_child",	/* DixRemoveAccess */
+          "hide",		/* DixHideAccess */
+          "show",		/* DixShowAccess */
+          "blend",		/* DixBlendAccess */
+          "override",		/* DixGrabAccess */
+          "",			/* DixFreezeAccess */
+          "",			/* DixForceAccess */
+          "",			/* DixInstallAccess */
+          "",			/* DixUninstallAccess */
+          "send",		/* DixSendAccess */
+          "receive",		/* DixReceiveAccess */
+          "",			/* DixUseAccess */
+          "manage",		/* DixManageAccess */
+          NULL }},
+    { "x_screen",
+        { "",			/* DixReadAccess */
+          "",			/* DixWriteAccess */
+          "",			/* DixDestroyAccess */
+          "",			/* DixCreateAccess */
+          "getattr",		/* DixGetAttrAccess */
+          "setattr",		/* DixSetAttrAccess */
+          "saver_getattr",	/* DixListPropAccess */
+          "saver_setattr",	/* DixGetPropAccess */
+          "",			/* DixSetPropAccess */
+          "",			/* DixGetFocusAccess */
+          "",			/* DixSetFocusAccess */
+          "",			/* DixListAccess */
+          "",			/* DixAddAccess */
+          "",			/* DixRemoveAccess */
+          "hide_cursor",	/* DixHideAccess */
+          "show_cursor",	/* DixShowAccess */
+          "saver_hide",		/* DixBlendAccess */
+          "saver_show",		/* DixGrabAccess */
+          NULL }},
+    { "x_gc",
+        { "",			/* DixReadAccess */
+          "",			/* DixWriteAccess */
+          "destroy",		/* DixDestroyAccess */
+          "create",		/* DixCreateAccess */
+          "getattr",		/* DixGetAttrAccess */
+          "setattr",		/* DixSetAttrAccess */
+          "",			/* DixListPropAccess */
+          "",			/* DixGetPropAccess */
+          "",			/* DixSetPropAccess */
+          "",			/* DixGetFocusAccess */
+          "",			/* DixSetFocusAccess */
+          "",			/* DixListAccess */
+          "",			/* DixAddAccess */
+          "",			/* DixRemoveAccess */
+          "",			/* DixHideAccess */
+          "",			/* DixShowAccess */
+          "",			/* DixBlendAccess */
+          "",			/* DixGrabAccess */
+          "",			/* DixFreezeAccess */
+          "",			/* DixForceAccess */
+          "",			/* DixInstallAccess */
+          "",			/* DixUninstallAccess */
+          "",			/* DixSendAccess */
+          "",			/* DixReceiveAccess */
+          "use",		/* DixUseAccess */
+          NULL }},
+    { "x_font",
+        { "",			/* DixReadAccess */
+          "",			/* DixWriteAccess */
+          "destroy",		/* DixDestroyAccess */
+          "create",		/* DixCreateAccess */
+          "getattr",		/* DixGetAttrAccess */
+          "",			/* DixSetAttrAccess */
+          "",			/* DixListPropAccess */
+          "",			/* DixGetPropAccess */
+          "",			/* DixSetPropAccess */
+          "",			/* DixGetFocusAccess */
+          "",			/* DixSetFocusAccess */
+          "",			/* DixListAccess */
+          "add_glyph",		/* DixAddAccess */
+          "remove_glyph",	/* DixRemoveAccess */
+          "",			/* DixHideAccess */
+          "",			/* DixShowAccess */
+          "",			/* DixBlendAccess */
+          "",			/* DixGrabAccess */
+          "",			/* DixFreezeAccess */
+          "",			/* DixForceAccess */
+          "",			/* DixInstallAccess */
+          "",			/* DixUninstallAccess */
+          "",			/* DixSendAccess */
+          "",			/* DixReceiveAccess */
+          "use",		/* DixUseAccess */
+          NULL }},
+    { "x_colormap",
+        { "read",		/* DixReadAccess */
+          "write",		/* DixWriteAccess */
+          "destroy",		/* DixDestroyAccess */
+          "create",		/* DixCreateAccess */
+          "getattr",		/* DixGetAttrAccess */
+          "",			/* DixSetAttrAccess */
+          "",			/* DixListPropAccess */
+          "",			/* DixGetPropAccess */
+          "",			/* DixSetPropAccess */
+          "",			/* DixGetFocusAccess */
+          "",			/* DixSetFocusAccess */
+          "",			/* DixListAccess */
+          "add_color",		/* DixAddAccess */
+          "remove_color",	/* DixRemoveAccess */
+          "",			/* DixHideAccess */
+          "",			/* DixShowAccess */
+          "",			/* DixBlendAccess */
+          "",			/* DixGrabAccess */
+          "",			/* DixFreezeAccess */
+          "",			/* DixForceAccess */
+          "install",		/* DixInstallAccess */
+          "uninstall",		/* DixUninstallAccess */
+          "",			/* DixSendAccess */
+          "",			/* DixReceiveAccess */
+          "use",		/* DixUseAccess */
+          NULL }},
+    { "x_property",
+        { "read",		/* DixReadAccess */
+          "write",		/* DixWriteAccess */
+          "destroy",		/* DixDestroyAccess */
+          "create",		/* DixCreateAccess */
+          "getattr",		/* DixGetAttrAccess */
+          "setattr",		/* DixSetAttrAccess */
+          "",			/* DixListPropAccess */
+          "",			/* DixGetPropAccess */
+          "",			/* DixSetPropAccess */
+          "",			/* DixGetFocusAccess */
+          "",			/* DixSetFocusAccess */
+          "",			/* DixListAccess */
+          "",			/* DixAddAccess */
+          "",			/* DixRemoveAccess */
+          "",			/* DixHideAccess */
+          "",			/* DixShowAccess */
+          "write",		/* DixBlendAccess */
+          NULL }},
+    { "x_selection",
+        { "read",		/* DixReadAccess */
+          "",			/* DixWriteAccess */
+          "",			/* DixDestroyAccess */
+          "setattr",		/* DixCreateAccess */
+          "getattr",		/* DixGetAttrAccess */
+          "setattr",		/* DixSetAttrAccess */
+          NULL }},
+    { "x_cursor",
+        { "read",		/* DixReadAccess */
+          "write",		/* DixWriteAccess */
+          "destroy",		/* DixDestroyAccess */
+          "create",		/* DixCreateAccess */
+          "getattr",		/* DixGetAttrAccess */
+          "setattr",		/* DixSetAttrAccess */
+          "",			/* DixListPropAccess */
+          "",			/* DixGetPropAccess */
+          "",			/* DixSetPropAccess */
+          "",			/* DixGetFocusAccess */
+          "",			/* DixSetFocusAccess */
+          "",			/* DixListAccess */
+          "",			/* DixAddAccess */
+          "",			/* DixRemoveAccess */
+          "",			/* DixHideAccess */
+          "",			/* DixShowAccess */
+          "",			/* DixBlendAccess */
+          "",			/* DixGrabAccess */
+          "",			/* DixFreezeAccess */
+          "",			/* DixForceAccess */
+          "",			/* DixInstallAccess */
+          "",			/* DixUninstallAccess */
+          "",			/* DixSendAccess */
+          "",			/* DixReceiveAccess */
+          "use",		/* DixUseAccess */
+          NULL }},
+    { "x_client",
+        { "",			/* DixReadAccess */
+          "",			/* DixWriteAccess */
+          "destroy",		/* DixDestroyAccess */
+          "",			/* DixCreateAccess */
+          "getattr",		/* DixGetAttrAccess */
+          "setattr",		/* DixSetAttrAccess */
+          "",			/* DixListPropAccess */
+          "",			/* DixGetPropAccess */
+          "",			/* DixSetPropAccess */
+          "",			/* DixGetFocusAccess */
+          "",			/* DixSetFocusAccess */
+          "",			/* DixListAccess */
+          "",			/* DixAddAccess */
+          "",			/* DixRemoveAccess */
+          "",			/* DixHideAccess */
+          "",			/* DixShowAccess */
+          "",			/* DixBlendAccess */
+          "",			/* DixGrabAccess */
+          "",			/* DixFreezeAccess */
+          "",			/* DixForceAccess */
+          "",			/* DixInstallAccess */
+          "",			/* DixUninstallAccess */
+          "",			/* DixSendAccess */
+          "",			/* DixReceiveAccess */
+          "",			/* DixUseAccess */
+          "manage",		/* DixManageAccess */
+          NULL }},
+    { "x_device",
+        { "read",		/* DixReadAccess */
+          "write",		/* DixWriteAccess */
+          "",			/* DixDestroyAccess */
+          "",			/* DixCreateAccess */
+          "getattr",		/* DixGetAttrAccess */
+          "setattr",		/* DixSetAttrAccess */
+          "",			/* DixListPropAccess */
+          "",			/* DixGetPropAccess */
+          "",			/* DixSetPropAccess */
+          "getfocus",		/* DixGetFocusAccess */
+          "setfocus",		/* DixSetFocusAccess */
+          "",			/* DixListAccess */
+          "",			/* DixAddAccess */
+          "",			/* DixRemoveAccess */
+          "",			/* DixHideAccess */
+          "",			/* DixShowAccess */
+          "",			/* DixBlendAccess */
+          "grab",		/* DixGrabAccess */
+          "freeze",		/* DixFreezeAccess */
+          "force_cursor",	/* DixForceAccess */
+          "",			/* DixInstallAccess */
+          "",			/* DixUninstallAccess */
+          "",			/* DixSendAccess */
+          "",			/* DixReceiveAccess */
+          "use",		/* DixUseAccess */
+          "manage",		/* DixManageAccess */
+          "",			/* DixDebugAccess */
+          "bell",		/* DixBellAccess */
+          NULL }},
+    { "x_server",
+        { "record",		/* DixReadAccess */
+          "",			/* DixWriteAccess */
+          "",			/* DixDestroyAccess */
+          "",			/* DixCreateAccess */
+          "getattr",		/* DixGetAttrAccess */
+          "setattr",		/* DixSetAttrAccess */
+          "",			/* DixListPropAccess */
+          "",			/* DixGetPropAccess */
+          "",			/* DixSetPropAccess */
+          "",			/* DixGetFocusAccess */
+          "",			/* DixSetFocusAccess */
+          "",			/* DixListAccess */
+          "",			/* DixAddAccess */
+          "",			/* DixRemoveAccess */
+          "",			/* DixHideAccess */
+          "",			/* DixShowAccess */
+          "",			/* DixBlendAccess */
+          "grab",		/* DixGrabAccess */
+          "",			/* DixFreezeAccess */
+          "",			/* DixForceAccess */
+          "",			/* DixInstallAccess */
+          "",			/* DixUninstallAccess */
+          "",			/* DixSendAccess */
+          "",			/* DixReceiveAccess */
+          "",			/* DixUseAccess */
+          "manage",		/* DixManageAccess */
+          "debug",		/* DixDebugAccess */
+          NULL }},
+    { "x_extension",
+        { "",			/* DixReadAccess */
+          "",			/* DixWriteAccess */
+          "",			/* DixDestroyAccess */
+          "",			/* DixCreateAccess */
+          "query",		/* DixGetAttrAccess */
+          "",			/* DixSetAttrAccess */
+          "",			/* DixListPropAccess */
+          "",			/* DixGetPropAccess */
+          "",			/* DixSetPropAccess */
+          "",			/* DixGetFocusAccess */
+          "",			/* DixSetFocusAccess */
+          "",			/* DixListAccess */
+          "",			/* DixAddAccess */
+          "",			/* DixRemoveAccess */
+          "",			/* DixHideAccess */
+          "",			/* DixShowAccess */
+          "",			/* DixBlendAccess */
+          "",			/* DixGrabAccess */
+          "",			/* DixFreezeAccess */
+          "",			/* DixForceAccess */
+          "",			/* DixInstallAccess */
+          "",			/* DixUninstallAccess */
+          "",			/* DixSendAccess */
+          "",			/* DixReceiveAccess */
+          "use",		/* DixUseAccess */
+          NULL }},
+    { "x_event",
+        { "",			/* DixReadAccess */
+          "",			/* DixWriteAccess */
+          "",			/* DixDestroyAccess */
+          "",			/* DixCreateAccess */
+          "",			/* DixGetAttrAccess */
+          "",			/* DixSetAttrAccess */
+          "",			/* DixListPropAccess */
+          "",			/* DixGetPropAccess */
+          "",			/* DixSetPropAccess */
+          "",			/* DixGetFocusAccess */
+          "",			/* DixSetFocusAccess */
+          "",			/* DixListAccess */
+          "",			/* DixAddAccess */
+          "",			/* DixRemoveAccess */
+          "",			/* DixHideAccess */
+          "",			/* DixShowAccess */
+          "",			/* DixBlendAccess */
+          "",			/* DixGrabAccess */
+          "",			/* DixFreezeAccess */
+          "",			/* DixForceAccess */
+          "",			/* DixInstallAccess */
+          "",			/* DixUninstallAccess */
+          "send",		/* DixSendAccess */
+          "receive",		/* DixReceiveAccess */
+          NULL }},
+    { "x_synthetic_event",
+        { "",			/* DixReadAccess */
+          "",			/* DixWriteAccess */
+          "",			/* DixDestroyAccess */
+          "",			/* DixCreateAccess */
+          "",			/* DixGetAttrAccess */
+          "",			/* DixSetAttrAccess */
+          "",			/* DixListPropAccess */
+          "",			/* DixGetPropAccess */
+          "",			/* DixSetPropAccess */
+          "",			/* DixGetFocusAccess */
+          "",			/* DixSetFocusAccess */
+          "",			/* DixListAccess */
+          "",			/* DixAddAccess */
+          "",			/* DixRemoveAccess */
+          "",			/* DixHideAccess */
+          "",			/* DixShowAccess */
+          "",			/* DixBlendAccess */
+          "",			/* DixGrabAccess */
+          "",			/* DixFreezeAccess */
+          "",			/* DixForceAccess */
+          "",			/* DixInstallAccess */
+          "",			/* DixUninstallAccess */
+          "send",		/* DixSendAccess */
+          "receive",		/* DixReceiveAccess */
+          NULL }},
+    { "x_resource",
+        { "read",		/* DixReadAccess */
+          "write",		/* DixWriteAccess */
+          "write",		/* DixDestroyAccess */
+          "write",		/* DixCreateAccess */
+          "read",		/* DixGetAttrAccess */
+          "write",		/* DixSetAttrAccess */
+          "read",		/* DixListPropAccess */
+          "read",		/* DixGetPropAccess */
+          "write",		/* DixSetPropAccess */
+          "read",		/* DixGetFocusAccess */
+          "write",		/* DixSetFocusAccess */
+          "read",		/* DixListAccess */
+          "write",		/* DixAddAccess */
+          "write",		/* DixRemoveAccess */
+          "write",		/* DixHideAccess */
+          "read",		/* DixShowAccess */
+          "read",		/* DixBlendAccess */
+          "write",		/* DixGrabAccess */
+          "write",		/* DixFreezeAccess */
+          "write",		/* DixForceAccess */
+          "write",		/* DixInstallAccess */
+          "write",		/* DixUninstallAccess */
+          "write",		/* DixSendAccess */
+          "read",		/* DixReceiveAccess */
+          "read",		/* DixUseAccess */
+          "write",		/* DixManageAccess */
+          "read",		/* DixDebugAccess */
+          "write",		/* DixBellAccess */
+          NULL }},
+    { NULL }
+};
+
+/* x_resource "read" bits from the list above */
+#define SELinuxReadMask (DixReadAccess|DixGetAttrAccess|DixListPropAccess| \
+			 DixGetPropAccess|DixGetFocusAccess|DixListAccess| \
+			 DixShowAccess|DixBlendAccess|DixReceiveAccess| \
+			 DixUseAccess|DixDebugAccess)
+
+#endif /* _XSELINUX_NEED_FLASK */
 #endif /* _XSELINUX_H */
commit 75c51c67b340548286efd41a53882e2acaf74ab5
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Thu Jun 18 09:49:12 2009 -0700

    Clarify use of and need for mffs vs. ffs
    
    Signed-off-by: Alan Coopersmith <alan.coopersmith at sun.com>

diff --git a/os/WaitFor.c b/os/WaitFor.c
index 9a204c7..4b59525 100644
--- a/os/WaitFor.c
+++ b/os/WaitFor.c
@@ -92,6 +92,8 @@ SOFTWARE.
 #define GetErrno() errno
 #endif
 
+/* like ffs, but uses fd_mask instead of int as argument, so it works
+   when fd_mask is longer than an int, such as common 64-bit platforms */
 /* modifications by raphael */
 int
 mffs(fd_mask mask)
@@ -336,7 +338,7 @@ WaitForSomething(int *pClientsReady)
 	    {
 	        int client_priority, client_index;
 
-		curclient = ffs (clientsReadable.fds_bits[i]) - 1;
+		curclient = mffs (clientsReadable.fds_bits[i]) - 1;
 		client_index = /* raphael: modified */
 			ConnectionTranslation[curclient + (i * (sizeof(fd_mask) * 8))];
 #else
diff --git a/os/connection.c b/os/connection.c
index 0c72b67..3ff93bb 100644
--- a/os/connection.c
+++ b/os/connection.c
@@ -827,7 +827,7 @@ EstablishNewConnections(ClientPtr clientUnused, pointer closure)
 	int status;
 
 #ifndef WIN32
-	curconn = ffs (readyconnections.fds_bits[i]) - 1;
+	curconn = mffs (readyconnections.fds_bits[i]) - 1;
 	readyconnections.fds_bits[i] &= ~((fd_mask)1 << curconn);
 	curconn += (i * (sizeof(fd_mask)*8));
 #else
@@ -992,7 +992,7 @@ CheckConnections(void)
 	mask = AllClients.fds_bits[i];
         while (mask)
     	{
-	    curoff = ffs (mask) - 1;
+	    curoff = mffs (mask) - 1;
 	    curclient = curoff + (i * (sizeof(fd_mask)*8));
             FD_ZERO(&tmask);
             FD_SET(curclient, &tmask);
diff --git a/os/osdep.h b/os/osdep.h
index e719f9a..b0d30e9 100644
--- a/os/osdep.h
+++ b/os/osdep.h
@@ -204,7 +204,7 @@ extern Bool AnyClientsWriteBlocked;
 
 extern WorkQueuePtr workQueue;
 
-/* added by raphael */
+/* in WaitFor.c */
 #ifdef WIN32
 typedef long int fd_mask;
 #endif
commit 128cd03eecacc6d5c5903d59a11966dcf3697bf1
Author: Søren Sandmann Pedersen <sandmann at redhat.com>
Date:   Sat Jun 13 10:55:04 2009 -0400

    Fix miComputeCompositeRegion() to follow new clip rules.
    
    Ignore the hierarchy clip, and always apply any client clip after
    transformation and repeating.

diff --git a/render/mipict.c b/render/mipict.c
index e0d40ae..71f3de7 100644
--- a/render/mipict.c
+++ b/render/mipict.c
@@ -313,32 +313,24 @@ miClipPictureSrc (RegionPtr	pRegion,
 		  int		dx,
 		  int		dy)
 {
-    /* XXX what to do with clipping from transformed pictures? */
-    if (pPicture->transform || !pPicture->pDrawable)
-	return TRUE;
-    if (pPicture->repeat)
+    if (pPicture->clientClipType != CT_NONE)
     {
-	if (pPicture->clientClipType != CT_NONE)
-	{
-	    pixman_region_translate ( pRegion, 
-			     dx - pPicture->clipOrigin.x,
-			     dy - pPicture->clipOrigin.y);
-	    if (!REGION_INTERSECT (pScreen, pRegion, pRegion, 
-				   (RegionPtr) pPicture->pCompositeClip)) // clientClip))
-		return FALSE;
-	    pixman_region_translate ( pRegion, 
-			     - (dx - pPicture->clipOrigin.x),
-			     - (dy - pPicture->clipOrigin.y));
-	}
-	return TRUE;
-    }
-    else
-    {
-	return miClipPictureReg (pRegion,
-				 pPicture->pCompositeClip,
-				 dx,
-				 dy);
+	Bool result;
+	
+	pixman_region_translate ( pPicture->clientClip,
+				  pPicture->clipOrigin.x - dx,
+				  pPicture->clipOrigin.y - dy);
+
+	result = REGION_INTERSECT (pScreen, pRegion, pRegion, pPicture->clientClip);
+	
+	pixman_region_translate ( pPicture->clientClip,
+				  - (pPicture->clipOrigin.x - dx),
+				  - (pPicture->clipOrigin.y - dy));
+
+	if (!result)
+	    return FALSE;
     }
+    return TRUE;
 }
 
 void
commit e9aa61e9f0d663d5b34a397b943b4d1df44e873d
Author: Søren Sandmann Pedersen <sandmann at redhat.com>
Date:   Sat Jun 13 10:28:21 2009 -0400

    Fix clipping when windows are used as sources
    
    The new clipping rules:
    
    	- client clips happen after transformation
    	- pixels unavailable due to the hierarchy are undefined
    
    The first one is implemented in pixman; the second one is realized by
    making a copy of window sources (to prevent out-of-bounds access).

diff --git a/configure.ac b/configure.ac
index 2ffb7d0..f9a967c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -701,7 +701,7 @@ XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
 
 dnl Core modules for most extensions, et al.
 REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.9.3] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.12] [kbproto >= 1.0.3]"
-REQUIRED_LIBS="xfont xau fontenc [pixman-1 >= 0.13.2]"
+REQUIRED_LIBS="xfont xau fontenc [pixman-1 >= 0.15.12]"
 
 dnl HAVE_DBUS is true if we actually have the D-Bus library, whereas
 dnl CONFIG_DBUS_API is true if we want to enable the D-Bus config
diff --git a/fb/fb.h b/fb/fb.h
index 8ff186a..2d3c85d 100644
--- a/fb/fb.h
+++ b/fb/fb.h
@@ -2068,7 +2068,8 @@ fbFillRegionSolid (DrawablePtr	pDrawable,
 
 extern _X_EXPORT pixman_image_t *
 image_from_pict (PicturePtr pict,
-		 Bool       has_clip);
+		 Bool       has_clip,
+		 Bool	    is_src);
 extern _X_EXPORT void free_pixman_pict (PicturePtr, pixman_image_t *);
 
 #endif /* _FB_H_ */
diff --git a/fb/fbpict.c b/fb/fbpict.c
index c89691d..32052e9 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -163,9 +163,9 @@ fbComposite (CARD8      op,
     if (pMask)
 	miCompositeSourceValidate (pMask, xMask - xDst, yMask - yDst, width, height);
     
-    src = image_from_pict (pSrc, TRUE);
-    mask = image_from_pict (pMask, TRUE);
-    dest = image_from_pict (pDst, TRUE);
+    src = image_from_pict (pSrc, TRUE, TRUE);
+    mask = image_from_pict (pMask, TRUE, TRUE);
+    dest = image_from_pict (pDst, TRUE, FALSE);
 
     if (src && dest && !(pMask && !mask))
     {
@@ -268,23 +268,77 @@ create_conical_gradient_image (PictGradient *gradient)
 	gradient->nstops);
 }
 
+static DrawablePtr 
+copy_drawable (DrawablePtr pDraw)
+{
+    ScreenPtr pScreen = pDraw->pScreen;
+    PixmapPtr pPixmap;
+    GCPtr pGC;
+    int width, height;
+    ChangeGCVal gcv[1];
+    
+    width = pDraw->width;
+    height = pDraw->height;
+    
+    pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, pDraw->depth, 0);
+    
+    if (!pPixmap)
+	return NULL;
+    
+    pGC = GetScratchGC (pDraw->depth, pScreen);
+    
+    if (!pGC)
+    {
+	(*pScreen->DestroyPixmap) (pPixmap);
+	return NULL;
+    }
+    
+    /* First fill the pixmap with zeros */
+    gcv[0].val = 0x00000000;
+    dixChangeGC (NullClient, pGC, GCBackground, NULL, gcv);
+    ValidateGC ((DrawablePtr)pPixmap, pGC);
+    miClearDrawable ((DrawablePtr)pPixmap, pGC);
+    
+    /* Then copy the window there */
+    ValidateGC(&pPixmap->drawable, pGC);
+    (* pGC->ops->CopyArea) (pDraw, &pPixmap->drawable, pGC, 0, 0, width, height, 0, 0);
+    
+    FreeScratchGC (pGC);
+    
+    return &pPixmap->drawable;
+}
+
+static void
+destroy_drawable (pixman_image_t *image, void *data)
+{
+    DrawablePtr pDrawable = data;
+    ScreenPtr pScreen = pDrawable->pScreen;
+
+    pScreen->DestroyPixmap ((PixmapPtr)pDrawable);
+}
+
 static pixman_image_t *
 create_bits_picture (PicturePtr pict,
-		     Bool       has_clip)
+		     Bool	has_clip,
+		     Bool       is_src)
 {
     FbBits *bits;
     FbStride stride;
     int bpp, xoff, yoff;
     pixman_image_t *image;
+    DrawablePtr drawable;
+
+    if (is_src && pict->pDrawable->type == DRAWABLE_WINDOW)
+	drawable = copy_drawable (pict->pDrawable);
+    else
+	drawable = pict->pDrawable;
     
-    fbGetDrawable (pict->pDrawable, bits, stride, bpp, xoff, yoff);
+    fbGetDrawable (drawable, bits, stride, bpp, xoff, yoff);
 
-    bits = (FbBits*)((CARD8*)bits +
-		     pict->pDrawable->y * stride * sizeof(FbBits) + pict->pDrawable->x * (bpp / 8));
+    bits = (FbBits*)((CARD8*)bits + drawable->y * stride * sizeof(FbBits) + drawable->x * (bpp / 8));
 
     image = pixman_image_create_bits (
-	pict->format,
-	pict->pDrawable->width, pict->pDrawable->height,
+	pict->format, drawable->width, drawable->height,
 	(uint32_t *)bits, stride * sizeof (FbStride));
     
     
@@ -302,25 +356,46 @@ create_bits_picture (PicturePtr pict,
 #endif
 #endif
     
-    /* pCompositeClip is undefined for source pictures, so
-     * only set the clip region for pictures with drawables
-     */
     if (has_clip)
     {
-	if (pict->clientClipType != CT_NONE)
-	    pixman_image_set_has_client_clip (image, TRUE);
+	if (is_src)
+	{
+	    if (pict->clientClipType != CT_NONE)
+	    {
+		pixman_image_set_has_client_clip (image, TRUE);
 
-	pixman_region_translate (pict->pCompositeClip, - pict->pDrawable->x, - pict->pDrawable->y);
-	
-	pixman_image_set_clip_region (image, pict->pCompositeClip);
+		pixman_region_translate (pict->clientClip,
+					 pict->clipOrigin.x,
+					 pict->clipOrigin.y);
+		
+		pixman_image_set_clip_region (image, pict->clientClip);
 
-	pixman_region_translate (pict->pCompositeClip, pict->pDrawable->x, pict->pDrawable->y);
+		pixman_region_translate (pict->clientClip,
+					 - pict->clipOrigin.x,
+					 - pict->clipOrigin.y);
+	    }
+	}
+	else
+	{
+	    pixman_region_translate (pict->pCompositeClip,
+				     - pict->pDrawable->x,
+				     - pict->pDrawable->y);
+
+	    pixman_image_set_clip_region (image, pict->pCompositeClip);
+	    
+	    pixman_region_translate (pict->pCompositeClip,
+				     pict->pDrawable->x,
+				     pict->pDrawable->y);
+	}
     }
     
     /* Indexed table */
     if (pict->pFormat->index.devPrivate)
 	pixman_image_set_indexed (image, pict->pFormat->index.devPrivate);
 
+    if (drawable != pict->pDrawable)
+	pixman_image_set_destroy_function (image, destroy_drawable, drawable);
+    
     return image;
 }
 
@@ -360,7 +435,7 @@ set_image_properties (pixman_image_t *image, PicturePtr pict)
     
     if (pict->alphaMap)
     {
-	pixman_image_t *alpha_map = image_from_pict (pict->alphaMap, TRUE);
+	pixman_image_t *alpha_map = image_from_pict (pict->alphaMap, TRUE, TRUE);
 	
 	pixman_image_set_alpha_map (
 	    image, alpha_map, pict->alphaOrigin.x, pict->alphaOrigin.y);
@@ -394,7 +469,8 @@ set_image_properties (pixman_image_t *image, PicturePtr pict)
 
 pixman_image_t *
 image_from_pict (PicturePtr pict,
-		 Bool has_clip)
+		 Bool has_clip,
+		 Bool is_src)
 {
     pixman_image_t *image = NULL;
 
@@ -403,7 +479,7 @@ image_from_pict (PicturePtr pict,
 
     if (pict->pDrawable)
     {
-	image = create_bits_picture (pict, has_clip);
+	image = create_bits_picture (pict, has_clip, is_src);
     }
     else if (pict->pSourcePict)
     {
diff --git a/fb/fbtrap.c b/fb/fbtrap.c
index 830603a..b1e1eff 100644
--- a/fb/fbtrap.c
+++ b/fb/fbtrap.c
@@ -40,7 +40,7 @@ fbAddTraps (PicturePtr	pPicture,
 	    int		ntrap,
 	    xTrap	*traps)
 {
-    pixman_image_t *image = image_from_pict (pPicture, FALSE);
+    pixman_image_t *image = image_from_pict (pPicture, FALSE, FALSE);
 
     if (!image)
 	return;
@@ -56,7 +56,7 @@ fbRasterizeTrapezoid (PicturePtr    pPicture,
 		      int	    x_off,
 		      int	    y_off)
 {
-    pixman_image_t *image = image_from_pict (pPicture, FALSE);
+    pixman_image_t *image = image_from_pict (pPicture, FALSE, FALSE);
 
     if (!image)
 	return;
commit d9b5e77a0e48a16c53653b56bc61a0b8dc4122a1
Author: Søren Sandmann Pedersen <sandmann at redhat.com>
Date:   Tue Jun 9 14:36:21 2009 -0400

    Print the current version of pixman.

diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index c4e5898..543d11c 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -218,6 +218,7 @@ xf86PrintBanner(void)
 #if defined(BUILDERSTRING)
   ErrorF("%s \n",BUILDERSTRING);
 #endif
+  ErrorF("Current version of pixman: %s\n", PIXMAN_VERSION_STRING);
   ErrorF("\tBefore reporting problems, check "__VENDORDWEBSUPPORT__"\n"
 	 "\tto make sure that you have the latest version.\n");
 }
commit 1e9907499c27321a2aa5dc8a75a375b7a82c999a
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 18 15:14:00 2009 +1000

    record: use dixLookupResourceByClass instead of LookupIDByClass.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/record/record.c b/record/record.c
index cb7a627..3c4bb9e 100644
--- a/record/record.c
+++ b/record/record.c
@@ -1166,10 +1166,12 @@ RecordDeleteClientFromContext(RecordContextPtr pContext, XID clientspec)
  * Side Effects: none.
  */
 static int
-RecordSanityCheckClientSpecifiers(XID *clientspecs, int nspecs, XID errorspec)
+RecordSanityCheckClientSpecifiers(ClientPtr client, XID *clientspecs, int nspecs, XID errorspec)
 {
     int i;
     int clientIndex;
+    int rc;
+    pointer value;
 
     for (i = 0; i < nspecs; i++)
     {
@@ -1185,8 +1187,10 @@ RecordSanityCheckClientSpecifiers(XID *clientspecs, int nspecs, XID errorspec)
 	{
 	    if (clientspecs[i] == clients[clientIndex]->clientAsMask)
 		continue;
-	    if (!LookupIDByClass(clientspecs[i], RC_ANY))
-		return BadMatch;
+            rc = dixLookupResourceByClass(&value, clientspecs[i], RC_ANY,
+                                          client, DixGetAttrAccess);
+            if (rc != Success)
+                return rc;
 	}
 	else
 	    return BadMatch;
@@ -1342,8 +1346,8 @@ RecordSanityCheckRegisterClients(RecordContextPtr pContext, ClientPtr client, xR
 
     recordingClient = pContext->pRecordingClient ?
 		      pContext->pRecordingClient->clientAsMask : 0;
-    err = RecordSanityCheckClientSpecifiers((XID *)&stuff[1], stuff->nClients,
-					    recordingClient);
+    err = RecordSanityCheckClientSpecifiers(client, (XID *)&stuff[1],
+					    stuff->nClients, recordingClient);
     if (err != Success) return err;
 
     pRange = (xRecordRange *)(((XID *)&stuff[1]) + stuff->nClients);
@@ -1958,7 +1962,7 @@ ProcRecordUnregisterClients(ClientPtr client)
 	4 * stuff->nClients)
 	return BadLength;
     VERIFY_CONTEXT(pContext, stuff->context, client);
-    err = RecordSanityCheckClientSpecifiers((XID *)&stuff[1],
+    err = RecordSanityCheckClientSpecifiers(client, (XID *)&stuff[1],
 					    stuff->nClients, 0);
     if (err != Success)
 	return err;
commit 66089e9129a821cfb1983d3d35f41b975a52de5e
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Mar 25 12:55:42 2009 +1000

    xfree86: fix SWCursor check in xf86CursorSetCursor.
    
    Wrong check for inputInfo.pointer resulted in a SW cursor being rendered when
    the pointer left the screen (in a Xinerama setup).
    We must call the sprite rendering function if
    - SW cursors are enabled, or
    - The current device is not the VCP and not attached to the VCP.
    
    Reported-by: Gordon Yuan <GordonYuan at viatech.com.cn>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/ramdac/xf86Cursor.c b/hw/xfree86/ramdac/xf86Cursor.c
index b866550..b474ff3 100644
--- a/hw/xfree86/ramdac/xf86Cursor.c
+++ b/hw/xfree86/ramdac/xf86Cursor.c
@@ -302,9 +302,10 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
 
 
     if (pCurs == NullCursor) {	/* means we're supposed to remove the cursor */
-        if (ScreenPriv->SWCursor || pDev != inputInfo.pointer)
-            (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor,
-                                                  x, y);
+        if (ScreenPriv->SWCursor ||
+            !(pDev == inputInfo.pointer || !IsMaster(pDev) &&
+                GetMaster(pDev->u.master, MASTER_POINTER) == inputInfo.pointer))
+                (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor, x, y);
         else if (ScreenPriv->isUp) {
             xf86SetCursor(pScreen, NullCursor, x, y);
             ScreenPriv->isUp = FALSE;
commit afa680e495622f521cae80563511c0d284f57551
Author: David Miller <davem at davemloft.net>
Date:   Thu Jun 11 05:15:05 2009 -0700

    mi: ignore DGA events in ChangeDeviceID
    
    DGA events don't have a deviceid, so they don't need changing.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/mi/mieq.c b/mi/mieq.c
index 8ceda43..0f07b16 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -277,6 +277,10 @@ ChangeDeviceID(DeviceIntPtr dev, InternalEvent* event)
         case ET_DeviceChanged:
             event->device.deviceid = dev->id;
             break;
+#if XFreeXDGA
+	case ET_DGAEvent:
+	    break;
+#endif
         case ET_Raw:
             event->raw.deviceid = dev->id;
             break;
commit cd8abd17abcc8ae9da6704d03b97a9f134f36aab
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Wed Jun 17 14:17:07 2009 +0100

    Cygwin/X: Fix permuted args to InitPointerDeviceStruct()
    
    Fix a minor error in commit a30fef9956b296f59ea18a9ee38d0abafeb15a4e,
    new btn_labels argument to InitPointerDeviceStruct() wasn't added in
    the right place

diff --git a/hw/xwin/winmouse.c b/hw/xwin/winmouse.c
index e6d8913..b537d32 100644
--- a/hw/xwin/winmouse.c
+++ b/hw/xwin/winmouse.c
@@ -113,9 +113,9 @@ winMouseProc (DeviceIntPtr pDeviceInt, int iState)
       axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
 
       InitPointerDeviceStruct (pDevice,
-			       btn_labels,
 			       map,
 			       lngMouseButtons + lngWheelEvents,
+			       btn_labels,
 			       winMouseCtrl,
 			       GetMotionHistorySize(),
 			       2,
commit 14581afb474552716c02ca15220ca7050123c375
Author: Benjamin Close <Benjamin.Close at clearchain.com>
Date:   Thu Feb 26 17:32:10 2009 +1030

    xfree86: correctly define barriers for FreeBSD amd64
    
    Previously when compiling on freebsd amd64 we'd end up at xi86
    block (line 1315) which would define mem_barrier and write_mem_barrier
    to be NOP's. Instead they should be valid, as per the linux amd64 setup.
    
    This stops the hangs experienced by many when using the nv driver
    which would hang due to out of order dma requests as noticed in
    http://bugs.freedesktop.org/show_bug.cgi?id=3168
    
    Signed-off-by: Benjamin Close <Benjamin.Close at clearchain.com>

diff --git a/hw/xfree86/common/compiler.h b/hw/xfree86/common/compiler.h
index 40b463e..2ef95d8 100644
--- a/hw/xfree86/common/compiler.h
+++ b/hw/xfree86/common/compiler.h
@@ -462,7 +462,7 @@ extern _X_EXPORT unsigned int inb(unsigned long port);
 extern _X_EXPORT unsigned int inw(unsigned long port);
 extern _X_EXPORT unsigned int inl(unsigned long port);
  
-#   elif defined(linux) && defined(__amd64__)
+#   elif (defined(linux) || defined(__FreeBSD__)) && defined(__amd64__)
  
 #    include <inttypes.h>
 
commit e92dcb6ce07aa3cfb53e8bad5701481c106c4094
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 18 14:40:20 2009 +1000

    input: unify button numbers on master devices.
    
    Master devices provide the union of all attached slave devices' buttons,
    i.e. the number of buttons on the master device is always the number of
    buttons of the slave device with the highest number of buttons. When slaves
    are attached or detached, the master device adjusts the button number to
    reflect the new buttons.
    
    On a slave switch, this slave's button labels are copied into the master (up
    to slave->num_buttons). The remaining button labels (if any) stay as they
    are. Thus, if any of the higher buttons is still pressed, it reflects the
    label of the last pressed device that provided this button.
    
    If two devices press the same button and it is differently labelled the last
    pressed one will be reflected in the master device.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 8b69a3a..e54af09 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -588,6 +588,8 @@ DeepCopyPointerClasses(DeviceIntPtr from, DeviceIntPtr to)
         } else
             xfree(to->button->xkb_acts);
 
+         memcpy(to->button->labels, from->button->labels,
+                from->button->numButtons * sizeof(Atom));
         to->button->sourceid = from->id;
     } else if (to->button && !from->button)
     {
@@ -670,10 +672,7 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to, DeviceChangedEvent *dc
 
 
 /**
- * Change MD to look like SD by copying all classes over. An event is sent to
- * all interested clients.
- * @param device The slave device
- * @param dcce Pointer to the event struct.
+ * Send an XI2 DeviceChangedEvent to all interested clients.
  */
 void
 XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master, DeviceChangedEvent *dce)
@@ -700,7 +699,7 @@ XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master, DeviceChanged
         len += sizeof(CARD32) * nkeys; /* keycodes */
     }
 
-    dcce = xalloc(len);
+    dcce = xcalloc(1, len);
     if (!dcce)
     {
         ErrorF("[Xi] BadAlloc in SendDeviceChangedEvent.\n");
@@ -713,7 +712,7 @@ XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master, DeviceChanged
     dcce->time         = GetTimeInMillis();
     dcce->deviceid     = master->id;
     dcce->sourceid     = device->id;
-    dcce->reason       = XISlaveSwitch;
+    dcce->reason       = (dce->flags & DEVCHANGE_DEVICE_CHANGE) ? XIDeviceChange : XISlaveSwitch;
     dcce->num_classes  = 0;
     dcce->length = (len - sizeof(xEvent))/4;
 
diff --git a/dix/devices.c b/dix/devices.c
index 3d19065..b237e03 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -109,6 +109,7 @@ DevPrivateKey XTstDevicePrivateKey = &XTstDevicePrivateKeyIndex;
  */
 DeviceIntPtr vxtstpointer, vxtstkeyboard;
 
+static void RecalculateMasterButtons(DeviceIntPtr slave);
 
 /**
  * DIX property handler.
@@ -369,6 +370,8 @@ EnableDevice(DeviceIntPtr dev, BOOL sendevent)
         XISendDeviceHierarchyEvent(flags);
     }
 
+    RecalculateMasterButtons(dev);
+
     return TRUE;
 }
 
@@ -460,6 +463,9 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent)
         flags[dev->id] = XIDeviceDisabled;
         XISendDeviceHierarchyEvent(flags);
     }
+
+    RecalculateMasterButtons(dev);
+
     return TRUE;
 }
 
@@ -2260,6 +2266,77 @@ ProcQueryKeymap(ClientPtr client)
    return Success;
 }
 
+
+/**
+ * Recalculate the number of buttons for the master device. The number of
+ * buttons on the master device is equal to the number of buttons on the
+ * slave device with the highest number of buttons.
+ */
+static void
+RecalculateMasterButtons(DeviceIntPtr slave)
+{
+    DeviceIntPtr dev, master;
+    int maxbuttons = 0;
+
+    if (!slave->button || IsMaster(slave))
+        return;
+
+    master = GetMaster(slave, MASTER_POINTER);
+    if (!master)
+        return;
+
+    for (dev = inputInfo.devices; dev; dev = dev->next)
+    {
+        if (IsMaster(dev) ||
+            dev->u.master != master ||
+            !dev->button)
+            continue;
+
+        maxbuttons = max(maxbuttons, dev->button->numButtons);
+    }
+
+    if (master->button->numButtons != maxbuttons)
+    {
+        int i;
+        DeviceChangedEvent event;
+
+        memset(&event, 0, sizeof(event));
+
+        master->button->numButtons = maxbuttons;
+
+        event.header = ET_Internal;
+        event.type = ET_DeviceChanged;
+        event.time = CurrentTime;
+        event.deviceid = master->id;
+        event.flags = DEVCHANGE_POINTER_EVENT | DEVCHANGE_DEVICE_CHANGE;
+        event.buttons.num_buttons = maxbuttons;
+        memcpy(&event.buttons.names, master->button->labels, maxbuttons *
+                sizeof(Atom));
+
+        if (master->valuator)
+        {
+            event.num_valuators = master->valuator->numAxes;
+            for (i = 0; i < event.num_valuators; i++)
+            {
+                event.valuators[i].min = master->valuator->axes[i].min_value;
+                event.valuators[i].max = master->valuator->axes[i].max_value;
+                event.valuators[i].resolution = master->valuator->axes[i].resolution;
+                /* This should, eventually, be a per-axis mode */
+                event.valuators[i].mode = master->valuator->mode;
+                event.valuators[i].name = master->valuator->axes[i].label;
+            }
+        }
+
+        if (master->key)
+        {
+            event.keys.min_keycode = master->key->xkbInfo->desc->min_key_code;
+            event.keys.max_keycode = master->key->xkbInfo->desc->max_key_code;
+        }
+
+        XISendDeviceChangedEvent(master, master, &event);
+    }
+}
+
 /**
  * Attach device 'dev' to device 'master'.
  * Client is set to the client that issued the request, or NULL if it comes
@@ -2323,6 +2400,8 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
         dev->spriteInfo->paired = master;
         dev->spriteInfo->spriteOwner = FALSE;
 
+        RecalculateMasterButtons(master);
+
         if (!oldmaster)
         {
             /* Attaching a floating SD makes it disappear to XI 1 clients */
diff --git a/include/events.h b/include/events.h
index d44188b..f6405c5 100644
--- a/include/events.h
+++ b/include/events.h
@@ -119,6 +119,8 @@ typedef struct
  * pointer event or a keyboard event */
 #define DEVCHANGE_POINTER_EVENT 0x4
 #define DEVCHANGE_KEYBOARD_EVENT 0x8
+/* device capabilities changed */
+#define DEVCHANGE_DEVICE_CHANGE 0x10
 
 /**
  * Sent whenever a device's capabilities have changed.
commit 280b7f92d729ec910ffa3d18dce7bbc215be7a3c
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jun 17 22:38:24 2009 +1000

    dix: reduce MDs and xtest pointers to 7 buttons by default.
    
    MD's will soon be the union of all devices anyway. XTest pointers are only
    for the core protocol XTest stuff, so 7 buttons (lmr + 4 wheel buttons)
    should do.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/devices.c b/dix/devices.c
index 5fa196e..3d19065 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -554,7 +554,7 @@ CoreKeyboardProc(DeviceIntPtr pDev, int what)
 static int
 CorePointerProc(DeviceIntPtr pDev, int what)
 {
-#define NBUTTONS 32
+#define NBUTTONS 7
 #define NAXES 2
     BYTE map[NBUTTONS + 1];
     int i = 0;
commit 6c7d992735eebbd7a20247926e7725896348b865
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jun 17 09:11:52 2009 +1000

    Require inputproto 1.9.99.12
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/configure.ac b/configure.ac
index 1265117..2ffb7d0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -700,7 +700,7 @@ XEXT_LIB='$(top_builddir)/Xext/libXext.la'
 XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
 
 dnl Core modules for most extensions, et al.
-REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.9.3] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.11] [kbproto >= 1.0.3]"
+REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.9.3] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.12] [kbproto >= 1.0.3]"
 REQUIRED_LIBS="xfont xau fontenc [pixman-1 >= 0.13.2]"
 
 dnl HAVE_DBUS is true if we actually have the D-Bus library, whereas
commit 09cef7573938e5c08007e578e1b638bc5e1796a8
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jun 17 09:04:08 2009 +1000

    Xi: valuator/button labels are called labels now, not 'names'
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/extinit.c b/Xi/extinit.c
index 20d49e1..1376f4f 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -712,7 +712,7 @@ SDeviceChangedEvent(xXIDeviceChangedEvent* from, xXIDeviceChangedEvent* to)
             case ValuatorClass:
                 {
                     xXIValuatorInfo* ai = (xXIValuatorInfo*)any;
-                    swapl(&ai->name, n);
+                    swapl(&ai->label, n);
                     swapl(&ai->min.integral, n);
                     swapl(&ai->min.frac, n);
                     swapl(&ai->max.integral, n);
diff --git a/Xi/xiquerydevice.c b/Xi/xiquerydevice.c
index bc30888..b316c86 100644
--- a/Xi/xiquerydevice.c
+++ b/Xi/xiquerydevice.c
@@ -314,7 +314,7 @@ ListValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info, int axisnumber)
 
     info->type = ValuatorClass;
     info->length = sizeof(xXIValuatorInfo)/4;
-    info->name = v->axes[axisnumber].label;
+    info->label = v->axes[axisnumber].label;
     info->min.integral = v->axes[axisnumber].min_value;
     info->min.frac = 0;
     info->max.integral = v->axes[axisnumber].max_value;
@@ -335,7 +335,7 @@ SwapValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info)
     char n;
     swaps(&info->type, n);
     swaps(&info->length, n);
-    swapl(&info->name, n);
+    swapl(&info->label, n);
     swapl(&info->min.integral, n);
     swapl(&info->min.frac, n);
     swapl(&info->max.integral, n);
commit bc2ff5365030ad8bc11efde430b1064080dd7098
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 16 19:36:57 2009 +1000

    Xi: copy the valuator mode from SD to MD.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 98973b7..8b69a3a 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -550,6 +550,7 @@ DeepCopyPointerClasses(DeviceIntPtr from, DeviceIntPtr to)
 
         v->axisVal = (double*)(v->axes + from->valuator->numAxes);
         v->sourceid = from->id;
+        v->mode = from->valuator->mode;
     } else if (to->valuator && !from->valuator)
     {
         ClassesPtr classes;
commit 87d1f44bad608507e3995e17eb84fa0a0119796c
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 16 14:18:45 2009 +1000

    Xi: copy the button and axes labels into the XIQueryDevice reply.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiquerydevice.c b/Xi/xiquerydevice.c
index cc57815..bc30888 100644
--- a/Xi/xiquerydevice.c
+++ b/Xi/xiquerydevice.c
@@ -34,6 +34,7 @@
 
 #include "inputstr.h"
 #include <X11/X.h>
+#include <X11/Xatom.h>
 #include <X11/extensions/XI2proto.h>
 #include "xkbstr.h"
 #include "xkbsrv.h"
@@ -240,8 +241,8 @@ ListButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info)
     for (i = 0; dev && dev->button && i < dev->button->numButtons; i++)
         if (BitIsOn(dev->button->down, i))
             SetBit(bits, i);
-
-    /** XXX: button labels */
+    bits += mask_len * 4;
+    memcpy(bits, dev->button->labels, dev->button->numButtons * sizeof(Atom));
 
     return info->length * 4;
 }
@@ -313,7 +314,7 @@ ListValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info, int axisnumber)
 
     info->type = ValuatorClass;
     info->length = sizeof(xXIValuatorInfo)/4;
-    info->name = XIGetKnownProperty(AXIS_LABEL_PROP_REL_MISC); /* XXX */
+    info->name = v->axes[axisnumber].label;
     info->min.integral = v->axes[axisnumber].min_value;
     info->min.frac = 0;
     info->max.integral = v->axes[axisnumber].max_value;
commit a30fef9956b296f59ea18a9ee38d0abafeb15a4e
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 16 16:38:11 2009 +1000

    input: Add labels to buttons and valuators - ABI_XINPUT_VERSION 7
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index dc9eba7..98973b7 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1153,7 +1153,7 @@ InitProximityClassDeviceStruct(DeviceIntPtr dev)
  * @see InitValuatorClassDeviceStruct
  */
 void
-InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, int minval, int maxval,
+InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, Atom label, int minval, int maxval,
 		       int resolution, int min_res, int max_res)
 {
     AxisInfoPtr ax;
@@ -1170,6 +1170,7 @@ InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, int minval, int maxval,
     ax->resolution = resolution;
     ax->min_resolution = min_res;
     ax->max_resolution = max_res;
+    ax->label = label;
 }
 
 static void
diff --git a/dix/devices.c b/dix/devices.c
index 517829a..5fa196e 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -554,16 +554,33 @@ CoreKeyboardProc(DeviceIntPtr pDev, int what)
 static int
 CorePointerProc(DeviceIntPtr pDev, int what)
 {
-    BYTE map[33];
+#define NBUTTONS 32
+#define NAXES 2
+    BYTE map[NBUTTONS + 1];
     int i = 0;
+    Atom btn_labels[NBUTTONS] = {0};
+    Atom axes_labels[NAXES] = {0};
 
     switch (what) {
     case DEVICE_INIT:
-        for (i = 1; i <= 32; i++)
+        for (i = 1; i <= NBUTTONS; i++)
             map[i] = i;
-        if (!InitPointerDeviceStruct((DevicePtr)pDev, map, 32,
+
+	btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
+	btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
+	btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
+	btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
+	btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
+	btn_labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT);
+	btn_labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT);
+	/* don't know about the rest */
+
+	axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
+	axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
+
+        if (!InitPointerDeviceStruct((DevicePtr)pDev, map, NBUTTONS, btn_labels,
                                 (PtrCtrlProcPtr)NoopDDA,
-                                GetMotionHistorySize(), 2))
+                                GetMotionHistorySize(), NAXES, axes_labels))
         {
             ErrorF("Could not initialize device '%s'. Out of memory.\n",
                    pDev->name);
@@ -583,6 +600,9 @@ CorePointerProc(DeviceIntPtr pDev, int what)
     }
 
     return Success;
+
+#undef NBUTTONS
+#undef NAXES
 }
 
 /**
@@ -1133,7 +1153,7 @@ SetKeySymsMap(KeySymsPtr dst, KeySymsPtr src)
 }
 
 _X_EXPORT Bool
-InitButtonClassDeviceStruct(DeviceIntPtr dev, int numButtons,
+InitButtonClassDeviceStruct(DeviceIntPtr dev, int numButtons, Atom* labels,
                             CARD8 *map)
 {
     ButtonClassPtr butc;
@@ -1146,12 +1166,13 @@ InitButtonClassDeviceStruct(DeviceIntPtr dev, int numButtons,
     butc->sourceid = dev->id;
     for (i = 1; i <= numButtons; i++)
 	butc->map[i] = map[i];
+    memcpy(butc->labels, labels, numButtons * sizeof(Atom));
     dev->button = butc;
     return TRUE;
 }
 
 Bool
-InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes,
+InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes, Atom *labels,
                               int numMotionEvents, int mode)
 {
     int i;
@@ -1190,7 +1211,7 @@ InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes,
     AllocateMotionHistory(dev);
 
     for (i=0; i<numAxes; i++) {
-        InitValuatorAxisStruct(dev, i, NO_AXIS_LIMITS, NO_AXIS_LIMITS,
+        InitValuatorAxisStruct(dev, i, labels[i], NO_AXIS_LIMITS, NO_AXIS_LIMITS,
                                0, 0, 0);
 	valc->axisVal[i]=0;
     }
@@ -1459,14 +1480,14 @@ InitIntegerFeedbackClassDeviceStruct (DeviceIntPtr dev, IntegerCtrlProcPtr contr
 }
 
 Bool
-InitPointerDeviceStruct(DevicePtr device, CARD8 *map, int numButtons,
+InitPointerDeviceStruct(DevicePtr device, CARD8 *map, int numButtons, Atom* btn_labels,
                         PtrCtrlProcPtr controlProc, int numMotionEvents,
-                        int numAxes)
+                        int numAxes, Atom *axes_labels)
 {
     DeviceIntPtr dev = (DeviceIntPtr)device;
 
-    return(InitButtonClassDeviceStruct(dev, numButtons, map) &&
-	   InitValuatorClassDeviceStruct(dev, numAxes,
+    return(InitButtonClassDeviceStruct(dev, numButtons, btn_labels, map) &&
+	   InitValuatorClassDeviceStruct(dev, numAxes, axes_labels,
 					 numMotionEvents, 0) &&
 	   InitPtrFeedbackClassDeviceStruct(dev, controlProc));
 }
diff --git a/dix/getevents.c b/dix/getevents.c
index 9b1908c..7c018c1 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -214,7 +214,7 @@ CreateClassesChangedEvent(EventList* event,
     {
         dce->buttons.num_buttons = slave->button->numButtons;
         for (i = 0; i < dce->buttons.num_buttons; i++)
-            dce->buttons.names[i] = 0; /* FIXME */
+            dce->buttons.names[i] = slave->button->labels[i];
     }
     if (slave->valuator)
     {
@@ -226,7 +226,7 @@ CreateClassesChangedEvent(EventList* event,
             dce->valuators[i].resolution = slave->valuator->axes[i].resolution;
             /* This should, eventually, be a per-axis mode */
             dce->valuators[i].mode = slave->valuator->mode;
-            dce->valuators[i].name = 0; /* FIXME: */
+            dce->valuators[i].name = slave->valuator->axes[i].label;
         }
     }
     if (slave->key)
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 740852e..5e7ff53 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -46,6 +46,7 @@
 #include "exevents.h"
 #include "extinit.h"
 #include "exglobals.h"
+#include "xserver-properties.h"
 
 #define AtomFromName(x) MakeAtom(x, strlen(x), 1)
 
@@ -382,6 +383,8 @@ KdPointerProc(DeviceIntPtr pDevice, int onoff)
     DevicePtr       pDev = (DevicePtr)pDevice;
     KdPointerInfo   *pi;
     Atom            xiclass;
+    Atom            *btn_labels;
+    Atom            *axes_labels;
 
     if (!pDev)
 	return BadImplementation;
@@ -429,9 +432,47 @@ KdPointerProc(DeviceIntPtr pDevice, int onoff)
             return !Success;
         }
 
-	InitPointerDeviceStruct(pDev, pi->map, pi->nButtons,
+	btn_labels = xcalloc(pi->nButtons, sizeof(Atom));
+	if (!btn_labels)
+	    return BadAlloc;
+	axes_labels = xcalloc(pi->nAxes, sizeof(Atom));
+	if (!axes_labels) {
+	    xfree(btn_labels);
+	    return BadAlloc;
+	}
+
+	switch(pi->nAxes)
+	{
+	    default:
+	    case 7:
+		btn_labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT);
+	    case 6:
+		btn_labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT);
+	    case 5:
+		btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
+	    case 4:
+		btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
+	    case 3:
+		btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
+	    case 2:
+		btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
+	    case 1:
+		btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
+	    case 0:
+		break;
+	}
+
+	if (pi->nAxes >= 2) {
+	    axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
+	    axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
+	}
+
+	InitPointerDeviceStruct(pDev, pi->map, pi->nButtons, btn_labels,
 	    (PtrCtrlProcPtr)NoopDDA,
-	    GetMotionHistorySize(), pi->nAxes);
+	    GetMotionHistorySize(), pi->nAxes, axes_labels);
+
+        xfree(btn_labels);
+        xfree(axes_labels);
 
         if (pi->inputClass == KD_TOUCHSCREEN) {
             InitAbsoluteClassDeviceStruct(pDevice);
diff --git a/hw/vfb/InitInput.c b/hw/vfb/InitInput.c
index 4c8c996..7f2d56f 100644
--- a/hw/vfb/InitInput.c
+++ b/hw/vfb/InitInput.c
@@ -41,6 +41,8 @@ from The Open Group.
 #include "lk201kbd.h"
 #include "xkbsrv.h"
 #include <X11/keysym.h>
+#include "xserver-properties.h"
+#include "exevents.h"
 
 Bool
 LegalModifier(unsigned int key, DeviceIntPtr pDev)
@@ -87,8 +89,13 @@ vfbKeybdProc(DeviceIntPtr pDevice, int onoff)
 static int
 vfbMouseProc(DeviceIntPtr pDevice, int onoff)
 {
-    BYTE map[4];
+#define NBUTTONS 3
+#define NAXES 2
+
+    BYTE map[NBUTTONS + 1];
     DevicePtr pDev = (DevicePtr)pDevice;
+    Atom btn_labels[NBUTTONS] = {0};
+    Atom axes_labels[NAXES] = {0};
 
     switch (onoff)
     {
@@ -96,8 +103,16 @@ vfbMouseProc(DeviceIntPtr pDevice, int onoff)
 	    map[1] = 1;
 	    map[2] = 2;
 	    map[3] = 3;
-	    InitPointerDeviceStruct(pDev, map, 3,
-		(PtrCtrlProcPtr)NoopDDA, GetMotionHistorySize(), 2);
+
+            btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
+            btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
+            btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
+
+            axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
+            axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
+
+	    InitPointerDeviceStruct(pDev, map, NBUTTONS, btn_labels,
+		(PtrCtrlProcPtr)NoopDDA, GetMotionHistorySize(), NAXES, axes_labels);
 	    break;
 
     case DEVICE_ON:
@@ -112,6 +127,9 @@ vfbMouseProc(DeviceIntPtr pDevice, int onoff)
 	break;
     }
     return Success;
+
+#undef NBUTTONS
+#undef NAXES
 }
 
 void
diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
index 5d36cec..ded5216 100644
--- a/hw/xfree86/common/xf86Module.h
+++ b/hw/xfree86/common/xf86Module.h
@@ -83,7 +83,7 @@ typedef enum {
  */
 #define ABI_ANSIC_VERSION	SET_ABI_VERSION(0, 4)
 #define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(5, 0)
-#define ABI_XINPUT_VERSION	SET_ABI_VERSION(6, 0)
+#define ABI_XINPUT_VERSION	SET_ABI_VERSION(7, 0)
 #define ABI_EXTENSION_VERSION	SET_ABI_VERSION(2, 0)
 #define ABI_FONT_VERSION	SET_ABI_VERSION(0, 6)
 
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 39186ac..cb1e920 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -1010,13 +1010,13 @@ xf86XInputSetScreen(LocalDevicePtr	local,
 
 
 void
-xf86InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, int minval, int maxval,
+xf86InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, Atom label, int minval, int maxval,
 			   int resolution, int min_res, int max_res)
 {
     if (!dev || !dev->valuator)
         return;
 
-    InitValuatorAxisStruct(dev, axnum, minval, maxval, resolution, min_res,
+    InitValuatorAxisStruct(dev, axnum, label, minval, maxval, resolution, min_res,
 			   max_res);
 }
 
diff --git a/hw/xfree86/common/xf86Xinput.h b/hw/xfree86/common/xf86Xinput.h
index 04c663f..0ad5664 100644
--- a/hw/xfree86/common/xf86Xinput.h
+++ b/hw/xfree86/common/xf86Xinput.h
@@ -171,7 +171,7 @@ extern _X_EXPORT LocalDevicePtr xf86FirstLocalDevice(void);
 extern _X_EXPORT int xf86ScaleAxis(int Cx, int Sxhigh, int Sxlow, int Rxhigh, int Rxlow);
 extern _X_EXPORT void xf86XInputSetScreen(LocalDevicePtr local, int screen_number, int x, int y);
 extern _X_EXPORT void xf86ProcessCommonOptions(InputInfoPtr pInfo, pointer options);
-extern _X_EXPORT void xf86InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, int minval,
+extern _X_EXPORT void xf86InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, Atom label, int minval,
 				int maxval, int resolution, int min_res,
 				int max_res);
 extern _X_EXPORT void xf86InitValuatorDefaults(DeviceIntPtr dev, int axnum);
diff --git a/hw/xnest/Pointer.c b/hw/xnest/Pointer.c
index 8f764a6..c5d361c 100644
--- a/hw/xnest/Pointer.c
+++ b/hw/xnest/Pointer.c
@@ -33,6 +33,8 @@ is" without express or implied warranty.
 #include "Pointer.h"
 #include "Args.h"
 
+#include "xserver-properties.h"
+
 DeviceIntPtr xnestPointerDevice = NULL;
 
 void
@@ -46,6 +48,8 @@ int
 xnestPointerProc(DeviceIntPtr pDev, int onoff)
 {
   CARD8 map[MAXBUTTONS];
+  Atom btn_labels[MAXBUTTONS] = {0};
+  Atom axes_labels[2] = {0};
   int nmap;
   int i;
 
@@ -55,9 +59,21 @@ xnestPointerProc(DeviceIntPtr pDev, int onoff)
       nmap = XGetPointerMapping(xnestDisplay, map, MAXBUTTONS);
       for (i = 0; i <= nmap; i++)
 	map[i] = i; /* buttons are already mapped */
-      InitPointerDeviceStruct(&pDev->public, map, nmap,
+
+      btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
+      btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
+      btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
+      btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
+      btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
+      btn_labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT);
+      btn_labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT);
+
+      axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
+      axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
+
+      InitPointerDeviceStruct(&pDev->public, map, nmap, btn_labels,
 			      xnestChangePointerControl,
-			      GetMotionHistorySize(), 2);
+			      GetMotionHistorySize(), 2, axes_labels);
       break;
     case DEVICE_ON: 
       xnestEventMask |= XNEST_POINTER_EVENT_MASK;
diff --git a/hw/xquartz/darwin.c b/hw/xquartz/darwin.c
index f016682..fdbdfe4 100644
--- a/hw/xquartz/darwin.c
+++ b/hw/xquartz/darwin.c
@@ -51,6 +51,8 @@
 #include "exevents.h"
 #include "extinit.h"
 
+#include "xserver-properties.h"
+
 #include <sys/types.h>
 #include <sys/time.h>
 #include <sys/syslimits.h>
@@ -336,17 +338,35 @@ static Bool DarwinAddScreen(int index, ScreenPtr pScreen, int argc, char **argv)
  * DarwinMouseProc: Handle the initialization, etc. of a mouse
  */
 static int DarwinMouseProc(DeviceIntPtr pPointer, int what) {
+#define NBUTTONS 7
+#define NAXES 2
 	// 7 buttons: left, right, middle, then four scroll wheel "buttons"
-    CARD8 map[8] = {0, 1, 2, 3, 4, 5, 6, 7};
-    
+    CARD8 map[NBUTTONS + 1] = {0, 1, 2, 3, 4, 5, 6, 7};
+    Atom btn_labels[NAXES] = {0};
+    Atom axes_labels[NBUTTONS] = {0};
+
     switch (what) {
         case DEVICE_INIT:
             pPointer->public.on = FALSE;
-            
+
+            btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
+            btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
+            btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
+            btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
+            btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
+            btn_labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT);
+            btn_labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT);
+
+            axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
+            axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
+
+
             // Set button map.
-            InitPointerDeviceStruct((DevicePtr)pPointer, map, 7,
+            InitPointerDeviceStruct((DevicePtr)pPointer, map, NBUTTONS,
+                                    btn_labels,
                                     (PtrCtrlProcPtr)NoopDDA,
-                                    GetMotionHistorySize(), 2);
+                                    GetMotionHistorySize(), NAXES,
+                                    axes_labels);
             pPointer->valuator->mode = Absolute; // Relative
             InitAbsoluteClassDeviceStruct(pPointer);
 //            InitValuatorAxisStruct(pPointer, 0, 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1);
@@ -364,28 +384,43 @@ static int DarwinMouseProc(DeviceIntPtr pPointer, int what) {
     }
     
     return Success;
+#undef NBUTTONS
+#undef NAXES
 }
 
 static int DarwinTabletProc(DeviceIntPtr pPointer, int what) {
-    CARD8 map[4] = {0, 1, 2, 3};
-    
+#define NBUTTONS 3
+#define NAXES 5
+    CARD8 map[NBUTTONS + 1] = {0, 1, 2, 3};
+    Atom axes_labels[NAXES] = {0};
+    Atom btn_labels[NBUTTONS] = {0};
+
     switch (what) {
         case DEVICE_INIT:
             pPointer->public.on = FALSE;
-            
+
+            btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
+            btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
+            btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
+
+            axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_X);
+            axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_Y);
+
             // Set button map.
-            InitPointerDeviceStruct((DevicePtr)pPointer, map, 3,
+            InitPointerDeviceStruct((DevicePtr)pPointer, map, NBUTTONS,
+                                    btn_labels,
                                     (PtrCtrlProcPtr)NoopDDA,
-                                    GetMotionHistorySize(), 5);
+                                    GetMotionHistorySize(), NAXES,
+                                    axes_labels);
             pPointer->valuator->mode = Absolute; // Relative
             InitProximityClassDeviceStruct(pPointer);
 			InitAbsoluteClassDeviceStruct(pPointer);
 
-            InitValuatorAxisStruct(pPointer, 0, 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1);
-            InitValuatorAxisStruct(pPointer, 1, 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1);
-            InitValuatorAxisStruct(pPointer, 2, 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1);
-            InitValuatorAxisStruct(pPointer, 3, -XQUARTZ_VALUATOR_LIMIT, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1);
-            InitValuatorAxisStruct(pPointer, 4, -XQUARTZ_VALUATOR_LIMIT, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1);
+            InitValuatorAxisStruct(pPointer, 0, axes_labels[0], 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1);
+            InitValuatorAxisStruct(pPointer, 1, axes_labels[1], 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1);
+            InitValuatorAxisStruct(pPointer, 2, axes_labels[2], 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1);
+            InitValuatorAxisStruct(pPointer, 3, axes_labels[3], -XQUARTZ_VALUATOR_LIMIT, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1);
+            InitValuatorAxisStruct(pPointer, 4, axes_labels[4], -XQUARTZ_VALUATOR_LIMIT, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1);
 //          pPointer->use = IsXExtensionDevice;
             break;
         case DEVICE_ON:
@@ -399,6 +434,8 @@ static int DarwinTabletProc(DeviceIntPtr pPointer, int what) {
             return Success;
     }
     return Success;
+#undef NBUTTONS
+#undef NAXES
 }
 
 /*
diff --git a/hw/xwin/winmouse.c b/hw/xwin/winmouse.c
index 9cfc945..e6d8913 100644
--- a/hw/xwin/winmouse.c
+++ b/hw/xwin/winmouse.c
@@ -38,6 +38,8 @@
 
 #if defined(XFree86Server)
 #include "inputstr.h"
+#include "exevents.h" /* for button/axes labels */
+#include "xserver-properties.h"
 
 /* Peek the internal button mapping */
 static CARD8 const *g_winMouseButtonMap = NULL;
@@ -70,6 +72,8 @@ winMouseProc (DeviceIntPtr pDeviceInt, int iState)
   int			lngWheelEvents = 2;
   CARD8			*map;
   DevicePtr		pDevice = (DevicePtr) pDeviceInt;
+  Atom *btn_labels;
+  Atom axes_labels[2];
 
   switch (iState)
     {
@@ -97,13 +101,27 @@ winMouseProc (DeviceIntPtr pDeviceInt, int iState)
       map[0] = 0;
       for (i=1; i <= lngMouseButtons + lngWheelEvents; i++)
       	map[i] = i;
+
+      btn_labels = calloc((lngMouseButtons + lngWheelEvents), sizeof(Atom));
+      btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
+      btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
+      btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
+      btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
+      btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
+
+      axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
+      axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
+
       InitPointerDeviceStruct (pDevice,
+			       btn_labels,
 			       map,
 			       lngMouseButtons + lngWheelEvents,
 			       winMouseCtrl,
 			       GetMotionHistorySize(),
-			       2);
+			       2,
+			       axes_labels);
       free(map);
+      free(btn_labels);
 
 #if defined(XFree86Server)
       g_winMouseButtonMap = pDeviceInt->button->map;
diff --git a/include/exevents.h b/include/exevents.h
index 80eaa76..861d0dd 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -73,6 +73,7 @@ extern _X_EXPORT int InitProximityClassDeviceStruct(
 extern _X_EXPORT void InitValuatorAxisStruct(
 	DeviceIntPtr           /* dev */,
 	int                    /* axnum */,
+	Atom                   /* label */,
 	int                    /* minval */,
 	int                    /* maxval */,
 	int                    /* resolution */,
diff --git a/include/input.h b/include/input.h
index b3d56b3..9711fa8 100644
--- a/include/input.h
+++ b/include/input.h
@@ -274,11 +274,13 @@ extern _X_EXPORT Bool SetKeySymsMap(
 extern _X_EXPORT Bool InitButtonClassDeviceStruct(
     DeviceIntPtr /*device*/,
     int /*numButtons*/,
+    Atom* /* labels */,
     CARD8* /*map*/);
 
 extern _X_EXPORT Bool InitValuatorClassDeviceStruct(
     DeviceIntPtr /*device*/,
     int /*numAxes*/,
+    Atom* /* labels */,
     int /*numMotionEvents*/,
     int /*mode*/);
 
@@ -351,9 +353,11 @@ extern _X_EXPORT Bool InitPointerDeviceStruct(
     DevicePtr /*device*/,
     CARD8* /*map*/,
     int /*numButtons*/,
+    Atom* /* btn_labels */,
     PtrCtrlProcPtr /*controlProc*/,
     int /*numMotionEvents*/,
-    int /*numAxes*/);
+    int /*numAxes*/,
+    Atom* /* axes_labels */);
 
 extern _X_EXPORT Bool InitKeyboardDeviceStruct(
     DeviceIntPtr /*device*/,
diff --git a/include/inputstr.h b/include/inputstr.h
index 23c34a5..b284ea4 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -215,6 +215,7 @@ typedef struct _AxisInfo {
     int		max_resolution;
     int		min_value;
     int		max_value;
+    Atom	label;
 } AxisInfo, *AxisInfoPtr;
 
 typedef struct _ValuatorAccelerationRec {
@@ -254,6 +255,7 @@ typedef struct _ButtonClassRec {
     CARD8		postdown[DOWN_LENGTH];
     CARD8		map[MAP_LENGTH];
     union _XkbAction    *xkb_acts;
+    Atom		labels[MAX_BUTTONS];
 } ButtonClassRec, *ButtonClassPtr;
 
 typedef struct _FocusClassRec {
commit 17f9723f488d0470e3879c6b0dfdba61544cdd7b
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jun 17 08:37:44 2009 +1000

    input: bump to ints for deviceids - XI2 requires 16-bit deviceids.
    
    Note: ABI break, but ABI_XINPUT_VERSION has NOT been bumped. Recompile input
    drivers.
    
    Revert "Xi: return BadImplementation for deviceids 256 and above"
    This reverts commit 2b459f44f3edaea137df9a28bc7adfeb1b9f1df7.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiallowev.c b/Xi/xiallowev.c
index dd52c53..3077e1a 100644
--- a/Xi/xiallowev.c
+++ b/Xi/xiallowev.c
@@ -65,12 +65,6 @@ ProcXIAllowEvents(ClientPtr client)
     REQUEST(xXIAllowEventsReq);
     REQUEST_SIZE_MATCH(xXIAllowEventsReq);
 
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
-
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
     if (ret != Success)
 	return ret;
diff --git a/Xi/xichangecursor.c b/Xi/xichangecursor.c
index ee2d65d..7517d2c 100644
--- a/Xi/xichangecursor.c
+++ b/Xi/xichangecursor.c
@@ -74,12 +74,6 @@ int ProcXIChangeCursor(ClientPtr client)
     REQUEST(xXIChangeCursorReq);
     REQUEST_SIZE_MATCH(xXIChangeCursorReq);
 
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
-
     rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixSetAttrAccess);
     if (rc != Success)
         return rc;
diff --git a/Xi/xichangehierarchy.c b/Xi/xichangehierarchy.c
index 944bb30..ef6c394 100644
--- a/Xi/xichangehierarchy.c
+++ b/Xi/xichangehierarchy.c
@@ -238,12 +238,6 @@ ProcXIChangeHierarchy(ClientPtr client)
                             r->return_mode != XIFloating)
                         return BadValue;
 
-                    if (r->deviceid > 0xFF) /* FIXME */
-                    {
-                        client->errorValue = r->deviceid;
-                        return BadImplementation;
-                    }
-
                     rc = dixLookupDevice(&ptr, r->deviceid, client,
                                          DixDestroyAccess);
                     if (rc != Success)
@@ -344,12 +338,6 @@ ProcXIChangeHierarchy(ClientPtr client)
                                      newptr,
                                      newkeybd;
 
-                        if (r->return_pointer > 0xFF) /* FIXME */
-                        {
-                            client->errorValue = r->deviceid;
-                            return BadImplementation;
-                        }
-
                         rc = dixLookupDevice(&newptr, r->return_pointer,
                                              client, DixWriteAccess);
                         if (rc != Success)
@@ -362,12 +350,6 @@ ProcXIChangeHierarchy(ClientPtr client)
                             goto unwind;
                         }
 
-                        if (r->return_keyboard > 0xFF) /* FIXME */
-                        {
-                            client->errorValue = r->deviceid;
-                            return BadImplementation;
-                        }
-
                         rc = dixLookupDevice(&newkeybd, r->return_keyboard,
                                              client, DixWriteAccess);
                         if (rc != Success)
@@ -431,12 +413,6 @@ ProcXIChangeHierarchy(ClientPtr client)
                     xXIDetachSlaveInfo* c = (xXIDetachSlaveInfo*)any;
                     DeviceIntPtr *xtstdevice;
 
-                    if (c->deviceid > 0xFF) /* FIXME */
-                    {
-                        client->errorValue = c->deviceid;
-                        return BadImplementation;
-                    }
-
                     rc = dixLookupDevice(&ptr, c->deviceid, client,
                                           DixWriteAccess);
                     if (rc != Success)
@@ -470,17 +446,6 @@ ProcXIChangeHierarchy(ClientPtr client)
                     DeviceIntPtr newmaster;
                     DeviceIntPtr *xtstdevice;
 
-                    if (c->deviceid > 0xFF) /* FIXME */
-                    {
-                        client->errorValue = c->deviceid;
-                        return BadImplementation;
-                    }
-                    if (c->new_master > 0xFF) /* FIXME */
-                    {
-                        client->errorValue = c->new_master;
-                        return BadImplementation;
-                    }
-
                     rc = dixLookupDevice(&ptr, c->deviceid, client,
                                           DixWriteAccess);
                     if (rc != Success)
diff --git a/Xi/xigrabdev.c b/Xi/xigrabdev.c
index a825a89..95beb83 100644
--- a/Xi/xigrabdev.c
+++ b/Xi/xigrabdev.c
@@ -70,9 +70,6 @@ ProcXIGrabDevice(ClientPtr client)
     REQUEST(xXIGrabDeviceReq);
     REQUEST_AT_LEAST_SIZE(xXIGrabDeviceReq);
 
-    if (stuff->deviceid > 0xFF) /* FIXME */
-        return BadImplementation;
-
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGrabAccess);
     if (ret != Success)
 	return ret;
@@ -132,12 +129,6 @@ ProcXIUngrabDevice(ClientPtr client)
 
     REQUEST(xXIUngrabDeviceReq);
 
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
-
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
     if (ret != Success)
 	return ret;
diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index a5a9570..df0f5be 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -90,9 +90,6 @@ ProcXIPassiveGrabDevice(ClientPtr client)
     REQUEST(xXIPassiveGrabDeviceReq);
     REQUEST_AT_LEAST_SIZE(xXIPassiveGrabDeviceReq);
 
-    if (stuff->deviceid > 0xFF) /* FIXME */
-        return BadImplementation;
-
     if (stuff->deviceid == XIAllDevices)
         dev = inputInfo.all_devices;
     else if (stuff->deviceid == XIAllMasterDevices)
@@ -263,12 +260,6 @@ ProcXIPassiveUngrabDevice(ClientPtr client)
     REQUEST(xXIPassiveUngrabDeviceReq);
     REQUEST_AT_LEAST_SIZE(xXIPassiveUngrabDeviceReq);
 
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
-
     rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGrabAccess);
     if (rc != Success)
 	return rc;
diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c
index dc54d10..cd49460 100644
--- a/Xi/xiproperty.c
+++ b/Xi/xiproperty.c
@@ -1102,12 +1102,6 @@ ProcXIListProperties(ClientPtr client)
     REQUEST(xXIListPropertiesReq);
     REQUEST_SIZE_MATCH(xXIListPropertiesReq);
 
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
-
     rc = dixLookupDevice (&dev, stuff->deviceid, client, DixReadAccess);
     if (rc != Success)
         return rc;
@@ -1142,12 +1136,6 @@ ProcXIChangeProperty(ClientPtr client)
 
     REQUEST(xXIChangePropertyReq);
     REQUEST_AT_LEAST_SIZE(xXIChangePropertyReq);
-
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
     UpdateCurrentTime();
 
     rc = dixLookupDevice (&dev, stuff->deviceid, client, DixWriteAccess);
@@ -1176,13 +1164,6 @@ ProcXIDeleteProperty(ClientPtr client)
     REQUEST(xXIDeletePropertyReq);
 
     REQUEST_SIZE_MATCH(xXIDeletePropertyReq);
-
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
-
     UpdateCurrentTime();
     rc =  dixLookupDevice (&dev, stuff->deviceid, client, DixWriteAccess);
     if (rc != Success)
@@ -1211,13 +1192,6 @@ ProcXIGetProperty(ClientPtr client)
     Atom                        type;
 
     REQUEST_SIZE_MATCH(xXIGetPropertyReq);
-
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
-
     if (stuff->delete)
         UpdateCurrentTime();
     rc = dixLookupDevice (&dev, stuff->deviceid, client,
diff --git a/Xi/xiquerydevice.c b/Xi/xiquerydevice.c
index 2e480f5..cc57815 100644
--- a/Xi/xiquerydevice.c
+++ b/Xi/xiquerydevice.c
@@ -70,12 +70,6 @@ ProcXIQueryDevice(ClientPtr client)
     REQUEST(xXIQueryDeviceReq);
     REQUEST_SIZE_MATCH(xXIQueryDeviceReq);
 
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
-
     if (stuff->deviceid != XIAllDevices && stuff->deviceid != XIAllMasterDevices)
     {
         rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
diff --git a/Xi/xiquerypointer.c b/Xi/xiquerypointer.c
index 1d00b9e..e770e84 100644
--- a/Xi/xiquerypointer.c
+++ b/Xi/xiquerypointer.c
@@ -81,12 +81,6 @@ ProcXIQueryPointer(ClientPtr client)
     REQUEST(xXIQueryPointerReq);
     REQUEST_SIZE_MATCH(xXIQueryPointerReq);
 
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
-
     rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixReadAccess);
     if (rc != Success)
         return rc;
diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 7a16e85..a8763a2 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -85,12 +85,6 @@ ProcXISelectEvents(ClientPtr client)
     num_masks = stuff->num_masks;
     while(num_masks--)
     {
-        if (evmask->deviceid > 0xFF) /* FIXME */
-        {
-            client->errorValue = evmask->deviceid;
-            return BadImplementation;
-        }
-
         if (evmask->deviceid != XIAllDevices &&
             evmask->deviceid != XIAllMasterDevices)
             rc = dixLookupDevice(&dev, evmask->deviceid, client, DixReadAccess);
diff --git a/Xi/xisetclientpointer.c b/Xi/xisetclientpointer.c
index 2648074..afc13d6 100644
--- a/Xi/xisetclientpointer.c
+++ b/Xi/xisetclientpointer.c
@@ -71,11 +71,6 @@ ProcXISetClientPointer(ClientPtr client)
     REQUEST(xXISetClientPointerReq);
     REQUEST_SIZE_MATCH(xXISetClientPointerReq);
 
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
 
     rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixWriteAccess);
     if (rc != Success)
diff --git a/Xi/xisetdevfocus.c b/Xi/xisetdevfocus.c
index cd1f6a6..32f7e59 100644
--- a/Xi/xisetdevfocus.c
+++ b/Xi/xisetdevfocus.c
@@ -75,12 +75,6 @@ ProcXISetFocus(ClientPtr client)
     REQUEST(xXISetFocusReq);
     REQUEST_AT_LEAST_SIZE(xXISetFocusReq);
 
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
-
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixSetFocusAccess);
     if (ret != Success)
 	return ret;
@@ -101,12 +95,6 @@ ProcXIGetFocus(ClientPtr client)
     REQUEST(xXIGetFocusReq);
     REQUEST_AT_LEAST_SIZE(xXIGetFocusReq);
 
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
-
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetFocusAccess);
     if (ret != Success)
 	return ret;
diff --git a/Xi/xiwarppointer.c b/Xi/xiwarppointer.c
index f3acfe4..105c87a 100644
--- a/Xi/xiwarppointer.c
+++ b/Xi/xiwarppointer.c
@@ -76,12 +76,6 @@ ProcXIWarpPointer(ClientPtr client)
     REQUEST(xXIWarpPointerReq);
     REQUEST_SIZE_MATCH(xXIWarpPointerReq);
 
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
-
     /* FIXME: panoramix stuff is missing, look at ProcWarpPointer */
 
     rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixWriteAccess);
diff --git a/dix/devices.c b/dix/devices.c
index 5d4d3b2..517829a 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1050,11 +1050,11 @@ dixLookupDevice(DeviceIntPtr *pDev, int id, ClientPtr client, Mask access_mode)
     *pDev = NULL;
 
     for (dev=inputInfo.devices; dev; dev=dev->next) {
-        if (dev->id == (CARD8)id)
+        if (dev->id == id)
             goto found;
     }
     for (dev=inputInfo.off_devices; dev; dev=dev->next) {
-        if (dev->id == (CARD8)id)
+        if (dev->id == id)
 	    goto found;
     }
     return BadDevice;
diff --git a/include/inputstr.h b/include/inputstr.h
index 10062ad..23c34a5 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -489,7 +489,7 @@ typedef struct _DeviceIntRec {
     int         type;                   /* MASTER_POINTER, MASTER_KEYBOARD, SLAVE */
     Atom		xinput_type;
     char		*name;
-    CARD8		id;
+    int			id;
     KeyClassPtr		key;
     ValuatorClassPtr	valuator;
     ButtonClassPtr	button;
commit cbeb73e2055f6c013c8fe6325851f2631170137d
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 16 10:51:52 2009 +1000

    Xi: return current valuator values in XIQueryDevice.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiquerydevice.c b/Xi/xiquerydevice.c
index 2c01863..2e480f5 100644
--- a/Xi/xiquerydevice.c
+++ b/Xi/xiquerydevice.c
@@ -324,6 +324,8 @@ ListValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info, int axisnumber)
     info->min.frac = 0;
     info->max.integral = v->axes[axisnumber].max_value;
     info->max.frac = 0;
+    info->value.integral = (int)v->axisVal[axisnumber];
+    info->value.frac = (int)(v->axisVal[axisnumber] * (1 << 16) * (1 << 16));
     info->resolution = v->axes[axisnumber].resolution;
     info->number = axisnumber;
     info->mode = v->mode; /* Server doesn't have per-axis mode yet */
commit 80837dbefd9d5e96ab5c1f4b4c2d5c66ce17ce67
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 16 10:51:17 2009 +1000

    input: change axisVal from uint to double.
    
    With subpixel support, uint just doesn't cut it.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 0d8322a..dc9eba7 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -539,7 +539,7 @@ DeepCopyPointerClasses(DeviceIntPtr from, DeviceIntPtr to)
 
         to->valuator = xrealloc(to->valuator, sizeof(ValuatorClassRec) +
                 from->valuator->numAxes * sizeof(AxisInfo) +
-                from->valuator->numAxes * sizeof(unsigned int));
+                from->valuator->numAxes * sizeof(double));
         v = to->valuator;
         if (!v)
             FatalError("[Xi] no memory for class shift.\n");
@@ -548,7 +548,7 @@ DeepCopyPointerClasses(DeviceIntPtr from, DeviceIntPtr to)
         v->axes = (AxisInfoPtr)&v[1];
         memcpy(v->axes, from->valuator->axes, v->numAxes * sizeof(AxisInfo));
 
-        v->axisVal = (int*)(v->axes + from->valuator->numAxes);
+        v->axisVal = (double*)(v->axes + from->valuator->numAxes);
         v->sourceid = from->id;
     } else if (to->valuator && !from->valuator)
     {
@@ -844,6 +844,7 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
         {
             /* XXX: Relative/Absolute mode */
             v->axisVal[i] = event->valuators.data[i];
+            v->axisVal[i] += event->valuators.data_frac[i];
         }
     }
 
diff --git a/Xi/queryst.c b/Xi/queryst.c
index 2b20837..c6858e4 100644
--- a/Xi/queryst.c
+++ b/Xi/queryst.c
@@ -85,7 +85,7 @@ ProcXQueryDeviceState(ClientPtr client)
     xValuatorState *tv;
     xQueryDeviceStateReply rep;
     DeviceIntPtr dev;
-    int *values;
+    double *values;
 
     REQUEST(xQueryDeviceStateReq);
     REQUEST_SIZE_MATCH(xQueryDeviceStateReq);
diff --git a/dix/devices.c b/dix/devices.c
index a5b111c..5d4d3b2 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1170,7 +1170,7 @@ InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes,
 
     valc = (ValuatorClassPtr)xcalloc(1, sizeof(ValuatorClassRec) +
 				    numAxes * sizeof(AxisInfo) +
-				    numAxes * sizeof(unsigned int));
+				    numAxes * sizeof(double));
     if (!valc)
 	return FALSE;
 
@@ -1184,7 +1184,7 @@ InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes,
     valc->numAxes = numAxes;
     valc->mode = mode;
     valc->axes = (AxisInfoPtr)(valc + 1);
-    valc->axisVal = (int *)(valc->axes + numAxes);
+    valc->axisVal = (double *)(valc->axes + numAxes);
     dev->valuator = valc;
 
     AllocateMotionHistory(dev);
diff --git a/include/inputstr.h b/include/inputstr.h
index d7aedac..10062ad 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -235,7 +235,7 @@ typedef struct _ValuatorClassRec {
 
     AxisInfoPtr 	  axes;
     unsigned short	  numAxes;
-    int			  *axisVal; /* always absolute, but device-coord system */
+    double		  *axisVal; /* always absolute, but device-coord system */
     CARD8	 	  mode;
     ValuatorAccelerationRec	accelScheme;
 } ValuatorClassRec, *ValuatorClassPtr;
commit 25b6fc4a42f7698e6ae0b16becb316bfd7835d05
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 16 10:48:48 2009 +1000

    Xi: last_valuator is used like an index, so range it accordingly.
    
    The previous code would always skip the last valuator due to a wrong
    upper boundary in the loop. last_valuator is the index of the last set
    valuator - which also means it must be initialized to -1, not 0.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 821644d..0d8322a 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -818,7 +818,7 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
 
     /* Update device axis */
     /* Check valuators first */
-    last_valuator = 0;
+    last_valuator = -1;
     for (i = 0; i < MAX_VALUATORS; i++)
     {
         if (BitIsOn(&event->valuators.mask, i))
@@ -838,7 +838,7 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
         }
     }
 
-    for (i = 0; i < last_valuator && i < v->numAxes; i++)
+    for (i = 0; i <= last_valuator && i < v->numAxes; i++)
     {
         if (BitIsOn(&event->valuators.mask, i))
         {
commit 3fc762ea9474cf92f6b7ef60dd0bb68f59385272
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 16 10:48:03 2009 +1000

    Xi: Motion events update the device state too.
    
    Without this line the device's axis values don't get updated properly for
    pure motion events.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index e404b84..821644d 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -796,6 +796,7 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
         case ET_DeviceChanged:
             ChangeMasterDeviceClasses(device, (DeviceChangedEvent*)event);
             return DONT_PROCESS; /* event has been sent already */
+        case ET_Motion:
         case ET_ButtonPress:
         case ET_ButtonRelease:
         case ET_KeyPress:
commit ad6347afead500fefb34131841f4beb5b03ad4ec
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 16 16:35:40 2009 +1000

    Xi: don't use a constant number for class sizes - use sizeof instead
    
    The protocol is still changing, and having to debug crap like this is
    annoying.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiquerydevice.c b/Xi/xiquerydevice.c
index 98325e1..2c01863 100644
--- a/Xi/xiquerydevice.c
+++ b/Xi/xiquerydevice.c
@@ -237,7 +237,7 @@ ListButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info)
 
     info->type = ButtonClass;
     info->num_buttons = dev->button->numButtons;
-    info->length = 2 + mask_len + info->num_buttons;
+    info->length = sizeof(xXIButtonInfo)/4 + mask_len + info->num_buttons;
     info->sourceid = dev->button->sourceid;
 
     bits = (unsigned char*)&info[1];
@@ -281,7 +281,7 @@ ListKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info)
 
     info->type = KeyClass;
     info->num_keycodes = xkb->max_key_code - xkb->min_key_code + 1;
-    info->length = 2 + info->num_keycodes;
+    info->length = sizeof(xXIKeyInfo)/4 + info->num_keycodes;
     info->sourceid = dev->key->sourceid;
 
     kc = (uint32_t*)&info[1];
commit d5a15e65b7d2fdda14fb719e3ebf076cce896386
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Jun 14 09:15:42 2009 +1000

    Xi: include button state in XIButtonInfo.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 107ffce..e404b84 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -686,6 +686,7 @@ XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master, DeviceChanged
     {
         len += sizeof(xXIButtonInfo);
         len += dce->buttons.num_buttons * sizeof(Atom); /* button names */
+        len += ((((dce->buttons.num_buttons + 7)/8) + 3)/4) * 4;
     }
     if (dce->num_valuators)
         len += sizeof(xXIValuatorInfo) * dce->num_valuators;
diff --git a/Xi/xiquerydevice.c b/Xi/xiquerydevice.c
index b523f38..98325e1 100644
--- a/Xi/xiquerydevice.c
+++ b/Xi/xiquerydevice.c
@@ -205,6 +205,7 @@ SizeDeviceClasses(DeviceIntPtr dev)
     {
         len += sizeof(xXIButtonInfo);
         len += dev->button->numButtons * sizeof(Atom);
+        len += ((((dev->button->numButtons + 7)/8) + 3)/4) * 4;
     }
 
     if (dev->key)
@@ -228,11 +229,24 @@ SizeDeviceClasses(DeviceIntPtr dev)
 int
 ListButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info)
 {
+    unsigned char *bits;
+    int mask_len;
+    int i;
+
+    mask_len = (((dev->button->numButtons + 7)/8) + 3)/4; /* 4-byte units*/
+
     info->type = ButtonClass;
     info->num_buttons = dev->button->numButtons;
-    info->length = 2 + info->num_buttons;
+    info->length = 2 + mask_len + info->num_buttons;
     info->sourceid = dev->button->sourceid;
 
+    bits = (unsigned char*)&info[1];
+    memset(bits, 0, mask_len * 4);
+
+    for (i = 0; dev && dev->button && i < dev->button->numButtons; i++)
+        if (BitIsOn(dev->button->down, i))
+            SetBit(bits, i);
+
     /** XXX: button labels */
 
     return info->length * 4;
commit 01241b4247a7ad0974d48412cc0d88e1a09a3c49
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Jun 7 19:43:11 2009 +1000

    Xi: Add support for sourceid in the device classes.

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 24fd11f..107ffce 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -199,6 +199,8 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
     if (device == master)
         return;
 
+    mk->sourceid = device->id;
+
     for (i = 0; i < 8; i++)
         mk->modifierKeyCount[i] = dk->modifierKeyCount[i];
 
@@ -470,6 +472,7 @@ DeepCopyKeyboardClasses(DeviceIntPtr from, DeviceIntPtr to)
                 FatalError("[Xi] no memory for trace.\n");
             memcpy(to->focus->trace, from->focus->trace,
                     from->focus->traceSize * sizeof(WindowPtr));
+            to->focus->sourceid = from->id;
         }
     } else if (to->focus)
     {
@@ -546,6 +549,7 @@ DeepCopyPointerClasses(DeviceIntPtr from, DeviceIntPtr to)
         memcpy(v->axes, from->valuator->axes, v->numAxes * sizeof(AxisInfo));
 
         v->axisVal = (int*)(v->axes + from->valuator->numAxes);
+        v->sourceid = from->id;
     } else if (to->valuator && !from->valuator)
     {
         ClassesPtr classes;
@@ -582,6 +586,8 @@ DeepCopyPointerClasses(DeviceIntPtr from, DeviceIntPtr to)
                     sizeof(XkbAction));
         } else
             xfree(to->button->xkb_acts);
+
+        to->button->sourceid = from->id;
     } else if (to->button && !from->button)
     {
         ClassesPtr classes;
@@ -606,6 +612,7 @@ DeepCopyPointerClasses(DeviceIntPtr from, DeviceIntPtr to)
                 classes->proximity = NULL;
         }
         memcpy(to->proximity, from->proximity, sizeof(ProximityClassRec));
+        to->proximity->sourceid = from->id;
     } else if (to->proximity)
     {
         ClassesPtr classes;
@@ -630,6 +637,7 @@ DeepCopyPointerClasses(DeviceIntPtr from, DeviceIntPtr to)
                 classes->absolute = NULL;
         }
         memcpy(to->absolute, from->absolute, sizeof(AbsoluteClassRec));
+        to->absolute->sourceid = from->id;
     } else if (to->absolute)
     {
         ClassesPtr classes;
@@ -1127,6 +1135,7 @@ InitProximityClassDeviceStruct(DeviceIntPtr dev)
     proxc = (ProximityClassPtr) xalloc(sizeof(ProximityClassRec));
     if (!proxc)
 	return FALSE;
+    proxc->sourceid = dev->id;
     dev->proximity = proxc;
     return TRUE;
 }
diff --git a/Xi/xiquerydevice.c b/Xi/xiquerydevice.c
index 07ddfa1..b523f38 100644
--- a/Xi/xiquerydevice.c
+++ b/Xi/xiquerydevice.c
@@ -231,6 +231,7 @@ ListButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info)
     info->type = ButtonClass;
     info->num_buttons = dev->button->numButtons;
     info->length = 2 + info->num_buttons;
+    info->sourceid = dev->button->sourceid;
 
     /** XXX: button labels */
 
@@ -245,6 +246,7 @@ SwapButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info)
     int i;
     swaps(&info->type, n);
     swaps(&info->length, n);
+    swaps(&info->sourceid, n);
 
     for (i = 0, btn = (Atom*)&info[1]; i < info->num_buttons; i++, btn++)
         swaps(btn, n);
@@ -266,6 +268,7 @@ ListKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info)
     info->type = KeyClass;
     info->num_keycodes = xkb->max_key_code - xkb->min_key_code + 1;
     info->length = 2 + info->num_keycodes;
+    info->sourceid = dev->key->sourceid;
 
     kc = (uint32_t*)&info[1];
     for (i = xkb->min_key_code; i <= xkb->max_key_code; i++, kc++)
@@ -282,6 +285,7 @@ SwapKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info)
     int i;
     swaps(&info->type, n);
     swaps(&info->length, n);
+    swaps(&info->sourceid, n);
 
     for (i = 0, key = (uint32_t*)&info[1]; i < info->num_keycodes; i++, key++)
         swapl(key, n);
@@ -309,6 +313,7 @@ ListValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info, int axisnumber)
     info->resolution = v->axes[axisnumber].resolution;
     info->number = axisnumber;
     info->mode = v->mode; /* Server doesn't have per-axis mode yet */
+    info->sourceid = v->sourceid;
 
     return info->length * 4;
 }
@@ -325,6 +330,7 @@ SwapValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info)
     swapl(&info->max.integral, n);
     swapl(&info->max.frac, n);
     swaps(&info->number, n);
+    swaps(&info->sourceid, n);
 }
 
 int GetDeviceUse(DeviceIntPtr dev, uint16_t *attachment)
diff --git a/dix/devices.c b/dix/devices.c
index 2b03588..a5b111c 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1143,6 +1143,7 @@ InitButtonClassDeviceStruct(DeviceIntPtr dev, int numButtons,
     if (!butc)
 	return FALSE;
     butc->numButtons = numButtons;
+    butc->sourceid = dev->id;
     for (i = 1; i <= numButtons; i++)
 	butc->map[i] = map[i];
     dev->button = butc;
@@ -1173,6 +1174,7 @@ InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes,
     if (!valc)
 	return FALSE;
 
+    valc->sourceid = dev->id;
     valc->motion = NULL;
     valc->first_motion = 0;
     valc->last_motion = 0;
@@ -1300,6 +1302,8 @@ InitAbsoluteClassDeviceStruct(DeviceIntPtr dev)
     abs->following = 0;
     abs->screen = 0;
 
+    abs->sourceid = dev->id;
+
     dev->absolute = abs;
 
     return TRUE;
@@ -1319,6 +1323,7 @@ InitFocusClassDeviceStruct(DeviceIntPtr dev)
     focc->trace = (WindowPtr *)NULL;
     focc->traceSize = 0;
     focc->traceGood = 0;
+    focc->sourceid = dev->id;
     dev->focus = focc;
     return TRUE;
 }
diff --git a/include/inputstr.h b/include/inputstr.h
index ffeedb1..d7aedac 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -202,6 +202,7 @@ typedef struct _GrabRec {
 } GrabRec;
 
 typedef struct _KeyClassRec {
+    int			sourceid;
     CARD8		down[DOWN_LENGTH];
     CARD8		postdown[DOWN_LENGTH];
     int                 modifierKeyCount[8];
@@ -224,6 +225,7 @@ typedef struct _ValuatorAccelerationRec {
 } ValuatorAccelerationRec, *ValuatorAccelerationPtr;
 
 typedef struct _ValuatorClassRec {
+    int                   sourceid;
     int		 	  numMotionEvents;
     int                   first_motion;
     int                   last_motion;
@@ -239,6 +241,7 @@ typedef struct _ValuatorClassRec {
 } ValuatorClassRec, *ValuatorClassPtr;
 
 typedef struct _ButtonClassRec {
+    int			sourceid;
     CARD8		numButtons;
     CARD8		buttonsDown;	/* number of buttons currently down
                                            This counts logical buttons, not
@@ -254,6 +257,7 @@ typedef struct _ButtonClassRec {
 } ButtonClassRec, *ButtonClassPtr;
 
 typedef struct _FocusClassRec {
+    int		sourceid;
     WindowPtr	win; /* May be set to a int constant (e.g. PointerRootWin)! */
     int		revert;
     TimeStamp	time;
@@ -263,10 +267,12 @@ typedef struct _FocusClassRec {
 } FocusClassRec, *FocusClassPtr;
 
 typedef struct _ProximityClassRec {
+    int		sourceid;
     char	pad;
 } ProximityClassRec, *ProximityClassPtr;
 
 typedef struct _AbsoluteClassRec {
+    int         sourceid;
     /* Calibration. */
     int         min_x;
     int         max_x;
diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c
index e707f7a..86a7a11 100644
--- a/xkb/xkbInit.c
+++ b/xkb/xkbInit.c
@@ -522,6 +522,7 @@ InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet *rmlvo,
         ErrorF("XKB: Failed to allocate key class\n");
         return False;
     }
+    dev->key->sourceid = dev->id;
 
     dev->kbdfeed = xcalloc(1, sizeof(*dev->kbdfeed));
     if (!dev->kbdfeed) {
commit d230742ea820a21a3f1ed0c58b5e6d8680b2f2aa
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 16 12:13:16 2009 +1000

    Xi: namespace XI2 files.
    
    Some files (notably those merged with MPX before XI2 came along) didn't use
    a 'xi' prefix. This patch changes all of them to meaningful names.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/Makefile.am b/Xi/Makefile.am
index 56404b6..69c7886 100644
--- a/Xi/Makefile.am
+++ b/Xi/Makefile.am
@@ -5,12 +5,8 @@ AM_CFLAGS = $(DIX_CFLAGS)
 libXi_la_SOURCES =	\
 	allowev.c \
 	allowev.h \
-        chdevcur.c \
-        chdevcur.h \
 	chgdctl.c \
 	chgdctl.h \
-        chdevhier.c \
-        chdevhier.h \
 	chgfctl.c \
 	chgfctl.h \
 	chgkbd.c \
@@ -30,8 +26,6 @@ libXi_la_SOURCES =	\
 	extinit.c \
 	getbmap.c \
 	getbmap.h \
-	getcptr.c \
-	getcptr.h \
 	getdctl.c \
 	getdctl.h \
 	getfctl.c \
@@ -60,12 +54,6 @@ libXi_la_SOURCES =	\
 	listdev.h \
 	opendev.c \
 	opendev.h \
-	querydev.c \
-	querydev.h \
-	queryversion.h \
-	queryversion.c \
-	querydp.c \
-	querydp.h \
 	queryst.c \
 	queryst.h \
 	selectev.c \
@@ -74,8 +62,6 @@ libXi_la_SOURCES =	\
 	sendexev.h \
 	setbmap.c \
 	setbmap.h \
-	setcptr.c \
-	setcptr.h \
 	setdval.c \
 	setdval.h \
 	setfocus.c \
@@ -90,19 +76,33 @@ libXi_la_SOURCES =	\
 	ungrdevb.h \
 	ungrdevk.c \
 	ungrdevk.h \
-	warpdevp.c \
-	warpdevp.h \
 	xiallowev.c \
 	xiallowev.h \
+	xichangecursor.c \
+	xichangecursor.h \
+	xichangehierarchy.c \
+	xichangehierarchy.h \
+	xigetclientpointer.c \
+	xigetclientpointer.h \
 	xigrabdev.c \
 	xigrabdev.h \
 	xipassivegrab.h \
 	xipassivegrab.c \
 	xiproperty.c \
 	xiproperty.h \
+	xiquerydevice.c \
+	xiquerydevice.h \
+	xiquerypointer.c \
+	xiquerypointer.h \
+	xiqueryversion.c \
+	xiqueryversion.h \
 	xiselectev.c \
 	xiselectev.h \
+	xisetclientpointer.c \
+	xisetclientpointer.h \
 	xisetdevfocus.c \
-	xisetdevfocus.h
+	xisetdevfocus.h \
+	xiwarppointer.c \
+	xiwarppointer.h
 
 EXTRA_DIST = stubs.c
diff --git a/Xi/chdevcur.c b/Xi/chdevcur.c
deleted file mode 100644
index 9dba78b..0000000
--- a/Xi/chdevcur.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-/***********************************************************************
- *
- * Request to change a given device pointer's cursor.
- *
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>	/* for inputstr.h    */
-#include <X11/Xproto.h>	/* Request macro     */
-#include "inputstr.h"	/* DeviceIntPtr      */
-#include "windowstr.h"	/* window structure  */
-#include "scrnintstr.h"	/* screen structure  */
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XI2proto.h>
-#include "extnsionst.h"
-#include "exevents.h"
-#include "exglobals.h"
-#include "input.h"
-
-#include "chdevcur.h"
-
-/***********************************************************************
- *
- * This procedure allows a client to set one pointer's cursor.
- *
- */
-
-int
-SProcXIChangeCursor(ClientPtr client)
-{
-    char n;
-
-    REQUEST(xXIChangeCursorReq);
-    swaps(&stuff->length, n);
-    REQUEST_SIZE_MATCH(xXIChangeCursorReq);
-    return (ProcXIChangeCursor(client));
-}
-
-int ProcXIChangeCursor(ClientPtr client)
-{
-    int rc;
-    WindowPtr pWin    = NULL;
-    DeviceIntPtr pDev = NULL;
-    CursorPtr pCursor = NULL;
-
-    REQUEST(xXIChangeCursorReq);
-    REQUEST_SIZE_MATCH(xXIChangeCursorReq);
-
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
-
-    rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixSetAttrAccess);
-    if (rc != Success)
-        return rc;
-
-    if (stuff->win != None)
-    {
-        rc = dixLookupWindow(&pWin, stuff->win, client, DixSetAttrAccess);
-        if (rc != Success)
-            return rc;
-    }
-
-    if (stuff->cursor == None)
-    {
-        if (pWin == WindowTable[pWin->drawable.pScreen->myNum])
-            pCursor = rootCursor;
-        else
-            pCursor = (CursorPtr)None;
-    }
-    else
-    {
-	rc = dixLookupResourceByType((pointer *)&pCursor, stuff->cursor,
-				     RT_CURSOR, client, DixReadAccess);
-	if (rc != Success)
-	    return (rc == BadValue) ? BadCursor : rc;
-    }
-
-    ChangeWindowDeviceCursor(pWin, pDev, pCursor);
-
-    return Success;
-}
-
diff --git a/Xi/chdevcur.h b/Xi/chdevcur.h
deleted file mode 100644
index dc6ccb1..0000000
--- a/Xi/chdevcur.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifndef CHDEVCUR_H
-#define CHDEVCUR_H 1
-
-int SProcXIChangeCursor(ClientPtr /* client */);
-int ProcXIChangeCursor(ClientPtr /* client */);
-
-#endif /* CHDEVCUR_H */
diff --git a/Xi/chdevhier.c b/Xi/chdevhier.c
deleted file mode 100644
index 3f2bb93..0000000
--- a/Xi/chdevhier.c
+++ /dev/null
@@ -1,540 +0,0 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- * Copyright 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-/***********************************************************************
- *
- * Request change in the device hierarchy.
- *
- */
-
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>	/* for inputstr.h    */
-#include <X11/Xproto.h>	/* Request macro     */
-#include "inputstr.h"	/* DeviceIntPtr      */
-#include "windowstr.h"	/* window structure  */
-#include "scrnintstr.h"	/* screen structure  */
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XI2proto.h>
-#include <X11/extensions/geproto.h>
-#include "extnsionst.h"
-#include "exevents.h"
-#include "exglobals.h"
-#include "geext.h"
-#include "xace.h"
-#include "querydev.h" /* for GetDeviceUse */
-
-#include "xkbsrv.h"
-
-#include "chdevhier.h"
-
-extern DevPrivateKey XTstDevicePrivateKey;
-
-/**
- * Send the current state of the device hierarchy to all clients.
- */
-void XISendDeviceHierarchyEvent(int flags[MAXDEVICES])
-{
-    xXIHierarchyEvent *ev;
-    xXIHierarchyInfo *info;
-    DeviceIntRec dummyDev;
-    DeviceIntPtr dev;
-    int i;
-
-    if (!flags)
-        return;
-
-    ev = xcalloc(1, sizeof(xXIHierarchyEvent) +
-                 MAXDEVICES * sizeof(xXIHierarchyInfo));
-    ev->type = GenericEvent;
-    ev->extension = IReqCode;
-    ev->evtype = XI_HierarchyChanged;
-    ev->time = GetTimeInMillis();
-    ev->flags = 0;
-    ev->num_info = inputInfo.numDevices;
-
-    info = (xXIHierarchyInfo*)&ev[1];
-    for (dev = inputInfo.devices; dev; dev = dev->next)
-    {
-        info->deviceid = dev->id;
-        info->enabled = dev->enabled;
-        info->use = GetDeviceUse(dev, &info->attachment);
-        info->flags = flags[dev->id];
-        ev->flags |= info->flags;
-        info++;
-    }
-    for (dev = inputInfo.off_devices; dev; dev = dev->next)
-    {
-        info->deviceid = dev->id;
-        info->enabled = dev->enabled;
-        info->use = GetDeviceUse(dev, &info->attachment);
-        info->flags = flags[dev->id];
-        ev->flags |= info->flags;
-        info++;
-    }
-
-
-    for (i = 0; i < MAXDEVICES; i++)
-    {
-        if (flags[i] & (XIMasterRemoved | XISlaveRemoved))
-        {
-            info->deviceid = i;
-            info->enabled = FALSE;
-            info->flags = flags[i];
-            info->use = 0;
-            ev->flags |= info->flags;
-            ev->num_info++;
-            info++;
-        }
-    }
-
-    ev->length = (ev->num_info * sizeof(xXIHierarchyInfo))/4;
-
-    dummyDev.id = XIAllDevices;
-    SendEventToAllWindows(&dummyDev, (XI_HierarchyChangedMask >> 8), (xEvent*)ev, 1);
-}
-
-
-/***********************************************************************
- *
- * This procedure allows a client to change the device hierarchy through
- * adding new master devices, removing them, etc.
- *
- */
-
-int SProcXIChangeHierarchy(ClientPtr client)
-{
-    char n;
-
-    REQUEST(xXIChangeHierarchyReq);
-    swaps(&stuff->length, n);
-    return (ProcXIChangeHierarchy(client));
-}
-
-#define SWAPIF(cmd) if (client->swapped) { cmd; }
-
-int
-ProcXIChangeHierarchy(ClientPtr client)
-{
-    DeviceIntPtr ptr, keybd, xtstptr, xtstkeybd;
-    xXIAnyHierarchyChangeInfo *any;
-    int required_len = sizeof(xXIChangeHierarchyReq);
-    char n;
-    int rc = Success;
-    int flags[MAXDEVICES] = {0};
-
-    REQUEST(xXIChangeHierarchyReq);
-    REQUEST_AT_LEAST_SIZE(xXIChangeHierarchyReq);
-
-    if (!stuff->num_changes)
-        return rc;
-
-    any = (xXIAnyHierarchyChangeInfo*)&stuff[1];
-    while(stuff->num_changes--)
-    {
-        SWAPIF(swapl(&any->type, n));
-        SWAPIF(swaps(&any->length, n));
-
-        required_len += any->length;
-        if ((stuff->length * 4) < required_len)
-            return BadLength;
-
-        switch(any->type)
-        {
-            case XIAddMaster:
-                {
-                    xXIAddMasterInfo* c = (xXIAddMasterInfo*)any;
-                    char* name;
-
-                    SWAPIF(swaps(&c->name_len, n));
-                    name = xcalloc(c->name_len + 1, sizeof(char));
-                    strncpy(name, (char*)&c[1], c->name_len);
-
-
-                    rc = AllocDevicePair(client, name, &ptr, &keybd, TRUE);
-                    if (rc != Success)
-                    {
-                        xfree(name);
-                        goto unwind;
-                    }
-
-                    if (!c->send_core)
-                        ptr->coreEvents = keybd->coreEvents =  FALSE;
-
-		    /* Allocate virtual slave devices for xtest events */
-                    rc = AllocXtstDevice(client, name, &xtstptr, &xtstkeybd);
-                    if (rc != Success)
-                    {
-
-                        xfree(name);
-                        goto unwind;
-                    }
-
-                    ActivateDevice(ptr, FALSE);
-                    ActivateDevice(keybd, FALSE);
-                    flags[ptr->id] |= XIMasterAdded;
-                    flags[keybd->id] |= XIMasterAdded;
-
-                    ActivateDevice(xtstptr, FALSE);
-                    ActivateDevice(xtstkeybd, FALSE);
-                    flags[xtstptr->id] |= XISlaveAdded;
-                    flags[xtstkeybd->id] |= XISlaveAdded;
-
-                    if (c->enable)
-                    {
-                        EnableDevice(ptr, FALSE);
-                        EnableDevice(keybd, FALSE);
-                        flags[ptr->id] |= XIDeviceEnabled;
-                        flags[keybd->id] |= XIDeviceEnabled;
-
-                        EnableDevice(xtstptr, FALSE);
-                        EnableDevice(xtstkeybd, FALSE);
-                        flags[xtstptr->id] |= XIDeviceEnabled;
-                        flags[xtstkeybd->id] |= XIDeviceEnabled;
-                    }
-
-                    /* Attach the XTest virtual devices to the newly
-                       created master device */
-                    AttachDevice(NULL, xtstptr, ptr);
-                    AttachDevice(NULL, xtstkeybd, keybd);
-                    flags[xtstptr->id] |= XISlaveAttached;
-                    flags[xtstkeybd->id] |= XISlaveAttached;
-
-                    xfree(name);
-                }
-                break;
-            case XIRemoveMaster:
-                {
-                    xXIRemoveMasterInfo* r = (xXIRemoveMasterInfo*)any;
-                    DeviceIntPtr xtstdevice;
-
-                    if (r->return_mode != XIAttachToMaster &&
-                            r->return_mode != XIFloating)
-                        return BadValue;
-
-                    if (r->deviceid > 0xFF) /* FIXME */
-                    {
-                        client->errorValue = r->deviceid;
-                        return BadImplementation;
-                    }
-
-                    rc = dixLookupDevice(&ptr, r->deviceid, client,
-                                         DixDestroyAccess);
-                    if (rc != Success)
-                        goto unwind;
-
-                    if (!IsMaster(ptr))
-                    {
-                        client->errorValue = r->deviceid;
-                        rc = BadDevice;
-                        goto unwind;
-                    }
-
-                    /* XXX: For now, don't allow removal of VCP, VCK */
-                    if (ptr == inputInfo.pointer ||
-                            ptr == inputInfo.keyboard)
-                    {
-                        rc = BadDevice;
-                        goto unwind;
-                    }
-
-                    for(xtstdevice = inputInfo.devices; xtstdevice ; xtstdevice = xtstdevice->next )
-                        if( !IsMaster(xtstdevice) && xtstdevice->u.master == ptr &&
-                            dixLookupPrivate(&xtstdevice->devPrivates, XTstDevicePrivateKey ))
-                            break;
-
-                    rc = dixLookupDevice(&xtstptr, xtstdevice->id, client,
-                                         DixDestroyAccess);
-                    if (rc != Success)
-                        goto unwind;
-
-                    /* find keyboards to destroy */
-                    if (IsPointerDevice(ptr))
-                    {
-                        rc = dixLookupDevice(&keybd,
-                                             ptr->spriteInfo->paired->id,
-                                             client,
-                                             DixDestroyAccess);
-                        if (rc != Success)
-                            goto unwind;
-
-                    }
-                    else
-                    {
-                        keybd = ptr;
-                        rc = dixLookupDevice(&ptr,
-                                             keybd->spriteInfo->paired->id,
-                                             client,
-                                             DixDestroyAccess);
-                        if (rc != Success)
-                            goto unwind;
-
-                    }
-
-                    /* handle xtst pointer / keyboard slave devices */
-                    if ( IsPointerDevice(xtstptr))
-                    {
-                        /* Search the matching keyboard */
-                        for(xtstdevice = inputInfo.devices; xtstdevice ; xtstdevice = xtstdevice->next )
-                            if( !IsMaster(xtstdevice) &&
-                                xtstdevice->u.master == keybd &&
-                                IsKeyboardDevice(xtstdevice) &&
-                                dixLookupPrivate(&xtstdevice->devPrivates, XTstDevicePrivateKey ))
-                                break;
-
-                        rc = dixLookupDevice(&xtstkeybd,
-                                             xtstdevice->id,
-                                             client,
-                                             DixDestroyAccess);
-
-                        if (rc != Success)
-                            goto unwind;
-                    }
-                    else
-                    {
-                        xtstkeybd = xtstptr;
-                        /* Search the matching pointer */
-                        for(xtstdevice = inputInfo.devices; xtstdevice ; xtstdevice = xtstdevice->next )
-                            if( !IsMaster(xtstdevice) &&
-                                xtstdevice->u.master == ptr &&
-                                IsPointerDevice(xtstdevice) &&
-                                dixLookupPrivate(&xtstdevice->devPrivates, XTstDevicePrivateKey )
-                              )
-                                break;
-                        rc = dixLookupDevice(&xtstptr,
-                                             xtstdevice->id,
-                                             client,
-                                             DixDestroyAccess);
-
-                        if (rc != Success)
-                            goto unwind;
-                    }
-
-                    /* Disabling sends the devices floating, reattach them if
-                     * desired. */
-                    if (r->return_mode == XIAttachToMaster)
-                    {
-                        DeviceIntPtr attached,
-                                     newptr,
-                                     newkeybd;
-
-                        if (r->return_pointer > 0xFF) /* FIXME */
-                        {
-                            client->errorValue = r->deviceid;
-                            return BadImplementation;
-                        }
-
-                        rc = dixLookupDevice(&newptr, r->return_pointer,
-                                             client, DixWriteAccess);
-                        if (rc != Success)
-                            goto unwind;
-
-                        if (!IsMaster(newptr))
-                        {
-                            client->errorValue = r->return_pointer;
-                            rc = BadDevice;
-                            goto unwind;
-                        }
-
-                        if (r->return_keyboard > 0xFF) /* FIXME */
-                        {
-                            client->errorValue = r->deviceid;
-                            return BadImplementation;
-                        }
-
-                        rc = dixLookupDevice(&newkeybd, r->return_keyboard,
-                                             client, DixWriteAccess);
-                        if (rc != Success)
-                            goto unwind;
-
-                        if (!IsMaster(newkeybd))
-                        {
-                            client->errorValue = r->return_keyboard;
-                            rc = BadDevice;
-                            goto unwind;
-                        }
-
-                        for (attached = inputInfo.devices;
-                                attached;
-                                attached = attached->next)
-                        {
-                            if (!IsMaster(attached)) {
-                                if (attached->u.master == ptr)
-                                {
-                                    AttachDevice(client, attached, newptr);
-                                    flags[attached->id] |= XISlaveAttached;
-                                }
-                                if (attached->u.master == keybd)
-                                {
-                                    AttachDevice(client, attached, newkeybd);
-                                    flags[attached->id] |= XISlaveAttached;
-                                }
-                            }
-                        }
-                    }
-
-                    /* can't disable until we removed pairing */
-                    keybd->spriteInfo->paired = NULL;
-                    ptr->spriteInfo->paired = NULL;
-                    xtstptr->spriteInfo->paired = NULL;
-                    xtstkeybd->spriteInfo->paired = NULL;
-
-                    /* disable the remove the devices, xtst devices must be done first
-                       else the sprites they rely on will be destroyed  */
-                    DisableDevice(xtstptr, FALSE);
-                    DisableDevice(xtstkeybd, FALSE);
-                    DisableDevice(keybd, FALSE);
-                    DisableDevice(ptr, FALSE);
-                    flags[xtstptr->id] |= XIDeviceDisabled | XISlaveDetached;
-                    flags[xtstkeybd->id] |= XIDeviceDisabled | XISlaveDetached;
-                    flags[keybd->id] |= XIDeviceDisabled;
-                    flags[ptr->id] |= XIDeviceDisabled;
-
-                    RemoveDevice(xtstptr, FALSE);
-                    RemoveDevice(xtstkeybd, FALSE);
-                    RemoveDevice(keybd, FALSE);
-                    RemoveDevice(ptr, FALSE);
-                    flags[xtstptr->id] |= XISlaveRemoved;
-                    flags[xtstkeybd->id] |= XISlaveRemoved;
-                    flags[keybd->id] |= XIMasterRemoved;
-                    flags[ptr->id] |= XIMasterRemoved;
-                }
-                break;
-            case XIDetachSlave:
-                {
-                    xXIDetachSlaveInfo* c = (xXIDetachSlaveInfo*)any;
-                    DeviceIntPtr *xtstdevice;
-
-                    if (c->deviceid > 0xFF) /* FIXME */
-                    {
-                        client->errorValue = c->deviceid;
-                        return BadImplementation;
-                    }
-
-                    rc = dixLookupDevice(&ptr, c->deviceid, client,
-                                          DixWriteAccess);
-                    if (rc != Success)
-                       goto unwind;
-
-                    if (IsMaster(ptr))
-                    {
-                        client->errorValue = c->deviceid;
-                        rc = BadDevice;
-                        goto unwind;
-                    }
-
-                    xtstdevice = dixLookupPrivate( &ptr->devPrivates,
-                                                   XTstDevicePrivateKey );
-
-                    /* Don't allow changes to Xtst Devices, these are fixed */
-                    if( xtstdevice )
-                    {
-                        client->errorValue = c->deviceid;
-                        rc = BadDevice;
-                        goto unwind;
-                    }
-
-                    AttachDevice(client, ptr, NULL);
-                    flags[ptr->id] |= XISlaveDetached;
-                }
-                break;
-            case XIAttachSlave:
-                {
-                    xXIAttachSlaveInfo* c = (xXIAttachSlaveInfo*)any;
-                    DeviceIntPtr newmaster;
-                    DeviceIntPtr *xtstdevice;
-
-                    if (c->deviceid > 0xFF) /* FIXME */
-                    {
-                        client->errorValue = c->deviceid;
-                        return BadImplementation;
-                    }
-                    if (c->new_master > 0xFF) /* FIXME */
-                    {
-                        client->errorValue = c->new_master;
-                        return BadImplementation;
-                    }
-
-                    rc = dixLookupDevice(&ptr, c->deviceid, client,
-                                          DixWriteAccess);
-                    if (rc != Success)
-                       goto unwind;
-
-                    if (IsMaster(ptr))
-                    {
-                        client->errorValue = c->deviceid;
-                        rc = BadDevice;
-                        goto unwind;
-                    }
-
-                    xtstdevice = dixLookupPrivate( &ptr->devPrivates,
-                                                   XTstDevicePrivateKey );
-
-                    /* Don't allow changes to Xtst Devices, these are fixed */
-                    if( xtstdevice )
-                    {
-                        client->errorValue = c->deviceid;
-                        rc = BadDevice;
-                        goto unwind;
-                    }
-
-                    rc = dixLookupDevice(&newmaster, c->new_master,
-                            client, DixWriteAccess);
-                    if (rc != Success)
-                        goto unwind;
-                    if (!IsMaster(newmaster))
-                    {
-                        client->errorValue = c->new_master;
-                        rc = BadDevice;
-                        goto unwind;
-                    }
-
-                    if (!((IsPointerDevice(newmaster) &&
-                                    IsPointerDevice(ptr)) ||
-                                (IsKeyboardDevice(newmaster) &&
-                                 IsKeyboardDevice(ptr))))
-                    {
-                        rc = BadDevice;
-                        goto unwind;
-                    }
-                    AttachDevice(client, ptr, newmaster);
-                    flags[ptr->id] |= XISlaveAttached;
-                }
-                break;
-        }
-
-        any = (xXIAnyHierarchyChangeInfo*)((char*)any + any->length * 4);
-    }
-
-unwind:
-
-    XISendDeviceHierarchyEvent(flags);
-    return rc;
-}
-
diff --git a/Xi/chdevhier.h b/Xi/chdevhier.h
deleted file mode 100644
index b46cfb4..0000000
--- a/Xi/chdevhier.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-/***********************************************************************
- *
- * Request change in the device hierarchy.
- *
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifndef CHDEVHIER_H
-#define CHDEVHIER_H 1
-
-int SProcXIChangeHierarchy(ClientPtr /* client */);
-int ProcXIChangeHierarchy(ClientPtr /* client */);
-
-void XISendDeviceHierarchyEvent(int flags[]);
-
-#endif
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 23d8ee8..24fd11f 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -74,7 +74,7 @@ SOFTWARE.
 #include "scrnintstr.h"
 #include "listdev.h" /* for CopySwapXXXClass */
 #include "xace.h"
-#include "querydev.h" /* For List*Info */
+#include "xiquerydevice.h" /* For List*Info */
 #include "eventconvert.h"
 
 #include <X11/extensions/XKBproto.h>
diff --git a/Xi/extinit.c b/Xi/extinit.c
index 0550bd4..20d49e1 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -75,9 +75,7 @@ SOFTWARE.
 
 /* modules local to Xi */
 #include "allowev.h"
-#include "chdevcur.h"
 #include "chgdctl.h"
-#include "chdevhier.h"
 #include "chgfctl.h"
 #include "chgkbd.h"
 #include "chgprop.h"
@@ -86,7 +84,6 @@ SOFTWARE.
 #include "devbell.h"
 #include "getbmap.h"
 #include "getbmap.h"
-#include "getcptr.h"
 #include "getdctl.h"
 #include "getfctl.h"
 #include "getfocus.h"
@@ -102,15 +99,11 @@ SOFTWARE.
 #include "gtmotion.h"
 #include "listdev.h"
 #include "opendev.h"
-#include "querydp.h"
 #include "queryst.h"
-#include "querydev.h"
-#include "queryversion.h"
 #include "selectev.h"
 #include "sendexev.h"
 #include "chgkmap.h"
 #include "setbmap.h"
-#include "setcptr.h"
 #include "setdval.h"
 #include "setfocus.h"
 #include "setmmap.h"
@@ -118,13 +111,20 @@ SOFTWARE.
 #include "ungrdev.h"
 #include "ungrdevb.h"
 #include "ungrdevk.h"
-#include "warpdevp.h"
 #include "xiallowev.h"
 #include "xiselectev.h"
 #include "xigrabdev.h"
 #include "xipassivegrab.h"
 #include "xisetdevfocus.h"
 #include "xiproperty.h"
+#include "xichangecursor.h"
+#include "xichangehierarchy.h"
+#include "xigetclientpointer.h"
+#include "xiquerydevice.h"
+#include "xiquerypointer.h"
+#include "xiqueryversion.h"
+#include "xisetclientpointer.h"
+#include "xiwarppointer.h"
 
 
 /* Masks for XI events have to be aligned with core event (partially anyway).
diff --git a/Xi/getcptr.c b/Xi/getcptr.c
deleted file mode 100644
index 92fae82..0000000
--- a/Xi/getcptr.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>	/* for inputstr.h    */
-#include <X11/Xproto.h>	/* Request macro     */
-#include "inputstr.h"	/* DeviceIntPtr      */
-#include "windowstr.h"	/* window structure  */
-#include "scrnintstr.h"	/* screen structure  */
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XI2proto.h>
-#include "extnsionst.h"
-#include "extinit.h"	/* LookupDeviceIntRec */
-#include "exevents.h"
-#include "exglobals.h"
-
-#include "getcptr.h"
-
-/***********************************************************************
- * This procedure allows a client to query another client's client pointer
- * setting.
- */
-
-int
-SProcXIGetClientPointer(ClientPtr client)
-{
-    char n;
-    REQUEST(xXIGetClientPointerReq);
-
-    swaps(&stuff->length, n);
-    swapl(&stuff->win, n);
-    return ProcXIGetClientPointer(client);
-}
-
-int ProcXIGetClientPointer(ClientPtr client)
-{
-    int rc;
-    ClientPtr winclient;
-    xXIGetClientPointerReply rep;
-    REQUEST(xXIGetClientPointerReq);
-    REQUEST_SIZE_MATCH(xXIGetClientPointerReq);
-
-    if (stuff->win != None)
-    {
-        rc = dixLookupClient(&winclient, stuff->win, client,
-                DixWriteAccess);
-
-        if (rc != Success)
-            return BadWindow;
-    } else
-        winclient = client;
-
-    rep.repType = X_Reply;
-    rep.RepType = X_XIGetClientPointer;
-    rep.length = 0;
-    rep.sequenceNumber = client->sequence;
-    rep.set = (winclient->clientPtr != NULL);
-    rep.deviceid = (winclient->clientPtr) ? winclient->clientPtr->id : 0;
-
-    WriteReplyToClient(client, sizeof(xXIGetClientPointerReply), &rep);
-    return Success;
-}
-
-/***********************************************************************
- *
- * This procedure writes the reply for the XGetClientPointer function,
- * if the client and server have a different byte ordering.
- *
- */
-
-void
-SRepXIGetClientPointer(ClientPtr client, int size,
-        xXIGetClientPointerReply* rep)
-{
-    char n;
-    swaps(&rep->sequenceNumber, n);
-    swapl(&rep->length, n);
-    swaps(&rep->deviceid, n);
-    WriteToClient(client, size, (char *)rep);
-}
-
diff --git a/Xi/getcptr.h b/Xi/getcptr.h
deleted file mode 100644
index 1539aa8..0000000
--- a/Xi/getcptr.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifndef GETCPTR_H
-#define GETCPTR_H 1
-int SProcXIGetClientPointer(ClientPtr /* client */);
-int ProcXIGetClientPointer(ClientPtr /* client */);
-void SRepXIGetClientPointer(ClientPtr /* client */,
-        int /* size */,
-        xXIGetClientPointerReply* /* rep */);
-
-#endif /* GETCPTR_H */
diff --git a/Xi/querydev.c b/Xi/querydev.c
deleted file mode 100644
index fd5e463..0000000
--- a/Xi/querydev.c
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors: Peter Hutterer
- *
- */
-
-/**
- * @file Protocol handling for the XIQueryDevice request/reply.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "inputstr.h"
-#include <X11/X.h>
-#include <X11/extensions/XI2proto.h>
-#include "xkbstr.h"
-#include "xkbsrv.h"
-#include "xserver-properties.h"
-#include "exevents.h"
-
-#include "querydev.h"
-
-static int ListDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info);
-static int SizeDeviceInfo(DeviceIntPtr dev);
-static void SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info);
-int
-SProcXIQueryDevice(ClientPtr client)
-{
-    char n;
-
-    REQUEST(xXIQueryDeviceReq);
-
-    swaps(&stuff->length, n);
-    swaps(&stuff->deviceid, n);
-
-    return ProcXIQueryDevice(client);
-}
-
-int
-ProcXIQueryDevice(ClientPtr client)
-{
-    xXIQueryDeviceReply rep;
-    DeviceIntPtr dev = NULL;
-    int rc = Success;
-    int len = 0;
-    char *info, *ptr;
-
-    REQUEST(xXIQueryDeviceReq);
-    REQUEST_SIZE_MATCH(xXIQueryDeviceReq);
-
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
-
-    if (stuff->deviceid != XIAllDevices && stuff->deviceid != XIAllMasterDevices)
-    {
-        rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
-        if (rc != Success)
-        {
-            client->errorValue = stuff->deviceid;
-            return rc;
-        }
-    }
-
-    if (dev)
-        len += SizeDeviceInfo(dev);
-    else
-    {
-        len = 0;
-        for (dev = inputInfo.devices; dev; dev = dev->next)
-        {
-            if (stuff->deviceid == XIAllDevices ||
-                (stuff->deviceid == XIAllMasterDevices && IsMaster(dev)))
-                len += SizeDeviceInfo(dev);
-        }
-
-        for (dev = inputInfo.off_devices; dev; dev = dev->next)
-        {
-            if (stuff->deviceid == XIAllDevices ||
-                (stuff->deviceid == XIAllMasterDevices && IsMaster(dev)))
-                len += SizeDeviceInfo(dev);
-        }
-
-        dev = NULL;
-    }
-
-    info = xcalloc(1, len);
-    if (!info)
-        return BadAlloc;
-
-    memset(&rep, 0, sizeof(xXIQueryDeviceReply));
-    rep.repType = X_Reply;
-    rep.RepType = X_XIQueryDevice;
-    rep.sequenceNumber = client->sequence;
-    rep.length = len/4;
-    rep.num_devices = 0;
-
-    ptr = info;
-    if (dev)
-    {
-        len = ListDeviceInfo(dev, (xXIDeviceInfo*)info);
-        if (client->swapped)
-            SwapDeviceInfo(dev, (xXIDeviceInfo*)info);
-        info += len;
-        rep.num_devices = 1;
-    } else
-    {
-        for (dev = inputInfo.devices; dev; dev = dev->next)
-        {
-            if (stuff->deviceid == XIAllDevices ||
-                    (stuff->deviceid == XIAllMasterDevices && IsMaster(dev)))
-            {
-                len = ListDeviceInfo(dev, (xXIDeviceInfo*)info);
-                if (client->swapped)
-                    SwapDeviceInfo(dev, (xXIDeviceInfo*)info);
-                info += len;
-                rep.num_devices++;
-            }
-        }
-
-        for (dev = inputInfo.off_devices; dev; dev = dev->next)
-        {
-            if (stuff->deviceid == XIAllDevices ||
-                    (stuff->deviceid == XIAllMasterDevices && IsMaster(dev)))
-            {
-                len = ListDeviceInfo(dev, (xXIDeviceInfo*)info);
-                if (client->swapped)
-                    SwapDeviceInfo(dev, (xXIDeviceInfo*)info);
-                info += len;
-                rep.num_devices++;
-            }
-        }
-    }
-
-    WriteReplyToClient(client, sizeof(xXIQueryDeviceReply), &rep);
-    WriteToClient(client, rep.length * 4, ptr);
-    return rc;
-}
-
-void
-SRepXIQueryDevice(ClientPtr client, int size, xXIQueryDeviceReply *rep)
-{
-    char n;
-
-    swaps(&rep->sequenceNumber, n);
-    swapl(&rep->length, n);
-    swaps(&rep->num_devices, n);
-
-    /* Device info is already swapped, see ProcXIQueryDevice */
-
-    WriteToClient(client, size, (char *)rep);
-}
-
-
-
-/**
- * @return The number of bytes needed to store this device's xXIDeviceInfo
- * (and its classes).
- */
-static int
-SizeDeviceInfo(DeviceIntPtr dev)
-{
-    int len = sizeof(xXIDeviceInfo);
-
-    /* 4-padded name */
-    len += (((strlen(dev->name) + 3)/4)*4);
-
-    return len + SizeDeviceClasses(dev);
-
-}
-
-/*
- * @return The number of bytes needed to store this device's classes.
- */
-int
-SizeDeviceClasses(DeviceIntPtr dev)
-{
-    int len = 0;
-
-    if (dev->button)
-    {
-        len += sizeof(xXIButtonInfo);
-        len += dev->button->numButtons * sizeof(Atom);
-    }
-
-    if (dev->key)
-    {
-        XkbDescPtr xkb = dev->key->xkbInfo->desc;
-        len += sizeof(xXIKeyInfo);
-        len += (xkb->max_key_code - xkb->min_key_code + 1) * sizeof(uint32_t);
-    }
-
-    if (dev->valuator)
-        len += sizeof(xXIValuatorInfo) * dev->valuator->numAxes;
-
-    return len;
-}
-
-
-/**
- * Write button information into info.
- * @return Number of bytes written into info.
- */
-int
-ListButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info)
-{
-    info->type = ButtonClass;
-    info->num_buttons = dev->button->numButtons;
-    info->length = 2 + info->num_buttons;
-
-    /** XXX: button labels */
-
-    return info->length * 4;
-}
-
-static void
-SwapButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info)
-{
-    char n;
-    Atom *btn;
-    int i;
-    swaps(&info->type, n);
-    swaps(&info->length, n);
-
-    for (i = 0, btn = (Atom*)&info[1]; i < info->num_buttons; i++, btn++)
-        swaps(btn, n);
-
-    swaps(&info->num_buttons, n);
-}
-
-/**
- * Write key information into info.
- * @return Number of bytes written into info.
- */
-int
-ListKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info)
-{
-    int i;
-    XkbDescPtr xkb = dev->key->xkbInfo->desc;
-    uint32_t *kc;
-
-    info->type = KeyClass;
-    info->num_keycodes = xkb->max_key_code - xkb->min_key_code + 1;
-    info->length = 2 + info->num_keycodes;
-
-    kc = (uint32_t*)&info[1];
-    for (i = xkb->min_key_code; i <= xkb->max_key_code; i++, kc++)
-        *kc = i;
-
-    return info->length * 4;
-}
-
-static void
-SwapKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info)
-{
-    char n;
-    uint32_t *key;
-    int i;
-    swaps(&info->type, n);
-    swaps(&info->length, n);
-
-    for (i = 0, key = (uint32_t*)&info[1]; i < info->num_keycodes; i++, key++)
-        swapl(key, n);
-
-    swaps(&info->num_keycodes, n);
-}
-
-/**
- * List axis information for the given axis.
- *
- * @return The number of bytes written into info.
- */
-int
-ListValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info, int axisnumber)
-{
-    ValuatorClassPtr v = dev->valuator;
-
-    info->type = ValuatorClass;
-    info->length = sizeof(xXIValuatorInfo)/4;
-    info->name = XIGetKnownProperty(AXIS_LABEL_PROP_REL_MISC); /* XXX */
-    info->min.integral = v->axes[axisnumber].min_value;
-    info->min.frac = 0;
-    info->max.integral = v->axes[axisnumber].max_value;
-    info->max.frac = 0;
-    info->resolution = v->axes[axisnumber].resolution;
-    info->number = axisnumber;
-    info->mode = v->mode; /* Server doesn't have per-axis mode yet */
-
-    return info->length * 4;
-}
-
-static void
-SwapValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info)
-{
-    char n;
-    swaps(&info->type, n);
-    swaps(&info->length, n);
-    swapl(&info->name, n);
-    swapl(&info->min.integral, n);
-    swapl(&info->min.frac, n);
-    swapl(&info->max.integral, n);
-    swapl(&info->max.frac, n);
-    swaps(&info->number, n);
-}
-
-int GetDeviceUse(DeviceIntPtr dev, uint16_t *attachment)
-{
-    DeviceIntPtr master = dev->u.master;
-    int use;
-
-    if (IsMaster(dev))
-    {
-        DeviceIntPtr paired = GetPairedDevice(dev);
-        use = IsPointerDevice(dev) ? XIMasterPointer : XIMasterKeyboard;
-        *attachment = (paired ? paired->id : 0);
-    } else if (master)
-    {
-        use = IsPointerDevice(master) ? XISlavePointer : XISlaveKeyboard;
-        *attachment = master->id;
-    } else
-        use = XIFloatingSlave;
-
-    return use;
-}
-
-/**
- * Write the info for device dev into the buffer pointed to by info.
- *
- * @return The number of bytes used.
- */
-static int
-ListDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info)
-{
-    char *any = (char*)&info[1];
-    int len = 0, total_len = 0;
-
-    info->deviceid = dev->id;
-    info->use = GetDeviceUse(dev, &info->attachment);
-    info->num_classes = 0;
-    info->name_len = strlen(dev->name);
-    info->enabled = dev->enabled;
-    total_len = sizeof(xXIDeviceInfo);
-
-    len = ((info->name_len + 3)/4) * 4;
-    memset(any, 0, len);
-    strncpy(any, dev->name, info->name_len);
-    any += len;
-    total_len += len;
-
-    return total_len + ListDeviceClasses(dev, any, &info->num_classes);
-}
-
-/**
- * Write the class info of the device into the memory pointed to by any, set
- * nclasses to the number of classes in total and return the number of bytes
- * written.
- */
-int
-ListDeviceClasses(DeviceIntPtr dev, char *any, uint16_t *nclasses)
-{
-    int total_len = 0;
-    int len;
-    int i;
-
-    if (dev->button)
-    {
-        (*nclasses)++;
-        len = ListButtonInfo(dev, (xXIButtonInfo*)any);
-        any += len;
-        total_len += len;
-    }
-
-    if (dev->key)
-    {
-        (*nclasses)++;
-        len = ListKeyInfo(dev, (xXIKeyInfo*)any);
-        any += len;
-        total_len += len;
-    }
-
-    for (i = 0; dev->valuator && i < dev->valuator->numAxes; i++)
-    {
-        (*nclasses)++;
-        len = ListValuatorInfo(dev, (xXIValuatorInfo*)any, i);
-        any += len;
-        total_len += len;
-    }
-
-    return total_len;
-}
-
-static void
-SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info)
-{
-    char n;
-    char *any = (char*)&info[1];
-    int i;
-
-    /* Skip over name */
-    any += (((info->name_len + 3)/4) * 4);
-
-    for (i = 0; i < info->num_classes; i++)
-    {
-        int len = ((xXIAnyInfo*)any)->length;
-        switch(((xXIAnyInfo*)any)->type)
-        {
-            case XIButtonClass:
-                SwapButtonInfo(dev, (xXIButtonInfo*)any);
-                break;
-            case XIKeyClass:
-                SwapKeyInfo(dev, (xXIKeyInfo*)any);
-                break;
-            case XIValuatorClass:
-                SwapValuatorInfo(dev, (xXIValuatorInfo*)any);
-                break;
-        }
-
-        any += len * 4;
-    }
-
-    swaps(&info->deviceid, n);
-    swaps(&info->use, n);
-    swaps(&info->attachment, n);
-    swaps(&info->num_classes, n);
-    swaps(&info->name_len, n);
-
-}
diff --git a/Xi/querydev.h b/Xi/querydev.h
deleted file mode 100644
index 34e87bd..0000000
--- a/Xi/querydev.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors: Peter Hutterer
- *
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifndef QUERYDEV_H
-#define QUERYDEV_H 1
-
-#include <X11/extensions/XI2proto.h>
-
-int SProcXIQueryDevice(ClientPtr client);
-int ProcXIQueryDevice(ClientPtr client);
-void SRepXIQueryDevice(ClientPtr client, int size, xXIQueryDeviceReply *rep);
-int SizeDeviceClasses(DeviceIntPtr dev);
-int ListDeviceClasses(DeviceIntPtr dev, char* any, uint16_t* nclasses);
-int GetDeviceUse(DeviceIntPtr dev, uint16_t *attachment);
-int ListButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info);
-int ListKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info);
-int ListValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info, int axisnumber);
-#endif /* QUERYDEV_H */
diff --git a/Xi/querydp.c b/Xi/querydp.c
deleted file mode 100644
index e5bf98d..0000000
--- a/Xi/querydp.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-/***********************************************************************
- *
- * Request to query the pointer location of an extension input device.
- *
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>	/* for inputstr.h    */
-#include <X11/Xproto.h>	/* Request macro     */
-#include "inputstr.h"	/* DeviceIntPtr      */
-#include "windowstr.h"	/* window structure  */
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XI2proto.h>
-#include "extnsionst.h"
-#include "exevents.h"
-#include "exglobals.h"
-#include "eventconvert.h"
-#include "xkbsrv.h"
-
-#ifdef PANORAMIX
-#include "panoramiXsrv.h"
-#endif
-
-#include "querydp.h"
-
-/***********************************************************************
- *
- * This procedure allows a client to query the pointer of a device.
- *
- */
-
-int
-SProcXIQueryPointer(ClientPtr client)
-{
-    char n;
-
-    REQUEST(xXIQueryPointerReq);
-    swaps(&stuff->length, n);
-    return (ProcXIQueryPointer(client));
-}
-
-int
-ProcXIQueryPointer(ClientPtr client)
-{
-    int rc;
-    xXIQueryPointerReply rep;
-    DeviceIntPtr pDev, kbd;
-    WindowPtr pWin, t;
-    SpritePtr pSprite;
-    XkbStatePtr state;
-    char *buttons = NULL;
-
-    REQUEST(xXIQueryPointerReq);
-    REQUEST_SIZE_MATCH(xXIQueryPointerReq);
-
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
-
-    rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixReadAccess);
-    if (rc != Success)
-        return rc;
-
-    if (pDev->valuator == NULL)
-    {
-        client->errorValue = stuff->deviceid;
-        return BadDevice;
-    }
-
-    rc = dixLookupWindow(&pWin, stuff->win, client, DixReadAccess);
-    if (rc != Success)
-    {
-        SendErrorToClient(client, IReqCode, X_XIQueryPointer,
-                stuff->win, rc);
-        return Success;
-    }
-
-    if (pDev->valuator->motionHintWindow)
-        MaybeStopHint(pDev, client);
-
-    kbd = GetPairedDevice(pDev);
-
-    pSprite = pDev->spriteInfo->sprite;
-    rep.repType = X_Reply;
-    rep.RepType = X_XIQueryPointer;
-    rep.length = 5;
-    rep.sequenceNumber = client->sequence;
-    rep.root = (GetCurrentRootWindow(pDev))->drawable.id;
-    rep.root_x = FP1616(pSprite->hot.x, 0);
-    rep.root_y = FP1616(pSprite->hot.y, 0);
-    rep.child = None;
-
-    state = &kbd->key->xkbInfo->prev_state;
-    rep.mods.base_mods = state->base_mods;
-    rep.mods.latched_mods = state->latched_mods;
-    rep.mods.locked_mods = state->locked_mods;
-
-    rep.group.base_group = state->base_group;
-    rep.group.latched_group = state->latched_group;
-    rep.group.locked_group = state->locked_group;
-
-    if (pDev->button)
-    {
-        int i, down;
-        rep.buttons_len = (((pDev->button->numButtons + 7)/8) + 3)/4;
-        rep.length += rep.buttons_len;
-        buttons = xcalloc(rep.buttons_len, 4);
-        if (!buttons)
-            return BadAlloc;
-
-        down = pDev->button->buttonsDown;
-
-        for (i = 0; i < pDev->button->numButtons && down; i++)
-        {
-            if (BitIsOn(pDev->button->down, i))
-            {
-                SetBit(buttons, i);
-                down--;
-            }
-        }
-    } else
-        rep.buttons_len = 0;
-
-    if (pSprite->hot.pScreen == pWin->drawable.pScreen)
-    {
-        rep.same_screen = xTrue;
-        rep.win_x = FP1616(pSprite->hot.x - pWin->drawable.x, 0);
-        rep.win_y = FP1616(pSprite->hot.y - pWin->drawable.y, 0);
-        for (t = pSprite->win; t; t = t->parent)
-            if (t->parent == pWin)
-            {
-                rep.child = t->drawable.id;
-                break;
-            }
-    } else
-    {
-        rep.same_screen = xFalse;
-        rep.win_x = 0;
-        rep.win_y = 0;
-    }
-
-#ifdef PANORAMIX
-    if(!noPanoramiXExtension) {
-        rep.root_x += FP1616(panoramiXdataPtr[0].x, 0);
-        rep.root_y += FP1616(panoramiXdataPtr[0].y, 0);
-        if (stuff->win == rep.root)
-        {
-            rep.win_x += FP1616(panoramiXdataPtr[0].x, 0);
-            rep.win_y += FP1616(panoramiXdataPtr[0].y, 0);
-        }
-    }
-#endif
-
-    WriteReplyToClient(client, sizeof(xXIQueryPointerReply), &rep);
-    if (buttons)
-        WriteToClient(client, rep.buttons_len * 4, buttons);
-
-    xfree(buttons);
-
-    return Success;
-}
-
-/***********************************************************************
- *
- * This procedure writes the reply for the XIQueryPointer function,
- * if the client and server have a different byte ordering.
- *
- */
-
-void
-SRepXIQueryPointer(ClientPtr client, int size,
-                   xXIQueryPointerReply * rep)
-{
-    char n;
-
-    swaps(&rep->sequenceNumber, n);
-    swapl(&rep->length, n);
-    WriteToClient(client, size, (char *)rep);
-}
-
diff --git a/Xi/querydp.h b/Xi/querydp.h
deleted file mode 100644
index ea22376..0000000
--- a/Xi/querydp.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifndef QUERYDP_H
-#define QUERYDP_H 1
-
-int SProcXIQueryPointer(ClientPtr /* client */);
-int ProcXIQueryPointer(ClientPtr /* client */);
-void SRepXIQueryPointer(ClientPtr /* client */ ,
-			int /* size */ ,
-			xXIQueryPointerReply *	/* rep */);
-
-#endif /* QUERYDP_H */
diff --git a/Xi/queryversion.c b/Xi/queryversion.c
deleted file mode 100644
index 4d644a9..0000000
--- a/Xi/queryversion.c
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors: Peter Hutterer
- *
- */
-
-/**
- * @file queryversion.c
- * Protocol handling for the XIQueryVersion request/reply.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-
-#include "inputstr.h"
-
-#include <X11/Xmd.h>
-#include <X11/X.h>
-#include <X11/extensions/XI2proto.h>
-
-#include "exglobals.h"
-#include "exevents.h"
-#include "queryversion.h"
-#include "misc.h"
-
-extern XExtensionVersion XIVersion; /* defined in getvers.c */
-/**
- * Return the supported XI version.
- *
- * Saves the version the client claims to support as well, for future
- * reference.
- */
-int
-ProcXIQueryVersion(ClientPtr client)
-{
-    xXIQueryVersionReply rep;
-    XIClientPtr pXIClient;
-    int major, minor;
-    unsigned int sversion, cversion;
-
-    REQUEST(xXIQueryVersionReq);
-    REQUEST_SIZE_MATCH(xXIQueryVersionReq);
-
-    /* This request only exists after XI2 */
-    if (stuff->major_version < 2)
-    {
-        client->errorValue = stuff->major_version;
-        return BadValue;
-    }
-
-    pXIClient = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
-
-    sversion = XIVersion.major_version * 1000 + XIVersion.minor_version;
-    cversion = stuff->major_version * 1000 + stuff->minor_version;
-
-    if (sversion > cversion)
-    {
-        major = stuff->major_version;
-        minor = stuff->minor_version;
-    } else
-    {
-        major = XIVersion.major_version;
-        minor = XIVersion.minor_version;
-    }
-
-    pXIClient->major_version = major;
-    pXIClient->minor_version = minor;
-
-    memset(&rep, 0, sizeof(xXIQueryVersionReply));
-    rep.repType = X_Reply;
-    rep.RepType = X_XIQueryVersion;
-    rep.length = 0;
-    rep.sequenceNumber = client->sequence;
-    rep.major_version = major;
-    rep.minor_version = minor;
-
-    WriteReplyToClient(client, sizeof(xXIQueryVersionReply), &rep);
-
-    return Success;
-}
-
-/* Swapping routines */
-
-int
-SProcXIQueryVersion(ClientPtr client)
-{
-    char n;
-
-    REQUEST(xXIQueryVersionReq);
-    swaps(&stuff->length, n);
-    REQUEST_AT_LEAST_SIZE(xXIQueryVersionReq);
-    swaps(&stuff->major_version, n);
-    swaps(&stuff->minor_version, n);
-    return (ProcXIQueryVersion(client));
-}
-
-void
-SRepXIQueryVersion(ClientPtr client, int size, xXIQueryVersionReply *rep)
-{
-    char n;
-    swaps(&rep->sequenceNumber, n);
-    swapl(&rep->length, n);
-    swaps(&rep->major_version, n);
-    swaps(&rep->minor_version, n);
-    WriteToClient(client, size, (char *)rep);
-}
diff --git a/Xi/queryversion.h b/Xi/queryversion.h
deleted file mode 100644
index 06bb729..0000000
--- a/Xi/queryversion.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright © 2009 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors: Peter Hutterer
- *
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/extensions/XI2proto.h>
-
-#ifndef QUERYVERSION_H
-#define QUERYVERSION_H 1
-
-int SProcXIQueryVersion(ClientPtr client);
-int ProcXIQueryVersion(ClientPtr client);
-void SRepXIQueryVersion(ClientPtr client, int size, xXIQueryVersionReply* rep);
-
-#endif /* QUERYVERSION_H */
diff --git a/Xi/setcptr.c b/Xi/setcptr.c
deleted file mode 100644
index d23b2d8..0000000
--- a/Xi/setcptr.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-/***********************************************************************
- *
- * Request to set the client pointer for the owner of the given window.
- * All subsequent calls that are ambiguous will choose the client pointer as
- * default value.
- */
-
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>	/* for inputstr.h    */
-#include <X11/Xproto.h>	/* Request macro     */
-#include "inputstr.h"	/* DeviceIntPtr      */
-#include "windowstr.h"	/* window structure  */
-#include "scrnintstr.h"	/* screen structure  */
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XI2proto.h>
-#include "extnsionst.h"
-#include "exevents.h"
-#include "exglobals.h"
-
-#include "setcptr.h"
-
-int
-SProcXISetClientPointer(ClientPtr client)
-{
-    char n;
-
-    REQUEST(xXISetClientPointerReq);
-    swaps(&stuff->length, n);
-    swapl(&stuff->win, n);
-    swaps(&stuff->deviceid, n);
-    REQUEST_SIZE_MATCH(xXISetClientPointerReq);
-    return (ProcXISetClientPointer(client));
-}
-
-int
-ProcXISetClientPointer(ClientPtr client)
-{
-    DeviceIntPtr pDev;
-    ClientPtr targetClient;
-    int rc;
-
-    REQUEST(xXISetClientPointerReq);
-    REQUEST_SIZE_MATCH(xXISetClientPointerReq);
-
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
-
-    rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixWriteAccess);
-    if (rc != Success)
-    {
-        client->errorValue = stuff->deviceid;
-        return rc;
-    }
-
-    if (!IsMaster(pDev))
-    {
-        client->errorValue = stuff->deviceid;
-        return BadDevice;
-    }
-
-    pDev = GetMaster(pDev, MASTER_POINTER);
-
-    if (stuff->win != None)
-    {
-        rc = dixLookupClient(&targetClient, stuff->win, client,
-                DixWriteAccess);
-
-        if (rc != Success)
-            return BadWindow;
-
-    } else
-        targetClient = client;
-
-    if (!SetClientPointer(targetClient, pDev))
-    {
-        client->errorValue = stuff->deviceid;
-        return BadDevice;
-    }
-
-    return Success;
-}
diff --git a/Xi/setcptr.h b/Xi/setcptr.h
deleted file mode 100644
index 5968d98..0000000
--- a/Xi/setcptr.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifndef SETCPTR_H
-#define SETCPTR_H 1
-
-int SProcXISetClientPointer(ClientPtr /* client */);
-int ProcXISetClientPointer(ClientPtr /* client */);
-
-#endif /* SETCPTR_H */
diff --git a/Xi/warpdevp.c b/Xi/warpdevp.c
deleted file mode 100644
index bb45bda..0000000
--- a/Xi/warpdevp.c
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-/***********************************************************************
- *
- * Request to Warp the pointer location of an extension input device.
- *
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>	/* for inputstr.h    */
-#include <X11/Xproto.h>	/* Request macro     */
-#include "inputstr.h"	/* DeviceIntPtr      */
-#include "windowstr.h"	/* window structure  */
-#include "scrnintstr.h"	/* screen structure  */
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XI2proto.h>
-#include "extnsionst.h"
-#include "exevents.h"
-#include "exglobals.h"
-#include "mipointer.h" /* for miPointerUpdateSprite */
-
-
-#include "warpdevp.h"
-/***********************************************************************
- *
- * This procedure allows a client to warp the pointer of a device.
- *
- */
-
-int
-SProcXIWarpPointer(ClientPtr client)
-{
-    char n;
-
-    REQUEST(xXIWarpPointerReq);
-    swaps(&stuff->length, n);
-    return (ProcXIWarpPointer(client));
-}
-
-int
-ProcXIWarpPointer(ClientPtr client)
-{
-    int rc;
-    int x, y;
-    WindowPtr dest = NULL;
-    DeviceIntPtr pDev;
-    SpritePtr pSprite;
-    ScreenPtr newScreen;
-
-    REQUEST(xXIWarpPointerReq);
-    REQUEST_SIZE_MATCH(xXIWarpPointerReq);
-
-    if (stuff->deviceid > 0xFF) /* FIXME */
-    {
-        client->errorValue = stuff->deviceid;
-        return BadImplementation;
-    }
-
-    /* FIXME: panoramix stuff is missing, look at ProcWarpPointer */
-
-    rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixWriteAccess);
-
-    if (rc != Success)
-        return rc;
-
-    if (stuff->dst_win != None)
-    {
-        rc = dixLookupWindow(&dest, stuff->dst_win, client, DixReadAccess);
-        if (rc != Success)
-        {
-            return rc;
-        }
-    }
-
-    pSprite = pDev->spriteInfo->sprite;
-    x = pSprite->hotPhys.x;
-    y = pSprite->hotPhys.y;
-
-    if (stuff->src_win != None)
-    {
-        int winX, winY;
-        WindowPtr src;
-
-        rc = dixLookupWindow(&src, stuff->src_win, client, DixReadAccess);
-        if (rc != Success)
-        {
-            return rc;
-        }
-
-        winX = src->drawable.x;
-        winY = src->drawable.y;
-        if (src->drawable.pScreen != pSprite->hotPhys.pScreen ||
-                x < winX + stuff->src_x ||
-                y < winY + stuff->src_y ||
-                (stuff->src_width != 0 &&
-                 winX + stuff->src_x + (int)stuff->src_width < 0) ||
-                (stuff->src_height != 0 &&
-                 winY + stuff->src_y + (int)stuff->src_height < y) ||
-                !PointInWindowIsVisible(src, x, y))
-            return Success;
-    }
-
-    if (dest)
-    {
-        x = dest->drawable.x;
-        y = dest->drawable.y;
-        newScreen = dest->drawable.pScreen;
-    } else
-        newScreen = pSprite->hotPhys.pScreen;
-
-    x += stuff->dst_x;
-    y += stuff->dst_y;
-
-    if (x < 0)
-        x = 0;
-    else if (x > newScreen->width)
-        x = newScreen->width - 1;
-
-    if (y < 0)
-        y = 0;
-    else if (y > newScreen->height)
-        y = newScreen->height - 1;
-
-    if (newScreen == pSprite->hotPhys.pScreen)
-    {
-        if (x < pSprite->physLimits.x1)
-            x = pSprite->physLimits.x1;
-        else if (x >= pSprite->physLimits.x2)
-            x = pSprite->physLimits.x2 - 1;
-
-        if (y < pSprite->physLimits.y1)
-            y = pSprite->physLimits.y1;
-        else if (y >= pSprite->physLimits.y2)
-            y = pSprite->physLimits.y2 - 1;
-
-        if (pSprite->hotShape)
-            ConfineToShape(pDev, pSprite->hotShape, &x, &y);
-        (*newScreen->SetCursorPosition)(pDev, newScreen, x, y, TRUE);
-    } else if (!PointerConfinedToScreen(pDev))
-    {
-        NewCurrentScreen(pDev, newScreen, x, y);
-    }
-
-    /* if we don't update the device, we get a jump next time it moves */
-    pDev->last.valuators[0] = x;
-    pDev->last.valuators[1] = y;
-    miPointerUpdateSprite(pDev);
-
-    /* FIXME: XWarpPointer is supposed to generate an event. It doesn't do it
-       here though. */
-    return Success;
-}
-
diff --git a/Xi/warpdevp.h b/Xi/warpdevp.h
deleted file mode 100644
index aafc739..0000000
--- a/Xi/warpdevp.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifndef WARPDEVP_H
-#define WARPDEVP_H 1
-
-int SProcXIWarpPointer(ClientPtr /* client */);
-int ProcXIWarpPointer(ClientPtr	/* client */);
-
-#endif /* WARPDEVP_H */
diff --git a/Xi/xichangecursor.c b/Xi/xichangecursor.c
new file mode 100644
index 0000000..ee2d65d
--- /dev/null
+++ b/Xi/xichangecursor.c
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2007-2008 Peter Hutterer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer, University of South Australia, NICTA
+ */
+
+/***********************************************************************
+ *
+ * Request to change a given device pointer's cursor.
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>	/* for inputstr.h    */
+#include <X11/Xproto.h>	/* Request macro     */
+#include "inputstr.h"	/* DeviceIntPtr      */
+#include "windowstr.h"	/* window structure  */
+#include "scrnintstr.h"	/* screen structure  */
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XI2proto.h>
+#include "extnsionst.h"
+#include "exevents.h"
+#include "exglobals.h"
+#include "input.h"
+
+#include "xichangecursor.h"
+
+/***********************************************************************
+ *
+ * This procedure allows a client to set one pointer's cursor.
+ *
+ */
+
+int
+SProcXIChangeCursor(ClientPtr client)
+{
+    char n;
+
+    REQUEST(xXIChangeCursorReq);
+    swaps(&stuff->length, n);
+    REQUEST_SIZE_MATCH(xXIChangeCursorReq);
+    return (ProcXIChangeCursor(client));
+}
+
+int ProcXIChangeCursor(ClientPtr client)
+{
+    int rc;
+    WindowPtr pWin    = NULL;
+    DeviceIntPtr pDev = NULL;
+    CursorPtr pCursor = NULL;
+
+    REQUEST(xXIChangeCursorReq);
+    REQUEST_SIZE_MATCH(xXIChangeCursorReq);
+
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
+
+    rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixSetAttrAccess);
+    if (rc != Success)
+        return rc;
+
+    if (stuff->win != None)
+    {
+        rc = dixLookupWindow(&pWin, stuff->win, client, DixSetAttrAccess);
+        if (rc != Success)
+            return rc;
+    }
+
+    if (stuff->cursor == None)
+    {
+        if (pWin == WindowTable[pWin->drawable.pScreen->myNum])
+            pCursor = rootCursor;
+        else
+            pCursor = (CursorPtr)None;
+    }
+    else
+    {
+	rc = dixLookupResourceByType((pointer *)&pCursor, stuff->cursor,
+				     RT_CURSOR, client, DixReadAccess);
+	if (rc != Success)
+	    return (rc == BadValue) ? BadCursor : rc;
+    }
+
+    ChangeWindowDeviceCursor(pWin, pDev, pCursor);
+
+    return Success;
+}
+
diff --git a/Xi/xichangecursor.h b/Xi/xichangecursor.h
new file mode 100644
index 0000000..dc6ccb1
--- /dev/null
+++ b/Xi/xichangecursor.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2007-2008 Peter Hutterer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer, University of South Australia, NICTA
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifndef CHDEVCUR_H
+#define CHDEVCUR_H 1
+
+int SProcXIChangeCursor(ClientPtr /* client */);
+int ProcXIChangeCursor(ClientPtr /* client */);
+
+#endif /* CHDEVCUR_H */
diff --git a/Xi/xichangehierarchy.c b/Xi/xichangehierarchy.c
new file mode 100644
index 0000000..944bb30
--- /dev/null
+++ b/Xi/xichangehierarchy.c
@@ -0,0 +1,540 @@
+/*
+ * Copyright 2007-2008 Peter Hutterer
+ * Copyright 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer, University of South Australia, NICTA
+ */
+
+/***********************************************************************
+ *
+ * Request change in the device hierarchy.
+ *
+ */
+
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>	/* for inputstr.h    */
+#include <X11/Xproto.h>	/* Request macro     */
+#include "inputstr.h"	/* DeviceIntPtr      */
+#include "windowstr.h"	/* window structure  */
+#include "scrnintstr.h"	/* screen structure  */
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XI2proto.h>
+#include <X11/extensions/geproto.h>
+#include "extnsionst.h"
+#include "exevents.h"
+#include "exglobals.h"
+#include "geext.h"
+#include "xace.h"
+#include "xiquerydevice.h" /* for GetDeviceUse */
+
+#include "xkbsrv.h"
+
+#include "xichangehierarchy.h"
+
+extern DevPrivateKey XTstDevicePrivateKey;
+
+/**
+ * Send the current state of the device hierarchy to all clients.
+ */
+void XISendDeviceHierarchyEvent(int flags[MAXDEVICES])
+{
+    xXIHierarchyEvent *ev;
+    xXIHierarchyInfo *info;
+    DeviceIntRec dummyDev;
+    DeviceIntPtr dev;
+    int i;
+
+    if (!flags)
+        return;
+
+    ev = xcalloc(1, sizeof(xXIHierarchyEvent) +
+                 MAXDEVICES * sizeof(xXIHierarchyInfo));
+    ev->type = GenericEvent;
+    ev->extension = IReqCode;
+    ev->evtype = XI_HierarchyChanged;
+    ev->time = GetTimeInMillis();
+    ev->flags = 0;
+    ev->num_info = inputInfo.numDevices;
+
+    info = (xXIHierarchyInfo*)&ev[1];
+    for (dev = inputInfo.devices; dev; dev = dev->next)
+    {
+        info->deviceid = dev->id;
+        info->enabled = dev->enabled;
+        info->use = GetDeviceUse(dev, &info->attachment);
+        info->flags = flags[dev->id];
+        ev->flags |= info->flags;
+        info++;
+    }
+    for (dev = inputInfo.off_devices; dev; dev = dev->next)
+    {
+        info->deviceid = dev->id;
+        info->enabled = dev->enabled;
+        info->use = GetDeviceUse(dev, &info->attachment);
+        info->flags = flags[dev->id];
+        ev->flags |= info->flags;
+        info++;
+    }
+
+
+    for (i = 0; i < MAXDEVICES; i++)
+    {
+        if (flags[i] & (XIMasterRemoved | XISlaveRemoved))
+        {
+            info->deviceid = i;
+            info->enabled = FALSE;
+            info->flags = flags[i];
+            info->use = 0;
+            ev->flags |= info->flags;
+            ev->num_info++;
+            info++;
+        }
+    }
+
+    ev->length = (ev->num_info * sizeof(xXIHierarchyInfo))/4;
+
+    dummyDev.id = XIAllDevices;
+    SendEventToAllWindows(&dummyDev, (XI_HierarchyChangedMask >> 8), (xEvent*)ev, 1);
+}
+
+
+/***********************************************************************
+ *
+ * This procedure allows a client to change the device hierarchy through
+ * adding new master devices, removing them, etc.
+ *
+ */
+
+int SProcXIChangeHierarchy(ClientPtr client)
+{
+    char n;
+
+    REQUEST(xXIChangeHierarchyReq);
+    swaps(&stuff->length, n);
+    return (ProcXIChangeHierarchy(client));
+}
+
+#define SWAPIF(cmd) if (client->swapped) { cmd; }
+
+int
+ProcXIChangeHierarchy(ClientPtr client)
+{
+    DeviceIntPtr ptr, keybd, xtstptr, xtstkeybd;
+    xXIAnyHierarchyChangeInfo *any;
+    int required_len = sizeof(xXIChangeHierarchyReq);
+    char n;
+    int rc = Success;
+    int flags[MAXDEVICES] = {0};
+
+    REQUEST(xXIChangeHierarchyReq);
+    REQUEST_AT_LEAST_SIZE(xXIChangeHierarchyReq);
+
+    if (!stuff->num_changes)
+        return rc;
+
+    any = (xXIAnyHierarchyChangeInfo*)&stuff[1];
+    while(stuff->num_changes--)
+    {
+        SWAPIF(swapl(&any->type, n));
+        SWAPIF(swaps(&any->length, n));
+
+        required_len += any->length;
+        if ((stuff->length * 4) < required_len)
+            return BadLength;
+
+        switch(any->type)
+        {
+            case XIAddMaster:
+                {
+                    xXIAddMasterInfo* c = (xXIAddMasterInfo*)any;
+                    char* name;
+
+                    SWAPIF(swaps(&c->name_len, n));
+                    name = xcalloc(c->name_len + 1, sizeof(char));
+                    strncpy(name, (char*)&c[1], c->name_len);
+
+
+                    rc = AllocDevicePair(client, name, &ptr, &keybd, TRUE);
+                    if (rc != Success)
+                    {
+                        xfree(name);
+                        goto unwind;
+                    }
+
+                    if (!c->send_core)
+                        ptr->coreEvents = keybd->coreEvents =  FALSE;
+
+		    /* Allocate virtual slave devices for xtest events */
+                    rc = AllocXtstDevice(client, name, &xtstptr, &xtstkeybd);
+                    if (rc != Success)
+                    {
+
+                        xfree(name);
+                        goto unwind;
+                    }
+
+                    ActivateDevice(ptr, FALSE);
+                    ActivateDevice(keybd, FALSE);
+                    flags[ptr->id] |= XIMasterAdded;
+                    flags[keybd->id] |= XIMasterAdded;
+
+                    ActivateDevice(xtstptr, FALSE);
+                    ActivateDevice(xtstkeybd, FALSE);
+                    flags[xtstptr->id] |= XISlaveAdded;
+                    flags[xtstkeybd->id] |= XISlaveAdded;
+
+                    if (c->enable)
+                    {
+                        EnableDevice(ptr, FALSE);
+                        EnableDevice(keybd, FALSE);
+                        flags[ptr->id] |= XIDeviceEnabled;
+                        flags[keybd->id] |= XIDeviceEnabled;
+
+                        EnableDevice(xtstptr, FALSE);
+                        EnableDevice(xtstkeybd, FALSE);
+                        flags[xtstptr->id] |= XIDeviceEnabled;
+                        flags[xtstkeybd->id] |= XIDeviceEnabled;
+                    }
+
+                    /* Attach the XTest virtual devices to the newly
+                       created master device */
+                    AttachDevice(NULL, xtstptr, ptr);
+                    AttachDevice(NULL, xtstkeybd, keybd);
+                    flags[xtstptr->id] |= XISlaveAttached;
+                    flags[xtstkeybd->id] |= XISlaveAttached;
+
+                    xfree(name);
+                }
+                break;
+            case XIRemoveMaster:
+                {
+                    xXIRemoveMasterInfo* r = (xXIRemoveMasterInfo*)any;
+                    DeviceIntPtr xtstdevice;
+
+                    if (r->return_mode != XIAttachToMaster &&
+                            r->return_mode != XIFloating)
+                        return BadValue;
+
+                    if (r->deviceid > 0xFF) /* FIXME */
+                    {
+                        client->errorValue = r->deviceid;
+                        return BadImplementation;
+                    }
+
+                    rc = dixLookupDevice(&ptr, r->deviceid, client,
+                                         DixDestroyAccess);
+                    if (rc != Success)
+                        goto unwind;
+
+                    if (!IsMaster(ptr))
+                    {
+                        client->errorValue = r->deviceid;
+                        rc = BadDevice;
+                        goto unwind;
+                    }
+
+                    /* XXX: For now, don't allow removal of VCP, VCK */
+                    if (ptr == inputInfo.pointer ||
+                            ptr == inputInfo.keyboard)
+                    {
+                        rc = BadDevice;
+                        goto unwind;
+                    }
+
+                    for(xtstdevice = inputInfo.devices; xtstdevice ; xtstdevice = xtstdevice->next )
+                        if( !IsMaster(xtstdevice) && xtstdevice->u.master == ptr &&
+                            dixLookupPrivate(&xtstdevice->devPrivates, XTstDevicePrivateKey ))
+                            break;
+
+                    rc = dixLookupDevice(&xtstptr, xtstdevice->id, client,
+                                         DixDestroyAccess);
+                    if (rc != Success)
+                        goto unwind;
+
+                    /* find keyboards to destroy */
+                    if (IsPointerDevice(ptr))
+                    {
+                        rc = dixLookupDevice(&keybd,
+                                             ptr->spriteInfo->paired->id,
+                                             client,
+                                             DixDestroyAccess);
+                        if (rc != Success)
+                            goto unwind;
+
+                    }
+                    else
+                    {
+                        keybd = ptr;
+                        rc = dixLookupDevice(&ptr,
+                                             keybd->spriteInfo->paired->id,
+                                             client,
+                                             DixDestroyAccess);
+                        if (rc != Success)
+                            goto unwind;
+
+                    }
+
+                    /* handle xtst pointer / keyboard slave devices */
+                    if ( IsPointerDevice(xtstptr))
+                    {
+                        /* Search the matching keyboard */
+                        for(xtstdevice = inputInfo.devices; xtstdevice ; xtstdevice = xtstdevice->next )
+                            if( !IsMaster(xtstdevice) &&
+                                xtstdevice->u.master == keybd &&
+                                IsKeyboardDevice(xtstdevice) &&
+                                dixLookupPrivate(&xtstdevice->devPrivates, XTstDevicePrivateKey ))
+                                break;
+
+                        rc = dixLookupDevice(&xtstkeybd,
+                                             xtstdevice->id,
+                                             client,
+                                             DixDestroyAccess);
+
+                        if (rc != Success)
+                            goto unwind;
+                    }
+                    else
+                    {
+                        xtstkeybd = xtstptr;
+                        /* Search the matching pointer */
+                        for(xtstdevice = inputInfo.devices; xtstdevice ; xtstdevice = xtstdevice->next )
+                            if( !IsMaster(xtstdevice) &&
+                                xtstdevice->u.master == ptr &&
+                                IsPointerDevice(xtstdevice) &&
+                                dixLookupPrivate(&xtstdevice->devPrivates, XTstDevicePrivateKey )
+                              )
+                                break;
+                        rc = dixLookupDevice(&xtstptr,
+                                             xtstdevice->id,
+                                             client,
+                                             DixDestroyAccess);
+
+                        if (rc != Success)
+                            goto unwind;
+                    }
+
+                    /* Disabling sends the devices floating, reattach them if
+                     * desired. */
+                    if (r->return_mode == XIAttachToMaster)
+                    {
+                        DeviceIntPtr attached,
+                                     newptr,
+                                     newkeybd;
+
+                        if (r->return_pointer > 0xFF) /* FIXME */
+                        {
+                            client->errorValue = r->deviceid;
+                            return BadImplementation;
+                        }
+
+                        rc = dixLookupDevice(&newptr, r->return_pointer,
+                                             client, DixWriteAccess);
+                        if (rc != Success)
+                            goto unwind;
+
+                        if (!IsMaster(newptr))
+                        {
+                            client->errorValue = r->return_pointer;
+                            rc = BadDevice;
+                            goto unwind;
+                        }
+
+                        if (r->return_keyboard > 0xFF) /* FIXME */
+                        {
+                            client->errorValue = r->deviceid;
+                            return BadImplementation;
+                        }
+
+                        rc = dixLookupDevice(&newkeybd, r->return_keyboard,
+                                             client, DixWriteAccess);
+                        if (rc != Success)
+                            goto unwind;
+
+                        if (!IsMaster(newkeybd))
+                        {
+                            client->errorValue = r->return_keyboard;
+                            rc = BadDevice;
+                            goto unwind;
+                        }
+
+                        for (attached = inputInfo.devices;
+                                attached;
+                                attached = attached->next)
+                        {
+                            if (!IsMaster(attached)) {
+                                if (attached->u.master == ptr)
+                                {
+                                    AttachDevice(client, attached, newptr);
+                                    flags[attached->id] |= XISlaveAttached;
+                                }
+                                if (attached->u.master == keybd)
+                                {
+                                    AttachDevice(client, attached, newkeybd);
+                                    flags[attached->id] |= XISlaveAttached;
+                                }
+                            }
+                        }
+                    }
+
+                    /* can't disable until we removed pairing */
+                    keybd->spriteInfo->paired = NULL;
+                    ptr->spriteInfo->paired = NULL;
+                    xtstptr->spriteInfo->paired = NULL;
+                    xtstkeybd->spriteInfo->paired = NULL;
+
+                    /* disable the remove the devices, xtst devices must be done first
+                       else the sprites they rely on will be destroyed  */
+                    DisableDevice(xtstptr, FALSE);
+                    DisableDevice(xtstkeybd, FALSE);
+                    DisableDevice(keybd, FALSE);
+                    DisableDevice(ptr, FALSE);
+                    flags[xtstptr->id] |= XIDeviceDisabled | XISlaveDetached;
+                    flags[xtstkeybd->id] |= XIDeviceDisabled | XISlaveDetached;
+                    flags[keybd->id] |= XIDeviceDisabled;
+                    flags[ptr->id] |= XIDeviceDisabled;
+
+                    RemoveDevice(xtstptr, FALSE);
+                    RemoveDevice(xtstkeybd, FALSE);
+                    RemoveDevice(keybd, FALSE);
+                    RemoveDevice(ptr, FALSE);
+                    flags[xtstptr->id] |= XISlaveRemoved;
+                    flags[xtstkeybd->id] |= XISlaveRemoved;
+                    flags[keybd->id] |= XIMasterRemoved;
+                    flags[ptr->id] |= XIMasterRemoved;
+                }
+                break;
+            case XIDetachSlave:
+                {
+                    xXIDetachSlaveInfo* c = (xXIDetachSlaveInfo*)any;
+                    DeviceIntPtr *xtstdevice;
+
+                    if (c->deviceid > 0xFF) /* FIXME */
+                    {
+                        client->errorValue = c->deviceid;
+                        return BadImplementation;
+                    }
+
+                    rc = dixLookupDevice(&ptr, c->deviceid, client,
+                                          DixWriteAccess);
+                    if (rc != Success)
+                       goto unwind;
+
+                    if (IsMaster(ptr))
+                    {
+                        client->errorValue = c->deviceid;
+                        rc = BadDevice;
+                        goto unwind;
+                    }
+
+                    xtstdevice = dixLookupPrivate( &ptr->devPrivates,
+                                                   XTstDevicePrivateKey );
+
+                    /* Don't allow changes to Xtst Devices, these are fixed */
+                    if( xtstdevice )
+                    {
+                        client->errorValue = c->deviceid;
+                        rc = BadDevice;
+                        goto unwind;
+                    }
+
+                    AttachDevice(client, ptr, NULL);
+                    flags[ptr->id] |= XISlaveDetached;
+                }
+                break;
+            case XIAttachSlave:
+                {
+                    xXIAttachSlaveInfo* c = (xXIAttachSlaveInfo*)any;
+                    DeviceIntPtr newmaster;
+                    DeviceIntPtr *xtstdevice;
+
+                    if (c->deviceid > 0xFF) /* FIXME */
+                    {
+                        client->errorValue = c->deviceid;
+                        return BadImplementation;
+                    }
+                    if (c->new_master > 0xFF) /* FIXME */
+                    {
+                        client->errorValue = c->new_master;
+                        return BadImplementation;
+                    }
+
+                    rc = dixLookupDevice(&ptr, c->deviceid, client,
+                                          DixWriteAccess);
+                    if (rc != Success)
+                       goto unwind;
+
+                    if (IsMaster(ptr))
+                    {
+                        client->errorValue = c->deviceid;
+                        rc = BadDevice;
+                        goto unwind;
+                    }
+
+                    xtstdevice = dixLookupPrivate( &ptr->devPrivates,
+                                                   XTstDevicePrivateKey );
+
+                    /* Don't allow changes to Xtst Devices, these are fixed */
+                    if( xtstdevice )
+                    {
+                        client->errorValue = c->deviceid;
+                        rc = BadDevice;
+                        goto unwind;
+                    }
+
+                    rc = dixLookupDevice(&newmaster, c->new_master,
+                            client, DixWriteAccess);
+                    if (rc != Success)
+                        goto unwind;
+                    if (!IsMaster(newmaster))
+                    {
+                        client->errorValue = c->new_master;
+                        rc = BadDevice;
+                        goto unwind;
+                    }
+
+                    if (!((IsPointerDevice(newmaster) &&
+                                    IsPointerDevice(ptr)) ||
+                                (IsKeyboardDevice(newmaster) &&
+                                 IsKeyboardDevice(ptr))))
+                    {
+                        rc = BadDevice;
+                        goto unwind;
+                    }
+                    AttachDevice(client, ptr, newmaster);
+                    flags[ptr->id] |= XISlaveAttached;
+                }
+                break;
+        }
+
+        any = (xXIAnyHierarchyChangeInfo*)((char*)any + any->length * 4);
+    }
+
+unwind:
+
+    XISendDeviceHierarchyEvent(flags);
+    return rc;
+}
+
diff --git a/Xi/xichangehierarchy.h b/Xi/xichangehierarchy.h
new file mode 100644
index 0000000..b46cfb4
--- /dev/null
+++ b/Xi/xichangehierarchy.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2007-2008 Peter Hutterer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer, University of South Australia, NICTA
+ */
+
+/***********************************************************************
+ *
+ * Request change in the device hierarchy.
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifndef CHDEVHIER_H
+#define CHDEVHIER_H 1
+
+int SProcXIChangeHierarchy(ClientPtr /* client */);
+int ProcXIChangeHierarchy(ClientPtr /* client */);
+
+void XISendDeviceHierarchyEvent(int flags[]);
+
+#endif
diff --git a/Xi/xigetclientpointer.c b/Xi/xigetclientpointer.c
new file mode 100644
index 0000000..859d3fd
--- /dev/null
+++ b/Xi/xigetclientpointer.c
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2007-2008 Peter Hutterer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer, University of South Australia, NICTA
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>	/* for inputstr.h    */
+#include <X11/Xproto.h>	/* Request macro     */
+#include "inputstr.h"	/* DeviceIntPtr      */
+#include "windowstr.h"	/* window structure  */
+#include "scrnintstr.h"	/* screen structure  */
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XI2proto.h>
+#include "extnsionst.h"
+#include "extinit.h"	/* LookupDeviceIntRec */
+#include "exevents.h"
+#include "exglobals.h"
+
+#include "xigetclientpointer.h"
+
+/***********************************************************************
+ * This procedure allows a client to query another client's client pointer
+ * setting.
+ */
+
+int
+SProcXIGetClientPointer(ClientPtr client)
+{
+    char n;
+    REQUEST(xXIGetClientPointerReq);
+
+    swaps(&stuff->length, n);
+    swapl(&stuff->win, n);
+    return ProcXIGetClientPointer(client);
+}
+
+int ProcXIGetClientPointer(ClientPtr client)
+{
+    int rc;
+    ClientPtr winclient;
+    xXIGetClientPointerReply rep;
+    REQUEST(xXIGetClientPointerReq);
+    REQUEST_SIZE_MATCH(xXIGetClientPointerReq);
+
+    if (stuff->win != None)
+    {
+        rc = dixLookupClient(&winclient, stuff->win, client,
+                DixWriteAccess);
+
+        if (rc != Success)
+            return BadWindow;
+    } else
+        winclient = client;
+
+    rep.repType = X_Reply;
+    rep.RepType = X_XIGetClientPointer;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    rep.set = (winclient->clientPtr != NULL);
+    rep.deviceid = (winclient->clientPtr) ? winclient->clientPtr->id : 0;
+
+    WriteReplyToClient(client, sizeof(xXIGetClientPointerReply), &rep);
+    return Success;
+}
+
+/***********************************************************************
+ *
+ * This procedure writes the reply for the XGetClientPointer function,
+ * if the client and server have a different byte ordering.
+ *
+ */
+
+void
+SRepXIGetClientPointer(ClientPtr client, int size,
+        xXIGetClientPointerReply* rep)
+{
+    char n;
+    swaps(&rep->sequenceNumber, n);
+    swapl(&rep->length, n);
+    swaps(&rep->deviceid, n);
+    WriteToClient(client, size, (char *)rep);
+}
+
diff --git a/Xi/xigetclientpointer.h b/Xi/xigetclientpointer.h
new file mode 100644
index 0000000..1539aa8
--- /dev/null
+++ b/Xi/xigetclientpointer.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2007-2008 Peter Hutterer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer, University of South Australia, NICTA
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifndef GETCPTR_H
+#define GETCPTR_H 1
+int SProcXIGetClientPointer(ClientPtr /* client */);
+int ProcXIGetClientPointer(ClientPtr /* client */);
+void SRepXIGetClientPointer(ClientPtr /* client */,
+        int /* size */,
+        xXIGetClientPointerReply* /* rep */);
+
+#endif /* GETCPTR_H */
diff --git a/Xi/xiquerydevice.c b/Xi/xiquerydevice.c
new file mode 100644
index 0000000..07ddfa1
--- /dev/null
+++ b/Xi/xiquerydevice.c
@@ -0,0 +1,451 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Peter Hutterer
+ *
+ */
+
+/**
+ * @file Protocol handling for the XIQueryDevice request/reply.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "inputstr.h"
+#include <X11/X.h>
+#include <X11/extensions/XI2proto.h>
+#include "xkbstr.h"
+#include "xkbsrv.h"
+#include "xserver-properties.h"
+#include "exevents.h"
+
+#include "xiquerydevice.h"
+
+static int ListDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info);
+static int SizeDeviceInfo(DeviceIntPtr dev);
+static void SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info);
+int
+SProcXIQueryDevice(ClientPtr client)
+{
+    char n;
+
+    REQUEST(xXIQueryDeviceReq);
+
+    swaps(&stuff->length, n);
+    swaps(&stuff->deviceid, n);
+
+    return ProcXIQueryDevice(client);
+}
+
+int
+ProcXIQueryDevice(ClientPtr client)
+{
+    xXIQueryDeviceReply rep;
+    DeviceIntPtr dev = NULL;
+    int rc = Success;
+    int len = 0;
+    char *info, *ptr;
+
+    REQUEST(xXIQueryDeviceReq);
+    REQUEST_SIZE_MATCH(xXIQueryDeviceReq);
+
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
+
+    if (stuff->deviceid != XIAllDevices && stuff->deviceid != XIAllMasterDevices)
+    {
+        rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
+        if (rc != Success)
+        {
+            client->errorValue = stuff->deviceid;
+            return rc;
+        }
+    }
+
+    if (dev)
+        len += SizeDeviceInfo(dev);
+    else
+    {
+        len = 0;
+        for (dev = inputInfo.devices; dev; dev = dev->next)
+        {
+            if (stuff->deviceid == XIAllDevices ||
+                (stuff->deviceid == XIAllMasterDevices && IsMaster(dev)))
+                len += SizeDeviceInfo(dev);
+        }
+
+        for (dev = inputInfo.off_devices; dev; dev = dev->next)
+        {
+            if (stuff->deviceid == XIAllDevices ||
+                (stuff->deviceid == XIAllMasterDevices && IsMaster(dev)))
+                len += SizeDeviceInfo(dev);
+        }
+
+        dev = NULL;
+    }
+
+    info = xcalloc(1, len);
+    if (!info)
+        return BadAlloc;
+
+    memset(&rep, 0, sizeof(xXIQueryDeviceReply));
+    rep.repType = X_Reply;
+    rep.RepType = X_XIQueryDevice;
+    rep.sequenceNumber = client->sequence;
+    rep.length = len/4;
+    rep.num_devices = 0;
+
+    ptr = info;
+    if (dev)
+    {
+        len = ListDeviceInfo(dev, (xXIDeviceInfo*)info);
+        if (client->swapped)
+            SwapDeviceInfo(dev, (xXIDeviceInfo*)info);
+        info += len;
+        rep.num_devices = 1;
+    } else
+    {
+        for (dev = inputInfo.devices; dev; dev = dev->next)
+        {
+            if (stuff->deviceid == XIAllDevices ||
+                    (stuff->deviceid == XIAllMasterDevices && IsMaster(dev)))
+            {
+                len = ListDeviceInfo(dev, (xXIDeviceInfo*)info);
+                if (client->swapped)
+                    SwapDeviceInfo(dev, (xXIDeviceInfo*)info);
+                info += len;
+                rep.num_devices++;
+            }
+        }
+
+        for (dev = inputInfo.off_devices; dev; dev = dev->next)
+        {
+            if (stuff->deviceid == XIAllDevices ||
+                    (stuff->deviceid == XIAllMasterDevices && IsMaster(dev)))
+            {
+                len = ListDeviceInfo(dev, (xXIDeviceInfo*)info);
+                if (client->swapped)
+                    SwapDeviceInfo(dev, (xXIDeviceInfo*)info);
+                info += len;
+                rep.num_devices++;
+            }
+        }
+    }
+
+    WriteReplyToClient(client, sizeof(xXIQueryDeviceReply), &rep);
+    WriteToClient(client, rep.length * 4, ptr);
+    return rc;
+}
+
+void
+SRepXIQueryDevice(ClientPtr client, int size, xXIQueryDeviceReply *rep)
+{
+    char n;
+
+    swaps(&rep->sequenceNumber, n);
+    swapl(&rep->length, n);
+    swaps(&rep->num_devices, n);
+
+    /* Device info is already swapped, see ProcXIQueryDevice */
+
+    WriteToClient(client, size, (char *)rep);
+}
+
+
+
+/**
+ * @return The number of bytes needed to store this device's xXIDeviceInfo
+ * (and its classes).
+ */
+static int
+SizeDeviceInfo(DeviceIntPtr dev)
+{
+    int len = sizeof(xXIDeviceInfo);
+
+    /* 4-padded name */
+    len += (((strlen(dev->name) + 3)/4)*4);
+
+    return len + SizeDeviceClasses(dev);
+
+}
+
+/*
+ * @return The number of bytes needed to store this device's classes.
+ */
+int
+SizeDeviceClasses(DeviceIntPtr dev)
+{
+    int len = 0;
+
+    if (dev->button)
+    {
+        len += sizeof(xXIButtonInfo);
+        len += dev->button->numButtons * sizeof(Atom);
+    }
+
+    if (dev->key)
+    {
+        XkbDescPtr xkb = dev->key->xkbInfo->desc;
+        len += sizeof(xXIKeyInfo);
+        len += (xkb->max_key_code - xkb->min_key_code + 1) * sizeof(uint32_t);
+    }
+
+    if (dev->valuator)
+        len += sizeof(xXIValuatorInfo) * dev->valuator->numAxes;
+
+    return len;
+}
+
+
+/**
+ * Write button information into info.
+ * @return Number of bytes written into info.
+ */
+int
+ListButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info)
+{
+    info->type = ButtonClass;
+    info->num_buttons = dev->button->numButtons;
+    info->length = 2 + info->num_buttons;
+
+    /** XXX: button labels */
+
+    return info->length * 4;
+}
+
+static void
+SwapButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info)
+{
+    char n;
+    Atom *btn;
+    int i;
+    swaps(&info->type, n);
+    swaps(&info->length, n);
+
+    for (i = 0, btn = (Atom*)&info[1]; i < info->num_buttons; i++, btn++)
+        swaps(btn, n);
+
+    swaps(&info->num_buttons, n);
+}
+
+/**
+ * Write key information into info.
+ * @return Number of bytes written into info.
+ */
+int
+ListKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info)
+{
+    int i;
+    XkbDescPtr xkb = dev->key->xkbInfo->desc;
+    uint32_t *kc;
+
+    info->type = KeyClass;
+    info->num_keycodes = xkb->max_key_code - xkb->min_key_code + 1;
+    info->length = 2 + info->num_keycodes;
+
+    kc = (uint32_t*)&info[1];
+    for (i = xkb->min_key_code; i <= xkb->max_key_code; i++, kc++)
+        *kc = i;
+
+    return info->length * 4;
+}
+
+static void
+SwapKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info)
+{
+    char n;
+    uint32_t *key;
+    int i;
+    swaps(&info->type, n);
+    swaps(&info->length, n);
+
+    for (i = 0, key = (uint32_t*)&info[1]; i < info->num_keycodes; i++, key++)
+        swapl(key, n);
+
+    swaps(&info->num_keycodes, n);
+}
+
+/**
+ * List axis information for the given axis.
+ *
+ * @return The number of bytes written into info.
+ */
+int
+ListValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info, int axisnumber)
+{
+    ValuatorClassPtr v = dev->valuator;
+
+    info->type = ValuatorClass;
+    info->length = sizeof(xXIValuatorInfo)/4;
+    info->name = XIGetKnownProperty(AXIS_LABEL_PROP_REL_MISC); /* XXX */
+    info->min.integral = v->axes[axisnumber].min_value;
+    info->min.frac = 0;
+    info->max.integral = v->axes[axisnumber].max_value;
+    info->max.frac = 0;
+    info->resolution = v->axes[axisnumber].resolution;
+    info->number = axisnumber;
+    info->mode = v->mode; /* Server doesn't have per-axis mode yet */
+
+    return info->length * 4;
+}
+
+static void
+SwapValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info)
+{
+    char n;
+    swaps(&info->type, n);
+    swaps(&info->length, n);
+    swapl(&info->name, n);
+    swapl(&info->min.integral, n);
+    swapl(&info->min.frac, n);
+    swapl(&info->max.integral, n);
+    swapl(&info->max.frac, n);
+    swaps(&info->number, n);
+}
+
+int GetDeviceUse(DeviceIntPtr dev, uint16_t *attachment)
+{
+    DeviceIntPtr master = dev->u.master;
+    int use;
+
+    if (IsMaster(dev))
+    {
+        DeviceIntPtr paired = GetPairedDevice(dev);
+        use = IsPointerDevice(dev) ? XIMasterPointer : XIMasterKeyboard;
+        *attachment = (paired ? paired->id : 0);
+    } else if (master)
+    {
+        use = IsPointerDevice(master) ? XISlavePointer : XISlaveKeyboard;
+        *attachment = master->id;
+    } else
+        use = XIFloatingSlave;
+
+    return use;
+}
+
+/**
+ * Write the info for device dev into the buffer pointed to by info.
+ *
+ * @return The number of bytes used.
+ */
+static int
+ListDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info)
+{
+    char *any = (char*)&info[1];
+    int len = 0, total_len = 0;
+
+    info->deviceid = dev->id;
+    info->use = GetDeviceUse(dev, &info->attachment);
+    info->num_classes = 0;
+    info->name_len = strlen(dev->name);
+    info->enabled = dev->enabled;
+    total_len = sizeof(xXIDeviceInfo);
+
+    len = ((info->name_len + 3)/4) * 4;
+    memset(any, 0, len);
+    strncpy(any, dev->name, info->name_len);
+    any += len;
+    total_len += len;
+
+    return total_len + ListDeviceClasses(dev, any, &info->num_classes);
+}
+
+/**
+ * Write the class info of the device into the memory pointed to by any, set
+ * nclasses to the number of classes in total and return the number of bytes
+ * written.
+ */
+int
+ListDeviceClasses(DeviceIntPtr dev, char *any, uint16_t *nclasses)
+{
+    int total_len = 0;
+    int len;
+    int i;
+
+    if (dev->button)
+    {
+        (*nclasses)++;
+        len = ListButtonInfo(dev, (xXIButtonInfo*)any);
+        any += len;
+        total_len += len;
+    }
+
+    if (dev->key)
+    {
+        (*nclasses)++;
+        len = ListKeyInfo(dev, (xXIKeyInfo*)any);
+        any += len;
+        total_len += len;
+    }
+
+    for (i = 0; dev->valuator && i < dev->valuator->numAxes; i++)
+    {
+        (*nclasses)++;
+        len = ListValuatorInfo(dev, (xXIValuatorInfo*)any, i);
+        any += len;
+        total_len += len;
+    }
+
+    return total_len;
+}
+
+static void
+SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info)
+{
+    char n;
+    char *any = (char*)&info[1];
+    int i;
+
+    /* Skip over name */
+    any += (((info->name_len + 3)/4) * 4);
+
+    for (i = 0; i < info->num_classes; i++)
+    {
+        int len = ((xXIAnyInfo*)any)->length;
+        switch(((xXIAnyInfo*)any)->type)
+        {
+            case XIButtonClass:
+                SwapButtonInfo(dev, (xXIButtonInfo*)any);
+                break;
+            case XIKeyClass:
+                SwapKeyInfo(dev, (xXIKeyInfo*)any);
+                break;
+            case XIValuatorClass:
+                SwapValuatorInfo(dev, (xXIValuatorInfo*)any);
+                break;
+        }
+
+        any += len * 4;
+    }
+
+    swaps(&info->deviceid, n);
+    swaps(&info->use, n);
+    swaps(&info->attachment, n);
+    swaps(&info->num_classes, n);
+    swaps(&info->name_len, n);
+
+}
diff --git a/Xi/xiquerydevice.h b/Xi/xiquerydevice.h
new file mode 100644
index 0000000..34e87bd
--- /dev/null
+++ b/Xi/xiquerydevice.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Peter Hutterer
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifndef QUERYDEV_H
+#define QUERYDEV_H 1
+
+#include <X11/extensions/XI2proto.h>
+
+int SProcXIQueryDevice(ClientPtr client);
+int ProcXIQueryDevice(ClientPtr client);
+void SRepXIQueryDevice(ClientPtr client, int size, xXIQueryDeviceReply *rep);
+int SizeDeviceClasses(DeviceIntPtr dev);
+int ListDeviceClasses(DeviceIntPtr dev, char* any, uint16_t* nclasses);
+int GetDeviceUse(DeviceIntPtr dev, uint16_t *attachment);
+int ListButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info);
+int ListKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info);
+int ListValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info, int axisnumber);
+#endif /* QUERYDEV_H */
diff --git a/Xi/xiquerypointer.c b/Xi/xiquerypointer.c
new file mode 100644
index 0000000..1d00b9e
--- /dev/null
+++ b/Xi/xiquerypointer.c
@@ -0,0 +1,210 @@
+/*
+ * Copyright 2007-2008 Peter Hutterer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer, University of South Australia, NICTA
+ */
+
+/***********************************************************************
+ *
+ * Request to query the pointer location of an extension input device.
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>	/* for inputstr.h    */
+#include <X11/Xproto.h>	/* Request macro     */
+#include "inputstr.h"	/* DeviceIntPtr      */
+#include "windowstr.h"	/* window structure  */
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XI2proto.h>
+#include "extnsionst.h"
+#include "exevents.h"
+#include "exglobals.h"
+#include "eventconvert.h"
+#include "xkbsrv.h"
+
+#ifdef PANORAMIX
+#include "panoramiXsrv.h"
+#endif
+
+#include "xiquerypointer.h"
+
+/***********************************************************************
+ *
+ * This procedure allows a client to query the pointer of a device.
+ *
+ */
+
+int
+SProcXIQueryPointer(ClientPtr client)
+{
+    char n;
+
+    REQUEST(xXIQueryPointerReq);
+    swaps(&stuff->length, n);
+    return (ProcXIQueryPointer(client));
+}
+
+int
+ProcXIQueryPointer(ClientPtr client)
+{
+    int rc;
+    xXIQueryPointerReply rep;
+    DeviceIntPtr pDev, kbd;
+    WindowPtr pWin, t;
+    SpritePtr pSprite;
+    XkbStatePtr state;
+    char *buttons = NULL;
+
+    REQUEST(xXIQueryPointerReq);
+    REQUEST_SIZE_MATCH(xXIQueryPointerReq);
+
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
+
+    rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixReadAccess);
+    if (rc != Success)
+        return rc;
+
+    if (pDev->valuator == NULL)
+    {
+        client->errorValue = stuff->deviceid;
+        return BadDevice;
+    }
+
+    rc = dixLookupWindow(&pWin, stuff->win, client, DixReadAccess);
+    if (rc != Success)
+    {
+        SendErrorToClient(client, IReqCode, X_XIQueryPointer,
+                stuff->win, rc);
+        return Success;
+    }
+
+    if (pDev->valuator->motionHintWindow)
+        MaybeStopHint(pDev, client);
+
+    kbd = GetPairedDevice(pDev);
+
+    pSprite = pDev->spriteInfo->sprite;
+    rep.repType = X_Reply;
+    rep.RepType = X_XIQueryPointer;
+    rep.length = 5;
+    rep.sequenceNumber = client->sequence;
+    rep.root = (GetCurrentRootWindow(pDev))->drawable.id;
+    rep.root_x = FP1616(pSprite->hot.x, 0);
+    rep.root_y = FP1616(pSprite->hot.y, 0);
+    rep.child = None;
+
+    state = &kbd->key->xkbInfo->prev_state;
+    rep.mods.base_mods = state->base_mods;
+    rep.mods.latched_mods = state->latched_mods;
+    rep.mods.locked_mods = state->locked_mods;
+
+    rep.group.base_group = state->base_group;
+    rep.group.latched_group = state->latched_group;
+    rep.group.locked_group = state->locked_group;
+
+    if (pDev->button)
+    {
+        int i, down;
+        rep.buttons_len = (((pDev->button->numButtons + 7)/8) + 3)/4;
+        rep.length += rep.buttons_len;
+        buttons = xcalloc(rep.buttons_len, 4);
+        if (!buttons)
+            return BadAlloc;
+
+        down = pDev->button->buttonsDown;
+
+        for (i = 0; i < pDev->button->numButtons && down; i++)
+        {
+            if (BitIsOn(pDev->button->down, i))
+            {
+                SetBit(buttons, i);
+                down--;
+            }
+        }
+    } else
+        rep.buttons_len = 0;
+
+    if (pSprite->hot.pScreen == pWin->drawable.pScreen)
+    {
+        rep.same_screen = xTrue;
+        rep.win_x = FP1616(pSprite->hot.x - pWin->drawable.x, 0);
+        rep.win_y = FP1616(pSprite->hot.y - pWin->drawable.y, 0);
+        for (t = pSprite->win; t; t = t->parent)
+            if (t->parent == pWin)
+            {
+                rep.child = t->drawable.id;
+                break;
+            }
+    } else
+    {
+        rep.same_screen = xFalse;
+        rep.win_x = 0;
+        rep.win_y = 0;
+    }
+
+#ifdef PANORAMIX
+    if(!noPanoramiXExtension) {
+        rep.root_x += FP1616(panoramiXdataPtr[0].x, 0);
+        rep.root_y += FP1616(panoramiXdataPtr[0].y, 0);
+        if (stuff->win == rep.root)
+        {
+            rep.win_x += FP1616(panoramiXdataPtr[0].x, 0);
+            rep.win_y += FP1616(panoramiXdataPtr[0].y, 0);
+        }
+    }
+#endif
+
+    WriteReplyToClient(client, sizeof(xXIQueryPointerReply), &rep);
+    if (buttons)
+        WriteToClient(client, rep.buttons_len * 4, buttons);
+
+    xfree(buttons);
+
+    return Success;
+}
+
+/***********************************************************************
+ *
+ * This procedure writes the reply for the XIQueryPointer function,
+ * if the client and server have a different byte ordering.
+ *
+ */
+
+void
+SRepXIQueryPointer(ClientPtr client, int size,
+                   xXIQueryPointerReply * rep)
+{
+    char n;
+
+    swaps(&rep->sequenceNumber, n);
+    swapl(&rep->length, n);
+    WriteToClient(client, size, (char *)rep);
+}
+
diff --git a/Xi/xiquerypointer.h b/Xi/xiquerypointer.h
new file mode 100644
index 0000000..ea22376
--- /dev/null
+++ b/Xi/xiquerypointer.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2007-2008 Peter Hutterer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer, University of South Australia, NICTA
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifndef QUERYDP_H
+#define QUERYDP_H 1
+
+int SProcXIQueryPointer(ClientPtr /* client */);
+int ProcXIQueryPointer(ClientPtr /* client */);
+void SRepXIQueryPointer(ClientPtr /* client */ ,
+			int /* size */ ,
+			xXIQueryPointerReply *	/* rep */);
+
+#endif /* QUERYDP_H */
diff --git a/Xi/xiqueryversion.c b/Xi/xiqueryversion.c
new file mode 100644
index 0000000..ae63297
--- /dev/null
+++ b/Xi/xiqueryversion.c
@@ -0,0 +1,128 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Peter Hutterer
+ *
+ */
+
+/**
+ * @file xiqueryversion.c
+ * Protocol handling for the XIQueryVersion request/reply.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+
+#include "inputstr.h"
+
+#include <X11/Xmd.h>
+#include <X11/X.h>
+#include <X11/extensions/XI2proto.h>
+
+#include "exglobals.h"
+#include "exevents.h"
+#include "xiqueryversion.h"
+#include "misc.h"
+
+extern XExtensionVersion XIVersion; /* defined in getvers.c */
+/**
+ * Return the supported XI version.
+ *
+ * Saves the version the client claims to support as well, for future
+ * reference.
+ */
+int
+ProcXIQueryVersion(ClientPtr client)
+{
+    xXIQueryVersionReply rep;
+    XIClientPtr pXIClient;
+    int major, minor;
+    unsigned int sversion, cversion;
+
+    REQUEST(xXIQueryVersionReq);
+    REQUEST_SIZE_MATCH(xXIQueryVersionReq);
+
+    /* This request only exists after XI2 */
+    if (stuff->major_version < 2)
+    {
+        client->errorValue = stuff->major_version;
+        return BadValue;
+    }
+
+    pXIClient = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
+
+    sversion = XIVersion.major_version * 1000 + XIVersion.minor_version;
+    cversion = stuff->major_version * 1000 + stuff->minor_version;
+
+    if (sversion > cversion)
+    {
+        major = stuff->major_version;
+        minor = stuff->minor_version;
+    } else
+    {
+        major = XIVersion.major_version;
+        minor = XIVersion.minor_version;
+    }
+
+    pXIClient->major_version = major;
+    pXIClient->minor_version = minor;
+
+    memset(&rep, 0, sizeof(xXIQueryVersionReply));
+    rep.repType = X_Reply;
+    rep.RepType = X_XIQueryVersion;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    rep.major_version = major;
+    rep.minor_version = minor;
+
+    WriteReplyToClient(client, sizeof(xXIQueryVersionReply), &rep);
+
+    return Success;
+}
+
+/* Swapping routines */
+
+int
+SProcXIQueryVersion(ClientPtr client)
+{
+    char n;
+
+    REQUEST(xXIQueryVersionReq);
+    swaps(&stuff->length, n);
+    REQUEST_AT_LEAST_SIZE(xXIQueryVersionReq);
+    swaps(&stuff->major_version, n);
+    swaps(&stuff->minor_version, n);
+    return (ProcXIQueryVersion(client));
+}
+
+void
+SRepXIQueryVersion(ClientPtr client, int size, xXIQueryVersionReply *rep)
+{
+    char n;
+    swaps(&rep->sequenceNumber, n);
+    swapl(&rep->length, n);
+    swaps(&rep->major_version, n);
+    swaps(&rep->minor_version, n);
+    WriteToClient(client, size, (char *)rep);
+}
diff --git a/Xi/xiqueryversion.h b/Xi/xiqueryversion.h
new file mode 100644
index 0000000..06bb729
--- /dev/null
+++ b/Xi/xiqueryversion.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Peter Hutterer
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/extensions/XI2proto.h>
+
+#ifndef QUERYVERSION_H
+#define QUERYVERSION_H 1
+
+int SProcXIQueryVersion(ClientPtr client);
+int ProcXIQueryVersion(ClientPtr client);
+void SRepXIQueryVersion(ClientPtr client, int size, xXIQueryVersionReply* rep);
+
+#endif /* QUERYVERSION_H */
diff --git a/Xi/xisetclientpointer.c b/Xi/xisetclientpointer.c
new file mode 100644
index 0000000..2648074
--- /dev/null
+++ b/Xi/xisetclientpointer.c
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2007-2008 Peter Hutterer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer, University of South Australia, NICTA
+ */
+
+/***********************************************************************
+ *
+ * Request to set the client pointer for the owner of the given window.
+ * All subsequent calls that are ambiguous will choose the client pointer as
+ * default value.
+ */
+
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>	/* for inputstr.h    */
+#include <X11/Xproto.h>	/* Request macro     */
+#include "inputstr.h"	/* DeviceIntPtr      */
+#include "windowstr.h"	/* window structure  */
+#include "scrnintstr.h"	/* screen structure  */
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XI2proto.h>
+#include "extnsionst.h"
+#include "exevents.h"
+#include "exglobals.h"
+
+#include "xisetclientpointer.h"
+
+int
+SProcXISetClientPointer(ClientPtr client)
+{
+    char n;
+
+    REQUEST(xXISetClientPointerReq);
+    swaps(&stuff->length, n);
+    swapl(&stuff->win, n);
+    swaps(&stuff->deviceid, n);
+    REQUEST_SIZE_MATCH(xXISetClientPointerReq);
+    return (ProcXISetClientPointer(client));
+}
+
+int
+ProcXISetClientPointer(ClientPtr client)
+{
+    DeviceIntPtr pDev;
+    ClientPtr targetClient;
+    int rc;
+
+    REQUEST(xXISetClientPointerReq);
+    REQUEST_SIZE_MATCH(xXISetClientPointerReq);
+
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
+
+    rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixWriteAccess);
+    if (rc != Success)
+    {
+        client->errorValue = stuff->deviceid;
+        return rc;
+    }
+
+    if (!IsMaster(pDev))
+    {
+        client->errorValue = stuff->deviceid;
+        return BadDevice;
+    }
+
+    pDev = GetMaster(pDev, MASTER_POINTER);
+
+    if (stuff->win != None)
+    {
+        rc = dixLookupClient(&targetClient, stuff->win, client,
+                DixWriteAccess);
+
+        if (rc != Success)
+            return BadWindow;
+
+    } else
+        targetClient = client;
+
+    if (!SetClientPointer(targetClient, pDev))
+    {
+        client->errorValue = stuff->deviceid;
+        return BadDevice;
+    }
+
+    return Success;
+}
diff --git a/Xi/xisetclientpointer.h b/Xi/xisetclientpointer.h
new file mode 100644
index 0000000..5968d98
--- /dev/null
+++ b/Xi/xisetclientpointer.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2007-2008 Peter Hutterer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer, University of South Australia, NICTA
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifndef SETCPTR_H
+#define SETCPTR_H 1
+
+int SProcXISetClientPointer(ClientPtr /* client */);
+int ProcXISetClientPointer(ClientPtr /* client */);
+
+#endif /* SETCPTR_H */
diff --git a/Xi/xiwarppointer.c b/Xi/xiwarppointer.c
new file mode 100644
index 0000000..f3acfe4
--- /dev/null
+++ b/Xi/xiwarppointer.c
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2007-2008 Peter Hutterer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer, University of South Australia, NICTA
+ */
+
+/***********************************************************************
+ *
+ * Request to Warp the pointer location of an extension input device.
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>	/* for inputstr.h    */
+#include <X11/Xproto.h>	/* Request macro     */
+#include "inputstr.h"	/* DeviceIntPtr      */
+#include "windowstr.h"	/* window structure  */
+#include "scrnintstr.h"	/* screen structure  */
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XI2proto.h>
+#include "extnsionst.h"
+#include "exevents.h"
+#include "exglobals.h"
+#include "mipointer.h" /* for miPointerUpdateSprite */
+
+
+#include "xiwarppointer.h"
+/***********************************************************************
+ *
+ * This procedure allows a client to warp the pointer of a device.
+ *
+ */
+
+int
+SProcXIWarpPointer(ClientPtr client)
+{
+    char n;
+
+    REQUEST(xXIWarpPointerReq);
+    swaps(&stuff->length, n);
+    return (ProcXIWarpPointer(client));
+}
+
+int
+ProcXIWarpPointer(ClientPtr client)
+{
+    int rc;
+    int x, y;
+    WindowPtr dest = NULL;
+    DeviceIntPtr pDev;
+    SpritePtr pSprite;
+    ScreenPtr newScreen;
+
+    REQUEST(xXIWarpPointerReq);
+    REQUEST_SIZE_MATCH(xXIWarpPointerReq);
+
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
+
+    /* FIXME: panoramix stuff is missing, look at ProcWarpPointer */
+
+    rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixWriteAccess);
+
+    if (rc != Success)
+        return rc;
+
+    if (stuff->dst_win != None)
+    {
+        rc = dixLookupWindow(&dest, stuff->dst_win, client, DixReadAccess);
+        if (rc != Success)
+        {
+            return rc;
+        }
+    }
+
+    pSprite = pDev->spriteInfo->sprite;
+    x = pSprite->hotPhys.x;
+    y = pSprite->hotPhys.y;
+
+    if (stuff->src_win != None)
+    {
+        int winX, winY;
+        WindowPtr src;
+
+        rc = dixLookupWindow(&src, stuff->src_win, client, DixReadAccess);
+        if (rc != Success)
+        {
+            return rc;
+        }
+
+        winX = src->drawable.x;
+        winY = src->drawable.y;
+        if (src->drawable.pScreen != pSprite->hotPhys.pScreen ||
+                x < winX + stuff->src_x ||
+                y < winY + stuff->src_y ||
+                (stuff->src_width != 0 &&
+                 winX + stuff->src_x + (int)stuff->src_width < 0) ||
+                (stuff->src_height != 0 &&
+                 winY + stuff->src_y + (int)stuff->src_height < y) ||
+                !PointInWindowIsVisible(src, x, y))
+            return Success;
+    }
+
+    if (dest)
+    {
+        x = dest->drawable.x;
+        y = dest->drawable.y;
+        newScreen = dest->drawable.pScreen;
+    } else
+        newScreen = pSprite->hotPhys.pScreen;
+
+    x += stuff->dst_x;
+    y += stuff->dst_y;
+
+    if (x < 0)
+        x = 0;
+    else if (x > newScreen->width)
+        x = newScreen->width - 1;
+
+    if (y < 0)
+        y = 0;
+    else if (y > newScreen->height)
+        y = newScreen->height - 1;
+
+    if (newScreen == pSprite->hotPhys.pScreen)
+    {
+        if (x < pSprite->physLimits.x1)
+            x = pSprite->physLimits.x1;
+        else if (x >= pSprite->physLimits.x2)
+            x = pSprite->physLimits.x2 - 1;
+
+        if (y < pSprite->physLimits.y1)
+            y = pSprite->physLimits.y1;
+        else if (y >= pSprite->physLimits.y2)
+            y = pSprite->physLimits.y2 - 1;
+
+        if (pSprite->hotShape)
+            ConfineToShape(pDev, pSprite->hotShape, &x, &y);
+        (*newScreen->SetCursorPosition)(pDev, newScreen, x, y, TRUE);
+    } else if (!PointerConfinedToScreen(pDev))
+    {
+        NewCurrentScreen(pDev, newScreen, x, y);
+    }
+
+    /* if we don't update the device, we get a jump next time it moves */
+    pDev->last.valuators[0] = x;
+    pDev->last.valuators[1] = y;
+    miPointerUpdateSprite(pDev);
+
+    /* FIXME: XWarpPointer is supposed to generate an event. It doesn't do it
+       here though. */
+    return Success;
+}
+
diff --git a/Xi/xiwarppointer.h b/Xi/xiwarppointer.h
new file mode 100644
index 0000000..aafc739
--- /dev/null
+++ b/Xi/xiwarppointer.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2007-2008 Peter Hutterer
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer, University of South Australia, NICTA
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifndef WARPDEVP_H
+#define WARPDEVP_H 1
+
+int SProcXIWarpPointer(ClientPtr /* client */);
+int ProcXIWarpPointer(ClientPtr	/* client */);
+
+#endif /* WARPDEVP_H */
diff --git a/dix/devices.c b/dix/devices.c
index 3996ca6..2b03588 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -78,11 +78,11 @@ SOFTWARE.
 #include <X11/extensions/XIproto.h>
 #include "exglobals.h"
 #include "exevents.h"
-#include "querydev.h" /* for SizeDeviceClasses */
+#include "xiquerydevice.h" /* for SizeDeviceClasses */
 #include "xiproperty.h"
 #include "enterleave.h" /* for EnterWindow() */
 #include "xserver-properties.h"
-#include "chdevhier.h" /* For XISendDeviceHierarchyEvent */
+#include "xichangehierarchy.h" /* For XISendDeviceHierarchyEvent */
 
 /** @file
  * This file handles input device-related stuff.
diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index 85ddd61..ac2b0c3 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -45,7 +45,7 @@
 #include "events.h"
 #include "exglobals.h"
 #include "eventconvert.h"
-#include "querydev.h"
+#include "xiquerydevice.h"
 #include "xkbsrv.h"
 
 
commit 4ddb002b6847e8a88e6f13ae0453a35ee79946ae
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 15 15:14:47 2009 +1000

    xfree86: fix two compiler warnings in xf86vmode.c
    
    xf86vmode.c:1578: warning: pointer targets in passing argument 1 of
    ‘SwapShorts’ differ in signedness
    ../../../../include/misc.h:231: note: expected ‘short int *’ but argument is
    of type ‘CARD16 *’
    
    xf86vmode.c:1543: warning: unused variable ‘i’
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/dixmods/extmod/xf86vmode.c b/hw/xfree86/dixmods/extmod/xf86vmode.c
index 10b9ed3..bd6c594 100644
--- a/hw/xfree86/dixmods/extmod/xf86vmode.c
+++ b/hw/xfree86/dixmods/extmod/xf86vmode.c
@@ -1540,7 +1540,7 @@ static int
 ProcXF86VidModeGetGammaRamp(ClientPtr client)
 {
     CARD16 *ramp = NULL;
-    int n, length, i;
+    int n, length;
     size_t ramplen;
     xXF86VidModeGetGammaRampReply rep;
     REQUEST(xXF86VidModeGetGammaRampReq);
@@ -1575,7 +1575,7 @@ ProcXF86VidModeGetGammaRamp(ClientPtr client)
 	swaps(&rep.sequenceNumber, n);
 	swapl(&rep.length, n);
 	swaps(&rep.size, n);
-	SwapShorts(ramp, length * 3);
+	SwapShorts((short*)ramp, length * 3);
     }
     WriteToClient(client, sizeof(xXF86VidModeGetGammaRampReply), (char *)&rep);
 
commit 9d039ef5047af2dedff0c583dda11032f71bed01
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 15 15:11:55 2009 +1000

    xfree86: silence a few int10 compiler warnings.
    
    'format ‘%#x’ expects type ‘unsigned int’, but argument 2 has type ‘CARD32’'
    and similar.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/int10/helper_exec.c b/hw/xfree86/int10/helper_exec.c
index 1c89ce5..94b3d2d 100644
--- a/hw/xfree86/int10/helper_exec.c
+++ b/hw/xfree86/int10/helper_exec.c
@@ -219,7 +219,7 @@ port_rep_inb(xf86Int10InfoPtr pInt,
     register int inc = d_f ? -1 : 1;
     CARD32 dst = base;
     if (PRINT_PORT && DEBUG_IO_TRACE())
-	ErrorF(" rep_insb(%#x) %d bytes at %8.8x %s\n",
+	ErrorF(" rep_insb(%#x) %ld bytes at %8.8lx %s\n",
 		port, count, base, d_f ? "up" : "down");
     while (count--) {
 	MEM_WB(pInt, dst, x_inb(port));
@@ -235,7 +235,7 @@ port_rep_inw(xf86Int10InfoPtr pInt,
     register int inc = d_f ? -2 : 2;
     CARD32 dst = base;
     if (PRINT_PORT && DEBUG_IO_TRACE())
-	ErrorF(" rep_insw(%#x) %d bytes at %8.8x %s\n",
+	ErrorF(" rep_insw(%#x) %ld bytes at %8.8lx %s\n",
 	     port, count, base, d_f ? "up" : "down");
     while (count--) {
 	MEM_WW(pInt, dst, x_inw(port));
@@ -251,7 +251,7 @@ port_rep_inl(xf86Int10InfoPtr pInt,
     register int inc = d_f ? -4 : 4;
     CARD32 dst = base;
     if (PRINT_PORT && DEBUG_IO_TRACE())
-	ErrorF(" rep_insl(%#x) %d bytes at %8.8x %s\n",
+	ErrorF(" rep_insl(%#x) %ld bytes at %8.8lx %s\n",
 	     port, count, base, d_f ? "up" : "down");
     while (count--) {
 	MEM_WL(pInt, dst, x_inl(port));
@@ -267,7 +267,7 @@ port_rep_outb(xf86Int10InfoPtr pInt,
     register int inc = d_f ? -1 : 1;
     CARD32 dst = base;
     if (PRINT_PORT && DEBUG_IO_TRACE())
-	ErrorF(" rep_outb(%#x) %d bytes at %8.8x %s\n",
+	ErrorF(" rep_outb(%#x) %ld bytes at %8.8lx %s\n",
 	     port, count, base, d_f ? "up" : "down");
     while (count--) {
 	x_outb(port, MEM_RB(pInt, dst));
@@ -283,7 +283,7 @@ port_rep_outw(xf86Int10InfoPtr pInt,
     register int inc = d_f ? -2 : 2;
     CARD32 dst = base;
     if (PRINT_PORT && DEBUG_IO_TRACE())
-	ErrorF(" rep_outw(%#x) %d bytes at %8.8x %s\n",
+	ErrorF(" rep_outw(%#x) %ld bytes at %8.8lx %s\n",
 	     port, count, base, d_f ? "up" : "down");
     while (count--) {
 	x_outw(port, MEM_RW(pInt, dst));
@@ -299,7 +299,7 @@ port_rep_outl(xf86Int10InfoPtr pInt,
     register int inc = d_f ? -4 : 4;
     CARD32 dst = base;
     if (PRINT_PORT && DEBUG_IO_TRACE())
-	ErrorF(" rep_outl(%#x) %d bytes at %8.8x %s\n",
+	ErrorF(" rep_outl(%#x) %ld bytes at %8.8lx %s\n",
 	     port, count, base, d_f ? "up" : "down");
     while (count--) {
 	x_outl(port, MEM_RL(pInt, dst));
@@ -409,7 +409,7 @@ x_inl(CARD16 port)
     if (!pciCfg1in(port, &val)) {
 	val = inl(Int10Current->ioBase + port);
 	if (PRINT_PORT && DEBUG_IO_TRACE())
-	    ErrorF(" inl(%#x) = %8.8x\n", port, val);
+	    ErrorF(" inl(%#x) = %8.8lx\n", port, val);
     }
     return val;
 }
@@ -419,7 +419,7 @@ x_outl(CARD16 port, CARD32 val)
 {
     if (!pciCfg1out(port, val)) {
 	if (PRINT_PORT && DEBUG_IO_TRACE())
-	    ErrorF(" outl(%#x, %8.8x)\n", port, val);
+	    ErrorF(" outl(%#x, %8.8lx)\n", port, val);
 	outl(Int10Current->ioBase + port, val);
     }
 }
@@ -500,7 +500,7 @@ pciCfg1in(CARD16 addr, CARD32 *val)
 	pci_device_cfg_read_u32(pci_device_for_cfg_address(PciCfg1Addr),
 			val, PCI_OFFSET(PciCfg1Addr));
 	if (PRINT_PORT && DEBUG_IO_TRACE())
-	    ErrorF(" cfg_inl(%#x) = %8.8x\n", PciCfg1Addr, *val);
+	    ErrorF(" cfg_inl(%#lx) = %8.8lx\n", PciCfg1Addr, *val);
 	return 1;
     }
     return 0;
@@ -515,7 +515,7 @@ pciCfg1out(CARD16 addr, CARD32 val)
     }
     if (addr == 0xCFC) {
 	if (PRINT_PORT && DEBUG_IO_TRACE())
-	    ErrorF(" cfg_outl(%#x, %8.8x)\n", PciCfg1Addr, val);
+	    ErrorF(" cfg_outl(%#lx, %8.8lx)\n", PciCfg1Addr, val);
 	pci_device_cfg_write_u32(pci_device_for_cfg_address(PciCfg1Addr),
 			val, PCI_OFFSET(PciCfg1Addr));
 	return 1;
@@ -539,7 +539,7 @@ pciCfg1inw(CARD16 addr, CARD16 *val)
 	pci_device_cfg_read_u16(pci_device_for_cfg_address(PciCfg1Addr),
 			val, PCI_OFFSET(PciCfg1Addr) + offset);
 	if (PRINT_PORT && DEBUG_IO_TRACE())
-	    ErrorF(" cfg_inw(%#x) = %4.4x\n", PciCfg1Addr + offset, *val);
+	    ErrorF(" cfg_inw(%#lx) = %4.4x\n", PciCfg1Addr + offset, *val);
 	return 1;
     }
     return 0;
@@ -560,7 +560,7 @@ pciCfg1outw(CARD16 addr, CARD16 val)
 	const unsigned offset = addr - 0xCFC;
 
 	if (PRINT_PORT && DEBUG_IO_TRACE())
-	    ErrorF(" cfg_outw(%#x, %4.4x)\n", PciCfg1Addr + offset, val);
+	    ErrorF(" cfg_outw(%#lx, %4.4x)\n", PciCfg1Addr + offset, val);
 	pci_device_cfg_write_u16(pci_device_for_cfg_address(PciCfg1Addr),
 			val, PCI_OFFSET(PciCfg1Addr) + offset);
 	return 1;
@@ -584,7 +584,7 @@ pciCfg1inb(CARD16 addr, CARD8 *val)
 	pci_device_cfg_read_u8(pci_device_for_cfg_address(PciCfg1Addr),
 			val, PCI_OFFSET(PciCfg1Addr) + offset);
 	if (PRINT_PORT && DEBUG_IO_TRACE())
-	    ErrorF(" cfg_inb(%#x) = %2.2x\n", PciCfg1Addr + offset, *val);
+	    ErrorF(" cfg_inb(%#lx) = %2.2x\n", PciCfg1Addr + offset, *val);
 	return 1;
     }
     return 0;
@@ -605,7 +605,7 @@ pciCfg1outb(CARD16 addr, CARD8 val)
 	const unsigned offset = addr - 0xCFC;
 
 	if (PRINT_PORT && DEBUG_IO_TRACE())
-	    ErrorF(" cfg_outb(%#x, %2.2x)\n", PciCfg1Addr + offset, val);
+	    ErrorF(" cfg_outb(%#lx, %2.2x)\n", PciCfg1Addr + offset, val);
 	pci_device_cfg_write_u8(pci_device_for_cfg_address(PciCfg1Addr),
 			val, PCI_OFFSET(PciCfg1Addr) + offset);
 	return 1;
commit fb882b3da189847bc98b646faddac9e8b42aa435
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jun 16 14:58:10 2009 -0400

    EDID: Carp about 1.4 monitors with no preferred refresh rate
    
    You would think, having finally tightened down the spec, that
    monitor vendors would bother to implement what the spec actually
    mandates.  You would be wrong.

diff --git a/hw/xfree86/ddc/print_edid.c b/hw/xfree86/ddc/print_edid.c
index e16dcbb..c2723da 100644
--- a/hw/xfree86/ddc/print_edid.c
+++ b/hw/xfree86/ddc/print_edid.c
@@ -398,8 +398,12 @@ print_detailed_monitor_section(int scrnIndex,
 		if (r->supported_scaling & SCALING_VSTRETCH)
 		    xf86ErrorF(" vstretch");
 		xf86ErrorF("\n");
-		xf86DrvMsg(scrnIndex, X_INFO, "Preferred refresh rate: %d\n",
-			   r->preferred_refresh);
+		if (r->preferred_refresh)
+		    xf86DrvMsg(scrnIndex, X_INFO, "Preferred refresh rate: %d\n",
+			       r->preferred_refresh);
+		else
+		    xf86DrvMsg(scrnIndex, X_INFO, "Buggy monitor, no preferred "
+			       "refresh rate given\n");
 	    } else if (r->max_clock != 0) {
 		xf86ErrorF(" PixClock max %i MHz\n", r->max_clock);
 	    } else {
commit b2d2af76b43d62c9be07fd736652f904632fd663
Author: Adam Jackson <ajax at redhat.com>
Date:   Mon Jun 15 10:10:26 2009 -0400

    randr: fix typo in swapped dispatch

diff --git a/randr/rrsdispatch.c b/randr/rrsdispatch.c
index 9fbf8f0..f6821c3 100644
--- a/randr/rrsdispatch.c
+++ b/randr/rrsdispatch.c
@@ -453,7 +453,7 @@ static int
 SProcRRGetOutputPrimary (ClientPtr client)
 {
     int n;
-    REQUEST(xRRSetOutputPrimaryReq);
+    REQUEST(xRRGetOutputPrimaryReq);
 
     REQUEST_SIZE_MATCH(xRRGetOutputPrimaryReq);
     swaps(&stuff->length, n);
commit 1d20b9021e8aecb942619f64017cc2fc31f02d29
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Jun 14 18:21:43 2009 +1000

    Xi: fix wrong bit->byte conversion in ProcXIQueryPointer
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/querydp.c b/Xi/querydp.c
index bc6feb1..e5bf98d 100644
--- a/Xi/querydp.c
+++ b/Xi/querydp.c
@@ -132,7 +132,7 @@ ProcXIQueryPointer(ClientPtr client)
     if (pDev->button)
     {
         int i, down;
-        rep.buttons_len = ((pDev->button->numButtons/8) + 3)/4;
+        rep.buttons_len = (((pDev->button->numButtons + 7)/8) + 3)/4;
         rep.length += rep.buttons_len;
         buttons = xcalloc(rep.buttons_len, 4);
         if (!buttons)
commit 9afc3241c157e5c19454f913c7105b3fdfa97ec4
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Jun 14 18:24:22 2009 +1000

    Xi: remove un-used IsOn macro.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/setbmap.c b/Xi/setbmap.c
index f29389d..e7b8d4a 100644
--- a/Xi/setbmap.c
+++ b/Xi/setbmap.c
@@ -50,9 +50,6 @@ SOFTWARE.
  *
  */
 
-#define IsOn(ptr, bit) \
-	(((BYTE *) (ptr))[(bit)>>3] & (1 << ((bit) & 7)))
-
 #ifdef HAVE_DIX_CONFIG_H
 #include <dix-config.h>
 #endif
commit b67ff1d6e0d01170c6261593ca36d0f51d917393
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jun 12 16:45:36 2009 +1000

    Xi: XISelectEvents/XIGetSelectedEvents use 'win' instead of 'window' now.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 1259de5..7a16e85 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -46,7 +46,7 @@ SProcXISelectEvents(ClientPtr client)
     REQUEST(xXISelectEventsReq);
     swaps(&stuff->length, n);
     REQUEST_AT_LEAST_SIZE(xXISelectEventsReq);
-    swapl(&stuff->window, n);
+    swapl(&stuff->win, n);
     swaps(&stuff->num_masks, n);
 
     evmask = (xXIEventMask*)&stuff[1];
@@ -76,7 +76,7 @@ ProcXISelectEvents(ClientPtr client)
     if (stuff->num_masks == 0)
         return BadValue;
 
-    rc = dixLookupWindow(&win, stuff->window, client, DixReceiveAccess);
+    rc = dixLookupWindow(&win, stuff->win, client, DixReceiveAccess);
     if (rc != Success)
         return rc;
 
@@ -154,7 +154,7 @@ SProcXIGetSelectedEvents(ClientPtr client)
     REQUEST(xXIGetSelectedEventsReq);
     swaps(&stuff->length, n);
     REQUEST_SIZE_MATCH(xXIGetSelectedEventsReq);
-    swapl(&stuff->window, n);
+    swapl(&stuff->win, n);
 
     return (ProcXIGetSelectedEvents(client));
 }
@@ -175,7 +175,7 @@ ProcXIGetSelectedEvents(ClientPtr client)
     REQUEST(xXIGetSelectedEventsReq);
     REQUEST_SIZE_MATCH(xXIGetSelectedEventsReq);
 
-    rc = dixLookupWindow(&win, stuff->window, client, DixReceiveAccess);
+    rc = dixLookupWindow(&win, stuff->win, client, DixReceiveAccess);
     if (rc != Success)
         return rc;
 
commit b2bf67b61c564a4b92a429ca9ad455403161f33a
Author: Benjamin Defnet <benjamin.r.defnet at intel.com>
Date:   Wed Jun 10 21:35:48 2009 -0700

    randr: fix operation order so that rotation+transform works
    
    The matrix multiply to combine rotation and projective transforms was being
    done in the wrong order.
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/randr/rrtransform.c b/randr/rrtransform.c
index 8bdff5a..06f6298 100644
--- a/randr/rrtransform.c
+++ b/randr/rrtransform.c
@@ -251,10 +251,10 @@ RRTransformCompute (int			    x,
 #ifdef RANDR_12_INTERFACE
     if (rr_transform)
     {
-        if (!pixman_transform_multiply (transform, transform, &rr_transform->transform))
+        if (!pixman_transform_multiply (transform, &rr_transform->transform, transform))
 	    overflow = TRUE;
-	pixman_f_transform_multiply (f_transform, f_transform, &rr_transform->f_transform);
-	pixman_f_transform_multiply (f_inverse, &rr_transform->f_inverse, f_inverse);
+	pixman_f_transform_multiply (f_transform, &rr_transform->f_transform, f_transform);
+	pixman_f_transform_multiply (f_inverse, f_inverse, &rr_transform->f_inverse);
     }
 #endif
     /*
commit 3627215e97734cc367fff273a3358c2a95a53481
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jun 5 16:38:46 2009 +1000

    Add check for GNU ld in the test suite.
    
    The GNU linker supports a -wrap option to wrap function calls at link-time.
    This allows for easy overriding of functions in the X server with stubs in
    the test suite. This functionality is only supported on the GNU linker and
    will be used extensively in the tests. Disable the tests if GNU ld is not
    available.

diff --git a/configure.ac b/configure.ac
index acd9885..1265117 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1145,11 +1145,19 @@ fi
 AM_CONDITIONAL(DEBUG, [test "x$DEBUGGING" = xyes])
 
 if test "x$UNITTESTS" = xauto; then
-       PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.16], [UNITTESTS=yes], [UNITTESTS=no])
+       PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.16], [HAVE_GLIB=yes], [HAVE_GLIB=no])
+       if test "x$HAVE_GLIB" = xyes && test "x$with_gnu_ld" = xyes; then
+           UNITTESTS=yes
+       else
+           UNITTESTS=no
+       fi
 fi
 if test "x$UNITTESTS" = xyes; then
        AC_DEFINE(UNITTESTS, 1, [Enable unit tests])
        PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.16])
+       if test "x$with_gnu_ld" = xno; then
+           AC_MSG_ERROR([GNU ld required to build unit tests])
+       fi
        AC_SUBST([GLIB_LIBS])
        AC_SUBST([GLIB_CFLAGS])
 fi
commit 5e0ca6fabd12401de6bd6039484be2079e28851e
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 11 16:26:23 2009 +1000

    input: remove un-used "setter" argument from SetClientPointer.
    
    It's obsolete, not likely to come back, let's drop it.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/setcptr.c b/Xi/setcptr.c
index 0589381..d23b2d8 100644
--- a/Xi/setcptr.c
+++ b/Xi/setcptr.c
@@ -103,7 +103,7 @@ ProcXISetClientPointer(ClientPtr client)
     } else
         targetClient = client;
 
-    if (!SetClientPointer(targetClient, client, pDev))
+    if (!SetClientPointer(targetClient, pDev))
     {
         client->errorValue = stuff->deviceid;
         return BadDevice;
diff --git a/dix/events.c b/dix/events.c
index ffeb449..43e1bd2 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -5691,8 +5691,7 @@ WriteEventsToClient(ClientPtr pClient, int count, xEvent *events)
 }
 
 /*
- * Set the client pointer for the given client. Second parameter setter could
- * be used in the future to determine access rights. Unused for now.
+ * Set the client pointer for the given client.
  *
  * A client can have exactly one ClientPointer. Each time a
  * request/reply/event is processed and the choice of devices is ambiguous
@@ -5701,7 +5700,7 @@ WriteEventsToClient(ClientPtr pClient, int count, xEvent *events)
  * If a keyboard is needed, the first keyboard paired with the CP is used.
  */
 Bool
-SetClientPointer(ClientPtr client, ClientPtr setter, DeviceIntPtr device)
+SetClientPointer(ClientPtr client, DeviceIntPtr device)
 {
     if (!IsMaster(device))
     {
diff --git a/include/dix.h b/include/dix.h
index df73519..c4a6394 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -486,8 +486,7 @@ extern _X_EXPORT int TryClientEvents(
 extern _X_EXPORT void WindowsRestructured(void);
 
 extern Bool SetClientPointer(
-        ClientPtr /* client */, 
-        ClientPtr /* setter */, 
+        ClientPtr /* client */,
         DeviceIntPtr /* device */);
 
 extern _X_EXPORT DeviceIntPtr PickPointer(
commit e6a18762ef113296c6a09833be70cb4b45aa3940
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 11 15:40:56 2009 +1000

    Xi: fix XISetClientPointer return values.
    
    If SetClientPointer fails, the only reason may be that the device is not a
    pointer or that the device is an SD. Return BadDevice instead of BadAccess.
    (BadAccess is a leftover from the early times of the ClientPointer
    implementation when only one client was allowed to set it).
    
    If the window parameter doesn't name a valid window or client, return
    BadWindow.
    
    Finally, allow both master keyboards and master pointers as deviceid.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/setcptr.c b/Xi/setcptr.c
index 9d1a54c..0589381 100644
--- a/Xi/setcptr.c
+++ b/Xi/setcptr.c
@@ -79,29 +79,34 @@ ProcXISetClientPointer(ClientPtr client)
 
     rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixWriteAccess);
     if (rc != Success)
+    {
+        client->errorValue = stuff->deviceid;
         return rc;
+    }
 
-    if (!IsPointerDevice(pDev) || !IsMaster(pDev))
+    if (!IsMaster(pDev))
     {
         client->errorValue = stuff->deviceid;
         return BadDevice;
     }
 
+    pDev = GetMaster(pDev, MASTER_POINTER);
+
     if (stuff->win != None)
     {
         rc = dixLookupClient(&targetClient, stuff->win, client,
                 DixWriteAccess);
 
         if (rc != Success)
-            return rc;
+            return BadWindow;
 
     } else
         targetClient = client;
 
     if (!SetClientPointer(targetClient, client, pDev))
     {
-        client->errorValue = stuff->win;
-        return BadAccess;
+        client->errorValue = stuff->deviceid;
+        return BadDevice;
     }
 
     return Success;
commit ae7dab2a136d15b976b956f68feec53886951dd6
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 11 15:40:38 2009 +1000

    Xi: Fix XISetClientPointer swapping.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/setcptr.c b/Xi/setcptr.c
index ba76246..9d1a54c 100644
--- a/Xi/setcptr.c
+++ b/Xi/setcptr.c
@@ -55,6 +55,8 @@ SProcXISetClientPointer(ClientPtr client)
 
     REQUEST(xXISetClientPointerReq);
     swaps(&stuff->length, n);
+    swapl(&stuff->win, n);
+    swaps(&stuff->deviceid, n);
     REQUEST_SIZE_MATCH(xXISetClientPointerReq);
     return (ProcXISetClientPointer(client));
 }
commit 98e8ec8deb09db1c56e06afed267e6f517042fa3
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jun 12 10:54:55 2009 +1000

    Xi: sanitize ProcXIGetClientPointer.
    
    This was quite old code and can be streamlined a bit. The new code is
    essentially the same as in ProcXISetClientPointer.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/getcptr.c b/Xi/getcptr.c
index 9cce5c3..92fae82 100644
--- a/Xi/getcptr.c
+++ b/Xi/getcptr.c
@@ -59,22 +59,21 @@ SProcXIGetClientPointer(ClientPtr client)
 
 int ProcXIGetClientPointer(ClientPtr client)
 {
-    int err;
-    WindowPtr win;
+    int rc;
     ClientPtr winclient;
     xXIGetClientPointerReply rep;
     REQUEST(xXIGetClientPointerReq);
     REQUEST_SIZE_MATCH(xXIGetClientPointerReq);
 
-    err = dixLookupWindow(&win, stuff->win, client, DixReadAccess);
-    if (err != Success)
+    if (stuff->win != None)
     {
-        SendErrorToClient(client, IReqCode, X_XIGetClientPointer,
-                stuff->win, err);
-        return Success;
-    }
+        rc = dixLookupClient(&winclient, stuff->win, client,
+                DixWriteAccess);
 
-    winclient = wClient(win);
+        if (rc != Success)
+            return BadWindow;
+    } else
+        winclient = client;
 
     rep.repType = X_Reply;
     rep.RepType = X_XIGetClientPointer;
commit 96ea82fdac7c28feb2748cd4ff7faa7c00dbbdcd
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jun 12 10:54:25 2009 +1000

    Xi: fix reply swapping in XIGetClientPointer.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/getcptr.c b/Xi/getcptr.c
index 5c69942..9cce5c3 100644
--- a/Xi/getcptr.c
+++ b/Xi/getcptr.c
@@ -101,6 +101,7 @@ SRepXIGetClientPointer(ClientPtr client, int size,
     char n;
     swaps(&rep->sequenceNumber, n);
     swapl(&rep->length, n);
+    swaps(&rep->deviceid, n);
     WriteToClient(client, size, (char *)rep);
 }
 
commit 76f25086a9ab6f0c27d9e2cd745f8463c6b3df5f
Author: Adam Jackson <ajax at redhat.com>
Date:   Thu Jun 11 16:34:06 2009 -0400

    vfb: Re-enable 30bpp support

diff --git a/hw/vfb/InitOutput.c b/hw/vfb/InitOutput.c
index b4b8455..e7dd1d9 100644
--- a/hw/vfb/InitOutput.c
+++ b/hw/vfb/InitOutput.c
@@ -892,6 +892,12 @@ vfbScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
 				   (1 << DirectColor)),
 				  8, TrueColor, 0xff0000, 0x00ff00, 0x0000ff);
 	break;
+    case 30:
+	miSetVisualTypesAndMasks (30,
+				  ((1 << TrueColor) |
+				   (1 << DirectColor)),
+				  10, TrueColor, 0x3ff00000, 0x000ffc00, 0x000003ff);
+	break;
     }
 
     miSetPixmapDepths ();
commit 0de58c88aba7ddd69b04f24ab5b2967c359aa69e
Author: Dave Airlie <airlied at redhat.com>
Date:   Thu Jun 11 14:21:53 2009 +1000

    xfree86: move didLock assignment down to where the function pointer is valid.
    
    crtc->funcs->lock is NULL, so it's no use calling it here. Move it down so
    it's actually defined before we use it.
    
    Introduced with 6f59a8160042ea145514fdcb410f17f33fd437c2.
    
    Tested-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index 585f84d..51fe115 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -278,7 +278,6 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
 
     adjusted_mode = xf86DuplicateMode(mode);
 
-    didLock = crtc->funcs->lock (crtc);
 
     saved_mode = crtc->mode;
     saved_x = crtc->x;
@@ -308,6 +307,7 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
 	goto done;
     }
 
+    didLock = crtc->funcs->lock (crtc);
     /* Pass our mode to the outputs and the CRTC to give them a chance to
      * adjust it according to limitations or output properties, and also
      * a chance to reject the mode entirely.
commit a85d210b34506cb39e7f08d81d4586fe4448b47f
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 11 12:32:39 2009 +1000

    Xi: store mask_len before swapping in ProcXIGetSelectedEvents.
    
    Swapping the mask_len and then advancing the pointer by the swapped length
    is just a bad idea.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index f2c6b9a..1259de5 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -224,10 +224,9 @@ ProcXIGetSelectedEvents(ClientPtr client)
         {
             if (devmask[j] != 0)
             {
+                int mask_len = (j + 4)/4; /* j is an index, hence + 4, not + 3 */
                 evmask->deviceid = i;
-                evmask->mask_len = (j + 4)/4; /* j is an index, hence + 4,
-                                                 not + 3 */
-
+                evmask->mask_len = mask_len;
                 reply.num_masks++;
                 reply.length += sizeof(xXIEventMask)/4 + evmask->mask_len;
 
@@ -239,7 +238,7 @@ ProcXIGetSelectedEvents(ClientPtr client)
 
                 memcpy(&evmask[1], devmask, j + 1);
                 evmask = (xXIEventMask*)((char*)evmask +
-                           sizeof(xXIEventMask) + evmask->mask_len * 4);
+                           sizeof(xXIEventMask) + mask_len * 4);
                 break;
             }
         }
commit 5043f42f36b49e7702d0c496dd4fe157788d44ee
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 11 12:31:40 2009 +1000

    Xi: correct return buffer size for XIGetSelectedEvents.
    
    The maximum number of bytes is calculated by the mask len, and the mask len
    is always in 4-byte units. XI2MASKSIZE however is in bytes.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index cafb976..f2c6b9a 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -202,7 +202,7 @@ ProcXIGetSelectedEvents(ClientPtr client)
         return Success;
     }
 
-    buffer = xcalloc(MAXDEVICES, sizeof(xXIEventMask) + XI2MASKSIZE);
+    buffer = xcalloc(MAXDEVICES, sizeof(xXIEventMask) + ((XI2MASKSIZE + 3)/4) * 4);
     if (!buffer)
         return BadAlloc;
 
commit fcf0c0b8f332cbde03c1a479376b7913197962eb
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 11 13:23:40 2009 +1000

    Xi: XISetEventMask needs to clear the mask if len is 0
    
    zero-length masks are supposed to clear the device's mask.
    ProcXISelectEvents passes these masks through directly, so we need to clear
    the bits here if such a mask is supplied.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index fbcf6e3..23d8ee8 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -2167,7 +2167,10 @@ XISetEventMask(DeviceIntPtr dev, WindowPtr win, ClientPtr client,
         others= wOtherInputMasks(win)->inputClients;
     }
 
-    memcpy(others->xi2mask[dev->id], mask, len);
+    if (!len)
+        memset(others->xi2mask[dev->id], 0, sizeof(others->xi2mask[dev->id]));
+    else
+        memcpy(others->xi2mask[dev->id], mask, len);
 
     RecalculateDeviceDeliverableEvents(win);
 }
commit 22b4ac44e4fdbe8f36f2b570cdbdaf237062e33e
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 11 11:08:07 2009 +1000

    Xi: XIGetSelectedEvents mustn't returned masks from non-existing devices.
    
    Or devices the client doesn't have XACE permissions for.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 74e444b..cafb976 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -170,6 +170,7 @@ ProcXIGetSelectedEvents(ClientPtr client)
     OtherInputMasks *masks;
     InputClientsPtr others = NULL;
     xXIEventMask *evmask = NULL;
+    DeviceIntPtr dev;
 
     REQUEST(xXIGetSelectedEventsReq);
     REQUEST_SIZE_MATCH(xXIGetSelectedEventsReq);
@@ -211,6 +212,14 @@ ProcXIGetSelectedEvents(ClientPtr client)
         int j;
         unsigned char *devmask = others->xi2mask[i];
 
+        if (i > 2)
+        {
+            rc = dixLookupDevice(&dev, i, client, DixReadAccess);
+            if (rc != Success)
+                continue;
+        }
+
+
         for (j = XI2MASKSIZE - 1; j >= 0; j--)
         {
             if (devmask[j] != 0)
commit 7868956b0fb50a9d77506f01413612e429f540a3
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jun 10 17:09:39 2009 +1000

    Xi: ProcXIGetSelectedEvents must use WriteToClient for swapped data.
    
    The data is already swapped before, so we just post it to the client as-is,
    without attempting to swap it again.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 6498d86..74e444b 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -239,10 +239,7 @@ ProcXIGetSelectedEvents(ClientPtr client)
     WriteReplyToClient(client, sizeof(xXIGetSelectedEventsReply), &reply);
 
     if (reply.num_masks)
-    {
-        WriteSwappedDataToClient(client, reply.length * 4, buffer);
-    }
-
+        WriteToClient(client, reply.length * 4, buffer);
 
     xfree(buffer);
     return Success;
commit aa2babf11c30be4d289b58212dc330b84efb4053
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jun 10 14:41:11 2009 +1000

    input: remove dependency on XI2 protocol for XI_LASTEVENT.
    
    inputstr includes XI2proto.h for the sole purpose of XI_LASTEVENT.
    However, using XI_LASTEVENT in the server is prone to errors, if the server
    is recompiled against a newer version of the protocol it would bump this
    variable and associates bits, including potential ABI.
    
    This patch defines an XI2LASTEVENT for use in the server and removes the
    XI2proto.h require. XI2LASTEVENT is the current value of XI_LASTEVENT.
    
    This patch is required by components that require access to inputInfo
    (currently xf86-video-geode and xf86-video-cirrus) but should not have a
    require for the XI2 protocol.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index 25ecc03..a5a9570 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -120,10 +120,10 @@ ProcXIPassiveGrabDevice(ClientPtr client)
         return BadValue;
     }
 
-    if ((stuff->mask_len * 4) > XI_LASTEVENT)
+    if ((stuff->mask_len * 4) > XI2LASTEVENT)
     {
         unsigned char *bits = (unsigned char*)&stuff[1];
-        for (i = XI_LASTEVENT; i < stuff->mask_len * 4; i++)
+        for (i = XI2LASTEVENT; i < stuff->mask_len * 4; i++)
         {
             if (BitIsOn(bits, i))
                 return BadValue;
diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index e6f36a7..6498d86 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -108,10 +108,10 @@ ProcXISelectEvents(ClientPtr client)
                 return BadValue;
         }
 
-        if ((evmask->mask_len * 4) >= (XI_LASTEVENT + 8)/8)
+        if ((evmask->mask_len * 4) >= (XI2LASTEVENT + 8)/8)
         {
             unsigned char *bits = (unsigned char*)&evmask[1];
-            for (i = XI_LASTEVENT + 1; i < evmask->mask_len * 4; i++)
+            for (i = XI2LASTEVENT + 1; i < evmask->mask_len * 4; i++)
             {
                 if (BitIsOn(bits, i))
                     return BadValue;
diff --git a/dix/grabs.c b/dix/grabs.c
index cc77477..06d6d03 100644
--- a/dix/grabs.c
+++ b/dix/grabs.c
@@ -53,6 +53,7 @@ SOFTWARE.
 #include <X11/X.h>
 #include "misc.h"
 #include <X11/Xproto.h>
+#include <X11/extensions/XI2.h>
 #include "windowstr.h"
 #include "inputstr.h"
 #include "cursorstr.h"
diff --git a/include/inputstr.h b/include/inputstr.h
index f233034..ffeedb1 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -55,7 +55,6 @@ SOFTWARE.
 #include "cursorstr.h"
 #include "geext.h"
 #include "privates.h"
-#include <X11/extensions/XI2proto.h>
 
 #define BitIsOn(ptr, bit) (((BYTE *) (ptr))[(bit)>>3] & (1 << ((bit) & 7)))
 #define SetBit(ptr, bit)  (((BYTE *) (ptr))[(bit)>>3] |= (1 << ((bit) & 7)))
@@ -65,7 +64,13 @@ SOFTWARE.
 	(CLIENT_BITS((obj)->resource) == (client)->clientAsMask)
 
 #define EMASKSIZE	MAXDEVICES + 2
-#define XI2MASKSIZE     ((XI_LASTEVENT + 7)/8) /* no of bits for masks */
+
+/* This is the last XI2 event supported by the server. If you add
+ * events to the protocol, the server will not support these events until
+ * this number here is bumped.
+ */
+#define XI2LASTEVENT    13 /* XI_PropertyEvent */
+#define XI2MASKSIZE     ((XI2LASTEVENT + 7)/8) /* no of bits for masks */
 
 /**
  * This struct stores the core event mask for each client except the client
commit 77cc816da4a2777110182ed01c22c0f5e6ac3b65
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jun 10 13:54:42 2009 +1000

    Xi: rename ProcXISelectEvent to ProcXISelectEvents.
    
    The request name has the plural, so let's do it here too. Purely cosmetic
    change.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/extinit.c b/Xi/extinit.c
index 635afea..0550bd4 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -244,7 +244,7 @@ static int (*ProcIVector[])(ClientPtr) = {
         ProcXIChangeHierarchy,                  /* 43 */
         ProcXISetClientPointer,                 /* 44 */
         ProcXIGetClientPointer,                 /* 45 */
-        ProcXISelectEvent,                      /* 46 */
+        ProcXISelectEvents,                     /* 46 */
         ProcXIQueryVersion,                     /* 47 */
         ProcXIQueryDevice,                      /* 48 */
         ProcXISetFocus,                         /* 49 */
@@ -309,7 +309,7 @@ static int (*SProcIVector[])(ClientPtr) = {
         SProcXIChangeHierarchy,                  /* 43 */
         SProcXISetClientPointer,                 /* 44 */
         SProcXIGetClientPointer,                 /* 45 */
-        SProcXISelectEvent,                      /* 46 */
+        SProcXISelectEvents,                     /* 46 */
         SProcXIQueryVersion,                     /* 47 */
         SProcXIQueryDevice,                      /* 48 */
         SProcXISetFocus,                         /* 49 */
diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 98b5919..e6f36a7 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -37,7 +37,7 @@
 #include "xiselectev.h"
 
 int
-SProcXISelectEvent(ClientPtr client)
+SProcXISelectEvents(ClientPtr client)
 {
     char n;
     int i;
@@ -57,11 +57,11 @@ SProcXISelectEvent(ClientPtr client)
         evmask = (xXIEventMask*)(((char*)evmask) + evmask->mask_len * 4);
     }
 
-    return (ProcXISelectEvent(client));
+    return (ProcXISelectEvents(client));
 }
 
 int
-ProcXISelectEvent(ClientPtr client)
+ProcXISelectEvents(ClientPtr client)
 {
     int rc, num_masks, i;
     WindowPtr win;
diff --git a/Xi/xiselectev.h b/Xi/xiselectev.h
index 5f5ffe3..5efc648 100644
--- a/Xi/xiselectev.h
+++ b/Xi/xiselectev.h
@@ -27,8 +27,8 @@
 #include <dix-config.h>
 #endif
 
-int SProcXISelectEvent(ClientPtr client);
-int ProcXISelectEvent(ClientPtr client);
+int SProcXISelectEvents(ClientPtr client);
+int ProcXISelectEvents(ClientPtr client);
 int SProcXIGetSelectedEvents(ClientPtr client);
 int ProcXIGetSelectedEvents(ClientPtr client);
 void SRepXIGetSelectedEvents(ClientPtr client,
commit 9563feeeb5309de1971c4e04419fed6fd31c9cea
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 9 16:57:09 2009 +1000

    Xi: start checking for invalid mask bits _after_ LASTEVENT.
    
    Two issues that combined to false positives and false negatives.
    - The checking for invalid bits must be performed when there are enough bits
    that an event outside of LASTEVENT may be selected.
    - The first invalid bit is LASTEVENT + 1, not LASTEVENT.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 6734da9..98b5919 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -108,10 +108,10 @@ ProcXISelectEvent(ClientPtr client)
                 return BadValue;
         }
 
-        if ((evmask->mask_len * 4) > XI_LASTEVENT)
+        if ((evmask->mask_len * 4) >= (XI_LASTEVENT + 8)/8)
         {
             unsigned char *bits = (unsigned char*)&evmask[1];
-            for (i = XI_LASTEVENT; i < evmask->mask_len * 4; i++)
+            for (i = XI_LASTEVENT + 1; i < evmask->mask_len * 4; i++)
             {
                 if (BitIsOn(bits, i))
                     return BadValue;
commit e2fbaebb87e18198143a4b8e6be7e650563cd819
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 9 14:38:25 2009 +1000

    Xi: XISelectEvents returns BadValue for num_masks == 0.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 8c1b2b1..6734da9 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -73,6 +73,9 @@ ProcXISelectEvent(ClientPtr client)
     REQUEST(xXISelectEventsReq);
     REQUEST_AT_LEAST_SIZE(xXISelectEventsReq);
 
+    if (stuff->num_masks == 0)
+        return BadValue;
+
     rc = dixLookupWindow(&win, stuff->window, client, DixReceiveAccess);
     if (rc != Success)
         return rc;
commit cfeb65ac45b194dead5e8b9b26192df2619d6f9c
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 9 14:37:42 2009 +1000

    Xi: XISelectEvents needs to be at least size 3, not exactly.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 51d9c99..8c1b2b1 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -45,7 +45,7 @@ SProcXISelectEvent(ClientPtr client)
 
     REQUEST(xXISelectEventsReq);
     swaps(&stuff->length, n);
-    REQUEST_SIZE_MATCH(xXISelectEventsReq);
+    REQUEST_AT_LEAST_SIZE(xXISelectEventsReq);
     swapl(&stuff->window, n);
     swaps(&stuff->num_masks, n);
 
commit f3c26034eca98924d93a004aaa1f61ffe5d344ca
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 9 13:04:56 2009 +1000

    Xi: XIQueryDevice should use XIFooClass instead of the old FooClass defines.
    
    This is merely a cosmetic change, the actual values are the same anyway.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/querydev.c b/Xi/querydev.c
index 22a5537..fd5e463 100644
--- a/Xi/querydev.c
+++ b/Xi/querydev.c
@@ -428,13 +428,13 @@ SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info)
         int len = ((xXIAnyInfo*)any)->length;
         switch(((xXIAnyInfo*)any)->type)
         {
-            case ButtonClass:
+            case XIButtonClass:
                 SwapButtonInfo(dev, (xXIButtonInfo*)any);
                 break;
-            case KeyClass:
+            case XIKeyClass:
                 SwapKeyInfo(dev, (xXIKeyInfo*)any);
                 break;
-            case ValuatorClass:
+            case XIValuatorClass:
                 SwapValuatorInfo(dev, (xXIValuatorInfo*)any);
                 break;
         }
commit 482cc72aa790bd2f23c7ebe12c5549b47c737115
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 9 13:03:38 2009 +1000

    Xi: get the class length before swapping.
    
    Advancing by the already-swapped length lets our pointers point into
    nirvana.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/querydev.c b/Xi/querydev.c
index 1f7fed1..22a5537 100644
--- a/Xi/querydev.c
+++ b/Xi/querydev.c
@@ -425,6 +425,7 @@ SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info)
 
     for (i = 0; i < info->num_classes; i++)
     {
+        int len = ((xXIAnyInfo*)any)->length;
         switch(((xXIAnyInfo*)any)->type)
         {
             case ButtonClass:
@@ -438,7 +439,7 @@ SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info)
                 break;
         }
 
-        any += (((xXIAnyInfo*)any)->length * 4);
+        any += len * 4;
     }
 
     swaps(&info->deviceid, n);
commit 9974249980894f74f3ead466655da87958a43670
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 9 13:02:52 2009 +1000

    Xi: Swapping 32 bit keycodes requires swapl, not swaps.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/querydev.c b/Xi/querydev.c
index a44cf22..1f7fed1 100644
--- a/Xi/querydev.c
+++ b/Xi/querydev.c
@@ -284,7 +284,7 @@ SwapKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info)
     swaps(&info->length, n);
 
     for (i = 0, key = (uint32_t*)&info[1]; i < info->num_keycodes; i++, key++)
-        swaps(key, n);
+        swapl(key, n);
 
     swaps(&info->num_keycodes, n);
 }
commit 918923e285f4e269a257bb5be4d3c8a50174aad0
Author: Dave Airlie <airlied at redhat.com>
Date:   Wed Jun 10 15:13:45 2009 +1000

    glx: fix open-coded linked list removal function
    
    OMG stab stab stab, YALL.
    
    removal function was made of crack, actually truncated the list from
    the one after the find point.
    
    However fixing this makes glean makecurrent fail with a GLX error.

diff --git a/glx/glxext.c b/glx/glxext.c
index bdacf88..520eb2e 100644
--- a/glx/glxext.c
+++ b/glx/glxext.c
@@ -150,12 +150,18 @@ void __glXAddToContextList(__GLXcontext *cx)
 
 void __glXRemoveFromContextList(__GLXcontext *cx)
 {
-    __GLXcontext *c, **prev;
+    __GLXcontext *c, *prev;
 
-    prev = &glxAllContexts;
-    for (c = glxAllContexts; c; c = c->next)
-	if (c == cx)
-	    *prev = c->next;
+    if (cx == glxAllContexts)
+	glxAllContexts = cx->next;
+    else {
+	prev = glxAllContexts;
+	for (c = glxAllContexts; c; c = c->next) {
+	    if (c == cx)
+		prev->next = c->next;
+	    prev = c;
+	}
+    }
 }
 
 /*
commit 3ea747c0dbbec0db6761d66d4f6c680d2e9ddeaf
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Apr 25 16:53:18 2009 +1000

    KDrive: Warning fixes
    
    xEvent vs. InternalEvent confusion still reigns though.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/hw/kdrive/src/kdrive.c b/hw/kdrive/src/kdrive.c
index 26296b5..5cfe54f 100644
--- a/hw/kdrive/src/kdrive.c
+++ b/hw/kdrive/src/kdrive.c
@@ -99,7 +99,6 @@ KdSetRootClip (ScreenPtr pScreen, BOOL enable)
     WindowPtr	pChild;
     Bool	WasViewable;
     Bool	anyMarked = FALSE;
-    RegionPtr	pOldClip = 0;
     WindowPtr   pLayerWin;
     BoxRec	box;
 
@@ -340,7 +339,7 @@ AbortDDX(void)
 }
 
 void
-ddxGiveUp ()
+ddxGiveUp (void)
 {
     AbortDDX ();
 }
@@ -1316,10 +1315,10 @@ OsVendorFatalError(void)
 {
 }
 
-#ifdef DPMSExtension
 int
 DPMSSet(ClientPtr client, int level)
 {
+    return Success;
 }
 
 Bool
@@ -1327,5 +1326,3 @@ DPMSSupported (void)
 {
     return FALSE;
 }
-#endif
-
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 94bdfe8..740852e 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -319,7 +319,7 @@ KdDisableInput (void)
 void
 KdEnableInput (void)
 {
-    xEvent xE;
+    InternalEvent ev;
     KdKeyboardInfo *ki;
     KdPointerInfo *pi;
     
@@ -336,8 +336,8 @@ KdEnableInput (void)
     }
 
     /* reset screen saver */
-    xE.u.keyButtonPointer.time = GetTimeInMillis ();
-    NoticeEventTime (&xE);
+    ev.any.time = GetTimeInMillis ();
+    NoticeEventTime (&ev);
 
     KdUnblockSigio ();
 }
@@ -1655,7 +1655,7 @@ char *kdActionNames[] = {
 #endif /* DEBUG */
 
 static void
-KdQueueEvent (DeviceIntPtr pDev, xEvent *ev)
+KdQueueEvent (DeviceIntPtr pDev, InternalEvent *ev)
 {
     KdAssertSigioBlocked ("KdQueueEvent");
     mieqEnqueue (pDev, ev);
@@ -1833,7 +1833,7 @@ KdEnqueueKeyboardEvent(KdKeyboardInfo   *ki,
 
         nEvents = GetKeyboardEvents(kdEvents, ki->dixdev, type, key_code);
         for (i = 0; i < nEvents; i++)
-            KdQueueEvent(ki->dixdev, (kdEvents + i)->event);
+            KdQueueEvent(ki->dixdev, (InternalEvent *)((kdEvents + i)->event));
     }
     else {
         ErrorF("driver %s wanted to post scancode %d outside of [%d, %d]!\n",
@@ -1943,7 +1943,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)->event);
+        KdQueueEvent(pi->dixdev, (InternalEvent *)((kdEvents + i)->event));
 }
 
 void
@@ -2134,7 +2134,7 @@ miPointerScreenFuncRec kdPointerScreenFuncs =
 };
 
 void
-ProcessInputEvents ()
+ProcessInputEvents (void)
 {
     mieqProcessInputEvents();
     miPointerUpdateSprite(inputInfo.pointer);
@@ -2271,16 +2271,16 @@ NewInputDeviceRequest(InputOption *options, DeviceIntPtr *pdev)
 
     if (pi) {
         if (KdAddPointer(pi) != Success ||
-            ActivateDevice(pi->dixdev) != Success ||
-            EnableDevice(pi->dixdev) != TRUE) {
+            ActivateDevice(pi->dixdev, TRUE) != Success ||
+            EnableDevice(pi->dixdev, TRUE) != TRUE) {
             ErrorF("couldn't add or enable pointer\n");
             return BadImplementation;
         }
     }
     else if (ki) {
         if (KdAddKeyboard(ki) != Success ||
-            ActivateDevice(ki->dixdev) != Success ||
-            EnableDevice(ki->dixdev) != TRUE) {
+            ActivateDevice(ki->dixdev, TRUE) != Success ||
+            EnableDevice(ki->dixdev, TRUE) != TRUE) {
             ErrorF("couldn't add or enable keyboard\n");
             return BadImplementation;
         }
@@ -2298,5 +2298,5 @@ NewInputDeviceRequest(InputOption *options, DeviceIntPtr *pdev)
 void
 DeleteInputDeviceRequest(DeviceIntPtr pDev)
 {
-    RemoveDevice(pDev);
+    RemoveDevice(pDev, TRUE);
 }
commit 754be1e2ec9be2486bf45000d7244d217556de07
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Apr 25 16:51:48 2009 +1000

    KDrive: Xephyr: DRI: Warning fixes
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/hw/kdrive/ephyr/ephyrdriext.c b/hw/kdrive/ephyr/ephyrdriext.c
index a127aef..6e915ab 100644
--- a/hw/kdrive/ephyr/ephyrdriext.c
+++ b/hw/kdrive/ephyr/ephyrdriext.c
@@ -615,10 +615,10 @@ ProcXF86DRIQueryVersion (register ClientPtr client)
 {
     xXF86DRIQueryVersionReply rep;
     register int n;
+    REQUEST_SIZE_MATCH(xXF86DRIQueryVersionReq);
 
     EPHYR_LOG ("enter\n") ;
 
-    REQUEST_SIZE_MATCH(xXF86DRIQueryVersionReq);
     rep.type = X_Reply;
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
@@ -643,10 +643,10 @@ ProcXF86DRIQueryDirectRenderingCapable (register ClientPtr client)
     xXF86DRIQueryDirectRenderingCapableReply	rep;
     Bool isCapable;
     register int n;
-
-    EPHYR_LOG ("enter\n") ;
     REQUEST(xXF86DRIQueryDirectRenderingCapableReq);
     REQUEST_SIZE_MATCH(xXF86DRIQueryDirectRenderingCapableReq);
+
+    EPHYR_LOG ("enter\n") ;
     if (stuff->screen >= screenInfo.numScreens) {
 	client->errorValue = stuff->screen;
 	return BadValue;
@@ -681,10 +681,10 @@ ProcXF86DRIOpenConnection (register ClientPtr client)
     xXF86DRIOpenConnectionReply rep;
     drm_handle_t			hSAREA;
     char*			busIdString;
-
-    EPHYR_LOG ("enter\n") ;
     REQUEST(xXF86DRIOpenConnectionReq);
     REQUEST_SIZE_MATCH(xXF86DRIOpenConnectionReq);
+
+    EPHYR_LOG ("enter\n") ;
     if (stuff->screen >= screenInfo.numScreens) {
 	client->errorValue = stuff->screen;
 	return BadValue;
@@ -722,10 +722,10 @@ static int
 ProcXF86DRIAuthConnection  (register ClientPtr client)
 {
     xXF86DRIAuthConnectionReply rep;
-
-    EPHYR_LOG ("enter\n") ;
     REQUEST(xXF86DRIAuthConnectionReq);
     REQUEST_SIZE_MATCH(xXF86DRIAuthConnectionReq);
+
+    EPHYR_LOG ("enter\n") ;
     if (stuff->screen >= screenInfo.numScreens) {
 	client->errorValue = stuff->screen;
 	return BadValue;
@@ -748,9 +748,9 @@ ProcXF86DRIAuthConnection  (register ClientPtr client)
 static int
 ProcXF86DRICloseConnection (register ClientPtr client)
 {
-    EPHYR_LOG ("enter\n") ;
     REQUEST(xXF86DRICloseConnectionReq);
     REQUEST_SIZE_MATCH(xXF86DRICloseConnectionReq);
+    EPHYR_LOG ("enter\n") ;
     if (stuff->screen >= screenInfo.numScreens) {
         client->errorValue = stuff->screen;
         return BadValue;
@@ -769,10 +769,10 @@ ProcXF86DRIGetClientDriverName (register ClientPtr client)
 {
     xXF86DRIGetClientDriverNameReply	rep;
     char* clientDriverName;
-
-    EPHYR_LOG ("enter\n") ;
     REQUEST(xXF86DRIGetClientDriverNameReq);
     REQUEST_SIZE_MATCH(xXF86DRIGetClientDriverNameReq);
+
+    EPHYR_LOG ("enter\n") ;
     if (stuff->screen >= screenInfo.numScreens) {
 	client->errorValue = stuff->screen;
 	return BadValue;
@@ -811,10 +811,10 @@ ProcXF86DRICreateContext (register ClientPtr client)
     VisualPtr visual;
     int i=0;
     unsigned long context_id=0;
-
-    EPHYR_LOG ("enter\n") ;
     REQUEST(xXF86DRICreateContextReq);
     REQUEST_SIZE_MATCH(xXF86DRICreateContextReq);
+
+    EPHYR_LOG ("enter\n") ;
     if (stuff->screen >= screenInfo.numScreens) {
 	client->errorValue = stuff->screen;
 	return BadValue;
@@ -852,10 +852,10 @@ ProcXF86DRICreateContext (register ClientPtr client)
 static int
 ProcXF86DRIDestroyContext (register ClientPtr client)
 {
-    EPHYR_LOG ("enter\n") ;
-
     REQUEST(xXF86DRIDestroyContextReq);
     REQUEST_SIZE_MATCH(xXF86DRIDestroyContextReq);
+    EPHYR_LOG ("enter\n") ;
+
     if (stuff->screen >= screenInfo.numScreens) {
         client->errorValue = stuff->screen;
         return BadValue;
@@ -1024,10 +1024,10 @@ ProcXF86DRICreateDrawable (ClientPtr client)
     EphyrWindowPair *pair=NULL ;
     EphyrDRIWindowPrivPtr win_priv=NULL;
     int rc=0, remote_win=0;
-
-    EPHYR_LOG ("enter\n") ;
     REQUEST(xXF86DRICreateDrawableReq);
     REQUEST_SIZE_MATCH(xXF86DRICreateDrawableReq);
+
+    EPHYR_LOG ("enter\n") ;
     if (stuff->screen >= screenInfo.numScreens) {
         client->errorValue = stuff->screen;
         return BadValue;
@@ -1083,12 +1083,12 @@ ProcXF86DRICreateDrawable (ClientPtr client)
 static int
 ProcXF86DRIDestroyDrawable (register ClientPtr client)
 {
-    REQUEST(xXF86DRIDestroyDrawableReq);
     DrawablePtr drawable=NULL;
     WindowPtr window=NULL;
     EphyrWindowPair *pair=NULL;
-    REQUEST_SIZE_MATCH(xXF86DRIDestroyDrawableReq);
     int rc=0;
+    REQUEST(xXF86DRIDestroyDrawableReq);
+    REQUEST_SIZE_MATCH(xXF86DRIDestroyDrawableReq);
 
     EPHYR_LOG ("enter\n") ;
     if (stuff->screen >= screenInfo.numScreens) {
@@ -1134,11 +1134,11 @@ ProcXF86DRIGetDrawableInfo (register ClientPtr client)
     int X=0, Y=0, W=0, H=0, backX=0, backY=0, rc=0, i=0;
     drm_clip_rect_t *clipRects=NULL;
     drm_clip_rect_t *backClipRects=NULL;
+    REQUEST(xXF86DRIGetDrawableInfoReq);
+    REQUEST_SIZE_MATCH(xXF86DRIGetDrawableInfoReq);
 
     EPHYR_LOG ("enter\n") ;
     memset (&rep, 0, sizeof (rep)) ;
-    REQUEST(xXF86DRIGetDrawableInfoReq);
-    REQUEST_SIZE_MATCH(xXF86DRIGetDrawableInfoReq);
     if (stuff->screen >= screenInfo.numScreens) {
         client->errorValue = stuff->screen;
         return BadValue;
@@ -1265,10 +1265,10 @@ ProcXF86DRIGetDeviceInfo (register ClientPtr client)
     xXF86DRIGetDeviceInfoReply	rep;
     drm_handle_t hFrameBuffer;
     void *pDevPrivate;
-
-    EPHYR_LOG ("enter\n") ;
     REQUEST(xXF86DRIGetDeviceInfoReq);
     REQUEST_SIZE_MATCH(xXF86DRIGetDeviceInfoReq);
+
+    EPHYR_LOG ("enter\n") ;
     if (stuff->screen >= screenInfo.numScreens) {
         client->errorValue = stuff->screen;
         return BadValue;
commit f534e6bea17746db952feb563ffea7320846b49d
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Apr 25 15:38:54 2009 +1000

    OS: Fix compile warnings
    
    It's a marvel the sigaction() ever actually worked.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/os/osinit.c b/os/osinit.c
index 1559135..17a2bed 100644
--- a/os/osinit.c
+++ b/os/osinit.c
@@ -136,8 +136,8 @@ OsSigHandler(int signo)
 
 #ifdef SA_SIGINFO
   if (sip->si_code == SI_USER) {
-      ErrorF("Recieved signal %ld sent by process %ld, uid %ld\n",
-              (long) sip->si_code, (long) sip->si_pid, (long) sip->si_uid);
+      ErrorF("Recieved signal %d sent by process %ld, uid %ld\n",
+	     signo, (long) sip->si_pid, (long) sip->si_uid);
   } else {
       switch (signo) {
           case SIGSEGV:
@@ -179,10 +179,12 @@ OsInit(void)
 #endif
 			  0 /* must be last */ };
 	sigemptyset(&act.sa_mask);
-	act.sa_handler = OsSigHandler;
-	act.sa_flags = 0;
 #ifdef SA_SIGINFO
-	act.sa_flags |= SA_SIGINFO;
+	act.sa_sigaction = OsSigHandler;
+	act.sa_flags = SA_SIGINFO;
+#else
+        act.sa_handler = OsSigHandler;
+        act.sa_flags = 0;
 #endif
 	for (i = 0; siglist[i] != 0; i++) {
 	    if (sigaction(siglist[i], &act, &oact)) {
commit 305ab237f666936cd812c464bf43f86f6079838e
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Apr 25 22:11:19 2009 +1000

    KDrive: Warning fixes and cleanups
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/hw/kdrive/ephyr/XF86dri.c b/hw/kdrive/ephyr/XF86dri.c
index 237033a..e94a7f0 100644
--- a/hw/kdrive/ephyr/XF86dri.c
+++ b/hw/kdrive/ephyr/XF86dri.c
@@ -133,11 +133,8 @@ Bool XF86DRIQueryExtension (Display *dpy, int *event_basep, int *error_basep)
     }
 }
 
-Bool XF86DRIQueryVersion(dpy, majorVersion, minorVersion, patchVersion)
-    Display* dpy;
-    int* majorVersion; 
-    int* minorVersion;
-    int* patchVersion;
+Bool XF86DRIQueryVersion(Display *dpy, int *majorVersion, int *minorVersion,
+                         int *patchVersion)
 {
     XExtDisplayInfo *info = find_display (dpy);
     xXF86DRIQueryVersionReply rep;
@@ -241,10 +238,7 @@ XF86DRIOpenConnection (Display *dpy, int screen,
     return True;
 }
 
-Bool XF86DRIAuthConnection(dpy, screen, magic)
-    Display* dpy;
-    int screen;
-    drm_magic_t magic;
+Bool XF86DRIAuthConnection(Display *dpy, int screen, drm_magic_t magic)
 {
     XExtDisplayInfo *info = find_display (dpy);
     xXF86DRIAuthConnectionReq *req;
@@ -272,9 +266,7 @@ Bool XF86DRIAuthConnection(dpy, screen, magic)
     return True;
 }
 
-Bool XF86DRICloseConnection(dpy, screen)
-    Display* dpy;
-    int screen;
+Bool XF86DRICloseConnection(Display *dpy, int screen)
 {
     XExtDisplayInfo *info = find_display (dpy);
     xXF86DRICloseConnectionReq *req;
@@ -294,14 +286,11 @@ Bool XF86DRICloseConnection(dpy, screen)
     return True;
 }
 
-Bool XF86DRIGetClientDriverName(dpy, screen, ddxDriverMajorVersion, 
-	ddxDriverMinorVersion, ddxDriverPatchVersion, clientDriverName)
-    Display* dpy;
-    int screen;
-    int* ddxDriverMajorVersion;
-    int* ddxDriverMinorVersion;
-    int* ddxDriverPatchVersion;
-    char** clientDriverName;
+Bool XF86DRIGetClientDriverName(Display *dpy, int screen,
+                                int *ddxDriverMajorVersion,
+	                        int *ddxDriverMinorVersion,
+                                int *ddxDriverPatchVersion,
+                                char **clientDriverName)
 {
     XExtDisplayInfo *info = find_display (dpy);
     xXF86DRIGetClientDriverNameReply rep;
@@ -344,13 +333,8 @@ Bool XF86DRIGetClientDriverName(dpy, screen, ddxDriverMajorVersion,
     return True;
 }
 
-Bool XF86DRICreateContextWithConfig(dpy, screen, configID, context,
-	hHWContext)
-    Display* dpy;
-    int screen;
-    int configID;
-    XID* context;
-    drm_context_t * hHWContext;
+Bool XF86DRICreateContextWithConfig(Display *dpy, int screen, int configID,
+                                    XID *context, drm_context_t *hHWContext)
 {
     XExtDisplayInfo *info = find_display (dpy);
     xXF86DRICreateContextReply rep;
@@ -380,12 +364,8 @@ Bool XF86DRICreateContextWithConfig(dpy, screen, configID, context,
     return True;
 }
 
-Bool XF86DRICreateContext(dpy, screen, visual, context, hHWContext)
-    Display* dpy;
-    int screen;
-    Visual* visual;
-    XID* context;
-    drm_context_t * hHWContext;
+Bool XF86DRICreateContext(Display *dpy, int screen, Visual *visual,
+                          XID *context, drm_context_t *hHWContext)
 {
     return XF86DRICreateContextWithConfig( dpy, screen, visual->visualid,
 					   context, hHWContext );
diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c
index 345ae5b..296284a 100644
--- a/hw/kdrive/ephyr/ephyr.c
+++ b/hw/kdrive/ephyr/ephyr.c
@@ -429,9 +429,7 @@ ephyrRandRGetInfo (ScreenPtr pScreen, Rotation *rotations)
   RRScreenSizePtr	    pSize;
   Rotation		    randr;
   int			    n = 0;
-  
-  EPHYR_LOG("mark");
-  
+ 
   struct { int width, height; } sizes[] = 
     {
       { 1600, 1200 },
@@ -452,6 +450,8 @@ ephyrRandRGetInfo (ScreenPtr pScreen, Rotation *rotations)
       { 0, 0 }
     };
 
+  EPHYR_LOG("mark");
+
   *rotations = RR_Rotate_All|RR_Reflect_All;
 
   if (!hostx_want_preexisting_window (screen)
@@ -743,6 +743,7 @@ ephyrScreenFini (KdScreenInfo *screen)
 void
 ephyrUpdateModifierState(unsigned int state)
 {
+#if 0
   DeviceIntPtr pkeydev;
   KeyClassPtr  keyc;
   int          i;
@@ -764,7 +765,7 @@ ephyrUpdateModifierState(unsigned int state)
  *
  * -daniels
  */
-#if 0
+
   keyc = pkeydev->key;
   
   state = state & 0xff;
@@ -1120,13 +1121,8 @@ EphyrKeyboardInit (KdKeyboardInfo *ki)
       ErrorF("Couldn't load keymap from host\n");
       return BadAlloc;
   }
-  ki->keySyms.minKeyCode = ephyrKeySyms.minKeyCode;
-  ki->keySyms.maxKeyCode = ephyrKeySyms.maxKeyCode;
-  ki->minScanCode = ki->keySyms.minKeyCode;
-  ki->maxScanCode = ki->keySyms.maxKeyCode;
-  ki->keySyms.mapWidth = ephyrKeySyms.mapWidth;
-  xfree(ki->keySyms.map);
-  ki->keySyms.map = ephyrKeySyms.map;
+  ki->minScanCode = ephyrKeySyms.minKeyCode;
+  ki->maxScanCode = ephyrKeySyms.maxKeyCode;
   ki->name = strdup("Xephyr virtual keyboard");
   ephyrKbd = ki;
   return Success;
@@ -1149,8 +1145,6 @@ EphyrKeyboardDisable (KdKeyboardInfo *ki)
 static void
 EphyrKeyboardFini (KdKeyboardInfo *ki)
 {
-    /* not xfree: we call malloc from hostx.c. */
-    free(ki->keySyms.map);
     ephyrKbd = NULL;
     return;
 }
diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c
index 46645d3..d546370 100644
--- a/hw/kdrive/ephyr/hostx.c
+++ b/hw/kdrive/ephyr/hostx.c
@@ -595,7 +595,7 @@ hostx_calculate_color_shift(unsigned long mask)
 {
     int shift = 1;
     /* count # of bits in mask */
-    while (mask=(mask>>1)) shift++;
+    while ((mask = (mask >> 1))) shift++;
     /* cmap entry is an unsigned char so adjust it by size of that */
     shift = shift - sizeof(unsigned char) * 8;
     if (shift < 0) shift = 0;
diff --git a/hw/kdrive/linux/evdev.c b/hw/kdrive/linux/evdev.c
index e831c9a..f6017ba 100644
--- a/hw/kdrive/linux/evdev.c
+++ b/hw/kdrive/linux/evdev.c
@@ -233,6 +233,8 @@ static Status
 EvdevPtrEnable (KdPointerInfo *pi)
 {        
     int fd;
+    unsigned long   ev[NBITS(EV_MAX)];
+    Kevdev            *ke;
 
     if (!pi || !pi->path)
         return BadImplementation;
@@ -241,8 +243,6 @@ EvdevPtrEnable (KdPointerInfo *pi)
     if (fd < 0)
         return BadMatch;
 
-    unsigned long   ev[NBITS(EV_MAX)];
-    Kevdev            *ke;
         
     if (ioctl (fd, EVIOCGBIT(0 /*EV*/, sizeof (ev)), ev) < 0)
     {
@@ -352,18 +352,11 @@ EvdevPtrFini (KdPointerInfo *pi)
 static void
 readMapping (KdKeyboardInfo *ki)
 {
-    int             minScanCode, maxScanCode;
-
     if (!ki)
         return;
 
-    minScanCode = 0;
-    maxScanCode = 193;
-
-    ki->keySyms.mapWidth = 2;
-
-    ki->minScanCode = minScanCode;
-    ki->maxScanCode = maxScanCode;		
+    ki->minScanCode = 0;
+    ki->maxScanCode = 193;
 }
 
 static void
diff --git a/hw/kdrive/linux/keyboard.c b/hw/kdrive/linux/keyboard.c
index 28ece3d..79cf598 100644
--- a/hw/kdrive/linux/keyboard.c
+++ b/hw/kdrive/linux/keyboard.c
@@ -42,8 +42,6 @@
 #include <sys/ioctl.h>
 
 extern int LinuxConsoleFd;
-static unsigned char mediumraw_data, mediumraw_up;
-static enum { DEFAULT, EXTBYTE1, EXTBYTE2 } mediumraw_state = DEFAULT;
 
 static const KeySym linux_to_x[256] = {
 	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
@@ -136,6 +134,7 @@ static const KeySym linux_to_x[256] = {
    for the core X keyboard protocol has to be AT-scancode based so that it
    corresponds to the Xkb keymap.
 */
+#if 0
 static unsigned char at2lnx[] =
 {
 	0x0,    /* no valid scancode */
@@ -215,10 +214,12 @@ static unsigned char tbl[KD_MAX_WIDTH] =
     (1 << KG_ALTGR),
     (1 << KG_ALTGR) | (1 << KG_SHIFT)
 };
+#endif
 
 static void
 readKernelMapping(KdKeyboardInfo *ki)
 {
+#if 0
     KeySym	    *k;
     int		    i, j;
     struct kbentry  kbe;
@@ -484,6 +485,7 @@ readKernelMapping(KdKeyboardInfo *ki)
     }
     ki->minScanCode = minKeyCode;
     ki->maxScanCode = maxKeyCode;
+#endif
 }
 
 /*
diff --git a/hw/kdrive/linux/linux.c b/hw/kdrive/linux/linux.c
index 79f3fbd..3fba056 100644
--- a/hw/kdrive/linux/linux.c
+++ b/hw/kdrive/linux/linux.c
@@ -448,7 +448,7 @@ LinuxFini (void)
 }
 
 void
-KdOsAddInputDrivers ()
+KdOsAddInputDrivers (void)
 {
     KdAddPointerDriver(&LinuxMouseDriver);
     KdAddPointerDriver(&MsMouseDriver);
diff --git a/hw/kdrive/src/Makefile.am b/hw/kdrive/src/Makefile.am
index 968978e..7ac23c2 100644
--- a/hw/kdrive/src/Makefile.am
+++ b/hw/kdrive/src/Makefile.am
@@ -20,7 +20,6 @@ libkdrive_la_SOURCES =	\
 	kdrive.h	\
 	kinfo.c		\
 	kinput.c	\
-	kkeymap.c	\
 	kmap.c		\
 	kmode.c		\
 	kshadow.c	\
diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h
index ce47cf4..6fdb708 100644
--- a/hw/kdrive/src/kdrive.h
+++ b/hw/kdrive/src/kdrive.h
@@ -275,11 +275,6 @@ typedef struct {
     int    modbit;
 } KdKeySymModsRec;
 
-extern const KeySym       kdDefaultKeymap[KD_MAX_LENGTH * KD_MAX_WIDTH];
-extern const int          kdDefaultKeymapWidth;
-extern const CARD8        kdDefaultModMap[MAP_LENGTH];
-extern const KeySymsRec   kdDefaultKeySyms;
-
 typedef struct _KdKeyboardInfo KdKeyboardInfo;
 
 typedef struct _KdKeyboardDriver {
@@ -308,10 +303,8 @@ struct _KdKeyboardInfo {
     char                *xkbOptions;
     int                 LockLed;
 
-    CARD8               keyState[KD_KEY_COUNT/8];
     int                 minScanCode;
     int                 maxScanCode;
-    KeySymsRec          keySyms; 
 
     int                 leds;
     int                 bellPitch;
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 360739c..94bdfe8 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -846,23 +846,9 @@ KdKeyboardInfo *
 KdNewKeyboard (void)
 {
     KdKeyboardInfo *ki = xcalloc(sizeof(KdKeyboardInfo), 1);
-
     if (!ki)
         return NULL;
-    
-    ki->keySyms.map = (KeySym *)xcalloc(sizeof(KeySym),
-                                        KD_MAX_LENGTH *
-                                         kdDefaultKeySyms.mapWidth);
-    if (!ki->keySyms.map) {
-        xfree(ki);
-        return NULL;
-    }
 
-    memcpy(ki->keySyms.map, kdDefaultKeySyms.map,
-           sizeof(KeySym) * (KD_MAX_LENGTH * kdDefaultKeySyms.mapWidth));
-    ki->keySyms.minKeyCode = kdDefaultKeySyms.minKeyCode;
-    ki->keySyms.maxKeyCode = kdDefaultKeySyms.maxKeyCode;
-    ki->keySyms.mapWidth = kdDefaultKeySyms.mapWidth;
     ki->minScanCode = 0;
     ki->maxScanCode = 0;
     ki->leds = 0;
@@ -1770,41 +1756,10 @@ KdReceiveTimeout (KdPointerInfo *pi)
 
 extern int nClients;
 
-/*
- * kdEnqueueKeyboardEvent
- *
- * This function converts hardware keyboard event information into an X event
- * and enqueues it using MI.  It wakes up the server before returning so that
- * the event will be processed normally.
- *
- */
-
-static void
-KdHandleKeyboardEvent (KdKeyboardInfo *ki, int type, int key)
-{
-    int           byte;
-    CARD8         bit;
-    KdPointerInfo *pi;
-    
-    byte = key >> 3;
-    bit = 1 << (key & 7);
-
-    switch (type) {
-    case KeyPress:
-	ki->keyState[byte] |= bit;
-	break;
-    case KeyRelease:
-	ki->keyState[byte] &= ~bit;
-	break;
-    }
-
-    for (pi = kdPointers; pi; pi = pi->next)
-	KdRunMouseMachine (pi, keyboard, 0, 0, 0, 0, 0, 0);
-}
-
 void
 KdReleaseAllKeys (void)
 {
+#if 0
     int	key, nEvents, i;
     KdKeyboardInfo *ki;
 
@@ -1824,6 +1779,7 @@ KdReleaseAllKeys (void)
     }
 
     KdUnblockSigio ();
+#endif
 }
 
 static void
diff --git a/hw/kdrive/src/kkeymap.c b/hw/kdrive/src/kkeymap.c
deleted file mode 100644
index ae90a34..0000000
--- a/hw/kdrive/src/kkeymap.c
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright © 1999 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <kdrive-config.h>
-#endif
-#include "kdrive.h"
-#include <X11/keysym.h>
-
-/*
- * Map scan codes (both regular and synthesized from extended keys)
- * to X keysyms
- */
-
-const KeySym kdDefaultKeymap[KD_MAX_LENGTH * KD_MAX_WIDTH] = {
-/* These are directly mapped from DOS scanset 0 */
-/*      1     8 */	 XK_Escape, NoSymbol,
-/*      2     9 */	 XK_1,	XK_exclam,
-/*      3    10 */	 XK_2,	XK_at,
-/*      4    11 */	 XK_3,	XK_numbersign,
-/*      5    12 */	 XK_4,	XK_dollar,
-/*      6    13 */	 XK_5,	XK_percent,
-/*      7    14 */	 XK_6,	XK_asciicircum,
-/*      8    15 */	 XK_7,	XK_ampersand,
-/*      9    16 */	 XK_8,	XK_asterisk,
-/*     10    17 */	 XK_9,	XK_parenleft,
-/*     11    18 */	 XK_0,	XK_parenright,
-/*     12    19 */	 XK_minus,	XK_underscore,
-/*     13    20 */	 XK_equal,	XK_plus,
-/*     14    21 */	 XK_BackSpace,	NoSymbol,
-/*     15    22 */	 XK_Tab,	NoSymbol,
-/*     16    23 */	 XK_Q,	NoSymbol,
-/*     17    24 */	 XK_W,	NoSymbol,
-/*     18    25 */	 XK_E,	NoSymbol,
-/*     19    26 */	 XK_R,	NoSymbol,
-/*     20    27 */	 XK_T,	NoSymbol,
-/*     21    28 */	 XK_Y,	NoSymbol,
-/*     22    29 */	 XK_U,	NoSymbol,
-/*     23    30 */	 XK_I,	NoSymbol,
-/*     24    31 */	 XK_O,	NoSymbol,
-/*     25    32 */	 XK_P,	NoSymbol,
-/*     26    33 */	 XK_bracketleft,	XK_braceleft,
-/*     27    34 */	 XK_bracketright,	XK_braceright,
-/*     28    35 */	 XK_Return,	NoSymbol,
-/*     29    36 */	 XK_Control_L,	NoSymbol,
-/*     30    37 */	 XK_A,	NoSymbol,
-/*     31    38 */	 XK_S,	NoSymbol,
-/*     32    39 */	 XK_D,	NoSymbol,
-/*     33    40 */	 XK_F,	NoSymbol,
-/*     34    41 */	 XK_G,	NoSymbol,
-/*     35    42 */	 XK_H,	NoSymbol,
-/*     36    43 */	 XK_J,	NoSymbol,
-/*     37    44 */	 XK_K,	NoSymbol,
-/*     38    45 */	 XK_L,	NoSymbol,
-/*     39    46 */	 XK_semicolon,	XK_colon,
-/*     40    47 */	 XK_apostrophe,	XK_quotedbl,
-/*     41    48 */	 XK_grave,	XK_asciitilde,
-/*     42    49 */	 XK_Shift_L,	NoSymbol,
-/*     43    50 */	 XK_backslash,	XK_bar,
-/*     44    51 */	 XK_Z,	NoSymbol,
-/*     45    52 */	 XK_X,	NoSymbol,
-/*     46    53 */	 XK_C,	NoSymbol,
-/*     47    54 */	 XK_V,	NoSymbol,
-/*     48    55 */	 XK_B,	NoSymbol,
-/*     49    56 */	 XK_N,	NoSymbol,
-/*     50    57 */	 XK_M,	NoSymbol,
-/*     51    58 */	 XK_comma,	XK_less,
-/*     52    59 */	 XK_period,	XK_greater,
-/*     53    60 */	 XK_slash,	XK_question,
-/*     54    61 */	 XK_Shift_R,	NoSymbol,
-/*     55    62 */	 XK_KP_Multiply,	NoSymbol,
-/*     56    63 */	 XK_Alt_L,	XK_Meta_L,
-/*     57    64 */	 XK_space,	NoSymbol,
-/*     58    65 */	 XK_Caps_Lock,	NoSymbol,
-/*     59    66 */	 XK_F1,	NoSymbol,
-/*     60    67 */	 XK_F2,	NoSymbol,
-/*     61    68 */	 XK_F3,	NoSymbol,
-/*     62    69 */	 XK_F4,	NoSymbol,
-/*     63    70 */	 XK_F5,	NoSymbol,
-/*     64    71 */	 XK_F6,	NoSymbol,
-/*     65    72 */	 XK_F7,	NoSymbol,
-/*     66    73 */	 XK_F8,	NoSymbol,
-/*     67    74 */	 XK_F9,	NoSymbol,
-/*     68    75 */	 XK_F10,	NoSymbol,
-/*     69    76 */	 XK_Break,	XK_Pause,
-/*     70    77 */	 XK_Scroll_Lock,	NoSymbol,
-/*     71    78 */	 XK_KP_Home,	XK_KP_7,
-/*     72    79 */	 XK_KP_Up,	XK_KP_8,
-/*     73    80 */	 XK_KP_Page_Up,	XK_KP_9,
-/*     74    81 */	 XK_KP_Subtract,	NoSymbol,
-/*     75    82 */	 XK_KP_Left,	XK_KP_4,
-/*     76    83 */	 XK_KP_5,	NoSymbol,
-/*     77    84 */	 XK_KP_Right,	XK_KP_6,
-/*     78    85 */	 XK_KP_Add,	NoSymbol,
-/*     79    86 */	 XK_KP_End,	XK_KP_1,
-/*     80    87 */	 XK_KP_Down,	XK_KP_2,
-/*     81    88 */	 XK_KP_Page_Down,	XK_KP_3,
-/*     82    89 */	 XK_KP_Insert,	XK_KP_0,
-/*     83    90 */	 XK_KP_Delete,	XK_KP_Decimal,
-/*     84    91 */     NoSymbol,	NoSymbol,
-/*     85    92 */     NoSymbol,	NoSymbol,
-/*     86    93 */     NoSymbol,	NoSymbol,
-/*     87    94 */	 XK_F11,	NoSymbol,
-/*     88    95 */	 XK_F12,	NoSymbol,
-    
-/* These are remapped from the extended set (using ExtendMap) */
-    
-/*     89    96 */	 XK_Control_R,	NoSymbol,
-/*     90    97 */	 XK_KP_Enter,	NoSymbol,
-/*     91    98 */	 XK_KP_Divide,	NoSymbol,
-/*     92    99 */	 XK_Sys_Req,	XK_Print,
-/*     93   100 */	 XK_Alt_R,	XK_Meta_R,
-/*     94   101 */	 XK_Num_Lock,	NoSymbol,
-/*     95   102 */	 XK_Home,	NoSymbol,
-/*     96   103 */	 XK_Up,		NoSymbol,
-/*     97   104 */	 XK_Page_Up,	NoSymbol,
-/*     98   105 */	 XK_Left,	NoSymbol,
-/*     99   106 */	 XK_Right,	NoSymbol,
-/*    100   107 */	 XK_End,	NoSymbol,
-/*    101   108 */	 XK_Down,	NoSymbol,
-/*    102   109 */	 XK_Page_Down,	NoSymbol,
-/*    103   110 */	 XK_Insert,	NoSymbol,
-/*    104   111 */	 XK_Delete,	NoSymbol,
-/*    105   112 */	 XK_Super_L,	NoSymbol,
-/*    106   113 */	 XK_Super_R,	NoSymbol,
-/*    107   114 */	 XK_Menu,	NoSymbol,
-/*    108   115 */	 NoSymbol,	NoSymbol,
-/*    109   116 */	 NoSymbol,	NoSymbol,
-/*    110   117 */	 NoSymbol,	NoSymbol,
-/*    111   118 */	 NoSymbol,	NoSymbol,
-/*    112   119 */	 NoSymbol,	NoSymbol,
-};
-
-/*
- * List of locking key codes
- */
-
-CARD8 kdLockMap[] = {
-    65,
-    101,
-    77,
-};
-
-#define NUM_LOCK (sizeof (kdLockMap) / sizeof (kdLockMap[0]))
-
-int kdNumLock = NUM_LOCK;
-
-/*
- * Map containing list of keys which the X server makes locking when
- * the KEYMAP_LOCKING_ALTGR flag is set in CEKeymapFlags
- */
-
-CARD8 kdOptionalLockMap[] = {
-    100,
-};
-
-#define NUM_OPTIONAL_LOCK  (sizeof (kdOptionalLockMap) / sizeof (kdOptionalLockMap[0]))
-
-int kdNumOptionalLock = NUM_OPTIONAL_LOCK;
-
-const CARD8 kdDefaultModMap[MAP_LENGTH];
-
-unsigned long kdDefaultKeymapFlags = 0;
-
-const KeySymsRec kdDefaultKeySyms = {
-    kdDefaultKeymap,
-    KD_MIN_KEYCODE,
-    KD_MAX_KEYCODE,
-    KD_MAX_WIDTH
-};
diff --git a/hw/kdrive/src/kkeymap.h b/hw/kdrive/src/kkeymap.h
deleted file mode 100644
index f66cfa4..0000000
--- a/hw/kdrive/src/kkeymap.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright © 1999 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-/*
- *  All global variables and functions pertaining to keyboard key mapping
- *  live in this header file.
- */
-
-#ifndef _KKEYMAP_H
-#define _KKEYMAP_H
-
-/* Offset of MIN_SCANCODE to 8 (X minimum scancode value) */
-#define KD_KEY_OFFSET	(8 - kdMinScanCode)
-
-#define KD_MIN_KEYCODE	8
-#define KD_MAX_KEYCODE	254
-#define KD_MAX_WIDTH	4
-#define KD_MAX_LENGTH	(KD_MAX_KEYCODE - KD_MIN_KEYCODE + 1)
-
-extern int		kdMinScanCode;
-extern int		kdMaxScanCode;
-extern int		kdMinKeyCode;
-extern int		kdMaxKeyCode;
-extern int		kdKeymapWidth;
-
-extern KeySym		kdKeymap[KD_MAX_LENGTH * KD_MAX_WIDTH];
-
-extern CARD8		kdModMap[MAP_LENGTH];
-    
-extern KeySymsRec	kdKeySyms;
-
-typedef struct {
-    KeySym  modsym;
-    int	    modbit;
-} KdKeySymModsRec;
-
-#endif /* _KKEYMAP_H */
commit 4c8812b544ce5f319a7ac59a131c626c8509ef99
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Jun 10 12:46:19 2009 -0400

    kdrive: undef PSEUDO8
    
    Whatever that was, it no longer is.

diff --git a/hw/kdrive/src/kdrive.c b/hw/kdrive/src/kdrive.c
index 7ba4af4..26296b5 100644
--- a/hw/kdrive/src/kdrive.c
+++ b/hw/kdrive/src/kdrive.c
@@ -24,9 +24,6 @@
 #include <kdrive-config.h>
 #endif
 #include "kdrive.h"
-#ifdef PSEUDO8
-#include "pseudo8/pseudo8.h"
-#endif
 #include <mivalidate.h>
 #include <dixstruct.h>
 #include "privates.h"
@@ -557,9 +554,6 @@ KdUseMsg (void)
     ErrorF("-switchCmd       Command to execute on vt switch\n");
     ErrorF("-zap             Terminate server on Ctrl+Alt+Backspace\n");
     ErrorF("vtxx             Use virtual terminal xx instead of the next available\n");
-#ifdef PSEUDO8
-    p8UseMsg ();
-#endif
 }
 
 int
@@ -684,11 +678,7 @@ KdProcessArgument (int argc, char **argv, int i)
         return 2;
     }
 
-#ifdef PSEUDO8
-    return p8ProcessArgument (argc, argv, i);
-#else
     return 0;
-#endif
 }
 
 /*
@@ -1059,10 +1049,6 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
 	if (!(*card->cfuncs->initAccel) (pScreen))
 	    screen->dumb = TRUE;
     
-#ifdef PSEUDO8
-    (void) p8Init (pScreen, PSEUDO8_USE_DEFAULT);
-#endif
-    
     if (card->cfuncs->finishInitScreen)
 	if (!(*card->cfuncs->finishInitScreen) (pScreen))
 	    return FALSE;
commit 973ef5a7086aedb88a4888e73630c96ae68078e4
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Jun 10 12:44:45 2009 -0400

    kdrive: Remove a lie about PCMCIA support.

diff --git a/hw/kdrive/src/kdrive.c b/hw/kdrive/src/kdrive.c
index ccef2a0..7ba4af4 100644
--- a/hw/kdrive/src/kdrive.c
+++ b/hw/kdrive/src/kdrive.c
@@ -542,7 +542,6 @@ void
 KdUseMsg (void)
 {
     ErrorF("\nTinyX Device Dependent Usage:\n");
-    ErrorF("-card pcmcia     Use PCMCIA card as additional screen\n");
     ErrorF("-screen WIDTH[/WIDTHMM]xHEIGHT[/HEIGHTMM][@ROTATION][X][Y][xDEPTH/BPP{,DEPTH/BPP}[xFREQ]]  Specify screen characteristics\n");
     ErrorF("-rgba rgb/bgr/vrgb/vbgr/none   Specify subpixel ordering for LCD panels\n");
     ErrorF("-mouse driver [,n,,options]    Specify the pointer driver and its options (n is the number of buttons)\n");
@@ -569,14 +568,6 @@ KdProcessArgument (int argc, char **argv, int i)
     KdCardInfo	    *card;
     KdScreenInfo    *screen;
 
-    if (!strcmp (argv[i], "-card"))
-    {
-	if ((i+1) < argc)
-	    InitCard (argv[i+1]);
-	else
-	    UseMsg ();
-	return 2;
-    }
     if (!strcmp (argv[i], "-screen"))
     {
 	if ((i+1) < argc)
commit e3c65cf1df9bbfb126f07b4b8e1254a855fb70c7
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Jun 10 12:05:09 2009 -0400

    xephyr: Add -title option.

diff --git a/hw/kdrive/ephyr/ephyrinit.c b/hw/kdrive/ephyr/ephyrinit.c
index 3c573cd..22152ff 100644
--- a/hw/kdrive/ephyr/ephyrinit.c
+++ b/hw/kdrive/ephyr/ephyrinit.c
@@ -110,6 +110,7 @@ ddxUseMsg (void)
 #endif
   ErrorF("-noxv                do not use XV\n");
   ErrorF("-name [name]         define the name in the WM_CLASS property\n");
+  ErrorF("-title [title]       set the window title in the WM_NAME property\n");
   ErrorF("\n");
 
   exit(1);
@@ -242,6 +243,19 @@ ddxProcessArgument (int argc, char **argv, int i)
            return 0;
          }
    }
+  else if (!strcmp (argv[i], "-title"))
+   {
+       if (i+1 < argc && argv[i+1][0] != '-')
+         {
+           hostx_set_title(argv[i+1]);
+           return 2;
+         }
+       else
+         {
+           UseMsg();
+           return 0;
+         }
+   }
   else if (argv[i][0] == ':')
     {
       hostx_set_display_name(argv[i]);
diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c
index f69db2b..46645d3 100644
--- a/hw/kdrive/ephyr/hostx.c
+++ b/hw/kdrive/ephyr/hostx.c
@@ -122,6 +122,7 @@ extern int            monitorResolution;
 
 char           *ephyrResName = NULL;
 int             ephyrResNameFromCmd = 0;
+char	       *ephyrTitle = NULL;
 
 static void
 hostx_set_fullscreen_hint(void);
@@ -222,20 +223,25 @@ hostx_set_screen_number(EphyrScreenInfo screen, int number)
 void
 hostx_set_win_title (EphyrScreenInfo screen, char *extra_text)
 {
-  struct EphyrHostScreen *host_screen = host_screen_from_screen_info (screen);
-#define BUF_LEN 256
-  char buf[BUF_LEN+1];
+    struct EphyrHostScreen *host_screen = host_screen_from_screen_info (screen);
 
-  if (!host_screen)
+    if (!host_screen)
     return;
 
-  memset (buf, 0, BUF_LEN+1) ;
-  snprintf (buf, BUF_LEN, "Xephyr on %s.%d %s", 
-            HostX.server_dpy_name, 
-            host_screen->mynum,
-            (extra_text != NULL) ? extra_text : "");
+    if (ephyrTitle) {
+      XStoreName(HostX.dpy, host_screen->win, ephyrTitle);
+    } else {
+#define BUF_LEN 256
+      char buf[BUF_LEN+1];
+
+      memset (buf, 0, BUF_LEN+1) ;
+      snprintf (buf, BUF_LEN, "Xephyr on %s.%d %s", 
+		HostX.server_dpy_name, 
+		host_screen->mynum,
+		(extra_text != NULL) ? extra_text : "");
 
-  XStoreName (HostX.dpy, host_screen->win, buf);
+      XStoreName (HostX.dpy, host_screen->win, buf);
+    }
 }
 
 int
@@ -319,6 +325,12 @@ hostx_use_resname (char *name, int fromcmd)
   ephyrResNameFromCmd = fromcmd;
 }
 
+void
+hostx_set_title (char *title)
+{
+  ephyrTitle = title;
+}
+
 int
 hostx_init (void)
 {
diff --git a/hw/kdrive/ephyr/hostx.h b/hw/kdrive/ephyr/hostx.h
index c1b1958..e65e0c9 100644
--- a/hw/kdrive/ephyr/hostx.h
+++ b/hw/kdrive/ephyr/hostx.h
@@ -148,6 +148,9 @@ hostx_use_preexisting_window(unsigned long win_id);
 void
 hostx_use_resname (char *name, int fromcmd);
 
+void
+hostx_set_title(char *name);
+
 void 
 hostx_handle_signal(int signum);
 
commit 803522300344265f11ea9f869ee6747730413bae
Author: Colin Harrison <colin.harrison at virgin.net>
Date:   Wed Jun 10 13:32:54 2009 +0100

    Xming: Simplify logic for ownership release of native clipboard
    
    Make the logic simpler for the ownership release of the Windows
    clipboard in winclipboardwrappers.c - We've already marked a selection
    as unowned if it is owned by our clipboard window
    
    Copyright (C) Colin Harrison 2005-2008
    http://www.straightrunning.com/XmingNotes/
    http://sourceforge.net/projects/xming/
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/winclipboardwrappers.c b/hw/xwin/winclipboardwrappers.c
index 14f76cd..c68d78a 100755
--- a/hw/xwin/winclipboardwrappers.c
+++ b/hw/xwin/winclipboardwrappers.c
@@ -437,11 +437,9 @@ winProcSetSelectionOwner (ClientPtr client)
    * an owned to not owned transition was detected,
    * and we currently own the Win32 clipboard.
    */
-  if (None == stuff->window
-      && (None == s_iOwners[CLIP_OWN_PRIMARY]
-	  || g_iClipboardWindow == s_iOwners[CLIP_OWN_PRIMARY])
-      && (None == s_iOwners[CLIP_OWN_CLIPBOARD]
-	  || g_iClipboardWindow == s_iOwners[CLIP_OWN_CLIPBOARD])
+  if (stuff->window == None
+      && s_iOwners[CLIP_OWN_PRIMARY] == None
+      && s_iOwners[CLIP_OWN_CLIPBOARD] == None
       && fOwnedToNotOwned
       && g_hwndClipboard != NULL
       && g_hwndClipboard == GetClipboardOwner ())
@@ -458,10 +456,6 @@ winProcSetSelectionOwner (ClientPtr client)
       EmptyClipboard ();
       CloseClipboard ();
 
-      /* Clear X selection ownership (might still be marked as us owning) */
-      s_iOwners[CLIP_OWN_PRIMARY] = None;
-      s_iOwners[CLIP_OWN_CLIPBOARD] = None;
-      
       goto winProcSetSelectionOwner_Done;
     }
 
commit c7d3965bee0edb72468a0135aaa8a081348c2b23
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Wed Jun 10 13:09:44 2009 +0100

    Cygwin/X: Add a needed inputstr.h
    
    Add a needed inputstr.h to fix build after commit 6d4ffcc9e066bc7c49dcff1a2ff0111801c7286d
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/InitInput.c b/hw/xwin/InitInput.c
index 2eaa024..1e9bcad 100644
--- a/hw/xwin/InitInput.c
+++ b/hw/xwin/InitInput.c
@@ -31,6 +31,7 @@
 #endif
 #include "win.h"
 #include "dixstruct.h"
+#include "inputstr.h"
 
 
 /*
commit 6d4ffcc9e066bc7c49dcff1a2ff0111801c7286d
Author: Dave Airlie <airlied at redhat.com>
Date:   Wed Jun 10 11:15:24 2009 +1000

    input: move inputstr.h to where its needed.
    
    This stops inputstr.h being needed to be included by output drivers.
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/enterleave.c b/dix/enterleave.c
index d7f5f58..488a943 100644
--- a/dix/enterleave.c
+++ b/dix/enterleave.c
@@ -30,6 +30,7 @@
 
 #include <X11/X.h>
 #include <X11/extensions/XI2.h>
+#include "inputstr.h"
 #include "windowstr.h"
 #include "scrnintstr.h"
 #include "exglobals.h"
diff --git a/include/windowstr.h b/include/windowstr.h
index be909b5..96bee9b 100644
--- a/include/windowstr.h
+++ b/include/windowstr.h
@@ -59,7 +59,6 @@ SOFTWARE.
 #include "miscstruct.h"
 #include <X11/Xprotostr.h>
 #include "opaque.h"
-#include "inputstr.h"
 
 #define GuaranteeNothing	0
 #define GuaranteeVisBack	1
commit 6f59a8160042ea145514fdcb410f17f33fd437c2
Author: Benjamin Defnet <benjamin.r.defnet at intel.com>
Date:   Mon Jun 8 21:45:42 2009 -0700

    hw/xf86/modes: Set crtc mode/rotation/transform before calling set_mode_major
    
    This moves code out of each implementation of set_mode_major and back into
    the X server. The real feature here is that the transform is now available
    in the crtc for use by either xf86CrtcRotate or whatever the driver wants to
    do. Without this change, the transform was lost for drivers providing the
    set_mode_major interface.
    
    Note that users of this API will want to stop smashing the transformPresent
    field, and could also stop setting mode/x/y/rotation for new enough X servers,
    but there's no reason to make that change as it will break things when
    running against older X servers.
    
    Signed-off-by: Keith Packard <keithp at keithp.com>
    Acked-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index b40e096..585f84d 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -266,9 +266,6 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
     RRTransformRec	saved_transform;
     Bool		saved_transform_present;
 
-    if (crtc->funcs->set_mode_major)
-	return crtc->funcs->set_mode_major(crtc, mode, rotation, x, y);
-
     crtc->enabled = xf86CrtcInUse (crtc);
 
     /* We only hit this if someone explicitly sends a "disabled" modeset. */
@@ -306,6 +303,11 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
     } else
 	crtc->transformPresent = FALSE;
 
+    if (crtc->funcs->set_mode_major) {
+	ret = crtc->funcs->set_mode_major(crtc, mode, rotation, x, y);
+	goto done;
+    }
+
     /* Pass our mode to the outputs and the CRTC to give them a chance to
      * adjust it according to limitations or output properties, and also
      * a chance to reject the mode entirely.
commit e244a5991e2cc55f5aa2f6e5255f1dabf56f0235
Author: Federico Mena Quintero <federico at novell.com>
Date:   Tue Jun 9 13:28:28 2009 -0700

    dix/randr: Add missing fields to SRR*NotifyEvent()
    
    Also, remove redundant field swaps and make others match the order in which
    they are declared in the xRR*NotifyEvent structs.
    
    Signed-off-by: Federico Mena Quintero <federico at novell.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/randr/randr.c b/randr/randr.c
index fd0a30a..1c1d0c4 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -115,11 +115,11 @@ SRRScreenChangeNotifyEvent(xRRScreenChangeNotifyEvent *from,
     cpswapl(from->root, to->root);
     cpswapl(from->window, to->window);
     cpswaps(from->sizeID, to->sizeID);
+    cpswaps(from->subpixelOrder, to->subpixelOrder);
     cpswaps(from->widthInPixels, to->widthInPixels);
     cpswaps(from->heightInPixels, to->heightInPixels);
     cpswaps(from->widthInMillimeters, to->widthInMillimeters);
     cpswaps(from->heightInMillimeters, to->heightInMillimeters);
-    cpswaps(from->subpixelOrder, to->subpixelOrder);
 }
 
 static void
@@ -133,8 +133,8 @@ SRRCrtcChangeNotifyEvent(xRRCrtcChangeNotifyEvent *from,
     cpswapl(from->window, to->window);
     cpswapl(from->crtc, to->crtc);
     cpswapl(from->mode, to->mode);
-    cpswapl(from->window, to->window);
     cpswaps(from->rotation, to->rotation);
+    /* pad1 */
     cpswaps(from->x, to->x);
     cpswaps(from->y, to->y);
     cpswaps(from->width, to->width);
@@ -155,6 +155,8 @@ SRROutputChangeNotifyEvent(xRROutputChangeNotifyEvent *from,
     cpswapl(from->crtc, to->crtc);
     cpswapl(from->mode, to->mode);
     cpswaps(from->rotation, to->rotation);
+    to->connection = from->connection;
+    to->subpixelOrder = from->subpixelOrder;
 }
 
 static void
@@ -168,6 +170,11 @@ SRROutputPropertyNotifyEvent(xRROutputPropertyNotifyEvent *from,
     cpswapl(from->output, to->output);
     cpswapl(from->atom, to->atom);
     cpswapl(from->timestamp, to->timestamp);
+    to->state = from->state;
+    /* pad1 */
+    /* pad2 */
+    /* pad3 */
+    /* pad4 */
 }
 
 static void
commit 746e7b22e1bdfbf2363040367209b4c46b1c2fec
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jun 9 16:20:11 2009 -0400

    cvt: Allow multiple-of-60Hz refresh rates for reduced blanking.
    
    Doing so generates the same timings as given in the DMT spec for
    120Hz RB, so we should be set there.  Other rates might be legal
    too but why push our luck.

diff --git a/hw/xfree86/utils/cvt/cvt.c b/hw/xfree86/utils/cvt/cvt.c
index 500e31f..cf0a479 100644
--- a/hw/xfree86/utils/cvt/cvt.c
+++ b/hw/xfree86/utils/cvt/cvt.c
@@ -261,11 +261,14 @@ main (int argc, char *argv[])
         HDisplay += 8;
     }
 
-    if (Reduced && (VRefresh != 60.0)) {
-        fprintf(stderr, "\nERROR: 60Hz refresh rate required for reduced"
-                " blanking.\n");
-        PrintUsage(argv[0]);
-        return 0;
+    if (Reduced) {
+	if ((VRefresh / 60.0) != floor(VRefresh / 60.0)) {
+	    fprintf(stderr,
+		    "\nERROR: Multiple of 60Hz refresh rate required for "
+		    " reduced blanking.\n");
+	    PrintUsage(argv[0]);
+	    return 0;
+	}
     }
 
     IsCVT = CVTCheckStandard(HDisplay, VDisplay, VRefresh, Reduced, Verbose);
commit 2a035600e603117a4dbe668cad50bae2a5609094
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 9 10:14:18 2009 +1000

    require inputproto 1.9.99.11

diff --git a/configure.ac b/configure.ac
index fc29bf0..acd9885 100644
--- a/configure.ac
+++ b/configure.ac
@@ -700,7 +700,7 @@ XEXT_LIB='$(top_builddir)/Xext/libXext.la'
 XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
 
 dnl Core modules for most extensions, et al.
-REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.9.3] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.10] [kbproto >= 1.0.3]"
+REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.9.3] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.11] [kbproto >= 1.0.3]"
 REQUIRED_LIBS="xfont xau fontenc [pixman-1 >= 0.13.2]"
 
 dnl HAVE_DBUS is true if we actually have the D-Bus library, whereas
commit c5bebca46f63bcd7279f3c73ed1d50e0c1b6051f
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 8 17:54:05 2009 +1000

    Xi: hierarchy events have a num_info now instead of num_devices.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/chdevhier.c b/Xi/chdevhier.c
index e2903f1..3f2bb93 100644
--- a/Xi/chdevhier.c
+++ b/Xi/chdevhier.c
@@ -77,7 +77,7 @@ void XISendDeviceHierarchyEvent(int flags[MAXDEVICES])
     ev->evtype = XI_HierarchyChanged;
     ev->time = GetTimeInMillis();
     ev->flags = 0;
-    ev->num_devices = inputInfo.numDevices;
+    ev->num_info = inputInfo.numDevices;
 
     info = (xXIHierarchyInfo*)&ev[1];
     for (dev = inputInfo.devices; dev; dev = dev->next)
@@ -109,12 +109,12 @@ void XISendDeviceHierarchyEvent(int flags[MAXDEVICES])
             info->flags = flags[i];
             info->use = 0;
             ev->flags |= info->flags;
-            ev->num_devices++;
+            ev->num_info++;
             info++;
         }
     }
 
-    ev->length = (ev->num_devices * sizeof(xXIHierarchyInfo))/4;
+    ev->length = (ev->num_info * sizeof(xXIHierarchyInfo))/4;
 
     dummyDev.id = XIAllDevices;
     SendEventToAllWindows(&dummyDev, (XI_HierarchyChangedMask >> 8), (xEvent*)ev, 1);
diff --git a/Xi/extinit.c b/Xi/extinit.c
index 549c5ca..635afea 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -786,10 +786,10 @@ static void SDeviceHierarchyEvent(xXIHierarchyEvent *from,
     swaps(&to->deviceid, n);
     swapl(&to->time, n);
     swapl(&to->flags, n);
-    swaps(&to->num_devices, n);
+    swaps(&to->num_info, n);
 
     info = (xXIHierarchyInfo*)&to[1];
-    for (i = 0; i< from->num_devices; i++)
+    for (i = 0; i< from->num_info; i++)
     {
         swaps(&info->deviceid, n);
         swaps(&info->attachment, n);
commit 810b74dbbcc1db3e68e0f95ff5223ddb2032e46d
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 8 13:41:22 2009 +1000

    Xi: change from XICreateMaster to XIAddMaster for consistency.
    
    add/remove is used for slave devices and hierarchy flags.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/chdevhier.c b/Xi/chdevhier.c
index bd3da08..e2903f1 100644
--- a/Xi/chdevhier.c
+++ b/Xi/chdevhier.c
@@ -167,9 +167,9 @@ ProcXIChangeHierarchy(ClientPtr client)
 
         switch(any->type)
         {
-            case XICreateMaster:
+            case XIAddMaster:
                 {
-                    xXICreateMasterInfo* c = (xXICreateMasterInfo*)any;
+                    xXIAddMasterInfo* c = (xXIAddMasterInfo*)any;
                     char* name;
 
                     SWAPIF(swaps(&c->name_len, n));
commit 0e66a443a09176b8a875195d5473b953c07aa1d7
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 8 12:24:24 2009 +1000

    Xi: return BadValue for XI_HierarchyChangd mask on devices.
    
    This mask may only be selected for XIAllDevices.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 9dbdea7..51d9c99 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -97,6 +97,13 @@ ProcXISelectEvent(ClientPtr client)
         if (rc != Success)
             return rc;
 
+        /* hierarchy event mask is not allowed on devices */
+        if (evmask->deviceid != XIAllDevices && evmask->mask_len >= 1)
+        {
+            unsigned char *bits = (unsigned char*)&evmask[1];
+            if (BitIsOn(bits, XI_HierarchyChanged))
+                return BadValue;
+        }
 
         if ((evmask->mask_len * 4) > XI_LASTEVENT)
         {
commit 69a9545d1f8110841538410818df19fd960412c5
Author: Keith Packard <keithp at keithp.com>
Date:   Thu May 28 14:43:27 2009 -0700

    Make RANDR 'set' timestamps follow client specified time. Bug 21987.
    
    The lastSetTime value which indicates when the configuration within the
    server was last changed was not getting set in the appropriate RandR
    requests.
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 287c211..32a0992 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -978,6 +978,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
 	goto sendReply;
     }
     rep.status = RRSetConfigSuccess;
+    pScrPriv->lastSetTime = time;
     
 sendReply:
     if (outputs)
@@ -987,7 +988,7 @@ sendReply:
     /* rep.status has already been filled in */
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
-    rep.newTimestamp = pScrPriv->lastConfigTime.milliseconds;
+    rep.newTimestamp = pScrPriv->lastSetTime.milliseconds;
 
     if (client->swapped) 
     {
@@ -1130,6 +1131,8 @@ ProcRRSetPanning (ClientPtr client)
     if (! pScrPriv->rrSetPanning (pScreen, crtc, &total, &tracking, border))
 	return BadMatch;
 
+    pScrPriv->lastSetTime = time;
+
     rep.status = RRSetConfigSuccess;
 
 sendReply:
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index 46890bf..a919ffd 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -946,8 +946,10 @@ ProcRRSetScreenConfig (ClientPtr client)
 
     if (!RRCrtcSet (crtc, mode, 0, 0, stuff->rotation, 1, &output))
 	rep.status = RRSetConfigFailed;
-    else
+    else {
+	pScrPriv->lastSetTime = time;
 	rep.status = RRSetConfigSuccess;
+    }
 
     /*
      * XXX Configure other crtcs to mirror as much as possible
commit fa18c569ed26d2fdd442af6b39723cb7e30d18df
Author: Ben Skeggs <bskeggs at redhat.com>
Date:   Tue Jun 9 09:14:50 2009 +1000

    exa: driver pixmaps enabled if either CreatePixmap or CreatePixmap2 present

diff --git a/exa/exa.c b/exa/exa.c
index 089350b..d04ea71 100644
--- a/exa/exa.c
+++ b/exa/exa.c
@@ -1190,7 +1190,7 @@ exaDriverInit (ScreenPtr		pScreen,
 	return FALSE;
     }
 
-    if (!pScreenInfo->CreatePixmap) {
+    if (!pScreenInfo->CreatePixmap && !pScreenInfo->CreatePixmap2) {
 	if (!pScreenInfo->memoryBase) {
 	    LogMessage(X_ERROR, "EXA(%d): ExaDriverRec::memoryBase "
 		       "must be non-zero\n", pScreen->myNum);
commit 9390b7a133b0e17bc4d303effb7a99ff7017b086
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Jun 7 19:26:45 2009 +1000

    dix: protect against missing ButtonClasses in GetPointerMapping.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/devices.c b/dix/devices.c
index eb54e0a..3996ca6 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1724,10 +1724,11 @@ ProcGetPointerMapping(ClientPtr client)
 
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
-    rep.nElts = butc->numButtons;
+    rep.nElts = (butc) ? butc->numButtons : 0;
     rep.length = ((unsigned)rep.nElts + (4-1))/4;
     WriteReplyToClient(client, sizeof(xGetPointerMappingReply), &rep);
-    (void)WriteToClient(client, (int)rep.nElts, (char *)&butc->map[1]);
+    if (butc)
+        WriteToClient(client, (int)rep.nElts, (char *)&butc->map[1]);
     return Success;
 }
 
commit 21ee53060b4dcb5c12074cf6682ff0067021ff60
Author: Simon Thum <simon.thum at gmx.de>
Date:   Fri Jun 5 19:14:48 2009 +0200

    config: fix build after XI2 API changes to RemoveDevice.
    
    This patch fixes the build with --enable-config-dbus is enabled
    (default disabled).
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/config/dbus.c b/config/dbus.c
index cef8ed5..37462ac 100644
--- a/config/dbus.c
+++ b/config/dbus.c
@@ -175,7 +175,7 @@ add_device(DBusMessage *message, DBusMessage *reply, DBusError *error)
 unwind:
     if (ret != Success) {
         if (dev)
-            RemoveDevice(dev);
+            RemoveDevice(dev, TRUE);
 
         err = -ret;
         dbus_message_iter_append_basic(&reply_iter, DBUS_TYPE_INT32, &err);
commit 07c59411817c10fbcbf1bc9efa6a0818b6e0493a
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Sat Jun 6 22:17:44 2009 -0700

    GLX: Make sure the types match for ALIAS in indirect_reqsize.c
    (cherry picked from commit 31a20a573b867fb7f02da15425e3b92eccb82dec)

diff --git a/glx/indirect_reqsize.c b/glx/indirect_reqsize.c
index c47f01e..35bb937 100644
--- a/glx/indirect_reqsize.c
+++ b/glx/indirect_reqsize.c
@@ -39,12 +39,12 @@
 #endif
 #ifdef HAVE_ALIAS
 #  define ALIAS2(from,to) \
-    GLint __glX ## from ## ReqSize( const GLbyte * pc, Bool swap ) \
+    int __glX ## from ## ReqSize( const GLbyte * pc, Bool swap ) \
         __attribute__ ((alias( # to )));
 #  define ALIAS(from,to) ALIAS2( from, __glX ## to ## ReqSize )
 #else
 #  define ALIAS(from,to) \
-    GLint __glX ## from ## ReqSize( const GLbyte * pc, Bool swap ) \
+    int __glX ## from ## ReqSize( const GLbyte * pc, Bool swap ) \
     { return __glX ## to ## ReqSize( pc, swap ); }
 #endif
 
commit 077556ec39ca7e0d14486005cf71fcdc70a350cf
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Sat Jun 6 21:55:51 2009 -0700

    XQuartz: AIGLX dispatch table cleanup
    
    This should fix some issues when building on different versions of OSX.  We only use extensions that OpenGL.framework's glext.h header tells us are supported.
    (cherry picked from commit e10c53421f1e780573c8adcd8ea89d6ffa28a819)

diff --git a/hw/xquartz/GL/indirect.c b/hw/xquartz/GL/indirect.c
index 9b54b0c..10a5b2c 100644
--- a/hw/xquartz/GL/indirect.c
+++ b/hw/xquartz/GL/indirect.c
@@ -39,33 +39,11 @@
 
 #include <AvailabilityMacros.h>
 
-/*  
- * These define seem questionable to me, but I'm not sure why they were here
- * in the first place.
- */ 
-#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
-#define GL_EXT_histogram 1
-#define GL_EXT_polygon_offset 1
-#define GL_SGIS_pixel_texture 1
-#define GL_SGIX_pixel_texture 1
-#define GL_EXT_multisample 1
-#define GL_SGIS_multisample 1
-#define GL_EXT_vertex_array 1
-#define GL_ARB_point_parameters 1
-#define GL_NV_vertex_array_range 1
-#define GL_MESA_resize_buffers 1
-#define GL_ARB_window_pos 1
-#define GL_EXT_cull_vertex 1
-#define GL_NV_vertex_program 1
-#define GL_APPLE_fence 1
-#define GL_IBM_multimode_draw_arrays 1
-#define GL_EXT_fragment_shader 1
-#endif
+#define GL_GLEXT_WUNDEF_SUPPORT
 
 #include <OpenGL/OpenGL.h>
 #include <OpenGL/CGLContext.h>
 
-#include <GL/gl.h>
 #include <GL/glxproto.h>
 #include <windowstr.h>
 #include <resource.h>
@@ -834,735 +812,957 @@ GLuint __glFloorLog2(GLuint val)
 }
 
 void warn_func(void * p1, char *format, ...) {
-  va_list v;
-  va_start(v, format);
-  vfprintf(stderr, format, v);
-  va_end(v);
+    va_list v;
+    va_start(v, format);
+    vfprintf(stderr, format, v);
+    va_end(v);
 }
 
 static void setup_dispatch_table(void) {
-  struct _glapi_table *disp=_glapi_get_dispatch();
-  _glapi_set_warning_func((_glapi_warning_func)warn_func);
-  _glapi_noop_enable_warnings(TRUE);
-
-  SET_Accum(disp, glAccum);
-  SET_ActiveStencilFaceEXT(disp, glActiveStencilFaceEXT);
-  SET_ActiveTextureARB(disp, glActiveTextureARB);
-//SET_AlphaFragmentOp1ATI(disp, glAlphaFragmentOp1EXT);   // <-- EXT -> ATI
-//SET_AlphaFragmentOp2ATI(disp, glAlphaFragmentOp2EXT);
-//SET_AlphaFragmentOp3ATI(disp, glAlphaFragmentOp3EXT);
-  SET_AlphaFunc(disp, glAlphaFunc);
-//SET_AreProgramsResidentNV(disp, glAreProgramsResidentNV);
-  SET_AreTexturesResident(disp, glAreTexturesResident); 
-  SET_ArrayElement(disp, glArrayElement);
-  SET_AttachObjectARB(disp, glAttachObjectARB);
-  SET_Begin(disp, glBegin);
-//SET_BeginFragmentShaderATI(disp, glBeginFragmentShaderEXT);   // <-- EXT -> ATI
-  SET_BeginQueryARB(disp, glBeginQueryARB);
-  SET_BindAttribLocationARB(disp, glBindAttribLocationARB);
-  SET_BindBufferARB(disp, glBindBufferARB);
-//SET_BindFragmentShaderATI(disp, glBindFragmentShaderEXT);     // <-- EXT -> ATI
-  SET_BindFramebufferEXT(disp, glBindFramebufferEXT);
-//SET_BindProgramNV(disp, glBindProgramNV);
-  SET_BindRenderbufferEXT(disp, glBindRenderbufferEXT);
-  SET_BindTexture(disp, glBindTexture);
-  SET_Bitmap(disp, glBitmap);
-  SET_BlendColor(disp, glBlendColor);
-  SET_BlendEquation(disp, glBlendEquation);
-  SET_BlendEquationSeparateEXT(disp, glBlendEquationSeparateEXT);
-  SET_BlendFunc(disp, glBlendFunc);
-  SET_BlendFuncSeparateEXT(disp, glBlendFuncSeparateEXT);
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
-  SET_BlitFramebufferEXT(disp, glBlitFramebufferEXT);
+    struct _glapi_table *disp=_glapi_get_dispatch();
+    _glapi_set_warning_func((_glapi_warning_func)warn_func);
+    _glapi_noop_enable_warnings(TRUE);
+
+    /* to update:
+     * for f in $(grep 'define SET_' ../../../glx/dispatch.h  | cut -f2 -d' ' | cut -f1 -d\( | sort -u); do grep -q $f indirect.c || echo $f ; done | grep -v by_offset | sed 's:SET_\(.*\)$:SET_\1(disp, gl\1)\;:' | pbcopy
+     */
+
+    SET_Accum(disp, glAccum);
+    SET_AlphaFunc(disp, glAlphaFunc);
+    SET_AreTexturesResident(disp, glAreTexturesResident);
+    SET_ArrayElement(disp, glArrayElement);
+    SET_Begin(disp, glBegin);
+    SET_BindTexture(disp, glBindTexture);
+    SET_Bitmap(disp, glBitmap);
+    SET_BlendColor(disp, glBlendColor);
+    SET_BlendEquation(disp, glBlendEquation);
+    SET_BlendFunc(disp, glBlendFunc);
+    SET_CallList(disp, glCallList);
+    SET_CallLists(disp, glCallLists);
+    SET_Clear(disp, glClear);
+    SET_ClearAccum(disp, glClearAccum);
+    SET_ClearColor(disp, glClearColor);
+    SET_ClearDepth(disp, glClearDepth);
+    SET_ClearIndex(disp, glClearIndex);
+    SET_ClearStencil(disp, glClearStencil);
+    SET_ClipPlane(disp, glClipPlane);
+    SET_Color3b(disp, glColor3b);
+    SET_Color3bv(disp, glColor3bv);
+    SET_Color3d(disp, glColor3d);
+    SET_Color3dv(disp, glColor3dv);
+    SET_Color3f(disp, glColor3f);
+    SET_Color3fv(disp, glColor3fv);
+    SET_Color3i(disp, glColor3i);
+    SET_Color3iv(disp, glColor3iv);
+    SET_Color3s(disp, glColor3s);
+    SET_Color3sv(disp, glColor3sv);
+    SET_Color3ub(disp, glColor3ub);
+    SET_Color3ubv(disp, glColor3ubv);
+    SET_Color3ui(disp, glColor3ui);
+    SET_Color3uiv(disp, glColor3uiv);
+    SET_Color3us(disp, glColor3us);
+    SET_Color3usv(disp, glColor3usv);
+    SET_Color4b(disp, glColor4b);
+    SET_Color4bv(disp, glColor4bv);
+    SET_Color4d(disp, glColor4d);
+    SET_Color4dv(disp, glColor4dv);
+    SET_Color4f(disp, glColor4f);
+    SET_Color4fv(disp, glColor4fv);
+    SET_Color4i(disp, glColor4i);
+    SET_Color4iv(disp, glColor4iv);
+    SET_Color4s(disp, glColor4s);
+    SET_Color4sv(disp, glColor4sv);
+    SET_Color4ub(disp, glColor4ub);
+    SET_Color4ubv(disp, glColor4ubv);
+    SET_Color4ui(disp, glColor4ui);
+    SET_Color4uiv(disp, glColor4uiv);
+    SET_Color4us(disp, glColor4us);
+    SET_Color4usv(disp, glColor4usv);
+    SET_ColorMask(disp, glColorMask);
+    SET_ColorMaterial(disp, glColorMaterial);
+    SET_ColorPointer(disp, glColorPointer);
+    SET_ColorSubTable(disp, glColorSubTable);
+    SET_ColorTable(disp, glColorTable);
+    SET_ColorTableParameterfv(disp, glColorTableParameterfv);
+    SET_ColorTableParameteriv(disp, glColorTableParameteriv);
+    SET_ConvolutionFilter1D(disp, glConvolutionFilter1D);
+    SET_ConvolutionFilter2D(disp, glConvolutionFilter2D);
+    SET_ConvolutionParameterf(disp, glConvolutionParameterf);
+    SET_ConvolutionParameterfv(disp, glConvolutionParameterfv);
+    SET_ConvolutionParameteri(disp, glConvolutionParameteri);
+    SET_ConvolutionParameteriv(disp, glConvolutionParameteriv);
+    SET_CopyColorSubTable(disp, glCopyColorSubTable);
+    SET_CopyColorTable(disp, glCopyColorTable);
+    SET_CopyConvolutionFilter1D(disp, glCopyConvolutionFilter1D);
+    SET_CopyConvolutionFilter2D(disp, glCopyConvolutionFilter2D);
+    SET_CopyPixels(disp, glCopyPixels);
+    SET_CopyTexImage1D(disp, glCopyTexImage1D);
+    SET_CopyTexImage2D(disp, glCopyTexImage2D);
+    SET_CopyTexSubImage1D(disp, glCopyTexSubImage1D);
+    SET_CopyTexSubImage2D(disp, glCopyTexSubImage2D);
+    SET_CopyTexSubImage3D(disp, glCopyTexSubImage3D);
+    SET_CullFace(disp, glCullFace);
+    SET_DeleteLists(disp, glDeleteLists);
+    SET_DeleteTextures(disp, glDeleteTextures);
+    SET_DepthFunc(disp, glDepthFunc);
+    SET_DepthMask(disp, glDepthMask);
+    SET_DepthRange(disp, glDepthRange);
+    SET_Disable(disp, glDisable);
+    SET_DisableClientState(disp, glDisableClientState);
+    SET_DrawArrays(disp, glDrawArrays);
+    SET_DrawBuffer(disp, glDrawBuffer);
+    SET_DrawElements(disp, glDrawElements);
+    SET_DrawPixels(disp, glDrawPixels);
+    SET_DrawRangeElements(disp, glDrawRangeElements);
+    SET_EdgeFlag(disp, glEdgeFlag);
+    SET_EdgeFlagPointer(disp, glEdgeFlagPointer);
+    SET_EdgeFlagv(disp, glEdgeFlagv);
+    SET_Enable(disp, glEnable);
+    SET_EnableClientState(disp, glEnableClientState);
+    SET_End(disp, glEnd);
+    SET_EndList(disp, glEndList);
+    SET_EvalCoord1d(disp, glEvalCoord1d);
+    SET_EvalCoord1dv(disp, glEvalCoord1dv);
+    SET_EvalCoord1f(disp, glEvalCoord1f);
+    SET_EvalCoord1fv(disp, glEvalCoord1fv);
+    SET_EvalCoord2d(disp, glEvalCoord2d);
+    SET_EvalCoord2dv(disp, glEvalCoord2dv);
+    SET_EvalCoord2f(disp, glEvalCoord2f);
+    SET_EvalCoord2fv(disp, glEvalCoord2fv);
+    SET_EvalMesh1(disp, glEvalMesh1);
+    SET_EvalMesh2(disp, glEvalMesh2);
+    SET_EvalPoint1(disp, glEvalPoint1);
+    SET_EvalPoint2(disp, glEvalPoint2);
+    SET_FeedbackBuffer(disp, glFeedbackBuffer);
+    SET_Finish(disp, glFinish);
+    SET_Flush(disp, glFlush);
+    SET_Fogf(disp, glFogf);
+    SET_Fogfv(disp, glFogfv);
+    SET_Fogi(disp, glFogi);
+    SET_Fogiv(disp, glFogiv);
+    SET_FrontFace(disp, glFrontFace);
+    SET_Frustum(disp, glFrustum);
+    SET_GenLists(disp, glGenLists);
+    SET_GenTextures(disp, glGenTextures);
+    SET_GetBooleanv(disp, glGetBooleanv);
+    SET_GetClipPlane(disp, glGetClipPlane);
+    SET_GetColorTable(disp, glGetColorTable);
+    SET_GetColorTableParameterfv(disp, glGetColorTableParameterfv);
+    SET_GetColorTableParameteriv(disp, glGetColorTableParameteriv);
+    SET_GetConvolutionFilter(disp, glGetConvolutionFilter);
+    SET_GetConvolutionParameterfv(disp, glGetConvolutionParameterfv);
+    SET_GetConvolutionParameteriv(disp, glGetConvolutionParameteriv);
+    SET_GetDoublev(disp, glGetDoublev);
+    SET_GetError(disp, glGetError);
+    SET_GetFloatv(disp, glGetFloatv);
+    SET_GetHistogram(disp, glGetHistogram);
+    SET_GetHistogramParameterfv(disp, glGetHistogramParameterfv);
+    SET_GetHistogramParameteriv(disp, glGetHistogramParameteriv);
+    SET_GetIntegerv(disp, glGetIntegerv);
+    SET_GetLightfv(disp, glGetLightfv);
+    SET_GetLightiv(disp, glGetLightiv);
+    SET_GetMapdv(disp, glGetMapdv);
+    SET_GetMapfv(disp, glGetMapfv);
+    SET_GetMapiv(disp, glGetMapiv);
+    SET_GetMaterialfv(disp, glGetMaterialfv);
+    SET_GetMaterialiv(disp, glGetMaterialiv);
+    SET_GetMinmax(disp, glGetMinmax);
+    SET_GetMinmaxParameterfv(disp, glGetMinmaxParameterfv);
+    SET_GetMinmaxParameteriv(disp, glGetMinmaxParameteriv);
+    SET_GetPixelMapfv(disp, glGetPixelMapfv);
+    SET_GetPixelMapuiv(disp, glGetPixelMapuiv);
+    SET_GetPixelMapusv(disp, glGetPixelMapusv);
+    SET_GetPointerv(disp, glGetPointerv);
+    SET_GetPolygonStipple(disp, glGetPolygonStipple);
+    SET_GetSeparableFilter(disp, glGetSeparableFilter);
+    SET_GetString(disp, glGetString);
+    SET_GetTexEnvfv(disp, glGetTexEnvfv);
+    SET_GetTexEnviv(disp, glGetTexEnviv);
+    SET_GetTexGendv(disp, glGetTexGendv);
+    SET_GetTexGenfv(disp, glGetTexGenfv);
+    SET_GetTexGeniv(disp, glGetTexGeniv);
+    SET_GetTexImage(disp, glGetTexImage);
+    SET_GetTexLevelParameterfv(disp, glGetTexLevelParameterfv);
+    SET_GetTexLevelParameteriv(disp, glGetTexLevelParameteriv);
+    SET_GetTexParameterfv(disp, glGetTexParameterfv);
+    SET_GetTexParameteriv(disp, glGetTexParameteriv);
+    SET_Hint(disp, glHint);
+    SET_Histogram(disp, glHistogram);
+    SET_IndexMask(disp, glIndexMask);
+    SET_IndexPointer(disp, glIndexPointer);
+    SET_Indexd(disp, glIndexd);
+    SET_Indexdv(disp, glIndexdv);
+    SET_Indexf(disp, glIndexf);
+    SET_Indexfv(disp, glIndexfv);
+    SET_Indexi(disp, glIndexi);
+    SET_Indexiv(disp, glIndexiv);
+    SET_Indexs(disp, glIndexs);
+    SET_Indexsv(disp, glIndexsv);
+    SET_Indexub(disp, glIndexub);
+    SET_Indexubv(disp, glIndexubv);
+    SET_InitNames(disp, glInitNames);
+    SET_InterleavedArrays(disp, glInterleavedArrays);
+    SET_IsEnabled(disp, glIsEnabled);
+    SET_IsList(disp, glIsList);
+    SET_IsTexture(disp, glIsTexture);
+    SET_LightModelf(disp, glLightModelf);
+    SET_LightModelfv(disp, glLightModelfv);
+    SET_LightModeli(disp, glLightModeli);
+    SET_LightModeliv(disp, glLightModeliv);
+    SET_Lightf(disp, glLightf);
+    SET_Lightfv(disp, glLightfv);
+    SET_Lighti(disp, glLighti);
+    SET_Lightiv(disp, glLightiv);
+    SET_LineStipple(disp, glLineStipple);
+    SET_LineWidth(disp, glLineWidth);
+    SET_ListBase(disp, glListBase);
+    SET_LoadIdentity(disp, glLoadIdentity);
+    SET_LoadMatrixd(disp, glLoadMatrixd);
+    SET_LoadMatrixf(disp, glLoadMatrixf);
+    SET_LoadName(disp, glLoadName);
+    SET_LogicOp(disp, glLogicOp);
+    SET_Map1d(disp, glMap1d);
+    SET_Map1f(disp, glMap1f);
+    SET_Map2d(disp, glMap2d);
+    SET_Map2f(disp, glMap2f);
+    SET_MapGrid1d(disp, glMapGrid1d);
+    SET_MapGrid1f(disp, glMapGrid1f);
+    SET_MapGrid2d(disp, glMapGrid2d);
+    SET_MapGrid2f(disp, glMapGrid2f);
+    SET_Materialf(disp, glMaterialf);
+    SET_Materialfv(disp, glMaterialfv);
+    SET_Materiali(disp, glMateriali);
+    SET_Materialiv(disp, glMaterialiv);
+    SET_MatrixMode(disp, glMatrixMode);
+    SET_Minmax(disp, glMinmax);
+    SET_MultMatrixd(disp, glMultMatrixd);
+    SET_MultMatrixf(disp, glMultMatrixf);
+    SET_NewList(disp, glNewList);
+    SET_Normal3b(disp, glNormal3b);
+    SET_Normal3bv(disp, glNormal3bv);
+    SET_Normal3d(disp, glNormal3d);
+    SET_Normal3dv(disp, glNormal3dv);
+    SET_Normal3f(disp, glNormal3f);
+    SET_Normal3fv(disp, glNormal3fv);
+    SET_Normal3i(disp, glNormal3i);
+    SET_Normal3iv(disp, glNormal3iv);
+    SET_Normal3s(disp, glNormal3s);
+    SET_Normal3sv(disp, glNormal3sv);
+    SET_NormalPointer(disp, glNormalPointer);
+    SET_Ortho(disp, glOrtho);
+    SET_PassThrough(disp, glPassThrough);
+    SET_PixelMapfv(disp, glPixelMapfv);
+    SET_PixelMapuiv(disp, glPixelMapuiv);
+    SET_PixelMapusv(disp, glPixelMapusv);
+    SET_PixelStoref(disp, glPixelStoref);
+    SET_PixelStorei(disp, glPixelStorei);
+    SET_PixelTransferf(disp, glPixelTransferf);
+    SET_PixelTransferi(disp, glPixelTransferi);
+    SET_PixelZoom(disp, glPixelZoom);
+    SET_PointSize(disp, glPointSize);
+    SET_PolygonMode(disp, glPolygonMode);
+    SET_PolygonOffset(disp, glPolygonOffset);
+    SET_PolygonStipple(disp, glPolygonStipple);
+    SET_PopAttrib(disp, glPopAttrib);
+    SET_PopClientAttrib(disp, glPopClientAttrib);
+    SET_PopMatrix(disp, glPopMatrix);
+    SET_PopName(disp, glPopName);
+    SET_PrioritizeTextures(disp, glPrioritizeTextures);
+    SET_PushAttrib(disp, glPushAttrib);
+    SET_PushClientAttrib(disp, glPushClientAttrib);
+    SET_PushMatrix(disp, glPushMatrix);
+    SET_PushName(disp, glPushName);
+    SET_RasterPos2d(disp, glRasterPos2d);
+    SET_RasterPos2dv(disp, glRasterPos2dv);
+    SET_RasterPos2f(disp, glRasterPos2f);
+    SET_RasterPos2fv(disp, glRasterPos2fv);
+    SET_RasterPos2i(disp, glRasterPos2i);
+    SET_RasterPos2iv(disp, glRasterPos2iv);
+    SET_RasterPos2s(disp, glRasterPos2s);
+    SET_RasterPos2sv(disp, glRasterPos2sv);
+    SET_RasterPos3d(disp, glRasterPos3d);
+    SET_RasterPos3dv(disp, glRasterPos3dv);
+    SET_RasterPos3f(disp, glRasterPos3f);
+    SET_RasterPos3fv(disp, glRasterPos3fv);
+    SET_RasterPos3i(disp, glRasterPos3i);
+    SET_RasterPos3iv(disp, glRasterPos3iv);
+    SET_RasterPos3s(disp, glRasterPos3s);
+    SET_RasterPos3sv(disp, glRasterPos3sv);
+    SET_RasterPos4d(disp, glRasterPos4d);
+    SET_RasterPos4dv(disp, glRasterPos4dv);
+    SET_RasterPos4f(disp, glRasterPos4f);
+    SET_RasterPos4fv(disp, glRasterPos4fv);
+    SET_RasterPos4i(disp, glRasterPos4i);
+    SET_RasterPos4iv(disp, glRasterPos4iv);
+    SET_RasterPos4s(disp, glRasterPos4s);
+    SET_RasterPos4sv(disp, glRasterPos4sv);
+    SET_ReadBuffer(disp, glReadBuffer);
+    SET_ReadPixels(disp, glReadPixels);
+    SET_Rectd(disp, glRectd);
+    SET_Rectdv(disp, glRectdv);
+    SET_Rectf(disp, glRectf);
+    SET_Rectfv(disp, glRectfv);
+    SET_Recti(disp, glRecti);
+    SET_Rectiv(disp, glRectiv);
+    SET_Rects(disp, glRects);
+    SET_Rectsv(disp, glRectsv);
+    SET_RenderMode(disp, glRenderMode);
+    SET_ResetHistogram(disp, glResetHistogram);
+    SET_ResetMinmax(disp, glResetMinmax);
+    SET_Rotated(disp, glRotated);
+    SET_Rotatef(disp, glRotatef);
+    SET_Scaled(disp, glScaled);
+    SET_Scalef(disp, glScalef);
+    SET_Scissor(disp, glScissor);
+    SET_SelectBuffer(disp, glSelectBuffer);
+    SET_SeparableFilter2D(disp, glSeparableFilter2D);
+    SET_ShadeModel(disp, glShadeModel);
+    SET_StencilFunc(disp, glStencilFunc);
+    SET_StencilMask(disp, glStencilMask);
+    SET_StencilOp(disp, glStencilOp);
+    SET_TexCoord1d(disp, glTexCoord1d);
+    SET_TexCoord1dv(disp, glTexCoord1dv);
+    SET_TexCoord1f(disp, glTexCoord1f);
+    SET_TexCoord1fv(disp, glTexCoord1fv);
+    SET_TexCoord1i(disp, glTexCoord1i);
+    SET_TexCoord1iv(disp, glTexCoord1iv);
+    SET_TexCoord1s(disp, glTexCoord1s);
+    SET_TexCoord1sv(disp, glTexCoord1sv);
+    SET_TexCoord2d(disp, glTexCoord2d);
+    SET_TexCoord2dv(disp, glTexCoord2dv);
+    SET_TexCoord2f(disp, glTexCoord2f);
+    SET_TexCoord2fv(disp, glTexCoord2fv);
+    SET_TexCoord2i(disp, glTexCoord2i);
+    SET_TexCoord2iv(disp, glTexCoord2iv);
+    SET_TexCoord2s(disp, glTexCoord2s);
+    SET_TexCoord2sv(disp, glTexCoord2sv);
+    SET_TexCoord3d(disp, glTexCoord3d);
+    SET_TexCoord3dv(disp, glTexCoord3dv);
+    SET_TexCoord3f(disp, glTexCoord3f);
+    SET_TexCoord3fv(disp, glTexCoord3fv);
+    SET_TexCoord3i(disp, glTexCoord3i);
+    SET_TexCoord3iv(disp, glTexCoord3iv);
+    SET_TexCoord3s(disp, glTexCoord3s);
+    SET_TexCoord3sv(disp, glTexCoord3sv);
+    SET_TexCoord4d(disp, glTexCoord4d);
+    SET_TexCoord4dv(disp, glTexCoord4dv);
+    SET_TexCoord4f(disp, glTexCoord4f);
+    SET_TexCoord4fv(disp, glTexCoord4fv);
+    SET_TexCoord4i(disp, glTexCoord4i);
+    SET_TexCoord4iv(disp, glTexCoord4iv);
+    SET_TexCoord4s(disp, glTexCoord4s);
+    SET_TexCoord4sv(disp, glTexCoord4sv);
+    SET_TexCoordPointer(disp, glTexCoordPointer);
+    SET_TexEnvf(disp, glTexEnvf);
+    SET_TexEnvfv(disp, glTexEnvfv);
+    SET_TexEnvi(disp, glTexEnvi);
+    SET_TexEnviv(disp, glTexEnviv);
+    SET_TexGend(disp, glTexGend);
+    SET_TexGendv(disp, glTexGendv);
+    SET_TexGenf(disp, glTexGenf);
+    SET_TexGenfv(disp, glTexGenfv);
+    SET_TexGeni(disp, glTexGeni);
+    SET_TexGeniv(disp, glTexGeniv);
+    
+    /* Pointer Incompatability:
+     * internalformat is a GLenum according to /System/Library/Frameworks/OpenGL.framework/Headers/gl.h
+     * extern void glTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+     * extern void glTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+     * extern void glTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+     *
+     * and it's a GLint in glx/glapitable.h and according to the man page
+     * void ( * TexImage1D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels);
+     * void ( * TexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels);
+     * void ( * TexImage3D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels);
+     *
+     * <rdar://problem/6953344> gl.h contains incorrect prototypes for glTexImage[123]D
+     */
+    
+    SET_TexImage1D(disp, glTexImage1D);
+    SET_TexImage2D(disp, glTexImage2D);
+    SET_TexImage3D(disp, glTexImage3D);
+    SET_TexParameterf(disp, glTexParameterf);
+    SET_TexParameterfv(disp, glTexParameterfv);
+    SET_TexParameteri(disp, glTexParameteri);
+    SET_TexParameteriv(disp, glTexParameteriv);
+    SET_TexSubImage1D(disp, glTexSubImage1D);
+    SET_TexSubImage2D(disp, glTexSubImage2D);
+    SET_TexSubImage3D(disp, glTexSubImage3D);
+    SET_Translated(disp, glTranslated);
+    SET_Translatef(disp, glTranslatef);
+    SET_Vertex2d(disp, glVertex2d);
+    SET_Vertex2dv(disp, glVertex2dv);
+    SET_Vertex2f(disp, glVertex2f);
+    SET_Vertex2fv(disp, glVertex2fv);
+    SET_Vertex2i(disp, glVertex2i);
+    SET_Vertex2iv(disp, glVertex2iv);
+    SET_Vertex2s(disp, glVertex2s);
+    SET_Vertex2sv(disp, glVertex2sv);
+    SET_Vertex3d(disp, glVertex3d);
+    SET_Vertex3dv(disp, glVertex3dv);
+    SET_Vertex3f(disp, glVertex3f);
+    SET_Vertex3fv(disp, glVertex3fv);
+    SET_Vertex3i(disp, glVertex3i);
+    SET_Vertex3iv(disp, glVertex3iv);
+    SET_Vertex3s(disp, glVertex3s);
+    SET_Vertex3sv(disp, glVertex3sv);
+    SET_Vertex4d(disp, glVertex4d);
+    SET_Vertex4dv(disp, glVertex4dv);
+    SET_Vertex4f(disp, glVertex4f);
+    SET_Vertex4fv(disp, glVertex4fv);
+    SET_Vertex4i(disp, glVertex4i);
+    SET_Vertex4iv(disp, glVertex4iv);
+    SET_Vertex4s(disp, glVertex4s);
+    SET_Vertex4sv(disp, glVertex4sv);
+    SET_VertexPointer(disp, glVertexPointer);
+    SET_Viewport(disp, glViewport);
+
+#if GL_VERSION_2_0
+    SET_AttachShader(disp, glAttachShader);
+    SET_DeleteShader(disp, glDeleteShader);
+    SET_DetachShader(disp, glDetachShader);
+    SET_GetAttachedShaders(disp, glGetAttachedShaders);
+    SET_GetProgramInfoLog(disp, glGetProgramInfoLog);
+    SET_GetShaderInfoLog(disp, glGetShaderInfoLog);
+    SET_GetShaderiv(disp, glGetShaderiv);
+    SET_IsShader(disp, glIsShader);
+    SET_StencilFuncSeparate(disp, glStencilFuncSeparate);
+    SET_StencilMaskSeparate(disp, glStencilMaskSeparate);
+    SET_StencilOpSeparate(disp, glStencilOpSeparate);
+#endif
+
+#if GL_VERSION_2_1
+    SET_UniformMatrix2x3fv(disp, glUniformMatrix2x3fv);
+    SET_UniformMatrix2x4fv(disp, glUniformMatrix2x4fv);
+    SET_UniformMatrix3x2fv(disp, glUniformMatrix3x2fv);
+    SET_UniformMatrix3x4fv(disp, glUniformMatrix3x4fv);
+    SET_UniformMatrix4x2fv(disp, glUniformMatrix4x2fv);
+    SET_UniformMatrix4x3fv(disp, glUniformMatrix4x3fv);
+#endif
+
+#if GL_APPLE_vertex_array_object
+    SET_BindVertexArrayAPPLE(disp, glBindVertexArrayAPPLE);
+    SET_DeleteVertexArraysAPPLE(disp, glDeleteVertexArraysAPPLE);
+    SET_GenVertexArraysAPPLE(disp, glGenVertexArraysAPPLE);
+    SET_IsVertexArrayAPPLE(disp, glIsVertexArrayAPPLE);
+#endif
+
+#if GL_ARB_draw_buffers
+    SET_DrawBuffersARB(disp, glDrawBuffersARB);
+#endif
+
+#if GL_ARB_multisample
+    SET_SampleCoverageARB(disp, glSampleCoverageARB);
+#endif
+
+#if GL_ARB_multitexture
+    SET_ActiveTextureARB(disp, glActiveTextureARB);
+    SET_ClientActiveTextureARB(disp, glClientActiveTextureARB);
+    SET_MultiTexCoord1dARB(disp, glMultiTexCoord1dARB);
+    SET_MultiTexCoord1dvARB(disp, glMultiTexCoord1dvARB);
+    SET_MultiTexCoord1fARB(disp, glMultiTexCoord1fARB);
+    SET_MultiTexCoord1fvARB(disp, glMultiTexCoord1fvARB);
+    SET_MultiTexCoord1iARB(disp, glMultiTexCoord1iARB);
+    SET_MultiTexCoord1ivARB(disp, glMultiTexCoord1ivARB);
+    SET_MultiTexCoord1sARB(disp, glMultiTexCoord1sARB);
+    SET_MultiTexCoord1svARB(disp, glMultiTexCoord1svARB);
+    SET_MultiTexCoord2dARB(disp, glMultiTexCoord2dARB);
+    SET_MultiTexCoord2dvARB(disp, glMultiTexCoord2dvARB);
+    SET_MultiTexCoord2fARB(disp, glMultiTexCoord2fARB);
+    SET_MultiTexCoord2fvARB(disp, glMultiTexCoord2fvARB);
+    SET_MultiTexCoord2iARB(disp, glMultiTexCoord2iARB);
+    SET_MultiTexCoord2ivARB(disp, glMultiTexCoord2ivARB);
+    SET_MultiTexCoord2sARB(disp, glMultiTexCoord2sARB);
+    SET_MultiTexCoord2svARB(disp, glMultiTexCoord2svARB);
+    SET_MultiTexCoord3dARB(disp, glMultiTexCoord3dARB);
+    SET_MultiTexCoord3dvARB(disp, glMultiTexCoord3dvARB);
+    SET_MultiTexCoord3fARB(disp, glMultiTexCoord3fARB);
+    SET_MultiTexCoord3fvARB(disp, glMultiTexCoord3fvARB);
+    SET_MultiTexCoord3iARB(disp, glMultiTexCoord3iARB);
+    SET_MultiTexCoord3ivARB(disp, glMultiTexCoord3ivARB);
+    SET_MultiTexCoord3sARB(disp, glMultiTexCoord3sARB);
+    SET_MultiTexCoord3svARB(disp, glMultiTexCoord3svARB);
+    SET_MultiTexCoord4dARB(disp, glMultiTexCoord4dARB);
+    SET_MultiTexCoord4dvARB(disp, glMultiTexCoord4dvARB);
+    SET_MultiTexCoord4fARB(disp, glMultiTexCoord4fARB);
+    SET_MultiTexCoord4fvARB(disp, glMultiTexCoord4fvARB);
+    SET_MultiTexCoord4iARB(disp, glMultiTexCoord4iARB);
+    SET_MultiTexCoord4ivARB(disp, glMultiTexCoord4ivARB);
+    SET_MultiTexCoord4sARB(disp, glMultiTexCoord4sARB);
+    SET_MultiTexCoord4svARB(disp, glMultiTexCoord4svARB);
+#endif
+
+#if GL_ARB_occlusion_query
+    SET_BeginQueryARB(disp, glBeginQueryARB);
+    SET_DeleteQueriesARB(disp, glDeleteQueriesARB);
+    SET_EndQueryARB(disp, glEndQueryARB);
+    SET_GenQueriesARB(disp, glGenQueriesARB);
+    SET_GetQueryObjectivARB(disp, glGetQueryObjectivARB);
+    SET_GetQueryObjectuivARB(disp, glGetQueryObjectuivARB);
+    SET_GetQueryivARB(disp, glGetQueryivARB);
+    SET_IsQueryARB(disp, glIsQueryARB);
+#endif
+
+#if GL_ARB_shader_objects
+    SET_AttachObjectARB(disp, glAttachObjectARB);
+    SET_CompileShaderARB(disp, glCompileShaderARB);
+    SET_DeleteObjectARB(disp, glDeleteObjectARB);
+    SET_GetHandleARB(disp, glGetHandleARB);
+    SET_DetachObjectARB(disp, glDetachObjectARB);
+    SET_CreateProgramObjectARB(disp, glCreateProgramObjectARB);
+    SET_CreateShaderObjectARB(disp, glCreateShaderObjectARB);
+    SET_GetInfoLogARB(disp, glGetInfoLogARB);
+    SET_GetActiveUniformARB(disp, glGetActiveUniformARB);
+    SET_GetAttachedObjectsARB(disp, glGetAttachedObjectsARB);
+    SET_GetObjectParameterfvARB(disp, glGetObjectParameterfvARB);
+    SET_GetObjectParameterivARB(disp, glGetObjectParameterivARB);
+    SET_GetShaderSourceARB(disp, glGetShaderSourceARB);
+    SET_GetUniformLocationARB(disp, glGetUniformLocationARB);
+    SET_GetUniformfvARB(disp, glGetUniformfvARB);
+    SET_GetUniformivARB(disp, glGetUniformivARB);
+    SET_LinkProgramARB(disp, glLinkProgramARB);
+    SET_ShaderSourceARB(disp, glShaderSourceARB);
+    SET_Uniform1fARB(disp, glUniform1fARB);
+    SET_Uniform1fvARB(disp, glUniform1fvARB);
+    SET_Uniform1iARB(disp, glUniform1iARB);
+    SET_Uniform1ivARB(disp, glUniform1ivARB);
+    SET_Uniform2fARB(disp, glUniform2fARB);
+    SET_Uniform2fvARB(disp, glUniform2fvARB);
+    SET_Uniform2iARB(disp, glUniform2iARB);
+    SET_Uniform2ivARB(disp, glUniform2ivARB);
+    SET_Uniform3fARB(disp, glUniform3fARB);
+    SET_Uniform3fvARB(disp, glUniform3fvARB);
+    SET_Uniform3iARB(disp, glUniform3iARB);
+    SET_Uniform3ivARB(disp, glUniform3ivARB);
+    SET_Uniform4fARB(disp, glUniform4fARB);
+    SET_Uniform4fvARB(disp, glUniform4fvARB);
+    SET_Uniform4iARB(disp, glUniform4iARB);
+    SET_Uniform4ivARB(disp, glUniform4ivARB);
+    SET_UniformMatrix2fvARB(disp, glUniformMatrix2fvARB);
+    SET_UniformMatrix3fvARB(disp, glUniformMatrix3fvARB);
+    SET_UniformMatrix4fvARB(disp, glUniformMatrix4fvARB);
+    SET_UseProgramObjectARB(disp, glUseProgramObjectARB);
+    SET_ValidateProgramARB(disp, glValidateProgramARB);
+#endif
+
+#if GL_ARB_texture_compression
+    SET_CompressedTexImage1DARB(disp, glCompressedTexImage1DARB);
+    SET_CompressedTexImage2DARB(disp, glCompressedTexImage2DARB);
+    SET_CompressedTexImage3DARB(disp, glCompressedTexImage3DARB);
+    SET_CompressedTexSubImage1DARB(disp, glCompressedTexSubImage1DARB);
+    SET_CompressedTexSubImage2DARB(disp, glCompressedTexSubImage2DARB);
+    SET_CompressedTexSubImage3DARB(disp, glCompressedTexSubImage3DARB);
+    SET_GetCompressedTexImageARB(disp, glGetCompressedTexImageARB);
+#endif
+
+#if GL_ARB_transpose_matrix
+    SET_LoadTransposeMatrixdARB(disp, glLoadTransposeMatrixdARB);
+    SET_LoadTransposeMatrixfARB(disp, glLoadTransposeMatrixfARB);
+    SET_MultTransposeMatrixdARB(disp, glMultTransposeMatrixdARB);
+    SET_MultTransposeMatrixfARB(disp, glMultTransposeMatrixfARB);
+#endif
+
+#if GL_ARB_vertex_buffer_object
+    SET_BindBufferARB(disp, glBindBufferARB);
+    SET_BufferDataARB(disp, glBufferDataARB);
+    SET_BufferSubDataARB(disp, glBufferSubDataARB);
+    SET_DeleteBuffersARB(disp, glDeleteBuffersARB);
+    SET_GenBuffersARB(disp, glGenBuffersARB);
+    SET_GetBufferParameterivARB(disp, glGetBufferParameterivARB);
+    SET_GetBufferPointervARB(disp, glGetBufferPointervARB);
+    SET_GetBufferSubDataARB(disp, glGetBufferSubDataARB);
+    SET_IsBufferARB(disp, glIsBufferARB);
+    SET_MapBufferARB(disp, glMapBufferARB);
+    SET_UnmapBufferARB(disp, glUnmapBufferARB);
+#endif
+
+#if GL_ARB_vertex_program
+    SET_DisableVertexAttribArrayARB(disp, glDisableVertexAttribArrayARB);
+    SET_EnableVertexAttribArrayARB(disp, glEnableVertexAttribArrayARB);
+    SET_GetProgramEnvParameterdvARB(disp, glGetProgramEnvParameterdvARB);
+    SET_GetProgramEnvParameterfvARB(disp, glGetProgramEnvParameterfvARB);
+    SET_GetProgramLocalParameterdvARB(disp, glGetProgramLocalParameterdvARB);
+    SET_GetProgramLocalParameterfvARB(disp, glGetProgramLocalParameterfvARB);
+    SET_GetProgramStringARB(disp, glGetProgramStringARB);
+    SET_GetProgramivARB(disp, glGetProgramivARB);
+    SET_GetVertexAttribdvARB(disp, glGetVertexAttribdvARB);
+    SET_GetVertexAttribfvARB(disp, glGetVertexAttribfvARB);
+    SET_GetVertexAttribivARB(disp, glGetVertexAttribivARB);
+    SET_ProgramEnvParameter4dARB(disp, glProgramEnvParameter4dARB);
+    SET_ProgramEnvParameter4dvARB(disp, glProgramEnvParameter4dvARB);
+    SET_ProgramEnvParameter4fARB(disp, glProgramEnvParameter4fARB);
+    SET_ProgramEnvParameter4fvARB(disp, glProgramEnvParameter4fvARB);
+    SET_ProgramLocalParameter4dARB(disp, glProgramLocalParameter4dARB);
+    SET_ProgramLocalParameter4dvARB(disp, glProgramLocalParameter4dvARB);
+    SET_ProgramLocalParameter4fARB(disp, glProgramLocalParameter4fARB);
+    SET_ProgramLocalParameter4fvARB(disp, glProgramLocalParameter4fvARB);
+    SET_ProgramStringARB(disp, glProgramStringARB);
+    SET_VertexAttrib1dARB(disp, glVertexAttrib1dARB);
+    SET_VertexAttrib1dvARB(disp, glVertexAttrib1dvARB);
+    SET_VertexAttrib1fARB(disp, glVertexAttrib1fARB);
+    SET_VertexAttrib1fvARB(disp, glVertexAttrib1fvARB);
+    SET_VertexAttrib1sARB(disp, glVertexAttrib1sARB);
+    SET_VertexAttrib1svARB(disp, glVertexAttrib1svARB);
+    SET_VertexAttrib2dARB(disp, glVertexAttrib2dARB);
+    SET_VertexAttrib2dvARB(disp, glVertexAttrib2dvARB);
+    SET_VertexAttrib2fARB(disp, glVertexAttrib2fARB);
+    SET_VertexAttrib2fvARB(disp, glVertexAttrib2fvARB);
+    SET_VertexAttrib2sARB(disp, glVertexAttrib2sARB);
+    SET_VertexAttrib2svARB(disp, glVertexAttrib2svARB);
+    SET_VertexAttrib3dARB(disp, glVertexAttrib3dARB);
+    SET_VertexAttrib3dvARB(disp, glVertexAttrib3dvARB);
+    SET_VertexAttrib3fARB(disp, glVertexAttrib3fARB);
+    SET_VertexAttrib3fvARB(disp, glVertexAttrib3fvARB);
+    SET_VertexAttrib3sARB(disp, glVertexAttrib3sARB);
+    SET_VertexAttrib3svARB(disp, glVertexAttrib3svARB);
+    SET_VertexAttrib4NbvARB(disp, glVertexAttrib4NbvARB);
+    SET_VertexAttrib4NivARB(disp, glVertexAttrib4NivARB);
+    SET_VertexAttrib4NsvARB(disp, glVertexAttrib4NsvARB);
+    SET_VertexAttrib4NubARB(disp, glVertexAttrib4NubARB);
+    SET_VertexAttrib4NubvARB(disp, glVertexAttrib4NubvARB);
+    SET_VertexAttrib4NuivARB(disp, glVertexAttrib4NuivARB);
+    SET_VertexAttrib4NusvARB(disp, glVertexAttrib4NusvARB);
+    SET_VertexAttrib4bvARB(disp, glVertexAttrib4bvARB);
+    SET_VertexAttrib4dARB(disp, glVertexAttrib4dARB);
+    SET_VertexAttrib4dvARB(disp, glVertexAttrib4dvARB);
+    SET_VertexAttrib4fARB(disp, glVertexAttrib4fARB);
+    SET_VertexAttrib4fvARB(disp, glVertexAttrib4fvARB);
+    SET_VertexAttrib4ivARB(disp, glVertexAttrib4ivARB);
+    SET_VertexAttrib4sARB(disp, glVertexAttrib4sARB);
+    SET_VertexAttrib4svARB(disp, glVertexAttrib4svARB);
+    SET_VertexAttrib4ubvARB(disp, glVertexAttrib4ubvARB);
+    SET_VertexAttrib4uivARB(disp, glVertexAttrib4uivARB);
+    SET_VertexAttrib4usvARB(disp, glVertexAttrib4usvARB);
+    SET_VertexAttribPointerARB(disp, glVertexAttribPointerARB);
+#endif
+
+#if GL_ARB_vertex_shader
+    SET_BindAttribLocationARB(disp, glBindAttribLocationARB);
+    SET_GetActiveAttribARB(disp, glGetActiveAttribARB);
+    SET_GetAttribLocationARB(disp, glGetAttribLocationARB);
+#endif
+
+#if GL_ARB_window_pos
+    SET_WindowPos2dMESA(disp, glWindowPos2dARB);
+    SET_WindowPos2dvMESA(disp, glWindowPos2dvARB);
+    SET_WindowPos2fMESA(disp, glWindowPos2fARB);
+    SET_WindowPos2fvMESA(disp, glWindowPos2fvARB);
+    SET_WindowPos2iMESA(disp, glWindowPos2iARB);
+    SET_WindowPos2ivMESA(disp, glWindowPos2ivARB);
+    SET_WindowPos2sMESA(disp, glWindowPos2sARB);
+    SET_WindowPos2svMESA(disp, glWindowPos2svARB);
+    SET_WindowPos3dMESA(disp, glWindowPos3dARB);
+    SET_WindowPos3dvMESA(disp, glWindowPos3dvARB);
+    SET_WindowPos3fMESA(disp, glWindowPos3fARB);
+    SET_WindowPos3fvMESA(disp, glWindowPos3fvARB);
+    SET_WindowPos3iMESA(disp, glWindowPos3iARB);
+    SET_WindowPos3ivMESA(disp, glWindowPos3ivARB);
+    SET_WindowPos3sMESA(disp, glWindowPos3sARB);
+    SET_WindowPos3svMESA(disp, glWindowPos3svARB);
+#endif
+
+#if GL_ATI_fragment_shader
+    SET_AlphaFragmentOp1ATI(disp, glAlphaFragmentOp1ATI);
+    SET_AlphaFragmentOp2ATI(disp, glAlphaFragmentOp2ATI);
+    SET_AlphaFragmentOp3ATI(disp, glAlphaFragmentOp3ATI);
+    SET_BeginFragmentShaderATI(disp, glBeginFragmentShaderATI);
+    SET_BindFragmentShaderATI(disp, glBindFragmentShaderATI);
+    SET_ColorFragmentOp1ATI(disp, glColorFragmentOp1ATI);
+    SET_ColorFragmentOp2ATI(disp, glColorFragmentOp2ATI);
+    SET_ColorFragmentOp3ATI(disp, glColorFragmentOp3ATI);
+    SET_DeleteFragmentShaderATI(disp, glDeleteFragmentShaderATI);
+    SET_EndFragmentShaderATI(disp, glEndFragmentShaderATI);
+    SET_GenFragmentShadersATI(disp, glGenFragmentShadersATI);
+    SET_PassTexCoordATI(disp, glPassTexCoordATI);
+    SET_SampleMapATI(disp, glSampleMapATI);
+    SET_SetFragmentShaderConstantATI(disp, glSetFragmentShaderConstantATI);
+#elif GL_EXT_fragment_shader
+    SET_AlphaFragmentOp1ATI(disp, glAlphaFragmentOp1EXT);
+    SET_AlphaFragmentOp2ATI(disp, glAlphaFragmentOp2EXT);
+    SET_AlphaFragmentOp3ATI(disp, glAlphaFragmentOp3EXT);
+    SET_BeginFragmentShaderATI(disp, glBeginFragmentShaderEXT);
+    SET_BindFragmentShaderATI(disp, glBindFragmentShaderEXT);
+    SET_ColorFragmentOp1ATI(disp, glColorFragmentOp1EXT);
+    SET_ColorFragmentOp2ATI(disp, glColorFragmentOp2EXT);
+    SET_ColorFragmentOp3ATI(disp, glColorFragmentOp3EXT);
+    SET_DeleteFragmentShaderATI(disp, glDeleteFragmentShaderEXT);
+    SET_EndFragmentShaderATI(disp, glEndFragmentShaderEXT);
+    SET_GenFragmentShadersATI(disp, glGenFragmentShadersEXT);
+    SET_PassTexCoordATI(disp, glPassTexCoordEXT);
+    SET_SampleMapATI(disp, glSampleMapEXT);
+    SET_SetFragmentShaderConstantATI(disp, glSetFragmentShaderConstantEXT);
+#endif
+
+#if GL_ATI_separate_stencil
+    SET_StencilFuncSeparateATI(disp, glStencilFuncSeparateATI);
+#endif
+
+#if GL_EXT_blend_equation_separate
+    SET_BlendEquationSeparateEXT(disp, glBlendEquationSeparateEXT);
+#endif
+
+#if GL_EXT_blend_func_separate
+    SET_BlendFuncSeparateEXT(disp, glBlendFuncSeparateEXT);
+#endif
+
+#if GL_EXT_depth_bounds_test
+    SET_DepthBoundsEXT(disp, glDepthBoundsEXT);
+#endif
+
+#if GL_EXT_compiled_vertex_array
+    SET_LockArraysEXT(disp, glLockArraysEXT);
+    SET_UnlockArraysEXT(disp, glUnlockArraysEXT);
 #endif
-  SET_BufferDataARB(disp, glBufferDataARB);
-  SET_BufferSubDataARB(disp, glBufferSubDataARB);
-  SET_CallList(disp, glCallList);
-  SET_CallLists(disp, glCallLists);
-  SET_CheckFramebufferStatusEXT(disp, glCheckFramebufferStatusEXT);
-  SET_Clear(disp, glClear);
-  SET_ClearAccum(disp, glClearAccum);
-  SET_ClearColor(disp, glClearColor);
-  SET_ClearDepth(disp, glClearDepth);
-  SET_ClearIndex(disp, glClearIndex);
-  SET_ClearStencil(disp, glClearStencil);
-  SET_ClientActiveTextureARB(disp, glClientActiveTextureARB);
-  SET_ClipPlane(disp, glClipPlane);
-  SET_Color3b(disp, glColor3b);
-  SET_Color3bv(disp, glColor3bv);
-  SET_Color3d(disp, glColor3d);
-  SET_Color3dv(disp, glColor3dv);
-  SET_Color3f(disp, glColor3f);
-  SET_Color3fv(disp, glColor3fv);
-  SET_Color3i(disp, glColor3i);
-  SET_Color3iv(disp, glColor3iv);
-  SET_Color3s(disp, glColor3s);
-  SET_Color3sv(disp, glColor3sv);
-  SET_Color3ub(disp, glColor3ub);
-  SET_Color3ubv(disp, glColor3ubv);
-  SET_Color3ui(disp, glColor3ui);
-  SET_Color3uiv(disp, glColor3uiv);
-  SET_Color3us(disp, glColor3us);
-  SET_Color3usv(disp, glColor3usv);
-  SET_Color4b(disp, glColor4b);
-  SET_Color4bv(disp, glColor4bv);
-  SET_Color4d(disp, glColor4d);
-  SET_Color4dv(disp, glColor4dv);
-  SET_Color4f(disp, glColor4f);
-  SET_Color4fv(disp, glColor4fv);
-  SET_Color4i(disp, glColor4i);
-  SET_Color4iv(disp, glColor4iv);
-  SET_Color4s(disp, glColor4s);
-  SET_Color4sv(disp, glColor4sv);
-  SET_Color4ub(disp, glColor4ub);
-  SET_Color4ubv(disp, glColor4ubv);
-  SET_Color4ui(disp, glColor4ui);
-  SET_Color4uiv(disp, glColor4uiv);
-  SET_Color4us(disp, glColor4us);
-  SET_Color4usv(disp, glColor4usv);
-//SET_ColorFragmentOp1ATI(disp, glColorFragmentOp1EXT);    // <-- EXT -> ATI
-//SET_ColorFragmentOp2ATI(disp, glColorFragmentOp2EXT);
-//SET_ColorFragmentOp3ATI(disp, glColorFragmentOp3EXT);
-  SET_ColorMask(disp, glColorMask);
-  SET_ColorMaterial(disp, glColorMaterial);
-  SET_ColorPointer(disp, glColorPointer);
-//SET_ColorPointerEXT(disp, glColorPointerEXT);
-  SET_ColorSubTable(disp, glColorSubTable);
-  SET_ColorTable(disp, glColorTable);
-  SET_ColorTableParameterfv(disp, glColorTableParameterfv);
-  SET_ColorTableParameteriv(disp, glColorTableParameteriv);
-
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
-  SET_CombinerInputNV(disp, glCombinerInputNV);
-  SET_CombinerOutputNV(disp, glCombinerOutputNV);
-  SET_CombinerParameterfNV(disp, glCombinerParameterfNV);
-  SET_CombinerParameterfvNV(disp, glCombinerParameterfvNV);
-  SET_CombinerParameteriNV(disp, glCombinerParameteriNV);
-  SET_CombinerParameterivNV(disp, glCombinerParameterivNV);
+
+#if GL_EXT_cull_vertex
+    SET_CullParameterdvEXT(disp, glCullParameterdvEXT);
+    SET_CullParameterfvEXT(disp, glCullParameterfvEXT);
+#endif
+
+#if GL_EXT_fog_coord
+    SET_FogCoordPointerEXT(disp, glFogCoordPointerEXT);
+    SET_FogCoorddEXT(disp, glFogCoorddEXT);
+    SET_FogCoorddvEXT(disp, glFogCoorddvEXT);
+    SET_FogCoordfEXT(disp, glFogCoordfEXT);
+    SET_FogCoordfvEXT(disp, glFogCoordfvEXT);
+#endif
+
+#if GL_EXT_framebuffer_blit
+    SET_BlitFramebufferEXT(disp, glBlitFramebufferEXT);
+#endif
+
+#if GL_EXT_framebuffer_object
+    SET_BindFramebufferEXT(disp, glBindFramebufferEXT);
+    SET_BindRenderbufferEXT(disp, glBindRenderbufferEXT);
+    SET_CheckFramebufferStatusEXT(disp, glCheckFramebufferStatusEXT);
+    SET_DeleteFramebuffersEXT(disp, glDeleteFramebuffersEXT);
+    SET_DeleteRenderbuffersEXT(disp, glDeleteRenderbuffersEXT);
+    SET_FramebufferRenderbufferEXT(disp, glFramebufferRenderbufferEXT);
+    SET_FramebufferTexture1DEXT(disp, glFramebufferTexture1DEXT);
+    SET_FramebufferTexture2DEXT(disp, glFramebufferTexture2DEXT);
+    SET_FramebufferTexture3DEXT(disp, glFramebufferTexture3DEXT);
+    SET_GenerateMipmapEXT(disp, glGenerateMipmapEXT);
+    SET_GenFramebuffersEXT(disp, glGenFramebuffersEXT);
+    SET_GenRenderbuffersEXT(disp, glGenRenderbuffersEXT);
+    SET_GetFramebufferAttachmentParameterivEXT(disp, glGetFramebufferAttachmentParameterivEXT);
+    SET_GetRenderbufferParameterivEXT(disp, glGetRenderbufferParameterivEXT);
+    SET_IsFramebufferEXT(disp, glIsFramebufferEXT);
+    SET_IsRenderbufferEXT(disp, glIsRenderbufferEXT);
+    SET_RenderbufferStorageEXT(disp, glRenderbufferStorageEXT);
+#endif
+
+#if GL_EXT_gpu_program_parameters
+    SET_ProgramEnvParameters4fvEXT(disp, glProgramEnvParameters4fvEXT);
+    SET_ProgramLocalParameters4fvEXT(disp, glProgramLocalParameters4fvEXT);
 #endif
-  SET_CompileShaderARB(disp, glCompileShaderARB);
-  SET_CompressedTexImage1DARB(disp, glCompressedTexImage1DARB);
-  SET_CompressedTexImage2DARB(disp, glCompressedTexImage2DARB);
-  SET_CompressedTexImage3DARB(disp, glCompressedTexImage3DARB);
-  SET_CompressedTexSubImage1DARB(disp, glCompressedTexSubImage1DARB);
-  SET_CompressedTexSubImage2DARB(disp, glCompressedTexSubImage2DARB);
-  SET_CompressedTexSubImage3DARB(disp, glCompressedTexSubImage3DARB);
-  SET_ConvolutionFilter1D(disp, glConvolutionFilter1D);
-  SET_ConvolutionFilter2D(disp, glConvolutionFilter2D);
-  SET_ConvolutionParameterf(disp, glConvolutionParameterf);
-  SET_ConvolutionParameterfv(disp, glConvolutionParameterfv);
-  SET_ConvolutionParameteri(disp, glConvolutionParameteri);
-  SET_ConvolutionParameteriv(disp, glConvolutionParameteriv);
-  SET_CopyColorSubTable(disp, glCopyColorSubTable);
-  SET_CopyColorTable(disp, glCopyColorTable);
-  SET_CopyConvolutionFilter1D(disp, glCopyConvolutionFilter1D);
-  SET_CopyConvolutionFilter2D(disp, glCopyConvolutionFilter2D);
-  SET_CopyPixels(disp, glCopyPixels);
-  SET_CopyTexImage1D(disp, glCopyTexImage1D);
-  SET_CopyTexImage2D(disp, glCopyTexImage2D);
-  SET_CopyTexSubImage1D(disp, glCopyTexSubImage1D);
-  SET_CopyTexSubImage2D(disp, glCopyTexSubImage2D);
-  SET_CopyTexSubImage3D(disp, glCopyTexSubImage3D);
-  SET_CreateProgramObjectARB(disp, glCreateProgramObjectARB);
-  SET_CreateShaderObjectARB(disp, glCreateShaderObjectARB);
-  SET_CullFace(disp, glCullFace);
-//SET_CullParameterdvEXT(disp, glCullParameterdvEXT);
-//SET_CullParameterfvEXT(disp, glCullParameterfvEXT);
-  SET_DeleteBuffersARB(disp, glDeleteBuffersARB);
-  SET_DeleteFencesNV(disp, glDeleteFencesAPPLE);
-//SET_DeleteFragmentShaderATI(disp, glDeleteFragmentShaderEXT);      // <-- EXT -> ATI
-  SET_DeleteFramebuffersEXT(disp, glDeleteFramebuffersEXT);
-  SET_DeleteLists(disp, glDeleteLists);
-  SET_DeleteObjectARB(disp, glDeleteObjectARB);
-//SET_DeleteProgramsNV(disp, glDeleteProgramsNV);
-  SET_DeleteQueriesARB(disp, glDeleteQueriesARB);
-  SET_DeleteRenderbuffersEXT(disp, glDeleteRenderbuffersEXT);
-  SET_DeleteTextures(disp, glDeleteTextures);
-  SET_DepthBoundsEXT(disp, glDepthBoundsEXT);
-  SET_DepthFunc(disp, glDepthFunc);
-  SET_DepthMask(disp, glDepthMask);
-  SET_DepthRange(disp, glDepthRange);
-  SET_DetachObjectARB(disp, glDetachObjectARB);
-  SET_Disable(disp, glDisable);
-  SET_DisableClientState(disp, glDisableClientState);
-  SET_DisableVertexAttribArrayARB(disp, glDisableVertexAttribArrayARB);
-  SET_DrawArrays(disp, glDrawArrays);
-  SET_DrawBuffer(disp, glDrawBuffer);
-  SET_DrawBuffersARB(disp, glDrawBuffersARB);
-  SET_DrawElements(disp, glDrawElements);
-  SET_DrawPixels(disp, glDrawPixels);
-  SET_DrawRangeElements(disp, glDrawRangeElements);
-  SET_EdgeFlag(disp, glEdgeFlag);
-  SET_EdgeFlagPointer(disp, glEdgeFlagPointer);
-//SET_EdgeFlagPointerEXT(disp, glEdgeFlagPointerEXT);
-  SET_EdgeFlagv(disp, glEdgeFlagv);
-  SET_Enable(disp, glEnable);
-  SET_EnableClientState(disp, glEnableClientState);
-  SET_EnableVertexAttribArrayARB(disp, glEnableVertexAttribArrayARB);
-  SET_End(disp, glEnd);
-//SET_EndFragmentShaderATI(disp, glEndFragmentShaderEXT);        // <-- EXT -> ATI
-  SET_EndList(disp, glEndList);
-  SET_EndQueryARB(disp, glEndQueryARB);
-  SET_EvalCoord1d(disp, glEvalCoord1d);
-  SET_EvalCoord1dv(disp, glEvalCoord1dv);
-  SET_EvalCoord1f(disp, glEvalCoord1f);
-  SET_EvalCoord1fv(disp, glEvalCoord1fv);
-  SET_EvalCoord2d(disp, glEvalCoord2d);
-  SET_EvalCoord2dv(disp, glEvalCoord2dv);
-  SET_EvalCoord2f(disp, glEvalCoord2f);
-  SET_EvalCoord2fv(disp, glEvalCoord2fv);
-  SET_EvalMesh1(disp, glEvalMesh1);
-  SET_EvalMesh2(disp, glEvalMesh2);
-  SET_EvalPoint1(disp, glEvalPoint1);
-  SET_EvalPoint2(disp, glEvalPoint2);
-//SET_ExecuteProgramNV(disp, glExecuteProgramNV);
-  SET_FeedbackBuffer(disp, glFeedbackBuffer);
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
-  SET_FinalCombinerInputNV(disp, glFinalCombinerInputNV);
+
+#if GL_EXT_multi_draw_arrays
+    /* Pointer Incompatability:
+     * This warning can be safely ignored.  OpenGL.framework adds const to the
+     * two pointers.
+     *
+     * extern void glMultiDrawArraysEXT (GLenum, const GLint *, const GLsizei *, GLsizei);
+     *
+     * void ( * MultiDrawArraysEXT)(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount);
+     */
+    SET_MultiDrawArraysEXT(disp, glMultiDrawArraysEXT);
+    SET_MultiDrawElementsEXT(disp, glMultiDrawElementsEXT);
 #endif
-  SET_Finish(disp, glFinish);
-  SET_FinishFenceNV(disp, glFinishFenceAPPLE);       // <-- APPLE -> NV
-  SET_Flush(disp, glFlush);
-//SET_FlushVertexArrayRangeNV(disp, glFlushVertexArrayRangeNV);
-  SET_FogCoordPointerEXT(disp, glFogCoordPointerEXT);
-  SET_FogCoorddEXT(disp, glFogCoorddEXT);
-  SET_FogCoorddvEXT(disp, glFogCoorddvEXT);
-  SET_FogCoordfEXT(disp, glFogCoordfEXT);
-  SET_FogCoordfvEXT(disp, glFogCoordfvEXT);
-  SET_Fogf(disp, glFogf);
-  SET_Fogfv(disp, glFogfv);
-  SET_Fogi(disp, glFogi);
-  SET_Fogiv(disp, glFogiv);
-  SET_FramebufferRenderbufferEXT(disp, glFramebufferRenderbufferEXT);
-  SET_FramebufferTexture1DEXT(disp, glFramebufferTexture1DEXT);
-  SET_FramebufferTexture2DEXT(disp, glFramebufferTexture2DEXT);
-  SET_FramebufferTexture3DEXT(disp, glFramebufferTexture3DEXT);
-  SET_FrontFace(disp, glFrontFace);
-  SET_Frustum(disp, glFrustum);
-  SET_GenBuffersARB(disp, glGenBuffersARB);
-  SET_GenFencesNV(disp, glGenFencesAPPLE);            // <-- APPLE -> NV
-//SET_GenFragmentShadersATI(disp, glGenFragmentShadersEXT);         // <-- EXT -> ATI
-  SET_GenFramebuffersEXT(disp, glGenFramebuffersEXT);
-  SET_GenLists(disp, glGenLists);
-//SET_GenProgramsNV(disp, glGenProgramsNV);
-  SET_GenQueriesARB(disp, glGenQueriesARB);
-  SET_GenRenderbuffersEXT(disp, glGenRenderbuffersEXT);
-  SET_GenTextures(disp, glGenTextures);
-  SET_GenerateMipmapEXT(disp, glGenerateMipmapEXT);
-  SET_GetActiveAttribARB(disp, glGetActiveAttribARB);
-  SET_GetActiveUniformARB(disp, glGetActiveUniformARB);
-  SET_GetAttachedObjectsARB(disp, glGetAttachedObjectsARB);
-  SET_GetAttribLocationARB(disp, glGetAttribLocationARB);
-  SET_GetBooleanv(disp, glGetBooleanv);
-  SET_GetBufferParameterivARB(disp, glGetBufferParameterivARB);
-  SET_GetBufferPointervARB(disp, glGetBufferPointervARB);
-  SET_GetBufferSubDataARB(disp, glGetBufferSubDataARB);
-  SET_GetClipPlane(disp, glGetClipPlane);
-  SET_GetColorTable(disp, glGetColorTable);
-  SET_GetColorTableParameterfv(disp, glGetColorTableParameterfv);
-  SET_GetColorTableParameteriv(disp, glGetColorTableParameteriv);
-#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
-  SET_GetCombinerInputParameterfvNV(disp, glGetCombinerInputParameterfvNV);
-  SET_GetCombinerInputParameterivNV(disp, glGetCombinerInputParameterivNV);
-  SET_GetCombinerOutputParameterfvNV(disp, glGetCombinerOutputParameterfvNV);
-  SET_GetCombinerOutputParameterivNV(disp, glGetCombinerOutputParameterivNV);
+
+#if GL_EXT_point_parameters
+    SET_PointParameterfEXT(disp, glPointParameterfEXT);
+    SET_PointParameterfvEXT(disp, glPointParameterfvEXT);
+#elif GL_ARB_point_parameters
+    SET_PointParameterfEXT(disp, glPointParameterfARB);
+    SET_PointParameterfvEXT(disp, glPointParameterfvARB);
 #endif
-  SET_GetCompressedTexImageARB(disp, glGetCompressedTexImageARB);
-  SET_GetConvolutionFilter(disp, glGetConvolutionFilter);
-  SET_GetConvolutionParameterfv(disp, glGetConvolutionParameterfv);
-  SET_GetConvolutionParameteriv(disp, glGetConvolutionParameteriv);
-  SET_GetDoublev(disp, glGetDoublev);
-  SET_GetError(disp, glGetError);
-//SET_GetFenceivNV(disp, glGetFenceivNV);
-#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
-  SET_GetFinalCombinerInputParameterfvNV(disp, glGetFinalCombinerInputParameterfvNV);
-  SET_GetFinalCombinerInputParameterivNV(disp, glGetFinalCombinerInputParameterivNV);
+
+#if GL_EXT_polygon_offset
+    SET_PolygonOffsetEXT(disp, glPolygonOffsetEXT);
+#endif
+
+#if GL_EXT_secondary_color
+    SET_SecondaryColor3bEXT(disp, glSecondaryColor3bEXT);
+    SET_SecondaryColor3bvEXT(disp, glSecondaryColor3bvEXT);
+    SET_SecondaryColor3dEXT(disp, glSecondaryColor3dEXT);
+    SET_SecondaryColor3dvEXT(disp, glSecondaryColor3dvEXT);
+    SET_SecondaryColor3fEXT(disp, glSecondaryColor3fEXT);
+    SET_SecondaryColor3fvEXT(disp, glSecondaryColor3fvEXT);
+    SET_SecondaryColor3iEXT(disp, glSecondaryColor3iEXT);
+    SET_SecondaryColor3ivEXT(disp, glSecondaryColor3ivEXT);
+    SET_SecondaryColor3sEXT(disp, glSecondaryColor3sEXT);
+    SET_SecondaryColor3svEXT(disp, glSecondaryColor3svEXT);
+    SET_SecondaryColor3ubEXT(disp, glSecondaryColor3ubEXT);
+    SET_SecondaryColor3ubvEXT(disp, glSecondaryColor3ubvEXT);
+    SET_SecondaryColor3uiEXT(disp, glSecondaryColor3uiEXT);
+    SET_SecondaryColor3uivEXT(disp, glSecondaryColor3uivEXT);
+    SET_SecondaryColor3usEXT(disp, glSecondaryColor3usEXT);
+    SET_SecondaryColor3usvEXT(disp, glSecondaryColor3usvEXT);
+    SET_SecondaryColorPointerEXT(disp, glSecondaryColorPointerEXT);
+#endif
+
+#if GL_EXT_stencil_two_side
+    SET_ActiveStencilFaceEXT(disp, glActiveStencilFaceEXT);
+#endif
+
+#if GL_EXT_timer_query
+    SET_GetQueryObjecti64vEXT(disp, glGetQueryObjecti64vEXT);
+    SET_GetQueryObjectui64vEXT(disp, glGetQueryObjectui64vEXT);
+#endif
+
+#if GL_EXT_vertex_array
+    SET_ColorPointerEXT(disp, glColorPointerEXT);
+    SET_EdgeFlagPointerEXT(disp, glEdgeFlagPointerEXT);
+    SET_IndexPointerEXT(disp, glIndexPointerEXT);
+    SET_NormalPointerEXT(disp, glNormalPointerEXT);
+    SET_TexCoordPointerEXT(disp, glTexCoordPointerEXT);
+    SET_VertexPointerEXT(disp, glVertexPointerEXT);
+#endif
+
+#if GL_IBM_multimode_draw_arrays
+    SET_MultiModeDrawArraysIBM(disp, glMultiModeDrawArraysIBM);
+    SET_MultiModeDrawElementsIBM(disp, glMultiModeDrawElementsIBM);
+#endif
+
+#if GL_MESA_resize_buffers
+    SET_ResizeBuffersMESA(disp, glResizeBuffersMESA);
+#endif
+
+#if GL_MESA_window_pos
+    SET_WindowPos4dMESA(disp, glWindowPos4dMESA);
+    SET_WindowPos4dvMESA(disp, glWindowPos4dvMESA);
+    SET_WindowPos4fMESA(disp, glWindowPos4fMESA);
+    SET_WindowPos4fvMESA(disp, glWindowPos4fvMESA);
+    SET_WindowPos4iMESA(disp, glWindowPos4iMESA);
+    SET_WindowPos4ivMESA(disp, glWindowPos4ivMESA);
+    SET_WindowPos4sMESA(disp, glWindowPos4sMESA);
+    SET_WindowPos4svMESA(disp, glWindowPos4svMESA);
+#endif
+
+#if GL_NV_fence
+    SET_DeleteFencesNV(disp, glDeleteFencesNV);
+    SET_FinishFenceNV(disp, glFinishFenceNV);
+    SET_GenFencesNV(disp, glGenFencesNV);
+    SET_GetFenceivNV(disp, glGetFenceivNV);
+    SET_IsFenceNV(disp, glIsFenceNV);
+    SET_SetFenceNV(disp, glSetFenceNV);
+    SET_TestFenceNV(disp, glTestFenceNV);
+#endif
+
+#if GL_NV_fragment_program
+    SET_GetProgramNamedParameterdvNV(disp, glGetProgramNamedParameterdvNV);
+    SET_GetProgramNamedParameterfvNV(disp, glGetProgramNamedParameterfvNV);
+    SET_ProgramNamedParameter4dNV(disp, glProgramNamedParameter4dNV);
+    SET_ProgramNamedParameter4dvNV(disp, glProgramNamedParameter4dvNV);
+    SET_ProgramNamedParameter4fNV(disp, glProgramNamedParameter4fNV);
+    SET_ProgramNamedParameter4fvNV(disp, glProgramNamedParameter4fvNV);
+#endif
+
+#if GL_NV_geometry_program4
+    SET_FramebufferTextureLayerEXT(disp, glFramebufferTextureLayerEXT);
+#endif
+
+#if GL_NV_point_sprite
+    SET_PointParameteriNV(disp, glPointParameteriNV);
+    SET_PointParameterivNV(disp, glPointParameterivNV);
+#endif
+
+#if GL_NV_register_combiners
+    SET_CombinerInputNV(disp, glCombinerInputNV);
+    SET_CombinerOutputNV(disp, glCombinerOutputNV);
+    SET_CombinerParameterfNV(disp, glCombinerParameterfNV);
+    SET_CombinerParameterfvNV(disp, glCombinerParameterfvNV);
+    SET_CombinerParameteriNV(disp, glCombinerParameteriNV);
+    SET_CombinerParameterivNV(disp, glCombinerParameterivNV);
+    SET_FinalCombinerInputNV(disp, glFinalCombinerInputNV);
+    SET_GetCombinerInputParameterfvNV(disp, glGetCombinerInputParameterfvNV);
+    SET_GetCombinerInputParameterivNV(disp, glGetCombinerInputParameterivNV);
+    SET_GetCombinerOutputParameterfvNV(disp, glGetCombinerOutputParameterfvNV);
+    SET_GetCombinerOutputParameterivNV(disp, glGetCombinerOutputParameterivNV);
+    SET_GetFinalCombinerInputParameterfvNV(disp, glGetFinalCombinerInputParameterfvNV);
+    SET_GetFinalCombinerInputParameterivNV(disp, glGetFinalCombinerInputParameterivNV);
+#endif
+
+#if GL_NV_vertex_array_range
+    SET_FlushVertexArrayRangeNV(disp, glFlushVertexArrayRangeNV);
+    SET_VertexArrayRangeNV(disp, glVertexArrayRangeNV);
+#endif
+
+#if GL_NV_vertex_program
+    SET_AreProgramsResidentNV(disp, glAreProgramsResidentNV);
+    SET_BindProgramNV(disp, glBindProgramNV);
+    SET_DeleteProgramsNV(disp, glDeleteProgramsNV);
+    SET_ExecuteProgramNV(disp, glExecuteProgramNV);
+    SET_GenProgramsNV(disp, glGenProgramsNV);
+    SET_GetProgramParameterdvNV(disp, glGetProgramParameterdvNV);
+    SET_GetProgramParameterfvNV(disp, glGetProgramParameterfvNV);
+    SET_GetProgramStringNV(disp, glGetProgramStringNV);
+    SET_GetProgramivNV(disp, glGetProgramivNV);
+    SET_GetTrackMatrixivNV(disp, glGetTrackMatrixivNV);
+    SET_GetVertexAttribPointervNV(disp, glGetVertexAttribPointervNV);
+    SET_GetVertexAttribdvNV(disp, glGetVertexAttribdvNV);
+    SET_GetVertexAttribfvNV(disp, glGetVertexAttribfvNV);
+    SET_GetVertexAttribivNV(disp, glGetVertexAttribivNV);
+    SET_IsProgramNV(disp, glIsProgramNV);
+    SET_LoadProgramNV(disp, glLoadProgramNV);
+    SET_ProgramParameters4dvNV(disp, glProgramParameters4dvNV);
+    SET_ProgramParameters4fvNV(disp, glProgramParameters4fvNV);
+    SET_RequestResidentProgramsNV(disp, glRequestResidentProgramsNV);
+    SET_TrackMatrixNV(disp, glTrackMatrixNV);
+    SET_VertexAttrib1dNV(disp, glVertexAttrib1dNV)
+    SET_VertexAttrib1dvNV(disp, glVertexAttrib1dvNV)
+    SET_VertexAttrib1fNV(disp, glVertexAttrib1fNV)
+    SET_VertexAttrib1fvNV(disp, glVertexAttrib1fvNV)
+    SET_VertexAttrib1sNV(disp, glVertexAttrib1sNV)
+    SET_VertexAttrib1svNV(disp, glVertexAttrib1svNV)
+    SET_VertexAttrib2dNV(disp, glVertexAttrib2dNV)
+    SET_VertexAttrib2dvNV(disp, glVertexAttrib2dvNV)
+    SET_VertexAttrib2fNV(disp, glVertexAttrib2fNV)
+    SET_VertexAttrib2fvNV(disp, glVertexAttrib2fvNV)
+    SET_VertexAttrib2sNV(disp, glVertexAttrib2sNV)
+    SET_VertexAttrib2svNV(disp, glVertexAttrib2svNV)
+    SET_VertexAttrib3dNV(disp, glVertexAttrib3dNV)
+    SET_VertexAttrib3dvNV(disp, glVertexAttrib3dvNV)
+    SET_VertexAttrib3fNV(disp, glVertexAttrib3fNV)
+    SET_VertexAttrib3fvNV(disp, glVertexAttrib3fvNV)
+    SET_VertexAttrib3sNV(disp, glVertexAttrib3sNV)
+    SET_VertexAttrib3svNV(disp, glVertexAttrib3svNV)
+    SET_VertexAttrib4dNV(disp, glVertexAttrib4dNV)
+    SET_VertexAttrib4dvNV(disp, glVertexAttrib4dvNV)
+    SET_VertexAttrib4fNV(disp, glVertexAttrib4fNV)
+    SET_VertexAttrib4fvNV(disp, glVertexAttrib4fvNV)
+    SET_VertexAttrib4sNV(disp, glVertexAttrib4sNV)
+    SET_VertexAttrib4svNV(disp, glVertexAttrib4svNV)
+    SET_VertexAttrib4ubNV(disp, glVertexAttrib4ubNV)
+    SET_VertexAttrib4ubvNV(disp, glVertexAttrib4ubvNV)
+    SET_VertexAttribPointerNV(disp, glVertexAttribPointerNV)
+    SET_VertexAttribs1dvNV(disp, glVertexAttribs1dvNV)
+    SET_VertexAttribs1fvNV(disp, glVertexAttribs1fvNV)
+    SET_VertexAttribs1svNV(disp, glVertexAttribs1svNV)
+    SET_VertexAttribs2dvNV(disp, glVertexAttribs2dvNV)
+    SET_VertexAttribs2fvNV(disp, glVertexAttribs2fvNV)
+    SET_VertexAttribs2svNV(disp, glVertexAttribs2svNV)
+    SET_VertexAttribs3dvNV(disp, glVertexAttribs3dvNV)
+    SET_VertexAttribs3fvNV(disp, glVertexAttribs3fvNV)
+    SET_VertexAttribs3svNV(disp, glVertexAttribs3svNV)
+    SET_VertexAttribs4dvNV(disp, glVertexAttribs4dvNV)
+    SET_VertexAttribs4fvNV(disp, glVertexAttribs4fvNV)
+    SET_VertexAttribs4svNV(disp, glVertexAttribs4svNV)
+    SET_VertexAttribs4ubvNV(disp, glVertexAttribs4ubvNV)
+#endif
+
+#if GL_SGIS_multisample
+    SET_SampleMaskSGIS(disp, glSampleMaskSGIS);
+    SET_SamplePatternSGIS(disp, glSamplePatternSGIS);
+#endif
+
+#if GL_SGIS_pixel_texture
+    SET_GetPixelTexGenParameterfvSGIS(disp, glGetPixelTexGenParameterfvSGIS);
+    SET_GetPixelTexGenParameterivSGIS(disp, glGetPixelTexGenParameterivSGIS);
+    SET_PixelTexGenParameterfSGIS(disp, glPixelTexGenParameterfSGIS);
+    SET_PixelTexGenParameterfvSGIS(disp, glPixelTexGenParameterfvSGIS);
+    SET_PixelTexGenParameteriSGIS(disp, glPixelTexGenParameteriSGIS);
+    SET_PixelTexGenParameterivSGIS(disp, glPixelTexGenParameterivSGIS);
+    SET_PixelTexGenSGIX(disp, glPixelTexGenSGIX);
 #endif
-  SET_GetFloatv(disp, glGetFloatv);
-  SET_GetFramebufferAttachmentParameterivEXT(disp, glGetFramebufferAttachmentParameterivEXT);
-  SET_GetHandleARB(disp, glGetHandleARB);
-  SET_GetHistogram(disp, glGetHistogram);
-  SET_GetHistogramParameterfv(disp, glGetHistogramParameterfv);
-  SET_GetHistogramParameteriv(disp, glGetHistogramParameteriv);
-  SET_GetInfoLogARB(disp, glGetInfoLogARB);
-  SET_GetIntegerv(disp, glGetIntegerv);
-  SET_GetLightfv(disp, glGetLightfv);
-  SET_GetLightiv(disp, glGetLightiv);
-  SET_GetMapdv(disp, glGetMapdv);
-  SET_GetMapfv(disp, glGetMapfv);
-  SET_GetMapiv(disp, glGetMapiv);
-  SET_GetMaterialfv(disp, glGetMaterialfv);
-  SET_GetMaterialiv(disp, glGetMaterialiv);
-  SET_GetMinmax(disp, glGetMinmax);
-  SET_GetMinmaxParameterfv(disp, glGetMinmaxParameterfv);
-  SET_GetMinmaxParameteriv(disp, glGetMinmaxParameteriv);
-  SET_GetObjectParameterfvARB(disp, glGetObjectParameterfvARB);
-  SET_GetObjectParameterivARB(disp, glGetObjectParameterivARB);
-  SET_GetPixelMapfv(disp, glGetPixelMapfv);
-  SET_GetPixelMapuiv(disp, glGetPixelMapuiv);
-  SET_GetPixelMapusv(disp, glGetPixelMapusv);
-//SET_GetPixelTexGenParameterfvSGIS(disp, glGetPixelTexGenParameterfvSGIS);
-//SET_GetPixelTexGenParameterivSGIS(disp, glGetPixelTexGenParameterivSGIS);
-  SET_GetPointerv(disp, glGetPointerv);
-  SET_GetPolygonStipple(disp, glGetPolygonStipple);
-  SET_GetProgramEnvParameterdvARB(disp, glGetProgramEnvParameterdvARB);
-  SET_GetProgramEnvParameterfvARB(disp, glGetProgramEnvParameterfvARB);
-  SET_GetProgramLocalParameterdvARB(disp, glGetProgramLocalParameterdvARB);
-  SET_GetProgramLocalParameterfvARB(disp, glGetProgramLocalParameterfvARB);
-//SET_GetProgramNamedParameterdvNV(disp, glGetProgramNamedParameterdvNV);
-//SET_GetProgramNamedParameterfvNV(disp, glGetProgramNamedParameterfvNV);
-//SET_GetProgramParameterdvNV(disp, glGetProgramParameterdvNV);
-//SET_GetProgramParameterfvNV(disp, glGetProgramParameterfvNV);
-  SET_GetProgramStringARB(disp, glGetProgramStringARB);
-//SET_GetProgramStringNV(disp, glGetProgramStringNV);
-  SET_GetProgramivARB(disp, glGetProgramivARB);
-//SET_GetProgramivNV(disp, glGetProgramivNV);
-//SET_GetQueryObjecti64vEXT(disp, glGetQueryObjecti64vEXT);
-  SET_GetQueryObjectivARB(disp, glGetQueryObjectivARB);
-//SET_GetQueryObjectui64vEXT(disp, glGetQueryObjectui64vEXT);
-  SET_GetQueryObjectuivARB(disp, glGetQueryObjectuivARB);
-  SET_GetQueryivARB(disp, glGetQueryivARB);
-  SET_GetRenderbufferParameterivEXT(disp, glGetRenderbufferParameterivEXT);
-  SET_GetSeparableFilter(disp, glGetSeparableFilter);
-  SET_GetShaderSourceARB(disp, glGetShaderSourceARB);
-  SET_GetString(disp, glGetString);
-  SET_GetTexEnvfv(disp, glGetTexEnvfv);
-  SET_GetTexEnviv(disp, glGetTexEnviv);
-  SET_GetTexGendv(disp, glGetTexGendv);
-  SET_GetTexGenfv(disp, glGetTexGenfv);
-  SET_GetTexGeniv(disp, glGetTexGeniv);
-  SET_GetTexImage(disp, glGetTexImage);
-  SET_GetTexLevelParameterfv(disp, glGetTexLevelParameterfv);
-  SET_GetTexLevelParameteriv(disp, glGetTexLevelParameteriv);
-  SET_GetTexParameterfv(disp, glGetTexParameterfv);
-  SET_GetTexParameteriv(disp, glGetTexParameteriv);
-//SET_GetTrackMatrixivNV(disp, glGetTrackMatrixivNV);
-  SET_GetUniformLocationARB(disp, glGetUniformLocationARB);
-  SET_GetUniformfvARB(disp, glGetUniformfvARB);
-  SET_GetUniformivARB(disp, glGetUniformivARB);
-//SET_GetVertexAttribPointervNV(disp, glGetVertexAttribPointervNV);
-  SET_GetVertexAttribdvARB(disp, glGetVertexAttribdvARB);
-//SET_GetVertexAttribdvNV(disp, glGetVertexAttribdvNV);
-  SET_GetVertexAttribfvARB(disp, glGetVertexAttribfvARB);
-//SET_GetVertexAttribfvNV(disp, glGetVertexAttribfvNV);
-  SET_GetVertexAttribivARB(disp, glGetVertexAttribivARB);
-//SET_GetVertexAttribivNV(disp, glGetVertexAttribivNV);
-  SET_Hint(disp, glHint);
-  SET_Histogram(disp, glHistogram);
-  SET_IndexMask(disp, glIndexMask);
-  SET_IndexPointer(disp, glIndexPointer);
-//SET_IndexPointerEXT(disp, glIndexPointerEXT);
-  SET_Indexd(disp, glIndexd);
-  SET_Indexdv(disp, glIndexdv);
-  SET_Indexf(disp, glIndexf);
-  SET_Indexfv(disp, glIndexfv);
-  SET_Indexi(disp, glIndexi);
-  SET_Indexiv(disp, glIndexiv);
-  SET_Indexs(disp, glIndexs);
-  SET_Indexsv(disp, glIndexsv);
-  SET_Indexub(disp, glIndexub);
-  SET_Indexubv(disp, glIndexubv);
-  SET_InitNames(disp, glInitNames);
-  SET_InterleavedArrays(disp, glInterleavedArrays);
-  SET_IsBufferARB(disp, glIsBufferARB);
-  SET_IsEnabled(disp, glIsEnabled);
-  SET_IsFenceNV(disp, glIsFenceAPPLE);           // <-- APPLE -> NV
-  SET_IsFramebufferEXT(disp, glIsFramebufferEXT);
-  SET_IsList(disp, glIsList);
-//SET_IsProgramNV(disp, glIsProgramNV);
-  SET_IsQueryARB(disp, glIsQueryARB);
-  SET_IsRenderbufferEXT(disp, glIsRenderbufferEXT);
-  SET_IsTexture(disp, glIsTexture);
-  SET_LightModelf(disp, glLightModelf);
-  SET_LightModelfv(disp, glLightModelfv);
-  SET_LightModeli(disp, glLightModeli);
-  SET_LightModeliv(disp, glLightModeliv);
-  SET_Lightf(disp, glLightf);
-  SET_Lightfv(disp, glLightfv);
-  SET_Lighti(disp, glLighti);
-  SET_Lightiv(disp, glLightiv);
-  SET_LineStipple(disp, glLineStipple);
-  SET_LineWidth(disp, glLineWidth);
-  SET_LinkProgramARB(disp, glLinkProgramARB);
-  SET_ListBase(disp, glListBase);
-  SET_LoadIdentity(disp, glLoadIdentity);
-  SET_LoadMatrixd(disp, glLoadMatrixd);
-  SET_LoadMatrixf(disp, glLoadMatrixf);
-  SET_LoadName(disp, glLoadName);
-//SET_LoadProgramNV(disp, glLoadProgramNV);
-  SET_LoadTransposeMatrixdARB(disp, glLoadTransposeMatrixdARB);
-  SET_LoadTransposeMatrixfARB(disp, glLoadTransposeMatrixfARB);
-  SET_LockArraysEXT(disp, glLockArraysEXT);
-  SET_LogicOp(disp, glLogicOp);
-  SET_Map1d(disp, glMap1d);
-  SET_Map1f(disp, glMap1f);
-  SET_Map2d(disp, glMap2d);
-  SET_Map2f(disp, glMap2f);
-  SET_MapBufferARB(disp, glMapBufferARB);
-  SET_MapGrid1d(disp, glMapGrid1d);
-  SET_MapGrid1f(disp, glMapGrid1f);
-  SET_MapGrid2d(disp, glMapGrid2d);
-  SET_MapGrid2f(disp, glMapGrid2f);
-  SET_Materialf(disp, glMaterialf);
-  SET_Materialfv(disp, glMaterialfv);
-  SET_Materiali(disp, glMateriali);
-  SET_Materialiv(disp, glMaterialiv);
-  SET_MatrixMode(disp, glMatrixMode);
-  SET_Minmax(disp, glMinmax);
-  SET_MultMatrixd(disp, glMultMatrixd);
-  SET_MultMatrixf(disp, glMultMatrixf);
-  SET_MultTransposeMatrixdARB(disp, glMultTransposeMatrixdARB);
-  SET_MultTransposeMatrixfARB(disp, glMultTransposeMatrixfARB);
-  SET_MultiDrawArraysEXT(disp, glMultiDrawArraysEXT);
-  SET_MultiDrawElementsEXT(disp, glMultiDrawElementsEXT);
-//SET_MultiModeDrawArraysIBM(disp, glMultiModeDrawArraysIBM);
-//SET_MultiModeDrawElementsIBM(disp, glMultiModeDrawElementsIBM);
-  SET_MultiTexCoord1dARB(disp, glMultiTexCoord1dARB);
-  SET_MultiTexCoord1dvARB(disp, glMultiTexCoord1dvARB);
-  SET_MultiTexCoord1fARB(disp, glMultiTexCoord1fARB);
-  SET_MultiTexCoord1fvARB(disp, glMultiTexCoord1fvARB);
-  SET_MultiTexCoord1iARB(disp, glMultiTexCoord1iARB);
-  SET_MultiTexCoord1ivARB(disp, glMultiTexCoord1ivARB);
-  SET_MultiTexCoord1sARB(disp, glMultiTexCoord1sARB);
-  SET_MultiTexCoord1svARB(disp, glMultiTexCoord1svARB);
-  SET_MultiTexCoord2dARB(disp, glMultiTexCoord2dARB);
-  SET_MultiTexCoord2dvARB(disp, glMultiTexCoord2dvARB);
-  SET_MultiTexCoord2fARB(disp, glMultiTexCoord2fARB);
-  SET_MultiTexCoord2fvARB(disp, glMultiTexCoord2fvARB);
-  SET_MultiTexCoord2iARB(disp, glMultiTexCoord2iARB);
-  SET_MultiTexCoord2ivARB(disp, glMultiTexCoord2ivARB);
-  SET_MultiTexCoord2sARB(disp, glMultiTexCoord2sARB);
-  SET_MultiTexCoord2svARB(disp, glMultiTexCoord2svARB);
-  SET_MultiTexCoord3dARB(disp, glMultiTexCoord3dARB);
-  SET_MultiTexCoord3dvARB(disp, glMultiTexCoord3dvARB);
-  SET_MultiTexCoord3fARB(disp, glMultiTexCoord3fARB);
-  SET_MultiTexCoord3fvARB(disp, glMultiTexCoord3fvARB);
-  SET_MultiTexCoord3iARB(disp, glMultiTexCoord3iARB);
-  SET_MultiTexCoord3ivARB(disp, glMultiTexCoord3ivARB);
-  SET_MultiTexCoord3sARB(disp, glMultiTexCoord3sARB);
-  SET_MultiTexCoord3svARB(disp, glMultiTexCoord3svARB);
-  SET_MultiTexCoord4dARB(disp, glMultiTexCoord4dARB);
-  SET_MultiTexCoord4dvARB(disp, glMultiTexCoord4dvARB);
-  SET_MultiTexCoord4fARB(disp, glMultiTexCoord4fARB);
-  SET_MultiTexCoord4fvARB(disp, glMultiTexCoord4fvARB);
-  SET_MultiTexCoord4iARB(disp, glMultiTexCoord4iARB);
-  SET_MultiTexCoord4ivARB(disp, glMultiTexCoord4ivARB);
-  SET_MultiTexCoord4sARB(disp, glMultiTexCoord4sARB);
-  SET_MultiTexCoord4svARB(disp, glMultiTexCoord4svARB);
-  SET_NewList(disp, glNewList);
-  SET_Normal3b(disp, glNormal3b);
-  SET_Normal3bv(disp, glNormal3bv);
-  SET_Normal3d(disp, glNormal3d);
-  SET_Normal3dv(disp, glNormal3dv);
-  SET_Normal3f(disp, glNormal3f);
-  SET_Normal3fv(disp, glNormal3fv);
-  SET_Normal3i(disp, glNormal3i);
-  SET_Normal3iv(disp, glNormal3iv);
-  SET_Normal3s(disp, glNormal3s);
-  SET_Normal3sv(disp, glNormal3sv);
-  SET_NormalPointer(disp, glNormalPointer);
-//SET_NormalPointerEXT(disp, glNormalPointerEXT);
-  SET_Ortho(disp, glOrtho);
-//SET_PassTexCoordATI(disp, glPassTexCoordEXT);         // <-- EXT -> ATI
-  SET_PassThrough(disp, glPassThrough);
-  SET_PixelMapfv(disp, glPixelMapfv);
-  SET_PixelMapuiv(disp, glPixelMapuiv);
-  SET_PixelMapusv(disp, glPixelMapusv);
-  SET_PixelStoref(disp, glPixelStoref);
-  SET_PixelStorei(disp, glPixelStorei);
-//SET_PixelTexGenParameterfSGIS(disp, glPixelTexGenParameterfSGIS);
-//SET_PixelTexGenParameterfvSGIS(disp, glPixelTexGenParameterfvSGIS);
-//SET_PixelTexGenParameteriSGIS(disp, glPixelTexGenParameteriSGIS);
-//SET_PixelTexGenParameterivSGIS(disp, glPixelTexGenParameterivSGIS);
-//  SET_PixelTexGenSGIX(disp, glPixelTexGenSGIX);
-  SET_PixelTransferf(disp, glPixelTransferf);
-  SET_PixelTransferi(disp, glPixelTransferi);
-  SET_PixelZoom(disp, glPixelZoom);
-  SET_PointParameterfEXT(disp, glPointParameterfARB);      // <-- ARB -> EXT
-  SET_PointParameterfvEXT(disp, glPointParameterfvARB);    // <-- ARB -> EXT
-  SET_PointParameteriNV(disp, glPointParameteriNV);
-  SET_PointParameterivNV(disp, glPointParameterivNV);
-  SET_PointSize(disp, glPointSize);
-  SET_PolygonMode(disp, glPolygonMode);
-  SET_PolygonOffset(disp, glPolygonOffset);
-//SET_PolygonOffsetEXT(disp, glPolygonOffsetEXT);
-  SET_PolygonStipple(disp, glPolygonStipple);
-  SET_PopAttrib(disp, glPopAttrib);
-  SET_PopClientAttrib(disp, glPopClientAttrib);
-  SET_PopMatrix(disp, glPopMatrix);
-  SET_PopName(disp, glPopName);
-  SET_PrioritizeTextures(disp, glPrioritizeTextures);
-  SET_ProgramEnvParameter4dARB(disp, glProgramEnvParameter4dARB);
-  SET_ProgramEnvParameter4dvARB(disp, glProgramEnvParameter4dvARB);
-  SET_ProgramEnvParameter4fARB(disp, glProgramEnvParameter4fARB);
-  SET_ProgramEnvParameter4fvARB(disp, glProgramEnvParameter4fvARB);
-  SET_ProgramLocalParameter4dARB(disp, glProgramLocalParameter4dARB);
-  SET_ProgramLocalParameter4dvARB(disp, glProgramLocalParameter4dvARB);
-  SET_ProgramLocalParameter4fARB(disp, glProgramLocalParameter4fARB);
-  SET_ProgramLocalParameter4fvARB(disp, glProgramLocalParameter4fvARB);
-//SET_ProgramNamedParameter4dNV(disp, glProgramNamedParameter4dNV);
-//SET_ProgramNamedParameter4dvNV(disp, glProgramNamedParameter4dvNV);
-//SET_ProgramNamedParameter4fNV(disp, glProgramNamedParameter4fNV);
-//SET_ProgramNamedParameter4fvNV(disp, glProgramNamedParameter4fvNV);
-//SET_ProgramParameter4dNV(disp, glProgramParameter4dNV);
-//SET_ProgramParameter4dvNV(disp, glProgramParameter4dvNV);
-//SET_ProgramParameter4fNV(disp, glProgramParameter4fNV);
-//SET_ProgramParameter4fvNV(disp, glProgramParameter4fvNV);
-//SET_ProgramParameters4dvNV(disp, glProgramParameters4dvNV);
-//SET_ProgramParameters4fvNV(disp, glProgramParameters4fvNV);
-  SET_ProgramStringARB(disp, glProgramStringARB);
-  SET_PushAttrib(disp, glPushAttrib);
-  SET_PushClientAttrib(disp, glPushClientAttrib);
-  SET_PushMatrix(disp, glPushMatrix);
-  SET_PushName(disp, glPushName);
-  SET_RasterPos2d(disp, glRasterPos2d);
-  SET_RasterPos2dv(disp, glRasterPos2dv);
-  SET_RasterPos2f(disp, glRasterPos2f);
-  SET_RasterPos2fv(disp, glRasterPos2fv);
-  SET_RasterPos2i(disp, glRasterPos2i);
-  SET_RasterPos2iv(disp, glRasterPos2iv);
-  SET_RasterPos2s(disp, glRasterPos2s);
-  SET_RasterPos2sv(disp, glRasterPos2sv);
-  SET_RasterPos3d(disp, glRasterPos3d);
-  SET_RasterPos3dv(disp, glRasterPos3dv);
-  SET_RasterPos3f(disp, glRasterPos3f);
-  SET_RasterPos3fv(disp, glRasterPos3fv);
-  SET_RasterPos3i(disp, glRasterPos3i);
-  SET_RasterPos3iv(disp, glRasterPos3iv);
-  SET_RasterPos3s(disp, glRasterPos3s);
-  SET_RasterPos3sv(disp, glRasterPos3sv);
-  SET_RasterPos4d(disp, glRasterPos4d);
-  SET_RasterPos4dv(disp, glRasterPos4dv);
-  SET_RasterPos4f(disp, glRasterPos4f);
-  SET_RasterPos4fv(disp, glRasterPos4fv);
-  SET_RasterPos4i(disp, glRasterPos4i);
-  SET_RasterPos4iv(disp, glRasterPos4iv);
-  SET_RasterPos4s(disp, glRasterPos4s);
-  SET_RasterPos4sv(disp, glRasterPos4sv);
-  SET_ReadBuffer(disp, glReadBuffer);
-  SET_ReadPixels(disp, glReadPixels);
-  SET_Rectd(disp, glRectd);
-  SET_Rectdv(disp, glRectdv);
-  SET_Rectf(disp, glRectf);
-  SET_Rectfv(disp, glRectfv);
-  SET_Recti(disp, glRecti);
-  SET_Rectiv(disp, glRectiv);
-  SET_Rects(disp, glRects);
-  SET_Rectsv(disp, glRectsv);
-  SET_RenderMode(disp, glRenderMode);
-  SET_RenderbufferStorageEXT(disp, glRenderbufferStorageEXT);
-//SET_RequestResidentProgramsNV(disp, glRequestResidentProgramsNV);
-  SET_ResetHistogram(disp, glResetHistogram);
-  SET_ResetMinmax(disp, glResetMinmax);
-//SET_ResizeBuffersMESA(disp, glResizeBuffersMESA);
-  SET_Rotated(disp, glRotated);
-  SET_Rotatef(disp, glRotatef);
-  SET_SampleCoverageARB(disp, glSampleCoverageARB);
-//SET_SampleMapATI(disp, glSampleMapEXT);       // <-- EXT -> ATI
-//SET_SampleMaskSGIS(disp, glSampleMaskSGIS);
-//SET_SamplePatternSGIS(disp, glSamplePatternSGIS);
-  SET_Scaled(disp, glScaled);
-  SET_Scalef(disp, glScalef);
-  SET_Scissor(disp, glScissor);
-  SET_SecondaryColor3bEXT(disp, glSecondaryColor3bEXT);
-  SET_SecondaryColor3bvEXT(disp, glSecondaryColor3bvEXT);
-  SET_SecondaryColor3dEXT(disp, glSecondaryColor3dEXT);
-  SET_SecondaryColor3dvEXT(disp, glSecondaryColor3dvEXT);
-  SET_SecondaryColor3fEXT(disp, glSecondaryColor3fEXT);
-  SET_SecondaryColor3fvEXT(disp, glSecondaryColor3fvEXT);
-  SET_SecondaryColor3iEXT(disp, glSecondaryColor3iEXT);
-  SET_SecondaryColor3ivEXT(disp, glSecondaryColor3ivEXT);
-  SET_SecondaryColor3sEXT(disp, glSecondaryColor3sEXT);
-  SET_SecondaryColor3svEXT(disp, glSecondaryColor3svEXT);
-  SET_SecondaryColor3ubEXT(disp, glSecondaryColor3ubEXT);
-  SET_SecondaryColor3ubvEXT(disp, glSecondaryColor3ubvEXT);
-  SET_SecondaryColor3uiEXT(disp, glSecondaryColor3uiEXT);
-  SET_SecondaryColor3uivEXT(disp, glSecondaryColor3uivEXT);
-  SET_SecondaryColor3usEXT(disp, glSecondaryColor3usEXT);
-  SET_SecondaryColor3usvEXT(disp, glSecondaryColor3usvEXT);
-  SET_SecondaryColorPointerEXT(disp, glSecondaryColorPointerEXT);
-  SET_SelectBuffer(disp, glSelectBuffer);
-  SET_SeparableFilter2D(disp, glSeparableFilter2D);
-  SET_SetFenceNV(disp, glSetFenceAPPLE);  // <-- APPLE -> NV
-//SET_SetFragmentShaderConstantATI(disp, glSetFragmentShaderConstantEXT);   // <-- EXT -> ATI
-  SET_ShadeModel(disp, glShadeModel);
-  SET_ShaderSourceARB(disp, glShaderSourceARB);
-  SET_StencilFunc(disp, glStencilFunc);
-  SET_StencilFuncSeparate(disp, glStencilFuncSeparate);
-  SET_StencilMask(disp, glStencilMask);
-  SET_StencilMaskSeparate(disp, glStencilMaskSeparate);
-  SET_StencilOp(disp, glStencilOp);
-  SET_StencilOpSeparate(disp, glStencilOpSeparate);
-  SET_TestFenceNV(disp, glTestFenceAPPLE); // <-- APPLE -> NV
-  SET_TexCoord1d(disp, glTexCoord1d);
-  SET_TexCoord1dv(disp, glTexCoord1dv);
-  SET_TexCoord1f(disp, glTexCoord1f);
-  SET_TexCoord1fv(disp, glTexCoord1fv);
-  SET_TexCoord1i(disp, glTexCoord1i);
-  SET_TexCoord1iv(disp, glTexCoord1iv);
-  SET_TexCoord1s(disp, glTexCoord1s);
-  SET_TexCoord1sv(disp, glTexCoord1sv);
-  SET_TexCoord2d(disp, glTexCoord2d);
-  SET_TexCoord2dv(disp, glTexCoord2dv);
-  SET_TexCoord2f(disp, glTexCoord2f);
-  SET_TexCoord2fv(disp, glTexCoord2fv);
-  SET_TexCoord2i(disp, glTexCoord2i);
-  SET_TexCoord2iv(disp, glTexCoord2iv);
-  SET_TexCoord2s(disp, glTexCoord2s);
-  SET_TexCoord2sv(disp, glTexCoord2sv);
-  SET_TexCoord3d(disp, glTexCoord3d);
-  SET_TexCoord3dv(disp, glTexCoord3dv);
-  SET_TexCoord3f(disp, glTexCoord3f);
-  SET_TexCoord3fv(disp, glTexCoord3fv);
-  SET_TexCoord3i(disp, glTexCoord3i);
-  SET_TexCoord3iv(disp, glTexCoord3iv);
-  SET_TexCoord3s(disp, glTexCoord3s);
-  SET_TexCoord3sv(disp, glTexCoord3sv);
-  SET_TexCoord4d(disp, glTexCoord4d);
-  SET_TexCoord4dv(disp, glTexCoord4dv);
-  SET_TexCoord4f(disp, glTexCoord4f);
-  SET_TexCoord4fv(disp, glTexCoord4fv);
-  SET_TexCoord4i(disp, glTexCoord4i);
-  SET_TexCoord4iv(disp, glTexCoord4iv);
-  SET_TexCoord4s(disp, glTexCoord4s);
-  SET_TexCoord4sv(disp, glTexCoord4sv);
-  SET_TexCoordPointer(disp, glTexCoordPointer);
-//SET_TexCoordPointerEXT(disp, glTexCoordPointerEXT);
-  SET_TexEnvf(disp, glTexEnvf);
-  SET_TexEnvfv(disp, glTexEnvfv);
-  SET_TexEnvi(disp, glTexEnvi);
-  SET_TexEnviv(disp, glTexEnviv);
-  SET_TexGend(disp, glTexGend);
-  SET_TexGendv(disp, glTexGendv);
-  SET_TexGenf(disp, glTexGenf);
-  SET_TexGenfv(disp, glTexGenfv);
-  SET_TexGeni(disp, glTexGeni);
-  SET_TexGeniv(disp, glTexGeniv);
-  SET_TexImage1D(disp, glTexImage1D);
-  SET_TexImage2D(disp, glTexImage2D);
-  SET_TexImage3D(disp, glTexImage3D);
-  SET_TexParameterf(disp, glTexParameterf);
-  SET_TexParameterfv(disp, glTexParameterfv);
-  SET_TexParameteri(disp, glTexParameteri);
-  SET_TexParameteriv(disp, glTexParameteriv);
-  SET_TexSubImage1D(disp, glTexSubImage1D);
-  SET_TexSubImage2D(disp, glTexSubImage2D);
-  SET_TexSubImage3D(disp, glTexSubImage3D);
-//SET_TrackMatrixNV(disp, glTrackMatrixNV);
-  SET_Translated(disp, glTranslated);
-  SET_Translatef(disp, glTranslatef);
-  SET_Uniform1fARB(disp, glUniform1fARB);
-  SET_Uniform1fvARB(disp, glUniform1fvARB);
-  SET_Uniform1iARB(disp, glUniform1iARB);
-  SET_Uniform1ivARB(disp, glUniform1ivARB);
-  SET_Uniform2fARB(disp, glUniform2fARB);
-  SET_Uniform2fvARB(disp, glUniform2fvARB);
-  SET_Uniform2iARB(disp, glUniform2iARB);
-  SET_Uniform2ivARB(disp, glUniform2ivARB);
-  SET_Uniform3fARB(disp, glUniform3fARB);
-  SET_Uniform3fvARB(disp, glUniform3fvARB);
-  SET_Uniform3iARB(disp, glUniform3iARB);
-  SET_Uniform3ivARB(disp, glUniform3ivARB);
-  SET_Uniform4fARB(disp, glUniform4fARB);
-  SET_Uniform4fvARB(disp, glUniform4fvARB);
-  SET_Uniform4iARB(disp, glUniform4iARB);
-  SET_Uniform4ivARB(disp, glUniform4ivARB);
-  SET_UniformMatrix2fvARB(disp, glUniformMatrix2fvARB);
-  SET_UniformMatrix3fvARB(disp, glUniformMatrix3fvARB);
-  SET_UniformMatrix4fvARB(disp, glUniformMatrix4fvARB);
-  SET_UnlockArraysEXT(disp, glUnlockArraysEXT);
-  SET_UnmapBufferARB(disp, glUnmapBufferARB);
-  SET_UseProgramObjectARB(disp, glUseProgramObjectARB);
-  SET_ValidateProgramARB(disp, glValidateProgramARB);
-  SET_Vertex2d(disp, glVertex2d);
-  SET_Vertex2dv(disp, glVertex2dv);
-  SET_Vertex2f(disp, glVertex2f);
-  SET_Vertex2fv(disp, glVertex2fv);
-  SET_Vertex2i(disp, glVertex2i);
-  SET_Vertex2iv(disp, glVertex2iv);
-  SET_Vertex2s(disp, glVertex2s);
-  SET_Vertex2sv(disp, glVertex2sv);
-  SET_Vertex3d(disp, glVertex3d);
-  SET_Vertex3dv(disp, glVertex3dv);
-  SET_Vertex3f(disp, glVertex3f);
-  SET_Vertex3fv(disp, glVertex3fv);
-  SET_Vertex3i(disp, glVertex3i);
-  SET_Vertex3iv(disp, glVertex3iv);
-  SET_Vertex3s(disp, glVertex3s);
-  SET_Vertex3sv(disp, glVertex3sv);
-  SET_Vertex4d(disp, glVertex4d);
-  SET_Vertex4dv(disp, glVertex4dv);
-  SET_Vertex4f(disp, glVertex4f);
-  SET_Vertex4fv(disp, glVertex4fv);
-  SET_Vertex4i(disp, glVertex4i);
-  SET_Vertex4iv(disp, glVertex4iv);
-  SET_Vertex4s(disp, glVertex4s);
-  SET_Vertex4sv(disp, glVertex4sv);
-//SET_VertexArrayRangeNV(disp, glVertexArrayRangeNV);
-  SET_VertexAttrib1dARB(disp, glVertexAttrib1dARB);
-  SET_VertexAttrib1dvARB(disp, glVertexAttrib1dvARB);
-  SET_VertexAttrib1fARB(disp, glVertexAttrib1fARB);
-  SET_VertexAttrib1fvARB(disp, glVertexAttrib1fvARB);
-  SET_VertexAttrib1sARB(disp, glVertexAttrib1sARB);
-  SET_VertexAttrib1svARB(disp, glVertexAttrib1svARB);
-  SET_VertexAttrib2dARB(disp, glVertexAttrib2dARB);
-  SET_VertexAttrib2dvARB(disp, glVertexAttrib2dvARB);
-  SET_VertexAttrib2fARB(disp, glVertexAttrib2fARB);
-  SET_VertexAttrib2fvARB(disp, glVertexAttrib2fvARB);
-  SET_VertexAttrib2sARB(disp, glVertexAttrib2sARB);
-  SET_VertexAttrib2svARB(disp, glVertexAttrib2svARB);
-  SET_VertexAttrib3dARB(disp, glVertexAttrib3dARB);
-  SET_VertexAttrib3dvARB(disp, glVertexAttrib3dvARB);
-  SET_VertexAttrib3fARB(disp, glVertexAttrib3fARB);
-  SET_VertexAttrib3fvARB(disp, glVertexAttrib3fvARB);
-  SET_VertexAttrib3sARB(disp, glVertexAttrib3sARB);
-  SET_VertexAttrib3svARB(disp, glVertexAttrib3svARB);
-  SET_VertexAttrib4NbvARB(disp, glVertexAttrib4NbvARB);
-  SET_VertexAttrib4NivARB(disp, glVertexAttrib4NivARB);
-  SET_VertexAttrib4NsvARB(disp, glVertexAttrib4NsvARB);
-  SET_VertexAttrib4NubARB(disp, glVertexAttrib4NubARB);
-  SET_VertexAttrib4NubvARB(disp, glVertexAttrib4NubvARB);
-  SET_VertexAttrib4NuivARB(disp, glVertexAttrib4NuivARB);
-  SET_VertexAttrib4NusvARB(disp, glVertexAttrib4NusvARB);
-  SET_VertexAttrib4bvARB(disp, glVertexAttrib4bvARB);
-  SET_VertexAttrib4dARB(disp, glVertexAttrib4dARB);
-  SET_VertexAttrib4dvARB(disp, glVertexAttrib4dvARB);
-  SET_VertexAttrib4fARB(disp, glVertexAttrib4fARB);
-  SET_VertexAttrib4fvARB(disp, glVertexAttrib4fvARB);
-  SET_VertexAttrib4ivARB(disp, glVertexAttrib4ivARB);
-  SET_VertexAttrib4sARB(disp, glVertexAttrib4sARB);
-  SET_VertexAttrib4svARB(disp, glVertexAttrib4svARB);
-  SET_VertexAttrib4ubvARB(disp, glVertexAttrib4ubvARB);
-  SET_VertexAttrib4uivARB(disp, glVertexAttrib4uivARB);
-  SET_VertexAttrib4usvARB(disp, glVertexAttrib4usvARB);
-  SET_VertexAttribPointerARB(disp, glVertexAttribPointerARB);
-  SET_VertexPointer(disp, glVertexPointer);
-//  SET_VertexPointerEXT(disp, glVertexPointerEXT);
-  SET_Viewport(disp, glViewport);
-  SET_WindowPos2dMESA(disp, glWindowPos2dARB);
-  SET_WindowPos2dvMESA(disp, glWindowPos2dvARB);
-  SET_WindowPos2fMESA(disp, glWindowPos2fARB);
-  SET_WindowPos2fvMESA(disp, glWindowPos2fvARB);
-  SET_WindowPos2iMESA(disp, glWindowPos2iARB);
-  SET_WindowPos2ivMESA(disp, glWindowPos2ivARB);
-  SET_WindowPos2sMESA(disp, glWindowPos2sARB);
-  SET_WindowPos2svMESA(disp, glWindowPos2svARB);
-  SET_WindowPos3dMESA(disp, glWindowPos3dARB);
-  SET_WindowPos3dvMESA(disp, glWindowPos3dvARB);
-  SET_WindowPos3fMESA(disp, glWindowPos3fARB);
-  SET_WindowPos3fvMESA(disp, glWindowPos3fvARB);
-  SET_WindowPos3iMESA(disp, glWindowPos3iARB);
-  SET_WindowPos3ivMESA(disp, glWindowPos3ivARB);
-  SET_WindowPos3sMESA(disp, glWindowPos3sARB);
-  SET_WindowPos3svMESA(disp, glWindowPos3svARB);
-//SET_WindowPos4dMESA(disp, glWindowPos4dMESA);
-//SET_WindowPos4dvMESA(disp, glWindowPos4dvMESA);
-//SET_WindowPos4fMESA(disp, glWindowPos4fMESA);
-//SET_WindowPos4fvMESA(disp, glWindowPos4fvMESA);
-//SET_WindowPos4iMESA(disp, glWindowPos4iMESA);
-//SET_WindowPos4ivMESA(disp, glWindowPos4ivMESA);
-//SET_WindowPos4sMESA(disp, glWindowPos4sMESA);
-//SET_WindowPos4svMESA(disp, glWindowPos4svMESA);
 }
commit fc24a97a8d022e986082b65b5133701e7273805c
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Tue Jun 2 19:12:41 2009 -0700

    Rootless: Use serverClient instead of NullClient
    
    This seems to stop the crash when moving windows.
    (cherry picked from commit fcd857c8e295ac7a2b0e58d49dc71251ed9d1266)

diff --git a/miext/rootless/rootlessWindow.c b/miext/rootless/rootlessWindow.c
index b173cef..e273d0e 100644
--- a/miext/rootless/rootlessWindow.c
+++ b/miext/rootless/rootlessWindow.c
@@ -139,7 +139,7 @@ void RootlessNativeWindowMoved (WindowPtr pWin) {
     mask = CWX | CWY;
     
     /* pretend we're the owner of the window! */
-    err = dixLookupClient(&pClient, pWin->drawable.id, NullClient, DixUnknownAccess);
+    err = dixLookupClient(&pClient, pWin->drawable.id, serverClient, DixUnknownAccess);
     if(err != Success) {
         ErrorF("RootlessNativeWindowMoved(): Failed to lookup window: 0x%x\n", (unsigned int)pWin->drawable.id);
         return;
commit 2429daa7e6b35a4a8032e1c3736e417a5a9baa07
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Tue Jun 2 10:19:10 2009 -0700

    XQuartz: Default to forcing the dialog box before quitting.
    
    This will show the quit dialog for users of other WMs.
    (cherry picked from commit 639ee0c913f892776fee40bcfb856e0d7c2c7db5)
    (cherry picked from commit 09432fa5b1cc8e9a30fb8aa4f8dfcd08c4a91e30)

diff --git a/hw/xquartz/quartz.c b/hw/xquartz/quartz.c
index 344edec..3f8f8b9 100644
--- a/hw/xquartz/quartz.c
+++ b/hw/xquartz/quartz.c
@@ -179,7 +179,7 @@ void QuartzInitInput(
     int argc,
     char **argv )
 {
-    X11ApplicationSetCanQuit(1);
+    X11ApplicationSetCanQuit(0);
     X11ApplicationServerReady();
     // Do final display mode specific initialization before handling events
     if (quartzProcs->InitInput)
commit 6d75606a9e7f6ebc4d79a5261a48f5915c71cbcd
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Mon Jun 1 22:58:40 2009 -0700

    Rootless: Despite its name, we still want to allow rootless to mess with the root window
    
    This fixes the bug whereby we weren't drawing the contents of the root window since RootlessPaintWindowBackground got nuked.
    (cherry picked from commit bb0e208787739fbed2a0c8d1af6b6504319fdf88)

diff --git a/miext/rootless/rootlessGC.c b/miext/rootless/rootlessGC.c
index d60cd27..0bd314d 100644
--- a/miext/rootless/rootlessGC.c
+++ b/miext/rootless/rootlessGC.c
@@ -440,26 +440,12 @@ static void RootlessCopyClip(GCPtr pgcDst, GCPtr pgcSrc)
     (pGC)->funcs = saveFuncs; \
     (pGC)->ops = &rootlessGCOps;
 
-/* Turn drawing on the root into a no-op */
-#define GC_IS_ROOT(pDst) ((pDst)->type == DRAWABLE_WINDOW \
-                            && IsRoot ((WindowPtr) (pDst)))
-
-#define GC_SKIP_ROOT(pDst, pGC)			\
-    do {					\
-        if (GC_IS_ROOT (pDst)) {		\
-            GCOP_WRAP(pGC);			\
-            return;				\
-        }					\
-    } while (0)
-
-
 static void
 RootlessFillSpans(DrawablePtr dst, GCPtr pGC, int nInit,
                   DDXPointPtr pptInit, int *pwidthInit, int sorted)
 {
     GC_SAVE(pGC);
     GCOP_UNWRAP(pGC);
-    GC_SKIP_ROOT(dst, pGC);
     RL_DEBUG_MSG("fill spans start ");
 
     if (nInit <= 0) {
@@ -515,7 +501,6 @@ RootlessSetSpans(DrawablePtr dst, GCPtr pGC, char *pSrc,
                  int nspans, int sorted)
 {
     GCOP_UNWRAP(pGC);
-    GC_SKIP_ROOT(dst, pGC);
     RL_DEBUG_MSG("set spans start ");
 
     if (nspans <= 0) {
@@ -566,7 +551,6 @@ RootlessPutImage(DrawablePtr dst, GCPtr pGC,
     BoxRec box;
 
     GCOP_UNWRAP(pGC);
-    GC_SKIP_ROOT(dst, pGC);
     RL_DEBUG_MSG("put image start ");
 
     RootlessStartDrawing((WindowPtr) dst);
@@ -597,12 +581,6 @@ RootlessCopyArea(DrawablePtr pSrc, DrawablePtr dst, GCPtr pGC,
     GC_SAVE(pGC);
     GCOP_UNWRAP(pGC);
 
-    if (GC_IS_ROOT(dst) || GC_IS_ROOT(pSrc))
-    {
-        GCOP_WRAP(pGC);
-        return NULL;			/* nothing exposed */
-    }
-
     RL_DEBUG_MSG("copy area start (src 0x%x, dst 0x%x)", pSrc, dst);
 
     if (pSrc->type == DRAWABLE_WINDOW && IsFramedWindow((WindowPtr)pSrc)) {
@@ -650,12 +628,6 @@ static RegionPtr RootlessCopyPlane(DrawablePtr pSrc, DrawablePtr dst,
 
     GCOP_UNWRAP(pGC);
 
-    if (GC_IS_ROOT(dst) || GC_IS_ROOT(pSrc))
-    {
-        GCOP_WRAP(pGC);
-        return NULL;			/* nothing exposed */
-    }
-
     RL_DEBUG_MSG("copy plane start ");
 
     if (pSrc->type == DRAWABLE_WINDOW && IsFramedWindow((WindowPtr)pSrc)) {
@@ -691,7 +663,6 @@ static void RootlessPolyPoint(DrawablePtr dst, GCPtr pGC,
                               int mode, int npt, DDXPointPtr pptInit)
 {
     GCOP_UNWRAP(pGC);
-    GC_SKIP_ROOT(dst, pGC);
     RL_DEBUG_MSG("polypoint start ");
 
     RootlessStartDrawing((WindowPtr) dst);
@@ -785,7 +756,6 @@ static void RootlessPolylines(DrawablePtr dst, GCPtr pGC,
                               int mode, int npt, DDXPointPtr pptInit)
 {
     GCOP_UNWRAP(pGC);
-    GC_SKIP_ROOT(dst, pGC);
     RL_DEBUG_MSG("poly lines start ");
 
     RootlessStartDrawing((WindowPtr) dst);
@@ -860,7 +830,6 @@ static void RootlessPolySegment(DrawablePtr dst, GCPtr pGC,
                                 int nseg, xSegment *pSeg)
 {
     GCOP_UNWRAP(pGC);
-    GC_SKIP_ROOT(dst, pGC);
     RL_DEBUG_MSG("poly segment start (win 0x%x)", dst);
 
     RootlessStartDrawing((WindowPtr) dst);
@@ -931,7 +900,6 @@ static void RootlessPolyRectangle(DrawablePtr dst, GCPtr pGC,
                                   int nRects, xRectangle *pRects)
 {
     GCOP_UNWRAP(pGC);
-    GC_SKIP_ROOT(dst, pGC);
     RL_DEBUG_MSG("poly rectangle start ");
 
     RootlessStartDrawing((WindowPtr) dst);
@@ -992,7 +960,6 @@ static void RootlessPolyRectangle(DrawablePtr dst, GCPtr pGC,
 static void RootlessPolyArc(DrawablePtr dst, GCPtr pGC, int narcs, xArc *parcs)
 {
     GCOP_UNWRAP(pGC);
-    GC_SKIP_ROOT(dst, pGC);
     RL_DEBUG_MSG("poly arc start ");
 
     RootlessStartDrawing((WindowPtr) dst);
@@ -1048,7 +1015,6 @@ static void RootlessFillPolygon(DrawablePtr dst, GCPtr pGC,
 {
     GC_SAVE(pGC);
     GCOP_UNWRAP(pGC);
-    GC_SKIP_ROOT(dst, pGC);
     RL_DEBUG_MSG("fill poly start (win 0x%x, fillStyle 0x%x)", dst,
                  pGC->fillStyle);
 
@@ -1122,7 +1088,6 @@ static void RootlessPolyFillRect(DrawablePtr dst, GCPtr pGC,
 {
     GC_SAVE(pGC);
     GCOP_UNWRAP(pGC);
-    GC_SKIP_ROOT(dst, pGC);
     RL_DEBUG_MSG("fill rect start (win 0x%x, fillStyle 0x%x)", dst,
                  pGC->fillStyle);
 
@@ -1177,7 +1142,6 @@ static void RootlessPolyFillArc(DrawablePtr dst, GCPtr pGC,
 {
     GC_SAVE(pGC);
     GCOP_UNWRAP(pGC);
-    GC_SKIP_ROOT(dst, pGC);
     RL_DEBUG_MSG("fill arc start ");
 
     if (narcsInit > 0) {
@@ -1232,7 +1196,6 @@ static void RootlessImageText8(DrawablePtr dst, GCPtr pGC,
 {
     GC_SAVE(pGC);
     GCOP_UNWRAP(pGC);
-    GC_SKIP_ROOT(dst, pGC);
     RL_DEBUG_MSG("imagetext8 start ");
 
     if (count > 0) {
@@ -1285,12 +1248,6 @@ static int RootlessPolyText8(DrawablePtr dst, GCPtr pGC,
 
     GCOP_UNWRAP(pGC);
 
-    if (GC_IS_ROOT(dst))
-    {
-        GCOP_WRAP(pGC);
-        return 0;
-    }
-
     RL_DEBUG_MSG("polytext8 start ");
 
     RootlessStartDrawing((WindowPtr) dst);
@@ -1327,7 +1284,6 @@ static void RootlessImageText16(DrawablePtr dst, GCPtr pGC,
 {
     GC_SAVE(pGC);
     GCOP_UNWRAP(pGC);
-    GC_SKIP_ROOT(dst, pGC);
     RL_DEBUG_MSG("imagetext16 start ");
 
     if (count > 0) {
@@ -1380,12 +1336,6 @@ static int RootlessPolyText16(DrawablePtr dst, GCPtr pGC,
 
     GCOP_UNWRAP(pGC);
 
-    if (GC_IS_ROOT(dst))
-    {
-        GCOP_WRAP(pGC);
-        return 0;
-    }
-
     RL_DEBUG_MSG("polytext16 start ");
 
     RootlessStartDrawing((WindowPtr) dst);
@@ -1423,7 +1373,6 @@ static void RootlessImageGlyphBlt(DrawablePtr dst, GCPtr pGC,
 {
     GC_SAVE(pGC);
     GCOP_UNWRAP(pGC);
-    GC_SKIP_ROOT(dst, pGC);
     RL_DEBUG_MSG("imageglyph start ");
 
     if (nglyphInit > 0) {
@@ -1484,7 +1433,6 @@ static void RootlessPolyGlyphBlt(DrawablePtr dst, GCPtr pGC,
                                  CharInfoPtr *ppci, pointer pglyphBase)
 {
     GCOP_UNWRAP(pGC);
-    GC_SKIP_ROOT(dst, pGC);
     RL_DEBUG_MSG("polyglyph start ");
 
     RootlessStartDrawing((WindowPtr) dst);
@@ -1530,7 +1478,6 @@ RootlessPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr dst,
     BoxRec box;
 
     GCOP_UNWRAP(pGC);
-    GC_SKIP_ROOT(dst, pGC);
     RL_DEBUG_MSG("push pixels start ");
 
     RootlessStartDrawing((WindowPtr) dst);
commit 7348bf4935c8887bca33fe340ac2548f551bee3d
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Jun 7 09:25:51 2009 +1000

    dix: set the generic event type for implicit XI2 grabs.
    
    event->type is always GenericEvent for XI2 events. Instead, XI_ButtonPress
    (the generic event's evtype must be stored.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/events.c b/dix/events.c
index 538d6fd..ffeb449 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2093,7 +2093,10 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
         else if (type == DeviceButtonPress)
             tempGrab.grabtype = GRABTYPE_XI;
         else
+        {
+            tempGrab.type = ((xGenericEvent*)pEvents)->evtype;
             tempGrab.grabtype = GRABTYPE_XI2;
+        }
 
         /* get the XI and XI2 device mask */
         inputMasks = wOtherInputMasks(pWin);
commit bb1c131b785ca30cf40041db3513b7669beebd34
Author: Simon Thum <simon.thum at gmx.de>
Date:   Thu May 28 16:43:42 2009 +0200

    dix: suppress pointer acceleration on xtest devices
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/devices.c b/dix/devices.c
index 6266b63..eb54e0a 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1194,7 +1194,9 @@ InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes,
     }
 
     dev->last.numValuators = numAxes;
-    if(IsMaster(dev)) /* master devs do not accelerate */
+
+    if (IsMaster(dev) || /* do not accelerate master or xtest devices */
+	dixLookupPrivate(&dev->devPrivates, XTstDevicePrivateKey ))
 	InitPointerAccelerationScheme(dev, PtrAccelNoOp);
     else
 	InitPointerAccelerationScheme(dev, PtrAccelDefault);
@@ -1226,8 +1228,8 @@ InitPointerAccelerationScheme(DeviceIntPtr dev,
     if(!val)
 	return FALSE;
 
-    if(IsMaster(dev) && (scheme != PtrAccelNoOp))
-        scheme = PtrAccelNoOp; /* no accel for master devices */
+    if(IsMaster(dev) && scheme != PtrAccelNoOp)
+        return FALSE;
 
     for(x = 0; pointerAccelerationScheme[x].number >= 0; x++) {
         if(pointerAccelerationScheme[x].number == scheme){
commit 707b1241681c33401d5e0eb6edeace33f5970928
Author: Simon Thum <simon.thum at gmx.de>
Date:   Sat Mar 21 18:19:19 2009 +0100

    dix: prefer lroundf() over roundf() in axis scaling
    
    it's unclear whether there actually is a problem, but in a very similar
    case there is (bug#21456). Also, integer addition is generally faster.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/getevents.c b/dix/getevents.c
index 83aedbe..9b1908c 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -260,7 +260,7 @@ rescaleValuatorAxis(int coord, AxisInfoPtr from, AxisInfoPtr to,
     if(fmax == fmin) /* avoid division by 0 */
         return 0;
 
-    return roundf(((float)(coord - fmin)) * (tmax - tmin) /
+    return lroundf(((float)(coord - fmin)) * (tmax - tmin) /
                  (fmax - fmin)) + tmin;
 }
 
commit ef0e435052b2fda598cd8670c8e892aea685a102
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Fri Jun 5 19:29:02 2009 +0100

    Cygwin/X: Remove obsolete ChangeLog files
    
    Remove obsolete ChangeLog files, this information is preserved in
    the automatically generated top-level ChangeLog

diff --git a/hw/xwin/ChangeLog b/hw/xwin/ChangeLog
deleted file mode 100644
index aca2ffc..0000000
--- a/hw/xwin/ChangeLog
+++ /dev/null
@@ -1,683 +0,0 @@
-2006-03-03  Alan Hourihane  <alanh at fairlite.demon.co.uk>
-
-	* winprefs.c: (HandleCustomWM_COMMAND):
-	https://bugs.freedesktop.org/show_bug.cgi?id=4341
-	Make Xming error messages more meaningful.
-
-2006-03-03  Alan Hourihane  <alanh at fairlite.demon.co.uk>
-
-	* winmultiwindowwndproc.c: (winTopLevelWindowProc):
-	* winwndproc.c: (winWindowProc):
-	https://bugs.freedesktop.org/show_bug.cgi?id=4538
-	Fix mouse button release on multiwindows scrolling.
-
-2006-03-03  Alan Hourihane  <alanh at fairlite.demon.co.uk>
-
-	* winmultiwindowicons.c: (winXIconToHICON), (winUpdateIcon):
-	* winwin32rootlesswindow.c: (winMWExtWMUpdateIcon):
-	https://bugs.freedesktop.org/show_bug.cgi?id=5138
-	Check for NULL pointer
-
-2005-07-05  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmultiwindowwm.c:
-	Fix crash on server shutdown
-	
-2005-07-05  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winkeybd.c:
-	* winkeybd.h:
-	* winwndproc.c:
-	Fix simultanious presses of Left and Right Control and Shift keys.
-	https://bugs.freedesktop.org/show_bug.cgi?id=3677
-
-2005-07-05  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmultiwindowwm.c:
-	Fix typo which broke window titles
-
-2005-07-05  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmultiwindowwndproc.c:
-	* winkeybd.c:
-	Fix problem with fake Control press on Alt-Gr
-	https://bugs.freedesktop.org/show_bug.cgi?id=3680
-	https://bugs.freedesktop.org/show_bug.cgi?id=3497
-
-	* InitOutput.c:
-	Fix static declaration of winGetBaseDir
-
-2005-07-05  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winwindow.h:
-	* winmultiwindowwm.c:
-	* winscrinit.c:
-	External windowmanagers could connect in multiwindow mode which lead
-	to strange results with the internal windowmanager.
-
-2005-07-05  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* *.c:
-	Include xwin-config.h if HAVE_XWIN_CONFIG is defined
-	Cleanup X11 includes handling
-	Warning fixes
-	
-2005-06-30  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmultiwindowwndproc.c:
-	Pass serverClient instead of NULL to ConfigureWindow.
-	This should fix a crash reported by Øyvind Harboe
-
-2005-06-08  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winlayouts.h:
-	Merge from CYGWIN
-	Added layout "French (Canada)" as ca_enhanced 
-	Added Czech (QWERTY) layout
-	* winshaddnl.c:
-	Merge from CYGWIN
-	Print error code if winStoreColorsShadowDDNL fails
-
-2005-06-08  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmultiwindowwindow.c:
-	Fix crash reported by Øyvind Harboe
-
-2005-06-03  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmultiwindowwndproc.c:
-	* winblock.c:
-	Backout last winRaiseWindow patch which caused stacking problems
-
-2005-05-25  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* win.h:
-	* winmultiwindowwm.c:
-	Workaround bug in pthread.h
-
-2005-05-08  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmultiwindowwndproc.c:
-	* winblock.c:
-	Only call ConfigureWindow from winRaiseWindow if the windows
-	message dispatch loop is running.
-
-2005-05-02  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winerror.c:
-	Print correct logfile in FatalError message
-
-2005-04-19  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmultiwindowwndproc.c:
-	Prevent recursive calls to winRaiseWindow. 
-
-2005-03-10  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmultiwindowwndproc.c:
-	Force rebuilding of window stack if a window changes it's state from 
-	minimized.
-
-2005-03-07  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmultiwindowwndproc.c:
-	* winmultiwindowwindow.c:
-	Prevent winRaiseWindow from calling ConfigureWindow if the message
-	was sent from within winDestroyWindowsWindow
-
-	DestroyWindow send a WM_WINDOWPOSCHANGED to another window causing
-	a restacking of all windows, even of the window which is just about
-	to destroyed and whose structures may not be intact anymore.
-
-2005-02-24  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmultiwindowwndproc.c:
-	on WM_WINDOWPOSCHANGED raise window directly and in sync without 
-	utilizing the async windowmanager thread. Fixes some restacking 
-	problems occuring which were timing dependent
-	Do not raise the window on WM_ACTIVATE
-	Removed unused code for WM_WINDOWPOSCHANGING
-	ESC is debug key. Print status but do not abort processing the message
-	
-2005-02-12  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmultiwindowwindow.c
-	* winmultiwindowwndproc.c
-	* winwin32rootlesswndproc.c:
-	Cleanup some message debugging
-	
-2005-02-12  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* win.h
-	* winfont.c
-	* winmultiwindowshape.c
-	* winmultiwindowwindow.c
-	* winpfbdd.c
-	* winshaddd.c
-	* winshadddnl.c
-	* winshadgdi.c
-	* winwindow.c:
-	Fix incorrect wrapping of functions. Ensure the pointers from pScreen 
-	point to the called function even if wrapped functions changed it
-	
-	* winmultiwindowwindow.c:
-	Set the window properties to NULL to avoid referencing freed memory 
-	because of timing problems after deleting a window
-
-	* winscrinit.c:
-	Do not wrap ChangeWindowAttributes. All functions are noops currently
-	
-2005-02-12  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmsg.h:
-	* winmsg.c:
-	print window handle in message output
-	
-2005-02-08  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winkeybd.c:
-	* winkeynames.h:
-	Updated fix for ABNT2 and HK_Toggle keys. 
-
-2005-02-08  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winkeybd.h:
-	* winkeynames.h:
-	Backout ABNT2 and HK_Toggle fix since it broke keys F1 and F4. 
-
-2005-02-07  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winlayouts.h:
-	* winconfig.c:
-	Moved keyboard layout table to external file.
-
-2005-02-02  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* wincreatewnd.c:
-	Force ShowWindow if XWin was started via run.exe. Fixes mainwindow
-	not showing bug
-
-2005-01-31  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmultiwindowwindow.c
-	* winmultiwindowwndproc.c:
-	Create windows with SWP_NOACTIVATE flag (updated) (Kensuke Matsuzaki)
-
-2005-01-31  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmultiwindowwndproc.c:
-	Fixes for window ordering problem (updated) (Kensuke Matsuzaki)
-
-2005-01-31  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winconfig.c:
-	Added hungarian keyboard layout.
-
-2005-01-31  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmessages.h
-	* winmsg.h
-	* winmsg.c
-	* winmultiwindowwndproc.c
-	* winwin32rootlesswndproc.c
-	* winwndproc.c:
-	Make logging of messages configurable with environment variables
-
-2005-01-31  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* InitOutput.c:
-	resolve SHGetFolderPath dynamicly since it is not available on all Windows 
-	systems.
-
-2005-01-12  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmsg.c
-	* winmsg.h:
-	Introduce function winTrace which prints log message with verbosity 10
-	* winmultiwindowwindow.c:
-	Use winTrace for 3 heavily called functions
-
-2005-01-11  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* XWin.man:
-	Document the -silent-dup-error switch
-
-2005-01-11  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winkeyhook.c:
-	Do not grab ALT-TAB when window is in multiwindow mode
-	
-2005-01-11  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winprefs.h:
-	Fix crash with not matching definitions of PATH_MAX
-	
-2005-01-10  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winkeybd.h
-	* winkeynames.h:
-	Adjust keysyms for  Hiragana_Katakana toggle and backslash/underscore
-	on Japanese and ABNT2 keyboards
-
-2005-01-10  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winkeybd.h
-	* winkeyhook.c
-	* winwndproc.c:
-	Make keyhook feature work in multiwindowmode too
-	Hook windows keys
-
-2005-01-08  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winblock.c:
-	Fix a possible null-pointer dereference	(Keishi Suenaga)
-
-2005-01-06  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* Imakefile 
-	* InitOutput.c 
-	* XWin.rc 
-	* winerror.c 
-	* wintrayicon.c 
-	* winvideo.c
-	* winshaddd.c       	
-	* winwindow.h:
-	Set PROJECT_NAME in Imakefile to create alternative window titles 
-	for Cygwin/X and Xming
-	
-2005-01-06  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmultiwindowclass.c:
-	* winmultiwindowwm.c:
-	Fix crash with non-nullterminated strings (reported by Øyvind Harboe)
-
-2004-12-14  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* InitOutput.c:
-	* winprocarg.c:
-	EnumDisplayMonitors is not available on Window NT4 and 95. Resolve
-	the function dynamicly
-
-2004-12-08  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* InitOutput.c:
-	* winprocarg.c:
-	Added support for placing the main window with the @<monitor#>.
-	Patch by Mark Fisher, small changes by Alexander Gottwald
-	
-2004-12-06  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* XWin.rc:
-	include windows.h
-
-2004-12-05  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* ddraw.h:
-	redone ddraw.h to be able to mix it with w32api style COM header 
-	files. 
-	
-	* winmultiwindowwm.c:
-	* obj_base.h:
-	* ddraw.h:
-	obj_base.h is not needed anymore. Using <objbase.h> instead.
-
-	* winms.h:
-	Use Xwindows.h instead of windows.h
-
-	* winresource.h:
-	do not include win_ms.h
-	
-	* win.h:
-	remove extra definition of sleep()
-
-	* InitOutput.c:
-	Set HOME to Documents and Settings/username if not set
-	
-	* winprefs.c:
-	Use Xming basedir instead of ProjectRoot for system.XWinrc
-
-	* windialogs.c:
-	* winshadgdi.c:
-	* winprefs.c:
-	Fix callback functions to use wBOOL instead of BOOL
-
-	* winmultiwindowwindow.c:
-	* winwin32rootless.c:
-	* winwin32rootlesswindow.c:
-	* winerror.c:
-	Fix compiler warnings. Added debug output.
-
-	* winconfig.c:
-	Fix warning about undefined macro max
-	
-2004-12-04  Earle Philhower
-
-	* InitOutput.c:
-	* win.h:
-	* wincreatewnd.c:
-	* winprocarg.c:
-	Optional position -screen parameter (-screen n WxH+X+Y or 
-	-screen n W H X Y)
-
-2004-12-03  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* windialogs.c:
-	* win.h:
-	* Imakefile:
-	* winerror.c:
-	Removed scprintf, aprintf and snprintf stuff and use newXprintf
-
-2004-12-02  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winwin32rootless.c:
-	Adjust the width of the rootless backbuffer to match 32 bit alignment
-
-	* winprocarg.c:
-	Make multiplemonitors default for -internalwm
-
-2004-12-01  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* InitOutput.c:
-	Set XERRORDB environment variable to relocate the XErrorDB file
-
-2004-11-29  Kensuke Matsuzaki  <zakki at peppermint.jp>
-
-	* winmultiwindowwm.c:
-	Fixed windows.h include for cygwin.
-	
-	* winmultiwindowwindow.c:
-	Bugzilla #1945: Stop unnecessary reordering.
-
-2004-11-24  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmultiwindowwm.c:
-	Finally the multiwindow mode defines a default cursor
-
-2004-11-22  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmultiwindowwm.c: 
-	Fixes for building multiwindow and internalwm on mingw
-	* winwin32rootless.c:
-	Changed some debugging output
-
-2004-11-22  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* InitOutput.c, winglobals.c, winprocarg.c:
-	Xming: Place logfile in users tempdir
-	
-2004-11-15  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* Imakefile:
-	Remove override of HasSnprintf
-
-2004-11-15  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* Imakefile:
-	* InitInput.c: (InitInput):
-	* InitOutput.c: (winClipboardShutdown), (ddxGiveUp),
-	(winCheckMount), (winGetBaseDir), (winFixupPaths), (OsVendorInit),
-	(winCheckDisplayNumber):
-	* win.h:
-	* winblock.c: (winBlockHandler):
-	* winclipboard.h:
-	* winclipboardthread.c: (winClipboardProc):
-	* winclipboardwndproc.c: (winClipboardWindowProc):
-	* winconfig.c: (winConfigKeyboard), (winConfigFiles):
-	* wincreatewnd.c: (winCreateBoundingWindowWindowed):
-	* windialogs.c: (winDisplayExitDialog), (winExitDlgProc),
-	(winAboutDlgProc):
-	* winengine.c: (winSetEngine):
-	* winerror.c: (OsVendorVErrorF), (winMessageBoxF), (scprintf):
-	* winglobals.c: (winInitializeGlobals):
-	* winkeybd.c: (winKeybdReleaseKeys):
-	* winmultiwindowicons.c:
-	* winmultiwindowwindow.c: (winCreateWindowsWindow):
-	* winmultiwindowwm.c:
-	* winprefs.c: (ReloadPrefs), (HandleCustomWM_COMMAND):
-	* winprocarg.c: (ddxProcessArgument):
-	* winscrinit.c: (winFinishScreenInitFB):
-	* winshadddnl.c:
-	* wintrayicon.c: (winHandleIconMessage):
-	* winwakeup.c: (winWakeupHandler):
-	* winwin32rootless.c: (winMWExtWMCreateFrame):
-	* winwindow.c: (winReshapeRootless):
-	* winwindow.h:
-	* winwndproc.c: (winWindowProc):
-	Bufzilla #1802, http://freedesktop.org/bugzilla/show_bug.cgi?id=1802
-	Added mingw (Win32) port     
-
-2004-11-11  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winconfig.c:
-	added keyboard layout "French (Switzerland)"
-
-2004-11-06  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winwndproc.c, wintrayicon.c, winscrinit.c:
-	* winmultiwindowwindow.c:
-	Wrap all mwextwm and internalwm code with XWIN_MULTIWINDOWEXTWM
-
-2004-11-04  Kensuke Matsuzaki  <zakki at peppermint.jp>
-
-	* InitOutput.c: (winUseMsg):
-	* win.h:
-	* winmultiwindowwindow.c: (winMinimizeWindow):
-	* winmultiwindowwm.c: (PushMessage), (UpdateName),
-	(PreserveWin32Stack), (winMultiWindowWMProc),
-	(winMultiWindowXMsgProc), (winInitWM), (winInitMultiWindowWM),
-	(CheckAnotherWindowManager):
-	* winprocarg.c: (winInitializeDefaultScreens),
-	(ddxProcessArgument):
-	* winscrinit.c: (winFinishScreenInitFB):
-	* wintrayicon.c: (winHandleIconMessage):
-	* winwin32rootless.c: (InitWin32RootlessEngine),
-	(winMWExtWMResizeFrame), (winMWExtWMRestackFrame),
-	(winMWExtWMStartDrawing), (winMWExtWMRootlessSwitchWindow),
-	(winMWExtWMSetNativeProperty):
-	* winwin32rootlesswindow.c: (winMWExtWMReorderWindows),
-	(winMWExtWMDecorateWindow), (winMWExtWMUpdateWindowDecoration),
-	(winIsInternalWMRunning), (winMWExtWMRestackWindows):
-	* winwin32rootlesswndproc.c: (winMWExtWMWindowProc):
-	* winwindow.h:
-	* winwndproc.c: (winWindowProc):
-	Add internalwm mode.
-
-2004-10-28  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* win.h:
-	add fRetryCreateSurface
-	* winshaddnl.c (winBltExposedRegionsShadowDDNL):
-	try to recreate the primary surface if it was lost
-	* winshaddnl.c (winCreatePrimarySurfaceShadowDDNL):
-	mark screen to retry creating the primary surface if it failed
-
-2004-10-23  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winconfig (winConfigFiles):
-	Simplify /etc/X11/font-dirs parsing
-
-2004-10-20  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* XWin.rc, winresource.h, winwndproc.c:
-	Add ShowCursor entry to tray menu 
-
-2004-10-20  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* Imakefile:
-	Add ETCX11DIR to DEFINES
-	* InitOutput.c (InitOutput):
-	* winconfig.c (winConfigFiles) :
-	Add entries from /etc/X11/font-dirs to default fontpath
-
-2004-10-16  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winprocarg.c (winInitializeDefaultScreens, ddxProcessArgument):
-	* win.h:
-	Make multiple monitors default for -multiwindow and -mwextwm.
-	Added a flag to indicate if the user has overridden the multimonitor
-	settings. (Øyvind Harboe, Alexander Gottwald)
-
-2004-10-07  Torrey Lyons  <torrey at freedesktop dot org>
-
-	* winscrinit.c:
-	Add compatibility with the generic rootless layer's new
-	DoReorderWindow function.
-
-2004-10-05  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* XWin.rc:
-	Set the dialogstyle to DS_CENTERMOUSE. Dialogs will now popup on the
-	monitor where the mouse is and not on the center of the whole desktop.
-
-2004-10-02  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winmouse.c (winMouseProc):
-	Make sure buttons 1-3 are mouse buttons and wheel events are 4-5
-	Document code
-	Replace ErrorF with appropriate winMsg
-	use a symbolic name for the wheel event offset
-	
-2004-10-01  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* wincreatewnd.c (winCreateBoundingWindowWindowed):
-	Do not adjust workarea if native windowmanager is used
-
-2004-09-22  Kensuke Matsuzaki
-
-	* winclipboardthread.c (winClipboardErrorHandler):
-	* winclipboardwndproc.c (winClipboardWindowProc):
-	* winclipboardxevents.c (winClipboardFlushXEvents):
-	Fix clipboard bug with unicode applications.
-	
-2004-09-17  Torrey Lyons  <torrey at freedesktop dot org>
-
-	* winscrinit.c: (winFinishScreenInitFB):
-	Bugzilla #1032: Make rootless acceleration functions compatible with
-	Damage.
-
-2004-09-16  Alexander Gottwald <ago at freedesktop dot org>
-
-	* wincreatewnd.c (winCreateBoundingWindowWindowed):
-	Remove code which prevented the use from specifying the window
-	size in nodecoration mode. 	
-
-2004-08-26  Chris B  <news at sempermax dot com>
-
-	* win.h, winmessages.h:
-	Add defines for WM_XBUTTON
-	* winmouse.c (winMouseProc):
-	Query number of mouse buttons from windows. 
-	* winmultiwindowwndproc.c (winTopLevelWindowProc):
-	* winwin32rootlesswndproc.c (winMWExtWMWindowProc):
-	* winwndproc.c (winWindowProc):
-	Handle WM_XBUTTON messages.  
-
-2004-08-02  Kensuke Matsuzaki
-
-	* winclipboardthread.c winclipboardwndproc.c: 
-	* winclipboardxevents.c winwin32rootlesswndproc.c:
-	Fix the bug that we can't copy & paste multi-byte string to
-	Unicode-base Windows application.  Rename fUnicodeSupport to
-	fUseUnicode, because it don't mean wheather Windows support
-	Unicode or not.
-	
-2004-07-31  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* win.h:
-	adjust prototype for winInitCmapPrivates to match Egberts change.	
-
-2004-07-30  Egbert Eich  <eich at freedesktop dot org>
-
-	* winallpriv.c: (winInitCmapPrivates):
-	test if colormap with index really exists in the list of
-	installed maps before using it.
-
-2004-07-09  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winconfig.c: Add entry for irish layout (ie)
-	* InitOutput.c, winerror.c, winglobals.c: rename g_fUseMsg to 
-	g_fSilentFatalError
-	* InitOutput.c, winglobals.c, winprocarg.c: added commandline option 
-	-silent-dup-error to allow silent termination if another instance of
-	XWin was found running
-
-2004-06-27  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winconfig.c: Add entry for us layout. This changes not much but 
-	removes a strange error message about the unknown us layout. 
-
-2004-06-24  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* InitOutput.c: Check for textmode mounted /tmp and print a warning
-
-2004-06-15  Harold Hunt  <huntharo at msu dot edu>
-
-	* windialogs.c: Fix path to locally installed changelog for the About 
-	dialog box.
-
-2004-05-27  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* winpriv.c: Create win32 window if not already created
-	* winmultiwindowwindow.c: Export winCreateWindowWindow
-
-2004-05-27  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* win.h: Allow CYGDEBUG to defined in the Makefile
-	* winwindow.h: Allow CYGWINDOWING_DEBUG to defined in the Makefile
-
-2004-05-19  Alexander Gottwald  <ago at freedesktop dot org>
-	
-	* winmultiwindowicons.c (winInitGlobalIcons): Load the small default
-	icon too
-	* winprefs.h, winprefs.c (winOverrideDefaultIcon): Takes the iconsize
-	as parameter
-
-2004-05-19  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* win.h, winmultiwindowicons.c (winXIconToHICON): Takes iconsize
-	as parameter 
-	* winglobals.c, winmultiwindowicons.c: Rename g_hiconX to g_hIconX.
-	Added new variable g_hSmallIconX for 16x16 icon.
-	* winwindow.h, winmultiwindowicons.c (winInitGlobalIcons): Inits the 
-	global g_hIconX handles.
-	* winwindow.h, winmultiwindowicons.c (winDestroyIcon): Free the icon
-	without messing with the global icon handle. 
-	* winmultiwindowicons.c (winSelectIcons): Generate a custom icon from
-	window settigns or set them to globals.
-	* winmultiwindowshape.c, winmultiwindowwindow.c, winwin32rootless.c,
-	  winwin32rootlesswindow.c, winwin32rootlesswndproc.c: Remove 
-	declaration of g_hiconX;
-	* winmultiwindowwindow.c (winCreateWindowsWindow),
-	  winwin32rootless.c (winMWExtWMCreateFrame): Use winSelectIcons 
-	to get the window icons. Set the small icon too.
-	* winmultiwindowwindow.c (winDestroyWindowsWindow),
-	  winmultiwindowicons.c (winUpdateIcon), 
-	  winprefs.c (ReloadEnumWindowsProc),
-	  winwin32rootlesswindow.c (winMWExtWMUpdateIcon),
-	  winwin32rootless.c (winMWExtWMDestroyFrame): Use winDestroyIcon
-	to free the icon without destroying the global icon.  
-	  
-2004-05-17  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* windialogs.c (winExitDlgProc, winAboutDlgProc),
-	  winmultiwindowwndproc.c (winTopLevelWindowProc),
-	  winwndproc.c (winWindowProc): Check if g_fSoftwareCursor is set 
-	before calling ShowCursor.  
-
-2004-05-09  Dan Wilks  <Dan_Wilks at intuit dot com>
-    
-	* winclipboard.h: Add extern prototypes for winDebug, winErrorFVerb
-	copied from winmsg.h.
-	* winclipboardinit.c (winFixClipboardChain): Post rather than send the
-	reinit message to the clipboard window.  Sending the message caused,
-	or possibly just exacerbated an existing, race condition that would
-	cause the X server to hang when coming back from a remote desktop
-	session.
-	* winclipboardwndproc.c (winProcessXEventsTimeout): switch to new
-	logging api's.
-	* winclipboardwindproc.c (winClipboardWindowProc): switch to new 
-	logging api's.  Add some additional debug logging.  Make best effort 
-	to prevent our window appearing twice in the clipboard chain.  Also 
-	detect loops when they occur and try to behave in a reasonable way.
-
-# vim:ts=8:noexpandtab:encoding=utf8        
diff --git a/hw/xwin/Makefile.am b/hw/xwin/Makefile.am
index 4f95130..0ecb526 100644
--- a/hw/xwin/Makefile.am
+++ b/hw/xwin/Makefile.am
@@ -169,7 +169,6 @@ AM_CFLAGS = -DHAVE_XWIN_CONFIG_H $(DIX_CFLAGS) \
 dist_man1_MANS = XWin.man XWinrc.man
 
 GLX_EXTRAS = \
-	glx/ChangeLog \
 	glx/glwindows.h \
 	glx/glwrap.c \
 	glx/indirect.c
diff --git a/hw/xwin/glx/ChangeLog b/hw/xwin/glx/ChangeLog
deleted file mode 100644
index 43a817d..0000000
--- a/hw/xwin/glx/ChangeLog
+++ /dev/null
@@ -1,64 +0,0 @@
-2005-09-27  Ian Romanick  <idr at us.ibm.com>
-
-	* indirect.c:
-	Remove __glEvalComputeK.  It is no longer used.	
-
-
-2005-04-09  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* indirect.c:
-	Fix passing of non-RGB visuals. The old code did not initialize the
-	structure properly which lead to a crash in 8bpp mode
-
-2005-03-01  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* indirect.c:
-	* glwindows.h:
-	If a context is already attached copy it instead of reattaching to keep
-	displaylists and share displaylists
-	Enable tracing of often called functions with GLWIN_ENABLE_TRACE        
-	ForceCurrent is a no-op now
-
-2005-02-02  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* Imakefile: 
-	Bugzilla #1866 (https://bugs.freedesktop.org/show_bug.cgi?id=1866)
-	attachment #1819 (https://bugs.freedesktop.org/attachment.cgi?id=1819):
-	Define APIENTRY on windows to prevent <GL/gl.h> from loading <windows.h>
-
-2005-02-02  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* glwrap.c:
-	* glwindows.h:
-	Bugzilla #1866 (https://bugs.freedesktop.org/show_bug.cgi?id=1866)
-	attachment #1818 (https://bugs.freedesktop.org/attachment.cgi?id=1818):
-	Include Xwindows.h before GL/gl.h to prevent loading windows.h which
-	pollutes our namespace with some symbols.    
-
-2005-01-27  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* glwrap.c:
-	Functions like glGenTextures and glBindTexture are in OpenGL 1.1
-	and can be resolved at linktime.
-
-2004-11-15  Alexander Gottwald  <ago at freedesktop dot org>
-
-	* indirect.c:
-	Bugzilla #1802, http://freedesktop.org/bugzilla/show_bug.cgi?id=1802
-	Added mingw (Win32) port     
-
-2004-08-13  Alexander Gottwald  <ago at freedesktop.org>
-
-	* Imakefile: Added $(MESASRCDIR)/src/mesa/glapi to INCLUDES.
-	Removed $(SERVERSRC)/mi from INCLUDES.
-	Rearranged INCLUDES for better readability.
-	* glwindows.h: Removed mipointrst.h and miscstruct.h from #include 
-	since they are not used anymore.
-
-2004-05-27  Alexander Gottwald  <ago at freedesktop.org>
-
-	* glwindows.h: write current function and line in debug output
-	* indirect.c: moved actual setup and creation of windows GL context to 
-	glWinCreateContextReal. 
-	* indirect.c (glWinCreateContext): Deferred context creation to attach.   
-	* indirect.c (glWinMakeCurrent): Check if context is NULL. Fixes segfault.
commit 752508577aa7f0a1d80c8b7f4d3fe2b098e5e5fa
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Tue Jun 2 21:19:46 2009 +0100

    Cygwin/X: Tidy up a bodge to avoid collision between X header and native Win32 API definitions of ATOM
    
    Remove a bodge to avoid collision between X header and the native
    Win32 API definitions of ATOM, use X11/Xwindows.h which exists to
    address these issues
    
    Consequently, include misc.h in winclipboardthread.c, to provide the
    max() macro, as previously we were using the the one from windows.h
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/winclipboard.h b/hw/xwin/winclipboard.h
index 0602229..089c291 100644
--- a/hw/xwin/winclipboard.h
+++ b/hw/xwin/winclipboard.h
@@ -48,27 +48,12 @@
 /* X headers */
 #include <X11/X.h>
 #include <X11/Xatom.h>
-/* NOTE: For some unknown reason, including Xproto.h solves
- * tons of problems with including windows.h.  Unknowns reasons
- * are usually bad, so someone should investigate this.
- */
 #include <X11/Xproto.h>
 #include <X11/Xutil.h>
 #include <X11/Xlocale.h>
 
-/* Fixups to prevent collisions between Windows and X headers */
-#define ATOM			DWORD
-
-#ifndef __CYGWIN__
-#define sleep(x) Sleep (1000 * (x))
-#endif
-
 /* Windows headers */
-#ifndef XFree86Server
-#define XFree86Server
-#endif
-#include <windows.h>
-#undef XFree86Server
+#include <X11/Xwindows.h>
 
 
 /* Clipboard module constants */
diff --git a/hw/xwin/winclipboardthread.c b/hw/xwin/winclipboardthread.c
index 9040f40..8eb825f 100644
--- a/hw/xwin/winclipboardthread.c
+++ b/hw/xwin/winclipboardthread.c
@@ -39,6 +39,7 @@
 #include <errno.h>
 #endif
 #include "X11/Xauth.h"
+#include "misc.h"
 
 
 /*
commit 7f3456a4080d1bf21010170e126128cb653bd2ac
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jun 5 16:44:46 2009 +1000

    Revert "test: check from INT_MIN to INT_MAX for core type conversion"
    
    This patch requires extra special casing to check if the linker supports the
    -wrap option. Patches to do so will follow, in the meantime, revert this
    commit. It shouldn't have been pushed in the first place anyway.
    
    This reverts commit d979f443946011158b6a183582728a6899c33b85.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/test/Makefile.am b/test/Makefile.am
index 57a31c2..dbad93b 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -10,7 +10,6 @@ TEST_LDADD=libxservertest.la $(XORG_SYS_LIBS) $(XSERVER_SYS_LIBS) $(GLIB_LIBS)
 
 xkb_LDADD=$(TEST_LDADD)
 input_LDADD=$(TEST_LDADD)
-input_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,ErrorF
 
 libxservertest_la_LIBADD = \
             $(XSERVER_LIBS) \
diff --git a/test/input.c b/test/input.c
index dcce719..b80e1f5 100644
--- a/test/input.c
+++ b/test/input.c
@@ -40,10 +40,6 @@
 
 #include <glib.h>
 
-void __wrap_ErrorF(const char *f, ...)
-{
-}
-
 /**
  * Init a device with axes.
  * Verify values set on the device.
@@ -258,36 +254,36 @@ static void dix_event_to_core_conversion(void)
 {
     DeviceEvent ev;
     xEvent core;
-    int rc, i;
+    int rc;
 
     ev.header   = 0xFF;
     ev.length   = sizeof(DeviceEvent);
 
-    for (i = INT_MIN; i < INT_MAX; i++)
-    {
-        switch(i)
-        {
-            case ET_KeyPress:
-            case ET_KeyRelease:
-            case ET_ButtonPress:
-            case ET_ButtonRelease:
-            case ET_Motion:
-                dix_event_to_core(i);
-                break;
-            case ET_Raw:
-            case ET_ProximityIn:
-            case ET_ProximityOut:
-                ev.type = i;
-                rc = EventToCore((InternalEvent*)&ev, &core);
-                g_assert(rc == BadMatch);
-                break;
-            default:
-                ev.type = i;
-                rc = EventToCore((InternalEvent*)&ev, &core);
-                g_assert(rc == BadImplementation);
-                break;
-        }
-    }
+    ev.type     = 0;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    g_assert(rc == BadImplementation);
+
+    ev.type     = 1;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    g_assert(rc == BadImplementation);
+
+    ev.type     = ET_ProximityOut + 1;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    g_assert(rc == BadImplementation);
+
+    ev.type     = ET_ProximityIn;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    g_assert(rc == BadMatch);
+
+    ev.type     = ET_ProximityOut;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    g_assert(rc == BadMatch);
+
+    dix_event_to_core(ET_KeyPress);
+    dix_event_to_core(ET_KeyRelease);
+    dix_event_to_core(ET_ButtonPress);
+    dix_event_to_core(ET_ButtonRelease);
+    dix_event_to_core(ET_Motion);
 }
 
 static void xi2_struct_sizes(void)
commit d770d57f1701c7c8272b4ca3714f64c46c47adf1
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jun 5 11:38:22 2009 +1000

    Xi: fix XIQueryVersion major/minor swapping.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/queryversion.c b/Xi/queryversion.c
index 230e207..4d644a9 100644
--- a/Xi/queryversion.c
+++ b/Xi/queryversion.c
@@ -112,7 +112,7 @@ SProcXIQueryVersion(ClientPtr client)
     swaps(&stuff->length, n);
     REQUEST_AT_LEAST_SIZE(xXIQueryVersionReq);
     swaps(&stuff->major_version, n);
-    swaps(&stuff->major_version, n);
+    swaps(&stuff->minor_version, n);
     return (ProcXIQueryVersion(client));
 }
 
commit 17d62306b602ec61e8c5b44a79c9e1edc6b63a21
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jun 5 11:31:39 2009 +1000

    Xi: add XIQueryVersion reply swapping hook.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/extinit.c b/Xi/extinit.c
index 23704b1..549c5ca 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -511,6 +511,8 @@ SReplyIDispatch(ClientPtr client, int len, xGrabDeviceReply * rep)
 	SRepXIQueryPointer(client, len, (xXIQueryPointerReply *) rep);
     else if (rep->RepType == X_XIGetClientPointer)
         SRepXIGetClientPointer(client, len, (xXIGetClientPointerReply*) rep);
+    else if (rep->RepType == X_XIQueryVersion)
+        SRepXIQueryVersion(client, len, (xXIQueryVersionReply*)rep);
     else if (rep->RepType == X_XIQueryDevice)
         SRepXIQueryDevice(client, len, (xXIQueryDeviceReply*)rep);
     else if (rep->RepType == X_XIGrabDevice)
commit 2b459f44f3edaea137df9a28bc7adfeb1b9f1df7
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jun 5 10:15:04 2009 +1000

    Xi: return BadImplementation for deviceids 256 and above
    
    The protocol allows for 16 bit device ids, but the implementation doesn't
    yet. We need to break the input ABI once more to shift the DeviceIntRec's
    CARD8 to a CARD16, along with some changes in the privates.
    
    Once that is done, revert this patch.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/chdevcur.c b/Xi/chdevcur.c
index fdea106..9dba78b 100644
--- a/Xi/chdevcur.c
+++ b/Xi/chdevcur.c
@@ -74,6 +74,12 @@ int ProcXIChangeCursor(ClientPtr client)
     REQUEST(xXIChangeCursorReq);
     REQUEST_SIZE_MATCH(xXIChangeCursorReq);
 
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
+
     rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixSetAttrAccess);
     if (rc != Success)
         return rc;
diff --git a/Xi/chdevhier.c b/Xi/chdevhier.c
index 927df55..bd3da08 100644
--- a/Xi/chdevhier.c
+++ b/Xi/chdevhier.c
@@ -238,6 +238,12 @@ ProcXIChangeHierarchy(ClientPtr client)
                             r->return_mode != XIFloating)
                         return BadValue;
 
+                    if (r->deviceid > 0xFF) /* FIXME */
+                    {
+                        client->errorValue = r->deviceid;
+                        return BadImplementation;
+                    }
+
                     rc = dixLookupDevice(&ptr, r->deviceid, client,
                                          DixDestroyAccess);
                     if (rc != Success)
@@ -338,6 +344,12 @@ ProcXIChangeHierarchy(ClientPtr client)
                                      newptr,
                                      newkeybd;
 
+                        if (r->return_pointer > 0xFF) /* FIXME */
+                        {
+                            client->errorValue = r->deviceid;
+                            return BadImplementation;
+                        }
+
                         rc = dixLookupDevice(&newptr, r->return_pointer,
                                              client, DixWriteAccess);
                         if (rc != Success)
@@ -350,6 +362,12 @@ ProcXIChangeHierarchy(ClientPtr client)
                             goto unwind;
                         }
 
+                        if (r->return_keyboard > 0xFF) /* FIXME */
+                        {
+                            client->errorValue = r->deviceid;
+                            return BadImplementation;
+                        }
+
                         rc = dixLookupDevice(&newkeybd, r->return_keyboard,
                                              client, DixWriteAccess);
                         if (rc != Success)
@@ -413,6 +431,12 @@ ProcXIChangeHierarchy(ClientPtr client)
                     xXIDetachSlaveInfo* c = (xXIDetachSlaveInfo*)any;
                     DeviceIntPtr *xtstdevice;
 
+                    if (c->deviceid > 0xFF) /* FIXME */
+                    {
+                        client->errorValue = c->deviceid;
+                        return BadImplementation;
+                    }
+
                     rc = dixLookupDevice(&ptr, c->deviceid, client,
                                           DixWriteAccess);
                     if (rc != Success)
@@ -446,6 +470,17 @@ ProcXIChangeHierarchy(ClientPtr client)
                     DeviceIntPtr newmaster;
                     DeviceIntPtr *xtstdevice;
 
+                    if (c->deviceid > 0xFF) /* FIXME */
+                    {
+                        client->errorValue = c->deviceid;
+                        return BadImplementation;
+                    }
+                    if (c->new_master > 0xFF) /* FIXME */
+                    {
+                        client->errorValue = c->new_master;
+                        return BadImplementation;
+                    }
+
                     rc = dixLookupDevice(&ptr, c->deviceid, client,
                                           DixWriteAccess);
                     if (rc != Success)
diff --git a/Xi/querydev.c b/Xi/querydev.c
index 0d661a9..a44cf22 100644
--- a/Xi/querydev.c
+++ b/Xi/querydev.c
@@ -70,6 +70,12 @@ ProcXIQueryDevice(ClientPtr client)
     REQUEST(xXIQueryDeviceReq);
     REQUEST_SIZE_MATCH(xXIQueryDeviceReq);
 
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
+
     if (stuff->deviceid != XIAllDevices && stuff->deviceid != XIAllMasterDevices)
     {
         rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
diff --git a/Xi/querydp.c b/Xi/querydp.c
index 2e2cfaa..bc6feb1 100644
--- a/Xi/querydp.c
+++ b/Xi/querydp.c
@@ -81,6 +81,12 @@ ProcXIQueryPointer(ClientPtr client)
     REQUEST(xXIQueryPointerReq);
     REQUEST_SIZE_MATCH(xXIQueryPointerReq);
 
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
+
     rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixReadAccess);
     if (rc != Success)
         return rc;
diff --git a/Xi/setcptr.c b/Xi/setcptr.c
index 0bfc1ea..ba76246 100644
--- a/Xi/setcptr.c
+++ b/Xi/setcptr.c
@@ -69,6 +69,11 @@ ProcXISetClientPointer(ClientPtr client)
     REQUEST(xXISetClientPointerReq);
     REQUEST_SIZE_MATCH(xXISetClientPointerReq);
 
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
 
     rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixWriteAccess);
     if (rc != Success)
diff --git a/Xi/warpdevp.c b/Xi/warpdevp.c
index 025a4ce..bb45bda 100644
--- a/Xi/warpdevp.c
+++ b/Xi/warpdevp.c
@@ -76,6 +76,12 @@ ProcXIWarpPointer(ClientPtr client)
     REQUEST(xXIWarpPointerReq);
     REQUEST_SIZE_MATCH(xXIWarpPointerReq);
 
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
+
     /* FIXME: panoramix stuff is missing, look at ProcWarpPointer */
 
     rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixWriteAccess);
diff --git a/Xi/xiallowev.c b/Xi/xiallowev.c
index 3077e1a..dd52c53 100644
--- a/Xi/xiallowev.c
+++ b/Xi/xiallowev.c
@@ -65,6 +65,12 @@ ProcXIAllowEvents(ClientPtr client)
     REQUEST(xXIAllowEventsReq);
     REQUEST_SIZE_MATCH(xXIAllowEventsReq);
 
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
+
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
     if (ret != Success)
 	return ret;
diff --git a/Xi/xigrabdev.c b/Xi/xigrabdev.c
index 95beb83..a825a89 100644
--- a/Xi/xigrabdev.c
+++ b/Xi/xigrabdev.c
@@ -70,6 +70,9 @@ ProcXIGrabDevice(ClientPtr client)
     REQUEST(xXIGrabDeviceReq);
     REQUEST_AT_LEAST_SIZE(xXIGrabDeviceReq);
 
+    if (stuff->deviceid > 0xFF) /* FIXME */
+        return BadImplementation;
+
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGrabAccess);
     if (ret != Success)
 	return ret;
@@ -129,6 +132,12 @@ ProcXIUngrabDevice(ClientPtr client)
 
     REQUEST(xXIUngrabDeviceReq);
 
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
+
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
     if (ret != Success)
 	return ret;
diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index 0c74544..25ecc03 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -90,6 +90,9 @@ ProcXIPassiveGrabDevice(ClientPtr client)
     REQUEST(xXIPassiveGrabDeviceReq);
     REQUEST_AT_LEAST_SIZE(xXIPassiveGrabDeviceReq);
 
+    if (stuff->deviceid > 0xFF) /* FIXME */
+        return BadImplementation;
+
     if (stuff->deviceid == XIAllDevices)
         dev = inputInfo.all_devices;
     else if (stuff->deviceid == XIAllMasterDevices)
@@ -260,6 +263,12 @@ ProcXIPassiveUngrabDevice(ClientPtr client)
     REQUEST(xXIPassiveUngrabDeviceReq);
     REQUEST_AT_LEAST_SIZE(xXIPassiveUngrabDeviceReq);
 
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
+
     rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGrabAccess);
     if (rc != Success)
 	return rc;
diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c
index cd49460..dc54d10 100644
--- a/Xi/xiproperty.c
+++ b/Xi/xiproperty.c
@@ -1102,6 +1102,12 @@ ProcXIListProperties(ClientPtr client)
     REQUEST(xXIListPropertiesReq);
     REQUEST_SIZE_MATCH(xXIListPropertiesReq);
 
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
+
     rc = dixLookupDevice (&dev, stuff->deviceid, client, DixReadAccess);
     if (rc != Success)
         return rc;
@@ -1136,6 +1142,12 @@ ProcXIChangeProperty(ClientPtr client)
 
     REQUEST(xXIChangePropertyReq);
     REQUEST_AT_LEAST_SIZE(xXIChangePropertyReq);
+
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
     UpdateCurrentTime();
 
     rc = dixLookupDevice (&dev, stuff->deviceid, client, DixWriteAccess);
@@ -1164,6 +1176,13 @@ ProcXIDeleteProperty(ClientPtr client)
     REQUEST(xXIDeletePropertyReq);
 
     REQUEST_SIZE_MATCH(xXIDeletePropertyReq);
+
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
+
     UpdateCurrentTime();
     rc =  dixLookupDevice (&dev, stuff->deviceid, client, DixWriteAccess);
     if (rc != Success)
@@ -1192,6 +1211,13 @@ ProcXIGetProperty(ClientPtr client)
     Atom                        type;
 
     REQUEST_SIZE_MATCH(xXIGetPropertyReq);
+
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
+
     if (stuff->delete)
         UpdateCurrentTime();
     rc = dixLookupDevice (&dev, stuff->deviceid, client,
diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 31e6a77..9dbdea7 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -82,6 +82,12 @@ ProcXISelectEvent(ClientPtr client)
     num_masks = stuff->num_masks;
     while(num_masks--)
     {
+        if (evmask->deviceid > 0xFF) /* FIXME */
+        {
+            client->errorValue = evmask->deviceid;
+            return BadImplementation;
+        }
+
         if (evmask->deviceid != XIAllDevices &&
             evmask->deviceid != XIAllMasterDevices)
             rc = dixLookupDevice(&dev, evmask->deviceid, client, DixReadAccess);
diff --git a/Xi/xisetdevfocus.c b/Xi/xisetdevfocus.c
index 32f7e59..cd1f6a6 100644
--- a/Xi/xisetdevfocus.c
+++ b/Xi/xisetdevfocus.c
@@ -75,6 +75,12 @@ ProcXISetFocus(ClientPtr client)
     REQUEST(xXISetFocusReq);
     REQUEST_AT_LEAST_SIZE(xXISetFocusReq);
 
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
+
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixSetFocusAccess);
     if (ret != Success)
 	return ret;
@@ -95,6 +101,12 @@ ProcXIGetFocus(ClientPtr client)
     REQUEST(xXIGetFocusReq);
     REQUEST_AT_LEAST_SIZE(xXIGetFocusReq);
 
+    if (stuff->deviceid > 0xFF) /* FIXME */
+    {
+        client->errorValue = stuff->deviceid;
+        return BadImplementation;
+    }
+
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetFocusAccess);
     if (ret != Success)
 	return ret;
commit c77f42049f77417c68bbce3dd2e995d916fc5af5
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jun 5 09:29:04 2009 +1000

    Xi: fix flawed logic in XIQueryVersion return value.
    
    The server returned the minimum of major/minor each instead of the lower of
    the combined major.minor version. As a result, a client reporting
    3.0 and a server supporting 2.7, the return value would be 2.0 (the minimum
    of both).
    
    Reported-by: Rémi Cardona
    Reported-by: Simon Thum
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/queryversion.c b/Xi/queryversion.c
index 385c965..230e207 100644
--- a/Xi/queryversion.c
+++ b/Xi/queryversion.c
@@ -58,6 +58,7 @@ ProcXIQueryVersion(ClientPtr client)
     xXIQueryVersionReply rep;
     XIClientPtr pXIClient;
     int major, minor;
+    unsigned int sversion, cversion;
 
     REQUEST(xXIQueryVersionReq);
     REQUEST_SIZE_MATCH(xXIQueryVersionReq);
@@ -71,8 +72,18 @@ ProcXIQueryVersion(ClientPtr client)
 
     pXIClient = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
 
-    major = min(XIVersion.major_version, stuff->major_version);
-    minor = min(XIVersion.minor_version, stuff->minor_version);
+    sversion = XIVersion.major_version * 1000 + XIVersion.minor_version;
+    cversion = stuff->major_version * 1000 + stuff->minor_version;
+
+    if (sversion > cversion)
+    {
+        major = stuff->major_version;
+        minor = stuff->minor_version;
+    } else
+    {
+        major = XIVersion.major_version;
+        minor = XIVersion.minor_version;
+    }
 
     pXIClient->major_version = major;
     pXIClient->minor_version = minor;
commit b6c16fc7dad5a4ffcaaab647c0e3fabed372efd5
Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Jun 5 11:57:39 2009 +1000

    crtc/gamma: check xf86_config is valid before using it.
    
    If you have multiple cards, some that support randr 1.2 and some that don't
    you can get a null dereference in here.
    
    Signed-off-by: Dave Airlie <airlied at redhat.com>

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index 0ab2f3d..b40e096 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -3140,6 +3140,9 @@ xf86_crtc_supports_gamma(ScrnInfoPtr pScrn)
 	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
 	xf86CrtcPtr crtc;
 
+	/* for multiple drivers loaded we need this */
+	if (!xf86_config)
+		return FALSE;
 	if (xf86_config->num_crtc == 0)
 	    return FALSE;
 	crtc = xf86_config->crtc[0];
commit da682abc78c9a5b2fde09679061fe08a3a1c665b
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Thu Jun 4 17:33:25 2009 -0400

    xace: fix a bad send access hook call.

diff --git a/dix/events.c b/dix/events.c
index 3a0c3a3..538d6fd 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3722,7 +3722,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
     {
         rc = EventToCore(event, &core);
         if (rc == Success &&
-            XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, core, 1) == Success)
+            XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, &core, 1) == Success)
         {
             FixUpEventFromWindow(keybd, &core, focus, None, FALSE);
             deliveries = DeliverEventsToWindow(keybd, focus, &core, 1,
commit 993daf06497c85bb6a1e70592df380503d721dfb
Merge: 2bda50e... e1e8c7d...
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 4 15:11:36 2009 +1000

    Merge branch 'master' into xi2

commit 2bda50ee14b7873f28081bf0f1bfb7b79a40de43
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 4 14:51:32 2009 +1000

    Xi: memset the device name padding to 0.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/querydev.c b/Xi/querydev.c
index d881b76..0d661a9 100644
--- a/Xi/querydev.c
+++ b/Xi/querydev.c
@@ -359,8 +359,9 @@ ListDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info)
     info->enabled = dev->enabled;
     total_len = sizeof(xXIDeviceInfo);
 
-    strncpy(any, dev->name, info->name_len);
     len = ((info->name_len + 3)/4) * 4;
+    memset(any, 0, len);
+    strncpy(any, dev->name, info->name_len);
     any += len;
     total_len += len;
 
commit 09266d6cd1bb6e09fe8bcb875c63fb4011c05b55
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 4 13:36:29 2009 +1000

    Xi: XIQueryVersion requires major_version of 2 or higher.
    
    Otherwise, a BadValue error is sent.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/queryversion.c b/Xi/queryversion.c
index f96c6f0..385c965 100644
--- a/Xi/queryversion.c
+++ b/Xi/queryversion.c
@@ -62,6 +62,13 @@ ProcXIQueryVersion(ClientPtr client)
     REQUEST(xXIQueryVersionReq);
     REQUEST_SIZE_MATCH(xXIQueryVersionReq);
 
+    /* This request only exists after XI2 */
+    if (stuff->major_version < 2)
+    {
+        client->errorValue = stuff->major_version;
+        return BadValue;
+    }
+
     pXIClient = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
 
     major = min(XIVersion.major_version, stuff->major_version);
commit 6ea76c550486bd17eb31f43757030fb44bdf1eab
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 4 12:55:59 2009 +1000

    Xi: reply with the XI2 version that is supported by both client and server.
    
    XIQueryVersion must return the client's version if the client's version is
    lower than or equal to the server's version, or the server's version
    otherwise.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/queryversion.c b/Xi/queryversion.c
index 3e0644b..f96c6f0 100644
--- a/Xi/queryversion.c
+++ b/Xi/queryversion.c
@@ -43,6 +43,7 @@
 #include "exglobals.h"
 #include "exevents.h"
 #include "queryversion.h"
+#include "misc.h"
 
 extern XExtensionVersion XIVersion; /* defined in getvers.c */
 /**
@@ -56,22 +57,26 @@ ProcXIQueryVersion(ClientPtr client)
 {
     xXIQueryVersionReply rep;
     XIClientPtr pXIClient;
+    int major, minor;
 
     REQUEST(xXIQueryVersionReq);
     REQUEST_SIZE_MATCH(xXIQueryVersionReq);
 
     pXIClient = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
 
-    pXIClient->major_version = stuff->major_version;
-    pXIClient->minor_version = stuff->minor_version;
+    major = min(XIVersion.major_version, stuff->major_version);
+    minor = min(XIVersion.minor_version, stuff->minor_version);
+
+    pXIClient->major_version = major;
+    pXIClient->minor_version = minor;
 
     memset(&rep, 0, sizeof(xXIQueryVersionReply));
     rep.repType = X_Reply;
     rep.RepType = X_XIQueryVersion;
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
-    rep.major_version = XIVersion.major_version;
-    rep.minor_version = XIVersion.minor_version;
+    rep.major_version = major;
+    rep.minor_version = minor;
 
     WriteReplyToClient(client, sizeof(xXIQueryVersionReply), &rep);
 
commit d979f443946011158b6a183582728a6899c33b85
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 4 11:40:14 2009 +1000

    test: check from INT_MIN to INT_MAX for core type conversion
    
    ErrorF is link-wrapped to reduce the run-time of the test.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/test/Makefile.am b/test/Makefile.am
index dbad93b..57a31c2 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -10,6 +10,7 @@ TEST_LDADD=libxservertest.la $(XORG_SYS_LIBS) $(XSERVER_SYS_LIBS) $(GLIB_LIBS)
 
 xkb_LDADD=$(TEST_LDADD)
 input_LDADD=$(TEST_LDADD)
+input_CFLAGS=$(AM_CFLAGS) -Wl,-wrap,ErrorF
 
 libxservertest_la_LIBADD = \
             $(XSERVER_LIBS) \
diff --git a/test/input.c b/test/input.c
index b80e1f5..dcce719 100644
--- a/test/input.c
+++ b/test/input.c
@@ -40,6 +40,10 @@
 
 #include <glib.h>
 
+void __wrap_ErrorF(const char *f, ...)
+{
+}
+
 /**
  * Init a device with axes.
  * Verify values set on the device.
@@ -254,36 +258,36 @@ static void dix_event_to_core_conversion(void)
 {
     DeviceEvent ev;
     xEvent core;
-    int rc;
+    int rc, i;
 
     ev.header   = 0xFF;
     ev.length   = sizeof(DeviceEvent);
 
-    ev.type     = 0;
-    rc = EventToCore((InternalEvent*)&ev, &core);
-    g_assert(rc == BadImplementation);
-
-    ev.type     = 1;
-    rc = EventToCore((InternalEvent*)&ev, &core);
-    g_assert(rc == BadImplementation);
-
-    ev.type     = ET_ProximityOut + 1;
-    rc = EventToCore((InternalEvent*)&ev, &core);
-    g_assert(rc == BadImplementation);
-
-    ev.type     = ET_ProximityIn;
-    rc = EventToCore((InternalEvent*)&ev, &core);
-    g_assert(rc == BadMatch);
-
-    ev.type     = ET_ProximityOut;
-    rc = EventToCore((InternalEvent*)&ev, &core);
-    g_assert(rc == BadMatch);
-
-    dix_event_to_core(ET_KeyPress);
-    dix_event_to_core(ET_KeyRelease);
-    dix_event_to_core(ET_ButtonPress);
-    dix_event_to_core(ET_ButtonRelease);
-    dix_event_to_core(ET_Motion);
+    for (i = INT_MIN; i < INT_MAX; i++)
+    {
+        switch(i)
+        {
+            case ET_KeyPress:
+            case ET_KeyRelease:
+            case ET_ButtonPress:
+            case ET_ButtonRelease:
+            case ET_Motion:
+                dix_event_to_core(i);
+                break;
+            case ET_Raw:
+            case ET_ProximityIn:
+            case ET_ProximityOut:
+                ev.type = i;
+                rc = EventToCore((InternalEvent*)&ev, &core);
+                g_assert(rc == BadMatch);
+                break;
+            default:
+                ev.type = i;
+                rc = EventToCore((InternalEvent*)&ev, &core);
+                g_assert(rc == BadImplementation);
+                break;
+        }
+    }
 }
 
 static void xi2_struct_sizes(void)
commit d8471bc7a19cd248fa3e0845496c86cd9251c013
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 4 11:32:15 2009 +1000

    test: adjust event_to_core_conversion test for new ProximityIn/Out behaviour
    
    Both types now return BadMatch.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/test/input.c b/test/input.c
index 2221c03..b80e1f5 100644
--- a/test/input.c
+++ b/test/input.c
@@ -271,13 +271,19 @@ static void dix_event_to_core_conversion(void)
     rc = EventToCore((InternalEvent*)&ev, &core);
     g_assert(rc == BadImplementation);
 
+    ev.type     = ET_ProximityIn;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    g_assert(rc == BadMatch);
+
+    ev.type     = ET_ProximityOut;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    g_assert(rc == BadMatch);
+
     dix_event_to_core(ET_KeyPress);
     dix_event_to_core(ET_KeyRelease);
     dix_event_to_core(ET_ButtonPress);
     dix_event_to_core(ET_ButtonRelease);
     dix_event_to_core(ET_Motion);
-    dix_event_to_core(ET_ProximityIn);
-    dix_event_to_core(ET_ProximityOut);
 }
 
 static void xi2_struct_sizes(void)
commit e1e8c7ddd7fdbfd674361364295fb1cbd5f28b45
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Jun 3 13:37:32 2009 -0400

    s/MIN/min/, s/MAX/max/ (#2968)

diff --git a/dix/dispatch.c b/dix/dispatch.c
index dbb97e0..86db92f 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -3935,10 +3935,6 @@ static int indexForScanlinePad[ 65 ] = {
 	 3		/* 64 bits per scanline pad unit */
 };
 
-#ifndef MIN
-#define MIN(a,b) (((a) < (b)) ? (a) : (b))
-#endif
-
 /*
 	grow the array of screenRecs if necessary.
 	call the device-supplied initialization procedure
diff --git a/hw/xfree86/shadowfb/shadow.c b/hw/xfree86/shadowfb/shadow.c
index ea6a2a0..9c9aa0d 100644
--- a/hw/xfree86/shadowfb/shadow.c
+++ b/hw/xfree86/shadowfb/shadow.c
@@ -31,9 +31,6 @@
 # include "picturestr.h"
 #endif
 
-#define MIN(a,b) (((a)<(b))?(a):(b))
-#define MAX(a,b) (((a)>(b))?(a):(b))
-
 static Bool ShadowCloseScreen (int i, ScreenPtr pScreen);
 static void ShadowCopyWindow(
     WindowPtr pWin,
@@ -1364,44 +1361,44 @@ ShadowFontToBox(BoxPtr BB, DrawablePtr pDrawable, GCPtr pGC, int x, int y,
     if (pFont->info.constantWidth) {
         int ascent, descent, left, right = 0;
 
-	ascent = MAX(pFont->info.fontAscent, pFont->info.maxbounds.ascent);
-	descent = MAX(pFont->info.fontDescent, pFont->info.maxbounds.descent);
+	ascent = max(pFont->info.fontAscent, pFont->info.maxbounds.ascent);
+	descent = max(pFont->info.fontDescent, pFont->info.maxbounds.descent);
 	left = pFont->info.maxbounds.leftSideBearing;
 	if (count > 0) {
 	    right = (count - 1) * pFont->info.maxbounds.characterWidth;
 	}
 	right += pFont->info.maxbounds.rightSideBearing;
 	BB->x1 =
-	    MAX(pDrawable->x + x - left, (REGION_EXTENTS(pGC->pScreen,
+	    max(pDrawable->x + x - left, (REGION_EXTENTS(pGC->pScreen,
 		&((WindowPtr) pDrawable)->winSize))->x1);
 	BB->y1 =
-	    MAX(pDrawable->y + y - ascent,
+	    max(pDrawable->y + y - ascent,
 	    (REGION_EXTENTS(pGC->pScreen,
              &((WindowPtr) pDrawable)->winSize))->y1);
 	BB->x2 =
-	    MIN(pDrawable->x + x + right,
+	    min(pDrawable->x + x + right,
 	    (REGION_EXTENTS(pGC->pScreen,
              &((WindowPtr) pDrawable)->winSize))->x2);
 	BB->y2 =
-	    MIN(pDrawable->y + y + descent,
+	    min(pDrawable->y + y + descent,
 	    (REGION_EXTENTS(pGC->pScreen,
              &((WindowPtr) pDrawable)->winSize))->y2);
     } else {
     	ShadowTextExtent(pFont, count, chars, wide ? (FONTLASTROW(pFont) == 0)
                          ? Linear16Bit : TwoD16Bit : Linear8Bit, BB);
 	BB->x1 =
-	    MAX(pDrawable->x + x + BB->x1, (REGION_EXTENTS(pGC->pScreen,
+	    max(pDrawable->x + x + BB->x1, (REGION_EXTENTS(pGC->pScreen,
 		&((WindowPtr) pDrawable)->winSize))->x1);
 	BB->y1 =
-	    MAX(pDrawable->y + y + BB->y1,
+	    max(pDrawable->y + y + BB->y1,
 	    (REGION_EXTENTS(pGC->pScreen,
              &((WindowPtr) pDrawable)->winSize))->y1);
 	BB->x2 =
-	    MIN(pDrawable->x + x + BB->x2,
+	    min(pDrawable->x + x + BB->x2,
 	    (REGION_EXTENTS(pGC->pScreen,
 	     &((WindowPtr) pDrawable)->winSize))->x2);
 	BB->y2 =
-	    MIN(pDrawable->y + y + BB->y2,
+	    min(pDrawable->y + y + BB->y2,
 	    (REGION_EXTENTS(pGC->pScreen, 
 	     &((WindowPtr) pDrawable)->winSize))->y2);
     }
diff --git a/hw/xwin/wincursor.c b/hw/xwin/wincursor.c
index fcd156e..9525608 100644
--- a/hw/xwin/wincursor.c
+++ b/hw/xwin/wincursor.c
@@ -39,14 +39,10 @@
 #include <cursorstr.h>
 #include <mipointrst.h>
 #include <servermd.h>
+#include "misc.h"
 
 extern Bool	g_fSoftwareCursor;
 
-
-#ifndef MIN
-#define MIN(x,y) ((x)<(y)?(x):(y))
-#endif
-
 #define BYTE_COUNT(x) (((x) + 7) / 8)
 
 #define BRIGHTNESS(x) (x##Red * 0.299 + x##Green * 0.587 + x##Blue * 0.114)
@@ -198,8 +194,8 @@ winLoadCursor (ScreenPtr pScreen, CursorPtr pCursor, int screen)
   nBytes = BYTE_COUNT(pScreenPriv->cursor.sm_cx) * pScreenPriv->cursor.sm_cy;
 
   /* Get the effective width and height */
-  nCX = MIN(pScreenPriv->cursor.sm_cx, pCursor->bits->width);
-  nCY = MIN(pScreenPriv->cursor.sm_cy, pCursor->bits->height);
+  nCX = min(pScreenPriv->cursor.sm_cx, pCursor->bits->width);
+  nCY = min(pScreenPriv->cursor.sm_cy, pCursor->bits->height);
 
   /* Allocate memory for the bitmaps */
   pAnd = malloc (nBytes);
diff --git a/miext/rootless/rootlessCommon.c b/miext/rootless/rootlessCommon.c
index 97c92d3..e3dd9d9 100644
--- a/miext/rootless/rootlessCommon.c
+++ b/miext/rootless/rootlessCommon.c
@@ -109,8 +109,8 @@ RootlessResolveColormap (ScreenPtr pScreen, int first_color,
   map = RootlessGetColormap (pScreen);
   if (map == NULL || map->class != PseudoColor) return FALSE;
 
-  last = MIN (map->pVisual->ColormapEntries, first_color + n_colors);
-  for (i = MAX (0, first_color); i < last; i++) {
+  last = min (map->pVisual->ColormapEntries, first_color + n_colors);
+  for (i = max (0, first_color); i < last; i++) {
     Entry *ent = map->red + i;
     uint16_t red, green, blue;
 
diff --git a/miext/rootless/rootlessCommon.h b/miext/rootless/rootlessCommon.h
index a92f1f1..ba121c0 100644
--- a/miext/rootless/rootlessCommon.h
+++ b/miext/rootless/rootlessCommon.h
@@ -36,6 +36,7 @@
 #ifndef _ROOTLESSCOMMON_H
 #define _ROOTLESSCOMMON_H
 
+#include "misc.h"
 #include "rootless.h"
 #include "fb.h"
 
@@ -120,12 +121,6 @@ typedef struct _RootlessScreenRec {
     unsigned int colormap_changed :1;
 } RootlessScreenRec, *RootlessScreenPtr;
 
-
-#undef MIN
-#define MIN(x,y) ((x) < (y) ? (x) : (y))
-#undef MAX
-#define MAX(x,y) ((x) > (y) ? (x) : (y))
-
 // "Definition of the Porting Layer for the X11 Sample Server" says
 // unwrap and rewrap of screen functions is unnecessary, but
 // screen->CreateGC changes after a call to cfbCreateGC.
diff --git a/miext/rootless/rootlessScreen.c b/miext/rootless/rootlessScreen.c
index 88d3869..b10ca70 100644
--- a/miext/rootless/rootlessScreen.c
+++ b/miext/rootless/rootlessScreen.c
@@ -200,10 +200,10 @@ RootlessGetImage(DrawablePtr pDrawable, int sx, int sy, int w, int h,
         x1 = x0 + w;
         y1 = y0 + h;
 
-        x0 = MAX (x0, winRec->x);
-        y0 = MAX (y0, winRec->y);
-        x1 = MIN (x1, winRec->x + winRec->width);
-        y1 = MIN (y1, winRec->y + winRec->height);
+        x0 = max (x0, winRec->x);
+        y0 = max (y0, winRec->y);
+        x1 = min (x1, winRec->x + winRec->width);
+        y1 = min (y1, winRec->y + winRec->height);
 
         sx = x0 - pDrawable->x;
         sy = y0 - pDrawable->y;
@@ -347,10 +347,10 @@ RootlessGlyphs(CARD8 op, PicturePtr pSrc, PicturePtr pDst,
                     x2 = x1 + glyph->info.width;
                     y2 = y1 + glyph->info.height;
 
-                    box.x1 = MAX (box.x1, x1);
-                    box.y1 = MAX (box.y1, y1);
-                    box.x2 = MAX (box.x2, x2);
-                    box.y2 = MAX (box.y2, y2);
+                    box.x1 = max (box.x1, x1);
+                    box.y1 = max (box.y1, y1);
+                    box.x2 = max (box.x2, x2);
+                    box.y2 = max (box.y2, y2);
 
                     x += glyph->info.xOff;
                     y += glyph->info.yOff;
commit 6de67d3206f0a4e307070714564c19efc84da2ec
Merge: af4e658... 7f027d9...
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jun 3 16:11:33 2009 +1000

    Merge branch 'master' into xi2

commit 7f027d9dc0146e229802aeac342ea2dbab63264a
Author: Olivier Blin <blino at mandriva.com>
Date:   Thu May 28 20:57:36 2009 +0200

    kdrive: add protocol mouse option
    
    kdrive probes a lot of PS/2 protocols for the mouse device, which
    makes the mouse unusable for some seconds after X startup.
    This new "protocol" option allows forcing the mouse protocol.
    It can be used this way:
    Xfbdev -mouse mouse,,protocol=ps/2 -keybd keyboard
    
    Signed-off-by: Olivier Blin <blino at mandriva.com>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/kdrive/linux/mouse.c b/hw/kdrive/linux/mouse.c
index 02214b3..6f399b5 100644
--- a/hw/kdrive/linux/mouse.c
+++ b/hw/kdrive/linux/mouse.c
@@ -961,7 +961,11 @@ MouseInit (KdPointerInfo *pi)
     km = (Kmouse *) xalloc (sizeof (Kmouse));
     if (km) {
         km->iob.avail = km->iob.used = 0;
-        MouseFirstProtocol(km, "exps/2");
+        MouseFirstProtocol(km, pi->protocol ? pi->protocol : "exps/2");
+        /* MouseFirstProtocol sets state to MouseBroken for later protocol
+         * checks. Skip these checks if a protocol was supplied */
+        if (pi->protocol)
+                km->state = MouseWorking;
         km->i_prot = 0;
         km->tty = isatty (fd);
         km->iob.fd = -1;
diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h
index c60559a..ce47cf4 100644
--- a/hw/kdrive/src/kdrive.h
+++ b/hw/kdrive/src/kdrive.h
@@ -220,6 +220,7 @@ struct _KdPointerInfo {
     DeviceIntPtr          dixdev;
     char                  *name;
     char                  *path;
+    char                  *protocol;
     InputOption           *options;
     int                   inputClass;
 
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 0d216a9..360739c 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -1166,6 +1166,8 @@ KdParsePointerOptions (KdPointerInfo *pi)
             pi->transformCoordinates = FALSE;
         else if (!strcasecmp (option->key, "device"))
             pi->path = strdup(option->value);
+        else if (!strcasecmp (option->key, "protocol"))
+            pi->protocol = strdup(option->value);
         else
             ErrorF("Pointer option key (%s) of value (%s) not assigned!\n", 
                     option->key, option->value);
@@ -1186,6 +1188,7 @@ KdParsePointer (char *arg)
         return NULL;
     pi->emulateMiddleButton = kdEmulateMiddleButton;
     pi->transformCoordinates = !kdRawPointerCoordinates;
+    pi->protocol = NULL;
     pi->nButtons = 5; /* XXX should not be hardcoded */
     pi->inputClass = KD_MOUSE;
 
commit af4e658401ecbd2f2cc515b4c5abe5aee361cd64
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jun 3 12:30:49 2009 +1000

    mi: only process master if the SD is still attached.
    
    SDs may be detached during event processing (e.g. if a passive grab
    activates). In this case, the event must not be processed through the master
    device.
    
    Reported-by: Thomas Jaeger
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/mi/mieq.c b/mi/mieq.c
index 7ba755c..8ceda43 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -402,7 +402,9 @@ mieqProcessDeviceEvent(DeviceIntPtr dev,
             /* process slave first, then master */
             dev->public.processInputProc(event, dev);
 
-            if (master)
+            /* Check for the SD's master in case the device got detached
+             * during event processing */
+            if (master && dev->u.master)
                 master->public.processInputProc(
                         (InternalEvent*)masterEvents->event,
                         master);
commit eb3fe72cbcd10c3953d713e07c321e695194a328
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jun 3 12:19:14 2009 +1000

    dix: set the device state for XI valuator events.
    
    Valuator events need to include the device's state, while other device
    events need to include the state of the core devices.
    
    Reported-by: Thomas Jaeger
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index fa2684c..85ddd61 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -46,6 +46,7 @@
 #include "exglobals.h"
 #include "eventconvert.h"
 #include "querydev.h"
+#include "xkbsrv.h"
 
 
 static int countValuators(DeviceEvent *ev, int *first);
@@ -279,9 +280,19 @@ static int
 getValuatorEvents(DeviceEvent *ev, deviceValuator *xv)
 {
     int i;
+    int state = 0;
     int first_valuator, num_valuators;
 
+
     num_valuators = countValuators(ev, &first_valuator);
+    if (num_valuators > 0)
+    {
+        DeviceIntPtr dev = NULL;
+        dixLookupDevice(&dev, ev->deviceid, serverClient, DixUseAccess);
+        /* State needs to be assembled BEFORE the device is updated. */
+        state = (dev && dev->key) ? XkbStateFieldFromRec(&dev->key->xkbInfo->state) : 0;
+        state |= (dev && dev->button) ? (dev->button->state) : 0;
+    }
 
     /* FIXME: non-continuous valuator data in internal events*/
     for (i = 0; i < num_valuators; i += 6, xv++) {
@@ -289,6 +300,7 @@ getValuatorEvents(DeviceEvent *ev, deviceValuator *xv)
         xv->first_valuator = first_valuator + i;
         xv->num_valuators = ((num_valuators - i) > 6) ? 6 : (num_valuators - i);
         xv->deviceid = ev->deviceid;
+        xv->device_state = state;
         switch (xv->num_valuators) {
         case 6:
             xv->valuator5 = ev->valuators.data[i + 5];
commit 08fd2ae652883393ecff6f3d5177e63408d58472
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jun 3 12:18:17 2009 +1000

    dix: use GetMaster in PickPointer and PickKeyboard.
    
    GetMaster is more reliable than GetPairedDevice, it always returns the
    keyboard/pointer if desired, even if the wrong device was passed in.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/events.c b/dix/events.c
index 26a9bf1..3a0c3a3 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -5733,8 +5733,7 @@ PickPointer(ClientPtr client)
         GrabPtr grab = it->deviceGrab.grab;
         if (grab && grab->grabtype == GRABTYPE_CORE && SameClient(grab, client))
         {
-            if (!IsPointerDevice(it))
-                it = GetPairedDevice(it);
+            it = GetMaster(it, MASTER_POINTER);
             return it; /* Always return a core grabbed device */
         }
     }
@@ -5763,7 +5762,7 @@ DeviceIntPtr
 PickKeyboard(ClientPtr client)
 {
     DeviceIntPtr ptr = PickPointer(client);
-    DeviceIntPtr kbd = ptr->spriteInfo->paired;
+    DeviceIntPtr kbd = GetMaster(ptr, MASTER_KEYBOARD);
 
     if (!kbd)
     {
commit a1d1dd06f8f91c1d1802f7581a4ba7568b85e69c
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jun 3 12:15:32 2009 +1000

    Xi: fix wrong grabtype from ProcXGrabDevice.
    
    86077f0058ce88ee9b3df5d1ab854eeca43 switched from a boolean to a grabtype
    enum. ProcXGrabDevice didn't switch with it. PickPointer during an XI grab
    on a slave device would thus return a wrong (or NULL) device and crash the
    server.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/grabdev.c b/Xi/grabdev.c
index 6827fd1..adcd7e7 100644
--- a/Xi/grabdev.c
+++ b/Xi/grabdev.c
@@ -132,7 +132,7 @@ ProcXGrabDevice(ClientPtr client)
     rc = GrabDevice(client, dev, stuff->other_devices_mode,
                     stuff->this_device_mode, stuff->grabWindow,
 		    stuff->ownerEvents, stuff->time,
-		    &mask, FALSE, None, None,
+		    &mask, GRABTYPE_XI, None, None,
 		    &rep.status);
 
     if (rc != Success)
commit a371a47205fc58a587e1aecaa4a031184481c228
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jun 3 11:47:16 2009 +1000

    dix: EventToCore must return BadMatch for proximity events.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index e104ce9..fa2684c 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -76,8 +76,6 @@ EventToCore(InternalEvent *event, xEvent *core)
         case ET_ButtonRelease:
         case ET_KeyPress:
         case ET_KeyRelease:
-        case ET_ProximityIn:
-        case ET_ProximityOut:
             {
                 DeviceEvent *e = (DeviceEvent*)event;
 
@@ -93,6 +91,8 @@ EventToCore(InternalEvent *event, xEvent *core)
                 core->u.keyButtonPointer.state = e->corestate;
             }
             break;
+        case ET_ProximityIn:
+        case ET_ProximityOut:
         case ET_Raw:
             return BadMatch;
         default:
commit 2bd5ea80652358565346071bed829070ddf5de85
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jun 3 10:45:28 2009 +1000

    dix: rework event conversion before delivery.
    
    Let EventToXI, EventToCore and EventToXI2 return BadMatch if there's no
    matching event for this protocol spec.
    Adjust the delivery paths to cope with BadMatch errors (and clean them up on
    the way).
    
    As a side-effect, this fixes server crashes on proximity events for a
    grabbed device.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index 5072891..e104ce9 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -93,6 +93,8 @@ EventToCore(InternalEvent *event, xEvent *core)
                 core->u.keyButtonPointer.state = e->corestate;
             }
             break;
+        case ET_Raw:
+            return BadMatch;
         default:
             /* XXX: */
             ErrorF("[dix] EventToCore: Not implemented yet \n");
@@ -107,12 +109,16 @@ EventToCore(InternalEvent *event, xEvent *core)
  * count returns the number of events in xi. If count is 1, and the type of
  * xi is GenericEvent, then xi may be larger than 32 bytes.
  *
- * If the event cannot be converted into an XI event because of protocol
- * restrictions, count is 0 and Success is returned.
+ * Return values:
+ * Success ... core contains the matching core event.
+ * BadValue .. One or more values in the internal event are invalid.
+ * BadMatch .. The event has no XI equivalent.
  *
  * @param[in] ev The event to convert into an XI 1 event.
  * @param[out] xi Future memory location for the XI event.
  * @param[out] count Number of elements in xi.
+ *
+ * @return Success or the error code.
  */
 int
 EventToXI(InternalEvent *ev, xEvent **xi, int *count)
@@ -131,7 +137,7 @@ EventToXI(InternalEvent *ev, xEvent **xi, int *count)
         case ET_Raw:
             *count = 0;
             *xi = NULL;
-            return Success;
+            return BadMatch;
     }
 
     ErrorF("[dix] EventToXI: Not implemented for %d \n", ev->any.type);
@@ -142,8 +148,10 @@ EventToXI(InternalEvent *ev, xEvent **xi, int *count)
  * Convert the given event to the respective XI 2.x event and store it in xi.
  * xi is allocated on demand and must be freed by the caller.
  *
- * If the event cannot be converted into an XI event because of protocol
- * restrictions, xi is NULL and Success is returned.
+ * Return values:
+ * Success ... core contains the matching core event.
+ * BadValue .. One or more values in the internal event are invalid.
+ * BadMatch .. The event has no XI2 equivalent.
  *
  * @param[in] ev The event to convert into an XI2 event
  * @param[out] xi Future memory location for the XI2 event.
@@ -170,7 +178,7 @@ EventToXI2(InternalEvent *ev, xEvent **xi)
         case ET_ProximityIn:
         case ET_ProximityOut:
             *xi = NULL;
-            return Success;
+            return BadMatch;
         case ET_DeviceChanged:
             return eventToClassesChanged((DeviceChangedEvent*)ev, xi);
         case ET_Raw:
diff --git a/dix/events.c b/dix/events.c
index f0bb2b9..26a9bf1 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2401,78 +2401,64 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
 
     CHECKEVENT(event);
 
-    /* XXX: In theory, we could pass the internal events through to everything
-     * and only convert just before hitting the wire. We can't do that yet, so
-     * DDE is the last stop for internal events. From here onwards, we deal
-     * with core/XI events.
-     */
-    rc = EventToXI(event, &xE, &count);
-    if (rc != Success)
-    {
-        ErrorF("[dix] %s: XI conversion failed in DDE (%d, %d). Skipping delivery.\n",
-               dev->name, event->any.type, rc);
-        goto unwind;
-    } else if (count > 0)
-    {
-        if (XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, xE, count))
-            goto unwind;
-        /* if count is 0, we might still have XI2 events, don't have XACE for
-         * that yet */
-    }
-
-
     while (pWin)
     {
         if ((mask = EventIsDeliverable(dev, event, pWin)))
         {
+            /* XI2 events first */
             if (mask & XI2_MASK)
             {
                 xEvent *xi2 = NULL;
                 rc = EventToXI2(event, &xi2);
-                if (rc != Success)
+                if (rc == Success)
                 {
+                    /* XXX: XACE */
+                    filter = GetEventFilter(dev, xi2);
+                    FixUpEventFromWindow(dev, xi2, pWin, child, FALSE);
+                    deliveries = DeliverEventsToWindow(dev, pWin, xi2, 1,
+                                                       filter, grab);
+                    xfree(xi2);
+                    if (deliveries > 0)
+                        goto unwind;
+                } else if (rc != BadMatch)
                     ErrorF("[dix] %s: XI2 conversion failed in DDE (%d).\n",
                             dev->name, rc);
-                    goto unwind;
-                }
-                filter = GetEventFilter(dev, xi2);
-                FixUpEventFromWindow(dev, xi2, pWin, child, FALSE);
-                deliveries = DeliverEventsToWindow(dev, pWin, xi2, 1,
-                                                   filter, grab);
-                xfree(xi2);
-                if (deliveries > 0)
-                    goto unwind;
             }
 
-            /* XI events first */
+            /* XI events */
             if (mask & XI_MASK)
             {
-                filter = GetEventFilter(dev, xE);
-                FixUpEventFromWindow(dev, xE, pWin, child, FALSE);
-                deliveries = DeliverEventsToWindow(dev, pWin, xE, count,
-                                                   filter, grab);
-                if (deliveries > 0)
-                    goto unwind;
+                rc = EventToXI(event, &xE, &count);
+                if (rc == Success &&
+                    XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, xE, count) == Success)
+                {
+                    filter = GetEventFilter(dev, xE);
+                    FixUpEventFromWindow(dev, xE, pWin, child, FALSE);
+                    deliveries = DeliverEventsToWindow(dev, pWin, xE, count,
+                                                       filter, grab);
+                    if (deliveries > 0)
+                        goto unwind;
+                } else if (rc != BadMatch)
+                    ErrorF("[dix] %s: XI conversion failed in DDE (%d, %d). Skipping delivery.\n",
+                            dev->name, event->any.type, rc);
             }
 
             /* Core event */
             if ((mask & CORE_MASK) && IsMaster(dev) && dev->coreEvents)
             {
                 rc = EventToCore(event, &core);
-                if (rc != Success)
+                if (rc == Success &&
+                    XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, &core, 1) == Success)
                 {
-                    if (rc != BadMatch)
+                    filter = GetEventFilter(dev, &core);
+                    FixUpEventFromWindow(dev, &core, pWin, child, FALSE);
+                    deliveries = DeliverEventsToWindow(dev, pWin, &core, 1,
+                            filter, grab);
+                    if (deliveries > 0)
+                        goto unwind;
+                } else if (rc != BadMatch)
                         ErrorF("[dix] %s: Core conversion failed in DDE (%d, %d).\n",
                                 dev->name, event->any.type, rc);
-                    goto unwind;
-                }
-
-                filter = GetEventFilter(dev, &core);
-                FixUpEventFromWindow(dev, &core, pWin, child, FALSE);
-                deliveries = DeliverEventsToWindow(dev, pWin, &core, 1,
-                                                   filter, grab);
-                if (deliveries > 0)
-                    goto unwind;
             }
 
             if ((deliveries < 0) || (pWin == stopAt) ||
@@ -3528,10 +3514,11 @@ CheckPassiveGrabsOnWindow(
             if (match & CORE_MATCH)
             {
                 rc = EventToCore((InternalEvent*)event, &core);
-                if (rc != Success && rc != BadMatch)
+                if (rc != Success)
                 {
-                    ErrorF("[dix] %s: core conversion failed in CPGFW "
-                           "(%d, %d).\n", device->name, event->type, rc);
+                    if (rc != BadMatch)
+                        ErrorF("[dix] %s: core conversion failed in CPGFW "
+                                "(%d, %d).\n", device->name, event->type, rc);
                     continue;
                 }
                 xE = &core;
@@ -3541,8 +3528,9 @@ CheckPassiveGrabsOnWindow(
                 rc = EventToXI2((InternalEvent*)event, &xE);
                 if (rc != Success)
                 {
-                    ErrorF("[dix] %s: XI2 conversion failed in CPGFW "
-                           "(%d, %d).\n", device->name, event->type, rc);
+                    if (rc != BadMatch)
+                        ErrorF("[dix] %s: XI2 conversion failed in CPGFW "
+                                "(%d, %d).\n", device->name, event->type, rc);
                     continue;
                 }
                 count = 1;
@@ -3551,11 +3539,11 @@ CheckPassiveGrabsOnWindow(
                 rc = EventToXI((InternalEvent*)event, &xE, &count);
                 if (rc != Success)
                 {
-                    ErrorF("[dix] %s: XI conversion failed in CPGFW "
-                           "(%d, %d).\n", device->name, event->type, rc);
+                    if (rc != BadMatch)
+                        ErrorF("[dix] %s: XI conversion failed in CPGFW "
+                                "(%d, %d).\n", device->name, event->type, rc);
                     continue;
                 }
-
             }
 
 	    (*grabinfo->ActivateGrab)(device, grab, currentTime, TRUE);
@@ -3696,60 +3684,53 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
 	if (DeliverDeviceEvents(window, event, NullGrab, focus, keybd))
 	    return;
     }
-    ptr = GetPairedDevice(keybd);
 
-    rc = EventToXI(event, &xE, &count);
-    if (rc != Success)
-    {
-        ErrorF("[dix] %s: XI conversion failed in DFE (%d, %d). Skipping delivery.\n",
-               keybd->name, event->any.type, rc);
-        goto unwind;
-    } else if (count == 0) /* no XI/Core event for you */
-        return;
+    /* just deliver it to the focus window */
+    ptr = GetPairedDevice(keybd);
 
-    if (XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, xE, count))
-	goto unwind;
 
     rc = EventToXI2(event, &xi2);
-    if (rc != Success)
-    {
-        ErrorF("[dix] %s: XI2 conversion failed in DFE (%d, %d). Skipping delivery.\n",
-               keybd->name, event->any.type, rc);
-        goto unwind;
-    } else if (xi2)
+    if (rc == Success)
     {
+        /* XXX: XACE */
         int filter = GetEventFilter(keybd, xi2);
-        /* just deliver it to the focus window */
         FixUpEventFromWindow(ptr, xi2, focus, None, FALSE);
         deliveries = DeliverEventsToWindow(keybd, focus, xi2, 1,
                                            filter, NullGrab);
         if (deliveries > 0)
             goto unwind;
-    }
+    } else if (rc != BadMatch)
+        ErrorF("[dix] %s: XI2 conversion failed in DFE (%d, %d). Skipping delivery.\n",
+               keybd->name, event->any.type, rc);
 
-    /* just deliver it to the focus window */
-    FixUpEventFromWindow(ptr, xE, focus, None, FALSE);
-    deliveries = DeliverEventsToWindow(keybd, focus, xE, count,
-                                       GetEventFilter(keybd, xE),
-                                       NullGrab);
+    rc = EventToXI(event, &xE, &count);
+    if (rc == Success &&
+        XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, xE, count) == Success)
+    {
+        FixUpEventFromWindow(ptr, xE, focus, None, FALSE);
+        deliveries = DeliverEventsToWindow(keybd, focus, xE, count,
+                GetEventFilter(keybd, xE),
+                NullGrab);
 
-    if (deliveries > 0)
-        goto unwind;
+        if (deliveries > 0)
+            goto unwind;
+    } else if (rc != BadMatch)
+        ErrorF("[dix] %s: XI conversion failed in DFE (%d, %d). Skipping delivery.\n",
+               keybd->name, event->any.type, rc);
 
     if (sendCore)
     {
         rc = EventToCore(event, &core);
-        if (rc != Success)
+        if (rc == Success &&
+            XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, core, 1) == Success)
         {
+            FixUpEventFromWindow(keybd, &core, focus, None, FALSE);
+            deliveries = DeliverEventsToWindow(keybd, focus, &core, 1,
+                                               GetEventFilter(keybd, &core),
+                                               NullGrab);
+        } else if (rc != BadMatch)
             ErrorF("[dix] %s: core conversion failed DFE (%d, %d). Skipping delivery.\n",
                     keybd->name, event->any.type, rc);
-            goto unwind;
-        }
-
-        FixUpEventFromWindow(keybd, &core, focus, None, FALSE);
-        deliveries = DeliverEventsToWindow(keybd, focus, &core, 1,
-                                           GetEventFilter(keybd, &core),
-                                           NullGrab);
     }
 
 unwind:
@@ -3823,23 +3804,6 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
          * onwards, we deal with core/XI events.
          */
 
-        rc = EventToXI2(event, &xi2);
-        if (rc != Success)
-        {
-            ErrorF("[dix] %s: XI2 conversion failed in DGE (%d, %d). Skipping delivery.\n",
-                    thisDev->name, event->any.type, rc);
-            goto unwind;
-        }
-
-        rc = EventToXI(event, &xi, &count);
-        if (rc != Success)
-        {
-            ErrorF("[dix] %s: XI conversion failed in DGE (%d, %d). Skipping delivery.\n",
-                    thisDev->name, event->any.type, rc);
-            goto unwind;
-        } else if (count == 0) /* no XI/Core event for you */
-            goto unwind;
-
         mask = grab->eventMask;
 
         sendCore = (IsMaster(thisDev) && thisDev->coreEvents);
@@ -3849,68 +3813,77 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
             xEvent core;
 
             rc = EventToCore(event, &core);
-            if (rc != Success && rc != BadMatch)
+            if (rc == Success)
             {
+                FixUpEventFromWindow(thisDev, &core, grab->window,
+                        None, TRUE);
+                if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
+                            grab->window, &core, 1) ||
+                        XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
+                            grab->window, &core, 1))
+                    deliveries = 1; /* don't send, but pretend we did */
+                else if (!IsInterferingGrab(rClient(grab), thisDev, &core))
+                {
+                    deliveries = TryClientEvents(rClient(grab), thisDev,
+                            &core, 1, mask,
+                            GetEventFilter(thisDev, &core),
+                            grab);
+                }
+            } else if (rc != BadMatch)
                 ErrorF("[dix] DeliverGrabbedEvent. Core conversion failed.\n");
-                goto unwind;
-            }
-
-            FixUpEventFromWindow(thisDev, &core, grab->window,
-                    None, TRUE);
-            if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
-                        grab->window, &core, 1) ||
-                    XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
-                        grab->window, &core, 1))
-                deliveries = 1; /* don't send, but pretend we did */
-            else if (!IsInterferingGrab(rClient(grab), thisDev, &core))
-            {
-                deliveries = TryClientEvents(rClient(grab), thisDev,
-                        &core, 1, mask,
-                        GetEventFilter(thisDev, &core),
-                        grab);
-            }
         }
 
         if (!deliveries)
         {
-            int evtype = ((xGenericEvent*)xi2)->evtype;
-            mask = grab->xi2mask[XIAllDevices][evtype/8] |
-                   grab->xi2mask[XIAllMasterDevices][evtype/8] |
-                   grab->xi2mask[thisDev->id][evtype/8];
-            /* try XI2 event */
-            FixUpEventFromWindow(thisDev, xi2, grab->window, None, TRUE);
-            /* XXX: XACE */
-            deliveries = TryClientEvents(rClient(grab), thisDev, xi2, 1, mask,
-                                         GetEventFilter(thisDev, xi2), grab);
+            rc = EventToXI2(event, &xi2);
+            if (rc == Success)
+            {
+                int evtype = ((xGenericEvent*)xi2)->evtype;
+                mask = grab->xi2mask[XIAllDevices][evtype/8] |
+                    grab->xi2mask[XIAllMasterDevices][evtype/8] |
+                    grab->xi2mask[thisDev->id][evtype/8];
+                /* try XI2 event */
+                FixUpEventFromWindow(thisDev, xi2, grab->window, None, TRUE);
+                /* XXX: XACE */
+                deliveries = TryClientEvents(rClient(grab), thisDev, xi2, 1, mask,
+                        GetEventFilter(thisDev, xi2), grab);
+            } else if (rc != BadMatch)
+                ErrorF("[dix] %s: XI2 conversion failed in DGE (%d, %d). Skipping delivery.\n",
+                        thisDev->name, event->any.type, rc);
         }
 
         if (!deliveries)
         {
-            /* try XI event */
-            if (grabinfo->fromPassiveGrab  &&
-                    grabinfo->implicitGrab)
-                mask = grab->deviceMask;
-            else
-                mask = grab->eventMask;
-
-            FixUpEventFromWindow(thisDev, xi, grab->window,
-                    None, TRUE);
-
-            if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
-                        grab->window, xi, count) ||
-                    XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
-                        grab->window, xi, count))
-                deliveries = 1; /* don't send, but pretend we did */
-            else
+            rc = EventToXI(event, &xi, &count);
+            if (rc == Success)
             {
-                deliveries =
-                    TryClientEvents(rClient(grab), thisDev,
-                            xi, count,
-                            mask,
-                            GetEventFilter(thisDev, xi),
-                            grab);
-            }
-
+                /* try XI event */
+                if (grabinfo->fromPassiveGrab  &&
+                        grabinfo->implicitGrab)
+                    mask = grab->deviceMask;
+                else
+                    mask = grab->eventMask;
+
+                FixUpEventFromWindow(thisDev, xi, grab->window,
+                        None, TRUE);
+
+                if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
+                            grab->window, xi, count) ||
+                        XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
+                            grab->window, xi, count))
+                    deliveries = 1; /* don't send, but pretend we did */
+                else
+                {
+                    deliveries =
+                        TryClientEvents(rClient(grab), thisDev,
+                                xi, count,
+                                mask,
+                                GetEventFilter(thisDev, xi),
+                                grab);
+                }
+            } else if (rc != BadMatch)
+                ErrorF("[dix] %s: XI conversion failed in DGE (%d, %d). Skipping delivery.\n",
+                        thisDev->name, event->any.type, rc);
         }
 
         if (deliveries && (event->any.type == ET_Motion))
@@ -3944,7 +3917,6 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
 	}
     }
 
-unwind:
     if (xi)
         xfree(xi);
     if (xi2)
commit 20d9f11abfd6ce3630d9640ff7383c7e27196956
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jun 2 13:49:09 2009 -0400

    Typo fix

diff --git a/configure.ac b/configure.ac
index 696e03f..6a78af9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -589,7 +589,7 @@ AC_ARG_ENABLE(dmx,    	      AS_HELP_STRING([--enable-dmx], [Build DMX server (d
 AC_ARG_ENABLE(xvfb,    	      AS_HELP_STRING([--enable-xvfb], [Build Xvfb server (default: yes)]), [XVFB=$enableval], [XVFB=yes])
 AC_ARG_ENABLE(xnest,   	      AS_HELP_STRING([--enable-xnest], [Build Xnest server (default: no)]), [XNEST=$enableval], [XNEST=no])
 AC_ARG_ENABLE(xquartz,        AS_HELP_STRING([--enable-xquartz], [Build Xquartz server for OS-X (default: auto)]), [XQUARTZ=$enableval], [XQUARTZ=auto])
-AC_ARG_ENABLE(standalone-xpbproxy, AS_HELP_STRING([--enable-standalone-xpbproxy], [Build a standalone xpbproxy (in addigion to the one integrated into Xquartz as a separate thread) (default: no)]), [STANDALONE_XPBPROXY=$enableval], [STANDALONE_XPBPROXY=no])
+AC_ARG_ENABLE(standalone-xpbproxy, AS_HELP_STRING([--enable-standalone-xpbproxy], [Build a standalone xpbproxy (in addition to the one integrated into Xquartz as a separate thread) (default: no)]), [STANDALONE_XPBPROXY=$enableval], [STANDALONE_XPBPROXY=no])
 AC_ARG_ENABLE(xwin,    	      AS_HELP_STRING([--enable-xwin], [Build XWin server (default: auto)]), [XWIN=$enableval], [XWIN=auto])
 dnl kdrive and its subsystems
 AC_ARG_ENABLE(kdrive,         AS_HELP_STRING([--enable-kdrive], [Build kdrive servers (default: no)]), [KDRIVE=$enableval], [KDRIVE=no])
commit ab5d1ae82ebd467d0a5b39821b286097865ba0c7
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Jun 2 13:39:55 2009 -0400

    Remove some libXfont leftovers

diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 66b1ec7..d4ff7da 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -28,7 +28,6 @@
  * Silicon Graphics, Inc.
  */
 
-#define FONT_PCF
 #ifdef HAVE_DIX_CONFIG_H
 #include <dix-config.h>
 #endif
diff --git a/glx/glxcmdsswap.c b/glx/glxcmdsswap.c
index 4132b76..f1c0ce6 100644
--- a/glx/glxcmdsswap.c
+++ b/glx/glxcmdsswap.c
@@ -28,7 +28,6 @@
  * Silicon Graphics, Inc.
  */
 
-#define FONT_PCF
 #ifdef HAVE_DIX_CONFIG_H
 #include <dix-config.h>
 #endif
diff --git a/hw/dmx/glxProxy/glxcmds.c b/hw/dmx/glxProxy/glxcmds.c
index f19239f..31fd431 100644
--- a/hw/dmx/glxProxy/glxcmds.c
+++ b/hw/dmx/glxProxy/glxcmds.c
@@ -43,7 +43,6 @@
 #undef Xrealloc
 #undef Xfree
 
-#define FONT_PCF
 #include "glxserver.h"
 #include <GL/glxtokens.h>
 #include "g_disptab.h"
diff --git a/hw/dmx/glxProxy/glxcmdsswap.c b/hw/dmx/glxProxy/glxcmdsswap.c
index 702479f..b3720f6 100644
--- a/hw/dmx/glxProxy/glxcmdsswap.c
+++ b/hw/dmx/glxProxy/glxcmdsswap.c
@@ -28,7 +28,6 @@
  * Silicon Graphics, Inc.
  */
 
-#define FONT_PCF
 #include "glxserver.h"
 #include "glxutil.h"
 #include <GL/glxtokens.h>
diff --git a/hw/dmx/glxProxy/glxutil.c b/hw/dmx/glxProxy/glxutil.c
index 70f8b74..d0ce504 100644
--- a/hw/dmx/glxProxy/glxutil.c
+++ b/hw/dmx/glxProxy/glxutil.c
@@ -28,7 +28,6 @@
  * Silicon Graphics, Inc.
  */
 
-#define FONT_PCF
 #include "glxserver.h"
 #include <GL/glxtokens.h>
 #include <pixmapstr.h>
commit 75795637c7160f1579dbe81c2d7600e85b1d141f
Author: Matthias Hopf <mhopf at suse.de>
Date:   Tue Jun 2 18:41:36 2009 +0200

    Revert "randr: Setting gamma: inverse logic looks more sane"
    
    This reverts commit 79138eec1b49cbaca6a16f2bdd8579b5828aeb28.

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index 353b268..0ab2f3d 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -353,7 +353,7 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
     }
 
     /* Only upload when needed, to avoid unneeded delays. */
-    if (crtc->active)
+    if (!crtc->active)
 	crtc->funcs->gamma_set(crtc, crtc->gamma_red, crtc->gamma_green,
                                             crtc->gamma_blue, crtc->gamma_size);
 
commit fc8cfc3a055d8af4ac809799c71f3db0d5246433
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 2 16:53:41 2009 +1000

    dix: ensure EventIsDeliverable has inputMasks set at all times.
    
    For proximity events, the XI2 type is 0 and inputMasks never got set in the
    preceding condition. As a result, proximity events got never delivered.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/events.c b/dix/events.c
index d73487a..f0bb2b9 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2326,7 +2326,7 @@ EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win)
     int rc = 0;
     int filter = 0;
     int type;
-    OtherInputMasks *inputMasks = NULL;
+    OtherInputMasks *inputMasks = wOtherInputMasks(win);
     xEvent ev;
 
     /* XXX: this makes me gag */
@@ -2335,7 +2335,7 @@ EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win)
     ((xGenericEvent*)&ev)->extension = IReqCode;
     ((xGenericEvent*)&ev)->evtype = type;
     filter = GetEventFilter(dev, &ev);
-    if (type && (inputMasks = wOtherInputMasks(win)) &&
+    if (type && inputMasks &&
         ((inputMasks->xi2mask[XIAllDevices][type/8] & filter) ||
          ((inputMasks->xi2mask[XIAllMasterDevices][type/8] & filter) && IsMaster(dev)) ||
          (inputMasks->xi2mask[dev->id][type/8] & filter)))
commit ef9f851057a0ae214be02cb919f1e6634cead20b
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 2 16:38:32 2009 +1000

    dix: protect against floating slaves in DeviceFocusEvent.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index b19c8e2..fbcf6e3 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1231,7 +1231,7 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
     DeviceIntPtr mouse;
     int btlen, len, i;
 
-    mouse = (IsMaster(dev) || dev->u.master) ? GetPairedDevice(dev) : NULL;
+    mouse = (IsMaster(dev) || dev->u.master) ? GetMaster(dev, MASTER_POINTER) : dev;
 
     /* XI 2 event */
     btlen = (mouse->button) ? (mouse->button->numButtons + 7)/8 : 0;
commit b40289c8766c5e7543b7288009b4d965f57c04ce
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 2 16:22:58 2009 +1000

    xkb: allow pointer events to pass through for floating SDs without a key class.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c
index 88d5d90..f0f7578 100644
--- a/xkb/xkbAccessX.c
+++ b/xkb/xkbAccessX.c
@@ -687,21 +687,28 @@ void
 ProcessPointerEvent(	InternalEvent   *ev,
 			DeviceIntPtr    mouse)
 {
-DeviceIntPtr	dev = GetPairedDevice(mouse);
-XkbSrvInfoPtr	xkbi = dev->key->xkbInfo;
+DeviceIntPtr	dev;
+XkbSrvInfoPtr	xkbi = NULL;
 unsigned 	changed = 0;
 ProcessInputProc backupproc;
 xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(mouse);
 DeviceEvent     *event = (DeviceEvent*)ev;
 
-    xkbi->shiftKeyCount = 0;
-    xkbi->lastPtrEventTime= event->time;
+    dev = (IsMaster(mouse) || mouse->u.master) ? GetMaster(mouse, MASTER_KEYBOARD) : mouse;
+
+    if (dev && dev->key)
+    {
+	xkbi = dev->key->xkbInfo;
+	xkbi->shiftKeyCount = 0;
+	xkbi->lastPtrEventTime= event->time;
+    }
 
     if (event->type == ET_ButtonPress) {
 	    changed |= XkbPointerButtonMask;
     }
     else if (event->type == ET_ButtonRelease) {
-	xkbi->lockedPtrButtons&= ~(1 << (event->detail.key & 0x7));
+	if (xkbi)
+	    xkbi->lockedPtrButtons&= ~(1 << (event->detail.key & 0x7));
 	changed |= XkbPointerButtonMask;
     }
 
@@ -726,6 +733,9 @@ DeviceEvent     *event = (DeviceEvent*)ev;
     COND_WRAP_PROCESS_INPUT_PROC(mouse, xkbPrivPtr,
 				     backupproc, xkbUnwrapProc);
 
+    if (!xkbi)
+	return;
+
     xkbi->state.ptr_buttons = (mouse->button) ? mouse->button->state : 0;
     
     /* clear any latched modifiers */
commit 38df8351b36195070232b42a6d3369a9a08df8df
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 1 17:09:03 2009 +1000

    test: add grab matching tests.

diff --git a/test/input.c b/test/input.c
index 2f7bc71..2221c03 100644
--- a/test/input.c
+++ b/test/input.c
@@ -36,6 +36,7 @@
 #include "inputstr.h"
 #include "eventconvert.h"
 #include "exevents.h"
+#include "dixgrabs.h"
 
 #include <glib.h>
 
@@ -309,6 +310,367 @@ static void xi2_struct_sizes(void)
 }
 
 
+static void dix_grab_matching(void)
+{
+    DeviceIntRec xi_all_devices, xi_all_master_devices, dev1, dev2;
+    GrabRec a, b;
+    BOOL rc;
+
+    memset(&a, 0, sizeof(a));
+    memset(&b, 0, sizeof(b));
+
+    /* different grabtypes must fail */
+    a.grabtype = GRABTYPE_CORE;
+    b.grabtype = GRABTYPE_XI2;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == FALSE);
+
+    a.grabtype = GRABTYPE_XI;
+    b.grabtype = GRABTYPE_XI2;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == FALSE);
+
+    a.grabtype = GRABTYPE_XI;
+    b.grabtype = GRABTYPE_CORE;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == FALSE);
+
+    /* XI2 grabs for different devices must fail, regardless of ignoreDevice
+     * XI2 grabs for master devices must fail against a slave */
+    memset(&xi_all_devices, 0, sizeof(DeviceIntRec));
+    memset(&xi_all_master_devices, 0, sizeof(DeviceIntRec));
+    memset(&dev1, 0, sizeof(DeviceIntRec));
+    memset(&dev2, 0, sizeof(DeviceIntRec));
+
+    xi_all_devices.id = XIAllDevices;
+    xi_all_master_devices.id = XIAllMasterDevices;
+    dev1.id = 10;
+    dev1.type = SLAVE;
+    dev2.id = 11;
+    dev2.type = SLAVE;
+
+    inputInfo.all_devices = &xi_all_devices;
+    inputInfo.all_master_devices = &xi_all_master_devices;
+    a.grabtype = GRABTYPE_XI2;
+    b.grabtype = GRABTYPE_XI2;
+    a.device = &dev1;
+    b.device = &dev2;
+
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+
+    a.device = &dev2;
+    b.device = &dev1;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&a, &b, TRUE);
+    g_assert(rc == FALSE);
+
+    a.device = inputInfo.all_master_devices;
+    b.device = &dev1;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&a, &b, TRUE);
+    g_assert(rc == FALSE);
+
+    a.device = &dev1;
+    b.device = inputInfo.all_master_devices;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&a, &b, TRUE);
+    g_assert(rc == FALSE);
+
+    /* ignoreDevice FALSE must fail for different devices for CORE and XI */
+    a.grabtype = GRABTYPE_XI;
+    b.grabtype = GRABTYPE_XI;
+    a.device = &dev1;
+    b.device = &dev2;
+    a.modifierDevice = &dev1;
+    b.modifierDevice = &dev1;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+
+    a.grabtype = GRABTYPE_CORE;
+    b.grabtype = GRABTYPE_CORE;
+    a.device = &dev1;
+    b.device = &dev2;
+    a.modifierDevice = &dev1;
+    b.modifierDevice = &dev1;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+
+    /* ignoreDevice FALSE must fail for different modifier devices for CORE
+     * and XI */
+    a.grabtype = GRABTYPE_XI;
+    b.grabtype = GRABTYPE_XI;
+    a.device = &dev1;
+    b.device = &dev1;
+    a.modifierDevice = &dev1;
+    b.modifierDevice = &dev2;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+
+    a.grabtype = GRABTYPE_CORE;
+    b.grabtype = GRABTYPE_CORE;
+    a.device = &dev1;
+    b.device = &dev1;
+    a.modifierDevice = &dev1;
+    b.modifierDevice = &dev2;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+
+    /* different event type must fail */
+    a.grabtype = GRABTYPE_XI2;
+    b.grabtype = GRABTYPE_XI2;
+    a.device = &dev1;
+    b.device = &dev1;
+    a.modifierDevice = &dev1;
+    b.modifierDevice = &dev1;
+    a.type = XI_KeyPress;
+    b.type = XI_KeyRelease;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&a, &b, TRUE);
+    g_assert(rc == FALSE);
+
+    a.grabtype = GRABTYPE_CORE;
+    b.grabtype = GRABTYPE_CORE;
+    a.device = &dev1;
+    b.device = &dev1;
+    a.modifierDevice = &dev1;
+    b.modifierDevice = &dev1;
+    a.type = XI_KeyPress;
+    b.type = XI_KeyRelease;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&a, &b, TRUE);
+    g_assert(rc == FALSE);
+
+    a.grabtype = GRABTYPE_XI;
+    b.grabtype = GRABTYPE_XI;
+    a.device = &dev1;
+    b.device = &dev1;
+    a.modifierDevice = &dev1;
+    b.modifierDevice = &dev1;
+    a.type = XI_KeyPress;
+    b.type = XI_KeyRelease;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&a, &b, TRUE);
+    g_assert(rc == FALSE);
+
+    /* different modifiers must fail */
+    a.grabtype = GRABTYPE_XI2;
+    b.grabtype = GRABTYPE_XI2;
+    a.device = &dev1;
+    b.device = &dev1;
+    a.modifierDevice = &dev1;
+    b.modifierDevice = &dev1;
+    a.type = XI_KeyPress;
+    b.type = XI_KeyPress;
+    a.modifiersDetail.exact = 1;
+    b.modifiersDetail.exact = 2;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == FALSE);
+
+    a.grabtype = GRABTYPE_CORE;
+    b.grabtype = GRABTYPE_CORE;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == FALSE);
+
+    a.grabtype = GRABTYPE_XI;
+    b.grabtype = GRABTYPE_XI;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == FALSE);
+
+    /* AnyModifier must fail for XI2 */
+    a.grabtype = GRABTYPE_XI2;
+    b.grabtype = GRABTYPE_XI2;
+    a.modifiersDetail.exact = AnyModifier;
+    b.modifiersDetail.exact = 1;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == FALSE);
+
+    /* XIAnyModifier must fail for CORE and XI */
+    a.grabtype = GRABTYPE_XI;
+    b.grabtype = GRABTYPE_XI;
+    a.modifiersDetail.exact = XIAnyModifier;
+    b.modifiersDetail.exact = 1;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == FALSE);
+
+    a.grabtype = GRABTYPE_CORE;
+    b.grabtype = GRABTYPE_CORE;
+    a.modifiersDetail.exact = XIAnyModifier;
+    b.modifiersDetail.exact = 1;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == FALSE);
+
+    /* different detail must fail */
+    a.grabtype = GRABTYPE_XI2;
+    b.grabtype = GRABTYPE_XI2;
+    a.detail.exact = 1;
+    b.detail.exact = 2;
+    a.modifiersDetail.exact = 1;
+    b.modifiersDetail.exact = 1;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == FALSE);
+
+    a.grabtype = GRABTYPE_XI;
+    b.grabtype = GRABTYPE_XI;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == FALSE);
+
+    a.grabtype = GRABTYPE_CORE;
+    b.grabtype = GRABTYPE_CORE;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == FALSE);
+
+    /* detail of AnyModifier must fail */
+    a.grabtype = GRABTYPE_XI2;
+    b.grabtype = GRABTYPE_XI2;
+    a.detail.exact = AnyModifier;
+    b.detail.exact = 1;
+    a.modifiersDetail.exact = 1;
+    b.modifiersDetail.exact = 1;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == FALSE);
+
+    a.grabtype = GRABTYPE_CORE;
+    b.grabtype = GRABTYPE_CORE;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == FALSE);
+
+    a.grabtype = GRABTYPE_XI;
+    b.grabtype = GRABTYPE_XI;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == FALSE);
+
+    /* detail of XIAnyModifier must fail */
+    a.grabtype = GRABTYPE_XI2;
+    b.grabtype = GRABTYPE_XI2;
+    a.detail.exact = XIAnyModifier;
+    b.detail.exact = 1;
+    a.modifiersDetail.exact = 1;
+    b.modifiersDetail.exact = 1;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == FALSE);
+
+    a.grabtype = GRABTYPE_CORE;
+    b.grabtype = GRABTYPE_CORE;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == FALSE);
+
+    a.grabtype = GRABTYPE_XI;
+    b.grabtype = GRABTYPE_XI;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == FALSE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == FALSE);
+
+    /* XIAnyModifier or AnyModifer must succeed */
+    a.grabtype = GRABTYPE_XI2;
+    b.grabtype = GRABTYPE_XI2;
+    a.detail.exact = 1;
+    b.detail.exact = 1;
+    a.modifiersDetail.exact = XIAnyModifier;
+    b.modifiersDetail.exact = 1;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == TRUE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == TRUE);
+
+    a.grabtype = GRABTYPE_CORE;
+    b.grabtype = GRABTYPE_CORE;
+    a.detail.exact = 1;
+    b.detail.exact = 1;
+    a.modifiersDetail.exact = AnyModifier;
+    b.modifiersDetail.exact = 1;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == TRUE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == TRUE);
+
+    a.grabtype = GRABTYPE_XI;
+    b.grabtype = GRABTYPE_XI;
+    a.detail.exact = 1;
+    b.detail.exact = 1;
+    a.modifiersDetail.exact = AnyModifier;
+    b.modifiersDetail.exact = 1;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == TRUE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == TRUE);
+
+    /* AnyKey or XIAnyKeysym must succeed */
+    a.grabtype = GRABTYPE_XI2;
+    b.grabtype = GRABTYPE_XI2;
+    a.detail.exact = XIAnyKeysym;
+    b.detail.exact = 1;
+    a.modifiersDetail.exact = 1;
+    b.modifiersDetail.exact = 1;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == TRUE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == TRUE);
+
+    a.grabtype = GRABTYPE_CORE;
+    b.grabtype = GRABTYPE_CORE;
+    a.detail.exact = AnyKey;
+    b.detail.exact = 1;
+    a.modifiersDetail.exact = 1;
+    b.modifiersDetail.exact = 1;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == TRUE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == TRUE);
+
+    a.grabtype = GRABTYPE_XI;
+    b.grabtype = GRABTYPE_XI;
+    a.detail.exact = AnyKey;
+    b.detail.exact = 1;
+    a.modifiersDetail.exact = 1;
+    b.modifiersDetail.exact = 1;
+    rc = GrabMatchesSecond(&a, &b, FALSE);
+    g_assert(rc == TRUE);
+    rc = GrabMatchesSecond(&b, &a, FALSE);
+    g_assert(rc == TRUE);
+}
+
 int main(int argc, char** argv)
 {
     g_test_init(&argc, &argv,NULL);
@@ -318,6 +680,7 @@ int main(int argc, char** argv)
     g_test_add_func("/dix/input/event-core-conversion", dix_event_to_core_conversion);
     g_test_add_func("/dix/input/check-grab-values", dix_check_grab_values);
     g_test_add_func("/dix/input/xi2-struct-sizes", xi2_struct_sizes);
+    g_test_add_func("/dix/input/grab_matching", dix_grab_matching);
 
     return g_test_run();
 }
commit a66686a83edd6093ed540414dda2b8700e4696fe
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 1 15:37:53 2009 +1000

    input: add support for XIAllDevices and XIAllMasterDevices passive grabs.
    
    These grabs are suported through two fake devices inputInfo.all_devices and
    inputInfo.all_master_devices. These devices are not part of the device list
    and are only initialised for their device id, nothing else.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/extinit.c b/Xi/extinit.c
index 7e5111d..23704b1 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -188,6 +188,9 @@ static struct dev_type
 CARD8 event_base[numInputClasses];
 XExtEventInfo EventInfo[32];
 
+static DeviceIntRec xi_all_devices;
+static DeviceIntRec xi_all_master_devices;
+
 /**
  * Dispatch vector. Functions defined in here will be called when the matching
  * request arrives.
@@ -1215,6 +1218,17 @@ XInputExtensionInit(void)
 	EventSwapVector[DevicePresenceNotify] = SEventIDispatch;
 
 	GERegisterExtension(IReqCode, XI2EventSwap);
+
+
+	memset(&xi_all_devices, 0, sizeof(xi_all_devices));
+	memset(&xi_all_master_devices, 0, sizeof(xi_all_master_devices));
+	xi_all_devices.id = XIAllDevices;
+	xi_all_devices.name = "XIAllDevices";
+	xi_all_master_devices.id = XIAllMasterDevices;
+	xi_all_master_devices.name = "XIAllMasterDevices";
+
+	inputInfo.all_devices = &xi_all_devices;
+	inputInfo.all_master_devices = &xi_all_master_devices;
     } else {
 	FatalError("IExtensionInit: AddExtensions failed\n");
     }
diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index fab3335..0c74544 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -90,9 +90,16 @@ ProcXIPassiveGrabDevice(ClientPtr client)
     REQUEST(xXIPassiveGrabDeviceReq);
     REQUEST_AT_LEAST_SIZE(xXIPassiveGrabDeviceReq);
 
-    ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGrabAccess);
-    if (ret != Success)
-	return ret;
+    if (stuff->deviceid == XIAllDevices)
+        dev = inputInfo.all_devices;
+    else if (stuff->deviceid == XIAllMasterDevices)
+        dev = inputInfo.all_master_devices;
+    else
+    {
+        ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGrabAccess);
+        if (ret != Success)
+            return ret;
+    }
 
     if (stuff->grab_type != XIGrabtypeButton &&
         stuff->grab_type != XIGrabtypeKeysym &&
diff --git a/dix/events.c b/dix/events.c
index 13ef5b8..d73487a 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -248,6 +248,18 @@ static Bool CheckPassiveGrabsOnWindow(WindowPtr pWin,
  *
  *     inputInfo.numDevices
  *     Total number of devices.
+ *
+ *     inputInfo.all_devices
+ *     Virtual device used for XIAllDevices passive grabs. This device is
+ *     not part of the inputInfo.devices list and mostly unset except for
+ *     the deviceid. It exists because passivegrabs need a valid device
+ *     reference.
+ *
+ *     inputInfo.all_master_devices
+ *     Virtual device used for XIAllMasterDevices passive grabs. This device
+ *     is not part of the inputInfo.devices list and mostly unset except for
+ *     the deviceid. It exists because passivegrabs need a valid device
+ *     reference.
  */
 InputInfo inputInfo;
 
diff --git a/dix/grabs.c b/dix/grabs.c
index 02f63f9..cc77477 100644
--- a/dix/grabs.c
+++ b/dix/grabs.c
@@ -267,7 +267,25 @@ GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice)
     if (pFirstGrab->grabtype != pSecondGrab->grabtype)
         return FALSE;
 
-    if (!ignoreDevice &&
+    if (pFirstGrab->grabtype == GRABTYPE_XI2)
+    {
+        if (pFirstGrab->device == inputInfo.all_devices ||
+            pSecondGrab->device == inputInfo.all_devices)
+        {
+            /* do nothing */
+        } else if (pFirstGrab->device == inputInfo.all_master_devices)
+        {
+            if (pSecondGrab->device != inputInfo.all_master_devices &&
+                !IsMaster(pSecondGrab->device))
+                return FALSE;
+        } else if (pSecondGrab->device == inputInfo.all_master_devices)
+        {
+            if (pFirstGrab->device != inputInfo.all_master_devices &&
+                !IsMaster(pFirstGrab->device))
+                return FALSE;
+        } else if (pSecondGrab->device != pFirstGrab->device)
+            return FALSE;
+    } else if (!ignoreDevice &&
             ((pFirstGrab->device != pSecondGrab->device) ||
              (pFirstGrab->modifierDevice != pSecondGrab->modifierDevice)))
             return FALSE;
diff --git a/include/inputstr.h b/include/inputstr.h
index 7f6e6ca..f233034 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -528,6 +528,8 @@ typedef struct {
     DeviceIntPtr	off_devices;	/* all devices turned off */
     DeviceIntPtr	keyboard;	/* the main one for the server */
     DeviceIntPtr	pointer;
+    DeviceIntPtr	all_devices;
+    DeviceIntPtr	all_master_devices;
 } InputInfo;
 
 extern _X_EXPORT InputInfo inputInfo;
commit f00cf7675164bb984ef310412f9e09582813adb1
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 2 10:23:21 2009 +1000

    dix: get the current MD keyboard for the grab modifier state.
    
    A passive XI2 grab always uses the paired master device as a modifier
    device. After issuing a passive grab, the slave may be reattached to a
    different master and hence the modifier device may change.

diff --git a/dix/events.c b/dix/events.c
index 52c5e6c..13ef5b8 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3417,7 +3417,17 @@ CheckPassiveGrabsOnWindow(
                 gdev = GetPairedDevice(device);
             else
                 gdev = device;
+        } else if (grab->grabtype == GRABTYPE_XI2)
+        {
+            /* if the device is an attached slave device, gdev must be the
+             * attached master keyboard. Since the slave may have been
+             * reattached after the grab, the modifier device may not be the
+             * same. */
+            if (!IsMaster(grab->device) && device->u.master)
+                gdev = GetMaster(device, MASTER_KEYBOARD);
         }
+
+
         if (gdev && gdev->key)
             xkbi= gdev->key->xkbInfo;
 	tempGrab.modifierDevice = grab->modifierDevice;
commit 1cd7ed75d903b5b0ea4e1070d2c26f4f931bdec7
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 1 17:14:06 2009 +1000

    dix: float slave devices during passive grabs.
    
    Exception - implicit passive grabs.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/events.c b/dix/events.c
index cf9ee60..52c5e6c 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -1506,7 +1506,7 @@ ActivatePointerGrab(DeviceIntPtr mouse, GrabPtr grab,
     Bool isPassive = autoGrab & ~ImplicitGrabMask;
 
     /* slave devices need to float for the duration of the grab. */
-    if (!isPassive && !IsMaster(mouse))
+    if (!(autoGrab & ImplicitGrabMask) && !IsMaster(mouse))
         DetachFromMaster(mouse);
 
     if (grab->confineTo)
@@ -1543,7 +1543,8 @@ DeactivatePointerGrab(DeviceIntPtr mouse)
 {
     GrabPtr grab = mouse->deviceGrab.grab;
     DeviceIntPtr dev;
-    Bool  wasPassive= mouse->deviceGrab.fromPassiveGrab;
+    Bool wasImplicit = (mouse->deviceGrab.fromPassiveGrab &&
+                        mouse->deviceGrab.implicitGrab);
 
     mouse->valuator->motionHintWindow = NullWindow;
     mouse->deviceGrab.grab = NullGrab;
@@ -1563,7 +1564,7 @@ DeactivatePointerGrab(DeviceIntPtr mouse)
     if (grab->cursor)
 	FreeCursor(grab->cursor, (Cursor)0);
 
-    if (!wasPassive)
+    if (!wasImplicit)
         ReattachToOldMaster(mouse);
 
     ComputeFreezes();
@@ -1581,7 +1582,7 @@ ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time, Bool pass
     WindowPtr oldWin;
 
     /* slave devices need to float for the duration of the grab. */
-    if (!passive && !IsMaster(keybd))
+    if (!(passive & ImplicitGrabMask) && !IsMaster(keybd))
         DetachFromMaster(keybd);
 
     if (grabinfo->grab)
@@ -1616,7 +1617,8 @@ DeactivateKeyboardGrab(DeviceIntPtr keybd)
     DeviceIntPtr dev;
     WindowPtr focusWin = keybd->focus ? keybd->focus->win
                                            : keybd->spriteInfo->sprite->win;
-    Bool wasPassive = keybd->deviceGrab.fromPassiveGrab;
+    Bool wasImplicit = (keybd->deviceGrab.fromPassiveGrab &&
+                        keybd->deviceGrab.implicitGrab);
 
     if (focusWin == FollowKeyboardWin)
 	focusWin = inputInfo.keyboard->focus->win;
@@ -1633,7 +1635,7 @@ DeactivateKeyboardGrab(DeviceIntPtr keybd)
     }
     DoFocusEvents(keybd, grab->window, focusWin, NotifyUngrab);
 
-    if (!wasPassive)
+    if (!wasImplicit)
         ReattachToOldMaster(keybd);
 
     ComputeFreezes();
commit f56ad22e8fabdca6d9fd1e408a539696e30599fc
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 2 15:07:53 2009 +1000

    dix: rework temporary slave detachment.
    
    Rework addresses two issues:
    - storing the master device's pointer is a bad idea, we need to store the ID
      of the device in case it disappears during the grab.
    - restoring the old master did not actually reattach the device. Fixed now.

diff --git a/dix/events.c b/dix/events.c
index 8a340b6..cf9ee60 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -1435,44 +1435,47 @@ CheckGrabForSyncs(DeviceIntPtr thisDev, Bool thisMode, Bool otherMode)
 /* Only ever used if a grab is called on an attached slave device. */
 static int GrabPrivateKeyIndex;
 static DevPrivateKey GrabPrivateKey = &GrabPrivateKeyIndex;
-typedef struct _GrabMemoryRec {
-    DeviceIntPtr oldmaster;
-} GrabMemoryRec, *GrabMemoryPtr;
 
 /**
  * Save the device's master device in the devPrivates. This needs to be done
  * if a client directly grabs a slave device that is attached to a master. For
  * the duration of the grab, the device is detached, ungrabbing re-attaches it
  * though.
+ *
+ * We store the ID of the master device only in case the master disappears
+ * while the device has a grab.
  */
 static void
-SaveOldMaster(DeviceIntPtr dev)
+DetachFromMaster(DeviceIntPtr dev)
 {
-    GrabMemoryPtr gm;
-
-    if (!(gm = xalloc(sizeof(GrabMemoryRec))))
-    {
-        ErrorF("[dix] Cannot allocate grab private. Grab not "
-                "possible on device.\n");
+    int id;
+    if (!dev->u.master)
         return;
-    }
-    gm->oldmaster = dev->u.master;
-    dixSetPrivate(&dev->devPrivates, GrabPrivateKey, gm);
+
+    id = dev->u.master->id;
+
+    dixSetPrivate(&dev->devPrivates, GrabPrivateKey, (void *)id);
+    AttachDevice(NULL, dev, NULL);
 }
 
 static void
-RestoreOldMaster(DeviceIntPtr dev)
+ReattachToOldMaster(DeviceIntPtr dev)
 {
-    GrabMemoryPtr gm;
+    int id;
+    void *p;
+    DeviceIntPtr master = NULL;
 
     if (IsMaster(dev))
         return;
 
-    gm = (GrabMemoryPtr)dixLookupPrivate(&dev->devPrivates, GrabPrivateKey);
-    if (gm)
+
+    p = dixLookupPrivate(&dev->devPrivates, GrabPrivateKey);
+    id = (int)p; /* silence gcc warnings */
+    dixLookupDevice(&master, id, serverClient, DixUseAccess);
+
+    if (master)
     {
-        dev->u.master = gm->oldmaster;
-        xfree(gm);
+        AttachDevice(serverClient, dev, master);
         dixSetPrivate(&dev->devPrivates, GrabPrivateKey, NULL);
     }
 }
@@ -1504,10 +1507,7 @@ ActivatePointerGrab(DeviceIntPtr mouse, GrabPtr grab,
 
     /* slave devices need to float for the duration of the grab. */
     if (!isPassive && !IsMaster(mouse))
-    {
-        SaveOldMaster(mouse);
-        AttachDevice(NULL, mouse, NULL);
-    }
+        DetachFromMaster(mouse);
 
     if (grab->confineTo)
     {
@@ -1564,7 +1564,7 @@ DeactivatePointerGrab(DeviceIntPtr mouse)
 	FreeCursor(grab->cursor, (Cursor)0);
 
     if (!wasPassive)
-        RestoreOldMaster(mouse);
+        ReattachToOldMaster(mouse);
 
     ComputeFreezes();
 }
@@ -1582,10 +1582,7 @@ ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time, Bool pass
 
     /* slave devices need to float for the duration of the grab. */
     if (!passive && !IsMaster(keybd))
-    {
-        SaveOldMaster(keybd);
-        AttachDevice(NULL, keybd, NULL);
-    }
+        DetachFromMaster(keybd);
 
     if (grabinfo->grab)
 	oldWin = grabinfo->grab->window;
@@ -1637,7 +1634,7 @@ DeactivateKeyboardGrab(DeviceIntPtr keybd)
     DoFocusEvents(keybd, grab->window, focusWin, NotifyUngrab);
 
     if (!wasPassive)
-        RestoreOldMaster(keybd);
+        ReattachToOldMaster(keybd);
 
     ComputeFreezes();
 }
commit b3e4810a283d369e1a2c6c3288177fe79fd1e9d6
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 1 16:22:51 2009 +1000

    dix: move grab device assignment into GRABTYPE_CORE block.
    
    grab->type is the device type and XI2 types overlap with core events (being
    less than GenericEvent). Thus, for passive grabs the grab device would be
    overwritten with whatever device was activating it.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/events.c b/dix/events.c
index 3fd1dab..8a340b6 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3461,19 +3461,6 @@ CheckPassiveGrabsOnWindow(
             event->corestate &= 0x1f00;
             event->corestate |= tempGrab.modifiersDetail.exact & (~0x1f00);
             grabinfo = &device->deviceGrab;
-            /* A passive grab may have been created for a different device
-               than it is assigned to at this point in time.
-               Update the grab's device and modifier device to reflect the
-               current state.
-               Since XGrabDeviceButton requires to specify the
-               modifierDevice explicitly, we don't override this choice.
-             */
-            if (tempGrab.type < GenericEvent)
-            {
-                grab->device = device;
-                grab->modifierDevice = GetPairedDevice(device);
-            }
-
             /* In some cases a passive core grab may exist, but the client
              * already has a core grab on some other device. In this case we
              * must not get the grab, otherwise we may never ungrab the
@@ -3484,6 +3471,20 @@ CheckPassiveGrabsOnWindow(
             {
                 DeviceIntPtr other;
                 BOOL interfering = FALSE;
+
+                /* A passive grab may have been created for a different device
+                   than it is assigned to at this point in time.
+                   Update the grab's device and modifier device to reflect the
+                   current state.
+                   Since XGrabDeviceButton requires to specify the
+                   modifierDevice explicitly, we don't override this choice.
+                   */
+                if (tempGrab.type < GenericEvent)
+                {
+                    grab->device = device;
+                    grab->modifierDevice = GetPairedDevice(device);
+                }
+
                 for (other = inputInfo.devices; other; other = other->next)
                 {
                     GrabPtr othergrab = other->deviceGrab.grab;
commit 18ae48670859d05788776e164c65985e3b35a723
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 1 16:06:52 2009 +1000

    dix: don't try to activate a passive grab on top of an active one.
    
    If we already have an active grab on the device, don't attempt to activate
    another one.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/events.c b/dix/events.c
index 229e67d..3fd1dab 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3393,6 +3393,9 @@ CheckPassiveGrabsOnWindow(
 #define XI2_MATCH        0x4
     int match = 0;
 
+    if (device->deviceGrab.grab)
+        return FALSE;
+
     if (!grab)
 	return FALSE;
     /* Fill out the grab details, but leave the type for later before
commit ff1d6244eba8367a8d50601ca393e951c60c94b6
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 1 12:14:52 2009 +1000

    input: add support for XIAnyModifier in passive XI2 grabs.

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 5aca521..b19c8e2 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1406,10 +1406,13 @@ CheckGrabValues(ClientPtr client, GrabParameters* param)
 	client->errorValue = param->other_devices_mode;
 	return BadValue;
     }
-    if ((param->modifiers != AnyModifier) && (param->modifiers & ~AllModifiersMask)) {
+
+    if (param->grabtype != GRABTYPE_XI2 && (param->modifiers != AnyModifier) &&
+        (param->modifiers & ~AllModifiersMask)) {
 	client->errorValue = param->modifiers;
 	return BadValue;
     }
+
     if ((param->ownerEvents != xFalse) && (param->ownerEvents != xTrue)) {
 	client->errorValue = param->ownerEvents;
 	return BadValue;
diff --git a/dix/grabs.c b/dix/grabs.c
index cd90526..02f63f9 100644
--- a/dix/grabs.c
+++ b/dix/grabs.c
@@ -229,9 +229,12 @@ DetailSupersedesSecond(
 static Bool
 GrabSupersedesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
 {
+    unsigned int any_modifier = (pFirstGrab->grabtype == GRABTYPE_XI2) ?
+                                (unsigned int)XIAnyModifier :
+                                (unsigned int)AnyModifier;
     if (!DetailSupersedesSecond(pFirstGrab->modifiersDetail,
 				pSecondGrab->modifiersDetail, 
-				(unsigned int)AnyModifier))
+				any_modifier))
 	return FALSE;
 
     if (DetailSupersedesSecond(pFirstGrab->detail,
@@ -257,6 +260,9 @@ GrabSupersedesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
 Bool
 GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice)
 {
+    unsigned int any_modifier = (pFirstGrab->grabtype == GRABTYPE_XI2) ?
+                                (unsigned int)XIAnyModifier :
+                                (unsigned int)AnyModifier;
 
     if (pFirstGrab->grabtype != pSecondGrab->grabtype)
         return FALSE;
@@ -278,7 +284,7 @@ GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice)
 	&& 
 	DetailSupersedesSecond(pFirstGrab->modifiersDetail,
 			       pSecondGrab->modifiersDetail,
-			       (unsigned int)AnyModifier))
+			       any_modifier))
 	return TRUE;
 
     if (DetailSupersedesSecond(pFirstGrab->detail, pSecondGrab->detail,
@@ -286,7 +292,7 @@ GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice)
 	&& 
 	DetailSupersedesSecond(pSecondGrab->modifiersDetail,
 			       pFirstGrab->modifiersDetail,
-			       (unsigned int)AnyModifier))
+			       any_modifier))
 	return TRUE;
 
     return FALSE;
@@ -295,6 +301,10 @@ GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice)
 static Bool
 GrabsAreIdentical(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
 {
+    unsigned int any_modifier = (pFirstGrab->grabtype == GRABTYPE_XI2) ?
+                                (unsigned int)XIAnyModifier :
+                                (unsigned int)AnyModifier;
+
     if (pFirstGrab->grabtype != pSecondGrab->grabtype)
         return FALSE;
 
@@ -311,12 +321,13 @@ GrabsAreIdentical(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
                                (unsigned int)AnyKey)))
         return FALSE;
 
+
     if (!(DetailSupersedesSecond(pFirstGrab->modifiersDetail, 
                                pSecondGrab->modifiersDetail, 
-                               (unsigned int)AnyModifier) &&
+                               any_modifier) &&
         DetailSupersedesSecond(pSecondGrab->modifiersDetail,
                                pFirstGrab->modifiersDetail,
-                               (unsigned int)AnyModifier)))
+                               any_modifier)))
         return FALSE;
 
     return TRUE;
@@ -391,6 +402,8 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
     Mask ***updates, **details;
     int i, ndels, nadds, nups;
     Bool ok;
+    unsigned int any_modifier;
+    unsigned int any_key;
 
 #define UPDATE(mask,exact) \
 	if (!(details[nups] = DeleteDetailFromMask(mask, exact))) \
@@ -415,6 +428,11 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
 	if (deletes) xfree(deletes);
 	return FALSE;
     }
+
+    any_modifier = (pMinuendGrab->grabtype == GRABTYPE_XI2) ?
+                   (unsigned int)XIAnyModifier : (unsigned int)AnyModifier;
+    any_key = (pMinuendGrab->grabtype == GRABTYPE_XI2) ?
+                   (unsigned int)XIAnyKeysym : (unsigned int)AnyKey;
     ndels = nadds = nups = 0;
     ok = TRUE;
     for (grab = wPassiveGrabs(pMinuendGrab->window);
@@ -429,19 +447,19 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
 	{
 	    deletes[ndels++] = grab;
 	}
-	else if ((grab->detail.exact == AnyKey)
-		 && (grab->modifiersDetail.exact != AnyModifier))
+	else if ((grab->detail.exact == any_key)
+		 && (grab->modifiersDetail.exact != any_modifier))
 	{
 	    UPDATE(grab->detail.pMask, pMinuendGrab->detail.exact);
 	}
-	else if ((grab->modifiersDetail.exact == AnyModifier) 
-		 && (grab->detail.exact != AnyKey))
+	else if ((grab->modifiersDetail.exact == any_modifier)
+		 && (grab->detail.exact != any_key))
 	{
 	    UPDATE(grab->modifiersDetail.pMask,
 		   pMinuendGrab->modifiersDetail.exact);
 	}
-	else if ((pMinuendGrab->detail.exact != AnyKey)
-		 && (pMinuendGrab->modifiersDetail.exact != AnyModifier))
+	else if ((pMinuendGrab->detail.exact != any_key)
+		 && (pMinuendGrab->modifiersDetail.exact != any_modifier))
 	{
 	    GrabPtr pNewGrab;
             GrabParameters param;
@@ -452,7 +470,7 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
             param.ownerEvents = grab->ownerEvents;
             param.this_device_mode = grab->keyboardMode;
             param.other_devices_mode = grab->pointerMode;
-            param.modifiers = AnyModifier;
+            param.modifiers = any_modifier;
 
 	    pNewGrab = CreateGrab(CLIENT_ID(grab->resource), grab->device,
 				  grab->modifierDevice, grab->window,
@@ -479,7 +497,7 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
 	    else
 		adds[nadds++] = pNewGrab;
 	}   
-	else if (pMinuendGrab->detail.exact == AnyKey)
+	else if (pMinuendGrab->detail.exact == any_key)
 	{
 	    UPDATE(grab->modifiersDetail.pMask,
 		   pMinuendGrab->modifiersDetail.exact);
commit eb97d125fb6adeff0b23c2460108e0587ba253e2
Author: Adam Jackson <ajax at redhat.com>
Date:   Mon Jun 1 15:50:50 2009 -0400

    doc: Remove mention of Kerberos replay cache from Xserver.1
    
    The krb5 auth code is gone, so this is no longer relevant.

diff --git a/doc/Xserver.man.pre b/doc/Xserver.man.pre
index e2673f7..12b4cd4 100644
--- a/doc/Xserver.man.pre
+++ b/doc/Xserver.man.pre
@@ -560,9 +560,6 @@ Outline font directories
 .I /tmp/.X11-unix/X\fBn\fP
 Unix domain socket for display number \fBn\fP
 .TP 30
-.IR /tmp/rcX\fBn\fP
-Kerberos 5 replay cache for display number \fBn\fP
-.TP 30
 .I /usr/adm/X\fBn\fPmsgs
 Error log file for display number \fBn\fP if run from \fIinit\fP(__adminmansuffix__)
 .TP 30
commit 80ea32ad4f1440d068e18db65830f45498703b09
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 1 12:06:55 2009 +1000

    dix: switch grab checking from unsigned shorts to unsigned ints
    
    XIAnyModifier is outside of the unsigned short range.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/grabs.c b/dix/grabs.c
index 0df8ad1..cd90526 100644
--- a/dix/grabs.c
+++ b/dix/grabs.c
@@ -154,7 +154,7 @@ DeletePassiveGrab(pointer value, XID id)
 }
 
 static Mask *
-DeleteDetailFromMask(Mask *pDetailMask, unsigned short detail)
+DeleteDetailFromMask(Mask *pDetailMask, unsigned int detail)
 {
     Mask *mask;
     int i;
@@ -177,7 +177,7 @@ static Bool
 IsInGrabMask(
     DetailRec firstDetail,
     DetailRec secondDetail,
-    unsigned short exception)
+    unsigned int exception)
 {
     if (firstDetail.exact == exception)
     {
@@ -197,9 +197,9 @@ IsInGrabMask(
 
 static Bool 
 IdenticalExactDetails(
-    unsigned short firstExact,
-    unsigned short secondExact,
-    unsigned short exception)
+    unsigned int firstExact,
+    unsigned int secondExact,
+    unsigned int exception)
 {
     if ((firstExact == exception) || (secondExact == exception))
 	return FALSE;
@@ -214,7 +214,7 @@ static Bool
 DetailSupersedesSecond(
     DetailRec firstDetail,
     DetailRec secondDetail,
-    unsigned short exception)
+    unsigned int exception)
 {
     if (IsInGrabMask(firstDetail, secondDetail, exception))
 	return TRUE;
@@ -231,11 +231,11 @@ GrabSupersedesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
 {
     if (!DetailSupersedesSecond(pFirstGrab->modifiersDetail,
 				pSecondGrab->modifiersDetail, 
-				(unsigned short)AnyModifier))
+				(unsigned int)AnyModifier))
 	return FALSE;
 
     if (DetailSupersedesSecond(pFirstGrab->detail,
-			       pSecondGrab->detail, (unsigned short)AnyKey))
+			       pSecondGrab->detail, (unsigned int)AnyKey))
 	return TRUE;
  
     return FALSE;
@@ -274,19 +274,19 @@ GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice)
 	return TRUE;
  
     if (DetailSupersedesSecond(pSecondGrab->detail, pFirstGrab->detail,
-			       (unsigned short)AnyKey) 
+			       (unsigned int)AnyKey)
 	&& 
 	DetailSupersedesSecond(pFirstGrab->modifiersDetail,
 			       pSecondGrab->modifiersDetail,
-			       (unsigned short)AnyModifier))
+			       (unsigned int)AnyModifier))
 	return TRUE;
 
     if (DetailSupersedesSecond(pFirstGrab->detail, pSecondGrab->detail,
-			       (unsigned short)AnyKey)
+			       (unsigned int)AnyKey)
 	&& 
 	DetailSupersedesSecond(pSecondGrab->modifiersDetail,
 			       pFirstGrab->modifiersDetail,
-			       (unsigned short)AnyModifier))
+			       (unsigned int)AnyModifier))
 	return TRUE;
 
     return FALSE;
@@ -305,18 +305,18 @@ GrabsAreIdentical(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
 
     if (!(DetailSupersedesSecond(pFirstGrab->detail, 
                                pSecondGrab->detail, 
-                               (unsigned short)AnyKey) && 
+                               (unsigned int)AnyKey) &&
         DetailSupersedesSecond(pSecondGrab->detail,
                                pFirstGrab->detail,
-                               (unsigned short)AnyKey)))
+                               (unsigned int)AnyKey)))
         return FALSE;
 
     if (!(DetailSupersedesSecond(pFirstGrab->modifiersDetail, 
                                pSecondGrab->modifiersDetail, 
-                               (unsigned short)AnyModifier) && 
+                               (unsigned int)AnyModifier) &&
         DetailSupersedesSecond(pSecondGrab->modifiersDetail,
                                pFirstGrab->modifiersDetail,
-                               (unsigned short)AnyModifier)))
+                               (unsigned int)AnyModifier)))
         return FALSE;
 
     return TRUE;
diff --git a/include/inputstr.h b/include/inputstr.h
index 5c74ba3..7f6e6ca 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -146,7 +146,7 @@ typedef struct _OtherInputMasks {
                                            3 buttons. */
 
 typedef struct _DetailRec {		/* Grab details may be bit masks */
-    unsigned short      exact;
+    unsigned int        exact;
     Mask                *pMask;
 } DetailRec;
 
commit 080b0331b3d1de1bab5ecdc9df175b287616e358
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 1 13:33:29 2009 +1000

    input: Add grabtype to GrabParameters.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 781f4b8..5aca521 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1388,6 +1388,14 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
 int
 CheckGrabValues(ClientPtr client, GrabParameters* param)
 {
+    if (param->grabtype != GRABTYPE_CORE &&
+        param->grabtype != GRABTYPE_XI &&
+        param->grabtype != GRABTYPE_XI2)
+    {
+        ErrorF("[Xi] grabtype is invalid. This is a bug.\n");
+        return BadImplementation;
+    }
+
     if ((param->this_device_mode != GrabModeSync) &&
 	(param->this_device_mode != GrabModeAsync)) {
 	client->errorValue = param->this_device_mode;
diff --git a/Xi/grabdevb.c b/Xi/grabdevb.c
index 0d1eb63..7cd5cc4 100644
--- a/Xi/grabdevb.c
+++ b/Xi/grabdevb.c
@@ -139,6 +139,7 @@ ProcXGrabDeviceButton(ClientPtr client)
 	return ret;
 
     memset(&param, 0, sizeof(param));
+    param.grabtype = GRABTYPE_XI;
     param.ownerEvents = stuff->ownerEvents;
     param.this_device_mode = stuff->this_device_mode;
     param.other_devices_mode = stuff->other_devices_mode;
diff --git a/Xi/grabdevk.c b/Xi/grabdevk.c
index 96e2e62..5ffecd2 100644
--- a/Xi/grabdevk.c
+++ b/Xi/grabdevk.c
@@ -137,6 +137,7 @@ ProcXGrabDeviceKey(ClientPtr client)
 
 
     memset(&param, 0, sizeof(param));
+    param.grabtype = GRABTYPE_XI;
     param.ownerEvents = stuff->ownerEvents;
     param.this_device_mode = stuff->this_device_mode;
     param.other_devices_mode = stuff->other_devices_mode;
diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index fa76a77..fab3335 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -130,6 +130,7 @@ ProcXIPassiveGrabDevice(ClientPtr client)
     rep.num_modifiers = 0;
 
     memset(&param, 0, sizeof(param));
+    param.grabtype = GRABTYPE_XI2;
     param.ownerEvents = stuff->owner_events;
     param.this_device_mode = stuff->grab_mode;
     param.other_devices_mode = stuff->paired_device_mode;
diff --git a/dix/events.c b/dix/events.c
index b5b0521..229e67d 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -5172,6 +5172,7 @@ ProcGrabKey(ClientPtr client)
     REQUEST_SIZE_MATCH(xGrabKeyReq);
 
     memset(&param, 0, sizeof(param));
+    param.grabtype = GRABTYPE_CORE;
     param.ownerEvents = stuff->ownerEvents;
     param.this_device_mode = stuff->keyboardMode;
     param.other_devices_mode = stuff->pointerMode;
@@ -5287,6 +5288,7 @@ ProcGrabButton(ClientPtr client)
 	return rc;
 
     memset(&param, 0, sizeof(param));
+    param.grabtype = GRABTYPE_CORE;
     param.ownerEvents = stuff->ownerEvents;
     param.this_device_mode = stuff->keyboardMode;
     param.other_devices_mode = stuff->pointerMode;
diff --git a/include/exevents.h b/include/exevents.h
index 5878413..80eaa76 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -44,6 +44,7 @@ typedef struct _XIClientRec {
 
 
 typedef struct _GrabParameters {
+    int                 grabtype;               /* GRABTYPE_CORE, etc. */
     unsigned int        ownerEvents;
     unsigned int        this_device_mode;
     unsigned int        other_devices_mode;
diff --git a/test/input.c b/test/input.c
index 466d187..2f7bc71 100644
--- a/test/input.c
+++ b/test/input.c
@@ -86,6 +86,7 @@ static void dix_check_grab_values(void)
 
     memset(&client, 0, sizeof(client));
 
+    param.grabtype = GRABTYPE_CORE;
     param.this_device_mode = GrabModeSync;
     param.other_devices_mode = GrabModeSync;
     param.modifiers = AnyModifier;
commit bee02a154145c0e4ed97980f7857dc27a96b1be8
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 1 10:49:22 2009 +1000

    dix: ensure implicit passive grabs have the xi2mask zeroed.
    
    This fixes XI2 enter/leave events being sent to non-xi2 clients.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/events.c b/dix/events.c
index 78663ea..b5b0521 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2065,6 +2065,7 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
 	GrabRec tempGrab;
         OtherInputMasks *inputMasks;
 
+        memset(&tempGrab, 0, sizeof(GrabRec));
         tempGrab.next = NULL;
 	tempGrab.device = pDev;
 	tempGrab.resource = client->clientAsMask;
commit cc71dfb4f5cf6113053951070dec9556e941aa24
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 1 13:19:30 2009 +1000

    test: Add GetSelectedEvents request to struct size tests.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/test/input.c b/test/input.c
index 013056f..466d187 100644
--- a/test/input.c
+++ b/test/input.c
@@ -303,6 +303,7 @@ static void xi2_struct_sizes(void)
     compare(xXIChangePropertyReq);
     compare(xXIDeletePropertyReq);
     compare(xXIGetPropertyReq);
+    compare(xXIGetSelectedEventsReq);
 #undef compare
 }
 
commit de5c5b1db083a9c1d23e1461b54ca646c5a5c445
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Jun 1 13:21:36 2009 +1000

    test: fix compile error introduced with the removal of isMaster.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/test/input.c b/test/input.c
index cca1291..013056f 100644
--- a/test/input.c
+++ b/test/input.c
@@ -54,7 +54,7 @@ static void dix_init_valuators(void)
 
 
     memset(&dev, 0, sizeof(DeviceIntRec));
-    dev.isMaster = TRUE; /* claim it's a master to stop ptracccel */
+    dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */
 
     g_assert(InitValuatorClassDeviceStruct(NULL, 0, 0, 0) == FALSE);
     g_assert(InitValuatorClassDeviceStruct(&dev, num_axes, 0, Absolute));
commit 45530d16097459a756696e255ab4e72d6e51fbc4
Author: Adam Jackson <ajax at redhat.com>
Date:   Fri May 29 18:07:48 2009 -0400

    vfb: Fix depth setup.
    
    Initialize the depth corresponding to the root window before the
    pixmap-only depths.  Otherwise you end up with the root window depth in
    the depth list twice, which is mildly confusing for clients and
    catastrophically confusing for PanoramiXConsolidate().

diff --git a/hw/vfb/InitOutput.c b/hw/vfb/InitOutput.c
index 8ab8bae..b4b8455 100644
--- a/hw/vfb/InitOutput.c
+++ b/hw/vfb/InitOutput.c
@@ -863,8 +863,6 @@ vfbScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
     pbits = vfbAllocateFramebufferMemory(pvfb);
     if (!pbits) return FALSE;
 
-    miSetPixmapDepths ();
-
     switch (pvfb->depth) {
     case 8:
 	miSetVisualTypesAndMasks (8,
@@ -876,20 +874,6 @@ vfbScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
 				   (1 << DirectColor)),
 				  8, PseudoColor, 0, 0, 0);
 	break;
-#if 0
-    /* 12bit PseudoColor with 12bit color resolution
-     * (to simulate SGI hardware and the 12bit PseudoColor emulation layer) */
-    case 12:
-	miSetVisualTypesAndMasks (12,
-				  ((1 << StaticGray) |
-				   (1 << GrayScale) |
-				   (1 << StaticColor) |
-				   (1 << PseudoColor) |
-				   (1 << TrueColor) |
-				   (1 << DirectColor)),
-				  12, PseudoColor, 0, 0, 0);
-	break;
-#endif
     case 15:
 	miSetVisualTypesAndMasks (15,
 				  ((1 << TrueColor) |
@@ -908,18 +892,10 @@ vfbScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
 				   (1 << DirectColor)),
 				  8, TrueColor, 0xff0000, 0x00ff00, 0x0000ff);
 	break;
-#if 0
-    /* 30bit TrueColor (to simulate Sun's XVR-1000/-4000 high quality
-     * framebuffer series) */
-    case 30:
-	miSetVisualTypesAndMasks (30,
-				  ((1 << TrueColor) |
-				   (1 << DirectColor)),
-				  10, TrueColor, 0x3ff00000, 0x000ffc00, 0x000003ff);
-	break;
-#endif
     }
-	
+
+    miSetPixmapDepths ();
+
     ret = fbScreenInit(pScreen, pbits, pvfb->width, pvfb->height,
 		       dpix, dpiy, pvfb->paddedWidth,pvfb->bitsPerPixel);
 #ifdef RENDER
commit 5c8540d8cf9ebaafa7572cb2879d057cd3d15190
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Fri May 29 14:49:05 2009 -0700

    GLX: Purge glxint.h usage
    
    Change (__GLXvisualConfig *) to (void *) in ABI compat stubs.
    (cherry picked from commit b4adec886c65e49cfbd30d1e3a41b613f75ed3f5)

diff --git a/glx/glxscreens.c b/glx/glxscreens.c
index 2b12049..3fff268 100644
--- a/glx/glxscreens.c
+++ b/glx/glxscreens.c
@@ -225,7 +225,7 @@ glxGetScreen(ScreenPtr pScreen)
 }
 
 _X_EXPORT void GlxSetVisualConfigs(int nconfigs,
-                         __GLXvisualConfig *configs, void **privates)
+                         void *configs, void **privates)
 {
     /* We keep this stub around for the DDX drivers that still
      * call it. */
diff --git a/glx/glxserver.h b/glx/glxserver.h
index a5ca0a2..3e44b71 100644
--- a/glx/glxserver.h
+++ b/glx/glxserver.h
@@ -55,7 +55,6 @@
 #define GL_GLEXT_PROTOTYPES /* we want prototypes */
 #include <GL/gl.h>
 #include <GL/glxproto.h>
-#include <GL/glxint.h>
 
 /* For glxscreens.h */
 typedef struct __GLXdrawable __GLXdrawable;
@@ -93,7 +92,7 @@ extern __GLXclientState *glxGetClient(ClientPtr pClient);
 void GlxExtensionInit(void);
 
 void GlxSetVisualConfigs(int nconfigs, 
-                         __GLXvisualConfig *configs, void **privates);
+                         void *configs, void **privates);
 
 struct _glapi_table;
 void GlxSetRenderTables (struct _glapi_table *table);
commit da2aaee24a77e1a9e5c623af4a78ca6acc94b787
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Fri May 29 14:27:46 2009 -0700

    GLX: Purge some glxint.h usage in glxcmds.c
    
    This is related to d0b249f1c5df81f3941d638f9625fe1e16c31807 in the 1.4 branch and was ok'd by krh
    (cherry picked from commit e587436cf2e1237813c924699ff0662aea3034e1)

diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 1ae3151..66b1ec7 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -877,6 +877,14 @@ int __glXDisp_CopyContext(__GLXclientState *cl, GLbyte *pc)
     return Success;
 }
 
+enum {
+    GLX_VIS_CONFIG_UNPAIRED = 18,
+    GLX_VIS_CONFIG_PAIRED = 20
+};
+
+enum {
+    GLX_VIS_CONFIG_TOTAL = GLX_VIS_CONFIG_UNPAIRED + GLX_VIS_CONFIG_PAIRED
+};
 
 int __glXDisp_GetVisualConfigs(__GLXclientState *cl, GLbyte *pc)
 {
@@ -885,7 +893,7 @@ int __glXDisp_GetVisualConfigs(__GLXclientState *cl, GLbyte *pc)
     xGLXGetVisualConfigsReply reply;
     __GLXscreen *pGlxScreen;
     __GLXconfig *modes;
-    CARD32 buf[__GLX_TOTAL_CONFIG];
+    CARD32 buf[GLX_VIS_CONFIG_TOTAL];
     int p, i, err;
     __GLX_DECLARE_SWAP_VARIABLES;
     __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
@@ -894,8 +902,8 @@ int __glXDisp_GetVisualConfigs(__GLXclientState *cl, GLbyte *pc)
 	return err;
 
     reply.numVisuals = pGlxScreen->numVisuals;
-    reply.numProps = __GLX_TOTAL_CONFIG;
-    reply.length = (reply.numVisuals * __GLX_SIZE_CARD32 * __GLX_TOTAL_CONFIG) >> 2;
+    reply.numProps = GLX_VIS_CONFIG_TOTAL;
+    reply.length = (reply.numVisuals * __GLX_SIZE_CARD32 * GLX_VIS_CONFIG_TOTAL) >> 2;
     reply.type = X_Reply;
     reply.sequenceNumber = client->sequence;
 
@@ -933,6 +941,8 @@ int __glXDisp_GetVisualConfigs(__GLXclientState *cl, GLbyte *pc)
 	buf[p++] = modes->stencilBits;
 	buf[p++] = modes->numAuxBuffers;
 	buf[p++] = modes->level;
+
+	assert(p == GLX_VIS_CONFIG_UNPAIRED);
 	/* 
 	** Add token/value pairs for extensions.
 	*/
@@ -957,11 +967,11 @@ int __glXDisp_GetVisualConfigs(__GLXclientState *cl, GLbyte *pc)
 	buf[p++] = 0; /* copy over visualSelectGroup (GLX_VISUAL_SELECT_GROUP_SGIX)? */
 	buf[p++] = 0;
 
+	assert(p == GLX_VIS_CONFIG_TOTAL);
 	if (client->swapped) {
-	    __GLX_SWAP_INT_ARRAY(buf, __GLX_TOTAL_CONFIG);
+	    __GLX_SWAP_INT_ARRAY(buf, p);
 	}
-	WriteToClient(client, __GLX_SIZE_CARD32 * __GLX_TOTAL_CONFIG, 
-		(char *)buf);
+	WriteToClient(client, __GLX_SIZE_CARD32 * p, (char *)buf);
     }
     return Success;
 }
commit f2151f1b0dcbfec23488a29a7ea887fbfd53b760
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Fri May 29 14:09:41 2009 -0700

    XQuartz: Fix alpha to be 1 (screenshots bug, etc)
    
    This is related to: bc964ff1e3f3d8ab590eab40d767c6241e9480d4
    XQuartz: Stab at fixing the alpha 0/1 bug (screenshots, etc) by pulling in some old code that got gutted from rootless.
    
    which was on the 1.4 branch and implemented in fbPaintWindow.  Now that fbPaintWindow is gone, this is now in miPaintWindow().
    (cherry picked from commit 032173f693f75385a40e144ffe2b7b5378bb6f2e)

diff --git a/configure.ac b/configure.ac
index daddd09..696e03f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1666,7 +1666,7 @@ if test "x$XQUARTZ" = xyes; then
 
 	AC_CHECK_LIB([Xplugin],[xp_init],[:])
 
-	CFLAGS="${CFLAGS} -DROOTLESS_WORKAROUND -DNO_ALLOCA"
+	CFLAGS="${CFLAGS} -DROOTLESS_WORKAROUND -DROOTLESS_SAFEALPHA -DNO_ALLOCA"
 
 	PKG_CHECK_MODULES(XPBPROXY, [applewmproto >= 1.2] [applewm >= 1.2] xfixes fixesproto x11)
 
diff --git a/mi/miexpose.c b/mi/miexpose.c
index 2c43d98..6ce56ee 100644
--- a/mi/miexpose.c
+++ b/mi/miexpose.c
@@ -522,7 +522,7 @@ void
 miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
 {
     ScreenPtr	pScreen = pWin->drawable.pScreen;
-    ChangeGCVal gcval[5];
+    ChangeGCVal gcval[6];
     BITS32	gcmask;
     GCPtr	pGC;
     int		i;
@@ -590,18 +590,35 @@ miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
     gcval[0].val = GXcopy;
     gcmask = GCFunction;
 
+#ifdef ROOTLESS_SAFEALPHA
+/* Bit mask for alpha channel with a particular number of bits per
+ * pixel. Note that we only care for 32bpp data. Mac OS X uses planar
+ * alpha for 16bpp.
+ */
+#define RootlessAlphaMask(bpp) ((bpp) == 32 ? 0xFF000000 : 0)
+#endif
+    
     if (solid)
     {
+#ifdef ROOTLESS_SAFEALPHA
+	gcval[1].val = fill.pixel | RootlessAlphaMask(pWin->drawable.bitsPerPixel);
+#else
 	gcval[1].val = fill.pixel;
+#endif
 	gcval[2].val  = FillSolid;
 	gcmask |= GCForeground | GCFillStyle;
     }
     else
     {
-	gcval[1].val = FillTiled;
-	gcval[2].ptr = (pointer)fill.pixmap;
-	gcval[3].val = tile_x_off;
-	gcval[4].val = tile_y_off;
+	int c=1;
+#ifdef ROOTLESS_SAFEALPHA
+	gcval[c++].val = ((CARD32)-1) & ~RootlessAlphaMask(pWin->drawable.bitsPerPixel);
+	gcmask |= GCPlaneMask;
+#endif
+	gcval[c++].val = FillTiled;
+	gcval[c++].ptr = (pointer)fill.pixmap;
+	gcval[c++].val = tile_x_off;
+	gcval[c++].val = tile_y_off;
 	gcmask |= GCFillStyle | GCTile | GCTileStipXOrigin | GCTileStipYOrigin;
     }
 
commit 7c158ffa766d32f5e8ec459693da5ef6ba0892e9
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Fri May 29 14:02:18 2009 -0700

    Rootless: Use miPaintWindow since PaintWindowBackground is dead
    (cherry picked from commit 4975c087257b52189a5c21d93d121f183e60e4c8)

diff --git a/miext/rootless/rootlessScreen.c b/miext/rootless/rootlessScreen.c
index 75dd439..88d3869 100644
--- a/miext/rootless/rootlessScreen.c
+++ b/miext/rootless/rootlessScreen.c
@@ -481,8 +481,7 @@ static void expose_1 (WindowPtr pWin) {
     if (!pWin->realized)
         return;
     
-    (*pWin->drawable.pScreen->PaintWindowBackground) (pWin, &pWin->borderClip,
-                                                      PW_BACKGROUND);
+    miPaintWindow(pWin, &pWin->borderClip, PW_BACKGROUND);
     
     /* FIXME: comments in windowstr.h indicate that borderClip doesn't
      include subwindow visibility. But I'm not so sure.. so we may
commit ec9e9c8bcabda3d8b4ea07037fb247f7408dde8b
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Thu May 28 15:30:20 2009 -0700

    XQuartz: English localization update for HIG compliance
    (cherry picked from commit 86b319d7cbef39d75b54c9d321e5dbf097b552be)

diff --git a/hw/xquartz/bundle/Resources/English.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/English.lproj/main.nib/designable.nib
index d271625..38b0018 100644
--- a/hw/xquartz/bundle/Resources/English.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/English.lproj/main.nib/designable.nib
@@ -2,9 +2,9 @@
 <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">9G55</string>
+		<string key="IBDocument.SystemVersion">9J61</string>
 		<string key="IBDocument.InterfaceBuilderVersion">677</string>
-		<string key="IBDocument.AppKitVersion">949.43</string>
+		<string key="IBDocument.AppKitVersion">949.46</string>
 		<string key="IBDocument.HIToolboxVersion">353.00</string>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -857,7 +857,7 @@ Lg</string>
 												<object class="NSButtonCell" key="NSCell" id="501304422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string key="NSContents">Update CLIPBOARD when Pasteboard changes.</string>
+													<string key="NSContents">Update CLIPBOARD when Pasteboard changes</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477050998"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -878,7 +878,7 @@ Lg</string>
 												<object class="NSButtonCell" key="NSCell" id="510771323">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string key="NSContents">Update PRIMARY (middle-click) when Pasteboard changes.</string>
+													<string key="NSContents">Update PRIMARY (middle-click) when Pasteboard changes</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="765780304"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -899,7 +899,7 @@ Lg</string>
 												<object class="NSButtonCell" key="NSCell" id="897099877">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string key="NSContents">Update Pasteboard immediately when new text is selected.</string>
+													<string key="NSContents">Update Pasteboard immediately when new text is selected</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="1002778833"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -920,7 +920,7 @@ Lg</string>
 												<object class="NSButtonCell" key="NSCell" id="619977658">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string key="NSContents">Update Pasteboard when CLIPBOARD changes.</string>
+													<string key="NSContents">Update Pasteboard when CLIPBOARD changes</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="487809555"/>
 													<int key="NSButtonFlags">1211912703</int>
diff --git a/hw/xquartz/bundle/Resources/English.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/English.lproj/main.nib/keyedobjects.nib
index ee6cdf2..5165089 100644
Binary files a/hw/xquartz/bundle/Resources/English.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/English.lproj/main.nib/keyedobjects.nib differ
commit 0f47203a9a690498c18b1c04e2ef5deed23a0e3e
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 29 14:18:37 2009 +1000

    dix: Set the implicit passive grab flag for keyboards too.
    
    Extension devices have ActivateKeyboardGrab as their grab activation
    function, hence we need to ensure the implicit passive grab flag is set
    accordingly in the grab for further event delivery.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/events.c b/dix/events.c
index da9107e..78663ea 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -1605,6 +1605,7 @@ ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time, Bool pass
     grabinfo->activeGrab = *grab;
     grabinfo->grab = &grabinfo->activeGrab;
     grabinfo->fromPassiveGrab = passive;
+    grabinfo->implicitGrab = passive & ImplicitGrabMask;
     CheckGrabForSyncs(keybd, (Bool)grab->keyboardMode, (Bool)grab->pointerMode);
 }
 
commit 75c73ddbfc9236bb80a3709d467674c4a1018fa3
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 29 14:01:21 2009 +1000

    dix: fix broken XI event delivery during grabs.
    
    If an implicit passive grab is active, the XI event mask is in
    grab->deviceMask. Otherwise, for explicit grabs, the XI event mask is in
    grab->eventMask.
    
    Reported-by: Thomas Jaeger
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/events.c b/dix/events.c
index 39cf295..da9107e 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3863,6 +3863,9 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
             if (grabinfo->fromPassiveGrab  &&
                     grabinfo->implicitGrab)
                 mask = grab->deviceMask;
+            else
+                mask = grab->eventMask;
+
             FixUpEventFromWindow(thisDev, xi, grab->window,
                     None, TRUE);
 
commit 29ec14625111a8ae600d245ccbf905f059074d7c
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 29 13:26:22 2009 +1000

    Xi: passively grabbing slave devices must be possible.
    
    There's use-cases where this is useful, so take the check out preventing
    that.
    
    Reported-by: Thomas Jaeger
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index a8807bd..fa76a77 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -110,14 +110,6 @@ ProcXIPassiveGrabDevice(ClientPtr client)
         return BadValue;
     }
 
-    /* Can't grab for modifiers on an attached slave device */
-    if (!IsMaster(dev))
-    {
-        if (!dev->u.master)
-            stuff->paired_device_mode = GrabModeAsync;
-        else if (dev->u.master && stuff->num_modifiers)
-            return BadDevice;
-    }
     if ((stuff->mask_len * 4) > XI_LASTEVENT)
     {
         unsigned char *bits = (unsigned char*)&stuff[1];
commit 235cf5713a8fe535c439628cce9ea5b42432acb1
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 29 12:09:06 2009 +1000

    dix: init inputMasks to NULL to avoid random value dereference.
    
    If the XI2 type is 0 (e.g. proximity events), inputMasks is never set and
    may not be NULL.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/events.c b/dix/events.c
index 0d0c419..39cf295 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2313,7 +2313,7 @@ EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win)
     int rc = 0;
     int filter = 0;
     int type;
-    OtherInputMasks *inputMasks;
+    OtherInputMasks *inputMasks = NULL;
     xEvent ev;
 
     /* XXX: this makes me gag */
commit 68d86adbe8d84099812c37a04098f2ab5ccc45a4
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 29 12:03:07 2009 +1000

    dix: GetProximityEvents doesn't need extra events for valuators.
    
    With internal events, we only have one event for all the data, no need to
    calculate for extra events.
    
    Reported-by: Thomas Jaeger
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/getevents.c b/dix/getevents.c
index 9c7ac44..83aedbe 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -1138,12 +1138,6 @@ GetProximityEvents(EventList *events, DeviceIntPtr pDev, int type,
     if ((pDev->valuator->mode & 1) == Relative)
         num_valuators = 0;
 
-    if (num_valuators) {
-        if ((((num_valuators - 1) / 6) + 1) > MAX_VALUATOR_EVENTS)
-            num_valuators = MAX_VALUATOR_EVENTS * 6;
-        num_events += ((num_valuators - 1) / 6) + 1;
-    }
-
     /* You fail. */
     if (first_valuator < 0 ||
         (num_valuators + first_valuator) > pDev->valuator->numAxes)
commit 71a83d68ab07536c0778d13cd7da974c40e77457
Author: Adam Jackson <ajax at redhat.com>
Date:   Thu May 28 15:32:03 2009 -0400

    xfree86: Remove loader symbol list ABI stubs
    
    These have been nops since 2006 and functionally void since 7.0.

diff --git a/hw/xfree86/common/xf86.h b/hw/xfree86/common/xf86.h
index cb05cb3..e49f28d 100644
--- a/hw/xfree86/common/xf86.h
+++ b/hw/xfree86/common/xf86.h
@@ -277,10 +277,6 @@ extern _X_EXPORT pointer xf86LoadSubModule(ScrnInfoPtr pScrn, const char *name);
 extern _X_EXPORT pointer xf86LoadOneModule(char *name, pointer optlist);
 extern _X_EXPORT void xf86UnloadSubModule(pointer mod);
 extern _X_EXPORT Bool xf86LoaderCheckSymbol(const char *name);
-extern _X_EXPORT void xf86LoaderReqSymLists(const char **, ...);
-extern _X_EXPORT void xf86LoaderReqSymbols(const char *, ...);
-extern _X_EXPORT void xf86LoaderRefSymLists(const char **, ...);
-extern _X_EXPORT void xf86LoaderRefSymbols(const char *, ...);
 extern _X_EXPORT void xf86SetBackingStore(ScreenPtr pScreen);
 extern _X_EXPORT void xf86SetSilkenMouse(ScreenPtr pScreen);
 extern _X_EXPORT pointer xf86FindXvOptions(int scrnIndex, int adapt_index, char *port_name,
diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
index 37802d6..eac819b 100644
--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -2290,28 +2290,6 @@ xf86LoaderCheckSymbol(const char *name)
     return LoaderSymbol(name) != NULL;
 }
 
-/* These two are just ABI stubs, they don't do anything in dlloader world */
-void
-xf86LoaderReqSymLists(const char **list0, ...)
-{
-}
-
-void
-xf86LoaderReqSymbols(const char *sym0, ...)
-{
-}
-
-void
-xf86LoaderRefSymLists(const char **list0, ...)
-{
-}
-
-void
-xf86LoaderRefSymbols(const char *sym0, ...)
-{
-}
-
-
 typedef enum {
    OPTION_BACKING_STORE
 } BSOpts;
diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
index cbba3ed..9ecffb7 100644
--- a/hw/xfree86/common/xf86Module.h
+++ b/hw/xfree86/common/xf86Module.h
@@ -194,10 +194,6 @@ extern _X_EXPORT char **LoaderListDirs(const char **, const char **);
 extern _X_EXPORT void LoaderFreeDirList(char **);
 extern _X_EXPORT void LoaderErrorMsg(const char *, const char *, int, int);
 extern _X_EXPORT void LoadExtension(ExtensionModule *, Bool);
-extern _X_EXPORT void LoaderRefSymLists(const char **, ...);
-extern _X_EXPORT void LoaderRefSymbols(const char *, ...);
-extern _X_EXPORT void LoaderReqSymLists(const char **, ...);
-extern _X_EXPORT void LoaderReqSymbols(const char *, ...);
 extern _X_EXPORT int LoaderCheckUnresolved(int);
 extern _X_EXPORT void LoaderGetOS(const char **name, int *major, int *minor, int *teeny);
 extern _X_EXPORT Bool LoaderShouldIgnoreABI(void);
diff --git a/hw/xfree86/loader/loader.c b/hw/xfree86/loader/loader.c
index 1803d0e..47c8c2e 100644
--- a/hw/xfree86/loader/loader.c
+++ b/hw/xfree86/loader/loader.c
@@ -159,27 +159,6 @@ LoaderInit(void)
 #endif
 }
 
-/* These four are just ABI stubs */
-void
-LoaderRefSymbols(const char *sym0, ...)
-{
-}
-
-void
-LoaderRefSymLists(const char **list0, ...)
-{
-}
-
-void
-LoaderReqSymLists(const char **list0, ...)
-{
-}
-
-void
-LoaderReqSymbols(const char *sym0, ...)
-{
-}
-
 /* Public Interface to the loader. */
 
 int
commit d7aef3f663f4b5d861799f8615dcd301d5ce2906
Merge: a25f248... e08c6a0...
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu May 28 17:20:58 2009 +1000

    Merge branch 'master' into xi2
    
    Conflicts:
    	Xext/geext.c
    	Xi/chdevcur.c
    	Xi/extgrbdev.c
    	Xi/xiproperty.c
    	configure.ac
    	dix/ptrveloc.c
    	hw/xfree86/common/xf86Config.c
    	mi/mipointer.h
    	test/input.c
    	xkb/xkb.c

diff --cc dix/events.c
index 503a58d,fd93376..0d0c419
--- a/dix/events.c
+++ b/dix/events.c
@@@ -5425,11 -5180,10 +5425,11 @@@ DeleteWindowFromAnyEvents(WindowPtr pWi
                                     to None
                                   */
  #ifdef NOTDEF
-                                 || clients[CLIENT_ID(parent->drawable.id)]->clientGone
+ 				 || wClient(parent)->clientGone
  #endif
                                  );
 -                        DoFocusEvents(keybd, pWin, parent, focusEventMode);
 +                        if (!ActivateFocusInGrab(keybd, pWin, parent))
 +                            DoFocusEvents(keybd, pWin, parent, focusEventMode);
                          focus->win = parent;
                          focus->revert = RevertToNone;
                          break;
diff --cc xkb/xkb.c
index 51feaa0,ec46238..e4e84ce
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@@ -3432,7 -3432,8 +3432,8 @@@ ProcXkbSetNamedIndicator(ClientPtr clie
          DeviceIntPtr other;
          for (other = inputInfo.devices; other; other = other->next)
          {
 -            if ((other != dev) && !other->isMaster && (other->u.master == dev) &&
 +            if ((other != dev) && !IsMaster(other) && (other->u.master == dev) &&
+                 (other->kbdfeed || other->leds) &&
                  (XaceHook(XACE_DEVICE_ACCESS, client, other, DixSetAttrAccess) == Success))
              {
                  rc = _XkbCreateIndicatorMap(other, stuff->indicator,
@@@ -3455,7 -3456,8 +3456,8 @@@
          DeviceIntPtr other;
          for (other = inputInfo.devices; other; other = other->next)
          {
 -            if ((other != dev) && !other->isMaster && (other->u.master == dev) &&
 +            if ((other != dev) && !IsMaster(other) && (other->u.master == dev) &&
+                 (other->kbdfeed || other->leds) &&
                  (XaceHook(XACE_DEVICE_ACCESS, client, other, DixSetAttrAccess) == Success))
              {
                  _XkbSetNamedIndicator(client, other, stuff);
commit a25f248fc3bd0375d91ca8a44320200d445ecfbb
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 27 15:47:12 2009 +1000

    Xi: Send Enter or Leave events with XIPassive(Un)grabNotify
    
    If a passive enter or focus in grab activates, send additional enter or
    focus events with mode XIPassiveGrabNotify to the grabbing client.
    Likewise, if the grab deactivates, send additional leave or focus out
    events.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 91a3461..781f4b8 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1872,7 +1872,7 @@ DeleteDeviceFromAnyExtEvents(WindowPtr pWin, DeviceIntPtr dev)
 
 	switch (dev->focus->revert) {
 	case RevertToNone:
-	    if (!ActivateFocusInGrab(dev, NoneWin))
+	    if (!ActivateFocusInGrab(dev, pWin, NoneWin))
 		DoFocusEvents(dev, pWin, NoneWin, focusEventMode);
 	    dev->focus->win = NoneWin;
 	    dev->focus->traceGood = 0;
@@ -1884,13 +1884,13 @@ DeleteDeviceFromAnyExtEvents(WindowPtr pWin, DeviceIntPtr dev)
 		dev->focus->traceGood--;
 	    }
 	    while (!parent->realized);
-	    if (!ActivateFocusInGrab(dev, parent))
+	    if (!ActivateFocusInGrab(dev, pWin, parent))
 		DoFocusEvents(dev, pWin, parent, focusEventMode);
 	    dev->focus->win = parent;
 	    dev->focus->revert = RevertToNone;
 	    break;
 	case RevertToPointerRoot:
-	    if (!ActivateFocusInGrab(dev, PointerRootWin))
+	    if (!ActivateFocusInGrab(dev, pWin, PointerRootWin))
 		DoFocusEvents(dev, pWin, PointerRootWin, focusEventMode);
 	    dev->focus->win = PointerRootWin;
 	    dev->focus->traceGood = 0;
@@ -1901,12 +1901,12 @@ DeleteDeviceFromAnyExtEvents(WindowPtr pWin, DeviceIntPtr dev)
                 if (!kbd || (kbd == dev && kbd != inputInfo.keyboard))
                     kbd = inputInfo.keyboard;
 	    if (kbd->focus->win) {
-		if (!ActivateFocusInGrab(dev, kbd->focus->win))
+		if (!ActivateFocusInGrab(dev, pWin, kbd->focus->win))
 		    DoFocusEvents(dev, pWin, kbd->focus->win, focusEventMode);
 		dev->focus->win = FollowKeyboardWin;
 		dev->focus->traceGood = 0;
 	    } else {
-                if (!ActivateFocusInGrab(dev, NoneWin))
+                if (!ActivateFocusInGrab(dev, pWin, NoneWin))
                     DoFocusEvents(dev, pWin, NoneWin, focusEventMode);
 		dev->focus->win = NoneWin;
 		dev->focus->traceGood = 0;
diff --git a/dix/enterleave.c b/dix/enterleave.c
index eadcc45..d7f5f58 100644
--- a/dix/enterleave.c
+++ b/dix/enterleave.c
@@ -609,7 +609,8 @@ DoEnterLeaveEvents(DeviceIntPtr pDev,
     if (fromWin == toWin)
 	return;
 
-    CoreEnterLeaveEvents(pDev, fromWin, toWin, mode);
+    if (mode != XINotifyPassiveGrab && mode != XINotifyPassiveUngrab)
+        CoreEnterLeaveEvents(pDev, fromWin, toWin, mode);
     DeviceEnterLeaveEvents(pDev, fromWin, toWin, mode);
 }
 
diff --git a/dix/events.c b/dix/events.c
index 5d22016..503a58d 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2635,8 +2635,9 @@ XYToWindow(DeviceIntPtr pDev, int x, int y)
  * @returns TRUE if the device has been grabbed, or FALSE otherwise.
  */
 BOOL
-ActivateFocusInGrab(DeviceIntPtr dev, WindowPtr win)
+ActivateFocusInGrab(DeviceIntPtr dev, WindowPtr old, WindowPtr win)
 {
+    BOOL rc = FALSE;
     DeviceEvent event;
 
     if (dev->deviceGrab.grab &&
@@ -2646,6 +2647,7 @@ ActivateFocusInGrab(DeviceIntPtr dev, WindowPtr win)
         if (dev->deviceGrab.grab->window == win ||
             IsParent(dev->deviceGrab.grab->window, win))
             return FALSE;
+        DoEnterLeaveEvents(dev, old, win, XINotifyPassiveUngrab);
         (*dev->deviceGrab.DeactivateGrab)(dev);
     }
 
@@ -2660,18 +2662,22 @@ ActivateFocusInGrab(DeviceIntPtr dev, WindowPtr win)
     event.deviceid = dev->id;
     event.sourceid = dev->id;
     event.detail.button = 0;
-    return CheckPassiveGrabsOnWindow(win, dev, &event, FALSE);
+    rc = CheckPassiveGrabsOnWindow(win, dev, &event, FALSE);
+    if (rc)
+        DoEnterLeaveEvents(dev, old, win, XINotifyPassiveUngrab);
+    return rc;
 }
 
 /**
- * Ungrab a currently Enter grabbed device and grab the deice for the given
+ * Ungrab a currently Enter grabbed device and grab the device for the given
  * window.
  *
  * @returns TRUE if the device has been grabbed, or FALSE otherwise.
  */
 static BOOL
-ActivateEnterGrab(DeviceIntPtr dev, WindowPtr win)
+ActivateEnterGrab(DeviceIntPtr dev, WindowPtr old, WindowPtr win)
 {
+    BOOL rc = FALSE;
     DeviceEvent event;
 
     if (dev->deviceGrab.grab &&
@@ -2681,6 +2687,7 @@ ActivateEnterGrab(DeviceIntPtr dev, WindowPtr win)
         if (dev->deviceGrab.grab->window == win ||
             IsParent(dev->deviceGrab.grab->window, win))
             return FALSE;
+        DoEnterLeaveEvents(dev, old, win, XINotifyPassiveUngrab);
         (*dev->deviceGrab.DeactivateGrab)(dev);
     }
 
@@ -2692,7 +2699,11 @@ ActivateEnterGrab(DeviceIntPtr dev, WindowPtr win)
     event.deviceid = dev->id;
     event.sourceid = dev->id;
     event.detail.button = 0;
-    return CheckPassiveGrabsOnWindow(win, dev, &event, FALSE);
+    rc = CheckPassiveGrabsOnWindow(win, dev, &event, FALSE);
+    if (rc)
+        DoEnterLeaveEvents(dev, old, win, XINotifyPassiveGrab);
+
+    return rc;
 }
 
 /**
@@ -2795,7 +2806,7 @@ CheckMotion(DeviceEvent *ev, DeviceIntPtr pDev)
             UpdateCurrentTimeIf();
 
 	if (prevSpriteWin != NullWindow) {
-            if (!ActivateEnterGrab(pDev, newSpriteWin))
+            if (!ActivateEnterGrab(pDev, prevSpriteWin, newSpriteWin))
                 DoEnterLeaveEvents(pDev, prevSpriteWin,
                                    newSpriteWin, NotifyNormal);
         }
@@ -4267,6 +4278,10 @@ DeviceEnterLeaveEvent(
     int                 btlen, len, i;
     DeviceIntPtr        kbd;
 
+    if ((mode == XINotifyPassiveGrab && type == XI_Leave) ||
+        (mode == XINotifyPassiveUngrab && type == XI_Enter))
+        return;
+
     btlen = (mouse->button) ? (mouse->button->numButtons + 7)/8 : 0;
     btlen = (btlen + 3)/4;
     len = sizeof(xXIEnterEvent) + btlen * 4;
@@ -4426,11 +4441,11 @@ SetInputFocus(
     mode = (dev->deviceGrab.grab) ? NotifyWhileGrabbed : NotifyNormal;
     if (focus->win == FollowKeyboardWin)
     {
-        if (!ActivateFocusInGrab(dev, focusWin))
+        if (!ActivateFocusInGrab(dev, keybd->focus->win, focusWin))
             DoFocusEvents(dev, keybd->focus->win, focusWin, mode);
     } else
     {
-        if (!ActivateFocusInGrab(dev, focusWin))
+        if (!ActivateFocusInGrab(dev, focus->win, focusWin))
             DoFocusEvents(dev, focus->win, focusWin, mode);
     }
     focus->time = time;
@@ -5413,13 +5428,13 @@ DeleteWindowFromAnyEvents(WindowPtr pWin, Bool freeResources)
                                 || clients[CLIENT_ID(parent->drawable.id)]->clientGone
 #endif
                                 );
-                        if (!ActivateFocusInGrab(keybd, parent))
+                        if (!ActivateFocusInGrab(keybd, pWin, parent))
                             DoFocusEvents(keybd, pWin, parent, focusEventMode);
                         focus->win = parent;
                         focus->revert = RevertToNone;
                         break;
                     case RevertToPointerRoot:
-                        if (!ActivateFocusInGrab(keybd, PointerRootWin))
+                        if (!ActivateFocusInGrab(keybd, pWin, PointerRootWin))
                             DoFocusEvents(keybd, pWin, PointerRootWin, focusEventMode);
                         focus->win = PointerRootWin;
                         focus->traceGood = 0;
diff --git a/include/dix.h b/include/dix.h
index bfb0369..df73519 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -352,6 +352,7 @@ extern void DeactivateKeyboardGrab(
 
 extern BOOL ActivateFocusInGrab(
     DeviceIntPtr /* dev */,
+    WindowPtr /* old */,
     WindowPtr /* win */);
 
 extern void AllowSome(
commit 2107becb0ce2ffda001be65728c53563496d8d50
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed May 27 17:13:19 2009 -0400

    xfree86: Remove unused (and useless) xf86{Add,Delete}ModuleInfo

diff --git a/hw/xfree86/common/xf86.h b/hw/xfree86/common/xf86.h
index 0c0320f..cb05cb3 100644
--- a/hw/xfree86/common/xf86.h
+++ b/hw/xfree86/common/xf86.h
@@ -315,9 +315,6 @@ extern _X_EXPORT int  xf86RegisterRootWindowProperty(int ScrnIndex, Atom	propert
 				    pointer value);
 extern _X_EXPORT Bool xf86IsUnblank(int mode);
 
-extern _X_EXPORT _X_DEPRECATED void xf86AddModuleInfo(pointer info, pointer module);
-extern _X_EXPORT _X_DEPRECATED void xf86DeleteModuleInfo(int idx);
-
 /* xf86Init.c */
 
 extern _X_EXPORT PixmapFormatPtr xf86GetPixFormat(ScrnInfoPtr pScrn, int depth);
diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
index 441efb0..37802d6 100644
--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -169,17 +169,6 @@ xf86LookupInput(const char *name)
     return NULL;
 }
 
-/* ABI stubs of despair */
-void
-xf86AddModuleInfo(pointer info, pointer module)
-{
-}
-
-void
-xf86DeleteModuleInfo(int idx)
-{
-}
-
 /* Allocate a new ScrnInfoRec in xf86Screens */
 
 ScrnInfoPtr
diff --git a/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h
index 904c369..3b1346f 100644
--- a/hw/xfree86/common/xf86str.h
+++ b/hw/xfree86/common/xf86str.h
@@ -342,21 +342,6 @@ typedef struct _DriverRec {
  */
 #define HaveDriverFuncs 1
 
-
-/*
- * The optional module list struct. This allows modules exporting helping
- * functions to configuration tools, the Xserver, or any other
- * application/module interested in such information.
- */
-_X_DEPRECATED typedef struct _ModuleInfoRec {
-    int			moduleVersion;
-    char *		moduleName;
-    pointer		module;
-    int			refCount;
-    const OptionInfoRec * (*AvailableOptions)(void *unused);
-    pointer		unused[8];	/* leave some space for more fields */
-} ModuleInfoRec, *ModuleInfoPtr;
-
 /*
  * These are the private bus types.  New types can be added here.  Types
  * required for the public interface should be added to xf86str.h, with
commit e08c6a0752772745f35f7afcf6c2b1c927b91cc0
Author: Federico Mena Quintero <federico at novell.com>
Date:   Mon May 4 19:24:47 2009 -0500

    randr: bug #21554 - re-probe outputs when coming back from laptop unsuspend
    
    Make xf86 RANDR wrap the EnterVT call chain, so it can re-probe the
    outputs when a laptop comes back from suspend/unsuspend (actually, any
    time that we enter our VT again).  The X server should then send RR*
    events to clients, so they can cope with a monitor that was unplugged
    while the laptop was suspended.
    
    Signed-off-by: Federico Mena Quintero <federico at novell.com>

diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index 1e3b70c..0de21e2 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -55,6 +55,13 @@ typedef struct _xf86RandR12Info {
     int				    pointerY;
     Rotation			    rotation; /* current mode */
     Rotation                        supported_rotations; /* driver supported */
+
+    /* Used to wrap EnterVT so we can re-probe the outputs when a laptop unsuspends
+     * (actually, any time that we switch back into our VT).
+     *
+     * See https://bugs.freedesktop.org/show_bug.cgi?id=21554
+     */
+    xf86EnterVTProc *orig_EnterVT;
 } XF86RandRInfoRec, *XF86RandRInfoPtr;
 
 #ifdef RANDR_12_INTERFACE
@@ -1746,10 +1753,25 @@ xf86RandR12ChangeGamma(int scrnIndex, Gamma gamma)
 }
 
 static Bool
+xf86RandR12EnterVT (int screen_index, int flags)
+{
+    ScreenPtr        pScreen = screenInfo.screens[screen_index];
+    XF86RandRInfoPtr randrp  = XF86RANDRINFO(pScreen);
+
+    if (randrp->orig_EnterVT) {
+	if (!randrp->orig_EnterVT (screen_index, flags))
+	    return FALSE;
+    }
+
+    return RRGetInfo (pScreen, TRUE); /* force a re-probe of outputs and notify clients about changes */
+}
+
+static Bool
 xf86RandR12Init12 (ScreenPtr pScreen)
 {
     ScrnInfoPtr		pScrn = xf86Screens[pScreen->myNum];
     rrScrPrivPtr	rp = rrGetScrPriv(pScreen);
+    XF86RandRInfoPtr	randrp  = XF86RANDRINFO(pScreen);
 
     rp->rrGetInfo = xf86RandR12GetInfo12;
     rp->rrScreenSetSize = xf86RandR12ScreenSetSize;
@@ -1767,6 +1789,10 @@ xf86RandR12Init12 (ScreenPtr pScreen)
     rp->rrSetConfig = NULL;
     pScrn->PointerMoved = xf86RandR12PointerMoved;
     pScrn->ChangeGamma = xf86RandR12ChangeGamma;
+
+    randrp->orig_EnterVT = pScrn->EnterVT;
+    pScrn->EnterVT = xf86RandR12EnterVT;
+
     if (!xf86RandR12CreateObjects12 (pScreen))
 	return FALSE;
 
commit b12010e10f38951358b48ff1076c026f943b7cc3
Merge: 6e69272... f1441b8...
Author: Søren Sandmann Pedersen <sandmann at redhat.com>
Date:   Wed May 27 15:56:30 2009 -0400

    Merge branch 'master' of git+ssh://sandmann@git.freedesktop.org/git/xorg/xserver

commit 6e6927247359cc0db47501fb9d2dbb7856aa5985
Author: Søren Sandmann Pedersen <sandmann at redhat.com>
Date:   Wed May 27 15:51:19 2009 -0400

    Fix alpha map computation in miComputeCompositeRegion()
    
    According to the RENDER spec, the origin of the alpha map is
    interpreted relative to the origin of the drawable of the image, not
    the origin of the drawable of the alpha map.
    
    This commit fixes that and adds an alpha-test.c test program.
    
    The only use of alpha maps I have been able to find is in Qt and they
    don't use a non-zero alpha origin.

diff --git a/render/mipict.c b/render/mipict.c
index c653ec4..e0d40ae 100644
--- a/render/mipict.c
+++ b/render/mipict.c
@@ -459,8 +459,8 @@ miComputeCompositeRegion (RegionPtr	pRegion,
     if (pSrc->alphaMap)
     {
 	if (!miClipPictureSrc (pRegion, pSrc->alphaMap,
-			       xDst - (xSrc + pSrc->alphaOrigin.x),
-			       yDst - (ySrc + pSrc->alphaOrigin.y)))
+			       xDst - (xSrc - pSrc->alphaOrigin.x),
+			       yDst - (ySrc - pSrc->alphaOrigin.y)))
 	{
 	    pixman_region_fini (pRegion);
 	    return FALSE;
@@ -477,8 +477,8 @@ miComputeCompositeRegion (RegionPtr	pRegion,
 	if (pMask->alphaMap)
 	{
 	    if (!miClipPictureSrc (pRegion, pMask->alphaMap,
-				   xDst - (xMask + pMask->alphaOrigin.x),
-				   yDst - (yMask + pMask->alphaOrigin.y)))
+				   xDst - (xMask - pMask->alphaOrigin.x),
+				   yDst - (yMask - pMask->alphaOrigin.y)))
 	    {
 		pixman_region_fini (pRegion);
 		return FALSE;
commit f1441b83538e6ba8a1557c4f5ea50c53a1837087
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Wed May 27 10:06:10 2009 -0700

    XQuartz: More localization updates
    (cherry picked from commit b107390c9f30571902556b4d053e62d345a06254)

diff --git a/hw/xquartz/bundle/Resources/Dutch.lproj/locversion.plist b/hw/xquartz/bundle/Resources/Dutch.lproj/locversion.plist
index 51e3827..1513150 100644
--- a/hw/xquartz/bundle/Resources/Dutch.lproj/locversion.plist
+++ b/hw/xquartz/bundle/Resources/Dutch.lproj/locversion.plist
@@ -9,6 +9,6 @@
 	<key>LprojRevisionLevel</key>
 	<string>1</string>
 	<key>LprojVersion</key>
-	<string>73</string>
+	<string>83</string>
 </dict>
 </plist>
diff --git a/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/designable.nib
index 05eca0d..ab78847 100644
--- a/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/designable.nib
@@ -1,18 +1,17 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.050000190734863">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">10A222</string>
-		<string key="IBDocument.InterfaceBuilderVersion">708</string>
-		<string key="IBDocument.AppKitVersion">994.5</string>
-		<string key="IBDocument.HIToolboxVersion">404.00</string>
+		<string key="IBDocument.SystemVersion">10A314</string>
+		<string key="IBDocument.InterfaceBuilderVersion">718</string>
+		<string key="IBDocument.AppKitVersion">1013</string>
+		<string key="IBDocument.HIToolboxVersion">415.00</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
-			<string key="NS.object.0">708</string>
+			<string key="NS.object.0">718</string>
 		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
-			<integer value="348"/>
 		</object>
 		<object class="NSArray" key="IBDocument.PluginDependencies">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -20,7 +19,7 @@
 		</object>
 		<object class="NSMutableDictionary" key="IBDocument.Metadata">
 			<bool key="EncodedWithXMLCoder">YES</bool>
-			<object class="NSArray" key="dict.sortedKeys">
+			<object class="NSArray" key="dict.sortedKeys" id="0">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 			</object>
 			<object class="NSMutableArray" key="dict.values">
@@ -194,7 +193,7 @@
 					</object>
 					<object class="NSMenuItem" id="868031522">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle">UHJvZ3JhbW1hJ3M</string>
+						<string key="NSTitle">Programma's</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -202,7 +201,7 @@
 						<reference key="NSMixedImage" ref="351811234"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="981161348">
-							<string type="base64-UTF8" key="NSTitle">UHJvZ3JhbW1hJ3M</string>
+							<string key="NSTitle">Programma's</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="390088328">
@@ -398,10 +397,10 @@
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="941366957">
-					<reference key="NSNextResponder"/>
+					<nil key="NSNextResponder"/>
 					<int key="NSvFlags">256</int>
 					<object class="NSMutableArray" key="NSSubviews">
 						<bool key="EncodedWithXMLCoder">YES</bool>
@@ -461,9 +460,7 @@
 												<object class="NSTextFieldCell" key="NSCell" id="391919450">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWxzIHUgZGV6ZSBvcHRpZSBpbnNjaGFrZWx0LCBrYW4gaGV0IGdlYnJ1aWsgdmFuIHRvZXRzY29tYmlu
-YXRpZXMgdm9vciBtZW51Y29tbWFkbydzIGNvbmZsaWN0ZXJlbiBtZXQgWDExLXByb2dyYW1tYSdzIGRp
-ZSBkZSBNZXRhLW1vZGlmaWVyIGdlYnJ1aWtlbi4</string>
+													<string key="NSContents">Als u deze optie inschakelt, kan het gebruik van toetscombinaties voor menucommado's conflicteren met X11-programma's die de Meta-modifier gebruiken.</string>
 													<object class="NSFont" key="NSSupport" id="26">
 														<string key="NSName">LucidaGrande</string>
 														<double key="NSSize">11</double>
@@ -475,9 +472,9 @@ ZSBkZSBNZXRhLW1vZGlmaWVyIGdlYnJ1aWtlbi4</string>
 														<int key="NSColorSpace">6</int>
 														<string key="NSCatalogName">System</string>
 														<string key="NSColorName">controlColor</string>
-														<object class="NSColor" key="NSColor" id="891756173">
+														<object class="NSColor" key="NSColor" id="925765112">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -619,9 +616,7 @@ ZW4uCg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="624655599">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">Vm9vciBYMTEtZ2VsdWlkc3NpZ25hbGVuIHdvcmR0IGhldCB3YWFyc2NodXdpbmdzc2lnbmFhbCB2YW4g
-aGV0IHN5c3RlZW0gZ2VicnVpa3QsIHpvYWxzIGluZ2VzdGVsZCBpbiBoZXQgdGFiYmxhZCAnR2VsdWlk
-c2VmZmVjdGVuJyB2YW4gaGV0IHN5c3RlZW12b29ya2V1cmVucGFuZWVsICdHZWx1aWQnLg</string>
+													<string key="NSContents">Voor X11-geluidssignalen wordt het waarschuwingssignaal van het systeem gebruikt, zoals ingesteld in het tabblad 'Geluidseffecten' van het systeemvoorkeurenpaneel 'Geluid'.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="1039016593"/>
@@ -861,9 +856,7 @@ c2VmZmVjdGVuJyB2YW4gaGV0IHN5c3RlZW12b29ya2V1cmVucGFuZWVsICdHZWx1aWQnLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="572508492">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">SGllcm1lZSBzY2hha2VsdCB1IGhldCBtZW51b25kZXJkZWVsICJrb3BpZWVyIiBpbiBlbiBtYWFrdCB1
-IHN5bmNocm9uaXNhdGllIG1vZ2VsaWprIHR1c3NlbiBoZXQga2xlbWJvcmQgdmFuIE9TIFggZW4gZGUg
-Q0xJUEJPQVJELSBlbiBQUklNQVJZLWJ1ZmZlciB2YW4gWDExLg</string>
+													<string key="NSContents">Hiermee schakelt u het menuonderdeel "kopieer" in en maakt u synchronisatie mogelijk tussen het klembord van OS X en de CLIPBOARD- en PRIMARY-buffer van X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="386152084"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -983,8 +976,7 @@ Q0xJUEJPQVJELSBlbiBQUklNQVJZLWJ1ZmZlciB2YW4gWDExLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="994587858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">VmFud2VnZSBiZXBlcmtpbmdlbiBpbiBoZXQgWDExLXByb3RvY29sIHdlcmt0IGRlemUgb3B0aWUgbW9n
-ZWxpamsgbmlldCBhbHRpamQgaW4gYWxsZSBwcm9ncmFtbWEncy4</string>
+													<string key="NSContents">Vanwege beperkingen in het X11-protocol werkt deze optie mogelijk niet altijd in alle programma's.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="522511724"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1114,7 +1106,7 @@ ZWxpamsgbmlldCBhbHRpamQgaW4gYWxsZSBwcm9ncmFtbWEncy4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="989804990">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string key="NSContents">Indien ingeschakeld, wordt bij aanmaak van een nieuw X11-venster X11.app op de voorgrond geplaatst (in plaats van Finder.app, Terminal.app, enz.)</string>
+													<string key="NSContents">Indien ingeschakeld, wordt bij aanmaak van een nieuw X11-venster X11.app op de voorgrond geplaatst (in plaats van Finder.app, Terminal.app, enz.).</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="57161931"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1187,10 +1179,7 @@ ZWxpamsgbmlldCBhbHRpamQgaW4gYWxsZSBwcm9ncmFtbWEncy4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="53243865">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">V2FubmVlciB1IFgxMSBzdGFydCwgd29yZGVuIGVyIFhhdXRob3JpdHktdG9lZ2FuZ3Njb250cm9sZXNs
-ZXV0ZWxzIGFhbmdlbWFha3QuIEFscyBoZXQgSVAtYWRyZXMgdmFuIGhldCBzeXN0ZWVtIHdvcmR0IGdl
-d2lqemlnZCwgd29yZGVuIGRlemUgdG9ldHNlbiBvbmdlbGRpZyB3YWFyZG9vciBoZXQgbW9nZWxpamsg
-aXMgZGF0IFgxMS1wcm9ncmFtbWEncyBuaWV0IGt1bm5lbiB3b3JkZW4gZ2VzdGFydC4</string>
+													<string key="NSContents">Wanneer u X11 start, worden er Xauthority-toegangscontrolesleutels aangemaakt. Als het IP-adres van het systeem wordt gewijzigd, worden deze toetsen ongeldig waardoor het mogelijk is dat X11-programma's niet kunnen worden gestart.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="168436707"/>
@@ -1207,10 +1196,7 @@ aXMgZGF0IFgxMS1wcm9ncmFtbWEncyBuaWV0IGt1bm5lbiB3b3JkZW4gZ2VzdGFydC4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="390084685">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWxzIHUgZGV6ZSBvcHRpZSBpbnNjaGFrZWx0LCBtb2V0ICdWb2VyIGlkZW50aXRlaXRzY29udHJvbGUg
-dWl0IHZvb3IgdmVyYmluZGluZ2VuJyBvb2sgd29yZGVuIGluZ2VzY2hha2VsZCB0ZXIgYmV2ZWlsaWdp
-bmcgdmFuIGhldCBzeXN0ZWVtLiBBbHMgZGV6ZSBvcHRpZSBpcyB1aXRnZXNjaGFrZWxkLCB3b3JkZW4g
-dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
+													<string key="NSContents">Als u deze optie inschakelt, moet 'Voer identiteitscontrole uit voor verbindingen' ook worden ingeschakeld ter beveiliging van het systeem. Als deze optie is uitgeschakeld, worden verbindingen van externe programma's niet toegestaan.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="363817195"/>
@@ -1255,11 +1241,10 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 						</object>
 					</object>
 					<string key="NSFrameSize">{564, 308}</string>
-					<reference key="NSSuperview"/>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1280, 938}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSFrameAutosaveName">x11_prefs</string>
 			</object>
 			<object class="NSWindowTemplate" id="604417141">
@@ -1272,7 +1257,7 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="85544634">
 					<nil key="NSNextResponder"/>
@@ -1361,8 +1346,8 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 													<double key="NSMinWidth">62.730998992919922</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Naam</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor" id="113872566">
@@ -1399,8 +1384,8 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 													<double key="NSMinWidth">40</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Commando</string>
 														<reference key="NSSupport" ref="26"/>
 														<reference key="NSBackgroundColor" ref="113872566"/>
@@ -1426,8 +1411,8 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 													<double key="NSMinWidth">10</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">67239424</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Toetsen</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor">
@@ -1454,7 +1439,7 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 															<int key="NSColorSpace">6</int>
 															<string key="NSCatalogName">System</string>
 															<string key="NSColorName">controlBackgroundColor</string>
-															<reference key="NSColor" ref="891756173"/>
+															<reference key="NSColor" ref="925765112"/>
 														</object>
 														<reference key="NSTextColor" ref="930815747"/>
 													</object>
@@ -1484,6 +1469,7 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 											<int key="NSDraggingSourceMaskForLocal">-1</int>
 											<int key="NSDraggingSourceMaskForNonLocal">0</int>
 											<bool key="NSAllowsTypeSelect">YES</bool>
+											<int key="NSTableViewDraggingDestinationStyle">0</int>
 										</object>
 									</object>
 									<string key="NSFrame">{{1, 17}, {301, 198}}</string>
@@ -1567,7 +1553,7 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1280, 938}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSFrameAutosaveName">x11_apps</string>
 			</object>
 			<object class="NSMenu" id="294137138">
@@ -1587,7 +1573,7 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 					</object>
 					<object class="NSMenuItem" id="511651072">
 						<reference key="NSMenu" ref="294137138"/>
-						<string type="base64-UTF8" key="NSTitle">UHJvZ3JhbW1hJ3M</string>
+						<string key="NSTitle">Programma's</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -1595,7 +1581,7 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 						<reference key="NSMixedImage" ref="351811234"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="48278059">
-							<string type="base64-UTF8" key="NSTitle">UHJvZ3JhbW1hJ3M</string>
+							<string key="NSTitle">Programma's</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="563798000">
@@ -1611,7 +1597,7 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 								</object>
 								<object class="NSMenuItem" id="1032342329">
 									<reference key="NSMenu" ref="48278059"/>
-									<string type="base64-UTF8" key="NSTitle">UGFzIGFhbuKApg</string>
+									<string key="NSTitle">Pas aan…</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -2186,28 +2172,26 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="IBObjectRecord">
 						<int key="objectID">0</int>
-						<object class="NSArray" key="object" id="330408435">
-							<bool key="EncodedWithXMLCoder">YES</bool>
-						</object>
+						<reference key="object" ref="0"/>
 						<reference key="children" ref="904585544"/>
 						<nil key="parent"/>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-2</int>
 						<reference key="object" ref="815810918"/>
-						<reference key="parent" ref="330408435"/>
-						<string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">File's Owner</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-1</int>
 						<reference key="object" ref="941939442"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">First Responder</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-3</int>
 						<reference key="object" ref="951368722"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">Application</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2221,7 +2205,7 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 							<reference ref="868031522"/>
 							<reference ref="551174276"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">MainMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2466,7 +2450,7 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 					<object class="IBObjectRecord">
 						<int key="objectID">196</int>
 						<reference key="object" ref="485884620"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">X11Controller</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2476,7 +2460,7 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="941366957"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">PrefsPanel</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2740,7 +2724,7 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="85544634"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">EditPrograms</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2763,7 +2747,7 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 							<reference ref="318286212"/>
 							<reference ref="511651072"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">DockMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -3317,6 +3301,7 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 				<bool key="EncodedWithXMLCoder">YES</bool>
 				<object class="NSArray" key="dict.sortedKeys">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<string>-3.IBPluginDependency</string>
 					<string>-3.ImportedFromIB2</string>
 					<string>100292.IBPluginDependency</string>
 					<string>100293.IBPluginDependency</string>
@@ -3606,6 +3591,7 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 				</object>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3673,9 +3659,9 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>{{271, 666}, {301, 153}}</string>
-					<string>{{437, 672}, {564, 308}}</string>
+					<string>{{325, 672}, {564, 308}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<string>{{437, 672}, {564, 308}}</string>
+					<string>{{325, 672}, {564, 308}}</string>
 					<integer value="1"/>
 					<string>{{184, 290}, {481, 345}}</string>
 					<integer value="0"/>
@@ -3896,9 +3882,7 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -3906,9 +3890,7 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 			<nil key="activeLocalization"/>
 			<object class="NSMutableDictionary" key="localizations">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -3946,6 +3928,15 @@ dmVyYmluZGluZ2VuIHZhbiBleHRlcm5lIHByb2dyYW1tYSdzIG5pZXQgdG9lZ2VzdGFhbi4</string>
 			</object>
 		</object>
 		<int key="IBDocument.localizationMode">0</int>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+			<integer value="1050" key="NS.object.0"/>
+		</object>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+			<integer value="3000" key="NS.object.0"/>
+		</object>
+		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
 		<string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
 		<int key="IBDocument.defaultPropertyAccessControl">3</int>
 	</data>
diff --git a/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/keyedobjects.nib
index 4aa9bb3..ea9418e 100644
Binary files a/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/French.lproj/locversion.plist b/hw/xquartz/bundle/Resources/French.lproj/locversion.plist
index 0299584..6adec68 100644
--- a/hw/xquartz/bundle/Resources/French.lproj/locversion.plist
+++ b/hw/xquartz/bundle/Resources/French.lproj/locversion.plist
@@ -9,6 +9,6 @@
 	<key>LprojRevisionLevel</key>
 	<string>1</string>
 	<key>LprojVersion</key>
-	<string>73</string>
+	<string>83</string>
 </dict>
 </plist>
diff --git a/hw/xquartz/bundle/Resources/German.lproj/locversion.plist b/hw/xquartz/bundle/Resources/German.lproj/locversion.plist
index 4e00346..5272fed 100644
--- a/hw/xquartz/bundle/Resources/German.lproj/locversion.plist
+++ b/hw/xquartz/bundle/Resources/German.lproj/locversion.plist
@@ -9,6 +9,6 @@
 	<key>LprojRevisionLevel</key>
 	<string>1</string>
 	<key>LprojVersion</key>
-	<string>73</string>
+	<string>83</string>
 </dict>
 </plist>
diff --git a/hw/xquartz/bundle/Resources/German.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/German.lproj/main.nib/designable.nib
index d71a98a..12517fe 100644
--- a/hw/xquartz/bundle/Resources/German.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/German.lproj/main.nib/designable.nib
@@ -1,11 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.05">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">9C31</string>
-		<string key="IBDocument.InterfaceBuilderVersion">677</string>
-		<string key="IBDocument.AppKitVersion">949.26</string>
-		<string key="IBDocument.HIToolboxVersion">352.00</string>
+		<string key="IBDocument.SystemVersion">10A222</string>
+		<string key="IBDocument.InterfaceBuilderVersion">708</string>
+		<string key="IBDocument.AppKitVersion">994.5</string>
+		<string key="IBDocument.HIToolboxVersion">404.00</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+			<string key="NS.object.0">708</string>
+		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
 		</object>
@@ -393,7 +397,7 @@
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="941366957">
 					<nil key="NSNextResponder"/>
@@ -428,7 +432,7 @@
 													<string key="NSContents">Drei Maustasten nachbilden</string>
 													<object class="NSFont" key="NSSupport" id="463863101">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">1044</int>
 													</object>
 													<reference key="NSControlView" ref="119157981"/>
@@ -461,7 +465,7 @@ bsO8bGVpc3RlIGRpZSBYMTEtUHJvZ3JhbW1lIHN0w7ZyZW4sIGRpZSBNZXRhLVNvbmRlcnRhc3RlbiB2
 ZXJ3ZW5kZW4uA</string>
 													<object class="NSFont" key="NSSupport" id="26">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.100000e+01</double>
+														<double key="NSSize">11</double>
 														<int key="NSfFlags">3100</int>
 													</object>
 													<string key="NSPlaceholderString"/>
@@ -470,9 +474,9 @@ ZXJ3ZW5kZW4uA</string>
 														<int key="NSColorSpace">6</int>
 														<string key="NSCatalogName">System</string>
 														<string key="NSColorName">controlColor</string>
-														<object class="NSColor" key="NSColor" id="764920908">
+														<object class="NSColor" key="NSColor" id="705970636">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2NwA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -639,7 +643,7 @@ LCB3aWUgaW4gZGVyIFN5c3RlbWVpbnN0ZWxsdW5nIOKAnlRvbmVmZmVrdGXigJwgZmVzdGdlbGVndC4<
 													<int key="NSButtonFlags2">1</int>
 													<object class="NSFont" key="NSAlternateImage">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">16</int>
 													</object>
 													<string key="NSAlternateContents"/>
@@ -706,6 +710,7 @@ LCB3aWUgaW4gZGVyIFN5c3RlbWVpbnN0ZWxsdW5nIOKAnlRvbmVmZmVrdGXigJwgZmVzdGdlbGVndC4<
 																<reference key="NSTarget" ref="633115429"/>
 															</object>
 														</object>
+														<reference key="NSMenuFont" ref="463863101"/>
 													</object>
 													<int key="NSPreferredEdge">3</int>
 													<bool key="NSUsesItemFromMenu">YES</bool>
@@ -1262,7 +1267,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSFrameAutosaveName">x11_prefs</string>
 			</object>
 			<object class="NSWindowTemplate" id="604417141">
@@ -1275,7 +1280,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="85544634">
 					<nil key="NSNextResponder"/>
@@ -1360,9 +1365,9 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 											<object class="NSMutableArray" key="NSTableColumns">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<object class="NSTableColumn" id="938444323">
-													<double key="NSWidth">1.227310e+02</double>
-													<double key="NSMinWidth">6.273100e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">122.73099999999999</double>
+													<double key="NSMinWidth">62.731000000000002</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
 														<int key="NSCellFlags">75628032</int>
 														<int key="NSCellFlags2">0</int>
@@ -1398,9 +1403,9 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 												<object class="NSTableColumn" id="84282687">
-													<double key="NSWidth">1.000000e+02</double>
-													<double key="NSMinWidth">4.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">100</double>
+													<double key="NSMinWidth">40</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
 														<int key="NSCellFlags">75628032</int>
 														<int key="NSCellFlags2">0</int>
@@ -1425,9 +1430,9 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 												<object class="NSTableColumn" id="242608782">
-													<double key="NSWidth">6.900000e+01</double>
-													<double key="NSMinWidth">1.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">69</double>
+													<double key="NSMinWidth">10</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
 														<int key="NSCellFlags">67239424</int>
 														<int key="NSCellFlags2">0</int>
@@ -1447,7 +1452,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 														<string key="NSContents">Textzelle</string>
 														<object class="NSFont" key="NSSupport">
 															<string key="NSName">LucidaGrande</string>
-															<double key="NSSize">1.200000e+01</double>
+															<double key="NSSize">12</double>
 															<int key="NSfFlags">16</int>
 														</object>
 														<string key="NSPlaceholderString"/>
@@ -1457,7 +1462,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 															<int key="NSColorSpace">6</int>
 															<string key="NSCatalogName">System</string>
 															<string key="NSColorName">controlBackgroundColor</string>
-															<reference key="NSColor" ref="764920908"/>
+															<reference key="NSColor" ref="705970636"/>
 														</object>
 														<reference key="NSTextColor" ref="930815747"/>
 													</object>
@@ -1467,8 +1472,8 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 											</object>
-											<double key="NSIntercellSpacingWidth">3.000000e+00</double>
-											<double key="NSIntercellSpacingHeight">2.000000e+00</double>
+											<double key="NSIntercellSpacingWidth">3</double>
+											<double key="NSIntercellSpacingHeight">2</double>
 											<reference key="NSBackgroundColor" ref="822946413"/>
 											<object class="NSColor" key="NSGridColor">
 												<int key="NSColorSpace">6</int>
@@ -1479,8 +1484,10 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 													<bytes key="NSWhite">MC41AA</bytes>
 												</object>
 											</object>
-											<double key="NSRowHeight">1.700000e+01</double>
+											<double key="NSRowHeight">17</double>
 											<int key="NSTvFlags">1379958784</int>
+											<reference key="NSDelegate"/>
+											<reference key="NSDataSource"/>
 											<int key="NSColumnAutoresizingStyle">1</int>
 											<int key="NSDraggingSourceMaskForLocal">-1</int>
 											<int key="NSDraggingSourceMaskForNonLocal">0</int>
@@ -1501,7 +1508,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 									<reference key="NSSuperview" ref="1063387772"/>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">9.949238e-01</double>
+									<double key="NSPercent">0.99492380000000002</double>
 								</object>
 								<object class="NSScroller" id="17278747">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1511,7 +1518,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 									<int key="NSsFlags">1</int>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">6.885246e-01</double>
+									<double key="NSPercent">0.68852460000000004</double>
 								</object>
 								<object class="NSClipView" id="672307654">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1568,7 +1575,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSFrameAutosaveName">x11_apps</string>
 			</object>
 			<object class="NSMenu" id="294137138">
@@ -3316,11 +3323,8 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 			</object>
 			<object class="NSMutableDictionary" key="flattenedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSMutableArray" key="dict.sortedKeys">
+				<object class="NSArray" key="dict.sortedKeys">
 					<bool key="EncodedWithXMLCoder">YES</bool>
-					<string>-1.IBPluginDependency</string>
-					<string>-2.IBPluginDependency</string>
-					<string>-3.IBPluginDependency</string>
 					<string>-3.ImportedFromIB2</string>
 					<string>100292.IBPluginDependency</string>
 					<string>100293.IBPluginDependency</string>
@@ -3375,7 +3379,6 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 					<string>169.editorWindowContentRectSynchronizationRect</string>
 					<string>19.IBPluginDependency</string>
 					<string>19.ImportedFromIB2</string>
-					<string>196.IBPluginDependency</string>
 					<string>196.ImportedFromIB2</string>
 					<string>200295.IBPluginDependency</string>
 					<string>200295.IBShouldRemoveOnLegacySave</string>
@@ -3390,6 +3393,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 					<string>24.ImportedFromIB2</string>
 					<string>24.editorWindowContentRectSynchronizationRect</string>
 					<string>244.IBEditorWindowLastContentRect</string>
+					<string>244.IBPluginDependency</string>
 					<string>244.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>244.IBWindowTemplateEditedContentRect</string>
 					<string>244.ImportedFromIB2</string>
@@ -3409,6 +3413,7 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 					<string>272.IBPluginDependency</string>
 					<string>272.ImportedFromIB2</string>
 					<string>285.IBEditorWindowLastContentRect</string>
+					<string>285.IBPluginDependency</string>
 					<string>285.IBViewEditorWindowController.showingBoundsRectangles</string>
 					<string>285.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>285.IBWindowTemplateEditedContentRect</string>
@@ -3608,14 +3613,12 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 				</object>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="1" id="9"/>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3635,266 +3638,266 @@ dGVuIFByb2dyYW1tZW4gbmljaHQgZXJsYXVidC4</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{168, 821}, {113, 23}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{202, 626}, {154, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{349, 858}, {315, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{271, 666}, {301, 153}}</string>
 					<string>{{325, 198}, {613, 302}}</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="NO"/>
 					<string>{{325, 198}, {613, 302}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{184, 290}, {481, 345}}</string>
-					<integer value="0" id="8"/>
-					<reference ref="9"/>
+					<integer value="0"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{58, 803}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{100, 746}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{68, 585}, {512, 271}}</string>
-					<reference ref="9"/>
-					<reference ref="9"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
+					<integer value="1"/>
 					<string>{{68, 585}, {512, 271}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{433, 406}, {486, 327}}</string>
-					<reference ref="8"/>
-					<reference ref="9"/>
+					<integer value="0"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{145, 836}, {375, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{67, 819}, {336, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{20, 641}, {218, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{79, 616}, {218, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 				</object>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
diff --git a/hw/xquartz/bundle/Resources/German.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/German.lproj/main.nib/keyedobjects.nib
index a95fee9..a017a7f 100644
Binary files a/hw/xquartz/bundle/Resources/German.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/German.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/Italian.lproj/locversion.plist b/hw/xquartz/bundle/Resources/Italian.lproj/locversion.plist
index 3c4e94c..26ba572 100644
--- a/hw/xquartz/bundle/Resources/Italian.lproj/locversion.plist
+++ b/hw/xquartz/bundle/Resources/Italian.lproj/locversion.plist
@@ -9,6 +9,6 @@
 	<key>LprojRevisionLevel</key>
 	<string>1</string>
 	<key>LprojVersion</key>
-	<string>73</string>
+	<string>83</string>
 </dict>
 </plist>
diff --git a/hw/xquartz/bundle/Resources/Japanese.lproj/locversion.plist b/hw/xquartz/bundle/Resources/Japanese.lproj/locversion.plist
index 8db4f8a..b78c7c5 100644
--- a/hw/xquartz/bundle/Resources/Japanese.lproj/locversion.plist
+++ b/hw/xquartz/bundle/Resources/Japanese.lproj/locversion.plist
@@ -9,6 +9,6 @@
 	<key>LprojRevisionLevel</key>
 	<string>1</string>
 	<key>LprojVersion</key>
-	<string>76</string>
+	<string>83</string>
 </dict>
 </plist>
diff --git a/hw/xquartz/bundle/Resources/Spanish.lproj/locversion.plist b/hw/xquartz/bundle/Resources/Spanish.lproj/locversion.plist
index 05ec198..068c077 100644
--- a/hw/xquartz/bundle/Resources/Spanish.lproj/locversion.plist
+++ b/hw/xquartz/bundle/Resources/Spanish.lproj/locversion.plist
@@ -9,6 +9,6 @@
 	<key>LprojRevisionLevel</key>
 	<string>1</string>
 	<key>LprojVersion</key>
-	<string>73</string>
+	<string>83</string>
 </dict>
 </plist>
diff --git a/hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/designable.nib
index d2eb1d1..adbcd6f 100644
--- a/hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/designable.nib
@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.050000190734863">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">10A222</string>
-		<string key="IBDocument.InterfaceBuilderVersion">708</string>
-		<string key="IBDocument.AppKitVersion">994.5</string>
-		<string key="IBDocument.HIToolboxVersion">404.00</string>
+		<string key="IBDocument.SystemVersion">10A314</string>
+		<string key="IBDocument.InterfaceBuilderVersion">718</string>
+		<string key="IBDocument.AppKitVersion">1013</string>
+		<string key="IBDocument.HIToolboxVersion">415.00</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
-			<string key="NS.object.0">708</string>
+			<string key="NS.object.0">718</string>
 		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -19,7 +19,7 @@
 		</object>
 		<object class="NSMutableDictionary" key="IBDocument.Metadata">
 			<bool key="EncodedWithXMLCoder">YES</bool>
-			<object class="NSArray" key="dict.sortedKeys">
+			<object class="NSArray" key="dict.sortedKeys" id="0">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 			</object>
 			<object class="NSMutableArray" key="dict.values">
@@ -229,7 +229,7 @@
 					</object>
 					<object class="NSMenuItem" id="200491363">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle">RWRpY2nDs24</string>
+						<string key="NSTitle">Edición</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -237,7 +237,7 @@
 						<reference key="NSMixedImage" ref="351811234"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="526778998">
-							<string type="base64-UTF8" key="NSTitle">RWRpY2nDs24</string>
+							<string key="NSTitle">Edición</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="185296989">
@@ -314,7 +314,7 @@
 								</object>
 								<object class="NSMenuItem" id="369641893">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">UmVjb3JyZXIgdmVudGFuYXMgYWwgcmV2w6lzA</string>
+									<string key="NSTitle">Recorrer ventanas al revés</string>
 									<string key="NSKeyEquiv">~</string>
 									<int key="NSKeyEquivModMask">1179914</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -397,10 +397,10 @@
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="941366957">
-					<nil key="NSNextResponder"/>
+					<reference key="NSNextResponder"/>
 					<int key="NSvFlags">256</int>
 					<object class="NSMutableArray" key="NSSubviews">
 						<bool key="EncodedWithXMLCoder">YES</bool>
@@ -409,6 +409,7 @@
 							<int key="NSvFlags">256</int>
 							<string key="NSFrame">{{13, 10}, {593, 292}}</string>
 							<reference key="NSSuperview" ref="941366957"/>
+							<reference key="NSWindow"/>
 							<object class="NSMutableArray" key="NSTabViewItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSTabViewItem" id="287591690">
@@ -425,11 +426,12 @@
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{18, 210}, {402, 18}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
+												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="990762273">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">U2ltdWxhciByYXTDs24gZGUgdHJlcyBib3RvbmVzA</string>
+													<string key="NSContents">Simular ratón de tres botones</string>
 													<object class="NSFont" key="NSSupport" id="463863101">
 														<string key="NSName">LucidaGrande</string>
 														<double key="NSSize">13</double>
@@ -456,13 +458,12 @@
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{36, 40}, {501, 42}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
+												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="391919450">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">Q3VhbmRvIGVzdGEgb3BjacOzbiBlc3TDoSBhY3RpdmFkYSwgcHVlZGUgcXVlIGxvcyBlcXVpdmFsZW50
-ZXMgZGUgdGVjbGFkbyBkZSBsYSBiYXJyYSBkZSBtZW7DunMgaW50ZXJmaWVyYW4gY29uIGxhcyBhcGxp
-Y2FjaW9uZXMgWDExIHF1ZSB1c2VuIGVsIG1vZGlmaWNhZG9yIE1ldGEuA</string>
+													<string key="NSContents">Cuando esta opción está activada, puede que los equivalentes de teclado de la barra de menús interfieran con las aplicaciones X11 que usen el modificador Meta.</string>
 													<object class="NSFont" key="NSSupport" id="26">
 														<string key="NSName">LucidaGrande</string>
 														<double key="NSSize">11</double>
@@ -474,16 +475,16 @@ Y2FjaW9uZXMgWDExIHF1ZSB1c2VuIGVsIG1vZGlmaWNhZG9yIE1ldGEuA</string>
 														<int key="NSColorSpace">6</int>
 														<string key="NSCatalogName">System</string>
 														<string key="NSColorName">controlColor</string>
-														<object class="NSColor" key="NSColor" id="92723341">
+														<object class="NSColor" key="NSColor" id="193651701">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
 														<int key="NSColorSpace">6</int>
 														<string key="NSCatalogName">System</string>
 														<string key="NSColorName">controlTextColor</string>
-														<object class="NSColor" key="NSColor" id="214098874">
+														<object class="NSColor" key="NSColor">
 															<int key="NSColorSpace">3</int>
 															<bytes key="NSWhite">MAA</bytes>
 														</object>
@@ -495,6 +496,7 @@ Y2FjaW9uZXMgWDExIHF1ZSB1c2VuIGVsIG1vZGlmaWNhZG9yIE1ldGEuA</string>
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{36, 170}, {501, 34}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
+												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="649334366">
 													<int key="NSCellFlags">67239424</int>
@@ -513,6 +515,7 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{18, 88}, {402, 18}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
+												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="940564599">
 													<int key="NSCellFlags">67239424</int>
@@ -535,12 +538,12 @@ IHBhcmEgYWN0aXZhciBlbCBib3TDs24gY2VudHJhbCBvIGRlcmVjaG8gZGVsIHJhdMOzbi4KA</strin
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{36, 112}, {501, 28}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
+												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="666057093">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">UGVybWl0ZSBxdWUgbG9zIGNhbWJpb3MgZW4gZWwgbWVuw7ogZGUgdGVjbGFkbyByZWVtcGxhY2VuIGxh
-IGRpc3RyaWJ1Y2nDs24gZGUgdGVjbGFzIGFjdHVhbCBkZSBYMTEuA</string>
+													<string key="NSContents">Permite que los cambios en el menú de teclado reemplacen la distribución de teclas actual de X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="31160162"/>
@@ -553,11 +556,12 @@ IGRpc3RyaWJ1Y2nDs24gZGUgdGVjbGFzIGFjdHVhbCBkZSBYMTEuA</string>
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{18, 146}, {402, 18}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
+												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="967619578">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">U2VndWlyIGxhIGRpc3RyaWJ1Y2nDs24gZGUgdGVjbGFkbyBkZWwgc2lzdGVtYQ</string>
+													<string key="NSContents">Seguir la distribución de teclado del sistema</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="179949713"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -573,6 +577,7 @@ IGRpc3RyaWJ1Y2nDs24gZGUgdGVjbGFzIGFjdHVhbCBkZSBYMTEuA</string>
 										</object>
 										<string key="NSFrame">{{10, 33}, {573, 246}}</string>
 										<reference key="NSSuperview" ref="448510093"/>
+										<reference key="NSWindow"/>
 									</object>
 									<string key="NSLabel">Entrada</string>
 									<reference key="NSColor" ref="57160303"/>
@@ -618,9 +623,7 @@ IGRpc3RyaWJ1Y2nDs24gZGUgdGVjbGFzIGFjdHVhbCBkZSBYMTEuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="624655599">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">TG9zIHNvbmlkb3MgZGUgWDExIHVzYXLDoW4gZWwgc29uaWRvIGRlIGFsZXJ0YSBlc3TDoW5kYXIgZGVs
-IHNpc3RlbWEgZGVmaW5pZG8gZW4gZWwgcGFuZWwg4oCcRWZlY3RvcyBkZSBzb25pZG/igJ0gZGUgUHJl
-ZmVyZW5jaWFzIGRlbCBTaXN0ZW1hLg</string>
+													<string key="NSContents">Los sonidos de X11 usarán el sonido de alerta estándar del sistema definido en la pestaña “Efectos de sonido” del panel Sonido de Preferencias del Sistema.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="1039016593"/>
@@ -654,7 +657,7 @@ ZmVyZW5jaWFzIGRlbCBTaXN0ZW1hLg</string>
 													<int key="NSPeriodicInterval">75</int>
 													<object class="NSMenuItem" key="NSMenuItem" id="616492372">
 														<reference key="NSMenu" ref="341113515"/>
-														<string key="NSTitle">Los de la pantalla</string>
+														<string key="NSTitle">Desde la pantalla</string>
 														<string key="NSKeyEquiv"/>
 														<int key="NSKeyEquivModMask">1048576</int>
 														<int key="NSMnemonicLoc">2147483647</int>
@@ -744,8 +747,7 @@ ZmVyZW5jaWFzIGRlbCBTaXN0ZW1hLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="311969422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">RXN0YSBvcGNpw7NuIHNlcsOhIGVmZWN0aXZhIGxhIHByw7N4aW1hIHZleiBxdWUgc2UgaW5pY2llIFgx
-MS4</string>
+													<string key="NSContents">Esta opción será efectiva la próxima vez que se inicie X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="86150604"/>
@@ -784,8 +786,7 @@ MS4</string>
 												<object class="NSButtonCell" key="NSCell" id="917248662">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">TW9zdHJhIGJhcnJhIGRlIG1lbsO6cyBhdXRvbcOhdGljYW1lbnRlIGVuIGxhIG1vZGFsaWRhZCBkZSBw
-YW50YWxsYSBjb21wbGV0YSA</string>
+													<string key="NSContents">Mostra barra de menús automáticamente en la modalidad de pantalla completa </string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="57246850"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -807,9 +808,7 @@ YW50YWxsYSBjb21wbGV0YSA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="761107402">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWN0aXZhIGxhIHZlbnRhbmEgcmHDrXogZGUgWDExLiBVc2UgbGEgY29tYmluYWNpw7NuIGRlIHRlY2xh
-cyBDb21hbmRvICsgT3BjacOzbiArIEEgcGFyYSBlbnRyYXIgbyBzYWxpciBkZSBsYSBtb2RhbGlkYWQg
-ZGUgcGFudGFsbGEgY29tcGxldGEuA</string>
+													<string key="NSContents">Activa la ventana raíz de X11. Use la combinación de teclas Comando + Opción + A para entrar o salir de la modalidad de pantalla completa.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="298603383"/>
@@ -842,7 +841,7 @@ ZGUgcGFudGFsbGEgY29tcGxldGEuA</string>
 												<object class="NSButtonCell" key="NSCell" id="718083688">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">QWN0aXZhciBzaW5jcm9uaXphY2nDs24</string>
+													<string key="NSContents">Activar sincronización</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="878106058"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -864,9 +863,7 @@ ZGUgcGFudGFsbGEgY29tcGxldGEuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="572508492">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWN0aXZhIGVsIMOtdGVtIGRlIG1lbsO6ICJjb3BpYXIiIHkgcGVybWl0ZSBzaW5jcm9uaXphciBlbCBw
-b3J0YXBhcGVsZXMgZGUgT1NYIHkgbG9zIGLDumZlcnMgQ0xJUEJPQVJEIHkgUFJJTUFSWSBkZSBYMTEu
-A</string>
+													<string key="NSContents">Activa el ítem de menú “copiar” y permite sincronizar el portapapeles de OSX y los búfers CLIPBOARD y PRIMARY de X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="386152084"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -904,8 +901,7 @@ A</string>
 												<object class="NSButtonCell" key="NSCell" id="510771323">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">QWN0dWFsaXphciBlbCBQUklNQVJZIChjbGljIGNvbiBlbCBib3TDs24gY2VudHJhbCkgY3VhbmRvIGNh
-bWJpZSBlbCBwb3J0YXBhcGVsZXMuA</string>
+													<string key="NSContents">Actualizar el PRIMARY (clic con el botón central) cuando cambie el portapapeles.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="765780304"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -971,8 +967,7 @@ bWJpZSBlbCBwb3J0YXBhcGVsZXMuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="461823902">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">RGVzYWN0aXZlIGVzdGEgb3BjacOzbiBzaSBkZXNlYSB1c2FyIHhjbGlwYm9hcmQsIGtsaXBwZXIgbyBj
-dWFscXVpZXIgb3RybyBnZXN0b3IgZGUgcG9ydGFwYXBlbGVzIGRlIFgxMS4</string>
+													<string key="NSContents">Desactive esta opción si desea usar xclipboard, klipper o cualquier otro gestor de portapapeles de X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="620944856"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -988,8 +983,7 @@ dWFscXVpZXIgb3RybyBnZXN0b3IgZGUgcG9ydGFwYXBlbGVzIGRlIFgxMS4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="994587858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QSBjYXVzYSBkZSBsYXMgbGltaXRhY2lvbmVzIGRlbCBwcm90b2NvbG8gZGUgWDExLCBwdWVkZSBxdWUg
-ZXN0YSBvcGNpw7NuIG5vIGZ1bmNpb25lIHNpZW1wcmUgZW4gYWxndW5hcyBhcGxpY2FjaW9uZXMuA</string>
+													<string key="NSContents">A causa de las limitaciones del protocolo de X11, puede que esta opción no funcione siempre en algunas aplicaciones.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="522511724"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1043,9 +1037,7 @@ ZXN0YSBvcGNpw7NuIG5vIGZ1bmNpb25lIHNpZW1wcmUgZW4gYWxndW5hcyBhcGxpY2FjaW9uZXMuA</s
 												<object class="NSTextFieldCell" key="NSCell" id="399127858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">Q3VhbmRvIGVzdMOhIGFjdGl2YWRhLCBhbCBoYWNlciBjbGljIGVuIHVuYSB2ZW50YW5hIGluYWN0aXZh
-LCBsYSB2ZW50YW5hIHNlIGFjdGl2YSB5IGFkZW3DoXMgZWwgY2xpYyBkZWwgcmF0w7NuIHNlIHRyYW5z
-bWl0ZSBhIGVsbGEuA</string>
+													<string key="NSContents">Cuando está activada, al hacer clic en una ventana inactiva, la ventana se activa y además el clic del ratón se transmite a ella.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="290578835"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1061,7 +1053,7 @@ bWl0ZSBhIGVsbGEuA</string>
 												<object class="NSButtonCell" key="NSCell" id="959555182">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">RW5mb2NhciBsYSBwb3NpY2nDs24gZGVsIHJhdMOzbg</string>
+													<string key="NSContents">Enfocar la posición del ratón</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="992839333"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1121,9 +1113,7 @@ bWl0ZSBhIGVsbGEuA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="989804990">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">Q3VhbmRvIGVzdMOhIGFjdGl2YWRhLCBhbCBjcmVhciB1bmEgbnVldmEgdmVudGFuYSBkZSBYMTEgZWwg
-YXJjaGl2byBYMTEuYXBwIHNlIHNpdMO6YSBlbiBwcmltZXIgcGxhbm8gKHBvciBlbmNpbWEgZGUgRmlu
-ZGVyLmFwcCwgVGVybWluYWwuYXBwLCBldGMuKQ</string>
+													<string key="NSContents">Cuando está activada, al crear una nueva ventana de X11 el archivo X11.app se sitúa en primer plano (por encima de Finder.app, Terminal.app, etc.)</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="57161931"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1196,10 +1186,7 @@ ZGVyLmFwcCwgVGVybWluYWwuYXBwLCBldGMuKQ</string>
 												<object class="NSTextFieldCell" key="NSCell" id="53243865">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWwgaW5pY2lhciBYMTEgc2UgY3JlYXLDoW4gdW5hcyBjbGF2ZXMgZGUgY29udHJvbCBkZSBhY2Nlc28g
-WGF1dGhvcml0eS4gU2kgbGEgZGlyZWNjacOzbiBJUCBkZWwgc2lzdGVtYSBjYW1iaWEsIGVzdGFzIGNs
-YXZlcyBkZWphcsOhbiBkZSBzZXIgdsOhbGlkYXMsIGxvIHF1ZSBpbXBlZGlyw61hIHF1ZSBwdWRpZXNl
-biBlamVjdXRhcnNlIGxhcyBhcGxpY2FjaW9uZXMgWDExLg</string>
+													<string key="NSContents">Al iniciar X11 se crearán unas claves de control de acceso Xauthority. Si la dirección IP del sistema cambia, estas claves dejarán de ser válidas, lo que impediría que pudiesen ejecutarse las aplicaciones X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="168436707"/>
@@ -1216,10 +1203,7 @@ biBlamVjdXRhcnNlIGxhcyBhcGxpY2FjaW9uZXMgWDExLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="390084685">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">U2kgZXN0YSBvcGNpw7NuIGVzdMOhIGFjdGl2YWRhLCBsYSBvcGNpw7NuIOKAnEF1dGVudGljYXIgY29u
-ZXhpb25lc+KAnSB0YW1iacOpbiBkZWJlIGVzdGFybG8gcGFyYSBnYXJhbnRpemFyIGxhIHNlZ3VyaWRh
-ZCBkZWwgc2lzdGVtYS4gU2kgZXN0w6EgZGVzYWN0aXZhZGEsIGxhcyBjb25leGlvbmVzIGRlIGFwbGlj
-YWNpb25lcyByZW1vdGFzIG5vIGVzdMOhbiBwZXJtaXRpZGFzLg</string>
+													<string key="NSContents">Si esta opción está activada, la opción “Autenticar conexiones” también debe estarlo para garantizar la seguridad del sistema. Si está desactivada, las conexiones de aplicaciones remotas no están permitidas.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="363817195"/>
@@ -1236,8 +1220,7 @@ YWNpb25lcyByZW1vdGFzIG5vIGVzdMOhbiBwZXJtaXRpZGFzLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="283628678">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">RXN0YXMgb3BjaW9uZXMgc2Vyw6FuIGVmZWN0aXZhcyBsYSBwcsOzeGltYSB2ZXogcXVlIHNlIGluaWNp
-ZSBYMTEuA</string>
+													<string key="NSContents">Estas opciones serán efectivas la próxima vez que se inicie X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="223835729"/>
@@ -1265,10 +1248,12 @@ ZSBYMTEuA</string>
 						</object>
 					</object>
 					<string key="NSFrameSize">{619, 308}</string>
+					<reference key="NSSuperview"/>
+					<reference key="NSWindow"/>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1280, 938}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSFrameAutosaveName">x11_prefs</string>
 			</object>
 			<object class="NSWindowTemplate" id="604417141">
@@ -1276,15 +1261,15 @@ ZSBYMTEuA</string>
 				<int key="NSWindowBacking">2</int>
 				<string key="NSWindowRect">{{302, 440}, {454, 271}}</string>
 				<int key="NSWTFlags">1350041600</int>
-				<string type="base64-UTF8" key="NSWindowTitle">TWVuw7ogZGUgYXBsaWNhY2lvbmVzIFgxMQ</string>
+				<string key="NSWindowTitle">Menú de aplicaciones X11</string>
 				<string key="NSWindowClass">NSPanel</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="85544634">
-					<nil key="NSNextResponder"/>
+					<reference key="NSNextResponder"/>
 					<int key="NSvFlags">256</int>
 					<object class="NSMutableArray" key="NSSubviews">
 						<bool key="EncodedWithXMLCoder">YES</bool>
@@ -1293,6 +1278,7 @@ ZSBYMTEuA</string>
 							<int key="NSvFlags">265</int>
 							<string key="NSFrame">{{340, 191}, {110, 32}}</string>
 							<reference key="NSSuperview" ref="85544634"/>
+							<reference key="NSWindow"/>
 							<bool key="NSEnabled">YES</bool>
 							<object class="NSButtonCell" key="NSCell" id="143554520">
 								<int key="NSCellFlags">67239424</int>
@@ -1316,6 +1302,7 @@ ZSBYMTEuA</string>
 							<int key="NSvFlags">265</int>
 							<string key="NSFrame">{{340, 159}, {110, 32}}</string>
 							<reference key="NSSuperview" ref="85544634"/>
+							<reference key="NSWindow"/>
 							<bool key="NSEnabled">YES</bool>
 							<object class="NSButtonCell" key="NSCell" id="8201128">
 								<int key="NSCellFlags">67239424</int>
@@ -1349,12 +1336,14 @@ ZSBYMTEuA</string>
 											<int key="NSvFlags">256</int>
 											<string key="NSFrameSize">{301, 198}</string>
 											<reference key="NSSuperview" ref="580565898"/>
+											<reference key="NSWindow"/>
 											<bool key="NSEnabled">YES</bool>
 											<object class="NSTableHeaderView" key="NSHeaderView" id="792419186">
 												<reference key="NSNextResponder" ref="672307654"/>
 												<int key="NSvFlags">256</int>
 												<string key="NSFrameSize">{301, 17}</string>
 												<reference key="NSSuperview" ref="672307654"/>
+												<reference key="NSWindow"/>
 												<reference key="NSTableView" ref="905092943"/>
 											</object>
 											<object class="_NSCornerView" key="NSCornerView" id="898633680">
@@ -1362,6 +1351,7 @@ ZSBYMTEuA</string>
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{302, 0}, {16, 17}}</string>
 												<reference key="NSSuperview" ref="1063387772"/>
+												<reference key="NSWindow"/>
 											</object>
 											<object class="NSMutableArray" key="NSTableColumns">
 												<bool key="EncodedWithXMLCoder">YES</bool>
@@ -1370,19 +1360,22 @@ ZSBYMTEuA</string>
 													<double key="NSMinWidth">62.730998992919922</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Nombre</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor" id="113872566">
 															<int key="NSColorSpace">3</int>
 															<bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
 														</object>
-														<object class="NSColor" key="NSTextColor" id="249576247">
+														<object class="NSColor" key="NSTextColor" id="336770154">
 															<int key="NSColorSpace">6</int>
 															<string key="NSCatalogName">System</string>
-															<string key="NSColorName">headerTextColor</string>
-															<reference key="NSColor" ref="214098874"/>
+															<string key="NSColorName">disabledControlTextColor</string>
+															<object class="NSColor" key="NSColor">
+																<int key="NSColorSpace">3</int>
+																<bytes key="NSWhite">MC4zMzMzMzMzMzMzAA</bytes>
+															</object>
 														</object>
 													</object>
 													<object class="NSTextFieldCell" key="NSDataCell" id="825378892">
@@ -1405,16 +1398,16 @@ ZSBYMTEuA</string>
 													<string key="NSHeaderToolTip"/>
 												</object>
 												<object class="NSTableColumn" id="84282687">
-													<double key="NSWidth">99</double>
+													<double key="NSWidth">88</double>
 													<double key="NSMinWidth">40</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Comando</string>
 														<reference key="NSSupport" ref="26"/>
 														<reference key="NSBackgroundColor" ref="113872566"/>
-														<reference key="NSTextColor" ref="249576247"/>
+														<reference key="NSTextColor" ref="336770154"/>
 													</object>
 													<object class="NSTextFieldCell" key="NSDataCell" id="432610585">
 														<int key="NSCellFlags">338820672</int>
@@ -1433,13 +1426,13 @@ ZSBYMTEuA</string>
 													<string key="NSHeaderToolTip"/>
 												</object>
 												<object class="NSTableColumn" id="242608782">
-													<double key="NSWidth">71</double>
+													<double key="NSWidth">82</double>
 													<double key="NSMinWidth">10</double>
 													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">67239424</int>
-														<int key="NSCellFlags2">0</int>
-														<string type="base64-UTF8" key="NSContents">RnVuY2nDs24gcsOhcGlkYQ</string>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
+														<string key="NSContents">Función rápida</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor">
 															<int key="NSColorSpace">6</int>
@@ -1447,7 +1440,7 @@ ZSBYMTEuA</string>
 															<string key="NSColorName">headerColor</string>
 															<reference key="NSColor" ref="822946413"/>
 														</object>
-														<reference key="NSTextColor" ref="249576247"/>
+														<reference key="NSTextColor" ref="336770154"/>
 													</object>
 													<object class="NSTextFieldCell" key="NSDataCell" id="34714764">
 														<int key="NSCellFlags">338820672</int>
@@ -1465,7 +1458,7 @@ ZSBYMTEuA</string>
 															<int key="NSColorSpace">6</int>
 															<string key="NSCatalogName">System</string>
 															<string key="NSColorName">controlBackgroundColor</string>
-															<reference key="NSColor" ref="92723341"/>
+															<reference key="NSColor" ref="193651701"/>
 														</object>
 														<reference key="NSTextColor" ref="930815747"/>
 													</object>
@@ -1496,10 +1489,12 @@ ZSBYMTEuA</string>
 											<int key="NSDraggingSourceMaskForLocal">-1</int>
 											<int key="NSDraggingSourceMaskForNonLocal">0</int>
 											<bool key="NSAllowsTypeSelect">YES</bool>
+											<int key="NSTableViewDraggingDestinationStyle">0</int>
 										</object>
 									</object>
 									<string key="NSFrame">{{1, 17}, {301, 198}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
+									<reference key="NSWindow"/>
 									<reference key="NSNextKeyView" ref="905092943"/>
 									<reference key="NSDocView" ref="905092943"/>
 									<reference key="NSBGColor" ref="812484075"/>
@@ -1510,6 +1505,7 @@ ZSBYMTEuA</string>
 									<int key="NSvFlags">256</int>
 									<string key="NSFrame">{{302, 17}, {15, 198}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
+									<reference key="NSWindow"/>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
 									<double key="NSPercent">0.99492377042770386</double>
@@ -1519,10 +1515,11 @@ ZSBYMTEuA</string>
 									<int key="NSvFlags">256</int>
 									<string key="NSFrame">{{1, 215}, {301, 15}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
+									<reference key="NSWindow"/>
 									<int key="NSsFlags">1</int>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">0.68852460384368896</double>
+									<double key="NSPercent">0.99668874172185429</double>
 								</object>
 								<object class="NSClipView" id="672307654">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1533,6 +1530,7 @@ ZSBYMTEuA</string>
 									</object>
 									<string key="NSFrame">{{1, 0}, {301, 17}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
+									<reference key="NSWindow"/>
 									<reference key="NSNextKeyView" ref="792419186"/>
 									<reference key="NSDocView" ref="792419186"/>
 									<reference key="NSBGColor" ref="812484075"/>
@@ -1542,6 +1540,7 @@ ZSBYMTEuA</string>
 							</object>
 							<string key="NSFrame">{{20, 20}, {318, 231}}</string>
 							<reference key="NSSuperview" ref="85544634"/>
+							<reference key="NSWindow"/>
 							<reference key="NSNextKeyView" ref="580565898"/>
 							<int key="NSsFlags">50</int>
 							<reference key="NSVScroller" ref="842897584"/>
@@ -1556,11 +1555,12 @@ ZSBYMTEuA</string>
 							<int key="NSvFlags">265</int>
 							<string key="NSFrame">{{340, 223}, {114, 32}}</string>
 							<reference key="NSSuperview" ref="85544634"/>
+							<reference key="NSWindow"/>
 							<bool key="NSEnabled">YES</bool>
 							<object class="NSButtonCell" key="NSCell" id="1025474039">
 								<int key="NSCellFlags">-2080244224</int>
 								<int key="NSCellFlags2">137887744</int>
-								<string type="base64-UTF8" key="NSContents">QcOxYWRpciDDrXRlbQ</string>
+								<string key="NSContents">Añadir ítem</string>
 								<reference key="NSSupport" ref="463863101"/>
 								<reference key="NSControlView" ref="758204686"/>
 								<int key="NSButtonFlags">-2038284033</int>
@@ -1576,14 +1576,16 @@ ZSBYMTEuA</string>
 						</object>
 					</object>
 					<string key="NSFrameSize">{454, 271}</string>
+					<reference key="NSSuperview"/>
+					<reference key="NSWindow"/>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1280, 938}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSFrameAutosaveName">x11_apps</string>
 			</object>
 			<object class="NSMenu" id="294137138">
-				<string type="base64-UTF8" key="NSTitle">TWVuw7o</string>
+				<string key="NSTitle">Menú</string>
 				<object class="NSMutableArray" key="NSMenuItems">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="NSMenuItem" id="318286212">
@@ -1623,7 +1625,7 @@ ZSBYMTEuA</string>
 								</object>
 								<object class="NSMenuItem" id="1032342329">
 									<reference key="NSMenu" ref="48278059"/>
-									<string type="base64-UTF8" key="NSTitle">UGVyc29uYWxpemFy4oCmA</string>
+									<string key="NSTitle">Personalizar…</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -2198,28 +2200,26 @@ ZSBYMTEuA</string>
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="IBObjectRecord">
 						<int key="objectID">0</int>
-						<object class="NSArray" key="object" id="330408435">
-							<bool key="EncodedWithXMLCoder">YES</bool>
-						</object>
+						<reference key="object" ref="0"/>
 						<reference key="children" ref="904585544"/>
 						<nil key="parent"/>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-2</int>
 						<reference key="object" ref="815810918"/>
-						<reference key="parent" ref="330408435"/>
-						<string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">File's Owner</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-1</int>
 						<reference key="object" ref="941939442"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">First Responder</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-3</int>
 						<reference key="object" ref="951368722"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">Application</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2233,7 +2233,7 @@ ZSBYMTEuA</string>
 							<reference ref="868031522"/>
 							<reference ref="551174276"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">MainMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2478,7 +2478,7 @@ ZSBYMTEuA</string>
 					<object class="IBObjectRecord">
 						<int key="objectID">196</int>
 						<reference key="object" ref="485884620"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">X11Controller</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2488,7 +2488,7 @@ ZSBYMTEuA</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="941366957"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">PrefsPanel</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2752,7 +2752,7 @@ ZSBYMTEuA</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="85544634"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">EditPrograms</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2775,7 +2775,7 @@ ZSBYMTEuA</string>
 							<reference ref="318286212"/>
 							<reference ref="511651072"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">DockMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -3329,6 +3329,7 @@ ZSBYMTEuA</string>
 				<bool key="EncodedWithXMLCoder">YES</bool>
 				<object class="NSArray" key="dict.sortedKeys">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<string>-3.IBPluginDependency</string>
 					<string>-3.ImportedFromIB2</string>
 					<string>100292.IBPluginDependency</string>
 					<string>100293.IBPluginDependency</string>
@@ -3618,6 +3619,7 @@ ZSBYMTEuA</string>
 				</object>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3685,10 +3687,10 @@ ZSBYMTEuA</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<string>{{271, 666}, {301, 153}}</string>
-					<string>{{438, 548}, {619, 308}}</string>
+					<string>{{300, 409}, {619, 308}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<boolean value="NO"/>
-					<string>{{438, 548}, {619, 308}}</string>
+					<boolean value="YES"/>
+					<string>{{300, 409}, {619, 308}}</string>
 					<integer value="1"/>
 					<string>{{184, 290}, {481, 345}}</string>
 					<integer value="0"/>
@@ -3705,11 +3707,11 @@ ZSBYMTEuA</string>
 					<string>{{100, 746}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
-					<string>{{68, 585}, {454, 271}}</string>
+					<string>{{68, 453}, {454, 271}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1"/>
 					<integer value="1"/>
-					<string>{{68, 585}, {454, 271}}</string>
+					<string>{{68, 453}, {454, 271}}</string>
 					<integer value="1"/>
 					<string>{{433, 406}, {486, 327}}</string>
 					<integer value="0"/>
@@ -3910,9 +3912,7 @@ ZSBYMTEuA</string>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -3920,9 +3920,7 @@ ZSBYMTEuA</string>
 			<nil key="activeLocalization"/>
 			<object class="NSMutableDictionary" key="localizations">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -3960,6 +3958,15 @@ ZSBYMTEuA</string>
 			</object>
 		</object>
 		<int key="IBDocument.localizationMode">0</int>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+			<integer value="1050" key="NS.object.0"/>
+		</object>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+			<integer value="3000" key="NS.object.0"/>
+		</object>
+		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
 		<string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
 		<int key="IBDocument.defaultPropertyAccessControl">3</int>
 	</data>
diff --git a/hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/keyedobjects.nib
index fe4b554..6d445d1 100644
Binary files a/hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/da.lproj/locversion.plist b/hw/xquartz/bundle/Resources/da.lproj/locversion.plist
index 7994587..ee94673 100644
--- a/hw/xquartz/bundle/Resources/da.lproj/locversion.plist
+++ b/hw/xquartz/bundle/Resources/da.lproj/locversion.plist
@@ -9,6 +9,6 @@
 	<key>LprojRevisionLevel</key>
 	<string>1</string>
 	<key>LprojVersion</key>
-	<string>73</string>
+	<string>83</string>
 </dict>
 </plist>
diff --git a/hw/xquartz/bundle/Resources/da.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/da.lproj/main.nib/designable.nib
index 53166fe..e0c838b 100644
--- a/hw/xquartz/bundle/Resources/da.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/da.lproj/main.nib/designable.nib
@@ -626,7 +626,7 @@ ZXJzaWd0Lg</string>
 											<object class="NSPopUpButton" id="709074847">
 												<reference key="NSNextResponder" ref="515308735"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{74, 202}, {128, 26}}</string>
+												<string key="NSFrame">{{70, 202}, {128, 26}}</string>
 												<reference key="NSSuperview" ref="515308735"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSPopUpButtonCell" key="NSCell" id="633115429">
diff --git a/hw/xquartz/bundle/Resources/da.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/da.lproj/main.nib/keyedobjects.nib
index 3b79218..e1c0a2e 100644
Binary files a/hw/xquartz/bundle/Resources/da.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/da.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/fi.lproj/locversion.plist b/hw/xquartz/bundle/Resources/fi.lproj/locversion.plist
index 3c0e25c..ec5c798 100644
--- a/hw/xquartz/bundle/Resources/fi.lproj/locversion.plist
+++ b/hw/xquartz/bundle/Resources/fi.lproj/locversion.plist
@@ -9,6 +9,6 @@
 	<key>LprojRevisionLevel</key>
 	<string>1</string>
 	<key>LprojVersion</key>
-	<string>73</string>
+	<string>83</string>
 </dict>
 </plist>
diff --git a/hw/xquartz/bundle/Resources/fi.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/fi.lproj/main.nib/designable.nib
index 2156188..dbdfc1e 100644
--- a/hw/xquartz/bundle/Resources/fi.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/fi.lproj/main.nib/designable.nib
@@ -1,11 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.05">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">9C31</string>
-		<string key="IBDocument.InterfaceBuilderVersion">677</string>
-		<string key="IBDocument.AppKitVersion">949.26</string>
-		<string key="IBDocument.HIToolboxVersion">352.00</string>
+		<string key="IBDocument.SystemVersion">10A222</string>
+		<string key="IBDocument.InterfaceBuilderVersion">708</string>
+		<string key="IBDocument.AppKitVersion">994.5</string>
+		<string key="IBDocument.HIToolboxVersion">404.00</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+			<string key="NS.object.0">708</string>
+		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
 		</object>
@@ -393,7 +397,7 @@
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="941366957">
 					<nil key="NSNextResponder"/>
@@ -428,7 +432,7 @@
 													<string type="base64-UTF8" key="NSContents">RW11bG9pIGtvbG1lbsOkcHDDpGltaXN0w6QgaGlpcnTDpA</string>
 													<object class="NSFont" key="NSSupport" id="463863101">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">1044</int>
 													</object>
 													<reference key="NSControlView" ref="119157981"/>
@@ -461,7 +465,7 @@ w6Rpcml0w6QgWDExLW9oamVsbWlhLCBqb3RrYSBrw6R5dHTDpHbDpHQgTWV0YS1tdXVudG9uw6RwcMOk
 aW50w6QuA</string>
 													<object class="NSFont" key="NSSupport" id="26">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.100000e+01</double>
+														<double key="NSSize">11</double>
 														<int key="NSfFlags">3100</int>
 													</object>
 													<string key="NSPlaceholderString"/>
@@ -470,9 +474,9 @@ aW50w6QuA</string>
 														<int key="NSColorSpace">6</int>
 														<string key="NSCatalogName">System</string>
 														<string key="NSColorName">controlColor</string>
-														<object class="NSColor" key="NSColor" id="735589852">
+														<object class="NSColor" key="NSColor" id="402953799">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2NwA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -639,7 +643,7 @@ ZXR1c3BhbmVlbGlzc2EuA</string>
 													<int key="NSButtonFlags2">1</int>
 													<object class="NSFont" key="NSAlternateImage">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">16</int>
 													</object>
 													<string key="NSAlternateContents"/>
@@ -706,6 +710,7 @@ ZXR1c3BhbmVlbGlzc2EuA</string>
 																<reference key="NSTarget" ref="633115429"/>
 															</object>
 														</object>
+														<reference key="NSMenuFont" ref="463863101"/>
 													</object>
 													<int key="NSPreferredEdge">3</int>
 													<bool key="NSUsesItemFromMenu">YES</bool>
@@ -898,8 +903,8 @@ dXR0dXUuA</string>
 												<object class="NSButtonCell" key="NSCell" id="510771323">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">UMOkaXZpdMOkIFgxMTpuIGVuc2lzaWphaW5lbiB2YWxpbnRhIChrZXNraW9zb2l0dXMpLCAKa3VuIE1h
-YyBPUyBYOm4gbGVpa2Vww7Z5dMOkIG11dXR0dXUuA</string>
+													<string type="base64-UTF8" key="NSContents">UMOkaXZpdMOkIFgxMTpuIGVuc2lzaWphaW5lbiB2YWxpbnRhIChrZXNraW9zb2l0dXMpLCBrdW4gTWFj
+IE9TIFg6biBsZWlrZXDDtnl0w6QgbXV1dHR1dS4</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="765780304"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1265,7 +1270,7 @@ ZXJyYW4uA</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1280, 938}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSFrameAutosaveName">x11_prefs</string>
 			</object>
 			<object class="NSWindowTemplate" id="604417141">
@@ -1278,7 +1283,7 @@ ZXJyYW4uA</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="85544634">
 					<nil key="NSNextResponder"/>
@@ -1363,9 +1368,9 @@ ZXJyYW4uA</string>
 											<object class="NSMutableArray" key="NSTableColumns">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<object class="NSTableColumn" id="938444323">
-													<double key="NSWidth">1.217310e+02</double>
-													<double key="NSMinWidth">6.273100e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">121.73099999999999</double>
+													<double key="NSMinWidth">62.731000000000002</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
 														<int key="NSCellFlags">75628032</int>
 														<int key="NSCellFlags2">0</int>
@@ -1401,9 +1406,9 @@ ZXJyYW4uA</string>
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 												<object class="NSTableColumn" id="84282687">
-													<double key="NSWidth">9.900000e+01</double>
-													<double key="NSMinWidth">4.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">99</double>
+													<double key="NSMinWidth">40</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
 														<int key="NSCellFlags">75628032</int>
 														<int key="NSCellFlags2">0</int>
@@ -1428,9 +1433,9 @@ ZXJyYW4uA</string>
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 												<object class="NSTableColumn" id="242608782">
-													<double key="NSWidth">7.100000e+01</double>
-													<double key="NSMinWidth">1.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">71</double>
+													<double key="NSMinWidth">10</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
 														<int key="NSCellFlags">67239424</int>
 														<int key="NSCellFlags2">0</int>
@@ -1450,7 +1455,7 @@ ZXJyYW4uA</string>
 														<string key="NSContents">Text Cell</string>
 														<object class="NSFont" key="NSSupport">
 															<string key="NSName">LucidaGrande</string>
-															<double key="NSSize">1.200000e+01</double>
+															<double key="NSSize">12</double>
 															<int key="NSfFlags">16</int>
 														</object>
 														<string key="NSPlaceholderString"/>
@@ -1460,7 +1465,7 @@ ZXJyYW4uA</string>
 															<int key="NSColorSpace">6</int>
 															<string key="NSCatalogName">System</string>
 															<string key="NSColorName">controlBackgroundColor</string>
-															<reference key="NSColor" ref="735589852"/>
+															<reference key="NSColor" ref="402953799"/>
 														</object>
 														<reference key="NSTextColor" ref="930815747"/>
 													</object>
@@ -1470,8 +1475,8 @@ ZXJyYW4uA</string>
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 											</object>
-											<double key="NSIntercellSpacingWidth">3.000000e+00</double>
-											<double key="NSIntercellSpacingHeight">2.000000e+00</double>
+											<double key="NSIntercellSpacingWidth">3</double>
+											<double key="NSIntercellSpacingHeight">2</double>
 											<reference key="NSBackgroundColor" ref="822946413"/>
 											<object class="NSColor" key="NSGridColor">
 												<int key="NSColorSpace">6</int>
@@ -1482,8 +1487,10 @@ ZXJyYW4uA</string>
 													<bytes key="NSWhite">MC41AA</bytes>
 												</object>
 											</object>
-											<double key="NSRowHeight">1.700000e+01</double>
+											<double key="NSRowHeight">17</double>
 											<int key="NSTvFlags">1379958784</int>
+											<reference key="NSDelegate"/>
+											<reference key="NSDataSource"/>
 											<int key="NSColumnAutoresizingStyle">1</int>
 											<int key="NSDraggingSourceMaskForLocal">-1</int>
 											<int key="NSDraggingSourceMaskForNonLocal">0</int>
@@ -1492,6 +1499,7 @@ ZXJyYW4uA</string>
 									</object>
 									<string key="NSFrame">{{1, 17}, {301, 198}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
+									<reference key="NSNextKeyView" ref="905092943"/>
 									<reference key="NSDocView" ref="905092943"/>
 									<reference key="NSBGColor" ref="812484075"/>
 									<int key="NScvFlags">4</int>
@@ -1503,7 +1511,7 @@ ZXJyYW4uA</string>
 									<reference key="NSSuperview" ref="1063387772"/>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">9.949238e-01</double>
+									<double key="NSPercent">0.99492380000000002</double>
 								</object>
 								<object class="NSScroller" id="17278747">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1513,7 +1521,7 @@ ZXJyYW4uA</string>
 									<int key="NSsFlags">1</int>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">6.885246e-01</double>
+									<double key="NSPercent">0.68852460000000004</double>
 								</object>
 								<object class="NSClipView" id="672307654">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1524,6 +1532,7 @@ ZXJyYW4uA</string>
 									</object>
 									<string key="NSFrame">{{1, 0}, {301, 17}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
+									<reference key="NSNextKeyView" ref="792419186"/>
 									<reference key="NSDocView" ref="792419186"/>
 									<reference key="NSBGColor" ref="812484075"/>
 									<int key="NScvFlags">4</int>
@@ -1532,6 +1541,7 @@ ZXJyYW4uA</string>
 							</object>
 							<string key="NSFrame">{{20, 20}, {318, 231}}</string>
 							<reference key="NSSuperview" ref="85544634"/>
+							<reference key="NSNextKeyView" ref="580565898"/>
 							<int key="NSsFlags">50</int>
 							<reference key="NSVScroller" ref="842897584"/>
 							<reference key="NSHScroller" ref="17278747"/>
@@ -1568,7 +1578,7 @@ ZXJyYW4uA</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1280, 938}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSFrameAutosaveName">x11_apps</string>
 			</object>
 			<object class="NSMenu" id="294137138">
@@ -3316,11 +3326,8 @@ ZXJyYW4uA</string>
 			</object>
 			<object class="NSMutableDictionary" key="flattenedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSMutableArray" key="dict.sortedKeys">
+				<object class="NSArray" key="dict.sortedKeys">
 					<bool key="EncodedWithXMLCoder">YES</bool>
-					<string>-1.IBPluginDependency</string>
-					<string>-2.IBPluginDependency</string>
-					<string>-3.IBPluginDependency</string>
 					<string>-3.ImportedFromIB2</string>
 					<string>100292.IBPluginDependency</string>
 					<string>100293.IBPluginDependency</string>
@@ -3380,7 +3387,6 @@ ZXJyYW4uA</string>
 					<string>169.editorWindowContentRectSynchronizationRect</string>
 					<string>19.IBPluginDependency</string>
 					<string>19.ImportedFromIB2</string>
-					<string>196.IBPluginDependency</string>
 					<string>196.ImportedFromIB2</string>
 					<string>200295.IBPluginDependency</string>
 					<string>200295.IBPropertyAccessControl</string>
@@ -3399,6 +3405,7 @@ ZXJyYW4uA</string>
 					<string>24.ImportedFromIB2</string>
 					<string>24.editorWindowContentRectSynchronizationRect</string>
 					<string>244.IBEditorWindowLastContentRect</string>
+					<string>244.IBPluginDependency</string>
 					<string>244.IBPropertyAccessControl</string>
 					<string>244.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>244.IBWindowTemplateEditedContentRect</string>
@@ -3420,6 +3427,7 @@ ZXJyYW4uA</string>
 					<string>272.IBPluginDependency</string>
 					<string>272.ImportedFromIB2</string>
 					<string>285.IBEditorWindowLastContentRect</string>
+					<string>285.IBPluginDependency</string>
 					<string>285.IBPropertyAccessControl</string>
 					<string>285.IBViewEditorWindowController.showingBoundsRectangles</string>
 					<string>285.IBViewEditorWindowController.showingLayoutRectangles</string>
@@ -3693,21 +3701,19 @@ ZXJyYW4uA</string>
 				</object>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="1" id="9"/>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3" id="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3721,350 +3727,350 @@ ZXJyYW4uA</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{168, 821}, {113, 23}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{202, 626}, {154, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>{{349, 858}, {315, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{271, 666}, {301, 153}}</string>
 					<string>{{706, 450}, {525, 323}}</string>
-					<reference ref="11"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="3"/>
 					<boolean value="NO"/>
 					<string>{{706, 450}, {525, 323}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{184, 290}, {481, 345}}</string>
-					<integer value="0" id="8"/>
-					<reference ref="9"/>
+					<integer value="0"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{58, 803}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{100, 746}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{68, 585}, {469, 271}}</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
-					<reference ref="9"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="3"/>
+					<integer value="1"/>
+					<integer value="1"/>
 					<string>{{68, 585}, {469, 271}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{433, 406}, {486, 327}}</string>
-					<reference ref="8"/>
-					<reference ref="9"/>
+					<integer value="0"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>{{145, 836}, {357, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{67, 819}, {336, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{84, 709}, {131, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{20, 641}, {218, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{79, 616}, {218, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 				</object>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
diff --git a/hw/xquartz/bundle/Resources/fi.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/fi.lproj/main.nib/keyedobjects.nib
index 677f979..dfb04f1 100644
Binary files a/hw/xquartz/bundle/Resources/fi.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/fi.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/ko.lproj/locversion.plist b/hw/xquartz/bundle/Resources/ko.lproj/locversion.plist
index 61d38f5..5ce4bb7 100644
--- a/hw/xquartz/bundle/Resources/ko.lproj/locversion.plist
+++ b/hw/xquartz/bundle/Resources/ko.lproj/locversion.plist
@@ -9,6 +9,6 @@
 	<key>LprojRevisionLevel</key>
 	<string>1</string>
 	<key>LprojVersion</key>
-	<string>73</string>
+	<string>83</string>
 </dict>
 </plist>
diff --git a/hw/xquartz/bundle/Resources/ko.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/ko.lproj/main.nib/designable.nib
index 9917b63..32291ca 100644
--- a/hw/xquartz/bundle/Resources/ko.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/ko.lproj/main.nib/designable.nib
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.050000190734863">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.05">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
 		<string key="IBDocument.SystemVersion">10A222</string>
@@ -12,7 +12,6 @@
 		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
-			<integer value="348"/>
 		</object>
 		<object class="NSArray" key="IBDocument.PluginDependencies">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -398,10 +397,10 @@
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="941366957">
-					<reference key="NSNextResponder"/>
+					<nil key="NSNextResponder"/>
 					<int key="NSvFlags">256</int>
 					<object class="NSMutableArray" key="NSSubviews">
 						<bool key="EncodedWithXMLCoder">YES</bool>
@@ -475,9 +474,9 @@ mCDsnojsirXri4jri6QuA</string>
 														<int key="NSColorSpace">6</int>
 														<string key="NSCatalogName">System</string>
 														<string key="NSColorName">controlColor</string>
-														<object class="NSColor" key="NSColor" id="136819958">
+														<object class="NSColor" key="NSColor" id="241249183">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2NwA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -1026,7 +1025,7 @@ teuLiOuLpC4gA</string>
 												<object class="NSButtonCell" key="NSCell" id="259618205">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">67mE7Zmc7ISxIOyciOuPhOyasCDtgbTrpq0g66y07IucA</string>
+													<string type="base64-UTF8" key="NSContents">67mE7Zmc7ISxIOyciOuPhOyasCDtgbTrpq0</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="657659108"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1049,8 +1048,8 @@ teuLiOuLpC4gA</string>
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
 													<string type="base64-UTF8" key="NSContents">7Zmc7ISx7ZmU65CY7JeI7J2EIOuVjCDruYTtmZzshLEg7JyI64+E7Jqw66W8IO2BtOumre2VmOuptCDr
-p4jsmrDsiqQg7YG066at7J20IOu5hO2ZnOyEsSDsnIjrj4TsmrDrpbwg7Ya16rO87ZWY7JesIO2ZnOyE
-se2ZlOuQnCDsnIjrj4TsmrDrpbwg7YG066at7ZWp64uI64ukLg</string>
+p4jsmrDsiqQg7YG066at7J20IOu5hO2ZnOyEsSDsnIjrj4TsmrDroZwg7Ya16rO865CgIOu/kOunjCDs
+lYTri4jrnbwg67mE7Zmc7ISxIOyciOuPhOyasOqwgCAg7Zmc7ISx7ZmU65Cp64uI64ukLg</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="290578835"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1128,8 +1127,8 @@ soPsnYAg7J2867aAIOyXreq4sOuKpeydhCDqsIDsp4Dqs6Ag7J6I7Iq164uI64ukLg</string>
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
 													<string type="base64-UTF8" key="NSContents">7Zmc7ISx7ZmU65CY7JeI7J2EIOuVjCDsg4jroZzsmrQgWDExIOyciOuPhOyasOulvCDsg53shLHtlZjr
-qbQoRmluZGVyLmFwcCDrsI8gVGVybWluYWwuYXBwIOuTsSDrjIDsi6ApIFgxMS5hcHDqsIAg66eoIOyV
-nuycvOuhnCDsnbTrj5nrkKnri4jri6QuA</string>
+qbQgKEZpbmRlci5hcHAg67CPIO2EsOuvuOuEkC5hcHAg65OxIOuMgOyLoCkgWDExLmFwcOydtCDrp6gg
+7JWe7Jy866GcIOydtOuPmeuQqeuLiOuLpC4</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="57161931"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1222,8 +1221,8 @@ nbQg7Jyg7Zqo7ZWY7KeAIOyViuqyjCDrkJjslrQgWDExIOydkeyaqSDtlITroZzqt7jrnqjsnbQg7Iuk
 												<object class="NSTextFieldCell" key="NSCell" id="390084685">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">7Zmc7ISx7ZmU65CY66m0LCDsi5zsiqTthZwg67O07JWI7J2EIO2ZleyduO2VmOq4sCDsnITtlbQg7J24
-7KadIOyXsOqysOuPhCDtmZzshLHtmZTrkJjslrTslbwg7ZWp64uI64ukLiDruYTtmZzshLHtmZTrkJjr
+													<string type="base64-UTF8" key="NSContents">7Zmc7ISx7ZmU65CY66m0LCDsi5zsiqTthZwg67O07JWI7J2EIO2ZleyduO2VmOq4sCDsnITtlbQg7Jew
+6rKwIOyduOymneuPhCDtmZzshLHtmZTrkJjslrTslbwg7ZWp64uI64ukLiDruYTtmZzshLHtmZTrkJjr
 qbQsIOybkOqyqSDsnZHsmqkg7ZSE66Gc6re4656oIOyXsOqysOydtCDtl4jsmqnrkJjsp4Ag7JWK7Iq1
 64uI64ukLg</string>
 													<reference key="NSSupport" ref="26"/>
@@ -1271,11 +1270,10 @@ i6QuA</string>
 						</object>
 					</object>
 					<string key="NSFrameSize">{484, 308}</string>
-					<reference key="NSSuperview"/>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1280, 938}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSFrameAutosaveName">x11_prefs</string>
 			</object>
 			<object class="NSWindowTemplate" id="604417141">
@@ -1288,7 +1286,7 @@ i6QuA</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="85544634">
 					<nil key="NSNextResponder"/>
@@ -1470,7 +1468,7 @@ i6QuA</string>
 															<int key="NSColorSpace">6</int>
 															<string key="NSCatalogName">System</string>
 															<string key="NSColorName">controlBackgroundColor</string>
-															<reference key="NSColor" ref="136819958"/>
+															<reference key="NSColor" ref="241249183"/>
 														</object>
 														<reference key="NSTextColor" ref="930815747"/>
 													</object>
@@ -1583,7 +1581,7 @@ i6QuA</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1280, 938}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSFrameAutosaveName">x11_apps</string>
 			</object>
 			<object class="NSMenu" id="294137138">
diff --git a/hw/xquartz/bundle/Resources/ko.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/ko.lproj/main.nib/keyedobjects.nib
index 310a9f4..1a91df7 100644
Binary files a/hw/xquartz/bundle/Resources/ko.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/ko.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/no.lproj/locversion.plist b/hw/xquartz/bundle/Resources/no.lproj/locversion.plist
index f647493..da81040 100644
--- a/hw/xquartz/bundle/Resources/no.lproj/locversion.plist
+++ b/hw/xquartz/bundle/Resources/no.lproj/locversion.plist
@@ -9,6 +9,6 @@
 	<key>LprojRevisionLevel</key>
 	<string>1</string>
 	<key>LprojVersion</key>
-	<string>73</string>
+	<string>83</string>
 </dict>
 </plist>
diff --git a/hw/xquartz/bundle/Resources/pl.lproj/locversion.plist b/hw/xquartz/bundle/Resources/pl.lproj/locversion.plist
index d24c813..233544b 100644
--- a/hw/xquartz/bundle/Resources/pl.lproj/locversion.plist
+++ b/hw/xquartz/bundle/Resources/pl.lproj/locversion.plist
@@ -9,6 +9,6 @@
 	<key>LprojRevisionLevel</key>
 	<string>1</string>
 	<key>LprojVersion</key>
-	<string>73</string>
+	<string>83</string>
 </dict>
 </plist>
diff --git a/hw/xquartz/bundle/Resources/pl.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/pl.lproj/main.nib/designable.nib
index 1d3d386..9e99f1c 100644
--- a/hw/xquartz/bundle/Resources/pl.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/pl.lproj/main.nib/designable.nib
@@ -1,11 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.05">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">9C31</string>
-		<string key="IBDocument.InterfaceBuilderVersion">677</string>
-		<string key="IBDocument.AppKitVersion">949.26</string>
-		<string key="IBDocument.HIToolboxVersion">352.00</string>
+		<string key="IBDocument.SystemVersion">10A222</string>
+		<string key="IBDocument.InterfaceBuilderVersion">708</string>
+		<string key="IBDocument.AppKitVersion">994.5</string>
+		<string key="IBDocument.HIToolboxVersion">404.00</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+			<string key="NS.object.0">708</string>
+		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
 		</object>
@@ -393,7 +397,7 @@
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="941366957">
 					<nil key="NSNextResponder"/>
@@ -428,7 +432,7 @@
 													<string key="NSContents">Emuluj mysz z trzema przyciskami</string>
 													<object class="NSFont" key="NSSupport" id="463863101">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">1044</int>
 													</object>
 													<reference key="NSControlView" ref="119157981"/>
@@ -460,7 +464,7 @@
 b2xpZG93YcSHIHogcHJvZ3JhbWFtaSBYMTEgdcW8eXdhasSFY3ltaSBtb2R5ZmlrYXRvcmEgTWV0YS4</string>
 													<object class="NSFont" key="NSSupport" id="26">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.100000e+01</double>
+														<double key="NSSize">11</double>
 														<int key="NSfFlags">3100</int>
 													</object>
 													<string key="NSPlaceholderString"/>
@@ -469,9 +473,9 @@ b2xpZG93YcSHIHogcHJvZ3JhbWFtaSBYMTEgdcW8eXdhasSFY3ltaSBtb2R5ZmlrYXRvcmEgTWV0YS4<
 														<int key="NSColorSpace">6</int>
 														<string key="NSCatalogName">System</string>
 														<string key="NSColorName">controlColor</string>
-														<object class="NSColor" key="NSColor" id="876771927">
+														<object class="NSColor" key="NSColor" id="905683795">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2NwA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -638,7 +642,7 @@ eSBkxbp3acSZa293ZS4</string>
 													<int key="NSButtonFlags2">1</int>
 													<object class="NSFont" key="NSAlternateImage">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">16</int>
 													</object>
 													<string key="NSAlternateContents"/>
@@ -705,6 +709,7 @@ eSBkxbp3acSZa293ZS4</string>
 																<reference key="NSTarget" ref="633115429"/>
 															</object>
 														</object>
+														<reference key="NSMenuFont" ref="463863101"/>
 													</object>
 													<int key="NSPreferredEdge">3</int>
 													<bool key="NSUsesItemFromMenu">YES</bool>
@@ -1209,10 +1214,10 @@ Lg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="390084685">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">R2R5IHfFgsSFY3pvbmUsIHcgY2VsdSB6YXBld25pZW5pYSBiZXpwaWVjemXFhHN0d2Egd8WCxIVjem9u
-YSBtdXNpIGJ5xIcgdGFrxbxlIG9wY2phIFV3aWVyenl0ZWxuaWFqIHBvxYLEhWN6ZW5pYS4gR2R5IHd5
-xYLEhWN6b25lLCBwb8WCxIVjemVuaWEgemUgemRhbG55Y2ggcHJvZ3JhbcOzdyBuaWUgc8SFIGRvendv
-bG9uZS4</string>
+													<string type="base64-UTF8" key="NSContents">R2R5IHBvbGUgamVzdCB6YXpuYWN6b25lLCBkbGEgYmV6cGllY3plxYRzdHdhIHfFgsSFY3pvbmEgbXVz
+aSBiecSHIHRha8W8ZSBvcGNqYSBVd2llcnp5dGVsbmlhaiBwb8WCxIVjemVuaWEuIEdkeSBwb2xlIG5p
+ZSBqZXN0IHphem5hY3pvbmUsIHBvxYLEhWN6ZW5pYSB6ZSB6ZGFsbnljaCBwcm9ncmFtw7N3IG5pZSBz
+xIUgZG96d29sb25lLg</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="363817195"/>
@@ -1260,7 +1265,7 @@ bG9uZS4</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSFrameAutosaveName">x11_prefs</string>
 			</object>
 			<object class="NSWindowTemplate" id="604417141">
@@ -1273,7 +1278,7 @@ bG9uZS4</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="85544634">
 					<nil key="NSNextResponder"/>
@@ -1358,9 +1363,9 @@ bG9uZS4</string>
 											<object class="NSMutableArray" key="NSTableColumns">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<object class="NSTableColumn" id="938444323">
-													<double key="NSWidth">1.227310e+02</double>
-													<double key="NSMinWidth">6.273100e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">122.73099999999999</double>
+													<double key="NSMinWidth">62.731000000000002</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
 														<int key="NSCellFlags">75628032</int>
 														<int key="NSCellFlags2">0</int>
@@ -1397,9 +1402,9 @@ bG9uZS4</string>
 													<string key="NSHeaderToolTip"/>
 												</object>
 												<object class="NSTableColumn" id="84282687">
-													<double key="NSWidth">1.000000e+02</double>
-													<double key="NSMinWidth">4.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">100</double>
+													<double key="NSMinWidth">40</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
 														<int key="NSCellFlags">75628032</int>
 														<int key="NSCellFlags2">0</int>
@@ -1425,9 +1430,9 @@ bG9uZS4</string>
 													<string key="NSHeaderToolTip"/>
 												</object>
 												<object class="NSTableColumn" id="242608782">
-													<double key="NSWidth">6.900000e+01</double>
-													<double key="NSMinWidth">1.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">69</double>
+													<double key="NSMinWidth">10</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
 														<int key="NSCellFlags">67239424</int>
 														<int key="NSCellFlags2">0</int>
@@ -1447,7 +1452,7 @@ bG9uZS4</string>
 														<string type="base64-UTF8" key="NSContents">S29tw7Nya2EgdGVrc3Rvd2E</string>
 														<object class="NSFont" key="NSSupport">
 															<string key="NSName">LucidaGrande</string>
-															<double key="NSSize">1.200000e+01</double>
+															<double key="NSSize">12</double>
 															<int key="NSfFlags">16</int>
 														</object>
 														<string key="NSPlaceholderString"/>
@@ -1457,7 +1462,7 @@ bG9uZS4</string>
 															<int key="NSColorSpace">6</int>
 															<string key="NSCatalogName">System</string>
 															<string key="NSColorName">controlBackgroundColor</string>
-															<reference key="NSColor" ref="876771927"/>
+															<reference key="NSColor" ref="905683795"/>
 														</object>
 														<reference key="NSTextColor" ref="930815747"/>
 													</object>
@@ -1468,8 +1473,8 @@ bG9uZS4</string>
 													<string key="NSHeaderToolTip"/>
 												</object>
 											</object>
-											<double key="NSIntercellSpacingWidth">3.000000e+00</double>
-											<double key="NSIntercellSpacingHeight">2.000000e+00</double>
+											<double key="NSIntercellSpacingWidth">3</double>
+											<double key="NSIntercellSpacingHeight">2</double>
 											<reference key="NSBackgroundColor" ref="822946413"/>
 											<object class="NSColor" key="NSGridColor">
 												<int key="NSColorSpace">6</int>
@@ -1480,8 +1485,10 @@ bG9uZS4</string>
 													<bytes key="NSWhite">MC41AA</bytes>
 												</object>
 											</object>
-											<double key="NSRowHeight">1.700000e+01</double>
+											<double key="NSRowHeight">17</double>
 											<int key="NSTvFlags">1379958784</int>
+											<reference key="NSDelegate"/>
+											<reference key="NSDataSource"/>
 											<int key="NSColumnAutoresizingStyle">1</int>
 											<int key="NSDraggingSourceMaskForLocal">-1</int>
 											<int key="NSDraggingSourceMaskForNonLocal">0</int>
@@ -1502,7 +1509,7 @@ bG9uZS4</string>
 									<reference key="NSSuperview" ref="1063387772"/>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">9.949238e-01</double>
+									<double key="NSPercent">0.99492380000000002</double>
 								</object>
 								<object class="NSScroller" id="17278747">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1512,7 +1519,7 @@ bG9uZS4</string>
 									<int key="NSsFlags">1</int>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">6.885246e-01</double>
+									<double key="NSPercent">0.68852460000000004</double>
 								</object>
 								<object class="NSClipView" id="672307654">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1569,7 +1576,7 @@ bG9uZS4</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSFrameAutosaveName">x11_apps</string>
 			</object>
 			<object class="NSMenu" id="294137138">
@@ -3317,11 +3324,8 @@ bG9uZS4</string>
 			</object>
 			<object class="NSMutableDictionary" key="flattenedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSMutableArray" key="dict.sortedKeys">
+				<object class="NSArray" key="dict.sortedKeys">
 					<bool key="EncodedWithXMLCoder">YES</bool>
-					<string>-1.IBPluginDependency</string>
-					<string>-2.IBPluginDependency</string>
-					<string>-3.IBPluginDependency</string>
 					<string>-3.ImportedFromIB2</string>
 					<string>100292.IBPluginDependency</string>
 					<string>100293.IBPluginDependency</string>
@@ -3378,7 +3382,6 @@ bG9uZS4</string>
 					<string>169.editorWindowContentRectSynchronizationRect</string>
 					<string>19.IBPluginDependency</string>
 					<string>19.ImportedFromIB2</string>
-					<string>196.IBPluginDependency</string>
 					<string>196.ImportedFromIB2</string>
 					<string>200295.IBPluginDependency</string>
 					<string>200295.IBShouldRemoveOnLegacySave</string>
@@ -3393,6 +3396,7 @@ bG9uZS4</string>
 					<string>24.ImportedFromIB2</string>
 					<string>24.editorWindowContentRectSynchronizationRect</string>
 					<string>244.IBEditorWindowLastContentRect</string>
+					<string>244.IBPluginDependency</string>
 					<string>244.IBPropertyAccessControl</string>
 					<string>244.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>244.IBWindowTemplateEditedContentRect</string>
@@ -3414,6 +3418,7 @@ bG9uZS4</string>
 					<string>272.IBPluginDependency</string>
 					<string>272.ImportedFromIB2</string>
 					<string>285.IBEditorWindowLastContentRect</string>
+					<string>285.IBPluginDependency</string>
 					<string>285.IBViewEditorWindowController.showingBoundsRectangles</string>
 					<string>285.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>285.IBWindowTemplateEditedContentRect</string>
@@ -3665,14 +3670,12 @@ bG9uZS4</string>
 				</object>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="1" id="9"/>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3690,324 +3693,324 @@ bG9uZS4</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3" id="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{168, 821}, {113, 23}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{202, 626}, {154, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{349, 858}, {315, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{271, 666}, {301, 153}}</string>
 					<string>{{437, 548}, {584, 308}}</string>
-					<reference ref="11"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="3"/>
 					<boolean value="NO"/>
 					<string>{{437, 548}, {584, 308}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{184, 290}, {481, 345}}</string>
-					<integer value="0" id="8"/>
-					<reference ref="9"/>
+					<integer value="0"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{58, 803}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{100, 746}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{68, 585}, {454, 271}}</string>
-					<reference ref="9"/>
-					<reference ref="9"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
+					<integer value="1"/>
 					<string>{{68, 585}, {454, 271}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{433, 406}, {486, 327}}</string>
-					<reference ref="8"/>
-					<reference ref="9"/>
+					<integer value="0"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{145, 836}, {333, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{67, 819}, {336, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>{{523, 716}, {155, 83}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{20, 641}, {218, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{79, 616}, {218, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 				</object>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
diff --git a/hw/xquartz/bundle/Resources/pl.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/pl.lproj/main.nib/keyedobjects.nib
index 2aecc44..363a2ac 100644
Binary files a/hw/xquartz/bundle/Resources/pl.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/pl.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/pt.lproj/locversion.plist b/hw/xquartz/bundle/Resources/pt.lproj/locversion.plist
index 1972524..d14c37b 100644
--- a/hw/xquartz/bundle/Resources/pt.lproj/locversion.plist
+++ b/hw/xquartz/bundle/Resources/pt.lproj/locversion.plist
@@ -9,6 +9,6 @@
 	<key>LprojRevisionLevel</key>
 	<string>1</string>
 	<key>LprojVersion</key>
-	<string>73</string>
+	<string>83</string>
 </dict>
 </plist>
diff --git a/hw/xquartz/bundle/Resources/pt.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/pt.lproj/main.nib/designable.nib
index 64cf2bd..42b40e4 100644
--- a/hw/xquartz/bundle/Resources/pt.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/pt.lproj/main.nib/designable.nib
@@ -450,7 +450,7 @@
 											<object class="NSTextField" id="443008216">
 												<reference key="NSNextResponder" ref="596750588"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{36, 67}, {559, 28}}</string>
+												<string key="NSFrame">{{36, 60}, {548, 31}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="391919450">
@@ -487,7 +487,7 @@
 											<object class="NSTextField" id="282885445">
 												<reference key="NSNextResponder" ref="596750588"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{36, 170}, {559, 37}}</string>
+												<string key="NSFrame">{{36, 162}, {548, 42}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="649334366">
@@ -506,7 +506,7 @@ ZS4KA</string>
 											<object class="NSButton" id="842100515">
 												<reference key="NSNextResponder" ref="596750588"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{18, 98}, {402, 18}}</string>
+												<string key="NSFrame">{{18, 97}, {402, 18}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="940564599">
@@ -528,7 +528,7 @@ ZS4KA</string>
 											<object class="NSTextField" id="31160162">
 												<reference key="NSNextResponder" ref="596750588"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{36, 118}, {525, 25}}</string>
+												<string key="NSFrame">{{36, 126}, {548, 14}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="666057093">
@@ -585,7 +585,7 @@ IG1hcGEgZG8gdGVjbGFkbyBhdHVhbCBkbyBYMTEuA</string>
 											<object class="NSButton" id="418227126">
 												<reference key="NSNextResponder" ref="515308735"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{18, 78}, {402, 18}}</string>
+												<string key="NSFrame">{{18, 70}, {402, 18}}</string>
 												<reference key="NSSuperview" ref="515308735"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="1016069354">
@@ -607,7 +607,7 @@ IG1hcGEgZG8gdGVjbGFkbyBhdHVhbCBkbyBYMTEuA</string>
 											<object class="NSTextField" id="1039016593">
 												<reference key="NSNextResponder" ref="515308735"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{36, 44}, {539, 28}}</string>
+												<string key="NSFrame">{{36, 36}, {548, 28}}</string>
 												<reference key="NSSuperview" ref="515308735"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="624655599">
@@ -715,7 +715,7 @@ cm9zLg</string>
 											<object class="NSTextField" id="201731424">
 												<reference key="NSNextResponder" ref="515308735"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{17, 205}, {50, 20}}</string>
+												<string key="NSFrame">{{17, 191}, {45, 34}}</string>
 												<reference key="NSSuperview" ref="515308735"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="930265681">
@@ -772,7 +772,7 @@ YW1lbnRlLg</string>
 											<object class="NSButton" id="57246850">
 												<reference key="NSNextResponder" ref="515308735"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{37, 98}, {409, 23}}</string>
+												<string key="NSFrame">{{37, 97}, {409, 23}}</string>
 												<reference key="NSSuperview" ref="515308735"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="917248662">
@@ -794,7 +794,7 @@ YW1lbnRlLg</string>
 											<object class="NSTextField" id="298603383">
 												<reference key="NSNextResponder" ref="515308735"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{36, 120}, {539, 23}}</string>
+												<string key="NSFrame">{{36, 126}, {548, 17}}</string>
 												<reference key="NSSuperview" ref="515308735"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="761107402">
@@ -850,7 +850,7 @@ YXJhIGRpZ2l0YXIgZSBzYWlyIGRvIG1vZG8gdGVsYSBjaGVpYS4</string>
 											<object class="NSTextField" id="386152084">
 												<reference key="NSNextResponder" ref="408298283"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{36, 188}, {536, 32}}</string>
+												<string key="NSFrame">{{36, 188}, {536, 28}}</string>
 												<reference key="NSSuperview" ref="408298283"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="572508492">
@@ -868,7 +868,7 @@ b3MgYnVmZmVycyBQUklOQ0lQQUlTIGRvIFgxMS4</string>
 											<object class="NSButton" id="477050998">
 												<reference key="NSNextResponder" ref="408298283"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{34, 107}, {511, 23}}</string>
+												<string key="NSFrame">{{37, 96}, {511, 23}}</string>
 												<reference key="NSSuperview" ref="408298283"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="501304422">
@@ -891,7 +891,7 @@ bSBmb3IgYWx0ZXJhZGEuA</string>
 											<object class="NSButton" id="765780304">
 												<reference key="NSNextResponder" ref="408298283"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{34, 87}, {501, 18}}</string>
+												<string key="NSFrame">{{37, 71}, {501, 23}}</string>
 												<reference key="NSSuperview" ref="408298283"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="510771323">
@@ -914,7 +914,7 @@ ZW0gZm9yIGFsdGVyYWRhLg</string>
 											<object class="NSButton" id="1002778833">
 												<reference key="NSNextResponder" ref="408298283"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{34, 62}, {553, 23}}</string>
+												<string key="NSFrame">{{37, 46}, {553, 23}}</string>
 												<reference key="NSSuperview" ref="408298283"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="897099877">
@@ -937,7 +937,7 @@ eHRvIGZvciBzZWxlY2lvbmFkby4</string>
 											<object class="NSButton" id="487809555">
 												<reference key="NSNextResponder" ref="408298283"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{34, 165}, {511, 23}}</string>
+												<string key="NSFrame">{{37, 159}, {511, 23}}</string>
 												<reference key="NSSuperview" ref="408298283"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="619977658">
@@ -960,7 +960,7 @@ QSBmb3IgYWx0ZXJhZGEuA</string>
 											<object class="NSTextField" id="620944856">
 												<reference key="NSNextResponder" ref="408298283"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{48, 134}, {524, 28}}</string>
+												<string key="NSFrame">{{55, 125}, {529, 28}}</string>
 												<reference key="NSSuperview" ref="408298283"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="461823902">
@@ -978,7 +978,7 @@ YSBkbyBYMTEuA</string>
 											<object class="NSTextField" id="522511724">
 												<reference key="NSNextResponder" ref="408298283"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{48, 28}, {536, 28}}</string>
+												<string key="NSFrame">{{55, 14}, {526, 28}}</string>
 												<reference key="NSSuperview" ref="408298283"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="994587858">
@@ -1011,7 +1011,7 @@ o28gbmVtIHNlbXByZSBmdW5jaW9uZSBlbSBhbGd1bnMgYXBsaWNhdGl2b3MuA</string>
 											<object class="NSButton" id="657659108">
 												<reference key="NSNextResponder" ref="184765684"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{15, 212}, {402, 18}}</string>
+												<string key="NSFrame">{{18, 212}, {402, 18}}</string>
 												<reference key="NSSuperview" ref="184765684"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="259618205">
@@ -1033,7 +1033,7 @@ o28gbmVtIHNlbXByZSBmdW5jaW9uZSBlbSBhbGd1bnMgYXBsaWNhdGl2b3MuA</string>
 											<object class="NSTextField" id="290578835">
 												<reference key="NSNextResponder" ref="184765684"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{31, 175}, {542, 31}}</string>
+												<string key="NSFrame">{{36, 175}, {542, 31}}</string>
 												<reference key="NSSuperview" ref="184765684"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="399127858">
@@ -1051,7 +1051,7 @@ ZG8gcGFyYSBlc3NhIGphbmVsYSwgYSBxdWFsIHRhbWLDqW0gw6kgYXRpdmFkYS4</string>
 											<object class="NSButton" id="992839333">
 												<reference key="NSNextResponder" ref="184765684"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{15, 151}, {402, 18}}</string>
+												<string key="NSFrame">{{18, 151}, {402, 18}}</string>
 												<reference key="NSSuperview" ref="184765684"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="959555182">
@@ -1073,7 +1073,7 @@ ZG8gcGFyYSBlc3NhIGphbmVsYSwgYSBxdWFsIHRhbWLDqW0gw6kgYXRpdmFkYS4</string>
 											<object class="NSTextField" id="138261120">
 												<reference key="NSNextResponder" ref="184765684"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{31, 126}, {441, 21}}</string>
+												<string key="NSFrame">{{36, 128}, {441, 17}}</string>
 												<reference key="NSSuperview" ref="184765684"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="183409141">
@@ -1090,7 +1090,7 @@ dW5zIGluY29udmVuaWVudGVzLg</string>
 											<object class="NSButton" id="128352289">
 												<reference key="NSNextResponder" ref="184765684"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{15, 107}, {402, 18}}</string>
+												<string key="NSFrame">{{18, 107}, {402, 18}}</string>
 												<reference key="NSSuperview" ref="184765684"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="556463187">
@@ -1112,7 +1112,7 @@ dW5zIGluY29udmVuaWVudGVzLg</string>
 											<object class="NSTextField" id="57161931">
 												<reference key="NSNextResponder" ref="184765684"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{31, 59}, {542, 42}}</string>
+												<string key="NSFrame">{{36, 73}, {542, 28}}</string>
 												<reference key="NSSuperview" ref="184765684"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="989804990">
diff --git a/hw/xquartz/bundle/Resources/pt.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/pt.lproj/main.nib/keyedobjects.nib
index 7129958..ed121ed 100644
Binary files a/hw/xquartz/bundle/Resources/pt.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/pt.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/pt_PT.lproj/locversion.plist b/hw/xquartz/bundle/Resources/pt_PT.lproj/locversion.plist
index 3e2a0f4..4910e40 100644
--- a/hw/xquartz/bundle/Resources/pt_PT.lproj/locversion.plist
+++ b/hw/xquartz/bundle/Resources/pt_PT.lproj/locversion.plist
@@ -9,6 +9,6 @@
 	<key>LprojRevisionLevel</key>
 	<string>1</string>
 	<key>LprojVersion</key>
-	<string>73</string>
+	<string>83</string>
 </dict>
 </plist>
diff --git a/hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/designable.nib
index fdf839e..1bab3a8 100644
--- a/hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/designable.nib
@@ -1,17 +1,26 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.01">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">9C31</string>
-		<string key="IBDocument.InterfaceBuilderVersion">629</string>
-		<string key="IBDocument.AppKitVersion">949.26</string>
-		<string key="IBDocument.HIToolboxVersion">352.00</string>
+		<string key="IBDocument.SystemVersion">9G55</string>
+		<string key="IBDocument.InterfaceBuilderVersion">677.1</string>
+		<string key="IBDocument.AppKitVersion">949.43</string>
+		<string key="IBDocument.HIToolboxVersion">353.00</string>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
 		</object>
 		<object class="NSArray" key="IBDocument.PluginDependencies">
 			<bool key="EncodedWithXMLCoder">YES</bool>
-			<string id="1364">com.apple.InterfaceBuilder.CocoaPlugin</string>
+			<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+		</object>
+		<object class="NSMutableDictionary" key="IBDocument.Metadata">
+			<bool key="EncodedWithXMLCoder">YES</bool>
+			<object class="NSArray" key="dict.sortedKeys">
+				<bool key="EncodedWithXMLCoder">YES</bool>
+			</object>
+			<object class="NSMutableArray" key="dict.values">
+				<bool key="EncodedWithXMLCoder">YES</bool>
+			</object>
 		</object>
 		<object class="NSMutableArray" key="IBDocument.RootObjects" id="904585544">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -21,41 +30,41 @@
 				</object>
 			</object>
 			<object class="NSCustomObject" id="941939442">
-				<string key="NSClassName" id="766348603">FirstResponder</string>
+				<string key="NSClassName">FirstResponder</string>
 			</object>
 			<object class="NSCustomObject" id="951368722">
 				<string key="NSClassName">NSApplication</string>
 			</object>
 			<object class="NSMenu" id="524015605">
-				<string key="NSTitle" id="466365863">MainMenu</string>
+				<string key="NSTitle">MainMenu</string>
 				<object class="NSMutableArray" key="NSMenuItems">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="NSMenuItem" id="365880285">
 						<reference key="NSMenu" ref="524015605"/>
-						<string key="NSTitle" id="952081941">X11</string>
-						<string key="NSKeyEquiv" id="110719282"/>
+						<string key="NSTitle">X11</string>
+						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
 						<object class="NSCustomResource" key="NSOnImage" id="1023398665">
-							<string key="NSClassName" id="666920679">NSImage</string>
+							<string key="NSClassName">NSImage</string>
 							<string key="NSResourceName">NSMenuCheckmark</string>
 						</object>
-						<object class="NSCustomResource" key="NSMixedImage" id="1029568114">
-							<reference key="NSClassName" ref="666920679"/>
+						<object class="NSCustomResource" key="NSMixedImage" id="833942997">
+							<string key="NSClassName">NSImage</string>
 							<string key="NSResourceName">NSMenuMixedState</string>
 						</object>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="576521955">
-							<reference key="NSTitle" ref="952081941"/>
+							<string key="NSTitle">X11</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="139290918">
 									<reference key="NSMenu" ref="576521955"/>
 									<string key="NSTitle">Acerca do X11</string>
-									<reference key="NSKeyEquiv" ref="110719282"/>
+									<string key="NSKeyEquiv"/>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 								<object class="NSMenuItem" id="386173216">
 									<reference key="NSMenu" ref="576521955"/>
@@ -64,30 +73,30 @@
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 								<object class="NSMenuItem" id="272876017">
 									<reference key="NSMenu" ref="576521955"/>
 									<bool key="NSIsDisabled">YES</bool>
 									<bool key="NSIsSeparator">YES</bool>
-									<reference key="NSTitle" ref="110719282"/>
-									<reference key="NSKeyEquiv" ref="110719282"/>
+									<string key="NSTitle"/>
+									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 								<object class="NSMenuItem" id="32285361">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle" id="1019326610">U2VydmnDp29zA</string>
-									<reference key="NSKeyEquiv" ref="110719282"/>
+									<string type="base64-UTF8" key="NSTitle">U2VydmnDp29zA</string>
+									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 									<string key="NSAction">submenuAction:</string>
 									<object class="NSMenu" key="NSSubmenu" id="821388474">
-										<reference key="NSTitle" ref="1019326610"/>
+										<string type="base64-UTF8" key="NSTitle">U2VydmnDp29zA</string>
 										<object class="NSMutableArray" key="NSMenuItems">
 											<bool key="EncodedWithXMLCoder">YES</bool>
 										</object>
@@ -98,12 +107,12 @@
 									<reference key="NSMenu" ref="576521955"/>
 									<bool key="NSIsDisabled">YES</bool>
 									<bool key="NSIsSeparator">YES</bool>
-									<reference key="NSTitle" ref="110719282"/>
-									<reference key="NSKeyEquiv" ref="110719282"/>
+									<string key="NSTitle"/>
+									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 								<object class="NSMenuItem" id="6876565">
 									<reference key="NSMenu" ref="576521955"/>
@@ -112,58 +121,58 @@
 									<int key="NSKeyEquivModMask">1572864</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 								<object class="NSMenuItem" id="479677589">
 									<reference key="NSMenu" ref="576521955"/>
 									<bool key="NSIsDisabled">YES</bool>
 									<bool key="NSIsSeparator">YES</bool>
-									<reference key="NSTitle" ref="110719282"/>
-									<reference key="NSKeyEquiv" ref="110719282"/>
+									<string key="NSTitle"/>
+									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 								<object class="NSMenuItem" id="301008465">
 									<reference key="NSMenu" ref="576521955"/>
 									<string key="NSTitle">Ocultar o X11</string>
-									<string key="NSKeyEquiv" id="793014670">h</string>
+									<string key="NSKeyEquiv">h</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 									<int key="NSTag">42</int>
 								</object>
 								<object class="NSMenuItem" id="206802571">
 									<reference key="NSMenu" ref="576521955"/>
 									<string type="base64-UTF8" key="NSTitle">T2N1bHRhciBvdXRyYXMgYXBsaWNhw6fDtWVzA</string>
-									<reference key="NSKeyEquiv" ref="793014670"/>
+									<string key="NSKeyEquiv">h</string>
 									<int key="NSKeyEquivModMask">1572864</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 								<object class="NSMenuItem" id="1023546148">
 									<reference key="NSMenu" ref="576521955"/>
 									<string key="NSTitle">Mostrar tudo</string>
-									<reference key="NSKeyEquiv" ref="110719282"/>
+									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 									<int key="NSTag">42</int>
 								</object>
 								<object class="NSMenuItem" id="848095279">
 									<reference key="NSMenu" ref="576521955"/>
 									<bool key="NSIsDisabled">YES</bool>
 									<bool key="NSIsSeparator">YES</bool>
-									<reference key="NSTitle" ref="110719282"/>
-									<reference key="NSKeyEquiv" ref="110719282"/>
+									<string key="NSTitle"/>
+									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 								<object class="NSMenuItem" id="274138642">
 									<reference key="NSMenu" ref="576521955"/>
@@ -172,7 +181,7 @@
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 							</object>
 							<string key="NSName">_NSAppleMenu</string>
@@ -180,51 +189,51 @@
 					</object>
 					<object class="NSMenuItem" id="868031522">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle" id="486152235">QXBsaWNhw6fDtWVzA</string>
-						<reference key="NSKeyEquiv" ref="110719282"/>
+						<string type="base64-UTF8" key="NSTitle">QXBsaWNhw6fDtWVzA</string>
+						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
 						<reference key="NSOnImage" ref="1023398665"/>
-						<reference key="NSMixedImage" ref="1029568114"/>
+						<reference key="NSMixedImage" ref="833942997"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="981161348">
-							<reference key="NSTitle" ref="486152235"/>
+							<string type="base64-UTF8" key="NSTitle">QXBsaWNhw6fDtWVzA</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="390088328">
 									<reference key="NSMenu" ref="981161348"/>
 									<bool key="NSIsDisabled">YES</bool>
 									<bool key="NSIsSeparator">YES</bool>
-									<reference key="NSTitle" ref="110719282"/>
-									<reference key="NSKeyEquiv" ref="110719282"/>
+									<string key="NSTitle"/>
+									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 								<object class="NSMenuItem" id="1065386165">
 									<reference key="NSMenu" ref="981161348"/>
 									<string key="NSTitle">Personalizar...</string>
-									<reference key="NSKeyEquiv" ref="110719282"/>
+									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 							</object>
 						</object>
 					</object>
 					<object class="NSMenuItem" id="200491363">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle" id="587308713">RWRpw6fDo28</string>
-						<reference key="NSKeyEquiv" ref="110719282"/>
+						<string type="base64-UTF8" key="NSTitle">RWRpw6fDo28</string>
+						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
 						<reference key="NSOnImage" ref="1023398665"/>
-						<reference key="NSMixedImage" ref="1029568114"/>
+						<reference key="NSMixedImage" ref="833942997"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="526778998">
-							<reference key="NSTitle" ref="587308713"/>
+							<string type="base64-UTF8" key="NSTitle">RWRpw6fDo28</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="185296989">
@@ -234,22 +243,22 @@
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 							</object>
 						</object>
 					</object>
 					<object class="NSMenuItem" id="931553638">
 						<reference key="NSMenu" ref="524015605"/>
-						<string key="NSTitle" id="901667960">Janela</string>
-						<reference key="NSKeyEquiv" ref="110719282"/>
+						<string key="NSTitle">Janela</string>
+						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
 						<reference key="NSOnImage" ref="1023398665"/>
-						<reference key="NSMixedImage" ref="1029568114"/>
+						<reference key="NSMixedImage" ref="833942997"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="96874957">
-							<reference key="NSTitle" ref="901667960"/>
+							<string key="NSTitle">Janela</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="984461797">
@@ -259,7 +268,7 @@
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 								<object class="NSMenuItem" id="677652931">
 									<reference key="NSMenu" ref="96874957"/>
@@ -268,27 +277,27 @@
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 								<object class="NSMenuItem" id="1066447520">
 									<reference key="NSMenu" ref="96874957"/>
 									<string key="NSTitle">Zoom</string>
-									<reference key="NSKeyEquiv" ref="110719282"/>
+									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 								<object class="NSMenuItem" id="280172320">
 									<reference key="NSMenu" ref="96874957"/>
 									<bool key="NSIsDisabled">YES</bool>
 									<bool key="NSIsSeparator">YES</bool>
-									<reference key="NSTitle" ref="110719282"/>
-									<reference key="NSKeyEquiv" ref="110719282"/>
+									<string key="NSTitle"/>
+									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 								<object class="NSMenuItem" id="1036389925">
 									<reference key="NSMenu" ref="96874957"/>
@@ -297,7 +306,7 @@
 									<int key="NSKeyEquivModMask">1048840</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 								<object class="NSMenuItem" id="369641893">
 									<reference key="NSMenu" ref="96874957"/>
@@ -306,38 +315,38 @@
 									<int key="NSKeyEquivModMask">1179914</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 								<object class="NSMenuItem" id="155085383">
 									<reference key="NSMenu" ref="96874957"/>
 									<bool key="NSIsDisabled">YES</bool>
 									<bool key="NSIsSeparator">YES</bool>
-									<reference key="NSTitle" ref="110719282"/>
-									<reference key="NSKeyEquiv" ref="110719282"/>
+									<string key="NSTitle"/>
+									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 								<object class="NSMenuItem" id="276216762">
 									<reference key="NSMenu" ref="96874957"/>
 									<string key="NSTitle">Passar tudo para a frente</string>
-									<reference key="NSKeyEquiv" ref="110719282"/>
+									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 								<object class="NSMenuItem" id="444952046">
 									<reference key="NSMenu" ref="96874957"/>
 									<bool key="NSIsDisabled">YES</bool>
 									<bool key="NSIsSeparator">YES</bool>
-									<reference key="NSTitle" ref="110719282"/>
-									<reference key="NSKeyEquiv" ref="110719282"/>
+									<string key="NSTitle"/>
+									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 							</object>
 							<string key="NSName">_NSWindowsMenu</string>
@@ -345,25 +354,25 @@
 					</object>
 					<object class="NSMenuItem" id="551174276">
 						<reference key="NSMenu" ref="524015605"/>
-						<string key="NSTitle" id="193506328">Ajuda</string>
-						<reference key="NSKeyEquiv" ref="110719282"/>
+						<string key="NSTitle">Ajuda</string>
+						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
 						<reference key="NSOnImage" ref="1023398665"/>
-						<reference key="NSMixedImage" ref="1029568114"/>
+						<reference key="NSMixedImage" ref="833942997"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="511848303">
-							<reference key="NSTitle" ref="193506328"/>
+							<string key="NSTitle">Ajuda</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="504984881">
 									<reference key="NSMenu" ref="511848303"/>
 									<string key="NSTitle">Ajuda do X11</string>
-									<reference key="NSKeyEquiv" ref="110719282"/>
+									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 							</object>
 						</object>
@@ -372,7 +381,7 @@
 				<string key="NSName">_NSMainMenu</string>
 			</object>
 			<object class="NSCustomObject" id="485884620">
-				<string key="NSClassName" id="66570722">X11Controller</string>
+				<string key="NSClassName">X11Controller</string>
 			</object>
 			<object class="NSWindowTemplate" id="124913468">
 				<int key="NSWindowStyleMask">3</int>
@@ -380,10 +389,11 @@
 				<string key="NSWindowRect">{{319, 328}, {633, 308}}</string>
 				<int key="NSWTFlags">1350041600</int>
 				<string type="base64-UTF8" key="NSWindowTitle">UHJlZmVyw6puY2lhcyBkbyBYMTE</string>
-				<string key="NSWindowClass" id="226149994">NSPanel</string>
+				<string key="NSWindowClass">NSPanel</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
+				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="941366957">
 					<nil key="NSNextResponder"/>
@@ -393,177 +403,173 @@
 						<object class="NSTabView" id="448510093">
 							<reference key="NSNextResponder" ref="941366957"/>
 							<int key="NSvFlags">256</int>
-							<object class="NSMutableArray" key="NSSubviews">
+							<string key="NSFrame">{{13, 10}, {607, 292}}</string>
+							<reference key="NSSuperview" ref="941366957"/>
+							<object class="NSMutableArray" key="NSTabViewItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
-								<object class="NSView" id="596750588">
-									<reference key="NSNextResponder" ref="448510093"/>
-									<int key="NSvFlags">256</int>
-									<object class="NSMutableArray" key="NSSubviews">
-										<bool key="EncodedWithXMLCoder">YES</bool>
-										<object class="NSButton" id="119157981">
-											<reference key="NSNextResponder" ref="596750588"/>
-											<int key="NSvFlags">256</int>
-											<string key="NSFrame">{{18, 210}, {402, 18}}</string>
-											<reference key="NSSuperview" ref="596750588"/>
-											<bool key="NSEnabled">YES</bool>
-											<object class="NSButtonCell" key="NSCell" id="990762273">
-												<int key="NSCellFlags">67239424</int>
-												<int key="NSCellFlags2">0</int>
-												<string type="base64-UTF8" key="NSContents">U2ltdWxhciByYXRvIGRlIHRyw6pzIGJvdMO1ZXM</string>
-												<object class="NSFont" key="NSSupport" id="463863101">
-													<string key="NSName" id="751126524">LucidaGrande</string>
-													<double key="NSSize">1.300000e+01</double>
-													<int key="NSfFlags">1044</int>
-												</object>
-												<reference key="NSControlView" ref="119157981"/>
-												<int key="NSButtonFlags">1211912703</int>
-												<int key="NSButtonFlags2">2</int>
-												<object class="NSCustomResource" key="NSNormalImage" id="750009521">
-													<reference key="NSClassName" ref="666920679"/>
-													<string key="NSResourceName">NSSwitch</string>
-												</object>
-												<object class="NSButtonImageSource" key="NSAlternateImage" id="391434389">
-													<string key="NSImageName">NSSwitch</string>
+								<object class="NSTabViewItem" id="287591690">
+									<object class="NSMutableString" key="NSIdentifier">
+										<characters key="NS.bytes">1</characters>
+									</object>
+									<object class="NSView" key="NSView" id="596750588">
+										<reference key="NSNextResponder" ref="448510093"/>
+										<int key="NSvFlags">256</int>
+										<object class="NSMutableArray" key="NSSubviews">
+											<bool key="EncodedWithXMLCoder">YES</bool>
+											<object class="NSButton" id="119157981">
+												<reference key="NSNextResponder" ref="596750588"/>
+												<int key="NSvFlags">256</int>
+												<string key="NSFrame">{{18, 210}, {402, 18}}</string>
+												<reference key="NSSuperview" ref="596750588"/>
+												<bool key="NSEnabled">YES</bool>
+												<object class="NSButtonCell" key="NSCell" id="990762273">
+													<int key="NSCellFlags">67239424</int>
+													<int key="NSCellFlags2">0</int>
+													<string type="base64-UTF8" key="NSContents">U2ltdWxhciByYXRvIGRlIHRyw6pzIGJvdMO1ZXM</string>
+													<object class="NSFont" key="NSSupport" id="463863101">
+														<string key="NSName">LucidaGrande</string>
+														<double key="NSSize">1.300000e+01</double>
+														<int key="NSfFlags">1044</int>
+													</object>
+													<reference key="NSControlView" ref="119157981"/>
+													<int key="NSButtonFlags">1211912703</int>
+													<int key="NSButtonFlags2">2</int>
+													<object class="NSCustomResource" key="NSNormalImage" id="1057915638">
+														<string key="NSClassName">NSImage</string>
+														<string key="NSResourceName">NSSwitch</string>
+													</object>
+													<object class="NSButtonImageSource" key="NSAlternateImage" id="391434389">
+														<string key="NSImageName">NSSwitch</string>
+													</object>
+													<string key="NSAlternateContents"/>
+													<string key="NSKeyEquivalent"/>
+													<int key="NSPeriodicDelay">200</int>
+													<int key="NSPeriodicInterval">25</int>
 												</object>
-												<reference key="NSAlternateContents" ref="110719282"/>
-												<reference key="NSKeyEquivalent" ref="110719282"/>
-												<int key="NSPeriodicDelay">200</int>
-												<int key="NSPeriodicInterval">25</int>
 											</object>
-										</object>
-										<object class="NSTextField" id="443008216">
-											<reference key="NSNextResponder" ref="596750588"/>
-											<int key="NSvFlags">256</int>
-											<string key="NSFrame">{{36, 57}, {510, 28}}</string>
-											<reference key="NSSuperview" ref="596750588"/>
-											<bool key="NSEnabled">YES</bool>
-											<object class="NSTextFieldCell" key="NSCell" id="391919450">
-												<int key="NSCellFlags">67239424</int>
-												<int key="NSCellFlags2">4194304</int>
-												<string type="base64-UTF8" key="NSContents">U2UgZXN0aXZlcmVtIGFjdGl2YXMsIGFzIHRlY2xhcyBlcXVpdmFsZW50ZXMgZGEgYmFycmEgZGUgbWVu
+											<object class="NSTextField" id="443008216">
+												<reference key="NSNextResponder" ref="596750588"/>
+												<int key="NSvFlags">256</int>
+												<string key="NSFrame">{{36, 57}, {510, 28}}</string>
+												<reference key="NSSuperview" ref="596750588"/>
+												<bool key="NSEnabled">YES</bool>
+												<object class="NSTextFieldCell" key="NSCell" id="391919450">
+													<int key="NSCellFlags">67239424</int>
+													<int key="NSCellFlags2">4194304</int>
+													<string type="base64-UTF8" key="NSContents">U2UgZXN0aXZlcmVtIGFjdGl2YXMsIGFzIHRlY2xhcyBlcXVpdmFsZW50ZXMgZGEgYmFycmEgZGUgbWVu
 dXMgcG9kZW0gaW50ZXJmZXJpciBuYXMgYXBsaWNhw6fDtWVzIFgxMSBxdWUgdXRpbGl6YW0gbyBtb2Rp
 ZmljYWRvciBNZXRhLg</string>
-												<object class="NSFont" key="NSSupport" id="26">
-													<reference key="NSName" ref="751126524"/>
-													<double key="NSSize">1.100000e+01</double>
-													<int key="NSfFlags">3100</int>
-												</object>
-												<reference key="NSPlaceholderString" ref="110719282"/>
-												<reference key="NSControlView" ref="443008216"/>
-												<object class="NSColor" key="NSBackgroundColor" id="57160303">
-													<int key="NSColorSpace">6</int>
-													<string key="NSCatalogName" id="971051604">System</string>
-													<string key="NSColorName">controlColor</string>
-													<object class="NSColor" key="NSColor" id="854255273">
-														<int key="NSColorSpace">3</int>
-														<bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+													<object class="NSFont" key="NSSupport" id="26">
+														<string key="NSName">LucidaGrande</string>
+														<double key="NSSize">1.100000e+01</double>
+														<int key="NSfFlags">3100</int>
 													</object>
-												</object>
-												<object class="NSColor" key="NSTextColor" id="930815747">
-													<int key="NSColorSpace">6</int>
-													<reference key="NSCatalogName" ref="971051604"/>
-													<string key="NSColorName">controlTextColor</string>
-													<object class="NSColor" key="NSColor" id="214098874">
-														<int key="NSColorSpace">3</int>
-														<bytes key="NSWhite">MAA</bytes>
+													<string key="NSPlaceholderString"/>
+													<reference key="NSControlView" ref="443008216"/>
+													<object class="NSColor" key="NSBackgroundColor" id="57160303">
+														<int key="NSColorSpace">6</int>
+														<string key="NSCatalogName">System</string>
+														<string key="NSColorName">controlColor</string>
+														<object class="NSColor" key="NSColor" id="854255273">
+															<int key="NSColorSpace">3</int>
+															<bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+														</object>
+													</object>
+													<object class="NSColor" key="NSTextColor" id="930815747">
+														<int key="NSColorSpace">6</int>
+														<string key="NSCatalogName">System</string>
+														<string key="NSColorName">controlTextColor</string>
+														<object class="NSColor" key="NSColor" id="214098874">
+															<int key="NSColorSpace">3</int>
+															<bytes key="NSWhite">MAA</bytes>
+														</object>
 													</object>
 												</object>
 											</object>
-										</object>
-										<object class="NSTextField" id="282885445">
-											<reference key="NSNextResponder" ref="596750588"/>
-											<int key="NSvFlags">256</int>
-											<string key="NSFrame">{{36, 165}, {510, 39}}</string>
-											<reference key="NSSuperview" ref="596750588"/>
-											<bool key="NSEnabled">YES</bool>
-											<object class="NSTextFieldCell" key="NSCell" id="649334366">
-												<int key="NSCellFlags">67239424</int>
-												<int key="NSCellFlags2">4194304</int>
-												<string type="base64-UTF8" key="NSContents">QW8gY2xpY2FyLCBtYW50ZW5oYSBwcmVtaWRhcyBhcyB0ZWNsYXMgT3DDp8OjbyBvdSBDb21hbmRvIHBh
+											<object class="NSTextField" id="282885445">
+												<reference key="NSNextResponder" ref="596750588"/>
+												<int key="NSvFlags">256</int>
+												<string key="NSFrame">{{36, 162}, {510, 42}}</string>
+												<reference key="NSSuperview" ref="596750588"/>
+												<bool key="NSEnabled">YES</bool>
+												<object class="NSTextFieldCell" key="NSCell" id="649334366">
+													<int key="NSCellFlags">67239424</int>
+													<int key="NSCellFlags2">4194304</int>
+													<string type="base64-UTF8" key="NSContents">QW8gY2xpY2FyLCBtYW50ZW5oYSBwcmVtaWRhcyBhcyB0ZWNsYXMgT3DDp8OjbyBvdSBDb21hbmRvIHBh
 cmEgYWN0aXZhciBvcyBib3TDtWVzIGNlbnRyYWwgb3UgZGlyZWl0byBkbyByYXRvLgo</string>
-												<reference key="NSSupport" ref="26"/>
-												<reference key="NSPlaceholderString" ref="110719282"/>
-												<reference key="NSControlView" ref="282885445"/>
-												<reference key="NSBackgroundColor" ref="57160303"/>
-												<reference key="NSTextColor" ref="930815747"/>
+													<reference key="NSSupport" ref="26"/>
+													<string key="NSPlaceholderString"/>
+													<reference key="NSControlView" ref="282885445"/>
+													<reference key="NSBackgroundColor" ref="57160303"/>
+													<reference key="NSTextColor" ref="930815747"/>
+												</object>
 											</object>
-										</object>
-										<object class="NSButton" id="842100515">
-											<reference key="NSNextResponder" ref="596750588"/>
-											<int key="NSvFlags">256</int>
-											<string key="NSFrame">{{18, 91}, {402, 18}}</string>
-											<reference key="NSSuperview" ref="596750588"/>
-											<bool key="NSEnabled">YES</bool>
-											<object class="NSButtonCell" key="NSCell" id="940564599">
-												<int key="NSCellFlags">67239424</int>
-												<int key="NSCellFlags2">0</int>
-												<string type="base64-UTF8" key="NSContents">QWN0aXZhciBhcyBlcXVpdmFsw6puY2lhcyBkZSB0ZWNsYWRvIHBhcmEgWDExA</string>
-												<reference key="NSSupport" ref="463863101"/>
-												<reference key="NSControlView" ref="842100515"/>
-												<int key="NSButtonFlags">1211912703</int>
-												<int key="NSButtonFlags2">2</int>
-												<reference key="NSNormalImage" ref="750009521"/>
-												<reference key="NSAlternateImage" ref="391434389"/>
-												<reference key="NSAlternateContents" ref="110719282"/>
-												<reference key="NSKeyEquivalent" ref="110719282"/>
-												<int key="NSPeriodicDelay">200</int>
-												<int key="NSPeriodicInterval">25</int>
+											<object class="NSButton" id="842100515">
+												<reference key="NSNextResponder" ref="596750588"/>
+												<int key="NSvFlags">256</int>
+												<string key="NSFrame">{{18, 91}, {402, 18}}</string>
+												<reference key="NSSuperview" ref="596750588"/>
+												<bool key="NSEnabled">YES</bool>
+												<object class="NSButtonCell" key="NSCell" id="940564599">
+													<int key="NSCellFlags">67239424</int>
+													<int key="NSCellFlags2">0</int>
+													<string type="base64-UTF8" key="NSContents">QWN0aXZhciBhcyBlcXVpdmFsw6puY2lhcyBkZSB0ZWNsYWRvIHBhcmEgWDExA</string>
+													<reference key="NSSupport" ref="463863101"/>
+													<reference key="NSControlView" ref="842100515"/>
+													<int key="NSButtonFlags">1211912703</int>
+													<int key="NSButtonFlags2">2</int>
+													<reference key="NSNormalImage" ref="1057915638"/>
+													<reference key="NSAlternateImage" ref="391434389"/>
+													<string key="NSAlternateContents"/>
+													<string key="NSKeyEquivalent"/>
+													<int key="NSPeriodicDelay">200</int>
+													<int key="NSPeriodicInterval">25</int>
+												</object>
 											</object>
-										</object>
-										<object class="NSTextField" id="31160162">
-											<reference key="NSNextResponder" ref="596750588"/>
-											<int key="NSvFlags">256</int>
-											<string key="NSFrame">{{36, 121}, {510, 19}}</string>
-											<reference key="NSSuperview" ref="596750588"/>
-											<bool key="NSEnabled">YES</bool>
-											<object class="NSTextFieldCell" key="NSCell" id="666057093">
-												<int key="NSCellFlags">67239424</int>
-												<int key="NSCellFlags2">4194304</int>
-												<string type="base64-UTF8" key="NSContents">UGVybWl0ZSBxdWUgYWx0ZXJhw6fDtWVzIGRvIG1lbnUgZGUgZW50cmFkYSBzZSBzb2JyZXBvbmhhbSBh
+											<object class="NSTextField" id="31160162">
+												<reference key="NSNextResponder" ref="596750588"/>
+												<int key="NSvFlags">256</int>
+												<string key="NSFrame">{{36, 121}, {510, 19}}</string>
+												<reference key="NSSuperview" ref="596750588"/>
+												<bool key="NSEnabled">YES</bool>
+												<object class="NSTextFieldCell" key="NSCell" id="666057093">
+													<int key="NSCellFlags">67239424</int>
+													<int key="NSCellFlags2">4194304</int>
+													<string type="base64-UTF8" key="NSContents">UGVybWl0ZSBxdWUgYWx0ZXJhw6fDtWVzIGRvIG1lbnUgZGUgZW50cmFkYSBzZSBzb2JyZXBvbmhhbSBh
 byBhY3R1YWwgbWFwYSBkZSB0ZWNsYXMgZG8gWDExLg</string>
-												<reference key="NSSupport" ref="26"/>
-												<reference key="NSPlaceholderString" ref="110719282"/>
-												<reference key="NSControlView" ref="31160162"/>
-												<reference key="NSBackgroundColor" ref="57160303"/>
-												<reference key="NSTextColor" ref="930815747"/>
+													<reference key="NSSupport" ref="26"/>
+													<string key="NSPlaceholderString"/>
+													<reference key="NSControlView" ref="31160162"/>
+													<reference key="NSBackgroundColor" ref="57160303"/>
+													<reference key="NSTextColor" ref="930815747"/>
+												</object>
 											</object>
-										</object>
-										<object class="NSButton" id="179949713">
-											<reference key="NSNextResponder" ref="596750588"/>
-											<int key="NSvFlags">256</int>
-											<string key="NSFrame">{{18, 146}, {402, 18}}</string>
-											<reference key="NSSuperview" ref="596750588"/>
-											<bool key="NSEnabled">YES</bool>
-											<object class="NSButtonCell" key="NSCell" id="967619578">
-												<int key="NSCellFlags">67239424</int>
-												<int key="NSCellFlags2">0</int>
-												<string type="base64-UTF8" key="NSContents">U2VndWlyIGEgZGlzcG9zacOnw6NvIGRvIHRlY2xhZG8gZG8gc2lzdGVtYQ</string>
-												<reference key="NSSupport" ref="463863101"/>
-												<reference key="NSControlView" ref="179949713"/>
-												<int key="NSButtonFlags">1211912703</int>
-												<int key="NSButtonFlags2">2</int>
-												<reference key="NSNormalImage" ref="750009521"/>
-												<reference key="NSAlternateImage" ref="391434389"/>
-												<reference key="NSAlternateContents" ref="110719282"/>
-												<reference key="NSKeyEquivalent" ref="110719282"/>
-												<int key="NSPeriodicDelay">200</int>
-												<int key="NSPeriodicInterval">25</int>
+											<object class="NSButton" id="179949713">
+												<reference key="NSNextResponder" ref="596750588"/>
+												<int key="NSvFlags">256</int>
+												<string key="NSFrame">{{18, 146}, {402, 18}}</string>
+												<reference key="NSSuperview" ref="596750588"/>
+												<bool key="NSEnabled">YES</bool>
+												<object class="NSButtonCell" key="NSCell" id="967619578">
+													<int key="NSCellFlags">67239424</int>
+													<int key="NSCellFlags2">0</int>
+													<string type="base64-UTF8" key="NSContents">U2VndWlyIGEgZGlzcG9zacOnw6NvIGRvIHRlY2xhZG8gZG8gc2lzdGVtYQ</string>
+													<reference key="NSSupport" ref="463863101"/>
+													<reference key="NSControlView" ref="179949713"/>
+													<int key="NSButtonFlags">1211912703</int>
+													<int key="NSButtonFlags2">2</int>
+													<reference key="NSNormalImage" ref="1057915638"/>
+													<reference key="NSAlternateImage" ref="391434389"/>
+													<string key="NSAlternateContents"/>
+													<string key="NSKeyEquivalent"/>
+													<int key="NSPeriodicDelay">200</int>
+													<int key="NSPeriodicInterval">25</int>
+												</object>
 											</object>
 										</object>
+										<string key="NSFrame">{{10, 33}, {587, 246}}</string>
+										<reference key="NSSuperview" ref="448510093"/>
 									</object>
-									<string key="NSFrame">{{10, 33}, {587, 246}}</string>
-									<reference key="NSSuperview" ref="448510093"/>
-								</object>
-							</object>
-							<string key="NSFrame">{{13, 10}, {607, 292}}</string>
-							<reference key="NSSuperview" ref="941366957"/>
-							<object class="NSMutableArray" key="NSTabViewItems">
-								<bool key="EncodedWithXMLCoder">YES</bool>
-								<object class="NSTabViewItem" id="287591690">
-									<object class="NSMutableString" key="NSIdentifier">
-										<characters key="NS.bytes">1</characters>
-									</object>
-									<reference key="NSView" ref="596750588"/>
 									<string key="NSLabel">Entrada</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
@@ -591,10 +597,10 @@ byBhY3R1YWwgbWFwYSBkZSB0ZWNsYXMgZG8gWDExLg</string>
 													<reference key="NSControlView" ref="418227126"/>
 													<int key="NSButtonFlags">1211912703</int>
 													<int key="NSButtonFlags2">2</int>
-													<reference key="NSNormalImage" ref="750009521"/>
+													<reference key="NSNormalImage" ref="1057915638"/>
 													<reference key="NSAlternateImage" ref="391434389"/>
-													<reference key="NSAlternateContents" ref="110719282"/>
-													<reference key="NSKeyEquivalent" ref="110719282"/>
+													<string key="NSAlternateContents"/>
+													<string key="NSKeyEquivalent"/>
 													<int key="NSPeriodicDelay">200</int>
 													<int key="NSPeriodicInterval">25</int>
 												</object>
@@ -612,7 +618,7 @@ byBhY3R1YWwgbWFwYSBkZSB0ZWNsYXMgZG8gWDExLg</string>
 dGVtYSwgdGFsIGNvbW8gZXN0aXZlciBkZWZpbmlkbyBlbSBFZmVpdG9zIHNvbm9yb3MsIG5hcyBwcmVm
 ZXLDqm5jaWFzIGRvIHNpc3RlbWEuA</string>
 													<reference key="NSSupport" ref="26"/>
-													<reference key="NSPlaceholderString" ref="110719282"/>
+													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="1039016593"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
 													<reference key="NSTextColor" ref="930815747"/>
@@ -621,7 +627,7 @@ ZXLDqm5jaWFzIGRvIHNpc3RlbWEuA</string>
 											<object class="NSPopUpButton" id="709074847">
 												<reference key="NSNextResponder" ref="515308735"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{64, 201}, {131, 26}}</string>
+												<string key="NSFrame">{{68, 201}, {131, 26}}</string>
 												<reference key="NSSuperview" ref="515308735"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSPopUpButtonCell" key="NSCell" id="633115429">
@@ -632,11 +638,11 @@ ZXLDqm5jaWFzIGRvIHNpc3RlbWEuA</string>
 													<int key="NSButtonFlags">109199615</int>
 													<int key="NSButtonFlags2">1</int>
 													<object class="NSFont" key="NSAlternateImage">
-														<reference key="NSName" ref="751126524"/>
+														<string key="NSName">LucidaGrande</string>
 														<double key="NSSize">1.300000e+01</double>
 														<int key="NSfFlags">16</int>
 													</object>
-													<reference key="NSAlternateContents" ref="110719282"/>
+													<string key="NSAlternateContents"/>
 													<object class="NSMutableString" key="NSKeyEquivalent">
 														<characters key="NS.bytes"/>
 													</object>
@@ -645,12 +651,12 @@ ZXLDqm5jaWFzIGRvIHNpc3RlbWEuA</string>
 													<object class="NSMenuItem" key="NSMenuItem" id="616492372">
 														<reference key="NSMenu" ref="341113515"/>
 														<string key="NSTitle">Do monitor</string>
-														<reference key="NSKeyEquiv" ref="110719282"/>
+														<string key="NSKeyEquiv"/>
 														<int key="NSKeyEquivModMask">1048576</int>
 														<int key="NSMnemonicLoc">2147483647</int>
 														<int key="NSState">1</int>
 														<reference key="NSOnImage" ref="1023398665"/>
-														<reference key="NSMixedImage" ref="1029568114"/>
+														<reference key="NSMixedImage" ref="833942997"/>
 														<string key="NSAction">_popUpItemAction:</string>
 														<int key="NSTag">-1</int>
 														<reference key="NSTarget" ref="633115429"/>
@@ -666,11 +672,11 @@ ZXLDqm5jaWFzIGRvIHNpc3RlbWEuA</string>
 															<object class="NSMenuItem" id="759499526">
 																<reference key="NSMenu" ref="341113515"/>
 																<string key="NSTitle">256 cores</string>
-																<reference key="NSKeyEquiv" ref="110719282"/>
+																<string key="NSKeyEquiv"/>
 																<int key="NSKeyEquivModMask">1048576</int>
 																<int key="NSMnemonicLoc">2147483647</int>
 																<reference key="NSOnImage" ref="1023398665"/>
-																<reference key="NSMixedImage" ref="1029568114"/>
+																<reference key="NSMixedImage" ref="833942997"/>
 																<string key="NSAction">_popUpItemAction:</string>
 																<int key="NSTag">8</int>
 																<reference key="NSTarget" ref="633115429"/>
@@ -678,11 +684,11 @@ ZXLDqm5jaWFzIGRvIHNpc3RlbWEuA</string>
 															<object class="NSMenuItem" id="543935434">
 																<reference key="NSMenu" ref="341113515"/>
 																<string key="NSTitle">Milhares</string>
-																<reference key="NSKeyEquiv" ref="110719282"/>
+																<string key="NSKeyEquiv"/>
 																<int key="NSKeyEquivModMask">1048576</int>
 																<int key="NSMnemonicLoc">2147483647</int>
 																<reference key="NSOnImage" ref="1023398665"/>
-																<reference key="NSMixedImage" ref="1029568114"/>
+																<reference key="NSMixedImage" ref="833942997"/>
 																<string key="NSAction">_popUpItemAction:</string>
 																<int key="NSTag">15</int>
 																<reference key="NSTarget" ref="633115429"/>
@@ -690,11 +696,11 @@ ZXLDqm5jaWFzIGRvIHNpc3RlbWEuA</string>
 															<object class="NSMenuItem" id="836673018">
 																<reference key="NSMenu" ref="341113515"/>
 																<string type="base64-UTF8" key="NSTitle">TWlsaMO1ZXM</string>
-																<reference key="NSKeyEquiv" ref="110719282"/>
+																<string key="NSKeyEquiv"/>
 																<int key="NSKeyEquivModMask">1048576</int>
 																<int key="NSMnemonicLoc">2147483647</int>
 																<reference key="NSOnImage" ref="1023398665"/>
-																<reference key="NSMixedImage" ref="1029568114"/>
+																<reference key="NSMixedImage" ref="833942997"/>
 																<string key="NSAction">_popUpItemAction:</string>
 																<int key="NSTag">24</int>
 																<reference key="NSTarget" ref="633115429"/>
@@ -718,7 +724,7 @@ ZXLDqm5jaWFzIGRvIHNpc3RlbWEuA</string>
 													<int key="NSCellFlags2">4194304</int>
 													<string type="base64-UTF8" key="NSContents">Q29yZXM6Cg</string>
 													<reference key="NSSupport" ref="463863101"/>
-													<reference key="NSPlaceholderString" ref="110719282"/>
+													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="201731424"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
 													<reference key="NSTextColor" ref="930815747"/>
@@ -736,7 +742,7 @@ ZXLDqm5jaWFzIGRvIHNpc3RlbWEuA</string>
 													<string type="base64-UTF8" key="NSContents">RXN0YSBvcMOnw6NvIGVudHJhcsOhIGVtIHZpZ29yIGRhIHByw7N4aW1hIHZleiBxdWUgbyBYMTEgZm9y
 IGV4ZWN1dGFkby4</string>
 													<reference key="NSSupport" ref="26"/>
-													<reference key="NSPlaceholderString" ref="110719282"/>
+													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="86150604"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
 													<reference key="NSTextColor" ref="930815747"/>
@@ -756,10 +762,10 @@ IGV4ZWN1dGFkby4</string>
 													<reference key="NSControlView" ref="477203622"/>
 													<int key="NSButtonFlags">1211912703</int>
 													<int key="NSButtonFlags2">2</int>
-													<reference key="NSNormalImage" ref="750009521"/>
+													<reference key="NSNormalImage" ref="1057915638"/>
 													<reference key="NSAlternateImage" ref="391434389"/>
-													<reference key="NSAlternateContents" ref="110719282"/>
-													<reference key="NSKeyEquivalent" ref="110719282"/>
+													<string key="NSAlternateContents"/>
+													<string key="NSKeyEquivalent"/>
 													<int key="NSPeriodicDelay">200</int>
 													<int key="NSPeriodicInterval">25</int>
 												</object>
@@ -779,10 +785,10 @@ bXBsZXRvA</string>
 													<reference key="NSControlView" ref="57246850"/>
 													<int key="NSButtonFlags">1211912703</int>
 													<int key="NSButtonFlags2">2</int>
-													<reference key="NSNormalImage" ref="750009521"/>
+													<reference key="NSNormalImage" ref="1057915638"/>
 													<reference key="NSAlternateImage" ref="391434389"/>
-													<reference key="NSAlternateContents" ref="110719282"/>
-													<reference key="NSKeyEquivalent" ref="110719282"/>
+													<string key="NSAlternateContents"/>
+													<string key="NSKeyEquivalent"/>
 													<int key="NSPeriodicDelay">200</int>
 													<int key="NSPeriodicInterval">25</int>
 												</object>
@@ -800,7 +806,7 @@ bXBsZXRvA</string>
 cyBDb21hbmRvLU9ww6fDo28tQSBwYXJhIGVudHJhciBlIHNhaXIgZG8gbW9kbyBkZSBlY3LDoyBjb21w
 bGV0by4</string>
 													<reference key="NSSupport" ref="26"/>
-													<reference key="NSPlaceholderString" ref="110719282"/>
+													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="298603383"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
 													<reference key="NSTextColor" ref="930815747"/>
@@ -836,10 +842,10 @@ bGV0by4</string>
 													<reference key="NSControlView" ref="878106058"/>
 													<int key="NSButtonFlags">1211912703</int>
 													<int key="NSButtonFlags2">2</int>
-													<reference key="NSNormalImage" ref="750009521"/>
+													<reference key="NSNormalImage" ref="1057915638"/>
 													<reference key="NSAlternateImage" ref="391434389"/>
-													<reference key="NSAlternateContents" ref="110719282"/>
-													<reference key="NSKeyEquivalent" ref="110719282"/>
+													<string key="NSAlternateContents"/>
+													<string key="NSKeyEquivalent"/>
 													<int key="NSPeriodicDelay">200</int>
 													<int key="NSPeriodicInterval">25</int>
 												</object>
@@ -876,10 +882,10 @@ TUFSWSBkbyBYMTEuA</string>
 													<reference key="NSControlView" ref="477050998"/>
 													<int key="NSButtonFlags">1211912703</int>
 													<int key="NSButtonFlags2">2</int>
-													<reference key="NSNormalImage" ref="750009521"/>
+													<reference key="NSNormalImage" ref="1057915638"/>
 													<reference key="NSAlternateImage" ref="391434389"/>
-													<reference key="NSAlternateContents" ref="110719282"/>
-													<reference key="NSKeyEquivalent" ref="110719282"/>
+													<string key="NSAlternateContents"/>
+													<string key="NSKeyEquivalent"/>
 													<int key="NSPeriodicDelay">200</int>
 													<int key="NSPeriodicInterval">25</int>
 												</object>
@@ -899,10 +905,10 @@ cmVhIGRlIGNvbGFnZW0gbXVkYXIuA</string>
 													<reference key="NSControlView" ref="765780304"/>
 													<int key="NSButtonFlags">1211912703</int>
 													<int key="NSButtonFlags2">2</int>
-													<reference key="NSNormalImage" ref="750009521"/>
+													<reference key="NSNormalImage" ref="1057915638"/>
 													<reference key="NSAlternateImage" ref="391434389"/>
-													<reference key="NSAlternateContents" ref="110719282"/>
-													<reference key="NSKeyEquivalent" ref="110719282"/>
+													<string key="NSAlternateContents"/>
+													<string key="NSKeyEquivalent"/>
 													<int key="NSPeriodicDelay">200</int>
 													<int key="NSPeriodicInterval">25</int>
 												</object>
@@ -922,10 +928,10 @@ Y2lvbmFkbyB0ZXh0byBub3ZvLg</string>
 													<reference key="NSControlView" ref="1002778833"/>
 													<int key="NSButtonFlags">1211912703</int>
 													<int key="NSButtonFlags2">2</int>
-													<reference key="NSNormalImage" ref="750009521"/>
+													<reference key="NSNormalImage" ref="1057915638"/>
 													<reference key="NSAlternateImage" ref="391434389"/>
-													<reference key="NSAlternateContents" ref="110719282"/>
-													<reference key="NSKeyEquivalent" ref="110719282"/>
+													<string key="NSAlternateContents"/>
+													<string key="NSKeyEquivalent"/>
 													<int key="NSPeriodicDelay">200</int>
 													<int key="NSPeriodicInterval">25</int>
 												</object>
@@ -944,10 +950,10 @@ Y2lvbmFkbyB0ZXh0byBub3ZvLg</string>
 													<reference key="NSControlView" ref="487809555"/>
 													<int key="NSButtonFlags">1211912703</int>
 													<int key="NSButtonFlags2">2</int>
-													<reference key="NSNormalImage" ref="750009521"/>
+													<reference key="NSNormalImage" ref="1057915638"/>
 													<reference key="NSAlternateImage" ref="391434389"/>
-													<reference key="NSAlternateContents" ref="110719282"/>
-													<reference key="NSKeyEquivalent" ref="110719282"/>
+													<string key="NSAlternateContents"/>
+													<string key="NSKeyEquivalent"/>
 													<int key="NSPeriodicDelay">200</int>
 													<int key="NSPeriodicInterval">25</int>
 												</object>
@@ -1016,10 +1022,10 @@ cHJlIGZ1bmNpb25hcsOhIGVtIGFsZ3VtYXMgYXBsaWNhw6fDtWVzLg</string>
 													<reference key="NSControlView" ref="657659108"/>
 													<int key="NSButtonFlags">1211912703</int>
 													<int key="NSButtonFlags2">2</int>
-													<reference key="NSNormalImage" ref="750009521"/>
+													<reference key="NSNormalImage" ref="1057915638"/>
 													<reference key="NSAlternateImage" ref="391434389"/>
-													<reference key="NSAlternateContents" ref="110719282"/>
-													<reference key="NSKeyEquivalent" ref="110719282"/>
+													<string key="NSAlternateContents"/>
+													<string key="NSKeyEquivalent"/>
 													<int key="NSPeriodicDelay">200</int>
 													<int key="NSPeriodicInterval">25</int>
 												</object>
@@ -1056,10 +1062,10 @@ b21wbGV0YW1lbnRlLiA</string>
 													<reference key="NSControlView" ref="992839333"/>
 													<int key="NSButtonFlags">1211912703</int>
 													<int key="NSButtonFlags2">2</int>
-													<reference key="NSNormalImage" ref="750009521"/>
+													<reference key="NSNormalImage" ref="1057915638"/>
 													<reference key="NSAlternateImage" ref="391434389"/>
-													<reference key="NSAlternateContents" ref="110719282"/>
-													<reference key="NSKeyEquivalent" ref="110719282"/>
+													<string key="NSAlternateContents"/>
+													<string key="NSKeyEquivalent"/>
 													<int key="NSPeriodicDelay">200</int>
 													<int key="NSPeriodicInterval">25</int>
 												</object>
@@ -1094,10 +1100,10 @@ b21wbGV0YW1lbnRlLiA</string>
 													<reference key="NSControlView" ref="128352289"/>
 													<int key="NSButtonFlags">1211912703</int>
 													<int key="NSButtonFlags2">2</int>
-													<reference key="NSNormalImage" ref="750009521"/>
+													<reference key="NSNormalImage" ref="1057915638"/>
 													<reference key="NSAlternateImage" ref="391434389"/>
-													<reference key="NSAlternateContents" ref="110719282"/>
-													<reference key="NSKeyEquivalent" ref="110719282"/>
+													<string key="NSAlternateContents"/>
+													<string key="NSKeyEquivalent"/>
 													<int key="NSPeriodicDelay">200</int>
 													<int key="NSPeriodicInterval">25</int>
 												</object>
@@ -1147,10 +1153,10 @@ Yy4pLg</string>
 													<reference key="NSControlView" ref="989050925"/>
 													<int key="NSButtonFlags">1211912703</int>
 													<int key="NSButtonFlags2">2</int>
-													<reference key="NSNormalImage" ref="750009521"/>
+													<reference key="NSNormalImage" ref="1057915638"/>
 													<reference key="NSAlternateImage" ref="391434389"/>
-													<reference key="NSAlternateContents" ref="110719282"/>
-													<reference key="NSKeyEquivalent" ref="110719282"/>
+													<string key="NSAlternateContents"/>
+													<string key="NSKeyEquivalent"/>
 													<int key="NSPeriodicDelay">200</int>
 													<int key="NSPeriodicInterval">25</int>
 												</object>
@@ -1169,10 +1175,10 @@ Yy4pLg</string>
 													<reference key="NSControlView" ref="700826966"/>
 													<int key="NSButtonFlags">1211912703</int>
 													<int key="NSButtonFlags2">2</int>
-													<reference key="NSNormalImage" ref="750009521"/>
+													<reference key="NSNormalImage" ref="1057915638"/>
 													<reference key="NSAlternateImage" ref="391434389"/>
-													<reference key="NSAlternateContents" ref="110719282"/>
-													<reference key="NSKeyEquivalent" ref="110719282"/>
+													<string key="NSAlternateContents"/>
+													<string key="NSKeyEquivalent"/>
 													<int key="NSPeriodicDelay">200</int>
 													<int key="NSPeriodicInterval">25</int>
 												</object>
@@ -1191,7 +1197,7 @@ U2UgbyBlbmRlcmXDp28gSVAgZG8gc2lzdGVtYSBmb3IgYWx0ZXJhZG8sIGVzdGFzIGNoYXZlcyBwZXJk
 ZW0gYSB2YWxpZGFkZSwgcG9kZW5kbywgYXNzaW0sICBpbXBvc3NpYmlsaXRhciBhIGV4ZWN1w6fDo28g
 ZGFzIGFwbGljYcOnw7VlcyBYMTEuA</string>
 													<reference key="NSSupport" ref="26"/>
-													<reference key="NSPlaceholderString" ref="110719282"/>
+													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="168436707"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
 													<reference key="NSTextColor" ref="930815747"/>
@@ -1211,7 +1217,7 @@ p8OjbyDigJxBdXRlbnRpY2FyIGxpZ2HDp8O1ZXPigJ0gcGFyYSBnYXJhbnRpciBhIHNlZ3VyYW7Dp2Eg
 ZG8gc2lzdGVtYS4gU2UgbsOjbyBhY3RpdmFyIGVzdGEgb3DDp8OjbywgbsOjbyBzw6NvIHBlcm1pdGlk
 YXMgbGlnYcOnw7VlcyBhIHBhcnRpciBkZSBhcGxpY2HDp8O1ZXMgcmVtb3Rhcy4</string>
 													<reference key="NSSupport" ref="26"/>
-													<reference key="NSPlaceholderString" ref="110719282"/>
+													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="363817195"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
 													<reference key="NSTextColor" ref="930815747"/>
@@ -1229,7 +1235,7 @@ YXMgbGlnYcOnw7VlcyBhIHBhcnRpciBkZSBhcGxpY2HDp8O1ZXMgcmVtb3Rhcy4</string>
 													<string type="base64-UTF8" key="NSContents">RXN0YXMgb3DDp8O1ZXMgZW50cmFyw6NvIGVtIHZpZ29yIGRhIHByw7N4aW1hIHZleiBxdWUgbyBYMTEg
 Zm9yIGV4ZWN1dGFkby4</string>
 													<reference key="NSSupport" ref="26"/>
-													<reference key="NSPlaceholderString" ref="110719282"/>
+													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="223835729"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
 													<reference key="NSTextColor" ref="930815747"/>
@@ -1248,12 +1254,17 @@ Zm9yIGV4ZWN1dGFkby4</string>
 							<int key="NSTvFlags">0</int>
 							<bool key="NSAllowTruncatedLabels">YES</bool>
 							<bool key="NSDrawsBackground">YES</bool>
+							<object class="NSMutableArray" key="NSSubviews">
+								<bool key="EncodedWithXMLCoder">YES</bool>
+								<reference ref="596750588"/>
+							</object>
 						</object>
 					</object>
 					<string key="NSFrameSize">{633, 308}</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMinSize">{320, 262}</string>
+				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSFrameAutosaveName">x11_prefs</string>
 			</object>
 			<object class="NSWindowTemplate" id="604417141">
@@ -1262,10 +1273,11 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				<string key="NSWindowRect">{{360, 400}, {477, 271}}</string>
 				<int key="NSWTFlags">1350041600</int>
 				<string type="base64-UTF8" key="NSWindowTitle">TWVudSBBcGxpY2HDp8OjbyBkbyBYMTE</string>
-				<reference key="NSWindowClass" ref="226149994"/>
+				<string key="NSWindowClass">NSPanel</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
+				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="85544634">
 					<nil key="NSNextResponder"/>
@@ -1275,7 +1287,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 						<object class="NSButton" id="671954382">
 							<reference key="NSNextResponder" ref="85544634"/>
 							<int key="NSvFlags">265</int>
-							<string key="NSFrame">{{340, 191}, {123, 32}}</string>
+							<string key="NSFrame">{{318, 191}, {155, 32}}</string>
 							<reference key="NSSuperview" ref="85544634"/>
 							<bool key="NSEnabled">YES</bool>
 							<object class="NSButtonCell" key="NSCell" id="143554520">
@@ -1287,7 +1299,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 								<int key="NSButtonFlags">-2038284033</int>
 								<int key="NSButtonFlags2">1</int>
 								<reference key="NSAlternateImage" ref="463863101"/>
-								<reference key="NSAlternateContents" ref="110719282"/>
+								<string key="NSAlternateContents"/>
 								<object class="NSMutableString" key="NSKeyEquivalent">
 									<characters key="NS.bytes"/>
 								</object>
@@ -1298,7 +1310,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 						<object class="NSButton" id="492358940">
 							<reference key="NSNextResponder" ref="85544634"/>
 							<int key="NSvFlags">265</int>
-							<string key="NSFrame">{{340, 159}, {123, 32}}</string>
+							<string key="NSFrame">{{318, 159}, {155, 32}}</string>
 							<reference key="NSSuperview" ref="85544634"/>
 							<bool key="NSEnabled">YES</bool>
 							<object class="NSButtonCell" key="NSCell" id="8201128">
@@ -1310,7 +1322,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 								<int key="NSButtonFlags">-2038284033</int>
 								<int key="NSButtonFlags2">1</int>
 								<reference key="NSAlternateImage" ref="463863101"/>
-								<reference key="NSAlternateContents" ref="110719282"/>
+								<string key="NSAlternateContents"/>
 								<object class="NSMutableString" key="NSKeyEquivalent">
 									<characters key="NS.bytes"/>
 								</object>
@@ -1331,26 +1343,26 @@ Zm9yIGV4ZWN1dGFkby4</string>
 										<object class="NSTableView" id="905092943">
 											<reference key="NSNextResponder" ref="580565898"/>
 											<int key="NSvFlags">256</int>
-											<string key="NSFrameSize">{301, 198}</string>
+											<string key="NSFrameSize">{279, 198}</string>
 											<reference key="NSSuperview" ref="580565898"/>
 											<bool key="NSEnabled">YES</bool>
 											<object class="NSTableHeaderView" key="NSHeaderView" id="792419186">
 												<reference key="NSNextResponder" ref="672307654"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrameSize">{301, 17}</string>
+												<string key="NSFrameSize">{279, 17}</string>
 												<reference key="NSSuperview" ref="672307654"/>
 												<reference key="NSTableView" ref="905092943"/>
 											</object>
 											<object class="_NSCornerView" key="NSCornerView" id="898633680">
 												<reference key="NSNextResponder" ref="1063387772"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{302, 0}, {16, 17}}</string>
+												<string key="NSFrame">{{280, 0}, {16, 17}}</string>
 												<reference key="NSSuperview" ref="1063387772"/>
 											</object>
 											<object class="NSMutableArray" key="NSTableColumns">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<object class="NSTableColumn" id="938444323">
-													<double key="NSWidth">1.227310e+02</double>
+													<double key="NSWidth">9.973100e+01</double>
 													<double key="NSMinWidth">6.273100e+01</double>
 													<double key="NSMaxWidth">1.000000e+03</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
@@ -1364,7 +1376,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 														</object>
 														<object class="NSColor" key="NSTextColor" id="249576247">
 															<int key="NSColorSpace">6</int>
-															<reference key="NSCatalogName" ref="971051604"/>
+															<string key="NSCatalogName">System</string>
 															<string key="NSColorName">headerTextColor</string>
 															<reference key="NSColor" ref="214098874"/>
 														</object>
@@ -1372,9 +1384,9 @@ Zm9yIGV4ZWN1dGFkby4</string>
 													<object class="NSTextFieldCell" key="NSDataCell" id="825378892">
 														<int key="NSCellFlags">338820672</int>
 														<int key="NSCellFlags2">1024</int>
-														<string type="base64-UTF8" key="NSContents" id="311417809">Q8OpbHVsYSBkZSB0ZXh0bw</string>
+														<string type="base64-UTF8" key="NSContents">Q8OpbHVsYSBkZSB0ZXh0bw</string>
 														<reference key="NSSupport" ref="463863101"/>
-														<reference key="NSPlaceholderString" ref="110719282"/>
+														<string key="NSPlaceholderString"/>
 														<reference key="NSControlView" ref="905092943"/>
 														<object class="NSColor" key="NSBackgroundColor" id="822946413">
 															<int key="NSColorSpace">3</int>
@@ -1388,7 +1400,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 													<reference key="NSTableView" ref="905092943"/>
 												</object>
 												<object class="NSTableColumn" id="84282687">
-													<double key="NSWidth">1.000000e+02</double>
+													<double key="NSWidth">1.010000e+02</double>
 													<double key="NSMinWidth">4.000000e+01</double>
 													<double key="NSMaxWidth">1.000000e+03</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
@@ -1402,9 +1414,9 @@ Zm9yIGV4ZWN1dGFkby4</string>
 													<object class="NSTextFieldCell" key="NSDataCell" id="432610585">
 														<int key="NSCellFlags">338820672</int>
 														<int key="NSCellFlags2">1024</int>
-														<reference key="NSContents" ref="311417809"/>
+														<string type="base64-UTF8" key="NSContents">Q8OpbHVsYSBkZSB0ZXh0bw</string>
 														<reference key="NSSupport" ref="463863101"/>
-														<reference key="NSPlaceholderString" ref="110719282"/>
+														<string key="NSPlaceholderString"/>
 														<reference key="NSControlView" ref="905092943"/>
 														<reference key="NSBackgroundColor" ref="822946413"/>
 														<reference key="NSTextColor" ref="930815747"/>
@@ -1425,7 +1437,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor">
 															<int key="NSColorSpace">6</int>
-															<reference key="NSCatalogName" ref="971051604"/>
+															<string key="NSCatalogName">System</string>
 															<string key="NSColorName">headerColor</string>
 															<reference key="NSColor" ref="822946413"/>
 														</object>
@@ -1434,18 +1446,18 @@ Zm9yIGV4ZWN1dGFkby4</string>
 													<object class="NSTextFieldCell" key="NSDataCell" id="34714764">
 														<int key="NSCellFlags">338820672</int>
 														<int key="NSCellFlags2">1024</int>
-														<reference key="NSContents" ref="311417809"/>
+														<string type="base64-UTF8" key="NSContents">Q8OpbHVsYSBkZSB0ZXh0bw</string>
 														<object class="NSFont" key="NSSupport">
-															<reference key="NSName" ref="751126524"/>
+															<string key="NSName">LucidaGrande</string>
 															<double key="NSSize">1.200000e+01</double>
 															<int key="NSfFlags">16</int>
 														</object>
-														<reference key="NSPlaceholderString" ref="110719282"/>
+														<string key="NSPlaceholderString"/>
 														<reference key="NSControlView" ref="905092943"/>
 														<bool key="NSDrawsBackground">YES</bool>
 														<object class="NSColor" key="NSBackgroundColor" id="812484075">
 															<int key="NSColorSpace">6</int>
-															<reference key="NSCatalogName" ref="971051604"/>
+															<string key="NSCatalogName">System</string>
 															<string key="NSColorName">controlBackgroundColor</string>
 															<reference key="NSColor" ref="854255273"/>
 														</object>
@@ -1462,7 +1474,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 											<reference key="NSBackgroundColor" ref="822946413"/>
 											<object class="NSColor" key="NSGridColor">
 												<int key="NSColorSpace">6</int>
-												<reference key="NSCatalogName" ref="971051604"/>
+												<string key="NSCatalogName">System</string>
 												<string key="NSColorName">gridColor</string>
 												<object class="NSColor" key="NSColor">
 													<int key="NSColorSpace">3</int>
@@ -1477,9 +1489,8 @@ Zm9yIGV4ZWN1dGFkby4</string>
 											<bool key="NSAllowsTypeSelect">YES</bool>
 										</object>
 									</object>
-									<string key="NSFrame">{{1, 17}, {301, 198}}</string>
+									<string key="NSFrame">{{1, 17}, {279, 198}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
-									<reference key="NSNextKeyView" ref="905092943"/>
 									<reference key="NSDocView" ref="905092943"/>
 									<reference key="NSBGColor" ref="812484075"/>
 									<int key="NScvFlags">4</int>
@@ -1487,20 +1498,20 @@ Zm9yIGV4ZWN1dGFkby4</string>
 								<object class="NSScroller" id="842897584">
 									<reference key="NSNextResponder" ref="1063387772"/>
 									<int key="NSvFlags">256</int>
-									<string key="NSFrame">{{302, 17}, {15, 198}}</string>
+									<string key="NSFrame">{{280, 17}, {15, 198}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
 									<reference key="NSTarget" ref="1063387772"/>
-									<string key="NSAction" id="838722033">_doScroller:</string>
+									<string key="NSAction">_doScroller:</string>
 									<double key="NSPercent">9.949238e-01</double>
 								</object>
 								<object class="NSScroller" id="17278747">
 									<reference key="NSNextResponder" ref="1063387772"/>
 									<int key="NSvFlags">256</int>
-									<string key="NSFrame">{{1, 215}, {301, 15}}</string>
+									<string key="NSFrame">{{1, 215}, {279, 15}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
 									<int key="NSsFlags">1</int>
 									<reference key="NSTarget" ref="1063387772"/>
-									<reference key="NSAction" ref="838722033"/>
+									<string key="NSAction">_doScroller:</string>
 									<double key="NSPercent">6.885246e-01</double>
 								</object>
 								<object class="NSClipView" id="672307654">
@@ -1510,18 +1521,16 @@ Zm9yIGV4ZWN1dGFkby4</string>
 										<bool key="EncodedWithXMLCoder">YES</bool>
 										<reference ref="792419186"/>
 									</object>
-									<string key="NSFrame">{{1, 0}, {301, 17}}</string>
+									<string key="NSFrame">{{1, 0}, {279, 17}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
-									<reference key="NSNextKeyView" ref="792419186"/>
 									<reference key="NSDocView" ref="792419186"/>
 									<reference key="NSBGColor" ref="812484075"/>
 									<int key="NScvFlags">4</int>
 								</object>
 								<reference ref="898633680"/>
 							</object>
-							<string key="NSFrame">{{20, 20}, {318, 231}}</string>
+							<string key="NSFrame">{{20, 20}, {296, 231}}</string>
 							<reference key="NSSuperview" ref="85544634"/>
-							<reference key="NSNextKeyView" ref="580565898"/>
 							<int key="NSsFlags">50</int>
 							<reference key="NSVScroller" ref="842897584"/>
 							<reference key="NSHScroller" ref="17278747"/>
@@ -1533,7 +1542,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 						<object class="NSButton" id="758204686">
 							<reference key="NSNextResponder" ref="85544634"/>
 							<int key="NSvFlags">265</int>
-							<string key="NSFrame">{{340, 223}, {123, 32}}</string>
+							<string key="NSFrame">{{318, 223}, {155, 32}}</string>
 							<reference key="NSSuperview" ref="85544634"/>
 							<bool key="NSEnabled">YES</bool>
 							<object class="NSButtonCell" key="NSCell" id="1025474039">
@@ -1545,7 +1554,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 								<int key="NSButtonFlags">-2038284033</int>
 								<int key="NSButtonFlags2">1</int>
 								<reference key="NSAlternateImage" ref="463863101"/>
-								<reference key="NSAlternateContents" ref="110719282"/>
+								<string key="NSAlternateContents"/>
 								<object class="NSMutableString" key="NSKeyEquivalent">
 									<characters key="NS.bytes"/>
 								</object>
@@ -1558,6 +1567,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMinSize">{320, 262}</string>
+				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSFrameAutosaveName">x11_apps</string>
 			</object>
 			<object class="NSMenu" id="294137138">
@@ -1568,51 +1578,51 @@ Zm9yIGV4ZWN1dGFkby4</string>
 						<reference key="NSMenu" ref="294137138"/>
 						<bool key="NSIsDisabled">YES</bool>
 						<bool key="NSIsSeparator">YES</bool>
-						<reference key="NSTitle" ref="110719282"/>
-						<reference key="NSKeyEquiv" ref="110719282"/>
+						<string key="NSTitle"/>
+						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
 						<reference key="NSOnImage" ref="1023398665"/>
-						<reference key="NSMixedImage" ref="1029568114"/>
+						<reference key="NSMixedImage" ref="833942997"/>
 					</object>
 					<object class="NSMenuItem" id="511651072">
 						<reference key="NSMenu" ref="294137138"/>
-						<reference key="NSTitle" ref="486152235"/>
-						<reference key="NSKeyEquiv" ref="110719282"/>
+						<string type="base64-UTF8" key="NSTitle">QXBsaWNhw6fDtWVzA</string>
+						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
 						<reference key="NSOnImage" ref="1023398665"/>
-						<reference key="NSMixedImage" ref="1029568114"/>
+						<reference key="NSMixedImage" ref="833942997"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="48278059">
-							<reference key="NSTitle" ref="486152235"/>
+							<string type="base64-UTF8" key="NSTitle">QXBsaWNhw6fDtWVzA</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="563798000">
 									<reference key="NSMenu" ref="48278059"/>
 									<bool key="NSIsDisabled">YES</bool>
 									<bool key="NSIsSeparator">YES</bool>
-									<reference key="NSTitle" ref="110719282"/>
-									<reference key="NSKeyEquiv" ref="110719282"/>
+									<string key="NSTitle"/>
+									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 								<object class="NSMenuItem" id="1032342329">
 									<reference key="NSMenu" ref="48278059"/>
 									<string type="base64-UTF8" key="NSTitle">UGVyc29uYWxpemFy4oCmA</string>
-									<reference key="NSKeyEquiv" ref="110719282"/>
+									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
 									<reference key="NSOnImage" ref="1023398665"/>
-									<reference key="NSMixedImage" ref="1029568114"/>
+									<reference key="NSMixedImage" ref="833942997"/>
 								</object>
 							</object>
 						</object>
 					</object>
 				</object>
-				<reference key="NSName" ref="110719282"/>
+				<string key="NSName"/>
 			</object>
 		</object>
 		<object class="IBObjectContainer" key="IBDocument.Objects">
@@ -1700,7 +1710,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<string key="label" id="955006428">apps_table_show:</string>
+						<string key="label">apps_table_show:</string>
 						<reference key="source" ref="485884620"/>
 						<reference key="destination" ref="1065386165"/>
 					</object>
@@ -1788,7 +1798,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<string key="label" id="406986160">prefs_changed:</string>
+						<string key="label">prefs_changed:</string>
 						<reference key="source" ref="485884620"/>
 						<reference key="destination" ref="119157981"/>
 					</object>
@@ -1796,7 +1806,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<reference key="label" ref="406986160"/>
+						<string key="label">prefs_changed:</string>
 						<reference key="source" ref="485884620"/>
 						<reference key="destination" ref="179949713"/>
 					</object>
@@ -1804,7 +1814,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<reference key="label" ref="406986160"/>
+						<string key="label">prefs_changed:</string>
 						<reference key="source" ref="485884620"/>
 						<reference key="destination" ref="842100515"/>
 					</object>
@@ -1812,7 +1822,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<reference key="label" ref="406986160"/>
+						<string key="label">prefs_changed:</string>
 						<reference key="source" ref="485884620"/>
 						<reference key="destination" ref="418227126"/>
 					</object>
@@ -1820,7 +1830,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<reference key="label" ref="406986160"/>
+						<string key="label">prefs_changed:</string>
 						<reference key="source" ref="485884620"/>
 						<reference key="destination" ref="709074847"/>
 					</object>
@@ -1828,7 +1838,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<reference key="label" ref="406986160"/>
+						<string key="label">prefs_changed:</string>
 						<reference key="source" ref="485884620"/>
 						<reference key="destination" ref="989050925"/>
 					</object>
@@ -1836,7 +1846,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<reference key="label" ref="406986160"/>
+						<string key="label">prefs_changed:</string>
 						<reference key="source" ref="485884620"/>
 						<reference key="destination" ref="700826966"/>
 					</object>
@@ -1924,7 +1934,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<reference key="label" ref="955006428"/>
+						<string key="label">apps_table_show:</string>
 						<reference key="source" ref="485884620"/>
 						<reference key="destination" ref="1032342329"/>
 					</object>
@@ -2004,7 +2014,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<reference key="label" ref="406986160"/>
+						<string key="label">prefs_changed:</string>
 						<reference key="source" ref="485884620"/>
 						<reference key="destination" ref="657659108"/>
 					</object>
@@ -2012,7 +2022,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<reference key="label" ref="406986160"/>
+						<string key="label">prefs_changed:</string>
 						<reference key="source" ref="485884620"/>
 						<reference key="destination" ref="992839333"/>
 					</object>
@@ -2020,7 +2030,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<reference key="label" ref="406986160"/>
+						<string key="label">prefs_changed:</string>
 						<reference key="source" ref="485884620"/>
 						<reference key="destination" ref="128352289"/>
 					</object>
@@ -2100,7 +2110,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<reference key="label" ref="406986160"/>
+						<string key="label">prefs_changed:</string>
 						<reference key="source" ref="485884620"/>
 						<reference key="destination" ref="878106058"/>
 					</object>
@@ -2108,7 +2118,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<reference key="label" ref="406986160"/>
+						<string key="label">prefs_changed:</string>
 						<reference key="source" ref="485884620"/>
 						<reference key="destination" ref="487809555"/>
 					</object>
@@ -2116,7 +2126,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<reference key="label" ref="406986160"/>
+						<string key="label">prefs_changed:</string>
 						<reference key="source" ref="485884620"/>
 						<reference key="destination" ref="477050998"/>
 					</object>
@@ -2124,7 +2134,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<reference key="label" ref="406986160"/>
+						<string key="label">prefs_changed:</string>
 						<reference key="source" ref="485884620"/>
 						<reference key="destination" ref="765780304"/>
 					</object>
@@ -2132,7 +2142,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<reference key="label" ref="406986160"/>
+						<string key="label">prefs_changed:</string>
 						<reference key="source" ref="485884620"/>
 						<reference key="destination" ref="1002778833"/>
 					</object>
@@ -2164,7 +2174,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<reference key="label" ref="406986160"/>
+						<string key="label">prefs_changed:</string>
 						<reference key="source" ref="485884620"/>
 						<reference key="destination" ref="57246850"/>
 					</object>
@@ -2212,7 +2222,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 							<reference ref="551174276"/>
 						</object>
 						<reference key="parent" ref="330408435"/>
-						<reference key="objectName" ref="466365863"/>
+						<string key="objectName">MainMenu</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">19</int>
@@ -2457,7 +2467,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 						<int key="objectID">196</int>
 						<reference key="object" ref="485884620"/>
 						<reference key="parent" ref="330408435"/>
-						<reference key="objectName" ref="66570722"/>
+						<string key="objectName">X11Controller</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">244</int>
@@ -3307,6 +3317,9 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				<bool key="EncodedWithXMLCoder">YES</bool>
 				<object class="NSMutableArray" key="dict.sortedKeys">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<string>-1.IBPluginDependency</string>
+					<string>-2.IBPluginDependency</string>
+					<string>-3.IBPluginDependency</string>
 					<string>-3.ImportedFromIB2</string>
 					<string>100292.IBPluginDependency</string>
 					<string>100293.IBPluginDependency</string>
@@ -3363,6 +3376,7 @@ Zm9yIGV4ZWN1dGFkby4</string>
 					<string>169.editorWindowContentRectSynchronizationRect</string>
 					<string>19.IBPluginDependency</string>
 					<string>19.ImportedFromIB2</string>
+					<string>196.IBPluginDependency</string>
 					<string>196.ImportedFromIB2</string>
 					<string>200295.IBPluginDependency</string>
 					<string>200295.IBShouldRemoveOnLegacySave</string>
@@ -3377,7 +3391,6 @@ Zm9yIGV4ZWN1dGFkby4</string>
 					<string>24.ImportedFromIB2</string>
 					<string>24.editorWindowContentRectSynchronizationRect</string>
 					<string>244.IBEditorWindowLastContentRect</string>
-					<string>244.IBPluginDependency</string>
 					<string>244.IBPropertyAccessControl</string>
 					<string>244.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>244.IBWindowTemplateEditedContentRect</string>
@@ -3399,7 +3412,6 @@ Zm9yIGV4ZWN1dGFkby4</string>
 					<string>272.IBPluginDependency</string>
 					<string>272.ImportedFromIB2</string>
 					<string>285.IBEditorWindowLastContentRect</string>
-					<string>285.IBPluginDependency</string>
 					<string>285.IBViewEditorWindowController.showingBoundsRectangles</string>
 					<string>285.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>285.IBWindowTemplateEditedContentRect</string>
@@ -3650,345 +3662,347 @@ Zm9yIGV4ZWN1dGFkby4</string>
 				</object>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="1" id="9"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="9"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<reference ref="9"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<integer value="3" id="11"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
 					<string>{{168, 821}, {113, 23}}</string>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
 					<string>{{202, 626}, {154, 153}}</string>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
 					<string>{{349, 858}, {315, 153}}</string>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
 					<string>{{271, 666}, {301, 153}}</string>
-					<string>{{437, 749}, {484, 308}}</string>
-					<reference ref="1364"/>
+					<string>{{437, 548}, {633, 308}}</string>
 					<reference ref="11"/>
 					<integer value="0"/>
-					<string id="456542360">{{184, 290}, {633, 308}}</string>
-					<reference ref="9"/>
-					<reference ref="456542360"/>
+					<string>{{437, 548}, {633, 308}}</string>
 					<reference ref="9"/>
+					<string>{{184, 290}, {633, 308}}</string>
+					<boolean value="NO" id="6"/>
 					<reference ref="9"/>
-					<string id="221147092">{inf, inf}</string>
-					<string id="1178">{320, 240}</string>
-					<reference ref="1364"/>
+					<string>{3.40282e+38, 3.40282e+38}</string>
+					<string>{320, 240}</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
 					<string>{{58, 803}, {155, 33}}</string>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
 					<string>{{100, 746}, {155, 33}}</string>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<string id="1172">{{68, 585}, {454, 271}}</string>
-					<reference ref="1364"/>
+					<string>{{68, 585}, {477, 271}}</string>
 					<reference ref="9"/>
-					<reference ref="9"/>
-					<reference ref="1172"/>
+					<reference ref="6"/>
+					<string>{{68, 585}, {477, 271}}</string>
 					<reference ref="9"/>
 					<string>{{433, 406}, {486, 327}}</string>
+					<reference ref="6"/>
 					<reference ref="9"/>
-					<reference ref="9"/>
-					<reference ref="221147092"/>
-					<reference ref="1178"/>
-					<reference ref="1364"/>
+					<string>{3.40282e+38, 3.40282e+38}</string>
+					<string>{320, 240}</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
 					<string>{{145, 1011}, {336, 20}}</string>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
 					<string>{{67, 819}, {336, 20}}</string>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="11"/>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
 					<string>{{20, 641}, {218, 203}}</string>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
 					<string>{{79, 616}, {218, 203}}</string>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
-					<reference ref="1364"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<reference ref="9"/>
 				</object>
 			</object>
@@ -4018,33 +4032,27 @@ Zm9yIGV4ZWN1dGFkby4</string>
 			<object class="NSMutableArray" key="referencedPartialClassDescriptions">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 				<object class="IBPartialClassDescription">
-					<reference key="className" ref="766348603"/>
-					<string key="superclassName" id="1388">NSObject</string>
-					<nil key="actions"/>
-					<nil key="outlets"/>
+					<string key="className">FirstResponder</string>
+					<string key="superclassName">NSObject</string>
 					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey" id="1390">IBUserSource</string>
-						<reference key="minorKey" ref="110719282"/>
+						<string key="majorKey">IBUserSource</string>
+						<string key="minorKey"/>
 					</object>
 				</object>
 				<object class="IBPartialClassDescription">
-					<reference key="className" ref="66570722"/>
-					<reference key="superclassName" ref="1388"/>
-					<nil key="actions"/>
-					<nil key="outlets"/>
+					<string key="className">NSFormatter</string>
+					<string key="superclassName">NSObject</string>
 					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<reference key="majorKey" ref="1390"/>
-						<reference key="minorKey" ref="110719282"/>
+						<string key="majorKey">IBUserSource</string>
+						<string key="minorKey"/>
 					</object>
 				</object>
 				<object class="IBPartialClassDescription">
-					<string key="className">NSFormatter</string>
-					<reference key="superclassName" ref="1388"/>
-					<nil key="actions"/>
-					<nil key="outlets"/>
+					<string key="className">X11Controller</string>
+					<string key="superclassName">NSObject</string>
 					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<reference key="majorKey" ref="1390"/>
-						<reference key="minorKey" ref="110719282"/>
+						<string key="majorKey">IBUserSource</string>
+						<string key="minorKey"/>
 					</object>
 				</object>
 			</object>
@@ -4052,863 +4060,5 @@ Zm9yIGV4ZWN1dGFkby4</string>
 		<int key="IBDocument.localizationMode">0</int>
 		<string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
 		<int key="IBDocument.defaultPropertyAccessControl">1</int>
-		<object class="NSMutableData" key="IBDocument.RunnableNib">
-			<bytes key="NS.bytes">YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA
-AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEDmwALAAwAMQA1ADkAQABD
-AEQASABMAJQAnACsALMAtAC1ALoAuwC8AL8AwwDEAMcAygDLAMwA0ADVAOMA6QDqAQYBBwEOAQ8BEgEW
-ARcBFgEbAR4BHwEjASkBKgEtATIBNwE4AT0BSQFUAVUBVgFaAV8BaAFvAXABdAF2AXcBfAGDAYgBiQGS
-AZMBlAGZAaEBpwGoAbMBtAG2AbcBvAHDAcQBxQHKAdEB0gHbAdwB4QHoAe0B7gIFAgkCCwIYAhwCHQIe
-AiECKAIyAh0CMwI9Ah0CPgJIAh0CSQJNAlACVQJdAmICYwJkAmUCagJxAnICcwJ4AnkCfgKFAoYCjwKQ
-ApUCnAKdAqYCpwKoAq0CsgK5AroCwwLEAsUCygLTAtcC2ALdAuQC5QLmAucC7ALzAvkC+gMDAwQDBQMK
-AwsDEAMXAxwDHQMmAycDLAMzAzQDNQM2AzsDRANFA0oDSwNQA1EDVgNdA14DZwNoA20DdAN1A3oDgQOC
-A4sDjAORA5kDmgObA6ADoQOmA60DrgO3A7gDuQO+A78DxAPLA88D0APRA9YD3QPeA+gD6QPuA/gD+QP6
-A/4EAAQFBAYECQQMBA8EEAQVBBwEHQQmBCcEKQQqBC8ENgQ3BDgEPQRCBEkESgRRBFIEUwRYBFkEXQRk
-BGgEaQRqBGsEcAR1BHoEgQSCBIMEhASJBJAEkQSSBJcEngSfBKgEqQSuBK8EtAS7BLwExQTGBMsE0gTT
-BNwE3QTeBOME6gTrBOwE7QTyBPcE/gT/BQgFCQUKBQ8FKwU6BTsFQgVLBUwFTwVUBWkFagVtBXMFhQWM
-BY0FkAWVBZYFmQWjBaQFpwWqBbMFuQW6BcIFywXRBdIF1wXYBeIF5gXrBewF8QXyBfUF9wX4Bf0F/gYD
-AxwGCgYTBhQGGQYaBh8GIAYlBiYGKwYsBjEGMgY3Bj4GPwZHBkgGSgZLBlAGUQZWBlcGXAZdBmIGYwZo
-BoAGgQaCBoMGhgaHBowGkAaeBqIGqwayBrMGuwa8BsMGxAbMBs0G1AbVBt0G3gbfBuEG4gbqBvMG9gb3
-BvoHAQcEBw8HFgcXBx8HIAcnBygHMAcxBzgHOQdBB0IHSQdKB1IG3gdTB1QHWwddB2gHbwdwB3cG3gd4
-B3kHgAeCB4sHkgeTB5oHmweiB6MHqgerB7IHswe6Bt4Huwe8B8IHygfRB9IH2gfbB+IH4wfrB+wH8wf0
-B/wG3gf9B/4IAAgBCAIIAwgECAcICAgNCBIIGQgaCBsIHAghCCYIJwgvCDgBVQg5CEgIUQhaAVUIWwhg
-CGMIZAhtCHYIfwiAAVUIiQiOCJcBVQiYCJwIpQFVCKYIsgi7CMMIxAjFCM4IzwjYAVUI2QjdCN4I3wjk
-COUI6gjrCYIJiwmMCY0JkAmYCZwJnQmgCagJqQmtCa4JrwmyCbkJugnGCccJyAaGCAEIAgnKCcsAOAnO
-CdAKZwr/C5cLmAuZC5oLmwucC50LngufC6ALoQuiC6MLpAulC6YLpwuoC6kLqgurC6wLrQuuC68LsAux
-C7ILswu0C7ULtgu3C7gLuQu6C7sLvAu9C74LvwvAC8ELwgvDC8QLxQvGC8cLyAvJC8oLywvMC80LzgvP
-C9AL0QvSC9ML1AvVC9YL1wvYC9kL2gvbC9wL3QveC98L4AvhC+IL4wvkC+UL5gvnC+gL6QvqC+sL7Avt
-C+4L7wvwC/EL8gvzC/QL9Qv2C/cL+Av5C/oL+wv8C/0GhQv+C/8MAAwBDAIMAwwEDAUMBgwHDAgMCQwK
-DAsMDAwNDA4MDwwQDBEMEgwTDBQMFQwWDBcMGAwZDBoMGwwcDB0MHgwfDCAMIQwiDCMMJAwlDCYMJwwo
-DCkMLAwvDQwN6Q3qDesN7A3tDe4N7w3wDfEN8g3zDfQN9Q32DfcN+A35DfoN+w38Df0N/g3/DgAOAQ4C
-DgMOBA4FDgYOBw4IDgkOCg4LDgwODQ4ODg8OEA4RDhIOEw4UDhUOFg4XDhgOGQ4aDhsOHA4dDh4OHw4g
-DiEOIg4jDiQOJQ4mDicOKA4pDioOKw4sDi0OLg4vDjAOMQ4yDjMONA41DjYONw44DjkOOg47DjwOPQ4+
-Dj8OQA5BDkIOQw5EDkUORg5HDkgOSQ5KDksOTA5NDk4OTw5QDlEOUg5TDlQOVQ5WDlcOWA5ZDloOWw5c
-Dl0OXg5fDmAOYQ5iDmMOZA5lDmYOZw5oDmkOag5rDmwObQ5uDm8OcA5xDnIOcw50DnUOdg53DngOeQ56
-DnsOfA59Dn4Ofw6ADoEOgg6DDoQOhQ6GDocOiA6JDooOiw6MAkcOjQ6ODo8OkA6RDpIOkw6UDpUOlg6X
-DpgOmQ6aDpsOnA6dDp4Onw6gDqEOog6jDqQOpQ6mDqcOqA6pDqoOqw6sDq0Org6vDrAOsQ6yDrMOtA61
-DrYOtw64DrkOug67DrwOvQ6+Dr8OwA7BDsIOxQ7IDstVJG51bGzfEBIADQAOAA8AEAARABIAEwAUABUA
-FgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADBWTlNSb290
-ViRjbGFzc11OU09iamVjdHNLZXlzXxAPTlNDbGFzc2VzVmFsdWVzXxAZTlNBY2Nlc3NpYmlsaXR5T2lk
-c1ZhbHVlc11OU0Nvbm5lY3Rpb25zW05TTmFtZXNLZXlzW05TRnJhbWV3b3JrXU5TQ2xhc3Nlc0tleXNa
-TlNPaWRzS2V5c11OU05hbWVzVmFsdWVzXxAZTlNBY2Nlc3NpYmlsaXR5Q29ubmVjdG9yc11OU0ZvbnRN
-YW5hZ2VyXxAQTlNWaXNpYmxlV2luZG93c18QD05TT2JqZWN0c1ZhbHVlc18QF05TQWNjZXNzaWJpbGl0
-eU9pZHNLZXlzWU5TTmV4dE9pZFxOU09pZHNWYWx1ZXOAAoEDmoECB4ECuoEDmYAJgQIkgAaBArmBAruB
-AiWBA5eAAIAHgQIjgQOYEgAElb2BArzSAA4AMgAzADRbTlNDbGFzc05hbWWABYAD0gAOADYANwA4WU5T
-LnN0cmluZ4AEXU5TQXBwbGljYXRpb27SADoAOwA8AD1YJGNsYXNzZXNaJGNsYXNzbmFtZaMAPQA+AD9f
-EA9OU011dGFibGVTdHJpbmdYTlNTdHJpbmdYTlNPYmplY3TSADoAOwBBAEKiAEIAP15OU0N1c3RvbU9i
-amVjdF8QEElCQ29jb2FGcmFtZXdvcmvSAA4ARQBGAEdaTlMub2JqZWN0c4AIoNIAOgA7AEkASqMASgBL
-AD9cTlNNdXRhYmxlU2V0VU5TU2V00gAOAEUATQBOgDqvEEUATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoA
-WwBcAF0AXgBfAGAAYQBiAGMAZABlAGYAZwBoAGkAagBrAGwAbQBuAG8AcABxAHIAcwB0AHUAdgB3AHgA
-eQB6AHsAfAB9AH4AfwCAAIEAggCDAIQAhQCGAIcAiACJAIoAiwCMAI0AjgCPAJAAkQCSAJOACoAagC2A
-PYBEgEyAUIBVgG2Ac4B3gHmAfoCEgIWAi4CPgJSAm4CdgKOAqICrgK2Ar4C0gLeAvIDAgMKAyIDKgM+A
-4IDngOuA7IDygPSA+oD7gPyBAQGBAQWBAQqBAQyBARGBAReBARyBAR2BASOBAU2BAU+BAVSBAVaBAViB
-AVqBAVyBAV6BAWWBAWeBAWmBAWuBAW2BAdOBAdSBAdmBAgOBAgXUAA4AlQCWAJcAmACZAJoAm11OU0Rl
-c3RpbmF0aW9uWE5TU291cmNlV05TTGFiZWyAGYAWgAuAGNgADgCdAJ4AnwCgAKEAogCjAKQApQCmAKcA
-qACpAKoAq1dOU1RpdGxlXxARTlNLZXlFcXVpdk1vZE1hc2taTlNLZXlFcXVpdl1OU01uZW1vbmljTG9j
-WU5TT25JbWFnZVxOU01peGVkSW1hZ2VWTlNNZW51gBWADRIAEgEKgA4Sf////4APgBOADNQADgCdAK0A
-rgCvALAAsQCyVk5TTmFtZVtOU01lbnVJdGVtc4A7gQH0gQH8gQH2XxAkUGVyY29ycmVyIGphbmVsYXMg
-bm8gc2VudGlkbyBpbnZlcnNvUX7TAA4AMgC2ALcAuAC5Xk5TUmVzb3VyY2VOYW1lgBKAEIARV05TSW1h
-Z2VfEA9OU01lbnVDaGVja21hcmvSADoAOwC9AL6iAL4AP18QEE5TQ3VzdG9tUmVzb3VyY2XTAA4AMgC2
-ALcAuADCgBKAEIAUXxAQTlNNZW51TWl4ZWRTdGF0ZdIAOgA7AMUAxqIAxgA/Wk5TTWVudUl0ZW3SAA4A
-MgAzAMmABYAXXVgxMUNvbnRyb2xsZXJfEBBwcmV2aW91c193aW5kb3c60gA6ADsAzQDOowDOAM8AP18Q
-FU5TTmliQ29udHJvbENvbm5lY3Rvcl5OU05pYkNvbm5lY3RvctQADgCVAJYAlwDRANIAmQDUgCyAG4AW
-gCvXANYADgDXANgA2QDaANsA3ADdAN4A3wDgAOEA3F8QD05TTmV4dFJlc3BvbmRlcldOU0ZyYW1lVk5T
-Q2VsbFhOU3ZGbGFnc1lOU0VuYWJsZWRbTlNTdXBlcnZpZXeAHIAqgB2AHhEBAAmAHNUA1gAOANcA5ADZ
-ACsA5gDnAOgA4FpOU1N1YnZpZXdzgACBAYaBAamBAaRfEBV7ezM0LCA5Nn0sIHs0MDksIDIzfX3eAOsA
-DgDsAO0A7gDvAPAA8QDyAPMA9AD1APYA9wD4APkA+gD7APwA/QD+APoBAAEBANIBAwEEAQVbTlNDZWxs
-RmxhZ3NfEBNOU0FsdGVybmF0ZUNvbnRlbnRzXU5TTm9ybWFsSW1hZ2VfEBJOU1BlcmlvZGljSW50ZXJ2
-YWxeTlNCdXR0b25GbGFnczJfEBBOU0FsdGVybmF0ZUltYWdlXxAPTlNLZXlFcXVpdmFsZW50Wk5TQ29u
-dGVudHNZTlNTdXBwb3J0XU5TQ29udHJvbFZpZXdfEA9OU1BlcmlvZGljRGVsYXlcTlNDZWxsRmxhZ3My
-XU5TQnV0dG9uRmxhZ3MSBAH+AIApgCiAIxAZEAKAJYAogB+AIIAbEMgQABJIPFH/bxA0AEEAYwB0AHUA
-YQBsAGkAegBhAHIAIABDAEwASQBQAEIATwBBAFIARAAgAHEAdQBhAG4AZABvACAAYQAgAOEAcgBlAGEA
-IABkAGUAIABjAG8AbABhAGcAZQBtACAAbQB1AGQAYQByAC7UAA4BCACtAQkBCgELAQwBDVZOU1NpemVY
-TlNmRmxhZ3OAIiNAKgAAAAAAAIAhEQQUXEx1Y2lkYUdyYW5kZdIAOgA7ARABEaIBEQA/Vk5TRm9udNMA
-DgAyALYAtwC4ARWAEoAQgCRYTlNTd2l0Y2jSAA4BGAEZARpbTlNJbWFnZU5hbWWAJ4Am0gA6ADsBHAEd
-ogEdAD9fEBNOU0J1dHRvbkltYWdlU291cmNlUNIAOgA7ASABIaQBIQEiANgAP1xOU0J1dHRvbkNlbGxc
-TlNBY3Rpb25DZWxs0gA6ADsBJAElpQElASYBJwEoAD9YTlNCdXR0b25ZTlNDb250cm9sVk5TVmlld1tO
-U1Jlc3BvbmRlcl8QHHN5bmNfcGFzdGVib2FyZF90b19jbGlwYm9hcmTSADoAOwErASyjASwAzwA/XxAU
-TlNOaWJPdXRsZXRDb25uZWN0b3LUAA4AlQCWAJcA0QEvAB8BMYAsgC6AAoA81AAOAJ0ArQCuAK8BNAD6
-ATaAO4AvgCiAMFRNZW510gAOAEUATQE6gDqiATsBPIAxgDLaAA4AnQCeAT4AnwE/AKAAoQCiAKMApAD6
-AUIA4QD6AOEAqACpAKoBL11OU0lzU2VwYXJhdG9yXE5TSXNEaXNhYmxlZIAVgCgSABAAAAmAKAmAD4AT
-gC7aAA4BSgCdAJ4AnwCgAKEAogCjAUsApAFNAU4BQgD6AKgAqQCqAS8BU1lOU1N1Ym1lbnVYTlNBY3Rp
-b26AFYA1gDOAKIAPgBOALoA0agBBAHAAbABpAGMAYQDnAPUAZQBzXnN1Ym1lbnVBY3Rpb2460wAOAJ0A
-rgCvAU4BWYA7gDOANtIADgBFAE0BXIA6ogFdAV6AN4A42gAOAJ0AngE+AJ8BPwCgAKEAogCjAKQA+gFC
-AOEA+gDhAKgAqQCqAU2AFYAoCYAoCYAPgBOANdgADgCdAJ4AnwCgAKEAogCjAKQBagFCAPoAqACpAKoB
-TYAVgDmAKIAPgBOANW0AUABlAHIAcwBvAG4AYQBsAGkAegBhAHIgJtIAOgA7AXEBcqMBcgFzAD9eTlNN
-dXRhYmxlQXJyYXlXTlNBcnJhedIAOgA7AXUAo6IAowA/WGRvY2tNZW511AAOAJUAlgCXAJgAmQF6AXuA
-GYAWgD6AQ9cA1gAOANcA2ADZANoA2wF9AN0BfwGAAOAA4QF9gD+AKoBAgEEJgD/VANYADgDXAOQA2QAr
-AOYBhgGHAOCAAIEBhoEBuoEBrV8QFnt7MTUsIDIxMn0sIHs0MDIsIDE4fX3eAOsADgDsAO0A7gDvAPAA
-8QDyAPMA9AD1APYA9wD4APkA+gD7APwA/QD+APoBjwEBAXoBAwEEAQWAKYAogCOAJYAogEKAIIA+XxAi
-Q2xpcXVlIGF0cmF2ZXNzYSBqYW5lbGFzIGluYWN0aXZhc15wcmVmc19jaGFuZ2VkOtQADgCVAJYAlwCY
-AJkBlwGYgBmAFoBFgEvXANYADgDXANgA2QDaANsBmgDdAZwBnQGeAOEBmoBGgCqAR4BIEQEJCYBG1QDW
-AA4A5ADZAaIAKwDmAaUA4AGmW05TRnJhbWVTaXplgACBAYaBAhaBAhdfEBd7ezM0MCwgMTU5fSwgezEy
-MywgMzJ9fd0A6wAOAOwA7gDvAPAA8QDyAPMA9AD1APYA9wD4APkA+gD8AasBAQGtAa4BAQGXAQMBsQGy
-gCmAKBABgCCASoBJgCCARRIIOAAAE/////+GgkD/V1JlbW92ZXLSAA4ANgA3AR6ABF8QEmFwcHNfdGFi
-bGVfZGVsZXRlOtQADgCVAJYAlwCYAJkBugG7gBmAFoBNgE/YAA4AnQCeAJ8AoAChAKIAowCkAb4BQgD6
-AKgAqQCqAKuAFYBOgCiAD4ATgAxfEBlQYXNzYXIgdHVkbyBwYXJhIGEgZnJlbnRlXxAPYnJpbmdfdG9f
-ZnJvbnQ61AAOAJUAlgCXAJgAmQHIAXuAGYAWgFGAQ9cA1gAOANcA2ADZANoA2wDcAN0BzQHOAOAA4QDc
-gByAKoBSgFMJgBxfEBV7ezM0LCA3MX0sIHs1NTAsIDIzfX3eAOsADgDsAO0A7gDvAPAA8QDyAPMA9AD1
-APYA9wD4APkA+gD7APwA/QD+APoB2AEBAcgBAwEEAQWAKYAogCOAJYAogFSAIIBRbxBPAEEAYwB0AHUA
-YQBsAGkAegBhAHIAIABQAFIASQBNAEEAUgBZACAAKABjAGwAaQBxAHUAZQAgAGMAbwBtACAAbwAgAGIA
-bwB0AOMAbwAgAGMAZQBuAHQAcgBhAGwAKQAgAHEAdQBhAG4AZABvACAAYQAgAOEAcgBlAGEAIABkAGUA
-IABjAG8AbABhAGcAZQBtACAAbQB1AGQAYQByAC7UAA4AlQCWAJcAmACZAd8Be4AZgBaAVoBD1wDWAA4A
-1wDYANkA2gDbAeIB4wHkAeUA4ADhAeKAV4BsgFiAWQmAV9UA1gAOANcA5ADZACsA5gHrAewA4IAAgQGG
-gQGggQGPXxAWe3s2NCwgMjAxfSwgezEzMSwgMjZ9fd8QEwDrAe8B8ADsAO4ADgDvAPAA8QDzAMYA9AHx
-AfIB8wD1APYAowD3AfQA4QGrAPoB9wH4AasB+QH6AQEB/AHfAf4A4QDhAgECAgIDAgRfEBpOU01lbnVJ
-dGVtUmVzcGVjdEFsaWdubWVudF8QD05TQXJyb3dQb3NpdGlvbl8QD05TUHJlZmVycmVkRWRnZV8QEk5T
-VXNlc0l0ZW1Gcm9tTWVudV1OU0FsdGVyc1N0YXRlE/////+EQf5ACYAoEEuAa4BagFuAIIBcgFYQAwkJ
-EQGQEQQAgF0SBoJA/9QADgEIAK0BCQEKAQsBDAIIgCKAIRAQ0gAOADYANwEegATcAgwADgCdAJ4AnwCg
-AKEAogCjAUsCDQIOAeUApAIRAUIA+gCoAKkAqgIDAhYCFwGrWE5TVGFyZ2V0VU5TVGFnV05TU3RhdGWA
-WYAVgF6AKIAPgBOAXYBfE///////////0wAOAJ0ArgCvAhoCG4A7gGCAYVpEbyBtb25pdG9yXxARX3Bv
-cFVwSXRlbUFjdGlvbjrSAA4ANgA3AiCABFpPdGhlclZpZXdz0gAOAEUATQIjgDqkAfwCJQImAieAXIBi
-gGWAaNsCDAAOAJ0AngCfAKAAoQCiAKMBSwINAeUApAIrAUIA+gCoAKkAqgIDAjACMYBZgBWAY4AogA+A
-E4BdgGQQCFkyNTYgY29yZXPbAgwADgCdAJ4AnwCgAKEAogCjAUsCDQHlAKQCNgFCAPoAqACpAKoCAwI7
-AjyAWYAVgGaAKIAPgBOAXYBnEA9YTWlsaGFyZXPbAgwADgCdAJ4AnwCgAKEAogCjAUsCDQHlAKQCQQFC
-APoAqACpAKoCAwJGAkeAWYAVgGmAKIAPgBOAXYBqEBhnAE0AaQBsAGgA9QBlAHPSADoAOwJKAkumAksC
-TAEhASIA2AA/XxARTlNQb3BVcEJ1dHRvbkNlbGxeTlNNZW51SXRlbUNlbGzSADoAOwJOAk+mAk8BJQEm
-AScBKAA/XU5TUG9wVXBCdXR0b27UAA4AlQCWAJcAmACZAlMCVIAZgBaAboBy2AAOAJ0AngCfAKAAoQCi
-AKMApAJXAlgCWQCoAKkAqgJcgBWAcBIAGAAAgHGAD4ATgG/UAA4AnQCtAK4ArwJfAmACYYA7gQHegQHr
-gQHgbxAWAEEAbAB0AGUAcgBuAGEAcgAgAGUAYwByAOMAIABjAG8AbQBwAGwAZQB0AG9RYV8QEnRvZ2ds
-ZV9mdWxsc2NyZWVuOtQADgCVAJYAlwCYAB8CaAJpgBmAAoB0gHbXAA4AnQCfAKAAoQCiAKMApAJsAPoA
-qACpAKoCXIAVgHWAKIAPgBOAb11BY2VyY2EgZG8gWDExXxAdb3JkZXJGcm9udFN0YW5kYXJkQWJvdXRQ
-YW5lbDrUAA4AlQCWAJcA0QJTAJkCd4AsgG6AFoB4XxAWdG9nZ2xlX2Z1bGxzY3JlZW5faXRlbdQADgCV
-AJYAlwCYAJkCfAF7gBmAFoB6gEPXANYADgDXANgA2QDaANsA3ADdAoECggDgAOEA3IAcgCqAe4B8CYAc
-XxAWe3szNCwgMTU5fSwgezQwOSwgMjN9fd4A6wAOAOwA7QDuAO8A8ADxAPIA8wD0APUA9gD3APgA+QD6
-APsA/AD9AP4A+gKMAQECfAEDAQQBBYApgCiAI4AlgCiAfYAggHpvEDYAQQBjAHQAdQBhAGwAaQB6AGEA
-cgAgAGEAIADhAHIAZQBhACAAZABlACAAYwBvAGwAYQBnAGUAbQAgAHEAdQBhAG4AZABvACAAbwAgAEMA
-TABJAFAAQgBPAEEAUgBEACAAbQB1AGQAYQByAC7UAA4AlQCWAJcA0QKSAJkClIAsgH+AFoCD1wDWAA4A
-1wDYANkA2gDbAX0A3QKYApkA4ADhAX2AP4AqgICAgQmAP18QFnt7MTUsIDEwN30sIHs0MDIsIDE4fX3e
-AOsADgDsAO0A7gDvAPAA8QDyAPMA9AD1APYA9wD4APkA+gD7APwA/QD+APoCowEBApIBAwEEAQWAKYAo
-gCOAJYAogIKAIIB/XxAVRm9jbyBlbSBqYW5lbGFzIG5vdmFzXxATZm9jdXNfb25fbmV3X3dpbmRvd9QA
-DgCVAJYAlwCYAJkCkgF7gBmAFoB/gEPUAA4AlQCWAJcA0QKvAJkCsYAsgIaAFoCK1wDWAA4A1wDYANkA
-2gDbAeIA3QK1ArYA4ADhAeKAV4AqgIeAiAmAV18QFnt7MTgsIDE0OX0sIHs0MDksIDIzfX3eAOsADgDs
-AO0A7gDvAPAA8QDyAPMA9AD1APYA9wD4APkA+gD7APwA/QD+APoCwAEBAq8BAwEEAQWAKYAogCOAJYAo
-gImAIICGbxASAE0AbwBkAG8AIABlAGMAcgDjACAAYwBvAG0AcABsAGUAdABvXxARZW5hYmxlX2Z1bGxz
-Y3JlZW7UAA4AlQCWAJcA0QLHAJkCyYAsgIyAFoCO2gAOAJ0AngE+AJ8BPwCgAKEAogCjAKQA+gFCAOEA
-+gDhAKgAqQCqAtKAFYAoCYAoCYAPgBOAjdMADgCdAK4ArwFOAtaAO4AzgQHuXmFwcHNfc2VwYXJhdG9y
-1AAOAJUAlgCXAJgAmQLbAtyAGYAWgJCAk9gADgCdAJ4AnwCgAKEAogCjAKQC3wFCAuAAqACpAKoAq4AV
-gJGAkoAPgBOADFlNaW5pbWl6YXJRbV8QEG1pbmltaXplX3dpbmRvdzrUAA4AlQCWAJcA0QLpAJkC64As
-gJWAFoCa1wDWAA4A1wDYANkA2gDbAu0A3QLvAvAA4ADhAu2AloAqgJeAmAmAltYA1gAOANcA5ADZANsC
-9ADmAvYC9wDgAvSBAXaBAYaBAYWBAXiBAXZfEBV7ezE4LCA5MX0sIHs0MDIsIDE4fX3eAOsADgDsAO0A
-7gDvAPAA8QDyAPMA9AD1APYA9wD4APkA+gD7APwA/QD+APoDAAEBAukBAwEEAQWAKYAogCOAJYAogJmA
-IICVbxAsAEEAYwB0AGkAdgBhAHIAIABhAHMAIABlAHEAdQBpAHYAYQBsAOoAbgBjAGkAYQBzACAAZABl
-ACAAdABlAGMAbABhAGQAbwAgAHAAYQByAGEAIABYADEAMV8QEGVuYWJsZV9rZXllcXVpdnPUAA4AlQCW
-AJcAmACZAV4DCYAZgBaAOICcXxAQYXBwc190YWJsZV9zaG93OtQADgCVAJYAlwCYAJkDDgF7gBmAFoCe
-gEPXANYADgDXANgA2QDaANsDEQDdAxMDFADgAOEDEYCfgCqAoIChCYCf1QDWAA4A1wDkANkAKwDmAxoD
-GwDggACBAYaBAcqBAb1fEBZ7ezE4LCAyMTB9LCB7NDAyLCAxOH193gDrAA4A7ADtAO4A7wDwAPEA8gDz
-APQA9QD2APcA+AD5APoA+wD8AP0A/gD6AyMBAQMOAQMBBAEFgCmAKIAjgCWAKICigCCAnm8QEwBBAHUA
-dABlAG4AdABpAGMAYQByACAAbABpAGcAYQDnAPUAZQBz1AAOAJUAlgCXAJgAHwMqAyuAGYACgKSAp9gA
-DgCdAJ4AnwCgAKEAogCjAKQDLgJYAy8AqACpAKoCXIAVgKWApoAPgBOAb28QGQBPAGMAdQBsAHQAYQBy
-ACAAbwB1AHQAcgBhAHMAIABhAHAAbABpAGMAYQDnAPUAZQBzUWhfEBZoaWRlT3RoZXJBcHBsaWNhdGlv
-bnM61AAOAJUAlgCXANEDOACZAzqALICpgBaAqtoADgCdAJ4BPgCfAT8AoAChAKIAowCkAPoBQgDhAPoA
-4QCoAKkAqgCrgBWAKAmAKAmAD4ATgAxfEBB3aW5kb3dfc2VwYXJhdG9y1AAOAJUAlgCXANEByACZA0mA
-LIBRgBaArF8QGnN5bmNfcGFzdGVib2FyZF90b19wcmltYXJ51AAOAJUAlgCXAJgAmQKvA0+AGYAWgIaA
-rl8QGmVuYWJsZV9mdWxsc2NyZWVuX2NoYW5nZWQ61AAOAJUAlgCXAJgAmQNUAXuAGYAWgLCAQ9cA1gAO
-ANcA2ADZANoA2wDcAN0DWQNaAOAA4QDcgByAKoCxgLIJgBxfEBV7ezM0LCA0Nn0sIHs1NDQsIDIzfX3e
-AOsADgDsAO0A7gDvAPAA8QDyAPMA9AD1APYA9wD4APkA+gD7APwA/QD+APoDZAEBA1QBAwEEAQWAKYAo
-gCOAJYAogLOAIICwbxBOAEEAYwB0AHUAYQBsAGkAegBhAHIAIABhACAA4QByAGUAYQAgAGQAZQAgAGMA
-bwBsAGEAZwBlAG0AIABpAG0AZQBkAGkAYQB0AGEAbQBlAG4AdABlACAAcQB1AGEAbgBkAG8AIABmAG8A
-cgAgAHMAZQBsAGUAYwBjAGkAbwBuAGEAZABvACAAdABlAHgAdABvACAAbgBvAHYAbwAu1AAOAJUAlgCX
-AJgAmQNrAwmAGYAWgLWAnNgADgCdAJ4AnwCgAKEAogCjAKQDbwFCAPoAqACpAKoC0oAVgLaAKIAPgBOA
-jV8QD1BlcnNvbmFsaXphci4uLtQADgCVAJYAlwCYAJkDeAF7gBmAFoC4gEPXANYADgDXANgA2QDaANsB
-4gDdA30DfgDgAOEB4oBXgCqAuYC6CYBXXxAVe3sxOCwgNjN9LCB7NDAyLCAxOH193gDrAA4A7ADtAO4A
-7wDwAPEA8gDzAPQA9QD2APcA+AD5APoA+wD8AP0A/gD6A4gBAQN4AQMBBAEFgCmAKIAjgCWAKIC7gCCA
-uF8QJlV0aWxpemFyIG8gZWZlaXRvIGRlIGFsZXJ0YSBkbyBzaXN0ZW1h1AAOAJUAlgCXAJgAHwOPA5CA
-GYACgL2Av9kADgCdAJ4AnwCgAKEAogCjAg0ApAOTAUIA+gCoAKkAqgJcA5iAFYC+gCiAD4ATgG8QKlxN
-b3N0cmFyIHR1ZG9fEBZ1bmhpZGVBbGxBcHBsaWNhdGlvbnM61AAOAJUAlgCXANEDVACZA5+ALICwgBaA
-wV8QGHN5bmNfcHJpbWFyeV9pbW1lZGlhdGVsedQADgCVAJYAlwDRA6MAmQOlgCyAw4AWgMfXANYADgDX
-ANgA2QDaANsBfQDdA6kDqgDgAOEBfYA/gCqAxIDFCYA/XxAWe3sxNSwgMTUxfSwgezQwMiwgMTh9fd4A
-6wAOAOwA7QDuAO8A8ADxAPIA8wD0APUA9gD3APgA+QD6APsA/AD9AP4A+gO0AQEDowEDAQQBBYApgCiA
-I4AlgCiAxoAggMNfEBFGb2NvIHNlZ3VlIG8gcmF0b18QE2ZvY3VzX2ZvbGxvd3NfbW91c2XUAA4AlQCW
-AJcA0QJ8AJkDvYAsgHqAFoDJXxAcc3luY19jbGlwYm9hcmRfdG9fcGFzdGVib2FyZNQADgCVAJYAlwCY
-AJkDwgPDgBmAFoDLgM7YAA4AnQCeAJ8AoAChAKIAowCkA8YBQgD6AKgAqQCqA8qAFYDNgCiAD4ATgMzT
-AA4AnQCuAK8DzQPOgDuBAf6BAgBcQWp1ZGEgZG8gWDExWXgxMV9oZWxwOtQADgCVAJYAlwDRA9MAmQPV
-gCyA0IAWgN/XANYADgDXANgA2QDaANsA3APYA9kD2gDgAOEA3IAcgN6A0YDSCYAcXxAWe3s0OCwgMTI1
-fSwgezUwOSwgMjh9fdgA6wAOA98A8gDzAPQA9gPgAPgD4QPiA+MD5APTA+YD518QEU5TQmFja2dyb3Vu
-ZENvbG9yW05TVGV4dENvbG9ygN2A1YDTgNSA0BIAQAAAgNpvEG0ARABlAHMAYQBjAHQAaQB2AGUAIABl
-AHMAdABhACAAbwBwAOcA4wBvACAAcwBlACAAcAByAGUAdABlAG4AZABlAHIAIAB1AHQAaQBsAGkAegBh
-AHIAIABvACAAeABjAGwAaQBwAGIAbwBhAHIAZAAsACAAbwAgAGsAbABpAHAAcABlAHIAIABvAHUAIABx
-AHUAYQBsAHEAdQBlAHIAIABvAHUAdAByAG8AIABnAGUAcwB0AG8AcgAgAGQAZQAgAGMAbABpAHAAYgBv
-AGEAcgBkACAAWAAxADEALtQADgEIAK0BCQEKA+sBDAPtgCIjQCYAAAAAAACAIREMHNUADgPvA/AD8QPy
-A/MD9AP1A/YD91dOU0NvbG9yXE5TQ29sb3JTcGFjZVtOU0NvbG9yTmFtZV1OU0NhdGFsb2dOYW1lgNmA
-2BAGgNeA1lZTeXN0ZW1cY29udHJvbENvbG9y0wAOA/AD+wPzAf4D/VdOU1doaXRlgNlLMC42NjY2NjY2
-OQDSADoAOwP/A++iA+8AP9UADgPvA/AD8QPyA/MEAgP1BAMD94DZgNyA24DWXxAQY29udHJvbFRleHRD
-b2xvctMADgPwA/sD8wH+BAiA2UIwANIAOgA7BAoEC6QECwEiANgAP18QD05TVGV4dEZpZWxkQ2VsbNIA
-OgA7BA0EDqUEDgEmAScBKAA/W05TVGV4dEZpZWxkWnN5bmNfdGV4dDHUAA4AlQCWAJcAmACZBBMEFIAZ
-gBaA4YDm1wDWAA4A1wDYANkA2gDbAZoA3QQYBBkBngDhAZqARoAqgOKA4wmARl8QF3t7MzQwLCAyMjN9
-LCB7MTIzLCAzMn193QDrAA4A7ADuAO8A8ADxAPIA8wD0APUA9gD3BB4A+QD6APwBqwEBBCIEIwEBBBMB
-AwGxAbIT/////4QB/gCAKYAogCCA5YDkgCCA4V8QEkFkaWNpb25hciBlbGVtZW50b9IADgA2ADcBHoAE
-XxAPYXBwc190YWJsZV9uZXc61AAOAJUAlgCXAJgAmQQtBC6AGYAWgOiA6tgADgCdAJ4AnwCgAKEAogCj
-AKQEMQFCAPoAqACpAKoAq4AVgOmAKIAPgBOADFRab29tXHpvb21fd2luZG93OtQADgCVAJYAlwCYAJkC
-6QF7gBmAFoCVgEPUAA4AlQCWAJcA0QQ/AJkEQYAsgO2AFoDx1wDWAA4A1wDYANkA2gDbANwD2ARFBEYA
-4ADhANyAHIDegO6A7wmAHF8QFXt7NDgsIDE0fSwgezUzNCwgMjh9fdgA6wAOA98A8gDzAPQA9gPgAPgD
-4QPiBE0D5AQ/A+YD54DdgNWA8IDUgO2A2m8QXQBEAGUAdgBpAGQAbwAgAGEAIABsAGkAbQBpAHQAYQDn
-APUAZQBzACAAZABvACAAcAByAG8AdABvAGMAbwBsAG8AIABYADEAMQAsACAAZQBzAHQAYQAgAG8AcADn
-AOMAbwAgAG4AZQBtACAAcwBlAG0AcAByAGUAIABmAHUAbgBjAGkAbwBuAGEAcgDhACAAZQBtACAAYQBs
-AGcAdQBtAGEAcwAgAGEAcABsAGkAYwBhAOcA9QBlAHMALlpzeW5jX3RleHQy1AAOAJUAlgCXANEBOwCZ
-BFeALIAxgBaA818QFWRvY2tfd2luZG93X3NlcGFyYXRvctMADgCWAJcAmARbBFyAGYD1gPnYAA4AnQCe
-AJ8AoAChAKIAowCkBF8BQgRgAKgAqQCqBGOAFYD3gPiAD4ATgPbTAA4AnQCuAK8EZgRngDuBAfCBAfJW
-Q29waWFyUWNVY29weTrUAA4AlQCWAJcAmACZA6MBe4AZgBaAw4BD1AAOAJUAlgCXAJgAmQDSAXuAGYAW
-gBuAQ9QADgCVAJYAlwCYAB8EeAR5gBmAAoD9gQEA2AAOAJ0AngCfAKAAoQCiAKMApAR8AUIEfQCoAKkA
-qgJcgBWA/oD/gA+AE4BvW1NhaXIgZG8gWDExUXFadGVybWluYXRlOtQADgCVAJYAlwCYAB8EhwSIgBmA
-AoEBAoEBBNkADgCdAJ4AnwCgAKEAogCjAg0ApASLAUIDLwCoAKkAqgJcA5iAFYEBA4CmgA+AE4BvXU9j
-dWx0YXIgbyBYMTFVaGlkZTrUAA4AlQCWAJcAmACZBJUBe4AZgBaBAQaAQ9cA1gAOANcA2ADZANoA2wDc
-AN0EmgSbAOAA4QDcgByAKoEBB4EBCAmAHF8QFnt7MTgsIDIyMn0sIHs0MDksIDIzfX3eAOsADgDsAO0A
-7gDvAPAA8QDyAPMA9AD1APYA9wD4APkA+gD7APwA/QD+APoEpQEBBJUBAwEEAQWAKYAogCOAJYAogQEJ
-gCCBAQZvEBUAQQBjAHQAaQB2AGEAcgAgAHMAaQBuAGMAcgBvAG4AaQB6AGEA5wDjAG/UAA4AlQCWAJcA
-0QFNAJkErYAsgDWAFoEBC15kb2NrX2FwcHNfbWVuddQADgCVAJYAlwCYAJkEsgF7gBmAFoEBDYBD1wDW
-AA4A1wDYANkA2gDbAeIA3QS3BLgA4ADhAeKAV4AqgQEOgQEPCYBXXxAVe3szNywgODh9LCB7NDc2LCAx
-OH193gDrAA4A7ADtAO4A7wDwAPEA8gDzAPQA9QD2APcA+AD5APoA+wD8AP0A/gD6BMIBAQSyAQMBBAEF
-gCmAKIAjgCWAKIEBEIAggQENbxBBAE0AbwBzAHQAcgBhAHIAIABhAHUAdABvAG0AYQB0AGkAYwBhAG0A
-ZQBuAHQAZQAgAGEAIABiAGEAcgByAGEAIABkAGUAIABtAGUAbgB1AHMAIABlAG0AIABtAG8AZABvACAA
-ZABlACAAZQBjAHIA4wAgAGMAbwBtAHAAbABlAHQAb9QADgCVAJYAlwDRBMgAmQTKgCyBARKAFoEBFtcA
-1gAOANcA2ADZANoA2wMRAN0EzgTPAOAA4QMRgJ+AKoEBE4EBFAmAn18QFnt7MTgsIDEzM30sIHs0MDIs
-IDE4fX3eAOsADgDsAO0A7gDvAPAA8QDyAPMA9AD1APYA9wD4APkA+gD7APwA/QD+APoE2QEBBMgBAwEE
-AQWAKYAogCOAJYAogQEVgCCBARJvECUAUABlAHIAbQBpAHQAaQByACAAbABpAGcAYQDnAPUAZQBzACAA
-ZABlACAAYwBsAGkAZQBuAHQAZQBzACAAZABhACAAcgBlAGQAZVplbmFibGVfdGNw1AAOAJUAlgCXAJgA
-mQThBOKAGYAWgQEYgQEb2AAOAJ0AngCfAKAAoQCiAKMApATlAUIE5gCoAKkAqgJcgBWBARmBARqAD4AT
-gG9vEA8AUAByAGUAZgBlAHIA6gBuAGMAaQBhAHMALgAuAC5RLFtwcmVmc19zaG93OtQADgCVAJYAlwCY
-AJkEyAF7gBmAFoEBEoBD1AAOAJUAlgCXANEE9ACZBPaALIEBHoAWgQEi1wDWAA4A1wDYANkA2gDbAu0A
-3QT6BPsA4ADhAu2AloAqgQEfgQEgCYCWXxAWe3sxOCwgMTQ2fSwgezQwMiwgMTh9fd4A6wAOAOwA7QDu
-AO8A8ADxAPIA8wD0APUA9gD3APgA+QD6APsA/AD9AP4A+gUFAQEE9AEDAQQBBYApgCiAI4AlgCiBASGA
-IIEBHm8QKQBTAGUAZwB1AGkAcgAgAGEAIABkAGkAcwBwAG8AcwBpAOcA4wBvACAAZABvACAAdABlAGMA
-bABhAGQAbwAgAGQAbwAgAHMAaQBzAHQAZQBtAGFbc3luY19rZXltYXDUAA4AlQCWAJcA0QUMAJkFDoAs
-gQEkgBaBAUzfEBMA1gUQAA4FEQUSA98FEwUUBRUFFgUXANkBogDaBRgFGQDbBRoFGwUcAQQFHQUeBR8F
-IADhBSIFIwGrBSQA4AUlAOEFJwIXBRwFKQUqXxAfTlNEcmFnZ2luZ1NvdXJjZU1hc2tGb3JOb25Mb2Nh
-bFlOU1R2RmxhZ3NcTlNIZWFkZXJWaWV3XxASTlNBbGxvd3NUeXBlU2VsZWN0XE5TQ29ybmVyVmlld18Q
-F05TSW50ZXJjZWxsU3BhY2luZ1dpZHRoXxAZTlNDb2x1bW5BdXRvcmVzaXppbmdTdHlsZV8QGE5TSW50
-ZXJjZWxsU3BhY2luZ0hlaWdodFtOU0dyaWRDb2xvcl8QHE5TRHJhZ2dpbmdTb3VyY2VNYXNrRm9yTG9j
-YWxeTlNUYWJsZUNvbHVtbnNbTlNSb3dIZWlnaHSBASWBAUsSUkCAAIEBJ4EBOQmBASsjQAgAAAAAAAAj
-QAAAAAAAAACBASYJgQFIgQElgQEvI0AxAAAAAAAA2gDWAA4A1wUsAOQA2QUtBS4A2wUvBTAFMQUyBTMF
-NAU1BQwFNwUwBQxZTlNjdkZsYWdzWU5TRG9jVmlld1lOU0JHQ29sb3JdTlNOZXh0S2V5Vmlld4EBLIEC
-D4ECDhAEgQINEQkAgQEkgQFGgQEsgQEkWnszMDEsIDE5OH3WANYADgDZAaIA2wU8BT0FPgDgBT8FPQUM
-W05TVGFibGVWaWV3gQEogQEqgQEpgQEogQEk2gDWAA4A1wUsAOQA2QUtBS4A2wUvBTAFMQVFBTMFRgU1
-BR8FNwUwBR+BASyBAg+BAhOBAhKBASeBAUaBASyBASdZezMwMSwgMTd90gA6ADsFTQVOpAVOAScBKAA/
-XxARTlNUYWJsZUhlYWRlclZpZXfVANYADgDXANkA2wUwBVEFUgDgBTCBASyBAS6BAS2BASzeANYFVQAO
-ANcFVgUUBVcA5AVYANkA2wVZBS8FWgGaBVwFXQVeBV8FIgU9BWIFYwVkAZoFZgUcBRxbTlNIU2Nyb2xs
-ZXJYTlNzRmxhZ3NfEBBOU0hlYWRlckNsaXBWaWV3XE5TU2Nyb2xsQW10c1tOU1ZTY3JvbGxlcl1OU0Nv
-bnRlbnRWaWV3gEaBAgiBAhWBAhQQMoEBK4EBKIECDE8QEEEgAABBIAAAQZgAAEGYAAARARKARoECEIEB
-JYEBJV8QFHt7MzAyLCAwfSwgezE2LCAxN3190gA6ADsFawVspAVsAScBKAA/XV9OU0Nvcm5lclZpZXfS
-AA4ARQBNBW+AOqMFcAVxBXKBATCBATuBAT/aBXQADgV1BXYFdwV4BXkFegV7BTwA4QV9BX4FfwWAAf4F
-gQWCAOEFDF5OU0lzUmVzaXplYWJsZVxOU0hlYWRlckNlbGxXTlNXaWR0aFpOU0RhdGFDZWxsXk5TUmVz
-aXppbmdNYXNrWk5TTWluV2lkdGhaTlNNYXhXaWR0aFxOU0lzRWRpdGFibGUJgQE6gQExI0BersjAAAAA
-gQE3I0BPXZFgAAAAI0CPQAAAAAAACYEBJNcA6wAOA98A8gDzAPYD4AWGBYcFiAWJA+QBBAWLEgSB/gCB
-ATaBATOBATKA1IEBNFROb21l0wAOA/AD+wPzAf4Fj4DZSzAuMzMzMzMyOTkA1QAOA+8D8APxA/ID8wQC
-A/UFkwP3gNmA3IEBNYDWXxAPaGVhZGVyVGV4dENvbG9y0gA6ADsFlwWYpQWYBAsBIgDYAD9fEBFOU1Rh
-YmxlSGVhZGVyQ2VsbNkA6wAOA98A8gDzAPQA9gWaA+AFmwPhBSAFngEBBQwCAgD6A+dfEBNOU1BsYWNl
-aG9sZGVyU3RyaW5nEhQx/kCA3YEBOYEBOIAggQEkgCiA2m8QDwBDAOkAbAB1AGwAYQAgAGQAZQAgAHQA
-ZQB4AHQAb9MADgPwA/sD8wH+BaaA2UIxANIAOgA7BagFqaIFqQA/XU5TVGFibGVDb2x1bW7aBXQADgV1
-BXYFdwV4BXkFegV7BTwA4QV9Ba0FrgWvAf4FsAWCAOEFDAmBATqBATwjQFkAAAAAAACBAT4jQEQAAAAA
-AAAJgQEk1wDrAA4D3wDyAPMA9gPgBYYFhwWIBbYD5AEEBYuBATaBATOBAT2A1IEBNFdDb21hbmRv2QDr
-AA4D3wDyAPMA9AD2BZoD4AWbA+EFIAWeAQEFDAICAPoD54DdgQE5gQE4gCCBASSAKIDa2gV0AA4FdQV2
-BXcFeAV5BXoFewU8AOEFfQXFBcYFxwH+BcgFggDhBQwJgQE6gQFAI0BRQAAAAAAAgQFEI0AkAAAAAAAA
-CYEBJNcA6wAOA98A8gDzAPYD4AD4BYcFzQXOA+QBBAWLgQE2gQFCgQFBgNSBATRWQXRhbGhv1QAOA+8D
-8APxA/ID8wUgA/UF1QP3gNmBATmBAUOA1ltoZWFkZXJDb2xvctoA6wAOA98A8gDzAPQA9gXZBZoD4AWb
-A+EFNwWeBd0FDAICAOEA+gPnXxARTlNEcmF3c0JhY2tncm91bmSA3YEBRoEBOIEBRYEBJAmAKIDa1AAO
-AQgArQEJAQoF5AEMAgiAIiNAKAAAAAAAAIAh1QAOA+8D8APxA/ID8wP0A/UF6QP3gNmA2IEBR4DWXxAW
-Y29udHJvbEJhY2tncm91bmRDb2xvctUADgPvA/AD8QPyA/MF7gP1Be8D94DZgQFKgQFJgNZZZ3JpZENv
-bG9y0wAOA/AD+wPzAf4F9IDZRDAuNQDSADoAOwX2BTylBTwBJgEnASgAP1phcHBzX3RhYmxl1AAOAJUA
-lgCXANEB3wCZBfyALIBWgBaBAU5VZGVwdGjUAA4AlQCWAJcAmACZBgEBe4AZgBaBAVCAQ9cA1gAOANcA
-2ADZANoA2wLtAN0GBgYHAOAA4QLtgJaAKoEBUYEBUgmAlt4A6wAOAOwA7QDuAO8A8ADxAPIA8wD0APUA
-9gD3APgA+QD6APsA/AD9AP4A+gYQAQEGAQEDAQQBBYApgCiAI4AlgCiBAVOAIIEBUG8QGwBTAGkAbQB1
-AGwAYQByACAAcgBhAHQAbwAgAGQAZQAgAHQAcgDqAHMAIABiAG8AdAD1AGUAc9QADgCVAJYAlwDRAS8A
-mQYYgCyALoAWgQFVWWRvY2tfbWVuddQADgCVAJYAlwDRBJUAmQYegCyBAQaAFoEBV18QD3N5bmNfcGFz
-dGVib2FyZNQADgCVAJYAlwDRAmgAmQYkgCyAdIAWgQFZXngxMV9hYm91dF9pdGVt1AAOAJUAlgCXANEA
-mQAfBiqALIAWgAKBAVtYZGVsZWdhdGXUAA4AlQCWAJcA0QN4AJkGMIAsgLiAFoEBXVt1c2Vfc3lzYmVl
-cNQADgCVAJYAlwCYAJkGNQY2gBmAFoEBX4EBZNcA1gAOANcA2ADZANoA2wGaAN0GOgY7AZ4A4QGagEaA
-KoEBYIEBYQmARl8QF3t7MzQwLCAxOTF9LCB7MTIzLCAzMn193QDrAA4A7ADuAO8A8ADxAPIA8wD0APUA
-9gD3APgA+QD6APwBqwEBBkMGRAEBBjUBAwGxAbKAKYAogCCBAWOBAWKAIIEBX1hEdXBsaWNhctIADgA2
-ADcBHoAEXxAVYXBwc190YWJsZV9kdXBsaWNhdGU61AAOAJUAlgCXANEEsgCZBk+ALIEBDYAWgQFmXxAW
-ZW5hYmxlX2Z1bGxzY3JlZW5fbWVuddQADgCVAJYAlwDRAw4AmQZVgCyAnoAWgQFoW2VuYWJsZV9hdXRo
-1AAOAJUAlgCXANEGAQCZBluALIEBUIAWgQFqXGZha2VfYnV0dG9uc9QADgCVAJYAlwDRAXoAmQZhgCyA
-PoAWgQFsXWNsaWNrX3Rocm91Z2jUAA4AlQCWAJcA0QZlAJkGZ4AsgQFugBaBAdLdBmkADgZqBmsGbAZt
-Bm4GbwZwBnEGcgZzBnQGdQZ2BncGeAZ5BnoGewZ8Bn0A/QH+Bn4Gf1xOU1dpbmRvd1ZpZXdcTlNTY3Jl
-ZW5SZWN0XxATTlNGcmFtZUF1dG9zYXZlTmFtZV1OU1dpbmRvd1RpdGxlWU5TV1RGbGFnc11OU1dpbmRv
-d0NsYXNzXxAWTlNXaW5kb3dDb250ZW50TWluU2l6ZVxOU1dpbmRvd1JlY3RfEA9OU1dpbmRvd0JhY2tp
-bmdfEBFOU1dpbmRvd1N0eWxlTWFza1lOU01pblNpemVbTlNWaWV3Q2xhc3OBAXSBAdGBAc6BAdCBAXAS
-UHgAAIEBcYEBc4EBb4EBz4EBcl8QGHt7MzE5LCAzMjh9LCB7NjMzLCAzMDh9fW8QEwBQAHIAZQBmAGUA
-cgDqAG4AYwBpAGEAcwAgAGQAbwAgAFgAMQAxV05TUGFuZWzSAA4ANgA3BoWABFRWaWV3WnszMjAsIDI0
-MH3VANYADgDkANkBogArAOYGigDgBouAAIEBhoEBdYEBzdIADgBFAE0GjoA6oQL0gQF23ADWAA4GkQUR
-ANcBEQDkANkF2QDbBpIGkwZ1BpUGlgEEBpcBAQaZAOAA4QZ1AOEGnV5OU1RhYlZpZXdJdGVtc18QFk5T
-QWxsb3dUcnVuY2F0ZWRMYWJlbHNfEBVOU1NlbGVjdGVkVGFiVmlld0l0ZW2BAXSBAcyBAYiBAYeAIIEB
-dwmBAXQJgQGJ0gAOAEUATQaggDqhAu2AltIADgBFAE0GpIA6pgYBBqYGpwLpBqkE9IEBUIEBeYEBfYCV
-gQGBgQEe1wDWAA4A1wDYANkA2gDbAu0D2AauBq8A4ADhAu2AloDegQF6gQF7CYCWXxAVe3szNiwgNTd9
-LCB7NTEwLCAyOH192QDrAA4D3wDyAPMA9AD2BZoD4AD4A+ED4ga2A+QGpgPmAPoD54DdgNWBAXyA1IEB
-eYAogNpvEIMAUwBlACAAZQBzAHQAaQB2AGUAcgBlAG0AIABhAGMAdABpAHYAYQBzACwAIABhAHMAIAB0
-AGUAYwBsAGEAcwAgAGUAcQB1AGkAdgBhAGwAZQBuAHQAZQBzACAAZABhACAAYgBhAHIAcgBhACAAZABl
-ACAAbQBlAG4AdQBzACAAcABvAGQAZQBtACAAaQBuAHQAZQByAGYAZQByAGkAcgAgAG4AYQBzACAAYQBw
-AGwAaQBjAGEA5wD1AGUAcwAgAFgAMQAxACAAcQB1AGUAIAB1AHQAaQBsAGkAegBhAG0AIABvACAAbQBv
-AGQAaQBmAGkAYwBhAGQAbwByACAATQBlAHQAYQAu1wDWAA4A1wDYANkA2gDbAu0D2Aa/BsAA4ADhAu2A
-loDegQF+gQF/CYCWXxAWe3szNiwgMTY1fSwgezUxMCwgMzl9fdkA6wAOA98A8gDzAPQA9gWaA+AA+APh
-A+IGxwPkBqcD5gD6A+eA3YDVgQGAgNSBAX2AKIDabxBrAEEAbwAgAGMAbABpAGMAYQByACwAIABtAGEA
-bgB0AGUAbgBoAGEAIABwAHIAZQBtAGkAZABhAHMAIABhAHMAIAB0AGUAYwBsAGEAcwAgAE8AcADnAOMA
-bwAgAG8AdQAgAEMAbwBtAGEAbgBkAG8AIABwAGEAcgBhACAAYQBjAHQAaQB2AGEAcgAgAG8AcwAgAGIA
-bwB0APUAZQBzACAAYwBlAG4AdAByAGEAbAAgAG8AdQAgAGQAaQByAGUAaQB0AG8AIABkAG8AIAByAGEA
-dABvAC4ACtcA1gAOANcA2ADZANoA2wLtA9gG0AbRAOAA4QLtgJaA3oEBgoEBgwmAll8QFnt7MzYsIDEy
-MX0sIHs1MTAsIDE5fX3ZAOsADgPfAPIA8wD0APYFmgPgAPgD4QPiBtgD5AapA+YA+gPngN2A1YEBhIDU
-gQGBgCiA2m8QWQBQAGUAcgBtAGkAdABlACAAcQB1AGUAIABhAGwAdABlAHIAYQDnAPUAZQBzACAAZABv
-ACAAbQBlAG4AdQAgAGQAZQAgAGUAbgB0AHIAYQBkAGEAIABzAGUAIABzAG8AYgByAGUAcABvAG4AaABh
-AG0AIABhAG8AIABhAGMAdAB1AGEAbAAgAG0AYQBwAGEAIABkAGUAIAB0AGUAYwBsAGEAcwAgAGQAbwAg
-AFgAMQAxAC5fEBZ7ezEwLCAzM30sIHs1ODcsIDI0Nn190gA6ADsG4AEnowEnASgAP18QFnt7MTMsIDEw
-fSwgezYwNywgMjkyfX3SAA4ARQBNBuSAOqUGnQbmBucG6AbpgQGJgQGNgQGigQGrgQG81gAOBusBJwbs
-A+8AlwbtBu4C7QL0A+IG8lxOU0lkZW50aWZpZXJZTlNUYWJWaWV3gQGMgQGKgJaBAXaA1YEBi9IADgA2
-ADcG9YAEUTFXRW50cmFkYdIAOgA7BvgG+aIG+QA/XU5TVGFiVmlld0l0ZW3WAA4G6wEnBuwD7wCXBu0G
-/AHiAvQD4gcAgQGMgQGOgFeBAXaA1YEBodIADgA2ADcHA4AEUTLSAA4ARQBNBwaAOqgDeAcIAd8HCgcL
-Aq8EsgcOgLiBAZCAVoEBlIEBmICGgQENgQGc1wDWAA4A1wDYANkA2gDbAeID2AcSBxMA4ADhAeKAV4De
-gQGRgQGSCYBXXxAVe3szNiwgMTV9LCB7NTIxLCA0Mn192QDrAA4D3wDyAPMA9AD2BZoD4AD4A+ED4gca
-A+QHCAPmAPoD54DdgNWBAZOA1IEBkIAogNpvEIoATwBzACAAcwBpAG4AYQBpAHMAIABzAG8AbgBvAHIA
-bwBzACAAZABvACAAWAAxADEAIAB1AHQAaQBsAGkAegBhAHIA4wBvACAAbwAgAGEAbABlAHIAdABhACAA
-cABhAGQAcgDjAG8AIABkAG8AIABzAGkAcwB0AGUAbQBhACwAIAB0AGEAbAAgAGMAbwBtAG8AIABlAHMA
-dABpAHYAZQByACAAZABlAGYAaQBuAGkAZABvACAAZQBtACAARQBmAGUAaQB0AG8AcwAgAHMAbwBuAG8A
-cgBvAHMALAAgAG4AYQBzACAAcAByAGUAZgBlAHIA6gBuAGMAaQBhAHMAIABkAG8AIABzAGkAcwB0AGUA
-bQBhAC7XANYADgDXANgA2QDaANsB4gPYByMHJADgAOEB4oBXgN6BAZWBAZYJgFdfEBV7ezE3LCAyMDV9
-LCB7NTUsIDIwfX3ZAOsADgPfAPIA8wD0APYFmgPgAPgD4QPiBysBAQcKA+YA+gPngN2A1YEBl4AggQGU
-gCiA2ldDb3JlczoK1wDWAA4A1wDYANkA2gDbAeID2Ac0BzUA4ADhAeKAV4DegQGZgQGaCYBXXxAWe3sz
-NiwgMTgzfSwgezM5MiwgMTR9fdkA6wAOA98A8gDzAPQA9gWaA+AA+APhA+IHPAPkBwsD5gD6A+eA3YDV
-gQGbgNSBAZiAKIDabxBDAEUAcwB0AGEAIABvAHAA5wDjAG8AIABlAG4AdAByAGEAcgDhACAAZQBtACAA
-dgBpAGcAbwByACAAZABhACAAcAByAPMAeABpAG0AYQAgAHYAZQB6ACAAcQB1AGUAIABvACAAWAAxADEA
-IABmAG8AcgAgAGUAeABlAGMAdQB0AGEAZABvAC7XANYADgDXANgA2QDaANsB4gPYB0UHRgDgAOEB4oBX
-gN6BAZ2BAZ4JgFdfEBZ7ezM2LCAxMTV9LCB7NTIxLCAyOH192QDrAA4D3wDyAPMA9AD2BZoD4AD4A+ED
-4gdNA+QHDgPmAPoD54DdgNWBAZ+A1IEBnIAogNpvEHgAQQBjAHQAaQB2AGEAIABhACAAagBhAG4AZQBs
-AGEAIAByAGEAaQB6ACAAZABvACAAWAAxADEALgAgAFUAdABpAGwAaQB6AGUAIABhACAAYwBvAG0AYgBp
-AG4AYQDnAOMAbwAgAGQAZQAgAHQAZQBjAGwAYQBzACAAQwBvAG0AYQBuAGQAbwAtAE8AcADnAOMAbwAt
-AEEAIABwAGEAcgBhACAAZQBuAHQAcgBhAHIAIABlACAAcwBhAGkAcgAgAGQAbwAgAG0AbwBkAG8AIABk
-AGUAIABlAGMAcgDjACAAYwBvAG0AcABsAGUAdABvAC5lAFMAYQDtAGQAYdYADgbrAScG7APvAJcG7QdW
-ANwC9APiB1qBAYyBAaOAHIEBdoDVgQGq0gAOADYANwcDgATSAA4ARQBNB1+AOqgElQdhANIByANUAnwD
-0wQ/gQEGgQGlgBuAUYCwgHqA0IDt1wDWAA4A1wDYANkA2gDbANwD2AdrB2wA4ADhANyAHIDegQGmgQGn
-CYAcXxAWe3szNiwgMTg4fSwgezU0MCwgMjh9fdgA6wAOA98A8gDzAPQA9gPgAPgD4QPiB3MD5AdhA+YD
-54DdgNWBAaiA1IEBpYDabxCBAEEAYwB0AGkAdgBhACAAbwAgAGkAdABlAG0AIABkAGUAIABtAGUAbgB1
-ACAAIgBjAG8AcABpAGEAcgAiACAAZQAgAHAAZQByAG0AaQB0AGUAIABhACAAcwBpAG4AYwByAG8AbgBp
-AHoAYQDnAOMAbwAgAGUAbgB0AHIAZQAgAGEAIADhAHIAZQBhACAAZABlACAAYwBvAGwAYQBnAGUAbQAg
-AGQAbwAgAE8AUwAgAFgAIABlACAAbwBzACAAYgB1AGYAZgBlAHIAcwAgAEMATABJAFAAQgBPAEEAUgBE
-ACAAZQAgAFAAUgBJAE0AQQBSAFkAIABkAG8AIABYADEAMQAubxAPAMEAcgBlAGEAIABkAGUAIABjAG8A
-bABhAGcAZQBt1gAOBusBJwbsA+8AlwbtB3sBfQL0A+IHf4EBjIEBrIA/gQF2gNWBAbvSAA4ANgA3BwOA
-BNIADgBFAE0HhIA6pgF6B4YDoweIApIHioA+gQGugMOBAbKAf4EBttcA1gAOANcA2ADZANoA2wF9A9gH
-jgePAOAA4QF9gD+A3oEBr4EBsAmAP18QFnt7MjMsIDE3NX0sIHs1MTksIDMxfX3YAOsADgPfAPIA8wD0
-APYD4AD4A+ED4geWA+QHhgPmA+eA3YDVgQGxgNSBAa6A2m8QggBTAGUAIABhAHMAcwBpAG4AYQBsAGEA
-cgAgAGUAcwB0AGEAIABvAHAA5wDjAG8ALAAgAGEAbwAgAGMAbABpAGMAYQByACAAbgB1AG0AYQAgAGoA
-YQBuAGUAbABhACAAaQBuAGEAYwB0AGkAdgBhACwAIABvACAAYwBsAGkAcQB1AGUAIABuAOMAbwAgAHMA
-8wAgAGEAIAB0AHIAYQB6ACAAcABhAHIAYQAgAGEAIABmAHIAZQBuAHQAZQAgAGMAbwBtAG8AIABhAGMA
-dABpAHYAYQAgAGEAIABqAGEAbgBlAGwAYQAgAGMAbwBtAHAAbABlAHQAYQBtAGUAbgB0AGUALgAg1wDW
-AA4A1wDYANkA2gDbAX0D2AeeB58A4ADhAX2AP4DegQGzgQG0CYA/XxAWe3syMywgMTI1fSwgezQ5MCwg
-MjB9fdgA6wAOA98A8gDzAPQA9gPgAPgD4QPiB6YD5AeIA+YD54DdgNWBAbWA1IEBsoDaXxBJTyBmb2Nv
-IGRhIGphbmVsYSBkbyBYMTEgc2VndWUgbyBjdXJzb3IuIElzdG8gdGVtIGFsZ3VucyBlZmVpdG9zIGFk
-dmVyc29zLtcA1gAOANcA2ADZANoA2wF9A9gHrgevAOAA4QF9gD+A3oEBt4EBuAmAP18QFXt7MjMsIDcz
-fSwgezUwOSwgMjh9fdgA6wAOA98A8gDzAPQA9gPgAPgD4QPiB7YD5AeKA+YD54DdgNWBAbmA1IEBtoDa
-bxB6AEEAIABjAHIAaQBhAOcA4wBvACAAZABlACAAdQBtAGEAIABuAG8AdgBhACAAagBhAG4AZQBsAGEA
-IABYADEAMQAgAGYAYQB6ACAAYwBvAG0AIABxAHUAZQAgAFgAMQAxAC4AYQBwAHAAIAB2AGUAbgBoAGEA
-IABwAGEAcgBhACAAcAByAGkAbQBlAGkAcgBvACAAcABsAGEAbgBvACAAKABlAG0AIAB2AGUAegAgAGQA
-ZQAgAEYAaQBuAGQAZQByAC4AYQBwAHAALAAgAFQAZQByAG0AaQBuAGEAbAAuAGEAcABwACwAIABlAHQA
-YwAuACkALldKYW5lbGFz1QAOAScG7APvAJcG7QMRAvQD4gfBgQGMgJ+BAXaA1YEBy9IADgBFAE0HxIA6
-pQMOBMgHxwfIB8mAnoEBEoEBvoEBwoEBxtcA1gAOANcA2ADZANoA2wMRA9gHzQfOAOAA4QMRgJ+A3oEB
-v4EBwAmAn18QFnt7MzYsIDE2Mn0sIHs0OTYsIDQyfX3ZAOsADgPfAPIA8wD0APYFmgPgAPgD4QPiB9UD
-5AfHA+YA+gPngN2A1YEBwYDUgQG+gCiA2m8QwwBMAGEAbgDnAGEAcgAgAG8AIABYADEAMQAgAGMAcgBp
-AGEAIABjAGgAYQB2AGUAcwAgAFgAYQB1AHQAaABvAHIAaQB0AHkAIABkAGUAIABjAG8AbgB0AHIAbwBs
-AG8AIABkAGUAIABhAGMAZQBzAHMAbwAuACAAUwBlACAAbwAgAGUAbgBkAGUAcgBlAOcAbwAgAEkAUAAg
-AGQAbwAgAHMAaQBzAHQAZQBtAGEAIABmAG8AcgAgAGEAbAB0AGUAcgBhAGQAbwAsACAAZQBzAHQAYQBz
-ACAAYwBoAGEAdgBlAHMAIABwAGUAcgBkAGUAbQAgAGEAIAB2AGEAbABpAGQAYQBkAGUALAAgAHAAbwBk
-AGUAbgBkAG8ALAAgAGEAcwBzAGkAbQAsACAAIABpAG0AcABvAHMAcwBpAGIAaQBsAGkAdABhAHIAIABh
-ACAAZQB4AGUAYwB1AOcA4wBvACAAZABhAHMAIABhAHAAbABpAGMAYQDnAPUAZQBzACAAWAAxADEALtcA
-1gAOANcA2ADZANoA2wMRA9gH3gffAOAA4QMRgJ+A3oEBw4EBxAmAn18QFXt7MzYsIDcxfSwgezQ5Niwg
-NTZ9fdkA6wAOA98A8gDzAPQA9gWaA+AA+APhA+IH5gPkB8gD5gD6A+eA3YDVgQHFgNSBAcKAKIDabxDP
-AFMAZQAgAGEAYwB0AGkAdgBhAHIAIABlAHMAdABhACAAbwBwAOcA4wBvACwAIABwAHIAZQBjAGkAcwBh
-ACAAaQBnAHUAYQBsAG0AZQBuAHQAZQAgAGQAZQAgAGEAYwB0AGkAdgBhAHIAIABhACAAbwBwAOcA4wBv
-ACAgHABBAHUAdABlAG4AdABpAGMAYQByACAAbABpAGcAYQDnAPUAZQBzIB0AIABwAGEAcgBhACAAZwBh
-AHIAYQBuAHQAaQByACAAYQAgAHMAZQBnAHUAcgBhAG4A5wBhACAAZABvACAAcwBpAHMAdABlAG0AYQAu
-ACAAUwBlACAAbgDjAG8AIABhAGMAdABpAHYAYQByACAAZQBzAHQAYQAgAG8AcADnAOMAbwAsACAAbgDj
-AG8AIABzAOMAbwAgAHAAZQByAG0AaQB0AGkAZABhAHMAIABsAGkAZwBhAOcA9QBlAHMAIABhACAAcABh
-AHIAdABpAHIAIABkAGUAIABhAHAAbABpAGMAYQDnAPUAZQBzACAAcgBlAG0AbwB0AGEAcwAu1wDWAA4A
-1wDYANkA2gDbAxED2AfvB/AA4ADhAxGAn4DegQHHgQHICYCfXxAWe3syMCwgLTE2fSwgezQwNCwgMTR9
-fdkA6wAOA98A8gDzAPQA9gWaA+AA+APhA+IH9wPkB8kD5gD6A+eA3YDVgQHJgNSBAcaAKIDabxBGAEUA
-cwB0AGEAcwAgAG8AcADnAPUAZQBzACAAZQBuAHQAcgBhAHIA4wBvACAAZQBtACAAdgBpAGcAbwByACAA
-ZABhACAAcAByAPMAeABpAG0AYQAgAHYAZQB6ACAAcQB1AGUAIABvACAAWAAxADEAIABmAG8AcgAgAGUA
-eABlAGMAdQB0AGEAZABvAC5pAFMAZQBnAHUAcgBhAG4A5wBh0gA6ADsH/wbspAbsAScBKAA/Wns2MzMs
-IDMwOH1fEBV7ezAsIDB9LCB7MTQ0MCwgODc4fX1aezMyMCwgMjYyfVl4MTFfcHJlZnPSADoAOwgFCAai
-CAYAP18QEE5TV2luZG93VGVtcGxhdGVbcHJlZnNfcGFuZWzUAA4AlQCWAJcAmACZBPQBe4AZgBaBAR6A
-Q9QADgCVAJYAlwCYAJkIEAgRgBmAFoEB1YEB2NgADgCdAJ4AnwCgAKEAogCjAKQIFAFCCBUAqACpAKoA
-q4AVgQHWgQHXgA+AE4AMVkZlY2hhclF3XWNsb3NlX3dpbmRvdzrUAA4AlQCWAJcA0QgeAB8IIIAsgQHa
-gAKBAgLUAA4AnQCtAK4ArwgjCCQIJYA7gQHbgQIBgQHcWE1haW5NZW510gAOAEUATQgpgDqlCCoIKwgs
-CC0ILoEB3YEB7IEB74EB84EB/doADgFKAJ0AngCfAKAAoQCiAKMBSwCkAlwCXwFCAPoAqACpAKoIHgg3
-gBWAb4EB3oAogA+AE4EB2oEB31NYMTHSAA4ARQBNCDuAOqwCaAThCD4IPwhAAlMIQgSHAyoDjwhGBHiA
-dIEBGIEB4YEB4oEB6IBugQHpgQECgKSAvYEB6oD92gAOAJ0AngE+AJ8BPwCgAKEAogCjAKQA+gFCAOEA
-+gDhAKgAqQCqAlyAFYAoCYAoCYAPgBOAb9oADgFKAJ0AngCfAKAAoQCiAKMBSwCkCFMIVAFCAPoAqACp
-AKoCXAhZgBWBAeWBAeOAKIAPgBOAb4EB5GgAUwBlAHIAdgBpAOcAbwBz1AAOAJ0ArQCuAK8IVAheCF+A
-O4EB44EB54EB5tIADgBFAE0IYoA6oF8QD19OU1NlcnZpY2VzTWVuddoADgCdAJ4BPgCfAT8AoAChAKIA
-owCkAPoBQgDhAPoA4QCoAKkAqgJcgBWAKAmAKAmAD4ATgG/aAA4AnQCeAT4AnwE/AKAAoQCiAKMApAD6
-AUIA4QD6AOEAqACpAKoCXIAVgCgJgCgJgA+AE4Bv2gAOAJ0AngE+AJ8BPwCgAKEAogCjAKQA+gFCAOEA
-+gDhAKgAqQCqAlyAFYAoCYAoCYAPgBOAb1xfTlNBcHBsZU1lbnXaAA4BSgCdAJ4AnwCgAKEAogCjAUsA
-pALSAU4BQgD6AKgAqQCqCB4IiIAVgI2AM4AogA+AE4EB2oEB7dIADgBFAE0Ii4A6ogLHA2uAjIC12gAO
-AUoAnQCeAJ8AoAChAKIAowFLAKQEYwRmAUIA+gCoAKkAqggeCJaAFYD2gQHwgCiAD4ATgQHagQHxZgBF
-AGQAaQDnAOMAb9IADgBFAE0ImoA6oQRbgPXaAA4BSgCdAJ4AnwCgAKEAogCjAUsApACrALABQgD6AKgA
-qQCqCB4IpIAVgAyBAfSAKIAPgBOBAdqBAfVWSmFuZWxh0gAOAEUATQiogDqpCBAC2wQtCKwIrQCaCK8B
-ugM4gQHVgJCA6IEB94EB+IALgQH7gE2AqdoADgCdAJ4BPgCfAT8AoAChAKIAowCkAPoBQgDhAPoA4QCo
-AKkAqgCrgBWAKAmAKAmAD4ATgAzYAA4AnQCeAJ8AoAChAKIAowCkCL0Ivgi/AKgAqQCqAKuAFYEB+RIA
-EAEIgQH6gA+AE4AMXxARUGVyY29ycmVyIGphbmVsYXNRYNoADgCdAJ4BPgCfAT8AoAChAKIAowCkAPoB
-QgDhAPoA4QCoAKkAqgCrgBWAKAmAKAmAD4ATgAxeX05TV2luZG93c01lbnXaAA4BSgCdAJ4AnwCgAKEA
-ogCjAUsApAPKA80BQgD6AKgAqQCqCB4I14AVgMyBAf6AKIAPgBOBAdqBAf9VQWp1ZGHSAA4ARQBNCNuA
-OqEDwoDLW19OU01haW5NZW51VG1lbnXUAA4AlQCWAJcA0QRbAJkI44AsgPWAFoECBF5jb3B5X21lbnVf
-aXRlbdQADgCVAJYAlwCYAJkIrQjpgBmAFoEB+IECBlxuZXh0X3dpbmRvdzrSAA4ARQjsCO2BAiKvEJQH
-3wIDCEYHJAKSA3gIrAcKAV4GZQVcAq8EzwY7A34EYwivAscGqQT0BD8GAQdGBR8C7QF9A6MCfAInBw4I
-KgdsBqYFMAitAJoBlwbpBLIGrwLwBwgG5wFdB68DVAhCAxQIEAEvCD4GBwPTA1oILATIB4YHiAefA8IB
-5QGaAU0B/AkuAboEEwcTBnUDjwE7AmgFcQS4B8cCmQfJBYAIHgCZAzgC0gCrA2sCgghTCC0E+wbmAw4G
-6AVmAlMHCwdhBXIBegQtA6oCJQGAAyoFDAVwAiYDEQbRBBkGwAK2B/AEWwg/AlwEhwY1CCsJYwadA9oI
-LgWvB8gC2whAAcgERgGdBHgB4gSbB48C9ASVB84HigHOBccHNQLpA8oB3wDcANIGpwDfATwE4YEBxIBd
-gQHqgQGWgH+AuIEB94EBlIA4gQFugQIIgIaBARSBAWGAuoD2gQH7gIyBAYGBAR6A7YEBUIEBnoEBJ4CW
-gD+Aw4B6gGiBAZyBAd2BAaeBAXmBASyBAfiAC4BFgQG8gQENgQF7gJiBAZCBAaKAN4EBuICwgQHpgKGB
-AdWALoEB4YEBUoDQgLKBAe+BARKBAa6BAbKBAbSAy4BZgEaANYBcgQIYgE2A4YEBkoEBdIC9gDGAdIEB
-O4EBD4EBvoCBgQHGgQE3gQHagBaAqYCNgAyAtYB8gQHlgQHzgQEggQGNgJ6BAauBAhCAboEBmIEBpYEB
-P4A+gOiAxYBigEGApIEBJIEBMIBlgJ+BAYOA44EBf4CIgQHIgPWBAeKAb4EBAoEBX4EB7IECIIEBiYDS
-gQH9gQE+gQHCgJCBAeiAUYDvgEiA/YBXgQEIgQGwgQF2gQEGgQHAgQG2gFOBAUSBAZqAlYDMgFaAHIAb
-gQF9gB6AMoEBGNkA1gIMAA4A1wVWANkBSwDbCYMFMAUwCYYJhwGrAOAJiAUwCYpZTlNQZXJjZW50gQEs
-gQEsgQILgQIJgQIKgQEsIz/mCGTAAAAAXxAVe3sxLCAyMTV9LCB7MzAxLCAxNX19XF9kb1Njcm9sbGVy
-OtIAOgA7CY4Jj6UJjwEmAScBKAA/Wk5TU2Nyb2xsZXLSAA4ARQBNCZKAOqUFHAVmBVwFPQUigQElgQIQ
-gQIIgQEogQEr0gAOAEUATQmagDqhBQyBASRfEBV7ezEsIDE3fSwgezMwMSwgMTk4fX3SADoAOwmeCZ+k
-CZ8BJwEoAD9aTlNDbGlwVmlld9gA1gIMAA4A1wDZAUsA2wmDBTAFMAmGCaQA4AmIBTAJp4EBLIEBLIEC
-C4ECEYECCoEBLCM/79ZqYAAAAF8QFnt7MzAyLCAxN30sIHsxNSwgMTk4fX3SAA4ARQBNCauAOqEFH4EB
-J18QE3t7MSwgMH0sIHszMDEsIDE3fX1fEBZ7ezIwLCAyMH0sIHszMTgsIDIzMX190gA6ADsJsAmxpAmx
-AScBKAA/XE5TU2Nyb2xsVmlld9IADgBFAE0JtIA6pAY1AZcFMAQTgQFfgEWBASyA4Vp7NDc3LCAyNzF9
-3QZpAA4GagZrBmwGbQZuBm8GcAZxBnIGcwZ0AZoGdgm9Cb4JvwZ6BnsJwQnCAP0JwwnECcWARoEB0YEC
-HYECH4ECGoEBcYECHIECGRALgQIegQIbXxAYe3szNjAsIDQwMH0sIHs0NzcsIDI3MX19bxAVAE0AZQBu
-AHUAIABBAHAAbABpAGMAYQDnAOMAbwAgAGQAbwAgAFgAMQAx0gAOADYANwaFgARYeDExX2FwcHPSAA4A
-MgAzCc2ABYECIdIAOgA7Cc8Bc6IBcwA/0gAOAEUI7AnSgQIirxCUB8gB5QJcBwoBfQHiAKsB4gFNAB8F
-MAHiBMgGNQN4CCwAqwLSAu0C7QDcAu0HDgUwBp0G6AF9ANwCAwHiCB4HYQLtAZoAqwCrAZoC9AHiBqYC
-6QHiAvQBTQeKANwCXAMOAKsAHwJcBgEA3ANUCB4DEQF9AX0HiAPKAd8JLgE8AgMAHwCrAZoHCAZlAlwB
-LwJcBQwEsgMRApIDEQVwAB8AHwCrCCsILQLSAnwIPwgeBPQC9AMRAvQFMAJcAeIA3AUMAX0AqwOjAgMB
-egJcBTAFDAIDBukGqQQTBqcCrwfJBGMCXAgqAlwBmggeAB8C9APTCB4FcQMRAKsCXADcBD8BlwJcBuYE
-lQeGBnUA3AfHAX0ByAVyBwsC7QguAeIG5wDcAu0A0gEvAlyBAcKAWYBvgQGUgD+AV4AMgFeANYACgQEs
-gFeBARKBAV+AuIEB74AMgI2AloCWgByAloEBnIEBLIEBiYEBq4A/gByAXYBXgQHagQGlgJaARoAMgAyA
-RoEBdoBXgQF5gJWAV4EBdoA1gQG2gByAb4CegAyAAoBvgQFQgByAsIEB2oCfgD+AP4EBsoDMgFaBAhiA
-MoBdgAKADIBGgQGQgQFugG+ALoBvgQEkgQENgJ+Af4CfgQEwgAKAAoAMgQHsgQHzgI2AeoEB4oEB2oEB
-HoEBdoCfgQF2gQEsgG+AV4AcgQEkgD+ADIDDgF2APoBvgQEsgQEkgF2BAbyBAYGA4YEBfYCGgQHGgPaA
-b4EB3YBvgEaBAdqAAoEBdoDQgQHagQE7gJ+ADIBvgByA7YBFgG+BAY2BAQaBAa6BAXSAHIEBvoA/gFGB
-AT+BAZiAloEB/YBXgQGigByAloAbgC6Ab9IADgBFCOwKaYECIq8QlQffAgMIRgckApIBXgisA3gHCgZl
-BVwCrwTPBjsDfgRjCK8CxwQ/BqkE9AUfBgEHRgLtAX0DowJ8Bw4CJwgqAZcFMAamCK0AmgdsBukEsgav
-AvAHCAbnAV0DVAevCEIBLwgQAxQIPgYHA9MDWggsBMgHhgeIB58DwgHlAZoBTQH8CS4BugQTBxMGdQOP
-ATsCaAVxBLgHxwKZB8kFgAgeAJkDOALSAKsDawKCCFMILQT7BuYG6AMOAB8CUwVmBXIHYQcLBC0BegOq
-AiUBgAMqBQwFcAMRAiYG0QQZArYGwAfwBFsGNQJcCD8EhwgrCWMGnQPaCC4FrwfIAtsIQAGdAcgERgR4
-AeIFxwSVAvQEmweKB84BzgePANIBPAPKANwB3wLpBqcA3wc1BOGBAcSAXYEB6oEBloB/gDiBAfeAuIEB
-lIEBboECCICGgQEUgQFhgLqA9oEB+4CMgO2BAYGBAR6BASeBAVCBAZ6AloA/gMOAeoEBnIBogQHdgEWB
-ASyBAXmBAfiAC4EBp4EBvIEBDYEBe4CYgQGQgQGigDeAsIEBuIEB6YAugQHVgKGBAeGBAVKA0ICygQHv
-gQESgQGugQGygQG0gMuAWYBGgDWAXIECGIBNgOGBAZKBAXSAvYAxgHSBATuBAQ+BAb6AgYEBxoEBN4EB
-2oAWgKmAjYAMgLWAfIEB5YEB84EBIIEBjYEBq4CegAKAboECEIEBP4EBpYEBmIDogD6AxYBigEGApIEB
-JIEBMICfgGWBAYOA44CIgQF/gQHIgPWBAV+Ab4EB4oEBAoEB7IECIIEBiYDSgQH9gQE+gQHCgJCBAeiA
-SIBRgO+A/YBXgQFEgQEGgQF2gQEIgQG2gQHAgFOBAbCAG4AygMyAHIBWgJWBAX2AHoEBmoEBGNIADgBF
-COwLAYECIq8QlQsCCwMLBAsFCwYLBwsICwkLCgsLCwwLDQsOCw8LEAsRCxILEwsUCxULFgsXCxgLGQsa
-CxsLHAsdCx4LHwsgCyELIgsjCyQLJQsmCycLKAspCyoLKwssCy0LLgsvCzALMQsyCzMLNAs1CzYLNws4
-CzkLOgs7CzwLPQs+Cz8LQAtBC0ILQwtEC0ULRgtHC0gLSQtKC0sLTAtNC04LTwgjAMkLUgtTC1QLVQtW
-C1cLWAtZC1oLWwtcC10LXgtfC2ALYQtiC2MLZAtlC2YLZwtoC2kLagtrC2wLbQtuC28LcAtxC3ILcwt0
-C3ULdgt3C3gLeQt6C3sLfAt9C34LfwuAC4ELgguDC4QLhQuGC4cLiAuJC4oLiwuMC40LjguPC5ALkQuS
-C5MLlAuVC5aBAiaBAieBAiiBAimBAiqBAiuBAiyBAi2BAi6BAi+BAjCBAjGBAjKBAjOBAjSBAjWBAjaB
-AjeBAjiBAjmBAjqBAjuBAjyBAj2BAj6BAj+BAkCBAkGBAkKBAkOBAkSBAkWBAkaBAkeBAkiBAkmBAkqB
-AkuBAkyBAk2BAk6BAk+BAlCBAlGBAlKBAlOBAlSBAlWBAlaBAleBAliBAlmBAlqBAluBAlyBAl2BAl6B
-Al+BAmCBAmGBAmKBAmOBAmSBAmWBAmaBAmeBAmiBAmmBAmqBAmuBAmyBAm2BAm6BAm+BAnCBAnGBAnKB
-AnOBAduAF4ECdIECdYECdoECd4ECeIECeYECeoECe4ECfIECfYECfoECf4ECgIECgYECgoECg4EChIEC
-hYEChoECh4ECiIECiYECioECi4ECjIECjYECjoECj4ECkIECkYECkoECk4EClIEClYECloECl4ECmIEC
-mYECmoECm4ECnIECnYECnoECn4ECoIECoYECooECo4ECpIECpYECpoECp4ECqIECqYECqoECq4ECrIEC
-rYECroECr4ECsIECsYECsoECs4ECtIECtYECtoECt4ECuG8Q4QBUAGUAeAB0ACAARgBpAGUAbABkACAA
-QwBlAGwAbAAgACgAUwBlACAAYQBjAHQAaQB2AGEAcgAgAGUAcwB0AGEAIABvAHAA5wDjAG8ALAAgAHAA
-cgBlAGMAaQBzAGEAIABpAGcAdQBhAGwAbQBlAG4AdABlACAAZABlACAAYQBjAHQAaQB2AGEAcgAgAGEA
-IABvAHAA5wDjAG8AICAcAEEAdQB0AGUAbgB0AGkAYwBhAHIAIABsAGkAZwBhAOcA9QBlAHMgHQAgAHAA
-YQByAGEAIABnAGEAcgBhAG4AdABpAHIAIABhACAAcwBlAGcAdQByAGEAbgDnAGEAIABkAG8AIABzAGkA
-cwB0AGUAbQBhAC4AIABTAGUAIABuAOMAbwAgAGEAYwB0AGkAdgBhAHIAIABlAHMAdABhACAAbwBwAOcA
-4wBvACwAIABuAOMAbwAgAHMA4wBvACAAcABlAHIAbQBpAHQAaQBkAGEAcwAgAGwAaQBnAGEA5wD1AGUA
-cwAgAGEAIABwAGEAcgB0AGkAcgAgAGQAZQAgAGEAcABsAGkAYwBhAOcA9QBlAHMAIAByAGUAbQBvAHQA
-YQBzAC4AKV8QEU1lbnUgKE90aGVyVmlld3MpW1NlcGFyYXRvci0xXxAZVGV4dCBGaWVsZCBDZWxsIChD
-b3JlczoKKV8QIUNoZWNrIEJveCAoRm9jbyBlbSBqYW5lbGFzIG5vdmFzKW8QGQBNAGUAbgB1ACAASQB0
-AGUAbQAgACgAUABlAHIAcwBvAG4AYQBsAGkAegBhAHIgJgApW1NlcGFyYXRvci01XxAyQ2hlY2sgQm94
-IChVdGlsaXphciBvIGVmZWl0byBkZSBhbGVydGEgZG8gc2lzdGVtYSlfEBVTdGF0aWMgVGV4dCAoQ29y
-ZXM6CilaUHJlZnNQYW5lbF8QE0hvcml6b250YWwgU2Nyb2xsZXJvEB4AQwBoAGUAYwBrACAAQgBvAHgA
-IAAoAE0AbwBkAG8AIABlAGMAcgDjACAAYwBvAG0AcABsAGUAdABvAClvEDMAQgB1AHQAdABvAG4AIABD
-AGUAbABsACAAKABQAGUAcgBtAGkAdABpAHIAIABsAGkAZwBhAOcA9QBlAHMAIABkAGUAIABjAGwAaQBl
-AG4AdABlAHMAIABkAGEAIAByAGUAZABlAClfEBZCdXR0b24gQ2VsbCAoRHVwbGljYXIpXxA0QnV0dG9u
-IENlbGwgKFV0aWxpemFyIG8gZWZlaXRvIGRlIGFsZXJ0YSBkbyBzaXN0ZW1hKW0ATQBlAG4AdQAgACgA
-RQBkAGkA5wDjAG8AKVtTZXBhcmF0b3ItNltTZXBhcmF0b3ItOG8QawBTAHQAYQB0AGkAYwAgAFQAZQB4
-AHQAIAAoAEQAZQB2AGkAZABvACAAYQAgAGwAaQBtAGkAdABhAOcA9QBlAHMAIABkAG8AIABwAHIAbwB0
-AG8AYwBvAGwAbwAgAFgAMQAxACwAIABlAHMAdABhACAAbwBwAOcA4wBvACAAbgBlAG0AIABzAGUAbQBw
-AHIAZQAgAGYAdQBuAGMAaQBvAG4AYQByAOEAIABlAG0AIABhAGwAZwB1AG0AYQBzACAAYQBwAGwAaQBj
-AGEA5wD1AGUAcwAuAClvEGcAUwB0AGEAdABpAGMAIABUAGUAeAB0ACAAKABQAGUAcgBtAGkAdABlACAA
-cQB1AGUAIABhAGwAdABlAHIAYQDnAPUAZQBzACAAZABvACAAbQBlAG4AdQAgAGQAZQAgAGUAbgB0AHIA
-YQBkAGEAIABzAGUAIABzAG8AYgByAGUAcABvAG4AaABhAG0AIABhAG8AIABhAGMAdAB1AGEAbAAgAG0A
-YQBwAGEAIABkAGUAIAB0AGUAYwBsAGEAcwAgAGQAbwAgAFgAMQAxAC4AKW8QNQBDAGgAZQBjAGsAIABC
-AG8AeAAgACgAUwBlAGcAdQBpAHIAIABhACAAZABpAHMAcABvAHMAaQDnAOMAbwAgAGQAbwAgAHQAZQBj
-AGwAYQBkAG8AIABkAG8AIABzAGkAcwB0AGUAbQBhAClfEBFUYWJsZSBIZWFkZXIgVmlld28QJwBDAGgA
-ZQBjAGsAIABCAG8AeAAgACgAUwBpAG0AdQBsAGEAcgAgAHIAYQB0AG8AIABkAGUAIAB0AHIA6gBzACAA
-YgBvAHQA9QBlAHMAKW8QigBUAGUAeAB0ACAARgBpAGUAbABkACAAQwBlAGwAbAAgACgAQQBjAHQAaQB2
-AGEAIABhACAAagBhAG4AZQBsAGEAIAByAGEAaQB6ACAAZABvACAAWAAxADEALgAgAFUAdABpAGwAaQB6
-AGUAIABhACAAYwBvAG0AYgBpAG4AYQDnAOMAbwAgAGQAZQAgAHQAZQBjAGwAYQBzACAAQwBvAG0AYQBu
-AGQAbwAtAE8AcADnAOMAbwAtAEEAIABwAGEAcgBhACAAZQBuAHQAcgBhAHIAIABlACAAcwBhAGkAcgAg
-AGQAbwAgAG0AbwBkAG8AIABkAGUAIABlAGMAcgDjACAAYwBvAG0AcABsAGUAdABvAC4AKVZWaWV3LTRW
-Vmlldy0zXxAdQ2hlY2sgQm94IChGb2NvIHNlZ3VlIG8gcmF0bylvEEIAQwBoAGUAYwBrACAAQgBvAHgA
-IAAoAEEAYwB0AHUAYQBsAGkAegBhAHIAIABhACAA4QByAGUAYQAgAGQAZQAgAGMAbwBsAGEAZwBlAG0A
-IABxAHUAYQBuAGQAbwAgAG8AIABDAEwASQBQAEIATwBBAFIARAAgAG0AdQBkAGEAcgAuAClvEIYAUwB0
-AGEAdABpAGMAIABUAGUAeAB0ACAAKABBAGMAdABpAHYAYQAgAGEAIABqAGEAbgBlAGwAYQAgAHIAYQBp
-AHoAIABkAG8AIABYADEAMQAuACAAVQB0AGkAbABpAHoAZQAgAGEAIABjAG8AbQBiAGkAbgBhAOcA4wBv
-ACAAZABlACAAdABlAGMAbABhAHMAIABDAG8AbQBhAG4AZABvAC0ATwBwAOcA4wBvAC0AQQAgAHAAYQBy
-AGEAIABlAG4AdAByAGEAcgAgAGUAIABzAGEAaQByACAAZABvACAAbQBvAGQAbwAgAGQAZQAgAGUAYwBy
-AOMAIABjAG8AbQBwAGwAZQB0AG8ALgApbxATAE0AZQBuAHUAIABJAHQAZQBtACAAKABNAGkAbABoAPUA
-ZQBzAClfEA9NZW51IEl0ZW0gKFgxMSlfEBVQdXNoIEJ1dHRvbiAoUmVtb3ZlcilbU2Nyb2xsIFZpZXdv
-EJEAUwB0AGEAdABpAGMAIABUAGUAeAB0ACAAKABTAGUAIABlAHMAdABpAHYAZQByAGUAbQAgAGEAYwB0
-AGkAdgBhAHMALAAgAGEAcwAgAHQAZQBjAGwAYQBzACAAZQBxAHUAaQB2AGEAbABlAG4AdABlAHMAIABk
-AGEAIABiAGEAcgByAGEAIABkAGUAIABtAGUAbgB1AHMAIABwAG8AZABlAG0AIABpAG4AdABlAHIAZgBl
-AHIAaQByACAAbgBhAHMAIABhAHAAbABpAGMAYQDnAPUAZQBzACAAWAAxADEAIABxAHUAZQAgAHUAdABp
-AGwAaQB6AGEAbQAgAG8AIABtAG8AZABpAGYAaQBjAGEAZABvAHIAIABNAGUAdABhAC4AKV8QHU1lbnUg
-SXRlbSAoUGVyY29ycmVyIGphbmVsYXMpXxAwTWVudSBJdGVtIChQZXJjb3JyZXIgamFuZWxhcyBubyBz
-ZW50aWRvIGludmVyc28pbxCTAFQAZQB4AHQAIABGAGkAZQBsAGQAIABDAGUAbABsACAAKABBAGMAdABp
-AHYAYQAgAG8AIABpAHQAZQBtACAAZABlACAAbQBlAG4AdQAgACIAYwBvAHAAaQBhAHIAIgAgAGUAIABw
-AGUAcgBtAGkAdABlACAAYQAgAHMAaQBuAGMAcgBvAG4AaQB6AGEA5wDjAG8AIABlAG4AdAByAGUAIABh
-ACAA4QByAGUAYQAgAGQAZQAgAGMAbwBsAGEAZwBlAG0AIABkAG8AIABPAFMAIABYACAAZQAgAG8AcwAg
-AGIAdQBmAGYAZQByAHMAIABDAEwASQBQAEIATwBBAFIARAAgAGUAIABQAFIASQBNAEEAUgBZACAAZABv
-ACAAWAAxADEALgApbxAZAFQAYQBiACAAVgBpAGUAdwAgAEkAdABlAG0AIAAoAFMAZQBnAHUAcgBhAG4A
-5wBhAClvEE0AQwBoAGUAYwBrACAAQgBvAHgAIAAoAE0AbwBzAHQAcgBhAHIAIABhAHUAdABvAG0AYQB0
-AGkAYwBhAG0AZQBuAHQAZQAgAGEAIABiAGEAcgByAGEAIABkAGUAIABtAGUAbgB1AHMAIABlAG0AIABt
-AG8AZABvACAAZABlACAAZQBjAHIA4wAgAGMAbwBtAHAAbABlAHQAbwApbxCVAFQAZQB4AHQAIABGAGkA
-ZQBsAGQAIABDAGUAbABsACAAKABTAGUAIABlAHMAdABpAHYAZQByAGUAbQAgAGEAYwB0AGkAdgBhAHMA
-LAAgAGEAcwAgAHQAZQBjAGwAYQBzACAAZQBxAHUAaQB2AGEAbABlAG4AdABlAHMAIABkAGEAIABiAGEA
-cgByAGEAIABkAGUAIABtAGUAbgB1AHMAIABwAG8AZABlAG0AIABpAG4AdABlAHIAZgBlAHIAaQByACAA
-bgBhAHMAIABhAHAAbABpAGMAYQDnAPUAZQBzACAAWAAxADEAIABxAHUAZQAgAHUAdABpAGwAaQB6AGEA
-bQAgAG8AIABtAG8AZABpAGYAaQBjAGEAZABvAHIAIABNAGUAdABhAC4AKW8QOgBCAHUAdAB0AG8AbgAg
-AEMAZQBsAGwAIAAoAEEAYwB0AGkAdgBhAHIAIABhAHMAIABlAHEAdQBpAHYAYQBsAOoAbgBjAGkAYQBz
-ACAAZABlACAAdABlAGMAbABhAGQAbwAgAHAAYQByAGEAIABYADEAMQApbxCYAFMAdABhAHQAaQBjACAA
-VABlAHgAdAAgACgATwBzACAAcwBpAG4AYQBpAHMAIABzAG8AbgBvAHIAbwBzACAAZABvACAAWAAxADEA
-IAB1AHQAaQBsAGkAegBhAHIA4wBvACAAbwAgAGEAbABlAHIAdABhACAAcABhAGQAcgDjAG8AIABkAG8A
-IABzAGkAcwB0AGUAbQBhACwAIAB0AGEAbAAgAGMAbwBtAG8AIABlAHMAdABpAHYAZQByACAAZABlAGYA
-aQBuAGkAZABvACAAZQBtACAARQBmAGUAaQB0AG8AcwAgAHMAbwBuAG8AcgBvAHMALAAgAG4AYQBzACAA
-cAByAGUAZgBlAHIA6gBuAGMAaQBhAHMAIABkAG8AIABzAGkAcwB0AGUAbQBhAC4AKW8QHwBUAGEAYgAg
-AFYAaQBlAHcAIABJAHQAZQBtACAAKADBAHIAZQBhACAAZABlACAAYwBvAGwAYQBnAGUAbQApW1NlcGFy
-YXRvci05bxBaAEMAaABlAGMAawAgAEIAbwB4ACAAKABBAGMAdAB1AGEAbABpAHoAYQByACAAYQAgAOEA
-cgBlAGEAIABkAGUAIABjAG8AbABhAGcAZQBtACAAaQBtAGUAZABpAGEAdABhAG0AZQBuAHQAZQAgAHEA
-dQBhAG4AZABvACAAZgBvAHIAIABzAGUAbABlAGMAYwBpAG8AbgBhAGQAbwAgAHQAZQB4AHQAbwAgAG4A
-bwB2AG8ALgApbxCMAFQAZQB4AHQAIABGAGkAZQBsAGQAIABDAGUAbABsACAAKABBACAAYwByAGkAYQDn
-AOMAbwAgAGQAZQAgAHUAbQBhACAAbgBvAHYAYQAgAGoAYQBuAGUAbABhACAAWAAxADEAIABmAGEAegAg
-AGMAbwBtACAAcQB1AGUAIABYADEAMQAuAGEAcABwACAAdgBlAG4AaABhACAAcABhAHIAYQAgAHAAcgBp
-AG0AZQBpAHIAbwAgAHAAbABhAG4AbwAgACgAZQBtACAAdgBlAHoAIABkAGUAIABGAGkAbgBkAGUAcgAu
-AGEAcABwACwAIABUAGUAcgBtAGkAbgBhAGwALgBhAHAAcAAsACAAZQB0AGMALgApAC4AKVtTZXBhcmF0
-b3ItMlhEb2NrTWVudV8QEk1lbnUgSXRlbSAoRmVjaGFyKW8QIQBCAHUAdAB0AG8AbgAgAEMAZQBsAGwA
-IAAoAEEAdQB0AGUAbgB0AGkAYwBhAHIAIABsAGkAZwBhAOcA9QBlAHMAKVtTZXBhcmF0b3ItM28QKQBC
-AHUAdAB0AG8AbgAgAEMAZQBsAGwAIAAoAFMAaQBtAHUAbABhAHIAIAByAGEAdABvACAAZABlACAAdABy
-AOoAcwAgAGIAbwB0APUAZQBzAClvEHsAUwB0AGEAdABpAGMAIABUAGUAeAB0ACAAKABEAGUAcwBhAGMA
-dABpAHYAZQAgAGUAcwB0AGEAIABvAHAA5wDjAG8AIABzAGUAIABwAHIAZQB0AGUAbgBkAGUAcgAgAHUA
-dABpAGwAaQB6AGEAcgAgAG8AIAB4AGMAbABpAHAAYgBvAGEAcgBkACwAIABvACAAawBsAGkAcABwAGUA
-cgAgAG8AdQAgAHEAdQBhAGwAcQB1AGUAcgAgAG8AdQB0AHIAbwAgAGcAZQBzAHQAbwByACAAZABlACAA
-YwBsAGkAcABiAG8AYQByAGQAIABYADEAMQAuAClvEFwAQgB1AHQAdABvAG4AIABDAGUAbABsACAAKABB
-AGMAdAB1AGEAbABpAHoAYQByACAAYQAgAOEAcgBlAGEAIABkAGUAIABjAG8AbABhAGcAZQBtACAAaQBt
-AGUAZABpAGEAdABhAG0AZQBuAHQAZQAgAHEAdQBhAG4AZABvACAAZgBvAHIAIABzAGUAbABlAGMAYwBp
-AG8AbgBhAGQAbwAgAHQAZQB4AHQAbwAgAG4AbwB2AG8ALgApbxASAE0AZQBuAHUAIABJAHQAZQBtACAA
-KABFAGQAaQDnAOMAbwApbxAxAEMAaABlAGMAawAgAEIAbwB4ACAAKABQAGUAcgBtAGkAdABpAHIAIABs
-AGkAZwBhAOcA9QBlAHMAIABkAGUAIABjAGwAaQBlAG4AdABlAHMAIABkAGEAIAByAGUAZABlAClvEJAA
-UwB0AGEAdABpAGMAIABUAGUAeAB0ACAAKABTAGUAIABhAHMAcwBpAG4AYQBsAGEAcgAgAGUAcwB0AGEA
-IABvAHAA5wDjAG8ALAAgAGEAbwAgAGMAbABpAGMAYQByACAAbgB1AG0AYQAgAGoAYQBuAGUAbABhACAA
-aQBuAGEAYwB0AGkAdgBhACwAIABvACAAYwBsAGkAcQB1AGUAIABuAOMAbwAgAHMA8wAgAGEAIAB0AHIA
-YQB6ACAAcABhAHIAYQAgAGEAIABmAHIAZQBuAHQAZQAgAGMAbwBtAG8AIABhAGMAdABpAHYAYQAgAGEA
-IABqAGEAbgBlAGwAYQAgAGMAbwBtAHAAbABlAHQAYQBtAGUAbgB0AGUALgAgAClfEFdTdGF0aWMgVGV4
-dCAoTyBmb2NvIGRhIGphbmVsYSBkbyBYMTEgc2VndWUgbyBjdXJzb3IuIElzdG8gdGVtIGFsZ3VucyBl
-ZmVpdG9zIGFkdmVyc29zLilfEFtUZXh0IEZpZWxkIENlbGwgKE8gZm9jbyBkYSBqYW5lbGEgZG8gWDEx
-IHNlZ3VlIG8gY3Vyc29yLiBJc3RvIHRlbSBhbGd1bnMgZWZlaXRvcyBhZHZlcnNvcy4pXxAYTWVudSBJ
-dGVtIChBanVkYSBkbyBYMTEpXxAfUG9wIFVwIEJ1dHRvbiBDZWxsIChEbyBtb25pdG9yKV5Db250ZW50
-IFZpZXctMW8QEwBNAGUAbgB1ACAAKABBAHAAbABpAGMAYQDnAPUAZQBzACkALQAxXxAWTWVudSBJdGVt
-IChEbyBtb25pdG9yKVxFZGl0UHJvZ3JhbXNfECVNZW51IEl0ZW0gKFBhc3NhciB0dWRvIHBhcmEgYSBm
-cmVudGUpXxAgUHVzaCBCdXR0b24gKEFkaWNpb25hciBlbGVtZW50bylvEJwAVABlAHgAdAAgAEYAaQBl
-AGwAZAAgAEMAZQBsAGwAIAAoAE8AcwAgAHMAaQBuAGEAaQBzACAAcwBvAG4AbwByAG8AcwAgAGQAbwAg
-AFgAMQAxACAAdQB0AGkAbABpAHoAYQByAOMAbwAgAG8AIABhAGwAZQByAHQAYQAgAHAAYQBkAHIA4wBv
-ACAAZABvACAAcwBpAHMAdABlAG0AYQAsACAAdABhAGwAIABjAG8AbQBvACAAZQBzAHQAaQB2AGUAcgAg
-AGQAZQBmAGkAbgBpAGQAbwAgAGUAbQAgAEUAZgBlAGkAdABvAHMAIABzAG8AbgBvAHIAbwBzACwAIABu
-AGEAcwAgAHAAcgBlAGYAZQByAOoAbgBjAGkAYQBzACAAZABvACAAcwBpAHMAdABlAG0AYQAuAClcQ29u
-dGVudCBWaWV3XxAYTWVudSBJdGVtIChNb3N0cmFyIHR1ZG8pWVNlcGFyYXRvcl8QGU1lbnUgSXRlbSAo
-QWNlcmNhIGRvIFgxMSlfEBZUYWJsZSBDb2x1bW4gKENvbWFuZG8pbxBPAEIAdQB0AHQAbwBuACAAQwBl
-AGwAbAAgACgATQBvAHMAdAByAGEAcgAgAGEAdQB0AG8AbQBhAHQAaQBjAGEAbQBlAG4AdABlACAAYQAg
-AGIAYQByAHIAYQAgAGQAZQAgAG0AZQBuAHUAcwAgAGUAbQAgAG0AbwBkAG8AIABkAGUAIABlAGMAcgDj
-ACAAYwBvAG0AcABsAGUAdABvAClvENEAUwB0AGEAdABpAGMAIABUAGUAeAB0ACAAKABMAGEAbgDnAGEA
-cgAgAG8AIABYADEAMQAgAGMAcgBpAGEAIABjAGgAYQB2AGUAcwAgAFgAYQB1AHQAaABvAHIAaQB0AHkA
-IABkAGUAIABjAG8AbgB0AHIAbwBsAG8AIABkAGUAIABhAGMAZQBzAHMAbwAuACAAUwBlACAAbwAgAGUA
-bgBkAGUAcgBlAOcAbwAgAEkAUAAgAGQAbwAgAHMAaQBzAHQAZQBtAGEAIABmAG8AcgAgAGEAbAB0AGUA
-cgBhAGQAbwAsACAAZQBzAHQAYQBzACAAYwBoAGEAdgBlAHMAIABwAGUAcgBkAGUAbQAgAGEAIAB2AGEA
-bABpAGQAYQBkAGUALAAgAHAAbwBkAGUAbgBkAG8ALAAgAGEAcwBzAGkAbQAsACAAIABpAG0AcABvAHMA
-cwBpAGIAaQBsAGkAdABhAHIAIABhACAAZQB4AGUAYwB1AOcA4wBvACAAZABhAHMAIABhAHAAbABpAGMA
-YQDnAPUAZQBzACAAWAAxADEALgApXxAjQnV0dG9uIENlbGwgKEZvY28gZW0gamFuZWxhcyBub3Zhcylv
-EFQAUwB0AGEAdABpAGMAIABUAGUAeAB0ACAAKABFAHMAdABhAHMAIABvAHAA5wD1AGUAcwAgAGUAbgB0
-AHIAYQByAOMAbwAgAGUAbQAgAHYAaQBnAG8AcgAgAGQAYQAgAHAAcgDzAHgAaQBtAGEAIAB2AGUAegAg
-AHEAdQBlACAAbwAgAFgAMQAxACAAZgBvAHIAIABlAHgAZQBjAHUAdABhAGQAbwAuAClvECMAVABlAHgA
-dAAgAEYAaQBlAGwAZAAgAEMAZQBsAGwAIAAoAEMA6QBsAHUAbABhACAAZABlACAAdABlAHgAdABvACkA
-LQAyW1NlcGFyYXRvci03bxARAE0AZQBuAHUAIAAoAEEAcABsAGkAYwBhAOcA9QBlAHMAKV1NZW51IChK
-YW5lbGEpXxAbTWVudSBJdGVtIChQZXJzb25hbGl6YXIuLi4pbxBEAEIAdQB0AHQAbwBuACAAQwBlAGwA
-bAAgACgAQQBjAHQAdQBhAGwAaQB6AGEAcgAgAGEAIADhAHIAZQBhACAAZABlACAAYwBvAGwAYQBnAGUA
-bQAgAHEAdQBhAG4AZABvACAAbwAgAEMATABJAFAAQgBPAEEAUgBEACAAbQB1AGQAYQByAC4AKW8QDwBN
-AGUAbgB1ACAAKABTAGUAcgB2AGkA5wBvAHMAKV8QEk1lbnUgSXRlbSAoSmFuZWxhKW8QNwBCAHUAdAB0
-AG8AbgAgAEMAZQBsAGwAIAAoAFMAZQBnAHUAaQByACAAYQAgAGQAaQBzAHAAbwBzAGkA5wDjAG8AIABk
-AG8AIAB0AGUAYwBsAGEAZABvACAAZABvACAAcwBpAHMAdABlAG0AYQApbxAVAFQAYQBiACAAVgBpAGUA
-dwAgAEkAdABlAG0AIAAoAFMAYQDtAGQAYQApXxAXVGFiIFZpZXcgSXRlbSAoSmFuZWxhcylvEB8AQwBo
-AGUAYwBrACAAQgBvAHgAIAAoAEEAdQB0AGUAbgB0AGkAYwBhAHIAIABsAGkAZwBhAOcA9QBlAHMAKVxG
-aWxlJ3MgT3duZXJvECIATQBlAG4AdQAgAEkAdABlAG0AIAAoAEEAbAB0AGUAcgBuAGEAcgAgAGUAYwBy
-AOMAIABjAG8AbQBwAGwAZQB0AG8AKV8QEVZlcnRpY2FsIFNjcm9sbGVyXxAVVGFibGUgQ29sdW1uIChB
-dGFsaG8pbxCPAFMAdABhAHQAaQBjACAAVABlAHgAdAAgACgAQQBjAHQAaQB2AGEAIABvACAAaQB0AGUA
-bQAgAGQAZQAgAG0AZQBuAHUAIAAiAGMAbwBwAGkAYQByACIAIABlACAAcABlAHIAbQBpAHQAZQAgAGEA
-IABzAGkAbgBjAHIAbwBuAGkAegBhAOcA4wBvACAAZQBuAHQAcgBlACAAYQAgAOEAcgBlAGEAIABkAGUA
-IABjAG8AbABhAGcAZQBtACAAZABvACAATwBTACAAWAAgAGUAIABvAHMAIABiAHUAZgBmAGUAcgBzACAA
-QwBMAEkAUABCAE8AQQBSAEQAIABlACAAUABSAEkATQBBAFIAWQAgAGQAbwAgAFgAMQAxAC4AKW8QUQBT
-AHQAYQB0AGkAYwAgAFQAZQB4AHQAIAAoAEUAcwB0AGEAIABvAHAA5wDjAG8AIABlAG4AdAByAGEAcgDh
-ACAAZQBtACAAdgBpAGcAbwByACAAZABhACAAcAByAPMAeABpAG0AYQAgAHYAZQB6ACAAcQB1AGUAIABv
-ACAAWAAxADEAIABmAG8AcgAgAGUAeABlAGMAdQB0AGEAZABvAC4AKV8QEE1lbnUgSXRlbSAoWm9vbSlf
-EC5DaGVjayBCb3ggKENsaXF1ZSBhdHJhdmVzc2EgamFuZWxhcyBpbmFjdGl2YXMpXxAfQnV0dG9uIENl
-bGwgKEZvY28gc2VndWUgbyByYXRvKV8QFU1lbnUgSXRlbSAoMjU2IGNvcmVzKV8QMEJ1dHRvbiBDZWxs
-IChDbGlxdWUgYXRyYXZlc3NhIGphbmVsYXMgaW5hY3RpdmFzKW8QJQBNAGUAbgB1ACAASQB0AGUAbQAg
-ACgATwBjAHUAbAB0AGEAcgAgAG8AdQB0AHIAYQBzACAAYQBwAGwAaQBjAGEA5wD1AGUAcwApXxAiVGFi
-bGUgVmlldyAoTm9tZSwgQ29tYW5kbywgQXRhbGhvKV8QE1RhYmxlIENvbHVtbiAoTm9tZSlfEBRNZW51
-IEl0ZW0gKE1pbGhhcmVzKW8QawBUAGUAeAB0ACAARgBpAGUAbABkACAAQwBlAGwAbAAgACgAUABlAHIA
-bQBpAHQAZQAgAHEAdQBlACAAYQBsAHQAZQByAGEA5wD1AGUAcwAgAGQAbwAgAG0AZQBuAHUAIABkAGUA
-IABlAG4AdAByAGEAZABhACAAcwBlACAAcwBvAGIAcgBlAHAAbwBuAGgAYQBtACAAYQBvACAAYQBjAHQA
-dQBhAGwAIABtAGEAcABhACAAZABlACAAdABlAGMAbABhAHMAIABkAG8AIABYADEAMQAuAClfECBCdXR0
-b24gQ2VsbCAoQWRpY2lvbmFyIGVsZW1lbnRvKW8QIABCAHUAdAB0AG8AbgAgAEMAZQBsAGwAIAAoAE0A
-bwBkAG8AIABlAGMAcgDjACAAYwBvAG0AcABsAGUAdABvAClvEH0AVABlAHgAdAAgAEYAaQBlAGwAZAAg
-AEMAZQBsAGwAIAAoAEEAbwAgAGMAbABpAGMAYQByACwAIABtAGEAbgB0AGUAbgBoAGEAIABwAHIAZQBt
-AGkAZABhAHMAIABhAHMAIAB0AGUAYwBsAGEAcwAgAE8AcADnAOMAbwAgAG8AdQAgAEMAbwBtAGEAbgBk
-AG8AIABwAGEAcgBhACAAYQBjAHQAaQB2AGEAcgAgAG8AcwAgAGIAbwB0APUAZQBzACAAYwBlAG4AdABy
-AGEAbAAgAG8AdQAgAGQAaQByAGUAaQB0AG8AIABkAG8AIAByAGEAdABvAC4ACgApbxBYAFQAZQB4AHQA
-IABGAGkAZQBsAGQAIABDAGUAbABsACAAKABFAHMAdABhAHMAIABvAHAA5wD1AGUAcwAgAGUAbgB0AHIA
-YQByAOMAbwAgAGUAbQAgAHYAaQBnAG8AcgAgAGQAYQAgAHAAcgDzAHgAaQBtAGEAIAB2AGUAegAgAHEA
-dQBlACAAbwAgAFgAMQAxACAAZgBvAHIAIABlAHgAZQBjAHUAdABhAGQAbwAuAClfEBJNZW51IEl0ZW0g
-KENvcGlhcilfEBZQdXNoIEJ1dHRvbiAoRHVwbGljYXIpWk1lbnUgKFgxMSlvEBQATQBlAG4AdQAgAEkA
-dABlAG0AIAAoAFMAZQByAHYAaQDnAG8AcwApXxAZTWVudSBJdGVtIChPY3VsdGFyIG8gWDExKW8QFgBN
-AGUAbgB1ACAASQB0AGUAbQAgACgAQQBwAGwAaQBjAGEA5wD1AGUAcwApW0FwcGxpY2F0aW9uXxAXVGFi
-IFZpZXcgSXRlbSAoRW50cmFkYSlvEH8AVABlAHgAdAAgAEYAaQBlAGwAZAAgAEMAZQBsAGwAIAAoAEQA
-ZQBzAGEAYwB0AGkAdgBlACAAZQBzAHQAYQAgAG8AcADnAOMAbwAgAHMAZQAgAHAAcgBlAHQAZQBuAGQA
-ZQByACAAdQB0AGkAbABpAHoAYQByACAAbwAgAHgAYwBsAGkAcABiAG8AYQByAGQALAAgAG8AIABrAGwA
-aQBwAHAAZQByACAAbwB1ACAAcQB1AGEAbABxAHUAZQByACAAbwB1AHQAcgBvACAAZwBlAHMAdABvAHIA
-IABkAGUAIABjAGwAaQBwAGIAbwBhAHIAZAAgAFgAMQAxAC4AKV8QEU1lbnUgSXRlbSAoQWp1ZGEpbxAh
-AFQAZQB4AHQAIABGAGkAZQBsAGQAIABDAGUAbABsACAAKABDAOkAbAB1AGwAYQAgAGQAZQAgAHQAZQB4
-AHQAbwApbxDdAFMAdABhAHQAaQBjACAAVABlAHgAdAAgACgAUwBlACAAYQBjAHQAaQB2AGEAcgAgAGUA
-cwB0AGEAIABvAHAA5wDjAG8ALAAgAHAAcgBlAGMAaQBzAGEAIABpAGcAdQBhAGwAbQBlAG4AdABlACAA
-ZABlACAAYQBjAHQAaQB2AGEAcgAgAGEAIABvAHAA5wDjAG8AICAcAEEAdQB0AGUAbgB0AGkAYwBhAHIA
-IABsAGkAZwBhAOcA9QBlAHMgHQAgAHAAYQByAGEAIABnAGEAcgBhAG4AdABpAHIAIABhACAAcwBlAGcA
-dQByAGEAbgDnAGEAIABkAG8AIABzAGkAcwB0AGUAbQBhAC4AIABTAGUAIABuAOMAbwAgAGEAYwB0AGkA
-dgBhAHIAIABlAHMAdABhACAAbwBwAOcA4wBvACwAIABuAOMAbwAgAHMA4wBvACAAcABlAHIAbQBpAHQA
-aQBkAGEAcwAgAGwAaQBnAGEA5wD1AGUAcwAgAGEAIABwAGEAcgB0AGkAcgAgAGQAZQAgAGEAcABsAGkA
-YwBhAOcA9QBlAHMAIAByAGUAbQBvAHQAYQBzAC4AKV8QFU1lbnUgSXRlbSAoTWluaW1pemFyKVtTZXBh
-cmF0b3ItNF8QFUJ1dHRvbiBDZWxsIChSZW1vdmVyKW8QWwBDAGgAZQBjAGsAIABCAG8AeAAgACgAQQBj
-AHQAdQBhAGwAaQB6AGEAcgAgAFAAUgBJAE0AQQBSAFkAIAAoAGMAbABpAHEAdQBlACAAYwBvAG0AIABv
-ACAAYgBvAHQA4wBvACAAYwBlAG4AdAByAGEAbAApACAAcQB1AGEAbgBkAG8AIABhACAA4QByAGUAYQAg
-AGQAZQAgAGMAbwBsAGEAZwBlAG0AIABtAHUAZABhAHIALgApbxBvAFQAZQB4AHQAIABGAGkAZQBsAGQA
-IABDAGUAbABsACAAKABEAGUAdgBpAGQAbwAgAGEAIABsAGkAbQBpAHQAYQDnAPUAZQBzACAAZABvACAA
-cAByAG8AdABvAGMAbwBsAG8AIABYADEAMQAsACAAZQBzAHQAYQAgAG8AcADnAOMAbwAgAG4AZQBtACAA
-cwBlAG0AcAByAGUAIABmAHUAbgBjAGkAbwBuAGEAcgDhACAAZQBtACAAYQBsAGcAdQBtAGEAcwAgAGEA
-cABsAGkAYwBhAOcA9QBlAHMALgApXxAXTWVudSBJdGVtIChTYWlyIGRvIFgxMSlWVmlldy0ybxAjAFQA
-ZQB4AHQAIABGAGkAZQBsAGQAIABDAGUAbABsACAAKABDAOkAbAB1AGwAYQAgAGQAZQAgAHQAZQB4AHQA
-bwApAC0AMW8QIQBDAGgAZQBjAGsAIABCAG8AeAAgACgAQQBjAHQAaQB2AGEAcgAgAHMAaQBuAGMAcgBv
-AG4AaQB6AGEA5wDjAG8AKW8QQgBUAG8AcAAgAFQAYQBiACAAVgBpAGUAdwAgACgARQBuAHQAcgBhAGQA
-YQAsACAAUwBhAO0AZABhACwAIADBAHIAZQBhACAAZABlACAAYwBvAGwAYQBnAGUAbQAsACAASgBhAG4A
-ZQBsAGEAcwAsACAAUwBlAGcAdQByAGEAbgDnAGEAKW8QIwBCAHUAdAB0AG8AbgAgAEMAZQBsAGwAIAAo
-AEEAYwB0AGkAdgBhAHIAIABzAGkAbgBjAHIAbwBuAGkAegBhAOcA4wBvAClvEIgAUwB0AGEAdABpAGMA
-IABUAGUAeAB0ACAAKABBACAAYwByAGkAYQDnAOMAbwAgAGQAZQAgAHUAbQBhACAAbgBvAHYAYQAgAGoA
-YQBuAGUAbABhACAAWAAxADEAIABmAGEAegAgAGMAbwBtACAAcQB1AGUAIABYADEAMQAuAGEAcABwACAA
-dgBlAG4AaABhACAAcABhAHIAYQAgAHAAcgBpAG0AZQBpAHIAbwAgAHAAbABhAG4AbwAgACgAZQBtACAA
-dgBlAHoAIABkAGUAIABGAGkAbgBkAGUAcgAuAGEAcABwACwAIABUAGUAcgBtAGkAbgBhAGwALgBhAHAA
-cAAsACAAZQB0AGMALgApAC4AKW8Q1QBUAGUAeAB0ACAARgBpAGUAbABkACAAQwBlAGwAbAAgACgATABh
-AG4A5wBhAHIAIABvACAAWAAxADEAIABjAHIAaQBhACAAYwBoAGEAdgBlAHMAIABYAGEAdQB0AGgAbwBy
-AGkAdAB5ACAAZABlACAAYwBvAG4AdAByAG8AbABvACAAZABlACAAYQBjAGUAcwBzAG8ALgAgAFMAZQAg
-AG8AIABlAG4AZABlAHIAZQDnAG8AIABJAFAAIABkAG8AIABzAGkAcwB0AGUAbQBhACAAZgBvAHIAIABh
-AGwAdABlAHIAYQBkAG8ALAAgAGUAcwB0AGEAcwAgAGMAaABhAHYAZQBzACAAcABlAHIAZABlAG0AIABh
-ACAAdgBhAGwAaQBkAGEAZABlACwAIABwAG8AZABlAG4AZABvACwAIABhAHMAcwBpAG0ALAAgACAAaQBt
-AHAAbwBzAHMAaQBiAGkAbABpAHQAYQByACAAYQAgAGUAeABlAGMAdQDnAOMAbwAgAGQAYQBzACAAYQBw
-AGwAaQBjAGEA5wD1AGUAcwAgAFgAMQAxAC4AKW8QXQBCAHUAdAB0AG8AbgAgAEMAZQBsAGwAIAAoAEEA
-YwB0AHUAYQBsAGkAegBhAHIAIABQAFIASQBNAEEAUgBZACAAKABjAGwAaQBxAHUAZQAgAGMAbwBtACAA
-bwAgAGIAbwB0AOMAbwAgAGMAZQBuAHQAcgBhAGwAKQAgAHEAdQBhAG4AZABvACAAYQAgAOEAcgBlAGEA
-IABkAGUAIABjAG8AbABhAGcAZQBtACAAbQB1AGQAYQByAC4AKW8QlABUAGUAeAB0ACAARgBpAGUAbABk
-ACAAQwBlAGwAbAAgACgAUwBlACAAYQBzAHMAaQBuAGEAbABhAHIAIABlAHMAdABhACAAbwBwAOcA4wBv
-ACwAIABhAG8AIABjAGwAaQBjAGEAcgAgAG4AdQBtAGEAIABqAGEAbgBlAGwAYQAgAGkAbgBhAGMAdABp
-AHYAYQAsACAAbwAgAGMAbABpAHEAdQBlACAAbgDjAG8AIABzAPMAIABhACAAdAByAGEAegAgAHAAYQBy
-AGEAIABhACAAZgByAGUAbgB0AGUAIABjAG8AbQBvACAAYQBjAHQAaQB2AGEAIABhACAAagBhAG4AZQBs
-AGEAIABjAG8AbQBwAGwAZQB0AGEAbQBlAG4AdABlAC4AIAApbxBAAEMAaABlAGMAawAgAEIAbwB4ACAA
-KABBAGMAdAB1AGEAbABpAHoAYQByACAAQwBMAEkAUABCAE8AQQBSAEQAIABxAHUAYQBuAGQAbwAgAGEA
-IADhAHIAZQBhACAAZABlACAAYwBvAGwAYQBnAGUAbQAgAG0AdQBkAGEAcgAuAClvEBgATQBlAG4AdQAg
-AEkAdABlAG0AIAAoAEEAcABsAGkAYwBhAOcA9QBlAHMAKQAtADFcTWVudSAoQWp1ZGEpVlZpZXctMV8Q
-GVBvcHVwIEJ1dHRvbiAoRG8gbW9uaXRvcilvEDgAQwBoAGUAYwBrACAAQgBvAHgAIAAoAEEAYwB0AGkA
-dgBhAHIAIABhAHMAIABlAHEAdQBpAHYAYQBsAOoAbgBjAGkAYQBzACAAZABlACAAdABlAGMAbABhAGQA
-bwAgAHAAYQByAGEAIABYADEAMQApbxB5AFMAdABhAHQAaQBjACAAVABlAHgAdAAgACgAQQBvACAAYwBs
-AGkAYwBhAHIALAAgAG0AYQBuAHQAZQBuAGgAYQAgAHAAcgBlAG0AaQBkAGEAcwAgAGEAcwAgAHQAZQBj
-AGwAYQBzACAATwBwAOcA4wBvACAAbwB1ACAAQwBvAG0AYQBuAGQAbwAgAHAAYQByAGEAIABhAGMAdABp
-AHYAYQByACAAbwBzACAAYgBvAHQA9QBlAHMAIABjAGUAbgB0AHIAYQBsACAAbwB1ACAAZABpAHIAZQBp
-AHQAbwAgAGQAbwAgAHIAYQB0AG8ALgAKAClvEEIAQgB1AHQAdABvAG4AIABDAGUAbABsACAAKABBAGMA
-dAB1AGEAbABpAHoAYQByACAAQwBMAEkAUABCAE8AQQBSAEQAIABxAHUAYQBuAGQAbwAgAGEAIADhAHIA
-ZQBhACAAZABlACAAYwBvAGwAYQBnAGUAbQAgAG0AdQBkAGEAcgAuAClvEFUAVABlAHgAdAAgAEYAaQBl
-AGwAZAAgAEMAZQBsAGwAIAAoAEUAcwB0AGEAIABvAHAA5wDjAG8AIABlAG4AdAByAGEAcgDhACAAZQBt
-ACAAdgBpAGcAbwByACAAZABhACAAcAByAPMAeABpAG0AYQAgAHYAZQB6ACAAcQB1AGUAIABvACAAWAAx
-ADEAIABmAG8AcgAgAGUAeABlAGMAdQB0AGEAZABvAC4AKW8QGwBNAGUAbgB1ACAASQB0AGUAbQAgACgA
-UAByAGUAZgBlAHIA6gBuAGMAaQBhAHMALgAuAC4AKdIADgBFCOwMK4ECIqDSAA4ARQjsDC6BAiKg0gAO
-AEUI7AwxgQIirxDaAJAH3wIDCEYBXgcKAJEFXAKvBM8AUABVAscEPwT0AGcFHwLtA6MHDgBzB2wFMAGX
-CK0AmgCOBukEsgavBwgAZQNUCEIBLwgQCD4GBwPTB4YEyAHlAGMJLgQTAH8HEwBSAI0DjwCKAIYFcQB0
-BLgHxwgeAJkAbwCLAoIILQBgBPsAcgJTB2EFcgCIA6oCJQGAAyoFDAbRAHgEGQBiAI8H8ASHAF4AewfI
-AtsIQABsAcgAaACMBHgB4gXHBJUC9AfOAHAAeQLpA8oB3wDcAN8AaQBuByQCkgN4CKwAXABtBmUAYQCA
-AGsGOwN+BGMIrwapAIQGAQdGAIIBfQJ8AicIKgamAHwC8AbnAV0AWwevAGQDFABRAHUAkwNaCCwHiACJ
-B58DwgBPAZoBTQH8AboAfgZ1ATsCaAKZB8kAgQWAAIMAVAM4AtIAVgCrA2sIUwbmAw4G6AAfBWYHCwF6
-BC0AkgBaBXACJgMRAHoAdgbAArYAUwRbCD8CXAY1AF0IKwljAHEGnQPaAGYAfQCHCC4AWQWvAZ0ERgB3
-AFgEmwePB4oBzgBXAF8HNQDSATwAhQanBOEAaoEB1IEBxIBdgQHqgDiBAZSBAdmBAgiAhoEBFIAagFCA
-jIDtgQEegK+BASeAloDDgQGcgOyBAaeBASyARYEB+IALgQFtgQG8gQENgQF7gQGQgKuAsIEB6YAugQHV
-gQHhgQFSgNCBAa6BARKAWYCjgQIYgOGBARyBAZKAPYEBa4C9gQFlgQFYgQE7gPKBAQ+BAb6BAdqAFoDP
-gQFngHyBAfOAlIEBIIDrgG6BAaWBAT+BAVyAxYBigEGApIEBJIEBg4D8gOOAnYEB04EByIEBAoCLgQEK
-gQHCgJCBAeiAwoBRgLSBAWmA/YBXgQFEgQEGgQF2gQHAgOCBAQGAlYDMgFaAHIAegLeAyoEBloB/gLiB
-AfeAhIDIgQFugJuBAR2AwIEBYYC6gPaBAfuBAYGBAVSBAVCBAZ6BAU2AP4B6gGiBAd2BAXmBAQyAmIEB
-ooA3gH6BAbiAqIChgC2A9IECBYCygQHvgQGygQFegQG0gMuACoBGgDWAXIBNgQEXgQF0gDGAdICBgQHG
-gQEjgQE3gQFPgEyAqYCNgFWADIC1gQHlgQGNgJ6BAauAAoECEIEBmIA+gOiBAgOAeYEBMIBlgJ+BAQWA
-+oEBf4CIgESA9YEB4oBvgQFfgIWBAeyBAiCA54EBiYDSgK2BARGBAVqBAf2Ad4EBPoBIgO+A+4BzgQEI
-gQGwgQG2gFOAbYCPgQGagBuAMoEBVoEBfYEBGIC80gAOAEUI7A0OgQIirxDaDQ8NEA0RDRINEw0UDRUN
-Fg0XDRgNGQ0aDRsNHA0dDR4NHw0gDSENIg0jDSQNJQ0mDScNKA0pDSoNKw0sDS0NLg0vDTANMQ0yDTMN
-NA01DTYNNw04DTkNOg07DTwNPQ0+DT8NQA1BDUINQw1EDUUNRg1HDUgNSQ1KDUsNTA1NDU4NTw1QDVEN
-Ug1TDVQNVQ1WDVcNWA1ZDVoNWw1cDV0NXg1fDWANYQ1iDWMNZA1lDWYNZw1oDWkNag1rDWwNbQ1uDW8N
-cA1xDXINcw10DXUNdg13DXgNeQ16DXsNfA19DX4Nfw2ADYENgg2DDYQNhQ2GDYcNiA2JDYoNiw2MDY0N
-jg2PDZANkQ2SDZMNlA2VDZYNlw2YDZkNmg2bDZwNnQ2eDZ8NoA2hDaINow2kDaUNpg2nDagNqQ2qDasN
-rA2tDa4Nrw2wDbENsg2zDbQNtQ22DbcNuA25DboNuw28Db0Nvg2/DcANwQ3CDcMNxA3FDcYNxw3IDckN
-yg3LDcwNzQ3ODc8N0A3RDdIN0w3UDdUN1g3XDdgN2Q3aDdsN3A3dDd4N3w3gDeEN4g3jDeQN5Q3mDecN
-6IECvYECvoECv4ECwIECwYECwoECw4ECxIECxYECxoECx4ECyIECyYECyoECy4ECzIECzYECzoECz4EC
-0IEC0YEC0oEC04EC1IEC1YEC1oEC14EC2IEC2YEC2oEC24EC3IEC3YEC3oEC34EC4IEC4YEC4oEC44EC
-5IEC5YEC5oEC54EC6IEC6YEC6oEC64EC7IEC7YEC7oEC74EC8IEC8YEC8oEC84EC9IEC9YEC9oEC94EC
-+IEC+YEC+oEC+4EC/IEC/YEC/oEC/4EDAIEDAYEDAoEDA4EDBIEDBYEDBoEDB4EDCIEDCYEDCoEDC4ED
-DIEDDYEDDoEDD4EDEIEDEYEDEoEDE4EDFIEDFYEDFoEDF4EDGIEDGYEDGoEDG4EDHIEDHYEDHoEDH4ED
-IIEDIYEDIoEDI4EDJIEDJYEDJoEDJ4EDKIEDKYEDKoEDK4EDLIEDLYEDLoEDL4EDMIEDMYEDMoEDM4ED
-NIEDNYEDNoEDN4EDOIEDOYEDOoEDO4EDPIEDPYEDPoEDP4EDQIEDQYEDQoEDQ4EDRIEDRYEDRoEDR4ED
-SIEDSYEDSoEDS4EDTIEDTYEDToEDT4EDUIEDUYEDUoEDU4EDVIEDVYEDVoEDV4EDWIEDWYEDWoEDW4ED
-XIEDXYEDXoEDX4EDYIEDYYEDYoEDY4EDZIEDZYEDZoEDZ4EDaIEDaYEDaoEDa4EDbIEDbYEDboEDb4ED
-cIEDcYEDcoEDc4EDdIEDdYEDdoEDd4EDeIEDeYEDeoEDe4EDfIEDfYEDfoEDf4EDgIEDgYEDgoEDg4ED
-hIEDhYEDhoEDh4EDiIEDiYEDioEDi4EDjIEDjYEDjoEDj4EDkIEDkYEDkoEDk4EDlIEDlYEDlhDNEgAB
-iBkRAXwQlRECFBEBgRIABJUuEgADDmcRAh0SAAGIFxIABJWuEgAElbQRARASAASVqxEBchIABJW1EgAE
-lQcRAV8SAASVShECHxIABJW3EgAElZkRAScRASURAhkRAhoRAZIRAWESAASVuBIAAYgMEQF0EgAEla8S
-AASVqRECIREBpxDLEI8SAAGICxIABJWnEgAElUYRAXcSAAGIHhEBBxEBHREBNhEBkRIAAYgUEgAElWUS
-AASVaBCWEgAElboRAUERASkRAhMSAASVuREBeBAdEMQSAASVthEBgxIABJWmEBMRAYkSAAGIEhEBjBEC
-IBIABJWHEQIXEQGGEgAElUsRAbMSAASVSBCREQEoEgABiBESAASVMBIAAYfWEQGPEQGLEgABiBsQhhEB
-ERECEhEBeRAXEJASAASVaRIABJWjEQE0EQGHEIgRAV4RAj8SAASViBEBXBIAAYgYEQE3EQGuEQFwEQGk
-EQF+EgAElYYSAASVohEBjREBphIAAYghEgAElVARAXMQXBIABJVnEgAEla0Q9BECFhEBiBIABJWwEgAB
-h8QSAAGIExCpEQIYEQFxEQGsEQFrEgABiL8RAYUSAASVMhIABJWlEQF9EDgRAWwSAASVuxIAAYgQEgAE
-lYURAhUSAASVahIABJVTEgAElSsSAAGIFhEBqhC1EQIbEgAElaoQoxIABJVMEQEwEgAElU0RAaURAhwR
-AR4RAg8RAYAQBREBPhD1EQIMEDoSAASVUREBexEBLRECPREBihDPEgAElSoRAQ4RAY4RATEQghEBYBEB
-dhIABJUxEgAElbwSAAGHxxEBghIABJVHEMwSAASVmxIABJWyEQEqEQF/EQFiEgAElbESAASVZhIAAYgN
-EgABiL0RAS8QnRCDEDkRASQRAiIRAQ0T//////////0QzhEBXRIABJWoEQIjEQGEEQGtEQGjEQIlEQI+
-EgABh8USAASVrBIABJWzEQGxEgAElZgSAASVSRIABJVSEgAElaQRAiQQyhIAAYgiEgAElZ8RAg4SAASV
-nBEBbRCBEQGv0gAOAEUATQ7EgDqg0gAOAEUI7A7HgQIioNIADgBFCOwOyoECIqDSADoAOw7MDs2iDs0A
-P15OU0lCT2JqZWN0RGF0YQAIABkAIgAnADEAOgA/AEQAUgBUAGYHoAemB/EH+Af/CA0IHwg7CEkIVQhh
-CG8IegiICKQIsgjFCNcI8Qj7CQgJCgkNCRAJEwkWCRgJGwkdCSAJIwkmCSkJKwktCTAJMwk4CTsJRAlQ
-CVIJVAldCWcJaQl3CYAJiQmUCZsJrQm2Cb8JyAnNCdwJ7wn4CgMKBQoGCg8KFgojCikKMgo0CsEKwwrF
-CscKyQrLCs0KzwrRCtMK1QrXCtkK2wrdCt8K4QrjCuUK5wrpCusK7QrvCvEK8wr1CvcK+Qr7Cv0K/wsB
-CwMLBQsHCwkLCwsNCw8LEQsTCxULGAsbCx4LIQskCycLKgstCzALMws2CzkLPAs/C0ILRQtIC0sLTgtR
-C1QLVwtaC10LYAtjC2YLdwuFC44LlguYC5oLnAueC78LxwvbC+YL9Av+DAsMEgwUDBYMGwwdDCIMJAwm
-DCgMOQxADEwMTgxRDFQMVwx+DIAMjQycDJ4MoAyiDKoMvAzFDMoM3QzqDOwM7gzwDQMNDA0RDRwNJQ0n
-DSkNNw1KDVMNWg1yDYENkg2UDZYNmA2aDbcNyQ3RDdgN4Q3rDfcN+Q37Df0N/w4CDgMOBQ4aDiUOJw4q
-Di0OMA5IDoEOjQ6jDrEOxg7VDugO+g8FDw8PHQ8vDzwPSg9PD1EPUw9VD1cPWQ9bD10PXw9hD2MPZQ9n
-D2wP1w/oD+8P+A/6EAMQBRAIEBUQHhAjECoQNxA5EDsQPRBGEE8QWxBdEF8QaBBtEIMQhBCNEJYQoxCw
-ELkQxBDNENcQ3hDqEQkREhEZETARQRFDEUURRxFJEVoRXBFeEWARYhFnEXARchF3EXkRexGkEbIRvxHB
-EcMRyBHJEcsRzBHOEdAR0hH7EgUSDhIQEhISFBIWEhgSGhIcEh4SMxJCEk8SURJTElUSXhJgEmUSZxJp
-EpISlBKWEpcSmRKaEpwSnhKgEsESwxLFEscSyRLLEs0S6BLxEvgTBxMPExgTHRMmEzcTORM7Ez0TPxNc
-E14TYBNiE2QTZRNnE3wTfhOBE4QThxOgE9kT2xPdE98T4RPjE+UT5xPpFA4UHRQuFDAUMhQ0FDYUUxRV
-FFcUWRRbFF4UXxRhFHYUghSEFIcUihSNFKcU3BTeFOAU4hTkFOYU6BTqFOwU8RT6FQIVCxUNFSIVMxU1
-FTcVORU7FVwVXhVgFWIVZBVmFWgVhBWWFacVqRWrFa0VrxXMFc4V0BXSFdQV1RXXFe8WKBYqFiwWLhYw
-FjIWNBY2FjgW2RbqFuwW7hbwFvIXDxcRFxMXFRcXFxgXGhcvFzEXNBc3FzoXUxeiF78X0RfjF/gYBhgP
-GBAYEhgUGBYYGBgaGBwYHhggGCIYIxgkGCcYKhgsGDEYQhhEGEYYSBhRGFMYhBiNGJMYmxidGJ8YoRij
-GKUYpxipGKsYtBjBGMMYxRjHGNIY5hjvGPEY/BkFGQcZEBkSGRQZFhkYGUUZRxlJGUsZTRlPGVEZUxlV
-GVcZYRmOGZAZkhmUGZYZmBmaGZwZnhmgGakZ1hnYGdoZ3BneGeAZ4hnkGeYZ6Bn3GgAaDRohGjAaORpG
-GlQaZRpnGmkaaxptGo4akBqSGpcamRqbGp0anxqwGrIatRq4Grsa6hrsGwEbEhsUGxYbGBsaGzcbORs7
-Gz0bPxtBG0MbURtxG4IbhBuGG4gbihujG7Qbthu4G7obvBvZG9sb3RvfG+Eb4hvkG/0cNhw4HDocPBw+
-HEAcQhxEHEYctRzGHMgcyhzMHM4c6xztHO8c8RzzHPQc9h0PHUgdSh1MHU4dUB1SHVQdVh1YHXAdhh2X
-HZkdmx2dHZ8dsB2yHbQdth24HdUd1x3ZHdsd3R3eHeAd+R4yHjQeNh44HjoePB4+HkAeQh5pHn0ejh6Q
-HpIelB6WHr8ewR7DHsQexh7HHskeyx7NHtoe3B7eHuEe8B8BHwMfBR8HHwkfKh8sHy4fMB8yHzQfNh9A
-H0IfVR9mH2gfah9sH24fix+NH48fkR+TH5Qflh+vH7IftR+4H7sfvh/WIA8gESATIBUgFyAZIBsgHSAf
-IHogjSCeIKAgoiCkIKYguSDKIMwgziDQINIg7yDxIPMg9SD3IPgg+iEPIREhFCEXIRohMyFsIW4hcCFy
-IXQhdiF4IXohfCGlIbYhuCG6IbwhviHfIeEh4yHlIech6SHrIiAiIiI7IkwiTiJQIlIiVCJ9In8igSKC
-IoQihSKHIokiiyKeIq8isSKzIrUityLUIuUi5yLpIusi7SMKIxsjHSMfIyEjIyNAI0IjRCNGI0gjSSNL
-I2MjnCOeI6AjoiOkI6YjqCOqI6wkSyRcJF4kYCRiJGQkhSSHJIkkiySNJI8kkSSjJLQktiS4JLokvCTZ
-JNsk3STfJOEk4iTkJPwlNSU3JTklOyU9JT8lQSVDJUUlbiV/JYElgyWFJYclrCWuJbAlsiW0JbYluCW6
-Jccl4CXxJfMl9SX3JfkmFCYlJicmKSYrJi0mSiZMJk4mUCZSJlMmVSZuJqcmqSarJq0mryaxJrMmtSa3
-Jssm4SbyJvQm9ib4JvonGScqJywnLicwJzInUydVJ1cnWSdbJ10nXydsJ24ncSd0J4EniyecJ54noCei
-J6QnwSfDJ8UnxyfJJ8onzCflKAYoGigmKCgoKigsKC4oMCg1KDcpFCklKScpMCkyKTUpSilSKV8payl5
-KXspfSl/KYEpgymKKZcppCmsKa4puinDKcgp3SnfKeEp4ynlKfgqBSoHKgoqEyocKi4qNypCKk4qWSpq
-KmwqbipwKnIqjyqRKpMqlSqXKpgqmiq0Kukq8ir0KvYq+Cr6Kvwq/isAKxUrHisgKzIrQytFK0crSStL
-K2wrbitwK3IrdCt2K3grfSuKK5srnSufK6Eroyu0K7YruCu6K7wr2SvbK90r3yvhK+Ir5Cv8LB0sHywh
-LCMsJSwnLCks5izxLQItBC0GLQgtCi0iLS8tMS0zLTUtVi1YLVotXC1eLWAtYi1vLXEtdC13LX4tgC2G
-LZctmS2bLZ0tny2wLbIttC22LbgtyS3LLc0tzy3SLfMt9S33Lfkt+y39Lf8uCy4NLhguKS4rLi0uMC4z
-LlguWi5dLl8uYS5jLmUucy55LooujC6OLpEuky6wLrIutC63Lrouuy69LtYvDy8RLxMvFS8XLxkvHC8e
-LyEvTi9fL2EvYy9lL2gvdy+IL4ovjC+PL5Evri+wL7IvtS+4L7kvuy/TMAwwDjAQMBIwFDAWMBkwGzAe
-MKMwtDC2MLkwuzC+MNsw3TDfMOIw5TDmMOgxATE6MTwxPjFAMUIxRDFHMUkxTDGZMaQxtTG3MbkxvDG/
-MeAx4jHlMegx6jHsMe4yDzIRMh0yLjIwMjIyNTI3MkgySjJNMk8yUjJvMnEyczJ2MnkyejJ8MpUyzjLQ
-MtIy1DLWMtgy2zLdMuAzNTNBM1IzVDNXM1kzXDOrM80z1zPkM/k0BjQgNDw0VzRjNII0kTSdNKA0ozSo
-NKs0rjSvNLI0uzTENMc0yDTLNM400TTaNQM1DTUXNSE1LzUyNTU1ODU6NT01QDVDNUY1STVMNVc1cDV8
-NX81gjWFNYg1izW0Nbc1ujW9NcA1wzXGNck1zDXWNd816DX8NhE2FDYXNho2HTZWNmI2azZ+Nos2lzal
-Nqc2qjatNrA2sja1Nrg2uzbONtE20zbWNtk23DbzNvw3BTcTNxw3HjclNyg3KzcuN1c3ZjdzN3s3hjeV
-N6A3qze4N7k3vDe/N8g3yzfUN9033jfhN/44AzgGOAk4DDgOOBE4FjgjOCU4MThGOEg4SjhNOE84YThq
-OHU4iTiuOMQ4yTjLOM440TjTONY42DjaOPs5CDkKOQ05FjkbOSk5UjlTOVY5WTliOWU5bjlvOXI5jzmS
-OZU5mDmaOZ05pTnKOcw5zznSOdQ51znZOds6BDoFOgg6CzoUOhc6IDohOiQ6QTpEOkc6SjpMOk86Vjpr
-Om06cDpzOnU6gTqqOr46wDrDOsY6yTrMOs06zzrROuI65DrtOu87BDsGOwg7CzsNOyY7Ozs9O0A7QztF
-O087XDteO2M7bDt3O4I7kzuVO5c7mTucO6I7szu1O7c7uju8O9k72zvdO+A74zvkO+Y8HzwhPCM8JTwn
-PCk8LDwuPDE8ajx7PH08fzyBPIQ8jjyfPKE8pDymPKk8uzzMPM480DzSPNU85Dz1PPc8+Tz7PP49Bz0Y
-PRo9HD0ePSE9LT0+PUA9Qj1FPUg9ZT1nPWk9bD1vPXA9cj2MPcE9wz3FPcc9yj3NPc890j3bPeQ95j3+
-Pg8+ET4UPhY+GT4yPkM+RT5HPkk+TD5YPmk+az5uPnA+cz6APpE+kz6VPpc+mj6oPrk+uz6+PsA+wz74
-PwU/Ej8oPzY/QD9OP2c/dD+GP5o/pD+wP7M/tj+5P7w/vz/EP8c/yj/NP9A/0z/uQBdAH0AoQCpAL0A6
-QE9AUUBUQFdAWkBjQGVAaEBrQJxAq0DEQNxA30DiQOVA6EDqQO1A7kDxQPJA9UD+QQBBA0EFQQ5BEEEd
-QSBBI0EmQShBK0EuQUtBTUFPQVJBVUFWQVhBcEGVQZdBmUGcQZ5BoUGjQaVCrkLLQs1Cz0LSQtVC1kLY
-QvFDFkMYQxpDHUMfQyJDJEMmQ/9EHEQeRCBEI0QmRCdEKURCRGdEaURrRG5EcERzRHVEd0UsRUVFTkVV
-RW5Fd0V5RYRFh0WKRY1FkEWTRaxFuUXDRcZFyUXLRc5F0EXTRdxF3kXgRehF8UX2RgRGHUYgRiNGJUYo
-RipGLUY2RjhGOkZDRkVGVkZYRltGXUZgRmNGZUZoRmtGiEaKRoxGj0aSRpNGlUatRtJG1EbWRtlG20be
-RuBG4kf5SBZIGEgaSB1IIEghSCNIO0hgSGJIZEhnSGlIbEhuSHBIeEiVSJdImUicSJ9IoEiiSLtI4Eji
-SORI50jpSOxI7kjwSXlJlkmYSZpJnUmgSaFJo0m8SeFJ40nlSehJ6kntSe9J8UrkSu9LCEsLSw5LEEsT
-SxVLGEshSyNLLEsuSz9LQktFS0dLSUtLS01LT0tRS25LcEtyS3VLeEt5S3tLlEu1S7dLuUu8S75LwUvD
-TMhM6U0CTQVNCE0KTQ1ND00STRtNHU0mTShNNU03TTpNPE0/TUFNRE1hTWNNZU1oTWtNbE1uTYdNqE2q
-TaxNr02xTbRNtk69TtpO3E7eTuFO5E7lTudPAE8hTyNPJU8oTypPLU8vT3tPmE+aT5xPn0+iT6NPpU+9
-T95P4E/iT+VP50/qT+xQ41DrUQBRA1EFUQhRClENURZRGFEjUSVRKFErUS5RMVFOUVBRUlFVUVhRWVFb
-UXRRmVGbUZ1RoFGiUaVRp1GpUzJTT1NRU1NTVlNZU1pTXFN0U5lTm1OdU6BTolOlU6dTqVVKVWdVaVVr
-VW5VcVVyVXRVjVWyVbRVtlW5VbtVvlXAVcJWUVZkVm1WdlaBVplWpFauVrdWvFbPVttW7FbuVvBW81b1
-VwZXCFcKVw1XEFcxVzNXNlc5VztXPVc/V0ZXSFdWV2dXaVdsV25XcVeCV4RXh1eKV41XllefV6FXrFev
-V7JXtVe4V7tX5FfmV+hX61ftV+9X8Vf0V/dX+1gEWAZYH1ghWCRYJ1gqWC1YL1gyWDVYN1g5WDxYPlhn
-WGlYa1hsWG5Yb1hxWHNYdVieWKBYo1imWKhYqlisWK5YsVjCWNNY1VjYWNtY3ljnWOlY6lj8WSVZJ1kp
-WSpZLFktWS9ZMVkzWVxZXllgWWFZY1lkWWZZaFlqWZNZlVmXWZhZmlmbWZ1Zn1mhWa5Z11nZWdtZ3Vnf
-WeFZ41nmWelZ8ln0WflZ+1n9WiZaKFoqWi1aL1oxWjNaNlo5WkZaT1pRWlRaVlp/WoFag1qGWohailqM
-Wo9aklqZWqJapFq3WrpavFq+WsFaxFrGWslay1rNWvZa+Fr6Wvta/Vr+WwBbAlsEWyVbJ1sqWy9bMls0
-WzZbOFtMW05bd1t5W3tbfFt+W39bgVuDW4VblFu9W79bwVvEW8ZbyFvKW81b0FvWW99b4VvkW+Zb8lv3
-XAhcClwMXA5cEVwgXDFcM1w1XDhcO1xIXFFcVF1/XYJdhF2HXYpdjF2OXZFdlF2WXZldnF2eXaFdpF2m
-Xahdq12tXbBds121Xbhdu12+XcBdwl3EXcZdyF3LXc5d0V3UXddd2l3cXd5d4V3kXedd6V3sXe9d8V30
-XfZd+V37Xf5eAF4DXgZeCF4KXg1eEF4TXhZeGV4bXh1eH14hXiNeJl4oXipeLV4wXjJeNF42XjlePF4/
-XkFeRF5HXkpeTF5OXlBeUl5UXlZeWV5cXl9eYl5kXmdeal5sXm9ecl51XndeeV57Xn1ef16BXoReh16J
-Xotejl6QXpNelV6YXppenV6fXqJepV6oXqterl6wXrNetl65Xrtevl7AXsJexF7GXshey17OXtFe1F7X
-Xtpe3F7fXuJe5F7mXuhe6l7sXu9e8V7zXvZfG18lXyhfK18uXzFfNF83X0BfWF9lX25feV+EX41fj1+a
-X51foF+jX6ZfqV+yX7Rft1+6X9Jf21/kX+9gEGATYBZgGWAcYB9gImArYERgTWBPYFJgVWBrYIRgjWCW
-YKNgrGCuYLdgumC8YL9gwWDMYQFhA2EGYQlhDGEPYRJhFWEYYRphHWEgYTthaGFxYXNhfGGFYYdhimGT
-YZhhoWGkYs9i0mLUYtZi2WLbYt1i32LhYuNi5WLoYupi7WLwYvJi9WL3Yvli+2L9Yv9jAWMEYwdjCmMN
-Yw9jEWMTYxVjGGMbYx1jH2MhYyNjJWMoYypjLWMvYzFjNGM2YzljO2M9Yz9jQWNDY0VjSGNKY0xjT2NR
-Y1NjVWNYY1pjXGNfY2FjY2NlY2djaWNsY29jcWNzY3VjeGN7Y31jf2OBY4RjhmOIY4pjjWOQY5JjlGOX
-Y5pjnWOgY6JjpWOoY6pjrGOuY7Fjs2O1Y7djuWO7Y71jwGPDY8VjyGPLY81j0GPSY9Vj12PZY9xj3mPg
-Y+Nj5WPoY+pj7WPwY/Jj9GP2Y/hj+mP8Y/5kAWQEZAdkCmQMZA9kEWQTZBZkGWQbZB5kIGQjZCVkJ2Qp
-ZCtkLWQ2ZDllZmVpZWtlbmVxZXNldWV4ZXplfWWAZYNlhWWIZYtljWWPZZJllGWWZZllnGWfZaJlpWWn
-Zallq2WtZbBlsmW1ZbdlumW9ZcBlwmXFZchly2XOZdBl02XWZdhl2mXdZeBl4mXlZedl6mXtZe9l8WX0
-Zfdl+mX9ZgBmAmYEZgZmCGYKZg1mD2YRZhRmF2YZZhtmHWYgZiNmJmYoZitmLmYxZjNmNWY3ZjlmO2Y9
-ZkBmQ2ZGZklmTGZOZlBmUmZVZlhmW2ZeZmBmYmZkZmZmaGZqZm1mcGZyZnRmd2Z5ZntmfmaBZoNmhmaI
-ZotmjmaRZpRml2aZZpxmn2aiZqRmp2apZqtmrWavZrFmtGa3ZrpmvWbAZsNmxWbIZspmzGbOZtBm0mbU
-Ztdm2WbcZt9m6GbraBhoG2geaCFoJGgnaCpoLWgwaDNoNmg5aDxoP2hCaEVoSGhLaE5oUWhUaFdoWmhd
-aGBoY2hmaGlobGhvaHJodWh4aHtofmiBaIRoh2iKaI1okGiTaJZomWicaJ9oomilaKhoq2iuaLFotGi3
-aLpovWjAaMNoxmjJaMxoz2jSaNVo2GjbaN5o4WjkaOdo6mjtaPBo82j2aPlo/Gj/aQJpBWkHaQppDWkQ
-aRNpFmkZaRxpH2kiaSVpKGkraS5pMWk0aTdpOmk9aUBpQ2lGaUlpTGlPaVJpVWlYaVtpXmlhaWRpZ2lq
-aW1pcGlzaXZpeWl8aX9pgmmFaYhpi2mOaZFplGmXaZppnWmgaaNppmmpaaxpr2myabVpuGm7ab5pwWnE
-acdpymnNadBp02nWa5trr2u7a9dr+2wwbDxscWyJbJRsqmzpbVJta22ibb1tyW3Vbq5vf2/scABwUXFo
-cW9xdnGWch1zLHNVc2dzf3OLdLB00HUDdix2YXb+eCt4onnVehZ6InrZe/R8AHwJfB58Y3xvfMR9vX54
-fp9/BIAngIGA34D6gRyBK4FUgW2BeoGigcWDAIMNgyiDMoNOg2eECIWthdOGfobHhtOG+IcGhySHr4fQ
-h+WIVoiDiJ2I3ojriTKJRolein+LJIs3i2iLiouii9WMIoxHjF2MdI1NjXCNs46wj2OPeI+Rj5yPx4/j
-kBKQHpA4kTmRTZGSk0+TZ5Nzk4uURJUllT+VRpWPldSWW5akl7eZZJohm0ybz5wCnA+cFpwynKWdmp4h
-ns6fB58QnxOfFJ8dnyCfIZ8qny2g5KDnoOqg7KDvoPGg9KD3oPqg/KD/oQGhA6EFoQehCqEMoQ+hEaET
-oRahGKEboR6hIKEjoSWhKKEroS6hMaE0oTahOKE7oT2hQKFDoUahSKFLoU6hUKFSoVWhV6FaoV2hX6Fi
-oWShZ6FqoW2hb6FyoXWheKF6oXyhf6GBoYShhqGJoYuhjaGQoZOhlqGYoZqhnKGeoaGhpKGmoaihqqGt
-obChs6G1obihu6G9ocChwqHEocahyaHLoc2h0KHTodah2aHbod6h4KHioeSh5qHooeqh7KHvofGh86H2
-ofih+qH9of+iAqIEogeiCaILog6iEaIUoheiGqIdoh+iIaIjoiaiKaIsoi6iMaIzojWiOKI6ojyiPqJA
-okOiRaJIokuiTqJRolOiVaJXolmiW6JdomCiY6JlomeiaaJsom+icqJ1oneieaJ7on2if6KBooSih6KJ
-ooyijqKRopSilqKYopuinaKgoqKipKKnoqmirKKuorCisqK1oreiuqK8or+iwqLEoseiyaLLos6i0aLU
-otai2aLbot2i36LhouSi56Lqouyi7qLwovOi9aL3ovqi/aMAowKjC6MOpMWkyKTLpM6k0aTUpNek2qTd
-pOCk46TmpOmk7KTvpPKk9aT4pPuk/qUBpQSlB6UKpQ2lEKUTpRalGaUcpR+lIqUlpSilK6UupTGlNKU3
-pTqlPaVApUOlRqVJpUylT6VSpVWlWKVbpV6lYaVkpWelaqVtpXClc6V2pXmlfKV/pYKlhaWIpYuljqWR
-pZSll6WapZ2loKWjpaalqaWspa+lsqW1pbilu6W+pcGlxKXHpcqlzaXQpdOl1qXZpdyl36XipeWl6KXr
-pe6l8aX0pfel+qX9pgCmA6YGpgmmDKYPphKmFaYYphumHqYhpiSmJ6Yqpi2mMKYzpjamOaY8pj+mQqZF
-pkimS6ZOplGmVKZXplqmXaZgpmOmZqZppmymb6ZypnWmeKZ7pn6mgaaEpoemiqaNppCmk6aWppmmnKaf
-pqKmpaaopqumrqaxprSmt6a6pr2mwKbDpsamyabMps+m0qbVptim26bepuGm5Kbnpuqm7abwpvOm9qb5
-pvym/6cCpwWnCKcLpw6nEacUpxenGqcdpyCnI6cmpymnLKcvpzKnNac4pzunPqdBp0SnR6dKp02nUKdT
-p1WnWqddp1+nYqdlp2qnb6dyp3enfKeBp4SniaeMp5GnlqeZp56noaemp6unrqexp7Snt6e6p72nwqfH
-p8qnz6fUp9en2qfcp96n46fop+2n8Kf1p/in+6f+qAGoBqgLqBCoEqgXqBqoHaggqCWoKKgqqCyoMag0
-qDmoO6g+qEOoRqhJqE6oUahUqFmoXKhhqGOoZqhrqHCodah4qHuogKiCqIWoiKiLqI2oj6iUqJmonKif
-qKGopKinqKyor6i0qLeouqi9qMCow6jIqM2o0KjTqNio3ajgqOKo56jsqO6o8aj0qPmo/qkDqQWpCKkL
-qQ6pEakWqRmpHqkjqSapKKkrqTCpNak6qT2pQqlHqUypUalUqVapWaleqWCpZaloqW2pcKlzqXapeal8
-qX6pgamDqYapiKmNqZCpk6mWqZmpm6mgqaOppqmpqauprqmxqbapu6nAqcOpyKnKqc+p1KnXqdqp3ani
-qeep7KnxqfSp9qn4qfqp/aoAqgOqDKoOqhGqFqoZqhyqH6oiqiWqKKotqjKqN6o6qj+qRKpJqk6qUapT
-qliqXapgqmWqaKpqqm2qdqp4qnmqgqqFqoaqj6qSqpOqnKqhAAAAAAAAAgIAAAAAAAAOzgAAAAAAAAAA
-AAAAAAAAqrA</bytes>
-		</object>
 	</data>
 </archive>
diff --git a/hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/keyedobjects.nib
index 9aabfb6..74a1efe 100644
Binary files a/hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/ru.lproj/locversion.plist b/hw/xquartz/bundle/Resources/ru.lproj/locversion.plist
index e086cf7..2c58741 100644
--- a/hw/xquartz/bundle/Resources/ru.lproj/locversion.plist
+++ b/hw/xquartz/bundle/Resources/ru.lproj/locversion.plist
@@ -9,6 +9,6 @@
 	<key>LprojRevisionLevel</key>
 	<string>1</string>
 	<key>LprojVersion</key>
-	<string>73</string>
+	<string>83</string>
 </dict>
 </plist>
diff --git a/hw/xquartz/bundle/Resources/sv.lproj/locversion.plist b/hw/xquartz/bundle/Resources/sv.lproj/locversion.plist
index 5c8d623..0fbea35 100644
--- a/hw/xquartz/bundle/Resources/sv.lproj/locversion.plist
+++ b/hw/xquartz/bundle/Resources/sv.lproj/locversion.plist
@@ -9,6 +9,6 @@
 	<key>LprojRevisionLevel</key>
 	<string>1</string>
 	<key>LprojVersion</key>
-	<string>73</string>
+	<string>83</string>
 </dict>
 </plist>
diff --git a/hw/xquartz/bundle/Resources/sv.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/sv.lproj/main.nib/designable.nib
index 759ead2..808d57c 100644
--- a/hw/xquartz/bundle/Resources/sv.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/sv.lproj/main.nib/designable.nib
@@ -1,11 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">9C31</string>
-		<string key="IBDocument.InterfaceBuilderVersion">677</string>
-		<string key="IBDocument.AppKitVersion">949.26</string>
-		<string key="IBDocument.HIToolboxVersion">352.00</string>
+		<string key="IBDocument.SystemVersion">10A314</string>
+		<string key="IBDocument.InterfaceBuilderVersion">718</string>
+		<string key="IBDocument.AppKitVersion">1013</string>
+		<string key="IBDocument.HIToolboxVersion">415.00</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+			<string key="NS.object.0">718</string>
+		</object>
 		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
 			<bool key="EncodedWithXMLCoder">YES</bool>
 		</object>
@@ -15,7 +19,7 @@
 		</object>
 		<object class="NSMutableDictionary" key="IBDocument.Metadata">
 			<bool key="EncodedWithXMLCoder">YES</bool>
-			<object class="NSArray" key="dict.sortedKeys">
+			<object class="NSArray" key="dict.sortedKeys" id="0">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 			</object>
 			<object class="NSMutableArray" key="dict.values">
@@ -68,7 +72,7 @@
 								</object>
 								<object class="NSMenuItem" id="386173216">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">SW5zdMOkbGxuaW5nYXIuLi4</string>
+									<string key="NSTitle">Inställningar...</string>
 									<string key="NSKeyEquiv">,</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -88,7 +92,7 @@
 								</object>
 								<object class="NSMenuItem" id="32285361">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">VGrDpG5zdGVyA</string>
+									<string key="NSTitle">Tjänster</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -96,7 +100,7 @@
 									<reference key="NSMixedImage" ref="351811234"/>
 									<string key="NSAction">submenuAction:</string>
 									<object class="NSMenu" key="NSSubmenu" id="821388474">
-										<string type="base64-UTF8" key="NSTitle">VGrDpG5zdGVyA</string>
+										<string key="NSTitle">Tjänster</string>
 										<object class="NSMutableArray" key="NSMenuItems">
 											<bool key="EncodedWithXMLCoder">YES</bool>
 										</object>
@@ -116,7 +120,7 @@
 								</object>
 								<object class="NSMenuItem" id="6876565">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">VsOkeGxhIGhlbHNrw6RybXNsw6RnZQ</string>
+									<string key="NSTitle">Växla helskärmsläge</string>
 									<string key="NSKeyEquiv">a</string>
 									<int key="NSKeyEquivModMask">1572864</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -136,7 +140,7 @@
 								</object>
 								<object class="NSMenuItem" id="301008465">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">R8O2bSBYMTE</string>
+									<string key="NSTitle">Göm X11</string>
 									<string key="NSKeyEquiv">h</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -146,7 +150,7 @@
 								</object>
 								<object class="NSMenuItem" id="206802571">
 									<reference key="NSMenu" ref="576521955"/>
-									<string type="base64-UTF8" key="NSTitle">R8O2bSDDtnZyaWdhA</string>
+									<string key="NSTitle">Göm övriga</string>
 									<string key="NSKeyEquiv">h</string>
 									<int key="NSKeyEquivModMask">1572864</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -250,7 +254,7 @@
 					</object>
 					<object class="NSMenuItem" id="931553638">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle">RsO2bnN0ZXI</string>
+						<string key="NSTitle">Fönster</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -258,12 +262,12 @@
 						<reference key="NSMixedImage" ref="351811234"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="96874957">
-							<string type="base64-UTF8" key="NSTitle">RsO2bnN0ZXI</string>
+							<string key="NSTitle">Fönster</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="984461797">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">U3TDpG5nA</string>
+									<string key="NSTitle">Stäng</string>
 									<string key="NSKeyEquiv">w</string>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -301,7 +305,7 @@
 								</object>
 								<object class="NSMenuItem" id="1036389925">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">QmzDpGRkcmEgZ2Vub20gZsO2bnN0ZXI</string>
+									<string key="NSTitle">Bläddra genom fönster</string>
 									<string key="NSKeyEquiv">`</string>
 									<int key="NSKeyEquivModMask">1048840</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -310,7 +314,7 @@
 								</object>
 								<object class="NSMenuItem" id="369641893">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">QmzDpGRkcmEgZ2Vub20gZsO2bnN0ZXIgYmFrbMOkbmdlcw</string>
+									<string key="NSTitle">Bläddra genom fönster baklänges</string>
 									<string key="NSKeyEquiv">~</string>
 									<int key="NSKeyEquivModMask">1179914</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -330,7 +334,7 @@
 								</object>
 								<object class="NSMenuItem" id="276216762">
 									<reference key="NSMenu" ref="96874957"/>
-									<string type="base64-UTF8" key="NSTitle">TMOkZ2cgYWxsYSDDtnZlcnN0A</string>
+									<string key="NSTitle">Lägg alla överst</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -354,7 +358,7 @@
 					</object>
 					<object class="NSMenuItem" id="551174276">
 						<reference key="NSMenu" ref="524015605"/>
-						<string type="base64-UTF8" key="NSTitle">SGrDpGxwA</string>
+						<string key="NSTitle">Hjälp</string>
 						<string key="NSKeyEquiv"/>
 						<int key="NSKeyEquivModMask">1048576</int>
 						<int key="NSMnemonicLoc">2147483647</int>
@@ -362,12 +366,12 @@
 						<reference key="NSMixedImage" ref="351811234"/>
 						<string key="NSAction">submenuAction:</string>
 						<object class="NSMenu" key="NSSubmenu" id="511848303">
-							<string type="base64-UTF8" key="NSTitle">SGrDpGxwA</string>
+							<string key="NSTitle">Hjälp</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSMenuItem" id="504984881">
 									<reference key="NSMenu" ref="511848303"/>
-									<string type="base64-UTF8" key="NSTitle">WDExIEhqw6RscA</string>
+									<string key="NSTitle">X11 Hjälp</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -388,12 +392,12 @@
 				<int key="NSWindowBacking">2</int>
 				<string key="NSWindowRect">{{288, 302}, {484, 308}}</string>
 				<int key="NSWTFlags">1350041600</int>
-				<string type="base64-UTF8" key="NSWindowTitle">WDExLWluc3TDpGxsbmluZ2FyA</string>
+				<string key="NSWindowTitle">X11-inställningar</string>
 				<string key="NSWindowClass">NSPanel</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="941366957">
 					<nil key="NSNextResponder"/>
@@ -428,7 +432,7 @@
 													<string key="NSContents">Emulera treknappsmus</string>
 													<object class="NSFont" key="NSSupport" id="463863101">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">1044</int>
 													</object>
 													<reference key="NSControlView" ref="119157981"/>
@@ -456,12 +460,10 @@
 												<object class="NSTextFieldCell" key="NSCell" id="391919450">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">T20gZGUgw6RyIGFrdGl2ZXJhZGUga2FuIHRhbmdlbnRlciBzb20gbW90c3ZhcmFyIG1lbnlyYWRlbiBo
-YW1uYSBpIGtvbmZsaWt0IG1lZCBYMTEtcHJvZ3JhbSBzb20gYW52w6RuZGVyIG1ldGFtb2RpZmllcmFy
-ZW4uA</string>
+													<string key="NSContents">Om de är aktiverade kan tangenter som motsvarar menyraden hamna i konflikt med X11-program som använder metamodifieraren.</string>
 													<object class="NSFont" key="NSSupport" id="26">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.100000e+01</double>
+														<double key="NSSize">11</double>
 														<int key="NSfFlags">3100</int>
 													</object>
 													<string key="NSPlaceholderString"/>
@@ -470,9 +472,9 @@ ZW4uA</string>
 														<int key="NSColorSpace">6</int>
 														<string key="NSCatalogName">System</string>
 														<string key="NSColorName">controlColor</string>
-														<object class="NSColor" key="NSColor" id="854939654">
+														<object class="NSColor" key="NSColor" id="832012125">
 															<int key="NSColorSpace">3</int>
-															<bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+															<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
 														</object>
 													</object>
 													<object class="NSColor" key="NSTextColor" id="930815747">
@@ -535,8 +537,7 @@ ciBzw6UgYWt0aXZlcmFzIG11c2VucyBtaXR0LSByZXNwZWt0aXZlIGjDtmdlcmtuYXBwLgo</string>
 												<object class="NSTextFieldCell" key="NSCell" id="666057093">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">VGlsbMOldGVyIGF0dCDDpG5kcmluZ2FyIGkgaW5kYXRhbWVueW4gc2tyaXZlciDDtnZlciBkZSBiZWZp
-bnRsaWdhIFgxMS10YW5nZW50a29wcGxpbmdhcm5hLg</string>
+													<string key="NSContents">Tillåter att ändringar i indatamenyn skriver över de befintliga X11-tangentkopplingarna.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="31160162"/>
@@ -553,7 +554,7 @@ bnRsaWdhIFgxMS10YW5nZW50a29wcGxpbmdhcm5hLg</string>
 												<object class="NSButtonCell" key="NSCell" id="967619578">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">RsO2bGogZGF0b3JucyB0YW5nZW50Ym9yZHNsYXlvdXQ</string>
+													<string key="NSContents">Följ datorns tangentbordslayout</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="179949713"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -592,7 +593,7 @@ bnRsaWdhIFgxMS10YW5nZW50a29wcGxpbmdhcm5hLg</string>
 												<object class="NSButtonCell" key="NSCell" id="1016069354">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">QW52w6RuZCBzeXN0ZW1ldHMgdmFybmluZ3NlZmZla3Q</string>
+													<string key="NSContents">Använd systemets varningseffekt</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="418227126"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -614,9 +615,7 @@ bnRsaWdhIFgxMS10YW5nZW50a29wcGxpbmdhcm5hLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="624655599">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">WDExLWxqdWRldCBibGlyIGRldCB2YW5saWdhIHN5c3RlbXZhcm5pbmdzbGp1ZGV0IHNvbSB2YWx0cyBw
-w6UgaW5zdMOkbGxuaW5nc3BhbmVsZW4gTGp1ZGVmZmVrdGVyIGkgU3lzdGVtaW5zdMOkbGxuaW5nYXIu
-A</string>
+													<string key="NSContents">X11-ljudet blir det vanliga systemvarningsljudet som valts på inställningspanelen Ljudeffekter i Systeminställningar.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="1039016593"/>
@@ -639,7 +638,7 @@ A</string>
 													<int key="NSButtonFlags2">1</int>
 													<object class="NSFont" key="NSAlternateImage">
 														<string key="NSName">LucidaGrande</string>
-														<double key="NSSize">1.300000e+01</double>
+														<double key="NSSize">13</double>
 														<int key="NSfFlags">16</int>
 													</object>
 													<string key="NSAlternateContents"/>
@@ -650,7 +649,7 @@ A</string>
 													<int key="NSPeriodicInterval">75</int>
 													<object class="NSMenuItem" key="NSMenuItem" id="616492372">
 														<reference key="NSMenu" ref="341113515"/>
-														<string type="base64-UTF8" key="NSTitle">RnLDpW4gYmlsZHNrw6RybQ</string>
+														<string key="NSTitle">Från bildskärm</string>
 														<string key="NSKeyEquiv"/>
 														<int key="NSKeyEquivModMask">1048576</int>
 														<int key="NSMnemonicLoc">2147483647</int>
@@ -671,7 +670,7 @@ A</string>
 															<reference ref="616492372"/>
 															<object class="NSMenuItem" id="759499526">
 																<reference key="NSMenu" ref="341113515"/>
-																<string type="base64-UTF8" key="NSTitle">MjU2IGbDpHJnZXI</string>
+																<string key="NSTitle">256 färger</string>
 																<string key="NSKeyEquiv"/>
 																<int key="NSKeyEquivModMask">1048576</int>
 																<int key="NSMnemonicLoc">2147483647</int>
@@ -706,6 +705,7 @@ A</string>
 																<reference key="NSTarget" ref="633115429"/>
 															</object>
 														</object>
+														<reference key="NSMenuFont" ref="463863101"/>
 													</object>
 													<int key="NSPreferredEdge">3</int>
 													<bool key="NSUsesItemFromMenu">YES</bool>
@@ -739,7 +739,7 @@ A</string>
 												<object class="NSTextFieldCell" key="NSCell" id="311969422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWx0ZXJuYXRpdmV0IGLDtnJqYXIgZ8OkbGxhIG7DpHN0YSBnw6VuZyBYMTEgw7ZwcG5hcy4</string>
+													<string key="NSContents">Alternativet börjar gälla nästa gång X11 öppnas.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="86150604"/>
@@ -756,7 +756,7 @@ A</string>
 												<object class="NSButtonCell" key="NSCell" id="631531164">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">SGVsc2vDpHJtc2zDpGdlA</string>
+													<string key="NSContents">Helskärmsläge</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477203622"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -778,7 +778,7 @@ A</string>
 												<object class="NSButtonCell" key="NSCell" id="917248662">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">VmlzYSBtZW55ZsOkbHRldCBhdXRvbWF0aXNrdCBpIGhlbHNrw6RybXNsw6RnZQ</string>
+													<string key="NSContents">Visa menyfältet automatiskt i helskärmsläge</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="57246850"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -800,8 +800,7 @@ A</string>
 												<object class="NSTextFieldCell" key="NSCell" id="761107402">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWt0aXZlcmFyIFgxMTpzIHJvdGbDtm5zdGVyLiBUcnljayBuZWQga29tbWFuZG8tYWx0LUEgZsO2ciBh
-dHQgdsOkeGxhIHRpbGwgb2NoIGZyw6VuIGhlbHNrw6RybXNsw6RnZS4</string>
+													<string key="NSContents">Aktiverar X11:s rotfönster. Tryck ned kommando-alt-A för att växla till och från helskärmsläge.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="298603383"/>
@@ -856,9 +855,7 @@ dHQgdsOkeGxhIHRpbGwgb2NoIGZyw6VuIGhlbHNrw6RybXNsw6RnZS4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="572508492">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWt0aXZlcmFyIG1lbnlhbHRlcm5hdGl2ZXQg4oCdS29waWVyYeKAnSBvY2ggZ8O2ciBkZXQgbcO2amxp
-Z3QgYXR0IHN5bmtyb25pc2VyYSBtZWxsYW4gdXJrbGlwcCBpIE9TWCBvY2ggQ0xJUEJPQVJELSBvY2gg
-UFJJTUFSWS1idWZmZXJ0YXJuYSBpIFgxMS4</string>
+													<string key="NSContents">Aktiverar menyalternativet ”Kopiera” och gör det möjligt att synkronisera mellan urklipp i OSX och CLIPBOARD- och PRIMARY-buffertarna i X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="386152084"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -874,7 +871,7 @@ UFJJTUFSWS1idWZmZXJ0YXJuYSBpIFgxMS4</string>
 												<object class="NSButtonCell" key="NSCell" id="501304422">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">VXBwZGF0ZXJhIENMSVBCT0FSRCBuw6RyIHVya2xpcHAgw6RuZHJhcy4</string>
+													<string key="NSContents">Uppdatera CLIPBOARD när urklipp ändras.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="477050998"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -896,7 +893,7 @@ UFJJTUFSWS1idWZmZXJ0YXJuYSBpIFgxMS4</string>
 												<object class="NSButtonCell" key="NSCell" id="510771323">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">VXBwZGF0ZXJhIFBSSU1BUlkgKG1lbGxhbmtsaWNrKSBuw6RyIHVya2xpcHAgw6RuZHJhcy4</string>
+													<string key="NSContents">Uppdatera PRIMARY (mellanklick) när urklipp ändras.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="765780304"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -918,7 +915,7 @@ UFJJTUFSWS1idWZmZXJ0YXJuYSBpIFgxMS4</string>
 												<object class="NSButtonCell" key="NSCell" id="897099877">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">VXBwZGF0ZXJhIHVya2xpcHAgZGlyZWt0IG7DpHIgbnkgdGV4dCBtYXJrZXJhcy4</string>
+													<string key="NSContents">Uppdatera urklipp direkt när ny text markeras.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="1002778833"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -940,7 +937,7 @@ UFJJTUFSWS1idWZmZXJ0YXJuYSBpIFgxMS4</string>
 												<object class="NSButtonCell" key="NSCell" id="619977658">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">VXBwZGF0ZXJhIHVya2xpcHAgbsOkciBDTElQQk9BUkQgw6RuZHJhcy4</string>
+													<string key="NSContents">Uppdatera urklipp när CLIPBOARD ändras.</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="487809555"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -962,8 +959,7 @@ UFJJTUFSWS1idWZmZXJ0YXJuYSBpIFgxMS4</string>
 												<object class="NSTextFieldCell" key="NSCell" id="461823902">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QXZha3RpdmVyYSBkZXQgaMOkciBhbHRlcm5hdGl2ZXQgb20gZHUgdmlsbCBhbnbDpG5kYSB4Y2xpcGJv
-YXJkLCBrbGlwcGVyLCBlbGxlciBuw6Vnb24gYW5uYW4gdXJrbGlwcHNoYW50ZXJhcmUgaSBYMTEuA</string>
+													<string key="NSContents">Avaktivera det här alternativet om du vill använda xclipboard, klipper, eller någon annan urklippshanterare i X11.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="620944856"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -979,8 +975,7 @@ YXJkLCBrbGlwcGVyLCBlbGxlciBuw6Vnb24gYW5uYW4gdXJrbGlwcHNoYW50ZXJhcmUgaSBYMTEuA</s
 												<object class="NSTextFieldCell" key="NSCell" id="994587858">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">UMOlIGdydW5kIGF2IGJlZ3LDpG5zbmluZ2FyIGkgWDExLXByb3Rva29sbGV0IGthbnNrZSBkZXQgaMOk
-ciBhbHRlcm5hdGl2ZXQgaW50ZSBmdW5nZXJhciBpIHZpc3NhIHByb2dyYW0uA</string>
+													<string key="NSContents">På grund av begränsningar i X11-protokollet kanske det här alternativet inte fungerar i vissa program.</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="522511724"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1012,7 +1007,7 @@ ciBhbHRlcm5hdGl2ZXQgaW50ZSBmdW5nZXJhciBpIHZpc3NhIHByb2dyYW0uA</string>
 												<object class="NSButtonCell" key="NSCell" id="259618205">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">S2xpY2thIGlnZW5vbSBpbmFrdGl2YSBmw7Zuc3Rlcg</string>
+													<string key="NSContents">Klicka igenom inaktiva fönster</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="657659108"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1028,7 +1023,7 @@ ciBhbHRlcm5hdGl2ZXQgaW50ZSBmdW5nZXJhciBpIHZpc3NhIHByb2dyYW0uA</string>
 											<object class="NSTextField" id="290578835">
 												<reference key="NSNextResponder" ref="184765684"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{23, 175}, {385, 31}}</string>
+												<string key="NSFrame">{{32, 175}, {385, 31}}</string>
 												<reference key="NSSuperview" ref="184765684"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="399127858">
@@ -1053,7 +1048,7 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 												<object class="NSButtonCell" key="NSCell" id="959555182">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">Rm9rdXMgZsO2bGplciBtdXM</string>
+													<string key="NSContents">Fokus följer mus</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="992839333"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1069,14 +1064,13 @@ cmthIGlubmVow6VsbGV0Lgo</string>
 											<object class="NSTextField" id="138261120">
 												<reference key="NSNextResponder" ref="184765684"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{23, 128}, {385, 17}}</string>
+												<string key="NSFrame">{{32, 128}, {385, 17}}</string>
 												<reference key="NSSuperview" ref="184765684"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="183409141">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">RsO2bnN0ZXJmb2t1cyBpIFgxMSBmw7ZsamVyIHBla2FyZW4uIERldCBow6RyIGhhciBuw6VncmEgYmll
-ZmZla3Rlci4</string>
+													<string key="NSContents">Fönsterfokus i X11 följer pekaren. Det här har några bieffekter.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="138261120"/>
@@ -1093,7 +1087,7 @@ ZmZla3Rlci4</string>
 												<object class="NSButtonCell" key="NSCell" id="556463187">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">Rm9rdXMgcMOlIG55YSBmw7Zuc3Rlcg</string>
+													<string key="NSContents">Fokus på nya fönster</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="128352289"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1109,15 +1103,13 @@ ZmZla3Rlci4</string>
 											<object class="NSTextField" id="57161931">
 												<reference key="NSNextResponder" ref="184765684"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{23, 73}, {385, 28}}</string>
+												<string key="NSFrame">{{32, 73}, {385, 28}}</string>
 												<reference key="NSSuperview" ref="184765684"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="989804990">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">TWVkIGRldCBow6RyIGFsdGVybmF0aXZldCBrb21tZXIgc2thcGFuZGV0IGF2IGV0dCBueXR0IFgxMS1m
-w7Zuc3RlciBhdHQgbMOkZ2dhIFgxMSDDtnZlcnN0IChpc3TDpGxsZXQgZsO2ciBGaW5kZXIsIFRlcm1p
-bmFsLCBldGMuKQ</string>
+													<string key="NSContents">Med det här alternativet kommer skapandet av ett nytt X11-fönster att lägga X11 överst (istället för Finder, Terminal, etc.)</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="57161931"/>
@@ -1128,7 +1120,7 @@ bmFsLCBldGMuKQ</string>
 										</object>
 										<string key="NSFrame">{{10, 33}, {438, 246}}</string>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">RsO2bnN0ZXI</string>
+									<string key="NSLabel">Fönster</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -1169,7 +1161,7 @@ bmFsLCBldGMuKQ</string>
 												<object class="NSButtonCell" key="NSCell" id="489340979">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">0</int>
-													<string type="base64-UTF8" key="NSContents">VGlsbMOldCBhbnNsdXRuaW5nYXIgZnLDpW4gbsOkdHZlcmtza2xpZW50ZXI</string>
+													<string key="NSContents">Tillåt anslutningar från nätverksklienter</string>
 													<reference key="NSSupport" ref="463863101"/>
 													<reference key="NSControlView" ref="700826966"/>
 													<int key="NSButtonFlags">1211912703</int>
@@ -1191,9 +1183,7 @@ bmFsLCBldGMuKQ</string>
 												<object class="NSTextFieldCell" key="NSCell" id="53243865">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">TsOkciBkdSDDtnBwbmFyIFgxMSBza2FwYXMgWGF1dGhvcml0eS1ueWNrbGFyIHNvbSBrb250cm9sbGVy
-YXIgw6V0a29tc3QuIE9tIGRhdG9ybnMgSVAtYWRyZXNzIMOkbmRyYXMgYmxpciBueWNrbGFybmEgb2dp
-bHRpZ2Egdmlsa2V0IGthbiBmw7ZyaGluZHJhIGF0dCBYMTEtcHJvZ3JhbSDDtnBwbmFzLg</string>
+													<string key="NSContents">När du öppnar X11 skapas Xauthority-nycklar som kontrollerar åtkomst. Om datorns IP-adress ändras blir nycklarna ogiltiga vilket kan förhindra att X11-program öppnas.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="168436707"/>
@@ -1210,10 +1200,7 @@ bHRpZ2Egdmlsa2V0IGthbiBmw7ZyaGluZHJhIGF0dCBYMTEtcHJvZ3JhbSDDtnBwbmFzLg</string>
 												<object class="NSTextFieldCell" key="NSCell" id="390084685">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">T20gZGV0IMOkciBha3RpdmVyYXQgbcOlc3RlIEF1dGVudGlzZXJhIGFuc2x1dG5pbmdhciBvY2tzw6Ug
-dmFyYSBha3RpdmVyYXQgZsO2ciBhdHQgc8Oka2Vyc3TDpGxsYSBzw6RrZXJoZXRlbiBpIHN5c3RlbWV0
-LiBPbSBkZXQgw6RyIGF2YWt0aXZlcmF0IHRpbGzDpXRzIGludGUgYW5zbHV0bmluZ2FyIGZyw6VuIGZq
-w6RycnByb2dyYW0uA</string>
+													<string key="NSContents">Om det är aktiverat måste Autentisera anslutningar också vara aktiverat för att säkerställa säkerheten i systemet. Om det är avaktiverat tillåts inte anslutningar från fjärrprogram.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="363817195"/>
@@ -1230,7 +1217,7 @@ w6RycnByb2dyYW0uA</string>
 												<object class="NSTextFieldCell" key="NSCell" id="283628678">
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
-													<string type="base64-UTF8" key="NSContents">QWx0ZXJuYXRpdmVuIGLDtnJqYXIgZ8OkbGxhIG7DpHN0YSBnw6VuZyBYMTEgw7ZwcG5hcy4</string>
+													<string key="NSContents">Alternativen börjar gälla nästa gång X11 öppnas.</string>
 													<reference key="NSSupport" ref="26"/>
 													<string key="NSPlaceholderString"/>
 													<reference key="NSControlView" ref="223835729"/>
@@ -1241,7 +1228,7 @@ w6RycnByb2dyYW0uA</string>
 										</object>
 										<string key="NSFrame">{{10, 33}, {438, 246}}</string>
 									</object>
-									<string type="base64-UTF8" key="NSLabel">U8Oka2VyaGV0A</string>
+									<string key="NSLabel">Säkerhet</string>
 									<reference key="NSColor" ref="57160303"/>
 									<reference key="NSTabView" ref="448510093"/>
 								</object>
@@ -1261,7 +1248,7 @@ w6RycnByb2dyYW0uA</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSFrameAutosaveName">x11_prefs</string>
 			</object>
 			<object class="NSWindowTemplate" id="604417141">
@@ -1274,7 +1261,7 @@ w6RycnByb2dyYW0uA</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
-				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="85544634">
 					<nil key="NSNextResponder"/>
@@ -1359,12 +1346,12 @@ w6RycnByb2dyYW0uA</string>
 											<object class="NSMutableArray" key="NSTableColumns">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<object class="NSTableColumn" id="938444323">
-													<double key="NSWidth">1.227310e+02</double>
-													<double key="NSMinWidth">6.273100e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">122.73099999999999</double>
+													<double key="NSMinWidth">62.731000000000002</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Namn</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor" id="113872566">
@@ -1398,12 +1385,12 @@ w6RycnByb2dyYW0uA</string>
 													<string key="NSHeaderToolTip"/>
 												</object>
 												<object class="NSTableColumn" id="84282687">
-													<double key="NSWidth">1.000000e+02</double>
-													<double key="NSMinWidth">4.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">100</double>
+													<double key="NSMinWidth">40</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">75628032</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Kommando</string>
 														<reference key="NSSupport" ref="26"/>
 														<reference key="NSBackgroundColor" ref="113872566"/>
@@ -1426,12 +1413,12 @@ w6RycnByb2dyYW0uA</string>
 													<string key="NSHeaderToolTip"/>
 												</object>
 												<object class="NSTableColumn" id="242608782">
-													<double key="NSWidth">6.900000e+01</double>
-													<double key="NSMinWidth">1.000000e+01</double>
-													<double key="NSMaxWidth">1.000000e+03</double>
+													<double key="NSWidth">69</double>
+													<double key="NSMinWidth">10</double>
+													<double key="NSMaxWidth">1000</double>
 													<object class="NSTableHeaderCell" key="NSHeaderCell">
-														<int key="NSCellFlags">67239424</int>
-														<int key="NSCellFlags2">0</int>
+														<int key="NSCellFlags">75628096</int>
+														<int key="NSCellFlags2">2048</int>
 														<string key="NSContents">Kortkom.</string>
 														<reference key="NSSupport" ref="26"/>
 														<object class="NSColor" key="NSBackgroundColor">
@@ -1448,7 +1435,7 @@ w6RycnByb2dyYW0uA</string>
 														<string key="NSContents">Text Cell</string>
 														<object class="NSFont" key="NSSupport">
 															<string key="NSName">LucidaGrande</string>
-															<double key="NSSize">1.200000e+01</double>
+															<double key="NSSize">12</double>
 															<int key="NSfFlags">16</int>
 														</object>
 														<string key="NSPlaceholderString"/>
@@ -1458,7 +1445,7 @@ w6RycnByb2dyYW0uA</string>
 															<int key="NSColorSpace">6</int>
 															<string key="NSCatalogName">System</string>
 															<string key="NSColorName">controlBackgroundColor</string>
-															<reference key="NSColor" ref="854939654"/>
+															<reference key="NSColor" ref="832012125"/>
 														</object>
 														<reference key="NSTextColor" ref="930815747"/>
 													</object>
@@ -1469,8 +1456,8 @@ w6RycnByb2dyYW0uA</string>
 													<string key="NSHeaderToolTip"/>
 												</object>
 											</object>
-											<double key="NSIntercellSpacingWidth">3.000000e+00</double>
-											<double key="NSIntercellSpacingHeight">2.000000e+00</double>
+											<double key="NSIntercellSpacingWidth">3</double>
+											<double key="NSIntercellSpacingHeight">2</double>
 											<reference key="NSBackgroundColor" ref="822946413"/>
 											<object class="NSColor" key="NSGridColor">
 												<int key="NSColorSpace">6</int>
@@ -1481,16 +1468,20 @@ w6RycnByb2dyYW0uA</string>
 													<bytes key="NSWhite">MC41AA</bytes>
 												</object>
 											</object>
-											<double key="NSRowHeight">1.700000e+01</double>
+											<double key="NSRowHeight">17</double>
 											<int key="NSTvFlags">1379958784</int>
+											<reference key="NSDelegate"/>
+											<reference key="NSDataSource"/>
 											<int key="NSColumnAutoresizingStyle">1</int>
 											<int key="NSDraggingSourceMaskForLocal">-1</int>
 											<int key="NSDraggingSourceMaskForNonLocal">0</int>
 											<bool key="NSAllowsTypeSelect">YES</bool>
+											<int key="NSTableViewDraggingDestinationStyle">0</int>
 										</object>
 									</object>
 									<string key="NSFrame">{{1, 17}, {301, 198}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
+									<reference key="NSNextKeyView" ref="905092943"/>
 									<reference key="NSDocView" ref="905092943"/>
 									<reference key="NSBGColor" ref="812484075"/>
 									<int key="NScvFlags">4</int>
@@ -1502,7 +1493,7 @@ w6RycnByb2dyYW0uA</string>
 									<reference key="NSSuperview" ref="1063387772"/>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">9.949238e-01</double>
+									<double key="NSPercent">0.99492380000000002</double>
 								</object>
 								<object class="NSScroller" id="17278747">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1512,7 +1503,7 @@ w6RycnByb2dyYW0uA</string>
 									<int key="NSsFlags">1</int>
 									<reference key="NSTarget" ref="1063387772"/>
 									<string key="NSAction">_doScroller:</string>
-									<double key="NSPercent">6.885246e-01</double>
+									<double key="NSPercent">0.68852460000000004</double>
 								</object>
 								<object class="NSClipView" id="672307654">
 									<reference key="NSNextResponder" ref="1063387772"/>
@@ -1523,6 +1514,7 @@ w6RycnByb2dyYW0uA</string>
 									</object>
 									<string key="NSFrame">{{1, 0}, {301, 17}}</string>
 									<reference key="NSSuperview" ref="1063387772"/>
+									<reference key="NSNextKeyView" ref="792419186"/>
 									<reference key="NSDocView" ref="792419186"/>
 									<reference key="NSBGColor" ref="812484075"/>
 									<int key="NScvFlags">4</int>
@@ -1531,6 +1523,7 @@ w6RycnByb2dyYW0uA</string>
 							</object>
 							<string key="NSFrame">{{20, 20}, {318, 231}}</string>
 							<reference key="NSSuperview" ref="85544634"/>
+							<reference key="NSNextKeyView" ref="580565898"/>
 							<int key="NSsFlags">50</int>
 							<reference key="NSVScroller" ref="842897584"/>
 							<reference key="NSHScroller" ref="17278747"/>
@@ -1548,7 +1541,7 @@ w6RycnByb2dyYW0uA</string>
 							<object class="NSButtonCell" key="NSCell" id="1025474039">
 								<int key="NSCellFlags">-2080244224</int>
 								<int key="NSCellFlags2">137887744</int>
-								<string type="base64-UTF8" key="NSContents">TMOkZ2cgdGlsbCBvYmpla3Q</string>
+								<string key="NSContents">Lägg till objekt</string>
 								<reference key="NSSupport" ref="463863101"/>
 								<reference key="NSControlView" ref="758204686"/>
 								<int key="NSButtonFlags">-2038284033</int>
@@ -1567,7 +1560,7 @@ w6RycnByb2dyYW0uA</string>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMinSize">{320, 262}</string>
-				<string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSFrameAutosaveName">x11_apps</string>
 			</object>
 			<object class="NSMenu" id="294137138">
@@ -1611,7 +1604,7 @@ w6RycnByb2dyYW0uA</string>
 								</object>
 								<object class="NSMenuItem" id="1032342329">
 									<reference key="NSMenu" ref="48278059"/>
-									<string type="base64-UTF8" key="NSTitle">QW5wYXNzYeKApg</string>
+									<string key="NSTitle">Anpassa…</string>
 									<string key="NSKeyEquiv"/>
 									<int key="NSKeyEquivModMask">1048576</int>
 									<int key="NSMnemonicLoc">2147483647</int>
@@ -2186,28 +2179,26 @@ w6RycnByb2dyYW0uA</string>
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<object class="IBObjectRecord">
 						<int key="objectID">0</int>
-						<object class="NSArray" key="object" id="330408435">
-							<bool key="EncodedWithXMLCoder">YES</bool>
-						</object>
+						<reference key="object" ref="0"/>
 						<reference key="children" ref="904585544"/>
 						<nil key="parent"/>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-2</int>
 						<reference key="object" ref="815810918"/>
-						<reference key="parent" ref="330408435"/>
-						<string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">File's Owner</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-1</int>
 						<reference key="object" ref="941939442"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">First Responder</string>
 					</object>
 					<object class="IBObjectRecord">
 						<int key="objectID">-3</int>
 						<reference key="object" ref="951368722"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">Application</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2221,7 +2212,7 @@ w6RycnByb2dyYW0uA</string>
 							<reference ref="868031522"/>
 							<reference ref="551174276"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">MainMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2466,7 +2457,7 @@ w6RycnByb2dyYW0uA</string>
 					<object class="IBObjectRecord">
 						<int key="objectID">196</int>
 						<reference key="object" ref="485884620"/>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">X11Controller</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2476,7 +2467,7 @@ w6RycnByb2dyYW0uA</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="941366957"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">PrefsPanel</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2740,7 +2731,7 @@ w6RycnByb2dyYW0uA</string>
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<reference ref="85544634"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">EditPrograms</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -2763,7 +2754,7 @@ w6RycnByb2dyYW0uA</string>
 							<reference ref="318286212"/>
 							<reference ref="511651072"/>
 						</object>
-						<reference key="parent" ref="330408435"/>
+						<reference key="parent" ref="0"/>
 						<string key="objectName">DockMenu</string>
 					</object>
 					<object class="IBObjectRecord">
@@ -3315,10 +3306,8 @@ w6RycnByb2dyYW0uA</string>
 			</object>
 			<object class="NSMutableDictionary" key="flattenedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSMutableArray" key="dict.sortedKeys">
+				<object class="NSArray" key="dict.sortedKeys">
 					<bool key="EncodedWithXMLCoder">YES</bool>
-					<string>-1.IBPluginDependency</string>
-					<string>-2.IBPluginDependency</string>
 					<string>-3.IBPluginDependency</string>
 					<string>-3.ImportedFromIB2</string>
 					<string>100292.IBPluginDependency</string>
@@ -3376,7 +3365,6 @@ w6RycnByb2dyYW0uA</string>
 					<string>169.editorWindowContentRectSynchronizationRect</string>
 					<string>19.IBPluginDependency</string>
 					<string>19.ImportedFromIB2</string>
-					<string>196.IBPluginDependency</string>
 					<string>196.ImportedFromIB2</string>
 					<string>200295.IBPluginDependency</string>
 					<string>200295.IBShouldRemoveOnLegacySave</string>
@@ -3391,6 +3379,7 @@ w6RycnByb2dyYW0uA</string>
 					<string>24.ImportedFromIB2</string>
 					<string>24.editorWindowContentRectSynchronizationRect</string>
 					<string>244.IBEditorWindowLastContentRect</string>
+					<string>244.IBPluginDependency</string>
 					<string>244.IBPropertyAccessControl</string>
 					<string>244.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>244.IBWindowTemplateEditedContentRect</string>
@@ -3412,6 +3401,7 @@ w6RycnByb2dyYW0uA</string>
 					<string>272.IBPluginDependency</string>
 					<string>272.ImportedFromIB2</string>
 					<string>285.IBEditorWindowLastContentRect</string>
+					<string>285.IBPluginDependency</string>
 					<string>285.IBViewEditorWindowController.showingBoundsRectangles</string>
 					<string>285.IBViewEditorWindowController.showingLayoutRectangles</string>
 					<string>285.IBWindowTemplateEditedContentRect</string>
@@ -3586,6 +3576,7 @@ w6RycnByb2dyYW0uA</string>
 					<string>379.IBPluginDependency</string>
 					<string>379.IBPropertyAccessControl</string>
 					<string>379.ImportedFromIB2</string>
+					<string>380.IBEditorWindowLastContentRect</string>
 					<string>380.IBPluginDependency</string>
 					<string>380.ImportedFromIB2</string>
 					<string>381.IBPluginDependency</string>
@@ -3664,13 +3655,12 @@ w6RycnByb2dyYW0uA</string>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="1" id="9"/>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3688,331 +3678,330 @@ w6RycnByb2dyYW0uA</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<integer value="3" id="11"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{168, 821}, {113, 23}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{202, 626}, {154, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{349, 858}, {315, 153}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{271, 666}, {301, 153}}</string>
 					<string>{{444, 200}, {484, 308}}</string>
-					<reference ref="11"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="3"/>
 					<boolean value="NO"/>
 					<string>{{444, 200}, {484, 308}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{184, 290}, {481, 345}}</string>
-					<integer value="0" id="8"/>
-					<reference ref="9"/>
+					<integer value="0"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{58, 803}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{100, 746}, {155, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{68, 585}, {496, 271}}</string>
-					<reference ref="9"/>
-					<reference ref="9"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<integer value="1"/>
+					<integer value="1"/>
 					<string>{{68, 585}, {496, 271}}</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{433, 406}, {486, 327}}</string>
-					<reference ref="8"/>
-					<reference ref="9"/>
+					<integer value="0"/>
+					<integer value="1"/>
 					<string>{3.40282e+38, 3.40282e+38}</string>
 					<string>{320, 240}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{145, 836}, {347, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{67, 819}, {336, 20}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
+					<integer value="3"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
+					<string>{{530, 368}, {171, 83}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{84, 676}, {127, 33}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="11"/>
-					<reference ref="9"/>
+					<integer value="3"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{20, 641}, {218, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>{{79, 616}, {218, 203}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<reference ref="9"/>
+					<integer value="1"/>
 				</object>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -4020,9 +4009,7 @@ w6RycnByb2dyYW0uA</string>
 			<nil key="activeLocalization"/>
 			<object class="NSMutableDictionary" key="localizations">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="NSArray" key="dict.sortedKeys">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
 				</object>
@@ -4060,6 +4047,15 @@ w6RycnByb2dyYW0uA</string>
 			</object>
 		</object>
 		<int key="IBDocument.localizationMode">0</int>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+			<integer value="1050" key="NS.object.0"/>
+		</object>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+			<integer value="3000" key="NS.object.0"/>
+		</object>
+		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
 		<string key="IBDocument.LastKnownRelativeProjectPath">../X11.xcodeproj</string>
 		<int key="IBDocument.defaultPropertyAccessControl">1</int>
 	</data>
diff --git a/hw/xquartz/bundle/Resources/sv.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/sv.lproj/main.nib/keyedobjects.nib
index 11f4bc9..ae0faf9 100644
Binary files a/hw/xquartz/bundle/Resources/sv.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/sv.lproj/main.nib/keyedobjects.nib differ
diff --git a/hw/xquartz/bundle/Resources/zh_CN.lproj/locversion.plist b/hw/xquartz/bundle/Resources/zh_CN.lproj/locversion.plist
index 8b8767f..1cbc91a 100644
--- a/hw/xquartz/bundle/Resources/zh_CN.lproj/locversion.plist
+++ b/hw/xquartz/bundle/Resources/zh_CN.lproj/locversion.plist
@@ -9,6 +9,6 @@
 	<key>LprojRevisionLevel</key>
 	<string>1</string>
 	<key>LprojVersion</key>
-	<string>75.1</string>
+	<string>83</string>
 </dict>
 </plist>
diff --git a/hw/xquartz/bundle/Resources/zh_TW.lproj/locversion.plist b/hw/xquartz/bundle/Resources/zh_TW.lproj/locversion.plist
index 15f4f1b..866f0f1 100644
--- a/hw/xquartz/bundle/Resources/zh_TW.lproj/locversion.plist
+++ b/hw/xquartz/bundle/Resources/zh_TW.lproj/locversion.plist
@@ -9,6 +9,6 @@
 	<key>LprojRevisionLevel</key>
 	<string>1</string>
 	<key>LprojVersion</key>
-	<string>73</string>
+	<string>83</string>
 </dict>
 </plist>
diff --git a/hw/xquartz/bundle/Resources/zh_TW.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/zh_TW.lproj/main.nib/designable.nib
index 96b6f1f..14a5fd0 100644
--- a/hw/xquartz/bundle/Resources/zh_TW.lproj/main.nib/designable.nib
+++ b/hw/xquartz/bundle/Resources/zh_TW.lproj/main.nib/designable.nib
@@ -396,7 +396,7 @@
 				<string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
 				<string key="NSWindowContentMinSize">{320, 240}</string>
 				<object class="NSView" key="NSWindowView" id="941366957">
-					<nil key="NSNextResponder"/>
+					<reference key="NSNextResponder"/>
 					<int key="NSvFlags">256</int>
 					<object class="NSMutableArray" key="NSSubviews">
 						<bool key="EncodedWithXMLCoder">YES</bool>
@@ -405,6 +405,7 @@
 							<int key="NSvFlags">256</int>
 							<string key="NSFrame">{{13, 10}, {458, 292}}</string>
 							<reference key="NSSuperview" ref="941366957"/>
+							<reference key="NSWindow"/>
 							<object class="NSMutableArray" key="NSTabViewItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSTabViewItem" id="287591690">
@@ -421,6 +422,7 @@
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{18, 210}, {402, 18}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
+												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="990762273">
 													<int key="NSCellFlags">67239424</int>
@@ -452,6 +454,7 @@
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{36, 92}, {399, 14}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
+												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="391919450">
 													<int key="NSCellFlags">67239424</int>
@@ -469,7 +472,7 @@
 														<int key="NSColorSpace">6</int>
 														<string key="NSCatalogName">System</string>
 														<string key="NSColorName">controlColor</string>
-														<object class="NSColor" key="NSColor" id="7507385">
+														<object class="NSColor" key="NSColor" id="281801621">
 															<int key="NSColorSpace">3</int>
 															<bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
 														</object>
@@ -488,8 +491,9 @@
 											<object class="NSTextField" id="282885445">
 												<reference key="NSNextResponder" ref="596750588"/>
 												<int key="NSvFlags">256</int>
-												<string key="NSFrame">{{36, 162}, {385, 42}}</string>
+												<string key="NSFrame">{{36, 176}, {385, 28}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
+												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="649334366">
 													<int key="NSCellFlags">67239424</int>
@@ -508,6 +512,7 @@ vKDnmoTkuK3plpPmiJblj7PpgormjInpiJXjgIIKA</string>
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{18, 112}, {402, 18}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
+												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="940564599">
 													<int key="NSCellFlags">67239424</int>
@@ -530,6 +535,7 @@ vKDnmoTkuK3plpPmiJblj7PpgormjInpiJXjgIIKA</string>
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{36, 141}, {385, 14}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
+												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSTextFieldCell" key="NSCell" id="666057093">
 													<int key="NSCellFlags">67239424</int>
@@ -548,6 +554,7 @@ h4njgII</string>
 												<int key="NSvFlags">256</int>
 												<string key="NSFrame">{{18, 161}, {402, 18}}</string>
 												<reference key="NSSuperview" ref="596750588"/>
+												<reference key="NSWindow"/>
 												<bool key="NSEnabled">YES</bool>
 												<object class="NSButtonCell" key="NSCell" id="967619578">
 													<int key="NSCellFlags">67239424</int>
@@ -568,6 +575,7 @@ h4njgII</string>
 										</object>
 										<string key="NSFrame">{{10, 33}, {438, 246}}</string>
 										<reference key="NSSuperview" ref="448510093"/>
+										<reference key="NSWindow"/>
 									</object>
 									<string type="base64-UTF8" key="NSLabel">6Ly45YWlA</string>
 									<reference key="NSColor" ref="57160303"/>
@@ -1113,7 +1121,7 @@ uOWPjeeahOaViOaenOOAgg</string>
 													<int key="NSCellFlags">67239424</int>
 													<int key="NSCellFlags2">4194304</int>
 													<string type="base64-UTF8" key="NSContents">55W25ZWT55So5pmC77yM5paw5bu655qEIFgxMSDoppbnqpflsIfmnIPkvb8gWDExLmFwcO+8iOiAjOS4
-jeaYryBGaW5kZXIuYXBw44CBVGVybWluYWwuYXBwIOetie+8ieenu+iHs+acgOWJjeOAgg</string>
+jeaYryBGaW5kZXIuYXBw44CB57WC56uv5qmfLmFwcCDnrYnvvInnp7voh7PmnIDliY3jgII</string>
 													<reference key="NSSupport" ref="26"/>
 													<reference key="NSControlView" ref="57161931"/>
 													<reference key="NSBackgroundColor" ref="57160303"/>
@@ -1252,6 +1260,8 @@ s7vntbHnmoQgSVAg5L2N5Z2A5pu05YuV77yM6YCZ5Lqb6Y215bCH5pyD54Sh5pWI77yM6YCZ5Y+v6IO9
 						</object>
 					</object>
 					<string key="NSFrameSize">{484, 308}</string>
+					<reference key="NSSuperview"/>
+					<reference key="NSWindow"/>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMinSize">{320, 262}</string>
@@ -1450,7 +1460,7 @@ s7vntbHnmoQgSVAg5L2N5Z2A5pu05YuV77yM6YCZ5Lqb6Y215bCH5pyD54Sh5pWI77yM6YCZ5Y+v6IO9
 															<int key="NSColorSpace">6</int>
 															<string key="NSCatalogName">System</string>
 															<string key="NSColorName">controlBackgroundColor</string>
-															<reference key="NSColor" ref="7507385"/>
+															<reference key="NSColor" ref="281801621"/>
 														</object>
 														<reference key="NSTextColor" ref="930815747"/>
 													</object>
diff --git a/hw/xquartz/bundle/Resources/zh_TW.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/zh_TW.lproj/main.nib/keyedobjects.nib
index 4c99736..3f516a3 100644
Binary files a/hw/xquartz/bundle/Resources/zh_TW.lproj/main.nib/keyedobjects.nib and b/hw/xquartz/bundle/Resources/zh_TW.lproj/main.nib/keyedobjects.nib differ
commit 996357e905c1082479bb238110b93bc170b8cb84
Author: Joe Krahn <jkrahn at nc.rr.com>
Date:   Tue Jan 20 17:22:37 2009 +0000

    Cygwin/X: Update icons directly, rather than modifying the window's class
    
    Update icons directly to windows rather than modifying
    the window's class.  Respect custom icons overriden via
    the configuration file.
    
    fd.o bugzilla #4491
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/winmultiwindowicons.c b/hw/xwin/winmultiwindowicons.c
index 88416bb..8200aad 100644
--- a/hw/xwin/winmultiwindowicons.c
+++ b/hw/xwin/winmultiwindowicons.c
@@ -364,43 +364,37 @@ void
 winUpdateIcon (Window id)
 {
   WindowPtr		pWin;
-  HICON			hIcon, hiconOld;
+  HICON			hIcon, hIconSmall=NULL, hIconOld;
 
   pWin = (WindowPtr) LookupIDByType (id, RT_WINDOW);
   if (!pWin) return;
-  hIcon = winOverrideIcon ((unsigned long)pWin);
+  winWindowPriv(pWin);
+  if (pWinPriv->hWnd) {
+    hIcon = winOverrideIcon ((unsigned long)pWin);
+    if (!hIcon) {
+      hIcon = winXIconToHICON (pWin, GetSystemMetrics(SM_CXICON));
+      if (!hIcon) {
+        hIcon = g_hIconX;
+        hIconSmall = g_hSmallIconX;
+      } else {
+        /* Leave undefined if not found */
+        hIconSmall = winXIconToHICON (pWin, GetSystemMetrics(SM_CXSMICON));
+      }
+    }
 
-  if (!hIcon)
-    hIcon = winXIconToHICON (pWin, GetSystemMetrics(SM_CXICON));
+    /* Set the large icon */
+    hIconOld = (HICON) SendMessage (pWinPriv->hWnd,
+                     WM_SETICON, ICON_BIG, (LPARAM) hIcon);
 
-  if (hIcon)
-    {
-      winWindowPriv(pWin);
+    /* Delete the icon if its not the default */
+    winDestroyIcon(hIconOld);
 
-      if (pWinPriv->hWnd)
-	{
-	  hiconOld = (HICON) SetClassLong (pWinPriv->hWnd,
-					   GCL_HICON,
-					   (int) hIcon);
-	  
-	  /* Delete the icon if its not the default */
-	  winDestroyIcon(hiconOld);
-	}
-    }
- 
-  hIcon = winXIconToHICON (pWin, GetSystemMetrics(SM_CXSMICON));
-  if (hIcon)
-    {
-      winWindowPriv(pWin);
+    /* Same for the small icon */
+    hIconOld = (HICON) SendMessage (pWinPriv->hWnd,
+                    WM_SETICON, ICON_SMALL, (LPARAM) hIconSmall);
+    winDestroyIcon(hIconOld);
 
-      if (pWinPriv->hWnd)
-	{
-	  hiconOld = (HICON) SetClassLong (pWinPriv->hWnd,
-					   GCL_HICONSM,
-					   (int) hIcon);
-	  winDestroyIcon (hiconOld);
-	}
-    }
+  }
 }
 
 void winInitGlobalIcons (void)
diff --git a/hw/xwin/winprefs.c b/hw/xwin/winprefs.c
index 8152064..fe49ae2 100644
--- a/hw/xwin/winprefs.c
+++ b/hw/xwin/winprefs.c
@@ -189,35 +189,28 @@ ReloadEnumWindowsProc (HWND hwnd, LPARAM lParam)
   /* It's our baby, either clean or dirty it */
   if (lParam==FALSE) 
     {
-      hicon = (HICON)GetClassLong(hwnd, GCL_HICON);
+      /* Reset the window's icon to undefined. */
+      hicon = (HICON)SendMessage(hwnd, WM_SETICON, ICON_BIG, 0);
 
-      /* Unselect any icon in the class structure */
-      SetClassLong (hwnd, GCL_HICON, (LONG)LoadIcon (NULL, IDI_APPLICATION));
-
-      /* If it's generated on-the-fly, get rid of it, will regen */
+      /* If the old icon is generated on-the-fly, get rid of it, will regen */
       winDestroyIcon (hicon);
-     
-      hicon = (HICON)GetClassLong(hwnd, GCL_HICONSM);
-
-      /* Unselect any icon in the class structure */
-      SetClassLong (hwnd, GCL_HICONSM, 0);
 
-      /* If it's generated on-the-fly, get rid of it, will regen */
+      /* Same for the small icon */
+      hicon = (HICON)SendMessage(hwnd, WM_SETICON, ICON_SMALL, 0);
       winDestroyIcon (hicon);
-      
-      /* Remove any menu additions, use bRevert flag */
+
+      /* Remove any menu additions; bRevert=TRUE destroys any modified menus */
       GetSystemMenu (hwnd, TRUE);
       
-      /* This window is now clean of our taint */
+      /* This window is now clean of our taint (but with undefined icons) */
     }
   else
     {
-      /* Make the icon default, dynamic, or from xwinrc */
-      SetClassLong (hwnd, GCL_HICON, (LONG)g_hIconX);
-      SetClassLong (hwnd, GCL_HICONSM, (LONG)g_hSmallIconX);
+      /* winUpdateIcon() will set the icon default, dynamic, or from xwinrc */
       wid = (Window)GetProp (hwnd, WIN_WID_PROP);
       if (wid)
 	winUpdateIcon (wid);
+
       /* Update the system menu for this window */
       SetupSysMenu ((unsigned long)hwnd);
 
@@ -241,8 +234,12 @@ ReloadPrefs (void)
   int i;
 
 #ifdef XWIN_MULTIWINDOW
-  /* First, iterate over all windows replacing their icon with system */
-  /* default one and deleting any custom system menus                 */
+  /* First, iterate over all windows, deleting their icons and custom menus.
+   * This is really only needed because winDestroyIcon() will try to
+   * destroy the old global icons, which will have changed.
+   * It is probably better to set a windows USER_DATA to flag locally defined
+   * icons, and use that to accurately know when to destroy old icons.
+   */
   EnumThreadWindows (g_dwCurrentThreadID, ReloadEnumWindowsProc, FALSE);
 #endif
   
diff --git a/hw/xwin/winwin32rootlesswindow.c b/hw/xwin/winwin32rootlesswindow.c
index 3f521d6..2b2f630 100755
--- a/hw/xwin/winwin32rootlesswindow.c
+++ b/hw/xwin/winwin32rootlesswindow.c
@@ -177,12 +177,12 @@ winMWExtWMUpdateIcon (Window id)
 
       if (pRLWinPriv->hWnd)
 	{
-	  hiconOld = (HICON) SetClassLong (pRLWinPriv->hWnd,
-					   GCL_HICON,
-					   (int) hIcon);
-	  
+
+          hiconOld = (HICON) SendMessage (pRLWinPriv->hWnd,
+                     WM_SETICON, ICON_BIG, (LPARAM) hIcon);
           winDestroyIcon(hiconOld);
 	}
+      hIcon=NULL;
     }
 }
 
commit 9955252564922e7e8702dfb6eab52c75605a4a22
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Mon Jan 5 17:55:58 2009 +0000

    Cygwin/X: Remove unused TimeSinceLastInputEvent()
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/InitInput.c b/hw/xwin/InitInput.c
index 76c1715..2eaa024 100644
--- a/hw/xwin/InitInput.c
+++ b/hw/xwin/InitInput.c
@@ -48,7 +48,6 @@ DISPATCH_PROC(winProcSetSelectionOwner);
  * Local global declarations
  */
 
-CARD32				g_c32LastInputEventTime = 0;
 DeviceIntPtr g_pwinPointer;
 DeviceIntPtr g_pwinKeyboard;
 
@@ -110,15 +109,6 @@ void DDXRingBell(int volume, int pitch, int duration)
 }
 
 
-int
-TimeSinceLastInputEvent ()
-{
-  if (g_c32LastInputEventTime == 0)
-    g_c32LastInputEventTime = GetTickCount ();
-  return GetTickCount () - g_c32LastInputEventTime;
-}
-
-
 /* See Porting Layer Definition - p. 17 */
 void
 InitInput (int argc, char *argv[])
diff --git a/hw/xwin/win.h b/hw/xwin/win.h
index 8005d5b..9009df2 100644
--- a/hw/xwin/win.h
+++ b/hw/xwin/win.h
@@ -636,7 +636,6 @@ extern DevPrivateKey		g_iGCPrivateKey;
 extern DevPrivateKey		g_iPixmapPrivateKey;
 extern DevPrivateKey		g_iWindowPrivateKey;
 extern unsigned long		g_ulServerGeneration;
-extern CARD32			g_c32LastInputEventTime;
 extern DWORD			g_dwEnginesSupported;
 extern HINSTANCE		g_hInstance;
 extern int                      g_copyROP[];
diff --git a/hw/xwin/winmouse.c b/hw/xwin/winmouse.c
index 188126b..9cfc945 100644
--- a/hw/xwin/winmouse.c
+++ b/hw/xwin/winmouse.c
@@ -354,7 +354,6 @@ winMouseButtonsHandle (ScreenPtr pScreen,
 void winEnqueueMotion(int x, int y)
 {
   miPointerSetPosition(g_pwinPointer, &x, &y);
-  g_c32LastInputEventTime = GetTickCount();
 
   int i, nevents;
   int valuators[2];
commit 966c8fccf16e77c8f459b4b175718323f2ec5d58
Author: Colin Harrison <colin.harrison at virgin.net>
Date:   Mon Jan 5 18:04:42 2009 +0000

    Xming: Fix some log spam
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/winmultiwindowwm.c b/hw/xwin/winmultiwindowwm.c
index ea9dfca..194dbf6 100644
--- a/hw/xwin/winmultiwindowwm.c
+++ b/hw/xwin/winmultiwindowwm.c
@@ -1359,7 +1359,9 @@ winMultiWindowXMsgProcErrorHandler (Display *pDisplay, XErrorEvent *pErr)
 		 pErr->error_code,
 		 pszErrorMsg,
 		 sizeof (pszErrorMsg));
+#if CYGMULTIWINDOW_DEBUG
   ErrorF ("winMultiWindowXMsgProcErrorHandler - ERROR: %s\n", pszErrorMsg);
+#endif
   
   return 0;
 }
commit d190a27a33ab8c198568baf184fad14df57e24ad
Author: Colin Harrison <colin.harrison at virgin.net>
Date:   Thu Jan 29 11:00:49 2009 +0000

    Xming: Various tidy ups in winClipboardFlushXEvents()
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/winclipboardxevents.c b/hw/xwin/winclipboardxevents.c
index 0a64ba6..ec40814 100644
--- a/hw/xwin/winclipboardxevents.c
+++ b/hw/xwin/winclipboardxevents.c
@@ -311,6 +311,7 @@ winClipboardFlushXEvents (HWND hwnd,
 
 	  /* Initialize the text property */
 	  xtpText.value = NULL;
+	  xtpText.nitems = 0;
 
 	  /* Create the text property from the text list */
 	  if (fUseUnicode)
@@ -371,10 +372,13 @@ winClipboardFlushXEvents (HWND hwnd,
 	  /* Release the clipboard data */
 	  GlobalUnlock (hGlobal);
 	  pszGlobalData = NULL;
+	  fCloseClipboard = FALSE;
+	  CloseClipboard ();
 
 	  /* Clean up */
 	  XFree (xtpText.value);
 	  xtpText.value = NULL;
+	  xtpText.nitems = 0;
 
 	  /* Setup selection notify event */
 	  eventSelection.type = SelectionNotify;
@@ -405,7 +409,11 @@ winClipboardFlushXEvents (HWND hwnd,
 	winClipboardFlushXEvents_SelectionRequest_Done:
 	  /* Free allocated resources */
 	  if (xtpText.value)
+	  {
 	    XFree (xtpText.value);
+	    xtpText.value = NULL;
+	    xtpText.nitems = 0;
+	  }
 	  if (pszConvertData)
 	    free (pszConvertData);
 	  if (hGlobal && pszGlobalData)
@@ -446,7 +454,10 @@ winClipboardFlushXEvents (HWND hwnd,
 
 	  /* Close clipboard if it was opened */
 	  if (fCloseClipboard)
+	  {
+	    fCloseClipboard = FALSE;
 	    CloseClipboard ();
+	  }
 	  break;
 
 
@@ -628,6 +639,7 @@ winClipboardFlushXEvents (HWND hwnd,
 	      /* Conversion succeeded or some unconvertible characters */
 	      if (ppszTextList != NULL)
 		{
+		  iReturnDataLen = 0;
 		  for (i = 0; i < iCount; i++)
 		    {
 		      iReturnDataLen += strlen(ppszTextList[i]);
@@ -673,6 +685,7 @@ winClipboardFlushXEvents (HWND hwnd,
 	  ppszTextList = NULL;
 	  XFree (xtpText.value);
 	  xtpText.value = NULL;
+	  xtpText.nitems = 0;
 
 	  /* Convert the X clipboard string to DOS format */
 	  winClipboardUNIXtoDOS (&pszReturnData, strlen (pszReturnData));
@@ -786,7 +799,11 @@ winClipboardFlushXEvents (HWND hwnd,
 	  if (ppszTextList)
 	    XFreeStringList (ppszTextList);
 	  if (xtpText.value)
+	  {
 	    XFree (xtpText.value);
+	    xtpText.value = NULL;
+	    xtpText.nitems = 0;
+	  }
 	  if (pszConvertData)
 	    free (pszConvertData);
 	  if (pwszUnicodeStr)
commit fbe9ed27b1c2f932a74aa6ced134ecec021a3fc1
Author: Colin Harrison <colin.harrison at virgin.net>
Date:   Thu Jan 29 10:55:38 2009 +0000

    Xming: Avoid log spam if a windows application won't provide CF_UNICODETEXT clipboard format
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/winclipboardxevents.c b/hw/xwin/winclipboardxevents.c
index ab8d5e4..0a64ba6 100644
--- a/hw/xwin/winclipboardxevents.c
+++ b/hw/xwin/winclipboardxevents.c
@@ -191,8 +191,13 @@ winClipboardFlushXEvents (HWND hwnd,
 	  if (fUseUnicode
 	      && !IsClipboardFormatAvailable (CF_UNICODETEXT))
 	    {
-	      ErrorF ("winClipboardFlushXEvents - CF_UNICODETEXT is not "
-		      "available from Win32 clipboard.  Aborting.\n");
+	      static int count; /* Hack to stop acroread spamming the log */
+	      static HWND lasthwnd; /* I've not seen any other client get here repeatedly? */
+	      if (hwnd != lasthwnd) count = 0;
+	      count++;
+	      if (count < 6) ErrorF ("winClipboardFlushXEvents - CF_UNICODETEXT is not "
+		      "available from Win32 clipboard.  Aborting %d.\n", count);
+	      lasthwnd = hwnd;
 
 	      /* Abort */
 	      fAbort = TRUE;
commit 71ba9856a4f01aa7a42f1178c8da98a2e5ac23ae
Author: Colin Harrison <colin.harrison at virgin.net>
Date:   Tue Feb 3 15:52:11 2009 +0000

    Xming: Cache atom lookups in clipboard integration code
    
    Cache the CLIPBOARD atom lookups in winClipboardWindowProc()
    Cache atom lookups in winClipboardFlushXEvents()
    Recache on server regeneration
    
    Copyright (C) Colin Harrison 2005-2008
    http://www.straightrunning.com/XmingNotes/
    http://sourceforge.net/projects/xming/
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/winclipboardwndproc.c b/hw/xwin/winclipboardwndproc.c
index 04c0c58..65faedf 100644
--- a/hw/xwin/winclipboardwndproc.c
+++ b/hw/xwin/winclipboardwndproc.c
@@ -36,6 +36,7 @@
 #include <sys/types.h>
 #include <sys/time.h>
 #include "winclipboard.h"
+#include "misc.h"
 
 extern void		winFixClipboardChain();
 
@@ -261,6 +262,8 @@ winClipboardWindowProc (HWND hwnd, UINT message,
 
     case WM_DRAWCLIPBOARD:
       {
+	static Atom atomClipboard;
+	static int generation;
 	static Bool s_fProcessingDrawClipboard = FALSE;
 	Display	*pDisplay = g_pClipboardDisplay;
 	Window	iWindow = g_iClipboardWindow;
@@ -268,6 +271,12 @@ winClipboardWindowProc (HWND hwnd, UINT message,
 
 	winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD: Enter\n");
 
+	if (generation != serverGeneration)
+          {
+            generation = serverGeneration;
+            atomClipboard = XInternAtom (pDisplay, "CLIPBOARD", False);
+          }
+
 	/*
 	 * We've occasionally seen a loop in the clipboard chain.
 	 * Try and fix it on the first hint of recursion.
@@ -355,17 +364,13 @@ winClipboardWindowProc (HWND hwnd, UINT message,
 
 	    /* Release CLIPBOARD selection if owned */
 	    iReturn = XGetSelectionOwner (pDisplay,
-					  XInternAtom (pDisplay,
-						       "CLIPBOARD",
-						       False));
+					  atomClipboard);
 	    if (iReturn == g_iClipboardWindow)
 	      {
 		winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
 			"CLIPBOARD selection is owned by us.\n");
 		XSetSelectionOwner (pDisplay,
-				    XInternAtom (pDisplay,
-						 "CLIPBOARD",
-						 False),
+				    atomClipboard,
 				    None,
 				    CurrentTime);
 	      }
@@ -399,17 +404,12 @@ winClipboardWindowProc (HWND hwnd, UINT message,
 	
 	/* Reassert ownership of the CLIPBOARD */	  
 	iReturn = XSetSelectionOwner (pDisplay,
-				      XInternAtom (pDisplay,
-						   "CLIPBOARD",
-						   False),
+				      atomClipboard,
 				      iWindow,
 				      CurrentTime);
 
 	if (iReturn == BadAtom || iReturn == BadWindow ||
-	    XGetSelectionOwner (pDisplay,
-                                XInternAtom (pDisplay,
-                                             "CLIPBOARD",
-                                             False)) != iWindow)
+	    XGetSelectionOwner (pDisplay, atomClipboard) != iWindow)
 	  {
 	    winErrorFVerb (1, "winClipboardWindowProc - WM_DRAWCLIPBOARD - "
 		    "Could not reassert ownership of CLIPBOARD\n");
diff --git a/hw/xwin/winclipboardxevents.c b/hw/xwin/winclipboardxevents.c
index 95e86b1..ab8d5e4 100644
--- a/hw/xwin/winclipboardxevents.c
+++ b/hw/xwin/winclipboardxevents.c
@@ -34,6 +34,7 @@
 #include <xwin-config.h>
 #endif
 #include "winclipboard.h"
+#include "misc.h"
 
 
 /*
@@ -53,18 +54,20 @@ winClipboardFlushXEvents (HWND hwnd,
 			  Display *pDisplay,
 			  Bool fUseUnicode)
 {
-  Atom			atomLocalProperty = XInternAtom (pDisplay,
-							 WIN_LOCAL_PROPERTY,
-							 False);
-  Atom			atomUTF8String = XInternAtom (pDisplay,
-						      "UTF8_STRING",
-						      False);
-  Atom			atomCompoundText = XInternAtom (pDisplay,
-							"COMPOUND_TEXT",
-							False);
-  Atom			atomTargets = XInternAtom (pDisplay,
-						   "TARGETS",
-						   False);
+  static Atom atomLocalProperty;
+  static Atom atomCompoundText;
+  static Atom atomUTF8String;
+  static Atom atomTargets;
+  static int generation;
+
+  if (generation != serverGeneration)
+    {
+      generation = serverGeneration;
+      atomLocalProperty = XInternAtom (pDisplay, WIN_LOCAL_PROPERTY, False);
+      atomUTF8String = XInternAtom (pDisplay, "UTF8_STRING", False);
+      atomCompoundText = XInternAtom (pDisplay, "COMPOUND_TEXT", False);
+      atomTargets = XInternAtom (pDisplay, "TARGETS", False);
+    }
 
   /* Process all pending events */
   while (XPending (pDisplay))
commit 4ec110327bdc4f2617cd6116539812d7ef96b24e
Author: Colin Harrison <colin.harrison at virgin.net>
Date:   Sun Jan 4 18:29:49 2009 +0000

    Xming: Prevent the mouse wheel from stalling when another window is minimized.
    
    Fix internal WM to prevent the mouse wheel from stalling when another window is minimized.
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/winmultiwindowwndproc.c b/hw/xwin/winmultiwindowwndproc.c
index 0dd8885..becae29 100644
--- a/hw/xwin/winmultiwindowwndproc.c
+++ b/hw/xwin/winmultiwindowwndproc.c
@@ -786,6 +786,10 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
 	    if (!pWin || !pWin->overrideRedirect) /* for OOo menus */
 	      winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
 	}
+      /* Prevent the mouse wheel from stalling when another window is minimized */
+      if (HIWORD(wParam) == 0 && LOWORD(wParam) == WA_ACTIVE &&
+	  (HWND)lParam != NULL && (HWND)lParam != (HWND)GetParent(hwnd))
+	SetFocus(hwnd);
       return 0;
 
     case WM_ACTIVATEAPP:
commit 888e6961a4ee76d05d212cfb946f089caafb3f69
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Wed Jan 7 18:29:16 2009 +0000

    Cygwin/X: Correctly allow for the native window frame width in ValidateSizing()
    
    Fix internal WM to correctly calculate the native window border when validating window sizing
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/winmultiwindowwndproc.c b/hw/xwin/winmultiwindowwndproc.c
index b5e789c..0dd8885 100644
--- a/hw/xwin/winmultiwindowwndproc.c
+++ b/hw/xwin/winmultiwindowwndproc.c
@@ -207,6 +207,8 @@ ValidateSizing (HWND hwnd, WindowPtr pWin,
   WinXSizeHints sizeHints;
   RECT *rect;
   int iWidth, iHeight;
+  RECT rcClient, rcWindow;
+  int iBorderWidthX, iBorderWidthY;
 
   /* Invalid input checking */
   if (pWin==NULL || lParam==0)
@@ -228,19 +230,20 @@ ValidateSizing (HWND hwnd, WindowPtr pWin,
   iWidth = rect->right - rect->left;
   iHeight = rect->bottom - rect->top;
 
-  /* Now remove size of any borders */
-  iWidth -= 2 * GetSystemMetrics(SM_CXSIZEFRAME);
-  iHeight -= (GetSystemMetrics(SM_CYCAPTION)
-	      + 2 * GetSystemMetrics(SM_CYSIZEFRAME));
-	      
+  /* Now remove size of any borders and title bar */
+  GetClientRect(hwnd, &rcClient);
+  GetWindowRect(hwnd, &rcWindow);
+  iBorderWidthX = (rcWindow.right - rcWindow.left) - (rcClient.right - rcClient.left);
+  iBorderWidthY = (rcWindow.bottom - rcWindow.top) - (rcClient.bottom - rcClient.top);
+  iWidth -= iBorderWidthX;
+  iHeight -= iBorderWidthY;
 
   /* Constrain the size to legal values */
   ConstrainSize (sizeHints, &iWidth, &iHeight);
 
-  /* Add back the borders */
-  iWidth += 2 * GetSystemMetrics(SM_CXSIZEFRAME);
-  iHeight += (GetSystemMetrics(SM_CYCAPTION)
-	      + 2 * GetSystemMetrics(SM_CYSIZEFRAME));
+  /* Add back the size of borders and title bar */
+  iWidth += iBorderWidthX;
+  iHeight += iBorderWidthY;
 
   /* Adjust size according to where we're dragging from */
   switch(wParam) {
commit a72865868f03b675f86990476fcee601822894b3
Author: Joe Krahn <jkrahn at nc.rr.com>
Date:   Tue Jan 20 17:09:43 2009 +0000

    Cygwin/X: Consolidate dialog initialization in winInitDialog()
    
    Changed windialogs.c to set icons via window properties rather than class
    properties, and use LoadImage() for small icons, because LoadIcon() can only open
    large icons. Since this code is redundant across the dialogs, I put it in the
    winCenterDialog function, along with a few other redundant instructions, and
    renamed in winInitDialog().
    
    Also, don't bogusly put our dialogs at the center of the virtual desktop if we
    are on a multimonitor system (this causes the dialog to end up split across two
    monitors in a dual-monitor side-by-side setup)
    
    Corrections to use HWND_TOPMOST instead of HWND_TOP and not to use SWP_NOZORDER
    from Colin Harrison
    
    fd.o bugzilla #4491
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/windialogs.c b/hw/xwin/windialogs.c
index ab06b0d..274c046 100755
--- a/hw/xwin/windialogs.c
+++ b/hw/xwin/windialogs.c
@@ -181,32 +181,64 @@ winUnoverrideURLButton (HWND hwnd, int id)
 
 /*
  * Center a dialog window in the desktop window
+ * and set small and large icons to X icons.
  */
 
 static void
-winCenterDialog (HWND hwndDlg)
+winInitDialog (HWND hwndDlg)
 {
   HWND hwndDesk; 
-  RECT rc, rcDlg, rcDesk; 
+  RECT rc, rcDlg, rcDesk;
+  HICON hIcon, hIconSmall;
  
   hwndDesk = GetParent (hwndDlg);
   if (!hwndDesk || IsIconic (hwndDesk))
     hwndDesk = GetDesktopWindow (); 
   
-  GetWindowRect (hwndDesk, &rcDesk); 
-  GetWindowRect (hwndDlg, &rcDlg); 
-  CopyRect (&rc, &rcDesk); 
-  
-  OffsetRect (&rcDlg, -rcDlg.left, -rcDlg.top); 
-  OffsetRect (&rc, -rc.left, -rc.top); 
-  OffsetRect (&rc, -rcDlg.right, -rcDlg.bottom); 
-  
-  SetWindowPos (hwndDlg, 
-		HWND_TOP, 
-		rcDesk.left + (rc.right / 2), 
-		rcDesk.top + (rc.bottom / 2), 
+  /* Remove minimize and maximize buttons */
+  SetWindowLong (hwndDlg, GWL_STYLE,
+		 GetWindowLong (hwndDlg, GWL_STYLE)
+		 & ~(WS_MAXIMIZEBOX | WS_MINIMIZEBOX));
+
+  /* Set Window not to show in the task bar */
+  SetWindowLong (hwndDlg, GWL_EXSTYLE,
+		 GetWindowLong (hwndDlg, GWL_EXSTYLE) & ~WS_EX_APPWINDOW );
+
+  /* Center dialog window in the screen. Not done for multi-monitor systems, where
+   * it is likely to end up split across the screens. In that case, it appears
+   * near the Tray icon.
+   */
+  if (GetSystemMetrics(SM_CMONITORS)>1) {
+    /* Still need to refresh the frame change. */
+    SetWindowPos (hwndDlg, HWND_TOPMOST, 0,0,0,0,
+		SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
+  } else {
+    GetWindowRect (hwndDesk, &rcDesk);
+    GetWindowRect (hwndDlg, &rcDlg);
+    CopyRect (&rc, &rcDesk);
+
+    OffsetRect (&rcDlg, -rcDlg.left, -rcDlg.top);
+    OffsetRect (&rc, -rc.left, -rc.top);
+    OffsetRect (&rc, -rcDlg.right, -rcDlg.bottom);
+
+    SetWindowPos (hwndDlg,
+		HWND_TOPMOST,
+		rcDesk.left + (rc.right / 2),
+		rcDesk.top + (rc.bottom / 2),
 		0, 0,
-		SWP_NOSIZE | SWP_NOZORDER); 
+		SWP_NOSIZE | SWP_FRAMECHANGED);
+  }
+
+  /* Set icon to standard app icon */
+  hIcon = LoadIcon (g_hInstance, MAKEINTRESOURCE(IDI_XWIN));
+  hIconSmall = LoadImage (g_hInstance,
+                        MAKEINTRESOURCE(IDI_XWIN), IMAGE_ICON,
+                        GetSystemMetrics(SM_CXSMICON),
+                        GetSystemMetrics(SM_CYSMICON),
+                        LR_SHARED);
+
+  PostMessage (hwndDlg, WM_SETICON, ICON_BIG, (LPARAM) hIcon);
+  PostMessage (hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM) hIconSmall);
 }
 
 
@@ -271,15 +303,6 @@ winDisplayExitDialog (winPrivScreenPtr pScreenPriv)
 				  winExitDlgProc,
 				  (int) pScreenPriv);
 
-  /* Drop minimize and maximize buttons */
-  SetWindowLong (g_hDlgExit, GWL_STYLE,
-		 GetWindowLong (g_hDlgExit, GWL_STYLE)
-		 & ~(WS_MAXIMIZEBOX | WS_MINIMIZEBOX));
-  SetWindowLong (g_hDlgExit, GWL_EXSTYLE,
-		 GetWindowLong (g_hDlgExit, GWL_EXSTYLE) & ~WS_EX_APPWINDOW );
-  SetWindowPos (g_hDlgExit, HWND_TOPMOST, 0, 0, 0, 0,
-		SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE); 
- 
   /* Show the dialog box */
   ShowWindow (g_hDlgExit, SW_SHOW);
   
@@ -314,14 +337,7 @@ winExitDlgProc (HWND hDialog, UINT message,
 	/* Store pointers to private structures for future use */
 	s_pScreenPriv = (winPrivScreenPtr) lParam;
 	
-	winCenterDialog (hDialog);
-	
-	/* Set icon to standard app icon */
-	PostMessage (hDialog,
-		     WM_SETICON,
-		     ICON_SMALL,
-		     (LPARAM) LoadIcon (g_hInstance,
-					MAKEINTRESOURCE(IDI_XWIN)));
+	winInitDialog (hDialog);
 
 	/* Format the connected clients string */
 	pszConnectedClients = Xprintf (CONNECTED_CLIENTS_FORMAT,
@@ -413,17 +429,6 @@ winDisplayDepthChangeDialog (winPrivScreenPtr pScreenPriv)
 					 pScreenPriv->hwndScreen,
 					 winChangeDepthDlgProc,
 					 (int) pScreenPriv);
- 
-  /* Drop minimize and maximize buttons */
-  SetWindowLong (g_hDlgDepthChange, GWL_STYLE,
-		 GetWindowLong (g_hDlgDepthChange, GWL_STYLE)
-		 & ~(WS_MAXIMIZEBOX | WS_MINIMIZEBOX));
-  SetWindowLong (g_hDlgDepthChange, GWL_EXSTYLE,
-		 GetWindowLong (g_hDlgDepthChange, GWL_EXSTYLE)
-		 & ~WS_EX_APPWINDOW );
-  SetWindowPos (g_hDlgDepthChange, 0, 0, 0, 0, 0,
-		SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER | SWP_NOSIZE); 
-
   /* Show the dialog box */
   ShowWindow (g_hDlgDepthChange, SW_SHOW);
   
@@ -480,13 +485,7 @@ winChangeDepthDlgProc (HWND hwndDialog, UINT message,
 	      s_pScreenPriv->dwLastWindowsBitsPixel);
 #endif
       
-      winCenterDialog( hwndDialog );
-
-      /* Set icon to standard app icon */
-      PostMessage (hwndDialog,
-		   WM_SETICON,
-		   ICON_SMALL,
-		   (LPARAM) LoadIcon (g_hInstance, MAKEINTRESOURCE(IDI_XWIN)));
+      winInitDialog( hwndDialog );
 
       return TRUE;
 
@@ -572,15 +571,6 @@ winDisplayAboutDialog (winPrivScreenPtr pScreenPriv)
 				   winAboutDlgProc,
 				   (int) pScreenPriv);
  
-  /* Drop minimize and maximize buttons */
-  SetWindowLong (g_hDlgAbout, GWL_STYLE,
-		 GetWindowLong (g_hDlgAbout, GWL_STYLE)
-		 & ~(WS_MAXIMIZEBOX | WS_MINIMIZEBOX));
-  SetWindowLong (g_hDlgAbout, GWL_EXSTYLE,
-		 GetWindowLong (g_hDlgAbout, GWL_EXSTYLE) & ~WS_EX_APPWINDOW);
-  SetWindowPos (g_hDlgAbout, 0, 0, 0, 0, 0,
-		SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE); 
-
   /* Show the dialog box */
   ShowWindow (g_hDlgAbout, SW_SHOW);
 
@@ -622,13 +612,7 @@ winAboutDlgProc (HWND hwndDialog, UINT message,
       s_pScreenInfo = s_pScreenPriv->pScreenInfo;
       s_pScreen = s_pScreenInfo->pScreen;
 
-      winCenterDialog (hwndDialog);
-
-      /* Set icon to standard app icon */
-      PostMessage (hwndDialog,
-		   WM_SETICON,
-		   ICON_SMALL,
-		   (LPARAM) LoadIcon (g_hInstance, MAKEINTRESOURCE(IDI_XWIN)));
+      winInitDialog (hwndDialog);
 
       /* Override the URL buttons */
       winOverrideURLButton (hwndDialog, ID_ABOUT_CHANGELOG);
commit d053c3b35f730fdaddd22f841dbd8ed6c9a07ba0
Author: Colin Harrison <colin.harrison at virgin.net>
Date:   Sun Nov 2 20:46:40 2008 +0000

    Xming: Slightly adjust the formatting of the logged command line
    
    Copyright (C) Colin Harrison 2005-2008
    http://www.straightrunning.com/XmingNotes/
    http://sourceforge.net/projects/xming/
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/winprocarg.c b/hw/xwin/winprocarg.c
index 38ee9a2..f20598d 100755
--- a/hw/xwin/winprocarg.c
+++ b/hw/xwin/winprocarg.c
@@ -1448,13 +1448,13 @@ winLogCommandLine (int argc, char *argv[])
   for (i = 0, iCurrLen = 0; i < argc; ++i)
     if (argv[i])
       {
-	/* Add a character for lines that overflow */
+	/* Adds two characters for lines that overflow */
 	if ((strlen (argv[i]) < CHARS_PER_LINE
 	    && iCurrLen + strlen (argv[i]) > CHARS_PER_LINE)
 	    || strlen (argv[i]) > CHARS_PER_LINE)
 	  {
 	    iCurrLen = 0;
-	    ++iSize;
+	    iSize += 2;
 	  }
 	
 	/* Add space for item and trailing space */
@@ -1484,7 +1484,7 @@ winLogCommandLine (int argc, char *argv[])
 	iCurrLen = 0;
 	
 	/* Add line break if it fits */
-	strncat (g_pszCommandLine, "\n", iSize - strlen (g_pszCommandLine));
+	strncat (g_pszCommandLine, "\n ", iSize - strlen (g_pszCommandLine));
       }
       
       strncat (g_pszCommandLine, argv[i], iSize - strlen (g_pszCommandLine));
commit a7e23a79c1fc429aedbf9b6c0e78b1c8d7e02238
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue May 26 14:42:25 2009 +1000

    Xi: Add support for Enter and FocusIn grabs.
    
    Enter grabs are checked for in CheckMotion(), each time the sprite window
    changes the current grab is deactivated (if applicable) and the new grab is
    activated (if applicable). Exception - if the grab is on a parent window of
    the current window since we keep the grab across descendants.
    
    Since CheckMotion() may change the grab status of a device, we mustn't get
    "dev->deviceGrab.grab" in ProcessOtherEvents until after CheckMotion().
    FocusIn grabs are checked in much the same manner.
    
    The event delivery for grabs replaces the NotifyNormal on window change with
    a NotifyGrab on window change. Note that this happens before the grab
    activates, so the EnterNotify(NotifyGrab) is still delivered to the window,
    not to the grabbing client. This is in line with the core protocol semantics
    for NotifyGrab events.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 83891f8..91a3461 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -962,7 +962,7 @@ ProcessRawEvent(RawDeviceEvent *ev, DeviceIntPtr device)
 void
 ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
 {
-    GrabPtr grab = device->deviceGrab.grab;
+    GrabPtr grab;
     Bool deactivateDeviceGrab = FALSE;
     int key = 0, rootX, rootY;
     ButtonClassPtr b;
@@ -1060,6 +1060,7 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
 	CallCallbacks(&DeviceEventCallback, (pointer) & eventinfo);
     }
 #endif
+    grab = device->deviceGrab.grab;
 
     switch(event->type)
     {
@@ -1509,6 +1510,52 @@ GrabKey(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
     return AddPassiveGrabToList(client, grab);
 }
 
+/* Enter/FocusIn grab */
+int
+GrabWindow(ClientPtr client, DeviceIntPtr dev, int type,
+           GrabParameters *param, GrabMask *mask)
+{
+    WindowPtr pWin;
+    CursorPtr cursor;
+    GrabPtr grab;
+    Mask access_mode = DixGrabAccess;
+    int rc;
+
+    rc = CheckGrabValues(client, param);
+    if (rc != Success)
+        return rc;
+
+    rc = dixLookupWindow(&pWin, param->grabWindow, client, DixSetAttrAccess);
+    if (rc != Success)
+	return rc;
+    if (param->cursor == None)
+	cursor = NullCursor;
+    else {
+	rc = dixLookupResourceByType((pointer *)&cursor, param->cursor,
+				     RT_CURSOR, client, DixUseAccess);
+	if (rc != Success)
+	{
+	    client->errorValue = param->cursor;
+	    return (rc == BadValue) ? BadCursor : rc;
+	}
+	access_mode |= DixForceAccess;
+    }
+    if (param->this_device_mode == GrabModeSync || param->other_devices_mode == GrabModeSync)
+	access_mode |= DixFreezeAccess;
+    rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
+    if (rc != Success)
+	return rc;
+
+    grab = CreateGrab(client->index, dev, dev, pWin, GRABTYPE_XI2,
+                      mask, param, (type == XIGrabtypeEnter) ? XI_Enter : XI_FocusIn,
+                      0, NULL, cursor);
+
+    if (!grab)
+        return BadAlloc;
+
+    return AddPassiveGrabToList(client, grab);
+}
+
 int
 SelectForWindow(DeviceIntPtr dev, WindowPtr pWin, ClientPtr client,
 		Mask mask, Mask exclusivemasks)
@@ -1825,7 +1872,8 @@ DeleteDeviceFromAnyExtEvents(WindowPtr pWin, DeviceIntPtr dev)
 
 	switch (dev->focus->revert) {
 	case RevertToNone:
-	    DoFocusEvents(dev, pWin, NoneWin, focusEventMode);
+	    if (!ActivateFocusInGrab(dev, NoneWin))
+		DoFocusEvents(dev, pWin, NoneWin, focusEventMode);
 	    dev->focus->win = NoneWin;
 	    dev->focus->traceGood = 0;
 	    break;
@@ -1836,12 +1884,14 @@ DeleteDeviceFromAnyExtEvents(WindowPtr pWin, DeviceIntPtr dev)
 		dev->focus->traceGood--;
 	    }
 	    while (!parent->realized);
-	    DoFocusEvents(dev, pWin, parent, focusEventMode);
+	    if (!ActivateFocusInGrab(dev, parent))
+		DoFocusEvents(dev, pWin, parent, focusEventMode);
 	    dev->focus->win = parent;
 	    dev->focus->revert = RevertToNone;
 	    break;
 	case RevertToPointerRoot:
-	    DoFocusEvents(dev, pWin, PointerRootWin, focusEventMode);
+	    if (!ActivateFocusInGrab(dev, PointerRootWin))
+		DoFocusEvents(dev, pWin, PointerRootWin, focusEventMode);
 	    dev->focus->win = PointerRootWin;
 	    dev->focus->traceGood = 0;
 	    break;
@@ -1851,11 +1901,13 @@ DeleteDeviceFromAnyExtEvents(WindowPtr pWin, DeviceIntPtr dev)
                 if (!kbd || (kbd == dev && kbd != inputInfo.keyboard))
                     kbd = inputInfo.keyboard;
 	    if (kbd->focus->win) {
-		DoFocusEvents(dev, pWin, kbd->focus->win, focusEventMode);
+		if (!ActivateFocusInGrab(dev, kbd->focus->win))
+		    DoFocusEvents(dev, pWin, kbd->focus->win, focusEventMode);
 		dev->focus->win = FollowKeyboardWin;
 		dev->focus->traceGood = 0;
 	    } else {
-                DoFocusEvents(dev, pWin, NoneWin, focusEventMode);
+                if (!ActivateFocusInGrab(dev, NoneWin))
+                    DoFocusEvents(dev, pWin, NoneWin, focusEventMode);
 		dev->focus->win = NoneWin;
 		dev->focus->traceGood = 0;
 	    }
diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index f53b050..a8807bd 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -95,12 +95,21 @@ ProcXIPassiveGrabDevice(ClientPtr client)
 	return ret;
 
     if (stuff->grab_type != XIGrabtypeButton &&
-        stuff->grab_type != XIGrabtypeKeysym)
+        stuff->grab_type != XIGrabtypeKeysym &&
+        stuff->grab_type != XIGrabtypeEnter &&
+        stuff->grab_type != XIGrabtypeFocusIn)
     {
         client->errorValue = stuff->grab_type;
         return BadValue;
     }
 
+    if ((stuff->grab_type == XIGrabtypeEnter ||
+         stuff->grab_type == XIGrabtypeFocusIn) && stuff->detail != 0)
+    {
+        client->errorValue = stuff->detail;
+        return BadValue;
+    }
+
     /* Can't grab for modifiers on an attached slave device */
     if (!IsMaster(dev))
     {
@@ -175,6 +184,11 @@ ProcXIPassiveGrabDevice(ClientPtr client)
                 status = GrabKey(client, dev, mod_dev, stuff->detail,
                                  &param, GRABTYPE_XI2, &mask);
                 break;
+            case XIGrabtypeEnter:
+            case XIGrabtypeFocusIn:
+                status = GrabWindow(client, dev, stuff->grab_type,
+                                    &param, &mask);
+                break;
         }
 
         if (status != GrabSuccess)
@@ -251,12 +265,21 @@ ProcXIPassiveUngrabDevice(ClientPtr client)
 	return rc;
 
     if (stuff->grab_type != XIGrabtypeButton &&
-        stuff->grab_type != XIGrabtypeKeysym)
+        stuff->grab_type != XIGrabtypeKeysym &&
+        stuff->grab_type != XIGrabtypeEnter &&
+        stuff->grab_type != XIGrabtypeFocusIn)
     {
         client->errorValue = stuff->grab_type;
         return BadValue;
     }
 
+    if ((stuff->grab_type == XIGrabtypeEnter ||
+         stuff->grab_type == XIGrabtypeFocusIn) && stuff->detail != 0)
+    {
+        client->errorValue = stuff->detail;
+        return BadValue;
+    }
+
     rc = dixLookupWindow(&win, stuff->grab_window, client, DixSetAttrAccess);
     if (rc != Success)
         return rc;
@@ -269,8 +292,13 @@ ProcXIPassiveUngrabDevice(ClientPtr client)
     tempGrab.resource = client->clientAsMask;
     tempGrab.device = dev;
     tempGrab.window = win;
-    tempGrab.type =
-        (stuff->grab_type == XIGrabtypeButton) ? XI_ButtonPress : XI_KeyPress;
+    switch(stuff->grab_type)
+    {
+        case XIGrabtypeButton:  tempGrab.type = XI_ButtonPress; break;
+        case XIGrabtypeKeysym:  tempGrab.type = XI_KeyPress;    break;
+        case XIGrabtypeEnter:   tempGrab.type = XI_Enter;       break;
+        case XIGrabtypeFocusIn: tempGrab.type = XI_FocusIn;     break;
+    }
     tempGrab.grabtype = GRABTYPE_XI2;
     tempGrab.modifierDevice = mod_dev;
     tempGrab.modifiersDetail.pMask = NULL;
diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index 403282c..5072891 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -155,6 +155,12 @@ EventToXI2(InternalEvent *ev, xEvent **xi)
 {
     switch (ev->any.type)
     {
+        /* Enter/FocusIn are for grabs. We don't need an actual event, since
+         * the real events delivered are triggered elsewhere */
+        case ET_Enter:
+        case ET_FocusIn:
+            *xi = NULL;
+            return Success;
         case ET_Motion:
         case ET_ButtonPress:
         case ET_ButtonRelease:
@@ -525,6 +531,8 @@ GetXI2Type(InternalEvent *event)
         case ET_Hierarchy:      xi2type = XI_HierarchyChanged; break;
         case ET_DeviceChanged:  xi2type = XI_DeviceChanged;    break;
         case ET_Raw:            xi2type = XI_RawEvent;         break;
+        case ET_FocusIn:        xi2type = XI_FocusIn;          break;
+        case ET_FocusOut:       xi2type = XI_FocusOut;         break;
         default:
             break;
     }
diff --git a/dix/events.c b/dix/events.c
index 5e1ab1f..5d22016 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -224,6 +224,10 @@ static void CheckPhysLimits(DeviceIntPtr pDev,
                             Bool generateEvents,
                             Bool confineToScreen,
                             ScreenPtr pScreen);
+static Bool CheckPassiveGrabsOnWindow(WindowPtr pWin,
+                                      DeviceIntPtr device,
+                                      DeviceEvent *event,
+                                      BOOL checkCore);
 
 /**
  * Main input device struct.
@@ -2624,6 +2628,74 @@ XYToWindow(DeviceIntPtr pDev, int x, int y)
 }
 
 /**
+ * Ungrab a currently FocusIn grabbed device and grab the device on the
+ * given window. If the win given is the NoneWin, the device is ungrabbed if
+ * applicable and FALSE is returned.
+ *
+ * @returns TRUE if the device has been grabbed, or FALSE otherwise.
+ */
+BOOL
+ActivateFocusInGrab(DeviceIntPtr dev, WindowPtr win)
+{
+    DeviceEvent event;
+
+    if (dev->deviceGrab.grab &&
+        dev->deviceGrab.fromPassiveGrab &&
+        dev->deviceGrab.grab->type == XI_Enter)
+    {
+        if (dev->deviceGrab.grab->window == win ||
+            IsParent(dev->deviceGrab.grab->window, win))
+            return FALSE;
+        (*dev->deviceGrab.DeactivateGrab)(dev);
+    }
+
+    if (win == NoneWin || win == PointerRootWin)
+        return FALSE;
+
+    memset(&event, 0, sizeof(DeviceEvent));
+    event.header = ET_Internal;
+    event.type = ET_FocusIn;
+    event.length = sizeof(DeviceEvent);
+    event.time = GetTimeInMillis();
+    event.deviceid = dev->id;
+    event.sourceid = dev->id;
+    event.detail.button = 0;
+    return CheckPassiveGrabsOnWindow(win, dev, &event, FALSE);
+}
+
+/**
+ * Ungrab a currently Enter grabbed device and grab the deice for the given
+ * window.
+ *
+ * @returns TRUE if the device has been grabbed, or FALSE otherwise.
+ */
+static BOOL
+ActivateEnterGrab(DeviceIntPtr dev, WindowPtr win)
+{
+    DeviceEvent event;
+
+    if (dev->deviceGrab.grab &&
+        dev->deviceGrab.fromPassiveGrab &&
+        dev->deviceGrab.grab->type == XI_Enter)
+    {
+        if (dev->deviceGrab.grab->window == win ||
+            IsParent(dev->deviceGrab.grab->window, win))
+            return FALSE;
+        (*dev->deviceGrab.DeactivateGrab)(dev);
+    }
+
+    memset(&event, 0, sizeof(DeviceEvent));
+    event.header = ET_Internal;
+    event.type = ET_Enter;
+    event.length = sizeof(DeviceEvent);
+    event.time = GetTimeInMillis();
+    event.deviceid = dev->id;
+    event.sourceid = dev->id;
+    event.detail.button = 0;
+    return CheckPassiveGrabsOnWindow(win, dev, &event, FALSE);
+}
+
+/**
  * Update the sprite coordinates based on the event. Update the cursor
  * position, then update the event with the new coordinates that may have been
  * changed. If the window underneath the sprite has changed, change to new
@@ -2637,7 +2709,7 @@ XYToWindow(DeviceIntPtr pDev, int x, int y)
 Bool
 CheckMotion(DeviceEvent *ev, DeviceIntPtr pDev)
 {
-    WindowPtr prevSpriteWin;
+    WindowPtr prevSpriteWin, newSpriteWin;
     SpritePtr pSprite = pDev->spriteInfo->sprite;
 
     CHECKEVENT(ev);
@@ -2715,17 +2787,23 @@ CheckMotion(DeviceEvent *ev, DeviceIntPtr pDev)
 	ev->root_y = pSprite->hot.y;
     }
 
-    pSprite->win = XYToWindow(pDev, pSprite->hot.x, pSprite->hot.y);
+    newSpriteWin = XYToWindow(pDev, pSprite->hot.x, pSprite->hot.y);
 
-    if (pSprite->win != prevSpriteWin)
+    if (newSpriteWin != prevSpriteWin)
     {
+        if (!ev)
+            UpdateCurrentTimeIf();
+
 	if (prevSpriteWin != NullWindow) {
-	    if (!ev)
-		UpdateCurrentTimeIf();
-            DoEnterLeaveEvents(pDev, prevSpriteWin, pSprite->win,
-                               NotifyNormal);
+            if (!ActivateEnterGrab(pDev, newSpriteWin))
+                DoEnterLeaveEvents(pDev, prevSpriteWin,
+                                   newSpriteWin, NotifyNormal);
         }
-	PostNewCursor(pDev);
+        /* set pSprite->win after ActivateEnterGrab, otherwise
+           sprite window == grab_window and no enter/leave events are
+           sent. */
+        pSprite->win = newSpriteWin;
+        PostNewCursor(pDev);
         return FALSE;
     }
     return TRUE;
@@ -3443,11 +3521,14 @@ CheckPassiveGrabsOnWindow(
 
 	    (*grabinfo->ActivateGrab)(device, grab, currentTime, TRUE);
 
-	    FixUpEventFromWindow(device, xE, grab->window, None, TRUE);
+            if (xE)
+            {
+                FixUpEventFromWindow(device, xE, grab->window, None, TRUE);
 
-	    TryClientEvents(rClient(grab), device, xE, count,
-                                   GetEventFilter(device, xE),
-                                   GetEventFilter(device, xE), grab);
+                TryClientEvents(rClient(grab), device, xE, count,
+                                       GetEventFilter(device, xE),
+                                       GetEventFilter(device, xE), grab);
+            }
 
 	    if (grabinfo->sync.state == FROZEN_NO_EVENT)
 	    {
@@ -4344,9 +4425,14 @@ SetInputFocus(
 	return Success;
     mode = (dev->deviceGrab.grab) ? NotifyWhileGrabbed : NotifyNormal;
     if (focus->win == FollowKeyboardWin)
-	DoFocusEvents(dev, keybd->focus->win, focusWin, mode);
-    else
-	DoFocusEvents(dev, focus->win, focusWin, mode);
+    {
+        if (!ActivateFocusInGrab(dev, focusWin))
+            DoFocusEvents(dev, keybd->focus->win, focusWin, mode);
+    } else
+    {
+        if (!ActivateFocusInGrab(dev, focusWin))
+            DoFocusEvents(dev, focus->win, focusWin, mode);
+    }
     focus->time = time;
     focus->revert = revertTo;
     if (focusID == FollowKeyboard)
@@ -5327,12 +5413,14 @@ DeleteWindowFromAnyEvents(WindowPtr pWin, Bool freeResources)
                                 || clients[CLIENT_ID(parent->drawable.id)]->clientGone
 #endif
                                 );
-                        DoFocusEvents(keybd, pWin, parent, focusEventMode);
+                        if (!ActivateFocusInGrab(keybd, parent))
+                            DoFocusEvents(keybd, pWin, parent, focusEventMode);
                         focus->win = parent;
                         focus->revert = RevertToNone;
                         break;
                     case RevertToPointerRoot:
-                        DoFocusEvents(keybd, pWin, PointerRootWin, focusEventMode);
+                        if (!ActivateFocusInGrab(keybd, PointerRootWin))
+                            DoFocusEvents(keybd, pWin, PointerRootWin, focusEventMode);
                         focus->win = PointerRootWin;
                         focus->traceGood = 0;
                         break;
diff --git a/include/dix.h b/include/dix.h
index d4bec5f..bfb0369 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -350,6 +350,10 @@ extern void ActivateKeyboardGrab(
 extern void DeactivateKeyboardGrab(
     DeviceIntPtr /* keybd */);
 
+extern BOOL ActivateFocusInGrab(
+    DeviceIntPtr /* dev */,
+    WindowPtr /* win */);
+
 extern void AllowSome(
     ClientPtr	/* client */,
     TimeStamp /* time */,
@@ -582,6 +586,7 @@ extern Bool IsKeyboardDevice(DeviceIntPtr dev);
 extern Bool IsPointerEvent(InternalEvent *event);
 extern Bool IsMaster(DeviceIntPtr dev);
 
+
 /*
  * These are deprecated compatibility functions and will be removed soon!
  * Please use the noted replacements instead.
diff --git a/include/exevents.h b/include/exevents.h
index 95d08cc..5878413 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -107,6 +107,13 @@ extern int GrabKey(
         GrabType               /* grabtype */,
 	GrabMask*              /* eventMask */);
 
+extern int GrabWindow(
+	ClientPtr              /* client */,
+	DeviceIntPtr           /* dev */,
+	int                    /* type */,
+	GrabParameters*        /* param */,
+	GrabMask*              /* eventMask */);
+
 extern int SelectForWindow(
 	DeviceIntPtr           /* dev */,
 	WindowPtr              /* pWin */,
commit ec2fe9660dbc0c16cdaca33b3b878011857e0fe2
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 27 14:18:51 2009 +1000

    Require inputproto 1.9.99.10

diff --git a/configure.ac b/configure.ac
index 6c03951..56e8586 100644
--- a/configure.ac
+++ b/configure.ac
@@ -700,7 +700,7 @@ XEXT_LIB='$(top_builddir)/Xext/libXext.la'
 XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
 
 dnl Core modules for most extensions, et al.
-REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.9.3] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.9] [kbproto >= 1.0.3]"
+REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.9.3] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.10] [kbproto >= 1.0.3]"
 REQUIRED_LIBS="xfont xau fontenc [pixman-1 >= 0.13.2]"
 
 dnl HAVE_DBUS is true if we actually have the D-Bus library, whereas
commit 0ef6ba9f3b9e68307bfe623e12dc36d44440e97f
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 27 11:15:54 2009 +1000

    Xi: set the passive grab's resource mask on ungrabbing.
    
    Not having the resource mask set means we never match an existing grab,
    hence we never actually ungrab.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index 95acdf0..f53b050 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -266,6 +266,7 @@ ProcXIPassiveUngrabDevice(ClientPtr client)
     else
         mod_dev = dev;
 
+    tempGrab.resource = client->clientAsMask;
     tempGrab.device = dev;
     tempGrab.window = win;
     tempGrab.type =
commit 1f61d6647f25add487c5cae9739643a6e33ef9f7
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 27 11:15:23 2009 +1000

    Xi: use GetMaster(MASTER_KEYBOARD) to get the modifier device for XI2 pgrabs
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index 3f46e67..95acdf0 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -157,8 +157,8 @@ ProcXIPassiveGrabDevice(ClientPtr client)
     if (!modifiers_failed)
         return BadAlloc;
 
-    if (IsPointerDevice(dev) && IsMaster(dev))
-        mod_dev = GetPairedDevice(dev);
+    if (!IsMaster(dev) && dev->u.master)
+        mod_dev = GetMaster(dev, MASTER_KEYBOARD);
     else
         mod_dev = dev;
 
@@ -261,8 +261,8 @@ ProcXIPassiveUngrabDevice(ClientPtr client)
     if (rc != Success)
         return rc;
 
-    if (IsMaster(dev))
-        mod_dev = GetPairedDevice(dev);
+    if (!IsMaster(dev) && dev->u.master)
+        mod_dev = GetMaster(dev, MASTER_KEYBOARD);
     else
         mod_dev = dev;
 
commit bedfd561fa534b65baea45c4a05b1752ef172c45
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue May 26 15:28:33 2009 +1000

    dix: fix wrong cast of eventMask into CreateGrab.

diff --git a/dix/grabs.c b/dix/grabs.c
index eb8bec8..0df8ad1 100644
--- a/dix/grabs.c
+++ b/dix/grabs.c
@@ -457,7 +457,7 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
 	    pNewGrab = CreateGrab(CLIENT_ID(grab->resource), grab->device,
 				  grab->modifierDevice, grab->window,
                                   grab->grabtype,
-				  (GrabMask*)grab->eventMask,
+				  (GrabMask*)&grab->eventMask,
                                   &param, (int)grab->type,
 				  pMinuendGrab->detail.exact,
 				  grab->confineTo, grab->cursor);
commit 023f959e6812e63f9d38b078158275bc13d238ae
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue May 26 14:56:40 2009 +1000

    Xi: fix an inputInfo.keyboard usage.
    
    In the case of a RevertToFollowKeyboard, the master device should be used
    (since this is the closest equivalent to the VCK as before). Only if the
    master keyboard is the same as the device, revert to the VCK itself.

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 2bcc2e1..83891f8 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1846,16 +1846,20 @@ DeleteDeviceFromAnyExtEvents(WindowPtr pWin, DeviceIntPtr dev)
 	    dev->focus->traceGood = 0;
 	    break;
 	case RevertToFollowKeyboard:
-	    if (inputInfo.keyboard->focus->win) {
-		DoFocusEvents(dev, pWin, inputInfo.keyboard->focus->win,
-			      focusEventMode);
+            {
+                DeviceIntPtr kbd = GetMaster(dev, MASTER_KEYBOARD);
+                if (!kbd || (kbd == dev && kbd != inputInfo.keyboard))
+                    kbd = inputInfo.keyboard;
+	    if (kbd->focus->win) {
+		DoFocusEvents(dev, pWin, kbd->focus->win, focusEventMode);
 		dev->focus->win = FollowKeyboardWin;
 		dev->focus->traceGood = 0;
 	    } else {
-		DoFocusEvents(dev, pWin, NoneWin, focusEventMode);
+                DoFocusEvents(dev, pWin, NoneWin, focusEventMode);
 		dev->focus->win = NoneWin;
 		dev->focus->traceGood = 0;
 	    }
+            }
 	    break;
 	}
     }
commit b3463fd6a89d50a7562c357aeb5314ce0fd6493d
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue May 26 13:58:04 2009 +1000

    dix: convert window coordinates to FP1616 before calculating event_x/y
    
    root_x/y are already in FP1616 at this point.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/events.c b/dix/events.c
index 382fd8d..5e1ab1f 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2240,8 +2240,8 @@ FixUpEventFromWindow(
         event->event = pWin->drawable.id;
         if (pSprite->hot.pScreen == pWin->drawable.pScreen)
         {
-            event->event_x = FP1616(event->root_x - pWin->drawable.x, 0);
-            event->event_y = FP1616(event->root_y - pWin->drawable.y, 0);
+            event->event_x = event->root_x - FP1616(pWin->drawable.x, 0);
+            event->event_y = event->root_y - FP1616(pWin->drawable.y, 0);
             event->child = child;
         } else
         {
commit 10b5e981016132b4c07ad9ce68646d0a385e9c24
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue May 26 11:12:08 2009 +1000

    dix: take grabs into account for XI_Enter/Leave events.

diff --git a/dix/events.c b/dix/events.c
index 6f05272..382fd8d 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4182,7 +4182,6 @@ DeviceEnterLeaveEvent(
 {
     GrabPtr             grab = mouse->deviceGrab.grab;
     xXIEnterEvent       *event;
-    Mask                mask;
     int                 filter;
     int                 btlen, len, i;
     DeviceIntPtr        kbd;
@@ -4223,19 +4222,22 @@ DeviceEnterLeaveEvent(
 
     FixUpEventFromWindow(mouse, (xEvent*)event, pWin, None, FALSE);
 
-
-    if (!GetWindowXI2Mask(mouse, pWin, (xEvent*)event))
-        return;
-
     filter = GetEventFilter(mouse, (xEvent*)event);
-    mask = 0x0; /* FIXME: we should handle grabs, once we can */
 
     if (grab)
+    {
+        Mask mask;
+        mask = grab->xi2mask[XIAllDevices][type/8] |
+               grab->xi2mask[XIAllMasterDevices][type/8] |
+               grab->xi2mask[mouse->id][type/8];
         TryClientEvents(rClient(grab), mouse, (xEvent*)event, 1, mask,
                         filter, grab);
-    else
+    } else {
+        if (!GetWindowXI2Mask(mouse, pWin, (xEvent*)event))
+            return;
         DeliverEventsToWindow(mouse, pWin, (xEvent*)event, 1, filter,
                               NullGrab);
+    }
     xfree(event);
 }
 
commit 1815defdb2f19e79f4ec0354d188ea763ff1f15e
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue May 26 10:08:46 2009 +1000

    Xi: only deactivate passive grabs if the event type matches.
    
    This didn't use to be a problem when devices could only be pointers or
    keyboards, not both. Nowadays, slave devices may have both buttons and
    keyboards, and in this case we don't want to deactivate a passive keyboard
    grab when a button release is detected.

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 2eec7f8..2bcc2e1 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1070,8 +1070,11 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
             }
             break;
         case ET_KeyRelease:
-            if (device->deviceGrab.fromPassiveGrab &&
-                    (key == device->deviceGrab.activatingKey))
+            if (grab && device->deviceGrab.fromPassiveGrab &&
+                (key == device->deviceGrab.activatingKey) &&
+                (device->deviceGrab.grab->type == KeyPress ||
+                 device->deviceGrab.grab->type == DeviceKeyPress ||
+                 device->deviceGrab.grab->type == XI_KeyPress))
                 deactivateDeviceGrab = TRUE;
             break;
         case ET_ButtonPress:
@@ -1092,7 +1095,11 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
                 event->detail.button = key;
                 return;
             }
-            if (!b->buttonsDown && device->deviceGrab.fromPassiveGrab)
+            if (grab && !b->buttonsDown &&
+                device->deviceGrab.fromPassiveGrab &&
+                (device->deviceGrab.grab->type == ButtonPress ||
+                 device->deviceGrab.grab->type == DeviceButtonPress ||
+                 device->deviceGrab.grab->type == XI_ButtonPress))
                 deactivateDeviceGrab = TRUE;
     }
 
commit 9dc3810a034f067096d71b33b0b47f1f52092fe6
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 27 13:53:46 2009 +1000

    dix: set the right grab event type for implicit passive grabs.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/events.c b/dix/events.c
index 19a9e1d..6f05272 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2069,6 +2069,7 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
 	tempGrab.pointerMode = GrabModeAsync;
 	tempGrab.confineTo = NullWindow;
 	tempGrab.cursor = NullCursor;
+        tempGrab.type = type;
         if (type == ButtonPress)
             tempGrab.grabtype = GRABTYPE_CORE;
         else if (type == DeviceButtonPress)
commit 6583477035234e23ead2fad9db7a07e5862447a4
Author: Nicolai Hähnle <nhaehnle at gmail.com>
Date:   Sat May 23 13:35:24 2009 +0200

    Remove reference to non-existing requestLog and requestLogIndex
    
    These fields were removed in 252ec504817e05b185e4896a2d899e9c00b8aeef.
    
    Signed-off-by: Nicolai Haehnle <nhaehnle at gmail.com>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/dispatch.c b/dix/dispatch.c
index ce3294d..dbb97e0 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -413,12 +413,6 @@ Dispatch(void)
 	        }
 
 		client->sequence++;
-#ifdef DEBUG
-		if (client->requestLogIndex == MAX_REQUEST_LOG)
-		    client->requestLogIndex = 0;
-		client->requestLog[client->requestLogIndex] = MAJOROP;
-		client->requestLogIndex++;
-#endif
 #ifdef XSERVER_DTRACE
 		XSERVER_REQUEST_START(LookupMajorName(MAJOROP), MAJOROP,
 			      ((xReq *)client->requestBuffer)->length,
diff --git a/include/dixstruct.h b/include/dixstruct.h
index 7335fad..696b793 100644
--- a/include/dixstruct.h
+++ b/include/dixstruct.h
@@ -37,10 +37,6 @@ SOFTWARE.
  *      translation from client ids to server addresses.
  */
 
-#ifdef DEBUG
-#define MAX_REQUEST_LOG 100
-#endif
-
 extern _X_EXPORT CallbackListPtr ClientStateCallback;
 
 typedef struct {
commit 53e821ab4a41cbc85932b9ef150311bc2e57c108
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon May 25 12:20:37 2009 +1000

    Xi: add request processing for XIGetSelectedEvents.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/extinit.c b/Xi/extinit.c
index a8f8f10..7e5111d 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -254,7 +254,8 @@ static int (*ProcIVector[])(ClientPtr) = {
         ProcXIListProperties,                   /* 56 */
         ProcXIChangeProperty,                   /* 57 */
         ProcXIDeleteProperty,                   /* 58 */
-        ProcXIGetProperty                       /* 59 */
+        ProcXIGetProperty,                      /* 59 */
+        ProcXIGetSelectedEvents                 /* 60 */
 };
 
 /* For swapped clients */
@@ -318,7 +319,8 @@ static int (*SProcIVector[])(ClientPtr) = {
         SProcXIListProperties,                   /* 56 */
         SProcXIChangeProperty,                   /* 57 */
         SProcXIDeleteProperty,                   /* 58 */
-        SProcXIGetProperty                       /* 59 */
+        SProcXIGetProperty,                      /* 59 */
+        SProcXIGetSelectedEvents                 /* 60 */
 };
 
 /*****************************************************************
@@ -516,6 +518,8 @@ SReplyIDispatch(ClientPtr client, int len, xGrabDeviceReply * rep)
 	SRepXIListProperties(client, len, (xXIListPropertiesReply *) rep);
     else if (rep->RepType == X_XIGetProperty)
 	SRepXIGetProperty(client, len, (xXIGetPropertyReply *) rep);
+    else if (rep->RepType == X_XIGetSelectedEvents)
+	SRepXIGetSelectedEvents(client, len, (xXIGetSelectedEventsReply *) rep);
     else {
 	FatalError("XINPUT confused sending swapped reply");
     }
diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 5616182..31e6a77 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -128,3 +128,119 @@ ProcXISelectEvent(ClientPtr client)
     xfree(types);
     return Success;
 }
+
+
+int
+SProcXIGetSelectedEvents(ClientPtr client)
+{
+    char n;
+
+    REQUEST(xXIGetSelectedEventsReq);
+    swaps(&stuff->length, n);
+    REQUEST_SIZE_MATCH(xXIGetSelectedEventsReq);
+    swapl(&stuff->window, n);
+
+    return (ProcXIGetSelectedEvents(client));
+}
+
+int
+ProcXIGetSelectedEvents(ClientPtr client)
+{
+    int rc, i;
+    WindowPtr win;
+    char n;
+    char *buffer = NULL;
+    xXIGetSelectedEventsReply reply;
+    OtherInputMasks *masks;
+    InputClientsPtr others = NULL;
+    xXIEventMask *evmask = NULL;
+
+    REQUEST(xXIGetSelectedEventsReq);
+    REQUEST_SIZE_MATCH(xXIGetSelectedEventsReq);
+
+    rc = dixLookupWindow(&win, stuff->window, client, DixReceiveAccess);
+    if (rc != Success)
+        return rc;
+
+    reply.repType = X_Reply;
+    reply.RepType = X_XIGetSelectedEvents;
+    reply.length = 0;
+    reply.sequenceNumber = client->sequence;
+    reply.num_masks = 0;
+
+    masks = wOtherInputMasks(win);
+    if (masks)
+    {
+	for (others = wOtherInputMasks(win)->inputClients; others;
+	     others = others->next) {
+	    if (SameClient(others, client)) {
+                break;
+            }
+        }
+    }
+
+    if (!others)
+    {
+        WriteReplyToClient(client, sizeof(xXIGetSelectedEventsReply), &reply);
+        return Success;
+    }
+
+    buffer = xcalloc(MAXDEVICES, sizeof(xXIEventMask) + XI2MASKSIZE);
+    if (!buffer)
+        return BadAlloc;
+
+    evmask = (xXIEventMask*)buffer;
+    for (i = 0; i < MAXDEVICES; i++)
+    {
+        int j;
+        unsigned char *devmask = others->xi2mask[i];
+
+        for (j = XI2MASKSIZE - 1; j >= 0; j--)
+        {
+            if (devmask[j] != 0)
+            {
+                evmask->deviceid = i;
+                evmask->mask_len = (j + 4)/4; /* j is an index, hence + 4,
+                                                 not + 3 */
+
+                reply.num_masks++;
+                reply.length += sizeof(xXIEventMask)/4 + evmask->mask_len;
+
+                if (client->swapped)
+                {
+                    swaps(&evmask->deviceid, n);
+                    swaps(&evmask->mask_len, n);
+                }
+
+                memcpy(&evmask[1], devmask, j + 1);
+                evmask = (xXIEventMask*)((char*)evmask +
+                           sizeof(xXIEventMask) + evmask->mask_len * 4);
+                break;
+            }
+        }
+    }
+
+    WriteReplyToClient(client, sizeof(xXIGetSelectedEventsReply), &reply);
+
+    if (reply.num_masks)
+    {
+        WriteSwappedDataToClient(client, reply.length * 4, buffer);
+    }
+
+
+    xfree(buffer);
+    return Success;
+}
+
+void SRepXIGetSelectedEvents(ClientPtr client,
+                            int len, xXIGetSelectedEventsReply *rep)
+{
+    char n;
+
+    swaps(&rep->sequenceNumber, n);
+    swapl(&rep->length, n);
+    swaps(&rep->num_masks, n);
+    WriteToClient(client, len, (char *)rep);
+}
+
+
diff --git a/Xi/xiselectev.h b/Xi/xiselectev.h
index dc52712..5f5ffe3 100644
--- a/Xi/xiselectev.h
+++ b/Xi/xiselectev.h
@@ -29,3 +29,7 @@
 
 int SProcXISelectEvent(ClientPtr client);
 int ProcXISelectEvent(ClientPtr client);
+int SProcXIGetSelectedEvents(ClientPtr client);
+int ProcXIGetSelectedEvents(ClientPtr client);
+void SRepXIGetSelectedEvents(ClientPtr client,
+                             int len, xXIGetSelectedEventsReply *rep);
commit b377994336c978875dd786f4a4a9ef2e7b20e32c
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon May 25 13:55:17 2009 +1000

    Xi: advance by the right number of bytes when trawling XI2 event masks.
    
    The wire layout is  [struct xXIEventMask][mask bytes]. So the pointer needs
    to not only be advanced by the mask bytes, but also by the size of the
    struct.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 7309773..5616182 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -103,6 +103,7 @@ ProcXISelectEvent(ClientPtr client)
         }
 
         evmask = (xXIEventMask*)(((unsigned char*)evmask) + evmask->mask_len * 4);
+        evmask++;
     }
 
     /* Set masks on window */
@@ -119,6 +120,7 @@ ProcXISelectEvent(ClientPtr client)
             dixLookupDevice(&dev, evmask->deviceid, client, DixReadAccess);
         XISetEventMask(dev, win, client, evmask->mask_len * 4, (unsigned char*)&evmask[1]);
         evmask = (xXIEventMask*)(((unsigned char*)evmask) + evmask->mask_len * 4);
+        evmask++;
     }
 
     RecalculateDeliverableEvents(win);
commit 12e725d08b4cf7dbb7f09b9ec09fa1b621156ea9
Author: Julien Cristau <jcristau at debian.org>
Date:   Fri May 22 09:54:38 2009 +0200

    randr: fix server crash in RRGetScreenInfo
    
    We don't return rates to randr < 1.1 clients, so don't allocate space
    for them.  This fixes a FatalError due to not all allocated space being
    used.
    
    X.Org bug#21861 <http://bugs.freedesktop.org/show_bug.cgi?id=21861>
    
    Reported-by: Guillaume Quintin <coincoin169g at gmail.com>
    Signed-off-by: Julien Cristau <jcristau at debian.org>

diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index 94bf3ce..46890bf 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -664,8 +664,9 @@ ProcRRGetScreenInfo (ClientPtr client)
 	rep.sizeID = pData->size;
 	rep.rate = pData->refresh;
 
-	extraLen = (rep.nSizes * sizeof (xScreenSizes) +
-		    rep.nrateEnts * sizeof (CARD16));
+	extraLen = rep.nSizes * sizeof (xScreenSizes);
+	if (has_rate)
+		extraLen += rep.nrateEnts * sizeof (CARD16);
 
 	if (extraLen)
 	{
commit c70511931ca1441878daed50e710fa514f6ab077
Author: Matthieu Herrb <matthieu.herrb at laas.fr>
Date:   Sun May 24 10:32:38 2009 +0200

    fix typo in cabff9007 which led to an unintialized memory read and a crash.

diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 165958b..24049aa 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -1226,7 +1226,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
 	const char **driver = mousedrivers;
 	confInput = xf86findInput(CONF_IMPLICIT_POINTER,
 				  xf86configptr->conf_input_lst);
-	while (driver && !confInput) {
+	while (*driver && !confInput) {
 	    confInput = xf86findInputByDriver(*driver,
 					      xf86configptr->conf_input_lst);
 	    driver++;
commit 99e22b86c5f1a3653f3caaf01368a777d2b208d0
Author: Adam Jackson <ajax at redhat.com>
Date:   Fri May 22 12:01:55 2009 -0400

    EDID: Add modes from Established Timings III descriptor to mode pool
    
    EDID 1.4, section 3.10.3.9

diff --git a/hw/xfree86/ddc/edid.h b/hw/xfree86/ddc/edid.h
index b556003..42ee9d1 100644
--- a/hw/xfree86/ddc/edid.h
+++ b/hw/xfree86/ddc/edid.h
@@ -533,7 +533,7 @@ struct detailed_monitor_section {
     struct whitePoints wp[2];		/* 32 */
     /* color management data */
     struct cvt_timings cvt[4];		/* 64 */
-    /* established timings III */
+    Uchar est_iii[6];			/* 6 */
   } section;				/* max: 80 */
 };
 
diff --git a/hw/xfree86/ddc/interpret_edid.c b/hw/xfree86/ddc/interpret_edid.c
index bdcc92e..12a5254 100644
--- a/hw/xfree86/ddc/interpret_edid.c
+++ b/hw/xfree86/ddc/interpret_edid.c
@@ -330,6 +330,7 @@ get_dt_md_section(Uchar *c, struct edid_version *ver,
 	break;
       case ADD_EST_TIMINGS:
 	det_mon[i].type = DS_EST_III;
+	memcpy(det_mon[i].section.est_iii, c + 6, 6);
 	break;
       case ADD_DUMMY:
 	det_mon[i].type = DS_DUMMY;
diff --git a/hw/xfree86/modes/xf86EdidModes.c b/hw/xfree86/modes/xf86EdidModes.c
index 4340edd..50b669c 100644
--- a/hw/xfree86/modes/xf86EdidModes.c
+++ b/hw/xfree86/modes/xf86EdidModes.c
@@ -641,6 +641,85 @@ DDCModesFromCVT(int scrnIndex, struct cvt_timings *t)
 }
 #endif
 
+static const struct {
+    short w;
+    short h;
+    short r;
+    short rb;
+} EstIIIModes[] = {
+    /* byte 6 */
+    { 640, 350, 85, 0 },
+    { 640, 400, 85, 0 },
+    { 720, 400, 85, 0 },
+    { 640, 480, 85, 0 },
+    { 848, 480, 60, 0 },
+    { 800, 600, 85, 0 },
+    { 1024, 768, 85, 0 },
+    { 1152, 864, 75, 0 },
+    /* byte 7 */
+    { 1280, 768, 60, 1 },
+    { 1280, 768, 60, 0 },
+    { 1280, 768, 75, 0 },
+    { 1280, 768, 85, 0 },
+    { 1280, 960, 60, 0 },
+    { 1280, 960, 85, 0 },
+    { 1280, 1024, 60, 0 },
+    { 1280, 1024, 85, 0 },
+    /* byte 8 */
+    { 1360, 768, 60, 0 },
+    { 1440, 900, 60, 1 },
+    { 1440, 900, 60, 0 },
+    { 1440, 900, 75, 0 },
+    { 1440, 900, 85, 0 },
+    { 1400, 1050, 60, 1 },
+    { 1400, 1050, 60, 0 },
+    { 1400, 1050, 75, 0 },
+    /* byte 9 */
+    { 1400, 1050, 85, 0 },
+    { 1680, 1050, 60, 1 },
+    { 1680, 1050, 60, 0 },
+    { 1680, 1050, 75, 0 },
+    { 1680, 1050, 85, 0 },
+    { 1600, 1200, 60, 0 },
+    { 1600, 1200, 65, 0 },
+    { 1600, 1200, 70, 0 },
+    /* byte 10 */
+    { 1600, 1200, 75, 0 },
+    { 1600, 1200, 85, 0 },
+    { 1792, 1344, 60, 0 },
+    { 1792, 1344, 85, 0 },
+    { 1856, 1392, 60, 0 },
+    { 1856, 1392, 75, 0 },
+    { 1920, 1200, 60, 1 },
+    { 1920, 1200, 60, 0 },
+    /* byte 11 */
+    { 1920, 1200, 75, 0 },
+    { 1920, 1200, 85, 0 },
+    { 1920, 1440, 60, 0 },
+    { 1920, 1440, 75, 0 },
+};
+
+static DisplayModePtr
+DDCModesFromEstIII(unsigned char *est)
+{
+    DisplayModePtr modes = NULL;
+    int i, j, m;
+
+    for (i = 0; i < 6; i++) {
+	for (j = 7; j > 0; j--) {
+	    if (est[i] & (1 << j)) {
+		m = (i * 8) + (7 - j);
+		modes = xf86ModesAdd(modes,
+				     FindDMTMode(EstIIIModes[m].w,
+						 EstIIIModes[m].h,
+						 EstIIIModes[m].r,
+						 EstIIIModes[m].rb));
+	    }
+	}
+    }
+
+    return modes;
+}
 
 /*
  * This is only valid when the sink claims to be continuous-frequency
@@ -811,6 +890,7 @@ xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC)
     for (i = 0; i < DET_TIMINGS; i++) {
 	struct detailed_monitor_section *det_mon = &DDC->det_mon[i];
 
+	Mode = NULL;
         switch (det_mon->type) {
         case DT:
             Mode = DDCModeFromDetailedTiming(scrnIndex,
@@ -818,22 +898,23 @@ xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC)
 					     preferred,
 					     quirks);
 	    preferred = FALSE;
-            Modes = xf86ModesAdd(Modes, Mode);
             break;
         case DS_STD_TIMINGS:
             Mode = DDCModesFromStandardTiming(det_mon->section.std_t,
 					      quirks, timing_level, rb);
-            Modes = xf86ModesAdd(Modes, Mode);
             break;
 #if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
 	case DS_CVT:
 	    Mode = DDCModesFromCVT(scrnIndex, det_mon->section.cvt);
-	    Modes = xf86ModesAdd(Modes, Mode);
 	    break;
 #endif
+	case DS_EST_III:
+	    Mode = DDCModesFromEstIII(det_mon->section.est_iii);
+	    break;
         default:
             break;
         }
+	Modes = xf86ModesAdd(Modes, Mode);
     }
 
     /* Add established timings */
commit b395da91c531d633ec47bb5a51e361d321663a3a
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 22 15:24:46 2009 +1000

    Xi: silence two compiler warnings
    
    chdevcur.c:97: warning: ‘SecurityLookupIDByType’ is deprecated (declared at
    ../include/resource.h:269)
    
    xiproperty.c:200: warning: passing argument 2 of ‘GetEventFilter’ from
    incompatible pointer type
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/chdevcur.c b/Xi/chdevcur.c
index 0315edb..977095c 100644
--- a/Xi/chdevcur.c
+++ b/Xi/chdevcur.c
@@ -94,12 +94,10 @@ int ProcXIChangeCursor(ClientPtr client)
     }
     else
     {
-        pCursor = (CursorPtr)SecurityLookupIDByType(client, stuff->cursor,
-                                RT_CURSOR, DixReadAccess);
-        if (!pCursor)
-        {
-            return BadCursor;
-        }
+	rc = dixLookupResourceByType((pointer*)&pCursor, stuff->cursor,
+				     RT_CURSOR, client, DixReadAccess);
+        if (rc != Success)
+            return rc;
     }
 
     ChangeWindowDeviceCursor(pWin, pDev, pCursor);
diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c
index 3cda82b..cd49460 100644
--- a/Xi/xiproperty.c
+++ b/Xi/xiproperty.c
@@ -197,7 +197,8 @@ static void send_property_event(DeviceIntPtr dev, Atom property, int what)
         xi2.time        = currentTime.milliseconds;
         xi2.property    = property;
         xi2.what        = what;
-        SendEventToAllWindows(dev, GetEventFilter(dev, &xi2), (xEvent*)&xi2, 1);
+        SendEventToAllWindows(dev, GetEventFilter(dev, (xEvent*)&xi2),
+                              (xEvent*)&xi2, 1);
 }
 
 static int list_atoms(DeviceIntPtr dev, int *natoms, Atom **atoms_return)
commit 4a36db60774640ea92a2133a3b08fbf1a48d2cb6
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 22 15:16:43 2009 +1000

    os: fix compiler warning "too few arguments to format"
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/os/osinit.c b/os/osinit.c
index b7bd076..1559135 100644
--- a/os/osinit.c
+++ b/os/osinit.c
@@ -136,8 +136,8 @@ OsSigHandler(int signo)
 
 #ifdef SA_SIGINFO
   if (sip->si_code == SI_USER) {
-      ErrorF("Recieved signal %d sent by process %ld, uid %ld\n",
-	     (long) sip->si_pid, (long) sip->si_uid);
+      ErrorF("Recieved signal %ld sent by process %ld, uid %ld\n",
+              (long) sip->si_code, (long) sip->si_pid, (long) sip->si_uid);
   } else {
       switch (signo) {
           case SIGSEGV:
commit da0d3baf71b34657cc235d6c6b37d548541f9449
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu May 21 14:11:27 2009 +1000

    dix: protect event generation against single-valuator devices.
    
    If we have a single-axis device and it sends events it should not access
    non-existant memory.

diff --git a/dix/getevents.c b/dix/getevents.c
index fa3c781..9c7ac44 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -576,6 +576,9 @@ clipAxis(DeviceIntPtr pDev, int axisNum, int *val)
     AxisInfoPtr axis = pDev->valuator->axes + axisNum;
     /* InitValuatoraAxisStruct ensures that (min < max). */
 
+    if (axisNum >= pDev->valuator->numAxes)
+        return;
+
     /* If a value range is defined, clip. If not, do nothing */
     if (axis->max_value <= axis->min_value)
         return;
@@ -751,8 +754,16 @@ positionSprite(DeviceIntPtr dev, int *x, int *y,
                ScreenPtr scr, int *screenx, int *screeny)
 {
     /* scale x&y to screen */
-    *screenx = rescaleValuatorAxis(*x, dev->valuator->axes + 0, NULL, scr->width);
-    *screeny = rescaleValuatorAxis(*y, dev->valuator->axes + 1, NULL, scr->height);
+    if (dev->valuator->numAxes > 0)
+        *screenx = rescaleValuatorAxis(*x, dev->valuator->axes + 0, NULL, scr->width);
+    else
+        *screenx = dev->last.valuators[0];
+
+    if (dev->valuator->numAxes > 1 )
+        *screeny = rescaleValuatorAxis(*y, dev->valuator->axes + 1, NULL, scr->height);
+    else
+        *screeny = dev->last.valuators[1];
+
     dev->last.valuators[0] = *screenx;
     dev->last.valuators[1] = *screeny;
 
@@ -1006,7 +1017,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
     CARD32 ms;
     DeviceEvent *event;
     RawDeviceEvent    *raw;
-    int x, y, /* switches between device and screen coords */
+    int x = 0, y = 0, /* switches between device and screen coords */
         cx, cy; /* only screen coordinates */
     ScreenPtr scr = miPointerGetScreen(pDev);
 
@@ -1040,11 +1051,12 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
         {
 
             valuators[0] = rescaleValuatorAxis(valuators[0], NULL,
-                                               pDev->valuator->axes + 0,
-                                               scr->width);
-            valuators[1] = rescaleValuatorAxis(valuators[1], NULL,
-                                               pDev->valuator->axes + 1,
-                                               scr->height);
+                    pDev->valuator->axes + 0,
+                    scr->width);
+            if (num_valuators > 1)
+                valuators[1] = rescaleValuatorAxis(valuators[1], NULL,
+                        pDev->valuator->axes + 1,
+                        scr->height);
         }
 
         moveAbsolute(pDev, &x, &y, first_valuator, num_valuators, valuators);
@@ -1055,7 +1067,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
     }
 
     set_raw_valuators(raw, first_valuator, num_valuators, valuators,
-                      raw->valuators.data);
+            raw->valuators.data);
 
     positionSprite(pDev, &x, &y, scr, &cx, &cy);
     updateHistory(pDev, first_valuator, num_valuators, ms);
commit b25e29e8014927815d4fdc9c416bfeb2af0ecba6
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu May 21 12:07:03 2009 +1000

    mi: use GetMaster() from MIPOINTER and MISPRITE.
    
    Both may in some cases be called for a SD attached to a master keyboard. In
    this case, we need to get the right master device (i.e. the pointer).
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/mi/mipointer.c b/mi/mipointer.c
index fdad77b..e1f63be 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -51,9 +51,9 @@ static int miPointerPrivKeyIndex;
 static DevPrivateKey miPointerPrivKey = &miPointerPrivKeyIndex;
 
 #define MIPOINTER(dev) \
-    ((DevHasCursor((dev)) || (!IsMaster(isMaster) && !dev->u.master)) ? \
+    ((!IsMaster(dev) && !dev->u.master) ? \
         (miPointerPtr)dixLookupPrivate(&(dev)->devPrivates, miPointerPrivKey): \
-        (miPointerPtr)dixLookupPrivate(&(dev)->u.master->devPrivates, miPointerPrivKey))
+        (miPointerPtr)dixLookupPrivate(&(GetMaster(dev, MASTER_POINTER))->devPrivates, miPointerPrivKey))
 
 static Bool miPointerRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, 
                                    CursorPtr pCursor);
diff --git a/mi/misprite.c b/mi/misprite.c
index 3f4c573..2ec6782 100644
--- a/mi/misprite.c
+++ b/mi/misprite.c
@@ -143,9 +143,9 @@ typedef struct {
 #endif
 
 #define MISPRITE(dev) \
-    ((DevHasCursor(dev)) ? \
+    ((!IsMaster(dev) && !dev->u.master) ? \
        (miCursorInfoPtr)dixLookupPrivate(&dev->devPrivates, miSpriteDevPrivatesKey) : \
-       (miCursorInfoPtr)dixLookupPrivate(&dev->u.master->devPrivates, miSpriteDevPrivatesKey))
+       (miCursorInfoPtr)dixLookupPrivate(&(GetMaster(dev, MASTER_POINTER))->devPrivates, miSpriteDevPrivatesKey))
 
 static void
 miSpriteDisableDamage(ScreenPtr pScreen, miSpriteScreenPtr pScreenPriv)
commit c9df51b070377ca33e48644dbc842b6e3dfb2975
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu May 21 11:16:37 2009 +1000

    input: allow for master pointers to not have a button class.
    
    There's devices (e.g. some barcode readers) that have axes but no buttons.
    When such a device sends a motion event, the valuator and button class is
    copied into the master pointer (i.e. removing the button class).
    So we need a couple of extra sanity checks for the button class to exist.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index a72fb84..2eec7f8 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -996,8 +996,8 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
     }
 
     /* State needs to be assembled BEFORE the device is updated. */
-    state = (kbd) ? XkbStateFieldFromRec(&kbd->key->xkbInfo->state) : 0;
-    state |= (mouse) ? (mouse->button->state) : 0;
+    state = (kbd && kbd->key) ? XkbStateFieldFromRec(&kbd->key->xkbInfo->state) : 0;
+    state |= (mouse && mouse->button) ? (mouse->button->state) : 0;
 
     for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
         if (BitIsOn(mouse->button->down, i))
diff --git a/dix/events.c b/dix/events.c
index 8400cfa..19a9e1d 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4128,7 +4128,7 @@ CoreEnterLeaveEvent(
     event.u.enterLeave.child = child;
     event.u.enterLeave.flags = event.u.keyButtonPointer.sameScreen ?
         ELFlagSameScreen : 0;
-    event.u.enterLeave.state = mouse->button->state & 0x1f00;
+    event.u.enterLeave.state = mouse->button ? (mouse->button->state & 0x1f00) : 0;
     if (keybd)
         event.u.enterLeave.state |=
                 XkbGrabStateFromRec(&keybd->key->xkbInfo->state);
@@ -4793,7 +4793,7 @@ ProcQueryPointer(ClientPtr client)
     memset(&rep, 0, sizeof(xQueryPointerReply));
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
-    rep.mask = mouse->button->state;
+    rep.mask = mouse->button ? (mouse->button->state) : 0;
     rep.mask |= XkbStateFieldFromRec(&keyboard->key->xkbInfo->state);
     rep.length = 0;
     rep.root = (RootWindow(mouse))->drawable.id;
diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c
index 9bf8714..88d5d90 100644
--- a/xkb/xkbAccessX.c
+++ b/xkb/xkbAccessX.c
@@ -726,7 +726,7 @@ DeviceEvent     *event = (DeviceEvent*)ev;
     COND_WRAP_PROCESS_INPUT_PROC(mouse, xkbPrivPtr,
 				     backupproc, xkbUnwrapProc);
 
-    xkbi->state.ptr_buttons = mouse->button->state;
+    xkbi->state.ptr_buttons = (mouse->button) ? mouse->button->state : 0;
     
     /* clear any latched modifiers */
     if ( xkbi->state.latched_mods && (event->type == ET_ButtonRelease) ) {
commit ebe45e1a72a81ad22413e5d0514869b3e45a69b7
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 20 10:55:03 2009 +1000

    input: introduce partial class copying depending on the event.
    
    Copying all classes into the master device has drawbacks for hybrid devices
    (devices that are both mice and keyboards). If such a device posts an event,
    it's key classes are moved into the VCP. The key event itself is unaffected
    by keyboard grabs and the like.
    
    Partial class copying copies depending on the event and copies the classes
    into the right master device (i.e. the VCK for key events, the VCP for
    pointer events).
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 884fe72..a72fb84 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -216,83 +216,6 @@ DeepCopyFeedbackClasses(DeviceIntPtr from, DeviceIntPtr to)
 {
     ClassesPtr classes;
 
-    if (from->kbdfeed)
-    {
-        KbdFeedbackPtr *k, it;
-
-        if (!to->kbdfeed)
-        {
-            classes = dixLookupPrivate(&to->devPrivates,
-                                       UnusedClassesPrivateKey);
-
-            to->kbdfeed = classes->kbdfeed;
-            if (!to->kbdfeed)
-                InitKeyboardDeviceStruct(to, NULL, NULL, NULL);
-        }
-
-        k = &to->kbdfeed;
-        for(it = from->kbdfeed; it; it = it->next)
-        {
-            if (!(*k))
-            {
-                *k = xcalloc(1, sizeof(KbdFeedbackClassRec));
-                if (!*k)
-                {
-                    ErrorF("[Xi] Cannot alloc memory for class copy.");
-                    return;
-                }
-            }
-            (*k)->BellProc = it->BellProc;
-            (*k)->CtrlProc = it->CtrlProc;
-            (*k)->ctrl     = it->ctrl;
-            if ((*k)->xkb_sli)
-                XkbFreeSrvLedInfo((*k)->xkb_sli);
-            (*k)->xkb_sli = XkbCopySrvLedInfo(from, it->xkb_sli, *k, NULL);
-
-            k = &(*k)->next;
-        }
-    } else if (to->kbdfeed && !from->kbdfeed)
-    {
-        ClassesPtr classes;
-        classes = dixLookupPrivate(&to->devPrivates, UnusedClassesPrivateKey);
-        classes->kbdfeed = to->kbdfeed;
-        to->kbdfeed      = NULL;
-    }
-
-    if (from->ptrfeed)
-    {
-        PtrFeedbackPtr *p, it;
-        if (!to->ptrfeed)
-        {
-            classes = dixLookupPrivate(&to->devPrivates,
-                                       UnusedClassesPrivateKey);
-            to->ptrfeed = classes->ptrfeed;
-        }
-
-        p = &to->ptrfeed;
-        for (it = from->ptrfeed; it; it = it->next)
-        {
-            if (!(*p))
-            {
-                *p = xcalloc(1, sizeof(PtrFeedbackClassRec));
-                if (!*p)
-                {
-                    ErrorF("[Xi] Cannot alloc memory for class copy.");
-                    return;
-                }
-            }
-            (*p)->CtrlProc = it->CtrlProc;
-            (*p)->ctrl     = it->ctrl;
-
-            p = &(*p)->next;
-        }
-    } else if (to->ptrfeed && !from->ptrfeed)
-    {
-        ClassesPtr classes;
-        classes = dixLookupPrivate(&to->devPrivates, UnusedClassesPrivateKey);
-        classes->ptrfeed = to->ptrfeed;
-        to->ptrfeed      = NULL;
-    }
 
     if (from->intfeed)
     {
@@ -443,31 +366,63 @@ DeepCopyFeedbackClasses(DeviceIntPtr from, DeviceIntPtr to)
     }
 }
 
-/**
- * Copies the CONTENT of the classes of device from into the classes in device
- * to. From and to are identical after finishing.
- *
- * If to does not have classes from currenly has, the classes are stored in
- * to's devPrivates system. Later, we recover it again from there if needed.
- * Saves a few memory allocations.
- */
-
-void
-DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
+static void
+DeepCopyKeyboardClasses(DeviceIntPtr from, DeviceIntPtr to)
 {
     ClassesPtr classes;
 
     /* XkbInitDevice (->XkbInitIndicatorMap->XkbFindSrvLedInfo) relies on the
      * kbdfeed to be set up properly, so let's do the feedback classes first.
      */
-    DeepCopyFeedbackClasses(from, to);
+    if (from->kbdfeed)
+    {
+        KbdFeedbackPtr *k, it;
+
+        if (!to->kbdfeed)
+        {
+            classes = dixLookupPrivate(&to->devPrivates,
+                                       UnusedClassesPrivateKey);
+
+            to->kbdfeed = classes->kbdfeed;
+            if (!to->kbdfeed)
+                InitKeyboardDeviceStruct(to, NULL, NULL, NULL);
+        }
+
+        k = &to->kbdfeed;
+        for(it = from->kbdfeed; it; it = it->next)
+        {
+            if (!(*k))
+            {
+                *k = xcalloc(1, sizeof(KbdFeedbackClassRec));
+                if (!*k)
+                {
+                    ErrorF("[Xi] Cannot alloc memory for class copy.");
+                    return;
+                }
+            }
+            (*k)->BellProc = it->BellProc;
+            (*k)->CtrlProc = it->CtrlProc;
+            (*k)->ctrl     = it->ctrl;
+            if ((*k)->xkb_sli)
+                XkbFreeSrvLedInfo((*k)->xkb_sli);
+            (*k)->xkb_sli = XkbCopySrvLedInfo(from, it->xkb_sli, *k, NULL);
+
+            k = &(*k)->next;
+        }
+    } else if (to->kbdfeed && !from->kbdfeed)
+    {
+        ClassesPtr classes;
+        classes = dixLookupPrivate(&to->devPrivates, UnusedClassesPrivateKey);
+        classes->kbdfeed = to->kbdfeed;
+        to->kbdfeed      = NULL;
+    }
 
     if (from->key)
     {
         if (!to->key)
         {
             classes = dixLookupPrivate(&to->devPrivates,
-                                       UnusedClassesPrivateKey);
+                    UnusedClassesPrivateKey);
             to->key = classes->key;
             if (!to->key)
                 InitKeyboardDeviceStruct(to, NULL, NULL, NULL);
@@ -484,6 +439,89 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
         to->key      = NULL;
     }
 
+    /* We can't just copy over the focus class. When an app sets the focus,
+     * it'll do so on the master device. Copying the SDs focus means losing
+     * the focus.
+     * So we only copy the focus class if the device didn't have one,
+     * otherwise we leave it as it is.
+     */
+    if (from->focus)
+    {
+        if (!to->focus)
+        {
+            WindowPtr *oldTrace;
+
+            classes = dixLookupPrivate(&to->devPrivates,
+                                       UnusedClassesPrivateKey);
+            to->focus = classes->focus;
+            if (!to->focus)
+            {
+                to->focus = xcalloc(1, sizeof(FocusClassRec));
+                if (!to->focus)
+                    FatalError("[Xi] no memory for class shift.\n");
+            } else
+                classes->focus = NULL;
+
+            oldTrace = to->focus->trace;
+            memcpy(to->focus, from->focus, sizeof(FocusClassRec));
+            to->focus->trace = xrealloc(oldTrace,
+                                  to->focus->traceSize * sizeof(WindowPtr));
+            if (!to->focus->trace && to->focus->traceSize)
+                FatalError("[Xi] no memory for trace.\n");
+            memcpy(to->focus->trace, from->focus->trace,
+                    from->focus->traceSize * sizeof(WindowPtr));
+        }
+    } else if (to->focus)
+    {
+        ClassesPtr classes;
+        classes = dixLookupPrivate(&to->devPrivates, UnusedClassesPrivateKey);
+        classes->focus = to->focus;
+        to->focus      = NULL;
+    }
+
+}
+
+static void
+DeepCopyPointerClasses(DeviceIntPtr from, DeviceIntPtr to)
+{
+    ClassesPtr classes;
+
+    /* Feedback classes must be copied first */
+    if (from->ptrfeed)
+    {
+        PtrFeedbackPtr *p, it;
+        if (!to->ptrfeed)
+        {
+            classes = dixLookupPrivate(&to->devPrivates,
+                                       UnusedClassesPrivateKey);
+            to->ptrfeed = classes->ptrfeed;
+        }
+
+        p = &to->ptrfeed;
+        for (it = from->ptrfeed; it; it = it->next)
+        {
+            if (!(*p))
+            {
+                *p = xcalloc(1, sizeof(PtrFeedbackClassRec));
+                if (!*p)
+                {
+                    ErrorF("[Xi] Cannot alloc memory for class copy.");
+                    return;
+                }
+            }
+            (*p)->CtrlProc = it->CtrlProc;
+            (*p)->ctrl     = it->ctrl;
+
+            p = &(*p)->next;
+        }
+    } else if (to->ptrfeed && !from->ptrfeed)
+    {
+        ClassesPtr classes;
+        classes = dixLookupPrivate(&to->devPrivates, UnusedClassesPrivateKey);
+        classes->ptrfeed = to->ptrfeed;
+        to->ptrfeed      = NULL;
+    }
+
     if (from->valuator)
     {
         ValuatorClassPtr v;
@@ -552,47 +590,6 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
         to->button      = NULL;
     }
 
-
-    /* We can't just copy over the focus class. When an app sets the focus,
-     * it'll do so on the master device. Copying the SDs focus means losing
-     * the focus.
-     * So we only copy the focus class if the device didn't have one,
-     * otherwise we leave it as it is.
-     */
-    if (from->focus)
-    {
-        if (!to->focus)
-        {
-            WindowPtr *oldTrace;
-
-            classes = dixLookupPrivate(&to->devPrivates,
-                                       UnusedClassesPrivateKey);
-            to->focus = classes->focus;
-            if (!to->focus)
-            {
-                to->focus = xcalloc(1, sizeof(FocusClassRec));
-                if (!to->focus)
-                    FatalError("[Xi] no memory for class shift.\n");
-            } else
-                classes->focus = NULL;
-
-            oldTrace = to->focus->trace;
-            memcpy(to->focus, from->focus, sizeof(FocusClassRec));
-            to->focus->trace = xrealloc(oldTrace,
-                                  to->focus->traceSize * sizeof(WindowPtr));
-            if (!to->focus->trace && to->focus->traceSize)
-                FatalError("[Xi] no memory for trace.\n");
-            memcpy(to->focus->trace, from->focus->trace,
-                    from->focus->traceSize * sizeof(WindowPtr));
-        }
-    } else if (to->focus)
-    {
-        ClassesPtr classes;
-        classes = dixLookupPrivate(&to->devPrivates, UnusedClassesPrivateKey);
-        classes->focus = to->focus;
-        to->focus      = NULL;
-    }
-
     if (from->proximity)
     {
         if (!to->proximity)
@@ -643,6 +640,27 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
 }
 
 /**
+ * Copies the CONTENT of the classes of device from into the classes in device
+ * to. From and to are identical after finishing.
+ *
+ * If to does not have classes from currenly has, the classes are stored in
+ * to's devPrivates system. Later, we recover it again from there if needed.
+ * Saves a few memory allocations.
+ */
+void
+DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to, DeviceChangedEvent *dce)
+{
+    /* generic feedback classes, not tied to pointer and/or keyboard */
+    DeepCopyFeedbackClasses(from, to);
+
+    if ((dce->flags & DEVCHANGE_KEYBOARD_EVENT))
+        DeepCopyKeyboardClasses(from, to);
+    if ((dce->flags & DEVCHANGE_POINTER_EVENT))
+        DeepCopyPointerClasses(from, to);
+}
+
+
+/**
  * Change MD to look like SD by copying all classes over. An event is sent to
  * all interested clients.
  * @param device The slave device
@@ -727,10 +745,14 @@ ChangeMasterDeviceClasses(DeviceIntPtr device, DeviceChangedEvent *dce)
     if (!master) /* if device was set floating between SIGIO and now */
         return;
 
+
+    master = GetMaster(device,
+             (dce->flags & DEVCHANGE_POINTER_EVENT) ? MASTER_POINTER : MASTER_KEYBOARD);
+
     master->public.devicePrivate = device->public.devicePrivate;
 
     /* FIXME: the classes may have changed since we generated the event. */
-    DeepCopyDeviceClasses(device, master);
+    DeepCopyDeviceClasses(device, master, dce);
     XISendDeviceChangedEvent(device, master, dce);
 }
 
diff --git a/dix/devices.c b/dix/devices.c
index c94e935..6266b63 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -2320,7 +2320,8 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
             /* XXX: reset master back to defaults */
             event = InitEventList(1);
             SetMinimumEventSize(event, 1, sizeof(DeviceChangedEvent));
-            CreateClassesChangedEvent(event, oldmaster, oldmaster);
+            CreateClassesChangedEvent(event, oldmaster, oldmaster,
+                                      DEVCHANGE_POINTER_EVENT | DEVCHANGE_KEYBOARD_EVENT);
             XISendDeviceChangedEvent(oldmaster, oldmaster,
                                      (DeviceChangedEvent*)event->event);
             FreeEventList(event, 1);
diff --git a/dix/getevents.c b/dix/getevents.c
index 40cf4ca..fa3c781 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -187,7 +187,8 @@ set_valuators(DeviceIntPtr dev, DeviceEvent* event, int first_valuator,
 void
 CreateClassesChangedEvent(EventList* event,
                           DeviceIntPtr master,
-                          DeviceIntPtr slave)
+                          DeviceIntPtr slave,
+                          int type)
 {
     int i;
     DeviceChangedEvent *dce;
@@ -200,6 +201,7 @@ CreateClassesChangedEvent(EventList* event,
     dce->length = sizeof(DeviceChangedEvent);
     dce->type = ET_DeviceChanged;
     dce->time = ms;
+    dce->flags = type;
     if (master->last.slave)
     {
         dce->flags |= DEVCHANGE_HAS_OLD_SLAVE;
@@ -605,12 +607,13 @@ clipValuators(DeviceIntPtr pDev, int first_valuator, int num_valuators,
  *
  * @param events Pointer to a pre-allocated event list.
  * @param dev The slave device that generated an event.
+ * @param type Either DEVCHANGE_POINTER_EVENT and/or DEVCHANGE_KEYBOARD_EVENT
  * @param num_events The current number of events, returns the number of
  *        events if a DCCE was generated.
  * @return The updated @events pointer.
  */
 static EventListPtr
-updateFromMaster(EventListPtr events, DeviceIntPtr dev, int *num_events)
+updateFromMaster(EventListPtr events, DeviceIntPtr dev, int type, int *num_events)
 {
     DeviceIntPtr master;
 
@@ -618,7 +621,7 @@ updateFromMaster(EventListPtr events, DeviceIntPtr dev, int *num_events)
 
     if (master && master->last.slave != dev)
     {
-        CreateClassesChangedEvent(events, master, dev);
+        CreateClassesChangedEvent(events, master, dev, type);
         updateSlaveDeviceCoords(master, dev);
         master->last.slave = dev;
         master->last.numValuators = dev->last.numValuators;
@@ -852,7 +855,7 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
 
     num_events = 1;
 
-    events = updateFromMaster(events, pDev, &num_events);
+    events = updateFromMaster(events, pDev, DEVCHANGE_KEYBOARD_EVENT, &num_events);
 
     /* Handle core repeating, via press/release/press/release. */
     if (type == KeyPress && key_is_down(pDev, key_code, KEY_POSTED)) {
@@ -1021,7 +1024,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
         (type == MotionNotify && num_valuators <= 0))
         return 0;
 
-    events = updateFromMaster(events, pDev, &num_events);
+    events = updateFromMaster(events, pDev, DEVCHANGE_POINTER_EVENT, &num_events);
 
     raw = (RawDeviceEvent*)events->event;
     events++;
@@ -1134,7 +1137,7 @@ GetProximityEvents(EventList *events, DeviceIntPtr pDev, int type,
         (num_valuators + first_valuator) > pDev->valuator->numAxes)
         return 0;
 
-    events = updateFromMaster(events, pDev, &num_events);
+    events = updateFromMaster(events, pDev, DEVCHANGE_POINTER_EVENT, &num_events);
 
     event = (DeviceEvent *) events->event;
     init_event(pDev, event, GetTimeInMillis());
diff --git a/include/events.h b/include/events.h
index cc5092e..d44188b 100644
--- a/include/events.h
+++ b/include/events.h
@@ -115,6 +115,10 @@ typedef struct
 /* Flags used in DeviceChangedEvent to signal if new/old slave is present. */
 #define DEVCHANGE_HAS_OLD_SLAVE 0x1
 #define DEVCHANGE_HAS_NEW_SLAVE 0x2
+/* Flags used in DeviceChangedEvent to signal whether the event was a
+ * pointer event or a keyboard event */
+#define DEVCHANGE_POINTER_EVENT 0x4
+#define DEVCHANGE_KEYBOARD_EVENT 0x8
 
 /**
  * Sent whenever a device's capabilities have changed.
@@ -126,7 +130,8 @@ typedef struct
     int length;           /**< Length in bytes */
     Time time;            /**< Time in ms */
     int deviceid;         /**< Device whose capabilities have changed */
-    int flags;            /**< Mask of ::HAS_OLD_SLAVE or ::HAS_NEW_SLAVE */
+    int flags;            /**< Mask of ::HAS_OLD_SLAVE, ::HAS_NEW_SLAVE,
+                               ::POINTER_EVENT, ::KEYBOARD_EVENT */
     /** If flags & HAS_OLD_SLAVE is set, old_slaveid specifies SD previously
      * attached to this device. */
     int old_slaveid;
diff --git a/include/input.h b/include/input.h
index 194dbeb..437b392 100644
--- a/include/input.h
+++ b/include/input.h
@@ -412,7 +412,8 @@ extern _X_EXPORT void FreeEventList(EventListPtr list, int num_events);
 
 extern void CreateClassesChangedEvent(EventListPtr event,
                                       DeviceIntPtr master,
-                                      DeviceIntPtr slave);
+                                      DeviceIntPtr slave,
+                                      int type);
 extern int GetPointerEvents(
     EventListPtr events,
     DeviceIntPtr pDev,
@@ -480,7 +481,8 @@ extern int AllocDevicePair(ClientPtr client,
                              DeviceIntPtr* keybd,
                              Bool master);
 extern void DeepCopyDeviceClasses(DeviceIntPtr from,
-                                  DeviceIntPtr to);
+                                  DeviceIntPtr to,
+                                  DeviceChangedEvent *dce);
 
 /* Helper functions. */
 extern int generate_modkeymap(ClientPtr client, DeviceIntPtr dev,
diff --git a/mi/mi.h b/mi/mi.h
index 182cea5..4431239 100644
--- a/mi/mi.h
+++ b/mi/mi.h
@@ -221,11 +221,10 @@ extern _X_EXPORT void mieqProcessInputEvents(
     void
 );
 
-extern void CopyGetMasterEvent(
-    DeviceIntPtr /* mdev */,
+extern DeviceIntPtr CopyGetMasterEvent(
     DeviceIntPtr /* sdev */,
     InternalEvent* /* original */,
-    EventListPtr /* master */
+    EventListPtr /* mlist */
 );
 
 /**
diff --git a/mi/mieq.c b/mi/mieq.c
index d094e13..7ba755c 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -307,28 +307,53 @@ FixUpEventForMaster(DeviceIntPtr mdev, DeviceIntPtr sdev,
 
 /**
  * Copy the given event into master.
- * @param mdev The master device
  * @param sdev The slave device the original event comes from
  * @param original The event as it came from the EQ
  * @param master The event after being copied
+ * @return The master device or NULL if the device is a floating slave.
  */
-void
-CopyGetMasterEvent(DeviceIntPtr mdev, DeviceIntPtr sdev,
-                   InternalEvent* original, EventListPtr master)
+DeviceIntPtr
+CopyGetMasterEvent(DeviceIntPtr sdev,
+                   InternalEvent* original, EventListPtr mlist)
 {
+    DeviceIntPtr mdev;
     int len = original->any.length;
     InternalEvent *mevent;
 
     CHECKEVENT(original);
 
-    if (master->evlen < len)
-        SetMinimumEventSize(master, 1, len);
+    if (!sdev->u.master)
+        return NULL;
+
+    switch(original->any.type)
+    {
+        case ET_KeyPress:
+        case ET_KeyRelease:
+            mdev = GetMaster(sdev, MASTER_KEYBOARD);
+            break;
+        case ET_ButtonPress:
+        case ET_ButtonRelease:
+        case ET_Motion:
+        case ET_ProximityIn:
+        case ET_ProximityOut:
+            mdev = GetMaster(sdev, MASTER_POINTER);
+            break;
+        default:
+            mdev = sdev->u.master;
+            break;
+    }
+
+
+    if (mlist->evlen < len)
+        SetMinimumEventSize(mlist, 1, len);
 
-    mevent = (InternalEvent*)master->event;
+    mevent = (InternalEvent*)mlist->event;
 
     memcpy(mevent, original, len);
     ChangeDeviceID(mdev, mevent);
     FixUpEventForMaster(mdev, sdev, original, mevent);
+
+    return mdev;
 }
 
 
@@ -359,10 +384,7 @@ mieqProcessDeviceEvent(DeviceIntPtr dev,
         NewCurrentScreen (dev, DequeueScreen(dev), x, y);
     }
     else {
-        master  = (!IsMaster(dev) && dev->u.master) ? dev->u.master : NULL;
-
-        if (master)
-            CopyGetMasterEvent(master, dev, event, masterEvents);
+        master = CopyGetMasterEvent(dev, event, masterEvents);
 
         /* If someone's registered a custom event handler, let them
          * steal it. */
commit bc63c8a4570c989f19a036965854bceb9800ce19
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 20 12:33:49 2009 +1000

    dix: introduce GetMaster()
    
    For hybrid devices (keys + buttons/axes) the attached master device is
    generally the wrong one. One shouldn't post a button event through a
    keyboard and vice versa.
    
    GetMaster(dev) returns the right master device for the given type needed.
    This may be the MD paired with this device's MD.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/devices.c b/dix/devices.c
index 3d0d30d..c94e935 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -2346,6 +2346,41 @@ GetPairedDevice(DeviceIntPtr dev)
 
 
 /**
+ * Returns the right master for the type of event needed. If the event is a
+ * keyboard event.
+ * This function may be called with a master device as argument. If so, the
+ * returned master is either the device itself or the paired master device.
+ * If dev is a floating slave device, NULL is returned.
+ *
+ * @type ::MASTER_KEYBOARD or ::MASTER_POINTER
+ */
+DeviceIntPtr
+GetMaster(DeviceIntPtr dev, int which)
+{
+    DeviceIntPtr master;
+
+    if (IsMaster(dev))
+        master = dev;
+    else
+        master = dev->u.master;
+
+    if (master)
+    {
+        if (which == MASTER_KEYBOARD)
+        {
+            if (master->type != MASTER_KEYBOARD)
+                master = GetPairedDevice(master);
+        } else
+        {
+            if (master->type != MASTER_POINTER)
+                master = GetPairedDevice(master);
+        }
+    }
+
+    return master;
+}
+
+/**
  * Create a new device pair (== one pointer, one keyboard device).
  * Only allocates the devices, you will need to call ActivateDevice() and
  * EnableDevice() manually.
diff --git a/dix/getevents.c b/dix/getevents.c
index ff249c8..40cf4ca 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -612,7 +612,10 @@ clipValuators(DeviceIntPtr pDev, int first_valuator, int num_valuators,
 static EventListPtr
 updateFromMaster(EventListPtr events, DeviceIntPtr dev, int *num_events)
 {
-    DeviceIntPtr master = dev->u.master;
+    DeviceIntPtr master;
+
+    master = GetMaster(dev, (type & DEVCHANGE_POINTER_EVENT) ?  MASTER_POINTER : MASTER_KEYBOARD);
+
     if (master && master->last.slave != dev)
     {
         CreateClassesChangedEvent(events, master, dev);
@@ -793,8 +796,10 @@ updateHistory(DeviceIntPtr dev, int first, int num, CARD32 ms)
 {
     updateMotionHistory(dev, ms, first, num, &dev->last.valuators[first]);
     if (dev->u.master)
-        updateMotionHistory(dev->u.master, ms, first, num,
-                            &dev->last.valuators[first]);
+    {
+        DeviceIntPtr master = GetMaster(dev, MASTER_POINTER);
+        updateMotionHistory(master, ms, first, num, &dev->last.valuators[first]);
+    }
 }
 
 /**
diff --git a/include/input.h b/include/input.h
index 44990a0..194dbeb 100644
--- a/include/input.h
+++ b/include/input.h
@@ -472,6 +472,7 @@ extern int AttachDevice(ClientPtr client,
                         DeviceIntPtr master);
 
 extern _X_EXPORT DeviceIntPtr GetPairedDevice(DeviceIntPtr kbd);
+extern DeviceIntPtr GetMaster(DeviceIntPtr dev, int type);
 
 extern int AllocDevicePair(ClientPtr client,
                              char* name,
commit d79318f269d959d566ec66239b4c985afd61b259
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu May 21 08:29:14 2009 +1000

    dix: Add a deviceid to the DeviceChangedEvent.
    
    ChangeDeviceId would actually overwrite the flags field if deviceid wasn't
    present. Aside from the event of course not telling which device generated
    it in the first place.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/getevents.c b/dix/getevents.c
index 5ff4f91..ff249c8 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -195,6 +195,7 @@ CreateClassesChangedEvent(EventList* event,
 
     dce = (DeviceChangedEvent*)event->event;
     memset(dce, 0, sizeof(DeviceChangedEvent));
+    dce->deviceid = master->id;
     dce->header = ET_Internal;
     dce->length = sizeof(DeviceChangedEvent);
     dce->type = ET_DeviceChanged;
diff --git a/include/events.h b/include/events.h
index ab8f217..cc5092e 100644
--- a/include/events.h
+++ b/include/events.h
@@ -125,6 +125,7 @@ typedef struct
     int type;             /**< ET_DeviceChanged */
     int length;           /**< Length in bytes */
     Time time;            /**< Time in ms */
+    int deviceid;         /**< Device whose capabilities have changed */
     int flags;            /**< Mask of ::HAS_OLD_SLAVE or ::HAS_NEW_SLAVE */
     /** If flags & HAS_OLD_SLAVE is set, old_slaveid specifies SD previously
      * attached to this device. */
commit eeffb83fea2d87070beafd0c692fb0ad54d8335b
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon May 18 20:03:07 2009 +1000

    ABI_XINPUT_VERSION 6

diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
index cbba3ed..993e297 100644
--- a/hw/xfree86/common/xf86Module.h
+++ b/hw/xfree86/common/xf86Module.h
@@ -83,7 +83,7 @@ typedef enum {
  */
 #define ABI_ANSIC_VERSION	SET_ABI_VERSION(0, 4)
 #define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(5, 0)
-#define ABI_XINPUT_VERSION	SET_ABI_VERSION(5, 0)
+#define ABI_XINPUT_VERSION	SET_ABI_VERSION(6, 0)
 #define ABI_EXTENSION_VERSION	SET_ABI_VERSION(2, 0)
 #define ABI_FONT_VERSION	SET_ABI_VERSION(0, 6)
 
commit 438a4eafa5d14ab676827f7a5d58782c02db4cdf
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 20 17:02:50 2009 +1000

    input: remove nested union from InternalEvent.
    
    There's no need for internal events to be a struct with a single nested
    union, we might as well make the union itself the InternalEvent.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index d7fb599..884fe72 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -123,7 +123,7 @@ RegisterOtherDevice(DeviceIntPtr device)
 Bool
 IsPointerEvent(InternalEvent* event)
 {
-    switch(event->u.any.type)
+    switch(event->any.type)
     {
         case ET_ButtonPress:
         case ET_ButtonRelease:
@@ -953,7 +953,7 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
 
     CHECKEVENT(ev);
 
-    if (ev->u.any.type == ET_Raw)
+    if (ev->any.type == ET_Raw)
     {
         ProcessRawEvent((RawDeviceEvent*)ev, device);
         return;
diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index 97fc2ad..403282c 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -69,7 +69,7 @@ static int eventToRawEvent(RawDeviceEvent *ev, xEvent **xi);
 int
 EventToCore(InternalEvent *event, xEvent *core)
 {
-    switch(event->u.any.type)
+    switch(event->any.type)
     {
         case ET_Motion:
         case ET_ButtonPress:
@@ -117,7 +117,7 @@ EventToCore(InternalEvent *event, xEvent *core)
 int
 EventToXI(InternalEvent *ev, xEvent **xi, int *count)
 {
-    switch (ev->u.any.type)
+    switch (ev->any.type)
     {
         case ET_Motion:
         case ET_ButtonPress:
@@ -134,7 +134,7 @@ EventToXI(InternalEvent *ev, xEvent **xi, int *count)
             return Success;
     }
 
-    ErrorF("[dix] EventToXI: Not implemented for %d \n", ev->u.any.type);
+    ErrorF("[dix] EventToXI: Not implemented for %d \n", ev->any.type);
     return BadImplementation;
 }
 
@@ -153,7 +153,7 @@ EventToXI(InternalEvent *ev, xEvent **xi, int *count)
 int
 EventToXI2(InternalEvent *ev, xEvent **xi)
 {
-    switch (ev->u.any.type)
+    switch (ev->any.type)
     {
         case ET_Motion:
         case ET_ButtonPress:
@@ -172,7 +172,7 @@ EventToXI2(InternalEvent *ev, xEvent **xi)
 
     }
 
-    ErrorF("[dix] EventToXI2: Not implemented for %d \n", ev->u.any.type);
+    ErrorF("[dix] EventToXI2: Not implemented for %d \n", ev->any.type);
     return BadImplementation;
 }
 
@@ -472,7 +472,7 @@ int
 GetCoreType(InternalEvent *event)
 {
     int coretype = 0;
-    switch(event->u.any.type)
+    switch(event->any.type)
     {
         case ET_Motion:         coretype = MotionNotify;  break;
         case ET_ButtonPress:    coretype = ButtonPress;   break;
@@ -491,7 +491,7 @@ int
 GetXIType(InternalEvent *event)
 {
     int xitype = 0;
-    switch(event->u.any.type)
+    switch(event->any.type)
     {
         case ET_Motion:         xitype = DeviceMotionNotify;  break;
         case ET_ButtonPress:    xitype = DeviceButtonPress;   break;
@@ -513,7 +513,7 @@ GetXI2Type(InternalEvent *event)
 {
     int xi2type = 0;
 
-    switch(event->u.any.type)
+    switch(event->any.type)
     {
         case ET_Motion:         xi2type = XI_Motion;           break;
         case ET_ButtonPress:    xi2type = XI_ButtonPress;      break;
diff --git a/dix/events.c b/dix/events.c
index 3222950..8400cfa 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -1075,18 +1075,18 @@ MonthChangedOrBadTime(InternalEvent *ev)
      * different sources in sorted order, then it's possible for time to go
      * backwards when it should not.  Here we ensure a decent time.
      */
-    if ((currentTime.milliseconds - ev->u.any.time) > TIMESLOP)
+    if ((currentTime.milliseconds - ev->any.time) > TIMESLOP)
 	currentTime.months++;
     else
-        ev->u.any.time = currentTime.milliseconds;
+        ev->any.time = currentTime.milliseconds;
 }
 
 static void
 NoticeTime(InternalEvent *ev)
 {
-    if (ev->u.any.time < currentTime.milliseconds)
+    if (ev->any.time < currentTime.milliseconds)
         MonthChangedOrBadTime(ev);
-    currentTime.milliseconds = ev->u.any.time;
+    currentTime.milliseconds = ev->any.time;
     lastDeviceEventTime = currentTime;
 }
 
@@ -1158,7 +1158,7 @@ EnqueueEvent(InternalEvent *ev, DeviceIntPtr device)
 	pSprite->hotPhys.y = event->root_y;
 	/* do motion compression, but not if from different devices */
 	if (tail &&
-	    (tail->event->u.any.type == ET_Motion) &&
+	    (tail->event->any.type == ET_Motion) &&
             (tail->device == device) &&
 	    (tail->pScreen == pSprite->hotPhys.pScreen))
 	{
@@ -1212,10 +1212,10 @@ PlayReleasedEvents(void)
             pDev = qe->device;
 	    if (*syncEvents.pendtail == *prev)
 		syncEvents.pendtail = prev;
-	    if (qe->event->u.any.type == ET_Motion)
+	    if (qe->event->any.type == ET_Motion)
 		CheckVirtualMotion(pDev, qe, NullWindow);
 	    syncEvents.time.months = qe->months;
-            syncEvents.time.milliseconds = qe->event->u.any.time;
+            syncEvents.time.milliseconds = qe->event->any.time;
 #ifdef PANORAMIX
 	   /* Translate back to the sprite screen since processInputProc
 	      will translate from sprite screen to screen 0 upon reentry
@@ -2391,7 +2391,7 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
     if (rc != Success)
     {
         ErrorF("[dix] %s: XI conversion failed in DDE (%d, %d). Skipping delivery.\n",
-               dev->name, event->u.any.type, rc);
+               dev->name, event->any.type, rc);
         goto unwind;
     } else if (count > 0)
     {
@@ -2444,7 +2444,7 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
                 {
                     if (rc != BadMatch)
                         ErrorF("[dix] %s: Core conversion failed in DDE (%d, %d).\n",
-                                dev->name, event->u.any.type, rc);
+                                dev->name, event->any.type, rc);
                     goto unwind;
                 }
 
@@ -3581,7 +3581,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
     if (rc != Success)
     {
         ErrorF("[dix] %s: XI conversion failed in DFE (%d, %d). Skipping delivery.\n",
-               keybd->name, event->u.any.type, rc);
+               keybd->name, event->any.type, rc);
         goto unwind;
     } else if (count == 0) /* no XI/Core event for you */
         return;
@@ -3593,7 +3593,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
     if (rc != Success)
     {
         ErrorF("[dix] %s: XI2 conversion failed in DFE (%d, %d). Skipping delivery.\n",
-               keybd->name, event->u.any.type, rc);
+               keybd->name, event->any.type, rc);
         goto unwind;
     } else if (xi2)
     {
@@ -3621,7 +3621,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
         if (rc != Success)
         {
             ErrorF("[dix] %s: core conversion failed DFE (%d, %d). Skipping delivery.\n",
-                    keybd->name, event->u.any.type, rc);
+                    keybd->name, event->any.type, rc);
             goto unwind;
         }
 
@@ -3706,7 +3706,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
         if (rc != Success)
         {
             ErrorF("[dix] %s: XI2 conversion failed in DGE (%d, %d). Skipping delivery.\n",
-                    thisDev->name, event->u.any.type, rc);
+                    thisDev->name, event->any.type, rc);
             goto unwind;
         }
 
@@ -3714,7 +3714,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
         if (rc != Success)
         {
             ErrorF("[dix] %s: XI conversion failed in DGE (%d, %d). Skipping delivery.\n",
-                    thisDev->name, event->u.any.type, rc);
+                    thisDev->name, event->any.type, rc);
             goto unwind;
         } else if (count == 0) /* no XI/Core event for you */
             goto unwind;
@@ -3789,10 +3789,10 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
 
         }
 
-        if (deliveries && (event->u.any.type == ET_Motion))
+        if (deliveries && (event->any.type == ET_Motion))
             thisDev->valuator->motionHintWindow = grab->window;
     }
-    if (deliveries && !deactivateGrab && event->u.any.type != ET_Motion)
+    if (deliveries && !deactivateGrab && event->any.type != ET_Motion)
     {
 	switch (grabinfo->sync.state)
 	{
diff --git a/include/events.h b/include/events.h
index 8719320..ab8f217 100644
--- a/include/events.h
+++ b/include/events.h
@@ -63,9 +63,9 @@ enum {
     ET_Internal = 0xFF /* First byte */
 } EventType;
 
-#define CHECKEVENT(ev) if (ev && ((InternalEvent*)(ev))->u.any.header != 0xFF) \
+#define CHECKEVENT(ev) if (ev && ((InternalEvent*)(ev))->any.header != 0xFF) \
                           FatalError("Wrong event type %d.\n", \
-                                     ((InternalEvent*)(ev))->u.any.header);
+                                     ((InternalEvent*)(ev))->any.header);
 
 /**
  * Used for ALL input device events internal in the server until
@@ -204,9 +204,7 @@ typedef struct
  * Event type used inside the X server for input event
  * processing.
  */
-typedef struct
-{
-    union {
+typedef union {
         struct {
             unsigned char header; /**< Always ET_Internal */
             int type;             /**< One of ET_* */
@@ -219,7 +217,6 @@ typedef struct
         DGAEvent dga;
 #endif
         RawDeviceEvent raw;
-    } u;
 } InternalEvent;
 
 #endif
diff --git a/mi/mieq.c b/mi/mieq.c
index e2f18e2..d094e13 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -165,7 +165,7 @@ mieqEnqueue(DeviceIntPtr pDev, InternalEvent *e)
     CHECKEVENT(e);
 
     /* avoid merging events from different devices */
-    if (e->u.any.type == ET_Motion)
+    if (e->any.type == ET_Motion)
         isMotion = pDev->id;
 
     if (isMotion && isMotion == miEventQueue.lastMotion &&
@@ -192,7 +192,7 @@ mieqEnqueue(DeviceIntPtr pDev, InternalEvent *e)
 	stuck = 0;
     }
 
-    evlen = e->u.any.length;
+    evlen = e->any.length;
     evt = miEventQueue.events[oldtail].events;
     if (evt->evlen < evlen)
     {
@@ -210,14 +210,14 @@ mieqEnqueue(DeviceIntPtr pDev, InternalEvent *e)
 
     memcpy(evt->event, e, evlen);
 
-    time = e->u.any.time;
+    time = e->any.time;
     /* Make sure that event times don't go backwards - this
      * is "unnecessary", but very useful. */
     if (time < miEventQueue.lastEventTime &&
         miEventQueue.lastEventTime - time < 10000)
-        e->u.any.time = miEventQueue.lastEventTime;
+        e->any.time = miEventQueue.lastEventTime;
 
-    miEventQueue.lastEventTime = ((InternalEvent*)evt->event)->u.any.time;
+    miEventQueue.lastEventTime = ((InternalEvent*)evt->event)->any.time;
     miEventQueue.events[oldtail].pScreen = EnqueueScreen(pDev);
     miEventQueue.events[oldtail].pDev = pDev;
 
@@ -264,7 +264,7 @@ mieqSetHandler(int event, mieqHandler handler)
 static void
 ChangeDeviceID(DeviceIntPtr dev, InternalEvent* event)
 {
-    switch(event->u.any.type)
+    switch(event->any.type)
     {
         case ET_Motion:
         case ET_KeyPress:
@@ -275,14 +275,14 @@ ChangeDeviceID(DeviceIntPtr dev, InternalEvent* event)
         case ET_ProximityOut:
         case ET_Hierarchy:
         case ET_DeviceChanged:
-            event->u.device.deviceid = dev->id;
+            event->device.deviceid = dev->id;
             break;
         case ET_Raw:
-            event->u.raw.deviceid = dev->id;
+            event->raw.deviceid = dev->id;
             break;
         default:
             ErrorF("[mi] Unknown event type (%d), cannot change id.\n",
-                   event->u.any.type);
+                   event->any.type);
     }
 }
 
@@ -294,14 +294,14 @@ FixUpEventForMaster(DeviceIntPtr mdev, DeviceIntPtr sdev,
     CHECKEVENT(master);
     /* Ensure chained button mappings, i.e. that the detail field is the
      * value of the mapped button on the SD, not the physical button */
-    if (original->u.any.type == ET_ButtonPress ||
-        original->u.any.type == ET_ButtonRelease)
+    if (original->any.type == ET_ButtonPress ||
+        original->any.type == ET_ButtonRelease)
     {
-        int btn = original->u.device.detail.button;
+        int btn = original->device.detail.button;
         if (!sdev->button)
             return; /* Should never happen */
 
-        master->u.device.detail.button = sdev->button->map[btn];
+        master->device.detail.button = sdev->button->map[btn];
     }
 }
 
@@ -316,7 +316,7 @@ void
 CopyGetMasterEvent(DeviceIntPtr mdev, DeviceIntPtr sdev,
                    InternalEvent* original, EventListPtr master)
 {
-    int len = original->u.any.length;
+    int len = original->any.length;
     InternalEvent *mevent;
 
     CHECKEVENT(original);
@@ -349,13 +349,13 @@ mieqProcessDeviceEvent(DeviceIntPtr dev,
     CHECKEVENT(event);
 
     /* Custom event handler */
-    handler = miEventQueue.handlers[event->u.any.type];
+    handler = miEventQueue.handlers[event->any.type];
 
     if (screen && screen != DequeueScreen(dev) && !handler) {
         /* Assumption - screen switching can only occur on motion events. */
         DequeueScreen(dev) = screen;
-        x = event->u.device.root_x;
-        y = event->u.device.root_y;
+        x = event->device.root_x;
+        y = event->device.root_y;
         NewCurrentScreen (dev, DequeueScreen(dev), x, y);
     }
     else {
@@ -441,7 +441,7 @@ mieqProcessInputEvents(void)
         mieqProcessDeviceEvent(dev, event, screen);
 
         /* Update the sprite now. Next event may be from different device. */
-        if (event->u.any.type == ET_Motion && master)
+        if (event->any.type == ET_Motion && master)
             miPointerUpdateSprite(dev);
 
 #ifdef XQUARTZ
commit b12d302df8283186ce87882c29b2b0294adb2770
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 20 15:28:16 2009 +1000

    Input: rename DeviceIntRec->isMaster to ->type.
    
    isMaster is not enough as long as we differ between master pointers and
    keyboard. With flexible device classes, the usual checks for whether a
    master device is a pointer (currently check for ->button, ->valuators or
    ->key) do not work as an SD may post an event through a master and mess this
    check up.
    
    Example, a device with valuators but no buttons would remove the button
    class from the VCP and thus result in the
    IsPointerDevice(inputInfo.pointer) == FALSE.
    
    This will become worse in the future when new device classes are introduced
    that aren't provided in the current system (e.g. a switch class).
    
    This patch replaces isMaster with "type", one of SLAVE, MASTER_POINTER and
    MASTER_KEYBOARD. All checks for dev->isMaster are replaced with an
    IsMaster(dev).

diff --git a/Xext/xtest.c b/Xext/xtest.c
index 96380b7..32abe2a 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -303,7 +303,7 @@ ProcXTestFakeInput(ClientPtr client)
          * virtual test device.
          */
         for(it = inputInfo.devices; it ; it = it->next )
-            if( !it->isMaster && it->u.master == dev &&
+            if( !IsMaster(it) && it->u.master == dev &&
                     dixLookupPrivate(&it->devPrivates, XTstDevicePrivateKey ))
                 break;
         dev= it;
diff --git a/Xi/chdevhier.c b/Xi/chdevhier.c
index e59bfab..927df55 100644
--- a/Xi/chdevhier.c
+++ b/Xi/chdevhier.c
@@ -243,7 +243,7 @@ ProcXIChangeHierarchy(ClientPtr client)
                     if (rc != Success)
                         goto unwind;
 
-                    if (!ptr->isMaster)
+                    if (!IsMaster(ptr))
                     {
                         client->errorValue = r->deviceid;
                         rc = BadDevice;
@@ -259,7 +259,7 @@ ProcXIChangeHierarchy(ClientPtr client)
                     }
 
                     for(xtstdevice = inputInfo.devices; xtstdevice ; xtstdevice = xtstdevice->next )
-                        if( !xtstdevice->isMaster && xtstdevice->u.master == ptr &&
+                        if( !IsMaster(xtstdevice) && xtstdevice->u.master == ptr &&
                             dixLookupPrivate(&xtstdevice->devPrivates, XTstDevicePrivateKey ))
                             break;
 
@@ -296,7 +296,7 @@ ProcXIChangeHierarchy(ClientPtr client)
                     {
                         /* Search the matching keyboard */
                         for(xtstdevice = inputInfo.devices; xtstdevice ; xtstdevice = xtstdevice->next )
-                            if( !xtstdevice->isMaster &&
+                            if( !IsMaster(xtstdevice) &&
                                 xtstdevice->u.master == keybd &&
                                 IsKeyboardDevice(xtstdevice) &&
                                 dixLookupPrivate(&xtstdevice->devPrivates, XTstDevicePrivateKey ))
@@ -315,7 +315,7 @@ ProcXIChangeHierarchy(ClientPtr client)
                         xtstkeybd = xtstptr;
                         /* Search the matching pointer */
                         for(xtstdevice = inputInfo.devices; xtstdevice ; xtstdevice = xtstdevice->next )
-                            if( !xtstdevice->isMaster &&
+                            if( !IsMaster(xtstdevice) &&
                                 xtstdevice->u.master == ptr &&
                                 IsPointerDevice(xtstdevice) &&
                                 dixLookupPrivate(&xtstdevice->devPrivates, XTstDevicePrivateKey )
@@ -343,7 +343,7 @@ ProcXIChangeHierarchy(ClientPtr client)
                         if (rc != Success)
                             goto unwind;
 
-                        if (!newptr->isMaster)
+                        if (!IsMaster(newptr))
                         {
                             client->errorValue = r->return_pointer;
                             rc = BadDevice;
@@ -355,7 +355,7 @@ ProcXIChangeHierarchy(ClientPtr client)
                         if (rc != Success)
                             goto unwind;
 
-                        if (!newkeybd->isMaster)
+                        if (!IsMaster(newkeybd))
                         {
                             client->errorValue = r->return_keyboard;
                             rc = BadDevice;
@@ -366,7 +366,7 @@ ProcXIChangeHierarchy(ClientPtr client)
                                 attached;
                                 attached = attached->next)
                         {
-                            if (!attached->isMaster) {
+                            if (!IsMaster(attached)) {
                                 if (attached->u.master == ptr)
                                 {
                                     AttachDevice(client, attached, newptr);
@@ -418,7 +418,7 @@ ProcXIChangeHierarchy(ClientPtr client)
                     if (rc != Success)
                        goto unwind;
 
-                    if (ptr->isMaster)
+                    if (IsMaster(ptr))
                     {
                         client->errorValue = c->deviceid;
                         rc = BadDevice;
@@ -451,7 +451,7 @@ ProcXIChangeHierarchy(ClientPtr client)
                     if (rc != Success)
                        goto unwind;
 
-                    if (ptr->isMaster)
+                    if (IsMaster(ptr))
                     {
                         client->errorValue = c->deviceid;
                         rc = BadDevice;
@@ -473,7 +473,7 @@ ProcXIChangeHierarchy(ClientPtr client)
                             client, DixWriteAccess);
                     if (rc != Success)
                         goto unwind;
-                    if (!newmaster->isMaster)
+                    if (!IsMaster(newmaster))
                     {
                         client->errorValue = c->new_master;
                         rc = BadDevice;
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 04a4fbd..d7fb599 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -721,7 +721,7 @@ ChangeMasterDeviceClasses(DeviceIntPtr device, DeviceChangedEvent *dce)
 {
     DeviceIntPtr master = device->u.master;
 
-    if (device->isMaster)
+    if (IsMaster(device))
         return;
 
     if (!master) /* if device was set floating between SIGIO and now */
@@ -866,7 +866,7 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
         kptr = &b->down[key>>3];
         if (!(*kptr & bit))
             return DONT_PROCESS;
-        if (device->isMaster) {
+        if (IsMaster(device)) {
             DeviceIntPtr sd;
 
             /*
@@ -875,7 +875,7 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
              * event being delivered through the slave first
              */
             for (sd = inputInfo.devices; sd; sd = sd->next) {
-                if (sd->isMaster || sd->u.master != device)
+                if (IsMaster(sd) || sd->u.master != device)
                     continue;
                 if (!sd->button)
                     continue;
@@ -1007,7 +1007,7 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
     b = device->button;
     k = device->key;
 
-    if (device->isMaster || !device->u.master)
+    if (IsMaster(device) || !device->u.master)
         CheckMotion(event, device);
 
     switch (event->type)
@@ -1201,7 +1201,7 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
     DeviceIntPtr mouse;
     int btlen, len, i;
 
-    mouse = (dev->isMaster || dev->u.master) ? GetPairedDevice(dev) : NULL;
+    mouse = (IsMaster(dev) || dev->u.master) ? GetPairedDevice(dev) : NULL;
 
     /* XI 2 event */
     btlen = (mouse->button) ? (mouse->button->numButtons + 7)/8 : 0;
diff --git a/Xi/listdev.c b/Xi/listdev.c
index 294fec9..95c1532 100644
--- a/Xi/listdev.c
+++ b/Xi/listdev.c
@@ -177,9 +177,9 @@ CopySwapDevice(ClientPtr client, DeviceIntPtr d, int num_classes,
     dev->id = d->id;
     dev->type = d->xinput_type;
     dev->num_classes = num_classes;
-    if (d->isMaster && IsKeyboardDevice(d))
+    if (IsMaster(d) && IsKeyboardDevice(d))
 	dev->use = IsXKeyboard;
-    else if (d->isMaster && IsPointerDevice(d))
+    else if (IsMaster(d) && IsPointerDevice(d))
 	dev->use = IsXPointer;
     else if (d->key && d->kbdfeed)
         dev->use = IsXExtensionKeyboard;
@@ -344,7 +344,7 @@ ProcXListInputDevices(ClientPtr client)
     AddOtherInputDevices();
 
     for (d = inputInfo.devices; d; d = d->next) {
-        if (d->isMaster &&
+        if (IsMaster(d) &&
                 d != inputInfo.pointer &&
                 d != inputInfo.keyboard)
             continue; /* don't send master devices other than VCP/VCK */
@@ -357,7 +357,7 @@ ProcXListInputDevices(ClientPtr client)
     }
 
     for (d = inputInfo.off_devices; d; d = d->next) {
-        if (d->isMaster &&
+        if (IsMaster(d) &&
                 d != inputInfo.pointer &&
                 d != inputInfo.keyboard)
             continue; /* don't send master devices other than VCP/VCK */
@@ -378,7 +378,7 @@ ProcXListInputDevices(ClientPtr client)
     dev = (xDeviceInfoPtr) devbuf;
     for (d = inputInfo.devices; d; d = d->next)
     {
-        if (d->isMaster &&
+        if (IsMaster(d) &&
                 d != inputInfo.pointer &&
                 d != inputInfo.keyboard)
             continue; /* don't count master devices other than VCP/VCK */
@@ -388,7 +388,7 @@ ProcXListInputDevices(ClientPtr client)
 
     for (d = inputInfo.off_devices; d; d = d->next)
     {
-        if (d->isMaster &&
+        if (IsMaster(d) &&
                 d != inputInfo.pointer &&
                 d != inputInfo.keyboard)
             continue; /* don't count master devices other than VCP/VCK */
diff --git a/Xi/opendev.c b/Xi/opendev.c
index 4ad5af2..46d55a8 100644
--- a/Xi/opendev.c
+++ b/Xi/opendev.c
@@ -112,7 +112,7 @@ ProcXOpenDevice(ClientPtr client)
     } else if (status != Success)
 	return status;
 
-    if (dev->isMaster)
+    if (IsMaster(dev))
             return BadDevice;
 
     OpenInputDevice(dev, client, &status);
diff --git a/Xi/querydev.c b/Xi/querydev.c
index b50d038..d881b76 100644
--- a/Xi/querydev.c
+++ b/Xi/querydev.c
@@ -88,14 +88,14 @@ ProcXIQueryDevice(ClientPtr client)
         for (dev = inputInfo.devices; dev; dev = dev->next)
         {
             if (stuff->deviceid == XIAllDevices ||
-                (stuff->deviceid == XIAllMasterDevices && dev->isMaster))
+                (stuff->deviceid == XIAllMasterDevices && IsMaster(dev)))
                 len += SizeDeviceInfo(dev);
         }
 
         for (dev = inputInfo.off_devices; dev; dev = dev->next)
         {
             if (stuff->deviceid == XIAllDevices ||
-                (stuff->deviceid == XIAllMasterDevices && dev->isMaster))
+                (stuff->deviceid == XIAllMasterDevices && IsMaster(dev)))
                 len += SizeDeviceInfo(dev);
         }
 
@@ -126,7 +126,7 @@ ProcXIQueryDevice(ClientPtr client)
         for (dev = inputInfo.devices; dev; dev = dev->next)
         {
             if (stuff->deviceid == XIAllDevices ||
-                    (stuff->deviceid == XIAllMasterDevices && dev->isMaster))
+                    (stuff->deviceid == XIAllMasterDevices && IsMaster(dev)))
             {
                 len = ListDeviceInfo(dev, (xXIDeviceInfo*)info);
                 if (client->swapped)
@@ -139,7 +139,7 @@ ProcXIQueryDevice(ClientPtr client)
         for (dev = inputInfo.off_devices; dev; dev = dev->next)
         {
             if (stuff->deviceid == XIAllDevices ||
-                    (stuff->deviceid == XIAllMasterDevices && dev->isMaster))
+                    (stuff->deviceid == XIAllMasterDevices && IsMaster(dev)))
             {
                 len = ListDeviceInfo(dev, (xXIDeviceInfo*)info);
                 if (client->swapped)
@@ -326,7 +326,7 @@ int GetDeviceUse(DeviceIntPtr dev, uint16_t *attachment)
     DeviceIntPtr master = dev->u.master;
     int use;
 
-    if (dev->isMaster)
+    if (IsMaster(dev))
     {
         DeviceIntPtr paired = GetPairedDevice(dev);
         use = IsPointerDevice(dev) ? XIMasterPointer : XIMasterKeyboard;
diff --git a/Xi/setcptr.c b/Xi/setcptr.c
index 46b88bf..0bfc1ea 100644
--- a/Xi/setcptr.c
+++ b/Xi/setcptr.c
@@ -74,7 +74,7 @@ ProcXISetClientPointer(ClientPtr client)
     if (rc != Success)
         return rc;
 
-    if (!IsPointerDevice(pDev) || !pDev->isMaster)
+    if (!IsPointerDevice(pDev) || !IsMaster(pDev))
     {
         client->errorValue = stuff->deviceid;
         return BadDevice;
diff --git a/Xi/xiallowev.c b/Xi/xiallowev.c
index 9eb36c4..3077e1a 100644
--- a/Xi/xiallowev.c
+++ b/Xi/xiallowev.c
@@ -82,15 +82,15 @@ ProcXIAllowEvents(ClientPtr client)
 	AllowSome(client, time, dev, THAWED);
 	break;
     case XIAsyncPairedDevice:
-        if (dev->isMaster)
+        if (IsMaster(dev))
             AllowSome(client, time, dev, THAW_OTHERS);
 	break;
     case XISyncPair:
-        if (dev->isMaster)
+        if (IsMaster(dev))
             AllowSome(client, time, dev, FREEZE_BOTH_NEXT_EVENT);
 	break;
     case XIAsyncPair:
-        if (dev->isMaster)
+        if (IsMaster(dev))
             AllowSome(client, time, dev, THAWED_BOTH);
 	break;
     default:
diff --git a/Xi/xigrabdev.c b/Xi/xigrabdev.c
index 20f4e51..95beb83 100644
--- a/Xi/xigrabdev.c
+++ b/Xi/xigrabdev.c
@@ -74,7 +74,7 @@ ProcXIGrabDevice(ClientPtr client)
     if (ret != Success)
 	return ret;
 
-    if (!dev->isMaster)
+    if (!IsMaster(dev))
         stuff->paired_device_mode = GrabModeAsync;
 
     memset(mask.xi2mask, 0, sizeof(mask.xi2mask));
diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index d2dabba..3f46e67 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -102,7 +102,7 @@ ProcXIPassiveGrabDevice(ClientPtr client)
     }
 
     /* Can't grab for modifiers on an attached slave device */
-    if (!dev->isMaster)
+    if (!IsMaster(dev))
     {
         if (!dev->u.master)
             stuff->paired_device_mode = GrabModeAsync;
@@ -157,7 +157,7 @@ ProcXIPassiveGrabDevice(ClientPtr client)
     if (!modifiers_failed)
         return BadAlloc;
 
-    if (IsPointerDevice(dev) && dev->isMaster)
+    if (IsPointerDevice(dev) && IsMaster(dev))
         mod_dev = GetPairedDevice(dev);
     else
         mod_dev = dev;
@@ -261,7 +261,7 @@ ProcXIPassiveUngrabDevice(ClientPtr client)
     if (rc != Success)
         return rc;
 
-    if (dev->isMaster)
+    if (IsMaster(dev))
         mod_dev = GetPairedDevice(dev);
     else
         mod_dev = dev;
diff --git a/dix/devices.c b/dix/devices.c
index e7da2ad..3d0d30d 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -152,7 +152,7 @@ PairDevices(ClientPtr client, DeviceIntPtr ptr, DeviceIntPtr kbd)
         return BadDevice;
 
     /* Don't allow pairing for slave devices */
-    if (!ptr->isMaster || !kbd->isMaster)
+    if (!IsMaster(ptr) || !IsMaster(kbd))
         return BadDevice;
 
     if (ptr->spriteInfo->paired)
@@ -180,7 +180,7 @@ NextFreePointerDevice(void)
 {
     DeviceIntPtr dev;
     for (dev = inputInfo.devices; dev; dev = dev->next)
-        if (dev->isMaster &&
+        if (IsMaster(dev) &&
                 dev->spriteInfo->spriteOwner &&
                 !dev->spriteInfo->paired)
             return dev;
@@ -306,7 +306,7 @@ EnableDevice(DeviceIntPtr dev, BOOL sendevent)
 
     if (!dev->spriteInfo->sprite)
     {
-        if (dev->isMaster)
+        if (IsMaster(dev))
         {
             /* Sprites appear on first root window, so we can hardcode it */
             if (dev->spriteInfo->spriteOwner)
@@ -398,7 +398,7 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent)
 	return FALSE;
 
     /* float attached devices */
-    if (dev->isMaster)
+    if (IsMaster(dev))
     {
         for (other = inputInfo.devices; other; other = other->next)
         {
@@ -413,12 +413,12 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent)
     {
         for (other = inputInfo.devices; other; other = other->next)
         {
-	    if (other->isMaster && other->u.lastSlave == dev)
+	    if (IsMaster(other) && other->u.lastSlave == dev)
 		other->u.lastSlave = NULL;
 	}
     }
 
-    if (dev->isMaster && dev->spriteInfo->sprite)
+    if (IsMaster(dev) && dev->spriteInfo->sprite)
     {
         for (other = inputInfo.devices; other; other = other->next)
         {
@@ -488,7 +488,7 @@ ActivateDevice(DeviceIntPtr dev, BOOL sendevent)
         return ret;
 
     /* Initialize memory for sprites. */
-    if (dev->isMaster && dev->spriteInfo->spriteOwner)
+    if (IsMaster(dev) && dev->spriteInfo->spriteOwner)
         pScreen->DeviceCursorInitialize(dev, pScreen);
 
     SendDevicePresenceEvent(dev->id, DeviceAdded);
@@ -847,7 +847,7 @@ CloseDevice(DeviceIntPtr dev)
 	(void)(*dev->deviceProc)(dev, DEVICE_CLOSE);
 
     /* free sprite memory */
-    if (dev->isMaster && dev->spriteInfo->sprite)
+    if (IsMaster(dev) && dev->spriteInfo->sprite)
         screen->DeviceCursorCleanup(dev, screen);
 
     /* free acceleration info */
@@ -859,7 +859,7 @@ CloseDevice(DeviceIntPtr dev)
     classes = (ClassesPtr)&dev->key;
     FreeAllDeviceClasses(classes);
 
-    if (dev->isMaster)
+    if (IsMaster(dev))
     {
         classes = dixLookupPrivate(&dev->devPrivates, UnusedClassesPrivateKey);
         FreeAllDeviceClasses(classes);
@@ -904,7 +904,7 @@ CloseDownDevices(void)
      */
     for (dev = inputInfo.devices; dev; dev = dev->next)
     {
-        if (!dev->isMaster && dev->u.master)
+        if (!IsMaster(dev) && dev->u.master)
             dev->u.master = NULL;
     }
 
@@ -990,7 +990,7 @@ RemoveDevice(DeviceIntPtr dev, BOOL sendevent)
 	    else
 		prev->next = next;
 
-	    flags[tmp->id] = (tmp->isMaster) ? XIMasterRemoved : XISlaveRemoved;
+	    flags[tmp->id] = IsMaster(tmp) ? XIMasterRemoved : XISlaveRemoved;
 	    CloseDevice(tmp);
 	    ret = Success;
 	}
@@ -1000,7 +1000,7 @@ RemoveDevice(DeviceIntPtr dev, BOOL sendevent)
     for (tmp = inputInfo.off_devices; tmp; (prev = tmp), (tmp = next)) {
 	next = tmp->next;
 	if (tmp == dev) {
-	    flags[tmp->id] = (tmp->isMaster) ? XIMasterRemoved : XISlaveRemoved;
+	    flags[tmp->id] = IsMaster(tmp) ? XIMasterRemoved : XISlaveRemoved;
 	    CloseDevice(tmp);
 
 	    if (prev == NULL)
@@ -1194,7 +1194,7 @@ InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes,
     }
 
     dev->last.numValuators = numAxes;
-    if(dev->isMaster) /* master devs do not accelerate */
+    if(IsMaster(dev)) /* master devs do not accelerate */
 	InitPointerAccelerationScheme(dev, PtrAccelNoOp);
     else
 	InitPointerAccelerationScheme(dev, PtrAccelDefault);
@@ -1226,7 +1226,7 @@ InitPointerAccelerationScheme(DeviceIntPtr dev,
     if(!val)
 	return FALSE;
 
-    if(dev->isMaster && (scheme != PtrAccelNoOp))
+    if(IsMaster(dev) && (scheme != PtrAccelNoOp))
         scheme = PtrAccelNoOp; /* no accel for master devices */
 
     for(x = 0; pointerAccelerationScheme[x].number >= 0; x++) {
@@ -1587,7 +1587,7 @@ ProcChangeKeyboardMapping(ClientPtr client)
                           stuff->keyCodes, NULL, client);
 
     for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
-        if (tmp->isMaster || tmp->u.master != pDev)
+        if (IsMaster(tmp) || tmp->u.master != pDev)
             continue;
         if (!tmp->key)
             continue;
@@ -1932,7 +1932,7 @@ ProcChangeKeyboardControl (ClientPtr client)
     keyboard = PickKeyboard(client);
 
     for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
-        if ((pDev == keyboard || (!pDev->isMaster && pDev->u.master == keyboard)) &&
+        if ((pDev == keyboard || (!IsMaster(keyboard) && pDev->u.master == keyboard)) &&
             pDev->kbdfeed && pDev->kbdfeed->CtrlProc) {
             ret = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
 	    if (ret != Success)
@@ -1941,7 +1941,7 @@ ProcChangeKeyboardControl (ClientPtr client)
     }
 
     for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
-        if ((pDev == keyboard || (!pDev->isMaster && pDev->u.master == keyboard)) &&
+        if ((pDev == keyboard || (!IsMaster(keyboard) && pDev->u.master == keyboard)) &&
             pDev->kbdfeed && pDev->kbdfeed->CtrlProc) {
             ret = DoChangeKeyboardControl(client, pDev, vlist, vmask);
             if (ret != Success)
@@ -2010,7 +2010,7 @@ ProcBell(ClientPtr client)
 	newpercent = base - newpercent + stuff->percent;
 
     for (dev = inputInfo.devices; dev; dev = dev->next) {
-        if ((dev == keybd || (!dev->isMaster && dev->u.master == keybd)) &&
+        if ((dev == keybd || (!IsMaster(dev) && dev->u.master == keybd)) &&
             dev->kbdfeed && dev->kbdfeed->BellProc) {
 
 	    rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixBellAccess);
@@ -2082,7 +2082,7 @@ ProcChangePointerControl(ClientPtr client)
     }
 
     for (dev = inputInfo.devices; dev; dev = dev->next) {
-        if ((dev == mouse || (!dev->isMaster && dev->u.master == mouse)) &&
+        if ((dev == mouse || (!IsMaster(dev) && dev->u.master == mouse)) &&
             dev->ptrfeed && dev->ptrfeed->CtrlProc) {
 	    rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
 	    if (rc != Success)
@@ -2091,7 +2091,7 @@ ProcChangePointerControl(ClientPtr client)
     }
 
     for (dev = inputInfo.devices; dev; dev = dev->next) {
-        if ((dev == mouse || (!dev->isMaster && dev->u.master == mouse)) &&
+        if ((dev == mouse || (!IsMaster(dev) && dev->u.master == mouse)) &&
             dev->ptrfeed && dev->ptrfeed->CtrlProc) {
             dev->ptrfeed->ctrl = ctrl;
             (*dev->ptrfeed->CtrlProc)(dev, &mouse->ptrfeed->ctrl);
@@ -2246,10 +2246,10 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
 {
     ScreenPtr screen;
     DeviceIntPtr oldmaster;
-    if (!dev || dev->isMaster)
+    if (!dev || IsMaster(dev))
         return BadDevice;
 
-    if (master && !master->isMaster) /* can't attach to slaves */
+    if (master && !IsMaster(master)) /* can't attach to slaves */
         return BadDevice;
 
     /* set from floating to floating? */
@@ -2310,7 +2310,7 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
     {
         DeviceIntPtr it;
         for (it = inputInfo.devices; it; it = it->next)
-            if (!it->isMaster && it->u.master == oldmaster)
+            if (!IsMaster(it) && it->u.master == oldmaster)
                 break;
 
         if (!it)  /* no dev is paired with old master */
@@ -2338,7 +2338,7 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
 DeviceIntPtr
 GetPairedDevice(DeviceIntPtr dev)
 {
-    if (!dev->isMaster && dev->u.master)
+    if (!IsMaster(dev) && dev->u.master)
         dev = dev->u.master;
 
     return dev->spriteInfo->paired;
@@ -2380,7 +2380,7 @@ AllocDevicePair (ClientPtr client, char* name,
 
     pointer->u.lastSlave = NULL;
     pointer->last.slave = NULL;
-    pointer->isMaster = master;
+    pointer->type = (master) ? MASTER_POINTER : SLAVE;
 
     keyboard = AddInputDevice(client, CoreKeyboardProc, TRUE);
     if (!keyboard)
@@ -2403,7 +2403,7 @@ AllocDevicePair (ClientPtr client, char* name,
 
     keyboard->u.lastSlave = NULL;
     keyboard->last.slave = NULL;
-    keyboard->isMaster = master;
+    keyboard->type = (master) ? MASTER_KEYBOARD : SLAVE;
 
 
     /* The ClassesRec stores the device classes currently not used. */
diff --git a/dix/enterleave.c b/dix/enterleave.c
index e45d061..eadcc45 100644
--- a/dix/enterleave.c
+++ b/dix/enterleave.c
@@ -546,7 +546,7 @@ CoreEnterLeaveEvents(DeviceIntPtr dev,
                      WindowPtr to,
                      int mode)
 {
-    if (!dev->isMaster)
+    if (!IsMaster(dev))
         return;
 
     LeaveWindow(dev, from, mode);
@@ -1216,7 +1216,7 @@ CoreFocusEvents(DeviceIntPtr dev,
                 WindowPtr to,
                 int mode)
 {
-    if (!dev->isMaster)
+    if (!IsMaster(dev))
         return;
 
     SetFocusOut(dev, from);
diff --git a/dix/events.c b/dix/events.c
index 10814fa..3222950 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -329,7 +329,7 @@ DevHasCursor(DeviceIntPtr pDev)
 Bool
 IsPointerDevice(DeviceIntPtr dev)
 {
-    return (dev->valuator && dev->button);
+    return (dev->type == MASTER_POINTER) || (dev->valuator && dev->button);
 }
 
 /*
@@ -342,7 +342,14 @@ IsPointerDevice(DeviceIntPtr dev)
 Bool
 IsKeyboardDevice(DeviceIntPtr dev)
 {
-    return (dev->key && dev->kbdfeed) && !IsPointerDevice(dev);
+    return (dev->type == MASTER_KEYBOARD) ||
+            ((dev->key && dev->kbdfeed) && !IsPointerDevice(dev));
+}
+
+Bool
+IsMaster(DeviceIntPtr dev)
+{
+    return (dev->type == MASTER_POINTER || dev->type == MASTER_KEYBOARD);
 }
 
 static WindowPtr XYToWindow(
@@ -455,7 +462,7 @@ GetWindowXI2Mask(DeviceIntPtr dev, WindowPtr win, xEvent* ev)
 
     return ((inputMasks->xi2mask[dev->id][evtype/8] & filter) ||
             inputMasks->xi2mask[XIAllDevices][evtype/8] ||
-            (inputMasks->xi2mask[XIAllMasterDevices][evtype/8] && dev->isMaster));
+            (inputMasks->xi2mask[XIAllMasterDevices][evtype/8] && IsMaster(dev)));
 }
 
 static Mask
@@ -467,7 +474,7 @@ GetEventMask(DeviceIntPtr dev, xEvent *event, InputClients* other)
         int byte = ((xGenericEvent*)event)->evtype / 8;
         return (other->xi2mask[dev->id][byte] |
                 other->xi2mask[XIAllDevices][byte] |
-                (dev->isMaster? other->xi2mask[XIAllMasterDevices][byte] : 0));
+                (IsMaster(dev)? other->xi2mask[XIAllMasterDevices][byte] : 0));
     } else if (CORE_EVENT(event))
         return other->mask[XIAllDevices];
     else
@@ -1404,7 +1411,7 @@ CheckGrabForSyncs(DeviceIntPtr thisDev, Bool thisMode, Bool otherMode)
         The correct thing to do would be to freeze all SDs attached to the
         paired master device.
      */
-    if (thisDev->isMaster)
+    if (IsMaster(thisDev))
     {
         dev = GetPairedDevice(thisDev);
         if (otherMode == GrabModeSync)
@@ -1453,7 +1460,7 @@ RestoreOldMaster(DeviceIntPtr dev)
 {
     GrabMemoryPtr gm;
 
-    if (dev->isMaster)
+    if (IsMaster(dev))
         return;
 
     gm = (GrabMemoryPtr)dixLookupPrivate(&dev->devPrivates, GrabPrivateKey);
@@ -1491,7 +1498,7 @@ ActivatePointerGrab(DeviceIntPtr mouse, GrabPtr grab,
     Bool isPassive = autoGrab & ~ImplicitGrabMask;
 
     /* slave devices need to float for the duration of the grab. */
-    if (!isPassive && !mouse->isMaster)
+    if (!isPassive && !IsMaster(mouse))
     {
         SaveOldMaster(mouse);
         AttachDevice(NULL, mouse, NULL);
@@ -1569,7 +1576,7 @@ ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time, Bool pass
     WindowPtr oldWin;
 
     /* slave devices need to float for the duration of the grab. */
-    if (!passive && !keybd->isMaster)
+    if (!passive && !IsMaster(keybd))
     {
         SaveOldMaster(keybd);
         AttachDevice(NULL, keybd, NULL);
@@ -2311,7 +2318,7 @@ EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win)
     filter = GetEventFilter(dev, &ev);
     if (type && (inputMasks = wOtherInputMasks(win)) &&
         ((inputMasks->xi2mask[XIAllDevices][type/8] & filter) ||
-         ((inputMasks->xi2mask[XIAllMasterDevices][type/8] & filter) && dev->isMaster) ||
+         ((inputMasks->xi2mask[XIAllMasterDevices][type/8] & filter) && IsMaster(dev)) ||
          (inputMasks->xi2mask[dev->id][type/8] & filter)))
         rc |= XI2_MASK;
 
@@ -2430,7 +2437,7 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
             }
 
             /* Core event */
-            if ((mask & CORE_MASK) && dev->isMaster && dev->coreEvents)
+            if ((mask & CORE_MASK) && IsMaster(dev) && dev->coreEvents)
             {
                 rc = EventToCore(event, &core);
                 if (rc != Success)
@@ -3160,7 +3167,7 @@ ProcWarpPointer(ClientPtr client)
     dev = PickPointer(client);
 
     for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
-        if ((tmp == dev) || (!tmp->isMaster && tmp->u.master == dev)) {
+        if ((tmp == dev) || (!IsMaster(tmp) && tmp->u.master == dev)) {
 	    rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixWriteAccess);
 	    if (rc != Success)
 		return rc;
@@ -3492,7 +3499,7 @@ CheckDeviceGrabs(DeviceIntPtr device, DeviceEvent *event, int checkFirst)
     int i;
     WindowPtr pWin = NULL;
     FocusClassPtr focus = IsPointerEvent((InternalEvent*)event) ? NULL : device->focus;
-    BOOL sendCore = (device->isMaster && device->coreEvents);
+    BOOL sendCore = (IsMaster(device) && device->coreEvents);
 
     if (event->type != ET_ButtonPress &&
         event->type != ET_KeyPress)
@@ -3548,7 +3555,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
 {
     DeviceIntPtr ptr;
     WindowPtr focus = keybd->focus->win;
-    BOOL sendCore = (keybd->isMaster && keybd->coreEvents);
+    BOOL sendCore = (IsMaster(keybd) && keybd->coreEvents);
     xEvent core;
     xEvent *xE = NULL, *xi2 = NULL;
     int count, rc;
@@ -3714,7 +3721,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
 
         mask = grab->eventMask;
 
-        sendCore = (thisDev->isMaster && thisDev->coreEvents);
+        sendCore = (IsMaster(thisDev) && thisDev->coreEvents);
         /* try core event */
         if (sendCore && grab->grabtype == GRABTYPE_CORE)
         {
@@ -4201,7 +4208,7 @@ DeviceEnterLeaveEvent(
         if (BitIsOn(mouse->button->down, i))
             SetBit(&event[1], i);
 
-    kbd = (mouse->isMaster || mouse->u.master) ? GetPairedDevice(mouse) : NULL;
+    kbd = (IsMaster(mouse) || mouse->u.master) ? GetPairedDevice(mouse) : NULL;
     if (kbd && kbd->key)
     {
         event->mods.base_mods = kbd->key->xkbInfo->state.base_mods;
@@ -5583,7 +5590,7 @@ WriteEventsToClient(ClientPtr pClient, int count, xEvent *events)
 Bool
 SetClientPointer(ClientPtr client, ClientPtr setter, DeviceIntPtr device)
 {
-    if (!device->isMaster)
+    if (!IsMaster(device))
     {
         ErrorF("[dix] Need master device for ClientPointer. This is a bug.\n");
         return FALSE;
@@ -5627,7 +5634,7 @@ PickPointer(ClientPtr client)
         DeviceIntPtr it = inputInfo.devices;
         while (it)
         {
-            if (it->isMaster && it->spriteInfo->spriteOwner)
+            if (IsMaster(it) && it->spriteInfo->spriteOwner)
             {
                 client->clientPtr = it;
                 break;
diff --git a/dix/getevents.c b/dix/getevents.c
index e40b3db..5ff4f91 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -325,7 +325,7 @@ AllocateMotionHistory(DeviceIntPtr pDev)
      * potential valuators, plus the respective range of the valuators.
      * 3 * INT32 for (min_val, max_val, curr_val))
      */
-    if (pDev->isMaster)
+    if (IsMaster(pDev))
         size = sizeof(INT32) * 3 * MAX_VALUATORS;
     else
         size = sizeof(INT32) * pDev->valuator->numAxes;
@@ -369,7 +369,7 @@ GetMotionHistory(DeviceIntPtr pDev, xTimecoord **buff, unsigned long start,
     if (core && !pScreen)
         return 0;
 
-    if (pDev->isMaster)
+    if (IsMaster(pDev))
         size = (sizeof(INT32) * 3 * MAX_VALUATORS) + sizeof(Time);
     else
         size = (sizeof(INT32) * pDev->valuator->numAxes) + sizeof(Time);
@@ -421,7 +421,7 @@ GetMotionHistory(DeviceIntPtr pDev, xTimecoord **buff, unsigned long start,
                 coord = rescaleValuatorAxis(coord, &from, to, pScreen->height);
                 memcpy(corebuf, &coord, sizeof(INT16));
 
-            } else if (pDev->isMaster)
+            } else if (IsMaster(pDev))
             {
                 memcpy(obuff, ibuff, sizeof(Time)); /* copy timestamp */
 
@@ -497,7 +497,7 @@ updateMotionHistory(DeviceIntPtr pDev, CARD32 ms, int first_valuator,
         return;
 
     v = pDev->valuator;
-    if (pDev->isMaster)
+    if (IsMaster(pDev))
     {
         buff += ((sizeof(INT32) * 3 * MAX_VALUATORS) + sizeof(CARD32)) *
                 v->last_motion;
diff --git a/dix/inpututils.c b/dix/inpututils.c
index 1522145..79b6ab7 100644
--- a/dix/inpututils.c
+++ b/dix/inpututils.c
@@ -268,9 +268,9 @@ change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *modkeymap,
     do_modmap_change(client, dev, modmap);
 
     /* Change any attached masters/slaves. */
-    if (dev->isMaster) {
+    if (IsMaster(dev)) {
         for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
-            if (!tmp->isMaster && tmp->u.master == dev)
+            if (!IsMaster(tmp) && tmp->u.master == dev)
                 if (check_modmap_change_slave(client, dev, tmp, modmap))
                     do_modmap_change(client, tmp, modmap);
         }
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 6df0b8a..39186ac 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -323,7 +323,7 @@ xf86ActivateDevice(LocalDevicePtr local)
         local->dev = dev;      
         
         dev->coreEvents = local->flags & XI86_ALWAYS_CORE; 
-        dev->isMaster = FALSE;
+        dev->type = SLAVE;
         dev->spriteInfo->spriteOwner = FALSE;
 
         dev->deviceGrab.ActivateGrab = ActivateKeyboardGrab;
@@ -664,7 +664,7 @@ DeleteInputDeviceRequest(DeviceIntPtr pDev)
     InputDriverPtr drv = NULL;
     IDevRec *idev = NULL;
     IDevPtr *it;
-    Bool isMaster = pDev->isMaster;
+    Bool isMaster = IsMaster(pDev);
 
     if (pInfo) /* need to get these before RemoveDevice */
     {
diff --git a/hw/xfree86/ramdac/xf86Cursor.c b/hw/xfree86/ramdac/xf86Cursor.c
index 2b73b16..b866550 100644
--- a/hw/xfree86/ramdac/xf86Cursor.c
+++ b/hw/xfree86/ramdac/xf86Cursor.c
@@ -315,7 +315,7 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
     /* only update for VCP, otherwise we get cursor jumps when removing a
        sprite. The second cursor is never HW rendered anyway. */
     if (pDev == inputInfo.pointer ||
-        (!pDev->isMaster && pDev->u.master == inputInfo.pointer))
+        (!IsMaster(pDev) && pDev->u.master == inputInfo.pointer))
     {
 	ScreenPriv->CurrentCursor = pCurs;
 	ScreenPriv->x = x;
@@ -380,7 +380,7 @@ xf86CursorMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
     /* only update coordinate state for first sprite, otherwise we get jumps
        when removing a sprite. The second sprite is never HW rendered anyway */
     if (pDev == inputInfo.pointer ||
-	(!pDev->isMaster && pDev->u.master == inputInfo.pointer))
+	(!IsMaster(pDev) && pDev->u.master == inputInfo.pointer))
     {
 	ScreenPriv->x = x;
 	ScreenPriv->y = y;
diff --git a/include/dix.h b/include/dix.h
index 7811982..d4bec5f 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -580,6 +580,7 @@ extern Bool DevHasCursor(DeviceIntPtr pDev);
 extern Bool IsPointerDevice( DeviceIntPtr dev);
 extern Bool IsKeyboardDevice(DeviceIntPtr dev);
 extern Bool IsPointerEvent(InternalEvent *event);
+extern Bool IsMaster(DeviceIntPtr dev);
 
 /*
  * These are deprecated compatibility functions and will be removed soon!
diff --git a/include/inputstr.h b/include/inputstr.h
index 0fd3488..5c74ba3 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -458,6 +458,11 @@ typedef struct _SpriteInfoRec {
                                         pointer that owns the sprite. */ 
 } SpriteInfoRec, *SpriteInfoPtr;
 
+/* device types */
+#define MASTER_POINTER          1
+#define MASTER_KEYBOARD         2
+#define SLAVE                   3
+
 typedef struct _DeviceIntRec {
     DeviceRec	public;
     DeviceIntPtr next;
@@ -470,7 +475,7 @@ typedef struct _DeviceIntRec {
     Bool        enabled;                /* TRUE if ON returns Success */
     Bool        coreEvents;             /* TRUE if device also sends core */
     GrabInfoRec deviceGrab;             /* grab on the device */
-    Bool        isMaster;               /* TRUE if device is master */
+    int         type;                   /* MASTER_POINTER, MASTER_KEYBOARD, SLAVE */
     Atom		xinput_type;
     char		*name;
     CARD8		id;
diff --git a/mi/mieq.c b/mi/mieq.c
index 4b3d700..e2f18e2 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -359,7 +359,7 @@ mieqProcessDeviceEvent(DeviceIntPtr dev,
         NewCurrentScreen (dev, DequeueScreen(dev), x, y);
     }
     else {
-        master  = (!dev->isMaster && dev->u.master) ? dev->u.master : NULL;
+        master  = (!IsMaster(dev) && dev->u.master) ? dev->u.master : NULL;
 
         if (master)
             CopyGetMasterEvent(master, dev, event, masterEvents);
@@ -426,7 +426,7 @@ mieqProcessInputEvents(void)
         pthread_mutex_unlock(&miEventQueueMutex);
 #endif
 
-        master  = (!dev->isMaster && dev->u.master) ? dev->u.master : NULL;
+        master  = (!IsMaster(dev) && dev->u.master) ? dev->u.master : NULL;
 
         if (screenIsSaved == SCREEN_SAVER_ON)
             dixSaveScreens (serverClient, SCREEN_SAVER_OFF, ScreenSaverReset);
diff --git a/mi/mipointer.c b/mi/mipointer.c
index c75c120..fdad77b 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -51,7 +51,7 @@ static int miPointerPrivKeyIndex;
 static DevPrivateKey miPointerPrivKey = &miPointerPrivKeyIndex;
 
 #define MIPOINTER(dev) \
-    ((DevHasCursor((dev)) || (!dev->isMaster && !dev->u.master)) ? \
+    ((DevHasCursor((dev)) || (!IsMaster(isMaster) && !dev->u.master)) ? \
         (miPointerPtr)dixLookupPrivate(&(dev)->devPrivates, miPointerPrivKey): \
         (miPointerPtr)dixLookupPrivate(&(dev)->u.master->devPrivates, miPointerPrivKey))
 
@@ -186,8 +186,8 @@ miPointerDisplayCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
     miPointerPtr pPointer;
 
     /* return for keyboards */
-    if ((pDev->isMaster && !DevHasCursor(pDev)) ||
-        (!pDev->isMaster && pDev->u.master && !DevHasCursor(pDev->u.master)))
+    if ((IsMaster(pDev) && !DevHasCursor(pDev)) ||
+        (!IsMaster(pDev) && pDev->u.master && !DevHasCursor(pDev->u.master)))
             return FALSE;
 
     pPointer = MIPOINTER(pDev);
@@ -286,7 +286,7 @@ miPointerDeviceCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
 {
     SetupScreen(pScreen);
 
-    if (!pDev->isMaster && pDev->u.master)
+    if (!IsMaster(pDev) && pDev->u.master)
         return;
 
     (*pScreenPriv->spriteFuncs->DeviceCursorCleanup)(pDev, pScreen);
@@ -474,7 +474,7 @@ miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen,
      * VCP, as this may cause a non-HW rendered cursor to be rendered during
      * SIGIO. This again leads to allocs during SIGIO which leads to SIGABRT.
      */
-    if ((pDev == inputInfo.pointer || (!pDev->isMaster && pDev->u.master == inputInfo.pointer))
+    if ((pDev == inputInfo.pointer || (!IsMaster(pDev) && pDev->u.master == inputInfo.pointer))
         && !pScreenPriv->waitForUpdate && pScreen == pPointer->pSpriteScreen)
     {
 	pPointer->devx = x;
diff --git a/mi/misprite.c b/mi/misprite.c
index a2abbc2..3f4c573 100644
--- a/mi/misprite.c
+++ b/mi/misprite.c
@@ -764,7 +764,7 @@ miSpriteRealizeCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
     miCursorInfoPtr pCursorInfo;
 
     pScreenPriv = dixLookupPrivate(&pScreen->devPrivates, miSpriteScreenKey);
-    if (!pDev->isMaster && !pDev->u.master)
+    if (!IsMaster(pDev) && !pDev->u.master)
     {
         ErrorF("[mi] miSpriteRealizeCursor called for floating device.\n");
         return FALSE;
@@ -795,7 +795,7 @@ miSpriteSetCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
 
     pScreenPriv = dixLookupPrivate(&pScreen->devPrivates, miSpriteScreenKey);
 
-    if (!pDev->isMaster && !pDev->u.master)
+    if (!IsMaster(pDev) && !pDev->u.master)
     {
         ErrorF("[mi] miSpriteSetCursor called for floating device.\n");
         return;
@@ -912,7 +912,7 @@ miSpriteMoveCursor (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
     CursorPtr pCursor;
 
     pScreenPriv = dixLookupPrivate(&pScreen->devPrivates, miSpriteScreenKey);
-    if (!pDev->isMaster && !pDev->u.master)
+    if (!IsMaster(pDev) && !pDev->u.master)
     {
         ErrorF("[mi] miSpriteMoveCursor called for floating device.\n");
         return;
@@ -980,7 +980,7 @@ miSpriteRemoveCursor (DeviceIntPtr pDev, ScreenPtr pScreen)
     miCursorInfoPtr     pCursorInfo;
 
 
-    if (!pDev->isMaster && !pDev->u.master)
+    if (!IsMaster(pDev) && !pDev->u.master)
     {
         ErrorF("[mi] miSpriteRemoveCursor called for floating device.\n");
         return;
@@ -1020,7 +1020,7 @@ miSpriteSaveUnderCursor(DeviceIntPtr pDev, ScreenPtr pScreen)
     CursorPtr		pCursor;
     miCursorInfoPtr     pCursorInfo;
 
-    if (!pDev->isMaster && !pDev->u.master)
+    if (!IsMaster(pDev) && !pDev->u.master)
     {
         ErrorF("[mi] miSpriteSaveUnderCursor called for floating device.\n");
         return;
@@ -1063,7 +1063,7 @@ miSpriteRestoreCursor (DeviceIntPtr pDev, ScreenPtr pScreen)
     CursorPtr		pCursor;
     miCursorInfoPtr     pCursorInfo;
 
-    if (!pDev->isMaster && !pDev->u.master)
+    if (!IsMaster(pDev) && !pDev->u.master)
     {
         ErrorF("[mi] miSpriteRestoreCursor called for floating device.\n");
         return;
@@ -1107,7 +1107,7 @@ miSpriteComputeSaved (DeviceIntPtr pDev, ScreenPtr pScreen)
     CursorPtr	    pCursor;
     miCursorInfoPtr pCursorInfo;
 
-    if (!pDev->isMaster && !pDev->u.master)
+    if (!IsMaster(pDev) && !pDev->u.master)
     {
         ErrorF("[mi] miSpriteComputeSaved called for floating device.\n");
         return;
diff --git a/xkb/xkb.c b/xkb/xkb.c
index 1d97f9c..51feaa0 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -521,7 +521,7 @@ ProcXkbBell(ClientPtr client)
         DeviceIntPtr other;
         for (other = inputInfo.devices; other; other = other->next)
         {
-            if ((other != dev) && other->key && !other->isMaster && (other->u.master == dev))
+            if ((other != dev) && other->key && !IsMaster(other) && (other->u.master == dev))
             {
                 rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixBellAccess);
                 if (rc == Success)
@@ -604,7 +604,7 @@ ProcXkbLatchLockState(ClientPtr client)
     status = Success;
 
     for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
-        if ((tmpd == dev) || (!tmpd->isMaster && tmpd->u.master == dev)) {
+        if ((tmpd == dev) || (!IsMaster(tmpd) && tmpd->u.master == dev)) {
             if (!tmpd->key || !tmpd->key->xkbInfo)
                 continue;
 
@@ -746,7 +746,7 @@ ProcXkbSetControls(ClientPtr client)
     for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
         if (!tmpd->key || !tmpd->key->xkbInfo)
             continue;
-        if ((tmpd == dev) || (!tmpd->isMaster && tmpd->u.master == dev)) {
+        if ((tmpd == dev) || (!IsMaster(tmpd) && tmpd->u.master == dev)) {
             xkbi = tmpd->key->xkbInfo;
             ctrl = xkbi->desc->ctrls;
             new = *ctrl;
@@ -2556,7 +2556,7 @@ ProcXkbSetMap(ClientPtr client)
         DeviceIntPtr other;
         for (other = inputInfo.devices; other; other = other->next)
         {
-            if ((other != dev) && other->key && !other->isMaster && (other->u.master == dev))
+            if ((other != dev) && other->key && !IsMaster(other) && (other->u.master == dev))
             {
                 rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
                 if (rc == Success)
@@ -2579,7 +2579,7 @@ ProcXkbSetMap(ClientPtr client)
         DeviceIntPtr other;
         for (other = inputInfo.devices; other; other = other->next)
         {
-            if ((other != dev) && other->key && !other->isMaster && (other->u.master == dev))
+            if ((other != dev) && other->key && !IsMaster(other) && (other->u.master == dev))
             {
                 rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
                 if (rc == Success)
@@ -2886,7 +2886,7 @@ ProcXkbSetCompatMap(ClientPtr client)
         DeviceIntPtr other;
         for (other = inputInfo.devices; other; other = other->next)
         {
-            if ((other != dev) && other->key && !other->isMaster && (other->u.master == dev))
+            if ((other != dev) && other->key && !IsMaster(other) && (other->u.master == dev))
             {
                 rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
                 if (rc == Success)
@@ -2909,7 +2909,7 @@ ProcXkbSetCompatMap(ClientPtr client)
         DeviceIntPtr other;
         for (other = inputInfo.devices; other; other = other->next)
         {
-            if ((other != dev) && other->key && !other->isMaster && (other->u.master == dev))
+            if ((other != dev) && other->key && !IsMaster(other) && (other->u.master == dev))
             {
                 rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
                 if (rc == Success)
@@ -3164,7 +3164,7 @@ ProcXkbSetIndicatorMap(ClientPtr client)
         DeviceIntPtr other;
         for (other = inputInfo.devices; other; other = other->next)
         {
-            if ((other != dev) && other->key && !other->isMaster && (other->u.master == dev))
+            if ((other != dev) && other->key && !IsMaster(other) && (other->u.master == dev))
             {
                 rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixSetAttrAccess);
                 if (rc == Success)
@@ -3432,7 +3432,7 @@ ProcXkbSetNamedIndicator(ClientPtr client)
         DeviceIntPtr other;
         for (other = inputInfo.devices; other; other = other->next)
         {
-            if ((other != dev) && !other->isMaster && (other->u.master == dev) &&
+            if ((other != dev) && !IsMaster(other) && (other->u.master == dev) &&
                 (XaceHook(XACE_DEVICE_ACCESS, client, other, DixSetAttrAccess) == Success))
             {
                 rc = _XkbCreateIndicatorMap(other, stuff->indicator,
@@ -3455,7 +3455,7 @@ ProcXkbSetNamedIndicator(ClientPtr client)
         DeviceIntPtr other;
         for (other = inputInfo.devices; other; other = other->next)
         {
-            if ((other != dev) && !other->isMaster && (other->u.master == dev) &&
+            if ((other != dev) && !IsMaster(other) && (other->u.master == dev) &&
                 (XaceHook(XACE_DEVICE_ACCESS, client, other, DixSetAttrAccess) == Success))
             {
                 _XkbSetNamedIndicator(client, other, stuff);
@@ -4245,7 +4245,7 @@ ProcXkbSetNames(ClientPtr client)
         DeviceIntPtr other;
         for (other = inputInfo.devices; other; other = other->next)
         {
-            if ((other != dev) && other->key && !other->isMaster && (other->u.master == dev))
+            if ((other != dev) && other->key && !IsMaster(other) && (other->u.master == dev))
             {
 
                 rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
@@ -4270,7 +4270,7 @@ ProcXkbSetNames(ClientPtr client)
         DeviceIntPtr other;
         for (other = inputInfo.devices; other; other = other->next)
         {
-            if ((other != dev) && other->key && !other->isMaster && (other->u.master == dev))
+            if ((other != dev) && other->key && !IsMaster(other) && (other->u.master == dev))
             {
 
                 rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
@@ -5321,7 +5321,7 @@ ProcXkbSetGeometry(ClientPtr client)
         DeviceIntPtr other;
         for (other = inputInfo.devices; other; other = other->next)
         {
-            if ((other != dev) && other->key && !other->isMaster && (other->u.master == dev))
+            if ((other != dev) && other->key && !IsMaster(other) && (other->u.master == dev))
             {
                 rc = XaceHook(XACE_DEVICE_ACCESS, client, other, DixManageAccess);
                 if (rc == Success)
@@ -5835,7 +5835,7 @@ ProcXkbGetKbdByName(ClientPtr client)
 	xkb->ctrls->num_groups= nTG;
 
         for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
-            if ((tmpd == dev) || (!tmpd->isMaster && tmpd->u.master == dev)) {
+            if ((tmpd == dev) || (!IsMaster(tmpd) && tmpd->u.master == dev)) {
                 if (tmpd != dev)
                     XkbCopyDeviceKeymap(tmpd, dev);
 
@@ -6499,7 +6499,7 @@ ProcXkbSetDeviceInfo(ClientPtr client)
         DeviceIntPtr other;
         for (other = inputInfo.devices; other; other = other->next)
         {
-            if (((other != dev) && !other->isMaster && (other->u.master == dev)) &&
+            if (((other != dev) && !IsMaster(other) && (other->u.master == dev)) &&
                 ((stuff->deviceSpec == XkbUseCoreKbd && other->key) ||
                 (stuff->deviceSpec == XkbUseCorePtr && other->button)))
             {
@@ -6524,7 +6524,7 @@ ProcXkbSetDeviceInfo(ClientPtr client)
         DeviceIntPtr other;
         for (other = inputInfo.devices; other; other = other->next)
         {
-            if (((other != dev) && !other->isMaster && (other->u.master == dev)) &&
+            if (((other != dev) && !IsMaster(other) && (other->u.master == dev)) &&
                 ((stuff->deviceSpec == XkbUseCoreKbd && other->key) ||
                 (stuff->deviceSpec == XkbUseCorePtr && other->button)))
             {
commit add2defac7e59dcb355e5ba12b6de60861741d57
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 20 16:23:38 2009 +1000

    Split the signal-handler's lastSlave out into a separate variable.
    
    dev->u.lastSlave was not signal safe since it was accessed by the DIX and
    during signal handling.
    Replaced with:
    'dev->last.slave' for the signal handler's lastSlave (used to generate
                      DeviceChangedEvents), .
    'dev->u.lastSlave' for the DIX lastSlave (currently only used in
                       change_modmap)
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 7772029..04a4fbd 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1010,7 +1010,6 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
     if (device->isMaster || !device->u.master)
         CheckMotion(event, device);
 
-
     switch (event->type)
     {
         case ET_Motion:
diff --git a/dix/devices.c b/dix/devices.c
index ff91608..e7da2ad 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -433,6 +433,18 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent)
 
     (void)(*dev->deviceProc)(dev, DEVICE_OFF);
     dev->enabled = FALSE;
+
+    /* now that the device is disabled, we can reset the signal handler's
+     * last.slave */
+    OsBlockSignals();
+    for (other = inputInfo.devices; other; other = other->next)
+    {
+        if (other->last.slave == dev)
+            other->last.slave = NULL;
+    }
+    OsReleaseSignals();
+
+
     *prev = dev->next;
     dev->next = inputInfo.off_devices;
     inputInfo.off_devices = dev;
@@ -2367,6 +2379,7 @@ AllocDevicePair (ClientPtr client, char* name,
     pointer->spriteInfo->spriteOwner = TRUE;
 
     pointer->u.lastSlave = NULL;
+    pointer->last.slave = NULL;
     pointer->isMaster = master;
 
     keyboard = AddInputDevice(client, CoreKeyboardProc, TRUE);
@@ -2389,6 +2402,7 @@ AllocDevicePair (ClientPtr client, char* name,
     keyboard->spriteInfo->spriteOwner = FALSE;
 
     keyboard->u.lastSlave = NULL;
+    keyboard->last.slave = NULL;
     keyboard->isMaster = master;
 
 
diff --git a/dix/getevents.c b/dix/getevents.c
index 652bd67..e40b3db 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -199,10 +199,10 @@ CreateClassesChangedEvent(EventList* event,
     dce->length = sizeof(DeviceChangedEvent);
     dce->type = ET_DeviceChanged;
     dce->time = ms;
-    if (master->u.lastSlave)
+    if (master->last.slave)
     {
         dce->flags |= DEVCHANGE_HAS_OLD_SLAVE;
-        dce->old_slaveid = master->u.lastSlave->id;
+        dce->old_slaveid = master->last.slave->id;
     }
     dce->flags |= DEVCHANGE_HAS_NEW_SLAVE;
     dce->new_slaveid = slave->id;
@@ -294,7 +294,7 @@ updateSlaveDeviceCoords(DeviceIntPtr master, DeviceIntPtr pDev)
      * slave-device. If the old slave had less axes than this one,
      * last.valuators is reset to 0.
      */
-    if ((lastSlave = master->u.lastSlave) && lastSlave->valuator) {
+    if ((lastSlave = master->last.slave) && lastSlave->valuator) {
         for (i = 2; i < pDev->valuator->numAxes; i++) {
             if (i >= lastSlave->valuator->numAxes)
                 pDev->last.valuators[i] = 0;
@@ -612,11 +612,11 @@ static EventListPtr
 updateFromMaster(EventListPtr events, DeviceIntPtr dev, int *num_events)
 {
     DeviceIntPtr master = dev->u.master;
-    if (master && master->u.lastSlave != dev)
+    if (master && master->last.slave != dev)
     {
         CreateClassesChangedEvent(events, master, dev);
         updateSlaveDeviceCoords(master, dev);
-        master->u.lastSlave = dev;
+        master->last.slave = dev;
         master->last.numValuators = dev->last.numValuators;
         (*num_events)++;
         events++;
diff --git a/include/inputstr.h b/include/inputstr.h
index 0a541a7..0fd3488 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -507,6 +507,7 @@ typedef struct _DeviceIntRec {
         int             valuators[MAX_VALUATORS];
         float           remainder[MAX_VALUATORS];
         int             numValuators;
+        DeviceIntPtr    slave;
     } last;
 
     /* Input device property handling. */
diff --git a/mi/mieq.c b/mi/mieq.c
index 08444e1..4b3d700 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -370,8 +370,11 @@ mieqProcessDeviceEvent(DeviceIntPtr dev,
         {
             handler(DequeueScreen(dev)->myNum, event, dev);
             if (master)
+            {
+                master->u.lastSlave = dev;
                 handler(DequeueScreen(master)->myNum,
                         (InternalEvent*)masterEvents->event, master);
+            }
         } else
         {
             /* process slave first, then master */
commit 525aa17f804d37d1cfcbbf6b8e6cddb45e999b20
Author: Tomas Janousek <tomi at nomi.cz>
Date:   Wed May 20 15:03:01 2009 +0200

    Bug #6428, #16458, #21464: Fix crash due to uninitialized VModMap fields.
    
    In ProcXkbGetKbdByName, mrep.firstVModMapKey, .nVModMapKeys and
    .totalVModMapKeys were not initialized, contained random values and caused
    accesses to unallocated and later modified memory, causing
    XkbSizeVirtualModMap and XkbWriteVirtualModMap to see different number of
    nonzero values, resulting in writes past the end of an array in XkbSendMap.
    
    This patch initializes those values sensibly and reverts commits 5c0a2088 and
    6dd4fc46, which have been plain non-sense.
    
    Signed-off-by: Tomas Janousek <tomi at nomi.cz>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/xkb/xkb.c b/xkb/xkb.c
index 445c55f..ec46238 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -1308,7 +1308,7 @@ XkbSizeVirtualModMap(XkbDescPtr xkb,xkbGetMapReply *rep)
 	rep->totalVModMapKeys= 0;
 	return 0;
     }
-    for (nRtrn=i=0;i<rep->nVModMapKeys-1;i++) {
+    for (nRtrn=i=0;i<rep->nVModMapKeys;i++) {
 	if (xkb->server->vmodmap[i+rep->firstVModMapKey]!=0)
 	    nRtrn++;
     }
@@ -1327,7 +1327,7 @@ unsigned short *	pMap;
 
     wire= (xkbVModMapWireDesc *)buf;
     pMap= &xkb->server->vmodmap[rep->firstVModMapKey];
-    for (i=0;i<rep->nVModMapKeys-1;i++,pMap++) {
+    for (i=0;i<rep->nVModMapKeys;i++,pMap++) {
 	if (*pMap!=0) {
 	    wire->key= i+rep->firstVModMapKey;
 	    wire->vmods= *pMap;
@@ -5670,7 +5670,7 @@ ProcXkbGetKbdByName(ClientPtr client)
 	    mrep.present = 0;
 	    mrep.totalSyms = mrep.totalActs =
 		mrep.totalKeyBehaviors= mrep.totalKeyExplicit= 
-		mrep.totalModMapKeys= 0;
+		mrep.totalModMapKeys= mrep.totalVModMapKeys= 0;
 	    if (rep.reported&(XkbGBN_TypesMask|XkbGBN_ClientSymbolsMask)) {
 		mrep.present|= XkbKeyTypesMask;
 		mrep.firstType = 0;
@@ -5696,6 +5696,8 @@ ProcXkbGetKbdByName(ClientPtr client)
 			mrep.firstKeyExplicit = new->min_key_code;
 		mrep.nKeyActs = mrep.nKeyBehaviors = 
 			mrep.nKeyExplicit = XkbNumKeys(new);
+		mrep.firstVModMapKey= new->min_key_code;
+		mrep.nVModMapKeys= XkbNumKeys(new);
 	    }
 	    else {
 		mrep.virtualMods= 0;
commit 7db55a0806c82bd4143c8bf1b8eb2b62e456ad9a
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 20 14:38:25 2009 +1000

    dix: remove superfluous loop in change_modmap.
    
    A device can only be attached to a single master device. So instead of
    looping and searching for the master device, we can just use dev->u.master
    directly.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/inpututils.c b/dix/inpututils.c
index c630088..1522145 100644
--- a/dix/inpututils.c
+++ b/dix/inpututils.c
@@ -275,14 +275,10 @@ change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *modkeymap,
                     do_modmap_change(client, tmp, modmap);
         }
     }
-    else {
-        for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
-            if (tmp->isMaster && tmp->u.lastSlave == dev) {
-                /* If this fails, expect the results to be weird. */
-                if (check_modmap_change(client, tmp, modmap))
-                    do_modmap_change(client, tmp, modmap);
-            }
-        }
+    else if (dev->u.master && dev->u.master->u.lastSlave == dev) {
+        /* If this fails, expect the results to be weird. */
+        if (check_modmap_change(client, dev->u.master, modmap))
+            do_modmap_change(client, dev->u.master, modmap);
     }
 
     return Success;
commit cabff9007a4abad026b450a4aab155c7bcd94326
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 15 08:33:07 2009 +1000

    xfree86: treat other drivers as mouse drivers in the config.
    
    Historically, if no input device was referenced in the ServerLayout,
    the server would pick the first "mouse" device found in the xorg.conf.
    This patch gives evdev, synaptics, vmmouse and void the same status. If
    there is a section in the config file using this driver - use it as the core
    pointer.
    
    Device selection is in driver-order, not in config-order. If a "mouse"
    device is listed after a "synaptics" device, the "mouse" device gets
    preference. This replicates the original behaviour.
    
    This code only takes effect if AllowEmptyInput is off and there is no core
    pointer in the server layout.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 73235a9..165958b 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -1090,8 +1090,8 @@ Bool xf86DRI2Enabled(void)
  *  2. The "CorePointer" and "CoreKeyboard" InputDevices referred to by
  *     the active ServerLayout.
  *  3. The first InputDevices marked as "CorePointer" and "CoreKeyboard".
- *  4. The first InputDevices that use the 'mouse' and 'keyboard' or 'kbd'
- *     drivers.
+ *  4. The first InputDevices that use 'keyboard' or 'kbd' and a valid mouse
+ *     driver (mouse, synaptics, evdev, vmmouse, void)
  *  5. Default devices with an empty (default) configuration.  These defaults
  *     will reference the 'mouse' and 'keyboard' drivers.
  */
@@ -1110,6 +1110,8 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
     int count = 0;
     MessageType from = X_DEFAULT;
     int found = 0;
+    const char *mousedrivers[] = { "mouse", "synaptics", "evdev", "vmmouse",
+				   "void", NULL };
 
     /*
      * First check if a core pointer or core keyboard have been specified
@@ -1219,13 +1221,15 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
 	}
     }
 
-    /* 4. First pointer with 'mouse' as the driver. */
+    /* 4. First pointer with an allowed mouse driver. */
     if (!foundPointer && !xf86Info.allowEmptyInput) {
+	const char **driver = mousedrivers;
 	confInput = xf86findInput(CONF_IMPLICIT_POINTER,
 				  xf86configptr->conf_input_lst);
-	if (!confInput) {
-	    confInput = xf86findInputByDriver("mouse",
+	while (driver && !confInput) {
+	    confInput = xf86findInputByDriver(*driver,
 					      xf86configptr->conf_input_lst);
+	    driver++;
 	}
 	if (confInput) {
 	    foundPointer = TRUE;
@@ -1280,10 +1284,13 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
      * section ... deal.
      */
     for (devs = servlayoutp->inputs; devs && *devs; devs++) {
-	if (!strcmp((*devs)->driver, "void") || !strcmp((*devs)->driver, "mouse") ||
-            !strcmp((*devs)->driver, "vmmouse") || !strcmp((*devs)->driver, "evdev") ||
-            !strcmp((*devs)->driver, "synaptics")) {
-	    found = 1; break;
+	const char **driver = mousedrivers;
+	while(*driver) {
+	    if (!strcmp((*devs)->driver, *driver)) {
+		found = 1;
+		break;
+	    }
+	    driver++;
 	}
     }
     if (!found && !xf86Info.allowEmptyInput) {
commit a8bd1e1f96d8e5380972a7dce8d9940cd912aa09
Author: Søren Sandmann Pedersen <ssp at l3000.localdomain>
Date:   Thu May 21 18:21:28 2009 -0400

    Fix alpha map computation in miComputeCompositeRegion()
    
    According to the RENDER spec, the origin of the alpha map is
    interpreted relative to the origin of the drawable of the image, not
    the origin of drawable of the alpha map.
    
    The only use of alpha maps I have been able to find is in Qt and they
    don't use a non-zero alpha origin.

diff --git a/render/mipict.c b/render/mipict.c
index 777f111..fe1b8da 100644
--- a/render/mipict.c
+++ b/render/mipict.c
@@ -459,8 +459,8 @@ miComputeCompositeRegion (RegionPtr	pRegion,
     if (pSrc->alphaMap)
     {
 	if (!miClipPictureSrc (pRegion, pSrc->alphaMap,
-			       xDst - (xSrc + pSrc->alphaOrigin.x),
-			       yDst - (ySrc + pSrc->alphaOrigin.y)))
+			       xDst - (xSrc - pSrc->alphaOrigin.x),
+			       yDst - (ySrc - pSrc->alphaOrigin.y)))
 	{
 	    pixman_region_fini (pRegion);
 	    return FALSE;
@@ -477,8 +477,8 @@ miComputeCompositeRegion (RegionPtr	pRegion,
 	if (pMask->alphaMap)
 	{
 	    if (!miClipPictureSrc (pRegion, pMask->alphaMap,
-				   xDst - (xMask + pMask->alphaOrigin.x),
-				   yDst - (yMask + pMask->alphaOrigin.y)))
+				   xDst - (xMask - pMask->alphaOrigin.x),
+				   yDst - (yMask - pMask->alphaOrigin.y)))
 	    {
 		pixman_region_fini (pRegion);
 		return FALSE;
commit a2c5ee36b21c2ee5c0468f1b251e74c1412dbecb
Author: Adam Jackson <ajax at redhat.com>
Date:   Thu May 21 10:20:48 2009 -0400

    EDID: Be more cautious about finding vendor blocks.
    
    Many old monitors zero-fill the detailed descriptors, so check for that
    to avoid a useless warning like:
    
    (WW) RADEON(0): Unknown vendor-specific block 0

diff --git a/hw/xfree86/ddc/interpret_edid.c b/hw/xfree86/ddc/interpret_edid.c
index 3edfd1f..bdcc92e 100644
--- a/hw/xfree86/ddc/interpret_edid.c
+++ b/hw/xfree86/ddc/interpret_edid.c
@@ -285,6 +285,8 @@ get_std_timing_section(Uchar *c, struct std_timings *r,
     }
 }
 
+static const unsigned char empty_block[18];
+
 static void
 get_dt_md_section(Uchar *c, struct edid_version *ver, 
 		  struct detailed_monitor_section *det_mon)
@@ -336,10 +338,10 @@ get_dt_md_section(Uchar *c, struct edid_version *ver,
         det_mon[i].type = DS_UNKOWN;
         break;
       }
-      if (c[3] <= 0x0F) {
+      if (c[3] <= 0x0F && memcmp(c, empty_block, sizeof(empty_block))) {
 	det_mon[i].type = DS_VENDOR + c[3];
       }
-    } else { 
+    } else {
       det_mon[i].type = DT;
       get_detailed_timing_section(c,&det_mon[i].section.d_timings);
     }
commit 73c7398aafa050950ad614483fb0d5bdd2da97ca
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 20 10:40:50 2009 +1000

    dix: 'namespace' HAS_OLD_SLAVE and HAS_NEW_SLAVE.
    
    We need more flags for this in the near future, so let's namespace them now.

diff --git a/dix/getevents.c b/dix/getevents.c
index 2f61537..652bd67 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -201,10 +201,10 @@ CreateClassesChangedEvent(EventList* event,
     dce->time = ms;
     if (master->u.lastSlave)
     {
-        dce->flags |= HAS_OLD_SLAVE;
+        dce->flags |= DEVCHANGE_HAS_OLD_SLAVE;
         dce->old_slaveid = master->u.lastSlave->id;
     }
-    dce->flags |= HAS_NEW_SLAVE;
+    dce->flags |= DEVCHANGE_HAS_NEW_SLAVE;
     dce->new_slaveid = slave->id;
 
     if (slave->button)
diff --git a/include/events.h b/include/events.h
index 6803b5b..8719320 100644
--- a/include/events.h
+++ b/include/events.h
@@ -112,9 +112,9 @@ typedef struct
 } DeviceEvent;
 
 
-/* Flags used in DeviceChangedEvent to signal if new/old slave is present */
-#define HAS_OLD_SLAVE 0x1
-#define HAS_NEW_SLAVE 0x2
+/* Flags used in DeviceChangedEvent to signal if new/old slave is present. */
+#define DEVCHANGE_HAS_OLD_SLAVE 0x1
+#define DEVCHANGE_HAS_NEW_SLAVE 0x2
 
 /**
  * Sent whenever a device's capabilities have changed.
commit 5b5e3fa2771383a85afff679be34df19d3a4e290
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 15 08:33:07 2009 +1000

    xfree86: treat other drivers as mouse drivers in the config.
    
    Historically, if no input device was referenced in the ServerLayout,
    the server would pick the first "mouse" device found in the xorg.conf.
    This patch gives evdev, synaptics, vmmouse and void the same status. If
    there is a section in the config file using this driver - use it as the core
    pointer.
    
    Device selection is in driver-order, not in config-order. If a "mouse"
    device is listed after a "synaptics" device, the "mouse" device gets
    preference. This replicates the original behaviour.
    
    This code only takes effect if AllowEmptyInput is off and there is no core
    pointer in the server layout.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 2ecb639..844e04a 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -1091,8 +1091,8 @@ Bool xf86DRI2Enabled(void)
  *  2. The "CorePointer" and "CoreKeyboard" InputDevices referred to by
  *     the active ServerLayout.
  *  3. The first InputDevices marked as "CorePointer" and "CoreKeyboard".
- *  4. The first InputDevices that use the 'mouse' and 'keyboard' or 'kbd'
- *     drivers.
+ *  4. The first InputDevices that use 'keyboard' or 'kbd' and a valid mouse
+ *     driver (mouse, synaptics, evdev, vmmouse, void)
  *  5. Default devices with an empty (default) configuration.  These defaults
  *     will reference the 'mouse' and 'keyboard' drivers.
  */
@@ -1111,6 +1111,8 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
     int count = 0;
     MessageType from = X_DEFAULT;
     int found = 0;
+    const char *mousedrivers[] = { "mouse", "synaptics", "evdev", "vmmouse",
+				   "void", NULL };
 
     /*
      * First check if a core pointer or core keyboard have been specified
@@ -1220,13 +1222,15 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
 	}
     }
 
-    /* 4. First pointer with 'mouse' as the driver. */
+    /* 4. First pointer with an allowed mouse driver. */
     if (!foundPointer && !xf86Info.allowEmptyInput) {
+	const char **driver = mousedrivers;
 	confInput = xf86findInput(CONF_IMPLICIT_POINTER,
 				  xf86configptr->conf_input_lst);
-	if (!confInput) {
-	    confInput = xf86findInputByDriver("mouse",
+	while (driver && !confInput) {
+	    confInput = xf86findInputByDriver(*driver,
 					      xf86configptr->conf_input_lst);
+	    driver++;
 	}
 	if (confInput) {
 	    foundPointer = TRUE;
@@ -1281,10 +1285,13 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
      * section ... deal.
      */
     for (devs = servlayoutp->inputs; devs && *devs; devs++) {
-	if (!strcmp((*devs)->driver, "void") || !strcmp((*devs)->driver, "mouse") ||
-            !strcmp((*devs)->driver, "vmmouse") || !strcmp((*devs)->driver, "evdev") ||
-            !strcmp((*devs)->driver, "synaptics")) {
-	    found = 1; break;
+	const char **driver = mousedrivers;
+	while(*driver) {
+	    if (!strcmp((*devs)->driver, *driver)) {
+		found = 1;
+		break;
+	    }
+	    driver++;
 	}
     }
     if (!found && !xf86Info.allowEmptyInput) {
commit 1cce55cc0333a026474100cf2f784e220fd96473
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 20 14:07:03 2009 +1000

    input: rename device->type to device->xinput_type.
    
    This type is only used in XI to give a hint of what type this device may be.
    Call it xinput_type for clarity.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/extinit.c b/Xi/extinit.c
index 1f77729..a8f8f10 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -1079,7 +1079,7 @@ IResetProc(ExtensionEntry * unused)
 void
 AssignTypeAndName(DeviceIntPtr dev, Atom type, char *name)
 {
-    dev->type = type;
+    dev->xinput_type = type;
     dev->name = (char *)xalloc(strlen(name) + 1);
     strcpy(dev->name, name);
 }
diff --git a/Xi/listdev.c b/Xi/listdev.c
index e7d0a9d..294fec9 100644
--- a/Xi/listdev.c
+++ b/Xi/listdev.c
@@ -175,7 +175,7 @@ CopySwapDevice(ClientPtr client, DeviceIntPtr d, int num_classes,
     dev = (xDeviceInfoPtr) * buf;
 
     dev->id = d->id;
-    dev->type = d->type;
+    dev->type = d->xinput_type;
     dev->num_classes = num_classes;
     if (d->isMaster && IsKeyboardDevice(d))
 	dev->use = IsXKeyboard;
diff --git a/include/inputstr.h b/include/inputstr.h
index e562c0a..0a541a7 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -471,7 +471,7 @@ typedef struct _DeviceIntRec {
     Bool        coreEvents;             /* TRUE if device also sends core */
     GrabInfoRec deviceGrab;             /* grab on the device */
     Bool        isMaster;               /* TRUE if device is master */
-    Atom		type;
+    Atom		xinput_type;
     char		*name;
     CARD8		id;
     KeyClassPtr		key;
diff --git a/xkb/xkb.c b/xkb/xkb.c
index 3688bfc..1d97f9c 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -6117,7 +6117,7 @@ char *			str;
     if (dev->button)
 	 rep.totalBtns= dev->button->numButtons;
     else rep.totalBtns= 0;
-    rep.devType=	dev->type;
+    rep.devType=	dev->xinput_type;
     rep.hasOwnState=	(dev->key && dev->key->xkbInfo);
     rep.nDeviceLedFBs = 0;
     if (dev->kbdfeed)	rep.dfltKbdFB= dev->kbdfeed->ctrl.id;
commit 81b3b0cce088866dc3cda099d7c8d6655849fd43
Author: Tomas Janousek <tomi at nomi.cz>
Date:   Wed May 20 15:03:01 2009 +0200

    Bug #6428, #16458, #21464: Fix crash due to uninitialized VModMap fields.
    
    In ProcXkbGetKbdByName, mrep.firstVModMapKey, .nVModMapKeys and
    .totalVModMapKeys were not initialized, contained random values and caused
    accesses to unallocated and later modified memory, causing
    XkbSizeVirtualModMap and XkbWriteVirtualModMap to see different number of
    nonzero values, resulting in writes past the end of an array in XkbSendMap.
    
    This patch initializes those values sensibly and reverts commits 5c0a2088 and
    6dd4fc46, which have been plain non-sense.
    
    Signed-off-by: Tomas Janousek <tomi at nomi.cz>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/xkb/xkb.c b/xkb/xkb.c
index e7c9a31..3688bfc 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -1308,7 +1308,7 @@ XkbSizeVirtualModMap(XkbDescPtr xkb,xkbGetMapReply *rep)
 	rep->totalVModMapKeys= 0;
 	return 0;
     }
-    for (nRtrn=i=0;i<rep->nVModMapKeys-1;i++) {
+    for (nRtrn=i=0;i<rep->nVModMapKeys;i++) {
 	if (xkb->server->vmodmap[i+rep->firstVModMapKey]!=0)
 	    nRtrn++;
     }
@@ -1327,7 +1327,7 @@ unsigned short *	pMap;
 
     wire= (xkbVModMapWireDesc *)buf;
     pMap= &xkb->server->vmodmap[rep->firstVModMapKey];
-    for (i=0;i<rep->nVModMapKeys-1;i++,pMap++) {
+    for (i=0;i<rep->nVModMapKeys;i++,pMap++) {
 	if (*pMap!=0) {
 	    wire->key= i+rep->firstVModMapKey;
 	    wire->vmods= *pMap;
@@ -5668,7 +5668,7 @@ ProcXkbGetKbdByName(ClientPtr client)
 	    mrep.present = 0;
 	    mrep.totalSyms = mrep.totalActs =
 		mrep.totalKeyBehaviors= mrep.totalKeyExplicit= 
-		mrep.totalModMapKeys= 0;
+		mrep.totalModMapKeys= mrep.totalVModMapKeys= 0;
 	    if (rep.reported&(XkbGBN_TypesMask|XkbGBN_ClientSymbolsMask)) {
 		mrep.present|= XkbKeyTypesMask;
 		mrep.firstType = 0;
@@ -5694,6 +5694,8 @@ ProcXkbGetKbdByName(ClientPtr client)
 			mrep.firstKeyExplicit = new->min_key_code;
 		mrep.nKeyActs = mrep.nKeyBehaviors = 
 			mrep.nKeyExplicit = XkbNumKeys(new);
+		mrep.firstVModMapKey= new->min_key_code;
+		mrep.nVModMapKeys= XkbNumKeys(new);
 	    }
 	    else {
 		mrep.virtualMods= 0;
commit 79138eec1b49cbaca6a16f2bdd8579b5828aeb28
Author: Matthias Hopf <mhopf at suse.de>
Date:   Tue Mar 10 16:03:26 2009 +0100

    randr: Setting gamma: inverse logic looks more sane

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index 0ab2f3d..353b268 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -353,7 +353,7 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
     }
 
     /* Only upload when needed, to avoid unneeded delays. */
-    if (!crtc->active)
+    if (crtc->active)
 	crtc->funcs->gamma_set(crtc, crtc->gamma_red, crtc->gamma_green,
                                             crtc->gamma_blue, crtc->gamma_size);
 
commit c2785ae7eb6197bbfc75e92e99fffbb8ad8064da
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 20 14:29:13 2009 +1000

    dix: refuse events from disabled devices.
    
    If the device is disabled ("off"), it must not send events to a client.
    The driver shouldn't send events in that case anyway, but just to make sure
    we simply drop events coming while the device is disabled.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/getevents.c b/dix/getevents.c
index 30b2c69..2f61537 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -835,6 +835,10 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
     DeviceEvent *event;
     RawDeviceEvent *raw;
 
+    /* refuse events from disabled devices */
+    if (!pDev->enabled)
+        return 0;
+
     if (!events ||!pDev->key || !pDev->focus || !pDev->kbdfeed ||
        (type != KeyPress && type != KeyRelease) ||
        (key_code < 8 || key_code > 255))
@@ -997,6 +1001,10 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
         cx, cy; /* only screen coordinates */
     ScreenPtr scr = miPointerGetScreen(pDev);
 
+    /* refuse events from disabled devices */
+    if (!pDev->enabled)
+        return 0;
+
     ms = GetTimeInMillis(); /* before pointer update to help precision */
 
     if (!scr || !pDev->valuator || first_valuator < 0 ||
@@ -1096,6 +1104,10 @@ GetProximityEvents(EventList *events, DeviceIntPtr pDev, int type,
     int num_events = 1;
     DeviceEvent *event;
 
+    /* refuse events from disabled devices */
+    if (!pDev->enabled)
+        return 0;
+
     /* Sanity checks. */
     if (type != ProximityIn && type != ProximityOut)
         return 0;
commit 47a89b1cba67a43ddc225f7e1b5d2b3b217c8d93
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 20 13:59:22 2009 +1000

    Xi: remove DeviceIsPointerType
    
    This approach is broken anyway. DIPT only checked for the XInput type
    "MOUSE" and the only user of this is xf86ActivateDevice when it sets the
    Activate/DeactivateGrab functions.
    Since synaptics and wacom set their own types, evdev only sets MOUSE for,
    well, mice half the devices didn't have this set correctly anyway.
    
    Instead, ActivatePointerGrab should be merged together with
    ActivateKeyboardGrab.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/extinit.c b/Xi/extinit.c
index b828010..1f77729 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -1069,21 +1069,6 @@ IResetProc(ExtensionEntry * unused)
     RestoreExtensionEvents();
 }
 
-/*****************************************************************
- *
- * Returns TRUE if the device has some sort of pointer type.
- *
- */
-
-Bool
-DeviceIsPointerType(DeviceIntPtr dev)
-{
-    if (dev_type[1].type == dev->type)
-        return TRUE;
-
-    return FALSE;
-}
-
 
 /***********************************************************************
  *
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index aa98dad..6df0b8a 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -326,15 +326,8 @@ xf86ActivateDevice(LocalDevicePtr local)
         dev->isMaster = FALSE;
         dev->spriteInfo->spriteOwner = FALSE;
 
-        if (DeviceIsPointerType(dev))
-        {
-            dev->deviceGrab.ActivateGrab = ActivatePointerGrab;
-            dev->deviceGrab.DeactivateGrab = DeactivatePointerGrab;
-        } else 
-        {
-            dev->deviceGrab.ActivateGrab = ActivateKeyboardGrab;
-            dev->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab;
-        }
+        dev->deviceGrab.ActivateGrab = ActivateKeyboardGrab;
+        dev->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab;
 
         RegisterOtherDevice(dev);
         XkbSetExtension(dev, ProcessKeyboardEvent);
diff --git a/include/extinit.h b/include/extinit.h
index 340433a..0b36d3b 100644
--- a/include/extinit.h
+++ b/include/extinit.h
@@ -37,11 +37,6 @@ XInputExtensionInit(
 	void
 	);
 
-extern _X_EXPORT Bool
-DeviceIsPointerType(
-        DeviceIntPtr dev
-        );
-
 extern _X_EXPORT void
 AssignTypeAndName (
 	DeviceIntPtr           /* dev */,
commit 7b891e450f005688e41e61016e6d3e394c67f6be
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 20 14:23:16 2009 +1000

    dix: Remove obsolete comment
    
    CorePointerProc doesn't back up the device classes anymore.

diff --git a/dix/devices.c b/dix/devices.c
index bcb9058..ff91608 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -538,9 +538,6 @@ CoreKeyboardProc(DeviceIntPtr pDev, int what)
 
 /**
  * Device control function for the Virtual Core Pointer.
- *
- * Aside from initialisation, it backs up the original device classes into the
- * devicePrivates. This only needs to be done for master devices.
  */
 static int
 CorePointerProc(DeviceIntPtr pDev, int what)
commit 42719ce5c715ac3a0c74c3c7df872d35e0449de9
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 20 14:38:25 2009 +1000

    dix: remove superfluous loop in change_modmap.
    
    A device can only be attached to a single master device. So instead of
    looping and searching for the master device, we can just use dev->u.master
    directly.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/inpututils.c b/dix/inpututils.c
index c630088..1522145 100644
--- a/dix/inpututils.c
+++ b/dix/inpututils.c
@@ -275,14 +275,10 @@ change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *modkeymap,
                     do_modmap_change(client, tmp, modmap);
         }
     }
-    else {
-        for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
-            if (tmp->isMaster && tmp->u.lastSlave == dev) {
-                /* If this fails, expect the results to be weird. */
-                if (check_modmap_change(client, tmp, modmap))
-                    do_modmap_change(client, tmp, modmap);
-            }
-        }
+    else if (dev->u.master && dev->u.master->u.lastSlave == dev) {
+        /* If this fails, expect the results to be weird. */
+        if (check_modmap_change(client, dev->u.master, modmap))
+            do_modmap_change(client, dev->u.master, modmap);
     }
 
     return Success;
commit 22a33a7250f879b8f3eb84176a1dc57027d8cfe4
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Tue May 19 22:45:26 2009 -0400

    glx: Register names for the GLX resource types.
    
    Signed-off-by: Eamon Walsh <ewalsh at tycho.nsa.gov>

diff --git a/glx/glxext.c b/glx/glxext.c
index 6bc7bef..bdacf88 100644
--- a/glx/glxext.c
+++ b/glx/glxext.c
@@ -36,6 +36,7 @@
 #include "glxserver.h"
 #include <windowstr.h>
 #include <propertyst.h>
+#include <registry.h>
 #include "privates.h"
 #include <os.h>
 #include "g_disptab.h"
@@ -317,6 +318,10 @@ void GlxExtensionInit(void)
     __glXDrawableRes = CreateNewResourceType((DeleteType)DrawableGone);
     __glXSwapBarrierRes = CreateNewResourceType((DeleteType)SwapBarrierGone);
 
+    RegisterResourceName(__glXContextRes, "GLXContext");
+    RegisterResourceName(__glXDrawableRes, "GLXDrawable");
+    RegisterResourceName(__glXSwapBarrierRes, "GLXSwapBarrier");
+
     if (!dixRequestPrivate(glxClientPrivateKey, sizeof (__GLXclientState)))
 	return;
     if (!AddCallback (&ClientStateCallback, glxClientCallback, 0))
commit 77e90261d5f91e1170c6e02deb0e3739c24fcfd6
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Tue May 19 19:36:03 2009 -0400

    dix/events.c: Use wClient where appropriate.
    
    Signed-off-by: Eamon Walsh <ewalsh at tycho.nsa.gov>

diff --git a/dix/events.c b/dix/events.c
index b3caec8..fd93376 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3989,8 +3989,7 @@ CoreEnterLeaveEvent(
     if ((type == EnterNotify) && (mask & KeymapStateMask))
     {
         xKeymapEvent ke;
-        ClientPtr client = grab ? rClient(grab)
-            : clients[CLIENT_ID(pWin->drawable.id)];
+        ClientPtr client = grab ? rClient(grab) : wClient(pWin);
         if (XaceHook(XACE_DEVICE_ACCESS, client, keybd, DixReadAccess))
             bzero((char *)&ke.map[0], 31);
         else
@@ -4087,7 +4086,7 @@ CoreFocusEvent(DeviceIntPtr dev, int type, int mode, int detail, WindowPtr pWin)
             ((pWin->eventMask | wOtherEventMasks(pWin)) & KeymapStateMask))
     {
         xKeymapEvent ke;
-        ClientPtr client = clients[CLIENT_ID(pWin->drawable.id)];
+        ClientPtr client = wClient(pWin);
         if (XaceHook(XACE_DEVICE_ACCESS, client, dev, DixReadAccess))
             bzero((char *)&ke.map[0], 31);
         else
@@ -5181,7 +5180,7 @@ DeleteWindowFromAnyEvents(WindowPtr pWin, Bool freeResources)
                                    to None
                                  */
 #ifdef NOTDEF
-                                || clients[CLIENT_ID(parent->drawable.id)]->clientGone
+				 || wClient(parent)->clientGone
 #endif
                                 );
                         DoFocusEvents(keybd, pWin, parent, focusEventMode);
commit 3cea176d5abcb0f14eefbdcbe17fed0847524dd4
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Tue May 19 19:30:33 2009 -0400

    xace: Fix a bad device access hook call.
    
    Add a proper access mode, and reverse the logic of the return value.
    Zero ("Success") is returned on success from the hook calls.
    
    Signed-off-by: Eamon Walsh <ewalsh at tycho.nsa.gov>

diff --git a/dix/events.c b/dix/events.c
index 157f9a8..b3caec8 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4088,10 +4088,10 @@ CoreFocusEvent(DeviceIntPtr dev, int type, int mode, int detail, WindowPtr pWin)
     {
         xKeymapEvent ke;
         ClientPtr client = clients[CLIENT_ID(pWin->drawable.id)];
-        if (XaceHook(XACE_DEVICE_ACCESS, client, dev, FALSE))
-            memmove((char *)&ke.map[0], (char *)&dev->key->down[1], 31);
-        else
+        if (XaceHook(XACE_DEVICE_ACCESS, client, dev, DixReadAccess))
             bzero((char *)&ke.map[0], 31);
+        else
+            memmove((char *)&ke.map[0], (char *)&dev->key->down[1], 31);
 
         ke.type = KeymapNotify;
         DeliverEventsToWindow(dev, pWin, (xEvent *)&ke, 1,
commit 4addfcd633484b7f53b5df1b92bfca8bfc1dc48d
Author: Michel Dänzer <daenzer at vmware.com>
Date:   Mon May 18 17:53:35 2009 +0200

    EXA: Allocate from the end of free offscreen memory rather than from the start.
    
    This way we don't always need to scan over previously allocated areas when
    looking for an available one, and there might be less fragmentation.
    
    Signed-off-by: Michel Dänzer <daenzer at vmware.com>

diff --git a/exa/exa_offscreen.c b/exa/exa_offscreen.c
index 043fd83..eb53b2a 100644
--- a/exa/exa_offscreen.c
+++ b/exa/exa_offscreen.c
@@ -93,7 +93,7 @@ exaFindAreaToEvict(ExaScreenPrivPtr pExaScr, int size, int align)
 {
     ExaOffscreenArea *begin, *end, *best;
     unsigned cost, best_cost;
-    int avail, real_size, tmp;
+    int avail, real_size;
 
     best_cost = UINT_MAX;
     begin = end = pExaScr->info->offScreenAreas;
@@ -111,10 +111,7 @@ exaFindAreaToEvict(ExaScreenPrivPtr pExaScr, int size, int align)
 	    break;
 
 	/* adjust size needed to account for alignment loss for this area */
-	real_size = size;
-	tmp = begin->base_offset % align;
-	if (tmp)
-	    real_size += (align - tmp);
+	real_size = size + (begin->base_offset + begin->size - size) % align;
 
 	while (avail < real_size && end != NULL)
 	{
@@ -172,7 +169,7 @@ exaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
 {
     ExaOffscreenArea *area;
     ExaScreenPriv (pScreen);
-    int tmp, real_size = 0, free_total = 0, largest_avail = 0;
+    int real_size = 0, free_total = 0, largest_avail = 0;
 #if DEBUG_OFFSCREEN
     static int number = 0;
     ErrorF("================= ============ allocating a new pixmap %d\n", ++number);
@@ -205,10 +202,7 @@ exaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
 	    continue;
 
 	/* adjust size to match alignment requirement */
-	real_size = size;
-	tmp = area->base_offset % align;
-	if (tmp)
-	    real_size += (align - tmp);
+	real_size = size + (area->base_offset + area->size - size) % align;
 
 	/* does it fit? */
 	if (real_size <= area->size)
@@ -232,10 +226,7 @@ exaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
 
 	    if (area) {
 		/* adjust size to match alignment requirement */
-		real_size = size;
-		tmp = area->base_offset % align;
-		if (tmp)
-		    real_size += (align - tmp);
+		real_size = size + (area->base_offset + area->size - size) % align;
 
 		/* does it fit? */
 		if (real_size > area->size)
@@ -257,10 +248,7 @@ exaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
 	}
 
 	/* adjust size needed to account for alignment loss for this area */
-	real_size = size;
-	tmp = area->base_offset % align;
-	if (tmp)
-	    real_size += (align - tmp);
+	real_size = size + (area->base_offset + area->size - size) % align;
 
 	/*
 	 * Kick out first area if in use
@@ -283,13 +271,7 @@ exaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
 	ExaOffscreenArea   *new_area = xalloc (sizeof (ExaOffscreenArea));
 	if (!new_area)
 	    return NULL;
-	new_area->base_offset = area->base_offset + real_size;
-
-#if DEBUG_OFFSCREEN
-	if (new_area->base_offset >= pExaScr->info->memorySize)
-	    ErrorF("new_area->base_offset = 0x%08x >= memorySize!\n",
-		   new_area->base_offset);
-#endif
+	new_area->base_offset = area->base_offset;
 
 	new_area->offset = new_area->base_offset;
 	new_area->align = 0;
@@ -298,13 +280,14 @@ exaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
 	new_area->save = NULL;
 	new_area->last_use = 0;
 	new_area->eviction_cost = 0;
-	new_area->next = area->next;
-	if (area->next)
-	    area->next->prev = new_area;
+	new_area->next = area;
+	new_area->prev = area->prev;
+	if (area->prev->next)
+	    area->prev->next = new_area;
 	else
-	    pExaScr->info->offScreenAreas->prev = new_area;
-	area->next = new_area;
-	new_area->prev = area;
+	    pExaScr->info->offScreenAreas = new_area;
+	area->prev = new_area;
+	area->base_offset = new_area->base_offset + new_area->size;
 	area->size = real_size;
     } else
 	pExaScr->numOffscreenAvailable--;
commit 510cbd43cd4e34bd459e8f74ab2855714b4ca95d
Author: Michel Dänzer <daenzer at vmware.com>
Date:   Mon May 18 17:48:57 2009 +0200

    EXA: Defragment offscreen memory.
    
    At most once per second, under the following circumstances:
    
    * We can't satisfy an offscreen memory allocation, but there seems to be enough
      offscreen memory available in total.
    
    or
    
    * The server has been idle for at least 100ms, and there is more than one
      available offscreen area.
    
    Signed-off-by: Michel Dänzer <daenzer at vmware.com>

diff --git a/exa/exa.c b/exa/exa.c
index 2de348a..089350b 100644
--- a/exa/exa.c
+++ b/exa/exa.c
@@ -1048,6 +1048,50 @@ exaCreateScreenResources(ScreenPtr pScreen)
     return TRUE;
 }
 
+static void
+ExaBlockHandler(int screenNum, pointer blockData, pointer pTimeout,
+		pointer pReadmask)
+{
+    ScreenPtr pScreen = screenInfo.screens[screenNum];
+    ExaScreenPriv(pScreen);
+
+    unwrap(pExaScr, pScreen, BlockHandler);
+    (*pScreen->BlockHandler) (screenNum, blockData, pTimeout, pReadmask);
+    wrap(pExaScr, pScreen, BlockHandler, ExaBlockHandler);
+
+    /* Try and keep the offscreen memory area tidy every now and then (at most 
+     * once per second) when the server has been idle for at least 100ms.
+     */
+    if (pExaScr->numOffscreenAvailable > 1) {
+	CARD32 now = GetTimeInMillis();
+
+	pExaScr->nextDefragment = now +
+	    max(100, (INT32)(pExaScr->lastDefragment + 1000 - now));
+	AdjustWaitForDelay(pTimeout, pExaScr->nextDefragment - now);
+    }
+}
+
+static void
+ExaWakeupHandler(int screenNum, pointer wakeupData, unsigned long result,
+		 pointer pReadmask)
+{
+    ScreenPtr pScreen = screenInfo.screens[screenNum];
+    ExaScreenPriv(pScreen);
+
+    unwrap(pExaScr, pScreen, WakeupHandler);
+    (*pScreen->WakeupHandler) (screenNum, wakeupData, result, pReadmask);
+    wrap(pExaScr, pScreen, WakeupHandler, ExaWakeupHandler);
+
+    if (result == 0 && pExaScr->numOffscreenAvailable > 1) {
+	CARD32 now = GetTimeInMillis();
+
+	if ((int)(now - pExaScr->nextDefragment) > 0) {
+	    ExaOffscreenDefragment(pScreen);
+	    pExaScr->lastDefragment = now;
+	}
+    }
+}
+
 /**
  * exaCloseScreen() unwraps its wrapped screen functions and tears down EXA's
  * screen private, before calling down to the next CloseSccreen.
@@ -1063,6 +1107,10 @@ exaCloseScreen(int i, ScreenPtr pScreen)
     if (ps->Glyphs == exaGlyphs)
 	exaGlyphsFini(pScreen);
 
+    if (pScreen->BlockHandler == ExaBlockHandler)
+	unwrap(pExaScr, pScreen, BlockHandler);
+    if (pScreen->WakeupHandler == ExaWakeupHandler)
+	unwrap(pExaScr, pScreen, WakeupHandler);
     unwrap(pExaScr, pScreen, CreateGC);
     unwrap(pExaScr, pScreen, CloseScreen);
     unwrap(pExaScr, pScreen, GetImage);
@@ -1223,6 +1271,11 @@ exaDriverInit (ScreenPtr		pScreen,
     /*
      * Replace various fb screen functions
      */
+    if ((pExaScr->info->flags & EXA_OFFSCREEN_PIXMAPS) &&
+	!(pExaScr->info->flags & EXA_HANDLES_PIXMAPS)) {
+	wrap(pExaScr, pScreen, BlockHandler, ExaBlockHandler);
+	wrap(pExaScr, pScreen, WakeupHandler, ExaWakeupHandler);
+    }
     wrap(pExaScr, pScreen, CreateGC, exaCreateGC);
     wrap(pExaScr, pScreen, CloseScreen, exaCloseScreen);
     wrap(pExaScr, pScreen, GetImage, exaGetImage);
diff --git a/exa/exa.h b/exa/exa.h
index 3e1f1c7..0701ec9 100644
--- a/exa/exa.h
+++ b/exa/exa.h
@@ -66,6 +66,9 @@ struct _ExaOffscreenArea {
     ExaOffscreenArea    *next;
 
     unsigned            eviction_cost;
+
+    ExaOffscreenArea    *prev;          /* Double-linked list for defragmentation */
+    int                 align;          /* required alignment */
 };
 
 /**
@@ -744,6 +747,16 @@ typedef struct _ExaDriver {
  */
 #define EXA_SUPPORTS_PREPARE_AUX        (1 << 4)
 
+/**
+ * EXA_SUPPORTS_OFFSCREEN_OVERLAPS indicates to EXA that the driver Copy hooks
+ * can handle the source and destination occupying overlapping offscreen memory
+ * areas. This allows the offscreen memory defragmentation code to defragment
+ * areas where the defragmented position overlaps the fragmented position.
+ *
+ * Typically this is supported by traditional 2D engines but not by 3D engines.
+ */
+#define EXA_SUPPORTS_OFFSCREEN_OVERLAPS (1 << 5)
+
 /** @} */
 
 /* in exa.c */
diff --git a/exa/exa_offscreen.c b/exa/exa_offscreen.c
index d7198cb..043fd83 100644
--- a/exa/exa_offscreen.c
+++ b/exa/exa_offscreen.c
@@ -172,7 +172,7 @@ exaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
 {
     ExaOffscreenArea *area;
     ExaScreenPriv (pScreen);
-    int tmp, real_size = 0;
+    int tmp, real_size = 0, free_total = 0, largest_avail = 0;
 #if DEBUG_OFFSCREEN
     static int number = 0;
     ErrorF("================= ============ allocating a new pixmap %d\n", ++number);
@@ -213,6 +213,35 @@ exaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
 	/* does it fit? */
 	if (real_size <= area->size)
 	    break;
+
+	free_total += area->size;
+
+	if (area->size > largest_avail)
+	    largest_avail = area->size;
+    }
+
+    if (!area && free_total >= size) {
+	CARD32 now = GetTimeInMillis();
+
+	/* Don't defragment more than once per second, to avoid adding more
+	 * overhead than we're trying to prevent
+	 */
+	if (abs((INT32) (now - pExaScr->lastDefragment)) > 1000) {
+	    area = ExaOffscreenDefragment(pScreen);
+	    pExaScr->lastDefragment = now;
+
+	    if (area) {
+		/* adjust size to match alignment requirement */
+		real_size = size;
+		tmp = area->base_offset % align;
+		if (tmp)
+		    real_size += (align - tmp);
+
+		/* does it fit? */
+		if (real_size > area->size)
+		    area = NULL;
+	    }
+	}
     }
 
     if (!area)
@@ -255,16 +284,31 @@ exaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
 	if (!new_area)
 	    return NULL;
 	new_area->base_offset = area->base_offset + real_size;
+
+#if DEBUG_OFFSCREEN
+	if (new_area->base_offset >= pExaScr->info->memorySize)
+	    ErrorF("new_area->base_offset = 0x%08x >= memorySize!\n",
+		   new_area->base_offset);
+#endif
+
 	new_area->offset = new_area->base_offset;
+	new_area->align = 0;
 	new_area->size = area->size - real_size;
 	new_area->state = ExaOffscreenAvail;
 	new_area->save = NULL;
 	new_area->last_use = 0;
 	new_area->eviction_cost = 0;
 	new_area->next = area->next;
+	if (area->next)
+	    area->next->prev = new_area;
+	else
+	    pExaScr->info->offScreenAreas->prev = new_area;
 	area->next = new_area;
+	new_area->prev = area;
 	area->size = real_size;
-    }
+    } else
+	pExaScr->numOffscreenAvailable--;
+
     /*
      * Mark this area as in use
      */
@@ -277,6 +321,7 @@ exaOffscreenAlloc (ScreenPtr pScreen, int size, int align,
     area->last_use = pExaScr->offScreenCounter++;
     area->offset = (area->base_offset + align - 1);
     area->offset -= area->offset % align;
+    area->align = align;
 
     ExaOffscreenValidate (pScreen);
 
@@ -391,7 +436,7 @@ exaEnableDisableFBAccess (int index, Bool enable)
 
 /* merge the next free area into this one */
 static void
-ExaOffscreenMerge (ExaOffscreenArea *area)
+ExaOffscreenMerge (ExaScreenPrivPtr pExaScr, ExaOffscreenArea *area)
 {
     ExaOffscreenArea	*next = area->next;
 
@@ -399,7 +444,13 @@ ExaOffscreenMerge (ExaOffscreenArea *area)
     area->size += next->size;
     /* frob pointer */
     area->next = next->next;
+    if (area->next)
+	area->next->prev = area;
+    else
+	pExaScr->info->offScreenAreas->prev = area;
     xfree (next);
+
+    pExaScr->numOffscreenAvailable--;
 }
 
 /**
@@ -436,19 +487,19 @@ exaOffscreenFree (ScreenPtr pScreen, ExaOffscreenArea *area)
     if (area == pExaScr->info->offScreenAreas)
 	prev = NULL;
     else
-	for (prev = pExaScr->info->offScreenAreas; prev; prev = prev->next)
-	    if (prev->next == area)
-		break;
+	prev = area->prev;
+
+    pExaScr->numOffscreenAvailable++;
 
     /* link with next area if free */
     if (next && next->state == ExaOffscreenAvail)
-	ExaOffscreenMerge (area);
+	ExaOffscreenMerge (pExaScr, area);
 
     /* link with prev area if free */
     if (prev && prev->state == ExaOffscreenAvail)
     {
 	area = prev;
-	ExaOffscreenMerge (area);
+	ExaOffscreenMerge (pExaScr, area);
     }
 
     ExaOffscreenValidate (pScreen);
@@ -469,6 +520,167 @@ ExaOffscreenMarkUsed (PixmapPtr pPixmap)
 }
 
 /**
+ * Defragment offscreen memory by compacting allocated areas at the end of it,
+ * leaving the total amount of memory available as a single area at the
+ * beginning (when there are no pinned allocations).
+ */
+_X_HIDDEN ExaOffscreenArea*
+ExaOffscreenDefragment (ScreenPtr pScreen)
+{
+    ExaScreenPriv (pScreen);
+    ExaOffscreenArea *area, *largest_available = NULL;
+    int largest_size = 0;
+    PixmapPtr pDstPix;
+    ExaPixmapPrivPtr pExaDstPix;
+
+    pDstPix = (*pScreen->CreatePixmap) (pScreen, 0, 0, 0, 0);
+
+    if (!pDstPix)
+	return NULL;
+
+    pExaDstPix = ExaGetPixmapPriv (pDstPix);
+    pExaDstPix->offscreen = TRUE;
+
+    for (area = pExaScr->info->offScreenAreas->prev;
+	 area != pExaScr->info->offScreenAreas;
+	 )
+    {
+	ExaOffscreenArea *prev = area->prev;
+	PixmapPtr pSrcPix;
+	ExaPixmapPrivPtr pExaSrcPix;
+	Bool save_offscreen;
+	int save_pitch;
+
+	if (area->state != ExaOffscreenAvail ||
+	    prev->state == ExaOffscreenLocked ||
+	    (prev->state == ExaOffscreenRemovable &&
+	     prev->save != exaPixmapSave)) {
+	    area = prev;
+	    continue;
+	}
+
+	if (prev->state == ExaOffscreenAvail) {
+	    if (area == largest_available) {
+		largest_available = prev;
+		largest_size += prev->size;
+	    }
+	    area = prev;
+	    ExaOffscreenMerge (pExaScr, area);
+	    continue;
+	}
+
+	if (area->size > largest_size) {
+	    largest_available = area;
+	    largest_size = area->size;
+	}
+
+	pSrcPix = prev->privData;
+	pExaSrcPix = ExaGetPixmapPriv (pSrcPix);
+
+	pExaDstPix->fb_ptr = pExaScr->info->memoryBase +
+	    area->base_offset + area->size - prev->size + prev->base_offset -
+	    prev->offset;
+	pExaDstPix->fb_ptr -= (unsigned long)pExaDstPix->fb_ptr % prev->align;
+
+	if (pExaDstPix->fb_ptr <= pExaSrcPix->fb_ptr) {
+	    area = prev;
+	    continue;
+	}
+
+	if (!(pExaScr->info->flags & EXA_SUPPORTS_OFFSCREEN_OVERLAPS) &&
+	    (pExaSrcPix->fb_ptr + prev->size) > pExaDstPix->fb_ptr) {
+	    area = prev;
+	    continue;
+	}
+
+	save_offscreen = pExaSrcPix->offscreen;
+	save_pitch = pSrcPix->devKind;
+
+	pExaSrcPix->offscreen = TRUE;
+	pSrcPix->devKind = pExaSrcPix->fb_pitch;
+
+	pDstPix->drawable.width = pSrcPix->drawable.width;
+	pDstPix->devKind = pSrcPix->devKind;
+	pDstPix->drawable.height = pSrcPix->drawable.height;
+	pDstPix->drawable.depth = pSrcPix->drawable.depth;
+	pDstPix->drawable.bitsPerPixel = pSrcPix->drawable.bitsPerPixel;
+
+	if (!pExaScr->info->PrepareCopy (pSrcPix, pDstPix, -1, -1, GXcopy, ~0)) {
+	    pExaSrcPix->offscreen = save_offscreen;
+	    pSrcPix->devKind = save_pitch;
+	    area = prev;
+	    continue;
+	}
+
+	pExaScr->info->Copy (pDstPix, 0, 0, 0, 0, pDstPix->drawable.width,
+			     pDstPix->drawable.height);
+	pExaScr->info->DoneCopy (pDstPix);
+	exaMarkSync (pScreen);
+
+	DBG_OFFSCREEN(("Before swap: prev=0x%08x-0x%08x-0x%08x area=0x%08x-0x%08x-0x%08x\n",
+		       prev->base_offset, prev->offset, prev->base_offset + prev->size,
+		       area->base_offset, area->offset, area->base_offset + area->size));
+
+	/* Calculate swapped area offsets and sizes */
+	area->base_offset = prev->base_offset;
+	area->offset = area->base_offset;
+	prev->offset += pExaDstPix->fb_ptr - pExaSrcPix->fb_ptr;
+	assert(prev->offset >= pExaScr->info->offScreenBase &&
+	       prev->offset < pExaScr->info->memorySize);
+	prev->base_offset = prev->offset;
+	if (area->next)
+	    prev->size = area->next->base_offset - prev->base_offset;
+	else
+	    prev->size = pExaScr->info->memorySize - prev->base_offset;
+	area->size = prev->base_offset - area->base_offset;
+
+	DBG_OFFSCREEN(("After swap: area=0x%08x-0x%08x-0x%08x prev=0x%08x-0x%08x-0x%08x\n",
+		       area->base_offset, area->offset, area->base_offset + area->size,
+		       prev->base_offset, prev->offset, prev->base_offset + prev->size));
+
+	/* Swap areas in list */
+	if (area->next)
+	    area->next->prev = prev;
+	else
+	    pExaScr->info->offScreenAreas->prev = prev;
+	if (prev->prev->next)
+	    prev->prev->next = area;
+	else
+	    pExaScr->info->offScreenAreas = area;
+	prev->next = area->next;
+	area->next = prev;
+	area->prev = prev->prev;
+	prev->prev = area;
+	if (!area->prev->next)
+	    pExaScr->info->offScreenAreas = area;
+
+#if DEBUG_OFFSCREEN
+	if (prev->prev == prev || prev->next == prev)
+	    ErrorF("Whoops, prev points to itself!\n");
+
+	if (area->prev == area || area->next == area)
+	    ErrorF("Whoops, area points to itself!\n");
+#endif
+
+	pExaSrcPix->fb_ptr = pExaDstPix->fb_ptr;
+	pExaSrcPix->offscreen = save_offscreen;
+	pSrcPix->devKind = save_pitch;
+    }
+
+    pDstPix->drawable.width = 0;
+    pDstPix->drawable.height = 0;
+    pDstPix->drawable.depth = 0;
+    pDstPix->drawable.bitsPerPixel = 0;
+
+    (*pScreen->DestroyPixmap) (pDstPix);
+
+    if (area->state == ExaOffscreenAvail && area->size > largest_size)
+	return area;
+
+    return largest_available;
+}
+
+/**
  * exaOffscreenInit initializes the offscreen memory manager.
  *
  * @param pScreen current screen
@@ -491,15 +703,18 @@ exaOffscreenInit (ScreenPtr pScreen)
     area->state = ExaOffscreenAvail;
     area->base_offset = pExaScr->info->offScreenBase;
     area->offset = area->base_offset;
+    area->align = 0;
     area->size = pExaScr->info->memorySize - area->base_offset;
     area->save = NULL;
     area->next = NULL;
+    area->prev = area;
     area->last_use = 0;
     area->eviction_cost = 0;
 
     /* Add it to the free areas */
     pExaScr->info->offScreenAreas = area;
     pExaScr->offScreenCounter = 1;
+    pExaScr->numOffscreenAvailable = 1;
 
     ExaOffscreenValidate (pScreen);
 
diff --git a/exa/exa_priv.h b/exa/exa_priv.h
index 874e7e9..b3df1a5 100644
--- a/exa/exa_priv.h
+++ b/exa/exa_priv.h
@@ -145,6 +145,8 @@ typedef struct {
 typedef void (*EnableDisableFBAccessProcPtr)(int, Bool);
 typedef struct {
     ExaDriverPtr info;
+    ScreenBlockHandlerProcPtr	 SavedBlockHandler;
+    ScreenWakeupHandlerProcPtr	 SavedWakeupHandler;
     CreateGCProcPtr 		 SavedCreateGC;
     CloseScreenProcPtr 		 SavedCloseScreen;
     GetImageProcPtr 		 SavedGetImage;
@@ -170,6 +172,9 @@ typedef struct {
     unsigned			 disableFbCount;
     Bool			 optimize_migration;
     unsigned			 offScreenCounter;
+    unsigned			 numOffscreenAvailable;
+    CARD32			 lastDefragment;
+    CARD32			 nextDefragment;
 
     /* Store all accessed pixmaps, so we can check for duplicates. */
     PixmapPtr prepare_access[6];
@@ -460,6 +465,9 @@ ExaOffscreenSwapOut (ScreenPtr pScreen);
 void
 ExaOffscreenSwapIn (ScreenPtr pScreen);
 
+ExaOffscreenArea*
+ExaOffscreenDefragment (ScreenPtr pScreen);
+
 Bool
 exaOffscreenInit(ScreenPtr pScreen);
 
commit 8331bde0adeccefb275c4d707e7b2cb1d95b1581
Author: Jon TURNEY <jon.turney at dronecode.org.uk>
Date:   Fri May 15 21:36:28 2009 +0100

    Cygwin/X: link with libmain.a to provide main()
    
    Commit 987579c930bda803427a28cb82773c389f5110d6 moves main.c into
    into libmain.a to be linked with separately, and updates the various
    DDXs to link with libmain.a, except Xwin, which also needs this change.
    
    Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>

diff --git a/hw/xwin/Makefile.am b/hw/xwin/Makefile.am
index 504c2a6..4f95130 100644
--- a/hw/xwin/Makefile.am
+++ b/hw/xwin/Makefile.am
@@ -147,7 +147,7 @@ XWin_SOURCES = $(SRCS)
 INCLUDES = -I$(top_srcdir)/miext/rootless
 
 XWin_DEPENDENCIES = $(XWIN_LIBS)
-XWin_LDADD = $(XWIN_LIBS) $(XSERVER_LIBS) $(XSERVER_SYS_LIBS) $(XWIN_SYS_LIBS)
+XWin_LDADD = $(XWIN_LIBS) $(MAIN_LIB) $(XSERVER_LIBS) $(XSERVER_SYS_LIBS) $(XWIN_SYS_LIBS)
 
 .rc.o:
 	$(WINDRES) --use-temp-file -i $< --input-format=rc -o $@ -O coff -DPROJECT_NAME=\"$(VENDOR_NAME_SHORT)\"
commit b89dcfbfbd38f8d19f1d4f24f81820b1048572c8
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon May 18 16:07:08 2009 +1000

    Xi: fix length field in XIQueryPointer.
    
    Buttons append 4-byte units to the end of the reply, they need to be
    included too.
    
    Reported-by: Mark Dokter
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/querydp.c b/Xi/querydp.c
index 2925dde..2e2cfaa 100644
--- a/Xi/querydp.c
+++ b/Xi/querydp.c
@@ -127,6 +127,7 @@ ProcXIQueryPointer(ClientPtr client)
     {
         int i, down;
         rep.buttons_len = ((pDev->button->numButtons/8) + 3)/4;
+        rep.length += rep.buttons_len;
         buttons = xcalloc(rep.buttons_len, 4);
         if (!buttons)
             return BadAlloc;
commit 33fcaaaea5ea30be39156ecfdbcca891b47ab465
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon May 18 16:05:35 2009 +1000

    Fix missing parentheses in FP1616 macro.
    
    Missing parens led to interesting results if an expression instead of a
    constant was passed in (ProcXIQueryPointer for example).

diff --git a/include/eventconvert.h b/include/eventconvert.h
index dc3fd73..277a6c4 100644
--- a/include/eventconvert.h
+++ b/include/eventconvert.h
@@ -28,7 +28,7 @@
 #include "input.h"
 #include "events.h"
 
-#define FP1616(integral, frac) (integral * (1 << 16) + frac * (1 << 16))
+#define FP1616(integral, frac) ((integral) * (1 << 16) + (frac) * (1 << 16))
 
 _X_INTERNAL int EventToCore(InternalEvent *event, xEvent *core);
 _X_INTERNAL int EventToXI(InternalEvent *ev, xEvent **xi, int *count);
commit 6258bb1d6bb78ea4ba1d33470bc74e9b711b25f2
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 15 20:24:45 2009 +1000

    require inputproto 1.9.99.9

diff --git a/configure.ac b/configure.ac
index 98f9332..6c03951 100644
--- a/configure.ac
+++ b/configure.ac
@@ -700,7 +700,7 @@ XEXT_LIB='$(top_builddir)/Xext/libXext.la'
 XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
 
 dnl Core modules for most extensions, et al.
-REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.9.3] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.8] [kbproto >= 1.0.3]"
+REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.9.3] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.9] [kbproto >= 1.0.3]"
 REQUIRED_LIBS="xfont xau fontenc [pixman-1 >= 0.13.2]"
 
 dnl HAVE_DBUS is true if we actually have the D-Bus library, whereas
commit e7e94ff5fd3205a9ee01fe9342d9f3a426b0a068
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu May 14 21:45:35 2009 +1000

    Xi: set the right length for the XIQueryPointer reply.

diff --git a/Xi/querydp.c b/Xi/querydp.c
index d7df733..2925dde 100644
--- a/Xi/querydp.c
+++ b/Xi/querydp.c
@@ -107,7 +107,7 @@ ProcXIQueryPointer(ClientPtr client)
     pSprite = pDev->spriteInfo->sprite;
     rep.repType = X_Reply;
     rep.RepType = X_XIQueryPointer;
-    rep.length = 0;
+    rep.length = 5;
     rep.sequenceNumber = client->sequence;
     rep.root = (GetCurrentRootWindow(pDev))->drawable.id;
     rep.root_x = FP1616(pSprite->hot.x, 0);
commit 00ab04d73c612ac85e024105015bdb7c79e8874b
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu May 14 16:24:35 2009 +1000

    Include full modifier + button state in XIQueryPointer.

diff --git a/Xi/querydp.c b/Xi/querydp.c
index dee00fe..d7df733 100644
--- a/Xi/querydp.c
+++ b/Xi/querydp.c
@@ -75,6 +75,8 @@ ProcXIQueryPointer(ClientPtr client)
     DeviceIntPtr pDev, kbd;
     WindowPtr pWin, t;
     SpritePtr pSprite;
+    XkbStatePtr state;
+    char *buttons = NULL;
 
     REQUEST(xXIQueryPointerReq);
     REQUEST_SIZE_MATCH(xXIQueryPointerReq);
@@ -107,14 +109,40 @@ ProcXIQueryPointer(ClientPtr client)
     rep.RepType = X_XIQueryPointer;
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
-    rep.mask = pDev->button->state;
-    if (kbd && kbd->key)
-        rep.mask |= XkbStateFieldFromRec(&kbd->key->xkbInfo->state);
     rep.root = (GetCurrentRootWindow(pDev))->drawable.id;
     rep.root_x = FP1616(pSprite->hot.x, 0);
     rep.root_y = FP1616(pSprite->hot.y, 0);
     rep.child = None;
-    rep.deviceid = pDev->id;
+
+    state = &kbd->key->xkbInfo->prev_state;
+    rep.mods.base_mods = state->base_mods;
+    rep.mods.latched_mods = state->latched_mods;
+    rep.mods.locked_mods = state->locked_mods;
+
+    rep.group.base_group = state->base_group;
+    rep.group.latched_group = state->latched_group;
+    rep.group.locked_group = state->locked_group;
+
+    if (pDev->button)
+    {
+        int i, down;
+        rep.buttons_len = ((pDev->button->numButtons/8) + 3)/4;
+        buttons = xcalloc(rep.buttons_len, 4);
+        if (!buttons)
+            return BadAlloc;
+
+        down = pDev->button->buttonsDown;
+
+        for (i = 0; i < pDev->button->numButtons && down; i++)
+        {
+            if (BitIsOn(pDev->button->down, i))
+            {
+                SetBit(buttons, i);
+                down--;
+            }
+        }
+    } else
+        rep.buttons_len = 0;
 
     if (pSprite->hot.pScreen == pWin->drawable.pScreen)
     {
@@ -147,6 +175,11 @@ ProcXIQueryPointer(ClientPtr client)
 #endif
 
     WriteReplyToClient(client, sizeof(xXIQueryPointerReply), &rep);
+    if (buttons)
+        WriteToClient(client, rep.buttons_len * 4, buttons);
+
+    xfree(buttons);
+
     return Success;
 }
 
commit de78aab0ea3a2d8c61222493f25911258dea65a2
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu May 14 15:53:00 2009 +1000

    Xi: take the paired device as modifier device only for MD pointers.

diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index 2b77d18..d2dabba 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -157,7 +157,7 @@ ProcXIPassiveGrabDevice(ClientPtr client)
     if (!modifiers_failed)
         return BadAlloc;
 
-    if (dev->isMaster)
+    if (IsPointerDevice(dev) && dev->isMaster)
         mod_dev = GetPairedDevice(dev);
     else
         mod_dev = dev;
commit 0e089f9ceb0edec532078c6e1df7f642f7220fb5
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu May 14 15:29:20 2009 +1000

    Xi: check cursor and grab_window before attempting the passive grab.
    
    Both values need to fail the request, so we need to check them before
    looping through the modifier masks. Otherwise, a wrong grab_window will
    show up in each failed modifier return but not actually cause an error.

diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index 1ba534a..2b77d18 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -85,6 +85,7 @@ ProcXIPassiveGrabDevice(ClientPtr client)
     xXIGrabModifierInfo *modifiers_failed;
     GrabMask mask;
     GrabParameters param;
+    void *tmp;
 
     REQUEST(xXIPassiveGrabDeviceReq);
     REQUEST_AT_LEAST_SIZE(xXIPassiveGrabDeviceReq);
@@ -134,6 +135,23 @@ ProcXIPassiveGrabDevice(ClientPtr client)
     param.grabWindow = stuff->grab_window;
     param.cursor = stuff->cursor;
 
+    if (stuff->cursor != None)
+    {
+        status = dixLookupResourceByType(&tmp, stuff->cursor,
+                                         RT_CURSOR, client, DixUseAccess);
+	if (status != Success)
+	{
+	    client->errorValue = stuff->cursor;
+	    return (status == BadValue) ? BadCursor : status;
+	}
+    }
+
+    status = dixLookupWindow((WindowPtr*)&tmp, stuff->grab_window, client, DixSetAttrAccess);
+    if (status != Success)
+	return status;
+
+    status = CheckGrabValues(client, &param);
+
     modifiers = (uint32_t*)&stuff[1] + stuff->mask_len;
     modifiers_failed = xcalloc(stuff->num_modifiers, sizeof(xXIGrabModifierInfo));
     if (!modifiers_failed)
commit 5c3e7289801c958e2c70e2629d3ebee122449be8
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 13 16:54:01 2009 +1000

    dix: count must be 1 if we have an XI2 match.
    
    This fixes events that activated a grab not getting delivered to the client.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/events.c b/dix/events.c
index e1410ed..10814fa 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3420,6 +3420,7 @@ CheckPassiveGrabsOnWindow(
                            "(%d, %d).\n", device->name, event->type, rc);
                     continue;
                 }
+                count = 1;
             } else
             {
                 rc = EventToXI((InternalEvent*)event, &xE, &count);
commit e083a0d0692baa5ad29002a38293b36dd3b4c06f
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 13 15:23:42 2009 +1000

    Xi: set the correct length for XIPassiveGrab replies.

diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index 0a6f0e5..1ba534a 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -166,6 +166,7 @@ ProcXIPassiveGrabDevice(ClientPtr client)
             info->status = status;
             info->modifiers = *modifiers;
             rep.num_modifiers++;
+            rep.length++;
         }
     }
 
commit 8ff1bff8f462b15e05fc298704e1e40cb244587f
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue May 12 21:33:54 2009 +1000

    Update to new XI2 names

diff --git a/Xi/chdevcur.c b/Xi/chdevcur.c
index ed1570b..0315edb 100644
--- a/Xi/chdevcur.c
+++ b/Xi/chdevcur.c
@@ -54,25 +54,25 @@
  */
 
 int
-SProcXIChangeDeviceCursor(ClientPtr client)
+SProcXIChangeCursor(ClientPtr client)
 {
     char n;
 
-    REQUEST(xXIChangeDeviceCursorReq);
+    REQUEST(xXIChangeCursorReq);
     swaps(&stuff->length, n);
-    REQUEST_SIZE_MATCH(xXIChangeDeviceCursorReq);
-    return (ProcXIChangeDeviceCursor(client));
+    REQUEST_SIZE_MATCH(xXIChangeCursorReq);
+    return (ProcXIChangeCursor(client));
 }
 
-int ProcXIChangeDeviceCursor(ClientPtr client)
+int ProcXIChangeCursor(ClientPtr client)
 {
     int rc;
     WindowPtr pWin    = NULL;
     DeviceIntPtr pDev = NULL;
     CursorPtr pCursor = NULL;
 
-    REQUEST(xXIChangeDeviceCursorReq);
-    REQUEST_SIZE_MATCH(xXIChangeDeviceCursorReq);
+    REQUEST(xXIChangeCursorReq);
+    REQUEST_SIZE_MATCH(xXIChangeCursorReq);
 
     rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixSetAttrAccess);
     if (rc != Success)
diff --git a/Xi/chdevcur.h b/Xi/chdevcur.h
index 4f7f44b..dc6ccb1 100644
--- a/Xi/chdevcur.h
+++ b/Xi/chdevcur.h
@@ -30,7 +30,7 @@
 #ifndef CHDEVCUR_H
 #define CHDEVCUR_H 1
 
-int SProcXIChangeDeviceCursor(ClientPtr	/* client */);
-int ProcXIChangeDeviceCursor(ClientPtr	/* client */);
+int SProcXIChangeCursor(ClientPtr /* client */);
+int ProcXIChangeCursor(ClientPtr /* client */);
 
 #endif /* CHDEVCUR_H */
diff --git a/Xi/chdevhier.c b/Xi/chdevhier.c
index ae5377d..e59bfab 100644
--- a/Xi/chdevhier.c
+++ b/Xi/chdevhier.c
@@ -61,7 +61,7 @@ extern DevPrivateKey XTstDevicePrivateKey;
  */
 void XISendDeviceHierarchyEvent(int flags[MAXDEVICES])
 {
-    xXIDeviceHierarchyEvent *ev;
+    xXIHierarchyEvent *ev;
     xXIHierarchyInfo *info;
     DeviceIntRec dummyDev;
     DeviceIntPtr dev;
@@ -70,7 +70,7 @@ void XISendDeviceHierarchyEvent(int flags[MAXDEVICES])
     if (!flags)
         return;
 
-    ev = xcalloc(1, sizeof(xXIDeviceHierarchyEvent) +
+    ev = xcalloc(1, sizeof(xXIHierarchyEvent) +
                  MAXDEVICES * sizeof(xXIHierarchyInfo));
     ev->type = GenericEvent;
     ev->extension = IReqCode;
@@ -128,29 +128,29 @@ void XISendDeviceHierarchyEvent(int flags[MAXDEVICES])
  *
  */
 
-int SProcXIChangeDeviceHierarchy(ClientPtr client)
+int SProcXIChangeHierarchy(ClientPtr client)
 {
     char n;
 
-    REQUEST(xXIChangeDeviceHierarchyReq);
+    REQUEST(xXIChangeHierarchyReq);
     swaps(&stuff->length, n);
-    return (ProcXIChangeDeviceHierarchy(client));
+    return (ProcXIChangeHierarchy(client));
 }
 
 #define SWAPIF(cmd) if (client->swapped) { cmd; }
 
 int
-ProcXIChangeDeviceHierarchy(ClientPtr client)
+ProcXIChangeHierarchy(ClientPtr client)
 {
     DeviceIntPtr ptr, keybd, xtstptr, xtstkeybd;
     xXIAnyHierarchyChangeInfo *any;
-    int required_len = sizeof(xXIChangeDeviceHierarchyReq);
+    int required_len = sizeof(xXIChangeHierarchyReq);
     char n;
     int rc = Success;
     int flags[MAXDEVICES] = {0};
 
-    REQUEST(xXIChangeDeviceHierarchyReq);
-    REQUEST_AT_LEAST_SIZE(xXIChangeDeviceHierarchyReq);
+    REQUEST(xXIChangeHierarchyReq);
+    REQUEST_AT_LEAST_SIZE(xXIChangeHierarchyReq);
 
     if (!stuff->num_changes)
         return rc;
@@ -167,7 +167,7 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
 
         switch(any->type)
         {
-            case XICreateMasterDevice:
+            case XICreateMaster:
                 {
                     xXICreateMasterInfo* c = (xXICreateMasterInfo*)any;
                     char* name;
@@ -229,7 +229,7 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
                     xfree(name);
                 }
                 break;
-            case XIRemoveMasterDevice:
+            case XIRemoveMaster:
                 {
                     xXIRemoveMasterInfo* r = (xXIRemoveMasterInfo*)any;
                     DeviceIntPtr xtstdevice;
diff --git a/Xi/chdevhier.h b/Xi/chdevhier.h
index d4ce517..b46cfb4 100644
--- a/Xi/chdevhier.h
+++ b/Xi/chdevhier.h
@@ -36,8 +36,8 @@
 #ifndef CHDEVHIER_H
 #define CHDEVHIER_H 1
 
-int SProcXIChangeDeviceHierarchy(ClientPtr /* client */);
-int ProcXIChangeDeviceHierarchy(ClientPtr /* client */);
+int SProcXIChangeHierarchy(ClientPtr /* client */);
+int ProcXIChangeHierarchy(ClientPtr /* client */);
 
 void XISendDeviceHierarchyEvent(int flags[]);
 
diff --git a/Xi/extinit.c b/Xi/extinit.c
index 4b82f62..b828010 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -235,17 +235,17 @@ static int (*ProcIVector[])(ClientPtr) = {
         ProcXDeleteDeviceProperty,              /* 38 */
         ProcXGetDeviceProperty,                 /* 39 */
         /* XI 2 */
-        ProcXIQueryDevicePointer,               /* 40 */
-        ProcXIWarpDevicePointer,                /* 41 */
-        ProcXIChangeDeviceCursor,               /* 42 */
-        ProcXIChangeDeviceHierarchy,            /* 43 */
+        ProcXIQueryPointer,                     /* 40 */
+        ProcXIWarpPointer,                      /* 41 */
+        ProcXIChangeCursor,                     /* 42 */
+        ProcXIChangeHierarchy,                  /* 43 */
         ProcXISetClientPointer,                 /* 44 */
         ProcXIGetClientPointer,                 /* 45 */
         ProcXISelectEvent,                      /* 46 */
         ProcXIQueryVersion,                     /* 47 */
         ProcXIQueryDevice,                      /* 48 */
-        ProcXISetDeviceFocus,                   /* 49 */
-        ProcXIGetDeviceFocus,                   /* 50 */
+        ProcXISetFocus,                         /* 49 */
+        ProcXIGetFocus,                         /* 50 */
         ProcXIGrabDevice,                       /* 51 */
         ProcXIUngrabDevice,                     /* 52 */
         ProcXIAllowEvents,                      /* 53 */
@@ -299,17 +299,17 @@ static int (*SProcIVector[])(ClientPtr) = {
         SProcXChangeDeviceProperty,              /* 37 */
         SProcXDeleteDeviceProperty,              /* 38 */
         SProcXGetDeviceProperty,                 /* 39 */
-        SProcXIQueryDevicePointer,               /* 40 */
-        SProcXIWarpDevicePointer,                /* 41 */
-        SProcXIChangeDeviceCursor,               /* 42 */
-        SProcXIChangeDeviceHierarchy,            /* 43 */
+        SProcXIQueryPointer,                     /* 40 */
+        SProcXIWarpPointer,                      /* 41 */
+        SProcXIChangeCursor,                     /* 42 */
+        SProcXIChangeHierarchy,                  /* 43 */
         SProcXISetClientPointer,                 /* 44 */
         SProcXIGetClientPointer,                 /* 45 */
         SProcXISelectEvent,                      /* 46 */
         SProcXIQueryVersion,                     /* 47 */
         SProcXIQueryDevice,                      /* 48 */
-        SProcXISetDeviceFocus,                   /* 49 */
-        SProcXIGetDeviceFocus,                   /* 50 */
+        SProcXISetFocus,                         /* 49 */
+        SProcXIGetFocus,                         /* 50 */
         SProcXIGrabDevice,                       /* 51 */
         SProcXIUngrabDevice,                     /* 52 */
         SProcXIAllowEvents,                      /* 53 */
@@ -502,9 +502,8 @@ SReplyIDispatch(ClientPtr client, int len, xGrabDeviceReply * rep)
         SRepXListDeviceProperties(client, len, (xListDevicePropertiesReply*)rep);
     else if (rep->RepType == X_GetDeviceProperty)
 	SRepXGetDeviceProperty(client, len, (xGetDevicePropertyReply *) rep);
-    else if (rep->RepType == X_XIQueryDevicePointer)
-	SRepXIQueryDevicePointer(client, len,
-				(xXIQueryDevicePointerReply *) rep);
+    else if (rep->RepType == X_XIQueryPointer)
+	SRepXIQueryPointer(client, len, (xXIQueryPointerReply *) rep);
     else if (rep->RepType == X_XIGetClientPointer)
         SRepXIGetClientPointer(client, len, (xXIGetClientPointerReply*) rep);
     else if (rep->RepType == X_XIQueryDevice)
@@ -763,8 +762,8 @@ static void SDeviceEvent(xXIDeviceEvent *from, xXIDeviceEvent *to)
     }
 }
 
-static void SDeviceHierarchyEvent(xXIDeviceHierarchyEvent *from,
-                                  xXIDeviceHierarchyEvent *to)
+static void SDeviceHierarchyEvent(xXIHierarchyEvent *from,
+                                  xXIHierarchyEvent *to)
 {
     int i;
     char n;
@@ -816,8 +815,7 @@ XI2EventSwap(xGenericEvent *from, xGenericEvent *to)
                                 (xXIDeviceChangedEvent*)to);
             break;
         case XI_HierarchyChanged:
-            SDeviceHierarchyEvent((xXIDeviceHierarchyEvent*)from,
-                                  (xXIDeviceHierarchyEvent*)to);
+            SDeviceHierarchyEvent((xXIHierarchyEvent*)from, (xXIHierarchyEvent*)to);
             break;
         case XI_PropertyEvent:
             SXIPropertyEvent((xXIPropertyEvent*)from,
diff --git a/Xi/querydp.c b/Xi/querydp.c
index 1b45ae2..dee00fe 100644
--- a/Xi/querydp.c
+++ b/Xi/querydp.c
@@ -58,26 +58,26 @@
  */
 
 int
-SProcXIQueryDevicePointer(ClientPtr client)
+SProcXIQueryPointer(ClientPtr client)
 {
     char n;
 
-    REQUEST(xXIQueryDevicePointerReq);
+    REQUEST(xXIQueryPointerReq);
     swaps(&stuff->length, n);
-    return (ProcXIQueryDevicePointer(client));
+    return (ProcXIQueryPointer(client));
 }
 
 int
-ProcXIQueryDevicePointer(ClientPtr client)
+ProcXIQueryPointer(ClientPtr client)
 {
     int rc;
-    xXIQueryDevicePointerReply rep;
+    xXIQueryPointerReply rep;
     DeviceIntPtr pDev, kbd;
     WindowPtr pWin, t;
     SpritePtr pSprite;
 
-    REQUEST(xXIQueryDevicePointerReq);
-    REQUEST_SIZE_MATCH(xXIQueryDevicePointerReq);
+    REQUEST(xXIQueryPointerReq);
+    REQUEST_SIZE_MATCH(xXIQueryPointerReq);
 
     rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixReadAccess);
     if (rc != Success)
@@ -92,7 +92,7 @@ ProcXIQueryDevicePointer(ClientPtr client)
     rc = dixLookupWindow(&pWin, stuff->win, client, DixReadAccess);
     if (rc != Success)
     {
-        SendErrorToClient(client, IReqCode, X_XIQueryDevicePointer,
+        SendErrorToClient(client, IReqCode, X_XIQueryPointer,
                 stuff->win, rc);
         return Success;
     }
@@ -104,7 +104,7 @@ ProcXIQueryDevicePointer(ClientPtr client)
 
     pSprite = pDev->spriteInfo->sprite;
     rep.repType = X_Reply;
-    rep.RepType = X_XIQueryDevicePointer;
+    rep.RepType = X_XIQueryPointer;
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
     rep.mask = pDev->button->state;
@@ -146,20 +146,20 @@ ProcXIQueryDevicePointer(ClientPtr client)
     }
 #endif
 
-    WriteReplyToClient(client, sizeof(xXIQueryDevicePointerReply), &rep);
+    WriteReplyToClient(client, sizeof(xXIQueryPointerReply), &rep);
     return Success;
 }
 
 /***********************************************************************
  *
- * This procedure writes the reply for the XIQueryDevicePointer function,
+ * This procedure writes the reply for the XIQueryPointer function,
  * if the client and server have a different byte ordering.
  *
  */
 
 void
-SRepXIQueryDevicePointer(ClientPtr client, int size,
-        xXIQueryDevicePointerReply * rep)
+SRepXIQueryPointer(ClientPtr client, int size,
+                   xXIQueryPointerReply * rep)
 {
     char n;
 
diff --git a/Xi/querydp.h b/Xi/querydp.h
index 48b6217..ea22376 100644
--- a/Xi/querydp.h
+++ b/Xi/querydp.h
@@ -30,10 +30,10 @@
 #ifndef QUERYDP_H
 #define QUERYDP_H 1
 
-int SProcXIQueryDevicePointer(ClientPtr	/* client */);
-int ProcXIQueryDevicePointer(ClientPtr	/* client */);
-void SRepXIQueryDevicePointer(ClientPtr /* client */ ,
-			   int /* size */ ,
-			   xXIQueryDevicePointerReply *	/* rep */);
+int SProcXIQueryPointer(ClientPtr /* client */);
+int ProcXIQueryPointer(ClientPtr /* client */);
+void SRepXIQueryPointer(ClientPtr /* client */ ,
+			int /* size */ ,
+			xXIQueryPointerReply *	/* rep */);
 
 #endif /* QUERYDP_H */
diff --git a/Xi/warpdevp.c b/Xi/warpdevp.c
index 2317c86..025a4ce 100644
--- a/Xi/warpdevp.c
+++ b/Xi/warpdevp.c
@@ -54,17 +54,17 @@
  */
 
 int
-SProcXIWarpDevicePointer(ClientPtr client)
+SProcXIWarpPointer(ClientPtr client)
 {
     char n;
 
-    REQUEST(xXIWarpDevicePointerReq);
+    REQUEST(xXIWarpPointerReq);
     swaps(&stuff->length, n);
-    return (ProcXIWarpDevicePointer(client));
+    return (ProcXIWarpPointer(client));
 }
 
 int
-ProcXIWarpDevicePointer(ClientPtr client)
+ProcXIWarpPointer(ClientPtr client)
 {
     int rc;
     int x, y;
@@ -73,8 +73,8 @@ ProcXIWarpDevicePointer(ClientPtr client)
     SpritePtr pSprite;
     ScreenPtr newScreen;
 
-    REQUEST(xXIWarpDevicePointerReq);
-    REQUEST_SIZE_MATCH(xXIWarpDevicePointerReq);
+    REQUEST(xXIWarpPointerReq);
+    REQUEST_SIZE_MATCH(xXIWarpPointerReq);
 
     /* FIXME: panoramix stuff is missing, look at ProcWarpPointer */
 
diff --git a/Xi/warpdevp.h b/Xi/warpdevp.h
index edf95c0..aafc739 100644
--- a/Xi/warpdevp.h
+++ b/Xi/warpdevp.h
@@ -30,7 +30,7 @@
 #ifndef WARPDEVP_H
 #define WARPDEVP_H 1
 
-int SProcXIWarpDevicePointer(ClientPtr	/* client */);
-int ProcXIWarpDevicePointer(ClientPtr	/* client */);
+int SProcXIWarpPointer(ClientPtr /* client */);
+int ProcXIWarpPointer(ClientPtr	/* client */);
 
 #endif /* WARPDEVP_H */
diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 601dec3..7309773 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -41,7 +41,7 @@ SProcXISelectEvent(ClientPtr client)
 {
     char n;
     int i;
-    xXIDeviceEventMask* evmask;
+    xXIEventMask* evmask;
 
     REQUEST(xXISelectEventsReq);
     swaps(&stuff->length, n);
@@ -49,12 +49,12 @@ SProcXISelectEvent(ClientPtr client)
     swapl(&stuff->window, n);
     swaps(&stuff->num_masks, n);
 
-    evmask = (xXIDeviceEventMask*)&stuff[1];
+    evmask = (xXIEventMask*)&stuff[1];
     for (i = 0; i < stuff->num_masks; i++)
     {
         swaps(&evmask->deviceid, n);
         swaps(&evmask->mask_len, n);
-        evmask = (xXIDeviceEventMask*)(((char*)evmask) + evmask->mask_len * 4);
+        evmask = (xXIEventMask*)(((char*)evmask) + evmask->mask_len * 4);
     }
 
     return (ProcXISelectEvent(client));
@@ -67,7 +67,7 @@ ProcXISelectEvent(ClientPtr client)
     WindowPtr win;
     DeviceIntPtr dev;
     DeviceIntRec dummy;
-    xXIDeviceEventMask *evmask;
+    xXIEventMask *evmask;
     int *types = NULL;
 
     REQUEST(xXISelectEventsReq);
@@ -78,7 +78,7 @@ ProcXISelectEvent(ClientPtr client)
         return rc;
 
     /* check request validity */
-    evmask = (xXIDeviceEventMask*)&stuff[1];
+    evmask = (xXIEventMask*)&stuff[1];
     num_masks = stuff->num_masks;
     while(num_masks--)
     {
@@ -102,11 +102,11 @@ ProcXISelectEvent(ClientPtr client)
             }
         }
 
-        evmask = (xXIDeviceEventMask*)(((unsigned char*)evmask) + evmask->mask_len * 4);
+        evmask = (xXIEventMask*)(((unsigned char*)evmask) + evmask->mask_len * 4);
     }
 
     /* Set masks on window */
-    evmask = (xXIDeviceEventMask*)&stuff[1];
+    evmask = (xXIEventMask*)&stuff[1];
     num_masks = stuff->num_masks;
     while(num_masks--)
     {
@@ -118,7 +118,7 @@ ProcXISelectEvent(ClientPtr client)
         } else
             dixLookupDevice(&dev, evmask->deviceid, client, DixReadAccess);
         XISetEventMask(dev, win, client, evmask->mask_len * 4, (unsigned char*)&evmask[1]);
-        evmask = (xXIDeviceEventMask*)(((unsigned char*)evmask) + evmask->mask_len * 4);
+        evmask = (xXIEventMask*)(((unsigned char*)evmask) + evmask->mask_len * 4);
     }
 
     RecalculateDeliverableEvents(win);
diff --git a/Xi/xisetdevfocus.c b/Xi/xisetdevfocus.c
index 7201e65..32f7e59 100644
--- a/Xi/xisetdevfocus.c
+++ b/Xi/xisetdevfocus.c
@@ -41,39 +41,39 @@
 #include "xisetdevfocus.h"
 
 int
-SProcXISetDeviceFocus(ClientPtr client)
+SProcXISetFocus(ClientPtr client)
 {
     char n;
 
-    REQUEST(xXISetDeviceFocusReq);
+    REQUEST(xXISetFocusReq);
     swaps(&stuff->length, n);
     swaps(&stuff->deviceid, n);
     swapl(&stuff->focus, n);
     swapl(&stuff->time, n);
 
-    return ProcXISetDeviceFocus(client);
+    return ProcXISetFocus(client);
 }
 
 int
-SProcXIGetDeviceFocus(ClientPtr client)
+SProcXIGetFocus(ClientPtr client)
 {
     char n;
 
-    REQUEST(xXIGetDeviceFocusReq);
+    REQUEST(xXIGetFocusReq);
     swaps(&stuff->length, n);
     swaps(&stuff->deviceid, n);
 
-    return ProcXIGetDeviceFocus(client);
+    return ProcXIGetFocus(client);
 }
 
 int
-ProcXISetDeviceFocus(ClientPtr client)
+ProcXISetFocus(ClientPtr client)
 {
     DeviceIntPtr dev;
     int ret;
 
-    REQUEST(xXISetDeviceFocusReq);
-    REQUEST_AT_LEAST_SIZE(xXISetDeviceFocusReq);
+    REQUEST(xXISetFocusReq);
+    REQUEST_AT_LEAST_SIZE(xXISetFocusReq);
 
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixSetFocusAccess);
     if (ret != Success)
@@ -86,14 +86,14 @@ ProcXISetDeviceFocus(ClientPtr client)
 }
 
 int
-ProcXIGetDeviceFocus(ClientPtr client)
+ProcXIGetFocus(ClientPtr client)
 {
-    xXIGetDeviceFocusReply rep;
+    xXIGetFocusReply rep;
     DeviceIntPtr dev;
     int ret;
 
-    REQUEST(xXIGetDeviceFocusReq);
-    REQUEST_AT_LEAST_SIZE(xXIGetDeviceFocusReq);
+    REQUEST(xXIGetFocusReq);
+    REQUEST_AT_LEAST_SIZE(xXIGetFocusReq);
 
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetFocusAccess);
     if (ret != Success)
@@ -102,7 +102,7 @@ ProcXIGetDeviceFocus(ClientPtr client)
 	return BadDevice;
 
     rep.repType = X_Reply;
-    rep.RepType = X_XIGetDeviceFocus;
+    rep.RepType = X_XIGetFocus;
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
 
@@ -115,6 +115,6 @@ ProcXIGetDeviceFocus(ClientPtr client)
     else
 	rep.focus = dev->focus->win->drawable.id;
 
-    WriteReplyToClient(client, sizeof(xXIGetDeviceFocusReply), &rep);
+    WriteReplyToClient(client, sizeof(xXIGetFocusReply), &rep);
     return Success;
 }
diff --git a/Xi/xisetdevfocus.h b/Xi/xisetdevfocus.h
index 9bdeb77..5ec1fa2 100644
--- a/Xi/xisetdevfocus.h
+++ b/Xi/xisetdevfocus.h
@@ -26,10 +26,10 @@
 #ifndef XISETDEVFOCUS_H
 #define XISETDEVFOCUS_H 1
 
-int SProcXISetDeviceFocus(ClientPtr client);
-int ProcXISetDeviceFocus(ClientPtr client);
+int SProcXISetFocus(ClientPtr client);
+int ProcXISetFocus(ClientPtr client);
 
-int SProcXIGetDeviceFocus(ClientPtr client);
-int ProcXIGetDeviceFocus(ClientPtr client);
+int SProcXIGetFocus(ClientPtr client);
+int ProcXIGetFocus(ClientPtr client);
 
 #endif /* XISETDEVFOCUS_H */
diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index 58fd6d2..97fc2ad 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -422,9 +422,9 @@ eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
 static int
 eventToRawEvent(RawDeviceEvent *ev, xEvent **xi)
 {
-    xXIRawDeviceEvent* raw;
+    xXIRawEvent* raw;
     int vallen, nvals;
-    int i, len = sizeof(xXIRawDeviceEvent);
+    int i, len = sizeof(xXIRawEvent);
     char *ptr;
     FP3232 *axisval;
 
@@ -435,7 +435,7 @@ eventToRawEvent(RawDeviceEvent *ev, xEvent **xi)
     len += vallen * 4; /* valuators mask */
 
     *xi = xcalloc(1, len);
-    raw = (xXIRawDeviceEvent*)*xi;
+    raw = (xXIRawEvent*)*xi;
     raw->type           = GenericEvent;
     raw->extension      = IReqCode;
     raw->evtype         = GetXI2Type((InternalEvent*)ev);
diff --git a/test/input.c b/test/input.c
index 238cad3..cca1291 100644
--- a/test/input.c
+++ b/test/input.c
@@ -284,16 +284,16 @@ static void xi2_struct_sizes(void)
     g_assert(sizeof(req) == sz_##req);
 
     compare(xXIQueryVersionReq);
-    compare(xXIWarpDevicePointerReq);
-    compare(xXIChangeDeviceCursorReq);
-    compare(xXIChangeDeviceHierarchyReq);
+    compare(xXIWarpPointerReq);
+    compare(xXIChangeCursorReq);
+    compare(xXIChangeHierarchyReq);
     compare(xXISetClientPointerReq);
     compare(xXIGetClientPointerReq);
     compare(xXISelectEventsReq);
     compare(xXIQueryVersionReq);
     compare(xXIQueryDeviceReq);
-    compare(xXISetDeviceFocusReq);
-    compare(xXIGetDeviceFocusReq);
+    compare(xXISetFocusReq);
+    compare(xXIGetFocusReq);
     compare(xXIGrabDeviceReq);
     compare(xXIUngrabDeviceReq);
     compare(xXIAllowEventsReq);
commit bbf266cca3de726e3eb932d66dd5b8981ef40fa8
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue May 12 21:24:07 2009 +1000

    mi: un-deprecate miPointerWarpCursor
    
    This function was deprecated in ef68273f5bdb27a492ec0b69548ec4fbede46c08
    because it didn't take a device argument. The device argument was added in
    1c7568b8a1417257fa67c7fca69aa253099b9461 though, so the deprecation is
    obsolete.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/mi/mipointer.h b/mi/mipointer.h
index f385b7e..22575ea 100644
--- a/mi/mipointer.h
+++ b/mi/mipointer.h
@@ -108,7 +108,7 @@ extern _X_EXPORT void miPointerWarpCursor(
     ScreenPtr /*pScreen*/,
     int /*x*/,
     int /*y*/
-) _X_DEPRECATED;
+);
 
 /* Deprecated in favour of miPointerGetScreen. */
 extern _X_EXPORT ScreenPtr miPointerCurrentScreen(
commit 273890924b8ed6f8b7949c0322c8258b9e6f8630
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue May 12 16:09:35 2009 +1000

    input: reduce the number of superfluous hierarchy events
    
    There's only two reasons for hierarchy events:
    - device is added, removed, etc. In this case we want to send the event as
      it happens.
    - devices are added in a XIChangeDeviceHierarchy request. In this case we
      only want one event cumulating all changes.

diff --git a/Xi/chdevhier.c b/Xi/chdevhier.c
index 1aaa371..ae5377d 100644
--- a/Xi/chdevhier.c
+++ b/Xi/chdevhier.c
@@ -196,25 +196,25 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
                         goto unwind;
                     }
 
-                    ActivateDevice(ptr);
-                    ActivateDevice(keybd);
+                    ActivateDevice(ptr, FALSE);
+                    ActivateDevice(keybd, FALSE);
                     flags[ptr->id] |= XIMasterAdded;
                     flags[keybd->id] |= XIMasterAdded;
 
-                    ActivateDevice(xtstptr);
-                    ActivateDevice(xtstkeybd);
+                    ActivateDevice(xtstptr, FALSE);
+                    ActivateDevice(xtstkeybd, FALSE);
                     flags[xtstptr->id] |= XISlaveAdded;
                     flags[xtstkeybd->id] |= XISlaveAdded;
 
                     if (c->enable)
                     {
-                        EnableDevice(ptr);
-                        EnableDevice(keybd);
+                        EnableDevice(ptr, FALSE);
+                        EnableDevice(keybd, FALSE);
                         flags[ptr->id] |= XIDeviceEnabled;
                         flags[keybd->id] |= XIDeviceEnabled;
 
-                        EnableDevice(xtstptr);
-                        EnableDevice(xtstkeybd);
+                        EnableDevice(xtstptr, FALSE);
+                        EnableDevice(xtstkeybd, FALSE);
                         flags[xtstptr->id] |= XIDeviceEnabled;
                         flags[xtstkeybd->id] |= XIDeviceEnabled;
                     }
@@ -389,19 +389,19 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
 
                     /* disable the remove the devices, xtst devices must be done first
                        else the sprites they rely on will be destroyed  */
-                    DisableDevice(xtstptr);
-                    DisableDevice(xtstkeybd);
-                    DisableDevice(keybd);
-                    DisableDevice(ptr);
+                    DisableDevice(xtstptr, FALSE);
+                    DisableDevice(xtstkeybd, FALSE);
+                    DisableDevice(keybd, FALSE);
+                    DisableDevice(ptr, FALSE);
                     flags[xtstptr->id] |= XIDeviceDisabled | XISlaveDetached;
                     flags[xtstkeybd->id] |= XIDeviceDisabled | XISlaveDetached;
                     flags[keybd->id] |= XIDeviceDisabled;
                     flags[ptr->id] |= XIDeviceDisabled;
 
-                    RemoveDevice(xtstptr);
-                    RemoveDevice(xtstkeybd);
-                    RemoveDevice(keybd);
-                    RemoveDevice(ptr);
+                    RemoveDevice(xtstptr, FALSE);
+                    RemoveDevice(xtstkeybd, FALSE);
+                    RemoveDevice(keybd, FALSE);
+                    RemoveDevice(ptr, FALSE);
                     flags[xtstptr->id] |= XISlaveRemoved;
                     flags[xtstkeybd->id] |= XISlaveRemoved;
                     flags[keybd->id] |= XIMasterRemoved;
diff --git a/Xi/chgdctl.c b/Xi/chgdctl.c
index f5dd08a..89e5a2d 100644
--- a/Xi/chgdctl.c
+++ b/Xi/chgdctl.c
@@ -253,9 +253,9 @@ ProcXChangeDeviceControl(ClientPtr client)
 
         if (status == Success) {
             if (e->enable)
-                EnableDevice(dev);
+                EnableDevice(dev, TRUE);
             else
-                DisableDevice(dev);
+                DisableDevice(dev, TRUE);
             ret = Success;
         } else if (status == DeviceBusy) {
             rep.status = DeviceBusy;
diff --git a/dix/devices.c b/dix/devices.c
index c59457f..bcb9058 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -130,9 +130,9 @@ DeviceSetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop,
         if (!checkonly)
         {
             if ((*((CARD8*)prop->data)) && !dev->enabled)
-                EnableDevice(dev);
+                EnableDevice(dev, TRUE);
             else if (!(*((CARD8*)prop->data)) && dev->enabled)
-                DisableDevice(dev);
+                DisableDevice(dev, TRUE);
         }
     }
 
@@ -284,10 +284,11 @@ SendDevicePresenceEvent(int deviceid, int type)
  * device.
  *
  * @param The device to be enabled.
+ * @param sendevent True if an XI2 event should be sent.
  * @return TRUE on success or FALSE otherwise.
  */
 Bool
-EnableDevice(DeviceIntPtr dev)
+EnableDevice(DeviceIntPtr dev, BOOL sendevent)
 {
     DeviceIntPtr *prev;
     int ret;
@@ -362,8 +363,11 @@ EnableDevice(DeviceIntPtr dev)
                            TRUE);
 
     SendDevicePresenceEvent(dev->id, DeviceEnabled);
-    flags[dev->id] |= XIDeviceEnabled;
-    XISendDeviceHierarchyEvent(flags);
+    if (sendevent)
+    {
+        flags[dev->id] |= XIDeviceEnabled;
+        XISendDeviceHierarchyEvent(flags);
+    }
 
     return TRUE;
 }
@@ -376,10 +380,11 @@ EnableDevice(DeviceIntPtr dev)
  * Master keyboard devices have to be disabled before master pointer devices
  * otherwise things turn bad.
  *
+ * @param sendevent True if an XI2 event should be sent.
  * @return TRUE on success or FALSE otherwise.
  */
 Bool
-DisableDevice(DeviceIntPtr dev)
+DisableDevice(DeviceIntPtr dev, BOOL sendevent)
 {
     DeviceIntPtr *prev, other;
     BOOL enabled;
@@ -438,8 +443,11 @@ DisableDevice(DeviceIntPtr dev)
                            TRUE);
 
     SendDevicePresenceEvent(dev->id, DeviceDisabled);
-    flags[dev->id] = XIDeviceDisabled;
-    XISendDeviceHierarchyEvent(flags);
+    if (sendevent)
+    {
+        flags[dev->id] = XIDeviceDisabled;
+        XISendDeviceHierarchyEvent(flags);
+    }
     return TRUE;
 }
 
@@ -450,14 +458,14 @@ DisableDevice(DeviceIntPtr dev)
  * Must be called before EnableDevice.
  * The device will NOT send events until it is enabled!
  *
+ * @param sendevent True if an XI2 event should be sent.
  * @return Success or an error code on failure.
  */
 int
-ActivateDevice(DeviceIntPtr dev)
+ActivateDevice(DeviceIntPtr dev, BOOL sendevent)
 {
     int ret = Success;
     ScreenPtr pScreen = screenInfo.screens[0];
-    int flags[MAXDEVICES];
 
     if (!dev || !dev->deviceProc)
         return BadImplementation;
@@ -472,8 +480,12 @@ ActivateDevice(DeviceIntPtr dev)
         pScreen->DeviceCursorInitialize(dev, pScreen);
 
     SendDevicePresenceEvent(dev->id, DeviceAdded);
-    flags[dev->id] = XISlaveAdded;
-    XISendDeviceHierarchyEvent(flags);
+    if (sendevent)
+    {
+        int flags[MAXDEVICES] = {0};
+        flags[dev->id] = XISlaveAdded;
+        XISendDeviceHierarchyEvent(flags);
+    }
     return ret;
 }
 
@@ -580,11 +592,11 @@ InitCoreDevices(void)
                         TRUE) != Success)
         FatalError("Failed to allocate core devices");
 
-    if (ActivateDevice(inputInfo.pointer) != Success ||
-        ActivateDevice(inputInfo.keyboard) != Success)
+    if (ActivateDevice(inputInfo.pointer, TRUE) != Success ||
+        ActivateDevice(inputInfo.keyboard, TRUE) != Success)
         FatalError("Failed to activate core devices.");
-    if (!EnableDevice(inputInfo.pointer) ||
-        !EnableDevice(inputInfo.keyboard))
+    if (!EnableDevice(inputInfo.pointer, TRUE) ||
+        !EnableDevice(inputInfo.keyboard, TRUE))
         FatalError("Failed to enable core devices.");
 
     /*
@@ -596,11 +608,11 @@ InitCoreDevices(void)
                        &vxtstkeyboard) != Success)
         FatalError("Failed to allocate XTst devices");
 
-    if (ActivateDevice(vxtstpointer) != Success ||
-        ActivateDevice(vxtstkeyboard) != Success)
+    if (ActivateDevice(vxtstpointer, TRUE) != Success ||
+        ActivateDevice(vxtstkeyboard, TRUE) != Success)
         FatalError("Failed to activate xtst core devices.");
-    if (!EnableDevice(vxtstpointer) ||
-        !EnableDevice(vxtstkeyboard))
+    if (!EnableDevice(vxtstpointer, TRUE) ||
+        !EnableDevice(vxtstkeyboard, TRUE))
         FatalError("Failed to enable xtst core devices.");
 
     AttachDevice(NULL, vxtstpointer, inputInfo.pointer);
@@ -627,7 +639,7 @@ InitAndStartDevices(void)
     for (dev = inputInfo.off_devices; dev; dev = dev->next) {
         DebugF("(dix) initialising device %d\n", dev->id);
         if (!dev->inited)
-            ActivateDevice(dev);
+            ActivateDevice(dev, TRUE);
     }
 
     /* enable real devices */
@@ -636,7 +648,7 @@ InitAndStartDevices(void)
         DebugF("(dix) enabling device %d\n", dev->id);
 	next = dev->next;
 	if (dev->inited && dev->startup)
-	    (void)EnableDevice(dev);
+	    EnableDevice(dev, TRUE);
     }
 
     return Success;
@@ -929,9 +941,11 @@ UndisplayDevices(void)
  * happen if a malloc fails during the addition of master devices. If
  * dev->init is FALSE it means the client never received a DeviceAdded event,
  * so let's not send a DeviceRemoved event either.
+ *
+ * @param sendevent True if an XI2 event should be sent.
  */
 int
-RemoveDevice(DeviceIntPtr dev)
+RemoveDevice(DeviceIntPtr dev, BOOL sendevent)
 {
     DeviceIntPtr prev,tmp,next;
     int ret = BadMatch;
@@ -953,7 +967,7 @@ RemoveDevice(DeviceIntPtr dev)
         if (DevHasCursor(dev))
             screen->DisplayCursor(dev, screen, NullCursor);
 
-        DisableDevice(dev);
+        DisableDevice(dev, sendevent);
         flags[dev->id] = XIDeviceDisabled;
     }
 
@@ -992,7 +1006,8 @@ RemoveDevice(DeviceIntPtr dev)
     if (ret == Success && initialized) {
         inputInfo.numDevices--;
         SendDevicePresenceEvent(deviceid, DeviceRemoved);
-        XISendDeviceHierarchyEvent(flags);
+        if (sendevent)
+            XISendDeviceHierarchyEvent(flags);
     }
 
     return ret;
@@ -2360,7 +2375,7 @@ AllocDevicePair (ClientPtr client, char* name,
     keyboard = AddInputDevice(client, CoreKeyboardProc, TRUE);
     if (!keyboard)
     {
-        RemoveDevice(pointer);
+        RemoveDevice(pointer, FALSE);
         return BadAlloc;
     }
 
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index e9b4dfe..98175e9 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -462,7 +462,7 @@ xf86VTSwitch(void)
       if (pInfo->dev) {
           xf86ReleaseKeys(pInfo->dev);
           ProcessInputEvents();
-          DisableDevice(pInfo->dev);
+          DisableDevice(pInfo->dev, TRUE);
       }
     }
     xf86EnterServerState(SETUP);
@@ -497,7 +497,7 @@ xf86VTSwitch(void)
       pInfo = xf86InputDevs;
       while (pInfo) {
         if (pInfo->dev)
-            EnableDevice(pInfo->dev);
+            EnableDevice(pInfo->dev, TRUE);
 	pInfo = pInfo->next;
       }
       for (ih = InputHandlers; ih; ih = ih->next)
@@ -555,7 +555,7 @@ xf86VTSwitch(void)
     pInfo = xf86InputDevs;
     while (pInfo) {
       if (pInfo->dev)
-          EnableDevice(pInfo->dev);
+          EnableDevice(pInfo->dev, TRUE);
       pInfo = pInfo->next;
     }
 
diff --git a/hw/xfree86/common/xf86PM.c b/hw/xfree86/common/xf86PM.c
index 7c8320d..c51960e 100644
--- a/hw/xfree86/common/xf86PM.c
+++ b/hw/xfree86/common/xf86PM.c
@@ -76,7 +76,7 @@ suspend (pmEvent event, Bool undo)
     }
     pInfo = xf86InputDevs;
     while (pInfo) {
-	DisableDevice(pInfo->dev);
+	DisableDevice(pInfo->dev, TRUE);
 	pInfo = pInfo->next;
     }
     xf86EnterServerState(SETUP);
@@ -119,7 +119,7 @@ resume(pmEvent event, Bool undo)
     dixSaveScreens(serverClient, SCREEN_SAVER_FORCER, ScreenSaverReset);
     pInfo = xf86InputDevs;
     while (pInfo) {
-	EnableDevice(pInfo->dev);
+	EnableDevice(pInfo->dev, TRUE);
 	pInfo = pInfo->next;
     }
     xf86inSuspend = FALSE;
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 6b34aad..aa98dad 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -377,7 +377,7 @@ OpenInputDevice(DeviceIntPtr	dev,
                 int		*status)
 {
     if (!dev->inited)
-        ActivateDevice(dev);
+        ActivateDevice(dev, TRUE);
 
     *status = Success;
 }
@@ -544,18 +544,18 @@ xf86NewInputDevice(IDevPtr idev, DeviceIntPtr *pdev, BOOL enable)
     }
 
     dev = pInfo->dev;
-    rval = ActivateDevice(dev);
+    rval = ActivateDevice(dev, TRUE);
     if (rval != Success)
     {
         xf86Msg(X_ERROR, "Couldn't init device \"%s\"\n", idev->identifier);
-        RemoveDevice(dev);
+        RemoveDevice(dev, TRUE);
         goto unwind;
     }
 
     /* Enable it if it's properly initialised and we're currently in the VT */
     if (enable && dev->inited && dev->startup && xf86Screens[0]->vtSema)
     {
-        EnableDevice(dev);
+        EnableDevice(dev, TRUE);
         if (!dev->enabled)
         {
             xf86Msg(X_ERROR, "Couldn't init device \"%s\"\n", idev->identifier);
@@ -680,7 +680,7 @@ DeleteInputDeviceRequest(DeviceIntPtr pDev)
     }
 
     OsBlockSignals();
-    RemoveDevice(pDev);
+    RemoveDevice(pDev, TRUE);
 
     if (!isMaster && pInfo != NULL)
     {
@@ -1065,7 +1065,7 @@ xf86DisableDevice(DeviceIntPtr dev, Bool panic)
 
     if(!panic)
     {
-        DisableDevice(dev);
+        DisableDevice(dev, TRUE);
     } else
     {
         ev.type = DevicePresenceNotify;
@@ -1088,7 +1088,7 @@ xf86DisableDevice(DeviceIntPtr dev, Bool panic)
 void
 xf86EnableDevice(DeviceIntPtr dev)
 {
-    EnableDevice(dev);
+    EnableDevice(dev, TRUE);
 }
 
 /* end of xf86Xinput.c */
diff --git a/include/input.h b/include/input.h
index e3509a9..44990a0 100644
--- a/include/input.h
+++ b/include/input.h
@@ -228,13 +228,16 @@ extern _X_EXPORT DeviceIntPtr AddInputDevice(
     Bool /*autoStart*/);
 
 extern _X_EXPORT Bool EnableDevice(
-    DeviceIntPtr /*device*/);
+    DeviceIntPtr /*device*/,
+    BOOL /* sendevent */);
 
 extern _X_EXPORT Bool ActivateDevice(
-    DeviceIntPtr /*device*/);
+    DeviceIntPtr /*device*/,
+    BOOL /* sendevent */);
 
 extern _X_EXPORT Bool DisableDevice(
-    DeviceIntPtr /*device*/);
+    DeviceIntPtr /*device*/,
+    BOOL /* sendevent */);
 
 extern int InitAndStartDevices(void);
 
@@ -243,7 +246,8 @@ extern void CloseDownDevices(void);
 extern void UndisplayDevices(void);
 
 extern _X_EXPORT int RemoveDevice(
-    DeviceIntPtr /*dev*/);
+    DeviceIntPtr /*dev*/,
+    BOOL /* sendevent */);
 
 extern _X_EXPORT int NumMotionEvents(void);
 
commit 033a2b12fcd02fa9a2c2f20a352bec0a43074512
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue May 12 14:50:57 2009 +1000

    Xi: set per-device hierarchy changed flags.
    
    Rather than have one field per hierarchy change, XI2 has two fields - one
    generic one and one per-device that include the device-specific flags.
    This requires some funky handling for removed devices, but oh well.

diff --git a/Xi/chdevhier.c b/Xi/chdevhier.c
index 96b515d..1aaa371 100644
--- a/Xi/chdevhier.c
+++ b/Xi/chdevhier.c
@@ -59,25 +59,25 @@ extern DevPrivateKey XTstDevicePrivateKey;
 /**
  * Send the current state of the device hierarchy to all clients.
  */
-void XISendDeviceHierarchyEvent(int flags)
+void XISendDeviceHierarchyEvent(int flags[MAXDEVICES])
 {
     xXIDeviceHierarchyEvent *ev;
     xXIHierarchyInfo *info;
     DeviceIntRec dummyDev;
     DeviceIntPtr dev;
+    int i;
 
     if (!flags)
         return;
 
-    ev = xcalloc(1, sizeof(xXIDeviceHierarchyEvent) + inputInfo.numDevices *
-            sizeof(xXIHierarchyInfo));
+    ev = xcalloc(1, sizeof(xXIDeviceHierarchyEvent) +
+                 MAXDEVICES * sizeof(xXIHierarchyInfo));
     ev->type = GenericEvent;
     ev->extension = IReqCode;
     ev->evtype = XI_HierarchyChanged;
     ev->time = GetTimeInMillis();
-    ev->flags = flags;
+    ev->flags = 0;
     ev->num_devices = inputInfo.numDevices;
-    ev->length = (ev->num_devices * sizeof(xXIHierarchyInfo))/4;
 
     info = (xXIHierarchyInfo*)&ev[1];
     for (dev = inputInfo.devices; dev; dev = dev->next)
@@ -85,6 +85,8 @@ void XISendDeviceHierarchyEvent(int flags)
         info->deviceid = dev->id;
         info->enabled = dev->enabled;
         info->use = GetDeviceUse(dev, &info->attachment);
+        info->flags = flags[dev->id];
+        ev->flags |= info->flags;
         info++;
     }
     for (dev = inputInfo.off_devices; dev; dev = dev->next)
@@ -92,9 +94,28 @@ void XISendDeviceHierarchyEvent(int flags)
         info->deviceid = dev->id;
         info->enabled = dev->enabled;
         info->use = GetDeviceUse(dev, &info->attachment);
+        info->flags = flags[dev->id];
+        ev->flags |= info->flags;
         info++;
     }
 
+
+    for (i = 0; i < MAXDEVICES; i++)
+    {
+        if (flags[i] & (XIMasterRemoved | XISlaveRemoved))
+        {
+            info->deviceid = i;
+            info->enabled = FALSE;
+            info->flags = flags[i];
+            info->use = 0;
+            ev->flags |= info->flags;
+            ev->num_devices++;
+            info++;
+        }
+    }
+
+    ev->length = (ev->num_devices * sizeof(xXIHierarchyInfo))/4;
+
     dummyDev.id = XIAllDevices;
     SendEventToAllWindows(&dummyDev, (XI_HierarchyChangedMask >> 8), (xEvent*)ev, 1);
 }
@@ -126,7 +147,7 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
     int required_len = sizeof(xXIChangeDeviceHierarchyReq);
     char n;
     int rc = Success;
-    int flags = 0;
+    int flags[MAXDEVICES] = {0};
 
     REQUEST(xXIChangeDeviceHierarchyReq);
     REQUEST_AT_LEAST_SIZE(xXIChangeDeviceHierarchyReq);
@@ -177,24 +198,35 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
 
                     ActivateDevice(ptr);
                     ActivateDevice(keybd);
+                    flags[ptr->id] |= XIMasterAdded;
+                    flags[keybd->id] |= XIMasterAdded;
+
                     ActivateDevice(xtstptr);
                     ActivateDevice(xtstkeybd);
+                    flags[xtstptr->id] |= XISlaveAdded;
+                    flags[xtstkeybd->id] |= XISlaveAdded;
 
                     if (c->enable)
                     {
                         EnableDevice(ptr);
                         EnableDevice(keybd);
+                        flags[ptr->id] |= XIDeviceEnabled;
+                        flags[keybd->id] |= XIDeviceEnabled;
+
                         EnableDevice(xtstptr);
                         EnableDevice(xtstkeybd);
+                        flags[xtstptr->id] |= XIDeviceEnabled;
+                        flags[xtstkeybd->id] |= XIDeviceEnabled;
                     }
 
                     /* Attach the XTest virtual devices to the newly
                        created master device */
                     AttachDevice(NULL, xtstptr, ptr);
                     AttachDevice(NULL, xtstkeybd, keybd);
+                    flags[xtstptr->id] |= XISlaveAttached;
+                    flags[xtstkeybd->id] |= XISlaveAttached;
 
                     xfree(name);
-                    flags |= XIMasterAdded;
                 }
                 break;
             case XIRemoveMasterDevice:
@@ -336,9 +368,15 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
                         {
                             if (!attached->isMaster) {
                                 if (attached->u.master == ptr)
+                                {
                                     AttachDevice(client, attached, newptr);
+                                    flags[attached->id] |= XISlaveAttached;
+                                }
                                 if (attached->u.master == keybd)
+                                {
                                     AttachDevice(client, attached, newkeybd);
+                                    flags[attached->id] |= XISlaveAttached;
+                                }
                             }
                         }
                     }
@@ -355,12 +393,19 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
                     DisableDevice(xtstkeybd);
                     DisableDevice(keybd);
                     DisableDevice(ptr);
+                    flags[xtstptr->id] |= XIDeviceDisabled | XISlaveDetached;
+                    flags[xtstkeybd->id] |= XIDeviceDisabled | XISlaveDetached;
+                    flags[keybd->id] |= XIDeviceDisabled;
+                    flags[ptr->id] |= XIDeviceDisabled;
 
                     RemoveDevice(xtstptr);
                     RemoveDevice(xtstkeybd);
                     RemoveDevice(keybd);
                     RemoveDevice(ptr);
-                    flags |= XIMasterRemoved;
+                    flags[xtstptr->id] |= XISlaveRemoved;
+                    flags[xtstkeybd->id] |= XISlaveRemoved;
+                    flags[keybd->id] |= XIMasterRemoved;
+                    flags[ptr->id] |= XIMasterRemoved;
                 }
                 break;
             case XIDetachSlave:
@@ -392,7 +437,7 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
                     }
 
                     AttachDevice(client, ptr, NULL);
-                    flags |= XISlaveDetached;
+                    flags[ptr->id] |= XISlaveDetached;
                 }
                 break;
             case XIAttachSlave:
@@ -444,7 +489,7 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
                         goto unwind;
                     }
                     AttachDevice(client, ptr, newmaster);
-                    flags |= XISlaveAttached;
+                    flags[ptr->id] |= XISlaveAttached;
                 }
                 break;
         }
diff --git a/Xi/chdevhier.h b/Xi/chdevhier.h
index d2d1001..d4ce517 100644
--- a/Xi/chdevhier.h
+++ b/Xi/chdevhier.h
@@ -39,6 +39,6 @@
 int SProcXIChangeDeviceHierarchy(ClientPtr /* client */);
 int ProcXIChangeDeviceHierarchy(ClientPtr /* client */);
 
-void XISendDeviceHierarchyEvent(int flags);
+void XISendDeviceHierarchyEvent(int flags[]);
 
 #endif
diff --git a/dix/devices.c b/dix/devices.c
index dc5de05..c59457f 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -296,6 +296,7 @@ EnableDevice(DeviceIntPtr dev)
     int listlen;
     EventListPtr evlist;
     BOOL enabled;
+    int flags[MAXDEVICES] = {0};
 
     for (prev = &inputInfo.off_devices;
 	 *prev && (*prev != dev);
@@ -361,7 +362,8 @@ EnableDevice(DeviceIntPtr dev)
                            TRUE);
 
     SendDevicePresenceEvent(dev->id, DeviceEnabled);
-    XISendDeviceHierarchyEvent(XIDeviceEnabled);
+    flags[dev->id] |= XIDeviceEnabled;
+    XISendDeviceHierarchyEvent(flags);
 
     return TRUE;
 }
@@ -381,6 +383,7 @@ DisableDevice(DeviceIntPtr dev)
 {
     DeviceIntPtr *prev, other;
     BOOL enabled;
+    int flags[MAXDEVICES] = {0};
 
     for (prev = &inputInfo.devices;
 	 *prev && (*prev != dev);
@@ -395,7 +398,10 @@ DisableDevice(DeviceIntPtr dev)
         for (other = inputInfo.devices; other; other = other->next)
         {
             if (other->u.master == dev)
+            {
                 AttachDevice(NULL, other, NULL);
+                flags[other->id] |= XISlaveDetached;
+            }
         }
     }
     else
@@ -432,7 +438,8 @@ DisableDevice(DeviceIntPtr dev)
                            TRUE);
 
     SendDevicePresenceEvent(dev->id, DeviceDisabled);
-    XISendDeviceHierarchyEvent(XIDeviceDisabled);
+    flags[dev->id] = XIDeviceDisabled;
+    XISendDeviceHierarchyEvent(flags);
     return TRUE;
 }
 
@@ -450,6 +457,7 @@ ActivateDevice(DeviceIntPtr dev)
 {
     int ret = Success;
     ScreenPtr pScreen = screenInfo.screens[0];
+    int flags[MAXDEVICES];
 
     if (!dev || !dev->deviceProc)
         return BadImplementation;
@@ -464,7 +472,8 @@ ActivateDevice(DeviceIntPtr dev)
         pScreen->DeviceCursorInitialize(dev, pScreen);
 
     SendDevicePresenceEvent(dev->id, DeviceAdded);
-    XISendDeviceHierarchyEvent(XISlaveAdded);
+    flags[dev->id] = XISlaveAdded;
+    XISendDeviceHierarchyEvent(flags);
     return ret;
 }
 
@@ -929,6 +938,7 @@ RemoveDevice(DeviceIntPtr dev)
     ScreenPtr screen = screenInfo.screens[0];
     int deviceid;
     int initialized;
+    int flags[MAXDEVICES] = {0};
 
     DebugF("(dix) removing device %d\n", dev->id);
 
@@ -944,6 +954,7 @@ RemoveDevice(DeviceIntPtr dev)
             screen->DisplayCursor(dev, screen, NullCursor);
 
         DisableDevice(dev);
+        flags[dev->id] = XIDeviceDisabled;
     }
 
     prev = NULL;
@@ -956,6 +967,7 @@ RemoveDevice(DeviceIntPtr dev)
 	    else
 		prev->next = next;
 
+	    flags[tmp->id] = (tmp->isMaster) ? XIMasterRemoved : XISlaveRemoved;
 	    CloseDevice(tmp);
 	    ret = Success;
 	}
@@ -965,6 +977,7 @@ RemoveDevice(DeviceIntPtr dev)
     for (tmp = inputInfo.off_devices; tmp; (prev = tmp), (tmp = next)) {
 	next = tmp->next;
 	if (tmp == dev) {
+	    flags[tmp->id] = (tmp->isMaster) ? XIMasterRemoved : XISlaveRemoved;
 	    CloseDevice(tmp);
 
 	    if (prev == NULL)
@@ -979,7 +992,7 @@ RemoveDevice(DeviceIntPtr dev)
     if (ret == Success && initialized) {
         inputInfo.numDevices--;
         SendDevicePresenceEvent(deviceid, DeviceRemoved);
-        XISendDeviceHierarchyEvent(XISlaveRemoved);
+        XISendDeviceHierarchyEvent(flags);
     }
 
     return ret;
commit 8fb51feae222ff4f4aa1c440b6973ce7383bbc09
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon May 11 15:45:46 2009 +1000

    xkb: if kbd init failed, NULL out the pointers after freeing them (#21278)
    
    Reproducible:
    Configure a server that uses the keyboard driver with an invalid ruleset,
    e.g. (Option "XkbRules" "foobar"). Ensure that Option "AllowEmptyInput" is
    "off" in the ServerFlags or ServerLayout section. Start the server.
    After failing to init the keymap, the server will try to clean up after the
    device, double-freeing some xkb structs that have not been reset properly.
    
    X.Org Bug 21278 <http://bugs.freedesktop.org/show_bug.cgi?id=21278>
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c
index 7c611bc..e85b318 100644
--- a/xkb/xkbInit.c
+++ b/xkb/xkbInit.c
@@ -622,10 +622,13 @@ unwind_desc:
     XkbFreeKeyboard(xkb, 0, TRUE);
 unwind_info:
     xfree(xkbi);
+    dev->key->xkbInfo = NULL;
 unwind_kbdfeed:
     xfree(dev->kbdfeed);
+    dev->kbdfeed = NULL;
 unwind_key:
     xfree(dev->key);
+    dev->key = NULL;
     return FALSE;
 }
 
commit 0cea199eda772a5ddd5ce72e4823a00ec14405d4
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon May 11 12:53:56 2009 +1000

    kdrive: set Activate/Deactivate grab for input devices (#21591)
    
    X.Org Bug 21591 <http://bugs.freedesktop.org/show_bug.cgi?id=21591>

diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 7ed3601..0d216a9 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -915,6 +915,8 @@ KdAddKeyboard (KdKeyboardInfo *ki)
         return !Success;
     }
 
+    ki->dixdev->deviceGrab.ActivateGrab = ActivateKeyboardGrab;
+    ki->dixdev->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab;
     RegisterOtherDevice(ki->dixdev);
 
 #ifdef DEBUG
@@ -984,6 +986,8 @@ KdAddPointer (KdPointerInfo *pi)
         return BadDevice;
     }
 
+    pi->dixdev->deviceGrab.ActivateGrab = ActivatePointerGrab;
+    pi->dixdev->deviceGrab.DeactivateGrab = DeactivatePointerGrab;
     RegisterOtherDevice(pi->dixdev);
 
     for (prev = &kdPointers; *prev; prev = &(*prev)->next);
commit fdce58ca822f4e43e03e84076190f52d7104e01f
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon May 11 12:51:40 2009 +1000

    dix: ensure Activate/DeactivateGrab has a valid value.
    
    Xephyr doesn't manually set Activate/DeactivateGrab for new devices,
    resulting in a NULL-pointer dereference later when a grab is activated.
    Avoid the segfault by ensuring that the pointer is always valid.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/devices.c b/dix/devices.c
index 83285b4..dc5de05 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -226,6 +226,8 @@ AddInputDevice(ClientPtr client, DeviceProc deviceProc, Bool autoStart)
 
     /* device grab defaults */
     dev->deviceGrab.grabTime = currentTime;
+    dev->deviceGrab.ActivateGrab = ActivateKeyboardGrab;
+    dev->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab;
 
     dev->coreEvents = TRUE;
 
commit e3f296d91dfe6b827195e1d387e1a04aa73b85c3
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sat May 9 10:33:20 2009 +1000

    xfree86: Remove superfluous ifdef DEBUG checks.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c
index 8040f58..8382d91 100644
--- a/hw/xfree86/common/xf86Bus.c
+++ b/hw/xfree86/common/xf86Bus.c
@@ -639,9 +639,7 @@ xf86EnableAccess(ScrnInfoPtr pScrn)
     register xf86AccessPtr pAcc;
     EntityAccessPtr tmp;
 
-#ifdef DEBUG
-    ErrorF("Enable access %i\n",pScrn->scrnIndex);
-#endif
+    DebugF("Enable access %i\n",pScrn->scrnIndex);
 
     /* Entity is not under access control or currently enabled */
     if (!pScrn->access) {
@@ -844,10 +842,8 @@ checkConflictBlock(resRange *range, resPtr pRes)
     case ResBlock:
 	if (range->rBegin < pRes->block_end &&
 	    range->rEnd > pRes->block_begin) {
-#ifdef DEBUG
-	    ErrorF("b-b conflict w: %lx %lx\n",
+	    DebugF("b-b conflict w: %lx %lx\n",
 		   pRes->block_begin,pRes->block_end);
-#endif
 	    return pRes->block_end < range->rEnd ?
 		pRes->block_end : range->rEnd;
 	}
@@ -856,12 +852,10 @@ checkConflictBlock(resRange *range, resPtr pRes)
 	if (pRes->sparse_base > range->rEnd) return 0;
 	
 	val = (~pRes->sparse_mask | pRes->sparse_base) & getMask(range->rEnd);
-#ifdef DEBUG
-	ErrorF("base = 0x%lx, mask = 0x%lx, begin = 0x%lx, end = 0x%lx ,"
+	DebugF("base = 0x%lx, mask = 0x%lx, begin = 0x%lx, end = 0x%lx ,"
 	       "val = 0x%lx\n",
 		pRes->sparse_base, pRes->sparse_mask, range->rBegin,
 		range->rEnd, val);
-#endif
 	i = sizeof(memType) * 8;
 	tmp = prev = pRes->sparse_base;
 	
@@ -873,11 +867,9 @@ checkConflictBlock(resRange *range, resPtr pRes)
 		prev = tmp;
 	}
 	if (tmp >= range->rBegin) {
-#ifdef DEBUG
-	    ErrorF("conflict found at: 0x%lx\n",tmp);
-	    ErrorF("b-d conflict w: %lx %lx\n",
+	    DebugF("conflict found at: 0x%lx\n",tmp);
+	    DebugF("b-d conflict w: %lx %lx\n",
 		   pRes->sparse_base,pRes->sparse_mask);
-#endif
 	    return tmp;
 	}
 	else
@@ -902,10 +894,8 @@ checkConflictSparse(resRange *range, resPtr pRes)
     case ResSparse:
 	tmp = pRes->sparse_mask & range->rMask;
 	if ((tmp & pRes->sparse_base) == (tmp & range->rBase)) {
-#ifdef DEBUG
-	    ErrorF("s-b conflict w: %lx %lx\n",
+	    DebugF("s-b conflict w: %lx %lx\n",
 		   pRes->sparse_base,pRes->sparse_mask);
-#endif
 	    return pRes->sparse_mask;
 	}
 	return 0;
@@ -918,9 +908,7 @@ checkConflictSparse(resRange *range, resPtr pRes)
 	tmp = prev = range->rBase;
 	
 	while (i) {
-#ifdef DEBUG
-	    ErrorF("tmp = 0x%lx\n",tmp);
-#endif
+	    DebugF("tmp = 0x%lx\n",tmp);
 	    tmp |= 1<< (--i) & val;
 	    if (tmp > pRes->block_end)
 		tmp = prev;
@@ -947,11 +935,9 @@ checkConflictSparse(resRange *range, resPtr pRes)
 		m_mask = mask > m_mask ? mask : m_mask;
 		base = base + mask + 1;
 	    }
-#ifdef DEBUG
-	    ErrorF("conflict found at: 0x%lx\n",tmp);
-	    ErrorF("b-b conflict w: %lx %lx\n",
+	    DebugF("conflict found at: 0x%lx\n",tmp);
+	    DebugF("b-b conflict w: %lx %lx\n",
 		   pRes->block_begin,pRes->block_end);
-#endif
 	    return ~m_mask; 
 	}
     }
@@ -1557,12 +1543,10 @@ xf86EnterServerState(xf86State state)
      * We take care not to call xf86BlockSIGIO() twice. 
      */
     SetSIGIOForState(state);
-#ifdef DEBUG
     if (state == SETUP)
-	ErrorF("Entering SETUP state\n");
+	DebugF("Entering SETUP state\n");
     else
-	ErrorF("Entering OPERATING state\n");
-#endif
+	DebugF("Entering OPERATING state\n");
 
     /* When servicing a dumb framebuffer we don't need to do anything */
     if (doFramebufferMode) return;
@@ -1620,10 +1604,8 @@ xf86EnterServerState(xf86State state)
 		xf86Screens[i]->busAccess = NULL;
 	}
 	
-#ifdef DEBUG
 	if (xf86Screens[i]->busAccess)
-	    ErrorF("Screen %i setting vga route\n",i);
-#endif
+	    DebugF("Screen %i setting vga route\n",i);
 	switch (rt) {
 	case MEM_IO:
 	    xf86MsgVerb(X_INFO, 3, "Screen %i shares mem & io resources\n",i);
@@ -1967,9 +1949,7 @@ xf86PostScreenInit(void)
 	return;
     }
 
-#ifdef DEBUG
-    ErrorF("PostScreenInit  generation: %i\n",serverGeneration);
-#endif
+    DebugF("PostScreenInit  generation: %i\n",serverGeneration);
     if (serverGeneration == 1) {
 	checkRoutingForScreens(OPERATING);
 	for (i=0; i<xf86NumEntities; i++) {
diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 7ea6197..2ecb639 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -1519,10 +1519,8 @@ configLayout(serverLayoutPtr servlayoutp, XF86ConfLayoutPtr conf_layout,
         adjp = (XF86ConfAdjacencyPtr)adjp->list.next;
     }
 
-#ifdef DEBUG
-    ErrorF("Found %d screens in the layout section %s",
+    DebugF("Found %d screens in the layout section %s",
            count, conf_layout->lay_identifier);
-#endif
     if (!count) /* alloc enough storage even if no screen is specified */
         count = 1;
 
@@ -1679,10 +1677,8 @@ configLayout(serverLayoutPtr servlayoutp, XF86ConfLayoutPtr conf_layout,
         count++;
         idp = (XF86ConfInactivePtr)idp->list.next;
     }
-#ifdef DEBUG
-    ErrorF("Found %d inactive devices in the layout section %s\n",
+    DebugF("Found %d inactive devices in the layout section %s\n",
            count, conf_layout->lay_identifier);
-#endif
     gdp = xnfalloc((count + 1) * sizeof(GDevRec));
     gdp[count].identifier = NULL;
     idp = conf_layout->lay_inactive_lst;
@@ -1704,10 +1700,8 @@ configLayout(serverLayoutPtr servlayoutp, XF86ConfLayoutPtr conf_layout,
         count++;
         irp = (XF86ConfInputrefPtr)irp->list.next;
     }
-#ifdef DEBUG
-    ErrorF("Found %d input devices in the layout section %s\n",
+    DebugF("Found %d input devices in the layout section %s\n",
            count, conf_layout->lay_identifier);
-#endif
     indp = xnfcalloc((count + 1), sizeof(IDevPtr));
     indp[count] = NULL;
     irp = conf_layout->lay_input_lst;
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index aa818c3..e9b4dfe 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -183,9 +183,7 @@ ProcessInputEvents (void)
 void
 xf86ProcessActionEvent(ActionEvent action, void *arg)
 {
-#ifdef DEBUG
-    ErrorF("ProcessActionEvent(%d,%x)\n", (int) action, arg);
-#endif
+    DebugF("ProcessActionEvent(%d,%x)\n", (int) action, arg);
     switch (action) {
     case ACTION_TERMINATE:
 	if (!xf86Info.dontZap) {
@@ -429,9 +427,7 @@ xf86VTSwitch(void)
   InputInfoPtr pInfo;
   IHPtr ih;
 
-#ifdef DEBUG
-  ErrorF("xf86VTSwitch()\n");
-#endif
+  DebugF("xf86VTSwitch()\n");
 
 #ifdef XFreeXDGA
   if(!DGAVTSwitch())
@@ -444,10 +440,8 @@ xf86VTSwitch(void)
    */
   if (xf86Screens[0]->vtSema) {
 
-#ifdef DEBUG
-    ErrorF("xf86VTSwitch: Leaving, xf86Exiting is %s\n",
+    DebugF("xf86VTSwitch: Leaving, xf86Exiting is %s\n",
 	   BOOLTOSTRING((dispatchException & DE_TERMINATE) ? TRUE : FALSE));
-#endif
 #ifdef DPMSExtension
     if (DPMSPowerLevel != DPMSModeOn)
 	DPMSSet(serverClient, DPMSModeOn);
@@ -483,9 +477,7 @@ xf86VTSwitch(void)
        * switch failed
        */
 
-#ifdef DEBUG
-      ErrorF("xf86VTSwitch: Leave failed\n");
-#endif
+      DebugF("xf86VTSwitch: Leave failed\n");
       prevSIGIO = xf86BlockSIGIO();
       xf86AccessEnter();
       xf86EnterServerState(SETUP);
@@ -534,9 +526,7 @@ xf86VTSwitch(void)
     }
   } else {
 
-#ifdef DEBUG
-    ErrorF("xf86VTSwitch: Entering\n");
-#endif
+    DebugF("xf86VTSwitch: Entering\n");
     if (!xf86VTSwitchTo()) return;
 
     prevSIGIO = xf86BlockSIGIO();
diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
index 0db7717..d59c638 100644
--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -212,15 +212,13 @@ xf86AllocateScreen(DriverPtr drv, int flags)
     xf86Screens[i]->CurrentAccess = &xf86CurrentAccess;
     xf86Screens[i]->resourceType = MEM_IO;
 
-#ifdef DEBUG
     /* OOps -- What's this ? */
-    ErrorF("xf86AllocateScreen - xf86Screens[%d]->pScreen = %p\n",
+    DebugF("xf86AllocateScreen - xf86Screens[%d]->pScreen = %p\n",
 	   i, xf86Screens[i]->pScreen );
     if ( NULL != xf86Screens[i]->pScreen ) {
-      ErrorF("xf86Screens[%d]->pScreen->CreateWindow = %p\n",
+      DebugF("xf86Screens[%d]->pScreen->CreateWindow = %p\n",
 	     i, xf86Screens[i]->pScreen->CreateWindow );
     }
-#endif
 
     xf86Screens[i]->DriverFunc = drv->driverFunc;
 
@@ -1735,9 +1733,7 @@ xf86MatchPciInstances(const char *driverName, int vendorID,
     }
 
 
-#ifdef DEBUG
-    ErrorF("%s instances found: %d\n", driverName, allocatedInstances);
-#endif
+    DebugF("%s instances found: %d\n", driverName, allocatedInstances);
 
    /*
     * Check for devices that need duplicated instances.  This is required
@@ -1820,9 +1816,7 @@ xf86MatchPciInstances(const char *driverName, int vendorID,
 	    instances[i].dev = dev;
 	}
     }
-#ifdef DEBUG
-    ErrorF("%s instances found: %d\n", driverName, numClaimedInstances);
-#endif
+    DebugF("%s instances found: %d\n", driverName, numClaimedInstances);
     /*
      * Now check that a chipset or chipID override in the device section
      * is valid.  Chipset has precedence over chipID.
@@ -1926,11 +1920,9 @@ xf86MatchPciInstances(const char *driverName, int vendorID,
         if (instances[i].screen == 0 && !xf86CheckPciSlot( pPci ))
 	    continue;
 
-#ifdef DEBUG
-	ErrorF("%s: card at %d:%d:%d is claimed by a Device section\n",
+	DebugF("%s: card at %d:%d:%d is claimed by a Device section\n",
 	       driverName, pPci->bus, pPci->dev, pPci->func);
-#endif
-	
+
 	/* Allocate an entry in the lists to be returned */
 	numFound++;
 	retEntities = xnfrealloc(retEntities, numFound * sizeof(int));
@@ -2621,10 +2613,8 @@ xf86RegisterRootWindowProperty(int ScrnIndex, Atom property, Atom type,
     int i;
     Bool existing = FALSE;
 
-#ifdef DEBUG
-    ErrorF("xf86RegisterRootWindowProperty(%d, %ld, %ld, %d, %ld, %p)\n",
+    DebugF("xf86RegisterRootWindowProperty(%d, %ld, %ld, %d, %ld, %p)\n",
 	   ScrnIndex, property, type, format, len, value);
-#endif
 
     if (ScrnIndex<0 || ScrnIndex>=xf86NumScreens) {
       return(BadMatch);
@@ -2660,15 +2650,11 @@ xf86RegisterRootWindowProperty(int ScrnIndex, Atom property, Atom type,
     pNewProp->size = len;
     pNewProp->data = value;
 
-#ifdef DEBUG
-    ErrorF("new property filled\n");
-#endif
+    DebugF("new property filled\n");
 
     if (NULL==xf86RegisteredPropertiesTable) {
-#ifdef DEBUG
-      ErrorF("creating xf86RegisteredPropertiesTable[] size %d\n",
+      DebugF("creating xf86RegisteredPropertiesTable[] size %d\n",
 	     xf86NumScreens);
-#endif
       if ( NULL==(xf86RegisteredPropertiesTable=(RootWinPropPtr*)xnfcalloc(sizeof(RootWinProp),xf86NumScreens) )) {
 	return(BadAlloc);
       }
@@ -2677,12 +2663,10 @@ xf86RegisterRootWindowProperty(int ScrnIndex, Atom property, Atom type,
       }
     }
 
-#ifdef DEBUG
-    ErrorF("xf86RegisteredPropertiesTable %p\n",
+    DebugF("xf86RegisteredPropertiesTable %p\n",
 	   (void *)xf86RegisteredPropertiesTable);
-    ErrorF("xf86RegisteredPropertiesTable[%d] %p\n",
+    DebugF("xf86RegisteredPropertiesTable[%d] %p\n",
 	   ScrnIndex, (void *)xf86RegisteredPropertiesTable[ScrnIndex]);
-#endif
 
     if (!existing) {
       if ( xf86RegisteredPropertiesTable[ScrnIndex] == NULL) {
@@ -2690,17 +2674,13 @@ xf86RegisterRootWindowProperty(int ScrnIndex, Atom property, Atom type,
       } else {
 	pRegProp = xf86RegisteredPropertiesTable[ScrnIndex];
 	while (pRegProp->next != NULL) {
-#ifdef DEBUG
-	  ErrorF("- next %p\n", (void *)pRegProp);
-#endif
+	  DebugF("- next %p\n", (void *)pRegProp);
 	  pRegProp = pRegProp->next;
         }
 	pRegProp->next = pNewProp;
       }
     }
-#ifdef DEBUG
-    ErrorF("xf86RegisterRootWindowProperty succeeded\n");
-#endif
+    DebugF("xf86RegisterRootWindowProperty succeeded\n");
     return(Success);
 }
 
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index cf28ae7..c4e5898 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -316,9 +316,7 @@ xf86CreateRootWindow(WindowPtr pWin)
   CreateWindowProcPtr CreateWindow = (CreateWindowProcPtr)
       dixLookupPrivate(&pScreen->devPrivates, xf86CreateRootWindowKey);
 
-#ifdef DEBUG
-  ErrorF("xf86CreateRootWindow(%p)\n", pWin);
-#endif
+  DebugF("xf86CreateRootWindow(%p)\n", pWin);
 
   if ( pScreen->CreateWindow != xf86CreateRootWindow ) {
     /* Can't find hook we are hung on */
@@ -365,9 +363,7 @@ xf86CreateRootWindow(WindowPtr pWin)
     }
   }
 
-#ifdef DEBUG
-  ErrorF("xf86CreateRootWindow() returns %d\n", ret);
-#endif
+  DebugF("xf86CreateRootWindow() returns %d\n", ret);
   return (ret);
 }
 
@@ -471,10 +467,8 @@ probe_devices_from_device_sections(DriverPtr drvp)
 		if ( (devList[i]->screen == 0) && !xf86CheckPciSlot( pPci ) )
 		  continue;
 
-#ifdef DEBUG
-		ErrorF("%s: card at %d:%d:%d is claimed by a Device section\n",
+		DebugF("%s: card at %d:%d:%d is claimed by a Device section\n",
 		       drvp->driverName, pPci->bus, pPci->dev, pPci->func);
-#endif
 
 		/* Allocate an entry in the lists to be returned */
 		entry = xf86ClaimPciSlot(pPci, drvp, device_id,
@@ -1246,12 +1240,10 @@ InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv)
 	FatalError("AddScreen/ScreenInit failed for driver %d\n", i);
       }
 
-#ifdef DEBUG
-      ErrorF("InitOutput - xf86Screens[%d]->pScreen = %p\n",
+      DebugF("InitOutput - xf86Screens[%d]->pScreen = %p\n",
 	     i, xf86Screens[i]->pScreen );
-      ErrorF("xf86Screens[%d]->pScreen->CreateWindow = %p\n",
+      DebugF("xf86Screens[%d]->pScreen->CreateWindow = %p\n",
 	     i, xf86Screens[i]->pScreen->CreateWindow );
-#endif
 
       dixSetPrivate(&screenInfo.screens[scr_index]->devPrivates,
 		    xf86CreateRootWindowKey,
diff --git a/hw/xfree86/common/xf86Mode.c b/hw/xfree86/common/xf86Mode.c
index 522d3c2..6dcebe1 100644
--- a/hw/xfree86/common/xf86Mode.c
+++ b/hw/xfree86/common/xf86Mode.c
@@ -654,10 +654,8 @@ xf86CheckModeForMonitor(DisplayModePtr mode, MonPtr monitor)
 	return MODE_ERROR;
     }
 
-#ifdef DEBUG
-    ErrorF("xf86CheckModeForMonitor(%p %s, %p %s)\n",
+    DebugF("xf86CheckModeForMonitor(%p %s, %p %s)\n",
 	   mode, mode->name, monitor, monitor->id);
-#endif
 
     /* Some basic mode validity checks */
     if (0 >= mode->HDisplay || mode->HDisplay > mode->HSyncStart ||
@@ -808,10 +806,8 @@ xf86InitialCheckModeForDriver(ScrnInfoPtr scrp, DisplayModePtr mode,
 	return MODE_ERROR;
     }
 
-#ifdef DEBUG
-    ErrorF("xf86InitialCheckModeForDriver(%p, %p %s, %p, 0x%x, %d, %d, %d)\n",
+    DebugF("xf86InitialCheckModeForDriver(%p, %p %s, %p, 0x%x, %d, %d, %d)\n",
 	   scrp, mode, mode->name , clockRanges, strategy, maxPitch,  virtualX, virtualY);
-#endif
 
     /* Some basic mode validity checks */
     if (0 >= mode->HDisplay || mode->HDisplay > mode->HSyncStart ||
@@ -1210,14 +1206,12 @@ xf86ValidateModes(ScrnInfoPtr scrp, DisplayModePtr availModes,
     range vrefresh[MAX_VREFRESH];
     Bool inferred_virtual = FALSE;
 
-#ifdef DEBUG
-    ErrorF("xf86ValidateModes(%p, %p, %p, %p,\n\t\t  %p, %d, %d, %d, %d, %d, %d, %d, %d, 0x%x)\n",
+    DebugF("xf86ValidateModes(%p, %p, %p, %p,\n\t\t  %p, %d, %d, %d, %d, %d, %d, %d, %d, 0x%x)\n",
 	   scrp, availModes, modeNames, clockRanges,
 	   linePitches, minPitch, maxPitch, pitchInc,
 	   minHeight, maxHeight, virtualX, virtualY,
 	   apertureSize, strategy
 	   );
-#endif
 
     /* Some sanity checking */
     if (scrp == NULL || scrp->name == NULL || !scrp->monitor ||
@@ -1860,15 +1854,13 @@ xf86SetCrtcForModes(ScrnInfoPtr scrp, int adjustFlags)
 
     do {
 	xf86SetModeCrtc(p, adjustFlags);
-#ifdef DEBUG
-	ErrorF("%sMode %s: %d (%d) %d %d (%d) %d %d (%d) %d %d (%d) %d\n",
+	DebugF("%sMode %s: %d (%d) %d %d (%d) %d %d (%d) %d %d (%d) %d\n",
 	       (p->type & M_T_DEFAULT) ? "Default " : "",
 	       p->name, p->CrtcHDisplay, p->CrtcHBlankStart,
 	       p->CrtcHSyncStart, p->CrtcHSyncEnd, p->CrtcHBlankEnd,
 	       p->CrtcHTotal, p->CrtcVDisplay, p->CrtcVBlankStart,
 	       p->CrtcVSyncStart, p->CrtcVSyncEnd, p->CrtcVBlankEnd,
 	       p->CrtcVTotal);
-#endif
 	p = p->next;
     } while (p != NULL && p != scrp->modes);
 }
diff --git a/hw/xfree86/common/xf86VidMode.c b/hw/xfree86/common/xf86VidMode.c
index d855bd1..49b86e7 100644
--- a/hw/xfree86/common/xf86VidMode.c
+++ b/hw/xfree86/common/xf86VidMode.c
@@ -56,12 +56,6 @@ static Bool VidModeClose(int i, ScreenPtr pScreen);
 
 #endif
 
-#ifdef DEBUG
-# define DEBUG_P(x) ErrorF(x"\n");
-#else
-# define DEBUG_P(x) /**/
-#endif
-
 Bool
 VidModeExtensionInit(ScreenPtr pScreen)
 {
@@ -69,7 +63,7 @@ VidModeExtensionInit(ScreenPtr pScreen)
     VidModePtr pVidMode;
     
     if (!xf86GetVidModeEnabled()) {
-	DEBUG_P("!xf86GetVidModeEnabled()");
+	DebugF("!xf86GetVidModeEnabled()\n");
 	return FALSE;
     }
 
@@ -77,7 +71,7 @@ VidModeExtensionInit(ScreenPtr pScreen)
 
     if (!dixSetPrivate(&pScreen->devPrivates, VidModeKey,
 		       xcalloc(sizeof(VidModeRec), 1))) {
-	DEBUG_P("xcalloc failed");
+	DebugF("xcalloc failed\n");
 	return FALSE;
     }
 
@@ -89,7 +83,7 @@ VidModeExtensionInit(ScreenPtr pScreen)
     VidModeCount++;
     return TRUE;
 #else
-    DEBUG_P("no vidmode extension");
+    DebugF("no vidmode extension\n");
     return FALSE;
 #endif
 }
@@ -123,13 +117,13 @@ VidModeAvailable(int scrnIndex)
     VidModePtr pVidMode;
 
     if (VidModeKey == NULL) {
-	DEBUG_P("VidModeKey == NULL");
+	DebugF("VidModeKey == NULL\n");
 	return FALSE;
     }
  
     pScrn = xf86Screens[scrnIndex];
     if (pScrn == NULL) {
-	DEBUG_P("pScrn == NULL");
+	DebugF("pScrn == NULL\n");
 	return FALSE;
     }
     
@@ -137,7 +131,7 @@ VidModeAvailable(int scrnIndex)
     if (pVidMode)
 	return TRUE;
     else {
-	DEBUG_P("pVidMode == NULL");
+	DebugF("pVidMode == NULL\n");
 	return FALSE;
     }
 }
diff --git a/hw/xfree86/common/xf86fbman.c b/hw/xfree86/common/xf86fbman.c
index 510c3d8..5b88717 100644
--- a/hw/xfree86/common/xf86fbman.c
+++ b/hw/xfree86/common/xf86fbman.c
@@ -802,10 +802,10 @@ LinearRemoveCBWrapper(FBAreaPtr area)
    xfree(pLink);
 }
 
-#ifdef DEBUG
 static void
-Dump(FBLinearLinkPtr pLink)
+DumpDebug(FBLinearLinkPtr pLink)
 {
+#ifdef DEBUG
    if (!pLink) ErrorF("MMmm, PLINK IS NULL!\n");
 
    while (pLink) {
@@ -817,8 +817,8 @@ Dump(FBLinearLinkPtr pLink)
 
 	 pLink = pLink->next;
    }
-}
 #endif
+}
 
 static FBLinearPtr
 AllocateLinear(
@@ -889,9 +889,7 @@ AllocateLinear(
    linear->linear.RemoveLinearCallback = NULL;
    linear->linear.devPrivate.ptr = NULL;
 
-#ifdef DEBUG
-   Dump(offman->LinearAreas);
-#endif
+   DumpDebug(offman->LinearAreas);
 
    return &(linear->linear);
 }
@@ -916,15 +914,11 @@ localAllocateOffscreenLinear(
 					   xf86FBScreenKey);
 
    /* Try to allocate from linear memory first...... */
-#ifdef DEBUG
-   ErrorF("ALLOCATING LINEAR\n");
-#endif
+   DebugF("ALLOCATING LINEAR\n");
    if ((linear = AllocateLinear(offman, length, gran, privData)))
   	return linear;
 
-#ifdef DEBUG
-   ErrorF("NOPE, ALLOCATING AREA\n");
-#endif
+   DebugF("NOPE, ALLOCATING AREA\n");
 
    if(!(link = xalloc(sizeof(FBLinearLink))))
      return NULL;
@@ -978,9 +972,7 @@ localAllocateOffscreenLinear(
    } else 
 	xfree(link);
 
-#ifdef DEBUG
-   Dump(offman->LinearAreas);
-#endif
+   DumpDebug(offman->LinearAreas);
 
    return linear;
 }
@@ -1005,17 +997,13 @@ localFreeOffscreenLinear(FBLinearPtr linear)
    }
 
    if(pLink->area) {  /* really an XY area */
-#ifdef DEBUG
-	ErrorF("FREEING AREA\n");
-#endif
+	DebugF("FREEING AREA\n");
 	localFreeOffscreenArea(pLink->area);
    	if(pLinkPrev)
 	    pLinkPrev->next = pLink->next;
    	else offman->LinearAreas = pLink->next;
    	xfree(pLink); 
-#ifdef DEBUG
-   	Dump(offman->LinearAreas);
-#endif
+	DumpDebug(offman->LinearAreas);
 	return;
    }
 
@@ -1037,10 +1025,8 @@ localFreeOffscreenLinear(FBLinearPtr linear)
     	}
    } 
    
-#ifdef DEBUG
-   ErrorF("FREEING LINEAR\n");
-   Dump(offman->LinearAreas);
-#endif
+   DebugF("FREEING LINEAR\n");
+   DumpDebug(offman->LinearAreas);
 }
 
 
diff --git a/hw/xfree86/common/xf86sbusBus.c b/hw/xfree86/common/xf86sbusBus.c
index 924c2bc..4936e75 100644
--- a/hw/xfree86/common/xf86sbusBus.c
+++ b/hw/xfree86/common/xf86sbusBus.c
@@ -435,9 +435,7 @@ xf86MatchSbusInstances(const char *driverName, int sbusDevId,
 	return actualcards;
     }
 
-#ifdef DEBUG
-    ErrorF("%s instances found: %d\n", driverName, allocatedInstances);
-#endif
+    DebugF("%s instances found: %d\n", driverName, allocatedInstances);
 
     for (i = 0; i < allocatedInstances; i++) {
 	char *promPath = NULL;
@@ -494,9 +492,7 @@ xf86MatchSbusInstances(const char *driverName, int sbusDevId,
 	    xfree(promPath);
     }
 
-#ifdef DEBUG
-    ErrorF("%s instances found: %d\n", driverName, numClaimedInstances);
-#endif
+    DebugF("%s instances found: %d\n", driverName, numClaimedInstances);
 
     /*
      * Of the claimed instances, check that another driver hasn't already
@@ -510,11 +506,9 @@ xf86MatchSbusInstances(const char *driverName, int sbusDevId,
 	if (!xf86CheckSbusSlot(psdp->fbNum))
 	    continue;
 
-#ifdef DEBUG
-	ErrorF("%s: card at fb%d %08x is claimed by a Device section\n",
+	DebugF("%s: card at fb%d %08x is claimed by a Device section\n",
 	       driverName, psdp->fbNum, psdp->node.node);
-#endif
-	
+
 	/* Allocate an entry in the lists to be returned */
 	numFound++;
 	retEntities = xnfrealloc(retEntities, numFound * sizeof(int));
diff --git a/hw/xfree86/os-support/linux/int10/linux.c b/hw/xfree86/os-support/linux/int10/linux.c
index 8274bbb..0cf3507 100644
--- a/hw/xfree86/os-support/linux/int10/linux.c
+++ b/hw/xfree86/os-support/linux/int10/linux.c
@@ -115,9 +115,7 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
     if ((!vidMem) || (!sysMem)) {
 	if ((fd = open(DEV_MEM, O_RDWR, 0)) >= 0) {
 	    if (!sysMem) {
-#ifdef DEBUG
-		ErrorF("Mapping sys bios area\n");
-#endif
+		DebugF("Mapping sys bios area\n");
 		if ((sysMem = mmap((void *)(SYS_BIOS), BIOS_SIZE,
 				   PROT_READ | PROT_EXEC,
 				   MAP_SHARED | MAP_FIXED, fd, SYS_BIOS))
@@ -128,9 +126,7 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
 		}
 	    }
 	    if (!vidMem) {
-#ifdef DEBUG
-		ErrorF("Mapping VRAM area\n");
-#endif
+		DebugF("Mapping VRAM area\n");
 		if ((vidMem = mmap((void *)(V_RAM), VRAM_SIZE,
 				   PROT_READ | PROT_WRITE | PROT_EXEC,
 				   MAP_SHARED | MAP_FIXED, fd, V_RAM))
@@ -162,9 +158,7 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
 	(pointer)xnfcalloc(1, ALLOC_ENTRIES(pagesize));
 
     if (!xf86IsEntityPrimary(entityIndex)) {
-#ifdef DEBUG
-	ErrorF("Mapping high memory area\n");
-#endif
+	DebugF("Mapping high memory area\n");
 	if ((high_mem = shmget(counter++, HIGH_MEM_SIZE,
 			       IPC_CREAT | SHM_R | SHM_W)) == -1) {
 	    if (errno == ENOSYS)
@@ -176,9 +170,7 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
 	    goto error1;
 	}
     } else {
-#ifdef DEBUG
-	ErrorF("Mapping Video BIOS\n");
-#endif
+	DebugF("Mapping Video BIOS\n");
 	videoBiosMapped = TRUE;
 	if ((fd = open(DEV_MEM, O_RDWR, 0)) >= 0) {
 	    if ((vMem = mmap((void *)(V_BIOS), SYS_BIOS - V_BIOS,
@@ -195,9 +187,7 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
     }
     ((linuxInt10Priv*)pInt->private)->highMem = high_mem;
     
-#ifdef DEBUG
-    ErrorF("Mapping 640kB area\n");
-#endif
+    DebugF("Mapping 640kB area\n");
     if ((low_mem = shmget(counter++, V_RAM,
 			  IPC_CREAT | SHM_R | SHM_W)) == -1) {
 	xf86DrvMsg(screen, X_ERROR,
@@ -229,16 +219,12 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
     
     Int10Current = pInt;
 
-#ifdef DEBUG
-    ErrorF("Mapping int area\n");
-#endif
+    DebugF("Mapping int area\n");
     if (xf86ReadBIOS(0, 0, (unsigned char *)0, LOW_PAGE_SIZE) < 0) {
 	xf86DrvMsg(screen, X_ERROR, "Cannot read int vect\n");
 	goto error3;
     }
-#ifdef DEBUG
-    ErrorF("done\n");
-#endif
+    DebugF("done\n");
     /*
      * Read in everything between V_BIOS and SYS_BIOS as some system BIOSes
      * have executable code there.  Note that xf86ReadBIOS() can only bring in
@@ -246,17 +232,13 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
      */
     if (!videoBiosMapped) {
 	memset((pointer)V_BIOS, 0, SYS_BIOS - V_BIOS);
-#ifdef DEBUG
-	ErrorF("Reading BIOS\n");
-#endif
+	DebugF("Reading BIOS\n");
 	for (cs = V_BIOS;  cs < SYS_BIOS;  cs += V_BIOS_SIZE)
 	    if (xf86ReadBIOS(cs, 0, (pointer)cs, V_BIOS_SIZE) < V_BIOS_SIZE)
 		xf86DrvMsg(screen, X_WARNING,
 			   "Unable to retrieve all of segment 0x%06lX.\n",
 			   (long)cs);
-#ifdef DEBUG
-	ErrorF("done\n");
-#endif
+	DebugF("done\n");
     }
 
     if (xf86IsEntityPrimary(entityIndex) && !(initPrimary(options))) {
diff --git a/hw/xfree86/os-support/linux/int10/vm86/linux_vm86.c b/hw/xfree86/os-support/linux/int10/vm86/linux_vm86.c
index 9412b07..34afd95 100644
--- a/hw/xfree86/os-support/linux/int10/vm86/linux_vm86.c
+++ b/hw/xfree86/os-support/linux/int10/vm86/linux_vm86.c
@@ -172,9 +172,7 @@ vm86_GP_fault(xf86Int10InfoPtr pInt)
 	break;
 
     case 0xf4:
-#ifdef DEBUG
-	ErrorF("hlt at %p\n", lina);
-#endif
+	DebugF("hlt at %p\n", lina);
 	return FALSE;
 
     case 0x0f:
diff --git a/hw/xfree86/os-support/linux/lnx_acpi.c b/hw/xfree86/os-support/linux/lnx_acpi.c
index 8e11f4a..5fad194 100644
--- a/hw/xfree86/os-support/linux/lnx_acpi.c
+++ b/hw/xfree86/os-support/linux/lnx_acpi.c
@@ -135,15 +135,11 @@ lnxACPIOpen(void)
     int r = -1;
     static int warned = 0;
 
-#ifdef DEBUG
-    ErrorF("ACPI: OSPMOpen called\n");
-#endif
+    DebugF("ACPI: OSPMOpen called\n");
     if (ACPIihPtr || !xf86Info.pmFlag)
 	return NULL;
    
-#ifdef DEBUG
-    ErrorF("ACPI: Opening device\n");
-#endif
+    DebugF("ACPI: Opening device\n");
     if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) > -1) {
 	memset(&addr, 0, sizeof(addr));
 	addr.sun_family = AF_UNIX;
@@ -172,10 +168,8 @@ static void
 lnxCloseACPI(void)
 {
     int fd;
-    
-#ifdef DEBUG
-   ErrorF("ACPI: Closing device\n");
-#endif
+
+    DebugF("ACPI: Closing device\n");
     if (ACPIihPtr) {
 	fd = xf86RemoveGeneralHandler(ACPIihPtr);
 	shutdown(fd, 2);
diff --git a/hw/xfree86/os-support/linux/lnx_apm.c b/hw/xfree86/os-support/linux/lnx_apm.c
index 9dae00e..4ccc7d6 100644
--- a/hw/xfree86/os-support/linux/lnx_apm.c
+++ b/hw/xfree86/os-support/linux/lnx_apm.c
@@ -160,15 +160,11 @@ lnxAPMOpen(void)
 {
     int fd, pfd;    
 
-#ifdef DEBUG
-    ErrorF("APM: OSPMOpen called\n");
-#endif
+    DebugF("APM: OSPMOpen called\n");
     if (APMihPtr || !xf86Info.pmFlag)
 	return NULL;
    
-#ifdef DEBUG
-    ErrorF("APM: Opening device\n");
-#endif
+    DebugF("APM: Opening device\n");
     if ((fd = open( APM_DEVICE, O_RDWR )) > -1) {
 	if (access( APM_PROC, R_OK ) ||
 	    ((pfd = open( APM_PROC, O_RDONLY)) == -1)) {
@@ -191,10 +187,8 @@ static void
 lnxCloseAPM(void)
 {
     int fd;
-    
-#ifdef DEBUG
-   ErrorF("APM: Closing device\n");
-#endif
+
+    DebugF("APM: Closing device\n");
     if (APMihPtr) {
 	fd = xf86RemoveGeneralHandler(APMihPtr);
 	close(fd);
diff --git a/hw/xfree86/os-support/linux/lnx_axp.c b/hw/xfree86/os-support/linux/lnx_axp.c
index f7151c8..d259999 100644
--- a/hw/xfree86/os-support/linux/lnx_axp.c
+++ b/hw/xfree86/os-support/linux/lnx_axp.c
@@ -69,21 +69,15 @@ lnxGetAXP(void)
     switch (count) {
     case 1:
       sscanf(res, "cpu model : %s",cpu);
-#ifdef DEBUG
-      ErrorF("CPU %s\n",cpu);
-#endif
+      DebugF("CPU %s\n",cpu);
       break;
     case 5:
       sscanf(res, "system type : %s",systype);
-#ifdef DEBUG
-      ErrorF("system type : %s\n",systype);
-#endif
+      DebugF("system type : %s\n",systype);
       break;
     case 6:
       sscanf(res, "system variation : %s",sysvari);
-#ifdef DEBUG
-      ErrorF("system variation: %s\n",sysvari);
-#endif
+      DebugF("system variation: %s\n",sysvari);
       break;
     }
     count++;
diff --git a/hw/xfree86/os-support/linux/lnx_font.c b/hw/xfree86/os-support/linux/lnx_font.c
index e9a5b6a..5b2696a 100644
--- a/hw/xfree86/os-support/linux/lnx_font.c
+++ b/hw/xfree86/os-support/linux/lnx_font.c
@@ -65,9 +65,7 @@ getfont(int *width, int *height,
     op.flags = 0;
 
     SYSCALL(result = ioctl(xf86Info.consoleFd, KDFONTOP, &op));
-#ifdef DEBUG
-    ErrorF("Console font read: h: %i count: %i\n",op.height,op.charcount);
-#endif
+    DebugF("Console font read: h: %i count: %i\n",op.height,op.charcount);
 
     if (!result) {
 
@@ -130,9 +128,7 @@ lnx_savefont(void)
     int fd;
     int width = 32, height = 32, charcount = 2048;
 
-#ifdef DEBUG
-    ErrorF("SAVE font\n");
-#endif
+    DebugF("SAVE font\n");
 
 #if CHECK_OS_VERSION
     /* Check if the kernel has full support for this */
@@ -247,9 +243,7 @@ lnx_restorefont(void)
 {
     if (lnxfont.data == NULL)
 	return FALSE;
-#ifdef DEBUG
-    ErrorF("RESTORE font\n");
-#endif
+    DebugF("RESTORE font\n");
 #if 0
     /* must wack the height to make the kernel reprogram the VGA registers */
     if (!setfont(lnxfont.width, lnxfont.height + 1, lnxfont.charcount,
diff --git a/hw/xfree86/os-support/linux/lnx_video.c b/hw/xfree86/os-support/linux/lnx_video.c
index ed35766..73409df 100644
--- a/hw/xfree86/os-support/linux/lnx_video.c
+++ b/hw/xfree86/os-support/linux/lnx_video.c
@@ -292,9 +292,7 @@ mtrr_add_wc_region(int screenNum, unsigned long base, unsigned long size,
 		 lbase = lbase >> 1, d_size <<= 1);
 	    while (d_size > n_size)
 		d_size = d_size >> 1;
-#ifdef DEBUG
-	    ErrorF("WC_BASE: 0x%lx WC_END: 0x%lx\n",base,base+d_size-1);
-#endif
+	    DebugF("WC_BASE: 0x%lx WC_END: 0x%lx\n",base,base+d_size-1);
 	    n_base += d_size;
 	    n_size -= d_size;
 	    if (n_size) {
@@ -424,11 +422,9 @@ mapVidMem(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
 
     realBase = Base & ~(getpagesize() - 1);
     alignOff = Base - realBase;
-#ifdef DEBUG
-    ErrorF("base: %lx, realBase: %lx, alignOff: %lx \n",
+    DebugF("base: %lx, realBase: %lx, alignOff: %lx \n",
 	   Base,realBase,alignOff);
-#endif
-    
+
 #if defined(__ia64__) || defined(__arm__) || defined(__s390__)
 #ifndef MAP_WRITECOMBINED
 #define MAP_WRITECOMBINED 0x00010000
@@ -469,9 +465,7 @@ mapVidMem(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
 		   " (0x%08lx,0x%lx) (%s)\n", Base, Size,
 		   strerror(errno));
     }
-#ifdef DEBUG
-    ErrorF("base: %lx aligned base: %lx\n",base, base + alignOff);
-#endif
+    DebugF("base: %lx aligned base: %lx\n",base, base + alignOff);
     return (char *)base + alignOff;
 }
 #endif /* !(__sparc__) */
@@ -481,10 +475,8 @@ unmapVidMem(int ScreenNum, pointer Base, unsigned long Size)
 {
     memType alignOff = (memType)Base 
 	- ((memType)Base & ~(getpagesize() - 1));
-    
-#ifdef DEBUG
-    ErrorF("alignment offset: %lx\n",alignOff);
-#endif
+
+    DebugF("alignment offset: %lx\n",alignOff);
     munmap((caddr_t)((memType)Base - alignOff), (Size + alignOff));
 }
 
diff --git a/hw/xfree86/os-support/sco/sco_video.c b/hw/xfree86/os-support/sco/sco_video.c
index 7edf71d..f63b71d 100644
--- a/hw/xfree86/os-support/sco/sco_video.c
+++ b/hw/xfree86/os-support/sco/sco_video.c
@@ -124,9 +124,7 @@ mapVidMemMMAP(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
   realBase = Base & ~(getpagesize() - 1);
   alignOff = Base - realBase;
 
-#ifdef DEBUG
-  ErrorF("base: %lx, realBase: %lx, alignOff: %lx\n", Base,realBase,alignOff);
-#endif
+  DebugF("base: %lx, realBase: %lx, alignOff: %lx\n", Base,realBase,alignOff);
 
   base = mmap((caddr_t)0, Size + alignOff,
 	      (flags & VIDMEM_READONLY) ? PROT_READ : (PROT_READ | PROT_WRITE),
@@ -138,9 +136,7 @@ mapVidMemMMAP(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
     return 0; /* NOTREACHED */
   }
 
-#ifdef DEBUG
-    ErrorF("base: %lx aligned base: %lx\n",base, base + alignOff);
-#endif
+    DebugF("base: %lx aligned base: %lx\n",base, base + alignOff);
     return (pointer)((char *)base + alignOff);
 }
 
diff --git a/hw/xfree86/os-support/shared/bios_mmap.c b/hw/xfree86/os-support/shared/bios_mmap.c
index 96d56bf..40afd5b 100644
--- a/hw/xfree86/os-support/shared/bios_mmap.c
+++ b/hw/xfree86/os-support/shared/bios_mmap.c
@@ -68,10 +68,8 @@ xf86ReadBIOS(unsigned long Base, unsigned long Offset, unsigned char *Buf,
 		close(fd);
 		return(-1);
 	}
-#ifdef DEBUG
-	ErrorF("xf86ReadBIOS: BIOS at 0x%08x has signature 0x%04x\n",
+	DebugF("xf86ReadBIOS: BIOS at 0x%08x has signature 0x%04x\n",
 		Base, ptr[0] | (ptr[1] << 8));
-#endif
 	(void)memcpy(Buf, (void *)(ptr + Offset), Len);
 	(void)munmap((caddr_t)ptr, mlen);
 	(void)close(fd);
diff --git a/hw/xfree86/os-support/shared/posix_tty.c b/hw/xfree86/os-support/shared/posix_tty.c
index 697d0e5..bf1bb03 100644
--- a/hw/xfree86/os-support/shared/posix_tty.c
+++ b/hw/xfree86/os-support/shared/posix_tty.c
@@ -400,17 +400,14 @@ int
 xf86ReadSerial (int fd, void *buf, int count)
 {
 	int r;
-#ifdef DEBUG
 	int i;
-#endif
+
 	SYSCALL (r = read (fd, buf, count));
-#ifdef DEBUG
-	ErrorF("ReadingSerial: 0x%x",
+	DebugF("ReadingSerial: 0x%x",
 	       (unsigned char)*(((unsigned char *)buf)));
 	for (i = 1; i < r; i++)
-	    ErrorF(", 0x%x",(unsigned char)*(((unsigned char *)buf) + i));
-	ErrorF("\n");
-#endif
+	    DebugF(", 0x%x",(unsigned char)*(((unsigned char *)buf) + i));
+	DebugF("\n");
 	return (r);
 }
 
@@ -418,14 +415,12 @@ int
 xf86WriteSerial (int fd, const void *buf, int count)
 {
 	int r;
-#ifdef DEBUG
 	int i;
 
-	ErrorF("WritingSerial: 0x%x",(unsigned char)*(((unsigned char *)buf)));
+	DebugF("WritingSerial: 0x%x",(unsigned char)*(((unsigned char *)buf)));
 	for (i = 1; i < count; i++)
 	    ErrorF(", 0x%x",(unsigned char)*(((unsigned char *)buf) + i));
-	ErrorF("\n");
-#endif
+	DebugF("\n");
 	SYSCALL (r = write (fd, buf, count));
 	return (r);
 }
@@ -482,9 +477,7 @@ xf86FlushInput(int fd)
 	struct timeval timeout;
 	char c[4];
 
-#ifdef DEBUG
-	ErrorF("FlushingSerial\n");
-#endif
+	DebugF("FlushingSerial\n");
 	if (tcflush(fd, TCIFLUSH) == 0)
 		return 0;
 
diff --git a/hw/xfree86/ramdac/TI.c b/hw/xfree86/ramdac/TI.c
index f421fc3..1c541d7 100644
--- a/hw/xfree86/ramdac/TI.c
+++ b/hw/xfree86/ramdac/TI.c
@@ -115,10 +115,8 @@ TIramdacCalculateMNPForClock(
     VCO = 8.0 * IntRef * best_m / best_n;
     ActualClock = VCO / ( 1 << p );
 
-#ifdef DEBUG
-    ErrorF( "f_out=%ld f_vco=%.1f n=%d m=%d p=%d\n",
+    DebugF( "f_out=%ld f_vco=%.1f n=%d m=%d p=%d\n",
 	    ActualClock, VCO, *rN, *rM, *rP);
-#endif
 
     return (ActualClock);
 }
diff --git a/hw/xfree86/vbe/vbeModes.c b/hw/xfree86/vbe/vbeModes.c
index fb730a7..1a4d240 100644
--- a/hw/xfree86/vbe/vbeModes.c
+++ b/hw/xfree86/vbe/vbeModes.c
@@ -414,11 +414,9 @@ VBESetModeParameters(ScrnInfoPtr pScrn, vbeInfoPtr pVbe)
 	    data->block->PixelClock = best->Clock * 1000;
 	    /* XXX May not have this. */
 	    clock = VBEGetPixelClock(pVbe, data->mode, data->block->PixelClock);
-#ifdef DEBUG
-	    ErrorF("Setting clock %.2fMHz, closest is %.2fMHz\n",
+	    DebugF("Setting clock %.2fMHz, closest is %.2fMHz\n",
 		(double)data->block->PixelClock / 1000000.0, 
 		(double)clock / 1000000.0);
-#endif
 	    if (clock)
 		data->block->PixelClock = clock;
 	    data->mode |= (1 << 11);
diff --git a/hw/xfree86/vgahw/vgaHW.c b/hw/xfree86/vgahw/vgaHW.c
index 9d466e3..004376b 100644
--- a/hw/xfree86/vgahw/vgaHW.c
+++ b/hw/xfree86/vgahw/vgaHW.c
@@ -1025,32 +1025,24 @@ vgaHWSaveMode(ScrnInfoPtr scrninfp, vgaRegPtr save)
 
     for (i = 0; i < save->numCRTC; i++) {
 	save->CRTC[i] = hwp->readCrtc(hwp, i);
-#ifdef DEBUG
-	ErrorF("CRTC[0x%02x] = 0x%02x\n", i, save->CRTC[i]);
-#endif
+	DebugF("CRTC[0x%02x] = 0x%02x\n", i, save->CRTC[i]);
     }
 
     hwp->enablePalette(hwp);
     for (i = 0; i < save->numAttribute; i++) {
 	save->Attribute[i] = hwp->readAttr(hwp, i);
-#ifdef DEBUG
-	ErrorF("Attribute[0x%02x] = 0x%02x\n", i, save->Attribute[i]);
-#endif
+	DebugF("Attribute[0x%02x] = 0x%02x\n", i, save->Attribute[i]);
     }
     hwp->disablePalette(hwp);
 
     for (i = 0; i < save->numGraphics; i++) {
 	save->Graphics[i] = hwp->readGr(hwp, i);
-#ifdef DEBUG
-	ErrorF("Graphics[0x%02x] = 0x%02x\n", i, save->Graphics[i]);
-#endif
+	DebugF("Graphics[0x%02x] = 0x%02x\n", i, save->Graphics[i]);
     }
 
     for (i = 1; i < save->numSequencer; i++) {
 	save->Sequencer[i] = hwp->readSeq(hwp, i);
-#ifdef DEBUG
-	ErrorF("Sequencer[0x%02x] = 0x%02x\n", i, save->Sequencer[i]);
-#endif
+	DebugF("Sequencer[0x%02x] = 0x%02x\n", i, save->Sequencer[i]);
     }
 }
 
@@ -1088,18 +1080,16 @@ vgaHWSaveColormap(ScrnInfoPtr scrninfp, vgaRegPtr save)
     hwp->writeDacReadAddr(hwp, 0x00);
     for (i = 0; i < 6; i++) {
 	save->DAC[i] = hwp->readDacData(hwp);
-#ifdef DEBUG
 	switch (i % 3) {
 	case 0:
-	    ErrorF("DAC[0x%02x] = 0x%02x, ", i / 3, save->DAC[i]);
+	    DebugF("DAC[0x%02x] = 0x%02x, ", i / 3, save->DAC[i]);
 	    break;
 	case 1:
-	    ErrorF("0x%02x, ", save->DAC[i]);
+	    DebugF("0x%02x, ", save->DAC[i]);
 	    break;
 	case 2:
-	    ErrorF("0x%02x\n", save->DAC[i]);
+	    DebugF("0x%02x\n", save->DAC[i]);
 	}
-#endif
     }
 
     /*
@@ -1131,18 +1121,16 @@ vgaHWSaveColormap(ScrnInfoPtr scrninfp, vgaRegPtr save)
 	for (i = 6; i < 768; i++) {
 	    save->DAC[i] = hwp->readDacData(hwp);
 	    DACDelay(hwp);
-#ifdef DEBUG
 	    switch (i % 3) {
 	    case 0:
-		ErrorF("DAC[0x%02x] = 0x%02x, ", i / 3, save->DAC[i]);
+		DebugF("DAC[0x%02x] = 0x%02x, ", i / 3, save->DAC[i]);
 		break;
 	    case 1:
-		ErrorF("0x%02x, ", save->DAC[i]);
+		DebugF("0x%02x, ", save->DAC[i]);
 		break;
 	    case 2:
-		ErrorF("0x%02x\n", save->DAC[i]);
+		DebugF("0x%02x\n", save->DAC[i]);
 	    }
-#endif
 	}
     }
 
@@ -1772,9 +1760,7 @@ vgaHWMapMem(ScrnInfoPtr scrp)
      * XXX This is not correct but we do it
      * for now.
      */
-#ifdef DEBUG
-    ErrorF("Mapping VGAMem\n");
-#endif
+    DebugF("Mapping VGAMem\n");
     hwp->Base = xf86MapDomainMemory(scr_index, VIDMEM_MMIO_32BIT, hwp->dev,
 				    hwp->MapPhys, hwp->MapSize);
     return hwp->Base != NULL;
@@ -1790,9 +1776,7 @@ vgaHWUnmapMem(ScrnInfoPtr scrp)
     if (hwp->Base == NULL)
 	return;
     
-#ifdef DEBUG
-    ErrorF("Unmapping VGAMem\n");
-#endif
+    DebugF("Unmapping VGAMem\n");
     xf86UnMapVidMem(scr_index, hwp->Base, hwp->MapSize);
     hwp->Base = NULL;
 }
commit 2f6253376df45e508284ff7766b186cfc7fb56d6
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sat May 9 10:33:20 2009 +1000

    xfree86: Remove superfluous ifdef DEBUG checks.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c
index 8040f58..8382d91 100644
--- a/hw/xfree86/common/xf86Bus.c
+++ b/hw/xfree86/common/xf86Bus.c
@@ -639,9 +639,7 @@ xf86EnableAccess(ScrnInfoPtr pScrn)
     register xf86AccessPtr pAcc;
     EntityAccessPtr tmp;
 
-#ifdef DEBUG
-    ErrorF("Enable access %i\n",pScrn->scrnIndex);
-#endif
+    DebugF("Enable access %i\n",pScrn->scrnIndex);
 
     /* Entity is not under access control or currently enabled */
     if (!pScrn->access) {
@@ -844,10 +842,8 @@ checkConflictBlock(resRange *range, resPtr pRes)
     case ResBlock:
 	if (range->rBegin < pRes->block_end &&
 	    range->rEnd > pRes->block_begin) {
-#ifdef DEBUG
-	    ErrorF("b-b conflict w: %lx %lx\n",
+	    DebugF("b-b conflict w: %lx %lx\n",
 		   pRes->block_begin,pRes->block_end);
-#endif
 	    return pRes->block_end < range->rEnd ?
 		pRes->block_end : range->rEnd;
 	}
@@ -856,12 +852,10 @@ checkConflictBlock(resRange *range, resPtr pRes)
 	if (pRes->sparse_base > range->rEnd) return 0;
 	
 	val = (~pRes->sparse_mask | pRes->sparse_base) & getMask(range->rEnd);
-#ifdef DEBUG
-	ErrorF("base = 0x%lx, mask = 0x%lx, begin = 0x%lx, end = 0x%lx ,"
+	DebugF("base = 0x%lx, mask = 0x%lx, begin = 0x%lx, end = 0x%lx ,"
 	       "val = 0x%lx\n",
 		pRes->sparse_base, pRes->sparse_mask, range->rBegin,
 		range->rEnd, val);
-#endif
 	i = sizeof(memType) * 8;
 	tmp = prev = pRes->sparse_base;
 	
@@ -873,11 +867,9 @@ checkConflictBlock(resRange *range, resPtr pRes)
 		prev = tmp;
 	}
 	if (tmp >= range->rBegin) {
-#ifdef DEBUG
-	    ErrorF("conflict found at: 0x%lx\n",tmp);
-	    ErrorF("b-d conflict w: %lx %lx\n",
+	    DebugF("conflict found at: 0x%lx\n",tmp);
+	    DebugF("b-d conflict w: %lx %lx\n",
 		   pRes->sparse_base,pRes->sparse_mask);
-#endif
 	    return tmp;
 	}
 	else
@@ -902,10 +894,8 @@ checkConflictSparse(resRange *range, resPtr pRes)
     case ResSparse:
 	tmp = pRes->sparse_mask & range->rMask;
 	if ((tmp & pRes->sparse_base) == (tmp & range->rBase)) {
-#ifdef DEBUG
-	    ErrorF("s-b conflict w: %lx %lx\n",
+	    DebugF("s-b conflict w: %lx %lx\n",
 		   pRes->sparse_base,pRes->sparse_mask);
-#endif
 	    return pRes->sparse_mask;
 	}
 	return 0;
@@ -918,9 +908,7 @@ checkConflictSparse(resRange *range, resPtr pRes)
 	tmp = prev = range->rBase;
 	
 	while (i) {
-#ifdef DEBUG
-	    ErrorF("tmp = 0x%lx\n",tmp);
-#endif
+	    DebugF("tmp = 0x%lx\n",tmp);
 	    tmp |= 1<< (--i) & val;
 	    if (tmp > pRes->block_end)
 		tmp = prev;
@@ -947,11 +935,9 @@ checkConflictSparse(resRange *range, resPtr pRes)
 		m_mask = mask > m_mask ? mask : m_mask;
 		base = base + mask + 1;
 	    }
-#ifdef DEBUG
-	    ErrorF("conflict found at: 0x%lx\n",tmp);
-	    ErrorF("b-b conflict w: %lx %lx\n",
+	    DebugF("conflict found at: 0x%lx\n",tmp);
+	    DebugF("b-b conflict w: %lx %lx\n",
 		   pRes->block_begin,pRes->block_end);
-#endif
 	    return ~m_mask; 
 	}
     }
@@ -1557,12 +1543,10 @@ xf86EnterServerState(xf86State state)
      * We take care not to call xf86BlockSIGIO() twice. 
      */
     SetSIGIOForState(state);
-#ifdef DEBUG
     if (state == SETUP)
-	ErrorF("Entering SETUP state\n");
+	DebugF("Entering SETUP state\n");
     else
-	ErrorF("Entering OPERATING state\n");
-#endif
+	DebugF("Entering OPERATING state\n");
 
     /* When servicing a dumb framebuffer we don't need to do anything */
     if (doFramebufferMode) return;
@@ -1620,10 +1604,8 @@ xf86EnterServerState(xf86State state)
 		xf86Screens[i]->busAccess = NULL;
 	}
 	
-#ifdef DEBUG
 	if (xf86Screens[i]->busAccess)
-	    ErrorF("Screen %i setting vga route\n",i);
-#endif
+	    DebugF("Screen %i setting vga route\n",i);
 	switch (rt) {
 	case MEM_IO:
 	    xf86MsgVerb(X_INFO, 3, "Screen %i shares mem & io resources\n",i);
@@ -1967,9 +1949,7 @@ xf86PostScreenInit(void)
 	return;
     }
 
-#ifdef DEBUG
-    ErrorF("PostScreenInit  generation: %i\n",serverGeneration);
-#endif
+    DebugF("PostScreenInit  generation: %i\n",serverGeneration);
     if (serverGeneration == 1) {
 	checkRoutingForScreens(OPERATING);
 	for (i=0; i<xf86NumEntities; i++) {
diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 8b07566..73235a9 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -1518,10 +1518,8 @@ configLayout(serverLayoutPtr servlayoutp, XF86ConfLayoutPtr conf_layout,
         adjp = (XF86ConfAdjacencyPtr)adjp->list.next;
     }
 
-#ifdef DEBUG
-    ErrorF("Found %d screens in the layout section %s",
+    DebugF("Found %d screens in the layout section %s",
            count, conf_layout->lay_identifier);
-#endif
     if (!count) /* alloc enough storage even if no screen is specified */
         count = 1;
 
@@ -1678,10 +1676,8 @@ configLayout(serverLayoutPtr servlayoutp, XF86ConfLayoutPtr conf_layout,
         count++;
         idp = (XF86ConfInactivePtr)idp->list.next;
     }
-#ifdef DEBUG
-    ErrorF("Found %d inactive devices in the layout section %s\n",
+    DebugF("Found %d inactive devices in the layout section %s\n",
            count, conf_layout->lay_identifier);
-#endif
     gdp = xnfalloc((count + 1) * sizeof(GDevRec));
     gdp[count].identifier = NULL;
     idp = conf_layout->lay_inactive_lst;
@@ -1703,10 +1699,8 @@ configLayout(serverLayoutPtr servlayoutp, XF86ConfLayoutPtr conf_layout,
         count++;
         irp = (XF86ConfInputrefPtr)irp->list.next;
     }
-#ifdef DEBUG
-    ErrorF("Found %d input devices in the layout section %s\n",
+    DebugF("Found %d input devices in the layout section %s\n",
            count, conf_layout->lay_identifier);
-#endif
     indp = xnfcalloc((count + 1), sizeof(IDevPtr));
     indp[count] = NULL;
     irp = conf_layout->lay_input_lst;
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index aa818c3..e9b4dfe 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -183,9 +183,7 @@ ProcessInputEvents (void)
 void
 xf86ProcessActionEvent(ActionEvent action, void *arg)
 {
-#ifdef DEBUG
-    ErrorF("ProcessActionEvent(%d,%x)\n", (int) action, arg);
-#endif
+    DebugF("ProcessActionEvent(%d,%x)\n", (int) action, arg);
     switch (action) {
     case ACTION_TERMINATE:
 	if (!xf86Info.dontZap) {
@@ -429,9 +427,7 @@ xf86VTSwitch(void)
   InputInfoPtr pInfo;
   IHPtr ih;
 
-#ifdef DEBUG
-  ErrorF("xf86VTSwitch()\n");
-#endif
+  DebugF("xf86VTSwitch()\n");
 
 #ifdef XFreeXDGA
   if(!DGAVTSwitch())
@@ -444,10 +440,8 @@ xf86VTSwitch(void)
    */
   if (xf86Screens[0]->vtSema) {
 
-#ifdef DEBUG
-    ErrorF("xf86VTSwitch: Leaving, xf86Exiting is %s\n",
+    DebugF("xf86VTSwitch: Leaving, xf86Exiting is %s\n",
 	   BOOLTOSTRING((dispatchException & DE_TERMINATE) ? TRUE : FALSE));
-#endif
 #ifdef DPMSExtension
     if (DPMSPowerLevel != DPMSModeOn)
 	DPMSSet(serverClient, DPMSModeOn);
@@ -483,9 +477,7 @@ xf86VTSwitch(void)
        * switch failed
        */
 
-#ifdef DEBUG
-      ErrorF("xf86VTSwitch: Leave failed\n");
-#endif
+      DebugF("xf86VTSwitch: Leave failed\n");
       prevSIGIO = xf86BlockSIGIO();
       xf86AccessEnter();
       xf86EnterServerState(SETUP);
@@ -534,9 +526,7 @@ xf86VTSwitch(void)
     }
   } else {
 
-#ifdef DEBUG
-    ErrorF("xf86VTSwitch: Entering\n");
-#endif
+    DebugF("xf86VTSwitch: Entering\n");
     if (!xf86VTSwitchTo()) return;
 
     prevSIGIO = xf86BlockSIGIO();
diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
index 61b3390..441efb0 100644
--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -212,15 +212,13 @@ xf86AllocateScreen(DriverPtr drv, int flags)
     xf86Screens[i]->CurrentAccess = &xf86CurrentAccess;
     xf86Screens[i]->resourceType = MEM_IO;
 
-#ifdef DEBUG
     /* OOps -- What's this ? */
-    ErrorF("xf86AllocateScreen - xf86Screens[%d]->pScreen = %p\n",
+    DebugF("xf86AllocateScreen - xf86Screens[%d]->pScreen = %p\n",
 	   i, xf86Screens[i]->pScreen );
     if ( NULL != xf86Screens[i]->pScreen ) {
-      ErrorF("xf86Screens[%d]->pScreen->CreateWindow = %p\n",
+      DebugF("xf86Screens[%d]->pScreen->CreateWindow = %p\n",
 	     i, xf86Screens[i]->pScreen->CreateWindow );
     }
-#endif
 
     xf86Screens[i]->DriverFunc = drv->driverFunc;
 
@@ -1735,9 +1733,7 @@ xf86MatchPciInstances(const char *driverName, int vendorID,
     }
 
 
-#ifdef DEBUG
-    ErrorF("%s instances found: %d\n", driverName, allocatedInstances);
-#endif
+    DebugF("%s instances found: %d\n", driverName, allocatedInstances);
 
    /*
     * Check for devices that need duplicated instances.  This is required
@@ -1820,9 +1816,7 @@ xf86MatchPciInstances(const char *driverName, int vendorID,
 	    instances[i].dev = dev;
 	}
     }
-#ifdef DEBUG
-    ErrorF("%s instances found: %d\n", driverName, numClaimedInstances);
-#endif
+    DebugF("%s instances found: %d\n", driverName, numClaimedInstances);
     /*
      * Now check that a chipset or chipID override in the device section
      * is valid.  Chipset has precedence over chipID.
@@ -1926,11 +1920,9 @@ xf86MatchPciInstances(const char *driverName, int vendorID,
         if (instances[i].screen == 0 && !xf86CheckPciSlot( pPci ))
 	    continue;
 
-#ifdef DEBUG
-	ErrorF("%s: card at %d:%d:%d is claimed by a Device section\n",
+	DebugF("%s: card at %d:%d:%d is claimed by a Device section\n",
 	       driverName, pPci->bus, pPci->dev, pPci->func);
-#endif
-	
+
 	/* Allocate an entry in the lists to be returned */
 	numFound++;
 	retEntities = xnfrealloc(retEntities, numFound * sizeof(int));
@@ -2621,10 +2613,8 @@ xf86RegisterRootWindowProperty(int ScrnIndex, Atom property, Atom type,
     int i;
     Bool existing = FALSE;
 
-#ifdef DEBUG
-    ErrorF("xf86RegisterRootWindowProperty(%d, %ld, %ld, %d, %ld, %p)\n",
+    DebugF("xf86RegisterRootWindowProperty(%d, %ld, %ld, %d, %ld, %p)\n",
 	   ScrnIndex, property, type, format, len, value);
-#endif
 
     if (ScrnIndex<0 || ScrnIndex>=xf86NumScreens) {
       return(BadMatch);
@@ -2660,15 +2650,11 @@ xf86RegisterRootWindowProperty(int ScrnIndex, Atom property, Atom type,
     pNewProp->size = len;
     pNewProp->data = value;
 
-#ifdef DEBUG
-    ErrorF("new property filled\n");
-#endif
+    DebugF("new property filled\n");
 
     if (NULL==xf86RegisteredPropertiesTable) {
-#ifdef DEBUG
-      ErrorF("creating xf86RegisteredPropertiesTable[] size %d\n",
+      DebugF("creating xf86RegisteredPropertiesTable[] size %d\n",
 	     xf86NumScreens);
-#endif
       if ( NULL==(xf86RegisteredPropertiesTable=(RootWinPropPtr*)xnfcalloc(sizeof(RootWinProp),xf86NumScreens) )) {
 	return(BadAlloc);
       }
@@ -2677,12 +2663,10 @@ xf86RegisterRootWindowProperty(int ScrnIndex, Atom property, Atom type,
       }
     }
 
-#ifdef DEBUG
-    ErrorF("xf86RegisteredPropertiesTable %p\n",
+    DebugF("xf86RegisteredPropertiesTable %p\n",
 	   (void *)xf86RegisteredPropertiesTable);
-    ErrorF("xf86RegisteredPropertiesTable[%d] %p\n",
+    DebugF("xf86RegisteredPropertiesTable[%d] %p\n",
 	   ScrnIndex, (void *)xf86RegisteredPropertiesTable[ScrnIndex]);
-#endif
 
     if (!existing) {
       if ( xf86RegisteredPropertiesTable[ScrnIndex] == NULL) {
@@ -2690,17 +2674,13 @@ xf86RegisterRootWindowProperty(int ScrnIndex, Atom property, Atom type,
       } else {
 	pRegProp = xf86RegisteredPropertiesTable[ScrnIndex];
 	while (pRegProp->next != NULL) {
-#ifdef DEBUG
-	  ErrorF("- next %p\n", (void *)pRegProp);
-#endif
+	  DebugF("- next %p\n", (void *)pRegProp);
 	  pRegProp = pRegProp->next;
         }
 	pRegProp->next = pNewProp;
       }
     }
-#ifdef DEBUG
-    ErrorF("xf86RegisterRootWindowProperty succeeded\n");
-#endif
+    DebugF("xf86RegisterRootWindowProperty succeeded\n");
     return(Success);
 }
 
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index cf28ae7..c4e5898 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -316,9 +316,7 @@ xf86CreateRootWindow(WindowPtr pWin)
   CreateWindowProcPtr CreateWindow = (CreateWindowProcPtr)
       dixLookupPrivate(&pScreen->devPrivates, xf86CreateRootWindowKey);
 
-#ifdef DEBUG
-  ErrorF("xf86CreateRootWindow(%p)\n", pWin);
-#endif
+  DebugF("xf86CreateRootWindow(%p)\n", pWin);
 
   if ( pScreen->CreateWindow != xf86CreateRootWindow ) {
     /* Can't find hook we are hung on */
@@ -365,9 +363,7 @@ xf86CreateRootWindow(WindowPtr pWin)
     }
   }
 
-#ifdef DEBUG
-  ErrorF("xf86CreateRootWindow() returns %d\n", ret);
-#endif
+  DebugF("xf86CreateRootWindow() returns %d\n", ret);
   return (ret);
 }
 
@@ -471,10 +467,8 @@ probe_devices_from_device_sections(DriverPtr drvp)
 		if ( (devList[i]->screen == 0) && !xf86CheckPciSlot( pPci ) )
 		  continue;
 
-#ifdef DEBUG
-		ErrorF("%s: card at %d:%d:%d is claimed by a Device section\n",
+		DebugF("%s: card at %d:%d:%d is claimed by a Device section\n",
 		       drvp->driverName, pPci->bus, pPci->dev, pPci->func);
-#endif
 
 		/* Allocate an entry in the lists to be returned */
 		entry = xf86ClaimPciSlot(pPci, drvp, device_id,
@@ -1246,12 +1240,10 @@ InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv)
 	FatalError("AddScreen/ScreenInit failed for driver %d\n", i);
       }
 
-#ifdef DEBUG
-      ErrorF("InitOutput - xf86Screens[%d]->pScreen = %p\n",
+      DebugF("InitOutput - xf86Screens[%d]->pScreen = %p\n",
 	     i, xf86Screens[i]->pScreen );
-      ErrorF("xf86Screens[%d]->pScreen->CreateWindow = %p\n",
+      DebugF("xf86Screens[%d]->pScreen->CreateWindow = %p\n",
 	     i, xf86Screens[i]->pScreen->CreateWindow );
-#endif
 
       dixSetPrivate(&screenInfo.screens[scr_index]->devPrivates,
 		    xf86CreateRootWindowKey,
diff --git a/hw/xfree86/common/xf86Mode.c b/hw/xfree86/common/xf86Mode.c
index 522d3c2..6dcebe1 100644
--- a/hw/xfree86/common/xf86Mode.c
+++ b/hw/xfree86/common/xf86Mode.c
@@ -654,10 +654,8 @@ xf86CheckModeForMonitor(DisplayModePtr mode, MonPtr monitor)
 	return MODE_ERROR;
     }
 
-#ifdef DEBUG
-    ErrorF("xf86CheckModeForMonitor(%p %s, %p %s)\n",
+    DebugF("xf86CheckModeForMonitor(%p %s, %p %s)\n",
 	   mode, mode->name, monitor, monitor->id);
-#endif
 
     /* Some basic mode validity checks */
     if (0 >= mode->HDisplay || mode->HDisplay > mode->HSyncStart ||
@@ -808,10 +806,8 @@ xf86InitialCheckModeForDriver(ScrnInfoPtr scrp, DisplayModePtr mode,
 	return MODE_ERROR;
     }
 
-#ifdef DEBUG
-    ErrorF("xf86InitialCheckModeForDriver(%p, %p %s, %p, 0x%x, %d, %d, %d)\n",
+    DebugF("xf86InitialCheckModeForDriver(%p, %p %s, %p, 0x%x, %d, %d, %d)\n",
 	   scrp, mode, mode->name , clockRanges, strategy, maxPitch,  virtualX, virtualY);
-#endif
 
     /* Some basic mode validity checks */
     if (0 >= mode->HDisplay || mode->HDisplay > mode->HSyncStart ||
@@ -1210,14 +1206,12 @@ xf86ValidateModes(ScrnInfoPtr scrp, DisplayModePtr availModes,
     range vrefresh[MAX_VREFRESH];
     Bool inferred_virtual = FALSE;
 
-#ifdef DEBUG
-    ErrorF("xf86ValidateModes(%p, %p, %p, %p,\n\t\t  %p, %d, %d, %d, %d, %d, %d, %d, %d, 0x%x)\n",
+    DebugF("xf86ValidateModes(%p, %p, %p, %p,\n\t\t  %p, %d, %d, %d, %d, %d, %d, %d, %d, 0x%x)\n",
 	   scrp, availModes, modeNames, clockRanges,
 	   linePitches, minPitch, maxPitch, pitchInc,
 	   minHeight, maxHeight, virtualX, virtualY,
 	   apertureSize, strategy
 	   );
-#endif
 
     /* Some sanity checking */
     if (scrp == NULL || scrp->name == NULL || !scrp->monitor ||
@@ -1860,15 +1854,13 @@ xf86SetCrtcForModes(ScrnInfoPtr scrp, int adjustFlags)
 
     do {
 	xf86SetModeCrtc(p, adjustFlags);
-#ifdef DEBUG
-	ErrorF("%sMode %s: %d (%d) %d %d (%d) %d %d (%d) %d %d (%d) %d\n",
+	DebugF("%sMode %s: %d (%d) %d %d (%d) %d %d (%d) %d %d (%d) %d\n",
 	       (p->type & M_T_DEFAULT) ? "Default " : "",
 	       p->name, p->CrtcHDisplay, p->CrtcHBlankStart,
 	       p->CrtcHSyncStart, p->CrtcHSyncEnd, p->CrtcHBlankEnd,
 	       p->CrtcHTotal, p->CrtcVDisplay, p->CrtcVBlankStart,
 	       p->CrtcVSyncStart, p->CrtcVSyncEnd, p->CrtcVBlankEnd,
 	       p->CrtcVTotal);
-#endif
 	p = p->next;
     } while (p != NULL && p != scrp->modes);
 }
diff --git a/hw/xfree86/common/xf86VidMode.c b/hw/xfree86/common/xf86VidMode.c
index d855bd1..49b86e7 100644
--- a/hw/xfree86/common/xf86VidMode.c
+++ b/hw/xfree86/common/xf86VidMode.c
@@ -56,12 +56,6 @@ static Bool VidModeClose(int i, ScreenPtr pScreen);
 
 #endif
 
-#ifdef DEBUG
-# define DEBUG_P(x) ErrorF(x"\n");
-#else
-# define DEBUG_P(x) /**/
-#endif
-
 Bool
 VidModeExtensionInit(ScreenPtr pScreen)
 {
@@ -69,7 +63,7 @@ VidModeExtensionInit(ScreenPtr pScreen)
     VidModePtr pVidMode;
     
     if (!xf86GetVidModeEnabled()) {
-	DEBUG_P("!xf86GetVidModeEnabled()");
+	DebugF("!xf86GetVidModeEnabled()\n");
 	return FALSE;
     }
 
@@ -77,7 +71,7 @@ VidModeExtensionInit(ScreenPtr pScreen)
 
     if (!dixSetPrivate(&pScreen->devPrivates, VidModeKey,
 		       xcalloc(sizeof(VidModeRec), 1))) {
-	DEBUG_P("xcalloc failed");
+	DebugF("xcalloc failed\n");
 	return FALSE;
     }
 
@@ -89,7 +83,7 @@ VidModeExtensionInit(ScreenPtr pScreen)
     VidModeCount++;
     return TRUE;
 #else
-    DEBUG_P("no vidmode extension");
+    DebugF("no vidmode extension\n");
     return FALSE;
 #endif
 }
@@ -123,13 +117,13 @@ VidModeAvailable(int scrnIndex)
     VidModePtr pVidMode;
 
     if (VidModeKey == NULL) {
-	DEBUG_P("VidModeKey == NULL");
+	DebugF("VidModeKey == NULL\n");
 	return FALSE;
     }
  
     pScrn = xf86Screens[scrnIndex];
     if (pScrn == NULL) {
-	DEBUG_P("pScrn == NULL");
+	DebugF("pScrn == NULL\n");
 	return FALSE;
     }
     
@@ -137,7 +131,7 @@ VidModeAvailable(int scrnIndex)
     if (pVidMode)
 	return TRUE;
     else {
-	DEBUG_P("pVidMode == NULL");
+	DebugF("pVidMode == NULL\n");
 	return FALSE;
     }
 }
diff --git a/hw/xfree86/common/xf86fbman.c b/hw/xfree86/common/xf86fbman.c
index 510c3d8..5b88717 100644
--- a/hw/xfree86/common/xf86fbman.c
+++ b/hw/xfree86/common/xf86fbman.c
@@ -802,10 +802,10 @@ LinearRemoveCBWrapper(FBAreaPtr area)
    xfree(pLink);
 }
 
-#ifdef DEBUG
 static void
-Dump(FBLinearLinkPtr pLink)
+DumpDebug(FBLinearLinkPtr pLink)
 {
+#ifdef DEBUG
    if (!pLink) ErrorF("MMmm, PLINK IS NULL!\n");
 
    while (pLink) {
@@ -817,8 +817,8 @@ Dump(FBLinearLinkPtr pLink)
 
 	 pLink = pLink->next;
    }
-}
 #endif
+}
 
 static FBLinearPtr
 AllocateLinear(
@@ -889,9 +889,7 @@ AllocateLinear(
    linear->linear.RemoveLinearCallback = NULL;
    linear->linear.devPrivate.ptr = NULL;
 
-#ifdef DEBUG
-   Dump(offman->LinearAreas);
-#endif
+   DumpDebug(offman->LinearAreas);
 
    return &(linear->linear);
 }
@@ -916,15 +914,11 @@ localAllocateOffscreenLinear(
 					   xf86FBScreenKey);
 
    /* Try to allocate from linear memory first...... */
-#ifdef DEBUG
-   ErrorF("ALLOCATING LINEAR\n");
-#endif
+   DebugF("ALLOCATING LINEAR\n");
    if ((linear = AllocateLinear(offman, length, gran, privData)))
   	return linear;
 
-#ifdef DEBUG
-   ErrorF("NOPE, ALLOCATING AREA\n");
-#endif
+   DebugF("NOPE, ALLOCATING AREA\n");
 
    if(!(link = xalloc(sizeof(FBLinearLink))))
      return NULL;
@@ -978,9 +972,7 @@ localAllocateOffscreenLinear(
    } else 
 	xfree(link);
 
-#ifdef DEBUG
-   Dump(offman->LinearAreas);
-#endif
+   DumpDebug(offman->LinearAreas);
 
    return linear;
 }
@@ -1005,17 +997,13 @@ localFreeOffscreenLinear(FBLinearPtr linear)
    }
 
    if(pLink->area) {  /* really an XY area */
-#ifdef DEBUG
-	ErrorF("FREEING AREA\n");
-#endif
+	DebugF("FREEING AREA\n");
 	localFreeOffscreenArea(pLink->area);
    	if(pLinkPrev)
 	    pLinkPrev->next = pLink->next;
    	else offman->LinearAreas = pLink->next;
    	xfree(pLink); 
-#ifdef DEBUG
-   	Dump(offman->LinearAreas);
-#endif
+	DumpDebug(offman->LinearAreas);
 	return;
    }
 
@@ -1037,10 +1025,8 @@ localFreeOffscreenLinear(FBLinearPtr linear)
     	}
    } 
    
-#ifdef DEBUG
-   ErrorF("FREEING LINEAR\n");
-   Dump(offman->LinearAreas);
-#endif
+   DebugF("FREEING LINEAR\n");
+   DumpDebug(offman->LinearAreas);
 }
 
 
diff --git a/hw/xfree86/common/xf86sbusBus.c b/hw/xfree86/common/xf86sbusBus.c
index 924c2bc..4936e75 100644
--- a/hw/xfree86/common/xf86sbusBus.c
+++ b/hw/xfree86/common/xf86sbusBus.c
@@ -435,9 +435,7 @@ xf86MatchSbusInstances(const char *driverName, int sbusDevId,
 	return actualcards;
     }
 
-#ifdef DEBUG
-    ErrorF("%s instances found: %d\n", driverName, allocatedInstances);
-#endif
+    DebugF("%s instances found: %d\n", driverName, allocatedInstances);
 
     for (i = 0; i < allocatedInstances; i++) {
 	char *promPath = NULL;
@@ -494,9 +492,7 @@ xf86MatchSbusInstances(const char *driverName, int sbusDevId,
 	    xfree(promPath);
     }
 
-#ifdef DEBUG
-    ErrorF("%s instances found: %d\n", driverName, numClaimedInstances);
-#endif
+    DebugF("%s instances found: %d\n", driverName, numClaimedInstances);
 
     /*
      * Of the claimed instances, check that another driver hasn't already
@@ -510,11 +506,9 @@ xf86MatchSbusInstances(const char *driverName, int sbusDevId,
 	if (!xf86CheckSbusSlot(psdp->fbNum))
 	    continue;
 
-#ifdef DEBUG
-	ErrorF("%s: card at fb%d %08x is claimed by a Device section\n",
+	DebugF("%s: card at fb%d %08x is claimed by a Device section\n",
 	       driverName, psdp->fbNum, psdp->node.node);
-#endif
-	
+
 	/* Allocate an entry in the lists to be returned */
 	numFound++;
 	retEntities = xnfrealloc(retEntities, numFound * sizeof(int));
diff --git a/hw/xfree86/os-support/linux/int10/linux.c b/hw/xfree86/os-support/linux/int10/linux.c
index 8274bbb..0cf3507 100644
--- a/hw/xfree86/os-support/linux/int10/linux.c
+++ b/hw/xfree86/os-support/linux/int10/linux.c
@@ -115,9 +115,7 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
     if ((!vidMem) || (!sysMem)) {
 	if ((fd = open(DEV_MEM, O_RDWR, 0)) >= 0) {
 	    if (!sysMem) {
-#ifdef DEBUG
-		ErrorF("Mapping sys bios area\n");
-#endif
+		DebugF("Mapping sys bios area\n");
 		if ((sysMem = mmap((void *)(SYS_BIOS), BIOS_SIZE,
 				   PROT_READ | PROT_EXEC,
 				   MAP_SHARED | MAP_FIXED, fd, SYS_BIOS))
@@ -128,9 +126,7 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
 		}
 	    }
 	    if (!vidMem) {
-#ifdef DEBUG
-		ErrorF("Mapping VRAM area\n");
-#endif
+		DebugF("Mapping VRAM area\n");
 		if ((vidMem = mmap((void *)(V_RAM), VRAM_SIZE,
 				   PROT_READ | PROT_WRITE | PROT_EXEC,
 				   MAP_SHARED | MAP_FIXED, fd, V_RAM))
@@ -162,9 +158,7 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
 	(pointer)xnfcalloc(1, ALLOC_ENTRIES(pagesize));
 
     if (!xf86IsEntityPrimary(entityIndex)) {
-#ifdef DEBUG
-	ErrorF("Mapping high memory area\n");
-#endif
+	DebugF("Mapping high memory area\n");
 	if ((high_mem = shmget(counter++, HIGH_MEM_SIZE,
 			       IPC_CREAT | SHM_R | SHM_W)) == -1) {
 	    if (errno == ENOSYS)
@@ -176,9 +170,7 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
 	    goto error1;
 	}
     } else {
-#ifdef DEBUG
-	ErrorF("Mapping Video BIOS\n");
-#endif
+	DebugF("Mapping Video BIOS\n");
 	videoBiosMapped = TRUE;
 	if ((fd = open(DEV_MEM, O_RDWR, 0)) >= 0) {
 	    if ((vMem = mmap((void *)(V_BIOS), SYS_BIOS - V_BIOS,
@@ -195,9 +187,7 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
     }
     ((linuxInt10Priv*)pInt->private)->highMem = high_mem;
     
-#ifdef DEBUG
-    ErrorF("Mapping 640kB area\n");
-#endif
+    DebugF("Mapping 640kB area\n");
     if ((low_mem = shmget(counter++, V_RAM,
 			  IPC_CREAT | SHM_R | SHM_W)) == -1) {
 	xf86DrvMsg(screen, X_ERROR,
@@ -229,16 +219,12 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
     
     Int10Current = pInt;
 
-#ifdef DEBUG
-    ErrorF("Mapping int area\n");
-#endif
+    DebugF("Mapping int area\n");
     if (xf86ReadBIOS(0, 0, (unsigned char *)0, LOW_PAGE_SIZE) < 0) {
 	xf86DrvMsg(screen, X_ERROR, "Cannot read int vect\n");
 	goto error3;
     }
-#ifdef DEBUG
-    ErrorF("done\n");
-#endif
+    DebugF("done\n");
     /*
      * Read in everything between V_BIOS and SYS_BIOS as some system BIOSes
      * have executable code there.  Note that xf86ReadBIOS() can only bring in
@@ -246,17 +232,13 @@ xf86ExtendedInitInt10(int entityIndex, int Flags)
      */
     if (!videoBiosMapped) {
 	memset((pointer)V_BIOS, 0, SYS_BIOS - V_BIOS);
-#ifdef DEBUG
-	ErrorF("Reading BIOS\n");
-#endif
+	DebugF("Reading BIOS\n");
 	for (cs = V_BIOS;  cs < SYS_BIOS;  cs += V_BIOS_SIZE)
 	    if (xf86ReadBIOS(cs, 0, (pointer)cs, V_BIOS_SIZE) < V_BIOS_SIZE)
 		xf86DrvMsg(screen, X_WARNING,
 			   "Unable to retrieve all of segment 0x%06lX.\n",
 			   (long)cs);
-#ifdef DEBUG
-	ErrorF("done\n");
-#endif
+	DebugF("done\n");
     }
 
     if (xf86IsEntityPrimary(entityIndex) && !(initPrimary(options))) {
diff --git a/hw/xfree86/os-support/linux/int10/vm86/linux_vm86.c b/hw/xfree86/os-support/linux/int10/vm86/linux_vm86.c
index 9412b07..34afd95 100644
--- a/hw/xfree86/os-support/linux/int10/vm86/linux_vm86.c
+++ b/hw/xfree86/os-support/linux/int10/vm86/linux_vm86.c
@@ -172,9 +172,7 @@ vm86_GP_fault(xf86Int10InfoPtr pInt)
 	break;
 
     case 0xf4:
-#ifdef DEBUG
-	ErrorF("hlt at %p\n", lina);
-#endif
+	DebugF("hlt at %p\n", lina);
 	return FALSE;
 
     case 0x0f:
diff --git a/hw/xfree86/os-support/linux/lnx_acpi.c b/hw/xfree86/os-support/linux/lnx_acpi.c
index 8e11f4a..5fad194 100644
--- a/hw/xfree86/os-support/linux/lnx_acpi.c
+++ b/hw/xfree86/os-support/linux/lnx_acpi.c
@@ -135,15 +135,11 @@ lnxACPIOpen(void)
     int r = -1;
     static int warned = 0;
 
-#ifdef DEBUG
-    ErrorF("ACPI: OSPMOpen called\n");
-#endif
+    DebugF("ACPI: OSPMOpen called\n");
     if (ACPIihPtr || !xf86Info.pmFlag)
 	return NULL;
    
-#ifdef DEBUG
-    ErrorF("ACPI: Opening device\n");
-#endif
+    DebugF("ACPI: Opening device\n");
     if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) > -1) {
 	memset(&addr, 0, sizeof(addr));
 	addr.sun_family = AF_UNIX;
@@ -172,10 +168,8 @@ static void
 lnxCloseACPI(void)
 {
     int fd;
-    
-#ifdef DEBUG
-   ErrorF("ACPI: Closing device\n");
-#endif
+
+    DebugF("ACPI: Closing device\n");
     if (ACPIihPtr) {
 	fd = xf86RemoveGeneralHandler(ACPIihPtr);
 	shutdown(fd, 2);
diff --git a/hw/xfree86/os-support/linux/lnx_apm.c b/hw/xfree86/os-support/linux/lnx_apm.c
index 9dae00e..4ccc7d6 100644
--- a/hw/xfree86/os-support/linux/lnx_apm.c
+++ b/hw/xfree86/os-support/linux/lnx_apm.c
@@ -160,15 +160,11 @@ lnxAPMOpen(void)
 {
     int fd, pfd;    
 
-#ifdef DEBUG
-    ErrorF("APM: OSPMOpen called\n");
-#endif
+    DebugF("APM: OSPMOpen called\n");
     if (APMihPtr || !xf86Info.pmFlag)
 	return NULL;
    
-#ifdef DEBUG
-    ErrorF("APM: Opening device\n");
-#endif
+    DebugF("APM: Opening device\n");
     if ((fd = open( APM_DEVICE, O_RDWR )) > -1) {
 	if (access( APM_PROC, R_OK ) ||
 	    ((pfd = open( APM_PROC, O_RDONLY)) == -1)) {
@@ -191,10 +187,8 @@ static void
 lnxCloseAPM(void)
 {
     int fd;
-    
-#ifdef DEBUG
-   ErrorF("APM: Closing device\n");
-#endif
+
+    DebugF("APM: Closing device\n");
     if (APMihPtr) {
 	fd = xf86RemoveGeneralHandler(APMihPtr);
 	close(fd);
diff --git a/hw/xfree86/os-support/linux/lnx_axp.c b/hw/xfree86/os-support/linux/lnx_axp.c
index f7151c8..d259999 100644
--- a/hw/xfree86/os-support/linux/lnx_axp.c
+++ b/hw/xfree86/os-support/linux/lnx_axp.c
@@ -69,21 +69,15 @@ lnxGetAXP(void)
     switch (count) {
     case 1:
       sscanf(res, "cpu model : %s",cpu);
-#ifdef DEBUG
-      ErrorF("CPU %s\n",cpu);
-#endif
+      DebugF("CPU %s\n",cpu);
       break;
     case 5:
       sscanf(res, "system type : %s",systype);
-#ifdef DEBUG
-      ErrorF("system type : %s\n",systype);
-#endif
+      DebugF("system type : %s\n",systype);
       break;
     case 6:
       sscanf(res, "system variation : %s",sysvari);
-#ifdef DEBUG
-      ErrorF("system variation: %s\n",sysvari);
-#endif
+      DebugF("system variation: %s\n",sysvari);
       break;
     }
     count++;
diff --git a/hw/xfree86/os-support/linux/lnx_font.c b/hw/xfree86/os-support/linux/lnx_font.c
index e9a5b6a..5b2696a 100644
--- a/hw/xfree86/os-support/linux/lnx_font.c
+++ b/hw/xfree86/os-support/linux/lnx_font.c
@@ -65,9 +65,7 @@ getfont(int *width, int *height,
     op.flags = 0;
 
     SYSCALL(result = ioctl(xf86Info.consoleFd, KDFONTOP, &op));
-#ifdef DEBUG
-    ErrorF("Console font read: h: %i count: %i\n",op.height,op.charcount);
-#endif
+    DebugF("Console font read: h: %i count: %i\n",op.height,op.charcount);
 
     if (!result) {
 
@@ -130,9 +128,7 @@ lnx_savefont(void)
     int fd;
     int width = 32, height = 32, charcount = 2048;
 
-#ifdef DEBUG
-    ErrorF("SAVE font\n");
-#endif
+    DebugF("SAVE font\n");
 
 #if CHECK_OS_VERSION
     /* Check if the kernel has full support for this */
@@ -247,9 +243,7 @@ lnx_restorefont(void)
 {
     if (lnxfont.data == NULL)
 	return FALSE;
-#ifdef DEBUG
-    ErrorF("RESTORE font\n");
-#endif
+    DebugF("RESTORE font\n");
 #if 0
     /* must wack the height to make the kernel reprogram the VGA registers */
     if (!setfont(lnxfont.width, lnxfont.height + 1, lnxfont.charcount,
diff --git a/hw/xfree86/os-support/linux/lnx_video.c b/hw/xfree86/os-support/linux/lnx_video.c
index ed35766..73409df 100644
--- a/hw/xfree86/os-support/linux/lnx_video.c
+++ b/hw/xfree86/os-support/linux/lnx_video.c
@@ -292,9 +292,7 @@ mtrr_add_wc_region(int screenNum, unsigned long base, unsigned long size,
 		 lbase = lbase >> 1, d_size <<= 1);
 	    while (d_size > n_size)
 		d_size = d_size >> 1;
-#ifdef DEBUG
-	    ErrorF("WC_BASE: 0x%lx WC_END: 0x%lx\n",base,base+d_size-1);
-#endif
+	    DebugF("WC_BASE: 0x%lx WC_END: 0x%lx\n",base,base+d_size-1);
 	    n_base += d_size;
 	    n_size -= d_size;
 	    if (n_size) {
@@ -424,11 +422,9 @@ mapVidMem(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
 
     realBase = Base & ~(getpagesize() - 1);
     alignOff = Base - realBase;
-#ifdef DEBUG
-    ErrorF("base: %lx, realBase: %lx, alignOff: %lx \n",
+    DebugF("base: %lx, realBase: %lx, alignOff: %lx \n",
 	   Base,realBase,alignOff);
-#endif
-    
+
 #if defined(__ia64__) || defined(__arm__) || defined(__s390__)
 #ifndef MAP_WRITECOMBINED
 #define MAP_WRITECOMBINED 0x00010000
@@ -469,9 +465,7 @@ mapVidMem(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
 		   " (0x%08lx,0x%lx) (%s)\n", Base, Size,
 		   strerror(errno));
     }
-#ifdef DEBUG
-    ErrorF("base: %lx aligned base: %lx\n",base, base + alignOff);
-#endif
+    DebugF("base: %lx aligned base: %lx\n",base, base + alignOff);
     return (char *)base + alignOff;
 }
 #endif /* !(__sparc__) */
@@ -481,10 +475,8 @@ unmapVidMem(int ScreenNum, pointer Base, unsigned long Size)
 {
     memType alignOff = (memType)Base 
 	- ((memType)Base & ~(getpagesize() - 1));
-    
-#ifdef DEBUG
-    ErrorF("alignment offset: %lx\n",alignOff);
-#endif
+
+    DebugF("alignment offset: %lx\n",alignOff);
     munmap((caddr_t)((memType)Base - alignOff), (Size + alignOff));
 }
 
diff --git a/hw/xfree86/os-support/sco/sco_video.c b/hw/xfree86/os-support/sco/sco_video.c
index 7edf71d..f63b71d 100644
--- a/hw/xfree86/os-support/sco/sco_video.c
+++ b/hw/xfree86/os-support/sco/sco_video.c
@@ -124,9 +124,7 @@ mapVidMemMMAP(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
   realBase = Base & ~(getpagesize() - 1);
   alignOff = Base - realBase;
 
-#ifdef DEBUG
-  ErrorF("base: %lx, realBase: %lx, alignOff: %lx\n", Base,realBase,alignOff);
-#endif
+  DebugF("base: %lx, realBase: %lx, alignOff: %lx\n", Base,realBase,alignOff);
 
   base = mmap((caddr_t)0, Size + alignOff,
 	      (flags & VIDMEM_READONLY) ? PROT_READ : (PROT_READ | PROT_WRITE),
@@ -138,9 +136,7 @@ mapVidMemMMAP(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
     return 0; /* NOTREACHED */
   }
 
-#ifdef DEBUG
-    ErrorF("base: %lx aligned base: %lx\n",base, base + alignOff);
-#endif
+    DebugF("base: %lx aligned base: %lx\n",base, base + alignOff);
     return (pointer)((char *)base + alignOff);
 }
 
diff --git a/hw/xfree86/os-support/shared/bios_mmap.c b/hw/xfree86/os-support/shared/bios_mmap.c
index 96d56bf..40afd5b 100644
--- a/hw/xfree86/os-support/shared/bios_mmap.c
+++ b/hw/xfree86/os-support/shared/bios_mmap.c
@@ -68,10 +68,8 @@ xf86ReadBIOS(unsigned long Base, unsigned long Offset, unsigned char *Buf,
 		close(fd);
 		return(-1);
 	}
-#ifdef DEBUG
-	ErrorF("xf86ReadBIOS: BIOS at 0x%08x has signature 0x%04x\n",
+	DebugF("xf86ReadBIOS: BIOS at 0x%08x has signature 0x%04x\n",
 		Base, ptr[0] | (ptr[1] << 8));
-#endif
 	(void)memcpy(Buf, (void *)(ptr + Offset), Len);
 	(void)munmap((caddr_t)ptr, mlen);
 	(void)close(fd);
diff --git a/hw/xfree86/os-support/shared/posix_tty.c b/hw/xfree86/os-support/shared/posix_tty.c
index 697d0e5..bf1bb03 100644
--- a/hw/xfree86/os-support/shared/posix_tty.c
+++ b/hw/xfree86/os-support/shared/posix_tty.c
@@ -400,17 +400,14 @@ int
 xf86ReadSerial (int fd, void *buf, int count)
 {
 	int r;
-#ifdef DEBUG
 	int i;
-#endif
+
 	SYSCALL (r = read (fd, buf, count));
-#ifdef DEBUG
-	ErrorF("ReadingSerial: 0x%x",
+	DebugF("ReadingSerial: 0x%x",
 	       (unsigned char)*(((unsigned char *)buf)));
 	for (i = 1; i < r; i++)
-	    ErrorF(", 0x%x",(unsigned char)*(((unsigned char *)buf) + i));
-	ErrorF("\n");
-#endif
+	    DebugF(", 0x%x",(unsigned char)*(((unsigned char *)buf) + i));
+	DebugF("\n");
 	return (r);
 }
 
@@ -418,14 +415,12 @@ int
 xf86WriteSerial (int fd, const void *buf, int count)
 {
 	int r;
-#ifdef DEBUG
 	int i;
 
-	ErrorF("WritingSerial: 0x%x",(unsigned char)*(((unsigned char *)buf)));
+	DebugF("WritingSerial: 0x%x",(unsigned char)*(((unsigned char *)buf)));
 	for (i = 1; i < count; i++)
 	    ErrorF(", 0x%x",(unsigned char)*(((unsigned char *)buf) + i));
-	ErrorF("\n");
-#endif
+	DebugF("\n");
 	SYSCALL (r = write (fd, buf, count));
 	return (r);
 }
@@ -482,9 +477,7 @@ xf86FlushInput(int fd)
 	struct timeval timeout;
 	char c[4];
 
-#ifdef DEBUG
-	ErrorF("FlushingSerial\n");
-#endif
+	DebugF("FlushingSerial\n");
 	if (tcflush(fd, TCIFLUSH) == 0)
 		return 0;
 
diff --git a/hw/xfree86/ramdac/TI.c b/hw/xfree86/ramdac/TI.c
index f421fc3..1c541d7 100644
--- a/hw/xfree86/ramdac/TI.c
+++ b/hw/xfree86/ramdac/TI.c
@@ -115,10 +115,8 @@ TIramdacCalculateMNPForClock(
     VCO = 8.0 * IntRef * best_m / best_n;
     ActualClock = VCO / ( 1 << p );
 
-#ifdef DEBUG
-    ErrorF( "f_out=%ld f_vco=%.1f n=%d m=%d p=%d\n",
+    DebugF( "f_out=%ld f_vco=%.1f n=%d m=%d p=%d\n",
 	    ActualClock, VCO, *rN, *rM, *rP);
-#endif
 
     return (ActualClock);
 }
diff --git a/hw/xfree86/vbe/vbeModes.c b/hw/xfree86/vbe/vbeModes.c
index fb730a7..1a4d240 100644
--- a/hw/xfree86/vbe/vbeModes.c
+++ b/hw/xfree86/vbe/vbeModes.c
@@ -414,11 +414,9 @@ VBESetModeParameters(ScrnInfoPtr pScrn, vbeInfoPtr pVbe)
 	    data->block->PixelClock = best->Clock * 1000;
 	    /* XXX May not have this. */
 	    clock = VBEGetPixelClock(pVbe, data->mode, data->block->PixelClock);
-#ifdef DEBUG
-	    ErrorF("Setting clock %.2fMHz, closest is %.2fMHz\n",
+	    DebugF("Setting clock %.2fMHz, closest is %.2fMHz\n",
 		(double)data->block->PixelClock / 1000000.0, 
 		(double)clock / 1000000.0);
-#endif
 	    if (clock)
 		data->block->PixelClock = clock;
 	    data->mode |= (1 << 11);
diff --git a/hw/xfree86/vgahw/vgaHW.c b/hw/xfree86/vgahw/vgaHW.c
index 9d466e3..004376b 100644
--- a/hw/xfree86/vgahw/vgaHW.c
+++ b/hw/xfree86/vgahw/vgaHW.c
@@ -1025,32 +1025,24 @@ vgaHWSaveMode(ScrnInfoPtr scrninfp, vgaRegPtr save)
 
     for (i = 0; i < save->numCRTC; i++) {
 	save->CRTC[i] = hwp->readCrtc(hwp, i);
-#ifdef DEBUG
-	ErrorF("CRTC[0x%02x] = 0x%02x\n", i, save->CRTC[i]);
-#endif
+	DebugF("CRTC[0x%02x] = 0x%02x\n", i, save->CRTC[i]);
     }
 
     hwp->enablePalette(hwp);
     for (i = 0; i < save->numAttribute; i++) {
 	save->Attribute[i] = hwp->readAttr(hwp, i);
-#ifdef DEBUG
-	ErrorF("Attribute[0x%02x] = 0x%02x\n", i, save->Attribute[i]);
-#endif
+	DebugF("Attribute[0x%02x] = 0x%02x\n", i, save->Attribute[i]);
     }
     hwp->disablePalette(hwp);
 
     for (i = 0; i < save->numGraphics; i++) {
 	save->Graphics[i] = hwp->readGr(hwp, i);
-#ifdef DEBUG
-	ErrorF("Graphics[0x%02x] = 0x%02x\n", i, save->Graphics[i]);
-#endif
+	DebugF("Graphics[0x%02x] = 0x%02x\n", i, save->Graphics[i]);
     }
 
     for (i = 1; i < save->numSequencer; i++) {
 	save->Sequencer[i] = hwp->readSeq(hwp, i);
-#ifdef DEBUG
-	ErrorF("Sequencer[0x%02x] = 0x%02x\n", i, save->Sequencer[i]);
-#endif
+	DebugF("Sequencer[0x%02x] = 0x%02x\n", i, save->Sequencer[i]);
     }
 }
 
@@ -1088,18 +1080,16 @@ vgaHWSaveColormap(ScrnInfoPtr scrninfp, vgaRegPtr save)
     hwp->writeDacReadAddr(hwp, 0x00);
     for (i = 0; i < 6; i++) {
 	save->DAC[i] = hwp->readDacData(hwp);
-#ifdef DEBUG
 	switch (i % 3) {
 	case 0:
-	    ErrorF("DAC[0x%02x] = 0x%02x, ", i / 3, save->DAC[i]);
+	    DebugF("DAC[0x%02x] = 0x%02x, ", i / 3, save->DAC[i]);
 	    break;
 	case 1:
-	    ErrorF("0x%02x, ", save->DAC[i]);
+	    DebugF("0x%02x, ", save->DAC[i]);
 	    break;
 	case 2:
-	    ErrorF("0x%02x\n", save->DAC[i]);
+	    DebugF("0x%02x\n", save->DAC[i]);
 	}
-#endif
     }
 
     /*
@@ -1131,18 +1121,16 @@ vgaHWSaveColormap(ScrnInfoPtr scrninfp, vgaRegPtr save)
 	for (i = 6; i < 768; i++) {
 	    save->DAC[i] = hwp->readDacData(hwp);
 	    DACDelay(hwp);
-#ifdef DEBUG
 	    switch (i % 3) {
 	    case 0:
-		ErrorF("DAC[0x%02x] = 0x%02x, ", i / 3, save->DAC[i]);
+		DebugF("DAC[0x%02x] = 0x%02x, ", i / 3, save->DAC[i]);
 		break;
 	    case 1:
-		ErrorF("0x%02x, ", save->DAC[i]);
+		DebugF("0x%02x, ", save->DAC[i]);
 		break;
 	    case 2:
-		ErrorF("0x%02x\n", save->DAC[i]);
+		DebugF("0x%02x\n", save->DAC[i]);
 	    }
-#endif
 	}
     }
 
@@ -1772,9 +1760,7 @@ vgaHWMapMem(ScrnInfoPtr scrp)
      * XXX This is not correct but we do it
      * for now.
      */
-#ifdef DEBUG
-    ErrorF("Mapping VGAMem\n");
-#endif
+    DebugF("Mapping VGAMem\n");
     hwp->Base = xf86MapDomainMemory(scr_index, VIDMEM_MMIO_32BIT, hwp->dev,
 				    hwp->MapPhys, hwp->MapSize);
     return hwp->Base != NULL;
@@ -1790,9 +1776,7 @@ vgaHWUnmapMem(ScrnInfoPtr scrp)
     if (hwp->Base == NULL)
 	return;
     
-#ifdef DEBUG
-    ErrorF("Unmapping VGAMem\n");
-#endif
+    DebugF("Unmapping VGAMem\n");
     xf86UnMapVidMem(scr_index, hwp->Base, hwp->MapSize);
     hwp->Base = NULL;
 }
commit b1b5ec45c1cb650ccb8c659218f9481379c777d9
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon May 11 12:53:56 2009 +1000

    kdrive: set Activate/Deactivate grab for input devices (#21591)
    
    X.Org Bug 21591 <http://bugs.freedesktop.org/show_bug.cgi?id=21591>

diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 7ed3601..0d216a9 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -915,6 +915,8 @@ KdAddKeyboard (KdKeyboardInfo *ki)
         return !Success;
     }
 
+    ki->dixdev->deviceGrab.ActivateGrab = ActivateKeyboardGrab;
+    ki->dixdev->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab;
     RegisterOtherDevice(ki->dixdev);
 
 #ifdef DEBUG
@@ -984,6 +986,8 @@ KdAddPointer (KdPointerInfo *pi)
         return BadDevice;
     }
 
+    pi->dixdev->deviceGrab.ActivateGrab = ActivatePointerGrab;
+    pi->dixdev->deviceGrab.DeactivateGrab = DeactivatePointerGrab;
     RegisterOtherDevice(pi->dixdev);
 
     for (prev = &kdPointers; *prev; prev = &(*prev)->next);
commit 6f9e22049862ee9ac7f604411d005d8bb1b2dd1c
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon May 11 12:51:40 2009 +1000

    dix: ensure Activate/DeactivateGrab has a valid value.
    
    Xephyr doesn't manually set Activate/DeactivateGrab for new devices,
    resulting in a NULL-pointer dereference later when a grab is activated.
    Avoid the segfault by ensuring that the pointer is always valid.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/devices.c b/dix/devices.c
index afe340b..6f464e7 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -224,6 +224,8 @@ AddInputDevice(ClientPtr client, DeviceProc deviceProc, Bool autoStart)
 
     /* device grab defaults */
     dev->deviceGrab.grabTime = currentTime;
+    dev->deviceGrab.ActivateGrab = ActivateKeyboardGrab;
+    dev->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab;
 
     dev->coreEvents = TRUE;
 
commit c1d7deca9281ba1df0df1abcea1fe7f841b10ff9
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue May 12 21:24:07 2009 +1000

    mi: un-deprecate miPointerWarpCursor
    
    This function was deprecated in ef68273f5bdb27a492ec0b69548ec4fbede46c08
    because it didn't take a device argument. The device argument was added in
    1c7568b8a1417257fa67c7fca69aa253099b9461 though, so the deprecation is
    obsolete.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/mi/mipointer.h b/mi/mipointer.h
index 8b13f08..7dc1ae7 100644
--- a/mi/mipointer.h
+++ b/mi/mipointer.h
@@ -108,7 +108,7 @@ extern _X_EXPORT void miPointerWarpCursor(
     ScreenPtr /*pScreen*/,
     int /*x*/,
     int /*y*/
-) _X_DEPRECATED;
+);
 
 /* Deprecated in favour of miPointerSetPosition. */
 extern _X_EXPORT void miPointerAbsoluteCursor(
commit 8609a4e883e917d1652fbe810108de99bc89713f
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Fri May 15 11:22:32 2009 -0700

    Correct some Sun license notices to Sun's standard X11 license format
    
    Signed-off-by: Alan Coopersmith <alan.coopersmith at sun.com>

diff --git a/COPYING b/COPYING
index e2a71d6..5dc8c1d 100644
--- a/COPYING
+++ b/COPYING
@@ -188,27 +188,6 @@ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
 THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 
-Copyright © 2006 Sun Microsystems
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation, and that the name of Sun Microsystems not be used in
-advertising or publicity pertaining to distribution of the software without
-specific, written prior permission.  Sun Microsystems makes no
-representations about the suitability of this software for any purpose.  It
-is provided "as is" without express or implied warranty.
-
-SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
-EVENT SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
-
 Copyright 1987-1991, 1993 by Digital Equipment Corporation, Maynard, Massachusetts.
 Copyright 1991 Massachusetts Institute of Technology, Cambridge, Massachusetts.
 Copyright 1991, 1993 Olivetti Research Limited, Cambridge, England.
diff --git a/composite/compalloc.c b/composite/compalloc.c
index 1bac9a4..3f427db 100644
--- a/composite/compalloc.c
+++ b/composite/compalloc.c
@@ -1,23 +1,30 @@
 /*
- * Copyright © 2006 Sun Microsystems
+ * Copyright © 2006 Sun Microsystems, Inc.  All rights reserved.
  *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Sun Microsystems not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Sun Microsystems makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
  *
- * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
  *
  * Copyright © 2003 Keith Packard
  *
diff --git a/composite/compext.c b/composite/compext.c
index 829c90f..608f29a 100644
--- a/composite/compext.c
+++ b/composite/compext.c
@@ -1,23 +1,30 @@
 /*
- * Copyright © 2006 Sun Microsystems
+ * Copyright © 2006 Sun Microsystems, Inc.  All rights reserved.
  *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Sun Microsystems not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Sun Microsystems makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
  *
- * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
  *
  * Copyright © 2003 Keith Packard
  *
diff --git a/composite/compinit.c b/composite/compinit.c
index ee269af..dfc3929 100644
--- a/composite/compinit.c
+++ b/composite/compinit.c
@@ -1,23 +1,30 @@
 /*
- * Copyright © 2006 Sun Microsystems
+ * Copyright © 2006 Sun Microsystems, Inc.  All rights reserved.
  *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Sun Microsystems not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Sun Microsystems makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
  *
- * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
  *
  * Copyright © 2003 Keith Packard
  *
diff --git a/composite/compint.h b/composite/compint.h
index fd2fea1..852c277 100644
--- a/composite/compint.h
+++ b/composite/compint.h
@@ -1,23 +1,30 @@
 /*
- * Copyright © 2006 Sun Microsystems
+ * Copyright © 2006 Sun Microsystems, Inc.  All rights reserved.
  *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Sun Microsystems not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Sun Microsystems makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
  *
- * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
  *
  * Copyright © 2003 Keith Packard
  *
diff --git a/composite/compoverlay.c b/composite/compoverlay.c
index 68b4f12..e213ce7 100644
--- a/composite/compoverlay.c
+++ b/composite/compoverlay.c
@@ -1,23 +1,30 @@
 /*
- * Copyright © 2006 Sun Microsystems
+ * Copyright © 2006 Sun Microsystems, Inc.  All rights reserved.
  *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Sun Microsystems not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Sun Microsystems makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
  *
- * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
  *
  * Copyright © 2003 Keith Packard
  *
diff --git a/composite/compwindow.c b/composite/compwindow.c
index 577fa73..4267a51 100644
--- a/composite/compwindow.c
+++ b/composite/compwindow.c
@@ -1,23 +1,30 @@
 /*
- * Copyright © 2006 Sun Microsystems
+ * Copyright © 2006 Sun Microsystems, Inc.  All rights reserved.
  *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Sun Microsystems not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Sun Microsystems makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
  *
- * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
  *
  * Copyright © 2003 Keith Packard
  *
diff --git a/xfixes/cursor.c b/xfixes/cursor.c
index 6fa2dff..534c826 100644
--- a/xfixes/cursor.c
+++ b/xfixes/cursor.c
@@ -1,23 +1,30 @@
 /*
- * Copyright © 2006 Sun Microsystems
+ * Copyright © 2006 Sun Microsystems, Inc.  All rights reserved.
  *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Sun Microsystems not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Sun Microsystems makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
  *
- * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
  *
  * Copyright © 2002 Keith Packard
  *
diff --git a/xfixes/xfixes.c b/xfixes/xfixes.c
index 3b8ed5a..25c92ea 100644
--- a/xfixes/xfixes.c
+++ b/xfixes/xfixes.c
@@ -1,23 +1,30 @@
 /*
- * Copyright © 2006 Sun Microsystems
+ * Copyright © 2006 Sun Microsystems, Inc.  All rights reserved.
  *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Sun Microsystems not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Sun Microsystems makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
  *
- * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
  *
  * Copyright © 2002 Keith Packard
  *
diff --git a/xfixes/xfixesint.h b/xfixes/xfixesint.h
index 04117a4..d7c53ee 100644
--- a/xfixes/xfixesint.h
+++ b/xfixes/xfixesint.h
@@ -1,23 +1,30 @@
 /*
- * Copyright © 2006 Sun Microsystems
+ * Copyright © 2006 Sun Microsystems, Inc.  All rights reserved.
  *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Sun Microsystems not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Sun Microsystems makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
  *
- * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
  *
  * Copyright © 2002 Keith Packard
  *
commit 94c5093c8bc803d0b14429b5a4d07ae46da865cc
Author: David Marx <David.Marx at Sun.COM>
Date:   Wed May 13 17:53:30 2009 -0700

    Solaris: Make sure non-inline versions of asm routines end with ret statements
    
    Signed-off-by: Alan Coopersmith <alan.coopersmith at sun.com>

diff --git a/hw/xfree86/os-support/solaris/solaris-amd64.S b/hw/xfree86/os-support/solaris/solaris-amd64.S
index 9f5e58c..4a0e0f4 100644
--- a/hw/xfree86/os-support/solaris/solaris-amd64.S
+++ b/hw/xfree86/os-support/solaris/solaris-amd64.S
@@ -32,7 +32,7 @@
 #define _ASM
 #include <sys/asm_linkage.h>
 #define FUNCTION_START(f,n)	ENTRY(f)
-#define FUNCTION_END(f)		SET_SIZE(f)
+#define FUNCTION_END(f)		ret; SET_SIZE(f)
 #endif
 
 	FUNCTION_START(inb,4)
diff --git a/hw/xfree86/os-support/solaris/solaris-ia32.S b/hw/xfree86/os-support/solaris/solaris-ia32.S
index e2d9cf6..280154b 100644
--- a/hw/xfree86/os-support/solaris/solaris-ia32.S
+++ b/hw/xfree86/os-support/solaris/solaris-ia32.S
@@ -32,7 +32,7 @@
 #define _ASM
 #include <sys/asm_linkage.h>
 #define FUNCTION_START(f,n)	ENTRY(f)
-#define FUNCTION_END(f)		SET_SIZE(f)
+#define FUNCTION_END(f)		ret; SET_SIZE(f)
 #endif
 
 	FUNCTION_START(inb,4)
diff --git a/hw/xfree86/os-support/solaris/solaris-sparcv8plus.S b/hw/xfree86/os-support/solaris/solaris-sparcv8plus.S
index fb23942..dbaa030 100644
--- a/hw/xfree86/os-support/solaris/solaris-sparcv8plus.S
+++ b/hw/xfree86/os-support/solaris/solaris-sparcv8plus.S
@@ -33,7 +33,7 @@
 #define _ASM
 #include <sys/asm_linkage.h>
 #define FUNCTION_START(f,n)	ENTRY(f)
-#define FUNCTION_END(f)		SET_SIZE(f)
+#define FUNCTION_END(f)		retl; nop; SET_SIZE(f)
 #endif
 
 /* Converted from common/compiler.h gcc inline format to Sun cc inline
commit 2be5eecb4b0f30b9c55d12521415edbb88c1f8fd
Author: Julien Cristau <jcristau at debian.org>
Date:   Fri May 15 17:29:32 2009 +0200

    xfree86: add edid quirk for Samsung Syncmaster 2333HD
    
    It reports vertical size in cm in the detailed mode.
    X.Org bug#21750 <http://bugs.freedesktop.org/show_bug.cgi?id=21750>
    
    Reported-by: Peter Poklop <Peter.Poklop at gmx.at>
    Signed-off-by: Julien Cristau <jcristau at debian.org>

diff --git a/hw/xfree86/modes/xf86EdidModes.c b/hw/xfree86/modes/xf86EdidModes.c
index 9e6a666..4340edd 100644
--- a/hw/xfree86/modes/xf86EdidModes.c
+++ b/hw/xfree86/modes/xf86EdidModes.c
@@ -160,6 +160,11 @@ static Bool quirk_detailed_v_in_cm (int scrnIndex, xf86MonPtr DDC)
 	DDC->vendor.prod_id == 47360)
 	return TRUE;
 
+    /* Bug #21750: Samsung Syncmaster 2333HD */
+    if (memcmp (DDC->vendor.name, "SAM", 4) == 0 &&
+	DDC->vendor.prod_id == 1157)
+	return TRUE;
+
     return FALSE;
 }
 
commit 7c8327f0a75087a85864256a9cea80dd4b86def5
Author: Michel Dänzer <daenzer at vmware.com>
Date:   Fri May 15 15:48:37 2009 +0200

    EXA: Always damage glyph cache pixmap manually after uploading a glyph.
    
    Signed-off-by: Michel Dänzer <daenzer at vmware.com>

diff --git a/exa/exa_glyphs.c b/exa/exa_glyphs.c
index d2a0168..b8d2e52 100644
--- a/exa/exa_glyphs.c
+++ b/exa/exa_glyphs.c
@@ -354,8 +354,14 @@ exaGlyphCacheHashRemove(ExaGlyphCachePtr cache,
  * is to use the UploadToScreen() driver hook; this allows us to
  * pipeline glyph uploads and to avoid creating offscreen pixmaps for
  * glyphs that we'll never use again.
+ *
+ * If we can't do it with UploadToScreen (because the glyph is offscreen, etc),
+ * we fall back to CompositePicture.
+ *
+ * We need to damage the cache pixmap manually in either case because the damage
+ * layer unwrapped the picture screen before calling exaGlyphs.
  */
-static Bool
+static void
 exaGlyphCacheUploadGlyph(ScreenPtr         pScreen,
 			 ExaGlyphCachePtr  cache,
 			 int               pos,
@@ -369,16 +375,16 @@ exaGlyphCacheUploadGlyph(ScreenPtr         pScreen,
     ExaMigrationRec pixmaps[1];
 
     if (!pExaScr->info->UploadToScreen || pExaScr->swappedOut || pExaPixmap->accel_blocked)
-	return FALSE;
+	goto composite;
 
     /* If the glyph pixmap is already uploaded, no point in doing
      * things this way */
     if (exaPixmapIsOffscreen(pGlyphPixmap))
-	return FALSE;
+	goto composite;
 
     /* UploadToScreen only works if bpp match */
     if (pGlyphPixmap->drawable.bitsPerPixel != pCachePixmap->drawable.bitsPerPixel)
-	return FALSE;
+	goto composite;
 
     /* cache pixmap must be offscreen. */
     pixmaps[0].as_dst = TRUE;
@@ -388,26 +394,37 @@ exaGlyphCacheUploadGlyph(ScreenPtr         pScreen,
     exaDoMigration (pixmaps, 1, TRUE);
 
     if (!exaPixmapIsOffscreen(pCachePixmap))
-	return FALSE;
+	goto composite;
 
     /* CACHE_{X,Y} are in pixmap coordinates, no need for cache{X,Y}off */
-    if (!pExaScr->info->UploadToScreen(pCachePixmap,
-				       CACHE_X(pos),
-				       CACHE_Y(pos),
-				       pGlyph->info.width,
-				       pGlyph->info.height,
-				       (char *)pExaPixmap->sys_ptr,
-				       pExaPixmap->sys_pitch))
-	return FALSE;
-
-    /* This pixmap should never be bound to a window, so no need to offset coordinates. */
+    if (pExaScr->info->UploadToScreen(pCachePixmap,
+				      CACHE_X(pos),
+				      CACHE_Y(pos),
+				      pGlyph->info.width,
+				      pGlyph->info.height,
+				      (char *)pExaPixmap->sys_ptr,
+				      pExaPixmap->sys_pitch))
+	goto damage;
+
+composite:
+    CompositePicture (PictOpSrc,
+		      pGlyphPicture,
+		      None,
+		      cache->picture,
+		      0, 0,
+		      0, 0,
+		      CACHE_X(pos),
+		      CACHE_Y(pos),
+		      pGlyph->info.width,
+		      pGlyph->info.height);
+
+damage:
+    /* The cache pixmap isn't a window, so no need to offset coordinates. */
     exaPixmapDirty (pCachePixmap,
 		    CACHE_X(pos),
 		    CACHE_Y(pos),
-		    CACHE_X(pos) + pGlyph->info.width,
-		    CACHE_Y(pos) + pGlyph->info.height);
-
-    return TRUE;
+		    CACHE_X(pos) + cache->glyphWidth,
+		    CACHE_Y(pos) + cache->glyphHeight);
 }
 
 static ExaGlyphCacheResult
@@ -483,23 +500,7 @@ exaGlyphCacheBufferGlyph(ScreenPtr         pScreen,
 	    cache->evictionPosition = rand() % cache->size;
 	}
 
-	/* Now actually upload the glyph into the cache picture; if
-	 * we can't do it with UploadToScreen (because the glyph is
-	 * offscreen, etc), we fall back to CompositePicture.
-	 */
-	if (!exaGlyphCacheUploadGlyph(pScreen, cache, pos, pGlyph)) {
-	    CompositePicture (PictOpSrc,
-			      GlyphPicture(pGlyph)[pScreen->myNum],
-			      None,
-			      cache->picture,
-			      0, 0,
-			      0, 0,
-			      CACHE_X(pos),
-			      CACHE_Y(pos),
-			      pGlyph->info.width,
-			      pGlyph->info.height);
-	}
-
+	exaGlyphCacheUploadGlyph(pScreen, cache, pos, pGlyph);
     }
 
     buffer->mask = cache->picture;
commit 850675d4de4373e5df95507dbf2cd9affaaf54bc
Author: Michel Dänzer <daenzer at vmware.com>
Date:   Fri May 15 15:48:37 2009 +0200

    EXA: Take GC client clip type into account for migration.
    
    Fixes http://bugs.freedesktop.org/show_bug.cgi?id=18950 .
    
    Signed-off-by: Michel Dänzer <daenzer at vmware.com>

diff --git a/exa/exa_accel.c b/exa/exa_accel.c
index d284ff5..39f3437 100644
--- a/exa/exa_accel.c
+++ b/exa/exa_accel.c
@@ -406,7 +406,8 @@ exaHWCopyNtoN (DrawablePtr    pSrcDrawable,
 	xfree(rects);
 
 	if (!pGC || !exaGCReadsDestination(pDstDrawable, pGC->planemask,
-					   pGC->fillStyle, pGC->alu)) {
+					   pGC->fillStyle, pGC->alu,
+					   pGC->clientClipType)) {
 	    dstregion = REGION_CREATE(pScreen, NullBox, 0);
 	    REGION_COPY(pScreen, dstregion, srcregion);
 	    REGION_TRANSLATE(pScreen, dstregion, dst_off_x - dx - src_off_x,
@@ -734,7 +735,8 @@ exaPolySegment (DrawablePtr pDrawable, GCPtr pGC, int nseg,
 }
 
 static Bool exaFillRegionSolid (DrawablePtr pDrawable, RegionPtr pRegion,
-				Pixel pixel, CARD32 planemask, CARD32 alu);
+				Pixel pixel, CARD32 planemask, CARD32 alu,
+				unsigned int clientClipType);
 
 static void
 exaPolyFillRect(DrawablePtr pDrawable,
@@ -787,10 +789,11 @@ exaPolyFillRect(DrawablePtr pDrawable,
 	if (((pGC->fillStyle == FillSolid || pGC->tileIsPixel) &&
 	     exaFillRegionSolid(pDrawable, pReg, pGC->fillStyle == FillSolid ?
 				pGC->fgPixel : pGC->tile.pixel,	pGC->planemask,
-				pGC->alu)) ||
+				pGC->alu, pGC->clientClipType)) ||
 	    (pGC->fillStyle == FillTiled && !pGC->tileIsPixel &&
 	     exaFillRegionTiled(pDrawable, pReg, pGC->tile.pixmap, &pGC->patOrg,
-				pGC->planemask, pGC->alu))) {
+				pGC->planemask, pGC->alu,
+				pGC->clientClipType))) {
 	    goto out;
 	}
     }
@@ -952,11 +955,8 @@ exaCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
 }
 
 static Bool
-exaFillRegionSolid (DrawablePtr	pDrawable,
-		    RegionPtr	pRegion,
-		    Pixel	pixel,
-		    CARD32	planemask,
-		    CARD32	alu)
+exaFillRegionSolid (DrawablePtr	pDrawable, RegionPtr pRegion, Pixel pixel,
+		    CARD32 planemask, CARD32 alu, unsigned int clientClipType)
 {
     ExaScreenPriv(pDrawable->pScreen);
     PixmapPtr pPixmap = exaGetDrawablePixmap (pDrawable);
@@ -969,7 +969,8 @@ exaFillRegionSolid (DrawablePtr	pDrawable,
     pixmaps[0].as_src = FALSE;
     pixmaps[0].pPix = pPixmap;
     pixmaps[0].pReg = exaGCReadsDestination(pDrawable, planemask, FillSolid,
-					    alu) ? NULL : pRegion;
+					    alu, clientClipType)
+	? NULL : pRegion;
 
     exaGetDrawableDeltas(pDrawable, pPixmap, &xoff, &yoff);
     REGION_TRANSLATE(pScreen, pRegion, xoff, yoff);
@@ -1032,12 +1033,9 @@ out:
  * Based on fbFillRegionTiled(), fbTile().
  */
 Bool
-exaFillRegionTiled (DrawablePtr	pDrawable,
-		    RegionPtr	pRegion,
-		    PixmapPtr	pTile,
-		    DDXPointPtr pPatOrg,
-		    CARD32	planemask,
-		    CARD32	alu)
+exaFillRegionTiled (DrawablePtr pDrawable, RegionPtr pRegion, PixmapPtr pTile,
+		    DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu,
+		    unsigned int clientClipType)
 {
     ExaScreenPriv(pDrawable->pScreen);
     PixmapPtr pPixmap;
@@ -1060,13 +1058,14 @@ exaFillRegionTiled (DrawablePtr	pDrawable,
     if (tileWidth == 1 && tileHeight == 1)
 	return exaFillRegionSolid(pDrawable, pRegion,
 				  exaGetPixmapFirstPixel (pTile), planemask,
-				  alu);
+				  alu, clientClipType);
 
     pixmaps[0].as_dst = TRUE;
     pixmaps[0].as_src = FALSE;
     pixmaps[0].pPix = pPixmap = exaGetDrawablePixmap (pDrawable);
     pixmaps[0].pReg = exaGCReadsDestination(pDrawable, planemask, FillTiled,
-					    alu) ? NULL : pRegion;
+					    alu, clientClipType)
+	? NULL : pRegion;
     pixmaps[1].as_dst = FALSE;
     pixmaps[1].as_src = TRUE;
     pixmaps[1].pPix = pTile;
diff --git a/exa/exa_priv.h b/exa/exa_priv.h
index 9efbbc9..874e7e9 100644
--- a/exa/exa_priv.h
+++ b/exa/exa_priv.h
@@ -415,11 +415,12 @@ ExaCheckAddTraps (PicturePtr	pPicture,
 
 static _X_INLINE Bool
 exaGCReadsDestination(DrawablePtr pDrawable, unsigned long planemask,
-		      unsigned int fillStyle, unsigned char alu)
+		      unsigned int fillStyle, unsigned char alu,
+		      unsigned int clientClipType)
 {
-    return ((alu != GXcopy && alu != GXclear &&alu != GXset &&
+    return ((alu != GXcopy && alu != GXclear && alu != GXset &&
 	     alu != GXcopyInverted) || fillStyle == FillStippled ||
-	    !EXA_PM_IS_SOLID(pDrawable, planemask));
+	    clientClipType != CT_NONE || !EXA_PM_IS_SOLID(pDrawable, planemask));
 }
 
 void
@@ -427,7 +428,8 @@ exaCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
 
 Bool
 exaFillRegionTiled (DrawablePtr	pDrawable, RegionPtr pRegion, PixmapPtr pTile,
-		    DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu);
+		    DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu,
+		    unsigned int clientClipType);
 
 void
 exaGetImage (DrawablePtr pDrawable, int x, int y, int w, int h,
diff --git a/exa/exa_render.c b/exa/exa_render.c
index a934497..14d710b 100644
--- a/exa/exa_render.c
+++ b/exa/exa_render.c
@@ -945,7 +945,7 @@ exaComposite(CARD8	op,
 
 		ret = exaFillRegionTiled(pDst->pDrawable, &region,
 					 (PixmapPtr)pSrc->pDrawable,
-					 &patOrg, FB_ALLONES, GXcopy);
+					 &patOrg, FB_ALLONES, GXcopy, CT_NONE);
 
 		REGION_UNINIT(pDst->pDrawable->pScreen, &region);
 
diff --git a/exa/exa_unaccel.c b/exa/exa_unaccel.c
index 4279c87..0d53b67 100644
--- a/exa/exa_unaccel.c
+++ b/exa/exa_unaccel.c
@@ -106,7 +106,7 @@ ExaCheckPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth,
     EXA_GC_PROLOGUE(pGC);
     EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
     if (exaGCReadsDestination(pDrawable, pGC->planemask, pGC->fillStyle,
-			      pGC->alu))
+			      pGC->alu, pGC->clientClipType))
 	exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
     else
 	exaPrepareAccessReg (pDrawable, EXA_PREPARE_DEST, pExaPixmap->pDamage ?
commit c1bbac2708bbccbec01cecba39cdf2b8160c1dc3
Author: Matt Turner <mattst88 at gmail.com>
Date:   Thu May 14 16:00:41 2009 -0400

    Fix mem_barrier() on Alpha
    
    Some clean up (da086901c6579e41b28b1418fa12ebb82744fc87) went a bit
    too far and removed the needed mem_barrier macro on Alpha.
    
    This re-adds it.

diff --git a/hw/xfree86/common/compiler.h b/hw/xfree86/common/compiler.h
index 2601693..40b463e 100644
--- a/hw/xfree86/common/compiler.h
+++ b/hw/xfree86/common/compiler.h
@@ -357,7 +357,8 @@ static __inline__ void stw_u(unsigned long r5, unsigned short * r11)
 #    endif
 }
 
-#    define write_mem_barrier()  __asm__ __volatile__("wmb" : : : "memory")
+#    define mem_barrier() __asm__ __volatile__("mb" : : : "memory")
+#    define write_mem_barrier() __asm__ __volatile__("wmb" : : : "memory")
 
 #   elif defined(linux) && defined(__ia64__) 
  
commit 4cc33190ef1a4207c0f8fc74201cdf2568a239c2
Author: Julien Cristau <jcristau at debian.org>
Date:   Thu May 14 17:01:57 2009 +0200

    xfree86: Add two __FreeBSD_kernel__ checks
    
    Debian bug#525475 <http://bugs.debian.org/525475>
    
    Reported-by: Petr Salinger <Petr.Salinger at seznam.cz>
    Signed-off-by: Julien Cristau <jcristau at debian.org>

diff --git a/hw/xfree86/os-support/bus/Pci.h b/hw/xfree86/os-support/bus/Pci.h
index 7623e97..79b38f0 100644
--- a/hw/xfree86/os-support/bus/Pci.h
+++ b/hw/xfree86/os-support/bus/Pci.h
@@ -168,7 +168,8 @@
 
 #endif /* !defined(DEBUGPCI) */
 
-#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || \
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \
+	defined(__OpenBSD__) || defined(__NetBSD__) || \
 	defined(__DragonFly__) || defined(__sun) || defined(__GNU__)
 #define ARCH_PCI_INIT bsdPciInit
 #endif
diff --git a/hw/xfree86/os-support/shared/stdResource.c b/hw/xfree86/os-support/shared/stdResource.c
index a4c162d..9db349b 100644
--- a/hw/xfree86/os-support/shared/stdResource.c
+++ b/hw/xfree86/os-support/shared/stdResource.c
@@ -43,7 +43,8 @@
 /* Avoid Imakefile changes */
 #include "bus/Pci.h"
 
-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \
+	defined(__NetBSD__) || defined(__OpenBSD__) || \
 	defined(__DragonFly__) || defined(__sun) || defined(__GNU__)
 #define xf86StdAccResFromOS xf86AccResFromOS
 #endif
commit ed9aecf8517bf74e943e3e5dd3ee407524e8f122
Author: Adam Jackson <ajax at redhat.com>
Date:   Thu May 14 06:55:21 2009 -0400

    COPYING: SGI FreeB 1.1 -> SGI FreeB 2.0

diff --git a/COPYING b/COPYING
index 09f330e..e2a71d6 100644
--- a/COPYING
+++ b/COPYING
@@ -310,79 +310,28 @@ dealings in this Software without prior written authorization from Digital
 Equipment Corporation.
 
 
-Copyright (c) 1993-1997 by Silicon Graphics Computer Systems, Inc.
+SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
+Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
 
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright
-notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting
-documentation, and that the name of Silicon Graphics not be
-used in advertising or publicity pertaining to distribution
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
 
+The above copyright notice including the dates of first publication and
+either this permission notice or a reference to
+http://oss.sgi.com/projects/FreeB/
+shall be included in all copies or substantial portions of the Software.
 
-License Applicability. Except to the extent portions of this file are
-made subject to an alternative license as permitted in the SGI Free
-Software License B, Version 1.1 (the "License"), the contents of this
-file are subject only to the provisions of the License. You may not use
-this file except in compliance with the License. You may obtain a copy
-of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
-Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
-
-http://oss.sgi.com/projects/FreeB
-
-Note that, as provided in the License, the Software is distributed on an
-"AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
-DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
-CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
-PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
-
-Original Code. The Original Code is: OpenGL Sample Implementation,
-Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
-Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
-Copyright in any portions created by third parties is as indicated
-elsewhere herein. All Rights Reserved.
-
-Additional Notice Provisions: The application programming interfaces
-established by SGI in conjunction with the Original Code are The
-OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
-April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
-1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
-Window System(R) (Version 1.3), released October 19, 1998. This software
-was created using the OpenGL(R) version 1.2.1 Sample Implementation
-published by SGI, but has not been independently verified as being
-compliant with the OpenGL(R) version 1.2.1 Specification.
-
-
-The contents of this file are subject to the GLX Public License Version 1.0
-(the "License"). You may not use this file except in compliance with the
-License. You may obtain a copy of the License at Silicon Graphics, Inc.,
-attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA 94043
-or at http://www.sgi.com/software/opensource/glx/license.html.
-
-Software distributed under the License is distributed on an "AS IS"
-basis. ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY
-IMPLIED WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR
-PURPOSE OR OF NON- INFRINGEMENT. See the License for the specific
-language governing rights and limitations under the License.
-
-The Original Software is GLX version 1.2 source code, released February,
-1999. The developer of the Original Software is Silicon Graphics, Inc.
-Those portions of the Subject Software created by Silicon Graphics, Inc.
-are Copyright (c) 1991-9 Silicon Graphics, Inc. All Rights Reserved.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
 
 
 Copyright (c) 1994, 1995  Hewlett-Packard Company
commit c66cf7b64c7bcb31c81b9fde27cc40c1440753b1
Author: Adam Jackson <ajax at redhat.com>
Date:   Thu May 14 06:53:08 2009 -0400

    Update several of my and/or Red Hat's licenses to standard form.

diff --git a/COPYING b/COPYING
index b2cf8b2..09f330e 100644
--- a/COPYING
+++ b/COPYING
@@ -11,6 +11,7 @@ Copyright © 1998 Egbert Eich
 Copyright © 2006-2007 Intel Corporation
 Copyright © 2006 Nokia Corporation
 Copyright © 2006-2008 Peter Hutterer
+Copyright © 2006 Adam Jackson
 Copyright © 2009 NVIDIA Corporation
 Copyright © 1999 Keith Packard
 Copyright © 2007-2009 Red Hat, Inc.
@@ -498,51 +499,6 @@ OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 
-Copyright (c) 2006, Red Hat, Inc.
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-RED HAT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of Red Hat shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from Red Hat.
-
-
-Copyright © 2006, 2007 Red Hat, Inc
-
-Permission to use, copy, modify, distribute, and sell this software
-and its documentation for any purpose is hereby granted without
-fee, provided that the above copyright notice appear in all copies
-and that both that copyright notice and this permission notice
-appear in supporting documentation, and that the name of Red Hat,
-Inc not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior
-permission.  Red Hat, Inc makes no representations about the
-suitability of this software for any purpose.  It is provided "as
-is" without express or implied warranty.
-
-RED HAT, INC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
-NO EVENT SHALL RED HAT, INC BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
-NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-
 Copyright © 2006  Red Hat, Inc.
 (C) Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
 All Rights Reserved.
@@ -1928,30 +1884,6 @@ AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 
-
-
-Copyright 2006 Adam Jackson.
-Copyright 2007 Red Hat, Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-on the rights to use, copy, modify, merge, publish, distribute, sub
-license, and/or sell copies of the Software, and to permit persons to whom
-the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice (including the next
-paragraph) shall be included in all copies or substantial portions of the
-Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
-THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
 Copyright © 2007 OpenedHand Ltd
 
 Permission to use, copy, modify, distribute, and sell this software and its
diff --git a/dix/window.c b/dix/window.c
index 324ddb7..df8ac53 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -2,25 +2,24 @@
 
 Copyright (c) 2006, Red Hat, Inc.
 
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
 
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
+The above copyright notice and this permission notice (including the next
+paragraph) shall be included in all copies or substantial portions of the
+Software.
 
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL 
-RED HAT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of Red Hat shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from Red Hat.
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
 
 Copyright 1987, 1998  The Open Group
 
diff --git a/hw/xfree86/ddc/interpret_edid.c b/hw/xfree86/ddc/interpret_edid.c
index c0e3df9..3edfd1f 100644
--- a/hw/xfree86/ddc/interpret_edid.c
+++ b/hw/xfree86/ddc/interpret_edid.c
@@ -3,22 +3,23 @@
  * Copyright 2007 Red Hat, Inc.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software")
- * to deal in the software without restriction, including without limitation
- * on the rights to use, copy, modify, merge, publish, distribute, sub
- * license, and/or sell copies of the Software, and to permit persons to whom
- * them Software is furnished to do so, subject to the following conditions:
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
  *
  * The above copyright notice and this permission notice (including the next
  * paragraph) shall be included in all copies or substantial portions of the
  * Software.
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTIBILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
  *
  * interpret_edid.c: interpret a primary EDID block
  */
diff --git a/hw/xfree86/ddc/print_edid.c b/hw/xfree86/ddc/print_edid.c
index 7b6e298..e16dcbb 100644
--- a/hw/xfree86/ddc/print_edid.c
+++ b/hw/xfree86/ddc/print_edid.c
@@ -3,22 +3,23 @@
  * Copyright 2007 Red Hat, Inc.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software")
- * to deal in the software without restriction, including without limitation
- * on the rights to use, copy, modify, merge, publish, distribute, sub
- * license, and/or sell copies of the Software, and to permit persons to whom
- * them Software is furnished to do so, subject to the following conditions:
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
  *
  * The above copyright notice and this permission notice (including the next
  * paragraph) shall be included in all copies or substantial portions of the
  * Software.
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTIBILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
  *
  * print_edid.c: print out all information retrieved from display device  
  */
diff --git a/hw/xfree86/xf8_16bpp/cfb8_16.h b/hw/xfree86/xf8_16bpp/cfb8_16.h
index d847a60..b6ab955 100644
--- a/hw/xfree86/xf8_16bpp/cfb8_16.h
+++ b/hw/xfree86/xf8_16bpp/cfb8_16.h
@@ -4,9 +4,9 @@
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
- * on the rights to use, copy, modify, merge, publish, distribute, sub
- * license, and/or sell copies of the Software, and to permit persons to whom
- * the Software is furnished to do so, subject to the following conditions:
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
  *
  * The above copyright notice and this permission notice (including the next
  * paragraph) shall be included in all copies or substantial portions of the
@@ -14,10 +14,11 @@
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
  */
 
 #ifndef _CFB8_16_H
diff --git a/hw/xfree86/xf8_16bpp/xf8_16module.c b/hw/xfree86/xf8_16bpp/xf8_16module.c
index dd4f011..6a4529a 100644
--- a/hw/xfree86/xf8_16bpp/xf8_16module.c
+++ b/hw/xfree86/xf8_16bpp/xf8_16module.c
@@ -4,9 +4,9 @@
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
- * on the rights to use, copy, modify, merge, publish, distribute, sub
- * license, and/or sell copies of the Software, and to permit persons to whom
- * the Software is furnished to do so, subject to the following conditions:
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
  *
  * The above copyright notice and this permission notice (including the next
  * paragraph) shall be included in all copies or substantial portions of the
@@ -14,10 +14,11 @@
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
  */
 
 #ifdef HAVE_XORG_CONFIG_H
diff --git a/mi/mibstore.c b/mi/mibstore.c
index ef89a76..262b494 100644
--- a/mi/mibstore.c
+++ b/mi/mibstore.c
@@ -2,22 +2,23 @@
  * Copyright 2007 Red Hat, Inc.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software")
- * to deal in the software without restriction, including without limitation
- * on the rights to use, copy, modify, merge, publish, distribute, sub
- * license, and/or sell copies of the Software, and to permit persons to whom
- * them Software is furnished to do so, subject to the following conditions:
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
  *
  * The above copyright notice and this permission notice (including the next
  * paragraph) shall be included in all copies or substantial portions of the
  * Software.
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTIBILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
  */
 
 #ifdef HAVE_DIX_CONFIG_H
diff --git a/os/backtrace.c b/os/backtrace.c
index 19ff58d..3cfae3e 100644
--- a/os/backtrace.c
+++ b/os/backtrace.c
@@ -2,22 +2,23 @@
  * Copyright 2008 Red Hat, Inc.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software")
- * to deal in the software without restriction, including without limitation
- * on the rights to use, copy, modify, merge, publish, distribute, sub
- * license, and/or sell copies of the Software, and to permit persons to whom
- * them Software is furnished to do so, subject to the following conditions:
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
  *
  * The above copyright notice and this permission notice (including the next
  * paragraph) shall be included in all copies or substantial portions of the
  * Software.
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTIBILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
  */
 
 #ifdef HAVE_DIX_CONFIG_H
commit 2075d4bf9e53b8baef0b919da6c44771220cd4a5
Author: Michel Dänzer <daenzer at vmware.com>
Date:   Thu May 14 11:46:41 2009 +0200

    glx: If a destroyed window is bound to the current context, make it not current.
    
    Avoids subsequent crashes due to stale pointers to the DrawableRec, see
    https://bugs.freedesktop.org/show_bug.cgi?id=21132#c15 and previous comments.
    
    Signed-off-by: Michel Dänzer <daenzer at vmware.com>

diff --git a/glx/glxext.c b/glx/glxext.c
index 93391e9..6bc7bef 100644
--- a/glx/glxext.c
+++ b/glx/glxext.c
@@ -126,6 +126,10 @@ static Bool DrawableGone(__GLXdrawable *glxPriv, XID xid)
     __GLXcontext *c;
 
     for (c = glxAllContexts; c; c = c->next) {
+	if (c->isCurrent && (c->drawPriv == glxPriv || c->readPriv == glxPriv)) {
+	    (*c->loseCurrent)(c);
+	    __glXFlushContextCache();
+	}
 	if (c->drawPriv == glxPriv)
 	    c->drawPriv = NULL;
 	if (c->readPriv == glxPriv)
commit 2c1190f888515292de01e60fe74657c34b99fd9e
Author: Michel Dänzer <daenzer at vmware.com>
Date:   Thu May 14 11:39:16 2009 +0200

    randr12: Initialize and keep track of updates to VidMode extension gamma value.
    
    This way clients querying the gamma value via the VidMode extension at least
    get the last value set via the same, rather than always something bogus.
    
    Signed-off-by: Michel Dänzer <daenzer at vmware.com>

diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
index 0db7717..61b3390 100644
--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -919,11 +919,6 @@ Bool
 xf86SetGamma(ScrnInfoPtr scrp, Gamma gamma)
 {
     MessageType from = X_DEFAULT;
-    /* Pretend we succeeded if we support better a gamma system.
-     * This avoids a confusing message.
-     */
-    if (xf86_crtc_supports_gamma(scrp))
-	return TRUE;
 #if 0
     xf86MonPtr DDC = (xf86MonPtr)(scrp->monitor->DDC);
 #endif
@@ -955,6 +950,11 @@ xf86SetGamma(ScrnInfoPtr scrp, Gamma gamma)
 	scrp->gamma.green = 1.0;
 	scrp->gamma.blue = 1.0;
     }
+    /* Pretend we succeeded if we support better a gamma system.
+     * This avoids a confusing message.
+     */
+    if (xf86_crtc_supports_gamma(scrp))
+	return TRUE;
     xf86DrvMsg(scrp->scrnIndex, from,
 	       "Using gamma correction (%.1f, %.1f, %.1f)\n",
 	       scrp->gamma.red, scrp->gamma.green, scrp->gamma.blue);
diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index c71cfe5..1e3b70c 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -1740,6 +1740,8 @@ xf86RandR12ChangeGamma(int scrnIndex, Gamma gamma)
 
     xfree(points);
 
+    pScrn->gamma = gamma;
+
     return Success;
 }
 
commit fc3ce861cdab8606610726ce7c53f57d950c2407
Author: Michel Dänzer <daenzer at vmware.com>
Date:   Thu May 14 11:35:25 2009 +0200

    randr12: Fix calculation of gamma ramp values.
    
    The reciprocal gamma value was missed in the first copy and this mistake was
    propagated to the second one.
    
    Signed-off-by: Michel Dänzer <daenzer at vmware.com>

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index 1b241cd..0ab2f3d 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -2228,19 +2228,19 @@ xf86CrtcSetInitialGamma(xf86CrtcPtr crtc, float gamma_red, float gamma_green,
             red[i] = i << 8;
         else
             red[i] = (CARD16)(pow((double)i/(double)(size - 1),
-			(double)gamma_red) * (double)(size - 1) * 256);
+			1. / (double)gamma_red) * (double)(size - 1) * 256);
 
         if (gamma_green == 1.0)
             green[i] = i << 8;
         else
             green[i] = (CARD16)(pow((double)i/(double)(size - 1),
-			(double)gamma_green) * (double)(size - 1) * 256);
+			1. / (double)gamma_green) * (double)(size - 1) * 256);
 
         if (gamma_blue == 1.0)
             blue[i] = i << 8;
         else
             blue[i] = (CARD16)(pow((double)i/(double)(size - 1),
-			(double)gamma_blue) * (double)(size - 1) * 256);
+			1. / (double)gamma_blue) * (double)(size - 1) * 256);
     }
 
     /* Default size is 256, so anything else is failure. */
diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index f941a3b..c71cfe5 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -1703,7 +1703,7 @@ gamma_to_ramp(float gamma, CARD16 *ramp, int size)
 	if (gamma == 1.0)
 	    ramp[i] = i << 8;
 	else
-	    ramp[i] = (CARD16)(pow((double)i / (double)(size - 1), gamma)
+	    ramp[i] = (CARD16)(pow((double)i / (double)(size - 1), 1. / gamma)
 			       * (double)(size - 1) * 256);
     }
 }
commit f3c61377d0fb1f09a18833995556fc9ffd11e097
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Tue May 12 18:27:09 2009 -0700

    COPYING file updates for git master changes since 1.6 branch
    
    Signed-off-by: Alan Coopersmith <alan.coopersmith at sun.com>

diff --git a/COPYING b/COPYING
index f92d653..b2cf8b2 100644
--- a/COPYING
+++ b/COPYING
@@ -11,10 +11,11 @@ Copyright © 1998 Egbert Eich
 Copyright © 2006-2007 Intel Corporation
 Copyright © 2006 Nokia Corporation
 Copyright © 2006-2008 Peter Hutterer
+Copyright © 2009 NVIDIA Corporation
 Copyright © 1999 Keith Packard
-Copyright © 2007-2008 Red Hat, Inc.
-Copyright © 2005-2007 Daniel Stone
-Copyright © 2006-2008 Simon Thum
+Copyright © 2007-2009 Red Hat, Inc.
+Copyright © 2005-2008 Daniel Stone
+Copyright © 2006-2009 Simon Thum
 Copyright © 2006 Luc Verhaegen
 
 Permission is hereby granted, free of charge, to any person obtaining a
@@ -45,6 +46,7 @@ licenses.
 
 
 Copyright (C) 1994-2003 The XFree86 Project, Inc.  All Rights Reserved.
+Copyright (C) Colin Harrison 2005-2008
 
 Permission is hereby granted, free of charge, to any person obtaining a copy of
 this software and associated documentation files (the "Software"), to deal in
@@ -68,16 +70,16 @@ be used in advertising or otherwise to promote the sale, use or other dealings
 in this Software without prior written authorization from the XFree86 Project.
 
 
-Copyright 1997-2003 by The XFree86 Project, Inc.
+Copyright 1997 by The XFree86 Project, Inc.
 
 Permission to use, copy, modify, distribute, and sell this software and its
 documentation for any purpose is hereby granted without fee, provided that
 the above copyright notice appear in all copies and that both that
 copyright notice and this permission notice appear in supporting
-documentation, and that the names of Orest Zborowski and David Wexelblat
+documentation, and that the name of the XFree86 Project, Inc.
 not be used in advertising or publicity pertaining to distribution of
-the software without specific, written prior permission.  Orest Zborowski
-and David Wexelblat make no representations about the suitability of this
+the software without specific, written prior permission.  The Xfree86
+Project, Inc. makes no representations about the suitability of this
 software for any purpose.  It is provided "as is" without express or
 implied warranty.
 
@@ -597,7 +599,7 @@ authorization from the X Consortium.
 
 Copyright 1998-2000 Precision Insight, Inc., Cedar Park, Texas.
 Copyright 2000 VA Linux Systems, Inc.
-Copyright (c) 2002 Apple Computer, Inc.
+Copyright (c) 2002, 2008, 2009 Apple Computer, Inc.
 Copyright (c) 2003-2004 Torrey T. Lyons.
 All Rights Reserved.
 
@@ -1001,8 +1003,8 @@ the suitability of this software for any purpose.  It is provided "as
 is" without express or implied warranty.
 
 
-Copyright (C) 2001-2004 Harold L Hunt II
-All Rights Reserved.
+Copyright (C) 2001-2004 Harold L Hunt II All Rights Reserved.
+Copyright (C) Colin Harrison 2005-2008
 
 Permission is hereby granted, free of charge, to any person obtaining
 a copy of this software and associated documentation files (the
@@ -1280,29 +1282,6 @@ TORTIOUS  ACTION, ARISING    OUT OF OR   IN  CONNECTION  WITH THE USE    OR
 PERFORMANCE OF THIS SOFTWARE.
 
 
-Copyright (C) 1999 Jeff Hartmann
-Copyright (C) 1999 Precision Insight, Inc.
-Copyright (C) 1999 Xi Graphics, Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-JEFF HARTMANN, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
-DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
-OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
 Copyright 1992 by Rich Murphey <Rich at Rice.edu>
 Copyright 1993 by David Wexelblat <dwex at goblin.org>
 
commit b746a00cffca5c553b607a8e9c1074294a23b443
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Tue May 12 16:11:01 2009 -0700

    Resync COPYING file with notices in code base as of xorg-server-1.6.1
    
    Remove notices for code no longer in tree (Xprint, Xgl, kdrive, cfb, etc.)
    Add/update notices for new/changed code in tree
    
    Signed-off-by: Alan Coopersmith <alan.coopersmith at sun.com>

diff --git a/COPYING b/COPYING
index 6faa4b1..f92d653 100644
--- a/COPYING
+++ b/COPYING
@@ -7,10 +7,12 @@ Juliusz Chroboczek sorts before Intel Corporation sorts before Daniel
 Stone).
 
 Copyright © 2000-2001 Juliusz Chroboczek
+Copyright © 1998 Egbert Eich
 Copyright © 2006-2007 Intel Corporation
 Copyright © 2006 Nokia Corporation
 Copyright © 2006-2008 Peter Hutterer
 Copyright © 1999 Keith Packard
+Copyright © 2007-2008 Red Hat, Inc.
 Copyright © 2005-2007 Daniel Stone
 Copyright © 2006-2008 Simon Thum
 Copyright © 2006 Luc Verhaegen
@@ -88,30 +90,6 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 
-Copyright 2005 Kean Johnston
-Copyright 1999 by The XFree86 Project, Inc.
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation, and that the names of The XFree86 Project, Inc
-and Kean Johnston not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior permission.
-The XFree86 Project, Inc and Kean Johnston make no representations
-about the suitability of this software for any purpose.  It is provided
-"as is" without express or implied warranty.
-
-THE XFREE86 PROJECT, INC AND KEAN JOHNSTON DISCLAIM ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THOMAS ROELL, DAVID WEXELBLAT
-OR KEAN JOHNSTON BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
-PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
-ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
-THIS SOFTWARE.
-
-
 Copyright 1985-1998, 2001  The Open Group
 Copyright 2002 Red Hat Inc., Durham, North Carolina.
 
@@ -161,6 +139,7 @@ in this Software without prior written authorization from the X Consortium.
 
 
 Copyright © 1999-2000 SuSE, Inc.
+Copyright © 2007 Red Hat, Inc.
 
 Permission to use, copy, modify, distribute, and sell this software and its
 documentation for any purpose is hereby granted without fee, provided that
@@ -180,28 +159,6 @@ OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 
-Copyright © 2005 Novell, Inc.
-
-Permission to use, copy, modify, distribute, and sell this software
-and its documentation for any purpose is hereby granted without
-fee, provided that the above copyright notice appear in all copies
-and that both that copyright notice and this permission notice
-appear in supporting documentation, and that the name of
-Novell, Inc. not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior permission.
-Novell, Inc. makes no representations about the suitability of this
-software for any purpose. It is provided "as is" without express or
-implied warranty.
-
-NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
-NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
-NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
-WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-
 Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.
 All Rights Reserved
 
@@ -228,32 +185,6 @@ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
 THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 
-Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.
-All Rights Reserved
-
-Permission  to  use,  copy,  modify,  and  distribute   this
-software  and  its documentation for any purpose and without
-fee is hereby granted, provided that the above copyright no-
-tice  appear  in all copies and that both that copyright no-
-tice and this permission notice appear in  supporting  docu-
-mentation,  and  that the names of Sun or The Open Group
-not be used in advertising or publicity pertaining to
-distribution  of  the software  without specific prior
-written permission. Sun and The Open Group make no
-representations about the suitability of this software for
-any purpose. It is provided "as is" without any express or
-implied warranty.
-
-SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
-NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
-ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
-PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-
 Copyright © 2006 Sun Microsystems
 
 Permission to use, copy, modify, distribute, and sell this software and its
@@ -321,26 +252,6 @@ OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
 OR PERFORMANCE OF THIS SOFTWARE.
 
 
-Copyright 1987-1992 by Digital Equipment Corp., Maynard, MA
-X11R6 Changes Copyright (c) 1994 by Robert Chesler of Absol-Puter, Hudson, NH.
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL AND ABSOL-PUTER DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS, IN NO EVENT SHALL DIGITAL OR ABSOL-PUTER BE LIABLE FOR ANY
-SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
-RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
-CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-
 Copyright 1997 Digital Equipment Corporation.
 All rights reserved.
 
@@ -545,7 +456,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.
 
 
-Copyright 2005 Red Hat, Inc.
+Copyright © 2008 Red Hat, Inc.
+Partly based on code Copyright © 2000 SuSE, Inc.
 
 Permission to use, copy, modify, distribute, and sell this software
 and its documentation for any purpose is hereby granted without
@@ -558,14 +470,31 @@ Hat makes no representations about the suitability of this software
 for any purpose.  It is provided "as is" without express or implied
 warranty.
 
-RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+Red Hat DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
-NO EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+NO EVENT SHALL Red Hat BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
 OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
 NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation, and that the name of SuSE not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.  SuSE makes no representations about the
+suitability of this software for any purpose.  It is provided "as is"
+without express or implied warranty.
+
+SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
+BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
 
 Copyright (c) 2006, Red Hat, Inc.
 
@@ -590,7 +519,7 @@ used in advertising or otherwise to promote the sale, use or other dealings
 in this Software without prior written authorization from Red Hat.
 
 
-Copyright © 2006 Red Hat, Inc
+Copyright © 2006, 2007 Red Hat, Inc
 
 Permission to use, copy, modify, distribute, and sell this software
 and its documentation for any purpose is hereby granted without
@@ -693,26 +622,6 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 
-Copyright IBM Corporation 1987,1988,1989
-All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of IBM not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-
 (C) Copyright IBM Corporation 2003
 All Rights Reserved.
 
@@ -931,29 +840,6 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
 SOFTWARE.
 
 
-Copyright 2000 Intel Corporation.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sub license, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice (including the
-next paragraph) shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-IN NO EVENT SHALL INTEL, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
-DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
 Copyright © 2004 Nokia
 
 Permission to use, copy, modify, distribute, and sell this software and its
@@ -975,30 +861,6 @@ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 PERFORMANCE OF THIS SOFTWARE.
 
 
-Copyright 1998-2003 VIA Technologies, Inc.
-Copyright 2001-2003 S3 Graphics, Inc.
-All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sub license,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice (including the
-next paragraph) shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
-VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-
 (c)Copyright 1988,1991 Adobe Systems Incorporated.
 All rights reserved.
 
@@ -1106,60 +968,26 @@ Copyright © 1999 Keith Packard
 Copyright © 2000 Compaq Computer Corporation
 Copyright © 2002 MontaVista Software Inc.
 Copyright © 2005 OpenedHand Ltd.
+Copyright © 2006 Nokia Corporation
 
 Permission to use, copy, modify, distribute, and sell this software and its
 documentation for any purpose is hereby granted without fee, provided that
 the above copyright notice appear in all copies and that both that
 copyright notice and this permission notice appear in supporting
-documentation, and that the name of Keith Packard or Compaq not be used in
-advertising or publicity pertaining to distribution of the software without
-specific, written prior permission.  Keith Packard and Compaq makes no
-representations about the suitability of this software for any purpose.  It
-is provided "as is" without express or implied warranty.
-
-KEITH PACKARD AND COMPAQ DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
-IN NO EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation, and that the name of Michael Taht or MontaVista not be used in
-advertising or publicity pertaining to distribution of the software without
-specific, written prior permission.  Michael Taht and Montavista make no
-representations about the suitability of this software for any purpose.  It
-is provided "as is" without express or implied warranty.
-
-MICHAEL TAHT AND MONTAVISTA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
-IN NO EVENT SHALL EITHER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation, and that the name of Matthew Allum or OpenedHand not be used in
-advertising or publicity pertaining to distribution of the software without
-specific, written prior permission.  Matthew Allum and OpenedHand make no
-representations about the suitability of this software for any purpose.  It
-is provided "as is" without express or implied warranty.
+documentation, and that the name of the authors and/or copyright holders
+not be used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.  The authors and/or
+copyright holders make no representations about the suitability of this
+software for any purpose.  It is provided "as is" without express or
+implied warranty.
 
-MATTHEW ALLUM AND OPENEDHAND DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
-IN NO EVENT SHALL EITHER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
+THE AUTHORS AND/OR COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD
+TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS, IN NO EVENT SHALL THE AUTHORS AND/OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 
 Copyright 1993 by Davor Matic
@@ -1173,31 +1001,6 @@ the suitability of this software for any purpose.  It is provided "as
 is" without express or implied warranty.
 
 
-(c) Copyright 1996 by Sebastien Marineau <marineau at genie.uottawa.ca>
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-HOLGER VEIT  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
-OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-Except as contained in this notice, the name of Sebastien Marineau shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from Sebastien Marineau.
-
-
 Copyright (C) 2001-2004 Harold L Hunt II
 All Rights Reserved.
 
@@ -1270,29 +1073,6 @@ CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 
-Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
-Copyright 1993 by David Dawes <dawes at xfree86.org>
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation, and that the names of Thomas Roell and David Dawes
-not be used in advertising or publicity pertaining to distribution of
-the software without specific, written prior permission.  Thomas Roell and
-David Dawes makes no representations about the suitability of this
-software for any purpose.  It is provided "as is" without express or
-implied warranty.
-
-THOMAS ROELL AND DAVID DAWES DISCLAIMS ALL WARRANTIES WITH REGARD TO
-THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS, IN NO EVENT SHALL THOMAS ROELL OR DAVID DAWES BE LIABLE FOR
-ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
-RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
-CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-
 Copyright 1990,91,92,93 by Thomas Roell, Germany.
 Copyright 1991,92,93    by SGCS (Snitily Graphics Consulting Services), USA.
 
@@ -1316,124 +1096,6 @@ CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 
-Copyright 2001-2005 by Kean Johnston <jkj at sco.com>
-Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
-Copyright 1993 by David Wexelblat <dwex at goblin.org>
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation, and that the names of Thomas Roell, David Wexelblat
-and Kean Johnston not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior permission.
-Thomas Roell, David Wexelblat and Kean Johnston make no representations
-about the suitability of this software for any purpose.  It is provided
-"as is" without express or implied warranty.
-
-THOMAS ROELL, DAVID WEXELBLAT AND KEAN JOHNSTON DISCLAIM ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THOMAS ROELLm DAVID WEXELBLAT
-OR KEAN JOHNSTON BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
-PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
-ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
-THIS SOFTWARE.
-
-
-Copyright 2001-2005 by Kean Johnston <jkj at sco.com>
-Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
-Copyright 1993 by David Dawes <dawes at xfree86.org>
-Copyright 1993 by David Wexelblat <dwex at goblin.org>
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation, and that the names of Thomas Roell, David Dawes
-and Kean Johnston not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior permission.
-Thomas Roell, David Dawes and Kean Johnston make no representations
-about the suitability of this software for any purpose.  It is provided
-"as is" without express or implied warranty.
-
-THOMAS ROELL, DAVID DAWES AND KEAN JOHNSTON DISCLAIM ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THOMAS ROELLm DAVID WEXELBLAT
-OR KEAN JOHNSTON BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
-PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
-ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
-THIS SOFTWARE.
-
-
-Copyright (c) 2001-2003 Torrey T. Lyons.
-All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-TORREY T. LYONS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
-OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-Except as contained in this notice, the name(s) of the above copyright
-holders shall not be used in advertising or otherwise to promote the sale,
-use or other dealings in this Software without prior written authorization.
-
-
-Copyright © 2004 David Reveman
-
-Permission to use, copy, modify, distribute, and sell this software
-and its documentation for any purpose is hereby granted without
-fee, provided that the above copyright notice appear in all copies
-and that both that copyright notice and this permission notice
-appear in supporting documentation, and that the name of
-David Reveman not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior permission.
-David Reveman makes no representations about the suitability of this
-software for any purpose. It is provided "as is" without express or
-implied warranty.
-
-DAVID REVEMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
-NO EVENT SHALL DAVID REVEMAN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
-NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
-WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-
-Copyright 1993 Gerrit Jan Akkerman
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Gerrit Jan Akkerman not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-GERRIT JAN AKKERMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
-IN NO EVENT SHALL GERRIT JAN AKKERMAN BE LIABLE FOR ANY SPECIAL, INDIRECT
-OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
-USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
-
 Copyright 1998 by Alan Hourihane, Wigan, England.
 Copyright 2000-2002 by Alan Hourihane, Flint Mountain, North Wales.
 
@@ -1504,27 +1166,6 @@ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 PERFORMANCE OF THIS SOFTWARE.
 
 
-Copyright 1993 by Thomas Mueller
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation, and that the name of Thomas Mueller not be used in
-advertising or publicity pertaining to distribution of the software without
-specific, written prior permission.  Thomas Mueller makes no representations
-about the suitability of this software for any purpose.  It is provided
-"as is" without express or implied warranty.
-
-THOMAS MUELLER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
-EVENT SHALL THOMAS MUELLER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
-
 Copyright 2004, Egbert Eich
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -1662,27 +1303,6 @@ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
 OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 
-Copyright 2001,2005 by Kean Johnston <jkj at sco.com>
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation, and that the name Kean Johnston not be used in
-advertising or publicity pertaining to distribution of the software without
-specific, written prior permission.  Kean Johnston makes no
-representations about the suitability of this software for any purpose.
-It is provided "as is" without express or implied warranty.
-
-KEAN JOHNSTON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
-EVENT SHALL KEAN JOHNSTON BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
-USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
-
 Copyright 1992 by Rich Murphey <Rich at Rice.edu>
 Copyright 1993 by David Wexelblat <dwex at goblin.org>
 
@@ -1729,69 +1349,6 @@ CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 
-Copyright © 2004 Franco Catrin
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation, and that the name of Franco Catrin not be used in
-advertising or publicity pertaining to distribution of the software without
-specific, written prior permission.  Franco Catrin makes no
-representations about the suitability of this software for any purpose.  It
-is provided "as is" without express or implied warranty.
-
-FRANCO CATRIN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
-EVENT SHALL FRANCO CATRIN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
-
-Copyright © 2004 Ralph Thomas
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation, and that the name of Ralph Thomas not be used in
-advertising or publicity pertaining to distribution of the software without
-specific, written prior permission.  Ralph Thomas makes no
-representations about the suitability of this software for any purpose.  It
-is provided "as is" without express or implied warranty.
-
-RALPH THOMAS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
-EVENT SHALL RALPH THOMAS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
-
-Copyright © 2004 Damien Ciabrini
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation, and that the name of Anders Carlsson not be used in
-advertising or publicity pertaining to distribution of the software without
-specific, written prior permission.  Anders Carlsson makes no
-representations about the suitability of this software for any purpose.  It
-is provided "as is" without express or implied warranty.
-
-DAMIEN CIABRINI DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
-EVENT SHALL ANDERS CARLSSON BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
-
 Copyright © 2003-2004 Anders Carlsson
 
 Permission to use, copy, modify, distribute, and sell this software and its
@@ -1836,31 +1393,6 @@ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 PERFORMANCE OF THIS SOFTWARE.
 
 
-Copyright 2000 Silicon Integrated Systems Corp, Inc., HsinChu, Taiwan.
-Copyright 2003 Eric Anholt
-All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sub license, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice (including the
-next paragraph) shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
-ERIC ANHOLT OR SILICON INTEGRATED SYSTEMS CORP BE LIABLE FOR ANY CLAIM,
-DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
 Copyright © 2004 PillowElephantBadgerBankPond
 
 Permission to use, copy, modify, distribute, and sell this software and its
@@ -1882,27 +1414,6 @@ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 PERFORMANCE OF THIS SOFTWARE.
 
 
-Copyright 2004 by Costas Stylianou <costas.stylianou at psion.com> +44(0)7850 394095
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation, and that the name of Costas Sylianou not be used in
-advertising or publicity pertaining to distribution of the software without
-specific, written prior permission. Costas Stylianou makes no representations
-about the suitability of this software for any purpose.  It is provided
-"as is" without express or implied warranty.
-
-COSTAS STYLIANOU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
-EVENT SHALL COSTAS STYLIANOU BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
-
 Copyright (c) 1998 Todd C. Miller <Todd.Miller at courtesan.com>
 
 Permission to use, copy, modify, and distribute this software for any
@@ -1918,32 +1429,6 @@ OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 
-Copyright (C) 1995 Pascal Haible.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-PASCAL HAIBLE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
-OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-Except as contained in this notice, the name of Pascal Haible shall
-not be used in advertising or otherwise to promote the sale, use or other
-dealings in this Software without prior written authorization from
-Pascal Haible.
-
-
 Copyright © 2003-2004 Philip Blundell
 
 Permission to use, copy, modify, distribute, and sell this software and its
@@ -2005,16 +1490,19 @@ Copyright © 2004, 2005 Red Hat, Inc.
 Copyright © 2004 Nicholas Miell
 Copyright © 2005 Trolltech AS
 Copyright © 2006 Intel Corporation
+Copyright © 2006-2007 Keith Packard
+Copyright © 2008 Red Hat, Inc
+Copyright © 2008 George Sapountzis <gsap7 at yahoo.gr>
 
 Permission to use, copy, modify, distribute, and sell this software and its
 documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation, and that the name of Red Hat not be used in advertising or
+the above copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation, and
+that the name of the copyright holders not be used in advertising or
 publicity pertaining to distribution of the software without specific,
-written prior permission.  Red Hat makes no representations about the
-suitability of this software for any purpose.  It is provided "as is"
-without express or implied warranty.
+written prior permission.  The copyright holders make no representations
+about the suitability of this software for any purpose.  It is provided "as
+is" without express or implied warranty.
 
 THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
 SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
@@ -2053,7 +1541,8 @@ Copyright 1987, 1998  The Open Group
 Copyright © 1998-1999, 2001 The XFree86 Project, Inc.
 Copyright © 2000 VA Linux Systems, Inc.
 Copyright (c) 2000, 2001 Nokia Home Communications
-Copyright 2003-2006 Sun Microsystems, Inc.
+Copyright 2003-2006, 2008 Sun Microsystems, Inc.
+Copyright © 2007, 2008 Red Hat, Inc.
 All rights reserved.
 
 Permission is hereby granted, free of charge, to any person obtaining a
@@ -2082,33 +1571,6 @@ or other dealings in this Software without prior written authorization
 of the copyright holder.
 
 
-Copyright (c) 1998-1999 Shunsuke Akiyama <akiyama at jp.FreeBSD.org>.
-Copyright (c) 1998-1999 X-TrueType Server Project
-Copyright (c) 1999 Lennart Augustsson <augustss at netbsd.org>
-All rights reserved
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
-
 Copyright 1996 by Thomas E. Dickey <dickey at clark.net>
 
                         All Rights Reserved
@@ -2131,45 +1593,14 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 
-(c) Copyright 1996 Hewlett-Packard Company
-(c) Copyright 1996 International Business Machines Corp.
-(c) Copyright 1996, 2004 Sun Microsystems, Inc.
-(c) Copyright 1996 Novell, Inc.
-(c) Copyright 1996 Digital Equipment Corp.
-(c) Copyright 1996 Fujitsu Limited
-(c) Copyright 1996 Hitachi, Ltd.
-Copyright (c) 2003-2005 Roland Mainz <roland.mainz at nrubsig.org>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the names of the copyright holders shall
-not be used in advertising or otherwise to promote the sale, use or other
-dealings in this Software without prior written authorization from said
-copyright holders.
-
-
 Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
 Copyright (c) 2001 Andreas Monitzer.
 Copyright (c) 2001-2004 Greg Parker.
 Copyright (c) 2001-2004 Torrey T. Lyons
 Copyright (c) 2002-2003 Apple Computer, Inc.
 Copyright (c) 2004-2005 Alexander Gottwald
-Copyright (c) 2002-2007 Apple Inc.
+Copyright (c) 2002-2009 Apple Inc.
+Copyright (c) 2007 Jeremy Huddleston
 All Rights Reserved.
 
 Permission is hereby granted, free of charge, to any person obtaining a
@@ -2196,6 +1627,8 @@ use or other dealings in this Software without prior written authorization.
 
 
 Copyright (C) 1999,2000 by Eric Sunshine <sunshine at sunshineco.com>
+Copyright (C) 2001-2005 by Thomas Winischhofer, Vienna, Austria.
+
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -2274,6 +1707,7 @@ the author(s).
 Copyright (C) 1996-1999 SciTech Software, Inc.
 Copyright (C) David Mosberger-Tang
 Copyright (C) 1999 Egbert Eich
+Copyright (C) 2008 Bart Trojanowski, Symbio Technologies, LLC
 
 Permission to use, copy, modify, distribute, and sell this software and
 its documentation for any purpose is hereby granted without fee,
@@ -2360,26 +1794,6 @@ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
 OF THIS SOFTWARE.
 
 
-Copyright 1994 by Glenn G. Lai
-All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyr notice and this permission notice appear in
-supporting documentation, and that the name of Glenn G. Lai not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-Glenn G. Lai DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-
 Copyright 1990, 1991 by Thomas Roell, Dinkelscherben, Germany
 Copyright 1992 by David Dawes <dawes at XFree86.org>
 Copyright 1992 by Jim Tsillas <jtsilla at damon.ccs.northeastern.edu>
@@ -2453,28 +1867,6 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 
-Copyright (C) 1996 David S. Miller (davem at redhat.com)
-Copyright (C) 1999 Jakub Jelinek (jj at ultra.linux.cz)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-JAKUB JELINEK OR DAVID MILLER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
-
-
 Copyright 1997,1998 by UCHIYAMA Yasushi
 
 Permission to use, copy, modify, distribute, and sell this software and its
@@ -2557,28 +1949,10 @@ AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 
-Copyright © 2006-2007 Keith Packard
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation, and
-that the name of the copyright holders not be used in advertising or
-publicity pertaining to distribution of the software without specific,
-written prior permission.  The copyright holders make no representations
-about the suitability of this software for any purpose.  It is provided "as
-is" without express or implied warranty.
-
-THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
-EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
-OF THIS SOFTWARE.
 
 
 Copyright 2006 Adam Jackson.
+Copyright 2007 Red Hat, Inc.
 
 Permission is hereby granted, free of charge, to any person obtaining a
 copy of this software and associated documentation files (the "Software"),
@@ -2597,3 +1971,58 @@ FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
 THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+Copyright © 2007 OpenedHand Ltd
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation, and that the name of OpenedHand Ltd not be used in
+advertising or publicity pertaining to distribution of the software without
+specific, written prior permission. OpenedHand Ltd makes no
+representations about the suitability of this software for any purpose.  It
+is provided "as is" without express or implied warranty.
+
+OpenedHand Ltd DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL OpenedHand Ltd BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+
+Copyright (c) 1989, 1990, 1993, 1994
+     The Regents of the University of California.  All rights reserved.
+
+This code is derived from software contributed to Berkeley by
+Chris Torek.
+
+This code is derived from software contributed to Berkeley by
+Michael Rendell of Memorial University of Newfoundland.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+ 1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+ 4. Neither the name of the University nor the names of its contributors
+    may be used to endorse or promote products derived from this software
+    without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
commit f250eea2e90fc50bec5214c2f41132b95edc2c46
Author: Jerome Glisse <glisse at freedesktop.org>
Date:   Mon May 11 22:52:46 2009 +0200

    DRI2: update DRI2 private drawable width & height according to X drawable

diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
index 1d49d7c..385c5e8 100644
--- a/hw/xfree86/dri2/dri2.c
+++ b/hw/xfree86/dri2/dri2.c
@@ -257,6 +257,8 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
 
     pPriv->buffers = buffers;
     pPriv->bufferCount = *out_count;
+    pPriv->width = pDraw->width;
+    pPriv->height = pDraw->height;
     *width = pPriv->width;
     *height = pPriv->height;
 
commit 0952d12717031e9dda9e48123bb922d0f4e81834
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Mon May 11 15:27:46 2009 -0400

    xselinux: Relax ownership restriction on SetSelectionUseContext.
    
    Instead, clients should keep track of the selection instances they use.

diff --git a/Xext/xselinux.c b/Xext/xselinux.c
index 2c72621..3a6f096 100644
--- a/Xext/xselinux.c
+++ b/Xext/xselinux.c
@@ -1346,15 +1346,6 @@ ProcSELinuxSetCreateContext(ClientPtr client, unsigned offset)
 	    goto out;
 	privPtr = &serverClient->devPrivates;
     }
-    else if (offset == USE_SEL) {
-	/* Selection use context currently requires no selections owned */
-	Selection *pSel;
-	for (pSel = CurrentSelections; pSel; pSel = pSel->next)
-	    if (pSel->client == client) {
-		rc = BadMatch;
-		goto out;
-	    }
-    }
 
     ptr = dixLookupPrivate(privPtr, subjectKey);
     pSid = (security_id_t *)(ptr + offset);
commit ac13145dbcb284293582435409d8a90f276785c5
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon May 11 15:45:46 2009 +1000

    xkb: if kbd init failed, NULL out the pointers after freeing them (#21278)
    
    Reproducible:
    Configure a server that uses the keyboard driver with an invalid ruleset,
    e.g. (Option "XkbRules" "foobar"). Ensure that Option "AllowEmptyInput" is
    "off" in the ServerFlags or ServerLayout section. Start the server.
    After failing to init the keymap, the server will try to clean up after the
    device, double-freeing some xkb structs that have not been reset properly.
    
    X.Org Bug 21278 <http://bugs.freedesktop.org/show_bug.cgi?id=21278>
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c
index bea8ce0..e707f7a 100644
--- a/xkb/xkbInit.c
+++ b/xkb/xkbInit.c
@@ -622,10 +622,13 @@ unwind_desc:
     XkbFreeKeyboard(xkb, 0, TRUE);
 unwind_info:
     xfree(xkbi);
+    dev->key->xkbInfo = NULL;
 unwind_kbdfeed:
     xfree(dev->kbdfeed);
+    dev->kbdfeed = NULL;
 unwind_key:
     xfree(dev->key);
+    dev->key = NULL;
     return FALSE;
 }
 
commit ebfd6688d1927288155221e7a78fbca9f9293952
Author: Søren Sandmann Pedersen <sandmann at redhat.com>
Date:   Sun May 10 23:27:56 2009 -0400

    Make compositing with transformed windows work again.
    
    The coordinate translation was broken in pretty much every way
    imaginable.

diff --git a/fb/fbpict.c b/fb/fbpict.c
index 1355e90..c89691d 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -159,22 +159,9 @@ fbComposite (CARD8      op,
 {
     pixman_image_t *src, *mask, *dest;
     
-    xDst += pDst->pDrawable->x;
-    yDst += pDst->pDrawable->y;
-    if (pSrc->pDrawable)
-    {
-        xSrc += pSrc->pDrawable->x;
-        ySrc += pSrc->pDrawable->y;
-    }
-    if (pMask && pMask->pDrawable)
-    {
-	xMask += pMask->pDrawable->x;
-	yMask += pMask->pDrawable->y;
-    }
-
-    miCompositeSourceValidate (pSrc, xSrc, ySrc, width, height);
+    miCompositeSourceValidate (pSrc, xSrc - xDst, ySrc - yDst, width, height);
     if (pMask)
-	miCompositeSourceValidate (pMask, xMask, yMask, width, height);
+	miCompositeSourceValidate (pMask, xMask - xDst, yMask - yDst, width, height);
     
     src = image_from_pict (pSrc, TRUE);
     mask = image_from_pict (pMask, TRUE);
@@ -292,7 +279,8 @@ create_bits_picture (PicturePtr pict,
     
     fbGetDrawable (pict->pDrawable, bits, stride, bpp, xoff, yoff);
 
-    bits = (FbBits*)((CARD8*)bits + yoff * stride * sizeof(FbBits) + xoff * (bpp / 8));
+    bits = (FbBits*)((CARD8*)bits +
+		     pict->pDrawable->y * stride * sizeof(FbBits) + pict->pDrawable->x * (bpp / 8));
 
     image = pixman_image_create_bits (
 	pict->format,
@@ -321,8 +309,12 @@ create_bits_picture (PicturePtr pict,
     {
 	if (pict->clientClipType != CT_NONE)
 	    pixman_image_set_has_client_clip (image, TRUE);
+
+	pixman_region_translate (pict->pCompositeClip, - pict->pDrawable->x, - pict->pDrawable->y);
 	
 	pixman_image_set_clip_region (image, pict->pCompositeClip);
+
+	pixman_region_translate (pict->pCompositeClip, pict->pDrawable->x, pict->pDrawable->y);
     }
     
     /* Indexed table */
diff --git a/render/mipict.c b/render/mipict.c
index 777f111..c653ec4 100644
--- a/render/mipict.c
+++ b/render/mipict.c
@@ -358,8 +358,6 @@ miCompositeSourceValidate (PicturePtr	pPicture,
     
     if (pScreen->SourceValidate)
     {
-        x -= pPicture->pDrawable->x;
-        y -= pPicture->pDrawable->y;
 	if (pPicture->transform)
 	{
 	    xPoint	    points[4];
@@ -394,6 +392,8 @@ miCompositeSourceValidate (PicturePtr	pPicture,
 	    width = xmax - xmin;
 	    height = ymax - ymin;
 	}
+        x += pPicture->pDrawable->x;
+        y += pPicture->pDrawable->y;
 	(*pScreen->SourceValidate) (pDrawable, x, y, width, height);
     }
 }
commit c2b668e6fff11c52f2a3f0dc3f4d1fc2c5bcf3e6
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Tue May 5 20:27:53 2009 -0700

    XQuartz: pbproxy standalone: added missing variable declarations.
    (cherry picked from commit 2d947d17a3ef5fb8cef959bff0eb08b8bb5b6548)

diff --git a/hw/xquartz/pbproxy/app-main.m b/hw/xquartz/pbproxy/app-main.m
index cb0fa57..d4b43c6 100644
--- a/hw/xquartz/pbproxy/app-main.m
+++ b/hw/xquartz/pbproxy/app-main.m
@@ -50,6 +50,9 @@ static void signal_handler (int sig) {
 }
 
 int main (int argc, const char *argv[]) {
+    const char *s;
+    int i;
+
 #ifdef DEBUG
     printf("pid: %u\n", getpid());
 #endif
commit 9c5b761c8c86cca56f4b4af272f42ba89c9c3ba5
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sat May 9 16:19:13 2009 +1000

    Revert "xkb: write the _XKB_RF_RULES_PROP to each device."
    
    This commit shouldn't have been pushed, we're still sorting out the API we
    want to use.
    
    This reverts commit 876910a951053f0bd31e30098de3da15a1c1f5d6.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c
index e37a68e..7c611bc 100644
--- a/xkb/xkbInit.c
+++ b/xkb/xkbInit.c
@@ -51,7 +51,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #include <X11/extensions/XKMformat.h>
 #include "xkbfile.h"
 #include "xkb.h"
-#include "exevents.h"
 
 #define	CREATE_ATOM(s)	MakeAtom(s,sizeof(s)-1,1)
 
@@ -155,22 +154,18 @@ XkbFreeRMLVOSet(XkbRMLVOSet *rmlvo, Bool freeRMLVO)
         memset(rmlvo, 0, sizeof(XkbRMLVOSet));
 }
 
-/**
- * Write the given used rules to the device, or (if device is NULL) to the
- * root window property.
- */
 static Bool
-XkbWriteRulesProp(DeviceIntPtr dev, XkbRMLVOSet *rmlvo)
+XkbWriteRulesProp(ClientPtr client, pointer closure)
 {
 int 			len,out;
 Atom			name;
 char *			pval;
 
-    len= (rmlvo->rules ? strlen(rmlvo->rules) : 0);
-    len+= (rmlvo->model ? strlen(rmlvo->model) : 0);
-    len+= (rmlvo->layout ? strlen(rmlvo->layout) : 0);
-    len+= (rmlvo->variant ? strlen(rmlvo->variant) : 0);
-    len+= (rmlvo->options ? strlen(rmlvo->options) : 0);
+    len= (XkbRulesUsed?strlen(XkbRulesUsed):0);
+    len+= (XkbModelUsed?strlen(XkbModelUsed):0);
+    len+= (XkbLayoutUsed?strlen(XkbLayoutUsed):0);
+    len+= (XkbVariantUsed?strlen(XkbVariantUsed):0);
+    len+= (XkbOptionsUsed?strlen(XkbOptionsUsed):0);
     if (len<1)
 	return True;
 
@@ -188,57 +183,41 @@ char *			pval;
 	return True;
     }
     out= 0;
-    if (rmlvo->rules) {
-	strcpy(&pval[out],rmlvo->rules);
-	out+= strlen(rmlvo->rules);
+    if (XkbRulesUsed) {
+	strcpy(&pval[out],XkbRulesUsed);
+	out+= strlen(XkbRulesUsed);
     }
     pval[out++]= '\0';
-    if (rmlvo->model) {
-	strcpy(&pval[out],rmlvo->model);
-	out+= strlen(rmlvo->model);
-    }
+    if (XkbModelUsed) {
+	strcpy(&pval[out],XkbModelUsed);
+	out+= strlen(XkbModelUsed);
+    } 
     pval[out++]= '\0';
-    if (rmlvo->layout) {
-	strcpy(&pval[out],rmlvo->layout);
-	out+= strlen(rmlvo->layout);
+    if (XkbLayoutUsed) {
+	strcpy(&pval[out],XkbLayoutUsed);
+	out+= strlen(XkbLayoutUsed);
     }
     pval[out++]= '\0';
-    if (rmlvo->variant) {
-	strcpy(&pval[out],rmlvo->variant);
-	out+= strlen(rmlvo->variant);
+    if (XkbVariantUsed) {
+	strcpy(&pval[out],XkbVariantUsed);
+	out+= strlen(XkbVariantUsed);
     }
     pval[out++]= '\0';
-    if (rmlvo->options) {
-	strcpy(&pval[out],rmlvo->options);
-	out+= strlen(rmlvo->options);
+    if (XkbOptionsUsed) {
+	strcpy(&pval[out],XkbOptionsUsed);
+	out+= strlen(XkbOptionsUsed);
     }
     pval[out++]= '\0';
     if (out!=len) {
 	ErrorF("[xkb] Internal Error! bad size (%d!=%d) for _XKB_RULES_NAMES\n",
 								out,len);
     }
-    if (dev)
-        XIChangeDeviceProperty(dev, name, XA_STRING, 8, PropModeReplace, len,
-                               pval, True);
-    else
-        dixChangeWindowProperty(serverClient, WindowTable[0], name, XA_STRING, 8,
-                                PropModeReplace, len, pval, True);
-
+    dixChangeWindowProperty(serverClient, WindowTable[0], name, XA_STRING, 8,
+			    PropModeReplace, len, pval, True);
     xfree(pval);
     return True;
 }
 
-static Bool
-XkbWriteRootWindowRulesProp(ClientPtr client, pointer closure)
-{
-    Bool rc;
-    XkbRMLVOSet *rmlvo = (XkbRMLVOSet*)closure;
-
-    rc = XkbWriteRulesProp(NULL, rmlvo);
-    XkbFreeRMLVOSet(rmlvo, TRUE);
-    return rc;
-}
-
 static void
 XkbSetRulesUsed(XkbRMLVOSet *rmlvo)
 {
@@ -258,18 +237,7 @@ XkbSetRulesUsed(XkbRMLVOSet *rmlvo)
 	_XkbFree(XkbOptionsUsed);
     XkbOptionsUsed= (rmlvo->options?_XkbDupString(rmlvo->options):NULL);
     if (XkbWantRulesProp)
-    {
-        XkbRMLVOSet* rmlvo_used = xcalloc(1, sizeof(XkbRMLVOSet));
-        if (rmlvo_used)
-        {
-            rmlvo_used->rules = _XkbDupString(XkbRulesUsed);
-            rmlvo_used->model = _XkbDupString(XkbModelUsed);
-            rmlvo_used->layout = _XkbDupString(XkbLayoutUsed);
-            rmlvo_used->variant = _XkbDupString(XkbVariantUsed);
-            rmlvo_used->options = _XkbDupString(XkbOptionsUsed);
-            QueueWorkProc(XkbWriteRootWindowRulesProp,NULL,rmlvo_used);
-        }
-    }
+	QueueWorkProc(XkbWriteRulesProp,NULL,NULL);
     return;
 }
 
@@ -646,7 +614,6 @@ InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet *rmlvo,
 
     XkbSetRulesDflts(rmlvo);
     XkbSetRulesUsed(rmlvo);
-    XkbWriteRulesProp(dev, rmlvo);
     XkbFreeRMLVOSet(&rmlvo_dflts, FALSE);
 
     return TRUE;
commit 1e816065e5ec3b9394dc1fa5815457a664e15fd9
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Fri May 8 21:31:01 2009 -0700

    Don't printf NULL pointers on HAL connection error
    
    Fixes Solaris bug 6801386 Xorg core dumps on startup if hald not running
    http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6801386
    
    Signed-off-by: Alan Coopersmith <alan.coopersmith at sun.com>

diff --git a/config/hal.c b/config/hal.c
index 36fa839..731d9b8 100644
--- a/config/hal.c
+++ b/config/hal.c
@@ -493,12 +493,14 @@ connect_and_register(DBusConnection *connection, struct config_hal_info *info)
     }
     if (!libhal_ctx_init(info->hal_ctx, &error)) {
         LogMessage(X_ERROR, "config/hal: couldn't initialise context: %s (%s)\n",
-               error.name, error.message);
+		   error.name ? error.name : "unknown error",
+		   error.message ? error.message : "null");
         goto out_ctx;
     }
     if (!libhal_device_property_watch_all(info->hal_ctx, &error)) {
         LogMessage(X_ERROR, "config/hal: couldn't watch all properties: %s (%s)\n",
-               error.name, error.message);
+		   error.name ? error.name : "unknown error",
+		   error.message ? error.message : "null");
         goto out_ctx2;
     }
     libhal_ctx_set_device_added(info->hal_ctx, device_added);
@@ -518,7 +520,8 @@ connect_and_register(DBusConnection *connection, struct config_hal_info *info)
 out_ctx2:
     if (!libhal_ctx_shutdown(info->hal_ctx, &error))
         LogMessage(X_WARNING, "config/hal: couldn't shut down context: %s (%s)\n",
-               error.name, error.message);
+		   error.name ? error.name : "unknown error",
+		   error.message ? error.message : "null");
 out_ctx:
     libhal_ctx_free(info->hal_ctx);
 out_err:
commit b680bda34da130ce408783f04214771471e41e8d
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Thu Apr 30 18:49:06 2009 -0700

    Fix a couple off-by-one array boundary checks.
    
    Error: Write outside array bounds at Xext/geext.c:406
            in function 'GEWindowSetMask' [Symbolic analysis]
           In array dereference of cli->nextSib[extension] with index 'extension'
           Array size is 128 elements (of 4 bytes each), index <= 128
    
    Error: Buffer overflow at dix/events.c:592
    	in function 'SetMaskForEvent' [Symbolic analysis]
           In array dereference of filters[deviceid] with index 'deviceid'
           Array size is 20 elements (of 512 bytes each), index >= 0 and index <= 20
    
    Error: Read buffer overflow at hw/xfree86/loader/loader.c:226
    	in function 'LoaderOpen' [Symbolic analysis]
           In array dereference of refCount[new_handle] with index 'new_handle'
           Array size is 256 elements (of 4 bytes each), index >= 1 and index <= 256
    
    These bugs were found using the Parfait source code analysis tool.
    For more information see http://research.sun.com/projects/parfait
    
    Signed-off-by: Alan Coopersmith <alan.coopersmith at sun.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>
    Acked-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xext/geext.c b/Xext/geext.c
index a58db03..7ab9951 100644
--- a/Xext/geext.c
+++ b/Xext/geext.c
@@ -364,7 +364,7 @@ GEWindowSetMask(ClientPtr pClient, DeviceIntPtr pDev,
 
     extension = (extension & 0x7F);
 
-    if (extension > MAXEXTENSIONS)
+    if (extension >= MAXEXTENSIONS)
     {
         ErrorF("Invalid extension number.\n");
         return;
diff --git a/dix/events.c b/dix/events.c
index be88891..157f9a8 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -588,7 +588,7 @@ XineramaConfineCursorToWindow(DeviceIntPtr pDev,
 void
 SetMaskForEvent(int deviceid, Mask mask, int event)
 {
-    if (deviceid < 0 || deviceid > MAXDEVICES)
+    if (deviceid < 0 || deviceid >= MAXDEVICES)
         FatalError("SetMaskForEvent: bogus device id");
     filters[deviceid][event] = mask;
 }
diff --git a/hw/xfree86/loader/loader.c b/hw/xfree86/loader/loader.c
index ab77362..1803d0e 100644
--- a/hw/xfree86/loader/loader.c
+++ b/hw/xfree86/loader/loader.c
@@ -223,7 +223,7 @@ LoaderOpen(const char *module, const char *cname, int handle,
      * Find a free handle.
      */
     new_handle = 1;
-    while (refCount[new_handle] && new_handle < MAX_HANDLE)
+    while (new_handle < MAX_HANDLE && refCount[new_handle])
 	new_handle++;
 
     if (new_handle == MAX_HANDLE) {
commit 00bc043fa0398a1d14d46b87da2ff3031a9535dc
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 8 10:10:25 2009 +1000

    dix: export subpixel precision in XI2 events for root/event coordinates.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index e51b8ec..58fd6d2 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -385,8 +385,8 @@ eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
     xde->valuators_len  = vallen;
     xde->deviceid       = ev->deviceid;
     xde->sourceid       = ev->sourceid;
-    xde->root_x         = FP1616(ev->root_x, 0);
-    xde->root_y         = FP1616(ev->root_y, 0);
+    xde->root_x         = FP1616(ev->root_x, ev->root_x_frac);
+    xde->root_y         = FP1616(ev->root_y, ev->root_y_frac);
 
     xde->mods.base_mods         = ev->mods.base;
     xde->mods.latched_mods      = ev->mods.latched;
diff --git a/dix/getevents.c b/dix/getevents.c
index 7aafc98..30b2c69 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -44,6 +44,7 @@
 #include "dixevents.h"
 #include "mipointer.h"
 #include "events.h"
+#include "eventconvert.h"
 
 #include <X11/extensions/XKBproto.h>
 #include "xkbsrv.h"
@@ -1070,9 +1071,10 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
         event->detail.button = buttons;
     }
 
-    /* XXX: this should be 16.16 fixed point */
     event->root_x = cx; /* root_x/y always in screen coords */
     event->root_y = cy;
+    event->root_x_frac = pDev->last.remainder[0];
+    event->root_y_frac = pDev->last.remainder[1];
 
     set_valuators(pDev, event, first_valuator, num_valuators, valuators);
 
diff --git a/include/events.h b/include/events.h
index da8f58a..6803b5b 100644
--- a/include/events.h
+++ b/include/events.h
@@ -86,8 +86,10 @@ typedef struct
         uint32_t button;  /**< Button number */
         uint32_t key;     /**< Key code */
     } detail;
-    uint32_t root_x;      /**< Pos relative to root window in 16.16 fixed pt */
-    uint32_t root_y;      /**< Pos relative to root window in 16.16 fixed pt */
+    uint16_t root_x;      /**< Pos relative to root window in integral data */
+    float root_x_frac;    /**< Pos relative to root window in frac part */
+    uint16_t root_y;      /**< Pos relative to root window in integral part */
+    float root_y_frac;    /**< Pos relative to root window in frac part */
     uint8_t    buttons[(MAX_BUTTONS + 7)/8]; /**< Button mask */
     struct {
         uint8_t  mask[(MAX_VALUATORS + 7)/8]; /**< Valuator mask */
commit bae070914fc27db122e6131ae4838559c4a72f65
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu May 7 16:52:31 2009 +1000

    input: update to inputproto 1.9.99.8 XI2 defines.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/chdevhier.c b/Xi/chdevhier.c
index 746f4a5..96b515d 100644
--- a/Xi/chdevhier.c
+++ b/Xi/chdevhier.c
@@ -95,7 +95,7 @@ void XISendDeviceHierarchyEvent(int flags)
         info++;
     }
 
-    dummyDev.id = AllDevices;
+    dummyDev.id = XIAllDevices;
     SendEventToAllWindows(&dummyDev, (XI_HierarchyChangedMask >> 8), (xEvent*)ev, 1);
 }
 
@@ -146,7 +146,7 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
 
         switch(any->type)
         {
-            case CH_CreateMasterDevice:
+            case XICreateMasterDevice:
                 {
                     xXICreateMasterInfo* c = (xXICreateMasterInfo*)any;
                     char* name;
@@ -194,16 +194,16 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
                     AttachDevice(NULL, xtstkeybd, keybd);
 
                     xfree(name);
-                    flags |= HF_MasterAdded;
+                    flags |= XIMasterAdded;
                 }
                 break;
-            case CH_RemoveMasterDevice:
+            case XIRemoveMasterDevice:
                 {
                     xXIRemoveMasterInfo* r = (xXIRemoveMasterInfo*)any;
                     DeviceIntPtr xtstdevice;
 
-                    if (r->return_mode != AttachToMaster &&
-                            r->return_mode != Floating)
+                    if (r->return_mode != XIAttachToMaster &&
+                            r->return_mode != XIFloating)
                         return BadValue;
 
                     rc = dixLookupDevice(&ptr, r->deviceid, client,
@@ -300,7 +300,7 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
 
                     /* Disabling sends the devices floating, reattach them if
                      * desired. */
-                    if (r->return_mode == AttachToMaster)
+                    if (r->return_mode == XIAttachToMaster)
                     {
                         DeviceIntPtr attached,
                                      newptr,
@@ -360,10 +360,10 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
                     RemoveDevice(xtstkeybd);
                     RemoveDevice(keybd);
                     RemoveDevice(ptr);
-                    flags |= HF_MasterRemoved;
+                    flags |= XIMasterRemoved;
                 }
                 break;
-            case CH_DetachSlave:
+            case XIDetachSlave:
                 {
                     xXIDetachSlaveInfo* c = (xXIDetachSlaveInfo*)any;
                     DeviceIntPtr *xtstdevice;
@@ -392,10 +392,10 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
                     }
 
                     AttachDevice(client, ptr, NULL);
-                    flags |= HF_SlaveDetached;
+                    flags |= XISlaveDetached;
                 }
                 break;
-            case CH_AttachSlave:
+            case XIAttachSlave:
                 {
                     xXIAttachSlaveInfo* c = (xXIAttachSlaveInfo*)any;
                     DeviceIntPtr newmaster;
@@ -444,7 +444,7 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
                         goto unwind;
                     }
                     AttachDevice(client, ptr, newmaster);
-                    flags |= HF_SlaveAttached;
+                    flags |= XISlaveAttached;
                 }
                 break;
         }
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 12c53eb..7772029 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -685,7 +685,7 @@ XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master, DeviceChanged
     dcce->time         = GetTimeInMillis();
     dcce->deviceid     = master->id;
     dcce->sourceid     = device->id;
-    dcce->reason       = SlaveSwitch;
+    dcce->reason       = XISlaveSwitch;
     dcce->num_classes  = 0;
     dcce->length = (len - sizeof(xEvent))/4;
 
diff --git a/Xi/querydev.c b/Xi/querydev.c
index c7ee0e1..b50d038 100644
--- a/Xi/querydev.c
+++ b/Xi/querydev.c
@@ -70,7 +70,7 @@ ProcXIQueryDevice(ClientPtr client)
     REQUEST(xXIQueryDeviceReq);
     REQUEST_SIZE_MATCH(xXIQueryDeviceReq);
 
-    if (stuff->deviceid != AllDevices && stuff->deviceid != AllMasterDevices)
+    if (stuff->deviceid != XIAllDevices && stuff->deviceid != XIAllMasterDevices)
     {
         rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
         if (rc != Success)
@@ -87,15 +87,15 @@ ProcXIQueryDevice(ClientPtr client)
         len = 0;
         for (dev = inputInfo.devices; dev; dev = dev->next)
         {
-            if (stuff->deviceid == AllDevices ||
-                (stuff->deviceid == AllMasterDevices && dev->isMaster))
+            if (stuff->deviceid == XIAllDevices ||
+                (stuff->deviceid == XIAllMasterDevices && dev->isMaster))
                 len += SizeDeviceInfo(dev);
         }
 
         for (dev = inputInfo.off_devices; dev; dev = dev->next)
         {
-            if (stuff->deviceid == AllDevices ||
-                (stuff->deviceid == AllMasterDevices && dev->isMaster))
+            if (stuff->deviceid == XIAllDevices ||
+                (stuff->deviceid == XIAllMasterDevices && dev->isMaster))
                 len += SizeDeviceInfo(dev);
         }
 
@@ -125,8 +125,8 @@ ProcXIQueryDevice(ClientPtr client)
     {
         for (dev = inputInfo.devices; dev; dev = dev->next)
         {
-            if (stuff->deviceid == AllDevices ||
-                    (stuff->deviceid == AllMasterDevices && dev->isMaster))
+            if (stuff->deviceid == XIAllDevices ||
+                    (stuff->deviceid == XIAllMasterDevices && dev->isMaster))
             {
                 len = ListDeviceInfo(dev, (xXIDeviceInfo*)info);
                 if (client->swapped)
@@ -138,8 +138,8 @@ ProcXIQueryDevice(ClientPtr client)
 
         for (dev = inputInfo.off_devices; dev; dev = dev->next)
         {
-            if (stuff->deviceid == AllDevices ||
-                    (stuff->deviceid == AllMasterDevices && dev->isMaster))
+            if (stuff->deviceid == XIAllDevices ||
+                    (stuff->deviceid == XIAllMasterDevices && dev->isMaster))
             {
                 len = ListDeviceInfo(dev, (xXIDeviceInfo*)info);
                 if (client->swapped)
@@ -329,14 +329,14 @@ int GetDeviceUse(DeviceIntPtr dev, uint16_t *attachment)
     if (dev->isMaster)
     {
         DeviceIntPtr paired = GetPairedDevice(dev);
-        use = IsPointerDevice(dev) ? MasterPointer : MasterKeyboard;
+        use = IsPointerDevice(dev) ? XIMasterPointer : XIMasterKeyboard;
         *attachment = (paired ? paired->id : 0);
     } else if (master)
     {
-        use = IsPointerDevice(master) ? SlavePointer : SlaveKeyboard;
+        use = IsPointerDevice(master) ? XISlavePointer : XISlaveKeyboard;
         *attachment = master->id;
     } else
-        use = FloatingSlave;
+        use = XIFloatingSlave;
 
     return use;
 }
diff --git a/Xi/selectev.c b/Xi/selectev.c
index 45bf68b..013fdc9 100644
--- a/Xi/selectev.c
+++ b/Xi/selectev.c
@@ -106,7 +106,7 @@ HandleDevicePresenceMask(ClientPtr client, WindowPtr win,
 
     /* We always only use mksidx = AllDevices for events not bound to
      * devices */
-    if (AddExtensionClient (win, client, mask, AllDevices) != Success)
+    if (AddExtensionClient (win, client, mask, XIAllDevices) != Success)
         return BadAlloc;
 
     RecalculateDeviceDeliverableEvents(win);
diff --git a/Xi/xiallowev.c b/Xi/xiallowev.c
index 4df9a10..9eb36c4 100644
--- a/Xi/xiallowev.c
+++ b/Xi/xiallowev.c
@@ -72,24 +72,24 @@ ProcXIAllowEvents(ClientPtr client)
     time = ClientTimeToServerTime(stuff->time);
 
     switch (stuff->mode) {
-    case ReplayDevice:
+    case XIReplayDevice:
 	AllowSome(client, time, dev, NOT_GRABBED);
 	break;
-    case SyncDevice:
+    case XISyncDevice:
 	AllowSome(client, time, dev, FREEZE_NEXT_EVENT);
 	break;
-    case AsyncDevice:
+    case XIAsyncDevice:
 	AllowSome(client, time, dev, THAWED);
 	break;
-    case AsyncPairedDevice:
+    case XIAsyncPairedDevice:
         if (dev->isMaster)
             AllowSome(client, time, dev, THAW_OTHERS);
 	break;
-    case SyncPair:
+    case XISyncPair:
         if (dev->isMaster)
             AllowSome(client, time, dev, FREEZE_BOTH_NEXT_EVENT);
 	break;
-    case AsyncPair:
+    case XIAsyncPair:
         if (dev->isMaster)
             AllowSome(client, time, dev, THAWED_BOTH);
 	break;
diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index 61f36d2..0a6f0e5 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -93,8 +93,8 @@ ProcXIPassiveGrabDevice(ClientPtr client)
     if (ret != Success)
 	return ret;
 
-    if (stuff->grab_type != GrabtypeButton &&
-        stuff->grab_type != GrabtypeKeysym)
+    if (stuff->grab_type != XIGrabtypeButton &&
+        stuff->grab_type != XIGrabtypeKeysym)
     {
         client->errorValue = stuff->grab_type;
         return BadValue;
@@ -149,11 +149,11 @@ ProcXIPassiveGrabDevice(ClientPtr client)
         param.modifiers = *modifiers;
         switch(stuff->grab_type)
         {
-            case GrabtypeButton:
+            case XIGrabtypeButton:
                 status = GrabButton(client, dev, mod_dev, stuff->detail,
                                     &param, GRABTYPE_XI2, &mask);
                 break;
-            case GrabtypeKeysym:
+            case XIGrabtypeKeysym:
                 status = GrabKey(client, dev, mod_dev, stuff->detail,
                                  &param, GRABTYPE_XI2, &mask);
                 break;
@@ -231,8 +231,8 @@ ProcXIPassiveUngrabDevice(ClientPtr client)
     if (rc != Success)
 	return rc;
 
-    if (stuff->grab_type != GrabtypeButton &&
-        stuff->grab_type != GrabtypeKeysym)
+    if (stuff->grab_type != XIGrabtypeButton &&
+        stuff->grab_type != XIGrabtypeKeysym)
     {
         client->errorValue = stuff->grab_type;
         return BadValue;
@@ -250,7 +250,7 @@ ProcXIPassiveUngrabDevice(ClientPtr client)
     tempGrab.device = dev;
     tempGrab.window = win;
     tempGrab.type =
-        (stuff->grab_type == GrabtypeButton) ? XI_ButtonPress : XI_KeyPress;
+        (stuff->grab_type == XIGrabtypeButton) ? XI_ButtonPress : XI_KeyPress;
     tempGrab.grabtype = GRABTYPE_XI2;
     tempGrab.modifierDevice = mod_dev;
     tempGrab.modifiersDetail.pMask = NULL;
diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 607b9b4..601dec3 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -82,7 +82,8 @@ ProcXISelectEvent(ClientPtr client)
     num_masks = stuff->num_masks;
     while(num_masks--)
     {
-        if (evmask->deviceid != AllDevices && evmask->deviceid != AllMasterDevices)
+        if (evmask->deviceid != XIAllDevices &&
+            evmask->deviceid != XIAllMasterDevices)
             rc = dixLookupDevice(&dev, evmask->deviceid, client, DixReadAccess);
         else {
             /* XXX: XACE here? */
@@ -109,8 +110,8 @@ ProcXISelectEvent(ClientPtr client)
     num_masks = stuff->num_masks;
     while(num_masks--)
     {
-        if (evmask->deviceid == AllDevices ||
-            evmask->deviceid == AllMasterDevices)
+        if (evmask->deviceid == XIAllDevices ||
+            evmask->deviceid == XIAllMasterDevices)
         {
             dummy.id = evmask->deviceid;
             dev = &dummy;
diff --git a/configure.ac b/configure.ac
index d95b2e8..98f9332 100644
--- a/configure.ac
+++ b/configure.ac
@@ -700,7 +700,7 @@ XEXT_LIB='$(top_builddir)/Xext/libXext.la'
 XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
 
 dnl Core modules for most extensions, et al.
-REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.9.3] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.7] [kbproto >= 1.0.3]"
+REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.9.3] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.8] [kbproto >= 1.0.3]"
 REQUIRED_LIBS="xfont xau fontenc [pixman-1 >= 0.13.2]"
 
 dnl HAVE_DBUS is true if we actually have the D-Bus library, whereas
diff --git a/dix/devices.c b/dix/devices.c
index f7e32fe..83285b4 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -267,7 +267,7 @@ SendDevicePresenceEvent(int deviceid, int type)
     ev.time = currentTime.milliseconds;
     ev.devchange = type;
     ev.deviceid = deviceid;
-    dummyDev.id = AllDevices;
+    dummyDev.id = XIAllDevices;
     SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
                           (xEvent*)&ev, 1);
 }
@@ -359,7 +359,7 @@ EnableDevice(DeviceIntPtr dev)
                            TRUE);
 
     SendDevicePresenceEvent(dev->id, DeviceEnabled);
-    XISendDeviceHierarchyEvent(HF_DeviceEnabled);
+    XISendDeviceHierarchyEvent(XIDeviceEnabled);
 
     return TRUE;
 }
@@ -430,7 +430,7 @@ DisableDevice(DeviceIntPtr dev)
                            TRUE);
 
     SendDevicePresenceEvent(dev->id, DeviceDisabled);
-    XISendDeviceHierarchyEvent(HF_DeviceDisabled);
+    XISendDeviceHierarchyEvent(XIDeviceDisabled);
     return TRUE;
 }
 
@@ -462,7 +462,7 @@ ActivateDevice(DeviceIntPtr dev)
         pScreen->DeviceCursorInitialize(dev, pScreen);
 
     SendDevicePresenceEvent(dev->id, DeviceAdded);
-    XISendDeviceHierarchyEvent(HF_SlaveAdded);
+    XISendDeviceHierarchyEvent(XISlaveAdded);
     return ret;
 }
 
@@ -977,7 +977,7 @@ RemoveDevice(DeviceIntPtr dev)
     if (ret == Success && initialized) {
         inputInfo.numDevices--;
         SendDevicePresenceEvent(deviceid, DeviceRemoved);
-        XISendDeviceHierarchyEvent(HF_SlaveRemoved);
+        XISendDeviceHierarchyEvent(XISlaveRemoved);
     }
 
     return ret;
diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index d97ed81..e51b8ec 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -323,7 +323,7 @@ eventToClassesChanged(DeviceChangedEvent *ev, xEvent **xi)
     dce->evtype = XI_DeviceChanged;
     dce->time = GetTimeInMillis();
     dce->sourceid = slave->id;
-    dce->reason = SlaveSwitch;
+    dce->reason = XISlaveSwitch;
     dce->length = (len - sizeof(xEvent))/4;
 
     /* FIXME: this should come from the event, not from the device. See
diff --git a/dix/events.c b/dix/events.c
index bfdb096..e1410ed 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -454,8 +454,8 @@ GetWindowXI2Mask(DeviceIntPtr dev, WindowPtr win, xEvent* ev)
     filter = GetEventFilter(dev, ev);
 
     return ((inputMasks->xi2mask[dev->id][evtype/8] & filter) ||
-            inputMasks->xi2mask[AllDevices][evtype/8] ||
-            (inputMasks->xi2mask[AllMasterDevices][evtype/8] && dev->isMaster));
+            inputMasks->xi2mask[XIAllDevices][evtype/8] ||
+            (inputMasks->xi2mask[XIAllMasterDevices][evtype/8] && dev->isMaster));
 }
 
 static Mask
@@ -466,10 +466,10 @@ GetEventMask(DeviceIntPtr dev, xEvent *event, InputClients* other)
     {
         int byte = ((xGenericEvent*)event)->evtype / 8;
         return (other->xi2mask[dev->id][byte] |
-                other->xi2mask[AllDevices][byte] |
-                (dev->isMaster? other->xi2mask[AllMasterDevices][byte] : 0));
+                other->xi2mask[XIAllDevices][byte] |
+                (dev->isMaster? other->xi2mask[XIAllMasterDevices][byte] : 0));
     } else if (CORE_EVENT(event))
-        return other->mask[AllDevices];
+        return other->mask[XIAllDevices];
     else
         return other->mask[dev->id];
 }
@@ -2310,8 +2310,8 @@ EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win)
     ((xGenericEvent*)&ev)->evtype = type;
     filter = GetEventFilter(dev, &ev);
     if (type && (inputMasks = wOtherInputMasks(win)) &&
-        ((inputMasks->xi2mask[AllDevices][type/8] & filter) ||
-         ((inputMasks->xi2mask[AllMasterDevices][type/8] & filter) && dev->isMaster) ||
+        ((inputMasks->xi2mask[XIAllDevices][type/8] & filter) ||
+         ((inputMasks->xi2mask[XIAllMasterDevices][type/8] & filter) && dev->isMaster) ||
          (inputMasks->xi2mask[dev->id][type/8] & filter)))
         rc |= XI2_MASK;
 
@@ -2499,7 +2499,7 @@ DeliverEvents(WindowPtr pWin, xEvent *xE, int count,
     if (!count)
 	return 0;
 
-    dummy.id = AllDevices;
+    dummy.id = XIAllDevices;
     filter = GetEventFilter(&dummy, xE);
     if ((filter & SubstructureNotifyMask) && (xE->u.u.type != CreateNotify))
 	xE->u.destroyNotify.event = pWin->drawable.id;
@@ -3745,8 +3745,8 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
         if (!deliveries)
         {
             int evtype = ((xGenericEvent*)xi2)->evtype;
-            mask = grab->xi2mask[AllDevices][evtype/8] |
-                   grab->xi2mask[AllMasterDevices][evtype/8] |
+            mask = grab->xi2mask[XIAllDevices][evtype/8] |
+                   grab->xi2mask[XIAllMasterDevices][evtype/8] |
                    grab->xi2mask[thisDev->id][evtype/8];
             /* try XI2 event */
             FixUpEventFromWindow(thisDev, xi2, grab->window, None, TRUE);
commit 83f32d3972b8bfb0a87069dfb3fcd64b6b7c6424
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu May 7 10:05:29 2009 +1000

    Xi: Add XI2 property requests.

diff --git a/Xi/extinit.c b/Xi/extinit.c
index eb2a901..4b82f62 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -250,7 +250,11 @@ static int (*ProcIVector[])(ClientPtr) = {
         ProcXIUngrabDevice,                     /* 52 */
         ProcXIAllowEvents,                      /* 53 */
         ProcXIPassiveGrabDevice,                /* 54 */
-        ProcXIPassiveUngrabDevice               /* 55 */
+        ProcXIPassiveUngrabDevice,              /* 55 */
+        ProcXIListProperties,                   /* 56 */
+        ProcXIChangeProperty,                   /* 57 */
+        ProcXIDeleteProperty,                   /* 58 */
+        ProcXIGetProperty                       /* 59 */
 };
 
 /* For swapped clients */
@@ -310,7 +314,11 @@ static int (*SProcIVector[])(ClientPtr) = {
         SProcXIUngrabDevice,                     /* 52 */
         SProcXIAllowEvents,                      /* 53 */
         SProcXIPassiveGrabDevice,                /* 54 */
-        SProcXIPassiveUngrabDevice               /* 55 */
+        SProcXIPassiveUngrabDevice,              /* 55 */
+        SProcXIListProperties,                   /* 56 */
+        SProcXIChangeProperty,                   /* 57 */
+        SProcXIDeleteProperty,                   /* 58 */
+        SProcXIGetProperty                       /* 59 */
 };
 
 /*****************************************************************
@@ -505,6 +513,10 @@ SReplyIDispatch(ClientPtr client, int len, xGrabDeviceReply * rep)
 	SRepXIGrabDevice(client, len, (xXIGrabDeviceReply *) rep);
     else if (rep->RepType == X_XIGrabDevice)
 	SRepXIPassiveGrabDevice(client, len, (xXIPassiveGrabDeviceReply *) rep);
+    else if (rep->RepType == X_XIListProperties)
+	SRepXIListProperties(client, len, (xXIListPropertiesReply *) rep);
+    else if (rep->RepType == X_XIGetProperty)
+	SRepXIGetProperty(client, len, (xXIGetPropertyReply *) rep);
     else {
 	FatalError("XINPUT confused sending swapped reply");
     }
@@ -777,6 +789,18 @@ static void SDeviceHierarchyEvent(xXIDeviceHierarchyEvent *from,
     }
 }
 
+static void SXIPropertyEvent(xXIPropertyEvent *from, xXIPropertyEvent *to)
+{
+    char n;
+
+    *to = *from;
+    swaps(&to->sequenceNumber, n);
+    swapl(&to->length, n);
+    swaps(&to->evtype, n);
+    swaps(&to->deviceid, n);
+    swapl(&to->property, n);
+}
+
 /** Event swapping function for XI2 events. */
 static void
 XI2EventSwap(xGenericEvent *from, xGenericEvent *to)
@@ -795,6 +819,10 @@ XI2EventSwap(xGenericEvent *from, xGenericEvent *to)
             SDeviceHierarchyEvent((xXIDeviceHierarchyEvent*)from,
                                   (xXIDeviceHierarchyEvent*)to);
             break;
+        case XI_PropertyEvent:
+            SXIPropertyEvent((xXIPropertyEvent*)from,
+                           (xXIPropertyEvent*)to);
+            break;
         default:
             SDeviceEvent((xXIDeviceEvent*)from, (xXIDeviceEvent*)to);
             break;
diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c
index 7725715..3cda82b 100644
--- a/Xi/xiproperty.c
+++ b/Xi/xiproperty.c
@@ -34,6 +34,7 @@
 #include <X11/extensions/XI.h>
 #include <X11/Xatom.h>
 #include <X11/extensions/XIproto.h>
+#include <X11/extensions/XI2proto.h>
 #include "exglobals.h"
 #include "exevents.h"
 #include "swaprep.h"
@@ -169,6 +170,36 @@ static struct dev_properties
 
 static long XIPropHandlerID = 1;
 
+static void send_property_event(DeviceIntPtr dev, Atom property, int what)
+{
+        devicePropertyNotify    event;
+        xXIPropertyEvent        xi2;
+        int state;
+
+        if (what == XIPropertyDeleted)
+            state = PropertyDelete;
+        else
+            state = PropertyNewValue;
+
+        event.type      = DevicePropertyNotify;
+        event.deviceid  = dev->id;
+        event.state     = state;
+        event.atom      = property;
+        event.time      = currentTime.milliseconds;
+        SendEventToAllWindows(dev, DevicePropertyNotifyMask,
+                              (xEvent*)&event, 1);
+
+        xi2.type        = GenericEvent;
+        xi2.extension   = IReqCode;
+        xi2.length      = 0;
+        xi2.evtype      = XI_PropertyEvent;
+        xi2.deviceid    = dev->id;
+        xi2.time        = currentTime.milliseconds;
+        xi2.property    = property;
+        xi2.what        = what;
+        SendEventToAllWindows(dev, GetEventFilter(dev, &xi2), (xEvent*)&xi2, 1);
+}
+
 static int list_atoms(DeviceIntPtr dev, int *natoms, Atom **atoms_return)
 {
     XIPropertyPtr prop;
@@ -581,20 +612,11 @@ XIDeleteAllDeviceProperties (DeviceIntPtr device)
 {
     XIPropertyPtr               prop, next;
     XIPropertyHandlerPtr        curr_handler, next_handler;
-    devicePropertyNotify        event;
 
     for (prop = device->properties.properties; prop; prop = next)
     {
         next = prop->next;
-
-        event.type      = DevicePropertyNotify;
-        event.deviceid  = device->id;
-        event.state     = PropertyDelete;
-        event.atom      = prop->propertyName;
-        event.time      = currentTime.milliseconds;
-        SendEventToAllWindows(device, DevicePropertyNotifyMask,
-                (xEvent*)&event, 1);
-
+        send_property_event(device, prop->propertyName, XIPropertyDeleted);
         XIDestroyDeviceProperty(prop);
     }
 
@@ -613,7 +635,6 @@ int
 XIDeleteDeviceProperty (DeviceIntPtr device, Atom property, Bool fromClient)
 {
     XIPropertyPtr               prop, *prev;
-    devicePropertyNotify        event;
     int                         rc = Success;
 
     for (prev = &device->properties.properties; (prop = *prev); prev = &(prop->next))
@@ -640,13 +661,7 @@ XIDeleteDeviceProperty (DeviceIntPtr device, Atom property, Bool fromClient)
     if (prop)
     {
         *prev = prop->next;
-        event.type      = DevicePropertyNotify;
-        event.deviceid  = device->id;
-        event.state     = PropertyDelete;
-        event.atom      = prop->propertyName;
-        event.time      = currentTime.milliseconds;
-        SendEventToAllWindows(device, DevicePropertyNotifyMask,
-                              (xEvent*)&event, 1);
+        send_property_event(device, prop->propertyName, XIPropertyDeleted);
         XIDestroyDeviceProperty (prop);
     }
 
@@ -659,7 +674,6 @@ XIChangeDeviceProperty (DeviceIntPtr dev, Atom property, Atom type,
                         pointer value, Bool sendevent)
 {
     XIPropertyPtr               prop;
-    devicePropertyNotify        event;
     int                         size_in_bytes;
     int                         total_size;
     unsigned long               total_len;
@@ -778,15 +792,9 @@ XIChangeDeviceProperty (DeviceIntPtr dev, Atom property, Atom type,
     }
 
     if (sendevent)
-    {
-        event.type      = DevicePropertyNotify;
-        event.deviceid  = dev->id;
-        event.state     = PropertyNewValue;
-        event.atom      = prop->propertyName;
-        event.time      = currentTime.milliseconds;
-        SendEventToAllWindows(dev, DevicePropertyNotifyMask,
-                              (xEvent*)&event, 1);
-    }
+        send_property_event(dev, prop->propertyName,
+                            (add) ?  XIPropertyCreated : XIPropertyModified);
+
     return(Success);
 }
 
@@ -965,28 +973,7 @@ ProcXGetDeviceProperty (ClientPtr client)
     reply.length = (length + 3) >> 2;
 
     if (stuff->delete && (reply.bytesAfter == 0))
-    {
-        devicePropertyNotify    event;
-        xXIPropertyEvent        xi2;
-
-        event.type      = DevicePropertyNotify;
-        event.deviceid  = dev->id;
-        event.state     = PropertyDelete;
-        event.atom      = stuff->property;
-        event.time      = currentTime.milliseconds;
-        SendEventToAllWindows(dev, DevicePropertyNotifyMask,
-                              (xEvent*)&event, 1);
-
-        xi2.type        = GenericEvent;
-        xi2.extension   = IReqCode;
-        xi2.length      = 0;
-        xi2.evtype      = XI_PropertyEvent;
-        xi2.deviceid    = dev->id;
-        xi2.time        = currentTime.milliseconds;
-        xi2.property    = stuff->property;
-        xi2.what        = XIPropertyDeleted;
-        SendEventToAllWindows(dev, XI_PropertyEventMask, (xEvent*)&xi2, 1);
-    }
+        send_property_event(dev, stuff->property, XIPropertyDeleted);
 
     WriteReplyToClient(client, sizeof(xGenericReply), &reply);
 
@@ -1100,3 +1087,248 @@ SRepXGetDeviceProperty(ClientPtr client, int size,
     /* data will be swapped, see ProcXGetDeviceProperty */
     WriteToClient(client, size, (char*)rep);
 }
+
+/* XI2 Request/reply handling */
+int
+ProcXIListProperties(ClientPtr client)
+{
+    Atom                        *atoms;
+    xXIListPropertiesReply      rep;
+    int                         natoms;
+    DeviceIntPtr                dev;
+    int                         rc = Success;
+
+    REQUEST(xXIListPropertiesReq);
+    REQUEST_SIZE_MATCH(xXIListPropertiesReq);
+
+    rc = dixLookupDevice (&dev, stuff->deviceid, client, DixReadAccess);
+    if (rc != Success)
+        return rc;
+
+    rc = list_atoms(dev, &natoms, &atoms);
+    if (rc != Success)
+        return rc;
+
+    rep.repType = X_Reply;
+    rep.RepType = X_XIListProperties;
+    rep.length = natoms;
+    rep.sequenceNumber = client->sequence;
+    rep.num_properties = natoms;
+
+    WriteReplyToClient(client, sizeof(xXIListPropertiesReply), &rep);
+    if (natoms)
+    {
+        client->pSwapReplyFunc = (ReplySwapPtr)Swap32Write;
+        WriteSwappedDataToClient(client, natoms * sizeof(Atom), atoms);
+        xfree(atoms);
+    }
+    return rc;
+}
+
+int
+ProcXIChangeProperty(ClientPtr client)
+{
+    int                 rc;
+    DeviceIntPtr        dev;
+    int                 totalSize;
+    unsigned long       len;
+
+    REQUEST(xXIChangePropertyReq);
+    REQUEST_AT_LEAST_SIZE(xXIChangePropertyReq);
+    UpdateCurrentTime();
+
+    rc = dixLookupDevice (&dev, stuff->deviceid, client, DixWriteAccess);
+    if (rc != Success)
+        return rc;
+
+    rc = check_change_property(client, stuff->property, stuff->type,
+                               stuff->format, stuff->mode, stuff->num_items);
+    len = stuff->num_items;
+    if (len > ((0xffffffff - sizeof(xXIChangePropertyReq)) >> 2))
+        return BadLength;
+
+    totalSize = len * (stuff->format/8);
+    REQUEST_FIXED_SIZE(xXIChangePropertyReq, totalSize);
+
+    rc = change_property(client, dev, stuff->property, stuff->type,
+                         stuff->format, stuff->mode, len, (void*)&stuff[1]);
+    return rc;
+}
+
+int
+ProcXIDeleteProperty(ClientPtr client)
+{
+    DeviceIntPtr        dev;
+    int                 rc;
+    REQUEST(xXIDeletePropertyReq);
+
+    REQUEST_SIZE_MATCH(xXIDeletePropertyReq);
+    UpdateCurrentTime();
+    rc =  dixLookupDevice (&dev, stuff->deviceid, client, DixWriteAccess);
+    if (rc != Success)
+        return rc;
+
+    if (!ValidAtom(stuff->property))
+    {
+        client->errorValue = stuff->property;
+        return (BadAtom);
+    }
+
+    rc = XIDeleteDeviceProperty(dev, stuff->property, TRUE);
+    return rc;
+}
+
+
+int
+ProcXIGetProperty(ClientPtr client)
+{
+    REQUEST(xXIGetPropertyReq);
+    DeviceIntPtr                dev;
+    xXIGetPropertyReply         reply;
+    int                         length;
+    int                         rc, format, nitems, bytes_after;
+    char                        *data;
+    Atom                        type;
+
+    REQUEST_SIZE_MATCH(xXIGetPropertyReq);
+    if (stuff->delete)
+        UpdateCurrentTime();
+    rc = dixLookupDevice (&dev, stuff->deviceid, client,
+                           stuff->delete ? DixWriteAccess :
+                           DixReadAccess);
+    if (rc != Success)
+        return rc;
+
+    rc = get_property(client, dev, stuff->property, stuff->type,
+            stuff->delete, stuff->offset, stuff->len,
+            &bytes_after, &type, &format, &nitems, &length, &data);
+
+    if (rc != Success)
+        return rc;
+
+    reply.repType = X_Reply;
+    reply.RepType = X_XIGetProperty;
+    reply.sequenceNumber = client->sequence;
+    reply.num_items = nitems;
+    reply.format = format;
+    reply.bytes_after = bytes_after;
+    reply.type = type;
+    reply.length = (length + 3)/4;
+
+    if (length && stuff->delete && (reply.bytes_after == 0))
+        send_property_event(dev, stuff->property, XIPropertyDeleted);
+
+    WriteReplyToClient(client, sizeof(xXIGetPropertyReply), &reply);
+
+    if (length)
+    {
+        switch (reply.format) {
+            case 32: client->pSwapReplyFunc = (ReplySwapPtr)CopySwap32Write; break;
+            case 16: client->pSwapReplyFunc = (ReplySwapPtr)CopySwap16Write; break;
+            default: client->pSwapReplyFunc = (ReplySwapPtr)WriteToClient; break;
+        }
+        WriteSwappedDataToClient(client, length, data);
+    }
+
+    /* delete the Property */
+    if (stuff->delete && (reply.bytes_after == 0))
+    {
+        XIPropertyPtr prop, *prev;
+        for (prev = &dev->properties.properties; (prop = *prev); prev = &prop->next)
+        {
+            if (prop->propertyName == stuff->property)
+            {
+                *prev = prop->next;
+                XIDestroyDeviceProperty(prop);
+                break;
+            }
+        }
+    }
+
+    return Success;
+}
+
+int
+SProcXIListProperties(ClientPtr client)
+{
+    char n;
+    REQUEST(xXIListPropertiesReq);
+
+    swaps(&stuff->length, n);
+    swaps(&stuff->deviceid, n);
+
+    REQUEST_SIZE_MATCH(xXIListPropertiesReq);
+    return (ProcXIListProperties(client));
+}
+
+int
+SProcXIChangeProperty(ClientPtr client)
+{
+    char n;
+    REQUEST(xXIChangePropertyReq);
+
+    swaps(&stuff->length, n);
+    swaps(&stuff->deviceid, n);
+    swapl(&stuff->property, n);
+    swapl(&stuff->type, n);
+    swapl(&stuff->num_items, n);
+    REQUEST_SIZE_MATCH(xXIChangePropertyReq);
+    return (ProcXIChangeProperty(client));
+}
+
+int
+SProcXIDeleteProperty(ClientPtr client)
+{
+    char n;
+    REQUEST(xXIDeletePropertyReq);
+
+    swaps(&stuff->length, n);
+    swaps(&stuff->deviceid, n);
+    swapl(&stuff->property, n);
+    REQUEST_SIZE_MATCH(xXIDeletePropertyReq);
+    return (ProcXIDeleteProperty(client));
+}
+
+int
+SProcXIGetProperty(ClientPtr client)
+{
+    char n;
+    REQUEST(xXIGetPropertyReq);
+
+    swaps(&stuff->length, n);
+    swaps(&stuff->deviceid, n);
+    swapl(&stuff->property, n);
+    swapl(&stuff->type, n);
+    swapl(&stuff->offset, n);
+    swapl(&stuff->len, n);
+    REQUEST_SIZE_MATCH(xXIGetPropertyReq);
+    return (ProcXIGetProperty(client));
+}
+
+
+void
+SRepXIListProperties(ClientPtr client, int size,
+                     xXIListPropertiesReply *rep)
+{
+    char n;
+    swaps(&rep->sequenceNumber, n);
+    swapl(&rep->length, n);
+    swaps(&rep->num_properties, n);
+    /* properties will be swapped later, see ProcXIListProperties */
+    WriteToClient(client, size, (char*)rep);
+}
+
+void
+SRepXIGetProperty(ClientPtr client, int size,
+                  xXIGetPropertyReply *rep)
+{
+    char n;
+
+    swaps(&rep->sequenceNumber, n);
+    swapl(&rep->length, n);
+    swapl(&rep->type, n);
+    swapl(&rep->bytes_after, n);
+    swapl(&rep->num_items, n);
+    /* data will be swapped, see ProcXIGetProperty */
+    WriteToClient(client, size, (char*)rep);
+}
diff --git a/Xi/xiproperty.h b/Xi/xiproperty.h
index e66b447..bc4bbae 100644
--- a/Xi/xiproperty.h
+++ b/Xi/xiproperty.h
@@ -43,4 +43,19 @@ void SRepXListDeviceProperties(ClientPtr client, int size,
 void SRepXGetDeviceProperty(ClientPtr client, int size,
                             xGetDevicePropertyReply *rep);
 
+/* XI2 request/reply handling  */
+int ProcXIListProperties        (ClientPtr client);
+int ProcXIChangeProperty        (ClientPtr client);
+int ProcXIDeleteProperty        (ClientPtr client);
+int ProcXIGetProperty           (ClientPtr client);
+
+int SProcXIListProperties       (ClientPtr client);
+int SProcXIChangeProperty       (ClientPtr client);
+int SProcXIDeleteProperty       (ClientPtr client);
+int SProcXIGetProperty          (ClientPtr client);
+
+void SRepXIListProperties(ClientPtr client, int size,
+                          xXIListPropertiesReply *rep);
+void SRepXIGetProperty(ClientPtr client, int size,
+                       xXIGetPropertyReply *rep);
 #endif /* XIPROPERTY_H */
diff --git a/test/input.c b/test/input.c
index e49cc81..238cad3 100644
--- a/test/input.c
+++ b/test/input.c
@@ -299,6 +299,10 @@ static void xi2_struct_sizes(void)
     compare(xXIAllowEventsReq);
     compare(xXIPassiveGrabDeviceReq);
     compare(xXIPassiveUngrabDeviceReq);
+    compare(xXIListPropertiesReq);
+    compare(xXIChangePropertyReq);
+    compare(xXIDeletePropertyReq);
+    compare(xXIGetPropertyReq);
 #undef compare
 }
 
commit 9935bec6e860cba9a3cc5baadd372ddb89d72ef0
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu May 7 09:43:56 2009 +1000

    Xi: split some code out of the XI 1.5 property request processing.
    
    This is in preparation for the XI2 property requests that can re-use much of
    this code.

diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c
index 7e20e03..7725715 100644
--- a/Xi/xiproperty.c
+++ b/Xi/xiproperty.c
@@ -169,6 +169,165 @@ static struct dev_properties
 
 static long XIPropHandlerID = 1;
 
+static int list_atoms(DeviceIntPtr dev, int *natoms, Atom **atoms_return)
+{
+    XIPropertyPtr prop;
+    Atom *atoms         = NULL;
+    int nprops          = 0;
+
+    for (prop = dev->properties.properties; prop; prop = prop->next)
+        nprops++;
+    if (nprops)
+    {
+        Atom *a;
+
+        atoms = xalloc(nprops * sizeof(Atom));
+        if(!atoms)
+            return BadAlloc;
+        a = atoms;
+        for (prop = dev->properties.properties; prop; prop = prop->next, a++)
+            *a = prop->propertyName;
+    }
+
+    *natoms = nprops;
+    *atoms_return = atoms;
+    return Success;
+}
+
+static int
+get_property(ClientPtr client, DeviceIntPtr dev, Atom property, Atom type,
+             BOOL delete, int offset, int length,
+             int *bytes_after, Atom *type_return, int *format, int *nitems,
+             int *length_return, char **data)
+{
+    unsigned long n, len, ind;
+    int rc;
+    XIPropertyPtr prop;
+    XIPropertyValuePtr prop_value;
+
+    if (!ValidAtom(property))
+    {
+        client->errorValue = property;
+        return(BadAtom);
+    }
+    if ((delete != xTrue) && (delete != xFalse))
+    {
+        client->errorValue = delete;
+        return(BadValue);
+    }
+
+    if ((type != AnyPropertyType) && !ValidAtom(type))
+    {
+        client->errorValue = type;
+        return(BadAtom);
+    }
+
+    for (prop = dev->properties.properties; prop; prop = prop->next)
+        if (prop->propertyName == property)
+            break;
+
+    if (!prop)
+    {
+        *bytes_after = 0;
+        *type_return = None;
+        *format = 0;
+        *nitems = 0;
+        *length_return = 0;
+        return Success;
+    }
+
+    rc = XIGetDeviceProperty(dev, property, &prop_value);
+    if (rc != Success)
+    {
+        client->errorValue = property;
+        return rc;
+    }
+
+    /* If the request type and actual type don't match. Return the
+    property information, but not the data. */
+
+    if (((type != prop_value->type) && (type != AnyPropertyType)))
+    {
+        *bytes_after = prop_value->size;
+        *format = prop_value->format;
+        *length_return = 0;
+        *nitems = 0;
+        *type_return = prop_value->type;
+        return Success;
+    }
+
+    /* Return type, format, value to client */
+    n = (prop_value->format/8) * prop_value->size; /* size (bytes) of prop */
+    ind = offset << 2;
+
+   /* If offset is invalid such that it causes "len" to
+            be negative, it's a value error. */
+
+    if (n < ind)
+    {
+        client->errorValue = offset;
+        return BadValue;
+    }
+
+    len = min(n - ind, 4 * length);
+
+    *bytes_after = n - (ind + len);
+    *format = prop_value->format;
+    *length_return = len;
+    if (prop_value->format)
+        *nitems = len / (prop_value->format / 8);
+    else
+        *nitems = 0;
+    *type_return = prop_value->type;
+
+    *data = (char*)prop_value->data + ind;
+
+    return Success;
+}
+
+static int
+check_change_property(ClientPtr client, Atom property, Atom type, int format,
+                      int mode, int nitems)
+{
+    if ((mode != PropModeReplace) && (mode != PropModeAppend) &&
+        (mode != PropModePrepend))
+    {
+        client->errorValue = mode;
+        return BadValue;
+    }
+    if ((format != 8) && (format != 16) && (format != 32))
+    {
+        client->errorValue = format;
+        return BadValue;
+    }
+
+    if (!ValidAtom(property))
+    {
+        client->errorValue = property;
+        return(BadAtom);
+    }
+    if (!ValidAtom(type))
+    {
+        client->errorValue = type;
+        return(BadAtom);
+    }
+
+    return Success;
+}
+
+static int
+change_property(ClientPtr client, DeviceIntPtr dev, Atom property, Atom type,
+                int format, int mode, int len, void *data)
+{
+    int rc = Success;
+
+    rc = XIChangeDeviceProperty(dev, property, type, format, mode, len, data, TRUE);
+    if (rc != Success)
+        client->errorValue = property;
+
+    return rc;
+}
+
 /**
  * Return the atom assigned to the specified string or 0 if the atom isn't known
  * to the DIX.
@@ -681,11 +840,10 @@ XISetDevicePropertyDeletable(DeviceIntPtr dev, Atom property, Bool deletable)
 int
 ProcXListDeviceProperties (ClientPtr client)
 {
-    Atom                        *pAtoms = NULL, *temppAtoms;
+    Atom                        *atoms;
     xListDevicePropertiesReply  rep;
-    int                         numProps = 0;
+    int                         natoms;
     DeviceIntPtr                dev;
-    XIPropertyPtr               prop;
     int                         rc = Success;
 
     REQUEST(xListDevicePropertiesReq);
@@ -695,27 +853,22 @@ ProcXListDeviceProperties (ClientPtr client)
     if (rc != Success)
         return rc;
 
-    for (prop = dev->properties.properties; prop; prop = prop->next)
-        numProps++;
-    if (numProps)
-        if(!(pAtoms = (Atom *)xalloc(numProps * sizeof(Atom))))
-            return(BadAlloc);
+    rc = list_atoms(dev, &natoms, &atoms);
+    if (rc != Success)
+        return rc;
 
     rep.repType = X_Reply;
     rep.RepType = X_ListDeviceProperties;
-    rep.length = (numProps * sizeof(Atom)) >> 2;
+    rep.length = natoms;
     rep.sequenceNumber = client->sequence;
-    rep.nAtoms = numProps;
-    temppAtoms = pAtoms;
-    for (prop = dev->properties.properties; prop; prop = prop->next)
-        *temppAtoms++ = prop->propertyName;
+    rep.nAtoms = natoms;
 
     WriteReplyToClient(client, sizeof(xListDevicePropertiesReply), &rep);
-    if (numProps)
+    if (natoms)
     {
         client->pSwapReplyFunc = (ReplySwapPtr)Swap32Write;
-        WriteSwappedDataToClient(client, numProps * sizeof(Atom), pAtoms);
-        xfree(pAtoms);
+        WriteSwappedDataToClient(client, natoms * sizeof(Atom), atoms);
+        xfree(atoms);
     }
     return rc;
 }
@@ -725,55 +878,29 @@ ProcXChangeDeviceProperty (ClientPtr client)
 {
     REQUEST(xChangeDevicePropertyReq);
     DeviceIntPtr        dev;
-    char                format, mode;
     unsigned long       len;
-    int                 sizeInBytes;
     int                 totalSize;
     int                 rc;
 
     REQUEST_AT_LEAST_SIZE(xChangeDevicePropertyReq);
     UpdateCurrentTime();
-    format = stuff->format;
-    mode = stuff->mode;
-    if ((mode != PropModeReplace) && (mode != PropModeAppend) &&
-        (mode != PropModePrepend))
-    {
-        client->errorValue = mode;
-        return BadValue;
-    }
-    if ((format != 8) && (format != 16) && (format != 32))
-    {
-        client->errorValue = format;
-        return BadValue;
-    }
-    len = stuff->nUnits;
-    if (len > ((0xffffffff - sizeof(xChangeDevicePropertyReq)) >> 2))
-        return BadLength;
-    sizeInBytes = format>>3;
-    totalSize = len * sizeInBytes;
-    REQUEST_FIXED_SIZE(xChangeDevicePropertyReq, totalSize);
 
     rc = dixLookupDevice (&dev, stuff->deviceid, client, DixWriteAccess);
     if (rc != Success)
         return rc;
 
-    if (!ValidAtom(stuff->property))
-    {
-        client->errorValue = stuff->property;
-        return(BadAtom);
-    }
-    if (!ValidAtom(stuff->type))
-    {
-        client->errorValue = stuff->type;
-        return(BadAtom);
-    }
+    rc = check_change_property(client, stuff->property, stuff->type,
+                               stuff->format, stuff->mode, stuff->nUnits);
+
+    len = stuff->nUnits;
+    if (len > ((0xffffffff - sizeof(xChangeDevicePropertyReq)) >> 2))
+        return BadLength;
 
-    rc = XIChangeDeviceProperty(dev, stuff->property,
-                                 stuff->type, (int)format,
-                                 (int)mode, len, (pointer)&stuff[1], TRUE);
+    totalSize = len * (stuff->format/8);
+    REQUEST_FIXED_SIZE(xChangeDevicePropertyReq, totalSize);
 
-    if (rc != Success)
-        client->errorValue = stuff->property;
+    rc = change_property(client, dev, stuff->property, stuff->type,
+                         stuff->format, stuff->mode, len, (void*)&stuff[1]);
     return rc;
 }
 
@@ -804,12 +931,12 @@ int
 ProcXGetDeviceProperty (ClientPtr client)
 {
     REQUEST(xGetDevicePropertyReq);
-    XIPropertyPtr               prop, *prev;
-    XIPropertyValuePtr          prop_value;
-    unsigned long               n, len, ind;
     DeviceIntPtr                dev;
+    int                         length;
+    int                         rc, format, nitems, bytes_after;
+    char                        *data;
+    Atom                        type;
     xGetDevicePropertyReply     reply;
-    int                         rc;
 
     REQUEST_SIZE_MATCH(xGetDevicePropertyReq);
     if (stuff->delete)
@@ -820,121 +947,74 @@ ProcXGetDeviceProperty (ClientPtr client)
     if (rc != Success)
         return rc;
 
-    if (!ValidAtom(stuff->property))
-    {
-        client->errorValue = stuff->property;
-        return(BadAtom);
-    }
-    if ((stuff->delete != xTrue) && (stuff->delete != xFalse))
-    {
-        client->errorValue = stuff->delete;
-        return(BadValue);
-    }
-    if ((stuff->type != AnyPropertyType) && !ValidAtom(stuff->type))
-    {
-        client->errorValue = stuff->type;
-        return(BadAtom);
-    }
+    rc = get_property(client, dev, stuff->property, stuff->type,
+            stuff->delete, stuff->longOffset, stuff->longLength,
+            &bytes_after, &type, &format, &nitems, &length, &data);
 
-    for (prev = &dev->properties.properties; (prop = *prev); prev = &prop->next)
-        if (prop->propertyName == stuff->property)
-            break;
+    if (rc != Success)
+        return rc;
 
     reply.repType = X_Reply;
     reply.RepType = X_GetDeviceProperty;
     reply.sequenceNumber = client->sequence;
     reply.deviceid = dev->id;
-    if (!prop)
-    {
-        reply.nItems = 0;
-        reply.length = 0;
-        reply.bytesAfter = 0;
-        reply.propertyType = None;
-        reply.format = 0;
-        WriteReplyToClient(client, sizeof(xGetDevicePropertyReply), &reply);
-        return(client->noClientException);
-    }
-
-    rc = XIGetDeviceProperty(dev, stuff->property, &prop_value);
-    if (rc != Success)
-    {
-        client->errorValue = stuff->property;
-        return rc;
-    }
-
-    /* If the request type and actual type don't match. Return the
-    property information, but not the data. */
-
-    if (((stuff->type != prop_value->type) &&
-         (stuff->type != AnyPropertyType))
-       )
-    {
-        reply.bytesAfter = prop_value->size;
-        reply.format = prop_value->format;
-        reply.length = 0;
-        reply.nItems = 0;
-        reply.propertyType = prop_value->type;
-        WriteReplyToClient(client, sizeof(xGetDevicePropertyReply), &reply);
-        return(client->noClientException);
-    }
-
-/*
- *  Return type, format, value to client
- */
-    n = (prop_value->format/8) * prop_value->size; /* size (bytes) of prop */
-    ind = stuff->longOffset << 2;
-
-   /* If longOffset is invalid such that it causes "len" to
-            be negative, it's a value error. */
-
-    if (n < ind)
-    {
-        client->errorValue = stuff->longOffset;
-        return BadValue;
-    }
-
-    len = min(n - ind, 4 * stuff->longLength);
-
-    reply.bytesAfter = n - (ind + len);
-    reply.format = prop_value->format;
-    reply.length = (len + 3) >> 2;
-    if (prop_value->format)
-        reply.nItems = len / (prop_value->format / 8);
-    else
-        reply.nItems = 0;
-    reply.propertyType = prop_value->type;
+    reply.nItems = nitems;
+    reply.format = format;
+    reply.bytesAfter = bytes_after;
+    reply.propertyType = type;
+    reply.length = (length + 3) >> 2;
 
     if (stuff->delete && (reply.bytesAfter == 0))
     {
         devicePropertyNotify    event;
+        xXIPropertyEvent        xi2;
 
         event.type      = DevicePropertyNotify;
         event.deviceid  = dev->id;
         event.state     = PropertyDelete;
-        event.atom      = prop->propertyName;
+        event.atom      = stuff->property;
         event.time      = currentTime.milliseconds;
         SendEventToAllWindows(dev, DevicePropertyNotifyMask,
                               (xEvent*)&event, 1);
+
+        xi2.type        = GenericEvent;
+        xi2.extension   = IReqCode;
+        xi2.length      = 0;
+        xi2.evtype      = XI_PropertyEvent;
+        xi2.deviceid    = dev->id;
+        xi2.time        = currentTime.milliseconds;
+        xi2.property    = stuff->property;
+        xi2.what        = XIPropertyDeleted;
+        SendEventToAllWindows(dev, XI_PropertyEventMask, (xEvent*)&xi2, 1);
     }
 
     WriteReplyToClient(client, sizeof(xGenericReply), &reply);
-    if (len)
+
+    if (length)
     {
         switch (reply.format) {
-        case 32: client->pSwapReplyFunc = (ReplySwapPtr)CopySwap32Write; break;
-        case 16: client->pSwapReplyFunc = (ReplySwapPtr)CopySwap16Write; break;
-        default: client->pSwapReplyFunc = (ReplySwapPtr)WriteToClient; break;
+            case 32: client->pSwapReplyFunc = (ReplySwapPtr)CopySwap32Write; break;
+            case 16: client->pSwapReplyFunc = (ReplySwapPtr)CopySwap16Write; break;
+            default: client->pSwapReplyFunc = (ReplySwapPtr)WriteToClient; break;
         }
-        WriteSwappedDataToClient(client, len,
-                                 (char *)prop_value->data + ind);
+        WriteSwappedDataToClient(client, length, data);
     }
 
+    /* delete the Property */
     if (stuff->delete && (reply.bytesAfter == 0))
-    { /* delete the Property */
-        *prev = prop->next;
-        XIDestroyDeviceProperty (prop);
+    {
+        XIPropertyPtr prop, *prev;
+        for (prev = &dev->properties.properties; (prop = *prev); prev = &prop->next)
+        {
+            if (prop->propertyName == stuff->property)
+            {
+                *prev = prop->next;
+                XIDestroyDeviceProperty(prop);
+                break;
+            }
+        }
     }
-    return(client->noClientException);
+    return Success;
 }
 
 
commit f6f1e417063d2d61d65731a7e3ebca3ec2bdaacc
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 6 22:25:28 2009 +1000

    Xi: fix copy/paste error causing sizeof against wrong struct.
    
    This wrong check may cause BadLength to be returned to the client even if the
    length is correct.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c
index 8c6d53a..7e20e03 100644
--- a/Xi/xiproperty.c
+++ b/Xi/xiproperty.c
@@ -747,7 +747,7 @@ ProcXChangeDeviceProperty (ClientPtr client)
         return BadValue;
     }
     len = stuff->nUnits;
-    if (len > ((0xffffffff - sizeof(xChangePropertyReq)) >> 2))
+    if (len > ((0xffffffff - sizeof(xChangeDevicePropertyReq)) >> 2))
         return BadLength;
     sizeInBytes = format>>3;
     totalSize = len * sizeInBytes;
commit fc0013d744a345199f013ba5b6ef0e44201d0e68
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 6 16:55:32 2009 +1000

    Xi: don't double-swap the XListDeviceProperties reply.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c
index d633f51..8c6d53a 100644
--- a/Xi/xiproperty.c
+++ b/Xi/xiproperty.c
@@ -706,13 +706,6 @@ ProcXListDeviceProperties (ClientPtr client)
     rep.length = (numProps * sizeof(Atom)) >> 2;
     rep.sequenceNumber = client->sequence;
     rep.nAtoms = numProps;
-    if (client->swapped)
-    {
-        int n;
-        swaps (&rep.sequenceNumber, n);
-        swapl (&rep.length, n);
-        swaps (&rep.nAtoms, n);
-    }
     temppAtoms = pAtoms;
     for (prop = dev->properties.properties; prop; prop = prop->next)
         *temppAtoms++ = prop->propertyName;
commit 409012061b7d361a172b20455d4aaa5e47527c42
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 6 16:42:46 2009 +1000

    Xi: add missing break in XI event swapping function
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/extinit.c b/Xi/extinit.c
index ea778e6..eb2a901 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -794,6 +794,7 @@ XI2EventSwap(xGenericEvent *from, xGenericEvent *to)
         case XI_HierarchyChanged:
             SDeviceHierarchyEvent((xXIDeviceHierarchyEvent*)from,
                                   (xXIDeviceHierarchyEvent*)to);
+            break;
         default:
             SDeviceEvent((xXIDeviceEvent*)from, (xXIDeviceEvent*)to);
             break;
commit c3c64978c4a231a3a8c18211d0716df875c75efa
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 6 15:05:06 2009 +1000

    Xi: fix a couple of wrong dixLookupDevice permission tags.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiallowev.c b/Xi/xiallowev.c
index a8cf1b6..4df9a10 100644
--- a/Xi/xiallowev.c
+++ b/Xi/xiallowev.c
@@ -65,7 +65,7 @@ ProcXIAllowEvents(ClientPtr client)
     REQUEST(xXIAllowEventsReq);
     REQUEST_SIZE_MATCH(xXIAllowEventsReq);
 
-    ret = dixLookupDevice(&dev, stuff->deviceid, client, DixSetFocusAccess);
+    ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
     if (ret != Success)
 	return ret;
 
diff --git a/Xi/xigrabdev.c b/Xi/xigrabdev.c
index de13256..20f4e51 100644
--- a/Xi/xigrabdev.c
+++ b/Xi/xigrabdev.c
@@ -70,7 +70,7 @@ ProcXIGrabDevice(ClientPtr client)
     REQUEST(xXIGrabDeviceReq);
     REQUEST_AT_LEAST_SIZE(xXIGrabDeviceReq);
 
-    ret = dixLookupDevice(&dev, stuff->deviceid, client, DixSetFocusAccess);
+    ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGrabAccess);
     if (ret != Success)
 	return ret;
 
diff --git a/Xi/xisetdevfocus.c b/Xi/xisetdevfocus.c
index 5945abd..7201e65 100644
--- a/Xi/xisetdevfocus.c
+++ b/Xi/xisetdevfocus.c
@@ -95,7 +95,7 @@ ProcXIGetDeviceFocus(ClientPtr client)
     REQUEST(xXIGetDeviceFocusReq);
     REQUEST_AT_LEAST_SIZE(xXIGetDeviceFocusReq);
 
-    ret = dixLookupDevice(&dev, stuff->deviceid, client, DixSetFocusAccess);
+    ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetFocusAccess);
     if (ret != Success)
 	return ret;
     if (!dev->focus)
commit 0d947aa8e87c5d92b702c60190c8bc5d32c9ba9c
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 6 12:07:07 2009 +1000

    xfree86: fix xf86PostMotionEventP type checking
    
    We only put internal events into the queue now, so let's check for ET_Motion
    rather than the MotionNotify.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 3859741..6b34aad 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -744,7 +744,7 @@ xf86PostMotionEventP(DeviceIntPtr	device,
     int i = 0, nevents = 0;
     int dx = 0, dy = 0;
     Bool drag = xf86SendDragEvents(device);
-    xEvent *xE = NULL;
+    DeviceEvent *event;
     int index;
     int flags = 0;
 
@@ -790,10 +790,11 @@ xf86PostMotionEventP(DeviceIntPtr	device,
                                valuators);
 
     for (i = 0; i < nevents; i++) {
-        xE = (xf86Events + i)->event;
+        event = (DeviceEvent*)((xf86Events + i)->event);
         /* Don't post core motion events for devices not registered to send
          * drag events. */
-        if (xE->u.u.type != MotionNotify || drag) {
+        if (event->header == ET_Internal &&
+            (event->type != ET_Motion || drag)) {
             mieqEnqueue(device, (InternalEvent*)((xf86Events + i)->event));
         }
     }
commit 9457ce448988dacea9a3a1c14b6955767118ff31
Author: Simon Thum <simon.thum at gmx.de>
Date:   Thu Apr 30 13:01:17 2009 +0200

    dix: remove superfluous includes from ptrveloc.c
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c
index 7c49cf5..7fa4200 100644
--- a/dix/ptrveloc.c
+++ b/dix/ptrveloc.c
@@ -28,11 +28,8 @@
 
 #include <math.h>
 #include <ptrveloc.h>
-#include <inputstr.h>
 #include <exevents.h>
 #include <X11/Xatom.h>
-#include <assert.h>
-#include <os.h>
 
 #include <xserver-properties.h>
 
commit ee30e1b102d779403eeda97e007b81e85f006a37
Author: Simon Thum <simon.thum at gmx.de>
Date:   Thu Apr 30 12:58:48 2009 +0200

    dix: fix warning in pointer acceleration
    
    newer gcc's warn against how this cast is done (though it eludes me why),
    and lrintf() is also faster especially on insane processors like the P4
    (http://www.mega-nerd.com/FPcast).
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c
index 1590cfd..7c49cf5 100644
--- a/dix/ptrveloc.c
+++ b/dix/ptrveloc.c
@@ -988,14 +988,20 @@ acceleratePointerPredictable(
 
                 if (dx) {
                     tmp = mult * fdx + pDev->last.remainder[0];
-                    *px = (int)roundf(tmp);
+                    /* Since it may not be apparent: lrintf() does not offer
+                     * strong statements about rounding; however because we
+                     * process each axis conditionally, there's no danger
+                     * of a toggling remainder. Its lack of guarantees hopefully
+                     * makes it faster on the average target. */
+                    *px = lrintf(tmp);
                     pDev->last.remainder[0] = tmp - (float)*px;
                 }
                 if (dy) {
                     tmp = mult * fdy + pDev->last.remainder[1];
-                    *py = (int)roundf(tmp);
+                    *py = lrintf(tmp);
                     pDev->last.remainder[1] = tmp - (float)*py;
                 }
+                DebugAccelF("pos (%i | %i) remainders x: %.3f y: %.3f delta x:%.3f y:%.3f\n", *px, *py, pDev->last.remainder[0], pDev->last.remainder[1], fdx, fdy);
             }
         }
     }
commit 5cf70183812541b33a6e83c7e1e3bc6198730cbe
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue May 5 21:00:31 2009 +1000

    xkb: remove _XkbAlloc, _XkbCalloc, _XkbRealloc and _XkbFree
    
    We all agree that wrapping is fun, but seriously. One of these days someone
    will get hurt.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index 74d5f29..c3f6491 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -301,15 +301,11 @@ extern _X_EXPORT pointer	XkbLastRepeatEvent;
 
 extern _X_EXPORT CARD32	xkbDebugFlags;
 
-#define	_XkbAlloc(s)		xalloc((s))
-#define	_XkbCalloc(n,s)		Xcalloc((n)*(s))
-#define	_XkbRealloc(o,s)	Xrealloc((o),(s))
 #define	_XkbTypedAlloc(t)	((t *)xalloc(sizeof(t)))
 #define	_XkbTypedCalloc(n,t)	((t *)Xcalloc((n)*sizeof(t)))
 #define	_XkbTypedRealloc(o,n,t) \
 	((o)?(t *)Xrealloc((o),(n)*sizeof(t)):_XkbTypedCalloc(n,t))
 #define	_XkbClearElems(a,f,l,t)	bzero(&(a)[f],((l)-(f)+1)*sizeof(t))
-#define	_XkbFree(p)		Xfree(p)
 
 #define	_XkbLibError(c,l,d) /* Epoch fail */
 #define	_XkbErrCode2(a,b) ((XID)((((unsigned int)(a))<<24)|((b)&0xffffff)))
diff --git a/xkb/XKBAlloc.c b/xkb/XKBAlloc.c
index 559a524..7265d83 100644
--- a/xkb/XKBAlloc.c
+++ b/xkb/XKBAlloc.c
@@ -58,7 +58,7 @@ XkbSymInterpretRec *prev_interpret;
 	compat->sym_interpret= _XkbTypedRealloc(compat->sym_interpret,
 						     nSI,XkbSymInterpretRec);
 	if (compat->sym_interpret==NULL) {
-	    _XkbFree(prev_interpret);
+	    xfree(prev_interpret);
 	    compat->size_si= compat->num_si= 0;
 	    return BadAlloc;
 	}
@@ -74,7 +74,7 @@ XkbSymInterpretRec *prev_interpret;
     if (nSI>0) {
 	compat->sym_interpret= _XkbTypedCalloc(nSI,XkbSymInterpretRec);
 	if (!compat->sym_interpret) {
-	    _XkbFree(compat);
+	    xfree(compat);
 	    return BadAlloc;
 	}
     }
@@ -100,12 +100,12 @@ register XkbCompatMapPtr compat;
 	bzero((char *)&compat->groups[0],XkbNumKbdGroups*sizeof(XkbModsRec));
     if (which&XkbSymInterpMask) {
 	if ((compat->sym_interpret)&&(compat->size_si>0))
-	    _XkbFree(compat->sym_interpret);
+	    xfree(compat->sym_interpret);
 	compat->size_si= compat->num_si= 0;
 	compat->sym_interpret= NULL;
     }
     if (freeMap) {
-	_XkbFree(compat);
+	xfree(compat);
 	xkb->compat= NULL;
     }
     return;
@@ -161,7 +161,7 @@ XkbNamesPtr	names;
 		_XkbClearElems(names->key_aliases,names->num_key_aliases,
 						nTotalAliases-1,XkbKeyAliasRec);
 	    } else {
-		_XkbFree(prev_aliases);
+		xfree(prev_aliases);
 	    }
 	}
 	if (names->key_aliases==NULL) {
@@ -183,7 +183,7 @@ XkbNamesPtr	names;
 		_XkbClearElems(names->radio_groups,names->num_rg,nTotalRG-1,
 									Atom);
 	    } else {
-		_XkbFree(prev_radio_groups);
+		xfree(prev_radio_groups);
 	    }
 	}
 	if (names->radio_groups==NULL)
@@ -211,29 +211,29 @@ XkbNamesPtr	names;
 	    type= map->types;
 	    for (i=0;i<map->num_types;i++,type++) {
 		if (type->level_names!=NULL) {
-		    _XkbFree(type->level_names);
+		    xfree(type->level_names);
 		    type->level_names= NULL;
 		}
 	    }
 	}
     }
     if ((which&XkbKeyNamesMask)&&(names->keys!=NULL)) {
-	_XkbFree(names->keys);
+	xfree(names->keys);
 	names->keys= NULL;
 	names->num_keys= 0;
     }
     if ((which&XkbKeyAliasesMask)&&(names->key_aliases)){
-	_XkbFree(names->key_aliases);
+	xfree(names->key_aliases);
 	names->key_aliases=NULL;
 	names->num_key_aliases=0;
     }
     if ((which&XkbRGNamesMask)&&(names->radio_groups)) {
-	_XkbFree(names->radio_groups);
+	xfree(names->radio_groups);
 	names->radio_groups= NULL;
 	names->num_rg= 0;
     }
     if (freeMap) {
-	_XkbFree(names);
+	xfree(names);
 	xkb->names= NULL;
     }
     return;
@@ -261,7 +261,7 @@ static void
 XkbFreeControls(XkbDescPtr xkb,unsigned which,Bool freeMap)
 {
     if (freeMap && (xkb!=NULL) && (xkb->ctrls!=NULL)) {
-	_XkbFree(xkb->ctrls);
+	xfree(xkb->ctrls);
 	xkb->ctrls= NULL;
     }
     return;
@@ -286,7 +286,7 @@ static void
 XkbFreeIndicatorMaps(XkbDescPtr xkb)
 {
     if ((xkb!=NULL)&&(xkb->indicators!=NULL)) {
-	_XkbFree(xkb->indicators);
+	xfree(xkb->indicators);
 	xkb->indicators= NULL;
     }
     return;
@@ -330,6 +330,6 @@ XkbFreeKeyboard(XkbDescPtr xkb,unsigned which,Bool freeAll)
     if (which&XkbControlsMask)
 	XkbFreeControls(xkb,XkbAllControlsMask,True);
     if (freeAll)
-	_XkbFree(xkb);
+	xfree(xkb);
     return;
 }
diff --git a/xkb/XKBGAlloc.c b/xkb/XKBGAlloc.c
index 9561a3d..752b11a 100644
--- a/xkb/XKBGAlloc.c
+++ b/xkb/XKBGAlloc.c
@@ -51,7 +51,7 @@ _XkbFreeGeomLeafElems(	Bool			freeAll,
     if ((freeAll)||(*elems==NULL)) {
 	*num_inout= *sz_inout= 0;
 	if (*elems!=NULL) {
-	    _XkbFree(*elems);
+	    xfree(*elems);
 	    *elems= NULL;
 	}	
 	return;
@@ -115,7 +115,7 @@ register char *ptr;
     if (freeAll) {
 	(*num_inout)= (*sz_inout)= 0;
 	if (*elems) {
-	    _XkbFree(*elems);
+	    xfree(*elems);
 	    *elems= NULL;
 	}
     }
@@ -138,11 +138,11 @@ _XkbClearProperty(char *prop_in)
 XkbPropertyPtr	prop= (XkbPropertyPtr)prop_in;
 
     if (prop->name) {
-	_XkbFree(prop->name);
+	xfree(prop->name);
 	prop->name= NULL;
     }
     if (prop->value) {
-	_XkbFree(prop->value);
+	xfree(prop->value);
 	prop->value= NULL;
     }
     return;
@@ -184,7 +184,7 @@ _XkbClearColor(char *color_in)
 XkbColorPtr	color= (XkbColorPtr)color_in;
 
     if (color->spec)
-	_XkbFree(color->spec);
+	xfree(color->spec);
     return;
 }
 
@@ -381,11 +381,11 @@ XkbDoodadPtr	doodad= (XkbDoodadPtr)doodad_in;
    	case XkbTextDoodad: 
 	    {
 		if (doodad->text.text!=NULL) {
-		    _XkbFree(doodad->text.text);
+		    xfree(doodad->text.text);
 		    doodad->text.text= NULL;
 		}
 		if (doodad->text.font!=NULL) {
-		    _XkbFree(doodad->text.font);
+		    xfree(doodad->text.font);
 		    doodad->text.font= NULL;
 		}
 	    }
@@ -393,7 +393,7 @@ XkbDoodadPtr	doodad= (XkbDoodadPtr)doodad_in;
    	case XkbLogoDoodad: 
 	    {
 		if (doodad->logo.logo_name!=NULL) {
-		    _XkbFree(doodad->logo.logo_name);
+		    xfree(doodad->logo.logo_name);
 		    doodad->logo.logo_name= NULL;
 		}
 	    }
@@ -413,7 +413,7 @@ register XkbDoodadPtr	doodad;
 	    _XkbClearDoodad((char *)doodad);
 	}
 	if (freeAll)
-	    _XkbFree(doodads);
+	    xfree(doodads);
     }
     return;
 }
@@ -442,10 +442,10 @@ XkbFreeGeometry(XkbGeometryPtr geom,unsigned which,Bool freeMap)
 	XkbFreeGeomKeyAliases(geom,0,geom->num_key_aliases,True);
     if (freeMap) {
 	if (geom->label_font!=NULL) {
-	    _XkbFree(geom->label_font);
+	    xfree(geom->label_font);
 	    geom->label_font= NULL;
 	}
-	_XkbFree(geom);
+	xfree(geom);
     }
     return;
 }
@@ -469,8 +469,8 @@ _XkbGeomAlloc(	void **		old,
 
     *total= (*num)+num_new;
     if ((*old)!=NULL)
-	 (*old)= _XkbRealloc((*old),(*total)*sz_elem);
-    else (*old)= _XkbCalloc((*total),sz_elem);
+	 (*old)= xrealloc((*old),(*total)*sz_elem);
+    else (*old)= xcalloc((*total),sz_elem);
     if ((*old)==NULL) {
 	*total= *num= 0;
 	return BadAlloc;
@@ -664,8 +664,8 @@ register XkbPropertyPtr prop;
     for (i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) {
 	if ((prop->name)&&(strcmp(name,prop->name)==0)) {
 	    if (prop->value)
-		_XkbFree(prop->value);
-	    prop->value= (char *)_XkbAlloc(strlen(value)+1);
+		xfree(prop->value);
+	    prop->value= xalloc(strlen(value)+1);
 	    if (prop->value)
 		strcpy(prop->value,value);
 	    return prop;
@@ -676,13 +676,13 @@ register XkbPropertyPtr prop;
 	return NULL;
     }
     prop= &geom->properties[geom->num_properties];
-    prop->name= (char *)_XkbAlloc(strlen(name)+1);
+    prop->name= xalloc(strlen(name)+1);
     if (!name)
 	return NULL;
     strcpy(prop->name,name);
-    prop->value= (char *)_XkbAlloc(strlen(value)+1);
+    prop->value= xalloc(strlen(value)+1);
     if (!value) {
-	_XkbFree(prop->name);
+	xfree(prop->name);
 	prop->name= NULL;
 	return NULL;
     }
@@ -738,7 +738,7 @@ register XkbColorPtr color;
     }
     color= &geom->colors[geom->num_colors];
     color->pixel= pixel;
-    color->spec= (char *)_XkbAlloc(strlen(spec)+1);
+    color->spec= xalloc(strlen(spec)+1);
     if (!color->spec)
 	return NULL;
     strcpy(color->spec,spec);
@@ -852,7 +852,7 @@ XkbSectionPtr	section;
 	return NULL;
     if ((sz_doodads>0)&&(_XkbAllocDoodads(section,sz_doodads)!=Success)) {
 	if (section->rows) {
-	    _XkbFree(section->rows);
+	    xfree(section->rows);
 	    section->rows= NULL;
 	    section->sz_rows= section->num_rows= 0;
 	}
diff --git a/xkb/XKBMAlloc.c b/xkb/XKBMAlloc.c
index de8ee29..728c029 100644
--- a/xkb/XKBMAlloc.c
+++ b/xkb/XKBMAlloc.c
@@ -79,7 +79,7 @@ XkbClientMapPtr map;
 
 	    map->types= _XkbTypedRealloc(map->types,nTotalTypes,XkbKeyTypeRec);
 	    if (map->types==NULL) {
-		_XkbFree(prev_types);
+		xfree(prev_types);
 		map->num_types= map->size_types= 0;
 		return BadAlloc;
 	    }
@@ -172,7 +172,7 @@ XkbServerMapPtr map;
 	    need= map->num_acts+nNewActions;
 	    map->acts= _XkbTypedRealloc(map->acts,need,XkbAction);
 	    if (map->acts==NULL) {
-		_XkbFree(prev_acts);
+		xfree(prev_acts);
 	        map->num_acts= map->size_acts= 0;
 	        return BadAlloc;
 	    }
@@ -222,15 +222,15 @@ XkbCopyKeyType(XkbKeyTypePtr from,XkbKeyTypePtr into)
     if ((!from)||(!into))
 	return BadMatch;
     if (into->map) {
-	_XkbFree(into->map);
+	xfree(into->map);
 	into->map= NULL;
     }
     if (into->preserve) {
-	_XkbFree(into->preserve);
+	xfree(into->preserve);
 	into->preserve= NULL;
     }
     if (into->level_names) {
-	_XkbFree(into->level_names);
+	xfree(into->level_names);
 	into->level_names= NULL;
     }
     *into= *from;
@@ -299,10 +299,10 @@ KeyCode		matchingKeys[XkbMaxKeyCount],nMatchingKeys;
     type= &xkb->map->types[type_ndx];
     if (map_count==0) {
 	if (type->map!=NULL)
-	    _XkbFree(type->map);
+	    xfree(type->map);
 	type->map= NULL;
 	if (type->preserve!=NULL)
-	    _XkbFree(type->preserve);
+	    xfree(type->preserve);
 	type->preserve= NULL;
 	type->map_count= 0;
     }
@@ -313,7 +313,7 @@ KeyCode		matchingKeys[XkbMaxKeyCount],nMatchingKeys;
 	    type->map=_XkbTypedRealloc(type->map,map_count,XkbKTMapEntryRec);
 	if (!type->map) {
 	    if (prev_map) 
-		_XkbFree(prev_map);
+		xfree(prev_map);
 	    return BadAlloc;
 	}
 	if (want_preserve) {
@@ -325,12 +325,12 @@ KeyCode		matchingKeys[XkbMaxKeyCount],nMatchingKeys;
 	    }
 	    if (!type->preserve) {
 		if (prev_preserve) 
-		    _XkbFree(prev_preserve);
+		    xfree(prev_preserve);
 		return BadAlloc;
 	    }
 	}
 	else if (type->preserve!=NULL) {
-	    _XkbFree(type->preserve);
+	    xfree(type->preserve);
 	    type->preserve= NULL;
 	}
 	type->map_count= map_count;
@@ -342,7 +342,7 @@ KeyCode		matchingKeys[XkbMaxKeyCount],nMatchingKeys;
 	type->level_names=_XkbTypedRealloc(type->level_names,new_num_lvls,Atom);
 	if (!type->level_names) {
 	    if (prev_level_names) 
-		_XkbFree(prev_level_names);
+		xfree(prev_level_names);
 	    return BadAlloc;
 	}
     }
@@ -422,7 +422,7 @@ KeyCode		matchingKeys[XkbMaxKeyCount],nMatchingKeys;
 		}
 	    }
 	    type->num_levels= new_num_lvls;
-	    _XkbFree(xkb->map->syms);
+	    xfree(xkb->map->syms);
 	    xkb->map->syms= newSyms;
 	    xkb->map->num_syms= nSyms;
 	    return Success;
@@ -518,7 +518,7 @@ KeySym	*newSyms;
 	xkb->map->key_sym_map[i].offset = nSyms;
 	nSyms+= nKeySyms;
     }
-    _XkbFree(xkb->map->syms);
+    xfree(xkb->map->syms);
     xkb->map->syms = newSyms;
     xkb->map->num_syms = nSyms;
     return &xkb->map->syms[xkb->map->key_sym_map[key].offset];
@@ -640,7 +640,7 @@ int	tmp;
 		xkb->map->key_sym_map= _XkbTypedRealloc(xkb->map->key_sym_map,
 						(maxKC+1),XkbSymMapRec);
 		if (!xkb->map->key_sym_map) {
-		    _XkbFree(prev_key_sym_map);
+		    xfree(prev_key_sym_map);
 		    return BadAlloc;
 		}
 		bzero((char *)&xkb->map->key_sym_map[xkb->max_key_code],
@@ -658,7 +658,7 @@ int	tmp;
 		xkb->map->modmap= _XkbTypedRealloc(xkb->map->modmap,
 						(maxKC+1),unsigned char);
 		if (!xkb->map->modmap) {
-		    _XkbFree(prev_modmap);
+		    xfree(prev_modmap);
 		    return BadAlloc;
 		}
 		bzero((char *)&xkb->map->modmap[xkb->max_key_code],tmp);
@@ -677,7 +677,7 @@ int	tmp;
 		xkb->server->behaviors=_XkbTypedRealloc(xkb->server->behaviors,
 						(maxKC+1),XkbBehavior);
 		if (!xkb->server->behaviors) {
-		    _XkbFree(prev_behaviors);
+		    xfree(prev_behaviors);
 		    return BadAlloc;
 		}
 		bzero((char *)&xkb->server->behaviors[xkb->max_key_code],
@@ -695,7 +695,7 @@ int	tmp;
 		xkb->server->key_acts= _XkbTypedRealloc(xkb->server->key_acts,
 						(maxKC+1),unsigned short);
 		if (!xkb->server->key_acts) {
-		    _XkbFree(prev_key_acts);
+		    xfree(prev_key_acts);
 		    return BadAlloc;
 		}
 		bzero((char *)&xkb->server->key_acts[xkb->max_key_code],
@@ -713,7 +713,7 @@ int	tmp;
 		xkb->server->vmodmap= _XkbTypedRealloc(xkb->server->vmodmap,
 						(maxKC+1),unsigned short);
 		if (!xkb->server->vmodmap) {
-		    _XkbFree(prev_vmodmap);
+		    xfree(prev_vmodmap);
 		    return BadAlloc;
 		}
 		bzero((char *)&xkb->server->vmodmap[xkb->max_key_code],
@@ -732,7 +732,7 @@ int	tmp;
 	    xkb->names->keys= _XkbTypedRealloc(xkb->names->keys,
 	    					(maxKC+1),XkbKeyNameRec);
 	    if (!xkb->names->keys) {
-		_XkbFree(prev_keys);
+		xfree(prev_keys);
 		return BadAlloc;
 	    }
 	    bzero((char *)&xkb->names->keys[xkb->max_key_code],
@@ -793,7 +793,7 @@ XkbAction *newActs;
 	xkb->server->key_acts[i]= nActs;
 	nActs+= nKeyActs;
     }
-    _XkbFree(xkb->server->acts);
+    xfree(xkb->server->acts);
     xkb->server->acts = newActs;
     xkb->server->num_acts= nActs;
     return &xkb->server->acts[xkb->server->key_acts[key]];
@@ -816,42 +816,42 @@ XkbClientMapPtr	map;
 		XkbKeyTypePtr	type;
 		for (i=0,type=map->types;i<map->num_types;i++,type++) {
 		    if (type->map!=NULL) {
-			_XkbFree(type->map);
+			xfree(type->map);
 			type->map= NULL;
 		    }
 		    if (type->preserve!=NULL) {
-			_XkbFree(type->preserve);
+			xfree(type->preserve);
 			type->preserve= NULL;
 		    }
 		    type->map_count= 0;
 		    if (type->level_names!=NULL) {
-			_XkbFree(type->level_names);
+			xfree(type->level_names);
 			type->level_names= NULL;
 		    }
 		}
 	    }
-	    _XkbFree(map->types);
+	    xfree(map->types);
 	    map->num_types= map->size_types= 0;
 	    map->types= NULL;
 	}
     }
     if (what&XkbKeySymsMask) {
 	if (map->key_sym_map!=NULL) {
-	    _XkbFree(map->key_sym_map);
+	    xfree(map->key_sym_map);
 	    map->key_sym_map= NULL;
 	}
 	if (map->syms!=NULL) {
-	    _XkbFree(map->syms);
+	    xfree(map->syms);
 	    map->size_syms= map->num_syms= 0;
 	    map->syms= NULL;
 	}
     }
     if ((what&XkbModifierMapMask)&&(map->modmap!=NULL)) {
-	_XkbFree(map->modmap);
+	xfree(map->modmap);
 	map->modmap= NULL;
     }
     if (freeMap) {
-	_XkbFree(xkb->map);
+	xfree(xkb->map);
 	xkb->map= NULL;
     }
     return;
@@ -868,31 +868,31 @@ XkbServerMapPtr	map;
 	what= XkbAllServerInfoMask;
     map= xkb->server;
     if ((what&XkbExplicitComponentsMask)&&(map->explicit!=NULL)) {
-	_XkbFree(map->explicit);
+	xfree(map->explicit);
 	map->explicit= NULL;
     }
     if (what&XkbKeyActionsMask) {
 	if (map->key_acts!=NULL) {
-	    _XkbFree(map->key_acts);
+	    xfree(map->key_acts);
 	    map->key_acts= NULL;
 	}
 	if (map->acts!=NULL) {
-	    _XkbFree(map->acts);
+	    xfree(map->acts);
 	    map->num_acts= map->size_acts= 0;
 	    map->acts= NULL;
 	}
     }
     if ((what&XkbKeyBehaviorsMask)&&(map->behaviors!=NULL)) {
-	_XkbFree(map->behaviors);
+	xfree(map->behaviors);
 	map->behaviors= NULL;
     }
     if ((what&XkbVirtualModMapMask)&&(map->vmodmap!=NULL)) {
-	_XkbFree(map->vmodmap);
+	xfree(map->vmodmap);
 	map->vmodmap= NULL;
     }
 
     if (freeMap) {
-	_XkbFree(xkb->server);
+	xfree(xkb->server);
 	xkb->server= NULL;
     }
     return;
diff --git a/xkb/XKBMisc.c b/xkb/XKBMisc.c
index 82d37d1..9cb7061 100644
--- a/xkb/XKBMisc.c
+++ b/xkb/XKBMisc.c
@@ -507,7 +507,7 @@ unsigned		changed,tmp;
 	mc->changed|= changed;
     }
     if (interps!=ibuf)
-	_XkbFree(interps);
+	xfree(interps);
     return True;
 }
 
diff --git a/xkb/maprules.c b/xkb/maprules.c
index a0141a3..168c527 100644
--- a/xkb/maprules.c
+++ b/xkb/maprules.c
@@ -78,7 +78,7 @@ static void
 FreeInputLine(InputLine *line)
 {
     if (line->line!=line->buf)
-	_XkbFree(line->line);
+	xfree(line->line);
     line->line_num= 1;
     line->num_line= 0;
     line->sz_line= DFLT_LINE_SIZE;
@@ -91,11 +91,11 @@ InputLineAddChar(InputLine *line,int ch)
 {
     if (line->num_line>=line->sz_line) {
 	if (line->line==line->buf) {
-	    line->line= (char *)_XkbAlloc(line->sz_line*2);
+	    line->line= xalloc(line->sz_line*2);
 	    memcpy(line->line,line->buf,line->sz_line);
 	}
 	else {
-	    line->line=(char *)_XkbRealloc((char *)line->line,line->sz_line*2);
+	    line->line= xrealloc((char *)line->line,line->sz_line*2);
 	}
 	line->sz_line*= 2;
     }
@@ -553,9 +553,9 @@ MakeMultiDefs(XkbRF_MultiDefsPtr mdefs, XkbRF_VarDefsPtr defs)
 static void
 FreeMultiDefs(XkbRF_MultiDefsPtr defs)
 {
-  if (defs->options) _XkbFree(defs->options);
-  if (defs->layout[1])  _XkbFree(defs->layout[1]);
-  if (defs->variant[1])  _XkbFree(defs->variant[1]);
+  if (defs->options) xfree(defs->options);
+  if (defs->layout[1])  xfree(defs->layout[1]);
+  if (defs->variant[1])  xfree(defs->variant[1]);
 }
 
 static void
@@ -769,7 +769,7 @@ int	len, ndx;
 	}
 	str= index(&str[0],'%');
     }
-    name= (char *)_XkbAlloc(len+1);
+    name= xalloc(len+1);
     str= orig;
     outstr= name;
     while (*str!='\0') {
@@ -819,7 +819,7 @@ int	len, ndx;
     }
     *outstr++= '\0';
     if (orig!=name)
-	_XkbFree(orig);
+	xfree(orig);
     return name;
 }
 
@@ -988,32 +988,32 @@ XkbRF_GroupPtr	group;
 	return;
     if (rules->rules) {
 	for (i=0,rule=rules->rules;i<rules->num_rules;i++,rule++) {
-	    if (rule->model)	_XkbFree(rule->model);
-	    if (rule->layout)	_XkbFree(rule->layout);
-	    if (rule->variant)	_XkbFree(rule->variant);
-	    if (rule->option)	_XkbFree(rule->option);
-	    if (rule->keycodes)	_XkbFree(rule->keycodes);
-	    if (rule->symbols)	_XkbFree(rule->symbols);
-	    if (rule->types)	_XkbFree(rule->types);
-	    if (rule->compat)	_XkbFree(rule->compat);
-	    if (rule->geometry)	_XkbFree(rule->geometry);
+	    if (rule->model)	xfree(rule->model);
+	    if (rule->layout)	xfree(rule->layout);
+	    if (rule->variant)	xfree(rule->variant);
+	    if (rule->option)	xfree(rule->option);
+	    if (rule->keycodes)	xfree(rule->keycodes);
+	    if (rule->symbols)	xfree(rule->symbols);
+	    if (rule->types)	xfree(rule->types);
+	    if (rule->compat)	xfree(rule->compat);
+	    if (rule->geometry)	xfree(rule->geometry);
 	    bzero((char *)rule,sizeof(XkbRF_RuleRec));
 	}
-	_XkbFree(rules->rules);
+	xfree(rules->rules);
 	rules->num_rules= rules->sz_rules= 0;
 	rules->rules= NULL;
     }
 
     if (rules->groups) {
 	for (i=0, group=rules->groups;i<rules->num_groups;i++,group++) {
-	    if (group->name)	_XkbFree(group->name);
-	    if (group->words)	_XkbFree(group->words);
+	    if (group->name)	xfree(group->name);
+	    if (group->words)	xfree(group->words);
 	}
-	_XkbFree(rules->groups);
+	xfree(rules->groups);
 	rules->num_groups= 0;
 	rules->groups= NULL;
     }
     if (freeRules)
-	_XkbFree(rules);
+	xfree(rules);
     return;
 }
diff --git a/xkb/xkb.c b/xkb/xkb.c
index b2fe11c..445c55f 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -1363,7 +1363,7 @@ unsigned	i,len;
 char		*desc,*start;
 
     len= (rep->length*4)-(SIZEOF(xkbGetMapReply)-SIZEOF(xGenericReply));
-    start= desc= (char *)xcalloc(1, len);
+    start= desc= xcalloc(1, len);
     if (!start)
 	return BadAlloc;
     if ( rep->nTypes>0 )
@@ -2184,8 +2184,8 @@ unsigned	 first,last;
     if (maxRG>(int)xkbi->nRadioGroups) {
         int sz = maxRG*sizeof(XkbRadioGroupRec);
         if (xkbi->radioGroups)
-             xkbi->radioGroups=(XkbRadioGroupPtr)_XkbRealloc(xkbi->radioGroups,sz);
-        else xkbi->radioGroups= (XkbRadioGroupPtr)_XkbCalloc(1, sz);
+             xkbi->radioGroups= xrealloc(xkbi->radioGroups,sz);
+        else xkbi->radioGroups= xcalloc(1, sz);
         if (xkbi->radioGroups) {
              if (xkbi->nRadioGroups)
                 bzero(&xkbi->radioGroups[xkbi->nRadioGroups],
@@ -2627,7 +2627,7 @@ int		size;
 
     size= rep->length*4;
     if (size>0) {
-	data = (char *)xalloc(size);
+	data = xalloc(size);
 	if (data) {
 	    register unsigned i,bit;
 	    xkbModsWireDesc *	grp;
@@ -2994,7 +2994,7 @@ register unsigned	bit;
     length = rep->length*4;
     if (length>0) {
 	CARD8 *to;
-	to= map= (CARD8 *)xalloc(length);
+	to= map= xalloc(length);
 	if (map) {
 	    xkbIndicatorMapWireDesc  *wire = (xkbIndicatorMapWireDesc *)to;
 	    for (i=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
@@ -3630,7 +3630,7 @@ register int            n;
 	swapl(&rep->indicators,n);
     }
 
-    start = desc = (char *)xalloc(length);
+    start = desc = xalloc(length);
     if ( !start )
 	return BadAlloc;
     if (xkb->names) {
@@ -4116,7 +4116,7 @@ _XkbSetNames(ClientPtr client, DeviceIntPtr dev, xkbSetNamesReq *stuff)
             tmp+= stuff->nKeyAliases*2;
         }
         else if (names->key_aliases!=NULL) {
-            _XkbFree(names->key_aliases);
+            xfree(names->key_aliases);
             names->key_aliases= NULL;
             names->num_key_aliases= 0;
         }
@@ -4135,7 +4135,7 @@ _XkbSetNames(ClientPtr client, DeviceIntPtr dev, xkbSetNamesReq *stuff)
             tmp+= stuff->nRadioGroups;
         }
         else if (names->radio_groups) {
-            _XkbFree(names->radio_groups);
+            xfree(names->radio_groups);
             names->radio_groups= NULL;
             names->num_rg= 0;
         }
@@ -4735,7 +4735,7 @@ XkbSendGeometry(	ClientPtr		client,
 
     if (geom!=NULL) {
 	len= rep->length*4;
-	start= desc= (char *)xalloc(len);
+	start= desc= xalloc(len);
 	if (!start)
 	    return BadAlloc;
 	desc=  XkbWriteCountedString(desc,geom->label_font,client->swapped);
@@ -4829,7 +4829,7 @@ CARD16	len,*plen;
 	swaps(plen,n);
     }
     len= *plen;
-    str= (char *)_XkbAlloc(len+1);
+    str= xalloc(len+1);
     if (str) {
 	memcpy(str,&wire[2],len);
 	str[len]= '\0';
@@ -5444,7 +5444,7 @@ unsigned char	*wire,*str,*tmp,*legal;
     wire= *pWire;
     len= (*(unsigned char *)wire++);
     if (len>0) {
-	str= (unsigned char *)_XkbCalloc(1, len+1);
+	str= xcalloc(1, len+1);
 	if (str) {
 	    tmp= str;
 	    for (i=0;i<len;i++) {
@@ -5455,7 +5455,7 @@ unsigned char	*wire,*str,*tmp,*legal;
 	    if (tmp!=str)
 		*tmp++= '\0';
 	    else {
-		_XkbFree(str);
+		xfree(str);
 		str= NULL;
 	    }
 	}
@@ -5506,7 +5506,7 @@ ProcXkbListComponents(ClientPtr client)
 	return BadLength;
     if ((status=XkbDDXList(dev,&list,client))!=Success) {
 	if (list.pool) {
-	    _XkbFree(list.pool);
+	    xfree(list.pool);
 	    list.pool= NULL;
 	}
 	return status;
@@ -5540,7 +5540,7 @@ ProcXkbListComponents(ClientPtr client)
     WriteToClient(client,SIZEOF(xkbListComponentsReply),(char *)&rep);
     if (list.nPool && list.pool) {
 	WriteToClient(client,XkbPaddedSize(list.nPool), (char *)list.pool);
-	_XkbFree(list.pool);
+	xfree(list.pool);
 	list.pool= NULL;
     }
     return client->noClientException;
@@ -5869,11 +5869,11 @@ ProcXkbGetKbdByName(ClientPtr client)
 	XkbFreeKeyboard(new,XkbAllComponentsMask,True);
 	new= NULL;
     }
-    if (names.keycodes)	{ _XkbFree(names.keycodes); names.keycodes= NULL; }
-    if (names.types)	{ _XkbFree(names.types); names.types= NULL; }
-    if (names.compat)	{ _XkbFree(names.compat); names.compat= NULL; }
-    if (names.symbols)	{ _XkbFree(names.symbols); names.symbols= NULL; }
-    if (names.geometry)	{ _XkbFree(names.geometry); names.geometry= NULL; }
+    if (names.keycodes)	{ xfree(names.keycodes); names.keycodes= NULL; }
+    if (names.types)	{ xfree(names.types); names.types= NULL; }
+    if (names.compat)	{ xfree(names.compat); names.compat= NULL; }
+    if (names.symbols)	{ xfree(names.symbols); names.symbols= NULL; }
+    if (names.geometry)	{ xfree(names.geometry); names.geometry= NULL; }
     return client->noClientException;
 }
 
@@ -6188,7 +6188,7 @@ char *			str;
     }
     WriteToClient(client,SIZEOF(xkbGetDeviceInfoReply), (char *)&rep);
 
-    str= (char*) xalloc(nameLen);
+    str= xalloc(nameLen);
     if (!str) 
 	return BadAlloc;
     XkbWriteCountedString(str,dev->name,client->swapped);
diff --git a/xkb/xkbEvents.c b/xkb/xkbEvents.c
index 9293c60..489f309 100644
--- a/xkb/xkbEvents.c
+++ b/xkb/xkbEvents.c
@@ -1136,7 +1136,7 @@ ClientPtr	client = NULL;
 	    autoCtrls= interest->autoCtrls;
 	    autoValues= interest->autoCtrlValues;
 	    client= interest->client;
-	    _XkbFree(interest);
+	    xfree(interest);
 	    found= True;
 	}
 	while ((!found)&&(interest->next)) {
@@ -1146,7 +1146,7 @@ ClientPtr	client = NULL;
 		autoCtrls= victim->autoCtrls;
 		autoValues= victim->autoCtrlValues;
 		client= victim->client;
-		_XkbFree(victim);
+		xfree(victim);
 		found= True;
 	    }
 	    interest = interest->next;
diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c
index 7c611bc..bea8ce0 100644
--- a/xkb/xkbInit.c
+++ b/xkb/xkbInit.c
@@ -222,19 +222,19 @@ static void
 XkbSetRulesUsed(XkbRMLVOSet *rmlvo)
 {
     if (XkbRulesUsed)
-        _XkbFree(XkbRulesUsed);
+        xfree(XkbRulesUsed);
     XkbRulesUsed= (rmlvo->rules?_XkbDupString(rmlvo->rules):NULL);
     if (XkbModelUsed)
-	_XkbFree(XkbModelUsed);
+	xfree(XkbModelUsed);
     XkbModelUsed= (rmlvo->model?_XkbDupString(rmlvo->model):NULL);
     if (XkbLayoutUsed)
-	_XkbFree(XkbLayoutUsed);
+	xfree(XkbLayoutUsed);
     XkbLayoutUsed= (rmlvo->layout?_XkbDupString(rmlvo->layout):NULL);
     if (XkbVariantUsed)
-	_XkbFree(XkbVariantUsed);
+	xfree(XkbVariantUsed);
     XkbVariantUsed= (rmlvo->variant?_XkbDupString(rmlvo->variant):NULL);
     if (XkbOptionsUsed)
-	_XkbFree(XkbOptionsUsed);
+	xfree(XkbOptionsUsed);
     XkbOptionsUsed= (rmlvo->options?_XkbDupString(rmlvo->options):NULL);
     if (XkbWantRulesProp)
 	QueueWorkProc(XkbWriteRulesProp,NULL,NULL);
@@ -246,27 +246,27 @@ XkbSetRulesDflts(XkbRMLVOSet *rmlvo)
 {
     if (rmlvo->rules) {
         if (XkbRulesDflt)
-	    _XkbFree(XkbRulesDflt);
+	    xfree(XkbRulesDflt);
         XkbRulesDflt= _XkbDupString(rmlvo->rules);
     }
     if (rmlvo->model) {
 	if (XkbModelDflt)
-	    _XkbFree(XkbModelDflt);
+	    xfree(XkbModelDflt);
 	XkbModelDflt= _XkbDupString(rmlvo->model);
     }
     if (rmlvo->layout) {
 	if (XkbLayoutDflt)
-	    _XkbFree(XkbLayoutDflt);
+	    xfree(XkbLayoutDflt);
 	XkbLayoutDflt= _XkbDupString(rmlvo->layout);
     }
     if (rmlvo->variant) {
 	if (XkbVariantDflt)
-	    _XkbFree(XkbVariantDflt);
+	    xfree(XkbVariantDflt);
 	XkbVariantDflt= _XkbDupString(rmlvo->variant);
     }
     if (rmlvo->options) {
 	if (XkbOptionsDflt)
-	    _XkbFree(XkbOptionsDflt);
+	    xfree(XkbOptionsDflt);
 	XkbOptionsDflt= _XkbDupString(rmlvo->options);
     }
     return;
@@ -275,15 +275,15 @@ XkbSetRulesDflts(XkbRMLVOSet *rmlvo)
 void
 XkbDeleteRulesDflts(void)
 {
-    _XkbFree(XkbRulesDflt);
+    xfree(XkbRulesDflt);
     XkbRulesDflt = NULL;
-    _XkbFree(XkbModelDflt);
+    xfree(XkbModelDflt);
     XkbModelDflt = NULL;
-    _XkbFree(XkbLayoutDflt);
+    xfree(XkbLayoutDflt);
     XkbLayoutDflt = NULL;
-    _XkbFree(XkbVariantDflt);
+    xfree(XkbVariantDflt);
     XkbVariantDflt = NULL;
-    _XkbFree(XkbOptionsDflt);
+    xfree(XkbOptionsDflt);
     XkbOptionsDflt = NULL;
 
     XkbFreeKeyboard(xkb_cached_map, XkbAllComponentsMask, True);
@@ -643,7 +643,7 @@ void
 XkbFreeInfo(XkbSrvInfoPtr xkbi)
 {
     if (xkbi->radioGroups) {
-	_XkbFree(xkbi->radioGroups);
+	xfree(xkbi->radioGroups);
 	xkbi->radioGroups= NULL;
     }
     if (xkbi->mouseKeyTimer) {
@@ -675,7 +675,7 @@ XkbFreeInfo(XkbSrvInfoPtr xkbi)
 	XkbFreeKeyboard(xkbi->desc,XkbAllComponentsMask,True);
 	xkbi->desc= NULL;
     }
-    _XkbFree(xkbi);
+    xfree(xkbi);
     return;
 }
 
diff --git a/xkb/xkbLEDs.c b/xkb/xkbLEDs.c
index a70ac84..59cdba4 100644
--- a/xkb/xkbLEDs.c
+++ b/xkb/xkbLEDs.c
@@ -605,12 +605,12 @@ void
 XkbFreeSrvLedInfo(XkbSrvLedInfoPtr sli)
 {
     if ((sli->flags&XkbSLI_IsDefault)==0) {
-	if (sli->maps)	_XkbFree(sli->maps);
-	if (sli->names)	_XkbFree(sli->names);
+	if (sli->maps)	xfree(sli->maps);
+	if (sli->names)	xfree(sli->names);
     }
     sli->maps= NULL;
     sli->names= NULL;
-    _XkbFree(sli);
+    xfree(sli);
     return;
 }
 
diff --git a/xkb/xkmread.c b/xkb/xkmread.c
index dc8ab61..206c403 100644
--- a/xkb/xkmread.c
+++ b/xkb/xkmread.c
@@ -57,7 +57,7 @@ char *new;
    
    if (str==NULL)
 	return NULL;
-   new= (char *)_XkbCalloc(strlen(str)+1,sizeof(char));
+   new= xcalloc(strlen(str)+1,sizeof(char));
    if (new)
 	strcpy(new,str);
    return new;
@@ -73,10 +73,10 @@ int	newCount= *newCountRtrn;
     if (oldPtr==NULL) {
 	if (newCount==0)
 	    return NULL;
-	oldPtr= _XkbCalloc(newCount,elemSize);
+	oldPtr= xcalloc(newCount,elemSize);
     }
     else if (oldCount<newCount) {
-	oldPtr= _XkbRealloc(oldPtr,newCount*elemSize);
+	oldPtr= xrealloc(oldPtr,newCount*elemSize);
 	if (oldPtr!=NULL) {
 	    char *tmp= (char *)oldPtr;
 	    bzero(&tmp[oldCount*elemSize],(newCount-oldCount)*elemSize);
commit 0e31d3906deaee5d9ada66e538b9e93574a4d610
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue May 5 21:07:07 2009 +1000

    xkb: remove some now-useless XFUNCPROTOBEGIN
    
    We bring them back if we start rewriting the server in C++, promise.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index df33085..74d5f29 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -334,8 +334,6 @@ extern	_X_EXPORT int	DeviceEnterNotify,DeviceLeaveNotify;
 #define	False	FALSE
 #endif
 
-_XFUNCPROTOBEGIN
-
 extern _X_EXPORT void XkbUseMsg(
     void
 );
@@ -1000,8 +998,6 @@ extern _X_EXPORT XkbDescPtr XkbCompileKeymap(
         XkbRMLVOSet *   /* rmlvo */
 );
 
-_XFUNCPROTOEND
-
 #define	XkbAtomGetString(s)	NameForAtom(s)
 
 #endif /* _XKBSRV_H_ */
diff --git a/xkb/xkbgeom.h b/xkb/xkbgeom.h
index 173affe..fe4da38 100644
--- a/xkb/xkbgeom.h
+++ b/xkb/xkbgeom.h
@@ -311,8 +311,6 @@ typedef struct _XkbGeometrySizes {
 	unsigned short	num_key_aliases;
 } XkbGeometrySizesRec,*XkbGeometrySizesPtr;
 
-_XFUNCPROTOBEGIN
-
 extern	XkbPropertyPtr
 XkbAddGeomProperty(
     XkbGeometryPtr	/* geom */,
@@ -630,6 +628,4 @@ XkbFindOverlayForKey(
 	char *			/* under */
 );
 
-_XFUNCPROTOEND
-
 #endif /* _XKBGEOM_H_ */
commit 8b583ca2b21155359c6255f406c96599b277c762
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 6 22:25:28 2009 +1000

    Xi: fix copy/paste error causing sizeof against wrong struct.
    
    This wrong check may cause BadLength to be returned to the client even if the
    length is correct.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c
index 8c6d53a..7e20e03 100644
--- a/Xi/xiproperty.c
+++ b/Xi/xiproperty.c
@@ -747,7 +747,7 @@ ProcXChangeDeviceProperty (ClientPtr client)
         return BadValue;
     }
     len = stuff->nUnits;
-    if (len > ((0xffffffff - sizeof(xChangePropertyReq)) >> 2))
+    if (len > ((0xffffffff - sizeof(xChangeDevicePropertyReq)) >> 2))
         return BadLength;
     sizeInBytes = format>>3;
     totalSize = len * sizeInBytes;
commit 7ab5e9b97c300bba793a23fa13506b0c77c50ddf
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 6 12:07:07 2009 +1000

    xfree86: fix xf86PostMotionEventP type checking
    
    We only put internal events into the queue now, so let's check for ET_Motion
    rather than the MotionNotify.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index a035fca..8a71861 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -743,7 +743,7 @@ xf86PostMotionEventP(DeviceIntPtr	device,
     int i = 0, nevents = 0;
     int dx = 0, dy = 0;
     Bool drag = xf86SendDragEvents(device);
-    xEvent *xE = NULL;
+    DeviceEvent *event;
     int index;
     int flags = 0;
 
@@ -789,10 +789,11 @@ xf86PostMotionEventP(DeviceIntPtr	device,
                                valuators);
 
     for (i = 0; i < nevents; i++) {
-        xE = (xf86Events + i)->event;
+        event = (DeviceEvent*)((xf86Events + i)->event);
         /* Don't post core motion events for devices not registered to send
          * drag events. */
-        if (xE->u.u.type != MotionNotify || drag) {
+        if (event->header == ET_Internal &&
+            (event->type != ET_Motion || drag)) {
             mieqEnqueue(device, (InternalEvent*)((xf86Events + i)->event));
         }
     }
commit 50cc8adafca4ba3838d468278d6eb8a4692d2488
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed May 6 16:55:32 2009 +1000

    Xi: don't double-swap the XListDeviceProperties reply.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c
index d633f51..8c6d53a 100644
--- a/Xi/xiproperty.c
+++ b/Xi/xiproperty.c
@@ -706,13 +706,6 @@ ProcXListDeviceProperties (ClientPtr client)
     rep.length = (numProps * sizeof(Atom)) >> 2;
     rep.sequenceNumber = client->sequence;
     rep.nAtoms = numProps;
-    if (client->swapped)
-    {
-        int n;
-        swaps (&rep.sequenceNumber, n);
-        swapl (&rep.length, n);
-        swaps (&rep.nAtoms, n);
-    }
     temppAtoms = pAtoms;
     for (prop = dev->properties.properties; prop; prop = prop->next)
         *temppAtoms++ = prop->propertyName;
commit 3fc6fcfb267888d65a22ed7c3eda175a2530a3d5
Author: Simon Thum <simon.thum at gmx.de>
Date:   Wed May 6 10:39:16 2009 +0200

    dix: add 'none' pointer acceleration profile with number -1
    
    This is a shorthand for disabling acceleration, while retaining the
    possiblity to use constant deceleration. If constant deceleration is
    also unused, it will optimize motion processing.
    
    Other possiblities to deactivate acceleration were quite hidden,
    and didn't always work as expected. E.g. xset m 1 1 would retain
    adaptive deceleration, while xset m 1 0 would not (in the default
    profile).
    
    Also removes the 'reserved' profile; it was unused and it's trivial
    to add new ones anyway.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c
index 7732e95..2907d40 100644
--- a/dix/ptrveloc.c
+++ b/dix/ptrveloc.c
@@ -77,9 +77,12 @@ GetAccelerationProfile(DeviceVelocityPtr s, int profile_num);
 #endif
 
 /********************************
- *  Init/Uninit etc
+ *  Init/Uninit
  *******************************/
 
+/* some int which is not a profile number */
+#define PROFILE_UNINITIALIZE (-100)
+
 /**
  * Init struct so it should match the average case
  */
@@ -108,7 +111,7 @@ InitVelocityData(DeviceVelocityPtr s)
 static void
 FreeVelocityData(DeviceVelocityPtr s){
     xfree(s->tracker);
-    SetAccelerationProfile(s, -1);
+    SetAccelerationProfile(s, PROFILE_UNINITIALIZE);
 }
 
 
@@ -824,6 +827,16 @@ LinearProfile(
 }
 
 
+static float
+NoProfile(
+    DeviceVelocityPtr pVel,
+    float velocity,
+    float threshold,
+    float acc)
+{
+    return 1.0f;
+}
+
 static PointerAccelerationProfileFunc
 GetAccelerationProfile(
     DeviceVelocityPtr s,
@@ -844,8 +857,8 @@ GetAccelerationProfile(
             return PowerProfile;
         case AccelProfileLinear:
             return LinearProfile;
-        case AccelProfileReserved:
-            /* reserved for future use, e.g. a user-defined profile */
+        case AccelProfileNone:
+            return NoProfile;
         default:
             return NULL;
     }
@@ -856,8 +869,10 @@ GetAccelerationProfile(
  * Intended to make profiles exchangeable at runtime.
  * If you created a profile, give it a number here and in the header to
  * make it selectable. In case some profile-specific init is needed, here
- * would be a good place, since FreeVelocityData() also calls this with -1.
- * returns FALSE (0) if profile number is unavailable.
+ * would be a good place, since FreeVelocityData() also calls this with
+ * PROFILE_UNINITIALIZE.
+ *
+ * returns FALSE if profile number is unavailable, TRUE otherwise.
  */
 int
 SetAccelerationProfile(
@@ -867,7 +882,7 @@ SetAccelerationProfile(
     PointerAccelerationProfileFunc profile;
     profile = GetAccelerationProfile(s, profile_num);
 
-    if(profile == NULL && profile_num != -1)
+    if(profile == NULL && profile_num != PROFILE_UNINITIALIZE)
 	return FALSE;
 
     if(s->profile_private != NULL){
@@ -955,6 +970,11 @@ acceleratePointerPredictable(
     if (!num_valuators || !valuators || !velocitydata)
         return;
 
+    if (velocitydata->statistics.profile_number == AccelProfileNone &&
+	velocitydata->const_acceleration == 1.0f) {
+	return; /*we're inactive anyway, so skip the whole thing.*/
+    }
+
     if (first_valuator == 0) {
         dx = valuators[0];
         px = &valuators[0];
@@ -994,7 +1014,7 @@ acceleratePointerPredictable(
                     /* Since it may not be apparent: lrintf() does not offer
                      * strong statements about rounding; however because we
                      * process each axis conditionally, there's no danger
-                     * of a toggling remainder. Its lack of guarantees hopefully
+                     * of a toggling remainder. Its lack of guarantees likely
                      * makes it faster on the average target. */
                     *px = lrintf(tmp);
                     pDev->last.remainder[0] = tmp - (float)*px;
diff --git a/include/ptrveloc.h b/include/ptrveloc.h
index 6ef8c75..83d188c 100644
--- a/include/ptrveloc.h
+++ b/include/ptrveloc.h
@@ -27,9 +27,9 @@
 
 #include <input.h> /* DeviceIntPtr */
 
-/* constants for acceleration profiles;
- * see  */
+/* constants for acceleration profiles */
 
+#define AccelProfileNone -1
 #define AccelProfileClassic  0
 #define AccelProfileDeviceSpecific 1
 #define AccelProfilePolynomial 2
@@ -37,8 +37,7 @@
 #define AccelProfileSimple 4
 #define AccelProfilePower 5
 #define AccelProfileLinear 6
-#define AccelProfileReserved 7
-#define AccelProfileLAST AccelProfileReserved
+#define AccelProfileLAST AccelProfileLinear
 
 /* fwd */
 struct _DeviceVelocityRec;
commit 9d1597cbefea6a5e7959f2099c46f1a284def7ad
Author: Simon Thum <simon.thum at gmx.de>
Date:   Thu Apr 30 13:01:17 2009 +0200

    dix: remove superfluous includes from ptrveloc.c
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c
index 0a9a22e..7732e95 100644
--- a/dix/ptrveloc.c
+++ b/dix/ptrveloc.c
@@ -28,11 +28,8 @@
 
 #include <math.h>
 #include <ptrveloc.h>
-#include <inputstr.h>
 #include <exevents.h>
 #include <X11/Xatom.h>
-#include <assert.h>
-#include <os.h>
 
 #include <xserver-properties.h>
 
commit 35fce4e5c7fa34f98b3e4010c6cb09ce38a9205c
Author: Simon Thum <simon.thum at gmx.de>
Date:   Thu Apr 30 12:58:48 2009 +0200

    dix: fix warning in pointer acceleration
    
    newer gcc's warn against how this cast is done (though it eludes me why),
    and lrintf() is also faster especially on insane processors like the P4
    (http://www.mega-nerd.com/FPcast).
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c
index 99efc79..0a9a22e 100644
--- a/dix/ptrveloc.c
+++ b/dix/ptrveloc.c
@@ -994,14 +994,20 @@ acceleratePointerPredictable(
 
                 if (dx) {
                     tmp = mult * fdx + pDev->last.remainder[0];
-                    *px = (int)roundf(tmp);
+                    /* Since it may not be apparent: lrintf() does not offer
+                     * strong statements about rounding; however because we
+                     * process each axis conditionally, there's no danger
+                     * of a toggling remainder. Its lack of guarantees hopefully
+                     * makes it faster on the average target. */
+                    *px = lrintf(tmp);
                     pDev->last.remainder[0] = tmp - (float)*px;
                 }
                 if (dy) {
                     tmp = mult * fdy + pDev->last.remainder[1];
-                    *py = (int)roundf(tmp);
+                    *py = lrintf(tmp);
                     pDev->last.remainder[1] = tmp - (float)*py;
                 }
+                DebugAccelF("pos (%i | %i) remainders x: %.3f y: %.3f delta x:%.3f y:%.3f\n", *px, *py, pDev->last.remainder[0], pDev->last.remainder[1], fdx, fdy);
             }
         }
     }
commit d220d6907d1d5138d1528c48b739e77f65616225
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon May 4 17:38:02 2009 +1000

    Xi: add GrabButton and GrabKeysym code.
    
    We don't do keycode grabs in XI2, they're pointless.

diff --git a/Xi/Makefile.am b/Xi/Makefile.am
index 1fa7b9a..56404b6 100644
--- a/Xi/Makefile.am
+++ b/Xi/Makefile.am
@@ -96,6 +96,8 @@ libXi_la_SOURCES =	\
 	xiallowev.h \
 	xigrabdev.c \
 	xigrabdev.h \
+	xipassivegrab.h \
+	xipassivegrab.c \
 	xiproperty.c \
 	xiproperty.h \
 	xiselectev.c \
diff --git a/Xi/exevents.c b/Xi/exevents.c
index a01432c..12c53eb 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1388,7 +1388,7 @@ GrabButton(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
     WindowPtr pWin, confineTo;
     CursorPtr cursor;
     GrabPtr grab;
-    int rc;
+    int rc, type;
     Mask access_mode = DixGrabAccess;
 
     rc = CheckGrabValues(client, param);
@@ -1422,14 +1422,22 @@ GrabButton(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
     if (rc != Success)
 	return rc;
 
+    if (grabtype == GRABTYPE_XI)
+        type = DeviceButtonPress;
+    else if (grabtype == GRABTYPE_XI2)
+        type = XI_ButtonPress;
 
     grab = CreateGrab(client->index, dev, modifier_device, pWin, grabtype,
-                      mask, param, DeviceButtonPress, button, confineTo, cursor);
+                      mask, param, type, button, confineTo, cursor);
     if (!grab)
 	return BadAlloc;
     return AddPassiveGrabToList(client, grab);
 }
 
+/**
+ * Grab the given key. If grabtype is GRABTYPE_XI, the key is a keycode. If
+ * grabtype is GRABTYPE_XI2, the key is a keysym.
+ */
 int
 GrabKey(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
         int key, GrabParameters *param, GrabType grabtype, GrabMask *mask)
@@ -1438,19 +1446,25 @@ GrabKey(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
     GrabPtr grab;
     KeyClassPtr k = dev->key;
     Mask access_mode = DixGrabAccess;
-    int rc;
+    int rc, type;
 
     rc = CheckGrabValues(client, param);
     if (rc != Success)
         return rc;
     if (k == NULL)
 	return BadMatch;
-    if ((key > k->xkbInfo->desc->max_key_code ||
-         key < k->xkbInfo->desc->min_key_code)
-	&& (key != AnyKey)) {
-	client->errorValue = key;
-        return BadValue;
-    }
+    if (grabtype == GRABTYPE_XI)
+    {
+        if ((key > k->xkbInfo->desc->max_key_code ||
+                    key < k->xkbInfo->desc->min_key_code)
+                && (key != AnyKey)) {
+            client->errorValue = key;
+            return BadValue;
+        }
+        type = DeviceKeyPress;
+    } else if (grabtype == GRABTYPE_XI2)
+        type = XI_KeyPress;
+
     rc = dixLookupWindow(&pWin, param->grabWindow, client, DixSetAttrAccess);
     if (rc != Success)
 	return rc;
@@ -1461,7 +1475,7 @@ GrabKey(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
 	return rc;
 
     grab = CreateGrab(client->index, dev, modifier_device, pWin, grabtype,
-                      mask, param, DeviceKeyPress, key, NULL, NULL);
+                      mask, param, type, key, NULL, NULL);
     if (!grab)
 	return BadAlloc;
     return AddPassiveGrabToList(client, grab);
diff --git a/Xi/extinit.c b/Xi/extinit.c
index fa7031e..ea778e6 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -122,6 +122,7 @@ SOFTWARE.
 #include "xiallowev.h"
 #include "xiselectev.h"
 #include "xigrabdev.h"
+#include "xipassivegrab.h"
 #include "xisetdevfocus.h"
 #include "xiproperty.h"
 
@@ -247,7 +248,9 @@ static int (*ProcIVector[])(ClientPtr) = {
         ProcXIGetDeviceFocus,                   /* 50 */
         ProcXIGrabDevice,                       /* 51 */
         ProcXIUngrabDevice,                     /* 52 */
-        ProcXIAllowEvents                       /* 53 */
+        ProcXIAllowEvents,                      /* 53 */
+        ProcXIPassiveGrabDevice,                /* 54 */
+        ProcXIPassiveUngrabDevice               /* 55 */
 };
 
 /* For swapped clients */
@@ -305,7 +308,9 @@ static int (*SProcIVector[])(ClientPtr) = {
         SProcXIGetDeviceFocus,                   /* 50 */
         SProcXIGrabDevice,                       /* 51 */
         SProcXIUngrabDevice,                     /* 52 */
-        SProcXIAllowEvents                       /* 53 */
+        SProcXIAllowEvents,                      /* 53 */
+        SProcXIPassiveGrabDevice,                /* 54 */
+        SProcXIPassiveUngrabDevice               /* 55 */
 };
 
 /*****************************************************************
@@ -498,6 +503,8 @@ SReplyIDispatch(ClientPtr client, int len, xGrabDeviceReply * rep)
         SRepXIQueryDevice(client, len, (xXIQueryDeviceReply*)rep);
     else if (rep->RepType == X_XIGrabDevice)
 	SRepXIGrabDevice(client, len, (xXIGrabDeviceReply *) rep);
+    else if (rep->RepType == X_XIGrabDevice)
+	SRepXIPassiveGrabDevice(client, len, (xXIPassiveGrabDeviceReply *) rep);
     else {
 	FatalError("XINPUT confused sending swapped reply");
     }
diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
new file mode 100644
index 0000000..61f36d2
--- /dev/null
+++ b/Xi/xipassivegrab.c
@@ -0,0 +1,269 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer
+ */
+
+/***********************************************************************
+ *
+ * Request to grab or ungrab input device.
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "inputstr.h"	/* DeviceIntPtr      */
+#include "windowstr.h"	/* window structure  */
+#include <X11/extensions/XI2.h>
+#include <X11/extensions/XI2proto.h>
+#include "swaprep.h"
+
+#include "exglobals.h" /* BadDevice */
+#include "exevents.h"
+#include "xipassivegrab.h"
+#include "dixgrabs.h"
+
+int
+SProcXIPassiveGrabDevice(ClientPtr client)
+{
+    int i;
+    char n;
+    xXIModifierInfo *mods;
+
+    REQUEST(xXIPassiveGrabDeviceReq);
+
+    swaps(&stuff->length, n);
+    swaps(&stuff->deviceid, n);
+    swapl(&stuff->grab_window, n);
+    swapl(&stuff->cursor, n);
+    swapl(&stuff->time, n);
+    swapl(&stuff->detail, n);
+    swaps(&stuff->mask_len, n);
+    swaps(&stuff->num_modifiers, n);
+
+    mods = (xXIModifierInfo*)&stuff[1];
+
+    for (i = 0; i < stuff->num_modifiers; i++, mods++)
+    {
+        swapl(&mods->base_mods, n);
+        swapl(&mods->latched_mods, n);
+        swapl(&mods->locked_mods, n);
+    }
+
+    return ProcXIPassiveGrabDevice(client);
+}
+
+int
+ProcXIPassiveGrabDevice(ClientPtr client)
+{
+    DeviceIntPtr dev, mod_dev;
+    xXIPassiveGrabDeviceReply rep;
+    int i, ret = Success;
+    uint8_t status;
+    uint32_t *modifiers;
+    xXIGrabModifierInfo *modifiers_failed;
+    GrabMask mask;
+    GrabParameters param;
+
+    REQUEST(xXIPassiveGrabDeviceReq);
+    REQUEST_AT_LEAST_SIZE(xXIPassiveGrabDeviceReq);
+
+    ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGrabAccess);
+    if (ret != Success)
+	return ret;
+
+    if (stuff->grab_type != GrabtypeButton &&
+        stuff->grab_type != GrabtypeKeysym)
+    {
+        client->errorValue = stuff->grab_type;
+        return BadValue;
+    }
+
+    /* Can't grab for modifiers on an attached slave device */
+    if (!dev->isMaster)
+    {
+        if (!dev->u.master)
+            stuff->paired_device_mode = GrabModeAsync;
+        else if (dev->u.master && stuff->num_modifiers)
+            return BadDevice;
+    }
+    if ((stuff->mask_len * 4) > XI_LASTEVENT)
+    {
+        unsigned char *bits = (unsigned char*)&stuff[1];
+        for (i = XI_LASTEVENT; i < stuff->mask_len * 4; i++)
+        {
+            if (BitIsOn(bits, i))
+                return BadValue;
+        }
+    }
+
+    memset(mask.xi2mask, 0, sizeof(mask.xi2mask));
+    memcpy(mask.xi2mask[stuff->deviceid], &stuff[1], stuff->mask_len * 4);
+
+    rep.repType = X_Reply;
+    rep.RepType = X_XIPassiveGrabDevice;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    rep.num_modifiers = 0;
+
+    memset(&param, 0, sizeof(param));
+    param.ownerEvents = stuff->owner_events;
+    param.this_device_mode = stuff->grab_mode;
+    param.other_devices_mode = stuff->paired_device_mode;
+    param.grabWindow = stuff->grab_window;
+    param.cursor = stuff->cursor;
+
+    modifiers = (uint32_t*)&stuff[1] + stuff->mask_len;
+    modifiers_failed = xcalloc(stuff->num_modifiers, sizeof(xXIGrabModifierInfo));
+    if (!modifiers_failed)
+        return BadAlloc;
+
+    if (dev->isMaster)
+        mod_dev = GetPairedDevice(dev);
+    else
+        mod_dev = dev;
+
+    for (i = 0; i < stuff->num_modifiers; i++, modifiers++)
+    {
+        param.modifiers = *modifiers;
+        switch(stuff->grab_type)
+        {
+            case GrabtypeButton:
+                status = GrabButton(client, dev, mod_dev, stuff->detail,
+                                    &param, GRABTYPE_XI2, &mask);
+                break;
+            case GrabtypeKeysym:
+                status = GrabKey(client, dev, mod_dev, stuff->detail,
+                                 &param, GRABTYPE_XI2, &mask);
+                break;
+        }
+
+        if (status != GrabSuccess)
+        {
+            xXIGrabModifierInfo *info = modifiers_failed + rep.num_modifiers;
+
+            info->status = status;
+            info->modifiers = *modifiers;
+            rep.num_modifiers++;
+        }
+    }
+
+    WriteReplyToClient(client, sizeof(rep), &rep);
+    if (rep.num_modifiers)
+    {
+	client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
+        WriteSwappedDataToClient(client, rep.num_modifiers * 4, (char*)modifiers_failed);
+    }
+    xfree(modifiers_failed);
+    return ret;
+}
+
+void
+SRepXIPassiveGrabDevice(ClientPtr client, int size,
+                        xXIPassiveGrabDeviceReply * rep)
+{
+    char n;
+
+    swaps(&rep->sequenceNumber, n);
+    swapl(&rep->length, n);
+    swaps(&rep->num_modifiers, n);
+
+    WriteToClient(client, size, (char *)rep);
+}
+
+int
+SProcXIPassiveUngrabDevice(ClientPtr client)
+{
+    char n;
+    int i;
+    uint32_t *modifiers;
+
+    REQUEST(xXIPassiveUngrabDeviceReq);
+
+    swaps(&stuff->length, n);
+    swapl(&stuff->grab_window, n);
+    swaps(&stuff->deviceid, n);
+    swapl(&stuff->detail, n);
+    swaps(&stuff->num_modifiers, n);
+
+    modifiers = (uint32_t*)&stuff[1];
+
+    for (i = 0; i < stuff->num_modifiers; i++, modifiers++)
+        swapl(modifiers, n);
+
+    return ProcXIPassiveUngrabDevice(client);
+}
+
+int
+ProcXIPassiveUngrabDevice(ClientPtr client)
+{
+    DeviceIntPtr dev, mod_dev;
+    WindowPtr win;
+    GrabRec tempGrab;
+    uint32_t* modifiers;
+    int i, rc;
+
+    REQUEST(xXIPassiveUngrabDeviceReq);
+    REQUEST_AT_LEAST_SIZE(xXIPassiveUngrabDeviceReq);
+
+    rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGrabAccess);
+    if (rc != Success)
+	return rc;
+
+    if (stuff->grab_type != GrabtypeButton &&
+        stuff->grab_type != GrabtypeKeysym)
+    {
+        client->errorValue = stuff->grab_type;
+        return BadValue;
+    }
+
+    rc = dixLookupWindow(&win, stuff->grab_window, client, DixSetAttrAccess);
+    if (rc != Success)
+        return rc;
+
+    if (dev->isMaster)
+        mod_dev = GetPairedDevice(dev);
+    else
+        mod_dev = dev;
+
+    tempGrab.device = dev;
+    tempGrab.window = win;
+    tempGrab.type =
+        (stuff->grab_type == GrabtypeButton) ? XI_ButtonPress : XI_KeyPress;
+    tempGrab.grabtype = GRABTYPE_XI2;
+    tempGrab.modifierDevice = mod_dev;
+    tempGrab.modifiersDetail.pMask = NULL;
+    tempGrab.detail.exact = stuff->detail;
+    tempGrab.detail.pMask = NULL;
+
+    modifiers = (uint32_t*)&stuff[1];
+
+    for (i = 0; i < stuff->num_modifiers; i++, modifiers++)
+    {
+        tempGrab.modifiersDetail.exact = *modifiers;
+        DeletePassiveGrabFromList(&tempGrab);
+    }
+
+    return Success;
+}
diff --git a/Xi/xipassivegrab.h b/Xi/xipassivegrab.h
new file mode 100644
index 0000000..84fb5eb
--- /dev/null
+++ b/Xi/xipassivegrab.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer
+ */
+
+#ifndef XIPASSIVEGRAB_H
+#define XIPASSIVEGRAB_H
+
+int SProcXIPassiveUngrabDevice(ClientPtr client);
+int ProcXIPassiveUngrabDevice(ClientPtr client);
+void SRepXIPassiveGrabDevice(ClientPtr client, int size, xXIPassiveGrabDeviceReply * rep);
+int ProcXIPassiveGrabDevice(ClientPtr client);
+int SProcXIPassiveGrabDevice(ClientPtr client);
+
+#endif
diff --git a/dix/events.c b/dix/events.c
index 0ff8308..bfdb096 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3290,6 +3290,7 @@ CheckPassiveGrabsOnWindow(
     GrabInfoPtr grabinfo;
 #define CORE_MATCH      0x1
 #define XI_MATCH        0x2
+#define XI2_MATCH        0x4
     int match = 0;
 
     if (!grab)
@@ -3319,13 +3320,24 @@ CheckPassiveGrabsOnWindow(
             xkbi= gdev->key->xkbInfo;
 	tempGrab.modifierDevice = grab->modifierDevice;
         tempGrab.modifiersDetail.exact = xkbi ? xkbi->state.grab_mods : 0;
-        /* FIXME: check for xi2 grabs */
 
-        /* Check for XI grabs first */
-        tempGrab.type = GetXIType((InternalEvent*)event);
-        tempGrab.grabtype = GRABTYPE_XI;
-	if (GrabMatchesSecond(&tempGrab, grab, FALSE))
-            match = XI_MATCH;
+        /* Check for XI2 and XI grabs first */
+        tempGrab.type = GetXI2Type((InternalEvent*)event);
+        tempGrab.grabtype = GRABTYPE_XI2;
+        if (event->type == ET_KeyPress)
+            tempGrab.detail.exact = XkbGetKeysym(device, event);
+        if (GrabMatchesSecond(&tempGrab, grab, FALSE))
+            match = XI2_MATCH;
+
+        tempGrab.detail.exact = event->detail.key;
+        if (!match)
+        {
+            tempGrab.type = GetXIType((InternalEvent*)event);
+            tempGrab.grabtype = GRABTYPE_XI;
+            if (GrabMatchesSecond(&tempGrab, grab, FALSE))
+                match = XI_MATCH;
+        }
+
         /* Check for a core grab (ignore the device when comparing) */
         if (!match && checkCore)
         {
@@ -3399,6 +3411,15 @@ CheckPassiveGrabsOnWindow(
                 }
                 xE = &core;
                 count = 1;
+            } else if (match & XI2_MATCH)
+            {
+                rc = EventToXI2((InternalEvent*)event, &xE);
+                if (rc != Success)
+                {
+                    ErrorF("[dix] %s: XI2 conversion failed in CPGFW "
+                           "(%d, %d).\n", device->name, event->type, rc);
+                    continue;
+                }
             } else
             {
                 rc = EventToXI((InternalEvent*)event, &xE, &count);
@@ -3427,7 +3448,7 @@ CheckPassiveGrabsOnWindow(
 		grabinfo->sync.state = FROZEN_WITH_EVENT;
             }
 
-            if (match & XI_MATCH)
+            if (match & (XI_MATCH | XI2_MATCH))
                 xfree(xE); /* on core match xE == &core */
 	    return TRUE;
 	}
@@ -3435,6 +3456,7 @@ CheckPassiveGrabsOnWindow(
     return FALSE;
 #undef CORE_MATCH
 #undef XI_MATCH
+#undef XI2_MATCH
 }
 
 /**
diff --git a/dix/grabs.c b/dix/grabs.c
index 03776d2..eb8bec8 100644
--- a/dix/grabs.c
+++ b/dix/grabs.c
@@ -104,6 +104,9 @@ CreateGrab(
     grab->confineTo = confineTo;
     grab->cursor = cursor;
     grab->next = NULL;
+
+    if (grabtype == GRABTYPE_XI2)
+        memcpy(grab->xi2mask, mask->xi2mask, sizeof(mask->xi2mask));
     if (cursor)
 	cursor->refcnt++;
     return grab;
diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index 1ca0e30..64584ff 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -948,6 +948,10 @@ extern Bool XkbCopyDeviceKeymap(
         DeviceIntPtr            /* dst */,
         DeviceIntPtr            /* src */);
 
+extern int XkbGetKeysym(
+        DeviceIntPtr            /* dev */,
+        DeviceEvent*            /* event*/);
+
 #include "xkbfile.h"
 #include <X11/extensions/XKMformat.h>
 #include "xkbrules.h"
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index 5ae426d..0bd41cd 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -2116,3 +2116,33 @@ XkbCopyDeviceKeymap(DeviceIntPtr dst, DeviceIntPtr src)
 
     return ret;
 }
+
+int
+XkbGetKeysym(DeviceIntPtr dev, DeviceEvent *event)
+{
+    XkbDescPtr xkb = dev->key->xkbInfo->desc;
+    XkbKeyTypePtr kt;
+    int group;
+    int i, level = 0;
+    int modmask;
+
+    group = event->group.base + event->group.latched + event->group.locked;
+
+    if (group >= xkb->ctrls->num_groups)
+        group = XkbAdjustGroup(group, xkb->ctrls);
+
+    modmask = event->mods.base | event->mods.latched; /* don't care about
+                                                         locked mods */
+    kt = XkbKeyKeyType(xkb, event->detail.key, group);
+
+    for (i = 0; i < kt->map_count; i++)
+    {
+        if (kt->map[i].mods.mask == modmask)
+        {
+            level = kt->map[i].level;
+            break;
+        }
+    }
+
+    return XkbKeySymEntry(xkb, event->detail.key, level, group);
+}
commit 1b593ced171d02f1d00034f0f733060706bb6d41
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue May 5 16:57:46 2009 +1000

    Xi: access the prev_state to get group/modifier state for key events.
    
    Key events may change the modifier state, so we need to get the prev_state for
    those (i.e. without the changes by the event already applied).
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 0793113..a01432c 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -983,13 +983,20 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
 
     if (kbd && kbd->key)
     {
-        event->mods.base = kbd->key->xkbInfo->state.base_mods;
-        event->mods.latched = kbd->key->xkbInfo->state.latched_mods;
-        event->mods.locked = kbd->key->xkbInfo->state.locked_mods;
-
-        event->group.base = kbd->key->xkbInfo->state.base_group;
-        event->group.latched = kbd->key->xkbInfo->state.latched_group;
-        event->group.locked = kbd->key->xkbInfo->state.locked_group;
+        XkbStatePtr state;
+        /* we need the state before the event happens */
+        if (event->type == ET_KeyPress || event->type == ET_KeyRelease)
+            state = &kbd->key->xkbInfo->prev_state;
+        else
+            state = &kbd->key->xkbInfo->state;
+
+        event->mods.base = state->base_mods;
+        event->mods.latched = state->latched_mods;
+        event->mods.locked = state->locked_mods;
+
+        event->group.base = state->base_group;
+        event->group.latched = state->latched_group;
+        event->group.locked = state->locked_group;
     }
 
     ret = UpdateDeviceState(device, event);
commit 35a4b8e7f4526a92d44cb16a783f21030cd1f6df
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue May 5 16:51:59 2009 +1000

    xkb: remove oldState from XkbHandleActions.
    
    I really don't know what the purpose of this variable is or was, aside from
    potentially clobbering up our key state since there's a path where it may be
    used uninitialised.
    
    Also, this means that xkbi->prev_state is now accessible from the DIX with
    meaningful data.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index fe58a18..417c617 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -1075,7 +1075,6 @@ XkbSrvInfoPtr	xkbi;
 KeyClassPtr	keyc;
 int		changed,sendEvent;
 Bool		genStateNotify;
-XkbStateRec	oldState;
 XkbAction	act;
 XkbFilterPtr	filter;
 Bool		keyEvent;
@@ -1090,7 +1089,7 @@ xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(dev);
     /* The state may change, so if we're not in the middle of sending a state
      * notify, prepare for it */
     if ((xkbi->flags&_XkbStateNotifyInProgress)==0) {
-	oldState= xkbi->state;
+	xkbi->prev_state = xkbi->state;
 	xkbi->flags|= _XkbStateNotifyInProgress;
 	genStateNotify= True;
     }
@@ -1220,9 +1219,8 @@ xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(dev);
 	FixKeyState(event, dev);
     }
 
-    xkbi->prev_state= oldState;
     XkbComputeDerivedState(xkbi);
-    changed = XkbStateChangedFlags(&oldState,&xkbi->state);
+    changed = XkbStateChangedFlags(&xkbi->prev_state,&xkbi->state);
     if (genStateNotify) {
 	if (changed) {
 	    xkbStateNotify	sn;
commit d523fbe428e4513d85402caa83e9349256b680cc
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon May 4 17:00:57 2009 +1000

    test: add test for xi2 struct sizes.

diff --git a/test/input.c b/test/input.c
index a9027f0..e49cc81 100644
--- a/test/input.c
+++ b/test/input.c
@@ -25,10 +25,12 @@
 #include <dix-config.h>
 #endif
 
+#include <stdint.h>
 #include <X11/X.h>
 #include "misc.h"
 #include "resource.h"
 #include <X11/Xproto.h>
+#include <X11/extensions/XI2proto.h>
 #include <X11/Xatom.h>
 #include "windowstr.h"
 #include "inputstr.h"
@@ -276,6 +278,31 @@ static void dix_event_to_core_conversion(void)
     dix_event_to_core(ET_ProximityOut);
 }
 
+static void xi2_struct_sizes(void)
+{
+#define compare(req) \
+    g_assert(sizeof(req) == sz_##req);
+
+    compare(xXIQueryVersionReq);
+    compare(xXIWarpDevicePointerReq);
+    compare(xXIChangeDeviceCursorReq);
+    compare(xXIChangeDeviceHierarchyReq);
+    compare(xXISetClientPointerReq);
+    compare(xXIGetClientPointerReq);
+    compare(xXISelectEventsReq);
+    compare(xXIQueryVersionReq);
+    compare(xXIQueryDeviceReq);
+    compare(xXISetDeviceFocusReq);
+    compare(xXIGetDeviceFocusReq);
+    compare(xXIGrabDeviceReq);
+    compare(xXIUngrabDeviceReq);
+    compare(xXIAllowEventsReq);
+    compare(xXIPassiveGrabDeviceReq);
+    compare(xXIPassiveUngrabDeviceReq);
+#undef compare
+}
+
+
 int main(int argc, char** argv)
 {
     g_test_init(&argc, &argv,NULL);
@@ -284,6 +311,7 @@ int main(int argc, char** argv)
     g_test_add_func("/dix/input/init-valuators", dix_init_valuators);
     g_test_add_func("/dix/input/event-core-conversion", dix_event_to_core_conversion);
     g_test_add_func("/dix/input/check-grab-values", dix_check_grab_values);
+    g_test_add_func("/dix/input/xi2-struct-sizes", xi2_struct_sizes);
 
     return g_test_run();
 }
commit 1b1b20d6e3e696e4437a9ef56128cde70a485f66
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue May 5 13:47:55 2009 +1000

    Change glib require for tests to auto.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/configure.ac b/configure.ac
index 3fc4dd4..daddd09 100644
--- a/configure.ac
+++ b/configure.ac
@@ -440,8 +440,8 @@ AC_ARG_ENABLE(debug,         AS_HELP_STRING([--enable-debug],
 				  [Enable debugging (default: disabled)]),
 			        [DEBUGGING=$enableval], [DEBUGGING=no])
 AC_ARG_ENABLE(unit-tests,    AS_HELP_STRING([--enable-unit-tests],
-                                  [Enable unit-tests (default: enabled)]),
-                                [UNITTESTS=$enableval], [UNITTESTS=yes])
+                                  [Enable unit-tests (default: auto)]),
+                                [UNITTESTS=$enableval], [UNITTESTS=auto])
 AC_ARG_WITH(int10,           AS_HELP_STRING([--with-int10=BACKEND], [int10 backend: vm86, x86emu or stub]),
 				[INT10="$withval"],
 				[INT10="$DEFAULT_INT10"])
@@ -1144,6 +1144,9 @@ if test "x$DEBUGGING" = xyes; then
 fi
 AM_CONDITIONAL(DEBUG, [test "x$DEBUGGING" = xyes])
 
+if test "x$UNITTESTS" = xauto; then
+       PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.16], [UNITTESTS=yes], [UNITTESTS=no])
+fi
 if test "x$UNITTESTS" = xyes; then
        AC_DEFINE(UNITTESTS, 1, [Enable unit tests])
        PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.16])
commit 749cae82204f347248c815b1068ffcae9825fe70
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Apr 30 14:58:00 2009 +1000

    mi: don't crash if we're trying to update the pointer for a keyboard.
    
    If a device doesn't have a pointer, just return.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/mi/mipointer.c b/mi/mipointer.c
index 3d34481..1c61b57 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -367,6 +367,9 @@ miPointerUpdateSprite (DeviceIntPtr pDev)
 
     pPointer = MIPOINTER(pDev);
 
+    if (!pPointer)
+        return;
+
     pScreen = pPointer->pScreen;
     if (!pScreen)
 	return;
commit 7ecedb0f2ee5b53513205d1f0aa381451893b9c5
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 1 14:35:12 2009 +1000

    include: up the number of max. input devices to 40.
    
    With the Xtest virtual slave devices we have 4 devices for each MD
    pointer/keyboard pair, plus the AllDevices and AllMasterDevices reserved
    deviceids. It's quite easy to hit the current limit.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/misc.h b/include/misc.h
index 6a920cc..61dd947 100644
--- a/include/misc.h
+++ b/include/misc.h
@@ -86,7 +86,7 @@ OF THIS SOFTWARE.
 #define MAXCLIENTS	256
 #define MAXEXTENSIONS   128
 #define MAXFORMATS	8
-#define MAXDEVICES	20 /* input devices */
+#define MAXDEVICES	40 /* input devices */
 
 #define EXTENSION_EVENT_BASE 64
 #define EXTENSION_BASE 128
commit a38d33f6ac765bc5a3296b325e2c9b4a6a10ebf1
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 1 15:24:02 2009 +1000

    Xext: shut up compiler warnings in xtest.c
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xext/xtest.c b/Xext/xtest.c
index cb32c28..96380b7 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -50,6 +50,7 @@
 #include <X11/extensions/XI.h>
 #include <X11/extensions/XIproto.h>
 #include "exglobals.h"
+#include "mipointer.h"
 
 #include "modinit.h"
 
@@ -162,7 +163,6 @@ ProcXTestFakeInput(ClientPtr client)
     int i;
     int base = 0;
     int flags = 0;
-    DeviceIntPtr xtstdevice;
 
     nev = (stuff->length << 2) - sizeof(xReq);
     if ((nev % sizeof(xEvent)) || !nev)
@@ -415,7 +415,7 @@ ProcXTestFakeInput(ClientPtr client)
     }
 
     for (i = 0; i < nevents; i++)
-        mieqProcessDeviceEvent(dev, (events+i)->event, NULL);
+        mieqProcessDeviceEvent(dev, (InternalEvent*)(events+i)->event, NULL);
 
     miPointerUpdateSprite(dev);
     return client->noClientException;
commit 14d5471981151b27678de826daa078977217477a
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 1 15:22:37 2009 +1000

    Xext: return BadDevice from XTest if we don't have keys/buttons/valuators.
    
    BadDevice is an XI error, but this cannot happen for core XTest fake input
    anyway since the device will be the matching virtual XTest slave device.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xext/xtest.c b/Xext/xtest.c
index 8aca6a0..cb32c28 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -49,6 +49,7 @@
 #include <X11/extensions/xteststr.h>
 #include <X11/extensions/XI.h>
 #include <X11/extensions/XIproto.h>
+#include "exglobals.h"
 
 #include "modinit.h"
 
@@ -342,6 +343,9 @@ ProcXTestFakeInput(ClientPtr client)
     {
         case KeyPress:
         case KeyRelease:
+            if (!dev->key)
+                return BadDevice;
+
             if (ev->u.u.detail < dev->key->xkbInfo->desc->min_key_code ||
                 ev->u.u.detail > dev->key->xkbInfo->desc->max_key_code)
             {
@@ -350,6 +354,9 @@ ProcXTestFakeInput(ClientPtr client)
             }
             break;
         case MotionNotify:
+            if (!dev->valuator)
+                return BadDevice;
+
             /* broken lib, XI events have root uninitialized */
             if (extension || ev->u.keyButtonPointer.root == None)
                 root = GetCurrentRootWindow(dev);
@@ -376,6 +383,9 @@ ProcXTestFakeInput(ClientPtr client)
             break;
         case ButtonPress:
         case ButtonRelease:
+            if (!dev->button)
+                return BadDevice;
+
             if (!ev->u.u.detail || ev->u.u.detail > dev->button->numButtons)
             {
                 client->errorValue = ev->u.u.detail;
commit f1bed0959e803784af142a0f45177ee3b675d78a
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 1 15:15:04 2009 +1000

    Xext: fix core Xtest button presses, don't call PickPointer.
    
    We already did the device selection before, so dev should be the XTest virtual
    pointer.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xext/xtest.c b/Xext/xtest.c
index d21eedc..8aca6a0 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -376,12 +376,6 @@ ProcXTestFakeInput(ClientPtr client)
             break;
         case ButtonPress:
         case ButtonRelease:
-            if (!extension)
-            {
-                dev = PickPointer(client);
-                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;
commit 94648bb797d94b025746c60679c584e5be2fae28
Author: Jesse Barnes <jbarnes at virtuousgeek.org>
Date:   Mon May 4 15:38:22 2009 -0700

    Don't prepare outputs & crtcs if set_mode_major is present
    
    A driver with this hook will take care of preparing the outputs & crtcs,
    so calling the prepare functions will just cause unnecessary flicker.
    
    Fixes bug #21077

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index c6eed33..1b241cd 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -2549,18 +2549,23 @@ Bool
 xf86SetDesiredModes (ScrnInfoPtr scrn)
 {
     xf86CrtcConfigPtr   config = XF86_CRTC_CONFIG_PTR(scrn);
+    xf86CrtcPtr         crtc = config->crtc[0];
     int			c;
 
-    xf86PrepareOutputs(scrn);
-    xf86PrepareCrtcs(scrn);
+    /* A driver with this hook will take care of this */
+    if (!crtc->funcs->set_mode_major) {
+	xf86PrepareOutputs(scrn);
+	xf86PrepareCrtcs(scrn);
+    }
 
     for (c = 0; c < config->num_crtc; c++)
     {
-	xf86CrtcPtr	crtc = config->crtc[c];
 	xf86OutputPtr	output = NULL;
 	int		o;
 	RRTransformPtr	transform;
 
+	crtc = config->crtc[c];
+
 	/* Skip disabled CRTCs */
 	if (!crtc->enabled)
 	    continue;
commit 7d85169c7ab1d05c21fdbb2877ffd79f344dbb6b
Author: Michel Dänzer <daenzer at vmware.com>
Date:   Mon May 4 10:14:43 2009 +0200

    Fix typo in ProcRenderCreateAnimCursor.

diff --git a/render/render.c b/render/render.c
index 8487b60..5622994 100644
--- a/render/render.c
+++ b/render/render.c
@@ -1857,7 +1857,7 @@ ProcRenderCreateAnimCursor (ClientPtr client)
     elt = (xAnimCursorElt *) (stuff + 1);
     for (i = 0; i < ncursor; i++)
     {
-	ret = dixLookupResourceByType((pointer *)(cursors + 1), elt->cursor,
+	ret = dixLookupResourceByType((pointer *)(cursors + i), elt->cursor,
 				      RT_CURSOR, client, DixReadAccess);
 	if (ret != Success)
 	{
commit 59358de4b68a01452bf68593beb83605087ebc8f
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon May 4 17:30:19 2009 +1000

    input: ensure various ProcUngrabKey/Buttons have the right grabtype set.

diff --git a/Xi/ungrdevb.c b/Xi/ungrdevb.c
index a53dc5b..4e93f1a 100644
--- a/Xi/ungrdevb.c
+++ b/Xi/ungrdevb.c
@@ -132,6 +132,7 @@ ProcXUngrabDeviceButton(ClientPtr client)
     temporaryGrab.device = dev;
     temporaryGrab.window = pWin;
     temporaryGrab.type = DeviceButtonPress;
+    temporaryGrab.grabtype = GRABTYPE_XI;
     temporaryGrab.modifierDevice = mdev;
     temporaryGrab.modifiersDetail.exact = stuff->modifiers;
     temporaryGrab.modifiersDetail.pMask = NULL;
diff --git a/Xi/ungrdevk.c b/Xi/ungrdevk.c
index 7f5e4aa..3b4d626 100644
--- a/Xi/ungrdevk.c
+++ b/Xi/ungrdevk.c
@@ -139,6 +139,7 @@ ProcXUngrabDeviceKey(ClientPtr client)
     temporaryGrab.device = dev;
     temporaryGrab.window = pWin;
     temporaryGrab.type = DeviceKeyPress;
+    temporaryGrab.grabtype = GRABTYPE_XI;
     temporaryGrab.modifierDevice = mdev;
     temporaryGrab.modifiersDetail.exact = stuff->modifiers;
     temporaryGrab.modifiersDetail.pMask = NULL;
diff --git a/dix/events.c b/dix/events.c
index 86aa24f..0ff8308 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -5003,6 +5003,7 @@ ProcUngrabKey(ClientPtr client)
     tempGrab.modifiersDetail.pMask = NULL;
     tempGrab.modifierDevice = GetPairedDevice(keybd);
     tempGrab.type = KeyPress;
+    tempGrab.grabtype = GRABTYPE_CORE;
     tempGrab.detail.exact = stuff->key;
     tempGrab.detail.pMask = NULL;
     tempGrab.next = NULL;
@@ -5197,6 +5198,7 @@ ProcUngrabButton(ClientPtr client)
     tempGrab.modifierDevice = GetPairedDevice(ptr);
     tempGrab.type = ButtonPress;
     tempGrab.detail.exact = stuff->button;
+    tempGrab.grabtype = GRABTYPE_CORE;
     tempGrab.detail.pMask = NULL;
     tempGrab.next = NULL;
 
commit 834ea071b619506e0bef5bdbf0e3c59831cf6e99
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon May 4 15:58:15 2009 +1000

    dix: if grab types differ, two grabs cannot be the same.

diff --git a/dix/events.c b/dix/events.c
index e1feb4d..86aa24f 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3323,13 +3323,17 @@ CheckPassiveGrabsOnWindow(
 
         /* Check for XI grabs first */
         tempGrab.type = GetXIType((InternalEvent*)event);
+        tempGrab.grabtype = GRABTYPE_XI;
 	if (GrabMatchesSecond(&tempGrab, grab, FALSE))
             match = XI_MATCH;
         /* Check for a core grab (ignore the device when comparing) */
-        if (!match && checkCore &&
-            (tempGrab.type = GetCoreType((InternalEvent*)event)) &&
-            (GrabMatchesSecond(&tempGrab, grab, TRUE)))
+        if (!match && checkCore)
+        {
+            tempGrab.grabtype = GRABTYPE_CORE;
+            if ((tempGrab.type = GetCoreType((InternalEvent*)event)) &&
+                (GrabMatchesSecond(&tempGrab, grab, TRUE)))
                 match = CORE_MATCH;
+        }
 
         if (match && (!grab->confineTo ||
 	     (grab->confineTo->realized &&
diff --git a/dix/grabs.c b/dix/grabs.c
index 06e1ebb..03776d2 100644
--- a/dix/grabs.c
+++ b/dix/grabs.c
@@ -254,6 +254,10 @@ GrabSupersedesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
 Bool
 GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice)
 {
+
+    if (pFirstGrab->grabtype != pSecondGrab->grabtype)
+        return FALSE;
+
     if (!ignoreDevice &&
             ((pFirstGrab->device != pSecondGrab->device) ||
              (pFirstGrab->modifierDevice != pSecondGrab->modifierDevice)))
@@ -288,6 +292,9 @@ GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice)
 static Bool
 GrabsAreIdentical(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
 {
+    if (pFirstGrab->grabtype != pSecondGrab->grabtype)
+        return FALSE;
+
     if (pFirstGrab->device != pSecondGrab->device || 
 	(pFirstGrab->modifierDevice != pSecondGrab->modifierDevice) ||
 	(pFirstGrab->type != pSecondGrab->type))
commit 63a3c727b35d1ffd8a850a5177bd6623cd78b179
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 1 15:24:02 2009 +1000

    Xext: shut up compiler warnings in xtest.c
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xext/xtest.c b/Xext/xtest.c
index cb32c28..96380b7 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -50,6 +50,7 @@
 #include <X11/extensions/XI.h>
 #include <X11/extensions/XIproto.h>
 #include "exglobals.h"
+#include "mipointer.h"
 
 #include "modinit.h"
 
@@ -162,7 +163,6 @@ ProcXTestFakeInput(ClientPtr client)
     int i;
     int base = 0;
     int flags = 0;
-    DeviceIntPtr xtstdevice;
 
     nev = (stuff->length << 2) - sizeof(xReq);
     if ((nev % sizeof(xEvent)) || !nev)
@@ -415,7 +415,7 @@ ProcXTestFakeInput(ClientPtr client)
     }
 
     for (i = 0; i < nevents; i++)
-        mieqProcessDeviceEvent(dev, (events+i)->event, NULL);
+        mieqProcessDeviceEvent(dev, (InternalEvent*)(events+i)->event, NULL);
 
     miPointerUpdateSprite(dev);
     return client->noClientException;
commit 226dd90597ef29998ac5db15c5457aad3fe9729e
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 1 15:22:37 2009 +1000

    Xext: return BadDevice from XTest if we don't have keys/buttons/valuators.
    
    BadDevice is an XI error, but this cannot happen for core XTest fake input
    anyway since the device will be the matching virtual XTest slave device.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xext/xtest.c b/Xext/xtest.c
index 8aca6a0..cb32c28 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -49,6 +49,7 @@
 #include <X11/extensions/xteststr.h>
 #include <X11/extensions/XI.h>
 #include <X11/extensions/XIproto.h>
+#include "exglobals.h"
 
 #include "modinit.h"
 
@@ -342,6 +343,9 @@ ProcXTestFakeInput(ClientPtr client)
     {
         case KeyPress:
         case KeyRelease:
+            if (!dev->key)
+                return BadDevice;
+
             if (ev->u.u.detail < dev->key->xkbInfo->desc->min_key_code ||
                 ev->u.u.detail > dev->key->xkbInfo->desc->max_key_code)
             {
@@ -350,6 +354,9 @@ ProcXTestFakeInput(ClientPtr client)
             }
             break;
         case MotionNotify:
+            if (!dev->valuator)
+                return BadDevice;
+
             /* broken lib, XI events have root uninitialized */
             if (extension || ev->u.keyButtonPointer.root == None)
                 root = GetCurrentRootWindow(dev);
@@ -376,6 +383,9 @@ ProcXTestFakeInput(ClientPtr client)
             break;
         case ButtonPress:
         case ButtonRelease:
+            if (!dev->button)
+                return BadDevice;
+
             if (!ev->u.u.detail || ev->u.u.detail > dev->button->numButtons)
             {
                 client->errorValue = ev->u.u.detail;
commit 0fdff0a47a57a0096974ee83e07fefbad03075dd
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 1 15:15:04 2009 +1000

    Xext: fix core Xtest button presses, don't call PickPointer.
    
    We already did the device selection before, so dev should be the XTest virtual
    pointer.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xext/xtest.c b/Xext/xtest.c
index d21eedc..8aca6a0 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -376,12 +376,6 @@ ProcXTestFakeInput(ClientPtr client)
             break;
         case ButtonPress:
         case ButtonRelease:
-            if (!extension)
-            {
-                dev = PickPointer(client);
-                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;
commit f0124ed93cdcee8d22a6690e639a3f60b9a63c54
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 1 14:35:12 2009 +1000

    include: up the number of max. input devices to 40.
    
    With the Xtest virtual slave devices we have 4 devices for each MD
    pointer/keyboard pair, plus the AllDevices and AllMasterDevices reserved
    deviceids. It's quite easy to hit the current limit.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/misc.h b/include/misc.h
index 6a920cc..61dd947 100644
--- a/include/misc.h
+++ b/include/misc.h
@@ -86,7 +86,7 @@ OF THIS SOFTWARE.
 #define MAXCLIENTS	256
 #define MAXEXTENSIONS   128
 #define MAXFORMATS	8
-#define MAXDEVICES	20 /* input devices */
+#define MAXDEVICES	40 /* input devices */
 
 #define EXTENSION_EVENT_BASE 64
 #define EXTENSION_BASE 128
commit 08cd846000286eb5e07cc8d8cb313aff2d6e7faf
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri May 1 11:06:06 2009 +1000

    dix: only free the old cursor if the grab was successful.
    
    Testcase: start thunderbird and move a message around, crashes after two or
    three moves.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/events.c b/dix/events.c
index 6fe2182..e1feb4d 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4446,7 +4446,7 @@ ProcGrabPointer(ClientPtr client)
     if (rc != Success)
         return rc;
 
-    if (oldCursor)
+    if (oldCursor && rep.status == GrabSuccess)
         FreeCursor (oldCursor, (Cursor)0);
 
     time = ClientTimeToServerTime(stuff->time);
commit 557dbadf3be273255e8fdb12d9321f4e88bf2b65
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Sat May 2 00:26:18 2009 -0700

    XkbSetNamedIndicator should ignore SD's without LED's
    
    When ProcXkbSetNamedIndicator is called on a core device, and we
    walk the slaves to set the LED's on each of them, ignore any slaves
    that do not have either a KbdFeedbackCtrl or LedCtrl structure.
    
    (This is much more critical in xserver-1.5-branch, where we walk
     *all* devices, not just the slaves of the specified master, and
     thus return failure when setting an LED on the Core Keyboard and
     hit a xf86-input-mouse device with no LED's to set.)
    
    Signed-off-by: Alan Coopersmith <alan.coopersmith at sun.com>
    Acked-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/xkb/xkb.c b/xkb/xkb.c
index e7c9a31..b2fe11c 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -3433,6 +3433,7 @@ ProcXkbSetNamedIndicator(ClientPtr client)
         for (other = inputInfo.devices; other; other = other->next)
         {
             if ((other != dev) && !other->isMaster && (other->u.master == dev) &&
+                (other->kbdfeed || other->leds) &&
                 (XaceHook(XACE_DEVICE_ACCESS, client, other, DixSetAttrAccess) == Success))
             {
                 rc = _XkbCreateIndicatorMap(other, stuff->indicator,
@@ -3456,6 +3457,7 @@ ProcXkbSetNamedIndicator(ClientPtr client)
         for (other = inputInfo.devices; other; other = other->next)
         {
             if ((other != dev) && !other->isMaster && (other->u.master == dev) &&
+                (other->kbdfeed || other->leds) &&
                 (XaceHook(XACE_DEVICE_ACCESS, client, other, DixSetAttrAccess) == Success))
             {
                 _XkbSetNamedIndicator(client, other, stuff);
commit 0d9d3f3e361f769822caedccf4c2a58cc9930ecc
Author: Ian Romanick <ian.d.romanick at intel.com>
Date:   Mon Apr 27 15:11:10 2009 -0700

    DRI2: Force allocation of real-front buffer for non-windows as well
    
    For redirected rendering we end up with pixmaps (which the app thinks are
    windows) that are double buffered.
    
    Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
    Tested-by: Pierre Willenbrock <pierre at pirsoft.de>

diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
index 9ded048..1d49d7c 100644
--- a/hw/xfree86/dri2/dri2.c
+++ b/hw/xfree86/dri2/dri2.c
@@ -206,18 +206,21 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
 	 * attachments.  The counting logic in the loop accounts for the case
 	 * where the client requests both the fake and real front-buffer.
 	 */
-	if (pDraw->type == DRAWABLE_WINDOW) {
-	    if (attachment == DRI2BufferBackLeft) {
-		need_real_front++;
-		front_format = format;
-	    }
+	if (attachment == DRI2BufferBackLeft) {
+	    need_real_front++;
+	    front_format = format;
+	}
 
-	    if (attachment == DRI2BufferFrontLeft) {
-		need_real_front--;
+	if (attachment == DRI2BufferFrontLeft) {
+	    need_real_front--;
+	    front_format = format;
+
+	    if (pDraw->type == DRAWABLE_WINDOW) {
 		need_fake_front++;
-		front_format = format;
 	    }
+	}
 
+	if (pDraw->type == DRAWABLE_WINDOW) {
 	    if (attachment == DRI2BufferFakeFrontLeft) {
 		need_fake_front--;
 		have_fake_front = 1;
commit 3d30789a05a730a03faa6058c73a5eda36ef3779
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Apr 30 14:58:00 2009 +1000

    mi: don't crash if we're trying to update the pointer for a keyboard.
    
    If a device doesn't have a pointer, just return.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/mi/mipointer.c b/mi/mipointer.c
index e87fe79..c75c120 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -367,6 +367,9 @@ miPointerUpdateSprite (DeviceIntPtr pDev)
 
     pPointer = MIPOINTER(pDev);
 
+    if (!pPointer)
+        return;
+
     pScreen = pPointer->pScreen;
     if (!pScreen)
 	return;
commit 876910a951053f0bd31e30098de3da15a1c1f5d6
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Apr 30 14:46:45 2009 +1000

    xkb: write the _XKB_RF_RULES_PROP to each device.
    
    We only have one root window and writing the rules used to the same property
    for each device is quite pointless if you don't have the same RMLVO on all
    devices. So let's be sensible and write the same property to the device too,
    so at least we know which device got loaded with which RMLVO.

diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c
index 7c611bc..e37a68e 100644
--- a/xkb/xkbInit.c
+++ b/xkb/xkbInit.c
@@ -51,6 +51,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #include <X11/extensions/XKMformat.h>
 #include "xkbfile.h"
 #include "xkb.h"
+#include "exevents.h"
 
 #define	CREATE_ATOM(s)	MakeAtom(s,sizeof(s)-1,1)
 
@@ -154,18 +155,22 @@ XkbFreeRMLVOSet(XkbRMLVOSet *rmlvo, Bool freeRMLVO)
         memset(rmlvo, 0, sizeof(XkbRMLVOSet));
 }
 
+/**
+ * Write the given used rules to the device, or (if device is NULL) to the
+ * root window property.
+ */
 static Bool
-XkbWriteRulesProp(ClientPtr client, pointer closure)
+XkbWriteRulesProp(DeviceIntPtr dev, XkbRMLVOSet *rmlvo)
 {
 int 			len,out;
 Atom			name;
 char *			pval;
 
-    len= (XkbRulesUsed?strlen(XkbRulesUsed):0);
-    len+= (XkbModelUsed?strlen(XkbModelUsed):0);
-    len+= (XkbLayoutUsed?strlen(XkbLayoutUsed):0);
-    len+= (XkbVariantUsed?strlen(XkbVariantUsed):0);
-    len+= (XkbOptionsUsed?strlen(XkbOptionsUsed):0);
+    len= (rmlvo->rules ? strlen(rmlvo->rules) : 0);
+    len+= (rmlvo->model ? strlen(rmlvo->model) : 0);
+    len+= (rmlvo->layout ? strlen(rmlvo->layout) : 0);
+    len+= (rmlvo->variant ? strlen(rmlvo->variant) : 0);
+    len+= (rmlvo->options ? strlen(rmlvo->options) : 0);
     if (len<1)
 	return True;
 
@@ -183,41 +188,57 @@ char *			pval;
 	return True;
     }
     out= 0;
-    if (XkbRulesUsed) {
-	strcpy(&pval[out],XkbRulesUsed);
-	out+= strlen(XkbRulesUsed);
+    if (rmlvo->rules) {
+	strcpy(&pval[out],rmlvo->rules);
+	out+= strlen(rmlvo->rules);
     }
     pval[out++]= '\0';
-    if (XkbModelUsed) {
-	strcpy(&pval[out],XkbModelUsed);
-	out+= strlen(XkbModelUsed);
-    } 
+    if (rmlvo->model) {
+	strcpy(&pval[out],rmlvo->model);
+	out+= strlen(rmlvo->model);
+    }
     pval[out++]= '\0';
-    if (XkbLayoutUsed) {
-	strcpy(&pval[out],XkbLayoutUsed);
-	out+= strlen(XkbLayoutUsed);
+    if (rmlvo->layout) {
+	strcpy(&pval[out],rmlvo->layout);
+	out+= strlen(rmlvo->layout);
     }
     pval[out++]= '\0';
-    if (XkbVariantUsed) {
-	strcpy(&pval[out],XkbVariantUsed);
-	out+= strlen(XkbVariantUsed);
+    if (rmlvo->variant) {
+	strcpy(&pval[out],rmlvo->variant);
+	out+= strlen(rmlvo->variant);
     }
     pval[out++]= '\0';
-    if (XkbOptionsUsed) {
-	strcpy(&pval[out],XkbOptionsUsed);
-	out+= strlen(XkbOptionsUsed);
+    if (rmlvo->options) {
+	strcpy(&pval[out],rmlvo->options);
+	out+= strlen(rmlvo->options);
     }
     pval[out++]= '\0';
     if (out!=len) {
 	ErrorF("[xkb] Internal Error! bad size (%d!=%d) for _XKB_RULES_NAMES\n",
 								out,len);
     }
-    dixChangeWindowProperty(serverClient, WindowTable[0], name, XA_STRING, 8,
-			    PropModeReplace, len, pval, True);
+    if (dev)
+        XIChangeDeviceProperty(dev, name, XA_STRING, 8, PropModeReplace, len,
+                               pval, True);
+    else
+        dixChangeWindowProperty(serverClient, WindowTable[0], name, XA_STRING, 8,
+                                PropModeReplace, len, pval, True);
+
     xfree(pval);
     return True;
 }
 
+static Bool
+XkbWriteRootWindowRulesProp(ClientPtr client, pointer closure)
+{
+    Bool rc;
+    XkbRMLVOSet *rmlvo = (XkbRMLVOSet*)closure;
+
+    rc = XkbWriteRulesProp(NULL, rmlvo);
+    XkbFreeRMLVOSet(rmlvo, TRUE);
+    return rc;
+}
+
 static void
 XkbSetRulesUsed(XkbRMLVOSet *rmlvo)
 {
@@ -237,7 +258,18 @@ XkbSetRulesUsed(XkbRMLVOSet *rmlvo)
 	_XkbFree(XkbOptionsUsed);
     XkbOptionsUsed= (rmlvo->options?_XkbDupString(rmlvo->options):NULL);
     if (XkbWantRulesProp)
-	QueueWorkProc(XkbWriteRulesProp,NULL,NULL);
+    {
+        XkbRMLVOSet* rmlvo_used = xcalloc(1, sizeof(XkbRMLVOSet));
+        if (rmlvo_used)
+        {
+            rmlvo_used->rules = _XkbDupString(XkbRulesUsed);
+            rmlvo_used->model = _XkbDupString(XkbModelUsed);
+            rmlvo_used->layout = _XkbDupString(XkbLayoutUsed);
+            rmlvo_used->variant = _XkbDupString(XkbVariantUsed);
+            rmlvo_used->options = _XkbDupString(XkbOptionsUsed);
+            QueueWorkProc(XkbWriteRootWindowRulesProp,NULL,rmlvo_used);
+        }
+    }
     return;
 }
 
@@ -614,6 +646,7 @@ InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet *rmlvo,
 
     XkbSetRulesDflts(rmlvo);
     XkbSetRulesUsed(rmlvo);
+    XkbWriteRulesProp(dev, rmlvo);
     XkbFreeRMLVOSet(&rmlvo_dflts, FALSE);
 
     return TRUE;
commit 44044adc92e6bb6537f48c84727523d5cb23528c
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Apr 30 11:39:50 2009 +1000

    xfree86: print a message if NIDR fails due to AutoAddDevices off.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index a035fca..3859741 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -620,12 +620,11 @@ NewInputDeviceRequest (InputOption *options, DeviceIntPtr *pdev)
         /* Right now, the only automatic config we know of is HAL. */
         if (strcmp(option->key, "_source") == 0 &&
             strcmp(option->value, "server/hal") == 0) {
+            is_auto = 1;
             if (!xf86Info.autoAddDevices) {
                 rval = BadMatch;
                 goto unwind;
             }
-
-            is_auto = 1;
         }
     }
     if (!idev->driver || !idev->identifier) {
@@ -654,6 +653,8 @@ NewInputDeviceRequest (InputOption *options, DeviceIntPtr *pdev)
         return Success;
 
 unwind:
+    if (is_auto && !xf86Info.autoAddDevices)
+        xf86Msg(X_INFO, "AutoAddDevices is off - not adding device.\n");
     if(idev->driver)
         xfree(idev->driver);
     if(idev->identifier)
commit 43dbbc30327f826068bc7cd2cdaf870ed61b4522
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Apr 28 21:01:36 2009 +1000

    Xi: fix typo in ProcXIGrabDevice
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xigrabdev.c b/Xi/xigrabdev.c
index 11c7679..de13256 100644
--- a/Xi/xigrabdev.c
+++ b/Xi/xigrabdev.c
@@ -68,7 +68,7 @@ ProcXIGrabDevice(ClientPtr client)
     GrabMask mask;
 
     REQUEST(xXIGrabDeviceReq);
-    REQUEST_AT_LEAST_SIZE(xXIGetDeviceFocusReq);
+    REQUEST_AT_LEAST_SIZE(xXIGrabDeviceReq);
 
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixSetFocusAccess);
     if (ret != Success)
commit 6a618929a0c06ba0d6dac13d7e644cd9658d98ed
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Apr 28 16:49:45 2009 +1000

    input: reshuffle CreateGrab and friends to take a GrabParameters param.
    
    This is cleaning up work in preparation for XI2 passive grabs.

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 164f071..0793113 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1349,36 +1349,34 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
     }
 }
 
-static int
-CheckGrabValues(ClientPtr client, DeviceIntPtr dev, BYTE this_device_mode,
-                BYTE other_devices_mode, CARD16 modifiers, BOOL ownerEvents)
+int
+CheckGrabValues(ClientPtr client, GrabParameters* param)
 {
-    if ((this_device_mode != GrabModeSync) &&
-	(this_device_mode != GrabModeAsync)) {
-	client->errorValue = this_device_mode;
+    if ((param->this_device_mode != GrabModeSync) &&
+	(param->this_device_mode != GrabModeAsync)) {
+	client->errorValue = param->this_device_mode;
 	return BadValue;
     }
-    if ((other_devices_mode != GrabModeSync) &&
-	(other_devices_mode != GrabModeAsync)) {
-	client->errorValue = other_devices_mode;
+    if ((param->other_devices_mode != GrabModeSync) &&
+	(param->other_devices_mode != GrabModeAsync)) {
+	client->errorValue = param->other_devices_mode;
 	return BadValue;
     }
-    if ((modifiers != AnyModifier) && (modifiers & ~AllModifiersMask)) {
-	client->errorValue = modifiers;
+    if ((param->modifiers != AnyModifier) && (param->modifiers & ~AllModifiersMask)) {
+	client->errorValue = param->modifiers;
 	return BadValue;
     }
-    if ((ownerEvents != xFalse) && (ownerEvents != xTrue)) {
-	client->errorValue = ownerEvents;
+    if ((param->ownerEvents != xFalse) && (param->ownerEvents != xTrue)) {
+	client->errorValue = param->ownerEvents;
 	return BadValue;
     }
     return Success;
 }
 
 int
-GrabButton(ClientPtr client, DeviceIntPtr dev, BYTE this_device_mode,
-	   BYTE other_devices_mode, CARD16 modifiers,
-	   DeviceIntPtr modifier_device, CARD8 button, Window grabWindow,
-	   BOOL ownerEvents, Cursor rcursor, Window rconfineTo, Mask eventMask)
+GrabButton(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
+           int button, GrabParameters *param, GrabType grabtype,
+	   GrabMask *mask)
 {
     WindowPtr pWin, confineTo;
     CursorPtr cursor;
@@ -1386,53 +1384,48 @@ GrabButton(ClientPtr client, DeviceIntPtr dev, BYTE this_device_mode,
     int rc;
     Mask access_mode = DixGrabAccess;
 
-    rc = CheckGrabValues(client, dev, this_device_mode, other_devices_mode,
-                         modifiers, ownerEvents);
+    rc = CheckGrabValues(client, param);
     if (rc != Success)
 	return rc;
-    if (rconfineTo == None)
+    if (param->confineTo == None)
 	confineTo = NullWindow;
     else {
-	rc = dixLookupWindow(&confineTo, rconfineTo, client, DixSetAttrAccess);
+	rc = dixLookupWindow(&confineTo, param->confineTo, client, DixSetAttrAccess);
 	if (rc != Success)
 	    return rc;
     }
-    if (rcursor == None)
+    if (param->cursor == None)
 	cursor = NullCursor;
     else {
-	rc = dixLookupResourceByType((pointer *)&cursor, rcursor, RT_CURSOR,
-			       client, DixUseAccess);
+	rc = dixLookupResourceByType((pointer *)&cursor, param->cursor,
+				     RT_CURSOR, client, DixUseAccess);
 	if (rc != Success)
 	{
-	    client->errorValue = rcursor;
+	    client->errorValue = param->cursor;
 	    return (rc == BadValue) ? BadCursor : rc;
 	}
 	access_mode |= DixForceAccess;
     }
-    if (this_device_mode == GrabModeSync || other_devices_mode == GrabModeSync)
+    if (param->this_device_mode == GrabModeSync || param->other_devices_mode == GrabModeSync)
 	access_mode |= DixFreezeAccess;
     rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
     if (rc != Success)
 	return rc;
-    rc = dixLookupWindow(&pWin, grabWindow, client, DixSetAttrAccess);
+    rc = dixLookupWindow(&pWin, param->grabWindow, client, DixSetAttrAccess);
     if (rc != Success)
 	return rc;
 
 
-    grab = CreateGrab(client->index, dev, pWin, eventMask,
-		      (Bool) ownerEvents, (Bool) this_device_mode,
-		      (Bool) other_devices_mode, modifier_device, modifiers,
-		      DeviceButtonPress, GRABTYPE_XI, button, confineTo, cursor);
+    grab = CreateGrab(client->index, dev, modifier_device, pWin, grabtype,
+                      mask, param, DeviceButtonPress, button, confineTo, cursor);
     if (!grab)
 	return BadAlloc;
     return AddPassiveGrabToList(client, grab);
 }
 
 int
-GrabKey(ClientPtr client, DeviceIntPtr dev, BYTE this_device_mode,
-	BYTE other_devices_mode, CARD16 modifiers,
-	DeviceIntPtr modifier_device, CARD8 key, Window grabWindow,
-	BOOL ownerEvents, Mask mask)
+GrabKey(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
+        int key, GrabParameters *param, GrabType grabtype, GrabMask *mask)
 {
     WindowPtr pWin;
     GrabPtr grab;
@@ -1440,8 +1433,7 @@ GrabKey(ClientPtr client, DeviceIntPtr dev, BYTE this_device_mode,
     Mask access_mode = DixGrabAccess;
     int rc;
 
-    rc = CheckGrabValues(client, dev, this_device_mode, other_devices_mode,
-                         modifiers, ownerEvents);
+    rc = CheckGrabValues(client, param);
     if (rc != Success)
         return rc;
     if (k == NULL)
@@ -1452,19 +1444,17 @@ GrabKey(ClientPtr client, DeviceIntPtr dev, BYTE this_device_mode,
 	client->errorValue = key;
         return BadValue;
     }
-    rc = dixLookupWindow(&pWin, grabWindow, client, DixSetAttrAccess);
+    rc = dixLookupWindow(&pWin, param->grabWindow, client, DixSetAttrAccess);
     if (rc != Success)
 	return rc;
-    if (this_device_mode == GrabModeSync || other_devices_mode == GrabModeSync)
+    if (param->this_device_mode == GrabModeSync || param->other_devices_mode == GrabModeSync)
 	access_mode |= DixFreezeAccess;
     rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
     if (rc != Success)
 	return rc;
 
-    grab = CreateGrab(client->index, dev, pWin,
-		      mask, ownerEvents, this_device_mode, other_devices_mode,
-		      modifier_device, modifiers, DeviceKeyPress, GRABTYPE_XI,
-		      key, NullWindow, NullCursor);
+    grab = CreateGrab(client->index, dev, modifier_device, pWin, grabtype,
+                      mask, param, DeviceKeyPress, key, NULL, NULL);
     if (!grab)
 	return BadAlloc;
     return AddPassiveGrabToList(client, grab);
diff --git a/Xi/grabdevb.c b/Xi/grabdevb.c
index 61ced48..0d1eb63 100644
--- a/Xi/grabdevb.c
+++ b/Xi/grabdevb.c
@@ -103,6 +103,8 @@ ProcXGrabDeviceButton(ClientPtr client)
     DeviceIntPtr mdev;
     XEventClass *class;
     struct tmask tmp[EMASKSIZE];
+    GrabParameters param;
+    GrabMask mask;
 
     REQUEST(xGrabDeviceButtonReq);
     REQUEST_AT_LEAST_SIZE(xGrabDeviceButtonReq);
@@ -135,10 +137,17 @@ ProcXGrabDeviceButton(ClientPtr client)
 				  stuff->event_count, tmp, dev,
 				  X_GrabDeviceButton)) != Success)
 	return ret;
-    ret = GrabButton(client, dev, stuff->this_device_mode,
-		     stuff->other_devices_mode, stuff->modifiers, mdev,
-		     stuff->button, stuff->grabWindow, stuff->ownerEvents,
-		     (Cursor) 0, (Window) 0, tmp[stuff->grabbed_device].mask);
+
+    memset(&param, 0, sizeof(param));
+    param.ownerEvents = stuff->ownerEvents;
+    param.this_device_mode = stuff->this_device_mode;
+    param.other_devices_mode = stuff->other_devices_mode;
+    param.grabWindow = stuff->grabWindow;
+    param.modifiers = stuff->modifiers;
+    mask.xi = tmp[stuff->grabbed_device].mask;
+
+    ret = GrabButton(client, dev, mdev, stuff->button, &param,
+                     GRABTYPE_XI, &mask);
 
     return ret;
 }
diff --git a/Xi/grabdevk.c b/Xi/grabdevk.c
index aefe11b..96e2e62 100644
--- a/Xi/grabdevk.c
+++ b/Xi/grabdevk.c
@@ -101,6 +101,8 @@ ProcXGrabDeviceKey(ClientPtr client)
     DeviceIntPtr mdev;
     XEventClass *class;
     struct tmask tmp[EMASKSIZE];
+    GrabParameters param;
+    GrabMask mask;
 
     REQUEST(xGrabDeviceKeyReq);
     REQUEST_AT_LEAST_SIZE(xGrabDeviceKeyReq);
@@ -133,10 +135,16 @@ ProcXGrabDeviceKey(ClientPtr client)
 				  X_GrabDeviceKey)) != Success)
 	return ret;
 
-    ret = GrabKey(client, dev, stuff->this_device_mode,
-		  stuff->other_devices_mode, stuff->modifiers, mdev,
-		  stuff->key, stuff->grabWindow, stuff->ownerEvents,
-		  tmp[stuff->grabbed_device].mask);
+
+    memset(&param, 0, sizeof(param));
+    param.ownerEvents = stuff->ownerEvents;
+    param.this_device_mode = stuff->this_device_mode;
+    param.other_devices_mode = stuff->other_devices_mode;
+    param.grabWindow = stuff->grabWindow;
+    param.modifiers = stuff->modifiers;
+    mask.xi = tmp[stuff->grabbed_device].mask;
+
+    ret = GrabKey(client, dev, mdev, stuff->key, &param, GRABTYPE_XI, &mask);
 
     return ret;
 }
diff --git a/dix/events.c b/dix/events.c
index c87a361..6fe2182 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -5022,25 +5022,21 @@ ProcGrabKey(ClientPtr client)
     GrabPtr grab;
     DeviceIntPtr keybd = PickKeyboard(client);
     int rc;
+    GrabParameters param;
+    GrabMask mask;
 
     REQUEST_SIZE_MATCH(xGrabKeyReq);
-    if ((stuff->ownerEvents != xTrue) && (stuff->ownerEvents != xFalse))
-    {
-	client->errorValue = stuff->ownerEvents;
-	return(BadValue);
-    }
-    if ((stuff->pointerMode != GrabModeSync) &&
-	(stuff->pointerMode != GrabModeAsync))
-    {
-	client->errorValue = stuff->pointerMode;
-        return BadValue;
-    }
-    if ((stuff->keyboardMode != GrabModeSync) &&
-	(stuff->keyboardMode != GrabModeAsync))
-    {
-	client->errorValue = stuff->keyboardMode;
-        return BadValue;
-    }
+
+    memset(&param, 0, sizeof(param));
+    param.ownerEvents = stuff->ownerEvents;
+    param.this_device_mode = stuff->keyboardMode;
+    param.other_devices_mode = stuff->pointerMode;
+    param.modifiers = stuff->modifiers;
+
+    rc = CheckGrabValues(client, &param);
+    if (rc != Success)
+        return rc;
+
     if (((stuff->key > keybd->key->xkbInfo->desc->max_key_code) ||
 	 (stuff->key < keybd->key->xkbInfo->desc->min_key_code))
 	&& (stuff->key != AnyKey))
@@ -5048,21 +5044,15 @@ ProcGrabKey(ClientPtr client)
 	client->errorValue = stuff->key;
         return BadValue;
     }
-    if ((stuff->modifiers != AnyModifier) &&
-	(stuff->modifiers & ~AllModifiersMask))
-    {
-	client->errorValue = stuff->modifiers;
-	return BadValue;
-    }
     rc = dixLookupWindow(&pWin, stuff->grabWindow, client, DixSetAttrAccess);
     if (rc != Success)
 	return rc;
 
-    grab = CreateGrab(client->index, keybd, pWin,
-	(Mask)(KeyPressMask | KeyReleaseMask), (Bool)stuff->ownerEvents,
-	(Bool)stuff->keyboardMode, (Bool)stuff->pointerMode,
-	keybd, stuff->modifiers, KeyPress, GRABTYPE_CORE, stuff->key,
-	NullWindow, NullCursor);
+
+    mask.core = (KeyPressMask | KeyReleaseMask);
+
+    grab = CreateGrab(client->index, keybd, keybd, pWin, GRABTYPE_CORE, &mask,
+                      &param, KeyPress, stuff->key, NullWindow, NullCursor);
     if (!grab)
 	return BadAlloc;
     return AddPassiveGrabToList(client, grab);
@@ -5084,6 +5074,8 @@ ProcGrabButton(ClientPtr client)
     GrabPtr grab;
     DeviceIntPtr ptr, modifierDevice;
     Mask access_mode = DixGrabAccess;
+    GrabMask mask;
+    GrabParameters param;
     int rc;
 
     REQUEST_SIZE_MATCH(xGrabButtonReq);
@@ -5150,11 +5142,17 @@ ProcGrabButton(ClientPtr client)
     if (rc != Success)
 	return rc;
 
-    grab = CreateGrab(client->index, ptr, pWin,
-        (Mask)stuff->eventMask, (Bool)stuff->ownerEvents,
-        (Bool) stuff->keyboardMode, (Bool)stuff->pointerMode,
-        modifierDevice, stuff->modifiers, ButtonPress, GRABTYPE_CORE,
-        stuff->button, confineTo, cursor);
+    memset(&param, 0, sizeof(param));
+    param.ownerEvents = stuff->ownerEvents;
+    param.this_device_mode = stuff->keyboardMode;
+    param.other_devices_mode = stuff->pointerMode;
+    param.modifiers = stuff->modifiers;
+
+    mask.core = stuff->eventMask;
+
+    grab = CreateGrab(client->index, ptr, modifierDevice, pWin,
+                      GRABTYPE_CORE, &mask, &param, ButtonPress,
+                      stuff->button, confineTo, cursor);
     if (!grab)
 	return BadAlloc;
     return AddPassiveGrabToList(client, grab);
diff --git a/dix/grabs.c b/dix/grabs.c
index cd34f7e..06e1ebb 100644
--- a/dix/grabs.c
+++ b/dix/grabs.c
@@ -58,6 +58,7 @@ SOFTWARE.
 #include "cursorstr.h"
 #include "dixgrabs.h"
 #include "xace.h"
+#include "exevents.h"
 
 #define BITMASK(i) (((Mask)1) << ((i) & 31))
 #define MASKIDX(i) ((i) >> 5)
@@ -70,13 +71,12 @@ GrabPtr
 CreateGrab(
     int client,
     DeviceIntPtr device,
-    WindowPtr window,
-    Mask eventMask,
-    Bool ownerEvents, Bool keyboardMode, Bool pointerMode,
     DeviceIntPtr modDevice,
-    unsigned short modifiers,
+    WindowPtr window,
+    GrabType grabtype,
+    GrabMask *mask,
+    GrabParameters *param,
     int type,
-    int grabtype,
     KeyCode keybut,	/* key or button */
     WindowPtr confineTo,
     CursorPtr cursor)
@@ -89,12 +89,12 @@ CreateGrab(
     grab->resource = FakeClientID(client);
     grab->device = device;
     grab->window = window;
-    grab->eventMask = eventMask;
+    grab->eventMask = mask->core; /* same for XI */
     grab->deviceMask = 0;
-    grab->ownerEvents = ownerEvents;
-    grab->keyboardMode = keyboardMode;
-    grab->pointerMode = pointerMode;
-    grab->modifiersDetail.exact = modifiers;
+    grab->ownerEvents = param->ownerEvents;
+    grab->keyboardMode = param->this_device_mode;
+    grab->pointerMode = param->other_devices_mode;
+    grab->modifiersDetail.exact = param->modifiers;
     grab->modifiersDetail.pMask = NULL;
     grab->modifierDevice = modDevice;
     grab->type = type;
@@ -434,17 +434,21 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
 		 && (pMinuendGrab->modifiersDetail.exact != AnyModifier))
 	{
 	    GrabPtr pNewGrab;
+            GrabParameters param;
 
 	    UPDATE(grab->detail.pMask, pMinuendGrab->detail.exact);
 
+            memset(&param, 0, sizeof(param));
+            param.ownerEvents = grab->ownerEvents;
+            param.this_device_mode = grab->keyboardMode;
+            param.other_devices_mode = grab->pointerMode;
+            param.modifiers = AnyModifier;
+
 	    pNewGrab = CreateGrab(CLIENT_ID(grab->resource), grab->device,
-				  grab->window, (Mask)grab->eventMask,
-				  (Bool)grab->ownerEvents,
-				  (Bool)grab->keyboardMode,
-				  (Bool)grab->pointerMode,
-				  grab->modifierDevice,
-				  AnyModifier, (int)grab->type,
+				  grab->modifierDevice, grab->window,
                                   grab->grabtype,
+				  (GrabMask*)grab->eventMask,
+                                  &param, (int)grab->type,
 				  pMinuendGrab->detail.exact,
 				  grab->confineTo, grab->cursor);
 	    if (!pNewGrab)
diff --git a/include/dixgrabs.h b/include/dixgrabs.h
index 5127239..3b2a46d 100644
--- a/include/dixgrabs.h
+++ b/include/dixgrabs.h
@@ -26,21 +26,20 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #ifndef DIXGRABS_H
 #define DIXGRABS_H 1
 
-extern _X_EXPORT GrabPtr CreateGrab(
+struct _GrabParameters;
+
+extern GrabPtr CreateGrab(
 	int /* client */,
 	DeviceIntPtr /* device */,
-	WindowPtr /* window */,
-	Mask /* eventMask */,
-	Bool /* ownerEvents */,
-	Bool /* keyboardMode */,
-	Bool /* pointerMode */,
 	DeviceIntPtr /* modDevice */,
-	unsigned short /* modifiers */,
+	WindowPtr /* window */,
+        GrabType /* grabtype */,
+        GrabMask * /* mask */,
+        struct _GrabParameters * /* param */,
 	int /* type */,
-	int /* grabtype */,
 	KeyCode /* keybut */,
-	WindowPtr /* confineTo */,
-	CursorPtr /* cursor */);
+        WindowPtr /* confineTo */,
+        CursorPtr /* cursor */);
 
 extern _X_EXPORT int DeletePassiveGrab(
 	pointer /* value */,
diff --git a/include/exevents.h b/include/exevents.h
index fc1c23f..95d08cc 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -42,6 +42,18 @@ typedef struct _XIClientRec {
         int minor_version;
 } XIClientRec, *XIClientPtr;
 
+
+typedef struct _GrabParameters {
+    unsigned int        ownerEvents;
+    unsigned int        this_device_mode;
+    unsigned int        other_devices_mode;
+    Window              grabWindow;
+    Window              confineTo;
+    Cursor              cursor;
+    unsigned int        modifiers;
+} GrabParameters;
+
+
 extern _X_EXPORT void RegisterOtherDevice (
 	DeviceIntPtr           /* device */);
 
@@ -73,31 +85,27 @@ extern _X_EXPORT void DeviceFocusEvent(
 	int                    /* detail */,
 	WindowPtr              /* pWin */);
 
-extern _X_EXPORT int GrabButton(
+extern int CheckGrabValues(
+        ClientPtr              /* client */,
+        GrabParameters*        /* param */);
+
+extern int GrabButton(
 	ClientPtr              /* client */,
 	DeviceIntPtr           /* dev */,
-	BYTE                   /* this_device_mode */,
-	BYTE                   /* other_devices_mode */,
-	CARD16                 /* modifiers */,
 	DeviceIntPtr           /* modifier_device */,
-	CARD8                  /* button */,
-	Window                 /* grabWindow */,
-	BOOL                   /* ownerEvents */,
-	Cursor                 /* rcursor */,
-	Window                 /* rconfineTo */,
-	Mask                   /* eventMask */);
-
-extern _X_EXPORT int GrabKey(
+	int                    /* button */,
+        GrabParameters*        /* param */,
+        GrabType               /* grabtype */,
+	GrabMask*              /* eventMask */);
+
+extern int GrabKey(
 	ClientPtr              /* client */,
 	DeviceIntPtr           /* dev */,
-	BYTE                   /* this_device_mode */,
-	BYTE                   /* other_devices_mode */,
-	CARD16                 /* modifiers */,
 	DeviceIntPtr           /* modifier_device */,
-	CARD8                  /* key */,
-	Window                 /* grabWindow */,
-	BOOL                   /* ownerEvents */,
-	Mask                   /* mask */);
+	int                    /* key */,
+        GrabParameters*        /* param */,
+        GrabType               /* grabtype */,
+	GrabMask*              /* eventMask */);
 
 extern int SelectForWindow(
 	DeviceIntPtr           /* dev */,
diff --git a/test/input.c b/test/input.c
index eb0543e..a9027f0 100644
--- a/test/input.c
+++ b/test/input.c
@@ -33,6 +33,7 @@
 #include "windowstr.h"
 #include "inputstr.h"
 #include "eventconvert.h"
+#include "exevents.h"
 
 #include <glib.h>
 
@@ -73,6 +74,66 @@ static void dix_init_valuators(void)
     g_assert(dev.last.numValuators == num_axes);
 }
 
+/* just check the known success cases, and that error cases set the client's
+ * error value correctly. */
+static void dix_check_grab_values(void)
+{
+    ClientRec client;
+    GrabParameters param;
+    int rc;
+
+    memset(&client, 0, sizeof(client));
+
+    param.this_device_mode = GrabModeSync;
+    param.other_devices_mode = GrabModeSync;
+    param.modifiers = AnyModifier;
+    param.ownerEvents = FALSE;
+
+    rc = CheckGrabValues(&client, &param);
+    g_assert(rc == Success);
+
+    param.this_device_mode = GrabModeAsync;
+    rc = CheckGrabValues(&client, &param);
+    g_assert(rc == Success);
+
+    param.this_device_mode = GrabModeAsync + 1;
+    rc = CheckGrabValues(&client, &param);
+    g_assert(rc == BadValue);
+    g_assert(client.errorValue == param.this_device_mode);
+    g_assert(client.errorValue == GrabModeAsync + 1);
+
+    param.this_device_mode = GrabModeSync;
+    param.other_devices_mode = GrabModeAsync;
+    rc = CheckGrabValues(&client, &param);
+    g_assert(rc == Success);
+
+    param.other_devices_mode = GrabModeAsync + 1;
+    rc = CheckGrabValues(&client, &param);
+    g_assert(rc == BadValue);
+    g_assert(client.errorValue == param.other_devices_mode);
+    g_assert(client.errorValue == GrabModeAsync + 1);
+
+    param.other_devices_mode = GrabModeSync;
+
+    param.modifiers = 1 << 13;
+    rc = CheckGrabValues(&client, &param);
+    g_assert(rc == BadValue);
+    g_assert(client.errorValue == param.modifiers);
+    g_assert(client.errorValue == (1 << 13));
+
+
+    param.modifiers = AnyModifier;
+    param.ownerEvents = TRUE;
+    rc = CheckGrabValues(&client, &param);
+    g_assert(rc == Success);
+
+    param.ownerEvents = 3;
+    rc = CheckGrabValues(&client, &param);
+    g_assert(rc == BadValue);
+    g_assert(client.errorValue == param.ownerEvents);
+    g_assert(client.errorValue == 3);
+}
+
 
 /**
  * Convert various internal events to the matching core event and verify the
@@ -222,6 +283,7 @@ int main(int argc, char** argv)
 
     g_test_add_func("/dix/input/init-valuators", dix_init_valuators);
     g_test_add_func("/dix/input/event-core-conversion", dix_event_to_core_conversion);
+    g_test_add_func("/dix/input/check-grab-values", dix_check_grab_values);
 
     return g_test_run();
 }
commit e8e26f700c9c70d3f1bb53bdb71d1100f5c43a69
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Apr 26 21:43:25 2009 +1000

    Xi: split some grab parameter checking out of GrabButton and GrabKey.

diff --git a/Xi/exevents.c b/Xi/exevents.c
index ed6a3ed..164f071 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1349,18 +1349,10 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
     }
 }
 
-int
-GrabButton(ClientPtr client, DeviceIntPtr dev, BYTE this_device_mode,
-	   BYTE other_devices_mode, CARD16 modifiers,
-	   DeviceIntPtr modifier_device, CARD8 button, Window grabWindow,
-	   BOOL ownerEvents, Cursor rcursor, Window rconfineTo, Mask eventMask)
+static int
+CheckGrabValues(ClientPtr client, DeviceIntPtr dev, BYTE this_device_mode,
+                BYTE other_devices_mode, CARD16 modifiers, BOOL ownerEvents)
 {
-    WindowPtr pWin, confineTo;
-    CursorPtr cursor;
-    GrabPtr grab;
-    Mask access_mode = DixGrabAccess;
-    int rc;
-
     if ((this_device_mode != GrabModeSync) &&
 	(this_device_mode != GrabModeAsync)) {
 	client->errorValue = this_device_mode;
@@ -1379,7 +1371,23 @@ GrabButton(ClientPtr client, DeviceIntPtr dev, BYTE this_device_mode,
 	client->errorValue = ownerEvents;
 	return BadValue;
     }
-    rc = dixLookupWindow(&pWin, grabWindow, client, DixSetAttrAccess);
+    return Success;
+}
+
+int
+GrabButton(ClientPtr client, DeviceIntPtr dev, BYTE this_device_mode,
+	   BYTE other_devices_mode, CARD16 modifiers,
+	   DeviceIntPtr modifier_device, CARD8 button, Window grabWindow,
+	   BOOL ownerEvents, Cursor rcursor, Window rconfineTo, Mask eventMask)
+{
+    WindowPtr pWin, confineTo;
+    CursorPtr cursor;
+    GrabPtr grab;
+    int rc;
+    Mask access_mode = DixGrabAccess;
+
+    rc = CheckGrabValues(client, dev, this_device_mode, other_devices_mode,
+                         modifiers, ownerEvents);
     if (rc != Success)
 	return rc;
     if (rconfineTo == None)
@@ -1406,6 +1414,10 @@ GrabButton(ClientPtr client, DeviceIntPtr dev, BYTE this_device_mode,
     rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
     if (rc != Success)
 	return rc;
+    rc = dixLookupWindow(&pWin, grabWindow, client, DixSetAttrAccess);
+    if (rc != Success)
+	return rc;
+
 
     grab = CreateGrab(client->index, dev, pWin, eventMask,
 		      (Bool) ownerEvents, (Bool) this_device_mode,
@@ -1428,32 +1440,18 @@ GrabKey(ClientPtr client, DeviceIntPtr dev, BYTE this_device_mode,
     Mask access_mode = DixGrabAccess;
     int rc;
 
+    rc = CheckGrabValues(client, dev, this_device_mode, other_devices_mode,
+                         modifiers, ownerEvents);
+    if (rc != Success)
+        return rc;
     if (k == NULL)
 	return BadMatch;
-    if ((other_devices_mode != GrabModeSync) &&
-	(other_devices_mode != GrabModeAsync)) {
-	client->errorValue = other_devices_mode;
-	return BadValue;
-    }
-    if ((this_device_mode != GrabModeSync) &&
-	(this_device_mode != GrabModeAsync)) {
-	client->errorValue = this_device_mode;
-	return BadValue;
-    }
     if ((key > k->xkbInfo->desc->max_key_code ||
          key < k->xkbInfo->desc->min_key_code)
 	&& (key != AnyKey)) {
 	client->errorValue = key;
         return BadValue;
     }
-    if ((modifiers != AnyModifier) && (modifiers & ~AllModifiersMask)) {
-	client->errorValue = modifiers;
-	return BadValue;
-    }
-    if ((ownerEvents != xTrue) && (ownerEvents != xFalse)) {
-	client->errorValue = ownerEvents;
-	return BadValue;
-    }
     rc = dixLookupWindow(&pWin, grabWindow, client, DixSetAttrAccess);
     if (rc != Success)
 	return rc;
commit 57aff88c7d0761e590806d07bee1c9410680c89f
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Wed Apr 29 01:04:37 2009 -0400

    Fix most remaining deprecated resource lookups.
    
    Callsites updated to use dixLookupResourceBy{Type,Class}.
    TODO: Audit access modes to make sure they reflect the usage.

diff --git a/Xext/panoramiX.c b/Xext/panoramiX.c
index 767f603..4ab6f6b 100644
--- a/Xext/panoramiX.c
+++ b/Xext/panoramiX.c
@@ -354,9 +354,12 @@ PanoramiXRes *
 PanoramiXFindIDByScrnum(RESTYPE type, XID id, int screen)
 {
     PanoramiXSearchData data;
+    pointer val;
 
-    if(!screen) 
-	return LookupIDByType(id, type);
+    if(!screen) {
+	dixLookupResourceByType(&val, id, type, serverClient, DixReadAccess);
+	return val;
+    }
 
     data.screen = screen;
     data.id = id;
diff --git a/Xext/panoramiX.h b/Xext/panoramiX.h
index d413ff9..cca4c52 100644
--- a/Xext/panoramiX.h
+++ b/Xext/panoramiX.h
@@ -97,6 +97,4 @@ typedef struct {
 
 #define IS_SHARED_PIXMAP(r) (((r)->type == XRT_PIXMAP) && (r)->u.pix.shared)
 
-#define SKIP_FAKE_WINDOW(a) if(!LookupIDByType(a, XRT_WINDOW)) return
-
 #endif /* _PANORAMIX_H_ */
diff --git a/Xext/panoramiXprocs.c b/Xext/panoramiXprocs.c
index 72a207a..8b51009 100644
--- a/Xext/panoramiXprocs.c
+++ b/Xext/panoramiXprocs.c
@@ -67,7 +67,7 @@ int PanoramiXCreateWindow(ClientPtr client)
     PanoramiXRes *cmap    = NULL;
     REQUEST(xCreateWindowReq);
     int pback_offset = 0, pbord_offset = 0, cmap_offset = 0;
-    int result = 0, len, j;
+    int result, len, j;
     int orig_x, orig_y;
     XID orig_visual, tmp;
     Bool parentIsRoot;
@@ -78,9 +78,10 @@ int PanoramiXCreateWindow(ClientPtr client)
     if (Ones(stuff->mask) != len)
         return BadLength;
 
-    if (!(parent = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->parent, XRT_WINDOW, DixWriteAccess)))
-        return BadWindow;
+    result = dixLookupResourceByType((pointer *)&parent, stuff->parent,
+				     XRT_WINDOW, client, DixWriteAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadWindow : result;
 
     if(stuff->class == CopyFromParent)
 	stuff->class = parent->u.win.class;
@@ -92,27 +93,30 @@ int PanoramiXCreateWindow(ClientPtr client)
 	pback_offset = Ones((Mask)stuff->mask & (CWBackPixmap - 1));
 	tmp = *((CARD32 *) &stuff[1] + pback_offset);
 	if ((tmp != None) && (tmp != ParentRelative)) {
-	   if(!(backPix = (PanoramiXRes*) SecurityLookupIDByType(
-		client, tmp, XRT_PIXMAP, DixReadAccess)))
-	      return BadPixmap;
+	    result = dixLookupResourceByType((pointer *)&backPix, tmp,
+					     XRT_PIXMAP, client, DixReadAccess);
+	    if (result != Success)
+		return (result == BadValue) ? BadPixmap : result;
 	}
     }
     if ((Mask)stuff->mask & CWBorderPixmap) {
 	pbord_offset = Ones((Mask)stuff->mask & (CWBorderPixmap - 1));
 	tmp = *((CARD32 *) &stuff[1] + pbord_offset);
 	if (tmp != CopyFromParent) {
-	   if(!(bordPix = (PanoramiXRes*) SecurityLookupIDByType(
-		client, tmp, XRT_PIXMAP, DixReadAccess)))
-	      return BadPixmap;
+	    result = dixLookupResourceByType((pointer *)&bordPix, tmp,
+					     XRT_PIXMAP, client, DixReadAccess);
+	    if (result != Success)
+		return (result == BadValue) ? BadPixmap : result;
 	}
     }
     if ((Mask)stuff->mask & CWColormap) {
 	cmap_offset = Ones((Mask)stuff->mask & (CWColormap - 1));
 	tmp = *((CARD32 *) &stuff[1] + cmap_offset);
 	if ((tmp != CopyFromParent) && (tmp != None)) {
-	   if(!(cmap = (PanoramiXRes*) SecurityLookupIDByType(
-		client, tmp, XRT_COLORMAP, DixReadAccess)))
-	      return BadColor;
+	    result = dixLookupResourceByType((pointer *)&cmap, tmp,
+					     XRT_COLORMAP, client, DixReadAccess);
+	    if (result != Success)
+		return (result == BadValue) ? BadColor : result;
 	}
     }
 
@@ -170,7 +174,7 @@ int PanoramiXChangeWindowAttributes(ClientPtr client)
     PanoramiXRes *cmap    = NULL;
     REQUEST(xChangeWindowAttributesReq);
     int pback_offset = 0, pbord_offset = 0, cmap_offset = 0;
-    int result = 0, len, j;
+    int result, len, j;
     XID tmp;
 
     REQUEST_AT_LEAST_SIZE(xChangeWindowAttributesReq);
@@ -179,9 +183,10 @@ int PanoramiXChangeWindowAttributes(ClientPtr client)
     if (Ones(stuff->valueMask) != len)
         return BadLength;
 
-    if (!(win = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->window, XRT_WINDOW, DixWriteAccess)))
-        return BadWindow;
+    result = dixLookupResourceByType((pointer *)&win, stuff->window,
+				     XRT_WINDOW, client, DixWriteAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadWindow : result;
 
     if((win->u.win.class == InputOnly) && 
        (stuff->valueMask & (~INPUTONLY_LEGAL_MASK)))
@@ -191,27 +196,30 @@ int PanoramiXChangeWindowAttributes(ClientPtr client)
 	pback_offset = Ones((Mask)stuff->valueMask & (CWBackPixmap - 1));
 	tmp = *((CARD32 *) &stuff[1] + pback_offset);
 	if ((tmp != None) && (tmp != ParentRelative)) {
-	   if(!(backPix = (PanoramiXRes*) SecurityLookupIDByType(
-		client, tmp, XRT_PIXMAP, DixReadAccess)))
-	      return BadPixmap;
+	    result = dixLookupResourceByType((pointer *)&backPix, tmp,
+					     XRT_PIXMAP, client, DixReadAccess);
+	    if (result != Success)
+		return (result == BadValue) ? BadPixmap : result;
 	}
     }
     if ((Mask)stuff->valueMask & CWBorderPixmap) {
 	pbord_offset = Ones((Mask)stuff->valueMask & (CWBorderPixmap - 1));
 	tmp = *((CARD32 *) &stuff[1] + pbord_offset);
 	if (tmp != CopyFromParent) {
-	   if(!(bordPix = (PanoramiXRes*) SecurityLookupIDByType(
-		client, tmp, XRT_PIXMAP, DixReadAccess)))
-	      return BadPixmap;
+	    result = dixLookupResourceByType((pointer *)&bordPix, tmp,
+					     XRT_PIXMAP, client, DixReadAccess);
+	    if (result != Success)
+		return (result == BadValue) ? BadPixmap : result;
 	}
     }
     if ((Mask)stuff->valueMask & CWColormap) {
 	cmap_offset = Ones((Mask)stuff->valueMask & (CWColormap - 1));
 	tmp = *((CARD32 *) &stuff[1] + cmap_offset);
 	if ((tmp != CopyFromParent) && (tmp != None)) {
-	   if(!(cmap = (PanoramiXRes*) SecurityLookupIDByType(
-		client, tmp, XRT_COLORMAP, DixReadAccess)))
-	      return BadColor;
+	    result = dixLookupResourceByType((pointer *)&cmap, tmp,
+					     XRT_COLORMAP, client, DixReadAccess);
+	    if (result != Success)
+		return (result == BadValue) ? BadColor : result;
 	}
     }
 
@@ -233,14 +241,15 @@ int PanoramiXChangeWindowAttributes(ClientPtr client)
 int PanoramiXDestroyWindow(ClientPtr client)
 {
     PanoramiXRes *win;
-    int         result = 0, j;
+    int         result, j;
     REQUEST(xResourceReq);
 
     REQUEST_SIZE_MATCH(xResourceReq);
 
-    if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->id, XRT_WINDOW, DixDestroyAccess)))
-	return BadWindow;
+    result = dixLookupResourceByType((pointer *)&win, stuff->id, XRT_WINDOW,
+				     client, DixDestroyAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
     FOR_NSCREENS_BACKWARD(j) {
 	stuff->id = win->info[j].id;
@@ -258,14 +267,15 @@ int PanoramiXDestroyWindow(ClientPtr client)
 int PanoramiXDestroySubwindows(ClientPtr client)
 {
     PanoramiXRes *win;
-    int         result = 0, j;
+    int         result, j;
     REQUEST(xResourceReq);
 
     REQUEST_SIZE_MATCH(xResourceReq);
 
-    if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->id, XRT_WINDOW, DixDestroyAccess)))
-	return BadWindow;
+    result = dixLookupResourceByType((pointer *)&win, stuff->id, XRT_WINDOW,
+				     client, DixDestroyAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
     FOR_NSCREENS_BACKWARD(j) {
 	stuff->id = win->info[j].id;
@@ -283,14 +293,15 @@ int PanoramiXDestroySubwindows(ClientPtr client)
 int PanoramiXChangeSaveSet(ClientPtr client)
 {
     PanoramiXRes *win;
-    int         result = 0, j;
+    int         result, j;
     REQUEST(xChangeSaveSetReq);
 
     REQUEST_SIZE_MATCH(xChangeSaveSetReq);
 
-    if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->window, XRT_WINDOW, DixReadAccess)))
-	return BadWindow;
+    result = dixLookupResourceByType((pointer *)&win, stuff->window,
+				     XRT_WINDOW, client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
     FOR_NSCREENS_BACKWARD(j) {
 	stuff->window = win->info[j].id;
@@ -305,20 +316,22 @@ int PanoramiXChangeSaveSet(ClientPtr client)
 int PanoramiXReparentWindow(ClientPtr client)
 {
     PanoramiXRes *win, *parent;
-    int         result = 0, j;
+    int         result, j;
     int		x, y;
     Bool	parentIsRoot;
     REQUEST(xReparentWindowReq);
 
     REQUEST_SIZE_MATCH(xReparentWindowReq);
 
-    if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->window, XRT_WINDOW, DixWriteAccess)))
-	return BadWindow;
+    result = dixLookupResourceByType((pointer *)&win, stuff->window,
+				     XRT_WINDOW, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
-    if(!(parent = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->parent, XRT_WINDOW, DixWriteAccess)))
-	return BadWindow;
+    result = dixLookupResourceByType((pointer *)&parent, stuff->parent,
+				     XRT_WINDOW, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
     x = stuff->x;
     y = stuff->y;
@@ -342,14 +355,15 @@ int PanoramiXReparentWindow(ClientPtr client)
 int PanoramiXMapWindow(ClientPtr client)
 {
     PanoramiXRes *win;
-    int         result = 0, j;
+    int         result, j;
     REQUEST(xResourceReq);
 
     REQUEST_SIZE_MATCH(xResourceReq);
 
-    if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->id, XRT_WINDOW, DixReadAccess)))
-	return BadWindow;
+    result = dixLookupResourceByType((pointer *)&win, stuff->id,
+				     XRT_WINDOW, client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
     FOR_NSCREENS_FORWARD(j) {
 	stuff->id = win->info[j].id;
@@ -364,14 +378,15 @@ int PanoramiXMapWindow(ClientPtr client)
 int PanoramiXMapSubwindows(ClientPtr client)
 {
     PanoramiXRes *win;
-    int         result = 0, j;
+    int         result, j;
     REQUEST(xResourceReq);
 
     REQUEST_SIZE_MATCH(xResourceReq);
 
-    if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->id, XRT_WINDOW, DixReadAccess)))
-	return BadWindow;
+    result = dixLookupResourceByType((pointer *)&win, stuff->id,
+				     XRT_WINDOW, client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
     FOR_NSCREENS_FORWARD(j) {
 	stuff->id = win->info[j].id;
@@ -386,14 +401,15 @@ int PanoramiXMapSubwindows(ClientPtr client)
 int PanoramiXUnmapWindow(ClientPtr client)
 {
     PanoramiXRes *win;
-    int         result = 0, j;
+    int         result, j;
     REQUEST(xResourceReq);
 
     REQUEST_SIZE_MATCH(xResourceReq);
 
-    if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->id, XRT_WINDOW, DixReadAccess)))
-	return BadWindow;
+    result = dixLookupResourceByType((pointer *)&win, stuff->id,
+				     XRT_WINDOW, client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
     FOR_NSCREENS_FORWARD(j) {
 	stuff->id = win->info[j].id;
@@ -408,14 +424,15 @@ int PanoramiXUnmapWindow(ClientPtr client)
 int PanoramiXUnmapSubwindows(ClientPtr client)
 {
     PanoramiXRes *win;
-    int         result = 0, j;
+    int         result, j;
     REQUEST(xResourceReq);
 
     REQUEST_SIZE_MATCH(xResourceReq);
 
-    if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->id, XRT_WINDOW, DixReadAccess)))
-	return BadWindow;
+    result = dixLookupResourceByType((pointer *)&win, stuff->id,
+				     XRT_WINDOW, client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
     FOR_NSCREENS_FORWARD(j) {
 	stuff->id = win->info[j].id;
@@ -432,7 +449,7 @@ int PanoramiXConfigureWindow(ClientPtr client)
     PanoramiXRes *win;
     PanoramiXRes *sib = NULL;
     WindowPtr   pWin;
-    int         result = 0, j, len, sib_offset = 0, x = 0, y = 0;
+    int         result, j, len, sib_offset = 0, x = 0, y = 0;
     int		x_offset = -1;
     int		y_offset = -1;
     REQUEST(xConfigureWindowReq);
@@ -444,21 +461,24 @@ int PanoramiXConfigureWindow(ClientPtr client)
         return BadLength;
 
     /* because we need the parent */
-    if (!(pWin = (WindowPtr)SecurityLookupIDByType(
-		client, stuff->window, RT_WINDOW, DixWriteAccess)))
-        return BadWindow;
+    result = dixLookupResourceByType((pointer *)&pWin, stuff->window,
+				     RT_WINDOW, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
-    if (!(win = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->window, XRT_WINDOW, DixWriteAccess)))
-        return BadWindow;
+    result = dixLookupResourceByType((pointer *)&win, stuff->window,
+				     XRT_WINDOW, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
     if ((Mask)stuff->mask & CWSibling) {
 	XID tmp;
 	sib_offset = Ones((Mask)stuff->mask & (CWSibling - 1));
 	if ((tmp = *((CARD32 *) &stuff[1] + sib_offset))) {
-	   if(!(sib = (PanoramiXRes*) SecurityLookupIDByType(
-		client, tmp, XRT_WINDOW, DixReadAccess)))
-	      return BadWindow;
+	    result = dixLookupResourceByType((pointer *)&sib, tmp, XRT_WINDOW,
+					     client, DixReadAccess);
+	    if (result != Success)
+		return (result == BadValue) ? BadWindow : result;
 	}
     }
 
@@ -496,14 +516,15 @@ int PanoramiXConfigureWindow(ClientPtr client)
 int PanoramiXCirculateWindow(ClientPtr client)
 {
     PanoramiXRes *win;
-    int         result = 0, j;
+    int         result, j;
     REQUEST(xCirculateWindowReq);
 
     REQUEST_SIZE_MATCH(xCirculateWindowReq);
 
-    if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->window, XRT_WINDOW, DixWriteAccess)))
-	return BadWindow;
+    result = dixLookupResourceByType((pointer *)&win, stuff->window,
+				     XRT_WINDOW, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
     FOR_NSCREENS_FORWARD(j) {
 	stuff->window = win->info[j].id;
@@ -634,15 +655,16 @@ int PanoramiXTranslateCoords(ClientPtr client)
 int PanoramiXCreatePixmap(ClientPtr client)
 {
     PanoramiXRes *refDraw, *newPix;
-    int result = 0, j;
+    int result, j;
     REQUEST(xCreatePixmapReq);
 
     REQUEST_SIZE_MATCH(xCreatePixmapReq);
     client->errorValue = stuff->pid;
 
-    if(!(refDraw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixReadAccess)))
-	return BadDrawable;
+    result = dixLookupResourceByClass((pointer *)&refDraw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
     if(!(newPix = xalloc(sizeof(PanoramiXRes))))
 	return BadAlloc;
@@ -672,16 +694,17 @@ int PanoramiXCreatePixmap(ClientPtr client)
 int PanoramiXFreePixmap(ClientPtr client)
 {
     PanoramiXRes *pix;
-    int         result = 0, j;
+    int         result, j;
     REQUEST(xResourceReq);
 
     REQUEST_SIZE_MATCH(xResourceReq);
 
     client->errorValue = stuff->id;
 
-    if(!(pix = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->id, XRT_PIXMAP, DixDestroyAccess)))
-	return BadPixmap;
+    result = dixLookupResourceByType((pointer *)&pix, stuff->id, XRT_PIXMAP,
+				     client, DixDestroyAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadPixmap : result;
 
     FOR_NSCREENS_BACKWARD(j) {
 	stuff->id = pix->info[j].id;
@@ -705,7 +728,7 @@ int PanoramiXCreateGC(ClientPtr client)
     PanoramiXRes *clip = NULL;
     REQUEST(xCreateGCReq);
     int tile_offset = 0, stip_offset = 0, clip_offset = 0;
-    int result = 0, len, j;
+    int result, len, j;
     XID tmp;
 
     REQUEST_AT_LEAST_SIZE(xCreateGCReq);
@@ -715,32 +738,36 @@ int PanoramiXCreateGC(ClientPtr client)
     if (Ones(stuff->mask) != len)
         return BadLength;
 
-    if (!(refDraw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixReadAccess)))
-        return BadDrawable;
+    result = dixLookupResourceByClass((pointer *)&refDraw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
     if ((Mask)stuff->mask & GCTile) {
 	tile_offset = Ones((Mask)stuff->mask & (GCTile - 1));
 	if ((tmp = *((CARD32 *) &stuff[1] + tile_offset))) {
-	   if(!(tile = (PanoramiXRes*) SecurityLookupIDByType(
-		client, tmp, XRT_PIXMAP, DixReadAccess)))
-	      return BadPixmap;
+	    result = dixLookupResourceByType((pointer *)&tile, tmp, XRT_PIXMAP,
+					     client, DixReadAccess);
+	    if (result != Success)
+		return (result == BadValue) ? BadPixmap : result;
 	}
     }
     if ((Mask)stuff->mask & GCStipple) {
 	stip_offset = Ones((Mask)stuff->mask & (GCStipple - 1));
 	if ((tmp = *((CARD32 *) &stuff[1] + stip_offset))) {
-	   if(!(stip = (PanoramiXRes*) SecurityLookupIDByType(
-		client, tmp, XRT_PIXMAP, DixReadAccess)))
-	      return BadPixmap;
+	    result = dixLookupResourceByType((pointer *)&stip, tmp, XRT_PIXMAP,
+					     client, DixReadAccess);
+	    if (result != Success)
+		return (result == BadValue) ? BadPixmap : result;
 	}
     }
     if ((Mask)stuff->mask & GCClipMask) {
 	clip_offset = Ones((Mask)stuff->mask & (GCClipMask - 1));
 	if ((tmp = *((CARD32 *) &stuff[1] + clip_offset))) {
-	   if(!(clip = (PanoramiXRes*) SecurityLookupIDByType(
-		client, tmp, XRT_PIXMAP, DixReadAccess)))
-	      return BadPixmap;
+	    result = dixLookupResourceByType((pointer *)&clip, tmp, XRT_PIXMAP,
+					     client, DixReadAccess);
+	    if (result != Success)
+		return (result == BadValue) ? BadPixmap : result;
 	}
     }
 
@@ -781,7 +808,7 @@ int PanoramiXChangeGC(ClientPtr client)
     PanoramiXRes *clip = NULL;
     REQUEST(xChangeGCReq);
     int tile_offset = 0, stip_offset = 0, clip_offset = 0;
-    int result = 0, len, j;
+    int result, len, j;
     XID tmp;
 
     REQUEST_AT_LEAST_SIZE(xChangeGCReq);
@@ -790,32 +817,36 @@ int PanoramiXChangeGC(ClientPtr client)
     if (Ones(stuff->mask) != len)
         return BadLength;
 
-    if (!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->gc, XRT_GC, DixReadAccess)))
-        return BadGC;
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+				     client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     if ((Mask)stuff->mask & GCTile) {
 	tile_offset = Ones((Mask)stuff->mask & (GCTile - 1));
 	if ((tmp = *((CARD32 *) &stuff[1] + tile_offset))) {
-	   if(!(tile = (PanoramiXRes*) SecurityLookupIDByType(
-		client, tmp, XRT_PIXMAP, DixReadAccess)))
-	      return BadPixmap;
+	    result = dixLookupResourceByType((pointer *)&tile, tmp, XRT_PIXMAP,
+					     client, DixReadAccess);
+	    if (result != Success)
+		return (result == BadValue) ? BadPixmap : result;
 	}
     }
     if ((Mask)stuff->mask & GCStipple) {
 	stip_offset = Ones((Mask)stuff->mask & (GCStipple - 1));
 	if ((tmp = *((CARD32 *) &stuff[1] + stip_offset))) {
-	   if(!(stip = (PanoramiXRes*) SecurityLookupIDByType(
-		client, tmp, XRT_PIXMAP, DixReadAccess)))
-	      return BadPixmap;
+	    result = dixLookupResourceByType((pointer *)&stip, tmp, XRT_PIXMAP,
+					     client, DixReadAccess);
+	    if (result != Success)
+		return (result == BadValue) ? BadPixmap : result;
 	}
     }
     if ((Mask)stuff->mask & GCClipMask) {
 	clip_offset = Ones((Mask)stuff->mask & (GCClipMask - 1));
 	if ((tmp = *((CARD32 *) &stuff[1] + clip_offset))) {
-	   if(!(clip = (PanoramiXRes*) SecurityLookupIDByType(
-		client, tmp, XRT_PIXMAP, DixReadAccess)))
-	      return BadPixmap;
+	    result = dixLookupResourceByType((pointer *)&clip, tmp, XRT_PIXMAP,
+					     client, DixReadAccess);
+	    if (result != Success)
+		return (result == BadValue) ? BadPixmap : result;
 	}
     }
 
@@ -839,18 +870,20 @@ int PanoramiXChangeGC(ClientPtr client)
 int PanoramiXCopyGC(ClientPtr client)
 {
     PanoramiXRes *srcGC, *dstGC;
-    int         result = 0, j;
+    int         result, j;
     REQUEST(xCopyGCReq);
 
     REQUEST_SIZE_MATCH(xCopyGCReq);
 
-    if(!(srcGC = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->srcGC, XRT_GC, DixReadAccess)))
-	return BadGC;
+    result = dixLookupResourceByType((pointer *)&srcGC, stuff->srcGC, XRT_GC,
+				     client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
-    if(!(dstGC = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->dstGC, XRT_GC, DixWriteAccess)))
-	return BadGC;
+    result = dixLookupResourceByType((pointer *)&dstGC, stuff->dstGC, XRT_GC,
+				     client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     FOR_NSCREENS(j) {
 	stuff->srcGC = srcGC->info[j].id;
@@ -866,14 +899,15 @@ int PanoramiXCopyGC(ClientPtr client)
 int PanoramiXSetDashes(ClientPtr client)
 {
     PanoramiXRes *gc;
-    int         result = 0, j;
+    int         result, j;
     REQUEST(xSetDashesReq);
 
     REQUEST_FIXED_SIZE(xSetDashesReq, stuff->nDashes);
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->gc, XRT_GC, DixWriteAccess)))
-	return BadGC;
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+				     client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     FOR_NSCREENS_BACKWARD(j) {
 	stuff->gc = gc->info[j].id;
@@ -888,14 +922,15 @@ int PanoramiXSetDashes(ClientPtr client)
 int PanoramiXSetClipRectangles(ClientPtr client)
 {
     PanoramiXRes *gc;
-    int         result = 0, j;
+    int         result, j;
     REQUEST(xSetClipRectanglesReq);
 
     REQUEST_AT_LEAST_SIZE(xSetClipRectanglesReq);
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->gc, XRT_GC, DixWriteAccess)))
-	return BadGC;
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+				     client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     FOR_NSCREENS_BACKWARD(j) {
 	stuff->gc = gc->info[j].id;
@@ -910,14 +945,15 @@ int PanoramiXSetClipRectangles(ClientPtr client)
 int PanoramiXFreeGC(ClientPtr client)
 {
     PanoramiXRes *gc;
-    int         result = 0, j;
+    int         result, j;
     REQUEST(xResourceReq);
 
     REQUEST_SIZE_MATCH(xResourceReq);
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->id, XRT_GC, DixDestroyAccess)))
-	return BadGC;
+    result = dixLookupResourceByType((pointer *)&gc, stuff->id, XRT_GC,
+				     client, DixDestroyAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     FOR_NSCREENS_BACKWARD(j) {
 	stuff->id = gc->info[j].id;
@@ -935,15 +971,16 @@ int PanoramiXFreeGC(ClientPtr client)
 int PanoramiXClearToBackground(ClientPtr client)
 {
     PanoramiXRes *win;
-    int         result = 0, j, x, y;
+    int         result, j, x, y;
     Bool	isRoot;
     REQUEST(xClearAreaReq);
 
     REQUEST_SIZE_MATCH(xClearAreaReq);
 
-    if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->window, XRT_WINDOW, DixWriteAccess)))
-	return BadWindow;
+    result = dixLookupResourceByType((pointer *)&win, stuff->window,
+				     XRT_WINDOW, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
     x = stuff->x;
     y = stuff->y;
@@ -974,7 +1011,7 @@ int PanoramiXClearToBackground(ClientPtr client)
 
 int PanoramiXCopyArea(ClientPtr client)
 {
-    int			j, result = 0, srcx, srcy, dstx, dsty;
+    int			j, result, srcx, srcy, dstx, dsty;
     PanoramiXRes	*gc, *src, *dst;
     Bool		srcIsRoot = FALSE;
     Bool		dstIsRoot = FALSE;
@@ -983,24 +1020,27 @@ int PanoramiXCopyArea(ClientPtr client)
 
     REQUEST_SIZE_MATCH(xCopyAreaReq);
 
-    if(!(src = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->srcDrawable, XRC_DRAWABLE, DixReadAccess)))
-	return BadDrawable;
+    result = dixLookupResourceByClass((pointer *)&src, stuff->srcDrawable,
+				      XRC_DRAWABLE, client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
     srcShared = IS_SHARED_PIXMAP(src);
 
-    if(!(dst = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->dstDrawable, XRC_DRAWABLE, DixWriteAccess)))
-	return BadDrawable;
+    result = dixLookupResourceByClass((pointer *)&dst, stuff->dstDrawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
     dstShared = IS_SHARED_PIXMAP(dst);
 
     if(dstShared && srcShared)
 	return (* SavedProcVector[X_CopyArea])(client);
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->gc, XRT_GC, DixReadAccess)))
-	return BadGC;
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+				     client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     if((dst->type == XRT_WINDOW) && dst->u.win.root)
 	dstIsRoot = TRUE;
@@ -1139,24 +1179,27 @@ int PanoramiXCopyPlane(ClientPtr client)
 
     REQUEST_SIZE_MATCH(xCopyPlaneReq);
 
-    if(!(src = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->srcDrawable, XRC_DRAWABLE, DixReadAccess)))
-	return BadDrawable;    
+    rc = dixLookupResourceByClass((pointer *)&src, stuff->srcDrawable,
+				  XRC_DRAWABLE, client, DixReadAccess);
+    if (rc != Success)
+	return (rc == BadValue) ? BadDrawable : rc;
 
     srcShared = IS_SHARED_PIXMAP(src);
 
-    if(!(dst = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->dstDrawable, XRC_DRAWABLE, DixWriteAccess)))
-	return BadDrawable;
+    rc = dixLookupResourceByClass((pointer *)&dst, stuff->dstDrawable,
+				  XRC_DRAWABLE, client, DixWriteAccess);
+    if (rc != Success)
+	return (rc == BadValue) ? BadDrawable : rc;
 
     dstShared = IS_SHARED_PIXMAP(dst);
 
     if(dstShared && srcShared)
 	return (* SavedProcVector[X_CopyPlane])(client);
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->gc, XRT_GC, DixReadAccess)))
-	return BadGC;
+    rc = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+				 client, DixReadAccess);
+    if (rc != Success)
+	return (rc == BadValue) ? BadGC : rc;
 
     if((dst->type == XRT_WINDOW) && dst->u.win.root)
 	dstIsRoot = TRUE;
@@ -1235,23 +1278,25 @@ int PanoramiXCopyPlane(ClientPtr client)
 int PanoramiXPolyPoint(ClientPtr client)
 {
     PanoramiXRes *gc, *draw;
-    int 	  result = 0, npoint, j;
+    int 	  result, npoint, j;
     xPoint 	  *origPts;
     Bool	  isRoot;
     REQUEST(xPolyPointReq);
 
     REQUEST_AT_LEAST_SIZE(xPolyPointReq);
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-	return BadDrawable;
+    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
     if(IS_SHARED_PIXMAP(draw))
 	return (*SavedProcVector[X_PolyPoint])(client);
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->gc, XRT_GC, DixReadAccess)))
-	return BadGC;    
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+				     client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
     npoint = ((client->req_len << 2) - sizeof(xPolyPointReq)) >> 2;
@@ -1293,23 +1338,25 @@ int PanoramiXPolyPoint(ClientPtr client)
 int PanoramiXPolyLine(ClientPtr client)
 {
     PanoramiXRes *gc, *draw;
-    int 	  result = 0, npoint, j;
+    int 	  result, npoint, j;
     xPoint 	  *origPts;
     Bool	  isRoot;
     REQUEST(xPolyLineReq);
 
     REQUEST_AT_LEAST_SIZE(xPolyLineReq);
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-	return BadDrawable;    
+    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
     if(IS_SHARED_PIXMAP(draw))
 	return (*SavedProcVector[X_PolyLine])(client);
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->gc, XRT_GC, DixReadAccess)))
-	return BadGC;    
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+				     client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
     npoint = ((client->req_len << 2) - sizeof(xPolyLineReq)) >> 2;
@@ -1350,7 +1397,7 @@ int PanoramiXPolyLine(ClientPtr client)
 
 int PanoramiXPolySegment(ClientPtr client)
 {
-    int		  result = 0, nsegs, i, j;
+    int		  result, nsegs, i, j;
     PanoramiXRes *gc, *draw;
     xSegment 	  *origSegs;
     Bool	  isRoot;
@@ -1358,16 +1405,18 @@ int PanoramiXPolySegment(ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xPolySegmentReq);
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-	return BadDrawable;    
+    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
     if(IS_SHARED_PIXMAP(draw))
 	return (*SavedProcVector[X_PolySegment])(client);
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->gc, XRT_GC, DixReadAccess)))
-	return BadGC;    
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+				     client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1411,7 +1460,7 @@ int PanoramiXPolySegment(ClientPtr client)
 
 int PanoramiXPolyRectangle(ClientPtr client)
 {
-    int 	  result = 0, nrects, i, j;
+    int 	  result, nrects, i, j;
     PanoramiXRes *gc, *draw;
     Bool	  isRoot;
     xRectangle 	  *origRecs;
@@ -1419,17 +1468,18 @@ int PanoramiXPolyRectangle(ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xPolyRectangleReq);
 
-
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-	return BadDrawable;
+    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
     if(IS_SHARED_PIXMAP(draw))
 	return (*SavedProcVector[X_PolyRectangle])(client);
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->gc, XRT_GC, DixReadAccess)))
-	return BadGC;    
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+				     client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1472,7 +1522,7 @@ int PanoramiXPolyRectangle(ClientPtr client)
 
 int PanoramiXPolyArc(ClientPtr client)
 {
-    int 	  result = 0, narcs, i, j;
+    int 	  result, narcs, i, j;
     PanoramiXRes *gc, *draw;
     Bool	  isRoot;
     xArc	  *origArcs;
@@ -1480,16 +1530,18 @@ int PanoramiXPolyArc(ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xPolyArcReq);
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-	return BadDrawable;    
+    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
     if(IS_SHARED_PIXMAP(draw))
 	return (*SavedProcVector[X_PolyArc])(client);
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->gc, XRT_GC, DixReadAccess)))
-	return BadGC;    
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+				     client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1530,7 +1582,7 @@ int PanoramiXPolyArc(ClientPtr client)
 
 int PanoramiXFillPoly(ClientPtr client)
 {
-    int 	  result = 0, count, j;
+    int 	  result, count, j;
     PanoramiXRes *gc, *draw;
     Bool	  isRoot;
     DDXPointPtr	  locPts;
@@ -1538,16 +1590,18 @@ int PanoramiXFillPoly(ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xFillPolyReq);
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-	return BadDrawable;    
+    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
     if(IS_SHARED_PIXMAP(draw))
 	return (*SavedProcVector[X_FillPoly])(client);
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->gc, XRT_GC, DixReadAccess)))
-	return BadGC;    
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+				     client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1589,7 +1643,7 @@ int PanoramiXFillPoly(ClientPtr client)
 
 int PanoramiXPolyFillRectangle(ClientPtr client)
 {
-    int 	  result = 0, things, i, j;
+    int 	  result, things, i, j;
     PanoramiXRes *gc, *draw;
     Bool	  isRoot;
     xRectangle	  *origRects;
@@ -1597,16 +1651,18 @@ int PanoramiXPolyFillRectangle(ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xPolyFillRectangleReq);
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-	return BadDrawable;    
+    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
     if(IS_SHARED_PIXMAP(draw))
 	return (*SavedProcVector[X_PolyFillRectangle])(client);
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->gc, XRT_GC, DixReadAccess)))
-	return BadGC;    
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+				     client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1650,22 +1706,24 @@ int PanoramiXPolyFillArc(ClientPtr client)
 {
     PanoramiXRes *gc, *draw;
     Bool	  isRoot;
-    int 	  result = 0, narcs, i, j;
+    int 	  result, narcs, i, j;
     xArc	  *origArcs;
     REQUEST(xPolyFillArcReq);
 
     REQUEST_AT_LEAST_SIZE(xPolyFillArcReq);
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-	return BadDrawable;    
+    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
     if(IS_SHARED_PIXMAP(draw))
 	return (*SavedProcVector[X_PolyFillArc])(client);
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->gc, XRT_GC, DixReadAccess)))
-	return BadGC;    
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+				     client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1709,21 +1767,23 @@ int PanoramiXPutImage(ClientPtr client)
 {
     PanoramiXRes *gc, *draw;
     Bool	  isRoot;
-    int		  j, result = 0, orig_x, orig_y;
+    int		  j, result, orig_x, orig_y;
     REQUEST(xPutImageReq);
 
     REQUEST_AT_LEAST_SIZE(xPutImageReq);
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-	return BadDrawable;    
+    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
     if(IS_SHARED_PIXMAP(draw))
 	return (*SavedProcVector[X_PutImage])(client);
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->gc, XRT_GC, DixReadAccess)))
-	return BadGC;    
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+				     client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1765,9 +1825,10 @@ int PanoramiXGetImage(ClientPtr client)
         return(BadValue);
     }
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-	return BadDrawable;
+    rc = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				  XRC_DRAWABLE, client, DixWriteAccess);
+    if (rc != Success)
+	return (rc == BadValue) ? BadDrawable : rc;
 
     if(draw->type == XRT_PIXMAP)
 	return (*SavedProcVector[X_GetImage])(client);
@@ -1906,22 +1967,24 @@ PanoramiXPolyText8(ClientPtr client)
 {
     PanoramiXRes *gc, *draw;
     Bool	  isRoot;
-    int 	  result = 0, j;
+    int 	  result, j;
     int	 	  orig_x, orig_y;
     REQUEST(xPolyTextReq);
 
     REQUEST_AT_LEAST_SIZE(xPolyTextReq);
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-	return BadDrawable;    
+    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
     if(IS_SHARED_PIXMAP(draw))
 	return (*SavedProcVector[X_PolyText8])(client);
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->gc, XRT_GC, DixReadAccess)))
-	return BadGC;    
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+				     client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1945,22 +2008,24 @@ PanoramiXPolyText16(ClientPtr client)
 {
     PanoramiXRes *gc, *draw;
     Bool	  isRoot;
-    int 	  result = 0, j;
+    int 	  result, j;
     int	 	  orig_x, orig_y;
     REQUEST(xPolyTextReq);
 
     REQUEST_AT_LEAST_SIZE(xPolyTextReq);
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-	return BadDrawable;    
+    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
     if(IS_SHARED_PIXMAP(draw))
 	return (*SavedProcVector[X_PolyText16])(client);
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->gc, XRT_GC, DixReadAccess)))
-	return BadGC;    
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+				     client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1982,7 +2047,7 @@ PanoramiXPolyText16(ClientPtr client)
 
 int PanoramiXImageText8(ClientPtr client)
 {
-    int 	  result = 0, j;
+    int 	  result, j;
     PanoramiXRes *gc, *draw;
     Bool	  isRoot;
     int		  orig_x, orig_y;
@@ -1990,16 +2055,18 @@ int PanoramiXImageText8(ClientPtr client)
 
     REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars);
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-	return BadDrawable;    
+    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
     if(IS_SHARED_PIXMAP(draw))
 	return (*SavedProcVector[X_ImageText8])(client);
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->gc, XRT_GC, DixReadAccess)))
-	return BadGC;    
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+				     client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -2021,7 +2088,7 @@ int PanoramiXImageText8(ClientPtr client)
 
 int PanoramiXImageText16(ClientPtr client)
 {
-    int 	  result = 0, j;
+    int 	  result, j;
     PanoramiXRes *gc, *draw;
     Bool	  isRoot;
     int		  orig_x, orig_y;
@@ -2029,16 +2096,18 @@ int PanoramiXImageText16(ClientPtr client)
 
     REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars << 1);
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-	return BadDrawable;    
+    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
     if(IS_SHARED_PIXMAP(draw))
 	return (*SavedProcVector[X_ImageText16])(client);
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->gc, XRT_GC, DixReadAccess)))
-	return BadGC;    
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
+				     client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadGC : result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -2062,14 +2131,15 @@ int PanoramiXImageText16(ClientPtr client)
 int PanoramiXCreateColormap(ClientPtr client)
 {
     PanoramiXRes	*win, *newCmap;
-    int 		result = 0, j, orig_visual;
+    int 		result, j, orig_visual;
     REQUEST(xCreateColormapReq);
 
     REQUEST_SIZE_MATCH(xCreateColormapReq);
 
-    if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->window, XRT_WINDOW, DixReadAccess)))
-	return BadWindow;    
+    result = dixLookupResourceByType((pointer *)&win, stuff->window,
+				     XRT_WINDOW, client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
     if(!(newCmap = xalloc(sizeof(PanoramiXRes))))
         return BadAlloc;
@@ -2100,16 +2170,17 @@ int PanoramiXCreateColormap(ClientPtr client)
 int PanoramiXFreeColormap(ClientPtr client)
 {
     PanoramiXRes *cmap;
-    int          result = 0, j;
+    int          result, j;
     REQUEST(xResourceReq);
 
     REQUEST_SIZE_MATCH(xResourceReq);
 
     client->errorValue = stuff->id;
 
-    if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->id, XRT_COLORMAP, DixDestroyAccess)))
-        return BadColor;
+    result = dixLookupResourceByType((pointer *)&cmap, stuff->id, XRT_COLORMAP,
+				     client, DixDestroyAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadColor : result;
 
     FOR_NSCREENS_BACKWARD(j) {
         stuff->id = cmap->info[j].id;
@@ -2128,17 +2199,18 @@ int
 PanoramiXCopyColormapAndFree(ClientPtr client)
 {
     PanoramiXRes *cmap, *newCmap;
-    int          result = 0, j;
+    int          result, j;
     REQUEST(xCopyColormapAndFreeReq);
 
     REQUEST_SIZE_MATCH(xCopyColormapAndFreeReq);
 
     client->errorValue = stuff->srcCmap;
 
-    if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->srcCmap, XRT_COLORMAP, 
-		DixReadAccess | DixWriteAccess)))
-        return BadColor;
+    result = dixLookupResourceByType((pointer *)&cmap, stuff->srcCmap,
+				     XRT_COLORMAP, client,
+				     DixReadAccess | DixWriteAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadColor : result;
 
     if(!(newCmap = xalloc(sizeof(PanoramiXRes))))
         return BadAlloc;
@@ -2167,16 +2239,17 @@ PanoramiXCopyColormapAndFree(ClientPtr client)
 int PanoramiXInstallColormap(ClientPtr client)
 {
     REQUEST(xResourceReq);
-    int 	result = 0, j;
+    int 	result, j;
     PanoramiXRes *cmap;
 
     REQUEST_SIZE_MATCH(xResourceReq);
 
     client->errorValue = stuff->id;
 
-    if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->id, XRT_COLORMAP, DixReadAccess)))
-        return BadColor;
+    result = dixLookupResourceByType((pointer *)&cmap, stuff->id, XRT_COLORMAP,
+				     client, DixReadAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadColor : result;
 
     FOR_NSCREENS_BACKWARD(j){
 	stuff->id = cmap->info[j].id;
@@ -2190,16 +2263,17 @@ int PanoramiXInstallColormap(ClientPtr client)
 int PanoramiXUninstallColormap(ClientPtr client)
 {
     REQUEST(xResourceReq);
-    int 	result = 0, j;
+    int 	result, j;
     PanoramiXRes *cmap;
 
     REQUEST_SIZE_MATCH(xResourceReq);
  
     client->errorValue = stuff->id;
 
-    if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->id, XRT_COLORMAP, DixReadAccess)))
-        return BadColor;
+    result = dixLookupResourceByType((pointer *)&cmap, stuff->id, XRT_COLORMAP,
+				     client, DixReadAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadColor : result;
 
     FOR_NSCREENS_BACKWARD(j) {
 	stuff->id = cmap->info[j].id;
@@ -2212,7 +2286,7 @@ int PanoramiXUninstallColormap(ClientPtr client)
 
 int PanoramiXAllocColor(ClientPtr client)
 {
-    int           result = 0, j;
+    int           result, j;
     PanoramiXRes *cmap;
     REQUEST(xAllocColorReq);
 
@@ -2220,9 +2294,10 @@ int PanoramiXAllocColor(ClientPtr client)
 
     client->errorValue = stuff->cmap;
 
-    if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->cmap, XRT_COLORMAP, DixWriteAccess)))
-	return BadColor;
+    result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
+				     XRT_COLORMAP, client, DixWriteAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadColor : result;
 
     FOR_NSCREENS_BACKWARD(j){
 	stuff->cmap = cmap->info[j].id;
@@ -2235,7 +2310,7 @@ int PanoramiXAllocColor(ClientPtr client)
 
 int PanoramiXAllocNamedColor(ClientPtr client)
 {
-    int           result = 0, j;
+    int           result, j;
     PanoramiXRes  *cmap;
     REQUEST(xAllocNamedColorReq);
 
@@ -2243,9 +2318,10 @@ int PanoramiXAllocNamedColor(ClientPtr client)
 
     client->errorValue = stuff->cmap;
 
-    if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->cmap, XRT_COLORMAP, DixWriteAccess)))
-        return BadColor;
+    result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
+				     XRT_COLORMAP, client, DixWriteAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadColor : result;
 
     FOR_NSCREENS_BACKWARD(j){
         stuff->cmap = cmap->info[j].id;
@@ -2258,7 +2334,7 @@ int PanoramiXAllocNamedColor(ClientPtr client)
 
 int PanoramiXAllocColorCells(ClientPtr client)
 {
-    int           result = 0, j;
+    int           result, j;
     PanoramiXRes  *cmap;
     REQUEST(xAllocColorCellsReq);
 
@@ -2266,9 +2342,10 @@ int PanoramiXAllocColorCells(ClientPtr client)
 
     client->errorValue = stuff->cmap;
 
-    if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->cmap, XRT_COLORMAP, DixWriteAccess)))
-	return BadColor;
+    result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
+				     XRT_COLORMAP, client, DixWriteAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadColor : result;
 	
     FOR_NSCREENS_BACKWARD(j){
 	stuff->cmap = cmap->info[j].id;
@@ -2281,7 +2358,7 @@ int PanoramiXAllocColorCells(ClientPtr client)
 
 int PanoramiXAllocColorPlanes(ClientPtr client)
 {
-    int           result = 0, j;
+    int           result, j;
     PanoramiXRes  *cmap;
     REQUEST(xAllocColorPlanesReq);
 
@@ -2289,9 +2366,10 @@ int PanoramiXAllocColorPlanes(ClientPtr client)
 
     client->errorValue = stuff->cmap;
 
-    if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->cmap, XRT_COLORMAP, DixWriteAccess)))
-	return BadColor;
+    result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
+				     XRT_COLORMAP, client, DixWriteAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadColor : result;
 	
     FOR_NSCREENS_BACKWARD(j){
 	stuff->cmap = cmap->info[j].id;
@@ -2305,7 +2383,7 @@ int PanoramiXAllocColorPlanes(ClientPtr client)
 
 int PanoramiXFreeColors(ClientPtr client)
 {
-    int           result = 0, j;
+    int           result, j;
     PanoramiXRes  *cmap;
     REQUEST(xFreeColorsReq);
 
@@ -2313,9 +2391,10 @@ int PanoramiXFreeColors(ClientPtr client)
 
     client->errorValue = stuff->cmap;
 
-    if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->cmap, XRT_COLORMAP, DixWriteAccess)))
-        return BadColor;
+    result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
+				     XRT_COLORMAP, client, DixWriteAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadColor : result;
 
     FOR_NSCREENS_BACKWARD(j) {
         stuff->cmap = cmap->info[j].id;
@@ -2327,7 +2406,7 @@ int PanoramiXFreeColors(ClientPtr client)
 
 int PanoramiXStoreColors(ClientPtr client)
 {
-    int           result = 0, j;
+    int           result, j;
     PanoramiXRes  *cmap;
     REQUEST(xStoreColorsReq);
 
@@ -2335,9 +2414,10 @@ int PanoramiXStoreColors(ClientPtr client)
 
     client->errorValue = stuff->cmap;
 
-    if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->cmap, XRT_COLORMAP, DixWriteAccess)))
-        return BadColor;
+    result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
+				     XRT_COLORMAP, client, DixWriteAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadColor : result;
 
     FOR_NSCREENS_BACKWARD(j){
 	stuff->cmap = cmap->info[j].id;
@@ -2350,7 +2430,7 @@ int PanoramiXStoreColors(ClientPtr client)
 
 int PanoramiXStoreNamedColor(ClientPtr client)
 {
-    int           result = 0, j;
+    int           result, j;
     PanoramiXRes  *cmap;
     REQUEST(xStoreNamedColorReq);
 
@@ -2358,9 +2438,10 @@ int PanoramiXStoreNamedColor(ClientPtr client)
 
     client->errorValue = stuff->cmap;
 
-    if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->cmap, XRT_COLORMAP, DixWriteAccess)))
-        return BadColor;
+    result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
+				     XRT_COLORMAP, client, DixWriteAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadColor : result;
 
     FOR_NSCREENS_BACKWARD(j){
 	stuff->cmap = cmap->info[j].id;
diff --git a/Xext/saver.c b/Xext/saver.c
index 357c215..b59f769 100644
--- a/Xext/saver.c
+++ b/Xext/saver.c
@@ -533,11 +533,14 @@ UninstallSaverColormap (ScreenPtr pScreen)
 {
     SetupScreen(pScreen);
     ColormapPtr			pCmap;
+    int rc;
 
     if (pPriv && pPriv->installedMap != None)
     {
-	pCmap = (ColormapPtr) LookupIDByType (pPriv->installedMap, RT_COLORMAP);
-	if (pCmap)
+	rc = dixLookupResourceByType((pointer *)&pCmap, pPriv->installedMap,
+				     RT_COLORMAP, serverClient,
+				     DixUninstallAccess);
+	if (rc == Success)
 	    (*pCmap->pScreen->UninstallColormap) (pCmap);
 	pPriv->installedMap = None;
 	CheckScreenPrivate (pScreen);
@@ -651,8 +654,9 @@ CreateSaverWindow (ScreenPtr pScreen)
     if (i < numInstalled)
 	return TRUE;
 
-    pCmap = (ColormapPtr) LookupIDByType (wantMap, RT_COLORMAP);
-    if (!pCmap)
+    result = dixLookupResourceByType((pointer *)&pCmap, wantMap, RT_COLORMAP,
+				     serverClient, DixInstallAccess);
+    if (result != Success)
 	return TRUE;
 
     pPriv->installedMap = wantMap;
@@ -1252,15 +1256,16 @@ ProcScreenSaverSetAttributes (ClientPtr client)
        PanoramiXRes *backPix = NULL;
        PanoramiXRes *bordPix = NULL;
        PanoramiXRes *cmap    = NULL;
-       int i, status = 0, len;
+       int i, status, len;
        int  pback_offset = 0, pbord_offset = 0, cmap_offset = 0;
        XID orig_visual, tmp;
 
        REQUEST_AT_LEAST_SIZE (xScreenSaverSetAttributesReq);
 
-       if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-                   client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-           return BadDrawable;
+       status = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+					 XRC_DRAWABLE, client, DixWriteAccess);
+       if (status != Success)
+           return (status == BadValue) ? BadDrawable : status;
 
        len = stuff->length -  (sizeof(xScreenSaverSetAttributesReq) >> 2);
        if (Ones(stuff->mask) != len)
@@ -1270,9 +1275,11 @@ ProcScreenSaverSetAttributes (ClientPtr client)
           pback_offset = Ones((Mask)stuff->mask & (CWBackPixmap - 1));
           tmp = *((CARD32 *) &stuff[1] + pback_offset);
           if ((tmp != None) && (tmp != ParentRelative)) {
-             if(!(backPix = (PanoramiXRes*) SecurityLookupIDByType(
-                  client, tmp, XRT_PIXMAP, DixReadAccess)))
-                return BadPixmap;
+	      status = dixLookupResourceByType((pointer *)&backPix, tmp,
+					       XRT_PIXMAP, client,
+					       DixReadAccess);
+	      if (status != Success)
+		  return (status == BadValue) ? BadPixmap : status;
           }
        }
 
@@ -1280,9 +1287,11 @@ ProcScreenSaverSetAttributes (ClientPtr client)
           pbord_offset = Ones((Mask)stuff->mask & (CWBorderPixmap - 1));
           tmp = *((CARD32 *) &stuff[1] + pbord_offset);
           if (tmp != CopyFromParent) {
-             if(!(bordPix = (PanoramiXRes*) SecurityLookupIDByType(
-                  client, tmp, XRT_PIXMAP, DixReadAccess)))
-                return BadPixmap;
+	      status = dixLookupResourceByType((pointer *)&bordPix, tmp,
+					       XRT_PIXMAP, client,
+					       DixReadAccess);
+	      if (status != Success)
+		  return (status == BadValue) ? BadPixmap : status;
           }
        }
 
@@ -1290,9 +1299,11 @@ ProcScreenSaverSetAttributes (ClientPtr client)
            cmap_offset = Ones((Mask)stuff->mask & (CWColormap - 1));
            tmp = *((CARD32 *) &stuff[1] + cmap_offset);
            if ((tmp != CopyFromParent) && (tmp != None)) {
-             if(!(cmap = (PanoramiXRes*) SecurityLookupIDByType(
-                  client, tmp, XRT_COLORMAP, DixReadAccess)))
-                 return BadColor;
+	       status = dixLookupResourceByType((pointer *)&cmap, tmp,
+						XRT_COLORMAP, client,
+						DixReadAccess);
+	       if (status != Success)
+		   return (status == BadValue) ? BadColor : status;
            }
        }
 
@@ -1327,11 +1338,12 @@ ProcScreenSaverUnsetAttributes (ClientPtr client)
     if(!noPanoramiXExtension) {
        REQUEST(xScreenSaverUnsetAttributesReq);
        PanoramiXRes *draw;
-       int i;
+       int rc, i;
 
-       if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-                   client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-           return BadDrawable;
+       rc = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				     XRC_DRAWABLE, client, DixWriteAccess);
+       if (rc != Success)
+           return (rc == BadValue) ? BadDrawable : rc;
 
        for(i = PanoramiXNumScreens - 1; i > 0; i--) {
             stuff->drawable = draw->info[i].id;
diff --git a/Xext/security.c b/Xext/security.c
index 7962fdb..bae95a3 100644
--- a/Xext/security.c
+++ b/Xext/security.c
@@ -623,13 +623,16 @@ ProcSecurityRevokeAuthorization(
 {
     REQUEST(xSecurityRevokeAuthorizationReq);
     SecurityAuthorizationPtr pAuth;
+    int rc;
 
     REQUEST_SIZE_MATCH(xSecurityRevokeAuthorizationReq);
 
-    pAuth = (SecurityAuthorizationPtr)SecurityLookupIDByType(client,
-	stuff->authId, SecurityAuthorizationResType, DixDestroyAccess);
-    if (!pAuth)
-	return SecurityErrorBase + XSecurityBadAuthorization;
+    rc = dixLookupResourceByType((pointer *)&pAuth, stuff->authId,
+				 SecurityAuthorizationResType, client,
+				 DixDestroyAccess);
+    if (rc != Success)
+	return (rc == BadValue) ?
+	    SecurityErrorBase + XSecurityBadAuthorization : rc;
 
     FreeResource(stuff->authId, RT_NONE);
     return Success;
diff --git a/Xext/shape.c b/Xext/shape.c
index 15d2c5c..5977296 100644
--- a/Xext/shape.c
+++ b/Xext/shape.c
@@ -353,13 +353,14 @@ ProcPanoramiXShapeRectangles(
 {
     REQUEST(xShapeRectanglesReq);
     PanoramiXRes	*win;
-    int        		j, result = 0;
+    int        		j, result;
 
     REQUEST_AT_LEAST_SIZE (xShapeRectanglesReq);
 
-    if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->dest, XRT_WINDOW, DixWriteAccess)))
-	return BadWindow;
+    result = dixLookupResourceByType((pointer *)&win, stuff->dest, XRT_WINDOW,
+				     client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
     FOR_NSCREENS(j) {
 	stuff->dest = win->info[j].id;
@@ -451,18 +452,20 @@ ProcPanoramiXShapeMask(
 {
     REQUEST(xShapeMaskReq);
     PanoramiXRes	*win, *pmap;
-    int 		j, result = 0;
+    int 		j, result;
 
     REQUEST_SIZE_MATCH (xShapeMaskReq);
 
-    if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->dest, XRT_WINDOW, DixWriteAccess)))
-	return BadWindow;
+    result = dixLookupResourceByType((pointer *)&win, stuff->dest, XRT_WINDOW,
+				     client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
     if(stuff->src != None) {
-	if(!(pmap = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->src, XRT_PIXMAP, DixReadAccess)))
-	    return BadPixmap;
+	result = dixLookupResourceByType((pointer *)&pmap, stuff->src,
+					 XRT_PIXMAP, client, DixReadAccess);
+	if (result != Success)
+	    return (result == BadValue) ? BadPixmap : result;
     } else
 	pmap = NULL;
 
@@ -579,17 +582,19 @@ ProcPanoramiXShapeCombine(
 {
     REQUEST(xShapeCombineReq);
     PanoramiXRes	*win, *win2;
-    int 		j, result = 0;
+    int 		j, result;
 
     REQUEST_AT_LEAST_SIZE (xShapeCombineReq);
 
-    if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->dest, XRT_WINDOW, DixWriteAccess)))
-	return BadWindow;
+    result = dixLookupResourceByType((pointer *)&win, stuff->dest, XRT_WINDOW,
+				     client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
-    if(!(win2 = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->src, XRT_WINDOW, DixReadAccess)))
-	return BadWindow;
+    result = dixLookupResourceByType((pointer *)&win2, stuff->src, XRT_WINDOW,
+				     client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
     FOR_NSCREENS(j) {
 	stuff->dest = win->info[j].id;
@@ -651,13 +656,14 @@ ProcPanoramiXShapeOffset(
 {
     REQUEST(xShapeOffsetReq);
     PanoramiXRes *win;
-    int j, result = 0;
+    int j, result;
 
     REQUEST_AT_LEAST_SIZE (xShapeOffsetReq);
    
-    if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->dest, XRT_WINDOW, DixWriteAccess)))
-	return BadWindow;
+    result = dixLookupResourceByType((pointer *)&win, stuff->dest, XRT_WINDOW,
+				     client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadWindow : result;
 
     FOR_NSCREENS(j) {
 	stuff->dest = win->info[j].id;
@@ -740,11 +746,13 @@ ShapeFreeClient (pointer data, XID id)
     ShapeEventPtr   pShapeEvent;
     WindowPtr	    pWin;
     ShapeEventPtr   *pHead, pCur, pPrev;
+    int rc;
 
     pShapeEvent = (ShapeEventPtr) data;
     pWin = pShapeEvent->window;
-    pHead = (ShapeEventPtr *) LookupIDByType(pWin->drawable.id, ShapeEventType);
-    if (pHead) {
+    rc = dixLookupResourceByType((pointer *)&pHead, pWin->drawable.id,
+				 ShapeEventType, serverClient, DixReadAccess);
+    if (rc == Success) {
 	pPrev = 0;
 	for (pCur = *pHead; pCur && pCur != pShapeEvent; pCur=pCur->next)
 	    pPrev = pCur;
@@ -789,8 +797,11 @@ ProcShapeSelectInput (ClientPtr client)
     rc = dixLookupWindow(&pWin, stuff->window, client, DixReceiveAccess);
     if (rc != Success)
 	return rc;
-    pHead = (ShapeEventPtr *)SecurityLookupIDByType(client,
-			pWin->drawable.id, ShapeEventType, DixWriteAccess);
+    rc = dixLookupResourceByType((pointer *)&pHead, pWin->drawable.id,
+				 ShapeEventType, client, DixWriteAccess);
+    if (rc != Success && rc != BadValue)
+	return rc;
+
     switch (stuff->enable) {
     case xTrue:
 	if (pHead) {
@@ -879,9 +890,11 @@ SendShapeNotify (WindowPtr pWin, int which)
     BoxRec		extents;
     RegionPtr		region;
     BYTE		shaped;
+    int rc;
 
-    pHead = (ShapeEventPtr *) LookupIDByType(pWin->drawable.id, ShapeEventType);
-    if (!pHead)
+    rc = dixLookupResourceByType((pointer *)&pHead, pWin->drawable.id,
+				 ShapeEventType, serverClient, DixReadAccess);
+    if (rc != Success)
 	return;
     switch (which) {
     case ShapeBounding:
@@ -958,8 +971,10 @@ ProcShapeInputSelected (ClientPtr client)
     rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
     if (rc != Success)
 	return rc;
-    pHead = (ShapeEventPtr *) SecurityLookupIDByType(client,
-			pWin->drawable.id, ShapeEventType, DixReadAccess);
+    rc = dixLookupResourceByType((pointer *)&pHead, pWin->drawable.id,
+				 ShapeEventType, client, DixReadAccess);
+    if (rc != Success && rc != BadValue)
+	return rc;
     enabled = xFalse;
     if (pHead) {
     	for (pShapeEvent = *pHead;
diff --git a/Xext/shm.c b/Xext/shm.c
index 1f963c1..cdda09f 100644
--- a/Xext/shm.c
+++ b/Xext/shm.c
@@ -144,12 +144,11 @@ static ShmFuncs fbFuncs = {fbShmCreatePixmap, NULL};
 
 #define VERIFY_SHMSEG(shmseg,shmdesc,client) \
 { \
-    shmdesc = (ShmDescPtr)LookupIDByType(shmseg, ShmSegType); \
-    if (!shmdesc) \
-    { \
-	client->errorValue = shmseg; \
-	return BadShmSegCode; \
-    } \
+    int rc; \
+    rc = dixLookupResourceByType((pointer *)&(shmdesc), shmseg, ShmSegType, \
+                                 client, DixReadAccess); \
+    if (rc != Success) \
+	return (rc == BadValue) ? BadShmSegCode : rc; \
 }
 
 #define VERIFY_SHMPTR(shmseg,offset,needwrite,shmdesc,client) \
@@ -513,20 +512,22 @@ doShmPutImage(DrawablePtr dst, GCPtr pGC,
 static int 
 ProcPanoramiXShmPutImage(ClientPtr client)
 {
-    int			 j, result = 0, orig_x, orig_y;
+    int			 j, result, orig_x, orig_y;
     PanoramiXRes	*draw, *gc;
     Bool		 sendEvent, isRoot;
 
     REQUEST(xShmPutImageReq);
     REQUEST_SIZE_MATCH(xShmPutImageReq);
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-                client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-        return BadDrawable;
+    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadDrawable : result;
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->gc, XRT_GC, DixReadAccess)))
-        return BadGC;
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
+				     XRT_GC, client, DixReadAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadGC : result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -570,9 +571,10 @@ ProcPanoramiXShmGetImage(ClientPtr client)
         return(BadValue);
     }
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-	return BadDrawable;
+    rc = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				  XRC_DRAWABLE, client, DixWriteAccess);
+    if (rc != Success)
+	return (rc == BadValue) ? BadDrawable : rc;
 
     if (draw->type == XRT_PIXMAP)
 	return ProcShmGetImage(client);
diff --git a/Xext/sync.c b/Xext/sync.c
index adb7324..d7ab63c 100644
--- a/Xext/sync.c
+++ b/Xext/sync.c
@@ -1339,16 +1339,14 @@ ProcSyncSetCounter(ClientPtr client)
     REQUEST(xSyncSetCounterReq);
     SyncCounter    *pCounter;
     CARD64	   newvalue;
+    int	rc;
 
     REQUEST_SIZE_MATCH(xSyncSetCounterReq);
 
-    pCounter = SecurityLookupIDByType(client, stuff->cid, RTCounter,
-				      DixWriteAccess);
-    if (pCounter == NULL)
-    {
-	client->errorValue = stuff->cid;
-	return SyncErrorBase + XSyncBadCounter;
-    }
+    rc = dixLookupResourceByType((pointer *)&pCounter, stuff->cid, RTCounter,
+				 client, DixWriteAccess);
+    if (rc != Success)
+	return (rc == BadValue) ? SyncErrorBase + XSyncBadCounter : rc;
 
     if (IsSystemCounter(pCounter))
     {
@@ -1371,16 +1369,14 @@ ProcSyncChangeCounter(ClientPtr client)
     SyncCounter    *pCounter;
     CARD64          newvalue;
     Bool	    overflow;
+    int	rc;
 
     REQUEST_SIZE_MATCH(xSyncChangeCounterReq);
 
-    pCounter = SecurityLookupIDByType(client, stuff->cid, RTCounter,
-				      DixWriteAccess);
-    if (pCounter == NULL)
-    {
-	client->errorValue = stuff->cid;
-	return SyncErrorBase + XSyncBadCounter;
-    }
+    rc = dixLookupResourceByType((pointer *)&pCounter, stuff->cid, RTCounter,
+				 client, DixWriteAccess);
+    if (rc != Success)
+	return (rc == BadValue) ? SyncErrorBase + XSyncBadCounter : rc;
 
     if (IsSystemCounter(pCounter))
     {
@@ -1408,16 +1404,15 @@ ProcSyncDestroyCounter(ClientPtr client)
 {
     REQUEST(xSyncDestroyCounterReq);
     SyncCounter    *pCounter;
+    int rc;
 
     REQUEST_SIZE_MATCH(xSyncDestroyCounterReq);
 
-    pCounter = SecurityLookupIDByType(client, stuff->counter, RTCounter,
-				      DixDestroyAccess);
-    if (pCounter == NULL)
-    {
-	client->errorValue = stuff->counter;
-	return SyncErrorBase + XSyncBadCounter;
-    }
+    rc = dixLookupResourceByType((pointer *)&pCounter, stuff->counter, RTCounter,
+				 client, DixDestroyAccess);
+    if (rc != Success)
+	return (rc == BadValue) ? SyncErrorBase + XSyncBadCounter : rc;
+
     if (IsSystemCounter(pCounter))
     {
 	client->errorValue = stuff->counter;
@@ -1552,16 +1547,14 @@ ProcSyncQueryCounter(ClientPtr client)
     REQUEST(xSyncQueryCounterReq);
     xSyncQueryCounterReply rep;
     SyncCounter    *pCounter;
+    int rc;
 
     REQUEST_SIZE_MATCH(xSyncQueryCounterReq);
 
-    pCounter = SecurityLookupIDByType(client, stuff->counter, RTCounter,
-				      DixReadAccess);
-    if (pCounter == NULL)
-    {
-	client->errorValue = stuff->counter;
-	return SyncErrorBase + XSyncBadCounter;
-    }
+    rc = dixLookupResourceByType((pointer *)&pCounter, stuff->counter,
+				 RTCounter, client, DixReadAccess);
+    if (rc != Success)
+	return (rc == BadValue) ? SyncErrorBase + XSyncBadCounter : rc;
 
     rep.type = X_Reply;
     rep.length = 0;
@@ -1682,12 +1675,10 @@ ProcSyncChangeAlarm(ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xSyncChangeAlarmReq);
 
-    if (!(pAlarm = SecurityLookupIDByType(client, stuff->alarm, RTAlarm,
-					  DixWriteAccess)))
-    {
-	client->errorValue = stuff->alarm;
-	return SyncErrorBase + XSyncBadAlarm;
-    }
+    status = dixLookupResourceByType((pointer *)&pAlarm, stuff->alarm, RTAlarm,
+				     client, DixWriteAccess);
+    if (status != Success)
+	return (status == BadValue) ? SyncErrorBase + XSyncBadAlarm : status;
 
     vmask = stuff->valueMask;
     len = client->req_len - (sizeof(xSyncChangeAlarmReq) >> 2);
@@ -1719,16 +1710,14 @@ ProcSyncQueryAlarm(ClientPtr client)
     SyncAlarm      *pAlarm;
     xSyncQueryAlarmReply rep;
     SyncTrigger    *pTrigger;
+    int rc;
 
     REQUEST_SIZE_MATCH(xSyncQueryAlarmReq);
 
-    pAlarm = SecurityLookupIDByType(client, stuff->alarm, RTAlarm,
-				    DixReadAccess);
-    if (!pAlarm)
-    {
-	client->errorValue = stuff->alarm;
-	return SyncErrorBase + XSyncBadAlarm;
-    }
+    rc = dixLookupResourceByType((pointer *)&pAlarm, stuff->alarm, RTAlarm,
+				 client, DixReadAccess);
+    if (rc != Success)
+	return (rc == BadValue) ? SyncErrorBase + XSyncBadAlarm : rc;
 
     rep.type = X_Reply;
     rep.length = (sizeof(xSyncQueryAlarmReply) - sizeof(xGenericReply)) >> 2;
@@ -1776,16 +1765,15 @@ ProcSyncQueryAlarm(ClientPtr client)
 static int
 ProcSyncDestroyAlarm(ClientPtr client)
 {
+    SyncAlarm *pAlarm;
+    int rc;
     REQUEST(xSyncDestroyAlarmReq);
 
     REQUEST_SIZE_MATCH(xSyncDestroyAlarmReq);
 
-    if (!(SecurityLookupIDByType(client, stuff->alarm, RTAlarm,
-				 DixDestroyAccess)))
-    {
-	client->errorValue = stuff->alarm;
-	return SyncErrorBase + XSyncBadAlarm;
-    }
+    rc = dixLookupResourceByType((pointer *)&pAlarm, stuff->alarm, RTAlarm,
+				 client, DixDestroyAccess);
+	return (rc == BadValue) ? SyncErrorBase + XSyncBadAlarm : rc;
 
     FreeResource(stuff->alarm, RT_NONE);
     return client->noClientException;
diff --git a/Xext/xf86bigfont.c b/Xext/xf86bigfont.c
index 6018966..7d4c697 100644
--- a/Xext/xf86bigfont.c
+++ b/Xext/xf86bigfont.c
@@ -427,15 +427,15 @@ ProcXF86BigfontQueryFont(
     }
 #endif
     client->errorValue = stuff->id;		/* EITHER font or gc */
-    pFont = (FontPtr)SecurityLookupIDByType(client, stuff->id, RT_FONT,
-					    DixGetAttrAccess);
+    dixLookupResourceByType((pointer *)&pFont, stuff->id, RT_FONT,
+			    client, DixGetAttrAccess);
     if (!pFont) {
-	GC *pGC = (GC *) SecurityLookupIDByType(client, stuff->id, RT_GC,
-						DixGetAttrAccess);
-        if (!pGC) {
-	    client->errorValue = stuff->id;
+	GC *pGC;
+	dixLookupResourceByType((pointer *)&pGC, stuff->id, RT_GC,
+				client, DixGetAttrAccess);
+        if (!pGC)
             return BadFont;    /* procotol spec says only error is BadFont */
-	}
+
 	pFont = pGC->font;
     }
 
diff --git a/Xext/xvdisp.c b/Xext/xvdisp.c
index 770c53a..fcb61e4 100644
--- a/Xext/xvdisp.c
+++ b/Xext/xvdisp.c
@@ -479,11 +479,7 @@ ProcXvQueryEncodings(ClientPtr client)
   REQUEST(xvQueryEncodingsReq);
   REQUEST_SIZE_MATCH(xvQueryEncodingsReq);
 
-  if(!(pPort = LOOKUP_PORT(stuff->port, client) ))
-    {
-      client->errorValue = stuff->port;
-      return (_XvBadPort);
-    }
+  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
 
   if ((status = _AllocatePort(stuff->port, pPort)) != Success)
     {
@@ -540,12 +536,7 @@ ProcXvPutVideo(ClientPtr client)
   REQUEST_SIZE_MATCH(xvPutVideoReq);
 
   VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
-
-  if(!(pPort = LOOKUP_PORT(stuff->port, client) ))
-    {
-      client->errorValue = stuff->port;
-      return (_XvBadPort);
-    }
+  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
 
   if ((status = _AllocatePort(stuff->port, pPort)) != Success)
     {
@@ -583,12 +574,7 @@ ProcXvPutStill(ClientPtr client)
   REQUEST_SIZE_MATCH(xvPutStillReq);
 
   VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
-
-  if(!(pPort = LOOKUP_PORT(stuff->port, client) ))
-    {
-      client->errorValue = stuff->port;
-      return (_XvBadPort);
-    }
+  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
 
   if ((status = _AllocatePort(stuff->port, pPort)) != Success)
     {
@@ -626,12 +612,7 @@ ProcXvGetVideo(ClientPtr client)
   REQUEST_SIZE_MATCH(xvGetVideoReq);
 
   VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixReadAccess);
-
-  if(!(pPort = LOOKUP_PORT(stuff->port, client) ))
-    {
-      client->errorValue = stuff->port;
-      return (_XvBadPort);
-    }
+  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
 
   if ((status = _AllocatePort(stuff->port, pPort)) != Success)
     {
@@ -669,12 +650,7 @@ ProcXvGetStill(ClientPtr client)
   REQUEST_SIZE_MATCH(xvGetStillReq);
 
   VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixReadAccess);
-
-  if(!(pPort = LOOKUP_PORT(stuff->port, client) ))
-    {
-      client->errorValue = stuff->port;
-      return (_XvBadPort);
-    }
+  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
 
   if ((status = _AllocatePort(stuff->port, pPort)) != Success)
     {
@@ -723,11 +699,7 @@ ProcXvSelectPortNotify(ClientPtr client)
   REQUEST(xvSelectPortNotifyReq);
   REQUEST_SIZE_MATCH(xvSelectPortNotifyReq);
 
-  if(!(pPort = LOOKUP_PORT(stuff->port, client) ))
-    {
-      client->errorValue = stuff->port;
-      return (_XvBadPort);
-    }
+  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
 
   if ((status = _AllocatePort(stuff->port, pPort)) != Success)
     {
@@ -747,11 +719,7 @@ ProcXvGrabPort(ClientPtr client)
   REQUEST(xvGrabPortReq);
   REQUEST_SIZE_MATCH(xvGrabPortReq);
 
-  if(!(pPort = LOOKUP_PORT(stuff->port, client) ))
-    {
-      client->errorValue = stuff->port;
-      return (_XvBadPort);
-    }
+  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
 
   if ((status = _AllocatePort(stuff->port, pPort)) != Success)
     {
@@ -784,11 +752,7 @@ ProcXvUngrabPort(ClientPtr client)
   REQUEST(xvGrabPortReq);
   REQUEST_SIZE_MATCH(xvGrabPortReq);
 
-  if(!(pPort = LOOKUP_PORT(stuff->port, client) ))
-    {
-      client->errorValue = stuff->port;
-      return (_XvBadPort);
-    }
+  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
 
   if ((status = _AllocatePort(stuff->port, pPort)) != Success)
     {
@@ -808,11 +772,7 @@ ProcXvStopVideo(ClientPtr client)
   REQUEST(xvStopVideoReq);
   REQUEST_SIZE_MATCH(xvStopVideoReq);
 
-  if(!(pPort = LOOKUP_PORT(stuff->port, client) ))
-    {
-      client->errorValue = stuff->port;
-      return (_XvBadPort);
-    }
+  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
 
   if ((status = _AllocatePort(stuff->port, pPort)) != Success)
     {
@@ -835,11 +795,7 @@ ProcXvSetPortAttribute(ClientPtr client)
   REQUEST(xvSetPortAttributeReq);
   REQUEST_SIZE_MATCH(xvSetPortAttributeReq);
 
-  if(!(pPort = LOOKUP_PORT(stuff->port, client) ))
-    {
-      client->errorValue = stuff->port;
-      return (_XvBadPort);
-    }
+  VALIDATE_XV_PORT(stuff->port, pPort, DixSetAttrAccess);
 
   if ((status = _AllocatePort(stuff->port, pPort)) != Success)
     {
@@ -873,11 +829,7 @@ ProcXvGetPortAttribute(ClientPtr client)
   REQUEST(xvGetPortAttributeReq);
   REQUEST_SIZE_MATCH(xvGetPortAttributeReq);
 
-  if(!(pPort = LOOKUP_PORT(stuff->port, client) ))
-    {
-      client->errorValue = stuff->port;
-      return (_XvBadPort);
-    }
+  VALIDATE_XV_PORT(stuff->port, pPort, DixGetAttrAccess);
 
   if ((status = _AllocatePort(stuff->port, pPort)) != Success)
     {
@@ -918,11 +870,7 @@ ProcXvQueryBestSize(ClientPtr client)
   REQUEST(xvQueryBestSizeReq);
   REQUEST_SIZE_MATCH(xvQueryBestSizeReq);
 
-  if(!(pPort = LOOKUP_PORT(stuff->port, client) ))
-    {
-      client->errorValue = stuff->port;
-      return (_XvBadPort);
-    }
+  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
 
   if ((status = _AllocatePort(stuff->port, pPort)) != Success)
     {
@@ -959,11 +907,7 @@ ProcXvQueryPortAttributes(ClientPtr client)
   REQUEST(xvQueryPortAttributesReq);
   REQUEST_SIZE_MATCH(xvQueryPortAttributesReq);
 
-  if(!(pPort = LOOKUP_PORT(stuff->port, client) ))
-    {
-      client->errorValue = stuff->port;
-      return (_XvBadPort);
-    }
+  VALIDATE_XV_PORT(stuff->port, pPort, DixGetAttrAccess);
 
   if ((status = _AllocatePort(stuff->port, pPort)) != Success)
     {
@@ -1019,12 +963,7 @@ ProcXvPutImage(ClientPtr client)
   REQUEST_AT_LEAST_SIZE(xvPutImageReq);
 
   VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
-
-  if(!(pPort = LOOKUP_PORT(stuff->port, client) ))
-    {
-      client->errorValue = stuff->port;
-      return (_XvBadPort);
-    }
+  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
 
   if ((status = _AllocatePort(stuff->port, pPort)) != Success)
     {
@@ -1105,12 +1044,7 @@ ProcXvShmPutImage(ClientPtr client)
   REQUEST_SIZE_MATCH(xvShmPutImageReq);
 
   VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, DixWriteAccess);
-
-  if(!(pPort = LOOKUP_PORT(stuff->port, client) ))
-    {
-      client->errorValue = stuff->port;
-      return (_XvBadPort);
-    }
+  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
 
   if ((status = _AllocatePort(stuff->port, pPort)) != Success)
     {
@@ -1141,11 +1075,10 @@ ProcXvShmPutImage(ClientPtr client)
   if(!pImage)
      return BadMatch;
 
-  if(!(shmdesc = (ShmDescPtr)LookupIDByType(stuff->shmseg, ShmSegType))) 
-    {
-      client->errorValue = stuff->shmseg;
-      return BadShmSegCode;  
-    }	
+  status = dixLookupResourceByType((pointer *)&shmdesc, stuff->shmseg,
+				   ShmSegType, serverClient, DixReadAccess);
+  if (status != Success)
+      return (status == BadValue) ? BadShmSegCode : status;
  
   width = stuff->width;
   height = stuff->height;
@@ -1206,11 +1139,7 @@ ProcXvQueryImageAttributes(ClientPtr client)
 
   REQUEST_SIZE_MATCH(xvQueryImageAttributesReq);
 
-  if(!(pPort = LOOKUP_PORT(stuff->port, client) ))
-    {
-      client->errorValue = stuff->port;
-      return (_XvBadPort);
-    }
+  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
   
   for(i = 0; i < pPort->pAdaptor->nImages; i++) {
       if(pPort->pAdaptor->pImages[i].id == stuff->id) {
@@ -1269,11 +1198,7 @@ ProcXvListImageFormats(ClientPtr client)
 
   REQUEST_SIZE_MATCH(xvListImageFormatsReq);
 
-  if(!(pPort = LOOKUP_PORT(stuff->port, client) ))
-    {
-      client->errorValue = stuff->port;
-      return (_XvBadPort);
-    }
+  VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
 
   rep.type = X_Reply;
   rep.sequenceNumber = client->sequence;
@@ -1679,18 +1604,20 @@ SProcXvDispatch(ClientPtr client)
 static int
 XineramaXvStopVideo(ClientPtr client)
 {
-   int result = Success, i;
+   int result, i;
    PanoramiXRes *draw, *port;
    REQUEST(xvStopVideoReq);
    REQUEST_SIZE_MATCH(xvStopVideoReq);
 
-   if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-                client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-        return BadDrawable;
+   result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				     XRC_DRAWABLE, client, DixWriteAccess);
+   if (result != Success)
+       return (result == BadValue) ? BadDrawable : result;
 
-   if(!(port = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->port, XvXRTPort, DixReadAccess)))
-        return _XvBadPort;
+   result = dixLookupResourceByType((pointer *)&port, stuff->port,
+				    XvXRTPort, client, DixReadAccess);
+   if (result != Success)
+       return (result == BadValue) ? _XvBadPort : result;
 
    FOR_NSCREENS_BACKWARD(i) {
 	if(port->info[i].id) {
@@ -1708,13 +1635,14 @@ XineramaXvSetPortAttribute(ClientPtr client)
 {
     REQUEST(xvSetPortAttributeReq);
     PanoramiXRes *port;
-    int result = Success, i;
+    int result, i;
 
     REQUEST_SIZE_MATCH(xvSetPortAttributeReq);
 
-    if(!(port = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->port, XvXRTPort, DixReadAccess)))
-        return _XvBadPort;
+    result = dixLookupResourceByType((pointer *)&port, stuff->port,
+				     XvXRTPort, client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? _XvBadPort : result;
 
     FOR_NSCREENS_BACKWARD(i) {
 	if(port->info[i].id) {
@@ -1733,21 +1661,24 @@ XineramaXvShmPutImage(ClientPtr client)
     PanoramiXRes *draw, *gc, *port;
     Bool send_event = stuff->send_event;
     Bool isRoot;
-    int result = Success, i, x, y;
+    int result, i, x, y;
 
     REQUEST_SIZE_MATCH(xvShmPutImageReq);
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-                client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-        return BadDrawable;
+    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->gc, XRT_GC, DixReadAccess)))
-        return BadGC;    
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
+				     XRT_GC, client, DixReadAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadGC : result;
 
-    if(!(port = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->port, XvXRTPort, DixReadAccess)))
-        return _XvBadPort;
+    result = dixLookupResourceByType((pointer *)&port, stuff->port,
+				     XvXRTPort, client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? _XvBadPort : result;
  
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1782,21 +1713,24 @@ XineramaXvPutImage(ClientPtr client)
     REQUEST(xvPutImageReq);
     PanoramiXRes *draw, *gc, *port;
     Bool isRoot;
-    int result = Success, i, x, y;
+    int result, i, x, y;
 
     REQUEST_AT_LEAST_SIZE(xvPutImageReq);
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-                client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-        return BadDrawable;
+    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->gc, XRT_GC, DixReadAccess)))
-        return BadGC;    
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
+				     XRT_GC, client, DixReadAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadGC : result;
 
-    if(!(port = (PanoramiXRes *)SecurityLookupIDByType(
-		client, stuff->port, XvXRTPort, DixReadAccess)))
-	return _XvBadPort;
+    result = dixLookupResourceByType((pointer *)&port, stuff->port,
+				     XvXRTPort, client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? _XvBadPort : result;
  
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1827,21 +1761,24 @@ XineramaXvPutVideo(ClientPtr client)
     REQUEST(xvPutImageReq);
     PanoramiXRes *draw, *gc, *port;
     Bool isRoot;
-    int result = Success, i, x, y;
+    int result, i, x, y;
 
     REQUEST_AT_LEAST_SIZE(xvPutVideoReq);
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-                client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-        return BadDrawable;
+    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->gc, XRT_GC, DixReadAccess)))
-        return BadGC;
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
+				     XRT_GC, client, DixReadAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadGC : result;
 
-    if(!(port = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->port, XvXRTPort, DixReadAccess)))
-        return _XvBadPort;
+    result = dixLookupResourceByType((pointer *)&port, stuff->port,
+				     XvXRTPort, client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? _XvBadPort : result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1872,21 +1809,24 @@ XineramaXvPutStill(ClientPtr client)
     REQUEST(xvPutImageReq);
     PanoramiXRes *draw, *gc, *port;
     Bool isRoot;
-    int result = Success, i, x, y;
+    int result, i, x, y;
 
     REQUEST_AT_LEAST_SIZE(xvPutImageReq);
 
-    if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass(
-                client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-        return BadDrawable;
+    result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
 
-    if(!(gc = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->gc, XRT_GC, DixReadAccess)))
-        return BadGC;
+    result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
+				     XRT_GC, client, DixReadAccess);
+    if (result != Success)
+        return (result == BadValue) ? BadGC : result;
 
-    if(!(port = (PanoramiXRes *)SecurityLookupIDByType(
-                client, stuff->port, XvXRTPort, DixReadAccess)))
-        return _XvBadPort;
+    result = dixLookupResourceByType((pointer *)&port, stuff->port,
+				     XvXRTPort, client, DixReadAccess);
+    if (result != Success)
+	return (result == BadValue) ? _XvBadPort : result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
diff --git a/Xext/xvdix.h b/Xext/xvdix.h
index 265c03d..44f8f6b 100644
--- a/Xext/xvdix.h
+++ b/Xext/xvdix.h
@@ -201,17 +201,13 @@ typedef struct _XvPortRec {
   DevUnion devPriv;
 } XvPortRec, *XvPortPtr;
 
-#define LOOKUP_PORT(_id, client)\
-     ((XvPortPtr)LookupIDByType(_id, XvRTPort))
-
-#define LOOKUP_ENCODING(_id, client)\
-     ((XvEncodingPtr)LookupIDByType(_id, XvRTEncoding))
-
-#define LOOKUP_VIDEONOTIFY_LIST(_id, client)\
-     ((XvVideoNotifyPtr)LookupIDByType(_id, XvRTVideoNotifyList))
-
-#define LOOKUP_PORTNOTIFY_LIST(_id, client)\
-     ((XvPortNotifyPtr)LookupIDByType(_id, XvRTPortNotifyList))
+#define VALIDATE_XV_PORT(portID, pPort, mode)\
+    {\
+	int rc = dixLookupResourceByType((pointer *)&(pPort), portID,\
+	                                 XvRTPort, client, mode);\
+	if (rc != Success)\
+	    return (rc == BadValue) ? _XvBadPort : rc;\
+    }
 
 typedef struct {
   int version, revision;
diff --git a/Xext/xvmain.c b/Xext/xvmain.c
index 4771946..7c8a3c3 100644
--- a/Xext/xvmain.c
+++ b/Xext/xvmain.c
@@ -523,7 +523,8 @@ XvdiSendVideoNotify(XvPortPtr pPort, DrawablePtr pDraw, int reason)
   xvEvent event;
   XvVideoNotifyPtr pn;
 
-  pn = (XvVideoNotifyPtr)LookupIDByType(pDraw->id, XvRTVideoNotifyList);
+  dixLookupResourceByType((pointer *)&pn, pDraw->id, XvRTVideoNotifyList,
+			  serverClient, DixReadAccess);
 
   while (pn) 
     {
@@ -905,10 +906,14 @@ XvdiSelectVideoNotify(
   BOOL onoff
 ){
   XvVideoNotifyPtr pn,tpn,fpn;
+  int rc;
 
   /* FIND VideoNotify LIST */
 
-  pn = (XvVideoNotifyPtr)LookupIDByType(pDraw->id, XvRTVideoNotifyList);
+  rc = dixLookupResourceByType((pointer *)&pn, pDraw->id, XvRTVideoNotifyList,
+			       client, DixWriteAccess);
+  if (rc != Success && rc != BadValue)
+      return rc;
 
   /* IF ONE DONES'T EXIST AND NO MASK, THEN JUST RETURN */
 
diff --git a/Xext/xvmc.c b/Xext/xvmc.c
index 9166cf8..879a222 100644
--- a/Xext/xvmc.c
+++ b/Xext/xvmc.c
@@ -136,10 +136,7 @@ ProcXvMCListSurfaceTypes(ClientPtr client)
     REQUEST(xvmcListSurfaceTypesReq);
     REQUEST_SIZE_MATCH(xvmcListSurfaceTypesReq);
 
-    if(!(pPort = LOOKUP_PORT(stuff->port, client))) {
-        client->errorValue = stuff->port;
-        return _XvBadPort;
-    }
+    VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
 
     if(XvMCScreenKey) { /* any adaptors at all */
        ScreenPtr pScreen = pPort->pAdaptor->pScreen;
@@ -192,10 +189,7 @@ ProcXvMCCreateContext(ClientPtr client)
     REQUEST(xvmcCreateContextReq);
     REQUEST_SIZE_MATCH(xvmcCreateContextReq);
 
-    if(!(pPort = LOOKUP_PORT(stuff->port, client))) {
-	client->errorValue = stuff->port;
-	return _XvBadPort;
-    }
+    VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
 
     pScreen = pPort->pAdaptor->pScreen;
 
@@ -273,11 +267,15 @@ ProcXvMCCreateContext(ClientPtr client)
 static int 
 ProcXvMCDestroyContext(ClientPtr client)
 {
+    pointer val;
+    int rc;
     REQUEST(xvmcDestroyContextReq);
     REQUEST_SIZE_MATCH(xvmcDestroyContextReq);
 
-    if(!LookupIDByType(stuff->context_id, XvMCRTContext))
-	return (XvMCBadContext + XvMCErrorBase);
+    rc = dixLookupResourceByType(&val, stuff->context_id, XvMCRTContext,
+				 client, DixDestroyAccess);
+    if (rc != Success)
+	return (rc == BadValue) ? XvMCBadContext + XvMCErrorBase : rc;
 
     FreeResource(stuff->context_id, RT_NONE); 
 
@@ -297,8 +295,10 @@ ProcXvMCCreateSurface(ClientPtr client)
     REQUEST(xvmcCreateSurfaceReq);
     REQUEST_SIZE_MATCH(xvmcCreateSurfaceReq);
 
-    if(!(pContext = LookupIDByType(stuff->context_id, XvMCRTContext)))
-        return (XvMCBadContext + XvMCErrorBase);
+    result = dixLookupResourceByType((pointer *)&pContext, stuff->context_id,
+				     XvMCRTContext, client, DixUseAccess);
+    if (result != Success)
+        return (result == BadValue) ? XvMCBadContext + XvMCErrorBase : result;
 
     pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
 
@@ -337,11 +337,15 @@ ProcXvMCCreateSurface(ClientPtr client)
 static int 
 ProcXvMCDestroySurface(ClientPtr client)
 {
+    pointer val;
+    int rc;
     REQUEST(xvmcDestroySurfaceReq);
     REQUEST_SIZE_MATCH(xvmcDestroySurfaceReq);
 
-    if(!LookupIDByType(stuff->surface_id, XvMCRTSurface))
-        return (XvMCBadSurface + XvMCErrorBase);
+    rc = dixLookupResourceByType(&val, stuff->surface_id, XvMCRTSurface,
+				 client, DixDestroyAccess);
+    if (rc != Success)
+        return (rc == BadValue) ? XvMCBadSurface + XvMCErrorBase : rc;
 
     FreeResource(stuff->surface_id, RT_NONE);
 
@@ -363,8 +367,10 @@ ProcXvMCCreateSubpicture(ClientPtr client)
     REQUEST(xvmcCreateSubpictureReq);
     REQUEST_SIZE_MATCH(xvmcCreateSubpictureReq);
 
-    if(!(pContext = LookupIDByType(stuff->context_id, XvMCRTContext)))
-        return (XvMCBadContext + XvMCErrorBase);
+    result = dixLookupResourceByType((pointer *)&pContext, stuff->context_id,
+				     XvMCRTContext, client, DixUseAccess);
+    if (result != Success)
+        return (result == BadValue) ? XvMCBadContext + XvMCErrorBase : result;
 
     pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
 
@@ -448,11 +454,15 @@ ProcXvMCCreateSubpicture(ClientPtr client)
 static int 
 ProcXvMCDestroySubpicture(ClientPtr client)
 {
+    pointer val;
+    int rc;
     REQUEST(xvmcDestroySubpictureReq);
     REQUEST_SIZE_MATCH(xvmcDestroySubpictureReq);
 
-    if(!LookupIDByType(stuff->subpicture_id, XvMCRTSubpicture))
-        return (XvMCBadSubpicture + XvMCErrorBase);
+    rc = dixLookupResourceByType(&val, stuff->subpicture_id, XvMCRTSubpicture,
+				 client, DixDestroyAccess);
+    if (rc != Success)
+        return (rc == BadValue) ? XvMCBadSubpicture + XvMCErrorBase : rc;
 
     FreeResource(stuff->subpicture_id, RT_NONE);
 
@@ -475,10 +485,7 @@ ProcXvMCListSubpictureTypes(ClientPtr client)
     REQUEST(xvmcListSubpictureTypesReq);
     REQUEST_SIZE_MATCH(xvmcListSubpictureTypesReq);
 
-    if(!(pPort = LOOKUP_PORT(stuff->port, client))) {
-        client->errorValue = stuff->port;
-        return _XvBadPort;
-    }
+    VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
 
     pScreen = pPort->pAdaptor->pScreen;
 
@@ -571,11 +578,7 @@ ProcXvMCGetDRInfo(ClientPtr client)
     REQUEST(xvmcGetDRInfoReq);
     REQUEST_SIZE_MATCH(xvmcGetDRInfoReq);
 
-
-    if(!(pPort = LOOKUP_PORT(stuff->port, client))) {
-	client->errorValue = stuff->port;
-	return _XvBadPort;
-    }
+    VALIDATE_XV_PORT(stuff->port, pPort, DixReadAccess);
 
     pScreen = pPort->pAdaptor->pScreen;
     pScreenPriv = XVMC_GET_PRIVATE(pScreen);
diff --git a/Xi/chdevcur.c b/Xi/chdevcur.c
index b0d3ce3..d7a9e49 100644
--- a/Xi/chdevcur.c
+++ b/Xi/chdevcur.c
@@ -94,12 +94,10 @@ int ProcXChangeDeviceCursor(ClientPtr client)
     }
     else
     {
-        pCursor = (CursorPtr)SecurityLookupIDByType(client, stuff->cursor,
-                                RT_CURSOR, DixReadAccess);
-        if (!pCursor)
-        {
-            return BadCursor;
-        }
+	rc = dixLookupResourceByType((pointer *)&pCursor, stuff->cursor,
+				     RT_CURSOR, client, DixReadAccess);
+	if (rc != Success)
+	    return (rc == BadValue) ? BadCursor : rc;
     }
 
     ChangeWindowDeviceCursor(pWin, pDev, pCursor);
diff --git a/Xi/extgrbdev.c b/Xi/extgrbdev.c
index af87063..0f64610 100644
--- a/Xi/extgrbdev.c
+++ b/Xi/extgrbdev.c
@@ -88,7 +88,7 @@ ProcXExtendedGrabDevice(ClientPtr client)
 {
     xExtendedGrabDeviceReply rep;
     DeviceIntPtr             dev;
-    int                      rc = Success,
+    int                      rc,
                              errval = 0,
                              i;
     WindowPtr                grab_window,
@@ -145,14 +145,12 @@ ProcXExtendedGrabDevice(ClientPtr client)
 
     if (stuff->cursor)
     {
-        cursor = (CursorPtr)SecurityLookupIDByType(client,
-                                                    stuff->cursor,
-                                                    RT_CURSOR,
-                                                    DixReadAccess);
-        if (!cursor)
-        {
+	rc = dixLookupResourceByType((pointer *)&cursor, stuff->cursor,
+				     RT_CURSOR, client, DixReadAccess);
+	if (rc != Success)
+	{
             errval = stuff->cursor;
-            rc = BadCursor;
+            rc = (rc == BadValue) ? BadCursor : rc;
             goto cleanup;
         }
     }
diff --git a/damageext/damageextint.h b/damageext/damageextint.h
index 543f1a7..45c5ff9 100644
--- a/damageext/damageextint.h
+++ b/damageext/damageextint.h
@@ -58,11 +58,10 @@ typedef struct _DamageExt {
 } DamageExtRec, *DamageExtPtr;
 
 #define VERIFY_DAMAGEEXT(pDamageExt, rid, client, mode) { \
-    pDamageExt = SecurityLookupIDByType (client, rid, DamageExtType, mode); \
-    if (!pDamageExt) { \
-	client->errorValue = rid; \
-	return DamageErrorBase + BadDamage; \
-    } \
+    int rc = dixLookupResourceByType((pointer *)&(pDamageExt), rid, \
+                                     DamageExtType, client, mode); \
+    if (rc != Success) \
+        return (rc == BadValue) ? DamageErrorBase + BadDamage : rc; \
 }
 
 void
diff --git a/dbe/dbe.c b/dbe/dbe.c
index 3fd99df..b8f61e7 100644
--- a/dbe/dbe.c
+++ b/dbe/dbe.c
@@ -411,20 +411,23 @@ ProcDbeDeallocateBackBufferName(ClientPtr client)
 {
     REQUEST(xDbeDeallocateBackBufferNameReq);
     DbeWindowPrivPtr	pDbeWindowPriv;
-    int			i;
+    int			rc, i;
+    pointer val;
 
 
     REQUEST_SIZE_MATCH(xDbeDeallocateBackBufferNameReq);
 
     /* Buffer name must be valid */
-    if (!(pDbeWindowPriv = (DbeWindowPrivPtr)SecurityLookupIDByType(client,
-		stuff->buffer, dbeWindowPrivResType, DixDestroyAccess)) ||
-        !(SecurityLookupIDByType(client, stuff->buffer, dbeDrawableResType,
-				 DixDestroyAccess)))
-    {
-        client->errorValue = stuff->buffer;
-        return(dbeErrorBase + DbeBadBuffer);
-    }
+    rc = dixLookupResourceByType((pointer *)&pDbeWindowPriv, stuff->buffer,
+				 dbeWindowPrivResType, client,
+				 DixDestroyAccess);
+    if (rc != Success)
+	return (rc == BadValue) ? dbeErrorBase + DbeBadBuffer : rc;
+
+    rc = dixLookupResourceByType(&val, stuff->buffer, dbeDrawableResType,
+				 client, DixDestroyAccess);
+    if (rc != Success)
+	return (rc == BadValue) ? dbeErrorBase + DbeBadBuffer : rc;
 
     /* Make sure that the id is valid for the window.
      * This is paranoid code since we already looked up the ID by type
@@ -833,19 +836,21 @@ ProcDbeGetBackBufferAttributes(ClientPtr client)
     REQUEST(xDbeGetBackBufferAttributesReq);
     xDbeGetBackBufferAttributesReply	rep;
     DbeWindowPrivPtr			pDbeWindowPriv;
-    int					n;
+    int					rc, n;
 
 
     REQUEST_SIZE_MATCH(xDbeGetBackBufferAttributesReq);
 
-    if (!(pDbeWindowPriv = (DbeWindowPrivPtr)SecurityLookupIDByType(client,
-		stuff->buffer, dbeWindowPrivResType, DixGetAttrAccess)))
+    rc = dixLookupResourceByType((pointer *)&pDbeWindowPriv, stuff->buffer,
+				 dbeWindowPrivResType, client,
+				 DixGetAttrAccess);
+    if (rc == Success)
     {
-        rep.attributes = None;
+        rep.attributes = pDbeWindowPriv->pWindow->drawable.id;
     }
     else
     {
-        rep.attributes = pDbeWindowPriv->pWindow->drawable.id;
+        rep.attributes = None;
     }
         
     rep.type           = X_Reply;
diff --git a/dix/colormap.c b/dix/colormap.c
index 6a5eb74..a5a006e 100644
--- a/dix/colormap.c
+++ b/dix/colormap.c
@@ -893,9 +893,9 @@ AllocColor (ColormapPtr pmap,
 	if (pmap->mid != pmap->pScreen->defColormap &&
 	    pmap->pVisual->vid == pmap->pScreen->rootVisual)
 	{
-	    ColormapPtr prootmap = (ColormapPtr)
-		SecurityLookupIDByType (clients[client], pmap->pScreen->defColormap,
-					 RT_COLORMAP, DixReadAccess);
+	    ColormapPtr prootmap;
+	    dixLookupResourceByType((pointer *)&prootmap, pmap->pScreen->defColormap,
+				    RT_COLORMAP, clients[client], DixReadAccess);
 
 	    if (pmap->class == prootmap->class)
 		FindColorInRootCmap (prootmap, prootmap->red, entries, &rgb, 
@@ -910,9 +910,9 @@ AllocColor (ColormapPtr pmap,
 	if (pmap->mid != pmap->pScreen->defColormap &&
 	    pmap->pVisual->vid == pmap->pScreen->rootVisual)
 	{
-	    ColormapPtr prootmap = (ColormapPtr)
-		SecurityLookupIDByType (clients[client], pmap->pScreen->defColormap,
-					 RT_COLORMAP, DixReadAccess);
+	    ColormapPtr prootmap;
+	    dixLookupResourceByType((pointer *)&prootmap, pmap->pScreen->defColormap,
+				    RT_COLORMAP, clients[client], DixReadAccess);
 
 	    if (pmap->class == prootmap->class)
 	    {
@@ -1550,12 +1550,14 @@ FreePixels(ColormapPtr pmap, int client)
 int
 FreeClientPixels (pointer value, XID fakeid)
 {
-    ColormapPtr pmap;
-    colorResource *pcr = (colorResource *)value;
-
-    pmap = (ColormapPtr) LookupIDByType(pcr->mid, RT_COLORMAP);
-    if (pmap)
-	FreePixels(pmap, pcr->client);
+    pointer pmap;
+    colorResource *pcr = value;
+    int rc;
+
+    rc = dixLookupResourceByType(&pmap, pcr->mid, RT_COLORMAP, serverClient,
+				 DixRemoveAccess);
+    if (rc == Success)
+	FreePixels((ColormapPtr)pmap, pcr->client);
     xfree(pcr);
     return Success;
 }
diff --git a/dix/cursor.c b/dix/cursor.c
index 7ab15df..086d008 100644
--- a/dix/cursor.c
+++ b/dix/cursor.c
@@ -545,8 +545,9 @@ CreateRootCursor(char *unused1, unsigned int unused2)
     if (err != Success)
 	return NullCursor;
 
-    cursorfont = (FontPtr)LookupIDByType(fontID, RT_FONT);
-    if (!cursorfont)
+    err = dixLookupResourceByType((pointer *)&cursorfont, fontID, RT_FONT,
+				  serverClient, DixReadAccess);
+    if (err != Success)
 	return NullCursor;
     if (AllocGlyphCursor(fontID, 0, fontID, 1, 0, 0, 0, ~0, ~0, ~0,
 			 &curs, serverClient, (XID)0) != Success)
diff --git a/dix/deprecated.c b/dix/deprecated.c
index 5487b64..8123886 100644
--- a/dix/deprecated.c
+++ b/dix/deprecated.c
@@ -148,14 +148,18 @@ SecurityLookupIDByClass(ClientPtr client, XID id, RESTYPE classes,
 pointer
 LookupIDByType(XID id, RESTYPE rtype)
 {
-    return SecurityLookupIDByType(NullClient, id, rtype, DixUnknownAccess);
+    pointer val;
+    dixLookupResourceByType(&val, id, rtype, NullClient, DixUnknownAccess);
+    return val;
 }
 
 /* replaced by dixLookupResourceByClass */
 pointer
 LookupIDByClass(XID id, RESTYPE classes)
 {
-    return SecurityLookupIDByClass(NullClient, id, classes, DixUnknownAccess);
+    pointer val;
+    dixLookupResourceByClass(&val, id, classes, NullClient, DixUnknownAccess);
+    return val;
 }
 
 /* replaced by dixLookupResourceBy{Type,Class} */
diff --git a/dix/dispatch.c b/dix/dispatch.c
index 16a51bd..ce3294d 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -1252,12 +1252,13 @@ int
 ProcCloseFont(ClientPtr client)
 {
     FontPtr pFont;
+    int rc;
     REQUEST(xResourceReq);
 
     REQUEST_SIZE_MATCH(xResourceReq);
-    pFont = (FontPtr)SecurityLookupIDByType(client, stuff->id, RT_FONT,
-					    DixDestroyAccess);
-    if ( pFont != (FontPtr)NULL)	/* id was valid */
+    rc = dixLookupResourceByType((pointer *)&pFont, stuff->id, RT_FONT,
+				 client, DixDestroyAccess);
+    if (rc == Success)
     {
         FreeResource(stuff->id, RT_NONE);
 	return(client->noClientException);
@@ -1265,7 +1266,7 @@ ProcCloseFont(ClientPtr client)
     else
     {
 	client->errorValue = stuff->id;
-        return (BadFont);
+        return (rc == BadValue) ? BadFont : rc;
     }
 }
 
diff --git a/dix/dixfonts.c b/dix/dixfonts.c
index 79489e8..8b6e7a3 100644
--- a/dix/dixfonts.c
+++ b/dix/dixfonts.c
@@ -137,8 +137,9 @@ SetDefaultFont(char *defaultfontname)
 		   (unsigned) strlen(defaultfontname), defaultfontname);
     if (err != Success)
 	return FALSE;
-    pf = (FontPtr) LookupIDByType(fid, RT_FONT);
-    if (pf == (FontPtr) NULL)
+    err = dixLookupResourceByType((pointer *)&pf, fid, RT_FONT, serverClient,
+				  DixReadAccess);
+    if (err != Success)
 	return FALSE;
     defaultFont = pf;
     return TRUE;
@@ -1201,17 +1202,18 @@ doPolyText(ClientPtr client, PTclosurePtr c)
     }
 
     /* Make sure our drawable hasn't disappeared while we slept. */
-    if (c->slept &&
-	c->pDraw &&
-	c->pDraw != (DrawablePtr)SecurityLookupIDByClass(client, c->did,
-					RC_DRAWABLE, DixWriteAccess))
+    if (c->slept && c->pDraw)
     {
-	/* Our drawable has disappeared.  Treat like client died... ask
-	   the FPE code to clean up after client and avoid further
-	   rendering while we clean up after ourself.  */
-	fpe = c->pGC->font->fpe;
-	(*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
-	c->pDraw = (DrawablePtr)0;
+	DrawablePtr pDraw;
+	dixLookupDrawable(&pDraw, c->did, client, 0, DixWriteAccess);
+	if (c->pDraw != pDraw) {
+	    /* Our drawable has disappeared.  Treat like client died... ask
+	       the FPE code to clean up after client and avoid further
+	       rendering while we clean up after ourself.  */
+	    fpe = c->pGC->font->fpe;
+	    (*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
+	    c->pDraw = (DrawablePtr)0;
+	}
     }
 
     client_state = c->slept ? SLEEPING : NEVER_SLEPT;
@@ -1233,12 +1235,11 @@ doPolyText(ClientPtr client, PTclosurePtr c)
 		 | ((Font)*(c->pElt+3)) << 8
 		 | ((Font)*(c->pElt+2)) << 16
 		 | ((Font)*(c->pElt+1)) << 24;
-	    pFont = (FontPtr)SecurityLookupIDByType(client, fid, RT_FONT,
-						    DixReadAccess);
-	    if (!pFont)
+	    err = dixLookupResourceByType((pointer *)&pFont, fid, RT_FONT,
+					  client, DixReadAccess);
+	    if (err != Success)
 	    {
-		client->errorValue = fid;
-		err = BadFont;
+		err = (err == BadValue) ? BadFont : err;
 		/* restore pFont and fid for step 4 (described below) */
 		pFont = oldpFont;
 		fid = oldfid;
@@ -1486,17 +1487,18 @@ doImageText(ClientPtr client, ITclosurePtr c)
     }
 
     /* Make sure our drawable hasn't disappeared while we slept. */
-    if (c->slept &&
-	c->pDraw &&
-	c->pDraw != (DrawablePtr)SecurityLookupIDByClass(client, c->did,
-					RC_DRAWABLE, DixWriteAccess))
+    if (c->slept && c->pDraw)
     {
-	/* Our drawable has disappeared.  Treat like client died... ask
-	   the FPE code to clean up after client. */
-	fpe = c->pGC->font->fpe;
-	(*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
-	err = Success;
-	goto bail;
+	DrawablePtr pDraw;
+	dixLookupDrawable(&pDraw, c->did, client, 0, DixWriteAccess);
+	if (c->pDraw != pDraw) {
+	    /* Our drawable has disappeared.  Treat like client died... ask
+	       the FPE code to clean up after client. */
+	    fpe = c->pGC->font->fpe;
+	    (*fpe_functions[fpe->type].client_died) ((pointer) client, fpe);
+	    err = Success;
+	    goto bail;
+	}
     }
 
     lgerr = LoadGlyphs(client, c->pGC->font, c->nChars, c->itemSize, c->data);
@@ -2013,8 +2015,9 @@ FreeFonts(void)
 FontPtr
 find_old_font(XID id)
 {
-    return (FontPtr) SecurityLookupIDByType(NullClient, id, RT_NONE,
-					    DixUnknownAccess);
+    pointer pFont;
+    dixLookupResourceByType(&pFont, id, RT_NONE, serverClient, DixReadAccess);
+    return (FontPtr)pFont;
 }
 
 Font
diff --git a/dix/dixutils.c b/dix/dixutils.c
index 1bdeee0..5cede5f 100644
--- a/dix/dixutils.c
+++ b/dix/dixutils.c
@@ -240,14 +240,9 @@ dixLookupWindow(WindowPtr *pWin, XID id, ClientPtr client, Mask access)
 int
 dixLookupGC(GCPtr *pGC, XID id, ClientPtr client, Mask access)
 {
-    GCPtr pTmp = (GCPtr)SecurityLookupIDByType(client, id, RT_GC, access);
-    if (pTmp) {
-	*pGC = pTmp;
-	return Success;
-    }
-    client->errorValue = id;
-    *pGC = NULL;
-    return BadGC;
+    int rc;
+    rc = dixLookupResourceByType((pointer *)pGC, id, RT_GC, client, access);
+    return (rc == BadValue) ? BadGC : rc;
 }
 
 int
diff --git a/dix/events.c b/dix/events.c
index 8af71b6..be88891 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -506,16 +506,17 @@ XineramaSetWindowPntrs(DeviceIntPtr pDev, WindowPtr pWin)
 				PanoramiXNumScreens*sizeof(WindowPtr));
     } else {
 	PanoramiXRes *win;
-	int i;
-
-	win = (PanoramiXRes*)LookupIDByType(pWin->drawable.id, XRT_WINDOW);
+	int rc, i;
 
-	if(!win)
+	rc = dixLookupResourceByType((pointer *)&win, pWin->drawable.id,
+				     XRT_WINDOW, serverClient, DixReadAccess);
+	if (rc != Success)
 	    return FALSE;
 
 	for(i = 0; i < PanoramiXNumScreens; i++) {
-	   pSprite->windows[i] = LookupIDByType(win->info[i].id, RT_WINDOW);
-	   if(!pSprite->windows[i])  /* window is being unmapped */
+	    rc = dixLookupWindow(pSprite->windows + i, win->info[i].id,
+				 serverClient, DixReadAccess);
+	    if (rc != Success)  /* window is being unmapped */
 		return FALSE;
 	}
     }
diff --git a/dix/resource.c b/dix/resource.c
index dc6945d..73bc3a9 100644
--- a/dix/resource.c
+++ b/dix/resource.c
@@ -392,13 +392,16 @@ unsigned int
 GetXIDList(ClientPtr pClient, unsigned count, XID *pids)
 {
     unsigned int found = 0;
-    XID id = pClient->clientAsMask;
+    XID rc, id = pClient->clientAsMask;
     XID maxid;
+    pointer val;
 
     maxid = id | RESOURCE_ID_MASK;
     while ( (found < count) && (id <= maxid) )
     {
-	if (!LookupIDByClass(id, RC_ANY))
+	rc = dixLookupResourceByClass(&val, id, RC_ANY, serverClient,
+				      DixGetAttrAccess);
+	if (rc == BadValue)
 	{
 	    pids[found++] = id;
 	}
@@ -826,6 +829,8 @@ FreeAllResources(void)
 Bool
 LegalNewID(XID id, ClientPtr client)
 {
+    pointer val;
+    int rc;
 
 #ifdef PANORAMIX
     XID 	minid, maxid;
@@ -838,9 +843,16 @@ LegalNewID(XID id, ClientPtr client)
 	        return TRUE;
 	}
 #endif /* PANORAMIX */
-	return ((client->clientAsMask == (id & ~RESOURCE_ID_MASK)) &&
-	    ((clientTable[client->index].expectID <= id) ||
-	     !LookupIDByClass(id, RC_ANY)));
+	if (client->clientAsMask == (id & ~RESOURCE_ID_MASK))
+	{
+	    if (clientTable[client->index].expectID <= id)
+		return TRUE;
+
+	    rc = dixLookupResourceByClass(&val, id, RC_ANY, serverClient,
+					  DixGetAttrAccess);
+	    return (rc == BadValue);
+	}
+	return FALSE;
 }
 
 int
diff --git a/dix/window.c b/dix/window.c
index f112f81..324ddb7 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -2795,6 +2795,7 @@ UnrealizeTree(
     WindowPtr pChild;
     UnrealizeWindowProcPtr Unrealize;
     MarkUnrealizedWindowProcPtr MarkUnrealizedWindow;
+    int rc;
 
     Unrealize = pWin->drawable.pScreen->UnrealizeWindow;
     MarkUnrealizedWindow = pWin->drawable.pScreen->MarkUnrealizedWindow;
@@ -2808,9 +2809,10 @@ UnrealizeTree(
 #ifdef PANORAMIX
 	    if(!noPanoramiXExtension && !pChild->drawable.pScreen->myNum) {
 		PanoramiXRes *win;
-		win = (PanoramiXRes*)LookupIDByType(pChild->drawable.id,
-							XRT_WINDOW);
-		if(win)
+		rc = dixLookupResourceByType((pointer *)&win,
+					     pChild->drawable.id, XRT_WINDOW,
+					     serverClient, DixWriteAccess);
+		if (rc == Success)
 		   win->u.win.visibility = VisibilityNotViewable;
 	    } 
 #endif
@@ -3072,7 +3074,7 @@ SendVisibilityNotify(WindowPtr pWin)
     if(!noPanoramiXExtension) {
 	PanoramiXRes *win;
 	WindowPtr pWin2;
-	int i, Scrnum;
+	int rc, i, Scrnum;
 
 	Scrnum = pWin->drawable.pScreen->myNum;
 	
@@ -3086,9 +3088,10 @@ SendVisibilityNotify(WindowPtr pWin)
 	    for(i = 0; i < PanoramiXNumScreens; i++) {
 		if(i == Scrnum) continue;
 
-		pWin2 = (WindowPtr)LookupIDByType(win->info[i].id, RT_WINDOW);
+		rc = dixLookupWindow(&pWin2, win->info[i].id, serverClient,
+				     DixWriteAccess);
 
-		if (pWin2) {
+		if (rc == Success) {
 		    if(pWin2->visibility == VisibilityPartiallyObscured)
 		   	return;
 
@@ -3098,17 +3101,19 @@ SendVisibilityNotify(WindowPtr pWin)
 	    break;
 	case VisibilityPartiallyObscured:
 	    if(Scrnum) {
-	        pWin2 = (WindowPtr)LookupIDByType(win->info[0].id, RT_WINDOW);
-		if (pWin2) pWin = pWin2;
+		rc = dixLookupWindow(&pWin2, win->info[0].id, serverClient,
+				     DixWriteAccess);
+		if (rc == Success) pWin = pWin2;
 	    }
 	    break;
 	case VisibilityFullyObscured:
 	    for(i = 0; i < PanoramiXNumScreens; i++) {
 		if(i == Scrnum) continue;
 
-		pWin2 = (WindowPtr)LookupIDByType(win->info[i].id, RT_WINDOW);
+		rc = dixLookupWindow(&pWin2, win->info[i].id, serverClient,
+				     DixWriteAccess);
 		
-		if (pWin2) {
+		if (rc == Success) {
 		    if(pWin2->visibility != VisibilityFullyObscured)
 		    	return;
 
@@ -3739,7 +3744,7 @@ DrawLogo(WindowPtr pWin)
     int x, y;
     unsigned int width, height, size;
     GC *pGC;
-    int thin, gap, d31;
+    int rc, thin, gap, d31;
     DDXPointRec poly[4];
     ChangeGCVal fore[2], back[2];
     xrgb rgb[2];
@@ -3760,20 +3765,23 @@ DrawLogo(WindowPtr pWin)
 	fore[0].val = pScreen->whitePixel;
     else
 	fore[0].val = pScreen->blackPixel;
-    if ((pWin->backgroundState == BackgroundPixel) &&
-	(cmap = (ColormapPtr)LookupIDByType(wColormap (pWin), RT_COLORMAP))) {
-	Pixel querypixels[2];
-
-	querypixels[0] = fore[0].val;
-	querypixels[1] = pWin->background.pixel;
-	QueryColors(cmap, 2, querypixels, rgb);
-	if ((rgb[0].red == rgb[1].red) &&
-	    (rgb[0].green == rgb[1].green) &&
-	    (rgb[0].blue == rgb[1].blue)) {
-	    if (fore[0].val == pScreen->blackPixel)
-		fore[0].val = pScreen->whitePixel;
-	    else
-		fore[0].val = pScreen->blackPixel;
+    if (pWin->backgroundState == BackgroundPixel) {
+	rc = dixLookupResourceByType((pointer *)&cmap, wColormap(pWin),
+				     RT_COLORMAP, serverClient, DixReadAccess);
+	if (rc == Success) {
+	    Pixel querypixels[2];
+
+	    querypixels[0] = fore[0].val;
+	    querypixels[1] = pWin->background.pixel;
+	    QueryColors(cmap, 2, querypixels, rgb);
+	    if ((rgb[0].red == rgb[1].red) &&
+		(rgb[0].green == rgb[1].green) &&
+		(rgb[0].blue == rgb[1].blue)) {
+		if (fore[0].val == pScreen->blackPixel)
+		    fore[0].val = pScreen->whitePixel;
+		else
+		    fore[0].val = pScreen->blackPixel;
+	    }
 	}
     }
     fore[1].val = FillSolid;
diff --git a/fb/fbcmap.c b/fb/fbcmap.c
index c29a513..207c6ae 100644
--- a/fb/fbcmap.c
+++ b/fb/fbcmap.c
@@ -85,8 +85,10 @@ fbUninstallColormap(ColormapPtr pmap)
     {
 	if (pmap->mid != pmap->pScreen->defColormap)
 	{
-	    curpmap = (ColormapPtr) LookupIDByType(pmap->pScreen->defColormap,
-						   RT_COLORMAP);
+	    dixLookupResourceByType((pointer *)&curpmap,
+				    pmap->pScreen->defColormap,
+				    RT_COLORMAP,
+				    serverClient, DixInstallAccess);
 	    (*pmap->pScreen->InstallColormap)(curpmap);
 	}
     }
diff --git a/hw/kdrive/src/kcmap.c b/hw/kdrive/src/kcmap.c
index 4941ad1..2c33e79 100644
--- a/hw/kdrive/src/kcmap.c
+++ b/hw/kdrive/src/kcmap.c
@@ -217,7 +217,8 @@ KdUninstallColormap (ColormapPtr pCmap)
 	return;
 
     /* install default if on same fb */
-    defMap = (ColormapPtr) LookupIDByType(defMapID, RT_COLORMAP);
+    dixLookupResourceByType((pointer *)&defMap, defMapID, RT_COLORMAP,
+			    serverClient, DixInstallAccess);
     if (defMap && KdColormapFb (defMap) == fb)
 	(*pCmap->pScreen->InstallColormap)(defMap);
     else
diff --git a/hw/vfb/InitOutput.c b/hw/vfb/InitOutput.c
index af3e8f1..8ab8bae 100644
--- a/hw/vfb/InitOutput.c
+++ b/hw/vfb/InitOutput.c
@@ -508,8 +508,10 @@ vfbUninstallColormap(ColormapPtr pmap)
     {
 	if (pmap->mid != pmap->pScreen->defColormap)
 	{
-	    curpmap = (ColormapPtr) LookupIDByType(pmap->pScreen->defColormap,
-						   RT_COLORMAP);
+	    dixLookupResourceByType((pointer *)&curpmap,
+				    pmap->pScreen->defColormap,
+				    RT_COLORMAP, serverClient,
+				    DixInstallAccess);
 	    (*pmap->pScreen->InstallColormap)(curpmap);
 	}
     }
diff --git a/hw/xfree86/common/xf86cmap.c b/hw/xfree86/common/xf86cmap.c
index a627b53..7e73bb8 100644
--- a/hw/xfree86/common/xf86cmap.c
+++ b/hw/xfree86/common/xf86cmap.c
@@ -211,8 +211,8 @@ Bool xf86HandleColormaps(
     ComputeGamma(pScreenPriv);
 
     /* get the default map */
-
-    pDefMap = (ColormapPtr) LookupIDByType(pScreen->defColormap, RT_COLORMAP);
+    dixLookupResourceByType((pointer *)&pDefMap, pScreen->defColormap,
+			    RT_COLORMAP, serverClient, DixInstallAccess);
     
     if(!CMapAllocateColormapPrivate(pDefMap)) {
         CMapUnwrapScreen(pScreen);
diff --git a/hw/xfree86/dixmods/extmod/xf86dga2.c b/hw/xfree86/dixmods/extmod/xf86dga2.c
index 868fb06..46aa8b8 100644
--- a/hw/xfree86/dixmods/extmod/xf86dga2.c
+++ b/hw/xfree86/dixmods/extmod/xf86dga2.c
@@ -420,6 +420,7 @@ static int
 ProcXDGAInstallColormap(ClientPtr client)
 {
     ColormapPtr cmap;
+    int rc;
     REQUEST(xXDGAInstallColormapReq);
 
     if (stuff->screen > screenInfo.numScreens)
@@ -430,13 +431,13 @@ ProcXDGAInstallColormap(ClientPtr client)
 
     REQUEST_SIZE_MATCH(xXDGAInstallColormapReq);
 
-    cmap = (ColormapPtr)LookupIDByType(stuff->cmap, RT_COLORMAP);
-    if (cmap) {
+    rc = dixLookupResourceByType((pointer *)&cmap, stuff->cmap, RT_COLORMAP,
+				 client, DixInstallAccess);
+    if (rc == Success) {
         DGAInstallCmap(cmap);
         return (client->noClientException);
     } else {
-        client->errorValue = stuff->cmap;
-        return (BadColor);
+        return (rc == BadValue) ? BadColor : rc;
     }
 
     return (client->noClientException);
@@ -858,6 +859,7 @@ static int
 ProcXF86DGAInstallColormap(ClientPtr client)
 {
     ColormapPtr pcmp;
+    int rc;
     REQUEST(xXF86DGAInstallColormapReq);
 
     if (stuff->screen > screenInfo.numScreens)
@@ -871,13 +873,13 @@ ProcXF86DGAInstallColormap(ClientPtr client)
     if (!DGAActive(stuff->screen))
 	return (DGAErrorBase + XF86DGADirectNotActivated);
 
-    pcmp = (ColormapPtr  )LookupIDByType(stuff->id, RT_COLORMAP);
-    if (pcmp) {
+    rc = dixLookupResourceByType((pointer *)&pcmp, stuff->id, RT_COLORMAP,
+				 client, DixInstallAccess);
+    if (rc == Success) {
 	DGAInstallCmap(pcmp);
         return (client->noClientException);
     } else {
-        client->errorValue = stuff->id;
-        return (BadColor);
+        return (rc == BadValue) ? BadColor : rc;
     }
 }
 
diff --git a/hw/xfree86/dri/dri.c b/hw/xfree86/dri/dri.c
index c01686d..3af9878 100644
--- a/hw/xfree86/dri/dri.c
+++ b/hw/xfree86/dri/dri.c
@@ -1363,11 +1363,12 @@ Bool
 DRIDrawablePrivDelete(pointer pResource, XID id)
 {
     WindowPtr pWin;
+    int rc;
 
     id = (XID)pResource;
-    pWin = LookupIDByType(id, RT_WINDOW);
+    rc = dixLookupWindow(&pWin, id, serverClient, DixGetAttrAccess);
 
-    if (pWin) {
+    if (rc == Success) {
 	DRIDrawablePrivPtr pDRIDrwPriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
 
 	if (!pDRIDrwPriv)
diff --git a/hw/xfree86/vgahw/vgaCmap.c b/hw/xfree86/vgahw/vgaCmap.c
index 44043c6..095e480 100644
--- a/hw/xfree86/vgahw/vgaCmap.c
+++ b/hw/xfree86/vgahw/vgaCmap.c
@@ -277,8 +277,8 @@ vgaUninstallColormap(pmap)
   if ( pmap != miInstalledMaps[pmap->pScreen->myNum] )
     return;
 
-  defColormap = (ColormapPtr) LookupIDByType( pmap->pScreen->defColormap,
-					      RT_COLORMAP);
+  dixLookupResourceByType((pointer *)&defColormap, pmap->pScreen->defColormap,
+			  RT_COLORMAP, serverClient, DixInstallAccess);
 
   if (defColormap == miInstalledMaps[pmap->pScreen->myNum])
     return;
diff --git a/hw/xnest/Color.c b/hw/xnest/Color.c
index 5ba0bdb..dc74947 100644
--- a/hw/xnest/Color.c
+++ b/hw/xnest/Color.c
@@ -242,16 +242,16 @@ xnestSetInstalledColormapWindows(ScreenPtr pScreen)
 	WindowPtr pWin;
 	Visual *visual;
 	ColormapPtr pCmap;
-	
+
 	pWin = xnestWindowPtr(icws.windows[0]);
 	visual = xnestVisualFromID(pScreen, wVisual(pWin));
 	
 	if (visual == xnestDefaultVisual(pScreen))
-	  pCmap = (ColormapPtr)LookupIDByType(wColormap(pWin), 
-					      RT_COLORMAP);
+	    dixLookupResourceByType((pointer *)&pCmap, wColormap(pWin),
+				    RT_COLORMAP, serverClient, DixUseAccess);
 	else
-	  pCmap = (ColormapPtr)LookupIDByType(pScreen->defColormap, 
-					      RT_COLORMAP);
+	    dixLookupResourceByType((pointer *)&pCmap, pScreen->defColormap,
+				    RT_COLORMAP, serverClient, DixUseAccess);
 	
 	XSetWindowColormap(xnestDisplay, 
 			   xnestDefaultWindows[pScreen->myNum],
@@ -302,7 +302,8 @@ xnestDirectInstallColormaps(ScreenPtr pScreen)
   for (i = 0; i < n; i++) {
     ColormapPtr pCmap;
     
-    pCmap = (ColormapPtr)LookupIDByType(pCmapIDs[i], RT_COLORMAP);
+    dixLookupResourceByType((pointer *)&pCmap, pCmapIDs[i], RT_COLORMAP,
+			    serverClient, DixInstallAccess);
     if (pCmap)
       XInstallColormap(xnestDisplay, xnestColormap(pCmap));
   }
@@ -321,7 +322,8 @@ xnestDirectUninstallColormaps(ScreenPtr pScreen)
   for (i = 0; i < n; i++) {
     ColormapPtr pCmap;
     
-    pCmap = (ColormapPtr)LookupIDByType(pCmapIDs[i], RT_COLORMAP);
+    dixLookupResourceByType((pointer *)&pCmap, pCmapIDs[i], RT_COLORMAP,
+			    serverClient, DixUninstallAccess);
     if (pCmap)
       XUninstallColormap(xnestDisplay, xnestColormap(pCmap));
   }
@@ -365,8 +367,10 @@ xnestUninstallColormap(ColormapPtr pCmap)
     {
       if (pCmap->mid != pCmap->pScreen->defColormap)
         {
-	  pCurCmap = (ColormapPtr)LookupIDByType(pCmap->pScreen->defColormap,
-						 RT_COLORMAP);
+	  dixLookupResourceByType((pointer *)&pCurCmap,
+				  pCmap->pScreen->defColormap,
+				  RT_COLORMAP,
+				  serverClient, DixInstallAccess);
 	  (*pCmap->pScreen->InstallColormap)(pCurCmap);
         }
     }
diff --git a/hw/xnest/Window.c b/hw/xnest/Window.c
index ae3487f..48c870f 100644
--- a/hw/xnest/Window.c
+++ b/hw/xnest/Window.c
@@ -93,7 +93,8 @@ xnestCreateWindow(WindowPtr pWin)
 	visual = xnestVisualFromID(pWin->drawable.pScreen, wVisual(pWin));
 	mask |= CWColormap;
 	if (pWin->optional->colormap) {
-	  pCmap = (ColormapPtr)LookupIDByType(wColormap(pWin), RT_COLORMAP);
+	  dixLookupResourceByType((pointer *)&pCmap, wColormap(pWin),
+				  RT_COLORMAP, serverClient, DixUseAccess);
 	  attributes.colormap = xnestColormap(pCmap);
 	}
 	else
@@ -104,7 +105,8 @@ xnestCreateWindow(WindowPtr pWin)
     }
     else { /* root windows have their own colormaps at creation time */
       visual = xnestVisualFromID(pWin->drawable.pScreen, wVisual(pWin));      
-      pCmap = (ColormapPtr)LookupIDByType(wColormap(pWin), RT_COLORMAP);
+      dixLookupResourceByType((pointer *)&pCmap, wColormap(pWin),
+			      RT_COLORMAP, serverClient, DixUseAccess);
       mask |= CWColormap;
       attributes.colormap = xnestColormap(pCmap);
     }
@@ -338,7 +340,8 @@ xnestChangeWindowAttributes(WindowPtr pWin, unsigned long mask)
   if (mask & CWColormap) {
     ColormapPtr pCmap;
     
-    pCmap = (ColormapPtr)LookupIDByType(wColormap(pWin), RT_COLORMAP);
+    dixLookupResourceByType((pointer *)&pCmap, wColormap(pWin), RT_COLORMAP,
+			    serverClient, DixUseAccess);
 
     attributes.colormap = xnestColormap(pCmap);
 
diff --git a/mi/micmap.c b/mi/micmap.c
index 6318d67..1d26a52 100644
--- a/mi/micmap.c
+++ b/mi/micmap.c
@@ -87,8 +87,10 @@ miUninstallColormap(ColormapPtr pmap)
     {
 	if (pmap->mid != pmap->pScreen->defColormap)
 	{
-	    curpmap = (ColormapPtr) LookupIDByType(pmap->pScreen->defColormap,
-						   RT_COLORMAP);
+	    dixLookupResourceByType((pointer *)&curpmap,
+				    pmap->pScreen->defColormap,
+				    RT_COLORMAP, serverClient,
+				    DixUseAccess);
 	    (*pmap->pScreen->InstallColormap)(curpmap);
 	}
     }
diff --git a/mi/miexpose.c b/mi/miexpose.c
index 5746a5f..2c43d98 100644
--- a/mi/miexpose.c
+++ b/mi/miexpose.c
@@ -436,7 +436,7 @@ miSendExposures( WindowPtr pWin, RegionPtr pRgn, int dx, int dy)
 		return;
 	    }
 	    realWin = win->info[0].id;
-	    pWin = LookupIDByType(realWin, RT_WINDOW);
+	    dixLookupWindow(&pWin, realWin, serverClient, DixSendAccess);
 	}
 	if(x || y || scrnum)
 	  for (i = 0; i < numRects; i++) {
diff --git a/randr/randr.c b/randr/randr.c
index 07dd9e9..fd0a30a 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -279,7 +279,8 @@ RRFreeClient (pointer data, XID id)
 
     pRREvent = (RREventPtr) data;
     pWin = pRREvent->window;
-    pHead = (RREventPtr *) LookupIDByType(pWin->drawable.id, RREventType);
+    dixLookupResourceByType((pointer *)&pHead, pWin->drawable.id,
+			    RREventType, serverClient, DixDestroyAccess);
     if (pHead) {
 	pPrev = 0;
 	for (pCur = *pHead; pCur && pCur != pRREvent; pCur=pCur->next)
@@ -357,7 +358,8 @@ TellChanged (WindowPtr pWin, pointer value)
     rrScrPriv(pScreen);
     int				i;
 
-    pHead = (RREventPtr *) LookupIDByType (pWin->drawable.id, RREventType);
+    dixLookupResourceByType((pointer *)&pHead, pWin->drawable.id,
+			    RREventType, serverClient, DixReadAccess);
     if (!pHead)
 	return WT_WALKCHILDREN;
 
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 5e70aa3..af14374 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -340,15 +340,29 @@ extern _X_EXPORT RESTYPE RRClientType, RREventType; /* resource types for event
 extern _X_EXPORT DevPrivateKey RRClientPrivateKey;
 extern _X_EXPORT RESTYPE RRCrtcType, RRModeType, RROutputType;
 
-#define LookupOutput(client,id,a) ((RROutputPtr) \
-				   (SecurityLookupIDByType (client, id, \
-							    RROutputType, a)))
-#define LookupCrtc(client,id,a) ((RRCrtcPtr) \
-				 (SecurityLookupIDByType (client, id, \
-							  RRCrtcType, a)))
-#define LookupMode(client,id,a) ((RRModePtr) \
-				 (SecurityLookupIDByType (client, id, \
-							  RRModeType, a)))
+#define VERIFY_RR_OUTPUT(id, ptr, a)\
+    {\
+	int rc = dixLookupResourceByType((pointer *)&(ptr), id,\
+	                                 RROutputType, client, a);\
+	if (rc != Success)\
+	    return (rc == BadValue) ? RRErrorBase + BadRROutput : rc;\
+    }
+
+#define VERIFY_RR_CRTC(id, ptr, a)\
+    {\
+	int rc = dixLookupResourceByType((pointer *)&(ptr), id,\
+	                                 RRCrtcType, client, a);\
+	if (rc != Success)\
+	    return (rc == BadValue) ? RRErrorBase + BadRRCrtc : rc;\
+    }
+
+#define VERIFY_RR_MODE(id, ptr, a)\
+    {\
+	int rc = dixLookupResourceByType((pointer *)&(ptr), id,\
+	                                 RRModeType, client, a);\
+	if (rc != Success)\
+	    return (rc == BadValue) ? RRErrorBase + BadRRMode : rc;\
+    }
 
 #define GetRRClient(pClient)    ((RRClientPtr)dixLookupPrivate(&(pClient)->devPrivates, RRClientPrivateKey))
 #define rrClientPriv(pClient)	RRClientPtr pRRClient = GetRRClient(pClient)
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 7b724ae..287c211 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -658,10 +658,7 @@ ProcRRGetCrtcInfo (ClientPtr client)
     BoxRec			panned_area;
     
     REQUEST_SIZE_MATCH(xRRGetCrtcInfoReq);
-    crtc = LookupCrtc(client, stuff->crtc, DixReadAccess);
-
-    if (!crtc)
-	return RRErrorBase + BadRRCrtc;
+    VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
 
     /* All crtcs must be associated with screens before client
      * requests are processed
@@ -775,17 +772,13 @@ ProcRRSetCrtcConfig (ClientPtr client)
     TimeStamp		    configTime;
     TimeStamp		    time;
     Rotation		    rotation;
-    int			    i, j;
+    int			    rc, i, j;
     
     REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigReq);
     numOutputs = (stuff->length - (SIZEOF (xRRSetCrtcConfigReq) >> 2));
     
-    crtc = LookupIDByType (stuff->crtc, RRCrtcType);
-    if (!crtc)
-    {
-	client->errorValue = stuff->crtc;
-	return RRErrorBase + BadRRCrtc;
-    }
+    VERIFY_RR_CRTC(stuff->crtc, crtc, DixSetAttrAccess);
+
     if (stuff->mode == None)
     {
 	mode = NULL;
@@ -794,12 +787,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
     }
     else
     {
-	mode = LookupIDByType (stuff->mode, RRModeType);
-	if (!mode)
-	{
-	    client->errorValue = stuff->mode;
-	    return RRErrorBase + BadRRMode;
-	}
+	VERIFY_RR_MODE(stuff->mode, mode, DixSetAttrAccess);
 	if (numOutputs == 0)
 	    return BadMatch;
     }
@@ -815,13 +803,13 @@ ProcRRSetCrtcConfig (ClientPtr client)
     outputIds = (RROutput *) (stuff + 1);
     for (i = 0; i < numOutputs; i++)
     {
-	outputs[i] = (RROutputPtr) LookupIDByType (outputIds[i], RROutputType);
-	if (!outputs[i])
+	rc = dixLookupResourceByType((pointer *)(outputs + i), outputIds[i],
+				     RROutputType, client, DixSetAttrAccess);
+	if (rc != Success)
 	{
-	    client->errorValue = outputIds[i];
 	    if (outputs)
 		xfree (outputs);
-	    return RRErrorBase + BadRROutput;
+	    return (rc == BadValue) ? RRErrorBase + BadRROutput : rc;
 	}
 	/* validate crtc for this output */
 	for (j = 0; j < outputs[i]->numCrtcs; j++)
@@ -1027,10 +1015,7 @@ ProcRRGetPanning (ClientPtr client)
     int			n;
     
     REQUEST_SIZE_MATCH(xRRGetPanningReq);
-    crtc = LookupCrtc(client, stuff->crtc, DixReadAccess);
-
-    if (!crtc)
-	return RRErrorBase + BadRRCrtc;
+    VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
 
     /* All crtcs must be associated with screens before client
      * requests are processed
@@ -1100,11 +1085,7 @@ ProcRRSetPanning (ClientPtr client)
     int			n;
     
     REQUEST_SIZE_MATCH(xRRSetPanningReq);
-    crtc = LookupCrtc(client, stuff->crtc, DixReadAccess);
-
-    if (!crtc)
-	return RRErrorBase + BadRRCrtc;
-
+    VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
 
     /* All crtcs must be associated with screens before client
      * requests are processed
@@ -1175,9 +1156,7 @@ ProcRRGetCrtcGammaSize (ClientPtr client)
     int				n;
 
     REQUEST_SIZE_MATCH(xRRGetCrtcGammaSizeReq);
-    crtc = LookupCrtc (client, stuff->crtc, DixReadAccess);
-    if (!crtc)
-	return RRErrorBase + BadRRCrtc;
+    VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
 
     /* Gamma retrieval failed, any better error? */
     if (!RRCrtcGammaGet(crtc))
@@ -1207,9 +1186,7 @@ ProcRRGetCrtcGamma (ClientPtr client)
     char			*extra = NULL;
     
     REQUEST_SIZE_MATCH(xRRGetCrtcGammaReq);
-    crtc = LookupCrtc (client, stuff->crtc, DixReadAccess);
-    if (!crtc)
-	return RRErrorBase + BadRRCrtc;
+    VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
 
     /* Gamma retrieval failed, any better error? */
     if (!RRCrtcGammaGet(crtc))
@@ -1252,9 +1229,7 @@ ProcRRSetCrtcGamma (ClientPtr client)
     CARD16			*red, *green, *blue;
     
     REQUEST_AT_LEAST_SIZE(xRRSetCrtcGammaReq);
-    crtc = LookupCrtc (client, stuff->crtc, DixWriteAccess);
-    if (!crtc)
-	return RRErrorBase + BadRRCrtc;
+    VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
     
     len = client->req_len - (sizeof (xRRSetCrtcGammaReq) >> 2);
     if (len < (stuff->size * 3 + 1) >> 1)
@@ -1287,9 +1262,7 @@ ProcRRSetCrtcTransform (ClientPtr client)
     int			    nparams;
 
     REQUEST_AT_LEAST_SIZE(xRRSetCrtcTransformReq);
-    crtc = LookupCrtc (client, stuff->crtc, DixWriteAccess);
-    if (!crtc)
-	return RRErrorBase + BadRRCrtc;
+    VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
 
     PictTransform_from_xRenderTransform (&transform, &stuff->transform);
     pixman_f_transform_from_pixman_transform (&f_transform, &transform);
@@ -1372,9 +1345,7 @@ ProcRRGetCrtcTransform (ClientPtr client)
     char			*extra;
 
     REQUEST_SIZE_MATCH (xRRGetCrtcTransformReq);
-    crtc = LookupCrtc (client, stuff->crtc, DixWriteAccess);
-    if (!crtc)
-	return RRErrorBase + BadRRCrtc;
+    VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
 
     pending = &crtc->client_pending_transform;
     current = &crtc->client_current_transform;
diff --git a/randr/rrdispatch.c b/randr/rrdispatch.c
index 0925875..bec5b08 100644
--- a/randr/rrdispatch.c
+++ b/randr/rrdispatch.c
@@ -79,9 +79,10 @@ ProcRRSelectInput (ClientPtr client)
     rc = dixLookupWindow(&pWin, stuff->window, client, DixReceiveAccess);
     if (rc != Success)
 	return rc;
-    pHead = (RREventPtr *)SecurityLookupIDByType(client,
-						 pWin->drawable.id, RREventType,
-						 DixWriteAccess);
+    rc = dixLookupResourceByType((pointer *)&pHead, pWin->drawable.id,
+				 RREventType, client, DixWriteAccess);
+    if (rc != Success && rc != BadValue)
+	return rc;
 
     if (stuff->enable & (RRScreenChangeNotifyMask|
 			 RRCrtcChangeNotifyMask|
diff --git a/randr/rrmode.c b/randr/rrmode.c
index 2fa4403..2a10076 100644
--- a/randr/rrmode.c
+++ b/randr/rrmode.c
@@ -332,12 +332,8 @@ ProcRRDestroyMode (ClientPtr client)
     RRModePtr	mode;
     
     REQUEST_SIZE_MATCH(xRRDestroyModeReq);
-    mode = LookupIDByType (stuff->mode, RRModeType);
-    if (!mode)
-    {
-	client->errorValue = stuff->mode;
-	return RRErrorBase + BadRRMode;
-    }
+    VERIFY_RR_MODE(stuff->mode, mode, DixDestroyAccess);
+
     if (!mode->userScreen)
 	return BadMatch;
     if (mode->refcnt > 1)
@@ -354,20 +350,8 @@ ProcRRAddOutputMode (ClientPtr client)
     RROutputPtr	output;
     
     REQUEST_SIZE_MATCH(xRRAddOutputModeReq);
-    output = LookupOutput(client, stuff->output, DixReadAccess);
-
-    if (!output)
-    {
-	client->errorValue = stuff->output;
-	return RRErrorBase + BadRROutput;
-    }
-    
-    mode = LookupIDByType (stuff->mode, RRModeType);
-    if (!mode)
-    {
-	client->errorValue = stuff->mode;
-	return RRErrorBase + BadRRMode;
-    }
+    VERIFY_RR_OUTPUT(stuff->output, output, DixReadAccess);
+    VERIFY_RR_MODE(stuff->mode, mode, DixUseAccess);
     
     return RROutputAddUserMode (output, mode);
 }
@@ -380,20 +364,8 @@ ProcRRDeleteOutputMode (ClientPtr client)
     RROutputPtr	output;
     
     REQUEST_SIZE_MATCH(xRRDeleteOutputModeReq);
-    output = LookupOutput(client, stuff->output, DixReadAccess);
-
-    if (!output)
-    {
-	client->errorValue = stuff->output;
-	return RRErrorBase + BadRROutput;
-    }
-    
-    mode = LookupIDByType (stuff->mode, RRModeType);
-    if (!mode)
-    {
-	client->errorValue = stuff->mode;
-	return RRErrorBase + BadRRMode;
-    }
+    VERIFY_RR_OUTPUT(stuff->output, output, DixReadAccess);
+    VERIFY_RR_MODE(stuff->mode, mode, DixUseAccess);
     
     return RROutputDeleteUserMode (output, mode);
 }
diff --git a/randr/rroutput.c b/randr/rroutput.c
index 0ae7873..127497e 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -448,13 +448,7 @@ ProcRRGetOutputInfo (ClientPtr client)
     int				i, n;
     
     REQUEST_SIZE_MATCH(xRRGetOutputInfoReq);
-    output = LookupOutput(client, stuff->output, DixReadAccess);
-
-    if (!output)
-    {
-	client->errorValue = stuff->output;
-	return RRErrorBase + BadRROutput;
-    }
+    VERIFY_RR_OUTPUT(stuff->output, output, DixReadAccess);
 
     pScreen = output->pScreen;
     pScrPriv = rrGetScrPriv(pScreen);
@@ -569,24 +563,16 @@ ProcRRSetOutputPrimary(ClientPtr client)
     RROutputPtr output = NULL;
     WindowPtr pWin;
     rrScrPrivPtr pScrPriv;
+    int rc;
 
     REQUEST_SIZE_MATCH(xRRSetOutputPrimaryReq);
 
-    pWin = SecurityLookupIDByType(client, stuff->window, RT_WINDOW,
-				  DixReadAccess);
-
-    if (!pWin) {
-	client->errorValue = stuff->window;
-	return BadWindow;
-    }
+    rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+    if (rc != Success)
+	return rc;
 
     if (stuff->output) {
-	output = LookupOutput(client, stuff->output, DixReadAccess);
-
-	if (!output) {
-	    client->errorValue = stuff->output;
-	    return RRErrorBase + BadRROutput;
-	}
+	VERIFY_RR_OUTPUT(stuff->output, output, DixReadAccess);
 
 	if (output->pScreen != pWin->drawable.pScreen) {
 	    client->errorValue = stuff->window;
@@ -608,16 +594,13 @@ ProcRRGetOutputPrimary(ClientPtr client)
     rrScrPrivPtr pScrPriv;
     xRRGetOutputPrimaryReply rep;
     RROutputPtr primary = NULL;
+    int rc;
 
     REQUEST_SIZE_MATCH(xRRGetOutputPrimaryReq);
 
-    pWin = SecurityLookupIDByType(client, stuff->window, RT_WINDOW,
-				  DixReadAccess);
-
-    if (!pWin) {
-	client->errorValue = stuff->window;
-	return BadWindow;
-    }
+    rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+    if (rc != Success)
+	return rc;
 
     pScrPriv = rrGetScrPriv(pWin->drawable.pScreen);
     if (pScrPriv)
diff --git a/randr/rrproperty.c b/randr/rrproperty.c
index 12923a2..775d9e2 100644
--- a/randr/rrproperty.c
+++ b/randr/rrproperty.c
@@ -31,7 +31,8 @@ DeliverPropertyEvent(WindowPtr pWin, void *value)
     RREventPtr *pHead, pRREvent;
     ClientPtr client;
 
-    pHead = LookupIDByType(pWin->drawable.id, RREventType);
+    dixLookupResourceByType((pointer *)&pHead, pWin->drawable.id,
+			    RREventType, serverClient, DixReadAccess);
     if (!pHead)
 	return WT_WALKCHILDREN;
 
@@ -419,10 +420,7 @@ ProcRRListOutputProperties (ClientPtr client)
     
     REQUEST_SIZE_MATCH(xRRListOutputPropertiesReq);
 
-    output = LookupOutput (client, stuff->output, DixReadAccess);
-    
-    if (!output)
-        return RRErrorBase + BadRROutput;
+    VERIFY_RR_OUTPUT(stuff->output, output, DixReadAccess);
 
     for (prop = output->properties; prop; prop = prop->next)
 	numProps++;
@@ -466,10 +464,7 @@ ProcRRQueryOutputProperty (ClientPtr client)
     
     REQUEST_SIZE_MATCH(xRRQueryOutputPropertyReq);
 
-    output = LookupOutput (client, stuff->output, DixReadAccess);
-    
-    if (!output)
-        return RRErrorBase + BadRROutput;
+    VERIFY_RR_OUTPUT(stuff->output, output, DixReadAccess);
     
     prop = RRQueryOutputProperty (output, stuff->property);
     if (!prop)
@@ -513,10 +508,7 @@ ProcRRConfigureOutputProperty (ClientPtr client)
     
     REQUEST_AT_LEAST_SIZE(xRRConfigureOutputPropertyReq);
 
-    output = LookupOutput (client, stuff->output, DixReadAccess);
-    
-    if (!output)
-        return RRErrorBase + BadRROutput;
+    VERIFY_RR_OUTPUT(stuff->output, output, DixReadAccess);
     
     num_valid = stuff->length - (sizeof (xRRConfigureOutputPropertyReq) >> 2);
     return RRConfigureOutputProperty (output, stuff->property,
@@ -558,9 +550,7 @@ ProcRRChangeOutputProperty (ClientPtr client)
     totalSize = len * sizeInBytes;
     REQUEST_FIXED_SIZE(xRRChangeOutputPropertyReq, totalSize);
 
-    output = LookupOutput (client, stuff->output, DixWriteAccess);
-    if (!output)
-	return RRErrorBase + BadRROutput;
+    VERIFY_RR_OUTPUT(stuff->output, output, DixReadAccess);
     
     if (!ValidAtom(stuff->property))
     {
@@ -590,9 +580,7 @@ ProcRRDeleteOutputProperty (ClientPtr client)
               
     REQUEST_SIZE_MATCH(xRRDeleteOutputPropertyReq);
     UpdateCurrentTime();
-    output = LookupOutput (client, stuff->output, DixWriteAccess);
-    if (!output)
-        return RRErrorBase + BadRROutput;
+    VERIFY_RR_OUTPUT(stuff->output, output, DixReadAccess);
     
     if (!ValidAtom(stuff->property))
     {
@@ -619,11 +607,8 @@ ProcRRGetOutputProperty (ClientPtr client)
     REQUEST_SIZE_MATCH(xRRGetOutputPropertyReq);
     if (stuff->delete)
 	UpdateCurrentTime();
-    output = LookupOutput (client, stuff->output, 
-			   stuff->delete ? DixWriteAccess :
-			   DixReadAccess);
-    if (!output)
-	return RRErrorBase + BadRROutput;
+    VERIFY_RR_OUTPUT(stuff->output, output,
+		     stuff->delete ? DixWriteAccess : DixReadAccess);
 
     if (!ValidAtom(stuff->property))
     {
diff --git a/record/record.c b/record/record.c
index f97626f..cb7a627 100644
--- a/record/record.c
+++ b/record/record.c
@@ -127,11 +127,10 @@ static int numEnabledRCAPs;
  *  returns an error.
  */
 #define VERIFY_CONTEXT(_pContext, _contextid, _client) { \
-    (_pContext) = (RecordContextPtr)LookupIDByType((_contextid), RTContext); \
-    if (!(_pContext)) { \
-        (_client)->errorValue = (_contextid); \
-	return RecordErrorBase + XRecordBadContext; \
-    } \
+    int rc = dixLookupResourceByType((pointer *)&(_pContext), _contextid, \
+                                     RTContext, _client, DixUseAccess); \
+    if (rc != Success) \
+	return (rc == BadValue) ? RecordErrorBase + XRecordBadContext : rc; \
 }
 
 static int RecordDeleteContext(
diff --git a/render/picture.c b/render/picture.c
index 462125f..5f86c7c 100644
--- a/render/picture.c
+++ b/render/picture.c
@@ -410,8 +410,9 @@ PictureInitIndexedFormat(ScreenPtr pScreen, PictFormatPtr format)
 	return TRUE;
 
     if (format->index.vid == pScreen->rootVisual) {
-	format->index.pColormap =
-	    (ColormapPtr) LookupIDByType(pScreen->defColormap, RT_COLORMAP);
+	dixLookupResourceByType((pointer *)&format->index.pColormap,
+				pScreen->defColormap, RT_COLORMAP,
+				serverClient, DixGetAttrAccess);
     } else {
 	VisualPtr pVisual = PictureFindVisual(pScreen, format->index.vid);
 	if (CreateColormap(FakeClientID (0), pScreen, pVisual,
diff --git a/render/picturestr.h b/render/picturestr.h
index 194db11..6a1cc06 100644
--- a/render/picturestr.h
+++ b/render/picturestr.h
@@ -409,11 +409,10 @@ extern _X_EXPORT RESTYPE	GlyphSetType;
 #define SetPictureWindow(w,p) dixSetPrivate(&(w)->devPrivates, PictureWindowPrivateKey, p)
 
 #define VERIFY_PICTURE(pPicture, pid, client, mode, err) {\
-    pPicture = SecurityLookupIDByType(client, pid, PictureType, mode);\
-    if (!pPicture) { \
-	client->errorValue = pid; \
-	return err; \
-    } \
+    int rc = dixLookupResourceByType((pointer)&(pPicture), pid,\
+	                             PictureType, client, mode);\
+    if (rc != Success)\
+	return (rc == BadValue) ? err : rc;\
 }
 
 #define VERIFY_ALPHA(pPicture, pid, client, mode, err) {\
diff --git a/render/render.c b/render/render.c
index 270b8fb..8487b60 100644
--- a/render/render.c
+++ b/render/render.c
@@ -509,7 +509,7 @@ static int
 ProcRenderQueryPictIndexValues (ClientPtr client)
 {
     PictFormatPtr   pFormat;
-    int		    num;
+    int		    rc, num;
     int		    rlength;
     int		    i, n;
     REQUEST(xRenderQueryPictIndexValuesReq);
@@ -518,16 +518,11 @@ ProcRenderQueryPictIndexValues (ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xRenderQueryPictIndexValuesReq);
 
-    pFormat = (PictFormatPtr) SecurityLookupIDByType (client, 
-						      stuff->format,
-						      PictFormatType,
-						      DixReadAccess);
+    rc = dixLookupResourceByType((pointer *)&pFormat, stuff->format,
+				 PictFormatType, client, DixReadAccess);
+    if (rc != Success)
+	return (rc == BadValue) ? RenderErrBase + BadPictFormat : rc;
 
-    if (!pFormat)
-    {
-	client->errorValue = stuff->format;
-	return RenderErrBase + BadPictFormat;
-    }
     if (pFormat->type != PictTypeIndexed)
     {
 	client->errorValue = stuff->format;
@@ -592,15 +587,11 @@ ProcRenderCreatePicture (ClientPtr client)
     if (rc != Success)
 	return rc;
 
-    pFormat = (PictFormatPtr) SecurityLookupIDByType (client, 
-						      stuff->format,
-						      PictFormatType,
-						      DixReadAccess);
-    if (!pFormat)
-    {
-	client->errorValue = stuff->format;
-	return RenderErrBase + BadPictFormat;
-    }
+    rc = dixLookupResourceByType((pointer *)&pFormat, stuff->format,
+				 PictFormatType, client, DixReadAccess);
+    if (rc != Success)
+	return (rc == BadValue) ? RenderErrBase + BadPictFormat : rc;
+
     if (pFormat->depth != pDrawable->depth)
 	return BadMatch;
     len = client->req_len - (sizeof(xRenderCreatePictureReq) >> 2);
@@ -740,7 +731,7 @@ ProcRenderScale (ClientPtr client)
 static int
 ProcRenderTrapezoids (ClientPtr client)
 {
-    int		ntraps;
+    int		rc, ntraps;
     PicturePtr	pSrc, pDst;
     PictFormatPtr   pFormat;
     REQUEST(xRenderTrapezoidsReq);
@@ -761,15 +752,10 @@ ProcRenderTrapezoids (ClientPtr client)
 	return BadMatch;
     if (stuff->maskFormat)
     {
-	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
-							  stuff->maskFormat,
-							  PictFormatType,
-							  DixReadAccess);
-	if (!pFormat)
-	{
-	    client->errorValue = stuff->maskFormat;
-	    return RenderErrBase + BadPictFormat;
-	}
+	rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
+				     PictFormatType, client, DixReadAccess);
+	if (rc != Success)
+	    return (rc == BadValue) ? RenderErrBase + BadPictFormat : rc;
     }
     else
 	pFormat = 0;
@@ -787,7 +773,7 @@ ProcRenderTrapezoids (ClientPtr client)
 static int
 ProcRenderTriangles (ClientPtr client)
 {
-    int		ntris;
+    int		rc, ntris;
     PicturePtr	pSrc, pDst;
     PictFormatPtr   pFormat;
     REQUEST(xRenderTrianglesReq);
@@ -808,15 +794,10 @@ ProcRenderTriangles (ClientPtr client)
 	return BadMatch;
     if (stuff->maskFormat)
     {
-	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
-							  stuff->maskFormat,
-							  PictFormatType,
-							  DixReadAccess);
-	if (!pFormat)
-	{
-	    client->errorValue = stuff->maskFormat;
-	    return RenderErrBase + BadPictFormat;
-	}
+	rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
+				     PictFormatType, client, DixReadAccess);
+	if (rc != Success)
+	    return (rc == BadValue) ? RenderErrBase + BadPictFormat : rc;
     }
     else
 	pFormat = 0;
@@ -834,7 +815,7 @@ ProcRenderTriangles (ClientPtr client)
 static int
 ProcRenderTriStrip (ClientPtr client)
 {
-    int		npoints;
+    int		rc, npoints;
     PicturePtr	pSrc, pDst;
     PictFormatPtr   pFormat;
     REQUEST(xRenderTrianglesReq);
@@ -855,15 +836,10 @@ ProcRenderTriStrip (ClientPtr client)
 	return BadMatch;
     if (stuff->maskFormat)
     {
-	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
-							  stuff->maskFormat,
-							  PictFormatType,
-							  DixReadAccess);
-	if (!pFormat)
-	{
-	    client->errorValue = stuff->maskFormat;
-	    return RenderErrBase + BadPictFormat;
-	}
+	rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
+				     PictFormatType, client, DixReadAccess);
+	if (rc != Success)
+	    return (rc == BadValue) ? RenderErrBase + BadPictFormat : rc;
     }
     else
 	pFormat = 0;
@@ -881,7 +857,7 @@ ProcRenderTriStrip (ClientPtr client)
 static int
 ProcRenderTriFan (ClientPtr client)
 {
-    int		npoints;
+    int		rc, npoints;
     PicturePtr	pSrc, pDst;
     PictFormatPtr   pFormat;
     REQUEST(xRenderTrianglesReq);
@@ -902,15 +878,10 @@ ProcRenderTriFan (ClientPtr client)
 	return BadMatch;
     if (stuff->maskFormat)
     {
-	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
-							  stuff->maskFormat,
-							  PictFormatType,
-							  DixReadAccess);
-	if (!pFormat)
-	{
-	    client->errorValue = stuff->maskFormat;
-	    return RenderErrBase + BadPictFormat;
-	}
+	rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
+				     PictFormatType, client, DixReadAccess);
+	if (rc != Success)
+	    return (rc == BadValue) ? RenderErrBase + BadPictFormat : rc;
     }
     else
 	pFormat = 0;
@@ -954,15 +925,11 @@ ProcRenderCreateGlyphSet (ClientPtr client)
     REQUEST_SIZE_MATCH(xRenderCreateGlyphSetReq);
 
     LEGAL_NEW_RESOURCE(stuff->gsid, client);
-    format = (PictFormatPtr) SecurityLookupIDByType (client,
-						     stuff->format,
-						     PictFormatType,
-						     DixReadAccess);
-    if (!format)
-    {
-	client->errorValue = stuff->format;
-	return RenderErrBase + BadPictFormat;
-    }
+    rc = dixLookupResourceByType((pointer *)&format, stuff->format,
+				 PictFormatType, client, DixReadAccess);
+    if (rc != Success)
+	return (rc == BadValue) ? RenderErrBase + BadPictFormat : rc;
+
     switch (format->depth) {
     case 1:
 	f = GlyphFormat1;
@@ -1300,7 +1267,7 @@ ProcRenderCompositeGlyphs (ClientPtr client)
     int		    nlist;
     int		    space;
     int		    size;
-    int		    n;
+    int		    rc, n;
     
     REQUEST(xRenderCompositeGlyphsReq);
 
@@ -1327,28 +1294,18 @@ ProcRenderCompositeGlyphs (ClientPtr client)
 	return BadMatch;
     if (stuff->maskFormat)
     {
-	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
-							  stuff->maskFormat,
-							  PictFormatType,
-							  DixReadAccess);
-	if (!pFormat)
-	{
-	    client->errorValue = stuff->maskFormat;
-	    return RenderErrBase + BadPictFormat;
-	}
+	rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
+				     PictFormatType, client, DixReadAccess);
+	if (rc != Success)
+	    return (rc == BadValue) ? RenderErrBase + BadPictFormat : rc;
     }
     else
 	pFormat = 0;
 
-    glyphSet = (GlyphSetPtr) SecurityLookupIDByType (client,
-						     stuff->glyphset,
-						     GlyphSetType,
-						     DixUseAccess);
-    if (!glyphSet)
-    {
-	client->errorValue = stuff->glyphset;
-	return RenderErrBase + BadGlyphSet;
-    }
+    rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset,
+				 GlyphSetType, client, DixUseAccess);
+    if (rc != Success)
+	return (rc == BadValue) ? RenderErrBase + BadGlyphSet : rc;
 
     buffer = (CARD8 *) (stuff + 1);
     end = (CARD8 *) stuff + (client->req_len << 2);
@@ -1402,18 +1359,16 @@ ProcRenderCompositeGlyphs (ClientPtr client)
 	    if (buffer + sizeof (GlyphSet) < end)
 	    {
                 memcpy(&gs, buffer, sizeof(GlyphSet));
-		glyphSet = (GlyphSetPtr) SecurityLookupIDByType (client,
-								 gs,
-								 GlyphSetType,
-								 DixUseAccess);
-		if (!glyphSet)
+		rc = dixLookupResourceByType((pointer *)&glyphSet, gs,
+					     GlyphSetType, client,
+					     DixUseAccess);
+		if (rc != Success)
 		{
-		    client->errorValue = gs;
 		    if (glyphsBase != glyphsLocal)
 			xfree (glyphsBase);
 		    if (listsBase != listsLocal)
 			xfree (listsBase);
-		    return RenderErrBase + BadGlyphSet;
+		    return (rc == BadValue) ? RenderErrBase + BadGlyphSet : rc;
 		}
 	    }
 	    buffer += 4;
@@ -1902,13 +1857,12 @@ ProcRenderCreateAnimCursor (ClientPtr client)
     elt = (xAnimCursorElt *) (stuff + 1);
     for (i = 0; i < ncursor; i++)
     {
-	cursors[i] = (CursorPtr)SecurityLookupIDByType(client, elt->cursor,
-						       RT_CURSOR, DixReadAccess);
-	if (!cursors[i])
+	ret = dixLookupResourceByType((pointer *)(cursors + 1), elt->cursor,
+				      RT_CURSOR, client, DixReadAccess);
+	if (ret != Success)
 	{
 	    xfree (cursors);
-	    client->errorValue = elt->cursor;
-	    return BadCursor;
+	    return (ret == BadValue) ? BadCursor : ret;
 	}
 	deltas[i] = elt->delay;
 	elt++;
@@ -2689,11 +2643,10 @@ SProcRenderDispatch (ClientPtr client)
 #include "panoramiXsrv.h"
 
 #define VERIFY_XIN_PICTURE(pPicture, pid, client, mode, err) {\
-    pPicture = SecurityLookupIDByType(client, pid, XRT_PICTURE, mode);\
-    if (!pPicture) { \
-	client->errorValue = pid; \
-	return err; \
-    } \
+    int rc = dixLookupResourceByType((pointer *)&(pPicture), pid,\
+                                     XRT_PICTURE, client, mode);\
+    if (rc != Success)\
+	return (rc == BadValue) ? err : rc;\
 }
 
 #define VERIFY_XIN_ALPHA(pPicture, pid, client, mode, err) {\
@@ -2713,12 +2666,13 @@ PanoramiXRenderCreatePicture (ClientPtr client)
 {
     REQUEST(xRenderCreatePictureReq);
     PanoramiXRes    *refDraw, *newPict;
-    int		    result = Success, j;
+    int		    result, j;
 
     REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
-    if(!(refDraw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
-	return BadDrawable;
+    result = dixLookupResourceByClass((pointer *)&refDraw, stuff->drawable,
+				      XRC_DRAWABLE, client, DixWriteAccess);
+    if (result != Success)
+	return (result == BadValue) ? BadDrawable : result;
     if(!(newPict = (PanoramiXRes *) xalloc(sizeof(PanoramiXRes))))
 	return BadAlloc;
     newPict->type = XRT_PICTURE;
diff --git a/xfixes/cursor.c b/xfixes/cursor.c
index eb83cfe..6fa2dff 100644
--- a/xfixes/cursor.c
+++ b/xfixes/cursor.c
@@ -203,6 +203,8 @@ XFixesSelectCursorInput (ClientPtr	pClient,
 			 CARD32		eventMask)
 {
     CursorEventPtr	*prev, e;
+    pointer val;
+    int rc;
 
     for (prev = &cursorEvents; (e = *prev); prev = &e->next)
     {
@@ -235,7 +237,10 @@ XFixesSelectCursorInput (ClientPtr	pClient,
 	 * Add a resource hanging from the window to
 	 * catch window destroy
 	 */
-	if (!LookupIDByType(pWindow->drawable.id, CursorWindowType))
+	rc = dixLookupResourceByType( &val, pWindow->drawable.id,
+				      CursorWindowType, serverClient,
+				      DixGetAttrAccess);
+	if (rc != Success)
 	    if (!AddResource (pWindow->drawable.id, CursorWindowType,
 			      (pointer) pWindow))
 	    {
diff --git a/xfixes/select.c b/xfixes/select.c
index 795b8bd..a5811bd 100644
--- a/xfixes/select.c
+++ b/xfixes/select.c
@@ -133,6 +133,7 @@ XFixesSelectSelectionInput (ClientPtr	pClient,
 			    WindowPtr	pWindow,
 			    CARD32	eventMask)
 {
+    pointer val;
     int rc;
     SelectionEventPtr	*prev, e;
 
@@ -173,7 +174,10 @@ XFixesSelectSelectionInput (ClientPtr	pClient,
 	 * Add a resource hanging from the window to
 	 * catch window destroy
 	 */
-	if (!LookupIDByType(pWindow->drawable.id, SelectionWindowType))
+	rc = dixLookupResourceByType (&val, pWindow->drawable.id,
+				      SelectionWindowType, serverClient,
+				      DixGetAttrAccess);
+	if (rc != Success)
 	    if (!AddResource (pWindow->drawable.id, SelectionWindowType,
 			      (pointer) pWindow))
 	    {
commit 1abe0ee3da5e1268c7315f841d31337ea6524cf0
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Tue Apr 28 23:51:40 2009 -0400

    kdrive: fix Xvfb build with separate libmain.

diff --git a/configure.ac b/configure.ac
index 2151ed1..3fc4dd4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1843,7 +1843,7 @@ if test "$KDRIVE" = yes; then
 	    ;;
     esac
     KDRIVE_STUB_LIB='$(top_builddir)/hw/kdrive/src/libkdrivestubs.la'
-    KDRIVE_LOCAL_LIBS="$DIX_LIB $MAIN_LIB $KDRIVE_LIB $KDRIVE_STUB_LIB $CONFIG_LIB"
+    KDRIVE_LOCAL_LIBS="$MAIN_LIB $DIX_LIB $KDRIVE_LIB $KDRIVE_STUB_LIB $CONFIG_LIB"
     KDRIVE_LOCAL_LIBS="$KDRIVE_LOCAL_LIBS $FB_LIB $MI_LIB $KDRIVE_PURE_LIBS"
     KDRIVE_LOCAL_LIBS="$KDRIVE_LOCAL_LIBS $KDRIVE_OS_LIB $OS_LIB"
     KDRIVE_LIBS="$TSLIB_LIBS $KDRIVE_LOCAL_LIBS $XSERVER_SYS_LIBS $GLX_SYS_LIBS"
commit 98a1fa994158feca8bc80a10296a7675465c0e56
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Apr 21 22:18:23 2009 +1000

    test: add InternalEvent to core event conversion tests.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/test/input.c b/test/input.c
index bcb4c57..eb0543e 100644
--- a/test/input.c
+++ b/test/input.c
@@ -32,6 +32,7 @@
 #include <X11/Xatom.h>
 #include "windowstr.h"
 #include "inputstr.h"
+#include "eventconvert.h"
 
 #include <glib.h>
 
@@ -72,12 +73,155 @@ static void dix_init_valuators(void)
     g_assert(dev.last.numValuators == num_axes);
 }
 
+
+/**
+ * Convert various internal events to the matching core event and verify the
+ * parameters.
+ */
+static void dix_event_to_core(int type)
+{
+    DeviceEvent ev;
+    xEvent core;
+    int time;
+    int x, y;
+    int rc;
+    int state;
+    int detail;
+
+    /* EventToCore memsets the event to 0 */
+#define test_event() \
+    g_assert(rc == Success); \
+    g_assert(core.u.u.type == type); \
+    g_assert(core.u.u.detail == detail); \
+    g_assert(core.u.keyButtonPointer.time == time); \
+    g_assert(core.u.keyButtonPointer.rootX == x); \
+    g_assert(core.u.keyButtonPointer.rootY == y); \
+    g_assert(core.u.keyButtonPointer.state == state); \
+    g_assert(core.u.keyButtonPointer.eventX == 0); \
+    g_assert(core.u.keyButtonPointer.eventY == 0); \
+    g_assert(core.u.keyButtonPointer.root == 0); \
+    g_assert(core.u.keyButtonPointer.event == 0); \
+    g_assert(core.u.keyButtonPointer.child == 0); \
+    g_assert(core.u.keyButtonPointer.sameScreen == FALSE);
+
+    x = 0;
+    y = 0;
+    time = 12345;
+    state = 0;
+    detail = 0;
+
+    ev.header   = 0xFF;
+    ev.length   = sizeof(DeviceEvent);
+    ev.time     = time;
+    ev.root_y   = x;
+    ev.root_x   = y;
+    ev.corestate = state;
+    ev.detail.key = detail;
+
+    ev.type = type;
+    ev.detail.key = 0;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    test_event();
+
+    x = 1;
+    y = 2;
+    ev.root_x = x;
+    ev.root_y = y;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    test_event();
+
+    x = 0x7FFF;
+    y = 0x7FFF;
+    ev.root_x = x;
+    ev.root_y = y;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    test_event();
+
+    x = 0x8000; /* too high */
+    y = 0x8000; /* too high */
+    ev.root_x = x;
+    ev.root_y = y;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    g_assert(core.u.keyButtonPointer.rootX != x);
+    g_assert(core.u.keyButtonPointer.rootY != y);
+
+    x = 0x7FFF;
+    y = 0x7FFF;
+    ev.root_x = x;
+    ev.root_y = y;
+    time = 0;
+    ev.time = time;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    test_event();
+
+    detail = 1;
+    ev.detail.key = detail;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    test_event();
+
+    detail = 0xFF; /* highest value */
+    ev.detail.key = detail;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    test_event();
+
+    detail = 0xFFF; /* too big */
+    ev.detail.key = detail;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    g_assert(rc == BadMatch);
+
+    detail = 0xFF; /* too big */
+    ev.detail.key = detail;
+    state = 0xFFFF; /* highest value */
+    ev.corestate = state;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    test_event();
+
+    state = 0x10000; /* too big */
+    ev.corestate = state;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    g_assert(core.u.keyButtonPointer.state != state);
+    g_assert(core.u.keyButtonPointer.state == (state & 0xFFFF));
+
+#undef test_event
+}
+
+static void dix_event_to_core_conversion(void)
+{
+    DeviceEvent ev;
+    xEvent core;
+    int rc;
+
+    ev.header   = 0xFF;
+    ev.length   = sizeof(DeviceEvent);
+
+    ev.type     = 0;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    g_assert(rc == BadImplementation);
+
+    ev.type     = 1;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    g_assert(rc == BadImplementation);
+
+    ev.type     = ET_ProximityOut + 1;
+    rc = EventToCore((InternalEvent*)&ev, &core);
+    g_assert(rc == BadImplementation);
+
+    dix_event_to_core(ET_KeyPress);
+    dix_event_to_core(ET_KeyRelease);
+    dix_event_to_core(ET_ButtonPress);
+    dix_event_to_core(ET_ButtonRelease);
+    dix_event_to_core(ET_Motion);
+    dix_event_to_core(ET_ProximityIn);
+    dix_event_to_core(ET_ProximityOut);
+}
+
 int main(int argc, char** argv)
 {
     g_test_init(&argc, &argv,NULL);
     g_test_bug_base("https://bugzilla.freedesktop.org/show_bug.cgi?id=");
 
     g_test_add_func("/dix/input/init-valuators", dix_init_valuators);
+    g_test_add_func("/dix/input/event-core-conversion", dix_event_to_core_conversion);
 
     return g_test_run();
 }
commit 990e8362a76fadc173e890d9052a2e5274b6eac5
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Apr 16 11:41:58 2009 +1000

    test: add a simple test to verify device axis intialization.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/test/Makefile.am b/test/Makefile.am
index 5b1daac..dbad93b 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -1,5 +1,5 @@
 if UNITTESTS
-check_PROGRAMS = xkb
+check_PROGRAMS = xkb input
 check_LTLIBRARIES = libxservertest.la
 
 TESTS=$(check_PROGRAMS)
@@ -9,7 +9,7 @@ INCLUDES = @XORG_INCS@
 TEST_LDADD=libxservertest.la $(XORG_SYS_LIBS) $(XSERVER_SYS_LIBS) $(GLIB_LIBS)
 
 xkb_LDADD=$(TEST_LDADD)
-
+input_LDADD=$(TEST_LDADD)
 
 libxservertest_la_LIBADD = \
             $(XSERVER_LIBS) \
diff --git a/test/input.c b/test/input.c
new file mode 100644
index 0000000..bcb4c57
--- /dev/null
+++ b/test/input.c
@@ -0,0 +1,83 @@
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ *  Permission is hereby granted, free of charge, to any person obtaining a
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ *  Software is furnished to do so, subject to the following conditions:
+ *
+ *  The above copyright notice and this permission notice (including the next
+ *  paragraph) shall be included in all copies or substantial portions of the
+ *  Software.
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *  DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include "misc.h"
+#include "resource.h"
+#include <X11/Xproto.h>
+#include <X11/Xatom.h>
+#include "windowstr.h"
+#include "inputstr.h"
+
+#include <glib.h>
+
+/**
+ * Init a device with axes.
+ * Verify values set on the device.
+ *
+ * Result: All axes set to default values (usually 0).
+ */
+static void dix_init_valuators(void)
+{
+    DeviceIntRec dev;
+    ValuatorClassPtr val;
+    const int num_axes = 2;
+    int i;
+
+
+    memset(&dev, 0, sizeof(DeviceIntRec));
+    dev.isMaster = TRUE; /* claim it's a master to stop ptracccel */
+
+    g_assert(InitValuatorClassDeviceStruct(NULL, 0, 0, 0) == FALSE);
+    g_assert(InitValuatorClassDeviceStruct(&dev, num_axes, 0, Absolute));
+
+    val = dev.valuator;
+    g_assert(val);
+    g_assert(val->numAxes == num_axes);
+    g_assert(val->numMotionEvents == 0);
+    g_assert(val->mode == Absolute);
+    g_assert(val->axisVal);
+
+    for (i = 0; i < num_axes; i++)
+    {
+        g_assert(val->axisVal[i] == 0);
+        g_assert(val->axes->min_value == NO_AXIS_LIMITS);
+        g_assert(val->axes->max_value == NO_AXIS_LIMITS);
+    }
+
+    g_assert(dev.last.numValuators == num_axes);
+}
+
+int main(int argc, char** argv)
+{
+    g_test_init(&argc, &argv,NULL);
+    g_test_bug_base("https://bugzilla.freedesktop.org/show_bug.cgi?id=");
+
+    g_test_add_func("/dix/input/init-valuators", dix_init_valuators);
+
+    return g_test_run();
+}
commit 4eac0df060b897470fb01cfd3b70f500da757c74
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Apr 15 17:21:08 2009 +1000

    Add a test-suite for in-server unit-testing.
    
    This patch adds a test/ directory that contains the setup for a unit-testing
    suite designed for in-server unit-testing. All functions available to the X
    server are available to the test binaries through static linking.
    
    This test suite uses the glib testing framework.
    Do not use glib calls outside of the test/ directory.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/configure.ac b/configure.ac
index d907e88..d95b2e8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -439,6 +439,9 @@ AC_ARG_ENABLE(werror,        AS_HELP_STRING([--enable-werror],
 AC_ARG_ENABLE(debug,         AS_HELP_STRING([--enable-debug],
 				  [Enable debugging (default: disabled)]),
 			        [DEBUGGING=$enableval], [DEBUGGING=no])
+AC_ARG_ENABLE(unit-tests,    AS_HELP_STRING([--enable-unit-tests],
+                                  [Enable unit-tests (default: enabled)]),
+                                [UNITTESTS=$enableval], [UNITTESTS=yes])
 AC_ARG_WITH(int10,           AS_HELP_STRING([--with-int10=BACKEND], [int10 backend: vm86, x86emu or stub]),
 				[INT10="$withval"],
 				[INT10="$DEFAULT_INT10"])
@@ -1141,6 +1144,14 @@ if test "x$DEBUGGING" = xyes; then
 fi
 AM_CONDITIONAL(DEBUG, [test "x$DEBUGGING" = xyes])
 
+if test "x$UNITTESTS" = xyes; then
+       AC_DEFINE(UNITTESTS, 1, [Enable unit tests])
+       PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.16])
+       AC_SUBST([GLIB_LIBS])
+       AC_SUBST([GLIB_CFLAGS])
+fi
+AM_CONDITIONAL(UNITTESTS, [test "x$UNITTESTS" = xyes])
+
 AC_DEFINE(XTEST, 1, [Support XTest extension])
 AC_DEFINE(XSYNC, 1, [Support XSync extension])
 AC_DEFINE(XCMISC, 1, [Support XCMisc extension])
@@ -1980,5 +1991,6 @@ hw/kdrive/fbdev/Makefile
 hw/kdrive/linux/Makefile
 hw/kdrive/sdl/Makefile
 hw/kdrive/src/Makefile
+test/Makefile
 xorg-server.pc
 ])
diff --git a/test/Makefile.am b/test/Makefile.am
new file mode 100644
index 0000000..5b1daac
--- /dev/null
+++ b/test/Makefile.am
@@ -0,0 +1,39 @@
+if UNITTESTS
+check_PROGRAMS = xkb
+check_LTLIBRARIES = libxservertest.la
+
+TESTS=$(check_PROGRAMS)
+
+AM_CFLAGS = $(DIX_CFLAGS) $(GLIB_CFLAGS) @XORG_CFLAGS@
+INCLUDES = @XORG_INCS@
+TEST_LDADD=libxservertest.la $(XORG_SYS_LIBS) $(XSERVER_SYS_LIBS) $(GLIB_LIBS)
+
+xkb_LDADD=$(TEST_LDADD)
+
+
+libxservertest_la_LIBADD = \
+            $(XSERVER_LIBS) \
+            $(top_builddir)/hw/xfree86/loader/libloader.la \
+            $(top_builddir)/hw/xfree86/os-support/libxorgos.la \
+            $(top_builddir)/hw/xfree86/common/libcommon.la \
+            $(top_builddir)/hw/xfree86/parser/libxf86config.la \
+            $(top_builddir)/hw/xfree86/dixmods/libdixmods.la \
+            $(top_builddir)/hw/xfree86/modes/libxf86modes.la \
+            $(top_builddir)/hw/xfree86/ramdac/libramdac.la \
+            $(top_builddir)/hw/xfree86/ddc/libddc.la \
+            $(top_builddir)/hw/xfree86/i2c/libi2c.la \
+            $(top_builddir)/hw/xfree86/dixmods/libxorgxkb.la \
+            $(top_builddir)/hw/xfree86/libxorg.la \
+            $(top_builddir)/mi/libmi.la \
+            $(top_builddir)/os/libos.la \
+            @XORG_LIBS@
+
+CLEANFILES=libxservertest.c
+
+libxservertest.c:
+	touch $@
+
+all:
+	@echo "Run 'make check' to run the test suite"
+
+endif
diff --git a/test/README b/test/README
new file mode 100644
index 0000000..5759a72
--- /dev/null
+++ b/test/README
@@ -0,0 +1,36 @@
+                        X server test suite
+
+This suite contains a set of tests to verify the behaviour of functions used
+internally to the server. This test suite is based on glib's testing
+framework [1].
+
+= How it works =
+Through some automake abuse, we link the test programs with the same static
+libraries as the Xorg binary. The test suites can then call various functions
+and verify their behaviour - without the need to start the server or connect
+clients.
+
+This testing only works for functions that do not rely on a particular state
+of the X server. Unless the test suite replicates the expected state, which
+may be difficult.
+
+= How to run the tests =
+Run "make check" the test directory. This will compile the tests and execute
+them in the order specified in the TESTS variable in test/Makefile.am.
+
+Each set of tests related to a subsystem are available as a binary that can be
+executed directly. For example, run "xkb" to perform some xkb-related tests.
+
+== Adding a new test ==
+When adding a new test, ensure that you add a short description of what the
+test does and what the expected outcome is. If the test reproduces a
+particular bug, using g_test_bug().
+
+== Misc ==
+
+The programs "gtester" and "gtester-report" may be used to generate XML/HTML
+log files of tests succeeded and failed.
+
+---------
+
+[1] http://library.gnome.org/devel/glib/stable/glib-Testing.html
diff --git a/test/xkb.c b/test/xkb.c
new file mode 100644
index 0000000..6fbb26a
--- /dev/null
+++ b/test/xkb.c
@@ -0,0 +1,173 @@
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ *  Permission is hereby granted, free of charge, to any person obtaining a
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ *  Software is furnished to do so, subject to the following conditions:
+ *
+ *  The above copyright notice and this permission notice (including the next
+ *  paragraph) shall be included in all copies or substantial portions of the
+ *  Software.
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *  DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <xkb-config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <math.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/keysym.h>
+#include <X11/Xatom.h>
+#include "misc.h"
+#include "inputstr.h"
+#include "opaque.h"
+#include "property.h"
+#define	XKBSRV_NEED_FILE_FUNCS
+#include <xkbsrv.h>
+#include "../xkb/xkbgeom.h"
+#include <X11/extensions/XKMformat.h>
+#include "xkbfile.h"
+#include "../xkb/xkb.h"
+
+#include <glib.h>
+
+/**
+ * Initialize an empty XkbRMLVOSet.
+ * Call XkbGetRulesDflts to obtain the default ruleset.
+ * Compare obtained ruleset with the built-in defaults.
+ *
+ * Result: RMLVO defaults are the same as obtained.
+ */
+static void xkb_get_rules_test(void)
+{
+    XkbRMLVOSet rmlvo = { NULL};
+    XkbGetRulesDflts(&rmlvo);
+
+
+    g_assert(rmlvo.rules);
+    g_assert(rmlvo.model);
+    g_assert(rmlvo.layout);
+    g_assert(rmlvo.variant);
+    g_assert(rmlvo.options);
+    g_assert(strcmp(rmlvo.rules, XKB_DFLT_RULES) == 0);
+    g_assert(strcmp(rmlvo.model, XKB_DFLT_MODEL) == 0);
+    g_assert(strcmp(rmlvo.layout, XKB_DFLT_LAYOUT) == 0);
+    g_assert(strcmp(rmlvo.variant, XKB_DFLT_VARIANT) == 0);
+    g_assert(strcmp(rmlvo.options, XKB_DFLT_OPTIONS) == 0);
+}
+
+/**
+ * Initialize an random XkbRMLVOSet.
+ * Call XkbGetRulesDflts to obtain the default ruleset.
+ * Compare obtained ruleset with the built-in defaults.
+ * Result: RMLVO defaults are the same as obtained.
+ */
+static void xkb_set_rules_test(void)
+{
+    XkbRMLVOSet rmlvo = {
+        .rules = "test-rules",
+        .model = "test-model",
+        .layout = "test-layout",
+        .variant = "test-variant",
+        .options = "test-options"
+    };
+    XkbRMLVOSet rmlvo_new = { NULL };
+
+    XkbSetRulesDflts(&rmlvo);
+    XkbGetRulesDflts(&rmlvo_new);
+
+    /* XkbGetRulesDflts strdups the values */
+    g_assert(rmlvo.rules != rmlvo_new.rules);
+    g_assert(rmlvo.model != rmlvo_new.model);
+    g_assert(rmlvo.layout != rmlvo_new.layout);
+    g_assert(rmlvo.variant != rmlvo_new.variant);
+    g_assert(rmlvo.options != rmlvo_new.options);
+
+    g_assert(strcmp(rmlvo.rules, rmlvo_new.rules) == 0);
+    g_assert(strcmp(rmlvo.model, rmlvo_new.model) == 0);
+    g_assert(strcmp(rmlvo.layout, rmlvo_new.layout) == 0);
+    g_assert(strcmp(rmlvo.variant, rmlvo_new.variant) == 0);
+    g_assert(strcmp(rmlvo.options, rmlvo_new.options) == 0);
+}
+
+
+/**
+ * Get the default RMLVO set.
+ * Set the default RMLVO set.
+ * Get the default RMLVO set.
+ * Repeat the last two steps.
+ *
+ * Result: RMLVO set obtained is the same as previously set.
+ */
+static void xkb_set_get_rules_test(void)
+{
+/* This test failed before XkbGetRulesDftlts changed to strdup.
+   We test this twice because the first time using XkbGetRulesDflts we obtain
+   the built-in defaults. The unexpected free isn't triggered until the second
+   XkbSetRulesDefaults.
+ */
+    XkbRMLVOSet rmlvo = { NULL };
+    XkbRMLVOSet rmlvo_backup;
+
+    XkbGetRulesDflts(&rmlvo);
+
+    /* pass 1 */
+    XkbSetRulesDflts(&rmlvo);
+    XkbGetRulesDflts(&rmlvo);
+
+    /* Make a backup copy */
+    rmlvo_backup.rules = strdup(rmlvo.rules);
+    rmlvo_backup.layout = strdup(rmlvo.layout);
+    rmlvo_backup.model = strdup(rmlvo.model);
+    rmlvo_backup.variant = strdup(rmlvo.variant);
+    rmlvo_backup.options = strdup(rmlvo.options);
+
+    /* pass 2 */
+    XkbSetRulesDflts(&rmlvo);
+
+    /* This test is iffy, because strictly we may be comparing against already
+     * freed memory */
+    g_assert(strcmp(rmlvo.rules, rmlvo_backup.rules) == 0);
+    g_assert(strcmp(rmlvo.model, rmlvo_backup.model) == 0);
+    g_assert(strcmp(rmlvo.layout, rmlvo_backup.layout) == 0);
+    g_assert(strcmp(rmlvo.variant, rmlvo_backup.variant) == 0);
+    g_assert(strcmp(rmlvo.options, rmlvo_backup.options) == 0);
+
+    XkbGetRulesDflts(&rmlvo);
+    g_assert(strcmp(rmlvo.rules, rmlvo_backup.rules) == 0);
+    g_assert(strcmp(rmlvo.model, rmlvo_backup.model) == 0);
+    g_assert(strcmp(rmlvo.layout, rmlvo_backup.layout) == 0);
+    g_assert(strcmp(rmlvo.variant, rmlvo_backup.variant) == 0);
+    g_assert(strcmp(rmlvo.options, rmlvo_backup.options) == 0);
+}
+
+
+int main(int argc, char** argv)
+{
+    g_test_init(&argc, &argv,NULL);
+    g_test_bug_base("https://bugzilla.freedesktop.org/show_bug.cgi?id=");
+
+    g_test_add_func("/xkb/set-get-rules", xkb_set_get_rules_test);
+    g_test_add_func("/xkb/get-rules", xkb_get_rules_test);
+    g_test_add_func("/xkb/set-rules", xkb_set_rules_test);
+
+    return g_test_run();
+}
commit c2c515ead38d9a6c9eae0b83aa7a82208f177b7e
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Apr 22 13:26:40 2009 +1000

    dix: remove all but main() from main.c
    
    All other functions are pushed into where they seemed to fit.
    main.c is now linked separately into libmain.a and linked in by the various
    DDXs.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/configure.ac b/configure.ac
index fd60203..d907e88 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1153,6 +1153,10 @@ else
   DIX_LIB='$(top_builddir)/dix/libdix.la'
   OS_LIB='$(top_builddir)/os/libos.la'
 fi
+
+MAIN_LIB='$(top_builddir)/dix/libmain.la'
+AC_SUBST([MAIN_LIB])
+
 MI_LIB='$(top_builddir)/mi/libmi.la'
 MI_EXT_LIB='$(top_builddir)/mi/libmiext.la'
 MI_INC='-I$(top_srcdir)/mi'
@@ -1271,7 +1275,7 @@ AC_MSG_RESULT([$XNEST])
 AM_CONDITIONAL(XNEST, [test "x$XNEST" = xyes])
 
 if test "x$XNEST" = xyes; then
-	XNEST_LIBS="$FB_LIB $FIXES_LIB $MI_LIB $XEXT_LIB $DBE_LIB $RECORD_LIB $GLX_LIBS $RANDR_LIB $RENDER_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $DIX_LIB $OS_LIB $CONFIG_LIB"
+	XNEST_LIBS="$FB_LIB $FIXES_LIB $MI_LIB $XEXT_LIB $DBE_LIB $RECORD_LIB $GLX_LIBS $RANDR_LIB $RENDER_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $DIX_LIB $MAIN_LIB $OS_LIB $CONFIG_LIB"
 	XNEST_SYS_LIBS="$XNESTMODULES_LIBS $GLX_SYS_LIBS"
 	AC_SUBST([XNEST_LIBS])
 	AC_SUBST([XNEST_SYS_LIBS])
@@ -1643,7 +1647,7 @@ if test "x$XQUARTZ" = xyes; then
 	AC_DEFINE(XQUARTZ,1,[Have Quartz])
 	AC_DEFINE(ROOTLESS,1,[Build Rootless code])
 
-	DARWIN_LIBS="$MI_LIB $OS_LIB $DIX_LIB $FB_LIB $FIXES_LIB $XEXT_LIB $CONFIG_LIB $DBE_LIB $RECORD_LIB $RANDR_LIB $RENDER_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $XPSTUBS_LIB"
+	DARWIN_LIBS="$MI_LIB $OS_LIB $DIX_LIB $MAIN_LIB $FB_LIB $FIXES_LIB $XEXT_LIB $CONFIG_LIB $DBE_LIB $RECORD_LIB $RANDR_LIB $RENDER_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $XPSTUBS_LIB"
 	AC_SUBST([DARWIN_LIBS])
 
 	AC_CHECK_LIB([Xplugin],[xp_init],[:])
@@ -1828,7 +1832,7 @@ if test "$KDRIVE" = yes; then
 	    ;;
     esac
     KDRIVE_STUB_LIB='$(top_builddir)/hw/kdrive/src/libkdrivestubs.la'
-    KDRIVE_LOCAL_LIBS="$DIX_LIB $KDRIVE_LIB $KDRIVE_STUB_LIB $CONFIG_LIB"
+    KDRIVE_LOCAL_LIBS="$DIX_LIB $MAIN_LIB $KDRIVE_LIB $KDRIVE_STUB_LIB $CONFIG_LIB"
     KDRIVE_LOCAL_LIBS="$KDRIVE_LOCAL_LIBS $FB_LIB $MI_LIB $KDRIVE_PURE_LIBS"
     KDRIVE_LOCAL_LIBS="$KDRIVE_LOCAL_LIBS $KDRIVE_OS_LIB $OS_LIB"
     KDRIVE_LIBS="$TSLIB_LIBS $KDRIVE_LOCAL_LIBS $XSERVER_SYS_LIBS $GLX_SYS_LIBS"
diff --git a/dix/Makefile.am b/dix/Makefile.am
index 83b8c62..ab702f7 100644
--- a/dix/Makefile.am
+++ b/dix/Makefile.am
@@ -1,7 +1,10 @@
-noinst_LTLIBRARIES = libdix.la
+noinst_LTLIBRARIES = libdix.la libmain.la
 
 AM_CFLAGS = $(DIX_CFLAGS)
 
+libmain_la_SOURCES =    \
+	main.c
+
 libdix_la_SOURCES = 	\
 	atom.c		\
 	colormap.c	\
@@ -26,7 +29,6 @@ libdix_la_SOURCES = 	\
 	grabs.c		\
 	initatoms.c	\
 	inpututils.c	\
-	main.c		\
 	pixmap.c	\
 	privates.c	\
 	property.c	\
diff --git a/dix/dispatch.c b/dix/dispatch.c
index a9f9367..16a51bd 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -107,6 +107,7 @@ Equipment Corporation.
 
 #ifdef HAVE_DIX_CONFIG_H
 #include <dix-config.h>
+#include <version-config.h>
 #endif
 
 #ifdef PANORAMIX_DEBUG
@@ -134,6 +135,7 @@ int ProcInitialConnection();
 #include "xace.h"
 #include "inputstr.h"
 #include "xkbsrv.h"
+#include "site.h"
 
 #ifdef XSERVER_DTRACE
 #include "registry.h"
@@ -150,7 +152,9 @@ typedef const char *string;
 #define BITCLEAR(buf, i) MASKWORD(buf, i) &= ~BITMASK(i)
 #define GETBIT(buf, i) (MASKWORD(buf, i) & BITMASK(i))
 
-extern xConnSetupPrefix connSetupPrefix;
+xConnSetupPrefix connSetupPrefix;
+
+PaddingInfo PixmapWidthPaddingInfo[33];
 
 static ClientPtr grabClient;
 #define GrabNone 0
@@ -160,7 +164,7 @@ static int grabState = GrabNone;
 static long grabWaiters[mskcnt];
 CallbackListPtr ServerGrabCallback = NULL;
 HWEventQueuePtr checkForInput[2];
-extern int connBlockScreenStart;
+int connBlockScreenStart;
 
 static void KillAllClients(void);
 
@@ -461,6 +465,166 @@ Dispatch(void)
 
 #undef MAJOROP
 
+static int  VendorRelease = VENDOR_RELEASE;
+static char *VendorString = VENDOR_NAME;
+
+static const int padlength[4] = {0, 3, 2, 1};
+
+void
+SetVendorRelease(int release)
+{
+    VendorRelease = release;
+}
+
+void
+SetVendorString(char *string)
+{
+    VendorString = string;
+}
+
+Bool
+CreateConnectionBlock(void)
+{
+    xConnSetup setup;
+    xWindowRoot root;
+    xDepth	depth;
+    xVisualType visual;
+    xPixmapFormat format;
+    unsigned long vid;
+    int i, j, k,
+        lenofblock,
+        sizesofar = 0;
+    char *pBuf;
+
+
+    memset(&setup, 0, sizeof(xConnSetup));
+    /* Leave off the ridBase and ridMask, these must be sent with
+       connection */
+
+    setup.release = VendorRelease;
+    /*
+     * per-server image and bitmap parameters are defined in Xmd.h
+     */
+    setup.imageByteOrder = screenInfo.imageByteOrder;
+
+    setup.bitmapScanlineUnit = screenInfo.bitmapScanlineUnit;
+    setup.bitmapScanlinePad = screenInfo.bitmapScanlinePad;
+
+    setup.bitmapBitOrder = screenInfo.bitmapBitOrder;
+    setup.motionBufferSize = NumMotionEvents();
+    setup.numRoots = screenInfo.numScreens;
+    setup.nbytesVendor = strlen(VendorString);
+    setup.numFormats = screenInfo.numPixmapFormats;
+    setup.maxRequestSize = MAX_REQUEST_SIZE;
+    QueryMinMaxKeyCodes(&setup.minKeyCode, &setup.maxKeyCode);
+
+    lenofblock = sizeof(xConnSetup) +
+            ((setup.nbytesVendor + 3) & ~3) +
+	    (setup.numFormats * sizeof(xPixmapFormat)) +
+            (setup.numRoots * sizeof(xWindowRoot));
+    ConnectionInfo = xalloc(lenofblock);
+    if (!ConnectionInfo)
+	return FALSE;
+
+    memmove(ConnectionInfo, (char *)&setup, sizeof(xConnSetup));
+    sizesofar = sizeof(xConnSetup);
+    pBuf = ConnectionInfo + sizeof(xConnSetup);
+
+    memmove(pBuf, VendorString, (int)setup.nbytesVendor);
+    sizesofar += setup.nbytesVendor;
+    pBuf += setup.nbytesVendor;
+    i = padlength[setup.nbytesVendor & 3];
+    sizesofar += i;
+    while (--i >= 0)
+	*pBuf++ = 0;
+
+    memset(&format, 0, sizeof(xPixmapFormat));
+    for (i=0; i<screenInfo.numPixmapFormats; i++)
+    {
+	format.depth = screenInfo.formats[i].depth;
+	format.bitsPerPixel = screenInfo.formats[i].bitsPerPixel;
+	format.scanLinePad = screenInfo.formats[i].scanlinePad;
+	memmove(pBuf, (char *)&format, sizeof(xPixmapFormat));
+	pBuf += sizeof(xPixmapFormat);
+	sizesofar += sizeof(xPixmapFormat);
+    }
+
+    connBlockScreenStart = sizesofar;
+    memset(&depth, 0, sizeof(xDepth));
+    memset(&visual, 0, sizeof(xVisualType));
+    for (i=0; i<screenInfo.numScreens; i++)
+    {
+	ScreenPtr	pScreen;
+	DepthPtr	pDepth;
+	VisualPtr	pVisual;
+
+	pScreen = screenInfo.screens[i];
+	root.windowId = WindowTable[i]->drawable.id;
+	root.defaultColormap = pScreen->defColormap;
+	root.whitePixel = pScreen->whitePixel;
+	root.blackPixel = pScreen->blackPixel;
+	root.currentInputMask = 0;    /* filled in when sent */
+	root.pixWidth = pScreen->width;
+	root.pixHeight = pScreen->height;
+	root.mmWidth = pScreen->mmWidth;
+	root.mmHeight = pScreen->mmHeight;
+	root.minInstalledMaps = pScreen->minInstalledCmaps;
+	root.maxInstalledMaps = pScreen->maxInstalledCmaps;
+	root.rootVisualID = pScreen->rootVisual;
+	root.backingStore = pScreen->backingStoreSupport;
+	root.saveUnders = FALSE;
+	root.rootDepth = pScreen->rootDepth;
+	root.nDepths = pScreen->numDepths;
+	memmove(pBuf, (char *)&root, sizeof(xWindowRoot));
+	sizesofar += sizeof(xWindowRoot);
+	pBuf += sizeof(xWindowRoot);
+
+	pDepth = pScreen->allowedDepths;
+	for(j = 0; j < pScreen->numDepths; j++, pDepth++)
+	{
+	    lenofblock += sizeof(xDepth) +
+		    (pDepth->numVids * sizeof(xVisualType));
+	    pBuf = (char *)xrealloc(ConnectionInfo, lenofblock);
+	    if (!pBuf)
+	    {
+		xfree(ConnectionInfo);
+		return FALSE;
+	    }
+	    ConnectionInfo = pBuf;
+	    pBuf += sizesofar;
+	    depth.depth = pDepth->depth;
+	    depth.nVisuals = pDepth->numVids;
+	    memmove(pBuf, (char *)&depth, sizeof(xDepth));
+	    pBuf += sizeof(xDepth);
+	    sizesofar += sizeof(xDepth);
+	    for(k = 0; k < pDepth->numVids; k++)
+	    {
+		vid = pDepth->vids[k];
+		for (pVisual = pScreen->visuals;
+		     pVisual->vid != vid;
+		     pVisual++)
+		    ;
+		visual.visualID = vid;
+		visual.class = pVisual->class;
+		visual.bitsPerRGB = pVisual->bitsPerRGBValue;
+		visual.colormapEntries = pVisual->ColormapEntries;
+		visual.redMask = pVisual->redMask;
+		visual.greenMask = pVisual->greenMask;
+		visual.blueMask = pVisual->blueMask;
+		memmove(pBuf, (char *)&visual, sizeof(xVisualType));
+		pBuf += sizeof(xVisualType);
+		sizesofar += sizeof(xVisualType);
+	    }
+	}
+    }
+    connSetupPrefix.success = xTrue;
+    connSetupPrefix.length = lenofblock/4;
+    connSetupPrefix.majorVersion = X_PROTOCOL;
+    connSetupPrefix.minorVersion = X_PROTOCOL_REVISION;
+    return TRUE;
+}
+
+
 int
 ProcBadRequest(ClientPtr client)
 {
@@ -3700,3 +3864,176 @@ MarkClientException(ClientPtr client)
 {
     client->noClientException = -1;
 }
+
+/*
+ * This array encodes the answer to the question "what is the log base 2
+ * of the number of pixels that fit in a scanline pad unit?"
+ * Note that ~0 is an invalid entry (mostly for the benefit of the reader).
+ */
+static int answer[6][4] = {
+	/* pad   pad   pad     pad*/
+	/*  8     16    32    64 */
+
+	{   3,     4,    5 ,   6 },	/* 1 bit per pixel */
+	{   1,     2,    3 ,   4 },	/* 4 bits per pixel */
+	{   0,     1,    2 ,   3 },	/* 8 bits per pixel */
+	{   ~0,    0,    1 ,   2 },	/* 16 bits per pixel */
+	{   ~0,    ~0,   0 ,   1 },	/* 24 bits per pixel */
+	{   ~0,    ~0,   0 ,   1 }	/* 32 bits per pixel */
+};
+
+/*
+ * This array gives the answer to the question "what is the first index for
+ * the answer array above given the number of bits per pixel?"
+ * Note that ~0 is an invalid entry (mostly for the benefit of the reader).
+ */
+static int indexForBitsPerPixel[ 33 ] = {
+	~0, 0, ~0, ~0,	/* 1 bit per pixel */
+	1, ~0, ~0, ~0,	/* 4 bits per pixel */
+	2, ~0, ~0, ~0,	/* 8 bits per pixel */
+	~0,~0, ~0, ~0,
+	3, ~0, ~0, ~0,	/* 16 bits per pixel */
+	~0,~0, ~0, ~0,
+	4, ~0, ~0, ~0,	/* 24 bits per pixel */
+	~0,~0, ~0, ~0,
+	5		/* 32 bits per pixel */
+};
+
+/*
+ * This array gives the bytesperPixel value for cases where the number
+ * of bits per pixel is a multiple of 8 but not a power of 2.
+ */
+static int answerBytesPerPixel[ 33 ] = {
+	~0, 0, ~0, ~0,	/* 1 bit per pixel */
+	0, ~0, ~0, ~0,	/* 4 bits per pixel */
+	0, ~0, ~0, ~0,	/* 8 bits per pixel */
+	~0,~0, ~0, ~0,
+	0, ~0, ~0, ~0,	/* 16 bits per pixel */
+	~0,~0, ~0, ~0,
+	3, ~0, ~0, ~0,	/* 24 bits per pixel */
+	~0,~0, ~0, ~0,
+	0		/* 32 bits per pixel */
+};
+
+/*
+ * This array gives the answer to the question "what is the second index for
+ * the answer array above given the number of bits per scanline pad unit?"
+ * Note that ~0 is an invalid entry (mostly for the benefit of the reader).
+ */
+static int indexForScanlinePad[ 65 ] = {
+	~0, ~0, ~0, ~0,
+	~0, ~0, ~0, ~0,
+	 0, ~0, ~0, ~0,	/* 8 bits per scanline pad unit */
+	~0, ~0, ~0, ~0,
+	 1, ~0, ~0, ~0,	/* 16 bits per scanline pad unit */
+	~0, ~0, ~0, ~0,
+	~0, ~0, ~0, ~0,
+	~0, ~0, ~0, ~0,
+	 2, ~0, ~0, ~0,	/* 32 bits per scanline pad unit */
+	~0, ~0, ~0, ~0,
+	~0, ~0, ~0, ~0,
+	~0, ~0, ~0, ~0,
+	~0, ~0, ~0, ~0,
+	~0, ~0, ~0, ~0,
+	~0, ~0, ~0, ~0,
+	~0, ~0, ~0, ~0,
+	 3		/* 64 bits per scanline pad unit */
+};
+
+#ifndef MIN
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+/*
+	grow the array of screenRecs if necessary.
+	call the device-supplied initialization procedure
+with its screen number, a pointer to its ScreenRec, argc, and argv.
+	return the number of successfully installed screens.
+
+*/
+
+int
+AddScreen(
+    Bool	(* pfnInit)(
+	int /*index*/,
+	ScreenPtr /*pScreen*/,
+	int /*argc*/,
+	char ** /*argv*/
+		),
+    int argc,
+    char **argv)
+{
+
+    int i;
+    int scanlinepad, format, depth, bitsPerPixel, j, k;
+    ScreenPtr pScreen;
+
+    i = screenInfo.numScreens;
+    if (i == MAXSCREENS)
+	return -1;
+
+    pScreen = (ScreenPtr) xcalloc(1, sizeof(ScreenRec));
+    if (!pScreen)
+	return -1;
+
+    pScreen->devPrivates = NULL;
+    pScreen->myNum = i;
+    pScreen->totalPixmapSize = BitmapBytePad(sizeof(PixmapRec)*8);
+    pScreen->ClipNotify = 0;	/* for R4 ddx compatibility */
+    pScreen->CreateScreenResources = 0;
+
+    /*
+     * This loop gets run once for every Screen that gets added,
+     * but thats ok.  If the ddx layer initializes the formats
+     * one at a time calling AddScreen() after each, then each
+     * iteration will make it a little more accurate.  Worst case
+     * we do this loop N * numPixmapFormats where N is # of screens.
+     * Anyway, this must be called after InitOutput and before the
+     * screen init routine is called.
+     */
+    for (format=0; format<screenInfo.numPixmapFormats; format++)
+    {
+	depth = screenInfo.formats[format].depth;
+	bitsPerPixel = screenInfo.formats[format].bitsPerPixel;
+	scanlinepad = screenInfo.formats[format].scanlinePad;
+	j = indexForBitsPerPixel[ bitsPerPixel ];
+	k = indexForScanlinePad[ scanlinepad ];
+	PixmapWidthPaddingInfo[ depth ].padPixelsLog2 = answer[j][k];
+	PixmapWidthPaddingInfo[ depth ].padRoundUp =
+	    (scanlinepad/bitsPerPixel) - 1;
+	j = indexForBitsPerPixel[ 8 ]; /* bits per byte */
+	PixmapWidthPaddingInfo[ depth ].padBytesLog2 = answer[j][k];
+	PixmapWidthPaddingInfo[ depth ].bitsPerPixel = bitsPerPixel;
+	if (answerBytesPerPixel[bitsPerPixel])
+	{
+	    PixmapWidthPaddingInfo[ depth ].notPower2 = 1;
+	    PixmapWidthPaddingInfo[ depth ].bytesPerPixel =
+		answerBytesPerPixel[bitsPerPixel];
+	}
+	else
+	{
+	    PixmapWidthPaddingInfo[ depth ].notPower2 = 0;
+	}
+    }
+
+    /* This is where screen specific stuff gets initialized.  Load the
+       screen structure, call the hardware, whatever.
+       This is also where the default colormap should be allocated and
+       also pixel values for blackPixel, whitePixel, and the cursor
+       Note that InitScreen is NOT allowed to modify argc, argv, or
+       any of the strings pointed to by argv.  They may be passed to
+       multiple screens.
+    */
+    pScreen->rgf = ~0L;  /* there are no scratch GCs yet*/
+    WindowTable[i] = NullWindow;
+    screenInfo.screens[i] = pScreen;
+    screenInfo.numScreens++;
+    if (!(*pfnInit)(i, pScreen, argc, argv))
+    {
+	dixFreePrivates(pScreen->devPrivates);
+	xfree(pScreen);
+	screenInfo.numScreens--;
+	return -1;
+    }
+    return i;
+}
diff --git a/dix/events.c b/dix/events.c
index 1057eb4..c87a361 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -283,6 +283,12 @@ static struct {
 static xEvent* swapEvent = NULL;
 static int swapEventLen = 0;
 
+void
+NotImplemented(xEvent *from, xEvent *to)
+{
+    FatalError("Not implemented");
+}
+
 /**
  * Convert the given event type from an XI event to a core event.
  * @param[in] The XI 1.x event type.
diff --git a/dix/main.c b/dix/main.c
index 9d5d839..25b085e 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -118,120 +118,7 @@ Equipment Corporation.
 
 extern void Dispatch(void);
 
-xConnSetupPrefix connSetupPrefix;
-
-extern FontPtr defaultFont;
-
 extern void InitProcVectors(void);
-extern Bool CreateGCperDepthArray(void);
-
-#ifndef PANORAMIX
-static
-#endif
-Bool CreateConnectionBlock(void);
-
-PaddingInfo PixmapWidthPaddingInfo[33];
-
-int connBlockScreenStart;
-
-void
-NotImplemented(xEvent *from, xEvent *to)
-{
-    FatalError("Not implemented");
-}
-
-/*
- * Dummy entry for ReplySwapVector[]
- */
-
-void
-ReplyNotSwappd(
-	ClientPtr pClient ,
-	int size ,
-	void * pbuf
-	)
-{
-    FatalError("Not implemented");
-}
-
-/*
- * This array encodes the answer to the question "what is the log base 2
- * of the number of pixels that fit in a scanline pad unit?"
- * Note that ~0 is an invalid entry (mostly for the benefit of the reader).
- */
-static int answer[6][4] = {
-	/* pad   pad   pad     pad*/
-	/*  8     16    32    64 */
-
-	{   3,     4,    5 ,   6 },	/* 1 bit per pixel */
-	{   1,     2,    3 ,   4 },	/* 4 bits per pixel */
-	{   0,     1,    2 ,   3 },	/* 8 bits per pixel */
-	{   ~0,    0,    1 ,   2 },	/* 16 bits per pixel */
-	{   ~0,    ~0,   0 ,   1 },	/* 24 bits per pixel */
-	{   ~0,    ~0,   0 ,   1 }	/* 32 bits per pixel */
-};
-
-/*
- * This array gives the answer to the question "what is the first index for
- * the answer array above given the number of bits per pixel?"
- * Note that ~0 is an invalid entry (mostly for the benefit of the reader).
- */
-static int indexForBitsPerPixel[ 33 ] = {
-	~0, 0, ~0, ~0,	/* 1 bit per pixel */
-	1, ~0, ~0, ~0,	/* 4 bits per pixel */
-	2, ~0, ~0, ~0,	/* 8 bits per pixel */
-	~0,~0, ~0, ~0,
-	3, ~0, ~0, ~0,	/* 16 bits per pixel */
-	~0,~0, ~0, ~0,
-	4, ~0, ~0, ~0,	/* 24 bits per pixel */
-	~0,~0, ~0, ~0,
-	5		/* 32 bits per pixel */
-};
-
-/*
- * This array gives the bytesperPixel value for cases where the number
- * of bits per pixel is a multiple of 8 but not a power of 2.
- */
-static int answerBytesPerPixel[ 33 ] = {
-	~0, 0, ~0, ~0,	/* 1 bit per pixel */
-	0, ~0, ~0, ~0,	/* 4 bits per pixel */
-	0, ~0, ~0, ~0,	/* 8 bits per pixel */
-	~0,~0, ~0, ~0,
-	0, ~0, ~0, ~0,	/* 16 bits per pixel */
-	~0,~0, ~0, ~0,
-	3, ~0, ~0, ~0,	/* 24 bits per pixel */
-	~0,~0, ~0, ~0,
-	0		/* 32 bits per pixel */
-};
-
-/*
- * This array gives the answer to the question "what is the second index for
- * the answer array above given the number of bits per scanline pad unit?"
- * Note that ~0 is an invalid entry (mostly for the benefit of the reader).
- */
-static int indexForScanlinePad[ 65 ] = {
-	~0, ~0, ~0, ~0,
-	~0, ~0, ~0, ~0,
-	 0, ~0, ~0, ~0,	/* 8 bits per scanline pad unit */
-	~0, ~0, ~0, ~0,
-	 1, ~0, ~0, ~0,	/* 16 bits per scanline pad unit */
-	~0, ~0, ~0, ~0,
-	~0, ~0, ~0, ~0,
-	~0, ~0, ~0, ~0,
-	 2, ~0, ~0, ~0,	/* 32 bits per scanline pad unit */
-	~0, ~0, ~0, ~0,
-	~0, ~0, ~0, ~0,
-	~0, ~0, ~0, ~0,
-	~0, ~0, ~0, ~0,
-	~0, ~0, ~0, ~0,
-	~0, ~0, ~0, ~0,
-	~0, ~0, ~0, ~0,
-	 3		/* 64 bits per scanline pad unit */
-};
-
-#ifndef MIN
-#define MIN(a,b) (((a) < (b)) ? (a) : (b))
-#endif
 
 #ifdef XQUARTZ
 #include <pthread.h>
@@ -456,258 +343,3 @@ int main(int argc, char *argv[], char *envp[])
     return(0);
 }
 
-static int  VendorRelease = VENDOR_RELEASE;
-static char *VendorString = VENDOR_NAME;
-
-void
-SetVendorRelease(int release)
-{
-    VendorRelease = release;
-}
-
-void
-SetVendorString(char *string)
-{
-    VendorString = string;
-}
-
-static const int padlength[4] = {0, 3, 2, 1};
-
-#ifndef PANORAMIX
-static
-#endif
-Bool
-CreateConnectionBlock(void)
-{
-    xConnSetup setup;
-    xWindowRoot root;
-    xDepth	depth;
-    xVisualType visual;
-    xPixmapFormat format;
-    unsigned long vid;
-    int i, j, k,
-        lenofblock,
-        sizesofar = 0;
-    char *pBuf;
-
-
-    memset(&setup, 0, sizeof(xConnSetup));
-    /* Leave off the ridBase and ridMask, these must be sent with
-       connection */
-
-    setup.release = VendorRelease;
-    /*
-     * per-server image and bitmap parameters are defined in Xmd.h
-     */
-    setup.imageByteOrder = screenInfo.imageByteOrder;
-
-    setup.bitmapScanlineUnit = screenInfo.bitmapScanlineUnit;
-    setup.bitmapScanlinePad = screenInfo.bitmapScanlinePad;
-
-    setup.bitmapBitOrder = screenInfo.bitmapBitOrder;
-    setup.motionBufferSize = NumMotionEvents();
-    setup.numRoots = screenInfo.numScreens;
-    setup.nbytesVendor = strlen(VendorString); 
-    setup.numFormats = screenInfo.numPixmapFormats;
-    setup.maxRequestSize = MAX_REQUEST_SIZE;
-    QueryMinMaxKeyCodes(&setup.minKeyCode, &setup.maxKeyCode);
-    
-    lenofblock = sizeof(xConnSetup) + 
-            ((setup.nbytesVendor + 3) & ~3) +
-	    (setup.numFormats * sizeof(xPixmapFormat)) +
-            (setup.numRoots * sizeof(xWindowRoot));
-    ConnectionInfo = xalloc(lenofblock);
-    if (!ConnectionInfo)
-	return FALSE;
-
-    memmove(ConnectionInfo, (char *)&setup, sizeof(xConnSetup));
-    sizesofar = sizeof(xConnSetup);
-    pBuf = ConnectionInfo + sizeof(xConnSetup);
-
-    memmove(pBuf, VendorString, (int)setup.nbytesVendor);
-    sizesofar += setup.nbytesVendor;
-    pBuf += setup.nbytesVendor;
-    i = padlength[setup.nbytesVendor & 3];
-    sizesofar += i;
-    while (--i >= 0)
-	*pBuf++ = 0;
-
-    memset(&format, 0, sizeof(xPixmapFormat));
-    for (i=0; i<screenInfo.numPixmapFormats; i++)
-    {
-	format.depth = screenInfo.formats[i].depth;
-	format.bitsPerPixel = screenInfo.formats[i].bitsPerPixel;
-	format.scanLinePad = screenInfo.formats[i].scanlinePad;
-	memmove(pBuf, (char *)&format, sizeof(xPixmapFormat));
-	pBuf += sizeof(xPixmapFormat);
-	sizesofar += sizeof(xPixmapFormat);
-    }
-
-    connBlockScreenStart = sizesofar;
-    memset(&depth, 0, sizeof(xDepth));
-    memset(&visual, 0, sizeof(xVisualType));
-    for (i=0; i<screenInfo.numScreens; i++)
-    {
-	ScreenPtr	pScreen;
-	DepthPtr	pDepth;
-	VisualPtr	pVisual;
-
-	pScreen = screenInfo.screens[i];
-	root.windowId = WindowTable[i]->drawable.id;
-	root.defaultColormap = pScreen->defColormap;
-	root.whitePixel = pScreen->whitePixel;
-	root.blackPixel = pScreen->blackPixel;
-	root.currentInputMask = 0;    /* filled in when sent */
-	root.pixWidth = pScreen->width;
-	root.pixHeight = pScreen->height;
-	root.mmWidth = pScreen->mmWidth;
-	root.mmHeight = pScreen->mmHeight;
-	root.minInstalledMaps = pScreen->minInstalledCmaps;
-	root.maxInstalledMaps = pScreen->maxInstalledCmaps; 
-	root.rootVisualID = pScreen->rootVisual;		
-	root.backingStore = pScreen->backingStoreSupport;
-	root.saveUnders = FALSE;
-	root.rootDepth = pScreen->rootDepth;
-	root.nDepths = pScreen->numDepths;
-	memmove(pBuf, (char *)&root, sizeof(xWindowRoot));
-	sizesofar += sizeof(xWindowRoot);
-	pBuf += sizeof(xWindowRoot);
-
-	pDepth = pScreen->allowedDepths;
-	for(j = 0; j < pScreen->numDepths; j++, pDepth++)
-	{
-	    lenofblock += sizeof(xDepth) + 
-		    (pDepth->numVids * sizeof(xVisualType));
-	    pBuf = (char *)xrealloc(ConnectionInfo, lenofblock);
-	    if (!pBuf)
-	    {
-		xfree(ConnectionInfo);
-		return FALSE;
-	    }
-	    ConnectionInfo = pBuf;
-	    pBuf += sizesofar;            
-	    depth.depth = pDepth->depth;
-	    depth.nVisuals = pDepth->numVids;
-	    memmove(pBuf, (char *)&depth, sizeof(xDepth));
-	    pBuf += sizeof(xDepth);
-	    sizesofar += sizeof(xDepth);
-	    for(k = 0; k < pDepth->numVids; k++)
-	    {
-		vid = pDepth->vids[k];
-		for (pVisual = pScreen->visuals;
-		     pVisual->vid != vid;
-		     pVisual++)
-		    ;
-		visual.visualID = vid;
-		visual.class = pVisual->class;
-		visual.bitsPerRGB = pVisual->bitsPerRGBValue;
-		visual.colormapEntries = pVisual->ColormapEntries;
-		visual.redMask = pVisual->redMask;
-		visual.greenMask = pVisual->greenMask;
-		visual.blueMask = pVisual->blueMask;
-		memmove(pBuf, (char *)&visual, sizeof(xVisualType));
-		pBuf += sizeof(xVisualType);
-		sizesofar += sizeof(xVisualType);
-	    }
-	}
-    }
-    connSetupPrefix.success = xTrue;
-    connSetupPrefix.length = lenofblock/4;
-    connSetupPrefix.majorVersion = X_PROTOCOL;
-    connSetupPrefix.minorVersion = X_PROTOCOL_REVISION;
-    return TRUE;
-}
-
-/*
-	grow the array of screenRecs if necessary.
-	call the device-supplied initialization procedure 
-with its screen number, a pointer to its ScreenRec, argc, and argv.
-	return the number of successfully installed screens.
-
-*/
-
-int
-AddScreen(
-    Bool	(* pfnInit)(
-	int /*index*/,
-	ScreenPtr /*pScreen*/,
-	int /*argc*/,
-	char ** /*argv*/
-		),
-    int argc,
-    char **argv)
-{
-
-    int i;
-    int scanlinepad, format, depth, bitsPerPixel, j, k;
-    ScreenPtr pScreen;
-
-    i = screenInfo.numScreens;
-    if (i == MAXSCREENS)
-	return -1;
-
-    pScreen = (ScreenPtr) xcalloc(1, sizeof(ScreenRec));
-    if (!pScreen)
-	return -1;
-
-    pScreen->devPrivates = NULL;
-    pScreen->myNum = i;
-    pScreen->totalPixmapSize = BitmapBytePad(sizeof(PixmapRec)*8);
-    pScreen->ClipNotify = 0;	/* for R4 ddx compatibility */
-    pScreen->CreateScreenResources = 0;
-    
-    /*
-     * This loop gets run once for every Screen that gets added,
-     * but thats ok.  If the ddx layer initializes the formats
-     * one at a time calling AddScreen() after each, then each
-     * iteration will make it a little more accurate.  Worst case
-     * we do this loop N * numPixmapFormats where N is # of screens.
-     * Anyway, this must be called after InitOutput and before the
-     * screen init routine is called.
-     */
-    for (format=0; format<screenInfo.numPixmapFormats; format++)
-    {
- 	depth = screenInfo.formats[format].depth;
- 	bitsPerPixel = screenInfo.formats[format].bitsPerPixel;
-  	scanlinepad = screenInfo.formats[format].scanlinePad;
- 	j = indexForBitsPerPixel[ bitsPerPixel ];
-  	k = indexForScanlinePad[ scanlinepad ];
- 	PixmapWidthPaddingInfo[ depth ].padPixelsLog2 = answer[j][k];
- 	PixmapWidthPaddingInfo[ depth ].padRoundUp =
- 	    (scanlinepad/bitsPerPixel) - 1;
- 	j = indexForBitsPerPixel[ 8 ]; /* bits per byte */
- 	PixmapWidthPaddingInfo[ depth ].padBytesLog2 = answer[j][k];
-	PixmapWidthPaddingInfo[ depth ].bitsPerPixel = bitsPerPixel;
-	if (answerBytesPerPixel[bitsPerPixel])
-	{
-	    PixmapWidthPaddingInfo[ depth ].notPower2 = 1;
-	    PixmapWidthPaddingInfo[ depth ].bytesPerPixel =
-		answerBytesPerPixel[bitsPerPixel];
-	}
-	else
-	{
-	    PixmapWidthPaddingInfo[ depth ].notPower2 = 0;
-	}
-    }
-  
-    /* This is where screen specific stuff gets initialized.  Load the
-       screen structure, call the hardware, whatever.
-       This is also where the default colormap should be allocated and
-       also pixel values for blackPixel, whitePixel, and the cursor
-       Note that InitScreen is NOT allowed to modify argc, argv, or
-       any of the strings pointed to by argv.  They may be passed to
-       multiple screens. 
-    */ 
-    pScreen->rgf = ~0L;  /* there are no scratch GCs yet*/
-    WindowTable[i] = NullWindow;
-    screenInfo.screens[i] = pScreen;
-    screenInfo.numScreens++;
-    if (!(*pfnInit)(i, pScreen, argc, argv))
-    {
-	dixFreePrivates(pScreen->devPrivates);
-	xfree(pScreen);
-	screenInfo.numScreens--;
-	return -1;
-    }
-    return i;
-}
diff --git a/dix/swaprep.c b/dix/swaprep.c
index 9eb6765..8624216 100644
--- a/dix/swaprep.c
+++ b/dix/swaprep.c
@@ -1291,3 +1291,18 @@ WriteSConnSetupPrefix(ClientPtr pClient, xConnSetupPrefix *pcsp)
     SwapConnSetupPrefix(pcsp, &cspT);
     (void)WriteToClient(pClient, sizeof(cspT), (char *) &cspT);
 }
+
+/*
+ * Dummy entry for ReplySwapVector[]
+ */
+
+void
+ReplyNotSwappd(
+	ClientPtr pClient ,
+	int size ,
+	void * pbuf
+	)
+{
+    FatalError("Not implemented");
+}
+
diff --git a/hw/dmx/Makefile.am b/hw/dmx/Makefile.am
index 9d2778a..9e9b39a 100644
--- a/hw/dmx/Makefile.am
+++ b/hw/dmx/Makefile.am
@@ -85,6 +85,7 @@ XDMX_LIBS = \
 	$(GLX_LIBS) \
         input/libdmxinput.a \
         config/libdmxconfig.a \
+	$(MAIN_LIB) \
 	$(XSERVER_LIBS)
 
 Xdmx_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
diff --git a/hw/vfb/Makefile.am b/hw/vfb/Makefile.am
index a4a120a..c5b49a3 100644
--- a/hw/vfb/Makefile.am
+++ b/hw/vfb/Makefile.am
@@ -22,6 +22,7 @@ Xvfb_SOURCES = $(SRCS)
 XVFB_LIBS = \
         @XVFB_LIBS@ \
 	libfbcmap.a \
+	$(MAIN_LIB) \
 	$(XSERVER_LIBS)
 
 Xvfb_LDADD = $(XVFB_LIBS) $(XVFB_SYS_LIBS) $(XSERVER_SYS_LIBS)
diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am
index b6a534b..3b9ff9c 100644
--- a/hw/xfree86/Makefile.am
+++ b/hw/xfree86/Makefile.am
@@ -56,7 +56,7 @@ libxorg.c xorg.c:
 DISTCLEANFILES = libxorg.c xorg.c
 
 Xorg_DEPENDENCIES = libxorg.la
-Xorg_LDADD = libxorg.la $(XORG_SYS_LIBS) $(XSERVER_SYS_LIBS)
+Xorg_LDADD = $(MAIN_LIB) libxorg.la $(XORG_SYS_LIBS) $(XSERVER_SYS_LIBS)
 
 Xorg_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
 
diff --git a/hw/xquartz/mach-startup/Makefile.am b/hw/xquartz/mach-startup/Makefile.am
index b011294..0c609e3 100644
--- a/hw/xquartz/mach-startup/Makefile.am
+++ b/hw/xquartz/mach-startup/Makefile.am
@@ -19,7 +19,7 @@ X11_bin_LDADD = \
 	$(top_builddir)/dix/dixfonts.lo \
 	$(top_builddir)/miext/rootless/librootless.la \
 	$(top_builddir)/hw/xquartz/pbproxy/libxpbproxy.la \
-	$(DARWIN_LIBS) $(XSERVER_LIBS) $(XSERVER_SYS_LIBS) -lXplugin
+	$(DARWIN_LIBS) $(MAIN_LIB) $(XSERVER_LIBS) $(XSERVER_SYS_LIBS) -lXplugin
 
 X11_bin_LDFLAGS =  \
 	-XCClinker -Objc \
diff --git a/include/dix.h b/include/dix.h
index 97dc9cc..7811982 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -170,6 +170,7 @@ extern _X_EXPORT void SendErrorToClient(
 extern _X_EXPORT void MarkClientException(
     ClientPtr /*client*/);
 
+extern _X_HIDDEN Bool CreateConnectionBlock(void);
 /* dixutils.c */
 
 extern _X_EXPORT void CopyISOLatin1Lowered(
commit 48573e7ea13e279593249036e6d30f1d7507882f
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Apr 26 21:32:37 2009 +1000

    Xi: swap stuff->cursor in SProcXIGrabDevice

diff --git a/Xi/xigrabdev.c b/Xi/xigrabdev.c
index 0e86aa3..11c7679 100644
--- a/Xi/xigrabdev.c
+++ b/Xi/xigrabdev.c
@@ -51,6 +51,7 @@ SProcXIGrabDevice(ClientPtr client)
     swaps(&stuff->length, n);
     swaps(&stuff->deviceid, n);
     swapl(&stuff->grab_window, n);
+    swapl(&stuff->cursor, n);
     swapl(&stuff->time, n);
     swaps(&stuff->mask_len, n);
 
commit 057fc9a4f89282e440b5e11458f1dd8655879dd8
Merge: 95628b7... 932d6bc...
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Apr 24 16:15:47 2009 +1000

    Merge branch 'master' into xi2
    
    Conflicts:
    	Xi/chdevhier.c
    	include/input.h

diff --cc Xi/chdevhier.c
index 2b107e7,6c70bd9..746f4a5
--- a/Xi/chdevhier.c
+++ b/Xi/chdevhier.c
@@@ -54,49 -52,8 +54,51 @@@
  
  #include "chdevhier.h"
  
+ extern DevPrivateKey XTstDevicePrivateKey;
+ 
 +/**
 + * Send the current state of the device hierarchy to all clients.
 + */
 +void XISendDeviceHierarchyEvent(int flags)
 +{
 +    xXIDeviceHierarchyEvent *ev;
 +    xXIHierarchyInfo *info;
 +    DeviceIntRec dummyDev;
 +    DeviceIntPtr dev;
 +
 +    if (!flags)
 +        return;
 +
 +    ev = xcalloc(1, sizeof(xXIDeviceHierarchyEvent) + inputInfo.numDevices *
 +            sizeof(xXIHierarchyInfo));
 +    ev->type = GenericEvent;
 +    ev->extension = IReqCode;
 +    ev->evtype = XI_HierarchyChanged;
 +    ev->time = GetTimeInMillis();
 +    ev->flags = flags;
 +    ev->num_devices = inputInfo.numDevices;
 +    ev->length = (ev->num_devices * sizeof(xXIHierarchyInfo))/4;
 +
 +    info = (xXIHierarchyInfo*)&ev[1];
 +    for (dev = inputInfo.devices; dev; dev = dev->next)
 +    {
 +        info->deviceid = dev->id;
 +        info->enabled = dev->enabled;
 +        info->use = GetDeviceUse(dev, &info->attachment);
 +        info++;
 +    }
 +    for (dev = inputInfo.off_devices; dev; dev = dev->next)
 +    {
 +        info->deviceid = dev->id;
 +        info->enabled = dev->enabled;
 +        info->use = GetDeviceUse(dev, &info->attachment);
 +        info++;
 +    }
 +
 +    dummyDev.id = AllDevices;
 +    SendEventToAllWindows(&dummyDev, (XI_HierarchyChangedMask >> 8), (xEvent*)ev, 1);
 +}
 +
  
  /***********************************************************************
   *
@@@ -117,22 -74,21 +119,22 @@@ int SProcXIChangeDeviceHierarchy(Client
  #define SWAPIF(cmd) if (client->swapped) { cmd; }
  
  int
 -ProcXChangeDeviceHierarchy(ClientPtr client)
 +ProcXIChangeDeviceHierarchy(ClientPtr client)
  {
-     DeviceIntPtr ptr, keybd;
+     DeviceIntPtr ptr, keybd, xtstptr, xtstkeybd;
 -    DeviceIntRec dummyDev;
 -    xAnyHierarchyChangeInfo *any;
 -    int required_len = sizeof(xChangeDeviceHierarchyReq);
 +    xXIAnyHierarchyChangeInfo *any;
 +    int required_len = sizeof(xXIChangeDeviceHierarchyReq);
      char n;
      int rc = Success;
 -    int nchanges = 0;
 -    deviceHierarchyChangedEvent ev;
 +    int flags = 0;
 +
 +    REQUEST(xXIChangeDeviceHierarchyReq);
 +    REQUEST_AT_LEAST_SIZE(xXIChangeDeviceHierarchyReq);
  
 -    REQUEST(xChangeDeviceHierarchyReq);
 -    REQUEST_AT_LEAST_SIZE(xChangeDeviceHierarchyReq);
 +    if (!stuff->num_changes)
 +        return rc;
  
 -    any = (xAnyHierarchyChangeInfo*)&stuff[1];
 +    any = (xXIAnyHierarchyChangeInfo*)&stuff[1];
      while(stuff->num_changes--)
      {
          SWAPIF(swapl(&any->type, n));
@@@ -146,42 -102,62 +148,62 @@@
          {
              case CH_CreateMasterDevice:
                  {
 -                    xCreateMasterInfo* c = (xCreateMasterInfo*)any;
 +                    xXICreateMasterInfo* c = (xXICreateMasterInfo*)any;
                      char* name;
  
 -                    SWAPIF(swaps(&c->namelen, n));
 -                    name = xcalloc(c->namelen + 1, sizeof(char));
 -                    strncpy(name, (char*)&c[1], c->namelen);
 +                    SWAPIF(swaps(&c->name_len, n));
 +                    name = xcalloc(c->name_len + 1, sizeof(char));
 +                    strncpy(name, (char*)&c[1], c->name_len);
  
  
-                     rc = AllocMasterDevice(client, name, &ptr, &keybd);
+                     rc = AllocDevicePair(client, name, &ptr, &keybd, TRUE);
                      if (rc != Success)
                      {
                          xfree(name);
                          goto unwind;
                      }
  
 -                    if (!c->sendCore)
 +                    if (!c->send_core)
                          ptr->coreEvents = keybd->coreEvents =  FALSE;
  
+ 		    /* Allocate virtual slave devices for xtest events */
+                     rc = AllocXtstDevice(client, name, &xtstptr, &xtstkeybd);
+                     if (rc != Success)
+                     {
+ 
+                         xfree(name);
+                         goto unwind;
+                     }
+ 
                      ActivateDevice(ptr);
                      ActivateDevice(keybd);
+                     ActivateDevice(xtstptr);
+                     ActivateDevice(xtstkeybd);
  
                      if (c->enable)
                      {
                          EnableDevice(ptr);
                          EnableDevice(keybd);
+                         EnableDevice(xtstptr);
+                         EnableDevice(xtstkeybd);
                      }
+ 
+                     /* Attach the XTest virtual devices to the newly
+                        created master device */
+                     AttachDevice(NULL, xtstptr, ptr);
+                     AttachDevice(NULL, xtstkeybd, keybd);
+ 
                      xfree(name);
 -                    nchanges++;
 +                    flags |= HF_MasterAdded;
                  }
                  break;
              case CH_RemoveMasterDevice:
                  {
 -                    xRemoveMasterInfo* r = (xRemoveMasterInfo*)any;
 +                    xXIRemoveMasterInfo* r = (xXIRemoveMasterInfo*)any;
+                     DeviceIntPtr xtstdevice;
  
 -                    if (r->returnMode != AttachToMaster &&
 -                            r->returnMode != Floating)
 +                    if (r->return_mode != AttachToMaster &&
 +                            r->return_mode != Floating)
                          return BadValue;
  
                      rc = dixLookupDevice(&ptr, r->deviceid, client,
@@@ -277,35 -310,18 +356,50 @@@
                      DisableDevice(keybd);
                      DisableDevice(ptr);
  
+                     RemoveDevice(xtstptr);
+                     RemoveDevice(xtstkeybd);
                      RemoveDevice(keybd);
                      RemoveDevice(ptr);
 -                    nchanges++;
 +                    flags |= HF_MasterRemoved;
                  }
                  break;
 -            case CH_ChangeAttachment:
 +            case CH_DetachSlave:
                  {
 +                    xXIDetachSlaveInfo* c = (xXIDetachSlaveInfo*)any;
+                     DeviceIntPtr *xtstdevice;
  
 -                    xChangeAttachmentInfo* c = (xChangeAttachmentInfo*)any;
 +                    rc = dixLookupDevice(&ptr, c->deviceid, client,
 +                                          DixWriteAccess);
 +                    if (rc != Success)
 +                       goto unwind;
 +
 +                    if (ptr->isMaster)
 +                    {
 +                        client->errorValue = c->deviceid;
 +                        rc = BadDevice;
 +                        goto unwind;
 +                    }
 +
++                    xtstdevice = dixLookupPrivate( &ptr->devPrivates,
++                                                   XTstDevicePrivateKey );
++
++                    /* Don't allow changes to Xtst Devices, these are fixed */
++                    if( xtstdevice )
++                    {
++                        client->errorValue = c->deviceid;
++                        rc = BadDevice;
++                        goto unwind;
++                    }
++
 +                    AttachDevice(client, ptr, NULL);
 +                    flags |= HF_SlaveDetached;
 +                }
 +                break;
 +            case CH_AttachSlave:
 +                {
 +                    xXIAttachSlaveInfo* c = (xXIAttachSlaveInfo*)any;
 +                    DeviceIntPtr newmaster;
++                    DeviceIntPtr *xtstdevice;
  
                      rc = dixLookupDevice(&ptr, c->deviceid, client,
                                            DixWriteAccess);
@@@ -319,18 -335,34 +413,29 @@@
                          goto unwind;
                      }
  
+                     xtstdevice = dixLookupPrivate( &ptr->devPrivates,
+                                                    XTstDevicePrivateKey );
+ 
+                     /* Don't allow changes to Xtst Devices, these are fixed */
+                     if( xtstdevice )
+                     {
+                         client->errorValue = c->deviceid;
+                         rc = BadDevice;
+                         goto unwind;
+                     }
+ 
 -                    if (c->changeMode == Floating)
 -                        AttachDevice(client, ptr, NULL);
 -                    else
 +                    rc = dixLookupDevice(&newmaster, c->new_master,
 +                            client, DixWriteAccess);
 +                    if (rc != Success)
 +                        goto unwind;
 +                    if (!newmaster->isMaster)
                      {
 -                        DeviceIntPtr newmaster;
 -                        rc = dixLookupDevice(&newmaster, c->newMaster,
 -                                             client, DixWriteAccess);
 -                        if (rc != Success)
 -                            goto unwind;
 -                        if (!newmaster->isMaster)
 -                        {
 -                            client->errorValue = c->newMaster;
 -                            rc = BadDevice;
 -                            goto unwind;
 -                        }
 +                        client->errorValue = c->new_master;
 +                        rc = BadDevice;
 +                        goto unwind;
 +                    }
  
 -                        if (!((IsPointerDevice(newmaster) &&
 +                    if (!((IsPointerDevice(newmaster) &&
                                      IsPointerDevice(ptr)) ||
                                  (IsKeyboardDevice(newmaster) &&
                                   IsKeyboardDevice(ptr))))
diff --cc include/input.h
index bc9c5be,56c3d29..e3509a9
--- a/include/input.h
+++ b/include/input.h
@@@ -469,11 -468,12 +469,12 @@@ extern int AttachDevice(ClientPtr clien
  
  extern _X_EXPORT DeviceIntPtr GetPairedDevice(DeviceIntPtr kbd);
  
- extern int AllocMasterDevice(ClientPtr client,
 -extern _X_EXPORT int AllocDevicePair(ClientPtr client,
++extern int AllocDevicePair(ClientPtr client,
                               char* name,
                               DeviceIntPtr* ptr,
-                              DeviceIntPtr* keybd);
+                              DeviceIntPtr* keybd,
+                              Bool master);
 -extern _X_EXPORT void DeepCopyDeviceClasses(DeviceIntPtr from,
 +extern void DeepCopyDeviceClasses(DeviceIntPtr from,
                                    DeviceIntPtr to);
  
  /* Helper functions. */
@@@ -481,16 -481,11 +482,20 @@@ extern int generate_modkeymap(ClientPt
                                KeyCode **modkeymap, int *max_keys_per_mod);
  extern int change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *map,
                           int max_keys_per_mod);
+ extern int AllocXtstDevice(ClientPtr client,
+                              char* name,
+                              DeviceIntPtr* ptr,
+                              DeviceIntPtr* keybd);
  
 +/* misc event helpers */
 +extern Mask GetEventFilter(DeviceIntPtr dev, xEvent *event);
 +extern Mask GetWindowXI2Mask(DeviceIntPtr dev, WindowPtr win, xEvent* ev);
 +void FixUpEventFromWindow(DeviceIntPtr pDev,
 +                          xEvent *xE,
 +                          WindowPtr pWin,
 +                          Window child,
 +                          Bool calcChild);
 +
  /* Implemented by the DDX. */
  extern _X_EXPORT int NewInputDeviceRequest(
      InputOption *options,
commit 95628b797e2b326ae15406df4f736e25f5d2f12f
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Apr 20 14:04:54 2009 +1000

    Xi: use the XI2 defines for AsyncPair, SyncDevice, etc, not the XI ones.
    
    And don't allow some values on SDs either.

diff --git a/Xi/xiallowev.c b/Xi/xiallowev.c
index 5712557..a8cf1b6 100644
--- a/Xi/xiallowev.c
+++ b/Xi/xiallowev.c
@@ -72,23 +72,26 @@ ProcXIAllowEvents(ClientPtr client)
     time = ClientTimeToServerTime(stuff->time);
 
     switch (stuff->mode) {
-    case ReplayThisDevice:
+    case ReplayDevice:
 	AllowSome(client, time, dev, NOT_GRABBED);
 	break;
-    case SyncThisDevice:
+    case SyncDevice:
 	AllowSome(client, time, dev, FREEZE_NEXT_EVENT);
 	break;
-    case AsyncThisDevice:
+    case AsyncDevice:
 	AllowSome(client, time, dev, THAWED);
 	break;
-    case AsyncOtherDevices:
-	AllowSome(client, time, dev, THAW_OTHERS);
+    case AsyncPairedDevice:
+        if (dev->isMaster)
+            AllowSome(client, time, dev, THAW_OTHERS);
 	break;
-    case SyncAll:
-	AllowSome(client, time, dev, FREEZE_BOTH_NEXT_EVENT);
+    case SyncPair:
+        if (dev->isMaster)
+            AllowSome(client, time, dev, FREEZE_BOTH_NEXT_EVENT);
 	break;
-    case AsyncAll:
-	AllowSome(client, time, dev, THAWED_BOTH);
+    case AsyncPair:
+        if (dev->isMaster)
+            AllowSome(client, time, dev, THAWED_BOTH);
 	break;
     default:
 	client->errorValue = stuff->mode;
commit d5ad14c8ed4d8360e1df8cd0bacf6a7c9c31df91
Merge: 54716fd... 0e0642e...
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Apr 19 22:28:22 2009 +1000

    Merge branch 'master' into xi2

commit 54716fd3dbc251db9d251d1d0435942efaa63259
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Apr 19 22:12:11 2009 +1000

    Convert to using int32_t fixed point values on the wire.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 6d85b1b..af14431 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1220,8 +1220,8 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
     xi2event->deviceid     = dev->id;
     xi2event->sourceid     = 0; /*XXX */
     xi2event->mode         = mode;
-    xi2event->root_x.integral      = mouse->spriteInfo->sprite->hot.x;
-    xi2event->root_y.integral      = mouse->spriteInfo->sprite->hot.y;
+    xi2event->root_x       = FP1616(mouse->spriteInfo->sprite->hot.x, 0);
+    xi2event->root_y       = FP1616(mouse->spriteInfo->sprite->hot.y, 0);
 
     for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
         if (BitIsOn(mouse->button->down, i))
diff --git a/Xi/extinit.c b/Xi/extinit.c
index 9628dff..fa7031e 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -628,14 +628,10 @@ SDeviceLeaveNotifyEvent (xXILeaveEvent *from, xXILeaveEvent *to)
     swapl(&to->root, n);
     swapl(&to->event, n);
     swapl(&to->child, n);
-    swaps(&to->root_x.integral, n);
-    swaps(&to->root_x.frac, n);
-    swaps(&to->root_y.integral, n);
-    swaps(&to->root_y.frac, n);
-    swaps(&to->event_x.integral, n);
-    swaps(&to->event_x.frac, n);
-    swaps(&to->event_y.integral, n);
-    swaps(&to->event_y.frac, n);
+    swapl(&to->root_x, n);
+    swapl(&to->root_y, n);
+    swapl(&to->event_x, n);
+    swapl(&to->event_y, n);
     swaps(&to->sourceid, n);
     swaps(&to->buttons_len, n);
     swapl(&to->mods.base_mods, n);
@@ -721,14 +717,10 @@ static void SDeviceEvent(xXIDeviceEvent *from, xXIDeviceEvent *to)
     swapl(&to->root, n);
     swapl(&to->event, n);
     swapl(&to->child, n);
-    swapl(&to->root_x.integral, n);
-    swapl(&to->root_x.frac, n);
-    swapl(&to->root_y.integral, n);
-    swapl(&to->root_y.frac, n);
-    swapl(&to->event_x.integral, n);
-    swapl(&to->event_x.frac, n);
-    swapl(&to->event_y.integral, n);
-    swapl(&to->event_y.frac, n);
+    swapl(&to->root_x, n);
+    swapl(&to->root_y, n);
+    swapl(&to->event_x, n);
+    swapl(&to->event_y, n);
     swaps(&to->buttons_len, n);
     swaps(&to->valuators_len, n);
     swaps(&to->sourceid, n);
diff --git a/Xi/querydp.c b/Xi/querydp.c
index 5be0cea..1b45ae2 100644
--- a/Xi/querydp.c
+++ b/Xi/querydp.c
@@ -42,6 +42,7 @@
 #include "extnsionst.h"
 #include "exevents.h"
 #include "exglobals.h"
+#include "eventconvert.h"
 #include "xkbsrv.h"
 
 #ifdef PANORAMIX
@@ -110,16 +111,16 @@ ProcXIQueryDevicePointer(ClientPtr client)
     if (kbd && kbd->key)
         rep.mask |= XkbStateFieldFromRec(&kbd->key->xkbInfo->state);
     rep.root = (GetCurrentRootWindow(pDev))->drawable.id;
-    rep.root_x.integral = pSprite->hot.x;
-    rep.root_y.integral = pSprite->hot.y;
+    rep.root_x = FP1616(pSprite->hot.x, 0);
+    rep.root_y = FP1616(pSprite->hot.y, 0);
     rep.child = None;
     rep.deviceid = pDev->id;
 
     if (pSprite->hot.pScreen == pWin->drawable.pScreen)
     {
         rep.same_screen = xTrue;
-        rep.win_x.integral = pSprite->hot.x - pWin->drawable.x;
-        rep.win_y.integral = pSprite->hot.y - pWin->drawable.y;
+        rep.win_x = FP1616(pSprite->hot.x - pWin->drawable.x, 0);
+        rep.win_y = FP1616(pSprite->hot.y - pWin->drawable.y, 0);
         for (t = pSprite->win; t; t = t->parent)
             if (t->parent == pWin)
             {
@@ -129,18 +130,18 @@ ProcXIQueryDevicePointer(ClientPtr client)
     } else
     {
         rep.same_screen = xFalse;
-        rep.win_x.integral = 0;
-        rep.win_y.integral = 0;
+        rep.win_x = 0;
+        rep.win_y = 0;
     }
 
 #ifdef PANORAMIX
     if(!noPanoramiXExtension) {
-        rep.root_x.integral += panoramiXdataPtr[0].x;
-        rep.root_y.integral += panoramiXdataPtr[0].y;
+        rep.root_x += FP1616(panoramiXdataPtr[0].x, 0);
+        rep.root_y += FP1616(panoramiXdataPtr[0].y, 0);
         if (stuff->win == rep.root)
         {
-            rep.win_x.integral += panoramiXdataPtr[0].x;
-            rep.win_y.integral += panoramiXdataPtr[0].y;
+            rep.win_x += FP1616(panoramiXdataPtr[0].x, 0);
+            rep.win_y += FP1616(panoramiXdataPtr[0].y, 0);
         }
     }
 #endif
diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index b69d9d3..d97ed81 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -47,6 +47,7 @@
 #include "eventconvert.h"
 #include "querydev.h"
 
+
 static int countValuators(DeviceEvent *ev, int *first);
 static int getValuatorEvents(DeviceEvent *ev, deviceValuator *xv);
 static int eventToKeyButtonPointer(DeviceEvent *ev, xEvent **xi, int *count);
@@ -384,8 +385,8 @@ eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
     xde->valuators_len  = vallen;
     xde->deviceid       = ev->deviceid;
     xde->sourceid       = ev->sourceid;
-    xde->root_x.integral = ev->root_x;
-    xde->root_y.integral = ev->root_y;
+    xde->root_x         = FP1616(ev->root_x, 0);
+    xde->root_y         = FP1616(ev->root_y, 0);
 
     xde->mods.base_mods         = ev->mods.base;
     xde->mods.latched_mods      = ev->mods.latched;
diff --git a/dix/events.c b/dix/events.c
index a308422..1057eb4 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2226,13 +2226,13 @@ FixUpEventFromWindow(
         event->event = pWin->drawable.id;
         if (pSprite->hot.pScreen == pWin->drawable.pScreen)
         {
-            event->event_x.integral = event->root_x.integral - pWin->drawable.x;
-            event->event_y.integral = event->root_y.integral - pWin->drawable.y;
+            event->event_x = FP1616(event->root_x - pWin->drawable.x, 0);
+            event->event_y = FP1616(event->root_y - pWin->drawable.y, 0);
             event->child = child;
         } else
         {
-            event->event_x.integral = 0;
-            event->event_y.integral = 0;
+            event->event_x = 0;
+            event->event_y = 0;
             event->child = None;
         }
 
@@ -4161,8 +4161,8 @@ DeviceEnterLeaveEvent(
     event->deviceid     = mouse->id;
     event->sourceid     = 0; /*XXX */
     event->mode         = mode;
-    event->root_x.integral      = mouse->spriteInfo->sprite->hot.x;
-    event->root_y.integral      = mouse->spriteInfo->sprite->hot.y;
+    event->root_x       = FP1616(mouse->spriteInfo->sprite->hot.x, 0);
+    event->root_y       = FP1616(mouse->spriteInfo->sprite->hot.y, 0);
 
     for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
         if (BitIsOn(mouse->button->down, i))
diff --git a/include/eventconvert.h b/include/eventconvert.h
index f458af7..dc3fd73 100644
--- a/include/eventconvert.h
+++ b/include/eventconvert.h
@@ -28,6 +28,8 @@
 #include "input.h"
 #include "events.h"
 
+#define FP1616(integral, frac) (integral * (1 << 16) + frac * (1 << 16))
+
 _X_INTERNAL int EventToCore(InternalEvent *event, xEvent *core);
 _X_INTERNAL int EventToXI(InternalEvent *ev, xEvent **xi, int *count);
 _X_INTERNAL int EventToXI2(InternalEvent *ev, xEvent **xi);
commit 129ac9a9145323e3f126590b491e718f976f80ce
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Apr 19 21:31:56 2009 +1000

    dix: set root_x/y for device events.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index 8b973a5..b69d9d3 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -384,6 +384,8 @@ eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
     xde->valuators_len  = vallen;
     xde->deviceid       = ev->deviceid;
     xde->sourceid       = ev->sourceid;
+    xde->root_x.integral = ev->root_x;
+    xde->root_y.integral = ev->root_y;
 
     xde->mods.base_mods         = ev->mods.base;
     xde->mods.latched_mods      = ev->mods.latched;
commit eeb1e4cd254c047539933c3b886037e67ef30762
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Apr 15 22:17:15 2009 +1000

    Xi: add support for XIAllowEvents.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/Makefile.am b/Xi/Makefile.am
index 32510f2..1fa7b9a 100644
--- a/Xi/Makefile.am
+++ b/Xi/Makefile.am
@@ -92,6 +92,8 @@ libXi_la_SOURCES =	\
 	ungrdevk.h \
 	warpdevp.c \
 	warpdevp.h \
+	xiallowev.c \
+	xiallowev.h \
 	xigrabdev.c \
 	xigrabdev.h \
 	xiproperty.c \
diff --git a/Xi/extinit.c b/Xi/extinit.c
index 9d3b5e6..9628dff 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -119,6 +119,7 @@ SOFTWARE.
 #include "ungrdevb.h"
 #include "ungrdevk.h"
 #include "warpdevp.h"
+#include "xiallowev.h"
 #include "xiselectev.h"
 #include "xigrabdev.h"
 #include "xisetdevfocus.h"
@@ -245,7 +246,8 @@ static int (*ProcIVector[])(ClientPtr) = {
         ProcXISetDeviceFocus,                   /* 49 */
         ProcXIGetDeviceFocus,                   /* 50 */
         ProcXIGrabDevice,                       /* 51 */
-        ProcXIUngrabDevice                      /* 52 */
+        ProcXIUngrabDevice,                     /* 52 */
+        ProcXIAllowEvents                       /* 53 */
 };
 
 /* For swapped clients */
@@ -302,7 +304,8 @@ static int (*SProcIVector[])(ClientPtr) = {
         SProcXISetDeviceFocus,                   /* 49 */
         SProcXIGetDeviceFocus,                   /* 50 */
         SProcXIGrabDevice,                       /* 51 */
-        SProcXIUngrabDevice                      /* 52 */
+        SProcXIUngrabDevice,                     /* 52 */
+        SProcXIAllowEvents                       /* 53 */
 };
 
 /*****************************************************************
diff --git a/Xi/xiallowev.c b/Xi/xiallowev.c
new file mode 100644
index 0000000..5712557
--- /dev/null
+++ b/Xi/xiallowev.c
@@ -0,0 +1,100 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer
+ */
+
+/***********************************************************************
+ *
+ * Request to allow some device events.
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "inputstr.h"	/* DeviceIntPtr      */
+#include "windowstr.h"	/* window structure  */
+#include <X11/extensions/XI2.h>
+#include <X11/extensions/XI2proto.h>
+
+#include "exglobals.h" /* BadDevice */
+#include "xiallowev.h"
+
+int
+SProcXIAllowEvents(ClientPtr client)
+{
+    char n;
+
+    REQUEST(xXIAllowEventsReq);
+
+    swaps(&stuff->length, n);
+    swaps(&stuff->deviceid, n);
+    swapl(&stuff->time, n);
+
+    return ProcXIAllowEvents(client);
+}
+
+int
+ProcXIAllowEvents(ClientPtr client)
+{
+    TimeStamp time;
+    DeviceIntPtr dev;
+    int ret = Success;
+
+    REQUEST(xXIAllowEventsReq);
+    REQUEST_SIZE_MATCH(xXIAllowEventsReq);
+
+    ret = dixLookupDevice(&dev, stuff->deviceid, client, DixSetFocusAccess);
+    if (ret != Success)
+	return ret;
+
+    time = ClientTimeToServerTime(stuff->time);
+
+    switch (stuff->mode) {
+    case ReplayThisDevice:
+	AllowSome(client, time, dev, NOT_GRABBED);
+	break;
+    case SyncThisDevice:
+	AllowSome(client, time, dev, FREEZE_NEXT_EVENT);
+	break;
+    case AsyncThisDevice:
+	AllowSome(client, time, dev, THAWED);
+	break;
+    case AsyncOtherDevices:
+	AllowSome(client, time, dev, THAW_OTHERS);
+	break;
+    case SyncAll:
+	AllowSome(client, time, dev, FREEZE_BOTH_NEXT_EVENT);
+	break;
+    case AsyncAll:
+	AllowSome(client, time, dev, THAWED_BOTH);
+	break;
+    default:
+	client->errorValue = stuff->mode;
+	ret = BadValue;
+    }
+
+    return ret;
+}
+
diff --git a/Xi/xiallowev.h b/Xi/xiallowev.h
new file mode 100644
index 0000000..97a0f25
--- /dev/null
+++ b/Xi/xiallowev.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer
+ */
+
+#ifndef XIALLOWEV_H
+#define XIALLOWEV_H
+
+int ProcXIAllowEvents(ClientPtr client);
+int SProcXIAllowEvents(ClientPtr client);
+
+#endif
commit 74d0fc3aee05bc4f505274d81dd44c0d2b4368ff
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Apr 16 11:06:52 2009 +1000

    dix: don't allow more than MAX_VALUATORS on one device.
    
    Some keyboards (?) advertise more than MAX_VALUATORS axes. Parts of the
    internal event delivery relies on not having more than MAX_VALUATOR axes, so
    let's cap it down.
    If there's real devices that require more than the current 36, I'm sure we can
    bump this up.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 991beca..6d85b1b 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1119,6 +1119,8 @@ InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, int minval, int maxval,
 
     if (!dev || !dev->valuator || minval > maxval)
         return;
+    if (axnum >= dev->valuator->numAxes)
+        return;
 
     ax = dev->valuator->axes + axnum;
 
diff --git a/dix/devices.c b/dix/devices.c
index ed6e6bd..1c702dc 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1088,6 +1088,14 @@ InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes,
     if (!dev)
         return FALSE;
 
+    if (numAxes >= MAX_VALUATORS)
+    {
+        LogMessage(X_WARNING,
+                   "Device '%s' has %d axes, only using first %d.\n",
+                   dev->name, numAxes, MAX_VALUATORS);
+        numAxes = MAX_VALUATORS;
+    }
+
     valc = (ValuatorClassPtr)xcalloc(1, sizeof(ValuatorClassRec) +
 				    numAxes * sizeof(AxisInfo) +
 				    numAxes * sizeof(unsigned int));
commit edb70caf21fa5da3c336c47c62218a3f05c635b8
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Apr 15 22:16:49 2009 +1000

    dix: remove un-used parameter "core" from AllowSome
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/allowev.c b/Xi/allowev.c
index 5f0753d..96f3b54 100644
--- a/Xi/allowev.c
+++ b/Xi/allowev.c
@@ -104,22 +104,22 @@ ProcXAllowDeviceEvents(ClientPtr client)
 
     switch (stuff->mode) {
     case ReplayThisDevice:
-	AllowSome(client, time, thisdev, NOT_GRABBED, FALSE);
+	AllowSome(client, time, thisdev, NOT_GRABBED);
 	break;
     case SyncThisDevice:
-	AllowSome(client, time, thisdev, FREEZE_NEXT_EVENT, FALSE);
+	AllowSome(client, time, thisdev, FREEZE_NEXT_EVENT);
 	break;
     case AsyncThisDevice:
-	AllowSome(client, time, thisdev, THAWED, FALSE);
+	AllowSome(client, time, thisdev, THAWED);
 	break;
     case AsyncOtherDevices:
-	AllowSome(client, time, thisdev, THAW_OTHERS, FALSE);
+	AllowSome(client, time, thisdev, THAW_OTHERS);
 	break;
     case SyncAll:
-	AllowSome(client, time, thisdev, FREEZE_BOTH_NEXT_EVENT, FALSE);
+	AllowSome(client, time, thisdev, FREEZE_BOTH_NEXT_EVENT);
 	break;
     case AsyncAll:
-	AllowSome(client, time, thisdev, THAWED_BOTH, FALSE);
+	AllowSome(client, time, thisdev, THAWED_BOTH);
 	break;
     default:
 	client->errorValue = stuff->mode;
diff --git a/dix/events.c b/dix/events.c
index 96f3579..a308422 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -1627,8 +1627,7 @@ void
 AllowSome(ClientPtr client,
           TimeStamp time,
           DeviceIntPtr thisDev,
-          int newState,
-          Bool core)
+          int newState)
 {
     Bool thisGrabbed, otherGrabbed, othersFrozen, thisSynced;
     TimeStamp grabTime;
@@ -1770,28 +1769,28 @@ ProcAllowEvents(ClientPtr client)
     switch (stuff->mode)
     {
 	case ReplayPointer:
-	    AllowSome(client, time, mouse, NOT_GRABBED, True);
+	    AllowSome(client, time, mouse, NOT_GRABBED);
 	    break;
 	case SyncPointer:
-	    AllowSome(client, time, mouse, FREEZE_NEXT_EVENT, True);
+	    AllowSome(client, time, mouse, FREEZE_NEXT_EVENT);
 	    break;
 	case AsyncPointer:
-	    AllowSome(client, time, mouse, THAWED, True);
+	    AllowSome(client, time, mouse, THAWED);
 	    break;
 	case ReplayKeyboard:
-	    AllowSome(client, time, keybd, NOT_GRABBED, True);
+	    AllowSome(client, time, keybd, NOT_GRABBED);
 	    break;
 	case SyncKeyboard:
-	    AllowSome(client, time, keybd, FREEZE_NEXT_EVENT, True);
+	    AllowSome(client, time, keybd, FREEZE_NEXT_EVENT);
 	    break;
 	case AsyncKeyboard:
-	    AllowSome(client, time, keybd, THAWED, True);
+	    AllowSome(client, time, keybd, THAWED);
 	    break;
 	case SyncBoth:
-	    AllowSome(client, time, keybd, FREEZE_BOTH_NEXT_EVENT, True);
+	    AllowSome(client, time, keybd, FREEZE_BOTH_NEXT_EVENT);
 	    break;
 	case AsyncBoth:
-	    AllowSome(client, time, keybd, THAWED_BOTH, True);
+	    AllowSome(client, time, keybd, THAWED_BOTH);
 	    break;
 	default:
 	    client->errorValue = stuff->mode;
diff --git a/include/dix.h b/include/dix.h
index d4e5039..97dc9cc 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -353,8 +353,7 @@ extern void AllowSome(
     ClientPtr	/* client */,
     TimeStamp /* time */,
     DeviceIntPtr /* thisDev */,
-    int /* newState */,
-    Bool /* core */);
+    int /* newState */);
 
 extern void ReleaseActiveGrabs(
     ClientPtr client);
commit bb5418d4901017c657031181d3839f58b387a2a3
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Apr 12 22:22:21 2009 +1000

    Xi: Add support for XI2 active grabs and ungrabs.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/extinit.c b/Xi/extinit.c
index 9b1310b..9d3b5e6 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -120,6 +120,7 @@ SOFTWARE.
 #include "ungrdevk.h"
 #include "warpdevp.h"
 #include "xiselectev.h"
+#include "xigrabdev.h"
 #include "xisetdevfocus.h"
 #include "xiproperty.h"
 
@@ -242,7 +243,9 @@ static int (*ProcIVector[])(ClientPtr) = {
         ProcXIQueryVersion,                     /* 47 */
         ProcXIQueryDevice,                      /* 48 */
         ProcXISetDeviceFocus,                   /* 49 */
-        ProcXIGetDeviceFocus                    /* 50 */
+        ProcXIGetDeviceFocus,                   /* 50 */
+        ProcXIGrabDevice,                       /* 51 */
+        ProcXIUngrabDevice                      /* 52 */
 };
 
 /* For swapped clients */
@@ -297,7 +300,9 @@ static int (*SProcIVector[])(ClientPtr) = {
         SProcXIQueryVersion,                     /* 47 */
         SProcXIQueryDevice,                      /* 48 */
         SProcXISetDeviceFocus,                   /* 49 */
-        SProcXIGetDeviceFocus                    /* 50 */
+        SProcXIGetDeviceFocus,                   /* 50 */
+        SProcXIGrabDevice,                       /* 51 */
+        SProcXIUngrabDevice                      /* 52 */
 };
 
 /*****************************************************************
@@ -488,6 +493,8 @@ SReplyIDispatch(ClientPtr client, int len, xGrabDeviceReply * rep)
         SRepXIGetClientPointer(client, len, (xXIGetClientPointerReply*) rep);
     else if (rep->RepType == X_XIQueryDevice)
         SRepXIQueryDevice(client, len, (xXIQueryDeviceReply*)rep);
+    else if (rep->RepType == X_XIGrabDevice)
+	SRepXIGrabDevice(client, len, (xXIGrabDeviceReply *) rep);
     else {
 	FatalError("XINPUT confused sending swapped reply");
     }
diff --git a/Xi/xigrabdev.c b/Xi/xigrabdev.c
index ef055f5..0e86aa3 100644
--- a/Xi/xigrabdev.c
+++ b/Xi/xigrabdev.c
@@ -63,7 +63,8 @@ ProcXIGrabDevice(ClientPtr client)
     DeviceIntPtr dev;
     xXIGrabDeviceReply rep;
     int ret = Success;
-    int status;
+    uint8_t status;
+    GrabMask mask;
 
     REQUEST(xXIGrabDeviceReq);
     REQUEST_AT_LEAST_SIZE(xXIGetDeviceFocusReq);
@@ -75,14 +76,17 @@ ProcXIGrabDevice(ClientPtr client)
     if (!dev->isMaster)
         stuff->paired_device_mode = GrabModeAsync;
 
+    memset(mask.xi2mask, 0, sizeof(mask.xi2mask));
+    memcpy(mask.xi2mask, (char*)&stuff[1], stuff->mask_len * 4);
+
     ret = GrabDevice(client, dev, stuff->grab_mode,
                      stuff->paired_device_mode,
                      stuff->grab_window,
                      stuff->owner_events,
                      stuff->time,
-                     0 /* mask */,
+                     &mask,
                      GRABTYPE_XI2,
-                     None /* cursor */,
+                     stuff->cursor,
                      None /* confineTo */,
                      &status);
 
@@ -100,3 +104,50 @@ ProcXIGrabDevice(ClientPtr client)
     return ret;
 }
 
+int
+SProcXIUngrabDevice(ClientPtr client)
+{
+    char n;
+
+    REQUEST(xXIUngrabDeviceReq);
+
+    swaps(&stuff->length, n);
+    swaps(&stuff->deviceid, n);
+    swapl(&stuff->time, n);
+
+    return ProcXIUngrabDevice(client);
+}
+
+int
+ProcXIUngrabDevice(ClientPtr client)
+{
+    DeviceIntPtr dev;
+    GrabPtr grab;
+    int ret = Success;
+    TimeStamp time;
+
+    REQUEST(xXIUngrabDeviceReq);
+
+    ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
+    if (ret != Success)
+	return ret;
+
+    grab = dev->deviceGrab.grab;
+
+    time = ClientTimeToServerTime(stuff->time);
+    if ((CompareTimeStamps(time, currentTime) != LATER) &&
+	(CompareTimeStamps(time, dev->deviceGrab.grabTime) != EARLIER) &&
+	(grab) && SameClient(grab, client) && grab->grabtype == GRABTYPE_XI2)
+	(*dev->deviceGrab.DeactivateGrab) (dev);
+
+    return Success;
+}
+
+void SRepXIGrabDevice(ClientPtr client, int size, xXIGrabDeviceReply * rep)
+{
+    char n;
+
+    swaps(&rep->sequenceNumber, n);
+    swapl(&rep->length, n);
+    WriteToClient(client, size, (char *)rep);
+}
diff --git a/Xi/xigrabdev.h b/Xi/xigrabdev.h
index 327d4d5..6136997 100644
--- a/Xi/xigrabdev.h
+++ b/Xi/xigrabdev.h
@@ -29,4 +29,9 @@
 int ProcXIGrabDevice(ClientPtr client);
 int SProcXIGrabDevice(ClientPtr client);
 
+int ProcXIUngrabDevice(ClientPtr client);
+int SProcXIUngrabDevice(ClientPtr client);
+
+void SRepXIGrabDevice(ClientPtr client, int size, xXIGrabDeviceReply * rep);
+
 #endif
commit c11ef87931f920ba782ba4e9b47d9c31ad7c1cf7
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Apr 12 22:16:14 2009 +1000

    Xi: take XI2 requests into account when checking opcodes.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/extinit.c b/Xi/extinit.c
index bedd750..9b1310b 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -391,7 +391,7 @@ static int
 ProcIDispatch(ClientPtr client)
 {
     REQUEST(xReq);
-    if (stuff->data > IREQUESTS || !ProcIVector[stuff->data])
+    if (stuff->data > (IREQUESTS + XI2REQUESTS) || !ProcIVector[stuff->data])
         return BadRequest;
 
     return (*ProcIVector[stuff->data])(client);
commit c94ea5bc055e4efc323e84b7a8266e8b8a4af48e
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Apr 12 17:38:28 2009 +1000

    input: use a GrabMask union in GrabDevice to allow for XI2 masks.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/grabdev.c b/Xi/grabdev.c
index 65997ac..6827fd1 100644
--- a/Xi/grabdev.c
+++ b/Xi/grabdev.c
@@ -104,6 +104,7 @@ ProcXGrabDevice(ClientPtr client)
     int rc;
     xGrabDeviceReply rep;
     DeviceIntPtr dev;
+    GrabMask mask;
     struct tmask tmp[EMASKSIZE];
 
     REQUEST(xGrabDeviceReq);
@@ -126,10 +127,12 @@ ProcXGrabDevice(ClientPtr client)
 				 X_GrabDevice)) != Success)
 	return rc;
 
+    mask.xi = tmp[stuff->deviceid].mask;
+
     rc = GrabDevice(client, dev, stuff->other_devices_mode,
                     stuff->this_device_mode, stuff->grabWindow,
 		    stuff->ownerEvents, stuff->time,
-		    tmp[stuff->deviceid].mask, FALSE, None, None,
+		    &mask, FALSE, None, None,
 		    &rep.status);
 
     if (rc != Success)
diff --git a/dix/events.c b/dix/events.c
index dfbc496..96f3579 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4395,6 +4395,7 @@ ProcGrabPointer(ClientPtr client)
     xGrabPointerReply rep;
     DeviceIntPtr device = PickPointer(client);
     GrabPtr grab;
+    GrabMask mask;
     WindowPtr confineTo;
     CursorPtr oldCursor;
     REQUEST(xGrabPointerReq);
@@ -4431,9 +4432,11 @@ ProcGrabPointer(ClientPtr client)
         oldCursor = grab->cursor;
     }
 
+    mask.core = stuff->eventMask;
+
     rc = GrabDevice(client, device, stuff->pointerMode, stuff->keyboardMode,
                     stuff->grabWindow, stuff->ownerEvents, stuff->time,
-                    stuff->eventMask, GRABTYPE_CORE, stuff->cursor,
+                    &mask, GRABTYPE_CORE, stuff->cursor,
                     stuff->confineTo, &rep.status);
     if (rc != Success)
         return rc;
@@ -4551,7 +4554,7 @@ ProcUngrabPointer(ClientPtr client)
 int
 GrabDevice(ClientPtr client, DeviceIntPtr dev,
            unsigned pointer_mode, unsigned keyboard_mode, Window grabWindow,
-           unsigned ownerEvents, Time ctime, Mask mask,
+           unsigned ownerEvents, Time ctime, GrabMask *mask,
            int grabtype, Cursor curs, Window confineToWin, CARD8 *status)
 {
     WindowPtr pWin, confineTo;
@@ -4643,7 +4646,12 @@ GrabDevice(ClientPtr client, DeviceIntPtr dev,
 	tempGrab.ownerEvents = ownerEvents;
 	tempGrab.keyboardMode = keyboard_mode;
 	tempGrab.pointerMode = pointer_mode;
-	tempGrab.eventMask = mask;
+	if (grabtype == GRABTYPE_CORE)
+	    tempGrab.eventMask = mask->core;
+	else if (grabtype == GRABTYPE_XI)
+	    tempGrab.eventMask = mask->xi;
+	else
+	    memcpy(tempGrab.xi2mask, mask->xi2mask, sizeof(tempGrab.xi2mask));
 	tempGrab.device = dev;
 	tempGrab.cursor = cursor;
 	tempGrab.confineTo = confineTo;
@@ -4666,13 +4674,16 @@ ProcGrabKeyboard(ClientPtr client)
     REQUEST(xGrabKeyboardReq);
     int result;
     DeviceIntPtr keyboard = PickKeyboard(client);
+    GrabMask mask;
 
     REQUEST_SIZE_MATCH(xGrabKeyboardReq);
 
     memset(&rep, 0, sizeof(xGrabKeyboardReply));
+    mask.core = KeyPressMask | KeyReleaseMask;
+
     result = GrabDevice(client, keyboard, stuff->pointerMode,
             stuff->keyboardMode, stuff->grabWindow, stuff->ownerEvents,
-            stuff->time, KeyPressMask | KeyReleaseMask, GRABTYPE_CORE, None, None,
+            stuff->time, &mask, GRABTYPE_CORE, None, None,
             &rep.status);
 
     if (result != Success)
diff --git a/include/dix.h b/include/dix.h
index 8da2189..d4e5039 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -433,7 +433,7 @@ extern int GrabDevice(
     Window /* grabWindow */,
     unsigned /* ownerEvents */,
     Time /* ctime */,
-    Mask /* mask */,
+    GrabMask* /* mask */,
     int /* grabtype */,
     Cursor /* curs */,
     Window /* confineToWin */,
diff --git a/include/input.h b/include/input.h
index baac054..bc9c5be 100644
--- a/include/input.h
+++ b/include/input.h
@@ -103,6 +103,7 @@ typedef struct _OtherClients *OtherClientsPtr;
 typedef struct _InputClients *InputClientsPtr;
 typedef struct _DeviceIntRec *DeviceIntPtr;
 typedef struct _ClassesRec *ClassesPtr;
+typedef union _GrabMask GrabMask;
 
 typedef struct _EventList {
     xEvent* event;
diff --git a/include/inputstr.h b/include/inputstr.h
index 7d666c1..e562c0a 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -156,6 +156,12 @@ typedef enum {
     GRABTYPE_XI2
 } GrabType;
 
+union _GrabMask {
+    Mask core;
+    Mask xi;
+    char xi2mask[EMASKSIZE][XI2MASKSIZE];
+};
+
 /**
  * Central struct for device grabs. 
  * The same struct is used for both core grabs and device grabs, with
commit 6bb4b5b93701535402f65ea828348ed7747c7dbf
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Apr 12 16:20:10 2009 +1000

    Xi: add XI2 grab protocol request handling.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/Makefile.am b/Xi/Makefile.am
index cbec13e..32510f2 100644
--- a/Xi/Makefile.am
+++ b/Xi/Makefile.am
@@ -92,6 +92,8 @@ libXi_la_SOURCES =	\
 	ungrdevk.h \
 	warpdevp.c \
 	warpdevp.h \
+	xigrabdev.c \
+	xigrabdev.h \
 	xiproperty.c \
 	xiproperty.h \
 	xiselectev.c \
diff --git a/Xi/xigrabdev.c b/Xi/xigrabdev.c
new file mode 100644
index 0000000..ef055f5
--- /dev/null
+++ b/Xi/xigrabdev.c
@@ -0,0 +1,102 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer
+ */
+
+/***********************************************************************
+ *
+ * Request to grab or ungrab input device.
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "inputstr.h"	/* DeviceIntPtr      */
+#include "windowstr.h"	/* window structure  */
+#include <X11/extensions/XI2.h>
+#include <X11/extensions/XI2proto.h>
+
+#include "exglobals.h" /* BadDevice */
+#include "xigrabdev.h"
+
+int
+SProcXIGrabDevice(ClientPtr client)
+{
+    char n;
+
+    REQUEST(xXIGrabDeviceReq);
+
+    swaps(&stuff->length, n);
+    swaps(&stuff->deviceid, n);
+    swapl(&stuff->grab_window, n);
+    swapl(&stuff->time, n);
+    swaps(&stuff->mask_len, n);
+
+    return ProcXIGrabDevice(client);
+}
+
+int
+ProcXIGrabDevice(ClientPtr client)
+{
+    DeviceIntPtr dev;
+    xXIGrabDeviceReply rep;
+    int ret = Success;
+    int status;
+
+    REQUEST(xXIGrabDeviceReq);
+    REQUEST_AT_LEAST_SIZE(xXIGetDeviceFocusReq);
+
+    ret = dixLookupDevice(&dev, stuff->deviceid, client, DixSetFocusAccess);
+    if (ret != Success)
+	return ret;
+
+    if (!dev->isMaster)
+        stuff->paired_device_mode = GrabModeAsync;
+
+    ret = GrabDevice(client, dev, stuff->grab_mode,
+                     stuff->paired_device_mode,
+                     stuff->grab_window,
+                     stuff->owner_events,
+                     stuff->time,
+                     0 /* mask */,
+                     GRABTYPE_XI2,
+                     None /* cursor */,
+                     None /* confineTo */,
+                     &status);
+
+    if (ret != Success)
+        return ret;
+
+    rep.repType = X_Reply;
+    rep.RepType = X_XIGrabDevice;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    rep.status = status;
+
+
+    WriteReplyToClient(client, sizeof(rep), &rep);
+    return ret;
+}
+
diff --git a/Xi/xigrabdev.h b/Xi/xigrabdev.h
new file mode 100644
index 0000000..327d4d5
--- /dev/null
+++ b/Xi/xigrabdev.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer
+ */
+
+#ifndef XIGRABDEV_H
+#define XIGRABDEV_H
+
+int ProcXIGrabDevice(ClientPtr client);
+int SProcXIGrabDevice(ClientPtr client);
+
+#endif
commit 09f9a86077f0058ce88ee9b3df5d1ab854eeca43
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Apr 12 16:19:45 2009 +1000

    input: replace GrabRec's coreGrab field with grabtype.
    
    Don't allow grabs of different types to override each other.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 3be5c46..991beca 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1415,7 +1415,7 @@ GrabButton(ClientPtr client, DeviceIntPtr dev, BYTE this_device_mode,
     grab = CreateGrab(client->index, dev, pWin, eventMask,
 		      (Bool) ownerEvents, (Bool) this_device_mode,
 		      (Bool) other_devices_mode, modifier_device, modifiers,
-		      DeviceButtonPress, button, confineTo, cursor);
+		      DeviceButtonPress, GRABTYPE_XI, button, confineTo, cursor);
     if (!grab)
 	return BadAlloc;
     return AddPassiveGrabToList(client, grab);
@@ -1470,8 +1470,8 @@ GrabKey(ClientPtr client, DeviceIntPtr dev, BYTE this_device_mode,
 
     grab = CreateGrab(client->index, dev, pWin,
 		      mask, ownerEvents, this_device_mode, other_devices_mode,
-		      modifier_device, modifiers, DeviceKeyPress, key,
-		      NullWindow, NullCursor);
+		      modifier_device, modifiers, DeviceKeyPress, GRABTYPE_XI,
+		      key, NullWindow, NullCursor);
     if (!grab)
 	return BadAlloc;
     return AddPassiveGrabToList(client, grab);
diff --git a/Xi/ungrdev.c b/Xi/ungrdev.c
index b5b572a..a09c3d0 100644
--- a/Xi/ungrdev.c
+++ b/Xi/ungrdev.c
@@ -104,7 +104,7 @@ ProcXUngrabDevice(ClientPtr client)
     time = ClientTimeToServerTime(stuff->time);
     if ((CompareTimeStamps(time, currentTime) != LATER) &&
 	(CompareTimeStamps(time, dev->deviceGrab.grabTime) != EARLIER) &&
-	(grab) && SameClient(grab, client) && !grab->coreGrab)
+	(grab) && SameClient(grab, client) && grab->grabtype == GRABTYPE_XI)
 	(*dev->deviceGrab.DeactivateGrab) (dev);
     return Success;
 }
diff --git a/dix/events.c b/dix/events.c
index 34ea414..dfbc496 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2057,7 +2057,12 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
 	tempGrab.pointerMode = GrabModeAsync;
 	tempGrab.confineTo = NullWindow;
 	tempGrab.cursor = NullCursor;
-        tempGrab.coreGrab = (type == ButtonPress);
+        if (type == ButtonPress)
+            tempGrab.grabtype = GRABTYPE_CORE;
+        else if (type == DeviceButtonPress)
+            tempGrab.grabtype = GRABTYPE_XI;
+        else
+            tempGrab.grabtype = GRABTYPE_XI2;
 
         /* get the XI and XI2 device mask */
         inputMasks = wOtherInputMasks(pWin);
@@ -3298,7 +3303,7 @@ CheckPassiveGrabsOnWindow(
 	XkbSrvInfoPtr	xkbi = NULL;
 
 	gdev= grab->modifierDevice;
-        if (grab->coreGrab)
+        if (grab->grabtype == GRABTYPE_CORE)
         {
             if (IsPointerDevice(device))
                 gdev = GetPairedDevice(device);
@@ -3351,14 +3356,14 @@ CheckPassiveGrabsOnWindow(
              * device.
              */
 
-            if (grab->coreGrab)
+            if (grab->grabtype == GRABTYPE_CORE)
             {
                 DeviceIntPtr other;
                 BOOL interfering = FALSE;
                 for (other = inputInfo.devices; other; other = other->next)
                 {
                     GrabPtr othergrab = other->deviceGrab.grab;
-                    if (othergrab && othergrab->coreGrab &&
+                    if (othergrab && othergrab->grabtype == GRABTYPE_CORE &&
                         SameClient(grab, rClient(othergrab)) &&
                         ((IsPointerDevice(grab->device) &&
                          IsPointerDevice(othergrab->device)) ||
@@ -3679,7 +3684,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
 
         sendCore = (thisDev->isMaster && thisDev->coreEvents);
         /* try core event */
-        if (sendCore && grab->coreGrab)
+        if (sendCore && grab->grabtype == GRABTYPE_CORE)
         {
             xEvent core;
 
@@ -4428,7 +4433,7 @@ ProcGrabPointer(ClientPtr client)
 
     rc = GrabDevice(client, device, stuff->pointerMode, stuff->keyboardMode,
                     stuff->grabWindow, stuff->ownerEvents, stuff->time,
-                    stuff->eventMask, TRUE, stuff->cursor,
+                    stuff->eventMask, GRABTYPE_CORE, stuff->cursor,
                     stuff->confineTo, &rep.status);
     if (rc != Success)
         return rc;
@@ -4547,7 +4552,7 @@ int
 GrabDevice(ClientPtr client, DeviceIntPtr dev,
            unsigned pointer_mode, unsigned keyboard_mode, Window grabWindow,
            unsigned ownerEvents, Time ctime, Mask mask,
-           Bool coreGrab, Cursor curs, Window confineToWin, CARD8 *status)
+           int grabtype, Cursor curs, Window confineToWin, CARD8 *status)
 {
     WindowPtr pWin, confineTo;
     GrabPtr grab;
@@ -4610,6 +4615,8 @@ GrabDevice(ClientPtr client, DeviceIntPtr dev,
 
     time = ClientTimeToServerTime(ctime);
     grab = grabInfo->grab;
+    if (grab && grab->grabtype != grabtype)
+        *status = AlreadyGrabbed;
     if (grab && !SameClient(grab, client))
 	*status = AlreadyGrabbed;
     else if ((!pWin->realized) ||
@@ -4640,7 +4647,7 @@ GrabDevice(ClientPtr client, DeviceIntPtr dev,
 	tempGrab.device = dev;
 	tempGrab.cursor = cursor;
 	tempGrab.confineTo = confineTo;
-	tempGrab.coreGrab = coreGrab;
+	tempGrab.grabtype = grabtype;
 	(*grabInfo->ActivateGrab)(dev, &tempGrab, time, FALSE);
 	*status = GrabSuccess;
     }
@@ -4665,7 +4672,7 @@ ProcGrabKeyboard(ClientPtr client)
     memset(&rep, 0, sizeof(xGrabKeyboardReply));
     result = GrabDevice(client, keyboard, stuff->pointerMode,
             stuff->keyboardMode, stuff->grabWindow, stuff->ownerEvents,
-            stuff->time, KeyPressMask | KeyReleaseMask, TRUE, None, None,
+            stuff->time, KeyPressMask | KeyReleaseMask, GRABTYPE_CORE, None, None,
             &rep.status);
 
     if (result != Success)
@@ -4698,7 +4705,7 @@ ProcUngrabKeyboard(ClientPtr client)
     time = ClientTimeToServerTime(stuff->id);
     if ((CompareTimeStamps(time, currentTime) != LATER) &&
 	(CompareTimeStamps(time, device->deviceGrab.grabTime) != EARLIER) &&
-	(grab) && SameClient(grab, client) && grab->coreGrab)
+	(grab) && SameClient(grab, client) && grab->grabtype == GRABTYPE_CORE)
 	(*device->deviceGrab.DeactivateGrab)(device);
     return Success;
 }
@@ -5038,7 +5045,7 @@ ProcGrabKey(ClientPtr client)
     grab = CreateGrab(client->index, keybd, pWin,
 	(Mask)(KeyPressMask | KeyReleaseMask), (Bool)stuff->ownerEvents,
 	(Bool)stuff->keyboardMode, (Bool)stuff->pointerMode,
-	keybd, stuff->modifiers, KeyPress, stuff->key,
+	keybd, stuff->modifiers, KeyPress, GRABTYPE_CORE, stuff->key,
 	NullWindow, NullCursor);
     if (!grab)
 	return BadAlloc;
@@ -5130,7 +5137,7 @@ ProcGrabButton(ClientPtr client)
     grab = CreateGrab(client->index, ptr, pWin,
         (Mask)stuff->eventMask, (Bool)stuff->ownerEvents,
         (Bool) stuff->keyboardMode, (Bool)stuff->pointerMode,
-        modifierDevice, stuff->modifiers, ButtonPress,
+        modifierDevice, stuff->modifiers, ButtonPress, GRABTYPE_CORE,
         stuff->button, confineTo, cursor);
     if (!grab)
 	return BadAlloc;
@@ -5564,7 +5571,7 @@ PickPointer(ClientPtr client)
     for(it = inputInfo.devices; it; it = it->next)
     {
         GrabPtr grab = it->deviceGrab.grab;
-        if (grab && grab->coreGrab && SameClient(grab, client))
+        if (grab && grab->grabtype == GRABTYPE_CORE && SameClient(grab, client))
         {
             if (!IsPointerDevice(it))
                 it = GetPairedDevice(it);
diff --git a/dix/grabs.c b/dix/grabs.c
index 2d3327c..cd34f7e 100644
--- a/dix/grabs.c
+++ b/dix/grabs.c
@@ -76,6 +76,7 @@ CreateGrab(
     DeviceIntPtr modDevice,
     unsigned short modifiers,
     int type,
+    int grabtype,
     KeyCode keybut,	/* key or button */
     WindowPtr confineTo,
     CursorPtr cursor)
@@ -87,7 +88,6 @@ CreateGrab(
 	return (GrabPtr)NULL;
     grab->resource = FakeClientID(client);
     grab->device = device;
-    grab->coreGrab = (type < LASTEvent);
     grab->window = window;
     grab->eventMask = eventMask;
     grab->deviceMask = 0;
@@ -98,6 +98,7 @@ CreateGrab(
     grab->modifiersDetail.pMask = NULL;
     grab->modifierDevice = modDevice;
     grab->type = type;
+    grab->grabtype = grabtype;
     grab->detail.exact = keybut;
     grab->detail.pMask = NULL;
     grab->confineTo = confineTo;
@@ -411,7 +412,8 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
 	 grab = grab->next)
     {
 	if ((CLIENT_BITS(grab->resource) != CLIENT_BITS(pMinuendGrab->resource)) ||
-	    !GrabMatchesSecond(grab, pMinuendGrab, (grab->coreGrab)))
+	    !GrabMatchesSecond(grab, pMinuendGrab,
+                               (grab->grabtype == GRABTYPE_CORE)))
 	    continue;
 	if (GrabSupersedesSecond(pMinuendGrab, grab))
 	{
@@ -442,6 +444,7 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
 				  (Bool)grab->pointerMode,
 				  grab->modifierDevice,
 				  AnyModifier, (int)grab->type,
+                                  grab->grabtype,
 				  pMinuendGrab->detail.exact,
 				  grab->confineTo, grab->cursor);
 	    if (!pNewGrab)
diff --git a/include/dix.h b/include/dix.h
index 14d6843..8da2189 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -434,7 +434,7 @@ extern int GrabDevice(
     unsigned /* ownerEvents */,
     Time /* ctime */,
     Mask /* mask */,
-    Bool /* coreGrab */,
+    int /* grabtype */,
     Cursor /* curs */,
     Window /* confineToWin */,
     CARD8 * /* status */);
diff --git a/include/dixgrabs.h b/include/dixgrabs.h
index 36ab2b9..5127239 100644
--- a/include/dixgrabs.h
+++ b/include/dixgrabs.h
@@ -37,6 +37,7 @@ extern _X_EXPORT GrabPtr CreateGrab(
 	DeviceIntPtr /* modDevice */,
 	unsigned short /* modifiers */,
 	int /* type */,
+	int /* grabtype */,
 	KeyCode /* keybut */,
 	WindowPtr /* confineTo */,
 	CursorPtr /* cursor */);
diff --git a/include/inputstr.h b/include/inputstr.h
index 14941b1..7d666c1 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -150,6 +150,12 @@ typedef struct _DetailRec {		/* Grab details may be bit masks */
     Mask                *pMask;
 } DetailRec;
 
+typedef enum {
+    GRABTYPE_CORE,
+    GRABTYPE_XI,
+    GRABTYPE_XI2
+} GrabType;
+
 /**
  * Central struct for device grabs. 
  * The same struct is used for both core grabs and device grabs, with
@@ -171,7 +177,7 @@ typedef struct _GrabRec {
     unsigned		ownerEvents:1;
     unsigned		keyboardMode:1;
     unsigned		pointerMode:1;
-    unsigned		coreGrab:1;	/* grab is on core device */
+    GrabType		grabtype;
     CARD8		type;		/* event type */
     DetailRec		modifiersDetail;
     DeviceIntPtr	modifierDevice;
commit 7fbe1b7d63c94b344e8ff9d09c0bb162ca104909
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sat Apr 11 13:10:31 2009 +1000

    Xi: remove the GetExtensionVersion hack.
    
    Squashing data into a request that's defined to be padding is probably not the
    best idea.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/getvers.c b/Xi/getvers.c
index 2ca3bb3..c8eacc1 100644
--- a/Xi/getvers.c
+++ b/Xi/getvers.c
@@ -92,7 +92,6 @@ int
 ProcXGetExtensionVersion(ClientPtr client)
 {
     xGetExtensionVersionReply rep;
-    XIClientPtr pXIClient;
 
     REQUEST(xGetExtensionVersionReq);
     REQUEST_AT_LEAST_SIZE(xGetExtensionVersionReq);
@@ -101,21 +100,6 @@ ProcXGetExtensionVersion(ClientPtr client)
 			  stuff->nbytes + 3) >> 2)
 	return BadLength;
 
-    pXIClient = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
-
-    /* GetExtensionVersionReq before XI 2 didn't supply the client's
-     * major/minor. So we don't actually have a clue what they support.
-     * {major|minor}Version was added as part of XI, so if they are set, we
-     * know we can trust it. In this case the client must set nbytes to 0
-     * though, otherwise we have to assume that the version are padding
-     * garbage.
-     */
-    if (!stuff->nbytes) /* Client using XQueryInputVersion(). */
-    {
-        pXIClient->major_version = stuff->majorVersion;
-        pXIClient->minor_version = stuff->minorVersion;
-    } /* else version unknown, leave it at 0.0 */
-
     memset(&rep, 0, sizeof(xGetExtensionVersionReply));
     rep.repType = X_Reply;
     rep.RepType = X_GetExtensionVersion;
commit 73e1055b1275470dcc2d53b15898c866d9721d3e
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sat Apr 11 11:19:29 2009 +1000

    Xi: fix a typo in a #ifdef
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiproperty.h b/Xi/xiproperty.h
index bf562b1..e66b447 100644
--- a/Xi/xiproperty.h
+++ b/Xi/xiproperty.h
@@ -23,8 +23,8 @@
  * Author: Peter Hutterer
  */
 
-#ifndef XIPROPERTY_C
-#define XIPROPERTY_C
+#ifndef XIPROPERTY_H
+#define XIPROPERTY_H
 
 int ProcXListDeviceProperties     (ClientPtr client);
 int ProcXChangeDeviceProperty     (ClientPtr client);
@@ -43,4 +43,4 @@ void SRepXListDeviceProperties(ClientPtr client, int size,
 void SRepXGetDeviceProperty(ClientPtr client, int size,
                             xGetDevicePropertyReply *rep);
 
-#endif /* XIPROPERTY_C */
+#endif /* XIPROPERTY_H */
commit cbbc7fed994448852961a987a8b0eadf718b24bf
Author: Simon Thum <simon.thum at gmx.de>
Date:   Wed Apr 1 10:53:10 2009 +0200

    dix: correctly utilize tracker buffer and protect from timer overruns
    
    two small related fixes hard to split up
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c
index 92dc589..1590cfd 100644
--- a/dix/ptrveloc.c
+++ b/dix/ptrveloc.c
@@ -98,7 +98,7 @@ InitVelocityData(DeviceVelocityPtr s)
     s->min_acceleration = 1.0; /* don't decelerate */
     s->max_rel_diff = 0.2;
     s->max_diff = 1.0;
-    s->initial_range = 1;
+    s->initial_range = 2;
     s->average_accel = TRUE;
     SetAccelerationProfile(s, AccelProfileClassic);
     InitTrackers(s, 16);
@@ -445,8 +445,8 @@ FeedTrackers(DeviceVelocityPtr s, int dx, int dy, int cur_t)
 	s->tracker[n].dy += dy;
     }
     n = (s->cur_tracker + 1) % s->num_tracker;
-    s->tracker[n].dx = dx;
-    s->tracker[n].dy = dy;
+    s->tracker[n].dx = 0;
+    s->tracker[n].dy = 0;
     s->tracker[n].time = cur_t;
     s->tracker[n].dir = GetDirection(dx, dy);
     DebugAccelF("(dix prtacc) motion [dx: %i dy: %i dir:%i diff: %i]\n",
@@ -465,7 +465,7 @@ CalcTracker(DeviceVelocityPtr s, int offset, int cur_t){
     int index = TRACKER_INDEX(s, offset);
     float dist = sqrt(  s->tracker[index].dx * s->tracker[index].dx
                       + s->tracker[index].dy * s->tracker[index].dy);
-    int dtime = cur_t - s->tracker[TRACKER_INDEX(s, offset+1)].time;
+    int dtime = cur_t - s->tracker[index].time;
     if(dtime > 0)
 	return (dist / dtime);
     else
@@ -476,20 +476,22 @@ CalcTracker(DeviceVelocityPtr s, int offset, int cur_t){
  * (in time) tracker which isn't too old, beyond a linear partition,
  * or simply too much off initial velocity.
  *
- * min_t should be (now - ~100-600 ms). May return 0.
+ * May return 0.
  */
 static float
-QueryTrackers(DeviceVelocityPtr s, int min_t, int cur_t){
-    int n, offset, dir = 255, i = -1;
+QueryTrackers(DeviceVelocityPtr s, int cur_t){
+    int n, offset, dir = 255, i = -1, age_ms;
     /* initial velocity: a low-offset, valid velocity */
     float iveloc = 0, res = 0, tmp, vdiff;
     float vfac =  s->corr_mul * s->const_acceleration; /* premultiply */
     /* loop from current to older data */
-    for(offset = 0; offset < s->num_tracker-1; offset++){
+    for(offset = 1; offset < s->num_tracker; offset++){
 	n = TRACKER_INDEX(s, offset);
 
-	/* bail out if data is too old */
-	if(s->tracker[TRACKER_INDEX(s, offset+1)].time < min_t){
+	age_ms = cur_t - s->tracker[n].time;
+
+	/* bail out if data is too old and protect from overrun */
+	if (age_ms >= s->reset_time || age_ms < 0) {
 	    DebugAccelF("(dix prtacc) query: tracker too old\n");
 	    break;
 	}
@@ -566,7 +568,7 @@ ProcessVelocityData2D(
 
     FeedTrackers(s, dx, dy, time);
 
-    velocity = QueryTrackers(s, time - s->reset_time, time);
+    velocity = QueryTrackers(s, time);
 
     s->velocity = velocity;
     return velocity == 0;
commit ca4918ac2ff003142aefbd8ac7ec2bc398ccc6eb
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Apr 9 19:31:04 2009 +1000

    Xi: remove fail from SProcXISelectEvent.
    
    Leftover from rebasing once too often, I guess.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index cdb9c6f..607b9b4 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -42,7 +42,6 @@ SProcXISelectEvent(ClientPtr client)
     char n;
     int i;
     xXIDeviceEventMask* evmask;
-    uint16_t *evtype;
 
     REQUEST(xXISelectEventsReq);
     swaps(&stuff->length, n);
@@ -55,7 +54,7 @@ SProcXISelectEvent(ClientPtr client)
     {
         swaps(&evmask->deviceid, n);
         swaps(&evmask->mask_len, n);
-        evmask = (xXIDeviceEventMask*)(((char*)evtype) + evmask->mask_len * 4);
+        evmask = (xXIDeviceEventMask*)(((char*)evmask) + evmask->mask_len * 4);
     }
 
     return (ProcXISelectEvent(client));
commit 463676f016a105a790cbb386d20eb5b188c04652
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Apr 9 19:11:59 2009 +1000

    Xi: remove un-used variable pXIClient
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/opendev.c b/Xi/opendev.c
index 833ecbb..4ad5af2 100644
--- a/Xi/opendev.c
+++ b/Xi/opendev.c
@@ -97,7 +97,6 @@ ProcXOpenDevice(ClientPtr client)
     int status = Success;
     xOpenDeviceReply rep;
     DeviceIntPtr dev;
-    XIClientPtr pXIClient;
 
     REQUEST(xOpenDeviceReq);
     REQUEST_SIZE_MATCH(xOpenDeviceReq);
commit 32b13ec4cd42842a133aa6428f49638b0448efc9
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Apr 9 19:11:27 2009 +1000

    Xi: silence compiler warnings about "wrong" event types.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 4aa5fbf..3be5c46 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -919,7 +919,7 @@ ProcessRawEvent(RawDeviceEvent *ev, DeviceIntPtr device)
     GrabPtr grab = device->deviceGrab.grab;
 
     if (grab)
-        DeliverGrabbedEvent(ev, device, FALSE);
+        DeliverGrabbedEvent((InternalEvent*)ev, device, FALSE);
     else { /* deliver to all root windows */
         xEvent *xi;
         int i;
@@ -1077,12 +1077,13 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
 
 
     if (grab)
-        DeliverGrabbedEvent(event, device, deactivateDeviceGrab);
+        DeliverGrabbedEvent((InternalEvent*)event, device, deactivateDeviceGrab);
     else if (device->focus && !IsPointerEvent((InternalEvent*)ev))
-	DeliverFocusedEvent(device, event, GetSpriteWindow(device));
+        DeliverFocusedEvent(device, (InternalEvent*)event,
+                            GetSpriteWindow(device));
     else
-	DeliverDeviceEvents(GetSpriteWindow(device), event, NullGrab,
-                            NullWindow, device);
+        DeliverDeviceEvents(GetSpriteWindow(device), (InternalEvent*)event,
+                            NullGrab, NullWindow, device);
 
     if (deactivateDeviceGrab == TRUE)
 	(*device->deviceGrab.DeactivateGrab) (device);
commit f2e957c5342aefc8329e9fe282b7072f767fcd28
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Apr 9 19:07:36 2009 +1000

    mi: add prototype for CopyGetMasterEvent.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/mi/mi.h b/mi/mi.h
index 076cea7..182cea5 100644
--- a/mi/mi.h
+++ b/mi/mi.h
@@ -221,6 +221,13 @@ extern _X_EXPORT void mieqProcessInputEvents(
     void
 );
 
+extern void CopyGetMasterEvent(
+    DeviceIntPtr /* mdev */,
+    DeviceIntPtr /* sdev */,
+    InternalEvent* /* original */,
+    EventListPtr /* master */
+);
+
 /**
  * Custom input event handler. If you need to process input events in some
  * other way than the default path, register an input event handler for the
commit d80798ba2ae018086aaf230fcd8bc71d3bf06b11
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Apr 9 20:27:00 2009 +1000

    mi: fix wrong (*EnqueueEvent) declaration in miPointerScreenFuncRec.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/mi/mipointer.h b/mi/mipointer.h
index 259ac14..f385b7e 100644
--- a/mi/mipointer.h
+++ b/mi/mipointer.h
@@ -82,7 +82,7 @@ typedef struct _miPointerScreenFuncRec {
                     );
     void	(*EnqueueEvent)(
                     DeviceIntPtr /* pDev */,
-                    xEventPtr /* event */
+                    InternalEvent* /* event */
                     );
     void	(*NewEventScreen)(
 		    DeviceIntPtr /* pDev */,
commit 4dedb900f4fbd3bdc9538b1e82cab2044438a770
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Apr 9 08:42:06 2009 +1000

    xfree86: shut up compiler warnings - typecast to InternalEvent
    
    Reported-by: Eric Anholt <eric at anholt.net>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 4f84a4c..19120ce 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -428,7 +428,7 @@ xf86ReleaseKeys(DeviceIntPtr pDev)
             sigstate = xf86BlockSIGIO ();
             nevents = GetKeyboardEvents(xf86Events, pDev, KeyRelease, i);
             for (j = 0; j < nevents; j++)
-                mieqEnqueue(pDev, (xf86Events + j)->event);
+                mieqEnqueue(pDev, (InternalEvent*)(xf86Events + j)->event);
             xf86UnblockSIGIO(sigstate);
         }
     }
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 3a56b49..96aff15 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -792,7 +792,7 @@ xf86PostMotionEventP(DeviceIntPtr	device,
         /* Don't post core motion events for devices not registered to send
          * drag events. */
         if (xE->u.u.type != MotionNotify || drag) {
-            mieqEnqueue(device, (xf86Events + i)->event);
+            mieqEnqueue(device, (InternalEvent*)((xf86Events + i)->event));
         }
     }
 }
@@ -825,7 +825,7 @@ xf86PostProximityEvent(DeviceIntPtr	device,
                                  is_in ? ProximityIn : ProximityOut, 
                                  first_valuator, num_valuators, valuators);
     for (i = 0; i < nevents; i++)
-        mieqEnqueue(device, (xf86Events + i)->event);
+        mieqEnqueue(device, (InternalEvent*)((xf86Events + i)->event));
 
 }
 
@@ -868,7 +868,7 @@ xf86PostButtonEvent(DeviceIntPtr	device,
                                first_valuator, num_valuators, valuators);
 
     for (i = 0; i < nevents; i++)
-        mieqEnqueue(device, (xf86Events + i)->event);
+        mieqEnqueue(device, (InternalEvent*)((xf86Events + i)->event));
 
 }
 
@@ -915,7 +915,7 @@ xf86PostKeyEvent(DeviceIntPtr	device,
     }
 
     for (i = 0; i < nevents; i++)
-        mieqEnqueue(device, (xf86Events + i)->event);
+        mieqEnqueue(device, (InternalEvent*)((xf86Events + i)->event));
 }
 
 void
@@ -944,7 +944,7 @@ xf86PostKeyboardEvent(DeviceIntPtr      device,
                                 is_down ? KeyPress : KeyRelease, key_code);
 
     for (i = 0; i < nevents; i++)
-        mieqEnqueue(device, (xf86Events + i)->event);
+        mieqEnqueue(device, (InternalEvent*)((xf86Events + i)->event));
 }
 
 LocalDevicePtr
commit 4fa7fcf610d2ab91c1158f8034bbc0531060a86f
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Apr 9 08:40:20 2009 +1000

    mi: fix compiler warning - explicitly typecast to InternalEvent.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/mi/mipointer.c b/mi/mipointer.c
index 857a8ca..e87fe79 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -581,7 +581,7 @@ miPointerMove (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
     darwinEvents_lock();
 #endif
     for (i = 0; i < nevents; i++)
-        mieqEnqueue(pDev, events[i].event);
+        mieqEnqueue(pDev, (InternalEvent*)events[i].event);
 #ifdef XQUARTZ
     darwinEvents_unlock();
 #endif
commit 8bf2f562678107c346e8664f18c10f315c2768f5
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Apr 9 08:14:39 2009 +1000

    dix: fix dev/keybd variable mixup.
    
    Reported-by: Eric Anhold <eric at anholt.net>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/devices.c b/dix/devices.c
index 27148d6..ed6e6bd 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1930,14 +1930,14 @@ ProcBell(ClientPtr client)
     else
 	newpercent = base - newpercent + stuff->percent;
 
-    for (keybd = inputInfo.devices; keybd; keybd = keybd->next) {
+    for (dev = inputInfo.devices; dev; dev = dev->next) {
         if ((dev == keybd || (!dev->isMaster && dev->u.master == keybd)) &&
-            keybd->kbdfeed && keybd->kbdfeed->BellProc) {
+            dev->kbdfeed && dev->kbdfeed->BellProc) {
 
 	    rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixBellAccess);
 	    if (rc != Success)
 		return rc;
-            XkbHandleBell(FALSE, FALSE, keybd, newpercent,
+            XkbHandleBell(FALSE, FALSE, dev, newpercent,
                           &dev->kbdfeed->ctrl, 0, None, NULL, client);
         }
     }
commit 012cb1956a69f6cf2a878c5331e792fb12c73e9d
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Apr 9 08:06:32 2009 +1000

    xfree86: fix use of uninitialized variable in DGAProcessPointerEvent.
    
    Reported-by: Eric Anholt <eric at anholt.net>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index 4cc530a..f83bcd5 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -1088,7 +1088,6 @@ static void
 DGAProcessPointerEvent (ScreenPtr pScreen, DGAEvent *event, DeviceIntPtr mouse)
 {
     ButtonClassPtr  butc = mouse->button;
-    int		    coreEquiv;
     DGAScreenPtr    pScreenPriv = DGA_GET_SCREEN_PRIV(pScreen);
     DeviceEvent     ev;
 
@@ -1107,7 +1106,11 @@ DGAProcessPointerEvent (ScreenPtr pScreen, DGAEvent *event, DeviceIntPtr mouse)
     if (pScreenPriv->client)
     {
         dgaEvent        de;
-        de.u.u.type = *XDGAEventBase + GetCoreType((InternalEvent*)&ev);
+        int		coreEquiv;
+
+        coreEquiv = GetCoreType((InternalEvent*)&ev);
+
+        de.u.u.type = *XDGAEventBase + coreEquiv;
         de.u.u.detail = event->detail;
         de.u.event.time = event->time;
         de.u.event.dx = 0;
commit 73b01a9aac5fde46ccd90c08a070e9d2496092b9
Author: Simon Thum <simon.thum at gmx.de>
Date:   Wed Apr 8 14:35:01 2009 +0200

    dix: fix pointer accelerations remainder handling
    
    This didn't really work as intended, but did amazingly well thanks
    to roundf() hiding the defect. Cheers!
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c
index 2d6763e..92dc589 100644
--- a/dix/ptrveloc.c
+++ b/dix/ptrveloc.c
@@ -950,7 +950,7 @@ acceleratePointerPredictable(
     int *px = NULL, *py = NULL;
     DeviceVelocityPtr velocitydata =
 	(DeviceVelocityPtr) pDev->valuator->accelScheme.accelData;
-    float fdx, fdy; /* no need to init */
+    float fdx, fdy, tmp; /* no need to init */
     Bool soften = TRUE;
 
     if (!num_valuators || !valuators || !velocitydata)
@@ -985,14 +985,14 @@ acceleratePointerPredictable(
 						       (mult > 1.0) && soften);
 
                 if (dx) {
-                    pDev->last.remainder[0] = roundf(mult * fdx + pDev->last.remainder[0]);
-                    *px = (int)pDev->last.remainder[0];
-                    pDev->last.remainder[0] = pDev->last.remainder[0] - (float)*px;
+                    tmp = mult * fdx + pDev->last.remainder[0];
+                    *px = (int)roundf(tmp);
+                    pDev->last.remainder[0] = tmp - (float)*px;
                 }
                 if (dy) {
-                    pDev->last.remainder[1] = roundf(mult * fdy + pDev->last.remainder[1]);
-                    *py = (int)pDev->last.remainder[1];
-                    pDev->last.remainder[1] = pDev->last.remainder[1] - (float)*py;
+                    tmp = mult * fdy + pDev->last.remainder[1];
+                    *py = (int)roundf(tmp);
+                    pDev->last.remainder[1] = tmp - (float)*py;
                 }
             }
         }
commit 4318075140cc287871d3c3b9f777289ea4ffa23a
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Apr 7 21:51:02 2009 +1000

    dix: store subpixel precision and send it down the wire to the client.
    
    For the valuator data, not yet for root x/y and event x/y.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index 4cd5567..8b973a5 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -357,7 +357,7 @@ eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
     xXIDeviceEvent *xde;
     int i, btlen, vallen;
     char *ptr;
-    int32_t *axisval;
+    FP3232 *axisval;
 
     /* FIXME: this should just send the buttons we have, not MAX_BUTTONs. Same
      * with MAX_VALUATORS below */
@@ -401,15 +401,15 @@ eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
     }
 
     ptr += xde->buttons_len * 4;
-    axisval = (int32_t*)(ptr + xde->valuators_len * 4);
+    axisval = (FP3232*)(ptr + xde->valuators_len * 4);
     for (i = 0; i < sizeof(ev->valuators.mask) * 8; i++)
     {
         if (BitIsOn(ev->valuators.mask, i))
         {
             SetBit(ptr, i);
-            *axisval = ev->valuators.data[i];
+            axisval->integral = ev->valuators.data[i];
+            axisval->frac = ev->valuators.data_frac[i];
             axisval++;
-            axisval++; /* FIXME: this should be the frac. part */
         }
     }
 
@@ -451,9 +451,10 @@ eventToRawEvent(RawDeviceEvent *ev, xEvent **xi)
         {
             SetBit(ptr, i);
             axisval->integral = ev->valuators.data[i];
+            axisval->frac = ev->valuators.data_frac[i];
             (axisval + nvals)->integral = ev->valuators.data_raw[i];
+            (axisval + nvals)->frac = ev->valuators.data_raw_frac[i];
             axisval++;
-            /* FIXME: frac part */
         }
     }
 
diff --git a/dix/getevents.c b/dix/getevents.c
index b0bacbd..7aafc98 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -174,10 +174,13 @@ set_valuators(DeviceIntPtr dev, DeviceEvent* event, int first_valuator,
         SetBit(event->valuators.mask, i);
         if (dev->valuator->mode == Absolute)
             SetBit(event->valuators.mode, i);
+        event->valuators.data_frac[first_valuator + i] =
+            dev->last.remainder[first_valuator + i] * (1 << 16) * (1 << 16);
     }
 
     memcpy(&event->valuators.data[first_valuator],
            valuators, num_valuators * sizeof(uint32_t));
+
 }
 
 void
diff --git a/include/events.h b/include/events.h
index a289662..da8f58a 100644
--- a/include/events.h
+++ b/include/events.h
@@ -93,6 +93,7 @@ typedef struct
         uint8_t  mask[(MAX_VALUATORS + 7)/8]; /**< Valuator mask */
         uint8_t  mode[(MAX_VALUATORS + 7)/8]; /**< Valuator mode (Abs or Rel)*/
         uint32_t data[MAX_VALUATORS];         /**< Valuator data */
+        int32_t  data_frac[MAX_VALUATORS];    /**< Fractional part for data */
     } valuators;
     struct {
         uint32_t base;    /**< XKB base modifiers */
@@ -191,7 +192,9 @@ typedef struct
     struct {
         uint8_t  mask[(MAX_VALUATORS + 7)/8]; /**< Valuator mask */
         int32_t  data[MAX_VALUATORS];         /**< Valuator data */
+        int32_t  data_frac[MAX_VALUATORS];    /**< Fractional part for data */
         int32_t  data_raw[MAX_VALUATORS];     /**< Valuator data as posted */
+        int32_t  data_raw_frac[MAX_VALUATORS];/**< Fractional part for data_raw */
     } valuators;
 } RawDeviceEvent;
 
commit 9212948461c5e053abb61fff73ced4a00f138544
Author: Simon Thum <simon.thum at gmx.de>
Date:   Sat Mar 21 18:19:19 2009 +0100

    dix: allow relative motion buffer to accumulate in a natural way
    
    Since with XI2 we pass sub-pixel motion, anything else is broken.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c
index a3a0451..2d6763e 100644
--- a/dix/ptrveloc.c
+++ b/dix/ptrveloc.c
@@ -968,12 +968,6 @@ acceleratePointerPredictable(
     if (dx || dy){
         /* reset non-visible state? */
         if (ProcessVelocityData2D(velocitydata, dx , dy, evtime)) {
-            /* if nv-reset: set to center of pixel.
-             * makes sense as long as there are no means of passing on
-             * sub-pixel values to apps(XI2?). If you remove it, make
-             * sure suitable rounding is applied below.
-             */
-            pDev->last.remainder[0] = pDev->last.remainder[1] = 0;
             soften = FALSE;
         }
 
commit 6c3b633299f12051fcf37fb8439f358de876cf03
Merge: adf21db... 0cfd481...
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Apr 7 19:36:27 2009 +1000

    Merge branch 'master' into xi2

commit adf21dba7617542f08309415e315d4b2699c10e0
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Mar 19 20:40:43 2009 +1000

    include: un-export a bunch of server-only functions.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/dix.h b/include/dix.h
index 87f49e8..14d6843 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -327,36 +327,36 @@ extern _X_EXPORT WindowPtr GetSpriteWindow(DeviceIntPtr pDev);
 
 extern _X_EXPORT void NoticeEventTime(InternalEvent *ev);
 
-extern _X_EXPORT void EnqueueEvent(
+extern void EnqueueEvent(
     InternalEvent * /* ev */,
     DeviceIntPtr  /* device */);
 
-extern _X_EXPORT void ActivatePointerGrab(
+extern void ActivatePointerGrab(
     DeviceIntPtr /* mouse */,
     GrabPtr /* grab */,
     TimeStamp /* time */,
     Bool /* autoGrab */);
 
-extern _X_EXPORT void DeactivatePointerGrab(
+extern void DeactivatePointerGrab(
     DeviceIntPtr /* mouse */);
 
-extern _X_EXPORT void ActivateKeyboardGrab(
+extern void ActivateKeyboardGrab(
     DeviceIntPtr /* keybd */,
     GrabPtr /* grab */,
     TimeStamp /* time */,
     Bool /* passive */);
 
-extern _X_EXPORT void DeactivateKeyboardGrab(
+extern void DeactivateKeyboardGrab(
     DeviceIntPtr /* keybd */);
 
-extern _X_EXPORT void AllowSome(
+extern void AllowSome(
     ClientPtr	/* client */,
     TimeStamp /* time */,
     DeviceIntPtr /* thisDev */,
     int /* newState */,
     Bool /* core */);
 
-extern _X_EXPORT void ReleaseActiveGrabs(
+extern void ReleaseActiveGrabs(
     ClientPtr client);
 
 extern _X_EXPORT int DeliverEventsToWindow(
@@ -367,57 +367,57 @@ extern _X_EXPORT int DeliverEventsToWindow(
     Mask /* filter */,
     GrabPtr /* grab */);
 
-extern _X_EXPORT int DeliverDeviceEvents(
+extern int DeliverDeviceEvents(
     WindowPtr /* pWin */,
     InternalEvent* /* event */,
     GrabPtr /* grab */,
     WindowPtr /* stopAt */,
     DeviceIntPtr /* dev */);
 
-extern _X_EXPORT void InitializeSprite(
+extern void InitializeSprite(
     DeviceIntPtr /* pDev */,
     WindowPtr    /* pWin */);
 
-extern _X_EXPORT void UpdateSpriteForScreen(
+extern void UpdateSpriteForScreen(
     DeviceIntPtr /* pDev */,
     ScreenPtr /* pScreen */);
 
 extern _X_EXPORT void WindowHasNewCursor(
     WindowPtr /* pWin */);
 
-extern _X_EXPORT Bool CheckDeviceGrabs(
+extern Bool CheckDeviceGrabs(
     DeviceIntPtr /* device */,
     DeviceEvent* /* event */,
     int /* checkFirst */);
 
-extern _X_EXPORT void DeliverFocusedEvent(
+extern void DeliverFocusedEvent(
     DeviceIntPtr /* keybd */,
     InternalEvent* /* event */,
     WindowPtr /* window */);
 
-extern _X_EXPORT void DeliverGrabbedEvent(
+extern void DeliverGrabbedEvent(
     InternalEvent* /* event */,
     DeviceIntPtr /* thisDev */,
     Bool /* deactivateGrab */);
 
-extern _X_EXPORT void FixKeyState(
+extern void FixKeyState(
     DeviceEvent* /* event */,
     DeviceIntPtr /* keybd */);
 
-extern _X_EXPORT void RecalculateDeliverableEvents(
+extern void RecalculateDeliverableEvents(
     WindowPtr /* pWin */);
 
 extern _X_EXPORT int OtherClientGone(
     pointer /* value */,
     XID /* id */);
 
-extern _X_EXPORT void DoFocusEvents(
+extern void DoFocusEvents(
     DeviceIntPtr /* dev */,
     WindowPtr /* fromWin */,
     WindowPtr /* toWin */,
     int /* mode */);
 
-extern _X_EXPORT int SetInputFocus(
+extern int SetInputFocus(
     ClientPtr /* client */,
     DeviceIntPtr /* dev */,
     Window /* focusID */,
@@ -425,7 +425,7 @@ extern _X_EXPORT int SetInputFocus(
     Time /* ctime */,
     Bool /* followOK */);
 
-extern _X_EXPORT int GrabDevice(
+extern int GrabDevice(
     ClientPtr /* client */,
     DeviceIntPtr /* dev */,
     unsigned /* this_mode */,
@@ -439,16 +439,16 @@ extern _X_EXPORT int GrabDevice(
     Window /* confineToWin */,
     CARD8 * /* status */);
 
-extern _X_EXPORT void InitEvents(void);
+extern void InitEvents(void);
 
-extern _X_EXPORT void CloseDownEvents(void);
+extern void CloseDownEvents(void);
 
-extern _X_EXPORT void DeleteWindowFromAnyEvents(
+extern void DeleteWindowFromAnyEvents(
     WindowPtr	/* pWin */,
     Bool /* freeResources */);
 
 
-extern _X_EXPORT Mask EventMaskForClient(
+extern Mask EventMaskForClient(
     WindowPtr /* pWin */,
     ClientPtr /* client */);
 
@@ -460,8 +460,7 @@ extern _X_EXPORT int DeliverEvents(
     int /*count*/,
     WindowPtr /*otherParent*/);
 
-extern _X_EXPORT Bool
-CheckMotion(
+extern Bool CheckMotion(
     DeviceEvent* /* ev */,
     DeviceIntPtr /* pDev */);
 
@@ -481,7 +480,7 @@ extern _X_EXPORT int TryClientEvents(
 
 extern _X_EXPORT void WindowsRestructured(void);
 
-extern _X_EXPORT Bool SetClientPointer(
+extern Bool SetClientPointer(
         ClientPtr /* client */, 
         ClientPtr /* setter */, 
         DeviceIntPtr /* device */);
@@ -492,7 +491,7 @@ extern _X_EXPORT DeviceIntPtr PickPointer(
 extern _X_EXPORT DeviceIntPtr PickKeyboard(
     ClientPtr /* client */);
 
-extern _X_EXPORT Bool IsInterferingGrab(
+extern Bool IsInterferingGrab(
         ClientPtr /* client */,
         DeviceIntPtr /* dev */,
         xEvent* /* events */);
@@ -576,11 +575,11 @@ typedef struct {
     int count;
 } DeviceEventInfoRec;
 
-extern _X_EXPORT int XItoCoreType(int xi_type);
-extern _X_EXPORT Bool DevHasCursor(DeviceIntPtr pDev);
-extern _X_EXPORT Bool IsPointerDevice( DeviceIntPtr dev);
-extern _X_EXPORT Bool IsKeyboardDevice(DeviceIntPtr dev);
-extern _X_EXPORT Bool IsPointerEvent(InternalEvent* event);
+extern int XItoCoreType(int xi_type);
+extern Bool DevHasCursor(DeviceIntPtr pDev);
+extern Bool IsPointerDevice( DeviceIntPtr dev);
+extern Bool IsKeyboardDevice(DeviceIntPtr dev);
+extern Bool IsPointerEvent(InternalEvent *event);
 
 /*
  * These are deprecated compatibility functions and will be removed soon!
diff --git a/include/input.h b/include/input.h
index 3140c3f..baac054 100644
--- a/include/input.h
+++ b/include/input.h
@@ -115,8 +115,8 @@ typedef struct _EventList {
 } EventList, *EventListPtr;
 
 /* The DIX stores incoming input events in this list */
-extern _X_EXPORT EventListPtr InputEventList;
-extern _X_EXPORT int InputEventListLen;
+extern EventListPtr InputEventList;
+extern int InputEventListLen;
 
 typedef int (*DeviceProc)(
     DeviceIntPtr /*device*/,
@@ -219,7 +219,7 @@ extern void set_key_down(DeviceIntPtr pDev, int key_code, int type);
 extern void set_key_up(DeviceIntPtr pDev, int key_code, int type);
 extern int key_is_down(DeviceIntPtr pDev, int key_code, int type);
 
-extern _X_EXPORT void InitCoreDevices(void);
+extern void InitCoreDevices(void);
 
 extern _X_EXPORT DeviceIntPtr AddInputDevice(
     ClientPtr /*client*/,
@@ -235,21 +235,21 @@ extern _X_EXPORT Bool ActivateDevice(
 extern _X_EXPORT Bool DisableDevice(
     DeviceIntPtr /*device*/);
 
-extern _X_EXPORT int InitAndStartDevices(void);
+extern int InitAndStartDevices(void);
 
-extern _X_EXPORT void CloseDownDevices(void);
+extern void CloseDownDevices(void);
 
-extern _X_EXPORT void UndisplayDevices(void);
+extern void UndisplayDevices(void);
 
 extern _X_EXPORT int RemoveDevice(
     DeviceIntPtr /*dev*/);
 
 extern _X_EXPORT int NumMotionEvents(void);
 
-extern _X_EXPORT void RegisterPointerDevice(
+extern void RegisterPointerDevice(
     DeviceIntPtr /*device*/);
 
-extern _X_EXPORT void RegisterKeyboardDevice(
+extern void RegisterKeyboardDevice(
     DeviceIntPtr /*device*/);
 
 extern _X_EXPORT int dixLookupDevice(
@@ -362,31 +362,31 @@ extern _X_EXPORT int ApplyPointerMapping(
     int          /* len */,
     ClientPtr	/* client */);
 
-extern _X_EXPORT Bool BadDeviceMap(
+extern Bool BadDeviceMap(
     BYTE* /*buff*/,
     int /*length*/,
     unsigned /*low*/,
     unsigned /*high*/,
     XID* /*errval*/);
 
-extern _X_EXPORT void NoteLedState(
+extern void NoteLedState(
     DeviceIntPtr /*keybd*/,
     int /*led*/,
     Bool /*on*/);
 
-extern _X_EXPORT void MaybeStopHint(
+extern void MaybeStopHint(
     DeviceIntPtr /*device*/,
     ClientPtr /*client*/);
 
-extern _X_EXPORT void ProcessPointerEvent(
+extern void ProcessPointerEvent(
     InternalEvent* /* ev */,
     DeviceIntPtr /*mouse*/);
 
-extern _X_EXPORT void ProcessKeyboardEvent(
+extern void ProcessKeyboardEvent(
     InternalEvent* /*ev*/,
     DeviceIntPtr   /*keybd*/);
 
-extern _X_EXPORT Bool LegalModifier(
+extern Bool LegalModifier(
     unsigned int /*key*/, 
     DeviceIntPtr /*pDev*/);
 
@@ -405,10 +405,10 @@ extern _X_EXPORT void SetMinimumEventSize(EventListPtr list,
                                 int min_size);
 extern _X_EXPORT void FreeEventList(EventListPtr list, int num_events);
 
-extern _X_EXPORT void CreateClassesChangedEvent(EventListPtr event,
+extern void CreateClassesChangedEvent(EventListPtr event,
                                       DeviceIntPtr master,
                                       DeviceIntPtr slave);
-extern _X_EXPORT int GetPointerEvents(
+extern int GetPointerEvents(
     EventListPtr events,
     DeviceIntPtr pDev,
     int type,
@@ -418,13 +418,13 @@ extern _X_EXPORT int GetPointerEvents(
     int num_valuators,
     int *valuators);
 
-extern _X_EXPORT int GetKeyboardEvents(
+extern int GetKeyboardEvents(
     EventListPtr events,
     DeviceIntPtr pDev,
     int type,
     int key_code);
 
-extern _X_EXPORT int GetKeyboardValuatorEvents(
+extern int GetKeyboardValuatorEvents(
     EventListPtr events,
     DeviceIntPtr pDev,
     int type,
@@ -433,7 +433,7 @@ extern _X_EXPORT int GetKeyboardValuatorEvents(
     int num_valuator,
     int *valuators);
 
-extern _X_EXPORT int GetProximityEvents(
+extern int GetProximityEvents(
     EventListPtr events,
     DeviceIntPtr pDev,
     int type,
@@ -441,7 +441,7 @@ extern _X_EXPORT int GetProximityEvents(
     int num_valuators,
     int *valuators);
 
-extern _X_EXPORT void PostSyntheticMotion(
+extern void PostSyntheticMotion(
     DeviceIntPtr pDev,
     int x,
     int y,
@@ -462,17 +462,17 @@ extern _X_EXPORT int GetMotionHistory(
     ScreenPtr pScreen,
     BOOL core);
 
-extern _X_EXPORT int AttachDevice(ClientPtr client,
+extern int AttachDevice(ClientPtr client,
                         DeviceIntPtr slave,
                         DeviceIntPtr master);
 
 extern _X_EXPORT DeviceIntPtr GetPairedDevice(DeviceIntPtr kbd);
 
-extern _X_EXPORT int AllocMasterDevice(ClientPtr client,
+extern int AllocMasterDevice(ClientPtr client,
                              char* name,
                              DeviceIntPtr* ptr,
                              DeviceIntPtr* keybd);
-extern _X_EXPORT void DeepCopyDeviceClasses(DeviceIntPtr from,
+extern void DeepCopyDeviceClasses(DeviceIntPtr from,
                                   DeviceIntPtr to);
 
 /* Helper functions. */
commit 111ef10375204a6981a5be5c045860854c4da4e6
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Mar 19 09:33:02 2009 +1000

    dix: move ProcGrabPointer guts into GrabDevice.
    
    Yes, this means we have even more arguments to GrabDevice. But it beats having
    a copy of most but not all of GrabDevice in ProcGrabPointer.
    Also, reshuffle the order of parameters, the CARD* status is a return value
    and should be last.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/grabdev.c b/Xi/grabdev.c
index f032b4a..65997ac 100644
--- a/Xi/grabdev.c
+++ b/Xi/grabdev.c
@@ -126,10 +126,11 @@ ProcXGrabDevice(ClientPtr client)
 				 X_GrabDevice)) != Success)
 	return rc;
 
-    rc = GrabDevice(client, dev, stuff->this_device_mode,
-		    stuff->other_devices_mode, stuff->grabWindow,
+    rc = GrabDevice(client, dev, stuff->other_devices_mode,
+                    stuff->this_device_mode, stuff->grabWindow,
 		    stuff->ownerEvents, stuff->time,
-		    tmp[stuff->deviceid].mask, &rep.status, FALSE);
+		    tmp[stuff->deviceid].mask, FALSE, None, None,
+		    &rep.status);
 
     if (rc != Success)
 	return rc;
diff --git a/dix/events.c b/dix/events.c
index ef4bc94..b41074a 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4390,40 +4390,21 @@ ProcGrabPointer(ClientPtr client)
     xGrabPointerReply rep;
     DeviceIntPtr device = PickPointer(client);
     GrabPtr grab;
-    WindowPtr pWin, confineTo;
-    CursorPtr cursor, oldCursor;
+    WindowPtr confineTo;
+    CursorPtr oldCursor;
     REQUEST(xGrabPointerReq);
     TimeStamp time;
-    Mask access_mode = DixGrabAccess;
     int rc;
 
     REQUEST_SIZE_MATCH(xGrabPointerReq);
     UpdateCurrentTime();
-    if ((stuff->pointerMode != GrabModeSync) &&
-	(stuff->pointerMode != GrabModeAsync))
-    {
-	client->errorValue = stuff->pointerMode;
-        return BadValue;
-    }
-    if ((stuff->keyboardMode != GrabModeSync) &&
-	(stuff->keyboardMode != GrabModeAsync))
-    {
-	client->errorValue = stuff->keyboardMode;
-        return BadValue;
-    }
-    if ((stuff->ownerEvents != xFalse) && (stuff->ownerEvents != xTrue))
-    {
-	client->errorValue = stuff->ownerEvents;
-        return BadValue;
-    }
+
     if (stuff->eventMask & ~PointerGrabMask)
     {
 	client->errorValue = stuff->eventMask;
         return BadValue;
     }
-    rc = dixLookupWindow(&pWin, stuff->grabWindow, client, DixSetAttrAccess);
-    if (rc != Success)
-	return rc;
+
     if (stuff->confineTo == None)
 	confineTo = NullWindow;
     else
@@ -4433,81 +4414,32 @@ ProcGrabPointer(ClientPtr client)
 	if (rc != Success)
 	    return rc;
     }
-    if (stuff->cursor == None)
-	cursor = NullCursor;
-    else
+
+    memset(&rep, 0, sizeof(xGrabPointerReply));
+    oldCursor = NullCursor;
+    grab = device->deviceGrab.grab;
+
+    if (grab)
     {
-	rc = dixLookupResourceByType((pointer *)&cursor, stuff->cursor, RT_CURSOR,
-			       client, DixUseAccess);
-	if (rc != Success)
-	{
-	    client->errorValue = stuff->cursor;
-	    return (rc == BadValue) ? BadCursor : rc;
-	}
-	access_mode |= DixForceAccess;
+        if (grab->confineTo && !confineTo)
+            ConfineCursorToWindow(device, RootWindow(device), FALSE, FALSE);
+        oldCursor = grab->cursor;
     }
-    if (stuff->pointerMode == GrabModeSync ||
-	stuff->keyboardMode == GrabModeSync)
-	access_mode |= DixFreezeAccess;
-    rc = XaceHook(XACE_DEVICE_ACCESS, client, device, access_mode);
+
+    rc = GrabDevice(client, device, stuff->pointerMode, stuff->keyboardMode,
+                    stuff->grabWindow, stuff->ownerEvents, stuff->time,
+                    stuff->eventMask, TRUE, stuff->cursor,
+                    stuff->confineTo, &rep.status);
     if (rc != Success)
-	return rc;
+        return rc;
+
+    if (oldCursor)
+        FreeCursor (oldCursor, (Cursor)0);
 
-	/* at this point, some sort of reply is guaranteed. */
     time = ClientTimeToServerTime(stuff->time);
-    memset(&rep, 0, sizeof(xGrabPointerReply));
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
     rep.length = 0;
-
-    grab = device->deviceGrab.grab;
-    /* check for
-       1. other client has a grab on the device already.
-       2. window is viewable
-       3. other client has this device as frozen "other" device
-       4. times are screwed.
-     */
-    if ((grab) && !SameClient(grab, client))
-	rep.status = AlreadyGrabbed;
-    else if ((!pWin->realized) ||
-             (confineTo &&
-                !(confineTo->realized
-                    && BorderSizeNotEmpty(device, confineTo))))
-	rep.status = GrabNotViewable;
-    else if (device->deviceGrab.sync.frozen &&
-	     device->deviceGrab.sync.other &&
-             !SameClient(device->deviceGrab.sync.other, client))
-	rep.status = GrabFrozen;
-    else if ((CompareTimeStamps(time, currentTime) == LATER) ||
-	     (CompareTimeStamps(time, device->deviceGrab.grabTime) == EARLIER))
-	rep.status = GrabInvalidTime;
-    else
-    {
-	GrabRec tempGrab;
-
-	oldCursor = NullCursor;
-	if (grab)
-	{
-	    if (grab->confineTo && !confineTo)
-		ConfineCursorToWindow(device, RootWindow(device), FALSE, FALSE);
-	    oldCursor = grab->cursor;
-	}
-        tempGrab.next = NULL;
-	tempGrab.cursor = cursor;
-	tempGrab.resource = client->clientAsMask;
-	tempGrab.ownerEvents = stuff->ownerEvents;
-	tempGrab.eventMask = stuff->eventMask;
-	tempGrab.confineTo = confineTo;
-	tempGrab.window = pWin;
-	tempGrab.keyboardMode = stuff->keyboardMode;
-	tempGrab.pointerMode = stuff->pointerMode;
-	tempGrab.device = device;
-        tempGrab.coreGrab = True;
-	(*device->deviceGrab.ActivateGrab)(device, &tempGrab, time, FALSE);
-	if (oldCursor)
-	    FreeCursor (oldCursor, (Cursor)0);
-	rep.status = GrabSuccess;
-    }
     WriteReplyToClient(client, sizeof(xGrabPointerReply), &rep);
     return Success;
 }
@@ -4613,26 +4545,27 @@ ProcUngrabPointer(ClientPtr client)
  */
 int
 GrabDevice(ClientPtr client, DeviceIntPtr dev,
-           unsigned this_mode, unsigned other_mode, Window grabWindow,
-           unsigned ownerEvents, Time ctime, Mask mask, CARD8 *status,
-           Bool coreGrab)
+           unsigned pointer_mode, unsigned keyboard_mode, Window grabWindow,
+           unsigned ownerEvents, Time ctime, Mask mask,
+           Bool coreGrab, Cursor curs, Window confineToWin, CARD8 *status)
 {
-    WindowPtr pWin;
+    WindowPtr pWin, confineTo;
     GrabPtr grab;
     TimeStamp time;
     Mask access_mode = DixGrabAccess;
     int rc;
     GrabInfoPtr grabInfo = &dev->deviceGrab;
+    CursorPtr cursor;
 
     UpdateCurrentTime();
-    if ((this_mode != GrabModeSync) && (this_mode != GrabModeAsync))
+    if ((keyboard_mode != GrabModeSync) && (keyboard_mode != GrabModeAsync))
     {
-	client->errorValue = this_mode;
+	client->errorValue = keyboard_mode;
         return BadValue;
     }
-    if ((other_mode != GrabModeSync) && (other_mode != GrabModeAsync))
+    if ((pointer_mode != GrabModeSync) && (pointer_mode != GrabModeAsync))
     {
-	client->errorValue = other_mode;
+	client->errorValue = pointer_mode;
         return BadValue;
     }
     if ((ownerEvents != xFalse) && (ownerEvents != xTrue))
@@ -4644,7 +4577,32 @@ GrabDevice(ClientPtr client, DeviceIntPtr dev,
     rc = dixLookupWindow(&pWin, grabWindow, client, DixSetAttrAccess);
     if (rc != Success)
 	return rc;
-    if (this_mode == GrabModeSync || other_mode == GrabModeSync)
+
+    if (confineToWin == None)
+	confineTo = NullWindow;
+    else
+    {
+	rc = dixLookupWindow(&confineTo, confineToWin, client,
+			     DixSetAttrAccess);
+	if (rc != Success)
+	    return rc;
+    }
+
+    if (curs == None)
+	cursor = NullCursor;
+    else
+    {
+	rc = dixLookupResourceByType((pointer *)&cursor, curs, RT_CURSOR,
+			       client, DixUseAccess);
+	if (rc != Success)
+	{
+	    client->errorValue = curs;
+	    return (rc == BadValue) ? BadCursor : rc;
+	}
+	access_mode |= DixForceAccess;
+    }
+
+    if (keyboard_mode == GrabModeSync || pointer_mode == GrabModeSync)
 	access_mode |= DixFreezeAccess;
     rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
     if (rc != Success)
@@ -4654,7 +4612,10 @@ GrabDevice(ClientPtr client, DeviceIntPtr dev,
     grab = grabInfo->grab;
     if (grab && !SameClient(grab, client))
 	*status = AlreadyGrabbed;
-    else if (!pWin->realized)
+    else if ((!pWin->realized) ||
+             (confineTo &&
+                !(confineTo->realized
+                    && BorderSizeNotEmpty(dev, confineTo))))
 	*status = GrabNotViewable;
     else if ((CompareTimeStamps(time, currentTime) == LATER) ||
 	     (CompareTimeStamps(time, grabInfo->grabTime) == EARLIER))
@@ -4673,13 +4634,13 @@ GrabDevice(ClientPtr client, DeviceIntPtr dev,
 	tempGrab.window = pWin;
 	tempGrab.resource = client->clientAsMask;
 	tempGrab.ownerEvents = ownerEvents;
-	tempGrab.keyboardMode = this_mode;
-	tempGrab.pointerMode = other_mode;
+	tempGrab.keyboardMode = keyboard_mode;
+	tempGrab.pointerMode = pointer_mode;
 	tempGrab.eventMask = mask;
 	tempGrab.device = dev;
-        tempGrab.cursor = NULL;
-        tempGrab.coreGrab = coreGrab;
-
+	tempGrab.cursor = cursor;
+	tempGrab.confineTo = confineTo;
+	tempGrab.coreGrab = coreGrab;
 	(*grabInfo->ActivateGrab)(dev, &tempGrab, time, FALSE);
 	*status = GrabSuccess;
     }
@@ -4702,10 +4663,10 @@ ProcGrabKeyboard(ClientPtr client)
     REQUEST_SIZE_MATCH(xGrabKeyboardReq);
 
     memset(&rep, 0, sizeof(xGrabKeyboardReply));
-    result = GrabDevice(client, keyboard, stuff->keyboardMode,
-            stuff->pointerMode, stuff->grabWindow,
-            stuff->ownerEvents, stuff->time,
-            KeyPressMask | KeyReleaseMask, &rep.status, TRUE);
+    result = GrabDevice(client, keyboard, stuff->pointerMode,
+            stuff->keyboardMode, stuff->grabWindow, stuff->ownerEvents,
+            stuff->time, KeyPressMask | KeyReleaseMask, TRUE, None, None,
+            &rep.status);
 
     if (result != Success)
 	return result;
diff --git a/include/dix.h b/include/dix.h
index a19b901..87f49e8 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -434,8 +434,10 @@ extern _X_EXPORT int GrabDevice(
     unsigned /* ownerEvents */,
     Time /* ctime */,
     Mask /* mask */,
-    CARD8 * /* status */,
-    Bool /* coreGrab */);
+    Bool /* coreGrab */,
+    Cursor /* curs */,
+    Window /* confineToWin */,
+    CARD8 * /* status */);
 
 extern _X_EXPORT void InitEvents(void);
 
commit dc153271b6458cacd63a4bc0208594011c6460b0
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Mar 18 15:13:00 2009 +1000

    Xi: purge old device enter/leave masks.

diff --git a/Xi/exevents.c b/Xi/exevents.c
index b5413f9..4aa5fbf 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -146,8 +146,6 @@ XIGetDevice(xEvent* xE)
     if (xE->u.u.type == DeviceButtonPress ||
         xE->u.u.type == DeviceButtonRelease ||
         xE->u.u.type == DeviceMotionNotify ||
-        xE->u.u.type == DeviceEnterNotify ||
-        xE->u.u.type == DeviceLeaveNotify ||
         xE->u.u.type == ProximityIn ||
         xE->u.u.type == ProximityOut ||
         xE->u.u.type == DevicePropertyNotify)
diff --git a/Xi/exglobals.h b/Xi/exglobals.h
index 1828073..2d2d25c 100644
--- a/Xi/exglobals.h
+++ b/Xi/exglobals.h
@@ -75,8 +75,6 @@ extern int DeviceMappingNotify;
 extern int ChangeDeviceNotify;
 extern int DevicePresenceNotify;
 extern int DevicePropertyNotify;
-extern int DeviceEnterNotify;
-extern int DeviceLeaveNotify;
 
 extern int RT_INPUTCLIENT;
 
diff --git a/Xi/extinit.c b/Xi/extinit.c
index 23e41ca..bedd750 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -331,8 +331,6 @@ int DeviceMappingNotify;
 int ChangeDeviceNotify;
 int DevicePresenceNotify;
 int DevicePropertyNotify;
-int DeviceEnterNotify;
-int DeviceLeaveNotify;
 
 int RT_INPUTCLIENT;
 
@@ -893,8 +891,6 @@ FixExtensionEvents(ExtensionEntry * extEntry)
     DeviceButtonStateNotify = DeviceKeyStateNotify + 1;
     DevicePresenceNotify = DeviceButtonStateNotify + 1;
     DevicePropertyNotify = DevicePresenceNotify + 1;
-    DeviceEnterNotify = DevicePropertyNotify + 1;
-    DeviceLeaveNotify = DeviceEnterNotify + 1;
 
     event_base[KeyClass] = DeviceKeyPress;
     event_base[ButtonClass] = DeviceButtonPress;
@@ -950,12 +946,6 @@ FixExtensionEvents(ExtensionEntry * extEntry)
     SetEventInfo(DevicePresenceNotifyMask, _devicePresence);
     SetMaskForExtEvent(DevicePropertyNotifyMask, DevicePropertyNotify);
 
-    SetMaskForExtEvent(DeviceEnterWindowMask, DeviceEnterNotify);
-    AllowPropagateSuppress(DeviceEnterWindowMask);
-
-    SetMaskForExtEvent(DeviceLeaveWindowMask, DeviceLeaveNotify);
-    AllowPropagateSuppress(DeviceLeaveWindowMask);
-
     SetEventInfo(0, _noExtensionEvent);
 }
 
@@ -1001,8 +991,6 @@ RestoreExtensionEvents(void)
     DeviceButtonStateNotify = 13;
     DevicePresenceNotify = 14;
     DevicePropertyNotify = 15;
-    DeviceEnterNotify = 16;
-    DeviceLeaveNotify = 17;
 
     BadDevice = 0;
     BadEvent = 1;
@@ -1042,8 +1030,6 @@ IResetProc(ExtensionEntry * unused)
     EventSwapVector[ChangeDeviceNotify] = NotImplemented;
     EventSwapVector[DevicePresenceNotify] = NotImplemented;
     EventSwapVector[DevicePropertyNotify] = NotImplemented;
-    EventSwapVector[DeviceEnterNotify] = NotImplemented;
-    EventSwapVector[DeviceLeaveNotify] = NotImplemented;
     RestoreExtensionEvents();
 }
 
diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index 8a81431..d1c079b 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -318,7 +318,6 @@ extern _X_EXPORT CARD32	xkbDebugFlags;
 
 extern	_X_EXPORT int	DeviceKeyPress,DeviceKeyRelease,DeviceMotionNotify;
 extern	_X_EXPORT int	DeviceButtonPress,DeviceButtonRelease;
-extern	_X_EXPORT int	DeviceEnterNotify,DeviceLeaveNotify;
 
 #define	_XkbIsPressEvent(t)	(((t)==KeyPress)||((t)==DeviceKeyPress))
 #define	_XkbIsReleaseEvent(t)	(((t)==KeyRelease)||((t)==DeviceKeyRelease))
commit 15a969c0fcd4f19f3c560a7037c1a6a58bce51f0
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Mar 18 10:21:59 2009 +1000

    dix: remove now obsolete mskidx parameter from DeliverEventsToWindow.
    
    mskidx would always be dev->id anyway, so if we're already passing in the
    device, mskidx is superfluous.

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 6970809..b5413f9 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -936,8 +936,7 @@ ProcessRawEvent(RawDeviceEvent *ev, DeviceIntPtr device)
 
         for (i = 0; i < screenInfo.numScreens; i++)
             DeliverEventsToWindow(device, WindowTable[i], xi, 1,
-                                  GetEventFilter(device, xi), NULL,
-                                  device->id);
+                                  GetEventFilter(device, xi), NULL);
         xfree(xi);
     }
 }
@@ -1241,8 +1240,7 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
     FixUpEventFromWindow(dev, (xEvent*)xi2event, pWin, None, FALSE);
 
     DeliverEventsToWindow(dev, pWin, (xEvent*)xi2event, 1,
-                          GetEventFilter(dev, (xEvent*)xi2event), NullGrab,
-                          dev->id);
+                          GetEventFilter(dev, (xEvent*)xi2event), NullGrab);
 
     xfree(xi2event);
 
@@ -1255,7 +1253,7 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
     event.time = currentTime.milliseconds;
 
     DeliverEventsToWindow(dev, pWin, (xEvent *) & event, 1,
-				DeviceFocusChangeMask, NullGrab, dev->id);
+				DeviceFocusChangeMask, NullGrab);
 
     if ((type == DeviceFocusIn) &&
 	(wOtherInputMasks(pWin)) &&
@@ -1352,7 +1350,7 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
 	}
 
 	DeliverEventsToWindow(dev, pWin, (xEvent *) sev, evcount,
-				    DeviceStateNotifyMask, NullGrab, dev->id);
+				    DeviceStateNotifyMask, NullGrab);
 	xfree(sev);
     }
 }
@@ -1697,7 +1695,7 @@ SendEvent(ClientPtr client, DeviceIntPtr d, Window dest, Bool propagate,
     ev->u.u.type |= 0x80;
     if (propagate) {
 	for (; pWin; pWin = pWin->parent) {
-	    if (DeliverEventsToWindow(d, pWin, ev, count, mask, NullGrab, d->id))
+	    if (DeliverEventsToWindow(d, pWin, ev, count, mask, NullGrab))
 		return Success;
 	    if (pWin == effectiveFocus)
 		return Success;
@@ -1707,7 +1705,7 @@ SendEvent(ClientPtr client, DeviceIntPtr d, Window dest, Bool propagate,
 		break;
 	}
     } else if (!XaceHook(XACE_SEND_ACCESS, client, NULL, pWin, ev, count))
-	DeliverEventsToWindow(d, pWin, ev, count, mask, NullGrab, d->id);
+	DeliverEventsToWindow(d, pWin, ev, count, mask, NullGrab);
     return Success;
 }
 
@@ -2009,7 +2007,7 @@ FindInterestedChildren(DeviceIntPtr dev, WindowPtr p1, Mask mask,
 
     while (p1) {
         p2 = p1->firstChild;
-        DeliverEventsToWindow(dev, p1, ev, count, mask, NullGrab, dev->id);
+        DeliverEventsToWindow(dev, p1, ev, count, mask, NullGrab);
         FindInterestedChildren(dev, p2, mask, ev, count);
         p1 = p1->nextSib;
     }
@@ -2031,7 +2029,7 @@ SendEventToAllWindows(DeviceIntPtr dev, Mask mask, xEvent * ev, int count)
         pWin = WindowTable[i];
         if (!pWin)
             continue;
-        DeliverEventsToWindow(dev, pWin, ev, count, mask, NullGrab, dev->id);
+        DeliverEventsToWindow(dev, pWin, ev, count, mask, NullGrab);
         p1 = pWin->firstChild;
         FindInterestedChildren(dev, p1, mask, ev, count);
     }
diff --git a/dix/events.c b/dix/events.c
index c618c8c..ef4bc94 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -1945,13 +1945,12 @@ TryClientEvents (ClientPtr client, DeviceIntPtr dev, xEvent *pEvents,
  * @param count Number of elements in pEvents.
  * @param filter Mask based on event type.
  * @param grab Possible grab on the device that caused the event.
- * @param mskidx Mask index, depending on device that caused event.
  *
  * @return Number of events delivered to various clients.
  */
 int
 DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
-        *pEvents, int count, Mask filter, GrabPtr grab, int mskidx)
+        *pEvents, int count, Mask filter, GrabPtr grab)
 {
     int deliveries = 0, nondeliveries = 0;
     int attempt;
@@ -2005,7 +2004,7 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
             OtherInputMasks *inputMasks = wOtherInputMasks(pWin);
             /* Has any client selected for the event? */
             if (!inputMasks ||
-                !(inputMasks->inputEvents[mskidx] & filter))
+                !(inputMasks->inputEvents[pDev->id] & filter))
                 return 0;
 
             other = inputMasks->inputClients;
@@ -2403,7 +2402,7 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
                 filter = GetEventFilter(dev, xi2);
                 FixUpEventFromWindow(dev, xi2, pWin, child, FALSE);
                 deliveries = DeliverEventsToWindow(dev, pWin, xi2, 1,
-                                                   filter, grab, dev->id);
+                                                   filter, grab);
                 xfree(xi2);
                 if (deliveries > 0)
                     goto unwind;
@@ -2415,7 +2414,7 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
                 filter = GetEventFilter(dev, xE);
                 FixUpEventFromWindow(dev, xE, pWin, child, FALSE);
                 deliveries = DeliverEventsToWindow(dev, pWin, xE, count,
-                                                   filter, grab, dev->id);
+                                                   filter, grab);
                 if (deliveries > 0)
                     goto unwind;
             }
@@ -2435,7 +2434,7 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
                 filter = GetEventFilter(dev, &core);
                 FixUpEventFromWindow(dev, &core, pWin, child, FALSE);
                 deliveries = DeliverEventsToWindow(dev, pWin, &core, 1,
-                                                   filter, grab, dev->id);
+                                                   filter, grab);
                 if (deliveries > 0)
                     goto unwind;
             }
@@ -2495,21 +2494,20 @@ DeliverEvents(WindowPtr pWin, xEvent *xE, int count,
     if ((filter & SubstructureNotifyMask) && (xE->u.u.type != CreateNotify))
 	xE->u.destroyNotify.event = pWin->drawable.id;
     if (filter != StructureAndSubMask)
-	return DeliverEventsToWindow(&dummy, pWin, xE, count, filter, NullGrab, dummy.id);
-    deliveries = DeliverEventsToWindow(&dummy, pWin, xE, count, StructureNotifyMask,
-				       NullGrab, dummy.id);
+	return DeliverEventsToWindow(&dummy, pWin, xE, count, filter, NullGrab);
+    deliveries = DeliverEventsToWindow(&dummy, pWin, xE, count,
+                                       StructureNotifyMask, NullGrab);
     if (pWin->parent)
     {
 	xE->u.destroyNotify.event = pWin->parent->drawable.id;
 	deliveries += DeliverEventsToWindow(&dummy, pWin->parent, xE, count,
-					    SubstructureNotifyMask, NullGrab,
-					    dummy.id);
+					    SubstructureNotifyMask, NullGrab);
 	if (xE->u.u.type == ReparentNotify)
 	{
 	    xE->u.destroyNotify.event = otherParent->drawable.id;
             deliveries += DeliverEventsToWindow(&dummy,
                     otherParent, xE, count, SubstructureNotifyMask,
-						NullGrab, dummy.id);
+						NullGrab);
 	}
     }
     return deliveries;
@@ -3559,7 +3557,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
         /* just deliver it to the focus window */
         FixUpEventFromWindow(ptr, xi2, focus, None, FALSE);
         deliveries = DeliverEventsToWindow(keybd, focus, xi2, 1,
-                                           filter, NullGrab, keybd->id);
+                                           filter, NullGrab);
         if (deliveries > 0)
             goto unwind;
     }
@@ -3568,7 +3566,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
     FixUpEventFromWindow(ptr, xE, focus, None, FALSE);
     deliveries = DeliverEventsToWindow(keybd, focus, xE, count,
                                        GetEventFilter(keybd, xE),
-                                       NullGrab, keybd->id);
+                                       NullGrab);
 
     if (deliveries > 0)
         goto unwind;
@@ -3586,7 +3584,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
         FixUpEventFromWindow(keybd, &core, focus, None, FALSE);
         deliveries = DeliverEventsToWindow(keybd, focus, &core, 1,
                                            GetEventFilter(keybd, &core),
-                                           NullGrab, keybd->id);
+                                           NullGrab);
     }
 
 unwind:
@@ -4105,7 +4103,7 @@ CoreEnterLeaveEvent(
         else
             DeliverEventsToWindow(mouse, pWin, &event, 1,
                                   GetEventFilter(mouse, &event),
-                                  NullGrab, mouse->id);
+                                  NullGrab);
     }
 
     if ((type == EnterNotify) && (mask & KeymapStateMask))
@@ -4124,7 +4122,7 @@ CoreEnterLeaveEvent(
                             mask, KeymapStateMask, grab);
         else
             DeliverEventsToWindow(mouse, pWin, (xEvent *)&ke, 1,
-                                  KeymapStateMask, NullGrab, mouse->id);
+                                  KeymapStateMask, NullGrab);
     }
 }
 
@@ -4192,7 +4190,7 @@ DeviceEnterLeaveEvent(
                         filter, grab);
     else
         DeliverEventsToWindow(mouse, pWin, (xEvent*)event, 1, filter,
-                              NullGrab, mouse->id);
+                              NullGrab);
     xfree(event);
 }
 
@@ -4208,7 +4206,7 @@ CoreFocusEvent(DeviceIntPtr dev, int type, int mode, int detail, WindowPtr pWin)
     event.u.focus.window = pWin->drawable.id;
 
     DeliverEventsToWindow(dev, pWin, &event, 1,
-                          GetEventFilter(dev, &event), NullGrab, dev->id);
+                          GetEventFilter(dev, &event), NullGrab);
     if ((type == FocusIn) &&
             ((pWin->eventMask | wOtherEventMasks(pWin)) & KeymapStateMask))
     {
@@ -4221,7 +4219,7 @@ CoreFocusEvent(DeviceIntPtr dev, int type, int mode, int detail, WindowPtr pWin)
 
         ke.type = KeymapNotify;
         DeliverEventsToWindow(dev, pWin, (xEvent *)&ke, 1,
-                KeymapStateMask, NullGrab, dev->id);
+                KeymapStateMask, NullGrab);
     }
 }
 
@@ -4962,7 +4960,7 @@ ProcSendEvent(ClientPtr client)
 			 &stuff->event, 1))
 		return Success;
             if (DeliverEventsToWindow(dev, pWin,
-                        &stuff->event, 1, stuff->eventMask, NullGrab, dev->id))
+                        &stuff->event, 1, stuff->eventMask, NullGrab))
 		return Success;
 	    if (pWin == effectiveFocus)
 		return Success;
@@ -4973,7 +4971,7 @@ ProcSendEvent(ClientPtr client)
     }
     else if (!XaceHook(XACE_SEND_ACCESS, client, NULL, pWin, &stuff->event, 1))
         DeliverEventsToWindow(dev, pWin, &stuff->event,
-                                    1, stuff->eventMask, NullGrab, dev->id);
+                                    1, stuff->eventMask, NullGrab);
     return Success;
 }
 
diff --git a/include/dix.h b/include/dix.h
index ebd8f2f..a19b901 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -365,8 +365,7 @@ extern _X_EXPORT int DeliverEventsToWindow(
     xEventPtr /* pEvents */,
     int /* count */,
     Mask /* filter */,
-    GrabPtr /* grab */,
-    int /* mskidx */);
+    GrabPtr /* grab */);
 
 extern _X_EXPORT int DeliverDeviceEvents(
     WindowPtr /* pWin */,
commit f5409aa026b2cb501170867d04c6e220f3fe0a44
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 13 15:51:50 2009 +1000

    mi: remove deprecated miPointerAbsoluteCursor
    
    Functions that don't specify the device are so last year.

diff --git a/mi/mipointer.c b/mi/mipointer.c
index e3a4656..857a8ca 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -457,15 +457,6 @@ miPointerGetScreen(DeviceIntPtr pDev)
     return (pPointer) ? pPointer->pScreen : NULL;
 }
 
-/* Move the pointer to x, y on the current screen, update the sprite, and
- * the motion history.  Generates no events.  Does not return changed x
- * and y if they are clipped; use miPointerSetPosition instead. */
-void
-miPointerAbsoluteCursor (int x, int y, unsigned long time)
-{
-    miPointerSetPosition(inputInfo.pointer, &x, &y);
-}
-
 /* Move the pointer on the current screen,  and update the sprite. */
 static void
 miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen,
diff --git a/mi/mipointer.h b/mi/mipointer.h
index 83277e4..259ac14 100644
--- a/mi/mipointer.h
+++ b/mi/mipointer.h
@@ -110,13 +110,6 @@ extern _X_EXPORT void miPointerWarpCursor(
     int /*y*/
 ) _X_DEPRECATED;
 
-/* Deprecated in favour of miPointerSetPosition. */
-extern _X_EXPORT void miPointerAbsoluteCursor(
-    int /*x*/,
-    int /*y*/,
-    unsigned long /*time*/
-) _X_DEPRECATED;
-
 /* Deprecated in favour of miPointerGetScreen. */
 extern _X_EXPORT ScreenPtr miPointerCurrentScreen(
     void
commit 46145a9312eaf5dcd0e8b6788ed8219e086f790e
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 13 15:12:55 2009 +1000

    dix: remove coreMods field from GrabRec.
    
    Nobody uses it anyway, and it's taking up a whole bit!

diff --git a/dix/grabs.c b/dix/grabs.c
index 156574e..2d3327c 100644
--- a/dix/grabs.c
+++ b/dix/grabs.c
@@ -97,8 +97,6 @@ CreateGrab(
     grab->modifiersDetail.exact = modifiers;
     grab->modifiersDetail.pMask = NULL;
     grab->modifierDevice = modDevice;
-    grab->coreMods = ((modDevice == inputInfo.keyboard) ||
-		      (modDevice == inputInfo.pointer));
     grab->type = type;
     grab->detail.exact = keybut;
     grab->detail.pMask = NULL;
diff --git a/include/inputstr.h b/include/inputstr.h
index 59fb29b..14941b1 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -172,7 +172,6 @@ typedef struct _GrabRec {
     unsigned		keyboardMode:1;
     unsigned		pointerMode:1;
     unsigned		coreGrab:1;	/* grab is on core device */
-    unsigned		coreMods:1;	/* modifiers are on core keyboard */
     CARD8		type;		/* event type */
     DetailRec		modifiersDetail;
     DeviceIntPtr	modifierDevice;
commit 40e2a61e37109cd9c2ab57954ee40dcf4a062e31
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Mar 12 16:53:56 2009 +1000

    Add Get/SetDeviceFocus handling.

diff --git a/Xi/Makefile.am b/Xi/Makefile.am
index 5483000..cbec13e 100644
--- a/Xi/Makefile.am
+++ b/Xi/Makefile.am
@@ -95,6 +95,8 @@ libXi_la_SOURCES =	\
 	xiproperty.c \
 	xiproperty.h \
 	xiselectev.c \
-	xiselectev.h
+	xiselectev.h \
+	xisetdevfocus.c \
+	xisetdevfocus.h
 
 EXTRA_DIST = stubs.c
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 5dae990..6970809 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1241,7 +1241,7 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
     FixUpEventFromWindow(dev, (xEvent*)xi2event, pWin, None, FALSE);
 
     DeliverEventsToWindow(dev, pWin, (xEvent*)xi2event, 1,
-                          GetWindowXI2Mask(dev, pWin, xi2event), NullGrab,
+                          GetEventFilter(dev, (xEvent*)xi2event), NullGrab,
                           dev->id);
 
     xfree(xi2event);
diff --git a/Xi/extinit.c b/Xi/extinit.c
index 8c9f9e1..23e41ca 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -120,6 +120,7 @@ SOFTWARE.
 #include "ungrdevk.h"
 #include "warpdevp.h"
 #include "xiselectev.h"
+#include "xisetdevfocus.h"
 #include "xiproperty.h"
 
 
@@ -239,7 +240,9 @@ static int (*ProcIVector[])(ClientPtr) = {
         ProcXIGetClientPointer,                 /* 45 */
         ProcXISelectEvent,                      /* 46 */
         ProcXIQueryVersion,                     /* 47 */
-        ProcXIQueryDevice                       /* 48 */
+        ProcXIQueryDevice,                      /* 48 */
+        ProcXISetDeviceFocus,                   /* 49 */
+        ProcXIGetDeviceFocus                    /* 50 */
 };
 
 /* For swapped clients */
@@ -292,7 +295,9 @@ static int (*SProcIVector[])(ClientPtr) = {
         SProcXIGetClientPointer,                 /* 45 */
         SProcXISelectEvent,                      /* 46 */
         SProcXIQueryVersion,                     /* 47 */
-        SProcXIQueryDevice                       /* 48 */
+        SProcXIQueryDevice,                      /* 48 */
+        SProcXISetDeviceFocus,                   /* 49 */
+        SProcXIGetDeviceFocus                    /* 50 */
 };
 
 /*****************************************************************
diff --git a/Xi/xisetdevfocus.c b/Xi/xisetdevfocus.c
new file mode 100644
index 0000000..5945abd
--- /dev/null
+++ b/Xi/xisetdevfocus.c
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2008 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer
+ */
+/***********************************************************************
+ *
+ * Request to set and get an input device's focus.
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "inputstr.h"	/* DeviceIntPtr      */
+#include "windowstr.h"	/* window structure  */
+#include <X11/extensions/XI2.h>
+#include <X11/extensions/XI2proto.h>
+
+#include "exglobals.h" /* BadDevice */
+#include "xisetdevfocus.h"
+
+int
+SProcXISetDeviceFocus(ClientPtr client)
+{
+    char n;
+
+    REQUEST(xXISetDeviceFocusReq);
+    swaps(&stuff->length, n);
+    swaps(&stuff->deviceid, n);
+    swapl(&stuff->focus, n);
+    swapl(&stuff->time, n);
+
+    return ProcXISetDeviceFocus(client);
+}
+
+int
+SProcXIGetDeviceFocus(ClientPtr client)
+{
+    char n;
+
+    REQUEST(xXIGetDeviceFocusReq);
+    swaps(&stuff->length, n);
+    swaps(&stuff->deviceid, n);
+
+    return ProcXIGetDeviceFocus(client);
+}
+
+int
+ProcXISetDeviceFocus(ClientPtr client)
+{
+    DeviceIntPtr dev;
+    int ret;
+
+    REQUEST(xXISetDeviceFocusReq);
+    REQUEST_AT_LEAST_SIZE(xXISetDeviceFocusReq);
+
+    ret = dixLookupDevice(&dev, stuff->deviceid, client, DixSetFocusAccess);
+    if (ret != Success)
+	return ret;
+    if (!dev->focus)
+	return BadDevice;
+
+    return SetInputFocus(client, dev, stuff->focus, RevertToParent,
+                        stuff->time, TRUE);
+}
+
+int
+ProcXIGetDeviceFocus(ClientPtr client)
+{
+    xXIGetDeviceFocusReply rep;
+    DeviceIntPtr dev;
+    int ret;
+
+    REQUEST(xXIGetDeviceFocusReq);
+    REQUEST_AT_LEAST_SIZE(xXIGetDeviceFocusReq);
+
+    ret = dixLookupDevice(&dev, stuff->deviceid, client, DixSetFocusAccess);
+    if (ret != Success)
+	return ret;
+    if (!dev->focus)
+	return BadDevice;
+
+    rep.repType = X_Reply;
+    rep.RepType = X_XIGetDeviceFocus;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+
+    if (dev->focus->win == NoneWin)
+	rep.focus = None;
+    else if (dev->focus->win == PointerRootWin)
+	rep.focus = PointerRoot;
+    else if (dev->focus->win == FollowKeyboardWin)
+	rep.focus = FollowKeyboard;
+    else
+	rep.focus = dev->focus->win->drawable.id;
+
+    WriteReplyToClient(client, sizeof(xXIGetDeviceFocusReply), &rep);
+    return Success;
+}
diff --git a/Xi/xisetdevfocus.h b/Xi/xisetdevfocus.h
new file mode 100644
index 0000000..9bdeb77
--- /dev/null
+++ b/Xi/xisetdevfocus.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2008 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer
+ */
+
+#ifndef XISETDEVFOCUS_H
+#define XISETDEVFOCUS_H 1
+
+int SProcXISetDeviceFocus(ClientPtr client);
+int ProcXISetDeviceFocus(ClientPtr client);
+
+int SProcXIGetDeviceFocus(ClientPtr client);
+int ProcXIGetDeviceFocus(ClientPtr client);
+
+#endif /* XISETDEVFOCUS_H */
commit d9b7343eac1157490442cc0fb3b5b6d7d6e9a705
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Mar 12 12:56:18 2009 +1000

    dix: even if we don't get a XI1 event, continue processing.

diff --git a/dix/events.c b/dix/events.c
index 447732d..c618c8c 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2377,11 +2377,14 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
         ErrorF("[dix] %s: XI conversion failed in DDE (%d, %d). Skipping delivery.\n",
                dev->name, event->u.any.type, rc);
         goto unwind;
-    } else if (count == 0) /* no XI/Core event for you */
-        goto unwind;
+    } else if (count > 0)
+    {
+        if (XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, xE, count))
+            goto unwind;
+        /* if count is 0, we might still have XI2 events, don't have XACE for
+         * that yet */
+    }
 
-    if (XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, xE, count))
-	goto unwind;
 
     while (pWin)
     {
commit e11dc10f01603b181e224c90d1dd4abe940f2ce7
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Mar 12 10:21:00 2009 +1000

    dix: Send HierarchyEvents when devices are added/removed/enabled/disabled.

diff --git a/dix/devices.c b/dix/devices.c
index 64af57f..8c8a215 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -82,6 +82,7 @@ SOFTWARE.
 #include "xiproperty.h"
 #include "enterleave.h" /* for EnterWindow() */
 #include "xserver-properties.h"
+#include "chdevhier.h" /* For XISendDeviceHierarchyEvent */
 
 /** @file
  * This file handles input device-related stuff.
@@ -343,6 +344,7 @@ EnableDevice(DeviceIntPtr dev)
                            TRUE);
 
     SendDevicePresenceEvent(dev->id, DeviceEnabled);
+    XISendDeviceHierarchyEvent(HF_DeviceEnabled);
 
     return TRUE;
 }
@@ -413,6 +415,7 @@ DisableDevice(DeviceIntPtr dev)
                            TRUE);
 
     SendDevicePresenceEvent(dev->id, DeviceDisabled);
+    XISendDeviceHierarchyEvent(HF_DeviceDisabled);
     return TRUE;
 }
 
@@ -444,6 +447,7 @@ ActivateDevice(DeviceIntPtr dev)
         pScreen->DeviceCursorInitialize(dev, pScreen);
 
     SendDevicePresenceEvent(dev->id, DeviceAdded);
+    XISendDeviceHierarchyEvent(HF_SlaveAdded);
     return ret;
 }
 
@@ -941,6 +945,7 @@ RemoveDevice(DeviceIntPtr dev)
     if (ret == Success && initialized) {
         inputInfo.numDevices--;
         SendDevicePresenceEvent(deviceid, DeviceRemoved);
+        XISendDeviceHierarchyEvent(HF_SlaveRemoved);
     }
 
     return ret;
commit 8634e1bcbae9317fc22132f7c9bde1a4a881b9a7
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Mar 12 10:42:05 2009 +1000

    dix: send presence events when floating and unfloating SDs

diff --git a/dix/devices.c b/dix/devices.c
index 0795d30..64af57f 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -2198,11 +2198,23 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
         dev->spriteInfo->spriteOwner = FALSE;
         dev->spriteInfo->paired = dev;
 
+        /* Floating an SD makes it appear to XI 1 clients */
+        SendDevicePresenceEvent(dev->id, DeviceAdded);
+        if (dev->enabled)
+            SendDevicePresenceEvent(dev->id, DeviceEnabled);
     } else
     {
         dev->spriteInfo->sprite = master->spriteInfo->sprite;
         dev->spriteInfo->paired = master;
         dev->spriteInfo->spriteOwner = FALSE;
+
+        if (!oldmaster)
+        {
+            /* Attaching a floating SD makes it disappear to XI 1 clients */
+            if (dev->enabled)
+                SendDevicePresenceEvent(dev->id, DeviceDisabled);
+            SendDevicePresenceEvent(dev->id, DeviceRemoved);
+        }
     }
 
     /* If we were connected to master device before, this MD may need to
commit c9483a53bea1f721d2902ac11467f67317e7de14
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Mar 11 16:20:22 2009 +1000

    include: add a few prototypes to silence compiler warnings.

diff --git a/include/input.h b/include/input.h
index 7651919..3140c3f 100644
--- a/include/input.h
+++ b/include/input.h
@@ -481,6 +481,15 @@ extern int generate_modkeymap(ClientPtr client, DeviceIntPtr dev,
 extern int change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *map,
                          int max_keys_per_mod);
 
+/* misc event helpers */
+extern Mask GetEventFilter(DeviceIntPtr dev, xEvent *event);
+extern Mask GetWindowXI2Mask(DeviceIntPtr dev, WindowPtr win, xEvent* ev);
+void FixUpEventFromWindow(DeviceIntPtr pDev,
+                          xEvent *xE,
+                          WindowPtr pWin,
+                          Window child,
+                          Bool calcChild);
+
 /* Implemented by the DDX. */
 extern _X_EXPORT int NewInputDeviceRequest(
     InputOption *options,
commit a4b61cfc78d81de02a71fa6ad8a44a06616f6794
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Mar 11 16:08:24 2009 +1000

    dix: un-static FixUpEventFromWindow and deal with focus events too.

diff --git a/dix/events.c b/dix/events.c
index adc180b..447732d 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2233,7 +2233,8 @@ FixUpEventFromWindow(
             event->child = None;
         }
 
-        if (event->evtype == XI_Enter || event->evtype == XI_Leave)
+        if (event->evtype == XI_Enter || event->evtype == XI_Leave ||
+            event->evtype == XI_FocusIn || event->evtype == XI_FocusOut)
             ((xXIEnterEvent*)event)->same_screen =
                 (pSprite->hot.pScreen == pWin->drawable.pScreen);
 
commit 4cc6a96d7171e567a9bd5a10f552bb953077aafb
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Mar 10 16:08:14 2009 +1000

    input: add support for RawDeviceEvents.

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 8404335..5dae990 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -75,6 +75,7 @@ SOFTWARE.
 #include "listdev.h" /* for CopySwapXXXClass */
 #include "xace.h"
 #include "querydev.h" /* For List*Info */
+#include "eventconvert.h"
 
 #include <X11/extensions/XKBproto.h>
 #include "xkbsrv.h"
@@ -914,6 +915,33 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
     return DEFAULT;
 }
 
+static void
+ProcessRawEvent(RawDeviceEvent *ev, DeviceIntPtr device)
+{
+    GrabPtr grab = device->deviceGrab.grab;
+
+    if (grab)
+        DeliverGrabbedEvent(ev, device, FALSE);
+    else { /* deliver to all root windows */
+        xEvent *xi;
+        int i;
+
+        i = EventToXI2((InternalEvent*)ev, (xEvent**)&xi);
+        if (i != Success)
+        {
+            ErrorF("[Xi] %s: XI2 conversion failed in ProcessRawEvent (%d)\n",
+                    device->name, i);
+            return;
+        }
+
+        for (i = 0; i < screenInfo.numScreens; i++)
+            DeliverEventsToWindow(device, WindowTable[i], xi, 1,
+                                  GetEventFilter(device, xi), NULL,
+                                  device->id);
+        xfree(xi);
+    }
+}
+
 /**
  * Main device event processing function.
  * Called from when processing the events from the event queue.
@@ -935,6 +963,12 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
 
     CHECKEVENT(ev);
 
+    if (ev->u.any.type == ET_Raw)
+    {
+        ProcessRawEvent((RawDeviceEvent*)ev, device);
+        return;
+    }
+
     if (IsPointerDevice(device))
     {
         kbd = GetPairedDevice(device);
diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index 553d953..4cd5567 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -52,6 +52,7 @@ static int getValuatorEvents(DeviceEvent *ev, deviceValuator *xv);
 static int eventToKeyButtonPointer(DeviceEvent *ev, xEvent **xi, int *count);
 static int eventToClassesChanged(DeviceChangedEvent *ev, xEvent **dcce);
 static int eventToDeviceEvent(DeviceEvent *ev, xEvent **xi);
+static int eventToRawEvent(RawDeviceEvent *ev, xEvent **xi);
 /**
  * Convert the given event to the respective core event.
  *
@@ -126,6 +127,7 @@ EventToXI(InternalEvent *ev, xEvent **xi, int *count)
         case ET_ProximityOut:
             return eventToKeyButtonPointer((DeviceEvent*)ev, xi, count);
         case ET_DeviceChanged:
+        case ET_Raw:
             *count = 0;
             *xi = NULL;
             return Success;
@@ -164,6 +166,8 @@ EventToXI2(InternalEvent *ev, xEvent **xi)
             return Success;
         case ET_DeviceChanged:
             return eventToClassesChanged((DeviceChangedEvent*)ev, xi);
+        case ET_Raw:
+            return eventToRawEvent((RawDeviceEvent*)ev, xi);
 
     }
 
@@ -412,6 +416,50 @@ eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
     return Success;
 }
 
+static int
+eventToRawEvent(RawDeviceEvent *ev, xEvent **xi)
+{
+    xXIRawDeviceEvent* raw;
+    int vallen, nvals;
+    int i, len = sizeof(xXIRawDeviceEvent);
+    char *ptr;
+    FP3232 *axisval;
+
+    nvals = count_bits(ev->valuators.mask, sizeof(ev->valuators.mask)/sizeof(ev->valuators.mask[0]));
+    len += nvals * (2 * sizeof(uint32_t)) * 2; /* 8 byte per valuator, once
+                                                   raw, once processed */
+    vallen = (((MAX_VALUATORS + 7)/8) + 3)/4;
+    len += vallen * 4; /* valuators mask */
+
+    *xi = xcalloc(1, len);
+    raw = (xXIRawDeviceEvent*)*xi;
+    raw->type           = GenericEvent;
+    raw->extension      = IReqCode;
+    raw->evtype         = GetXI2Type((InternalEvent*)ev);
+    raw->time           = ev->time;
+    raw->length         = (len - sizeof(xEvent) + 3)/4;
+    raw->eventtype      = ev->subtype;
+    raw->detail         = ev->detail.button;
+    raw->deviceid       = ev->deviceid;
+    raw->valuators_len  = vallen;
+
+    ptr = (char*)&raw[1];
+    axisval = (FP3232*)(ptr + raw->valuators_len * 4);
+    for (i = 0; i < sizeof(ev->valuators.mask) * 8; i++)
+    {
+        if (BitIsOn(ev->valuators.mask, i))
+        {
+            SetBit(ptr, i);
+            axisval->integral = ev->valuators.data[i];
+            (axisval + nvals)->integral = ev->valuators.data_raw[i];
+            axisval++;
+            /* FIXME: frac part */
+        }
+    }
+
+    return Success;
+}
+
 /**
  * Return the corresponding core type for the given event or 0 if no core
  * equivalent exists.
@@ -472,6 +520,7 @@ GetXI2Type(InternalEvent *event)
         case ET_Leave:          xi2type = XI_Leave;            break;
         case ET_Hierarchy:      xi2type = XI_HierarchyChanged; break;
         case ET_DeviceChanged:  xi2type = XI_DeviceChanged;    break;
+        case ET_Raw:            xi2type = XI_RawEvent;         break;
         default:
             break;
     }
diff --git a/dix/events.c b/dix/events.c
index d4eea2c..adc180b 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -420,7 +420,7 @@ static Mask filters[MAXDEVICES][128] = {
  *
  * @see GetEventMask
  */
-static Mask
+Mask
 GetEventFilter(DeviceIntPtr dev, xEvent *event)
 {
     if (event->u.u.type != GenericEvent)
@@ -2215,6 +2215,10 @@ FixUpEventFromWindow(
     if (XI2_EVENT(xE))
     {
         xXIDeviceEvent* event = (xXIDeviceEvent*)xE;
+
+        if (event->evtype == XI_RawEvent)
+            return;
+
         event->root = RootWindow(pDev)->drawable.id;
         event->event = pWin->drawable.id;
         if (pSprite->hot.pScreen == pWin->drawable.pScreen)
diff --git a/dix/getevents.c b/dix/getevents.c
index 01a9864..b0bacbd 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -137,6 +137,33 @@ init_event(DeviceIntPtr dev, DeviceEvent* event, Time ms)
 }
 
 static void
+init_raw(DeviceIntPtr dev, RawDeviceEvent *event, Time ms, int subtype,
+         int detail)
+{
+    memset(event, 0, sizeof(RawDeviceEvent));
+    event->header = ET_Internal;
+    event->length = sizeof(RawDeviceEvent);
+    event->type = ET_Raw;
+    event->subtype = subtype;
+    event->time = ms;
+    event->deviceid = dev->id;
+    event->sourceid = dev->id;
+    event->detail.button = detail;
+}
+
+static void
+set_raw_valuators(RawDeviceEvent *event, int first, int num, int *valuators, int32_t* data)
+{
+    int i;
+    for (i = first; i < first + num; i++)
+    {
+        SetBit(event->valuators.mask, i);
+        data[i] = valuators[i - first];
+    }
+}
+
+
+static void
 set_valuators(DeviceIntPtr dev, DeviceEvent* event, int first_valuator,
               int num_valuators, int *valuators)
 {
@@ -802,6 +829,7 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
     int num_events = 0;
     CARD32 ms = 0;
     DeviceEvent *event;
+    RawDeviceEvent *raw;
 
     if (!events ||!pDev->key || !pDev->focus || !pDev->kbdfeed ||
        (type != KeyPress && type != KeyRelease) ||
@@ -822,10 +850,21 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
             return 0;
     }
 
+    ms = GetTimeInMillis();
+
+    raw = (RawDeviceEvent*)events->event;
+    events++;
+    num_events++;
+
+    init_raw(pDev, raw, ms, type, key_code);
+    set_raw_valuators(raw, first_valuator, num_valuators, valuators,
+                      raw->valuators.data_raw);
+
     if (num_valuators)
         clipValuators(pDev, first_valuator, num_valuators, valuators);
 
-    ms = GetTimeInMillis();
+    set_raw_valuators(raw, first_valuator, num_valuators, valuators,
+                      raw->valuators.data);
 
     event = (DeviceEvent*) events->event;
     init_event(pDev, event, ms);
@@ -949,6 +988,7 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
     int num_events = 1;
     CARD32 ms;
     DeviceEvent *event;
+    RawDeviceEvent    *raw;
     int x, y, /* switches between device and screen coords */
         cx, cy; /* only screen coordinates */
     ScreenPtr scr = miPointerGetScreen(pDev);
@@ -965,6 +1005,14 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
 
     events = updateFromMaster(events, pDev, &num_events);
 
+    raw = (RawDeviceEvent*)events->event;
+    events++;
+    num_events++;
+
+    init_raw(pDev, raw, ms, type, buttons);
+    set_raw_valuators(raw, first_valuator, num_valuators, valuators,
+                      raw->valuators.data_raw);
+
     if (flags & POINTER_ABSOLUTE)
     {
         if (flags & POINTER_SCREEN) /* valuators are in screen coords */
@@ -985,10 +1033,12 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
         moveRelative(pDev, &x, &y, first_valuator, num_valuators, valuators);
     }
 
+    set_raw_valuators(raw, first_valuator, num_valuators, valuators,
+                      raw->valuators.data);
+
     positionSprite(pDev, &x, &y, scr, &cx, &cy);
     updateHistory(pDev, first_valuator, num_valuators, ms);
 
-
     /* Update the valuators with the true value sent to the client*/
     if (num_valuators >= 1 && first_valuator == 0)
         valuators[0] = x;
@@ -1023,7 +1073,6 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
 
     set_valuators(pDev, event, first_valuator, num_valuators, valuators);
 
-
     return num_events;
 }
 
diff --git a/include/events.h b/include/events.h
index c6eeae4..a289662 100644
--- a/include/events.h
+++ b/include/events.h
@@ -59,6 +59,7 @@ enum {
 #if XFreeXDGA
     ET_DGAEvent,
 #endif
+    ET_Raw,
     ET_Internal = 0xFF /* First byte */
 } EventType;
 
@@ -171,6 +172,30 @@ typedef struct
 #endif
 
 /**
+ * Raw event, contains the data as posted by the device.
+ */
+typedef struct
+{
+    unsigned char header; /**<  Always ET_Internal */
+    int type;             /**<  ET_Raw */
+    int length;           /**<  Length in bytes */
+    Time time;            /**<  Time in ms */
+    int subtype;          /**<  KeyPress, KeyRelease, ButtonPress,
+                                ButtonRelease, MotionNotify */
+    int deviceid;         /**< Device to post this event for */
+    int sourceid;         /**< The physical source device */
+    union {
+        uint32_t button;  /**< Button number */
+        uint32_t key;     /**< Key code */
+    } detail;
+    struct {
+        uint8_t  mask[(MAX_VALUATORS + 7)/8]; /**< Valuator mask */
+        int32_t  data[MAX_VALUATORS];         /**< Valuator data */
+        int32_t  data_raw[MAX_VALUATORS];     /**< Valuator data as posted */
+    } valuators;
+} RawDeviceEvent;
+
+/**
  * Event type used inside the X server for input event
  * processing.
  */
@@ -188,6 +213,7 @@ typedef struct
 #if XFreeXDGA
         DGAEvent dga;
 #endif
+        RawDeviceEvent raw;
     } u;
 } InternalEvent;
 
diff --git a/mi/mieq.c b/mi/mieq.c
index efec55a..0dedbee 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -277,6 +277,9 @@ ChangeDeviceID(DeviceIntPtr dev, InternalEvent* event)
         case ET_DeviceChanged:
             event->u.device.deviceid = dev->id;
             break;
+        case ET_Raw:
+            event->u.raw.deviceid = dev->id;
+            break;
         default:
             ErrorF("[mi] Unknown event type (%d), cannot change id.\n",
                    event->u.any.type);
commit a668d91e28d5a3042a8ce0d087474883b046869a
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Mar 9 16:36:07 2009 +1000

    dix: store the xi2mask on grabs and pass it around as needed.
    
    This enables passive and implicit passive grabs for XI2 events, except that we
    don't have the protocol spec yet to request them.

diff --git a/dix/events.c b/dix/events.c
index 52729ca..d4eea2c 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2040,7 +2040,8 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
      * Note that since core events are delivered first, an implicit grab may
      * be activated on a core grab, stopping the XI events.
      */
-    if ((type == DeviceButtonPress || type == ButtonPress)
+    if ((type == DeviceButtonPress || type == ButtonPress ||
+        ((XI2_EVENT(pEvents) && ((xGenericEvent*)pEvents)->evtype == XI_ButtonPress)))
             && deliveries
             && (!grab))
     {
@@ -2059,10 +2060,14 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
 	tempGrab.cursor = NullCursor;
         tempGrab.coreGrab = (type == ButtonPress);
 
-        /* get the XI device mask */
+        /* get the XI and XI2 device mask */
         inputMasks = wOtherInputMasks(pWin);
         tempGrab.deviceMask = (inputMasks) ? inputMasks->inputEvents[pDev->id]: 0;
 
+        if (inputMasks)
+            memcpy(tempGrab.xi2mask, inputMasks->xi2mask,
+                    sizeof(tempGrab.xi2mask));
+
 	(*pDev->deviceGrab.ActivateGrab)(pDev, &tempGrab,
                                         currentTime, TRUE | ImplicitGrabMask);
     }
@@ -3697,6 +3702,19 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
 
         if (!deliveries)
         {
+            int evtype = ((xGenericEvent*)xi2)->evtype;
+            mask = grab->xi2mask[AllDevices][evtype/8] |
+                   grab->xi2mask[AllMasterDevices][evtype/8] |
+                   grab->xi2mask[thisDev->id][evtype/8];
+            /* try XI2 event */
+            FixUpEventFromWindow(thisDev, xi2, grab->window, None, TRUE);
+            /* XXX: XACE */
+            deliveries = TryClientEvents(rClient(grab), thisDev, xi2, 1, mask,
+                                         GetEventFilter(thisDev, xi2), grab);
+        }
+
+        if (!deliveries)
+        {
             /* try XI event */
             if (grabinfo->fromPassiveGrab  &&
                     grabinfo->implicitGrab)
diff --git a/dix/grabs.c b/dix/grabs.c
index 164e200..156574e 100644
--- a/dix/grabs.c
+++ b/dix/grabs.c
@@ -82,7 +82,7 @@ CreateGrab(
 {
     GrabPtr grab;
 
-    grab = xalloc(sizeof(GrabRec));
+    grab = xcalloc(1, sizeof(GrabRec));
     if (!grab)
 	return (GrabPtr)NULL;
     grab->resource = FakeClientID(client);
diff --git a/include/inputstr.h b/include/inputstr.h
index 678c171..59fb29b 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -181,6 +181,8 @@ typedef struct _GrabRec {
     CursorPtr		cursor;		/* always NULL for keyboards */
     Mask		eventMask;
     Mask                deviceMask;     
+    /* XI2 event masks. One per device, each bit is a mask of (1 << type) */
+    unsigned char       xi2mask[EMASKSIZE][XI2MASKSIZE];
 } GrabRec;
 
 typedef struct _KeyClassRec {
commit 32f338263ff7de1a2e76d570c98f5be979c18d4e
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Mar 8 21:32:31 2009 +1000

    Xi: Deliver XI2 HierarchyEvents when the hierarchy changes.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/chdevhier.c b/Xi/chdevhier.c
index 3df9c87..2b107e7 100644
--- a/Xi/chdevhier.c
+++ b/Xi/chdevhier.c
@@ -1,5 +1,6 @@
 /*
  * Copyright 2007-2008 Peter Hutterer
+ * Copyright 2009 Red Hat, Inc.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -47,11 +48,55 @@
 #include "exglobals.h"
 #include "geext.h"
 #include "xace.h"
+#include "querydev.h" /* for GetDeviceUse */
 
 #include "xkbsrv.h"
 
 #include "chdevhier.h"
 
+/**
+ * Send the current state of the device hierarchy to all clients.
+ */
+void XISendDeviceHierarchyEvent(int flags)
+{
+    xXIDeviceHierarchyEvent *ev;
+    xXIHierarchyInfo *info;
+    DeviceIntRec dummyDev;
+    DeviceIntPtr dev;
+
+    if (!flags)
+        return;
+
+    ev = xcalloc(1, sizeof(xXIDeviceHierarchyEvent) + inputInfo.numDevices *
+            sizeof(xXIHierarchyInfo));
+    ev->type = GenericEvent;
+    ev->extension = IReqCode;
+    ev->evtype = XI_HierarchyChanged;
+    ev->time = GetTimeInMillis();
+    ev->flags = flags;
+    ev->num_devices = inputInfo.numDevices;
+    ev->length = (ev->num_devices * sizeof(xXIHierarchyInfo))/4;
+
+    info = (xXIHierarchyInfo*)&ev[1];
+    for (dev = inputInfo.devices; dev; dev = dev->next)
+    {
+        info->deviceid = dev->id;
+        info->enabled = dev->enabled;
+        info->use = GetDeviceUse(dev, &info->attachment);
+        info++;
+    }
+    for (dev = inputInfo.off_devices; dev; dev = dev->next)
+    {
+        info->deviceid = dev->id;
+        info->enabled = dev->enabled;
+        info->use = GetDeviceUse(dev, &info->attachment);
+        info++;
+    }
+
+    dummyDev.id = AllDevices;
+    SendEventToAllWindows(&dummyDev, (XI_HierarchyChangedMask >> 8), (xEvent*)ev, 1);
+}
+
 
 /***********************************************************************
  *
@@ -75,17 +120,18 @@ int
 ProcXIChangeDeviceHierarchy(ClientPtr client)
 {
     DeviceIntPtr ptr, keybd;
-    DeviceIntRec dummyDev;
     xXIAnyHierarchyChangeInfo *any;
     int required_len = sizeof(xXIChangeDeviceHierarchyReq);
     char n;
     int rc = Success;
-    int nchanges = 0;
-    xXIDeviceHierarchyEvent ev;
+    int flags = 0;
 
     REQUEST(xXIChangeDeviceHierarchyReq);
     REQUEST_AT_LEAST_SIZE(xXIChangeDeviceHierarchyReq);
 
+    if (!stuff->num_changes)
+        return rc;
+
     any = (xXIAnyHierarchyChangeInfo*)&stuff[1];
     while(stuff->num_changes--)
     {
@@ -127,7 +173,7 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
                         EnableDevice(keybd);
                     }
                     xfree(name);
-                    nchanges++;
+                    flags |= HF_MasterAdded;
                 }
                 break;
             case CH_RemoveMasterDevice:
@@ -233,7 +279,7 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
 
                     RemoveDevice(keybd);
                     RemoveDevice(ptr);
-                    nchanges++;
+                    flags |= HF_MasterRemoved;
                 }
                 break;
             case CH_DetachSlave:
@@ -253,7 +299,7 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
                     }
 
                     AttachDevice(client, ptr, NULL);
-                    nchanges++;
+                    flags |= HF_SlaveDetached;
                 }
                 break;
             case CH_AttachSlave:
@@ -293,7 +339,7 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
                         goto unwind;
                     }
                     AttachDevice(client, ptr, newmaster);
-                    nchanges++;
+                    flags |= HF_SlaveAttached;
                 }
                 break;
         }
@@ -303,18 +349,7 @@ ProcXIChangeDeviceHierarchy(ClientPtr client)
 
 unwind:
 
-    if (nchanges > 0) /* even if an error occured, we need to send an event if
-                       we changed anything in the hierarchy. */
-    {
-        ev.type = GenericEvent;
-        ev.extension = IReqCode;
-        ev.length = 0;
-        ev.evtype = XI_HierarchyChanged;
-        ev.time = GetTimeInMillis();
-
-        SendEventToAllWindows(&dummyDev, XI_DeviceHierarchyChangedMask,
-                (xEvent*)&ev, 1);
-    }
+    XISendDeviceHierarchyEvent(flags);
     return rc;
 }
 
diff --git a/Xi/chdevhier.h b/Xi/chdevhier.h
index 4190538..d2d1001 100644
--- a/Xi/chdevhier.h
+++ b/Xi/chdevhier.h
@@ -39,4 +39,6 @@
 int SProcXIChangeDeviceHierarchy(ClientPtr /* client */);
 int ProcXIChangeDeviceHierarchy(ClientPtr /* client */);
 
+void XISendDeviceHierarchyEvent(int flags);
+
 #endif
diff --git a/Xi/extinit.c b/Xi/extinit.c
index f0aa9f6..8c9f9e1 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -739,6 +739,32 @@ static void SDeviceEvent(xXIDeviceEvent *from, xXIDeviceEvent *to)
     }
 }
 
+static void SDeviceHierarchyEvent(xXIDeviceHierarchyEvent *from,
+                                  xXIDeviceHierarchyEvent *to)
+{
+    int i;
+    char n;
+    xXIHierarchyInfo *info;
+
+    *to = *from;
+    memcpy(&to[1], &from[1], from->length * 4);
+    swaps(&to->sequenceNumber, n);
+    swapl(&to->length, n);
+    swaps(&to->evtype, n);
+    swaps(&to->deviceid, n);
+    swapl(&to->time, n);
+    swapl(&to->flags, n);
+    swaps(&to->num_devices, n);
+
+    info = (xXIHierarchyInfo*)&to[1];
+    for (i = 0; i< from->num_devices; i++)
+    {
+        swaps(&info->deviceid, n);
+        swaps(&info->attachment, n);
+        info++;
+    }
+}
+
 /** Event swapping function for XI2 events. */
 static void
 XI2EventSwap(xGenericEvent *from, xGenericEvent *to)
@@ -753,6 +779,9 @@ XI2EventSwap(xGenericEvent *from, xGenericEvent *to)
             SDeviceChangedEvent((xXIDeviceChangedEvent*)from,
                                 (xXIDeviceChangedEvent*)to);
             break;
+        case XI_HierarchyChanged:
+            SDeviceHierarchyEvent((xXIDeviceHierarchyEvent*)from,
+                                  (xXIDeviceHierarchyEvent*)to);
         default:
             SDeviceEvent((xXIDeviceEvent*)from, (xXIDeviceEvent*)to);
             break;
commit 97e89a59572a4be6757510a317c142ec1d82e8f8
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 6 23:22:00 2009 +1000

    Allow XI2 event selection for AllDevices and AllMasterDevices.

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 87811dc..cdb9c6f 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -67,6 +67,7 @@ ProcXISelectEvent(ClientPtr client)
     int rc, num_masks, i;
     WindowPtr win;
     DeviceIntPtr dev;
+    DeviceIntRec dummy;
     xXIDeviceEventMask *evmask;
     int *types = NULL;
 
@@ -109,7 +110,13 @@ ProcXISelectEvent(ClientPtr client)
     num_masks = stuff->num_masks;
     while(num_masks--)
     {
-        dixLookupDevice(&dev, evmask->deviceid, client, DixReadAccess);
+        if (evmask->deviceid == AllDevices ||
+            evmask->deviceid == AllMasterDevices)
+        {
+            dummy.id = evmask->deviceid;
+            dev = &dummy;
+        } else
+            dixLookupDevice(&dev, evmask->deviceid, client, DixReadAccess);
         XISetEventMask(dev, win, client, evmask->mask_len * 4, (unsigned char*)&evmask[1]);
         evmask = (xXIDeviceEventMask*)(((unsigned char*)evmask) + evmask->mask_len * 4);
     }
diff --git a/dix/events.c b/dix/events.c
index 177fa05..52729ca 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -459,7 +459,9 @@ GetEventMask(DeviceIntPtr dev, xEvent *event, InputClients* other)
     if (XI2_EVENT(event))
     {
         int byte = ((xGenericEvent*)event)->evtype / 8;
-        return other->xi2mask[dev->id][byte];
+        return (other->xi2mask[dev->id][byte] |
+                other->xi2mask[AllDevices][byte] |
+                (dev->isMaster? other->xi2mask[AllMasterDevices][byte] : 0));
     } else if (CORE_EVENT(event))
         return other->mask[AllDevices];
     else
@@ -1995,10 +1997,8 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
         else if (XI2_EVENT(pEvents))
         {
             OtherInputMasks *inputMasks = wOtherInputMasks(pWin);
-            int evtype = ((xGenericEvent*)pEvents)->evtype;
             /* Has any client selected for the event? */
-            if (!inputMasks ||
-                !(inputMasks->xi2mask[mskidx][evtype/8] & filter))
+            if (!GetWindowXI2Mask(pDev, pWin, pEvents))
                 return 0;
             other = inputMasks->inputClients;
         } else {
@@ -2291,7 +2291,9 @@ EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win)
     ((xGenericEvent*)&ev)->evtype = type;
     filter = GetEventFilter(dev, &ev);
     if (type && (inputMasks = wOtherInputMasks(win)) &&
-        inputMasks->xi2mask[dev->id][type / 8] & filter)
+        ((inputMasks->xi2mask[AllDevices][type/8] & filter) ||
+         ((inputMasks->xi2mask[AllMasterDevices][type/8] & filter) && dev->isMaster) ||
+         (inputMasks->xi2mask[dev->id][type/8] & filter)))
         rc |= XI2_MASK;
 
     type = GetXIType(event);
commit 808a158182b0a3b985385899252c190947b4dbbd
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 6 14:45:26 2009 +1000

    dix: Enable XI2 delivery for events and focused events.
    
    No support for grabbed events yet.

diff --git a/dix/events.c b/dix/events.c
index 72b077b..177fa05 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -409,16 +409,24 @@ static Mask filters[MAXDEVICES][128] = {
  * For the given event, return the matching event filter. This filter may then
  * be AND'ed with the selected event mask.
  *
+ * For XI2 events, the returned filter is simply the byte containing the event
+ * mask we're interested in. E.g. for a mask of (1 << 13), this would be
+ * byte[1].
+ *
  * @param[in] dev The device the event belongs to, may be NULL.
  * @param[in] event The event to get the filter for. Only the type of the
  *                  event matters, or the extension + evtype for GenericEvents.
  * @return The filter mask for the given event.
+ *
+ * @see GetEventMask
  */
 static Mask
 GetEventFilter(DeviceIntPtr dev, xEvent *event)
 {
     if (event->u.u.type != GenericEvent)
         return filters[dev ? dev->id : 0][event->u.u.type];
+    else if (XI2_EVENT(event))
+        return (1 << (((xXIDeviceEvent*)event)->evtype % 8));
     ErrorF("[dix] Unknown device type %d. No filter\n", event->u.u.type);
     return 0;
 }
@@ -444,6 +452,21 @@ GetWindowXI2Mask(DeviceIntPtr dev, WindowPtr win, xEvent* ev)
             (inputMasks->xi2mask[AllMasterDevices][evtype/8] && dev->isMaster));
 }
 
+static Mask
+GetEventMask(DeviceIntPtr dev, xEvent *event, InputClients* other)
+{
+    /* XI2 filters are only ever 8 bit, so let's return a 8 bit mask */
+    if (XI2_EVENT(event))
+    {
+        int byte = ((xGenericEvent*)event)->evtype / 8;
+        return other->xi2mask[dev->id][byte];
+    } else if (CORE_EVENT(event))
+        return other->mask[AllDevices];
+    else
+        return other->mask[dev->id];
+}
+
+
 static CARD8 criticalEvents[32] =
 {
     0x7c, 0x30, 0x40			/* key, button, expose, and configure events */
@@ -1969,7 +1992,16 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
     {
         if (CORE_EVENT(pEvents))
             other = (InputClients *)wOtherClients(pWin);
-        else {
+        else if (XI2_EVENT(pEvents))
+        {
+            OtherInputMasks *inputMasks = wOtherInputMasks(pWin);
+            int evtype = ((xGenericEvent*)pEvents)->evtype;
+            /* Has any client selected for the event? */
+            if (!inputMasks ||
+                !(inputMasks->xi2mask[mskidx][evtype/8] & filter))
+                return 0;
+            other = inputMasks->inputClients;
+        } else {
             OtherInputMasks *inputMasks = wOtherInputMasks(pWin);
             /* Has any client selected for the event? */
             if (!inputMasks ||
@@ -1981,22 +2013,24 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
 
         for (; other; other = other->next)
         {
+            Mask mask;
             if (IsInterferingGrab(rClient(other), pDev, pEvents))
                 continue;
 
+            mask = GetEventMask(pDev, pEvents, other);
+
             if (XaceHook(XACE_RECEIVE_ACCESS, rClient(other), pWin,
                         pEvents, count))
                 /* do nothing */;
             else if ( (attempt = TryClientEvents(rClient(other), pDev,
                             pEvents, count,
-                            other->mask[mskidx],
-                            filter, grab)) )
+                            mask, filter, grab)) )
             {
                 if (attempt > 0)
                 {
                     deliveries++;
                     client = rClient(other);
-                    deliveryMask = other->mask[mskidx];
+                    deliveryMask = mask;
                 } else
                     nondeliveries--;
             }
@@ -2225,6 +2259,7 @@ FixUpEventFromWindow(
 #define XI_MASK                 (1 << 0) /**< XI mask set on window */
 #define CORE_MASK               (1 << 1) /**< Core mask set on window */
 #define DONT_PROPAGATE_MASK     (1 << 2) /**< DontPropagate mask set on window */
+#define XI2_MASK                (1 << 3) /**< XI2 mask set on window */
 /* @} */
 
 /**
@@ -2236,13 +2271,12 @@ FixUpEventFromWindow(
  * @param[in] dev The device this event is being sent for.
  * @param[in] event The event that is to be sent.
  * @param[in] win The current event window.
- * @param[out] filter_out The event filter for this event.
  *
- * @return Bitmask of ::XI_MASK, ::CORE_MASK, and ::DONT_PROPAGATE_MASK.
+ * @return Bitmask of ::XI2_MASK, ::XI_MASK, ::CORE_MASK, and
+ * ::DONT_PROPAGATE_MASK.
  */
 static int
-EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win,
-                   Mask *filter_out)
+EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win)
 {
     int rc = 0;
     int filter = 0;
@@ -2250,12 +2284,22 @@ EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win,
     OtherInputMasks *inputMasks;
     xEvent ev;
 
+    /* XXX: this makes me gag */
+    type = GetXI2Type(event);
+    ev.u.u.type = GenericEvent; /* GetEventFilter only cares about type and evtype*/
+    ((xGenericEvent*)&ev)->extension = IReqCode;
+    ((xGenericEvent*)&ev)->evtype = type;
+    filter = GetEventFilter(dev, &ev);
+    if (type && (inputMasks = wOtherInputMasks(win)) &&
+        inputMasks->xi2mask[dev->id][type / 8] & filter)
+        rc |= XI2_MASK;
+
     type = GetXIType(event);
-    ev.u.u.type = type; /* GetEventFilter only cares about type */
+    ev.u.u.type = type;
     filter = GetEventFilter(dev, &ev);
 
     /* Check for XI mask */
-    if (type && (inputMasks = wOtherInputMasks(win)) &&
+    if (type && inputMasks &&
         (inputMasks->deliverableEvents[dev->id] & filter) &&
         (inputMasks->inputEvents[dev->id] & filter))
         rc |= XI_MASK;
@@ -2275,7 +2319,6 @@ EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win,
     if (type && (filter & wDontPropagateMask(win)))
         rc |= DONT_PROPAGATE_MASK;
 
-    *filter_out = filter;
     return rc;
 }
 
@@ -2330,11 +2373,31 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
 
     while (pWin)
     {
-        if ((mask = EventIsDeliverable(dev, event, pWin, &filter)))
+        if ((mask = EventIsDeliverable(dev, event, pWin)))
         {
+            if (mask & XI2_MASK)
+            {
+                xEvent *xi2 = NULL;
+                rc = EventToXI2(event, &xi2);
+                if (rc != Success)
+                {
+                    ErrorF("[dix] %s: XI2 conversion failed in DDE (%d).\n",
+                            dev->name, rc);
+                    goto unwind;
+                }
+                filter = GetEventFilter(dev, xi2);
+                FixUpEventFromWindow(dev, xi2, pWin, child, FALSE);
+                deliveries = DeliverEventsToWindow(dev, pWin, xi2, 1,
+                                                   filter, grab, dev->id);
+                xfree(xi2);
+                if (deliveries > 0)
+                    goto unwind;
+            }
+
             /* XI events first */
             if (mask & XI_MASK)
             {
+                filter = GetEventFilter(dev, xE);
                 FixUpEventFromWindow(dev, xE, pWin, child, FALSE);
                 deliveries = DeliverEventsToWindow(dev, pWin, xE, count,
                                                    filter, grab, dev->id);
@@ -2354,6 +2417,7 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
                     goto unwind;
                 }
 
+                filter = GetEventFilter(dev, &core);
                 FixUpEventFromWindow(dev, &core, pWin, child, FALSE);
                 deliveries = DeliverEventsToWindow(dev, pWin, &core, 1,
                                                    filter, grab, dev->id);
@@ -3232,6 +3296,7 @@ CheckPassiveGrabsOnWindow(
             xkbi= gdev->key->xkbInfo;
 	tempGrab.modifierDevice = grab->modifierDevice;
         tempGrab.modifiersDetail.exact = xkbi ? xkbi->state.grab_mods : 0;
+        /* FIXME: check for xi2 grabs */
 
         /* Check for XI grabs first */
         tempGrab.type = GetXIType((InternalEvent*)event);
@@ -3435,7 +3500,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
     WindowPtr focus = keybd->focus->win;
     BOOL sendCore = (keybd->isMaster && keybd->coreEvents);
     xEvent core;
-    xEvent *xE = NULL;
+    xEvent *xE = NULL, *xi2 = NULL;
     int count, rc;
     int deliveries = 0;
 
@@ -3455,7 +3520,6 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
     }
     ptr = GetPairedDevice(keybd);
 
-
     rc = EventToXI(event, &xE, &count);
     if (rc != Success)
     {
@@ -3468,6 +3532,23 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
     if (XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, xE, count))
 	goto unwind;
 
+    rc = EventToXI2(event, &xi2);
+    if (rc != Success)
+    {
+        ErrorF("[dix] %s: XI2 conversion failed in DFE (%d, %d). Skipping delivery.\n",
+               keybd->name, event->u.any.type, rc);
+        goto unwind;
+    } else if (xi2)
+    {
+        int filter = GetEventFilter(keybd, xi2);
+        /* just deliver it to the focus window */
+        FixUpEventFromWindow(ptr, xi2, focus, None, FALSE);
+        deliveries = DeliverEventsToWindow(keybd, focus, xi2, 1,
+                                           filter, NullGrab, keybd->id);
+        if (deliveries > 0)
+            goto unwind;
+    }
+
     /* just deliver it to the focus window */
     FixUpEventFromWindow(ptr, xE, focus, None, FALSE);
     deliveries = DeliverEventsToWindow(keybd, focus, xE, count,
@@ -3496,6 +3577,8 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
 unwind:
     if (xE)
         xfree(xE);
+    if (xi2)
+        xfree(xi2);
     return;
 }
 
@@ -3518,6 +3601,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
     BOOL sendCore = FALSE;
     int rc, count = 0;
     xEvent *xi = NULL;
+    xEvent *xi2 = NULL;
 
     grabinfo = &thisDev->deviceGrab;
     grab = grabinfo->grab;
@@ -3554,12 +3638,21 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
     if (!deliveries)
     {
         Mask mask;
+
         /* XXX: In theory, we could pass the internal events through to
          * everything and only convert just before hitting the wire. We can't
          * do that yet, so DGE is the last stop for internal events. From here
          * onwards, we deal with core/XI events.
          */
 
+        rc = EventToXI2(event, &xi2);
+        if (rc != Success)
+        {
+            ErrorF("[dix] %s: XI2 conversion failed in DGE (%d, %d). Skipping delivery.\n",
+                    thisDev->name, event->u.any.type, rc);
+            goto unwind;
+        }
+
         rc = EventToXI(event, &xi, &count);
         if (rc != Success)
         {
@@ -3660,6 +3753,8 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
 unwind:
     if (xi)
         xfree(xi);
+    if (xi2)
+        xfree(xi2);
 }
 
 /* This function is used to set the key pressed or key released state -
commit 87ff1159b497c66554a4036ae619f92d5631f00f
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Mar 11 09:01:23 2009 +1000

    dix: deliver device enter/leave events.

diff --git a/Xi/extinit.c b/Xi/extinit.c
index a83a20e..f0aa9f6 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -624,6 +624,10 @@ SDeviceLeaveNotifyEvent (xXILeaveEvent *from, xXILeaveEvent *to)
     swaps(&to->event_y.integral, n);
     swaps(&to->event_y.frac, n);
     swaps(&to->sourceid, n);
+    swaps(&to->buttons_len, n);
+    swapl(&to->mods.base_mods, n);
+    swapl(&to->mods.latched_mods, n);
+    swapl(&to->mods.locked_mods, n);
 }
 
 static void
diff --git a/dix/events.c b/dix/events.c
index 43af7c7..72b077b 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4015,57 +4015,62 @@ DeviceEnterLeaveEvent(
     Window child)
 {
     GrabPtr             grab = mouse->deviceGrab.grab;
-    xXIEnterEvent       event;
-    int                 mskidx;
-    OtherInputMasks     *inputMasks;
+    xXIEnterEvent       *event;
     Mask                mask;
-    xEvent              dummy;
+    int                 filter;
+    int                 btlen, len, i;
+    DeviceIntPtr        kbd;
 
-    if (grab) {
-        mask = (pWin == grab->window) ? grab->eventMask : 0;
-        if (grab->ownerEvents)
-            mask |= EventMaskForClient(pWin, rClient(grab));
-    } else {
-        mask = pWin->eventMask | wOtherEventMasks(pWin);
-    }
-
-    memset(&event, 0, sizeof(event));
-    event.type        = GenericEvent;
-    event.extension   = IReqCode;
-    event.evtype      = type;
-    event.detail      = detail;
-    event.time        = currentTime.milliseconds;
-    event.deviceid    = mouse->id;
-    event.sourceid    = 0; /*XXX */
-    event.mode        = mode;
-    event.root_x.integral      = mouse->spriteInfo->sprite->hot.x;
-    event.root_y.integral      = mouse->spriteInfo->sprite->hot.y;
-
-    /* We use FUEFW to fill in dummy, then copy the values */
-    FixUpEventFromWindow(mouse, &dummy, pWin, None, FALSE);
-
-    event.same_screen = dummy.u.keyButtonPointer.sameScreen;
-    event.child       = dummy.u.keyButtonPointer.child;
-    event.event_x.integral     = dummy.u.keyButtonPointer.eventX;
-    event.event_y.integral     = dummy.u.keyButtonPointer.eventY;
-
-    mskidx = mouse->id;
-    inputMasks = wOtherInputMasks(pWin);
-    if (inputMasks &&
-       (GetEventFilter(mouse, (xEvent*)&event) &
-            inputMasks->deliverableEvents[mskidx]))
+    btlen = (mouse->button) ? (mouse->button->numButtons + 7)/8 : 0;
+    btlen = (btlen + 3)/4;
+    len = sizeof(xXIEnterEvent) + btlen * 4;
+
+    event = xcalloc(1, len);
+    event->type         = GenericEvent;
+    event->extension    = IReqCode;
+    event->evtype       = type;
+    event->length       = (len - sizeof(xEvent))/4;
+    event->buttons_len  = btlen;
+    event->detail       = detail;
+    event->time         = currentTime.milliseconds;
+    event->deviceid     = mouse->id;
+    event->sourceid     = 0; /*XXX */
+    event->mode         = mode;
+    event->root_x.integral      = mouse->spriteInfo->sprite->hot.x;
+    event->root_y.integral      = mouse->spriteInfo->sprite->hot.y;
+
+    for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
+        if (BitIsOn(mouse->button->down, i))
+            SetBit(&event[1], i);
+
+    kbd = (mouse->isMaster || mouse->u.master) ? GetPairedDevice(mouse) : NULL;
+    if (kbd && kbd->key)
     {
-        if (grab)
-            TryClientEvents(rClient(grab), mouse,
-                            (xEvent*)&event, 1, mask,
-                            GetEventFilter(mouse, (xEvent*)&event),
-                            grab);
-        else
-            DeliverEventsToWindow(mouse, pWin, (xEvent*)&event, 1,
-                                  GetEventFilter(mouse, (xEvent*)&event),
-                                  NullGrab, mouse->id);
+        event->mods.base_mods = kbd->key->xkbInfo->state.base_mods;
+        event->mods.latched_mods = kbd->key->xkbInfo->state.latched_mods;
+        event->mods.locked_mods = kbd->key->xkbInfo->state.locked_mods;
+
+        event->group.base_group = kbd->key->xkbInfo->state.base_group;
+        event->group.latched_group = kbd->key->xkbInfo->state.latched_group;
+        event->group.locked_group = kbd->key->xkbInfo->state.locked_group;
     }
 
+    FixUpEventFromWindow(mouse, (xEvent*)event, pWin, None, FALSE);
+
+
+    if (!GetWindowXI2Mask(mouse, pWin, (xEvent*)event))
+        return;
+
+    filter = GetEventFilter(mouse, (xEvent*)event);
+    mask = 0x0; /* FIXME: we should handle grabs, once we can */
+
+    if (grab)
+        TryClientEvents(rClient(grab), mouse, (xEvent*)event, 1, mask,
+                        filter, grab);
+    else
+        DeliverEventsToWindow(mouse, pWin, (xEvent*)event, 1, filter,
+                              NullGrab, mouse->id);
+    xfree(event);
 }
 
 void
commit 04ed0bcb2530866f7248b412974ecd15f0fbf6ac
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Feb 23 17:07:55 2009 +1000

    xkb: remove Device/Enter leave handling - XI2 enter/leave don't have compat state.

diff --git a/xkb/xkbEvents.c b/xkb/xkbEvents.c
index 9293c60..d7a186b 100644
--- a/xkb/xkbEvents.c
+++ b/xkb/xkbEvents.c
@@ -1037,10 +1037,6 @@ XkbSrvInfoPtr	xkbi;
 		     new|= xkbi->state.compat_lookup_mods;
 		else new|= xkbi->state.compat_grab_mods;
                 kbp->state= new;
-            } else if ((type==DeviceEnterNotify)||(type==DeviceLeaveNotify)) {
-                deviceEnterNotify *del = (deviceEnterNotify*)&xE[i];
-                del->state&=0x1F00;
-                del->state|= xkbi->state.compat_grab_mods;
             }
 	    button_mask = 1 << xE[i].u.u.detail;
 	    if (type == ButtonPress &&
commit 3f37923a727d5fc4b1880a53dac1145884ba7140
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Feb 23 16:12:25 2009 +1000

    Xi: send XI2 focus events.

diff --git a/Xi/exevents.c b/Xi/exevents.c
index cee6823..8404335 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1164,15 +1164,58 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
 		 WindowPtr pWin)
 {
     deviceFocus event;
+    xXIFocusInEvent *xi2event;
+    DeviceIntPtr mouse;
+    int btlen, len, i;
+
+    mouse = (dev->isMaster || dev->u.master) ? GetPairedDevice(dev) : NULL;
+
+    /* XI 2 event */
+    btlen = (mouse->button) ? (mouse->button->numButtons + 7)/8 : 0;
+    btlen = (btlen + 3)/4;
+    len = sizeof(xXIFocusInEvent) + btlen * 4;
+
+    xi2event = xcalloc(1, len);
+    xi2event->type         = GenericEvent;
+    xi2event->extension    = IReqCode;
+    xi2event->evtype       = type;
+    xi2event->length       = (len - sizeof(xEvent))/4;
+    xi2event->buttons_len  = btlen;
+    xi2event->detail       = detail;
+    xi2event->time         = currentTime.milliseconds;
+    xi2event->deviceid     = dev->id;
+    xi2event->sourceid     = 0; /*XXX */
+    xi2event->mode         = mode;
+    xi2event->root_x.integral      = mouse->spriteInfo->sprite->hot.x;
+    xi2event->root_y.integral      = mouse->spriteInfo->sprite->hot.y;
 
-    if (type == FocusIn)
-	type = DeviceFocusIn;
-    else
-	type = DeviceFocusOut;
+    for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
+        if (BitIsOn(mouse->button->down, i))
+            SetBit(&xi2event[1], i);
+
+    if (dev->key)
+    {
+        xi2event->mods.base_mods = dev->key->xkbInfo->state.base_mods;
+        xi2event->mods.latched_mods = dev->key->xkbInfo->state.latched_mods;
+        xi2event->mods.locked_mods = dev->key->xkbInfo->state.locked_mods;
+
+        xi2event->group.base_group = dev->key->xkbInfo->state.base_group;
+        xi2event->group.latched_group = dev->key->xkbInfo->state.latched_group;
+        xi2event->group.locked_group = dev->key->xkbInfo->state.locked_group;
+    }
+
+    FixUpEventFromWindow(dev, (xEvent*)xi2event, pWin, None, FALSE);
+
+    DeliverEventsToWindow(dev, pWin, (xEvent*)xi2event, 1,
+                          GetWindowXI2Mask(dev, pWin, xi2event), NullGrab,
+                          dev->id);
+
+    xfree(xi2event);
 
+    /* XI 1.x event */
     event.deviceid = dev->id;
     event.mode = mode;
-    event.type = type;
+    event.type = (type == XI_FocusIn) ? DeviceFocusIn : DeviceFocusOut;
     event.detail = detail;
     event.window = pWin->drawable.id;
     event.time = currentTime.milliseconds;
diff --git a/dix/enterleave.c b/dix/enterleave.c
index 3f5d06f..e45d061 100644
--- a/dix/enterleave.c
+++ b/dix/enterleave.c
@@ -629,7 +629,7 @@ DeviceFocusOutEvents(DeviceIntPtr dev,
     if (ancestor == child)
 	return;
     for (win = child->parent; win != ancestor; win = win->parent)
-        DeviceFocusEvent(dev, DeviceFocusOut, mode, detail, win);
+        DeviceFocusEvent(dev, XI_FocusOut, mode, detail, win);
 }
 
 
@@ -650,7 +650,7 @@ DeviceFocusInEvents(DeviceIntPtr dev,
     if (ancestor == parent || !parent)
 	return;
     DeviceFocusInEvents(dev, ancestor, parent, mode, detail);
-    DeviceFocusEvent(dev, DeviceFocusIn, mode, detail, parent);
+    DeviceFocusEvent(dev, XI_FocusIn, mode, detail, parent);
 }
 
 /**
@@ -1275,21 +1275,21 @@ DeviceFocusEvents(DeviceIntPtr dev,
                         NotifyPointer);
             /* Notify all the roots */
             for (i = 0; i < nscreens; i++)
-                DeviceFocusEvent(dev, FocusOut, mode, out, WindowTable[i]);
+                DeviceFocusEvent(dev, XI_FocusOut, mode, out, WindowTable[i]);
         }
         else
         {
             if (IsParent(from, sprite->win))
                 DeviceFocusOutEvents(dev, sprite->win, from, mode,
                         NotifyPointer);
-            DeviceFocusEvent(dev, FocusOut, mode, NotifyNonlinear, from);
+            DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyNonlinear, from);
             /* next call catches the root too, if the screen changed */
             DeviceFocusOutEvents(dev, from->parent, NullWindow, mode,
                     NotifyNonlinearVirtual);
         }
         /* Notify all the roots */
         for (i = 0; i < nscreens; i++)
-            DeviceFocusEvent(dev, FocusIn, mode, in, WindowTable[i]);
+            DeviceFocusEvent(dev, XI_FocusIn, mode, in, WindowTable[i]);
         if (to == PointerRootWin)
             DeviceFocusInEvents(dev, RootWindow(dev), sprite->win, mode, NotifyPointer);
     }
@@ -1301,10 +1301,10 @@ DeviceFocusEvents(DeviceIntPtr dev,
                 DeviceFocusOutEvents(dev, sprite->win, RootWindow(dev), mode,
                         NotifyPointer);
             for (i = 0; i < nscreens; i++)
-                DeviceFocusEvent(dev, FocusOut, mode, out, WindowTable[i]);
+                DeviceFocusEvent(dev, XI_FocusOut, mode, out, WindowTable[i]);
             if (to->parent != NullWindow)
                 DeviceFocusInEvents(dev, RootWindow(dev), to, mode, NotifyNonlinearVirtual);
-            DeviceFocusEvent(dev, FocusIn, mode, NotifyNonlinear, to);
+            DeviceFocusEvent(dev, XI_FocusIn, mode, NotifyNonlinear, to);
             if (IsParent(to, sprite->win))
                 DeviceFocusInEvents(dev, to, sprite->win, mode, NotifyPointer);
         }
@@ -1312,10 +1312,10 @@ DeviceFocusEvents(DeviceIntPtr dev,
         {
             if (IsParent(to, from))
             {
-                DeviceFocusEvent(dev, FocusOut, mode, NotifyAncestor, from);
+                DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyAncestor, from);
                 DeviceFocusOutEvents(dev, from->parent, to, mode,
                         NotifyVirtual);
-                DeviceFocusEvent(dev, FocusIn, mode, NotifyInferior, to);
+                DeviceFocusEvent(dev, XI_FocusIn, mode, NotifyInferior, to);
                 if ((IsParent(to, sprite->win)) &&
                         (sprite->win != from) &&
                         (!IsParent(from, sprite->win)) &&
@@ -1331,9 +1331,9 @@ DeviceFocusEvents(DeviceIntPtr dev,
                             (!IsParent(sprite->win, to)))
                         DeviceFocusOutEvents(dev, sprite->win, from, mode,
                                 NotifyPointer);
-                    DeviceFocusEvent(dev, FocusOut, mode, NotifyInferior, from);
+                    DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyInferior, from);
                     DeviceFocusInEvents(dev, from, to, mode, NotifyVirtual);
-                    DeviceFocusEvent(dev, FocusIn, mode, NotifyAncestor, to);
+                    DeviceFocusEvent(dev, XI_FocusIn, mode, NotifyAncestor, to);
                 }
                 else
                 {
@@ -1343,13 +1343,13 @@ DeviceFocusEvents(DeviceIntPtr dev,
                     if (IsParent(from, sprite->win))
                         DeviceFocusOutEvents(dev, sprite->win, from, mode,
                                 NotifyPointer);
-                    DeviceFocusEvent(dev, FocusOut, mode, NotifyNonlinear, from);
+                    DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyNonlinear, from);
                     if (from->parent != NullWindow)
                         DeviceFocusOutEvents(dev, from->parent, common, mode,
                                 NotifyNonlinearVirtual);
                     if (to->parent != NullWindow)
                         DeviceFocusInEvents(dev, common, to, mode, NotifyNonlinearVirtual);
-                    DeviceFocusEvent(dev, FocusIn, mode, NotifyNonlinear, to);
+                    DeviceFocusEvent(dev, XI_FocusIn, mode, NotifyNonlinear, to);
                     if (IsParent(to, sprite->win))
                         DeviceFocusInEvents(dev, to, sprite->win, mode, NotifyPointer);
                 }
diff --git a/dix/events.c b/dix/events.c
index 0b704ca..43af7c7 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2160,7 +2160,7 @@ static Window FindChildForEvent(DeviceIntPtr dev, WindowPtr event)
  * @param child Child window setting for event (if applicable)
  * @param calcChild If True, calculate the child window.
  */
-static void
+void
 FixUpEventFromWindow(
     DeviceIntPtr pDev,
     xEvent *xE,
commit daf7dd3bfecc9029bdd10c7a4ea5d2c875a89c41
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Mar 11 09:01:12 2009 +1000

    dix: Add GetWindowXI2Mask helper

diff --git a/dix/events.c b/dix/events.c
index 6277941..0b704ca 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -423,6 +423,26 @@ GetEventFilter(DeviceIntPtr dev, xEvent *event)
     return 0;
 }
 
+/**
+ * Return the windows complete XI2 mask for the given XI2 event type.
+ */
+Mask
+GetWindowXI2Mask(DeviceIntPtr dev, WindowPtr win, xEvent* ev)
+{
+    OtherInputMasks *inputMasks = wOtherInputMasks(win);
+    int filter;
+    int evtype;
+
+    if (!inputMasks || !XI2_EVENT(ev))
+        return 0;
+
+    evtype = ((xGenericEvent*)ev)->evtype;
+    filter = GetEventFilter(dev, ev);
+
+    return ((inputMasks->xi2mask[dev->id][evtype/8] & filter) ||
+            inputMasks->xi2mask[AllDevices][evtype/8] ||
+            (inputMasks->xi2mask[AllMasterDevices][evtype/8] && dev->isMaster));
+}
 
 static CARD8 criticalEvents[32] =
 {
commit 8b6a370058ad5a20e0a0e49ec9443daf03775de8
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Feb 23 15:58:07 2009 +1000

    Add XI2 masks and XISelectEvent() request handling.
    
    XI2 event masks are simply stored in the OtherEventMasks as a separate field.
    This replaces the XiSelectEvent code.

diff --git a/Xi/Makefile.am b/Xi/Makefile.am
index 10521fd..5483000 100644
--- a/Xi/Makefile.am
+++ b/Xi/Makefile.am
@@ -94,7 +94,7 @@ libXi_la_SOURCES =	\
 	warpdevp.h \
 	xiproperty.c \
 	xiproperty.h \
-	xiselev.c \
-	xiselev.h
+	xiselectev.c \
+	xiselectev.h
 
 EXTRA_DIST = stubs.c
diff --git a/Xi/exevents.c b/Xi/exevents.c
index fe11694..cee6823 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1499,15 +1499,20 @@ RecalculateDeviceDeliverableEvents(WindowPtr pWin)
     InputClientsPtr others;
     struct _OtherInputMasks *inputMasks;	/* default: NULL */
     WindowPtr pChild, tmp;
-    int i;
+    int i, j;
 
     pChild = pWin;
     while (1) {
 	if ((inputMasks = wOtherInputMasks(pChild)) != 0) {
+            for (i = 0; i < EMASKSIZE; i++)
+                memset(inputMasks->xi2mask[i], 0, sizeof(inputMasks->xi2mask[i]));
 	    for (others = inputMasks->inputClients; others;
 		 others = others->next) {
 		for (i = 0; i < EMASKSIZE; i++)
 		    inputMasks->inputEvents[i] |= others->mask[i];
+                for (i = 0; i < EMASKSIZE; i++)
+                    for (j = 0; j < XI2MASKSIZE; j++)
+                        inputMasks->xi2mask[i][j] |= others->xi2mask[i][j];
 	    }
 	    for (i = 0; i < EMASKSIZE; i++)
 		inputMasks->deliverableEvents[i] = inputMasks->inputEvents[i];
@@ -1955,3 +1960,41 @@ SendEventToAllWindows(DeviceIntPtr dev, Mask mask, xEvent * ev, int count)
     }
 }
 
+/**
+ * Set the XI2 mask for the given client on the given window.
+ * @param dev The device to set the mask for.
+ * @param win The window to set the mask on.
+ * @param client The client setting the mask.
+ * @param len Number of bytes in mask.
+ * @param mask Event mask in the form of (1 << eventtype)
+ */
+void
+XISetEventMask(DeviceIntPtr dev, WindowPtr win, ClientPtr client,
+               unsigned int len, unsigned char* mask)
+{
+    OtherInputMasks *masks;
+    InputClientsPtr others = NULL;
+
+    masks = wOtherInputMasks(win);
+    if (masks)
+    {
+	for (others = wOtherInputMasks(win)->inputClients; others;
+	     others = others->next) {
+	    if (SameClient(others, client)) {
+                memset(others->xi2mask[dev->id], 0,
+                       sizeof(others->xi2mask[dev->id]));
+                break;
+            }
+        }
+    }
+
+    if (!others && len)
+    {
+        AddExtensionClient(win, client, 0, 0);
+        others= wOtherInputMasks(win)->inputClients;
+    }
+
+    memcpy(others->xi2mask[dev->id], mask, len);
+
+    RecalculateDeviceDeliverableEvents(win);
+}
diff --git a/Xi/extinit.c b/Xi/extinit.c
index 5e87451..a83a20e 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -119,7 +119,7 @@ SOFTWARE.
 #include "ungrdevb.h"
 #include "ungrdevk.h"
 #include "warpdevp.h"
-#include "xiselev.h"
+#include "xiselectev.h"
 #include "xiproperty.h"
 
 
@@ -237,7 +237,7 @@ static int (*ProcIVector[])(ClientPtr) = {
         ProcXIChangeDeviceHierarchy,            /* 43 */
         ProcXISetClientPointer,                 /* 44 */
         ProcXIGetClientPointer,                 /* 45 */
-        ProcXiSelectEvent,                      /* 46 */
+        ProcXISelectEvent,                      /* 46 */
         ProcXIQueryVersion,                     /* 47 */
         ProcXIQueryDevice                       /* 48 */
 };
@@ -290,7 +290,7 @@ static int (*SProcIVector[])(ClientPtr) = {
         SProcXIChangeDeviceHierarchy,            /* 43 */
         SProcXISetClientPointer,                 /* 44 */
         SProcXIGetClientPointer,                 /* 45 */
-        SProcXiSelectEvent,                      /* 46 */
+        SProcXISelectEvent,                      /* 46 */
         SProcXIQueryVersion,                     /* 47 */
         SProcXIQueryDevice                       /* 48 */
 };
diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
new file mode 100644
index 0000000..87811dc
--- /dev/null
+++ b/Xi/xiselectev.c
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2008 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+
+#include "dixstruct.h"
+#include "windowstr.h"
+#include "exglobals.h"
+#include "exevents.h"
+#include <X11/extensions/XI2proto.h>
+
+#include "xiselectev.h"
+
+int
+SProcXISelectEvent(ClientPtr client)
+{
+    char n;
+    int i;
+    xXIDeviceEventMask* evmask;
+    uint16_t *evtype;
+
+    REQUEST(xXISelectEventsReq);
+    swaps(&stuff->length, n);
+    REQUEST_SIZE_MATCH(xXISelectEventsReq);
+    swapl(&stuff->window, n);
+    swaps(&stuff->num_masks, n);
+
+    evmask = (xXIDeviceEventMask*)&stuff[1];
+    for (i = 0; i < stuff->num_masks; i++)
+    {
+        swaps(&evmask->deviceid, n);
+        swaps(&evmask->mask_len, n);
+        evmask = (xXIDeviceEventMask*)(((char*)evtype) + evmask->mask_len * 4);
+    }
+
+    return (ProcXISelectEvent(client));
+}
+
+int
+ProcXISelectEvent(ClientPtr client)
+{
+    int rc, num_masks, i;
+    WindowPtr win;
+    DeviceIntPtr dev;
+    xXIDeviceEventMask *evmask;
+    int *types = NULL;
+
+    REQUEST(xXISelectEventsReq);
+    REQUEST_AT_LEAST_SIZE(xXISelectEventsReq);
+
+    rc = dixLookupWindow(&win, stuff->window, client, DixReceiveAccess);
+    if (rc != Success)
+        return rc;
+
+    /* check request validity */
+    evmask = (xXIDeviceEventMask*)&stuff[1];
+    num_masks = stuff->num_masks;
+    while(num_masks--)
+    {
+        if (evmask->deviceid != AllDevices && evmask->deviceid != AllMasterDevices)
+            rc = dixLookupDevice(&dev, evmask->deviceid, client, DixReadAccess);
+        else {
+            /* XXX: XACE here? */
+        }
+        if (rc != Success)
+            return rc;
+
+
+        if ((evmask->mask_len * 4) > XI_LASTEVENT)
+        {
+            unsigned char *bits = (unsigned char*)&evmask[1];
+            for (i = XI_LASTEVENT; i < evmask->mask_len * 4; i++)
+            {
+                if (BitIsOn(bits, i))
+                    return BadValue;
+            }
+        }
+
+        evmask = (xXIDeviceEventMask*)(((unsigned char*)evmask) + evmask->mask_len * 4);
+    }
+
+    /* Set masks on window */
+    evmask = (xXIDeviceEventMask*)&stuff[1];
+    num_masks = stuff->num_masks;
+    while(num_masks--)
+    {
+        dixLookupDevice(&dev, evmask->deviceid, client, DixReadAccess);
+        XISetEventMask(dev, win, client, evmask->mask_len * 4, (unsigned char*)&evmask[1]);
+        evmask = (xXIDeviceEventMask*)(((unsigned char*)evmask) + evmask->mask_len * 4);
+    }
+
+    RecalculateDeliverableEvents(win);
+
+    xfree(types);
+    return Success;
+}
diff --git a/Xi/xiselectev.h b/Xi/xiselectev.h
new file mode 100644
index 0000000..dc52712
--- /dev/null
+++ b/Xi/xiselectev.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2008 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Peter Hutterer
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+int SProcXISelectEvent(ClientPtr client);
+int ProcXISelectEvent(ClientPtr client);
diff --git a/Xi/xiselev.c b/Xi/xiselev.c
deleted file mode 100644
index 229f2d1..0000000
--- a/Xi/xiselev.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/extensions/XIproto.h>
-
-#include "dixstruct.h"
-#include "windowstr.h"
-
-#include "exglobals.h"
-#include "xiselev.h"
-#include "geext.h"
-
-int
-SProcXiSelectEvent(ClientPtr client)
-{
-    char n;
-
-    REQUEST(xXiSelectEventReq);
-    swaps(&stuff->length, n);
-    REQUEST_SIZE_MATCH(xXiSelectEventReq);
-    swapl(&stuff->window, n);
-    swapl(&stuff->mask, n);
-    return (ProcXiSelectEvent(client));
-}
-
-
-int
-ProcXiSelectEvent(ClientPtr client)
-{
-    int rc;
-    WindowPtr pWin;
-    DeviceIntPtr pDev;
-    REQUEST(xXiSelectEventReq);
-    REQUEST_SIZE_MATCH(xXiSelectEventReq);
-
-    rc = dixLookupWindow(&pWin, stuff->window, client, DixReceiveAccess);
-    if (rc != Success)
-        return rc;
-
-    if (stuff->deviceid & (0x1 << 7)) /* all devices */
-        pDev = NULL;
-    else {
-        rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixReadAccess);
-        if (rc != Success)
-            return rc;
-    }
-
-    /* XXX: THIS FUNCTION IS NOW DYSFUNCTIONAL */
-
-    return Success;
-}
-
diff --git a/Xi/xiselev.h b/Xi/xiselev.h
deleted file mode 100644
index b751c5d..0000000
--- a/Xi/xiselev.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifndef XISELEV_H
-#define XISELEV_H 1
-
-int SProcXiSelectEvent(ClientPtr /* client */
-    );
-
-int ProcXiSelectEvent(ClientPtr	/* client */
-    );
-
-#endif /* XISELEV_H */
-
diff --git a/include/exevents.h b/include/exevents.h
index 4ee7084..fc1c23f 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -254,4 +254,7 @@ extern void
 XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master,
                          DeviceChangedEvent *dce);
 
+extern void XISetEventMask(DeviceIntPtr dev, WindowPtr win, ClientPtr client,
+                           unsigned int len, unsigned char* mask);
+
 #endif /* EXEVENTS_H */
diff --git a/include/inputstr.h b/include/inputstr.h
index 3edd33f..678c171 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -55,6 +55,7 @@ SOFTWARE.
 #include "cursorstr.h"
 #include "geext.h"
 #include "privates.h"
+#include <X11/extensions/XI2proto.h>
 
 #define BitIsOn(ptr, bit) (((BYTE *) (ptr))[(bit)>>3] & (1 << ((bit) & 7)))
 #define SetBit(ptr, bit)  (((BYTE *) (ptr))[(bit)>>3] |= (1 << ((bit) & 7)))
@@ -63,7 +64,8 @@ SOFTWARE.
 #define SameClient(obj,client) \
 	(CLIENT_BITS((obj)->resource) == (client)->clientAsMask)
 
-#define EMASKSIZE	MAXDEVICES + 1
+#define EMASKSIZE	MAXDEVICES + 2
+#define XI2MASKSIZE     ((XI_LASTEVENT + 7)/8) /* no of bits for masks */
 
 /**
  * This struct stores the core event mask for each client except the client
@@ -98,6 +100,8 @@ typedef struct _InputClients {
     InputClientsPtr	next; /**< Pointer to the next mask */
     XID			resource; /**< id for putting into resource manager */
     Mask		mask[EMASKSIZE]; /**< Actual XI event mask, deviceid is index */
+    /** XI2 event masks. One per device, each bit is a mask of (1 << type) */
+    unsigned char       xi2mask[EMASKSIZE][XI2MASKSIZE];
 } InputClients;
 
 /**
@@ -126,6 +130,8 @@ typedef struct _OtherInputMasks {
     Mask		dontPropagateMask[EMASKSIZE];
     /** The clients that selected for events */
     InputClientsPtr	inputClients;
+    /* XI2 event masks. One per device, each bit is a mask of (1 << type) */
+    unsigned char       xi2mask[EMASKSIZE][XI2MASKSIZE];
 } OtherInputMasks;
 
 /*
commit 38bba0c1b75b84e8bbdfa7975cf701a9414a3afd
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Feb 20 16:07:33 2009 +1000

    Xi: Change ChangeMasterDeviceClasses to new XI2 events.
    
    Split ChangeMasterDeviceClasses into an extra XISendDeviceChangedEvent that
    assembles the XI2 wire event for the DeviceChanged event. Re-use this when
    detaching the last SD.
    
    Not quite perfect yet, we still copy the device classes from the slave now
    rather than from the data we had when the event occured. But it's a start.
    
    (We can now unexport SizeDeviceInfo and CopySwapDevices, not needed anymore)
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 8851487..fe11694 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -56,12 +56,13 @@ SOFTWARE.
 #include <dix-config.h>
 #endif
 
+#include "inputstr.h"
 #include <X11/X.h>
 #include <X11/Xproto.h>
 #include <X11/extensions/XI.h>
 #include <X11/extensions/XIproto.h>
+#include <X11/extensions/XI2proto.h>
 #include <X11/extensions/geproto.h>
-#include "inputstr.h"
 #include "windowstr.h"
 #include "miscstruct.h"
 #include "region.h"
@@ -73,6 +74,7 @@ SOFTWARE.
 #include "scrnintstr.h"
 #include "listdev.h" /* for CopySwapXXXClass */
 #include "xace.h"
+#include "querydev.h" /* For List*Info */
 
 #include <X11/extensions/XKBproto.h>
 #include "xkbsrv.h"
@@ -654,50 +656,90 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
  * @param device The slave device
  * @param dcce Pointer to the event struct.
  */
-static void
-ChangeMasterDeviceClasses(DeviceIntPtr device,
-                          DeviceChangedEvent *dce)
+void
+XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master, DeviceChangedEvent *dce)
 {
-    DeviceIntPtr master = device->u.master;
-    deviceClassesChangedEvent *dcce;
-    char* classbuff;
-    int len = sizeof(xEvent);
-    int namelen = 0; /* dummy */
+    xXIDeviceChangedEvent *dcce;
+    int len = sizeof(xXIDeviceChangedEvent);
+    int nkeys;
+    char *ptr;
 
-    if (device->isMaster)
-        return;
+    if (dce->buttons.num_buttons)
+    {
+        len += sizeof(xXIButtonInfo);
+        len += dce->buttons.num_buttons * sizeof(Atom); /* button names */
+    }
+    if (dce->num_valuators)
+        len += sizeof(xXIValuatorInfo) * dce->num_valuators;
 
-    if (!master) /* if device was set floating between SIGIO and now */
-        return;
+    nkeys = (dce->keys.max_keycode > 0) ?
+                dce->keys.max_keycode - dce->keys.min_keycode + 1 : 0;
+    if (nkeys > 0)
+    {
+        len += sizeof(xXIKeyInfo);
+        len += sizeof(CARD32) * nkeys; /* keycodes */
+    }
 
-    SizeDeviceInfo(device, &namelen, &len);
     dcce = xalloc(len);
     if (!dcce)
     {
-        ErrorF("[Xi] BadAlloc in ChangeMasterDeviceClasses\n");
+        ErrorF("[Xi] BadAlloc in SendDeviceChangedEvent.\n");
         return;
     }
 
     dcce->type         = GenericEvent;
     dcce->extension    = IReqCode;
-    dcce->evtype       = XI_DeviceClassesChangedNotify;
+    dcce->evtype       = XI_DeviceChanged;
     dcce->time         = GetTimeInMillis();
-    dcce->new_slave    = device->id;
     dcce->deviceid     = master->id;
+    dcce->sourceid     = device->id;
+    dcce->reason       = SlaveSwitch;
     dcce->num_classes  = 0;
-
     dcce->length = (len - sizeof(xEvent))/4;
 
-    master->public.devicePrivate = device->public.devicePrivate;
+    ptr = (char*)&dcce[1];
+    if (dce->buttons.num_buttons)
+    {
+        dcce->num_classes++;
+        ptr += ListButtonInfo(device, (xXIButtonInfo*)ptr);
+    }
 
-    DeepCopyDeviceClasses(device, master);
+    if (nkeys)
+    {
+        dcce->num_classes++;
+        ptr += ListKeyInfo(device, (xXIKeyInfo*)ptr);
+    }
+
+    if (dce->num_valuators)
+    {
+        int i;
+
+        dcce->num_classes += dce->num_valuators;
+        for (i = 0; i < dce->num_valuators; i++)
+            ptr += ListValuatorInfo(device, (xXIValuatorInfo*)ptr, i);
+    }
 
-    classbuff = (char*)&dcce[1];
     /* we don't actually swap if there's a NullClient, swapping is done
      * later when event is delivered. */
-    CopySwapClasses(NullClient, master, &dcce->num_classes, &classbuff);
-    SendEventToAllWindows(master, XI_DeviceClassesChangedMask,
-                          (xEvent*)dcce, 1);
+    SendEventToAllWindows(master, XI_DeviceChangedMask, (xEvent*)dcce, 1);
+}
+
+static void
+ChangeMasterDeviceClasses(DeviceIntPtr device, DeviceChangedEvent *dce)
+{
+    DeviceIntPtr master = device->u.master;
+
+    if (device->isMaster)
+        return;
+
+    if (!master) /* if device was set floating between SIGIO and now */
+        return;
+
+    master->public.devicePrivate = device->public.devicePrivate;
+
+    /* FIXME: the classes may have changed since we generated the event. */
+    DeepCopyDeviceClasses(device, master);
+    XISendDeviceChangedEvent(device, master, dce);
 }
 
 /**
diff --git a/Xi/extinit.c b/Xi/extinit.c
index 8452186..5e87451 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -627,49 +627,111 @@ SDeviceLeaveNotifyEvent (xXILeaveEvent *from, xXILeaveEvent *to)
 }
 
 static void
-SDeviceClassesChangedEvent(deviceClassesChangedEvent* from,
-                           deviceClassesChangedEvent* to)
+SDeviceChangedEvent(xXIDeviceChangedEvent* from, xXIDeviceChangedEvent* to)
 {
     char n;
     int i, j;
-    xAnyClassPtr any;
+    xXIAnyInfo *any;
 
     *to = *from;
     memcpy(&to[1], &from[1], from->length * 4);
 
     swaps(&to->sequenceNumber, n);
     swapl(&to->length, n);
+    swaps(&to->evtype, n);
+    swaps(&to->deviceid, n);
     swapl(&to->time, n);
-   
+    swaps(&to->num_classes, n);
+    swaps(&to->sourceid, n);
+
     /* now swap the actual classes */
-    any = (xAnyClassPtr)&to[1];
+    any = (xXIAnyInfo*)&to[1];
     for (i = 0; i < to->num_classes; i++)
     {
-        switch(any->class)
+        swaps(&any->type, n);
+        swaps(&any->length, n);
+        switch(any->type)
         {
             case KeyClass:
-                swaps(&((xKeyInfoPtr)any)->num_keys, n);
+                {
+                    xXIKeyInfo *ki = (xXIKeyInfo*)any;
+                    uint32_t *key = (uint32_t*)&ki[1];
+                    for (j = 0; j < ki->num_keycodes; j++, key++)
+                        swapl(key, n);
+                    swaps(&ki->num_keycodes, n);
+                }
                 break;
             case ButtonClass:
-                swaps(&((xButtonInfoPtr)any)->num_buttons, n);
+                {
+                    xXIButtonInfo *bi = (xXIButtonInfo*)any;
+                    for (j = 0; j < bi->num_buttons; j++)
+                        swapl(&bi[1 + j], n);
+                    swaps(&bi->num_buttons, n);
+                }
                 break;
             case ValuatorClass:
                 {
-                    xValuatorInfoPtr v = (xValuatorInfoPtr)any;
-                    xAxisInfoPtr a = (xAxisInfoPtr)&v[1];
-
-                    swapl(&v->motion_buffer_size, n);
-                    for (j = 0; j < v->num_axes; j++)
-                    {
-                        swapl(&a->min_value, n);
-                        swapl(&a->max_value, n);
-                        swapl(&a->resolution, n);
-                        a++;
-                    }
+                    xXIValuatorInfo* ai = (xXIValuatorInfo*)any;
+                    swapl(&ai->name, n);
+                    swapl(&ai->min.integral, n);
+                    swapl(&ai->min.frac, n);
+                    swapl(&ai->max.integral, n);
+                    swapl(&ai->max.frac, n);
+                    swapl(&ai->resolution, n);
+                    swaps(&ai->number, n);
                 }
                 break;
         }
-        any = (xAnyClassPtr)((char*)any + any->length);
+        any = (xXIAnyInfo*)((char*)any + any->length * 4);
+    }
+}
+
+static void SDeviceEvent(xXIDeviceEvent *from, xXIDeviceEvent *to)
+{
+    int i;
+    char n;
+    char *ptr;
+    char *vmask;
+
+    *to = *from;
+    memcpy(&to[1], &from[1], from->length * 4);
+
+    swaps(&to->sequenceNumber, n);
+    swapl(&to->length, n);
+    swaps(&to->evtype, n);
+    swaps(&to->deviceid, n);
+    swapl(&to->time, n);
+    swapl(&to->root, n);
+    swapl(&to->event, n);
+    swapl(&to->child, n);
+    swapl(&to->root_x.integral, n);
+    swapl(&to->root_x.frac, n);
+    swapl(&to->root_y.integral, n);
+    swapl(&to->root_y.frac, n);
+    swapl(&to->event_x.integral, n);
+    swapl(&to->event_x.frac, n);
+    swapl(&to->event_y.integral, n);
+    swapl(&to->event_y.frac, n);
+    swaps(&to->buttons_len, n);
+    swaps(&to->valuators_len, n);
+    swaps(&to->sourceid, n);
+    swapl(&to->mods.base_mods, n);
+    swapl(&to->mods.latched_mods, n);
+    swapl(&to->mods.locked_mods, n);
+
+    ptr = (char*)(&to[1]);
+    ptr += from->buttons_len;
+    vmask = ptr; /* valuator mask */
+    ptr += from->valuators_len;
+    for (i = 0; i < from->valuators_len * 32; i++)
+    {
+        if (BitIsOn(vmask, i))
+        {
+            swapl(((uint32_t*)ptr), n);
+            ptr += 4;
+            swapl(((uint32_t*)ptr), n);
+            ptr += 4;
+        }
     }
 }
 
@@ -683,6 +745,13 @@ XI2EventSwap(xGenericEvent *from, xGenericEvent *to)
         case XI_Leave:
             SDeviceLeaveNotifyEvent((xXILeaveEvent*)from, (xXILeaveEvent*)to);
             break;
+        case XI_DeviceChanged:
+            SDeviceChangedEvent((xXIDeviceChangedEvent*)from,
+                                (xXIDeviceChangedEvent*)to);
+            break;
+        default:
+            SDeviceEvent((xXIDeviceEvent*)from, (xXIDeviceEvent*)to);
+            break;
     }
 }
 
diff --git a/Xi/listdev.c b/Xi/listdev.c
index 925d0ec..e7d0a9d 100644
--- a/Xi/listdev.c
+++ b/Xi/listdev.c
@@ -93,7 +93,7 @@ SProcXListInputDevices(ClientPtr client)
  *
  */
 
-void
+static void
 SizeDeviceInfo(DeviceIntPtr d, int *namesize, int *size)
 {
     int chunks;
@@ -273,22 +273,7 @@ CopySwapValuatorClass(ClientPtr client, ValuatorClassPtr v, char **buf)
     return (i);
 }
 
-/***********************************************************************
- *
- * This procedure lists information to be returned for an input device.
- *
- */
-
 static void
-ListDeviceInfo(ClientPtr client, DeviceIntPtr d, xDeviceInfoPtr dev,
-	       char **devbuf, char **classbuf, char **namebuf)
-{
-    CopyDeviceName(namebuf, d->name);
-    CopySwapDevice(client, d, 0, devbuf);
-    CopySwapClasses(client, d, &dev->num_classes, classbuf);
-}
-
-void
 CopySwapClasses(ClientPtr client, DeviceIntPtr dev, CARD8 *num_classes,
                 char** classbuf)
 {
@@ -308,6 +293,22 @@ CopySwapClasses(ClientPtr client, DeviceIntPtr dev, CARD8 *num_classes,
 
 /***********************************************************************
  *
+ * This procedure lists information to be returned for an input device.
+ *
+ */
+
+static void
+ListDeviceInfo(ClientPtr client, DeviceIntPtr d, xDeviceInfoPtr dev,
+	       char **devbuf, char **classbuf, char **namebuf)
+{
+    CopyDeviceName(namebuf, d->name);
+    CopySwapDevice(client, d, 0, devbuf);
+    CopySwapClasses(client, d, &dev->num_classes, classbuf);
+}
+
+
+/***********************************************************************
+ *
  * This procedure lists the input devices available to the server.
  *
  * If this request is called by a client that has not issued a
diff --git a/Xi/listdev.h b/Xi/listdev.h
index 39ea2d6..b0d2dd5 100644
--- a/Xi/listdev.h
+++ b/Xi/listdev.h
@@ -43,15 +43,4 @@ void SRepXListInputDevices(ClientPtr /* client */ ,
 			   xListInputDevicesReply *	/* rep */
     );
 
-void
-CopySwapClasses(ClientPtr /* client */,
-                DeviceIntPtr /* dev */,
-                CARD8* /* num_classes */,
-                char** /* classbuf */);
-
-void
-SizeDeviceInfo(DeviceIntPtr /* dev */,
-               int* /* namesize */,
-               int* /* size */);
-
 #endif /* LISTDEV_H */
diff --git a/Xi/querydev.c b/Xi/querydev.c
index 0d90fa9..c7ee0e1 100644
--- a/Xi/querydev.c
+++ b/Xi/querydev.c
@@ -219,7 +219,7 @@ SizeDeviceClasses(DeviceIntPtr dev)
  * Write button information into info.
  * @return Number of bytes written into info.
  */
-static int
+int
 ListButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info)
 {
     info->type = ButtonClass;
@@ -250,7 +250,7 @@ SwapButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info)
  * Write key information into info.
  * @return Number of bytes written into info.
  */
-static int
+int
 ListKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info)
 {
     int i;
@@ -288,7 +288,7 @@ SwapKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info)
  *
  * @return The number of bytes written into info.
  */
-static int
+int
 ListValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info, int axisnumber)
 {
     ValuatorClassPtr v = dev->valuator;
diff --git a/Xi/querydev.h b/Xi/querydev.h
index 92ab2bd..34e87bd 100644
--- a/Xi/querydev.h
+++ b/Xi/querydev.h
@@ -39,4 +39,7 @@ void SRepXIQueryDevice(ClientPtr client, int size, xXIQueryDeviceReply *rep);
 int SizeDeviceClasses(DeviceIntPtr dev);
 int ListDeviceClasses(DeviceIntPtr dev, char* any, uint16_t* nclasses);
 int GetDeviceUse(DeviceIntPtr dev, uint16_t *attachment);
+int ListButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info);
+int ListKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info);
+int ListValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info, int axisnumber);
 #endif /* QUERYDEV_H */
diff --git a/dix/devices.c b/dix/devices.c
index ca0da07..0795d30 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -2217,28 +2217,14 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
 
         if (!it)  /* no dev is paired with old master */
         {
-            /* XXX: reset to defaults */
             EventListPtr event = NULL;
-            char* classbuf;
-            int namelen = 0; /* dummy */
-            int len = sizeof(xEvent);
-            deviceClassesChangedEvent *dcce;
 
+            /* XXX: reset master back to defaults */
             event = InitEventList(1);
-            SizeDeviceInfo(oldmaster, &namelen, &len);
-            SetMinimumEventSize(event, 1, len);
-
-            /* Send event to clients */
+            SetMinimumEventSize(event, 1, sizeof(DeviceChangedEvent));
             CreateClassesChangedEvent(event, oldmaster, oldmaster);
-            dcce = (deviceClassesChangedEvent*)event->event;
-            dcce->deviceid = oldmaster->id;
-            dcce->num_classes = 0;
-            dcce->length = (len - sizeof(xEvent))/4;
-            classbuf = (char*)&event->event[1];
-            CopySwapClasses(NullClient, oldmaster,
-                    &dcce->num_classes, &classbuf);
-            SendEventToAllWindows(oldmaster, XI_DeviceClassesChangedMask,
-                    event->event, 1);
+            XISendDeviceChangedEvent(oldmaster, oldmaster,
+                                     (DeviceChangedEvent*)event->event);
             FreeEventList(event, 1);
         }
     }
diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index c3328d6..553d953 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -45,13 +45,12 @@
 #include "events.h"
 #include "exglobals.h"
 #include "eventconvert.h"
-#include "listdev.h"
+#include "querydev.h"
 
 static int countValuators(DeviceEvent *ev, int *first);
 static int getValuatorEvents(DeviceEvent *ev, deviceValuator *xv);
 static int eventToKeyButtonPointer(DeviceEvent *ev, xEvent **xi, int *count);
-static int eventToClassesChanged(DeviceChangedEvent *ev, xEvent **dcce,
-                                 int *count);
+static int eventToClassesChanged(DeviceChangedEvent *ev, xEvent **dcce);
 static int eventToDeviceEvent(DeviceEvent *ev, xEvent **xi);
 /**
  * Convert the given event to the respective core event.
@@ -127,8 +126,9 @@ EventToXI(InternalEvent *ev, xEvent **xi, int *count)
         case ET_ProximityOut:
             return eventToKeyButtonPointer((DeviceEvent*)ev, xi, count);
         case ET_DeviceChanged:
-            return eventToClassesChanged((DeviceChangedEvent*)ev, xi, count);
-            break;
+            *count = 0;
+            *xi = NULL;
+            return Success;
     }
 
     ErrorF("[dix] EventToXI: Not implemented for %d \n", ev->u.any.type);
@@ -162,6 +162,9 @@ EventToXI2(InternalEvent *ev, xEvent **xi)
         case ET_ProximityOut:
             *xi = NULL;
             return Success;
+        case ET_DeviceChanged:
+            return eventToClassesChanged((DeviceChangedEvent*)ev, xi);
+
     }
 
     ErrorF("[dix] EventToXI2: Not implemented for %d \n", ev->u.any.type);
@@ -290,14 +293,12 @@ getValuatorEvents(DeviceEvent *ev, deviceValuator *xv)
 }
 
 static int
-eventToClassesChanged(DeviceChangedEvent *ev, xEvent **xi, int *count)
+eventToClassesChanged(DeviceChangedEvent *ev, xEvent **xi)
 {
     int len = sizeof(xEvent);
-    int namelen = 0; /* dummy */
     DeviceIntPtr slave;
     int rc;
-    deviceClassesChangedEvent *dcce;
-
+    xXIDeviceChangedEvent *dce;
 
     rc = dixLookupDevice(&slave, ev->new_slaveid,
                          serverClient, DixReadAccess);
@@ -305,21 +306,25 @@ eventToClassesChanged(DeviceChangedEvent *ev, xEvent **xi, int *count)
     if (rc != Success)
         return rc;
 
-    SizeDeviceInfo(slave, &namelen, &len);
+    len += SizeDeviceClasses(slave);
 
     *xi = xcalloc(1, len);
     if (!(*xi))
         return BadAlloc;
 
-    dcce = (deviceClassesChangedEvent*)(*xi);
-    dcce->type = GenericEvent;
-    dcce->extension = IReqCode;
-    dcce->evtype = XI_DeviceClassesChangedNotify;
-    dcce->time = GetTimeInMillis();
-    dcce->new_slave = slave->id;
-    dcce->length = (len - sizeof(xEvent))/4;
+    dce = (xXIDeviceChangedEvent*)(*xi);
+    dce->type = GenericEvent;
+    dce->extension = IReqCode;
+    dce->evtype = XI_DeviceChanged;
+    dce->time = GetTimeInMillis();
+    dce->sourceid = slave->id;
+    dce->reason = SlaveSwitch;
+    dce->length = (len - sizeof(xEvent))/4;
+
+    /* FIXME: this should come from the event, not from the device. See
+     * CreateClassesChangedEvent */
+    ListDeviceClasses(slave, (char*)&dce[1], &dce->num_classes);
 
-    *count = 1;
     return Success;
 }
 
@@ -350,7 +355,6 @@ eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
     char *ptr;
     int32_t *axisval;
 
-
     /* FIXME: this should just send the buttons we have, not MAX_BUTTONs. Same
      * with MAX_VALUATORS below */
     /* btlen is in 4 byte units */
diff --git a/include/exevents.h b/include/exevents.h
index d09ad3c..4ee7084 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -250,4 +250,8 @@ extern _X_EXPORT int XIPropToFloat(
  * would it merely be irrelevant and confusing? */
 extern _X_EXPORT int XIShouldNotify(ClientPtr client, DeviceIntPtr dev);
 
+extern void
+XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master,
+                         DeviceChangedEvent *dce);
+
 #endif /* EXEVENTS_H */
commit 181e41511d5772962b8bc998a1940d2a9ba62d5e
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Feb 23 16:14:51 2009 +1000

    dix: fix up device enter/leave for XI_Enter/XI_Leave.

diff --git a/Xi/extinit.c b/Xi/extinit.c
index 9acbdfe..8452186 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -602,20 +602,28 @@ SDevicePropertyNotifyEvent (devicePropertyNotify *from, devicePropertyNotify *to
 }
 
 static void
-SDeviceLeaveNotifyEvent (deviceLeaveNotify *from, deviceLeaveNotify *to)
+SDeviceLeaveNotifyEvent (xXILeaveEvent *from, xXILeaveEvent *to)
 {
     char n;
 
     *to = *from;
     swaps(&to->sequenceNumber,n);
+    swapl(&to->length, n);
+    swaps(&to->evtype, n);
+    swaps(&to->deviceid, n);
     swapl(&to->time, n);
     swapl(&to->root, n);
     swapl(&to->event, n);
     swapl(&to->child, n);
-    swaps(&to->rootX, n);
-    swaps(&to->rootY, n);
-    swaps(&to->eventX, n);
-    swaps(&to->eventY, n);
+    swaps(&to->root_x.integral, n);
+    swaps(&to->root_x.frac, n);
+    swaps(&to->root_y.integral, n);
+    swaps(&to->root_y.frac, n);
+    swaps(&to->event_x.integral, n);
+    swaps(&to->event_x.frac, n);
+    swaps(&to->event_y.integral, n);
+    swaps(&to->event_y.frac, n);
+    swaps(&to->sourceid, n);
 }
 
 static void
@@ -669,6 +677,13 @@ SDeviceClassesChangedEvent(deviceClassesChangedEvent* from,
 static void
 XI2EventSwap(xGenericEvent *from, xGenericEvent *to)
 {
+    switch(from->evtype)
+    {
+        case XI_Enter:
+        case XI_Leave:
+            SDeviceLeaveNotifyEvent((xXILeaveEvent*)from, (xXILeaveEvent*)to);
+            break;
+    }
 }
 
 /**************************************************************************
@@ -1025,10 +1040,6 @@ SEventIDispatch(xEvent * from, xEvent * to)
 	DO_SWAP(SDevicePresenceNotifyEvent, devicePresenceNotify);
     else if (type == DevicePropertyNotify)
 	DO_SWAP(SDevicePropertyNotifyEvent, devicePropertyNotify);
-    else if (type == DeviceEnterNotify)
-        DO_SWAP(SDeviceLeaveNotifyEvent, deviceEnterNotify);
-    else if (type == DeviceLeaveNotify)
-        DO_SWAP(SDeviceLeaveNotifyEvent, deviceLeaveNotify);
     else {
 	FatalError("XInputExtension: Impossible event!\n");
     }
@@ -1084,8 +1095,6 @@ XInputExtensionInit(void)
 	EventSwapVector[DeviceMappingNotify] = SEventIDispatch;
 	EventSwapVector[ChangeDeviceNotify] = SEventIDispatch;
 	EventSwapVector[DevicePresenceNotify] = SEventIDispatch;
-	EventSwapVector[DeviceEnterNotify] = SEventIDispatch;
-	EventSwapVector[DeviceLeaveNotify] = SEventIDispatch;
 
 	GERegisterExtension(IReqCode, XI2EventSwap);
     } else {
diff --git a/dix/enterleave.c b/dix/enterleave.c
index 2f2cff4..3f5d06f 100644
--- a/dix/enterleave.c
+++ b/dix/enterleave.c
@@ -29,6 +29,7 @@
 #endif
 
 #include <X11/X.h>
+#include <X11/extensions/XI2.h>
 #include "windowstr.h"
 #include "scrnintstr.h"
 #include "exglobals.h"
@@ -228,7 +229,7 @@ DeviceEnterNotifies(DeviceIntPtr dev,
     if (ancestor == parent)
 	return;
     DeviceEnterNotifies(dev, ancestor, parent, mode, detail);
-    DeviceEnterLeaveEvent(dev, DeviceEnterNotify, mode, detail, parent,
+    DeviceEnterLeaveEvent(dev, XI_Enter, mode, detail, parent,
                           child->drawable.id);
 }
 
@@ -334,7 +335,7 @@ DeviceLeaveNotifies(DeviceIntPtr dev,
 	return;
     for (win = child->parent; win != ancestor; win = win->parent)
     {
-        DeviceEnterLeaveEvent(dev, DeviceLeaveNotify, mode, detail, win,
+        DeviceEnterLeaveEvent(dev, XI_Leave, mode, detail, win,
                                   child->drawable.id);
         child = win;
     }
@@ -568,24 +569,24 @@ DeviceEnterLeaveEvents(DeviceIntPtr dev,
 {
     if (IsParent(from, to))
     {
-        DeviceEnterLeaveEvent(dev, DeviceLeaveNotify, mode, NotifyInferior, from, None);
+        DeviceEnterLeaveEvent(dev, XI_Leave, mode, NotifyInferior, from, None);
         DeviceEnterNotifies(dev, from, to, mode, NotifyVirtual);
-        DeviceEnterLeaveEvent(dev, DeviceEnterNotify, mode, NotifyAncestor, to, None);
+        DeviceEnterLeaveEvent(dev, XI_Enter, mode, NotifyAncestor, to, None);
     }
     else if (IsParent(to, from))
     {
-	DeviceEnterLeaveEvent(dev, DeviceLeaveNotify, mode, NotifyAncestor, from, None);
+	DeviceEnterLeaveEvent(dev, XI_Leave, mode, NotifyAncestor, from, None);
 	DeviceLeaveNotifies(dev, from, to, mode, NotifyVirtual);
-	DeviceEnterLeaveEvent(dev, DeviceEnterNotify, mode, NotifyInferior, to, None);
+	DeviceEnterLeaveEvent(dev, XI_Enter, mode, NotifyInferior, to, None);
     }
     else
     { /* neither from nor to is descendent of the other */
 	WindowPtr common = CommonAncestor(to, from);
 	/* common == NullWindow ==> different screens */
-        DeviceEnterLeaveEvent(dev, DeviceLeaveNotify, mode, NotifyNonlinear, from, None);
+        DeviceEnterLeaveEvent(dev, XI_Leave, mode, NotifyNonlinear, from, None);
         DeviceLeaveNotifies(dev, from, common, mode, NotifyNonlinearVirtual);
         DeviceEnterNotifies(dev, common, to, mode, NotifyNonlinearVirtual);
-        DeviceEnterLeaveEvent(dev, DeviceEnterNotify, mode, NotifyNonlinear, to, None);
+        DeviceEnterLeaveEvent(dev, XI_Enter, mode, NotifyNonlinear, to, None);
     }
 }
 
diff --git a/dix/events.c b/dix/events.c
index b27c8e1..6277941 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3994,14 +3994,12 @@ DeviceEnterLeaveEvent(
     WindowPtr pWin,
     Window child)
 {
-    xEvent              event;
     GrabPtr             grab = mouse->deviceGrab.grab;
-    deviceEnterNotify   *devEnterLeave;
+    xXIEnterEvent       event;
     int                 mskidx;
     OtherInputMasks     *inputMasks;
     Mask                mask;
-    DeviceIntPtr        keybd = GetPairedDevice(mouse);
-    BOOL                sameScreen;
+    xEvent              dummy;
 
     if (grab) {
         mask = (pWin == grab->window) ? grab->eventMask : 0;
@@ -4011,41 +4009,40 @@ DeviceEnterLeaveEvent(
         mask = pWin->eventMask | wOtherEventMasks(pWin);
     }
 
-    /* we don't have enough bytes, so we squash flags and mode into
-       one byte, and use the last byte for the deviceid. */
-    memset(&event, 0, sizeof(xEvent));
-    devEnterLeave           = (deviceEnterNotify*)&event;
-    devEnterLeave->type     = type;
-    devEnterLeave->detail   = detail;
-    devEnterLeave->time     = currentTime.milliseconds;
-    devEnterLeave->rootX    = mouse->spriteInfo->sprite->hot.x;
-    devEnterLeave->rootY    = mouse->spriteInfo->sprite->hot.y;
-    FixUpEventFromWindow(mouse, &event, pWin, None, FALSE);
-    sameScreen = event.u.keyButtonPointer.sameScreen;
+    memset(&event, 0, sizeof(event));
+    event.type        = GenericEvent;
+    event.extension   = IReqCode;
+    event.evtype      = type;
+    event.detail      = detail;
+    event.time        = currentTime.milliseconds;
+    event.deviceid    = mouse->id;
+    event.sourceid    = 0; /*XXX */
+    event.mode        = mode;
+    event.root_x.integral      = mouse->spriteInfo->sprite->hot.x;
+    event.root_y.integral      = mouse->spriteInfo->sprite->hot.y;
 
-    devEnterLeave->child    = child;
-    devEnterLeave->deviceid = mouse->id;
-    devEnterLeave->mode     = mode;
-    devEnterLeave->mode    |= (sameScreen ?  (ELFlagSameScreen << 4) : 0);
+    /* We use FUEFW to fill in dummy, then copy the values */
+    FixUpEventFromWindow(mouse, &dummy, pWin, None, FALSE);
 
-    devEnterLeave->state = mouse->button->state & 0x1f00;
-    if (keybd && keybd->key)
-        devEnterLeave->state |= XkbGrabStateFromRec(&keybd->key->xkbInfo->state);
+    event.same_screen = dummy.u.keyButtonPointer.sameScreen;
+    event.child       = dummy.u.keyButtonPointer.child;
+    event.event_x.integral     = dummy.u.keyButtonPointer.eventX;
+    event.event_y.integral     = dummy.u.keyButtonPointer.eventY;
 
     mskidx = mouse->id;
     inputMasks = wOtherInputMasks(pWin);
     if (inputMasks &&
-       (GetEventFilter(mouse, (xEvent*)devEnterLeave) &
+       (GetEventFilter(mouse, (xEvent*)&event) &
             inputMasks->deliverableEvents[mskidx]))
     {
         if (grab)
             TryClientEvents(rClient(grab), mouse,
-                            (xEvent*)devEnterLeave, 1, mask,
-                            GetEventFilter(mouse, (xEvent*)devEnterLeave),
+                            (xEvent*)&event, 1, mask,
+                            GetEventFilter(mouse, (xEvent*)&event),
                             grab);
         else
-            DeliverEventsToWindow(mouse, pWin, (xEvent*)devEnterLeave, 1,
-                                  GetEventFilter(mouse, (xEvent*)devEnterLeave),
+            DeliverEventsToWindow(mouse, pWin, (xEvent*)&event, 1,
+                                  GetEventFilter(mouse, (xEvent*)&event),
                                   NullGrab, mouse->id);
     }
 
commit 0befeb36c175b14eac8d5416851f1556af90dd86
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Feb 24 15:27:07 2009 +1000

    dix: Add device info to DeviceChangedEvent, and fill in CCCE.
    
    We need to fill the info here, as the device may change until we get a chance
    to process it.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/getevents.c b/dix/getevents.c
index a3e11f7..01a9864 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -158,6 +158,7 @@ CreateClassesChangedEvent(EventList* event,
                           DeviceIntPtr master,
                           DeviceIntPtr slave)
 {
+    int i;
     DeviceChangedEvent *dce;
     CARD32 ms = GetTimeInMillis();
 
@@ -175,11 +176,30 @@ CreateClassesChangedEvent(EventList* event,
     dce->flags |= HAS_NEW_SLAVE;
     dce->new_slaveid = slave->id;
 
-    /* FIXME: fill in new information about the device. We need to do this
-     * here to avoid race conditions if the device changes while the event
-     * slumbers in the EQ.
-     */
-
+    if (slave->button)
+    {
+        dce->buttons.num_buttons = slave->button->numButtons;
+        for (i = 0; i < dce->buttons.num_buttons; i++)
+            dce->buttons.names[i] = 0; /* FIXME */
+    }
+    if (slave->valuator)
+    {
+        dce->num_valuators = slave->valuator->numAxes;
+        for (i = 0; i < dce->num_valuators; i++)
+        {
+            dce->valuators[i].min = slave->valuator->axes[i].min_value;
+            dce->valuators[i].max = slave->valuator->axes[i].max_value;
+            dce->valuators[i].resolution = slave->valuator->axes[i].resolution;
+            /* This should, eventually, be a per-axis mode */
+            dce->valuators[i].mode = slave->valuator->mode;
+            dce->valuators[i].name = 0; /* FIXME: */
+        }
+    }
+    if (slave->key)
+    {
+        dce->keys.min_keycode = slave->key->xkbInfo->desc->min_key_code;
+        dce->keys.max_keycode = slave->key->xkbInfo->desc->max_key_code;
+    }
 }
 
 /**
diff --git a/include/events.h b/include/events.h
index 7bc83a6..c6eeae4 100644
--- a/include/events.h
+++ b/include/events.h
@@ -128,7 +128,26 @@ typedef struct
     /** If flags & HAS_OLD_SLAVE is set, old_slaveid specifies device now
      * attached to this device. */
     int new_slaveid;
-    /* FIXME: add the new capabilities here */
+
+    struct {
+        int num_buttons;        /**< Number of buttons */
+        Atom names[MAX_BUTTONS];/**< Button names */
+    } buttons;
+
+    int num_valuators;          /**< Number of axes */
+    struct {
+        uint32_t min;           /**< Minimum value */
+        uint32_t max;           /**< Maximum value */
+        /* FIXME: frac parts of min/max */
+        uint32_t resolution;    /**< Resolution counts/m */
+        uint8_t mode;           /**< Relative or Absolute */
+        Atom name;              /**< Axis name */
+    } valuators[MAX_VALUATORS];
+
+    struct {
+        int min_keycode;
+        int max_keycode;
+    } keys;
 } DeviceChangedEvent;
 
 #if XFreeXDGA
commit b2ba77bac4fc3edab39372dfdc529e745ae74f77
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Mar 5 14:23:47 2009 +1000

    dix: add EventToXI2 and GetXI2Type.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index db7178c..c3328d6 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -32,9 +32,12 @@
 #include <dix-config.h>
 #endif
 
+#include <stdint.h>
 #include <X11/X.h>
 #include <X11/extensions/XIproto.h>
+#include <X11/extensions/XI2proto.h>
 #include <X11/extensions/XI.h>
+#include <X11/extensions/XI2.h>
 
 #include "dix.h"
 #include "inputstr.h"
@@ -49,7 +52,7 @@ static int getValuatorEvents(DeviceEvent *ev, deviceValuator *xv);
 static int eventToKeyButtonPointer(DeviceEvent *ev, xEvent **xi, int *count);
 static int eventToClassesChanged(DeviceChangedEvent *ev, xEvent **dcce,
                                  int *count);
-
+static int eventToDeviceEvent(DeviceEvent *ev, xEvent **xi);
 /**
  * Convert the given event to the respective core event.
  *
@@ -132,6 +135,39 @@ EventToXI(InternalEvent *ev, xEvent **xi, int *count)
     return BadImplementation;
 }
 
+/**
+ * Convert the given event to the respective XI 2.x event and store it in xi.
+ * xi is allocated on demand and must be freed by the caller.
+ *
+ * If the event cannot be converted into an XI event because of protocol
+ * restrictions, xi is NULL and Success is returned.
+ *
+ * @param[in] ev The event to convert into an XI2 event
+ * @param[out] xi Future memory location for the XI2 event.
+ *
+ * @return Success or the error code.
+ */
+int
+EventToXI2(InternalEvent *ev, xEvent **xi)
+{
+    switch (ev->u.any.type)
+    {
+        case ET_Motion:
+        case ET_ButtonPress:
+        case ET_ButtonRelease:
+        case ET_KeyPress:
+        case ET_KeyRelease:
+            return eventToDeviceEvent((DeviceEvent*)ev, xi);
+        case ET_ProximityIn:
+        case ET_ProximityOut:
+            *xi = NULL;
+            return Success;
+    }
+
+    ErrorF("[dix] EventToXI2: Not implemented for %d \n", ev->u.any.type);
+    return BadImplementation;
+}
+
 static int
 eventToKeyButtonPointer(DeviceEvent *ev, xEvent **xi, int *count)
 {
@@ -287,6 +323,91 @@ eventToClassesChanged(DeviceChangedEvent *ev, xEvent **xi, int *count)
     return Success;
 }
 
+static int count_bits(unsigned char* ptr, int len)
+{
+    int bits = 0;
+    unsigned int i;
+    unsigned char x;
+
+    for (i = 0; i < len; i++)
+    {
+        x = ptr[i];
+        while(x > 0)
+        {
+            bits += (x & 0x1);
+            x >>= 1;
+        }
+    }
+    return bits;
+}
+
+static int
+eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
+{
+    int len = sizeof(xXIDeviceEvent);
+    xXIDeviceEvent *xde;
+    int i, btlen, vallen;
+    char *ptr;
+    int32_t *axisval;
+
+
+    /* FIXME: this should just send the buttons we have, not MAX_BUTTONs. Same
+     * with MAX_VALUATORS below */
+    /* btlen is in 4 byte units */
+    btlen = (((MAX_BUTTONS + 7)/8) + 3)/4;
+    len += btlen * 4; /* buttonmask len */
+
+
+    vallen = count_bits(ev->valuators.mask, sizeof(ev->valuators.mask)/sizeof(ev->valuators.mask[0]));
+    len += vallen * 2 * sizeof(uint32_t); /* axisvalues */
+    vallen = (((MAX_VALUATORS + 7)/8) + 3)/4;
+    len += vallen * 4; /* valuators mask */
+
+    *xi = xcalloc(1, len);
+    xde = (xXIDeviceEvent*)*xi;
+    xde->type           = GenericEvent;
+    xde->extension      = IReqCode;
+    xde->evtype         = GetXI2Type((InternalEvent*)ev);
+    xde->time           = ev->time;
+    xde->length         = (len - sizeof(xEvent) + 3)/4;
+    xde->detail         = ev->detail.button;
+    xde->root           = ev->root;
+    xde->buttons_len    = btlen;
+    xde->valuators_len  = vallen;
+    xde->deviceid       = ev->deviceid;
+    xde->sourceid       = ev->sourceid;
+
+    xde->mods.base_mods         = ev->mods.base;
+    xde->mods.latched_mods      = ev->mods.latched;
+    xde->mods.locked_mods       = ev->mods.locked;
+
+    xde->group.base_group       = ev->group.base;
+    xde->group.latched_group    = ev->group.latched;
+    xde->group.locked_group     = ev->group.locked;
+
+    ptr = (char*)&xde[1];
+    for (i = 0; i < sizeof(ev->buttons) * 8; i++)
+    {
+        if (BitIsOn(ev->buttons, i))
+            SetBit(ptr, i);
+    }
+
+    ptr += xde->buttons_len * 4;
+    axisval = (int32_t*)(ptr + xde->valuators_len * 4);
+    for (i = 0; i < sizeof(ev->valuators.mask) * 8; i++)
+    {
+        if (BitIsOn(ev->valuators.mask, i))
+        {
+            SetBit(ptr, i);
+            *axisval = ev->valuators.data[i];
+            axisval++;
+            axisval++; /* FIXME: this should be the frac. part */
+        }
+    }
+
+    return Success;
+}
+
 /**
  * Return the corresponding core type for the given event or 0 if no core
  * equivalent exists.
@@ -327,3 +448,28 @@ GetXIType(InternalEvent *event)
     return xitype;
 }
 
+/**
+ * Return the corresponding XI 2.x type for the given event or 0 if no
+ * equivalent exists.
+ */
+int
+GetXI2Type(InternalEvent *event)
+{
+    int xi2type = 0;
+
+    switch(event->u.any.type)
+    {
+        case ET_Motion:         xi2type = XI_Motion;           break;
+        case ET_ButtonPress:    xi2type = XI_ButtonPress;      break;
+        case ET_ButtonRelease:  xi2type = XI_ButtonRelease;    break;
+        case ET_KeyPress:       xi2type = XI_KeyPress;         break;
+        case ET_KeyRelease:     xi2type = XI_KeyRelease;       break;
+        case ET_Enter:          xi2type = XI_Enter;            break;
+        case ET_Leave:          xi2type = XI_Leave;            break;
+        case ET_Hierarchy:      xi2type = XI_HierarchyChanged; break;
+        case ET_DeviceChanged:  xi2type = XI_DeviceChanged;    break;
+        default:
+            break;
+    }
+    return xi2type;
+}
diff --git a/include/eventconvert.h b/include/eventconvert.h
index 1ff6495..f458af7 100644
--- a/include/eventconvert.h
+++ b/include/eventconvert.h
@@ -30,7 +30,9 @@
 
 _X_INTERNAL int EventToCore(InternalEvent *event, xEvent *core);
 _X_INTERNAL int EventToXI(InternalEvent *ev, xEvent **xi, int *count);
+_X_INTERNAL int EventToXI2(InternalEvent *ev, xEvent **xi);
 _X_INTERNAL int GetCoreType(InternalEvent* ev);
 _X_INTERNAL int GetXIType(InternalEvent* ev);
+_X_INTERNAL int GetXI2Type(InternalEvent* ev);
 
 #endif /* _EVENTCONVERT_H_ */
commit dfa2e8e966b699f9d292628119d5a9cbd2dbdf5a
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Feb 23 15:12:32 2009 +1000

    Xi: add XIQueryDevice request handling.

diff --git a/Xi/Makefile.am b/Xi/Makefile.am
index 316fd29..10521fd 100644
--- a/Xi/Makefile.am
+++ b/Xi/Makefile.am
@@ -60,6 +60,8 @@ libXi_la_SOURCES =	\
 	listdev.h \
 	opendev.c \
 	opendev.h \
+	querydev.c \
+	querydev.h \
 	queryversion.h \
 	queryversion.c \
 	querydp.c \
diff --git a/Xi/extinit.c b/Xi/extinit.c
index 988ed0b..9acbdfe 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -104,6 +104,7 @@ SOFTWARE.
 #include "opendev.h"
 #include "querydp.h"
 #include "queryst.h"
+#include "querydev.h"
 #include "queryversion.h"
 #include "selectev.h"
 #include "sendexev.h"
@@ -237,7 +238,8 @@ static int (*ProcIVector[])(ClientPtr) = {
         ProcXISetClientPointer,                 /* 44 */
         ProcXIGetClientPointer,                 /* 45 */
         ProcXiSelectEvent,                      /* 46 */
-        ProcXIQueryVersion                      /* 47 */
+        ProcXIQueryVersion,                     /* 47 */
+        ProcXIQueryDevice                       /* 48 */
 };
 
 /* For swapped clients */
@@ -289,7 +291,8 @@ static int (*SProcIVector[])(ClientPtr) = {
         SProcXISetClientPointer,                 /* 44 */
         SProcXIGetClientPointer,                 /* 45 */
         SProcXiSelectEvent,                      /* 46 */
-        SProcXIQueryVersion                      /* 47 */
+        SProcXIQueryVersion,                     /* 47 */
+        SProcXIQueryDevice                       /* 48 */
 };
 
 /*****************************************************************
@@ -480,6 +483,8 @@ SReplyIDispatch(ClientPtr client, int len, xGrabDeviceReply * rep)
 				(xXIQueryDevicePointerReply *) rep);
     else if (rep->RepType == X_XIGetClientPointer)
         SRepXIGetClientPointer(client, len, (xXIGetClientPointerReply*) rep);
+    else if (rep->RepType == X_XIQueryDevice)
+        SRepXIQueryDevice(client, len, (xXIQueryDeviceReply*)rep);
     else {
 	FatalError("XINPUT confused sending swapped reply");
     }
diff --git a/Xi/querydev.c b/Xi/querydev.c
new file mode 100644
index 0000000..0d90fa9
--- /dev/null
+++ b/Xi/querydev.c
@@ -0,0 +1,443 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Peter Hutterer
+ *
+ */
+
+/**
+ * @file Protocol handling for the XIQueryDevice request/reply.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "inputstr.h"
+#include <X11/X.h>
+#include <X11/extensions/XI2proto.h>
+#include "xkbstr.h"
+#include "xkbsrv.h"
+#include "xserver-properties.h"
+#include "exevents.h"
+
+#include "querydev.h"
+
+static int ListDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info);
+static int SizeDeviceInfo(DeviceIntPtr dev);
+static void SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info);
+int
+SProcXIQueryDevice(ClientPtr client)
+{
+    char n;
+
+    REQUEST(xXIQueryDeviceReq);
+
+    swaps(&stuff->length, n);
+    swaps(&stuff->deviceid, n);
+
+    return ProcXIQueryDevice(client);
+}
+
+int
+ProcXIQueryDevice(ClientPtr client)
+{
+    xXIQueryDeviceReply rep;
+    DeviceIntPtr dev = NULL;
+    int rc = Success;
+    int len = 0;
+    char *info, *ptr;
+
+    REQUEST(xXIQueryDeviceReq);
+    REQUEST_SIZE_MATCH(xXIQueryDeviceReq);
+
+    if (stuff->deviceid != AllDevices && stuff->deviceid != AllMasterDevices)
+    {
+        rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
+        if (rc != Success)
+        {
+            client->errorValue = stuff->deviceid;
+            return rc;
+        }
+    }
+
+    if (dev)
+        len += SizeDeviceInfo(dev);
+    else
+    {
+        len = 0;
+        for (dev = inputInfo.devices; dev; dev = dev->next)
+        {
+            if (stuff->deviceid == AllDevices ||
+                (stuff->deviceid == AllMasterDevices && dev->isMaster))
+                len += SizeDeviceInfo(dev);
+        }
+
+        for (dev = inputInfo.off_devices; dev; dev = dev->next)
+        {
+            if (stuff->deviceid == AllDevices ||
+                (stuff->deviceid == AllMasterDevices && dev->isMaster))
+                len += SizeDeviceInfo(dev);
+        }
+
+        dev = NULL;
+    }
+
+    info = xcalloc(1, len);
+    if (!info)
+        return BadAlloc;
+
+    memset(&rep, 0, sizeof(xXIQueryDeviceReply));
+    rep.repType = X_Reply;
+    rep.RepType = X_XIQueryDevice;
+    rep.sequenceNumber = client->sequence;
+    rep.length = len/4;
+    rep.num_devices = 0;
+
+    ptr = info;
+    if (dev)
+    {
+        len = ListDeviceInfo(dev, (xXIDeviceInfo*)info);
+        if (client->swapped)
+            SwapDeviceInfo(dev, (xXIDeviceInfo*)info);
+        info += len;
+        rep.num_devices = 1;
+    } else
+    {
+        for (dev = inputInfo.devices; dev; dev = dev->next)
+        {
+            if (stuff->deviceid == AllDevices ||
+                    (stuff->deviceid == AllMasterDevices && dev->isMaster))
+            {
+                len = ListDeviceInfo(dev, (xXIDeviceInfo*)info);
+                if (client->swapped)
+                    SwapDeviceInfo(dev, (xXIDeviceInfo*)info);
+                info += len;
+                rep.num_devices++;
+            }
+        }
+
+        for (dev = inputInfo.off_devices; dev; dev = dev->next)
+        {
+            if (stuff->deviceid == AllDevices ||
+                    (stuff->deviceid == AllMasterDevices && dev->isMaster))
+            {
+                len = ListDeviceInfo(dev, (xXIDeviceInfo*)info);
+                if (client->swapped)
+                    SwapDeviceInfo(dev, (xXIDeviceInfo*)info);
+                info += len;
+                rep.num_devices++;
+            }
+        }
+    }
+
+    WriteReplyToClient(client, sizeof(xXIQueryDeviceReply), &rep);
+    WriteToClient(client, rep.length * 4, ptr);
+    return rc;
+}
+
+void
+SRepXIQueryDevice(ClientPtr client, int size, xXIQueryDeviceReply *rep)
+{
+    char n;
+
+    swaps(&rep->sequenceNumber, n);
+    swapl(&rep->length, n);
+    swaps(&rep->num_devices, n);
+
+    /* Device info is already swapped, see ProcXIQueryDevice */
+
+    WriteToClient(client, size, (char *)rep);
+}
+
+
+
+/**
+ * @return The number of bytes needed to store this device's xXIDeviceInfo
+ * (and its classes).
+ */
+static int
+SizeDeviceInfo(DeviceIntPtr dev)
+{
+    int len = sizeof(xXIDeviceInfo);
+
+    /* 4-padded name */
+    len += (((strlen(dev->name) + 3)/4)*4);
+
+    return len + SizeDeviceClasses(dev);
+
+}
+
+/*
+ * @return The number of bytes needed to store this device's classes.
+ */
+int
+SizeDeviceClasses(DeviceIntPtr dev)
+{
+    int len = 0;
+
+    if (dev->button)
+    {
+        len += sizeof(xXIButtonInfo);
+        len += dev->button->numButtons * sizeof(Atom);
+    }
+
+    if (dev->key)
+    {
+        XkbDescPtr xkb = dev->key->xkbInfo->desc;
+        len += sizeof(xXIKeyInfo);
+        len += (xkb->max_key_code - xkb->min_key_code + 1) * sizeof(uint32_t);
+    }
+
+    if (dev->valuator)
+        len += sizeof(xXIValuatorInfo) * dev->valuator->numAxes;
+
+    return len;
+}
+
+
+/**
+ * Write button information into info.
+ * @return Number of bytes written into info.
+ */
+static int
+ListButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info)
+{
+    info->type = ButtonClass;
+    info->num_buttons = dev->button->numButtons;
+    info->length = 2 + info->num_buttons;
+
+    /** XXX: button labels */
+
+    return info->length * 4;
+}
+
+static void
+SwapButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info)
+{
+    char n;
+    Atom *btn;
+    int i;
+    swaps(&info->type, n);
+    swaps(&info->length, n);
+
+    for (i = 0, btn = (Atom*)&info[1]; i < info->num_buttons; i++, btn++)
+        swaps(btn, n);
+
+    swaps(&info->num_buttons, n);
+}
+
+/**
+ * Write key information into info.
+ * @return Number of bytes written into info.
+ */
+static int
+ListKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info)
+{
+    int i;
+    XkbDescPtr xkb = dev->key->xkbInfo->desc;
+    uint32_t *kc;
+
+    info->type = KeyClass;
+    info->num_keycodes = xkb->max_key_code - xkb->min_key_code + 1;
+    info->length = 2 + info->num_keycodes;
+
+    kc = (uint32_t*)&info[1];
+    for (i = xkb->min_key_code; i <= xkb->max_key_code; i++, kc++)
+        *kc = i;
+
+    return info->length * 4;
+}
+
+static void
+SwapKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info)
+{
+    char n;
+    uint32_t *key;
+    int i;
+    swaps(&info->type, n);
+    swaps(&info->length, n);
+
+    for (i = 0, key = (uint32_t*)&info[1]; i < info->num_keycodes; i++, key++)
+        swaps(key, n);
+
+    swaps(&info->num_keycodes, n);
+}
+
+/**
+ * List axis information for the given axis.
+ *
+ * @return The number of bytes written into info.
+ */
+static int
+ListValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info, int axisnumber)
+{
+    ValuatorClassPtr v = dev->valuator;
+
+    info->type = ValuatorClass;
+    info->length = sizeof(xXIValuatorInfo)/4;
+    info->name = XIGetKnownProperty(AXIS_LABEL_PROP_REL_MISC); /* XXX */
+    info->min.integral = v->axes[axisnumber].min_value;
+    info->min.frac = 0;
+    info->max.integral = v->axes[axisnumber].max_value;
+    info->max.frac = 0;
+    info->resolution = v->axes[axisnumber].resolution;
+    info->number = axisnumber;
+    info->mode = v->mode; /* Server doesn't have per-axis mode yet */
+
+    return info->length * 4;
+}
+
+static void
+SwapValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info)
+{
+    char n;
+    swaps(&info->type, n);
+    swaps(&info->length, n);
+    swapl(&info->name, n);
+    swapl(&info->min.integral, n);
+    swapl(&info->min.frac, n);
+    swapl(&info->max.integral, n);
+    swapl(&info->max.frac, n);
+    swaps(&info->number, n);
+}
+
+int GetDeviceUse(DeviceIntPtr dev, uint16_t *attachment)
+{
+    DeviceIntPtr master = dev->u.master;
+    int use;
+
+    if (dev->isMaster)
+    {
+        DeviceIntPtr paired = GetPairedDevice(dev);
+        use = IsPointerDevice(dev) ? MasterPointer : MasterKeyboard;
+        *attachment = (paired ? paired->id : 0);
+    } else if (master)
+    {
+        use = IsPointerDevice(master) ? SlavePointer : SlaveKeyboard;
+        *attachment = master->id;
+    } else
+        use = FloatingSlave;
+
+    return use;
+}
+
+/**
+ * Write the info for device dev into the buffer pointed to by info.
+ *
+ * @return The number of bytes used.
+ */
+static int
+ListDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info)
+{
+    char *any = (char*)&info[1];
+    int len = 0, total_len = 0;
+
+    info->deviceid = dev->id;
+    info->use = GetDeviceUse(dev, &info->attachment);
+    info->num_classes = 0;
+    info->name_len = strlen(dev->name);
+    info->enabled = dev->enabled;
+    total_len = sizeof(xXIDeviceInfo);
+
+    strncpy(any, dev->name, info->name_len);
+    len = ((info->name_len + 3)/4) * 4;
+    any += len;
+    total_len += len;
+
+    return total_len + ListDeviceClasses(dev, any, &info->num_classes);
+}
+
+/**
+ * Write the class info of the device into the memory pointed to by any, set
+ * nclasses to the number of classes in total and return the number of bytes
+ * written.
+ */
+int
+ListDeviceClasses(DeviceIntPtr dev, char *any, uint16_t *nclasses)
+{
+    int total_len = 0;
+    int len;
+    int i;
+
+    if (dev->button)
+    {
+        (*nclasses)++;
+        len = ListButtonInfo(dev, (xXIButtonInfo*)any);
+        any += len;
+        total_len += len;
+    }
+
+    if (dev->key)
+    {
+        (*nclasses)++;
+        len = ListKeyInfo(dev, (xXIKeyInfo*)any);
+        any += len;
+        total_len += len;
+    }
+
+    for (i = 0; dev->valuator && i < dev->valuator->numAxes; i++)
+    {
+        (*nclasses)++;
+        len = ListValuatorInfo(dev, (xXIValuatorInfo*)any, i);
+        any += len;
+        total_len += len;
+    }
+
+    return total_len;
+}
+
+static void
+SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info)
+{
+    char n;
+    char *any = (char*)&info[1];
+    int i;
+
+    /* Skip over name */
+    any += (((info->name_len + 3)/4) * 4);
+
+    for (i = 0; i < info->num_classes; i++)
+    {
+        switch(((xXIAnyInfo*)any)->type)
+        {
+            case ButtonClass:
+                SwapButtonInfo(dev, (xXIButtonInfo*)any);
+                break;
+            case KeyClass:
+                SwapKeyInfo(dev, (xXIKeyInfo*)any);
+                break;
+            case ValuatorClass:
+                SwapValuatorInfo(dev, (xXIValuatorInfo*)any);
+                break;
+        }
+
+        any += (((xXIAnyInfo*)any)->length * 4);
+    }
+
+    swaps(&info->deviceid, n);
+    swaps(&info->use, n);
+    swaps(&info->attachment, n);
+    swaps(&info->num_classes, n);
+    swaps(&info->name_len, n);
+
+}
diff --git a/Xi/querydev.h b/Xi/querydev.h
new file mode 100644
index 0000000..92ab2bd
--- /dev/null
+++ b/Xi/querydev.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Peter Hutterer
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifndef QUERYDEV_H
+#define QUERYDEV_H 1
+
+#include <X11/extensions/XI2proto.h>
+
+int SProcXIQueryDevice(ClientPtr client);
+int ProcXIQueryDevice(ClientPtr client);
+void SRepXIQueryDevice(ClientPtr client, int size, xXIQueryDeviceReply *rep);
+int SizeDeviceClasses(DeviceIntPtr dev);
+int ListDeviceClasses(DeviceIntPtr dev, char* any, uint16_t* nclasses);
+int GetDeviceUse(DeviceIntPtr dev, uint16_t *attachment);
+#endif /* QUERYDEV_H */
diff --git a/dix/devices.c b/dix/devices.c
index 97b47bc..ca0da07 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -78,7 +78,7 @@ SOFTWARE.
 #include <X11/extensions/XIproto.h>
 #include "exglobals.h"
 #include "exevents.h"
-#include "listdev.h" /* for CopySwapXXXClass */
+#include "querydev.h" /* for SizeDeviceClasses */
 #include "xiproperty.h"
 #include "enterleave.h" /* for EnterWindow() */
 #include "xserver-properties.h"
@@ -274,7 +274,6 @@ EnableDevice(DeviceIntPtr dev)
     DeviceIntPtr *prev;
     int ret;
     DeviceIntPtr other;
-    int namelen = 0; /* dummy */
     int evsize  = sizeof(xEvent);
     int listlen;
     EventListPtr evlist;
@@ -316,7 +315,7 @@ EnableDevice(DeviceIntPtr dev)
      * device
      */
 
-    SizeDeviceInfo(dev, &namelen, &evsize);
+    evsize += SizeDeviceClasses(dev);
 
     listlen = GetEventList(&evlist);
     OsBlockSignals();
commit 560c58b53e4e60ebd26e0c66dd00399c438bd619
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Feb 20 15:17:52 2009 +1000

    Xi: name-space and fix XI2 requests
    
    All XI2 requests have XI prefixes.
    Requests affected:
        ChangeDeviceCursor
        QueryDevicePointer
        WarpDevicePointer
        SetClientPointer
        GetClientPointer
        XIChangeDeviceHierarchy.

diff --git a/Xi/chdevcur.c b/Xi/chdevcur.c
index b0d3ce3..ed1570b 100644
--- a/Xi/chdevcur.c
+++ b/Xi/chdevcur.c
@@ -39,7 +39,7 @@
 #include "windowstr.h"	/* window structure  */
 #include "scrnintstr.h"	/* screen structure  */
 #include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
+#include <X11/extensions/XI2proto.h>
 #include "extnsionst.h"
 #include "exevents.h"
 #include "exglobals.h"
@@ -54,25 +54,25 @@
  */
 
 int
-SProcXChangeDeviceCursor(ClientPtr client)
+SProcXIChangeDeviceCursor(ClientPtr client)
 {
     char n;
 
-    REQUEST(xChangeDeviceCursorReq);
+    REQUEST(xXIChangeDeviceCursorReq);
     swaps(&stuff->length, n);
-    REQUEST_SIZE_MATCH(xChangeDeviceCursorReq);
-    return (ProcXChangeDeviceCursor(client));
+    REQUEST_SIZE_MATCH(xXIChangeDeviceCursorReq);
+    return (ProcXIChangeDeviceCursor(client));
 }
 
-int ProcXChangeDeviceCursor(ClientPtr client)
+int ProcXIChangeDeviceCursor(ClientPtr client)
 {
     int rc;
     WindowPtr pWin    = NULL;
     DeviceIntPtr pDev = NULL;
     CursorPtr pCursor = NULL;
 
-    REQUEST(xChangeDeviceCursorReq);
-    REQUEST_SIZE_MATCH(xChangeDeviceCursorReq);
+    REQUEST(xXIChangeDeviceCursorReq);
+    REQUEST_SIZE_MATCH(xXIChangeDeviceCursorReq);
 
     rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixSetAttrAccess);
     if (rc != Success)
diff --git a/Xi/chdevcur.h b/Xi/chdevcur.h
index e6df9eb..4f7f44b 100644
--- a/Xi/chdevcur.h
+++ b/Xi/chdevcur.h
@@ -30,10 +30,7 @@
 #ifndef CHDEVCUR_H
 #define CHDEVCUR_H 1
 
-int SProcXChangeDeviceCursor(ClientPtr	/* client */
-    );
-
-int ProcXChangeDeviceCursor(ClientPtr	/* client */
-    );
+int SProcXIChangeDeviceCursor(ClientPtr	/* client */);
+int ProcXIChangeDeviceCursor(ClientPtr	/* client */);
 
 #endif /* CHDEVCUR_H */
diff --git a/Xi/chdevhier.c b/Xi/chdevhier.c
index 9a85829..3df9c87 100644
--- a/Xi/chdevhier.c
+++ b/Xi/chdevhier.c
@@ -40,7 +40,7 @@
 #include "windowstr.h"	/* window structure  */
 #include "scrnintstr.h"	/* screen structure  */
 #include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
+#include <X11/extensions/XI2proto.h>
 #include <X11/extensions/geproto.h>
 #include "extnsionst.h"
 #include "exevents.h"
@@ -60,33 +60,33 @@
  *
  */
 
-int SProcXChangeDeviceHierarchy(ClientPtr client)
+int SProcXIChangeDeviceHierarchy(ClientPtr client)
 {
     char n;
 
-    REQUEST(xChangeDeviceHierarchyReq);
+    REQUEST(xXIChangeDeviceHierarchyReq);
     swaps(&stuff->length, n);
-    return (ProcXChangeDeviceHierarchy(client));
+    return (ProcXIChangeDeviceHierarchy(client));
 }
 
 #define SWAPIF(cmd) if (client->swapped) { cmd; }
 
 int
-ProcXChangeDeviceHierarchy(ClientPtr client)
+ProcXIChangeDeviceHierarchy(ClientPtr client)
 {
     DeviceIntPtr ptr, keybd;
     DeviceIntRec dummyDev;
-    xAnyHierarchyChangeInfo *any;
-    int required_len = sizeof(xChangeDeviceHierarchyReq);
+    xXIAnyHierarchyChangeInfo *any;
+    int required_len = sizeof(xXIChangeDeviceHierarchyReq);
     char n;
     int rc = Success;
     int nchanges = 0;
-    deviceHierarchyChangedEvent ev;
+    xXIDeviceHierarchyEvent ev;
 
-    REQUEST(xChangeDeviceHierarchyReq);
-    REQUEST_AT_LEAST_SIZE(xChangeDeviceHierarchyReq);
+    REQUEST(xXIChangeDeviceHierarchyReq);
+    REQUEST_AT_LEAST_SIZE(xXIChangeDeviceHierarchyReq);
 
-    any = (xAnyHierarchyChangeInfo*)&stuff[1];
+    any = (xXIAnyHierarchyChangeInfo*)&stuff[1];
     while(stuff->num_changes--)
     {
         SWAPIF(swapl(&any->type, n));
@@ -100,12 +100,12 @@ ProcXChangeDeviceHierarchy(ClientPtr client)
         {
             case CH_CreateMasterDevice:
                 {
-                    xCreateMasterInfo* c = (xCreateMasterInfo*)any;
+                    xXICreateMasterInfo* c = (xXICreateMasterInfo*)any;
                     char* name;
 
-                    SWAPIF(swaps(&c->namelen, n));
-                    name = xcalloc(c->namelen + 1, sizeof(char));
-                    strncpy(name, (char*)&c[1], c->namelen);
+                    SWAPIF(swaps(&c->name_len, n));
+                    name = xcalloc(c->name_len + 1, sizeof(char));
+                    strncpy(name, (char*)&c[1], c->name_len);
 
 
                     rc = AllocMasterDevice(client, name, &ptr, &keybd);
@@ -115,7 +115,7 @@ ProcXChangeDeviceHierarchy(ClientPtr client)
                         goto unwind;
                     }
 
-                    if (!c->sendCore)
+                    if (!c->send_core)
                         ptr->coreEvents = keybd->coreEvents =  FALSE;
 
                     ActivateDevice(ptr);
@@ -132,10 +132,10 @@ ProcXChangeDeviceHierarchy(ClientPtr client)
                 break;
             case CH_RemoveMasterDevice:
                 {
-                    xRemoveMasterInfo* r = (xRemoveMasterInfo*)any;
+                    xXIRemoveMasterInfo* r = (xXIRemoveMasterInfo*)any;
 
-                    if (r->returnMode != AttachToMaster &&
-                            r->returnMode != Floating)
+                    if (r->return_mode != AttachToMaster &&
+                            r->return_mode != Floating)
                         return BadValue;
 
                     rc = dixLookupDevice(&ptr, r->deviceid, client,
@@ -182,32 +182,32 @@ ProcXChangeDeviceHierarchy(ClientPtr client)
 
                     /* Disabling sends the devices floating, reattach them if
                      * desired. */
-                    if (r->returnMode == AttachToMaster)
+                    if (r->return_mode == AttachToMaster)
                     {
                         DeviceIntPtr attached,
                                      newptr,
                                      newkeybd;
 
-                        rc = dixLookupDevice(&newptr, r->returnPointer,
+                        rc = dixLookupDevice(&newptr, r->return_pointer,
                                              client, DixWriteAccess);
                         if (rc != Success)
                             goto unwind;
 
                         if (!newptr->isMaster)
                         {
-                            client->errorValue = r->returnPointer;
+                            client->errorValue = r->return_pointer;
                             rc = BadDevice;
                             goto unwind;
                         }
 
-                        rc = dixLookupDevice(&newkeybd, r->returnKeyboard,
+                        rc = dixLookupDevice(&newkeybd, r->return_keyboard,
                                              client, DixWriteAccess);
                         if (rc != Success)
                             goto unwind;
 
                         if (!newkeybd->isMaster)
                         {
-                            client->errorValue = r->returnKeyboard;
+                            client->errorValue = r->return_keyboard;
                             rc = BadDevice;
                             goto unwind;
                         }
@@ -236,9 +236,9 @@ ProcXChangeDeviceHierarchy(ClientPtr client)
                     nchanges++;
                 }
                 break;
-            case CH_ChangeAttachment:
+            case CH_DetachSlave:
                 {
-                    xChangeAttachmentInfo* c = (xChangeAttachmentInfo*)any;
+                    xXIDetachSlaveInfo* c = (xXIDetachSlaveInfo*)any;
 
                     rc = dixLookupDevice(&ptr, c->deviceid, client,
                                           DixWriteAccess);
@@ -252,38 +252,53 @@ ProcXChangeDeviceHierarchy(ClientPtr client)
                         goto unwind;
                     }
 
-                    if (c->changeMode == Floating)
-                        AttachDevice(client, ptr, NULL);
-                    else
+                    AttachDevice(client, ptr, NULL);
+                    nchanges++;
+                }
+                break;
+            case CH_AttachSlave:
+                {
+                    xXIAttachSlaveInfo* c = (xXIAttachSlaveInfo*)any;
+                    DeviceIntPtr newmaster;
+
+                    rc = dixLookupDevice(&ptr, c->deviceid, client,
+                                          DixWriteAccess);
+                    if (rc != Success)
+                       goto unwind;
+
+                    if (ptr->isMaster)
                     {
-                        DeviceIntPtr newmaster;
-                        rc = dixLookupDevice(&newmaster, c->newMaster,
-                                             client, DixWriteAccess);
-                        if (rc != Success)
-                            goto unwind;
-                        if (!newmaster->isMaster)
-                        {
-                            client->errorValue = c->newMaster;
-                            rc = BadDevice;
-                            goto unwind;
-                        }
+                        client->errorValue = c->deviceid;
+                        rc = BadDevice;
+                        goto unwind;
+                    }
+
+                    rc = dixLookupDevice(&newmaster, c->new_master,
+                            client, DixWriteAccess);
+                    if (rc != Success)
+                        goto unwind;
+                    if (!newmaster->isMaster)
+                    {
+                        client->errorValue = c->new_master;
+                        rc = BadDevice;
+                        goto unwind;
+                    }
 
-                        if (!((IsPointerDevice(newmaster) &&
+                    if (!((IsPointerDevice(newmaster) &&
                                     IsPointerDevice(ptr)) ||
                                 (IsKeyboardDevice(newmaster) &&
                                  IsKeyboardDevice(ptr))))
-                        {
-                            rc = BadDevice;
-                            goto unwind;
-                        }
-                        AttachDevice(client, ptr, newmaster);
+                    {
+                        rc = BadDevice;
+                        goto unwind;
                     }
+                    AttachDevice(client, ptr, newmaster);
                     nchanges++;
                 }
                 break;
         }
 
-        any = (xAnyHierarchyChangeInfo*)((char*)any + any->length);
+        any = (xXIAnyHierarchyChangeInfo*)((char*)any + any->length * 4);
     }
 
 unwind:
@@ -294,7 +309,7 @@ unwind:
         ev.type = GenericEvent;
         ev.extension = IReqCode;
         ev.length = 0;
-        ev.evtype = XI_DeviceHierarchyChangedNotify;
+        ev.evtype = XI_HierarchyChanged;
         ev.time = GetTimeInMillis();
 
         SendEventToAllWindows(&dummyDev, XI_DeviceHierarchyChangedMask,
diff --git a/Xi/chdevhier.h b/Xi/chdevhier.h
index 07afd53..4190538 100644
--- a/Xi/chdevhier.h
+++ b/Xi/chdevhier.h
@@ -36,7 +36,7 @@
 #ifndef CHDEVHIER_H
 #define CHDEVHIER_H 1
 
-int SProcXChangeDeviceHierarchy(ClientPtr /* client */);
-int ProcXChangeDeviceHierarchy(ClientPtr /* client */);
+int SProcXIChangeDeviceHierarchy(ClientPtr /* client */);
+int ProcXIChangeDeviceHierarchy(ClientPtr /* client */);
 
 #endif
diff --git a/Xi/extinit.c b/Xi/extinit.c
index e083184..988ed0b 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -61,6 +61,7 @@ SOFTWARE.
 #include "extnsionst.h"	/* extension entry   */
 #include <X11/extensions/XI.h>
 #include <X11/extensions/XIproto.h>
+#include <X11/extensions/XI2proto.h>
 #include <X11/extensions/geproto.h>
 #include "geext.h" /* extension interfaces for ge */
 
@@ -229,12 +230,12 @@ static int (*ProcIVector[])(ClientPtr) = {
         ProcXDeleteDeviceProperty,              /* 38 */
         ProcXGetDeviceProperty,                 /* 39 */
         /* XI 2 */
-        ProcXQueryDevicePointer,                /* 40 */
-        ProcXWarpDevicePointer,                 /* 41 */
-        ProcXChangeDeviceCursor,                /* 42 */
-        ProcXChangeDeviceHierarchy,             /* 43 */
-        ProcXSetClientPointer,                  /* 44 */
-        ProcXGetClientPointer,                  /* 45 */
+        ProcXIQueryDevicePointer,               /* 40 */
+        ProcXIWarpDevicePointer,                /* 41 */
+        ProcXIChangeDeviceCursor,               /* 42 */
+        ProcXIChangeDeviceHierarchy,            /* 43 */
+        ProcXISetClientPointer,                 /* 44 */
+        ProcXIGetClientPointer,                 /* 45 */
         ProcXiSelectEvent,                      /* 46 */
         ProcXIQueryVersion                      /* 47 */
 };
@@ -281,12 +282,12 @@ static int (*SProcIVector[])(ClientPtr) = {
         SProcXChangeDeviceProperty,              /* 37 */
         SProcXDeleteDeviceProperty,              /* 38 */
         SProcXGetDeviceProperty,                 /* 39 */
-        SProcXQueryDevicePointer,                /* 40 */
-        SProcXWarpDevicePointer,                 /* 41 */
-        SProcXChangeDeviceCursor,                /* 42 */
-        SProcXChangeDeviceHierarchy,             /* 43 */
-        SProcXSetClientPointer,                  /* 44 */
-        SProcXGetClientPointer,                  /* 45 */
+        SProcXIQueryDevicePointer,               /* 40 */
+        SProcXIWarpDevicePointer,                /* 41 */
+        SProcXIChangeDeviceCursor,               /* 42 */
+        SProcXIChangeDeviceHierarchy,            /* 43 */
+        SProcXISetClientPointer,                 /* 44 */
+        SProcXIGetClientPointer,                 /* 45 */
         SProcXiSelectEvent,                      /* 46 */
         SProcXIQueryVersion                      /* 47 */
 };
@@ -474,11 +475,11 @@ SReplyIDispatch(ClientPtr client, int len, xGrabDeviceReply * rep)
         SRepXListDeviceProperties(client, len, (xListDevicePropertiesReply*)rep);
     else if (rep->RepType == X_GetDeviceProperty)
 	SRepXGetDeviceProperty(client, len, (xGetDevicePropertyReply *) rep);
-    else if (rep->RepType == X_QueryDevicePointer)
-	SRepXQueryDevicePointer(client, len,
-				(xQueryDevicePointerReply *) rep);
-    else if (rep->RepType == X_GetClientPointer)
-        SRepXGetClientPointer(client, len, (xGetClientPointerReply*) rep);
+    else if (rep->RepType == X_XIQueryDevicePointer)
+	SRepXIQueryDevicePointer(client, len,
+				(xXIQueryDevicePointerReply *) rep);
+    else if (rep->RepType == X_XIGetClientPointer)
+        SRepXIGetClientPointer(client, len, (xXIGetClientPointerReply*) rep);
     else {
 	FatalError("XINPUT confused sending swapped reply");
     }
diff --git a/Xi/getcptr.c b/Xi/getcptr.c
index c696afe..5c69942 100644
--- a/Xi/getcptr.c
+++ b/Xi/getcptr.c
@@ -33,7 +33,7 @@
 #include "windowstr.h"	/* window structure  */
 #include "scrnintstr.h"	/* screen structure  */
 #include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
+#include <X11/extensions/XI2proto.h>
 #include "extnsionst.h"
 #include "extinit.h"	/* LookupDeviceIntRec */
 #include "exevents.h"
@@ -47,29 +47,29 @@
  */
 
 int
-SProcXGetClientPointer(ClientPtr client)
+SProcXIGetClientPointer(ClientPtr client)
 {
     char n;
-    REQUEST(xGetClientPointerReq);
+    REQUEST(xXIGetClientPointerReq);
 
     swaps(&stuff->length, n);
     swapl(&stuff->win, n);
-    return ProcXGetClientPointer(client);
+    return ProcXIGetClientPointer(client);
 }
 
-int ProcXGetClientPointer(ClientPtr client)
+int ProcXIGetClientPointer(ClientPtr client)
 {
     int err;
     WindowPtr win;
     ClientPtr winclient;
-    xGetClientPointerReply rep;
-    REQUEST(xGetClientPointerReq);
-    REQUEST_SIZE_MATCH(xGetClientPointerReq);
+    xXIGetClientPointerReply rep;
+    REQUEST(xXIGetClientPointerReq);
+    REQUEST_SIZE_MATCH(xXIGetClientPointerReq);
 
     err = dixLookupWindow(&win, stuff->win, client, DixReadAccess);
     if (err != Success)
     {
-        SendErrorToClient(client, IReqCode, X_GetClientPointer,
+        SendErrorToClient(client, IReqCode, X_XIGetClientPointer,
                 stuff->win, err);
         return Success;
     }
@@ -77,13 +77,13 @@ int ProcXGetClientPointer(ClientPtr client)
     winclient = wClient(win);
 
     rep.repType = X_Reply;
-    rep.RepType = X_GetClientPointer;
+    rep.RepType = X_XIGetClientPointer;
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
     rep.set = (winclient->clientPtr != NULL);
     rep.deviceid = (winclient->clientPtr) ? winclient->clientPtr->id : 0;
 
-    WriteReplyToClient(client, sizeof(xGetClientPointerReply), &rep);
+    WriteReplyToClient(client, sizeof(xXIGetClientPointerReply), &rep);
     return Success;
 }
 
@@ -95,8 +95,8 @@ int ProcXGetClientPointer(ClientPtr client)
  */
 
 void
-SRepXGetClientPointer(ClientPtr client, int size,
-        xGetClientPointerReply* rep)
+SRepXIGetClientPointer(ClientPtr client, int size,
+        xXIGetClientPointerReply* rep)
 {
     char n;
     swaps(&rep->sequenceNumber, n);
diff --git a/Xi/getcptr.h b/Xi/getcptr.h
index 2745833..1539aa8 100644
--- a/Xi/getcptr.h
+++ b/Xi/getcptr.h
@@ -29,15 +29,10 @@
 
 #ifndef GETCPTR_H
 #define GETCPTR_H 1
-int SProcXGetClientPointer(ClientPtr /* client */
-        );
-
-int ProcXGetClientPointer(ClientPtr /* client */
-        );
-
-void SRepXGetClientPointer(ClientPtr /* client */,
+int SProcXIGetClientPointer(ClientPtr /* client */);
+int ProcXIGetClientPointer(ClientPtr /* client */);
+void SRepXIGetClientPointer(ClientPtr /* client */,
         int /* size */,
-        xGetClientPointerReply* /* rep */
-        );
+        xXIGetClientPointerReply* /* rep */);
 
 #endif /* GETCPTR_H */
diff --git a/Xi/querydp.c b/Xi/querydp.c
index ab59e66..5be0cea 100644
--- a/Xi/querydp.c
+++ b/Xi/querydp.c
@@ -38,7 +38,7 @@
 #include "inputstr.h"	/* DeviceIntPtr      */
 #include "windowstr.h"	/* window structure  */
 #include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
+#include <X11/extensions/XI2proto.h>
 #include "extnsionst.h"
 #include "exevents.h"
 #include "exglobals.h"
@@ -57,26 +57,26 @@
  */
 
 int
-SProcXQueryDevicePointer(ClientPtr client)
+SProcXIQueryDevicePointer(ClientPtr client)
 {
     char n;
 
-    REQUEST(xQueryDevicePointerReq);
+    REQUEST(xXIQueryDevicePointerReq);
     swaps(&stuff->length, n);
-    return (ProcXQueryDevicePointer(client));
+    return (ProcXIQueryDevicePointer(client));
 }
 
 int
-ProcXQueryDevicePointer(ClientPtr client)
+ProcXIQueryDevicePointer(ClientPtr client)
 {
     int rc;
-    xQueryDevicePointerReply rep;
+    xXIQueryDevicePointerReply rep;
     DeviceIntPtr pDev, kbd;
     WindowPtr pWin, t;
     SpritePtr pSprite;
 
-    REQUEST(xQueryDevicePointerReq);
-    REQUEST_SIZE_MATCH(xQueryDevicePointerReq);
+    REQUEST(xXIQueryDevicePointerReq);
+    REQUEST_SIZE_MATCH(xXIQueryDevicePointerReq);
 
     rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixReadAccess);
     if (rc != Success)
@@ -91,7 +91,7 @@ ProcXQueryDevicePointer(ClientPtr client)
     rc = dixLookupWindow(&pWin, stuff->win, client, DixReadAccess);
     if (rc != Success)
     {
-        SendErrorToClient(client, IReqCode, X_QueryDevicePointer,
+        SendErrorToClient(client, IReqCode, X_XIQueryDevicePointer,
                 stuff->win, rc);
         return Success;
     }
@@ -103,23 +103,23 @@ ProcXQueryDevicePointer(ClientPtr client)
 
     pSprite = pDev->spriteInfo->sprite;
     rep.repType = X_Reply;
-    rep.RepType = X_QueryDevicePointer;
+    rep.RepType = X_XIQueryDevicePointer;
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
     rep.mask = pDev->button->state;
     if (kbd && kbd->key)
         rep.mask |= XkbStateFieldFromRec(&kbd->key->xkbInfo->state);
     rep.root = (GetCurrentRootWindow(pDev))->drawable.id;
-    rep.rootX = pSprite->hot.x;
-    rep.rootY = pSprite->hot.y;
+    rep.root_x.integral = pSprite->hot.x;
+    rep.root_y.integral = pSprite->hot.y;
     rep.child = None;
     rep.deviceid = pDev->id;
 
     if (pSprite->hot.pScreen == pWin->drawable.pScreen)
     {
-        rep.sameScreen = xTrue;
-        rep.winX = pSprite->hot.x - pWin->drawable.x;
-        rep.winY = pSprite->hot.y - pWin->drawable.y;
+        rep.same_screen = xTrue;
+        rep.win_x.integral = pSprite->hot.x - pWin->drawable.x;
+        rep.win_y.integral = pSprite->hot.y - pWin->drawable.y;
         for (t = pSprite->win; t; t = t->parent)
             if (t->parent == pWin)
             {
@@ -128,37 +128,37 @@ ProcXQueryDevicePointer(ClientPtr client)
             }
     } else
     {
-        rep.sameScreen = xFalse;
-        rep.winX = 0;
-        rep.winY = 0;
+        rep.same_screen = xFalse;
+        rep.win_x.integral = 0;
+        rep.win_y.integral = 0;
     }
 
 #ifdef PANORAMIX
     if(!noPanoramiXExtension) {
-        rep.rootX += panoramiXdataPtr[0].x;
-        rep.rootY += panoramiXdataPtr[0].y;
+        rep.root_x.integral += panoramiXdataPtr[0].x;
+        rep.root_y.integral += panoramiXdataPtr[0].y;
         if (stuff->win == rep.root)
         {
-            rep.winX += panoramiXdataPtr[0].x;
-            rep.winY += panoramiXdataPtr[0].y;
+            rep.win_x.integral += panoramiXdataPtr[0].x;
+            rep.win_y.integral += panoramiXdataPtr[0].y;
         }
     }
 #endif
 
-    WriteReplyToClient(client, sizeof(xQueryDevicePointerReply), &rep);
+    WriteReplyToClient(client, sizeof(xXIQueryDevicePointerReply), &rep);
     return Success;
 }
 
 /***********************************************************************
  *
- * This procedure writes the reply for the XQueryDevicePointer function,
+ * This procedure writes the reply for the XIQueryDevicePointer function,
  * if the client and server have a different byte ordering.
  *
  */
 
 void
-SRepXQueryDevicePointer(ClientPtr client, int size,
-        xQueryDevicePointerReply * rep)
+SRepXIQueryDevicePointer(ClientPtr client, int size,
+        xXIQueryDevicePointerReply * rep)
 {
     char n;
 
diff --git a/Xi/querydp.h b/Xi/querydp.h
index 5370ed4..48b6217 100644
--- a/Xi/querydp.h
+++ b/Xi/querydp.h
@@ -30,15 +30,10 @@
 #ifndef QUERYDP_H
 #define QUERYDP_H 1
 
-int SProcXQueryDevicePointer(ClientPtr	/* client */
-    );
-
-int ProcXQueryDevicePointer(ClientPtr	/* client */
-    );
-
-void SRepXQueryDevicePointer(ClientPtr /* client */ ,
+int SProcXIQueryDevicePointer(ClientPtr	/* client */);
+int ProcXIQueryDevicePointer(ClientPtr	/* client */);
+void SRepXIQueryDevicePointer(ClientPtr /* client */ ,
 			   int /* size */ ,
-			   xQueryDevicePointerReply *	/* rep */
-    );
+			   xXIQueryDevicePointerReply *	/* rep */);
 
 #endif /* QUERYDP_H */
diff --git a/Xi/setcptr.c b/Xi/setcptr.c
index 1e8281d..46b88bf 100644
--- a/Xi/setcptr.c
+++ b/Xi/setcptr.c
@@ -41,7 +41,7 @@
 #include "windowstr.h"	/* window structure  */
 #include "scrnintstr.h"	/* screen structure  */
 #include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
+#include <X11/extensions/XI2proto.h>
 #include "extnsionst.h"
 #include "exevents.h"
 #include "exglobals.h"
@@ -49,25 +49,25 @@
 #include "setcptr.h"
 
 int
-SProcXSetClientPointer(ClientPtr client)
+SProcXISetClientPointer(ClientPtr client)
 {
     char n;
 
-    REQUEST(xSetClientPointerReq);
+    REQUEST(xXISetClientPointerReq);
     swaps(&stuff->length, n);
-    REQUEST_SIZE_MATCH(xSetClientPointerReq);
-    return (ProcXSetClientPointer(client));
+    REQUEST_SIZE_MATCH(xXISetClientPointerReq);
+    return (ProcXISetClientPointer(client));
 }
 
 int
-ProcXSetClientPointer(ClientPtr client)
+ProcXISetClientPointer(ClientPtr client)
 {
     DeviceIntPtr pDev;
     ClientPtr targetClient;
     int rc;
 
-    REQUEST(xSetClientPointerReq);
-    REQUEST_SIZE_MATCH(xSetClientPointerReq);
+    REQUEST(xXISetClientPointerReq);
+    REQUEST_SIZE_MATCH(xXISetClientPointerReq);
 
 
     rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixWriteAccess);
diff --git a/Xi/setcptr.h b/Xi/setcptr.h
index df38add..5968d98 100644
--- a/Xi/setcptr.h
+++ b/Xi/setcptr.h
@@ -30,7 +30,7 @@
 #ifndef SETCPTR_H
 #define SETCPTR_H 1
 
-int SProcXSetClientPointer(ClientPtr /* client */);
-int ProcXSetClientPointer(ClientPtr /* client */);
+int SProcXISetClientPointer(ClientPtr /* client */);
+int ProcXISetClientPointer(ClientPtr /* client */);
 
 #endif /* SETCPTR_H */
diff --git a/Xi/warpdevp.c b/Xi/warpdevp.c
index b40a12c..2317c86 100644
--- a/Xi/warpdevp.c
+++ b/Xi/warpdevp.c
@@ -39,7 +39,7 @@
 #include "windowstr.h"	/* window structure  */
 #include "scrnintstr.h"	/* screen structure  */
 #include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
+#include <X11/extensions/XI2proto.h>
 #include "extnsionst.h"
 #include "exevents.h"
 #include "exglobals.h"
@@ -54,17 +54,17 @@
  */
 
 int
-SProcXWarpDevicePointer(ClientPtr client)
+SProcXIWarpDevicePointer(ClientPtr client)
 {
     char n;
 
-    REQUEST(xWarpDevicePointerReq);
+    REQUEST(xXIWarpDevicePointerReq);
     swaps(&stuff->length, n);
-    return (ProcXWarpDevicePointer(client));
+    return (ProcXIWarpDevicePointer(client));
 }
 
 int
-ProcXWarpDevicePointer(ClientPtr client)
+ProcXIWarpDevicePointer(ClientPtr client)
 {
     int rc;
     int x, y;
@@ -73,8 +73,8 @@ ProcXWarpDevicePointer(ClientPtr client)
     SpritePtr pSprite;
     ScreenPtr newScreen;
 
-    REQUEST(xWarpDevicePointerReq);
-    REQUEST_SIZE_MATCH(xWarpDevicePointerReq);
+    REQUEST(xXIWarpDevicePointerReq);
+    REQUEST_SIZE_MATCH(xXIWarpDevicePointerReq);
 
     /* FIXME: panoramix stuff is missing, look at ProcWarpPointer */
 
diff --git a/Xi/warpdevp.h b/Xi/warpdevp.h
index 00a4dff..edf95c0 100644
--- a/Xi/warpdevp.h
+++ b/Xi/warpdevp.h
@@ -30,10 +30,7 @@
 #ifndef WARPDEVP_H
 #define WARPDEVP_H 1
 
-int SProcXWarpDevicePointer(ClientPtr	/* client */
-    );
-
-int ProcXWarpDevicePointer(ClientPtr	/* client */
-    );
+int SProcXIWarpDevicePointer(ClientPtr	/* client */);
+int ProcXIWarpDevicePointer(ClientPtr	/* client */);
 
 #endif /* WARPDEVP_H */
commit 903449615b1a1188955c0287a552aec8ac5b3fbb
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Feb 20 15:03:35 2009 +1000

    Xi: add XIQueryVersion request handling.

diff --git a/Xi/Makefile.am b/Xi/Makefile.am
index 7fd593c..316fd29 100644
--- a/Xi/Makefile.am
+++ b/Xi/Makefile.am
@@ -60,6 +60,8 @@ libXi_la_SOURCES =	\
 	listdev.h \
 	opendev.c \
 	opendev.h \
+	queryversion.h \
+	queryversion.c \
 	querydp.c \
 	querydp.h \
 	queryst.c \
diff --git a/Xi/extinit.c b/Xi/extinit.c
index f99b555..e083184 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -103,6 +103,7 @@ SOFTWARE.
 #include "opendev.h"
 #include "querydp.h"
 #include "queryst.h"
+#include "queryversion.h"
 #include "selectev.h"
 #include "sendexev.h"
 #include "chgkmap.h"
@@ -234,7 +235,8 @@ static int (*ProcIVector[])(ClientPtr) = {
         ProcXChangeDeviceHierarchy,             /* 43 */
         ProcXSetClientPointer,                  /* 44 */
         ProcXGetClientPointer,                  /* 45 */
-        ProcXiSelectEvent                       /* 46 */
+        ProcXiSelectEvent,                      /* 46 */
+        ProcXIQueryVersion                      /* 47 */
 };
 
 /* For swapped clients */
@@ -285,7 +287,8 @@ static int (*SProcIVector[])(ClientPtr) = {
         SProcXChangeDeviceHierarchy,             /* 43 */
         SProcXSetClientPointer,                  /* 44 */
         SProcXGetClientPointer,                  /* 45 */
-        SProcXiSelectEvent                       /* 46 */
+        SProcXiSelectEvent,                      /* 46 */
+        SProcXIQueryVersion                      /* 47 */
 };
 
 /*****************************************************************
diff --git a/Xi/queryversion.c b/Xi/queryversion.c
new file mode 100644
index 0000000..3e0644b
--- /dev/null
+++ b/Xi/queryversion.c
@@ -0,0 +1,105 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Peter Hutterer
+ *
+ */
+
+/**
+ * @file queryversion.c
+ * Protocol handling for the XIQueryVersion request/reply.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+
+#include "inputstr.h"
+
+#include <X11/Xmd.h>
+#include <X11/X.h>
+#include <X11/extensions/XI2proto.h>
+
+#include "exglobals.h"
+#include "exevents.h"
+#include "queryversion.h"
+
+extern XExtensionVersion XIVersion; /* defined in getvers.c */
+/**
+ * Return the supported XI version.
+ *
+ * Saves the version the client claims to support as well, for future
+ * reference.
+ */
+int
+ProcXIQueryVersion(ClientPtr client)
+{
+    xXIQueryVersionReply rep;
+    XIClientPtr pXIClient;
+
+    REQUEST(xXIQueryVersionReq);
+    REQUEST_SIZE_MATCH(xXIQueryVersionReq);
+
+    pXIClient = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
+
+    pXIClient->major_version = stuff->major_version;
+    pXIClient->minor_version = stuff->minor_version;
+
+    memset(&rep, 0, sizeof(xXIQueryVersionReply));
+    rep.repType = X_Reply;
+    rep.RepType = X_XIQueryVersion;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    rep.major_version = XIVersion.major_version;
+    rep.minor_version = XIVersion.minor_version;
+
+    WriteReplyToClient(client, sizeof(xXIQueryVersionReply), &rep);
+
+    return Success;
+}
+
+/* Swapping routines */
+
+int
+SProcXIQueryVersion(ClientPtr client)
+{
+    char n;
+
+    REQUEST(xXIQueryVersionReq);
+    swaps(&stuff->length, n);
+    REQUEST_AT_LEAST_SIZE(xXIQueryVersionReq);
+    swaps(&stuff->major_version, n);
+    swaps(&stuff->major_version, n);
+    return (ProcXIQueryVersion(client));
+}
+
+void
+SRepXIQueryVersion(ClientPtr client, int size, xXIQueryVersionReply *rep)
+{
+    char n;
+    swaps(&rep->sequenceNumber, n);
+    swapl(&rep->length, n);
+    swaps(&rep->major_version, n);
+    swaps(&rep->minor_version, n);
+    WriteToClient(client, size, (char *)rep);
+}
diff --git a/Xi/queryversion.h b/Xi/queryversion.h
new file mode 100644
index 0000000..06bb729
--- /dev/null
+++ b/Xi/queryversion.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Peter Hutterer
+ *
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/extensions/XI2proto.h>
+
+#ifndef QUERYVERSION_H
+#define QUERYVERSION_H 1
+
+int SProcXIQueryVersion(ClientPtr client);
+int ProcXIQueryVersion(ClientPtr client);
+void SRepXIQueryVersion(ClientPtr client, int size, xXIQueryVersionReply* rep);
+
+#endif /* QUERYVERSION_H */
commit 77d51b94bd264be5a8625a2bdd98f2bfb2aa33d3
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Sun Mar 8 11:47:26 2009 +1000

    dix: FixUpEventForWindow needs to handle XI2 events.

diff --git a/dix/events.c b/dix/events.c
index 316703e..b27c8e1 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2101,6 +2101,37 @@ MaybeDeliverEventsToClient(WindowPtr pWin, xEvent *pEvents,
     return 2;
 }
 
+static Window FindChildForEvent(DeviceIntPtr dev, WindowPtr event)
+{
+    SpritePtr pSprite = dev->spriteInfo->sprite;
+    WindowPtr w = pSprite->spriteTrace[pSprite->spriteTraceGood-1];
+    Window child;
+
+    /* If the search ends up past the root should the child field be
+       set to none or should the value in the argument be passed
+       through. It probably doesn't matter since everyone calls
+       this function with child == None anyway. */
+    while (w)
+    {
+        /* If the source window is same as event window, child should be
+           none.  Don't bother going all all the way back to the root. */
+
+        if (w == event)
+        {
+            child = None;
+            break;
+        }
+
+        if (w->parent == event)
+        {
+            child = w->drawable.id;
+            break;
+        }
+        w = w->parent;
+    }
+    return child;
+}
+
 /**
  * Adjust event fields to comply with the window properties.
  *
@@ -2119,53 +2150,50 @@ FixUpEventFromWindow(
 {
     SpritePtr pSprite = pDev->spriteInfo->sprite;
 
-    if (xE->u.u.type == GenericEvent) /* just a safety barrier */
-        return;
-
     if (calcChild)
-    {
-        WindowPtr w= pSprite->spriteTrace[pSprite->spriteTraceGood-1];
-	/* If the search ends up past the root should the child field be
-		set to none or should the value in the argument be passed
-		through. It probably doesn't matter since everyone calls
-		this function with child == None anyway. */
+        child = FindChildForEvent(pDev, pWin);
 
-        while (w)
+    if (XI2_EVENT(xE))
+    {
+        xXIDeviceEvent* event = (xXIDeviceEvent*)xE;
+        event->root = RootWindow(pDev)->drawable.id;
+        event->event = pWin->drawable.id;
+        if (pSprite->hot.pScreen == pWin->drawable.pScreen)
+        {
+            event->event_x.integral = event->root_x.integral - pWin->drawable.x;
+            event->event_y.integral = event->root_y.integral - pWin->drawable.y;
+            event->child = child;
+        } else
         {
-            /* If the source window is same as event window, child should be
-		none.  Don't bother going all all the way back to the root. */
+            event->event_x.integral = 0;
+            event->event_y.integral = 0;
+            event->child = None;
+        }
 
-	    if (w == pWin)
-	    {
-		child = None;
-		break;
-	    }
+        if (event->evtype == XI_Enter || event->evtype == XI_Leave)
+            ((xXIEnterEvent*)event)->same_screen =
+                (pSprite->hot.pScreen == pWin->drawable.pScreen);
 
-	    if (w->parent == pWin)
-	    {
-		child = w->drawable.id;
-		break;
-            }
-	    w = w->parent;
-        }
-    }
-    XE_KBPTR.root = RootWindow(pDev)->drawable.id;
-    XE_KBPTR.event = pWin->drawable.id;
-    if (pSprite->hot.pScreen == pWin->drawable.pScreen)
-    {
-	XE_KBPTR.sameScreen = xTrue;
-	XE_KBPTR.child = child;
-	XE_KBPTR.eventX =
-	XE_KBPTR.rootX - pWin->drawable.x;
-	XE_KBPTR.eventY =
-	XE_KBPTR.rootY - pWin->drawable.y;
-    }
-    else
+    } else
     {
-	XE_KBPTR.sameScreen = xFalse;
-	XE_KBPTR.child = None;
-	XE_KBPTR.eventX = 0;
-	XE_KBPTR.eventY = 0;
+        XE_KBPTR.root = RootWindow(pDev)->drawable.id;
+        XE_KBPTR.event = pWin->drawable.id;
+        if (pSprite->hot.pScreen == pWin->drawable.pScreen)
+        {
+            XE_KBPTR.sameScreen = xTrue;
+            XE_KBPTR.child = child;
+            XE_KBPTR.eventX =
+                XE_KBPTR.rootX - pWin->drawable.x;
+            XE_KBPTR.eventY =
+                XE_KBPTR.rootY - pWin->drawable.y;
+        }
+        else
+        {
+            XE_KBPTR.sameScreen = xFalse;
+            XE_KBPTR.child = None;
+            XE_KBPTR.eventX = 0;
+            XE_KBPTR.eventY = 0;
+        }
     }
 }
 
commit 95ed2ab715fa881d36d508adf4ae5dadd92ae7b2
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Mar 12 11:46:07 2009 +1000

    Add XI2_EVENT check.

diff --git a/dix/events.c b/dix/events.c
index c38cc34..316703e 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -147,6 +147,7 @@ typedef const char *string;
 #endif
 
 #include <X11/extensions/XIproto.h>
+#include <X11/extensions/XI2proto.h>
 #include <X11/extensions/XI.h>
 #include <X11/extensions/XI2.h>
 #include "exglobals.h"
@@ -192,6 +193,10 @@ typedef const char *string;
 #define CORE_EVENT(event) \
     (!((event)->u.u.type & EXTENSION_EVENT_BASE) && \
       (event)->u.u.type != GenericEvent)
+#define XI2_EVENT(event) \
+    (((event)->u.u.type == GenericEvent) && \
+    ((xGenericEvent*)(event))->extension == IReqCode)
+
 /**
  * Used to indicate a implicit passive grab created by a ButtonPress event.
  * See DeliverEventsToWindow().
commit 92e0a324b5c738166ed4046cb00fe85ab8aea5a0
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Mar 12 14:15:02 2009 +1000

    require inputproto 1.9.99.7

diff --git a/configure.ac b/configure.ac
index f4e1dbb..4725c9f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -689,7 +689,7 @@ XEXT_LIB='$(top_builddir)/Xext/libXext.la'
 XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
 
 dnl Core modules for most extensions, et al.
-REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.9.3] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.6] [kbproto >= 1.0.3]"
+REQUIRED_MODULES="[randrproto >= 1.2.99.3] [renderproto >= 0.9.3] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.7] [kbproto >= 1.0.3]"
 REQUIRED_LIBS="xfont xau fontenc [pixman-1 >= 0.13.2]"
 
 dnl HAVE_DBUS is true if we actually have the D-Bus library, whereas
commit 906fe9547957917ac463d646935473ceca10a72b
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 20 09:36:09 2009 +1000

    Xi: don't allow OpenDevice on any MD.
    
    This restores the original behaviour of XI 1. Any slave device may be opened,
    but none of the MDs.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/opendev.c b/Xi/opendev.c
index 502bdfc..833ecbb 100644
--- a/Xi/opendev.c
+++ b/Xi/opendev.c
@@ -113,14 +113,8 @@ ProcXOpenDevice(ClientPtr client)
     } else if (status != Success)
 	return status;
 
-    /* Don't let XI 1.x clients open devices other than floating SDs. */
-    pXIClient = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
-    if (pXIClient->major_version < XI_2_Major)
-    {
-        if (dev->isMaster || (!dev->isMaster && dev->u.master))
+    if (dev->isMaster)
             return BadDevice;
-    }
-
 
     OpenInputDevice(dev, client, &status);
     if (status != Success)
commit c7eb27f3927ba9a36f9904938996f346cca33021
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Mar 4 18:45:09 2009 +1000

    Xi: always only list VCP/VCK and the SD's in XListInputDevices.
    
    If a client wants other MDs, it should use XI2's XQueryDevice() instead.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/listdev.c b/Xi/listdev.c
index 28554f3..925d0ec 100644
--- a/Xi/listdev.c
+++ b/Xi/listdev.c
@@ -320,7 +320,6 @@ int
 ProcXListInputDevices(ClientPtr client)
 {
     xListInputDevicesReply rep;
-    XIClientPtr pXIClient;
     int numdevs = 0;
     int namesize = 1;	/* need 1 extra byte for strcpy */
     int rc, size = 0;
@@ -340,21 +339,15 @@ ProcXListInputDevices(ClientPtr client)
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
 
-    pXIClient = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
 
     AddOtherInputDevices();
 
     for (d = inputInfo.devices; d; d = d->next) {
-        if (pXIClient->major_version < XI_2_Major)
-        {
-            if (d->isMaster &&
+        if (d->isMaster &&
                 d != inputInfo.pointer &&
                 d != inputInfo.keyboard)
-                continue; /* don't send master devices other than VCP/VCK */
+            continue; /* don't send master devices other than VCP/VCK */
 
-            if (!d->isMaster && d->u.master)
-                continue; /* don't send attached SDs */
-        }
         rc = XaceHook(XACE_DEVICE_ACCESS, client, d, DixGetAttrAccess);
         if (rc != Success)
             return rc;
@@ -363,10 +356,10 @@ ProcXListInputDevices(ClientPtr client)
     }
 
     for (d = inputInfo.off_devices; d; d = d->next) {
-        if (pXIClient->major_version < XI_2_Major &&
-            !d->isMaster &&
-            d->u.master) /* XXX can off_devices be attached? */
-                continue; /* don't send attached SDs */
+        if (d->isMaster &&
+                d != inputInfo.pointer &&
+                d != inputInfo.keyboard)
+            continue; /* don't send master devices other than VCP/VCK */
 
         rc = XaceHook(XACE_DEVICE_ACCESS, client, d, DixGetAttrAccess);
         if (rc != Success)
@@ -384,25 +377,20 @@ ProcXListInputDevices(ClientPtr client)
     dev = (xDeviceInfoPtr) devbuf;
     for (d = inputInfo.devices; d; d = d->next)
     {
-        if (pXIClient->major_version < XI_2_Major)
-        {
-            if (d->isMaster &&
-                    d != inputInfo.pointer &&
-                    d != inputInfo.keyboard)
-                continue; /* don't count master devices other than VCP/VCK */
-
-            if (!d->isMaster && d->u.master)
-                continue; /* don't count attached SDs */
-        }
+        if (d->isMaster &&
+                d != inputInfo.pointer &&
+                d != inputInfo.keyboard)
+            continue; /* don't count master devices other than VCP/VCK */
+
         ListDeviceInfo(client, d, dev++, &devbuf, &classbuf, &namebuf);
     }
 
     for (d = inputInfo.off_devices; d; d = d->next)
     {
-        if (pXIClient->major_version < XI_2_Major &&
-                !d->isMaster &&
-                d->u.master) /* XXX can off_devices be attached? */
-            continue; /* don't send attached SDs */
+        if (d->isMaster &&
+                d != inputInfo.pointer &&
+                d != inputInfo.keyboard)
+            continue; /* don't count master devices other than VCP/VCK */
 
         ListDeviceInfo(client, d, dev++, &devbuf, &classbuf, &namebuf);
     }
commit 801f14d4b742e506201b619d472087a7e82bd018
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Mar 3 17:04:08 2009 +1000

    Xi: don't send attachment info down with ListInputDevices.

diff --git a/Xi/listdev.c b/Xi/listdev.c
index 48c1e05..28554f3 100644
--- a/Xi/listdev.c
+++ b/Xi/listdev.c
@@ -187,10 +187,6 @@ CopySwapDevice(ClientPtr client, DeviceIntPtr d, int num_classes,
         dev->use = IsXExtensionPointer;
     else
 	dev->use = IsXExtensionDevice;
-    if (!d->isMaster)
-        dev->attached = (d->u.master) ? d->u.master->id : IsFloating;
-    else
-        dev->attached = GetPairedDevice(d)->id;
 
     if (client->swapped) {
 	swapl(&dev->type, n);	/* macro - braces are required */
commit 66dd8879b3527f30309fb747cad4a161d0709d91
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Feb 20 15:01:05 2009 +1000

    Xi: purge ExtendedGrabDevice request handling.

diff --git a/Xi/Makefile.am b/Xi/Makefile.am
index 09dd41d..7fd593c 100644
--- a/Xi/Makefile.am
+++ b/Xi/Makefile.am
@@ -27,8 +27,6 @@ libXi_la_SOURCES =	\
 	devbell.h \
 	exevents.c \
 	exglobals.h \
-        extgrbdev.c \
-        extgrbdev.h \
 	extinit.c \
 	getbmap.c \
 	getbmap.h \
diff --git a/Xi/extgrbdev.c b/Xi/extgrbdev.c
deleted file mode 100644
index da4e618..0000000
--- a/Xi/extgrbdev.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-/***********************************************************************
- *
- * Request to fake data for a given device.
- *
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>	/* for inputstr.h    */
-#include <X11/Xproto.h>	/* Request macro     */
-#include "inputstr.h"	/* DeviceIntPtr      */
-#include "windowstr.h"	/* window structure  */
-#include "scrnintstr.h"	/* screen structure  */
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-#include <X11/extensions/Xge.h>
-#include "extnsionst.h"
-#include "exevents.h"
-#include "exglobals.h"
-
-#include "grabdev.h"    /* CreateMaskFromList */
-
-#include "extgrbdev.h"
-
-int
-SProcXExtendedGrabDevice(ClientPtr client)
-{
-    char        n;
-    int         i;
-    long*       p;
-
-    REQUEST(xExtendedGrabDeviceReq);
-    swaps(&stuff->length, n);
-    REQUEST_AT_LEAST_SIZE(xExtendedGrabDeviceReq);
-
-    swapl(&stuff->grab_window, n);
-    swapl(&stuff->time, n);
-    swapl(&stuff->confine_to, n);
-    swapl(&stuff->cursor, n);
-    swaps(&stuff->event_count, n);
-    swaps(&stuff->generic_event_count, n);
-
-    p = (long *)&stuff[1];
-    for (i = 0; i < stuff->event_count; i++) {
-	swapl(p, n);
-	p++;
-    }
-
-    for (i = 0; i < stuff->generic_event_count; i++) {
-        p++; /* first 4 bytes are extension type and padding */
-        swapl(p, n);
-        p++;
-    }
-
-    return ProcXExtendedGrabDevice(client);
-}
-
-
-int
-ProcXExtendedGrabDevice(ClientPtr client)
-{
-    return BadRequest;
-}
-
-void
-SRepXExtendedGrabDevice(ClientPtr client, int size,
-                        xExtendedGrabDeviceReply* rep)
-{
-    char n;
-    swaps(&rep->sequenceNumber, n);
-    swaps(&rep->length, n);
-    WriteToClient(client, size, (char*)rep);
-}
diff --git a/Xi/extgrbdev.h b/Xi/extgrbdev.h
deleted file mode 100644
index 6e3e371..0000000
--- a/Xi/extgrbdev.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2007-2008 Peter Hutterer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Peter Hutterer, University of South Australia, NICTA
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifndef EXTGRBDEV_H
-#define EXTGRBDEV_H 1
-
-int SProcXExtendedGrabDevice(ClientPtr	/* client */
-    );
-
-int ProcXExtendedGrabDevice(ClientPtr	/* client */
-    );
-
-void SRepXExtendedGrabDevice(ClientPtr   client, 
-                            int         size, 
-                            xExtendedGrabDeviceReply* rep);
-
-#endif /* EXTGRBDEV_H */
diff --git a/Xi/extinit.c b/Xi/extinit.c
index 6779dc1..f99b555 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -82,7 +82,6 @@ SOFTWARE.
 #include "chgprop.h"
 #include "chgptr.h"
 #include "closedev.h"
-#include "extgrbdev.h"
 #include "devbell.h"
 #include "getbmap.h"
 #include "getbmap.h"
@@ -235,8 +234,7 @@ static int (*ProcIVector[])(ClientPtr) = {
         ProcXChangeDeviceHierarchy,             /* 43 */
         ProcXSetClientPointer,                  /* 44 */
         ProcXGetClientPointer,                  /* 45 */
-        ProcXiSelectEvent,                      /* 46 */
-        ProcXExtendedGrabDevice                 /* 47 */
+        ProcXiSelectEvent                       /* 46 */
 };
 
 /* For swapped clients */
@@ -287,8 +285,7 @@ static int (*SProcIVector[])(ClientPtr) = {
         SProcXChangeDeviceHierarchy,             /* 43 */
         SProcXSetClientPointer,                  /* 44 */
         SProcXGetClientPointer,                  /* 45 */
-        SProcXiSelectEvent,                      /* 46 */
-        SProcXExtendedGrabDevice                 /* 47 */
+        SProcXiSelectEvent                       /* 46 */
 };
 
 /*****************************************************************
@@ -479,8 +476,6 @@ SReplyIDispatch(ClientPtr client, int len, xGrabDeviceReply * rep)
 				(xQueryDevicePointerReply *) rep);
     else if (rep->RepType == X_GetClientPointer)
         SRepXGetClientPointer(client, len, (xGetClientPointerReply*) rep);
-    else if (rep->RepType == X_ExtendedGrabDevice)
-        SRepXExtendedGrabDevice(client, len, (xExtendedGrabDeviceReply*) rep);
     else {
 	FatalError("XINPUT confused sending swapped reply");
     }
commit 43e48900fccd245e98d6d697e4cdbb6fa866a0dd
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Mar 6 22:27:54 2009 +1000

    dix: Force deviced ids of 2 and higher for actual devices.
    
    0 is now reserved for the "AllDevices" virtual device.
    1 is now reserved for the "AllMasterDevices" virtual device.
    
    This also means that wherever we passed in (mskidx = 0), we now need to pass
    in the deviceid.

diff --git a/Xi/selectev.c b/Xi/selectev.c
index b785a8e..45bf68b 100644
--- a/Xi/selectev.c
+++ b/Xi/selectev.c
@@ -58,6 +58,7 @@ SOFTWARE.
 #include "inputstr.h"	/* DeviceIntPtr      */
 #include "windowstr.h"	/* window structure  */
 #include <X11/extensions/XI.h>
+#include <X11/extensions/XI2.h>
 #include <X11/extensions/XIproto.h>
 #include "exevents.h"
 #include "exglobals.h"
@@ -103,10 +104,9 @@ HandleDevicePresenceMask(ClientPtr client, WindowPtr win,
     if (mask == 0)
         return Success;
 
-    /* We always only use mksidx = MAXDEVICES for events not bound to
+    /* We always only use mksidx = AllDevices for events not bound to
      * devices */
-
-    if (AddExtensionClient (win, client, mask, MAXDEVICES) != Success)
+    if (AddExtensionClient (win, client, mask, AllDevices) != Success)
         return BadAlloc;
 
     RecalculateDeviceDeliverableEvents(win);
diff --git a/Xi/setmmap.c b/Xi/setmmap.c
index 8a0ab3e..ffcc7f3 100644
--- a/Xi/setmmap.c
+++ b/Xi/setmmap.c
@@ -56,6 +56,7 @@ SOFTWARE.
 
 #include "inputstr.h"	/* DeviceIntPtr      */
 #include <X11/extensions/XI.h>
+#include <X11/extensions/XI2.h>
 #include <X11/extensions/XIproto.h>
 #include "exevents.h"
 #include "exglobals.h"
diff --git a/dix/devices.c b/dix/devices.c
index 3388dac..97b47bc 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -74,6 +74,7 @@ SOFTWARE.
 #include "mipointer.h"
 
 #include <X11/extensions/XI.h>
+#include <X11/extensions/XI2.h>
 #include <X11/extensions/XIproto.h>
 #include "exglobals.h"
 #include "exevents.h"
@@ -186,13 +187,13 @@ AddInputDevice(ClientPtr client, DeviceProc deviceProc, Bool autoStart)
     char devind[MAXDEVICES];
     BOOL enabled;
 
-    /* Find next available id */
+    /* Find next available id, 0 and 1 are reserved */
     memset(devind, 0, sizeof(char)*MAXDEVICES);
     for (devtmp = inputInfo.devices; devtmp; devtmp = devtmp->next)
 	devind[devtmp->id]++;
     for (devtmp = inputInfo.off_devices; devtmp; devtmp = devtmp->next)
 	devind[devtmp->id]++;
-    for (devid = 0; devid < MAXDEVICES && devind[devid]; devid++)
+    for (devid = 2; devid < MAXDEVICES && devind[devid]; devid++)
 	;
 
     if (devid >= MAXDEVICES)
@@ -250,7 +251,7 @@ SendDevicePresenceEvent(int deviceid, int type)
     ev.time = currentTime.milliseconds;
     ev.devchange = type;
     ev.deviceid = deviceid;
-    dummyDev.id = MAXDEVICES;
+    dummyDev.id = AllDevices;
     SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
                           (xEvent*)&ev, 1);
 }
diff --git a/dix/events.c b/dix/events.c
index 0bd6a86..c38cc34 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -148,6 +148,7 @@ typedef const char *string;
 
 #include <X11/extensions/XIproto.h>
 #include <X11/extensions/XI.h>
+#include <X11/extensions/XI2.h>
 #include "exglobals.h"
 #include "exevents.h"
 #include "exglobals.h"
@@ -2347,6 +2348,7 @@ DeliverEvents(WindowPtr pWin, xEvent *xE, int count,
 {
     Mask filter;
     int     deliveries;
+    DeviceIntRec dummy;
 
 #ifdef PANORAMIX
     if(!noPanoramiXExtension && pWin->drawable.pScreen->myNum)
@@ -2355,27 +2357,27 @@ DeliverEvents(WindowPtr pWin, xEvent *xE, int count,
 
     if (!count)
 	return 0;
-    /* We don't know a device here. However, this should only ever be called
-       for a non-device event so we are safe to use 0*/
-    filter = GetEventFilter(NULL, xE);
+
+    dummy.id = AllDevices;
+    filter = GetEventFilter(&dummy, xE);
     if ((filter & SubstructureNotifyMask) && (xE->u.u.type != CreateNotify))
 	xE->u.destroyNotify.event = pWin->drawable.id;
     if (filter != StructureAndSubMask)
-	return DeliverEventsToWindow(inputInfo.pointer, pWin, xE, count, filter, NullGrab, 0);
-    deliveries = DeliverEventsToWindow(inputInfo.pointer, pWin, xE, count, StructureNotifyMask,
-				       NullGrab, 0);
+	return DeliverEventsToWindow(&dummy, pWin, xE, count, filter, NullGrab, dummy.id);
+    deliveries = DeliverEventsToWindow(&dummy, pWin, xE, count, StructureNotifyMask,
+				       NullGrab, dummy.id);
     if (pWin->parent)
     {
 	xE->u.destroyNotify.event = pWin->parent->drawable.id;
-	deliveries += DeliverEventsToWindow(inputInfo.pointer, pWin->parent, xE, count,
+	deliveries += DeliverEventsToWindow(&dummy, pWin->parent, xE, count,
 					    SubstructureNotifyMask, NullGrab,
-					    0);
+					    dummy.id);
 	if (xE->u.u.type == ReparentNotify)
 	{
 	    xE->u.destroyNotify.event = otherParent->drawable.id;
-            deliveries += DeliverEventsToWindow(inputInfo.pointer,
+            deliveries += DeliverEventsToWindow(&dummy,
                     otherParent, xE, count, SubstructureNotifyMask,
-						NullGrab, 0);
+						NullGrab, dummy.id);
 	}
     }
     return deliveries;
@@ -3435,7 +3437,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
         FixUpEventFromWindow(keybd, &core, focus, None, FALSE);
         deliveries = DeliverEventsToWindow(keybd, focus, &core, 1,
                                            GetEventFilter(keybd, &core),
-                                           NullGrab, 0);
+                                           NullGrab, keybd->id);
     }
 
 unwind:
@@ -3927,7 +3929,7 @@ CoreEnterLeaveEvent(
         else
             DeliverEventsToWindow(mouse, pWin, &event, 1,
                                   GetEventFilter(mouse, &event),
-                                  NullGrab, 0);
+                                  NullGrab, mouse->id);
     }
 
     if ((type == EnterNotify) && (mask & KeymapStateMask))
@@ -3946,7 +3948,7 @@ CoreEnterLeaveEvent(
                             mask, KeymapStateMask, grab);
         else
             DeliverEventsToWindow(mouse, pWin, (xEvent *)&ke, 1,
-                                  KeymapStateMask, NullGrab, 0);
+                                  KeymapStateMask, NullGrab, mouse->id);
     }
 }
 
@@ -4028,7 +4030,7 @@ CoreFocusEvent(DeviceIntPtr dev, int type, int mode, int detail, WindowPtr pWin)
     event.u.focus.window = pWin->drawable.id;
 
     DeliverEventsToWindow(dev, pWin, &event, 1,
-                          GetEventFilter(dev, &event), NullGrab, 0);
+                          GetEventFilter(dev, &event), NullGrab, dev->id);
     if ((type == FocusIn) &&
             ((pWin->eventMask | wOtherEventMasks(pWin)) & KeymapStateMask))
     {
@@ -4041,7 +4043,7 @@ CoreFocusEvent(DeviceIntPtr dev, int type, int mode, int detail, WindowPtr pWin)
 
         ke.type = KeymapNotify;
         DeliverEventsToWindow(dev, pWin, (xEvent *)&ke, 1,
-                KeymapStateMask, NullGrab, 0);
+                KeymapStateMask, NullGrab, dev->id);
     }
 }
 
@@ -4781,8 +4783,8 @@ ProcSendEvent(ClientPtr client)
 	    if (XaceHook(XACE_SEND_ACCESS, client, NULL, pWin,
 			 &stuff->event, 1))
 		return Success;
-            if (DeliverEventsToWindow(PickPointer(client), pWin,
-                        &stuff->event, 1, stuff->eventMask, NullGrab, 0))
+            if (DeliverEventsToWindow(dev, pWin,
+                        &stuff->event, 1, stuff->eventMask, NullGrab, dev->id))
 		return Success;
 	    if (pWin == effectiveFocus)
 		return Success;
@@ -4792,8 +4794,8 @@ ProcSendEvent(ClientPtr client)
 	}
     }
     else if (!XaceHook(XACE_SEND_ACCESS, client, NULL, pWin, &stuff->event, 1))
-        DeliverEventsToWindow(PickPointer(client), pWin, &stuff->event,
-                                    1, stuff->eventMask, NullGrab, 0);
+        DeliverEventsToWindow(dev, pWin, &stuff->event,
+                                    1, stuff->eventMask, NullGrab, dev->id);
     return Success;
 }
 
commit 70896f6127e2c12c13479a027fdd6e67853d1f8b
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Feb 13 16:42:02 2009 +1000

    dix: abstract event filters through GetEventFilters.
    
    Don't let everyone acces the filters[] array directly. This is necessary once
    we start dealing with GenericEvents, where the filters are a bit more
    complicated.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/events.c b/dix/events.c
index 5f8f24e..0bd6a86 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -399,6 +399,24 @@ static Mask filters[MAXDEVICES][128] = {
 	CantBeFiltered		       /* MappingNotify */
 }};
 
+/**
+ * For the given event, return the matching event filter. This filter may then
+ * be AND'ed with the selected event mask.
+ *
+ * @param[in] dev The device the event belongs to, may be NULL.
+ * @param[in] event The event to get the filter for. Only the type of the
+ *                  event matters, or the extension + evtype for GenericEvents.
+ * @return The filter mask for the given event.
+ */
+static Mask
+GetEventFilter(DeviceIntPtr dev, xEvent *event)
+{
+    if (event->u.u.type != GenericEvent)
+        return filters[dev ? dev->id : 0][event->u.u.type];
+    ErrorF("[dix] Unknown device type %d. No filter\n", event->u.u.type);
+    return 0;
+}
+
 
 static CARD8 criticalEvents[32] =
 {
@@ -2176,9 +2194,11 @@ EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win,
     int filter = 0;
     int type;
     OtherInputMasks *inputMasks;
+    xEvent ev;
 
     type = GetXIType(event);
-    filter = filters[dev->id][type];
+    ev.u.u.type = type; /* GetEventFilter only cares about type */
+    filter = GetEventFilter(dev, &ev);
 
     /* Check for XI mask */
     if (type && (inputMasks = wOtherInputMasks(win)) &&
@@ -2337,7 +2357,7 @@ DeliverEvents(WindowPtr pWin, xEvent *xE, int count,
 	return 0;
     /* We don't know a device here. However, this should only ever be called
        for a non-device event so we are safe to use 0*/
-    filter = filters[0][xE->u.u.type];
+    filter = GetEventFilter(NULL, xE);
     if ((filter & SubstructureNotifyMask) && (xE->u.u.type != CreateNotify))
 	xE->u.destroyNotify.event = pWin->drawable.id;
     if (filter != StructureAndSubMask)
@@ -3249,8 +3269,8 @@ CheckPassiveGrabsOnWindow(
 	    FixUpEventFromWindow(device, xE, grab->window, None, TRUE);
 
 	    TryClientEvents(rClient(grab), device, xE, count,
-				   filters[device->id][xE->u.u.type],
-				   filters[device->id][xE->u.u.type],  grab);
+                                   GetEventFilter(device, xE),
+                                   GetEventFilter(device, xE), grab);
 
 	    if (grabinfo->sync.state == FROZEN_NO_EVENT)
 	    {
@@ -3396,7 +3416,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
     /* just deliver it to the focus window */
     FixUpEventFromWindow(ptr, xE, focus, None, FALSE);
     deliveries = DeliverEventsToWindow(keybd, focus, xE, count,
-                                       filters[keybd->id][xE->u.u.type],
+                                       GetEventFilter(keybd, xE),
                                        NullGrab, keybd->id);
 
     if (deliveries > 0)
@@ -3414,7 +3434,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
 
         FixUpEventFromWindow(keybd, &core, focus, None, FALSE);
         deliveries = DeliverEventsToWindow(keybd, focus, &core, 1,
-                                           filters[keybd->id][core.u.u.type],
+                                           GetEventFilter(keybd, &core),
                                            NullGrab, 0);
     }
 
@@ -3520,7 +3540,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
             {
                 deliveries = TryClientEvents(rClient(grab), thisDev,
                         &core, 1, mask,
-                        filters[thisDev->id][core.u.u.type],
+                        GetEventFilter(thisDev, &core),
                         grab);
             }
         }
@@ -3545,7 +3565,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
                     TryClientEvents(rClient(grab), thisDev,
                             xi, count,
                             mask,
-                            filters[thisDev->id][xi->u.u.type],
+                            GetEventFilter(thisDev, xi),
                             grab);
             }
 
@@ -3899,14 +3919,15 @@ CoreEnterLeaveEvent(
              IsParent(focus, pWin)))
         event.u.enterLeave.flags |= ELFlagFocus;
 
-    if ((mask & filters[mouse->id][type]))
+    if ((mask & GetEventFilter(mouse, &event)))
     {
         if (grab)
             TryClientEvents(rClient(grab), mouse, &event, 1, mask,
-                                  filters[mouse->id][type], grab);
+                            GetEventFilter(mouse, &event), grab);
         else
             DeliverEventsToWindow(mouse, pWin, &event, 1,
-                                  filters[mouse->id][type], NullGrab, 0);
+                                  GetEventFilter(mouse, &event),
+                                  NullGrab, 0);
     }
 
     if ((type == EnterNotify) && (mask & KeymapStateMask))
@@ -3979,16 +4000,17 @@ DeviceEnterLeaveEvent(
     mskidx = mouse->id;
     inputMasks = wOtherInputMasks(pWin);
     if (inputMasks &&
-       (filters[mouse->id][devEnterLeave->type] &
+       (GetEventFilter(mouse, (xEvent*)devEnterLeave) &
             inputMasks->deliverableEvents[mskidx]))
     {
         if (grab)
             TryClientEvents(rClient(grab), mouse,
                             (xEvent*)devEnterLeave, 1, mask,
-                            filters[mouse->id][devEnterLeave->type], grab);
+                            GetEventFilter(mouse, (xEvent*)devEnterLeave),
+                            grab);
         else
             DeliverEventsToWindow(mouse, pWin, (xEvent*)devEnterLeave, 1,
-                                  filters[mouse->id][devEnterLeave->type],
+                                  GetEventFilter(mouse, (xEvent*)devEnterLeave),
                                   NullGrab, mouse->id);
     }
 
@@ -4004,8 +4026,9 @@ CoreFocusEvent(DeviceIntPtr dev, int type, int mode, int detail, WindowPtr pWin)
     event.u.u.type = type;
     event.u.u.detail = detail;
     event.u.focus.window = pWin->drawable.id;
-    (void)DeliverEventsToWindow(dev, pWin, &event, 1,
-            filters[dev->id][type], NullGrab, 0);
+
+    DeliverEventsToWindow(dev, pWin, &event, 1,
+                          GetEventFilter(dev, &event), NullGrab, 0);
     if ((type == FocusIn) &&
             ((pWin->eventMask | wOtherEventMasks(pWin)) & KeymapStateMask))
     {
@@ -5492,3 +5515,4 @@ IsInterferingGrab(ClientPtr client, DeviceIntPtr dev, xEvent* event)
 
     return FALSE;
 }
+
commit 8a8763f1502c9ddd1961f96f2cc7c73fbc0b49b5
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Feb 12 16:07:15 2009 +1000

    dix: restructure DeliverEventsToWindow, a little bit anyway.
    
    Desperate attempt of making the code easy to read and understand. A failed
    desparate attempt, possibly.

diff --git a/dix/events.c b/dix/events.c
index 9a19335..5f8f24e 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -187,6 +187,10 @@ typedef const char *string;
 #define LastEventMask OwnerGrabButtonMask
 #define AllEventMasks (LastEventMask|(LastEventMask-1))
 
+
+#define CORE_EVENT(event) \
+    (!((event)->u.u.type & EXTENSION_EVENT_BASE) && \
+      (event)->u.u.type != GenericEvent)
 /**
  * Used to indicate a implicit passive grab created by a ButtonPress event.
  * See DeliverEventsToWindow().
@@ -1888,17 +1892,16 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
 		              this mask is the mask of the grab. */
     int type = pEvents->u.u.type;
 
-    /* CantBeFiltered means only window owner gets the event */
-    if ((filter == CantBeFiltered) ||
-            (!(type & EXTENSION_EVENT_BASE) && type != GenericEvent))
+
+    /* Deliver to window owner */
+    if ((filter == CantBeFiltered) || CORE_EVENT(pEvents))
     {
 	/* if nobody ever wants to see this event, skip some work */
 	if (filter != CantBeFiltered &&
 	    !((wOtherEventMasks(pWin)|pWin->eventMask) & filter))
 	    return 0;
 
-        if (!(type & EXTENSION_EVENT_BASE) &&
-            IsInterferingGrab(wClient(pWin), pDev, pEvents))
+        if (IsInterferingGrab(wClient(pWin), pDev, pEvents))
                 return 0;
 
 	if (XaceHook(XACE_RECEIVE_ACCESS, wClient(pWin), pWin, pEvents, count))
@@ -1916,44 +1919,44 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
 		nondeliveries--;
 	}
     }
+
+    /* CantBeFiltered means only window owner gets the event */
     if (filter != CantBeFiltered)
     {
-            if (type & EXTENSION_EVENT_BASE)
-            {
-                OtherInputMasks *inputMasks;
+        if (CORE_EVENT(pEvents))
+            other = (InputClients *)wOtherClients(pWin);
+        else {
+            OtherInputMasks *inputMasks = wOtherInputMasks(pWin);
+            /* Has any client selected for the event? */
+            if (!inputMasks ||
+                !(inputMasks->inputEvents[mskidx] & filter))
+                return 0;
 
-                inputMasks = wOtherInputMasks(pWin);
-                if (!inputMasks ||
-                        !(inputMasks->inputEvents[mskidx] & filter))
-                    return 0;
-                other = inputMasks->inputClients;
-            }
-            else
-                other = (InputClients *)wOtherClients(pWin);
-            for (; other; other = other->next)
-            {
-                /* core event? check for grab interference */
-                if (!(type & EXTENSION_EVENT_BASE) &&
-                        IsInterferingGrab(rClient(other), pDev, pEvents))
-                    continue;
+            other = inputMasks->inputClients;
+        }
 
-                if (XaceHook(XACE_RECEIVE_ACCESS, rClient(other), pWin,
-                             pEvents, count))
-                    /* do nothing */;
-                else if ( (attempt = TryClientEvents(rClient(other), pDev,
-                                                     pEvents, count,
-                                                     other->mask[mskidx],
-                                                     filter, grab)) )
+        for (; other; other = other->next)
+        {
+            if (IsInterferingGrab(rClient(other), pDev, pEvents))
+                continue;
+
+            if (XaceHook(XACE_RECEIVE_ACCESS, rClient(other), pWin,
+                        pEvents, count))
+                /* do nothing */;
+            else if ( (attempt = TryClientEvents(rClient(other), pDev,
+                            pEvents, count,
+                            other->mask[mskidx],
+                            filter, grab)) )
+            {
+                if (attempt > 0)
                 {
-                    if (attempt > 0)
-                    {
-                        deliveries++;
-                        client = rClient(other);
-                        deliveryMask = other->mask[mskidx];
-                    } else
-                        nondeliveries--;
-                }
+                    deliveries++;
+                    client = rClient(other);
+                    deliveryMask = other->mask[mskidx];
+                } else
+                    nondeliveries--;
             }
+        }
     }
     /*
      * Note that since core events are delivered first, an implicit grab may
@@ -5455,9 +5458,6 @@ IsInterferingGrab(ClientPtr client, DeviceIntPtr dev, xEvent* event)
 {
     DeviceIntPtr it = inputInfo.devices;
 
-    if (dev->deviceGrab.grab && SameClient(dev->deviceGrab.grab, client))
-        return FALSE;
-
     switch(event->u.u.type)
     {
         case KeyPress:
@@ -5472,6 +5472,9 @@ IsInterferingGrab(ClientPtr client, DeviceIntPtr dev, xEvent* event)
             return FALSE;
     }
 
+    if (dev->deviceGrab.grab && SameClient(dev->deviceGrab.grab, client))
+        return FALSE;
+
     while(it)
     {
         if (it != dev)
commit 891cfc802028c3e008ee6c2d3e2438a31f57f39f
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Feb 12 10:12:45 2009 +1000

    dix: clean up DeliverDeviceEvents.
    
    Move mask checking into external function and streamline the code.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/events.c b/dix/events.c
index 2969adb..9a19335 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2143,6 +2143,66 @@ FixUpEventFromWindow(
 }
 
 /**
+ * Return masks for EventIsDeliverable.
+ * @defgroup EventIsDeliverable return flags
+ * @{
+ */
+#define XI_MASK                 (1 << 0) /**< XI mask set on window */
+#define CORE_MASK               (1 << 1) /**< Core mask set on window */
+#define DONT_PROPAGATE_MASK     (1 << 2) /**< DontPropagate mask set on window */
+/* @} */
+
+/**
+ * Check if a given event is deliverable at all on a given window.
+ *
+ * This function only checks if any client wants it, not for a specific
+ * client.
+ *
+ * @param[in] dev The device this event is being sent for.
+ * @param[in] event The event that is to be sent.
+ * @param[in] win The current event window.
+ * @param[out] filter_out The event filter for this event.
+ *
+ * @return Bitmask of ::XI_MASK, ::CORE_MASK, and ::DONT_PROPAGATE_MASK.
+ */
+static int
+EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, WindowPtr win,
+                   Mask *filter_out)
+{
+    int rc = 0;
+    int filter = 0;
+    int type;
+    OtherInputMasks *inputMasks;
+
+    type = GetXIType(event);
+    filter = filters[dev->id][type];
+
+    /* Check for XI mask */
+    if (type && (inputMasks = wOtherInputMasks(win)) &&
+        (inputMasks->deliverableEvents[dev->id] & filter) &&
+        (inputMasks->inputEvents[dev->id] & filter))
+        rc |= XI_MASK;
+
+    /* Check for XI DontPropagate mask */
+    if (type && inputMasks &&
+        (inputMasks->dontPropagateMask[dev->id] & filter))
+        rc |= DONT_PROPAGATE_MASK;
+
+    /* Check for core mask */
+    type = GetCoreType(event);
+    if (type && (win->deliverableEvents & filter) &&
+        ((wOtherEventMasks(win) | win->eventMask) & filter))
+        rc |= CORE_MASK;
+
+    /* Check for core DontPropagate mask */
+    if (type && (filter & wDontPropagateMask(win)))
+        rc |= DONT_PROPAGATE_MASK;
+
+    *filter_out = filter;
+    return rc;
+}
+
+/**
  * Deliver events caused by input devices.
  *
  * For events from a non-grabbed, non-focus device, DeliverDeviceEvents is
@@ -2166,14 +2226,11 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
                     WindowPtr stopAt, DeviceIntPtr dev)
 {
     Window child = None;
-    int type;
     Mask filter;
     int deliveries = 0;
-    OtherInputMasks *inputMasks;
-    int mskidx = dev->id;
     xEvent core;
     xEvent *xE = NULL;
-    int rc, count = 0;
+    int rc, mask, count = 0;
 
     CHECKEVENT(event);
 
@@ -2194,59 +2251,41 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
     if (XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, xE, count))
 	goto unwind;
 
-    type = xE->u.u.type;
-    filter = filters[dev->id][type];
-
-    while (pWin && type != GenericEvent)
+    while (pWin)
     {
-        /* First try XI event delivery */
-        inputMasks = wOtherInputMasks(pWin);
-        if (inputMasks && (filter & inputMasks->deliverableEvents[mskidx]))
+        if ((mask = EventIsDeliverable(dev, event, pWin, &filter)))
         {
-
-            if (inputMasks && (inputMasks->inputEvents[mskidx] & filter))
+            /* XI events first */
+            if (mask & XI_MASK)
             {
                 FixUpEventFromWindow(dev, xE, pWin, child, FALSE);
                 deliveries = DeliverEventsToWindow(dev, pWin, xE, count,
-                                                   filter, grab, mskidx);
+                                                   filter, grab, dev->id);
                 if (deliveries > 0)
                     goto unwind;
             }
-        }
 
-        if ((deliveries < 0) || (pWin == stopAt) ||
-            (inputMasks && (filter & inputMasks->dontPropagateMask[mskidx])))
-        {
-            deliveries = 0;
-            goto unwind;
-        }
-
-        if (dev->isMaster && dev->coreEvents)
-        {
-            /* no XI event delivered. Try core event */
-            rc = EventToCore(event, &core);
-            if (rc != Success)
+            /* Core event */
+            if ((mask & CORE_MASK) && dev->isMaster && dev->coreEvents)
             {
-                if (rc != BadMatch)
-                    ErrorF("[dix] %s: Core conversion failed in DDE (%d, %d).\n",
-                            dev->name, event->u.any.type, rc);
-                goto unwind;
-            }
-
-            if (filter & pWin->deliverableEvents)
-            {
-                if ((wOtherEventMasks(pWin)|pWin->eventMask) & filter)
+                rc = EventToCore(event, &core);
+                if (rc != Success)
                 {
-                    FixUpEventFromWindow(dev, &core, pWin, child, FALSE);
-                    deliveries = DeliverEventsToWindow(dev, pWin, &core, 1,
-                            filter, grab, 0);
-                    if (deliveries > 0)
-                        goto unwind;
+                    if (rc != BadMatch)
+                        ErrorF("[dix] %s: Core conversion failed in DDE (%d, %d).\n",
+                                dev->name, event->u.any.type, rc);
+                    goto unwind;
                 }
+
+                FixUpEventFromWindow(dev, &core, pWin, child, FALSE);
+                deliveries = DeliverEventsToWindow(dev, pWin, &core, 1,
+                                                   filter, grab, dev->id);
+                if (deliveries > 0)
+                    goto unwind;
             }
 
             if ((deliveries < 0) || (pWin == stopAt) ||
-                (filter & wDontPropagateMask(pWin)))
+                (mask & DONT_PROPAGATE_MASK))
             {
                 deliveries = 0;
                 goto unwind;
@@ -2262,6 +2301,10 @@ unwind:
     return deliveries;
 }
 
+#undef XI_MASK
+#undef CORE_MASK
+#undef DONT_PROPAGATE_MASK
+
 /**
  * Deliver event to a window and it's immediate parent. Used for most window
  * events (CreateNotify, ConfigureNotify, etc.). Not useful for events that
commit 6b6b660c3633af75a94302725137549df0dbe446
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Mar 10 10:15:45 2009 +1000

    Xext: remove ev_fill from GEExtensions.

diff --git a/Xext/geext.c b/Xext/geext.c
index be2bac3..1ddcbb1 100644
--- a/Xext/geext.c
+++ b/Xext/geext.c
@@ -261,16 +261,13 @@ GEExtensionInit(void)
  */
 void
 GERegisterExtension(int extension,
-                    void (*ev_swap)(xGenericEvent* from, xGenericEvent* to),
-                    void (*ev_fill)(xGenericEvent* ev, DeviceIntPtr pDev,
-                                    WindowPtr pWin, GrabPtr pGrab))
+                    void (*ev_swap)(xGenericEvent* from, xGenericEvent* to))
 {
     if ((extension & 0x7F) >=  MAXEXTENSIONS)
         FatalError("GE: extension > MAXEXTENSIONS. This should not happen.\n");
 
     /* extension opcodes are > 128, might as well save some space here */
     GEExtensions[extension & 0x7f].evswap = ev_swap;
-    GEExtensions[extension & 0x7f].evfill = ev_fill;
 }
 
 
diff --git a/Xext/geext.h b/Xext/geext.h
index fbf29cc..8e6dbeb 100644
--- a/Xext/geext.h
+++ b/Xext/geext.h
@@ -34,18 +34,10 @@ from the author.
 #define _GEEXT_H_
 #include <X11/extensions/geproto.h>
 
-/* Struct to keep information about registered extensions
- *
- * evswap ... use to swap event fields for different byte ordered clients.
- * evfill ... use to fill various event fields from the given parameters.
- */
+/** Struct to keep information about registered extensions */
 typedef struct _GEExtension {
+    /** Event swapping routine */
     void (*evswap)(xGenericEvent* from, xGenericEvent* to);
-    void (*evfill)(xGenericEvent* ev,
-                    DeviceIntPtr pDev,  /* device */
-                    WindowPtr pWin,     /* event window */
-                    GrabPtr pGrab       /* current grab, may be NULL */
-                    );
 } GEExtension, *GEExtensionPtr;
 
 
@@ -82,10 +74,7 @@ extern _X_EXPORT GEExtension GEExtensions[MAXEXTENSIONS];
 /* Interface for other extensions */
 extern _X_EXPORT void GERegisterExtension(
         int extension,
-        void (*ev_dispatch)(xGenericEvent* from, xGenericEvent* to),
-        void (*ev_fill)(xGenericEvent* ev, DeviceIntPtr pDev,
-                        WindowPtr pWin, GrabPtr pGrab)
-        );
+        void (*ev_dispatch)(xGenericEvent* from, xGenericEvent* to));
 
 extern _X_EXPORT void GEInitEvent(xGenericEvent* ev, int extension);
 
diff --git a/Xi/extinit.c b/Xi/extinit.c
index 4d35c48..6779dc1 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -1083,7 +1083,7 @@ XInputExtensionInit(void)
 	EventSwapVector[DeviceEnterNotify] = SEventIDispatch;
 	EventSwapVector[DeviceLeaveNotify] = SEventIDispatch;
 
-	GERegisterExtension(IReqCode, XI2EventSwap, NULL);
+	GERegisterExtension(IReqCode, XI2EventSwap);
     } else {
 	FatalError("IExtensionInit: AddExtensions failed\n");
     }
commit 445daa62e720fe58fa2d6c3cdc26663671b2bc48
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jan 15 17:16:22 2009 +1000

    Xext: purge XGE event masks.
    
    The masks were originally designed to generically handle event masks for
    extensions. Since all that is in-server anyway, it's much better writing
    custom event masks for those extensions that need it and not providing a
    unified mechanism.
    XI2 needs more than the current implementation, which is already too complex
    for most other extensions. good riddance.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xext/geext.c b/Xext/geext.c
index a58db03..be2bac3 100644
--- a/Xext/geext.c
+++ b/Xext/geext.c
@@ -58,7 +58,6 @@ static const int version_requests[] = {
 
 /* Forward declarations */
 static void SGEGenericEvent(xEvent* from, xEvent* to);
-static void GERecalculateWinMask(WindowPtr pWin);
 
 #define NUM_VERSION_REQUESTS	(sizeof (version_requests) / sizeof (version_requests[0]))
 
@@ -217,43 +216,6 @@ SGEGenericEvent(xEvent* from, xEvent* to)
         GEExtensions[gefrom->extension & 0x7F].evswap(gefrom, geto);
 }
 
-/**
- * Resource callback, invoked when the client disconnects and the associated
- * GE masks must be destroyed.
- */
-static int
-GEClientGone(WindowPtr pWin, XID id)
-{
-    GenericClientMasksPtr gclmask;
-    GenericMaskPtr        gmask, prev = NULL;
-
-    if (!pWin || !pWin->optional)
-        return Success;
-
-    gclmask = pWin->optional->geMasks;
-    for (gmask = gclmask->geClients; gmask; gmask = gmask->next)
-    {
-        if (gmask->resource == id)
-        {
-            if (prev)
-            {
-                prev->next = gmask->next;
-                xfree(gmask);
-            } else {
-                gclmask->geClients = NULL;
-                CheckWindowOptionalNeed(pWin);
-                GERecalculateWinMask(pWin);
-                xfree(gmask);
-            }
-            return Success;
-        }
-        prev = gmask;
-    }
-
-    FatalError("Client not a GE client");
-    return BadImplementation;
-}
-
 /* Init extension, register at server.
  * Since other extensions may rely on XGE (XInput does already), it is a good
  * idea to init XGE first, before any other extension.
@@ -277,9 +239,6 @@ GEExtensionInit(void)
         GEErrorBase = extEntry->errorBase;
         GEEventType = GEEventBase;
 
-        RT_GECLIENT = CreateNewResourceType((DeleteType)GEClientGone);
-        RegisterResourceName(RT_GECLIENT, "GECLIENT");
-
         memset(GEExtensions, 0, sizeof(GEExtensions));
 
         EventSwapVector[GenericEvent] = (EventSwapPtr) SGEGenericEvent;
@@ -326,149 +285,3 @@ GEInitEvent(xGenericEvent* ev, int extension)
     ev->length = 0;
 }
 
-/* Recalculates the summary mask for the window. */
-static void
-GERecalculateWinMask(WindowPtr pWin)
-{
-    int i;
-    GenericMaskPtr it;
-    GenericClientMasksPtr evmasks;
-
-    if (!pWin->optional)
-        return;
-
-    evmasks = pWin->optional->geMasks;
-
-    for (i = 0; i < MAXEXTENSIONS; i++)
-    {
-        evmasks->eventMasks[i] = 0;
-    }
-
-    it = pWin->optional->geMasks->geClients;
-    while(it)
-    {
-        for (i = 0; i < MAXEXTENSIONS; i++)
-        {
-            evmasks->eventMasks[i] |= it->eventMask[i];
-        }
-        it = it->next;
-    }
-}
-
-/* Set generic event mask for given window. */
-void
-GEWindowSetMask(ClientPtr pClient, DeviceIntPtr pDev,
-                WindowPtr pWin, int extension, Mask mask)
-{
-    GenericMaskPtr cli;
-
-    extension = (extension & 0x7F);
-
-    if (extension > MAXEXTENSIONS)
-    {
-        ErrorF("Invalid extension number.\n");
-        return;
-    }
-
-    if (!pWin->optional && !MakeWindowOptional(pWin))
-    {
-        ErrorF("GE: Could not make window optional.\n");
-        return;
-    }
-
-    if (mask)
-    {
-        GenericClientMasksPtr evmasks = pWin->optional->geMasks;
-
-        /* check for existing client */
-        cli = evmasks->geClients;
-        while(cli)
-        {
-            if (rClient(cli) == pClient && cli->dev == pDev)
-                break;
-            cli = cli->next;
-        }
-        if (!cli)
-        {
-            /* new client and/or new device */
-            cli  = (GenericMaskPtr)xcalloc(1, sizeof(GenericMaskRec));
-            if (!cli)
-            {
-                ErrorF("GE: Insufficient memory to alloc client.\n");
-                return;
-            }
-            cli->next = evmasks->geClients;
-            cli->resource = FakeClientID(pClient->index);
-            cli->dev = pDev;
-            evmasks->geClients = cli;
-            AddResource(cli->resource, RT_GECLIENT, (pointer)pWin);
-        }
-        cli->eventMask[extension] = mask;
-    } else
-    {
-        /* remove client. */
-        cli = pWin->optional->geMasks->geClients;
-        if (rClient(cli) == pClient && cli->dev == pDev)
-        {
-            pWin->optional->geMasks->geClients = cli->next;
-            xfree(cli);
-        } else
-        {
-            GenericMaskPtr prev = cli;
-            cli = cli->next;
-
-            while(cli)
-            {
-                if (rClient(cli) == pClient && cli->dev == pDev)
-                {
-                    prev->next = cli->next;
-                    xfree(cli);
-                    break;
-                }
-                prev = cli;
-                cli = cli->next;
-            }
-        }
-        if (!cli)
-            return;
-    }
-
-    GERecalculateWinMask(pWin);
-}
-
-/**
- * Return TRUE if the mask for the given device is set.
- * @param pWin Window the event may be delivered to.
- * @param pDev Device the device originating the event. May be NULL.
- * @param extension Extension ID
- * @param mask Event mask
- */
-BOOL
-GEDeviceMaskIsSet(WindowPtr pWin, DeviceIntPtr pDev,
-                  int extension, Mask mask)
-{
-    GenericMaskPtr gemask;
-
-    if (!pWin->optional || !pWin->optional->geMasks)
-        return FALSE;
-
-    extension &= 0x7F;
-
-    if (!pWin->optional->geMasks->eventMasks[extension] & mask)
-        return FALSE;
-
-
-    gemask = pWin->optional->geMasks->geClients;
-
-    while(gemask)
-    {
-        if ((!gemask->dev || gemask->dev == pDev) &&
-                (gemask->eventMask[extension] & mask))
-            return TRUE;
-
-        gemask = gemask->next;
-    }
-
-    return FALSE;
-}
-
diff --git a/Xext/geext.h b/Xext/geext.h
index e37d507..fbf29cc 100644
--- a/Xext/geext.h
+++ b/Xext/geext.h
@@ -34,22 +34,6 @@ from the author.
 #define _GEEXT_H_
 #include <X11/extensions/geproto.h>
 
-
-/**
- * This struct is used both in the window and by grabs to determine the event
- * mask for a client.
- * A window will have a linked list of these structs, with one entry per
- * client per device, null-terminated.
- * A grab has only one instance of this struct.
- */
-typedef struct _GenericMaskRec {
-    struct _GenericMaskRec* next;
-    XID             resource;                 /* id for the resource manager */
-    DeviceIntPtr    dev;
-    Mask            eventMask[MAXEXTENSIONS]; /* one mask per extension */
-} GenericMaskRec, *GenericMaskPtr;
-
-
 /* Struct to keep information about registered extensions
  *
  * evswap ... use to swap event fields for different byte ordered clients.
@@ -96,9 +80,6 @@ extern _X_EXPORT GEExtension GEExtensions[MAXEXTENSIONS];
 
 
 /* Interface for other extensions */
-extern _X_EXPORT void GEWindowSetMask(ClientPtr pClient, DeviceIntPtr pDev,
-                     WindowPtr pWin, int extension, Mask mask);
-
 extern _X_EXPORT void GERegisterExtension(
         int extension,
         void (*ev_dispatch)(xGenericEvent* from, xGenericEvent* to),
@@ -107,8 +88,6 @@ extern _X_EXPORT void GERegisterExtension(
         );
 
 extern _X_EXPORT void GEInitEvent(xGenericEvent* ev, int extension);
-extern _X_EXPORT BOOL GEDeviceMaskIsSet(WindowPtr pWin, DeviceIntPtr pDev,
-                       int extension, Mask mask);
 
 extern _X_EXPORT void GEExtensionInit(void);
 
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 89adf4f..8851487 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1787,7 +1787,6 @@ CheckDeviceGrabAndHintWindow(WindowPtr pWin, int type,
 	tempGrab.pointerMode = GrabModeAsync;
 	tempGrab.confineTo = NullWindow;
 	tempGrab.cursor = NullCursor;
-        tempGrab.genericMasks = NULL;
         tempGrab.next = NULL;
 	(*dev->deviceGrab.ActivateGrab) (dev, &tempGrab, currentTime, TRUE);
     }
diff --git a/Xi/extgrbdev.c b/Xi/extgrbdev.c
index af87063..da4e618 100644
--- a/Xi/extgrbdev.c
+++ b/Xi/extgrbdev.c
@@ -86,121 +86,7 @@ SProcXExtendedGrabDevice(ClientPtr client)
 int
 ProcXExtendedGrabDevice(ClientPtr client)
 {
-    xExtendedGrabDeviceReply rep;
-    DeviceIntPtr             dev;
-    int                      rc = Success,
-                             errval = 0,
-                             i;
-    WindowPtr                grab_window,
-                             confineTo = 0;
-    CursorPtr                cursor = NULL;
-    struct tmask             tmp[EMASKSIZE];
-    TimeStamp                time;
-    XGenericEventMask*       xgeMask;
-    GenericMaskPtr           gemasks = NULL;
-
-    REQUEST(xExtendedGrabDeviceReq);
-    REQUEST_AT_LEAST_SIZE(xExtendedGrabDeviceReq);
-
-    rep.repType         = X_Reply;
-    rep.RepType         = X_ExtendedGrabDevice;
-    rep.sequenceNumber  = client->sequence;
-    rep.length          = 0;
-
-    if (stuff->length != (sizeof(xExtendedGrabDeviceReq) >> 2) +
-            stuff->event_count + 2 * stuff->generic_event_count)
-    {
-        errval = 0;
-        rc = BadLength;
-        goto cleanup;
-    }
-
-    rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGrabAccess);
-    if (rc != Success) {
-	goto cleanup;
-    }
-
-    rc = dixLookupWindow(&grab_window,
-                          stuff->grab_window,
-                          client,
-                          DixReadAccess);
-    if (rc != Success)
-    {
-        errval = stuff->grab_window;
-        goto cleanup;
-    }
-
-    if (stuff->confine_to)
-    {
-        rc = dixLookupWindow(&confineTo,
-                              stuff->confine_to,
-                              client,
-                              DixReadAccess);
-        if (rc != Success)
-        {
-            errval = stuff->confine_to;
-            goto cleanup;
-        }
-    }
-
-    if (stuff->cursor)
-    {
-        cursor = (CursorPtr)SecurityLookupIDByType(client,
-                                                    stuff->cursor,
-                                                    RT_CURSOR,
-                                                    DixReadAccess);
-        if (!cursor)
-        {
-            errval = stuff->cursor;
-            rc = BadCursor;
-            goto cleanup;
-        }
-    }
-
-    if (CreateMaskFromList(client,
-                           (XEventClass*)&stuff[1],
-                           stuff->event_count,
-                           tmp,
-                           dev,
-                           X_GrabDevice) != Success)
-        return Success;
-
-    time = ClientTimeToServerTime(stuff->time);
-
-    if (stuff->generic_event_count)
-    {
-        xgeMask =
-            (XGenericEventMask*)(((XEventClass*)&stuff[1]) + stuff->event_count);
-
-        gemasks = xcalloc(1, sizeof(GenericMaskRec));
-        gemasks->resource = FakeClientID(client->index);
-        gemasks->next = NULL;
-        gemasks->eventMask[xgeMask->extension & 0x7F] = xgeMask->evmask;
-
-        xgeMask++;
-        for (i = 1; i < stuff->generic_event_count; i++, xgeMask++)
-            gemasks->eventMask[xgeMask->extension & 0x7F]= xgeMask->evmask;
-    }
-
-    rep.status = ExtGrabDevice(client, dev, stuff->device_mode,
-                               grab_window, confineTo, time,
-                               stuff->owner_events, cursor,
-                               tmp[stuff->deviceid].mask,
-                               gemasks);
-cleanup:
-
-    if (gemasks)
-        xfree(gemasks);
-
-    if (rc == Success)
-    {
-        WriteReplyToClient(client, sizeof(xGrabDeviceReply), &rep);
-    }
-    else
-    {
-        return rc;
-    }
-    return Success;
+    return BadRequest;
 }
 
 void
diff --git a/Xi/extinit.c b/Xi/extinit.c
index 9a20bfd..4d35c48 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -154,16 +154,6 @@ const Mask XIAllMasks                     = (1L << 21) - 1;
 int ExtEventIndex;
 Mask ExtExclusiveMasks[EMASKSIZE];
 
-
-/**
- * Filters for various generic events.
- * Evtype is index, mask is value at index.
- */
-static Mask xi_filters[] = {
-    XI_DeviceHierarchyChangedMask,
-    XI_DeviceClassesChangedMask,
-};
-
 static struct dev_type
 {
     Atom type;
@@ -671,6 +661,12 @@ SDeviceClassesChangedEvent(deviceClassesChangedEvent* from,
     }
 }
 
+/** Event swapping function for XI2 events. */
+static void
+XI2EventSwap(xGenericEvent *from, xGenericEvent *to)
+{
+}
+
 /**************************************************************************
  *
  * Allow the specified event to have its propagation suppressed.
@@ -1034,36 +1030,6 @@ SEventIDispatch(xEvent * from, xEvent * to)
     }
 }
 
-/****************************************************************
- *
- * EventSwap for generic events coming from the GE extension.
- */
-
-static void
-XIGEEventSwap(xGenericEvent* from, xGenericEvent* to)
-{
-    int n;
-
-    swaps(&from->sequenceNumber, n);
-    switch(from->evtype)
-    {
-        case XI_DeviceClassesChangedNotify:
-            SDeviceClassesChangedEvent((deviceClassesChangedEvent*)from,
-                                       (deviceClassesChangedEvent*)to);
-            break;
-    }
-}
-
-/**
- * EventFill to fill various fields for events before they are delivered to
- * the client.
- */
-static void
-XIGEEventFill(xGenericEvent* ev, DeviceIntPtr pDev,
-              WindowPtr pWin, GrabPtr grab)
-{
-}
-
 /**********************************************************************
  *
  * IExtensionInit - initialize the input extension.
@@ -1117,10 +1083,9 @@ XInputExtensionInit(void)
 	EventSwapVector[DeviceEnterNotify] = SEventIDispatch;
 	EventSwapVector[DeviceLeaveNotify] = SEventIDispatch;
 
-        /* init GE events */
-        GERegisterExtension(IReqCode, XIGEEventSwap, XIGEEventFill);
-        SetGenericFilter(IReqCode, xi_filters);
+	GERegisterExtension(IReqCode, XI2EventSwap, NULL);
     } else {
 	FatalError("IExtensionInit: AddExtensions failed\n");
     }
 }
+
diff --git a/Xi/xiselev.c b/Xi/xiselev.c
index 0431939..229f2d1 100644
--- a/Xi/xiselev.c
+++ b/Xi/xiselev.c
@@ -72,7 +72,7 @@ ProcXiSelectEvent(ClientPtr client)
             return rc;
     }
 
-    GEWindowSetMask(client, pDev, pWin, IReqCode, stuff->mask);
+    /* XXX: THIS FUNCTION IS NOW DYSFUNCTIONAL */
 
     return Success;
 }
diff --git a/dix/events.c b/dix/events.c
index c21e57e..2969adb 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -396,13 +396,6 @@ static Mask filters[MAXDEVICES][128] = {
 }};
 
 
-/**
- * same principle as filters, but one set of filters for each extension.
- * The extension is responsible for setting the filters by calling
- * SetGenericFilter().
- */
-static Mask* generic_filters[MAXEXTENSIONS];
-
 static CARD8 criticalEvents[32] =
 {
     0x7c, 0x30, 0x40			/* key, button, expose, and configure events */
@@ -1466,13 +1459,6 @@ DeactivatePointerGrab(DeviceIntPtr mouse)
     mouse->deviceGrab.sync.state = NOT_GRABBED;
     mouse->deviceGrab.fromPassiveGrab = FALSE;
 
-    /* make sure the potential XGE event mask is freed too*/
-    if (grab->genericMasks)
-    {
-        xfree(grab->genericMasks);
-        grab->genericMasks = NULL;
-    }
-
     for (dev = inputInfo.devices; dev; dev = dev->next)
     {
 	if (dev->deviceGrab.sync.other == grab)
@@ -1550,11 +1536,6 @@ DeactivateKeyboardGrab(DeviceIntPtr keybd)
     keybd->deviceGrab.grab = NullGrab;
     keybd->deviceGrab.sync.state = NOT_GRABBED;
     keybd->deviceGrab.fromPassiveGrab = FALSE;
-    if (grab->genericMasks)
-    {
-        xfree(grab->genericMasks);
-        grab->genericMasks = NULL;
-    }
 
     for (dev = inputInfo.devices; dev; dev = dev->next)
     {
@@ -1937,43 +1918,6 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
     }
     if (filter != CantBeFiltered)
     {
-        /* Handle generic events */
-        if (type == GenericEvent)
-        {
-            GenericMaskPtr gmask;
-            /* We don't do more than one GenericEvent at a time. */
-            if (count > 1)
-            {
-                ErrorF("[dix] Do not send more than one GenericEvent at a time!\n");
-                return 0;
-            }
-
-            /* if we get here, filter should be set to the GE specific mask.
-               check if any client wants it */
-            if (!GEDeviceMaskIsSet(pWin, pDev, GEEXT(pEvents), filter))
-                return 0;
-
-            /* run through all clients, deliver event */
-            for (gmask = GECLIENT(pWin); gmask; gmask = gmask->next)
-            {
-                if (gmask->eventMask[GEEXTIDX(pEvents)] & filter)
-                {
-                    if (XaceHook(XACE_RECEIVE_ACCESS, rClient(gmask), pWin,
-                                pEvents, count))
-                        /* do nothing */;
-                    else if (TryClientEvents(rClient(gmask), pDev,
-                             pEvents, count,
-                             gmask->eventMask[GEEXTIDX(pEvents)],
-                             filter, grab) > 0)
-                    {
-                        deliveries++;
-                    } else
-                        nondeliveries--;
-                }
-            }
-        }
-        else {
-            /* Traditional event */
             if (type & EXTENSION_EVENT_BASE)
             {
                 OtherInputMasks *inputMasks;
@@ -2010,7 +1954,6 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
                         nondeliveries--;
                 }
             }
-        }
     }
     /*
      * Note that since core events are delivered first, an implicit grab may
@@ -2039,21 +1982,6 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
         inputMasks = wOtherInputMasks(pWin);
         tempGrab.deviceMask = (inputMasks) ? inputMasks->inputEvents[pDev->id]: 0;
 
-        /* get the XGE event mask. */
-        tempGrab.genericMasks = NULL;
-        if (pWin->optional && pWin->optional->geMasks)
-        {
-            GenericClientMasksPtr gemasks = pWin->optional->geMasks;
-            GenericMaskPtr geclient = gemasks->geClients;
-            while(geclient && rClient(geclient) != client)
-                geclient = geclient->next;
-            if (geclient)
-            {
-                tempGrab.genericMasks = xcalloc(1, sizeof(GenericMaskRec));
-                *tempGrab.genericMasks = *geclient;
-                tempGrab.genericMasks->next = NULL;
-            }
-        }
 	(*pDev->deviceGrab.ActivateGrab)(pDev, &tempGrab,
                                         currentTime, TRUE | ImplicitGrabMask);
     }
@@ -2269,39 +2197,6 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
     type = xE->u.u.type;
     filter = filters[dev->id][type];
 
-    /* handle generic events */
-    /* XXX: Generic events aren't quite handled correctly yet. They should
-     * eventually fit in with the rest of the stuff
-     */
-    if (type == GenericEvent)
-    {
-        WindowPtr win = pWin;
-        xGenericEvent* ge = (xGenericEvent*)xE;
-
-        if (count > 1)
-        {
-            ErrorF("[dix] Do not send more than one GenericEvent at a time!\n");
-            deliveries = 0;
-            goto unwind;
-        }
-        filter = generic_filters[GEEXTIDX(xE)][ge->evtype];
-
-        while(win)
-        {
-            if (GEDeviceMaskIsSet(win, dev, GEEXT(xE), filter))
-            {
-                if (GEExtensions[GEEXTIDX(xE)].evfill)
-                    GEExtensions[GEEXTIDX(xE)].evfill(ge, dev, win, grab);
-                deliveries = DeliverEventsToWindow(dev, win, xE, count,
-                        filter, grab, 0);
-                if (deliveries > 0)
-                    goto unwind;
-            }
-
-            win = win->parent;
-        }
-    }
-
     while (pWin && type != GenericEvent)
     {
         /* First try XI event delivery */
@@ -3537,6 +3432,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
     }
     if (!deliveries)
     {
+        Mask mask;
         /* XXX: In theory, we could pass the internal events through to
          * everything and only convert just before hitting the wire. We can't
          * do that yet, so DGE is the last stop for internal events. From here
@@ -3552,80 +3448,63 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
         } else if (count == 0) /* no XI/Core event for you */
             goto unwind;
 
-        if (xi->u.u.type == GenericEvent)
-        {
-            /* find evmask for event's extension */
-            xGenericEvent* ge = ((xGenericEvent*)xi);
-            GenericMaskPtr    gemask = grab->genericMasks;
-
-            if (!gemask || !gemask->eventMask[GEEXTIDX(ge)])
-                goto unwind;
+        mask = grab->eventMask;
 
-            if (GEEventFill(xi))
-                GEEventFill(xi)(ge, thisDev, grab->window, grab);
-            deliveries = TryClientEvents(rClient(grab), thisDev, xi,
-                    count, gemask->eventMask[GEEXTIDX(ge)],
-                    generic_filters[GEEXTIDX(ge)][ge->evtype],
-                    grab);
-        } else
+        sendCore = (thisDev->isMaster && thisDev->coreEvents);
+        /* try core event */
+        if (sendCore && grab->coreGrab)
         {
-            Mask mask = grab->eventMask;
+            xEvent core;
 
-            sendCore = (thisDev->isMaster && thisDev->coreEvents);
-            /* try core event */
-            if (sendCore && grab->coreGrab)
+            rc = EventToCore(event, &core);
+            if (rc != Success && rc != BadMatch)
             {
-                xEvent core;
-
-                rc = EventToCore(event, &core);
-                if (rc != Success && rc != BadMatch)
-                {
-                    ErrorF("[dix] DeliverGrabbedEvent. Core conversion failed.\n");
-                    goto unwind;
-                }
-
-                FixUpEventFromWindow(thisDev, &core, grab->window,
-                        None, TRUE);
-                if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
-                            grab->window, &core, 1) ||
-                        XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
-                            grab->window, &core, 1))
-                    deliveries = 1; /* don't send, but pretend we did */
-                else if (!IsInterferingGrab(rClient(grab), thisDev, &core))
-                {
-                    deliveries = TryClientEvents(rClient(grab), thisDev,
-                            &core, 1, mask,
-                            filters[thisDev->id][core.u.u.type],
-                            grab);
-                }
+                ErrorF("[dix] DeliverGrabbedEvent. Core conversion failed.\n");
+                goto unwind;
             }
 
-            if (!deliveries)
+            FixUpEventFromWindow(thisDev, &core, grab->window,
+                    None, TRUE);
+            if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
+                        grab->window, &core, 1) ||
+                    XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
+                        grab->window, &core, 1))
+                deliveries = 1; /* don't send, but pretend we did */
+            else if (!IsInterferingGrab(rClient(grab), thisDev, &core))
             {
-                /* try XI event */
-                if (grabinfo->fromPassiveGrab  &&
-                        grabinfo->implicitGrab)
-                    mask = grab->deviceMask;
-                FixUpEventFromWindow(thisDev, xi, grab->window,
-                        None, TRUE);
-
-                if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
-                            grab->window, xi, count) ||
-                        XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
-                            grab->window, xi, count))
-                    deliveries = 1; /* don't send, but pretend we did */
-                else
-                {
-                    deliveries =
-                        TryClientEvents(rClient(grab), thisDev,
-                                xi, count,
-                                mask,
-                                filters[thisDev->id][xi->u.u.type],
-                                grab);
-                }
+                deliveries = TryClientEvents(rClient(grab), thisDev,
+                        &core, 1, mask,
+                        filters[thisDev->id][core.u.u.type],
+                        grab);
+            }
+        }
 
+        if (!deliveries)
+        {
+            /* try XI event */
+            if (grabinfo->fromPassiveGrab  &&
+                    grabinfo->implicitGrab)
+                mask = grab->deviceMask;
+            FixUpEventFromWindow(thisDev, xi, grab->window,
+                    None, TRUE);
+
+            if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
+                        grab->window, xi, count) ||
+                    XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
+                        grab->window, xi, count))
+                deliveries = 1; /* don't send, but pretend we did */
+            else
+            {
+                deliveries =
+                    TryClientEvents(rClient(grab), thisDev,
+                            xi, count,
+                            mask,
+                            filters[thisDev->id][xi->u.u.type],
+                            grab);
             }
+
         }
+
         if (deliveries && (event->u.any.type == ET_Motion))
             thisDev->valuator->motionHintWindow = grab->window;
     }
@@ -4377,7 +4256,6 @@ ProcGrabPointer(ClientPtr client)
 	tempGrab.pointerMode = stuff->pointerMode;
 	tempGrab.device = device;
         tempGrab.coreGrab = True;
-        tempGrab.genericMasks = NULL;
 	(*device->deviceGrab.ActivateGrab)(device, &tempGrab, time, FALSE);
 	if (oldCursor)
 	    FreeCursor (oldCursor, (Cursor)0);
@@ -4554,7 +4432,6 @@ GrabDevice(ClientPtr client, DeviceIntPtr dev,
 	tempGrab.device = dev;
         tempGrab.cursor = NULL;
         tempGrab.coreGrab = coreGrab;
-        tempGrab.genericMasks = NULL;
 
 	(*grabInfo->ActivateGrab)(dev, &tempGrab, time, FALSE);
 	*status = GrabSuccess;
@@ -5569,87 +5446,3 @@ IsInterferingGrab(ClientPtr client, DeviceIntPtr dev, xEvent* event)
 
     return FALSE;
 }
-
-/**
- * Set the filters for a extension.
- * The filters array needs to contain the Masks that are applicable for each
- * event type for the given extension.
- * e.g. if generic event type 2 should be let through for windows with
- * MyExampleMask set, make sure that filters[2] == MyExampleMask.
- */
-void
-SetGenericFilter(int extension, Mask* filters)
-{
-    generic_filters[extension & 0x7f] = filters;
-}
-
-
-/**
- * Grab a device for XI events and XGE events.
- * grabmode is used to ungrab a device.
- */
-int
-ExtGrabDevice(ClientPtr client,
-              DeviceIntPtr dev,
-              int device_mode,
-              WindowPtr grabWindow,
-              WindowPtr confineTo,
-              TimeStamp ctime,
-              Bool ownerEvents,
-              CursorPtr cursor,
-              Mask xi_mask,
-              GenericMaskPtr ge_masks)
-{
-    GrabInfoPtr grabinfo;
-    GrabRec     newGrab;
-
-    UpdateCurrentTime();
-
-    grabinfo = &dev->deviceGrab;
-
-    if (grabinfo->grab && !SameClient(grabinfo->grab, client))
-        return AlreadyGrabbed;
-
-    if (!grabWindow->realized)
-        return GrabNotViewable;
-
-    if ((CompareTimeStamps(ctime, currentTime) == LATER) ||
-            (CompareTimeStamps(ctime, grabinfo->grabTime) == EARLIER))
-        return GrabInvalidTime;
-
-    if (grabinfo->sync.frozen && grabinfo->sync.other &&
-            !SameClient(grabinfo->sync.other, client))
-        return GrabFrozen;
-
-    memset(&newGrab, 0, sizeof(GrabRec));
-    newGrab.window         = grabWindow;
-    newGrab.resource       = client->clientAsMask;
-    newGrab.ownerEvents    = ownerEvents;
-    newGrab.device         = dev;
-    newGrab.cursor         = cursor;
-    newGrab.confineTo      = confineTo;
-    newGrab.eventMask      = xi_mask;
-    newGrab.genericMasks   = NULL;
-    newGrab.next           = NULL;
-
-    if (ge_masks)
-    {
-        newGrab.genericMasks  = xcalloc(1, sizeof(GenericMaskRec));
-        *newGrab.genericMasks = *ge_masks;
-        newGrab.genericMasks->next = NULL;
-    }
-
-    if (IsPointerDevice(dev))
-    {
-        newGrab.keyboardMode = GrabModeAsync;
-        newGrab.pointerMode  = device_mode;
-    } else
-    {
-        newGrab.keyboardMode = device_mode;
-        newGrab.pointerMode  = GrabModeAsync;
-    }
-
-    (*grabinfo->ActivateGrab)(dev, &newGrab, ctime, FALSE);
-    return GrabSuccess;
-}
-
diff --git a/dix/grabs.c b/dix/grabs.c
index 142fc4a..164e200 100644
--- a/dix/grabs.c
+++ b/dix/grabs.c
@@ -104,7 +104,6 @@ CreateGrab(
     grab->detail.pMask = NULL;
     grab->confineTo = confineTo;
     grab->cursor = cursor;
-    grab->genericMasks = NULL;
     grab->next = NULL;
     if (cursor)
 	cursor->refcnt++;
diff --git a/dix/window.c b/dix/window.c
index e2669f0..55faaf0 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -403,13 +403,6 @@ CreateRootWindow(ScreenPtr pScreen)
     pWin->optional->inputShape = NULL;
     pWin->optional->inputMasks = NULL;
     pWin->optional->deviceCursors = NULL;
-    pWin->optional->geMasks = (GenericClientMasksPtr)xcalloc(1, sizeof(GenericClientMasksRec));
-    if (!pWin->optional->geMasks)
-    {
-        xfree(pWin->optional);
-        return FALSE;
-    }
-
     pWin->optional->colormap = pScreen->defColormap;
     pWin->optional->visual = pScreen->rootVisual;
 
@@ -792,8 +785,6 @@ CreateWindow(Window wid, WindowPtr pParent, int x, int y, unsigned w,
 static void
 DisposeWindowOptional (WindowPtr pWin)
 {
-    GenericMaskPtr gmask = NULL, next = NULL;
-
     if (!pWin->optional)
 	return;
     /*
@@ -824,17 +815,6 @@ DisposeWindowOptional (WindowPtr pWin)
         pWin->optional->deviceCursors = NULL;
     }
 
-    /* Remove generic event mask allocations */
-    if (pWin->optional->geMasks)
-        gmask = pWin->optional->geMasks->geClients;
-    while(gmask)
-    {
-        next = gmask->next;
-        xfree(gmask);
-        gmask = next;
-    }
-    xfree (pWin->optional->geMasks);
-
     xfree (pWin->optional);
     pWin->optional = NULL;
 }
@@ -3443,9 +3423,6 @@ CheckWindowOptionalNeed (WindowPtr w)
         }
     }
 
-    if (optional->geMasks != NULL)
-        return;
-
     parentOptional = FindWindowWithOptional(w)->optional;
     if (optional->visual != parentOptional->visual)
 	return;
@@ -3489,18 +3466,6 @@ MakeWindowOptional (WindowPtr pWin)
     optional->inputMasks = NULL;
     optional->deviceCursors = NULL;
 
-    optional->geMasks = xalloc(sizeof(GenericClientMasksRec));
-    if (!optional->geMasks)
-    {
-        xfree(optional);
-        return FALSE;
-    } else {
-        int i;
-        optional->geMasks->geClients = 0;
-        for (i = 0; i < MAXEXTENSIONS; i++)
-            optional->geMasks->eventMasks[i] = 0;
-    }
-
     parentOptional = FindWindowWithOptional(pWin)->optional;
     optional->visual = parentOptional->visual;
     if (!pWin->cursorIsNone)
diff --git a/include/dix.h b/include/dix.h
index 552a2d0..ebd8f2f 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -611,16 +611,4 @@ extern _X_EXPORT ClientPtr LookupClient(
     XID id,
     ClientPtr client);
 
-/* GE stuff */
-extern _X_EXPORT void SetGenericFilter(int extension, Mask* filters);
-extern _X_EXPORT int ExtGrabDevice(ClientPtr client,
-                         DeviceIntPtr dev,
-                         int device_mode,
-                         WindowPtr grabWindow,
-                         WindowPtr confineTo,
-                         TimeStamp ctime,
-                         Bool ownerEvents,
-                         CursorPtr cursor, 
-                         Mask xi_mask,
-                         GenericMaskPtr ge_masks);
 #endif /* DIX_H */
diff --git a/include/inputstr.h b/include/inputstr.h
index c9faaec..3edd33f 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -175,7 +175,6 @@ typedef struct _GrabRec {
     CursorPtr		cursor;		/* always NULL for keyboards */
     Mask		eventMask;
     Mask                deviceMask;     
-    GenericMaskPtr      genericMasks;
 } GrabRec;
 
 typedef struct _KeyClassRec {
diff --git a/include/windowstr.h b/include/windowstr.h
index 720803a..be909b5 100644
--- a/include/windowstr.h
+++ b/include/windowstr.h
@@ -79,16 +79,6 @@ typedef struct _DevCursorNode {
     struct _DevCursorNode*      next;
 } DevCursNodeRec, *DevCursNodePtr, *DevCursorList;
 
-/* Mask structure for GE extension as stored on the window.
- * Allows one mask per extension.
- *   .eventMask - Summary mask for all clients, used for quick checking.
- *   .geClients - list of clients with their specific mask.
- */
-typedef struct _GenericClientMasks {
-    Mask                eventMasks[MAXEXTENSIONS];
-    GenericMaskPtr      geClients;
-} GenericClientMasksRec, *GenericClientMasksPtr;
-
 typedef struct _WindowOpt {
     VisualID		visual;		   /* default: same as parent */
     CursorPtr		cursor;		   /* default: window.cursorNone */
@@ -105,7 +95,6 @@ typedef struct _WindowOpt {
     RegionPtr		inputShape;	   /* default: NULL */
     struct _OtherInputMasks *inputMasks;   /* default: NULL */
     DevCursorList       deviceCursors;     /* default: NULL */
-    struct _GenericClientMasks *geMasks;   /* default: NULL */
 } WindowOptRec, *WindowOptPtr;
 
 #define BackgroundPixel	    2L
commit 6fe4c28bf4f3a9f7c341b9403213470e9ded5cb3
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Feb 16 16:34:05 2009 +1000

    Add agressive event type checking.
    
    Best to FatalError if a wrong event comes in. At least that forces me to fix
    it really quickly.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 29dceca..89adf4f 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -891,6 +891,8 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
     DeviceIntPtr mouse = NULL, kbd = NULL;
     DeviceEvent *event = (DeviceEvent*)ev;
 
+    CHECKEVENT(ev);
+
     if (IsPointerDevice(device))
     {
         kbd = GetPairedDevice(device);
diff --git a/dix/events.c b/dix/events.c
index 5702d2f..c21e57e 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2247,6 +2247,8 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
     xEvent *xE = NULL;
     int rc, count = 0;
 
+    CHECKEVENT(event);
+
     /* XXX: In theory, we could pass the internal events through to everything
      * and only convert just before hitting the wire. We can't do that yet, so
      * DDE is the last stop for internal events. From here onwards, we deal
@@ -2527,6 +2529,8 @@ CheckMotion(DeviceEvent *ev, DeviceIntPtr pDev)
     WindowPtr prevSpriteWin;
     SpritePtr pSprite = pDev->spriteInfo->sprite;
 
+    CHECKEVENT(ev);
+
     prevSpriteWin = pSprite->win;
 
     if (ev && !syncEvents.playingEvents)
diff --git a/include/events.h b/include/events.h
index b091167..7bc83a6 100644
--- a/include/events.h
+++ b/include/events.h
@@ -62,6 +62,10 @@ enum {
     ET_Internal = 0xFF /* First byte */
 } EventType;
 
+#define CHECKEVENT(ev) if (ev && ((InternalEvent*)(ev))->u.any.header != 0xFF) \
+                          FatalError("Wrong event type %d.\n", \
+                                     ((InternalEvent*)(ev))->u.any.header);
+
 /**
  * Used for ALL input device events internal in the server until
  * copied into the matching protocol event.
diff --git a/mi/mieq.c b/mi/mieq.c
index 0846602..efec55a 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -162,6 +162,8 @@ mieqEnqueue(DeviceIntPtr pDev, InternalEvent *e)
     pthread_mutex_lock(&miEventQueueMutex);
 #endif
 
+    CHECKEVENT(e);
+
     /* avoid merging events from different devices */
     if (e->u.any.type == ET_Motion)
         isMotion = pDev->id;
@@ -285,6 +287,8 @@ static void
 FixUpEventForMaster(DeviceIntPtr mdev, DeviceIntPtr sdev,
                     InternalEvent* original, InternalEvent *master)
 {
+    CHECKEVENT(original);
+    CHECKEVENT(master);
     /* Ensure chained button mappings, i.e. that the detail field is the
      * value of the mapped button on the SD, not the physical button */
     if (original->u.any.type == ET_ButtonPress ||
@@ -312,6 +316,8 @@ CopyGetMasterEvent(DeviceIntPtr mdev, DeviceIntPtr sdev,
     int len = original->u.any.length;
     InternalEvent *mevent;
 
+    CHECKEVENT(original);
+
     if (master->evlen < len)
         SetMinimumEventSize(master, 1, len);
 
@@ -337,6 +343,8 @@ mieqProcessDeviceEvent(DeviceIntPtr dev,
     int x = 0, y = 0;
     DeviceIntPtr master;
 
+    CHECKEVENT(event);
+
     /* Custom event handler */
     handler = miEventQueue.handlers[event->u.any.type];
 


More information about the xorg-commit mailing list