]> git.ipfire.org Git - ipfire-3.x.git/commitdiff
xorg-server: Improve functions, add patches.
authorSchantl Stefan <Stevee@ipfire.org>
Sun, 22 Aug 2010 15:02:19 +0000 (17:02 +0200)
committerSchantl Stefan <Stevee@ipfire.org>
Sun, 22 Aug 2010 15:02:19 +0000 (17:02 +0200)
21 files changed:
pkgs/core/xorg-server/10-quirks.conf [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.4.99-pic-libxf86config.patch [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.4.99-ssh-isnt-local.patch [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.5.0-bg-none-root.patch [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.5.0-projector-fb-size.patch [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.5.1-mode-debug.patch [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.6.0-displayfd.patch [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.6.0-less-acpi-brokenness.patch [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.6.1-nouveau.patch [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.6.99-default-modes.patch [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.6.99-randr-error-debugging.patch [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.6.99-right-of.patch [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.7.0-randr-gamma-restore.patch [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.7.1-gamma-kdm-fix.patch [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.7.1-multilib.patch [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.8-disable-vboxvideo.patch [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.8-no-connected-outputs.patch [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.8-randr-initial.patch [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.8-udev-warning.patch [new file with mode: 0644]
pkgs/core/xorg-server/patches/xserver-1.8.2-XTEST-PointerKeys-fixes.patch [new file with mode: 0644]
pkgs/core/xorg-server/xorg-server.nm

diff --git a/pkgs/core/xorg-server/10-quirks.conf b/pkgs/core/xorg-server/10-quirks.conf
new file mode 100644 (file)
index 0000000..82d3ec2
--- /dev/null
@@ -0,0 +1,20 @@
+# Collection of quirks and blacklist/whitelists for specific devices.
+
+
+# Accelerometer device, posts data through ABS_X/ABS_Y, making X unusable
+# http://bugs.freedesktop.org/show_bug.cgi?id=22442 
+Section "InputClass"
+        Identifier "ThinkPad HDAPS accelerometer blacklist"
+        MatchProduct "ThinkPad HDAPS accelerometer data"
+        Option "Ignore" "on"
+EndSection
+
+# https://bugzilla.redhat.com/show_bug.cgi?id=523914
+# Mouse does not move in PV Xen guest
+# Explicitly tell evdev to not ignore the absolute axes.
+Section "InputClass"
+        Identifier "Xen Virtual Pointer axis blacklist"
+        MatchProduct "Xen Virtual Pointer"
+        Option "IgnoreAbsoluteAxes" "off"
+        Option "IgnoreRelativeAxes" "off"
+EndSection
diff --git a/pkgs/core/xorg-server/patches/xserver-1.4.99-pic-libxf86config.patch b/pkgs/core/xorg-server/patches/xserver-1.4.99-pic-libxf86config.patch
new file mode 100644 (file)
index 0000000..d040900
--- /dev/null
@@ -0,0 +1,25 @@
+From 04bd8e2fa6be557f58a0e417b0f3befc56f5ef59 Mon Sep 17 00:00:00 2001
+From: Fedora X Ninjas <x@fedoraproject.org>
+Date: Thu, 1 Jul 2010 15:45:03 +1000
+Subject: [PATCH] Build libxf86config with -fPIC.
+
+---
+ hw/xfree86/parser/Makefile.am |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/hw/xfree86/parser/Makefile.am b/hw/xfree86/parser/Makefile.am
+index caf7079..655e73f 100644
+--- a/hw/xfree86/parser/Makefile.am
++++ b/hw/xfree86/parser/Makefile.am
+@@ -32,7 +32,7 @@ libxf86config_internal_la_SOURCES = \
+ libxf86config_a_SOURCES = \
+       $(INTERNAL_SOURCES)
+-libxf86config_a_CFLAGS = $(AM_CFLAGS)
++libxf86config_a_CFLAGS = $(AM_CFLAGS) -fPIC -fvisibility=hidden
+ AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS) \
+       -DSYSCONFDIR=\"$(sysconfdir)\" \
+-- 
+1.7.1
+
diff --git a/pkgs/core/xorg-server/patches/xserver-1.4.99-ssh-isnt-local.patch b/pkgs/core/xorg-server/patches/xserver-1.4.99-ssh-isnt-local.patch
new file mode 100644 (file)
index 0000000..d532fe1
--- /dev/null
@@ -0,0 +1,48 @@
+From 4306b434038de7e2b17d3c4a6cfd87db469d3bda Mon Sep 17 00:00:00 2001
+From: Adam Jackson <ajax@redhat.com>
+Date: Mon, 10 Dec 2007 11:26:57 -0500
+Subject: [PATCH] Hack for proper MIT-SHM rejection for ssh-forwarded clients.
+
+---
+ Xext/shm.c |   15 +++++++++++++++
+ 1 files changed, 15 insertions(+), 0 deletions(-)
+
+diff --git a/Xext/shm.c b/Xext/shm.c
+index 5937a03..5376c19 100644
+--- a/Xext/shm.c
++++ b/Xext/shm.c
+@@ -381,8 +381,21 @@
+     mode_t mask;
+     int uidset = 0, gidset = 0;
+     LocalClientCredRec *lcc;
++    Bool is_ssh = FALSE;
+     
+     if (GetLocalClientCreds(client, &lcc) != -1) {
++#ifdef linux
++      if (lcc->fieldsSet & LCC_PID_SET) {
++          /* ssh isn't actually a local client */
++          char exe[64], buf[64];
++
++          memset(buf, 0, 64);
++          snprintf(exe, 64, "/proc/%d/exe", lcc->pid);
++          readlink(exe, buf, 63);
++          if (strstr(buf, "/ssh"))
++              is_ssh = TRUE;
++      }
++#endif
+       if (lcc->fieldsSet & LCC_UID_SET) {
+           uid = lcc->euid;
+@@ -401,6 +414,9 @@
+       }
+ #endif
+       FreeLocalClientCreds(lcc);
++
++      if (is_ssh)
++          return -1;
+       
+       if (uidset) {
+           /* User id 0 always gets access */
+-- 
+1.5.3.4
+
diff --git a/pkgs/core/xorg-server/patches/xserver-1.5.0-bg-none-root.patch b/pkgs/core/xorg-server/patches/xserver-1.5.0-bg-none-root.patch
new file mode 100644 (file)
index 0000000..ae65d0b
--- /dev/null
@@ -0,0 +1,155 @@
+From eff3bb9c6f0b71a57705885a3fe6e6469d252d2b Mon Sep 17 00:00:00 2001
+From: Fedora X Ninjas <x@fedoraproject.org>
+Date: Wed, 20 Jan 2010 14:46:12 +1300
+Subject: [PATCH] Add nr for background=none root
+
+---
+ dix/globals.c                |    1 +
+ dix/window.c                 |   12 +++++++-----
+ hw/xfree86/common/xf86Init.c |   11 +++++++++++
+ hw/xfree86/common/xf86str.h  |    5 ++++-
+ include/opaque.h             |    1 +
+ os/utils.c                   |    3 +++
+ 6 files changed, 27 insertions(+), 6 deletions(-)
+
+diff --git a/dix/globals.c b/dix/globals.c
+index c24a94f..907a5e8 100644
+--- a/dix/globals.c
++++ b/dix/globals.c
+@@ -124,6 +124,7 @@ FontPtr defaultFont;   /* not declared in dix.h to avoid including font.h in
+ CursorPtr rootCursor;
+ Bool party_like_its_1989 = FALSE;
+ Bool whiteRoot = FALSE;
++Bool bgNoneRoot = FALSE;
+ int cursorScreenDevPriv[MAXSCREENS];
+diff --git a/dix/window.c b/dix/window.c
+index caff1cb..be1d1c4 100644
+--- a/dix/window.c
++++ b/dix/window.c
+@@ -466,22 +466,24 @@ InitRootWindow(WindowPtr pWin)
+     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);
+ }
+diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
+index 6707448..776b898 100644
+--- a/hw/xfree86/common/xf86Init.c
++++ b/hw/xfree86/common/xf86Init.c
+@@ -77,6 +77,7 @@
+ #ifdef RENDER
+ #include "picturestr.h"
+ #endif
++#include "xace.h"
+ #include "xf86VGAarbiter.h"
+ #include "globals.h"
+@@ -254,6 +255,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);
+@@ -305,6 +307,15 @@ xf86CreateRootWindow(WindowPtr pWin)
+     }
+   }
++  if (bgNoneRoot && 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/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h
+index de1f1b6..5c3aa00 100644
+--- a/hw/xfree86/common/xf86str.h
++++ b/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
+diff --git a/include/opaque.h b/include/opaque.h
+index b3c7c70..fcc8c95 100644
+--- a/include/opaque.h
++++ b/include/opaque.h
+@@ -71,6 +71,7 @@ extern _X_EXPORT Bool defeatAccessControl;
+ 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;
+diff --git a/os/utils.c b/os/utils.c
+index d7c8388..40583d0 100644
+--- a/os/utils.c
++++ b/os/utils.c
+@@ -513,6 +513,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");
+@@ -856,6 +857,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]);
+-- 
+1.6.6
+
diff --git a/pkgs/core/xorg-server/patches/xserver-1.5.0-projector-fb-size.patch b/pkgs/core/xorg-server/patches/xserver-1.5.0-projector-fb-size.patch
new file mode 100644 (file)
index 0000000..c6178b8
--- /dev/null
@@ -0,0 +1,32 @@
+From dc5cedd61e00afec33cbfaa7fdfbb6c357074dbd Mon Sep 17 00:00:00 2001
+From: =?utf-8?q?S=C3=B8ren=20Sandmann=20Pedersen?= <sandmann@redhat.com>
+Date: Thu, 11 Sep 2008 12:51:31 -0400
+Subject: [PATCH] Make room for an external monitor if we have enough video RAM
+
+---
+ hw/xfree86/modes/xf86Crtc.c |    9 +++++++++
+ 1 files changed, 9 insertions(+), 0 deletions(-)
+
+diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
+index 4de7e05..9bcf81b 100644
+--- a/hw/xfree86/modes/xf86Crtc.c
++++ b/hw/xfree86/modes/xf86Crtc.c
+@@ -987,6 +987,15 @@ xf86DefaultScreenLimits (ScrnInfoPtr scrn, int *widthp, int *heightp,
+       if (crtc_height > height)
+           height = crtc_height;
+     }
++
++    /* Make room for an external monitor if we have enough video ram */
++    if (scrn->videoRam >= 65536)
++        width += 1920;
++    else if (scrn->videoRam >= 32768)
++        width += 1280;
++    else if (scrn->videoRam >= 16384)
++        width += 1024;
++
+     if (config->maxWidth && width > config->maxWidth) width = config->maxWidth;
+     if (config->maxHeight && height > config->maxHeight) height = config->maxHeight;
+     if (config->minWidth && width < config->minWidth) width = config->minWidth;
+-- 
+1.6.0.1
+
diff --git a/pkgs/core/xorg-server/patches/xserver-1.5.1-mode-debug.patch b/pkgs/core/xorg-server/patches/xserver-1.5.1-mode-debug.patch
new file mode 100644 (file)
index 0000000..11fe5ad
--- /dev/null
@@ -0,0 +1,26 @@
+From 079910986a1b8f5042e16ee2ba3ad9ed843b67ca Mon Sep 17 00:00:00 2001
+From: Adam Jackson <ajax@redhat.com>
+Date: Tue, 7 Oct 2008 11:09:14 -0400
+Subject: [PATCH] Force ModeDebug on.
+
+---
+ hw/xfree86/modes/xf86Crtc.c |    3 +--
+ 1 files changed, 1 insertions(+), 2 deletions(-)
+
+diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
+index 9bcf81b..a953c8a 100644
+--- a/hw/xfree86/modes/xf86Crtc.c
++++ b/hw/xfree86/modes/xf86Crtc.c
+@@ -2084,8 +2084,7 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
+     xf86ProcessOptions (scrn->scrnIndex,
+                       scrn->options,
+                       config->options);
+-    config->debug_modes = xf86ReturnOptValBool (config->options,
+-                                              OPTION_MODEDEBUG, FALSE);
++    config->debug_modes = TRUE;
+     if (scrn->display->virtualX)
+       width = scrn->display->virtualX;
+-- 
+1.6.0.1
+
diff --git a/pkgs/core/xorg-server/patches/xserver-1.6.0-displayfd.patch b/pkgs/core/xorg-server/patches/xserver-1.6.0-displayfd.patch
new file mode 100644 (file)
index 0000000..09e7b49
--- /dev/null
@@ -0,0 +1,172 @@
+From 1766352059d0db67bff3f7dd0820563a30f54858 Mon Sep 17 00:00:00 2001
+From: Adam Jackson <ajax@redhat.com>
+Date: Thu, 18 Jun 2009 16:56:41 +1000
+Subject: [PATCH] displayfd hack
+
+---
+ dix/globals.c    |    1 +
+ include/opaque.h |    1 +
+ os/connection.c  |   72 ++++++++++++++++++++++++++++++++++++-----------------
+ os/utils.c       |   11 ++++++++
+ 4 files changed, 62 insertions(+), 23 deletions(-)
+
+diff --git a/dix/globals.c b/dix/globals.c
+index 907a5e8..c1e64d3 100644
+--- a/dix/globals.c
++++ b/dix/globals.c
+@@ -135,6 +135,7 @@ int defaultColorVisualClass = -1;
+ int monitorResolution = 0;
+ char *display;
++int displayfd;
+ char *ConnectionInfo;
+ CARD32 TimeOutValue = DEFAULT_TIMEOUT * MILLI_PER_SECOND;
+diff --git a/include/opaque.h b/include/opaque.h
+index fcc8c95..2a08e2d 100644
+--- a/include/opaque.h
++++ b/include/opaque.h
+@@ -50,6 +50,7 @@ extern _X_EXPORT int ScreenSaverAllowExposures;
+ extern _X_EXPORT int defaultScreenSaverBlanking;
+ extern _X_EXPORT int defaultScreenSaverAllowExposures;
+ extern _X_EXPORT char *display;
++extern _X_EXPORT int displayfd;
+ extern _X_EXPORT int defaultBackingStore;
+ extern _X_EXPORT Bool disableBackingStore;
+diff --git a/os/connection.c b/os/connection.c
+index 0c72b67..05d95c4 100644
+--- a/os/connection.c
++++ b/os/connection.c
+@@ -146,6 +146,7 @@ Bool NewOutputPending;             /* not yet attempted to write some new output */
+ Bool AnyClientsWriteBlocked;  /* true if some client blocked on write */
+ static Bool RunFromSmartParent;       /* send SIGUSR1 to parent process */
++static char dynamic_display[7];
+ Bool PartialNetwork;  /* continue even if unable to bind all addrs */
+ static Pid_t ParentProcess;
+@@ -357,9 +358,23 @@ NotifyParentProcess(void)
+           kill (ParentProcess, SIGUSR1);
+       }
+     }
++    if (dynamic_display[0])
++      write(displayfd, dynamic_display, strlen(dynamic_display));
+ #endif
+ }
++static Bool
++TryCreateSocket(int num, int *partial)
++{
++    char port[20];
++
++    sprintf(port, "%d", num);
++
++    return _XSERVTransMakeAllCOTSServerListeners(port, partial,
++                                               &ListenTransCount,
++                                               &ListenTransConns);
++}
++
+ /*****************
+  * CreateWellKnownSockets
+  *    At initialization, create the sockets to listen on for new clients.
+@@ -370,7 +385,6 @@ CreateWellKnownSockets(void)
+ {
+     int               i;
+     int               partial;
+-    char      port[20];
+     FD_ZERO(&AllSockets);
+     FD_ZERO(&AllClients);
+@@ -385,32 +399,44 @@ CreateWellKnownSockets(void)
+     FD_ZERO (&WellKnownConnections);
+-    sprintf (port, "%d", atoi (display));
+-
+-    if ((_XSERVTransMakeAllCOTSServerListeners (port, &partial,
+-      &ListenTransCount, &ListenTransConns) >= 0) &&
+-      (ListenTransCount >= 1))
++    if (display)
+     {
+-      if (!PartialNetwork && partial)
+-      {
+-          FatalError ("Failed to establish all listening sockets");
+-      }
+-      else
++      if (TryCreateSocket(atoi(display), &partial) &&
++          (ListenTransCount >= 1))
++          if (!PartialNetwork && partial)
++              FatalError ("Failed to establish all listening sockets");
++    }
++    else /* -displayfd */
++    {
++      Bool found = 0;
++      for (i = 0; i < 65535 - 1024; i++)
+       {
+-          ListenTransFds = xalloc (ListenTransCount * sizeof (int));
+-
+-          for (i = 0; i < ListenTransCount; i++)
++          if (!TryCreateSocket(i, &partial) && !partial)
+           {
+-              int fd = _XSERVTransGetConnectionNumber (ListenTransConns[i]);
+-              
+-              ListenTransFds[i] = fd;
+-              FD_SET (fd, &WellKnownConnections);
+-
+-              if (!_XSERVTransIsLocal (ListenTransConns[i]))
+-              {
+-                  DefineSelf (fd);
+-              }
++              found = 1;
++              break;
+           }
++          else
++              CloseWellKnownConnections();
++      }
++      if (!found)
++          FatalError("Failed to find a socket to listen on");
++      sprintf(dynamic_display, "%d\n", i);
++      display = dynamic_display;
++    }
++
++    ListenTransFds = xalloc (ListenTransCount * sizeof (int));
++
++    for (i = 0; i < ListenTransCount; i++)
++    {
++      int fd = _XSERVTransGetConnectionNumber (ListenTransConns[i]);
++
++      ListenTransFds[i] = fd;
++      FD_SET (fd, &WellKnownConnections);
++
++      if (!_XSERVTransIsLocal (ListenTransConns[i]))
++      {
++          DefineSelf (fd);
+       }
+     }
+diff --git a/os/utils.c b/os/utils.c
+index 7bfdf8b..37a93b1 100644
+--- a/os/utils.c
++++ b/os/utils.c
+@@ -678,6 +678,17 @@ ProcessCommandLine(int argc, char *argv[])
+           else
+               UseMsg();
+       }
++      else if (strcmp(argv[i], "-displayfd") == 0)
++      {
++          if (++i < argc)
++          {
++              displayfd = atoi(argv[i]);
++              display = NULL;
++              nolock = TRUE;
++          }
++          else
++              UseMsg();
++      }
+ #ifdef DPMSExtension
+       else if ( strcmp( argv[i], "dpms") == 0)
+           /* ignored for compatibility */ ;
+-- 
+1.6.3.rc1.2.g0164.dirty
+
diff --git a/pkgs/core/xorg-server/patches/xserver-1.6.0-less-acpi-brokenness.patch b/pkgs/core/xorg-server/patches/xserver-1.6.0-less-acpi-brokenness.patch
new file mode 100644 (file)
index 0000000..cc80e6c
--- /dev/null
@@ -0,0 +1,31 @@
+From a8079882f1884edc62a9de28af915bd8b65dfbbe Mon Sep 17 00:00:00 2001
+From: Adam Jackson <ajax@redhat.com>
+Date: Wed, 11 Mar 2009 14:02:11 -0400
+Subject: [PATCH] Don't build the ACPI code.
+
+No good can come of this.
+---
+ configure.ac |    2 --
+ 1 files changed, 0 insertions(+), 2 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index 72ae67e..04716f8 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1269,13 +1269,11 @@ if test "x$XORG" = xyes; then
+               case $host_cpu in
+                 ia64*)
+                       linux_ia64=yes
+-                      linux_acpi="yes"
+                       ;;
+                 alpha*)
+                       linux_alpha=yes
+                       ;;
+                 i*86|amd64*|x86_64*)
+-                      linux_acpi="yes"
+                       ;;
+                 *)
+                       ;;
+-- 
+1.6.1.3
+
diff --git a/pkgs/core/xorg-server/patches/xserver-1.6.1-nouveau.patch b/pkgs/core/xorg-server/patches/xserver-1.6.1-nouveau.patch
new file mode 100644 (file)
index 0000000..35a1ff9
--- /dev/null
@@ -0,0 +1,109 @@
+From a685b5cf34532cef96fc9b05f735088ac0c0c7ad Mon Sep 17 00:00:00 2001
+From: Fedora X Ninjas <x@fedoraproject.org>
+Date: Tue, 16 Feb 2010 11:38:17 +1000
+Subject: [PATCH 08/17] autoconfig: select nouveau by default for NVIDIA GPUs
+
+Also, don't treat DRI setup failure as an error for nouveau.
+---
+ glx/glxdri.c                       |    7 +++++--
+ glx/glxdri2.c                      |    7 +++++--
+ hw/xfree86/common/xf86AutoConfig.c |   19 ++++++++++++++++++-
+ 3 files changed, 28 insertions(+), 5 deletions(-)
+
+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)
+     xfree(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 = xcalloc(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)
+     xfree(screen);
+-    LogMessage(X_ERROR, "AIGLX: reverting to software rendering\n");
++    LogMessage(from, "AIGLX: reverting to software rendering\n");
+     return NULL;
+ }
+diff --git a/hw/xfree86/common/xf86AutoConfig.c b/hw/xfree86/common/xf86AutoConfig.c
+index 7f4ada8..d964c6c 100644
+--- a/hw/xfree86/common/xf86AutoConfig.c
++++ b/hw/xfree86/common/xf86AutoConfig.c
+@@ -192,7 +192,24 @@ videoPtrToDriverList(struct pci_device *dev,
+           break;
+       case 0x102b:                driverList[0] = "mga";      break;
+       case 0x10c8:                driverList[0] = "neomagic"; break;
+-      case 0x10de: case 0x12d2:   driverList[0] = "nv";       break;
++      case 0x10de: case 0x12d2:
++          switch (dev->device_id) {
++          /* NV1 */
++          case 0x0008:
++          case 0x0009:
++              driverList[0] = "vesa";
++              break;
++          /* NV3 */
++          case 0x0018:
++          case 0x0019:
++              driverList[0] = "nv";
++              break;
++          default:
++              driverList[0] = "nouveau";
++              driverList[1] = "nv";
++              break;
++          }
++          break;
+       case 0x1106:                driverList[0] = "openchrome"; break;
+         case 0x1b36:              driverList[0] = "qxl"; break;
+       case 0x1163:                driverList[0] = "rendition"; break;
+-- 
+1.6.5.2
+
diff --git a/pkgs/core/xorg-server/patches/xserver-1.6.99-default-modes.patch b/pkgs/core/xorg-server/patches/xserver-1.6.99-default-modes.patch
new file mode 100644 (file)
index 0000000..0f0ba27
--- /dev/null
@@ -0,0 +1,35 @@
+From ca85ebddd804305322014c6a71b4122a56c5e634 Mon Sep 17 00:00:00 2001
+From: Adam Jackson <ajax@redhat.com>
+Date: Thu, 4 Mar 2010 15:18:38 +1000
+Subject: [PATCH] tweak default mode list yet again
+
+---
+ hw/xfree86/modes/xf86Crtc.c |    5 ++++-
+ 1 files changed, 4 insertions(+), 1 deletions(-)
+
+diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
+index 03277be..571ffd0 100644
+--- a/hw/xfree86/modes/xf86Crtc.c
++++ b/hw/xfree86/modes/xf86Crtc.c
+@@ -1582,7 +1582,7 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY)
+       int                 min_clock = 0;
+       int                 max_clock = 0;
+       double              clock;
+-      Bool                add_default_modes = TRUE;
++      Bool                add_default_modes;
+       Bool                debug_modes = config->debug_modes ||
+                                         xf86Initialising;
+       enum det_monrec_source sync_source = sync_default;
+@@ -1628,6 +1628,9 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY)
+       }
+       
+       output_modes = (*output->funcs->get_modes) (output);
++
++      /* if the driver found modes, don't second-guess it */
++      add_default_modes = (output_modes == NULL);
+       
+       edid_monitor = output->MonInfo;
+       
+-- 
+1.6.6.1
+
diff --git a/pkgs/core/xorg-server/patches/xserver-1.6.99-randr-error-debugging.patch b/pkgs/core/xorg-server/patches/xserver-1.6.99-randr-error-debugging.patch
new file mode 100644 (file)
index 0000000..0e7a6ba
--- /dev/null
@@ -0,0 +1,42 @@
+From 16be69ef1e2ea9f19cd596b99b5ede7567d374b8 Mon Sep 17 00:00:00 2001
+From: Adam Jackson <ajax@redhat.com>
+Date: Mon, 27 Jul 2009 16:52:42 -0400
+Subject: [PATCH 11/16] additional randr debugging
+
+---
+ randr/randr.c |   16 +++++++++++++++-
+ 1 files changed, 15 insertions(+), 1 deletions(-)
+
+diff --git a/randr/randr.c b/randr/randr.c
+index 1c1d0c4..accf614 100644
+--- a/randr/randr.c
++++ b/randr/randr.c
+@@ -477,10 +477,24 @@ RRVerticalRefresh (xRRModeInfo *mode)
+ static int
+ ProcRRDispatch (ClientPtr client)
+ {
++    int ret;
+     REQUEST(xReq);
+     if (stuff->data >= RRNumberRequests || !ProcRandrVector[stuff->data])
+       return BadRequest;
+-    return (*ProcRandrVector[stuff->data]) (client);
++    ret = ProcRandrVector[stuff->data](client);
++
++    if (ret) {
++        int i;
++        ErrorF("RANDR failure: %d (extension base %d)\n", ret, RRErrorBase);
++        for (i = 0; i < stuff->length; i++) {
++            ErrorF("%08x ", ((unsigned int *)stuff) + i);
++            if ((i+1) % 4 == 0)
++               ErrorF("\n");
++        }
++        ErrorF("\n");
++    }
++
++    return ret;
+ }
+ static int
+-- 
+1.6.4.2
+
diff --git a/pkgs/core/xorg-server/patches/xserver-1.6.99-right-of.patch b/pkgs/core/xorg-server/patches/xserver-1.6.99-right-of.patch
new file mode 100644 (file)
index 0000000..06c1183
--- /dev/null
@@ -0,0 +1,172 @@
+From 1766ae8a69daa06730e41d094fdddf53db3a1a9e Mon Sep 17 00:00:00 2001
+From: Adam Jackson <ajax@redhat.com>
+Date: Tue, 28 Jul 2009 11:07:13 -0400
+Subject: [PATCH] RANDR: right-of placement by default
+
+[Enhanced to add a new prefer clone option for drivers. This
+allows for servers like RN50 where two heads are disjoint. - airlied]
+
+[Enhanced to ignore rightof on single crtc cards - airlied]
+---
+ hw/xfree86/common/xf86str.h |    9 ++++-
+ hw/xfree86/modes/xf86Crtc.c |   77 +++++++++++++++++++++++++++++++++++++++----
+ 2 files changed, 77 insertions(+), 9 deletions(-)
+
+diff --git a/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h
+index 5c3aa00..8224668 100644
+--- a/hw/xfree86/common/xf86str.h
++++ b/hw/xfree86/common/xf86str.h
+@@ -503,10 +503,13 @@ typedef struct _confdrirec {
+ } confDRIRec, *confDRIPtr;
+ /* These values should be adjusted when new fields are added to ScrnInfoRec */
+-#define NUM_RESERVED_INTS             15
++#define NUM_RESERVED_INTS             14
+ #define NUM_RESERVED_POINTERS         14
+ #define NUM_RESERVED_FUNCS            11
++/* let clients know they can use this */
++#define XF86_SCRN_HAS_PREFER_CLONE 1
++
+ typedef pointer (*funcPointer)(void);
+ /* flags for depth 24 pixmap options */
+@@ -672,7 +675,6 @@ typedef void xf86SetOverscanProc          (ScrnInfoPtr, int);
+  * are to be dependent on compile-time defines.
+  */
+-
+ typedef struct _ScrnInfoRec {
+     int                       driverVersion;
+     char *            driverName;             /* canonical name used in */
+@@ -778,6 +780,9 @@ typedef struct _ScrnInfoRec {
+     /* -nr support */
+     int                 canDoBGNoneRoot;
++    /* initial rightof support disable */
++    int                 preferClone;
++
+     /*
+      * These can be used when the minor ABI version is incremented.
+      * The NUM_* parameters must be reduced appropriately to keep the
+diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
+index a66c979..4d14f57 100644
+--- a/hw/xfree86/modes/xf86Crtc.c
++++ b/hw/xfree86/modes/xf86Crtc.c
+@@ -1146,6 +1146,15 @@ xf86InitialOutputPositions (ScrnInfoPtr scrn, DisplayModePtr *modes)
+     int                       o;
+     int                       min_x, min_y;
+     
++    /* check for initial right-of heuristic */
++    for (o = 0; o < config->num_output; o++)
++    {
++      xf86OutputPtr   output = config->output[o];
++
++      if (output->initial_x || output->initial_y)
++            return TRUE;
++    }
++
+     for (o = 0; o < config->num_output; o++)
+     {
+       xf86OutputPtr   output = config->output[o];
+@@ -2028,6 +2037,60 @@ bestModeForAspect(xf86CrtcConfigPtr config, Bool *enabled, float aspect)
+     return match;
+ }
++static int
++numEnabledOutputs(xf86CrtcConfigPtr config, Bool *enabled)
++{
++    int i = 0, p;
++
++    for (i = 0, p = -1; nextEnabledOutput(config, enabled, &p); i++) ;
++
++    return i;
++}
++
++static Bool
++xf86TargetRightOf(ScrnInfoPtr scrn, xf86CrtcConfigPtr config,
++                DisplayModePtr *modes, Bool *enabled,
++                int width, int height)
++{
++    int o;
++    int w = 0;
++
++    if (config->num_crtc == 1)
++      return FALSE;
++
++    if (scrn->preferClone)
++      return FALSE;
++
++    if (numEnabledOutputs(config, enabled) < 2)
++      return FALSE;
++
++    for (o = -1; nextEnabledOutput(config, enabled, &o); ) {
++      DisplayModePtr mode =
++          xf86OutputHasPreferredMode(config->output[o], width, height);
++
++      if (!mode)
++          return FALSE;
++
++      w += mode->HDisplay;
++    }
++
++    if (w > width)
++      return FALSE;
++
++    w = 0;
++    for (o = -1; nextEnabledOutput(config, enabled, &o); ) {
++      DisplayModePtr mode =
++          xf86OutputHasPreferredMode(config->output[o], width, height);
++
++      config->output[o]->initial_x = w;
++      w += mode->HDisplay;
++
++      modes[o] = mode;
++    }
++
++    return TRUE;
++}
++
+ static Bool
+ xf86TargetPreferred(ScrnInfoPtr scrn, xf86CrtcConfigPtr config,
+                   DisplayModePtr *modes, Bool *enabled,
+@@ -2085,13 +2148,9 @@ xf86TargetPreferred(ScrnInfoPtr scrn, xf86CrtcConfigPtr config,
+      * biggest mode for its aspect ratio, assuming one exists.
+      */
+     if (!ret) do {
+-      int i = 0;
+       float aspect = 0.0;
+-      /* count the number of enabled outputs */
+-      for (i = 0, p = -1; nextEnabledOutput(config, enabled, &p); i++) ;
+-
+-      if (i != 1)
++      if (numEnabledOutputs(config, enabled) != 1)
+           break;
+       p = -1;
+@@ -2378,6 +2437,8 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
+     if (xf86TargetUserpref(scrn, config, modes, enabled, width, height))
+       xf86DrvMsg(i, X_INFO, "Using user preference for initial modes\n");
++    else if (xf86TargetRightOf(scrn, config, modes, enabled, width, height))
++      xf86DrvMsg(i, X_INFO, "Using spanning desktop for initial modes\n");
+     else if (xf86TargetPreferred(scrn, config, modes, enabled, width, height))
+       xf86DrvMsg(i, X_INFO, "Using exact sizes for initial modes\n");
+     else if (xf86TargetAspect(scrn, config, modes, enabled, width, height))
+@@ -2394,8 +2455,10 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
+                       config->output[o]->name);
+       else
+           xf86DrvMsg (scrn->scrnIndex, X_INFO,
+-                      "Output %s using initial mode %s\n",
+-                      config->output[o]->name, modes[o]->name);
++                      "Output %s using initial mode %s +%d+%d\n",
++                      config->output[o]->name, modes[o]->name,
++                        config->output[o]->initial_x,
++                        config->output[o]->initial_y);
+     }
+     /*
+-- 
+1.7.0.1
+
diff --git a/pkgs/core/xorg-server/patches/xserver-1.7.0-randr-gamma-restore.patch b/pkgs/core/xorg-server/patches/xserver-1.7.0-randr-gamma-restore.patch
new file mode 100644 (file)
index 0000000..5206141
--- /dev/null
@@ -0,0 +1,36 @@
+From 18d2bd8cb513a0436739916620532247f13dbf03 Mon Sep 17 00:00:00 2001
+From: Fedora X Ninjas <x@fedoraproject.org>
+Date: Thu, 8 Oct 2009 15:25:24 -0400
+Subject: [PATCH] randr gamma reload hack
+
+---
+ hw/xfree86/loader/sdksyms.c    |    4 ++++
+ hw/xfree86/modes/xf86RandR12.c |    6 ++++++
+ 2 files changed, 10 insertions(+), 0 deletions(-)
+
+diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
+index 6ea9d26..41bac11 100644
+--- a/hw/xfree86/modes/xf86RandR12.c
++++ b/hw/xfree86/modes/xf86RandR12.c
+@@ -1746,12 +1746,18 @@ xf86RandR12EnterVT (int screen_index, int flags)
+ {
+     ScreenPtr        pScreen = screenInfo.screens[screen_index];
+     XF86RandRInfoPtr randrp  = XF86RANDRINFO(pScreen);
++    rrScrPrivPtr     rp = rrGetScrPriv(pScreen);
+     if (randrp->orig_EnterVT) {
+       if (!randrp->orig_EnterVT (screen_index, flags))
+           return FALSE;
+     }
++    /* reload gamma */
++    int i;
++    for (i = 0; i < rp->numCrtcs; i++)
++      xf86RandR12CrtcSetGamma(pScreen, rp->crtcs[i]);
++
+     return RRGetInfo (pScreen, TRUE); /* force a re-probe of outputs and notify clients about changes */
+ }
+-- 
+1.6.5.rc2
+
diff --git a/pkgs/core/xorg-server/patches/xserver-1.7.1-gamma-kdm-fix.patch b/pkgs/core/xorg-server/patches/xserver-1.7.1-gamma-kdm-fix.patch
new file mode 100644 (file)
index 0000000..c62837e
--- /dev/null
@@ -0,0 +1,34 @@
+From acc64ce5be7383c09e88a23aab06ebc2403f2ca3 Mon Sep 17 00:00:00 2001
+From: Bill Nottingham <notting@redhat.com>
+Date: Fri, 6 Nov 2009 10:32:27 +1000
+Subject: [PATCH] fix KDM gamma issue on vt switch
+
+---
+ hw/xfree86/modes/xf86RandR12.c |    4 ++++
+ 1 files changed, 4 insertions(+), 0 deletions(-)
+
+diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
+index 6ea9d26..ece12b9 100644
+--- a/hw/xfree86/modes/xf86RandR12.c
++++ b/hw/xfree86/modes/xf86RandR12.c
+@@ -1761,6 +1761,7 @@ xf86RandR12Init12 (ScreenPtr pScreen)
+     ScrnInfoPtr               pScrn = xf86Screens[pScreen->myNum];
+     rrScrPrivPtr      rp = rrGetScrPriv(pScreen);
+     XF86RandRInfoPtr  randrp  = XF86RANDRINFO(pScreen);
++    int i;
+     rp->rrGetInfo = xf86RandR12GetInfo12;
+     rp->rrScreenSetSize = xf86RandR12ScreenSetSize;
+@@ -1790,6 +1791,9 @@ xf86RandR12Init12 (ScreenPtr pScreen)
+      */
+     if (!xf86RandR12SetInfo12 (pScreen))
+       return FALSE;
++    for (i = 0; i < rp->numCrtcs; i++) {
++      xf86RandR12CrtcGetGamma(pScreen, rp->crtcs[i]);
++    }
+     return TRUE;
+ }
+-- 
+1.6.5.1
+
diff --git a/pkgs/core/xorg-server/patches/xserver-1.7.1-multilib.patch b/pkgs/core/xorg-server/patches/xserver-1.7.1-multilib.patch
new file mode 100644 (file)
index 0000000..6435999
--- /dev/null
@@ -0,0 +1,55 @@
+From 6d9585ba6a5784328de479c6b648d7b7d6cec64c Mon Sep 17 00:00:00 2001
+From: Adam Jackson <ajax@redhat.com>
+Date: Thu, 29 Oct 2009 19:04:10 -0400
+Subject: [PATCH] multilib fix for -devel subpackage
+
+---
+ include/colormapst.h     |    4 ++--
+ include/xorg-server.h.in |    7 ++++---
+ 2 files changed, 6 insertions(+), 5 deletions(-)
+
+diff --git a/include/colormapst.h b/include/colormapst.h
+index f1fc8eb..274cd65 100644
+--- a/include/colormapst.h
++++ b/include/colormapst.h
+@@ -103,12 +103,12 @@ typedef struct _ColormapRec
+ {
+     VisualPtr pVisual;
+     short     class;          /* PseudoColor or DirectColor */
+-#if defined(_XSERVER64)
++#ifdef __LP64__
+     short     pad0;
+     XID               pad1;
+ #endif
+     XID               mid;            /* client's name for colormap */
+-#if defined(_XSERVER64) && (X_BYTE_ORDER == X_LITTLE_ENDIAN)
++#if defined(__LP64__) && (X_BYTE_ORDER == X_LITTLE_ENDIAN)
+     XID               pad2;
+ #endif
+     ScreenPtr pScreen;        /* screen map is associated with */
+diff --git a/include/xorg-server.h.in b/include/xorg-server.h.in
+index 76cab16..081b8f3 100644
+--- a/include/xorg-server.h.in
++++ b/include/xorg-server.h.in
+@@ -157,9 +157,6 @@
+ /* Name of X server */
+ #undef __XSERVERNAME__
+-/* Define to 1 if unsigned long is 64 bits. */
+-#undef _XSERVER64
+-
+ /* Building vgahw module */
+ #undef WITH_VGAHW
+@@ -187,4 +184,8 @@
+ /* X Access Control Extension */
+ #undef XACE
++#ifdef __LP64__
++#define _XSERVER64 1
++#endif
++
+ #endif /* _XORG_SERVER_H_ */
+-- 
+1.6.5.2
+
diff --git a/pkgs/core/xorg-server/patches/xserver-1.8-disable-vboxvideo.patch b/pkgs/core/xorg-server/patches/xserver-1.8-disable-vboxvideo.patch
new file mode 100644 (file)
index 0000000..60c0dce
--- /dev/null
@@ -0,0 +1,25 @@
+From 1f315578bf759c85261b1f2295efbf0dba852f73 Mon Sep 17 00:00:00 2001
+From: Adam Williamson <adamwill@shaw.ca>
+Date: Thu, 25 Feb 2010 10:34:49 -0800
+Subject: [PATCH] disable vboxvideo driver in autodetect code
+
+---
+ hw/xfree86/common/xf86AutoConfig.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/hw/xfree86/common/xf86AutoConfig.c b/hw/xfree86/common/xf86AutoConfig.c
+index 7f4ada8..4e944ea 100644
+--- a/hw/xfree86/common/xf86AutoConfig.c
++++ b/hw/xfree86/common/xf86AutoConfig.c
+@@ -220,7 +220,7 @@ videoPtrToDriverList(struct pci_device *dev,
+       case 0x1011:                driverList[0] = "tga"; break;
+       case 0x1023:                driverList[0] = "trident"; break;
+       case 0x100c:                driverList[0] = "tseng"; break;
+-      case 0x80ee:                driverList[0] = "vboxvideo"; break;
++      case 0x80ee:                driverList[0] = "vesa"; break;
+       case 0x15ad:                driverList[0] = "vmware"; break;
+       case 0x18ca:
+           if (dev->device_id == 0x47)
+-- 
+1.7.0
+
diff --git a/pkgs/core/xorg-server/patches/xserver-1.8-no-connected-outputs.patch b/pkgs/core/xorg-server/patches/xserver-1.8-no-connected-outputs.patch
new file mode 100644 (file)
index 0000000..3ee8542
--- /dev/null
@@ -0,0 +1,142 @@
+From b27f93c6dbe0a6e416db2c65738e996c70a403c1 Mon Sep 17 00:00:00 2001
+From: Fedora X Ninjas <airlied@redhat.com>
+Date: Thu, 6 May 2010 12:55:34 +1000
+Subject: [PATCH] xf86: allow for no outputs connected at startup operation.
+
+When nothing is connected at startup and we canGrow, allow the server to start with a 1024x768 framebuffer, and when the drivers send hotplug events this will expand to the correct size dynamically.
+
+Signed-off-by: Dave Airlie <airlied@redhat.com>
+---
+ hw/xfree86/modes/xf86Crtc.c |   66 ++++++++++++++++++++++++++++++------------
+ 1 files changed, 47 insertions(+), 19 deletions(-)
+
+diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
+index 571ffd0..99082ec 100644
+--- a/hw/xfree86/modes/xf86Crtc.c
++++ b/hw/xfree86/modes/xf86Crtc.c
+@@ -48,6 +48,8 @@
+ #include "xf86xv.h"
++#define NO_OUTPUT_DEFAULT_WIDTH 1024
++#define NO_OUTPUT_DEFAULT_HEIGHT 768
+ /*
+  * Initialize xf86CrtcConfig structure
+  */
+@@ -1946,7 +1948,7 @@ xf86SetScrnInfoModes (ScrnInfoPtr scrn)
+ #endif
+ }
+-static void
++static Bool
+ xf86CollectEnabledOutputs(ScrnInfoPtr scrn, xf86CrtcConfigPtr config,
+                         Bool *enabled)
+ {
+@@ -1961,8 +1963,10 @@ xf86CollectEnabledOutputs(ScrnInfoPtr scrn, xf86CrtcConfigPtr config,
+                  "No outputs definitely connected, trying again...\n");
+       for (o = 0; o < config->num_output; o++)
+-          enabled[o] = xf86OutputEnabled(config->output[o], FALSE);
++          any_enabled |= enabled[o] = xf86OutputEnabled(config->output[o], FALSE);
+     }
++
++    return any_enabled;
+ }
+ static Bool
+@@ -2409,6 +2413,8 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
+     Bool              *enabled;
+     int                       width, height;
+     int                       i = scrn->scrnIndex;
++    Bool have_outputs = TRUE;
++    Bool ret;
+     /* Set up the device options */
+     config->options = xnfalloc (sizeof (xf86DeviceOptions));
+@@ -2433,20 +2439,26 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
+     modes = xnfcalloc (config->num_output, sizeof (DisplayModePtr));
+     enabled = xnfcalloc (config->num_output, sizeof (Bool));
+     
+-    xf86CollectEnabledOutputs(scrn, config, enabled);
+-
+-    if (xf86TargetUserpref(scrn, config, modes, enabled, width, height))
+-      xf86DrvMsg(i, X_INFO, "Using user preference for initial modes\n");
+-    else if (xf86TargetRightOf(scrn, config, modes, enabled, width, height))
+-      xf86DrvMsg(i, X_INFO, "Using spanning desktop for initial modes\n");
+-    else if (xf86TargetPreferred(scrn, config, modes, enabled, width, height))
+-      xf86DrvMsg(i, X_INFO, "Using exact sizes for initial modes\n");
+-    else if (xf86TargetAspect(scrn, config, modes, enabled, width, height))
+-      xf86DrvMsg(i, X_INFO, "Using fuzzy aspect match for initial modes\n");
+-    else if (xf86TargetFallback(scrn, config, modes, enabled, width, height))
+-      xf86DrvMsg(i, X_INFO, "Using sloppy heuristic for initial modes\n");
+-    else
+-      xf86DrvMsg(i, X_WARNING, "Unable to find initial modes\n");
++    ret = xf86CollectEnabledOutputs(scrn, config, enabled);
++    if (ret == FALSE && canGrow) {
++      xf86DrvMsg(i, X_WARNING, "Unable to find connected outputs - setting %dx%d initial framebuffer\n",
++                 NO_OUTPUT_DEFAULT_WIDTH, NO_OUTPUT_DEFAULT_HEIGHT);
++      have_outputs = FALSE;
++    }
++    else {
++      if (xf86TargetUserpref(scrn, config, modes, enabled, width, height))
++          xf86DrvMsg(i, X_INFO, "Using user preference for initial modes\n");
++      else if (xf86TargetRightOf(scrn, config, modes, enabled, width, height))
++          xf86DrvMsg(i, X_INFO, "Using spanning desktop for initial modes\n");
++      else if (xf86TargetPreferred(scrn, config, modes, enabled, width, height))
++          xf86DrvMsg(i, X_INFO, "Using exact sizes for initial modes\n");
++      else if (xf86TargetAspect(scrn, config, modes, enabled, width, height))
++          xf86DrvMsg(i, X_INFO, "Using fuzzy aspect match for initial modes\n");
++      else if (xf86TargetFallback(scrn, config, modes, enabled, width, height))
++          xf86DrvMsg(i, X_INFO, "Using sloppy heuristic for initial modes\n");
++      else
++          xf86DrvMsg(i, X_WARNING, "Unable to find initial modes\n");
++    }
+     for (o = -1; nextEnabledOutput(config, enabled, &o); ) {
+       if (!modes[o])
+@@ -2479,7 +2491,7 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
+     /*
+      * Assign CRTCs to fit output configuration
+      */
+-    if (!xf86PickCrtcs (scrn, crtcs, modes, 0, width, height))
++    if (have_outputs && !xf86PickCrtcs (scrn, crtcs, modes, 0, width, height))
+     {
+       xfree (crtcs);
+       xfree (modes);
+@@ -2541,6 +2553,13 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
+        */
+       xf86DefaultScreenLimits (scrn, &width, &height, canGrow);
+     
++      if (have_outputs == FALSE) {
++          if (width < NO_OUTPUT_DEFAULT_WIDTH && height < NO_OUTPUT_DEFAULT_HEIGHT) {
++              width = NO_OUTPUT_DEFAULT_WIDTH;
++              height = NO_OUTPUT_DEFAULT_HEIGHT;
++          }
++      }
++
+       scrn->display->virtualX = width;
+       scrn->display->virtualY = height;
+     }
+@@ -2566,8 +2585,17 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
+                             width, height);
+     }
+-    /* Mirror output modes to scrn mode list */
+-    xf86SetScrnInfoModes (scrn);
++    if (have_outputs) {
++      /* Mirror output modes to scrn mode list */
++      xf86SetScrnInfoModes (scrn);
++    } else {
++      /* Clear any existing modes from scrn->modes */
++      while (scrn->modes != NULL)
++          xf86DeleteMode(&scrn->modes, scrn->modes);
++      scrn->modes = xf86ModesAdd(scrn->modes,
++                                 xf86CVTMode(width, height, 60, 0, 0));
++    }
++
+     
+     xfree (crtcs);
+     xfree (modes);
+-- 
+1.7.0.1
+
diff --git a/pkgs/core/xorg-server/patches/xserver-1.8-randr-initial.patch b/pkgs/core/xorg-server/patches/xserver-1.8-randr-initial.patch
new file mode 100644 (file)
index 0000000..2db8a8c
--- /dev/null
@@ -0,0 +1,35 @@
+From f22b6f8a5899f125de63738e69aaddc2dd0a5d0a Mon Sep 17 00:00:00 2001
+From: Ben Skeggs <bskeggs@redhat.com>
+Date: Mon, 7 Jun 2010 10:10:10 +1000
+Subject: [PATCH] randr: prevent an unnecessary screen resize with multiple displays
+
+crtc->{x,y} is always 0 when xf86DefaultScreenLimits() is called, so we
+calculate too small an area for the initial framebuffer and force a resize
+to happen.
+
+This commit fixes the code to use desired{X,Y} instead, which contains the
+initial output positions.
+
+Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ hw/xfree86/modes/xf86Crtc.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
+index 51e7b5a..c2ad7bc 100644
+--- a/hw/xfree86/modes/xf86Crtc.c
++++ b/hw/xfree86/modes/xf86Crtc.c
+@@ -1041,8 +1041,8 @@ xf86DefaultScreenLimits (ScrnInfoPtr scrn, int *widthp, int *heightp,
+       if (crtc->enabled)
+       {
+-          crtc_width = crtc->x + xf86ModeWidth (&crtc->desiredMode, crtc->desiredRotation);
+-          crtc_height = crtc->y + xf86ModeHeight (&crtc->desiredMode, crtc->desiredRotation);
++          crtc_width = crtc->desiredX + xf86ModeWidth (&crtc->desiredMode, crtc->desiredRotation);
++          crtc_height = crtc->desiredY + xf86ModeHeight (&crtc->desiredMode, crtc->desiredRotation);
+       }
+       if (!canGrow) {
+           for (o = 0; o < config->num_output; o++)
+-- 
+1.6.6
+
diff --git a/pkgs/core/xorg-server/patches/xserver-1.8-udev-warning.patch b/pkgs/core/xorg-server/patches/xserver-1.8-udev-warning.patch
new file mode 100644 (file)
index 0000000..93071fd
--- /dev/null
@@ -0,0 +1,37 @@
+From 57a188877b0472edb12bdf707b1550abbeb85af8 Mon Sep 17 00:00:00 2001
+From: Fedora X Ninjas <x@fedoraproject.org>
+Date: Wed, 17 Feb 2010 11:12:36 +1000
+Subject: [PATCH] Stick giant warning into logfiles about udev configuration changes.
+
+Signed-off-by: Fedora X Ninjas <x@fedoraproject.org>
+---
+ hw/xfree86/common/xf86Config.c |   13 +++++++++++++
+ 1 files changed, 13 insertions(+), 0 deletions(-)
+
+diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
+index 132e8bc..b1722cd 100644
+--- a/hw/xfree86/common/xf86Config.c
++++ b/hw/xfree86/common/xf86Config.c
+@@ -1472,6 +1472,19 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
+                       "input devices.\n\tIf no devices become available, "
+                       "reconfigure %s or disable AutoAddDevices.\n",
+                       config_backend, config_backend);
++
++      xf86Msg(X_INFO, "\n"
++        "***************************************************************\n"
++        "***************************************************************\n"
++        "** Fedora switched to udev-based device detection with       **\n"
++        "** xorg-x11-server-1.7.99.901-1. Custom HAL configuration    **\n"
++        "** stored in /etc/hal/fdi/policy will not be seen by this    **\n"
++        "** server version. If you have such configuration you will   **\n"
++        "** need to update it to the new format.                      **\n"
++        "** For more information, see the Fedora wiki page            **\n"
++        "** https://fedoraproject.org/wiki/Input_device_configuration **\n"
++        "***************************************************************\n"
++        "***************************************************************\n");
+ #else
+       xf86Msg(X_INFO, "Hotplugging is disabled and no input devices were configured.\n"
+                       "\tTry disabling AllowEmptyInput.\n");
+-- 
+1.6.6.1
+
diff --git a/pkgs/core/xorg-server/patches/xserver-1.8.2-XTEST-PointerKeys-fixes.patch b/pkgs/core/xorg-server/patches/xserver-1.8.2-XTEST-PointerKeys-fixes.patch
new file mode 100644 (file)
index 0000000..ece8a6c
--- /dev/null
@@ -0,0 +1,909 @@
+From deab888bb3bb2a56963da50ff551bd66fbd858a1 Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Tue, 29 Jun 2010 13:49:27 +1000
+Subject: [PATCH 1/5] xkb: Mark switch case fallthrough with comment.
+
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+---
+ xkb/xkbActions.c |    2 ++
+ 1 files changed, 2 insertions(+), 0 deletions(-)
+
+diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
+index 4c7bce2..6a7f36d 100644
+--- a/xkb/xkbActions.c
++++ b/xkb/xkbActions.c
+@@ -625,6 +625,8 @@ _XkbFilterPointerBtn(      XkbSrvInfoPtr   xkbi,
+                   break;
+               }
+               xkbi->lockedPtrButtons&= ~(1<<button);
++
++              /* fallthrough */
+           case XkbSA_PtrBtn:
+               XkbDDXFakeDeviceButton(xkbi->device, 0, button);
+               break;
+-- 
+1.7.1
+
+From 50b6311dbd2594acc36d6856fdde8623459f1374 Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Tue, 29 Jun 2010 12:12:53 +1000
+Subject: [PATCH 2/5] xkb: merge lockedPtrButtons state from all attached SDs.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Problem:
+lockedPtrButtons keeps the state of the buttons locked by a PointerKeys button
+press. Unconditionally clearing the bits may cause stuck buttons in this
+sequence of events:
+
+1. type Shift + NumLock to enable PointerKeys
+2. type 0/Ins on keypad to emulate Button 1 press
+        â†’ button1 press event to client
+3. press and release button 1 on physical mouse
+        â†’ button1 release event to client
+
+Button 1 on the MD is now stuck and cannot be released.
+
+Cause:
+XKB PointerKeys button events are posted through the XTEST pointer device.
+Once a press is generated, the XTEST device's button is down. The DIX merges
+the button state of all attached SDs, hence the MD will have a button down
+while the XTEST device has a button down.
+
+PointerKey button events are only generated on the master device to avoid
+duplicate events (see XkbFakeDeviceButton()). If the MD has the
+lockedPtrButtons bit cleared by a release event on a physical device, no
+such event is generated when a keyboard device triggers the PointerKey
+ButtonRelease trigger. Since the event - if generated - is posted through
+the XTEST pointer device, lack of a generated ButtonRelease event on the
+XTEST pointer device means the button is never released, resulting in the
+stuck button observed above.
+
+Solution:
+This patch merges the MD's lockedPtrButtons with the one of all attached
+slave devices on release events. Thus, as long as one attached keyboard has
+a lockedPtrButtons bit set, this bit is kept in the MD. Once a PointerKey
+button is released on all keyboards, the matching release event is emulated
+from the MD through the XTEST pointer device, thus also releasing the button
+in the DIX.
+
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+---
+ include/xkbsrv.h |    3 +++
+ xkb/xkbAccessX.c |   18 +++++++++++++++++-
+ xkb/xkbActions.c |    8 ++++++++
+ xkb/xkbUtils.c   |   26 ++++++++++++++++++++++++++
+ 4 files changed, 54 insertions(+), 1 deletions(-)
+
+diff --git a/include/xkbsrv.h b/include/xkbsrv.h
+index c0cd501..f0db0e4 100644
+--- a/include/xkbsrv.h
++++ b/include/xkbsrv.h
+@@ -933,6 +933,9 @@ extern int XkbGetEffectiveGroup(
+         XkbStatePtr             /* xkbstate */,
+         CARD8                   /* keycode */);
++extern void XkbMergeLockedPtrBtns(
++        DeviceIntPtr            /* master */);
++
+ #include "xkbfile.h"
+ #include "xkbrules.h"
+diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c
+index be1dcee..e3fdc06 100644
+--- a/xkb/xkbAccessX.c
++++ b/xkb/xkbAccessX.c
+@@ -707,8 +707,24 @@ DeviceEvent     *event = &ev->device_event;
+           changed |= XkbPointerButtonMask;
+     }
+     else if (event->type == ET_ButtonRelease) {
+-      if (xkbi)
++      if (xkbi) {
+           xkbi->lockedPtrButtons&= ~(1 << (event->detail.key & 0x7));
++
++            /* Merge this MD's lockedPtrButtons with the one of all
++             * attached slave devices.
++             * The DIX uses a merged button state for MDs, not
++             * releasing buttons until the last SD has released
++             * thenm. If we unconditionally clear the
++             * lockedPtrButtons bit on the MD, a PointerKeys button
++             * release on the SD keyboard won't generate the required fake button
++             * event on the XTEST pointer, thus never processing the
++             * button event in the DIX and the XTEST pointer's
++             * buttons stay down - result is a stuck button.
++             */
++          if (IsMaster(dev))
++                XkbMergeLockedPtrBtns(dev);
++      }
++
+       changed |= XkbPointerButtonMask;
+     }
+diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
+index 6a7f36d..ab52b6a 100644
+--- a/xkb/xkbActions.c
++++ b/xkb/xkbActions.c
+@@ -626,6 +626,14 @@ _XkbFilterPointerBtn(     XkbSrvInfoPtr   xkbi,
+               }
+               xkbi->lockedPtrButtons&= ~(1<<button);
++              if (IsMaster(xkbi->device))
++              {
++                  XkbMergeLockedPtrBtns(xkbi->device);
++                    /* One SD still has lock set, don't post event */
++                  if ((xkbi->lockedPtrButtons & (1 << button)) != 0)
++                      break;
++              }
++
+               /* fallthrough */
+           case XkbSA_PtrBtn:
+               XkbDDXFakeDeviceButton(xkbi->device, 0, button);
+diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
+index b1e0e55..d7d1935 100644
+--- a/xkb/xkbUtils.c
++++ b/xkb/xkbUtils.c
+@@ -2190,3 +2190,29 @@ XkbGetEffectiveGroup(XkbSrvInfoPtr xkbi, XkbStatePtr xkbState, CARD8 keycode)
+     return effectiveGroup;
+ }
++
++/* Merge the lockedPtrButtons from all attached SDs for the given master
++ * device into the MD's state.
++ */
++void
++XkbMergeLockedPtrBtns(DeviceIntPtr master)
++{
++    DeviceIntPtr d = inputInfo.devices;
++    XkbSrvInfoPtr xkbi = NULL;
++
++    if (!IsMaster(master))
++        return;
++
++    if (!master->key)
++        return;
++
++    xkbi = master->key->xkbInfo;
++    xkbi->lockedPtrButtons = 0;
++
++    for (; d; d = d->next) {
++        if (IsMaster(d) || GetMaster(d, MASTER_KEYBOARD) != master || !d->key)
++            continue;
++
++        xkbi->lockedPtrButtons |= d->key->xkbInfo->lockedPtrButtons;
++    }
++}
+-- 
+1.7.1
+
+From 4a4224f5d786035af88c251a9ee177217e8f77fd Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed, 14 Apr 2010 10:54:29 +1000
+Subject: [PATCH 3/5] xkb: rename XkbFakeDeviceButton and XkbFakeDeviceMotion, move into xkbActions.c
+
+The name XkbDDXFakeDeviceButton and XkbDDXFakeDeviceMotion is somewhat
+misleading, there's no DDX involved in the game at all anymore.
+
+This removes XkbFakeDeviceMotion and XkbFakeDeviceButton from the API where
+it arguably shouldn't have been in the first place.
+
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+Reviewed-by: Dan Nicholson <dbn.lists@gmail.com>
+---
+ include/xkbsrv.h |   13 -------
+ xkb/Makefile.am  |    4 +--
+ xkb/ddxDevBtn.c  |   69 --------------------------------------
+ xkb/ddxFakeMtn.c |   64 -----------------------------------
+ xkb/xkbActions.c |   97 ++++++++++++++++++++++++++++++++++++++++++++++-------
+ 5 files changed, 85 insertions(+), 162 deletions(-)
+ delete mode 100644 xkb/ddxDevBtn.c
+ delete mode 100644 xkb/ddxFakeMtn.c
+
+diff --git a/include/xkbsrv.h b/include/xkbsrv.h
+index f0db0e4..d1cbd1a 100644
+--- a/include/xkbsrv.h
++++ b/include/xkbsrv.h
+@@ -768,19 +768,6 @@ extern _X_EXPORT void XkbDDXUpdateDeviceIndicators(
+       CARD32                  /* newState */
+ );
+-extern _X_EXPORT void XkbDDXFakePointerMotion(
+-      DeviceIntPtr    /* dev */,
+-      unsigned int    /* flags */,
+-      int             /* x */,
+-      int             /* y */
+-);
+-
+-extern _X_EXPORT void XkbDDXFakeDeviceButton(
+-      DeviceIntPtr    /* dev */,
+-      Bool            /* press */,
+-      int             /* button */
+-);
+-
+ extern _X_EXPORT int XkbDDXTerminateServer(
+       DeviceIntPtr    /* dev */,
+       KeyCode         /* key */,
+diff --git a/xkb/Makefile.am b/xkb/Makefile.am
+index e54ce59..fb3ccbf 100644
+--- a/xkb/Makefile.am
++++ b/xkb/Makefile.am
+@@ -5,11 +5,9 @@ AM_CFLAGS = $(DIX_CFLAGS)
+ DDX_SRCS = \
+         ddxBeep.c \
+         ddxCtrls.c \
+-        ddxFakeMtn.c \
+         ddxLEDs.c \
+         ddxLoad.c \
+-        ddxList.c \
+-        ddxDevBtn.c
++        ddxList.c
+ DIX_SRCS = \
+         xkb.c \
+diff --git a/xkb/ddxDevBtn.c b/xkb/ddxDevBtn.c
+deleted file mode 100644
+index b8a1255..0000000
+--- a/xkb/ddxDevBtn.c
++++ /dev/null
+@@ -1,69 +0,0 @@
+-/************************************************************
+-Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc.
+-
+-Permission to use, copy, modify, and distribute this
+-software and its documentation for any purpose and without
+-fee is hereby granted, provided that the above copyright
+-notice appear in all copies and that both that copyright
+-notice and this permission notice appear in supporting
+-documentation, and that the name of Silicon Graphics not be 
+-used in advertising or publicity pertaining to distribution 
+-of the software without specific prior written permission.
+-Silicon Graphics makes no representation about the suitability 
+-of this software for any purpose. It is provided "as is"
+-without any express or implied warranty.
+-
+-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 
+-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 
+-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 
+-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+-THE USE OR PERFORMANCE OF THIS SOFTWARE.
+-
+-********************************************************/
+-
+-#ifdef HAVE_DIX_CONFIG_H
+-#include <dix-config.h>
+-#endif
+-
+-#include "inputstr.h"
+-#include <xkbsrv.h>
+-#include "mi.h"
+-
+-void
+-XkbDDXFakeDeviceButton(DeviceIntPtr dev,Bool press,int button)
+-{
+-    EventListPtr        events;
+-    int                 nevents, i;
+-    DeviceIntPtr        ptr;
+-
+-    /* If dev is a slave device, and the SD is attached, do nothing. If we'd
+-     * post through the attached master pointer we'd get duplicate events.
+-     *
+-     * if dev is a master keyboard, post through the XTEST device
+-     *
+-     * if dev is a floating slave, post through the device itself.
+-     */
+-
+-    if (IsMaster(dev))
+-        ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER));
+-    else if (!dev->u.master)
+-        ptr = dev;
+-    else
+-        return;
+-
+-    events = InitEventList(GetMaximumEventsNum());
+-    OsBlockSignals();
+-    nevents = GetPointerEvents(events, ptr,
+-                               press ? ButtonPress : ButtonRelease, button,
+-                               0 /* flags */, 0 /* first */,
+-                               0 /* num_val */, NULL);
+-    OsReleaseSignals();
+-
+-    for (i = 0; i < nevents; i++)
+-        mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL);
+-
+-    FreeEventList(events, GetMaximumEventsNum());
+-}
+diff --git a/xkb/ddxFakeMtn.c b/xkb/ddxFakeMtn.c
+deleted file mode 100644
+index b383716..0000000
+--- a/xkb/ddxFakeMtn.c
++++ /dev/null
+@@ -1,64 +0,0 @@
+-/************************************************************
+-Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+-
+-Permission to use, copy, modify, and distribute this
+-software and its documentation for any purpose and without
+-fee is hereby granted, provided that the above copyright
+-notice appear in all copies and that both that copyright
+-notice and this permission notice appear in supporting
+-documentation, and that the name of Silicon Graphics not be 
+-used in advertising or publicity pertaining to distribution 
+-of the software without specific prior written permission.
+-Silicon Graphics makes no representation about the suitability 
+-of this software for any purpose. It is provided "as is"
+-without any express or implied warranty.
+-
+-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+-GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 
+-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 
+-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 
+-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+-THE USE OR PERFORMANCE OF THIS SOFTWARE.
+-
+-********************************************************/
+-
+-#ifdef HAVE_DIX_CONFIG_H
+-#include <dix-config.h>
+-#endif
+-
+-#include "inputstr.h"
+-#include <xkbsrv.h>
+-#include "mi.h"
+-
+-void
+-XkbDDXFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y)
+-{
+-    EventListPtr        events;
+-    int                 nevents, i;
+-    DeviceIntPtr        ptr;
+-    int                 gpe_flags = 0;
+-
+-    if (!dev->u.master)
+-        ptr = dev;
+-    else
+-        ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER));
+-
+-    if (flags & XkbSA_MoveAbsoluteX || flags & XkbSA_MoveAbsoluteY)
+-        gpe_flags = POINTER_ABSOLUTE;
+-    else
+-        gpe_flags = POINTER_RELATIVE;
+-
+-    events = InitEventList(GetMaximumEventsNum());
+-    OsBlockSignals();
+-    nevents = GetPointerEvents(events, ptr,
+-                               MotionNotify, 0,
+-                               gpe_flags, 0, 2, (int[]){x, y});
+-    OsReleaseSignals();
+-
+-    for (i = 0; i < nevents; i++)
+-        mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL);
+-
+-    FreeEventList(events, GetMaximumEventsNum());
+-}
+diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
+index ab52b6a..2817e39 100644
+--- a/xkb/xkbActions.c
++++ b/xkb/xkbActions.c
+@@ -40,11 +40,15 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ #include <xkbsrv.h>
+ #include "xkb.h"
+ #include <ctype.h>
++#include "mi.h"
+ #define EXTENSION_EVENT_BASE 64
+ static int xkbDevicePrivateKeyIndex;
+ DevPrivateKey xkbDevicePrivateKey = &xkbDevicePrivateKeyIndex;
++static void XkbFakeDeviceButton(DeviceIntPtr dev,Bool press,int button);
++static void XkbFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y);
++
+ void
+ xkbUnwrapProc(DeviceIntPtr device, DeviceHandleProc proc,
+                    pointer data)
+@@ -479,7 +483,7 @@ int                dx,dy;
+       dx= xkbi->mouseKeysDX;
+       dy= xkbi->mouseKeysDY;
+     }
+-    XkbDDXFakePointerMotion(xkbi->device, xkbi->mouseKeysFlags,dx,dy);
++    XkbFakePointerMotion(xkbi->device, xkbi->mouseKeysFlags,dx,dy);
+     return xkbi->desc->ctrls->mk_interval;
+ }
+@@ -507,7 +511,7 @@ Bool       accel;
+       accel= ((pAction->ptr.flags&XkbSA_NoAcceleration)==0);
+       x= XkbPtrActionX(&pAction->ptr);
+       y= XkbPtrActionY(&pAction->ptr);
+-      XkbDDXFakePointerMotion(xkbi->device, pAction->ptr.flags,x,y);
++      XkbFakePointerMotion(xkbi->device, pAction->ptr.flags,x,y);
+       AccessXCancelRepeatKey(xkbi,keycode);
+       xkbi->mouseKeysAccel= accel&&
+               (xkbi->desc->ctrls->enabled_ctrls&XkbMouseKeysAccelMask);
+@@ -554,7 +558,7 @@ _XkbFilterPointerBtn(      XkbSrvInfoPtr   xkbi,
+                       ((pAction->btn.flags&XkbSA_LockNoLock)==0)) {
+                   xkbi->lockedPtrButtons|= (1<<button);
+                   AccessXCancelRepeatKey(xkbi,keycode);
+-                  XkbDDXFakeDeviceButton(xkbi->device, 1, button);
++                  XkbFakeDeviceButton(xkbi->device, 1, button);
+                   filter->upAction.type= XkbSA_NoAction;
+               }
+               break;
+@@ -565,12 +569,12 @@ _XkbFilterPointerBtn(    XkbSrvInfoPtr   xkbi,
+                   if (pAction->btn.count>0) {
+                       nClicks= pAction->btn.count;
+                       for (i=0;i<nClicks;i++) {
+-                          XkbDDXFakeDeviceButton(xkbi->device, 1, button);
+-                          XkbDDXFakeDeviceButton(xkbi->device, 0, button);
++                          XkbFakeDeviceButton(xkbi->device, 1, button);
++                          XkbFakeDeviceButton(xkbi->device, 0, button);
+                       }
+                       filter->upAction.type= XkbSA_NoAction;
+                   }
+-                  else XkbDDXFakeDeviceButton(xkbi->device, 1, button);
++                  else XkbFakeDeviceButton(xkbi->device, 1, button);
+               }
+               break;
+           case XkbSA_SetPtrDflt:
+@@ -636,7 +640,7 @@ _XkbFilterPointerBtn(      XkbSrvInfoPtr   xkbi,
+               /* fallthrough */
+           case XkbSA_PtrBtn:
+-              XkbDDXFakeDeviceButton(xkbi->device, 0, button);
++              XkbFakeDeviceButton(xkbi->device, 0, button);
+               break;
+       }
+       filter->active = 0;
+@@ -974,7 +978,7 @@ int                button;
+               if ((pAction->devbtn.flags&XkbSA_LockNoLock)||
+                   BitIsOn(dev->button->down, button))
+                   return 0;
+-              XkbDDXFakeDeviceButton(dev,TRUE,button);
++              XkbFakeDeviceButton(dev,TRUE,button);
+               filter->upAction.type= XkbSA_NoAction;
+               break;
+           case XkbSA_DeviceBtn:
+@@ -982,12 +986,12 @@ int              button;
+                   int nClicks,i;
+                   nClicks= pAction->btn.count;
+                   for (i=0;i<nClicks;i++) {
+-                      XkbDDXFakeDeviceButton(dev,TRUE,button);
+-                      XkbDDXFakeDeviceButton(dev,FALSE,button);
++                      XkbFakeDeviceButton(dev,TRUE,button);
++                      XkbFakeDeviceButton(dev,FALSE,button);
+                   }
+                   filter->upAction.type= XkbSA_NoAction;
+               }
+-              else XkbDDXFakeDeviceButton(dev,TRUE,button);
++              else XkbFakeDeviceButton(dev,TRUE,button);
+               break;
+       }
+     }
+@@ -1006,10 +1010,10 @@ int            button;
+               if ((filter->upAction.devbtn.flags&XkbSA_LockNoUnlock)||
+                   !BitIsOn(dev->button->down, button))
+                   return 0;
+-              XkbDDXFakeDeviceButton(dev,FALSE,button);
++              XkbFakeDeviceButton(dev,FALSE,button);
+               break;
+           case XkbSA_DeviceBtn:
+-              XkbDDXFakeDeviceButton(dev,FALSE,button);
++              XkbFakeDeviceButton(dev,FALSE,button);
+               break;
+       }
+       filter->active = 0;
+@@ -1326,3 +1330,70 @@ xkbStateNotify  sn;
+     return;
+ }
++static void
++XkbFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y)
++{
++    EventListPtr        events;
++    int                 nevents, i;
++    DeviceIntPtr        ptr;
++    int                 gpe_flags = 0;
++
++    if (!dev->u.master)
++        ptr = dev;
++    else
++        ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER));
++
++    if (flags & XkbSA_MoveAbsoluteX || flags & XkbSA_MoveAbsoluteY)
++        gpe_flags = POINTER_ABSOLUTE;
++    else
++        gpe_flags = POINTER_RELATIVE;
++
++    events = InitEventList(GetMaximumEventsNum());
++    OsBlockSignals();
++    nevents = GetPointerEvents(events, ptr,
++                               MotionNotify, 0,
++                               gpe_flags, 0, 2, (int[]){x, y});
++    OsReleaseSignals();
++
++    for (i = 0; i < nevents; i++)
++        mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL);
++
++    FreeEventList(events, GetMaximumEventsNum());
++}
++
++static void
++XkbFakeDeviceButton(DeviceIntPtr dev,Bool press,int button)
++{
++    EventListPtr        events;
++    int                 nevents, i;
++    DeviceIntPtr        ptr;
++
++    /* If dev is a slave device, and the SD is attached, do nothing. If we'd
++     * post through the attached master pointer we'd get duplicate events.
++     *
++     * if dev is a master keyboard, post through the XTEST device
++     *
++     * if dev is a floating slave, post through the device itself.
++     */
++
++    if (IsMaster(dev))
++        ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER));
++    else if (!dev->u.master)
++        ptr = dev;
++    else
++        return;
++
++    events = InitEventList(GetMaximumEventsNum());
++    OsBlockSignals();
++    nevents = GetPointerEvents(events, ptr,
++                               press ? ButtonPress : ButtonRelease, button,
++                               0 /* flags */, 0 /* first */,
++                               0 /* num_val */, NULL);
++    OsReleaseSignals();
++
++
++    for (i = 0; i < nevents; i++)
++        mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL);
++
++    FreeEventList(events, GetMaximumEventsNum());
++}
+-- 
+1.7.1
+
+From dcb46252f959893f1934232698e2ae26390a8a5b Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Tue, 29 Jun 2010 15:24:51 +1000
+Subject: [PATCH 4/5] xkb: emulate PointerKeys events only on the master device.
+
+This patch replicates the behaviour for button events. Only generate a
+PointerKeys motion event on the master device, not on the slave device.
+Fixes the current issue of PointerKey motion events generating key events as
+well.
+
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+---
+ xkb/xkbActions.c |    9 ++++-----
+ 1 files changed, 4 insertions(+), 5 deletions(-)
+
+diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
+index 2817e39..391c375 100644
+--- a/xkb/xkbActions.c
++++ b/xkb/xkbActions.c
+@@ -496,9 +496,6 @@ _XkbFilterPointerMove(     XkbSrvInfoPtr   xkbi,
+ int   x,y;
+ Bool  accel;
+-    if (xkbi->device == inputInfo.keyboard)
+-        return 0;
+-
+     if (filter->keycode==0) {         /* initial press */
+       filter->keycode = keycode;
+       filter->active = 1;
+@@ -1338,10 +1335,12 @@ XkbFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y)
+     DeviceIntPtr        ptr;
+     int                 gpe_flags = 0;
+-    if (!dev->u.master)
++    if (IsMaster(dev))
++        ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER));
++    else if (!dev->u.master)
+         ptr = dev;
+     else
+-        ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER));
++        return;
+     if (flags & XkbSA_MoveAbsoluteX || flags & XkbSA_MoveAbsoluteY)
+         gpe_flags = POINTER_ABSOLUTE;
+-- 
+1.7.1
+
+From 40941fb2e9ae763add7b74850e8a0471ac754db6 Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu, 1 Jul 2010 12:44:57 +1000
+Subject: [PATCH 5/5] xkb: release XTEST pointer buttons on physical releases. (#28808)
+
+If a button release event is posted for the MD pointer, post a release event
+through the matching XTEST device. This way, a client who posts a button
+press through the XTEST extension cannot inadvertedly lock the button.
+
+This behaviour is required for historical reasons, until server 1.7 the core
+pointer would release a button press on physical events, regardless of the
+XTEST state. Clients seem to rely on this behaviour, causing seemingly stuck
+grabs.
+
+The merged behaviour is kept for multiple keyboard PointerKey events, if two
+physical keyboards hold the button down as a result of PointerKey actions,
+the button is not released until the last keyboard releases the button.
+
+X.Org Bug 28808 <http://bugs.freedesktop.org/show_bug.cgi?id=28808>
+
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+---
+ include/xkbsrv.h |    6 ++++++
+ xkb/xkbAccessX.c |   23 ++++++++++-------------
+ xkb/xkbActions.c |    4 ++--
+ 3 files changed, 18 insertions(+), 15 deletions(-)
+
+diff --git a/include/xkbsrv.h b/include/xkbsrv.h
+index d1cbd1a..a96ca56 100644
+--- a/include/xkbsrv.h
++++ b/include/xkbsrv.h
+@@ -923,6 +923,12 @@ extern int XkbGetEffectiveGroup(
+ extern void XkbMergeLockedPtrBtns(
+         DeviceIntPtr            /* master */);
++extern void XkbFakeDeviceButton(
++        DeviceIntPtr            /* dev */,
++        int                     /* press */,
++        int                     /* button */);
++
++
+ #include "xkbfile.h"
+ #include "xkbrules.h"
+diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c
+index e3fdc06..d3f9652 100644
+--- a/xkb/xkbAccessX.c
++++ b/xkb/xkbAccessX.c
+@@ -710,19 +710,16 @@ DeviceEvent     *event = &ev->device_event;
+       if (xkbi) {
+           xkbi->lockedPtrButtons&= ~(1 << (event->detail.key & 0x7));
+-            /* Merge this MD's lockedPtrButtons with the one of all
+-             * attached slave devices.
+-             * The DIX uses a merged button state for MDs, not
+-             * releasing buttons until the last SD has released
+-             * thenm. If we unconditionally clear the
+-             * lockedPtrButtons bit on the MD, a PointerKeys button
+-             * release on the SD keyboard won't generate the required fake button
+-             * event on the XTEST pointer, thus never processing the
+-             * button event in the DIX and the XTEST pointer's
+-             * buttons stay down - result is a stuck button.
+-             */
+-          if (IsMaster(dev))
+-                XkbMergeLockedPtrBtns(dev);
++            if (IsMaster(dev))
++            {
++                DeviceIntPtr source;
++                int rc;
++                rc = dixLookupDevice(&source, event->sourceid, serverClient, DixWriteAccess);
++                if (rc != Success)
++                    ErrorF("[xkb] bad sourceid '%d' on button release event.\n", event->sourceid);
++                else if (!IsXTestDevice(source, GetMaster(dev, MASTER_POINTER)))
++                    XkbFakeDeviceButton(dev, FALSE, event->detail.key);
++            }
+       }
+       changed |= XkbPointerButtonMask;
+diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
+index 391c375..5d40199 100644
+--- a/xkb/xkbActions.c
++++ b/xkb/xkbActions.c
+@@ -46,7 +46,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ static int xkbDevicePrivateKeyIndex;
+ DevPrivateKey xkbDevicePrivateKey = &xkbDevicePrivateKeyIndex;
+-static void XkbFakeDeviceButton(DeviceIntPtr dev,Bool press,int button);
++void XkbFakeDeviceButton(DeviceIntPtr dev,Bool press,int button);
+ static void XkbFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y);
+ void
+@@ -1360,7 +1360,7 @@ XkbFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y)
+     FreeEventList(events, GetMaximumEventsNum());
+ }
+-static void
++void
+ XkbFakeDeviceButton(DeviceIntPtr dev,Bool press,int button)
+ {
+     EventListPtr        events;
+-- 
+1.7.1
+
+From 7273832bcdc6f43e9a5a8fdbb56844466efb710a Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Fri, 23 Jul 2010 11:46:30 +1000
+Subject: [PATCH 1/3] xkb: post-fix PointerKeys button events with a DeviceChangedEvent.
+
+commit 14327858391ebe929b806efb53ad79e789361883
+    xkb: release XTEST pointer buttons on physical releases. (#28808)
+revealed a bug with the XTEST/PointerKeys interaction.
+
+Events resulting from PointerKeys are injected into the event processing
+stream, not appended to the event queue. The events generated for the fake
+button press include a DeviceChangedEvent (DCE), a raw button event and the
+button event itself. The DCE causes the master to switch classes to the
+attached XTEST pointer device.
+
+Once the fake button is processed, normal event processing continues with
+events in the EQ. The master still contains the XTEST classes, causing some
+events to be dropped if e.g. the number of valuators of the event in the
+queue exceeds the XTEST device's number of valuators.
+
+Example: the EQ contains the following events, processed one-by-one, left to
+right.
+
+[DCE (dev)][Btn down][Btn up][Motion][Motion][...]
+                  ^ XkbFakeDeviceButton injects [DCE (XTEST)][Btn up]
+
+Thus the event sequence processed looks like this:
+
+[DCE (dev)][Btn down][Btn up][DCE (XTEST)][Btn up][Motion][Motion][...]
+
+The first DCE causes the master to switch to the device. The button up event
+injects a DCE to the XTEST device, causing the following Motion events to be
+processed with the master still being on XTEST classes.
+
+This patch post-fixes the injected event sequence with a DCE to restore the
+classes of the original slave device, resulting in an event sequence like
+this:
+[DCE (dev)][Btn down][Btn up][DCE (XTEST)][Btn up][DCE (dev)][Motion][Motion]
+
+Note that this is a simplified description. The event sequence injected by
+the PointerKeys code is injected for the master device only and the matching
+slave device that caused the injection has already finished processing on
+the slave. Furthermore, the injection happens as part of the the XKB layer,
+before the unwrapping of the processInputProc takes us into the DIX where
+the DCE is actually handled.
+
+Bug reproducible with a device that reports more than 2 valuators. Simply
+cause button releases on the device and wait for a "too many valuators"
+warning message.
+
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+---
+ xkb/xkbActions.c |   26 +++++++++++++++++++-------
+ 1 files changed, 19 insertions(+), 7 deletions(-)
+
+diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
+index 5d40199..2afd46d 100644
+--- a/xkb/xkbActions.c
++++ b/xkb/xkbActions.c
+@@ -1365,34 +1365,46 @@ XkbFakeDeviceButton(DeviceIntPtr dev,Bool press,int button)
+ {
+     EventListPtr        events;
+     int                 nevents, i;
+-    DeviceIntPtr        ptr;
++    DeviceIntPtr        ptr, mpointer, lastSlave;
+     /* If dev is a slave device, and the SD is attached, do nothing. If we'd
+      * post through the attached master pointer we'd get duplicate events.
+      *
+      * if dev is a master keyboard, post through the XTEST device
+-     *
+      * if dev is a floating slave, post through the device itself.
++     *
++     * The event is injected into the event processing, not the EQ. Thus,
++     * ensure that we restore the master after the event sequence to the
++     * original set of classes. Otherwise, the master remains on the XTEST
++     * classes and drops events that don't fit into the XTEST layout (e.g.
++     * events with more than 2 valuators).
++     * To do so, we remember the lastSlave that posted through the master
++     * and add a DeviceChangedEvent to the end of the list.
+      */
+-    if (IsMaster(dev))
+-        ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER));
+-    else if (!dev->u.master)
++    if (IsMaster(dev)) {
++        mpointer = GetMaster(dev, MASTER_POINTER);
++        lastSlave = mpointer->u.lastSlave;
++        ptr = GetXTestDevice(mpointer);
++    } else if (!dev->u.master)
+         ptr = dev;
+     else
+         return;
+-    events = InitEventList(GetMaximumEventsNum());
++    events = InitEventList(GetMaximumEventsNum() + 1);
+     OsBlockSignals();
+     nevents = GetPointerEvents(events, ptr,
+                                press ? ButtonPress : ButtonRelease, button,
+                                0 /* flags */, 0 /* first */,
+                                0 /* num_val */, NULL);
++    if (IsMaster(dev) && (lastSlave && lastSlave != ptr))
++        CreateClassesChangedEvent(&events[nevents++], mpointer,
++                                  lastSlave, DEVCHANGE_POINTER_EVENT);
+     OsReleaseSignals();
+     for (i = 0; i < nevents; i++)
+         mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL);
+-    FreeEventList(events, GetMaximumEventsNum());
++    FreeEventList(events, GetMaximumEventsNum() + 1);
+ }
+-- 
+1.7.2
+
+From 817e031a996a5f5aa16fc789d7e570cc589d96cb Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed, 28 Jul 2010 14:24:59 +1000
+Subject: [PATCH 3/3] Xi: reset the unused classes pointer after copying
+
+After copying the unused_classes into the device, reset the original
+pointer. Otherwise we have two pointers pointing to the same field and both
+get freed on device removal.
+
+Some classes already have this behaviour since 51c8fd69.
+
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+---
+ Xi/exevents.c |    6 ++++++
+ 1 files changed, 6 insertions(+), 0 deletions(-)
+
+diff --git a/Xi/exevents.c b/Xi/exevents.c
+index 566b0ef..a6160dd 100644
+--- a/Xi/exevents.c
++++ b/Xi/exevents.c
+@@ -227,6 +227,7 @@ DeepCopyFeedbackClasses(DeviceIntPtr from, DeviceIntPtr to)
+             classes = dixLookupPrivate(&to->devPrivates,
+                                        UnusedClassesPrivateKey);
+             to->intfeed = classes->intfeed;
++            classes->intfeed = NULL;
+         }
+         i = &to->intfeed;
+@@ -263,6 +264,7 @@ DeepCopyFeedbackClasses(DeviceIntPtr from, DeviceIntPtr to)
+             classes = dixLookupPrivate(&to->devPrivates,
+                                        UnusedClassesPrivateKey);
+             to->stringfeed = classes->stringfeed;
++            classes->stringfeed = NULL;
+         }
+         s = &to->stringfeed;
+@@ -299,6 +301,7 @@ DeepCopyFeedbackClasses(DeviceIntPtr from, DeviceIntPtr to)
+             classes = dixLookupPrivate(&to->devPrivates,
+                                        UnusedClassesPrivateKey);
+             to->bell = classes->bell;
++            classes->bell = NULL;
+         }
+         b = &to->bell;
+@@ -336,6 +339,7 @@ DeepCopyFeedbackClasses(DeviceIntPtr from, DeviceIntPtr to)
+             classes = dixLookupPrivate(&to->devPrivates,
+                                        UnusedClassesPrivateKey);
+             to->leds = classes->leds;
++            classes->leds = NULL;
+         }
+         l = &to->leds;
+@@ -387,6 +391,7 @@ DeepCopyKeyboardClasses(DeviceIntPtr from, DeviceIntPtr to)
+             to->kbdfeed = classes->kbdfeed;
+             if (!to->kbdfeed)
+                 InitKeyboardDeviceStruct(to, NULL, NULL, NULL);
++            classes->kbdfeed = NULL;
+         }
+         k = &to->kbdfeed;
+@@ -517,6 +522,7 @@ DeepCopyPointerClasses(DeviceIntPtr from, DeviceIntPtr to)
+             classes = dixLookupPrivate(&to->devPrivates,
+                                        UnusedClassesPrivateKey);
+             to->ptrfeed = classes->ptrfeed;
++            classes->ptrfeed = NULL;
+         }
+         p = &to->ptrfeed;
+-- 
+1.7.2
+
index f1442e16d212aa58275ff150ed1eb3d35e3bd016..93cde25f42f027c3ea1945e6ca7924e229647712 100644 (file)
@@ -34,7 +34,9 @@ PKG_URL        = http://www.x.org
 PKG_LICENSE    = MIT
 PKG_SUMMARY    = X.Org X11 X server.
 
