From 5e49381c7fc31dea28112e847a2995ad087bd1de Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 30 Jul 2013 15:45:05 +1000 Subject: [PATCH] Fix active touch grabs, second touchpoint didn't get sent to client - Fix version mismatch for XI 2.2+ clients (where a library supports > 2.2 but another version than the originally requested one). --- ...2mask-not-the-grab-type-for-touch-li.patch | 50 ++++++++++++++ ...-to-ask-for-2.3-and-then-2.2-without.patch | 68 +++++++++++++++++++ xorg-x11-server.spec | 14 +++- 3 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 0001-dix-check-the-xi2mask-not-the-grab-type-for-touch-li.patch create mode 100644 0003-Xi-Allow-clients-to-ask-for-2.3-and-then-2.2-without.patch diff --git a/0001-dix-check-the-xi2mask-not-the-grab-type-for-touch-li.patch b/0001-dix-check-the-xi2mask-not-the-grab-type-for-touch-li.patch new file mode 100644 index 0000000..65712c4 --- /dev/null +++ b/0001-dix-check-the-xi2mask-not-the-grab-type-for-touch-li.patch @@ -0,0 +1,50 @@ +From ef54bd89b17f3dd1f854435339f66d357121c64c Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Wed, 24 Jul 2013 11:50:00 +1000 +Subject: [PATCH 1/3] dix: check the xi2mask, not the grab type for touch + listeners + +grab->type is only non-zero for passive grabs. We're checking an active grab +here, so we need to check if the touch mask is set on the grab. + +Test case: grab the device, then start two simultaneous touches. The +grabbing client won't see the second touchpoints because grab->type is 0 +and the second touch is not an emulating pointer. + +Signed-off-by: Peter Hutterer +(cherry picked from commit 4fb686d6a6777950f0e0d55b848cd2af4cbad372) +--- + dix/touch.c | 3 +-- + include/inputstr.h | 2 +- + 2 files changed, 2 insertions(+), 3 deletions(-) + +diff --git a/dix/touch.c b/dix/touch.c +index a4b6d7e..a7ea213 100644 +--- a/dix/touch.c ++++ b/dix/touch.c +@@ -895,8 +895,7 @@ TouchAddActiveGrabListener(DeviceIntPtr dev, TouchPointInfoPtr ti, + + if (!ti->emulate_pointer && + grab->grabtype == XI2 && +- (grab->type != XI_TouchBegin && grab->type != XI_TouchEnd && +- grab->type != XI_TouchUpdate)) ++ !xi2mask_isset(grab->xi2mask, dev, XI_TouchBegin)) + return; + + TouchAddGrabListener(dev, ti, ev, grab); +diff --git a/include/inputstr.h b/include/inputstr.h +index 85be885..2da72c1 100644 +--- a/include/inputstr.h ++++ b/include/inputstr.h +@@ -195,7 +195,7 @@ typedef struct _GrabRec { + unsigned keyboardMode:1; + unsigned pointerMode:1; + enum InputLevel grabtype; +- CARD8 type; /* event type */ ++ CARD8 type; /* event type for passive grabs, 0 for active grabs */ + DetailRec modifiersDetail; + DeviceIntPtr modifierDevice; + DetailRec detail; /* key or button */ +-- +1.8.2.1 + diff --git a/0003-Xi-Allow-clients-to-ask-for-2.3-and-then-2.2-without.patch b/0003-Xi-Allow-clients-to-ask-for-2.3-and-then-2.2-without.patch new file mode 100644 index 0000000..6c3a1d6 --- /dev/null +++ b/0003-Xi-Allow-clients-to-ask-for-2.3-and-then-2.2-without.patch @@ -0,0 +1,68 @@ +From e6da18f67516dcee394cd0eff591a255b59fe544 Mon Sep 17 00:00:00 2001 +From: Keith Packard +Date: Wed, 10 Jul 2013 22:42:55 -0700 +Subject: [PATCH 3/3] Xi: Allow clients to ask for 2.3 and then 2.2 without + failing + +This allows different sub-systems within the same application to +request different Xi versions without either getting old behaviour +everywhere or simply failing with a BadValue. + +Signed-off-by: Keith Packard +Signed-off-by: Peter Hutterer +(cherry picked from commit 4360514d1cc8e3132f93f56172d291074e8c770f) +--- + Xi/xiqueryversion.c | 36 ++++++++++++++++++++++++++++++------ + 1 file changed, 30 insertions(+), 6 deletions(-) + +diff --git a/Xi/xiqueryversion.c b/Xi/xiqueryversion.c +index b807a53..6c7b9c0 100644 +--- a/Xi/xiqueryversion.c ++++ b/Xi/xiqueryversion.c +@@ -71,13 +71,37 @@ ProcXIQueryVersion(ClientPtr client) + pXIClient = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey); + + if (pXIClient->major_version) { +- if (version_compare(stuff->major_version, stuff->minor_version, +- pXIClient->major_version, pXIClient->minor_version) < 0) { +- client->errorValue = stuff->major_version; +- return BadValue; ++ ++ /* Check to see if the client has only ever asked ++ * for version 2.2 or higher ++ */ ++ if (version_compare(stuff->major_version, stuff->minor_version, 2, 2) >= 0 && ++ version_compare(pXIClient->major_version, pXIClient->minor_version, 2, 2) >= 0) ++ { ++ ++ /* As of version 2.2, Peter promises to never again break ++ * backward compatibility, so we'll return the requested ++ * version to the client but leave the server internal ++ * version set to the highest requested value ++ */ ++ major = stuff->major_version; ++ minor = stuff->minor_version; ++ if (version_compare(stuff->major_version, stuff->minor_version, ++ pXIClient->major_version, pXIClient->minor_version) > 0) ++ { ++ pXIClient->major_version = stuff->major_version; ++ pXIClient->minor_version = stuff->minor_version; ++ } ++ } else { ++ if (version_compare(stuff->major_version, stuff->minor_version, ++ pXIClient->major_version, pXIClient->minor_version) < 0) { ++ ++ client->errorValue = stuff->major_version; ++ return BadValue; ++ } ++ major = pXIClient->major_version; ++ minor = pXIClient->minor_version; + } +- major = pXIClient->major_version; +- minor = pXIClient->minor_version; + } else { + if (version_compare(XIVersion.major_version, XIVersion.minor_version, + stuff->major_version, stuff->minor_version) > 0) { +-- +1.8.2.1 + diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec index 037d237..0891692 100644 --- a/xorg-x11-server.spec +++ b/xorg-x11-server.spec @@ -42,7 +42,7 @@ Summary: X.Org X11 X server Name: xorg-x11-server Version: 1.14.2 -Release: 8%{?gitdate:.%{gitdate}}%{dist} +Release: 9%{?gitdate:.%{gitdate}}%{dist} URL: http://www.x.org License: MIT Group: User Interface/X @@ -160,6 +160,13 @@ Patch8039: 0001-dix-set-the-valuator-mask-to-ensure-XI-1.x-events-ha.patch # Fix multiple monitors in reverse optimus configurations Patch8040: 0001-rrcrtc-brackets-are-hard-lets-go-shopping.patch Patch8041: 0001-pixmap-fix-reverse-optimus-support-with-multiple-hea.patch + +# Fix active touch grabs +Patch8042: 0001-dix-check-the-xi2mask-not-the-grab-type-for-touch-li.patch +# Fix failures for XI2 clients using other XI2 libraries (with different XI2 +# version support) +Patch8043: 0003-Xi-Allow-clients-to-ask-for-2.3-and-then-2.2-without.patch + # upstream in -next for 1.15, e21e183059df5975e7086850d1931edb2c1bbd06 %if !0%{?rhel} Patch7071: 0001-os-use-libunwind-to-generate-backtraces.patch @@ -637,6 +644,11 @@ rm -rf $RPM_BUILD_ROOT %{xserver_source_dir} %changelog +* Tue Jul 30 2013 Peter Hutterer 1.14.2-9 +- Fix active touch grabs, second touchpoint didn't get sent to client +- Fix version mismatch for XI 2.2+ clients (where a library supports > 2.2 + but another version than the originally requested one). + * Tue Jul 30 2013 Dave Airlie 1.14.2-8 - fixes for multi-monitor reverse optimus