From: Schantl Stefan Date: Sun, 22 Aug 2010 15:02:19 +0000 (+0200) Subject: xorg-server: Improve functions, add patches. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=313ed234cf970a25a8100907ea005124a500de90;p=ipfire-3.x.git xorg-server: Improve functions, add patches. --- diff --git a/pkgs/core/xorg-server/10-quirks.conf b/pkgs/core/xorg-server/10-quirks.conf new file mode 100644 index 000000000..82d3ec26c --- /dev/null +++ b/pkgs/core/xorg-server/10-quirks.conf @@ -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 index 000000000..d040900bf --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.4.99-pic-libxf86config.patch @@ -0,0 +1,25 @@ +From 04bd8e2fa6be557f58a0e417b0f3befc56f5ef59 Mon Sep 17 00:00:00 2001 +From: Fedora X Ninjas +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 index 000000000..d532fe1d6 --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.4.99-ssh-isnt-local.patch @@ -0,0 +1,48 @@ +From 4306b434038de7e2b17d3c4a6cfd87db469d3bda Mon Sep 17 00:00:00 2001 +From: Adam Jackson +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 index 000000000..ae65d0be4 --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.5.0-bg-none-root.patch @@ -0,0 +1,155 @@ +From eff3bb9c6f0b71a57705885a3fe6e6469d252d2b Mon Sep 17 00:00:00 2001 +From: Fedora X Ninjas +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 index 000000000..c6178b879 --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.5.0-projector-fb-size.patch @@ -0,0 +1,32 @@ +From dc5cedd61e00afec33cbfaa7fdfbb6c357074dbd Mon Sep 17 00:00:00 2001 +From: =?utf-8?q?S=C3=B8ren=20Sandmann=20Pedersen?= +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 index 000000000..11fe5adac --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.5.1-mode-debug.patch @@ -0,0 +1,26 @@ +From 079910986a1b8f5042e16ee2ba3ad9ed843b67ca Mon Sep 17 00:00:00 2001 +From: Adam Jackson +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 index 000000000..09e7b4968 --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.6.0-displayfd.patch @@ -0,0 +1,172 @@ +From 1766352059d0db67bff3f7dd0820563a30f54858 Mon Sep 17 00:00:00 2001 +From: Adam Jackson +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 index 000000000..cc80e6cef --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.6.0-less-acpi-brokenness.patch @@ -0,0 +1,31 @@ +From a8079882f1884edc62a9de28af915bd8b65dfbbe Mon Sep 17 00:00:00 2001 +From: Adam Jackson +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 index 000000000..35a1ff991 --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.6.1-nouveau.patch @@ -0,0 +1,109 @@ +From a685b5cf34532cef96fc9b05f735088ac0c0c7ad Mon Sep 17 00:00:00 2001 +From: Fedora X Ninjas +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 index 000000000..0f0ba27c7 --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.6.99-default-modes.patch @@ -0,0 +1,35 @@ +From ca85ebddd804305322014c6a71b4122a56c5e634 Mon Sep 17 00:00:00 2001 +From: Adam Jackson +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 index 000000000..0e7a6ba99 --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.6.99-randr-error-debugging.patch @@ -0,0 +1,42 @@ +From 16be69ef1e2ea9f19cd596b99b5ede7567d374b8 Mon Sep 17 00:00:00 2001 +From: Adam Jackson +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 index 000000000..06c118316 --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.6.99-right-of.patch @@ -0,0 +1,172 @@ +From 1766ae8a69daa06730e41d094fdddf53db3a1a9e Mon Sep 17 00:00:00 2001 +From: Adam Jackson +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 index 000000000..520614188 --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.7.0-randr-gamma-restore.patch @@ -0,0 +1,36 @@ +From 18d2bd8cb513a0436739916620532247f13dbf03 Mon Sep 17 00:00:00 2001 +From: Fedora X Ninjas +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 index 000000000..c62837e40 --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.7.1-gamma-kdm-fix.patch @@ -0,0 +1,34 @@ +From acc64ce5be7383c09e88a23aab06ebc2403f2ca3 Mon Sep 17 00:00:00 2001 +From: Bill Nottingham +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 index 000000000..643599916 --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.7.1-multilib.patch @@ -0,0 +1,55 @@ +From 6d9585ba6a5784328de479c6b648d7b7d6cec64c Mon Sep 17 00:00:00 2001 +From: Adam Jackson +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 index 000000000..60c0dceb3 --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.8-disable-vboxvideo.patch @@ -0,0 +1,25 @@ +From 1f315578bf759c85261b1f2295efbf0dba852f73 Mon Sep 17 00:00:00 2001 +From: Adam Williamson +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 index 000000000..3ee854243 --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.8-no-connected-outputs.patch @@ -0,0 +1,142 @@ +From b27f93c6dbe0a6e416db2c65738e996c70a403c1 Mon Sep 17 00:00:00 2001 +From: Fedora X Ninjas +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 +--- + 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 index 000000000..2db8a8c14 --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.8-randr-initial.patch @@ -0,0 +1,35 @@ +From f22b6f8a5899f125de63738e69aaddc2dd0a5d0a Mon Sep 17 00:00:00 2001 +From: Ben Skeggs +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 +--- + 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 index 000000000..93071fd32 --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.8-udev-warning.patch @@ -0,0 +1,37 @@ +From 57a188877b0472edb12bdf707b1550abbeb85af8 Mon Sep 17 00:00:00 2001 +From: Fedora X Ninjas +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 +--- + 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 index 000000000..ece8a6ca9 --- /dev/null +++ b/pkgs/core/xorg-server/patches/xserver-1.8.2-XTEST-PointerKeys-fixes.patch @@ -0,0 +1,909 @@ +From deab888bb3bb2a56963da50ff551bd66fbd858a1 Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +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 +--- + 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<device, 0, button); + break; +-- +1.7.1 + +From 50b6311dbd2594acc36d6856fdde8623459f1374 Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +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 +--- + 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<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 +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 +Reviewed-by: Daniel Stone +Reviewed-by: Dan Nicholson +--- + 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 +-#endif +- +-#include "inputstr.h" +-#include +-#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 +-#endif +- +-#include "inputstr.h" +-#include +-#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 + #include "xkb.h" + #include ++#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<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;idevice, 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;iupAction.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 +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 +--- + 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 +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 + +Signed-off-by: Peter Hutterer +--- + 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 +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 +--- + 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 +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 +--- + 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 + diff --git a/pkgs/core/xorg-server/xorg-server.nm b/pkgs/core/xorg-server/xorg-server.nm index f1442e16d..93cde25f4 100644 --- a/pkgs/core/xorg-server/xorg-server.nm +++ b/pkgs/core/xorg-server/xorg-server.nm @@ -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