From f3b303024e34cabb98896b4d8b11e3860c76203d Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 30 Oct 2012 11:25:42 +1000 Subject: [PATCH] Add touchscreen fixes (including pointer emulation) #871064 --- ...er-memory-allocation-with-population.patch | 36 +++++++++++ ...viceState-after-the-first-emulated-m.patch | 60 +++++++++++++++++++ ...t-check-for-TOUCH_END-it-s-never-set.patch | 36 +++++++++++ ...-TouchEnd-to-a-client-waiting-for-To.patch | 37 ++++++++++++ xorg-x11-server.spec | 11 +++- 5 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 0001-Sync-TouchListener-memory-allocation-with-population.patch create mode 100644 0001-Xi-Call-UpdateDeviceState-after-the-first-emulated-m.patch create mode 100644 0001-Xi-Don-t-check-for-TOUCH_END-it-s-never-set.patch create mode 100644 0001-Xi-don-t-deliver-TouchEnd-to-a-client-waiting-for-To.patch 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 +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 +Reviewed-by: Peter Hutterer +Signed-off-by: Peter Hutterer +--- + 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 +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 +Signed-off-by: Peter Hutterer +--- + 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 +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 +Reviewed-by: Chase Douglas +Signed-off-by: Peter Hutterer +--- + 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 +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 + +Signed-off-by: Peter Hutterer +Tested-by: Thomas Jaeger +Reviewed-by: Keith Packard +--- + 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 1.13.0-6 +- Add touchscreen fixes (including pointer emulation) #871064 + * Thu Sep 20 2012 Peter Hutterer 1.13.0-5 - Set the transformation matrix to the unity matrix to avoid spurious cursor jumps (#852841)