From 0b0bd323c1c969e96951edea47b5afb41d3e2d61 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Mar 05 2015 13:17:48 +0000 Subject: import xorg-x11-server-1.15.0-32.el7 --- diff --git a/SOURCES/0001-Always-install-vbe-and-int10-sdk-headers.patch b/SOURCES/0001-Always-install-vbe-and-int10-sdk-headers.patch index 7260b93..cc01440 100644 --- a/SOURCES/0001-Always-install-vbe-and-int10-sdk-headers.patch +++ b/SOURCES/0001-Always-install-vbe-and-int10-sdk-headers.patch @@ -1,37 +1,29 @@ -From 2612287a97242623355fe3f17796d52b3e3f970e Mon Sep 17 00:00:00 2001 +From f1a28f50ab58c3a69acdbe55770c23b57d31d98b Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Wed, 15 Aug 2012 12:35:21 -0400 Subject: [PATCH] Always install vbe and int10 sdk headers Signed-off-by: Adam Jackson --- - hw/xfree86/Makefile.am | 12 ++---------- - 1 file changed, 2 insertions(+), 10 deletions(-) + hw/xfree86/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am -index 38fb0c1..46e74bf 100644 +index 2a12b5e..cd63967 100644 --- a/hw/xfree86/Makefile.am +++ b/hw/xfree86/Makefile.am -@@ -21,17 +21,9 @@ if VGAHW - VGAHW_SUBDIR = vgahw +@@ -30,9 +30,9 @@ if INT10MODULE + INT10_SUBDIR = int10 endif --if VBE --VBE_SUBDIR = vbe --endif -- --if INT10MODULE --INT10_SUBDIR = int10 --endif -- -SUBDIRS = common ddc x86emu $(INT10_SUBDIR) os-support parser \ +SUBDIRS = common ddc x86emu int10 os-support parser \ ramdac $(VGAHW_SUBDIR) loader modes $(DRI_SUBDIR) \ -- $(DRI2_SUBDIR) $(WAYLAND_SUBDIR) . $(VBE_SUBDIR) i2c dixmods \ -+ $(DRI2_SUBDIR) $(WAYLAND_SUBDIR) . vbe i2c dixmods \ +- $(DRI2_SUBDIR) . $(VBE_SUBDIR) i2c dixmods \ ++ $(DRI2_SUBDIR) . vbe i2c dixmods \ fbdevhw shadowfb exa $(XF86UTILS_SUBDIR) doc man DIST_SUBDIRS = common ddc i2c x86emu int10 fbdevhw os-support \ -- -1.8.3.1 +2.1.0 diff --git a/SOURCES/0001-Enable-PAM-support.patch b/SOURCES/0001-Enable-PAM-support.patch new file mode 100644 index 0000000..c28d3dd --- /dev/null +++ b/SOURCES/0001-Enable-PAM-support.patch @@ -0,0 +1,52 @@ +From 62b9fa5973d71f3525af29f04f03e05bbaf196e6 Mon Sep 17 00:00:00 2001 +From: Adam Jackson +Date: Mon, 27 Jun 2011 12:42:28 -0400 +Subject: [PATCH 05/15] Enable PAM support + +Signed-off-by: Adam Jackson +--- + configure.ac | 2 ++ + hw/dmx/Makefile.am | 1 + + os/utils.c | 1 + + 3 files changed, 4 insertions(+), 0 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 3808542..32571e2 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -307,6 +307,8 @@ AC_CHECK_HEADER([execinfo.h],[ + ])] + ) + ++SYS_LIBS="-lpam_misc -lpam" ++ + dnl --------------------------------------------------------------------------- + dnl Bus options and CPU capabilities. Replaces logic in + dnl hw/xfree86/os-support/bus/Makefile.am, among others. +diff --git a/hw/dmx/Makefile.am b/hw/dmx/Makefile.am +index fb727e6..ff76806 100644 +--- a/hw/dmx/Makefile.am ++++ b/hw/dmx/Makefile.am +@@ -78,6 +78,7 @@ Xdmx_SOURCES = dmx.c \ + XDMX_LIBS = \ + $(GLX_LIBS) \ + @XDMX_LIBS@ \ ++ -lpam_misc -lpam \ + input/libdmxinput.a \ + config/libdmxconfig.a + +diff --git a/os/utils.c b/os/utils.c +index d902523..86730c5 100644 +--- a/os/utils.c ++++ b/os/utils.c +@@ -1838,6 +1838,7 @@ CheckUserParameters(int argc, char **argv, char **envp) + * usually only done for setuid servers (uid != euid). + */ + ++#define USE_PAM 1 + #ifdef USE_PAM + #include + #include +-- +1.7.7.6 + diff --git a/SOURCES/0001-Missing-parens-in-REQUEST_FIXED_SIZE-macro-CVE-2014-.patch b/SOURCES/0001-Missing-parens-in-REQUEST_FIXED_SIZE-macro-CVE-2014-.patch deleted file mode 100644 index ea5a3a3..0000000 --- a/SOURCES/0001-Missing-parens-in-REQUEST_FIXED_SIZE-macro-CVE-2014-.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 9802a0162f738de03585ca3f3b8a8266494f7d45 Mon Sep 17 00:00:00 2001 -From: Keith Packard -Date: Tue, 9 Dec 2014 09:30:59 -0800 -Subject: [PATCH 1/2] Missing parens in REQUEST_FIXED_SIZE macro [CVE-2014-8092 - pt. 5] - -The 'n' parameter must be surrounded by parens in both places to -prevent precedence from mis-computing things. - -Signed-off-by: Keith Packard -Reviewed-by: Alan Coopersmith -Signed-off-by: Alan Coopersmith ---- - include/dix.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/include/dix.h b/include/dix.h -index 21176a8..921156b 100644 ---- a/include/dix.h -+++ b/include/dix.h -@@ -80,7 +80,7 @@ SOFTWARE. - - #define REQUEST_FIXED_SIZE(req, n)\ - if (((sizeof(req) >> 2) > client->req_len) || \ -- ((n >> 2) >= client->req_len) || \ -+ (((n) >> 2) >= client->req_len) || \ - ((((uint64_t) sizeof(req) + (n) + 3) >> 2) != (uint64_t) client->req_len)) \ - return(BadLength) - --- -2.1.0 - diff --git a/SOURCES/0001-Xephyr-restore-initial-window-resize-lost-in-xcb-con.patch b/SOURCES/0001-Xephyr-restore-initial-window-resize-lost-in-xcb-con.patch new file mode 100644 index 0000000..b1e95dc --- /dev/null +++ b/SOURCES/0001-Xephyr-restore-initial-window-resize-lost-in-xcb-con.patch @@ -0,0 +1,45 @@ +From 7b2a517ba99f6756e98c4aef47d9b9399b997157 Mon Sep 17 00:00:00 2001 +From: Julien Cristau +Date: Wed, 26 Mar 2014 23:24:20 +0100 +Subject: [PATCH] Xephyr: restore initial window resize lost in xcb conversion +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The XResizeWindow call wasn't replaced by the xcb equivalent, so we +were no longer setting the initial window size, only wm size hints. + +Regression from commit a2b73da "Xephyr: start converting hostx.c over to +xcb" + +Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=74849 + +Signed-off-by: Julien Cristau +Reported-by: Laércio de Sousa +Tested-by: Jon TURNEY +Reviewed-by: Jon TURNEY +Signed-off-by: Keith Packard +--- + hw/kdrive/ephyr/hostx.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c +index 3054f5f..4f48770 100644 +--- a/hw/kdrive/ephyr/hostx.c ++++ b/hw/kdrive/ephyr/hostx.c +@@ -710,6 +710,12 @@ hostx_screen_init(KdScreenInfo *screen, + malloc(scrpriv->ximg->stride * buffer_height); + } + ++ { ++ uint32_t mask = XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT; ++ uint32_t values[2] = {width, height}; ++ xcb_configure_window(HostX.conn, scrpriv->win, mask, values); ++ } ++ + if (scrpriv->win_pre_existing == None && !EphyrWantResize) { + /* Ask the WM to keep our size static */ + xcb_size_hints_t size_hints = {0}; +-- +1.9.3 + diff --git a/SOURCES/0001-Xi-Ensure-DeviceChanged-is-emitted-after-grabs-are-d.patch b/SOURCES/0001-Xi-Ensure-DeviceChanged-is-emitted-after-grabs-are-d.patch new file mode 100644 index 0000000..022b7a2 --- /dev/null +++ b/SOURCES/0001-Xi-Ensure-DeviceChanged-is-emitted-after-grabs-are-d.patch @@ -0,0 +1,54 @@ +From 78d09336391faf6e3fe9f67771b03114f23c0b7c Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Thu, 2 Jan 2014 21:33:30 +0100 +Subject: [PATCH] Xi: Ensure DeviceChanged is emitted after grabs are + deactivated + +When a grab on a slave device is deactivated, the master device must +be checked, just in case there were events from other devices while +the slave device was stolen away by the passive grab. This may +introduce misbehaviors on mismatching valuators and device features +later on UpdateDeviceState(). + +Signed-off-by: Carlos Garnacho +Reviewed-by: Peter Hutterer +Signed-off-by: Peter Hutterer +(cherry picked from commit b2d5ee2e3684951b611fd2068d57cc65fd8305a3) +--- + Xi/exevents.c | 19 ++++++++++++++++++- + 1 file changed, 18 insertions(+), 1 deletion(-) + +diff --git a/Xi/exevents.c b/Xi/exevents.c +index ed6dc36..6b9561e 100644 +--- a/Xi/exevents.c ++++ b/Xi/exevents.c +@@ -1783,8 +1783,25 @@ ProcessDeviceEvent(InternalEvent *ev, DeviceIntPtr device) + DeliverDeviceEvents(GetSpriteWindow(device), (InternalEvent *) event, + NullGrab, NullWindow, device); + +- if (deactivateDeviceGrab == TRUE) ++ if (deactivateDeviceGrab == TRUE) { + (*device->deviceGrab.DeactivateGrab) (device); ++ ++ if (!IsMaster (device) && !IsFloating (device)) { ++ int flags, num_events = 0; ++ InternalEvent dce; ++ ++ flags = (IsPointerDevice (device)) ? ++ DEVCHANGE_POINTER_EVENT : DEVCHANGE_KEYBOARD_EVENT; ++ UpdateFromMaster (&dce, device, flags, &num_events); ++ BUG_WARN(num_events > 1); ++ ++ if (num_events == 1) ++ ChangeMasterDeviceClasses(GetMaster (device, MASTER_ATTACHED), ++ &dce.changed_event); ++ } ++ ++ } ++ + event->detail.key = key; + } + +-- +1.9.0 + diff --git a/SOURCES/0001-arch-Fix-image-and-bitmap-byte-order-for-ppc64le.patch b/SOURCES/0001-arch-Fix-image-and-bitmap-byte-order-for-ppc64le.patch new file mode 100644 index 0000000..f6d994e --- /dev/null +++ b/SOURCES/0001-arch-Fix-image-and-bitmap-byte-order-for-ppc64le.patch @@ -0,0 +1,38 @@ +From adb7bc3386559dfee34b359dadcbb6796bc416e7 Mon Sep 17 00:00:00 2001 +From: Dinar Valeev +Date: Mon, 24 Feb 2014 11:36:54 +0100 +Subject: [PATCH] arch: Fix image and bitmap byte order for ppc64le + +So far PPC was big endian for sure. For ppc64le this is no longer +true. + +Signed-off-by: Egbert Eich +Reviewed-by: Mark Kettenis +Signed-off-by: Keith Packard +--- + include/servermd.h | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/include/servermd.h b/include/servermd.h +index 081123b..e413314 100644 +--- a/include/servermd.h ++++ b/include/servermd.h +@@ -114,8 +114,13 @@ SOFTWARE. + + #if defined(__powerpc__) || defined(__ppc__) || defined(__ppc64__) + +-#define IMAGE_BYTE_ORDER MSBFirst +-#define BITMAP_BIT_ORDER MSBFirst ++#if defined(__LITTLE_ENDIAN__) ++#define IMAGE_BYTE_ORDER LSBFirst ++#define BITMAP_BIT_ORDER LSBFirst ++#else ++#define IMAGE_BYTE_ORDER MSBFirst ++#define BITMAP_BIT_ORDER MSBFirst ++#endif + #define GLYPHPADBYTES 4 + + #endif /* PowerPC */ +-- +1.9.3 + diff --git a/SOURCES/0001-dbe-Cleanup-in-CloseScreen-hook-not-ext-CloseDown.patch b/SOURCES/0001-dbe-Cleanup-in-CloseScreen-hook-not-ext-CloseDown.patch deleted file mode 100644 index eebbee4..0000000 --- a/SOURCES/0001-dbe-Cleanup-in-CloseScreen-hook-not-ext-CloseDown.patch +++ /dev/null @@ -1,125 +0,0 @@ -From bd6c61de441087b808a45ff3fea4fe5a31455c5c Mon Sep 17 00:00:00 2001 -From: Robert Bragg -Date: Thu, 12 Jan 2012 18:16:08 +0000 -Subject: [PATCH 01/38] dbe: Cleanup in CloseScreen hook not ext CloseDown - -Instead of registering an extension CloseDownProc when adding the dbe -extension this patch hooks into pScreen->CloseScreen so that the chain -of pScreen->DestroyWindow hooks remains valid until all windows have -been destroyed. Previously it was possible for DbeResetProc to be called -before the root window had been destroyed and the unwrapping of -pScreen->DestroyWindow would clobber the chain of callbacks. - -This is needed for xwayland to be able to know when the root window is -destroyed so it can unredirect root sub-windows. ---- - dbe/dbe.c | 41 +++++++++++++++++++++-------------------- - dbe/dbestruct.h | 1 + - 2 files changed, 22 insertions(+), 20 deletions(-) - -diff --git a/dbe/dbe.c b/dbe/dbe.c -index 5524615..8d8bfb9 100644 ---- a/dbe/dbe.c -+++ b/dbe/dbe.c -@@ -288,8 +288,8 @@ ProcDbeAllocateBackBufferName(ClientPtr client) - - /* malloc/realloc a new array and initialize all elements to 0. */ - pDbeWindowPriv->IDs = (XID *) realloc(pIDs, -- (pDbeWindowPriv-> -- maxAvailableIDs + -+ (pDbeWindowPriv->maxAvailableIDs -+ + - DBE_INCR_MAX_IDS) * - sizeof(XID)); - if (!pDbeWindowPriv->IDs) { -@@ -464,7 +464,7 @@ ProcDbeSwapBuffers(ClientPtr client) - return BadAlloc; - - /* Get to the swap info appended to the end of the request. */ -- dbeSwapInfo = (xDbeSwapInfo *) &stuff[1]; -+ dbeSwapInfo = (xDbeSwapInfo *) & stuff[1]; - - /* Allocate array to record swap information. */ - swapInfo = (DbeSwapInfoPtr) malloc(nStuff * sizeof(DbeSwapInfoRec)); -@@ -1230,7 +1230,7 @@ DbeWindowPrivDelete(pointer pDbeWinPriv, XID id) - - /****************************************************************************** - * -- * DBE DIX Procedure: DbeResetProc -+ * DBE DIX Procedure: DbeCloseScreen - * - * Description: - * -@@ -1239,25 +1239,23 @@ DbeWindowPrivDelete(pointer pDbeWinPriv, XID id) - * other tasks related to shutting down the extension. - * - *****************************************************************************/ --static void --DbeResetProc(ExtensionEntry * extEntry) -+static Bool -+DbeCloseScreen(ScreenPtr pScreen) - { -- int i; -- ScreenPtr pScreen; -- DbeScreenPrivPtr pDbeScreenPriv; -+ DbeScreenPrivPtr pDbeScreenPriv = DBE_SCREEN_PRIV(pScreen); - -- for (i = 0; i < screenInfo.numScreens; i++) { -- pScreen = screenInfo.screens[i]; -- pDbeScreenPriv = DBE_SCREEN_PRIV(pScreen); -+ if (pDbeScreenPriv) { -+ /* Unwrap DestroyWindow, which was wrapped in DbeExtensionInit(). */ -+ pScreen->DestroyWindow = pDbeScreenPriv->DestroyWindow; - -- if (pDbeScreenPriv) { -- /* Unwrap DestroyWindow, which was wrapped in DbeExtensionInit(). */ -- pScreen->DestroyWindow = pDbeScreenPriv->DestroyWindow; -- pScreen->PositionWindow = pDbeScreenPriv->PositionWindow; -- free(pDbeScreenPriv); -- } -+ /* Unwrap CloseScreen, which was wrapped in DbeExtensionInit(). */ -+ pScreen->CloseScreen = pDbeScreenPriv->CloseScreen; -+ -+ free(pDbeScreenPriv); - } --} /* DbeResetProc() */ -+ -+ return (*pScreen->CloseScreen) (pScreen); -+} /* DbeCloseScreen */ - - /****************************************************************************** - * -@@ -1427,6 +1425,9 @@ DbeExtensionInit(void) - - pDbeScreenPriv->DestroyWindow = pScreen->DestroyWindow; - pScreen->DestroyWindow = DbeDestroyWindow; -+ -+ pDbeScreenPriv->CloseScreen = pScreen->CloseScreen; -+ pScreen->CloseScreen = DbeCloseScreen; - } - else { - /* DDX initialization failed. Stub the screen. */ -@@ -1454,7 +1455,7 @@ DbeExtensionInit(void) - /* Now add the extension. */ - extEntry = AddExtension(DBE_PROTOCOL_NAME, DbeNumberEvents, - DbeNumberErrors, ProcDbeDispatch, SProcDbeDispatch, -- DbeResetProc, StandardMinorOpcode); -+ NULL, StandardMinorOpcode); - - dbeErrorBase = extEntry->errorBase; - SetResourceTypeErrorValue(dbeWindowPrivResType, -diff --git a/dbe/dbestruct.h b/dbe/dbestruct.h -index 2002066..7733d0e 100644 ---- a/dbe/dbestruct.h -+++ b/dbe/dbestruct.h -@@ -176,6 +176,7 @@ typedef struct _DbeScreenPrivRec { - */ - PositionWindowProcPtr PositionWindow; - DestroyWindowProcPtr DestroyWindow; -+ CloseScreenProcPtr CloseScreen; - - /* Per-screen DIX routines */ - Bool (*SetupBackgroundPainter) (WindowPtr /*pWin */ , --- -1.8.4.2 - diff --git a/SOURCES/0001-dix-Fix-GrabPointer-to-not-wrongly-succeed-on-redire.patch b/SOURCES/0001-dix-Fix-GrabPointer-to-not-wrongly-succeed-on-redire.patch new file mode 100644 index 0000000..beafa48 --- /dev/null +++ b/SOURCES/0001-dix-Fix-GrabPointer-to-not-wrongly-succeed-on-redire.patch @@ -0,0 +1,71 @@ +From 19573148ff40b6b4eb335e92cb97ac97ec191450 Mon Sep 17 00:00:00 2001 +From: Adam Jackson +Date: Tue, 12 Aug 2014 13:32:07 -0400 +Subject: [PATCH] dix: Fix GrabPointer to not wrongly succeed on redirected + windows + +Not correct, but correcter. See upstream discussion for more details, +hopefully this will get resolved properly in 1.16. + +Signed-off-by: Adam Jackson +--- + dix/events.c | 33 ++++++++++++++++++++++++++++++--- + 1 file changed, 30 insertions(+), 3 deletions(-) + +diff --git a/dix/events.c b/dix/events.c +index b8c67fd..9300a3c 100644 +--- a/dix/events.c ++++ b/dix/events.c +@@ -3616,10 +3616,38 @@ ProcWarpPointer(ClientPtr client) + return Success; + } + ++/* ++ * this is better but still wrong. upstream discussion: ++ * http://lists.freedesktop.org/archives/xorg-devel/2014-July/043374.html ++ * ++ * in the meantime all we're doing is amending the redirected window path ++ * to check whether borderClip (total window area) overlaps the root window ++ * space at all. ++ * ++ * note that the redirect path doesn't need to account for panoramix' ++ * rewrite of root window geometry, because root windows can't be ++ * redirected. ++ */ ++static Bool ++WindowIsConfineToAble(WindowPtr pWin) ++{ ++ if (pWin->redirectDraw == RedirectDrawNone) { ++ if (RegionNotEmpty(&pWin->borderSize)) ++ return TRUE; ++ } else { ++ WindowPtr root = pWin->drawable.pScreen->root; ++ if (rgnOUT != RegionContainsRect(&pWin->borderClip, ++ RegionExtents(&root->winSize))) ++ return TRUE; ++ } ++ ++ return FALSE; ++} ++ + static Bool + BorderSizeNotEmpty(DeviceIntPtr pDev, WindowPtr pWin) + { +- if (RegionNotEmpty(&pWin->borderSize)) ++ if (WindowIsConfineToAble(pWin)) + return TRUE; + + #ifdef PANORAMIX +@@ -3627,8 +3655,7 @@ BorderSizeNotEmpty(DeviceIntPtr pDev, WindowPtr pWin) + int i; + + FOR_NSCREENS_FORWARD_SKIP(i) { +- if (RegionNotEmpty +- (&pDev->spriteInfo->sprite->windows[i]->borderSize)) ++ if (WindowIsConfineToAble(pDev->spriteInfo->sprite->windows[i])) + return TRUE; + } + } +-- +1.9.3 + diff --git a/SOURCES/0001-dri2-Fix-detection-of-wrong-prime_id-in-GetScreenPri.patch b/SOURCES/0001-dri2-Fix-detection-of-wrong-prime_id-in-GetScreenPri.patch new file mode 100644 index 0000000..2d4f12e --- /dev/null +++ b/SOURCES/0001-dri2-Fix-detection-of-wrong-prime_id-in-GetScreenPri.patch @@ -0,0 +1,40 @@ +From 4958c6a43e27e3521533fbe7497050a6ad5f45c0 Mon Sep 17 00:00:00 2001 +From: Michal Srb +Date: Tue, 15 Apr 2014 18:54:35 +0300 +Subject: [PATCH 1/3] dri2: Fix detection of wrong prime_id in GetScreenPrime. + +Checking the iterating variable ("slave") against null can not detect if the +xorg_list_for_each_entry finished without break being invoked - slave variable +will be always non-null. This caused segfault whenever someone tried to use +DRI_PRIME with incorrect id while having at least one render offloading slave +configured. + +Restructurize the GetScreenPrime to work as expected. + +Reviewed-by: Dave Airlie +Signed-off-by: Keith Packard +--- + hw/xfree86/dri2/dri2.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c +index 0b047f0..a983aed 100644 +--- a/hw/xfree86/dri2/dri2.c ++++ b/hw/xfree86/dri2/dri2.c +@@ -156,11 +156,9 @@ GetScreenPrime(ScreenPtr master, int prime_id) + + ds = DRI2GetScreen(slave); + if (ds->prime_id == prime_id) +- break; ++ return slave; + } +- if (!slave) +- return master; +- return slave; ++ return master; + } + + static DRI2ScreenPtr +-- +1.9.3 + diff --git a/SOURCES/0001-ephyr-Properly-implement-hardware-cursors.patch b/SOURCES/0001-ephyr-Properly-implement-hardware-cursors.patch new file mode 100644 index 0000000..1ba4dc8 --- /dev/null +++ b/SOURCES/0001-ephyr-Properly-implement-hardware-cursors.patch @@ -0,0 +1,459 @@ +From 31360bf6bcdc388c8546fefd495163a30b0918e5 Mon Sep 17 00:00:00 2001 +From: Adam Jackson +Date: Tue, 19 Aug 2014 14:22:30 -0400 +Subject: [PATCH] ephyr: Properly implement hardware cursors + +Technique is basically the same as in Xnest, just create a new cursor on +the host server every time. Could be optimized to remember cursors on +the host and merely switch among them, if someone's feeling adventurous. + +Signed-off-by: Adam Jackson +--- + configure.ac | 2 +- + hw/kdrive/ephyr/Makefile.am | 1 + + hw/kdrive/ephyr/ephyrcursor.c | 216 ++++++++++++++++++++++++++++++++++++++++++ + hw/kdrive/ephyr/ephyrinit.c | 63 ------------ + hw/kdrive/ephyr/hostx.c | 74 +++++++++++++++ + hw/kdrive/ephyr/hostx.h | 5 + + 6 files changed, 297 insertions(+), 64 deletions(-) + create mode 100644 hw/kdrive/ephyr/ephyrcursor.c + +diff --git a/configure.ac b/configure.ac +index f3d9654..e83949d 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -2364,7 +2364,7 @@ if test "$KDRIVE" = yes; then + AC_DEFINE(KDRIVE_MOUSE, 1, [Enable KDrive mouse driver]) + fi + +- XEPHYR_REQUIRED_LIBS="xau xdmcp xcb xcb-shape xcb-aux xcb-image xcb-icccm xcb-shm xcb-keysyms" ++ XEPHYR_REQUIRED_LIBS="xau xdmcp xcb xcb-shape xcb-render xcb-aux xcb-image xcb-icccm xcb-shm xcb-keysyms" + if test "x$XV" = xyes; then + XEPHYR_REQUIRED_LIBS="$XEPHYR_REQUIRED_LIBS xcb-xv" + fi +diff --git a/hw/kdrive/ephyr/Makefile.am b/hw/kdrive/ephyr/Makefile.am +index 10c5917..155e11e 100644 +--- a/hw/kdrive/ephyr/Makefile.am ++++ b/hw/kdrive/ephyr/Makefile.am +@@ -68,6 +68,7 @@ Xephyr_SOURCES = \ + ephyr_draw.c \ + os.c \ + ephyrinit.c \ ++ ephyrcursor.c \ + hostx.c \ + hostx.h \ + $(XV_SRCS) \ +diff --git a/hw/kdrive/ephyr/ephyrcursor.c b/hw/kdrive/ephyr/ephyrcursor.c +new file mode 100644 +index 0000000..b19e301 +--- /dev/null ++++ b/hw/kdrive/ephyr/ephyrcursor.c +@@ -0,0 +1,216 @@ ++/* ++ * Copyright © 2014 Red Hat, Inc. ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the "Software"), ++ * to deal in the Software without restriction, including without limitation ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, ++ * and/or sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice (including the next ++ * paragraph) shall be included in all copies or substantial portions of the ++ * Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ * ++ * Author: ++ * Adam Jackson ++ */ ++ ++#ifdef HAVE_CONFIG_H ++#include ++#endif ++#include "ephyr.h" ++#include "ephyrlog.h" ++#include "hostx.h" ++#include "cursorstr.h" ++#include ++ ++static DevPrivateKeyRec ephyrCursorPrivateKey; ++ ++typedef struct _ephyrCursor { ++ xcb_cursor_t cursor; ++} ephyrCursorRec, *ephyrCursorPtr; ++ ++static ephyrCursorPtr ++ephyrGetCursor(CursorPtr cursor) ++{ ++ return dixGetPrivateAddr(&cursor->devPrivates, &ephyrCursorPrivateKey); ++} ++ ++static void ++ephyrRealizeCoreCursor(EphyrScrPriv *scr, CursorPtr cursor) ++{ ++ ephyrCursorPtr hw = ephyrGetCursor(cursor); ++ xcb_connection_t *conn = hostx_get_xcbconn(); ++ xcb_pixmap_t source, mask; ++ xcb_image_t *image; ++ xcb_gcontext_t gc = hostx_get_cursor_gc(); ++ int w = cursor->bits->width, h = cursor->bits->height; ++ ++ source = xcb_generate_id(conn); ++ mask = xcb_generate_id(conn); ++ xcb_create_pixmap(conn, 1, source, scr->win, w, h); ++ xcb_create_pixmap(conn, 1, mask, scr->win, w, h); ++ ++ image = xcb_image_create_native(conn, w, h, XCB_IMAGE_FORMAT_XY_BITMAP, ++ 1, NULL, ~0, NULL); ++ image->data = cursor->bits->source; ++ xcb_image_put(conn, source, gc, image, 0, 0, 0); ++ xcb_image_destroy(image); ++ ++ image = xcb_image_create_native(conn, w, h, XCB_IMAGE_FORMAT_XY_BITMAP, ++ 1, NULL, ~0, NULL); ++ image->data = cursor->bits->mask; ++ xcb_image_put(conn, mask, gc, image, 0, 0, 0); ++ xcb_image_destroy(image); ++ ++ hw->cursor = xcb_generate_id(conn); ++ xcb_create_cursor(conn, hw->cursor, source, mask, ++ cursor->foreRed, cursor->foreGreen, cursor->foreBlue, ++ cursor->backRed, cursor->backGreen, cursor->backBlue, ++ cursor->bits->xhot, cursor->bits->yhot); ++ ++ xcb_free_pixmap(conn, source); ++ xcb_free_pixmap(conn, mask); ++} ++ ++#ifdef ARGB_CURSOR ++static void ++ephyrRealizeARGBCursor(EphyrScrPriv *scr, CursorPtr cursor) ++{ ++ ephyrCursorPtr hw = ephyrGetCursor(cursor); ++ xcb_connection_t *conn = hostx_get_xcbconn(); ++ xcb_gcontext_t gc; ++ xcb_pixmap_t source; ++ xcb_render_picture_t picture; ++ xcb_image_t *image; ++ int w = cursor->bits->width, h = cursor->bits->height; ++ ++ /* dix' storage is PICT_a8r8g8b8 */ ++ source = xcb_generate_id(conn); ++ xcb_create_pixmap(conn, 32, source, scr->win, w, h); ++ ++ gc = xcb_generate_id(conn); ++ xcb_create_gc(conn, gc, source, 0, NULL); ++ image = xcb_image_create_native(conn, w, h, XCB_IMAGE_FORMAT_Z_PIXMAP, ++ 32, NULL, ~0, NULL); ++ image->data = (void *)cursor->bits->argb; ++ xcb_image_put(conn, source, gc, image, 0, 0, 0); ++ xcb_free_gc(conn, gc); ++ xcb_image_destroy(image); ++ ++ picture = xcb_generate_id(conn); ++ xcb_render_create_picture(conn, picture, source, hostx_get_argb_format(), ++ 0, NULL); ++ xcb_free_pixmap(conn, source); ++ ++ hw->cursor = xcb_generate_id(conn); ++ xcb_render_create_cursor(conn, hw->cursor, picture, ++ cursor->bits->xhot, cursor->bits->yhot); ++ ++ xcb_render_free_picture(conn, picture); ++} ++#endif ++ ++static Bool ++ephyrRealizeCursor(DeviceIntPtr dev, ScreenPtr screen, CursorPtr cursor) ++{ ++ KdScreenPriv(screen); ++ KdScreenInfo *kscr = pScreenPriv->screen; ++ EphyrScrPriv *scr = kscr->driver; ++ ++#ifdef ARGB_CURSOR ++ if (cursor->bits->argb) ++ ephyrRealizeARGBCursor(scr, cursor); ++ else ++#endif ++ { ++ ephyrRealizeCoreCursor(scr, cursor); ++ } ++ return TRUE; ++} ++ ++static Bool ++ephyrUnrealizeCursor(DeviceIntPtr dev, ScreenPtr screen, CursorPtr cursor) ++{ ++ ephyrCursorPtr hw = ephyrGetCursor(cursor); ++ ++ if (hw->cursor) { ++ xcb_free_cursor(hostx_get_xcbconn(), hw->cursor); ++ hw->cursor = None; ++ } ++ ++ return TRUE; ++} ++ ++static void ++ephyrSetCursor(DeviceIntPtr dev, ScreenPtr screen, CursorPtr cursor, int x, ++ int y) ++{ ++ KdScreenPriv(screen); ++ KdScreenInfo *kscr = pScreenPriv->screen; ++ EphyrScrPriv *scr = kscr->driver; ++ uint32_t attr = None; ++ ++ /* XXX really? */ ++ if (cursor) ++ attr = ephyrGetCursor(cursor)->cursor; ++ ++ xcb_change_window_attributes(hostx_get_xcbconn(), scr->win, ++ XCB_CW_CURSOR, &attr); ++ xcb_flush(hostx_get_xcbconn()); ++} ++ ++static void ++ephyrMoveCursor(DeviceIntPtr dev, ScreenPtr screen, int x, int y) ++{ ++ ; ++} ++ ++static Bool ++ephyrDeviceCursorInitialize(DeviceIntPtr dev, ScreenPtr screen) ++{ ++ return TRUE; ++} ++ ++static void ++ephyrDeviceCursorCleanup(DeviceIntPtr dev, ScreenPtr screen) ++{ ++} ++ ++miPointerSpriteFuncRec EphyrPointerSpriteFuncs = { ++ ephyrRealizeCursor, ++ ephyrUnrealizeCursor, ++ ephyrSetCursor, ++ ephyrMoveCursor, ++ ephyrDeviceCursorInitialize, ++ ephyrDeviceCursorCleanup ++}; ++ ++Bool ++ephyrCursorInit(ScreenPtr screen) ++{ ++ if (!dixRegisterPrivateKey(&ephyrCursorPrivateKey, PRIVATE_CURSOR_BITS, ++ sizeof(ephyrCursorRec))) ++ return FALSE; ++ ++ miPointerInitialize(screen, ++ &EphyrPointerSpriteFuncs, ++ &ephyrPointerScreenFuncs, FALSE); ++ ++ return TRUE; ++} ++ ++void ++ephyrCursorEnable(ScreenPtr screen) ++{ ++} ++ +diff --git a/hw/kdrive/ephyr/ephyrinit.c b/hw/kdrive/ephyr/ephyrinit.c +index fc00010..e823eb8 100644 +--- a/hw/kdrive/ephyr/ephyrinit.c ++++ b/hw/kdrive/ephyr/ephyrinit.c +@@ -350,69 +350,6 @@ OsVendorInit(void) + KdOsInit(&EphyrOsFuncs); + } + +-/* 'Fake' cursor stuff, could be improved */ +- +-static Bool +-ephyrRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor) +-{ +- return TRUE; +-} +- +-static Bool +-ephyrUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor) +-{ +- return TRUE; +-} +- +-static void +-ephyrSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor, int x, +- int y) +-{ +- ; +-} +- +-static void +-ephyrMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y) +-{ +- ; +-} +- +-static Bool +-ephyrDeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen) +-{ +- return TRUE; +-} +- +-static void +-ephyrDeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen) +-{ +-} +- +-miPointerSpriteFuncRec EphyrPointerSpriteFuncs = { +- ephyrRealizeCursor, +- ephyrUnrealizeCursor, +- ephyrSetCursor, +- ephyrMoveCursor, +- ephyrDeviceCursorInitialize, +- ephyrDeviceCursorCleanup +-}; +- +-Bool +-ephyrCursorInit(ScreenPtr pScreen) +-{ +- miPointerInitialize(pScreen, +- &EphyrPointerSpriteFuncs, +- &ephyrPointerScreenFuncs, FALSE); +- +- return TRUE; +-} +- +-void +-ephyrCursorEnable(ScreenPtr pScreen) +-{ +- ; +-} +- + KdCardFuncs ephyrFuncs = { + ephyrCardInit, /* cardinit */ + ephyrScreenInitialize, /* scrinit */ +diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c +index 1c75974..f995fc0 100644 +--- a/hw/kdrive/ephyr/hostx.c ++++ b/hw/kdrive/ephyr/hostx.c +@@ -70,6 +70,8 @@ struct EphyrHostXVars { + xcb_visualtype_t *visual; + Window winroot; + xcb_gcontext_t gc; ++ xcb_gcontext_t curgc; ++ xcb_render_pictformat_t argb_format; + int depth; + Bool use_sw_cursor; + Bool use_fullscreen; +@@ -1157,6 +1159,78 @@ out: + return is_ok; + } + ++xcb_gcontext_t ++hostx_get_cursor_gc(void) ++{ ++ uint32_t mask = XCB_GC_FUNCTION | ++ XCB_GC_PLANE_MASK | ++ XCB_GC_FOREGROUND | ++ XCB_GC_BACKGROUND | ++ XCB_GC_CLIP_MASK; ++ uint32_t val[] = { ++ XCB_GX_COPY, /* function */ ++ ~0, /* planemask */ ++ 1L, /* foreground */ ++ 0L, /* background */ ++ None, /* clipmask */ ++ }; ++ ++ if (HostX.curgc == None) { ++ xcb_pixmap_t p = xcb_generate_id(HostX.conn); ++ HostX.curgc = xcb_generate_id(HostX.conn); ++ ++ xcb_create_pixmap(HostX.conn, 1, p, HostX.winroot /* XXX */, ++ 1, 1); ++ xcb_create_gc(HostX.conn, HostX.curgc, p, mask, val); ++ xcb_free_pixmap(HostX.conn, p); ++ } ++ ++ return HostX.curgc; ++} ++ ++xcb_render_pictformat_t ++hostx_get_argb_format(void) ++{ ++ if (HostX.argb_format == None) { ++ xcb_render_query_pict_formats_reply_t *formats; ++ xcb_render_pictforminfo_iterator_t i; ++ ++ formats = xcb_render_query_pict_formats_reply(HostX.conn, ++ xcb_render_query_pict_formats(HostX.conn), ++ NULL); ++ ++ for (i = xcb_render_query_pict_formats_formats_iterator(formats); ++ i.rem; ++ xcb_render_pictforminfo_next(&i)) { ++ ++ if (i.data->type != XCB_RENDER_PICT_TYPE_DIRECT) ++ continue; ++ ++ if (i.data->depth != 32) ++ continue; ++ ++ if (i.data->direct.red_mask != 0xff || ++ i.data->direct.green_mask != 0xff || ++ i.data->direct.blue_mask != 0xff || ++ i.data->direct.alpha_mask != 0xff) ++ continue; ++ ++ if (i.data->direct.red_shift != 16 || ++ i.data->direct.green_shift != 8 || ++ i.data->direct.blue_shift != 0 || ++ i.data->direct.alpha_shift != 24) ++ continue; ++ ++ HostX.argb_format = i.data->id; ++ break; ++ } ++ ++ free(formats); ++ } ++ ++ return HostX.argb_format; ++} ++ + #ifdef XF86DRI + typedef struct { + int is_valid; +diff --git a/hw/kdrive/ephyr/hostx.h b/hw/kdrive/ephyr/hostx.h +index e83323a..de488a4 100644 +--- a/hw/kdrive/ephyr/hostx.h ++++ b/hw/kdrive/ephyr/hostx.h +@@ -29,6 +29,7 @@ + #include + #include + #include ++#include + #include "ephyr.h" + + #define EPHYR_WANT_DEBUG 0 +@@ -174,6 +175,10 @@ int hostx_set_window_bounding_rectangles(int a_window, + + int host_has_extension(xcb_extension_t *extension); + ++xcb_gcontext_t hostx_get_cursor_gc(void); ++ ++xcb_render_pictformat_t hostx_get_argb_format(void); ++ + #ifdef XF86DRI + int hostx_lookup_peer_window(void *a_local_window, + int *a_host_peer /*out parameter */ ); +-- +1.9.3 + diff --git a/SOURCES/0001-ephyr-Repaint-entire-screen-when-colormap-is-updated.patch b/SOURCES/0001-ephyr-Repaint-entire-screen-when-colormap-is-updated.patch new file mode 100644 index 0000000..1d78b72 --- /dev/null +++ b/SOURCES/0001-ephyr-Repaint-entire-screen-when-colormap-is-updated.patch @@ -0,0 +1,51 @@ +From ae796d43c934ba378c9a618adc81c6729a14b2f8 Mon Sep 17 00:00:00 2001 +From: Keith Packard +Date: Thu, 6 Feb 2014 19:17:50 -0800 +Subject: [PATCH] ephyr: Repaint entire screen when colormap is updated + +Any time the colormap is changed, the entire screen needs to be +repainted to match. + +Signed-off-by: Keith Packard +Reviewed-by: Adam Jackson +Reviewed-by: Eric Anholt +--- + hw/kdrive/ephyr/ephyr.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c +index da80c95..9681273 100644 +--- a/hw/kdrive/ephyr/ephyr.c ++++ b/hw/kdrive/ephyr/ephyr.c +@@ -1232,6 +1232,9 @@ ephyrGetColors(ScreenPtr pScreen, int n, xColorItem * pdefs) + void + ephyrPutColors(ScreenPtr pScreen, int n, xColorItem * pdefs) + { ++ KdScreenPriv(pScreen); ++ KdScreenInfo *screen = pScreenPriv->screen; ++ EphyrScrPriv *scrpriv = screen->driver; + int min, max, p; + + /* XXX Not sure if this is right */ +@@ -1251,6 +1254,18 @@ ephyrPutColors(ScreenPtr pScreen, int n, xColorItem * pdefs) + pdefs->green >> 8, pdefs->blue >> 8); + pdefs++; + } ++ if (scrpriv->pDamage) { ++ BoxRec box; ++ RegionRec region; ++ ++ box.x1 = 0; ++ box.y1 = 0; ++ box.x2 = pScreen->width; ++ box.y2 = pScreen->height; ++ RegionInit(®ion, &box, 1); ++ DamageReportDamage(scrpriv->pDamage, ®ion); ++ RegionUninit(®ion); ++ } + } + + /* Mouse calls */ +-- +1.8.5.3 + diff --git a/SOURCES/0001-glx-check-return-from-__glXGetAnswerBuffer.patch b/SOURCES/0001-glx-check-return-from-__glXGetAnswerBuffer.patch deleted file mode 100644 index cff6387..0000000 --- a/SOURCES/0001-glx-check-return-from-__glXGetAnswerBuffer.patch +++ /dev/null @@ -1,188 +0,0 @@ -From 61a292adf45405641de1c522a04c148e0a152acd Mon Sep 17 00:00:00 2001 -From: Keith Packard -Date: Thu, 9 Oct 2014 15:17:17 +0200 -Subject: [PATCH] glx: check return from __glXGetAnswerBuffer - -This function can return NULL; make sure every caller tests for that. - -Reviewed-by: Adam Jackson -Signed-off-by: Keith Packard ---- - glx/indirect_dispatch.c | 25 +++++++++++++++++++++++++ - glx/indirect_dispatch_swap.c | 26 ++++++++++++++++++++++++++ - 2 files changed, 51 insertions(+) - -diff --git a/glx/indirect_dispatch.c b/glx/indirect_dispatch.c -index 329b2e6..f6cabef 100644 ---- a/glx/indirect_dispatch.c -+++ b/glx/indirect_dispatch.c -@@ -2464,6 +2464,9 @@ __glXDisp_AreTexturesResident(__GLXclientState * cl, GLbyte * pc) - GLboolean answerBuffer[200]; - GLboolean *residences = - __glXGetAnswerBuffer(cl, n, answerBuffer, sizeof(answerBuffer), 1); -+ -+ if (residences == NULL) -+ return BadAlloc; - retval = - glAreTexturesResident(n, (const GLuint *) (pc + 4), residences); - __glXSendReply(cl->client, residences, n, 1, GL_TRUE, retval); -@@ -2488,6 +2491,9 @@ __glXDisp_AreTexturesResidentEXT(__GLXclientState * cl, GLbyte * pc) - GLboolean answerBuffer[200]; - GLboolean *residences = - __glXGetAnswerBuffer(cl, n, answerBuffer, sizeof(answerBuffer), 1); -+ -+ if (residences == NULL) -+ return BadAlloc; - retval = - glAreTexturesResident(n, (const GLuint *) (pc + 4), residences); - __glXSendReply(cl->client, residences, n, 1, GL_TRUE, retval); -@@ -2593,6 +2599,9 @@ __glXDisp_GenTextures(__GLXclientState * cl, GLbyte * pc) - GLuint *textures = - __glXGetAnswerBuffer(cl, n * 4, answerBuffer, sizeof(answerBuffer), - 4); -+ -+ if (textures == NULL) -+ return BadAlloc; - glGenTextures(n, textures); - __glXSendReply(cl->client, textures, n, 4, GL_TRUE, 0); - error = Success; -@@ -2616,6 +2625,9 @@ __glXDisp_GenTexturesEXT(__GLXclientState * cl, GLbyte * pc) - GLuint *textures = - __glXGetAnswerBuffer(cl, n * 4, answerBuffer, sizeof(answerBuffer), - 4); -+ -+ if (textures == NULL) -+ return BadAlloc; - glGenTextures(n, textures); - __glXSendReply(cl->client, textures, n, 4, GL_TRUE, 0); - error = Success; -@@ -3883,6 +3895,9 @@ __glXDisp_GenQueries(__GLXclientState * cl, GLbyte * pc) - GLuint *ids = - __glXGetAnswerBuffer(cl, n * 4, answerBuffer, sizeof(answerBuffer), - 4); -+ -+ if (ids == NULL) -+ return BadAlloc; - GenQueries(n, ids); - __glXSendReply(cl->client, ids, n, 4, GL_TRUE, 0); - error = Success; -@@ -4253,6 +4268,9 @@ __glXDisp_GenProgramsARB(__GLXclientState * cl, GLbyte * pc) - GLuint *programs = - __glXGetAnswerBuffer(cl, n * 4, answerBuffer, sizeof(answerBuffer), - 4); -+ -+ if (programs == NULL) -+ return BadAlloc; - GenProgramsARB(n, programs); - __glXSendReply(cl->client, programs, n, 4, GL_TRUE, 0); - error = Success; -@@ -4630,6 +4648,10 @@ __glXDisp_GenFramebuffers(__GLXclientState * cl, GLbyte * pc) - GLuint *framebuffers = - __glXGetAnswerBuffer(cl, n * 4, answerBuffer, sizeof(answerBuffer), - 4); -+ -+ if (framebuffers == NULL) -+ return BadAlloc; -+ - GenFramebuffers(n, framebuffers); - __glXSendReply(cl->client, framebuffers, n, 4, GL_TRUE, 0); - error = Success; -@@ -4655,6 +4677,9 @@ __glXDisp_GenRenderbuffers(__GLXclientState * cl, GLbyte * pc) - GLuint *renderbuffers = - __glXGetAnswerBuffer(cl, n * 4, answerBuffer, sizeof(answerBuffer), - 4); -+ -+ if (renderbuffers == NULL) -+ return BadAlloc; - GenRenderbuffers(n, renderbuffers); - __glXSendReply(cl->client, renderbuffers, n, 4, GL_TRUE, 0); - error = Success; -diff --git a/glx/indirect_dispatch_swap.c b/glx/indirect_dispatch_swap.c -index 647d0c9..c0bb64d 100644 ---- a/glx/indirect_dispatch_swap.c -+++ b/glx/indirect_dispatch_swap.c -@@ -2731,6 +2731,9 @@ __glXDispSwap_AreTexturesResident(__GLXclientState * cl, GLbyte * pc) - GLboolean answerBuffer[200]; - GLboolean *residences = - __glXGetAnswerBuffer(cl, n, answerBuffer, sizeof(answerBuffer), 1); -+ -+ if (residences == NULL) -+ return BadAlloc; - retval = - glAreTexturesResident(n, - (const GLuint *) -@@ -2759,6 +2762,9 @@ __glXDispSwap_AreTexturesResidentEXT(__GLXclientState * cl, GLbyte * pc) - GLboolean answerBuffer[200]; - GLboolean *residences = - __glXGetAnswerBuffer(cl, n, answerBuffer, sizeof(answerBuffer), 1); -+ -+ if (residences == NULL) -+ return BadAlloc; - retval = - glAreTexturesResident(n, - (const GLuint *) -@@ -2878,6 +2884,9 @@ __glXDispSwap_GenTextures(__GLXclientState * cl, GLbyte * pc) - GLuint *textures = - __glXGetAnswerBuffer(cl, n * 4, answerBuffer, sizeof(answerBuffer), - 4); -+ -+ if (textures == NULL) -+ return BadAlloc; - glGenTextures(n, textures); - (void) bswap_32_array((uint32_t *) textures, n); - __glXSendReplySwap(cl->client, textures, n, 4, GL_TRUE, 0); -@@ -2903,6 +2912,9 @@ __glXDispSwap_GenTexturesEXT(__GLXclientState * cl, GLbyte * pc) - GLuint *textures = - __glXGetAnswerBuffer(cl, n * 4, answerBuffer, sizeof(answerBuffer), - 4); -+ -+ if (textures == NULL) -+ return BadAlloc; - glGenTextures(n, textures); - (void) bswap_32_array((uint32_t *) textures, n); - __glXSendReplySwap(cl->client, textures, n, 4, GL_TRUE, 0); -@@ -4290,6 +4302,9 @@ __glXDispSwap_GenQueries(__GLXclientState * cl, GLbyte * pc) - GLuint *ids = - __glXGetAnswerBuffer(cl, n * 4, answerBuffer, sizeof(answerBuffer), - 4); -+ if (ids == NULL) -+ return BadAlloc; -+ - GenQueries(n, ids); - (void) bswap_32_array((uint32_t *) ids, n); - __glXSendReplySwap(cl->client, ids, n, 4, GL_TRUE, 0); -@@ -4697,6 +4712,9 @@ __glXDispSwap_GenProgramsARB(__GLXclientState * cl, GLbyte * pc) - GLuint *programs = - __glXGetAnswerBuffer(cl, n * 4, answerBuffer, sizeof(answerBuffer), - 4); -+ if (programs == NULL) -+ return BadAlloc; -+ - GenProgramsARB(n, programs); - (void) bswap_32_array((uint32_t *) programs, n); - __glXSendReplySwap(cl->client, programs, n, 4, GL_TRUE, 0); -@@ -5122,6 +5140,10 @@ __glXDispSwap_GenFramebuffers(__GLXclientState * cl, GLbyte * pc) - GLuint *framebuffers = - __glXGetAnswerBuffer(cl, n * 4, answerBuffer, sizeof(answerBuffer), - 4); -+ -+ if (framebuffers == NULL) -+ return BadAlloc; -+ - GenFramebuffers(n, framebuffers); - (void) bswap_32_array((uint32_t *) framebuffers, n); - __glXSendReplySwap(cl->client, framebuffers, n, 4, GL_TRUE, 0); -@@ -5149,6 +5171,10 @@ __glXDispSwap_GenRenderbuffers(__GLXclientState * cl, GLbyte * pc) - GLuint *renderbuffers = - __glXGetAnswerBuffer(cl, n * 4, answerBuffer, sizeof(answerBuffer), - 4); -+ -+ if (renderbuffers == NULL) -+ return BadAlloc; -+ - GenRenderbuffers(n, renderbuffers); - (void) bswap_32_array((uint32_t *) renderbuffers, n); - __glXSendReplySwap(cl->client, renderbuffers, n, 4, GL_TRUE, 0); --- -1.9.3 - diff --git a/SOURCES/0001-input-Remove-invalid-bug-checks.patch b/SOURCES/0001-input-Remove-invalid-bug-checks.patch new file mode 100644 index 0000000..1501df4 --- /dev/null +++ b/SOURCES/0001-input-Remove-invalid-bug-checks.patch @@ -0,0 +1,65 @@ +From 6a848122def0f2a439e21c50f22814db11760132 Mon Sep 17 00:00:00 2001 +From: Michal Srb +Date: Wed, 2 Apr 2014 17:14:05 +0300 +Subject: [PATCH] input: Remove invalid bug checks. + +Commit 2f1aedcaed8fd99b823d451bf1fb02330c078f67 added several bug checks. Some +of them are not correct. + +Checks in Init(Ptr|String|Bell|Led|Integer)FeedbackClassDeviceStruct verify +that no feedback struct was set yet, but that is not required. If any feedback +structs are already present, the function will chain them behind the new one. + +Signed-off-by: Michal Srb +Signed-off-by: Peter Hutterer +--- + dix/devices.c | 5 ----- + 1 file changed, 5 deletions(-) + +diff --git a/dix/devices.c b/dix/devices.c +index ab923d5..73f60f4 100644 +--- a/dix/devices.c ++++ b/dix/devices.c +@@ -1475,7 +1475,6 @@ InitPtrFeedbackClassDeviceStruct(DeviceIntPtr dev, PtrCtrlProcPtr controlProc) + PtrFeedbackPtr feedc; + + BUG_RETURN_VAL(dev == NULL, FALSE); +- BUG_RETURN_VAL(dev->ptrfeed != NULL, FALSE); + + feedc = malloc(sizeof(PtrFeedbackClassRec)); + if (!feedc) +@@ -1519,7 +1518,6 @@ InitStringFeedbackClassDeviceStruct(DeviceIntPtr dev, + StringFeedbackPtr feedc; + + BUG_RETURN_VAL(dev == NULL, FALSE); +- BUG_RETURN_VAL(dev->stringfeed != NULL, FALSE); + + feedc = malloc(sizeof(StringFeedbackClassRec)); + if (!feedc) +@@ -1556,7 +1554,6 @@ InitBellFeedbackClassDeviceStruct(DeviceIntPtr dev, BellProcPtr bellProc, + BellFeedbackPtr feedc; + + BUG_RETURN_VAL(dev == NULL, FALSE); +- BUG_RETURN_VAL(dev->bell != NULL, FALSE); + + feedc = malloc(sizeof(BellFeedbackClassRec)); + if (!feedc) +@@ -1578,7 +1575,6 @@ InitLedFeedbackClassDeviceStruct(DeviceIntPtr dev, LedCtrlProcPtr controlProc) + LedFeedbackPtr feedc; + + BUG_RETURN_VAL(dev == NULL, FALSE); +- BUG_RETURN_VAL(dev->leds != NULL, FALSE); + + feedc = malloc(sizeof(LedFeedbackClassRec)); + if (!feedc) +@@ -1601,7 +1597,6 @@ InitIntegerFeedbackClassDeviceStruct(DeviceIntPtr dev, + IntegerFeedbackPtr feedc; + + BUG_RETURN_VAL(dev == NULL, FALSE); +- BUG_RETURN_VAL(dev->intfeed != NULL, FALSE); + + feedc = malloc(sizeof(IntegerFeedbackClassRec)); + if (!feedc) +-- +1.9.3 + diff --git a/SOURCES/0001-link-with-z-now.patch b/SOURCES/0001-link-with-z-now.patch index 012be13..25f057c 100644 --- a/SOURCES/0001-link-with-z-now.patch +++ b/SOURCES/0001-link-with-z-now.patch @@ -17,7 +17,7 @@ index c3899b5..9e422f2 100644 Xorg_DEPENDENCIES = $(LOCAL_LIBS) -Xorg_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG) -+Xorg_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG) -Wl,-z,now ++Xorg_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG) -Wl,-z,now -pie BUILT_SOURCES = xorg.conf.example DISTCLEANFILES = xorg.conf.example diff --git a/SOURCES/0001-mi-don-t-process-events-from-disabled-devices-77884.patch b/SOURCES/0001-mi-don-t-process-events-from-disabled-devices-77884.patch new file mode 100644 index 0000000..3c7af3a --- /dev/null +++ b/SOURCES/0001-mi-don-t-process-events-from-disabled-devices-77884.patch @@ -0,0 +1,101 @@ +From e0e84775030cce77b37bb87739bebfd6635ea303 Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Wed, 21 May 2014 10:07:31 +1000 +Subject: [PATCH 1/3] mi: don't process events from disabled devices (#77884) + +Once a device is disabled, it doesn't have a sprite pointer anymore. If an +event is still in the queue and processed after DisableDevice finished, a +dereference causes a crash. Example backtrace (crash forced by injecting an +event at the right time): + +(EE) 0: /opt/xorg/bin/Xorg (OsSigHandler+0x3c) [0x48d334] +(EE) 1: /lib64/libpthread.so.0 (__restore_rt+0x0) [0x37fcc0f74f] +(EE) 2: /opt/xorg/bin/Xorg (mieqMoveToNewScreen+0x38) [0x609240] +(EE) 3: /opt/xorg/bin/Xorg (mieqProcessDeviceEvent+0xd4) [0x609389] +(EE) 4: /opt/xorg/bin/Xorg (mieqProcessInputEvents+0x206) [0x609720] +(EE) 5: /opt/xorg/bin/Xorg (ProcessInputEvents+0xd) [0x4aeb58] +(EE) 6: /opt/xorg/bin/Xorg (xf86VTSwitch+0x1a6) [0x4af457] +(EE) 7: /opt/xorg/bin/Xorg (xf86Wakeup+0x2bf) [0x4af0a7] +(EE) 8: /opt/xorg/bin/Xorg (WakeupHandler+0x83) [0x4445cb] +(EE) 9: /opt/xorg/bin/Xorg (WaitForSomething+0x3fe) [0x491bf6] +(EE) 10: /opt/xorg/bin/Xorg (Dispatch+0x97) [0x435748] +(EE) 11: /opt/xorg/bin/Xorg (dix_main+0x61d) [0x4438a9] +(EE) 12: /opt/xorg/bin/Xorg (main+0x28) [0x49ba28] +(EE) 13: /lib64/libc.so.6 (__libc_start_main+0xf5) [0x37fc821d65] +(EE) 14: /opt/xorg/bin/Xorg (_start+0x29) [0x425e69] +(EE) 15: ? (?+0x29) [0x29] + +xf86VTSwitch() calls ProcessInputEvents() before disabling a device, and +DisableDevice() calls mieqProcessInputEvents() again when flushing touches and +button events. Between that and disabling the device (which causes new events +to be refused) there is a window where events may be triggered and enqueued. +On the next call to PIE that event is processed on a now defunct device, +causing the crash. + +The simplest fix to this is to discard events from disabled devices. We flush +the queue often enough before disabling that when we get here, we really don't +care about the events from this device. + +X.Org Bug 77884 + +Signed-off-by: Peter Hutterer +Reported-by: Maarten Lankhorst +Tested-by: Maarten Lankhorst +Reviewed-by: Keith Packard +Signed-off-by: Keith Packard +(cherry picked from commit 9fb08310b51b46736f3ca8dbc04efdf502420403) +--- + mi/mieq.c | 4 ++++ + test/input.c | 14 +++++++++++++- + 2 files changed, 17 insertions(+), 1 deletion(-) + +diff --git a/mi/mieq.c b/mi/mieq.c +index 4c07480..188a0b0 100644 +--- a/mi/mieq.c ++++ b/mi/mieq.c +@@ -515,6 +515,10 @@ mieqProcessDeviceEvent(DeviceIntPtr dev, InternalEvent *event, ScreenPtr screen) + + verify_internal_event(event); + ++ /* refuse events from disabled devices */ ++ if (!dev->enabled) ++ return 0; ++ + /* Custom event handler */ + handler = miEventQueue.handlers[event->any.type]; + +diff --git a/test/input.c b/test/input.c +index df20f82..4603c60 100644 +--- a/test/input.c ++++ b/test/input.c +@@ -1708,6 +1708,18 @@ mieq_test_event_handler(int screenNum, InternalEvent *ie, DeviceIntPtr dev) + static void + _mieq_test_generate_events(uint32_t start, uint32_t count) + { ++ static DeviceIntRec dev; ++ static SpriteInfoRec spriteInfo; ++ static SpriteRec sprite; ++ ++ memset(&dev, 0, sizeof(dev)); ++ memset(&spriteInfo, 0, sizeof(spriteInfo)); ++ memset(&sprite, 0, sizeof(sprite)); ++ dev.spriteInfo = &spriteInfo; ++ spriteInfo.sprite = &sprite; ++ ++ dev.enabled = 1; ++ + count += start; + while (start < count) { + RawDeviceEvent e = { 0 }; +@@ -1717,7 +1729,7 @@ _mieq_test_generate_events(uint32_t start, uint32_t count) + e.time = GetTimeInMillis(); + e.flags = start; + +- mieqEnqueue(NULL, (InternalEvent *) &e); ++ mieqEnqueue(&dev, (InternalEvent *) &e); + + start++; + } +-- +1.9.3 + diff --git a/SOURCES/0001-mustard-Don-t-probe-for-drivers-not-shipped-in-RHEL7.patch b/SOURCES/0001-mustard-Don-t-probe-for-drivers-not-shipped-in-RHEL7.patch new file mode 100644 index 0000000..d6bd969 --- /dev/null +++ b/SOURCES/0001-mustard-Don-t-probe-for-drivers-not-shipped-in-RHEL7.patch @@ -0,0 +1,185 @@ +From 3fef2f0a6b01a627b77ff82e9119f9fc6c285147 Mon Sep 17 00:00:00 2001 +From: Adam Jackson +Date: Wed, 17 Sep 2014 13:19:59 -0400 +Subject: [PATCH] mustard: Don't probe for drivers not shipped in RHEL7 + +Mostly this is here to prevent noise for ast/cirrus/mga/other server kit +trying to probe a driver that isn't there. I'm leaving vboxvideo in out +of the goodness of my heart; if people have RHEL7 vbox guests they +probably want the native driver, but we can't ship it in good conscience +since it's too tightly bound to the hypervisor version. + +Signed-off-by: Adam Jackson +--- + hw/xfree86/common/xf86pciBus.c | 121 +---------------------------------------- + 1 file changed, 1 insertion(+), 120 deletions(-) + +diff --git a/hw/xfree86/common/xf86pciBus.c b/hw/xfree86/common/xf86pciBus.c +index 258988a..e4d4402 100644 +--- a/hw/xfree86/common/xf86pciBus.c ++++ b/hw/xfree86/common/xf86pciBus.c +@@ -1099,68 +1099,18 @@ xf86VideoPtrToDriverList(struct pci_device *dev, + const char *driverList[5] = { NULL, NULL, NULL, NULL, NULL }; + + switch (dev->vendor_id) { +- /* AMD Geode LX */ +- case 0x1022: +- if (dev->device_id == 0x2081) +- driverList[0] = "geode"; +- break; +- /* older Geode products acquired by AMD still carry an NSC vendor_id */ +- case 0x100b: +- if (dev->device_id == 0x0030) { +- /* NSC Geode GX2 specifically */ +- driverList[0] = "geode"; +- /* GX2 support started its life in the NSC tree and was later +- forked by AMD for GEODE so we keep it as a backup */ +- driverList[1] = "nsc"; +- } +- else +- /* other NSC variant e.g. 0x0104 (SC1400), 0x0504 (SCx200) */ +- driverList[0] = "nsc"; +- break; +- /* Cyrix Geode GX1 */ +- case 0x1078: +- if (dev->device_id == 0x0104) +- driverList[0] = "cyrix"; +- break; +- case 0x1142: +- driverList[0] = "apm"; +- break; +- case 0xedd8: +- driverList[0] = "ark"; +- break; +- case 0x1a03: +- driverList[0] = "ast"; +- break; + case 0x1002: + driverList[0] = "ati"; + break; +- case 0x102c: +- driverList[0] = "chips"; +- break; +- case 0x1013: +- driverList[0] = "cirrus"; +- break; +- case 0x3d3d: +- driverList[0] = "glint"; +- break; +- case 0x105d: +- driverList[0] = "i128"; +- break; + case 0x8086: + switch (dev->device_id) + { + /* Intel i740 */ + case 0x00d1: + case 0x7800: +- driverList[0] = "i740"; +- break; + /* GMA500/Poulsbo */ + case 0x8108: + case 0x8109: +- /* Try psb driver on Poulsbo - if available */ +- driverList[0] = "psb"; +- driverList[1] = "psb_drv"; +- break; + /* GMA600/Oaktrail */ + case 0x4100: + case 0x4101: +@@ -1205,91 +1155,22 @@ xf86VideoPtrToDriverList(struct pci_device *dev, + break; + } + break; +- case 0x102b: +- driverList[0] = "mga"; +- break; +- case 0x10c8: +- driverList[0] = "neomagic"; +- break; + case 0x10de: + case 0x12d2: +- { +- int idx = 0; +- +-#ifdef __linux__ +- driverList[idx++] = "nouveau"; +-#endif +- driverList[idx++] = "nv"; ++ driverList[0] = "nouveau"; + break; +- } + case 0x1106: + driverList[0] = "openchrome"; + break; + case 0x1b36: + driverList[0] = "qxl"; + break; +- case 0x1163: +- driverList[0] = "rendition"; +- break; +- case 0x5333: +- switch (dev->device_id) { +- case 0x88d0: +- case 0x88d1: +- case 0x88f0: +- case 0x8811: +- case 0x8812: +- case 0x8814: +- case 0x8901: +- driverList[0] = "s3"; +- break; +- case 0x5631: +- case 0x883d: +- case 0x8a01: +- case 0x8a10: +- case 0x8c01: +- case 0x8c03: +- case 0x8904: +- case 0x8a13: +- driverList[0] = "s3virge"; +- break; +- default: +- driverList[0] = "savage"; +- break; +- } +- break; +- case 0x1039: +- driverList[0] = "sis"; +- break; +- case 0x126f: +- driverList[0] = "siliconmotion"; +- break; +- case 0x121a: +- if (dev->device_id < 0x0003) +- driverList[0] = "voodoo"; +- else +- driverList[0] = "tdfx"; +- break; +- 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 0x15ad: + driverList[0] = "vmware"; + break; +- case 0x18ca: +- if (dev->device_id == 0x47) +- driverList[0] = "xgixp"; +- else +- driverList[0] = "xgi"; +- break; + default: + break; + } +-- +1.9.3 + diff --git a/SOURCES/0001-mustard-Restore-XkbCopyDeviceKeymap.patch b/SOURCES/0001-mustard-Restore-XkbCopyDeviceKeymap.patch deleted file mode 100644 index c51a9b3..0000000 --- a/SOURCES/0001-mustard-Restore-XkbCopyDeviceKeymap.patch +++ /dev/null @@ -1,47 +0,0 @@ -From abdbfba12e439d6c27156b1f4a773d68337e30c0 Mon Sep 17 00:00:00 2001 -From: Adam Jackson -Date: Fri, 8 Nov 2013 09:44:24 -0500 -Subject: [PATCH] mustard: Restore XkbCopyDeviceKeymap - -xwayland series takes this out, tigervnc 1.2.80 needs it - -Signed-off-by: Adam Jackson ---- - include/xkbsrv.h | 3 +++ - xkb/xkbUtils.c | 6 ++++++ - 2 files changed, 9 insertions(+) - -diff --git a/include/xkbsrv.h b/include/xkbsrv.h -index 6a2e96e..d5a4eb6 100644 ---- a/include/xkbsrv.h -+++ b/include/xkbsrv.h -@@ -812,6 +812,9 @@ extern _X_EXPORT void XkbSendNewKeyboardNotify(DeviceIntPtr /* kbd */ , - extern Bool XkbCopyKeymap(XkbDescPtr /* dst */ , - XkbDescPtr /* src */ ); - -+extern _X_EXPORT Bool XkbCopyDeviceKeymap(DeviceIntPtr /* dst */, -+ DeviceIntPtr /* src */); -+ - extern _X_EXPORT Bool XkbDeviceApplyKeymap(DeviceIntPtr /* dst */ , - XkbDescPtr /* src */ ); - -diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c -index 6cf6e79..c14a790 100644 ---- a/xkb/xkbUtils.c -+++ b/xkb/xkbUtils.c -@@ -2027,6 +2027,12 @@ XkbDeviceApplyKeymap(DeviceIntPtr dst, XkbDescPtr desc) - return ret; - } - -+Bool -+XkbCopyDeviceKeymap(DeviceIntPtr dst, DeviceIntPtr src) -+{ -+ return XkbDeviceApplyKeymap(dst, src->key->xkbInfo->desc); -+} -+ - int - XkbGetEffectiveGroup(XkbSrvInfoPtr xkbi, XkbStatePtr xkbState, CARD8 keycode) - { --- -1.8.3.1 - diff --git a/SOURCES/0001-xf86AddBusDeviceToConfigure-Store-device-in-DevToCon.patch b/SOURCES/0001-xf86AddBusDeviceToConfigure-Store-device-in-DevToCon.patch new file mode 100644 index 0000000..eafc253 --- /dev/null +++ b/SOURCES/0001-xf86AddBusDeviceToConfigure-Store-device-in-DevToCon.patch @@ -0,0 +1,26 @@ +From 6db849550c71b6af00c220d03816495c970a5196 Mon Sep 17 00:00:00 2001 +From: Adam Jackson +Date: Wed, 13 Aug 2014 12:57:59 -0400 +Subject: [PATCH] xf86AddBusDeviceToConfigure(): Store device in + DevToConfig[i].pVideo + +Signed-off-by: Adam Jackson +--- + hw/xfree86/common/xf86Configure.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/hw/xfree86/common/xf86Configure.c b/hw/xfree86/common/xf86Configure.c +index 91e8df9..423b200 100644 +--- a/hw/xfree86/common/xf86Configure.c ++++ b/hw/xfree86/common/xf86Configure.c +@@ -90,6 +90,7 @@ xf86AddBusDeviceToConfigure(const char *driver, BusType bus, void *busData, + switch (bus) { + #ifdef XSERVER_LIBPCIACCESS + case BUS_PCI: ++ DevToConfig[i].pVideo = busData; + ret = xf86PciConfigure(busData, DevToConfig[i].pVideo); + break; + #endif +-- +1.9.3 + diff --git a/SOURCES/0001-xfree86-Add-modesetting-to-the-fallback-driver-list.patch b/SOURCES/0001-xfree86-Add-modesetting-to-the-fallback-driver-list.patch new file mode 100644 index 0000000..01b9535 --- /dev/null +++ b/SOURCES/0001-xfree86-Add-modesetting-to-the-fallback-driver-list.patch @@ -0,0 +1,26 @@ +From d144bd31ac1cb8d6af7346538c88853e4c26577d Mon Sep 17 00:00:00 2001 +From: Adam Jackson +Date: Wed, 13 Aug 2014 10:34:45 -0400 +Subject: [PATCH] xfree86: Add modesetting to the fallback driver list + +Signed-off-by: Adam Jackson +--- + hw/xfree86/common/xf86Config.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c +index b5efc02..79cef99 100644 +--- a/hw/xfree86/common/xf86Config.c ++++ b/hw/xfree86/common/xf86Config.c +@@ -507,7 +507,7 @@ xf86InputDriverlistFromConfig(void) + static void + fixup_video_driver_list(char **drivers) + { +- static const char *fallback[4] = { "fbdev", "vesa", "wsfb", NULL }; ++ static const char *fallback[5] = { "wsfb", "vesa", "fbdev", "modesetting", NULL }; + char **end, **drv; + char *x; + int i; +-- +2.1.0 + diff --git a/SOURCES/0001-xfree86-Allow-mixed-fbdev-and-pci-setups.patch b/SOURCES/0001-xfree86-Allow-mixed-fbdev-and-pci-setups.patch new file mode 100644 index 0000000..7439e80 --- /dev/null +++ b/SOURCES/0001-xfree86-Allow-mixed-fbdev-and-pci-setups.patch @@ -0,0 +1,111 @@ +From ca183b2a3c6e3877b93b6444acb1280356834a04 Mon Sep 17 00:00:00 2001 +From: Adam Jackson +Date: Tue, 5 Aug 2014 12:16:31 -0400 +Subject: [PATCH] xfree86: Allow mixed fbdev and pci setups + +You'd like to be able to do this because (for example) that way you'd be +able to drive both intel and udlfb at once. There's no fundamental +reason why that can't work, so just delete the check in PostProbe that +forbids it. Also in the fbdev driver, we're now actually passing the PCI +device in at init time, so we can look up the device node sanely. + +That almost works! Except then you break HyperV, because hyperv_fb +binds to the vmbus device, not the PCI device, because why the hell not. +So then the PCI probe path fails (because we try to find the fbdev node +under the PCI device tree, and fail), but the legacy probe path +succeeds; but then Init fails because we don't preserve that fd (or even +which /dev node we opened!), and since it _is_ a PCI device we try +fbdev_open_pci and that fails like it did during PCI probe. "I know", +you think, "I'll just record the choice made at probe time", and then +you remember you have nowhere to hang it. + +So, whatever. If we make it to Init we know Probe succeeded one way or +the other, so just fall back from pci-style to handwave-style in Init +once if it seem appropriate. And in all cases, use the explicit-device +open path even for PCI devices so that Option "fbdev" actually takes +effect. + +I think this is the best you can do without breaking the Probe +interface, though admittedly burning this all to the ground is a noble +goal. + +Signed-off-by: Adam Jackson +--- + hw/xfree86/common/xf86Bus.c | 16 ---------------- + hw/xfree86/fbdevhw/fbdevhw.c | 18 +++++++++++++++--- + 2 files changed, 15 insertions(+), 19 deletions(-) + +diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c +index d463e91..5adff0b 100644 +--- a/hw/xfree86/common/xf86Bus.c ++++ b/hw/xfree86/common/xf86Bus.c +@@ -548,22 +548,6 @@ xf86PostProbe(void) + { + int i; + +- if (fbSlotClaimed && ( +-#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__) +- sbusSlotClaimed || +-#endif +-#ifdef XSERVER_PLATFORM_BUS +- platformSlotClaimed || +-#endif +-#ifdef XSERVER_LIBPCIACCESS +- pciSlotClaimed +-#else +- TRUE +-#endif +- )) +- FatalError("Cannot run in framebuffer mode. Please specify busIDs " +- " for all framebuffer devices\n"); +- + for (i = 0; i < xf86NumEntities; i++) + if (xf86Entities[i]->entityInit) + xf86Entities[i]->entityInit(i, xf86Entities[i]->private); +diff --git a/hw/xfree86/fbdevhw/fbdevhw.c b/hw/xfree86/fbdevhw/fbdevhw.c +index cbb4093..657fc49 100644 +--- a/hw/xfree86/fbdevhw/fbdevhw.c ++++ b/hw/xfree86/fbdevhw/fbdevhw.c +@@ -347,7 +347,7 @@ fbdevHWProbe(struct pci_device *pPci, char *device, char **namep) + { + int fd; + +- if (pPci) ++ if (pPci && !device) + fd = fbdev_open_pci(pPci, namep); + else + fd = fbdev_open(-1, device, namep); +@@ -361,16 +361,28 @@ fbdevHWProbe(struct pci_device *pPci, char *device, char **namep) + Bool + fbdevHWInit(ScrnInfoPtr pScrn, struct pci_device *pPci, char *device) + { ++ static Bool been_here; + fbdevHWPtr fPtr; + + fbdevHWGetRec(pScrn); + fPtr = FBDEVHWPTR(pScrn); + + /* open device */ +- if (pPci) ++ if (pPci && !device) + fPtr->fd = fbdev_open_pci(pPci, NULL); + else +- fPtr->fd = fbdev_open(pScrn->scrnIndex, device, NULL); ++ fPtr->fd = fbdev_open(pScrn->scrnIndex, device, NULL); ++ ++ if (pPci && fPtr->fd == -1) { ++ if (been_here != serverGeneration) { ++ fPtr->fd = fbdev_open(pScrn->scrnIndex, device, NULL); ++ been_here = serverGeneration; ++ } else { ++ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, ++ "Please specify Option \"fbdev\" to use this device\n"); ++ } ++ } ++ + if (-1 == fPtr->fd) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to open framebuffer device, consult warnings" +-- +2.1.0 + diff --git a/SOURCES/0001-xfree86-Only-look-at-wayland-capable-drivers-when-wa.patch b/SOURCES/0001-xfree86-Only-look-at-wayland-capable-drivers-when-wa.patch deleted file mode 100644 index 795f799..0000000 --- a/SOURCES/0001-xfree86-Only-look-at-wayland-capable-drivers-when-wa.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 9354bdf25ce2c265f65c52610e0f21cd8267cc44 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Wed, 2 Oct 2013 12:38:45 -0400 -Subject: [PATCH] xfree86: Only look at wayland-capable drivers when -wayland - given - -There's no particularly good reason to support mixing wayland and -non-wayland screens in the same Xorg instance, and it probably doesn't -work correctly, so let's prevent people from injuring themselves. - -Reviewed-by: Adam Jackson -Signed-off-by: Ray Strode ---- - hw/xfree86/common/xf86Init.c | 20 ++++++++++---------- - 1 file changed, 10 insertions(+), 10 deletions(-) - -diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c -index a5a7daf..a40ed64 100644 ---- a/hw/xfree86/common/xf86Init.c -+++ b/hw/xfree86/common/xf86Init.c -@@ -550,26 +550,26 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv) - xf86DriverList[i]->driverFunc(NULL, - GET_REQUIRED_HW_INTERFACES, - &flags); -- -- if (NEED_IO_ENABLED(flags)) -- want_hw_access = TRUE; -- -- if (!(flags & HW_SKIP_CONSOLE)) -- xorgHWOpenConsole = TRUE; -- - if (xorgWayland) { -- if (flags != HW_WAYLAND) { -+ if (!(flags & HW_WAYLAND)) { - xf86DeleteDriver(i); - continue; - } - - want_hw_access = FALSE; - xorgHWOpenConsole = FALSE; -- } -+ -+ } else { -+ if (NEED_IO_ENABLED(flags)) -+ want_hw_access = TRUE; -+ -+ if (!(flags & HW_SKIP_CONSOLE)) -+ xorgHWOpenConsole = TRUE; -+ } - } - - for (i = 0; i < xf86NumDrivers; i++) { -- if (xf86DriverList[i] == NULL) { -+ while (xf86DriverList[i] == NULL) { - for (j = i; j < xf86NumDrivers; j++) { - xf86DriverList[j] = xf86DriverList[j + 1]; - } --- -1.8.3.1 - diff --git a/SOURCES/0001-xinerama-Implement-graphics-exposures-for-window-pix.patch b/SOURCES/0001-xinerama-Implement-graphics-exposures-for-window-pix.patch new file mode 100644 index 0000000..4eceb4a --- /dev/null +++ b/SOURCES/0001-xinerama-Implement-graphics-exposures-for-window-pix.patch @@ -0,0 +1,139 @@ +From a92dd0013ae184c921f3415e651ff53da2ca9397 Mon Sep 17 00:00:00 2001 +From: Adam Jackson +Date: Wed, 24 Sep 2014 11:31:51 -0400 +Subject: [PATCH] xinerama: Implement graphics exposures for window->pixmap + copies (v2) + +This code is using GetImage to accumulate a logical view of the window +image (since the windows will be clipped to their containing screen), +and then PutImage to load that back into the pixmap. What it wasn't +doing was constructing a region for the obscured areas of the window and +emitting graphics exposures for same. + +This special case for window->pixmap copies (and corresponding lack of +graphics exposures) appears to date back to cvs revision 3.15 of this +file in xfree86, which makes it almost exactly fifteen years old. It's +possible that we could do better now, since Composite would mean that +for redirected windows we would in fact have consistent window contents +on every screen. Would be slightly ugly to have Xinerama know about +Composite at the dispatch level, but then this is Xinerama we're talking +about, nothing's pretty here. + +v2: Fix coordinate translation when the source is the root window + +Signed-off-by: Adam Jackson +--- + Xext/panoramiXprocs.c | 70 +++++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 60 insertions(+), 10 deletions(-) + +diff --git a/Xext/panoramiXprocs.c b/Xext/panoramiXprocs.c +index 83a2e08..8e3120d 100644 +--- a/Xext/panoramiXprocs.c ++++ b/Xext/panoramiXprocs.c +@@ -1050,7 +1050,7 @@ PanoramiXClearToBackground(ClientPtr client) + int + PanoramiXCopyArea(ClientPtr client) + { +- int j, result, srcx, srcy, dstx, dsty; ++ int j, result, srcx, srcy, dstx, dsty, width, height; + PanoramiXRes *gc, *src, *dst; + Bool srcIsRoot = FALSE; + Bool dstIsRoot = FALSE; +@@ -1091,6 +1091,8 @@ PanoramiXCopyArea(ClientPtr client) + srcy = stuff->srcY; + dstx = stuff->dstX; + dsty = stuff->dstY; ++ width = stuff->width; ++ height = stuff->height; + if ((dst->type == XRT_PIXMAP) && (src->type == XRT_WINDOW)) { + DrawablePtr drawables[MAXSCREENS]; + DrawablePtr pDst; +@@ -1105,13 +1107,12 @@ PanoramiXCopyArea(ClientPtr client) + return rc; + } + +- pitch = PixmapBytePad(stuff->width, drawables[0]->depth); +- if (!(data = calloc(1, stuff->height * pitch))) ++ pitch = PixmapBytePad(width, drawables[0]->depth); ++ if (!(data = calloc(1, height * pitch))) + return BadAlloc; + +- XineramaGetImageData(drawables, srcx, srcy, +- stuff->width, stuff->height, ZPixmap, ~0, data, +- pitch, srcIsRoot); ++ XineramaGetImageData(drawables, srcx, srcy, width, height, ZPixmap, ~0, ++ data, pitch, srcIsRoot); + + FOR_NSCREENS_BACKWARD(j) { + stuff->gc = gc->info[j].id; +@@ -1123,14 +1124,63 @@ PanoramiXCopyArea(ClientPtr client) + } + + (*pGC->ops->PutImage) (pDst, pGC, pDst->depth, dstx, dsty, +- stuff->width, stuff->height, +- 0, ZPixmap, data); +- ++ width, height, 0, ZPixmap, data); + if (dstShared) + break; + } +- + free(data); ++ ++ if (pGC->graphicsExposures) { ++ RegionRec rgn; ++ int dx, dy; ++ ++ /* create region for source box */ ++ BoxRec sourceBox = { srcx, srcy, srcx + width, srcy + height }; ++ RegionInit(&rgn, &sourceBox, 1); ++ ++ dx = drawables[0]->x; ++ dy = drawables[0]->y; ++ if (srcIsRoot) { ++ dx += screenInfo.screens[0]->x; ++ dy += screenInfo.screens[0]->y; ++ } ++ ++ /* translate from source-relative to screen */ ++ RegionTranslate(&rgn, dx, dy); ++ ++ /* subtract the (screen-space) clips of the source drawables */ ++ FOR_NSCREENS(j) { ++ ScreenPtr screen = screenInfo.screens[j]; ++ RegionPtr sd; ++ ++ if (pGC->subWindowMode == IncludeInferiors) ++ sd = NotClippedByChildren((WindowPtr)drawables[j]); ++ else ++ sd = &((WindowPtr)drawables[j])->clipList; ++ ++ if (srcIsRoot) ++ RegionTranslate(&rgn, -screen->x, -screen->y); ++ ++ RegionSubtract(&rgn, &rgn, sd); ++ ++ if (srcIsRoot) ++ RegionTranslate(&rgn, screen->x, screen->y); ++ ++ if (pGC->subWindowMode == IncludeInferiors) ++ RegionDestroy(sd); ++ } ++ ++ /* -dx/-dy to get back to dest-relative, plus request offsets */ ++ RegionTranslate(&rgn, -dx + dstx, -dy + dsty); ++ ++ /* intersect with gc clip; just one screen is fine because pixmap */ ++ RegionIntersect(&rgn, &rgn, pGC->pCompositeClip); ++ ++ /* and expose */ ++ pGC->pScreen->SendGraphicsExpose(client, &rgn, dst->info[0].id, ++ X_CopyArea, 0); ++ RegionUninit(&rgn); ++ } + } + else { + DrawablePtr pDst = NULL, pSrc = NULL; +-- +1.9.3 + diff --git a/SOURCES/0001-xkb-factor-out-the-StateNotify-flag-check.patch b/SOURCES/0001-xkb-factor-out-the-StateNotify-flag-check.patch new file mode 100644 index 0000000..23be5f4 --- /dev/null +++ b/SOURCES/0001-xkb-factor-out-the-StateNotify-flag-check.patch @@ -0,0 +1,60 @@ +From 8826be58a43ba27f5c65b71535cd6985b5e7ca0d Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Wed, 26 Feb 2014 16:03:19 +1000 +Subject: [PATCH 1/4] xkb: factor out the StateNotify flag check + +Signed-off-by: Peter Hutterer +Reviewed-by: Daniel Stone +(cherry picked from commit dda2468e579762dbd1fed2c75b5587d98f841e9c) +--- + xkb/xkbActions.c | 27 ++++++++++++++++++--------- + 1 file changed, 18 insertions(+), 9 deletions(-) + +diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c +index e32005c..26e1fa0 100644 +--- a/xkb/xkbActions.c ++++ b/xkb/xkbActions.c +@@ -1127,6 +1127,22 @@ _XkbApplyFilters(XkbSrvInfoPtr xkbi, unsigned kc, XkbAction *pAction) + return send; + } + ++static int ++_XkbEnsureStateChange(XkbSrvInfoPtr xkbi) ++{ ++ Bool genStateNotify = FALSE; ++ ++ /* The state may change, so if we're not in the middle of sending a state ++ * notify, prepare for it */ ++ if ((xkbi->flags & _XkbStateNotifyInProgress) == 0) { ++ xkbi->prev_state = xkbi->state; ++ xkbi->flags |= _XkbStateNotifyInProgress; ++ genStateNotify = TRUE; ++ } ++ ++ return genStateNotify; ++} ++ + void + XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent *event) + { +@@ -1146,15 +1162,8 @@ XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent *event) + keyc = kbd->key; + xkbi = keyc->xkbInfo; + key = event->detail.key; +- /* The state may change, so if we're not in the middle of sending a state +- * notify, prepare for it */ +- if ((xkbi->flags & _XkbStateNotifyInProgress) == 0) { +- xkbi->prev_state = xkbi->state; +- xkbi->flags |= _XkbStateNotifyInProgress; +- genStateNotify = TRUE; +- } +- else +- genStateNotify = FALSE; ++ ++ genStateNotify = _XkbEnsureStateChange(xkbi); + + xkbi->clearMods = xkbi->setMods = 0; + xkbi->groupChange = 0; +-- +1.9.3 + diff --git a/SOURCES/0001-xwayland-Just-send-the-bounding-box-of-the-damage.patch b/SOURCES/0001-xwayland-Just-send-the-bounding-box-of-the-damage.patch deleted file mode 100644 index f15706a..0000000 --- a/SOURCES/0001-xwayland-Just-send-the-bounding-box-of-the-damage.patch +++ /dev/null @@ -1,59 +0,0 @@ -From a655c446880613e17c3b91e66a7f7ac125f62228 Mon Sep 17 00:00:00 2001 -From: Adam Jackson -Date: Tue, 8 Oct 2013 13:54:27 -0400 -Subject: [PATCH] xwayland: Just send the bounding box of the damage - -... instead of every rect. Most window updates are going to be CopyArea -in from offscreen, with plenty of time to get back around to -BlockHandler in between, so this is no change there. However for -pathological apps like x11perf that draw complicated primitives directly -to the window you can end up with massive numbers of damage rects, and -you can run out of space in the write buffer and crash. - -This obviously isn't a complete fix, and it would be nice to handle this -more gracefully in the wayland client code, but this at least lets -x11perf -all run to completion. - -While we're in the area, rearrange attach to be before damage, not -after, since the spec says that's the correct order. - -Signed-off-by: Adam Jackson ---- - hw/xfree86/xwayland/xwayland.c | 14 +++++--------- - 1 file changed, 5 insertions(+), 9 deletions(-) - -diff --git a/hw/xfree86/xwayland/xwayland.c b/hw/xfree86/xwayland/xwayland.c -index c70a52d..c10a213 100644 ---- a/hw/xfree86/xwayland/xwayland.c -+++ b/hw/xfree86/xwayland/xwayland.c -@@ -333,22 +333,18 @@ void xwl_screen_post_damage(struct xwl_screen *xwl_screen) - struct xwl_window *xwl_window; - RegionPtr region; - BoxPtr box; -- int count, i; - - xorg_list_for_each_entry(xwl_window, &xwl_screen->damage_window_list, - link_damage) { - region = DamageRegion(xwl_window->damage); -- count = RegionNumRects(region); -- for (i = 0; i < count; i++) { -- box = &RegionRects(region)[i]; -- wl_surface_damage(xwl_window->surface, -- box->x1, box->y1, -- box->x2 - box->x1, -- box->y2 - box->y1); -- } - wl_surface_attach(xwl_window->surface, - xwl_window->buffer, - 0, 0); -+ box = ®ion->extents; -+ wl_surface_damage(xwl_window->surface, -+ box->x1, box->y1, -+ box->x2 - box->x1, -+ box->y2 - box->y1); - wl_surface_commit(xwl_window->surface); - DamageEmpty(xwl_window->damage); - } --- -1.8.3.1 - diff --git a/SOURCES/0002-dix-GetHosts-bounds-check-using-wrong-pointer-value-.patch b/SOURCES/0002-dix-GetHosts-bounds-check-using-wrong-pointer-value-.patch deleted file mode 100644 index c75c0a8..0000000 --- a/SOURCES/0002-dix-GetHosts-bounds-check-using-wrong-pointer-value-.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 1559a94395258fd73e369f1a2c98a44bfe21a486 Mon Sep 17 00:00:00 2001 -From: Keith Packard -Date: Tue, 9 Dec 2014 09:31:00 -0800 -Subject: [PATCH 2/2] dix: GetHosts bounds check using wrong pointer value - [CVE-2014-8092 pt. 6] - -GetHosts saves the pointer to allocated memory in *data, and then -wants to bounds-check writes to that region, but was mistakenly using -a bare 'data' instead of '*data'. Also, data is declared as void **, -so we need a cast to turn it into a byte pointer so we can actually do -pointer comparisons. - -Signed-off-by: Keith Packard -Reviewed-by: Alan Coopersmith -Signed-off-by: Alan Coopersmith ---- - os/access.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/os/access.c b/os/access.c -index f393c8d..28f2d32 100644 ---- a/os/access.c -+++ b/os/access.c -@@ -1308,7 +1308,7 @@ GetHosts(void **data, int *pnHosts, int *pLen, BOOL * pEnabled) - } - for (host = validhosts; host; host = host->next) { - len = host->len; -- if ((ptr + sizeof(xHostEntry) + len) > (data + n)) -+ if ((ptr + sizeof(xHostEntry) + len) > ((unsigned char *) *data + n)) - break; - ((xHostEntry *) ptr)->family = host->family; - ((xHostEntry *) ptr)->length = len; --- -2.1.0 - diff --git a/SOURCES/0002-dri2-Use-the-PrimeScreen-when-creating-reusing-buffe.patch b/SOURCES/0002-dri2-Use-the-PrimeScreen-when-creating-reusing-buffe.patch new file mode 100644 index 0000000..4a9f35c --- /dev/null +++ b/SOURCES/0002-dri2-Use-the-PrimeScreen-when-creating-reusing-buffe.patch @@ -0,0 +1,64 @@ +From f863f15c7cb3af88975aab17a87746887f6d2a28 Mon Sep 17 00:00:00 2001 +From: Chris Wilson +Date: Wed, 18 Jun 2014 11:14:43 +0100 +Subject: [PATCH 2/3] dri2: Use the PrimeScreen when creating/reusing buffers + +This fixes a segfault when we attempt to call ds->ReuseBufferNotify() +passing a Prime DRI2BufferPtr to the master backend. + +Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=80001 +Signed-off-by: Chris Wilson +Reviewed-by: Dave Airlie +Signed-off-by: Keith Packard +--- + hw/xfree86/dri2/dri2.c | 16 ++++++---------- + 1 file changed, 6 insertions(+), 10 deletions(-) + +diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c +index a983aed..074ef08 100644 +--- a/hw/xfree86/dri2/dri2.c ++++ b/hw/xfree86/dri2/dri2.c +@@ -415,18 +415,14 @@ DRI2DrawableGone(pointer p, XID id) + } + + static DRI2BufferPtr +-create_buffer(DrawablePtr pDraw, ++create_buffer(DRI2ScreenPtr ds, DrawablePtr pDraw, + unsigned int attachment, unsigned int format) + { +- ScreenPtr primeScreen; +- DRI2DrawablePtr pPriv; +- DRI2ScreenPtr ds; + DRI2BufferPtr buffer; +- pPriv = DRI2GetDrawable(pDraw); +- primeScreen = GetScreenPrime(pDraw->pScreen, pPriv->prime_id); +- ds = DRI2GetScreenPrime(pDraw->pScreen, pPriv->prime_id); + if (ds->CreateBuffer2) +- buffer = (*ds->CreateBuffer2)(primeScreen, pDraw, attachment, format); ++ buffer = (*ds->CreateBuffer2)(GetScreenPrime(pDraw->pScreen, ++ DRI2GetDrawable(pDraw)->prime_id), ++ pDraw, attachment, format); + else + buffer = (*ds->CreateBuffer)(pDraw, attachment, format); + return buffer; +@@ -475,7 +471,7 @@ allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds, + if ((old_buf < 0) + || attachment == DRI2BufferFrontLeft + || !dimensions_match || (pPriv->buffers[old_buf]->format != format)) { +- *buffer = create_buffer (pDraw, attachment, format); ++ *buffer = create_buffer(ds, pDraw, attachment, format); + return TRUE; + + } +@@ -538,7 +534,7 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height, + return NULL; + } + +- ds = DRI2GetScreen(pDraw->pScreen); ++ ds = DRI2GetScreenPrime(pDraw->pScreen, pPriv->prime_id); + + dimensions_match = (pDraw->width == pPriv->width) + && (pDraw->height == pPriv->height); +-- +1.9.3 + diff --git a/SOURCES/0002-mi-Build-fix-mieqProcessDeviceEvent-returns-void.patch b/SOURCES/0002-mi-Build-fix-mieqProcessDeviceEvent-returns-void.patch new file mode 100644 index 0000000..885afdf --- /dev/null +++ b/SOURCES/0002-mi-Build-fix-mieqProcessDeviceEvent-returns-void.patch @@ -0,0 +1,36 @@ +From 0cf6a389dac4b15a832cd33a341b2dfeedcedff0 Mon Sep 17 00:00:00 2001 +From: Jeremy Huddleston Sequoia +Date: Thu, 5 Jun 2014 20:38:44 -0700 +Subject: [PATCH 2/3] mi: Build fix: mieqProcessDeviceEvent returns void + +mieq.c:520:9: error: void function 'mieqProcessDeviceEvent' should not return a value [-Wreturn-type,Semantic Issue] + return 0; + ^ ~ +1 error generated. + +Regression-from: 9fb08310b51b46736f3ca8dbc04efdf502420403 +Found-by: Tinderbox + +Signed-off-by: Jeremy Huddleston Sequoia +Reviewed-by: Peter Hutterer +(cherry picked from commit e27a839bf0488d5b1cc2e2a887f2ea0e3d790790) +--- + mi/mieq.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/mi/mieq.c b/mi/mieq.c +index 188a0b0..a321983 100644 +--- a/mi/mieq.c ++++ b/mi/mieq.c +@@ -517,7 +517,7 @@ mieqProcessDeviceEvent(DeviceIntPtr dev, InternalEvent *event, ScreenPtr screen) + + /* refuse events from disabled devices */ + if (!dev->enabled) +- return 0; ++ return; + + /* Custom event handler */ + handler = miEventQueue.handlers[event->any.type]; +-- +1.9.3 + diff --git a/SOURCES/0002-xkb-Add-struct-XkbCompContext.patch b/SOURCES/0002-xkb-Add-struct-XkbCompContext.patch deleted file mode 100644 index e8014b5..0000000 --- a/SOURCES/0002-xkb-Add-struct-XkbCompContext.patch +++ /dev/null @@ -1,190 +0,0 @@ -From 8470f377fc36772d885f4b614f4d42443c4b812b Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= -Date: Tue, 9 Apr 2013 16:54:55 -0400 -Subject: [PATCH 02/38] xkb: Add struct XkbCompContext - -This commit adds a struct that contains most of the context for starting, -running and cleaning up after xkbcomp. - -Reviewed-by: Daniel Stone ---- - xkb/ddxLoad.c | 76 +++++++++++++++++++++++++++++------------------------------ - 1 file changed, 38 insertions(+), 38 deletions(-) - -diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c -index d462957..5da3a35 100644 ---- a/xkb/ddxLoad.c -+++ b/xkb/ddxLoad.c -@@ -90,14 +90,21 @@ OutputDirectory(char *outdir, size_t size) - } - } - -+typedef struct XkbCompContext { -+ char keymap[PATH_MAX]; -+ FILE *out; -+ char *buf; -+ char tmpname[PATH_MAX]; -+ const char *xkmfile; -+} XkbCompContextRec, *XkbCompContextPtr; -+ - static Bool - XkbDDXCompileKeymapByNames(XkbDescPtr xkb, - XkbComponentNamesPtr names, - unsigned want, -- unsigned need, char *nameRtrn, int nameRtrnLen) -+ unsigned need, XkbCompContextPtr ctx) - { -- FILE *out; -- char *buf = NULL, keymap[PATH_MAX], xkm_output_dir[PATH_MAX]; -+ char xkm_output_dir[PATH_MAX]; - - const char *emptystring = ""; - char *xkbbasedirflag = NULL; -@@ -105,22 +112,19 @@ XkbDDXCompileKeymapByNames(XkbDescPtr xkb, - const char *xkbbindirsep = emptystring; - - #ifdef WIN32 -- /* WIN32 has no popen. The input must be stored in a file which is -- used as input for xkbcomp. xkbcomp does not read from stdin. */ -- char tmpname[PATH_MAX]; -- const char *xkmfile = tmpname; -+ ctx->xkmfile = ctx->tmpname; - #else -- const char *xkmfile = "-"; -+ ctx->xkmfile = "-"; - #endif - -- snprintf(keymap, sizeof(keymap), "server-%s", display); -+ snprintf(ctx->keymap, sizeof(ctx->keymap), "server-%s", display); - - OutputDirectory(xkm_output_dir, sizeof(xkm_output_dir)); - - #ifdef WIN32 -- strcpy(tmpname, Win32TempDir()); -- strcat(tmpname, "\\xkb_XXXXXX"); -- (void) mktemp(tmpname); -+ strcpy(ctx->tmpname, Win32TempDir()); -+ strcat(ctx->tmpname, "\\xkb_XXXXXX"); -+ (void) mktemp(ctx->tmpname); - #endif - - if (XkbBaseDirectory != NULL) { -@@ -139,73 +143,69 @@ XkbDDXCompileKeymapByNames(XkbDescPtr xkb, - } - } - -- if (asprintf(&buf, -+ if (asprintf(&ctx->buf, - "\"%s%sxkbcomp\" -w %d %s -xkm \"%s\" " - "-em1 %s -emp %s -eml %s \"%s%s.xkm\"", - xkbbindir, xkbbindirsep, - ((xkbDebugFlags < 2) ? 1 : - ((xkbDebugFlags > 10) ? 10 : (int) xkbDebugFlags)), -- xkbbasedirflag ? xkbbasedirflag : "", xkmfile, -+ xkbbasedirflag ? xkbbasedirflag : "", ctx->xkmfile, - PRE_ERROR_MSG, ERROR_PREFIX, POST_ERROR_MSG1, -- xkm_output_dir, keymap) == -1) -- buf = NULL; -+ xkm_output_dir, ctx->keymap) == -1) -+ ctx->buf = NULL; - - free(xkbbasedirflag); - -- if (!buf) { -+ if (!ctx->buf) { - LogMessage(X_ERROR, - "XKB: Could not invoke xkbcomp: not enough memory\n"); - return FALSE; - } - - #ifndef WIN32 -- out = Popen(buf, "w"); -+ ctx->out = Popen(ctx->buf, "w"); - #else -- out = fopen(tmpname, "w"); -+ ctx->out = fopen(ctx->tmpname, "w"); - #endif - -- if (out != NULL) { -+ if (ctx->out != NULL) { - #ifdef DEBUG - if (xkbDebugFlags) { - ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n"); - XkbWriteXKBKeymapForNames(stderr, names, xkb, want, need); - } - #endif -- XkbWriteXKBKeymapForNames(out, names, xkb, want, need); -+ XkbWriteXKBKeymapForNames(ctx->out, names, xkb, want, need); - #ifndef WIN32 -- if (Pclose(out) == 0) -+ if (Pclose(ctx->out) == 0) - #else -- if (fclose(out) == 0 && System(buf) >= 0) -+ if (fclose(ctx->out) == 0 && System(ctx->buf) >= 0) - #endif - { - if (xkbDebugFlags) -- DebugF("[xkb] xkb executes: %s\n", buf); -- if (nameRtrn) { -- strlcpy(nameRtrn, keymap, nameRtrnLen); -- } -- free(buf); -+ DebugF("[xkb] xkb executes: %s\n", ctx->buf); -+ free(ctx->buf); - #ifdef WIN32 -- unlink(tmpname); -+ unlink(ctx->tmpname); - #endif - return TRUE; - } - else -- LogMessage(X_ERROR, "Error compiling keymap (%s)\n", keymap); -+ LogMessage(X_ERROR, "Error compiling keymap (%s)\n", ctx->keymap); - #ifdef WIN32 - /* remove the temporary file */ -- unlink(tmpname); -+ unlink(ctx->tmpname); - #endif - } - else { - #ifndef WIN32 - LogMessage(X_ERROR, "XKB: Could not invoke xkbcomp\n"); - #else -- LogMessage(X_ERROR, "Could not open file %s\n", tmpname); -+ LogMessage(X_ERROR, "Could not open file %s\n", ctx->tmpname); - #endif - } -- if (nameRtrn) -- nameRtrn[0] = '\0'; -- free(buf); -+ ctx->keymap[0] = '\0'; -+ free(ctx->buf); - return FALSE; - } - -@@ -256,6 +256,7 @@ XkbDDXLoadKeymapByNames(DeviceIntPtr keybd, - FILE *file; - char fileName[PATH_MAX]; - unsigned missing; -+ XkbCompContextRec ctx; - - *xkbRtrn = NULL; - if ((keybd == NULL) || (keybd->key == NULL) || -@@ -270,12 +271,11 @@ XkbDDXLoadKeymapByNames(DeviceIntPtr keybd, - keybd->name ? keybd->name : "(unnamed keyboard)"); - return 0; - } -- else if (!XkbDDXCompileKeymapByNames(xkb, names, want, need, -- nameRtrn, nameRtrnLen)) { -+ else if (!XkbDDXCompileKeymapByNames(xkb, names, want, need, &ctx)) { - LogMessage(X_ERROR, "XKB: Couldn't compile keymap\n"); - return 0; - } -- file = XkbDDXOpenConfigFile(nameRtrn, fileName, PATH_MAX); -+ file = XkbDDXOpenConfigFile(ctx.keymap, fileName, PATH_MAX); - if (file == NULL) { - LogMessage(X_ERROR, "Couldn't open compiled keymap file %s\n", - fileName); --- -1.8.4.2 - diff --git a/SOURCES/0002-xkb-factor-out-state-update-into-a-function.patch b/SOURCES/0002-xkb-factor-out-state-update-into-a-function.patch new file mode 100644 index 0000000..1ffdfb7 --- /dev/null +++ b/SOURCES/0002-xkb-factor-out-state-update-into-a-function.patch @@ -0,0 +1,96 @@ +From 9afd9b0a614a43800dabbe08eee3f82fb486c20f Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Wed, 26 Feb 2014 16:16:10 +1000 +Subject: [PATCH 2/4] xkb: factor out state update into a function + +No functional changes + +Signed-off-by: Peter Hutterer +Reviewed-by: Daniel Stone +(cherry picked from commit 656841798c99bcd79da47c03ec666a48b855541f) +--- + xkb/xkbActions.c | 55 ++++++++++++++++++++++++++++++++----------------------- + 1 file changed, 32 insertions(+), 23 deletions(-) + +diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c +index 26e1fa0..2534c70 100644 +--- a/xkb/xkbActions.c ++++ b/xkb/xkbActions.c +@@ -1143,13 +1143,43 @@ _XkbEnsureStateChange(XkbSrvInfoPtr xkbi) + return genStateNotify; + } + ++static void ++_XkbApplyState(DeviceIntPtr dev, Bool genStateNotify, int evtype, int key) ++{ ++ XkbSrvInfoPtr xkbi = dev->key->xkbInfo; ++ int changed; ++ ++ XkbComputeDerivedState(xkbi); ++ ++ changed = XkbStateChangedFlags(&xkbi->prev_state, &xkbi->state); ++ if (genStateNotify) { ++ if (changed) { ++ xkbStateNotify sn; ++ ++ sn.keycode = key; ++ sn.eventType = evtype; ++ sn.requestMajor = sn.requestMinor = 0; ++ sn.changed = changed; ++ XkbSendStateNotify(dev, &sn); ++ } ++ xkbi->flags &= ~_XkbStateNotifyInProgress; ++ } ++ ++ changed = XkbIndicatorsToUpdate(dev, changed, FALSE); ++ if (changed) { ++ XkbEventCauseRec cause; ++ XkbSetCauseKey(&cause, key, evtype); ++ XkbUpdateIndicators(dev, changed, FALSE, NULL, &cause); ++ } ++} ++ + void + XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent *event) + { + int key, bit, i; + XkbSrvInfoPtr xkbi; + KeyClassPtr keyc; +- int changed, sendEvent; ++ int sendEvent; + Bool genStateNotify; + XkbAction act; + XkbFilterPtr filter; +@@ -1296,28 +1326,7 @@ XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent *event) + FixKeyState(event, dev); + } + +- XkbComputeDerivedState(xkbi); +- changed = XkbStateChangedFlags(&xkbi->prev_state, &xkbi->state); +- if (genStateNotify) { +- if (changed) { +- xkbStateNotify sn; +- +- sn.keycode = key; +- sn.eventType = event->type; +- sn.requestMajor = sn.requestMinor = 0; +- sn.changed = changed; +- XkbSendStateNotify(dev, &sn); +- } +- xkbi->flags &= ~_XkbStateNotifyInProgress; +- } +- changed = XkbIndicatorsToUpdate(dev, changed, FALSE); +- if (changed) { +- XkbEventCauseRec cause; +- +- XkbSetCauseKey(&cause, key, event->type); +- XkbUpdateIndicators(dev, changed, FALSE, NULL, &cause); +- } +- return; ++ _XkbApplyState(dev, genStateNotify, event->type, key); + } + + int +-- +1.9.3 + diff --git a/SOURCES/0003-dri2-Invalidate-DRI2Buffers-upon-SetWindowPixmap-upd.patch b/SOURCES/0003-dri2-Invalidate-DRI2Buffers-upon-SetWindowPixmap-upd.patch new file mode 100644 index 0000000..05076a1 --- /dev/null +++ b/SOURCES/0003-dri2-Invalidate-DRI2Buffers-upon-SetWindowPixmap-upd.patch @@ -0,0 +1,78 @@ +From d789f561b787719b67fd245c33187e48ad792795 Mon Sep 17 00:00:00 2001 +From: Chris Wilson +Date: Tue, 10 Jun 2014 07:45:05 +0100 +Subject: [PATCH 3/3] dri2: Invalidate DRI2Buffers upon SetWindowPixmap updates + +When transitioning to a redirected or unredirected Window, the Composite +layer modifies the Window's Pixmap. However, the DRI2Buffer for the +Drawable is still pointing to the backing bo of the old Pixmap with the +result that rendering goes astray. + +This now also effects DRI2 Drawables that are touched by PresentPixmap. + +v2: Fixup the function name after rebasing + +Signed-off-by: Chris Wilson +Cc: Reinis Danne +Reviewed-by: Dave Airlie +Cc: Keith Packard +Signed-off-by: Keith Packard +--- + hw/xfree86/dri2/dri2.c | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c +index 074ef08..38a83cd 100644 +--- a/hw/xfree86/dri2/dri2.c ++++ b/hw/xfree86/dri2/dri2.c +@@ -130,6 +130,7 @@ typedef struct _DRI2Screen { + HandleExposuresProcPtr HandleExposures; + + ConfigNotifyProcPtr ConfigNotify; ++ SetWindowPixmapProcPtr SetWindowPixmap; + DRI2CreateBuffer2ProcPtr CreateBuffer2; + DRI2DestroyBuffer2ProcPtr DestroyBuffer2; + DRI2CopyRegion2ProcPtr CopyRegion2; +@@ -1379,6 +1380,21 @@ DRI2ConfigNotify(WindowPtr pWin, int x, int y, int w, int h, int bw, + return Success; + } + ++static void ++DRI2SetWindowPixmap(WindowPtr pWin, PixmapPtr pPix) ++{ ++ DrawablePtr pDraw = (DrawablePtr) pWin; ++ ScreenPtr pScreen = pDraw->pScreen; ++ DRI2ScreenPtr ds = DRI2GetScreen(pScreen); ++ ++ pScreen->SetWindowPixmap = ds->SetWindowPixmap; ++ (*pScreen->SetWindowPixmap) (pWin, pPix); ++ ds->SetWindowPixmap = pScreen->SetWindowPixmap; ++ pScreen->SetWindowPixmap = DRI2SetWindowPixmap; ++ ++ DRI2InvalidateDrawableAll(pDraw); ++} ++ + #define MAX_PRIME DRI2DriverPrimeMask + static int + get_prime_id(void) +@@ -1525,6 +1541,9 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info) + ds->ConfigNotify = pScreen->ConfigNotify; + pScreen->ConfigNotify = DRI2ConfigNotify; + ++ ds->SetWindowPixmap = pScreen->SetWindowPixmap; ++ pScreen->SetWindowPixmap = DRI2SetWindowPixmap; ++ + xf86DrvMsg(pScreen->myNum, X_INFO, "[DRI2] Setup complete\n"); + for (i = 0; i < sizeof(driverTypeNames) / sizeof(driverTypeNames[0]); i++) { + if (i < ds->numDrivers && ds->driverNames[i]) { +@@ -1549,6 +1568,7 @@ DRI2CloseScreen(ScreenPtr pScreen) + DRI2ScreenPtr ds = DRI2GetScreen(pScreen); + + pScreen->ConfigNotify = ds->ConfigNotify; ++ pScreen->SetWindowPixmap = ds->SetWindowPixmap; + + if (ds->prime_id) + prime_id_allocate_bitmask &= ~(1 << ds->prime_id); +-- +1.9.3 + diff --git a/SOURCES/0003-mieq-Fix-a-crash-regression-in-mieqProcessDeviceEven.patch b/SOURCES/0003-mieq-Fix-a-crash-regression-in-mieqProcessDeviceEven.patch new file mode 100644 index 0000000..0c238e6 --- /dev/null +++ b/SOURCES/0003-mieq-Fix-a-crash-regression-in-mieqProcessDeviceEven.patch @@ -0,0 +1,44 @@ +From 6acabbb322bdbfaf32b1bd7467081def7cb45e2e Mon Sep 17 00:00:00 2001 +From: Jeremy Huddleston Sequoia +Date: Sat, 19 Jul 2014 17:08:09 -0700 +Subject: [PATCH 3/3] mieq: Fix a crash regression in mieqProcessDeviceEvent + +(lldb) bt +* thread #6: tid = 0x92d4eb, 0x00000001001dee94 X11.bin`mieqProcessDeviceEvent(dev=0x0000000000000000, event=0x0000000100298bb0, +screen=0x0000000000000000) + 36 at mieq.c:519, stop reason = EXC_BAD_ACCESS (code=1, address=0x44) + * frame #0: 0x00000001001dee94 X11.bin`mieqProcessDeviceEvent(dev=0x0000000000000000, event=0x0000000100298bb0, screen=0x0000000000000000) + 36 at +mieq.c:519 + frame #1: 0x00000001001df3eb X11.bin`mieqProcessInputEvents + 555 at mieq.c:631 + frame #2: 0x0000000100017674 X11.bin`ProcessInputEvents + 20 at darwinEvents.c:422 + frame #3: 0x0000000100175eaa X11.bin`Dispatch + 154 at dispatch.c:357 + frame #4: 0x0000000100181b4a X11.bin`dix_main(argc=4, argv=0x00007fff5fbff750, envp=0x00007fff5fbff650) + 1594 at main.c:296 + frame #5: 0x000000010001ba80 X11.bin`server_thread(arg=0x0000000101208220) + 64 at quartzStartup.c:66 + frame #6: 0x00007fff89bb9899 libsystem_pthread.dylib`_pthread_body + 138 + frame #7: 0x00007fff89bb972a libsystem_pthread.dylib`_pthread_start + 137 + frame #8: 0x00007fff89bbdfc9 libsystem_pthread.dylib`thread_start + 13 + +Regression from: 9fb08310b51b46736f3ca8dbc04efdf502420403 + +Signed-off-by: Jeremy Huddleston Sequoia +Reviewed-by: Peter Hutterer +(cherry picked from commit 1faa76670572e3478965fd2cd9ab60ab2d865e3a) +--- + mi/mieq.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/mi/mieq.c b/mi/mieq.c +index a321983..6a8dd57 100644 +--- a/mi/mieq.c ++++ b/mi/mieq.c +@@ -516,7 +516,7 @@ mieqProcessDeviceEvent(DeviceIntPtr dev, InternalEvent *event, ScreenPtr screen) + verify_internal_event(event); + + /* refuse events from disabled devices */ +- if (!dev->enabled) ++ if (dev && !dev->enabled) + return; + + /* Custom event handler */ +-- +1.9.3 + diff --git a/SOURCES/0003-xkb-Split-out-code-to-start-and-finish-xkbcomp.patch b/SOURCES/0003-xkb-Split-out-code-to-start-and-finish-xkbcomp.patch deleted file mode 100644 index 77a8222..0000000 --- a/SOURCES/0003-xkb-Split-out-code-to-start-and-finish-xkbcomp.patch +++ /dev/null @@ -1,81 +0,0 @@ -From 7d08561178ab9384791a944bdb5797cf2ea14e1b Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= -Date: Tue, 9 Apr 2013 17:11:03 -0400 -Subject: [PATCH 03/38] xkb: Split out code to start and finish xkbcomp - -Using the context struct from previous commit, we can now split out -code to start xkbcomp and to finish and clean up after it. - -Reviewed-by: Daniel Stone ---- - xkb/ddxLoad.c | 39 ++++++++++++++++++++++++++++----------- - 1 file changed, 28 insertions(+), 11 deletions(-) - -diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c -index 5da3a35..001ff46 100644 ---- a/xkb/ddxLoad.c -+++ b/xkb/ddxLoad.c -@@ -99,10 +99,7 @@ typedef struct XkbCompContext { - } XkbCompContextRec, *XkbCompContextPtr; - - static Bool --XkbDDXCompileKeymapByNames(XkbDescPtr xkb, -- XkbComponentNamesPtr names, -- unsigned want, -- unsigned need, XkbCompContextPtr ctx) -+StartXkbComp(XkbCompContextPtr ctx) - { - char xkm_output_dir[PATH_MAX]; - -@@ -168,14 +165,15 @@ XkbDDXCompileKeymapByNames(XkbDescPtr xkb, - ctx->out = fopen(ctx->tmpname, "w"); - #endif - -+ return ctx->out != NULL; -+} -+ -+static Bool -+FinishXkbComp(XkbCompContextPtr ctx) -+{ -+ if (!ctx->buf) -+ return FALSE; - if (ctx->out != NULL) { --#ifdef DEBUG -- if (xkbDebugFlags) { -- ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n"); -- XkbWriteXKBKeymapForNames(stderr, names, xkb, want, need); -- } --#endif -- XkbWriteXKBKeymapForNames(ctx->out, names, xkb, want, need); - #ifndef WIN32 - if (Pclose(ctx->out) == 0) - #else -@@ -209,6 +207,25 @@ XkbDDXCompileKeymapByNames(XkbDescPtr xkb, - return FALSE; - } - -+static Bool -+XkbDDXCompileKeymapByNames(XkbDescPtr xkb, -+ XkbComponentNamesPtr names, -+ unsigned want, -+ unsigned need, XkbCompContextPtr ctx) -+{ -+ if (StartXkbComp(ctx)) { -+#ifdef DEBUG -+ if (xkbDebugFlags) { -+ ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n"); -+ XkbWriteXKBKeymapForNames(stderr, names, xkb, want, need); -+ } -+#endif -+ XkbWriteXKBKeymapForNames(ctx->out, names, xkb, want, need); -+ } -+ -+ return FinishXkbComp(ctx); -+} -+ - static FILE * - XkbDDXOpenConfigFile(char *mapName, char *fileNameRtrn, int fileNameRtrnLen) - { --- -1.8.4.2 - diff --git a/SOURCES/0003-xkb-push-locked-modifier-state-down-to-attached-slav.patch b/SOURCES/0003-xkb-push-locked-modifier-state-down-to-attached-slav.patch new file mode 100644 index 0000000..c54d477 --- /dev/null +++ b/SOURCES/0003-xkb-push-locked-modifier-state-down-to-attached-slav.patch @@ -0,0 +1,101 @@ +From f326e7db9c644e2b7bba0939b5bdd5637b8dbc01 Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Wed, 26 Feb 2014 16:20:08 +1000 +Subject: [PATCH 3/4] xkb: push locked modifier state down to attached slave + devices + +Whenever the master changes, push the locked modifier state to the attached +slave devices, then update the indicators. This way, when NumLock or CapsLock +are hit on any device, the LED will light up on all devices. Likewise, a new +keyboard attached to a master device will light up with the correct +indicators. + +The indicators are handled per-keyboard, depending on the layout, i.e. if one +keyboard has grp_led:num set, the NumLock LED won't light up on that keyboard. + +Signed-off-by: Peter Hutterer +Reviewed-by: Daniel Stone +(cherry picked from commit 45fb3a934dc0db51584aba37c2f9d73deff9191d) +--- + dix/devices.c | 3 +++ + include/xkbsrv.h | 4 ++++ + xkb/xkbActions.c | 20 ++++++++++++++++++++ + 3 files changed, 27 insertions(+) + +diff --git a/dix/devices.c b/dix/devices.c +index a680ed8..4692251 100644 +--- a/dix/devices.c ++++ b/dix/devices.c +@@ -416,6 +416,8 @@ EnableDevice(DeviceIntPtr dev, BOOL sendevent) + XISendDeviceHierarchyEvent(flags); + } + ++ if (!IsMaster(dev)) ++ XkbPushLockedStateToSlaves(GetMaster(dev, MASTER_KEYBOARD), 0, 0); + RecalculateMasterButtons(dev); + + /* initialise an idle timer for this device*/ +@@ -2648,6 +2650,7 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master) + dev->spriteInfo->paired = master; + dev->spriteInfo->spriteOwner = FALSE; + ++ XkbPushLockedStateToSlaves(GetMaster(dev, MASTER_KEYBOARD), 0, 0); + RecalculateMasterButtons(master); + } + +diff --git a/include/xkbsrv.h b/include/xkbsrv.h +index d5a4eb6..f23f786 100644 +--- a/include/xkbsrv.h ++++ b/include/xkbsrv.h +@@ -638,6 +638,10 @@ extern _X_EXPORT void XkbHandleActions(DeviceIntPtr /* dev */ , + DeviceEvent * /* event */ + ); + ++extern void XkbPushLockedStateToSlaves(DeviceIntPtr /* master */, ++ int /* evtype */, ++ int /* key */); ++ + extern _X_EXPORT Bool XkbEnableDisableControls(XkbSrvInfoPtr /* xkbi */ , + unsigned long /* change */ , + unsigned long /* newValues */ , +diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c +index 2534c70..ba7368b 100644 +--- a/xkb/xkbActions.c ++++ b/xkb/xkbActions.c +@@ -1174,6 +1174,25 @@ _XkbApplyState(DeviceIntPtr dev, Bool genStateNotify, int evtype, int key) + } + + void ++XkbPushLockedStateToSlaves(DeviceIntPtr master, int evtype, int key) ++{ ++ DeviceIntPtr dev; ++ Bool genStateNotify; ++ ++ nt_list_for_each_entry(dev, inputInfo.devices, next) { ++ if (!dev->key || GetMaster(dev, MASTER_KEYBOARD) != master) ++ continue; ++ ++ genStateNotify = _XkbEnsureStateChange(dev->key->xkbInfo); ++ ++ dev->key->xkbInfo->state.locked_mods = ++ master->key->xkbInfo->state.locked_mods; ++ ++ _XkbApplyState(dev, genStateNotify, evtype, key); ++ } ++} ++ ++void + XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent *event) + { + int key, bit, i; +@@ -1327,6 +1346,7 @@ XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent *event) + } + + _XkbApplyState(dev, genStateNotify, event->type, key); ++ XkbPushLockedStateToSlaves(dev, event->type, key); + } + + int +-- +1.9.3 + diff --git a/SOURCES/0004-dix-integer-overflow-in-RegionSizeof-CVE-2014-8092-3.patch b/SOURCES/0004-dix-integer-overflow-in-RegionSizeof-CVE-2014-8092-3.patch index 98e1a7b..197c1f4 100644 --- a/SOURCES/0004-dix-integer-overflow-in-RegionSizeof-CVE-2014-8092-3.patch +++ b/SOURCES/0004-dix-integer-overflow-in-RegionSizeof-CVE-2014-8092-3.patch @@ -120,7 +120,7 @@ index 4a0725d..33df87f 100644 - if (((_size) > 1) && ((_pReg)->data = - (RegDataPtr) malloc(RegionSizeof(_size)))) { + if (((_size) > 1) && ((rgnSize = RegionSizeof(_size)) > 0) && -+ (((_pReg)->data = malloc(rgnSize)) != NULL)) { ++ (((_pReg)->data = (RegDataPtr) malloc(rgnSize)) != NULL)) { (_pReg)->data->size = (_size); (_pReg)->data->numRects = 0; } diff --git a/SOURCES/0004-xkb-Add-XkbCompileKeymapFromString.patch b/SOURCES/0004-xkb-Add-XkbCompileKeymapFromString.patch deleted file mode 100644 index 0ac25f4..0000000 --- a/SOURCES/0004-xkb-Add-XkbCompileKeymapFromString.patch +++ /dev/null @@ -1,319 +0,0 @@ -From 927e9c1b26b618a20d590062d346b9a53b120d1f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= -Date: Tue, 9 Apr 2013 17:45:08 -0400 -Subject: [PATCH 04/38] xkb: Add XkbCompileKeymapFromString() - -This new function compiles a keymap from an in-memory string. We use it -to add a new keyooard device init function, -InitKeyboardDeviceStructFromString(), which inits a keyboard device with -a keymap specified as a string instead of a rmlvo set. - -Reviewed-by: Daniel Stone ---- - include/input.h | 6 +++ - include/xkbsrv.h | 4 ++ - xkb/ddxLoad.c | 129 ++++++++++++++++++++++++++++++++++++++++++------------- - xkb/xkbInit.c | 44 +++++++++++++++---- - 4 files changed, 144 insertions(+), 39 deletions(-) - -diff --git a/include/input.h b/include/input.h -index 2d5e531..b1cc3ff 100644 ---- a/include/input.h -+++ b/include/input.h -@@ -385,6 +385,12 @@ extern _X_EXPORT Bool InitKeyboardDeviceStruct(DeviceIntPtr /*device */ , - KbdCtrlProcPtr /*controlProc */ - ); - -+extern _X_EXPORT Bool InitKeyboardDeviceStructFromString(DeviceIntPtr dev, -+ const char *keymap, -+ int keymap_length, -+ BellProcPtr bell_func, -+ KbdCtrlProcPtr ctrl_func); -+ - extern int ApplyPointerMapping(DeviceIntPtr /* pDev */ , - CARD8 * /* map */ , - int /* len */ , -diff --git a/include/xkbsrv.h b/include/xkbsrv.h -index 346ebcc..bef98ef 100644 ---- a/include/xkbsrv.h -+++ b/include/xkbsrv.h -@@ -861,4 +861,8 @@ extern _X_EXPORT XkbDescPtr XkbCompileKeymap(DeviceIntPtr /* dev */ , - XkbRMLVOSet * /* rmlvo */ - ); - -+extern _X_EXPORT XkbDescPtr XkbCompileKeymapFromString(DeviceIntPtr dev, -+ const char *keymap, -+ int keymap_length); -+ - #endif /* _XKBSRV_H_ */ -diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c -index 001ff46..7a7cf1e 100644 ---- a/xkb/ddxLoad.c -+++ b/xkb/ddxLoad.c -@@ -262,6 +262,35 @@ XkbDDXOpenConfigFile(char *mapName, char *fileNameRtrn, int fileNameRtrnLen) - return file; - } - -+static unsigned -+LoadXKM(unsigned want, unsigned need, XkbCompContextPtr ctx, XkbDescPtr *xkbRtrn) -+{ -+ FILE *file; -+ char fileName[PATH_MAX]; -+ unsigned missing; -+ -+ file = XkbDDXOpenConfigFile(ctx->keymap, fileName, PATH_MAX); -+ if (file == NULL) { -+ LogMessage(X_ERROR, "Couldn't open compiled keymap file %s\n", -+ fileName); -+ return 0; -+ } -+ missing = XkmReadFile(file, need, want, xkbRtrn); -+ if (*xkbRtrn == NULL) { -+ LogMessage(X_ERROR, "Error loading keymap %s\n", fileName); -+ fclose(file); -+ (void) unlink(fileName); -+ return 0; -+ } -+ else { -+ DebugF("Loaded XKB keymap %s, defined=0x%x\n", fileName, -+ (*xkbRtrn)->defined); -+ } -+ fclose(file); -+ (void) unlink(fileName); -+ return (need | want) & (~missing); -+} -+ - unsigned - XkbDDXLoadKeymapByNames(DeviceIntPtr keybd, - XkbComponentNamesPtr names, -@@ -270,9 +299,6 @@ XkbDDXLoadKeymapByNames(DeviceIntPtr keybd, - XkbDescPtr *xkbRtrn, char *nameRtrn, int nameRtrnLen) - { - XkbDescPtr xkb; -- FILE *file; -- char fileName[PATH_MAX]; -- unsigned missing; - XkbCompContextRec ctx; - - *xkbRtrn = NULL; -@@ -292,26 +318,30 @@ XkbDDXLoadKeymapByNames(DeviceIntPtr keybd, - LogMessage(X_ERROR, "XKB: Couldn't compile keymap\n"); - return 0; - } -- file = XkbDDXOpenConfigFile(ctx.keymap, fileName, PATH_MAX); -- if (file == NULL) { -- LogMessage(X_ERROR, "Couldn't open compiled keymap file %s\n", -- fileName); -- return 0; -- } -- missing = XkmReadFile(file, need, want, xkbRtrn); -- if (*xkbRtrn == NULL) { -- LogMessage(X_ERROR, "Error loading keymap %s\n", fileName); -- fclose(file); -- (void) unlink(fileName); -+ -+ return LoadXKM(want, need, &ctx, xkbRtrn); -+} -+ -+static unsigned -+XkbDDXLoadKeymapFromString(DeviceIntPtr keybd, -+ const char *keymap, int keymap_length, -+ unsigned want, -+ unsigned need, -+ XkbDescPtr *xkbRtrn) -+{ -+ XkbCompContextRec ctx; -+ -+ *xkbRtrn = NULL; -+ -+ if (StartXkbComp(&ctx)) -+ fwrite(keymap, keymap_length, 1, ctx.out); -+ -+ if (!FinishXkbComp(&ctx)) { -+ LogMessage(X_ERROR, "XKB: Couldn't compile keymap\n"); - return 0; - } -- else { -- DebugF("Loaded XKB keymap %s, defined=0x%x\n", fileName, -- (*xkbRtrn)->defined); -- } -- fclose(file); -- (void) unlink(fileName); -- return (need | want) & (~missing); -+ -+ return LoadXKM(want, need, &ctx, xkbRtrn); - } - - Bool -@@ -407,6 +437,29 @@ XkbCompileKeymapForDevice(DeviceIntPtr dev, XkbRMLVOSet * rmlvo, int need) - return xkb; - } - -+static XkbDescPtr -+KeymapOrDefaults(DeviceIntPtr dev, XkbDescPtr xkb) -+{ -+ XkbRMLVOSet dflts; -+ -+ if (xkb) -+ return xkb; -+ -+ /* we didn't get what we really needed. And that will likely leave -+ * us with a keyboard that doesn't work. Use the defaults instead */ -+ LogMessage(X_ERROR, "XKB: Failed to load keymap. Loading default " -+ "keymap instead.\n"); -+ -+ XkbGetRulesDflts(&dflts); -+ -+ xkb = XkbCompileKeymapForDevice(dev, &dflts, 0); -+ -+ XkbFreeRMLVOSet(&dflts, FALSE); -+ -+ return xkb; -+} -+ -+ - XkbDescPtr - XkbCompileKeymap(DeviceIntPtr dev, XkbRMLVOSet * rmlvo) - { -@@ -424,20 +477,34 @@ XkbCompileKeymap(DeviceIntPtr dev, XkbRMLVOSet * rmlvo) - - xkb = XkbCompileKeymapForDevice(dev, rmlvo, need); - -- if (!xkb) { -- XkbRMLVOSet dflts; -+ return KeymapOrDefaults(dev, xkb); -+} - -- /* we didn't get what we really needed. And that will likely leave -- * us with a keyboard that doesn't work. Use the defaults instead */ -- LogMessage(X_ERROR, "XKB: Failed to load keymap. Loading default " -- "keymap instead.\n"); -+XkbDescPtr -+XkbCompileKeymapFromString(DeviceIntPtr dev, -+ const char *keymap, int keymap_length) -+{ -+ XkbDescPtr xkb; -+ unsigned int need, provided; - -- XkbGetRulesDflts(&dflts); -+ if (!dev || !keymap) { -+ LogMessage(X_ERROR, "XKB: No device or keymap specified\n"); -+ return NULL; -+ } - -- xkb = XkbCompileKeymapForDevice(dev, &dflts, 0); -+ /* These are the components we really really need */ -+ need = XkmSymbolsMask | XkmCompatMapMask | XkmTypesMask | -+ XkmKeyNamesMask | XkmVirtualModsMask; - -- XkbFreeRMLVOSet(&dflts, FALSE); -+ provided = -+ XkbDDXLoadKeymapFromString(dev, keymap, keymap_length, -+ XkmAllIndicesMask, need, &xkb); -+ if ((need & provided) != need) { -+ if (xkb) { -+ XkbFreeKeyboard(xkb, 0, TRUE); -+ xkb = NULL; -+ } - } - -- return xkb; -+ return KeymapOrDefaults(dev, xkb); - } -diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c -index f72655f..f3f0d8f 100644 ---- a/xkb/xkbInit.c -+++ b/xkb/xkbInit.c -@@ -490,9 +490,10 @@ XkbInitControls(DeviceIntPtr pXDev, XkbSrvInfoPtr xkbi) - return Success; - } - --_X_EXPORT Bool --InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet * rmlvo, -- BellProcPtr bell_func, KbdCtrlProcPtr ctrl_func) -+static Bool -+InitKeyboardDeviceStructInternal(DeviceIntPtr dev, XkbRMLVOSet * rmlvo, -+ const char *keymap, int keymap_length, -+ BellProcPtr bell_func, KbdCtrlProcPtr ctrl_func) - { - int i; - unsigned int check; -@@ -507,7 +508,7 @@ InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet * rmlvo, - BUG_RETURN_VAL(dev->key != NULL, FALSE); - BUG_RETURN_VAL(dev->kbdfeed != NULL, FALSE); - -- if (!rmlvo) { -+ if (!rmlvo && !keymap) { - rmlvo = &rmlvo_dflts; - XkbGetRulesDflts(rmlvo); - } -@@ -535,19 +536,26 @@ InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet * rmlvo, - } - dev->key->xkbInfo = xkbi; - -- if (xkb_cached_map && !XkbCompareUsedRMLVO(rmlvo)) { -+ if (xkb_cached_map && (keymap || (rmlvo && !XkbCompareUsedRMLVO(rmlvo)))) { - XkbFreeKeyboard(xkb_cached_map, XkbAllComponentsMask, TRUE); - xkb_cached_map = NULL; - } - - if (xkb_cached_map) - LogMessageVerb(X_INFO, 4, "XKB: Reusing cached keymap\n"); -- else { -+ else if (rmlvo) { - xkb_cached_map = XkbCompileKeymap(dev, rmlvo); - if (!xkb_cached_map) { - ErrorF("XKB: Failed to compile keymap\n"); - goto unwind_info; - } -+ } else { -+ xkb_cached_map = XkbCompileKeymapFromString(dev, -+ keymap, keymap_length); -+ if (!xkb_cached_map) { -+ ErrorF("XKB: Failed to compile keymap from string\n"); -+ goto unwind_info; -+ } - } - - xkb = XkbAllocKeyboard(); -@@ -612,8 +620,10 @@ InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet * rmlvo, - - dev->kbdfeed->CtrlProc(dev, &dev->kbdfeed->ctrl); - -- XkbSetRulesDflts(rmlvo); -- XkbSetRulesUsed(rmlvo); -+ if (rmlvo) { -+ XkbSetRulesDflts(rmlvo); -+ XkbSetRulesUsed(rmlvo); -+ } - XkbFreeRMLVOSet(&rmlvo_dflts, FALSE); - - return TRUE; -@@ -632,6 +642,24 @@ InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet * rmlvo, - return FALSE; - } - -+_X_EXPORT Bool -+InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet * rmlvo, -+ BellProcPtr bell_func, KbdCtrlProcPtr ctrl_func) -+{ -+ return InitKeyboardDeviceStructInternal(dev, rmlvo, -+ NULL, 0, bell_func, ctrl_func); -+} -+ -+_X_EXPORT Bool -+InitKeyboardDeviceStructFromString(DeviceIntPtr dev, -+ const char *keymap, int keymap_length, -+ BellProcPtr bell_func, KbdCtrlProcPtr ctrl_func) -+{ -+ return InitKeyboardDeviceStructInternal(dev, NULL, -+ keymap, keymap_length, -+ bell_func, ctrl_func); -+} -+ - /***====================================================================***/ - - /* --- -1.8.4.2 - diff --git a/SOURCES/0004-xkb-ignore-floating-slave-devices-when-updating-from.patch b/SOURCES/0004-xkb-ignore-floating-slave-devices-when-updating-from.patch new file mode 100644 index 0000000..0a16540 --- /dev/null +++ b/SOURCES/0004-xkb-ignore-floating-slave-devices-when-updating-from.patch @@ -0,0 +1,34 @@ +From 70999994284ea2d1392a45dfa28fcbc99fd65818 Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Mon, 4 Aug 2014 10:07:41 +1000 +Subject: [PATCH 4/4] xkb: ignore floating slave devices when updating from + master (#81885) + +Introduced in 45fb3a934dc0db51584aba37c2f9d73deff9191d. When a device is +enabled, the master's locked state is pushed to the slave. If the device is +floating, no master exists and we triggered a NULL-pointer dereference +in XkbPushLockedStateToSlaves. + +X.Org Bug 81885 + +Signed-off-by: Peter Hutterer +--- + dix/devices.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/dix/devices.c b/dix/devices.c +index 4692251..b389c7c 100644 +--- a/dix/devices.c ++++ b/dix/devices.c +@@ -416,7 +416,7 @@ EnableDevice(DeviceIntPtr dev, BOOL sendevent) + XISendDeviceHierarchyEvent(flags); + } + +- if (!IsMaster(dev)) ++ if (!IsMaster(dev) && !IsFloating(dev)) + XkbPushLockedStateToSlaves(GetMaster(dev, MASTER_KEYBOARD), 0, 0); + RecalculateMasterButtons(dev); + +-- +1.9.3 + diff --git a/SOURCES/0005-os-Add-a-function-to-create-a-client-for-an-fd.patch b/SOURCES/0005-os-Add-a-function-to-create-a-client-for-an-fd.patch deleted file mode 100644 index 224d923..0000000 --- a/SOURCES/0005-os-Add-a-function-to-create-a-client-for-an-fd.patch +++ /dev/null @@ -1,137 +0,0 @@ -From efa65f0bd25889d34b690b91839a0b36d5864b39 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= -Date: Tue, 21 Jun 2011 21:28:31 -0400 -Subject: [PATCH 05/38] os: Add a function to create a client for an fd - ---- - include/opaque.h | 1 + - include/os.h | 5 +++-- - os/connection.c | 32 +++++++++++++++++++++++++++++--- - os/utils.c | 6 +++++- - 4 files changed, 38 insertions(+), 6 deletions(-) - -diff --git a/include/opaque.h b/include/opaque.h -index b76ab6e..8ad9af0 100644 ---- a/include/opaque.h -+++ b/include/opaque.h -@@ -74,5 +74,6 @@ extern _X_EXPORT Bool whiteRoot; - extern _X_EXPORT Bool bgNoneRoot; - - extern _X_EXPORT Bool CoreDump; -+extern _X_EXPORT Bool NoListenAll; - - #endif /* OPAQUE_H */ -diff --git a/include/os.h b/include/os.h -index 9b67294..c36d09a 100644 ---- a/include/os.h -+++ b/include/os.h -@@ -166,8 +166,9 @@ extern _X_EXPORT void MakeClientGrabImpervious(ClientPtr /*client */ ); - - extern _X_EXPORT void MakeClientGrabPervious(ClientPtr /*client */ ); - --#ifdef XQUARTZ --extern void ListenOnOpenFD(int /* fd */ , int /* noxauth */ ); -+#if defined(XQUARTZ) || defined(XORG_WAYLAND) -+extern _X_EXPORT void ListenOnOpenFD(int /* fd */ , int /* noxauth */ ); -+extern _X_EXPORT void AddClientOnOpenFD(int /* fd */ ); - #endif - - extern _X_EXPORT CARD32 GetTimeInMillis(void); -diff --git a/os/connection.c b/os/connection.c -index 162e1d9..a95e7da 100644 ---- a/os/connection.c -+++ b/os/connection.c -@@ -64,6 +64,7 @@ SOFTWARE. - #include - #endif - -+#include - #ifdef WIN32 - #include - #endif -@@ -138,6 +139,7 @@ fd_set OutputPending; /* clients with reply/event data ready to go */ - int MaxClients = 0; - Bool NewOutputPending; /* not yet attempted to write some new output */ - Bool AnyClientsWriteBlocked; /* true if some client blocked on write */ -+Bool NoListenAll; /* Don't establish any listening sockets */ - - static Bool RunFromSmartParent; /* send SIGUSR1 to parent process */ - Bool RunFromSigStopParent; /* send SIGSTOP to our own process; Upstart (or -@@ -406,7 +408,10 @@ CreateWellKnownSockets(void) - /* display is initialized to "0" by main(). It is then set to the display - * number if specified on the command line, or to NULL when the -displayfd - * option is used. */ -- if (display) { -+ if (NoListenAll) { -+ ListenTransCount = 0; -+ } -+ else if (display) { - if (TryCreateSocket(atoi(display), &partial) && - ListenTransCount >= 1) - if (!PartialNetwork && partial) -@@ -440,9 +445,10 @@ CreateWellKnownSockets(void) - DefineSelf (fd); - } - -- if (!XFD_ANYSET(&WellKnownConnections)) -+ if (!XFD_ANYSET(&WellKnownConnections) && !NoListenAll) - FatalError - ("Cannot establish any listening sockets - Make sure an X server isn't already running"); -+ - #if !defined(WIN32) - OsSignal(SIGPIPE, SIG_IGN); - OsSignal(SIGHUP, AutoResetServer); -@@ -1253,7 +1259,7 @@ MakeClientGrabPervious(ClientPtr client) - } - } - --#ifdef XQUARTZ -+#if defined(XQUARTZ) || defined(XORG_WAYLAND) - /* Add a fd (from launchd) to our listeners */ - void - ListenOnOpenFD(int fd, int noxauth) -@@ -1309,4 +1315,24 @@ ListenOnOpenFD(int fd, int noxauth) - #endif - } - -+/* based on TRANS(SocketUNIXAccept) (XtransConnInfo ciptr, int *status) */ -+void -+AddClientOnOpenFD(int fd) -+{ -+ XtransConnInfo ciptr; -+ CARD32 connect_time; -+ -+ ciptr = _XSERVTransReopenCOTSServer(5, fd, "@anonymous"); -+ -+ _XSERVTransSetOption(ciptr, TRANS_NONBLOCKING, 1); -+ ciptr->flags |= TRANS_NOXAUTH; -+ -+ connect_time = GetTimeInMillis(); -+ -+ if (!AllocNewConnection(ciptr, fd, connect_time)) { -+ fprintf(stderr, "failed to create client for wayland server\n"); -+ return; -+ } -+} -+ - #endif -diff --git a/os/utils.c b/os/utils.c -index 608ee6a..a0cf951 100644 ---- a/os/utils.c -+++ b/os/utils.c -@@ -805,7 +805,11 @@ ProcessCommandLine(int argc, char *argv[]) - #endif - else if (strcmp(argv[i], "-nolisten") == 0) { - if (++i < argc) { -- if (_XSERVTransNoListen(argv[i])) -+ if (strcmp(argv[i], "all") == 0) { -+ NoListenAll = TRUE; -+ nolock = TRUE; -+ } -+ else if (_XSERVTransNoListen(argv[i])) - ErrorF("Failed to disable listen for %s transport", - argv[i]); - } --- -1.8.4.2 - diff --git a/SOURCES/0006-Export-xf86NewInputDevice-and-xf86AllocateInput.patch b/SOURCES/0006-Export-xf86NewInputDevice-and-xf86AllocateInput.patch deleted file mode 100644 index 79e3c91..0000000 --- a/SOURCES/0006-Export-xf86NewInputDevice-and-xf86AllocateInput.patch +++ /dev/null @@ -1,44 +0,0 @@ -From f5767856b6dc214a7beb7c1f914a2e491da3f0c7 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= -Date: Thu, 21 Jul 2011 09:55:46 -0700 -Subject: [PATCH 06/38] Export xf86NewInputDevice and xf86AllocateInput - ---- - hw/xfree86/common/xf86Xinput.c | 2 +- - hw/xfree86/common/xf86Xinput.h | 7 +++---- - 2 files changed, 4 insertions(+), 5 deletions(-) - -diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c -index 26c03c6..7669ee0 100644 ---- a/hw/xfree86/common/xf86Xinput.c -+++ b/hw/xfree86/common/xf86Xinput.c -@@ -811,7 +811,7 @@ xf86InputDevicePostInit(DeviceIntPtr dev) - * - * @return Success or an error code - */ --_X_INTERNAL int -+int - xf86NewInputDevice(InputInfoPtr pInfo, DeviceIntPtr *pdev, BOOL enable) - { - InputDriverPtr drv = NULL; -diff --git a/hw/xfree86/common/xf86Xinput.h b/hw/xfree86/common/xf86Xinput.h -index 35c38a5..ff3d894 100644 ---- a/hw/xfree86/common/xf86Xinput.h -+++ b/hw/xfree86/common/xf86Xinput.h -@@ -172,10 +172,9 @@ extern _X_EXPORT void xf86AddEnabledDevice(InputInfoPtr pInfo); - extern _X_EXPORT void xf86RemoveEnabledDevice(InputInfoPtr pInfo); - extern _X_EXPORT void xf86DisableDevice(DeviceIntPtr dev, Bool panic); - extern _X_EXPORT void xf86EnableDevice(DeviceIntPtr dev); -- --/* not exported */ --int xf86NewInputDevice(InputInfoPtr pInfo, DeviceIntPtr *pdev, BOOL is_auto); --InputInfoPtr xf86AllocateInput(void); -+extern _X_EXPORT int xf86NewInputDevice(InputInfoPtr pInfo, DeviceIntPtr *pdev, -+ BOOL is_auto); -+extern _X_EXPORT InputInfoPtr xf86AllocateInput(void); - - /* xf86Helper.c */ - extern _X_EXPORT void xf86AddInputDriver(InputDriverPtr driver, pointer module, --- -1.8.4.2 - diff --git a/SOURCES/0007-Add-redirect-window-for-input-device-feature.patch b/SOURCES/0007-Add-redirect-window-for-input-device-feature.patch deleted file mode 100644 index 245f6a0..0000000 --- a/SOURCES/0007-Add-redirect-window-for-input-device-feature.patch +++ /dev/null @@ -1,89 +0,0 @@ -From 65f033e38116ed4ebf318a7521190536e8fc6b1c Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= -Date: Fri, 18 Sep 2009 22:09:03 -0400 -Subject: [PATCH 07/38] Add redirect window for input device feature - ---- - Xi/exevents.c | 13 +++++++++++++ - dix/events.c | 11 ++++++++++- - include/exevents.h | 4 ++++ - include/inputstr.h | 2 ++ - 4 files changed, 29 insertions(+), 1 deletion(-) - -diff --git a/Xi/exevents.c b/Xi/exevents.c -index 5dc9020..69b4038 100644 ---- a/Xi/exevents.c -+++ b/Xi/exevents.c -@@ -2025,6 +2025,19 @@ DeliverTouchEvents(DeviceIntPtr dev, TouchPointInfoPtr ti, - } - } - -+void -+SetDeviceRedirectWindow(DeviceIntPtr dev, WindowPtr window) -+{ -+ SpritePtr pSprite = dev->spriteInfo->sprite; -+ DeviceIntPtr mouse; -+ -+ mouse = IsMaster(dev) ? dev : GetMaster(dev, MASTER_POINTER); -+ -+ pSprite->redirectWindow = window; -+ -+ CheckMotion(NULL, mouse); -+} -+ - int - InitProximityClassDeviceStruct(DeviceIntPtr dev) - { -diff --git a/dix/events.c b/dix/events.c -index 4632bb7..9caa8b0 100644 ---- a/dix/events.c -+++ b/dix/events.c -@@ -2877,7 +2877,16 @@ XYToWindow(SpritePtr pSprite, int x, int y) - BoxRec box; - - pSprite->spriteTraceGood = 1; /* root window still there */ -- pWin = RootWindow(pSprite)->firstChild; -+ if (pSprite->redirectWindow == PointerRootWin) { -+ return RootWindow(pSprite); -+ } -+ else if (pSprite->redirectWindow) { -+ pWin = pSprite->redirectWindow; -+ pSprite->spriteTrace[pSprite->spriteTraceGood++] = pWin; -+ pWin = pWin->firstChild; -+ } -+ else -+ pWin = RootWindow(pSprite)->firstChild; - while (pWin) { - if ((pWin->mapped) && - (x >= pWin->drawable.x - wBorderWidth(pWin)) && -diff --git a/include/exevents.h b/include/exevents.h -index 321fc42..ba93be3 100644 ---- a/include/exevents.h -+++ b/include/exevents.h -@@ -162,6 +162,10 @@ extern void - ProcessOtherEvent(InternalEvent * /* ev */ , - DeviceIntPtr /* other */ ); - -+extern _X_EXPORT void -+ SetDeviceRedirectWindow(DeviceIntPtr /* dev */ , -+ WindowPtr /* window */ ); -+ - extern int - CheckGrabValues(ClientPtr /* client */ , - GrabParameters * /* param */ ); -diff --git a/include/inputstr.h b/include/inputstr.h -index dc36c5d..09471cf 100644 ---- a/include/inputstr.h -+++ b/include/inputstr.h -@@ -246,6 +246,8 @@ typedef struct _SpriteRec { - ScreenPtr pEnqueueScreen; - ScreenPtr pDequeueScreen; - -+ WindowPtr redirectWindow; -+ - } SpriteRec; - - typedef struct _KeyClassRec { --- -1.8.4.2 - diff --git a/SOURCES/0007-dbe-unvalidated-lengths-in-DbeSwapBuffers-calls-CVE-.patch b/SOURCES/0007-dbe-unvalidated-lengths-in-DbeSwapBuffers-calls-CVE-.patch index b9bf6e0..2762085 100644 --- a/SOURCES/0007-dbe-unvalidated-lengths-in-DbeSwapBuffers-calls-CVE-.patch +++ b/SOURCES/0007-dbe-unvalidated-lengths-in-DbeSwapBuffers-calls-CVE-.patch @@ -25,7 +25,7 @@ Signed-off-by: Fedora X Ninjas 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dbe/dbe.c b/dbe/dbe.c -index 8d8bfb9..9be5297 100644 +index 5524615..79eefeb 100644 --- a/dbe/dbe.c +++ b/dbe/dbe.c @@ -450,18 +450,20 @@ ProcDbeSwapBuffers(ClientPtr client) @@ -50,7 +50,7 @@ index 8d8bfb9..9be5297 100644 + REQUEST_FIXED_SIZE(xDbeSwapBuffersReq, nStuff * sizeof(xDbeSwapInfo)); /* Get to the swap info appended to the end of the request. */ - dbeSwapInfo = (xDbeSwapInfo *) & stuff[1]; + dbeSwapInfo = (xDbeSwapInfo *) &stuff[1]; @@ -914,13 +916,16 @@ static int SProcDbeSwapBuffers(ClientPtr client) { diff --git a/SOURCES/0008-dri2-Introduce-a-third-version-of-the-AuthMagic-func.patch b/SOURCES/0008-dri2-Introduce-a-third-version-of-the-AuthMagic-func.patch deleted file mode 100644 index fe860d7..0000000 --- a/SOURCES/0008-dri2-Introduce-a-third-version-of-the-AuthMagic-func.patch +++ /dev/null @@ -1,144 +0,0 @@ -From 39fddd5e087ee7681e7a26182dd7398dd64bc43f Mon Sep 17 00:00:00 2001 -From: Tiago Vignatti -Date: Wed, 21 Aug 2013 21:23:09 -0700 -Subject: [PATCH 08/38] dri2: Introduce a third version of the AuthMagic - function - -This most recent version takes a client pointer to allow xwayland to -asynchronously authenticate a client. ---- - hw/xfree86/dri2/dri2.c | 12 ++++++++---- - hw/xfree86/dri2/dri2.h | 7 +++++++ - hw/xfree86/dri2/dri2ext.c | 27 +++++++++++++++++++-------- - 3 files changed, 34 insertions(+), 12 deletions(-) - -diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c -index 0b047f0..efdcd66 100644 ---- a/hw/xfree86/dri2/dri2.c -+++ b/hw/xfree86/dri2/dri2.c -@@ -121,8 +121,9 @@ typedef struct _DRI2Screen { - DRI2ScheduleSwapProcPtr ScheduleSwap; - DRI2GetMSCProcPtr GetMSC; - DRI2ScheduleWaitMSCProcPtr ScheduleWaitMSC; -- DRI2AuthMagic2ProcPtr AuthMagic; - DRI2AuthMagicProcPtr LegacyAuthMagic; -+ DRI2AuthMagic2ProcPtr LegacyAuthMagic2; -+ DRI2AuthMagic3ProcPtr AuthMagic; - DRI2ReuseBufferNotifyProcPtr ReuseBufferNotify; - DRI2SwapLimitValidateProcPtr SwapLimitValidate; - DRI2GetParamProcPtr GetParam; -@@ -1352,7 +1353,7 @@ DRI2Authenticate(ClientPtr client, ScreenPtr pScreen, uint32_t magic) - return FALSE; - - primescreen = GetScreenPrime(pScreen, dri2_client->prime_id); -- if ((*ds->AuthMagic)(primescreen, magic)) -+ if ((*ds->AuthMagic)(client, primescreen, magic)) - return FALSE; - return TRUE; - } -@@ -1457,8 +1458,11 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info) - cur_minor = 1; - } - -+ if (info->version >= 10) { -+ ds->AuthMagic = info->AuthMagic3; -+ } - if (info->version >= 8) { -- ds->AuthMagic = info->AuthMagic2; -+ ds->LegacyAuthMagic2 = info->AuthMagic2; - } - if (info->version >= 5) { - ds->LegacyAuthMagic = info->AuthMagic; -@@ -1497,7 +1501,7 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info) - * If the driver doesn't provide an AuthMagic function - * it relies on the old method (using libdrm) or fails - */ -- if (!ds->LegacyAuthMagic) -+ if (!ds->LegacyAuthMagic2 && !ds->LegacyAuthMagic) - #ifdef WITH_LIBDRM - ds->LegacyAuthMagic = drmAuthMagic; - #else -diff --git a/hw/xfree86/dri2/dri2.h b/hw/xfree86/dri2/dri2.h -index 1e7afdd..38b4f58 100644 ---- a/hw/xfree86/dri2/dri2.h -+++ b/hw/xfree86/dri2/dri2.h -@@ -65,6 +65,8 @@ typedef void (*DRI2CopyRegionProcPtr) (DrawablePtr pDraw, - typedef void (*DRI2WaitProcPtr) (WindowPtr pWin, unsigned int sequence); - typedef int (*DRI2AuthMagicProcPtr) (int fd, uint32_t magic); - typedef int (*DRI2AuthMagic2ProcPtr) (ScreenPtr pScreen, uint32_t magic); -+typedef int (*DRI2AuthMagic3ProcPtr) (ClientPtr client, -+ ScreenPtr pScreen, uint32_t magic); - - /** - * Schedule a buffer swap -@@ -252,6 +254,9 @@ typedef struct { - DRI2CreateBuffer2ProcPtr CreateBuffer2; - DRI2DestroyBuffer2ProcPtr DestroyBuffer2; - DRI2CopyRegion2ProcPtr CopyRegion2; -+ -+ /* added in version 10 */ -+ DRI2AuthMagic3ProcPtr AuthMagic3; - } DRI2InfoRec, *DRI2InfoPtr; - - extern _X_EXPORT Bool DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info); -@@ -268,6 +273,8 @@ extern _X_EXPORT Bool DRI2Connect(ClientPtr client, ScreenPtr pScreen, - - extern _X_EXPORT Bool DRI2Authenticate(ClientPtr client, ScreenPtr pScreen, uint32_t magic); - -+extern _X_EXPORT void DRI2SendAuthReply(ClientPtr client, Bool status); -+ - extern _X_EXPORT int DRI2CreateDrawable(ClientPtr client, - DrawablePtr pDraw, - XID id, -diff --git a/hw/xfree86/dri2/dri2ext.c b/hw/xfree86/dri2/dri2ext.c -index ffd66fa..b858213 100644 ---- a/hw/xfree86/dri2/dri2ext.c -+++ b/hw/xfree86/dri2/dri2ext.c -@@ -136,11 +136,23 @@ ProcDRI2Connect(ClientPtr client) - return Success; - } - -+void -+DRI2SendAuthReply(ClientPtr client, Bool status) -+{ -+ xDRI2AuthenticateReply rep = { -+ .type = X_Reply, -+ .sequenceNumber = client->sequence, -+ .length = 0, -+ .authenticated = status -+ }; -+ -+ WriteToClient(client, sizeof(xDRI2AuthenticateReply), &rep); -+} -+ - static int - ProcDRI2Authenticate(ClientPtr client) - { - REQUEST(xDRI2AuthenticateReq); -- xDRI2AuthenticateReply rep; - DrawablePtr pDraw; - int status; - -@@ -149,13 +161,12 @@ ProcDRI2Authenticate(ClientPtr client) - &pDraw, &status)) - return status; - -- rep = (xDRI2AuthenticateReply) { -- .type = X_Reply, -- .sequenceNumber = client->sequence, -- .length = 0, -- .authenticated = DRI2Authenticate(client, pDraw->pScreen, stuff->magic) -- }; -- WriteToClient(client, sizeof(xDRI2AuthenticateReply), &rep); -+ status = DRI2Authenticate(client, pDraw->pScreen, stuff->magic); -+ -+ /* if non-blocking authentication is in progress, then don't send a reply -+ * now but later in the implementation (e.g. drm_handle_authenticated) */ -+ if (client->ignoreCount == 0) -+ DRI2SendAuthReply(client, status); - - return Success; - } --- -1.8.4.2 - diff --git a/SOURCES/0009-Add-xwayland-module.patch b/SOURCES/0009-Add-xwayland-module.patch deleted file mode 100644 index e53a923..0000000 --- a/SOURCES/0009-Add-xwayland-module.patch +++ /dev/null @@ -1,2896 +0,0 @@ -From 010bee24b74e4ca0df6c69094b825d5232f85377 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= -Date: Fri, 18 Sep 2009 22:08:16 -0400 -Subject: [PATCH 09/38] Add xwayland module -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Squashed and rebased from the xwayland-1.12 branch. Contributions from - - Christopher James Halse Rogers - Corentin Chary - Daniel Stone - Kristian Høgsberg - Robert Bragg - Scott Moreau - Tiago Vignatti ---- - configure.ac | 13 +- - hw/xfree86/Makefile.am | 8 +- - hw/xfree86/common/xf86Config.c | 28 +- - hw/xfree86/common/xf86Globals.c | 2 + - hw/xfree86/common/xf86Init.c | 20 ++ - hw/xfree86/common/xf86Priv.h | 2 + - hw/xfree86/dri2/dri2.c | 7 +- - hw/xfree86/dri2/dri2.h | 2 +- - hw/xfree86/xwayland/Makefile.am | 44 +++ - hw/xfree86/xwayland/drm.xml | 139 ++++++++ - hw/xfree86/xwayland/xserver.xml | 18 + - hw/xfree86/xwayland/xwayland-cursor.c | 241 +++++++++++++ - hw/xfree86/xwayland/xwayland-drm.c | 235 +++++++++++++ - hw/xfree86/xwayland/xwayland-input.c | 610 +++++++++++++++++++++++++++++++++ - hw/xfree86/xwayland/xwayland-output.c | 309 +++++++++++++++++ - hw/xfree86/xwayland/xwayland-private.h | 132 +++++++ - hw/xfree86/xwayland/xwayland-window.c | 317 +++++++++++++++++ - hw/xfree86/xwayland/xwayland.c | 392 +++++++++++++++++++++ - hw/xfree86/xwayland/xwayland.h | 83 +++++ - include/xorg-server.h.in | 3 + - 20 files changed, 2595 insertions(+), 10 deletions(-) - create mode 100644 hw/xfree86/xwayland/Makefile.am - create mode 100644 hw/xfree86/xwayland/drm.xml - create mode 100644 hw/xfree86/xwayland/xserver.xml - create mode 100644 hw/xfree86/xwayland/xwayland-cursor.c - create mode 100644 hw/xfree86/xwayland/xwayland-drm.c - create mode 100644 hw/xfree86/xwayland/xwayland-input.c - create mode 100644 hw/xfree86/xwayland/xwayland-output.c - create mode 100644 hw/xfree86/xwayland/xwayland-private.h - create mode 100644 hw/xfree86/xwayland/xwayland-window.c - create mode 100644 hw/xfree86/xwayland/xwayland.c - create mode 100644 hw/xfree86/xwayland/xwayland.h - -diff --git a/configure.ac b/configure.ac -index 8bedd35..8078846 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -629,6 +629,7 @@ AC_ARG_ENABLE(clientids, AS_HELP_STRING([--disable-clientids], [Build Xorg - AC_ARG_ENABLE(pciaccess, AS_HELP_STRING([--enable-pciaccess], [Build Xorg with pciaccess library (default: enabled)]), [PCI=$enableval], [PCI=yes]) - AC_ARG_ENABLE(linux_acpi, AC_HELP_STRING([--disable-linux-acpi], [Disable building ACPI support on Linux (if available).]), [enable_linux_acpi=$enableval], [enable_linux_acpi=yes]) - AC_ARG_ENABLE(linux_apm, AC_HELP_STRING([--disable-linux-apm], [Disable building APM support on Linux (if available).]), [enable_linux_apm=$enableval], [enable_linux_apm=yes]) -+AC_ARG_ENABLE(wayland, AS_HELP_STRING([--disable-wayland], [Build Wayland extension (default: enabled)]), [WAYLAND=$enableval], [WAYLAND=yes]) - - dnl DDXes. - AC_ARG_ENABLE(xorg, AS_HELP_STRING([--enable-xorg], [Build Xorg server (default: auto)]), [XORG=$enableval], [XORG=auto]) -@@ -1018,6 +1019,14 @@ fi - if test "x$MITSHM" = xauto; then - MITSHM="$ac_cv_sysv_ipc" - fi -+ -+AM_CONDITIONAL(WAYLAND, [test "x$WAYLAND" = xyes]) -+if test "x$WAYLAND" = xyes; then -+ AC_DEFINE(XORG_WAYLAND, 1, [Support wayland mode]) -+ REQUIRED_MODULES="$REQUIRED_MODULES wayland-client" -+ WAYLAND_SCANNER_RULES(['$(top_srcdir)/hw/xfree86/xwayland']) -+fi -+ - AM_CONDITIONAL(MITSHM, [test "x$MITSHM" = xyes]) - if test "x$MITSHM" = xyes; then - AC_DEFINE(MITSHM, 1, [Support MIT-SHM extension]) -@@ -1241,12 +1250,13 @@ esac - - AM_CONDITIONAL(DRI3, test "x$DRI3" = xyes) - --if test "x$DRI" = xyes || test "x$DRI2" = xyes || test "x$DRI3" = xyes || test "x$CONFIG_UDEV_KMS" = xyes; then -+if test "x$DRI" = xyes || test "x$DRI2" = xyes || test "x$DRI3" = xyes || test "x$CONFIG_UDEV_KMS" = xyes || test "x$WAYLAND" = xyes ; then - if test "x$DRM" = xyes; then - AC_DEFINE(WITH_LIBDRM, 1, [Building with libdrm support]) - PKG_CHECK_MODULES([LIBDRM], $LIBDRM) - fi - fi -+AM_CONDITIONAL(DRM, test "x$DRM" = xyes) - - if test "x$DRI2" = xyes; then - save_CFLAGS=$CFLAGS -@@ -2462,6 +2472,7 @@ hw/xfree86/dixmods/Makefile - hw/xfree86/doc/Makefile - hw/xfree86/dri/Makefile - hw/xfree86/dri2/Makefile -+hw/xfree86/xwayland/Makefile - hw/xfree86/exa/Makefile - hw/xfree86/exa/man/Makefile - hw/xfree86/fbdevhw/Makefile -diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am -index 15670d0..cf60196 100644 ---- a/hw/xfree86/Makefile.am -+++ b/hw/xfree86/Makefile.am -@@ -14,6 +14,10 @@ DRI3_BUILDDIR = $(top_builddir)/dri3 - DRI3_LIB = $(DRI3_BUILDDIR)/libdri3.la - endif - -+if WAYLAND -+WAYLAND_SUBDIR = xwayland -+endif -+ - if XF86UTILS - XF86UTILS_SUBDIR = utils - endif -@@ -32,12 +36,12 @@ endif - - SUBDIRS = common ddc x86emu $(INT10_SUBDIR) os-support parser \ - ramdac $(VGAHW_SUBDIR) loader modes $(DRI_SUBDIR) \ -- $(DRI2_SUBDIR) . $(VBE_SUBDIR) i2c dixmods \ -+ $(DRI2_SUBDIR) $(WAYLAND_SUBDIR) . $(VBE_SUBDIR) i2c dixmods \ - fbdevhw shadowfb exa $(XF86UTILS_SUBDIR) doc man - - DIST_SUBDIRS = common ddc i2c x86emu int10 fbdevhw os-support \ - parser ramdac shadowfb vbe vgahw \ -- loader dixmods dri dri2 exa modes \ -+ loader dixmods dri dri2 exa modes xwayland \ - utils doc man - - bin_PROGRAMS = Xorg -diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c -index b5efc02..3b0bb89 100644 ---- a/hw/xfree86/common/xf86Config.c -+++ b/hw/xfree86/common/xf86Config.c -@@ -118,7 +118,8 @@ static ModuleDefault ModuleDefaults[] = { - {.name = "fb",.toLoad = TRUE,.load_opt = NULL}, - {.name = "shadow",.toLoad = TRUE,.load_opt = NULL}, - #endif -- {.name = NULL,.toLoad = FALSE,.load_opt = NULL} -+ {.name = "xwayland",.toLoad = FALSE,.load_opt=NULL}, -+ {.name = NULL,.toLoad = FALSE,.load_opt=NULL} - }; - - /* Forward declarations */ -@@ -260,6 +261,17 @@ xf86ModulelistFromConfig(pointer **optlist) - return NULL; - } - -+ /* -+ * Set the xwayland module to autoload if requested. -+ */ -+ if (xorgWayland) { -+ for (i=0 ; ModuleDefaults[i].name != NULL ; i++) { -+ if (strcmp(ModuleDefaults[i].name, "xwayland") == 0) { -+ ModuleDefaults[i].toLoad = TRUE; -+ } -+ } -+ } -+ - if (xf86configptr->conf_modules) { - /* Walk the disable list and let people know what we've parsed to - * not be loaded -@@ -863,6 +875,13 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts) - } - xf86Msg(from, "%sutomatically adding GPU devices\n", - xf86Info.autoAddGPU ? "A" : "Not a"); -+ -+ /* FIXME: Do that at the right place (before xf86Msg). */ -+ if (xorgWayland) { -+ xf86Info.autoAddDevices = FALSE; -+ xf86Info.autoEnableDevices = FALSE; -+ } -+ - /* - * Set things up based on the config file information. Some of these - * settings may be overridden later when the command line options are -@@ -953,9 +972,10 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts) - } - #endif - -- /* if we're not hotplugging, force some input devices to exist */ -- xf86Info.forceInputDevices = !(xf86Info.autoAddDevices && -- xf86Info.autoEnableDevices); -+ if (xorgWayland) /* Don't force input devices */ -+ xf86Info.forceInputDevices = FALSE; -+ else /* if we're not hotplugging, force some input devices to exist */ -+ xf86Info.forceInputDevices = !(xf86Info.autoAddDevices && xf86Info.autoEnableDevices); - - /* when forcing input devices, we use kbd. otherwise evdev, so use the - * evdev rules set. */ -diff --git a/hw/xfree86/common/xf86Globals.c b/hw/xfree86/common/xf86Globals.c -index 7df7a80..b41d2cc 100644 ---- a/hw/xfree86/common/xf86Globals.c -+++ b/hw/xfree86/common/xf86Globals.c -@@ -204,3 +204,5 @@ Bool xf86VidModeAllowNonLocal = FALSE; - #endif - RootWinPropPtr *xf86RegisteredPropertiesTable = NULL; - Bool xorgHWAccess = FALSE; -+Bool xorgWayland = FALSE; -+Bool xorgRootless = FALSE; -diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c -index 91ec4c8..98adaab 100644 ---- a/hw/xfree86/common/xf86Init.c -+++ b/hw/xfree86/common/xf86Init.c -@@ -546,6 +546,13 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv) - - if (!(flags & HW_SKIP_CONSOLE)) - xorgHWOpenConsole = TRUE; -+ -+ if (xorgWayland && -+ (NEED_IO_ENABLED(flags) || !(flags & HW_SKIP_CONSOLE))) { -+ -+ xf86DeleteDriver(i); -+ continue; -+ } - } - - if (xorgHWOpenConsole) -@@ -957,6 +964,9 @@ InitInput(int argc, char **argv) - - mieqInit(); - -+ if (xorgWayland) -+ return; -+ - /* Initialize all configured input devices */ - for (pInfo = xf86ConfigLayout.inputs; pInfo && *pInfo; pInfo++) { - (*pInfo)->options = -@@ -1455,6 +1465,16 @@ ddxProcessArgument(int argc, char **argv, int i) - return 1; - } - -+ if (!strcmp(argv[i], "-wayland")) { -+ xorgWayland = TRUE; -+ return 1; -+ } -+ -+ if (!strcmp(argv[i], "-rootless")) { -+ xorgRootless = TRUE; -+ return 1; -+ } -+ - /* OS-specific processing */ - return xf86ProcessArgument(argc, argv, i); - } -diff --git a/hw/xfree86/common/xf86Priv.h b/hw/xfree86/common/xf86Priv.h -index 58cfe0a..3dd2697 100644 ---- a/hw/xfree86/common/xf86Priv.h -+++ b/hw/xfree86/common/xf86Priv.h -@@ -91,6 +91,8 @@ extern _X_EXPORT int xf86NumScreens; - extern _X_EXPORT const char *xf86VisualNames[]; - extern _X_EXPORT int xf86Verbose; /* verbosity level */ - extern _X_EXPORT int xf86LogVerbose; /* log file verbosity level */ -+extern _X_EXPORT Bool xorgWayland; -+extern _X_EXPORT Bool xorgRootless; - - extern _X_EXPORT RootWinPropPtr *xf86RegisteredPropertiesTable; - -diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c -index efdcd66..483d630 100644 ---- a/hw/xfree86/dri2/dri2.c -+++ b/hw/xfree86/dri2/dri2.c -@@ -1332,13 +1332,16 @@ DRI2Connect(ClientPtr client, ScreenPtr pScreen, - } - - static int --DRI2AuthMagic (ScreenPtr pScreen, uint32_t magic) -+DRI2AuthMagic (ClientPtr client, ScreenPtr pScreen, uint32_t magic) - { - DRI2ScreenPtr ds = DRI2GetScreen(pScreen); - if (ds == NULL) - return -EINVAL; - -- return (*ds->LegacyAuthMagic) (ds->fd, magic); -+ if (ds->LegacyAuthMagic2) -+ return (*ds->LegacyAuthMagic2) (pScreen, magic); -+ else -+ return (*ds->LegacyAuthMagic) (ds->fd, magic); - } - - Bool -diff --git a/hw/xfree86/dri2/dri2.h b/hw/xfree86/dri2/dri2.h -index 38b4f58..ed67d01 100644 ---- a/hw/xfree86/dri2/dri2.h -+++ b/hw/xfree86/dri2/dri2.h -@@ -207,7 +207,7 @@ typedef int (*DRI2GetParamProcPtr) (ClientPtr client, - /** - * Version of the DRI2InfoRec structure defined in this header - */ --#define DRI2INFOREC_VERSION 9 -+#define DRI2INFOREC_VERSION 10 - - typedef struct { - unsigned int version; /**< Version of this struct */ -diff --git a/hw/xfree86/xwayland/Makefile.am b/hw/xfree86/xwayland/Makefile.am -new file mode 100644 -index 0000000..b739145 ---- /dev/null -+++ b/hw/xfree86/xwayland/Makefile.am -@@ -0,0 +1,44 @@ -+AM_CPPFLAGS = \ -+ $(XORG_INCS) \ -+ -I$(srcdir)/../ddc \ -+ -I$(srcdir)/../ramdac \ -+ -I$(srcdir)/../i2c \ -+ -I$(srcdir)/../parser \ -+ -I$(srcdir)/../modes -+ -+libxwayland_la_LTLIBRARIES = libxwayland.la -+libxwayland_la_CFLAGS = \ -+ -DHAVE_XORG_CONFIG_H \ -+ @DIX_CFLAGS@ @XORG_CFLAGS@ @LIBDRM_CFLAGS@ \ -+ -I$(top_srcdir)/hw/xfree86/common \ -+ -I$(top_srcdir)/hw/xfree86/os-support/bus -+ -+libxwayland_la_LDFLAGS = -module -avoid-version @LIBDRM_LIBS@ -lwayland-client -+libxwayland_ladir = $(moduledir)/extensions -+libxwayland_la_SOURCES = \ -+ xwayland.c \ -+ xwayland-input.c \ -+ xwayland-output.c \ -+ xwayland-cursor.c \ -+ xwayland-window.c \ -+ xwayland-private.h \ -+ drm-client-protocol.h \ -+ drm-protocol.c \ -+ xserver-client-protocol.h \ -+ xserver-protocol.c -+ -+if DRM -+libxwayland_la_SOURCES += xwayland-drm.c -+endif -+ -+sdk_HEADERS = xwayland.h -+ -+BUILT_SOURCES = \ -+ drm-client-protocol.h \ -+ drm-protocol.c \ -+ xserver-client-protocol.h \ -+ xserver-protocol.c -+ -+CLEANFILES = $(BUILT_SOURCES) -+ -+@wayland_scanner_rules@ -diff --git a/hw/xfree86/xwayland/drm.xml b/hw/xfree86/xwayland/drm.xml -new file mode 100644 -index 0000000..89fd8f0 ---- /dev/null -+++ b/hw/xfree86/xwayland/drm.xml -@@ -0,0 +1,139 @@ -+ -+ -+ -+ -+ Copyright © 2008-2011 Kristian Høgsberg -+ Copyright © 2010-2011 Intel Corporation -+ -+ Permission to use, copy, modify, distribute, and sell this -+ software and its documentation for any purpose is hereby granted -+ without fee, provided that\n the above copyright notice appear in -+ all copies and that both that copyright notice and this permission -+ notice appear in supporting documentation, and that the name of -+ the copyright holders not be used in advertising or publicity -+ pertaining to distribution of the software without specific, -+ written prior permission. The copyright holders make no -+ representations about the suitability of this software for any -+ purpose. It is provided "as is" without express or implied -+ warranty. -+ -+ THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS -+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -+ FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY -+ SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN -+ AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -+ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -+ THIS SOFTWARE. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/hw/xfree86/xwayland/xserver.xml b/hw/xfree86/xwayland/xserver.xml -new file mode 100644 -index 0000000..9e25f5c ---- /dev/null -+++ b/hw/xfree86/xwayland/xserver.xml -@@ -0,0 +1,18 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/hw/xfree86/xwayland/xwayland-cursor.c b/hw/xfree86/xwayland/xwayland-cursor.c -new file mode 100644 -index 0000000..f8860bd ---- /dev/null -+++ b/hw/xfree86/xwayland/xwayland-cursor.c -@@ -0,0 +1,241 @@ -+/* -+ * Copyright © 2011 Kristian Høgsberg -+ * -+ * Permission to use, copy, modify, distribute, and sell this software -+ * and its documentation for any purpose is hereby granted without -+ * fee, provided that the above copyright notice appear in all copies -+ * and that both that copyright notice and this permission notice -+ * appear in supporting documentation, and that the name of the -+ * copyright holders not be used in advertising or publicity -+ * pertaining to distribution of the software without specific, -+ * written prior permission. The copyright holders make no -+ * representations about the suitability of this software for any -+ * purpose. It is provided "as is" without express or implied -+ * warranty. -+ * -+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS -+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY -+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN -+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING -+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -+ * SOFTWARE. -+ */ -+ -+#ifdef HAVE_XORG_CONFIG_H -+#include "xorg-config.h" -+#endif -+ -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+ -+#include "xwayland.h" -+#include "xwayland-private.h" -+#include "xserver-client-protocol.h" -+ -+static DevPrivateKeyRec xwl_cursor_private_key; -+ -+static void -+expand_source_and_mask(CursorPtr cursor, void *data) -+{ -+ CARD32 *argb, *p, d, fg, bg; -+ CursorBitsPtr bits = cursor->bits; -+ int size; -+ int x, y, stride, i, bit; -+ -+ size = bits->width * bits->height * 4; -+ argb = malloc(size); -+ if (argb == NULL) -+ return; -+ -+ p = argb; -+ fg = ((cursor->foreRed & 0xff00) << 8) | -+ (cursor->foreGreen & 0xff00) | (cursor->foreGreen >> 8); -+ bg = ((cursor->backRed & 0xff00) << 8) | -+ (cursor->backGreen & 0xff00) | (cursor->backGreen >> 8); -+ stride = (bits->width / 8 + 3) & ~3; -+ for (y = 0; y < bits->height; y++) -+ for (x = 0; x < bits->width; x++) { -+ i = y * stride + x / 8; -+ bit = 1 << (x & 7); -+ if (bits->source[i] & bit) -+ d = fg; -+ else -+ d = bg; -+ if (bits->mask[i] & bit) -+ d |= 0xff000000; -+ else -+ d = 0x00000000; -+ -+ *p++ = d; -+ } -+ -+ memcpy(data, argb, size); -+ free(argb); -+} -+ -+static Bool -+xwl_realize_cursor(DeviceIntPtr device, ScreenPtr screen, CursorPtr cursor) -+{ -+ struct xwl_screen *xwl_screen; -+ int size; -+ char filename[] = "/tmp/wayland-shm-XXXXXX"; -+ int fd; -+ struct wl_shm_pool *pool; -+ struct wl_buffer *buffer; -+ void *data; -+ -+ xwl_screen = xwl_screen_get(screen); -+ size = cursor->bits->width * cursor->bits->height * 4; -+ -+ fd = mkstemp(filename); -+ if (fd < 0) { -+ ErrorF("open %s failed: %s", filename, strerror(errno)); -+ return FALSE; -+ } -+ if (ftruncate(fd, size) < 0) { -+ ErrorF("ftruncate failed: %s", strerror(errno)); -+ close(fd); -+ return FALSE; -+ } -+ -+ data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); -+ unlink(filename); -+ -+ if (data == MAP_FAILED) { -+ ErrorF("mmap failed: %s", strerror(errno)); -+ close(fd); -+ return FALSE; -+ } -+ -+ if (cursor->bits->argb) -+ memcpy(data, cursor->bits->argb, size); -+ else -+ expand_source_and_mask(cursor, data); -+ munmap(data, size); -+ -+ pool = wl_shm_create_pool(xwl_screen->shm, fd, size); -+ close(fd); -+ buffer = wl_shm_pool_create_buffer(pool, 0, -+ cursor->bits->width, cursor->bits->height, -+ cursor->bits->width * 4, -+ WL_SHM_FORMAT_ARGB8888); -+ wl_shm_pool_destroy(pool); -+ -+ dixSetPrivate(&cursor->devPrivates, &xwl_cursor_private_key, buffer); -+ -+ return TRUE; -+} -+ -+static Bool -+xwl_unrealize_cursor(DeviceIntPtr device, -+ ScreenPtr screen, CursorPtr cursor) -+{ -+ struct wl_buffer *buffer; -+ -+ buffer = dixGetPrivate(&cursor->devPrivates, &xwl_cursor_private_key); -+ wl_buffer_destroy(buffer); -+ -+ return TRUE; -+} -+ -+void -+xwl_seat_set_cursor(struct xwl_seat *xwl_seat) -+{ -+ struct wl_buffer *buffer; -+ -+ if (!xwl_seat->x_cursor || !xwl_seat->wl_pointer) -+ return; -+ -+ buffer = dixGetPrivate(&xwl_seat->x_cursor->devPrivates, -+ &xwl_cursor_private_key); -+ -+ wl_pointer_set_cursor(xwl_seat->wl_pointer, -+ xwl_seat->pointer_enter_serial, -+ xwl_seat->cursor, -+ xwl_seat->x_cursor->bits->xhot, -+ xwl_seat->x_cursor->bits->yhot); -+ wl_surface_attach(xwl_seat->cursor, buffer, 0, 0); -+ wl_surface_damage(xwl_seat->cursor, 0, 0, -+ xwl_seat->x_cursor->bits->width, -+ xwl_seat->x_cursor->bits->height); -+ wl_surface_commit(xwl_seat->cursor); -+} -+ -+static void -+xwl_set_cursor(DeviceIntPtr device, -+ ScreenPtr screen, CursorPtr cursor, int x, int y) -+{ -+ struct xwl_screen *xwl_screen; -+ struct xwl_seat *xwl_seat; -+ -+ xwl_screen = xwl_screen_get(screen); -+ -+ if (!xwl_screen || xorg_list_is_empty(&xwl_screen->seat_list)) -+ return; -+ -+ xwl_seat = xorg_list_first_entry(&xwl_screen->seat_list, -+ struct xwl_seat, link); -+ -+ xwl_seat->x_cursor = cursor; -+ xwl_seat_set_cursor(xwl_seat); -+} -+ -+static void -+xwl_move_cursor(DeviceIntPtr device, ScreenPtr screen, int x, int y) -+{ -+} -+ -+static Bool -+xwl_device_cursor_initialize(DeviceIntPtr device, ScreenPtr screen) -+{ -+ struct xwl_screen *xwl_screen; -+ -+ xwl_screen = xwl_screen_get(screen); -+ -+ return xwl_screen->sprite_funcs->DeviceCursorInitialize(device, -+ screen); -+} -+ -+static void -+xwl_device_cursor_cleanup(DeviceIntPtr device, ScreenPtr screen) -+{ -+ struct xwl_screen *xwl_screen; -+ -+ xwl_screen = xwl_screen_get(screen); -+ -+ xwl_screen->sprite_funcs->DeviceCursorCleanup(device, screen); -+} -+ -+static miPointerSpriteFuncRec xwl_pointer_sprite_funcs = -+{ -+ xwl_realize_cursor, -+ xwl_unrealize_cursor, -+ xwl_set_cursor, -+ xwl_move_cursor, -+ xwl_device_cursor_initialize, -+ xwl_device_cursor_cleanup -+}; -+ -+int -+xwl_screen_init_cursor(struct xwl_screen *xwl_screen, ScreenPtr screen) -+{ -+ miPointerScreenPtr pointer_priv; -+ -+ if (!dixRegisterPrivateKey(&xwl_cursor_private_key, PRIVATE_CURSOR, 0)) -+ return BadAlloc; -+ -+ pointer_priv = dixLookupPrivate(&screen->devPrivates, miPointerScreenKey); -+ xwl_screen->sprite_funcs = pointer_priv->spriteFuncs; -+ pointer_priv->spriteFuncs = &xwl_pointer_sprite_funcs; -+ -+ return Success; -+} -diff --git a/hw/xfree86/xwayland/xwayland-drm.c b/hw/xfree86/xwayland/xwayland-drm.c -new file mode 100644 -index 0000000..ce56e4c ---- /dev/null -+++ b/hw/xfree86/xwayland/xwayland-drm.c -@@ -0,0 +1,235 @@ -+/* -+ * Copyright © 2011 Kristian Høgsberg -+ * -+ * Permission to use, copy, modify, distribute, and sell this software -+ * and its documentation for any purpose is hereby granted without -+ * fee, provided that the above copyright notice appear in all copies -+ * and that both that copyright notice and this permission notice -+ * appear in supporting documentation, and that the name of the -+ * copyright holders not be used in advertising or publicity -+ * pertaining to distribution of the software without specific, -+ * written prior permission. The copyright holders make no -+ * representations about the suitability of this software for any -+ * purpose. It is provided "as is" without express or implied -+ * warranty. -+ * -+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS -+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY -+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN -+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING -+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -+ * SOFTWARE. -+ */ -+ -+#ifdef HAVE_XORG_CONFIG_H -+#include "xorg-config.h" -+#endif -+ -+#include -+#include -+ -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "xwayland.h" -+#include "xwayland-private.h" -+#include "../dri2/dri2.h" -+ -+struct xwl_auth_req { -+ struct xorg_list link; -+ -+ ClientPtr client; -+ struct xwl_screen *xwl_screen; -+ uint32_t magic; -+}; -+ -+static void -+drm_handle_device (void *data, struct wl_drm *drm, const char *device) -+{ -+ struct xwl_screen *xwl_screen = data; -+ -+ xwl_screen->device_name = strdup (device); -+} -+ -+static void -+drm_handle_format(void *data, struct wl_drm *wl_drm, uint32_t format) -+{ -+} -+ -+static void -+drm_handle_authenticated (void *data, struct wl_drm *drm) -+{ -+ struct xwl_screen *xwl_screen = data; -+ struct xwl_auth_req *req; -+ -+ xwl_screen->authenticated = 1; -+ -+ /* it does one authentication transaction at a time, so if there's an -+ * element in the list, we call DRI2SendAuthReply for that client, remove -+ * the head and free the struct. If there are still elements in the list, -+ * it means that we have one or more clients waiting to be authenticated -+ * and we send out a wl_drm authenticate request for the first client in -+ * the list */ -+ if (xorg_list_is_empty(&xwl_screen->authenticate_client_list)) -+ return; -+ -+ req = xorg_list_first_entry(&xwl_screen->authenticate_client_list, -+ struct xwl_auth_req, link); -+ DRI2SendAuthReply(req->client, TRUE); -+ AttendClient(req->client); -+ xorg_list_del(&req->link); -+ free(req); -+ -+ xorg_list_for_each_entry(req, &xwl_screen->authenticate_client_list, -+ link) { -+ wl_drm_authenticate (xwl_screen->drm, req->magic); -+ return; -+ } -+} -+ -+static const struct wl_drm_listener xwl_drm_listener = -+{ -+ drm_handle_device, -+ drm_handle_format, -+ drm_handle_authenticated -+}; -+ -+static void -+drm_handler(void *data, struct wl_registry *registry, uint32_t id, -+ const char *interface, uint32_t version) -+{ -+ struct xwl_screen *xwl_screen = data; -+ -+ if (strcmp (interface, "wl_drm") == 0) { -+ xwl_screen->drm = wl_registry_bind(xwl_screen->registry, id, -+ &wl_drm_interface, 1); -+ wl_drm_add_listener(xwl_screen->drm, &xwl_drm_listener, xwl_screen); -+ } -+} -+ -+static const struct wl_registry_listener drm_listener = { -+ drm_handler, -+}; -+ -+int -+xwl_drm_pre_init(struct xwl_screen *xwl_screen) -+{ -+ uint32_t magic; -+ -+ xwl_screen->drm_registry = wl_display_get_registry(xwl_screen->display); -+ wl_registry_add_listener(xwl_screen->drm_registry, &drm_listener, -+ xwl_screen); -+ -+ /* Ensure drm_handler has seen all the interfaces */ -+ wl_display_roundtrip(xwl_screen->display); -+ /* Ensure the xwl_drm_listener has seen the drm device, if any */ -+ wl_display_roundtrip(xwl_screen->display); -+ -+ ErrorF("wayland_drm_screen_init, device name %s\n", -+ xwl_screen->device_name); -+ -+ xwl_screen->drm_fd = open(xwl_screen->device_name, O_RDWR); -+ if (xwl_screen->drm_fd < 0) { -+ ErrorF("failed to open the drm fd\n"); -+ return BadAccess; -+ } -+ -+ if (drmGetMagic(xwl_screen->drm_fd, &magic)) { -+ ErrorF("failed to get drm magic"); -+ return BadAccess; -+ } -+ -+ wl_drm_authenticate(xwl_screen->drm, magic); -+ -+ wl_display_roundtrip(xwl_screen->display); -+ -+ ErrorF("opened drm fd: %d\n", xwl_screen->drm_fd); -+ -+ if (!xwl_screen->authenticated) { -+ ErrorF("Failed to auth drm fd\n"); -+ return BadAccess; -+ } -+ -+ return Success; -+} -+ -+Bool xwl_drm_initialised(struct xwl_screen *xwl_screen) -+{ -+ return xwl_screen->authenticated; -+} -+ -+int xwl_screen_get_drm_fd(struct xwl_screen *xwl_screen) -+{ -+ return xwl_screen->drm_fd; -+} -+ -+int xwl_drm_authenticate(ClientPtr client, struct xwl_screen *xwl_screen, -+ uint32_t magic) -+{ -+ struct xwl_auth_req *req; -+ -+ if (!xwl_screen->drm) -+ return BadAccess; -+ -+ req = malloc (sizeof *req); -+ if (req == NULL) -+ return BadAlloc; -+ -+ req->client = client; -+ req->xwl_screen = xwl_screen; -+ req->magic = magic; -+ -+ if (xorg_list_is_empty(&xwl_screen->authenticate_client_list)) -+ wl_drm_authenticate (xwl_screen->drm, magic); -+ -+ xorg_list_append(&req->link, &xwl_screen->authenticate_client_list); -+ -+ IgnoreClient(req->client); -+ xwl_screen->authenticated = 0; -+ -+ return Success; -+} -+ -+ -+int -+xwl_create_window_buffer_drm(struct xwl_window *xwl_window, -+ PixmapPtr pixmap, uint32_t name) -+{ -+ VisualID visual; -+ WindowPtr window = xwl_window->window; -+ ScreenPtr screen = window->drawable.pScreen; -+ uint32_t format; -+ int i; -+ -+ visual = wVisual(window); -+ for (i = 0; i < screen->numVisuals; i++) -+ if (screen->visuals[i].vid == visual) -+ break; -+ -+ if (screen->visuals[i].nplanes == 32) -+ format = WL_DRM_FORMAT_ARGB8888; -+ else -+ format = WL_DRM_FORMAT_XRGB8888; -+ -+ xwl_window->buffer = -+ wl_drm_create_buffer(xwl_window->xwl_screen->drm, -+ name, -+ pixmap->drawable.width, -+ pixmap->drawable.height, -+ pixmap->devKind, -+ format); -+ -+ return xwl_window->buffer ? Success : BadDrawable; -+} -diff --git a/hw/xfree86/xwayland/xwayland-input.c b/hw/xfree86/xwayland/xwayland-input.c -new file mode 100644 -index 0000000..2f8e0c7 ---- /dev/null -+++ b/hw/xfree86/xwayland/xwayland-input.c -@@ -0,0 +1,610 @@ -+/* -+ * Copyright © 2008 Kristian Høgsberg -+ * -+ * Permission to use, copy, modify, distribute, and sell this software -+ * and its documentation for any purpose is hereby granted without -+ * fee, provided that the above copyright notice appear in all copies -+ * and that both that copyright notice and this permission notice -+ * appear in supporting documentation, and that the name of the -+ * copyright holders not be used in advertising or publicity -+ * pertaining to distribution of the software without specific, -+ * written prior permission. The copyright holders make no -+ * representations about the suitability of this software for any -+ * purpose. It is provided "as is" without express or implied -+ * warranty. -+ * -+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS -+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY -+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN -+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING -+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -+ * SOFTWARE. -+ */ -+ -+#ifdef HAVE_XORG_CONFIG_H -+#include "xorg-config.h" -+#endif -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "xwayland.h" -+#include "xwayland-private.h" -+#include "xserver-client-protocol.h" -+ -+static void -+xwl_pointer_control(DeviceIntPtr device, PtrCtrl *ctrl) -+{ -+ /* Nothing to do, dix handles all settings */ -+} -+ -+static int -+xwl_pointer_proc(DeviceIntPtr device, int what) -+{ -+#define NBUTTONS 10 -+#define NAXES 2 -+ BYTE map[NBUTTONS + 1]; -+ int i = 0; -+ Atom btn_labels[NBUTTONS] = {0}; -+ Atom axes_labels[NAXES] = {0}; -+ -+ switch (what) { -+ case DEVICE_INIT: -+ device->public.on = FALSE; -+ -+ for (i = 1; i <= NBUTTONS; i++) -+ map[i] = i; -+ -+ btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT); -+ btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE); -+ btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT); -+ btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP); -+ btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN); -+ btn_labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT); -+ btn_labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT); -+ /* don't know about the rest */ -+ -+ axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_X); -+ axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_Y); -+ -+ if (!InitValuatorClassDeviceStruct(device, 2, btn_labels, -+ GetMotionHistorySize(), Absolute)) -+ return BadValue; -+ -+ /* Valuators */ -+ InitValuatorAxisStruct(device, 0, axes_labels[0], -+ 0, 0xFFFF, 10000, 0, 10000, Absolute); -+ InitValuatorAxisStruct(device, 1, axes_labels[1], -+ 0, 0xFFFF, 10000, 0, 10000, Absolute); -+ -+ if (!InitPtrFeedbackClassDeviceStruct(device, xwl_pointer_control)) -+ return BadValue; -+ -+ if (!InitButtonClassDeviceStruct(device, 3, btn_labels, map)) -+ return BadValue; -+ -+ return Success; -+ -+ case DEVICE_ON: -+ device->public.on = TRUE; -+ return Success; -+ -+ case DEVICE_OFF: -+ case DEVICE_CLOSE: -+ device->public.on = FALSE; -+ return Success; -+ } -+ -+ return BadMatch; -+ -+#undef NBUTTONS -+#undef NAXES -+} -+ -+static void -+xwl_keyboard_control(DeviceIntPtr device, KeybdCtrl *ctrl) -+{ -+ /* FIXME: Set keyboard leds based on CAPSFLAG etc being set in -+ * ctrl->leds - needs private protocol. */ -+} -+ -+static int -+xwl_keyboard_proc(DeviceIntPtr device, int what) -+{ -+ InputInfoPtr pInfo = device->public.devicePrivate; -+ struct xwl_seat *xwl_seat = pInfo->private; -+ int len; -+ -+ switch (what) { -+ case DEVICE_INIT: -+ device->public.on = FALSE; -+ len = strnlen(xwl_seat->keymap, xwl_seat->keymap_size); -+ if (!InitKeyboardDeviceStructFromString(device, xwl_seat->keymap, -+ len, -+ NULL, xwl_keyboard_control)) -+ return BadValue; -+ -+ return Success; -+ case DEVICE_ON: -+ device->public.on = TRUE; -+ return Success; -+ -+ case DEVICE_OFF: -+ case DEVICE_CLOSE: -+ device->public.on = FALSE; -+ return Success; -+ } -+ -+ return BadMatch; -+} -+ -+static void -+xwl_keyboard_uninit(InputDriverPtr drv, InputInfoPtr pInfo, int flags) -+{ -+} -+ -+static int -+xwl_keyboard_init(InputDriverPtr drv, InputInfoPtr pInfo, int flags) -+{ -+ pInfo->type_name = "xwayland-keyboard"; -+ pInfo->device_control = xwl_keyboard_proc; -+ pInfo->read_input = NULL; -+ pInfo->control_proc = NULL; -+ pInfo->switch_mode = NULL; -+ pInfo->fd = -1; -+ -+ return Success; -+} -+ -+_X_EXPORT InputDriverRec xwl_keyboard_driver = { -+ 1, -+ "xwayland-keyboard", -+ NULL, -+ xwl_keyboard_init, -+ xwl_keyboard_uninit, -+ NULL, -+}; -+ -+static void -+xwl_pointer_uninit(InputDriverPtr drv, InputInfoPtr pInfo, int flags) -+{ -+} -+ -+static int -+xwl_pointer_init(InputDriverPtr drv, InputInfoPtr pInfo, int flags) -+{ -+ pInfo->type_name = "xwayland-pointer"; -+ pInfo->device_control = xwl_pointer_proc; -+ pInfo->read_input = NULL; -+ pInfo->control_proc = NULL; -+ pInfo->switch_mode = NULL; -+ pInfo->fd = -1; -+ -+ return Success; -+} -+ -+_X_EXPORT InputDriverRec xwl_pointer_driver = { -+ 1, -+ "xwayland-pointer", -+ NULL, -+ xwl_pointer_init, -+ xwl_pointer_uninit, -+ NULL, -+}; -+ -+void -+xwl_input_teardown(pointer p) -+{ -+} -+ -+pointer -+xwl_input_setup(pointer module, pointer opts, int *errmaj, int *errmin) -+{ -+ xf86AddInputDriver(&xwl_keyboard_driver, module, 0); -+ xf86AddInputDriver(&xwl_pointer_driver, module, 0); -+ -+ return module; -+} -+ -+static DeviceIntPtr -+device_added(struct xwl_seat *xwl_seat, const char *driver) -+{ -+ DeviceIntPtr dev = NULL; -+ InputInfoPtr pInfo; -+ int rc; -+ -+ pInfo = xf86AllocateInput(); -+ if (!pInfo) -+ return NULL; -+ -+ pInfo->driver = xstrdup(driver); -+ -+ if (asprintf(&pInfo->name, "%s:%d", pInfo->driver, xwl_seat->id) == -1) { -+ free(pInfo); -+ return NULL; -+ } -+ -+ pInfo->private = xwl_seat; -+ -+ rc = xf86NewInputDevice(pInfo, &dev, 1); -+ if (rc != Success) { -+ free(pInfo); -+ return NULL; -+ } -+ -+ LogMessage(X_INFO, "config/xwayland: Adding input device %s\n", -+ pInfo->name); -+ -+ return dev; -+} -+ -+static void -+pointer_handle_enter(void *data, struct wl_pointer *pointer, -+ uint32_t serial, struct wl_surface *surface, -+ wl_fixed_t sx_w, wl_fixed_t sy_w) -+ -+{ -+ struct xwl_seat *xwl_seat = data; -+ DeviceIntPtr dev = xwl_seat->pointer; -+ int i; -+ int sx = wl_fixed_to_int(sx_w); -+ int sy = wl_fixed_to_int(sy_w); -+ ScreenPtr pScreen = xwl_seat->xwl_screen->screen; -+ -+ xwl_seat->xwl_screen->serial = serial; -+ xwl_seat->pointer_enter_serial = serial; -+ -+ xwl_seat->focus_window = wl_surface_get_user_data(surface); -+ -+ (*pScreen->SetCursorPosition) (dev, pScreen, sx, sy, TRUE); -+ -+ SetDeviceRedirectWindow(xwl_seat->pointer, xwl_seat->focus_window->window); -+ -+ /* Ideally, X clients shouldn't see these button releases. When -+ * the pointer leaves a window with buttons down, it means that -+ * the wayland compositor has grabbed the pointer. The button -+ * release event is consumed by whatever grab in the compositor -+ * and won't be sent to clients (the X server is a client). -+ * However, we need to reset X's idea of which buttons are up and -+ * down, and they're all up (by definition) when the pointer -+ * enters a window. We should figure out a way to swallow these -+ * events, perhaps using an X grab whenever the pointer is not in -+ * any X window, but for now just send the events. */ -+ for (i = 0; i < dev->button->numButtons; i++) -+ if (BitIsOn(dev->button->down, i)) -+ xf86PostButtonEvent(dev, TRUE, i, 0, 0, 0); -+ -+ (*pScreen->DisplayCursor)(dev, pScreen, dev->spriteInfo->sprite->current); -+} -+ -+static void -+pointer_handle_leave(void *data, struct wl_pointer *pointer, -+ uint32_t serial, struct wl_surface *surface) -+{ -+ struct xwl_seat *xwl_seat = data; -+ DeviceIntPtr dev = xwl_seat->pointer; -+ ScreenPtr pScreen = xwl_seat->xwl_screen->screen; -+ -+ xwl_seat->xwl_screen->serial = serial; -+ -+ xwl_seat->focus_window = NULL; -+ SetDeviceRedirectWindow(xwl_seat->pointer, PointerRootWin); -+ (*pScreen->DisplayCursor)(dev, pScreen, NullCursor); -+} -+ -+static void -+pointer_handle_motion(void *data, struct wl_pointer *pointer, -+ uint32_t time, wl_fixed_t sx_w, wl_fixed_t sy_w) -+{ -+ struct xwl_seat *xwl_seat = data; -+ int32_t dx, dy; -+ int sx = wl_fixed_to_int(sx_w); -+ int sy = wl_fixed_to_int(sy_w); -+ ValuatorMask mask; -+ -+ if (!xwl_seat->focus_window) -+ return ; -+ -+ dx = xwl_seat->focus_window->window->drawable.x; -+ dy = xwl_seat->focus_window->window->drawable.y; -+ -+ valuator_mask_zero(&mask); -+ valuator_mask_set(&mask, 0, dx + sx); -+ valuator_mask_set(&mask, 1, dy + sy); -+ -+ QueuePointerEvents(xwl_seat->pointer, MotionNotify, 0, -+ POINTER_ABSOLUTE | POINTER_SCREEN, &mask); -+} -+ -+static void -+pointer_handle_button(void *data, struct wl_pointer *pointer, uint32_t serial, -+ uint32_t time, uint32_t button, uint32_t state) -+{ -+ struct xwl_seat *xwl_seat = data; -+ int index; -+ -+ xwl_seat->xwl_screen->serial = serial; -+ -+ switch (button) { -+ case BTN_MIDDLE: -+ index = 2; -+ break; -+ case BTN_RIGHT: -+ index = 3; -+ break; -+ default: -+ index = button - BTN_LEFT + 1; -+ break; -+ } -+ -+ xf86PostButtonEvent(xwl_seat->pointer, TRUE, index, state, 0, 0); -+} -+ -+static void -+pointer_handle_axis(void *data, struct wl_pointer *pointer, -+ uint32_t time, uint32_t axis, wl_fixed_t value) -+{ -+ struct xwl_seat *xwl_seat = data; -+ int index, count; -+ int i, val; -+ const int divisor = 10; -+ -+ if (time - xwl_seat->scroll_time > 2000) { -+ xwl_seat->vertical_scroll = 0; -+ xwl_seat->horizontal_scroll = 0; -+ } -+ xwl_seat->scroll_time = time; -+ -+ /* FIXME: Need to do proper smooth scrolling here! */ -+ switch (axis) { -+ case WL_POINTER_AXIS_VERTICAL_SCROLL: -+ xwl_seat->vertical_scroll += value / divisor; -+ val = wl_fixed_to_int(xwl_seat->vertical_scroll); -+ xwl_seat->vertical_scroll -= wl_fixed_from_int(val); -+ -+ if (val <= -1) -+ index = 4; -+ else if (val >= 1) -+ index = 5; -+ else -+ return; -+ break; -+ case WL_POINTER_AXIS_HORIZONTAL_SCROLL: -+ xwl_seat->horizontal_scroll += value / divisor; -+ val = wl_fixed_to_int(xwl_seat->horizontal_scroll); -+ xwl_seat->horizontal_scroll -= wl_fixed_from_int(val); -+ -+ if (val <= -1) -+ index = 6; -+ else if (val >= 1) -+ index = 7; -+ else -+ return; -+ break; -+ default: -+ return; -+ } -+ -+ count = abs(val); -+ for (i = 0; i < count; i++) { -+ xf86PostButtonEvent(xwl_seat->pointer, TRUE, index, 1, 0, 0); -+ xf86PostButtonEvent(xwl_seat->pointer, TRUE, index, 0, 0, 0); -+ } -+} -+ -+static const struct wl_pointer_listener pointer_listener = { -+ pointer_handle_enter, -+ pointer_handle_leave, -+ pointer_handle_motion, -+ pointer_handle_button, -+ pointer_handle_axis, -+}; -+ -+static void -+keyboard_handle_key(void *data, struct wl_keyboard *keyboard, uint32_t serial, -+ uint32_t time, uint32_t key, uint32_t state) -+{ -+ struct xwl_seat *xwl_seat = data; -+ uint32_t *k, *end; -+ -+ xwl_seat->xwl_screen->serial = serial; -+ -+ end = xwl_seat->keys.data + xwl_seat->keys.size; -+ for (k = xwl_seat->keys.data; k < end; k++) { -+ if (*k == key) -+ *k = *--end; -+ } -+ xwl_seat->keys.size = (void *) end - xwl_seat->keys.data; -+ if (state) { -+ k = wl_array_add(&xwl_seat->keys, sizeof *k); -+ *k = key; -+ } -+ -+ xf86PostKeyboardEvent(xwl_seat->keyboard, key + 8, state); -+} -+ -+static void -+keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard, -+ uint32_t format, int fd, uint32_t size) -+{ -+ struct xwl_seat *xwl_seat = data; -+ -+ xwl_seat->keymap_size = size; -+ xwl_seat->keymap = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); -+ if (xwl_seat->keymap == MAP_FAILED) -+ ; /* wah wah */ -+ -+ close(fd); -+} -+ -+static void -+keyboard_handle_enter(void *data, struct wl_keyboard *keyboard, -+ uint32_t serial, -+ struct wl_surface *surface, struct wl_array *keys) -+{ -+ struct xwl_seat *xwl_seat = data; -+ uint32_t *k; -+ -+ xwl_seat->xwl_screen->serial = serial; -+ -+ wl_array_copy(&xwl_seat->keys, keys); -+ wl_array_for_each(k, &xwl_seat->keys) -+ xf86PostKeyboardEvent(xwl_seat->keyboard, *k + 8, 1); -+} -+ -+static void -+keyboard_handle_leave(void *data, struct wl_keyboard *keyboard, -+ uint32_t serial, struct wl_surface *surface) -+{ -+ struct xwl_seat *xwl_seat = data; -+ uint32_t *k; -+ -+ xwl_seat->xwl_screen->serial = serial; -+ -+ wl_array_for_each(k, &xwl_seat->keys) -+ xf86PostKeyboardEvent(xwl_seat->keyboard, *k + 8, 0); -+} -+ -+static void -+keyboard_handle_modifiers(void *data, struct wl_keyboard *keyboard, -+ uint32_t serial, uint32_t mods_depressed, -+ uint32_t mods_latched, uint32_t mods_locked, -+ uint32_t group) -+{ -+ /* FIXME: Need more server XKB API here. */ -+} -+ -+static const struct wl_keyboard_listener keyboard_listener = { -+ keyboard_handle_keymap, -+ keyboard_handle_enter, -+ keyboard_handle_leave, -+ keyboard_handle_key, -+ keyboard_handle_modifiers, -+}; -+ -+static void -+add_devices(void *data, struct wl_callback *callback, uint32_t time) -+{ -+ struct xwl_seat *xwl_seat = data; -+ -+ wl_callback_destroy(callback); -+ -+ if (xwl_seat->wl_pointer) -+ xwl_seat->pointer = device_added(xwl_seat, "xwayland-pointer"); -+ if (xwl_seat->wl_keyboard) -+ xwl_seat->keyboard = device_added(xwl_seat, "xwayland-keyboard"); -+} -+ -+static const struct wl_callback_listener add_devices_listener = { -+ add_devices -+}; -+ -+static void -+seat_handle_capabilities(void *data, struct wl_seat *seat, -+ enum wl_seat_capability caps) -+{ -+ struct xwl_seat *xwl_seat = data; -+ struct wl_callback *callback; -+ -+ if (caps & WL_SEAT_CAPABILITY_POINTER) { -+ xwl_seat->wl_pointer = wl_seat_get_pointer(seat); -+ wl_pointer_add_listener(xwl_seat->wl_pointer, -+ &pointer_listener, xwl_seat); -+ xwl_seat_set_cursor(xwl_seat); -+ } -+ -+ if (caps & WL_SEAT_CAPABILITY_KEYBOARD) { -+ xwl_seat->wl_keyboard = wl_seat_get_keyboard(seat); -+ wl_keyboard_add_listener(xwl_seat->wl_keyboard, -+ &keyboard_listener, xwl_seat); -+ -+ } -+ /* FIXME: Touch ... */ -+ -+ /* Add devices after we've received keymaps. */ -+ if (caps) { -+ callback = wl_display_sync(xwl_seat->xwl_screen->display); -+ wl_callback_add_listener(callback, -+ &add_devices_listener, xwl_seat); -+ } -+} -+ -+static const struct wl_seat_listener seat_listener = { -+ seat_handle_capabilities, -+}; -+ -+static void -+create_input_device(struct xwl_screen *xwl_screen, uint32_t id) -+{ -+ struct xwl_seat *xwl_seat; -+ -+ xwl_seat = calloc(sizeof *xwl_seat, 1); -+ if (xwl_seat == NULL) { -+ ErrorF("create_input ENOMEM"); -+ return ; -+ } -+ -+ xwl_seat->xwl_screen = xwl_screen; -+ xorg_list_add(&xwl_seat->link, &xwl_screen->seat_list); -+ -+ xwl_seat->seat = -+ wl_registry_bind(xwl_screen->registry, id, &wl_seat_interface, 1); -+ xwl_seat->id = id; -+ -+ xwl_seat->cursor = wl_compositor_create_surface(xwl_screen->compositor); -+ wl_seat_add_listener(xwl_seat->seat, &seat_listener, xwl_seat); -+ wl_array_init(&xwl_seat->keys); -+} -+ -+static void -+input_handler(void *data, struct wl_registry *registry, uint32_t id, -+ const char *interface, uint32_t version) -+{ -+ struct xwl_screen *xwl_screen = data; -+ -+ if (strcmp (interface, "wl_seat") == 0) { -+ create_input_device(xwl_screen, id); -+ } else if (strcmp(interface, "xserver") == 0) { -+ xwl_screen->xorg_server = -+ wl_registry_bind(registry, id, &xserver_interface, 1); -+ xserver_add_listener(xwl_screen->xorg_server, &xwl_server_listener, -+ xwl_screen); -+ } -+} -+ -+static const struct wl_registry_listener input_listener = { -+ input_handler, -+}; -+ -+void -+xwl_input_init(struct xwl_screen *xwl_screen) -+{ -+ xwl_screen->input_registry = wl_display_get_registry(xwl_screen->display); -+ wl_registry_add_listener(xwl_screen->input_registry, &input_listener, -+ xwl_screen); -+} -diff --git a/hw/xfree86/xwayland/xwayland-output.c b/hw/xfree86/xwayland/xwayland-output.c -new file mode 100644 -index 0000000..8f087f6 ---- /dev/null -+++ b/hw/xfree86/xwayland/xwayland-output.c -@@ -0,0 +1,309 @@ -+/* -+ * Copyright © 2011 Intel Corporation -+ * -+ * Permission to use, copy, modify, distribute, and sell this software -+ * and its documentation for any purpose is hereby granted without -+ * fee, provided that the above copyright notice appear in all copies -+ * and that both that copyright notice and this permission notice -+ * appear in supporting documentation, and that the name of the -+ * copyright holders not be used in advertising or publicity -+ * pertaining to distribution of the software without specific, -+ * written prior permission. The copyright holders make no -+ * representations about the suitability of this software for any -+ * purpose. It is provided "as is" without express or implied -+ * warranty. -+ * -+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS -+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY -+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN -+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING -+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -+ * SOFTWARE. -+ */ -+ -+#ifdef HAVE_XORG_CONFIG_H -+#include "xorg-config.h" -+#endif -+ -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+ -+#include "xwayland.h" -+#include "xwayland-private.h" -+#include "xserver-client-protocol.h" -+ -+static void -+crtc_dpms(xf86CrtcPtr drmmode_crtc, int mode) -+{ -+} -+ -+static Bool -+crtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode, -+ Rotation rotation, int x, int y) -+{ -+ return TRUE; -+} -+ -+static void -+crtc_set_cursor_colors (xf86CrtcPtr crtc, int bg, int fg) -+{ -+} -+ -+static void -+crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y) -+{ -+} -+ -+static void -+crtc_show_cursor (xf86CrtcPtr crtc) -+{ -+} -+ -+static void -+crtc_hide_cursor (xf86CrtcPtr crtc) -+{ -+} -+ -+static void -+crtc_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image) -+{ -+} -+ -+static PixmapPtr -+crtc_shadow_create(xf86CrtcPtr crtc, void *data, int width, int height) -+{ -+ return NULL; -+} -+ -+static void * -+crtc_shadow_allocate(xf86CrtcPtr crtc, int width, int height) -+{ -+ return NULL; -+} -+ -+static void -+crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *data) -+{ -+} -+ -+static const xf86CrtcFuncsRec crtc_funcs = { -+ .dpms = crtc_dpms, -+ .set_mode_major = crtc_set_mode_major, -+ .set_cursor_colors = crtc_set_cursor_colors, -+ .set_cursor_position = crtc_set_cursor_position, -+ .show_cursor = crtc_show_cursor, -+ .hide_cursor = crtc_hide_cursor, -+ .load_cursor_argb = crtc_load_cursor_argb, -+ .shadow_create = crtc_shadow_create, -+ .shadow_allocate = crtc_shadow_allocate, -+ .shadow_destroy = crtc_shadow_destroy, -+ .destroy = NULL, /* XXX */ -+}; -+ -+static void -+output_dpms(xf86OutputPtr output, int mode) -+{ -+ return; -+} -+ -+static xf86OutputStatus -+output_detect(xf86OutputPtr output) -+{ -+ return XF86OutputStatusConnected; -+} -+ -+static Bool -+output_mode_valid(xf86OutputPtr output, DisplayModePtr pModes) -+{ -+ return MODE_OK; -+} -+ -+static DisplayModePtr -+output_get_modes(xf86OutputPtr xf86output) -+{ -+ struct xwl_output *output = xf86output->driver_private; -+ struct monitor_ranges *ranges; -+ DisplayModePtr modes; -+ -+ modes = xf86CVTMode(output->width, output->height, 60, TRUE, FALSE); -+ output->xf86monitor.det_mon[0].type = DS_RANGES; -+ ranges = &output->xf86monitor.det_mon[0].section.ranges; -+ ranges->min_h = modes->HSync - 10; -+ ranges->max_h = modes->HSync + 10; -+ ranges->min_v = modes->VRefresh - 10; -+ ranges->max_v = modes->VRefresh + 10; -+ ranges->max_clock = modes->Clock + 100; -+ output->xf86monitor.det_mon[1].type = DT; -+ output->xf86monitor.det_mon[2].type = DT; -+ output->xf86monitor.det_mon[3].type = DT; -+ output->xf86monitor.no_sections = 0; -+ -+ xf86output->MonInfo = &output->xf86monitor; -+ -+ return modes; -+} -+ -+static void -+output_destroy(xf86OutputPtr xf86output) -+{ -+ struct xwl_output *output = xf86output->driver_private; -+ -+ free(output); -+} -+ -+static const xf86OutputFuncsRec output_funcs = { -+ .dpms = output_dpms, -+ .detect = output_detect, -+ .mode_valid = output_mode_valid, -+ .get_modes = output_get_modes, -+ .destroy = output_destroy -+}; -+ -+struct xwl_output * -+xwl_output_create(struct xwl_screen *xwl_screen) -+{ -+ struct xwl_output *xwl_output; -+ xf86OutputPtr xf86output; -+ xf86CrtcPtr xf86crtc; -+ -+ xwl_output = calloc(sizeof *xwl_output, 1); -+ if (xwl_output == NULL) { -+ ErrorF("create_output ENOMEM"); -+ return NULL; -+ } -+ -+ xwl_output->xwl_screen = xwl_screen; -+ -+ xf86output = xf86OutputCreate(xwl_screen->scrninfo, -+ &output_funcs, "XWAYLAND-1"); -+ xf86output->driver_private = xwl_output; -+ xf86output->possible_crtcs = 1; -+ xf86output->possible_clones = 1; -+ -+ xf86crtc = xf86CrtcCreate(xwl_screen->scrninfo, &crtc_funcs); -+ xf86crtc->driver_private = xwl_output; -+ -+ xwl_output->xf86output = xf86output; -+ xwl_output->xf86crtc = xf86crtc; -+ -+ return xwl_output; -+} -+ -+static Bool -+resize(ScrnInfoPtr scrn, int width, int height) -+{ -+ if (scrn->virtualX == width && scrn->virtualY == height) -+ return TRUE; -+ /* We don't handle resize at all, we must match the compositor size */ -+ return FALSE; -+} -+ -+static const xf86CrtcConfigFuncsRec config_funcs = { -+ resize -+}; -+ -+static void -+display_handle_geometry(void *data, struct wl_output *wl_output, int x, int y, -+ int physical_width, int physical_height, int subpixel, -+ const char *make, const char *model, int transform) -+{ -+ struct xwl_output *xwl_output = data; -+ struct xwl_screen *xwl_screen = xwl_output->xwl_screen; -+ -+ xwl_output->xf86output->mm_width = physical_width; -+ xwl_output->xf86output->mm_height = physical_height; -+ -+ switch (subpixel) { -+ case WL_OUTPUT_SUBPIXEL_UNKNOWN: -+ xwl_output->xf86output->subpixel_order = SubPixelUnknown; -+ break; -+ case WL_OUTPUT_SUBPIXEL_NONE: -+ xwl_output->xf86output->subpixel_order = SubPixelNone; -+ break; -+ case WL_OUTPUT_SUBPIXEL_HORIZONTAL_RGB: -+ xwl_output->xf86output->subpixel_order = SubPixelHorizontalRGB; -+ break; -+ case WL_OUTPUT_SUBPIXEL_HORIZONTAL_BGR: -+ xwl_output->xf86output->subpixel_order = SubPixelHorizontalBGR; -+ break; -+ case WL_OUTPUT_SUBPIXEL_VERTICAL_RGB: -+ xwl_output->xf86output->subpixel_order = SubPixelVerticalRGB; -+ break; -+ case WL_OUTPUT_SUBPIXEL_VERTICAL_BGR: -+ xwl_output->xf86output->subpixel_order = SubPixelVerticalBGR; -+ break; -+ } -+ -+ xwl_output->x = x; -+ xwl_output->y = y; -+ -+ xwl_screen->xwl_output = xwl_output; -+} -+ -+static void -+display_handle_mode(void *data, struct wl_output *wl_output, uint32_t flags, -+ int width, int height, int refresh) -+{ -+ struct xwl_output *xwl_output = data; -+ -+ if (flags & WL_OUTPUT_MODE_CURRENT) { -+ xwl_output->width = width; -+ xwl_output->height = height; -+ } -+} -+ -+static const struct wl_output_listener output_listener = { -+ display_handle_geometry, -+ display_handle_mode -+}; -+ -+static void -+global_handler(void *data, struct wl_registry *registry, uint32_t id, -+ const char *interface, uint32_t version) -+{ -+ struct xwl_screen *xwl_screen = data; -+ struct xwl_output *xwl_output; -+ -+ if (strcmp (interface, "wl_output") == 0) { -+ xwl_output = xwl_output_create(xwl_screen); -+ xwl_output->output = wl_registry_bind(registry, id, -+ &wl_output_interface, 1); -+ wl_output_add_listener(xwl_output->output, -+ &output_listener, xwl_output); -+ } -+} -+ -+static const struct wl_registry_listener global_listener = { -+ global_handler, -+}; -+ -+void -+xwayland_screen_preinit_output(struct xwl_screen *xwl_screen, ScrnInfoPtr scrninfo) -+{ -+ int ret; -+ -+ xf86CrtcConfigInit(scrninfo, &config_funcs); -+ -+ xf86CrtcSetSizeRange(scrninfo, 320, 200, 8192, 8192); -+ -+ xwl_screen->output_registry = wl_display_get_registry(xwl_screen->display); -+ wl_registry_add_listener(xwl_screen->output_registry, &global_listener, -+ xwl_screen); -+ -+ while (!xwl_screen->xwl_output) { -+ ret = wl_display_roundtrip(xwl_screen->display); -+ if (ret == -1) -+ FatalError("failed to dispatch Wayland events: %s\n", strerror(errno)); -+ } -+ -+ xf86InitialConfiguration(scrninfo, TRUE); -+} -diff --git a/hw/xfree86/xwayland/xwayland-private.h b/hw/xfree86/xwayland/xwayland-private.h -new file mode 100644 -index 0000000..e427316 ---- /dev/null -+++ b/hw/xfree86/xwayland/xwayland-private.h -@@ -0,0 +1,132 @@ -+/* -+ * Copyright © 2010 Kristian Høgsberg -+ * -+ * Permission to use, copy, modify, distribute, and sell this software -+ * and its documentation for any purpose is hereby granted without -+ * fee, provided that the above copyright notice appear in all copies -+ * and that both that copyright notice and this permission notice -+ * appear in supporting documentation, and that the name of the -+ * copyright holders not be used in advertising or publicity -+ * pertaining to distribution of the software without specific, -+ * written prior permission. The copyright holders make no -+ * representations about the suitability of this software for any -+ * purpose. It is provided "as is" without express or implied -+ * warranty. -+ * -+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS -+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY -+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN -+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING -+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -+ * SOFTWARE. -+ */ -+ -+#ifndef _XWAYLAND_PRIVATE_H_ -+#define _XWAYLAND_PRIVATE_H_ -+ -+struct xwl_window { -+ struct xwl_screen *xwl_screen; -+ struct wl_surface *surface; -+ struct wl_buffer *buffer; -+ WindowPtr window; -+ DamagePtr damage; -+ struct xorg_list link; -+ struct xorg_list link_damage; -+}; -+ -+struct xwl_output; -+ -+struct xwl_screen { -+ struct xwl_driver *driver; -+ ScreenPtr screen; -+ ScrnInfoPtr scrninfo; -+ int drm_fd; -+ int wayland_fd; -+ struct xwl_output *xwl_output; -+ struct wl_display *display; -+ struct wl_registry *registry; -+ struct wl_registry *drm_registry; -+ struct wl_registry *input_registry; -+ struct wl_registry *output_registry; -+ struct wl_compositor *compositor; -+ struct wl_drm *drm; -+ struct wl_shm *shm; -+ struct xserver *xorg_server; -+ uint32_t mask; -+ uint32_t flags; -+ char *device_name; -+ uint32_t authenticated; -+ struct xorg_list seat_list; -+ struct xorg_list damage_window_list; -+ struct xorg_list window_list; -+ struct xorg_list authenticate_client_list; -+ uint32_t serial; -+ -+ CreateWindowProcPtr CreateWindow; -+ DestroyWindowProcPtr DestroyWindow; -+ RealizeWindowProcPtr RealizeWindow; -+ UnrealizeWindowProcPtr UnrealizeWindow; -+ SetWindowPixmapProcPtr SetWindowPixmap; -+ MoveWindowProcPtr MoveWindow; -+ miPointerSpriteFuncPtr sprite_funcs; -+}; -+ -+struct xwl_output { -+ struct wl_output *output; -+ struct xwl_screen *xwl_screen; -+ int32_t x, y, width, height; -+ xf86Monitor xf86monitor; -+ xf86OutputPtr xf86output; -+ xf86CrtcPtr xf86crtc; -+}; -+ -+ -+#define MODIFIER_META 0x01 -+ -+struct xwl_seat { -+ DeviceIntPtr pointer; -+ DeviceIntPtr keyboard; -+ struct xwl_screen *xwl_screen; -+ struct wl_seat *seat; -+ struct wl_pointer *wl_pointer; -+ struct wl_keyboard *wl_keyboard; -+ struct wl_array keys; -+ struct wl_surface *cursor; -+ struct xwl_window *focus_window; -+ uint32_t id; -+ uint32_t pointer_enter_serial; -+ struct xorg_list link; -+ CursorPtr x_cursor; -+ -+ wl_fixed_t horizontal_scroll; -+ wl_fixed_t vertical_scroll; -+ uint32_t scroll_time; -+ -+ size_t keymap_size; -+ char *keymap; -+ -+}; -+ -+ -+struct xwl_screen *xwl_screen_get(ScreenPtr screen); -+ -+void xwayland_screen_preinit_output(struct xwl_screen *xwl_screen, ScrnInfoPtr scrninfo); -+ -+int xwl_screen_init_cursor(struct xwl_screen *xwl_screen, ScreenPtr screen); -+int xwl_screen_init_window(struct xwl_screen *xwl_screen, ScreenPtr screen); -+ -+struct xwl_output *xwl_output_create(struct xwl_screen *xwl_screen); -+ -+void xwl_input_teardown(pointer p); -+pointer xwl_input_setup(pointer module, pointer opts, int *errmaj, int *errmin); -+void xwl_input_init(struct xwl_screen *screen); -+ -+Bool xwl_drm_initialised(struct xwl_screen *screen); -+ -+void xwl_seat_set_cursor(struct xwl_seat *xwl_seat); -+ -+extern const struct xserver_listener xwl_server_listener; -+ -+#endif /* _XWAYLAND_PRIVATE_H_ */ -diff --git a/hw/xfree86/xwayland/xwayland-window.c b/hw/xfree86/xwayland/xwayland-window.c -new file mode 100644 -index 0000000..d56e0d0 ---- /dev/null -+++ b/hw/xfree86/xwayland/xwayland-window.c -@@ -0,0 +1,317 @@ -+/* -+ * Copyright © 2011 Intel Corporation -+ * -+ * Permission to use, copy, modify, distribute, and sell this software -+ * and its documentation for any purpose is hereby granted without -+ * fee, provided that the above copyright notice appear in all copies -+ * and that both that copyright notice and this permission notice -+ * appear in supporting documentation, and that the name of the -+ * copyright holders not be used in advertising or publicity -+ * pertaining to distribution of the software without specific, -+ * written prior permission. The copyright holders make no -+ * representations about the suitability of this software for any -+ * purpose. It is provided "as is" without express or implied -+ * warranty. -+ * -+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS -+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY -+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN -+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING -+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -+ * SOFTWARE. -+ */ -+ -+#ifdef HAVE_XORG_CONFIG_H -+#include "xorg-config.h" -+#endif -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include "xwayland.h" -+#include "xwayland-private.h" -+#include "xserver-client-protocol.h" -+ -+static DevPrivateKeyRec xwl_window_private_key; -+ -+static void -+free_pixmap(void *data, struct wl_callback *callback, uint32_t time) -+{ -+ PixmapPtr pixmap = data; -+ ScreenPtr screen = pixmap->drawable.pScreen; -+ -+ (*screen->DestroyPixmap)(pixmap); -+ wl_callback_destroy(callback); -+} -+ -+static const struct wl_callback_listener free_pixmap_listener = { -+ free_pixmap, -+}; -+ -+static void -+xwl_window_attach(struct xwl_window *xwl_window, PixmapPtr pixmap) -+{ -+ struct xwl_screen *xwl_screen = xwl_window->xwl_screen; -+ struct wl_callback *callback; -+ -+ /* We can safely destroy the buffer because we only use one buffer -+ * per surface in xwayland model */ -+ if (xwl_window->buffer) -+ wl_buffer_destroy(xwl_window->buffer); -+ -+ xwl_screen->driver->create_window_buffer(xwl_window, pixmap); -+ -+ if (!xwl_window->buffer) { -+ ErrorF("failed to create buffer\n"); -+ return; -+ } -+ -+ wl_surface_attach(xwl_window->surface, xwl_window->buffer, 0, 0); -+ wl_surface_damage(xwl_window->surface, 0, 0, -+ pixmap->drawable.width, -+ pixmap->drawable.height); -+ wl_surface_commit(xwl_window->surface); -+ -+ callback = wl_display_sync(xwl_screen->display); -+ wl_callback_add_listener(callback, &free_pixmap_listener, pixmap); -+ pixmap->refcnt++; -+} -+ -+static Bool -+xwl_create_window(WindowPtr window) -+{ -+ ScreenPtr screen = window->drawable.pScreen; -+ struct xwl_screen *xwl_screen; -+ char buffer[32]; -+ int len, rc; -+ Atom name; -+ Bool ret; -+ -+ xwl_screen = xwl_screen_get(screen); -+ -+ screen->CreateWindow = xwl_screen->CreateWindow; -+ ret = (*screen->CreateWindow)(window); -+ xwl_screen->CreateWindow = screen->CreateWindow; -+ screen->CreateWindow = xwl_create_window; -+ -+ if (!(xwl_screen->flags & XWL_FLAGS_ROOTLESS) || -+ window->parent != NULL) -+ return ret; -+ -+ CompositeRedirectSubwindows(window, CompositeRedirectManual); -+ -+ return ret; -+} -+ -+static int -+xwl_destroy_window (WindowPtr window) -+{ -+ ScreenPtr screen = window->drawable.pScreen; -+ struct xwl_screen *xwl_screen; -+ Bool ret; -+ -+ if (window->parent == NULL) -+ CompositeUnRedirectSubwindows (window, CompositeRedirectManual); -+ -+ xwl_screen = xwl_screen_get(screen); -+ -+ screen->DestroyWindow = xwl_screen->DestroyWindow; -+ ret = (*screen->DestroyWindow)(window); -+ xwl_screen->DestroyWindow = screen->DestroyWindow; -+ screen->DestroyWindow = xwl_destroy_window; -+ -+ return ret; -+} -+ -+static void -+damage_report(DamagePtr pDamage, RegionPtr pRegion, void *data) -+{ -+ struct xwl_window *xwl_window = data; -+ struct xwl_screen *xwl_screen = xwl_window->xwl_screen; -+ -+ xorg_list_add(&xwl_window->link_damage, &xwl_screen->damage_window_list); -+} -+ -+static void -+damage_destroy(DamagePtr pDamage, void *data) -+{ -+} -+ -+static Bool -+xwl_realize_window(WindowPtr window) -+{ -+ ScreenPtr screen = window->drawable.pScreen; -+ struct xwl_screen *xwl_screen; -+ struct xwl_window *xwl_window; -+ Bool ret; -+ -+ xwl_screen = xwl_screen_get(screen); -+ -+ screen->RealizeWindow = xwl_screen->RealizeWindow; -+ ret = (*screen->RealizeWindow)(window); -+ xwl_screen->RealizeWindow = xwl_screen->RealizeWindow; -+ screen->RealizeWindow = xwl_realize_window; -+ -+ if (xwl_screen->flags & XWL_FLAGS_ROOTLESS) { -+ if (window->redirectDraw != RedirectDrawManual) -+ return ret; -+ } else { -+ if (window->parent) -+ return ret; -+ } -+ -+ xwl_window = calloc(sizeof *xwl_window, 1); -+ xwl_window->xwl_screen = xwl_screen; -+ xwl_window->window = window; -+ xwl_window->surface = -+ wl_compositor_create_surface(xwl_screen->compositor); -+ if (xwl_window->surface == NULL) { -+ ErrorF("wl_display_create_surface failed\n"); -+ return FALSE; -+ } -+ -+ if (xwl_screen->xorg_server) -+ xserver_set_window_id(xwl_screen->xorg_server, -+ xwl_window->surface, window->drawable.id); -+ -+ wl_surface_set_user_data(xwl_window->surface, xwl_window); -+ xwl_window_attach(xwl_window, (*screen->GetWindowPixmap)(window)); -+ -+ dixSetPrivate(&window->devPrivates, -+ &xwl_window_private_key, xwl_window); -+ -+ xwl_window->damage = -+ DamageCreate(damage_report, damage_destroy, DamageReportNonEmpty, -+ FALSE, screen, xwl_window); -+ DamageRegister(&window->drawable, xwl_window->damage); -+ DamageSetReportAfterOp(xwl_window->damage, TRUE); -+ -+ xorg_list_add(&xwl_window->link, &xwl_screen->window_list); -+ xorg_list_init(&xwl_window->link_damage); -+ -+ return ret; -+} -+ -+static Bool -+xwl_unrealize_window(WindowPtr window) -+{ -+ ScreenPtr screen = window->drawable.pScreen; -+ struct xwl_screen *xwl_screen; -+ struct xwl_window *xwl_window; -+ struct xwl_seat *xwl_seat; -+ Bool ret; -+ -+ xwl_screen = xwl_screen_get(screen); -+ -+ xorg_list_for_each_entry(xwl_seat, -+ &xwl_screen->seat_list, link) { -+ if (!xwl_seat->focus_window) -+ continue ; -+ if (xwl_seat->focus_window->window == window) { -+ xwl_seat->focus_window = NULL; -+ SetDeviceRedirectWindow(xwl_seat->pointer, PointerRootWin); -+ } -+ } -+ -+ screen->UnrealizeWindow = xwl_screen->UnrealizeWindow; -+ ret = (*screen->UnrealizeWindow)(window); -+ xwl_screen->UnrealizeWindow = screen->UnrealizeWindow; -+ screen->UnrealizeWindow = xwl_unrealize_window; -+ -+ xwl_window = -+ dixLookupPrivate(&window->devPrivates, &xwl_window_private_key); -+ if (!xwl_window) -+ return ret; -+ -+ if (xwl_window->buffer) -+ wl_buffer_destroy(xwl_window->buffer); -+ wl_surface_destroy(xwl_window->surface); -+ xorg_list_del(&xwl_window->link); -+ if (RegionNotEmpty(DamageRegion(xwl_window->damage))) -+ xorg_list_del(&xwl_window->link_damage); -+ DamageUnregister(&window->drawable, xwl_window->damage); -+ DamageDestroy(xwl_window->damage); -+ free(xwl_window); -+ dixSetPrivate(&window->devPrivates, &xwl_window_private_key, NULL); -+ -+ return ret; -+} -+ -+static void -+xwl_set_window_pixmap(WindowPtr window, PixmapPtr pixmap) -+{ -+ ScreenPtr screen = window->drawable.pScreen; -+ struct xwl_screen *xwl_screen; -+ struct xwl_window *xwl_window; -+ -+ xwl_screen = xwl_screen_get(screen); -+ -+ screen->SetWindowPixmap = xwl_screen->SetWindowPixmap; -+ (*screen->SetWindowPixmap)(window, pixmap); -+ xwl_screen->SetWindowPixmap = screen->SetWindowPixmap; -+ screen->SetWindowPixmap = xwl_set_window_pixmap; -+ -+ xwl_window = -+ dixLookupPrivate(&window->devPrivates, &xwl_window_private_key); -+ if (xwl_window) -+ xwl_window_attach(xwl_window, pixmap); -+} -+ -+static void -+xwl_move_window(WindowPtr window, int x, int y, -+ WindowPtr sibling, VTKind kind) -+{ -+ ScreenPtr screen = window->drawable.pScreen; -+ struct xwl_screen *xwl_screen; -+ struct xwl_window *xwl_window; -+ -+ xwl_screen = xwl_screen_get(screen); -+ -+ screen->MoveWindow = xwl_screen->MoveWindow; -+ (*screen->MoveWindow)(window, x, y, sibling, kind); -+ xwl_screen->MoveWindow = screen->MoveWindow; -+ screen->MoveWindow = xwl_move_window; -+ -+ xwl_window = -+ dixLookupPrivate(&window->devPrivates, &xwl_window_private_key); -+ if (xwl_window == NULL) -+ return; -+} -+ -+int -+xwl_screen_init_window(struct xwl_screen *xwl_screen, ScreenPtr screen) -+{ -+ if (!dixRegisterPrivateKey(&xwl_window_private_key, PRIVATE_WINDOW, 0)) -+ return BadAlloc; -+ -+ xwl_screen->CreateWindow = screen->CreateWindow; -+ screen->CreateWindow = xwl_create_window; -+ -+ xwl_screen->DestroyWindow = screen->DestroyWindow; -+ screen->DestroyWindow = xwl_destroy_window; -+ -+ xwl_screen->RealizeWindow = screen->RealizeWindow; -+ screen->RealizeWindow = xwl_realize_window; -+ -+ xwl_screen->UnrealizeWindow = screen->UnrealizeWindow; -+ screen->UnrealizeWindow = xwl_unrealize_window; -+ -+ xwl_screen->SetWindowPixmap = screen->SetWindowPixmap; -+ screen->SetWindowPixmap = xwl_set_window_pixmap; -+ -+ xwl_screen->MoveWindow = screen->MoveWindow; -+ screen->MoveWindow = xwl_move_window; -+ -+ return Success; -+} -diff --git a/hw/xfree86/xwayland/xwayland.c b/hw/xfree86/xwayland/xwayland.c -new file mode 100644 -index 0000000..f59bfe4 ---- /dev/null -+++ b/hw/xfree86/xwayland/xwayland.c -@@ -0,0 +1,392 @@ -+/* -+ * Copyright © 2008-2011 Kristian Høgsberg -+ * -+ * Permission to use, copy, modify, distribute, and sell this software -+ * and its documentation for any purpose is hereby granted without -+ * fee, provided that the above copyright notice appear in all copies -+ * and that both that copyright notice and this permission notice -+ * appear in supporting documentation, and that the name of the -+ * copyright holders not be used in advertising or publicity -+ * pertaining to distribution of the software without specific, -+ * written prior permission. The copyright holders make no -+ * representations about the suitability of this software for any -+ * purpose. It is provided "as is" without express or implied -+ * warranty. -+ * -+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS -+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY -+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN -+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING -+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -+ * SOFTWARE. -+ */ -+ -+#ifdef HAVE_XORG_CONFIG_H -+#include "xorg-config.h" -+#endif -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include "xwayland.h" -+#include "xwayland-private.h" -+#include "xserver-client-protocol.h" -+ -+/* -+ * TODO: -+ * - lose X kb focus when wayland surface loses it -+ * - active grabs, grab owner crack -+ */ -+ -+static DevPrivateKeyRec xwl_screen_private_key; -+static Atom xdnd_atom; -+ -+static void -+xserver_client(void *data, struct xserver *xserver, int fd) -+{ -+ AddClientOnOpenFD(fd); -+} -+ -+static void -+xserver_listen_socket(void *data, struct xserver *xserver, int fd) -+{ -+ ListenOnOpenFD(fd, TRUE); -+} -+ -+const struct xserver_listener xwl_server_listener = { -+ xserver_client, -+ xserver_listen_socket -+}; -+ -+static void -+xwl_input_delayed_init(void *data, struct wl_callback *callback, uint32_t time) -+{ -+ struct xwl_screen *xwl_screen = data; -+ -+ ErrorF("xwl_input_delayed_init\n"); -+ -+ wl_callback_destroy(callback); -+ xwl_input_init(xwl_screen); -+} -+ -+static const struct wl_callback_listener delayed_init_listner = { -+ xwl_input_delayed_init -+}; -+ -+static void -+registry_global(void *data, struct wl_registry *registry, uint32_t id, -+ const char *interface, uint32_t version) -+{ -+ struct xwl_screen *xwl_screen = data; -+ -+ if (strcmp (interface, "wl_compositor") == 0) { -+ xwl_screen->compositor = -+ wl_registry_bind(registry, id, &wl_compositor_interface, 1); -+ } else if (strcmp(interface, "wl_shm") == 0) { -+ xwl_screen->shm = -+ wl_registry_bind(registry, id, &wl_shm_interface, 1); -+ } -+} -+ -+static const struct wl_registry_listener registry_listener = { -+ registry_global, -+}; -+ -+static void -+wakeup_handler(pointer data, int err, pointer read_mask) -+{ -+ struct xwl_screen *xwl_screen = data; -+ int ret; -+ -+ if (err < 0) -+ return; -+ -+ if (!FD_ISSET(xwl_screen->wayland_fd, (fd_set *) read_mask)) -+ return; -+ -+ ret = wl_display_dispatch(xwl_screen->display); -+ if (ret == -1) -+ FatalError("failed to dispatch Wayland events: %s\n", strerror(errno)); -+} -+ -+static void -+block_handler(pointer data, struct timeval **tv, pointer read_mask) -+{ -+ struct xwl_screen *xwl_screen = data; -+ int ret; -+ -+ ret = wl_display_dispatch_pending(xwl_screen->display); -+ if (ret == -1) -+ FatalError("failed to dispatch Wayland events: %s\n", strerror(errno)); -+ -+ ret = wl_display_flush(xwl_screen->display); -+ if (ret == -1) -+ FatalError("failed to write to XWayland fd: %s\n", strerror(errno)); -+} -+ -+int -+xwl_screen_init(struct xwl_screen *xwl_screen, ScreenPtr screen) -+{ -+ struct wl_callback *callback; -+ -+ xwl_screen->screen = screen; -+ -+ if (!dixRegisterPrivateKey(&xwl_screen_private_key, PRIVATE_SCREEN, 0)) -+ return BadAlloc; -+ -+ dixSetPrivate(&screen->devPrivates, -+ &xwl_screen_private_key, xwl_screen); -+ -+ xwl_screen_init_window(xwl_screen, screen); -+ -+ xwl_screen_init_cursor(xwl_screen, screen); -+ -+ AddGeneralSocket(xwl_screen->wayland_fd); -+ RegisterBlockAndWakeupHandlers(block_handler, wakeup_handler, xwl_screen); -+ -+ callback = wl_display_sync(xwl_screen->display); -+ wl_callback_add_listener(callback, &delayed_init_listner, xwl_screen); -+ -+ return Success; -+} -+ -+struct xwl_screen * -+xwl_screen_get(ScreenPtr screen) -+{ -+ return dixLookupPrivate(&screen->devPrivates, &xwl_screen_private_key); -+} -+ -+static void -+xwayland_selection_callback(CallbackListPtr *callbacks, -+ pointer data, pointer args) -+{ -+ SelectionInfoRec *info = (SelectionInfoRec *) args; -+ Selection *selection = info->selection; -+ -+ switch (info->kind) { -+ case SelectionSetOwner: -+ if (selection->selection == xdnd_atom) { -+ if (selection->window != None) -+ ErrorF("client %p starts dnd\n", info->client); -+ else -+ ErrorF("client %p stops dnd\n", info->client); -+ } -+ break; -+ case SelectionWindowDestroy: -+ ErrorF("selection window destroy\n"); -+ break; -+ case SelectionClientClose: -+ ErrorF("selection client close\n"); -+ break; -+ } -+} -+ -+struct xwl_screen * -+xwl_screen_create(void) -+{ -+ struct xwl_screen *xwl_screen; -+ -+ xwl_screen = calloc(sizeof *xwl_screen, 1); -+ if (xwl_screen == NULL) { -+ ErrorF("calloc failed\n"); -+ return NULL; -+ } -+ -+ xwl_screen->display = wl_display_connect(NULL); -+ if (xwl_screen->display == NULL) { -+ ErrorF("wl_display_create failed\n"); -+ return NULL; -+ } -+ -+ return xwl_screen; -+} -+ -+Bool -+xwl_screen_pre_init(ScrnInfoPtr scrninfo, struct xwl_screen *xwl_screen, -+ uint32_t flags, struct xwl_driver *driver) -+{ -+ int ret; -+ -+ noScreenSaverExtension = TRUE; -+ -+ xdnd_atom = MakeAtom("XdndSelection", 13, 1); -+ if (!AddCallback(&SelectionCallback, -+ xwayland_selection_callback, xwl_screen)) { -+ return FALSE; -+ } -+ -+ xorg_list_init(&xwl_screen->seat_list); -+ xorg_list_init(&xwl_screen->damage_window_list); -+ xorg_list_init(&xwl_screen->window_list); -+ xorg_list_init(&xwl_screen->authenticate_client_list); -+ xwl_screen->scrninfo = scrninfo; -+ xwl_screen->driver = driver; -+ xwl_screen->flags = flags; -+ xwl_screen->wayland_fd = wl_display_get_fd(xwl_screen->display); -+ -+ if (xorgRootless) -+ xwl_screen->flags |= XWL_FLAGS_ROOTLESS; -+ -+ /* Set up listener so we'll catch all events. */ -+ xwl_screen->registry = wl_display_get_registry(xwl_screen->display); -+ wl_registry_add_listener(xwl_screen->registry, ®istry_listener, -+ xwl_screen); -+ ret = wl_display_roundtrip(xwl_screen->display); -+ if (ret == -1) { -+ xf86DrvMsg(scrninfo->scrnIndex, X_ERROR, -+ "failed to dispatch Wayland events: %s\n", strerror(errno)); -+ return FALSE; -+ } -+ -+#ifdef WITH_LIBDRM -+ if (xwl_screen->driver->use_drm && !xwl_drm_initialised(xwl_screen)) -+ if (xwl_drm_pre_init(xwl_screen) != Success) -+ return FALSE; -+#endif -+ -+ xwayland_screen_preinit_output(xwl_screen, scrninfo); -+ -+ return TRUE; -+} -+ -+int -+xwl_create_window_buffer_shm(struct xwl_window *xwl_window, -+ PixmapPtr pixmap, int fd) -+{ -+ struct wl_shm_pool *pool; -+ int size, stride; -+ -+ stride = pixmap->drawable.width * 4; -+ -+ size = pixmap->drawable.width * pixmap->drawable.height * 4; -+ pool = wl_shm_create_pool(xwl_window->xwl_screen->shm, fd, size); -+ xwl_window->buffer = wl_shm_pool_create_buffer(pool, 0, -+ pixmap->drawable.width, -+ pixmap->drawable.height, -+ stride, WL_SHM_FORMAT_ARGB8888); -+ wl_shm_pool_destroy(pool); -+ -+ return xwl_window->buffer ? Success : BadDrawable; -+} -+ -+void xwl_screen_close(struct xwl_screen *xwl_screen) -+{ -+ struct xwl_seat *xwl_seat, *itmp; -+ struct xwl_window *xwl_window, *wtmp; -+ -+ if (xwl_screen->registry) -+ wl_registry_destroy(xwl_screen->registry); -+ xwl_screen->registry = NULL; -+ -+ xorg_list_for_each_entry_safe(xwl_seat, itmp, -+ &xwl_screen->seat_list, link) { -+ wl_seat_destroy(xwl_seat->seat); -+ free(xwl_seat); -+ } -+ xorg_list_for_each_entry_safe(xwl_window, wtmp, -+ &xwl_screen->window_list, link) { -+ wl_buffer_destroy(xwl_window->buffer); -+ wl_surface_destroy(xwl_window->surface); -+ free(xwl_window); -+ } -+ -+ xorg_list_init(&xwl_screen->seat_list); -+ xorg_list_init(&xwl_screen->damage_window_list); -+ xorg_list_init(&xwl_screen->window_list); -+ xorg_list_init(&xwl_screen->authenticate_client_list); -+ -+ wl_display_roundtrip(xwl_screen->display); -+} -+ -+void xwl_screen_destroy(struct xwl_screen *xwl_screen) -+{ -+ if (xwl_screen->xwl_output) { -+ xf86OutputDestroy(xwl_screen->xwl_output->xf86output); -+ xf86CrtcDestroy(xwl_screen->xwl_output->xf86crtc); -+ } -+ -+ free(xwl_screen->xwl_output); -+ free(xwl_screen); -+} -+ -+/* DDX driver must call this after submitting the rendering */ -+void xwl_screen_post_damage(struct xwl_screen *xwl_screen) -+{ -+ struct xwl_window *xwl_window; -+ RegionPtr region; -+ BoxPtr box; -+ int count, i; -+ -+ xorg_list_for_each_entry(xwl_window, &xwl_screen->damage_window_list, -+ link_damage) { -+ -+ region = DamageRegion(xwl_window->damage); -+ count = RegionNumRects(region); -+ for (i = 0; i < count; i++) { -+ box = &RegionRects(region)[i]; -+ wl_surface_damage(xwl_window->surface, -+ box->x1, box->y1, -+ box->x2 - box->x1 + 1, -+ box->y2 - box->y1 + 1); -+ } -+ wl_surface_attach(xwl_window->surface, -+ xwl_window->buffer, -+ 0, 0); -+ wl_surface_commit(xwl_window->surface); -+ DamageEmpty(xwl_window->damage); -+ } -+ -+ xorg_list_init(&xwl_screen->damage_window_list); -+} -+ -+static pointer -+xwl_setup(pointer module, pointer opts, int *errmaj, int *errmin) -+{ -+ return xwl_input_setup(module, opts, errmaj, errmin); -+} -+ -+static void -+xwl_teardown(pointer p) -+{ -+ xwl_input_teardown(p); -+} -+ -+static XF86ModuleVersionInfo xwl_version_info = { -+ "xwayland", -+ MODULEVENDORSTRING, -+ MODINFOSTRING1, -+ MODINFOSTRING2, -+ XORG_VERSION_CURRENT, -+ 1, 0, 0, -+ ABI_CLASS_EXTENSION, -+ ABI_EXTENSION_VERSION, -+ MOD_CLASS_NONE, -+ { 0, 0, 0, 0 } -+}; -+ -+_X_EXPORT const XF86ModuleData xwaylandModuleData = { -+ &xwl_version_info, -+ &xwl_setup, -+ &xwl_teardown -+}; -+ -+int -+xwl_version(void) -+{ -+ return xwl_version_info.minorversion; -+} -diff --git a/hw/xfree86/xwayland/xwayland.h b/hw/xfree86/xwayland/xwayland.h -new file mode 100644 -index 0000000..f268366 ---- /dev/null -+++ b/hw/xfree86/xwayland/xwayland.h -@@ -0,0 +1,83 @@ -+/* -+ * Copyright © 2008 Kristian Høgsberg -+ * -+ * Permission to use, copy, modify, distribute, and sell this software -+ * and its documentation for any purpose is hereby granted without -+ * fee, provided that the above copyright notice appear in all copies -+ * and that both that copyright notice and this permission notice -+ * appear in supporting documentation, and that the name of the -+ * copyright holders not be used in advertising or publicity -+ * pertaining to distribution of the software without specific, -+ * written prior permission. The copyright holders make no -+ * representations about the suitability of this software for any -+ * purpose. It is provided "as is" without express or implied -+ * warranty. -+ * -+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS -+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY -+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN -+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING -+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -+ * SOFTWARE. -+ */ -+ -+#ifndef _XWAYLAND_H_ -+#define _XWAYLAND_H_ -+ -+#define XWL_VERSION 2 -+ -+struct xwl_window; -+struct xwl_screen; -+ -+struct xwl_driver { -+ int version; -+ int use_drm; -+ int (*create_window_buffer)(struct xwl_window *xwl_window, -+ PixmapPtr pixmap); -+}; -+ -+#define XWL_FLAGS_ROOTLESS 0x01 -+ -+extern _X_EXPORT int -+xwl_version(void); -+ -+extern _X_EXPORT struct xwl_screen * -+xwl_screen_create(void); -+ -+extern _X_EXPORT Bool -+xwl_screen_pre_init(ScrnInfoPtr scrninfo, struct xwl_screen *xwl_screen, -+ uint32_t flags, struct xwl_driver *driver); -+ -+extern _X_EXPORT int -+xwl_screen_init(struct xwl_screen *xwl_screen, ScreenPtr screen); -+ -+extern _X_EXPORT int -+xwl_drm_pre_init(struct xwl_screen *xwl_screen); -+ -+extern _X_EXPORT int -+xwl_screen_get_drm_fd(struct xwl_screen *xwl_screen); -+ -+extern _X_EXPORT void -+xwl_screen_close(struct xwl_screen *xwl_screen); -+ -+extern _X_EXPORT void -+xwl_screen_destroy(struct xwl_screen *xwl_screen); -+ -+extern _X_EXPORT void -+xwl_screen_post_damage(struct xwl_screen *xwl_screen); -+ -+extern _X_EXPORT int -+xwl_drm_authenticate(ClientPtr client, struct xwl_screen *xwl_screen, -+ uint32_t magic); -+ -+extern _X_EXPORT int -+xwl_create_window_buffer_drm(struct xwl_window *xwl_window, -+ PixmapPtr pixmap, uint32_t name); -+ -+extern _X_EXPORT int -+xwl_create_window_buffer_shm(struct xwl_window *xwl_window, -+ PixmapPtr pixmap, int fd); -+ -+#endif /* _XWAYLAND_H_ */ -diff --git a/include/xorg-server.h.in b/include/xorg-server.h.in -index 0c651bf..7f6eba2 100644 ---- a/include/xorg-server.h.in -+++ b/include/xorg-server.h.in -@@ -224,4 +224,7 @@ - /* Use XTrans FD passing support */ - #undef XTRANS_SEND_FDS - -+/* Building Xorg server. */ -+#undef XORG_WAYLAND -+ - #endif /* _XORG_SERVER_H_ */ --- -1.8.4.2 - diff --git a/SOURCES/0010-xwayland-Add-a-HW_WAYLAND-flag-to-let-drivers-explic.patch b/SOURCES/0010-xwayland-Add-a-HW_WAYLAND-flag-to-let-drivers-explic.patch deleted file mode 100644 index b3c155a..0000000 --- a/SOURCES/0010-xwayland-Add-a-HW_WAYLAND-flag-to-let-drivers-explic.patch +++ /dev/null @@ -1,49 +0,0 @@ -From b50ab974f639e02f878e608bf7f6097be7fbc60c Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= -Date: Wed, 21 Aug 2013 23:02:58 -0700 -Subject: [PATCH 10/38] xwayland: Add a HW_WAYLAND flag to let drivers - explicitly opt-in - ---- - hw/xfree86/common/xf86Init.c | 11 +++++++---- - hw/xfree86/common/xf86str.h | 1 + - 2 files changed, 8 insertions(+), 4 deletions(-) - -diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c -index 98adaab..2d3bb01 100644 ---- a/hw/xfree86/common/xf86Init.c -+++ b/hw/xfree86/common/xf86Init.c -@@ -547,11 +547,14 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv) - if (!(flags & HW_SKIP_CONSOLE)) - xorgHWOpenConsole = TRUE; - -- if (xorgWayland && -- (NEED_IO_ENABLED(flags) || !(flags & HW_SKIP_CONSOLE))) { -+ if (xorgWayland) { -+ if (flags != HW_WAYLAND) { -+ xf86DeleteDriver(i); -+ continue; -+ } - -- xf86DeleteDriver(i); -- continue; -+ want_hw_access = FALSE; -+ xorgHWOpenConsole = FALSE; - } - } - -diff --git a/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h -index 4c2d147..976fa30 100644 ---- a/hw/xfree86/common/xf86str.h -+++ b/hw/xfree86/common/xf86str.h -@@ -288,6 +288,7 @@ typedef struct { - #define HW_MMIO 2 - #define HW_SKIP_CONSOLE 4 - #define NEED_IO_ENABLED(x) (x & HW_IO) -+#define HW_WAYLAND 8 - - typedef CARD32 xorgHWFlags; - --- -1.8.4.2 - diff --git a/SOURCES/0011-xwayland-shm-don-t-create-alpha-buffers-if-the-windo.patch b/SOURCES/0011-xwayland-shm-don-t-create-alpha-buffers-if-the-windo.patch deleted file mode 100644 index 91869bc..0000000 --- a/SOURCES/0011-xwayland-shm-don-t-create-alpha-buffers-if-the-windo.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 341f2f5de09e59c3498d5f4e626b8fd86f4a0dcd Mon Sep 17 00:00:00 2001 -From: Giovanni Campagna -Date: Wed, 21 Aug 2013 09:53:25 +0200 -Subject: [PATCH 11/38] xwayland-shm: don't create alpha buffers if the window - doesn't have alpha - -If the window is using a 24 bit visual, we must request a buffer -format without alpha, or garbage is rendered. ---- - hw/xfree86/xwayland/xwayland.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/hw/xfree86/xwayland/xwayland.c b/hw/xfree86/xwayland/xwayland.c -index f59bfe4..880b7ec 100644 ---- a/hw/xfree86/xwayland/xwayland.c -+++ b/hw/xfree86/xwayland/xwayland.c -@@ -278,7 +278,10 @@ xwl_create_window_buffer_shm(struct xwl_window *xwl_window, - xwl_window->buffer = wl_shm_pool_create_buffer(pool, 0, - pixmap->drawable.width, - pixmap->drawable.height, -- stride, WL_SHM_FORMAT_ARGB8888); -+ stride, -+ pixmap->drawable.depth == 32 ? -+ WL_SHM_FORMAT_ARGB8888 : -+ WL_SHM_FORMAT_XRGB8888); - wl_shm_pool_destroy(pool); - - return xwl_window->buffer ? Success : BadDrawable; --- -1.8.4.2 - diff --git a/SOURCES/0012-xwayland-handle-global-object-destruction.patch b/SOURCES/0012-xwayland-handle-global-object-destruction.patch deleted file mode 100644 index e844d5a..0000000 --- a/SOURCES/0012-xwayland-handle-global-object-destruction.patch +++ /dev/null @@ -1,234 +0,0 @@ -From 1e37681072a69decce7441e762cb5f4ce1a80d73 Mon Sep 17 00:00:00 2001 -From: Giovanni Campagna -Date: Wed, 21 Aug 2013 09:53:26 +0200 -Subject: [PATCH 12/38] xwayland: handle global object destruction - -Certain global objects, such as outputs, can be destroyed during -the session. We must handle that and not crash. ---- - hw/xfree86/xwayland/xwayland-drm.c | 7 ++++++ - hw/xfree86/xwayland/xwayland-input.c | 7 ++++++ - hw/xfree86/xwayland/xwayland-output.c | 40 +++++++++++++++++++++++++++++++--- - hw/xfree86/xwayland/xwayland-private.h | 6 ++++- - hw/xfree86/xwayland/xwayland.c | 17 +++++++++++---- - 5 files changed, 69 insertions(+), 8 deletions(-) - -diff --git a/hw/xfree86/xwayland/xwayland-drm.c b/hw/xfree86/xwayland/xwayland-drm.c -index ce56e4c..6e4c778 100644 ---- a/hw/xfree86/xwayland/xwayland-drm.c -+++ b/hw/xfree86/xwayland/xwayland-drm.c -@@ -119,8 +119,15 @@ drm_handler(void *data, struct wl_registry *registry, uint32_t id, - } - } - -+static void -+global_remove(void *data, struct wl_registry *registry, uint32_t name) -+{ -+ /* Nothing to do here, wl_drm should not be removed */ -+} -+ - static const struct wl_registry_listener drm_listener = { - drm_handler, -+ global_remove - }; - - int -diff --git a/hw/xfree86/xwayland/xwayland-input.c b/hw/xfree86/xwayland/xwayland-input.c -index 2f8e0c7..d031b34 100644 ---- a/hw/xfree86/xwayland/xwayland-input.c -+++ b/hw/xfree86/xwayland/xwayland-input.c -@@ -597,8 +597,15 @@ input_handler(void *data, struct wl_registry *registry, uint32_t id, - } - } - -+static void -+global_remove(void *data, struct wl_registry *registry, uint32_t name) -+{ -+ /* FIXME */ -+} -+ - static const struct wl_registry_listener input_listener = { - input_handler, -+ global_remove, - }; - - void -diff --git a/hw/xfree86/xwayland/xwayland-output.c b/hw/xfree86/xwayland/xwayland-output.c -index 8f087f6..46238f4 100644 ---- a/hw/xfree86/xwayland/xwayland-output.c -+++ b/hw/xfree86/xwayland/xwayland-output.c -@@ -95,6 +95,14 @@ crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *data) - { - } - -+static void -+crtc_destroy(xf86CrtcPtr crtc) -+{ -+ /* Nothing to do here, we only destroy CRTCs when instructed to do -+ so by wl_output changes -+ */ -+} -+ - static const xf86CrtcFuncsRec crtc_funcs = { - .dpms = crtc_dpms, - .set_mode_major = crtc_set_mode_major, -@@ -106,7 +114,7 @@ static const xf86CrtcFuncsRec crtc_funcs = { - .shadow_create = crtc_shadow_create, - .shadow_allocate = crtc_shadow_allocate, - .shadow_destroy = crtc_shadow_destroy, -- .destroy = NULL, /* XXX */ -+ .destroy = crtc_destroy, - }; - - static void -@@ -246,7 +254,7 @@ display_handle_geometry(void *data, struct wl_output *wl_output, int x, int y, - xwl_output->x = x; - xwl_output->y = y; - -- xwl_screen->xwl_output = xwl_output; -+ xorg_list_append (&xwl_output->link, &xwl_screen->output_list); - } - - static void -@@ -277,13 +285,39 @@ global_handler(void *data, struct wl_registry *registry, uint32_t id, - xwl_output = xwl_output_create(xwl_screen); - xwl_output->output = wl_registry_bind(registry, id, - &wl_output_interface, 1); -+ xwl_output->name = id; - wl_output_add_listener(xwl_output->output, - &output_listener, xwl_output); - } - } - -+void -+xwl_output_remove(struct xwl_output *xwl_output) -+{ -+ xorg_list_del (&xwl_output->link); -+ xf86OutputDestroy (xwl_output->xf86output); -+ xf86CrtcDestroy (xwl_output->xf86crtc); -+ -+ wl_output_destroy (xwl_output->output); -+} -+ -+static void -+global_remove(void *data, struct wl_registry *registry, uint32_t name) -+{ -+ struct xwl_screen *xwl_screen = data; -+ struct xwl_output *xwl_output, *tmp; -+ -+ xorg_list_for_each_entry_safe (xwl_output, tmp, &xwl_screen->output_list, link) { -+ if (xwl_output->name == name) { -+ xwl_output_remove(xwl_output); -+ break; -+ } -+ } -+} -+ - static const struct wl_registry_listener global_listener = { - global_handler, -+ global_remove - }; - - void -@@ -299,7 +333,7 @@ xwayland_screen_preinit_output(struct xwl_screen *xwl_screen, ScrnInfoPtr scrnin - wl_registry_add_listener(xwl_screen->output_registry, &global_listener, - xwl_screen); - -- while (!xwl_screen->xwl_output) { -+ while (xwl_screen->output_list.next == &xwl_screen->output_list) { - ret = wl_display_roundtrip(xwl_screen->display); - if (ret == -1) - FatalError("failed to dispatch Wayland events: %s\n", strerror(errno)); -diff --git a/hw/xfree86/xwayland/xwayland-private.h b/hw/xfree86/xwayland/xwayland-private.h -index e427316..7005db2 100644 ---- a/hw/xfree86/xwayland/xwayland-private.h -+++ b/hw/xfree86/xwayland/xwayland-private.h -@@ -44,7 +44,6 @@ struct xwl_screen { - ScrnInfoPtr scrninfo; - int drm_fd; - int wayland_fd; -- struct xwl_output *xwl_output; - struct wl_display *display; - struct wl_registry *registry; - struct wl_registry *drm_registry; -@@ -58,6 +57,7 @@ struct xwl_screen { - uint32_t flags; - char *device_name; - uint32_t authenticated; -+ struct xorg_list output_list; - struct xorg_list seat_list; - struct xorg_list damage_window_list; - struct xorg_list window_list; -@@ -74,12 +74,14 @@ struct xwl_screen { - }; - - struct xwl_output { -+ struct xorg_list link; - struct wl_output *output; - struct xwl_screen *xwl_screen; - int32_t x, y, width, height; - xf86Monitor xf86monitor; - xf86OutputPtr xf86output; - xf86CrtcPtr xf86crtc; -+ int32_t name; - }; - - -@@ -127,6 +129,8 @@ Bool xwl_drm_initialised(struct xwl_screen *screen); - - void xwl_seat_set_cursor(struct xwl_seat *xwl_seat); - -+void xwl_output_remove(struct xwl_output *output); -+ - extern const struct xserver_listener xwl_server_listener; - - #endif /* _XWAYLAND_PRIVATE_H_ */ -diff --git a/hw/xfree86/xwayland/xwayland.c b/hw/xfree86/xwayland/xwayland.c -index 880b7ec..2047a85 100644 ---- a/hw/xfree86/xwayland/xwayland.c -+++ b/hw/xfree86/xwayland/xwayland.c -@@ -103,8 +103,15 @@ registry_global(void *data, struct wl_registry *registry, uint32_t id, - } - } - -+static void -+global_remove(void *data, struct wl_registry *registry, uint32_t name) -+{ -+ /* Nothing to do here, wl_compositor and wl_shm should not be removed */ -+} -+ - static const struct wl_registry_listener registry_listener = { - registry_global, -+ global_remove - }; - - static void -@@ -230,6 +237,7 @@ xwl_screen_pre_init(ScrnInfoPtr scrninfo, struct xwl_screen *xwl_screen, - return FALSE; - } - -+ xorg_list_init(&xwl_screen->output_list); - xorg_list_init(&xwl_screen->seat_list); - xorg_list_init(&xwl_screen->damage_window_list); - xorg_list_init(&xwl_screen->window_list); -@@ -318,12 +326,13 @@ void xwl_screen_close(struct xwl_screen *xwl_screen) - - void xwl_screen_destroy(struct xwl_screen *xwl_screen) - { -- if (xwl_screen->xwl_output) { -- xf86OutputDestroy(xwl_screen->xwl_output->xf86output); -- xf86CrtcDestroy(xwl_screen->xwl_output->xf86crtc); -+ struct xwl_output *xwl_output, *tmp; -+ -+ xorg_list_for_each_entry_safe (xwl_output, tmp, &xwl_screen->output_list, link) { -+ xwl_output_remove(xwl_output); -+ break; - } - -- free(xwl_screen->xwl_output); - free(xwl_screen); - } - --- -1.8.4.2 - diff --git a/SOURCES/0013-xwayland-add-support-for-multiple-outputs.patch b/SOURCES/0013-xwayland-add-support-for-multiple-outputs.patch deleted file mode 100644 index ba72b97..0000000 --- a/SOURCES/0013-xwayland-add-support-for-multiple-outputs.patch +++ /dev/null @@ -1,215 +0,0 @@ -From c22c7d4062b24f10a1d841629cc1e1822cad1f45 Mon Sep 17 00:00:00 2001 -From: Giovanni Campagna -Date: Thu, 22 Aug 2013 16:23:48 +0200 -Subject: [PATCH 13/38] xwayland: add support for multiple outputs - -Drop xf86InitialConfiguration, which just gets in the way -of the compositor doing its own output arrangement, and transform -wayland events into the appropriate low-level xf86 calls to -keep the screen size updated. - -Kristian: after the rebase it was crashing for me too, had to fix -the patch a bit. This one should work, and also gives sensible (though -not perfect) results for xrandr clients. -Tested with weston/x11 and mutter-wayland/kms. ---- - hw/xfree86/xwayland/xwayland-output.c | 112 ++++++++++++++++++++++++++++++--- - hw/xfree86/xwayland/xwayland-private.h | 2 + - 2 files changed, 105 insertions(+), 9 deletions(-) - -diff --git a/hw/xfree86/xwayland/xwayland-output.c b/hw/xfree86/xwayland/xwayland-output.c -index 46238f4..66c7d48 100644 ---- a/hw/xfree86/xwayland/xwayland-output.c -+++ b/hw/xfree86/xwayland/xwayland-output.c -@@ -36,6 +36,7 @@ - #include - #include - #include -+#include - - #include "xwayland.h" - #include "xwayland-private.h" -@@ -182,6 +183,10 @@ xwl_output_create(struct xwl_screen *xwl_screen) - struct xwl_output *xwl_output; - xf86OutputPtr xf86output; - xf86CrtcPtr xf86crtc; -+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(xwl_screen->scrninfo); -+ int crtcId, outputId; -+ static int nameId; -+ char *name; - - xwl_output = calloc(sizeof *xwl_output, 1); - if (xwl_output == NULL) { -@@ -189,19 +194,41 @@ xwl_output_create(struct xwl_screen *xwl_screen) - return NULL; - } - -+ nameId++; -+ if (asprintf(&name, "XWAYLAND-%d", nameId) < 0) { -+ ErrorF("create_output ENOMEM"); -+ free(xwl_output); -+ return NULL; -+ } -+ - xwl_output->xwl_screen = xwl_screen; - -+ xf86crtc = xf86CrtcCreate(xwl_screen->scrninfo, &crtc_funcs); -+ xf86crtc->enabled = TRUE; -+ xf86crtc->driver_private = xwl_output; -+ -+ for (crtcId = 0; crtcId < xf86_config->num_crtc; crtcId++) { -+ if (xf86_config->crtc[crtcId] == xf86crtc) -+ break; -+ } -+ - xf86output = xf86OutputCreate(xwl_screen->scrninfo, -- &output_funcs, "XWAYLAND-1"); -+ &output_funcs, name); - xf86output->driver_private = xwl_output; -- xf86output->possible_crtcs = 1; -- xf86output->possible_clones = 1; -+ xf86output->possible_crtcs = 1 << crtcId; - -- xf86crtc = xf86CrtcCreate(xwl_screen->scrninfo, &crtc_funcs); -- xf86crtc->driver_private = xwl_output; -+ for (outputId = 0; outputId < xf86_config->num_output; outputId++) { -+ if (xf86_config->output[outputId] == xf86output) -+ break; -+ } -+ -+ xf86output->possible_clones = 1 << outputId; - - xwl_output->xf86output = xf86output; - xwl_output->xf86crtc = xf86crtc; -+ xwl_output->xf86output->crtc = xf86crtc; -+ -+ free(name); - - return xwl_output; - } -@@ -219,6 +246,32 @@ static const xf86CrtcConfigFuncsRec config_funcs = { - resize - }; - -+static Rotation -+wl_transform_to_xrandr (enum wl_output_transform transform) -+{ -+ switch (transform) -+ { -+ case WL_OUTPUT_TRANSFORM_NORMAL: -+ return RR_Rotate_0; -+ case WL_OUTPUT_TRANSFORM_90: -+ return RR_Rotate_90; -+ case WL_OUTPUT_TRANSFORM_180: -+ return RR_Rotate_180; -+ case WL_OUTPUT_TRANSFORM_270: -+ return RR_Rotate_270; -+ case WL_OUTPUT_TRANSFORM_FLIPPED: -+ return RR_Reflect_X | RR_Rotate_0; -+ case WL_OUTPUT_TRANSFORM_FLIPPED_90: -+ return RR_Reflect_X | RR_Rotate_90; -+ case WL_OUTPUT_TRANSFORM_FLIPPED_180: -+ return RR_Reflect_X | RR_Rotate_180; -+ case WL_OUTPUT_TRANSFORM_FLIPPED_270: -+ return RR_Reflect_X | RR_Rotate_270; -+ } -+ -+ return RR_Rotate_0; -+} -+ - static void - display_handle_geometry(void *data, struct wl_output *wl_output, int x, int y, - int physical_width, int physical_height, int subpixel, -@@ -253,6 +306,7 @@ display_handle_geometry(void *data, struct wl_output *wl_output, int x, int y, - - xwl_output->x = x; - xwl_output->y = y; -+ xwl_output->rotation = wl_transform_to_xrandr (transform); - - xorg_list_append (&xwl_output->link, &xwl_screen->output_list); - } -@@ -262,11 +316,49 @@ display_handle_mode(void *data, struct wl_output *wl_output, uint32_t flags, - int width, int height, int refresh) - { - struct xwl_output *xwl_output = data; -+ struct xwl_screen *xwl_screen = xwl_output->xwl_screen; -+ ScreenPtr pScreen = xwl_screen->screen; -+ ScrnInfoPtr scrn = xwl_screen->scrninfo; -+ CARD16 width_mm, height_mm; -+ DisplayModePtr mode; -+ rrScrPrivPtr rp; - -- if (flags & WL_OUTPUT_MODE_CURRENT) { -- xwl_output->width = width; -- xwl_output->height = height; -+ if (!(flags & WL_OUTPUT_MODE_CURRENT)) -+ return; -+ -+ xwl_output->width = width; -+ xwl_output->height = height; -+ -+ if (xwl_output->x + xwl_output->width > scrn->virtualX || -+ xwl_output->y + xwl_output->height > scrn->virtualY) { -+ /* Fake a RandR request to resize the screen. It will bounce -+ back to our crtc_resize, which does nothing. -+ */ -+ /* Preupdate virtualX / virtualY, so that crtc_resize returns TRUE */ -+ scrn->virtualX = xwl_output->x + xwl_output->width; -+ scrn->virtualY = xwl_output->y + xwl_output->height; -+ -+ /* Ignore the compositor provided values for mm_width/mm_height, -+ as it doesn't make sense to sum the values of different outputs. -+ Just make the DPI 96 */ -+ width_mm = (scrn->virtualX / 96.0) * 25.4 + 0.5; -+ height_mm = (scrn->virtualY / 96.0) * 25.4 + 0.5; -+ -+ /* But! When the server starts, the RandR stuff is not initialized, -+ so we can't call rrGetScrPriv. We updated virtualX/Y anyway, let's -+ hope it's enough. -+ */ -+ if (xwl_screen->outputs_initialized) { -+ rp = rrGetScrPriv(pScreen); -+ if (rp->rrScreenSetSize) -+ rp->rrScreenSetSize(pScreen, scrn->virtualX, scrn->virtualY, width_mm, height_mm); -+ } - } -+ -+ xwl_output->xf86crtc->enabled = TRUE; -+ mode = xf86CVTMode(width, height, refresh, TRUE, FALSE); -+ xf86CrtcSetModeTransform(xwl_output->xf86crtc, mode, xwl_output->rotation, -+ NULL, xwl_output->x, xwl_output->y); - } - - static const struct wl_output_listener output_listener = { -@@ -339,5 +431,7 @@ xwayland_screen_preinit_output(struct xwl_screen *xwl_screen, ScrnInfoPtr scrnin - FatalError("failed to dispatch Wayland events: %s\n", strerror(errno)); - } - -- xf86InitialConfiguration(scrninfo, TRUE); -+ xwl_screen->outputs_initialized = TRUE; -+ -+ xf86SetScrnInfoModes(scrninfo); - } -diff --git a/hw/xfree86/xwayland/xwayland-private.h b/hw/xfree86/xwayland/xwayland-private.h -index 7005db2..b0b2201 100644 ---- a/hw/xfree86/xwayland/xwayland-private.h -+++ b/hw/xfree86/xwayland/xwayland-private.h -@@ -63,6 +63,7 @@ struct xwl_screen { - struct xorg_list window_list; - struct xorg_list authenticate_client_list; - uint32_t serial; -+ Bool outputs_initialized; - - CreateWindowProcPtr CreateWindow; - DestroyWindowProcPtr DestroyWindow; -@@ -82,6 +83,7 @@ struct xwl_output { - xf86OutputPtr xf86output; - xf86CrtcPtr xf86crtc; - int32_t name; -+ Rotation rotation; - }; - - --- -1.8.4.2 - diff --git a/SOURCES/0014-xwayland-Probe-outputs-on-preinit.patch b/SOURCES/0014-xwayland-Probe-outputs-on-preinit.patch deleted file mode 100644 index 4c168f6..0000000 --- a/SOURCES/0014-xwayland-Probe-outputs-on-preinit.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 21d9ed2b2ad45c7c363194a4c4fe2306bb26b130 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jonas=20=C3=85dahl?= -Date: Sun, 1 Sep 2013 23:14:43 +0200 -Subject: [PATCH 14/38] xwayland: Probe outputs on preinit -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -When running xwayland, calls to xf86SetDesiredModes() would fail due to -the probed modes list not being populated. This was previously done -indirectly by calling xf86InitialConfiguration() and now needs to be -done explicitly instead. - -Signed-off-by: Jonas Ådahl ---- - hw/xfree86/xwayland/xwayland-output.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/hw/xfree86/xwayland/xwayland-output.c b/hw/xfree86/xwayland/xwayland-output.c -index 66c7d48..691b5f0 100644 ---- a/hw/xfree86/xwayland/xwayland-output.c -+++ b/hw/xfree86/xwayland/xwayland-output.c -@@ -431,6 +431,8 @@ xwayland_screen_preinit_output(struct xwl_screen *xwl_screen, ScrnInfoPtr scrnin - FatalError("failed to dispatch Wayland events: %s\n", strerror(errno)); - } - -+ xf86ProbeOutputModes(scrninfo, 0, 0); -+ - xwl_screen->outputs_initialized = TRUE; - - xf86SetScrnInfoModes(scrninfo); --- -1.8.4.2 - diff --git a/SOURCES/0015-XFree86-Load-wlshm-driver-as-fallback-for-Wayland.patch b/SOURCES/0015-XFree86-Load-wlshm-driver-as-fallback-for-Wayland.patch deleted file mode 100644 index 3da2eb6..0000000 --- a/SOURCES/0015-XFree86-Load-wlshm-driver-as-fallback-for-Wayland.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 4e8eb23a03e14ce149e302e4dfc6e6af6fa61424 Mon Sep 17 00:00:00 2001 -From: Daniel Stone -Date: Fri, 16 Aug 2013 13:21:21 +0100 -Subject: [PATCH 15/38] XFree86: Load wlshm driver as fallback for Wayland - -Since fbdev or vesa are unlikely to be too useful there ... - -Signed-off-by: Daniel Stone ---- - hw/xfree86/common/xf86AutoConfig.c | 9 +++++++-- - hw/xfree86/common/xf86Config.c | 16 +++++++++++++--- - 2 files changed, 20 insertions(+), 5 deletions(-) - -diff --git a/hw/xfree86/common/xf86AutoConfig.c b/hw/xfree86/common/xf86AutoConfig.c -index af2b7f8..a3e1fa7 100644 ---- a/hw/xfree86/common/xf86AutoConfig.c -+++ b/hw/xfree86/common/xf86AutoConfig.c -@@ -275,10 +275,15 @@ listPossibleVideoDrivers(char *matches[], int nmatches) - #if !defined(sun) - /* Fallback to platform default frame buffer driver */ - if (i < (nmatches - 1)) { -+#ifdef XORG_WAYLAND -+ if (xorgWayland) -+ matches[i++] = xnfstrdup("wlshm"); -+ else -+#endif - #if !defined(__linux__) && defined(__sparc__) -- matches[i++] = xnfstrdup("wsfb"); -+ matches[i++] = xnfstrdup("wsfb"); - #else -- matches[i++] = xnfstrdup("fbdev"); -+ matches[i++] = xnfstrdup("fbdev"); - #endif - } - #endif /* !sun */ -diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c -index 3b0bb89..aebfc1b 100644 ---- a/hw/xfree86/common/xf86Config.c -+++ b/hw/xfree86/common/xf86Config.c -@@ -519,7 +519,11 @@ xf86InputDriverlistFromConfig(void) - static void - fixup_video_driver_list(char **drivers) - { -- static const char *fallback[4] = { "fbdev", "vesa", "wsfb", NULL }; -+ static const char *fallback_hw[4] = { "fbdev", "vesa", "wsfb", NULL }; -+#ifdef XORG_WAYLAND -+ static const char *fallback_wayland[2] = { "wlshm", NULL }; -+#endif -+ const char **fallbacks; - char **end, **drv; - char *x; - int i; -@@ -532,9 +536,15 @@ fixup_video_driver_list(char **drivers) - * for each of the fallback drivers, if we find it in the list, - * swap it with the last available non-fallback driver. - */ -- for (i = 0; fallback[i]; i++) { -+#ifdef XORG_WAYLAND -+ if (xorgWayland) -+ fallbacks = fallback_wl; -+ else -+#endif -+ fallbacks = fallback_hw; -+ for (i = 0; fallbacks[i]; i++) { - for (drv = drivers; drv != end; drv++) { -- if (strstr(*drv, fallback[i])) { -+ if (strstr(*drv, fallbacks[i])) { - x = *drv; - *drv = *end; - *end = x; --- -1.8.4.2 - diff --git a/SOURCES/0016-XWayland-Don-t-send-out-of-bounds-damage-co-ordinate.patch b/SOURCES/0016-XWayland-Don-t-send-out-of-bounds-damage-co-ordinate.patch deleted file mode 100644 index 026f22e..0000000 --- a/SOURCES/0016-XWayland-Don-t-send-out-of-bounds-damage-co-ordinate.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 6cfe64769a4f8e9646e4d6766ffdf689a0963ffd Mon Sep 17 00:00:00 2001 -From: Daniel Stone -Date: Wed, 7 Nov 2012 17:22:42 +1100 -Subject: [PATCH 16/38] XWayland: Don't send out-of-bounds damage co-ordinates - -Make sure we don't send damage regions larger than the buffer. - -Signed-off-by: Daniel Stone ---- - hw/xfree86/xwayland/xwayland.c | 5 ++--- - 1 file changed, 2 insertions(+), 3 deletions(-) - -diff --git a/hw/xfree86/xwayland/xwayland.c b/hw/xfree86/xwayland/xwayland.c -index 2047a85..6a515f5 100644 ---- a/hw/xfree86/xwayland/xwayland.c -+++ b/hw/xfree86/xwayland/xwayland.c -@@ -346,15 +346,14 @@ void xwl_screen_post_damage(struct xwl_screen *xwl_screen) - - xorg_list_for_each_entry(xwl_window, &xwl_screen->damage_window_list, - link_damage) { -- - region = DamageRegion(xwl_window->damage); - count = RegionNumRects(region); - for (i = 0; i < count; i++) { - box = &RegionRects(region)[i]; - wl_surface_damage(xwl_window->surface, - box->x1, box->y1, -- box->x2 - box->x1 + 1, -- box->y2 - box->y1 + 1); -+ box->x2 - box->x1, -+ box->y2 - box->y1); - } - wl_surface_attach(xwl_window->surface, - xwl_window->buffer, --- -1.8.4.2 - diff --git a/SOURCES/0017-xwayland-Introduce-an-auto-mode-for-enable-wayland.patch b/SOURCES/0017-xwayland-Introduce-an-auto-mode-for-enable-wayland.patch deleted file mode 100644 index b09a6ca..0000000 --- a/SOURCES/0017-xwayland-Introduce-an-auto-mode-for-enable-wayland.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 70bf99f09cac43a9016039f762e5186c6ca2b6c6 Mon Sep 17 00:00:00 2001 -From: Daniel Stone -Date: Tue, 16 Oct 2012 17:14:01 +1100 -Subject: [PATCH 17/38] xwayland: Introduce an auto mode for --enable-wayland - -Signed-off-by: Daniel Stone ---- - configure.ac | 10 +++++++--- - 1 file changed, 7 insertions(+), 3 deletions(-) - -diff --git a/configure.ac b/configure.ac -index 8078846..c60fd44 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -629,7 +629,7 @@ AC_ARG_ENABLE(clientids, AS_HELP_STRING([--disable-clientids], [Build Xorg - AC_ARG_ENABLE(pciaccess, AS_HELP_STRING([--enable-pciaccess], [Build Xorg with pciaccess library (default: enabled)]), [PCI=$enableval], [PCI=yes]) - AC_ARG_ENABLE(linux_acpi, AC_HELP_STRING([--disable-linux-acpi], [Disable building ACPI support on Linux (if available).]), [enable_linux_acpi=$enableval], [enable_linux_acpi=yes]) - AC_ARG_ENABLE(linux_apm, AC_HELP_STRING([--disable-linux-apm], [Disable building APM support on Linux (if available).]), [enable_linux_apm=$enableval], [enable_linux_apm=yes]) --AC_ARG_ENABLE(wayland, AS_HELP_STRING([--disable-wayland], [Build Wayland extension (default: enabled)]), [WAYLAND=$enableval], [WAYLAND=yes]) -+AC_ARG_ENABLE(wayland, AS_HELP_STRING([--disable-wayland], [Build Wayland extension (default: auto)]), [WAYLAND=$enableval], [WAYLAND=auto]) - - dnl DDXes. - AC_ARG_ENABLE(xorg, AS_HELP_STRING([--enable-xorg], [Build Xorg server (default: auto)]), [XORG=$enableval], [XORG=auto]) -@@ -1020,12 +1020,16 @@ if test "x$MITSHM" = xauto; then - MITSHM="$ac_cv_sysv_ipc" - fi - --AM_CONDITIONAL(WAYLAND, [test "x$WAYLAND" = xyes]) -+WAYLAND_MODULES="wayland-client libdrm" -+if test "x$WAYLAND" = xauto; then -+ PKG_CHECK_MODULES(XWAYLAND, $WAYLAND_MODULES, [WAYLAND=yes], [WAYLAND=no]) -+fi - if test "x$WAYLAND" = xyes; then -+ PKG_CHECK_MODULES(XWAYLAND, $WAYLAND_MODULES) - AC_DEFINE(XORG_WAYLAND, 1, [Support wayland mode]) -- REQUIRED_MODULES="$REQUIRED_MODULES wayland-client" - WAYLAND_SCANNER_RULES(['$(top_srcdir)/hw/xfree86/xwayland']) - fi -+AM_CONDITIONAL(WAYLAND, [test "x$WAYLAND" = xyes]) - - AM_CONDITIONAL(MITSHM, [test "x$MITSHM" = xyes]) - if test "x$MITSHM" = xyes; then --- -1.8.4.2 - diff --git a/SOURCES/0018-XWayland-Don-t-hardcode-DRM-libs-and-lwayland-client.patch b/SOURCES/0018-XWayland-Don-t-hardcode-DRM-libs-and-lwayland-client.patch deleted file mode 100644 index 7453d09..0000000 --- a/SOURCES/0018-XWayland-Don-t-hardcode-DRM-libs-and-lwayland-client.patch +++ /dev/null @@ -1,46 +0,0 @@ -From c7d56befef2111c82e6720643824b9a46ae36670 Mon Sep 17 00:00:00 2001 -From: Daniel Stone -Date: Wed, 7 Nov 2012 17:15:13 +1100 -Subject: [PATCH 18/38] XWayland: Don't hardcode DRM libs and -lwayland-client - -Take -lwayland-client from configure.ac, and only use DRM if we've -actually asked for it. - -Signed-off-by: Daniel Stone ---- - hw/xfree86/xwayland/Makefile.am | 8 +++++--- - 1 file changed, 5 insertions(+), 3 deletions(-) - -diff --git a/hw/xfree86/xwayland/Makefile.am b/hw/xfree86/xwayland/Makefile.am -index b739145..22ab154 100644 ---- a/hw/xfree86/xwayland/Makefile.am -+++ b/hw/xfree86/xwayland/Makefile.am -@@ -7,13 +7,13 @@ AM_CPPFLAGS = \ - -I$(srcdir)/../modes - - libxwayland_la_LTLIBRARIES = libxwayland.la --libxwayland_la_CFLAGS = \ -+AM_CFLAGS = \ - -DHAVE_XORG_CONFIG_H \ -- @DIX_CFLAGS@ @XORG_CFLAGS@ @LIBDRM_CFLAGS@ \ -+ @DIX_CFLAGS@ @XORG_CFLAGS@ @XWAYLAND_CFLAGS@ \ - -I$(top_srcdir)/hw/xfree86/common \ - -I$(top_srcdir)/hw/xfree86/os-support/bus - --libxwayland_la_LDFLAGS = -module -avoid-version @LIBDRM_LIBS@ -lwayland-client -+libxwayland_la_LDFLAGS = -module -avoid-version @XWAYLAND_LIBS@ - libxwayland_ladir = $(moduledir)/extensions - libxwayland_la_SOURCES = \ - xwayland.c \ -@@ -28,6 +28,8 @@ libxwayland_la_SOURCES = \ - xserver-protocol.c - - if DRM -+AM_CFLAGS += @LIBDRM_CFLAGS@ -+libxwayland_la_LDFLAGS += @LIBDRM_LIBS@ - libxwayland_la_SOURCES += xwayland-drm.c - endif - --- -1.8.4.2 - diff --git a/SOURCES/0019-XWayland-Support-16bpp-X-surfaces-in-DRM-SHM.patch b/SOURCES/0019-XWayland-Support-16bpp-X-surfaces-in-DRM-SHM.patch deleted file mode 100644 index b96174a..0000000 --- a/SOURCES/0019-XWayland-Support-16bpp-X-surfaces-in-DRM-SHM.patch +++ /dev/null @@ -1,97 +0,0 @@ -From c6da90b55546748d3f4a2f536f94751da3abcd77 Mon Sep 17 00:00:00 2001 -From: Daniel Stone -Date: Fri, 16 Aug 2013 13:51:08 +0100 -Subject: [PATCH 19/38] XWayland: Support 16bpp X surfaces in DRM/SHM - -Properly look at the window's visual to determine which format we should -use for allocation. - -Signed-off-by: Daniel Stone ---- - hw/xfree86/xwayland/xwayland-drm.c | 12 ++++++++++-- - hw/xfree86/xwayland/xwayland.c | 38 +++++++++++++++++++++++++++++++------- - 2 files changed, 41 insertions(+), 9 deletions(-) - -diff --git a/hw/xfree86/xwayland/xwayland-drm.c b/hw/xfree86/xwayland/xwayland-drm.c -index 6e4c778..5250857 100644 ---- a/hw/xfree86/xwayland/xwayland-drm.c -+++ b/hw/xfree86/xwayland/xwayland-drm.c -@@ -225,10 +225,18 @@ xwl_create_window_buffer_drm(struct xwl_window *xwl_window, - if (screen->visuals[i].vid == visual) - break; - -- if (screen->visuals[i].nplanes == 32) -+ switch (screen->visuals[i].nplanes) { -+ case 32: - format = WL_DRM_FORMAT_ARGB8888; -- else -+ break; -+ case 24: -+ default: - format = WL_DRM_FORMAT_XRGB8888; -+ break; -+ case 16: -+ format = WL_DRM_FORMAT_RGB565; -+ break; -+ } - - xwl_window->buffer = - wl_drm_create_buffer(xwl_window->xwl_screen->drm, -diff --git a/hw/xfree86/xwayland/xwayland.c b/hw/xfree86/xwayland/xwayland.c -index 6a515f5..36f7cbf 100644 ---- a/hw/xfree86/xwayland/xwayland.c -+++ b/hw/xfree86/xwayland/xwayland.c -@@ -277,19 +277,43 @@ xwl_create_window_buffer_shm(struct xwl_window *xwl_window, - PixmapPtr pixmap, int fd) - { - struct wl_shm_pool *pool; -- int size, stride; -+ WindowPtr window = xwl_window->window; -+ ScreenPtr screen = window->drawable.pScreen; -+ VisualID visual = wVisual(window); -+ uint32_t format; -+ int size, stride, bpp, i; -+ -+ for (i = 0; i < screen->numVisuals; i++) -+ if (screen->visuals[i].vid == visual) -+ break; -+ -+ switch (screen->visuals[i].nplanes) { -+ case 32: -+ format = WL_SHM_FORMAT_ARGB8888; -+ bpp = 4; -+ break; -+ case 24: -+ default: -+ format = WL_SHM_FORMAT_XRGB8888; -+ bpp = 4; -+ break; -+#ifdef WL_SHM_FORMAT_RGB565 -+ case 16: -+ /* XXX: Check run-time protocol version too */ -+ format = WL_SHM_FORMAT_RGB565; -+ bpp = 2; -+ break; -+#endif -+ } - -- stride = pixmap->drawable.width * 4; -+ stride = pixmap->drawable.width * bpp; -+ size = stride * pixmap->drawable.height; - -- size = pixmap->drawable.width * pixmap->drawable.height * 4; - pool = wl_shm_create_pool(xwl_window->xwl_screen->shm, fd, size); - xwl_window->buffer = wl_shm_pool_create_buffer(pool, 0, - pixmap->drawable.width, - pixmap->drawable.height, -- stride, -- pixmap->drawable.depth == 32 ? -- WL_SHM_FORMAT_ARGB8888 : -- WL_SHM_FORMAT_XRGB8888); -+ stride, format); - wl_shm_pool_destroy(pool); - - return xwl_window->buffer ? Success : BadDrawable; --- -1.8.4.2 - diff --git a/SOURCES/0020-xwayland-Remove-Xdnd-selection-watching-code.patch b/SOURCES/0020-xwayland-Remove-Xdnd-selection-watching-code.patch deleted file mode 100644 index 018cc5e..0000000 --- a/SOURCES/0020-xwayland-Remove-Xdnd-selection-watching-code.patch +++ /dev/null @@ -1,70 +0,0 @@ -From caf0c07852843440139fcd23e621fe2e9522775f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= -Date: Wed, 11 Sep 2013 11:15:18 -0700 -Subject: [PATCH 20/38] xwayland: Remove Xdnd selection watching code - -We don't need this in the server, the wm can manage dnd proxying. ---- - hw/xfree86/xwayland/xwayland.c | 32 -------------------------------- - 1 file changed, 32 deletions(-) - -diff --git a/hw/xfree86/xwayland/xwayland.c b/hw/xfree86/xwayland/xwayland.c -index 36f7cbf..e8c58fd 100644 ---- a/hw/xfree86/xwayland/xwayland.c -+++ b/hw/xfree86/xwayland/xwayland.c -@@ -54,7 +54,6 @@ - */ - - static DevPrivateKeyRec xwl_screen_private_key; --static Atom xdnd_atom; - - static void - xserver_client(void *data, struct xserver *xserver, int fd) -@@ -178,31 +177,6 @@ xwl_screen_get(ScreenPtr screen) - return dixLookupPrivate(&screen->devPrivates, &xwl_screen_private_key); - } - --static void --xwayland_selection_callback(CallbackListPtr *callbacks, -- pointer data, pointer args) --{ -- SelectionInfoRec *info = (SelectionInfoRec *) args; -- Selection *selection = info->selection; -- -- switch (info->kind) { -- case SelectionSetOwner: -- if (selection->selection == xdnd_atom) { -- if (selection->window != None) -- ErrorF("client %p starts dnd\n", info->client); -- else -- ErrorF("client %p stops dnd\n", info->client); -- } -- break; -- case SelectionWindowDestroy: -- ErrorF("selection window destroy\n"); -- break; -- case SelectionClientClose: -- ErrorF("selection client close\n"); -- break; -- } --} -- - struct xwl_screen * - xwl_screen_create(void) - { -@@ -231,12 +205,6 @@ xwl_screen_pre_init(ScrnInfoPtr scrninfo, struct xwl_screen *xwl_screen, - - noScreenSaverExtension = TRUE; - -- xdnd_atom = MakeAtom("XdndSelection", 13, 1); -- if (!AddCallback(&SelectionCallback, -- xwayland_selection_callback, xwl_screen)) { -- return FALSE; -- } -- - xorg_list_init(&xwl_screen->output_list); - xorg_list_init(&xwl_screen->seat_list); - xorg_list_init(&xwl_screen->damage_window_list); --- -1.8.4.2 - diff --git a/SOURCES/0021-xf86Init-trim-out-non-wayland-capable-servers-from-d.patch b/SOURCES/0021-xf86Init-trim-out-non-wayland-capable-servers-from-d.patch deleted file mode 100644 index b9a1e21..0000000 --- a/SOURCES/0021-xf86Init-trim-out-non-wayland-capable-servers-from-d.patch +++ /dev/null @@ -1,34 +0,0 @@ -From d40219f38a33845d8a9850de47ff5d458a3d8209 Mon Sep 17 00:00:00 2001 -From: Ray Strode -Date: Fri, 13 Sep 2013 17:17:16 -0400 -Subject: [PATCH 21/38] xf86Init: trim out non-wayland capable servers from - drive list - -Otherwise they'll cause the server to crash when run in wayland mode. ---- - hw/xfree86/common/xf86Init.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c -index 2d3bb01..6282252 100644 ---- a/hw/xfree86/common/xf86Init.c -+++ b/hw/xfree86/common/xf86Init.c -@@ -558,6 +558,15 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv) - } - } - -+ for (i = 0; i < xf86NumDrivers; i++) { -+ if (xf86DriverList[i] == NULL) { -+ for (j = i; j < xf86NumDrivers; j++) { -+ xf86DriverList[j] = xf86DriverList[j + 1]; -+ } -+ xf86NumDrivers--; -+ } -+ } -+ - if (xorgHWOpenConsole) - xf86OpenConsole(); - else --- -1.8.4.2 - diff --git a/SOURCES/0022-Add-XORG_WAYLAND-symbol-to-xorg-config.h.in.patch b/SOURCES/0022-Add-XORG_WAYLAND-symbol-to-xorg-config.h.in.patch deleted file mode 100644 index 6b522ef..0000000 --- a/SOURCES/0022-Add-XORG_WAYLAND-symbol-to-xorg-config.h.in.patch +++ /dev/null @@ -1,29 +0,0 @@ -From a575da27027b91e44df75318f3b570bf8291fe7c Mon Sep 17 00:00:00 2001 -From: Giovanni Campagna -Date: Fri, 13 Sep 2013 15:52:29 +0200 -Subject: [PATCH 22/38] Add XORG_WAYLAND symbol to xorg-config.h.in - -We manually duplicate symbols that we want in both xorg-server.h and -xorg-config.h. XORG_WAYLAND is one such symbol, but it was missing from -xorg-config.h.in. ---- - include/xorg-config.h.in | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/include/xorg-config.h.in b/include/xorg-config.h.in -index 487d7ad..8aec1d8 100644 ---- a/include/xorg-config.h.in -+++ b/include/xorg-config.h.in -@@ -142,7 +142,7 @@ - /* Define to 1 if you have the `seteuid' function. */ - #undef HAVE_SETEUID - --/* Support APM/ACPI power management in the server */ --#undef XF86PM -+/* Building Xorg server. */ -+#undef XORG_WAYLAND - - #endif /* _XORG_CONFIG_H_ */ --- -1.8.4.2 - diff --git a/SOURCES/0023-Fix-fallback-loading-of-the-wayland-driver.patch b/SOURCES/0023-Fix-fallback-loading-of-the-wayland-driver.patch deleted file mode 100644 index a64ad92..0000000 --- a/SOURCES/0023-Fix-fallback-loading-of-the-wayland-driver.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 7e1b4d2a4853e7a6c31e0ab0c1fe3405ec61c914 Mon Sep 17 00:00:00 2001 -From: Giovanni Campagna -Date: Fri, 13 Sep 2013 15:52:30 +0200 -Subject: [PATCH 23/38] Fix fallback loading of the wayland driver - -Fix the array name to actually compile, and fix the driver name -with the new upstream. ---- - hw/xfree86/common/xf86AutoConfig.c | 2 +- - hw/xfree86/common/xf86Config.c | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/hw/xfree86/common/xf86AutoConfig.c b/hw/xfree86/common/xf86AutoConfig.c -index a3e1fa7..51a7960 100644 ---- a/hw/xfree86/common/xf86AutoConfig.c -+++ b/hw/xfree86/common/xf86AutoConfig.c -@@ -277,7 +277,7 @@ listPossibleVideoDrivers(char *matches[], int nmatches) - if (i < (nmatches - 1)) { - #ifdef XORG_WAYLAND - if (xorgWayland) -- matches[i++] = xnfstrdup("wlshm"); -+ matches[i++] = xnfstrdup("wayland"); - else - #endif - #if !defined(__linux__) && defined(__sparc__) -diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c -index aebfc1b..66f98b2 100644 ---- a/hw/xfree86/common/xf86Config.c -+++ b/hw/xfree86/common/xf86Config.c -@@ -521,7 +521,7 @@ fixup_video_driver_list(char **drivers) - { - static const char *fallback_hw[4] = { "fbdev", "vesa", "wsfb", NULL }; - #ifdef XORG_WAYLAND -- static const char *fallback_wayland[2] = { "wlshm", NULL }; -+ static const char *fallback_wl[2] = { "wayland", NULL }; - #endif - const char **fallbacks; - char **end, **drv; --- -1.8.4.2 - diff --git a/SOURCES/0024-xwayland-Don-t-include-xorg-server.h.patch b/SOURCES/0024-xwayland-Don-t-include-xorg-server.h.patch deleted file mode 100644 index eb23738..0000000 --- a/SOURCES/0024-xwayland-Don-t-include-xorg-server.h.patch +++ /dev/null @@ -1,64 +0,0 @@ -From b468fcfc1733feb014ef976fef29939f9f1dfc98 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= -Date: Fri, 13 Sep 2013 14:52:13 -0700 -Subject: [PATCH 24/38] xwayland: Don't include xorg-server.h - -xorg-config.h now has the XORG_WAYLAND define. ---- - hw/xfree86/xwayland/xwayland-cursor.c | 1 - - hw/xfree86/xwayland/xwayland-output.c | 1 - - hw/xfree86/xwayland/xwayland-window.c | 1 - - hw/xfree86/xwayland/xwayland.c | 1 - - 4 files changed, 4 deletions(-) - -diff --git a/hw/xfree86/xwayland/xwayland-cursor.c b/hw/xfree86/xwayland/xwayland-cursor.c -index f8860bd..1cd6457 100644 ---- a/hw/xfree86/xwayland/xwayland-cursor.c -+++ b/hw/xfree86/xwayland/xwayland-cursor.c -@@ -32,7 +32,6 @@ - #include - #include - --#include - #include - #include - #include -diff --git a/hw/xfree86/xwayland/xwayland-output.c b/hw/xfree86/xwayland/xwayland-output.c -index 691b5f0..7004b9b 100644 ---- a/hw/xfree86/xwayland/xwayland-output.c -+++ b/hw/xfree86/xwayland/xwayland-output.c -@@ -32,7 +32,6 @@ - #include - #include - --#include - #include - #include - #include -diff --git a/hw/xfree86/xwayland/xwayland-window.c b/hw/xfree86/xwayland/xwayland-window.c -index d56e0d0..88f57ce 100644 ---- a/hw/xfree86/xwayland/xwayland-window.c -+++ b/hw/xfree86/xwayland/xwayland-window.c -@@ -33,7 +33,6 @@ - #include - #include - --#include - #include - #include - #include -diff --git a/hw/xfree86/xwayland/xwayland.c b/hw/xfree86/xwayland/xwayland.c -index e8c58fd..c70a52d 100644 ---- a/hw/xfree86/xwayland/xwayland.c -+++ b/hw/xfree86/xwayland/xwayland.c -@@ -34,7 +34,6 @@ - #include - #include - --#include - #include - - #include --- -1.8.4.2 - diff --git a/SOURCES/0025-os-Don-t-include-xorg-server.h.patch b/SOURCES/0025-os-Don-t-include-xorg-server.h.patch deleted file mode 100644 index 5fe6791..0000000 --- a/SOURCES/0025-os-Don-t-include-xorg-server.h.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 6e6f302a5bfa72b195021c0053aab3286d12f87a Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= -Date: Fri, 13 Sep 2013 14:53:16 -0700 -Subject: [PATCH 25/38] os: Don't include xorg-server.h - -Just always compile in ListenOnOpenFD and AddClientOnOpenFD, they -don't depend on anything from Quartz or Wayland. ---- - os/connection.c | 4 ---- - 1 file changed, 4 deletions(-) - -diff --git a/os/connection.c b/os/connection.c -index a95e7da..0a858b7 100644 ---- a/os/connection.c -+++ b/os/connection.c -@@ -64,7 +64,6 @@ SOFTWARE. - #include - #endif - --#include - #ifdef WIN32 - #include - #endif -@@ -1259,7 +1258,6 @@ MakeClientGrabPervious(ClientPtr client) - } - } - --#if defined(XQUARTZ) || defined(XORG_WAYLAND) - /* Add a fd (from launchd) to our listeners */ - void - ListenOnOpenFD(int fd, int noxauth) -@@ -1334,5 +1332,3 @@ AddClientOnOpenFD(int fd) - return; - } - } -- --#endif --- -1.8.4.2 - diff --git a/SOURCES/0026-os-Also-define-ListenOnOpenFD-and-AddClientOnOpenFD-.patch b/SOURCES/0026-os-Also-define-ListenOnOpenFD-and-AddClientOnOpenFD-.patch deleted file mode 100644 index b986bc7..0000000 --- a/SOURCES/0026-os-Also-define-ListenOnOpenFD-and-AddClientOnOpenFD-.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 7f1df88e3c86e900fa22075aed41c5c3b3f36b75 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= -Date: Fri, 13 Sep 2013 15:16:31 -0700 -Subject: [PATCH 26/38] os: Also define ListenOnOpenFD and AddClientOnOpenFD - unconditionally - -Remove the #ifdef from the header file as well. ---- - include/os.h | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/include/os.h b/include/os.h -index c36d09a..8deb413 100644 ---- a/include/os.h -+++ b/include/os.h -@@ -166,10 +166,9 @@ extern _X_EXPORT void MakeClientGrabImpervious(ClientPtr /*client */ ); - - extern _X_EXPORT void MakeClientGrabPervious(ClientPtr /*client */ ); - --#if defined(XQUARTZ) || defined(XORG_WAYLAND) - extern _X_EXPORT void ListenOnOpenFD(int /* fd */ , int /* noxauth */ ); -+ - extern _X_EXPORT void AddClientOnOpenFD(int /* fd */ ); --#endif - - extern _X_EXPORT CARD32 GetTimeInMillis(void); - extern _X_EXPORT CARD64 GetTimeInMicros(void); --- -1.8.4.2 - diff --git a/SOURCES/0027-xwayland-Remove-unused-variables.patch b/SOURCES/0027-xwayland-Remove-unused-variables.patch deleted file mode 100644 index 19fea33..0000000 --- a/SOURCES/0027-xwayland-Remove-unused-variables.patch +++ /dev/null @@ -1,26 +0,0 @@ -From b2520bd345339bbf74ab0ee4e2194206f80f4d2f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= -Date: Mon, 16 Sep 2013 11:51:57 -0700 -Subject: [PATCH 27/38] xwayland: Remove unused variables - ---- - hw/xfree86/xwayland/xwayland-window.c | 3 --- - 1 file changed, 3 deletions(-) - -diff --git a/hw/xfree86/xwayland/xwayland-window.c b/hw/xfree86/xwayland/xwayland-window.c -index 88f57ce..20db80c 100644 ---- a/hw/xfree86/xwayland/xwayland-window.c -+++ b/hw/xfree86/xwayland/xwayland-window.c -@@ -92,9 +92,6 @@ xwl_create_window(WindowPtr window) - { - ScreenPtr screen = window->drawable.pScreen; - struct xwl_screen *xwl_screen; -- char buffer[32]; -- int len, rc; -- Atom name; - Bool ret; - - xwl_screen = xwl_screen_get(screen); --- -1.8.4.2 - diff --git a/SOURCES/0028-xwayland-Use-a-per-screen-private-key-for-cursor-pri.patch b/SOURCES/0028-xwayland-Use-a-per-screen-private-key-for-cursor-pri.patch deleted file mode 100644 index 3b2dff7..0000000 --- a/SOURCES/0028-xwayland-Use-a-per-screen-private-key-for-cursor-pri.patch +++ /dev/null @@ -1,85 +0,0 @@ -From 2890dca70f04c3961578062207c5354d48730da3 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= -Date: Mon, 16 Sep 2013 12:05:19 -0700 -Subject: [PATCH 28/38] xwayland: Use a per-screen private key for cursor - privates - -The cursor is a per-display object, so we need to set private data on it -using a per-screen private key to avoid stepping on privates from other -screens. ---- - hw/xfree86/xwayland/xwayland-cursor.c | 15 +++++++++------ - hw/xfree86/xwayland/xwayland-private.h | 2 ++ - 2 files changed, 11 insertions(+), 6 deletions(-) - -diff --git a/hw/xfree86/xwayland/xwayland-cursor.c b/hw/xfree86/xwayland/xwayland-cursor.c -index 1cd6457..2cdd248 100644 ---- a/hw/xfree86/xwayland/xwayland-cursor.c -+++ b/hw/xfree86/xwayland/xwayland-cursor.c -@@ -40,8 +40,6 @@ - #include "xwayland-private.h" - #include "xserver-client-protocol.h" - --static DevPrivateKeyRec xwl_cursor_private_key; -- - static void - expand_source_and_mask(CursorPtr cursor, void *data) - { -@@ -129,7 +127,8 @@ xwl_realize_cursor(DeviceIntPtr device, ScreenPtr screen, CursorPtr cursor) - WL_SHM_FORMAT_ARGB8888); - wl_shm_pool_destroy(pool); - -- dixSetPrivate(&cursor->devPrivates, &xwl_cursor_private_key, buffer); -+ dixSetPrivate(&cursor->devPrivates, -+ &xwl_screen->cursor_private_key, buffer); - - return TRUE; - } -@@ -139,8 +138,11 @@ xwl_unrealize_cursor(DeviceIntPtr device, - ScreenPtr screen, CursorPtr cursor) - { - struct wl_buffer *buffer; -+ struct xwl_screen *xwl_screen; - -- buffer = dixGetPrivate(&cursor->devPrivates, &xwl_cursor_private_key); -+ xwl_screen = xwl_screen_get(screen); -+ buffer = dixGetPrivate(&cursor->devPrivates, -+ &xwl_screen->cursor_private_key); - wl_buffer_destroy(buffer); - - return TRUE; -@@ -155,7 +157,7 @@ xwl_seat_set_cursor(struct xwl_seat *xwl_seat) - return; - - buffer = dixGetPrivate(&xwl_seat->x_cursor->devPrivates, -- &xwl_cursor_private_key); -+ &xwl_seat->xwl_screen->cursor_private_key); - - wl_pointer_set_cursor(xwl_seat->wl_pointer, - xwl_seat->pointer_enter_serial, -@@ -229,7 +231,8 @@ xwl_screen_init_cursor(struct xwl_screen *xwl_screen, ScreenPtr screen) - { - miPointerScreenPtr pointer_priv; - -- if (!dixRegisterPrivateKey(&xwl_cursor_private_key, PRIVATE_CURSOR, 0)) -+ if (!dixRegisterPrivateKey(&xwl_screen->cursor_private_key, -+ PRIVATE_CURSOR, 0)) - return BadAlloc; - - pointer_priv = dixLookupPrivate(&screen->devPrivates, miPointerScreenKey); -diff --git a/hw/xfree86/xwayland/xwayland-private.h b/hw/xfree86/xwayland/xwayland-private.h -index b0b2201..aa9fc03 100644 ---- a/hw/xfree86/xwayland/xwayland-private.h -+++ b/hw/xfree86/xwayland/xwayland-private.h -@@ -65,6 +65,8 @@ struct xwl_screen { - uint32_t serial; - Bool outputs_initialized; - -+ DevPrivateKeyRec cursor_private_key; -+ - CreateWindowProcPtr CreateWindow; - DestroyWindowProcPtr DestroyWindow; - RealizeWindowProcPtr RealizeWindow; --- -1.8.4.2 - diff --git a/SOURCES/0029-XWayland-Don-t-commit-empty-surfaces.patch b/SOURCES/0029-XWayland-Don-t-commit-empty-surfaces.patch deleted file mode 100644 index 5228c5a..0000000 --- a/SOURCES/0029-XWayland-Don-t-commit-empty-surfaces.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 1cac327a6ef9c0ca44ec32c7146da37ecb930dca Mon Sep 17 00:00:00 2001 -From: Daniel Stone -Date: Thu, 12 Sep 2013 16:58:00 -0400 -Subject: [PATCH 29/38] XWayland: Don't commit empty surfaces - -Instead of attaching, damaging and then committing a new buffer as soon -as we allocate a pixmap, just attach and damage the entire buffer. When -the buffer is changed, we'll commit the changes. - -This avoids an ugly black (on SHM) flash when a window is mapped or -resized. - -Signed-off-by: Daniel Stone ---- - hw/xfree86/xwayland/xwayland-window.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/hw/xfree86/xwayland/xwayland-window.c b/hw/xfree86/xwayland/xwayland-window.c -index 20db80c..5045e65 100644 ---- a/hw/xfree86/xwayland/xwayland-window.c -+++ b/hw/xfree86/xwayland/xwayland-window.c -@@ -80,7 +80,6 @@ xwl_window_attach(struct xwl_window *xwl_window, PixmapPtr pixmap) - wl_surface_damage(xwl_window->surface, 0, 0, - pixmap->drawable.width, - pixmap->drawable.height); -- wl_surface_commit(xwl_window->surface); - - callback = wl_display_sync(xwl_screen->display); - wl_callback_add_listener(callback, &free_pixmap_listener, pixmap); --- -1.8.4.2 - diff --git a/SOURCES/0030-xwayland-Also-look-for-wlglamor.patch b/SOURCES/0030-xwayland-Also-look-for-wlglamor.patch deleted file mode 100644 index 206df01..0000000 --- a/SOURCES/0030-xwayland-Also-look-for-wlglamor.patch +++ /dev/null @@ -1,24 +0,0 @@ -From f3df4c8caf96cce10d7bd646f34df9c3bba4daa9 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= -Date: Fri, 11 Oct 2013 16:14:54 -0700 -Subject: [PATCH 30/38] xwayland: Also look for wlglamor - ---- - hw/xfree86/common/xf86AutoConfig.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/hw/xfree86/common/xf86AutoConfig.c b/hw/xfree86/common/xf86AutoConfig.c -index 51a7960..523ddb7 100644 ---- a/hw/xfree86/common/xf86AutoConfig.c -+++ b/hw/xfree86/common/xf86AutoConfig.c -@@ -277,6 +277,7 @@ listPossibleVideoDrivers(char *matches[], int nmatches) - if (i < (nmatches - 1)) { - #ifdef XORG_WAYLAND - if (xorgWayland) -+ matches[i++] = xnfstrdup("wlglamor"); - matches[i++] = xnfstrdup("wayland"); - else - #endif --- -1.8.4.2 - diff --git a/SOURCES/0031-xwayland-Add-wlglamor-the-right-way.patch b/SOURCES/0031-xwayland-Add-wlglamor-the-right-way.patch deleted file mode 100644 index 25126ce..0000000 --- a/SOURCES/0031-xwayland-Add-wlglamor-the-right-way.patch +++ /dev/null @@ -1,33 +0,0 @@ -From a7f4b0f1a49abdb79f7a787e582096af152382c2 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= -Date: Fri, 11 Oct 2013 16:29:02 -0700 -Subject: [PATCH 31/38] xwayland: Add wlglamor the right way - -Defeated by #ifdefs. ---- - hw/xfree86/common/xf86AutoConfig.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/hw/xfree86/common/xf86AutoConfig.c b/hw/xfree86/common/xf86AutoConfig.c -index 523ddb7..4c5d1d5 100644 ---- a/hw/xfree86/common/xf86AutoConfig.c -+++ b/hw/xfree86/common/xf86AutoConfig.c -@@ -274,12 +274,12 @@ listPossibleVideoDrivers(char *matches[], int nmatches) - - #if !defined(sun) - /* Fallback to platform default frame buffer driver */ -- if (i < (nmatches - 1)) { -+ if (i < (nmatches - 2)) { - #ifdef XORG_WAYLAND -- if (xorgWayland) -+ if (xorgWayland) { - matches[i++] = xnfstrdup("wlglamor"); - matches[i++] = xnfstrdup("wayland"); -- else -+ } else - #endif - #if !defined(__linux__) && defined(__sparc__) - matches[i++] = xnfstrdup("wsfb"); --- -1.8.4.2 - diff --git a/SOURCES/0032-xwayland-Don-t-redirect-windows-leave-it-to-the-wm.patch b/SOURCES/0032-xwayland-Don-t-redirect-windows-leave-it-to-the-wm.patch deleted file mode 100644 index 1615503..0000000 --- a/SOURCES/0032-xwayland-Don-t-redirect-windows-leave-it-to-the-wm.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 067752476a9c2bac9e01c3c923fa94b4bf0ec0c1 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= -Date: Fri, 11 Oct 2013 15:41:59 -0700 -Subject: [PATCH 32/38] xwayland: Don't redirect windows, leave it to the wm - ---- - hw/xfree86/xwayland/xwayland-window.c | 51 ----------------------------------- - 1 file changed, 51 deletions(-) - -diff --git a/hw/xfree86/xwayland/xwayland-window.c b/hw/xfree86/xwayland/xwayland-window.c -index 5045e65..c03855c 100644 ---- a/hw/xfree86/xwayland/xwayland-window.c -+++ b/hw/xfree86/xwayland/xwayland-window.c -@@ -31,11 +31,9 @@ - #include - #include - #include --#include - - #include - #include --#include - #include - - #include "xwayland.h" -@@ -86,49 +84,6 @@ xwl_window_attach(struct xwl_window *xwl_window, PixmapPtr pixmap) - pixmap->refcnt++; - } - --static Bool --xwl_create_window(WindowPtr window) --{ -- ScreenPtr screen = window->drawable.pScreen; -- struct xwl_screen *xwl_screen; -- Bool ret; -- -- xwl_screen = xwl_screen_get(screen); -- -- screen->CreateWindow = xwl_screen->CreateWindow; -- ret = (*screen->CreateWindow)(window); -- xwl_screen->CreateWindow = screen->CreateWindow; -- screen->CreateWindow = xwl_create_window; -- -- if (!(xwl_screen->flags & XWL_FLAGS_ROOTLESS) || -- window->parent != NULL) -- return ret; -- -- CompositeRedirectSubwindows(window, CompositeRedirectManual); -- -- return ret; --} -- --static int --xwl_destroy_window (WindowPtr window) --{ -- ScreenPtr screen = window->drawable.pScreen; -- struct xwl_screen *xwl_screen; -- Bool ret; -- -- if (window->parent == NULL) -- CompositeUnRedirectSubwindows (window, CompositeRedirectManual); -- -- xwl_screen = xwl_screen_get(screen); -- -- screen->DestroyWindow = xwl_screen->DestroyWindow; -- ret = (*screen->DestroyWindow)(window); -- xwl_screen->DestroyWindow = screen->DestroyWindow; -- screen->DestroyWindow = xwl_destroy_window; -- -- return ret; --} -- - static void - damage_report(DamagePtr pDamage, RegionPtr pRegion, void *data) - { -@@ -290,12 +245,6 @@ xwl_screen_init_window(struct xwl_screen *xwl_screen, ScreenPtr screen) - if (!dixRegisterPrivateKey(&xwl_window_private_key, PRIVATE_WINDOW, 0)) - return BadAlloc; - -- xwl_screen->CreateWindow = screen->CreateWindow; -- screen->CreateWindow = xwl_create_window; -- -- xwl_screen->DestroyWindow = screen->DestroyWindow; -- screen->DestroyWindow = xwl_destroy_window; -- - xwl_screen->RealizeWindow = screen->RealizeWindow; - screen->RealizeWindow = xwl_realize_window; - --- -1.8.4.2 - diff --git a/SOURCES/0033-xwayland-Fix-hidden-cursor.patch b/SOURCES/0033-xwayland-Fix-hidden-cursor.patch deleted file mode 100644 index dd28a43..0000000 --- a/SOURCES/0033-xwayland-Fix-hidden-cursor.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 844a73a64081044710d2f22ba5a52513c2cce708 Mon Sep 17 00:00:00 2001 -From: Trevor McCort -Date: Tue, 15 Oct 2013 19:41:12 -0500 -Subject: [PATCH 33/38] xwayland: Fix hidden cursor - -If a cursor is set when bits->emptyMask is true, the xserver -sets a NULL cursor instead. - -Signed-off-by: Trevor McCort ---- - hw/xfree86/xwayland/xwayland-cursor.c | 9 ++++++++- - 1 file changed, 8 insertions(+), 1 deletion(-) - -diff --git a/hw/xfree86/xwayland/xwayland-cursor.c b/hw/xfree86/xwayland/xwayland-cursor.c -index 2cdd248..2b3cb5e 100644 ---- a/hw/xfree86/xwayland/xwayland-cursor.c -+++ b/hw/xfree86/xwayland/xwayland-cursor.c -@@ -153,9 +153,16 @@ xwl_seat_set_cursor(struct xwl_seat *xwl_seat) - { - struct wl_buffer *buffer; - -- if (!xwl_seat->x_cursor || !xwl_seat->wl_pointer) -+ if (!xwl_seat->wl_pointer) - return; - -+ if (!xwl_seat->x_cursor) { -+ wl_pointer_set_cursor(xwl_seat->wl_pointer, -+ xwl_seat->pointer_enter_serial, -+ NULL, 0, 0); -+ return; -+ } -+ - buffer = dixGetPrivate(&xwl_seat->x_cursor->devPrivates, - &xwl_seat->xwl_screen->cursor_private_key); - --- -1.8.4.2 - diff --git a/SOURCES/0034-xkb-Repurpose-XkbCopyDeviceKeymap-to-apply-a-given-k.patch b/SOURCES/0034-xkb-Repurpose-XkbCopyDeviceKeymap-to-apply-a-given-k.patch deleted file mode 100644 index 6339734..0000000 --- a/SOURCES/0034-xkb-Repurpose-XkbCopyDeviceKeymap-to-apply-a-given-k.patch +++ /dev/null @@ -1,99 +0,0 @@ -From 3c9434f3f70420780e1fc606175a7436f6fdbb15 Mon Sep 17 00:00:00 2001 -From: Rui Matos -Date: Tue, 22 Oct 2013 16:50:29 +0200 -Subject: [PATCH 34/38] xkb: Repurpose XkbCopyDeviceKeymap to apply a given - keymap to a device - -This will also make it useful for cases when we have a new keymap to -apply to a device but don't have a source device. ---- - Xi/exevents.c | 2 +- - include/xkbsrv.h | 4 ++-- - xkb/xkb.c | 2 +- - xkb/xkbUtils.c | 14 +++++++------- - 4 files changed, 11 insertions(+), 11 deletions(-) - -diff --git a/Xi/exevents.c b/Xi/exevents.c -index 69b4038..028bdb4 100644 ---- a/Xi/exevents.c -+++ b/Xi/exevents.c -@@ -230,7 +230,7 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master) - - mk->sourceid = device->id; - -- if (!XkbCopyDeviceKeymap(master, device)) -+ if (!XkbDeviceApplyKeymap(master, device->key->xkbInfo->desc)) - FatalError("Couldn't pivot keymap from device to core!\n"); - } - -diff --git a/include/xkbsrv.h b/include/xkbsrv.h -index bef98ef..83ee1d0 100644 ---- a/include/xkbsrv.h -+++ b/include/xkbsrv.h -@@ -812,8 +812,8 @@ extern _X_EXPORT void XkbSendNewKeyboardNotify(DeviceIntPtr /* kbd */ , - extern Bool XkbCopyKeymap(XkbDescPtr /* dst */ , - XkbDescPtr /* src */ ); - --extern _X_EXPORT Bool XkbCopyDeviceKeymap(DeviceIntPtr /* dst */ , -- DeviceIntPtr /* src */ ); -+extern _X_EXPORT Bool XkbDeviceApplyKeymap(DeviceIntPtr /* dst */ , -+ XkbDescPtr /* src */ ); - - extern void XkbFilterEvents(ClientPtr /* pClient */ , - int /* nEvents */ , -diff --git a/xkb/xkb.c b/xkb/xkb.c -index c78aceb..7a631b8 100644 ---- a/xkb/xkb.c -+++ b/xkb/xkb.c -@@ -5991,7 +5991,7 @@ ProcXkbGetKbdByName(ClientPtr client) - continue; - - if (tmpd != dev) -- XkbCopyDeviceKeymap(tmpd, dev); -+ XkbDeviceApplyKeymap(tmpd, xkb); - - if (tmpd->kbdfeed && tmpd->kbdfeed->xkb_sli) { - old_sli = tmpd->kbdfeed->xkb_sli; -diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c -index 6c6af60..1f8a839 100644 ---- a/xkb/xkbUtils.c -+++ b/xkb/xkbUtils.c -@@ -1999,28 +1999,28 @@ XkbCopyKeymap(XkbDescPtr dst, XkbDescPtr src) - } - - Bool --XkbCopyDeviceKeymap(DeviceIntPtr dst, DeviceIntPtr src) -+XkbDeviceApplyKeymap(DeviceIntPtr dst, XkbDescPtr desc) - { - xkbNewKeyboardNotify nkn; - Bool ret; - -- if (!dst->key || !src->key) -+ if (!dst->key || !desc) - return FALSE; - - memset(&nkn, 0, sizeof(xkbNewKeyboardNotify)); - nkn.oldMinKeyCode = dst->key->xkbInfo->desc->min_key_code; - nkn.oldMaxKeyCode = dst->key->xkbInfo->desc->max_key_code; - nkn.deviceID = dst->id; -- nkn.oldDeviceID = dst->id; /* maybe src->id? */ -- nkn.minKeyCode = src->key->xkbInfo->desc->min_key_code; -- nkn.maxKeyCode = src->key->xkbInfo->desc->max_key_code; -+ nkn.oldDeviceID = dst->id; -+ nkn.minKeyCode = desc->min_key_code; -+ nkn.maxKeyCode = desc->max_key_code; - nkn.requestMajor = XkbReqCode; - nkn.requestMinor = X_kbSetMap; /* Near enough's good enough. */ - nkn.changed = XkbNKN_KeycodesMask; -- if (src->key->xkbInfo->desc->geom) -+ if (desc->geom) - nkn.changed |= XkbNKN_GeometryMask; - -- ret = XkbCopyKeymap(dst->key->xkbInfo->desc, src->key->xkbInfo->desc); -+ ret = XkbCopyKeymap(dst->key->xkbInfo->desc, desc); - if (ret) - XkbSendNewKeyboardNotify(dst, &nkn); - --- -1.8.4.2 - diff --git a/SOURCES/0035-xkb-Factor-out-a-function-to-copy-a-keymap-s-control.patch b/SOURCES/0035-xkb-Factor-out-a-function-to-copy-a-keymap-s-control.patch deleted file mode 100644 index caf2696..0000000 --- a/SOURCES/0035-xkb-Factor-out-a-function-to-copy-a-keymap-s-control.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 260ca040db20c397af0803da5c1bf15bc3bc08f2 Mon Sep 17 00:00:00 2001 -From: Rui Matos -Date: Mon, 21 Oct 2013 14:41:53 +0200 -Subject: [PATCH 35/38] xkb: Factor out a function to copy a keymap's controls - unto another - ---- - include/xkbsrv.h | 3 +++ - xkb/xkb.c | 14 +------------- - xkb/xkbUtils.c | 23 +++++++++++++++++++++++ - 3 files changed, 27 insertions(+), 13 deletions(-) - -diff --git a/include/xkbsrv.h b/include/xkbsrv.h -index 83ee1d0..6a2e96e 100644 ---- a/include/xkbsrv.h -+++ b/include/xkbsrv.h -@@ -829,6 +829,9 @@ extern void XkbFakeDeviceButton(DeviceIntPtr /* dev */ , - int /* press */ , - int /* button */ ); - -+extern _X_EXPORT void XkbCopyControls(XkbDescPtr /* dst */ , -+ XkbDescPtr /* src */ ); -+ - #include "xkbfile.h" - #include "xkbrules.h" - -diff --git a/xkb/xkb.c b/xkb/xkb.c -index 7a631b8..6a68e81 100644 ---- a/xkb/xkb.c -+++ b/xkb/xkb.c -@@ -5950,25 +5950,13 @@ ProcXkbGetKbdByName(ClientPtr client) - if (rep.loaded) { - XkbDescPtr old_xkb; - xkbNewKeyboardNotify nkn; -- int i, nG, nTG; - - old_xkb = xkb; - xkb = new; - dev->key->xkbInfo->desc = xkb; - new = old_xkb; /* so it'll get freed automatically */ - -- *xkb->ctrls = *old_xkb->ctrls; -- for (nG = nTG = 0, i = xkb->min_key_code; i <= xkb->max_key_code; i++) { -- nG = XkbKeyNumGroups(xkb, i); -- if (nG >= XkbNumKbdGroups) { -- nTG = XkbNumKbdGroups; -- break; -- } -- if (nG > nTG) { -- nTG = nG; -- } -- } -- xkb->ctrls->num_groups = nTG; -+ XkbCopyControls(xkb, old_xkb); - - nkn.deviceID = nkn.oldDeviceID = dev->id; - nkn.minKeyCode = new->min_key_code; -diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c -index 1f8a839..6cf6e79 100644 ---- a/xkb/xkbUtils.c -+++ b/xkb/xkbUtils.c -@@ -2090,3 +2090,26 @@ XkbMergeLockedPtrBtns(DeviceIntPtr master) - xkbi->lockedPtrButtons |= d->key->xkbInfo->lockedPtrButtons; - } - } -+ -+void -+XkbCopyControls(XkbDescPtr dst, XkbDescPtr src) -+{ -+ int i, nG, nTG; -+ -+ if (!dst || !src) -+ return; -+ -+ *dst->ctrls = *src->ctrls; -+ -+ for (nG = nTG = 0, i = dst->min_key_code; i <= dst->max_key_code; i++) { -+ nG = XkbKeyNumGroups(dst, i); -+ if (nG >= XkbNumKbdGroups) { -+ nTG = XkbNumKbdGroups; -+ break; -+ } -+ if (nG > nTG) { -+ nTG = nG; -+ } -+ } -+ dst->ctrls->num_groups = nTG; -+} --- -1.8.4.2 - diff --git a/SOURCES/0036-xwayland-Handle-keymap-changes.patch b/SOURCES/0036-xwayland-Handle-keymap-changes.patch deleted file mode 100644 index 2d31062..0000000 --- a/SOURCES/0036-xwayland-Handle-keymap-changes.patch +++ /dev/null @@ -1,87 +0,0 @@ -From 6240dcadc8f51b00abe7d1fc4e682b442809fb91 Mon Sep 17 00:00:00 2001 -From: Rui Matos -Date: Mon, 21 Oct 2013 14:41:54 +0200 -Subject: [PATCH 36/38] xwayland: Handle keymap changes - ---- - hw/xfree86/xwayland/xwayland-input.c | 39 +++++++++++++++++++++++++++++++++--- - include/input.h | 2 +- - 2 files changed, 37 insertions(+), 4 deletions(-) - -diff --git a/hw/xfree86/xwayland/xwayland-input.c b/hw/xfree86/xwayland/xwayland-input.c -index d031b34..ebf1af1 100644 ---- a/hw/xfree86/xwayland/xwayland-input.c -+++ b/hw/xfree86/xwayland/xwayland-input.c -@@ -143,7 +143,10 @@ xwl_keyboard_proc(DeviceIntPtr device, int what) - switch (what) { - case DEVICE_INIT: - device->public.on = FALSE; -- len = strnlen(xwl_seat->keymap, xwl_seat->keymap_size); -+ if (xwl_seat->keymap) -+ len = strnlen(xwl_seat->keymap, xwl_seat->keymap_size); -+ else -+ len = 0; - if (!InitKeyboardDeviceStructFromString(device, xwl_seat->keymap, - len, - NULL, xwl_keyboard_control)) -@@ -453,12 +456,42 @@ keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard, - uint32_t format, int fd, uint32_t size) - { - struct xwl_seat *xwl_seat = data; -+ DeviceIntPtr master; -+ XkbDescPtr xkb; -+ XkbChangesRec changes = { 0 }; -+ -+ if (xwl_seat->keymap) -+ munmap(xwl_seat->keymap, xwl_seat->keymap_size); - - xwl_seat->keymap_size = size; - xwl_seat->keymap = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); -- if (xwl_seat->keymap == MAP_FAILED) -- ; /* wah wah */ -+ if (xwl_seat->keymap == MAP_FAILED) { -+ xwl_seat->keymap_size = 0; -+ xwl_seat->keymap = NULL; -+ goto out; -+ } -+ -+ if (!xwl_seat->keyboard) -+ goto out; -+ -+ xkb = XkbCompileKeymapFromString(xwl_seat->keyboard, xwl_seat->keymap, -+ strnlen(xwl_seat->keymap, xwl_seat->keymap_size)); -+ if (!xkb) -+ goto out; -+ -+ XkbUpdateDescActions(xkb, xkb->min_key_code, XkbNumKeys(xkb), &changes); -+ /* Keep the current controls */ -+ XkbCopyControls(xkb, xwl_seat->keyboard->key->xkbInfo->desc); -+ -+ XkbDeviceApplyKeymap(xwl_seat->keyboard, xkb); -+ -+ master = GetMaster(xwl_seat->keyboard, MASTER_KEYBOARD); -+ if (master && master->lastSlave == xwl_seat->keyboard) -+ XkbDeviceApplyKeymap(master, xkb); -+ -+ XkbFreeKeyboard(xkb, XkbAllComponentsMask, TRUE); - -+ out: - close(fd); - } - -diff --git a/include/input.h b/include/input.h -index b1cc3ff..6a814c2 100644 ---- a/include/input.h -+++ b/include/input.h -@@ -508,7 +508,7 @@ extern int AttachDevice(ClientPtr client, - DeviceIntPtr slave, DeviceIntPtr master); - - extern _X_EXPORT DeviceIntPtr GetPairedDevice(DeviceIntPtr kbd); --extern DeviceIntPtr GetMaster(DeviceIntPtr dev, int type); -+extern _X_EXPORT DeviceIntPtr GetMaster(DeviceIntPtr dev, int type); - - extern _X_EXPORT int AllocDevicePair(ClientPtr client, - const char *name, --- -1.8.4.2 - diff --git a/SOURCES/0037-xwayland-Fix-re-wrapping-of-RealizeWindow.patch b/SOURCES/0037-xwayland-Fix-re-wrapping-of-RealizeWindow.patch deleted file mode 100644 index 18a0a2f..0000000 --- a/SOURCES/0037-xwayland-Fix-re-wrapping-of-RealizeWindow.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 408c17759542df3c906fc6fd0c01a3963ac0f345 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= -Date: Wed, 4 Dec 2013 10:27:07 -0800 -Subject: [PATCH 37/38] xwayland: Fix re-wrapping of RealizeWindow - ---- - hw/xfree86/xwayland/xwayland-window.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/hw/xfree86/xwayland/xwayland-window.c b/hw/xfree86/xwayland/xwayland-window.c -index c03855c..ee95371 100644 ---- a/hw/xfree86/xwayland/xwayland-window.c -+++ b/hw/xfree86/xwayland/xwayland-window.c -@@ -110,7 +110,7 @@ xwl_realize_window(WindowPtr window) - - screen->RealizeWindow = xwl_screen->RealizeWindow; - ret = (*screen->RealizeWindow)(window); -- xwl_screen->RealizeWindow = xwl_screen->RealizeWindow; -+ xwl_screen->RealizeWindow = screen->RealizeWindow; - screen->RealizeWindow = xwl_realize_window; - - if (xwl_screen->flags & XWL_FLAGS_ROOTLESS) { --- -1.8.4.2 - diff --git a/SOURCES/0038-xwayland-Adapt-to-1.15-Damage-API.patch b/SOURCES/0038-xwayland-Adapt-to-1.15-Damage-API.patch deleted file mode 100644 index 876cb66..0000000 --- a/SOURCES/0038-xwayland-Adapt-to-1.15-Damage-API.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 76e317e6e80465ecdda849931789f1b606ff75ae Mon Sep 17 00:00:00 2001 -From: Adam Jackson -Date: Thu, 12 Dec 2013 09:47:12 -0500 -Subject: [PATCH 38/38] xwayland: Adapt to 1.15 Damage API - ---- - hw/xfree86/xwayland/xwayland-window.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/hw/xfree86/xwayland/xwayland-window.c b/hw/xfree86/xwayland/xwayland-window.c -index ee95371..9a6724e 100644 ---- a/hw/xfree86/xwayland/xwayland-window.c -+++ b/hw/xfree86/xwayland/xwayland-window.c -@@ -190,7 +190,6 @@ xwl_unrealize_window(WindowPtr window) - xorg_list_del(&xwl_window->link); - if (RegionNotEmpty(DamageRegion(xwl_window->damage))) - xorg_list_del(&xwl_window->link_damage); -- DamageUnregister(&window->drawable, xwl_window->damage); - DamageDestroy(xwl_window->damage); - free(xwl_window); - dixSetPrivate(&window->devPrivates, &xwl_window_private_key, NULL); --- -1.8.4.2 - diff --git a/SOURCES/0040-xfree86-Keep-a-non-seat0-X-server-from-touching-VTs-.patch b/SOURCES/0040-xfree86-Keep-a-non-seat0-X-server-from-touching-VTs-.patch index b403737..80ee1cd 100644 --- a/SOURCES/0040-xfree86-Keep-a-non-seat0-X-server-from-touching-VTs-.patch +++ b/SOURCES/0040-xfree86-Keep-a-non-seat0-X-server-from-touching-VTs-.patch @@ -1,4 +1,4 @@ -From e84714bc6aa80435b3934b6ab3047ac2808111db Mon Sep 17 00:00:00 2001 +From b2e2ea665f284517690d8501aa5de2f708ea6e7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?La=C3=A9rcio=20de=20Sousa?= Date: Thu, 12 Dec 2013 14:22:48 -0200 Subject: [PATCH] xfree86: Keep a non-seat0 X server from touching VTs (#71258) @@ -32,19 +32,19 @@ Reviewed-by: Hans de Goede 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c -index 788f808..ae482dd 100644 +index f95eec5..4729879 100644 --- a/hw/xfree86/common/xf86Init.c +++ b/hw/xfree86/common/xf86Init.c -@@ -563,7 +563,8 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv) - if (NEED_IO_ENABLED(flags)) - want_hw_access = TRUE; +@@ -554,7 +554,8 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv) + if (NEED_IO_ENABLED(flags)) + want_hw_access = TRUE; -- if (!(flags & HW_SKIP_CONSOLE)) -+ /* Non-seat0 X servers should not open console */ -+ if (!(flags & HW_SKIP_CONSOLE) && !ServerIsNotSeat0()) - xorgHWOpenConsole = TRUE; - } +- if (!(flags & HW_SKIP_CONSOLE)) ++ /* Non-seat0 X servers should not open console */ ++ if (!(flags & HW_SKIP_CONSOLE) && !ServerIsNotSeat0()) + xorgHWOpenConsole = TRUE; } + -- -1.8.3.1 +2.1.0 diff --git a/SPECS/xorg-x11-server.spec b/SPECS/xorg-x11-server.spec index 4f29b4f..04897a4 100644 --- a/SPECS/xorg-x11-server.spec +++ b/SPECS/xorg-x11-server.spec @@ -42,7 +42,7 @@ Summary: X.Org X11 X server Name: xorg-x11-server Version: 1.15.0 -Release: 7%{?gitdate:.%{gitdate}}%{?dist}.3 +Release: 32%{?gitdate:.%{gitdate}}%{?dist} URL: http://www.x.org License: MIT Group: User Interface/X @@ -74,48 +74,20 @@ Source31: xserver-sdk-abi-requires.git # maintainer convenience script Source40: driver-abi-rebuild.sh -# xwayland. trivial rebase onto master: -# http://cgit.freedesktop.org/~ajax/xserver/log/?h=wayland-f21 -Patch0101: 0001-dbe-Cleanup-in-CloseScreen-hook-not-ext-CloseDown.patch -Patch0102: 0002-xkb-Add-struct-XkbCompContext.patch -Patch0103: 0003-xkb-Split-out-code-to-start-and-finish-xkbcomp.patch -Patch0104: 0004-xkb-Add-XkbCompileKeymapFromString.patch -Patch0105: 0005-os-Add-a-function-to-create-a-client-for-an-fd.patch -Patch0106: 0006-Export-xf86NewInputDevice-and-xf86AllocateInput.patch -Patch0107: 0007-Add-redirect-window-for-input-device-feature.patch -Patch0108: 0008-dri2-Introduce-a-third-version-of-the-AuthMagic-func.patch -Patch0109: 0009-Add-xwayland-module.patch -Patch0110: 0010-xwayland-Add-a-HW_WAYLAND-flag-to-let-drivers-explic.patch -Patch0111: 0011-xwayland-shm-don-t-create-alpha-buffers-if-the-windo.patch -Patch0112: 0012-xwayland-handle-global-object-destruction.patch -Patch0113: 0013-xwayland-add-support-for-multiple-outputs.patch -Patch0114: 0014-xwayland-Probe-outputs-on-preinit.patch -Patch0115: 0015-XFree86-Load-wlshm-driver-as-fallback-for-Wayland.patch -Patch0116: 0016-XWayland-Don-t-send-out-of-bounds-damage-co-ordinate.patch -Patch0117: 0017-xwayland-Introduce-an-auto-mode-for-enable-wayland.patch -Patch0118: 0018-XWayland-Don-t-hardcode-DRM-libs-and-lwayland-client.patch -Patch0119: 0019-XWayland-Support-16bpp-X-surfaces-in-DRM-SHM.patch -Patch0120: 0020-xwayland-Remove-Xdnd-selection-watching-code.patch -Patch0121: 0021-xf86Init-trim-out-non-wayland-capable-servers-from-d.patch -Patch0122: 0022-Add-XORG_WAYLAND-symbol-to-xorg-config.h.in.patch -Patch0123: 0023-Fix-fallback-loading-of-the-wayland-driver.patch -Patch0124: 0024-xwayland-Don-t-include-xorg-server.h.patch -Patch0125: 0025-os-Don-t-include-xorg-server.h.patch -Patch0126: 0026-os-Also-define-ListenOnOpenFD-and-AddClientOnOpenFD-.patch -Patch0127: 0027-xwayland-Remove-unused-variables.patch -Patch0128: 0028-xwayland-Use-a-per-screen-private-key-for-cursor-pri.patch -Patch0129: 0029-XWayland-Don-t-commit-empty-surfaces.patch -Patch0130: 0030-xwayland-Also-look-for-wlglamor.patch -Patch0131: 0031-xwayland-Add-wlglamor-the-right-way.patch -Patch0132: 0032-xwayland-Don-t-redirect-windows-leave-it-to-the-wm.patch -Patch0133: 0033-xwayland-Fix-hidden-cursor.patch -Patch0134: 0034-xkb-Repurpose-XkbCopyDeviceKeymap-to-apply-a-given-k.patch -Patch0135: 0035-xkb-Factor-out-a-function-to-copy-a-keymap-s-control.patch -Patch0136: 0036-xwayland-Handle-keymap-changes.patch -Patch0137: 0037-xwayland-Fix-re-wrapping-of-RealizeWindow.patch -Patch0138: 0038-xwayland-Adapt-to-1.15-Damage-API.patch -# restore ABI -Patch0200: 0001-mustard-Restore-XkbCopyDeviceKeymap.patch +# Sync with RHEL6.6 +Patch01: 0001-dix-Fix-GrabPointer-to-not-wrongly-succeed-on-redire.patch +Patch02: 0001-Enable-PAM-support.patch +Patch03: 0001-ephyr-Properly-implement-hardware-cursors.patch +Patch04: 0001-ephyr-Repaint-entire-screen-when-colormap-is-updated.patch +Patch05: 0001-input-Remove-invalid-bug-checks.patch +Patch06: 0001-Xephyr-restore-initial-window-resize-lost-in-xcb-con.patch +Patch07: 0001-xf86AddBusDeviceToConfigure-Store-device-in-DevToCon.patch +Patch08: 0001-xfree86-Add-modesetting-to-the-fallback-driver-list.patch +Patch09: 0001-xfree86-Allow-mixed-fbdev-and-pci-setups.patch +Patch10: 0001-Xi-Ensure-DeviceChanged-is-emitted-after-grabs-are-d.patch + +# RHEL-specific mustard +Patch100: 0001-mustard-Don-t-probe-for-drivers-not-shipped-in-RHEL7.patch # Trivial things to never merge upstream ever: # This really could be done prettier. @@ -123,7 +95,6 @@ Patch5002: xserver-1.4.99-ssh-isnt-local.patch # ajax needs to upstream this Patch6030: xserver-1.6.99-right-of.patch -#Patch6044: xserver-1.6.99-hush-prerelease-warning.patch Patch7025: 0001-Always-install-vbe-and-int10-sdk-headers.patch @@ -135,8 +106,6 @@ Patch8040: 0001-rrcrtc-brackets-are-hard-lets-go-shopping.patch Patch8041: 0001-pixmap-fix-reverse-optimus-support-with-multiple-hea.patch # extra magic to be upstreamed -Patch9001: 0001-xfree86-Only-look-at-wayland-capable-drivers-when-wa.patch -Patch9002: 0001-xwayland-Just-send-the-bounding-box-of-the-damage.patch Patch9003: 0001-link-with-z-now.patch # submitted: http://lists.x.org/archives/xorg-devel/2013-October/037996.html @@ -147,8 +116,29 @@ Patch9103: 0001-randr-attempt-to-fix-primary-on-slave-output.patch Patch9200: 0040-xfree86-Keep-a-non-seat0-X-server-from-touching-VTs-.patch +# Bug 1047921 - USB keyboard LED indicators do not work correctly under some circumstances +Patch9210: 0001-xkb-factor-out-the-StateNotify-flag-check.patch +Patch9211: 0002-xkb-factor-out-state-update-into-a-function.patch +Patch9212: 0003-xkb-push-locked-modifier-state-down-to-attached-slav.patch +Patch9213: 0004-xkb-ignore-floating-slave-devices-when-updating-from.patch + +# Bug 1095964 - X server crashes when processing events from disabled devices +Patch9220: 0001-mi-don-t-process-events-from-disabled-devices-77884.patch +Patch9221: 0002-mi-Build-fix-mieqProcessDeviceEvent-returns-void.patch +Patch9922: 0003-mieq-Fix-a-crash-regression-in-mieqProcessDeviceEven.patch + +# ppc64le support +Patch9230: 0001-arch-Fix-image-and-bitmap-byte-order-for-ppc64le.patch + +# Bug 798994 - Exposure event not generated in Xinerama mode +Patch9231: 0001-xinerama-Implement-graphics-exposures-for-window-pix.patch + +# dri2 prime fixes +Patch9300: 0001-dri2-Fix-detection-of-wrong-prime_id-in-GetScreenPri.patch +Patch9301: 0002-dri2-Use-the-PrimeScreen-when-creating-reusing-buffe.patch +Patch9302: 0003-dri2-Invalidate-DRI2Buffers-upon-SetWindowPixmap-upd.patch + # CVEs all over. -Patch9999: 0001-glx-check-return-from-__glXGetAnswerBuffer.patch Patch10000: 0001-unchecked-malloc-may-allow-unauthed-client-to-crash-.patch Patch10001: 0002-dix-integer-overflow-in-ProcPutImage-CVE-2014-8092-1.patch Patch10002: 0003-dix-integer-overflow-in-GetHosts-CVE-2014-8092-2-4.patch @@ -182,9 +172,6 @@ Patch10029: 0030-glx-Length-checking-for-non-generated-single-request.patch Patch10030: 0031-glx-Fix-mask-truncation-in-__glXGetAnswerBuffer-CVE-.patch Patch10031: 0032-glx-Length-checking-for-RenderLarge-requests-v2-CVE-.patch Patch10032: 0033-glx-Pass-remaining-request-length-into-varsize-v2-CV.patch -Patch10033: 0001-Missing-parens-in-REQUEST_FIXED_SIZE-macro-CVE-2014-.patch -Patch10034: 0002-dix-GetHosts-bounds-check-using-wrong-pointer-value-.patch - %global moduledir %{_libdir}/xorg/modules %global drimoduledir %{_libdir}/dri @@ -209,6 +196,7 @@ Patch10034: 0002-dix-GetHosts-bounds-check-using-wrong-pointer-value-.patch %global kdrive --enable-kdrive --enable-xephyr --disable-xfake --disable-xfbdev %global xservers --enable-xvfb --enable-xnest %{kdrive} %{enable_xorg} +BuildRequires: pam-devel BuildRequires: systemtap-sdt-devel BuildRequires: git-core BuildRequires: automake autoconf libtool pkgconfig @@ -503,8 +491,11 @@ make install DESTDIR=$RPM_BUILD_ROOT moduledir=%{moduledir} rm -rf $RPM_BUILD_ROOT%{_libdir}/xorg/modules/multimedia/ mkdir -p $RPM_BUILD_ROOT%{_libdir}/xorg/modules/{drivers,input} +# yay pam mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/pam.d -install -m 644 %{SOURCE10} $RPM_BUILD_ROOT%{_sysconfdir}/pam.d/xserver +install -m 0644 %{SOURCE10} $RPM_BUILD_ROOT%{_sysconfdir}/pam.d/xserver +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/security/console.apps +touch $RPM_BUILD_ROOT%{_sysconfdir}/security/console.apps/xserver mkdir -p $RPM_BUILD_ROOT%{_datadir}/X11/xorg.conf.d install -m 644 %{SOURCE4} $RPM_BUILD_ROOT%{_datadir}/X11/xorg.conf.d @@ -588,6 +579,7 @@ rm -rf $RPM_BUILD_ROOT %files Xorg %defattr(-,root,root,-) %config %attr(0644,root,root) %{_sysconfdir}/pam.d/xserver +%config(missingok) /etc/security/console.apps/xserver %{_bindir}/X %{Xorgperms} %{_bindir}/Xorg %{_bindir}/cvt @@ -681,10 +673,52 @@ rm -rf $RPM_BUILD_ROOT %{xserver_source_dir} %changelog -* Wed Dec 10 2014 Adam Jackson 1.15.0-7.3 -- CVE fixes for: CVE-2014-8099, CVE-2014-8098, CVE-2014-8097, CVE-2014-8096, - CVE-2014-8095, CVE-2014-8094, CVE-2014-8093, CVE-2014-8092, CVE-2014-8091, - CVE-2014-8101, CVE-2014-8100, CVE-2014-8103, CVE-2014-8102 +* Wed Jan 21 2015 Adam Jackson 1.15.0-32 +- Fix fallback driver probe order +- Fix a crash in X -configure + +* Mon Jan 05 2015 Adam Jackson 1.15.0-31 +- Amend the CVE-2014-8092-3 patch to be legal C++, fixes tigervnc build + +* Mon Dec 08 2014 Dave Airlie 1.15.0-30 +- Fix a lot of CVEs all over the X server. + +* Mon Oct 06 2014 Dave Airlie 1.15.0-29 +- dri2 fixes backport - part of the fix for prime not working with SNA + +* Thu Sep 25 2014 Adam Jackson 1.15.0-28 +- Fix graphics-exposure generation on CopyArea from window to pixmap with + Xinerama active + +* Wed Sep 17 2014 Adam Jackson 1.15.0-27 +- Link Xorg as a PIE + +* Wed Sep 17 2014 Adam Jackson 1.15.0-26 +- In the PCI probe logic, don't try to load drivers RHEL7 doesn't ship. + +* Thu Sep 11 2014 Dave Airlie 1.15.0-25 +- backport ppc64le arch fix. + +* Wed Sep 10 2014 Adam Jackson 1.15.0-24 +- Fix PAM magic in %%install + +* Tue Sep 09 2014 Adam Jackson 1.15.0-23 +- Drop vestigial xwayland patch series +- Sync with RHEL6.6: + - Fix GrabPointer to not wrongly succeed on redirected windows + - Enable PAM + - Xephyr fixes for hardware cursor, 8bpp emulation, and initial size + - Xorg fixes for X -configure and mixed pci/fbdev setups + - Remove invalid bug checks + - Emit DeviceChanged after grab deactivation +- Rediff some things to match the above +- Inflate Release to be ahead of RHEL 6.6 + +* Thu Aug 07 2014 Peter Hutterer 1.15.0-8 +- Push the XKB locked state to the attached slaves to keep keyboard LEDs in + sync (#1047921) +- Discard events from disabled devices to prevent crash on VT-switch or + shutdown (#1095964) * Thu Feb 27 2014 Jérôme Glisse 1.15.0-7 - Do not open tty on non seat0 (#1053063)