-PKG_BUILD_DEPS+= pkg-config xorg-x11-proto-devel xorg-x11-xtrans-devel
+PKG_BUILD_DEPS+= autoconf automake pkg-config \
+       xorg-x11-font-utils \
+       xorg-x11-util-macros xorg-x11-proto-devel xorg-x11-xtrans-devel
 PKG_DEPS      += libX11 libXau libXfont libpciaccess libxcb libxkbfile pixman udev
 
 define PKG_DESCRIPTION
@@ -46,9 +48,27 @@ endef
 
 PKG_TARBALL    = $(THISAPP).tar.bz2
 
+CFLAGS        += -Wstrict-overflow -rdynamic
+
 CONFIGURE_OPTIONS += \
+       --enable-xvfb \
+       --disable-xnest \
+       --enable-kdrive \
+       --disable-xephyr \
+       --disable-xsdl \
+       --disable-xfake \
+       --disable-xfbdev \
+       --enable-xorg \
+       --disable-static \
+       --with-pic \
+       --with-int10=x86emu \
+       --with-default-font-path="catalogue:/etc/X11/fontpath.d,built-ins" \
+       --with-module-dir=/usr/lib/xorg/modules \
+       --with-builderstring="Build ID: $(PKG_NAME) $(PKG_VER)-$(PKG_REL)" \
+       --with-os-name="$(hostname -s) $(uname -r)" \
+       --with-xkb-output=/var/lib/xkb \
+       --enable-install-libxf86config \
        --localstatedir=/var \
