summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO2
-rw-r--r--PKGBUILD13
-rw-r--r--git-fixes.diff68
3 files changed, 76 insertions, 7 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 16d3566a240c..8b0d45f002c4 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,6 +1,6 @@
pkgbase = xorg-server-dev
pkgver = 1.19.0
- pkgrel = 5
+ pkgrel = 6
url = http://xorg.freedesktop.org
arch = i686
arch = x86_64
diff --git a/PKGBUILD b/PKGBUILD
index d69dcef9175b..b5eca98f1fbe 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -4,7 +4,7 @@
_pkgbase=xorg-server
pkgname=('xorg-server-dev' 'xorg-server-xephyr-dev' 'xorg-server-xdmx-dev' 'xorg-server-xvfb-dev' 'xorg-server-xnest-dev' 'xorg-server-xwayland-dev' 'xorg-server-common-dev' 'xorg-server-devel-dev')
pkgver=1.19.0 # http://lists.x.org/archives/xorg/2016-November/058437.html
-pkgrel=5 # https://git.archlinux.org/svntogit/packages.git/commit/trunk?h=packages/xorg-server&id=09caa03aed32e9d7a8d5322a75b116205ea7affb
+pkgrel=6 # https://git.archlinux.org/svntogit/packages.git/commit/trunk?h=packages/xorg-server&id=292ceb303068b172ed985891d686aa45e19398fe
arch=('i686' 'x86_64')
license=('custom')
groups=('xorg')
@@ -27,16 +27,17 @@ sha256sums=('149a708b50befc2d5a40b98d45ddd2ebe0beec018e6d0c663c43bad6210e4da3'
'SKIP'
'ff0156309470fc1d378fd2e104338020a884295e285972cc88e250e031cc35b9'
'2460adccd3362fefd4cdc5f1c70f332d7b578091fb9167bf88b5f91265bbd776'
- '15ae819f97b16e88974986d71c832b99fa220e8223ccaf171513e9e4c73f84dd')
+ 'f0f18685a5894a4d30669fa0b74db8f29d869b57315d8a16e093010659a3299c')
prepare() {
cd "${_pkgbase}-${pkgver}"
msg2 "Apply upstream fixes:
- Revert \"damage: Make damageRegionProcessPending take a damage not a drawable\"
- OS: return 0 from check_timers, if we touched any of them
- Glamor: Trust eglGetPlatformDisplayEXT, if it exists
- Present: Only call present_flip_notify if vblank->queued == FALSE"
+ - Revert \"damage: Make damageRegionProcessPending take a damage not a drawable\"
+ - OS: return 0 from check_timers, if we touched any of them
+ - Glamor: Trust eglGetPlatformDisplayEXT, if it exists
+ -Present: Only call present_flip_notify if vblank->queued == FALSE
+ - AttendClient of grab-pervious client should queue to saved_ready_clients"
patch -Np1 -i ../git-fixes.diff
}
diff --git a/git-fixes.diff b/git-fixes.diff
index d3b5e17753e7..4f9c2521895d 100644
--- a/git-fixes.diff
+++ b/git-fixes.diff
@@ -652,3 +652,71 @@ index a7ca06e..ef89045 100644
--
cgit v0.10.2
+From: Keith Packard <keithp@keithp.com>
+X-Patchwork-Id: 132089
+Message-Id: <20170110021441.12759-1-keithp@keithp.com>
+To: xorg-devel@lists.freedesktop.org
+Date: Mon, 9 Jan 2017 18:14:41 -0800
+
+A client which is attended while a grab is blocking execution of its
+requests needs to be placed in the saved_ready_clients list so that it
+will get scheduled once the grab terminates. Otherwise, if the client
+never sends another request, there is no way for it to be placed in
+the ready_clients list.
+
+Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99333
+Signed-off-by: Keith Packard <keithp@keithp.com>
+---
+ dix/dispatch.c | 7 +++++++
+ include/dixstruct.h | 3 +++
+ os/connection.c | 4 ++++
+ 3 files changed, 14 insertions(+)
+
+diff --git a/dix/dispatch.c b/dix/dispatch.c
+index 3d0fe26fd..ab69d34b9 100644
+--- a/dix/dispatch.c
++++ b/dix/dispatch.c
+@@ -266,6 +266,13 @@ mark_client_ready(ClientPtr client)
+ xorg_list_append(&client->ready, &ready_clients);
+ }
+
++/* Client has requests queued or data on the network, but awaits a server grab release */
++void mark_client_saved_ready(ClientPtr client)
++{
++ if (xorg_list_is_empty(&client->ready))
++ xorg_list_append(&client->ready, &saved_ready_clients);
++}
++
+ /* Client has no requests queued and no data on network */
+ void
+ mark_client_not_ready(ClientPtr client)
+diff --git a/include/dixstruct.h b/include/dixstruct.h
+index d71b0ac05..fd9195972 100644
+--- a/include/dixstruct.h
++++ b/include/dixstruct.h
+@@ -143,6 +143,9 @@ extern void SmartScheduleStopTimer(void);
+ /* Client has requests queued or data on the network */
+ void mark_client_ready(ClientPtr client);
+
++/* Client has requests queued or data on the network, but awaits a server grab release */
++void mark_client_saved_ready(ClientPtr client);
++
+ /* Client has no requests queued and no data on network */
+ void mark_client_not_ready(ClientPtr client);
+
+diff --git a/os/connection.c b/os/connection.c
+index a901ebf3c..a2629c8a2 100644
+--- a/os/connection.c
++++ b/os/connection.c
+@@ -1067,6 +1067,10 @@ AttendClient(ClientPtr client)
+ set_poll_client(client);
+ if (listen_to_client(client))
+ mark_client_ready(client);
++ else if (!(oc->flags & OS_COMM_IGNORED)) {
++ /* grab active, mark ready when grab goes away */
++ mark_client_saved_ready(client);
++ }
+ }
+
+ /* make client impervious to grabs; assume only executing client calls this */
+