diff --git a/common/rfb/LogWriter.h b/common/rfb/LogWriter.h
index 23e3069..6b85a85 100644
--- a/common/rfb/LogWriter.h
+++ b/common/rfb/LogWriter.h
@@ -36,6 +36,10 @@
 // is assigned a particular log level.
 
 #define DEF_LOGFUNCTION(name, level) \
+  inline void name(const char* fmt, va_list ap) { \
+    if (m_log && (level <= m_level))       \
+      m_log->write(level, m_name, fmt, ap);\
+  } \
   inline void name(const char* fmt, ...) __printf_attr(2, 3) { \
     if (m_log && (level <= m_level)) {     \
       va_list ap; va_start(ap, fmt);       \
diff --git a/common/rfb/ScreenSet.h b/common/rfb/ScreenSet.h
index 8997aa6..ad340c2 100644
--- a/common/rfb/ScreenSet.h
+++ b/common/rfb/ScreenSet.h
@@ -22,6 +22,7 @@
 #define __RFB_SCREENSET_INCLUDED__
 
 #include <stdio.h>
+#include <string.h>
 
 #include <rdr/types.h>
 #include <rfb/Rect.h>
@@ -108,15 +109,20 @@
       return true;
     };
 
-    inline void debug_print(void) const {
+    inline void print(char* str, size_t len) const {
+      char buffer[128];
       std::list<Screen>::const_iterator iter;
-      fprintf(stderr, "%d screens\n", num_screens());
+      snprintf(buffer, sizeof(buffer), "%d screen(s)\n", num_screens());
+      str[0] = '\0';
+      strncat(str, buffer, len - 1 - strlen(str));
       for (iter = screens.begin();iter != screens.end();++iter) {
-        fprintf(stderr, "    %10d (0x%08x): %dx%d+%d+%d (flags 0x%08x)\n",
-                (int)iter->id, (unsigned)iter->id,
-                iter->dimensions.width(), iter->dimensions.height(),
-                iter->dimensions.tl.x, iter->dimensions.tl.y,
-                (unsigned)iter->flags);
+        snprintf(buffer, sizeof(buffer),
+                 "    %10d (0x%08x): %dx%d+%d+%d (flags 0x%08x)\n",
+                 (int)iter->id, (unsigned)iter->id,
+                 iter->dimensions.width(), iter->dimensions.height(),
+                 iter->dimensions.tl.x, iter->dimensions.tl.y,
+                 (unsigned)iter->flags);
+        strncat(str, buffer, len - 1 - strlen(str));
       }
     };
 
diff --git a/common/rfb/ServerCore.cxx b/common/rfb/ServerCore.cxx
index b11a352..6e221d5 100644
--- a/common/rfb/ServerCore.cxx
+++ b/common/rfb/ServerCore.cxx
@@ -97,4 +97,8 @@
 ("QueryConnect",
  "Prompt the local user to accept or reject incoming connections.",
  false);
-
+rfb::IntParameter rfb::Server::queryConnectTimeout
+("QueryConnectTimeout",
+ "Number of seconds to show the Accept Connection dialog before "
+ "rejecting the connection",
+ 10);
diff --git a/common/rfb/ServerCore.h b/common/rfb/ServerCore.h
index 5fc996f..c4d7d53 100644
--- a/common/rfb/ServerCore.h
+++ b/common/rfb/ServerCore.h
@@ -48,6 +48,7 @@
     static BoolParameter sendCutText;
     static BoolParameter acceptSetDesktopSize;
     static BoolParameter queryConnect;
+    static IntParameter queryConnectTimeout;
 
   };
 
diff --git a/common/rfb/Timer.cxx b/common/rfb/Timer.cxx
index 5f8ac89..5f9c6f2 100644
--- a/common/rfb/Timer.cxx
+++ b/common/rfb/Timer.cxx
@@ -101,7 +101,6 @@
   while (pending.front()->isBefore(now)) {
     Timer* timer = pending.front();
     pending.pop_front();
-    vlog.debug("handleTimeout(%p)", timer);
     if (timer->cb->handleTimeout(timer)) {
       timer->dueTime = addMillis(timer->dueTime, timer->timeoutMs);
       if (timer->isBefore(now)) {
diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx
index e30b4f4..746bb90 100644
--- a/common/rfb/VNCSConnectionST.cxx
+++ b/common/rfb/VNCSConnectionST.cxx
@@ -1,5 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
- * Copyright 2009-2014 Pierre Ossman for Cendio AB
+ * Copyright 2009-2015 Pierre Ossman for Cendio AB
  * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -66,7 +66,8 @@
 
 VNCSConnectionST::VNCSConnectionST(VNCServerST* server_, network::Socket *s,
                                    bool reverse)
-  : SConnection(reverse), sock(s), inProcessMessages(false),
+  : SConnection(reverse), sock(s),
+    queryConnectTimer(this), inProcessMessages(false),
     pendingSyncFence(false), syncFence(false), fenceFlags(0),
     fenceDataLen(0), fenceData(NULL),
     baseRTT(-1), minRTT(-1), seenCongestion(false), pingCounter(0),
@@ -434,8 +435,10 @@
   CharArray reason;
   VNCServerST::queryResult qr = server->queryConnection(sock, userName,
                                                         &reason.buf);
-  if (qr == VNCServerST::PENDING)
+  if (qr == VNCServerST::PENDING) {
+    queryConnectTimer.start(rfb::Server::queryConnectTimeout * 1000);
     return;
+  }
 
   // - If server returns ACCEPT/REJECT then pass result to SConnection
   approveConnection(qr == VNCServerST::ACCEPT, reason.buf);
@@ -714,6 +717,10 @@
       writeFramebufferUpdate();
     else if (t == &congestionTimer)
       updateCongestion();
+    else if (t == &queryConnectTimer) {
+      if (state() == RFBSTATE_QUERYING)
+        approveConnection(false, "The attempt to prompt the user to accept the connection failed");
+    }
   } catch (rdr::Exception& e) {
     close(e.str());
   }
diff --git a/common/rfb/VNCSConnectionST.h b/common/rfb/VNCSConnectionST.h
index fd1897a..7b25570 100644
--- a/common/rfb/VNCSConnectionST.h
+++ b/common/rfb/VNCSConnectionST.h
@@ -174,6 +174,8 @@
     network::Socket* sock;
     CharArray peerEndpoint;
 
+    Timer queryConnectTimer;
+
     bool inProcessMessages;
 
     bool pendingSyncFence, syncFence;
diff --git a/contrib/packages/rpm/sle11/SOURCES/0001-Check-harder-for-primary-PCI-device.patch b/contrib/packages/rpm/sle11/SOURCES/0001-Check-harder-for-primary-PCI-device.patch
deleted file mode 100644
index d7c7779..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/0001-Check-harder-for-primary-PCI-device.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-From 35540106538b24ca1765e752fe9d6efc968a88fa Mon Sep 17 00:00:00 2001
-From: Egbert Eich <eich@linux-p1mv.site>
-Date: Wed, 7 Oct 2009 16:31:44 +0200
-Subject: [PATCH] Check harder for primary PCI device.
-
-Primary PCI devices are identified by checking for an 'PCIINFOCLASSES'
-device which is VGA and has access to the memory bars enabled.
-If there should be more than one device for which this is true
-redo the check and also check if IO resoures are also enabled,
-if this still doesn't turn up a unique result also check for
-the presence of a BIOS rom.
-================================================================================
---- xorg-server-1.7.99/hw/xfree86/common/xf86pciBus.c
-+++ xorg-server-1.7.99/hw/xfree86/common/xf86pciBus.c
-@@ -140,9 +140,49 @@
- 		    primaryBus.type = BUS_PCI;
- 		    primaryBus.id.pci = info;
- 		} else {
--		    xf86Msg(X_NOTICE,
--			    "More than one possible primary device found\n");
--		    primaryBus.type ^= (BusType)(-1);
-+                    /* 
-+                     * Ok, we found more than one possible primary device with this heuristic
-+                     * Now also check if IO is enabled.
-+                     */
-+		    int j;
-+		    
-+                    primaryBus.type = BUS_NONE;
-+		    for (j = 0; j < num; j++) {
-+			info = xf86PciVideoInfo[j];
-+			pci_device_cfg_read_u16(info, & command, 4);
-+
-+			if ((command & PCI_CMD_MEM_ENABLE) 
-+				&& (command & PCI_CMD_IO_ENABLE)
-+		    	    	&& (IS_VGA(info->device_class))) {
-+			    if (primaryBus.type == BUS_NONE) {
-+                    		primaryBus.type = BUS_PCI;
-+                    		primaryBus.id.pci = info;
-+                	    } else {
-+			        primaryBus.type = BUS_NONE;
-+			        for (j = 0; j < num; j++) {
-+				    info = xf86PciVideoInfo[j];
-+				    pci_device_cfg_read_u16(info, & command, 4);
-+				
-+				    if ((command & PCI_CMD_MEM_ENABLE) 
-+				        && (command & PCI_CMD_IO_ENABLE)
-+					&& (IS_VGA(info->device_class))
-+					&& info->rom_size) {
-+				        if (primaryBus.type == BUS_NONE) {
-+				            primaryBus.type = BUS_PCI;
-+					    primaryBus.id.pci = info;
-+					} else {
-+				            xf86Msg(X_NOTICE,
-+						    "More than one possible primary device found\n");
-+					    primaryBus.type ^= (BusType)(-1);					
-+					    break;
-+					}
-+				    }
-+				}
-+				break;
-+			    }
-+			}
-+		    }
-+		    break;
- 		}
- 	    }
- 	}
diff --git a/contrib/packages/rpm/sle11/SOURCES/0001-Fix-segfault-when-killing-X-with-ctrl-alt-backspace.patch b/contrib/packages/rpm/sle11/SOURCES/0001-Fix-segfault-when-killing-X-with-ctrl-alt-backspace.patch
deleted file mode 100644
index e9ab607..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/0001-Fix-segfault-when-killing-X-with-ctrl-alt-backspace.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- xorg-server-1.9.0/mi/misprite.c.orig	2010-07-23 21:40:56.000000000 +0200
-+++ xorg-server-1.9.0/mi/misprite.c	2010-08-23 15:44:51.000000000 +0200
-@@ -384,6 +384,7 @@ miSpriteCloseScreen (int i, ScreenPtr pS
-     pScreen->InstallColormap = pScreenPriv->InstallColormap;
-     pScreen->StoreColors = pScreenPriv->StoreColors;
- 
-+    miSpriteDisableDamage(pScreen, pScreenPriv);
-     DamageDestroy (pScreenPriv->pDamage);
- 
-     free(pScreenPriv);
diff --git a/contrib/packages/rpm/sle11/SOURCES/0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch b/contrib/packages/rpm/sle11/SOURCES/0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch
deleted file mode 100644
index fcfd07f..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-From d1d9d4e5f8f9ac1d22e1258759d6ee9e49c7fe90 Mon Sep 17 00:00:00 2001
-From: Egbert Eich <eich@freedesktop.org>
-Date: Fri, 9 Apr 2010 15:10:32 +0200
-Subject: [PATCH] Prevent XSync Alarms from senslessly calling CheckTrigger() when inactive.
-
-If an XSync Alarm is set to inactive there is no need to check if a trigger
-needs to fire. Doing so if the counter is the IdleCounter will put the
-server on 100 percent CPU load since the select timeout is set to 0.
----
- xorg-server-1.8.0/Xext/sync.c    |   11 +++++++++--
- xorg-server-1.8.0/Xext/syncsrv.h |    1 +
- 2 files changed, 10 insertions(+), 2 deletions(-)
-
-Index: xorg-server-1.8.0/Xext/sync.c
-===================================================================
---- xorg-server-1.8.0.orig/Xext/sync.c
-+++ xorg-server-1.8.0/Xext/sync.c
-@@ -518,6 +518,10 @@ SyncAlarmTriggerFired(SyncTrigger *pTrig
- 	    pAlarm->state = XSyncAlarmInactive;
- 	}
-     }
-+    /* Stop server from looping! */
-+    if (pAlarm->state == XSyncAlarmInactive)
-+	SyncDeleteTriggerFromCounter(&pAlarm->trigger);
-+
-     /*  The AlarmNotify event has to have the "new state of the alarm"
-      *  which we can't be sure of until this point.  However, it has
-      *  to have the "old" trigger test value.  That's the reason for
-@@ -730,7 +734,7 @@ SyncChangeAlarmAttributes(ClientPtr clie
-     XSyncCounter   counter;
-     Mask	   origmask = mask;
- 
--    counter = pAlarm->trigger.pCounter ? pAlarm->trigger.pCounter->id : None;
-+    counter = pAlarm->counter_id;
- 
-     while (mask)
-     {
-@@ -741,7 +745,7 @@ SyncChangeAlarmAttributes(ClientPtr clie
- 	  case XSyncCACounter:
- 	    mask &= ~XSyncCACounter;
- 	    /* sanity check in SyncInitTrigger */
--	    counter = *values++;
-+	    counter = pAlarm->counter_id = *values++;
- 	    break;
- 
- 	  case XSyncCAValueType:
-@@ -808,6 +812,14 @@ SyncChangeAlarmAttributes(ClientPtr clie
- 	    return BadMatch;
- 	}
-     }
-+    if (pAlarm->state == XSyncAlarmInactive) {
-+	/*
-+	 * If we are inactive the trigger has been deleted from the counter.
-+	 * Persuade SyncInitTrigger() to readd it.
-+	 */
-+	origmask |= XSyncCACounter;
-+	pAlarm->trigger.pCounter = NULL;
-+    }
- 
-     /* postpone this until now, when we're sure nothing else can go wrong */
-     if ((status = SyncInitTrigger(client, &pAlarm->trigger, counter,
-@@ -815,6 +827,7 @@ SyncChangeAlarmAttributes(ClientPtr clie
- 	return status;
- 
-     /* XXX spec does not really say to do this - needs clarification */
-+    /* It's the only place where it is set to XSyncAlarmActive! */
-     pAlarm->state = XSyncAlarmActive;
-     return Success;
- }
-@@ -1617,8 +1630,10 @@ ProcSyncCreateAlarm(ClientPtr client)
- 
-     pAlarm->client = client;
-     pAlarm->alarm_id = stuff->id;
-+    pAlarm->counter_id = None;
-     XSyncIntToValue(&pAlarm->delta, 1L);
-     pAlarm->events = TRUE;
-+    /* SyncChangeAlarmAttributes() changes this - no need to set this here! */
-     pAlarm->state = XSyncAlarmInactive;
-     pAlarm->pEventClients = NULL;
-     status = SyncChangeAlarmAttributes(client, pAlarm, vmask,
-Index: xorg-server-1.8.0/Xext/syncsrv.h
-===================================================================
---- xorg-server-1.8.0.orig/Xext/syncsrv.h
-+++ xorg-server-1.8.0/Xext/syncsrv.h
-@@ -129,6 +129,7 @@ typedef struct _SyncAlarm {
-     int		events;
-     int		state;
-     SyncAlarmClientList *pEventClients;
-+    XSyncCounter counter_id;
- } SyncAlarm;
- 
- typedef struct {
diff --git a/contrib/packages/rpm/sle11/SOURCES/0001-Xinput-Catch-missing-configlayout-when-deleting-dev.patch b/contrib/packages/rpm/sle11/SOURCES/0001-Xinput-Catch-missing-configlayout-when-deleting-dev.patch
deleted file mode 100644
index 893bbc2..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/0001-Xinput-Catch-missing-configlayout-when-deleting-dev.patch
+++ /dev/null
@@ -1,42 +0,0 @@
->From 829037395f8b93e69a30852a95e378f78c3ccd6b Mon Sep 17 00:00:00 2001
-From: Luc Verhaegen <libv@skynet.be>
-Date: Wed, 12 Nov 2008 17:09:33 +0100
-Subject: [PATCH] Xinput: Catch missing configlayout when deleting device.
-
-In DeleteInputDeviceRequest (xf86Xinput.c), we access idev members
-even if idev is null. This takes down the xserver hard in some cases
-(kernel SIGABRT), and segfaults on other cases.
-================================================================================
---- xorg-server-1.7.99/hw/xfree86/common/xf86Xinput.c
-+++ xorg-server-1.7.99/hw/xfree86/common/xf86Xinput.c
-@@ -870,17 +870,20 @@
-         else
-             xf86DeleteInput(pInfo, 0);
- 
--        /* devices added through HAL aren't in the config layout */
--        it = xf86ConfigLayout.inputs;
--        while(*it && *it != idev)
--            it++;
--
--        if (!(*it)) /* end of list, not in the layout */
-+	if (idev)
-         {
--            free(idev->driver);
--            free(idev->identifier);
--            xf86optionListFree(idev->commonOptions);
--            free(idev);
-+	    /* devices added through HAL aren't in the config layout */
-+	    it = xf86ConfigLayout.inputs;
-+	    while(*it && *it != idev)
-+		it++;
-+
-+	    if (!(*it)) /* end of list, not in the layout */
-+	    {
-+		free(idev->driver);
-+		free(idev->identifier);
-+		xf86optionListFree(idev->commonOptions);
-+		free(idev);
-+	    }
-         }
-     }
-     OsReleaseSignals();
diff --git a/contrib/packages/rpm/sle11/SOURCES/10-libvnc.conf b/contrib/packages/rpm/sle11/SOURCES/10-libvnc.conf
deleted file mode 100644
index e4f6a93..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/10-libvnc.conf
+++ /dev/null
@@ -1,19 +0,0 @@
-# This file contains configuration of libvnc.so module
-#
-# To get libvnc.so module working, do this:
-# 1. run "vncpasswd" as root user
-# 2. uncomment configuration lines below
-#
-# Please note you can specify any option which Xvnc accepts.
-# Refer to `Xvnc -help` output for detailed list of options.
-
-#Section "Module"
-#    Load "vnc"
-#EndSection
-
-#Section "Screen"
-#    Identifier "Screen0"
-#    DefaultDepth 16
-#    Option "SecurityTypes" "VncAuth"
-#    Option "PasswordFile" "/root/.vnc/passwd"
-#EndSection
diff --git a/contrib/packages/rpm/sle11/SOURCES/CVE-2010-2240-address_space_limit.patch b/contrib/packages/rpm/sle11/SOURCES/CVE-2010-2240-address_space_limit.patch
deleted file mode 100644
index 9d58c61..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/CVE-2010-2240-address_space_limit.patch
+++ /dev/null
@@ -1,121 +0,0 @@
->From fedf91eeabcfdd6d26b52529a16a64f744aa42ad Mon Sep 17 00:00:00 2001
-From: Matthieu Herrb <matthieu.herrb@laas.fr>
-Date: Mon, 28 Jun 2010 23:54:13 +0200
-Subject: [PATCH] Workaround for CVE-2010-2240.
-
-By limiting the address space that the X server can use,
-it prevents stack and mmap()ed areas to become so close that
-the stack will grow over a mmaped area.
-
-Credits: Rafal Wojtczuk <rafal@invisiblethingslab.com>
----
- doc/Xserver.man.pre |    7 +++++++
- include/opaque.h    |    3 +++
- os/osinit.c         |   24 ++++++++++++++++++++++++
- os/utils.c          |   16 ++++++++++++++++
- 4 files changed, 50 insertions(+), 0 deletions(-)
-
-diff --git a/doc/Xserver.man.pre b/doc/Xserver.man.pre
-index ce3b3a1..91c595f 100644
---- a/doc/Xserver.man.pre
-+++ b/doc/Xserver.man.pre
-@@ -285,6 +285,13 @@ sets the stack space limit of the server to the specified number of kilobytes.
- A value of zero makes the stack size as large as possible.  The default value
- of \-1 leaves the stack space limit unchanged.
- .TP 8
-+.B \-la \fIkilobytes\fP
-+sets the address space limit of the server to the specified number of 
-+kilobytes.
-+A value of zero makes address space as large as possible.
-+The default value is 1572864 (1.5GB) on 32 bit architectures and
-+10485760 (10GB) on 64 bit architectures.
-+.TP 8
- .B \-logo
- turns on the X Window System logo display in the screen-saver.
- There is currently no way to change this from a client.
-diff --git a/include/opaque.h b/include/opaque.h
-index b3c7c70..4208d03 100644
---- a/include/opaque.h
-+++ b/include/opaque.h
-@@ -67,6 +67,9 @@ extern _X_EXPORT int limitStackSpace;
- #ifdef RLIMIT_NOFILE
- extern _X_EXPORT int limitNoFile;
- #endif
-+#ifdef RLIMIT_AS
-+extern _X_EXPORT int limitAddressSpace;
-+#endif
- extern _X_EXPORT Bool defeatAccessControl;
- extern _X_EXPORT long maxBigRequestSize;
- extern _X_EXPORT Bool party_like_its_1989;
-diff --git a/os/osinit.c b/os/osinit.c
-index 32747df..723fb14 100644
---- a/os/osinit.c
-+++ b/os/osinit.c
-@@ -96,6 +96,14 @@ int limitStackSpace = -1;
- #ifdef RLIMIT_NOFILE
- int limitNoFile = -1;
- #endif
-+#ifdef RLIMIT_AS
-+#ifdef _XSERVER64
-+#define XORG_AS_LIMIT 10737418240LL
-+#else
-+#define XORG_AS_LIMIT 1610612736 
-+#endif
-+long limitAddressSpace = XORG_AS_LIMIT;
-+#endif
- 
- static OsSigWrapperPtr OsSigWrapper = NULL;
- 
-@@ -301,6 +309,22 @@ OsInit(void)
- 	    }
- 	}
- #endif
-+#ifdef RLIMIT_AS
-+	if (limitAddressSpace >= 0)
-+	{
-+	    struct rlimit	rlim;
-+
-+	    if (!getrlimit(RLIMIT_AS, &rlim))
-+	    {
-+		if ((limitAddressSpace > 0) 
-+		    && (limitAddressSpace < rlim.rlim_max))
-+		    rlim.rlim_cur = limitAddressSpace;
-+		else
-+		    rlim.rlim_cur = rlim.rlim_max;
-+		(void)setrlimit(RLIMIT_AS, &rlim);
-+	    }
-+	}
-+#endif
- 	LockServer();
- 	been_here = TRUE;
-     }
-diff --git a/os/utils.c b/os/utils.c
-index 51455cc..4af0cb3 100644
---- a/os/utils.c
-+++ b/os/utils.c
-@@ -745,6 +745,22 @@ ProcessCommandLine(int argc, char *argv[])
- 		UseMsg();
- 	}
- #endif
-+#ifdef RLIMIT_AS
-+	else if ( strcmp( argv[i], "-la") == 0)
-+	{
-+	    if (getuid() != geteuid()) {
-+		FatalError("The '-la' option can only be used by root.\n");
-+	    }
-+	    if(++i < argc)
-+	    {
-+	        limitAddressSpace = atol(argv[i]);
-+		if (limitAddressSpace > 0)
-+		    limitAddressSpace *= 1024;
-+	    }
-+	    else
-+		UseMsg();
-+	}
-+#endif
- 	else if ( strcmp ( argv[i], "-nolock") == 0)
- 	{
- #if !defined(WIN32) && !defined(__CYGWIN__)
--- 
-1.7.0.5
-
diff --git a/contrib/packages/rpm/sle11/SOURCES/CVE-2010-2240-tree_depth_limit.patch b/contrib/packages/rpm/sle11/SOURCES/CVE-2010-2240-tree_depth_limit.patch
deleted file mode 100644
index 0507401..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/CVE-2010-2240-tree_depth_limit.patch
+++ /dev/null
@@ -1,73 +0,0 @@
---- xorg-server-1.9.0/dix/window.c.orig	2010-08-23 16:07:24.000000000 +0200
-+++ xorg-server-1.9.0/dix/window.c	2010-08-23 16:14:09.000000000 +0200
-@@ -535,6 +535,48 @@ RealChildHead(WindowPtr pWin)
- 	return NullWindow;
- }
- 
-+static int
-+TreeDepth(WindowPtr pWin)
-+{
-+    int depth = 1;
-+    int max_depth = 1;
-+    WindowPtr pChild;
-+
-+    if (!(pChild = pWin))
-+	return 0;
-+    while (1)
-+    {
-+	if (pChild->firstChild)
-+	{
-+	    ++depth;
-+	    pChild = pChild->firstChild;
-+	    continue;
-+	} else if (depth > max_depth)
-+	    max_depth = depth;
-+	while (!pChild->nextSib && (pChild != pWin)) {
-+	    --depth;
-+	    pChild = pChild->parent;
-+	}
-+	if (pChild == pWin)
-+	    break;
-+	    pChild = pChild->nextSib;
-+    }
-+    return max_depth;
-+}
-+
-+static int
-+WindowDepth(WindowPtr pWin)
-+{
-+    int depth = 0;
-+    while (pWin) {
-+	++depth;
-+	pWin = pWin->parent;
-+    }
-+    return depth;
-+}
-+
-+#define MAX_TREE_DEPTH 256
-+
- /*****
-  * CreateWindow
-  *    Makes a window in response to client request 
-@@ -555,6 +597,11 @@ CreateWindow(Window wid, WindowPtr pPare
-     PixmapFormatRec *format;
-     WindowOptPtr ancwopt;
- 
-+    if (WindowDepth(pParent) >= MAX_TREE_DEPTH - 1) {
-+	*error = BadAlloc;
-+	return NullWindow;
-+    }
-+
-     if (class == CopyFromParent)
- 	class = pParent->drawable.class;
- 
-@@ -2434,6 +2481,9 @@ ReparentWindow(WindowPtr pWin, WindowPtr
-     int bw = wBorderWidth (pWin);
-     ScreenPtr pScreen;
- 
-+    if (WindowDepth(pParent) + TreeDepth(pWin) >= MAX_TREE_DEPTH)
-+	return BadAlloc;
-+
-     pScreen = pWin->drawable.pScreen;
-     if (TraverseTree(pWin, CompareWIDs, (pointer)&pParent->drawable.id) == WT_STOPWALKING)
- 	return BadMatch;
diff --git a/contrib/packages/rpm/sle11/SOURCES/EXA-mixed-ModifyPixmapHeader-pitch-fixes.-bug-33929.patch b/contrib/packages/rpm/sle11/SOURCES/EXA-mixed-ModifyPixmapHeader-pitch-fixes.-bug-33929.patch
deleted file mode 100644
index 974f09d..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/EXA-mixed-ModifyPixmapHeader-pitch-fixes.-bug-33929.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From 7b3b7efe78dec87c8059ea0d0985f08a97f0633d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <daenzer@vmware.com>
-Date: Thu, 24 Feb 2011 12:17:57 +0100
-Subject: [PATCH] EXA/mixed: ModifyPixmapHeader pitch fixes. (bug #33929)
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-If there's a GPU copy and a non-zero devKind was passed in, set the GPU copy
-pitch to that instead of to a possibly bogus value derived from the new width.
-This is e.g. used by the radeon driver's drmmode_xf86crtc_resize hook, fixes
-https://bugs.freedesktop.org/show_bug.cgi?id=33929 .
-
-On the other hand, the system memory copy doesn't need the pitch to be aligned
-beyond the PixmapBytePad of the width.
-
-Signed-off-by: Michel Dänzer <daenzer@vmware.com>
-Acked-by: Cyril Brulebois <kibi@debian.org>
-Tested-by: Cyril Brulebois <kibi@debian.org>
-Reported-by: Thierry Vignaud <thierry.vignaud@gmail.com>
-Tested-by: Thierry Vignaud <thierry.vignaud@gmail.com>
-Signed-off-by: Keith Packard <keithp@keithp.com>
-(cherry picked from commit 31704510f448706524b7b7085cc4ff0ada7bfe7e)
----
- exa/exa_mixed.c |    9 +++++----
- 1 files changed, 5 insertions(+), 4 deletions(-)
-
-diff --git a/exa/exa_mixed.c b/exa/exa_mixed.c
-index 606f1e1..fd1afb2 100644
---- a/exa/exa_mixed.c
-+++ b/exa/exa_mixed.c
-@@ -175,8 +175,10 @@ exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int width, int height, int depth,
- 	depth != pPixmap->drawable.depth ||
- 	bitsPerPixel != pPixmap->drawable.bitsPerPixel) {
- 	if (pExaPixmap->driverPriv) {
--            exaSetFbPitch(pExaScr, pExaPixmap,
--                          width, height, bitsPerPixel);
-+	    if (devKind > 0)
-+		pExaPixmap->fb_pitch = devKind;
-+	    else
-+		exaSetFbPitch(pExaScr, pExaPixmap, width, height, bitsPerPixel);
- 
-             exaSetAccelBlock(pExaScr, pExaPixmap,
-                              width, height, bitsPerPixel);
-@@ -187,8 +189,7 @@ exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int width, int height, int depth,
- 	if (has_gpu_copy && pExaPixmap->sys_ptr) {
- 	    free(pExaPixmap->sys_ptr);
- 	    pExaPixmap->sys_ptr = NULL;
--	    pExaPixmap->sys_pitch = devKind > 0 ? devKind :
--	        PixmapBytePad(width, depth);
-+	    pExaPixmap->sys_pitch = PixmapBytePad(width, depth);
- 	    DamageUnregister(&pPixmap->drawable, pExaPixmap->pDamage);
- 	    DamageDestroy(pExaPixmap->pDamage);
- 	    pExaPixmap->pDamage = NULL;
--- 
-1.7.4.1
-
diff --git a/contrib/packages/rpm/sle11/SOURCES/U_01-glx-make-sure-screen-is-non-negative-in-validGlxScreen.patch b/contrib/packages/rpm/sle11/SOURCES/U_01-glx-make-sure-screen-is-non-negative-in-validGlxScreen.patch
deleted file mode 100644
index 2b43e2a..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/U_01-glx-make-sure-screen-is-non-negative-in-validGlxScreen.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From: Julien Cristau <jcristau@debian.org>
-Date: Sat Jul 3 19:42:26 2010 +0100
-Subject: [PATCH] glx: make sure screen is non-negative in validGlxScreen
-Patch-Mainline: Upstream
-Git-commit: 3f0d3f4d97bce75c1828635c322b6560a45a037f
-References: bnc #648278, CVE-2010-4818
-Signed-off-by: Egbert Eich <eich@suse.de>
-
-Reviewed-by: Adam Jackson <ajax@redhat.com>
-Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>
-Reviewed-by: Daniel Stone <daniel@fooishbar.org>
-Signed-off-by: Julien Cristau <jcristau@debian.org>
----
- glx/glxcmds.c |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- xorg-server-1.6.5.orig/glx/glxcmds.c
-+++ xorg-server-1.6.5/glx/glxcmds.c
-@@ -65,7 +65,7 @@ validGlxScreen(ClientPtr client, int scr
-     /*
-     ** Check if screen exists.
-     */
--    if (screen >= screenInfo.numScreens) {
-+    if (screen < 0 || screen >= screenInfo.numScreens) {
- 	client->errorValue = screen;
- 	*err = BadValue;
- 	return FALSE;
diff --git a/contrib/packages/rpm/sle11/SOURCES/U_02-glx-validate-request-lengths.patch b/contrib/packages/rpm/sle11/SOURCES/U_02-glx-validate-request-lengths.patch
deleted file mode 100644
index e51407d..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/U_02-glx-validate-request-lengths.patch
+++ /dev/null
@@ -1,564 +0,0 @@
-From: Julien Cristau <jcristau@debian.org>
-Date: Sat Jul 3 19:47:55 2010 +0100
-Subject: [PATCH] glx: validate request lengths
-Patch-Mainline: Upstream
-Git-commit: ec9c97c6bf70b523bc500bd3adf62176f1bb33a4
-References: bnc #648278, CVE-2010-4818
-Signed-off-by: Egbert Eich <eich@suse.de>
-
-Reviewed-by: Adam Jackson <ajax@redhat.com>
-Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>
-Reviewed-by: Daniel Stone <daniel@fooishbar.org>
-Signed-off-by: Julien Cristau <jcristau@debian.org>
-
---- xorg-server-1.6.5.orig/glx/xfont.c
-+++ xorg-server-1.6.5/glx/xfont.c
-@@ -161,6 +161,8 @@ int __glXDisp_UseXFont(__GLXclientState
-     __GLXcontext *cx;
-     int error;
- 
-+    REQUEST_SIZE_MATCH(xGLXUseXFontReq);
-+
-     req = (xGLXUseXFontReq *) pc;
-     cx = __glXForceCurrent(cl, req->contextTag, &error);
-     if (!cx) {
---- xorg-server-1.9.3/glx/glxcmds.c.orig	2012-02-06 14:45:15.000000000 +0100
-+++ xorg-server-1.9.3/glx/glxcmds.c	2012-02-06 15:09:00.000000000 +0100
-@@ -315,11 +315,14 @@ DoCreateContext(__GLXclientState *cl, GL
- 
- int __glXDisp_CreateContext(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXCreateContextReq *req = (xGLXCreateContextReq *) pc;
-     __GLXconfig *config;
-     __GLXscreen *pGlxScreen;
-     int err;
- 
-+    REQUEST_SIZE_MATCH(xGLXCreateContextReq);
-+
-     if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
- 	return err;
-     if (!validGlxVisual(cl->client, pGlxScreen, req->visual, &config, &err))
-@@ -331,11 +334,14 @@ int __glXDisp_CreateContext(__GLXclientS
- 
- int __glXDisp_CreateNewContext(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXCreateNewContextReq *req = (xGLXCreateNewContextReq *) pc;
-     __GLXconfig *config;
-     __GLXscreen *pGlxScreen;
-     int err;
- 
-+    REQUEST_SIZE_MATCH(xGLXCreateNewContextReq);
-+
-     if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
- 	return err;
-     if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
-@@ -347,12 +353,15 @@ int __glXDisp_CreateNewContext(__GLXclie
- 
- int __glXDisp_CreateContextWithConfigSGIX(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXCreateContextWithConfigSGIXReq *req = 
- 	(xGLXCreateContextWithConfigSGIXReq *) pc;
-     __GLXconfig *config;
-     __GLXscreen *pGlxScreen;
-     int err;
- 
-+    REQUEST_SIZE_MATCH(xGLXCreateContextWithConfigSGIXReq);
-+
-     if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
- 	return err;
-     if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
-@@ -372,6 +372,7 @@ int __glXDisp_CreateContextWithConfigSGI
- }
- int __glXDisp_DestroyContext(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXDestroyContextReq *req = (xGLXDestroyContextReq *) pc;
-     __GLXcontext *glxc;
-     int err;
-@@ -367,6 +376,8 @@ int __glXDisp_DestroyContext(__GLXclient
-     __GLXcontext *glxc;
-     int err;
- 
-+    REQUEST_SIZE_MATCH(xGLXDestroyContextReq);
-+
-     if (!validGlxContext(cl->client, req->context, DixDestroyAccess,
- 			 &glxc, &err))
- 	    return err;
-@@ -686,24 +697,33 @@ DoMakeCurrent(__GLXclientState *cl,
- 
- int __glXDisp_MakeCurrent(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXMakeCurrentReq *req = (xGLXMakeCurrentReq *) pc;
- 
-+    REQUEST_SIZE_MATCH(xGLXMakeCurrentReq);
-+
-     return DoMakeCurrent( cl, req->drawable, req->drawable,
- 			  req->context, req->oldContextTag );
- }
- 
- int __glXDisp_MakeContextCurrent(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXMakeContextCurrentReq *req = (xGLXMakeContextCurrentReq *) pc;
- 
-+    REQUEST_SIZE_MATCH(xGLXMakeContextCurrentReq);
-+
-     return DoMakeCurrent( cl, req->drawable, req->readdrawable,
- 			  req->context, req->oldContextTag );
- }
- 
- int __glXDisp_MakeCurrentReadSGI(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXMakeCurrentReadSGIReq *req = (xGLXMakeCurrentReadSGIReq *) pc;
- 
-+    REQUEST_SIZE_MATCH(xGLXMakeCurrentReadSGIReq);
-+
-     return DoMakeCurrent( cl, req->drawable, req->readable,
- 			  req->context, req->oldContextTag );
- }
-@@ -716,6 +736,8 @@ int __glXDisp_IsDirect(__GLXclientState
-     __GLXcontext *glxc;
-     int err;
- 
-+    REQUEST_SIZE_MATCH(xGLXIsDirectReq);
-+
-     if (!validGlxContext(cl->client, req->context, DixReadAccess, &glxc, &err))
- 	return err;
- 
-@@ -740,6 +762,8 @@ int __glXDisp_QueryVersion(__GLXclientSt
-     xGLXQueryVersionReply reply;
-     GLuint major, minor;
- 
-+    REQUEST_SIZE_MATCH(xGLXQueryVersionReq);
-+
-     major = req->majorVersion;
-     minor = req->minorVersion;
-     (void)major;
-@@ -766,11 +790,15 @@ int __glXDisp_QueryVersion(__GLXclientSt
- 
- int __glXDisp_WaitGL(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXWaitGLReq *req = (xGLXWaitGLReq *)pc;
--    GLXContextTag tag = req->contextTag;
-+    GLXContextTag tag;
-     __GLXcontext *glxc = NULL;
-     int error;
- 
-+    REQUEST_SIZE_MATCH(xGLXWaitGLReq);
-+
-+    tag = req->contextTag;
-     if (tag) {
- 	glxc = __glXLookupContextByTag(cl, tag);
- 	if (!glxc)
-@@ -790,11 +818,15 @@ int __glXDisp_WaitGL(__GLXclientState *c
- 
- int __glXDisp_WaitX(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXWaitXReq *req = (xGLXWaitXReq *)pc;
--    GLXContextTag tag = req->contextTag;
-+    GLXContextTag tag;
-     __GLXcontext *glxc = NULL;
-     int error;
- 
-+    REQUEST_SIZE_MATCH(xGLXWaitXReq);
-+
-+    tag = req->contextTag;
-     if (tag) {
- 	glxc = __glXLookupContextByTag(cl, tag);
- 	if (!glxc)
-@@ -814,13 +846,21 @@ int __glXDisp_CopyContext(__GLXclientSta
- {
-     ClientPtr client = cl->client;
-     xGLXCopyContextReq *req = (xGLXCopyContextReq *) pc;
--    GLXContextID source = req->source;
--    GLXContextID dest = req->dest;
--    GLXContextTag tag = req->contextTag;
--    unsigned long mask = req->mask;
-+    GLXContextID source;
-+    GLXContextID dest;
-+    GLXContextTag tag;
-+    unsigned long mask;
-+
-     __GLXcontext *src, *dst;
-     int error;
- 
-+    REQUEST_SIZE_MATCH(xGLXCopyContextReq);
-+
-+    source = req->source;
-+    dest = req->dest;
-+    tag = req->contextTag;
-+    mask = req->mask;
-+
-     if (!validGlxContext(cl->client, source, DixReadAccess, &src, &error))
- 	return error;
-     if (!validGlxContext(cl->client, dest, DixWriteAccess, &dst, &error))
-@@ -903,6 +943,8 @@ int __glXDisp_GetVisualConfigs(__GLXclie
-     __GLX_DECLARE_SWAP_VARIABLES;
-     __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXGetVisualConfigsReq);
-+
-     if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
- 	return err;
- 
-@@ -1082,13 +1124,17 @@ DoGetFBConfigs(__GLXclientState *cl, uns
- 
- int __glXDisp_GetFBConfigs(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXGetFBConfigsReq *req = (xGLXGetFBConfigsReq *) pc;
-+    REQUEST_SIZE_MATCH(xGLXGetFBConfigsReq);
-     return DoGetFBConfigs(cl, req->screen);
- }
- 
- int __glXDisp_GetFBConfigsSGIX(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *) pc;
-+    REQUEST_SIZE_MATCH(xGLXGetFBConfigsSGIXReq);
-     return DoGetFBConfigs(cl, req->screen);
- }
- 
-@@ -1214,11 +1260,14 @@ determineTextureTarget(ClientPtr client,
- 
- int __glXDisp_CreateGLXPixmap(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXCreateGLXPixmapReq *req = (xGLXCreateGLXPixmapReq *) pc;
-     __GLXconfig *config;
-     __GLXscreen *pGlxScreen;
-     int err;
- 
-+    REQUEST_SIZE_MATCH(xGLXCreateGLXPixmapReq);
-+
-     if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
- 	return err;
-     if (!validGlxVisual(cl->client, pGlxScreen, req->visual, &config, &err))
-@@ -1230,11 +1279,14 @@ int __glXDisp_CreateGLXPixmap(__GLXclien
- 
- int __glXDisp_CreatePixmap(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXCreatePixmapReq *req = (xGLXCreatePixmapReq *) pc;
-     __GLXconfig *config;
-     __GLXscreen *pGlxScreen;
-     int err;
- 
-+    REQUEST_FIXED_SIZE(xGLXCreatePixmapReq, req->numAttribs << 3);
-+
-     if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
- 	return err;
-     if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
-@@ -1253,12 +1305,15 @@ int __glXDisp_CreatePixmap(__GLXclientSt
- 
- int __glXDisp_CreateGLXPixmapWithConfigSGIX(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXCreateGLXPixmapWithConfigSGIXReq *req = 
- 	(xGLXCreateGLXPixmapWithConfigSGIXReq *) pc;
-     __GLXconfig *config;
-     __GLXscreen *pGlxScreen;
-     int err;
- 
-+    REQUEST_SIZE_MATCH(xGLXCreateGLXPixmapWithConfigSGIXReq);
-+
-     if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
- 	return err;
-     if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
-@@ -1285,15 +1340,21 @@ static int DoDestroyDrawable(__GLXclient
- 
- int __glXDisp_DestroyGLXPixmap(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc;
- 
-+    REQUEST_SIZE_MATCH(xGLXDestroyGLXPixmapReq);
-+
-     return DoDestroyDrawable(cl, req->glxpixmap, GLX_DRAWABLE_PIXMAP);
- }
- 
- int __glXDisp_DestroyPixmap(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXDestroyPixmapReq *req = (xGLXDestroyPixmapReq *) pc;
- 
-+    REQUEST_SIZE_MATCH(xGLXDestroyPixmapReq);
-+
-     return DoDestroyDrawable(cl, req->glxpixmap, GLX_DRAWABLE_PIXMAP);
- }
- 
-@@ -1332,10 +1393,13 @@ DoCreatePbuffer(ClientPtr client, int sc
- 
- int __glXDisp_CreatePbuffer(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXCreatePbufferReq	*req = (xGLXCreatePbufferReq *) pc;
-     CARD32			*attrs;
-     int				 width, height, i;
- 
-+    REQUEST_FIXED_SIZE(xGLXCreatePbufferReq, req->numAttribs << 3);
-+
-     attrs = (CARD32 *) (req + 1);
-     width = 0;
-     height = 0;
-@@ -1361,23 +1425,32 @@ int __glXDisp_CreatePbuffer(__GLXclientS
- 
- int __glXDisp_CreateGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXCreateGLXPbufferSGIXReq *req = (xGLXCreateGLXPbufferSGIXReq *) pc;
- 
-+    REQUEST_SIZE_MATCH(xGLXCreateGLXPbufferSGIXReq);
-+
-     return DoCreatePbuffer(cl->client, req->screen, req->fbconfig,
- 			   req->width, req->height, req->pbuffer);
- }
- 
- int __glXDisp_DestroyPbuffer(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXDestroyPbufferReq *req = (xGLXDestroyPbufferReq *) pc;
- 
-+    REQUEST_SIZE_MATCH(xGLXDestroyPbufferReq);
-+
-     return DoDestroyDrawable(cl, req->pbuffer, GLX_DRAWABLE_PBUFFER);
- }
- 
- int __glXDisp_DestroyGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXDestroyGLXPbufferSGIXReq *req = (xGLXDestroyGLXPbufferSGIXReq *) pc;
- 
-+    REQUEST_SIZE_MATCH(xGLXDestroyGLXPbufferSGIXReq);
-+
-     return DoDestroyDrawable(cl, req->pbuffer, GLX_DRAWABLE_PBUFFER);
- }
- 
-@@ -1408,18 +1481,24 @@ DoChangeDrawableAttributes(ClientPtr cli
- 
- int __glXDisp_ChangeDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXChangeDrawableAttributesReq *req =
- 	(xGLXChangeDrawableAttributesReq *) pc;
- 
-+    REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesReq, req->numAttribs << 3);
-+
-     return DoChangeDrawableAttributes(cl->client, req->drawable,
- 				      req->numAttribs, (CARD32 *) (req + 1));
- }
- 
- int __glXDisp_ChangeDrawableAttributesSGIX(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXChangeDrawableAttributesSGIXReq *req =
- 	(xGLXChangeDrawableAttributesSGIXReq *)pc;
- 
-+    REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesSGIXReq, req->numAttribs << 3);
-+
-     return DoChangeDrawableAttributes(cl->client, req->drawable,
- 				      req->numAttribs, (CARD32 *) (req + 1));
- }
-@@ -1433,6 +1512,8 @@ int __glXDisp_CreateWindow(__GLXclientSt
-     DrawablePtr		 pDraw;
-     int			 err;
- 
-+    REQUEST_FIXED_SIZE(xGLXCreateWindowReq, req->numAttribs << 3);
-+
-     LEGAL_NEW_RESOURCE(req->glxwindow, client);
- 
-     if (!validGlxScreen(client, req->screen, &pGlxScreen, &err))
-@@ -1456,8 +1537,11 @@ int __glXDisp_CreateWindow(__GLXclientSt
- 
- int __glXDisp_DestroyWindow(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc;
- 
-+    REQUEST_SIZE_MATCH(xGLXDestroyWindowReq);
-+
-     return DoDestroyDrawable(cl, req->glxwindow, GLX_DRAWABLE_WINDOW);
- }
- 
-@@ -1473,12 +1557,16 @@ int __glXDisp_SwapBuffers(__GLXclientSta
- {
-     ClientPtr client = cl->client;
-     xGLXSwapBuffersReq *req = (xGLXSwapBuffersReq *) pc;
--    GLXContextTag tag = req->contextTag;
--    XID drawId = req->drawable;
-+    GLXContextTag tag;
-+    XID drawId;
-     __GLXcontext *glxc = NULL;
-     __GLXdrawable *pGlxDraw;
-     int error;
- 
-+    REQUEST_SIZE_MATCH(xGLXSwapBuffersReq);
-+
-+    tag = req->contextTag;
-+    drawId = req->drawable;
-     if (tag) {
- 	glxc = __glXLookupContextByTag(cl, tag);
- 	if (!glxc) {
-@@ -1559,15 +1647,21 @@ DoQueryContext(__GLXclientState *cl, GLX
- 
- int __glXDisp_QueryContextInfoEXT(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXQueryContextInfoEXTReq *req = (xGLXQueryContextInfoEXTReq *) pc;
- 
-+    REQUEST_SIZE_MATCH(xGLXQueryContextInfoEXTReq);
-+
-     return DoQueryContext(cl, req->context);
- }
- 
- int __glXDisp_QueryContext(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXQueryContextReq *req = (xGLXQueryContextReq *) pc;
- 
-+    REQUEST_SIZE_MATCH(xGLXQueryContextReq);
-+
-     return DoQueryContext(cl, req->context);
- }
- 
-@@ -1581,6 +1675,8 @@ int __glXDisp_BindTexImageEXT(__GLXclien
-     int			 buffer;
-     int			 error;
- 
-+    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 8);
-+
-     pc += __GLX_VENDPRIV_HDR_SIZE;
- 
-     drawId = *((CARD32 *) (pc));
-@@ -1615,6 +1711,8 @@ int __glXDisp_ReleaseTexImageEXT(__GLXcl
-     int			 buffer;
-     int			 error;
- 
-+    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 8);
-+
-     pc += __GLX_VENDPRIV_HDR_SIZE;
- 
-     drawId = *((CARD32 *) (pc));
-@@ -1650,6 +1748,8 @@ int __glXDisp_CopySubBufferMESA(__GLXcli
-     (void) client;
-     (void) req;
- 
-+    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 20);
-+
-     pc += __GLX_VENDPRIV_HDR_SIZE;
- 
-     drawId = *((CARD32 *) (pc));
-@@ -1738,16 +1838,22 @@ DoGetDrawableAttributes(__GLXclientState
- 
- int __glXDisp_GetDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXGetDrawableAttributesReq *req = (xGLXGetDrawableAttributesReq *)pc;
- 
-+    REQUEST_SIZE_MATCH(xGLXGetDrawableAttributesReq);
-+
-     return DoGetDrawableAttributes(cl, req->drawable);
- }
- 
- int __glXDisp_GetDrawableAttributesSGIX(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXGetDrawableAttributesSGIXReq *req =
- 	(xGLXGetDrawableAttributesSGIXReq *)pc;
-     
-+    REQUEST_SIZE_MATCH(xGLXGetDrawableAttributesSGIXReq);
-+
-     return DoGetDrawableAttributes(cl, req->drawable);
- }
- 
-@@ -1772,6 +1878,8 @@ int __glXDisp_Render(__GLXclientState *c
-     __GLXcontext *glxc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_AT_LEAST_SIZE(xGLXRenderReq);
-+
-     req = (xGLXRenderReq *) pc;
-     if (client->swapped) {
- 	__GLX_SWAP_SHORT(&req->length);
-@@ -1792,6 +1900,9 @@ int __glXDisp_Render(__GLXclientState *c
- 	__GLXdispatchRenderProcPtr proc;
- 	int err;
- 
-+	if (left < sizeof(__GLXrenderHeader))
-+	    return BadLength;
-+
- 	/*
- 	** Verify that the header length and the overall length agree.
- 	** Also, each command must be word aligned.
-@@ -2302,10 +2413,12 @@ int __glXDisp_HyperpipeConfigSGIX(__GLXc
- 
- int __glXDisp_VendorPrivate(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
-     GLint vendorcode = req->vendorCode;
-     __GLXdispatchVendorPrivProcPtr proc;
- 
-+    REQUEST_AT_LEAST_SIZE(xGLXVendorPrivateReq);
- 
-     proc = (__GLXdispatchVendorPrivProcPtr)
-       __glXGetProtocolDecodeFunction(& VendorPriv_dispatch_info,
-@@ -2321,10 +2434,12 @@ int __glXDisp_VendorPrivate(__GLXclientS
- 
- int __glXDisp_VendorPrivateWithReply(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
-     GLint vendorcode = req->vendorCode;
-     __GLXdispatchVendorPrivProcPtr proc;
- 
-+    REQUEST_AT_LEAST_SIZE(xGLXVendorPrivateReq);
- 
-     proc = (__GLXdispatchVendorPrivProcPtr)
-       __glXGetProtocolDecodeFunction(& VendorPriv_dispatch_info,
-@@ -2347,6 +2462,8 @@ int __glXDisp_QueryExtensionsString(__GL
-     char *buf;
-     int err;
- 
-+    REQUEST_SIZE_MATCH(xGLXQueryExtensionsStringReq);
-+
-     if (!validGlxScreen(client, req->screen, &pGlxScreen, &err))
- 	return err;
- 
-@@ -2386,6 +2503,8 @@ int __glXDisp_QueryServerString(__GLXcli
-     int err;
-     char ver_str[16];
- 
-+    REQUEST_SIZE_MATCH(xGLXQueryServerStringReq);
-+
-     if (!validGlxScreen(client, req->screen, &pGlxScreen, &err))
- 	return err;
- 
-@@ -2433,13 +2552,19 @@ int __glXDisp_QueryServerString(__GLXcli
- 
- int __glXDisp_ClientInfo(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXClientInfoReq *req = (xGLXClientInfoReq *) pc;
-     const char *buf;
-+
-+    REQUEST_AT_LEAST_SIZE(xGLXClientInfoReq);
-+
-+    buf = (const char *)(req+1);
-+    if (!memchr(buf, 0, (client->req_len << 2) - sizeof(xGLXClientInfoReq)))
-+	return BadLength;
-    
-     cl->GLClientmajorVersion = req->major;
-     cl->GLClientminorVersion = req->minor;
-     free(cl->GLClientextensions);
--    buf = (const char *)(req+1);
-     cl->GLClientextensions = strdup(buf);
- 
-     return Success;
diff --git a/contrib/packages/rpm/sle11/SOURCES/U_03-glx-check-request-length-before-swapping.patch b/contrib/packages/rpm/sle11/SOURCES/U_03-glx-check-request-length-before-swapping.patch
deleted file mode 100644
index 947d98c..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/U_03-glx-check-request-length-before-swapping.patch
+++ /dev/null
@@ -1,585 +0,0 @@
-From: Julien Cristau <jcristau@debian.org>
-Date: Sun Aug 22 00:50:05 2010 +0100
-Subject: [PATCH] glx: check request length before swapping
-Patch-Mainline: Upstream
-Git-commit: 6c69235a9dfc52e4b4e47630ff4bab1a820eb543
-References: bnc #648278, CVE-2010-4818
-Signed-off-by: Egbert Eich <eich@suse.de>
-
-Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>
-Reviewed-by: Daniel Stone <daniel@fooishbar.org>
-Signed-off-by: Julien Cristau <jcristau@debian.org>
-
---- xorg-server-1.9.3/glx/glxcmdsswap.c.orig	2010-03-23 18:35:57.000000000 +0100
-+++ xorg-server-1.9.3/glx/glxcmdsswap.c	2012-02-06 15:21:28.000000000 +0100
-@@ -61,9 +61,12 @@
- 
- int __glXDispSwap_CreateContext(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXCreateContextReq *req = (xGLXCreateContextReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXCreateContextReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->context);
-     __GLX_SWAP_INT(&req->visual);
-@@ -75,9 +78,12 @@ int __glXDispSwap_CreateContext(__GLXcli
- 
- int __glXDispSwap_CreateNewContext(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXCreateNewContextReq *req = (xGLXCreateNewContextReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXCreateNewContextReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->context);
-     __GLX_SWAP_INT(&req->fbconfig);
-@@ -90,10 +96,13 @@ int __glXDispSwap_CreateNewContext(__GLX
- 
- int __glXDispSwap_CreateContextWithConfigSGIX(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXCreateContextWithConfigSGIXReq *req =
- 	(xGLXCreateContextWithConfigSGIXReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXCreateContextWithConfigSGIXReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->context);
-     __GLX_SWAP_INT(&req->fbconfig);
-@@ -106,9 +115,12 @@ int __glXDispSwap_CreateContextWithConfi
- 
- int __glXDispSwap_DestroyContext(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXDestroyContextReq *req = (xGLXDestroyContextReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXDestroyContextReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->context);
- 
-@@ -117,9 +129,12 @@ int __glXDispSwap_DestroyContext(__GLXcl
- 
- int __glXDispSwap_MakeCurrent(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXMakeCurrentReq *req = (xGLXMakeCurrentReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXMakeCurrentReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->drawable);
-     __GLX_SWAP_INT(&req->context);
-@@ -130,9 +145,12 @@ int __glXDispSwap_MakeCurrent(__GLXclien
- 
- int __glXDispSwap_MakeContextCurrent(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXMakeContextCurrentReq *req = (xGLXMakeContextCurrentReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXMakeContextCurrentReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->drawable);
-     __GLX_SWAP_INT(&req->readdrawable);
-@@ -144,9 +162,12 @@ int __glXDispSwap_MakeContextCurrent(__G
- 
- int __glXDispSwap_MakeCurrentReadSGI(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXMakeCurrentReadSGIReq *req = (xGLXMakeCurrentReadSGIReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXMakeCurrentReadSGIReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->drawable);
-     __GLX_SWAP_INT(&req->readable);
-@@ -158,9 +179,12 @@ int __glXDispSwap_MakeCurrentReadSGI(__G
- 
- int __glXDispSwap_IsDirect(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXIsDirectReq *req = (xGLXIsDirectReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXIsDirectReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->context);
- 
-@@ -169,9 +193,12 @@ int __glXDispSwap_IsDirect(__GLXclientSt
- 
- int __glXDispSwap_QueryVersion(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXQueryVersionReq *req = (xGLXQueryVersionReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXQueryVersionReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->majorVersion);
-     __GLX_SWAP_INT(&req->minorVersion);
-@@ -181,9 +208,12 @@ int __glXDispSwap_QueryVersion(__GLXclie
- 
- int __glXDispSwap_WaitGL(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXWaitGLReq *req = (xGLXWaitGLReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXWaitGLReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->contextTag);
- 
-@@ -192,9 +222,12 @@ int __glXDispSwap_WaitGL(__GLXclientStat
- 
- int __glXDispSwap_WaitX(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXWaitXReq *req = (xGLXWaitXReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXWaitXReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->contextTag);
- 
-@@ -203,9 +236,12 @@ int __glXDispSwap_WaitX(__GLXclientState
- 
- int __glXDispSwap_CopyContext(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXCopyContextReq *req = (xGLXCopyContextReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXCopyContextReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->source);
-     __GLX_SWAP_INT(&req->dest);
-@@ -216,36 +252,48 @@ int __glXDispSwap_CopyContext(__GLXclien
- 
- int __glXDispSwap_GetVisualConfigs(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXGetVisualConfigsReq *req = (xGLXGetVisualConfigsReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXGetVisualConfigsReq);
-+
-     __GLX_SWAP_INT(&req->screen);
-     return __glXDisp_GetVisualConfigs(cl, pc);
- }
- 
- int __glXDispSwap_GetFBConfigs(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXGetFBConfigsReq *req = (xGLXGetFBConfigsReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXGetFBConfigsReq);
-+
-     __GLX_SWAP_INT(&req->screen);
-     return __glXDisp_GetFBConfigs(cl, pc);
- }
- 
- int __glXDispSwap_GetFBConfigsSGIX(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXGetFBConfigsSGIXReq);
-+
-     __GLX_SWAP_INT(&req->screen);
-     return __glXDisp_GetFBConfigsSGIX(cl, pc);
- }
- 
- int __glXDispSwap_CreateGLXPixmap(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXCreateGLXPixmapReq *req = (xGLXCreateGLXPixmapReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXCreateGLXPixmapReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->screen);
-     __GLX_SWAP_INT(&req->visual);
-@@ -257,17 +305,22 @@ int __glXDispSwap_CreateGLXPixmap(__GLXc
- 
- int __glXDispSwap_CreatePixmap(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXCreatePixmapReq *req = (xGLXCreatePixmapReq *) pc;
-     CARD32 *attribs;
-     __GLX_DECLARE_SWAP_VARIABLES;
-     __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
- 
-+    REQUEST_AT_LEAST_SIZE(xGLXCreatePixmapReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->screen);
-     __GLX_SWAP_INT(&req->fbconfig);
-     __GLX_SWAP_INT(&req->pixmap);
-     __GLX_SWAP_INT(&req->glxpixmap);
-     __GLX_SWAP_INT(&req->numAttribs);
-+
-+    REQUEST_FIXED_SIZE(xGLXCreatePixmapReq, req->numAttribs << 3);
-     attribs = (CARD32*)(req + 1);
-     __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs);
- 
-@@ -276,10 +329,13 @@ int __glXDispSwap_CreatePixmap(__GLXclie
- 
- int __glXDispSwap_CreateGLXPixmapWithConfigSGIX(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXCreateGLXPixmapWithConfigSGIXReq *req = 
- 	(xGLXCreateGLXPixmapWithConfigSGIXReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXCreateGLXPixmapWithConfigSGIXReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->screen);
-     __GLX_SWAP_INT(&req->fbconfig);
-@@ -291,9 +347,12 @@ int __glXDispSwap_CreateGLXPixmapWithCon
- 
- int __glXDispSwap_DestroyGLXPixmap(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXDestroyGLXPixmapReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->glxpixmap);
- 
-@@ -302,9 +361,12 @@ int __glXDispSwap_DestroyGLXPixmap(__GLX
- 
- int __glXDispSwap_DestroyPixmap(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXDestroyGLXPixmapReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->glxpixmap);
- 
-@@ -313,9 +375,12 @@ int __glXDispSwap_DestroyPixmap(__GLXcli
- 
- int __glXDispSwap_QueryContext(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXQueryContextReq *req = (xGLXQueryContextReq *) pc;    
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXQueryContextReq);
-+
-     __GLX_SWAP_INT(&req->context);
- 
-     return __glXDisp_QueryContext(cl, pc);
-@@ -323,15 +388,20 @@ int __glXDispSwap_QueryContext(__GLXclie
- 
- int __glXDispSwap_CreatePbuffer(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXCreatePbufferReq *req = (xGLXCreatePbufferReq *) pc;    
-     __GLX_DECLARE_SWAP_VARIABLES;
-     __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-     CARD32 *attribs;
- 
-+    REQUEST_AT_LEAST_SIZE(xGLXCreatePbufferReq);
-+
-     __GLX_SWAP_INT(&req->screen);
-     __GLX_SWAP_INT(&req->fbconfig);
-     __GLX_SWAP_INT(&req->pbuffer);
-     __GLX_SWAP_INT(&req->numAttribs);
-+
-+    REQUEST_FIXED_SIZE(xGLXCreatePbufferReq, req->numAttribs << 3);
-     attribs = (CARD32*)(req + 1);
-     __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs);
- 
-@@ -340,9 +410,12 @@ int __glXDispSwap_CreatePbuffer(__GLXcli
- 
- int __glXDispSwap_CreateGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXCreateGLXPbufferSGIXReq *req = (xGLXCreateGLXPbufferSGIXReq *) pc;    
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXCreateGLXPbufferSGIXReq);
-+
-     __GLX_SWAP_INT(&req->screen);
-     __GLX_SWAP_INT(&req->fbconfig);
-     __GLX_SWAP_INT(&req->pbuffer);
-@@ -354,9 +427,12 @@ int __glXDispSwap_CreateGLXPbufferSGIX(_
- 
- int __glXDispSwap_DestroyPbuffer(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXDestroyPbufferReq *req = (xGLXDestroyPbufferReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXDestroyPbufferReq);
-+
-     __GLX_SWAP_INT(&req->pbuffer);
- 
-     return __glXDisp_DestroyPbuffer(cl, pc);
-@@ -366,22 +442,31 @@ int __glXDispSwap_DestroyGLXPbufferSGIX(
- {
-     xGLXDestroyGLXPbufferSGIXReq *req = (xGLXDestroyGLXPbufferSGIXReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
-+    ClientPtr client = cl->client;
- 
-     __GLX_SWAP_INT(&req->pbuffer);
- 
-+    REQUEST_SIZE_MATCH(xGLXDestroyPbufferReq);
-+
-+    __GLX_SWAP_INT(&req->pbuffer);
-     return __glXDisp_DestroyGLXPbufferSGIX(cl, pc);
- }
- 
- int __glXDispSwap_ChangeDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXChangeDrawableAttributesReq *req =
- 	(xGLXChangeDrawableAttributesReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
-     __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-     CARD32 *attribs;
- 
-+    REQUEST_AT_LEAST_SIZE(xGLXChangeDrawableAttributesReq);
-+
-     __GLX_SWAP_INT(&req->drawable);
-     __GLX_SWAP_INT(&req->numAttribs);
-+
-+    REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesReq, req->numAttribs << 3);
-     attribs = (CARD32*)(req + 1);
-     __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs);
- 
-@@ -391,14 +476,19 @@ int __glXDispSwap_ChangeDrawableAttribut
- int __glXDispSwap_ChangeDrawableAttributesSGIX(__GLXclientState *cl,
- 					       GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXChangeDrawableAttributesSGIXReq *req =
- 	(xGLXChangeDrawableAttributesSGIXReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
-     __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-     CARD32 *attribs;
- 
-+    REQUEST_AT_LEAST_SIZE(xGLXChangeDrawableAttributesSGIXReq);
-+
-     __GLX_SWAP_INT(&req->drawable);
-     __GLX_SWAP_INT(&req->numAttribs);
-+
-+    REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesSGIXReq, req->numAttribs << 3);
-     attribs = (CARD32*)(req + 1);
-     __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs);
- 
-@@ -407,16 +497,21 @@ int __glXDispSwap_ChangeDrawableAttribut
- 
- int __glXDispSwap_CreateWindow(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXCreateWindowReq *req = (xGLXCreateWindowReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
-     __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-     CARD32 *attribs;
- 
-+    REQUEST_AT_LEAST_SIZE(xGLXCreateWindowReq);
-+
-     __GLX_SWAP_INT(&req->screen);
-     __GLX_SWAP_INT(&req->fbconfig);
-     __GLX_SWAP_INT(&req->window);
-     __GLX_SWAP_INT(&req->glxwindow);
-     __GLX_SWAP_INT(&req->numAttribs);
-+
-+    REQUEST_FIXED_SIZE(xGLXCreateWindowReq, req->numAttribs << 3);
-     attribs = (CARD32*)(req + 1);
-     __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs);
- 
-@@ -425,9 +520,12 @@ int __glXDispSwap_CreateWindow(__GLXclie
- 
- int __glXDispSwap_DestroyWindow(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXDestroyWindowReq);
-+
-     __GLX_SWAP_INT(&req->glxwindow);
- 
-     return __glXDisp_DestroyWindow(cl, pc);
-@@ -435,9 +533,12 @@ int __glXDispSwap_DestroyWindow(__GLXcli
- 
- int __glXDispSwap_SwapBuffers(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXSwapBuffersReq *req = (xGLXSwapBuffersReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXSwapBuffersReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->contextTag);
-     __GLX_SWAP_INT(&req->drawable);
-@@ -447,9 +548,12 @@ int __glXDispSwap_SwapBuffers(__GLXclien
- 
- int __glXDispSwap_UseXFont(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXUseXFontReq *req = (xGLXUseXFontReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXUseXFontReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->contextTag);
-     __GLX_SWAP_INT(&req->font);
-@@ -463,9 +567,12 @@ int __glXDispSwap_UseXFont(__GLXclientSt
- 
- int __glXDispSwap_QueryExtensionsString(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXQueryExtensionsStringReq *req = (xGLXQueryExtensionsStringReq *)pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXQueryExtensionsStringReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->screen);
- 
-@@ -474,9 +581,12 @@ int __glXDispSwap_QueryExtensionsString(
- 
- int __glXDispSwap_QueryServerString(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXQueryServerStringReq *req = (xGLXQueryServerStringReq *)pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXQueryServerStringReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->screen);
-     __GLX_SWAP_INT(&req->name);
-@@ -486,9 +596,12 @@ int __glXDispSwap_QueryServerString(__GL
- 
- int __glXDispSwap_ClientInfo(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXClientInfoReq *req = (xGLXClientInfoReq *)pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_AT_LEAST_SIZE(xGLXClientInfoReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->major);
-     __GLX_SWAP_INT(&req->minor);
-@@ -499,9 +612,12 @@ int __glXDispSwap_ClientInfo(__GLXclient
- 
- int __glXDispSwap_QueryContextInfoEXT(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXQueryContextInfoEXTReq *req = (xGLXQueryContextInfoEXTReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXQueryContextInfoEXTReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->context);
- 
-@@ -510,12 +626,14 @@ int __glXDispSwap_QueryContextInfoEXT(__
- 
- int __glXDispSwap_BindTexImageEXT(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
-     GLXDrawable		 *drawId;
-     int			 *buffer;
--    
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 8);
-+
-     pc += __GLX_VENDPRIV_HDR_SIZE;
- 
-     drawId = ((GLXDrawable *) (pc));
-@@ -531,12 +649,14 @@ int __glXDispSwap_BindTexImageEXT(__GLXc
- 
- int __glXDispSwap_ReleaseTexImageEXT(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
-     GLXDrawable		 *drawId;
-     int			 *buffer;
--    
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 8);
-+
-     pc += __GLX_VENDPRIV_HDR_SIZE;
- 
-     drawId = ((GLXDrawable *) (pc));
-@@ -552,12 +672,14 @@ int __glXDispSwap_ReleaseTexImageEXT(__G
- 
- int __glXDispSwap_CopySubBufferMESA(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
-     GLXDrawable		 *drawId;
-     int			 *buffer;
--
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 20);
-+
-     (void) drawId;
-     (void) buffer;
- 
-@@ -577,11 +699,13 @@ int __glXDispSwap_CopySubBufferMESA(__GL
- 
- int __glXDispSwap_GetDrawableAttributesSGIX(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXVendorPrivateWithReplyReq *req = (xGLXVendorPrivateWithReplyReq *)pc;
-     CARD32 *data;
--    
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXGetDrawableAttributesSGIXReq);
-+
-     data = (CARD32 *) (req + 1);
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->contextTag);
-@@ -592,10 +716,12 @@ int __glXDispSwap_GetDrawableAttributesS
- 
- int __glXDispSwap_GetDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
- {
-+    ClientPtr client = cl->client;
-     xGLXGetDrawableAttributesReq *req = (xGLXGetDrawableAttributesReq *)pc;
--    
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
-+    REQUEST_SIZE_MATCH(xGLXGetDrawableAttributesReq);
-+
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->drawable);
- 
diff --git a/contrib/packages/rpm/sle11/SOURCES/U_04-glx-swap-the-request-arrays-entirely-not-just-half-of-them.patch b/contrib/packages/rpm/sle11/SOURCES/U_04-glx-swap-the-request-arrays-entirely-not-just-half-of-them.patch
deleted file mode 100644
index 0350dd9..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/U_04-glx-swap-the-request-arrays-entirely-not-just-half-of-them.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From: Julien Cristau <jcristau@debian.org>
-Date: Sun Aug 22 16:20:45 2010 +0100
-Subject: [PATCH] glx: swap the request arrays entirely, not just half of them
-Patch-Mainline: Upstream
-Git-commit: 62319e8381ebd645ae36b25e5fc3c0e9b098387b
-References: bnc #648278, CVE-2010-4818
-Signed-off-by: Egbert Eich <eich@suse.de>
-
-Various glx requests include a list of pairs of attributes.  We were
-only swapping the first half.
-
-Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>
-Reviewed-by: Daniel Stone <daniel@fooishbar.org>
-Signed-off-by: Julien Cristau <jcristau@debian.org>
----
- glx/glxcmdsswap.c |   10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
---- xorg-server-1.6.5.orig/glx/glxcmdsswap.c
-+++ xorg-server-1.6.5/glx/glxcmdsswap.c
-@@ -324,7 +324,7 @@ int __glXDispSwap_CreatePixmap(__GLXclie
- 
-     REQUEST_FIXED_SIZE(xGLXCreatePixmapReq, req->numAttribs << 3);
-     attribs = (CARD32*)(req + 1);
--    __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs);
-+    __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
- 
-     return __glXDisp_CreatePixmap(cl, pc);
- }
-@@ -405,7 +405,7 @@ int __glXDispSwap_CreatePbuffer(__GLXcli
- 
-     REQUEST_FIXED_SIZE(xGLXCreatePbufferReq, req->numAttribs << 3);
-     attribs = (CARD32*)(req + 1);
--    __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs);
-+    __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
- 
-     return __glXDisp_CreatePbuffer(cl, pc);
- }
-@@ -470,7 +470,7 @@ int __glXDispSwap_ChangeDrawableAttribut
- 
-     REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesReq, req->numAttribs << 3);
-     attribs = (CARD32*)(req + 1);
--    __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs);
-+    __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
- 
-     return __glXDisp_ChangeDrawableAttributes(cl, pc);
- }
-@@ -492,7 +492,7 @@ int __glXDispSwap_ChangeDrawableAttribut
- 
-     REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesSGIXReq, req->numAttribs << 3);
-     attribs = (CARD32*)(req + 1);
--    __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs);
-+    __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
- 
-     return __glXDisp_ChangeDrawableAttributesSGIX(cl, pc);
- }
-@@ -515,7 +515,7 @@ int __glXDispSwap_CreateWindow(__GLXclie
- 
-     REQUEST_FIXED_SIZE(xGLXCreateWindowReq, req->numAttribs << 3);
-     attribs = (CARD32*)(req + 1);
--    __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs);
-+    __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
- 
-     return __glXDisp_CreateWindow(cl, pc);
- }
diff --git a/contrib/packages/rpm/sle11/SOURCES/U_05-glx-validate-numAttribs-field-before-using-it.patch b/contrib/packages/rpm/sle11/SOURCES/U_05-glx-validate-numAttribs-field-before-using-it.patch
deleted file mode 100644
index eaf4e09..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/U_05-glx-validate-numAttribs-field-before-using-it.patch
+++ /dev/null
@@ -1,131 +0,0 @@
-From: Julien Cristau <jcristau@debian.org>
-Date: Wed Nov 10 22:39:54 2010 +0100
-Subject: [PATCH] glx: validate numAttribs field before using it
-Patch-Mainline: Upstream
-Git-commit: d9225b9602c85603ae616a7381c784f5cf5e811c
-References: bnc #648278, CVE-2010-4818
-Signed-off-by: Egbert Eich <eich@suse.de>
-
-Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>
-Reviewed-by: Daniel Stone <daniel@fooishbar.org>
-Signed-off-by: Julien Cristau <jcristau@debian.org>
-
---- xorg-server-1.6.5.orig/glx/glxcmdsswap.c
-+++ xorg-server-1.6.5/glx/glxcmdsswap.c
-@@ -322,6 +322,10 @@ int __glXDispSwap_CreatePixmap(__GLXclie
-     __GLX_SWAP_INT(&req->glxpixmap);
-     __GLX_SWAP_INT(&req->numAttribs);
- 
-+    if (req->numAttribs > (UINT32_MAX >> 3)) {
-+	client->errorValue = req->numAttribs;
-+	return BadValue;
-+    }
-     REQUEST_FIXED_SIZE(xGLXCreatePixmapReq, req->numAttribs << 3);
-     attribs = (CARD32*)(req + 1);
-     __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
-@@ -403,6 +407,10 @@ int __glXDispSwap_CreatePbuffer(__GLXcli
-     __GLX_SWAP_INT(&req->pbuffer);
-     __GLX_SWAP_INT(&req->numAttribs);
- 
-+    if (req->numAttribs > (UINT32_MAX >> 3)) {
-+	client->errorValue = req->numAttribs;
-+	return BadValue;
-+    }
-     REQUEST_FIXED_SIZE(xGLXCreatePbufferReq, req->numAttribs << 3);
-     attribs = (CARD32*)(req + 1);
-     __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
-@@ -468,6 +476,10 @@ int __glXDispSwap_ChangeDrawableAttribut
-     __GLX_SWAP_INT(&req->drawable);
-     __GLX_SWAP_INT(&req->numAttribs);
- 
-+    if (req->numAttribs > (UINT32_MAX >> 3)) {
-+	client->errorValue = req->numAttribs;
-+	return BadValue;
-+    }
-     REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesReq, req->numAttribs << 3);
-     attribs = (CARD32*)(req + 1);
-     __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
-@@ -490,6 +502,10 @@ int __glXDispSwap_ChangeDrawableAttribut
-     __GLX_SWAP_INT(&req->drawable);
-     __GLX_SWAP_INT(&req->numAttribs);
- 
-+    if (req->numAttribs > (UINT32_MAX >> 3)) {
-+	client->errorValue = req->numAttribs;
-+	return BadValue;
-+    }
-     REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesSGIXReq, req->numAttribs << 3);
-     attribs = (CARD32*)(req + 1);
-     __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
-@@ -513,6 +529,10 @@ int __glXDispSwap_CreateWindow(__GLXclie
-     __GLX_SWAP_INT(&req->glxwindow);
-     __GLX_SWAP_INT(&req->numAttribs);
- 
-+    if (req->numAttribs > (UINT32_MAX >> 3)) {
-+	client->errorValue = req->numAttribs;
-+	return BadValue;
-+    }
-     REQUEST_FIXED_SIZE(xGLXCreateWindowReq, req->numAttribs << 3);
-     attribs = (CARD32*)(req + 1);
-     __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
---- xorg-server-1.9.3/glx/glxcmds.c.orig	2012-02-06 15:24:13.000000000 +0100
-+++ xorg-server-1.9.3/glx/glxcmds.c	2012-02-06 15:26:23.000000000 +0100
-@@ -1285,6 +1285,11 @@ int __glXDisp_CreatePixmap(__GLXclientSt
-     __GLXscreen *pGlxScreen;
-     int err;
- 
-+    REQUEST_AT_LEAST_SIZE(xGLXCreatePixmapReq);
-+    if (req->numAttribs > (UINT32_MAX >> 3)) {
-+	client->errorValue = req->numAttribs;
-+	return BadValue;
-+    }
-     REQUEST_FIXED_SIZE(xGLXCreatePixmapReq, req->numAttribs << 3);
- 
-     if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
-@@ -1398,6 +1403,11 @@ int __glXDisp_CreatePbuffer(__GLXclientS
-     CARD32			*attrs;
-     int				 width, height, i;
- 
-+    REQUEST_AT_LEAST_SIZE(xGLXCreatePbufferReq);
-+    if (req->numAttribs > (UINT32_MAX >> 3)) {
-+	client->errorValue = req->numAttribs;
-+	return BadValue;
-+    }
-     REQUEST_FIXED_SIZE(xGLXCreatePbufferReq, req->numAttribs << 3);
- 
-     attrs = (CARD32 *) (req + 1);
-@@ -1485,6 +1495,11 @@ int __glXDisp_ChangeDrawableAttributes(_
-     xGLXChangeDrawableAttributesReq *req =
- 	(xGLXChangeDrawableAttributesReq *) pc;
- 
-+    REQUEST_AT_LEAST_SIZE(xGLXChangeDrawableAttributesReq);
-+    if (req->numAttribs > (UINT32_MAX >> 3)) {
-+	client->errorValue = req->numAttribs;
-+	return BadValue;
-+    }
-     REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesReq, req->numAttribs << 3);
- 
-     return DoChangeDrawableAttributes(cl->client, req->drawable,
-@@ -1497,6 +1512,11 @@ int __glXDisp_ChangeDrawableAttributesSG
-     xGLXChangeDrawableAttributesSGIXReq *req =
- 	(xGLXChangeDrawableAttributesSGIXReq *)pc;
- 
-+    REQUEST_AT_LEAST_SIZE(xGLXChangeDrawableAttributesSGIXReq);
-+    if (req->numAttribs > (UINT32_MAX >> 3)) {
-+	client->errorValue = req->numAttribs;
-+	return BadValue;
-+    }
-     REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesSGIXReq, req->numAttribs << 3);
- 
-     return DoChangeDrawableAttributes(cl->client, req->drawable,
-@@ -1512,6 +1532,11 @@ int __glXDisp_CreateWindow(__GLXclientSt
-     DrawablePtr		 pDraw;
-     int			 err;
- 
-+    REQUEST_AT_LEAST_SIZE(xGLXCreateWindowReq);
-+    if (req->numAttribs > (UINT32_MAX >> 3)) {
-+	client->errorValue = req->numAttribs;
-+	return BadValue;
-+    }
-     REQUEST_FIXED_SIZE(xGLXCreateWindowReq, req->numAttribs << 3);
- 
-     LEGAL_NEW_RESOURCE(req->glxwindow, client);
diff --git a/contrib/packages/rpm/sle11/SOURCES/U_06-glx-fix-request-length-check-for-CreateGLXPbufferSGIX.patch b/contrib/packages/rpm/sle11/SOURCES/U_06-glx-fix-request-length-check-for-CreateGLXPbufferSGIX.patch
deleted file mode 100644
index 17349b6..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/U_06-glx-fix-request-length-check-for-CreateGLXPbufferSGIX.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From: Julien Cristau <jcristau@debian.org>
-Date: Sun Jan 23 17:05:26 2011 +0100
-Subject: [PATCH] glx: fix request length check for CreateGLXPbufferSGIX
-Patch-Mainline: Upstream
-Git-commit: a883cf1545abd89bb2cadfa659718884b56fd234
-References: bnc #648278, CVE-2010-4818
-Signed-off-by: Egbert Eich <eich@suse.de>
-
-The request is followed by an attribute list.
-
-Signed-off-by: Julien Cristau <jcristau@debian.org>
-Reviewed-by: Adam Jackson <ajax@redhat.com>
----
- glx/glxcmds.c     |    2 +-
- glx/glxcmdsswap.c |    2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
---- xorg-server-1.6.5.orig/glx/glxcmds.c
-+++ xorg-server-1.6.5/glx/glxcmds.c
-@@ -1411,7 +1411,7 @@ int __glXDisp_CreateGLXPbufferSGIX(__GLX
-     ClientPtr client = cl->client;
-     xGLXCreateGLXPbufferSGIXReq *req = (xGLXCreateGLXPbufferSGIXReq *) pc;
- 
--    REQUEST_SIZE_MATCH(xGLXCreateGLXPbufferSGIXReq);
-+    REQUEST_AT_LEAST_SIZE(xGLXCreateGLXPbufferSGIXReq);
- 
-     return DoCreatePbuffer(cl->client, req->screen, req->fbconfig,
- 			   req->width, req->height, req->pbuffer);
---- xorg-server-1.6.5.orig/glx/glxcmdsswap.c
-+++ xorg-server-1.6.5/glx/glxcmdsswap.c
-@@ -424,7 +424,7 @@ int __glXDispSwap_CreateGLXPbufferSGIX(_
-     xGLXCreateGLXPbufferSGIXReq *req = (xGLXCreateGLXPbufferSGIXReq *) pc;    
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
--    REQUEST_SIZE_MATCH(xGLXCreateGLXPbufferSGIXReq);
-+    REQUEST_AT_LEAST_SIZE(xGLXCreateGLXPbufferSGIXReq);
- 
-     __GLX_SWAP_INT(&req->screen);
-     __GLX_SWAP_INT(&req->fbconfig);
diff --git a/contrib/packages/rpm/sle11/SOURCES/U_07-glx-fix-BindTexImageEXT-length-check.patch b/contrib/packages/rpm/sle11/SOURCES/U_07-glx-fix-BindTexImageEXT-length-check.patch
deleted file mode 100644
index c8054cf..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/U_07-glx-fix-BindTexImageEXT-length-check.patch
+++ /dev/null
@@ -1,72 +0,0 @@
-From: Julien Cristau <jcristau@debian.org>
-Date: Wed Jan 26 13:06:53 2011 +0100
-Subject: [PATCH] glx: fix BindTexImageEXT length check
-Patch-Mainline: Upstream
-Git-commit: 1137c11be0f82049d28024eaf963c6f76e0d4334
-References: bnc #648278, CVE-2010-4818
-Signed-off-by: Egbert Eich <eich@suse.de>
-
-The request is followed by a list of attributes.
-
-X.Org bug#33449
-
-Reported-and-tested-by: meng <mengmeng.meng@intel.com>
-Signed-off-by: Julien Cristau <jcristau@debian.org>
-Reviewed-by: Adam Jackson <ajax@redhat.com>
----
- glx/glxcmds.c     |   10 +++++++++-
- glx/glxcmdsswap.c |    6 +++++-
- 2 files changed, 14 insertions(+), 2 deletions(-)
-
---- xorg-server-1.6.5.orig/glx/glxcmds.c
-+++ xorg-server-1.6.5/glx/glxcmds.c
-@@ -1668,13 +1668,21 @@ int __glXDisp_BindTexImageEXT(__GLXclien
-     GLXDrawable		 drawId;
-     int			 buffer;
-     int			 error;
-+    CARD32		 num_attribs;
- 
--    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 8);
-+    if ((sizeof(xGLXVendorPrivateReq) + 12) >> 2 > client->req_len)
-+	return BadLength;
- 
-     pc += __GLX_VENDPRIV_HDR_SIZE;
- 
-     drawId = *((CARD32 *) (pc));
-     buffer = *((INT32 *)  (pc + 4));
-+    num_attribs = *((CARD32 *) (pc + 8));
-+    if (num_attribs > (UINT32_MAX >> 3)) {
-+	client->errorValue = num_attribs;
-+	return BadValue;
-+    }
-+    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 12 + (num_attribs << 3));
- 
-     if (buffer != GLX_FRONT_LEFT_EXT)
- 	return __glXError(GLXBadPixmap);
---- xorg-server-1.6.5.orig/glx/glxcmdsswap.c
-+++ xorg-server-1.6.5/glx/glxcmdsswap.c
-@@ -652,19 +652,23 @@ int __glXDispSwap_BindTexImageEXT(__GLXc
-     xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
-     GLXDrawable		 *drawId;
-     int			 *buffer;
-+    CARD32		 *num_attribs;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
--    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 8);
-+    if ((sizeof(xGLXVendorPrivateReq) + 12) >> 2 > client->req_len)
-+	return BadLength;
- 
-     pc += __GLX_VENDPRIV_HDR_SIZE;
- 
-     drawId = ((GLXDrawable *) (pc));
-     buffer = ((int *)	      (pc + 4));
-+    num_attribs = ((CARD32 *) (pc + 8));
-     
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->contextTag);
-     __GLX_SWAP_INT(drawId);
-     __GLX_SWAP_INT(buffer);
-+    __GLX_SWAP_INT(num_attribs);
- 
-     return __glXDisp_BindTexImageEXT(cl, (GLbyte *)pc);
- }
diff --git a/contrib/packages/rpm/sle11/SOURCES/U_08-glx-Work-around-wrong-request-lengths-sent-by-mesa.patch b/contrib/packages/rpm/sle11/SOURCES/U_08-glx-Work-around-wrong-request-lengths-sent-by-mesa.patch
deleted file mode 100644
index 2671dc4..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/U_08-glx-Work-around-wrong-request-lengths-sent-by-mesa.patch
+++ /dev/null
@@ -1,129 +0,0 @@
-From: Julien Cristau <jcristau@debian.org>
-Date: Sun Jan 23 13:35:54 2011 +0100
-Subject: [PATCH] glx: Work around wrong request lengths sent by mesa
-Patch-Mainline: Upstream
-Git-commit: 402b329c3aa8ddbebaa1f593306a02d4cd6fed26
-References: bnc #648278, CVE-2010-4818
-Signed-off-by: Egbert Eich <eich@suse.de>
-
-mesa used to send too long requests for GLXDestroyPixmap,
-GLXDestroyWindow, GLXChangeDrawableAttributes, GLXGetDrawableAttributes
-and GLXGetFBConfigsSGIX.
-
-Fixes a regression introduced in ec9c97c6bf70b523bc500bd3adf62176f1bb33a4
-X.Org bug#33324 <https://bugs.freedesktop.org/show_bug.cgi?id=33324>
-
-Reported-by: xunx.fang@intel.com
-Signed-off-by: Julien Cristau <jcristau@debian.org>
-Reviewed-by: Adam Jackson <ajax@redhat.com>
----
- glx/glxcmds.c     |   19 +++++++++++++++----
- glx/glxcmdsswap.c |   12 +++++++-----
- 2 files changed, 22 insertions(+), 9 deletions(-)
-
---- xorg-server-1.6.5.orig/glx/glxcmds.c
-+++ xorg-server-1.6.5/glx/glxcmds.c
-@@ -1113,7 +1113,8 @@ int __glXDisp_GetFBConfigsSGIX(__GLXclie
- {
-     ClientPtr client = cl->client;
-     xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *) pc;
--    REQUEST_SIZE_MATCH(xGLXGetFBConfigsSGIXReq);
-+    /* work around mesa bug, don't use REQUEST_SIZE_MATCH */
-+    REQUEST_AT_LEAST_SIZE(xGLXGetFBConfigsSGIXReq);
-     return DoGetFBConfigs(cl, req->screen);
- }
- 
-@@ -1341,7 +1342,9 @@ int __glXDisp_DestroyPixmap(__GLXclientS
-     ClientPtr client = cl->client;
-     xGLXDestroyPixmapReq *req = (xGLXDestroyPixmapReq *) pc;
- 
--    REQUEST_SIZE_MATCH(xGLXDestroyPixmapReq);
-+    /* should be REQUEST_SIZE_MATCH, but mesa's glXDestroyPixmap used to set
-+     * length to 3 instead of 2 */
-+    REQUEST_AT_LEAST_SIZE(xGLXDestroyPixmapReq);
- 
-     return DoDestroyDrawable(cl, req->glxpixmap, GLX_DRAWABLE_PIXMAP);
- }
-@@ -1470,7 +1473,13 @@ int __glXDisp_ChangeDrawableAttributes(_
- 	client->errorValue = req->numAttribs;
- 	return BadValue;
-     }
-+#if 0
-+    /* mesa sends an additional 8 bytes */
-     REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesReq, req->numAttribs << 3);
-+#else
-+    if (((sizeof(xGLXChangeDrawableAttributesReq) + (req->numAttribs << 3)) >> 2) < client->req_len)
-+	    return BadLength;
-+#endif
- 
-     return DoChangeDrawableAttributes(cl->client, req->drawable,
- 				      req->numAttribs, (CARD32 *) (req + 1));
-@@ -1532,7 +1541,8 @@ int __glXDisp_DestroyWindow(__GLXclientS
-     ClientPtr client = cl->client;
-     xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc;
- 
--    REQUEST_SIZE_MATCH(xGLXDestroyWindowReq);
-+    /* mesa's glXDestroyWindow used to set length to 3 instead of 2 */
-+    REQUEST_AT_LEAST_SIZE(xGLXDestroyWindowReq);
- 
-     return DoDestroyDrawable(cl, req->glxwindow, GLX_DRAWABLE_WINDOW);
- }
-@@ -1849,7 +1859,8 @@ int __glXDisp_GetDrawableAttributes(__GL
-     ClientPtr client = cl->client;
-     xGLXGetDrawableAttributesReq *req = (xGLXGetDrawableAttributesReq *)pc;
- 
--    REQUEST_SIZE_MATCH(xGLXGetDrawableAttributesReq);
-+    /* this should be REQUEST_SIZE_MATCH, but mesa sends an additional 4 bytes */
-+    REQUEST_AT_LEAST_SIZE(xGLXGetDrawableAttributesReq);
- 
-     return DoGetDrawableAttributes(cl, req->drawable);
- }
---- xorg-server-1.6.5.orig/glx/glxcmdsswap.c
-+++ xorg-server-1.6.5/glx/glxcmdsswap.c
-@@ -282,7 +282,7 @@ int __glXDispSwap_GetFBConfigsSGIX(__GLX
-     xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
--    REQUEST_SIZE_MATCH(xGLXGetFBConfigsSGIXReq);
-+    REQUEST_AT_LEAST_SIZE(xGLXGetFBConfigsSGIXReq);
- 
-     __GLX_SWAP_INT(&req->screen);
-     return __glXDisp_GetFBConfigsSGIX(cl, pc);
-@@ -371,7 +371,7 @@ int __glXDispSwap_DestroyPixmap(__GLXcli
-     xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
--    REQUEST_SIZE_MATCH(xGLXDestroyGLXPixmapReq);
-+    REQUEST_AT_LEAST_SIZE(xGLXDestroyGLXPixmapReq);
- 
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->glxpixmap);
-@@ -480,7 +480,9 @@ int __glXDispSwap_ChangeDrawableAttribut
- 	client->errorValue = req->numAttribs;
- 	return BadValue;
-     }
--    REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesReq, req->numAttribs << 3);
-+    if (((sizeof(xGLXChangeDrawableAttributesReq) + (req->numAttribs << 3)) >> 2) < client->req_len)
-+	return BadLength;
-+
-     attribs = (CARD32*)(req + 1);
-     __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
- 
-@@ -546,7 +548,7 @@ int __glXDispSwap_DestroyWindow(__GLXcli
-     xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
--    REQUEST_SIZE_MATCH(xGLXDestroyWindowReq);
-+    REQUEST_AT_LEAST_SIZE(xGLXDestroyWindowReq);
- 
-     __GLX_SWAP_INT(&req->glxwindow);
- 
-@@ -746,7 +748,7 @@ int __glXDispSwap_GetDrawableAttributes(
-     xGLXGetDrawableAttributesReq *req = (xGLXGetDrawableAttributesReq *)pc;
-     __GLX_DECLARE_SWAP_VARIABLES;
- 
--    REQUEST_SIZE_MATCH(xGLXGetDrawableAttributesReq);
-+    REQUEST_AT_LEAST_SIZE(xGLXGetDrawableAttributesReq);
- 
-     __GLX_SWAP_SHORT(&req->length);
-     __GLX_SWAP_INT(&req->drawable);
diff --git a/contrib/packages/rpm/sle11/SOURCES/U_os-Reset-input-buffer-s-ignoreBytes-field.patch b/contrib/packages/rpm/sle11/SOURCES/U_os-Reset-input-buffer-s-ignoreBytes-field.patch
deleted file mode 100644
index e2548ee..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/U_os-Reset-input-buffer-s-ignoreBytes-field.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- xorg-server-1.9.3/os/io.c	2010-11-23 20:07:18.000000000 +0100
-+++ xorg-server-1.9.3.new/os/io.c	2013-07-03 16:07:37.283509815 +0200
-@@ -1108,6 +1108,7 @@
- 	    oci->bufptr = oci->buffer;
- 	    oci->bufcnt = 0;
- 	    oci->lenLastReq = 0;
-+	    oci->ignoreBytes = 0;	
- 	}
-     }
-     if ((oco = oc->output))
diff --git a/contrib/packages/rpm/sle11/SOURCES/U_xf86-fix-flush-input-to-work-with-Linux-evdev-device.patch b/contrib/packages/rpm/sle11/SOURCES/U_xf86-fix-flush-input-to-work-with-Linux-evdev-device.patch
deleted file mode 100644
index 772a8ca..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/U_xf86-fix-flush-input-to-work-with-Linux-evdev-device.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From 6ca03b9161d33b1d2b55a3a1a913cf88deb2343f Mon Sep 17 00:00:00 2001
-From: Dave Airlie <airlied@gmail.com>
-Date: Wed, 10 Apr 2013 16:09:01 +1000
-Subject: [PATCH] xf86: fix flush input to work with Linux evdev devices.
-
-So when we VT switch back and attempt to flush the input devices,
-we don't succeed because evdev won't return part of an event,
-since we were only asking for 4 bytes, we'd only get -EINVAL back.
-
-This could later cause events to be flushed that we shouldn't have
-gotten.
-
-This is a fix for CVE-2013-1940.
-
-Signed-off-by: Dave Airlie <airlied@redhat.com>
-Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
-Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
----
- hw/xfree86/os-support/shared/posix_tty.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/hw/xfree86/os-support/shared/posix_tty.c b/hw/xfree86/os-support/shared/posix_tty.c
-index ab3757a..4d08c1e 100644
---- a/hw/xfree86/os-support/shared/posix_tty.c
-+++ b/hw/xfree86/os-support/shared/posix_tty.c
-@@ -460,7 +460,8 @@ xf86FlushInput(int fd)
- {
- 	fd_set fds;
- 	struct timeval timeout;
--	char c[4];
-+	/* this needs to be big enough to flush an evdev event. */
-+	char c[256];
- 
- 	DebugF("FlushingSerial\n");
- 	if (tcflush(fd, TCIFLUSH) == 0)
--- 
-1.8.1.4
diff --git a/contrib/packages/rpm/sle11/SOURCES/Use-external-tool-for-creating-backtraces-on-crashes.patch b/contrib/packages/rpm/sle11/SOURCES/Use-external-tool-for-creating-backtraces-on-crashes.patch
deleted file mode 100644
index 4fc586e..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/Use-external-tool-for-creating-backtraces-on-crashes.patch
+++ /dev/null
@@ -1,123 +0,0 @@
-From bb4e768eaf8025d3ccf369cbad9a9b8be721e7ac Mon Sep 17 00:00:00 2001
-From: Matthias Hopf <mhopf@suse.de>
-Date: Wed, 25 Aug 2010 14:12:48 +0200
-Subject: [PATCH] Use external tool for creating backtraces on crashes if available.
-
-This calls /usr/bin/xorg-backtrace to create reasonable commented backtraces
-with gdb. On errors it falls back to the generic method.
-
-Signed-off-by: Matthias Hopf <mhopf@suse.de>
----
- os/backtrace.c |   82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 1 files changed, 82 insertions(+), 0 deletions(-)
-
-diff --git a/os/backtrace.c b/os/backtrace.c
-index 7ca6dab..1e3201a 100644
---- a/os/backtrace.c
-+++ b/os/backtrace.c
-@@ -28,6 +28,81 @@
- #include "os.h"
- #include "misc.h"
- 
-+#include <sys/types.h>
-+#include <sys/wait.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <unistd.h>
-+#include <errno.h>
-+
-+#define XORG_BACKTRACE "/usr/bin/xorg-backtrace"
-+
-+/* Call gdb to create reasonable(!) backtrace. Returns 0 if successfull. */
-+static int xorg_backtrace_gdb(void)
-+{
-+    static const char *xorg_backtrace = XORG_BACKTRACE;
-+    char  pidstr[12];
-+    char  fdname[] = "/tmp/xorg.XXXXXX";
-+    char  buf[256];
-+    pid_t pid;
-+    int   fd, status = -1, ret;
-+    FILE *f;
-+
-+    if (access (xorg_backtrace, R_OK | X_OK) != 0) {
-+	ErrorF ("%s not found, using internal backtrace system\n", xorg_backtrace);
-+	return 1;
-+    }
-+    if ( (fd = mkstemp (fdname)) == -1) {
-+	ErrorF ("xorg_backtrace_gdb internal error 1\n");
-+	return 1;
-+    }
-+    unlink (fdname);
-+    snprintf (pidstr, 12, "%d", getpid());
-+
-+    switch ( (pid = fork()) ) {
-+    case 0:
-+	close (0);
-+	close (1);
-+	close (2);
-+	dup2  (fd, 1);
-+	dup2  (fd, 2);
-+	close (fd);
-+	execl (xorg_backtrace, xorg_backtrace, pidstr, NULL);
-+	exit  (-1);
-+    case -1:
-+	close (fd);
-+	return 1;
-+    }
-+
-+    while (waitpid (pid, &status, 0) == -1 && errno == EINTR)
-+	;
-+    if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
-+	ret = 0;
-+    else {
-+	ErrorF ("%s failed with returncode %d\n", xorg_backtrace, WEXITSTATUS (status));
-+	ret = 1;
-+    }
-+
-+    lseek (fd, 0, SEEK_SET);
-+    if (! (f = fdopen (fd, "r"))) {
-+	ErrorF ("xorg_backtrace_gdb internal error 2\n");
-+	close (fd);
-+	return 1;
-+    }
-+    status = 0;
-+    while (fgets (buf, 256, f)) {
-+	status++;
-+	ErrorF("%s", buf);
-+    }
-+    fclose (f);
-+    if (status < 10 && ret == 0) {
-+	ErrorF ("%s only produced %d lines of output\n", xorg_backtrace, status);
-+	return 1;
-+    }
-+
-+    return ret;
-+}
-+
- #ifdef HAVE_BACKTRACE
- #ifndef _GNU_SOURCE
- #define _GNU_SOURCE
-@@ -41,6 +116,10 @@ void xorg_backtrace(void)
-     const char *mod;
-     int size, i;
-     Dl_info info;
-+
-+    if (xorg_backtrace_gdb () == 0)
-+	return;
-+
-     ErrorF("\nBacktrace:\n");
-     size = backtrace(array, 64);
-     for (i = 0; i < size; i++) {
-@@ -182,6 +261,9 @@ static int xorg_backtrace_pstack(void) {
- 
- void xorg_backtrace(void) {
- 
-+    if (xorg_backtrace_gdb () == 0)
-+	return;
-+
-     ErrorF("\nBacktrace:\n");
- 
- #  ifdef HAVE_PSTACK
--- 
-1.6.0.2
-
diff --git a/contrib/packages/rpm/sle11/SOURCES/autoconfig_fallback_fbdev_first.diff b/contrib/packages/rpm/sle11/SOURCES/autoconfig_fallback_fbdev_first.diff
deleted file mode 100644
index 9225682..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/autoconfig_fallback_fbdev_first.diff
+++ /dev/null
@@ -1,22 +0,0 @@
-Index: hw/xfree86/common/xf86AutoConfig.c
-================================================================================
---- hw/xfree86/common/xf86AutoConfig.c
-+++ hw/xfree86/common/xf86AutoConfig.c
-@@ -506,7 +506,7 @@
-     /* Fallback to platform default hardware */
-     if (i < (nmatches - 1)) {
- #if defined(__i386__) || defined(__amd64__) || defined(__hurd__)
--	matches[i++] = xnfstrdup("vesa");
-+	matches[i++] = xnfstrdup("fbdev");
- #elif defined(__sparc__) && !defined(sun)
- 	matches[i++] = xnfstrdup("sunffb");
- #endif
-@@ -517,7 +517,7 @@
- #if !defined(__linux__) && defined(__sparc__)
- 	matches[i++] = xnfstrdup("wsfb");
- #else
--	matches[i++] = xnfstrdup("fbdev");
-+	matches[i++] = xnfstrdup("vesa");
- #endif
-     }
- }
diff --git a/contrib/packages/rpm/sle11/SOURCES/bitmap_always_unscaled.diff b/contrib/packages/rpm/sle11/SOURCES/bitmap_always_unscaled.diff
deleted file mode 100644
index f94c6ac..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/bitmap_always_unscaled.diff
+++ /dev/null
@@ -1,31 +0,0 @@
-From 107688407c7ebc71323dc1203ed5b92276026e1e Mon Sep 17 00:00:00 2001
-From: Luc Verhaegen <libv@skynet.be>
-Date: Wed, 2 Apr 2008 20:09:26 +0200
-Subject: [PATCH] Default bitmap fonts should typically be set as unscaled.
-
-It is generally not desired to have bitmap fonts scale. Even so
-DEFAULT_FONT_PATH had the misc, 100dpi and 75dpi paths without the
-:unscaled specifier.
-
-Now the default font path has this per default, xorgconfig and
---configure will only use these as :unscaled too.
-
-Since SUSE has been specifying :unscaled for its bitmap fonts for
-about a decade or so, and since adding the default font path to the
-.conf fontpath was only introduced a year ago, this lack of scaled
-bitmap fonts will not have any new side-effects.
-
-Reported by Mike Fabian, debugged and fixed with the help of Mike
-Fabian and Stefan Dirsch.
-================================================================================
---- xorg-server-1.7.99/configure.ac
-+++ xorg-server-1.7.99/configure.ac
-@@ -509,7 +509,7 @@
- dnl Uses --default-font-path if set, otherwise checks for /etc/X11/fontpath.d,
- dnl otherwise uses standard subdirectories of FONTROOTDIR. When cross
- dnl compiling, assume default font path uses standard FONTROOTDIR directories.
--DEFAULT_FONT_PATH="${FONTMISCDIR}/,${FONTTTFDIR}/,${FONTOTFDIR}/,${FONTTYPE1DIR}/,${FONT100DPIDIR}/,${FONT75DPIDIR}/"
-+DEFAULT_FONT_PATH="${FONTMISCDIR}:unscaled,${FONTTTFDIR}/,${FONTOTFDIR}/,${FONTTYPE1DIR}/,${FONT100DPIDIR}/,${FONT75DPIDIR}/"
- if test "$cross_compiling" != yes; then
- 	AC_CHECK_FILE([${sysconfdir}/X11/fontpath.d],
- 		[DEFAULT_FONT_PATH='catalogue:${sysconfdir}/X11/fontpath.d'],
diff --git a/contrib/packages/rpm/sle11/SOURCES/bug-197858_dpms.diff b/contrib/packages/rpm/sle11/SOURCES/bug-197858_dpms.diff
deleted file mode 100644
index 945b280..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/bug-197858_dpms.diff
+++ /dev/null
@@ -1,105 +0,0 @@
-Index: hw/xfree86/common/xf86Events.c
-================================================================================
---- hw/xfree86/common/xf86Events.c
-+++ hw/xfree86/common/xf86Events.c
-@@ -115,6 +115,7 @@
-     InputHandlerProc	ihproc;
-     pointer		data;
-     Bool		enabled;
-+    Bool		is_input;
-     struct x_IHRec *	next;
- } IHRec, *IHPtr;
- 
-@@ -449,8 +450,12 @@
-      * Keep the order: Disable Device > LeaveVT
-      *                        EnterVT > EnableDevice
-      */
--    for (ih = InputHandlers; ih; ih = ih->next)
--      xf86DisableInputHandler(ih);
-+    for (ih = InputHandlers; ih; ih = ih->next) {
-+      if (ih->is_input)
-+          xf86DisableInputHandler(ih);
-+      else
-+          xf86DisableGeneralHandler(ih);
-+    }
-     for (pInfo = xf86InputDevs; pInfo; pInfo = pInfo->next) {
-       if (pInfo->dev) {
-           xf86ReleaseKeys(pInfo->dev);
-@@ -492,8 +497,12 @@
-             EnableDevice(pInfo->dev, TRUE);
- 	pInfo = pInfo->next;
-       }
--      for (ih = InputHandlers; ih; ih = ih->next)
--        xf86EnableInputHandler(ih);
-+      for (ih = InputHandlers; ih; ih = ih->next) {
-+        if (ih->is_input)
-+            xf86EnableInputHandler(ih);
-+        else
-+            xf86EnableGeneralHandler(ih);
-+      }
- 
-       xf86UnblockSIGIO(prevSIGIO);
- 
-@@ -549,8 +558,12 @@
-       pInfo = pInfo->next;
-     }
- 
--    for (ih = InputHandlers; ih; ih = ih->next)
--      xf86EnableInputHandler(ih);
-+    for (ih = InputHandlers; ih; ih = ih->next) {
-+      if (ih->is_input)
-+          xf86EnableInputHandler(ih);
-+      else
-+           xf86EnableGeneralHandler(ih);
-+    }
- 
-     xf86UnblockSIGIO(prevSIGIO);
-   }
-@@ -587,8 +600,10 @@
- {
-     IHPtr ih = addInputHandler(fd, proc, data);
- 
--    if (ih)
-+    if (ih) {
-         AddEnabledDevice(fd);
-+	ih->is_input = TRUE;
-+    }
-     return ih;
- }
- 
---- os/WaitFor.c
-+++ os/WaitFor.c
-@@ -142,6 +142,7 @@
-  *     For more info on ClientsWithInput, see ReadRequestFromClient().
-  *     pClientsReady is an array to store ready client->index values into.
-  *****************/
-+volatile fd_set tmp_set;
- 
- int
- WaitForSomething(int *pClientsReady)
-@@ -279,10 +280,9 @@
-                 if (expired)
-                     return 0;
- 	    }
--	}
-+	} 
- 	else
--	{
--	    fd_set tmp_set;
-+	 {
- 
- 	    if (*checkForInput[0] == *checkForInput[1]) {
- 	        if (timers)
-@@ -317,6 +317,12 @@
- 		QueueWorkProc(EstablishNewConnections, NULL,
- 			      (pointer)&LastSelectMask);
- 
-+#ifdef DPMSExtension
-+	    XFD_ANDSET(&tmp_set, &devicesReadable, &EnabledDevices);
-+	    if (XFD_ANYSET (&tmp_set) && (DPMSPowerLevel != DPMSModeOn))
-+		DPMSSet(serverClient, DPMSModeOn);
-+#endif
-+
- 	    if (XFD_ANYSET (&devicesReadable) || XFD_ANYSET (&clientsReadable))
- 		break;
- 	    /* check here for DDXes that queue events during Block/Wakeup */
diff --git a/contrib/packages/rpm/sle11/SOURCES/bug474071-fix1.diff b/contrib/packages/rpm/sle11/SOURCES/bug474071-fix1.diff
deleted file mode 100644
index 889cbe6..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/bug474071-fix1.diff
+++ /dev/null
@@ -1,35 +0,0 @@
-Index: linuxPci.c
-================================================================================
---- linuxPci.c
-+++ linuxPci.c
-@@ -195,7 +195,7 @@
-     struct pci_id_match bridge_match = {
- 	PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY,
- 	(PCI_CLASS_BRIDGE << 16) | (PCI_SUBCLASS_BRIDGE_PCI << 8),
--	0
-+	(PCI_CLASS_BRIDGE << 16) | (PCI_SUBCLASS_BRIDGE_PCI << 8)
-     };
-     struct pci_device *bridge;
-     struct pci_device_iterator *iter;
-@@ -433,7 +433,6 @@
- xf86MapLegacyIO(struct pci_device *dev)
- {
-     const int domain = dev->domain;
--    struct pci_device *bridge = get_parent_bridge(dev);
-     int fd;
- 
-     if (domain >= MAX_DOMAINS)
-@@ -441,9 +440,11 @@
- 
-     if (DomainMmappedIO[domain] == NULL) {
- 	/* Permanently map all of I/O space */
--	fd = linuxOpenLegacy(bridge, "legacy_io");
-+	fd = linuxOpenLegacy(dev, "legacy_io");
- 	if (fd < 0) {
--	    DomainMmappedIO[domain] = linuxMapPci(-1, VIDMEM_MMIO, bridge,
-+	    struct pci_device *bridge = get_parent_bridge(dev);
-+	    if (bridge != NULL)
-+	        DomainMmappedIO[domain] = linuxMapPci(-1, VIDMEM_MMIO, bridge,
- 						  0, linuxGetIOSize(bridge),
- 						  PCIIOC_MMAP_IS_IO);
- 	}
diff --git a/contrib/packages/rpm/sle11/SOURCES/bug534768-prefer_local_symbols.patch b/contrib/packages/rpm/sle11/SOURCES/bug534768-prefer_local_symbols.patch
deleted file mode 100644
index 659bfbd..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/bug534768-prefer_local_symbols.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-Index: xorg-server-1.6.3.901/hw/xfree86/loader/dlloader.c
-================================================================================
---- xorg-server-1.7.99/hw/xfree86/loader/dlloader.c
-+++ xorg-server-1.7.99/hw/xfree86/loader/dlloader.c
-@@ -120,7 +120,7 @@
-     }
- 
-     if (!global_scope)
--	global_scope = dlopen(NULL, DLOPEN_LAZY | DLOPEN_GLOBAL);
-+	global_scope = dlopen(NULL, DLOPEN_LAZY | DLOPEN_GLOBAL | RTLD_DEEPBIND);
- 
-     if (global_scope)
- 	return DLFindSymbolLocal(global_scope, name);
-@@ -136,9 +136,9 @@
-     int dlopen_flags;
- 
-     if (flags & LD_FLAG_GLOBAL)
--	dlopen_flags = DLOPEN_LAZY | DLOPEN_GLOBAL;
-+	dlopen_flags = DLOPEN_LAZY | DLOPEN_GLOBAL | RTLD_DEEPBIND;
-     else
--	dlopen_flags = DLOPEN_LAZY;
-+	dlopen_flags = DLOPEN_LAZY | RTLD_DEEPBIND;
-     dlfile = dlopen(modrec->name, dlopen_flags);
-     if (dlfile == NULL) {
- 	ErrorF("dlopen: %s\n", dlerror());
diff --git a/contrib/packages/rpm/sle11/SOURCES/cache-xkbcomp-output-for-fast-start-up.patch b/contrib/packages/rpm/sle11/SOURCES/cache-xkbcomp-output-for-fast-start-up.patch
deleted file mode 100644
index 14c757a..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/cache-xkbcomp-output-for-fast-start-up.patch
+++ /dev/null
@@ -1,347 +0,0 @@
-From 0f70ba9d3412b17ac4e08e33e1be3c226c06ea54 Mon Sep 17 00:00:00 2001
-From: Yan Li <yan.i.li@intel.com>
-Date: Tue, 12 May 2009 17:49:07 +0800
-Subject: [PATCH] XKB: cache xkbcomp output for fast start-up v5 for 1.6.1
-Organization: Intel
-
-xkbcomp outputs will be cached in files with hashed keymap as
-names. This saves boot time for around 1s on commodity netbooks.
-
-Signed-off-by: Yan Li <yan.i.li@intel.com>
-================================================================================
---- xorg-server-1.7.99/configure.ac
-+++ xorg-server-1.7.99/configure.ac
-@@ -527,9 +527,9 @@
- AC_ARG_WITH(xkb-path,         AS_HELP_STRING([--with-xkb-path=PATH], [Path to XKB base dir (default: ${datadir}/X11/xkb)]),
- 				[ XKBPATH="$withval" ],
- 				[ XKBPATH="${datadir}/X11/xkb" ])
--AC_ARG_WITH(xkb-output,       AS_HELP_STRING([--with-xkb-output=PATH], [Path to XKB output dir (default: ${datadir}/X11/xkb/compiled)]),
-+AC_ARG_WITH(xkb-output,       AS_HELP_STRING([--with-xkb-output=PATH], [Path to XKB output dir (default: ${localstatedir}/cache/xkb)]),
- 				[ XKBOUTPUT="$withval" ],
--				[ XKBOUTPUT="compiled" ])
-+				[ XKBOUTPUT="${localstatedir}/cache/xkb" ])
- AC_ARG_WITH(default-xkb-rules, AS_HELP_STRING([--with-default-xkb-rules=RULES],
-                                    [Keyboard ruleset (default: base/evdev)]),
-                                 [ XKB_DFLT_RULES="$withval" ],
-@@ -1160,7 +1160,7 @@
- dnl Make sure XKM_OUTPUT_DIR is an absolute path
- XKBOUTPUT_FIRSTCHAR=`echo $XKBOUTPUT | cut -b 1`
- if [[ x$XKBOUTPUT_FIRSTCHAR != x/ -a x$XKBOUTPUT_FIRSTCHAR != 'x$' ]] ; then
--   XKBOUTPUT="$XKB_BASE_DIRECTORY/$XKBOUTPUT"
-+   AC_MSG_ERROR([xkb-output must be an absolute path.])
- fi
- 
- dnl XKM_OUTPUT_DIR (used in code) must end in / or file names get hosed
---- xorg-server-1.7.99/xkb/README.compiled
-+++ xorg-server-1.7.99/xkb/README.compiled
-@@ -4,10 +4,10 @@
- or some other tool might destroy or replace the files in this directory,
- so it is not a safe place to store compiled keymaps for long periods of
- time.  The default keymap for any server is usually stored in:
--     X<num>-default.xkm
--where <num> is the display number of the server in question, which makes
--it possible for several servers *on the same host* to share the same 
--directory.
-+     server-<SHA1>.xkm
-+
-+where <SHA1> is the SHA1 hash of keymap source, so that compiled
-+keymap of different keymap sources are stored in different files.
- 
- Unless the X server is modified, sharing this directory between servers on
- different hosts could cause problems.
---- xorg-server-1.9.0/xkb/ddxLoad.c.orig	2010-07-14 22:23:17.000000000 +0200
-+++ xorg-server-1.9.0/xkb/ddxLoad.c	2010-08-23 15:23:47.000000000 +0200
-@@ -30,6 +30,12 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
- 
- #include <xkb-config.h>
- 
-+#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */
-+# include <sha1.h>
-+#else /* Use OpenSSL's libcrypto */
-+# include <stddef.h>  /* buggy openssl/sha.h wants size_t */
-+# include <openssl/sha.h>
-+#endif
- #include <stdio.h>
- #include <ctype.h>
- #include <X11/X.h>
-@@ -43,24 +49,13 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
- #define	XKBSRV_NEED_FILE_FUNCS
- #include <xkbsrv.h>
- #include <X11/extensions/XI.h>
-+#include <errno.h>
- #include "xkb.h"
- 
- #if defined(CSRG_BASED) || defined(linux) || defined(__GNU__)
- #include <paths.h>
- #endif
- 
--	/*
--	 * If XKM_OUTPUT_DIR specifies a path without a leading slash, it is
--	 * relative to the top-level XKB configuration directory.
--	 * Making the server write to a subdirectory of that directory
--	 * requires some work in the general case (install procedure
--	 * has to create links to /var or somesuch on many machines),
--	 * so we just compile into /usr/tmp for now.
--	 */
--#ifndef XKM_OUTPUT_DIR
--#define	XKM_OUTPUT_DIR	"compiled/"
--#endif
--
- #define	PRE_ERROR_MSG "\"The XKEYBOARD keymap compiler (xkbcomp) reports:\""
- #define	ERROR_PREFIX	"\"> \""
- #define	POST_ERROR_MSG1 "\"Errors from xkbcomp are not fatal to the X server\""
-@@ -175,6 +170,45 @@ OutputDirectory(
- }
- 
- static Bool
-+Sha1Asc(char sha1Asc[SHA_DIGEST_LENGTH*2+1], const char * input)
-+{
-+    int i;
-+    unsigned char sha1[SHA_DIGEST_LENGTH];
-+
-+#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */
-+    SHA1_CTX ctx;
-+
-+    SHA1Init (&ctx);
-+    SHA1Update (&ctx, input, strlen(input));
-+    SHA1Final (sha1, &ctx);
-+#else /* Use OpenSSL's libcrypto */
-+    SHA_CTX ctx;
-+    int success;
-+
-+    success = SHA1_Init (&ctx);
-+    if (! success)
-+      return BadAlloc;
-+
-+    success = SHA1_Update (&ctx, input, strlen(input));
-+    if (! success)
-+      return BadAlloc;
-+
-+    success = SHA1_Final (sha1, &ctx);
-+    if (! success)
-+      return BadAlloc;
-+#endif
-+
-+    /* convert sha1 to sha1_asc */
-+    for(i=0; i<SHA_DIGEST_LENGTH; ++i) {
-+        sprintf(sha1Asc+i*2, "%02X", sha1[i]);
-+    }
-+
-+    return Success;
-+}
-+
-+/* call xkbcomp and compile XKB keymap, return xkm file name in
-+   nameRtrn */
-+static Bool
- XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
- 				XkbComponentNamesPtr	names,
- 				unsigned		want,
-@@ -183,7 +217,11 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr
- 				int			nameRtrnLen)
- {
-     FILE *	out;
--    char	*buf = NULL, keymap[PATH_MAX], xkm_output_dir[PATH_MAX];
-+    char *	buf = NULL, xkmfile[PATH_MAX], xkm_output_dir[PATH_MAX];
-+    char *	tmpXkmFile = NULL;
-+    char *	canonicalXkmFileName = NULL;
-+    char	sha1Asc[SHA_DIGEST_LENGTH*2+1], xkbKeyMapBuf[100*1024];
-+    int		ret, result;
- 
-     const char	*emptystring = "";
-     char *xkbbasedirflag = NULL;
-@@ -194,15 +232,70 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr
-     /* WIN32 has no popen. The input must be stored in a file which is
-        used as input for xkbcomp. xkbcomp does not read from stdin. */
-     char tmpname[PATH_MAX];
--    const char *xkmfile = tmpname;
-+    const char *xkbfile = tmpname;
- #else
--    const char *xkmfile = "-";
-+    const char *xkbfile = "-";
-+#endif
-+
-+    /* Write keymap source (xkbfile) to memory buffer `xkbKeyMapBuf',
-+       of which SHA1 is generated and used as result xkm file name  */
-+    memset(xkbKeyMapBuf, 0, sizeof(xkbKeyMapBuf));
-+    out = fmemopen(xkbKeyMapBuf, sizeof(xkbKeyMapBuf), "w");
-+    if (NULL == out) {
-+        ErrorF("[xkb] Open xkbKeyMapBuf for writing failed\n");
-+        return FALSE;
-+    }
-+    ret = XkbWriteXKBKeymapForNames(out, names, xkb, want, need);
-+    if (fclose(out) !=0)
-+    {
-+        ErrorF("[xkb] XkbWriteXKBKeymapForNames error, perhaps xkbKeyMapBuf is too small\n");
-+        return FALSE;
-+    }
-+#ifdef DEBUG
-+    if (xkbDebugFlags) {
-+       ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n");
-+       fputs(xkbKeyMapBuf, stderr);
-+    }
- #endif
-+    if (!ret) {
-+        ErrorF("[xkb] Generating XKB Keymap failed, giving up compiling keymap\n");
-+        return FALSE;
-+    }
- 
--    snprintf(keymap, sizeof(keymap), "server-%s", display);
-+    DebugF("[xkb] computing SHA1 of keymap\n");
-+    if (Success == Sha1Asc(sha1Asc, xkbKeyMapBuf)) {
-+        snprintf(xkmfile, sizeof(xkmfile), "server-%s", sha1Asc);
-+    }
-+    else {
-+        ErrorF("[xkb] Computing SHA1 of keymap failed, "
-+               "using display name instead as xkm file name\n");
-+        snprintf(xkmfile, sizeof(xkmfile), "server-%s", display);
-+    }
- 
-     OutputDirectory(xkm_output_dir, sizeof(xkm_output_dir));
- 
-+    /* set nameRtrn, fail if it's too small */
-+    if ((strlen(xkmfile)+1 > nameRtrnLen) && nameRtrn) {
-+        ErrorF("[xkb] nameRtrn too small to hold xkmfile name\n");
-+        return FALSE;
-+    }
-+    strncpy(nameRtrn, xkmfile, nameRtrnLen);
-+
-+    /* if the xkm file already exists, reuse it */
-+    canonicalXkmFileName = Xprintf("%s%s.xkm", xkm_output_dir, xkmfile);
-+    if (access(canonicalXkmFileName, R_OK) == 0) {
-+        /* yes, we can reuse the old xkm file */
-+        LogMessage(X_INFO, "XKB: reuse xkmfile %s\n", canonicalXkmFileName);
-+        result = TRUE;
-+        goto _ret;
-+    }
-+    LogMessage(X_INFO, "XKB: generating xkmfile %s\n", canonicalXkmFileName);
-+
-+    /* continue to call xkbcomp to compile the keymap. to avoid race
-+       condition, we compile it to a tmpfile then rename it to
-+       xkmfile */
-+
-+
- #ifdef WIN32
-     strcpy(tmpname, Win32TempDir());
-     strcat(tmpname, "\\xkb_XXXXXX");
-@@ -225,14 +318,20 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr
- 	}
-     }
- 
-+    if ( (tmpXkmFile = tempnam(xkm_output_dir, NULL)) == NULL ) {
-+	ErrorF("[xkb] Can't generate temp xkm file name");
-+	result = FALSE;
-+	goto _ret;
-+   }
-+
-     buf = Xprintf("\"%s%sxkbcomp\" -w %d %s -xkm \"%s\" "
--		  "-em1 %s -emp %s -eml %s \"%s%s.xkm\"",
-+		  "-em1 %s -emp %s -eml %s \"%s\"",
- 		  xkbbindir, xkbbindirsep,
- 		  ( (xkbDebugFlags < 2) ? 1 :
- 		    ((xkbDebugFlags > 10) ? 10 : (int)xkbDebugFlags) ),
--		  xkbbasedirflag ? xkbbasedirflag : "", xkmfile,
-+		  xkbbasedirflag ? xkbbasedirflag : "", xkbfile,
- 		  PRE_ERROR_MSG, ERROR_PREFIX, POST_ERROR_MSG1,
--		  xkm_output_dir, keymap);
-+		  tmpXkmFile);
- 
-     free(xkbbasedirflag);
- 
-@@ -240,7 +339,12 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr
-         LogMessage(X_ERROR, "XKB: Could not invoke xkbcomp: not enough memory\n");
-         return FALSE;
-     }
--    
-+   
-+    /* there's a potential race condition between calling tempnam()
-+       and invoking xkbcomp to write the result file (potential temp
-+       file name conflicts), but since xkbcomp is a standalone
-+       program, we have to live with this */
-+ 
- #ifndef WIN32
-     out= Popen(buf,"w");
- #else
-@@ -248,31 +352,42 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr
- #endif
-     
-     if (out!=NULL) {
--#ifdef DEBUG
--    if (xkbDebugFlags) {
--       ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n");
--       XkbWriteXKBKeymapForNames(stderr,names,xkb,want,need);
--    }
--#endif
--	XkbWriteXKBKeymapForNames(out,names,xkb,want,need);
-+	/* write XKBKeyMapBuf to xkbcomp */
-+	if (EOF==fputs(xkbKeyMapBuf, out))
-+	{
-+	    ErrorF("[xkb] Sending keymap to xkbcomp failed\n");
-+	    result = FALSE;
-+	    goto _ret;
-+	}
- #ifndef WIN32
- 	if (Pclose(out)==0)
- #else
- 	if (fclose(out)==0 && System(buf) >= 0)
- #endif
- 	{
-+	    /* xkbcomp success */
-             if (xkbDebugFlags)
-                 DebugF("[xkb] xkb executes: %s\n",buf);
--	    if (nameRtrn) {
--		strncpy(nameRtrn,keymap,nameRtrnLen);
--		nameRtrn[nameRtrnLen-1]= '\0';
-+	    /* if canonicalXkmFileName already exists now, we simply
-+	       overwrite it, this is OK */
-+	    ret = rename(tmpXkmFile, canonicalXkmFileName);
-+	    if (0 != ret) {
-+		ErrorF("[xkb] Can't rename %s to %s, error: %s\n",
-+			tmpXkmFile, canonicalXkmFileName,
-+			strerror(errno));
-+
-+		/* in case of error, don't unlink tmpXkmFile, leave it
-+		   for debugging */
-+
-+		result = FALSE;
-+		goto _ret;
- 	    }
--            if (buf != NULL)
--                free(buf);
--	    return TRUE;
-+
-+	    result = TRUE;
-+	    goto _ret;
- 	}
- 	else
--	    LogMessage(X_ERROR, "Error compiling keymap (%s)\n", keymap);
-+	    LogMessage(X_ERROR, "Error compiling keymap (%s)\n", xkbfile);
- #ifdef WIN32
-         /* remove the temporary file */
-         unlink(tmpname);
-@@ -289,7 +404,17 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr
- 	nameRtrn[0]= '\0';
-     if (buf != NULL)
-         free(buf);
--    return FALSE;
-+    result = FALSE;
-+
-+_ret:
-+    if (tmpXkmFile)
-+	free(tmpXkmFile);
-+    if (canonicalXkmFileName)
-+	xfree(canonicalXkmFileName);
-+    if (buf != NULL)
-+	xfree (buf);
-+
-+    return result;
- }
- 
- static FILE *
-@@ -373,7 +498,6 @@ unsigned	missing;
- 	DebugF("Loaded XKB keymap %s, defined=0x%x\n",fileName,(*xkbRtrn)->defined);
-     }
-     fclose(file);
--    (void) unlink (fileName);
-     return (need|want)&(~missing);
- }
- 
diff --git a/contrib/packages/rpm/sle11/SOURCES/commit-5c6a2f9.diff b/contrib/packages/rpm/sle11/SOURCES/commit-5c6a2f9.diff
deleted file mode 100644
index 9e3da69..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/commit-5c6a2f9.diff
+++ /dev/null
@@ -1,166 +0,0 @@
-commit 5c6a2f93ebc16a78093782b442306de23ae94e78
-Author: Chris Wilson <chris@chris-wilson.co.uk>
-Date:   Mon Sep 27 19:39:23 2010 +0100
-
-    xfree86: Kill pixmapPrivate with a vengeance (v2)
-    
-    ScrnInfo->pixmapPrivate only existed in order to catch invalid access to
-    the framebuffer by making the backing data NULL across the VT switch.
-    This was causing more confusion in the higher layers during mode setting
-    without any real benefit, so remove it.
-    
-    v2: Kill ShadowModifyPixmapHeader() as well.
-    
-    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-    Cc: Julien Cristau <jcristau@debian.org>
-    Cc: Andrew Guertin <lists@dolphinling.net>
-    Reviewed-by: Keith Packard <keithp@keithp.com>
-    Signed-off-by: Keith Packard <keithp@keithp.com>
-
-diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
-index 90e0c67..97e5aec 100644
---- a/hw/xfree86/common/xf86Helper.c
-+++ b/hw/xfree86/common/xf86Helper.c
-@@ -1180,10 +1180,6 @@ xf86EnableDisableFBAccess(int scrnIndex, Bool enable)
-     if (enable)
-     {
- 	/*
--	 * Restore the screen pixmap devPrivate field
--	 */
--	pspix->devPrivate = pScrnInfo->pixmapPrivate;
--	/*
- 	 * Restore all of the clip lists on the screen
- 	 */
- 	if (!xf86Resetting)
-@@ -1196,13 +1192,6 @@ xf86EnableDisableFBAccess(int scrnIndex, Bool enable)
- 	 * Empty all of the clip lists on the screen
- 	 */
- 	xf86SetRootClip (pScreen, FALSE);
--	/*
--	 * save the screen pixmap devPrivate field and
--	 * replace it with NULL so accidental references
--	 * to the frame buffer are caught
--	 */
--	pScrnInfo->pixmapPrivate = pspix->devPrivate;
--	pspix->devPrivate.ptr = NULL;
-     }
- }
- 
-diff --git a/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h
-index c9b261d..b979884 100644
---- a/hw/xfree86/common/xf86str.h
-+++ b/hw/xfree86/common/xf86str.h
-@@ -765,7 +765,7 @@ typedef struct _ScrnInfoRec {
- 
-     /* Allow screens to be enabled/disabled individually */
-     Bool		vtSema;
--    DevUnion		pixmapPrivate;		/* saved devPrivate from pixmap */
-+    DevUnion		pixmapPrivate;          /* XXX obsoleted; just for ABI compatibility */
- 
-     /* hw cursor moves at SIGIO time */
-     Bool		silkenMouse;
-diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
-index 8a593a7..ba0862a 100644
---- a/hw/xfree86/modes/xf86RandR12.c
-+++ b/hw/xfree86/modes/xf86RandR12.c
-@@ -511,7 +511,6 @@ xf86RandR12SetMode (ScreenPtr	    pScreen,
-     WindowPtr		pRoot = pScreen->root;
-     DisplayModePtr      currentMode = NULL;
-     Bool 		ret = TRUE;
--    PixmapPtr 		pspix = NULL;
- 
-     if (pRoot)
- 	(*scrp->EnableDisableFBAccess) (pScreen->myNum, FALSE);
-@@ -560,14 +559,6 @@ xf86RandR12SetMode (ScreenPtr	    pScreen,
- 	pScreen->mmHeight = oldmmHeight;
-         scrp->currentMode = currentMode;
-     }
--    /*
--     * Get the new Screen pixmap ptr as SwitchMode might have called
--     * ModifyPixmapHeader and xf86EnableDisableFBAccess will put it back...
--     * Unfortunately.
--     */
--    pspix = (*pScreen->GetScreenPixmap) (pScreen);
--    if (pspix->devPrivate.ptr)
--       scrp->pixmapPrivate = pspix->devPrivate;
- 
-     /*
-      * Make sure the layout is correct
-diff --git a/hw/xfree86/shadowfb/shadow.c b/hw/xfree86/shadowfb/shadow.c
-index 0af53d1..5cc476a 100644
---- a/hw/xfree86/shadowfb/shadow.c
-+++ b/hw/xfree86/shadowfb/shadow.c
-@@ -36,15 +36,6 @@ static void ShadowCopyWindow(
-     RegionPtr prgn 
- );
- static Bool ShadowCreateGC(GCPtr pGC);
--static Bool ShadowModifyPixmapHeader(
--    PixmapPtr pPixmap,
--    int width,
--    int height,
--    int depth,
--    int bitsPerPixel,
--    int devKind,
--    pointer pPixData
--);
- 
- static Bool ShadowEnterVT(int index, int flags);
- static void ShadowLeaveVT(int index, int flags);
-@@ -189,7 +180,6 @@ ShadowFBInit2 (
-     pScreen->CloseScreen = ShadowCloseScreen;
-     pScreen->CopyWindow = ShadowCopyWindow;
-     pScreen->CreateGC = ShadowCreateGC;
--    pScreen->ModifyPixmapHeader = ShadowModifyPixmapHeader;
- 
-     pScrn->EnterVT = ShadowEnterVT;
-     pScrn->LeaveVT = ShadowLeaveVT;
-@@ -310,49 +300,6 @@ ShadowCopyWindow(
-     }
- }
- 
--static Bool
--ShadowModifyPixmapHeader(
--    PixmapPtr pPixmap,
--    int width,
--    int height,
--    int depth,
--    int bitsPerPixel,
--    int devKind,
--    pointer pPixData
--)
--{
--    ScreenPtr pScreen;
--    ScrnInfoPtr pScrn;
--    ShadowScreenPtr pPriv;
--    Bool retval;
--    PixmapPtr pScreenPix;
--
--    if (!pPixmap)
--	return FALSE;
--
--    pScreen = pPixmap->drawable.pScreen;
--    pScrn = xf86Screens[pScreen->myNum];
--
--    pScreenPix = (*pScreen->GetScreenPixmap)(pScreen);
--    
--    if (pPixmap == pScreenPix && !pScrn->vtSema)
--	pScreenPix->devPrivate = pScrn->pixmapPrivate;
--    
--    pPriv = GET_SCREEN_PRIVATE(pScreen);
--
--    pScreen->ModifyPixmapHeader = pPriv->ModifyPixmapHeader;
--    retval = (*pScreen->ModifyPixmapHeader)(pPixmap,
--	width, height, depth, bitsPerPixel, devKind, pPixData);
--    pScreen->ModifyPixmapHeader = ShadowModifyPixmapHeader;
--
--    if (pPixmap == pScreenPix && !pScrn->vtSema)
--    {
--	pScrn->pixmapPrivate = pScreenPix->devPrivate;
--	pScreenPix->devPrivate.ptr = 0;
--    }
--    return retval;
--}
--
- static void
- ShadowComposite(
-     CARD8 op,
diff --git a/contrib/packages/rpm/sle11/SOURCES/confine_to_shape.diff b/contrib/packages/rpm/sle11/SOURCES/confine_to_shape.diff
deleted file mode 100644
index 1e4ddad..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/confine_to_shape.diff
+++ /dev/null
@@ -1,108 +0,0 @@
-Index: dix/events.c
-================================================================================
---- dix/events.c
-+++ dix/events.c
-@@ -661,37 +661,80 @@
- {
-     BoxRec box;
-     int x = *px, y = *py;
--    int incx = 1, incy = 1;
-     SpritePtr pSprite;
-+    int         nbox;
-+    BoxPtr      pbox;
-+    int                d, min = (~0U >> 1), dx2, dy2, x_r, y_r;
- 
-     pSprite = pDev->spriteInfo->sprite;
-     if (RegionContainsPoint(shape, x, y, &box))
- 	return;
--    box = *RegionExtents(shape);
--    /* this is rather crude */
--    do {
--	x += incx;
--	if (x >= box.x2)
--	{
--	    incx = -1;
--	    x = *px - 1;
-+
-+    for (nbox = REGION_NUM_RECTS (shape),
-+            pbox = REGION_RECTS(shape);
-+         nbox--;
-+         pbox++)
-+    {
-+       if (pbox->x1 < x && pbox->x2 > x) {
-+           d = pbox->y1 - y;
-+           if (d >= 0) {
-+               d *= d;
-+               if (d < min) {
-+                   *px = x;
-+                   *py = pbox->y1 + 1;
-+                   min = d;
-+               }
-+           } else {
-+               d = pbox->y2 - y; d *= d;
-+               if (d < min) {
-+                   *px = x;
-+                   *py = pbox->y2 - 1;
-+                   min = d;
-+               }
-+           }
- 	}
--	else if (x < box.x1)
--	{
--	    incx = 1;
--	    x = *px;
--	    y += incy;
--	    if (y >= box.y2)
--	    {
--		incy = -1;
--		y = *py - 1;
-+       else if (pbox->y1 < y && pbox->y2 > y) {
-+           d = pbox->x1 - x;
-+           if (d >= 0) {
-+               d *= d;
-+               if (d < min) {
-+                   *px = pbox->x1 + 1;
-+                   *py = y;
-+                   min = d;
-+               }
-+           } else {
-+               d = pbox->x2 - x; d *= d;               
-+               if (d < min) {
-+                   *px = pbox->x2 - 1;
-+                   *py = y;
-+                   min = d;
-+               }
-+           }
-+           
-+       } else {
-+           dx2 = pbox->x1 - x; 
-+           if (dx2 >= 0) {
-+               dx2 *= dx2;
-+               x_r = pbox->x1 + 1;
-+           } else {
-+               dx2 = pbox->x2 - x; dx2 *= dx2;
-+               x_r = pbox->x2 - 1;
-+           }
-+           dy2 = pbox->y1 - y; 
-+           if (dy2 >= 0) {
-+               dy2 *= dy2;
-+               y_r = pbox->y1 + 1;
-+           } else {
-+               dy2 = pbox->y2 - y; dy2 *= dy2;
-+               y_r = pbox->y2 - 1;
-+           }
-+           if ((d = dx2 + dy2) < min) {
-+               *px = x_r;
-+               *py = y_r;
-+               min = d;
- 	    }
--	    else if (y < box.y1)
--		return; /* should never get here! */
- 	}
--    } while (!RegionContainsPoint(shape, x, y, &box));
--    *px = x;
--    *py = y;
-+     }
- }
- 
- static void
diff --git a/contrib/packages/rpm/sle11/SOURCES/disable-fbblt-opt.diff b/contrib/packages/rpm/sle11/SOURCES/disable-fbblt-opt.diff
deleted file mode 100644
index a0a9571..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/disable-fbblt-opt.diff
+++ /dev/null
@@ -1,24 +0,0 @@
-Index: fb/fbblt.c
-================================================================================
---- fb/fbblt.c
-+++ fb/fbblt.c
-@@ -76,6 +76,11 @@
-     }
- #endif
- 
-+/* 
-+ * Disable optimization (introduced by ajax) due to a general vesa 
-+ * driver crash later in memcpy 
-+*/
-+#if 0
-     if (alu == GXcopy && pm == FB_ALLONES && !reverse &&
-             !(srcX & 7) && !(dstX & 7) && !(width & 7)) {
-         int i;
-@@ -97,6 +102,7 @@
- 
-         return;
-     }
-+#endif
- 
-     FbInitializeMergeRop(alu, pm);
-     destInvarient = FbDestInvarientMergeRop();
diff --git a/contrib/packages/rpm/sle11/SOURCES/dpms_screensaver.diff b/contrib/packages/rpm/sle11/SOURCES/dpms_screensaver.diff
deleted file mode 100644
index 6feee65..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/dpms_screensaver.diff
+++ /dev/null
@@ -1,14 +0,0 @@
-Index: xorg-server-1.6.3.901/hw/xfree86/common/xf86DPMS.c
-================================================================================
---- xorg-server-1.7.99/hw/xfree86/common/xf86DPMS.c
-+++ xorg-server-1.7.99/hw/xfree86/common/xf86DPMS.c
-@@ -156,7 +156,8 @@
- 	rc = dixSaveScreens(client, SCREEN_SAVER_FORCER, ScreenSaverActive);
- 	if (rc != Success)
- 	    return rc;
--    }
-+    } else
-+	dixSaveScreens(client, SCREEN_SAVER_FORCER, ScreenSaverReset);
- 
-     /* For each screen, set the DPMS level */
-     for (i = 0; i < xf86NumScreens; i++) {
diff --git a/contrib/packages/rpm/sle11/SOURCES/driver-autoconfig.diff b/contrib/packages/rpm/sle11/SOURCES/driver-autoconfig.diff
deleted file mode 100644
index cb62cde..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/driver-autoconfig.diff
+++ /dev/null
@@ -1,38 +0,0 @@
---- hw/xfree86/common/xf86pciBus.c
-+++ hw/xfree86/common/xf86pciBus.c
-@@ -176,7 +176,11 @@
- 	case 0x1142:		    driverList[0] = "apm"; break;
- 	case 0xedd8:		    driverList[0] = "ark"; break;
- 	case 0x1a03:		    driverList[0] = "ast"; break;
--	case 0x1002:		    driverList[0] = "ati"; break;
-+	case 0x1002:
-+		driverList[0] = "fglrx";
-+		driverList[1] = "radeonhd";
-+		driverList[2] = "ati";
-+		break;
- 	case 0x102c:		    driverList[0] = "chips"; break;
- 	case 0x1013:		    driverList[0] = "cirrus"; break;
- 	case 0x3d3d:		    driverList[0] = "glint"; break;
-@@ -192,8 +196,20 @@
- 	    break;
- 	case 0x102b:		    driverList[0] = "mga";	break;
- 	case 0x10c8:		    driverList[0] = "neomagic"; break;
--	case 0x10de: case 0x12d2:   driverList[0] = "nv";	break;
--	case 0x1106:		    driverList[0] = "openchrome"; break;
-+	case 0x12d2:		    driverList[0] = "nv";	break;
-+	case 0x10de:
-+		driverList[0] = "nvidia";
-+		driverList[1] = "nouveau";
-+		/* GeForce 6150SE support broken (bnc #465190/544674) */
-+		if (dev->device_id != 0x03D0) {
-+			driverList[2] = "nv";
-+		}
-+		break;
-+	case 0x1106:
-+		driverList[0] = "via";
-+		driverList[1] = "openchrome";
-+		driverList[2] = "unichrome";
-+		break;
-         case 0x1b36:		    driverList[0] = "qxl"; break;
- 	case 0x1163:		    driverList[0] = "rendition"; break;
- 	case 0x5333:
diff --git a/contrib/packages/rpm/sle11/SOURCES/edit_data_sanity_check.diff b/contrib/packages/rpm/sle11/SOURCES/edit_data_sanity_check.diff
deleted file mode 100644
index 2fe0daf..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/edit_data_sanity_check.diff
+++ /dev/null
@@ -1,21 +0,0 @@
-Index: xorg-server-1.6.3.901/hw/xfree86/modes/xf86Crtc.c
-================================================================================
---- xorg-server-1.7.99/hw/xfree86/modes/xf86Crtc.c
-+++ xorg-server-1.7.99/hw/xfree86/modes/xf86Crtc.c
-@@ -2916,8 +2916,14 @@
-                              p->output->MonInfo->features.vsize);
-     if (det_mon->type == DT &&
-         det_mon->section.d_timings.h_size != 0 &&
--        det_mon->section.d_timings.v_size != 0) {
--
-+        det_mon->section.d_timings.v_size != 0 &&
-+	det_mon->section.d_timings.v_size != 0 &&
-+	/* some sanity checking for aspect ration */
-+	((det_mon->section.d_timings.h_size /
-+	  det_mon->section.d_timings.v_size) < 2) &&
-+	((det_mon->section.d_timings.v_size /
-+	  det_mon->section.d_timings.h_size) < 2)
-+    ) {
-         p->output->mm_width = det_mon->section.d_timings.h_size;
-         p->output->mm_height = det_mon->section.d_timings.v_size;
-         p->ret = TRUE;
diff --git a/contrib/packages/rpm/sle11/SOURCES/fbdevhw.diff b/contrib/packages/rpm/sle11/SOURCES/fbdevhw.diff
deleted file mode 100644
index b155372..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/fbdevhw.diff
+++ /dev/null
@@ -1,30 +0,0 @@
-Index: hw/xfree86/fbdevhw/fbdevhw.c
-================================================================================
---- hw/xfree86/fbdevhw/fbdevhw.c
-+++ hw/xfree86/fbdevhw/fbdevhw.c
-@@ -957,9 +957,10 @@
- 			return;
- 	}
- 
-+	/* Novell Bug #146462 */
- 	if (-1 == ioctl(fPtr->fd, FBIOBLANK, (void *)fbmode))
--		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
--			   "FBIOBLANK: %s\n", strerror(errno));
-+		xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-+			   "FBIOBLANK: %s (Screen blanking not supported by vesafb of Linux Kernel)\n", strerror(errno));
- }
- 
- Bool
-@@ -975,9 +976,10 @@
- 
- 	unblank = xf86IsUnblank(mode);
- 
-+	/* Novell Bug #146462 */
- 	if (-1 == ioctl(fPtr->fd, FBIOBLANK, (void *)(1-unblank))) {
--		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
--			   "FBIOBLANK: %s\n", strerror(errno));
-+		xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-+			   "FBIOBLANK: %s (Screen blanking not supported by vesafb of Linux Kernel)\n", strerror(errno));
- 		return FALSE;
- 	}
- 
diff --git a/contrib/packages/rpm/sle11/SOURCES/fix-dpi-values.diff b/contrib/packages/rpm/sle11/SOURCES/fix-dpi-values.diff
deleted file mode 100644
index 2406b36..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/fix-dpi-values.diff
+++ /dev/null
@@ -1,58 +0,0 @@
-Index: hw/xfree86/common/xf86Helper.c
-================================================================================
---- hw/xfree86/common/xf86Helper.c
-+++ hw/xfree86/common/xf86Helper.c
-@@ -974,12 +974,22 @@
-     } else if (pScrn->widthmm > 0 || pScrn->heightmm > 0) {
- 	from = X_CONFIG;
- 	if (pScrn->widthmm > 0) {
--	   pScrn->xDpi =
--		(int)((double)pScrn->virtualX * MMPERINCH / pScrn->widthmm);
-+	   if (pScrn->modes && pScrn->modes->HDisplay > 0) {
-+		pScrn->xDpi = 
-+		    (int)((double) pScrn->modes->HDisplay * MMPERINCH / pScrn->widthmm);
-+	   } else {
-+		pScrn->xDpi =
-+		    (int)((double)pScrn->virtualX * MMPERINCH / pScrn->widthmm);
-+	   }
- 	}
- 	if (pScrn->heightmm > 0) {
--	   pScrn->yDpi =
--		(int)((double)pScrn->virtualY * MMPERINCH / pScrn->heightmm);
-+	   if (pScrn->modes && pScrn->modes->VDisplay > 0) {
-+		pScrn->yDpi =
-+		    (int)((double)pScrn->modes->VDisplay * MMPERINCH / pScrn->heightmm);
-+	   } else {
-+		pScrn->yDpi =
-+		    (int)((double)pScrn->virtualY * MMPERINCH / pScrn->heightmm);
-+	   }
- 	}
- 	if (pScrn->xDpi > 0 && pScrn->yDpi <= 0)
- 	    pScrn->yDpi = pScrn->xDpi;
-@@ -1014,12 +1024,22 @@
- 	pScrn->widthmm = ddcWidthmm;
- 	pScrn->heightmm = ddcHeightmm;
- 	if (pScrn->widthmm > 0) {
--	   pScrn->xDpi =
--		(int)((double)pScrn->virtualX * MMPERINCH / pScrn->widthmm);
-+	    if (pScrn->modes && pScrn->modes->HDisplay > 0) {
-+		pScrn->xDpi =
-+                   (int)((double) pScrn->modes->HDisplay * MMPERINCH / pScrn->widthmm);
-+	    } else {
-+		pScrn->xDpi =
-+		   (int)((double)pScrn->virtualX * MMPERINCH / pScrn->widthmm);
-+	    }
- 	}
- 	if (pScrn->heightmm > 0) {
--	   pScrn->yDpi =
--		(int)((double)pScrn->virtualY * MMPERINCH / pScrn->heightmm);
-+	   if (pScrn->modes && pScrn->modes->VDisplay > 0) {
-+		pScrn->yDpi =
-+		   (int)((double)pScrn->modes->VDisplay * MMPERINCH / pScrn->heightmm);
-+	   } else {
-+		pScrn->yDpi =
-+		   (int)((double)pScrn->virtualY * MMPERINCH / pScrn->heightmm);
-+	   }
- 	}
- 	if (pScrn->xDpi > 0 && pScrn->yDpi <= 0)
- 	    pScrn->yDpi = pScrn->xDpi;
diff --git a/contrib/packages/rpm/sle11/SOURCES/fix_fglrx_screendepth_issue.patch b/contrib/packages/rpm/sle11/SOURCES/fix_fglrx_screendepth_issue.patch
deleted file mode 100644
index 88c8207..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/fix_fglrx_screendepth_issue.patch
+++ /dev/null
@@ -1,28 +0,0 @@
---- hw/xfree86/common/xf86AutoConfig.c.orig	2010-03-23 19:36:35.242114919 +0100
-+++ hw/xfree86/common/xf86AutoConfig.c	2010-03-23 19:46:34.037124633 +0100
-@@ -75,6 +75,13 @@
- 	"\tDevice\t" BUILTIN_DEVICE_NAME "\n" \
- 	"EndSection\n\n"
- 
-+#define BUILTIN_SCREEN_SECTION_FOR_FGLRX \
-+	"Section \"Screen\"\n" \
-+	"\tIdentifier\t" BUILTIN_SCREEN_NAME "\n" \
-+	"\tDevice\t" BUILTIN_DEVICE_NAME "\n" \
-+	"\tDefaultDepth\t24\n" \
-+	"EndSection\n\n"
-+
- #define BUILTIN_LAYOUT_SECTION_PRE \
- 	"Section \"ServerLayout\"\n" \
- 	"\tIdentifier\t\"Builtin Default Layout\"\n"
-@@ -259,7 +266,10 @@ xf86AutoConfig(void)
-     for (p = deviceList; *p; p++) {
- 	snprintf(buf, sizeof(buf), BUILTIN_DEVICE_SECTION, *p, 0, *p);
- 	AppendToConfig(buf);
--	snprintf(buf, sizeof(buf), BUILTIN_SCREEN_SECTION, *p, 0, *p, 0);
-+	if( strcmp(*p, "fglrx") == 0 )
-+		snprintf(buf, sizeof(buf), BUILTIN_SCREEN_SECTION_FOR_FGLRX, *p, 0, *p, 0);
-+	else
-+		snprintf(buf, sizeof(buf), BUILTIN_SCREEN_SECTION, *p, 0, *p, 0);
- 	AppendToConfig(buf);
-     }
- 
diff --git a/contrib/packages/rpm/sle11/SOURCES/fltk-1.3.x-clipboard.patch b/contrib/packages/rpm/sle11/SOURCES/fltk-1.3.x-clipboard.patch
deleted file mode 100644
index 3f12bc5..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/fltk-1.3.x-clipboard.patch
+++ /dev/null
@@ -1,106 +0,0 @@
-diff -up fltk-1.3.x-r8659/FL/Fl.H.orig fltk-1.3.x-r8659/FL/Fl.H
---- fltk-1.3.x-r8659/FL/Fl.H.orig	2011-05-17 16:25:56.671744548 +0200
-+++ fltk-1.3.x-r8659/FL/Fl.H	2011-05-17 16:26:05.709101536 +0200
-@@ -108,6 +108,9 @@ typedef int (*Fl_Args_Handler)(int argc,
-     \see Fl::event_dispatch(Fl_Event_Dispatch) */
- typedef int (*Fl_Event_Dispatch)(int event, Fl_Window *w);
- 
-+/** Signature of add_clipboard_notify functions passed as parameters */
-+typedef void (*Fl_Clipboard_Notify_Handler)(int source, void *data);
-+
- /** @} */ /* group callback_functions */
- 
- 
-@@ -744,6 +747,19 @@ public:
-   */
-   static void paste(Fl_Widget &receiver, int source /*=0*/); // platform dependent
-   /**
-+  FLTK will call the registered callback whenever there is a change to the
-+  selection buffer or the clipboard. The source argument indicates which
-+  of the two has changed. Only changes by other applications are reported.
-+  \note Some systems require polling to monitor the clipboard and may
-+  therefore have some delay in detecting changes.
-+  */
-+  static void add_clipboard_notify(Fl_Clipboard_Notify_Handler h, void *data);
-+  /**
-+  Stop calling the specified callback when there are changes to the selection
-+  buffer or the clipboard.
-+  */
-+  static void remove_clipboard_notify(Fl_Clipboard_Notify_Handler h);
-+  /**
-     Initiate a Drag And Drop operation. The selection buffer should be
-     filled with relevant data before calling this method. FLTK will
-     then initiate the system wide drag and drop handling. Dropped data
-diff -up fltk-1.3.x-r8659/src/Fl.cxx.orig fltk-1.3.x-r8659/src/Fl.cxx
---- fltk-1.3.x-r8659/src/Fl.cxx.orig	2011-05-18 15:20:26.667291459 +0200
-+++ fltk-1.3.x-r8659/src/Fl.cxx	2011-05-18 16:31:15.522026086 +0200
-@@ -430,6 +430,69 @@ static char in_idle;
- #endif
- 
- ////////////////////////////////////////////////////////////////
-+// Clipboard notifications
-+
-+struct Clipboard_Notify {
-+  Fl_Clipboard_Notify_Handler handler;
-+  void *data;
-+  struct Clipboard_Notify *next;
-+};
-+
-+static struct Clipboard_Notify *clip_notify_list = NULL;
-+
-+extern void fl_clipboard_notify_change(); // in Fl_<platform>.cxx
-+
-+void Fl::add_clipboard_notify(Fl_Clipboard_Notify_Handler h, void *data) {
-+  struct Clipboard_Notify *node;
-+
-+  remove_clipboard_notify(h);
-+
-+  node = new Clipboard_Notify;
-+
-+  node->handler = h;
-+  node->data = data;
-+  node->next = clip_notify_list;
-+
-+  clip_notify_list = node;
-+
-+  fl_clipboard_notify_change();
-+}
-+
-+void Fl::remove_clipboard_notify(Fl_Clipboard_Notify_Handler h) {
-+  struct Clipboard_Notify *node, **prev;
-+
-+  node = clip_notify_list;
-+  prev = &clip_notify_list;
-+  while (node != NULL) {
-+    if (node->handler == h) {
-+      *prev = node->next;
-+      delete node;
-+
-+      fl_clipboard_notify_change();
-+
-+      return;
-+    }
-+
-+    prev = &node->next;
-+    node = node->next;
-+  }
-+}
-+
-+bool fl_clipboard_notify_empty(void) {
-+  return clip_notify_list == NULL;
-+}
-+
-+void fl_trigger_clipboard_notify(int source) {
-+  struct Clipboard_Notify *node;
-+
-+  node = clip_notify_list;
-+  while (node != NULL) {
-+    node->handler(source, node->data);
-+    node = node->next;
-+  }
-+}
-+
-+////////////////////////////////////////////////////////////////
- // wait/run/check/ready:
- 
- void (*Fl::idle)(); // see Fl::add_idle.cxx for the add/remove functions
diff --git a/contrib/packages/rpm/sle11/SOURCES/fltk-1.3.x-screen_num.patch b/contrib/packages/rpm/sle11/SOURCES/fltk-1.3.x-screen_num.patch
deleted file mode 100644
index c157af6..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/fltk-1.3.x-screen_num.patch
+++ /dev/null
@@ -1,131 +0,0 @@
-diff -up fltk-1.3.0r9619/FL/Fl.H.screen_num fltk-1.3.0r9619/FL/Fl.H
---- fltk-1.3.0r9619/FL/Fl.H.screen_num	2012-07-03 13:49:28.663085580 +0200
-+++ fltk-1.3.0r9619/FL/Fl.H	2012-07-03 13:49:28.731084402 +0200
-@@ -806,6 +806,8 @@ public:
-   static void screen_xywh(int &X, int &Y, int &W, int &H, int mx, int my);
-   static void screen_xywh(int &X, int &Y, int &W, int &H, int n); 
-   static void screen_xywh(int &X, int &Y, int &W, int &H, int mx, int my, int mw, int mh);
-+  static int screen_num(int x, int y);
-+  static int screen_num(int x, int y, int w, int h);
-   static void screen_dpi(float &h, float &v, int n=0);
-   static void screen_work_area(int &X, int &Y, int &W, int &H, int mx, int my);
-   static void screen_work_area(int &X, int &Y, int &W, int &H, int n);
-diff -up fltk-1.3.0r9619/src/screen_xywh.cxx.screen_num fltk-1.3.0r9619/src/screen_xywh.cxx
---- fltk-1.3.0r9619/src/screen_xywh.cxx.screen_num	2012-03-23 17:47:53.000000000 +0100
-+++ fltk-1.3.0r9619/src/screen_xywh.cxx	2012-07-03 13:58:01.947195396 +0200
-@@ -215,21 +215,6 @@ int Fl::screen_count() {
-   return num_screens ? num_screens : 1;
- }
- 
--static int find_screen_with_point(int mx, int my) {
--  int screen = 0;
--  if (num_screens < 0) screen_init();
--  
--  for (int i = 0; i < num_screens; i ++) {
--    int sx, sy, sw, sh;
--    Fl::screen_xywh(sx, sy, sw, sh, i);
--    if ((mx >= sx) && (mx < (sx+sw)) && (my >= sy) && (my < (sy+sh))) {
--      screen = i;
--      break;
--    }
--  }
--  return screen;
--}
--
- /**
-   Gets the bounding box of a screen
-   that contains the specified screen position \p mx, \p my
-@@ -237,7 +222,7 @@ static int find_screen_with_point(int mx
-   \param[in] mx, my the absolute screen position
- */
- void Fl::screen_xywh(int &X, int &Y, int &W, int &H, int mx, int my) {
--  screen_xywh(X, Y, W, H, find_screen_with_point(mx, my));
-+  screen_xywh(X, Y, W, H, screen_num(mx, my));
- }
- 
- 
-@@ -248,7 +233,7 @@ void Fl::screen_xywh(int &X, int &Y, int
-  \param[in] mx, my the absolute screen position
-  */
- void Fl::screen_work_area(int &X, int &Y, int &W, int &H, int mx, int my) {
--  screen_work_area(X, Y, W, H, find_screen_with_point(mx, my));
-+  screen_work_area(X, Y, W, H, screen_num(mx, my));
- }
- 
- /**
-@@ -321,6 +306,38 @@ void Fl::screen_xywh(int &X, int &Y, int
- #endif // WIN32
- }
- 
-+/**
-+  Gets the screen bounding rect for the screen
-+  which intersects the most with the rectangle
-+  defined by \p mx, \p my, \p mw, \p mh.
-+  \param[out]  X,Y,W,H the corresponding screen bounding box
-+  \param[in] mx, my, mw, mh the rectangle to search for intersection with
-+  \see void screen_xywh(int &X, int &Y, int &W, int &H, int n)
-+  */
-+void Fl::screen_xywh(int &X, int &Y, int &W, int &H, int mx, int my, int mw, int mh) {
-+  screen_xywh(X, Y, W, H, screen_num(mx, my, mw, mh));
-+}
-+
-+/**
-+  Gets the screen number of a screen
-+  that contains the specified screen position \p x, \p y
-+  \param[in] x, y the absolute screen position
-+*/
-+int Fl::screen_num(int x, int y) {
-+  int screen = 0;
-+  if (num_screens < 0) screen_init();
-+  
-+  for (int i = 0; i < num_screens; i ++) {
-+    int sx, sy, sw, sh;
-+    Fl::screen_xywh(sx, sy, sw, sh, i);
-+    if ((x >= sx) && (x < (sx+sw)) && (y >= sy) && (y < (sy+sh))) {
-+      screen = i;
-+      break;
-+    }
-+  }
-+  return screen;
-+}
-+
- static inline float fl_intersection(int x1, int y1, int w1, int h1,
-                         int x2, int y2, int w2, int h2) {
-   if(x1+w1 < x2 || x2+w2 < x1 || y1+h1 < y2 || y2+h2 < y1)
-@@ -333,30 +350,27 @@ static inline float fl_intersection(int
- }
- 
- /**
--  Gets the screen bounding rect for the screen
-+  Gets the screen number for the screen
-   which intersects the most with the rectangle
--  defined by \p mx, \p my, \p mw, \p mh.
--  \param[out]  X,Y,W,H the corresponding screen bounding box
--  \param[in] mx, my, mw, mh the rectangle to search for intersection with
--  \see void screen_xywh(int &X, int &Y, int &W, int &H, int n)
-+  defined by \p x, \p y, \p w, \p h.
-+  \param[in] x, y, w, h the rectangle to search for intersection with
-   */
--void Fl::screen_xywh(int &X, int &Y, int &W, int &H, int mx, int my, int mw, int mh) {
-+int Fl::screen_num(int x, int y, int w, int h) {
-   int best_screen = 0;
-   float best_intersection = 0.;
-   for(int i = 0; i < Fl::screen_count(); i++) {
-     int sx, sy, sw, sh;
-     Fl::screen_xywh(sx, sy, sw, sh, i);
--    float sintersection = fl_intersection(mx, my, mw, mh, sx, sy, sw, sh);
-+    float sintersection = fl_intersection(x, y, w, h, sx, sy, sw, sh);
-     if(sintersection > best_intersection) {
-       best_screen = i;
-       best_intersection = sintersection;
-     }
-   }
--  screen_xywh(X, Y, W, H, best_screen);
-+  return best_screen;
- }
- 
- 
--
- /**
-  Gets the screen resolution in dots-per-inch for the given screen.
-  \param[out]  h, v  horizontal and vertical resolution
diff --git a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v2.3.0-modal.patch b/contrib/packages/rpm/sle11/SOURCES/fltk-1_v2.3.0-modal.patch
deleted file mode 100644
index 7b1b791..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v2.3.0-modal.patch
+++ /dev/null
@@ -1,75 +0,0 @@
-diff -bur fltk-1.3.0r9619.org/src/Fl_cocoa.mm fltk-1.3.0r9619/src/Fl_cocoa.mm
---- fltk-1.3.0r9619.org/src/Fl_cocoa.mm	2012-06-19 12:54:43.694231638 +0200
-+++ fltk-1.3.0r9619/src/Fl_cocoa.mm	2012-06-19 12:57:05.899048602 +0200
-@@ -697,12 +697,9 @@
-     return NO;	// prevent the caption to be redrawn as active on click
- 		//  when another modal window is currently the key win
- 
--  return !(w->tooltip_window() || w->menu_window());
-+  return !w->tooltip_window();
- }
- 
--// TODO see if we really need a canBecomeMainWindow ...
--#if 0
--
- - (BOOL)canBecomeMainWindow
- {
-   if (Fl::modal_ && (Fl::modal_ != w))
-@@ -711,7 +708,6 @@
- 
-   return !(w->tooltip_window() || w->menu_window());
- }
--#endif
- 
- @end
- 
-diff -bur fltk-1.3.0r9619.org/src/Fl_win32.cxx fltk-1.3.0r9619/src/Fl_win32.cxx
---- fltk-1.3.0r9619.org/src/Fl_win32.cxx	2012-06-19 12:54:43.696231735 +0200
-+++ fltk-1.3.0r9619/src/Fl_win32.cxx	2012-06-19 12:54:43.803236862 +0200
-@@ -1065,6 +1065,10 @@
-     break;
- 
-   case WM_SETFOCUS:
-+    if ((Fl::modal_) && (Fl::modal_ != window)) {
-+      SetFocus(fl_xid(Fl::modal_));
-+      return 0;
-+    }
-     Fl::handle(FL_FOCUS, window);
-     break;
- 
-@@ -1826,6 +1830,11 @@
-     Fl::e_number = old_event;
-     w->redraw(); // force draw to happen
-   }
-+
-+  // Needs to be done before ShowWindow() to get the correct behaviour
-+  // when we get WM_SETFOCUS.
-+  if (w->modal()) {Fl::modal_ = w; fl_fix_focus();}
-+
-   // If we've captured the mouse, we dont want to activate any
-   // other windows from the code, or we lose the capture.
-   ShowWindow(x->xid, !showit ? SW_SHOWMINNOACTIVE :
-@@ -1843,7 +1852,6 @@
-     }
-   }
- 
--  if (w->modal()) {Fl::modal_ = w; fl_fix_focus();}
-   return x;
- }
- 
-diff -bur fltk-1.3.0r9619.org/src/Fl_x.cxx fltk-1.3.0r9619/src/Fl_x.cxx
---- fltk-1.3.0r9619.org/src/Fl_x.cxx	2012-06-19 12:54:43.697231783 +0200
-+++ fltk-1.3.0r9619/src/Fl_x.cxx	2012-06-19 12:54:43.804236911 +0200
-@@ -2101,6 +2101,12 @@
-       while (wp->parent()) wp = wp->window();
-       XSetTransientForHint(fl_display, xp->xid, fl_xid(wp));
-       if (!wp->visible()) showit = 0; // guess that wm will not show it
-+      if (win->modal()) {
-+        Atom net_wm_state = XInternAtom (fl_display, "_NET_WM_STATE", 0);
-+        Atom net_wm_state_skip_taskbar = XInternAtom (fl_display, "_NET_WM_STATE_MODAL", 0);
-+        XChangeProperty (fl_display, xp->xid, net_wm_state, XA_ATOM, 32,
-+            PropModeAppend, (unsigned char*) &net_wm_state_skip_taskbar, 1);
-+      }
-     }
- 
-     // Make sure that borderless windows do not show in the task bar
diff --git a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v2.3.x-clipboard-osx.patch b/contrib/packages/rpm/sle11/SOURCES/fltk-1_v2.3.x-clipboard-osx.patch
deleted file mode 100644
index 22e6939..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v2.3.x-clipboard-osx.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-diff -bur fltk-1.3.0r9619.org/src/Fl_cocoa.mm fltk-1.3.0r9619/src/Fl_cocoa.mm
---- fltk-1.3.0r9619.org/src/Fl_cocoa.mm	2012-06-18 19:24:30.971688769 +0200
-+++ fltk-1.3.0r9619/src/Fl_cocoa.mm	2012-06-18 19:25:25.700310375 +0200
-@@ -1319,9 +1319,13 @@
- }
- @end
- 
-+static void clipboard_check(void);
-+
- @implementation FLApplication
- + (void)sendEvent:(NSEvent *)theEvent
- {
-+  // update clipboard status
-+  clipboard_check();
-   NSEventType type = [theEvent type];  
-   if (type == NSLeftMouseDown) {
-     fl_lock_function();
-@@ -2790,6 +2794,26 @@
-     PasteboardCreate(kPasteboardClipboard, &myPasteboard);
- }
- 
-+extern void fl_trigger_clipboard_notify(int source);
-+
-+void fl_clipboard_notify_change() {
-+  // No need to do anything here...
-+}
-+
-+static void clipboard_check(void)
-+{
-+  PasteboardSyncFlags flags;
-+
-+  allocatePasteboard();
-+  flags = PasteboardSynchronize(myPasteboard);
-+
-+  if (!(flags & kPasteboardModified))
-+    return;
-+  if (flags & kPasteboardClientIsOwner)
-+    return;
-+
-+  fl_trigger_clipboard_notify(1);
-+}
- 
- /*
-  * create a selection
diff --git a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v2.3.x-clipboard-win32.patch b/contrib/packages/rpm/sle11/SOURCES/fltk-1_v2.3.x-clipboard-win32.patch
deleted file mode 100644
index ac94779..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v2.3.x-clipboard-win32.patch
+++ /dev/null
@@ -1,99 +0,0 @@
-diff -ur fltk-1.3.0r9110.org/src/Fl.cxx fltk-1.3.0r9110/src/Fl.cxx
---- fltk-1.3.0r9110.org/src/Fl.cxx	2012-06-17 19:47:09.988183253 +0200
-+++ fltk-1.3.0r9110/src/Fl.cxx	2012-06-17 19:47:10.127189919 +0200
-@@ -1421,6 +1421,7 @@
- // hide() destroys the X window, it does not do unmap!
- 
- #if defined(WIN32)
-+extern void fl_clipboard_notify_untarget(HWND wnd);
- extern void fl_update_clipboard(void);
- #elif USE_XFT
- extern void fl_destroy_xft_draw(Window);
-@@ -1471,6 +1472,8 @@
-   // to destroy the window that owns the selection.
-   if (GetClipboardOwner()==ip->xid)
-     fl_update_clipboard();
-+  // Make sure we unlink this window from the clipboard chain
-+  fl_clipboard_notify_untarget(ip->xid);
-   // Send a message to myself so that I'll get out of the event loop...
-   PostMessage(ip->xid, WM_APP, 0, 0);
-   if (ip->private_dc) fl_release_dc(ip->xid, ip->private_dc);
-diff -ur fltk-1.3.0r9110.org/src/Fl_win32.cxx fltk-1.3.0r9110/src/Fl_win32.cxx
---- fltk-1.3.0r9110.org/src/Fl_win32.cxx	2012-06-17 19:47:09.987183205 +0200
-+++ fltk-1.3.0r9110/src/Fl_win32.cxx	2012-06-17 19:47:19.069618739 +0200
-@@ -646,6 +646,38 @@
-   }
- }
- 
-+static HWND clipboard_wnd = 0;
-+static HWND next_clipboard_wnd = 0;
-+
-+static bool initial_clipboard = true;
-+
-+void fl_clipboard_notify_change() {
-+  // No need to do anything here...
-+}
-+
-+void fl_clipboard_notify_target(HWND wnd) {
-+  if (clipboard_wnd)
-+    return;
-+
-+  // We get one fake WM_DRAWCLIPBOARD immediately, which we therefore
-+  // need to ignore.
-+  initial_clipboard = true;
-+
-+  clipboard_wnd = wnd;
-+  next_clipboard_wnd = SetClipboardViewer(wnd);
-+}
-+
-+void fl_clipboard_notify_untarget(HWND wnd) {
-+  if (wnd != clipboard_wnd)
-+    return;
-+
-+  ChangeClipboardChain(wnd, next_clipboard_wnd);
-+  clipboard_wnd = next_clipboard_wnd = 0;
-+
-+  if (Fl::first_window())
-+    fl_clipboard_notify_target(fl_xid(Fl::first_window()));
-+}
-+
- ////////////////////////////////////////////////////////////////
- char fl_is_ime = 0;
- void fl_get_codepage()
-@@ -1327,6 +1359,27 @@
-     Fl::handle(FL_SCREEN_CONFIGURATION_CHANGED, NULL);
-     return 0;
- 
-+  case WM_CHANGECBCHAIN:
-+    if ((hWnd == clipboard_wnd) &&
-+        (next_clipboard_wnd == (HWND)wParam)) {
-+      next_clipboard_wnd = (HWND)lParam;
-+      return 0;
-+    }
-+    break;
-+
-+  case WM_DRAWCLIPBOARD:
-+    // When the clipboard moves between two FLTK windows,
-+    // fl_i_own_selection will temporarily be false as we are
-+    // processing this message. Hence the need to use fl_find().
-+    if (!initial_clipboard && !fl_find(GetClipboardOwner()))
-+      fl_trigger_clipboard_notify(1);
-+    initial_clipboard = false;
-+
-+    if (next_clipboard_wnd)
-+      SendMessage(next_clipboard_wnd, WM_DRAWCLIPBOARD, wParam, lParam);
-+
-+    return 0;
-+
-   default:
-     if (Fl::handle(0,0)) return 0;
-     break;
-@@ -1685,6 +1738,8 @@
-   x->next = Fl_X::first;
-   Fl_X::first = x;
- 
-+  fl_clipboard_notify_target(x->xid);
-+
-   x->wait_for_expose = 1;
-   if (fl_show_iconic) {showit = 0; fl_show_iconic = 0;}
-   if (showit) {
diff --git a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v3.3.0-icons.patch b/contrib/packages/rpm/sle11/SOURCES/fltk-1_v3.3.0-icons.patch
deleted file mode 100644
index 20b30b8..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v3.3.0-icons.patch
+++ /dev/null
@@ -1,645 +0,0 @@
-diff -ur fltk-1.3.2.org/FL/Fl_Window.H fltk-1.3.2/FL/Fl_Window.H
---- fltk-1.3.2.org/FL/Fl_Window.H	2013-01-16 10:49:40.904228200 +0100
-+++ fltk-1.3.2/FL/Fl_Window.H	2013-01-16 10:49:55.554353925 +0100
-@@ -22,6 +22,10 @@
- #ifndef Fl_Window_H
- #define Fl_Window_H
- 
-+#ifdef WIN32
-+#include <windows.h>
-+#endif
-+
- #include "Fl_Group.H"
- 
- #define FL_WINDOW 0xF0		///< window type id all subclasses have type() >= this
-@@ -73,9 +77,19 @@
-   friend class Fl_X;
-   Fl_X *i; // points at the system-specific stuff
- 
-+  struct icon_data {
-+    const void *legacy_icon;
-+    Fl_RGB_Image **icons;
-+    int count;
-+#ifdef WIN32
-+    HICON big_icon;
-+    HICON small_icon;
-+#endif
-+  };
-+
-   const char* iconlabel_;
-   char* xclass_;
--  const void* icon_;
-+  struct icon_data *icon_;
-   // size_range stuff:
-   int minw, minh, maxw, maxh;
-   int dw, dh, aspect;
-@@ -121,6 +135,8 @@
-   */
-   int force_position() const { return ((flags() & FORCE_POSITION)?1:0); }
- 
-+  void free_icons();
-+
- public:
- 
-   /**
-@@ -350,6 +366,18 @@
-   static const char *default_xclass();
-   const char* xclass() const;
-   void xclass(const char* c);
-+
-+  static void default_icon(const Fl_RGB_Image*);
-+  static void default_icons(const Fl_RGB_Image*[], int);
-+  void icon(const Fl_RGB_Image*);
-+  void icons(const Fl_RGB_Image*[], int);
-+
-+#ifdef WIN32
-+  static void default_icons(HICON big_icon, HICON small_icon);
-+  void icons(HICON big_icon, HICON small_icon);
-+#endif
-+
-+  /* for legacy compatibility */
-   const void* icon() const;
-   void icon(const void * ic);
- 
-diff -ur fltk-1.3.2.org/FL/mac.H fltk-1.3.2/FL/mac.H
---- fltk-1.3.2.org/FL/mac.H	2013-01-16 10:49:40.904228200 +0100
-+++ fltk-1.3.2/FL/mac.H	2013-01-16 10:49:55.554353925 +0100
-@@ -120,6 +120,9 @@
-   void collapse(void);
-   WindowRef window_ref(void);
-   void set_key_window(void);
-+  // OS X doesn't have per window icons
-+  static void set_default_icons(const Fl_RGB_Image*[], int) {};
-+  void set_icons() {};
-   int set_cursor(Fl_Cursor);
-   int set_cursor(const Fl_RGB_Image*, int, int);
-   static CGImageRef CGImage_from_window_rect(Fl_Window *win, int x, int y, int w, int h);
-diff -ur fltk-1.3.2.org/FL/win32.H fltk-1.3.2/FL/win32.H
---- fltk-1.3.2.org/FL/win32.H	2013-01-16 10:49:40.904228200 +0100
-+++ fltk-1.3.2/FL/win32.H	2013-01-16 10:49:55.555355617 +0100
-@@ -84,6 +84,9 @@
-   void flush() {w->flush();}
-   void set_minmax(LPMINMAXINFO minmax);
-   void mapraise();
-+  static void set_default_icons(const Fl_RGB_Image*[], int);
-+  static void set_default_icons(HICON, HICON);
-+  void set_icons();
-   int set_cursor(Fl_Cursor);
-   int set_cursor(const Fl_RGB_Image*, int, int);
-   static Fl_X* make(Fl_Window*);
-diff -ur fltk-1.3.2.org/FL/x.H fltk-1.3.2/FL/x.H
---- fltk-1.3.2.org/FL/x.H	2013-01-16 10:49:40.904228200 +0100
-+++ fltk-1.3.2/FL/x.H	2013-01-16 10:49:55.555355617 +0100
-@@ -154,6 +154,8 @@
-   static Fl_X* i(const Fl_Window* wi) {return wi->i;}
-   void setwindow(Fl_Window* wi) {w=wi; wi->i=this;}
-   void sendxjunk();
-+  static void set_default_icons(const Fl_RGB_Image*[], int);
-+  void set_icons();
-   int set_cursor(Fl_Cursor);
-   int set_cursor(const Fl_RGB_Image*, int, int);
-   static void make_xid(Fl_Window*,XVisualInfo* =fl_visual, Colormap=fl_colormap);
-diff -ur fltk-1.3.2.org/src/Fl.cxx fltk-1.3.2/src/Fl.cxx
---- fltk-1.3.2.org/src/Fl.cxx	2013-01-16 10:49:40.895228113 +0100
-+++ fltk-1.3.2/src/Fl.cxx	2013-01-16 10:49:55.556137979 +0100
-@@ -1530,6 +1530,8 @@
-   if (xclass_) {
-     free(xclass_);
-   }
-+  free_icons();
-+  delete icon_;
- }
- 
- // FL_SHOW and FL_HIDE are called whenever the visibility of this widget
-diff -ur fltk-1.3.2.org/src/Fl_win32.cxx fltk-1.3.2/src/Fl_win32.cxx
---- fltk-1.3.2.org/src/Fl_win32.cxx	2013-01-16 10:49:40.911227539 +0100
-+++ fltk-1.3.2/src/Fl_win32.cxx	2013-01-16 10:49:55.556137979 +0100
-@@ -1804,6 +1804,8 @@
-   );
-   if (lab) free(lab);
- 
-+  x->set_icons();
-+
-   if (w->fullscreen_active()) {
-   /* We need to make sure that the fullscreen is created on the
-      default monitor, ie the desktop where the shortcut is located
-@@ -2034,71 +2036,19 @@
- 
- ////////////////////////////////////////////////////////////////
- 
--#ifndef IDC_HAND
--#  define IDC_HAND  MAKEINTRESOURCE(32649)
--#endif // !IDC_HAND
--
--int Fl_X::set_cursor(Fl_Cursor c) {
--  LPSTR n;
--  HCURSOR new_cursor;
--
--  if (c == FL_CURSOR_NONE)
--    new_cursor = NULL;
--  else {
--    switch (c) {
--    case FL_CURSOR_ARROW:   n = IDC_ARROW; break;
--    case FL_CURSOR_CROSS:   n = IDC_CROSS; break;
--    case FL_CURSOR_WAIT:    n = IDC_WAIT; break;
--    case FL_CURSOR_INSERT:  n = IDC_IBEAM; break;
--    case FL_CURSOR_HAND:    n = IDC_HAND; break;
--    case FL_CURSOR_HELP:    n = IDC_HELP; break;
--    case FL_CURSOR_MOVE:    n = IDC_SIZEALL; break;
--    case FL_CURSOR_N:
--    case FL_CURSOR_S:
--      // FIXME: Should probably have fallbacks for these instead
--    case FL_CURSOR_NS:      n = IDC_SIZENS; break;
--    case FL_CURSOR_NE:
--    case FL_CURSOR_SW:
--      // FIXME: Dito.
--    case FL_CURSOR_NESW:    n = IDC_SIZENESW; break;
--    case FL_CURSOR_E:
--    case FL_CURSOR_W:
--      // FIXME: Dito.
--    case FL_CURSOR_WE:      n = IDC_SIZEWE; break;
--    case FL_CURSOR_SE:
--    case FL_CURSOR_NW:
--      // FIXME: Dito.
--    case FL_CURSOR_NWSE:    n = IDC_SIZENWSE; break;
--    default:
--      return 0;
--    }
--
--    new_cursor = LoadCursor(NULL, n);
--    if (new_cursor == NULL)
--      return 0;
--  }
--
--  if ((cursor != NULL) && custom_cursor)
--    DestroyIcon(cursor);
--
--  cursor = new_cursor;
--  custom_cursor = 0;
--
--  SetCursor(cursor);
--
--  return 1;
--}
--
--int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
-+static HICON image_to_icon(const Fl_RGB_Image *image, bool is_icon=true,
-+                           int hotx = 0, int hoty = 0) {
-   BITMAPV5HEADER bi;
-   HBITMAP bitmap, mask;
-   DWORD *bits;
--  HCURSOR new_cursor;
-+  HICON icon;
- 
-+  if (!is_icon) {
-   if ((hotx < 0) || (hotx >= image->w()))
--    return 0;
-+      return NULL;
-   if ((hoty < 0) || (hoty >= image->h()))
--    return 0;
-+      return NULL;
-+  }
- 
-   memset(&bi, 0, sizeof(BITMAPV5HEADER));
- 
-@@ -2120,7 +2070,7 @@
-   ReleaseDC(NULL, hdc);
- 
-   if (bits == NULL)
--    return 0;
-+    return NULL;
- 
-   const uchar *i = (const uchar*)*image->data();
-   for (int y = 0;y < image->h();y++) {
-@@ -2149,22 +2099,206 @@
-   mask = CreateBitmap(image->w(),image->h(),1,1,NULL);
-   if (mask == NULL) {
-     DeleteObject(bitmap);
--    return 0;
-+    return NULL;
-   }
- 
-   ICONINFO ii;
- 
--  ii.fIcon    = FALSE;
-+  ii.fIcon    = is_icon;
-   ii.xHotspot = hotx;
-   ii.yHotspot = hoty;
-   ii.hbmMask  = mask;
-   ii.hbmColor = bitmap;
- 
--  new_cursor = CreateIconIndirect(&ii);
-+  icon = CreateIconIndirect(&ii);
- 
-   DeleteObject(bitmap);
-   DeleteObject(mask);
- 
-+  if (icon == NULL)
-+    return NULL;
-+
-+  return icon;
-+}
-+
-+////////////////////////////////////////////////////////////////
-+
-+static HICON default_big_icon = NULL;
-+static HICON default_small_icon = NULL;
-+
-+const Fl_RGB_Image *find_best_icon(int ideal_width, 
-+                                   const Fl_RGB_Image *icons[], int count) {
-+  const Fl_RGB_Image *best;
-+
-+  best = NULL;
-+
-+  for (int i = 0;i < count;i++) {
-+    if (best == NULL)
-+      best = icons[i];
-+    else {
-+      if (best->w() < ideal_width) {
-+        if (icons[i]->w() > best->w())
-+          best = icons[i];
-+      } else {
-+        if ((icons[i]->w() >= ideal_width) &&
-+            (icons[i]->w() < best->w()))
-+          best = icons[i];
-+      }
-+    }
-+  }
-+
-+  return best;
-+}
-+
-+void Fl_X::set_default_icons(const Fl_RGB_Image *icons[], int count) {
-+  const Fl_RGB_Image *best_big, *best_small;
-+
-+  if (default_big_icon != NULL)
-+    DestroyIcon(default_big_icon);
-+  if (default_small_icon != NULL)
-+    DestroyIcon(default_small_icon);
-+
-+  best_big = find_best_icon(GetSystemMetrics(SM_CXICON), icons, count);
-+  best_small = find_best_icon(GetSystemMetrics(SM_CXSMICON), icons, count);
-+
-+  if (best_big != NULL)
-+    default_big_icon = image_to_icon(best_big);
-+  else
-+    default_big_icon = NULL;
-+
-+  if (best_small != NULL)
-+    default_small_icon = image_to_icon(best_small);
-+  else
-+    default_small_icon = NULL;
-+}
-+
-+void Fl_X::set_default_icons(HICON big_icon, HICON small_icon) {
-+  if (default_big_icon != NULL)
-+    DestroyIcon(default_big_icon);
-+  if (default_small_icon != NULL)
-+    DestroyIcon(default_small_icon);
-+
-+  if (big_icon != NULL)
-+    default_big_icon = CopyIcon(big_icon);
-+  if (small_icon != NULL)
-+    default_small_icon = CopyIcon(small_icon);
-+}
-+
-+void Fl_X::set_icons() {
-+  HICON big_icon, small_icon;
-+
-+  big_icon = NULL;
-+  small_icon = NULL;
-+
-+  if (w->icon_->count) {
-+    const Fl_RGB_Image *best_big, *best_small;
-+
-+    best_big = find_best_icon(GetSystemMetrics(SM_CXICON),
-+                              (const Fl_RGB_Image **)w->icon_->icons,
-+                              w->icon_->count);
-+    best_small = find_best_icon(GetSystemMetrics(SM_CXSMICON),
-+                                (const Fl_RGB_Image **)w->icon_->icons,
-+                                w->icon_->count);
-+
-+    if (best_big != NULL)
-+      big_icon = image_to_icon(best_big);
-+    if (best_small != NULL)
-+      small_icon = image_to_icon(best_small);
-+  } else {
-+    big_icon = default_big_icon;
-+    small_icon = default_small_icon;
-+  }
-+
-+  if (big_icon != NULL)
-+    SendMessage(xid, WM_SETICON, ICON_BIG, (LPARAM)big_icon);
-+  if (small_icon != NULL)
-+    SendMessage(xid, WM_SETICON, ICON_SMALL, (LPARAM)small_icon);
-+
-+  if (w->icon_->count) {
-+    if (big_icon != NULL)
-+      DestroyIcon(big_icon);
-+    if (small_icon != NULL)
-+      DestroyIcon(small_icon);
-+  }
-+}
-+
-+void Fl_Window::default_icons(HICON big_icon, HICON small_icon) {
-+  Fl_X::set_default_icons(big_icon, small_icon);
-+}
-+
-+void Fl_Window::icons(HICON big_icon, HICON small_icon) {
-+  free_icons();
-+
-+  if (big_icon != NULL)
-+    icon_->big_icon = CopyIcon(big_icon);
-+  if (small_icon != NULL)
-+    icon_->small_icon = CopyIcon(small_icon);
-+
-+  if (i)
-+    i->set_icons();
-+}
-+
-+////////////////////////////////////////////////////////////////
-+
-+#ifndef IDC_HAND
-+#  define IDC_HAND  MAKEINTRESOURCE(32649)
-+#endif // !IDC_HAND
-+
-+int Fl_X::set_cursor(Fl_Cursor c) {
-+  LPSTR n;
-+  HCURSOR new_cursor;
-+
-+  if (c == FL_CURSOR_NONE)
-+    new_cursor = NULL;
-+  else {
-+    switch (c) {
-+    case FL_CURSOR_ARROW:   n = IDC_ARROW; break;
-+    case FL_CURSOR_CROSS:   n = IDC_CROSS; break;
-+    case FL_CURSOR_WAIT:    n = IDC_WAIT; break;
-+    case FL_CURSOR_INSERT:  n = IDC_IBEAM; break;
-+    case FL_CURSOR_HAND:    n = IDC_HAND; break;
-+    case FL_CURSOR_HELP:    n = IDC_HELP; break;
-+    case FL_CURSOR_MOVE:    n = IDC_SIZEALL; break;
-+    case FL_CURSOR_N:
-+    case FL_CURSOR_S:
-+      // FIXME: Should probably have fallbacks for these instead
-+    case FL_CURSOR_NS:      n = IDC_SIZENS; break;
-+    case FL_CURSOR_NE:
-+    case FL_CURSOR_SW:
-+      // FIXME: Dito.
-+    case FL_CURSOR_NESW:    n = IDC_SIZENESW; break;
-+    case FL_CURSOR_E:
-+    case FL_CURSOR_W:
-+      // FIXME: Dito.
-+    case FL_CURSOR_WE:      n = IDC_SIZEWE; break;
-+    case FL_CURSOR_SE:
-+    case FL_CURSOR_NW:
-+      // FIXME: Dito.
-+    case FL_CURSOR_NWSE:    n = IDC_SIZENWSE; break;
-+    default:
-+      return 0;
-+    }
-+
-+    new_cursor = LoadCursor(NULL, n);
-+    if (new_cursor == NULL)
-+      return 0;
-+  }
-+
-+  if ((cursor != NULL) && custom_cursor)
-+    DestroyIcon(cursor);
-+
-+  cursor = new_cursor;
-+  custom_cursor = 0;
-+
-+  SetCursor(cursor);
-+
-+  return 1;
-+}
-+
-+int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
-+  HCURSOR new_cursor;
-+
-+  new_cursor = image_to_icon(image, false, hotx, hoty);
-   if (new_cursor == NULL)
-     return 0;
- 
-diff -ur fltk-1.3.2.org/src/Fl_Window.cxx fltk-1.3.2/src/Fl_Window.cxx
---- fltk-1.3.2.org/src/Fl_Window.cxx	2013-01-16 10:49:40.908130903 +0100
-+++ fltk-1.3.2/src/Fl_Window.cxx	2013-01-16 10:49:55.557353865 +0100
-@@ -23,6 +23,7 @@
- #include <config.h>
- #include <FL/Fl.H>
- #include <FL/x.H>
-+#include <FL/Fl_RGB_Image.H>
- #include <FL/Fl_Window.H>
- #include <stdlib.h>
- #include "flstring.h"
-@@ -45,7 +46,8 @@
-   }
-   i = 0;
-   xclass_ = 0;
--  icon_ = 0;
-+  icon_ = new icon_data;
-+  memset(icon_, 0, sizeof(*icon_));
-   iconlabel_ = 0;
-   resizable(0);
-   size_range_set = 0;
-@@ -264,16 +266,68 @@
-   }
- }
- 
-+void Fl_Window::default_icon(const Fl_RGB_Image *icon) {
-+  default_icons(&icon, 1);
-+}
-+
-+void Fl_Window::default_icons(const Fl_RGB_Image **icons, int count) {
-+  Fl_X::set_default_icons(icons, count);
-+}
-+
-+void Fl_Window::icon(const Fl_RGB_Image *icon) {
-+  icons(&icon, 1);
-+}
-+
-+void Fl_Window::icons(const Fl_RGB_Image **icons, int count) {
-+  free_icons();
-+
-+  if (count > 0) {
-+    icon_->icons = new Fl_RGB_Image*[count];
-+    icon_->count = count;
-+    // FIXME: Fl_RGB_Image lacks const modifiers on methods
-+    for (int i = 0;i < count;i++)
-+      icon_->icons[i] = (Fl_RGB_Image*)((Fl_RGB_Image*)icons[i])->copy();
-+  }
-+
-+  if (i)
-+    i->set_icons();
-+}
-+
- /** Gets the current icon window target dependent data. */
- const void *Fl_Window::icon() const {
--  return icon_;
-+  return icon_->legacy_icon;
- }
- 
- /** Sets the current icon window target dependent data. */
- void Fl_Window::icon(const void * ic) {
--  icon_ = ic;
-+  free_icons();
-+  icon_->legacy_icon = ic;
- }
- 
-+void Fl_Window::free_icons() {
-+  int i;
-+
-+  icon_->legacy_icon = 0L;
-+
-+  if (icon_->icons) {
-+    for (i = 0;i < icon_->count;i++)
-+      delete icon_->icons[i];
-+    delete [] icon_->icons;
-+    icon_->icons = 0L;
-+  }
-+
-+  icon_->count = 0;
-+
-+#ifdef WIN32
-+  if (icon_->big_icon)
-+    DestroyIcon(icon_->big_icon);
-+  if (icon_->small_icon)
-+    DestroyIcon(icon_->small_icon);
-+
-+  icon_->big_icon = NULL;
-+  icon_->small_icon = NULL;
-+#endif
-+}
- 
- //
- // End of "$Id: Fl_Window.cxx 9706 2012-11-06 20:46:14Z matt $".
-diff -ur fltk-1.3.2.org/src/Fl_x.cxx fltk-1.3.2/src/Fl_x.cxx
---- fltk-1.3.2.org/src/Fl_x.cxx	2013-01-16 10:49:40.912227213 +0100
-+++ fltk-1.3.2/src/Fl_x.cxx	2013-01-16 10:49:55.558137113 +0100
-@@ -345,6 +345,7 @@
- Atom fl_NET_WM_STATE;
- Atom fl_NET_WM_STATE_FULLSCREEN;
- Atom fl_NET_WORKAREA;
-+Atom fl_NET_WM_ICON;
- 
- /*
-   X defines 32-bit-entities to have a format value of max. 32,
-@@ -709,6 +710,7 @@
-   fl_NET_WM_STATE       = XInternAtom(d, "_NET_WM_STATE",       0);
-   fl_NET_WM_STATE_FULLSCREEN = XInternAtom(d, "_NET_WM_STATE_FULLSCREEN", 0);
-   fl_NET_WORKAREA       = XInternAtom(d, "_NET_WORKAREA",       0);
-+  fl_NET_WM_ICON        = XInternAtom(d, "_NET_WM_ICON",        0);
- 
-   if (sizeof(Atom) < 4)
-     atom_bits = sizeof(Atom) * 8;
-@@ -2138,12 +2140,14 @@
-       fl_show_iconic = 0;
-       showit = 0;
-     }
--    if (win->icon()) {
--      hints->icon_pixmap = (Pixmap)win->icon();
-+    if (win->icon_->legacy_icon) {
-+      hints->icon_pixmap = (Pixmap)win->icon_->legacy_icon;
-       hints->flags       |= IconPixmapHint;
-     }
-     XSetWMHints(fl_display, xp->xid, hints);
-     XFree(hints);
-+
-+    xp->set_icons();
-   }
- 
-   // set the window type for menu and tooltip windows to avoid animations (compiz)
-@@ -2263,6 +2267,93 @@
- 
- ////////////////////////////////////////////////////////////////
- 
-+static unsigned long *default_net_wm_icons = 0L;
-+static size_t default_net_wm_icons_size = 0;
-+
-+void icons_to_property(const Fl_RGB_Image *icons[], int count,
-+                       unsigned long **property, size_t *len) {
-+  size_t sz;
-+  unsigned long *data;
-+
-+  sz = 0;
-+  for (int i = 0;i < count;i++)
-+    sz += 2 + icons[i]->w() * icons[i]->h();
-+
-+  // FIXME: Might want to sort the icons
-+
-+  *property = data = new unsigned long[sz];
-+  *len = sz;
-+
-+  for (int i = 0;i < count;i++) {
-+    const Fl_RGB_Image *image;
-+
-+    image = icons[i];
-+
-+    data[0] = image->w();
-+    data[1] = image->h();
-+    data += 2;
-+
-+    const uchar *in = (const uchar*)*image->data();
-+    for (int y = 0;y < image->h();y++) {
-+      for (int x = 0;x < image->w();x++) {
-+        switch (image->d()) {
-+        case 1:
-+          *data = ( 0xff<<24) | (in[0]<<16) | (in[0]<<8) | in[0];
-+          break;
-+        case 2:
-+          *data = (in[1]<<24) | (in[0]<<16) | (in[0]<<8) | in[0];
-+          break;
-+        case 3:
-+          *data = ( 0xff<<24) | (in[0]<<16) | (in[1]<<8) | in[2];
-+          break;
-+        case 4:
-+          *data = (in[3]<<24) | (in[0]<<16) | (in[1]<<8) | in[2];
-+          break;
-+        }
-+        in += image->d();
-+        data++;
-+      }
-+      in += image->ld();
-+    }
-+  }
-+}
-+
-+void Fl_X::set_default_icons(const Fl_RGB_Image *icons[], int count) {
-+  if (default_net_wm_icons) {
-+    delete [] default_net_wm_icons;
-+    default_net_wm_icons = 0L;
-+    default_net_wm_icons_size = 0;
-+  }
-+
-+  if (count > 0)
-+    icons_to_property(icons, count,
-+                      &default_net_wm_icons, &default_net_wm_icons_size);
-+}
-+
-+void Fl_X::set_icons() {
-+  unsigned long *net_wm_icons;
-+  size_t net_wm_icons_size;
-+
-+  if (w->icon_->count) {
-+    icons_to_property((const Fl_RGB_Image **)w->icon_->icons, w->icon_->count,
-+                      &net_wm_icons, &net_wm_icons_size);
-+  } else {
-+    net_wm_icons = default_net_wm_icons;
-+    net_wm_icons_size = default_net_wm_icons_size;
-+  }
-+
-+  XChangeProperty (fl_display, xid, fl_NET_WM_ICON, XA_CARDINAL, 32,
-+      PropModeReplace, (unsigned char*) net_wm_icons, net_wm_icons_size);
-+
-+  if (w->icon_->count) {
-+    delete [] net_wm_icons;
-+    net_wm_icons = 0L;
-+    net_wm_icons_size = 0;
-+  }
-+}
-+
-+////////////////////////////////////////////////////////////////
-+
- int Fl_X::set_cursor(Fl_Cursor c) {
-   unsigned int shape;
-   Cursor xc;
diff --git a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v3.3.x-clipboard-win32-fix.patch b/contrib/packages/rpm/sle11/SOURCES/fltk-1_v3.3.x-clipboard-win32-fix.patch
deleted file mode 100644
index b41af79..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v3.3.x-clipboard-win32-fix.patch
+++ /dev/null
@@ -1,135 +0,0 @@
-diff -ur fltk-1.3.0r9110.org/src/Fl_win32.cxx fltk-1.3.0r9110/src/Fl_win32.cxx
---- fltk-1.3.0r9110.org/src/Fl_win32.cxx	2012-06-17 19:42:02.169422400 +0200
-+++ fltk-1.3.0r9110/src/Fl_win32.cxx	2012-06-17 19:43:38.286031455 +0200
-@@ -543,6 +543,37 @@
-   const char* GetValue() const { return(out); }
- };
- 
-+void fl_update_clipboard(void) {
-+  Fl_Window *w1 = Fl::first_window();
-+  if (!w1)
-+    return;
-+
-+  HWND hwnd = fl_xid(w1);
-+
-+  if (!OpenClipboard(hwnd))
-+    return;
-+
-+  EmptyClipboard();
-+
-+  int utf16_len = fl_utf8toUtf16(fl_selection_buffer[1],
-+                                 fl_selection_length[1], 0, 0);
-+
-+  HGLOBAL hMem = GlobalAlloc(GHND, utf16_len * 2 + 2); // moveable and zero'ed mem alloc.
-+  LPVOID memLock = GlobalLock(hMem);
-+
-+  fl_utf8toUtf16(fl_selection_buffer[1], fl_selection_length[1],
-+                 (unsigned short*) memLock, utf16_len + 1);
-+
-+  GlobalUnlock(hMem);
-+  SetClipboardData(CF_UNICODETEXT, hMem);
-+
-+  CloseClipboard();
-+
-+  // In case Windows managed to lob of a WM_DESTROYCLIPBOARD during
-+  // the above.
-+  fl_i_own_selection[1] = 1;
-+}
-+
- // call this when you create a selection:
- void Fl::copy(const char *stuff, int len, int clipboard) {
-   if (!stuff || len<0) return;
-@@ -560,25 +591,9 @@
-   memcpy(fl_selection_buffer[clipboard], stuff, len);
-   fl_selection_buffer[clipboard][len] = 0; // needed for direct paste
-   fl_selection_length[clipboard] = len;
--  if (clipboard) {
--    // set up for "delayed rendering":
--    if (OpenClipboard(NULL)) {
--      // if the system clipboard works, use it
--      int utf16_len = fl_utf8toUtf16(fl_selection_buffer[clipboard], fl_selection_length[clipboard], 0, 0);
--      EmptyClipboard();
--      HGLOBAL hMem = GlobalAlloc(GHND, utf16_len * 2 + 2); // moveable and zero'ed mem alloc.
--      LPVOID memLock = GlobalLock(hMem);
--      fl_utf8toUtf16(fl_selection_buffer[clipboard], fl_selection_length[clipboard], (unsigned short*) memLock, utf16_len + 1);
--      GlobalUnlock(hMem);
--      SetClipboardData(CF_UNICODETEXT, hMem);
--      CloseClipboard();
--      GlobalFree(hMem);
--      fl_i_own_selection[clipboard] = 0;
--    } else {
--      // only if it fails, instruct paste() to use the internal buffers
--      fl_i_own_selection[clipboard] = 1;
--    }
--  }
-+  fl_i_own_selection[clipboard] = 1;
-+  if (clipboard)
-+    fl_update_clipboard();
- }
- 
- // Call this when a "paste" operation happens:
-@@ -1307,33 +1322,6 @@
-     fl_i_own_selection[1] = 0;
-     return 1;
- 
--  case WM_RENDERALLFORMATS:
--    fl_i_own_selection[1] = 0;
--    // Windoze seems unhappy unless I do these two steps. Documentation
--    // seems to vary on whether opening the clipboard is necessary or
--    // is in fact wrong:
--    CloseClipboard();
--    OpenClipboard(NULL);
--    // fall through...
--  case WM_RENDERFORMAT: {
--    HANDLE h;
--
--//  int l = fl_utf_nb_char((unsigned char*)fl_selection_buffer[1], fl_selection_length[1]);
--    int l = fl_utf8toUtf16(fl_selection_buffer[1], fl_selection_length[1], NULL, 0); // Pass NULL buffer to query length required
--    h = GlobalAlloc(GHND, (l+1) * sizeof(unsigned short));
--    if (h) {
--      unsigned short *g = (unsigned short*) GlobalLock(h);
--//    fl_utf2unicode((unsigned char *)fl_selection_buffer[1], fl_selection_length[1], (xchar*)g);
--      l = fl_utf8toUtf16(fl_selection_buffer[1], fl_selection_length[1], g, (l+1));
--      g[l] = 0;
--      GlobalUnlock(h);
--      SetClipboardData(CF_UNICODETEXT, h);
--    }
--
--    // Windoze also seems unhappy if I don't do this. Documentation very
--    // unclear on what is correct:
--    if (fl_msg.message == WM_RENDERALLFORMATS) CloseClipboard();
--    return 1;}
-   case WM_DISPLAYCHANGE: // occurs when screen configuration (number, position) changes
-     Fl::call_screen_init();
-     Fl::handle(FL_SCREEN_CONFIGURATION_CHANGED, NULL);
-diff -ur fltk-1.3.0r9110.org/src/Fl.cxx fltk-1.3.0r9110/src/Fl.cxx
---- fltk-1.3.0r9110.org/src/Fl.cxx	2012-06-17 19:42:02.173422595 +0200
-+++ fltk-1.3.0r9110/src/Fl.cxx	2012-06-17 19:42:02.317429497 +0200
-@@ -1420,7 +1420,9 @@
- ////////////////////////////////////////////////////////////////
- // hide() destroys the X window, it does not do unmap!
- 
--#if !defined(WIN32) && USE_XFT
-+#if defined(WIN32)
-+extern void fl_update_clipboard(void);
-+#elif USE_XFT
- extern void fl_destroy_xft_draw(Window);
- #endif
- 
-@@ -1467,14 +1469,8 @@
- #if defined(WIN32)
-   // this little trick keeps the current clipboard alive, even if we are about
-   // to destroy the window that owns the selection.
--  if (GetClipboardOwner()==ip->xid) {
--    Fl_Window *w1 = Fl::first_window();
--    if (w1 && OpenClipboard(fl_xid(w1))) {
--      EmptyClipboard();
--      SetClipboardData(CF_TEXT, NULL);
--      CloseClipboard();
--    }
--  }
-+  if (GetClipboardOwner()==ip->xid)
-+    fl_update_clipboard();
-   // Send a message to myself so that I'll get out of the event loop...
-   PostMessage(ip->xid, WM_APP, 0, 0);
-   if (ip->private_dc) fl_release_dc(ip->xid, ip->private_dc);
diff --git a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v3.3.x-multihead.patch b/contrib/packages/rpm/sle11/SOURCES/fltk-1_v3.3.x-multihead.patch
deleted file mode 100644
index e4a010a..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v3.3.x-multihead.patch
+++ /dev/null
@@ -1,468 +0,0 @@
-diff -urp fltk-1.3.2.org/FL/Fl_Window.H fltk-1.3.2/FL/Fl_Window.H
---- fltk-1.3.2.org/FL/Fl_Window.H	2013-01-16 10:52:33.017228122 +0100
-+++ fltk-1.3.2/FL/Fl_Window.H	2013-01-16 10:52:47.876478968 +0100
-@@ -54,7 +54,7 @@ class Fl_RGB_Image;
- class FL_EXPORT Fl_Window : public Fl_Group {
- 
-   static char *default_xclass_;
--  // Note: we must use separate statements for each of the following 4 variables,
-+  // Note: we must use separate statements for each of the following 8 variables,
-   // with the static attribute, otherwise MS VC++ 2008/2010 complains :-(
-   // AlbrechtS 04/2012
- #if FLTK_ABI_VERSION < 10301
-@@ -73,6 +73,22 @@ class FL_EXPORT Fl_Window : public Fl_Gr
-   static // when these members are static, ABI compatibility with 1.3.0 is respected
- #endif
-   int no_fullscreen_h;
-+#if FLTK_ABI_VERSION < 10302
-+  static // when these members are static, ABI compatibility with 1.3.0 is respected
-+#endif
-+  int fullscreen_screen_top;
-+#if FLTK_ABI_VERSION < 10302
-+  static // when these members are static, ABI compatibility with 1.3.0 is respected
-+#endif
-+  int fullscreen_screen_bottom;
-+#if FLTK_ABI_VERSION < 10302
-+  static // when these members are static, ABI compatibility with 1.3.0 is respected
-+#endif
-+  int fullscreen_screen_left;
-+#if FLTK_ABI_VERSION < 10302
-+  static // when these members are static, ABI compatibility with 1.3.0 is respected
-+#endif
-+  int fullscreen_screen_right;
- 
-   friend class Fl_X;
-   Fl_X *i; // points at the system-specific stuff
-@@ -430,13 +446,15 @@ public:
-   */
-   void show(int argc, char **argv);
-   /**
--    Makes the window completely fill the screen, without any window
--    manager border visible.  You must use fullscreen_off() to undo
--    this. 
-+    Makes the window completely fill one or more screens, without any
-+    window manager border visible.  You must use fullscreen_off() to
-+    undo this. 
- 
-     \note On some platforms, this can result in the keyboard being
-     grabbed. The window may also be recreated, meaning hide() and
-     show() will be called.
-+
-+    \see void Fl_Window::fullscreen_screens()
-   */
-   void fullscreen();
-   /**
-@@ -453,6 +471,17 @@ public:
-   */
-   unsigned int fullscreen_active() const { return flags() & FULLSCREEN; }
-   /**
-+    Sets which screens should be used when this window is in fullscreen
-+    mode. The window will be resized to the top of the screen with index
-+    \p top, the bottom of the screen with index \p bottom, etc. 
-+
-+    If this method is never called, or if any argument is < 0, then the
-+    window will be resized to fill the screen it is currently on.
-+
-+    \see void Fl_Window::fullscreen()
-+    */
-+  void fullscreen_screens(int top, int bottom, int left, int right);
-+  /**
-     Iconifies the window.  If you call this when shown() is false
-     it will show() it as an icon.  If the window is already
-     iconified this does nothing.
-diff -urp fltk-1.3.2.org/FL/win32.H fltk-1.3.2/FL/win32.H
---- fltk-1.3.2.org/FL/win32.H	2013-01-16 10:52:33.017228122 +0100
-+++ fltk-1.3.2/FL/win32.H	2013-01-16 10:52:47.876478968 +0100
-@@ -80,6 +80,7 @@ public:
-   static Fl_X* i(const Fl_Window* w) {return w->i;}
-   static int fake_X_wm(const Fl_Window* w,int &X, int &Y,
- 		                 int &bt,int &bx,int &by);
-+  void make_fullscreen(int X, int Y, int W, int H);
-   void setwindow(Fl_Window* wi) {w=wi; wi->i=this;}
-   void flush() {w->flush();}
-   void set_minmax(LPMINMAXINFO minmax);
-diff -urp fltk-1.3.2.org/src/Fl_cocoa.mm fltk-1.3.2/src/Fl_cocoa.mm
---- fltk-1.3.2.org/src/Fl_cocoa.mm	2013-01-16 10:52:33.014229574 +0100
-+++ fltk-1.3.2/src/Fl_cocoa.mm	2013-01-16 10:52:47.877480606 +0100
-@@ -2438,9 +2438,32 @@ void Fl_X::make(Fl_Window* w)
- 	  
-     NSRect crect;
-     if (w->fullscreen_active()) {
--      int sx, sy, sw, sh;
--      Fl::screen_xywh(sx, sy, sw, sh, w->x(), w->y(), w->w(), w->h());
--      w->resize(sx, sy, sw, sh);
-+      int top, bottom, left, right;
-+      int sx, sy, sw, sh, X, Y, W, H;
-+
-+      top = w->fullscreen_screen_top;
-+      bottom = w->fullscreen_screen_bottom;
-+      left = w->fullscreen_screen_left;
-+      right = w->fullscreen_screen_right;
-+
-+      if ((top < 0) || (bottom < 0) || (left < 0) || (right < 0)) {
-+        top = Fl::screen_num(w->x(), w->y(), w->w(), w->h());
-+        bottom = top;
-+        left = top;
-+        right = top;
-+      }
-+
-+      Fl::screen_xywh(sx, sy, sw, sh, top);
-+      Y = sy;
-+      Fl::screen_xywh(sx, sy, sw, sh, bottom);
-+      H = sy + sh - Y;
-+      Fl::screen_xywh(sx, sy, sw, sh, left);
-+      X = sx;
-+      Fl::screen_xywh(sx, sy, sw, sh, right);
-+      W = sx + sw - X;
-+
-+      w->resize(X, Y, W, H);
-+
-       winstyle = NSBorderlessWindowMask;
-       winlevel = NSStatusWindowLevel;
-     }
-diff -urp fltk-1.3.2.org/src/Fl_win32.cxx fltk-1.3.2/src/Fl_win32.cxx
---- fltk-1.3.2.org/src/Fl_win32.cxx	2013-01-16 10:52:33.019230734 +0100
-+++ fltk-1.3.2/src/Fl_win32.cxx	2013-01-16 10:52:47.878480504 +0100
-@@ -1493,7 +1493,6 @@ int Fl_X::fake_X_wm(const Fl_Window* w,i
-   Y+=yoff;
- 
-   if (w->fullscreen_active()) {
--    X = Y = 0;
-     bx = by = bt = 0;
-   }
- 
-@@ -1547,19 +1546,42 @@ void Fl_Window::resize(int X,int Y,int W
-   }
- }
- 
--static void make_fullscreen(Fl_Window *w, Window xid, int X, int Y, int W, int H) {
-+void Fl_X::make_fullscreen(int X, int Y, int W, int H) {
-+  int top, bottom, left, right;
-   int sx, sy, sw, sh;
--  Fl::screen_xywh(sx, sy, sw, sh, X, Y, W, H);
-+
-+  top = w->fullscreen_screen_top;
-+  bottom = w->fullscreen_screen_bottom;
-+  left = w->fullscreen_screen_left;
-+  right = w->fullscreen_screen_right;
-+
-+  if ((top < 0) || (bottom < 0) || (left < 0) || (right < 0)) {
-+    top = Fl::screen_num(X, Y, W, H);
-+    bottom = top;
-+    left = top;
-+    right = top;
-+  }
-+
-+  Fl::screen_xywh(sx, sy, sw, sh, top);
-+  Y = sy;
-+  Fl::screen_xywh(sx, sy, sw, sh, bottom);
-+  H = sy + sh - Y;
-+  Fl::screen_xywh(sx, sy, sw, sh, left);
-+  X = sx;
-+  Fl::screen_xywh(sx, sy, sw, sh, right);
-+  W = sx + sw - X;
-+
-   DWORD flags = GetWindowLong(xid, GWL_STYLE);
-   flags = flags & ~(WS_THICKFRAME|WS_CAPTION);
-   SetWindowLong(xid, GWL_STYLE, flags);
-+
-   // SWP_NOSENDCHANGING is so that we can override size limits
--  SetWindowPos(xid, HWND_TOP, sx, sy, sw, sh, SWP_NOSENDCHANGING | SWP_FRAMECHANGED);
-+  SetWindowPos(xid, HWND_TOP, X, Y, W, H, SWP_NOSENDCHANGING | SWP_FRAMECHANGED);
- }
- 
- void Fl_Window::fullscreen_x() {
-   _set_fullscreen();
--  make_fullscreen(this, fl_xid(this), x(), y(), w(), h());
-+  i->make_fullscreen(x(), y(), w(), h());
-   Fl::handle(FL_FULLSCREEN, this);
- }
- 
-@@ -1814,8 +1836,8 @@ Fl_X* Fl_X::make(Fl_Window* w) {
-      monitor the window was placed on. */
-     RECT rect;
-     GetWindowRect(x->xid, &rect);
--    make_fullscreen(w, x->xid, rect.left, rect.top, 
--                    rect.right - rect.left, rect.bottom - rect.top);
-+    x->make_fullscreen(rect.left, rect.top, 
-+                       rect.right - rect.left, rect.bottom - rect.top);
-   }
- 
-   x->next = Fl_X::first;
-diff -urp fltk-1.3.2.org/src/Fl_Window_fullscreen.cxx fltk-1.3.2/src/Fl_Window_fullscreen.cxx
---- fltk-1.3.2.org/src/Fl_Window_fullscreen.cxx	2012-11-06 21:46:14.000000000 +0100
-+++ fltk-1.3.2/src/Fl_Window_fullscreen.cxx	2013-01-16 10:52:47.879480608 +0100
-@@ -36,6 +36,10 @@ int Fl_Window::no_fullscreen_x = 0;
- int Fl_Window::no_fullscreen_y = 0;
- int Fl_Window::no_fullscreen_w = 0;
- int Fl_Window::no_fullscreen_h = 0;
-+int Fl_Window::fullscreen_screen_top = -1;
-+int Fl_Window::fullscreen_screen_bottom = -1;
-+int Fl_Window::fullscreen_screen_left = -1;
-+int Fl_Window::fullscreen_screen_right = -1;
- #endif
- 
- void Fl_Window::border(int b) {
-@@ -95,6 +99,23 @@ void Fl_Window::fullscreen_off() {
-   fullscreen_off(no_fullscreen_x, no_fullscreen_y, no_fullscreen_w, no_fullscreen_h);
- }
- 
-+void Fl_Window::fullscreen_screens(int top, int bottom, int left, int right) {
-+  if ((top < 0) || (bottom < 0) || (left < 0) || (right < 0)) {
-+    fullscreen_screen_top = -1;
-+    fullscreen_screen_bottom = -1;
-+    fullscreen_screen_left = -1;
-+    fullscreen_screen_right = -1;
-+  } else {
-+    fullscreen_screen_top = top;
-+    fullscreen_screen_bottom = bottom;
-+    fullscreen_screen_left = left;
-+    fullscreen_screen_right = right;
-+  }
-+
-+  if (shown() && (flags() & Fl_Widget::FULLSCREEN))
-+    fullscreen_x();
-+}
-+
- 
- //
- // End of "$Id: Fl_Window_fullscreen.cxx 9706 2012-11-06 20:46:14Z matt $".
-diff -urp fltk-1.3.2.org/src/Fl_x.cxx fltk-1.3.2/src/Fl_x.cxx
---- fltk-1.3.2.org/src/Fl_x.cxx	2013-01-16 10:52:33.020228202 +0100
-+++ fltk-1.3.2/src/Fl_x.cxx	2013-01-16 10:52:47.880480556 +0100
-@@ -344,6 +344,7 @@ Atom fl_NET_WM_ICON_NAME;		// utf8 aware
- Atom fl_NET_SUPPORTING_WM_CHECK;
- Atom fl_NET_WM_STATE;
- Atom fl_NET_WM_STATE_FULLSCREEN;
-+Atom fl_NET_WM_FULLSCREEN_MONITORS;
- Atom fl_NET_WORKAREA;
- Atom fl_NET_WM_ICON;
- 
-@@ -709,6 +710,7 @@ void fl_open_display(Display* d) {
-   fl_NET_SUPPORTING_WM_CHECK = XInternAtom(d, "_NET_SUPPORTING_WM_CHECK", 0);
-   fl_NET_WM_STATE       = XInternAtom(d, "_NET_WM_STATE",       0);
-   fl_NET_WM_STATE_FULLSCREEN = XInternAtom(d, "_NET_WM_STATE_FULLSCREEN", 0);
-+  fl_NET_WM_FULLSCREEN_MONITORS = XInternAtom(d, "_NET_WM_FULLSCREEN_MONITORS", 0);
-   fl_NET_WORKAREA       = XInternAtom(d, "_NET_WORKAREA",       0);
-   fl_NET_WM_ICON        = XInternAtom(d, "_NET_WM_ICON",        0);
- 
-@@ -1872,22 +1874,30 @@ void Fl_Window::resize(int X,int Y,int W
- #define _NET_WM_STATE_ADD           1  /* add/set property */
- #define _NET_WM_STATE_TOGGLE        2  /* toggle property  */
- 
--static void send_wm_state_event(Window wnd, int add, Atom prop) {
-+static void send_wm_event(Window wnd, Atom message,
-+                          unsigned long d0, unsigned long d1=0,
-+                          unsigned long d2=0, unsigned long d3=0,
-+                          unsigned long d4=0) {
-   XEvent e;
-   e.xany.type = ClientMessage;
-   e.xany.window = wnd;
--  e.xclient.message_type = fl_NET_WM_STATE;
-+  e.xclient.message_type = message;
-   e.xclient.format = 32;
--  e.xclient.data.l[0] = add ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE;
--  e.xclient.data.l[1] = prop;
--  e.xclient.data.l[2] = 0;
--  e.xclient.data.l[3] = 0;
--  e.xclient.data.l[4] = 0;
-+  e.xclient.data.l[0] = d0;
-+  e.xclient.data.l[1] = d1;
-+  e.xclient.data.l[2] = d2;
-+  e.xclient.data.l[3] = d3;
-+  e.xclient.data.l[4] = d4;
-   XSendEvent(fl_display, RootWindow(fl_display, fl_screen),
-              0, SubstructureNotifyMask | SubstructureRedirectMask,
-              &e);
- }
- 
-+static void send_wm_state_event(Window wnd, int add, Atom prop) {
-+  send_wm_event(wnd, fl_NET_WM_STATE,
-+                add ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE, prop);
-+}
-+
- int Fl_X::ewmh_supported() {
-   static int result = -1;
- 
-@@ -1911,6 +1921,22 @@ int Fl_X::ewmh_supported() {
- /* Change an existing window to fullscreen */
- void Fl_Window::fullscreen_x() {
-   if (Fl_X::ewmh_supported()) {
-+    int top, bottom, left, right;
-+
-+    top = fullscreen_screen_top;
-+    bottom = fullscreen_screen_bottom;
-+    left = fullscreen_screen_left;
-+    right = fullscreen_screen_right;
-+
-+    if ((top < 0) || (bottom < 0) || (left < 0) || (right < 0)) {
-+      top = Fl::screen_num(x(), y(), w(), h());
-+      bottom = top;
-+      left = top;
-+      right = top;
-+    }
-+
-+    send_wm_event(fl_xid(this), fl_NET_WM_FULLSCREEN_MONITORS,
-+                  top, bottom, left, right);
-     send_wm_state_event(fl_xid(this), 1, fl_NET_WM_STATE_FULLSCREEN);
-   } else {
-     _set_fullscreen();
-@@ -1997,7 +2023,7 @@ void Fl_X::make_xid(Fl_Window* win, XVis
-     // force the window to be on-screen.  Usually the X window manager
-     // does this, but a few don't, so we do it here for consistency:
-     int scr_x, scr_y, scr_w, scr_h;
--    Fl::screen_xywh(scr_x, scr_y, scr_w, scr_h, X, Y);
-+    Fl::screen_xywh(scr_x, scr_y, scr_w, scr_h, X, Y, W, H);
- 
-     if (win->border()) {
-       // ensure border is on screen:
-@@ -2026,6 +2052,23 @@ void Fl_X::make_xid(Fl_Window* win, XVis
-     return;
-   }
- 
-+  // Compute which screen(s) we should be on if we want to go fullscreen
-+  int fullscreen_top, fullscreen_bottom, fullscreen_left, fullscreen_right;
-+
-+  fullscreen_top = win->fullscreen_screen_top;
-+  fullscreen_bottom = win->fullscreen_screen_bottom;
-+  fullscreen_left = win->fullscreen_screen_left;
-+  fullscreen_right = win->fullscreen_screen_right;
-+
-+  if ((fullscreen_top < 0) || (fullscreen_bottom < 0) ||
-+      (fullscreen_left < 0) || (fullscreen_right < 0)) {
-+    fullscreen_top = Fl::screen_num(X, Y, W, H);
-+    fullscreen_bottom = fullscreen_top;
-+    fullscreen_left = fullscreen_top;
-+    fullscreen_right = fullscreen_top;
-+  }
-+
-+
-   ulong root = win->parent() ?
-     fl_xid(win->window()) : RootWindow(fl_display, fl_screen);
- 
-@@ -2049,9 +2092,17 @@ void Fl_X::make_xid(Fl_Window* win, XVis
-   // border, and cannot grab without an existing window. Besides, 
-   // there is no clear_override(). 
-   if (win->flags() & Fl_Widget::FULLSCREEN && !Fl_X::ewmh_supported()) {
-+    int sx, sy, sw, sh;
-     attr.override_redirect = 1;
-     mask |= CWOverrideRedirect;
--    Fl::screen_xywh(X, Y, W, H, X, Y, W, H);
-+    Fl::screen_xywh(sx, sy, sw, sh, fullscreen_left);
-+    X = sx;
-+    Fl::screen_xywh(sx, sy, sw, sh, fullscreen_right);
-+    W = sx + sw - X;
-+    Fl::screen_xywh(sx, sy, sw, sh, fullscreen_top);
-+    Y = sy;
-+    Fl::screen_xywh(sx, sy, sw, sh, fullscreen_bottom);
-+    H = sy + sh - Y;
-   }
- 
-   if (fl_background_pixel >= 0) {
-@@ -2122,6 +2173,13 @@ void Fl_X::make_xid(Fl_Window* win, XVis
- 
-     // If asked for, create fullscreen
-     if (win->flags() & Fl_Widget::FULLSCREEN && Fl_X::ewmh_supported()) {
-+      unsigned long data[4];
-+      data[0] = fullscreen_top;
-+      data[1] = fullscreen_bottom;
-+      data[2] = fullscreen_left;
-+      data[3] = fullscreen_right;
-+      XChangeProperty (fl_display, xp->xid, fl_NET_WM_FULLSCREEN_MONITORS, XA_ATOM, 32,
-+                       PropModeReplace, (unsigned char*) data, 4);
-       XChangeProperty (fl_display, xp->xid, fl_NET_WM_STATE, XA_ATOM, 32,
-                        PropModeAppend, (unsigned char*) &fl_NET_WM_STATE_FULLSCREEN, 1);
-     }
-diff -urp fltk-1.3.2.org/test/fullscreen.cxx fltk-1.3.2/test/fullscreen.cxx
---- fltk-1.3.2.org/test/fullscreen.cxx	2012-06-14 17:09:46.000000000 +0200
-+++ fltk-1.3.2/test/fullscreen.cxx	2013-01-16 10:52:47.881104801 +0100
-@@ -127,7 +127,7 @@ class fullscreen_window : public Fl_Sing
-   fullscreen_window(int W, int H, const char *t=0);
-   int handle (int e);
-   Fl_Toggle_Light_Button *b3;
--
-+  Fl_Toggle_Light_Button *b4;
- };
- 
- fullscreen_window::fullscreen_window(int W, int H, const char *t) : Fl_Single_Window(W, H, t) { 
-@@ -170,23 +170,54 @@ void border_cb(Fl_Widget *o, void *p) {
- #endif
- }
- 
--int px,py,pw,ph;
- Fl_Button *border_button;
- void fullscreen_cb(Fl_Widget *o, void *p) {
-   Fl_Window *w = (Fl_Window *)p;
-   int d = ((Fl_Button *)o)->value();
-   if (d) {
--    px = w->x();
--    py = w->y();
--    pw = w->w();
--    ph = w->h();
-+    if (((fullscreen_window*)w)->b4->value()) {
-+      int top, bottom, left, right;
-+      int top_y, bottom_y, left_x, right_x;
-+
-+      int sx, sy, sw, sh;
-+
-+      top = bottom = left = right = 0;
-+
-+      Fl::screen_xywh(sx, sy, sw, sh, 0);
-+      top_y = sy;
-+      bottom_y = sy + sh;
-+      left_x = sx;
-+      right_x = sx + sw;
-+
-+      for (int i = 1;i < Fl::screen_count();i++) {
-+        Fl::screen_xywh(sx, sy, sw, sh, i);
-+        if (sy < top_y) {
-+          top = i;
-+          top_y = sy;
-+        }
-+        if ((sy + sh) > bottom_y) {
-+          bottom = i;
-+          bottom_y = sy + sh;
-+        }
-+        if (sx < left_x) {
-+          left = i;
-+          left_x = sx;
-+        }
-+        if ((sx + sw) > right_x) {
-+          right = i;
-+          right_x = sx + sw;
-+        }
-+      }
-+
-+      w->fullscreen_screens(top, bottom, left, right);
-+    } else {
-+      w->fullscreen_screens(-1, -1, -1, -1);
-+    }
-     w->fullscreen();
--    w->override();
- #ifndef WIN32 // update our border state in case border was turned off
-     border_button->value(w->border());
- #endif
-   } else {
--    //w->fullscreen_off(px,py,pw,ph);
-     w->fullscreen_off();
-   }
- }
-@@ -219,7 +250,7 @@ void exit_cb(Fl_Widget *, void *) {
-   exit(0);
- }
- 
--#define NUMB 7
-+#define NUMB 8
- 
- int twowindow = 0;
- int initfull = 0;
-@@ -284,6 +315,9 @@ int main(int argc, char **argv) {
-   window.b3->callback(fullscreen_cb,w);
-   y+=30;
- 
-+  window.b4 = new Fl_Toggle_Light_Button(50,y,window.w()-60,30,"All Screens");
-+  y+=30;
-+
-   Fl_Button eb(50,y,window.w()-60,30,"Exit");
-   eb.callback(exit_cb);
-   y+=30;
diff --git a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v4.3.x-keyboard-win32.patch b/contrib/packages/rpm/sle11/SOURCES/fltk-1_v4.3.x-keyboard-win32.patch
deleted file mode 100644
index c29d3b9..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v4.3.x-keyboard-win32.patch
+++ /dev/null
@@ -1,256 +0,0 @@
-diff -ur fltk-1.3.0r9293.org/src/Fl_win32.cxx fltk-1.3.0r9293/src/Fl_win32.cxx
---- fltk-1.3.0r9293.org/src/Fl_win32.cxx	2012-06-18 09:07:56.522314557 +0200
-+++ fltk-1.3.0r9293/src/Fl_win32.cxx	2012-06-18 09:08:07.392836285 +0200
-@@ -87,6 +87,8 @@
- static Fl_Display_Device fl_gdi_display(&fl_gdi_driver);
- Fl_Display_Device *Fl_Display_Device::_display = &fl_gdi_display; // the platform display
- 
-+bool use_simple_keyboard = false;
-+
- // dynamic wsock dll handling api:
- #if defined(__CYGWIN__) && !defined(SOCKET)
- # define SOCKET int
-@@ -120,6 +122,8 @@
-  * size and link dependencies.
-  */
- static HMODULE s_imm_module = 0;
-+typedef BOOL (WINAPI* flTypeImmAssociateContextEx)(HWND, HIMC, DWORD);
-+static flTypeImmAssociateContextEx flImmAssociateContextEx = 0;
- typedef HIMC (WINAPI* flTypeImmGetContext)(HWND);
- static flTypeImmGetContext flImmGetContext = 0;
- typedef BOOL (WINAPI* flTypeImmSetCompositionWindow)(HIMC, LPCOMPOSITIONFORM);
-@@ -135,6 +139,7 @@
-     if (!s_imm_module)
-       Fl::fatal("FLTK Lib Error: IMM32.DLL file not found!\n\n"
-         "Please check your input method manager library accessibility.");
-+    flImmAssociateContextEx = (flTypeImmAssociateContextEx)GetProcAddress(s_imm_module, "ImmAssociateContextEx");
-     flImmGetContext = (flTypeImmGetContext)GetProcAddress(s_imm_module, "ImmGetContext");
-     flImmSetCompositionWindow = (flTypeImmSetCompositionWindow)GetProcAddress(s_imm_module, "ImmSetCompositionWindow");
-     flImmReleaseContext = (flTypeImmReleaseContext)GetProcAddress(s_imm_module, "ImmReleaseContext");
-@@ -413,7 +418,12 @@
-         }
-       }
- 
--      TranslateMessage(&fl_msg);
-+      // Don't bother with key to character translation as we do
-+      // it manually for simpley keyboard widgets. In fact, calling
-+      // TranslateMessage() just makes it more difficult as it sets
-+      // a bunch of internal state.
-+      if (!use_simple_keyboard)
-+        TranslateMessage(&fl_msg);
-       DispatchMessageW(&fl_msg);
-       have_message = PeekMessageW(&fl_msg, NULL, 0, 0, PM_REMOVE);
-     }
-@@ -638,6 +648,49 @@
-   }
- }
- 
-+void fl_update_focus(void)
-+{
-+  Fl_Widget *focus;
-+  Fl_Window *win;
-+
-+  get_imm_module();
-+
-+  focus = Fl::grab();
-+  if (!focus)
-+    focus = Fl::focus();
-+  if (!focus)
-+    return;
-+
-+  // Grabs are special in that events are sent to the first
-+  // available window
-+  if (focus == Fl::grab())
-+    win = Fl::first_window();
-+  else {
-+    win = focus->as_window();
-+    if (!win)
-+      win = focus->window();
-+  }
-+
-+  if (!win) {
-+    Fl::warning("Cannot find window for widget receiving focus");
-+    return;
-+  }
-+
-+  // No Win32 window created yet
-+  if (!Fl_X::i(win) || !fl_xid(win))
-+    return;
-+
-+  if (focus->simple_keyboard()) {
-+    use_simple_keyboard = true;
-+    if (flImmGetContext(fl_xid(win)) != 0)
-+      flImmAssociateContextEx(fl_xid(win), 0, 0);
-+  } else {
-+    use_simple_keyboard = false;
-+    if (flImmGetContext(fl_xid(win)) == 0)
-+      flImmAssociateContextEx(fl_xid(win), 0, IACE_DEFAULT);
-+  }
-+}
-+
- HWND fl_capture;
- 
- static int mouse_event(Fl_Window *window, int what, int button,
-@@ -785,6 +838,27 @@
-   return extended ? extendedlut[vk] : vklut[vk];
- }
- 
-+static xchar msdead2fltk(xchar in)
-+{
-+  switch (in) {
-+  case 0x0060:      // GRAVE ACCENT
-+    return 0x0300;  // COMBINING GRAVE ACCENT
-+  case 0x00b4:      // ACUTE ACCENT
-+    return 0x0301;  // COMBINING ACUTE ACCENT
-+  case 0x005e:      // CIRCUMFLEX ACCENT
-+    return 0x0302;  // COMBINING CIRCUMFLEX ACCENT
-+  case 0x007e:      // TILDE
-+    return 0x0303;  // COMBINING TILDE
-+  case 0x00a8:      // DIAERESIS
-+    return 0x0308;  // COMBINING DIAERESIS
-+  // FIXME: Windows dead key behaviour isn't documented and I don't have
-+  //        any more keyboards to test with...
-+  }
-+
-+  // hope that Windows gave us something proper to begin with
-+  return in;
-+}
-+
- #if USE_COLORMAP
- extern HPALETTE fl_select_palette(void); // in fl_color_win32.cxx
- #endif
-@@ -846,6 +920,8 @@
-   //fl_msg.pt = ???
-   //fl_msg.lPrivate = ???
- 
-+  MSG fl_orig_msg = fl_msg;
-+
-   Fl_Window *window = fl_find(hWnd);
- 
-   if (window) switch (uMsg) {
-@@ -1025,23 +1101,82 @@
-     if (GetKeyState(VK_SCROLL)) state |= FL_SCROLL_LOCK;
-     Fl::e_state = state;
-     static char buffer[1024];
--    if (uMsg == WM_CHAR || uMsg == WM_SYSCHAR) {
- 
-+    if (use_simple_keyboard) {
-+      BYTE keystate[256];
-+      WCHAR wbuf[8];
-+      int ret;
-+
-+      // I'm not sure if we ever get WM_CHAR (& friends) without an initial
-+      // WM_KEYDOWN (& friends), but if we do then we should not send such
-+      // side band events to simple keyboard widgets.
-+      if ((fl_orig_msg.message != WM_KEYDOWN) &&
-+          (fl_orig_msg.message != WM_SYSKEYDOWN) &&
-+          (fl_orig_msg.message != WM_KEYUP) &&
-+          (fl_orig_msg.message != WM_SYSKEYUP))
-+        break;
-+
-+      GetKeyboardState(keystate);
-+
-+      // Pressing Ctrl wreaks havoc with the symbol lookup, so turn that off.
-+      // But AltGr shows up as Ctrl+Alt in Windows, so keep Ctrl if Alt is
-+      // active.
-+      if (!(keystate[VK_MENU] & 0x80))
-+        keystate[VK_CONTROL] = keystate[VK_LCONTROL] = keystate[VK_RCONTROL] = 0;
-+
-+      // We cannot inspect or modify Windows' internal state of the keyboard
-+      // so we have to try to infer information from ToUnicode() and wedge
-+      // things into a known state.
-+      for (int i = 0;i < 2;i++) {
-+        ret = ToUnicode(fl_orig_msg.wParam, 0, keystate, wbuf,
-+                        sizeof(wbuf)/sizeof(wbuf[0]), 0);
-+
-+        // No symbol for this key (or unexpected length)
-+        if ((ret == 0) || (ret < -1)) {
-+          buffer[0] = 0;
-+          Fl::e_length = 0;
-+          break;
-+        }
-+
-+        // A dead key. Convert this to a Unicode combining character so
-+        // that the application can tell the difference between dead and
-+        // normal keys.
-+        if (ret == -1) {
-+          xchar u = (xchar) msdead2fltk(wbuf[0]);
-+          Fl::e_length = fl_utf8fromwc(buffer, 1024, &u, 1);
-+          buffer[Fl::e_length] = 0;
-+          break;
-+        }
-+
-+        // If we have two characters (or more) from ToUnicode(), that's
-+        // an invalid sequence. One character chould mean a proper symbol,
-+        // or it could mean a composed one. In both cases we need to call
-+        // ToUnicode() again to get something sane.
-+        if (i == 0)
-+          continue;
-+
-+        // We should now have something sane. Give whatever we have to the
-+        // application.
-+        Fl::e_length = fl_utf8fromwc(buffer, 1024, wbuf, ret);
-+        buffer[Fl::e_length] = 0;
-+      }
-+    } else if (uMsg == WM_CHAR || uMsg == WM_SYSCHAR) {
-       xchar u = (xchar) wParam;
- //    Fl::e_length = fl_unicode2utf(&u, 1, buffer);
-       Fl::e_length = fl_utf8fromwc(buffer, 1024, &u, 1);
-       buffer[Fl::e_length] = 0;
-+    } else {
-+      buffer[0] = 0;
-+      Fl::e_length = 0;
-+    }
- 
--
--    } else if (Fl::e_keysym >= FL_KP && Fl::e_keysym <= FL_KP_Last) {
--      if (state & FL_NUM_LOCK) {
--        // Convert to regular keypress...
--	buffer[0] = Fl::e_keysym-FL_KP;
--	Fl::e_length = 1;
--      } else {
--        // Convert to special keypress...
--	buffer[0] = 0;
--	Fl::e_length = 0;
-+    // The keypad area is a bit odd in that we need to change the keysym
-+    // to properly indicate what the user meant, unlike other keys where
-+    // we normally change the text and keep keysym stable.
-+    if (Fl::e_keysym >= FL_KP && Fl::e_keysym <= FL_KP_Last) {
-+      // The initial mapping tables give us a keysym that corresponds to
-+      // numlock being on, so we only do something when it is off.
-+      if (!(state & FL_NUM_LOCK)) {
- 	switch (Fl::e_keysym) {
- 	  case FL_KP + '0' :
- 	    Fl::e_keysym = FL_Insert;
-@@ -1073,30 +1208,10 @@
- 	  case FL_KP + '.' :
- 	    Fl::e_keysym = FL_Delete;
- 	    break;
--	  case FL_KP + '/' :
--	  case FL_KP + '*' :
--	  case FL_KP + '-' :
--	  case FL_KP + '+' :
--	    buffer[0] = Fl::e_keysym-FL_KP;
--	    Fl::e_length = 1;
--	    break;
- 	}
-       }
--    } else if ((lParam & (1<<31))==0) {
--#ifdef FLTK_PREVIEW_DEAD_KEYS
--      if ((lParam & (1<<24))==0) { // clear if dead key (always?)
--        xchar u = (xchar) wParam;
--        Fl::e_length = fl_utf8fromwc(buffer, 1024, &u, 1);
--        buffer[Fl::e_length] = 0;
--      } else { // set if "extended key" (never printable?)
--        buffer[0] = 0;
--        Fl::e_length = 0;
--      }
--#else
--      buffer[0] = 0;
--      Fl::e_length = 0;
--#endif
-     }
-+
-     Fl::e_text = buffer;
-     if (lParam & (1<<31)) { // key up events.
-       if (Fl::handle(FL_KEYUP, window)) return 0;
diff --git a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v4.3.x-keyboard-x11.patch b/contrib/packages/rpm/sle11/SOURCES/fltk-1_v4.3.x-keyboard-x11.patch
deleted file mode 100644
index cabc0f1..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v4.3.x-keyboard-x11.patch
+++ /dev/null
@@ -1,286 +0,0 @@
-diff -ur fltk-1.3.0r9619.org/FL/Fl_Widget.H fltk-1.3.0r9619/FL/Fl_Widget.H
---- fltk-1.3.0r9619.org/FL/Fl_Widget.H	2012-04-23 22:12:06.000000000 +0200
-+++ fltk-1.3.0r9619/FL/Fl_Widget.H	2012-06-18 13:46:07.302320825 +0200
-@@ -171,6 +171,7 @@
-         GROUP_RELATIVE  = 1<<16,  ///< position this widget relative to the parent group, not to the window
-         COPIED_TOOLTIP  = 1<<17,  ///< the widget tooltip is internally copied, its destruction is handled by the widget
-         FULLSCREEN      = 1<<18,  ///< a fullscreen window (Fl_Window)
-+        SIMPLE_KEYBOARD = 1<<19,  ///< the widget wants simple, consistent keypresses and not advanced input (like character composition and CJK input)
-         // (space for more flags)
-         USERFLAG3       = 1<<29,  ///< reserved for 3rd party extensions
-         USERFLAG2       = 1<<30,  ///< reserved for 3rd party extensions
-@@ -776,6 +777,35 @@
-    */
-   void clear_changed() {flags_ &= ~CHANGED;}
- 
-+  /** 
-+      Returns if the widget sees a simplified keyboard model or not.
-+
-+      Normally widgets get a full-featured keyboard model that is geared
-+      towards text input. This includes support for compose sequences and
-+      advanced input methods, commonly used for asian writing system. This
-+      system however has downsides in that extra graphic can be presented
-+      to the user and that a physical key press doesn't correspond directly
-+      to a FLTK event.
-+
-+      Widgets that need a direct correspondence between actual key events
-+      and those seen by the widget can swith to the simplified keyboard
-+      model.
-+
-+     \retval 0 if the widget uses the normal keyboard model
-+     \see set_changed(), clear_changed()
-+   */
-+  unsigned int simple_keyboard() const {return flags_&SIMPLE_KEYBOARD;}
-+
-+  /** Marks a widget to use the simple keyboard model.
-+      \see changed(), clear_changed()
-+   */
-+  void set_simple_keyboard() {flags_ |= SIMPLE_KEYBOARD;}
-+
-+  /** Marks a widget to use the normal keyboard model.
-+      \see changed(), set_changed()
-+   */
-+  void set_normal_keyboard() {flags_ &= ~SIMPLE_KEYBOARD;}
-+
-   /** Gives the widget the keyboard focus.
-       Tries to make this widget be the Fl::focus() widget, by first sending 
-       it an FL_FOCUS event, and if it returns non-zero, setting 
-diff -ur fltk-1.3.0r9619.org/src/Fl.cxx fltk-1.3.0r9619/src/Fl.cxx
---- fltk-1.3.0r9619.org/src/Fl.cxx	2012-03-23 17:47:53.000000000 +0100
-+++ fltk-1.3.0r9619/src/Fl.cxx	2012-06-18 13:46:07.303320877 +0200
-@@ -70,6 +70,8 @@
- extern double fl_mac_flush_and_wait(double time_to_wait, char in_idle);
- #endif // WIN32
- 
-+extern void fl_update_focus(void);
-+
- //
- // Globals...
- //
-@@ -876,6 +878,8 @@
-       fl_oldfocus = p;
-     }
-     e_number = old_event;
-+    // let the platform code do what it needs
-+    fl_update_focus();
-   }
- }
- 
-diff -ur fltk-1.3.0r9619.org/src/Fl_grab.cxx fltk-1.3.0r9619/src/Fl_grab.cxx
---- fltk-1.3.0r9619.org/src/Fl_grab.cxx	2012-03-23 17:47:53.000000000 +0100
-+++ fltk-1.3.0r9619/src/Fl_grab.cxx	2012-06-18 13:46:07.303320877 +0200
-@@ -29,6 +29,7 @@
- // override_redirect, it does similar things on WIN32.
- 
- extern void fl_fix_focus(); // in Fl.cxx
-+void fl_update_focus(void);
- 
- #ifdef WIN32
- // We have to keep track of whether we have captured the mouse, since
-@@ -80,6 +81,7 @@
- #endif
-     }
-     grab_ = win;
-+    fl_update_focus();
-   } else {
-     if (grab_) {
- #ifdef WIN32
-@@ -98,6 +100,7 @@
-       XFlush(fl_display);
- #endif
-       grab_ = 0;
-+      fl_update_focus();
-       fl_fix_focus();
-     }
-   }
-diff -ur fltk-1.3.0r9619.org/src/Fl_x.cxx fltk-1.3.0r9619/src/Fl_x.cxx
---- fltk-1.3.0r9619.org/src/Fl_x.cxx	2012-06-18 13:46:07.205316173 +0200
-+++ fltk-1.3.0r9619/src/Fl_x.cxx	2012-06-18 13:46:18.216844629 +0200
-@@ -298,6 +298,7 @@
- Colormap fl_colormap;
- XIM fl_xim_im = 0;
- XIC fl_xim_ic = 0;
-+Window fl_xim_win = 0;
- char fl_is_over_the_spot = 0;
- static XRectangle status_area;
- 
-@@ -583,6 +584,65 @@
-   if(xim_styles) XFree(xim_styles);
- }
- 
-+void fl_xim_deactivate(void);
-+
-+void fl_xim_activate(Window xid)
-+{
-+  if (!fl_xim_im)
-+    return;
-+
-+  // If the focused window has changed, then use the brute force method
-+  // of completely recreating the input context.
-+  if (fl_xim_win != xid) {
-+    fl_xim_deactivate();
-+
-+    fl_new_ic();
-+    fl_xim_win = xid;
-+
-+    XSetICValues(fl_xim_ic,
-+                 XNFocusWindow, fl_xim_win,
-+                 XNClientWindow, fl_xim_win,
-+                 NULL);
-+  }
-+
-+  fl_set_spot(spotf, spots, spot.x, spot.y, spot.width, spot.height);
-+}
-+
-+void fl_xim_deactivate(void)
-+{
-+  if (!fl_xim_ic)
-+    return;
-+
-+  XDestroyIC(fl_xim_ic);
-+  fl_xim_ic = NULL;
-+
-+  fl_xim_win = 0;
-+}
-+
-+extern Fl_Window *fl_xfocus;
-+
-+void fl_update_focus(void)
-+{
-+  Fl_Widget *focus;
-+
-+  focus = Fl::grab();
-+  if (!focus)
-+    focus = Fl::focus();
-+  if (!focus)
-+    return;
-+
-+  if (focus->simple_keyboard()) {
-+    fl_xim_deactivate();
-+  } else {
-+    // fl_xfocus should always be set if something has focus, but let's
-+    // play it safe
-+    if (!fl_xfocus || !fl_xid(fl_xfocus))
-+      return;
-+
-+    fl_xim_activate(fl_xid(fl_xfocus));
-+  }
-+}
-+
- void fl_open_display() {
-   if (fl_display) return;
- 
-@@ -917,10 +977,9 @@
-   XEvent xevent = thisevent;
-   fl_xevent = &thisevent;
-   Window xid = xevent.xany.window;
--  static Window xim_win = 0;
- 
-   if (fl_xim_ic && xevent.type == DestroyNotify &&
--        xid != xim_win && !fl_find(xid))
-+        xid != fl_xim_win && !fl_find(xid))
-   {
-     XIM xim_im;
-     xim_im = XOpenIM(fl_display, NULL, NULL, NULL);
-@@ -935,48 +994,10 @@
-     return 0;
-   }
- 
--  if (fl_xim_ic && (xevent.type == FocusIn))
--  {
--#define POOR_XIM
--#ifdef POOR_XIM
--        if (xim_win != xid)
--        {
--                xim_win  = xid;
--                XDestroyIC(fl_xim_ic);
--                fl_xim_ic = NULL;
--                fl_new_ic();
--                XSetICValues(fl_xim_ic,
--                                XNFocusWindow, xevent.xclient.window,
--                                XNClientWindow, xid,
--                                NULL);
--        }
--        fl_set_spot(spotf, spots, spot.x, spot.y, spot.width, spot.height);
--#else
--    if (Fl::first_window() && Fl::first_window()->modal()) {
--      Window x  = fl_xid(Fl::first_window());
--      if (x != xim_win) {
--        xim_win  = x;
--        XSetICValues(fl_xim_ic,
--                        XNFocusWindow, xim_win,
--                        XNClientWindow, xim_win,
--                        NULL);
--        fl_set_spot(spotf, spots, spot.x, spot.y, spot.width, spot.height);
--      }
--    } else if (xim_win != xid && xid) {
--      xim_win = xid;
--      XSetICValues(fl_xim_ic,
--                        XNFocusWindow, xevent.xclient.window,
--                        XNClientWindow, xid,
--                        //XNFocusWindow, xim_win,
--                        //XNClientWindow, xim_win,
--                        NULL);
--      fl_set_spot(spotf, spots, spot.x, spot.y, spot.width, spot.height);
--    }
--#endif
-+  if (fl_xim_ic) {
-+    if (XFilterEvent((XEvent *)&xevent, 0))
-+      return 1;
-   }
--
--  if ( XFilterEvent((XEvent *)&xevent, 0) )
--      return(1);
-   
- #if USE_XRANDR  
-   if( XRRUpdateConfiguration_f && xevent.type == randrEventBase + RRScreenChangeNotify) {
-@@ -1326,15 +1347,15 @@
-         //static XComposeStatus compose;
-         len = XLookupString((XKeyEvent*)&(xevent.xkey),
-                              buffer, buffer_len, &keysym, 0/*&compose*/);
--        if (keysym && keysym < 0x400) { // a character in latin-1,2,3,4 sets
--          // force it to type a character (not sure if this ever is needed):
--          // if (!len) {buffer[0] = char(keysym); len = 1;}
--          len = fl_utf8encode(XKeysymToUcs(keysym), buffer);
--          if (len < 1) len = 1;
--          // ignore all effects of shift on the keysyms, which makes it a lot
--          // easier to program shortcuts and is Windoze-compatible:
--          keysym = XKeycodeToKeysym(fl_display, keycode, 0);
--        }
-+        // XLookupString() is only defined to return Latin-1 (although it
-+        // often gives you more). To be safe, use our own lookups based on
-+        // keysym.
-+        len = fl_utf8encode(XKeysymToUcs(keysym), buffer);
-+        if (len < 1)
-+          len = 1;
-+        // ignore all effects of shift on the keysyms, which makes it a lot
-+        // easier to program shortcuts and is Windoze-compatable:
-+        keysym = XKeycodeToKeysym(fl_display, keycode, 0);
-       }
-       // MRS: Can't use Fl::event_state(FL_CTRL) since the state is not
-       //      set until set_event_xy() is called later...
-diff -ur fltk-1.3.0r9619.org/src/xutf8/imKStoUCS.c fltk-1.3.0r9619/src/xutf8/imKStoUCS.c
---- fltk-1.3.0r9619.org/src/xutf8/imKStoUCS.c	2009-03-13 23:43:43.000000000 +0100
-+++ fltk-1.3.0r9619/src/xutf8/imKStoUCS.c	2012-06-18 13:46:07.304320930 +0200
-@@ -266,6 +266,12 @@
-     0x20a8, 0x20a9, 0x20aa, 0x20ab, 0x20ac                          /* 0x20a8-0x20af */
- };
- 
-+static unsigned short const keysym_to_unicode_fe50_fe60[] = {
-+    0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0306, 0x0307, 0x0308, /* 0xfe50-0xfe57 */
-+    0x030a, 0x030b, 0x030c, 0x0327, 0x0328, 0x1da5, 0x3099, 0x309a, /* 0xfe58-0xfe5f */
-+    0x0323                                                          /* 0xfe60-0xfe67 */
-+};
-+
- unsigned int
- KeySymToUcs4(KeySym keysym)
- {
-@@ -315,6 +321,8 @@
- 	return keysym_to_unicode_1e9f_1eff[keysym - 0x1e9f];
-     else if (keysym > 0x209f && keysym < 0x20ad)
- 	return keysym_to_unicode_20a0_20ac[keysym - 0x20a0];
-+    else if (keysym > 0xfe4f && keysym < 0xfe61)
-+	return keysym_to_unicode_fe50_fe60[keysym - 0xfe50];
-     else 
- 	return 0;
- }
diff --git a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v5.3.x-cursor.patch b/contrib/packages/rpm/sle11/SOURCES/fltk-1_v5.3.x-cursor.patch
deleted file mode 100644
index 8e99050..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v5.3.x-cursor.patch
+++ /dev/null
@@ -1,1623 +0,0 @@
-diff -up fltk-1.3.2/CMakeLists.txt.cursor fltk-1.3.2/CMakeLists.txt
---- fltk-1.3.2/CMakeLists.txt.cursor	2013-01-30 16:07:59.510320246 +0100
-+++ fltk-1.3.2/CMakeLists.txt	2013-01-30 16:07:59.528319926 +0100
-@@ -529,6 +529,20 @@ else()
- endif(OPTION_USE_XFIXES)
- 
- #######################################################################
-+if(X11_Xcursor_FOUND)
-+   option(OPTION_USE_XCURSOR "use lib XCURSOR" ON)
-+endif(X11_Xcursor_FOUND)
-+
-+if(OPTION_USE_XCURSOR)
-+   set(HAVE_XCURSOR ${X11_Xcursor_FOUND})
-+   include_directories(${X11_Xcursor_INCLUDE_PATH})
-+   list(APPEND FLTK_LDLIBS -lXcursor)
-+   set(FLTK_XCURSOR_FOUND TRUE)
-+else()
-+   set(FLTK_XCURSOR_FOUND FALSE)
-+endif(OPTION_USE_XCURSOR)
-+
-+#######################################################################
- if(X11_Xft_FOUND)
-    option(OPTION_USE_XFT "use lib Xft" ON)
- endif(X11_Xft_FOUND)
-diff -up fltk-1.3.2/configh.cmake.in.cursor fltk-1.3.2/configh.cmake.in
---- fltk-1.3.2/configh.cmake.in.cursor	2013-01-30 16:07:59.510320246 +0100
-+++ fltk-1.3.2/configh.cmake.in	2013-01-30 16:07:59.529319908 +0100
-@@ -116,6 +116,14 @@
- #cmakedefine01 HAVE_XFIXES
- 
- /*
-+ * HAVE_XCURSOR:
-+ *
-+ * Do we have the X cursor library?
-+ */
-+
-+#cmakedefine01 HAVE_XCURSOR
-+
-+/*
-  * __APPLE_QUARTZ__:
-  *
-  * If __APPLE_QUARTZ__ is defined, FLTK will be
-diff -up fltk-1.3.2/configh.in.cursor fltk-1.3.2/configh.in
---- fltk-1.3.2/configh.in.cursor	2013-01-30 16:07:59.510320246 +0100
-+++ fltk-1.3.2/configh.in	2013-01-30 16:07:59.529319908 +0100
-@@ -116,6 +116,14 @@
- #define HAVE_XFIXES 0
- 
- /*
-+ * HAVE_XCURSOR:
-+ *
-+ * Do we have the X cursor library?
-+ */
-+
-+#define HAVE_XCURSOR 0
-+
-+/*
-  * __APPLE_QUARTZ__:
-  *
-  * All Apple implementations are now based on Quartz and Cocoa,
-diff -up fltk-1.3.2/configure.in.cursor fltk-1.3.2/configure.in
---- fltk-1.3.2/configure.in.cursor	2013-01-30 16:07:59.511320228 +0100
-+++ fltk-1.3.2/configure.in	2013-01-30 16:07:59.529319908 +0100
-@@ -1009,6 +1009,16 @@ case $uname_GUI in
- 		LIBS="-lXfixes $LIBS")
- 	fi
- 
-+	dnl Check for the Xcursor library unless disabled...
-+        AC_ARG_ENABLE(xcursor, [  --enable-xcursor        turn on Xcursor support [default=yes]])
-+
-+	if test x$enable_xcursor != xno; then
-+	    AC_CHECK_HEADER(X11/Xcursor/Xcursor.h, AC_DEFINE(HAVE_XCURSOR),,
-+	        [#include <X11/Xlib.h>])
-+	    AC_CHECK_LIB(Xcursor, XcursorImageCreate,
-+		LIBS="-lXcursor $LIBS")
-+	fi
-+
- 	dnl Check for overlay visuals...
- 	AC_PATH_PROG(XPROP, xprop)
- 	AC_CACHE_CHECK(for X overlay visuals, ac_cv_have_overlay,
-diff -up fltk-1.3.2/FL/Enumerations.H.cursor fltk-1.3.2/FL/Enumerations.H
---- fltk-1.3.2/FL/Enumerations.H.cursor	2013-01-30 16:07:59.486320673 +0100
-+++ fltk-1.3.2/FL/Enumerations.H	2013-01-30 16:07:59.530319891 +0100
-@@ -879,35 +879,36 @@ inline Fl_Color fl_color_cube(int r, int
- 
- /** The following constants define the mouse cursors that are available in FLTK.
- 
--    The double-headed arrows are bitmaps provided by FLTK on X, the others
--    are provided by system-defined cursors.
-+    Cursors are provided by the system when available, or bitmaps built into
-+    FLTK as a fallback.
- 
-     \todo enum Fl_Cursor needs maybe an image.
- */
- enum Fl_Cursor {
-   FL_CURSOR_DEFAULT	=  0, /**< the default cursor, usually an arrow. */
--  FL_CURSOR_ARROW	= 35, /**< an arrow pointer. */
--  FL_CURSOR_CROSS	= 66, /**< crosshair. */
--  FL_CURSOR_WAIT	= 76, /**< watch or hourglass. */
--  FL_CURSOR_INSERT	= 77, /**< I-beam. */
--  FL_CURSOR_HAND	= 31, /**< hand (uparrow on MSWindows). */
--  FL_CURSOR_HELP	= 47, /**< question mark. */
--  FL_CURSOR_MOVE	= 27, /**< 4-pointed arrow. */
--  // fltk provides bitmaps for these:
--  FL_CURSOR_NS		= 78, /**< up/down arrow. */
--  FL_CURSOR_WE		= 79, /**< left/right arrow. */
--  FL_CURSOR_NWSE	= 80, /**< diagonal arrow. */
--  FL_CURSOR_NESW	= 81, /**< diagonal arrow. */
--  FL_CURSOR_NONE	=255, /**< invisible. */
--  // for back compatibility (non MSWindows ones):
--  FL_CURSOR_N		= 70, /**< for back compatibility. */
--  FL_CURSOR_NE		= 69, /**< for back compatibility. */
--  FL_CURSOR_E		= 49, /**< for back compatibility. */
--  FL_CURSOR_SE		=  8, /**< for back compatibility. */
--  FL_CURSOR_S		=  9, /**< for back compatibility. */
--  FL_CURSOR_SW		=  7, /**< for back compatibility. */
--  FL_CURSOR_W		= 36, /**< for back compatibility. */
--  FL_CURSOR_NW		= 68 /**< for back compatibility. */
-+  FL_CURSOR_ARROW   = 1,    /**< an arrow pointer. */
-+  FL_CURSOR_CROSS   = 2,    /**< crosshair. */
-+  FL_CURSOR_WAIT    = 3,    /**< busy indicator (e.g. hourglass). */
-+  FL_CURSOR_INSERT  = 4,    /**< I-beam. */
-+  FL_CURSOR_HAND    = 5,    /**< pointing hand. */
-+  FL_CURSOR_HELP    = 6,    /**< question mark pointer. */
-+  FL_CURSOR_MOVE    = 7,    /**< 4-pointed arrow or hand. */
-+
-+  /* Resize indicators */
-+  FL_CURSOR_NS      = 101,  /**< up/down resize. */
-+  FL_CURSOR_WE      = 102,  /**< left/right resize. */
-+  FL_CURSOR_NWSE    = 103,  /**< diagonal resize. */
-+  FL_CURSOR_NESW    = 104,  /**< diagonal resize. */
-+  FL_CURSOR_NE      = 110,  /**< upwards, right resize. */
-+  FL_CURSOR_N       = 111,  /**< upwards resize. */
-+  FL_CURSOR_NW      = 112,  /**< upwards, left resize. */
-+  FL_CURSOR_E       = 113,  /**< leftwards resize. */
-+  FL_CURSOR_W       = 114,  /**< rightwards resize. */
-+  FL_CURSOR_SE      = 115,  /**< downwards, right resize. */
-+  FL_CURSOR_S       = 116,  /**< downwards resize. */
-+  FL_CURSOR_SW      = 117,  /**< downwards, left resize. */
-+
-+  FL_CURSOR_NONE    = 255,  /**< invisible. */
- };
- /*@}*/		// group: Cursors  
- 
-diff -up fltk-1.3.2/FL/fl_draw.H.cursor fltk-1.3.2/FL/fl_draw.H
---- fltk-1.3.2/FL/fl_draw.H.cursor	2012-05-08 18:15:34.000000000 +0200
-+++ fltk-1.3.2/FL/fl_draw.H	2013-01-30 16:07:59.530319891 +0100
-@@ -751,7 +751,8 @@ FL_EXPORT const char* fl_shortcut_label(
- FL_EXPORT unsigned int fl_old_shortcut(const char* s);
- FL_EXPORT void fl_overlay_rect(int x,int y,int w,int h);
- FL_EXPORT void fl_overlay_clear();
--FL_EXPORT void fl_cursor(Fl_Cursor, Fl_Color fg=FL_BLACK, Fl_Color bg=FL_WHITE);
-+FL_EXPORT void fl_cursor(Fl_Cursor);
-+FL_EXPORT void fl_cursor(Fl_Cursor, Fl_Color fg, Fl_Color bg=FL_WHITE);
- FL_EXPORT const char* fl_expand_text(const char* from, char* buf, int maxbuf,
-                                      double maxw, int& n, double &width,
-                                      int wrap, int draw_symbols = 0);
-diff -up fltk-1.3.2/FL/Fl_Window.H.cursor fltk-1.3.2/FL/Fl_Window.H
---- fltk-1.3.2/FL/Fl_Window.H.cursor	2012-11-06 21:46:14.000000000 +0100
-+++ fltk-1.3.2/FL/Fl_Window.H	2013-01-30 16:07:59.531319873 +0100
-@@ -28,6 +28,7 @@
- #define FL_DOUBLE_WINDOW 0xF1   ///< double window type id
- 
- class Fl_X;
-+class Fl_RGB_Image;
- 
- /**
-   This widget produces an actual window.  This can either be a main
-@@ -81,7 +82,6 @@ class FL_EXPORT Fl_Window : public Fl_Gr
-   uchar size_range_set;
-   // cursor stuff
-   Fl_Cursor cursor_default;
--  Fl_Color cursor_fg, cursor_bg;
-   void size_range_();
-   void _Fl_Window(); // constructor innards
-   void fullscreen_x(); // platform-specific part of sending a window to full screen
-@@ -466,14 +466,17 @@ public:
-     is different.
- 
-     The type Fl_Cursor is an enumeration defined in <FL/Enumerations.H>.
--    (Under X you can get any XC_cursor value by passing 
--    Fl_Cursor((XC_foo/2)+1)).  The colors only work on X, they are
--    not implemented on WIN32.
- 
--    For back compatibility only.
-+    \see cursor(const Fl_RGB_Image*, int, int), default_cursor()
-   */
--  void cursor(Fl_Cursor, Fl_Color=FL_BLACK, Fl_Color=FL_WHITE); // platform dependent
--  void default_cursor(Fl_Cursor, Fl_Color=FL_BLACK, Fl_Color=FL_WHITE);
-+  void cursor(Fl_Cursor);
-+  void cursor(const Fl_RGB_Image*, int, int);
-+  void default_cursor(Fl_Cursor);
-+
-+  /* for legacy compatibility */
-+  void cursor(Fl_Cursor c, Fl_Color, Fl_Color=FL_WHITE);
-+  void default_cursor(Fl_Cursor c, Fl_Color, Fl_Color=FL_WHITE);
-+
-   static void default_callback(Fl_Window*, void* v);
-   
-   /** Returns the window width including any frame added by the window manager.
-diff -up fltk-1.3.2/FL/mac.H.cursor fltk-1.3.2/FL/mac.H
---- fltk-1.3.2/FL/mac.H.cursor	2012-11-13 15:45:42.000000000 +0100
-+++ fltk-1.3.2/FL/mac.H	2013-01-30 16:07:59.531319873 +0100
-@@ -120,7 +120,8 @@ public:
-   void collapse(void);
-   WindowRef window_ref(void);
-   void set_key_window(void);
--  void set_cursor(Fl_Cursor);
-+  int set_cursor(Fl_Cursor);
-+  int set_cursor(const Fl_RGB_Image*, int, int);
-   static CGImageRef CGImage_from_window_rect(Fl_Window *win, int x, int y, int w, int h);
-   static unsigned char *bitmap_from_window_rect(Fl_Window *win, int x, int y, int w, int h, int *bytesPerPixel);
-   static Fl_Region intersect_region_and_rect(Fl_Region current, int x,int y,int w, int h);
-diff -up fltk-1.3.2/FL/win32.H.cursor fltk-1.3.2/FL/win32.H
---- fltk-1.3.2/FL/win32.H.cursor	2012-03-12 12:55:50.000000000 +0100
-+++ fltk-1.3.2/FL/win32.H	2013-01-30 16:07:59.531319873 +0100
-@@ -73,6 +73,7 @@ public:
-   int wait_for_expose;
-   HDC private_dc; // used for OpenGL
-   HCURSOR cursor;
-+  int custom_cursor;
-   HDC saved_hdc;  // saves the handle of the DC currently loaded
-   // static variables, static functions and member functions
-   static Fl_X* first;
-@@ -83,6 +84,8 @@ public:
-   void flush() {w->flush();}
-   void set_minmax(LPMINMAXINFO minmax);
-   void mapraise();
-+  int set_cursor(Fl_Cursor);
-+  int set_cursor(const Fl_RGB_Image*, int, int);
-   static Fl_X* make(Fl_Window*);
- };
- extern FL_EXPORT HCURSOR fl_default_cursor;
-diff -up fltk-1.3.2/FL/x.H.cursor fltk-1.3.2/FL/x.H
---- fltk-1.3.2/FL/x.H.cursor	2012-03-23 17:47:53.000000000 +0100
-+++ fltk-1.3.2/FL/x.H	2013-01-30 16:07:59.532319855 +0100
-@@ -154,6 +154,8 @@ public:
-   static Fl_X* i(const Fl_Window* wi) {return wi->i;}
-   void setwindow(Fl_Window* wi) {w=wi; wi->i=this;}
-   void sendxjunk();
-+  int set_cursor(Fl_Cursor);
-+  int set_cursor(const Fl_RGB_Image*, int, int);
-   static void make_xid(Fl_Window*,XVisualInfo* =fl_visual, Colormap=fl_colormap);
-   static Fl_X* set_xid(Fl_Window*, Window);
-   // kludges to get around protection:
-diff -up fltk-1.3.2/src/CMakeLists.txt.cursor fltk-1.3.2/src/CMakeLists.txt
---- fltk-1.3.2/src/CMakeLists.txt.cursor	2013-01-30 16:09:11.981032475 +0100
-+++ fltk-1.3.2/src/CMakeLists.txt	2013-01-30 16:09:26.497774461 +0100
-@@ -247,6 +247,10 @@ if(HAVE_XFIXES)
-    target_link_libraries(fltk ${X11_Xfixes_LIB})
- endif(HAVE_XFIXES)
- 
-+if(HAVE_XCURSOR)
-+   target_link_libraries(fltk ${X11_Xcursor_LIB})
-+endif(HAVE_XCURSOR)
-+
- if(USE_XFT)
-    target_link_libraries(fltk ${X11_Xft_LIB})
- endif(USE_XFT)
-diff -up fltk-1.3.2/src/Fl_cocoa.mm.cursor fltk-1.3.2/src/Fl_cocoa.mm
---- fltk-1.3.2/src/Fl_cocoa.mm.cursor	2013-01-30 16:07:59.522320033 +0100
-+++ fltk-1.3.2/src/Fl_cocoa.mm	2013-01-30 16:07:59.533319837 +0100
-@@ -98,7 +98,6 @@ Fl_Display_Device *Fl_Display_Device::_d
- CGContextRef fl_gc = 0;
- void *fl_system_menu;                   // this is really a NSMenu*
- Fl_Sys_Menu_Bar *fl_sys_menu_bar = 0;
--void *fl_default_cursor;		// this is really a NSCursor*
- void *fl_capture = 0;			// (NSWindow*) we need this to compensate for a missing(?) mouse capture
- bool fl_show_iconic;                    // true if called from iconize() - shows the next created window in collapsed state
- //int fl_disable_transient_for;           // secret method of removing TRANSIENT_FOR
-@@ -1392,8 +1391,6 @@ void fl_open_display() {
- 					  dequeue:YES];
-     while (ign_event);
-     
--    fl_default_cursor = [NSCursor arrowCursor];
--
-     // bring the application into foreground without a 'CARB' resource
-     Boolean same_psn;
-     ProcessSerialNumber cur_psn, front_psn;
-@@ -1698,6 +1695,7 @@ static void  q_set_window_title(NSWindow
- - (void)drawRect:(NSRect)rect;
- - (BOOL)acceptsFirstResponder;
- - (BOOL)acceptsFirstMouse:(NSEvent*)theEvent;
-+- (void)resetCursorRects;
- - (BOOL)performKeyEquivalent:(NSEvent*)theEvent;
- - (void)mouseUp:(NSEvent *)theEvent;
- - (void)rightMouseUp:(NSEvent *)theEvent;
-@@ -1756,6 +1754,16 @@ static void  q_set_window_title(NSWindow
-   Fl_Window *first = Fl::first_window();
-   return (first == w || !first->modal());
- }
-+- (void)resetCursorRects {
-+  Fl_Window *w = [(FLWindow*)[self window] getFl_Window];
-+  Fl_X *i = Fl_X::i(w);
-+  // We have to have at least one cursor rect for invalidateCursorRectsForView
-+  // to work, hence the "else" clause.
-+  if (i->cursor)
-+    [self addCursorRect:[self visibleRect] cursor:(NSCursor*)i->cursor];
-+  else
-+    [self addCursorRect:[self visibleRect] cursor:[NSCursor arrowCursor]];
-+}
- - (void)mouseUp:(NSEvent *)theEvent {
-   cocoaMouseHandler(theEvent);
- }
-@@ -2331,7 +2339,7 @@ void Fl_X::make(Fl_Window* w)
-     x->other_xid = 0;
-     x->region = 0;
-     x->subRegion = 0;
--    x->cursor = fl_default_cursor;
-+    x->cursor = NULL;
-     x->gc = 0;			// stay 0 for Quickdraw; fill with CGContext for Quartz
-     Fl_Window *win = w->window();
-     Fl_X *xo = Fl_X::i(win);
-@@ -2427,7 +2435,7 @@ void Fl_X::make(Fl_Window* w)
-     x->other_xid = 0; // room for doublebuffering image map. On OS X this is only used by overlay windows
-     x->region = 0;
-     x->subRegion = 0;
--    x->cursor = fl_default_cursor;
-+    x->cursor = NULL;
-     x->xidChildren = 0;
-     x->xidNext = 0;
-     x->gc = 0;
-@@ -2974,6 +2982,10 @@ void Fl_X::map() {
-     Fl_X::relink(w, w->window() );
-     w->redraw();
-   }
-+  if (cursor) {
-+    [(NSCursor*)cursor release];
-+    cursor = NULL;
-+  }
- }
- 
- void Fl_X::unmap() {
-@@ -3078,68 +3090,106 @@ static NSImage *CGBitmapContextToNSImage
-   return [image autorelease];
- }
- 
--static NSCursor *PrepareCursor(NSCursor *cursor, CGContextRef (*f)() )
-+int Fl_X::set_cursor(Fl_Cursor c)
- {
--  if (cursor == nil) {
--    CGContextRef c = f();
--    NSImage *image = CGBitmapContextToNSImage(c);
--    fl_delete_offscreen( (Fl_Offscreen)c ); 
--    NSPoint pt = {[image size].width/2, [image size].height/2};
--    cursor = [[NSCursor alloc] initWithImage:image hotSpot:pt];
-+  if (cursor) {
-+    [(NSCursor*)cursor release];
-+    cursor = NULL;
-   }
--  return cursor;
--}
- 
--void Fl_X::set_cursor(Fl_Cursor c)
--{
--  NSCursor *icrsr;
-   switch (c) {
--    case FL_CURSOR_CROSS:  icrsr = [NSCursor crosshairCursor]; break;
--    case FL_CURSOR_WAIT:
--      static NSCursor *watch = nil;
--      watch = PrepareCursor(watch,  &Fl_X::watch_cursor_image);
--      icrsr = watch;
--      break;
--    case FL_CURSOR_INSERT: icrsr = [NSCursor IBeamCursor]; break;
--    case FL_CURSOR_N:      icrsr = [NSCursor resizeUpCursor]; break;
--    case FL_CURSOR_S:      icrsr = [NSCursor resizeDownCursor]; break;
--    case FL_CURSOR_NS:     icrsr = [NSCursor resizeUpDownCursor]; break;
--    case FL_CURSOR_HELP:   
--      static NSCursor *help = nil;
--      help = PrepareCursor(help,  &Fl_X::help_cursor_image);
--      icrsr = help;
--      break;
--    case FL_CURSOR_HAND:   icrsr = [NSCursor pointingHandCursor]; break;
--    case FL_CURSOR_MOVE:   icrsr = [NSCursor openHandCursor]; break;
--    case FL_CURSOR_NE:
--    case FL_CURSOR_SW:
--    case FL_CURSOR_NESW:   
--      static NSCursor *nesw = nil;
--      nesw = PrepareCursor(nesw,  &Fl_X::nesw_cursor_image);
--      icrsr = nesw;
--      break;
--    case FL_CURSOR_E:      icrsr = [NSCursor resizeRightCursor]; break;
--    case FL_CURSOR_W:      icrsr = [NSCursor resizeLeftCursor]; break;
--    case FL_CURSOR_WE:     icrsr = [NSCursor resizeLeftRightCursor]; break;
--    case FL_CURSOR_SE:
--    case FL_CURSOR_NW:
--    case FL_CURSOR_NWSE:   
--      static NSCursor *nwse = nil;
--      nwse = PrepareCursor(nwse,  &Fl_X::nwse_cursor_image);
--      icrsr = nwse;
--      break;
--    case FL_CURSOR_NONE:   
--      static NSCursor *none = nil;
--      none = PrepareCursor(none,  &Fl_X::none_cursor_image);
--      icrsr = none; 
--      break;
--    case FL_CURSOR_ARROW:
--    case FL_CURSOR_DEFAULT:
--    default:			   icrsr = [NSCursor arrowCursor];
--      break;
-+  case FL_CURSOR_ARROW:   cursor = [NSCursor arrowCursor]; break;
-+  case FL_CURSOR_CROSS:   cursor = [NSCursor crosshairCursor]; break;
-+  case FL_CURSOR_INSERT:  cursor = [NSCursor IBeamCursor]; break;
-+  case FL_CURSOR_HAND:    cursor = [NSCursor pointingHandCursor]; break;
-+  case FL_CURSOR_MOVE:    cursor = [NSCursor openHandCursor]; break;
-+  case FL_CURSOR_NS:      cursor = [NSCursor resizeUpDownCursor]; break;
-+  case FL_CURSOR_WE:      cursor = [NSCursor resizeLeftRightCursor]; break;
-+  case FL_CURSOR_N:       cursor = [NSCursor resizeUpCursor]; break;
-+  case FL_CURSOR_E:       cursor = [NSCursor resizeRightCursor]; break;
-+  case FL_CURSOR_W:       cursor = [NSCursor resizeLeftCursor]; break;
-+  case FL_CURSOR_S:       cursor = [NSCursor resizeDownCursor]; break;
-+  default:
-+    return 0;
-+  }
-+
-+  [(NSCursor*)cursor retain];
-+
-+  [(NSWindow*)xid invalidateCursorRectsForView:[(NSWindow*)xid contentView]];
-+
-+  return 1;
-+}
-+
-+int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
-+  if (cursor) {
-+    [(NSCursor*)cursor release];
-+    cursor = NULL;
-+  }
-+
-+  if ((hotx < 0) || (hotx >= image->w()))
-+    return 0;
-+  if ((hoty < 0) || (hoty >= image->h()))
-+    return 0;
-+
-+  // OS X >= 10.6 can create a NSImage from a CGImage, but we need to
-+  // support older versions, hence this pesky handling.
-+
-+  NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc]
-+                              initWithBitmapDataPlanes:NULL
-+                              pixelsWide:image->w()
-+                              pixelsHigh:image->h()
-+                              bitsPerSample:8
-+                              samplesPerPixel:image->d()
-+                              hasAlpha:!(image->d() & 1)
-+                              isPlanar:NO
-+                              colorSpaceName:(image->d()<=2) ? NSDeviceWhiteColorSpace : NSDeviceRGBColorSpace
-+                              bytesPerRow:(image->w() * image->d())
-+                              bitsPerPixel:(image->d()*8)];
-+
-+  // Alpha needs to be premultiplied for this format
-+
-+  const uchar *i = (const uchar*)*image->data();
-+  unsigned char *o = [bitmap bitmapData];
-+  for (int y = 0;y < image->h();y++) {
-+    if (image->d() & 1) {
-+      for (int x = 0;x < image->w();x++) {
-+        unsigned int alpha;
-+        if (image->d() == 4) {
-+          alpha = i[3];
-+          *o++ = (unsigned char)((unsigned int)*i++ * alpha / 255);
-+          *o++ = (unsigned char)((unsigned int)*i++ * alpha / 255);
-+        }
-+
-+        alpha = i[1];
-+        *o++ = (unsigned char)((unsigned int)*i++ * alpha / 255);
-+        *o++ = alpha;
-+        i++;
-+  }
-+    } else {
-+      // No alpha, so we can just copy everything directly.
-+      int len = image->w() * image->d();
-+      memcpy(o, i, len);
-+      o += len;
-+      i += len;
-+    }
-+    i += image->ld();
-   }
--  [icrsr set];
--  cursor = icrsr;
-+
-+  NSImage *nsimage = [[NSImage alloc]
-+                      initWithSize:NSMakeSize(image->w(), image->h())];
-+
-+  [nsimage addRepresentation:bitmap];
-+
-+  cursor = [[NSCursor alloc]
-+            initWithImage:nsimage
-+            hotSpot:NSMakePoint(hotx, hoty)];
-+
-+  [(NSWindow*)xid invalidateCursorRectsForView:[(NSWindow*)xid contentView]];
-+
-+  [bitmap release];
-+  [nsimage release];
-+
-+  return 1;
- }
- 
- @interface FLaboutItemTarget : NSObject 
-diff -up fltk-1.3.2/src/fl_cursor.cxx.cursor fltk-1.3.2/src/fl_cursor.cxx
---- fltk-1.3.2/src/fl_cursor.cxx.cursor	2012-03-12 12:55:50.000000000 +0100
-+++ fltk-1.3.2/src/fl_cursor.cxx	2013-01-30 16:07:59.534319820 +0100
-@@ -24,297 +24,165 @@
- 
- #include <FL/Fl.H>
- #include <FL/Fl_Window.H>
-+#include <FL/Fl_Pixmap.H>
-+#include <FL/Fl_RGB_Image.H>
- #include <FL/x.H>
--#if !defined(WIN32) && !defined(__APPLE__)
--#  include <X11/cursorfont.h>
--#endif
- #include <FL/fl_draw.H>
- 
-+#include "fl_cursor_wait.xpm"
-+#include "fl_cursor_help.xpm"
-+#include "fl_cursor_nwse.xpm"
-+#include "fl_cursor_nesw.xpm"
-+#include "fl_cursor_none.xpm"
-+
- /**
-   Sets the cursor for the current window to the specified shape and colors.
-   The cursors are defined in the <FL/Enumerations.H> header file. 
-   */
-+void fl_cursor(Fl_Cursor c) {
-+  if (Fl::first_window()) Fl::first_window()->cursor(c);
-+}
-+
-+/* For back compatibility only. */
- void fl_cursor(Fl_Cursor c, Fl_Color fg, Fl_Color bg) {
--  if (Fl::first_window()) Fl::first_window()->cursor(c,fg,bg);
-+  fl_cursor(c);
- }
-+
-+
- /** 
--    Sets the default window cursor as well as its color.
-+    Sets the default window cursor. This is the cursor that will be used
-+    after the mouse pointer leaves a widget with a custom cursor set.
- 
--    For back compatibility only.
-+    \see cursor(const Fl_RGB_Image*, int, int), default_cursor()
- */
--void Fl_Window::default_cursor(Fl_Cursor c, Fl_Color fg, Fl_Color bg) {
--//  if (c == FL_CURSOR_DEFAULT) c = FL_CURSOR_ARROW;
--
-+void Fl_Window::default_cursor(Fl_Cursor c) {
-   cursor_default = c;
--  cursor_fg      = fg;
--  cursor_bg      = bg;
-+  cursor(c);
-+}
-+
-+
-+void fallback_cursor(Fl_Window *w, Fl_Cursor c) {
-+  const char **xpm;
-+  int hotx, hoty;
-+
-+  // The standard arrow is our final fallback, so something is broken
-+  // if we get called back here with that as an argument.
-+  if (c == FL_CURSOR_ARROW)
-+    return;
-+
-+  switch (c) {
-+  case FL_CURSOR_WAIT:
-+    xpm = (const char**)fl_cursor_wait_xpm;
-+    hotx = 8;
-+    hoty = 15;
-+    break;
-+  case FL_CURSOR_HELP:
-+    xpm = (const char**)fl_cursor_help_xpm;
-+    hotx = 1;
-+    hoty = 3;
-+    break;
-+  case FL_CURSOR_NWSE:
-+    xpm = (const char**)fl_cursor_nwse_xpm;
-+    hotx = 7;
-+    hoty = 7;
-+    break;
-+  case FL_CURSOR_NESW:
-+    xpm = (const char**)fl_cursor_nesw_xpm;
-+    hotx = 7;
-+    hoty = 7;
-+    break;
-+  case FL_CURSOR_NONE:
-+    xpm = (const char**)fl_cursor_none_xpm;
-+    hotx = 0;
-+    hoty = 0;
-+    break;
-+  default:
-+    w->cursor(FL_CURSOR_ARROW);
-+    return;
-+  }
- 
--  cursor(c, fg, bg);
-+  Fl_Pixmap pxm(xpm);
-+  Fl_RGB_Image image(&pxm);
-+
-+  w->cursor(&image, hotx, hoty);
- }
- 
--#ifdef WIN32
- 
--#  ifndef IDC_HAND
--#    define IDC_HAND	MAKEINTRESOURCE(32649)
--#  endif // !IDC_HAND
-+void Fl_Window::cursor(Fl_Cursor c) {
-+  int ret;
- 
--void Fl_Window::cursor(Fl_Cursor c, Fl_Color c1, Fl_Color c2) {
--  if (!shown()) return;
-   // the cursor must be set for the top level window, not for subwindows
-   Fl_Window *w = window(), *toplevel = this;
--  while (w) { toplevel = w; w = w->window(); }
--  if (toplevel != this) { toplevel->cursor(c, c1, c2); return; }
--  // now set the actual cursor
--  if (c == FL_CURSOR_DEFAULT) {
--    c = cursor_default;
--  }
--  if (c > FL_CURSOR_NESW) {
--    i->cursor = 0;
--  } else if (c == FL_CURSOR_DEFAULT) {
--    i->cursor = fl_default_cursor;
--  } else {
--    LPSTR n;
--    switch (c) {
--    case FL_CURSOR_ARROW:	n = IDC_ARROW; break;
--    case FL_CURSOR_CROSS:	n = IDC_CROSS; break;
--    case FL_CURSOR_WAIT:	n = IDC_WAIT; break;
--    case FL_CURSOR_INSERT:	n = IDC_IBEAM; break;
--    case FL_CURSOR_HELP:	n = IDC_HELP; break;
--    case FL_CURSOR_HAND: {
--          OSVERSIONINFO osvi;
--
--          // Get the OS version: Windows 98 and 2000 have a standard
--	  // hand cursor.
--          memset(&osvi, 0, sizeof(OSVERSIONINFO));
--          osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
--          GetVersionEx(&osvi);
--
--          if (osvi.dwMajorVersion > 4 ||
--  	      (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion > 0 &&
--  	       osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)) n = IDC_HAND;
--          else n = IDC_UPARROW;
--	} break;
--    case FL_CURSOR_MOVE:	n = IDC_SIZEALL; break;
--    case FL_CURSOR_N:
--    case FL_CURSOR_S:
--    case FL_CURSOR_NS:		n = IDC_SIZENS; break;
--    case FL_CURSOR_NE:
--    case FL_CURSOR_SW:
--    case FL_CURSOR_NESW:	n = IDC_SIZENESW; break;
--    case FL_CURSOR_E:
--    case FL_CURSOR_W:
--    case FL_CURSOR_WE:		n = IDC_SIZEWE; break;
--    case FL_CURSOR_SE:
--    case FL_CURSOR_NW:
--    case FL_CURSOR_NWSE:	n = IDC_SIZENWSE; break;
--    default:			n = IDC_NO; break;
--    }
--    i->cursor = LoadCursor(NULL, n);
-+
-+  while (w) {
-+    toplevel = w;
-+    w = w->window();
-   }
--  SetCursor(i->cursor);
--}
- 
--#elif defined(__APPLE__)
-+  if (toplevel != this) {
-+    toplevel->cursor(c);
-+    return;
-+  }
- 
--#ifdef __BIG_ENDIAN__
--# define E(x) x
--#elif defined __LITTLE_ENDIAN__
--// Don't worry. This will be resolved at compile time
--# define E(x) (x>>8)|((x<<8)&0xff00)
--#else
--# error "Either __LITTLE_ENDIAN__ or __BIG_ENDIAN__ must be defined"
--#endif
--
--CGContextRef Fl_X::help_cursor_image(void)
--{
--  int w = 20, h = 20;
--  Fl_Offscreen off = Fl_Quartz_Graphics_Driver::create_offscreen_with_alpha(w, h);
--  fl_begin_offscreen(off);
--  CGContextSetRGBFillColor( (CGContextRef)off, 0,0,0,0);
--  fl_rectf(0,0,w,h);
--  fl_color(FL_BLACK);
--  fl_font(FL_COURIER_BOLD, 20);
--  fl_draw("?", 1, h-1);
--  fl_end_offscreen();
--  return (CGContextRef)off;
--}
-+  if (c == FL_CURSOR_DEFAULT)
-+    c = cursor_default;
- 
--CGContextRef Fl_X::none_cursor_image(void)
--{
--  int w = 20, h = 20;
--  Fl_Offscreen off = Fl_Quartz_Graphics_Driver::create_offscreen_with_alpha(w, h);
--  fl_begin_offscreen(off);
--  CGContextSetRGBFillColor( (CGContextRef)off, 0,0,0,0);
--  fl_rectf(0,0,w,h);
--  fl_end_offscreen();
--  return (CGContextRef)off;
--}
-+  if (!i)
-+    return;
- 
--CGContextRef Fl_X::watch_cursor_image(void)
--{
--  int w, h, r = 5;
--  w = 2*r+6;
--  h = 4*r;
--  Fl_Offscreen off = Fl_Quartz_Graphics_Driver::create_offscreen_with_alpha(w, h);
--  fl_begin_offscreen(off);
--  CGContextSetRGBFillColor( (CGContextRef)off, 0,0,0,0);
--  fl_rectf(0,0,w,h);
--  CGContextTranslateCTM( (CGContextRef)off, w/2, h/2);
--  fl_color(FL_WHITE);
--  fl_circle(0, 0, r+1);
--  fl_color(FL_BLACK);
--  fl_rectf(int(-r*0.7), int(-r*1.7), int(1.4*r), int(3.4*r));
--  fl_rectf(r-1, -1, 3, 3);
--  fl_color(FL_WHITE);
--  fl_pie(-r, -r, 2*r, 2*r, 0, 360);
--  fl_color(FL_BLACK);
--  fl_circle(0,0,r);
--  fl_xyline(0, 0, int(-r*.7));
--  fl_xyline(0, 0, 0, int(-r*.7));
--  fl_end_offscreen();
--  return (CGContextRef)off;
--}
-+  ret = i->set_cursor(c);
-+  if (ret)
-+    return;
- 
--CGContextRef Fl_X::nesw_cursor_image(void)
--{
--  int c = 7, r = 2*c;
--  int w = r, h = r;
--  Fl_Offscreen off = Fl_Quartz_Graphics_Driver::create_offscreen_with_alpha(w, h);
--  fl_begin_offscreen(off);
--  CGContextSetRGBFillColor( (CGContextRef)off, 0,0,0,0);
--  fl_rectf(0,0,w,h);
--  CGContextTranslateCTM( (CGContextRef)off, 0, h);
--  CGContextScaleCTM( (CGContextRef)off, 1, -1);
--  fl_color(FL_BLACK);
--  fl_polygon(0, 0, c, 0, 0, c);
--  fl_polygon(r, r, r, r-c, r-c, r);
--  fl_line_style(FL_SOLID, 2, 0);
--  fl_line(0,1, r,r+1);
--  fl_line_style(FL_SOLID, 0, 0);
--  fl_end_offscreen();
--  return (CGContextRef)off;
-+  fallback_cursor(this, c);
- }
- 
--CGContextRef Fl_X::nwse_cursor_image(void)
--{
--  int c = 7, r = 2*c;
--  int w = r, h = r;
--  Fl_Offscreen off = Fl_Quartz_Graphics_Driver::create_offscreen_with_alpha(w, h);
--  fl_begin_offscreen(off);
--  CGContextSetRGBFillColor( (CGContextRef)off, 0,0,0,0);
--  fl_rectf(0,0,w,h);
--  CGContextTranslateCTM( (CGContextRef)off, 0, h);
--  CGContextScaleCTM( (CGContextRef)off, 1, -1);
--  fl_color(FL_BLACK);
--  fl_polygon(r-1, 0, r-1, c, r-1-c, 0);
--  fl_polygon(-1, r, c-1, r, -1, r-c);
--  fl_line_style(FL_SOLID, 2, 0);
--  fl_line(r-1,1, -1,r+1);
--  fl_line_style(FL_SOLID, 0, 0);
--  fl_end_offscreen();
--  return (CGContextRef)off;
--}
--
--void Fl_Window::cursor(Fl_Cursor c, Fl_Color, Fl_Color) {
--  if (c == FL_CURSOR_DEFAULT) {
--    c = cursor_default;
--  }
--  if (i) i->set_cursor(c);
--}
-+/**
-+  Changes the cursor for this window.  This always calls the system, if
-+  you are changing the cursor a lot you may want to keep track of how
-+  you set it in a static variable and call this only if the new cursor
-+  is different.
- 
--#else
-+  The default cursor will be used if the provided image cannot be used
-+  as a cursor.
- 
--// I like the MSWindows resize cursors, so I duplicate them here:
-+  \see cursor(Fl_Cursor), default_cursor()
-+*/
-+void Fl_Window::cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
-+  int ret;
- 
--#define CURSORSIZE 16
--#define HOTXY 7
--static struct TableEntry {
--  uchar bits[CURSORSIZE*CURSORSIZE/8];
--  uchar mask[CURSORSIZE*CURSORSIZE/8];
--  Cursor cursor;
--} table[] = {
--  {{	// FL_CURSOR_NS
--   0x00, 0x00, 0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0x80, 0x01, 0x80, 0x01,
--   0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
--   0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01, 0x00, 0x00},
--   {
--   0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0xf0, 0x0f, 0xf0, 0x0f, 0xc0, 0x03,
--   0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xf0, 0x0f,
--   0xf0, 0x0f, 0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01}},
--  {{	// FL_CURSOR_EW
--   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10,
--   0x0c, 0x30, 0xfe, 0x7f, 0xfe, 0x7f, 0x0c, 0x30, 0x08, 0x10, 0x00, 0x00,
--   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
--   {
--   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x1c, 0x38,
--   0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0x1c, 0x38, 0x18, 0x18,
--   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
--  {{	// FL_CURSOR_NWSE
--   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x38, 0x00, 0x78, 0x00,
--   0xe8, 0x00, 0xc0, 0x01, 0x80, 0x03, 0x00, 0x17, 0x00, 0x1e, 0x00, 0x1c,
--   0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
--   {
--   0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x7c, 0x00, 0xfc, 0x00,
--   0xfc, 0x01, 0xec, 0x03, 0xc0, 0x37, 0x80, 0x3f, 0x00, 0x3f, 0x00, 0x3e,
--   0x00, 0x3f, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00}},
--  {{	// FL_CURSOR_NESW
--   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1c, 0x00, 0x1e,
--   0x00, 0x17, 0x80, 0x03, 0xc0, 0x01, 0xe8, 0x00, 0x78, 0x00, 0x38, 0x00,
--   0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
--   {
--   0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3e, 0x00, 0x3f,
--   0x80, 0x3f, 0xc0, 0x37, 0xec, 0x03, 0xfc, 0x01, 0xfc, 0x00, 0x7c, 0x00,
--   0xfc, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00}},
--  {{0}, {0}} // FL_CURSOR_NONE & unknown
--};
-+  // the cursor must be set for the top level window, not for subwindows
-+  Fl_Window *w = window(), *toplevel = this;
- 
--void Fl_Window::cursor(Fl_Cursor c, Fl_Color fg, Fl_Color bg) {
--  if (!shown()) return;
--  Cursor xc;
--  int deleteit = 0;
--  if (c == FL_CURSOR_DEFAULT) {
--    c  = cursor_default;
--    fg = cursor_fg;
--    bg = cursor_bg;
-+  while (w) {
-+    toplevel = w;
-+    w = w->window();
-   }
- 
--  if (!c) {
--    xc = None;
--  } else {
--    if (c >= FL_CURSOR_NS) {
--      TableEntry *q = (c > FL_CURSOR_NESW) ? table+4 : table+(c-FL_CURSOR_NS);
--      if (!(q->cursor)) {
--	XColor dummy = { 0 };
--	Pixmap p = XCreateBitmapFromData(fl_display,
--	  RootWindow(fl_display, fl_screen), (const char*)(q->bits),
--	  CURSORSIZE, CURSORSIZE);
--	Pixmap m = XCreateBitmapFromData(fl_display,
--	  RootWindow(fl_display, fl_screen), (const char*)(q->mask),
--	  CURSORSIZE, CURSORSIZE);
--	q->cursor = XCreatePixmapCursor(fl_display, p,m,&dummy, &dummy,
--					HOTXY, HOTXY);
--	XFreePixmap(fl_display, m);
--	XFreePixmap(fl_display, p);
--      }
--      xc = q->cursor;
--    } else {
--      xc = XCreateFontCursor(fl_display, (c-1)*2);
--      deleteit = 1;
--    }
--    XColor fgc;
--    uchar r,g,b;
--    Fl::get_color(fg,r,g,b);
--    fgc.red = r<<8; fgc.green = g<<8; fgc.blue = b<<8;
--    XColor bgc;
--    Fl::get_color(bg,r,g,b);
--    bgc.red = r<<8; bgc.green = g<<8; bgc.blue = b<<8;
--    XRecolorCursor(fl_display, xc, &fgc, &bgc);
-+  if (toplevel != this) {
-+    toplevel->cursor(image, hotx, hoty);
-+    return;
-   }
--  XDefineCursor(fl_display, fl_xid(this), xc);
--  if (deleteit) XFreeCursor(fl_display, xc);
-+
-+  if (!i)
-+    return;
-+
-+  ret = i->set_cursor(image, hotx, hoty);
-+  if (ret)
-+    return;
-+
-+  cursor(FL_CURSOR_DEFAULT);
- }
- 
--#endif
-+/* For back compatibility only. */
-+void Fl_Window::cursor(Fl_Cursor c, Fl_Color, Fl_Color) {
-+  cursor(c);
-+};
-+
-+void Fl_Window::default_cursor(Fl_Cursor c, Fl_Color, Fl_Color) {
-+  default_cursor(c);
-+};
-+
- 
- //
- // End of "$Id: fl_cursor.cxx 9278 2012-03-12 11:55:50Z manolo $".
-diff -up fltk-1.3.2/src/fl_cursor_help.xpm.cursor fltk-1.3.2/src/fl_cursor_help.xpm
---- fltk-1.3.2/src/fl_cursor_help.xpm.cursor	2013-01-30 16:07:59.534319820 +0100
-+++ fltk-1.3.2/src/fl_cursor_help.xpm	2013-01-30 16:07:59.534319820 +0100
-@@ -0,0 +1,95 @@
-+/* XPM */
-+static const char * fl_cursor_help_xpm[] = {
-+"16 27 65 1",
-+" 	c None",
-+".	c #FFFFFF",
-+"+	c #E2E2E2",
-+"@	c #1C1C1C",
-+"#	c #E7E7E7",
-+"$	c #000000",
-+"%	c #212121",
-+"&	c #EAEAEA",
-+"*	c #262626",
-+"=	c #EDEDED",
-+"-	c #2C2C2C",
-+";	c #F0F0F0",
-+">	c #333333",
-+",	c #F1F1F1",
-+"'	c #393939",
-+")	c #F3F3F3",
-+"!	c #404040",
-+"~	c #484848",
-+"{	c #F4F4F4",
-+"]	c #050505",
-+"^	c #202020",
-+"/	c #707070",
-+"(	c #F5F5F5",
-+"_	c #040404",
-+":	c #E1E1E1",
-+"<	c #EEEEEE",
-+"[	c #EFEFEF",
-+"}	c #FEFEFE",
-+"|	c #3D3D3D",
-+"1	c #7E7E7E",
-+"2	c #696969",
-+"3	c #414141",
-+"4	c #131313",
-+"5	c #080808",
-+"6	c #454545",
-+"7	c #F2F2F2",
-+"8	c #878787",
-+"9	c #7D7D7D",
-+"0	c #101010",
-+"a	c #111111",
-+"b	c #FDFDFD",
-+"c	c #8A8A8A",
-+"d	c #E6E6E6",
-+"e	c #7B7B7B",
-+"f	c #4C4C4C",
-+"g	c #5C5C5C",
-+"h	c #9F9F9F",
-+"i	c #F9F9F9",
-+"j	c #F7F7F7",
-+"k	c #B1B1B1",
-+"l	c #2E2E2E",
-+"m	c #767676",
-+"n	c #DCDCDC",
-+"o	c #DEDEDE",
-+"p	c #C7C7C7",
-+"q	c #1B1B1B",
-+"r	c #6B6B6B",
-+"s	c #575757",
-+"t	c #797979",
-+"u	c #020202",
-+"v	c #010101",
-+"w	c #FBFBFB",
-+"x	c #D7D7D7",
-+"y	c #D8D8D8",
-+"z	c #060606",
-+"                ",
-+".               ",
-+".+              ",
-+".@#             ",
-+".$%&            ",
-+".$$*=           ",
-+".$$$-;          ",
-+".$$$$>,         ",
-+".$$$$$')        ",
-+".$$$$$$!)       ",
-+".$$$$$$$~{      ",
-+".$$$$]^^^/(     ",
-+".$$$$_:(<<[}    ",
-+".$$|1$2<        ",
-+".$3,(45[        ",
-+".67 78$9,       ",
-+".7   {0a( ....  ",
-+"b    ,c5[defgh, ",
-+"      )ijk_la$m.",
-+"         no.p$q.",
-+"           .r$s.",
-+"          .t$-= ",
-+"          7uv+  ",
-+"          wxy.  ",
-+"          :$z.  ",
-+"          :$z.  ",
-+"          ....  "};
-diff -up fltk-1.3.2/src/fl_cursor_nesw.xpm.cursor fltk-1.3.2/src/fl_cursor_nesw.xpm
---- fltk-1.3.2/src/fl_cursor_nesw.xpm.cursor	2013-01-30 16:07:59.534319820 +0100
-+++ fltk-1.3.2/src/fl_cursor_nesw.xpm	2013-01-30 16:07:59.534319820 +0100
-@@ -0,0 +1,46 @@
-+/* XPM */
-+static const char * fl_cursor_nesw_xpm[] = {
-+"15 15 28 1",
-+" 	c None",
-+".	c #FFFFFF",
-+"+	c #767676",
-+"@	c #000000",
-+"#	c #4E4E4E",
-+"$	c #0C0C0C",
-+"%	c #494949",
-+"&	c #4D4D4D",
-+"*	c #1B1B1B",
-+"=	c #515151",
-+"-	c #646464",
-+";	c #363636",
-+">	c #6A6A6A",
-+",	c #545454",
-+"'	c #585858",
-+")	c #242424",
-+"!	c #797979",
-+"~	c #2E2E2E",
-+"{	c #444444",
-+"]	c #3B3B3B",
-+"^	c #0A0A0A",
-+"/	c #595959",
-+"(	c #F7F7F7",
-+"_	c #080808",
-+":	c #6B6B6B",
-+"<	c #FDFDFD",
-+"[	c #FCFCFC",
-+"}	c #FEFEFE",
-+"     ..........",
-+"      .+@@@@@@.",
-+"       .#@@@@@.",
-+"        .$@@@@.",
-+"       .%@@@@@.",
-+".     .&@@@*@@.",
-+"..   .=@@@-.;@.",
-+".>. .,@@@'. .).",
-+".@!.'@@@#.   ..",
-+".@@~@@@{.     .",
-+".@@@@@].       ",
-+".@@@@^.        ",
-+".@@@@@/(       ",
-+".______:(      ",
-+"<[[[[[[[[}     "};
-diff -up fltk-1.3.2/src/fl_cursor_none.xpm.cursor fltk-1.3.2/src/fl_cursor_none.xpm
---- fltk-1.3.2/src/fl_cursor_none.xpm.cursor	2013-01-30 16:07:59.534319820 +0100
-+++ fltk-1.3.2/src/fl_cursor_none.xpm	2013-01-30 16:07:59.534319820 +0100
-@@ -0,0 +1,19 @@
-+/* XPM */
-+static const char * fl_cursor_none_xpm[] = {
-+"15 15 1 1",
-+" 	c None",
-+"               ",
-+"               ",
-+"               ",
-+"               ",
-+"               ",
-+"               ",
-+"               ",
-+"               ",
-+"               ",
-+"               ",
-+"               ",
-+"               ",
-+"               ",
-+"               ",
-+"               "};
-diff -up fltk-1.3.2/src/fl_cursor_nwse.xpm.cursor fltk-1.3.2/src/fl_cursor_nwse.xpm
---- fltk-1.3.2/src/fl_cursor_nwse.xpm.cursor	2013-01-30 16:07:59.534319820 +0100
-+++ fltk-1.3.2/src/fl_cursor_nwse.xpm	2013-01-30 16:07:59.535319802 +0100
-@@ -0,0 +1,46 @@
-+/* XPM */
-+static const char * fl_cursor_nwse_xpm[] = {
-+"15 15 28 1",
-+" 	c None",
-+".	c #FFFFFF",
-+"+	c #000000",
-+"@	c #767676",
-+"#	c #4E4E4E",
-+"$	c #0C0C0C",
-+"%	c #494949",
-+"&	c #1B1B1B",
-+"*	c #4D4D4D",
-+"=	c #363636",
-+"-	c #646464",
-+";	c #515151",
-+">	c #242424",
-+",	c #585858",
-+"'	c #545454",
-+")	c #6A6A6A",
-+"!	c #797979",
-+"~	c #444444",
-+"{	c #2E2E2E",
-+"]	c #3B3B3B",
-+"^	c #0A0A0A",
-+"/	c #F7F7F7",
-+"(	c #595959",
-+"_	c #6B6B6B",
-+":	c #080808",
-+"<	c #FEFEFE",
-+"[	c #FCFCFC",
-+"}	c #FDFDFD",
-+"..........     ",
-+".++++++@.      ",
-+".+++++#.       ",
-+".++++$.        ",
-+".+++++%.       ",
-+".++&+++*.     .",
-+".+=.-+++;.   ..",
-+".>. .,+++'. .).",
-+"..   .#+++,.!+.",
-+".     .~+++{++.",
-+"       .]+++++.",
-+"        .^++++.",
-+"       /(+++++.",
-+"      /_::::::.",
-+"     <[[[[[[[[}"};
-diff -up fltk-1.3.2/src/fl_cursor_wait.xpm.cursor fltk-1.3.2/src/fl_cursor_wait.xpm
---- fltk-1.3.2/src/fl_cursor_wait.xpm.cursor	2013-01-30 16:07:59.535319802 +0100
-+++ fltk-1.3.2/src/fl_cursor_wait.xpm	2013-01-30 16:07:59.535319802 +0100
-@@ -0,0 +1,72 @@
-+/* XPM */
-+static const char * fl_cursor_wait_xpm[] = {
-+"17 32 37 1",
-+" 	c None",
-+".	c #FFFFFF",
-+"+	c #2E2E2E",
-+"@	c #202020",
-+"#	c #F1F1F1",
-+"$	c #2D2D2D",
-+"%	c #000000",
-+"&	c #EDEDED",
-+"*	c #585858",
-+"=	c #575757",
-+"-	c #FBFBFB",
-+";	c #848484",
-+">	c #B8B8B8",
-+",	c #E5E5E5",
-+"'	c #F7F7F7",
-+")	c #181818",
-+"!	c #F0F0F0",
-+"~	c #616161",
-+"{	c #B7B7B7",
-+"]	c #F5F5F5",
-+"^	c #050505",
-+"/	c #D4D4D4",
-+"(	c #EEEEEE",
-+"_	c #595959",
-+":	c #7B7B7B",
-+"<	c #E9E9E9",
-+"[	c #131313",
-+"}	c #E3E3E3",
-+"|	c #767676",
-+"1	c #505050",
-+"2	c #F3F3F3",
-+"3	c #2A2A2A",
-+"4	c #070707",
-+"5	c #343434",
-+"6	c #939393",
-+"7	c #191919",
-+"8	c #6A6A6A",
-+".................",
-+".+@@@@@@@@@@@@@+.",
-+".................",
-+" #$%%%%%%%%%%%$# ",
-+" &*%%%%%%%%%%%=& ",
-+" -;%%%%%%%%%%%;- ",
-+"  >%%%%%%%%%%%>  ",
-+"  ,%%%%%%%%%%%,  ",
-+"  ')%%%%%%%%%)'  ",
-+"  !~%%%%%%%%%~!  ",
-+"   {%%%%%%%%%{   ",
-+"   ]^/...../^]   ",
-+"   (_:.....:_(   ",
-+"    <[}...}[<    ",
-+"    !|1...1|!    ",
-+"     2[3.3[2     ",
-+"     2[%.%[2     ",
-+"    !|%%.%%|!    ",
-+"    <4%%.%%4<    ",
-+"   (_%%%.%%%_(   ",
-+"   ]^%%%.%%%^]   ",
-+"   {%%%%.%%%%{   ",
-+"  !~%%%%.%%%%~!  ",
-+"  ')%%%%.%%%%)'  ",
-+"  ,%%56{.{65%%,  ",
-+"  >%*.......*%>  ",
-+" -;7&.......&7;- ",
-+" &*8.........8=& ",
-+" #$%%%%%%%%%%%$# ",
-+".................",
-+".+@@@@@@@@@@@@@+.",
-+"................."};
-diff -up fltk-1.3.2/src/Fl_win32.cxx.cursor fltk-1.3.2/src/Fl_win32.cxx
---- fltk-1.3.2/src/Fl_win32.cxx.cursor	2013-01-30 16:07:59.519320086 +0100
-+++ fltk-1.3.2/src/Fl_win32.cxx	2013-01-30 16:07:59.536319784 +0100
-@@ -1633,7 +1633,6 @@ void fl_fix_focus(); // in Fl.cxx
- 
- char fl_show_iconic;	// hack for Fl_Window::iconic()
- // int fl_background_pixel = -1; // color to use for background
--HCURSOR fl_default_cursor;
- UINT fl_wake_msg = 0;
- int fl_disable_transient_for; // secret method of removing TRANSIENT_FOR
- 
-@@ -1682,7 +1681,7 @@ Fl_X* Fl_X::make(Fl_Window* w) {
-     if (!w->icon())
-       w->icon((void *)LoadIcon(NULL, IDI_APPLICATION));
-     wcw.hIcon = wcw.hIconSm = (HICON)w->icon();
--    wcw.hCursor = fl_default_cursor = LoadCursor(NULL, IDC_ARROW);
-+    wcw.hCursor = LoadCursor(NULL, IDC_ARROW);
-     //uchar r,g,b; Fl::get_color(FL_GRAY,r,g,b);
-     //wc.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(r,g,b));
-     wcw.hbrBackground = NULL;
-@@ -1774,7 +1773,8 @@ Fl_X* Fl_X::make(Fl_Window* w) {
-   x->setwindow(w);
-   x->region = 0;
-   x->private_dc = 0;
--  x->cursor = fl_default_cursor;
-+  x->cursor = LoadCursor(NULL, IDC_ARROW);
-+  x->custom_cursor = 0;
-   if (!fl_codepage) fl_get_codepage();
- 
-   WCHAR *lab = NULL;
-@@ -2025,6 +2025,153 @@ void Fl_Window::label(const char *name,c
- }
- 
- ////////////////////////////////////////////////////////////////
-+
-+#ifndef IDC_HAND
-+#  define IDC_HAND  MAKEINTRESOURCE(32649)
-+#endif // !IDC_HAND
-+
-+int Fl_X::set_cursor(Fl_Cursor c) {
-+  LPSTR n;
-+  HCURSOR new_cursor;
-+
-+  if (c == FL_CURSOR_NONE)
-+    new_cursor = NULL;
-+  else {
-+    switch (c) {
-+    case FL_CURSOR_ARROW:   n = IDC_ARROW; break;
-+    case FL_CURSOR_CROSS:   n = IDC_CROSS; break;
-+    case FL_CURSOR_WAIT:    n = IDC_WAIT; break;
-+    case FL_CURSOR_INSERT:  n = IDC_IBEAM; break;
-+    case FL_CURSOR_HAND:    n = IDC_HAND; break;
-+    case FL_CURSOR_HELP:    n = IDC_HELP; break;
-+    case FL_CURSOR_MOVE:    n = IDC_SIZEALL; break;
-+    case FL_CURSOR_N:
-+    case FL_CURSOR_S:
-+      // FIXME: Should probably have fallbacks for these instead
-+    case FL_CURSOR_NS:      n = IDC_SIZENS; break;
-+    case FL_CURSOR_NE:
-+    case FL_CURSOR_SW:
-+      // FIXME: Dito.
-+    case FL_CURSOR_NESW:    n = IDC_SIZENESW; break;
-+    case FL_CURSOR_E:
-+    case FL_CURSOR_W:
-+      // FIXME: Dito.
-+    case FL_CURSOR_WE:      n = IDC_SIZEWE; break;
-+    case FL_CURSOR_SE:
-+    case FL_CURSOR_NW:
-+      // FIXME: Dito.
-+    case FL_CURSOR_NWSE:    n = IDC_SIZENWSE; break;
-+    default:
-+      return 0;
-+    }
-+
-+    new_cursor = LoadCursor(NULL, n);
-+    if (new_cursor == NULL)
-+      return 0;
-+  }
-+
-+  if ((cursor != NULL) && custom_cursor)
-+    DestroyIcon(cursor);
-+
-+  cursor = new_cursor;
-+  custom_cursor = 0;
-+
-+  SetCursor(cursor);
-+
-+  return 1;
-+}
-+
-+int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
-+  BITMAPV5HEADER bi;
-+  HBITMAP bitmap, mask;
-+  DWORD *bits;
-+  HCURSOR new_cursor;
-+
-+  if ((hotx < 0) || (hotx >= image->w()))
-+    return 0;
-+  if ((hoty < 0) || (hoty >= image->h()))
-+    return 0;
-+
-+  memset(&bi, 0, sizeof(BITMAPV5HEADER));
-+
-+  bi.bV5Size        = sizeof(BITMAPV5HEADER);
-+  bi.bV5Width       = image->w();
-+  bi.bV5Height      = -image->h(); // Negative for top-down
-+  bi.bV5Planes      = 1;
-+  bi.bV5BitCount    = 32;
-+  bi.bV5Compression = BI_BITFIELDS;
-+  bi.bV5RedMask     = 0x00FF0000;
-+  bi.bV5GreenMask   = 0x0000FF00;
-+  bi.bV5BlueMask    = 0x000000FF;
-+  bi.bV5AlphaMask   = 0xFF000000;
-+
-+  HDC hdc;
-+
-+  hdc = GetDC(NULL);
-+  bitmap = CreateDIBSection(hdc, (BITMAPINFO*)&bi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
-+  ReleaseDC(NULL, hdc);
-+
-+  if (bits == NULL)
-+    return 0;
-+
-+  const uchar *i = (const uchar*)*image->data();
-+  for (int y = 0;y < image->h();y++) {
-+    for (int x = 0;x < image->w();x++) {
-+      switch (image->d()) {
-+      case 1:
-+        *bits = (0xff<<24) | (i[0]<<16) | (i[0]<<8) | i[0];
-+        break;
-+      case 2:
-+        *bits = (i[1]<<24) | (i[0]<<16) | (i[0]<<8) | i[0];
-+        break;
-+      case 3:
-+        *bits = (0xff<<24) | (i[0]<<16) | (i[1]<<8) | i[2];
-+        break;
-+      case 4:
-+        *bits = (i[3]<<24) | (i[0]<<16) | (i[1]<<8) | i[2];
-+        break;
-+      }
-+      i += image->d();
-+      bits++;
-+    }
-+    i += image->ld();
-+  }
-+
-+  // A mask bitmap is still needed even though it isn't used
-+  mask = CreateBitmap(image->w(),image->h(),1,1,NULL);
-+  if (mask == NULL) {
-+    DeleteObject(bitmap);
-+    return 0;
-+  }
-+
-+  ICONINFO ii;
-+
-+  ii.fIcon    = FALSE;
-+  ii.xHotspot = hotx;
-+  ii.yHotspot = hoty;
-+  ii.hbmMask  = mask;
-+  ii.hbmColor = bitmap;
-+
-+  new_cursor = CreateIconIndirect(&ii);
-+
-+  DeleteObject(bitmap);
-+  DeleteObject(mask);
-+
-+  if (new_cursor == NULL)
-+    return 0;
-+
-+  if ((cursor != NULL) && custom_cursor)
-+    DestroyIcon(cursor);
-+
-+  cursor = new_cursor;
-+  custom_cursor = 1;
-+
-+  SetCursor(cursor);
-+
-+  return 1;
-+}
-+
-+////////////////////////////////////////////////////////////////
- // Implement the virtual functions for the base Fl_Window class:
- 
- // If the box is a filled rectangle, we can make the redisplay *look*
-diff -up fltk-1.3.2/src/Fl_Window.cxx.cursor fltk-1.3.2/src/Fl_Window.cxx
---- fltk-1.3.2/src/Fl_Window.cxx.cursor	2012-11-06 21:46:14.000000000 +0100
-+++ fltk-1.3.2/src/Fl_Window.cxx	2013-01-30 16:07:59.536319784 +0100
-@@ -62,8 +62,6 @@ void Fl_Window::_Fl_Window() {
- Fl_Window::Fl_Window(int X,int Y,int W, int H, const char *l)
- : Fl_Group(X, Y, W, H, l) {
-   cursor_default = FL_CURSOR_DEFAULT;
--  cursor_fg      = FL_BLACK;
--  cursor_bg      = FL_WHITE;
- 
-   _Fl_Window();
-   set_flag(FORCE_POSITION);
-@@ -73,8 +71,6 @@ Fl_Window::Fl_Window(int W, int H, const
- // fix common user error of a missing end() with current(0):
-   : Fl_Group((Fl_Group::current(0),0), 0, W, H, l) {
-   cursor_default = FL_CURSOR_DEFAULT;
--  cursor_fg      = FL_BLACK;
--  cursor_bg      = FL_WHITE;
- 
-   _Fl_Window();
-   clear_visible();
-diff -up fltk-1.3.2/src/Fl_x.cxx.cursor fltk-1.3.2/src/Fl_x.cxx
---- fltk-1.3.2/src/Fl_x.cxx.cursor	2013-01-30 16:07:59.512320211 +0100
-+++ fltk-1.3.2/src/Fl_x.cxx	2013-01-30 16:07:59.537319766 +0100
-@@ -59,6 +59,11 @@ static int xfixes_event_base = 0;
- static bool have_xfixes = false;
- #  endif
- 
-+#  include <X11/cursorfont.h>
-+
-+#  if HAVE_XCURSOR
-+#    include <X11/Xcursor/Xcursor.h>
-+#  endif
- static Fl_Xlib_Graphics_Driver fl_xlib_driver;
- static Fl_Display_Device fl_xlib_display(&fl_xlib_driver);
- Fl_Display_Device *Fl_Display_Device::_display = &fl_xlib_display;// the platform display
-@@ -2259,6 +2264,94 @@ void Fl_Window::size_range_() {
- }
- 
- ////////////////////////////////////////////////////////////////
-+
-+int Fl_X::set_cursor(Fl_Cursor c) {
-+  unsigned int shape;
-+  Cursor xc;
-+
-+  switch (c) {
-+  case FL_CURSOR_ARROW:   shape = XC_left_ptr; break;
-+  case FL_CURSOR_CROSS:   shape = XC_tcross; break;
-+  case FL_CURSOR_WAIT:    shape = XC_watch; break;
-+  case FL_CURSOR_INSERT:  shape = XC_xterm; break;
-+  case FL_CURSOR_HAND:    shape = XC_hand2; break;
-+  case FL_CURSOR_HELP:    shape = XC_question_arrow; break;
-+  case FL_CURSOR_MOVE:    shape = XC_fleur; break;
-+  case FL_CURSOR_NS:      shape = XC_sb_v_double_arrow; break;
-+  case FL_CURSOR_WE:      shape = XC_sb_h_double_arrow; break;
-+  case FL_CURSOR_NE:      shape = XC_top_right_corner; break;
-+  case FL_CURSOR_N:       shape = XC_top_side; break;
-+  case FL_CURSOR_NW:      shape = XC_top_left_corner; break;
-+  case FL_CURSOR_E:       shape = XC_right_side; break;
-+  case FL_CURSOR_W:       shape = XC_left_side; break;
-+  case FL_CURSOR_SE:      shape = XC_bottom_right_corner; break;
-+  case FL_CURSOR_S:       shape = XC_bottom_side; break;
-+  case FL_CURSOR_SW:      shape = XC_bottom_left_corner; break;
-+  default:
-+    return 0;
-+  }
-+
-+  xc = XCreateFontCursor(fl_display, shape);
-+  XDefineCursor(fl_display, xid, xc);
-+  XFreeCursor(fl_display, xc);
-+
-+  return 1;
-+}
-+
-+int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
-+#if ! HAVE_XCURSOR
-+  return 0;
-+#else
-+  XcursorImage *cursor;
-+  Cursor xc;
-+
-+  if ((hotx < 0) || (hotx >= image->w()))
-+    return 0;
-+  if ((hoty < 0) || (hoty >= image->h()))
-+    return 0;
-+
-+  cursor = XcursorImageCreate(image->w(), image->h());
-+  if (!cursor)
-+    return 0;
-+
-+  const uchar *i = (const uchar*)*image->data();
-+  XcursorPixel *o = cursor->pixels;
-+  for (int y = 0;y < image->h();y++) {
-+    for (int x = 0;x < image->w();x++) {
-+      switch (image->d()) {
-+      case 1:
-+        *o = (0xff<<24) | (i[0]<<16) | (i[0]<<8) | i[0];
-+        break;
-+      case 2:
-+        *o = (i[1]<<24) | (i[0]<<16) | (i[0]<<8) | i[0];
-+        break;
-+      case 3:
-+        *o = (0xff<<24) | (i[0]<<16) | (i[1]<<8) | i[2];
-+        break;
-+      case 4:
-+        *o = (i[3]<<24) | (i[0]<<16) | (i[1]<<8) | i[2];
-+        break;
-+      }
-+      i += image->d();
-+      o++;
-+    }
-+    i += image->ld();
-+  }
-+
-+  cursor->xhot = hotx;
-+  cursor->yhot = hoty;
-+
-+  xc = XcursorImageLoadCursor(fl_display, cursor);
-+  XDefineCursor(fl_display, xid, xc);
-+  XFreeCursor(fl_display, xc);
-+
-+  XcursorImageDestroy(cursor);
-+
-+  return 1;
-+#endif
-+}
-+
-+////////////////////////////////////////////////////////////////
- 
- // returns pointer to the filename, or null if name ends with '/'
- const char *fl_filename_name(const char *name) {
-diff -up fltk-1.3.2/test/cursor.cxx.cursor fltk-1.3.2/test/cursor.cxx
---- fltk-1.3.2/test/cursor.cxx.cursor	2011-07-19 06:49:30.000000000 +0200
-+++ fltk-1.3.2/test/cursor.cxx	2013-01-30 16:07:59.537319766 +0100
-@@ -23,8 +23,6 @@
- #include <FL/fl_draw.H>
- #include <FL/Fl_Box.H>
- 
--Fl_Color fg = FL_BLACK;
--Fl_Color bg = FL_WHITE;
- Fl_Cursor cursor = FL_CURSOR_DEFAULT;
- 
- Fl_Hor_Value_Slider *cursor_slider;
-@@ -32,7 +30,7 @@ Fl_Hor_Value_Slider *cursor_slider;
- void choice_cb(Fl_Widget *, void *v) {
-   cursor = (Fl_Cursor)(fl_intptr_t)v;
-   cursor_slider->value(cursor);
--  fl_cursor(cursor,fg,bg);
-+  fl_cursor(cursor);
- }
- 
- Fl_Menu_Item choices[] = {
-@@ -48,8 +46,6 @@ Fl_Menu_Item choices[] = {
-   {"FL_CURSOR_WE",0,choice_cb,(void*)FL_CURSOR_WE},
-   {"FL_CURSOR_NWSE",0,choice_cb,(void*)FL_CURSOR_NWSE},
-   {"FL_CURSOR_NESW",0,choice_cb,(void*)FL_CURSOR_NESW},
--  {"FL_CURSOR_NONE",0,choice_cb,(void*)FL_CURSOR_NONE},
--#if 0
-   {"FL_CURSOR_N",0,choice_cb,(void*)FL_CURSOR_N},
-   {"FL_CURSOR_NE",0,choice_cb,(void*)FL_CURSOR_NE},
-   {"FL_CURSOR_E",0,choice_cb,(void*)FL_CURSOR_E},
-@@ -58,26 +54,14 @@ Fl_Menu_Item choices[] = {
-   {"FL_CURSOR_SW",0,choice_cb,(void*)FL_CURSOR_SW},
-   {"FL_CURSOR_W",0,choice_cb,(void*)FL_CURSOR_W},
-   {"FL_CURSOR_NW",0,choice_cb,(void*)FL_CURSOR_NW},
--#endif
-+  {"FL_CURSOR_NONE",0,choice_cb,(void*)FL_CURSOR_NONE},
-   {0}
- };
- 
- void setcursor(Fl_Widget *o, void *) {
-   Fl_Hor_Value_Slider *slider = (Fl_Hor_Value_Slider *)o;
-   cursor = Fl_Cursor((int)slider->value());
--  fl_cursor(cursor,fg,bg);
--}
--
--void setfg(Fl_Widget *o, void *) {
--  Fl_Hor_Value_Slider *slider = (Fl_Hor_Value_Slider *)o;
--  fg = Fl_Color((int)slider->value());
--  fl_cursor(cursor,fg,bg);
--}
--
--void setbg(Fl_Widget *o, void *) {
--  Fl_Hor_Value_Slider *slider = (Fl_Hor_Value_Slider *)o;
--  bg = Fl_Color((int)slider->value());
--  fl_cursor(cursor,fg,bg);
-+  fl_cursor(cursor);
- }
- 
- // draw the label without any ^C or \nnn conversions:
-@@ -103,29 +87,11 @@ int main(int argc, char **argv) {
-   slider1.align(FL_ALIGN_LEFT);
-   slider1.step(1);
-   slider1.precision(0);
--  slider1.bounds(0,100);
-+  slider1.bounds(0,255);
-   slider1.value(0);
-   slider1.callback(setcursor);
-   slider1.value(cursor);
- 
--  Fl_Hor_Value_Slider slider2(80,220,310,30,"fgcolor:");
--  slider2.align(FL_ALIGN_LEFT);
--  slider2.step(1);
--  slider2.precision(0);
--  slider2.bounds(0,255);
--  slider2.value(0);
--  slider2.callback(setfg);
--  slider2.value(fg);
--
--  Fl_Hor_Value_Slider slider3(80,260,310,30,"bgcolor:");
--  slider3.align(FL_ALIGN_LEFT);
--  slider3.step(1);
--  slider3.precision(0);
--  slider3.bounds(0,255);
--  slider3.value(0);
--  slider3.callback(setbg);
--  slider3.value(bg);
--
- #if 0
-   // draw the manual's diagram of cursors...
-   window.size(400,800);
diff --git a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v6.3.x-clipboard-x11.patch b/contrib/packages/rpm/sle11/SOURCES/fltk-1_v6.3.x-clipboard-x11.patch
deleted file mode 100644
index 9e253a3..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v6.3.x-clipboard-x11.patch
+++ /dev/null
@@ -1,355 +0,0 @@
-diff -up fltk-1.3.2/CMakeLists.txt.clp-x11 fltk-1.3.2/CMakeLists.txt
---- fltk-1.3.2/CMakeLists.txt.clp-x11	2012-09-13 16:19:01.000000000 +0200
-+++ fltk-1.3.2/CMakeLists.txt	2013-01-30 15:56:25.810663430 +0100
-@@ -515,6 +515,20 @@ else()
- endif(OPTION_USE_XINERAMA)
- 
- #######################################################################
-+if(X11_Xfixes_FOUND)
-+   option(OPTION_USE_XFIXES "use lib XFIXES" ON)
-+endif(X11_Xfixes_FOUND)
-+
-+if(OPTION_USE_XFIXES)
-+   set(HAVE_XFIXES ${X11_Xfixes_FOUND})
-+   include_directories(${X11_Xfixes_INCLUDE_PATH})
-+   list(APPEND FLTK_LDLIBS -lXfixes)
-+   set(FLTK_XFIXES_FOUND TRUE)
-+else()
-+   set(FLTK_XFIXES_FOUND FALSE)
-+endif(OPTION_USE_XFIXES)
-+
-+#######################################################################
- if(X11_Xft_FOUND)
-    option(OPTION_USE_XFT "use lib Xft" ON)
- endif(X11_Xft_FOUND)
-diff -up fltk-1.3.2/configh.cmake.in.clp-x11 fltk-1.3.2/configh.cmake.in
---- fltk-1.3.2/configh.cmake.in.clp-x11	2011-07-19 06:49:30.000000000 +0200
-+++ fltk-1.3.2/configh.cmake.in	2013-01-30 15:56:25.810663430 +0100
-@@ -108,6 +108,14 @@
- #define USE_XDBE HAVE_XDBE
- 
- /*
-+ * HAVE_XFIXES:
-+ *
-+ * Do we have the X fixes extension?
-+ */
-+
-+#cmakedefine01 HAVE_XFIXES
-+
-+/*
-  * __APPLE_QUARTZ__:
-  *
-  * If __APPLE_QUARTZ__ is defined, FLTK will be
-diff -up fltk-1.3.2/configh.in.clp-x11 fltk-1.3.2/configh.in
---- fltk-1.3.2/configh.in.clp-x11	2011-10-04 11:21:47.000000000 +0200
-+++ fltk-1.3.2/configh.in	2013-01-30 15:56:25.810663430 +0100
-@@ -108,6 +108,14 @@
- #define USE_XDBE HAVE_XDBE
- 
- /*
-+ * HAVE_XFIXES:
-+ *
-+ * Do we have the X fixes extension?
-+ */
-+
-+#define HAVE_XFIXES 0
-+
-+/*
-  * __APPLE_QUARTZ__:
-  *
-  * All Apple implementations are now based on Quartz and Cocoa,
-diff -up fltk-1.3.2/configure.in.clp-x11 fltk-1.3.2/configure.in
---- fltk-1.3.2/configure.in.clp-x11	2013-01-30 15:56:25.802663573 +0100
-+++ fltk-1.3.2/configure.in	2013-01-30 15:56:25.810663430 +0100
-@@ -999,6 +999,16 @@ case $uname_GUI in
- 		LIBS="-lXext $LIBS")
- 	fi
- 
-+	dnl Check for the Xfixes extension unless disabled...
-+        AC_ARG_ENABLE(xfixes, [  --enable-xfixes       turn on Xfixes support [default=yes]])
-+
-+	if test x$enable_xfixes != xno; then
-+	    AC_CHECK_HEADER(X11/extensions/Xfixes.h, AC_DEFINE(HAVE_XFIXES),,
-+	        [#include <X11/Xlib.h>])
-+	    AC_CHECK_LIB(Xfixes, XFixesQueryExtension,
-+		LIBS="-lXfixes $LIBS")
-+	fi
-+
- 	dnl Check for overlay visuals...
- 	AC_PATH_PROG(XPROP, xprop)
- 	AC_CACHE_CHECK(for X overlay visuals, ac_cv_have_overlay,
-diff -up fltk-1.3.2/fluid/CMakeLists.txt.clp-x11 fltk-1.3.2/fluid/CMakeLists.txt
-diff -up fltk-1.3.2/src/CMakeLists.txt.clp-x11 fltk-1.3.2/src/CMakeLists.txt
---- fltk-1.3.2/src/CMakeLists.txt.clp-x11	2013-01-30 16:06:00.785430590 +0100
-+++ fltk-1.3.2/src/CMakeLists.txt	2013-01-30 16:06:17.883126642 +0100
-@@ -243,6 +243,10 @@ if(HAVE_XINERAMA)
-    target_link_libraries(fltk ${X11_Xinerama_LIB})
- endif(HAVE_XINERAMA)
- 
-+if(HAVE_XFIXES)
-+   target_link_libraries(fltk ${X11_Xfixes_LIB})
-+endif(HAVE_XFIXES)
-+
- if(USE_XFT)
-    target_link_libraries(fltk ${X11_Xft_LIB})
- endif(USE_XFT)
-diff -up fltk-1.3.2/src/Fl_x.cxx.clp-x11 fltk-1.3.2/src/Fl_x.cxx
---- fltk-1.3.2/src/Fl_x.cxx.clp-x11	2013-01-30 15:56:25.793663733 +0100
-+++ fltk-1.3.2/src/Fl_x.cxx	2013-01-30 16:03:37.355981103 +0100
-@@ -53,6 +53,12 @@ static XRRUpdateConfiguration_type XRRUp
- static int randrEventBase;                  // base of RandR-defined events
- #endif
- 
-+#  if HAVE_XFIXES
-+#  include <X11/extensions/Xfixes.h>
-+static int xfixes_event_base = 0;
-+static bool have_xfixes = false;
-+#  endif
-+
- static Fl_Xlib_Graphics_Driver fl_xlib_driver;
- static Fl_Display_Device fl_xlib_display(&fl_xlib_driver);
- Fl_Display_Device *Fl_Display_Device::_display = &fl_xlib_display;// the platform display
-@@ -307,6 +313,9 @@ static Atom WM_PROTOCOLS;
- static Atom fl_MOTIF_WM_HINTS;
- static Atom TARGETS;
- static Atom CLIPBOARD;
-+static Atom TIMESTAMP;
-+static Atom PRIMARY_TIMESTAMP;
-+static Atom CLIPBOARD_TIMESTAMP;
- Atom fl_XdndAware;
- Atom fl_XdndSelection;
- Atom fl_XdndEnter;
-@@ -667,6 +676,9 @@ void fl_open_display(Display* d) {
-   fl_MOTIF_WM_HINTS     = XInternAtom(d, "_MOTIF_WM_HINTS",     0);
-   TARGETS               = XInternAtom(d, "TARGETS",             0);
-   CLIPBOARD             = XInternAtom(d, "CLIPBOARD",           0);
-+  TIMESTAMP             = XInternAtom(d, "TIMESTAMP",           0);
-+  PRIMARY_TIMESTAMP     = XInternAtom(d, "PRIMARY_TIMESTAMP",   0);
-+  CLIPBOARD_TIMESTAMP   = XInternAtom(d, "CLIPBOARD_TIMESTAMP", 0);
-   fl_XdndAware          = XInternAtom(d, "XdndAware",           0);
-   fl_XdndSelection      = XInternAtom(d, "XdndSelection",       0);
-   fl_XdndEnter          = XInternAtom(d, "XdndEnter",           0);
-@@ -713,6 +725,15 @@ void fl_open_display(Display* d) {
- #if !USE_COLORMAP
-   Fl::visual(FL_RGB);
- #endif
-+
-+#if HAVE_XFIXES
-+  int error_base;
-+  if (XFixesQueryExtension(fl_display, &xfixes_event_base, &error_base))
-+    have_xfixes = true;
-+  else
-+    have_xfixes = false;
-+#endif
-+
- #if USE_XRANDR
-   void *libxrandr_addr = dlopen("libXrandr.so.2", RTLD_LAZY);
-   if (!libxrandr_addr)  libxrandr_addr = dlopen("libXrandr.so", RTLD_LAZY);
-@@ -901,6 +922,107 @@ void Fl::copy(const char *stuff, int len
- }
- 
- ////////////////////////////////////////////////////////////////
-+// Code for tracking clipboard changes:
-+
-+static Time primary_timestamp = -1;
-+static Time clipboard_timestamp = -1;
-+
-+extern bool fl_clipboard_notify_empty(void);
-+extern void fl_trigger_clipboard_notify(int source);
-+
-+static void poll_clipboard_owner(void) {
-+  Window xid;
-+
-+#if HAVE_XFIXES
-+  // No polling needed with Xfixes
-+  if (have_xfixes)
-+    return;
-+#endif
-+
-+  // No one is interested, so no point polling
-+  if (fl_clipboard_notify_empty())
-+    return;
-+
-+  // We need a window for this to work
-+  if (!Fl::first_window())
-+    return;
-+  xid = fl_xid(Fl::first_window());
-+  if (!xid)
-+    return;
-+
-+  // Request an update of the selection time for both the primary and
-+  // clipboard selections. Magic continues when we get a SelectionNotify.
-+  if (!fl_i_own_selection[0])
-+    XConvertSelection(fl_display, XA_PRIMARY, TIMESTAMP, PRIMARY_TIMESTAMP,
-+                      xid, fl_event_time);
-+  if (!fl_i_own_selection[1])
-+    XConvertSelection(fl_display, CLIPBOARD, TIMESTAMP, CLIPBOARD_TIMESTAMP,
-+                      xid, fl_event_time);
-+}
-+
-+static void clipboard_timeout(void *data)
-+{
-+  // No one is interested, so stop polling
-+  if (fl_clipboard_notify_empty())
-+    return;
-+
-+  poll_clipboard_owner();
-+
-+  Fl::repeat_timeout(0.5, clipboard_timeout);
-+}
-+
-+static void handle_clipboard_timestamp(int clipboard, Time time)
-+{
-+  Time *timestamp;
-+
-+  timestamp = clipboard ? &clipboard_timestamp : &primary_timestamp;
-+
-+#if HAVE_XFIXES
-+  if (!have_xfixes)
-+#endif
-+  {
-+    // Initial scan, just store the value
-+    if (*timestamp == (Time)-1) {
-+      *timestamp = time;
-+      return;
-+    }
-+  }
-+
-+  // Same selection
-+  if (time == *timestamp)
-+    return;
-+
-+  *timestamp = time;
-+
-+  // The clipboard change is the event that caused us to request
-+  // the clipboard data, so use that time as the latest event.
-+  if (time > fl_event_time)
-+    fl_event_time = time;
-+
-+  // Something happened! Let's tell someone!
-+  fl_trigger_clipboard_notify(clipboard);
-+}
-+
-+void fl_clipboard_notify_change() {
-+  // Reset the timestamps if we've going idle so that you don't
-+  // get a bogus immediate trigger next time they're activated.
-+  if (fl_clipboard_notify_empty()) {
-+    primary_timestamp = -1;
-+    clipboard_timestamp = -1;
-+  } else {
-+#if HAVE_XFIXES
-+    if (!have_xfixes)
-+#endif
-+    {
-+      poll_clipboard_owner();
-+
-+      if (!Fl::has_timeout(clipboard_timeout))
-+        Fl::add_timeout(0.5, clipboard_timeout);
-+    }
-+  }
-+}
-+
-+////////////////////////////////////////////////////////////////
- 
- const XEvent* fl_xevent; // the current x event
- ulong fl_event_time; // the last timestamp from an x event
-@@ -1024,7 +1141,6 @@ int fl_handle(const XEvent& thisevent)
-     return 0;
- 
-   case SelectionNotify: {
--    if (!fl_selection_requestor) return 0;
-     static unsigned char* buffer = 0;
-     if (buffer) {XFree(buffer); buffer = 0;}
-     long bytesread = 0;
-@@ -1040,6 +1156,19 @@ int fl_handle(const XEvent& thisevent)
-                              bytesread/4, 65536, 1, 0,
-                              &actual, &format, &count, &remaining,
-                              &portion)) break; // quit on error
-+
-+      if ((fl_xevent->xselection.property == PRIMARY_TIMESTAMP) ||
-+          (fl_xevent->xselection.property == CLIPBOARD_TIMESTAMP)) {
-+        if (portion && format == 32 && count == 1) {
-+          Time t = *(unsigned int*)portion;
-+          if (fl_xevent->xselection.property == CLIPBOARD_TIMESTAMP)
-+            handle_clipboard_timestamp(1, t);
-+          else
-+            handle_clipboard_timestamp(0, t);
-+        }
-+        return true;
-+      }
-+
-       if (actual == TARGETS || actual == XA_ATOM) {
- 	Atom type = XA_STRING;
- 	for (unsigned i = 0; i<count; i++) {
-@@ -1076,6 +1205,9 @@ int fl_handle(const XEvent& thisevent)
-       buffer[bytesread] = 0;
-       convert_crlf(buffer, bytesread);
-     }
-+
-+    if (!fl_selection_requestor) return 0;
-+
-     Fl::e_text = buffer ? (char*)buffer : (char *)"";
-     Fl::e_length = bytesread;
-     int old_event = Fl::e_number;
-@@ -1096,6 +1228,7 @@ int fl_handle(const XEvent& thisevent)
-   case SelectionClear: {
-     int clipboard = fl_xevent->xselectionclear.selection == CLIPBOARD;
-     fl_i_own_selection[clipboard] = 0;
-+    poll_clipboard_owner();
-     return 1;}
- 
-   case SelectionRequest: {
-@@ -1308,6 +1441,9 @@ int fl_handle(const XEvent& thisevent)
-   case FocusIn:
-     if (fl_xim_ic) XSetICFocus(fl_xim_ic);
-     event = FL_FOCUS;
-+    // If the user has toggled from another application to this one,
-+    // then it's a good time to check for clipboard changes.
-+    poll_clipboard_owner();
-     break;
- 
-   case FocusOut:
-@@ -1676,6 +1812,25 @@ int fl_handle(const XEvent& thisevent)
-     }
-   }
- 
-+#if HAVE_XFIXES
-+  switch (xevent.type - xfixes_event_base) {
-+  case XFixesSelectionNotify: {
-+    // Someone feeding us bogus events?
-+    if (!have_xfixes)
-+      return true;
-+
-+    XFixesSelectionNotifyEvent *selection_notify = (XFixesSelectionNotifyEvent *)&xevent;
-+
-+    if ((selection_notify->selection == XA_PRIMARY) && !fl_i_own_selection[0])
-+      handle_clipboard_timestamp(0, selection_notify->selection_timestamp);
-+    else if ((selection_notify->selection == CLIPBOARD) && !fl_i_own_selection[1])
-+      handle_clipboard_timestamp(1, selection_notify->selection_timestamp);
-+
-+    return true;
-+    }
-+  }
-+#endif
-+
-   return Fl::handle(event, window);
- }
- 
-@@ -1995,6 +2150,16 @@ void Fl_X::make_xid(Fl_Window* win, XVis
-     XChangeProperty(fl_display, xp->xid, net_wm_type, XA_ATOM, 32, PropModeReplace, (unsigned char*)&net_wm_type_kind, 1);
-   }
- 
-+#if HAVE_XFIXES
-+  // register for clipboard change notifications
-+  if (have_xfixes && !win->parent()) {
-+    XFixesSelectSelectionInput(fl_display, xp->xid, XA_PRIMARY,
-+                               XFixesSetSelectionOwnerNotifyMask);
-+    XFixesSelectSelectionInput(fl_display, xp->xid, CLIPBOARD,
-+                               XFixesSetSelectionOwnerNotifyMask);
-+  }
-+#endif
-+
-   XMapWindow(fl_display, xp->xid);
-   if (showit) {
-     win->set_visible();
-diff -up fltk-1.3.2/test/CMakeLists.txt.clp-x11 fltk-1.3.2/test/CMakeLists.txt
diff --git a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v6.3.x-keyboard-osx.patch b/contrib/packages/rpm/sle11/SOURCES/fltk-1_v6.3.x-keyboard-osx.patch
deleted file mode 100644
index cf13aad..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/fltk-1_v6.3.x-keyboard-osx.patch
+++ /dev/null
@@ -1,375 +0,0 @@
-diff -ur fltk-1.3.0r9619.org/configure.in fltk-1.3.0r9619/configure.in
---- fltk-1.3.0r9619.org/configure.in	2012-04-22 04:45:09.000000000 +0200
-+++ fltk-1.3.0r9619/configure.in	2012-06-18 13:47:33.290447462 +0200
-@@ -865,6 +865,8 @@
-     Darwin*)
-         # MacOS X uses Cocoa for graphics.
-         LIBS="$LIBS -framework Cocoa"
-+        # And some Carbon for keyboard handling
-+        LIBS="$LIBS -framework Carbon"
- 
- 	if test x$have_pthread = xyes; then
- 	    AC_DEFINE(HAVE_PTHREAD)
-diff -ur fltk-1.3.0r9619.org/src/Fl_cocoa.mm fltk-1.3.0r9619/src/Fl_cocoa.mm
---- fltk-1.3.0r9619.org/src/Fl_cocoa.mm	2012-06-16 10:49:52.000000000 +0200
-+++ fltk-1.3.0r9619/src/Fl_cocoa.mm	2012-06-18 13:47:42.944910782 +0200
-@@ -53,6 +53,7 @@
- #include <math.h>
- 
- #import <Cocoa/Cocoa.h>
-+#import <Carbon/Carbon.h>
- 
- #ifndef NSINTEGER_DEFINED // appears with 10.5 in NSObjCRuntime.h
- #if defined(__LP64__) && __LP64__
-@@ -114,6 +115,8 @@
- extern Fl_Window* fl_xmousewin;
- #endif
- 
-+bool use_simple_keyboard = false;
-+
- enum { FLTKTimerEvent = 1, FLTKDataReadyEvent };
- 
- 
-@@ -130,6 +133,39 @@
- {
- }
- 
-+// Undocumented voodoo. Taken from Mozilla.
-+#define ENABLE_ROMAN_KYBDS_ONLY -23
-+
-+void fl_update_focus(void)
-+{
-+  Fl_Widget *focus;
-+
-+  focus = Fl::grab();
-+  if (!focus)
-+    focus = Fl::focus();
-+  if (!focus)
-+    return;
-+
-+  if (focus->simple_keyboard())
-+    use_simple_keyboard = true;
-+  else
-+    use_simple_keyboard = false;
-+
-+  // Force a "Roman" or "ASCII" keyboard, which both the Mozilla and
-+  // Safari people seem to think implies turning off advanced IME stuff
-+  // (see nsTSMManager::SyncKeyScript in Mozilla and enableSecureTextInput
-+  // in Safari/Webcore). Should be good enough for us then...
-+#if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
-+  CFArrayRef inputSources = TISCreateASCIICapableInputSourceList();
-+  TSMSetDocumentProperty(TSMGetActiveDocument(),
-+                         kTSMDocumentEnabledInputSourcesPropertyTag,
-+                         sizeof(CFArrayRef), &inputSources);
-+  CFRelease(inputSources);
-+#else
-+  KeyScript(use_simple_keyboard ? ENABLE_ROMAN_KYBDS_ONLY : smKeyEnableKybds);
-+#endif  
-+}
-+
- /*
-  * Mac keyboard lookup table
-  */
-@@ -908,6 +944,25 @@
- }
- @end
- 
-+static const char* cocoaDead2FLTK(const char *in)
-+{
-+  if (strcmp(in, "\140") == 0)      // GRAVE ACCENT
-+    return "\314\200";              // COMBINING GRAVE ACCENT
-+  if (strcmp(in, "\302\264") == 0)  // ACUTE ACCENT
-+    return "\314\201";              // COMBINING ACUTE ACCENT
-+  if (strcmp(in, "\136") == 0)      // CIRCUMFLEX ACCENT
-+    return "\314\202";              // COMBINING CIRCUMFLEX ACCENT
-+  if (strcmp(in, "\176") == 0)      // TILDE
-+    return "\314\203";              // COMBINING TILDE
-+  if (strcmp(in, "\302\250") == 0)  // DIAERESIS
-+    return "\314\210";              // COMBINING DIAERESIS
-+  // FIXME: OS X dead key behaviour isn't documented and I don't have
-+  //        any more keyboards to test with...
-+
-+  // hope that OS X gave us something proper to begin with
-+  return in;
-+}
-+
- /*
- Handle cocoa keyboard events
- Events during a character composition sequence:
-@@ -1648,6 +1703,7 @@
- - (void)rightMouseDragged:(NSEvent *)theEvent;
- - (void)otherMouseDragged:(NSEvent *)theEvent;
- - (void)scrollWheel:(NSEvent *)theEvent;
-++ (NSString *)keyTranslate:(UInt16)keyCode withModifierFlags:(UInt32)modifierFlags;
- - (BOOL)handleKeyDown:(NSEvent *)theEvent;
- - (void)keyDown:(NSEvent *)theEvent;
- - (void)keyUp:(NSEvent *)theEvent;
-@@ -1726,6 +1782,130 @@
- - (void)scrollWheel:(NSEvent *)theEvent {
-   cocoaMouseWheelHandler(theEvent);
- }
-++ (NSString *)keyTranslate:(UInt16)keyCode withModifierFlags:(UInt32)modifierFlags {
-+  const UCKeyboardLayout *layout;
-+  OSStatus err;
-+
-+  layout = NULL;
-+
-+#if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
-+  TISInputSourceRef keyboard;
-+  CFDataRef uchr;
-+
-+  keyboard = TISCopyCurrentKeyboardInputSource();
-+  uchr = (CFDataRef)TISGetInputSourceProperty(keyboard,
-+                                              kTISPropertyUnicodeKeyLayoutData);
-+  if (uchr == NULL)
-+    return nil;
-+
-+  layout = (const UCKeyboardLayout*)CFDataGetBytePtr(uchr);
-+#else
-+  KeyboardLayoutRef old_layout;
-+  int kind;
-+
-+  err = KLGetCurrentKeyboardLayout(&old_layout);
-+  if (err != noErr)
-+    return nil;
-+
-+  err = KLGetKeyboardLayoutProperty(old_layout, kKLKind,
-+                                    (const void**)&kind);
-+  if (err != noErr)
-+    return nil;
-+
-+  // Old, crufty layout format?
-+  if (kind == kKLKCHRKind) {
-+    void *kchr_layout;
-+
-+    UInt32 chars, state;
-+    char buf[3];
-+
-+    unichar result[16];
-+    ByteCount in_len, out_len;
-+
-+    err = KLGetKeyboardLayoutProperty(old_layout, kKLKCHRData,
-+                                      (const void**)&kchr_layout);
-+    if (err != noErr)
-+      return nil;
-+
-+    state = 0;
-+
-+    keyCode &= 0x7f;
-+    modifierFlags &= 0xff00;
-+
-+    chars = KeyTranslate(kchr_layout, keyCode | modifierFlags, &state);
-+
-+    buf[0] = (chars >> 16) & 0xff;
-+    buf[1] = chars & 0xff;
-+    buf[2] = '\0';
-+
-+    if (buf[0] == '\0') {
-+      buf[0] = buf[1];
-+      buf[1] = '\0';
-+    }
-+
-+    // The data is now in some layout specific encoding. Need to convert
-+    // this to unicode.
-+
-+    ScriptCode script;
-+    TextEncoding encoding;
-+    TECObjectRef converter;
-+
-+    script = (ScriptCode)GetScriptManagerVariable(smKeyScript);
-+
-+    err = UpgradeScriptInfoToTextEncoding(script, kTextLanguageDontCare,
-+                                          kTextRegionDontCare, NULL,
-+                                          &encoding);
-+    if (err != noErr)
-+      return nil;
-+
-+    err = TECCreateConverter(&converter, encoding, kTextEncodingUnicodeV4_0);
-+    if (err != noErr)
-+      return nil;
-+
-+    in_len = strlen(buf);
-+    out_len = sizeof(result);
-+
-+    err = TECConvertText(converter, (ConstTextPtr)buf, in_len, &in_len,
-+                         (TextPtr)result, out_len, &out_len);
-+
-+    TECDisposeConverter(converter);
-+
-+    if (err != noErr)
-+      return nil;
-+
-+    return [NSString stringWithCharacters:result
-+                     length:(out_len / sizeof(unichar))];
-+  }
-+
-+  if ((kind != kKLKCHRuchrKind) && (kind != kKLuchrKind))
-+    return nil;
-+
-+  err = KLGetKeyboardLayoutProperty(old_layout, kKLuchrData,
-+                                    (const void**)&layout);
-+  if (err != noErr)
-+    return nil;
-+#endif
-+ 
-+  if (layout == NULL)
-+    return nil;
-+
-+  UInt32 dead_state;
-+  UniCharCount max_len, actual_len;
-+  UniChar string[255];
-+
-+  dead_state = 0;
-+  max_len = sizeof(string)/sizeof(*string);
-+
-+  modifierFlags = (modifierFlags >> 8) & 0xff;
-+
-+  err = UCKeyTranslate(layout, keyCode, kUCKeyActionDown, modifierFlags,
-+                       LMGetKbdType(), 0, &dead_state, max_len, &actual_len,
-+                       string);
-+  if (err != noErr)
-+    return nil;
-+
-+  return [NSString stringWithCharacters:string length:actual_len];
-+}
- - (BOOL)handleKeyDown:(NSEvent *)theEvent {
-   //NSLog(@"handleKeyDown");
-   fl_lock_function();
-@@ -1752,14 +1932,47 @@
-       break;
-     }
-   }
--  if (!no_text_key && !(Fl::e_state & FL_META) ) {
--    // Don't send cmd-<key> to interpretKeyEvents because it beeps.
-+  if (!no_text_key) {
-+    // The simple keyboard model will ignore insertText, so we need to grab
-+    // the symbol directly from the event. Note that we still use setMarkedText.
-+    if (use_simple_keyboard) {
-+      NSString *simple_chars;
-+      UInt32 modifiers;
-+
-+      // We want a "normal" symbol out of the event, which basically means
-+      // we only respect the shift and alt/altgr modifiers. Cocoa can help
-+      // us if we only wanted shift, but as we also want alt/altgr, we'll
-+      // have to do some lookup ourselves. This matches our behaviour on
-+      // other platforms.
-+
-+      modifiers = 0;
-+      if ([theEvent modifierFlags] & NSAlphaShiftKeyMask)
-+        modifiers |= alphaLock;
-+      if ([theEvent modifierFlags] & NSShiftKeyMask)
-+        modifiers |= shiftKey;
-+      if ([theEvent modifierFlags] & NSAlternateKeyMask)
-+        modifiers |= optionKey;
-+
-+      simple_chars = [FLView keyTranslate:[theEvent keyCode]
-+                             withModifierFlags:modifiers];
-+      if (simple_chars == nil) {
-+        // Something went wrong. Fall back to what Cocoa gave us...
-+        simple_chars = [theEvent charactersIgnoringModifiers];
-+      }
-+
-+      [FLView prepareEtext:simple_chars];
-+    }
-+
-     // Then we can let the OS have a stab at it and see if it thinks it
-     // should result in some text
--    NSText *edit = [[theEvent window]  fieldEditor:YES forObject:nil];
--    in_key_event = true;
--    [edit interpretKeyEvents:[NSArray arrayWithObject:theEvent]];
--    in_key_event = false;
-+
-+    // Don't send cmd-<key> to interpretKeyEvents because it beeps.
-+    if (!(Fl::e_state & FL_META)) {
-+      NSText *edit = [[theEvent window]  fieldEditor:YES forObject:nil];
-+      in_key_event = true;
-+      [edit interpretKeyEvents:[NSArray arrayWithObject:theEvent]];
-+      in_key_event = false;
-+    }
-   }
-   //NSLog(@"to text=%@ l=%d", [NSString stringWithUTF8String:Fl::e_text], Fl::e_length);
-   int handled = Fl::handle(FL_KEYDOWN, window);
-@@ -1937,21 +2150,30 @@
-   //NSLog(@"insertText: received=%@",received);
- 
-   if (!in_key_event) fl_lock_function();
-+
-+  // Simple keyboard widgets do not want these side channel inputs.
-+  if (use_simple_keyboard)
-+    goto end;
-+
-   [FLView prepareEtext:received];
-+
-   // We can get called outside of key events (e.g. from the character
--  // palette). Transform such actions to FL_PASTE events.
-+  // palette). We need to fake our own key event at that point.
-   if (!in_key_event) {
-     Fl_Window *target = [(FLWindow*)[self window] getFl_Window];
--    Fl::handle(FL_PASTE, target);
-+    Fl::e_keysym = Fl::e_original_keysym = 0;
-+    Fl::handle(FL_KEYDOWN, target);
-     // for some reason, the window does not redraw until the next mouse move or button push
-     // sending a 'redraw()' or 'awake()' does not solve the issue!
-     Fl::flush();
-   }
-+
-+end:
-   if (!in_key_event) fl_unlock_function();
- }
- 
- - (void)setMarkedText:(id)aString selectedRange:(NSRange)newSelection  {
--  NSString *received;
-+  NSString *received, *current, *aggregate;
-   if (newSelection.location == 0) {
-     [self unmarkText];
-     return;
-@@ -1962,11 +2184,47 @@
-     received = (NSString*)aString;
-   }
-   //NSLog(@"setMarkedText: %@ %d %d",received,newSelection.location,newSelection.length);
-+
-+  fl_lock_function();
-+
-+  // Simple keyboard widgets generally do not want these side channel
-+  // inputs, but we have no other way of getting dead keys so we make
-+  // an exception in that case.
-+  if (use_simple_keyboard) {
-+    if (in_key_event && (Fl::e_length == 0)) {
-+      [FLView prepareEtext:received];
-+
-+      Fl::e_text = (char*)cocoaDead2FLTK(Fl::e_text);
-+      Fl::e_length = strlen(Fl::e_text);
-+    }
-+    goto end;
-+  }
-+
-   // This code creates the OS X behaviour of seeing dead keys as things
-   // are being composed.
-+  //
-+  // Note: The concatenation thing is because of how OS X deals with
-+  //       invalid sequences. At that point it will spit out one call
-+  //       to insertText with the now aborted sequence, and one new
-+  //       call to setMarkedText with the new sequence. Since we want
-+  //       both to be visible, we need to concatenate.
-   next_compose_length = newSelection.location;
--  [FLView prepareEtext:received];
--  //NSLog(@"Fl::e_text=%@ Fl::e_length=%d next_compose_length=%d", received, Fl::e_length, next_compose_length);
-+  current = [NSString stringWithUTF8String:Fl::e_text];
-+  aggregate = [current stringByAppendingString:received];
-+
-+  [FLView prepareEtext:aggregate];
-+  //NSLog(@"Fl::e_text=%@ Fl::e_length=%d next_compose_length=%d", aggregate, Fl::e_length, next_compose_length);
-+
-+  // We can get called outside of key events (e.g. from the character
-+  // palette). We need to fake our own key event at that point.
-+  if (!in_key_event) {
-+    Fl_Window *target = [(FLWindow*)[self window] getFl_Window];
-+    Fl::e_keysym = Fl::e_original_keysym = 0;
-+    Fl::handle(FL_KEYDOWN, target);
-+  }
-+
-+end:
-+  fl_unlock_function();
- }
- 
- - (void)unmarkText {
diff --git a/contrib/packages/rpm/sle11/SOURCES/fpic.diff b/contrib/packages/rpm/sle11/SOURCES/fpic.diff
deleted file mode 100644
index 3eaec73..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/fpic.diff
+++ /dev/null
@@ -1,11 +0,0 @@
---- hw/xfree86/parser/Makefile.am.orig	2010-06-06 03:16:52.000000000 +0200
-+++ hw/xfree86/parser/Makefile.am	2010-08-23 14:05:50.000000000 +0200
-@@ -34,7 +34,7 @@
- 	$(INTERNAL_SOURCES)
- libxf86config_a_CFLAGS = $(AM_CFLAGS)
- 
--AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS) \
-+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS) -fPIC \
- 	-DSYSCONFDIR=\"$(sysconfdir)\" \
- 	-DDATADIR=\"$(datadir)\"
- 
diff --git a/contrib/packages/rpm/sle11/SOURCES/libdrm.diff b/contrib/packages/rpm/sle11/SOURCES/libdrm.diff
deleted file mode 100644
index 31c9abc..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/libdrm.diff
+++ /dev/null
@@ -1,18 +0,0 @@
-Index: hw/xfree86/common/xf86Helper.c
-================================================================================
---- hw/xfree86/common/xf86Helper.c
-+++ hw/xfree86/common/xf86Helper.c
-@@ -2183,6 +2183,13 @@
- 			&errmaj, &errmin);
-     if (!ret)
- 	LoaderErrorMsg(pScrn->name, name, errmaj, errmin);
-+
-+    /* "drm" module has been merged into "dri" module, but some drivers
-+        are still trying to load it explictely and fail if it doesn't exist :-( */
-+    if (!ret && !strcmp(name,"drm")) {
-+        ret = (pointer) -1;
-+    }
-+
-     return ret;
- }
- 
diff --git a/contrib/packages/rpm/sle11/SOURCES/missing_font_paths.diff b/contrib/packages/rpm/sle11/SOURCES/missing_font_paths.diff
deleted file mode 100644
index 3dd64f5..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/missing_font_paths.diff
+++ /dev/null
@@ -1,19 +0,0 @@
---- configure.ac
-+++ configure.ac
-@@ -505,11 +505,15 @@
- XORG_FONTSUBDIR(FONTTYPE1DIR, fonttype1dir, Type1)
- XORG_FONTSUBDIR(FONT75DPIDIR, font75dpidir, 75dpi)
- XORG_FONTSUBDIR(FONT100DPIDIR, font100dpidir, 100dpi)
-+XORG_FONTSUBDIR(FONTURWDIR, fonturwdir, URW)
-+XORG_FONTSUBDIR(FONTCYRILLICDIR, fontcyrillicdir, cyrillic)
-+XORG_FONTSUBDIR(FONTSGIDIR, fontsgidir, misc/sgi)
-+XORG_FONTSUBDIR(FONTTRUETYPEDIR, fonttruetypedir, truetype)
- 
- dnl Uses --default-font-path if set, otherwise checks for /etc/X11/fontpath.d,
- dnl otherwise uses standard subdirectories of FONTROOTDIR. When cross
- dnl compiling, assume default font path uses standard FONTROOTDIR directories.
--DEFAULT_FONT_PATH="${FONTMISCDIR}:unscaled,${FONTTTFDIR}/,${FONTOTFDIR}/,${FONTTYPE1DIR}/,${FONT100DPIDIR}/,${FONT75DPIDIR}/"
-+DEFAULT_FONT_PATH="${FONTMISCDIR}:unscaled,${FONTTTFDIR}/,${FONTOTFDIR}/,${FONTTYPE1DIR}/,${FONT100DPIDIR}:unscaled,${FONT75DPIDIR}:unscaled,${FONTURWDIR}/,${FONTCYRILLICDIR}:unscaled,${FONTSGIDIR}:unscaled,${FONTTRUETYPEDIR}/"
- if test "$cross_compiling" != yes; then
- 	AC_CHECK_FILE([${sysconfdir}/X11/fontpath.d],
- 		[DEFAULT_FONT_PATH='catalogue:${sysconfdir}/X11/fontpath.d'],
diff --git a/contrib/packages/rpm/sle11/SOURCES/mouse.diff b/contrib/packages/rpm/sle11/SOURCES/mouse.diff
deleted file mode 100644
index 8e651f5..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/mouse.diff
+++ /dev/null
@@ -1,15 +0,0 @@
-Index: hw/xfree86/common/xf86Configure.c
-================================================================================
---- hw/xfree86/common/xf86Configure.c
-+++ hw/xfree86/common/xf86Configure.c
-@@ -64,8 +64,8 @@
- static char *DFLT_MOUSE_DEV = "/dev/sysmouse";
- static char *DFLT_MOUSE_PROTO = "auto";
- #elif defined(linux)
--static char DFLT_MOUSE_DEV[] = "/dev/input/mice";
--static char DFLT_MOUSE_PROTO[] = "auto";
-+static char* DFLT_MOUSE_DEV = "/dev/input/mice";
-+static char* DFLT_MOUSE_PROTO = "auto";
- #else
- static char *DFLT_MOUSE_DEV = "/dev/mouse";
- static char *DFLT_MOUSE_PROTO = "auto";
diff --git a/contrib/packages/rpm/sle11/SOURCES/p_bug96328.diff b/contrib/packages/rpm/sle11/SOURCES/p_bug96328.diff
deleted file mode 100644
index 3fe9f46..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/p_bug96328.diff
+++ /dev/null
@@ -1,52 +0,0 @@
-Index: hw/xfree86/common/xf86Configure.c
-================================================================================
---- hw/xfree86/common/xf86Configure.c
-+++ hw/xfree86/common/xf86Configure.c
-@@ -250,23 +250,35 @@
- 
-     /* Crude mechanism to auto-detect mouse (os dependent) */
-     { 
--	int fd;
-+	int fd = -1;
- #ifdef WSCONS_SUPPORT
--	fd = open("/dev/wsmouse", 0);
--	if (fd >= 0) {
--	    DFLT_MOUSE_DEV = "/dev/wsmouse";
--	    DFLT_MOUSE_PROTO = "wsmouse";
--	    close(fd);
--	} else {
--	    ErrorF("cannot open /dev/wsmouse\n");
-+	if (fd == -1) {
-+	    fd = open("/dev/wsmouse", 0);
-+	    if (fd != -1) {
-+		DFLT_MOUSE_DEV = "/dev/wsmouse";
-+		DFLT_MOUSE_PROTO = "wsmouse";
-+		close(fd);
-+	    } else {
-+		ErrorF("cannot open /dev/wsmouse\n");
-+	    }
- 	}
- #endif
- 
- #ifndef __SCO__
--	fd = open(DFLT_MOUSE_DEV, 0);
--	if (fd != -1) {
--	    foundMouse = TRUE;
--	    close(fd);
-+	if (fd == -1) {
-+	    fd = open(DFLT_MOUSE_DEV, 0);
-+# ifdef  linux
-+	    if (fd == -1) {
-+		char *name = "/dev/input/mice";
-+		fd = open(name, 0);
-+		if (fd != -1)
-+		    DFLT_MOUSE_DEV = name;
-+	    }
-+# endif
-+	    if (fd != -1) {
-+		foundMouse = TRUE;
-+		close(fd);
-+	    }
- 	}
- #else
- 	foundMouse = TRUE;
diff --git a/contrib/packages/rpm/sle11/SOURCES/p_default-module-path.diff b/contrib/packages/rpm/sle11/SOURCES/p_default-module-path.diff
deleted file mode 100644
index 15b1337..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/p_default-module-path.diff
+++ /dev/null
@@ -1,13 +0,0 @@
-Index: hw/xfree86/common/xf86Globals.c
-================================================================================
---- hw/xfree86/common/xf86Globals.c
-+++ hw/xfree86/common/xf86Globals.c
-@@ -144,7 +144,7 @@
- };
- const char *xf86ConfigFile = NULL;
- const char *xf86ConfigDir = NULL;
--const char *xf86ModulePath = DEFAULT_MODULE_PATH;
-+const char *xf86ModulePath = DEFAULT_MODULE_PATH "/updates," DEFAULT_MODULE_PATH;
- MessageType xf86ModPathFrom = X_DEFAULT;
- const char *xf86LogFile = DEFAULT_LOGPREFIX;
- MessageType xf86LogFileFrom = X_DEFAULT;
diff --git a/contrib/packages/rpm/sle11/SOURCES/p_xkills_wrong_client.diff b/contrib/packages/rpm/sle11/SOURCES/p_xkills_wrong_client.diff
deleted file mode 100644
index 9fea86f..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/p_xkills_wrong_client.diff
+++ /dev/null
@@ -1,13 +0,0 @@
-Index: os/connection.c
-================================================================================
---- os/connection.c
-+++ os/connection.c
-@@ -999,7 +999,7 @@
-             do {
-                 r = Select (curclient + 1, &tmask, NULL, NULL, &notime);
-             } while (r < 0 && (errno == EINTR || errno == EAGAIN));
--            if (r < 0)
-+            if (r < 0 && (errno == EBADF))
-                 if (ConnectionTranslation[curclient] > 0)
-                     CloseDownClient(clients[ConnectionTranslation[curclient]]);
- 	    mask &= ~((fd_mask)1 << curoff);
diff --git a/contrib/packages/rpm/sle11/SOURCES/p_xnest-ignore-getimage-errors.diff b/contrib/packages/rpm/sle11/SOURCES/p_xnest-ignore-getimage-errors.diff
deleted file mode 100644
index 797327c..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/p_xnest-ignore-getimage-errors.diff
+++ /dev/null
@@ -1,32 +0,0 @@
-Index: build-GucBkyZ/xorg-server-1.6.3.901/hw/xnest/GCOps.c
-================================================================================
---- BUILD/xorg-server-1.7.99/hw/xnest/GCOps.c
-+++ BUILD/xorg-server-1.7.99/hw/xnest/GCOps.c
-@@ -94,6 +94,13 @@
-   }
- }
- 
-+static int
-+xnestIgnoreErrorHandler (Display     *display,
-+		      XErrorEvent *event)
-+{
-+  return False; /* return value is ignored */
-+}
-+
- void
- xnestGetImage(DrawablePtr pDrawable, int x, int y, int w, int h,
- 	      unsigned int format, unsigned long planeMask,
-@@ -101,9 +108,13 @@
- {
-   XImage *ximage;
-   int length;
-+  int (*old_handler)(Display*, XErrorEvent*);
- 
-+  /* we may get BadMatch error when xnest window is minimized */
-+  old_handler = XSetErrorHandler (xnestIgnoreErrorHandler);
-   ximage = XGetImage(xnestDisplay, xnestDrawable(pDrawable),
-                      x, y, w, h, planeMask, format);
-+  XSetErrorHandler (old_handler);
- 
-   if (ximage) {
-       length = ximage->bytes_per_line * ximage->height;
diff --git a/contrib/packages/rpm/sle11/SOURCES/p_xorg_acpi.diff b/contrib/packages/rpm/sle11/SOURCES/p_xorg_acpi.diff
deleted file mode 100644
index 23b52ee..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/p_xorg_acpi.diff
+++ /dev/null
@@ -1,121 +0,0 @@
-Index: hw/xfree86/os-support/linux/lnx_acpi.c
-================================================================================
---- hw/xfree86/os-support/linux/lnx_acpi.c
-+++ hw/xfree86/os-support/linux/lnx_acpi.c
-@@ -32,8 +32,10 @@
- #define ACPI_VIDEO_HEAD_INVALID		(~0u - 1)
- #define ACPI_VIDEO_HEAD_END		(~0u)
- 
-+static PMClose doLnxACPIOpen(void);
- static void lnxCloseACPI(void);
- static pointer ACPIihPtr = NULL;
-+static OsTimerPtr acpiTimer = NULL;
- PMClose lnxACPIOpen(void);
- 
- /* in milliseconds */
-@@ -52,6 +54,22 @@
- 
- #define LINE_LENGTH 80
- 
-+static CARD32
-+lnxACPICheckTimer(OsTimerPtr timer, CARD32 now, pointer arg)
-+{
-+#if DEBUG
-+       ErrorF("ACPI: trying to reopen\n");
-+#endif
-+    if (doLnxACPIOpen()) {
-+#if DEBUG
-+       ErrorF("ACPI: successfully reopened\n");
-+#endif
-+       acpiTimer = NULL;
-+       return 0;
-+    }
-+    return 5000;
-+}
-+
- static int
- lnxACPIGetEventFromOs(int fd, pmEvent *events, int num)
- {
-@@ -127,15 +145,14 @@
-     }
- }
- 
--PMClose
--lnxACPIOpen(void)
-+static PMClose
-+doLnxACPIOpen(void)
- {
-     int fd;    
-     struct sockaddr_un addr;
-     int r = -1;
-     static int warned = 0;
- 
--    DebugF("ACPI: OSPMOpen called\n");
-     if (ACPIihPtr || !xf86Info.pmFlag)
- 	return NULL;
-    
-@@ -164,6 +181,27 @@
-     return lnxCloseACPI;
- }
- 
-+PMClose 
-+lnxACPIPoll(void)
-+{
-+    TimerSet(NULL, 0, 5000, lnxACPICheckTimer, NULL);
-+    return lnxCloseACPI;
-+}
-+
-+PMClose
-+lnxACPIOpen(void)
-+{
-+    PMClose ret;
-+#ifdef DEBUG
-+    ErrorF("ACPI: OSPMOpen called\n");
-+#endif
-+    if (!(ret = doLnxACPIOpen()))
-+       xf86MsgVerb(X_WARNING,3,"Open ACPI failed (%s) (%s)\n", ACPI_SOCKET,
-+                   strerror(errno));
-+
-+    return ret;
-+}
-+
- static void
- lnxCloseACPI(void)
- {
-@@ -175,5 +213,11 @@
- 	shutdown(fd, 2);
- 	close(fd);
- 	ACPIihPtr = NULL;
-+        xf86PMGetEventFromOs = NULL;
-+        xf86PMConfirmEventToOs = NULL;
-+        if (acpiTimer) {
-+            TimerCancel(acpiTimer);
-+            acpiTimer = NULL;
-+        }
-     }
- }
---- hw/xfree86/os-support/linux/lnx_apm.c
-+++ hw/xfree86/os-support/linux/lnx_apm.c
-@@ -12,6 +12,7 @@
- 
- #ifdef HAVE_ACPI
- extern PMClose lnxACPIOpen(void);
-+extern PMClose lnxACPIPoll(void);
- #endif
- 
- #ifdef HAVE_APM
-@@ -149,6 +150,14 @@
- 		ret = lnxAPMOpen();
- #endif
- 
-+#ifdef HAVE_ACPI
-+        /* if we can neither open ACPI nor APM poll for an ACPI service to
-+           become available */
-+
-+        if (!ret && !xf86acpiDisableFlag)
-+		ret = lnxACPIPoll();
-+#endif
-+
- 	return ret;
- }
- 
diff --git a/contrib/packages/rpm/sle11/SOURCES/pad-size-of-system-memory-copy-for-1x1-pixmaps b/contrib/packages/rpm/sle11/SOURCES/pad-size-of-system-memory-copy-for-1x1-pixmaps
deleted file mode 100644
index d53b072..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/pad-size-of-system-memory-copy-for-1x1-pixmaps
+++ /dev/null
@@ -1,29 +0,0 @@
-From: Michel Dänzer <michel@daenzer.net>
-Subject: Pad size of system memory copy for 1x1 pixmaps
-References: bfo#32803 bnc#652523
-
-Temporary description by: Jeff Mahoney <jeffm@suse.com>
- This patch fixes a crash that occured frequently with glibc malloc
- perturbing enabled and was a bit more random otherwise. The issue
- appears to be that the pExaPixmap for 1x1 pixmaps was allocating a single
- byte. The patch uses paddedWidth, which I expect is 4 bytes instead.
-
-Acked-by: Jeff Mahoney <jeffm@suse.com>
----
-
- exa/exa_mixed.c |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/exa/exa_mixed.c b/exa/exa_mixed.c
-index ef20eb5..606f1e1 100644
---- a/exa/exa_mixed.c
-+++ b/exa/exa_mixed.c
-@@ -98,7 +98,7 @@ exaCreatePixmap_mixed(ScreenPtr pScreen, int w, int h, int depth,
- 	pExaPixmap->use_gpu_copy = FALSE;
- 
- 	if (w == 1 && h == 1) {
--	    pExaPixmap->sys_ptr = malloc((pPixmap->drawable.bitsPerPixel + 7) / 8);
-+	    pExaPixmap->sys_ptr = malloc(paddedWidth);
- 
- 	    /* Set up damage tracking */
- 	    pExaPixmap->pDamage = DamageCreate(exaDamageReport_mixed, NULL,
diff --git a/contrib/packages/rpm/sle11/SOURCES/pci-legacy-mem-fallback.diff b/contrib/packages/rpm/sle11/SOURCES/pci-legacy-mem-fallback.diff
deleted file mode 100644
index 5929972..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/pci-legacy-mem-fallback.diff
+++ /dev/null
@@ -1,21 +0,0 @@
-Index: hw/xfree86/os-support/bus/linuxPci.c
-================================================================================
---- hw/xfree86/os-support/bus/linuxPci.c
-+++ hw/xfree86/os-support/bus/linuxPci.c
-@@ -397,6 +397,7 @@
-      * legacy_mem interface is unavailable.
-      */
-     if ((Base > 1024*1024) || ((fd = linuxOpenLegacy(dev, "legacy_mem")) < 0))
-+    fallback:
- 	return linuxMapPci(ScreenNum, Flags, dev, Base, Size,
- 			   PCIIOC_MMAP_IS_MEM);
-     else
-@@ -405,6 +406,8 @@
-     if (fd >= 0)
- 	close(fd);
-     if (addr == NULL || addr == MAP_FAILED) {
-+        if (errno == ENXIO)
-+	    goto fallback;
- 	perror("mmap failure");
- 	FatalError("xf86MapDomainMem():  mmap() failure\n");
-     }
diff --git a/contrib/packages/rpm/sle11/SOURCES/pio_ia64.diff b/contrib/packages/rpm/sle11/SOURCES/pio_ia64.diff
deleted file mode 100644
index fc3b0d5..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/pio_ia64.diff
+++ /dev/null
@@ -1,87 +0,0 @@
-Index: xorg-server-1.8.0/hw/xfree86/common/compiler.h
-===================================================================
---- xorg-server-1.8.0.orig/hw/xfree86/common/compiler.h
-+++ xorg-server-1.8.0/hw/xfree86/common/compiler.h
-@@ -409,12 +409,18 @@ extern _X_EXPORT unsigned int inl(unsign
- #    undef inb
- #    undef inw
- #    undef inl
--extern _X_EXPORT void outb(unsigned long port, unsigned char val);
--extern _X_EXPORT void outw(unsigned long port, unsigned short val);
--extern _X_EXPORT void outl(unsigned long port, unsigned int val);
--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);
-+#define outb(p,v) outb_ia64(p,v)
-+#define outw(p,v) outw_ia64(p,v)
-+#define outl(p,v) outl_ia64(p,v)
-+#define inb(p) inb_ia64(p)
-+#define inw(p) inw_ia64(p)
-+#define inl(p) inl_ia64(p)
-+extern _X_EXPORT void outb_ia64(unsigned long port, unsigned char val);
-+extern _X_EXPORT void outw_ia64(unsigned long port, unsigned short val);
-+extern _X_EXPORT void outl_ia64(unsigned long port, unsigned int val);
-+extern _X_EXPORT unsigned int inb_ia64(unsigned long port);
-+extern _X_EXPORT unsigned int inw_ia64(unsigned long port);
-+extern _X_EXPORT unsigned int inl_ia64(unsigned long port);
-  
- #   elif (defined(linux) || defined(__FreeBSD__)) && defined(__amd64__)
-  
-Index: xorg-server-1.8.0/hw/xfree86/os-support/shared/ia64Pci.c
-===================================================================
---- xorg-server-1.8.0.orig/hw/xfree86/os-support/shared/ia64Pci.c
-+++ xorg-server-1.8.0/hw/xfree86/os-support/shared/ia64Pci.c
-@@ -60,7 +60,7 @@ static int ia64_port_to_fd(unsigned long
-     return (port >> 24) & 0xffffffff;
- }
- 
--void outb(unsigned long port, unsigned char val)
-+void outb_ia64(unsigned long port, unsigned char val)
- {
-     int fd = ia64_port_to_fd(port);
- 
-@@ -80,7 +80,7 @@ void outb(unsigned long port, unsigned c
-     return;
- }
- 
--void outw(unsigned long port, unsigned short val)
-+void outw_ia64(unsigned long port, unsigned short val)
- {
-     int fd = ia64_port_to_fd(port);
- 
-@@ -100,7 +100,7 @@ void outw(unsigned long port, unsigned s
-     return;
- }
- 
--void outl(unsigned long port, unsigned int val)
-+void outl_ia64(unsigned long port, unsigned int val)
- {
-     int fd = ia64_port_to_fd(port);
- 
-@@ -120,7 +120,7 @@ void outl(unsigned long port, unsigned i
-     return;
- }
- 
--unsigned int inb(unsigned long port)
-+unsigned int inb_ia64(unsigned long port)
- {
-     int fd = ia64_port_to_fd(port);
-     unsigned char val;
-@@ -142,7 +142,7 @@ unsigned int inb(unsigned long port)
-     return val;
- }
- 
--unsigned int inw(unsigned long port)
-+unsigned int inw_ia64(unsigned long port)
- {
-     int fd = ia64_port_to_fd(port);
-     unsigned short val;
-@@ -164,7 +164,7 @@ unsigned int inw(unsigned long port)
-     return val;
- }
- 
--unsigned int inl(unsigned long port)
-+unsigned int inl_ia64(unsigned long port)
- {
-     int fd = ia64_port_to_fd(port);
-     unsigned int val;
diff --git a/contrib/packages/rpm/sle11/SOURCES/pixman.diff b/contrib/packages/rpm/sle11/SOURCES/pixman.diff
deleted file mode 100644
index 83a6601..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/pixman.diff
+++ /dev/null
@@ -1,13 +0,0 @@
-Index: include/miscstruct.h
-================================================================================
---- include/miscstruct.h
-+++ include/miscstruct.h
-@@ -50,7 +50,7 @@
- 
- #include "misc.h"
- #include <X11/Xprotostr.h>
--#include <pixman.h>
-+#include <pixman-1/pixman.h>
- 
- typedef xPoint DDXPointRec;
- 
diff --git a/contrib/packages/rpm/sle11/SOURCES/pixmap_v2.patch b/contrib/packages/rpm/sle11/SOURCES/pixmap_v2.patch
deleted file mode 100644
index 3031513..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/pixmap_v2.patch
+++ /dev/null
@@ -1,554 +0,0 @@
-diff -ur fltk-1.3.2.org/FL/Fl_Image.H fltk-1.3.2/FL/Fl_Image.H
---- fltk-1.3.2.org/FL/Fl_Image.H	2012-11-09 17:02:08.000000000 +0100
-+++ fltk-1.3.2/FL/Fl_Image.H	2013-01-16 14:40:51.543230638 +0100
-@@ -26,6 +26,7 @@
- #include <stdlib.h>
- 
- class Fl_Widget;
-+class Fl_Pixmap;
- struct Fl_Menu_Item;
- struct Fl_Label;
- 
-@@ -203,6 +204,7 @@
-   */
-   Fl_RGB_Image(const uchar *bits, int W, int H, int D=3, int LD=0) :
-     Fl_Image(W,H,D), array(bits), alloc_array(0), id_(0), mask_(0) {data((const char **)&array, 1); ld(LD);}
-+  Fl_RGB_Image(const Fl_Pixmap *pxm, Fl_Color bg=FL_GRAY);
-   virtual ~Fl_RGB_Image();
-   virtual Fl_Image *copy(int W, int H);
-   Fl_Image *copy() { return copy(w(), h()); }
-diff -ur fltk-1.3.2.org/src/fl_draw_pixmap.cxx fltk-1.3.2/src/fl_draw_pixmap.cxx
---- fltk-1.3.2.org/src/fl_draw_pixmap.cxx	2012-04-22 05:09:31.000000000 +0200
-+++ fltk-1.3.2/src/fl_draw_pixmap.cxx	2013-01-16 14:40:51.542230588 +0100
-@@ -58,99 +58,6 @@
-   return 1;
- }
- 
--#ifdef U64
--
--// The callback from fl_draw_image to get a row of data passes this:
--struct pixmap_data {
--  int w, h;
--  const uchar*const* data;
--  union {
--    U64 colors[256];
--    U64* byte1[256];
--  };
--};
--
--// callback for 1 byte per pixel:
--static void cb1(void*v, int x, int y, int w, uchar* buf) {
--  pixmap_data& d = *(pixmap_data*)v;
--  const uchar* p = d.data[y]+x;
--  U64* q = (U64*)buf;
--  for (int X=w; X>0; X-=2, p += 2) {
--    if (X>1) {
--#  if WORDS_BIGENDIAN
--      *q++ = (d.colors[p[0]]<<32) | d.colors[p[1]];
--#  else
--      *q++ = (d.colors[p[1]]<<32) | d.colors[p[0]];
--#  endif
--    } else {
--#  if WORDS_BIGENDIAN
--      *q++ = d.colors[p[0]]<<32;
--#  else
--      *q++ = d.colors[p[0]];
--#  endif
--    }
--  }
--}
--
--// callback for 2 bytes per pixel:
--static void cb2(void*v, int x, int y, int w, uchar* buf) {
--  pixmap_data& d = *(pixmap_data*)v;
--  const uchar* p = d.data[y]+2*x;
--  U64* q = (U64*)buf;
--  for (int X=w; X>0; X-=2) {
--    U64* colors = d.byte1[*p++];
--    int index = *p++;
--    if (X>1) {
--      U64* colors1 = d.byte1[*p++];
--      int index1 = *p++;
--#  if WORDS_BIGENDIAN
--      *q++ = (colors[index]<<32) | colors1[index1];
--#  else
--      *q++ = (colors1[index1]<<32) | colors[index];
--#  endif
--    } else {
--#  if WORDS_BIGENDIAN
--      *q++ = colors[index]<<32;
--#  else
--      *q++ = colors[index];
--#  endif
--    }
--  }
--}
--
--#else // U32
--
--// The callback from fl_draw_image to get a row of data passes this:
--struct pixmap_data {
--  int w, h;
--  const uchar*const* data;
--  union {
--    U32 colors[256];
--    U32* byte1[256];
--  };
--};
--
--// callback for 1 byte per pixel:
--static void cb1(void*v, int x, int y, int w, uchar* buf) {
--  pixmap_data& d = *(pixmap_data*)v;
--  const uchar* p = d.data[y]+x;
--  U32* q = (U32*)buf;
--  for (int X=w; X--;) *q++ = d.colors[*p++];
--}
--
--// callback for 2 bytes per pixel:
--static void cb2(void*v, int x, int y, int w, uchar* buf) {
--  pixmap_data& d = *(pixmap_data*)v;
--  const uchar* p = d.data[y]+2*x;
--  U32* q = (U32*)buf;
--  for (int X=w; X--;) {
--    U32* colors = d.byte1[*p++];
--    *q++ = colors[*p++];
--  }
--}
--
--#endif // U64 else U32
--
- uchar **fl_mask_bitmap; // if non-zero, create bitmap and store pointer here
- 
- /**
-@@ -200,34 +107,33 @@
- }
- #endif
- 
--/**
--  Draw XPM image data, with the top-left corner at the given position.
--  \see fl_draw_pixmap(char* const* data, int x, int y, Fl_Color bg)
--  */
--int fl_draw_pixmap(const char*const* cdata, int x, int y, Fl_Color bg) {
--  pixmap_data d;
--  if (!fl_measure_pixmap(cdata, d.w, d.h)) return 0;
-+int fl_convert_pixmap(const char*const* cdata, uchar* out, Fl_Color bg) {
-+  int w, h;
-   const uchar*const* data = (const uchar*const*)(cdata+1);
-   int transparent_index = -1;
-+
-+  if (!fl_measure_pixmap(cdata, w, h))
-+    return 0;
-+
-+  if ((chars_per_pixel < 1) || (chars_per_pixel > 2))
-+    return 0;
-+
-+  uchar colors[1<<(chars_per_pixel*8)][4];
-+
- #ifdef WIN32
-   uchar *transparent_c = (uchar *)0; // such that transparent_c[0,1,2] are the RGB of the transparent color
-   color_count = 0;
-   used_colors = (uchar *)malloc(abs(ncolors)*3*sizeof(uchar));
- #endif
- 
--  if (ncolors < 0) {	// FLTK (non standard) compressed colormap
-+  if (ncolors < 0) {
-+    // FLTK (non standard) compressed colormap
-     ncolors = -ncolors;
-     const uchar *p = *data++;
-     // if first color is ' ' it is transparent (put it later to make
-     // it not be transparent):
-     if (*p == ' ') {
--      uchar* c = (uchar*)&d.colors[(int)' '];
--#ifdef U64
--      *(U64*)c = 0;
--#  if WORDS_BIGENDIAN
--      c += 4;
--#  endif
--#endif
-+      uchar* c = colors[(int)' '];
-       transparent_index = ' ';
-       Fl::get_color(bg, c[0], c[1], c[2]); c[3] = 0;
- #ifdef WIN32
-@@ -238,13 +144,7 @@
-     }
-     // read all the rest of the colors:
-     for (int i=0; i < ncolors; i++) {
--      uchar* c = (uchar*)&d.colors[*p++];
--#ifdef U64
--      *(U64*)c = 0;
--#  if WORDS_BIGENDIAN
--      c += 4;
--#  endif
--#endif
-+      uchar* c = colors[*p++];
- #ifdef WIN32
-       used_colors[3*color_count] = *p;
-       used_colors[3*color_count+1] = *(p+1);
-@@ -254,69 +154,44 @@
-       *c++ = *p++;
-       *c++ = *p++;
-       *c++ = *p++;
--#ifdef __APPLE_QUARTZ__
-       *c = 255;
--#else
--      *c = 0;
--#endif
-     }
--  } else {	// normal XPM colormap with names
--    if (chars_per_pixel>1) memset(d.byte1, 0, sizeof(d.byte1));
-+  } else {
-+    // normal XPM colormap with names
-     for (int i=0; i<ncolors; i++) {
-       const uchar *p = *data++;
-       // the first 1 or 2 characters are the color index:
-       int ind = *p++;
-       uchar* c;
--      if (chars_per_pixel>1) {
--#ifdef U64
--	U64* colors = d.byte1[ind];
--	if (!colors) colors = d.byte1[ind] = new U64[256];
--#else
--	U32* colors = d.byte1[ind];
--	if (!colors) colors = d.byte1[ind] = new U32[256];
--#endif
--	c = (uchar*)&colors[*p];
--	ind = (ind<<8)|*p++;
--      } else {
--	c = (uchar *)&d.colors[ind];
--      }
-+      if (chars_per_pixel>1)
-+        ind = (ind<<8)|*p++;
-+      c = colors[ind];
-       // look for "c word", or last word if none:
-       const uchar *previous_word = p;
-       for (;;) {
--	while (*p && isspace(*p)) p++;
--	uchar what = *p++;
--	while (*p && !isspace(*p)) p++;
--	while (*p && isspace(*p)) p++;
--	if (!*p) {p = previous_word; break;}
--	if (what == 'c') break;
--	previous_word = p;
--	while (*p && !isspace(*p)) p++;
-+        while (*p && isspace(*p)) p++;
-+        uchar what = *p++;
-+        while (*p && !isspace(*p)) p++;
-+        while (*p && isspace(*p)) p++;
-+        if (!*p) {p = previous_word; break;}
-+        if (what == 'c') break;
-+        previous_word = p;
-+        while (*p && !isspace(*p)) p++;
-       }
--#ifdef U64
--      *(U64*)c = 0;
--#  if WORDS_BIGENDIAN
--      c += 4;
--#  endif
--#endif
--#ifdef __APPLE_QUARTZ__
--      c[3] = 255;
--#endif
-       int parse = fl_parse_color((const char*)p, c[0], c[1], c[2]);
-+      c[3] = 255;
-       if (parse) {
- #ifdef WIN32
--	used_colors[3*color_count] = c[0];
--	used_colors[3*color_count+1] = c[1];
--	used_colors[3*color_count+2] = c[2];
--	color_count++;
-+        used_colors[3*color_count] = c[0];
-+        used_colors[3*color_count+1] = c[1];
-+        used_colors[3*color_count+2] = c[2];
-+        color_count++;
- #endif
--	}
--      else {
-+      } else {
-         // assume "None" or "#transparent" for any errors
--	// "bg" should be transparent...
--	Fl::get_color(bg, c[0], c[1], c[2]);
--#ifdef __APPLE_QUARTZ__
-+        // "bg" should be transparent...
-+        Fl::get_color(bg, c[0], c[1], c[2]);
-         c[3] = 0;
--#endif
- 	transparent_index = ind;
- #ifdef WIN32
- 	transparent_c = c;
-@@ -324,7 +199,6 @@
-       }
-     }
-   }
--  d.data = data;
- #ifdef WIN32
-   if (transparent_c) {
-     make_unused_color(transparent_c[0], transparent_c[1], transparent_c[2]);
-@@ -334,77 +208,76 @@
-     make_unused_color(r, g, b);
-   }
- #endif
-+
-+  U32 *q = (U32*)out;
-+  for (int Y = 0; Y < h; Y++) {
-+    const uchar* p = data[Y];
-+    if (chars_per_pixel <= 1) {
-+      for (int X = 0; X < w; X++)
-+        memcpy(q++, colors[*p++], 4);
-+    } else {
-+      for (int X = 0; X < w; X++) {
-+        int ind = (*p++)<<8;
-+        ind |= *p++;
-+        memcpy(q++, colors[ind], 4);
-+      }
-+    }
-+  }
-   
-+  return 1;
-+}
-+
-+/**
-+  Draw XPM image data, with the top-left corner at the given position.
-+  \see fl_draw_pixmap(char* const* data, int x, int y, Fl_Color bg)
-+  */
-+int fl_draw_pixmap(const char*const* cdata, int x, int y, Fl_Color bg) {
-+  int w, h;
-+
-+  if (!fl_measure_pixmap(cdata, w, h))
-+    return 0;
-+
-+  uchar buffer[w*h*4];
-+
-+  if (!fl_convert_pixmap(cdata, buffer, bg))
-+    return 0;
-+
-+  // FIXME: Hack until fl_draw_image() supports alpha properly
- #ifdef  __APPLE_QUARTZ__
-   if (Fl_Surface_Device::surface() == Fl_Display_Device::display_device()) {
--    U32 *array = new U32[d.w * d.h], *q = array;
--    for (int Y = 0; Y < d.h; Y++) {
--      const uchar* p = data[Y];
--      if (chars_per_pixel <= 1) {
--	for (int X = 0; X < d.w; X++) {
--	  *q++ = d.colors[*p++];
--	}
--      } else {
--	for (int X = 0; X < d.w; X++) {
--	  U32* colors = (U32*)d.byte1[*p++];
--	  *q++ = colors[*p++];
--	}
--      }
--    }
--    Fl_RGB_Image* rgb = new Fl_RGB_Image((uchar*)array, d.w, d.h, 4);
-+    Fl_RGB_Image* rgb = new Fl_RGB_Image(buffer, w, h, 4);
-     rgb->draw(x, y);
-     delete rgb;
--    delete[] array;
--    }
--  else {
-+  } else {
- #endif // __APPLE_QUARTZ__
--
-   // build the mask bitmap used by Fl_Pixmap:
--  if (fl_mask_bitmap && transparent_index >= 0) {
--    int W = (d.w+7)/8;
--    uchar* bitmap = new uchar[W * d.h];
-+  if (fl_mask_bitmap) {
-+    int W = (w+7)/8;
-+    uchar* bitmap = new uchar[W * h];
-     *fl_mask_bitmap = bitmap;
--    for (int Y = 0; Y < d.h; Y++) {
--      const uchar* p = data[Y];
--      if (chars_per_pixel <= 1) {
--	int dw = d.w;
--	for (int X = 0; X < W; X++) {
--	  uchar b = (dw-->0 && *p++ != transparent_index);
--	  if (dw-->0 && *p++ != transparent_index) b |= 2;
--	  if (dw-->0 && *p++ != transparent_index) b |= 4;
--	  if (dw-->0 && *p++ != transparent_index) b |= 8;
--	  if (dw-->0 && *p++ != transparent_index) b |= 16;
--	  if (dw-->0 && *p++ != transparent_index) b |= 32;
--	  if (dw-->0 && *p++ != transparent_index) b |= 64;
--	  if (dw-->0 && *p++ != transparent_index) b |= 128;
-+    const uchar *p = &buffer[3];
-+    uchar b = 0;
-+    for (int Y = 0; Y < h; Y++) {
-+      b = 0;
-+      for (int X = 0, bit = 1; X < w; X++, p += 4) {
-+	if (*p > 127) b |= bit;
-+	bit <<= 1;
-+	if (bit > 0x80 || X == w-1) {
- 	  *bitmap++ = b;
--	}
--      } else {
--        uchar b = 0, bit = 1;
--	for (int X = 0; X < d.w; X++) {
--	  int ind = *p++;
--	  ind = (ind<<8) | (*p++);
--	  if (ind != transparent_index) b |= bit;
--
--          if (bit < 128) bit <<= 1;
--	  else {
--	    *bitmap++ = b;
--	    b = 0;
--	    bit = 1;
-+	  bit = 1;
-+	  b = 0;
- 	  }
- 	}
--
--        if (bit > 1) *bitmap++ = b;
-       }
--    }
-+    
-   }
- 
--  fl_draw_image(chars_per_pixel==1 ? cb1 : cb2, &d, x, y, d.w, d.h, 4);
-+  fl_draw_image(buffer, x, y, w, h, 4);
-+
- #ifdef __APPLE_QUARTZ__
-     }
- #endif
- 
--  if (chars_per_pixel > 1) for (int i = 0; i < 256; i++) delete[] d.byte1[i];
-   return 1;
- }
- 
-diff -ur fltk-1.3.2.org/src/Fl_Image.cxx fltk-1.3.2/src/Fl_Image.cxx
---- fltk-1.3.2.org/src/Fl_Image.cxx	2012-11-09 17:02:08.000000000 +0100
-+++ fltk-1.3.2/src/Fl_Image.cxx	2013-01-16 14:41:38.404162795 +0100
-@@ -165,7 +165,22 @@
- //
- size_t Fl_RGB_Image::max_size_ = ~((size_t)0);
- 
--/**  The destructor free all memory and server resources that are used by  the image. */
-+int fl_convert_pixmap(const char*const* cdata, uchar* out, Fl_Color bg);
-+
-+/** The constructor creates a new RGBA image from the specified Fl_Pixmap. 
-+ 
-+ The RGBA image is built fully opaque except for the transparent area
-+ of the pixmap that is assigned the \par bg color with full transparency */
-+Fl_RGB_Image::Fl_RGB_Image(const Fl_Pixmap *pxm, Fl_Color bg):
-+  Fl_Image(pxm->w(), pxm->h(), 4), id_(0), mask_(0)
-+{
-+  array = new uchar[w() * h() * d()];
-+  alloc_array = 1;
-+  fl_convert_pixmap(pxm->data(), (uchar*)array, bg);
-+  data((const char **)&array, 1);
-+}
-+
-+/**  The destructor frees all memory and server resources that are used by the image. */
- Fl_RGB_Image::~Fl_RGB_Image() {
-   uncache();
-   if (alloc_array) delete[] (uchar *)array;
-diff -ur fltk-1.3.2.org/src/ps_image.cxx fltk-1.3.2/src/ps_image.cxx
---- fltk-1.3.2.org/src/ps_image.cxx	2011-07-19 06:49:30.000000000 +0200
-+++ fltk-1.3.2/src/ps_image.cxx	2013-01-16 14:40:51.541228080 +0100
-@@ -185,72 +185,38 @@
- 
- extern uchar **fl_mask_bitmap;
- 
-+struct callback_data {
-+  const uchar *data;
-+  int D, LD;
-+};
- 
--void Fl_PostScript_Graphics_Driver::draw_image(const uchar *data, int ix, int iy, int iw, int ih, int D, int LD) {
--  double x = ix, y = iy, w = iw, h = ih;
- 
--  if (D<3){ //mono
--    draw_image_mono(data, ix, iy, iw, ih, D, LD);
--    return;
--  }
-+static void draw_image_cb(void *data, int x, int y, int w, uchar *buf) {
-+  struct callback_data *cb_data;
-+  const uchar *curdata;
- 
-+  cb_data = (struct callback_data*)data;
-+  curdata = cb_data->data + x*cb_data->D + y*cb_data->LD;
- 
--  int i,j, k;
-+  memcpy(buf, curdata, w*cb_data->D);
-+}
- 
--  fprintf(output,"save\n");
- 
--  const char * interpol;
--  if (lang_level_>1){
--    if (interpolate_)
--      interpol="true";
--    else
--      interpol="false";
--    if (mask && lang_level_>2)
--      fprintf(output, "%g %g %g %g %i %i %i %i %s CIM\n", x , y+h , w , -h , iw , ih, mx, my, interpol);
--    else
--      fprintf(output, "%g %g %g %g %i %i %s CII\n", x , y+h , w , -h , iw , ih, interpol);
--  } else
--    fprintf(output , "%g %g %g %g %i %i CI", x , y+h , w , -h , iw , ih);
-+void Fl_PostScript_Graphics_Driver::draw_image(const uchar *data, int ix, int iy, int iw, int ih, int D, int LD) {
-+  if (D<3){ //mono
-+    draw_image_mono(data, ix, iy, iw, ih, D, LD);
-+    return;
-+  }
- 
-+  struct callback_data cb_data;
- 
-   if (!LD) LD = iw*D;
--  uchar *curmask=mask;
--
--  for (j=0; j<ih;j++){
--    if (mask){
--
--      for (k=0;k<my/ih;k++){
--        for (i=0; i<((mx+7)/8);i++){
--          if (!(i%80)) fprintf(output, "\n");
--          fprintf(output, "%.2x",swap_byte(*curmask));
--          curmask++;
--        }
--        fprintf(output,"\n");
--      }
--    }
--    const uchar *curdata=data+j*LD;
--    for (i=0 ; i<iw ; i++) {
--      uchar r = curdata[0];
--      uchar g =  curdata[1];
--      uchar b =  curdata[2];
--      if (lang_level_<3 && D>3) { //can do  mixing using bg_* colors)
--        unsigned int a2 = curdata[3]; //must be int
--        unsigned int a = 255-a2;
--        r = (a2 * r + bg_r * a)/255;
--        g = (a2 * g + bg_g * a)/255;
--        b = (a2 * b + bg_b * a)/255;
--      }
--      if (!(i%40)) fprintf(output, "\n");
--      fprintf(output, "%.2x%.2x%.2x", r, g, b);
--      curdata +=D;
--    }
--    fprintf(output,"\n");
--
--  }
--
--  fprintf(output," >\nrestore\n" );
- 
-+  cb_data.data = data;
-+  cb_data.D = D;
-+  cb_data.LD = LD;
- 
-+  draw_image(draw_image_cb, &cb_data, ix, iy, iw, ih, D);
- }
- 
- void Fl_PostScript_Graphics_Driver::draw_image(Fl_Draw_Image_Cb call, void *data, int ix, int iy, int iw, int ih, int D) {
-@@ -325,6 +291,14 @@
- 	uchar g =  curdata[1];
- 	uchar b =  curdata[2];
- 
-+        if (lang_level_<3 && D>3) { //can do  mixing using bg_* colors)
-+          unsigned int a2 = curdata[3]; //must be int
-+          unsigned int a = 255-a2;
-+          r = (a2 * r + bg_r * a)/255;
-+          g = (a2 * g + bg_g * a)/255;
-+          b = (a2 * b + bg_b * a)/255;
-+        }
-+
- 	if (!(i%40)) 	fputs("\n", output);
- 	fprintf(output, "%.2x%.2x%.2x", r, g, b);
- 
diff --git a/contrib/packages/rpm/sle11/SOURCES/pu_fixes.diff b/contrib/packages/rpm/sle11/SOURCES/pu_fixes.diff
deleted file mode 100644
index da916d8..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/pu_fixes.diff
+++ /dev/null
@@ -1,21 +0,0 @@
-Index: hw/xfree86/xaa/xaaImage.c
-================================================================================
---- hw/xfree86/xaa/xaaImage.c
-+++ hw/xfree86/xaa/xaaImage.c
-@@ -238,12 +238,16 @@
-     (*infoRec->SetupForImageWrite)(pScrn, rop, planemask, trans, bpp, depth);
-     (*infoRec->SubsequentImageWriteRect)(pScrn, x, y, w, h, skipleft);
- 
-+#if 0
-     if(beCareful) {
- 	/* in cases with bad alignment we have to be careful not
- 	   to read beyond the end of the source */
- 	if(((x * Bpp) + (dwords << 2)) > srcwidth) h--;
- 	else beCareful = FALSE;
-     }
-+#endif
-+    if (beCareful)
-+	h--;
- 
-     if(dwords > infoRec->ImageWriteRange) {
- 	while(h--) {
diff --git a/contrib/packages/rpm/sle11/SOURCES/randr1_1-sig11.diff b/contrib/packages/rpm/sle11/SOURCES/randr1_1-sig11.diff
deleted file mode 100644
index 64cc07f..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/randr1_1-sig11.diff
+++ /dev/null
@@ -1,14 +0,0 @@
-Index: xorg-server-1.6.3.901/hw/xfree86/common/xf86RandR.c
-================================================================================
---- xorg-server-1.7.99/hw/xfree86/common/xf86RandR.c
-+++ xorg-server-1.7.99/hw/xfree86/common/xf86RandR.c
-@@ -247,6 +247,9 @@
-     Bool		    useVirtual = FALSE;
-     Rotation		    oldRotation = randrp->rotation;
- 
-+    if (!scrp->vtSema)
-+	return FALSE;
-+
-     miPointerGetPosition(inputInfo.pointer, &px, &py);
-     for (mode = scrp->modes; ; mode = mode->next)
-     {
diff --git a/contrib/packages/rpm/sle11/SOURCES/sync-fix.patch b/contrib/packages/rpm/sle11/SOURCES/sync-fix.patch
deleted file mode 100644
index 3a2ddc4..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/sync-fix.patch
+++ /dev/null
@@ -1,57 +0,0 @@
---- xorg-server-1.9.1/Xext/sync.c	2010-11-16 23:11:56.751124639 -0500
-+++ xorg-server-1.9.1/Xext/sync.c	2010-11-16 23:13:16.327862535 -0500
-@@ -2264,8 +2264,44 @@ 
- static void
- IdleTimeQueryValue (pointer pCounter, CARD64 *pValue_return)
- {
--    CARD32 idle = GetTimeInMillis() - lastDeviceEventTime.milliseconds;
-+    static CARD32 previousLastDeviceEventTimeMilliseconds = 0;
-+    CARD32        now              = GetTimeInMillis();
-+    CARD32        idle             = now - lastDeviceEventTime.milliseconds;
-+    CARD32        previousIdle     = now - previousLastDeviceEventTimeMilliseconds;
-+    SyncCounter  *pIdleTimeCounter = (SyncCounter*)pCounter;
-+
-     XSyncIntsToValue (pValue_return, idle, 0);
-+
-+    if (pCounter == NULL)
-+    {
-+        return;
-+    }
-+    if (previousLastDeviceEventTimeMilliseconds == 0)
-+    {
-+        /* initialize static var when this function is invoked the first time. */
-+        previousLastDeviceEventTimeMilliseconds = lastDeviceEventTime.milliseconds;
-+        return;
-+    }
-+
-+    if (previousLastDeviceEventTimeMilliseconds == lastDeviceEventTime.milliseconds)
-+    {
-+        /* no new user event, no need to change idle counter. */
-+        return;
-+    }
-+    previousLastDeviceEventTimeMilliseconds = lastDeviceEventTime.milliseconds;
-+
-+    /*
-+     * Some user event occured; now update idle counter with previous
-+     * event time, so idle counter has the most up-to-date value with
-+     * respect to previous user event (we need old and new counter
-+     * value to compute if a transition occured).  Recompute bracket
-+     * values if this is system counter.
-+     */
-+
-+    XSyncIntsToValue  (&pIdleTimeCounter->value, previousIdle, 0);
-+    if (IsSystemCounter(pIdleTimeCounter)) {
-+        SyncComputeBracketValues(pIdleTimeCounter);
-+    }
- }
- 
- static void
-@@ -2342,7 +2378,7 @@ 
-     if (!pIdleTimeValueLess && !pIdleTimeValueGreater)
- 	return;
- 
--    IdleTimeQueryValue (NULL, &idle);
-+    IdleTimeQueryValue (IdleTimeCounter, &idle);
- 
-     if ((pIdleTimeValueGreater &&
-          XSyncValueGreaterOrEqual (idle, *pIdleTimeValueGreater)) ||
diff --git a/contrib/packages/rpm/sle11/SOURCES/tigervnc-clean-pressed-key-on-exit.patch b/contrib/packages/rpm/sle11/SOURCES/tigervnc-clean-pressed-key-on-exit.patch
deleted file mode 100644
index 637ee81..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/tigervnc-clean-pressed-key-on-exit.patch
+++ /dev/null
@@ -1,79 +0,0 @@
-diff --git a/vncviewer/DesktopWindow.cxx b/vncviewer/DesktopWindow.cxx
-index 40d08ae..7a571ec 100644
---- a/vncviewer/DesktopWindow.cxx
-+++ b/vncviewer/DesktopWindow.cxx
-@@ -186,6 +186,8 @@ DesktopWindow::~DesktopWindow()
- 
-   OptionsDialog::removeCallback(handleOptions);
- 
-+  delete viewport;
-+
-   // FLTK automatically deletes all child widgets, so we shouldn't touch
-   // them ourselves here
- }
-diff --git a/vncviewer/Viewport.cxx b/vncviewer/Viewport.cxx
-index e308a63..41733f9 100644
---- a/vncviewer/Viewport.cxx
-+++ b/vncviewer/Viewport.cxx
-@@ -112,6 +112,11 @@ Viewport::Viewport(int w, int h, const rfb::PixelFormat& serverPF, CConn* cc_)
- 
- Viewport::~Viewport()
- {
-+  // Send release for every pressed key
-+  for(DownMap::iterator iter = downKeySym.begin(); iter != downKeySym.end(); ++iter) {
-+    cc->writer()->keyEvent(iter->second, false);
-+  }
-+
-   // Unregister all timeouts in case they get a change tro trigger
-   // again later when this object is already gone.
-   Fl::remove_timeout(handleUpdateTimeout, this);
-diff --git a/vncviewer/vncviewer.cxx b/vncviewer/vncviewer.cxx
-index 37d63a6..5bb811d 100644
---- a/vncviewer/vncviewer.cxx
-+++ b/vncviewer/vncviewer.cxx
-@@ -83,6 +83,8 @@ char vncServerName[VNCSERVERNAMELEN] = { '\0' };
- static bool exitMainloop = false;
- static const char *exitError = NULL;
- 
-+static CConn *cc;
-+
- void exit_vncviewer(const char *error)
- {
-   // Prioritise the first error we get as that is probably the most
-@@ -110,6 +112,16 @@ static void CleanupSignalHandler(int sig)
-   // CleanupSignalHandler allows C++ object cleanup to happen because it calls
-   // exit() rather than the default which is to abort.
-   vlog.info("CleanupSignalHandler called");
-+  delete cc;
-+  exit(1);
-+}
-+
-+static int CleanupXIOErrorHandler(Display *dpy)
-+{
-+  // CleanupSignalHandler allows C++ object cleanup to happen because it calls
-+  // exit() rather than the default which is to abort.
-+  vlog.info("XErrorHandler called");
-+  delete cc;
-   exit(1);
- }
- 
-@@ -384,6 +396,10 @@ int main(int argc, char** argv)
- 
-   init_fltk();
- 
-+  fl_open_display();
-+
-+  XSetIOErrorHandler(CleanupXIOErrorHandler);
-+
-   Configuration::enableViewerParams();
- 
-   /* Load the default parameter settings */
-@@ -484,7 +500,7 @@ int main(int argc, char** argv)
- #endif
-   }
- 
--  CConn *cc = new CConn(vncServerName, sock);
-+  cc = new CConn(vncServerName, sock);
- 
-   while (!exitMainloop) {
-     int next_timer;
diff --git a/contrib/packages/rpm/sle11/SOURCES/tigervnc-newfbsize.patch b/contrib/packages/rpm/sle11/SOURCES/tigervnc-newfbsize.patch
deleted file mode 100644
index 535e41d..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/tigervnc-newfbsize.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -up a/vncviewer/CConn.cxx.newfbsize b/vncviewer/CConn.cxx
---- a/vncviewer/CConn.cxx.newfbsize	2008-10-23 13:00:59.000000000 +0200
-+++ b/vncviewer/CConn.cxx	2008-10-23 13:01:11.000000000 +0200
-@@ -327,6 +327,8 @@ void CConn::beginRect(const Rect& r, uns
-   if (encoding != encodingCopyRect) {
-     lastServerEncoding = encoding;
-   }
-+  if (encoding == pseudoEncodingDesktopSize)
-+    setDesktopSize( r.width(), r.height() );
- }
- 
- void CConn::endRect(const Rect& r, int encoding)
diff --git a/contrib/packages/rpm/sle11/SOURCES/u_Avoid-use-after-free-in-dix-dixfonts.c-doImageText.patch b/contrib/packages/rpm/sle11/SOURCES/u_Avoid-use-after-free-in-dix-dixfonts.c-doImageText.patch
deleted file mode 100644
index 81b4a8a..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/u_Avoid-use-after-free-in-dix-dixfonts.c-doImageText.patch
+++ /dev/null
@@ -1,42 +0,0 @@
---- xorg-server-1.9.3/dix/dixfonts.c.orig	2010-10-31 03:47:09.000000000 +0100
-+++ xorg-server-1.9.3/dix/dixfonts.c	2013-10-28 16:12:38.696658572 +0100
-@@ -1500,6 +1500,7 @@
- 	    GC *pGC;
- 	    unsigned char *data;
- 	    ITclosurePtr new_closure;
-+	    ITclosurePtr old_closure;
- 
- 	    /* We're putting the client to sleep.  We need to
- 	       save some state.  Similar problem to that handled
-@@ -1512,6 +1513,7 @@
- 		err = BadAlloc;
- 		goto bail;
- 	    }
-+	    old_closure = c;
- 	    *new_closure = *c;
- 	    c = new_closure;
- 
-@@ -1519,6 +1521,7 @@
- 	    if (!data)
- 	    {
- 		free(c);
-+		c = old_closure;
- 		err = BadAlloc;
- 		goto bail;
- 	    }
-@@ -1530,6 +1533,7 @@
- 	    {
- 		free(c->data);
- 		free(c);
-+		c = old_closure;
- 		err = BadAlloc;
- 		goto bail;
- 	    }
-@@ -1543,6 +1547,7 @@
- 		FreeScratchGC(pGC);
- 		free(c->data);
- 		free(c);
-+		c = old_closure;
- 		err = BadAlloc;
- 		goto bail;
- 	    }
diff --git a/contrib/packages/rpm/sle11/SOURCES/u_tigervnc-1.3.0-fix-use-after-free.patch b/contrib/packages/rpm/sle11/SOURCES/u_tigervnc-1.3.0-fix-use-after-free.patch
deleted file mode 100644
index 226ac08..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/u_tigervnc-1.3.0-fix-use-after-free.patch
+++ /dev/null
@@ -1,115 +0,0 @@
-Author: Michal Srb <msrb@suse.com>
-Subject: Fix use after free in ZRLEEncoder.
-Patch-Mainline: To be upstreamed
-References: bnc#840433
-
-There is use after free crash when client using zrle disconnects:
-ZRLEEncoder contains zos variable (rdr::ZlibOutStream) and mos variable (pointer to rdr::MemOutStream).
-mos is always allocated in constructor (it could be a copy of static sharedMos pointer if sharedMos != 0, but it is always 0). 
-When ZRLEEncoder::writeRect is called, any of zrleEncode* functions sets mos as an underlying stream of zos.
-When ZRLEEncoder is destructed, mos is deleted (sharedMos is always 0), then zos is implicitly destructed, but zos accesses it's underlying stream in it's destructor!
-
-We need to destruct mos first and zos second when ZRLEEncoder is destructed.
-As sharedMos is never used, we can remove that, simplify ZRLEEncoder and turn zos into a member variable same as mos. They will be both implicitly destructed in reverse order of declaration.
-
-diff -ur tigervnc-1.3.0-orig/common/rfb/ZRLEEncoder.cxx tigervnc-1.3.0/common/rfb/ZRLEEncoder.cxx
---- tigervnc-1.3.0-orig/common/rfb/ZRLEEncoder.cxx	2013-09-17 00:18:28.557911306 +0300
-+++ tigervnc-1.3.0/common/rfb/ZRLEEncoder.cxx	2013-09-17 00:19:57.487915741 +0300
-@@ -26,7 +26,6 @@
- 
- using namespace rfb;
- 
--rdr::MemOutStream* ZRLEEncoder::sharedMos = 0;
- int ZRLEEncoder::maxLen = 4097 * 1024; // enough for width 16384 32-bit pixels
- 
- IntParameter zlibLevel("ZlibLevel","Zlib compression level",-1);
-@@ -55,33 +54,27 @@
- }
- 
- ZRLEEncoder::ZRLEEncoder(SMsgWriter* writer_)
--  : writer(writer_), zos(0,0,zlibLevel)
-+  : writer(writer_), zos(0,0,zlibLevel), mos(129*1024)
- {
--  if (sharedMos)
--    mos = sharedMos;
--  else
--    mos = new rdr::MemOutStream(129*1024);
- }
- 
- ZRLEEncoder::~ZRLEEncoder()
- {
--  if (!sharedMos)
--    delete mos;
- }
- 
- bool ZRLEEncoder::writeRect(const Rect& r, TransImageGetter* ig, Rect* actual)
- {
-   rdr::U8* imageBuf = writer->getImageBuf(64 * 64 * 4 + 4);
--  mos->clear();
-+  mos.clear();
-   bool wroteAll = true;
-   *actual = r;
- 
-   switch (writer->bpp()) {
-   case 8:
--    wroteAll = zrleEncode8(r, mos, &zos, imageBuf, maxLen, actual, ig);
-+    wroteAll = zrleEncode8(r, &mos, &zos, imageBuf, maxLen, actual, ig);
-     break;
-   case 16:
--    wroteAll = zrleEncode16(r, mos, &zos, imageBuf, maxLen, actual, ig);
-+    wroteAll = zrleEncode16(r, &mos, &zos, imageBuf, maxLen, actual, ig);
-     break;
-   case 32:
-     {
-@@ -94,16 +87,16 @@
-       if ((fitsInLS3Bytes && pf.isLittleEndian()) ||
-           (fitsInMS3Bytes && pf.isBigEndian()))
-       {
--        wroteAll = zrleEncode24A(r, mos, &zos, imageBuf, maxLen, actual, ig);
-+        wroteAll = zrleEncode24A(r, &mos, &zos, imageBuf, maxLen, actual, ig);
-       }
-       else if ((fitsInLS3Bytes && pf.isBigEndian()) ||
-                (fitsInMS3Bytes && pf.isLittleEndian()))
-       {
--        wroteAll = zrleEncode24B(r, mos, &zos, imageBuf, maxLen, actual, ig);
-+        wroteAll = zrleEncode24B(r, &mos, &zos, imageBuf, maxLen, actual, ig);
-       }
-       else
-       {
--        wroteAll = zrleEncode32(r, mos, &zos, imageBuf, maxLen, actual, ig);
-+        wroteAll = zrleEncode32(r, &mos, &zos, imageBuf, maxLen, actual, ig);
-       }
-       break;
-     }
-@@ -111,8 +104,8 @@
- 
-   writer->startRect(*actual, encodingZRLE);
-   rdr::OutStream* os = writer->getOutStream();
--  os->writeU32(mos->length());
--  os->writeBytes(mos->data(), mos->length());
-+  os->writeU32(mos.length());
-+  os->writeBytes(mos.data(), mos.length());
-   writer->endRect();
-   return wroteAll;
- }
-diff -ur tigervnc-1.3.0-orig/common/rfb/ZRLEEncoder.h tigervnc-1.3.0/common/rfb/ZRLEEncoder.h
---- tigervnc-1.3.0-orig/common/rfb/ZRLEEncoder.h	2013-09-17 00:18:28.558911306 +0300
-+++ tigervnc-1.3.0/common/rfb/ZRLEEncoder.h	2013-09-17 00:20:34.372917581 +0300
-@@ -38,16 +38,11 @@
-     // width, in this example about 128 bytes).
-     static void setMaxLen(int m) { maxLen = m; }
- 
--    // setSharedMos() sets a MemOutStream to be shared amongst all
--    // ZRLEEncoders.  Should be called before any ZRLEEncoders are created.
--    static void setSharedMos(rdr::MemOutStream* mos_) { sharedMos = mos_; }
--
-   private:
-     ZRLEEncoder(SMsgWriter* writer);
-     SMsgWriter* writer;
-+    rdr::MemOutStream mos;
-     rdr::ZlibOutStream zos;
--    rdr::MemOutStream* mos;
--    static rdr::MemOutStream* sharedMos;
-     static int maxLen;
-   };
- }
diff --git a/contrib/packages/rpm/sle11/SOURCES/u_xserver_xvfb-randr.patch b/contrib/packages/rpm/sle11/SOURCES/u_xserver_xvfb-randr.patch
deleted file mode 100644
index 5592887..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/u_xserver_xvfb-randr.patch
+++ /dev/null
@@ -1,186 +0,0 @@
---- xorg-server-1.9.3/hw/vfb/InitOutput.c	2010-06-11 08:10:22.000000000 +0200
-+++ xorg-server-1.9.3.new/hw/vfb/InitOutput.c	2013-07-03 15:31:50.119407430 +0200
-@@ -66,6 +66,7 @@
- #endif /* HAS_SHM */
- #include "dix.h"
- #include "miline.h"
-+#include "randrstr.h"
- 
- #define VFB_DEFAULT_WIDTH      1280
- #define VFB_DEFAULT_HEIGHT     1024
-@@ -804,6 +805,165 @@
- }
- 
- static Bool
-+vfbRROutputValidateMode(ScreenPtr           pScreen,
-+                        RROutputPtr         output,
-+                        RRModePtr           mode)
-+{
-+    rrScrPriv(pScreen);
-+
-+    if (pScrPriv->minWidth <= mode->mode.width &&
-+        pScrPriv->maxWidth >= mode->mode.width &&
-+        pScrPriv->minHeight <= mode->mode.height &&
-+        pScrPriv->maxHeight >= mode->mode.height)
-+        return TRUE;
-+    else
-+        return FALSE;
-+}
-+
-+static Bool
-+vfbRRScreenSetSize(ScreenPtr  pScreen,
-+                   CARD16     width,
-+                   CARD16     height,
-+                   CARD32     mmWidth,
-+                   CARD32     mmHeight)
-+{
-+    WindowPtr root = pScreen->root;
-+    WindowPtr layer;
-+    WindowPtr child;
-+    BoxRec box;
-+
-+    pScreen->width = width;
-+    pScreen->height = height;
-+    pScreen->mmWidth = mmWidth;
-+    pScreen->mmHeight = mmHeight;
-+
-+    // Resize the root window & adjust its clipping
-+    box.x1 = 0;
-+    box.y1 = 0;
-+    box.x2 = pScreen->width;
-+    box.y2 = pScreen->height;
-+    REGION_INIT(pScreen, &root->winSize, &box, 1);
-+    REGION_INIT(pScreen, &root->borderSize, &box, 1);
-+    REGION_RESET(pScreen, &root->borderClip, &box);
-+    root->drawable.width = pScreen->width;
-+    root->drawable.height = pScreen->height;
-+    REGION_BREAK (pScreen, &root->clipList);
-+
-+    // Update the clipping regions of all windows
-+    for (child = root->firstChild; child; child = child->nextSib)
-+        (*pScreen->MarkOverlappedWindows)(child, child, &layer);
-+
-+    if (root->firstChild)
-+    {
-+        (*pScreen->MarkOverlappedWindows)(root->firstChild,
-+                                          root->firstChild,
-+                                          (WindowPtr *)NULL);
-+    }
-+    else
-+    {
-+        (*pScreen->MarkWindow) (root);
-+    }
-+
-+    (*pScreen->ValidateTree)(root, NullWindow, VTOther);
-+    (*pScreen->HandleExposures)(root);
-+
-+    // Reposition top-level windows to fit new root size
-+    // XXX I assume this is what it does, but I'm not sure
-+    ResizeChildrenWinSize (root, 0, 0, 0, 0);
-+
-+
-+    // Check the pointer position
-+    WindowsRestructured ();
-+
-+    RRScreenSizeNotify (pScreen);
-+    RRTellChanged(pScreen);
-+
-+    // Flush resulting events, etc to clients
-+    FlushAllOutput ();
-+
-+    return TRUE;
-+}
-+
-+static Bool
-+vfbRRCrtcSet(ScreenPtr	pScreen,
-+             RRCrtcPtr	crtc,
-+             RRModePtr	mode,
-+             int	x,
-+             int	y,
-+             Rotation	rotation,
-+             int	numOutput,
-+             RROutputPtr *outputs)
-+{
-+  return RRCrtcNotify(crtc, mode, x, y, rotation, NULL, numOutput, outputs);
-+}
-+
-+static Bool
-+vfbRRGetInfo(ScreenPtr pScreen, Rotation *rotations)
-+{
-+    return TRUE;
-+}
-+
-+static Bool
-+vfbRandRInit(ScreenPtr pScreen)
-+{
-+    rrScrPrivPtr pScrPriv;
-+#if RANDR_12_INTERFACE
-+    RRModePtr	mode;
-+    RRCrtcPtr	crtc;
-+    RROutputPtr	output;
-+    xRRModeInfo modeInfo;
-+    char	name[64];
-+#endif
-+
-+    if (!RRScreenInit (pScreen))
-+	return FALSE;
-+    pScrPriv = rrGetScrPriv(pScreen);
-+    pScrPriv->rrGetInfo = vfbRRGetInfo;
-+#if RANDR_12_INTERFACE
-+    pScrPriv->rrCrtcSet = vfbRRCrtcSet;
-+    pScrPriv->rrScreenSetSize = vfbRRScreenSetSize;
-+    pScrPriv->rrOutputSetProperty = NULL;
-+#if RANDR_13_INTERFACE
-+    pScrPriv->rrOutputGetProperty = NULL;
-+#endif
-+    pScrPriv->rrOutputValidateMode = vfbRROutputValidateMode;
-+    pScrPriv->rrModeDestroy = NULL;
-+
-+    RRScreenSetSizeRange (pScreen,
-+			  1, 1,
-+			  pScreen->width, pScreen->height);
-+
-+    sprintf (name, "%dx%d", pScreen->width, pScreen->height);
-+    memset (&modeInfo, '\0', sizeof (modeInfo));
-+    modeInfo.width = pScreen->width;
-+    modeInfo.height = pScreen->height;
-+    modeInfo.nameLength = strlen (name);
-+
-+    mode = RRModeGet (&modeInfo, name);
-+    if (!mode)
-+	return FALSE;
-+
-+    crtc = RRCrtcCreate (pScreen, NULL);
-+    if (!crtc)
-+	return FALSE;
-+
-+    output = RROutputCreate (pScreen, "screen", 6, NULL);
-+    if (!output)
-+	return FALSE;
-+    if (!RROutputSetClones (output, NULL, 0))
-+	return FALSE;
-+    if (!RROutputSetModes (output, &mode, 1, 0))
-+	return FALSE;
-+    if (!RROutputSetCrtcs (output, &crtc, 1))
-+	return FALSE;
-+    if (!RROutputSetConnection (output, RR_Connected))
-+	return FALSE;
-+    RRCrtcNotify (crtc, mode, 0, 0, RR_Rotate_0, NULL, 1, &output);
-+#endif
-+    return TRUE;
-+}
-+
-+static Bool
- vfbScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
- {
-     vfbScreenInfoPtr pvfb = &vfbScreens[index];
-@@ -875,6 +1035,9 @@
- 
-     if (!ret) return FALSE;
- 
-+    if (!vfbRandRInit(pScreen))
-+       return FALSE;
-+
-     miInitializeBackingStore(pScreen);
- 
-     /*
diff --git a/contrib/packages/rpm/sle11/SOURCES/use-last-screen.patch b/contrib/packages/rpm/sle11/SOURCES/use-last-screen.patch
deleted file mode 100644
index 9d4906b..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/use-last-screen.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From ee0e658bb6cb0d1290072090f1de90ff44145365 Mon Sep 17 00:00:00 2001
-From: Dan Nicholson <dbn.lists@gmail.com>
-Date: Thu, 16 Dec 2010 06:01:06 -0800
-Subject: [PATCH] xfree86: Use last Screen section found to prefer xorg.conf
-
-Allowing multiple .conf files with xorg.conf.d works well for InputClass
-where any section in xorg.conf would override settings from previous
-.conf files typically installed by the distro. This does not work well
-with Screen sections where the first section found has been used when
-the Layout doesn't specify a Screen. Instead, use the last Screen
-section found to give preference to xorg.conf and match the InputScreen
-semantics.
-
-Signed-off-by: Dan Nicholson <dbn.lists@gmail.com>
----
- hw/xfree86/common/xf86Config.c |   10 ++++++++--
- 1 files changed, 8 insertions(+), 2 deletions(-)
-
-diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
-index 5800700..b2fc8e3 100644
---- a/hw/xfree86/common/xf86Config.c
-+++ b/hw/xfree86/common/xf86Config.c
-@@ -1678,7 +1678,7 @@ configLayout(serverLayoutPtr servlayoutp, XF86ConfLayoutPtr conf_layout,
- }
- 
- /*
-- * No layout section, so find the first Screen section and set that up as
-+ * No layout section, so find the last Screen section and set that up as
-  * the only active screen.
-  */
- static Bool
-@@ -1697,7 +1697,7 @@ configImpliedLayout(serverLayoutPtr servlayoutp, XF86ConfScreenPtr conf_screen,
-     /*
-      * which screen section is the active one?
-      *
--     * If there is a -screen option, use that one, otherwise use the first
-+     * If there is a -screen option, use that one, otherwise use the last
-      * one.
-      */
- 
-@@ -1710,6 +1710,12 @@ configImpliedLayout(serverLayoutPtr servlayoutp, XF86ConfScreenPtr conf_screen,
- 	}
- 	conf_screen = s;
- 	from = X_CMDLINE;
-+    } else if (conf_screen) {
-+	/* Use the last Screen in the list */
-+	s = conf_screen;
-+	while (s->list.next)
-+	    s = s->list.next;
-+	conf_screen = s;
-     }
- 
-     /* We have exactly one screen */
--- 
-1.7.2.3
-
diff --git a/contrib/packages/rpm/sle11/SOURCES/vidmode-sig11.diff b/contrib/packages/rpm/sle11/SOURCES/vidmode-sig11.diff
deleted file mode 100644
index 3d4866e..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/vidmode-sig11.diff
+++ /dev/null
@@ -1,13 +0,0 @@
-Index: hw/xfree86/common/xf86VidMode.c
-================================================================================
---- hw/xfree86/common/xf86VidMode.c
-+++ hw/xfree86/common/xf86VidMode.c
-@@ -220,6 +220,8 @@
- 
-     pScrn = xf86Screens[scrnIndex];
-     pVidMode = VMPTR(pScrn->pScreen);
-+    if (!pScrn->modes)
-+	return FALSE;
-     pVidMode->First = pScrn->modes;
-     pVidMode->Next =  pVidMode->First->next;
- 
diff --git a/contrib/packages/rpm/sle11/SOURCES/vnc-httpd.firewall b/contrib/packages/rpm/sle11/SOURCES/vnc-httpd.firewall
deleted file mode 100644
index d476d70..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/vnc-httpd.firewall
+++ /dev/null
@@ -1,4 +0,0 @@
-## Name: VNC mini-HTTP server
-## Description: Opens the VNC HTTP ports so that browsers can connect.
-
-TCP="5800:5899"
diff --git a/contrib/packages/rpm/sle11/SOURCES/vnc-server.firewall b/contrib/packages/rpm/sle11/SOURCES/vnc-server.firewall
deleted file mode 100644
index c0f3ec9..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/vnc-server.firewall
+++ /dev/null
@@ -1,4 +0,0 @@
-## Name: VNC
-## Description: Opens VNC server ports so that viewers can connect.
-
-TCP="5900:5999"
diff --git a/contrib/packages/rpm/sle11/SOURCES/vnc.reg b/contrib/packages/rpm/sle11/SOURCES/vnc.reg
deleted file mode 100644
index 154e805..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/vnc.reg
+++ /dev/null
@@ -1,42 +0,0 @@
-#############################################################################
-#
-# OpenSLP registration file
-#
-# register VNC remote logins via kdm
-# You need also to allow remote logins
-#
-#############################################################################
-
-# Register VNC service for krdc (KDE VNC client in kdenetwork)
-service:remotedesktop.kde:vnc://$HOSTNAME:5901,en,65535
-tcp-port=5901
-description=VNC remote login [1024x768]
-
-# Register VNC service for krdc (KDE VNC client in kdenetwork)
-service:remotedesktop.kde:vnc://$HOSTNAME:5902,en,65535
-tcp-port=5902
-description=VNC remote login [1280x1024]
-
-# Register VNC service for krdc (KDE VNC client in kdenetwork)
-service:remotedesktop.kde:vnc://$HOSTNAME:5903,en,65535
-tcp-port=5903
-description=VNC remote login [1600x1200]
-
-# Register VNC service for Java clients
-# Can be used with every Web browser with enabled Java
-service:remotedesktop.java:http://$HOSTNAME:5801,en,65535
-tcp-port=5801
-description=VNC remote login [1024x768]
-
-# Register VNC service for Java clients
-# Can be used with every Web browser with enabled Java
-service:remotedesktop.java:http://$HOSTNAME:5802,en,65535
-tcp-port=5802
-description=VNC remote login [1280x1024]
-
-# Register VNC service for Java clients
-# Can be used with every Web browser with enabled Java
-service:remotedesktop.java:http://$HOSTNAME:5803,en,65535
-tcp-port=5803
-description=VNC remote login [1600x1200]
-
diff --git a/contrib/packages/rpm/sle11/SOURCES/vnc.xinetd b/contrib/packages/rpm/sle11/SOURCES/vnc.xinetd
deleted file mode 100644
index 4ecf863..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/vnc.xinetd
+++ /dev/null
@@ -1,90 +0,0 @@
-# default: off
-# description: This serves out a VNC connection which starts at a KDM login \
-#	prompt. This VNC connection has a resolution of 1024x768, 16bit depth.
-service vnc1
-{
-	type		= UNLISTED
-	port		= 5901
-	socket_type	= stream
-	protocol	= tcp
-	wait		= no
-	user		= nobody
-	server		= /usr/bin/Xvnc
-	server_args	= -noreset -inetd -once -query localhost -geometry 1024x768 -depth 16 -securitytypes none
-	disable		= yes
-}
-# default: off
-# description: This serves out a VNC connection which starts at a KDM login \
-#	prompt. This VNC connection has a resolution of 1280x1024, 16bit depth.
-service vnc2
-{
-	type		= UNLISTED
-	port		= 5902
-	socket_type	= stream
-	protocol	= tcp
-	wait		= no
-	user		= nobody
-	server		= /usr/bin/Xvnc
-	server_args	= -noreset -inetd -once -query localhost -geometry 1280x1024 -depth 16 -securitytypes none
-	disable		= yes
-}
-# default: off
-# description: This serves out a VNC connection which starts at a KDM login \
-#	prompt. This VNC connection has a resolution of 1600x1200, 16bit depth.
-service vnc3
-{
-	type		= UNLISTED
-	port		= 5903
-	socket_type	= stream
-	protocol	= tcp
-	wait		= no
-	user		= nobody
-	server		= /usr/bin/Xvnc
-	server_args	= -noreset -inetd -once -query localhost -geometry 1600x1200 -depth 16 -securitytypes none
-	disable		= yes
-}
-# default: off
-# description: This serves out the vncviewer Java applet for the VNC \
-#	server running on port 5901, (vnc port 1).
-service vnchttpd1
-{
-	type		= UNLISTED
-	port		= 5801
-	socket_type	= stream
-	protocol	= tcp
-	wait		= no
-	user		= nobody
-	server		= /usr/bin/vnc_inetd_httpd
-	server_args	= 1024 768 5901
-	disable		= yes
-}
-# default: off
-# description: This serves out the vncviewer Java applet for the VNC \
-#	server running on port 5902, (vnc port 2).
-service vnchttpd2
-{
-	type		= UNLISTED
-	port		= 5802
-	socket_type	= stream
-	protocol	= tcp
-	wait		= no
-	user		= nobody
-	server		= /usr/bin/vnc_inetd_httpd
-	server_args	= 1280 1024 5902
-	disable		= yes
-}
-# default: off
-# description: This serves out the vncviewer Java applet for the VNC \
-#	server running on port 5902, (vnc port 3).
-service vnchttpd3
-{
-	type		= UNLISTED
-	port		= 5803
-	socket_type	= stream
-	protocol	= tcp
-	wait		= no
-	user		= nobody
-	server		= /usr/bin/vnc_inetd_httpd
-	server_args	= 1600 1200 5903
-	disable		= yes
-}
diff --git a/contrib/packages/rpm/sle11/SOURCES/vnc_inetd_httpd b/contrib/packages/rpm/sle11/SOURCES/vnc_inetd_httpd
deleted file mode 100644
index f50ca42..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/vnc_inetd_httpd
+++ /dev/null
Binary files differ
diff --git a/contrib/packages/rpm/sle11/SOURCES/xephyr.diff b/contrib/packages/rpm/sle11/SOURCES/xephyr.diff
deleted file mode 100644
index 316df96..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/xephyr.diff
+++ /dev/null
@@ -1,21 +0,0 @@
-Index: hw/kdrive/Makefile.am
-================================================================================
---- hw/kdrive/Makefile.am
-+++ hw/kdrive/Makefile.am
-@@ -1,5 +1,5 @@
- if BUILD_KDRIVEFBDEVLIB
--FBDEV_SUBDIRS = fbdev
-+FBDEV_SUBDIRS =
- endif
- 
- if XFAKESERVER
-@@ -16,8 +16,7 @@
- 
- SERVER_SUBDIRS = 		\
- 	$(FBDEV_SUBDIRS)	\
--	$(XEPHYR_SUBDIRS)       \
--	$(XFAKE_SUBDIRS)
-+	$(XEPHYR_SUBDIRS)
- 
- SUBDIRS =			\
- 	src			\
diff --git a/contrib/packages/rpm/sle11/SOURCES/xorg-detect-psb.patch b/contrib/packages/rpm/sle11/SOURCES/xorg-detect-psb.patch
deleted file mode 100644
index 9b8ce29..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/xorg-detect-psb.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-Index: xorg-server-1.6.3.901/hw/xfree86/common/xf86pciBus.c
-===============================================================================
---- xorg-server-1.7.99/hw/xfree86/common/xf86pciBus.c
-+++ xorg-server-1.7.99/hw/xfree86/common/xf86pciBus.c
-@@ -186,12 +186,14 @@
- 	case 0x3d3d:		    driverList[0] = "glint"; break;
- 	case 0x105d:		    driverList[0] = "i128"; break;
- 	case 0x8086:
--	    if ((dev->device_id == 0x00d1) || (dev->device_id == 0x7800)) {
--		driverList[0] = "i740";
--            } else if (dev->device_id == 0x8108) {
--                break; /* "hooray" for poulsbo */
--	    } else {
--		driverList[0] = "intel";
-+	    switch (dev->device_id)
-+	    {
-+		case 0x00d1: case 0x7800:
-+		    driverList[0] = "i740"; break;
-+		case 0x8109: case 0x8108: case 0x4102:
-+		    driverList[0] = "psb"; driverList[1] = "psb_drv"; break;
-+		default:
-+		    driverList[0] = "intel"; break;
- 	    }
- 	    break;
- 	case 0x102b:		    driverList[0] = "mga";	break;
diff --git a/contrib/packages/rpm/sle11/SOURCES/xorg-docs.diff b/contrib/packages/rpm/sle11/SOURCES/xorg-docs.diff
deleted file mode 100644
index ee182fe..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/xorg-docs.diff
+++ /dev/null
@@ -1,29 +0,0 @@
---- man/Makefile.am.orig	2010-09-14 01:25:46.000000000 +0200
-+++ man/Makefile.am	2010-11-12 13:28:31.000000000 +0100
-@@ -23,12 +23,8 @@
- miscmandir = $(MISC_MAN_DIR)
- 
- miscman_PRE =			\
--	Consortium.man		\
- 	Xsecurity.man		\
--	Standards.man		\
--	X.man			\
--	XOrgFoundation.man	\
--	XProjectTeam.man
-+	X.man
- 
- miscman_DATA = $(miscman_PRE:man=@MISC_MAN_SUFFIX@)
- 
---- Makefile.am.orig	2010-11-12 13:45:19.000000000 +0100
-+++ Makefile.am	2010-11-12 13:45:32.000000000 +0100
-@@ -20,9 +20,7 @@
- #
- #  Process this file with autoconf to create configure.
- 
--SUBDIRS = general man specs
--
--dist_doc_DATA = MAINTAINERS
-+SUBDIRS = man
- 
- MAINTAINERCLEANFILES = ChangeLog INSTALL
- EXTRA_DIST = \
diff --git a/contrib/packages/rpm/sle11/SOURCES/xorg-server-1.8.0.diff b/contrib/packages/rpm/sle11/SOURCES/xorg-server-1.8.0.diff
deleted file mode 100644
index 1dc3ba3..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/xorg-server-1.8.0.diff
+++ /dev/null
@@ -1,11 +0,0 @@
---- config/Makefile.am.orig	2010-06-11 04:14:57.000000000 +0200
-+++ config/Makefile.am	2010-08-23 15:47:19.000000000 +0200
-@@ -9,7 +9,7 @@
- libconfig_la_SOURCES += udev.c
- libconfig_la_LIBADD = $(UDEV_LIBS)
- 
--xorgconfddir = $(datadir)/X11/$(XF86CONFIGDIR)
-+xorgconfddir = $(sysconfdir)/X11/$(XF86CONFIGDIR)
- xorgconfd_DATA = 10-evdev.conf
- 
- else
diff --git a/contrib/packages/rpm/sle11/SOURCES/xorg-server-1.9.3.tar.bz2 b/contrib/packages/rpm/sle11/SOURCES/xorg-server-1.9.3.tar.bz2
deleted file mode 100644
index 50d23cf..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/xorg-server-1.9.3.tar.bz2
+++ /dev/null
Binary files differ
diff --git a/contrib/packages/rpm/sle11/SOURCES/xorg-server-nohwaccess.diff b/contrib/packages/rpm/sle11/SOURCES/xorg-server-nohwaccess.diff
deleted file mode 100644
index 681e036..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/xorg-server-nohwaccess.diff
+++ /dev/null
@@ -1,52 +0,0 @@
-Index: xorg-server-1.6.3/hw/xfree86/os-support/linux/lnx_init.c
-===================================================================
-Index: xorg-server-1.6.3/hw/xfree86/os-support/linux/lnx_video.c
-===================================================================
---- xorg-server-1.6.3.orig/hw/xfree86/os-support/linux/lnx_video.c
-+++ xorg-server-1.6.3/hw/xfree86/os-support/linux/lnx_video.c
-@@ -51,6 +51,7 @@
- #define MAP_FAILED ((void *)-1)
- #endif
- 
-+extern Bool NoHwAccess;
- static Bool ExtendedEnabled = FALSE;
- 
- #ifdef __ia64__
-@@ -509,6 +510,9 @@ xf86EnableIO(void)
- 	int fd;
- 	unsigned int ioBase_phys;
- #endif
-+	/* Fake it... */
-+	if (NoHwAccess)
-+		return TRUE;
- 
- 	if (ExtendedEnabled)
- 		return TRUE;
---- xorg-server-1.9.0/hw/xfree86/os-support/linux/lnx_init.c.orig	2010-06-10 16:07:55.000000000 +0200
-+++ xorg-server-1.9.0/hw/xfree86/os-support/linux/lnx_init.c	2010-08-23 15:38:45.000000000 +0200
-@@ -42,6 +42,7 @@ static Bool KeepTty = FALSE;
- static int VTnum = -1;
- static Bool VTSwitch = TRUE;
- static Bool ShareVTs = FALSE;
-+Bool NoHwAccess = FALSE;
- static int activeVT = -1;
- 
- static int vtPermSave[4];
-@@ -377,6 +378,11 @@ xf86ProcessArgument(int argc, char *argv
-                 ShareVTs = TRUE;
-                 return 1;
-         }
-+	if (!strcmp(argv[i], "-nohwaccess"))
-+	{
-+		NoHwAccess = TRUE;
-+		return(1);
-+	}
- 	if ((argv[i][0] == 'v') && (argv[i][1] == 't'))
- 	{
- 		if (sscanf(argv[i], "vt%2d", &VTnum) == 0)
-@@ -398,4 +404,5 @@ xf86UseMsg(void)
- 	ErrorF("don't detach controlling tty (for debugging only)\n");
- 	ErrorF("-novtswitch            don't immediately switch to new VT\n");
- 	ErrorF("-sharevts              share VTs with another X server\n");
-+	ErrorF("-nohwaccess            don't access hardware ports directly\n");
- }
diff --git a/contrib/packages/rpm/sle11/SOURCES/xorg-server-option_libxf86config.diff b/contrib/packages/rpm/sle11/SOURCES/xorg-server-option_libxf86config.diff
deleted file mode 100644
index 319ef3d..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/xorg-server-option_libxf86config.diff
+++ /dev/null
@@ -1,122 +0,0 @@
---- hw/xfree86/parser/InputClass.c.orig	2010-08-13 07:53:48.000000000 +0200
-+++ hw/xfree86/parser/InputClass.c	2010-08-23 15:55:16.000000000 +0200
-@@ -65,6 +65,47 @@ xf86ConfigSymTabRec InputClassTab[] =
- 
- #define TOKEN_SEP "|"
- 
-+/*
-+ * Tokenize a string into a NULL terminated array of strings. Always returns
-+ * an allocated array unless an error occurs.
-+ */
-+char**
-+m_xstrtokenize(const char *str, const char *separators)
-+{
-+    char **list, **nlist;
-+    char *tok, *tmp;
-+    unsigned num = 0, n;
-+
-+    if (!str)
-+        return NULL;
-+    list = calloc(1, sizeof(*list));
-+    if (!list)
-+        return NULL;
-+    tmp = strdup(str);
-+    if (!tmp)
-+        goto error;
-+    for (tok = strtok(tmp, separators); tok; tok = strtok(NULL, separators)) {
-+        nlist = realloc(list, (num + 2) * sizeof(*list));
-+        if (!nlist)
-+            goto error;
-+        list = nlist;
-+        list[num] = strdup(tok);
-+        if (!list[num])
-+            goto error;
-+        list[++num] = NULL;
-+    }
-+    free(tmp);
-+    return list;
-+
-+error:
-+    free(tmp);
-+    for (n = 0; n < num; n++)
-+        free(list[n]);
-+    free(list);
-+    return NULL;
-+}
-+
-+
- static void
- add_group_entry(struct list *head, char **values)
- {
-@@ -125,49 +166,49 @@ xf86parseInputClassSection(void)
-             if (xf86getSubToken(&(ptr->comment)) != STRING)
-                 Error(QUOTE_MSG, "MatchProduct");
-             add_group_entry(&ptr->match_product,
--                            xstrtokenize(val.str, TOKEN_SEP));
-+                            m_xstrtokenize(val.str, TOKEN_SEP));
-             break;
-         case MATCH_VENDOR:
-             if (xf86getSubToken(&(ptr->comment)) != STRING)
-                 Error(QUOTE_MSG, "MatchVendor");
-             add_group_entry(&ptr->match_vendor,
--                            xstrtokenize(val.str, TOKEN_SEP));
-+                            m_xstrtokenize(val.str, TOKEN_SEP));
-             break;
-         case MATCH_DEVICE_PATH:
-             if (xf86getSubToken(&(ptr->comment)) != STRING)
-                 Error(QUOTE_MSG, "MatchDevicePath");
-             add_group_entry(&ptr->match_device,
--                            xstrtokenize(val.str, TOKEN_SEP));
-+                            m_xstrtokenize(val.str, TOKEN_SEP));
-             break;
-         case MATCH_OS:
-             if (xf86getSubToken(&(ptr->comment)) != STRING)
-                 Error(QUOTE_MSG, "MatchOS");
-             add_group_entry(&ptr->match_os,
--                            xstrtokenize(val.str, TOKEN_SEP));
-+                            m_xstrtokenize(val.str, TOKEN_SEP));
-             break;
-         case MATCH_PNPID:
-             if (xf86getSubToken(&(ptr->comment)) != STRING)
-                 Error(QUOTE_MSG, "MatchPnPID");
-             add_group_entry(&ptr->match_pnpid,
--                            xstrtokenize(val.str, TOKEN_SEP));
-+                            m_xstrtokenize(val.str, TOKEN_SEP));
-             break;
-         case MATCH_USBID:
-             if (xf86getSubToken(&(ptr->comment)) != STRING)
-                 Error(QUOTE_MSG, "MatchUSBID");
-             add_group_entry(&ptr->match_usbid,
--                            xstrtokenize(val.str, TOKEN_SEP));
-+                            m_xstrtokenize(val.str, TOKEN_SEP));
-             break;
-         case MATCH_DRIVER:
-             if (xf86getSubToken(&(ptr->comment)) != STRING)
-                 Error(QUOTE_MSG, "MatchDriver");
-             add_group_entry(&ptr->match_driver,
--                            xstrtokenize(val.str, TOKEN_SEP));
-+                            m_xstrtokenize(val.str, TOKEN_SEP));
-             break;
-         case MATCH_TAG:
-             if (xf86getSubToken(&(ptr->comment)) != STRING)
-                 Error(QUOTE_MSG, "MatchTag");
-             add_group_entry(&ptr->match_tag,
--                            xstrtokenize(val.str, TOKEN_SEP));
-+                            m_xstrtokenize(val.str, TOKEN_SEP));
-             break;
-         case MATCH_IS_KEYBOARD:
-             if (xf86getSubToken(&(ptr->comment)) != STRING)
---- hw/xfree86/parser/Layout.c
-+++ hw/xfree86/parser/Layout.c
-@@ -449,7 +449,10 @@
-     /* add all AutoServerLayout devices to the server layout */
-     while (input)
-     {
--	if (xf86CheckBoolOption(input->inp_option_lst, "AutoServerLayout", FALSE))
-+	Bool asl_value = FALSE;
-+	char *s = xf86findOptionValue(input->inp_option_lst ,"AutoServerLayout");
-+	Bool asl_found = xf86getBoolValue(&asl_value, s);
-+	if (asl_found == TRUE && asl_value == TRUE)
- 	{
- 	    XF86ConfInputrefPtr iref = layout->lay_input_lst;
- 
diff --git a/contrib/packages/rpm/sle11/SOURCES/xorg-server-stop-cpu-eating.diff b/contrib/packages/rpm/sle11/SOURCES/xorg-server-stop-cpu-eating.diff
deleted file mode 100644
index e302ff1..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/xorg-server-stop-cpu-eating.diff
+++ /dev/null
@@ -1,34 +0,0 @@
-From a6b9e8f1e5d5d0b3b0f121a6f677eeca7aab1950 Mon Sep 17 00:00:00 2001
-From: Adam Jackson <ajax@redhat.com>
-Date: Wed, 25 Aug 2010 15:06:38 +0000
-Subject: linux: Fix CPU usage bug in console fd flushing
-
-If the vt gets a vhangup from under us, then the tty will appear ready
-in select(), but trying to tcflush() it will return -EIO, so we'll spin
-around at 100% CPU for no reason.  Notice this condition and unregister
-the handler if it happens.
-
-Signed-off-by: Adam Jackson <ajax@redhat.com>
-Reviewed-by: Mikhail Gusarov <dottedmag@dottedmag.net>
-Reviewed-by: Julien Cristau <jcristau@debian.org>
-Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
----
-diff --git a/hw/xfree86/os-support/linux/lnx_init.c b/hw/xfree86/os-support/linux/lnx_init.c
-index bf61ceb..7ee9046 100644
---- a/hw/xfree86/os-support/linux/lnx_init.c
-+++ b/hw/xfree86/os-support/linux/lnx_init.c
-@@ -85,7 +85,11 @@ static void *console_handler;
- static void
- drain_console(int fd, void *closure)
- {
--    tcflush(fd, TCIOFLUSH);
-+    errno = 0;
-+    if (tcflush(fd, TCIOFLUSH) == -1 && errno == EIO) {
-+	xf86RemoveGeneralHandler(console_handler);
-+	console_handler = NULL;
-+    }
- }
- 
- void
---
-cgit v0.8.3-6-g21f6
diff --git a/contrib/packages/rpm/sle11/SOURCES/xorg-server-xdmcp.patch b/contrib/packages/rpm/sle11/SOURCES/xorg-server-xdmcp.patch
deleted file mode 100644
index f405a28..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/xorg-server-xdmcp.patch
+++ /dev/null
@@ -1,28 +0,0 @@
---- xorg-server-1.6.5/os/access.c
-+++ xorg-server-1.6.5/os/access.c
-@@ -781,7 +781,9 @@
- 
- 	    /* 
- 	     * ignore 'localhost' entries as they're not useful
--	     * on the other end of the wire
-+	     * on the other end of the wire and because on hosts
-+	     * with shared home dirs they'll result in conflic
-+	     * entries in ~/.Xauthority
- 	     */
- 	    if (ifr->ifa_flags & IFF_LOOPBACK) 
- 		    continue;
-@@ -804,6 +806,14 @@
- 	    else if (family == FamilyInternet6 && 
- 	      IN6_IS_ADDR_LOOPBACK((struct in6_addr *)addr))
- 		continue;
-+
-+            /* Ignore IPv6 link local addresses (fe80::/10), because
-+             * they need a scope identifier, which we have no way
-+             * of telling to the other end.
-+             */
-+            if (family == FamilyInternet6 &&
-+              IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)addr))
-+                continue;
- #endif
- 	    XdmcpRegisterConnection(family, (char *)addr, len);
- #if defined(IPv6) && defined(AF_INET6)
diff --git a/contrib/packages/rpm/sle11/SOURCES/xorg-x11-nonroot-vesa.patch b/contrib/packages/rpm/sle11/SOURCES/xorg-x11-nonroot-vesa.patch
deleted file mode 100644
index 6bd3c7e..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/xorg-x11-nonroot-vesa.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-Index: xorg-server-1.6.3.901/hw/xfree86/common/xf86AutoConfig.c
-================================================================================
---- xorg-server-1.7.99/hw/xfree86/common/xf86AutoConfig.c
-+++ xorg-server-1.7.99/hw/xfree86/common/xf86AutoConfig.c
-@@ -535,7 +535,8 @@
- #if !defined(__linux__) && defined(__sparc__)
- 	matches[i++] = xnfstrdup("wsfb");
- #else
--	matches[i++] = xnfstrdup("vesa");
-+	if (geteuid() == 0)
-+	    matches[i++] = xnfstrdup("vesa");
- #endif
-     }
- }
diff --git a/contrib/packages/rpm/sle11/SOURCES/xserver-1.6.1-nouveau.patch b/contrib/packages/rpm/sle11/SOURCES/xserver-1.6.1-nouveau.patch
deleted file mode 100644
index 6163101..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/xserver-1.6.1-nouveau.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-Also, don't treat DRI setup failure as an error for nouveau.
----
-
-diff --git a/glx/glxdri.c b/glx/glxdri.c
-index 21e44d1..30b820c 100644
---- a/glx/glxdri.c
-+++ b/glx/glxdri.c
-@@ -968,6 +968,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
-     const __DRIconfig **driConfigs;
-     const __DRIextension **extensions;
-     int i;
-+    int from = X_ERROR;
- 
-     if (!xf86LoaderCheckSymbol("DRIQueryDirectRenderingCapable") ||
- 	!DRIQueryDirectRenderingCapable(pScreen, &isCapable) ||
-@@ -1047,7 +1048,9 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
- 
-     screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
-     if (screen->driver == NULL) {
--	LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
-+	if (!strcmp(driverName, "nouveau"))
-+	    from = X_INFO;
-+	LogMessage(from, "AIGLX error: dlopen of %s failed (%s)\n",
- 		   filename, dlerror());
-         goto handle_error;
-     }
-@@ -1184,7 +1187,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
- 
-     free(screen);
- 
--    LogMessage(X_ERROR, "AIGLX: reverting to software rendering\n");
-+    LogMessage(from, "AIGLX: reverting to software rendering\n");
- 
-     return NULL;
- }
-diff --git a/glx/glxdri2.c b/glx/glxdri2.c
-index 0f998de..a244809 100644
---- a/glx/glxdri2.c
-+++ b/glx/glxdri2.c
-@@ -676,6 +676,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
-     const __DRIextension **extensions;
-     const __DRIconfig **driConfigs;
-     int i;
-+    int from = X_ERROR;
- 
-     screen = calloc(1, sizeof *screen);
-     if (screen == NULL)
-@@ -702,7 +703,9 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
- 
-     screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
-     if (screen->driver == NULL) {
--	LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
-+	if (!strcmp(driverName, "nouveau"))
-+	    from = X_INFO;
-+	LogMessage(from, "AIGLX error: dlopen of %s failed (%s)\n",
- 		   filename, dlerror());
-         goto handle_error;
-     }
-@@ -793,7 +796,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
- 
-     free(screen);
- 
--    LogMessage(X_ERROR, "AIGLX: reverting to software rendering\n");
-+    LogMessage(from, "AIGLX: reverting to software rendering\n");
- 
-     return NULL;
- }
diff --git a/contrib/packages/rpm/sle11/SOURCES/xserver-bg-none-root.patch b/contrib/packages/rpm/sle11/SOURCES/xserver-bg-none-root.patch
deleted file mode 100644
index 4517de7..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/xserver-bg-none-root.patch
+++ /dev/null
@@ -1,155 +0,0 @@
-From a3e15680da24cb8259f6a83dee0c930dab024290 Mon Sep 17 00:00:00 2001
-From: Kristian <krh@redhat.com>
-Date: Fri, 15 Aug 2008 15:15:14 +1000
-Subject: [PATCH] Add nr for background=none root
-
----
- dix/globals.c                |    1 +
- dix/window.c                 |   22 ++++++++++++----------
- hw/xfree86/common/xf86Init.c |   11 +++++++++++
- hw/xfree86/common/xf86str.h  |    5 ++++-
- include/opaque.h             |    1 +
- os/utils.c                   |    3 +++
- 6 files changed, 32 insertions(+), 11 deletions(-)
-
-Index: xorg-server-1.8.0/dix/globals.c
-===================================================================
-Index: xorg-server-1.8.0/dix/window.c
-===================================================================
---- xorg-server-1.8.0.orig/dix/window.c
-+++ xorg-server-1.8.0/dix/window.c
-@@ -465,23 +465,24 @@ InitRootWindow(WindowPtr pWin)
-     pWin->cursorIsNone = FALSE;
-     pWin->optional->cursor = rootCursor;
-     rootCursor->refcnt++;
--
-+    pWin->backingStore = defaultBackingStore;
-+    pWin->forcedBS = (defaultBackingStore != NotUseful);
- 
-     if (party_like_its_1989) {
-         MakeRootTile(pWin);
-         backFlag |= CWBackPixmap;
-+        pScreen->ChangeWindowAttributes(pWin, backFlag);
-+    } else if (bgNoneRoot) {
-+	/* nothing, handled in xf86CreateRootWindow */
-     } else {
- 	if (whiteRoot)
-             pWin->background.pixel = pScreen->whitePixel;
-         else
-             pWin->background.pixel = pScreen->blackPixel;
-         backFlag |= CWBackPixel;
--    } 
- 
--    pWin->backingStore = defaultBackingStore;
--    pWin->forcedBS = (defaultBackingStore != NotUseful);
--    /* We SHOULD check for an error value here XXX */
--    (*pScreen->ChangeWindowAttributes)(pWin, backFlag);
-+        pScreen->ChangeWindowAttributes(pWin, backFlag);
-+    }
- 
-     MapWindow(pWin, serverClient);
- }
-Index: xorg-server-1.8.0/hw/xfree86/common/xf86Init.c
-===================================================================
-Index: xorg-server-1.8.0/hw/xfree86/common/xf86str.h
-===================================================================
---- xorg-server-1.8.0.orig/hw/xfree86/common/xf86str.h
-+++ xorg-server-1.8.0/hw/xfree86/common/xf86str.h
-@@ -503,7 +503,7 @@ typedef struct _confdrirec {
- } confDRIRec, *confDRIPtr;
- 
- /* These values should be adjusted when new fields are added to ScrnInfoRec */
--#define NUM_RESERVED_INTS		16
-+#define NUM_RESERVED_INTS		15
- #define NUM_RESERVED_POINTERS		14
- #define NUM_RESERVED_FUNCS		11
- 
-@@ -775,6 +775,9 @@ typedef struct _ScrnInfoRec {
-     ClockRangePtr	clockRanges;
-     int			adjustFlags;
- 
-+    /* -nr support */
-+    int			canDoBGNoneRoot;
-+
-     /*
-      * These can be used when the minor ABI version is incremented.
-      * The NUM_* parameters must be reduced appropriately to keep the
-Index: xorg-server-1.8.0/include/opaque.h
-===================================================================
---- xorg-server-1.8.0.orig/include/opaque.h
-+++ xorg-server-1.8.0/include/opaque.h
-@@ -71,6 +71,7 @@ extern _X_EXPORT Bool defeatAccessContro
- extern _X_EXPORT long maxBigRequestSize;
- extern _X_EXPORT Bool party_like_its_1989;
- extern _X_EXPORT Bool whiteRoot;
-+extern _X_EXPORT Bool bgNoneRoot;
- 
- extern _X_EXPORT Bool CoreDump;
- 
-Index: xorg-server-1.8.0/os/utils.c
-===================================================================
---- xorg-server-1.8.0.orig/os/utils.c
-+++ xorg-server-1.8.0/os/utils.c
-@@ -511,6 +511,7 @@ void UseMsg(void)
- #endif
-     ErrorF("-nolisten string       don't listen on protocol\n");
-     ErrorF("-noreset               don't reset after last client exists\n");
-+    ErrorF("-nr                    create root window with no background\n");
-     ErrorF("-reset                 reset after last client exists\n");
-     ErrorF("-p #                   screen-saver pattern duration (minutes)\n");
-     ErrorF("-pn                    accept failure to listen on all ports\n");
-@@ -852,6 +853,8 @@ ProcessCommandLine(int argc, char *argv[
- 	    defaultBackingStore = WhenMapped;
-         else if ( strcmp( argv[i], "-wr") == 0)
-             whiteRoot = TRUE;
-+        else if ( strcmp( argv[i], "-nr") == 0)
-+            bgNoneRoot = TRUE;
-         else if ( strcmp( argv[i], "-maxbigreqsize") == 0) {
-              if(++i < argc) {
-                  long reqSizeArg = atol(argv[i]);
---- xorg-server-1.9.0/dix/globals.c.orig	2010-06-06 19:53:51.000000000 +0200
-+++ xorg-server-1.9.0/dix/globals.c	2010-08-23 15:27:52.000000000 +0200
-@@ -122,6 +122,7 @@ FontPtr defaultFont;   /* not declared i
- CursorPtr rootCursor;
- Bool party_like_its_1989 = FALSE;
- Bool whiteRoot = FALSE;
-+Bool bgNoneRoot = FALSE;
- 
- TimeStamp currentTime;
- TimeStamp lastDeviceEventTime;
---- xorg-server-1.9.0/hw/xfree86/common/xf86Init.c.orig	2010-06-10 16:07:55.000000000 +0200
-+++ xorg-server-1.9.0/hw/xfree86/common/xf86Init.c	2010-08-23 15:32:56.000000000 +0200
-@@ -76,6 +76,7 @@
- #include "xf86Xinput.h"
- #include "xf86InPriv.h"
- #include "picturestr.h"
-+#include "xace.h"
- 
- #include "xf86Bus.h"
- #include "xf86VGAarbiter.h"
-@@ -242,6 +243,7 @@ xf86CreateRootWindow(WindowPtr pWin)
-   int ret = TRUE;
-   int err = Success;
-   ScreenPtr pScreen = pWin->drawable.pScreen;
-+  ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
-   RootWinPropPtr pProp;
-   CreateWindowProcPtr CreateWindow = (CreateWindowProcPtr)
-       dixLookupPrivate(&pScreen->devPrivates, xf86CreateRootWindowKey);
-@@ -293,6 +295,17 @@ xf86CreateRootWindow(WindowPtr pWin)
-     }
-   }
- 
-+  if (bgNoneRoot) {
-+	if (pScrn->canDoBGNoneRoot) {
-+	    pWin->backgroundState = XaceBackgroundNoneState(pWin);
-+	    pWin->background.pixel = pScreen->whitePixel;
-+	    pScreen->ChangeWindowAttributes(pWin, CWBackPixmap | CWBorderPixel | CWCursor | CWBackingStore);
-+	} else {
-+	    pWin->background.pixel = pScreen->blackPixel;
-+	    pScreen->ChangeWindowAttributes(pWin, CWBackPixel | CWBorderPixel | CWCursor | CWBackingStore);
-+	}
-+  }
-+
-   DebugF("xf86CreateRootWindow() returns %d\n", ret);
-   return ret;
- }
diff --git a/contrib/packages/rpm/sle11/SOURCES/zap_warning_xserver.diff b/contrib/packages/rpm/sle11/SOURCES/zap_warning_xserver.diff
deleted file mode 100644
index 7189e5f..0000000
--- a/contrib/packages/rpm/sle11/SOURCES/zap_warning_xserver.diff
+++ /dev/null
@@ -1,109 +0,0 @@
-Index: xorg-server-1.6.3.901/hw/xfree86/common/xf86Config.c
-================================================================================
---- xorg-server-1.7.99/hw/xfree86/common/xf86Config.c
-+++ xorg-server-1.7.99/hw/xfree86/common/xf86Config.c
-@@ -696,6 +696,7 @@
-     FLAG_NOTRAPSIGNALS,
-     FLAG_DONTVTSWITCH,
-     FLAG_DONTZAP,
-+    FLAG_ZAPWARNING,
-     FLAG_DONTZOOM,
-     FLAG_DISABLEVIDMODE,
-     FLAG_ALLOWNONLOCAL,
-@@ -734,6 +735,8 @@
- 	{0}, FALSE },
-   { FLAG_DONTZAP,		"DontZap",			OPTV_BOOLEAN,
- 	{0}, FALSE },
-+  { FLAG_ZAPWARNING,		"ZapWarning",			OPTV_BOOLEAN,
-+	{0}, FALSE },
-   { FLAG_DONTZOOM,		"DontZoom",			OPTV_BOOLEAN,
- 	{0}, FALSE },
-   { FLAG_DISABLEVIDMODE,	"DisableVidModeExtension",	OPTV_BOOLEAN,
-@@ -840,6 +843,7 @@
-     xf86GetOptValBool(FlagOptions, FLAG_NOTRAPSIGNALS, &xf86Info.notrapSignals);
-     xf86GetOptValBool(FlagOptions, FLAG_DONTVTSWITCH, &xf86Info.dontVTSwitch);
-     xf86GetOptValBool(FlagOptions, FLAG_DONTZAP, &xf86Info.dontZap);
-+    xf86GetOptValBool(FlagOptions, FLAG_ZAPWARNING, &xf86Info.ZapWarning);
-     xf86GetOptValBool(FlagOptions, FLAG_DONTZOOM, &xf86Info.dontZoom);
- 
-     xf86GetOptValBool(FlagOptions, FLAG_IGNORE_ABI, &xf86Info.ignoreABI);
---- xorg-server-1.7.99/hw/xfree86/common/xf86Events.c
-+++ xorg-server-1.7.99/hw/xfree86/common/xf86Events.c
-@@ -180,12 +180,26 @@
-     DebugF("ProcessActionEvent(%d,%x)\n", (int) action, arg);
-     switch (action) {
-     case ACTION_TERMINATE:
--	if (!xf86Info.dontZap) {
-+	if (xf86Info.dontZap)
-+	    break;
-+
-+ 	if (xf86Info.ZapWarning) {
-+	    static struct timeval LastZap = { 0, 0};
-+	    struct timeval NewZap;
-+
-+	    gettimeofday(&NewZap, NULL);
-+
-+	    if ((NewZap.tv_sec - LastZap.tv_sec) >= 2) {
-+		xf86OSRingBell(100, 1000, 500);
-+		LastZap = NewZap;
-+		break;
-+	    }
-+	}
-+
- #ifdef XFreeXDGA
--	    DGAShutdown();
-+	DGAShutdown();
- #endif
--	    GiveUp(0);
--	}
-+	GiveUp(0);
- 	break;
-     case ACTION_NEXT_MODE:
- 	if (!xf86Info.dontZoom)
---- xorg-server-1.7.99/hw/xfree86/common/xf86Globals.c
-+++ xorg-server-1.7.99/hw/xfree86/common/xf86Globals.c
-@@ -109,6 +109,7 @@
- #endif
-     .dontVTSwitch               = FALSE,
-     .dontZap                    = FALSE,
-+    .ZapWarning                 = TRUE,
-     .dontZoom                   = FALSE,
-     .notrapSignals              = FALSE,
-     .caughtSignal               = FALSE,
---- xorg-server-1.7.99/hw/xfree86/common/xf86Privstr.h
-+++ xorg-server-1.7.99/hw/xfree86/common/xf86Privstr.h
-@@ -67,6 +67,7 @@
- #endif
-     Bool		dontVTSwitch;
-     Bool		dontZap;
-+    Bool                ZapWarning;
-     Bool		dontZoom;
-     Bool		notrapSignals;	/* don't exit cleanly - die at fault */
-     Bool		caughtSignal;
---- xorg-server-1.7.99/hw/xfree86/doc/man/Xorg.man.pre
-+++ xorg-server-1.7.99/hw/xfree86/doc/man/Xorg.man.pre
-@@ -438,7 +438,7 @@
- .B Ctrl+Alt+Backspace
- Immediately kills the server -- no questions asked. It can be disabled by
- setting the
--.B DontZap
-+.B DontZap/ZapWarning
- __xconfigfile__(__filemansuffix__) file option to a TRUE value.
- .PP
- .RS 8
---- xorg-server-1.7.99/hw/xfree86/doc/man/xorg.conf.man.pre
-+++ xorg-server-1.7.99/hw/xfree86/doc/man/xorg.conf.man.pre
-@@ -507,6 +507,13 @@
- When this option is enabled, the action has no effect.
- Default: off.
- .TP 7
-+.BI "Option \*qZapWarning\*q  \*q" boolean \*q
-+This warns the user loudly when the
-+.B Ctrl+Alt+Backspace
-+sequence is pressed for the first time but still terminates the __xservername__
-+server when this key-sequence is pressed again shortly after.
-+Default: on.
-+.TP 7
- .BI "Option \*qDontZoom\*q  \*q" boolean \*q
- This disallows the use of the
- .B Ctrl+Alt+Keypad\-Plus
diff --git a/contrib/packages/rpm/sle11/SPECS/tigervnc.spec b/contrib/packages/rpm/sle11/SPECS/tigervnc.spec
deleted file mode 100644
index 84e8574..0000000
--- a/contrib/packages/rpm/sle11/SPECS/tigervnc.spec
+++ /dev/null
@@ -1,407 +0,0 @@
-#
-# spec file for package xorg-x11-Xvnc
-#
-# Copyright (c) 2010 SUSE LINUX Products GmbH, Nuernberg, Germany.
-#
-# All modifications and additions to the file contributed by third parties
-# remain the property of their copyright owners, unless otherwise agreed
-# upon. The license for this file, and modifications and additions to the
-# file, is the same license as for the pristine package itself (unless the
-# license for the pristine package is not an Open Source License, in which
-# case the license is the MIT License). An "Open Source License" is a
-# license that conforms to the Open Source Definition (Version 1.9)
-# published by the Open Source Initiative.
-
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
-#
-%define         debug_package %{nil}
-%{!?_self_signed: %define _self_signed 1}
-
-
-Name:           tigervnc
-Version:        @VERSION@
-Release:        1%{?snap:.%{snap}}%{?dist}
-Packager:       Brian P. Hinz <bphinz@users.sourceforge.net>
-License:        GPL-2.0 and MIT
-Conflicts:      tightvnc xorg-x11-Xvnc
-Requires:       xorg-x11-fonts-core xorg-x11
-Requires:       libpixman-1-0 >= 0.15.2
-Requires:       xinetd
-BuildRequires:  Mesa-devel bison flex fontconfig-devel freetype2-devel ghostscript-library libdrm-devel libopenssl-devel pkgconfig xorg-x11 xorg-x11-devel xorg-x11-fonts-devel xorg-x11-libICE-devel xorg-x11-libSM-devel xorg-x11-libX11-devel xorg-x11-libXau-devel xorg-x11-libXdmcp-devel xorg-x11-libXext-devel xorg-x11-libXfixes-devel xorg-x11-libXmu-devel xorg-x11-libXp-devel xorg-x11-libXpm-devel xorg-x11-libXprintUtil-devel xorg-x11-libXrender-devel xorg-x11-libXt-devel xorg-x11-libXv-devel xorg-x11-libfontenc-devel xorg-x11-libxkbfile-devel xorg-x11-proto-devel xorg-x11-xtrans-devel
-BuildRequires:  xorg-x11-devel gcc-c++ libstdc++-devel zlib-devel libpng-devel
-%ifarch %ix86
-BuildRequires:  nasm
-%endif
-BuildRequires:  java-devel update-alternatives
-BuildRequires:  gcc make glibc-devel gettext gettext-devel intltool
-%if 0%{?%suse_version} >= 1100
-BuildRequires:  gettext-tools
-%endif
-BuildRequires:  autoconf automake libtool update-desktop-files perl
-BuildRequires:  xorg-x11-server-sdk Mesa-devel libopenssl-devel gcc patch
-BuildRequires:  nasm gcc-c++ pkgconfig(xproto) pkgconfig(x11) pkgconfig(xext) pkgconfig(xtst)
-BuildRequires:  cmake >= 2.8 autoconf automake libtool binutils-gold
-BuildRequires:  java-devel jpackage-utils
-# Because of keytool to build java client
-BuildRequires:  mozilla-nss
-BuildRequires:  xorg-x11-libICE-devel xorg-x11-libSM-devel pkgconfig(libtasn1) pkgconfig(gnutls) libgcrypt-devel libgpg-error-devel pam-devel
-BuildRequires:  pkgconfig(fontutil)
-BuildRequires:  pkg-config xmlto pkgconfig(pixman-1) >= 0.15.20 pkgconfig(glproto) pkgconfig(gl) pkgconfig(dri)  pkgconfig(openssl)
-BuildRequires:  pkgconfig(fixesproto) >= 4.1 pkgconfig(damageproto) >= 1.1 pkgconfig(xcmiscproto) >= 1.2.0 
-BuildRequires:  pkgconfig(bigreqsproto) >= 1.1.0 pkgconfig(xproto)  >= 7.0.17 pkgconfig(randrproto) >= 1.2.99.3 pkgconfig(renderproto) >= 0.11 
-BuildRequires:  pkgconfig(xextproto) >= 7.0.99.3 pkgconfig(inputproto)  >= 1.9.99.902 pkgconfig(kbproto) >= 1.0.3 pkgconfig(fontsproto)
-BuildRequires:  pkgconfig(videoproto) pkgconfig(compositeproto) >= 0.4 pkgconfig(recordproto) >= 1.13.99.1 pkgconfig(scrnsaverproto) >= 1.1 
-BuildRequires:  pkgconfig(resourceproto) pkgconfig(xineramaproto) pkgconfig(xkbfile) pkgconfig(xau) pkgconfig(xdmcp) pkgconfig(xfont) >= 1.4.2
-BuildRequires:  pkgconfig(pciaccess) >= 0.8.0 
-URL:            http://sourceforge.net/apps/mediawiki/tigervnc/
-BuildRoot:      %{_tmppath}/%{name}-%{version}-build
-Group:          System/X11/Servers/XF86_4
-Summary:        A high-performance, platform-neutral implementation of VNC
-Source1:        %{name}-%{version}%{?snap:-%{snap}}.tar.bz2
-Source2:        xorg-server-1.9.3.tar.bz2
-Source3:        vnc.xinetd
-Source4:        10-libvnc.conf
-Source5:        vnc-server.firewall
-Source6:        vnc-httpd.firewall
-Source7:        vnc_inetd_httpd
-Source8:        vnc.reg
-Source11:       http://fltk.org/pub/fltk/1.3.2/fltk-1.3.2-source.tar.gz
-Source12:       http://downloads.sourceforge.net/project/libjpeg-turbo/1.3.0/libjpeg-turbo-1.3.0.tar.gz
-
-
-# Tiger vnc patches
-
-# Xserver patches
-Patch1:         fpic.diff
-Patch2:         p_default-module-path.diff
-Patch6:         pu_fixes.diff
-Patch8:         p_bug96328.diff
-Patch13:        p_xorg_acpi.diff
-Patch14:        p_xkills_wrong_client.diff
-Patch16:        p_xnest-ignore-getimage-errors.diff
-Patch23:        disable-fbblt-opt.diff
-Patch27:        mouse.diff
-Patch29:        xephyr.diff
-Patch36:        libdrm.diff
-
-Patch45:        bug-197858_dpms.diff
-Patch67:        xorg-docs.diff
-Patch77:        fbdevhw.diff
-Patch79:        edit_data_sanity_check.diff
-Patch93:        pixman.diff
-Patch101:       zap_warning_xserver.diff
-Patch103:       confine_to_shape.diff
-Patch104:       bitmap_always_unscaled.diff
-Patch106:       randr1_1-sig11.diff
-Patch112:       fix-dpi-values.diff
-Patch123:       vidmode-sig11.diff
-Patch125:       0001-Xinput-Catch-missing-configlayout-when-deleting-dev.patch
-Patch127:       dpms_screensaver.diff
-Patch128:       pci-legacy-mem-fallback.diff
-Patch129:       bug474071-fix1.diff
-Patch143:       autoconfig_fallback_fbdev_first.diff
-Patch145:       driver-autoconfig.diff
-Patch147:       xserver-1.6.1-nouveau.patch
-Patch162:       cache-xkbcomp-output-for-fast-start-up.patch
-Patch163:       xserver-bg-none-root.patch
-Patch164:       xorg-detect-psb.patch
-Patch168:       xorg-server-nohwaccess.diff
-Patch169:       xorg-x11-nonroot-vesa.patch
-Patch200:       bug534768-prefer_local_symbols.patch
-Patch202:       0001-Check-harder-for-primary-PCI-device.patch
-Patch203:       0001-Fix-segfault-when-killing-X-with-ctrl-alt-backspace.patch
-Patch204:       missing_font_paths.diff
-Patch205:       xorg-server-1.8.0.diff
-Patch206:       fix_fglrx_screendepth_issue.patch
-Patch207:       xorg-server-option_libxf86config.diff
-Patch210:       pio_ia64.diff
-Patch211:       0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch
-Patch213:       xorg-server-xdmcp.patch
-Patch217:       CVE-2010-2240-address_space_limit.patch
-Patch218:       CVE-2010-2240-tree_depth_limit.patch
-Patch220:       Use-external-tool-for-creating-backtraces-on-crashes.patch
-Patch221:       commit-5c6a2f9.diff
-Patch222:       sync-fix.patch
-Patch223:       use-last-screen.patch
-Patch224:       pad-size-of-system-memory-copy-for-1x1-pixmaps
-Patch225:       xorg-server-stop-cpu-eating.diff
-Patch226:       EXA-mixed-ModifyPixmapHeader-pitch-fixes.-bug-33929.patch
-Patch227:       U_01-glx-make-sure-screen-is-non-negative-in-validGlxScreen.patch
-Patch228:       U_02-glx-validate-request-lengths.patch
-Patch229:       U_03-glx-check-request-length-before-swapping.patch
-Patch230:       U_04-glx-swap-the-request-arrays-entirely-not-just-half-of-them.patch
-Patch231:       U_05-glx-validate-numAttribs-field-before-using-it.patch
-Patch232:       U_06-glx-fix-request-length-check-for-CreateGLXPbufferSGIX.patch
-Patch233:       U_07-glx-fix-BindTexImageEXT-length-check.patch
-Patch234:       U_08-glx-Work-around-wrong-request-lengths-sent-by-mesa.patch
-Patch235:       U_xf86-fix-flush-input-to-work-with-Linux-evdev-device.patch
-Patch236:       u_xserver_xvfb-randr.patch
-Patch237:       U_os-Reset-input-buffer-s-ignoreBytes-field.patch
-Patch238:       u_Avoid-use-after-free-in-dix-dixfonts.c-doImageText.patch
-
-%description
-TigerVNC is a high-performance, platform-neutral implementation of VNC (Virtual Network Computing), 
-a client/server application that allows users to launch and interact with graphical applications on remote machines. 
-TigerVNC provides the levels of performance necessary to run 3D and video applications;
-it attempts to maintain a common look and feel and re-use components, where possible, across the various platforms that it supports. 
-TigerVNC also provides extensions for advanced authentication methods and TLS encryption.
-
-%prep
-%setup -T -b1 -q -n %{name}-%{version}%{?snap:-%{snap}}
-
-tar xjf %SOURCE2
-cp -r ./xorg-server-*/* unix/xserver/
-
-pushd unix/xserver
-for all in `find . -type f -perm -001`; do
-  chmod -x "$all"
-done
-patch -p1 < ../xserver19.patch
-%patch1
-%patch2
-%patch6
-%patch8 -p0
-%patch13
-%patch14
-%patch16 -p2
-%patch23
-%patch27
-%patch29
-%patch36 -p0
-
-%patch45 -p0
-%patch77
-%patch79 -p1
-%patch93
-%patch101 -p1
-%patch103
-%patch104 -p1
-%patch106 -p1
-%patch112 -p0
-%patch123 -p0
-%patch125 -p1
-%patch127 -p1
-%patch128
-pushd hw/xfree86/os-support/bus
-%patch129 -p0
-popd
-%patch143 -p0
-%patch145 -p0
-%patch147 -p1
-%patch162 -p1
-%patch163 -p1
-%patch164 -p1
-%patch168 -p1
-%patch169 -p1
-%patch200 -p1
-%patch202 -p1
-%patch203 -p1
-%patch204 -p0
-%patch205 -p0
-%patch206 -p0
-%patch207 -p0
-%patch210 -p1
-%patch211 -p1
-%patch213 -p1
-%patch217 -p1
-%patch218 -p1
-
-%patch221 -p1
-%patch222 -p1
-%patch223 -p1
-%patch224 -p1
-%patch225 -p1
-%patch226 -p1
-%patch227 -p1
-%patch228 -p1
-%patch229 -p1
-%patch230 -p1
-%patch231 -p1
-%patch232 -p1
-%patch233 -p1
-%patch234 -p1
-%patch235 -p1
-%patch236 -p1
-%patch237 -p1
-%patch238 -p1
-
-popd
-
-tar xzf %SOURCE11
-pushd fltk-*
-for p in `find ../contrib/fltk -maxdepth 1 -type f -name "*.patch"|sort` ;
-do
-  patch -p1 -i $p
-done
-popd
-
-tar xzf %SOURCE12
-
-%build
-%define tigervnc_src_dir %{_builddir}/%{name}-%{version}%{?snap:-%{snap}}
-%define static_lib_buildroot %{tigervnc_src_dir}/build
-%ifarch sparcv9 sparc64 s390 s390x
-export CFLAGS="$RPM_OPT_FLAGS -fPIC"
-%else
-export CFLAGS="$RPM_OPT_FLAGS -fpic"
-%endif
-export CXXFLAGS="$CFLAGS"
-
-echo "*** Building fltk ***"
-pushd fltk-*
-cmake -G"Unix Makefiles" \
-  -DCMAKE_INSTALL_PREFIX=%{_prefix} \
-  -DCMAKE_BUILD_TYPE=Release \
-  -DOPTION_PREFIX_LIB=%{_libdir} \
-  -DOPTION_PREFIX_CONFIG=%{_libdir} \
-  -DOPTION_BUILD_EXAMPLES=off \
-  -DOPTION_USE_SYSTEM_LIBPNG=on
-make %{?_smp_mflags}
-popd
-
-echo "*** Building libjpeg-turbo ***"
-pushd libjpeg-turbo-*
-export CXXFLAGS="$CFLAGS -static-libgcc"
-./configure --prefix=%{_prefix} --libdir=%{_libdir} --disable-nls --enable-static --disable-shared
-make %{?_smp_mflags} DESTDIR=%{static_lib_buildroot} install
-popd
-
-# Build all tigervnc
-cmake -G"Unix Makefiles" \
-  -DBUILD_STATIC=off \
-  -DCMAKE_INSTALL_PREFIX:PATH=%{_prefix} \
-  -DCMAKE_BUILD_TYPE=RelWithDebInfo \
-  -DJPEG_INCLUDE_DIR=%{static_lib_buildroot}%{_includedir} \
-  -DJPEG_LIBRARY=%{static_lib_buildroot}%{_libdir}/libjpeg.a \
-  -DFLTK_LIBRARIES="%{tigervnc_src_dir}/fltk-1.3.2/lib/libfltk.a;%{tigervnc_src_dir}/fltk-1.3.2/lib/libfltk_images.a;-lpng" \
-  -DFLTK_INCLUDE_DIR=%{tigervnc_src_dir}/fltk-1.3.2
-make LDFLAGS="-lpng" %{?_smp_mflags}
-make %{?_smp_mflags}
-
-# Build Xvnc server
-pushd unix/xserver
-autoreconf -fiv
-chmod +x ./configure
-%configure CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing" \
-        --sysconfdir=/etc \
-        --enable-xdmcp \
-        --enable-xdm-auth-1 \
-        --enable-record \
-        --enable-xcsecurity \
-        --with-sha1=libcrypto \
-        --disable-xorg --disable-xnest --disable-xvfb --disable-dmx \
-        --disable-xwin --disable-xephyr --disable-kdrive --with-pic \
-        --disable-static --disable-xinerama \
-        --with-log-dir="/var/log" \
-        --with-os-name="openSUSE" \
-        --with-os-vendor="SUSE LINUX" \
-        --with-xkb-path="/usr/share/X11/xkb" \
-        --with-xkb-output="/var/lib/xkb/compiled" \
-        --enable-glx --disable-dri --enable-dri2 \
-        --disable-config-dbus \
-        --disable-config-hal \
-        --disable-config-udev \
-        --without-dtrace \
-        --disable-unit-tests \
-        --disable-devel-docs \
-        --with-fontrootdir=/usr/share/fonts \
-        --disable-selective-werror
-make %{?_smp_mflags}
-popd
-
-# Build icons
-pushd media
-make
-popd
-
-# Build java client
-pushd java
-cmake -DCMAKE_INSTALL_PREFIX:PATH=%{_prefix} \
-%if !%{_self_signed}
-  -DJAVA_KEYSTORE=%{_keystore} \
-  -DJAVA_KEYSTORE_TYPE=%{_keystore_type} \
-  -DJAVA_KEY_ALIAS=%{_key_alias} \
-  -DJAVA_STOREPASS=":env STOREPASS" \
-  -DJAVA_KEYPASS=":env KEYPASS" \
-  -DJAVA_TSA_URL=https://timestamp.geotrust.com/tsa
-%endif
-
-JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF8" make %{?_smp_mflags}
-popd
-
-%install
-
-%make_install
-
-pushd unix/xserver
-%make_install
-popd
-
-pushd java
-mkdir -p $RPM_BUILD_ROOT%{_datadir}/vnc/classes
-install -m755 VncViewer.jar $RPM_BUILD_ROOT%{_datadir}/vnc/classes
-install -m644 com/tigervnc/vncviewer/index.vnc $RPM_BUILD_ROOT%{_datadir}/vnc/classes
-popd
-
-# Install desktop stuff
-mkdir -p $RPM_BUILD_ROOT%{_datadir}/icons/hicolor/{16x16,24x24,48x48}/apps
-
-pushd media/icons
-for s in 16 24 48; do
-install -m644 tigervnc_$s.png $RPM_BUILD_ROOT%{_datadir}/icons/hicolor/${s}x$s/apps/tigervnc.png
-done
-popd
-
-install -D -m 644 %{SOURCE3} $RPM_BUILD_ROOT/etc/xinetd.d/vnc
-install -D -m 644 %{SOURCE4} $RPM_BUILD_ROOT/etc/X11/xorg.conf.d/10-libvnc.conf
-install -D -m 644 %{SOURCE5} $RPM_BUILD_ROOT/etc/sysconfig/SuSEfirewall2.d/services/vnc-server
-install -D -m 644 %{SOURCE6} $RPM_BUILD_ROOT/etc/sysconfig/SuSEfirewall2.d/services/vnc-httpd
-install -D -m 755 %{SOURCE7} $RPM_BUILD_ROOT%{_bindir}/vnc_inetd_httpd
-install -D -m 644 %{SOURCE8} $RPM_BUILD_ROOT/etc/slp.reg.d/vnc.reg
-
-%find_lang '%{name}'
-
-%files -f %{name}.lang
-%defattr(-,root,root,-)
-%{_bindir}/vncviewer
-%exclude /usr/share/doc/tigervnc-%{version}
-%doc LICENCE.TXT
-%doc README.txt
-%{_mandir}/man1/vncviewer.1*
-
-%{_bindir}/Xvnc
-%{_bindir}/vncconfig
-%{_bindir}/vncpasswd
-%{_bindir}/vncserver
-%{_bindir}/x0vncserver
-%{_bindir}/vnc_inetd_httpd
-
-%exclude %{_mandir}/man1/Xserver.1*
-%{_mandir}/man1/Xvnc.1*
-%{_mandir}/man1/vncconfig.1*
-%{_mandir}/man1/vncpasswd.1*
-%{_mandir}/man1/vncserver.1*
-%{_mandir}/man1/x0vncserver.1*
-
-%exclude /usr/%{_lib}/xorg/protocol.txt
-%exclude /usr/%{_lib}/xorg/modules/extensions/libvnc.la
-%{_libdir}/xorg/modules/extensions/libvnc.so
-
-%exclude /var/lib/xkb/compiled/README.compiled
-
-/etc/sysconfig/SuSEfirewall2.d/services/vnc-server
-/etc/sysconfig/SuSEfirewall2.d/services/vnc-httpd
-
-%config(noreplace) /etc/X11/xorg.conf.d/10-libvnc.conf
-%config(noreplace) /etc/xinetd.d/vnc
-%dir /etc/slp.reg.d
-%config(noreplace) /etc/slp.reg.d/vnc.reg
-
-%doc java/com/tigervnc/vncviewer/README
-%{_datadir}/vnc
-
-%{_datadir}/icons/hicolor/*/apps/*
-
-%changelog
-* Sat Dec  7 2013 Brian P. Hinz <bphinz@users.sourceforge.net>
-- Initial spec file created based on existing SLES & OpenSUSE spec files
diff --git a/unix/xserver/hw/vnc/Input.cc b/unix/xserver/hw/vnc/Input.c
similarity index 62%
rename from unix/xserver/hw/vnc/Input.cc
rename to unix/xserver/hw/vnc/Input.c
index 3aae5db..db9bf66 100644
--- a/unix/xserver/hw/vnc/Input.cc
+++ b/unix/xserver/hw/vnc/Input.c
@@ -1,6 +1,6 @@
 /* Copyright (C) 2009 TightVNC Team
  * Copyright (C) 2009, 2014 Red Hat, Inc.
- * Copyright 2013 Pierre Ossman for Cendio AB
+ * Copyright 2013-2015 Pierre Ossman for Cendio AB
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,14 +22,11 @@
 #include <dix-config.h>
 #endif
 
-#include <rfb/LogWriter.h>
-#include "Input.h"
 #include "xorg-version.h"
+
+#include "Input.h"
 #include "vncExtInit.h"
 
-extern "C" {
-#define public c_public
-#define class c_class
 #include "inputstr.h"
 #if XORG >= 110
 #include "inpututils.h"
@@ -51,26 +48,9 @@
 #include <X11/keysym.h>
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
-#undef public
-#undef class
-}
-
-#if XORG >= 110
-#define Xfree free
-#endif
-
-using namespace rdr;
-using namespace rfb;
-
-static LogWriter vlog("Input");
-
-rfb::BoolParameter avoidShiftNumLock("AvoidShiftNumLock", "Avoid fake Shift presses for keys affected by NumLock.", true);
 
 #define BUTTONS 7
 
-class InputDevice *vncInputDevice;
-InputDevice InputDevice::singleton;
-
 /* Event queue is shared between all devices. */
 #if XORG == 15
 static xEvent *eventq = NULL;
@@ -78,9 +58,91 @@
 static EventList *eventq = NULL;
 #endif
 
-#if XORG < 111
-static void initEventq(void)
+DeviceIntPtr vncKeyboardDev;
+DeviceIntPtr vncPointerDev;
+
+static int oldButtonMask;
+static int cursorPosX, cursorPosY;
+
+static KeySym pressedKeys[256];
+
+#if XORG < 17
+extern void vncGetInitKeyboardMap(KeySymsPtr keysyms, CARD8 *modmap);
+#endif
+
+static int vncPointerProc(DeviceIntPtr pDevice, int onoff);
+static void vncKeyboardBell(int percent, DeviceIntPtr device,
+                            void * ctrl, int class);
+static int vncKeyboardProc(DeviceIntPtr pDevice, int onoff);
+
+#define LOG_NAME "Input"
+
+#define LOG_ERROR(...) vncLogError(LOG_NAME, __VA_ARGS__)
+#define LOG_STATUS(...) vncLogStatus(LOG_NAME, __VA_ARGS__)
+#define LOG_INFO(...) vncLogInfo(LOG_NAME, __VA_ARGS__)
+#define LOG_DEBUG(...) vncLogDebug(LOG_NAME, __VA_ARGS__)
+
+/*
+ * Init input device.
+ * This has to be called after core pointer/keyboard
+ * initialization which unfortunately is after extesions
+ * initialization (which means we cannot call it in
+ * vncExtensionInit(). Check InitExtensions(),
+ * InitCoreDevices() and InitInput() calls in dix/main.c.
+ * Instead we call it from XserverDesktop at an appropriate
+ * time.
+ */
+void vncInitInputDevice(void)
 {
+	int i, ret;
+
+	if ((vncPointerDev != NULL) || (vncKeyboardDev != NULL))
+		return;
+
+	for (i = 0;i < 256;i++)
+		pressedKeys[i] = NoSymbol;
+
+#if XORG < 17
+	vncPointerDev = AddInputDevice(
+#if XORG >= 16
+				    serverClient,
+#endif
+				    vncPointerProc, TRUE);
+	RegisterPointerDevice(vncPointerDev);
+
+	vncKeyboardDev = AddInputDevice(
+#if XORG >= 16
+				     serverClient,
+#endif
+				     vncKeyboardProc, TRUE);
+	RegisterKeyboardDevice(vncKeyboardDev);
+
+	if (ActivateDevice(vncPointerDev) != Success ||
+	    ActivateDevice(vncKeyboardDev) != Success)
+		FatalError("Failed to activate TigerVNC devices\n");
+
+	if (!EnableDevice(vncPointerDev) ||
+	    !EnableDevice(vncKeyboardDev))
+		FatalError("Failed to enable TigerVNC devices\n");
+#else /* < 17 */
+	ret = AllocDevicePair(serverClient, "TigerVNC",
+	                      &vncPointerDev, &vncKeyboardDev,
+	                      vncPointerProc, vncKeyboardProc,
+			      FALSE);
+
+	if (ret != Success)
+		FatalError("Failed to initialize TigerVNC input devices\n");
+
+	if (ActivateDevice(vncPointerDev, TRUE) != Success ||
+	    ActivateDevice(vncKeyboardDev, TRUE) != Success)
+		FatalError("Failed to activate TigerVNC devices\n");
+
+	if (!EnableDevice(vncPointerDev, TRUE) ||
+	    !EnableDevice(vncKeyboardDev, TRUE))
+		FatalError("Failed to activate TigerVNC devices\n");
+#endif /* 17 */
+
+#if XORG < 111
 	/* eventq is never free()-ed because it exists during server life. */
 	if (eventq == NULL) {
 #if XORG == 15
@@ -92,8 +154,89 @@
 		GetEventList(&eventq);
 #endif
 	}
+#endif
+
+	vncPrepareInputDevices();
 }
-#endif /* XORG < 111 */
+
+void vncPointerButtonAction(int buttonMask)
+{
+	int i;
+#if XORG < 111
+	int n;
+#endif
+#if XORG >= 110
+	ValuatorMask mask;
+#endif
+
+	for (i = 0; i < BUTTONS; i++) {
+		if ((buttonMask ^ oldButtonMask) & (1 << i)) {
+			int action = (buttonMask & (1<<i)) ?
+				     ButtonPress : ButtonRelease;
+#if XORG < 110
+			n = GetPointerEvents(eventq, vncPointerDev,
+			                     action, i + 1,
+					     POINTER_RELATIVE, 0, 0, NULL);
+			enqueueEvents(vncPointerDev, n);
+#elif XORG < 111
+			valuator_mask_set_range(&mask, 0, 0, NULL);
+			n = GetPointerEvents(eventq, vncPointerDev,
+			                     action, i + 1,
+					     POINTER_RELATIVE, &mask);
+			enqueueEvents(vncPointerDev, n);
+#else
+			valuator_mask_set_range(&mask, 0, 0, NULL);
+			QueuePointerEvents(vncPointerDev, action, i + 1,
+					   POINTER_RELATIVE, &mask);
+#endif
+		}
+	}
+
+	oldButtonMask = buttonMask;
+}
+
+void vncPointerMove(int x, int y)
+{
+	int valuators[2];
+#if XORG < 111
+	int n;
+#endif
+#if XORG >= 110
+	ValuatorMask mask;
+#endif
+
+	if (cursorPosX == x && cursorPosY == y)
+		return;
+
+	valuators[0] = x;
+	valuators[1] = y;
+#if XORG < 110
+	n = GetPointerEvents(eventq, vncPointerDev, MotionNotify, 0,
+	                     POINTER_ABSOLUTE, 0, 2, valuators);
+	enqueueEvents(vncPointerDev, n);
+#elif XORG < 111
+	valuator_mask_set_range(&mask, 0, 2, valuators);
+	n = GetPointerEvents(eventq, vncPointerDev, MotionNotify, 0,
+	                     POINTER_ABSOLUTE, &mask);
+	enqueueEvents(vncPointerDev, n);
+#else
+	valuator_mask_set_range(&mask, 0, 2, valuators);
+	QueuePointerEvents(vncPointerDev, MotionNotify, 0,
+	                   POINTER_ABSOLUTE, &mask);
+#endif
+
+	cursorPosX = x;
+	cursorPosY = y;
+}
+
+void vncGetPointerPos(int *x, int *y)
+{
+	if (vncPointerDev != NULL)
+		GetSpritePosition(vncPointerDev, &cursorPosX, &cursorPosY);
+
+	*x = cursorPosX;
+	*y = cursorPosY;
+}
 
 #if XORG < 111
 static void enqueueEvents(DeviceIntPtr dev, int n)
@@ -119,97 +262,7 @@
 }
 #endif /* XORG < 111 */
 
-InputDevice::InputDevice()
-	: oldButtonMask(0)
-{
-	int i;
-
-	vncInputDevice = this;
-
-	for (i = 0;i < 256;i++)
-		pressedKeys[i] = NoSymbol;
-}
-
-void InputDevice::PointerButtonAction(int buttonMask)
-{
-	int i;
-#if XORG < 111
-	int n;
-#endif
-#if XORG >= 110
-	ValuatorMask mask;
-#endif
-
-	for (i = 0; i < BUTTONS; i++) {
-		if ((buttonMask ^ oldButtonMask) & (1 << i)) {
-			int action = (buttonMask & (1<<i)) ?
-				     ButtonPress : ButtonRelease;
-#if XORG < 110
-			n = GetPointerEvents(eventq, pointerDev, action, i + 1,
-					     POINTER_RELATIVE, 0, 0, NULL);
-			enqueueEvents(pointerDev, n);
-#elif XORG < 111
-			valuator_mask_set_range(&mask, 0, 0, NULL);
-			n = GetPointerEvents(eventq, pointerDev, action, i + 1,
-					     POINTER_RELATIVE, &mask);
-			enqueueEvents(pointerDev, n);
-#else
-			valuator_mask_set_range(&mask, 0, 0, NULL);
-			QueuePointerEvents(pointerDev, action, i + 1,
-					   POINTER_RELATIVE, &mask);
-#endif
-		}
-	}
-
-	oldButtonMask = buttonMask;
-}
-
-void InputDevice::PointerMove(const rfb::Point &pos)
-{
-	int valuators[2];
-#if XORG < 111
-	int n;
-#endif
-#if XORG >= 110
-	ValuatorMask mask;
-#endif
-
-	if (pos.equals(cursorPos))
-		return;
-
-	valuators[0] = pos.x;
-	valuators[1] = pos.y;
-#if XORG < 110
-	n = GetPointerEvents(eventq, pointerDev, MotionNotify, 0, POINTER_ABSOLUTE, 0,
-			     2, valuators);
-	enqueueEvents(pointerDev, n);
-#elif XORG < 111
-	valuator_mask_set_range(&mask, 0, 2, valuators);
-	n = GetPointerEvents(eventq, pointerDev, MotionNotify, 0, POINTER_ABSOLUTE,
-			     &mask);
-	enqueueEvents(pointerDev, n);
-#else
-	valuator_mask_set_range(&mask, 0, 2, valuators);
-	QueuePointerEvents(pointerDev, MotionNotify, 0, POINTER_ABSOLUTE, &mask);
-#endif
-
-	cursorPos = pos;
-}
-
-const rfb::Point &InputDevice::getPointerPos(void)
-{
-	if (pointerDev != NULL) {
-		int x, y;
-
-		GetSpritePosition (pointerDev, &x, &y);
-		cursorPos.x = x;
-		cursorPos.y = y;
-	}
-
-	return cursorPos;
-}
-
-int InputDevice::pointerProc(DeviceIntPtr pDevice, int onoff)
+static int vncPointerProc(DeviceIntPtr pDevice, int onoff)
 {
 	BYTE map[BUTTONS + 1];
 	DevicePtr pDev = (DevicePtr)pDevice;
@@ -261,21 +314,21 @@
 		pDev->on = FALSE;
 		break;
 	case DEVICE_CLOSE:
-		singleton.pointerDev = NULL;
+		vncPointerDev = NULL;
 		break;
 	}
 
 	return Success;
 }
 
-static void keyboardBell(int percent, DeviceIntPtr device, void * ctrl,
-			 int class_)
+static void vncKeyboardBell(int percent, DeviceIntPtr device,
+                            void * ctrl, int class)
 {
 	if (percent > 0)
 		vncBell();
 }
 
-int InputDevice::keyboardProc(DeviceIntPtr pDevice, int onoff)
+static int vncKeyboardProc(DeviceIntPtr pDevice, int onoff)
 {
 #if XORG < 17
 	KeySymsRec keySyms;
@@ -286,7 +339,7 @@
 	switch (onoff) {
 	case DEVICE_INIT:
 #if XORG < 17
-		GetInitKeyboardMap(&keySyms, modMap);
+		vncGetInitKeyboardMap(&keySyms, modMap);
 #endif
 		InitKeyboardDeviceStruct(
 #if XORG >= 17
@@ -294,7 +347,8 @@
 #else
 					 pDev, &keySyms, modMap,
 #endif
-					 keyboardBell, (KbdCtrlProcPtr)NoopDDA);
+					 vncKeyboardBell,
+					 (KbdCtrlProcPtr)NoopDDA);
 		break;
 	case DEVICE_ON:
 		pDev->on = TRUE;
@@ -303,67 +357,14 @@
 		pDev->on = FALSE;
 		break;
 	case DEVICE_CLOSE:
-		singleton.keyboardDev = NULL;
+		vncKeyboardDev = NULL;
 		break;
 	}
 
 	return Success;
 }
 
-void InputDevice::InitInputDevice(void)
-{
-	if ((pointerDev != NULL) || (keyboardDev != NULL))
-		return;
-
-#if XORG < 17
-	pointerDev = AddInputDevice(
-#if XORG >= 16
-				    serverClient,
-#endif
-				    pointerProc, TRUE);
-	RegisterPointerDevice(pointerDev);
-
-	keyboardDev = AddInputDevice(
-#if XORG >= 16
-				     serverClient,
-#endif
-				     keyboardProc, TRUE);
-	RegisterKeyboardDevice(keyboardDev);
-
-	if (ActivateDevice(pointerDev) != Success ||
-	    ActivateDevice(keyboardDev) != Success)
-		FatalError("Failed to activate TigerVNC devices\n");
-
-	if (!EnableDevice(pointerDev) ||
-	    !EnableDevice(keyboardDev))
-		FatalError("Failed to enable TigerVNC devices\n");
-#else /* < 17 */
-	int ret;
-
-	ret = AllocDevicePair(serverClient, "TigerVNC", &pointerDev,
-			      &keyboardDev, pointerProc, keyboardProc,
-			      FALSE);
-
-	if (ret != Success)
-		FatalError("Failed to initialize TigerVNC input devices\n");
-
-	if (ActivateDevice(pointerDev, TRUE) != Success ||
-	    ActivateDevice(keyboardDev, TRUE) != Success)
-		FatalError("Failed to activate TigerVNC devices\n");
-
-	if (!EnableDevice(pointerDev, TRUE) ||
-	    !EnableDevice(keyboardDev, TRUE))
-		FatalError("Failed to activate TigerVNC devices\n");
-#endif /* 17 */
-
-#if XORG < 111
-	initEventq();
-#endif
-
-	PrepareInputDevices();
-}
-
-static inline void pressKey(DeviceIntPtr dev, int kc, bool down, const char *msg)
+static inline void pressKey(DeviceIntPtr dev, int kc, Bool down, const char *msg)
 {
 	int action;
 #if XORG < 111
@@ -371,7 +372,7 @@
 #endif
 
 	if (msg != NULL)
-		vlog.debug("%s %d %s", msg, kc, down ? "down" : "up");
+		LOG_DEBUG("%s %d %s", msg, kc, down ? "down" : "up");
 
 	action = down ? KeyPress : KeyRelease;
 #if XORG < 111
@@ -432,14 +433,14 @@
 };
 
 /*
- * keyEvent() - work out the best keycode corresponding to the keysym sent by
- * the viewer. This is basically impossible in the general case, but we make
- * a best effort by assuming that all useful keysyms can be reached using
- * just the Shift and Level 3 (AltGr) modifiers. For core keyboards this is
- * basically always true, and should be true for most sane, western XKB
+ * vncKeyboardEvent() - work out the best keycode corresponding to the keysym
+ * sent by the viewer. This is basically impossible in the general case, but
+ * we make a best effort by assuming that all useful keysyms can be reached
+ * using just the Shift and Level 3 (AltGr) modifiers. For core keyboards this
+ * is basically always true, and should be true for most sane, western XKB
  * layouts.
  */
-void InputDevice::keyEvent(rdr::U32 keysym, bool down)
+void vncKeyboardEvent(KeySym keysym, int down)
 {
 	int i;
 	unsigned state, new_state;
@@ -447,7 +448,8 @@
 
 	unsigned level_three_mask;
 	KeyCode shift_press, level_three_press;
-	std::list<KeyCode> shift_release, level_three_release;
+	KeyCode shift_release[8], level_three_release[8];
+	size_t shift_release_count, level_three_release_count;
 
 	/*
 	 * Release events must match the press event, so look up what
@@ -457,7 +459,7 @@
 		for (i = 0;i < 256;i++) {
 			if (pressedKeys[i] == keysym) {
 				pressedKeys[i] = NoSymbol;
-				pressKey(keyboardDev, i, false, "keycode");
+				pressKey(vncKeyboardDev, i, FALSE, "keycode");
 				mieqProcessInputEvents();
 				return;
 			}
@@ -467,7 +469,7 @@
 		 * This can happen quite often as we ignore some
 		 * key presses.
 		 */
-		vlog.debug("Unexpected release of keysym 0x%x", keysym);
+		LOG_DEBUG("Unexpected release of keysym 0x%x", keysym);
 		return;
 	}
 
@@ -479,9 +481,9 @@
 	 */ 
 	mieqProcessInputEvents();
 
-	state = getKeyboardState();
+	state = vncGetKeyboardState();
 
-	keycode = keysymToKeycode(keysym, state, &new_state);
+	keycode = vncKeysymToKeycode(keysym, state, &new_state);
 
 	/* Try some equivalent keysyms if we couldn't find a perfect match */
 	if (keycode == 0) {
@@ -495,37 +497,37 @@
 			else
 				continue;
 
-			keycode = keysymToKeycode(altsym, state, &new_state);
+			keycode = vncKeysymToKeycode(altsym, state, &new_state);
 			if (keycode != 0)
 				break;
 		}
 	}
 
 	/* We don't have lock synchronisation... */
-	if (isLockModifier(keycode, new_state)) {
-		vlog.debug("Ignoring lock key (e.g. caps lock)");
+	if (vncIsLockModifier(keycode, new_state)) {
+		LOG_DEBUG("Ignoring lock key (e.g. caps lock)");
 		return;
 	}
 
 	/* No matches. Will have to add a new entry... */
 	if (keycode == 0) {
-		keycode = addKeysym(keysym, state);
+		keycode = vncAddKeysym(keysym, state);
 		if (keycode == 0) {
-			vlog.error("Failure adding new keysym 0x%x", keysym);
+			LOG_ERROR("Failure adding new keysym 0x%x", keysym);
 			return;
 		}
 
-		vlog.info("Added unknown keysym 0x%x to keycode %d",
-			  keysym, keycode);
+		LOG_INFO("Added unknown keysym 0x%x to keycode %d",
+		         keysym, keycode);
 
 		/*
 		 * The state given to addKeysym() is just a hint and
 		 * the actual result might still require some state
 		 * changes.
 		 */
-		keycode = keysymToKeycode(keysym, state, &new_state);
+		keycode = vncKeysymToKeycode(keysym, state, &new_state);
 		if (keycode == 0) {
-			vlog.error("Newly added keysym 0x%x cannot be generated", keysym);
+			LOG_ERROR("Newly added keysym 0x%x cannot be generated", keysym);
 			return;
 		}
 	}
@@ -542,11 +544,11 @@
 	 * can use an alternative keysym.
 	 */
 	if (((state & ShiftMask) != (new_state & ShiftMask)) &&
-	    avoidShiftNumLock && isAffectedByNumLock(keycode)) {
+	    vncGetAvoidShiftNumLock() && vncIsAffectedByNumLock(keycode)) {
 	    	KeyCode keycode2;
 	    	unsigned new_state2;
 
-		vlog.debug("Finding alternative to keysym 0x%x to avoid fake shift for numpad", keysym);
+		LOG_DEBUG("Finding alternative to keysym 0x%x to avoid fake shift for numpad", keysym);
 
 		for (i = 0;i < sizeof(altKeysym)/sizeof(altKeysym[0]);i++) {
 			KeySym altsym;
@@ -558,19 +560,19 @@
 			else
 				continue;
 
-			keycode2 = keysymToKeycode(altsym, state, &new_state2);
+			keycode2 = vncKeysymToKeycode(altsym, state, &new_state2);
 			if (keycode2 == 0)
 				continue;
 
 			if (((state & ShiftMask) != (new_state2 & ShiftMask)) &&
-			    isAffectedByNumLock(keycode2))
+			    vncIsAffectedByNumLock(keycode2))
 				continue;
 
 			break;
 		}
 
 		if (i == sizeof(altKeysym)/sizeof(altKeysym[0]))
-			vlog.debug("No alternative keysym found");
+			LOG_DEBUG("No alternative keysym found");
 		else {
 			keycode = keycode2;
 			new_state = new_state2;
@@ -598,65 +600,64 @@
 	 * so we need to know what the mask is for level 3 shifts.
 	 */
 	if ((new_state & ~ShiftMask) != (state & ~ShiftMask))
-		level_three_mask = getLevelThreeMask();
+		level_three_mask = vncGetLevelThreeMask();
 	else
 		level_three_mask = 0;
 
 	shift_press = level_three_press = 0;
+	shift_release_count = level_three_release_count = 0;
 
 	/* Need a fake press or release of shift? */
 	if (!(state & ShiftMask) && (new_state & ShiftMask)) {
-		shift_press = pressShift();
+		shift_press = vncPressShift();
 		if (shift_press == 0) {
-			vlog.error("Unable to find a modifier key for Shift");
+			LOG_ERROR("Unable to find a modifier key for Shift");
 			return;
 		}
 
-		pressKey(keyboardDev, shift_press, true, "temp shift");
+		pressKey(vncKeyboardDev, shift_press, TRUE, "temp shift");
 	} else if ((state & ShiftMask) && !(new_state & ShiftMask)) {
-		std::list<KeyCode>::const_iterator iter;
-
-		shift_release = releaseShift();
-		if (shift_release.empty()) {
-			vlog.error("Unable to find the modifier key(s) for releasing Shift");
+		shift_release_count = vncReleaseShift(shift_release,
+		                                      sizeof(shift_release)/sizeof(*shift_release));
+		if (shift_release_count == 0) {
+			LOG_ERROR("Unable to find the modifier key(s) for releasing Shift");
 			return;
 		}
 
-		for (iter = shift_release.begin();iter != shift_release.end();++iter)
-			pressKey(keyboardDev, *iter, false, "temp shift");
+		for (i = 0;i < shift_release_count;i++)
+			pressKey(vncKeyboardDev, shift_release[i], FALSE, "temp shift");
 	}
 
 	/* Need a fake press or release of level three shift? */
 	if (!(state & level_three_mask) && (new_state & level_three_mask)) {
-		level_three_press = pressLevelThree();
+		level_three_press = vncPressLevelThree();
 		if (level_three_press == 0) {
-			vlog.error("Unable to find a modifier key for ISO_Level3_Shift/Mode_Switch");
+			LOG_ERROR("Unable to find a modifier key for ISO_Level3_Shift/Mode_Switch");
 			return;
 		}
 
-		pressKey(keyboardDev, level_three_press, true, "temp level 3 shift");
+		pressKey(vncKeyboardDev, level_three_press, TRUE, "temp level 3 shift");
 	} else if ((state & level_three_mask) && !(new_state & level_three_mask)) {
-		std::list<KeyCode>::const_iterator iter;
-
-		level_three_release = releaseLevelThree();
-		if (level_three_release.empty()) {
-			vlog.error("Unable to find the modifier key(s) for releasing ISO_Level3_Shift/Mode_Switch");
+		level_three_release_count = vncReleaseLevelThree(level_three_release,
+		                                                 sizeof(level_three_release)/sizeof(*level_three_release));
+		if (level_three_release_count == 0) {
+			LOG_ERROR("Unable to find the modifier key(s) for releasing ISO_Level3_Shift/Mode_Switch");
 			return;
 		}
 
-		for (iter = level_three_release.begin();iter != level_three_release.end();++iter)
-			pressKey(keyboardDev, *iter, false, "temp level 3 shift");
+		for (i = 0;i < level_three_release_count;i++)
+			pressKey(vncKeyboardDev, level_three_release[i], FALSE, "temp level 3 shift");
 	}
 
 	/* Now press the actual key */
-	pressKey(keyboardDev, keycode, true, "keycode");
+	pressKey(vncKeyboardDev, keycode, TRUE, "keycode");
 
 	/* And store the mapping so that we can do a proper release later */
 	for (i = 0;i < 256;i++) {
 		if (i == keycode)
 			continue;
 		if (pressedKeys[i] == keysym) {
-			vlog.error("Keysym 0x%x generated by both keys %d and %d", keysym, i, keycode);
+			LOG_ERROR("Keysym 0x%x generated by both keys %d and %d", keysym, i, keycode);
 			pressedKeys[i] = NoSymbol;
 		}
 	}
@@ -665,20 +666,18 @@
 
 	/* Undo any fake level three shift */
 	if (level_three_press != 0)
-		pressKey(keyboardDev, level_three_press, false, "temp level 3 shift");
-	else if (!level_three_release.empty()) {
-		std::list<KeyCode>::const_iterator iter;
-		for (iter = level_three_release.begin();iter != level_three_release.end();++iter)
-			pressKey(keyboardDev, *iter, true, "temp level 3 shift");
+		pressKey(vncKeyboardDev, level_three_press, FALSE, "temp level 3 shift");
+	else if (level_three_release_count != 0) {
+		for (i = 0;i < level_three_release_count;i++)
+			pressKey(vncKeyboardDev, level_three_release[i], TRUE, "temp level 3 shift");
 	}
 
 	/* Undo any fake shift */
 	if (shift_press != 0)
-		pressKey(keyboardDev, shift_press, false, "temp shift");
-	else if (!shift_release.empty()) {
-		std::list<KeyCode>::const_iterator iter;
-		for (iter = shift_release.begin();iter != shift_release.end();++iter)
-			pressKey(keyboardDev, *iter, true, "temp shift");
+		pressKey(vncKeyboardDev, shift_press, FALSE, "temp shift");
+	else if (shift_release_count != 0) {
+		for (i = 0;i < shift_release_count;i++)
+			pressKey(vncKeyboardDev, shift_release[i], TRUE, "temp shift");
 	}
 
 	/*
diff --git a/unix/xserver/hw/vnc/Input.h b/unix/xserver/hw/vnc/Input.h
index 90b392c..11e8871 100644
--- a/unix/xserver/hw/vnc/Input.h
+++ b/unix/xserver/hw/vnc/Input.h
@@ -1,7 +1,7 @@
 /* Copyright (C) 2009 TightVNC Team
  * Copyright (C) 2009, 2010 Red Hat, Inc.
  * Copyright (C) 2009, 2010 TigerVNC Team
- * Copyright 2013 Pierre Ossman for Cendio AB
+ * Copyright 2013-2015 Pierre Ossman for Cendio AB
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,109 +23,44 @@
 #ifndef INPUT_H_
 #define INPUT_H_
 
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
+#include <stdlib.h>
+#include <X11/X.h>
 
-#include <list>
-
-#include <rdr/types.h>
-#include <rfb/Rect.h>
-
+#ifdef __cplusplus
 extern "C" {
-#include "input.h"
-/* The Xorg headers define macros that wreak havoc with STL */
-#undef max
-};
-
-#include "xorg-version.h"
-
-/*
- * Represents input device (keyboard + pointer)
- *
- * Is a singleton as input devices are global in the X server so
- * we do not have one per desktop (i.e. per screen).
- */
-extern class InputDevice *vncInputDevice;
-
-class InputDevice {
-public:
-	/*
-	 * Press or release buttons. Relationship between buttonMask and
-	 * buttons is specified in RFB protocol.
-	 */
-	void PointerButtonAction(int buttonMask);
-
-	/* Move pointer to target location (point coords are absolute). */
-	void PointerMove(const rfb::Point &point);
-
-	/* Get current known location of the pointer */
-	const rfb::Point &getPointerPos(void);
-
-	/* Press or release one or more keys to get the given symbol */
-	void KeyboardPress(rdr::U32 keysym) { keyEvent(keysym, true); }
-	void KeyboardRelease(rdr::U32 keysym) { keyEvent(keysym, false); }
-
-	/*
-	 * Init input device.
-	 * This has to be called after core pointer/keyboard
-	 * initialization which unfortunately is after extesions
-	 * initialization (which means we cannot call it in
-	 * vncExtensionInit(). Check InitExtensions(),
-	 * InitCoreDevices() and InitInput() calls in dix/main.c.
-	 * Instead we call it from XserverDesktop at an appropriate
-	 * time.
-	 */
-	void InitInputDevice(void);
-
-private:
-	InputDevice();
-
-	void keyEvent(rdr::U32 keysym, bool down);
-
-	/* Backend dependent functions below here */
-	void PrepareInputDevices(void);
-
-	unsigned getKeyboardState(void);
-	unsigned getLevelThreeMask(void);
-
-	KeyCode pressShift(void);
-	std::list<KeyCode> releaseShift(void);
-
-	KeyCode pressLevelThree(void);
-	std::list<KeyCode> releaseLevelThree(void);
-
-	KeyCode keysymToKeycode(KeySym keysym, unsigned state, unsigned *new_state);
-
-	bool isLockModifier(KeyCode keycode, unsigned state);
-
-	bool isAffectedByNumLock(KeyCode keycode);
-
-	KeyCode addKeysym(KeySym keysym, unsigned state);
-
-private:
-	static int pointerProc(DeviceIntPtr pDevice, int onoff);
-	static int keyboardProc(DeviceIntPtr pDevice, int onoff);
-
-#if XORG >= 17
-	static void vncXkbProcessDeviceEvent(int screenNum,
-	                                     InternalEvent *event,
-	                                     DeviceIntPtr dev);
-#else
-	static void GetInitKeyboardMap(KeySymsPtr keysyms, CARD8 *modmap);
 #endif
 
-private:
-	DeviceIntPtr keyboardDev;
-	DeviceIntPtr pointerDev;
+void vncInitInputDevice(void);
 
-	int oldButtonMask;
-	rfb::Point cursorPos;
+void vncPointerButtonAction(int buttonMask);
+void vncPointerMove(int x, int y);
+void vncGetPointerPos(int *x, int *y);
 
-	KeySym pressedKeys[256];
+void vncKeyboardEvent(KeySym keysym, int down);
 
-private:
-	static InputDevice singleton;
-};
+/* Backend dependent functions below here */
+
+void vncPrepareInputDevices(void);
+
+unsigned vncGetKeyboardState(void);
+unsigned vncGetLevelThreeMask(void);
+
+KeyCode vncPressShift(void);
+size_t vncReleaseShift(KeyCode *keys, size_t maxKeys);
+
+KeyCode vncPressLevelThree(void);
+size_t vncReleaseLevelThree(KeyCode *keys, size_t maxKeys);
+
+KeyCode vncKeysymToKeycode(KeySym keysym, unsigned state, unsigned *new_state);
+
+int vncIsLockModifier(KeyCode keycode, unsigned state);
+
+int vncIsAffectedByNumLock(KeyCode keycode);
+
+KeyCode vncAddKeysym(KeySym keysym, unsigned state);
+
+#ifdef __cplusplus
+}
+#endif
 
 #endif
diff --git a/unix/xserver/hw/vnc/InputCore.cc b/unix/xserver/hw/vnc/InputCore.c
similarity index 79%
rename from unix/xserver/hw/vnc/InputCore.cc
rename to unix/xserver/hw/vnc/InputCore.c
index b565c73..0467766 100644
--- a/unix/xserver/hw/vnc/InputCore.cc
+++ b/unix/xserver/hw/vnc/InputCore.c
@@ -1,6 +1,6 @@
 /* Copyright (C) 2009 TightVNC Team
  * Copyright (C) 2009 Red Hat, Inc.
- * Copyright 2013 Pierre Ossman for Cendio AB
+ * Copyright 2013-2015 Pierre Ossman for Cendio AB
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,9 +25,6 @@
 #include "Input.h"
 #include "xorg-version.h"
 
-extern "C" {
-#define public c_public
-#define class c_class
 #include "inputstr.h"
 #ifndef XKB_IN_SERVER
 #define XKB_IN_SERVER
@@ -46,9 +43,8 @@
 #include <X11/XF86keysym.h>
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
-#undef public
-#undef class
-}
+
+extern DeviceIntPtr vncKeyboardDev;
 
 #if XORG < 17
 
@@ -61,7 +57,7 @@
 #define MAX_KEY 255
 #define MAP_LEN (MAX_KEY - MIN_KEY + 1)
 #define KEYSYMS_PER_KEY 2
-KeySym keyboardMap[MAP_LEN * KEYSYMS_PER_KEY] = {
+static KeySym keyboardMap[MAP_LEN * KEYSYMS_PER_KEY] = {
 	NoSymbol, NoSymbol,
 	XK_Escape, NoSymbol,
 	XK_1, XK_exclam,
@@ -174,7 +170,7 @@
 	XK_Menu, NoSymbol,
 };
 
-void InputDevice::GetInitKeyboardMap(KeySymsPtr keysyms, CARD8 *modmap)
+void vncGetInitKeyboardMap(KeySymsPtr keysyms, CARD8 *modmap)
 {
 	int i;
 
@@ -221,17 +217,17 @@
 	keysyms->map = keyboardMap;
 }
 
-void InputDevice::PrepareInputDevices(void)
+void vncPrepareInputDevices(void)
 {
 	/* Don't need to do anything here */
 }
 
-unsigned InputDevice::getKeyboardState(void)
+unsigned vncGetKeyboardState(void)
 {
-	return keyboardDev->key->state;
+	return vncKeyboardDev->key->state;
 }
 
-unsigned InputDevice::getLevelThreeMask(void)
+unsigned vncGetLevelThreeMask(void)
 {
 	int i, j, k;
 
@@ -241,12 +237,12 @@
 	int maxKeysPerMod;
 	CARD8 *modmap;
 
-	minKeyCode = keyboardDev->key->curKeySyms.minKeyCode;
-	mapWidth = keyboardDev->key->curKeySyms.mapWidth;
-	map = keyboardDev->key->curKeySyms.map;
+	minKeyCode = vncKeyboardDev->key->curKeySyms.minKeyCode;
+	mapWidth = vncKeyboardDev->key->curKeySyms.mapWidth;
+	map = vncKeyboardDev->key->curKeySyms.map;
 
-	maxKeysPerMod = keyboardDev->key->maxKeysPerModifier;
-	modmap = keyboardDev->key->modifierKeyMap;
+	maxKeysPerMod = vncKeyboardDev->key->maxKeysPerModifier;
+	modmap = vncKeyboardDev->key->modifierKeyMap;
 
 	for (i = 3; i < 8; i++) {
 		for (k = 0; k < maxKeysPerMod; k++) {
@@ -268,41 +264,44 @@
 	return 0;
 }
 
-KeyCode InputDevice::pressShift(void)
+KeyCode vncPressShift(void)
 {
 	int maxKeysPerMod;
 
-	maxKeysPerMod = keyboardDev->key->maxKeysPerModifier;
-	return keyboardDev->key->modifierKeyMap[ShiftMapIndex * maxKeysPerMod];
+	maxKeysPerMod = vncKeyboardDev->key->maxKeysPerModifier;
+	return vncKeyboardDev->key->modifierKeyMap[ShiftMapIndex * maxKeysPerMod];
 }
 
-std::list<KeyCode> InputDevice::releaseShift(void)
+size_t vncReleaseShift(KeyCode *keys, size_t maxKeys)
 {
-	std::list<KeyCode> keys;
-
+	size_t count;
 	int maxKeysPerMod;
 
-	maxKeysPerMod = keyboardDev->key->maxKeysPerModifier;
+	count = 0;
+	maxKeysPerMod = vncKeyboardDev->key->maxKeysPerModifier;
 	for (int k = 0; k < maxKeysPerMod; k++) {
 		int keycode;
 		int index;
 
 		index = ShiftMapIndex * maxKeysPerMod + k;
 
-		keycode = keyboardDev->key->modifierKeyMap[index];
+		keycode = vncKeyboardDev->key->modifierKeyMap[index];
 		if (keycode == 0)
 			continue;
 
-		if (!IS_PRESSED(keyboardDev, keycode))
+		if (!IS_PRESSED(vncKeyboardDev, keycode))
 			continue;
 
-		keys.push_back(keycode);
+		if (count >= maxKeys)
+			return 0;
+
+		keys[count++] = keycode;
 	}
 
-	return keys;
+	return count;
 }
 
-KeyCode InputDevice::pressLevelThree(void)
+KeyCode vncPressLevelThree(void)
 {
 	unsigned mask, index;
 	int maxKeysPerMod;
@@ -312,41 +311,44 @@
 		return 0;
 
 	index = ffs(mask) - 1;
-	maxKeysPerMod = keyboardDev->key->maxKeysPerModifier;
-	return keyboardDev->key->modifierKeyMap[index * maxKeysPerMod];
+	maxKeysPerMod = vncKeyboardDev->key->maxKeysPerModifier;
+	return vncKeyboardDev->key->modifierKeyMap[index * maxKeysPerMod];
 }
 
-std::list<KeyCode> InputDevice::releaseLevelThree(void)
+size_t vncReleaseLevelThree(KeyCode *keys, size_t maxKeys)
 {
-	std::list<KeyCode> keys;
-
+	size_t count;
 	unsigned mask, msindex;
 	int maxKeysPerMod;
 
 	mask = getLevelThreeMask();
 	if (mask == 0)
-		return keys;
+		return 0;
 
 	msindex = ffs(mask) - 1;
 
-	maxKeysPerMod = keyboardDev->key->maxKeysPerModifier;
+	count = 0;
+	maxKeysPerMod = vncKeyboardDev->key->maxKeysPerModifier;
 	for (int k = 0; k < maxKeysPerMod; k++) {
 		int keycode;
 		int index;
 
 		index = msindex * maxKeysPerMod + k;
 
-		keycode = keyboardDev->key->modifierKeyMap[index];
+		keycode = vncKeyboardDev->key->modifierKeyMap[index];
 		if (keycode == 0)
 			continue;
 
-		if (!IS_PRESSED(keyboardDev, keycode))
+		if (!IS_PRESSED(vncKeyboardDev, keycode))
 			continue;
 
-		keys.push_back(keycode);
+		if (count >= maxKeys)
+			return 0;
+
+		keys[count++] = keycode;
 	}
 
-	return keys;
+	return count;
 }
 
 static KeySym KeyCodetoKeySym(KeySymsPtr keymap, int keycode, int col)
@@ -397,7 +399,7 @@
 	return syms[col];
 }
 
-KeyCode InputDevice::keysymToKeycode(KeySym keysym, unsigned state, unsigned *new_state)
+KeyCode vncKeysymToKeycode(KeySym keysym, unsigned state, unsigned *new_state)
 {
 	int i, j;
 	unsigned mask;
@@ -405,9 +407,9 @@
 	KeySymsPtr keymap;
 	int mapWidth;
 
-	mask = getLevelThreeMask();
+	mask = vncGetLevelThreeMask();
 
-	keymap = &keyboardDev->key->curKeySyms;
+	keymap = &vncKeyboardDev->key->curKeySyms;
 
 	/*
 	 * Column 0 means both shift and "mode_switch" (AltGr) must be released,
@@ -449,7 +451,7 @@
 	return 0;
 }
 
-bool InputDevice::isLockModifier(KeyCode keycode, unsigned state)
+int vncIsLockModifier(KeyCode keycode, unsigned state)
 {
 	int i, j, k;
 
@@ -461,12 +463,12 @@
 
 	int num_lock_index;
 
-	minKeyCode = keyboardDev->key->curKeySyms.minKeyCode;
-	mapWidth = keyboardDev->key->curKeySyms.mapWidth;
-	map = keyboardDev->key->curKeySyms.map;
+	minKeyCode = vncKeyboardDev->key->curKeySyms.minKeyCode;
+	mapWidth = vncKeyboardDev->key->curKeySyms.mapWidth;
+	map = vncKeyboardDev->key->curKeySyms.map;
 
-	maxKeysPerMod = keyboardDev->key->maxKeysPerModifier;
-	modmap = keyboardDev->key->modifierKeyMap;
+	maxKeysPerMod = vncKeyboardDev->key->maxKeysPerModifier;
+	modmap = vncKeyboardDev->key->modifierKeyMap;
 
 	/* Caps Lock is fairly easy as it has a dedicated modmap entry */
 	for (k = 0; k < maxKeysPerMod; k++) {
@@ -474,7 +476,7 @@
 
 		index = LockMapIndex * maxKeysPerMod + k;
 		if (keycode == modmap[index])
-			return true;
+			return 1;
 	}
 
 	/* For Num Lock we need to find the correct modmap entry */
@@ -500,7 +502,7 @@
 done:
 
 	if (num_lock_index == 0)
-		return false;
+		return 0;
 
 	/* Now we can look in the modmap */ 
 	for (k = 0; k < maxKeysPerMod; k++) {
@@ -508,43 +510,43 @@
 
 		index = num_lock_index * maxKeysPerMod + k;
 		if (keycode == modmap[index])
-			return true;
+			return 1;
 	}
 
-	return false;
+	return 0;
 }
 
-bool InputDevice::isAffectedByNumLock(KeyCode keycode)
+int vncIsAffectedByNumLock(KeyCode keycode)
 {
 	KeySymsPtr keymap;
 	int i, per;
 	KeySym *syms;
 
-	keymap = &keyboardDev->key->curKeySyms;
+	keymap = &vncKeyboardDev->key->curKeySyms;
 	per = keymap->mapWidth;
 	syms = &keymap->map[(keycode - keymap->minKeyCode) * per];
 
 	for (i = 0;i < per;i++) {
 		if (IsKeypadKey(syms[i]))
-			return true;
+			return 1;
 		if (IsPrivateKeypadKey(syms[i]))
-			return true;
+			return 1;
 	}
 
-	return false;
+	return 0;
 }
 
-KeyCode InputDevice::addKeysym(KeySym keysym, unsigned state)
+KeyCode vncAddKeysym(KeySym keysym, unsigned state)
 {
 	KeyCode kc;
 
 	int minKeyCode, maxKeyCode, mapWidth;
 	KeySym *map;
 
-	minKeyCode = keyboardDev->key->curKeySyms.minKeyCode;
-	maxKeyCode = keyboardDev->key->curKeySyms.maxKeyCode;
-	mapWidth = keyboardDev->key->curKeySyms.mapWidth;
-	map = keyboardDev->key->curKeySyms.map;
+	minKeyCode = vncKeyboardDev->key->curKeySyms.minKeyCode;
+	maxKeyCode = vncKeyboardDev->key->curKeySyms.maxKeyCode;
+	mapWidth = vncKeyboardDev->key->curKeySyms.mapWidth;
+	map = vncKeyboardDev->key->curKeySyms.map;
 
 	/*
 	 * Magic, which dynamically adds keysym<->keycode mapping
@@ -570,17 +572,17 @@
 #if XORG == 15
 		master = inputInfo.keyboard;
 #else
-		master = keyboardDev->u.master;
+		master = vncKeyboardDev->u.master;
 #endif
 		void *slave = dixLookupPrivate(&master->devPrivates,
 					       CoreDevicePrivateKey);
-		if (keyboardDev == slave) {
+		if (vncKeyboardDev == slave) {
 			dixSetPrivate(&master->devPrivates,
 				      CoreDevicePrivateKey, NULL);
 #if XORG == 15
-			SwitchCoreKeyboard(keyboardDev);
+			SwitchCoreKeyboard(vncKeyboardDev);
 #else
-			CopyKeyClass(keyboardDev, master);
+			CopyKeyClass(vncKeyboardDev, master);
 #endif
 		}
 
diff --git a/unix/xserver/hw/vnc/InputXKB.cc b/unix/xserver/hw/vnc/InputXKB.c
similarity index 80%
rename from unix/xserver/hw/vnc/InputXKB.cc
rename to unix/xserver/hw/vnc/InputXKB.c
index 92288aa..e639d5e 100644
--- a/unix/xserver/hw/vnc/InputXKB.cc
+++ b/unix/xserver/hw/vnc/InputXKB.c
@@ -1,6 +1,6 @@
 /* Copyright (C) 2009 TightVNC Team
  * Copyright (C) 2009 Red Hat, Inc.
- * Copyright 2013 Pierre Ossman for Cendio AB
+ * Copyright 2013-2015 Pierre Ossman for Cendio AB
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,30 +22,34 @@
 #include <dix-config.h>
 #endif
 
-#include "Input.h"
 #include "xorg-version.h"
 
 #if XORG >= 17
 
-extern "C" {
-#define public c_public
-#define class c_class
+#include <stdio.h>
+
+#include <X11/keysym.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
 #include "xkbsrv.h"
 #include "xkbstr.h"
 #include "eventstr.h"
 #include "scrnintstr.h"
 #include "mi.h"
-#include <X11/keysym.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#undef public
-#undef class
-}
+
+#include "Input.h"
 
 #ifndef KEYBOARD_OR_FLOAT
 #define KEYBOARD_OR_FLOAT MASTER_KEYBOARD
 #endif
 
+extern DeviceIntPtr vncKeyboardDev;
+
+static void vncXkbProcessDeviceEvent(int screenNum,
+                                     InternalEvent *event,
+                                     DeviceIntPtr dev);
+
 /* Stolen from libX11 */
 static Bool
 XkbTranslateKeyCode(register XkbDescPtr xkb, KeyCode key,
@@ -195,7 +199,7 @@
 	return effectiveGroup;
 }
 
-void InputDevice::PrepareInputDevices(void)
+void vncPrepareInputDevices(void)
 {
 	/*
 	 * Not ideal since these callbacks do not stack, but it's the only
@@ -206,15 +210,15 @@
 	mieqSetHandler(ET_KeyRelease, vncXkbProcessDeviceEvent);
 }
 
-unsigned InputDevice::getKeyboardState(void)
+unsigned vncGetKeyboardState(void)
 {
 	DeviceIntPtr master;
 
-	master = GetMaster(keyboardDev, KEYBOARD_OR_FLOAT);
+	master = GetMaster(vncKeyboardDev, KEYBOARD_OR_FLOAT);
 	return XkbStateFieldFromRec(&master->key->xkbInfo->state);
 }
 
-unsigned InputDevice::getLevelThreeMask(void)
+unsigned vncGetLevelThreeMask(void)
 {
 	unsigned state;
 	KeyCode keycode;
@@ -222,17 +226,17 @@
 	XkbAction *act;
 
 	/* Group state is still important */
-	state = getKeyboardState();
+	state = vncGetKeyboardState();
 	state &= ~0xff;
 
-	keycode = keysymToKeycode(XK_ISO_Level3_Shift, state, NULL);
+	keycode = vncKeysymToKeycode(XK_ISO_Level3_Shift, state, NULL);
 	if (keycode == 0) {
-		keycode = keysymToKeycode(XK_Mode_switch, state, NULL);
+		keycode = vncKeysymToKeycode(XK_Mode_switch, state, NULL);
 		if (keycode == 0)
 			return 0;
 	}
 
-	xkb = GetMaster(keyboardDev, KEYBOARD_OR_FLOAT)->key->xkbInfo->desc;
+	xkb = GetMaster(vncKeyboardDev, KEYBOARD_OR_FLOAT)->key->xkbInfo->desc;
 
 	act = XkbKeyActionPtr(xkb, keycode, state);
 	if (act == NULL)
@@ -246,18 +250,18 @@
 		return act->mods.mask;
 }
 
-KeyCode InputDevice::pressShift(void)
+KeyCode vncPressShift(void)
 {
 	unsigned state;
 
 	XkbDescPtr xkb;
 	unsigned int key;
 
-	state = getKeyboardState();
+	state = vncGetKeyboardState();
 	if (state & ShiftMask)
 		return 0;
 
-	xkb = GetMaster(keyboardDev, KEYBOARD_OR_FLOAT)->key->xkbInfo->desc;
+	xkb = GetMaster(vncKeyboardDev, KEYBOARD_OR_FLOAT)->key->xkbInfo->desc;
 	for (key = xkb->min_key_code; key <= xkb->max_key_code; key++) {
 		XkbAction *act;
 		unsigned char mask;
@@ -281,20 +285,23 @@
 	return 0;
 }
 
-std::list<KeyCode> InputDevice::releaseShift(void)
+size_t vncReleaseShift(KeyCode *keys, size_t maxKeys)
 {
+	size_t count;
+
 	unsigned state;
-	std::list<KeyCode> keys;
 
 	DeviceIntPtr master;
 	XkbDescPtr xkb;
 	unsigned int key;
 
-	state = getKeyboardState();
+	state = vncGetKeyboardState();
 	if (!(state & ShiftMask))
-		return keys;
+		return 0;
 
-	master = GetMaster(keyboardDev, KEYBOARD_OR_FLOAT);
+	count = 0;
+
+	master = GetMaster(vncKeyboardDev, KEYBOARD_OR_FLOAT);
 	xkb = master->key->xkbInfo->desc;
 	for (key = xkb->min_key_code; key <= xkb->max_key_code; key++) {
 		XkbAction *act;
@@ -318,13 +325,16 @@
 		if (!(mask & ShiftMask))
 			continue;
 
-		keys.push_back(key);
+		if (count >= maxKeys)
+			return 0;
+
+		keys[count++] = key;
 	}
 
-	return keys;
+	return count;
 }
 
-KeyCode InputDevice::pressLevelThree(void)
+KeyCode vncPressLevelThree(void)
 {
 	unsigned state, mask;
 
@@ -332,22 +342,22 @@
 	XkbDescPtr xkb;
 	XkbAction *act;
 
-	mask = getLevelThreeMask();
+	mask = vncGetLevelThreeMask();
 	if (mask == 0)
 		return 0;
 
-	state = getKeyboardState();
+	state = vncGetKeyboardState();
 	if (state & mask)
 		return 0;
 
-	keycode = keysymToKeycode(XK_ISO_Level3_Shift, state, NULL);
+	keycode = vncKeysymToKeycode(XK_ISO_Level3_Shift, state, NULL);
 	if (keycode == 0) {
-		keycode = keysymToKeycode(XK_Mode_switch, state, NULL);
+		keycode = vncKeysymToKeycode(XK_Mode_switch, state, NULL);
 		if (keycode == 0)
 			return 0;
 	}
 
-	xkb = GetMaster(keyboardDev, KEYBOARD_OR_FLOAT)->key->xkbInfo->desc;
+	xkb = GetMaster(vncKeyboardDev, KEYBOARD_OR_FLOAT)->key->xkbInfo->desc;
 
 	act = XkbKeyActionPtr(xkb, keycode, state);
 	if (act == NULL)
@@ -358,24 +368,27 @@
 	return keycode;
 }
 
-std::list<KeyCode> InputDevice::releaseLevelThree(void)
+size_t vncReleaseLevelThree(KeyCode *keys, size_t maxKeys)
 {
+	size_t count;
+
 	unsigned state, mask;
-	std::list<KeyCode> keys;
 
 	DeviceIntPtr master;
 	XkbDescPtr xkb;
 	unsigned int key;
 
-	mask = getLevelThreeMask();
+	mask = vncGetLevelThreeMask();
 	if (mask == 0)
-		return keys;
+		return 0;
 
-	state = getKeyboardState();
+	state = vncGetKeyboardState();
 	if (!(state & mask))
-		return keys;
+		return 0;
 
-	master = GetMaster(keyboardDev, KEYBOARD_OR_FLOAT);
+	count = 0;
+
+	master = GetMaster(vncKeyboardDev, KEYBOARD_OR_FLOAT);
 	xkb = master->key->xkbInfo->desc;
 	for (key = xkb->min_key_code; key <= xkb->max_key_code; key++) {
 		XkbAction *act;
@@ -399,14 +412,16 @@
 		if (!(key_mask & mask))
 			continue;
 
-		keys.push_back(key);
+		if (count >= maxKeys)
+			return 0;
+
+		keys[count++] = key;
 	}
 
-	return keys;
+	return count;
 }
 
-KeyCode InputDevice::keysymToKeycode(KeySym keysym, unsigned state,
-                                     unsigned *new_state)
+KeyCode vncKeysymToKeycode(KeySym keysym, unsigned state, unsigned *new_state)
 {
 	XkbDescPtr xkb;
 	unsigned int key;
@@ -416,7 +431,7 @@
 	if (new_state != NULL)
 		*new_state = state;
 
-	xkb = GetMaster(keyboardDev, KEYBOARD_OR_FLOAT)->key->xkbInfo->desc;
+	xkb = GetMaster(vncKeyboardDev, KEYBOARD_OR_FLOAT)->key->xkbInfo->desc;
 	for (key = xkb->min_key_code; key <= xkb->max_key_code; key++) {
 		unsigned int state_out;
 		KeySym dummy;
@@ -444,48 +459,48 @@
 
 	*new_state = (state & ~ShiftMask) |
 	             ((state & ShiftMask) ? 0 : ShiftMask);
-	key = keysymToKeycode(keysym, *new_state, NULL);
+	key = vncKeysymToKeycode(keysym, *new_state, NULL);
 	if (key != 0)
 		return key;
 
-	level_three_mask = getLevelThreeMask();
+	level_three_mask = vncGetLevelThreeMask();
 	if (level_three_mask == 0)
 		return 0;
 
 	*new_state = (state & ~level_three_mask) | 
 	             ((state & level_three_mask) ? 0 : level_three_mask);
-	key = keysymToKeycode(keysym, *new_state, NULL);
+	key = vncKeysymToKeycode(keysym, *new_state, NULL);
 	if (key != 0)
 		return key;
 
 	*new_state = (state & ~(ShiftMask | level_three_mask)) | 
 	             ((state & ShiftMask) ? 0 : ShiftMask) |
 	             ((state & level_three_mask) ? 0 : level_three_mask);
-	key = keysymToKeycode(keysym, *new_state, NULL);
+	key = vncKeysymToKeycode(keysym, *new_state, NULL);
 	if (key != 0)
 		return key;
 
 	return 0;
 }
 
-bool InputDevice::isLockModifier(KeyCode keycode, unsigned state)
+int vncIsLockModifier(KeyCode keycode, unsigned state)
 {
 	XkbDescPtr xkb;
 	XkbAction *act;
 
-	xkb = GetMaster(keyboardDev, KEYBOARD_OR_FLOAT)->key->xkbInfo->desc;
+	xkb = GetMaster(vncKeyboardDev, KEYBOARD_OR_FLOAT)->key->xkbInfo->desc;
 
 	act = XkbKeyActionPtr(xkb, keycode, state);
 	if (act == NULL)
-		return false;
+		return 0;
 
 	if (act->type != XkbSA_LockMods)
-		return false;
+		return 0;
 
-	return true;
+	return 1;
 }
 
-bool InputDevice::isAffectedByNumLock(KeyCode keycode)
+int vncIsAffectedByNumLock(KeyCode keycode)
 {
 	unsigned state;
 
@@ -499,7 +514,7 @@
 	XkbKeyTypeRec *type;
 
 	/* Group state is still important */
-	state = getKeyboardState();
+	state = vncGetKeyboardState();
 	state &= ~0xff;
 
 	/*
@@ -507,17 +522,17 @@
 	 * or following the keysym Num_Lock is the best approach. We
 	 * try the latter.
 	 */
-	numlock_keycode = keysymToKeycode(XK_Num_Lock, state, NULL);
+	numlock_keycode = vncKeysymToKeycode(XK_Num_Lock, state, NULL);
 	if (numlock_keycode == 0)
-		return false;
+		return 0;
 
-	xkb = GetMaster(keyboardDev, KEYBOARD_OR_FLOAT)->key->xkbInfo->desc;
+	xkb = GetMaster(vncKeyboardDev, KEYBOARD_OR_FLOAT)->key->xkbInfo->desc;
 
 	act = XkbKeyActionPtr(xkb, numlock_keycode, state);
 	if (act == NULL)
-		return false;
+		return 0;
 	if (act->type != XkbSA_LockMods)
-		return false;
+		return 0;
 
 	if (act->mods.flags & XkbSA_UseModMapMods)
 		numlock_mask = xkb->map->modmap[keycode];
@@ -527,12 +542,12 @@
 	group = XkbKeyEffectiveGroup(xkb, keycode, state);
 	type = XkbKeyKeyType(xkb, keycode, group);
 	if ((type->mods.mask & numlock_mask) == 0)
-		return false;
+		return 0;
 
-	return true;
+	return 1;
 }
 
-KeyCode InputDevice::addKeysym(KeySym keysym, unsigned state)
+KeyCode vncAddKeysym(KeySym keysym, unsigned state)
 {
 	DeviceIntPtr master;
 	XkbDescPtr xkb;
@@ -545,7 +560,7 @@
 	KeySym *syms;
 	KeySym upper, lower;
 
-	master = GetMaster(keyboardDev, KEYBOARD_OR_FLOAT);
+	master = GetMaster(vncKeyboardDev, KEYBOARD_OR_FLOAT);
 	xkb = master->key->xkbInfo->desc;
 	for (key = xkb->max_key_code; key >= xkb->min_key_code; key--) {
 		if (XkbKeyNumGroups(xkb, key) == 0)
@@ -608,13 +623,13 @@
 	return key;
 }
 
-void InputDevice::vncXkbProcessDeviceEvent(int screenNum,
-                                           InternalEvent *event,
-                                           DeviceIntPtr dev)
+static void vncXkbProcessDeviceEvent(int screenNum,
+                                     InternalEvent *event,
+                                     DeviceIntPtr dev)
 {
 	unsigned int backupctrls;
 
-	if (event->device_event.sourceid == singleton.keyboardDev->id) {
+	if (event->device_event.sourceid == vncKeyboardDev->id) {
 		XkbControlsPtr ctrls;
 
 		/*
@@ -634,9 +649,9 @@
 			event->device_event.key_repeat = TRUE;
 	}
 
-	dev->c_public.processInputProc(event, dev);
+	dev->public.processInputProc(event, dev);
 
-	if (event->device_event.sourceid == singleton.keyboardDev->id) {
+	if (event->device_event.sourceid == vncKeyboardDev->id) {
 		XkbControlsPtr ctrls;
 
 		ctrls = dev->key->xkbInfo->desc->ctrls;
diff --git a/unix/xserver/hw/vnc/Makefile.am b/unix/xserver/hw/vnc/Makefile.am
index 9885b8a..902aabf 100644
--- a/unix/xserver/hw/vnc/Makefile.am
+++ b/unix/xserver/hw/vnc/Makefile.am
@@ -9,11 +9,14 @@
 
 noinst_LTLIBRARIES = libvnccommon.la
 
-HDRS = RegionHelper.h vncExtInit.h vncHooks.h XserverDesktop.h xorg-version.h \
-	Input.h
+HDRS = vncExtInit.h vncHooks.h \
+	vncBlockHandler.h XorgGlue.h \
+	XserverDesktop.h xorg-version.h \
+	Input.h RFBGlue.h
 
-libvnccommon_la_SOURCES = $(HDRS) vncExtInit.cc vncHooks.cc XserverDesktop.cc \
-	Input.cc InputCore.cc InputXKB.cc
+libvnccommon_la_SOURCES = $(HDRS) vncExt.c vncExtInit.cc vncHooks.c \
+	vncBlockHandler.c XorgGlue.c RFBGlue.cc XserverDesktop.cc \
+	Input.c InputCore.c InputXKB.c
 
 libvnccommon_la_CPPFLAGS = -DVENDOR_RELEASE="$(VENDOR_RELEASE)" \
 	-DVENDOR_STRING="\"$(VENDOR_STRING)\"" -I$(TIGERVNC_SRCDIR)/common -UHAVE_CONFIG_H \
@@ -24,12 +27,10 @@
 
 man1_MANS = Xvnc.man
 
-Xvnc_SOURCES = xvnc.cc \
+Xvnc_SOURCES = xvnc.c \
 	$(top_srcdir)/Xi/stubs.c $(top_srcdir)/mi/miinitext.c \
 	$(top_srcdir)/fb/fbcmap_mi.c buildtime.c
 
-nodist_Xvnc_SOURCES = fbrop.h fb.h pixman.h
-
 Xvnc_CPPFLAGS = $(XVNC_CPPFLAGS) -DTIGERVNC -DNO_MODULE_EXTS \
 	-UHAVE_CONFIG_H \
 	-DXFree86Server -DVENDOR_RELEASE="$(VENDOR_RELEASE)" \
@@ -44,7 +45,7 @@
 libvnc_la_LTLIBRARIES = libvnc.la
 libvnc_ladir = $(moduledir)/extensions
 
-libvnc_la_SOURCES = xf86vncModule.cc
+libvnc_la_SOURCES = vncModule.c
 
 libvnc_la_CPPFLAGS = $(XVNC_CPPFLAGS) -I$(TIGERVNC_SRCDIR)/common -UHAVE_CONFIG_H \
 	-I$(top_srcdir)/hw/xfree86/common \
@@ -58,24 +59,3 @@
 libvnc_la_LIBADD = libvnccommon.la $(COMMON_LIBS)
 
 EXTRA_DIST = Xvnc.man
-
-# C++ hacks
-BUILT_SOURCES = $(nodist_Xvnc_SOURCES)
-
-fb.h: $(top_srcdir)/fb/fb.h
-	cat $(top_srcdir)/fb/fb.h | sed -e 's,and,c_and,g' -e 's,xor,c_xor,g' > $(srcdir)/fb.h
-
-pixman.h:
-	for i in ${XSERVERLIBS_CFLAGS}; do \
-		if [[ "$$i" =~ "pixman" ]]; then \
-			PIXMANINCDIR=`echo $$i | sed s/-I//g`; \
-		fi; \
-	done; \
-	if [ ! "$$PIXMANINCDIR" = "" ]; then \
-		cat $$PIXMANINCDIR/pixman.h | sed 's/xor/c_xor/' > $(srcdir)/pixman.h; \
-	else \
-		echo Pixman include directory not set in XSERVERLIBS_CFLAGS \(perhaps Pixman was not found by configure?\); \
-	fi
-
-fbrop.h: $(top_srcdir)/fb/fbrop.h
-	cat $(top_srcdir)/fb/fbrop.h | sed -e 's,and,c_and,g' -e 's,xor,c_xor,g' > $(srcdir)/fbrop.h
diff --git a/unix/xserver/hw/vnc/RFBGlue.cc b/unix/xserver/hw/vnc/RFBGlue.cc
new file mode 100644
index 0000000..7747d88
--- /dev/null
+++ b/unix/xserver/hw/vnc/RFBGlue.cc
@@ -0,0 +1,195 @@
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2011-2015 Pierre Ossman for Cendio AB
+ * 
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+
+#include <stdlib.h>
+
+#include <network/TcpSocket.h>
+#include <rfb/Configuration.h>
+#include <rfb/LogWriter.h>
+#include <rfb/Logger_stdio.h>
+
+#include "RFBGlue.h"
+
+using namespace rfb;
+
+// Loggers used by C code must be created here
+static LogWriter inputLog("Input");
+
+void vncInitRFB(void)
+{
+  rfb::initStdIOLoggers();
+  rfb::LogWriter::setLogParams("*:stderr:30");
+  rfb::Configuration::enableServerParams();
+}
+
+void vncLogError(const char *name, const char *format, ...)
+{
+  LogWriter *vlog;
+  va_list ap;
+  vlog = LogWriter::getLogWriter(name);
+  if (vlog == NULL)
+    return;
+  va_start(ap, format);
+  vlog->error(format, ap);
+  va_end(ap);
+}
+
+void vncLogStatus(const char *name, const char *format, ...)
+{
+  LogWriter *vlog;
+  va_list ap;
+  vlog = LogWriter::getLogWriter(name);
+  if (vlog == NULL)
+    return;
+  va_start(ap, format);
+  vlog->status(format, ap);
+  va_end(ap);
+}
+
+void vncLogInfo(const char *name, const char *format, ...)
+{
+  LogWriter *vlog;
+  va_list ap;
+  vlog = LogWriter::getLogWriter(name);
+  if (vlog == NULL)
+    return;
+  va_start(ap, format);
+  vlog->info(format, ap);
+  va_end(ap);
+}
+
+void vncLogDebug(const char *name, const char *format, ...)
+{
+  LogWriter *vlog;
+  va_list ap;
+  vlog = LogWriter::getLogWriter(name);
+  if (vlog == NULL)
+    return;
+  va_start(ap, format);
+  vlog->debug(format, ap);
+  va_end(ap);
+}
+
+int vncSetParam(const char *name, const char *value)
+{
+  return rfb::Configuration::setParam(name, value);
+}
+
+int vncSetParamSimple(const char *nameAndValue)
+{
+  return rfb::Configuration::setParam(nameAndValue);
+}
+
+char* vncGetParam(const char *name)
+{
+  rfb::VoidParameter *param;
+  char *value;
+  char *ret;
+
+  // Hack to avoid exposing password!
+  if (strcasecmp(name, "Password") == 0)
+    return NULL;
+
+  param = rfb::Configuration::getParam(name);
+  if (param == NULL)
+    return NULL;
+
+  value = param->getValueStr();
+  if (value == NULL)
+    return NULL;
+
+  ret = strdup(value);
+
+  delete [] value;
+
+  return ret;
+}
+
+const char* vncGetParamDesc(const char *name)
+{
+  rfb::VoidParameter *param;
+
+  param = rfb::Configuration::getParam(name);
+  if (param == NULL)
+    return NULL;
+
+  return param->getDescription();
+}
+
+int vncGetParamCount(void)
+{
+  int count;
+
+  count = 0;
+  for (ParameterIterator i; i.param; i.next())
+    count++;
+
+  return count;
+}
+
+char *vncGetParamList(void)
+{
+  int len;
+  char *data, *ptr;
+
+  len = 0;
+
+  for (ParameterIterator i; i.param; i.next()) {
+    int l = strlen(i.param->getName());
+    if (l <= 255)
+      len += l + 1;
+  }
+
+  data = (char*)malloc(len + 1);
+  if (data == NULL)
+    return NULL;
+
+  ptr = data;
+  for (ParameterIterator i; i.param; i.next()) {
+    int l = strlen(i.param->getName());
+    if (l <= 255) {
+      *ptr++ = l;
+      memcpy(ptr, i.param->getName(), l);
+      ptr += l;
+    }
+  }
+  *ptr = '\0';
+
+  return data;
+}
+
+void vncListParams(int width, int nameWidth)
+{
+  rfb::Configuration::listParams(width, nameWidth);
+}
+
+int vncGetSocketPort(int fd)
+{
+  return network::TcpSocket::getSockPort(fd);
+}
+
+int vncIsTCPPortUsed(int port)
+{
+  try {
+    network::TcpListener l(NULL, port);
+  } catch (rdr::Exception& e) {
+    return 0;
+  }
+  return 1;
+}
diff --git a/unix/xserver/hw/vnc/RFBGlue.h b/unix/xserver/hw/vnc/RFBGlue.h
new file mode 100644
index 0000000..a63afd0
--- /dev/null
+++ b/unix/xserver/hw/vnc/RFBGlue.h
@@ -0,0 +1,56 @@
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2011-2015 Pierre Ossman for Cendio AB
+ * 
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+
+#ifndef RFB_GLUE_H
+#define RFB_GLUE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void vncInitRFB(void);
+
+#ifdef __GNUC__
+#  define __printf_attr(a, b) __attribute__((__format__ (__printf__, a, b)))
+#else
+#  define __printf_attr(a, b)
+#endif // __GNUC__
+
+void vncLogError(const char *name, const char *format, ...) __printf_attr(2, 3);
+void vncLogStatus(const char *name, const char *format, ...) __printf_attr(2, 3);
+void vncLogInfo(const char *name, const char *format, ...) __printf_attr(2, 3);
+void vncLogDebug(const char *name, const char *format, ...) __printf_attr(2, 3);
+
+int vncSetParam(const char *name, const char *value);
+int vncSetParamSimple(const char *nameAndValue);
+char* vncGetParam(const char *name);
+const char* vncGetParamDesc(const char *name);
+
+int vncGetParamCount(void);
+char *vncGetParamList(void);
+void vncListParams(int width, int nameWidth);
+
+int vncGetSocketPort(int fd);
+int vncIsTCPPortUsed(int port);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/unix/xserver/hw/vnc/RegionHelper.h b/unix/xserver/hw/vnc/RegionHelper.h
deleted file mode 100644
index 61dc89f..0000000
--- a/unix/xserver/hw/vnc/RegionHelper.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
- * 
- * This is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- * 
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this software; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
- * USA.
- */
-#ifndef __REGIONHELPER_H__
-#define __REGIONHELPER_H__
-
-// RegionHelper is a class which helps in using X server regions by
-// automatically freeing them in the destructor.  It also fixes a problem with
-// REGION_INIT when given an empty rectangle.
-
-// REGION_NULL was introduced in the Xorg tree as the way to initialise an
-// empty region.  If it's not already defined do it the old way.  Note that the
-// old way causes a segfault in the new tree...
-#ifndef REGION_NULL
-#define REGION_NULL(pScreen,pReg) REGION_INIT(pScreen,pReg,NullBox,0)
-#endif
-
-class RegionHelper {
-public:
-
-  // constructor from a single rect
-  RegionHelper(ScreenPtr pScreen_, BoxPtr rect, int size)
-    : pScreen(pScreen_), reg(0)
-  {
-    init(rect, size);
-  }
-
-  // constructor from an existing X server region
-  RegionHelper(ScreenPtr pScreen_, RegionPtr pRegion)
-    : pScreen(pScreen_), reg(&regRec)
-  {
-    REGION_NULL(pScreen, reg);
-    REGION_COPY(pScreen, reg, pRegion);
-  }
-
-  // constructor from an array of rectangles
-  RegionHelper(ScreenPtr pScreen_, int nrects, xRectanglePtr rects,
-               int ctype=CT_NONE)
-    : pScreen(pScreen_)
-  {
-    reg = RECTS_TO_REGION(pScreen, nrects, rects, ctype);
-  }
-
-  // constructor for calling init() later
-  RegionHelper(ScreenPtr pScreen_) : pScreen(pScreen_), reg(0) {
-  }
-
-  void init(BoxPtr rect, int size) {
-    reg = &regRec;
-    if (!rect || (rect && (rect->x2 == rect->x1 || rect->y2 == rect->y1))) {
-      REGION_NULL(pScreen, reg);
-    } else {
-      REGION_INIT(pScreen, reg, rect, size);
-    }
-  }
-
-  // destructor frees as appropriate
-  ~RegionHelper() {
-    if (reg == &regRec) {
-      REGION_UNINIT(pScreen, reg);
-    } else if (reg) {
-      REGION_DESTROY(pScreen, reg);
-    }
-  }
-  ScreenPtr pScreen;
-  RegionRec regRec;
-  RegionPtr reg;
-};
-
-#endif
diff --git a/unix/xserver/hw/vnc/XorgGlue.c b/unix/xserver/hw/vnc/XorgGlue.c
new file mode 100644
index 0000000..630d67d
--- /dev/null
+++ b/unix/xserver/hw/vnc/XorgGlue.c
@@ -0,0 +1,362 @@
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2011-2015 Pierre Ossman for Cendio AB
+ * 
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <assert.h>
+
+#include "scrnintstr.h"
+#ifdef RANDR
+#include "randrstr.h"
+#endif
+
+#include "XorgGlue.h"
+
+#ifdef RANDR
+extern RRModePtr vncRandRModeGet(int width, int height);
+#endif
+
+const char *vncGetDisplay(void)
+{
+  return display;
+}
+
+unsigned long vncGetServerGeneration(void)
+{
+  return serverGeneration;
+}
+
+int vncGetScreenCount(void)
+{
+  return screenInfo.numScreens;
+}
+
+void vncGetScreenFormat(int scrIdx, int *depth, int *bpp,
+                        int *trueColour, int *bigEndian,
+                        int *redMask, int *greenMask, int *blueMask)
+{
+  int i;
+  VisualPtr vis = NULL;
+
+  assert(depth);
+  assert(bpp);
+  assert(trueColour);
+  assert(bigEndian);
+  assert(redMask);
+  assert(greenMask);
+  assert(blueMask);
+
+  *depth = screenInfo.screens[scrIdx]->rootDepth;
+
+  for (i = 0; i < screenInfo.numPixmapFormats; i++) {
+    if (screenInfo.formats[i].depth == *depth) {
+      *bpp = screenInfo.formats[i].bitsPerPixel;
+      break;
+    }
+  }
+
+  if (i == screenInfo.numPixmapFormats)
+    FatalError("No pixmap format for root depth\n");
+
+  *bigEndian = (screenInfo.imageByteOrder == MSBFirst);
+
+  for (i = 0; i < screenInfo.screens[scrIdx]->numVisuals; i++) {
+    if (screenInfo.screens[scrIdx]->visuals[i].vid == 
+        screenInfo.screens[scrIdx]->rootVisual) {
+      vis = &screenInfo.screens[scrIdx]->visuals[i];
+      break;
+    }
+  }
+
+  if (i == screenInfo.screens[scrIdx]->numVisuals)
+    FatalError("No visual record for root visual\n");
+
+  *trueColour = (vis->class == TrueColor);
+
+  *redMask = vis->redMask;
+  *greenMask = vis->greenMask;
+  *blueMask = vis->blueMask;
+}
+
+int vncGetScreenWidth(int scrIdx)
+{
+  return screenInfo.screens[scrIdx]->width;
+}
+
+int vncGetScreenHeight(int scrIdx)
+{
+  return screenInfo.screens[scrIdx]->height;
+}
+
+int vncRandRResizeScreen(int scrIdx, int width, int height)
+{
+#ifdef RANDR
+  ScreenPtr pScreen = screenInfo.screens[scrIdx];
+  /* Try to retain DPI when we resize */
+  return RRScreenSizeSet(pScreen, width, height,
+                         pScreen->mmWidth * width / pScreen->width,
+                         pScreen->mmHeight * height / pScreen->height);
+#else
+  return -1;
+#endif
+}
+
+void vncRandRUpdateSetTime(int scrIdx)
+{
+#ifdef RANDR
+  rrScrPrivPtr rp = rrGetScrPriv(screenInfo.screens[scrIdx]);
+  rp->lastSetTime = currentTime;
+#endif
+}
+
+int vncRandRHasOutputClones(int scrIdx)
+{
+#ifdef RANDR
+  rrScrPrivPtr rp = rrGetScrPriv(screenInfo.screens[scrIdx]);
+  for (int i = 0;i < rp->numCrtcs;i++) {
+    if (rp->crtcs[i]->numOutputs > 1)
+      return 1;
+  }
+#endif
+  return 0;
+}
+
+int vncRandRGetOutputCount(int scrIdx)
+{
+#ifdef RANDR
+  rrScrPrivPtr rp = rrGetScrPriv(screenInfo.screens[scrIdx]);
+  return rp->numOutputs;
+#else
+  return 0;
+#endif
+}
+
+int vncRandRGetAvailableOutputs(int scrIdx)
+{
+#ifdef RANDR
+  rrScrPrivPtr rp = rrGetScrPriv(screenInfo.screens[scrIdx]);
+
+  int availableOutputs;
+  RRCrtcPtr *usedCrtcs;
+  int numUsed;
+
+  int i, j, k;
+
+  usedCrtcs = malloc(sizeof(RRCrtcPtr) * rp->numCrtcs);
+  if (usedCrtcs == NULL)
+    return 0;
+
+  /*
+   * This gets slightly complicated because we might need to hook a CRTC
+   * up to the output, but also check that we don't try to use the same
+   * CRTC for multiple outputs.
+   */
+  availableOutputs = 0;
+  numUsed = 0;
+  for (i = 0;i < rp->numOutputs;i++) {
+    RROutputPtr output;
+
+    output = rp->outputs[i];
+
+    if (output->crtc != NULL)
+      availableOutputs++;
+    else {
+      for (j = 0;j < output->numCrtcs;j++) {
+        if (output->crtcs[j]->numOutputs != 0)
+          continue;
+
+        for (k = 0;k < numUsed;k++) {
+          if (usedCrtcs[k] == output->crtcs[j])
+            break;
+        }
+        if (k != numUsed)
+          continue;
+
+        availableOutputs++;
+
+        usedCrtcs[numUsed] = output->crtcs[j];
+        numUsed++;
+
+        break;
+      }
+    }
+  }
+
+  free(usedCrtcs);
+
+  return availableOutputs;
+#else
+  return 0;
+#endif
+}
+
+const char *vncRandRGetOutputName(int scrIdx, int outputIdx)
+{
+#ifdef RANDR
+  rrScrPrivPtr rp = rrGetScrPriv(screenInfo.screens[scrIdx]);
+  return rp->outputs[outputIdx]->name;
+#else
+  return "";
+#endif
+}
+
+int vncRandRIsOutputEnabled(int scrIdx, int outputIdx)
+{
+#ifdef RANDR
+  rrScrPrivPtr rp = rrGetScrPriv(screenInfo.screens[scrIdx]);
+
+  if (rp->outputs[outputIdx]->crtc == NULL)
+    return 0;
+  if (rp->outputs[outputIdx]->crtc->mode == NULL)
+    return 0;
+
+  return 1;
+#else
+  return 0;
+#endif
+}
+
+int vncRandRIsOutputUsable(int scrIdx, int outputIdx)
+{
+#ifdef RANDR
+  rrScrPrivPtr rp = rrGetScrPriv(screenInfo.screens[scrIdx]);
+
+  RROutputPtr output;
+  int i;
+
+  output = rp->outputs[outputIdx];
+  if (output->crtc != NULL)
+    return 1;
+
+  /* Any unused CRTCs? */
+  for (i = 0;i < output->numCrtcs;i++) {
+    if (output->crtcs[i]->numOutputs == 0)
+      return 1;
+  }
+#endif
+
+  return 0;
+}
+
+int vncRandRDisableOutput(int scrIdx, int outputIdx)
+{
+#ifdef RANDR
+  rrScrPrivPtr rp = rrGetScrPriv(screenInfo.screens[scrIdx]);
+  RRCrtcPtr crtc;
+
+  crtc = rp->outputs[outputIdx]->crtc;
+  if (crtc == NULL)
+    return 0;
+
+  return RRCrtcSet(crtc, NULL, crtc->x, crtc->y, crtc->rotation, 0, NULL);
+#else
+  return -1;
+#endif
+}
+
+intptr_t vncRandRGetOutputId(int scrIdx, int outputIdx)
+{
+#ifdef RANDR
+  rrScrPrivPtr rp = rrGetScrPriv(screenInfo.screens[scrIdx]);
+  return (intptr_t)rp->outputs[outputIdx];
+#else
+  return 0;
+#endif
+}
+
+void vncRandRGetOutputDimensions(int scrIdx, int outputIdx,
+                            int *x, int *y, int *width, int *height)
+{
+#ifdef RANDR
+  rrScrPrivPtr rp = rrGetScrPriv(screenInfo.screens[scrIdx]);
+
+  *x = rp->outputs[outputIdx]->crtc->x;
+  *y = rp->outputs[outputIdx]->crtc->y;
+  *width = rp->outputs[outputIdx]->crtc->mode->mode.width;
+  *height = rp->outputs[outputIdx]->crtc->mode->mode.height;
+#endif
+}
+
+#ifdef RANDR
+static RRModePtr findRandRMode(RROutputPtr output, int width, int height)
+{
+  RRModePtr mode;
+
+  for (int i = 0;i < output->numModes;i++) {
+    if ((output->modes[i]->mode.width == width) &&
+        (output->modes[i]->mode.height == height))
+      return output->modes[i];
+  }
+
+  mode = vncRandRModeGet(width, height);
+  if (mode != NULL)
+    return mode;
+
+  return NULL;
+}
+#endif
+
+int vncRandRReconfigureOutput(int scrIdx, int outputIdx, int x, int y,
+                              int width, int height)
+{
+#ifdef RANDR
+  rrScrPrivPtr rp = rrGetScrPriv(screenInfo.screens[scrIdx]);
+
+  RROutputPtr output;
+  RRCrtcPtr crtc;
+  RRModePtr mode;
+
+  int i;
+
+  output = rp->outputs[outputIdx];
+  crtc = output->crtc;
+
+  /* Need a CRTC? */
+  if (crtc == NULL) {
+    for (i = 0;i < output->numCrtcs;i++) {
+      if (output->crtcs[i]->numOutputs != 0)
+        continue;
+
+      crtc = output->crtcs[i];
+      break;
+    }
+
+    /* Couldn't find one... */
+    if (crtc == NULL)
+      return -1;
+  }
+
+  mode = crtc->mode;
+
+  /* Need to switch mode? */
+  if ((mode == NULL) ||
+      (mode->mode.width != width) || (mode->mode.height != height)) {
+    mode = findRandRMode(output, width, height);
+    if (mode == NULL)
+      return -1;
+  }
+
+  /* Reconfigure new mode and position */
+  return RRCrtcSet(crtc, mode, x, y, crtc->rotation, 1, &output);
+#else
+  return -1;
+#endif
+}
diff --git a/unix/xserver/hw/vnc/XorgGlue.h b/unix/xserver/hw/vnc/XorgGlue.h
new file mode 100644
index 0000000..abca48d
--- /dev/null
+++ b/unix/xserver/hw/vnc/XorgGlue.h
@@ -0,0 +1,67 @@
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2011-2015 Pierre Ossman for Cendio AB
+ * 
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+
+#ifndef XORG_GLUE_H
+#define XORG_GLUE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+const char *vncGetDisplay(void);
+unsigned long vncGetServerGeneration(void);
+
+int vncGetScreenCount(void);
+
+void vncGetScreenFormat(int scrIdx, int *depth, int *bpp,
+                        int *trueColour, int *bigEndian,
+                        int *redMask, int *greenMask, int *blueMask);
+
+int vncGetScreenWidth(int scrIdx);
+int vncGetScreenHeight(int scrIdx);
+
+int vncRandRResizeScreen(int scrIdx, int width, int height);
+void vncRandRUpdateSetTime(int scrIdx);
+
+int vncRandRHasOutputClones(int scrIdx);
+
+int vncRandRGetOutputCount(int scrIdx);
+int vncRandRGetAvailableOutputs(int scrIdx);
+
+const char *vncRandRGetOutputName(int scrIdx, int outputIdx);
+
+int vncRandRIsOutputEnabled(int scrIdx, int outputIdx);
+int vncRandRIsOutputUsable(int scrIdx, int outputIdx);
+
+int vncRandRDisableOutput(int scrIdx, int outputIdx);
+int vncRandRReconfigureOutput(int scrIdx, int outputIdx, int x, int y,
+                              int width, int height);
+
+intptr_t vncRandRGetOutputId(int scrIdx, int outputIdx);
+void vncRandRGetOutputDimensions(int scrIdx, int outputIdx,
+                                 int *x, int *y, int *width, int *height);
+
+// This one hides in xvnc.c or vncModule.c
+int vncRandRCreateOutputs(int scrIdx, int extraOutputs);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/unix/xserver/hw/vnc/XserverDesktop.cc b/unix/xserver/hw/vnc/XserverDesktop.cc
index 3ab1103..b898813 100644
--- a/unix/xserver/hw/vnc/XserverDesktop.cc
+++ b/unix/xserver/hw/vnc/XserverDesktop.cc
@@ -1,5 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
- * Copyright 2009-2011 Pierre Ossman for Cendio AB
+ * Copyright 2009-2015 Pierre Ossman for Cendio AB
  * Copyright 2014 Brian P. Hinz
  * 
  * This is free software; you can redistribute it and/or modify
@@ -21,12 +21,9 @@
 // XserverDesktop.cxx
 //
 
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
 #include <assert.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <strings.h>
 #include <unistd.h>
 #include <pwd.h>
@@ -34,65 +31,29 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <sys/utsname.h>
+
 #include <network/TcpSocket.h>
 #include <rfb/Exception.h>
 #include <rfb/VNCServerST.h>
 #include <rfb/HTTPServer.h>
 #include <rfb/LogWriter.h>
 #include <rfb/Configuration.h>
+#include <rfb/ServerCore.h>
+
 #include "XserverDesktop.h"
 #include "vncExtInit.h"
-#include "xorg-version.h"
+#include "vncHooks.h"
+#include "XorgGlue.h"
 #include "Input.h"
 
-extern "C" {
-#define public c_public
-#define class c_class
-
-#ifdef RANDR
-#include "randrstr.h"
-#endif
-#include "cursorstr.h"
-#undef public
-#undef class
-}
+// Hack to catch when inetd has let us go
+extern "C" void vncClientGone(int fd);
 
 using namespace rfb;
 using namespace network;
 
 static LogWriter vlog("XserverDesktop");
 
-IntParameter queryConnectTimeout("QueryConnectTimeout",
-                                 "Number of seconds to show the Accept Connection dialog before "
-                                 "rejecting the connection",
-                                 10);
-
-static rdr::U8 reverseBits[] = {
-  0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0,
-  0x30, 0xb0, 0x70, 0xf0, 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
-  0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 0x04, 0x84, 0x44, 0xc4,
-  0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
-  0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc,
-  0x3c, 0xbc, 0x7c, 0xfc, 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
-  0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 0x0a, 0x8a, 0x4a, 0xca,
-  0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
-  0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6,
-  0x36, 0xb6, 0x76, 0xf6, 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
-  0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 0x01, 0x81, 0x41, 0xc1,
-  0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
-  0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9,
-  0x39, 0xb9, 0x79, 0xf9, 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
-  0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 0x0d, 0x8d, 0x4d, 0xcd,
-  0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
-  0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3,
-  0x33, 0xb3, 0x73, 0xf3, 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
-  0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 0x07, 0x87, 0x47, 0xc7,
-  0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
-  0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf,
-  0x3f, 0xbf, 0x7f, 0xff
-};
-
-
 class FileHTTPServer : public rfb::HTTPServer {
 public:
   FileHTTPServer(XserverDesktop* d) : desktop(d) {}
@@ -132,22 +93,22 @@
 };
 
 
-XserverDesktop::XserverDesktop(ScreenPtr pScreen_,
+XserverDesktop::XserverDesktop(int screenIndex_,
                                network::TcpListener* listener_,
                                network::TcpListener* httpListener_,
                                const char* name, const rfb::PixelFormat &pf,
+                               int width, int height,
                                void* fbptr, int stride)
-  : pScreen(pScreen_),
+  : screenIndex(screenIndex_),
     server(0), httpServer(0),
     listener(listener_), httpListener(httpListener_),
-    deferredUpdateTimerSet(false),
-    grabbing(false), ignoreHooks_(false), directFbptr(true),
+    deferredUpdateTimerSet(false), directFbptr(true),
     queryConnectId(0)
 {
   format = pf;
 
   server = new VNCServerST(name, this);
-  setFramebuffer(pScreen->width, pScreen->height, fbptr, stride);
+  setFramebuffer(width, height, fbptr, stride);
   server->setQueryConnectionHandler(this);
 
   if (httpListener)
@@ -206,25 +167,21 @@
 ScreenSet XserverDesktop::computeScreenLayout()
 {
   ScreenSet layout;
-
-#ifdef RANDR
-  rrScrPrivPtr rp = rrGetScrPriv(pScreen);
   OutputIdMap newIdMap;
 
-  for (int i = 0;i < rp->numOutputs;i++) {
-      RROutputPtr output;
-      RRCrtcPtr crtc;
-
-      output = rp->outputs[i];
-      crtc = output->crtc;
+  for (int i = 0;i < vncRandRGetOutputCount(screenIndex);i++) {
+      intptr_t outputId;
+      int x, y, width, height;
 
       /* Disabled? */
-      if ((crtc == NULL) || (crtc->mode == NULL))
+      if (!vncRandRIsOutputEnabled(screenIndex, i))
           continue;
 
+      outputId = vncRandRGetOutputId(screenIndex, i);
+
       /* Known output? */
-      if (outputIdMap.count(output) == 1)
-        newIdMap[output] = outputIdMap[output];
+      if (outputIdMap.count(outputId) == 1)
+        newIdMap[outputId] = outputIdMap[outputId];
       else {
         rdr::U32 id;
         OutputIdMap::const_iterator iter;
@@ -239,52 +196,28 @@
             break;
         }
 
-        newIdMap[output] = id;
+        newIdMap[outputId] = id;
       }
 
-      layout.add_screen(Screen(newIdMap[output], crtc->x, crtc->y,
-                               crtc->mode->mode.width,
-                               crtc->mode->mode.height,
-                               0));
+      vncRandRGetOutputDimensions(screenIndex, i, &x, &y, &width, &height);
+
+      layout.add_screen(Screen(newIdMap[outputId], x, y, width, height, 0));
   }
 
   /* Only keep the entries that are currently active */
   outputIdMap = newIdMap;
-#endif
 
   /*
    * Make sure we have something to display. Hopefully it's just temporary
    * that we have no active outputs...
    */
   if (layout.num_screens() == 0)
-    layout.add_screen(Screen(0, 0, 0, pScreen->width, pScreen->height, 0));
+    layout.add_screen(Screen(0, 0, 0, vncGetScreenWidth(screenIndex),
+                             vncGetScreenHeight(screenIndex), 0));
 
   return layout;
 }
 
-#ifdef RANDR
-
-extern RRModePtr vncRandRModeGet(int width, int height);
-
-RRModePtr XserverDesktop::findRandRMode(RROutputPtr output, int width, int height)
-{
-  RRModePtr mode;
-
-  for (int i = 0;i < output->numModes;i++) {
-    if ((output->modes[i]->mode.width == width) &&
-        (output->modes[i]->mode.height == height))
-      return output->modes[i];
-  }
-
-  mode = vncRandRModeGet(width, height);
-  if (mode != NULL)
-    return mode;
-
-  return NULL;
-}
-
-#endif
-
 char* XserverDesktop::substitute(const char* varName)
 {
   if (strcmp(varName, "$$") == 0) {
@@ -325,7 +258,7 @@
     strncpy(str, uts.nodename, 240);
     str[239] = '\0'; /* Ensure string is zero-terminated */
     strcat(str, ":");
-    strncat(str, display, 10);
+    strncat(str, vncGetDisplay(), 10);
     return str;
   }
   if (strcmp(varName, "$USER") == 0) {
@@ -338,17 +271,28 @@
 rfb::VNCServerST::queryResult
 XserverDesktop::queryConnection(network::Socket* sock,
                                 const char* userName,
-                                char** reason) {
+                                char** reason)
+{
+  int count;
+
   if (queryConnectId) {
     *reason = strDup("Another connection is currently being queried.");
     return rfb::VNCServerST::REJECT;
   }
+
   queryConnectAddress.replaceBuf(sock->getPeerAddress());
   if (!userName)
     userName = "(anonymous)";
   queryConnectUsername.replaceBuf(strDup(userName));
-  queryConnectId = sock;
-  vncQueryConnect(this, sock);
+  queryConnectId = (uint32_t)(intptr_t)sock;
+  queryConnectSocket = sock;
+
+  count = vncNotifyQueryConnect();
+  if (count == 0) {
+    *reason = strDup("Unable to query the local user to accept the connection.");
+    return rfb::VNCServerST::REJECT;
+  }
+
   return rfb::VNCServerST::PENDING;
 }
 
@@ -375,148 +319,77 @@
   }
 }
 
-void XserverDesktop::setCursor(CursorPtr cursor)
+void XserverDesktop::setCursor(int width, int height, int hotX, int hotY,
+                               const unsigned char *rgbaData)
 {
-  try {
-    int w = cursor->bits->width;
-    int h = cursor->bits->height;
+  rdr::U8* cursorData;
+  rdr::U8* cursorMask;
+  int rfbMaskBytesPerRow;
 
-    rdr::U8* cursorData = new rdr::U8[w * h * (getPF().bpp / 8)];
+  rdr::U8 *out;
+  const unsigned char *in;
+  rdr::U8 rgb[3];
 
-    int rfbMaskBytesPerRow = (w + 7) / 8;
+  cursorData = new rdr::U8[width * height * (getPF().bpp / 8)];
 
-    rdr::U8* cursorMask = new rdr::U8[rfbMaskBytesPerRow * h];
+  rfbMaskBytesPerRow = (width + 7) / 8;
 
-#ifdef ARGB_CURSOR
-    if (cursor->bits->argb) {
-      rdr::U8 *out;
-      CARD32 *in;
+  cursorMask = new rdr::U8[rfbMaskBytesPerRow * height];
 
-      rdr::U8 rgb[3];
+  memset(cursorMask, 0, rfbMaskBytesPerRow * height);
 
-      memset(cursorMask, 0, rfbMaskBytesPerRow * h);
+  in = rgbaData;
+  out = cursorData;
+  for (int y = 0; y < height; y++) {
+    for (int x = 0; x < width; x++) {
+      rgb[0] = *in++;
+      rgb[1] = *in++;
+      rgb[2] = *in++;
 
-      in = cursor->bits->argb;
-      out = cursorData;
-      for (int y = 0; y < h; y++) {
-        for (int x = 0; x < w; x++) {
-          rgb[0] = (*in >> 16) & 0xff;
-          rgb[1] = (*in >>  8) & 0xff;
-          rgb[2] = (*in >>  0) & 0xff;
+      getPF().bufferFromRGB(out, rgb, 1);
 
-          getPF().bufferFromRGB(out, rgb, 1);
+      if (*in++ > 127)
+        cursorMask[y * rfbMaskBytesPerRow + x/8] |= 0x80>>(x%8);
 
-          if (((*in >> 24) & 0xff) > 127)
-            cursorMask[y * rfbMaskBytesPerRow + x/8] |= 0x80>>(x%8);
-
-          in++;
-          out += getPF().bpp/8;
-        }
-      }
-    } else {
-#endif
-      rdr::U8 rgb[3];
-      rdr::U8 fg[4], bg[4];
-
-      rdr::U8* buffer;
-
-      rgb[0] = cursor->foreRed;
-      rgb[1] = cursor->foreGreen;
-      rgb[2] = cursor->foreBlue;
-      getPF().bufferFromRGB(fg, rgb, 1);
-
-      rgb[0] = cursor->backRed;
-      rgb[1] = cursor->backGreen;
-      rgb[2] = cursor->backBlue;
-      getPF().bufferFromRGB(bg, rgb, 1);
-
-      int xMaskBytesPerRow = BitmapBytePad(w);
-
-      buffer = cursorData;
-
-      for (int y = 0; y < h; y++) {
-        for (int x = 0; x < w; x++) {
-          rdr::U8 *pixel;
-          int byte = y * xMaskBytesPerRow + x / 8;
-#if (BITMAP_BIT_ORDER == MSBFirst)
-          int bit = 7 - x % 8;
-#else
-          int bit = x % 8;
-#endif
-
-          if (cursor->bits->source[byte] & (1 << bit))
-            pixel = fg;
-          else
-            pixel = bg;
-
-          memcpy(buffer, pixel, getPF().bpp/8);
-          buffer += getPF().bpp/8;
-        }
-      }
-
-      for (int j = 0; j < h; j++) {
-        for (int i = 0; i < rfbMaskBytesPerRow; i++)
-#if (BITMAP_BIT_ORDER == MSBFirst)
-          cursorMask[j * rfbMaskBytesPerRow + i]
-            = cursor->bits->mask[j * xMaskBytesPerRow + i];
-#else
-          cursorMask[j * rfbMaskBytesPerRow + i]
-            = reverseBits[cursor->bits->mask[j * xMaskBytesPerRow + i]];
-#endif
-      }
-#ifdef ARGB_CURSOR
+      out += getPF().bpp/8;
     }
-#endif
+  }
 
-    server->setCursor(cursor->bits->width, cursor->bits->height,
-                      Point(cursor->bits->xhot, cursor->bits->yhot),
-                      cursorData, cursorMask);
-    delete [] cursorData;
-    delete [] cursorMask;
+  try {
+    server->setCursor(width, height, Point(hotX, hotY), cursorData, cursorMask);
   } catch (rdr::Exception& e) {
     vlog.error("XserverDesktop::setCursor: %s",e.str());
   }
+
+  delete [] cursorData;
+  delete [] cursorMask;
 }
 
-void XserverDesktop::add_changed(RegionPtr reg)
+void XserverDesktop::add_changed(const rfb::Region &region)
 {
-  if (ignoreHooks_) return;
-  if (grabbing) return;
   try {
-    rfb::Region rfbReg;
-    rfbReg.setExtentsAndOrderedRects((ShortRect*)REGION_EXTENTS(pScreen, reg),
-                                     REGION_NUM_RECTS(reg),
-                                     (ShortRect*)REGION_RECTS(reg));
-    server->add_changed(rfbReg);
+    server->add_changed(region);
   } catch (rdr::Exception& e) {
     vlog.error("XserverDesktop::add_changed: %s",e.str());
   }
 }
 
-void XserverDesktop::add_copied(RegionPtr dst, int dx, int dy)
+void XserverDesktop::add_copied(const rfb::Region &dest, const rfb::Point &delta)
 {
-  if (ignoreHooks_) return;
-  if (grabbing) return;
   try {
-    rfb::Region rfbReg;
-    rfbReg.setExtentsAndOrderedRects((ShortRect*)REGION_EXTENTS(pScreen, dst),
-                                     REGION_NUM_RECTS(dst),
-                                     (ShortRect*)REGION_RECTS(dst));
-    server->add_copied(rfbReg, rfb::Point(dx, dy));
+    server->add_copied(dest, delta);
   } catch (rdr::Exception& e) {
     vlog.error("XserverDesktop::add_copied: %s",e.str());
   }
 }
 
-static struct timeval XserverDesktopTimeout;
-
-void XserverDesktop::blockHandler(fd_set* fds, OSTimePtr timeout)
+void XserverDesktop::readBlockHandler(fd_set* fds, struct timeval ** timeout)
 {
   // We don't have a good callback for when we can init input devices[1],
   // so we abuse the fact that this routine will be called first thing
   // once the dix is done initialising.
   // [1] Technically Xvnc has InitInput(), but libvnc.so has nothing.
-  vncInputDevice->InitInputDevice();
+  vncInitInputDevice();
 
   try {
     int nextTimeout;
@@ -565,9 +438,9 @@
           ((*timeout)->tv_sec > (nextTimeout/1000)) ||
           (((*timeout)->tv_sec == (nextTimeout/1000)) &&
            ((*timeout)->tv_usec > ((nextTimeout%1000)*1000)))) {
-        XserverDesktopTimeout.tv_sec = nextTimeout/1000;
-        XserverDesktopTimeout.tv_usec = (nextTimeout%1000)*1000;
-        *timeout = &XserverDesktopTimeout;
+        dixTimeout.tv_sec = nextTimeout/1000;
+        dixTimeout.tv_usec = (nextTimeout%1000)*1000;
+        *timeout = &dixTimeout;
       }
     }
 
@@ -576,7 +449,7 @@
   }
 }
 
-void XserverDesktop::wakeupHandler(fd_set* fds, int nfds)
+void XserverDesktop::readWakeupHandler(fd_set* fds, int nfds)
 {
   try {
     // First check for file descriptors with something to do
@@ -625,8 +498,11 @@
       }
 
       // We are responsible for propagating mouse movement between clients
-      if (!oldCursorPos.equals(vncInputDevice->getPointerPos())) {
-        oldCursorPos = vncInputDevice->getPointerPos();
+      int cursorX, cursorY;
+      vncGetPointerPos(&cursorX, &cursorY);
+      if (oldCursorPos.x != cursorX || oldCursorPos.y != cursorY) {
+        oldCursorPos.x = cursorX;
+        oldCursorPos.y = cursorY;
         server->setCursorPos(oldCursorPos);
       }
     }
@@ -639,7 +515,7 @@
   }
 }
 
-void XserverDesktop::writeBlockHandler(fd_set* fds)
+void XserverDesktop::writeBlockHandler(fd_set* fds, struct timeval ** timeout)
 {
   try {
     std::list<Socket*> sockets;
@@ -724,26 +600,29 @@
 }
 
 
-int XserverDesktop::getQueryTimeout(void* opaqueId,
-                                    const char** address,
-                                    const char** username)
+void XserverDesktop::getQueryConnect(uint32_t* opaqueId,
+                                     const char** address,
+                                     const char** username,
+                                     int *timeout)
 {
-  if (opaqueId && queryConnectId == opaqueId) {
-    vlog.info("address=%s, username=%s, timeout=%d",
-              queryConnectAddress.buf, queryConnectUsername.buf,
-              (int)queryConnectTimeout);
-    if (address) *address = queryConnectAddress.buf;
-    if (username) *username = queryConnectUsername.buf;
-    return queryConnectTimeout;
+  *opaqueId = queryConnectId;
+
+  if (queryConnectId == 0) {
+    *address = "";
+    *username = "";
+    *timeout = 0;
+  } else {
+    *address = queryConnectAddress.buf;
+    *username = queryConnectUsername.buf;
+    *timeout = rfb::Server::queryConnectTimeout;
   }
-  return 0;
 }
 
-void XserverDesktop::approveConnection(void* opaqueId, bool accept,
+void XserverDesktop::approveConnection(uint32_t opaqueId, bool accept,
                                        const char* rejectMsg)
 {
   if (queryConnectId == opaqueId) {
-    server->approveConnection((network::Socket*)opaqueId, accept, rejectMsg);
+    server->approveConnection(queryConnectSocket, accept, rejectMsg);
     queryConnectId = 0;
   }
 }
@@ -755,8 +634,8 @@
 
 void XserverDesktop::pointerEvent(const Point& pos, int buttonMask)
 {
-  vncInputDevice->PointerMove(pos);
-  vncInputDevice->PointerButtonAction(buttonMask);
+  vncPointerMove(pos.x, pos.y);
+  vncPointerButtonAction(buttonMask);
 }
 
 void XserverDesktop::clientCutText(const char* str, int len)
@@ -764,79 +643,50 @@
   vncClientCutText(str, len);
 }
 
-extern RROutputPtr vncRandROutputCreate(ScreenPtr pScreen);
-
 unsigned int XserverDesktop::setScreenLayout(int fb_width, int fb_height,
                                              const rfb::ScreenSet& layout)
 {
-#ifndef RANDR
-  return rfb::resultProhibited;
-#else
+  int ret;
   int availableOutputs;
-  Bool ret;
 
-  rrScrPrivPtr rp = rrGetScrPriv(pScreen);
+  // RandR support?
+  if (vncRandRGetOutputCount(screenIndex) == 0)
+    return rfb::resultProhibited;
+
+  char buffer[2048];
+  vlog.debug("Got request for framebuffer resize to %dx%d",
+             fb_width, fb_height);
+  layout.print(buffer, sizeof(buffer));
+  vlog.debug("%s", buffer);
 
   /*
    * First check that we don't have any active clone modes. That's just
    * too messy to deal with.
    */
-  for (int i = 0;i < rp->numCrtcs;i++) {
-    if (rp->crtcs[i]->numOutputs > 1) {
-      vlog.error("Clone mode active. Refusing to touch screen layout.");
+  if (vncRandRHasOutputClones(screenIndex)) {
+    vlog.error("Clone mode active. Refusing to touch screen layout.");
+    return rfb::resultInvalid;
+  }
+
+  /* Next count how many useful outputs we have... */
+  availableOutputs = vncRandRGetAvailableOutputs(screenIndex);
+
+  /* Try to create more outputs if needed... (only works on Xvnc) */
+  if (layout.num_screens() > availableOutputs) {
+    vlog.debug("Insufficient screens. Need to create %d more.",
+               layout.num_screens() - availableOutputs);
+    ret = vncRandRCreateOutputs(screenIndex,
+                                layout.num_screens() - availableOutputs);
+    if (ret < 0) {
+      vlog.error("Unable to create more screens, as needed by the new client layout.");
       return rfb::resultInvalid;
     }
   }
 
-  /*
-   * Next count how many useful outputs we have...
-   *
-   * This gets slightly complicated because we might need to hook a CRTC
-   * up to the output, but also check that we don't try to use the same
-   * CRTC for multiple outputs.
-   */
-  std::set<RRCrtcPtr> usedCrtcs;
-  availableOutputs = 0;
-  for (int i = 0;i < rp->numOutputs;i++) {
-    RROutputPtr output;
-
-    output = rp->outputs[i];
-
-    if (output->crtc != NULL)
-      availableOutputs++;
-    else {
-      for (int j = 0;j < output->numCrtcs;j++) {
-        if (output->crtcs[j]->numOutputs != 0)
-          continue;
-        if (usedCrtcs.count(output->crtcs[j]) != 0)
-          continue;
-
-        availableOutputs++;
-        usedCrtcs.insert(output->crtcs[j]);
-
-        break;
-      }
-    }
-  }
-
-  /* Try to create more outputs if needed... (only works on Xvnc) */
-  if (layout.num_screens() > availableOutputs) {
-    for (int i = 0;i < (layout.num_screens() - availableOutputs);i++) {
-      RROutputPtr output;
-      output = vncRandROutputCreate(pScreen);
-      if (output == NULL) {
-        vlog.error("Unable to create more screens, as needed by the new client layout.");
-        return rfb::resultInvalid;
-      }
-    }
-  }
-
   /* First we might need to resize the screen */
-  if ((fb_width != pScreen->width) || (fb_height != pScreen->height)) {
-    /* Try to retain DPI when we resize */
-    ret = RRScreenSizeSet(pScreen, fb_width, fb_height,
-                          pScreen->mmWidth * fb_width / pScreen->width,
-                          pScreen->mmHeight * fb_height / pScreen->height);
+  if ((fb_width != vncGetScreenWidth(screenIndex)) ||
+      (fb_height != vncGetScreenHeight(screenIndex))) {
+    ret = vncRandRResizeScreen(screenIndex, fb_width, fb_height);
     if (!ret) {
       vlog.error("Failed to resize screen to %dx%d", fb_width, fb_height);
       return rfb::resultInvalid;
@@ -844,27 +694,17 @@
   }
 
   /* Next, reconfigure all known outputs, and turn off the other ones */
-  for (int i = 0;i < rp->numOutputs;i++) {
-    RROutputPtr output;
-    RRCrtcPtr crtc;
-    RRModePtr mode;
+  for (int i = 0;i < vncRandRGetOutputCount(screenIndex);i++) {
+    intptr_t output;
 
     ScreenSet::const_iterator iter;
 
-    output = rp->outputs[i];
-    crtc = output->crtc;
+    output = vncRandRGetOutputId(screenIndex, i);
 
     /* Known? */
     if (outputIdMap.count(output) == 0)
       continue;
 
-    /* A known output should have a CRTC, but double check... */
-    if (crtc == NULL) {
-      vlog.error("Existing output '%s' has unexpectedly been disabled",
-                 output->name);
-      continue;
-    }
-
     /* Find the corresponding screen... */
     for (iter = layout.begin();iter != layout.end();++iter) {
       if (iter->id == outputIdMap[output])
@@ -874,37 +714,25 @@
     /* Missing? */
     if (iter == layout.end()) {
       /* Disable and move on... */
-      ret = RRCrtcSet(crtc, NULL, crtc->x, crtc->y, crtc->rotation, 0, NULL);
+      ret = vncRandRDisableOutput(screenIndex, i);
       if (!ret) {
-        vlog.error("Failed to disable unused CRTC for output '%s'",
-                   output->name);
+        vlog.error("Failed to disable unused output '%s'",
+                   vncRandRGetOutputName(screenIndex, i));
         return rfb::resultInvalid;
       }
       outputIdMap.erase(output);
       continue;
     }
 
-    /* Need to switch mode? */
-    if ((crtc->mode->mode.width == iter->dimensions.width()) &&
-        (crtc->mode->mode.height == iter->dimensions.height()))
-      mode = crtc->mode;
-    else {
-      mode = findRandRMode(output, iter->dimensions.width(),
-                           iter->dimensions.height());
-      if (mode == NULL) {
-        vlog.error("Failed to find a suitable mode for %dx%d for output '%s'",
-                   iter->dimensions.width(), iter->dimensions.height(),
-                   output->name);
-        return rfb::resultInvalid;
-      }
-    }
-
     /* Reconfigure new mode and position */
-    ret = RRCrtcSet(crtc, mode, iter->dimensions.tl.x, iter->dimensions.tl.y,
-                    crtc->rotation, crtc->numOutputs, crtc->outputs);
+    ret = vncRandRReconfigureOutput(screenIndex, i,
+                                    iter->dimensions.tl.x,
+                                    iter->dimensions.tl.y,
+                                    iter->dimensions.width(),
+                                    iter->dimensions.height());
     if (!ret) {
       vlog.error("Failed to reconfigure output '%s' to %dx%d+%d+%d",
-                 output->name,
+                 vncRandRGetOutputName(screenIndex, i),
                  iter->dimensions.width(), iter->dimensions.height(),
                  iter->dimensions.tl.x, iter->dimensions.tl.y);
       return rfb::resultInvalid;
@@ -915,11 +743,7 @@
   ScreenSet::const_iterator iter;
   for (iter = layout.begin();iter != layout.end();++iter) {
     OutputIdMap::const_iterator oi;
-
-    RROutputPtr output;
-    RRCrtcPtr crtc;
-    RRModePtr mode;
-
+    intptr_t output;
     int i;
 
     /* Does this screen have an output already? */
@@ -932,53 +756,24 @@
       continue;
 
     /* Find an unused output */
-    for (i = 0;i < rp->numOutputs;i++) {
-      output = rp->outputs[i];
-      crtc = output->crtc;
+    for (i = 0;i < vncRandRGetOutputCount(screenIndex);i++) {
+      output = vncRandRGetOutputId(screenIndex, i);
 
       /* In use? */
       if (outputIdMap.count(output) == 1)
         continue;
 
-      /* Need a CRTC? */
-      if (crtc == NULL) {
-        for (int j = 0;j < output->numCrtcs;j++) {
-          if (output->crtcs[j]->numOutputs != 0)
-            continue;
-
-          crtc = output->crtcs[j];
-          break;
-        }
-
-        /* Couldn't find one... */
-        if (crtc == NULL)
-          continue;
-
-        ret = RRCrtcSet(crtc, NULL, 0, 0, RR_Rotate_0,
-                        1, &output);
-        if (!ret) {
-          vlog.error("Failed to associate a CRTC with output '%s'",
-                     output->name);
-          return rfb::resultInvalid;
-        }
-      }
+      /* Can it be used? */
+      if (!vncRandRIsOutputUsable(screenIndex, i))
+        continue;
 
       break;
     }
 
     /* Shouldn't happen */
-    if (i == rp->numOutputs)
+    if (i == vncRandRGetOutputCount(screenIndex))
         return rfb::resultInvalid;
 
-    mode = findRandRMode(output, iter->dimensions.width(),
-                         iter->dimensions.height());
-    if (mode == NULL) {
-      vlog.error("Failed to find a suitable mode for %dx%d for output '%s'",
-                 iter->dimensions.width(), iter->dimensions.height(),
-                 output->name);
-      return rfb::resultInvalid;
-    }
-
     /*
      * Make sure we already have an entry for this, or
      * computeScreenLayout() will think it is a brand new output and
@@ -987,11 +782,14 @@
     outputIdMap[output] = iter->id;
 
     /* Reconfigure new mode and position */
-    ret = RRCrtcSet(crtc, mode,  iter->dimensions.tl.x, iter->dimensions.tl.y,
-                    crtc->rotation, crtc->numOutputs, crtc->outputs);
+    ret = vncRandRReconfigureOutput(screenIndex, i,
+                                    iter->dimensions.tl.x,
+                                    iter->dimensions.tl.y,
+                                    iter->dimensions.width(),
+                                    iter->dimensions.height());
     if (!ret) {
       vlog.error("Failed to reconfigure output '%s' to %dx%d+%d+%d",
-                 output->name,
+                 vncRandRGetOutputName(screenIndex, i),
                  iter->dimensions.width(), iter->dimensions.height(),
                  iter->dimensions.tl.x, iter->dimensions.tl.y);
       return rfb::resultInvalid;
@@ -1003,50 +801,31 @@
    * This is normally done in the X11 request handlers, which is
    * why we have to deal with it manually here.
    */
-  rp->lastSetTime = currentTime;
+  vncRandRUpdateSetTime(screenIndex);
 
   return rfb::resultSuccess;
-#endif
 }
 
 void XserverDesktop::grabRegion(const rfb::Region& region)
 {
-  if (directFbptr) return;
-  if (!pScreen->GetImage) {
-    vlog.error("VNC error: pScreen->GetImage == 0");
+  if (directFbptr)
     return;
-  }
-
-  grabbing = true;
-
-  int bytesPerPixel = format.bpp/8;
-  int bytesPerRow = pScreen->width * bytesPerPixel;
 
   std::vector<rfb::Rect> rects;
   std::vector<rfb::Rect>::iterator i;
   region.get_rects(&rects);
   for (i = rects.begin(); i != rects.end(); i++) {
-    for (int y = i->tl.y; y < i->br.y; y++) {
-      DrawablePtr pDrawable;
-#if XORG < 19
-      pDrawable = (DrawablePtr) WindowTable[pScreen->myNum];
-#else
-      pDrawable = (DrawablePtr) pScreen->root;
-#endif
+    rdr::U8 *buffer;
+    int stride;
 
-      (*pScreen->GetImage) (pDrawable, i->tl.x, y, i->width(), 1,
-                            ZPixmap, (unsigned long)~0L,
-                            ((char*)data
-                             + y * bytesPerRow + i->tl.x * bytesPerPixel));
-    }
+    buffer = getBufferRW(*i, &stride);
+    vncGetScreenImage(screenIndex, i->tl.x, i->tl.y, i->width(), i->height(),
+                      (char*)buffer, stride * format.bpp/8);
+    commitBufferRW(*i);
   }
-  grabbing = false;
 }
 
 void XserverDesktop::keyEvent(rdr::U32 keysym, bool down)
 {
-	if (down)
-		vncInputDevice->KeyboardPress(keysym);
-	else
-		vncInputDevice->KeyboardRelease(keysym);
+  vncKeyboardEvent(keysym, down);
 }
diff --git a/unix/xserver/hw/vnc/XserverDesktop.h b/unix/xserver/hw/vnc/XserverDesktop.h
index 5b4c230..7dcaa29 100644
--- a/unix/xserver/hw/vnc/XserverDesktop.h
+++ b/unix/xserver/hw/vnc/XserverDesktop.h
@@ -1,5 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
- * Copyright 2009-2011 Pierre Ossman for Cendio AB
+ * Copyright 2009-2015 Pierre Ossman for Cendio AB
  * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,6 +29,8 @@
 
 #include <map>
 
+#include <stdint.h>
+
 #include <rfb/SDesktop.h>
 #include <rfb/HTTPServer.h>
 #include <rfb/PixelBuffer.h>
@@ -37,16 +39,6 @@
 #include <rdr/SubstitutingInStream.h>
 #include "Input.h"
 
-extern "C" {
-#define class c_class
-#include <scrnintstr.h>
-#include <os.h>
-#ifdef RANDR
-#include <randrstr.h>
-#endif
-#undef class
-}
-
 namespace rfb {
   class VNCServerST;
 }
@@ -58,10 +50,10 @@
                        public rfb::VNCServerST::QueryConnectionHandler {
 public:
 
-  XserverDesktop(ScreenPtr pScreen, network::TcpListener* listener,
+  XserverDesktop(int screenIndex, network::TcpListener* listener,
                  network::TcpListener* httpListener_,
                  const char* name, const rfb::PixelFormat &pf,
-                 void* fbptr, int stride);
+                 int width, int height, void* fbptr, int stride);
   virtual ~XserverDesktop();
 
   // methods called from X server code
@@ -72,31 +64,27 @@
   void bell();
   void serverCutText(const char* str, int len);
   void setDesktopName(const char* name);
-  void setCursor(CursorPtr cursor);
-  void add_changed(RegionPtr reg);
-  void add_copied(RegionPtr dst, int dx, int dy);
-  void ignoreHooks(bool b) { ignoreHooks_ = b; }
-  void blockHandler(fd_set* fds, OSTimePtr timeout);
-  void wakeupHandler(fd_set* fds, int nfds);
-  void writeBlockHandler(fd_set* fds);
+  void setCursor(int width, int height, int hotX, int hotY,
+                 const unsigned char *rgbaData);
+  void add_changed(const rfb::Region &region);
+  void add_copied(const rfb::Region &dest, const rfb::Point &delta);
+  void readBlockHandler(fd_set* fds, struct timeval ** timeout);
+  void readWakeupHandler(fd_set* fds, int nfds);
+  void writeBlockHandler(fd_set* fds, struct timeval ** timeout);
   void writeWakeupHandler(fd_set* fds, int nfds);
   void addClient(network::Socket* sock, bool reverse);
   void disconnectClients();
 
   // QueryConnect methods called from X server code
-  // getQueryTimeout()
-  //   Returns the timeout associated with a particular
-  //   connection, identified by an opaque Id passed to the
-  //   X code earlier.  Also optionally gets the address and
-  //   name associated with that connection.
-  //   Returns zero if the Id is not recognised.
-  int getQueryTimeout(void* opaqueId,
-                      const char** address=0,
-                      const char** username=0);
+  // getQueryConnect()
+  //   Returns information about the currently waiting query
+  //   (or an id of 0 if there is none waiting)
+  void getQueryConnect(uint32_t* opaqueId, const char** address,
+                       const char** username, int *timeout);
 
   // approveConnection()
   //   Used by X server code to supply the result of a query.
-  void approveConnection(void* opaqueId, bool accept,
+  void approveConnection(uint32_t opaqueId, bool accept,
                          const char* rejectMsg=0);
 
   // rfb::SDesktop callbacks
@@ -120,26 +108,23 @@
 
 private:
   rfb::ScreenSet computeScreenLayout();
-#ifdef RANDR
-  RRModePtr findRandRMode(RROutputPtr output, int width, int height);
-#endif
 
-  ScreenPtr pScreen;
+  int screenIndex;
   rfb::VNCServerST* server;
   rfb::HTTPServer* httpServer;
   network::TcpListener* listener;
   network::TcpListener* httpListener;
   bool deferredUpdateTimerSet;
-  bool grabbing;
-  bool ignoreHooks_;
   bool directFbptr;
+  struct timeval dixTimeout;
 
-  void* queryConnectId;
+  uint32_t queryConnectId;
+  network::Socket* queryConnectSocket;
   rfb::CharArray queryConnectAddress;
   rfb::CharArray queryConnectUsername;
 
 #ifdef RANDR
-  typedef std::map<RROutputPtr, rdr::U32> OutputIdMap;
+  typedef std::map<intptr_t, rdr::U32> OutputIdMap;
   OutputIdMap outputIdMap;
 #endif
 
diff --git a/unix/xserver/hw/vnc/vncBlockHandler.c b/unix/xserver/hw/vnc/vncBlockHandler.c
new file mode 100644
index 0000000..c9a7428
--- /dev/null
+++ b/unix/xserver/hw/vnc/vncBlockHandler.c
@@ -0,0 +1,143 @@
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2011-2014 Pierre Ossman for Cendio AB
+ * 
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <errno.h>
+
+#include <X11/Xpoll.h>
+
+#include "dix.h"
+#include "scrnintstr.h"
+
+#include "vncExtInit.h"
+#include "vncBlockHandler.h"
+
+static void vncBlockHandler(void * data, OSTimePtr t, void * readmask);
+static void vncWakeupHandler(void * data, int nfds, void * readmask);
+void vncWriteBlockHandler(fd_set *fds);
+void vncWriteWakeupHandler(int nfds, fd_set *fds);
+
+void vncRegisterBlockHandlers(void)
+{
+  if (!RegisterBlockAndWakeupHandlers(vncBlockHandler, vncWakeupHandler, 0))
+    FatalError("RegisterBlockAndWakeupHandlers() failed\n");
+}
+
+static void vncWriteBlockHandlerFallback(OSTimePtr timeout);
+static void vncWriteWakeupHandlerFallback(void);
+
+//
+// vncBlockHandler - called just before the X server goes into select().  Call
+// on to the block handler for each desktop.  Then check whether any of the
+// selections have changed, and if so, notify any interested X clients.
+//
+
+static void vncBlockHandler(void * data, OSTimePtr timeout, void * readmask)
+{
+  fd_set* fds = (fd_set*)readmask;
+
+  vncWriteBlockHandlerFallback(timeout);
+
+  vncCallReadBlockHandlers(fds, timeout);
+}
+
+static void vncWakeupHandler(void * data, int nfds, void * readmask)
+{
+  fd_set* fds = (fd_set*)readmask;
+
+  vncCallReadWakeupHandlers(fds, nfds);
+
+  vncWriteWakeupHandlerFallback();
+}
+
+//
+// vncWriteBlockHandler - extra hack to be able to get the main select loop
+// to monitor writeable fds and not just readable. This requirers a modified
+// Xorg and might therefore not be called. When it is called though, it will
+// do so before vncBlockHandler (and vncWriteWakeupHandler called after
+// vncWakeupHandler).
+//
+
+static Bool needFallback = TRUE;
+static fd_set fallbackFds;
+static struct timeval tw;
+
+void vncWriteBlockHandler(fd_set *fds)
+{
+  struct timeval *dummy;
+
+  needFallback = FALSE;
+
+  dummy = NULL;
+  vncCallWriteBlockHandlers(fds, &dummy);
+}
+
+void vncWriteWakeupHandler(int nfds, fd_set *fds)
+{
+  vncCallWriteWakeupHandlers(fds, nfds);
+}
+
+static void vncWriteBlockHandlerFallback(OSTimePtr timeout)
+{
+  if (!needFallback)
+    return;
+
+  FD_ZERO(&fallbackFds);
+  vncWriteBlockHandler(&fallbackFds);
+
+  if (!XFD_ANYSET(&fallbackFds))
+    return;
+
+  if ((*timeout == NULL) ||
+      ((*timeout)->tv_sec > 0) || ((*timeout)->tv_usec > 10000)) {
+    tw.tv_sec = 0;
+    tw.tv_usec = 10000;
+    *timeout = &tw;
+  }
+}
+
+static void vncWriteWakeupHandlerFallback(void)
+{
+  int ret;
+  struct timeval timeout;
+
+  if (!needFallback)
+    return;
+
+  if (!XFD_ANYSET(&fallbackFds))
+    return;
+
+  timeout.tv_sec = 0;
+  timeout.tv_usec = 0;
+
+  ret = select(XFD_SETSIZE, NULL, &fallbackFds, NULL, &timeout);
+  if (ret < 0) {
+    ErrorF("vncWriteWakeupHandlerFallback(): select: %s\n",
+           strerror(errno));
+    return;
+  }
+
+  if (ret == 0)
+    return;
+
+  vncWriteWakeupHandler(ret, &fallbackFds);
+}
diff --git a/unix/xserver/hw/vnc/vncBlockHandler.h b/unix/xserver/hw/vnc/vncBlockHandler.h
new file mode 100644
index 0000000..556528b
--- /dev/null
+++ b/unix/xserver/hw/vnc/vncBlockHandler.h
@@ -0,0 +1,33 @@
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2011-2014 Pierre Ossman for Cendio AB
+ * 
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+
+#ifndef VNCBLOCKHANDLER_H
+#define VNCBLOCKHANDLER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void vncRegisterBlockHandlers(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/unix/xserver/hw/vnc/vncExt.c b/unix/xserver/hw/vnc/vncExt.c
new file mode 100644
index 0000000..2330eee
--- /dev/null
+++ b/unix/xserver/hw/vnc/vncExt.c
@@ -0,0 +1,771 @@
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2011-2015 Pierre Ossman for Cendio AB
+ * 
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#define NEED_EVENTS
+#include "misc.h"
+#include "os.h"
+#include "dixstruct.h"
+#include "extnsionst.h"
+#include "scrnintstr.h"
+#include "selection.h"
+
+#define _VNCEXT_SERVER_
+#define _VNCEXT_PROTO_
+#include "vncExt.h"
+
+#include "xorg-version.h"
+
+#include "vncExtInit.h"
+#include "RFBGlue.h"
+
+static int ProcVncExtDispatch(ClientPtr client);
+static int SProcVncExtDispatch(ClientPtr client);
+static void vncResetProc(ExtensionEntry* extEntry);
+
+static void vncClientStateChange(CallbackListPtr*, void *, void *);
+
+static void vncSelectionCallback(CallbackListPtr *callbacks,
+                                 void * data, void * args);
+
+static int vncErrorBase = 0;
+static int vncEventBase = 0;
+
+int vncNoClipboard = 0;
+
+static char* clientCutText = NULL;
+static int clientCutTextLen = 0;
+
+static struct VncInputSelect* vncInputSelectHead = NULL;
+
+struct VncInputSelect {
+  ClientPtr client;
+  Window window;
+  int mask;
+  struct VncInputSelect* next;
+};
+
+int vncAddExtension(void)
+{
+  ExtensionEntry* extEntry;
+
+  extEntry = AddExtension(VNCEXTNAME, VncExtNumberEvents, VncExtNumberErrors,
+                          ProcVncExtDispatch, SProcVncExtDispatch, vncResetProc,
+                          StandardMinorOpcode);
+  if (!extEntry) {
+    ErrorF("vncAddExtension: AddExtension failed\n");
+    return -1;
+  }
+
+  vncErrorBase = extEntry->errorBase;
+  vncEventBase = extEntry->eventBase;
+
+  if (!AddCallback(&ClientStateCallback, vncClientStateChange, 0)) {
+    FatalError("Add ClientStateCallback failed\n");
+  }
+
+  if (!AddCallback(&SelectionCallback, vncSelectionCallback, 0)) {
+    FatalError("Add SelectionCallback failed\n");
+  }
+
+  return 0;
+}
+
+int vncNotifyQueryConnect(void)
+{
+  int count;
+  xVncExtQueryConnectNotifyEvent ev;
+
+  ev.type = vncEventBase + VncExtQueryConnectNotify;
+
+  count = 0;
+  for (struct VncInputSelect* cur = vncInputSelectHead; cur; cur = cur->next) {
+    if (cur->mask & VncExtQueryConnectMask) {
+      ev.sequenceNumber = cur->client->sequence;
+      ev.window = cur->window;
+      if (cur->client->swapped) {
+#if XORG < 112
+        int n;
+        swaps(&ev.sequenceNumber, n);
+        swapl(&ev.window, n);
+#else
+        swaps(&ev.sequenceNumber);
+        swapl(&ev.window);
+#endif
+      }
+      WriteToClient(cur->client, sizeof(xVncExtQueryConnectNotifyEvent),
+                    (char *)&ev);
+      count++;
+    }
+  }
+
+  return count;
+}
+
+void vncClientCutText(const char* str, int len)
+{
+  if (clientCutText != NULL)
+    free(clientCutText);
+  clientCutTextLen = 0;
+
+  clientCutText = malloc(len);
+  if (clientCutText == NULL) {
+    ErrorF("Could not allocate clipboard buffer\n");
+    return;
+  }
+
+  memcpy(clientCutText, str, len);
+  clientCutTextLen = len;
+
+  xVncExtClientCutTextNotifyEvent ev;
+  ev.type = vncEventBase + VncExtClientCutTextNotify;
+  for (struct VncInputSelect* cur = vncInputSelectHead; cur; cur = cur->next) {
+    if (cur->mask & VncExtClientCutTextMask) {
+      ev.sequenceNumber = cur->client->sequence;
+      ev.window = cur->window;
+      ev.time = GetTimeInMillis();
+      if (cur->client->swapped) {
+#if XORG < 112
+        int n;
+        swaps(&ev.sequenceNumber, n);
+        swapl(&ev.window, n);
+        swapl(&ev.time, n);
+#else
+        swaps(&ev.sequenceNumber);
+        swapl(&ev.window);
+        swapl(&ev.time);
+#endif
+      }
+      WriteToClient(cur->client, sizeof(xVncExtClientCutTextNotifyEvent),
+                    (char *)&ev);
+    }
+  }
+}
+
+static int ProcVncExtSetParam(ClientPtr client)
+{
+  char *param;
+
+  REQUEST(xVncExtSetParamReq);
+  REQUEST_FIXED_SIZE(xVncExtSetParamReq, stuff->paramLen);
+
+  param = malloc(stuff->paramLen+1);
+  if (param == NULL)
+    return BadAlloc;
+  strncpy(param, (char*)&stuff[1], stuff->paramLen);
+  param[stuff->paramLen] = '\0';
+
+  xVncExtSetParamReply rep;
+  rep.type = X_Reply;
+  rep.length = 0;
+  rep.success = 0;
+  rep.sequenceNumber = client->sequence;
+
+  /*
+   * Allow to change only certain parameters.
+   * Changing other parameters (for example PAM service name)
+   * could have negative security impact.
+   */
+  if (strncasecmp(param, "desktop", 7) != 0 &&
+      strncasecmp(param, "AcceptPointerEvents", 19) != 0 &&
+      (vncNoClipboard || strncasecmp(param, "SendCutText", 11) != 0) &&
+      (vncNoClipboard || strncasecmp(param, "AcceptCutText", 13) != 0))
+    goto deny;
+
+  vncSetParamSimple(param);
+  rep.success = 1;
+
+  // Send DesktopName update if desktop name has been changed
+  if (strncasecmp(param, "desktop", 7) != 0)
+    vncUpdateDesktopName();
+
+deny:
+  free(param);
+
+  if (client->swapped) {
+#if XORG < 112
+    int n;
+    swaps(&rep.sequenceNumber, n);
+    swapl(&rep.length, n);
+#else
+    swaps(&rep.sequenceNumber);
+    swapl(&rep.length);
+#endif
+  }
+  WriteToClient(client, sizeof(xVncExtSetParamReply), (char *)&rep);
+  return (client->noClientException);
+}
+
+static int SProcVncExtSetParam(ClientPtr client)
+{
+  REQUEST(xVncExtSetParamReq);
+#if XORG < 112
+  register char n;
+  swaps(&stuff->length, n);
+#else
+  swaps(&stuff->length);
+#endif
+  REQUEST_AT_LEAST_SIZE(xVncExtSetParamReq);
+  return ProcVncExtSetParam(client);
+}
+
+static int ProcVncExtGetParam(ClientPtr client)
+{
+  char* param;
+  char* value;
+  size_t len;
+
+  REQUEST(xVncExtGetParamReq);
+  REQUEST_FIXED_SIZE(xVncExtGetParamReq, stuff->paramLen);
+
+  param = malloc(stuff->paramLen+1);
+  if (param == NULL)
+    return BadAlloc;
+  strncpy(param, (char*)&stuff[1], stuff->paramLen);
+  param[stuff->paramLen] = 0;
+
+  value = vncGetParam(param);
+  len = value ? strlen(value) : 0;
+
+  free(param);
+
+  xVncExtGetParamReply rep;
+  rep.type = X_Reply;
+  rep.sequenceNumber = client->sequence;
+  rep.success = 0;
+  if (value)
+    rep.success = 1;
+  rep.length = (len + 3) >> 2;
+  rep.valueLen = len;
+  if (client->swapped) {
+#if XORG < 112
+    int n;
+    swaps(&rep.sequenceNumber, n);
+    swapl(&rep.length, n);
+    swaps(&rep.valueLen, n);
+#else
+    swaps(&rep.sequenceNumber);
+    swapl(&rep.length);
+    swaps(&rep.valueLen);
+#endif
+  }
+  WriteToClient(client, sizeof(xVncExtGetParamReply), (char *)&rep);
+  if (value)
+    WriteToClient(client, len, value);
+  free(value);
+  return (client->noClientException);
+}
+
+static int SProcVncExtGetParam(ClientPtr client)
+{
+  REQUEST(xVncExtGetParamReq);
+#if XORG < 112
+  register char n;
+  swaps(&stuff->length, n);
+#else
+  swaps(&stuff->length);
+#endif
+  REQUEST_AT_LEAST_SIZE(xVncExtGetParamReq);
+  return ProcVncExtGetParam(client);
+}
+
+static int ProcVncExtGetParamDesc(ClientPtr client)
+{
+  char* param;
+  const char* desc;
+  size_t len;
+
+  REQUEST(xVncExtGetParamDescReq);
+  REQUEST_FIXED_SIZE(xVncExtGetParamDescReq, stuff->paramLen);
+
+  param = malloc(stuff->paramLen+1);
+  if (param == NULL)
+    return BadAlloc;
+  strncpy(param, (char*)&stuff[1], stuff->paramLen);
+  param[stuff->paramLen] = 0;
+
+  desc = vncGetParamDesc(param);
+  len = desc ? strlen(desc) : 0;
+
+  free(param);
+
+  xVncExtGetParamDescReply rep;
+  rep.type = X_Reply;
+  rep.sequenceNumber = client->sequence;
+  rep.success = 0;
+  if (desc)
+    rep.success = 1;
+  rep.length = (len + 3) >> 2;
+  rep.descLen = len;
+  if (client->swapped) {
+#if XORG < 112
+    int n;
+    swaps(&rep.sequenceNumber, n);
+    swapl(&rep.length, n);
+    swaps(&rep.descLen, n);
+#else
+    swaps(&rep.sequenceNumber);
+    swapl(&rep.length);
+    swaps(&rep.descLen);
+#endif
+  }
+  WriteToClient(client, sizeof(xVncExtGetParamDescReply), (char *)&rep);
+  if (desc)
+    WriteToClient(client, len, (char*)desc);
+  return (client->noClientException);
+}
+
+static int SProcVncExtGetParamDesc(ClientPtr client)
+{
+  REQUEST(xVncExtGetParamDescReq);
+#if XORG < 112
+  register char n;
+  swaps(&stuff->length, n);
+#else
+  swaps(&stuff->length);
+#endif
+  REQUEST_AT_LEAST_SIZE(xVncExtGetParamDescReq);
+  return ProcVncExtGetParamDesc(client);
+}
+
+static int ProcVncExtListParams(ClientPtr client)
+{
+  REQUEST(xVncExtListParamsReq);
+  REQUEST_SIZE_MATCH(xVncExtListParamsReq);
+
+  xVncExtListParamsReply rep;
+  rep.type = X_Reply;
+  rep.sequenceNumber = client->sequence;
+
+  char *params;
+  size_t len;
+
+  params = vncGetParamList();
+  if (params == NULL)
+    return BadAlloc;
+
+  len = strlen(params);
+
+  rep.length = (len + 3) >> 2;
+  rep.nParams = vncGetParamCount();
+  if (client->swapped) {
+#if XORG < 112
+    int n;
+    swaps(&rep.sequenceNumber, n);
+    swapl(&rep.length, n);
+    swaps(&rep.nParams, n);
+#else
+    swaps(&rep.sequenceNumber);
+    swapl(&rep.length);
+    swaps(&rep.nParams);
+#endif
+  }
+  WriteToClient(client, sizeof(xVncExtListParamsReply), (char *)&rep);
+  WriteToClient(client, len, (char*)params);
+  free(params);
+  return (client->noClientException);
+}
+
+static int SProcVncExtListParams(ClientPtr client)
+{
+  REQUEST(xVncExtListParamsReq);
+#if XORG < 112
+  register char n;
+  swaps(&stuff->length, n);
+#else
+  swaps(&stuff->length);
+#endif
+  REQUEST_SIZE_MATCH(xVncExtListParamsReq);
+  return ProcVncExtListParams(client);
+}
+
+static int ProcVncExtSetServerCutText(ClientPtr client)
+{
+  REQUEST(xVncExtSetServerCutTextReq);
+  REQUEST_FIXED_SIZE(xVncExtSetServerCutTextReq, stuff->textLen);
+  vncServerCutText((const char*)&stuff[1], stuff->textLen);
+  return (client->noClientException);
+}
+
+static int SProcVncExtSetServerCutText(ClientPtr client)
+{
+  REQUEST(xVncExtSetServerCutTextReq);
+#if XORG < 112
+  register char n;
+  swaps(&stuff->length, n);
+#else
+  swaps(&stuff->length);
+#endif
+  REQUEST_AT_LEAST_SIZE(xVncExtSetServerCutTextReq);
+#if XORG < 112
+  swapl(&stuff->textLen, n);
+#else
+  swapl(&stuff->textLen);
+#endif
+  return ProcVncExtSetServerCutText(client);
+}
+
+static int ProcVncExtGetClientCutText(ClientPtr client)
+{
+  REQUEST(xVncExtGetClientCutTextReq);
+  REQUEST_SIZE_MATCH(xVncExtGetClientCutTextReq);
+
+  xVncExtGetClientCutTextReply rep;
+  rep.type = X_Reply;
+  rep.length = (clientCutTextLen + 3) >> 2;
+  rep.sequenceNumber = client->sequence;
+  rep.textLen = clientCutTextLen;
+  if (client->swapped) {
+#if XORG < 112
+    int n;
+    swaps(&rep.sequenceNumber, n);
+    swapl(&rep.length, n);
+    swapl(&rep.textLen, n);
+#else
+    swaps(&rep.sequenceNumber);
+    swapl(&rep.length);
+    swapl(&rep.textLen);
+#endif
+  }
+  WriteToClient(client, sizeof(xVncExtGetClientCutTextReply), (char *)&rep);
+  if (clientCutText)
+    WriteToClient(client, clientCutTextLen, clientCutText);
+  return (client->noClientException);
+}
+
+static int SProcVncExtGetClientCutText(ClientPtr client)
+{
+  REQUEST(xVncExtGetClientCutTextReq);
+#if XORG < 112
+  register char n;
+  swaps(&stuff->length, n);
+#else
+  swaps(&stuff->length);
+#endif
+  REQUEST_SIZE_MATCH(xVncExtGetClientCutTextReq);
+  return ProcVncExtGetClientCutText(client);
+}
+
+static int ProcVncExtSelectInput(ClientPtr client)
+{
+  struct VncInputSelect** nextPtr;
+  struct VncInputSelect* cur;
+  REQUEST(xVncExtSelectInputReq);
+  REQUEST_SIZE_MATCH(xVncExtSelectInputReq);
+  nextPtr = &vncInputSelectHead;
+  for (cur = vncInputSelectHead; cur; cur = *nextPtr) {
+    if (cur->client == client && cur->window == stuff->window) {
+      cur->mask = stuff->mask;
+      if (!cur->mask) {
+        *nextPtr = cur->next;
+        free(cur);
+      }
+      break;
+    }
+    nextPtr = &cur->next;
+  }
+  if (!cur) {
+    cur = malloc(sizeof(struct VncInputSelect));
+    if (cur == NULL)
+      return BadAlloc;
+    memset(cur, 0, sizeof(struct VncInputSelect));
+
+    cur->client = client;
+    cur->window = stuff->window;
+    cur->mask = stuff->mask;
+
+    cur->next = vncInputSelectHead;
+    vncInputSelectHead = cur;
+  }
+  return (client->noClientException);
+}
+
+static int SProcVncExtSelectInput(ClientPtr client)
+{
+  REQUEST(xVncExtSelectInputReq);
+#if XORG < 112
+  register char n;
+  swaps(&stuff->length, n);
+#else
+  swaps(&stuff->length);
+#endif
+  REQUEST_SIZE_MATCH(xVncExtSelectInputReq);
+#if XORG < 112
+  swapl(&stuff->window, n);
+  swapl(&stuff->mask, n);
+#else
+  swapl(&stuff->window);
+  swapl(&stuff->mask);
+#endif
+  return ProcVncExtSelectInput(client);
+}
+
+static int ProcVncExtConnect(ClientPtr client)
+{
+  char *address;
+
+  REQUEST(xVncExtConnectReq);
+  REQUEST_FIXED_SIZE(xVncExtConnectReq, stuff->strLen);
+
+  address = malloc(stuff->strLen+1);
+  if (address == NULL)
+    return BadAlloc;
+  strncpy(address, (char*)&stuff[1], stuff->strLen);
+  address[stuff->strLen] = 0;
+
+  xVncExtConnectReply rep;
+  rep.success = 0;
+  if (vncConnectClient(address) == 0)
+        rep.success = 1;
+
+  rep.type = X_Reply;
+  rep.length = 0;
+  rep.sequenceNumber = client->sequence;
+  if (client->swapped) {
+#if XORG < 112
+    int n;
+    swaps(&rep.sequenceNumber, n);
+    swapl(&rep.length, n);
+#else
+    swaps(&rep.sequenceNumber);
+    swapl(&rep.length);
+#endif
+  }
+  WriteToClient(client, sizeof(xVncExtConnectReply), (char *)&rep);
+
+  free(address);
+
+  return (client->noClientException);
+}
+
+static int SProcVncExtConnect(ClientPtr client)
+{
+  REQUEST(xVncExtConnectReq);
+#if XORG < 112
+  register char n;
+  swaps(&stuff->length, n);
+#else
+  swaps(&stuff->length);
+#endif
+  REQUEST_AT_LEAST_SIZE(xVncExtConnectReq);
+  return ProcVncExtConnect(client);
+}
+
+
+static int ProcVncExtGetQueryConnect(ClientPtr client)
+{
+  REQUEST(xVncExtGetQueryConnectReq);
+  REQUEST_SIZE_MATCH(xVncExtGetQueryConnectReq);
+
+  uint32_t opaqueId;
+  const char *qcAddress, *qcUsername;
+  int qcTimeout;
+
+  vncGetQueryConnect(&opaqueId, &qcAddress, &qcUsername, &qcTimeout);
+
+  xVncExtGetQueryConnectReply rep;
+  rep.type = X_Reply;
+  rep.sequenceNumber = client->sequence;
+  rep.timeout = qcTimeout;
+  rep.addrLen = qcTimeout ? strlen(qcAddress) : 0;
+  rep.userLen = qcTimeout ? strlen(qcUsername) : 0;
+  rep.opaqueId = (CARD32)(long)opaqueId;
+  rep.length = ((rep.userLen + 3) >> 2) + ((rep.addrLen + 3) >> 2);
+  if (client->swapped) {
+#if XORG < 112
+    int n;
+    swaps(&rep.sequenceNumber, n);
+    swapl(&rep.addrLen, n);
+    swapl(&rep.userLen, n);
+    swapl(&rep.timeout, n);
+    swapl(&rep.opaqueId, n);
+    swapl(&rep.length, n);
+#else
+    swaps(&rep.sequenceNumber);
+    swapl(&rep.addrLen);
+    swapl(&rep.userLen);
+    swapl(&rep.timeout);
+    swapl(&rep.opaqueId);
+    swapl(&rep.length);
+#endif
+  }
+  WriteToClient(client, sizeof(xVncExtGetQueryConnectReply), (char *)&rep);
+  if (qcTimeout)
+    WriteToClient(client, strlen(qcAddress), (char*)qcAddress);
+  if (qcTimeout)
+    WriteToClient(client, strlen(qcUsername), (char*)qcUsername);
+  return (client->noClientException);
+}
+
+static int SProcVncExtGetQueryConnect(ClientPtr client)
+{
+  REQUEST(xVncExtGetQueryConnectReq);
+#if XORG < 112
+  register char n;
+  swaps(&stuff->length, n);
+#else
+  swaps(&stuff->length);
+#endif
+  REQUEST_SIZE_MATCH(xVncExtGetQueryConnectReq);
+  return ProcVncExtGetQueryConnect(client);
+}
+
+
+static int ProcVncExtApproveConnect(ClientPtr client)
+{
+  REQUEST(xVncExtApproveConnectReq);
+  REQUEST_SIZE_MATCH(xVncExtApproveConnectReq);
+  vncApproveConnection(stuff->opaqueId, stuff->approve);
+  // Inform other clients of the event and tidy up
+  vncNotifyQueryConnect();
+  return (client->noClientException);
+}
+
+static int SProcVncExtApproveConnect(ClientPtr client)
+{
+  REQUEST(xVncExtApproveConnectReq);
+#if XORG < 112
+  register char n;
+  swaps(&stuff->length, n);
+  swapl(&stuff->opaqueId, n);
+#else
+  swaps(&stuff->length);
+  swapl(&stuff->opaqueId);
+#endif
+  REQUEST_SIZE_MATCH(xVncExtApproveConnectReq);
+  return ProcVncExtApproveConnect(client);
+}
+
+
+static int ProcVncExtDispatch(ClientPtr client)
+{
+  REQUEST(xReq);
+  switch (stuff->data) {
+  case X_VncExtSetParam:
+    return ProcVncExtSetParam(client);
+  case X_VncExtGetParam:
+    return ProcVncExtGetParam(client);
+  case X_VncExtGetParamDesc:
+    return ProcVncExtGetParamDesc(client);
+  case X_VncExtListParams:
+    return ProcVncExtListParams(client);
+  case X_VncExtSetServerCutText:
+    return ProcVncExtSetServerCutText(client);
+  case X_VncExtGetClientCutText:
+    return ProcVncExtGetClientCutText(client);
+  case X_VncExtSelectInput:
+    return ProcVncExtSelectInput(client);
+  case X_VncExtConnect:
+    return ProcVncExtConnect(client);
+  case X_VncExtGetQueryConnect:
+    return ProcVncExtGetQueryConnect(client);
+  case X_VncExtApproveConnect:
+    return ProcVncExtApproveConnect(client);
+  default:
+    return BadRequest;
+  }
+}
+
+static int SProcVncExtDispatch(ClientPtr client)
+{
+  REQUEST(xReq);
+  switch (stuff->data) {
+  case X_VncExtSetParam:
+    return SProcVncExtSetParam(client);
+  case X_VncExtGetParam:
+    return SProcVncExtGetParam(client);
+  case X_VncExtGetParamDesc:
+    return SProcVncExtGetParamDesc(client);
+  case X_VncExtListParams:
+    return SProcVncExtListParams(client);
+  case X_VncExtSetServerCutText:
+    return SProcVncExtSetServerCutText(client);
+  case X_VncExtGetClientCutText:
+    return SProcVncExtGetClientCutText(client);
+  case X_VncExtSelectInput:
+    return SProcVncExtSelectInput(client);
+  case X_VncExtConnect:
+    return SProcVncExtConnect(client);
+  case X_VncExtGetQueryConnect:
+    return SProcVncExtGetQueryConnect(client);
+  case X_VncExtApproveConnect:
+    return SProcVncExtApproveConnect(client);
+  default:
+    return BadRequest;
+  }
+}
+
+static void vncResetProc(ExtensionEntry* extEntry)
+{
+}
+
+static void vncClientStateChange(CallbackListPtr * l, void * d, void * p)
+{
+  ClientPtr client = ((NewClientInfoRec*)p)->client;
+  if (client->clientState == ClientStateGone) {
+    struct VncInputSelect** nextPtr = &vncInputSelectHead;
+    for (struct VncInputSelect* cur = vncInputSelectHead; cur; cur = *nextPtr) {
+      if (cur->client == client) {
+        *nextPtr = cur->next;
+        free(cur);
+        continue;
+      }
+      nextPtr = &cur->next;
+    }
+  }
+}
+
+static void SendSelectionChangeEvent(Atom selection)
+{
+  xVncExtSelectionChangeNotifyEvent ev;
+  ev.type = vncEventBase + VncExtSelectionChangeNotify;
+  for (struct VncInputSelect* cur = vncInputSelectHead; cur; cur = cur->next) {
+    if (cur->mask & VncExtSelectionChangeMask) {
+      ev.sequenceNumber = cur->client->sequence;
+      ev.window = cur->window;
+      ev.selection = selection;
+      if (cur->client->swapped) {
+#if XORG < 112
+        int n;
+        swaps(&ev.sequenceNumber, n);
+        swapl(&ev.window, n);
+        swapl(&ev.selection, n);
+#else
+        swaps(&ev.sequenceNumber);
+        swapl(&ev.window);
+        swapl(&ev.selection);
+#endif
+      }
+      WriteToClient(cur->client, sizeof(xVncExtSelectionChangeNotifyEvent),
+                    (char *)&ev);
+    }
+  }
+}
+
+static void vncSelectionCallback(CallbackListPtr *callbacks, void * data, void * args)
+{
+  SelectionInfoRec *info = (SelectionInfoRec *) args;
+  Selection *selection = info->selection;
+
+  SendSelectionChangeEvent(selection->selection);
+}
+
diff --git a/unix/xserver/hw/vnc/vncExtInit.cc b/unix/xserver/hw/vnc/vncExtInit.cc
index ff81321..2277783 100644
--- a/unix/xserver/hw/vnc/vncExtInit.cc
+++ b/unix/xserver/hw/vnc/vncExtInit.cc
@@ -1,5 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
- * Copyright 2011 Pierre Ossman for Cendio AB
+ * Copyright 2011-2015 Pierre Ossman for Cendio AB
  * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -17,34 +17,9 @@
  * USA.
  */
 
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
 #include <stdio.h>
 #include <errno.h>
 
-extern "C" {
-#define class c_class
-#define public c_public
-#define NEED_EVENTS
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/Xpoll.h>
-#include "misc.h"
-#include "os.h"
-#include "dixstruct.h"
-#include "extnsionst.h"
-#include "scrnintstr.h"
-#include "selection.h"
-#define _VNCEXT_SERVER_
-#define _VNCEXT_PROTO_
-#include "vncExt.h"
-#undef class
-#undef xalloc
-#undef public
-}
-
 #include <rfb/Configuration.h>
 #include <rfb/Logger_stdio.h>
 #include <rfb/LogWriter.h>
@@ -52,67 +27,29 @@
 #include <rfb/ServerCore.h>
 #include <rdr/HexOutStream.h>
 #include <rfb/LogWriter.h>
-#undef max
-#undef min
+#include <rfb/Hostname.h>
+#include <rfb/Region.h>
 #include <network/TcpSocket.h>
 
 #include "XserverDesktop.h"
-#include "vncHooks.h"
 #include "vncExtInit.h"
-#include "xorg-version.h"
-
-extern "C" {
-
-  extern void vncExtensionInit();
-  static void vncResetProc(ExtensionEntry* extEntry);
-  static void vncBlockHandler(void * data, OSTimePtr t, void * readmask);
-  static void vncWakeupHandler(void * data, int nfds, void * readmask);
-  void vncWriteBlockHandler(fd_set *fds);
-  void vncWriteWakeupHandler(int nfds, fd_set *fds);
-  static void vncClientStateChange(CallbackListPtr*, void *, void *);
-  static void SendSelectionChangeEvent(Atom selection);
-  static int ProcVncExtDispatch(ClientPtr client);
-  static int SProcVncExtDispatch(ClientPtr client);
-  static void vncSelectionCallback(CallbackListPtr *callbacks, void * data,
-				   void * args);
-
-  extern char *listenaddr;
-}
+#include "vncHooks.h"
+#include "vncBlockHandler.h"
+#include "XorgGlue.h"
 
 using namespace rfb;
 
 static rfb::LogWriter vlog("vncext");
 
+// We can't safely get this from Xorg
+#define MAXSCREENS 16
+
 static unsigned long vncExtGeneration = 0;
 static bool initialised = false;
 static XserverDesktop* desktop[MAXSCREENS] = { 0, };
 void* vncFbptr[MAXSCREENS] = { 0, };
 int vncFbstride[MAXSCREENS];
 
-static char* clientCutText = 0;
-static int clientCutTextLen = 0;
-bool noclipboard = false;
-
-static XserverDesktop* queryConnectDesktop = 0;
-static void* queryConnectId = 0;
-static int queryConnectTimeout = 0;
-static OsTimerPtr queryConnectTimer = 0;
-
-static struct VncInputSelect* vncInputSelectHead = 0;
-struct VncInputSelect {
-  VncInputSelect(ClientPtr c, Window w, int m) : client(c), window(w), mask(m)
-  {
-    next = vncInputSelectHead;
-    vncInputSelectHead = this;
-  }
-  ClientPtr client;
-  Window window;
-  int mask;
-  VncInputSelect* next;
-};
-
-static int vncErrorBase = 0;
-static int vncEventBase = 0;
 int vncInetdSock = -1;
 
 rfb::StringParameter httpDir("httpd",
@@ -126,101 +63,75 @@
 rfb::BoolParameter localhostOnly("localhost",
                                  "Only allow connections from localhost",
                                  false);
+rfb::StringParameter interface("interface",
+                               "listen on the specified network address",
+                               "all");
+rfb::BoolParameter avoidShiftNumLock("AvoidShiftNumLock",
+                                     "Avoid fake Shift presses for keys affected by NumLock.",
+                                     true);
 
-static PixelFormat vncGetPixelFormat(ScreenPtr pScreen)
+static PixelFormat vncGetPixelFormat(int scrIdx)
 {
   int depth, bpp;
   int trueColour, bigEndian;
+  int redMask, greenMask, blueMask;
+
   int redShift, greenShift, blueShift;
   int redMax, greenMax, blueMax;
 
-  int i;
-  VisualPtr vis = NULL;
-
-  depth = pScreen->rootDepth;
-
-  for (i = 0; i < screenInfo.numPixmapFormats; i++) {
-    if (screenInfo.formats[i].depth == depth) {
-      bpp = screenInfo.formats[i].bitsPerPixel;
-      break;
-    }
-  }
-
-  if (i == screenInfo.numPixmapFormats) {
-    fprintf(stderr,"no pixmap format for root depth???\n");
-    abort();
-  }
-
-  bigEndian = (screenInfo.imageByteOrder == MSBFirst);
-
-  for (i = 0; i < pScreen->numVisuals; i++) {
-    if (pScreen->visuals[i].vid == pScreen->rootVisual) {
-      vis = &pScreen->visuals[i];
-      break;
-    }
-  }
-
-  if (i == pScreen->numVisuals) {
-    fprintf(stderr,"no visual rec for root visual???\n");
-    abort();
-  }
-
-  trueColour = (vis->c_class == TrueColor);
+  vncGetScreenFormat(scrIdx, &depth, &bpp, &trueColour, &bigEndian,
+                     &redMask, &greenMask, &blueMask);
 
   if (!trueColour) {
-    fprintf(stderr,"pseudocolour not supported");
+    vlog.error("pseudocolour not supported");
     abort();
   }
 
-  redShift   = ffs(vis->redMask) - 1;
-  greenShift = ffs(vis->greenMask) - 1;
-  blueShift  = ffs(vis->blueMask) - 1;
-  redMax     = vis->redMask   >> redShift;
-  greenMax   = vis->greenMask >> greenShift;
-  blueMax    = vis->blueMask  >> blueShift;
+  redShift   = ffs(redMask) - 1;
+  greenShift = ffs(greenMask) - 1;
+  blueShift  = ffs(blueMask) - 1;
+  redMax     = redMask   >> redShift;
+  greenMax   = greenMask >> greenShift;
+  blueMax    = blueMask  >> blueShift;
 
   return PixelFormat(bpp, depth, bigEndian, trueColour,
                      redMax, greenMax, blueMax,
                      redShift, greenShift, blueShift);
 }
 
-void vncExtensionInit()
+void vncExtensionInit(void)
 {
-  if (vncExtGeneration == serverGeneration) {
+  int ret;
+
+  if (vncExtGeneration == vncGetServerGeneration()) {
     vlog.error("vncExtensionInit: called twice in same generation?");
     return;
   }
-  vncExtGeneration = serverGeneration;
+  vncExtGeneration = vncGetServerGeneration();
 
-  ExtensionEntry* extEntry
-    = AddExtension(VNCEXTNAME, VncExtNumberEvents, VncExtNumberErrors,
-                   ProcVncExtDispatch, SProcVncExtDispatch, vncResetProc,
-                   StandardMinorOpcode);
-  if (!extEntry) {
-    ErrorF("vncExtInit: AddExtension failed\n");
+  if (vncGetScreenCount() > MAXSCREENS) {
+    vlog.error("vncExtensionInit: too many screens");
     return;
   }
 
-  vncErrorBase = extEntry->errorBase;
-  vncEventBase = extEntry->eventBase;
+  if (sizeof(ShortRect) != sizeof(struct UpdateRect)) {
+    vlog.error("vncExtensionInit: Incompatible ShortRect size");
+    return;
+  }
+
+  ret = vncAddExtension();
+  if (ret == -1)
+    return;
 
   vlog.info("VNC extension running!");
 
-  if (!AddCallback(&ClientStateCallback, vncClientStateChange, 0)) {
-    FatalError("Add ClientStateCallback failed\n");
-  }
-
-  if (!AddCallback(&SelectionCallback, vncSelectionCallback, 0)) {
-    FatalError("Add SelectionCallback failed\n");
-  }
-
   try {
     if (!initialised) {
       rfb::initStdIOLoggers();
       initialised = true;
     }
 
-    for (int scr = 0; scr < screenInfo.numScreens; scr++) {
+    for (int scr = 0; scr < vncGetScreenCount(); scr++) {
 
       if (!desktop[scr]) {
         network::TcpListener* listener = 0;
@@ -234,30 +145,35 @@
           }
         } else {
           int port = rfbport;
-          if (port == 0) port = 5900 + atoi(display);
+          if (port == 0) port = 5900 + atoi(vncGetDisplay());
           port += 1000 * scr;
-          listener = new network::TcpListener(listenaddr, port, localhostOnly);
+          if (strcasecmp(interface, "all") == 0)
+            listener = new network::TcpListener(NULL, port, localhostOnly);
+          else
+            listener = new network::TcpListener(interface, port, localhostOnly);
           vlog.info("Listening for VNC connections on %s interface(s), port %d",
-		    listenaddr == NULL ? "all" : listenaddr, port);
+                    (const char*)interface, port);
           CharArray httpDirStr(httpDir.getData());
           if (httpDirStr.buf[0]) {
             port = httpPort;
-            if (port == 0) port = 5800 + atoi(display);
+            if (port == 0) port = 5800 + atoi(vncGetDisplay());
             port += 1000 * scr;
-            httpListener = new network::TcpListener(listenaddr, port, localhostOnly);
+            httpListener = new network::TcpListener(interface, port, localhostOnly);
             vlog.info("Listening for HTTP connections on %s interface(s), port %d",
-		      listenaddr == NULL ? "all" : listenaddr, port);
+                      (const char*)interface, port);
           }
         }
 
         CharArray desktopNameStr(desktopName.getData());
-        PixelFormat pf = vncGetPixelFormat(screenInfo.screens[scr]);
+        PixelFormat pf = vncGetPixelFormat(scr);
 
-        desktop[scr] = new XserverDesktop(screenInfo.screens[scr],
+        desktop[scr] = new XserverDesktop(scr,
                                           listener,
                                           httpListener,
                                           desktopNameStr.buf,
                                           pf,
+                                          vncGetScreenWidth(scr),
+                                          vncGetScreenHeight(scr),
                                           vncFbptr[scr],
                                           vncFbstride[scr]);
         vlog.info("created VNC server for screen %d", scr);
@@ -269,889 +185,182 @@
         }
       }
 
-      vncHooksInit(screenInfo.screens[scr], desktop[scr]);
+      vncHooksInit(scr);
     }
-
-    RegisterBlockAndWakeupHandlers(vncBlockHandler, vncWakeupHandler, 0);
-
   } catch (rdr::Exception& e) {
     vlog.error("vncExtInit: %s",e.str());
   }
+
+  vncRegisterBlockHandlers();
 }
 
-static void vncResetProc(ExtensionEntry* extEntry)
+void vncCallReadBlockHandlers(fd_set * fds, struct timeval ** timeout)
 {
-}
-
-static void vncSelectionCallback(CallbackListPtr *callbacks, void * data, void * args)
-{
-  SelectionInfoRec *info = (SelectionInfoRec *) args;
-  Selection *selection = info->selection;
-
-  SendSelectionChangeEvent(selection->selection);
-}
-
-static void vncWriteBlockHandlerFallback(OSTimePtr timeout);
-static void vncWriteWakeupHandlerFallback();
-
-//
-// vncBlockHandler - called just before the X server goes into select().  Call
-// on to the block handler for each desktop.  Then check whether any of the
-// selections have changed, and if so, notify any interested X clients.
-//
-
-static void vncBlockHandler(void * data, OSTimePtr timeout, void * readmask)
-{
-  fd_set* fds = (fd_set*)readmask;
-
-  vncWriteBlockHandlerFallback(timeout);
-
-  for (int scr = 0; scr < screenInfo.numScreens; scr++)
+  for (int scr = 0; scr < vncGetScreenCount(); scr++)
     if (desktop[scr])
-      desktop[scr]->blockHandler(fds, timeout);
+      desktop[scr]->readBlockHandler(fds, timeout);
 }
 
-static void vncWakeupHandler(void * data, int nfds, void * readmask)
+void vncCallReadWakeupHandlers(fd_set * fds, int nfds)
 {
-  fd_set* fds = (fd_set*)readmask;
-
-  for (int scr = 0; scr < screenInfo.numScreens; scr++) {
-    if (desktop[scr]) {
-      desktop[scr]->wakeupHandler(fds, nfds);
-    }
-  }
-
-  vncWriteWakeupHandlerFallback();
-}
-
-//
-// vncWriteBlockHandler - extra hack to be able to get the main select loop
-// to monitor writeable fds and not just readable. This requirers a modified
-// Xorg and might therefore not be called. When it is called though, it will
-// do so before vncBlockHandler (and vncWriteWakeupHandler called after
-// vncWakeupHandler).
-//
-
-static bool needFallback = true;
-static fd_set fallbackFds;
-static struct timeval tw;
-
-void vncWriteBlockHandler(fd_set *fds)
-{
-  needFallback = false;
-
-  for (int scr = 0; scr < screenInfo.numScreens; scr++)
+  for (int scr = 0; scr < vncGetScreenCount(); scr++)
     if (desktop[scr])
-      desktop[scr]->writeBlockHandler(fds);
+      desktop[scr]->readWakeupHandler(fds, nfds);
 }
 
-void vncWriteWakeupHandler(int nfds, fd_set *fds)
+void vncCallWriteBlockHandlers(fd_set * fds, struct timeval ** timeout)
 {
-  for (int scr = 0; scr < screenInfo.numScreens; scr++) {
-    if (desktop[scr]) {
+  for (int scr = 0; scr < vncGetScreenCount(); scr++)
+    if (desktop[scr])
+      desktop[scr]->writeBlockHandler(fds, timeout);
+}
+
+void vncCallWriteWakeupHandlers(fd_set * fds, int nfds)
+{
+  for (int scr = 0; scr < vncGetScreenCount(); scr++)
+    if (desktop[scr])
       desktop[scr]->writeWakeupHandler(fds, nfds);
+}
+
+int vncGetAvoidShiftNumLock(void)
+{
+  return (bool)avoidShiftNumLock;
+}
+
+void vncUpdateDesktopName(void)
+{
+  for (int scr = 0; scr < vncGetScreenCount(); scr++) {
+    if (desktop[scr] == NULL)
+      continue;
+    desktop[scr]->setDesktopName(desktopName);
+  }
+}
+
+void vncServerCutText(const char *text, size_t len)
+{
+  for (int scr = 0; scr < vncGetScreenCount(); scr++) {
+    if (desktop[scr] == NULL)
+      continue;
+    desktop[scr]->serverCutText(text, len);
+  }
+}
+
+int vncConnectClient(const char *addr)
+{
+  if (desktop[0] == NULL)
+    return -1;
+
+  if (strlen(addr) == 0) {
+    try {
+      desktop[0]->disconnectClients();
+    } catch (rdr::Exception& e) {
+      vlog.error("Disconnecting all clients: %s",e.str());
+      return -1;
     }
+    return 0;
+  }
+
+  char *host;
+  int port;
+
+  getHostAndPort(addr, &host, &port, 5500);
+
+  try {
+    network::Socket* sock = new network::TcpSocket(host, port);
+    delete [] host;
+    desktop[0]->addClient(sock, true);
+  } catch (rdr::Exception& e) {
+    vlog.error("Reverse connection: %s",e.str());
+    return -1;
+  }
+
+  return 0;
+}
+
+void vncGetQueryConnect(uint32_t *opaqueId, const char**username,
+                        const char **address, int *timeout)
+{
+  for (int scr = 0; scr < vncGetScreenCount(); scr++) {
+    if (desktop[scr] == NULL)
+      continue;
+    desktop[scr]->getQueryConnect(opaqueId, username, address, timeout);
+    if (opaqueId != 0)
+      break;
   }
 }
 
-static void vncWriteBlockHandlerFallback(OSTimePtr timeout)
+void vncApproveConnection(uint32_t opaqueId, int approve)
 {
-  if (!needFallback)
-    return;
-
-  FD_ZERO(&fallbackFds);
-  vncWriteBlockHandler(&fallbackFds);
-  needFallback = true;
-
-  if (!XFD_ANYSET(&fallbackFds))
-    return;
-
-  if ((*timeout == NULL) ||
-      ((*timeout)->tv_sec > 0) || ((*timeout)->tv_usec > 10000)) {
-    tw.tv_sec = 0;
-    tw.tv_usec = 10000;
-    *timeout = &tw;
-  }
-}
-
-static void vncWriteWakeupHandlerFallback()
-{
-  int ret;
-  struct timeval timeout;
-
-  if (!needFallback)
-    return;
-
-  if (!XFD_ANYSET(&fallbackFds))
-    return;
-
-  timeout.tv_sec = 0;
-  timeout.tv_usec = 0;
-
-  ret = select(XFD_SETSIZE, NULL, &fallbackFds, NULL, &timeout);
-  if (ret < 0) {
-    ErrorF("vncWriteWakeupHandlerFallback(): select: %s\n",
-           strerror(errno));
-    return;
-  }
-
-  if (ret == 0)
-    return;
-
-  vncWriteWakeupHandler(ret, &fallbackFds);
-}
-
-static void vncClientStateChange(CallbackListPtr*, void *, void * p)
-{
-  ClientPtr client = ((NewClientInfoRec*)p)->client;
-  if (client->clientState == ClientStateGone) {
-    VncInputSelect** nextPtr = &vncInputSelectHead;
-    for (VncInputSelect* cur = vncInputSelectHead; cur; cur = *nextPtr) {
-      if (cur->client == client) {
-        *nextPtr = cur->next;
-        delete cur;
-        continue;
-      }
-      nextPtr = &cur->next;
-    }
+  for (int scr = 0; scr < vncGetScreenCount(); scr++) {
+    if (desktop[scr] == NULL)
+      continue;
+    desktop[scr]->approveConnection(opaqueId, approve,
+                                    "Connection rejected by local user");
   }
 }
 
 void vncBell()
 {
-  for (int scr = 0; scr < screenInfo.numScreens; scr++) {
-    if (desktop[scr]) {
-      desktop[scr]->bell();
-    }
+  for (int scr = 0; scr < vncGetScreenCount(); scr++) {
+    if (desktop[scr] == NULL)
+      continue;
+    desktop[scr]->bell();
   }
 }
 
-void vncClientGone(int fd)
+void vncAddChanged(int scrIdx, const struct UpdateRect *extents,
+                   int nRects, const struct UpdateRect *rects)
 {
-  if (fd == vncInetdSock) {
-    fprintf(stderr,"inetdSock client gone\n");
-    GiveUp(0);
+  Region reg;
+
+  reg.setExtentsAndOrderedRects((ShortRect*)extents,
+                                nRects, (ShortRect*)rects);
+  desktop[scrIdx]->add_changed(reg);
+}
+
+void vncAddCopied(int scrIdx, const struct UpdateRect *extents,
+                  int nRects, const struct UpdateRect *rects,
+                  int dx, int dy)
+{
+  Region reg;
+
+  reg.setExtentsAndOrderedRects((ShortRect*)extents,
+                                nRects, (ShortRect*)rects);
+  desktop[scrIdx]->add_copied(reg, rfb::Point(dx, dy));
+}
+
+void vncSetCursor(int scrIdx, int width, int height, int hotX, int hotY,
+                  const unsigned char *rgbaData)
+{
+  desktop[scrIdx]->setCursor(width, height, hotX, hotY, rgbaData);
+}
+
+void vncPreScreenResize(int scrIdx)
+{
+  // We need to prevent the RFB core from accessing the framebuffer
+  // for a while as there might be updates thrown our way inside
+  // the routines that change the screen (i.e. before we have a
+  // pointer to the new framebuffer).
+  desktop[scrIdx]->blockUpdates();
+}
+
+void vncPostScreenResize(int scrIdx, int success, int width, int height)
+{
+  if (success) {
+    // Let the RFB core know of the new dimensions and framebuffer
+    desktop[scrIdx]->setFramebuffer(width, height,
+                                    vncFbptr[scrIdx], vncFbstride[scrIdx]);
+  }
+
+  desktop[scrIdx]->unblockUpdates();
+
+  if (success) {
+    // Mark entire screen as changed
+    desktop[scrIdx]->add_changed(Region(Rect(0, 0, width, height)));
   }
 }
 
-void vncClientCutText(const char* str, int len)
+void vncRefreshScreenLayout(int scrIdx)
 {
-  delete [] clientCutText;
-  clientCutText = new char[len];
-  memcpy(clientCutText, str, len);
-  clientCutTextLen = len;
-  xVncExtClientCutTextNotifyEvent ev;
-  ev.type = vncEventBase + VncExtClientCutTextNotify;
-  for (VncInputSelect* cur = vncInputSelectHead; cur; cur = cur->next) {
-    if (cur->mask & VncExtClientCutTextMask) {
-      ev.sequenceNumber = cur->client->sequence;
-      ev.window = cur->window;
-      ev.time = GetTimeInMillis();
-      if (cur->client->swapped) {
-#if XORG < 112
-        int n;
-        swaps(&ev.sequenceNumber, n);
-        swapl(&ev.window, n);
-        swapl(&ev.time, n);
-#else
-        swaps(&ev.sequenceNumber);
-        swapl(&ev.window);
-        swapl(&ev.time);
-#endif
-      }
-      WriteToClient(cur->client, sizeof(xVncExtClientCutTextNotifyEvent),
-                    (char *)&ev);
-    }
-  }
+  desktop[scrIdx]->refreshScreenLayout();
 }
-
-
-static CARD32 queryConnectTimerCallback(OsTimerPtr timer,
-                                        CARD32 now, void * arg)
-{
-  if (queryConnectTimeout)
-    queryConnectDesktop->approveConnection(queryConnectId, false, "The attempt to prompt the user to accept the connection failed");
-  // Re-notify clients, causing them to discover that we're done
-  vncQueryConnect(queryConnectDesktop, queryConnectId);
-  return 0;
-}
-
-void vncQueryConnect(XserverDesktop* desktop, void* opaqueId)
-{
-  // Only one query can be processed at any one time
-  if (queryConnectTimeout && ((desktop != queryConnectDesktop) ||
-                              (opaqueId != queryConnectId))) {
-    desktop->approveConnection(opaqueId, false,
-                               "Another connection is currently being queried.");
-    return;
-  }
-
-  // Get the query timeout.  If it's zero, there is no query.
-  queryConnectTimeout = desktop->getQueryTimeout(opaqueId);
-  queryConnectId = queryConnectTimeout ? opaqueId : 0;
-  queryConnectDesktop = queryConnectTimeout ? desktop : 0;
-
-  // Notify clients
-  bool notified = false;
-  xVncExtQueryConnectNotifyEvent ev;
-  ev.type = vncEventBase + VncExtQueryConnectNotify;
-  for (VncInputSelect* cur = vncInputSelectHead; cur; cur = cur->next) {
-    if (cur->mask & VncExtQueryConnectMask) {
-      ev.sequenceNumber = cur->client->sequence;
-      ev.window = cur->window;
-      if (cur->client->swapped) {
-#if XORG < 112
-        int n;
-        swaps(&ev.sequenceNumber, n);
-        swapl(&ev.window, n);
-#else
-        swaps(&ev.sequenceNumber);
-        swapl(&ev.window);
-#endif
-      }
-      WriteToClient(cur->client, sizeof(xVncExtQueryConnectNotifyEvent),
-                    (char *)&ev);
-      notified = true;
-    }
-  }
-
-  // If we're being asked to query a connection (rather than to cancel
-  //   a query), and haven't been able to notify clients then reject it.
-  if (queryConnectTimeout && !notified) {
-    queryConnectTimeout = 0;
-    queryConnectId = 0;
-    queryConnectDesktop = 0;
-    desktop->approveConnection(opaqueId, false,
-                               "Unable to query the local user to accept the connection.");
-    return;
-  }    
-
-  // Set a timer so that if no-one ever responds, we will eventually 
-  //   reject the connection
-  //   NB: We don't set a timer if sock is null, since that indicates
-  //       that pending queries should be cancelled.
-  if (queryConnectDesktop)
-    queryConnectTimer = TimerSet(queryConnectTimer, 0,
-                                 queryConnectTimeout*2000,
-                                 queryConnectTimerCallback, 0);
-  else
-    TimerCancel(queryConnectTimer);
-}
-
-static void SendSelectionChangeEvent(Atom selection)
-{
-  xVncExtSelectionChangeNotifyEvent ev;
-  ev.type = vncEventBase + VncExtSelectionChangeNotify;
-  for (VncInputSelect* cur = vncInputSelectHead; cur; cur = cur->next) {
-    if (cur->mask & VncExtSelectionChangeMask) {
-      ev.sequenceNumber = cur->client->sequence;
-      ev.window = cur->window;
-      ev.selection = selection;
-      if (cur->client->swapped) {
-#if XORG < 112
-        int n;
-        swaps(&ev.sequenceNumber, n);
-        swapl(&ev.window, n);
-        swapl(&ev.selection, n);
-#else
-        swaps(&ev.sequenceNumber);
-        swapl(&ev.window);
-        swapl(&ev.selection);
-#endif
-      }
-      WriteToClient(cur->client, sizeof(xVncExtSelectionChangeNotifyEvent),
-                    (char *)&ev);
-    }
-  }
-}
-
-static int ProcVncExtSetParam(ClientPtr client)
-{
-  char* value1 = 0;
-  char* value2 = 0;
-  rfb::VoidParameter *desktop1, *desktop2;
-
-  REQUEST(xVncExtSetParamReq);
-  REQUEST_FIXED_SIZE(xVncExtSetParamReq, stuff->paramLen);
-  CharArray param(stuff->paramLen+1);
-  strncpy(param.buf, (char*)&stuff[1], stuff->paramLen);
-  param.buf[stuff->paramLen] = 0;
-
-  xVncExtSetParamReply rep;
-  rep.type = X_Reply;
-  rep.length = 0;
-  rep.success = 0;
-  rep.sequenceNumber = client->sequence;
-
-  // Retrieve desktop name before setting
-  desktop1 = rfb::Configuration::getParam("desktop");
-  if (desktop1)
-    value1 = desktop1->getValueStr();
-
-  /*
-   * Allow to change only certain parameters.
-   * Changing other parameters (for example PAM service name)
-   * could have negative security impact.
-   */
-  if (strncasecmp(param.buf, "desktop", 7) != 0 &&
-      strncasecmp(param.buf, "AcceptPointerEvents", 19) != 0 &&
-      (noclipboard || strncasecmp(param.buf, "SendCutText", 11) != 0) &&
-      (noclipboard || strncasecmp(param.buf, "AcceptCutText", 13) != 0))
-    goto deny;
-
-  rep.success = rfb::Configuration::setParam(param.buf);
-
-  // Send DesktopName update if desktop name has been changed
-  desktop2 = rfb::Configuration::getParam("desktop");
-  if (desktop2)
-    value2 = desktop2->getValueStr();
-  if (value1 && value2 && strcmp(value1, value2)) {
-    for (int scr = 0; scr < screenInfo.numScreens; scr++) {
-      if (desktop[scr]) {
-	desktop[scr]->setDesktopName(value2);
-      }
-    }
-  }
-  if (value1)
-    delete [] value1;
-  if (value2)
-    delete [] value2;
-
-deny:
-  if (client->swapped) {
-#if XORG < 112
-    int n;
-    swaps(&rep.sequenceNumber, n);
-    swapl(&rep.length, n);
-#else
-    swaps(&rep.sequenceNumber);
-    swapl(&rep.length);
-#endif
-  }
-  WriteToClient(client, sizeof(xVncExtSetParamReply), (char *)&rep);
-  return (client->noClientException);
-}
-
-static int SProcVncExtSetParam(ClientPtr client)
-{
-  REQUEST(xVncExtSetParamReq);
-#if XORG < 112
-  register char n;
-  swaps(&stuff->length, n);
-#else
-  swaps(&stuff->length);
-#endif
-  REQUEST_AT_LEAST_SIZE(xVncExtSetParamReq);
-  return ProcVncExtSetParam(client);
-}
-
-static int ProcVncExtGetParam(ClientPtr client)
-{
-  REQUEST(xVncExtGetParamReq);
-  REQUEST_FIXED_SIZE(xVncExtGetParamReq, stuff->paramLen);
-  CharArray param(stuff->paramLen+1);
-  strncpy(param.buf, (char*)&stuff[1], stuff->paramLen);
-  param.buf[stuff->paramLen] = 0;
-
-  xVncExtGetParamReply rep;
-  rep.type = X_Reply;
-  rep.sequenceNumber = client->sequence;
-  rep.success = 0;
-  int len = 0;
-  char* value = 0;
-  rfb::VoidParameter* p = rfb::Configuration::getParam(param.buf);
-  // Hack to avoid exposing password!
-  if (strcasecmp(param.buf, "Password") == 0)
-    p = 0;
-  if (p) {
-    value = p->getValueStr();
-    rep.success = 1;
-    len = value ? strlen(value) : 0;
-  }
-  rep.length = (len + 3) >> 2;
-  rep.valueLen = len;
-  if (client->swapped) {
-#if XORG < 112
-    int n;
-    swaps(&rep.sequenceNumber, n);
-    swapl(&rep.length, n);
-    swaps(&rep.valueLen, n);
-#else
-    swaps(&rep.sequenceNumber);
-    swapl(&rep.length);
-    swaps(&rep.valueLen);
-#endif
-  }
-  WriteToClient(client, sizeof(xVncExtGetParamReply), (char *)&rep);
-  if (value)
-    WriteToClient(client, len, value);
-  delete [] value;
-  return (client->noClientException);
-}
-
-static int SProcVncExtGetParam(ClientPtr client)
-{
-  REQUEST(xVncExtGetParamReq);
-#if XORG < 112
-  register char n;
-  swaps(&stuff->length, n);
-#else
-  swaps(&stuff->length);
-#endif
-  REQUEST_AT_LEAST_SIZE(xVncExtGetParamReq);
-  return ProcVncExtGetParam(client);
-}
-
-static int ProcVncExtGetParamDesc(ClientPtr client)
-{
-  REQUEST(xVncExtGetParamDescReq);
-  REQUEST_FIXED_SIZE(xVncExtGetParamDescReq, stuff->paramLen);
-  CharArray param(stuff->paramLen+1);
-  strncpy(param.buf, (char*)&stuff[1], stuff->paramLen);
-  param.buf[stuff->paramLen] = 0;
-
-  xVncExtGetParamDescReply rep;
-  rep.type = X_Reply;
-  rep.sequenceNumber = client->sequence;
-  rep.success = 0;
-  int len = 0;
-  const char* desc = 0;
-  rfb::VoidParameter* p = rfb::Configuration::getParam(param.buf);
-  if (p) {
-    desc = p->getDescription();
-    rep.success = 1;
-    len = desc ? strlen(desc) : 0;
-  }
-  rep.length = (len + 3) >> 2;
-  rep.descLen = len;
-  if (client->swapped) {
-#if XORG < 112
-    int n;
-    swaps(&rep.sequenceNumber, n);
-    swapl(&rep.length, n);
-    swaps(&rep.descLen, n);
-#else
-    swaps(&rep.sequenceNumber);
-    swapl(&rep.length);
-    swaps(&rep.descLen);
-#endif
-  }
-  WriteToClient(client, sizeof(xVncExtGetParamDescReply), (char *)&rep);
-  if (desc)
-    WriteToClient(client, len, (char*)desc);
-  return (client->noClientException);
-}
-
-static int SProcVncExtGetParamDesc(ClientPtr client)
-{
-  REQUEST(xVncExtGetParamDescReq);
-#if XORG < 112
-  register char n;
-  swaps(&stuff->length, n);
-#else
-  swaps(&stuff->length);
-#endif
-  REQUEST_AT_LEAST_SIZE(xVncExtGetParamDescReq);
-  return ProcVncExtGetParamDesc(client);
-}
-
-static int ProcVncExtListParams(ClientPtr client)
-{
-  REQUEST(xVncExtListParamsReq);
-  REQUEST_SIZE_MATCH(xVncExtListParamsReq);
-
-  xVncExtListParamsReply rep;
-  rep.type = X_Reply;
-  rep.sequenceNumber = client->sequence;
-
-  int nParams = 0;
-  int len = 0;
-  for (ParameterIterator i; i.param; i.next()) {
-    int l = strlen(i.param->getName());
-    if (l <= 255) {
-      nParams++;
-      len += l + 1;
-    }
-  }
-  rep.length = (len + 3) >> 2;
-  rep.nParams = nParams;
-  if (client->swapped) {
-#if XORG < 112
-    int n;
-    swaps(&rep.sequenceNumber, n);
-    swapl(&rep.length, n);
-    swaps(&rep.nParams, n);
-#else
-    swaps(&rep.sequenceNumber);
-    swapl(&rep.length);
-    swaps(&rep.nParams);
-#endif
-  }
-  WriteToClient(client, sizeof(xVncExtListParamsReply), (char *)&rep);
-  rdr::U8* data = new rdr::U8[len];
-  rdr::U8* ptr = data;
-  for (ParameterIterator i; i.param; i.next()) {
-    int l = strlen(i.param->getName());
-    if (l <= 255) {
-      *ptr++ = l;
-      memcpy(ptr, i.param->getName(), l);
-      ptr += l;
-    }
-  }
-  WriteToClient(client, len, (char*)data);
-  delete [] data;
-  return (client->noClientException);
-}
-
-static int SProcVncExtListParams(ClientPtr client)
-{
-  REQUEST(xVncExtListParamsReq);
-#if XORG < 112
-  register char n;
-  swaps(&stuff->length, n);
-#else
-  swaps(&stuff->length);
-#endif
-  REQUEST_SIZE_MATCH(xVncExtListParamsReq);
-  return ProcVncExtListParams(client);
-}
-
-static int ProcVncExtSetServerCutText(ClientPtr client)
-{
-  REQUEST(xVncExtSetServerCutTextReq);
-  REQUEST_FIXED_SIZE(xVncExtSetServerCutTextReq, stuff->textLen);
-  char* str = new char[stuff->textLen+1];
-  strncpy(str, (char*)&stuff[1], stuff->textLen);
-  str[stuff->textLen] = 0;
-  for (int scr = 0; scr < screenInfo.numScreens; scr++) {
-    if (desktop[scr]) {
-      desktop[scr]->serverCutText(str, stuff->textLen);
-    }
-  }
-  delete [] str;
-  return (client->noClientException);
-}
-
-static int SProcVncExtSetServerCutText(ClientPtr client)
-{
-  REQUEST(xVncExtSetServerCutTextReq);
-#if XORG < 112
-  register char n;
-  swaps(&stuff->length, n);
-#else
-  swaps(&stuff->length);
-#endif
-  REQUEST_AT_LEAST_SIZE(xVncExtSetServerCutTextReq);
-#if XORG < 112
-  swapl(&stuff->textLen, n);
-#else
-  swapl(&stuff->textLen);
-#endif
-  return ProcVncExtSetServerCutText(client);
-}
-
-static int ProcVncExtGetClientCutText(ClientPtr client)
-{
-  REQUEST(xVncExtGetClientCutTextReq);
-  REQUEST_SIZE_MATCH(xVncExtGetClientCutTextReq);
-
-  xVncExtGetClientCutTextReply rep;
-  rep.type = X_Reply;
-  rep.length = (clientCutTextLen + 3) >> 2;
-  rep.sequenceNumber = client->sequence;
-  rep.textLen = clientCutTextLen;
-  if (client->swapped) {
-#if XORG < 112
-    int n;
-    swaps(&rep.sequenceNumber, n);
-    swapl(&rep.length, n);
-    swapl(&rep.textLen, n);
-#else
-    swaps(&rep.sequenceNumber);
-    swapl(&rep.length);
-    swapl(&rep.textLen);
-#endif
-  }
-  WriteToClient(client, sizeof(xVncExtGetClientCutTextReply), (char *)&rep);
-  if (clientCutText)
-    WriteToClient(client, clientCutTextLen, clientCutText);
-  return (client->noClientException);
-}
-
-static int SProcVncExtGetClientCutText(ClientPtr client)
-{
-  REQUEST(xVncExtGetClientCutTextReq);
-#if XORG < 112
-  register char n;
-  swaps(&stuff->length, n);
-#else
-  swaps(&stuff->length);
-#endif
-  REQUEST_SIZE_MATCH(xVncExtGetClientCutTextReq);
-  return ProcVncExtGetClientCutText(client);
-}
-
-static int ProcVncExtSelectInput(ClientPtr client)
-{
-  REQUEST(xVncExtSelectInputReq);
-  REQUEST_SIZE_MATCH(xVncExtSelectInputReq);
-  VncInputSelect** nextPtr = &vncInputSelectHead;
-  VncInputSelect* cur;
-  for (cur = vncInputSelectHead; cur; cur = *nextPtr) {
-    if (cur->client == client && cur->window == stuff->window) {
-      cur->mask = stuff->mask;
-      if (!cur->mask) {
-        *nextPtr = cur->next;
-        delete cur;
-      }
-      break;
-    }
-    nextPtr = &cur->next;
-  }
-  if (!cur) {
-    cur = new VncInputSelect(client, stuff->window, stuff->mask);
-  }
-  return (client->noClientException);
-}
-
-static int SProcVncExtSelectInput(ClientPtr client)
-{
-  REQUEST(xVncExtSelectInputReq);
-#if XORG < 112
-  register char n;
-  swaps(&stuff->length, n);
-#else
-  swaps(&stuff->length);
-#endif
-  REQUEST_SIZE_MATCH(xVncExtSelectInputReq);
-#if XORG < 112
-  swapl(&stuff->window, n);
-  swapl(&stuff->mask, n);
-#else
-  swapl(&stuff->window);
-  swapl(&stuff->mask);
-#endif
-  return ProcVncExtSelectInput(client);
-}
-
-static int ProcVncExtConnect(ClientPtr client)
-{
-  REQUEST(xVncExtConnectReq);
-  REQUEST_FIXED_SIZE(xVncExtConnectReq, stuff->strLen);
-  CharArray str(stuff->strLen+1);
-  strncpy(str.buf, (char*)&stuff[1], stuff->strLen);
-  str.buf[stuff->strLen] = 0;
-
-  xVncExtConnectReply rep;
-  rep.success = 0;
-  if (desktop[0]) {
-    if (stuff->strLen == 0) {
-      try {
-        desktop[0]->disconnectClients();
-        rep.success = 1;
-      } catch (rdr::Exception& e) {
-        vlog.error("Disconnecting all clients: %s",e.str());
-      }
-    } else {
-      int port = 5500;
-      for (int i = 0; i < stuff->strLen; i++) {
-        if (str.buf[i] == ':') {
-          port = atoi(&str.buf[i+1]);
-          str.buf[i] = 0;
-          break;
-        }
-      }
-
-      try {
-        network::Socket* sock = new network::TcpSocket(str.buf, port);
-        desktop[0]->addClient(sock, true);
-	rep.success = 1;
-      } catch (rdr::Exception& e) {
-        vlog.error("Reverse connection: %s",e.str());
-      }
-    }
-  }
-
-  rep.type = X_Reply;
-  rep.length = 0;
-  rep.sequenceNumber = client->sequence;
-  if (client->swapped) {
-#if XORG < 112
-    int n;
-    swaps(&rep.sequenceNumber, n);
-    swapl(&rep.length, n);
-#else
-    swaps(&rep.sequenceNumber);
-    swapl(&rep.length);
-#endif
-  }
-  WriteToClient(client, sizeof(xVncExtConnectReply), (char *)&rep);
-  return (client->noClientException);
-}
-
-static int SProcVncExtConnect(ClientPtr client)
-{
-  REQUEST(xVncExtConnectReq);
-#if XORG < 112
-  register char n;
-  swaps(&stuff->length, n);
-#else
-  swaps(&stuff->length);
-#endif
-  REQUEST_AT_LEAST_SIZE(xVncExtConnectReq);
-  return ProcVncExtConnect(client);
-}
-
-
-static int ProcVncExtGetQueryConnect(ClientPtr client)
-{
-  REQUEST(xVncExtGetQueryConnectReq);
-  REQUEST_SIZE_MATCH(xVncExtGetQueryConnectReq);
-
-  const char *qcAddress=0, *qcUsername=0;
-  int qcTimeout;
-  if (queryConnectDesktop)
-    qcTimeout = queryConnectDesktop->getQueryTimeout(queryConnectId,
-                                                     &qcAddress, &qcUsername);
-  else
-    qcTimeout = 0;
-
-  xVncExtGetQueryConnectReply rep;
-  rep.type = X_Reply;
-  rep.sequenceNumber = client->sequence;
-  rep.timeout = qcTimeout;
-  rep.addrLen = qcTimeout ? strlen(qcAddress) : 0;
-  rep.userLen = qcTimeout ? strlen(qcUsername) : 0;
-  rep.opaqueId = (CARD32)(long)queryConnectId;
-  rep.length = ((rep.userLen + 3) >> 2) + ((rep.addrLen + 3) >> 2);
-  if (client->swapped) {
-#if XORG < 112
-    int n;
-    swaps(&rep.sequenceNumber, n);
-    swapl(&rep.addrLen, n);
-    swapl(&rep.userLen, n);
-    swapl(&rep.timeout, n);
-    swapl(&rep.opaqueId, n);
-    swapl(&rep.length, n);
-#else
-    swaps(&rep.sequenceNumber);
-    swapl(&rep.addrLen);
-    swapl(&rep.userLen);
-    swapl(&rep.timeout);
-    swapl(&rep.opaqueId);
-    swapl(&rep.length);
-#endif
-  }
-  WriteToClient(client, sizeof(xVncExtGetQueryConnectReply), (char *)&rep);
-  if (qcTimeout)
-    WriteToClient(client, strlen(qcAddress), (char*)qcAddress);
-  if (qcTimeout)
-    WriteToClient(client, strlen(qcUsername), (char*)qcUsername);
-  return (client->noClientException);
-}
-
-static int SProcVncExtGetQueryConnect(ClientPtr client)
-{
-  REQUEST(xVncExtGetQueryConnectReq);
-#if XORG < 112
-  register char n;
-  swaps(&stuff->length, n);
-#else
-  swaps(&stuff->length);
-#endif
-  REQUEST_SIZE_MATCH(xVncExtGetQueryConnectReq);
-  return ProcVncExtGetQueryConnect(client);
-}
-
-
-static int ProcVncExtApproveConnect(ClientPtr client)
-{
-  REQUEST(xVncExtApproveConnectReq);
-  REQUEST_SIZE_MATCH(xVncExtApproveConnectReq);
-  if ((CARD32)(long)queryConnectId == stuff->opaqueId) {
-    for (int scr = 0; scr < screenInfo.numScreens; scr++) {
-      if (desktop[scr]) {
-        desktop[scr]->approveConnection(queryConnectId, stuff->approve,
-                                        "Connection rejected by local user");
-      }
-    }
-    // Inform other clients of the event and tidy up
-    vncQueryConnect(queryConnectDesktop, queryConnectId);
-  }
-  return (client->noClientException);
-}
-
-static int SProcVncExtApproveConnect(ClientPtr client)
-{
-  REQUEST(xVncExtApproveConnectReq);
-#if XORG < 112
-  register char n;
-  swaps(&stuff->length, n);
-  swapl(&stuff->opaqueId, n);
-#else
-  swaps(&stuff->length);
-  swapl(&stuff->opaqueId);
-#endif
-  REQUEST_SIZE_MATCH(xVncExtApproveConnectReq);
-  return ProcVncExtApproveConnect(client);
-}
-
-
-static int ProcVncExtDispatch(ClientPtr client)
-{
-  REQUEST(xReq);
-  switch (stuff->data) {
-  case X_VncExtSetParam:
-    return ProcVncExtSetParam(client);
-  case X_VncExtGetParam:
-    return ProcVncExtGetParam(client);
-  case X_VncExtGetParamDesc:
-    return ProcVncExtGetParamDesc(client);
-  case X_VncExtListParams:
-    return ProcVncExtListParams(client);
-  case X_VncExtSetServerCutText:
-    return ProcVncExtSetServerCutText(client);
-  case X_VncExtGetClientCutText:
-    return ProcVncExtGetClientCutText(client);
-  case X_VncExtSelectInput:
-    return ProcVncExtSelectInput(client);
-  case X_VncExtConnect:
-    return ProcVncExtConnect(client);
-  case X_VncExtGetQueryConnect:
-    return ProcVncExtGetQueryConnect(client);
-  case X_VncExtApproveConnect:
-    return ProcVncExtApproveConnect(client);
-  default:
-    return BadRequest;
-  }
-}
-
-static int SProcVncExtDispatch(ClientPtr client)
-{
-  REQUEST(xReq);
-  switch (stuff->data) {
-  case X_VncExtSetParam:
-    return SProcVncExtSetParam(client);
-  case X_VncExtGetParam:
-    return SProcVncExtGetParam(client);
-  case X_VncExtGetParamDesc:
-    return SProcVncExtGetParamDesc(client);
-  case X_VncExtListParams:
-    return SProcVncExtListParams(client);
-  case X_VncExtSetServerCutText:
-    return SProcVncExtSetServerCutText(client);
-  case X_VncExtGetClientCutText:
-    return SProcVncExtGetClientCutText(client);
-  case X_VncExtSelectInput:
-    return SProcVncExtSelectInput(client);
-  case X_VncExtConnect:
-    return SProcVncExtConnect(client);
-  case X_VncExtGetQueryConnect:
-    return SProcVncExtGetQueryConnect(client);
-  case X_VncExtApproveConnect:
-    return SProcVncExtApproveConnect(client);
-  default:
-    return BadRequest;
-  }
-}
-
diff --git a/unix/xserver/hw/vnc/vncExtInit.h b/unix/xserver/hw/vnc/vncExtInit.h
index 931c28f..6c9857c 100644
--- a/unix/xserver/hw/vnc/vncExtInit.h
+++ b/unix/xserver/hw/vnc/vncExtInit.h
@@ -1,4 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2011-2015 Pierre Ossman for Cendio AB
  * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,21 +19,77 @@
 #ifndef __VNCEXTINIT_H__
 #define __VNCEXTINIT_H__
 
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
+#include <stdint.h>
+#include <sys/select.h>
+
+// Only from C++
+#ifdef __cplusplus
+namespace rfb { class StringParameter; };
+
+extern rfb::StringParameter httpDir;
 #endif
 
-#include <rfb/Configuration.h>
-#include "XserverDesktop.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
 
-extern void vncClientCutText(const char* str, int len);
-extern void vncQueryConnect(XserverDesktop* desktop, void* opaqueId);
-extern void vncClientGone(int fd);
-extern void vncBell();
+// vncExt.c
+extern int vncNoClipboard;
+
+int vncAddExtension(void);
+
+int vncNotifyQueryConnect(void);
+
+void vncClientCutText(const char* str, int len);
+
+// vncExtInit.cc
 extern void* vncFbptr[];
 extern int vncFbstride[];
-extern bool noclipboard;
+
 extern int vncInetdSock;
-extern rfb::StringParameter httpDir;
+
+void vncExtensionInit(void);
+
+void vncCallReadBlockHandlers(fd_set * fds, struct timeval ** timeout);
+void vncCallReadWakeupHandlers(fd_set * fds, int nfds);
+void vncCallWriteBlockHandlers(fd_set * fds, struct timeval ** timeout);
+void vncCallWriteWakeupHandlers(fd_set * fds, int nfds);
+
+int vncGetAvoidShiftNumLock(void);
+
+void vncUpdateDesktopName(void);
+
+void vncServerCutText(const char *text, size_t len);
+
+int vncConnectClient(const char *addr);
+
+void vncGetQueryConnect(uint32_t *opaqueId, const char**username,
+                        const char **address, int *timeout);
+void vncApproveConnection(uint32_t opaqueId, int approve);
+
+void vncBell(void);
+
+// Must match rfb::ShortRect in common/rfb/Region.h, and BoxRec in the
+// Xorg source.
+struct UpdateRect {
+  short x1, y1, x2, y2;
+};
+
+void vncAddChanged(int scrIdx, const struct UpdateRect *extents,
+                   int nRects, const struct UpdateRect *rects);
+void vncAddCopied(int scrIdx, const struct UpdateRect *extents,
+                  int nRects, const struct UpdateRect *rects,
+                  int dx, int dy);
+
+void vncSetCursor(int scrIdx, int width, int height, int hotX, int hotY,
+                  const unsigned char *rgbaData);
+
+void vncPreScreenResize(int scrIdx);
+void vncPostScreenResize(int scrIdx, int success, int width, int height);
+void vncRefreshScreenLayout(int scrIdx);
+
+#ifdef __cplusplus
+}
+#endif
 
 #endif
diff --git a/unix/xserver/hw/vnc/vncHooks.cc b/unix/xserver/hw/vnc/vncHooks.c
similarity index 72%
rename from unix/xserver/hw/vnc/vncHooks.cc
rename to unix/xserver/hw/vnc/vncHooks.c
index f75a2d4..dc2b811 100644
--- a/unix/xserver/hw/vnc/vncHooks.cc
+++ b/unix/xserver/hw/vnc/vncHooks.c
@@ -1,5 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
- * Copyright 2009 Pierre Ossman for Cendio AB
+ * Copyright 2009-2015 Pierre Ossman for Cendio AB
  * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,17 +22,15 @@
 #endif
 
 #include <stdio.h>
-#include "XserverDesktop.h"
+
 #include "vncHooks.h"
 #include "vncExtInit.h"
+
 #include "xorg-version.h"
 
-extern "C" {
-#define class c_class
-#define private c_private
-#define public c_public
 #include "scrnintstr.h"
 #include "windowstr.h"
+#include "cursorstr.h"
 #include "gcstruct.h"
 #include "regionstr.h"
 #include "dixfontstr.h"
@@ -44,15 +42,15 @@
 #include "randrstr.h"
 #endif
 
-#undef class
-#undef private
-#undef public
-}
-
-#include "RegionHelper.h"
-
 #define DBGPRINT(x) //(fprintf x)
 
+// REGION_NULL was introduced in the Xorg tree as the way to initialise an
+// empty region.  If it's not already defined do it the old way.  Note that the
+// old way causes a segfault in the new tree...
+#ifndef REGION_NULL
+#define REGION_NULL(pScreen,pReg) REGION_INIT(pScreen,pReg,NullBox,0)
+#endif
+
 // MAX_RECTS_PER_OP is the maximum number of rectangles we generate from
 // operations like Polylines and PolySegment.  If the operation is more complex
 // than this, we simply use the bounding box.  Ideally it would be a
@@ -65,8 +63,8 @@
 // functions are each wrapped individually, while the GC "funcs" and "ops" are
 // wrapped as a unit.
 
-typedef struct {
-  XserverDesktop* desktop;
+typedef struct _vncHooksScreenRec {
+  int                          ignoreHooks;
 
   CloseScreenProcPtr           CloseScreen;
   CreateGCProcPtr              CreateGC;
@@ -88,7 +86,7 @@
 #endif
 } vncHooksScreenRec, *vncHooksScreenPtr;
 
-typedef struct {
+typedef struct _vncHooksGCRec {
 #if XORG >= 116
     const GCFuncs *wrappedFuncs;
     const GCOps *wrappedOps;
@@ -250,10 +248,25 @@
 // resets.  It is called once for each screen, but the indexes are only
 // allocated once for each server generation.
 
-Bool vncHooksInit(ScreenPtr pScreen, XserverDesktop* desktop)
+int vncHooksInit(int scrIdx)
 {
+  ScreenPtr pScreen;
   vncHooksScreenPtr vncHooksScreen;
 
+#ifdef RENDER
+  PictureScreenPtr ps;
+#endif
+#ifdef RANDR
+  rrScrPrivPtr rp;
+#endif
+
+  pScreen = screenInfo.screens[scrIdx];
+
+  if (sizeof(BoxRec) != sizeof(struct UpdateRect)) {
+    ErrorF("vncHooksInit: Incompatible BoxRec size\n");
+    return FALSE;
+  }
+
 #if XORG < 19
   if (!dixRequestPrivate(vncHooksScreenPrivateKey, sizeof(vncHooksScreenRec))) {
     ErrorF("vncHooksInit: Allocation of vncHooksScreen failed\n");
@@ -280,7 +293,7 @@
 
   vncHooksScreen = vncHooksScreenPrivate(pScreen);
 
-  vncHooksScreen->desktop = desktop;
+  vncHooksScreen->ignoreHooks = 0;
 
   vncHooksScreen->CloseScreen = pScreen->CloseScreen;
   vncHooksScreen->CreateGC = pScreen->CreateGC;
@@ -292,7 +305,6 @@
   vncHooksScreen->DisplayCursor = pScreen->DisplayCursor;
   vncHooksScreen->BlockHandler = pScreen->BlockHandler;
 #ifdef RENDER
-  PictureScreenPtr ps;
   ps = GetPictureScreenIfSet(pScreen);
   if (ps) {
     vncHooksScreen->Composite = ps->Composite;
@@ -300,7 +312,6 @@
   }
 #endif
 #ifdef RANDR
-  rrScrPrivPtr rp;
   rp = rrGetScrPriv(pScreen);
   if (rp) {
     vncHooksScreen->RandRSetConfig = rp->rrSetConfig;
@@ -339,6 +350,66 @@
   return TRUE;
 }
 
+/////////////////////////////////////////////////////////////////////////////
+// vncGetScreenImage() grabs a chunk of data from the main screen into the
+// provided buffer. It lives here rather than in XorgGlue.c because it
+// temporarily pauses the hooks.
+
+void vncGetScreenImage(int scrIdx, int x, int y, int width, int height,
+                       char *buffer, int strideBytes)
+{
+  ScreenPtr pScreen = screenInfo.screens[scrIdx];
+  vncHooksScreenPtr vncHooksScreen = vncHooksScreenPrivate(pScreen);
+
+  int i;
+
+  vncHooksScreen->ignoreHooks++;
+
+  // We do one line at a time since GetImage() cannot handle stride
+  for (i = y; i < y + height; i++) {
+    DrawablePtr pDrawable;
+#if XORG < 19
+    pDrawable = (DrawablePtr) WindowTable[scrIdx];
+#else
+    pDrawable = (DrawablePtr) pScreen->root;
+#endif
+
+    (*pScreen->GetImage) (pDrawable, x, i, width, 1,
+                          ZPixmap, (unsigned long)~0L, buffer);
+
+    buffer += strideBytes;
+  }
+
+  vncHooksScreen->ignoreHooks--;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Helper functions for adding changes and copies
+//
+
+static inline void add_changed(ScreenPtr pScreen, RegionPtr reg)
+{
+  vncHooksScreenPtr vncHooksScreen = vncHooksScreenPrivate(pScreen);
+  if (vncHooksScreen->ignoreHooks)
+    return;
+  vncAddChanged(pScreen->myNum,
+                (const struct UpdateRect*)REGION_EXTENTS(pScreen, reg),
+                REGION_NUM_RECTS(reg),
+                (const struct UpdateRect*)REGION_RECTS(reg));
+}
+
+static inline void add_copied(ScreenPtr pScreen, RegionPtr dst,
+                              int dx, int dy)
+{
+  vncHooksScreenPtr vncHooksScreen = vncHooksScreenPrivate(pScreen);
+  if (vncHooksScreen->ignoreHooks)
+    return;
+  vncAddCopied(pScreen->myNum,
+               (const struct UpdateRect*)REGION_EXTENTS(pScreen, dst),
+               REGION_NUM_RECTS(dst),
+               (const struct UpdateRect*)REGION_RECTS(dst), dx, dy);
+}
 
 
 /////////////////////////////////////////////////////////////////////////////
@@ -347,9 +418,6 @@
 //
 
 // SCREEN_UNWRAP and SCREEN_REWRAP unwrap and rewrap the given screen function.
-// It would be nice to do this with a C++ class, but each function is of a
-// distinct type, so it would have to use templates, and it's not worth that
-// much pain.
 
 #define SCREEN_UNWRAP(scrn,field)                                         \
   ScreenPtr pScreen = scrn;                                               \
@@ -369,6 +437,13 @@
 static Bool vncHooksCloseScreen(ScreenPtr pScreen_)
 #endif
 {
+#ifdef RENDER
+  PictureScreenPtr ps;
+#endif
+#ifdef RANDR
+  rrScrPrivPtr rp;
+#endif
+
   SCREEN_UNWRAP(pScreen_, CloseScreen);
 
   pScreen->CreateGC = vncHooksScreen->CreateGC;
@@ -380,7 +455,6 @@
   pScreen->DisplayCursor = vncHooksScreen->DisplayCursor;
   pScreen->BlockHandler = vncHooksScreen->BlockHandler;
 #ifdef RENDER
-  PictureScreenPtr ps;
   ps = GetPictureScreenIfSet(pScreen);
   if (ps) {
     ps->Composite = vncHooksScreen->Composite;
@@ -388,7 +462,6 @@
   }
 #endif
 #ifdef RANDR
-  rrScrPrivPtr rp;
   rp = rrGetScrPriv(pScreen);
   if (rp) {
     rp->rrSetConfig = vncHooksScreen->RandRSetConfig;
@@ -410,11 +483,12 @@
 
 static Bool vncHooksCreateGC(GCPtr pGC)
 {
+  vncHooksGCPtr vncHooksGC = vncHooksGCPrivate(pGC);
+  Bool ret;
+
   SCREEN_UNWRAP(pGC->pScreen, CreateGC);
 
-  vncHooksGCPtr vncHooksGC = vncHooksGCPrivate(pGC);
-
-  Bool ret = (*pScreen->CreateGC) (pGC);
+  ret = (*pScreen->CreateGC) (pGC);
 
   vncHooksGC->wrappedOps = 0;
   vncHooksGC->wrappedFuncs = pGC->funcs;
@@ -432,13 +506,21 @@
 static void vncHooksCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg,
                                RegionPtr pOldRegion)
 {
+  int dx, dy;
+  BoxRec screen_box;
+  RegionRec copied, screen_rgn;
+
   SCREEN_UNWRAP(pWin->drawable.pScreen, CopyWindow);
 
-  int dx, dy;
-  RegionHelper copied(pScreen, pOldRegion);
+  REGION_NULL(pScreen, &copied);
+  REGION_COPY(pScreen, &copied, pOldRegion);
 
-  BoxRec screen_box = {0, 0, pScreen->width, pScreen->height};
-  RegionHelper screen_rgn(pScreen, &screen_box, 1);
+  screen_box.x1 = 0;
+  screen_box.y1 = 0;
+  screen_box.x2 = pScreen->width;
+  screen_box.y2 = pScreen->height;
+
+  REGION_INIT(pScreen, &screen_rgn, &screen_box, 1);
 
   dx = pWin->drawable.x - ptOldOrg.x;
   dy = pWin->drawable.y - ptOldOrg.y;
@@ -447,15 +529,18 @@
   // We also need to copy with changes to the Window's clipping region.
   // Finally, make sure we don't get copies to or from regions outside
   // the framebuffer.
-  REGION_INTERSECT(pScreen, copied.reg, copied.reg, screen_rgn.reg);
-  REGION_TRANSLATE(pScreen, copied.reg, dx, dy);
-  REGION_INTERSECT(pScreen, copied.reg, copied.reg, screen_rgn.reg);
-  REGION_INTERSECT(pScreen, copied.reg, copied.reg, &pWin->borderClip);
+  REGION_INTERSECT(pScreen, &copied, &copied, &screen_rgn);
+  REGION_TRANSLATE(pScreen, &copied, dx, dy);
+  REGION_INTERSECT(pScreen, &copied, &copied, &screen_rgn);
+  REGION_INTERSECT(pScreen, &copied, &copied, &pWin->borderClip);
 
   (*pScreen->CopyWindow) (pWin, ptOldOrg, pOldRegion);
 
-  if (REGION_NOTEMPTY(pScreen, copied.reg))
-    vncHooksScreen->desktop->add_copied(copied.reg, dx, dy);
+  if (REGION_NOTEMPTY(pScreen, &copied))
+    add_copied(pScreen, &copied, dx, dy);
+
+  REGION_UNINIT(pScreen, &copied);
+  REGION_UNINIT(pScreen, &screen_rgn);
 
   SCREEN_REWRAP(CopyWindow);
 }
@@ -466,24 +551,27 @@
 static void vncHooksClearToBackground(WindowPtr pWin, int x, int y, int w,
                                       int h, Bool generateExposures)
 {
+  BoxRec box;
+  RegionRec reg;
+
   SCREEN_UNWRAP(pWin->drawable.pScreen, ClearToBackground);
 
-  BoxRec box;
   box.x1 = x + pWin->drawable.x;
   box.y1 = y + pWin->drawable.y;
   box.x2 = w ? (box.x1 + w) : (pWin->drawable.x + pWin->drawable.width);
   box.y2 = h ? (box.y1 + h) : (pWin->drawable.y + pWin->drawable.height);
 
-  RegionHelper changed(pScreen, &box, 0);
-
-  REGION_INTERSECT(pScreen, changed.reg, changed.reg, &pWin->clipList);
+  REGION_INIT(pScreen, &reg, &box, 0);
+  REGION_INTERSECT(pScreen, &reg, &reg, &pWin->clipList);
 
   (*pScreen->ClearToBackground) (pWin, x, y, w, h, generateExposures);
 
   if (!generateExposures) {
-    vncHooksScreen->desktop->add_changed(changed.reg);
+    add_changed(pScreen, &reg);
   }
 
+  REGION_UNINIT(pScreen, &reg);
+
   SCREEN_REWRAP(ClearToBackground);
 }
 
@@ -492,13 +580,18 @@
 
 static RegionPtr vncHooksRestoreAreas(WindowPtr pWin, RegionPtr pRegion)
 {
+  RegionRec reg;
+
   SCREEN_UNWRAP(pWin->drawable.pScreen, RestoreAreas);
 
-  RegionHelper changed(pScreen, pRegion);
+  REGION_NULL(pScreen, &reg);
+  REGION_COPY(pScreen, &reg, pRegion);
 
   RegionPtr result = (*pScreen->RestoreAreas) (pWin, pRegion);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  add_changed(pScreen, &reg);
+
+  REGION_UNINIT(pScreen, &reg);
 
   SCREEN_REWRAP(RestoreAreas);
 
@@ -514,25 +607,98 @@
 #endif
 				  ScreenPtr pScreen_, CursorPtr cursor)
 {
+  Bool ret;
+
   SCREEN_UNWRAP(pScreen_, DisplayCursor);
 
-  Bool ret = (*pScreen->DisplayCursor) (
+  ret = (*pScreen->DisplayCursor) (
 #if XORG >= 16
 					pDev,
 #endif
 					pScreen, cursor);
+
 #if XORG >= 16
   /*
    * XXX DIX calls this function with NULL argument to remove cursor sprite from
    * screen. Should we handle this in setCursor as well?
    */
-  if (cursor != NullCursor) {
+  if (cursor != NullCursor)
 #endif
-    vncHooksScreen->desktop->setCursor(cursor);
-#if XORG >= 16
-  }
+  {
+    int width, height;
+    int hotX, hotY;
+
+    unsigned char *rgbaData;
+
+    width = cursor->bits->width;
+    height = cursor->bits->height;
+
+    hotX = cursor->bits->xhot;
+    hotY = cursor->bits->yhot;
+
+    rgbaData = malloc(width * height * 4);
+    if (rgbaData == NULL)
+      goto out;
+
+#ifdef ARGB_CURSOR
+    if (cursor->bits->argb) {
+      unsigned char *out;
+      CARD32 *in;
+      int i;
+
+      in = cursor->bits->argb;
+      out = rgbaData;
+      for (i = 0; i < width*height; i++) {
+        out[0] = (*in >> 16) & 0xff;
+        out[1] = (*in >>  8) & 0xff;
+        out[2] = (*in >>  0) & 0xff;
+        out[3] = (*in >> 24) & 0xff;
+        out += 4;
+        in++;
+      }
+    } else {
+#endif
+      unsigned char *out;
+      int xMaskBytesPerRow;
+
+      xMaskBytesPerRow = BitmapBytePad(width);
+
+      out = rgbaData;
+      for (int y = 0; y < height; y++) {
+        for (int x = 0; x < width; x++) {
+          int byte = y * xMaskBytesPerRow + x / 8;
+#if (BITMAP_BIT_ORDER == MSBFirst)
+          int bit = 7 - x % 8;
+#else
+          int bit = x % 8;
 #endif
 
+          if (cursor->bits->source[byte] & (1 << bit)) {
+            out[0] = cursor->foreRed;
+            out[1] = cursor->foreGreen;
+            out[2] = cursor->foreBlue;
+          } else {
+            out[0] = cursor->backRed;
+            out[1] = cursor->backGreen;
+            out[2] = cursor->backBlue;
+          }
+
+          if (cursor->bits->mask[byte] & (1 << bit))
+            out[3] = 0xff;
+          else
+            out[3] = 0x00;
+
+          out += 4;
+        }
+      }
+#ifdef ARGB_CURSOR
+    }
+#endif
+
+    vncSetCursor(pScreen->myNum, width, height, hotX, hotY, rgbaData);
+  }
+
+out:
   SCREEN_REWRAP(DisplayCursor);
 
   return ret;
@@ -555,7 +721,7 @@
   SCREEN_UNWRAP(pScreen_, BlockHandler);
 #endif
 
-  vncHooksScreen->desktop->ignoreHooks(true);
+  vncHooksScreen->ignoreHooks++;
 
 #if XORG <= 112
   (*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask);
@@ -563,7 +729,7 @@
   (*pScreen->BlockHandler) (pScreen, pTimeout, pReadmask);
 #endif
 
-  vncHooksScreen->desktop->ignoreHooks(false);
+  vncHooksScreen->ignoreHooks--;
 
   SCREEN_REWRAP(BlockHandler);
 }
@@ -580,28 +746,20 @@
   vncHooksScreenPtr vncHooksScreen = vncHooksScreenPrivate(pScreen);
   PictureScreenPtr ps = GetPictureScreen(pScreen);
 
-  RegionHelper changed(pScreen);
+  RegionRec changed;
 
   if (pDst->pDrawable->type == DRAWABLE_WINDOW &&
       ((WindowPtr) pDst->pDrawable)->viewable) {
     BoxRec box;
-    rfb::Rect rect1, rect2;
 
-    rect1.setXYWH(pDst->pDrawable->x + xDst,
-		  pDst->pDrawable->y + yDst,
-		  width,
-		  height);
-        
-    rect2 = rect1.intersect(vncHooksScreen->desktop->getRect());
+    box.x1 = max(pDst->pDrawable->x + xDst, 0);
+    box.y1 = max(pDst->pDrawable->y + yDst, 0);
+    box.x2 = min(box.x1 + width, pScreen->width);
+    box.y2 = min(box.y1 + height, pScreen->height);
 
-    box.x1 = rect2.tl.x;
-    box.y1 = rect2.tl.y;
-    box.x2 = rect2.br.x;
-    box.y2 = rect2.br.y;
-
-    changed.init(&box, 0);
+    REGION_INIT(pScreen, &changed, &box, 0);
   } else {
-    changed.init(NullBox, 0);
+    REGION_NULL(pScreen, &changed);
   }
 
 
@@ -610,8 +768,10 @@
 		   xMask, yMask, xDst, yDst, width, height);
   ps->Composite = vncHooksComposite;
 
-  if (REGION_NOTEMPTY(pScreen, changed.reg))
-    vncHooksScreen->desktop->add_changed(changed.reg);
+  if (REGION_NOTEMPTY(pScreen, &changed))
+    add_changed(pScreen, &changed);
+
+  REGION_UNINIT(pScreen, &changed);
 }
 
 static int
@@ -672,38 +832,38 @@
   vncHooksScreenPtr vncHooksScreen = vncHooksScreenPrivate(pScreen);
   PictureScreenPtr ps = GetPictureScreen(pScreen);
 
-  RegionHelper changed(pScreen);
+  RegionPtr changed;
 
   if (pDst->pDrawable->type == DRAWABLE_WINDOW &&
       ((WindowPtr) pDst->pDrawable)->viewable) {
-    rfb::Rect fbrect;
     BoxRec fbbox;
     RegionRec fbreg;
 
-    changed.reg = GlyphsToRegion(pScreen, nlists, lists, glyphs);
-    REGION_TRANSLATE(pScreen, changed.reg,
+    changed = GlyphsToRegion(pScreen, nlists, lists, glyphs);
+    REGION_TRANSLATE(pScreen, changed,
                      pDst->pDrawable->x, pDst->pDrawable->y);
 
-    fbrect = vncHooksScreen->desktop->getRect();
-    fbbox.x1 = fbrect.tl.x;
-    fbbox.y1 = fbrect.tl.y;
-    fbbox.x2 = fbrect.br.x;
-    fbbox.y2 = fbrect.br.y;
+    fbbox.x1 = 0;
+    fbbox.y1 = 0;
+    fbbox.x2 = pScreen->width;
+    fbbox.y2 = pScreen->height;
     REGION_INIT(pScreen, &fbreg, &fbbox, 0);
 
-    REGION_INTERSECT(pScreen, changed.reg, changed.reg, &fbreg);
+    REGION_INTERSECT(pScreen, changed, changed, &fbreg);
 
     REGION_UNINIT(pScreen, &fbreg);
   } else {
-    changed.init(NullBox, 0);
+    changed = REGION_CREATE(pScreen, NullBox, 0);
   }
 
   ps->Glyphs = vncHooksScreen->Glyphs;
   (*ps->Glyphs)(op, pSrc, pDst, maskFormat, xSrc, ySrc, nlists, lists, glyphs);
   ps->Glyphs = vncHooksGlyphs;
 
-  if (REGION_NOTEMPTY(pScreen, changed.reg))
-    vncHooksScreen->desktop->add_changed(changed.reg);
+  if (REGION_NOTEMPTY(pScreen, changed))
+    add_changed(pScreen, changed);
+
+  REGION_DESTROY(pScreen, changed);
 }
 
 #endif /* RENDER */
@@ -712,45 +872,6 @@
 
 #ifdef RANDR
 
-static void vncPreScreenResize(ScreenPtr pScreen)
-{
-  vncHooksScreenPtr vncHooksScreen = vncHooksScreenPrivate(pScreen);
-
-  // We need to prevent the RFB core from accessing the framebuffer
-  // for a while as there might be updates thrown our way inside
-  // the routines that change the screen (i.e. before we have a
-  // pointer to the new framebuffer).
-  vncHooksScreen->desktop->blockUpdates();
-}
-
-static void vncPostScreenResize(ScreenPtr pScreen, Bool success)
-{
-  vncHooksScreenPtr vncHooksScreen = vncHooksScreenPrivate(pScreen);
-
-  RegionRec reg;
-  BoxRec box;
-
-  if (success) {
-    // Let the RFB core know of the new dimensions and framebuffer
-    vncHooksScreen->desktop->setFramebuffer(pScreen->width, pScreen->height,
-                                            vncFbptr[pScreen->myNum],
-                                            vncFbstride[pScreen->myNum]);
-  }
-
-  vncHooksScreen->desktop->unblockUpdates();
-
-  if (success) {
-    // Mark entire screen as changed
-    box.x1 = 0;
-    box.y1 = 0;
-    box.x2 = pScreen->width;
-    box.y2 = pScreen->height;
-    REGION_INIT(pScreen, &reg, &box, 1);
-
-    vncHooksScreen->desktop->add_changed(&reg);
-  }
-}
-
 static Bool vncHooksRandRSetConfig(ScreenPtr pScreen, Rotation rotation,
                                    int rate, RRScreenSizePtr pSize)
 {
@@ -758,13 +879,13 @@
   rrScrPrivPtr rp = rrGetScrPriv(pScreen);
   Bool ret;
 
-  vncPreScreenResize(pScreen);
+  vncPreScreenResize(pScreen->myNum);
 
   rp->rrSetConfig = vncHooksScreen->RandRSetConfig;
   ret = (*rp->rrSetConfig)(pScreen, rotation, rate, pSize);
   rp->rrSetConfig = vncHooksRandRSetConfig;
 
-  vncPostScreenResize(pScreen, ret);
+  vncPostScreenResize(pScreen->myNum, ret, pScreen->width, pScreen->height);
 
   if (!ret)
     return FALSE;
@@ -780,13 +901,13 @@
   rrScrPrivPtr rp = rrGetScrPriv(pScreen);
   Bool ret;
 
-  vncPreScreenResize(pScreen);
+  vncPreScreenResize(pScreen->myNum);
 
   rp->rrScreenSetSize = vncHooksScreen->RandRScreenSetSize;
   ret = (*rp->rrScreenSetSize)(pScreen, width, height, mmWidth, mmHeight);
   rp->rrScreenSetSize = vncHooksRandRScreenSetSize;
 
-  vncPostScreenResize(pScreen, ret);
+  vncPostScreenResize(pScreen->myNum, ret, pScreen->width, pScreen->height);
 
   if (!ret)
     return FALSE;
@@ -811,7 +932,7 @@
   if (!ret)
     return FALSE;
 
-  vncHooksScreen->desktop->refreshScreenLayout();
+  vncRefreshScreenLayout(pScreen->myNum);
 
   return TRUE;
 }
@@ -823,76 +944,73 @@
 // GC "funcs"
 //
 
-// GCFuncUnwrapper is a helper class which unwraps the GC funcs and ops in its
-// constructor and rewraps them in its destructor.
+// Unwrap and rewrap helpers
 
-class GCFuncUnwrapper {
-public:
-  GCFuncUnwrapper(GCPtr pGC_) : pGC(pGC_) {
-    vncHooksGC = vncHooksGCPrivate(pGC);
-    pGC->funcs = vncHooksGC->wrappedFuncs;
-    if (vncHooksGC->wrappedOps)
-      pGC->ops = vncHooksGC->wrappedOps;
-  }
-  ~GCFuncUnwrapper() {
-    vncHooksGC->wrappedFuncs = pGC->funcs;
-    pGC->funcs = &vncHooksGCFuncs;
-    if (vncHooksGC->wrappedOps) {
-      vncHooksGC->wrappedOps = pGC->ops;
-      pGC->ops = &vncHooksGCOps;
+#define GC_FUNC_PROLOGUE(pGC, name)\
+    vncHooksGCPtr pGCPriv = vncHooksGCPrivate(pGC);\
+    (pGC)->funcs = pGCPriv->wrappedFuncs;\
+    if(pGCPriv->wrappedOps)\
+        (pGC)->ops = pGCPriv->wrappedOps; \
+    DBGPRINT((stderr,"vncHooks" #name " called\n"))
+
+#define GC_FUNC_EPILOGUE(pGC)\
+    pGCPriv->wrappedFuncs = (pGC)->funcs;\
+    (pGC)->funcs = &vncHooksGCFuncs;\
+    if(pGCPriv->wrappedOps) {\
+        pGCPriv->wrappedOps = (pGC)->ops;\
+        (pGC)->ops = &vncHooksGCOps;\
     }
-  }
-  GCPtr pGC;
-  vncHooksGCPtr vncHooksGC;
-};
-
 
 // ValidateGC - wrap the "ops" if a viewable window OR the screen pixmap
 
 static void vncHooksValidateGC(GCPtr pGC, unsigned long changes,
                                DrawablePtr pDrawable)
 {
-  GCFuncUnwrapper u(pGC);
-
-  DBGPRINT((stderr,"vncHooksValidateGC called\n"));
-
+  GC_FUNC_PROLOGUE(pGC, ValidateGC);
   (*pGC->funcs->ValidateGC) (pGC, changes, pDrawable);
-
-  u.vncHooksGC->wrappedOps = 0;
   if ((pDrawable->type == DRAWABLE_WINDOW &&
        ((WindowPtr) pDrawable)->viewable) ||
       (pDrawable == &pGC->pScreen->GetScreenPixmap(pGC->pScreen)->drawable)) {
-    u.vncHooksGC->wrappedOps = pGC->ops;
+    pGCPriv->wrappedOps = pGC->ops;
     DBGPRINT((stderr,"vncHooksValidateGC: wrapped GC ops\n"));
-  }    
+  } else {
+    pGCPriv->wrappedOps = NULL;
+  }
+  GC_FUNC_EPILOGUE(pGC);
 }
 
 // Other GC funcs - just unwrap and call on
 
 static void vncHooksChangeGC(GCPtr pGC, unsigned long mask) {
-  GCFuncUnwrapper u(pGC);
+  GC_FUNC_PROLOGUE(pGC, ChangeGC);
   (*pGC->funcs->ChangeGC) (pGC, mask);
+  GC_FUNC_EPILOGUE(pGC);
 }
 static void vncHooksCopyGC(GCPtr src, unsigned long mask, GCPtr dst) {
-  GCFuncUnwrapper u(dst);
+  GC_FUNC_PROLOGUE(dst, CopyGC);
   (*dst->funcs->CopyGC) (src, mask, dst);
+  GC_FUNC_EPILOGUE(dst);
 }
 static void vncHooksDestroyGC(GCPtr pGC) {
-  GCFuncUnwrapper u(pGC);
+  GC_FUNC_PROLOGUE(pGC, DestroyGC);
   (*pGC->funcs->DestroyGC) (pGC);
+  GC_FUNC_EPILOGUE(pGC);
 }
 static void vncHooksChangeClip(GCPtr pGC, int type, void * pValue, int nrects)
 {
-  GCFuncUnwrapper u(pGC);
+  GC_FUNC_PROLOGUE(pGC, ChangeClip);
   (*pGC->funcs->ChangeClip) (pGC, type, pValue, nrects);
+  GC_FUNC_EPILOGUE(pGC);
 }
 static void vncHooksDestroyClip(GCPtr pGC) {
-  GCFuncUnwrapper u(pGC);
+  GC_FUNC_PROLOGUE(pGC, DestroyClip);
   (*pGC->funcs->DestroyClip) (pGC);
+  GC_FUNC_EPILOGUE(pGC);
 }
 static void vncHooksCopyClip(GCPtr dst, GCPtr src) {
-  GCFuncUnwrapper u(dst);
+  GC_FUNC_PROLOGUE(dst, CopyClip);
   (*dst->funcs->CopyClip) (dst, src);
+  GC_FUNC_EPILOGUE(dst);
 }
 
 
@@ -901,40 +1019,19 @@
 // GC "ops"
 //
 
-// GCOpUnwrapper is a helper class which unwraps the GC funcs and ops in its
-// constructor and rewraps them in its destructor.
+// Unwrap and rewrap helpers
 
-class GCOpUnwrapper {
-public:
-  GCOpUnwrapper(DrawablePtr pDrawable, GCPtr pGC_)
-    : pGC(pGC_), pScreen(pDrawable->pScreen)
-  {
-    vncHooksGC = vncHooksGCPrivate(pGC);
-    oldFuncs = pGC->funcs;
-    pGC->funcs = vncHooksGC->wrappedFuncs;
-    pGC->ops = vncHooksGC->wrappedOps;
-  }
-  ~GCOpUnwrapper() {
-    vncHooksGC->wrappedOps = pGC->ops;
-    pGC->funcs = oldFuncs;
-    pGC->ops = &vncHooksGCOps;
-  }
-  GCPtr pGC;
-  vncHooksGCPtr vncHooksGC;
-#if XORG >= 116
-  const GCFuncs* oldFuncs;
-#else
-  GCFuncs* oldFuncs;
-#endif
-  ScreenPtr pScreen;
-};
+#define GC_OP_PROLOGUE(pGC, name)\
+    vncHooksGCPtr pGCPriv = vncHooksGCPrivate(pGC);\
+    GCFuncs *oldFuncs = pGC->funcs;\
+    pGC->funcs = pGCPriv->wrappedFuncs;\
+    pGC->ops = pGCPriv->wrappedOps; \
+    DBGPRINT((stderr,"vncHooks" #name " called\n"))
 
-#define GC_OP_UNWRAPPER(pDrawable, pGC, name)                             \
-  GCOpUnwrapper u(pDrawable, pGC);                                        \
-  ScreenPtr pScreen = (pDrawable)->pScreen;                               \
-  vncHooksScreenPtr vncHooksScreen = vncHooksScreenPrivate(pScreen);      \
-  DBGPRINT((stderr,"vncHooks" #name " called\n"));
-
+#define GC_OP_EPILOGUE(pGC)\
+    pGCPriv->wrappedOps = pGC->ops;\
+    pGC->funcs = oldFuncs;\
+    pGC->ops   = &vncHooksGCOps
 
 // FillSpans - assume the entire clip region is damaged. This is pessimistic,
 // but I believe this function is rarely used so it doesn't matter.
@@ -943,17 +1040,23 @@
                               DDXPointPtr pptInit, int *pwidthInit,
                               int fSorted)
 {
-  GC_OP_UNWRAPPER(pDrawable, pGC, FillSpans);
+  RegionRec reg;
 
-  RegionHelper changed(pScreen, pGC->pCompositeClip);
+  GC_OP_PROLOGUE(pGC, FillSpans);
+
+  REGION_NULL(pGC->pScreen, &reg);
+  REGION_COPY(pGC->pScreen, &reg, pGC->pCompositeClip);
 
   if (pDrawable->type == DRAWABLE_WINDOW)
-    REGION_INTERSECT(pScreen, changed.reg, changed.reg,
-                     &((WindowPtr)pDrawable)->borderClip);
+    REGION_INTERSECT(pScreen, &reg, &reg, &((WindowPtr)pDrawable)->borderClip);
 
   (*pGC->ops->FillSpans) (pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  add_changed(pGC->pScreen, &reg);
+
+  REGION_UNINIT(pGC->pScreen, &reg);
+
+  GC_OP_EPILOGUE(pGC);
 }
 
 // SetSpans - assume the entire clip region is damaged.  This is pessimistic,
@@ -963,17 +1066,23 @@
                              DDXPointPtr ppt, int *pwidth, int nspans,
                              int fSorted)
 {
-  GC_OP_UNWRAPPER(pDrawable, pGC, SetSpans);
+  RegionRec reg;
 
-  RegionHelper changed(pScreen, pGC->pCompositeClip);
+  GC_OP_PROLOGUE(pGC, SetSpans);
+
+  REGION_NULL(pGC->pScreen, &reg);
+  REGION_COPY(pGC->pScreen, &reg, pGC->pCompositeClip);
 
   if (pDrawable->type == DRAWABLE_WINDOW)
-    REGION_INTERSECT(pScreen, changed.reg, changed.reg,
-                     &((WindowPtr)pDrawable)->borderClip);
+    REGION_INTERSECT(pScreen, &reg, &reg, &((WindowPtr)pDrawable)->borderClip);
 
   (*pGC->ops->SetSpans) (pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  add_changed(pGC->pScreen, &reg);
+
+  REGION_UNINIT(pGC->pScreen, &reg);
+
+  GC_OP_EPILOGUE(pGC);
 }
 
 // PutImage - changed region is the given rectangle, clipped by pCompositeClip
@@ -982,22 +1091,27 @@
                              int x, int y, int w, int h, int leftPad,
                              int format, char *pBits)
 {
-  GC_OP_UNWRAPPER(pDrawable, pGC, PutImage);
-
   BoxRec box;
+  RegionRec reg;
+
+  GC_OP_PROLOGUE(pGC, PutImage);
+
   box.x1 = x + pDrawable->x;
   box.y1 = y + pDrawable->y;
   box.x2 = box.x1 + w;
   box.y2 = box.y1 + h;
 
-  RegionHelper changed(pScreen, &box, 0);
-
-  REGION_INTERSECT(pScreen, changed.reg, changed.reg, pGC->pCompositeClip);
+  REGION_INIT(pGC->pScreen, &reg, &box, 0);
+  REGION_INTERSECT(pGC->pScreen, &reg, &reg, pGC->pCompositeClip);
 
   (*pGC->ops->PutImage) (pDrawable, pGC, depth, x, y, w, h, leftPad, format,
                          pBits);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  add_changed(pGC->pScreen, &reg);
+
+  REGION_UNINIT(pGC->pScreen, &reg);
+
+  GC_OP_EPILOGUE(pGC);
 }
 
 // CopyArea - destination of the copy is the dest rectangle, clipped by
@@ -1008,59 +1122,67 @@
                                   GCPtr pGC, int srcx, int srcy, int w, int h,
                                   int dstx, int dsty)
 {
-  GC_OP_UNWRAPPER(pDst, pGC, CopyArea);
-
   BoxRec box;
+  RegionRec dst, src, changed;
+
+  RegionPtr ret;
+
+  GC_OP_PROLOGUE(pGC, CopyArea);
+
   box.x1 = dstx + pDst->x;
   box.y1 = dsty + pDst->y;
   box.x2 = box.x1 + w;
   box.y2 = box.y1 + h;
 
-  RegionHelper dst(pScreen, &box, 0);
-  REGION_INTERSECT(pScreen, dst.reg, dst.reg, pGC->pCompositeClip);
-
-  RegionHelper src(pScreen);
+  REGION_INIT(pGC->pScreen, &dst, &box, 0);
+  REGION_INTERSECT(pGC->pScreen, &dst, &dst, pGC->pCompositeClip);
 
   // The source of the data has to be something that's on screen.
   // This means either a window, or the screen pixmap.
-  if ((pSrc->pScreen == pScreen) &&
+  if ((pSrc->pScreen == pGC->pScreen) &&
       ((pSrc->type == DRAWABLE_WINDOW) ||
-       (pSrc == &pScreen->GetScreenPixmap(pScreen)->drawable))) {
+       (pSrc == &pGC->pScreen->GetScreenPixmap(pGC->pScreen)->drawable))) {
     box.x1 = srcx + pSrc->x;
     box.y1 = srcy + pSrc->y;
     box.x2 = box.x1 + w;
     box.y2 = box.y1 + h;
 
-    src.init(&box, 0);
+    REGION_INIT(pGC->pScreen, &src, &box, 0);
 
     if ((pSrc->type == DRAWABLE_WINDOW) &&
         REGION_NOTEMPTY(pScreen, &((WindowPtr)pSrc)->clipList)) {
-      REGION_INTERSECT(pScreen, src.reg, src.reg, &((WindowPtr)pSrc)->clipList);
+      REGION_INTERSECT(pScreen, &src, &src, &((WindowPtr)pSrc)->clipList);
     }
 
-    REGION_TRANSLATE(pScreen, src.reg,
+    REGION_TRANSLATE(pScreen, &src,
                      dstx + pDst->x - srcx - pSrc->x,
                      dsty + pDst->y - srcy - pSrc->y);
   } else {
-    src.init(NullBox, 0);
+    REGION_NULL(pGC->pScreen, &src);
   }
 
-  RegionHelper changed(pScreen, NullBox, 0);
-  REGION_SUBTRACT(pScreen, changed.reg, dst.reg, src.reg);
-  REGION_INTERSECT(pScreen, dst.reg, dst.reg, src.reg);
+  REGION_NULL(pGC->pScreen, &changed);
 
-  RegionPtr rgn = (*pGC->ops->CopyArea) (pSrc, pDst, pGC, srcx, srcy, w, h,
-                                         dstx, dsty);
+  REGION_SUBTRACT(pScreen, &changed, &dst, &src);
+  REGION_INTERSECT(pScreen, &dst, &dst, &src);
 
-  if (REGION_NOTEMPTY(pScreen, dst.reg))
-    vncHooksScreen->desktop->add_copied(dst.reg,
-                                        dstx + pDst->x - srcx - pSrc->x,
-                                        dsty + pDst->y - srcy - pSrc->y);
+  ret = (*pGC->ops->CopyArea) (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty);
 
-  if (REGION_NOTEMPTY(pScreen, changed.reg))
-    vncHooksScreen->desktop->add_changed(changed.reg);
+  if (REGION_NOTEMPTY(pScreen, &dst))
+    add_copied(pGC->pScreen, &dst,
+               dstx + pDst->x - srcx - pSrc->x,
+               dsty + pDst->y - srcy - pSrc->y);
 
-  return rgn;
+  if (REGION_NOTEMPTY(pScreen, &changed))
+    add_changed(pGC->pScreen, &changed);
+
+  REGION_UNINIT(pGC->pScreen, &dst);
+  REGION_UNINIT(pGC->pScreen, &src);
+  REGION_UNINIT(pGC->pScreen, &changed);
+
+  GC_OP_EPILOGUE(pGC);
+
+  return ret;
 }
 
 
@@ -1071,23 +1193,31 @@
                                    GCPtr pGC, int srcx, int srcy, int w, int h,
                                    int dstx, int dsty, unsigned long plane)
 {
-  GC_OP_UNWRAPPER(pDst, pGC, CopyPlane);
-
   BoxRec box;
+  RegionRec reg;
+
+  RegionPtr ret;
+
+  GC_OP_PROLOGUE(pGC, CopyPlane);
+
   box.x1 = dstx + pDst->x;
   box.y1 = dsty + pDst->y;
   box.x2 = box.x1 + w;
   box.y2 = box.y1 + h;
 
-  RegionHelper changed(pScreen, &box, 0);
+  REGION_INIT(pGC->pScreen, &reg, &box, 0);
+  REGION_INTERSECT(pGC->pScreen, &reg, &reg, pGC->pCompositeClip);
 
-  REGION_INTERSECT(pScreen, changed.reg, changed.reg, pGC->pCompositeClip);
+  ret = (*pGC->ops->CopyPlane) (pSrc, pDst, pGC, srcx, srcy, w, h,
+                                dstx, dsty, plane);
 
-  RegionPtr rgn = (*pGC->ops->CopyPlane) (pSrc, pDst, pGC, srcx, srcy, w, h,
-                                          dstx, dsty, plane);
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  add_changed(pGC->pScreen, &reg);
 
-  return rgn;
+  REGION_UNINIT(pGC->pScreen, &reg);
+
+  GC_OP_EPILOGUE(pGC);
+
+  return ret;
 }
 
 // PolyPoint - changed region is the bounding rect, clipped by pCompositeClip
@@ -1095,23 +1225,29 @@
 static void vncHooksPolyPoint(DrawablePtr pDrawable, GCPtr pGC, int mode,
                               int npt, xPoint *pts)
 {
-  GC_OP_UNWRAPPER(pDrawable, pGC, PolyPoint);
+  int minX, minY, maxX, maxY;
+  int i;
+
+  BoxRec box;
+  RegionRec reg;
+
+  GC_OP_PROLOGUE(pGC, PolyPoint);
 
   if (npt == 0) {
     (*pGC->ops->PolyPoint) (pDrawable, pGC, mode, npt, pts);
-    return;
+    goto out;
   }
 
-  int minX = pts[0].x;
-  int maxX = pts[0].x;
-  int minY = pts[0].y;
-  int maxY = pts[0].y;
+  minX = pts[0].x;
+  maxX = pts[0].x;
+  minY = pts[0].y;
+  maxY = pts[0].y;
 
   if (mode == CoordModePrevious) {
     int x = pts[0].x;
     int y = pts[0].y;
 
-    for (int i = 1; i < npt; i++) {
+    for (i = 1; i < npt; i++) {
       x += pts[i].x;
       y += pts[i].y;
       if (x < minX) minX = x;
@@ -1120,7 +1256,7 @@
       if (y > maxY) maxY = y;
     }
   } else {
-    for (int i = 1; i < npt; i++) {
+    for (i = 1; i < npt; i++) {
       if (pts[i].x < minX) minX = pts[i].x;
       if (pts[i].x > maxX) maxX = pts[i].x;
       if (pts[i].y < minY) minY = pts[i].y;
@@ -1128,19 +1264,22 @@
     }
   }
 
-  BoxRec box;
   box.x1 = minX + pDrawable->x;
   box.y1 = minY + pDrawable->y;
   box.x2 = maxX + 1 + pDrawable->x;
   box.y2 = maxY + 1 + pDrawable->y;
 
-  RegionHelper changed(pScreen, &box, 0);
-
-  REGION_INTERSECT(pScreen, changed.reg, changed.reg, pGC->pCompositeClip);
+  REGION_INIT(pGC->pScreen, &reg, &box, 0);
+  REGION_INTERSECT(pGC->pScreen, &reg, &reg, pGC->pCompositeClip);
 
   (*pGC->ops->PolyPoint) (pDrawable, pGC, mode, npt, pts);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  add_changed(pGC->pScreen, &reg);
+
+  REGION_UNINIT(pGC->pScreen, &reg);
+
+out:
+  GC_OP_EPILOGUE(pGC);
 }
 
 // Polylines - changed region is the union of the bounding rects of each line,
@@ -1150,18 +1289,25 @@
 static void vncHooksPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode,
                               int npt, DDXPointPtr ppts)
 {
-  GC_OP_UNWRAPPER(pDrawable, pGC, Polylines);
+  int nRegRects;
+  xRectangle regRects[MAX_RECTS_PER_OP];
+
+  int lw;
+
+  RegionPtr reg;
+
+  GC_OP_PROLOGUE(pGC, Polylines);
 
   if (npt == 0) {
     (*pGC->ops->Polylines) (pDrawable, pGC, mode, npt, ppts);
-    return;
+    goto out;
   }
 
-  int nRegRects = npt - 1;
-  xRectangle regRects[MAX_RECTS_PER_OP];
+  nRegRects = npt - 1;
 
-  int lw = pGC->lineWidth;
-  if (lw == 0) lw = 1;
+  lw = pGC->lineWidth;
+  if (lw == 0)
+    lw = 1;
 
   if (npt == 1)
   {
@@ -1181,21 +1327,25 @@
      * and converted to int yields 6 * lw
      */
 
-    int extra = lw / 2;
-    if (pGC->joinStyle == JoinMiter) {
-      extra = 6 * lw;
-    }
+    int extra;
 
     int prevX, prevY, curX, curY;
     int rectX1, rectY1, rectX2, rectY2;
     int minX, minY, maxX, maxY;
 
+    int i;
+
+    extra = lw / 2;
+    if (pGC->joinStyle == JoinMiter) {
+      extra = 6 * lw;
+    }
+
     prevX = ppts[0].x + pDrawable->x;
     prevY = ppts[0].y + pDrawable->y;
     minX = maxX = prevX;
     minY = maxY = prevY;
 
-    for (int i = 0; i < nRegRects; i++) {
+    for (i = 0; i < nRegRects; i++) {
       if (mode == CoordModeOrigin) {
         curX = pDrawable->x + ppts[i+1].x;
         curY = pDrawable->y + ppts[i+1].y;
@@ -1245,13 +1395,17 @@
     }
   }
 
-  RegionHelper changed(pScreen, nRegRects, regRects);
-
-  REGION_INTERSECT(pScreen, changed.reg, changed.reg, pGC->pCompositeClip);
+  reg = RECTS_TO_REGION(pGC->pScreen, nRegRects, regRects, CT_NONE);
+  REGION_INTERSECT(pGC->pScreen, reg, reg, pGC->pCompositeClip);
 
   (*pGC->ops->Polylines) (pDrawable, pGC, mode, npt, ppts);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  add_changed(pGC->pScreen, reg);
+
+  REGION_DESTROY(pGC->pScreen, reg);
+
+out:
+  GC_OP_EPILOGUE(pGC);
 }
 
 // PolySegment - changed region is the union of the bounding rects of each
@@ -1261,26 +1415,34 @@
 static void vncHooksPolySegment(DrawablePtr pDrawable, GCPtr pGC, int nseg,
                                 xSegment *segs)
 {
-  GC_OP_UNWRAPPER(pDrawable, pGC, PolySegment);
-
-  if (nseg == 0) {
-    (*pGC->ops->PolySegment) (pDrawable, pGC, nseg, segs);
-    return;
-  }
-
   xRectangle regRects[MAX_RECTS_PER_OP];
-  int nRegRects = nseg;
+  int nRegRects;
 
-  int lw = pGC->lineWidth;
-  int extra = lw / 2;
+  int lw, extra;
 
   int rectX1, rectY1, rectX2, rectY2;
   int minX, minY, maxX, maxY;
 
+  int i;
+
+  RegionPtr reg;
+
+  GC_OP_PROLOGUE(pGC, PolySegment);
+
+  if (nseg == 0) {
+    (*pGC->ops->PolySegment) (pDrawable, pGC, nseg, segs);
+    goto out;
+  }
+
+  nRegRects = nseg;
+
+  lw = pGC->lineWidth;
+  extra = lw / 2;
+
   minX = maxX = segs[0].x1;
   minY = maxY = segs[0].y1;
 
-  for (int i = 0; i < nseg; i++) {
+  for (i = 0; i < nseg; i++) {
     if (segs[i].x1 > segs[i].x2) {
       rectX1 = pDrawable->x + segs[i].x2 - extra;
       rectX2 = pDrawable->x + segs[i].x1 + extra + 1;
@@ -1318,13 +1480,17 @@
     nRegRects = 1;
   }
 
-  RegionHelper changed(pScreen, nRegRects, regRects);
-
-  REGION_INTERSECT(pScreen, changed.reg, changed.reg, pGC->pCompositeClip);
+  reg = RECTS_TO_REGION(pGC->pScreen, nRegRects, regRects, CT_NONE);
+  REGION_INTERSECT(pGC->pScreen, reg, reg, pGC->pCompositeClip);
 
   (*pGC->ops->PolySegment) (pDrawable, pGC, nseg, segs);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  add_changed(pGC->pScreen, reg);
+
+  REGION_DESTROY(pGC->pScreen, reg);
+
+out:
+  GC_OP_EPILOGUE(pGC);
 }
 
 // PolyRectangle - changed region is the union of the bounding rects around
@@ -1335,26 +1501,34 @@
 static void vncHooksPolyRectangle(DrawablePtr pDrawable, GCPtr pGC, int nrects,
                                   xRectangle *rects)
 {
-  GC_OP_UNWRAPPER(pDrawable, pGC, PolyRectangle);
-
-  if (nrects == 0) {
-    (*pGC->ops->PolyRectangle) (pDrawable, pGC, nrects, rects);
-    return;
-  }
-
   xRectangle regRects[MAX_RECTS_PER_OP*4];
-  int nRegRects = nrects * 4;
+  int nRegRects;
 
-  int lw = pGC->lineWidth;
-  int extra = lw / 2;
+  int lw, extra;
 
   int rectX1, rectY1, rectX2, rectY2;
   int minX, minY, maxX, maxY;
 
+  int i;
+
+  RegionPtr reg;
+
+  GC_OP_PROLOGUE(pGC, PolyRectangle);
+
+  if (nrects == 0) {
+    (*pGC->ops->PolyRectangle) (pDrawable, pGC, nrects, rects);
+    goto out;
+  }
+
+  nRegRects = nrects * 4;
+
+  lw = pGC->lineWidth;
+  extra = lw / 2;
+
   minX = maxX = rects[0].x;
   minY = maxY = rects[0].y;
 
-  for (int i = 0; i < nrects; i++) {
+  for (i = 0; i < nrects; i++) {
     if (nrects <= MAX_RECTS_PER_OP) {
       regRects[i*4].x = rects[i].x - extra + pDrawable->x;
       regRects[i*4].y = rects[i].y - extra + pDrawable->y;
@@ -1395,13 +1569,17 @@
     nRegRects = 1;
   }
 
-  RegionHelper changed(pScreen, nRegRects, regRects);
-
-  REGION_INTERSECT(pScreen, changed.reg, changed.reg, pGC->pCompositeClip);
+  reg = RECTS_TO_REGION(pGC->pScreen, nRegRects, regRects, CT_NONE);
+  REGION_INTERSECT(pGC->pScreen, reg, reg, pGC->pCompositeClip);
 
   (*pGC->ops->PolyRectangle) (pDrawable, pGC, nrects, rects);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  add_changed(pGC->pScreen, reg);
+
+  REGION_DESTROY(pGC->pScreen, reg);
+
+out:
+  GC_OP_EPILOGUE(pGC);
 }
 
 // PolyArc - changed region is the union of bounding rects around each arc,
@@ -1411,27 +1589,36 @@
 static void vncHooksPolyArc(DrawablePtr pDrawable, GCPtr pGC, int narcs,
                             xArc *arcs)
 {
-  GC_OP_UNWRAPPER(pDrawable, pGC, PolyArc);
-
-  if (narcs == 0) {
-    (*pGC->ops->PolyArc) (pDrawable, pGC, narcs, arcs);
-    return;
-  }
-
   xRectangle regRects[MAX_RECTS_PER_OP];
-  int nRegRects = narcs;
+  int nRegRects;
 
-  int lw = pGC->lineWidth;
-  if (lw == 0) lw = 1;
-  int extra = lw / 2;
+  int lw, extra;
 
   int rectX1, rectY1, rectX2, rectY2;
   int minX, minY, maxX, maxY;
 
+  int i;
+
+  RegionPtr reg;
+
+  GC_OP_PROLOGUE(pGC, PolyArc);
+
+  if (narcs == 0) {
+    (*pGC->ops->PolyArc) (pDrawable, pGC, narcs, arcs);
+    goto out;
+  }
+
+  nRegRects = narcs;
+
+  lw = pGC->lineWidth;
+  if (lw == 0)
+    lw = 1;
+  extra = lw / 2;
+
   minX = maxX = arcs[0].x;
   minY = maxY = arcs[0].y;
 
-  for (int i = 0; i < narcs; i++) {
+  for (i = 0; i < narcs; i++) {
     if (narcs <= MAX_RECTS_PER_OP) {
       regRects[i].x = arcs[i].x - extra + pDrawable->x;
       regRects[i].y = arcs[i].y - extra + pDrawable->y;
@@ -1457,13 +1644,17 @@
     nRegRects = 1;
   }
 
-  RegionHelper changed(pScreen, nRegRects, regRects);
-
-  REGION_INTERSECT(pScreen, changed.reg, changed.reg, pGC->pCompositeClip);
+  reg = RECTS_TO_REGION(pGC->pScreen, nRegRects, regRects, CT_NONE);
+  REGION_INTERSECT(pGC->pScreen, reg, reg, pGC->pCompositeClip);
 
   (*pGC->ops->PolyArc) (pDrawable, pGC, narcs, arcs);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  add_changed(pGC->pScreen, reg);
+
+  REGION_DESTROY(pGC->pScreen, reg);
+
+out:
+  GC_OP_EPILOGUE(pGC);
 }
 
 
@@ -1473,23 +1664,29 @@
 static void vncHooksFillPolygon(DrawablePtr pDrawable, GCPtr pGC, int shape,
                                 int mode, int count, DDXPointPtr pts)
 {
-  GC_OP_UNWRAPPER(pDrawable, pGC, FillPolygon);
+  int minX, minY, maxX, maxY;
+  int i;
+
+  BoxRec box;
+  RegionRec reg;
+
+  GC_OP_PROLOGUE(pGC, FillPolygon);
 
   if (count == 0) {
     (*pGC->ops->FillPolygon) (pDrawable, pGC, shape, mode, count, pts);
-    return;
+    goto out;
   }
 
-  int minX = pts[0].x;
-  int maxX = pts[0].x;
-  int minY = pts[0].y;
-  int maxY = pts[0].y;
+  minX = pts[0].x;
+  maxX = pts[0].x;
+  minY = pts[0].y;
+  maxY = pts[0].y;
 
   if (mode == CoordModePrevious) {
     int x = pts[0].x;
     int y = pts[0].y;
 
-    for (int i = 1; i < count; i++) {
+    for (i = 1; i < count; i++) {
       x += pts[i].x;
       y += pts[i].y;
       if (x < minX) minX = x;
@@ -1498,7 +1695,7 @@
       if (y > maxY) maxY = y;
     }
   } else {
-    for (int i = 1; i < count; i++) {
+    for (i = 1; i < count; i++) {
       if (pts[i].x < minX) minX = pts[i].x;
       if (pts[i].x > maxX) maxX = pts[i].x;
       if (pts[i].y < minY) minY = pts[i].y;
@@ -1506,19 +1703,22 @@
     }
   }
 
-  BoxRec box;
   box.x1 = minX + pDrawable->x;
   box.y1 = minY + pDrawable->y;
   box.x2 = maxX + 1 + pDrawable->x;
   box.y2 = maxY + 1 + pDrawable->y;
 
-  RegionHelper changed(pScreen, &box, 0);
-
-  REGION_INTERSECT(pScreen, changed.reg, changed.reg, pGC->pCompositeClip);
+  REGION_INIT(pGC->pScreen, &reg, &box, 0);
+  REGION_INTERSECT(pGC->pScreen, &reg, &reg, pGC->pCompositeClip);
 
   (*pGC->ops->FillPolygon) (pDrawable, pGC, shape, mode, count, pts);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  add_changed(pGC->pScreen, &reg);
+
+  REGION_UNINIT(pGC->pScreen, &reg);
+
+out:
+  GC_OP_EPILOGUE(pGC);
 }
 
 // PolyFillRect - changed region is the union of the rectangles, clipped by
@@ -1528,21 +1728,26 @@
 static void vncHooksPolyFillRect(DrawablePtr pDrawable, GCPtr pGC, int nrects,
                                  xRectangle *rects)
 {
-  GC_OP_UNWRAPPER(pDrawable, pGC, PolyFillRect);
+  xRectangle regRects[MAX_RECTS_PER_OP];
+  int nRegRects;
+  int rectX1, rectY1, rectX2, rectY2;
+  int minX, minY, maxX, maxY;
+  int i;
+
+  RegionPtr reg;
+
+  GC_OP_PROLOGUE(pGC, PolyFillRect);
 
   if (nrects == 0) {
     (*pGC->ops->PolyFillRect) (pDrawable, pGC, nrects, rects);
-    return;
+    goto out;
   }
 
-  xRectangle regRects[MAX_RECTS_PER_OP];
-  int nRegRects = nrects;
-  int rectX1, rectY1, rectX2, rectY2;
-  int minX, minY, maxX, maxY;
+  nRegRects = nrects;
   minX = maxX = rects[0].x;
   minY = maxY = rects[0].y;
 
-  for (int i = 0; i < nrects; i++) {
+  for (i = 0; i < nrects; i++) {
     if (nrects <= MAX_RECTS_PER_OP) {
       regRects[i].x = rects[i].x + pDrawable->x;
       regRects[i].y = rects[i].y + pDrawable->y;
@@ -1568,13 +1773,17 @@
     nRegRects = 1;
   }
 
-  RegionHelper changed(pScreen, nRegRects, regRects);
-
-  REGION_INTERSECT(pScreen, changed.reg, changed.reg, pGC->pCompositeClip);
+  reg = RECTS_TO_REGION(pGC->pScreen, nRegRects, regRects, CT_NONE);
+  REGION_INTERSECT(pGC->pScreen, reg, reg, pGC->pCompositeClip);
 
   (*pGC->ops->PolyFillRect) (pDrawable, pGC, nrects, rects);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  add_changed(pGC->pScreen, reg);
+
+  REGION_DESTROY(pGC->pScreen, reg);
+
+out:
+  GC_OP_EPILOGUE(pGC);
 }
 
 // PolyFillArc - changed region is the union of bounding rects around each arc,
@@ -1584,27 +1793,36 @@
 static void vncHooksPolyFillArc(DrawablePtr pDrawable, GCPtr pGC, int narcs,
                                 xArc *arcs)
 {
-  GC_OP_UNWRAPPER(pDrawable, pGC, PolyFillArc);
-
-  if (narcs == 0) {
-    (*pGC->ops->PolyFillArc) (pDrawable, pGC, narcs, arcs);
-    return;
-  }
-
   xRectangle regRects[MAX_RECTS_PER_OP];
-  int nRegRects = narcs;
+  int nRegRects;
 
-  int lw = pGC->lineWidth;
-  if (lw == 0) lw = 1;
-  int extra = lw / 2;
+  int lw, extra;
 
   int rectX1, rectY1, rectX2, rectY2;
   int minX, minY, maxX, maxY;
 
+  int i;
+
+  RegionPtr reg;
+
+  GC_OP_PROLOGUE(pGC, PolyFillArc);
+
+  if (narcs == 0) {
+    (*pGC->ops->PolyFillArc) (pDrawable, pGC, narcs, arcs);
+    goto out;
+  }
+
+  nRegRects = narcs;
+
+  lw = pGC->lineWidth;
+  if (lw == 0)
+    lw = 1;
+  extra = lw / 2;
+
   minX = maxX = arcs[0].x;
   minY = maxY = arcs[0].y;
 
-  for (int i = 0; i < narcs; i++) {
+  for (i = 0; i < narcs; i++) {
     if (narcs <= MAX_RECTS_PER_OP) {
       regRects[i].x = arcs[i].x - extra + pDrawable->x;
       regRects[i].y = arcs[i].y - extra + pDrawable->y;
@@ -1630,13 +1848,17 @@
     nRegRects = 1;
   }
 
-  RegionHelper changed(pScreen, nRegRects, regRects);
-
-  REGION_INTERSECT(pScreen, changed.reg, changed.reg, pGC->pCompositeClip);
+  reg = RECTS_TO_REGION(pGC->pScreen, nRegRects, regRects, CT_NONE);
+  REGION_INTERSECT(pGC->pScreen, reg, reg, pGC->pCompositeClip);
 
   (*pGC->ops->PolyFillArc) (pDrawable, pGC, narcs, arcs);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  add_changed(pGC->pScreen, reg);
+
+  REGION_DESTROY(pGC->pScreen, reg);
+
+out:
+  GC_OP_EPILOGUE(pGC);
 }
 
 // GetTextBoundingRect - calculate a bounding rectangle around n chars of a
@@ -1645,10 +1867,10 @@
 static void GetTextBoundingRect(DrawablePtr pDrawable, FontPtr font, int x,
                                 int y, int nchars, BoxPtr box)
 {
-  int ascent = __rfbmax(FONTASCENT(font), FONTMAXBOUNDS(font, ascent));
-  int descent = __rfbmax(FONTDESCENT(font), FONTMAXBOUNDS(font, descent));
-  int charWidth = __rfbmax(FONTMAXBOUNDS(font,rightSideBearing),
-                           FONTMAXBOUNDS(font,characterWidth));
+  int ascent = max(FONTASCENT(font), FONTMAXBOUNDS(font, ascent));
+  int descent = max(FONTDESCENT(font), FONTMAXBOUNDS(font, descent));
+  int charWidth = max(FONTMAXBOUNDS(font,rightSideBearing),
+                      FONTMAXBOUNDS(font,characterWidth));
 
   box->x1 = pDrawable->x + x;
   box->y1 = pDrawable->y + y - ascent;
@@ -1665,21 +1887,30 @@
 static int vncHooksPolyText8(DrawablePtr pDrawable, GCPtr pGC, int x, int y,
                              int count, char *chars)
 {
-  GC_OP_UNWRAPPER(pDrawable, pGC, PolyText8);
-
-  if (count == 0)
-    return (*pGC->ops->PolyText8) (pDrawable, pGC, x, y, count, chars);
-
+  int ret;
   BoxRec box;
+  RegionRec reg;
+
+  GC_OP_PROLOGUE(pGC, PolyText8);
+
+  if (count == 0) {
+    ret = (*pGC->ops->PolyText8) (pDrawable, pGC, x, y, count, chars);
+    goto out;
+  }
+
   GetTextBoundingRect(pDrawable, pGC->font, x, y, count, &box);
 
-  RegionHelper changed(pScreen, &box, 0);
+  REGION_INIT(pGC->pScreen, &reg, &box, 0);
+  REGION_INTERSECT(pGC->pScreen, &reg, &reg, pGC->pCompositeClip);
 
-  REGION_INTERSECT(pScreen, changed.reg, changed.reg, pGC->pCompositeClip);
+  ret = (*pGC->ops->PolyText8) (pDrawable, pGC, x, y, count, chars);
 
-  int ret = (*pGC->ops->PolyText8) (pDrawable, pGC, x, y, count, chars);
+  add_changed(pGC->pScreen, &reg);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  REGION_UNINIT(pGC->pScreen, &reg);
+
+out:
+  GC_OP_EPILOGUE(pGC);
 
   return ret;
 }
@@ -1690,21 +1921,30 @@
 static int vncHooksPolyText16(DrawablePtr pDrawable, GCPtr pGC, int x, int y,
                               int count, unsigned short *chars)
 {
-  GC_OP_UNWRAPPER(pDrawable, pGC, PolyText16);
-
-  if (count == 0)
-    return (*pGC->ops->PolyText16) (pDrawable, pGC, x, y, count, chars);
-
+  int ret;
   BoxRec box;
+  RegionRec reg;
+
+  GC_OP_PROLOGUE(pGC, PolyText16);
+
+  if (count == 0) {
+    ret = (*pGC->ops->PolyText16) (pDrawable, pGC, x, y, count, chars);
+    goto out;
+  }
+
   GetTextBoundingRect(pDrawable, pGC->font, x, y, count, &box);
 
-  RegionHelper changed(pScreen, &box, 0);
+  REGION_INIT(pGC->pScreen, &reg, &box, 0);
+  REGION_INTERSECT(pGC->pScreen, &reg, &reg, pGC->pCompositeClip);
 
-  REGION_INTERSECT(pScreen, changed.reg, changed.reg, pGC->pCompositeClip);
+  ret = (*pGC->ops->PolyText16) (pDrawable, pGC, x, y, count, chars);
 
-  int ret = (*pGC->ops->PolyText16) (pDrawable, pGC, x, y, count, chars);
+  add_changed(pGC->pScreen, &reg);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  REGION_UNINIT(pGC->pScreen, &reg);
+
+out:
+  GC_OP_EPILOGUE(pGC);
 
   return ret;
 }
@@ -1715,23 +1955,29 @@
 static void vncHooksImageText8(DrawablePtr pDrawable, GCPtr pGC, int x, int y,
                                int count, char *chars)
 {
-  GC_OP_UNWRAPPER(pDrawable, pGC, ImageText8);
+  BoxRec box;
+  RegionRec reg;
+
+  GC_OP_PROLOGUE(pGC, ImageText8);
 
   if (count == 0) {
     (*pGC->ops->ImageText8) (pDrawable, pGC, x, y, count, chars);
-    return;
+    goto out;
   }
 
-  BoxRec box;
   GetTextBoundingRect(pDrawable, pGC->font, x, y, count, &box);
 
-  RegionHelper changed(pScreen, &box, 0);
-
-  REGION_INTERSECT(pScreen, changed.reg, changed.reg, pGC->pCompositeClip);
+  REGION_INIT(pGC->pScreen, &reg, &box, 0);
+  REGION_INTERSECT(pGC->pScreen, &reg, &reg, pGC->pCompositeClip);
 
   (*pGC->ops->ImageText8) (pDrawable, pGC, x, y, count, chars);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  add_changed(pGC->pScreen, &reg);
+
+  REGION_UNINIT(pGC->pScreen, &reg);
+
+out:
+  GC_OP_EPILOGUE(pGC);
 }
 
 // ImageText16 - changed region is bounding rect around count chars, clipped by
@@ -1740,23 +1986,29 @@
 static void vncHooksImageText16(DrawablePtr pDrawable, GCPtr pGC, int x, int y,
                                 int count, unsigned short *chars)
 {
-  GC_OP_UNWRAPPER(pDrawable, pGC, ImageText16);
+  BoxRec box;
+  RegionRec reg;
+
+  GC_OP_PROLOGUE(pGC, ImageText16);
 
   if (count == 0) {
     (*pGC->ops->ImageText16) (pDrawable, pGC, x, y, count, chars);
-    return;
+    goto out;
   }
 
-  BoxRec box;
   GetTextBoundingRect(pDrawable, pGC->font, x, y, count, &box);
 
-  RegionHelper changed(pScreen, &box, 0);
-
-  REGION_INTERSECT(pScreen, changed.reg, changed.reg, pGC->pCompositeClip);
+  REGION_INIT(pGC->pScreen, &reg, &box, 0);
+  REGION_INTERSECT(pGC->pScreen, &reg, &reg, pGC->pCompositeClip);
 
   (*pGC->ops->ImageText16) (pDrawable, pGC, x, y, count, chars);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  add_changed(pGC->pScreen, &reg);
+
+  REGION_UNINIT(pGC->pScreen, &reg);
+
+out:
+  GC_OP_EPILOGUE(pGC);
 }
 
 // ImageGlyphBlt - changed region is bounding rect around nglyph chars, clipped
@@ -1766,23 +2018,29 @@
                                   int y, unsigned int nglyph,
                                   CharInfoPtr *ppci, void * pglyphBase)
 {
-  GC_OP_UNWRAPPER(pDrawable, pGC, ImageGlyphBlt);
+  BoxRec box;
+  RegionRec reg;
+
+  GC_OP_PROLOGUE(pGC, ImageGlyphBlt);
 
   if (nglyph == 0) {
     (*pGC->ops->ImageGlyphBlt) (pDrawable, pGC, x, y, nglyph, ppci,pglyphBase);
-    return;
+    goto out;
   }
 
-  BoxRec box;
   GetTextBoundingRect(pDrawable, pGC->font, x, y, nglyph, &box);
 
-  RegionHelper changed(pScreen, &box, 0);
-
-  REGION_INTERSECT(pScreen, changed.reg, changed.reg, pGC->pCompositeClip);
+  REGION_INIT(pGC->pScreen, &reg, &box, 0);
+  REGION_INTERSECT(pGC->pScreen, &reg, &reg, pGC->pCompositeClip);
 
   (*pGC->ops->ImageGlyphBlt) (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  add_changed(pGC->pScreen, &reg);
+
+  REGION_UNINIT(pGC->pScreen, &reg);
+
+out:
+  GC_OP_EPILOGUE(pGC);
 }
 
 // PolyGlyphBlt - changed region is bounding rect around nglyph chars, clipped
@@ -1792,23 +2050,29 @@
                                  int y, unsigned int nglyph,
                                  CharInfoPtr *ppci, void * pglyphBase)
 {
-  GC_OP_UNWRAPPER(pDrawable, pGC, PolyGlyphBlt);
+  BoxRec box;
+  RegionRec reg;
+
+  GC_OP_PROLOGUE(pGC, PolyGlyphBlt);
 
   if (nglyph == 0) {
     (*pGC->ops->PolyGlyphBlt) (pDrawable, pGC, x, y, nglyph, ppci,pglyphBase);
-    return;
+    goto out;
   }
 
-  BoxRec box;
   GetTextBoundingRect(pDrawable, pGC->font, x, y, nglyph, &box);
 
-  RegionHelper changed(pScreen, &box, 0);
-
-  REGION_INTERSECT(pScreen, changed.reg, changed.reg, pGC->pCompositeClip);
+  REGION_INIT(pGC->pScreen, &reg, &box, 0);
+  REGION_INTERSECT(pGC->pScreen, &reg, &reg, pGC->pCompositeClip);
 
   (*pGC->ops->PolyGlyphBlt) (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  add_changed(pGC->pScreen, &reg);
+
+  REGION_UNINIT(pGC->pScreen, &reg);
+
+out:
+  GC_OP_EPILOGUE(pGC);
 }
 
 // PushPixels - changed region is the given rectangle, clipped by
@@ -1818,19 +2082,24 @@
                                DrawablePtr pDrawable, int w, int h, int x,
                                int y)
 {
-  GC_OP_UNWRAPPER(pDrawable, pGC, PushPixels);
-
   BoxRec box;
+  RegionRec reg;
+
+  GC_OP_PROLOGUE(pGC, PushPixels);
+
   box.x1 = x + pDrawable->x;
   box.y1 = y + pDrawable->y;
   box.x2 = box.x1 + w;
   box.y2 = box.y1 + h;
 
-  RegionHelper changed(pScreen, &box, 0);
-
-  REGION_INTERSECT(pScreen, changed.reg, changed.reg, pGC->pCompositeClip);
+  REGION_INIT(pGC->pScreen, &reg, &box, 0);
+  REGION_INTERSECT(pGC->pScreen, &reg, &reg, pGC->pCompositeClip);
 
   (*pGC->ops->PushPixels) (pGC, pBitMap, pDrawable, w, h, x, y);
 
-  vncHooksScreen->desktop->add_changed(changed.reg);
+  add_changed(pGC->pScreen, &reg);
+
+  REGION_UNINIT(pGC->pScreen, &reg);
+
+  GC_OP_EPILOGUE(pGC);
 }
diff --git a/unix/xserver/hw/vnc/vncHooks.h b/unix/xserver/hw/vnc/vncHooks.h
index 30b51db..eb09610 100644
--- a/unix/xserver/hw/vnc/vncHooks.h
+++ b/unix/xserver/hw/vnc/vncHooks.h
@@ -1,4 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2009-2015 Pierre Ossman for Cendio AB
  * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,13 +19,17 @@
 #ifndef __VNCHOOKS_H__
 #define __VNCHOOKS_H__
 
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
+#ifdef __cplusplus
+extern "C" {
 #endif
 
-extern "C" {
-#include <screenint.h>
-  extern Bool vncHooksInit(ScreenPtr pScreen, XserverDesktop* desktop);
+int vncHooksInit(int scrIdx);
+
+void vncGetScreenImage(int scrIdx, int x, int y, int width, int height,
+                       char *buffer, int strideBytes);
+
+#ifdef __cplusplus
 }
+#endif
 
 #endif
diff --git a/unix/xserver/hw/vnc/xf86vncModule.cc b/unix/xserver/hw/vnc/vncModule.c
similarity index 65%
rename from unix/xserver/hw/vnc/xf86vncModule.cc
rename to unix/xserver/hw/vnc/vncModule.c
index 6bf5e3d..051f6b4 100644
--- a/unix/xserver/hw/vnc/xf86vncModule.cc
+++ b/unix/xserver/hw/vnc/vncModule.c
@@ -1,4 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2015 Pierre Ossman for Cendio AB
  * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,41 +23,26 @@
 #include <dix-config.h>
 #endif
 
-#include <rfb/Configuration.h>
-#include <rfb/Logger_stdio.h>
-#include <rfb/LogWriter.h>
-#include <rfb/ScreenSet.h>
-#include <rfb/screenTypes.h>
+#include "opaque.h"
+#ifdef RANDR
+#include "randrstr.h"
+#endif
 
 #include "xorg-version.h"
 
-extern "C" {
-#define class c_class
-#define private c_private
-#define bool c_bool
-#define new c_new
 #include "xf86.h"
 #include "xf86Module.h"
-#ifdef RANDR
-#include "randrstr.h"
-#endif /* RANDR */
-#undef class
-#undef private
-#undef bool
-#undef new
 
-using namespace rfb;
+#include "vncExtInit.h"
+#include "RFBGlue.h"
 
-extern void vncExtensionInit();
-static void vncExtensionInitWithParams(INITARGS);
-
-char *listenaddr = NULL;
+static void vncModuleInit(INITARGS);
 
 static MODULESETUPPROTO(vncSetup);
 
 ExtensionModule vncExt =
 {
-    vncExtensionInitWithParams,
+    vncModuleInit,
     "VNC",
 #if XORG < 112
     NULL,
@@ -92,42 +78,39 @@
     return (void *)1;
 }
 
-static void vncExtensionInitWithParams(INITARGS)
+static void vncModuleInit(INITARGS)
 {
   static char once = 0;
 
   if (!once) {
     once++;
-    rfb::initStdIOLoggers();
-    rfb::LogWriter::setLogParams("*:stderr:30");
-    rfb::Configuration::enableServerParams();
+
+    vncInitRFB();
 
     for (int scr = 0; scr < screenInfo.numScreens; scr++) {
-      ScrnInfoPtr pScrn = xf86Screens[scr];
+      ScrnInfoPtr pScrn;
+      XF86OptionPtr option;
 
-      for (ParameterIterator i; i.param; i.next()) {
-        const char *val;
-#if XORG < 112
-        val = xf86FindOptionValue(pScrn->options, i.param->getName());
-#else
-        val = xf86FindOptionValue((XF86OptionPtr)pScrn->options, i.param->getName());
-#endif
-        if (val)
-          i.param->setParam(val);
+      pScrn = xf86Screens[scr];
+      option = pScrn->options;
+      while (option != NULL) {
+        vncSetParam(xf86OptionName(option), xf86OptionValue(option));
+        option = xf86NextOption(option);
       }
     }
   }
 
   vncExtensionInit();
 }
-}
 
+#ifdef RANDR
 RRModePtr vncRandRModeGet(int width, int height)
 {
     return NULL;
 }
 
-RROutputPtr vncRandROutputCreate(ScreenPtr pScreen)
+int vncRandRCreateOutputs(int scrIdx, int extraOutputs)
 {
-    return NULL;
+  return -1;
 }
+#endif
diff --git a/unix/xserver/hw/vnc/xvnc.cc b/unix/xserver/hw/vnc/xvnc.c
similarity index 95%
rename from unix/xserver/hw/vnc/xvnc.cc
rename to unix/xserver/hw/vnc/xvnc.c
index 0fd7b0c..3498d0f 100644
--- a/unix/xserver/hw/vnc/xvnc.cc
+++ b/unix/xserver/hw/vnc/xvnc.c
@@ -1,6 +1,6 @@
 /* Copyright (c) 1993  X Consortium
    Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
-   Copyright 2009 Pierre Ossman for Cendio AB
+   Copyright 2009-2015 Pierre Ossman for Cendio AB
 
 Permission is hereby granted, free of charge, to any person obtaining
 a copy of this software and associated documentation files (the
@@ -32,16 +32,10 @@
 #include <dix-config.h>
 #endif
 
-#include <rfb/Configuration.h>
-#include <rfb/Logger_stdio.h>
-#include <rfb/LogWriter.h>
-#include <network/TcpSocket.h>
 #include "vncExtInit.h"
+#include "RFBGlue.h"
 #include "xorg-version.h"
 
-extern "C" {
-#define class c_class
-#define public c_public
 #ifdef WIN32
 #include <X11/Xwinsock.h>
 #endif
@@ -61,9 +55,7 @@
 #include "gcstruct.h"
 #include "input.h"
 #include "mipointer.h"
-#define new New
 #include "micmap.h"
-#undef new
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <errno.h>
@@ -89,9 +81,6 @@
 #include "version-config.h"
 #endif
 #include "site.h"
-#undef class
-#undef public
-}
 
 #if XORG >= 110
 #define Xalloc malloc
@@ -164,11 +153,9 @@
 static int lastScreen = -1;
 static Bool Render = TRUE;
 
-static bool displaySpecified = false;
+static Bool displaySpecified = FALSE;
 static char displayNumStr[16];
 
-char *listenaddr = NULL;
-
 static int vncVerbose = DEFAULT_LOG_VERBOSITY;
 
 
@@ -212,8 +199,6 @@
 
 static void vfbFreeFramebufferMemory(vfbFramebufferInfoPtr pfb);
 
-extern "C" {
-
 #ifdef DPMSExtension
     /* Why support DPMS? Because stupid modern desktop environments
        such as Unity 2D on Ubuntu 11.10 crashes if DPMS is not
@@ -325,7 +310,6 @@
     ErrorF("-depth D               set screen 0's depth\n");
     ErrorF("-pixelformat fmt       set pixel format (rgbNNN or bgrNNN)\n");
     ErrorF("-inetd                 has been launched from inetd\n");
-    ErrorF("-interface IP_address  listen on specified interface\n");
     ErrorF("-noclipboard           disable clipboard settings modification via vncconfig utility\n");
     ErrorF("-verbose [n]           verbose startup messages\n");
     ErrorF("-quiet                 minimal startup messages\n");
@@ -338,8 +322,7 @@
             "Other valid forms are <param>=<value> -<param>=<value> "
             "--<param>=<value>\n"
             "Parameter names are case-insensitive.  The parameters are:\n\n");
-    rfb::Configuration::listParams(79, 14);
-  }
+    vncListParams(79, 14);
 }
 
 /* ddxInitGlobals - called by |InitGlobals| from os/util.c */
@@ -348,21 +331,21 @@
 }
 
 static 
-bool displayNumFree(int num)
+Bool displayNumFree(int num)
 {
-    try {
-	network::TcpListener l(NULL, 6000+num);
-    } catch (rdr::Exception& e) {
-	return false;
-    }
     char file[256];
+    if (vncIsTCPPortUsed(6000+num))
+        return FALSE;
     sprintf(file, "/tmp/.X%d-lock", num);
-    if (access(file, F_OK) == 0) return false;
+    if (access(file, F_OK) == 0)
+        return FALSE;
     sprintf(file, "/tmp/.X11-unix/X%d", num);
-    if (access(file, F_OK) == 0) return false;
+    if (access(file, F_OK) == 0)
+        return FALSE;
     sprintf(file, "/usr/spool/sockets/X11/%d", num);
-    if (access(file, F_OK) == 0) return false;
-    return true;
+    if (access(file, F_OK) == 0)
+        return FALSE;
+    return TRUE;
 }
 
 int 
@@ -375,13 +358,11 @@
 	vfbInitializeDefaultScreens();
 	vfbInitializePixmapDepths();
 	firstTime = FALSE;
-	rfb::initStdIOLoggers();
-	rfb::LogWriter::setLogParams("*:stderr:30");
-	rfb::Configuration::enableServerParams();
+	vncInitRFB();
     }
 
     if (argv[i][0] ==  ':')
-	displaySpecified = true;
+        displaySpecified = TRUE;
 
     if (strcmp (argv[i], "-screen") == 0)	/* -screen n WxHxD */
     {
@@ -574,7 +555,7 @@
 	close(2);
 	
 	if (!displaySpecified) {
-	    int port = network::TcpSocket::getSockPort(vncInetdSock);
+	    int port = vncGetSocketPort(vncInetdSock);
 	    int displayNum = port - 5900;
 	    if (displayNum < 0 || displayNum > 99 || !displayNumFree(displayNum)) {
 		for (displayNum = 1; displayNum < 100; displayNum++)
@@ -591,25 +572,8 @@
 	return 1;
     }
 
-    if (strcmp(argv[i], "-interface") == 0 ||
-	strcmp(argv[i], "-i") == 0) {
-	if (++i >= argc) {
-	    UseMsg();
-	    return 2;
-	}
-
-	if (listenaddr != NULL) /* Only first -interface is valid */
-		return 2;
-
-	listenaddr = strdup(argv[i]);
-	if (listenaddr == NULL)
-	    FatalError("Not enough memory");
-
-	return 2;
-    }
-
     if (strcmp(argv[i], "-noclipboard") == 0) {
-	noclipboard = true;
+	vncNoClipboard = 1;
 	return 1;
     }
 
@@ -636,11 +600,11 @@
         return 1;
     }
 
-    if (rfb::Configuration::setParam(argv[i]))
+    if (vncSetParamSimple(argv[i]))
 	return 1;
     
     if (argv[i][0] == '-' && i+1 < argc) {
-	if (rfb::Configuration::setParam(&argv[i][1], argv[i+1]))
+	if (vncSetParam(&argv[i][1], argv[i+1]))
 	    return 2;
     }
     
@@ -1337,15 +1301,18 @@
 }
 
 /* Used from XserverDesktop when it needs more outputs... */
-RROutputPtr vncRandROutputCreate(ScreenPtr pScreen)
+int vncRandRCreateOutputs(int scrIdx, int extraOutputs)
 {
     RRCrtcPtr crtc;
 
-    crtc = vncRandRCrtcCreate(pScreen);
-    if (crtc == NULL)
-        return NULL;
+    while (extraOutputs > 0) {
+        crtc = vncRandRCrtcCreate(screenInfo.screens[scrIdx]);
+        if (crtc == NULL)
+            return -1;
+        extraOutputs--;
+    }
 
-    return crtc->outputs[0];
+    return 0;
 }
 
 static Bool vncRandRInit(ScreenPtr pScreen)
@@ -1596,13 +1563,13 @@
 } /* end vfbScreenInit */
 
 
-static void vfbClientStateChange(CallbackListPtr*, void *, void *) {
+static void vfbClientStateChange(CallbackListPtr *a, void *b, void *c) {
   dispatchException &= ~DE_RESET;
 }
  
 #if XORG >= 113
 #ifdef GLXEXT
-extern "C" void GlxExtensionInit(void);
+extern void GlxExtensionInit(void);
 
 static ExtensionModule glxExt = {
     GlxExtensionInit,
@@ -1615,11 +1582,12 @@
 void
 InitOutput(ScreenInfo *screenInfo, int argc, char **argv)
 {
+    int i;
+    int NumFormats = 0;
+
   ErrorF("\nXvnc %s - built %s\n%s", XVNCVERSION, buildtime, XVNCCOPYRIGHT);
   ErrorF("Underlying X server release %d, %s\n\n", VENDOR_RELEASE,
          VENDOR_STRING);
-    int i;
-    int NumFormats = 0;
 
 #if XORG >= 113
 #ifdef GLXEXT
@@ -1722,3 +1690,11 @@
 {
 }
 #endif
+
+void vncClientGone(int fd)
+{
+  if (fd == vncInetdSock) {
+    ErrorF("inetdSock client gone\n");
+    GiveUp(0);
+  }
+}
diff --git a/vncviewer/DesktopWindow.cxx b/vncviewer/DesktopWindow.cxx
index 423d2df..e204662 100644
--- a/vncviewer/DesktopWindow.cxx
+++ b/vncviewer/DesktopWindow.cxx
@@ -798,8 +798,11 @@
       (layout == cc->cp.screenLayout))
     return;
 
-  vlog.debug("Requesting framebuffer resize from %dx%d to %dx%d (%d screens)",
-             cc->cp.width, cc->cp.height, width, height, layout.num_screens());
+  char buffer[2048];
+  vlog.debug("Requesting framebuffer resize from %dx%d to %dx%d",
+             cc->cp.width, cc->cp.height, width, height);
+  layout.print(buffer, sizeof(buffer));
+  vlog.debug("%s", buffer);
 
   if (!layout.validate(width, height)) {
     vlog.error(_("Invalid screen layout computed for resize request!"));
