[xorg-x11-server] Add touchscreen fixes (including pointer emulation) #871064
Peter Hutterer
whot at fedoraproject.org
Tue Oct 30 01:42:21 UTC 2012
commit f3b303024e34cabb98896b4d8b11e3860c76203d
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date: Tue Oct 30 11:25:42 2012 +1000
Add touchscreen fixes (including pointer emulation) #871064
...istener-memory-allocation-with-population.patch | 36 ++++++++++++
...ateDeviceState-after-the-first-emulated-m.patch | 60 ++++++++++++++++++++
...-Don-t-check-for-TOUCH_END-it-s-never-set.patch | 36 ++++++++++++
...liver-TouchEnd-to-a-client-waiting-for-To.patch | 37 ++++++++++++
xorg-x11-server.spec | 11 +++-
5 files changed, 179 insertions(+), 1 deletions(-)
---
diff --git a/0001-Sync-TouchListener-memory-allocation-with-population.patch b/0001-Sync-TouchListener-memory-allocation-with-population.patch
new file mode 100644
index 0000000..a2672e4
--- /dev/null
+++ b/0001-Sync-TouchListener-memory-allocation-with-population.patch
@@ -0,0 +1,36 @@
+From bbf4fe102fb67ed43fe57df085c40de525b8f4c0 Mon Sep 17 00:00:00 2001
+From: Carlos Garnacho <carlosg at gnome.org>
+Date: Thu, 25 Oct 2012 15:03:50 +0200
+Subject: [PATCH] Sync TouchListener memory allocation with population in
+ TouchSetupListeners()
+
+The allocated TouchListener array may fall short by 1 if hitting the worst case
+situation where there's an active grab, passive grabs on each window in the
+sprite trace and event selection for touch in one of the windows. This may lead
+to memory corruptions as the array is overflown.
+
+Signed-off-by: Carlos Garnacho <carlosg at gnome.org>
+Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
+Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
+---
+ dix/touch.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/dix/touch.c b/dix/touch.c
+index e64a626..5f77be5 100644
+--- a/dix/touch.c
++++ b/dix/touch.c
+@@ -572,8 +572,8 @@ TouchBuildSprite(DeviceIntPtr sourcedev, TouchPointInfoPtr ti,
+ return FALSE;
+
+ /* Mark which grabs/event selections we're delivering to: max one grab per
+- * window plus the bottom-most event selection. */
+- ti->listeners = calloc(sprite->spriteTraceGood + 1, sizeof(*ti->listeners));
++ * window plus the bottom-most event selection, plus any active grab. */
++ ti->listeners = calloc(sprite->spriteTraceGood + 2, sizeof(*ti->listeners));
+ if (!ti->listeners) {
+ sprite->spriteTraceGood = 0;
+ return FALSE;
+--
+1.7.11.7
+
diff --git a/0001-Xi-Call-UpdateDeviceState-after-the-first-emulated-m.patch b/0001-Xi-Call-UpdateDeviceState-after-the-first-emulated-m.patch
new file mode 100644
index 0000000..91fd638
--- /dev/null
+++ b/0001-Xi-Call-UpdateDeviceState-after-the-first-emulated-m.patch
@@ -0,0 +1,60 @@
+From 0068a5ae02c6b9ba3a7c8e83de452b6383222b8d Mon Sep 17 00:00:00 2001
+From: Carlos Garnacho <carlosg at gnome.org>
+Date: Mon, 29 Oct 2012 18:33:50 +0100
+Subject: [PATCH] Xi: Call UpdateDeviceState() after the first emulated motion
+ event
+
+The emulated motion event that happens before TouchBegin/ButtonPress should
+contain no buttons set in the mask, as it virtually happens at a time when
+the button is not yet pressed. This is known to confuse GTK+ and Abiword
+to different degrees, as enclosing button press/release events are expected
+around changes in the button mask.
+
+Signed-off-by: Carlos Garnacho <carlosg at gnome.org>
+Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
+---
+ Xi/exevents.c | 15 ++++++++++-----
+ 1 file changed, 10 insertions(+), 5 deletions(-)
+
+diff --git a/Xi/exevents.c b/Xi/exevents.c
+index 4cbeb37..769bb41 100644
+--- a/Xi/exevents.c
++++ b/Xi/exevents.c
+@@ -1568,15 +1568,16 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
+ else
+ touchid = ev->device_event.touchid;
+
+- if (emulate_pointer)
+- UpdateDeviceState(dev, &ev->device_event);
+-
+ if (type == ET_TouchBegin) {
+ ti = TouchBeginTouch(dev, ev->device_event.sourceid, touchid,
+ emulate_pointer);
+ }
+- else
++ else {
++ if (emulate_pointer)
++ UpdateDeviceState(dev, &ev->device_event);
++
+ ti = TouchFindByClientID(dev, touchid);
++ }
+
+ /* Under the following circumstances we create a new touch record for an
+ * existing touch:
+@@ -1615,8 +1616,12 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
+ /* if emulate_pointer is set, emulate the motion event right
+ * here, so we can ignore it for button event emulation. TouchUpdate
+ * events which _only_ emulate motion just work normally */
+- if (emulate_pointer && ev->any.type != ET_TouchUpdate)
++ if (emulate_pointer && ev->any.type != ET_TouchUpdate) {
+ DeliverEmulatedMotionEvent(dev, ti, ev);
++
++ if (ev->any.type == ET_TouchBegin)
++ UpdateDeviceState(dev, &ev->device_event);
++ }
+ if (emulate_pointer && IsMaster(dev))
+ CheckMotion(&ev->device_event, dev);
+
+--
+1.7.11.7
+
diff --git a/0001-Xi-Don-t-check-for-TOUCH_END-it-s-never-set.patch b/0001-Xi-Don-t-check-for-TOUCH_END-it-s-never-set.patch
new file mode 100644
index 0000000..7cb6326
--- /dev/null
+++ b/0001-Xi-Don-t-check-for-TOUCH_END-it-s-never-set.patch
@@ -0,0 +1,36 @@
+From 3e6358ee6c33979329b78fe2097a1fdf76fb69cd Mon Sep 17 00:00:00 2001
+From: Daniel Drake <dsd at laptop.org>
+Date: Fri, 7 Sep 2012 21:48:35 -0400
+Subject: [PATCH] Xi: Don't check for TOUCH_END, it's never set
+
+This flag is never set, so checking for it here means that we'll
+never release the simulated mouse button press after the user touches
+(and releases) the touchscreen for the first time.
+
+Fixes a problem where the XO laptop touchpad became totally
+unusable after touching the screen for the first time (since X then
+behaved as if the mouse button was held down all the time).
+
+Signed-off-by: Daniel Drake <dsd at laptop.org>
+Reviewed-by: Chase Douglas <chase.douglas at canonical.com>
+Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
+---
+ Xi/exevents.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/Xi/exevents.c b/Xi/exevents.c
+index 494d07e..6ed4991 100644
+--- a/Xi/exevents.c
++++ b/Xi/exevents.c
+@@ -949,8 +949,6 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent *event)
+
+ if (!(event->flags & TOUCH_POINTER_EMULATED))
+ return DONT_PROCESS;
+- if (!(event->flags & TOUCH_END))
+- return DONT_PROCESS;
+
+ DecreaseButtonCount(device, key, &t->buttonsDown, &t->motionMask,
+ &t->state);
+--
+1.7.11.7
+
diff --git a/0001-Xi-don-t-deliver-TouchEnd-to-a-client-waiting-for-To.patch b/0001-Xi-don-t-deliver-TouchEnd-to-a-client-waiting-for-To.patch
new file mode 100644
index 0000000..143fc7a
--- /dev/null
+++ b/0001-Xi-don-t-deliver-TouchEnd-to-a-client-waiting-for-To.patch
@@ -0,0 +1,37 @@
+From 676447190190d8546165e21be242cf16dd69f5ae Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer at who-t.net>
+Date: Wed, 17 Oct 2012 14:13:29 +1000
+Subject: [PATCH] Xi: don't deliver TouchEnd to a client waiting for
+ TouchBegin (#55738)
+
+If a client is still waiting for the TouchBegin, don't deliver a TouchEnd
+event.
+
+X.Org Bug 55738 <http://bugs.freedesktop.org/show_bug.cgi?id=55738>
+
+Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
+Tested-by: Thomas Jaeger <thjaeger at gmail.com>
+Reviewed-by: Keith Packard <keithp at keithp.com>
+---
+ Xi/exevents.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/Xi/exevents.c b/Xi/exevents.c
+index 6ed4991..4cbeb37 100644
+--- a/Xi/exevents.c
++++ b/Xi/exevents.c
+@@ -1862,6 +1862,11 @@ DeliverTouchEndEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, InternalEvent *ev,
+ goto out;
+ }
+
++ if (listener->state == LISTENER_AWAITING_BEGIN) {
++ listener->state = LISTENER_HAS_END;
++ goto out;
++ }
++
+ /* Event in response to reject */
+ if (ev->device_event.flags & TOUCH_REJECT) {
+ if (listener->state != LISTENER_HAS_END)
+--
+1.7.11.7
+
diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec
index 4a671e2..36c0f2e 100644
--- a/xorg-x11-server.spec
+++ b/xorg-x11-server.spec
@@ -43,7 +43,7 @@
Summary: X.Org X11 X server
Name: xorg-x11-server
Version: 1.13.0
-Release: 5%{?gitdate:.%{gitdate}}%{dist}
+Release: 6%{?gitdate:.%{gitdate}}%{dist}
URL: http://www.x.org
License: MIT
Group: User Interface/X
@@ -119,6 +119,12 @@ Patch7054: 0001-config-udev-ignore-change-on-drm-devices.patch
# device (ie virtual machine usb tablet)
Patch7055: 0001-dix-set-the-device-transformation-matrix.patch
+# Bug 871064 - Add touchscreen fixes for F18
+Patch7056: 0001-Sync-TouchListener-memory-allocation-with-population.patch
+Patch7057: 0001-Xi-Call-UpdateDeviceState-after-the-first-emulated-m.patch
+Patch7058: 0001-Xi-Don-t-check-for-TOUCH_END-it-s-never-set.patch
+Patch7059: 0001-Xi-don-t-deliver-TouchEnd-to-a-client-waiting-for-To.patch
+
%global moduledir %{_libdir}/xorg/modules
%global drimoduledir %{_libdir}/dri
%global sdkdir %{_includedir}/xorg
@@ -591,6 +597,9 @@ rm -rf $RPM_BUILD_ROOT
%{xserver_source_dir}
%changelog
+* Tue Oct 30 2012 Peter Hutterer <peter.hutterer at redhat.com> 1.13.0-6
+- Add touchscreen fixes (including pointer emulation) #871064
+
* Thu Sep 20 2012 Peter Hutterer <peter.hutterer at redhat.com> 1.13.0-5
- Set the transformation matrix to the unity matrix to avoid spurious cursor
jumps (#852841)
More information about the scm-commits
mailing list