-       \
        --disable-aiglx \
        --disable-composite \
        --disable-xdmcp \
@@ -58,14 +78,27 @@ CONFIGURE_OPTIONS += \
        --disable-dri \
        --disable-dri2 \
        --disable-xinerama \
-       --disable-xf86vidmode \
        --disable-dbe \
        --disable-config-dbus \
        --disable-config-hal \
-       --disable-xfree86-utils \
        --disable-xquartz \
-       --enable-config-udev
+       --enable-config-udev \
+       --with-vendor-name="$(DISTRO_NAME) Project"
+
+define STAGE_PREPARE_CMDS
+       cd $(DIR_APP) && autoreconf -vfi
+endef
 
-define STAGE_INSTALL_CMDS
+define STAGE_INSTALL
+       cd $(DIR_APP) && make install DESTDIR=$(BUILDROOT) \
+               moduledir=/usr/lib/xorg/modules
+
+       rm -vf $(BUILDROOT)/usr/lib/xorg/modules/libxf8_16bpp.so
        rm -vrf $(BUILDROOT)/var/log
+
+       -mkdir -pv $(BUILDROOT)/etc/X11/xorg.conf.d $(BUILDROOT)/usr/share/xorg
+       cd $(DIR_APP) && install -m 0444 hw/xfree86/common/{vesa,extra}modes \
+               $(BUILDROOT)/usr/share/xorg/
+       cd $(DIR_APP) && install -m 644 $(DIR_SOURCE)/10-quirks.conf \
+               $(BUILDROOT)/usr/share/X11/xorg.conf.d
 endef