ChangeLog | 232 ++++++++++ Xi/exevents.c | 190 ++++---- Xi/xiallowev.c | 81 +-- configure.ac | 2 debian/changelog | 24 + debian/patches/501_touch_accept_end.patch | 95 ++++ debian/patches/502_indirect_touch_window_set.patch | 40 + debian/patches/600-Revert-dix-deduplicate-callers-of-DeliverDeviceEvent.patch | 59 -- debian/patches/601-Store-window-pointer-in-touch-listener-record.patch | 110 ---- debian/patches/602-Factor-out-TouchEnd-generation-and-delivery.patch | 184 ------- debian/patches/603-Export-TouchEventRejected-as-TouchRejected.patch | 115 ---- debian/patches/604-Move-AllowTouch-to-dix-touch.c-and-rename-to-TouchAc.patch | 155 ------ debian/patches/605-Check-for-proper-window-ID-when-processing-touch-all.patch | 87 --- debian/patches/606-Implement-early-touch-reject.patch | 37 - debian/patches/607-Implement-touch-early-accept.patch | 108 ---- debian/patches/608-dix-fix-an-out-of-memory-crash.patch | 28 - debian/patches/609-Xi-handle-new-XIAllowEvents-request-in-inputproto-2..patch | 102 ---- debian/patches/610-Fix-scrolling.patch | 121 ----- debian/patches/611-Fix-touch-punt-crash.patch | 31 - debian/patches/612-Fix-vcp-touches-corruption.patch | 45 - debian/patches/613-Keep-vcp-touch-class.patch | 42 - debian/patches/series | 18 dix/events.c | 39 - dix/getevents.c | 21 dix/inpututils.c | 3 dix/touch.c | 73 ++- include/exevents.h | 7 include/input.h | 7 include/inputstr.h | 1 test/.gitignore | 1 test/xi2/.gitignore | 1 31 files changed, 650 insertions(+), 1409 deletions(-)
New commits: commit 251f795b62eb8498662498fecbd6f99567e4d6e2 Author: Chase Douglas <[email protected]> Date: Wed Mar 7 15:36:34 2012 -0800 releasing version 2:1.11.4-0ubuntu5 diff --git a/debian/changelog b/debian/changelog index f1aa5e9..1b7b6a9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -xorg-server (2:1.11.4-0ubuntu5) UNRELEASED; urgency=low +xorg-server (2:1.11.4-0ubuntu5) precise; urgency=low * Update to 1.12 input stack * Drop input patches that have been merged upstream: @@ -20,7 +20,7 @@ xorg-server (2:1.11.4-0ubuntu5) UNRELEASED; urgency=low - Add temporary patch 501_touch_accept_end.patch - Add temporary patch 502_indirect_touch_window_set.patch - -- Chase Douglas <[email protected]> Wed, 07 Mar 2012 15:34:09 -0800 + -- Chase Douglas <[email protected]> Wed, 07 Mar 2012 15:36:20 -0800 xorg-server (2:1.11.4-0ubuntu4) precise; urgency=low commit f0d61a62e95a3cef3240cae7e52fdd05ba76e6a9 Author: Chase Douglas <[email protected]> Date: Wed Mar 7 15:33:16 2012 -0800 Fix indirect touch grab handling (LP: #929408) * Fix indirect touch grab handling (LP: #929408) - Add temporary patch 501_touch_accept_end.patch - Add temporary patch 502_indirect_touch_window_set.patch diff --git a/debian/changelog b/debian/changelog index 08d333c..f1aa5e9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -16,8 +16,11 @@ xorg-server (2:1.11.4-0ubuntu5) UNRELEASED; urgency=low - 611-Fix-touch-punt-crash.patch - 612-Fix-vcp-touches-corruption.patch - 613-Keep-vcp-touch-class.patch + * Fix indirect touch grab handling (LP: #929408) + - Add temporary patch 501_touch_accept_end.patch + - Add temporary patch 502_indirect_touch_window_set.patch - -- Chase Douglas <[email protected]> Mon, 05 Mar 2012 15:16:28 -0800 + -- Chase Douglas <[email protected]> Wed, 07 Mar 2012 15:34:09 -0800 xorg-server (2:1.11.4-0ubuntu4) precise; urgency=low diff --git a/debian/patches/501_touch_accept_end.patch b/debian/patches/501_touch_accept_end.patch new file mode 100644 index 0000000..03f7524 --- /dev/null +++ b/debian/patches/501_touch_accept_end.patch @@ -0,0 +1,95 @@ +From 40cd6abb66787c79465cda03c17297a06d1cd848 Mon Sep 17 00:00:00 2001 +From: Chase Douglas <[email protected]> +Date: Fri, 2 Mar 2012 14:40:07 -0800 +Subject: [PATCH 1/2] Xi: Fix TouchEnd to TouchUpdate change for one accepted + grab + +If there is only one listener of a touch, the listener is a grab, and is +accepted before the touch has ended, the current code will not end the +touch record when the touch does end. + +This change adds a listener state for when a touch is accepted but has +not yet ended. We now keep the touch record alive in this state, but end +it when the touch ends. + +Signed-off-by: Chase Douglas <[email protected]> +--- + Xi/exevents.c | 25 ++++++++++++++++--------- + include/input.h | 3 ++- + 2 files changed, 18 insertions(+), 10 deletions(-) + +diff --git a/Xi/exevents.c b/Xi/exevents.c +index f390f67..d71e604 100644 +--- a/Xi/exevents.c ++++ b/Xi/exevents.c +@@ -1252,6 +1252,8 @@ ProcessTouchOwnershipEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, + /* Owner accepted after receiving end */ + if (ti->listeners[0].state == LISTENER_HAS_END) + TouchEndTouch(dev, ti); ++ else ++ ti->listeners[0].state = LISTENER_HAS_ACCEPTED; + } else { /* this is the very first ownership event for a grab */ + DeliverTouchEvents(dev, ti, (InternalEvent*)ev, ev->resource); + } +@@ -1781,7 +1783,11 @@ DeliverTouchBeginEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, InternalEvent *ev + { + if (has_ownershipmask) + TouchSendOwnershipEvent(dev, ti, 0, listener->listener); +- state = LISTENER_IS_OWNER; ++ ++ if (!has_ownershipmask || listener->type == LISTENER_REGULAR) ++ state = LISTENER_HAS_ACCEPTED; ++ else ++ state = LISTENER_IS_OWNER; + } + listener->state = state; + +@@ -1812,22 +1818,23 @@ DeliverTouchEndEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, InternalEvent *ev, + listener->state = LISTENER_HAS_END; + } else if (TouchResourceIsOwner(ti, listener->listener)) + { ++ Bool normal_end = !(ev->device_event.flags & TOUCH_ACCEPT); ++ + /* FIXME: what about early acceptance */ +- if (!(ev->device_event.flags & TOUCH_ACCEPT)) +- { +- if (listener->state != LISTENER_HAS_END) +- rc = DeliverOneTouchEvent(client, dev, ti, grab, win, ev); +- listener->state = LISTENER_HAS_END; +- } ++ if (normal_end && listener->state != LISTENER_HAS_END) ++ rc = DeliverOneTouchEvent(client, dev, ti, grab, win, ev); ++ + if ((ti->num_listeners > 1 || +- (listener->type == LISTENER_GRAB && +- xi2mask_isset(xi2mask, dev, XI_TouchOwnership))) && ++ listener->state != LISTENER_HAS_ACCEPTED) && + (ev->device_event.flags & (TOUCH_ACCEPT|TOUCH_REJECT)) == 0) + { + ev->any.type = ET_TouchUpdate; + ev->device_event.flags |= TOUCH_PENDING_END; + ti->pending_finish = TRUE; + } ++ ++ if (normal_end) ++ listener->state = LISTENER_HAS_END; + } + + out: +diff --git a/include/input.h b/include/input.h +index b7825a7..1e9e0fd 100644 +--- a/include/input.h ++++ b/include/input.h +@@ -585,7 +585,8 @@ enum TouchListenerState{ + LISTENER_AWAITING_OWNER, /**< Waiting for a TouchOwnership event */ + LISTENER_EARLY_ACCEPT, /**< Waiting for ownership, has already + accepted */ +- LISTENER_IS_OWNER, /**< Is the current owner */ ++ LISTENER_IS_OWNER, /**< Is the current owner, hasn't accepted */ ++ LISTENER_HAS_ACCEPTED, /**< Is the current owner, has accepted */ + LISTENER_HAS_END, /**< Has already received the end event */ + }; + +-- +1.7.9 + diff --git a/debian/patches/502_indirect_touch_window_set.patch b/debian/patches/502_indirect_touch_window_set.patch new file mode 100644 index 0000000..5eafe81 --- /dev/null +++ b/debian/patches/502_indirect_touch_window_set.patch @@ -0,0 +1,40 @@ +From d128edad09452246e18b38cef151cad226f1c5f5 Mon Sep 17 00:00:00 2001 +From: Chase Douglas <[email protected]> +Date: Wed, 7 Mar 2012 15:20:12 -0800 +Subject: [PATCH 2/2] Use a new sprite trace for indirect touches when all + touches have physically ended + +All touches of an indirect device, such as a trackpad, are sent to the +same window set. When there are no active touches, a new window set is +created; otherwise, the window set of an existing touch is copied. + +The current code checks for any logically active touches. This includes +touches that have physically ended but are still logically active due to +unhandled touch grabs. Instead, we want a new window set whenever there +are no physically active touches. + +This change skips over logically active but pending end touches, which +are touches that have physically ended. + +Signed-off-by: Chase Douglas <[email protected]> +--- + dix/touch.c | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +diff --git a/dix/touch.c b/dix/touch.c +index d04801c..0aa24f2 100644 +--- a/dix/touch.c ++++ b/dix/touch.c +@@ -524,7 +524,8 @@ TouchBuildDependentSpriteTrace(DeviceIntPtr dev, SpritePtr sprite) + /* All touches should have the same sprite trace, so find and reuse an + * existing touch's sprite if possible, else use the device's sprite. */ + for (i = 0; i < t->num_touches; i++) +- if (t->touches[i].sprite.spriteTraceGood > 0) ++ if (!t->touches[i].pending_finish && ++ t->touches[i].sprite.spriteTraceGood > 0) + break; + if (i < t->num_touches) + srcsprite = &t->touches[i].sprite; +-- +1.7.9 + diff --git a/debian/patches/series b/debian/patches/series index f78b1c0..fde4653 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -32,3 +32,5 @@ # Temporary, until it's reviewed & accepted upstream 500_pointer_barrier_thresholds.diff +501_touch_accept_end.patch +502_indirect_touch_window_set.patch commit 3ab63fb459a94992c7996236739d71dcd26a04a8 Author: Chase Douglas <[email protected]> Date: Mon Mar 5 15:17:46 2012 -0800 Drop input patches that have been merged upstream: * Drop input patches that have been merged upstream: - 600-Revert-dix-deduplicate-callers-of-DeliverDeviceEvent.patch - 601-Store-window-pointer-in-touch-listener-record.patch - 602-Factor-out-TouchEnd-generation-and-delivery.patch - 603-Export-TouchEventRejected-as-TouchRejected.patch - 604-Move-AllowTouch-to-dix-touch.c-and-rename-to-TouchAc.patch - 605-Check-for-proper-window-ID-when-processing-touch-all.patch - 606-Implement-early-touch-reject.patch - 607-Implement-touch-early-accept.patch - 608-dix-fix-an-out-of-memory-crash.patch - 609-Xi-handle-new-XIAllowEvents-request-in-inputproto-2..patch - 610-Fix-scrolling.patch - 611-Fix-touch-punt-crash.patch - 612-Fix-vcp-touches-corruption.patch - 613-Keep-vcp-touch-class.patch diff --git a/debian/changelog b/debian/changelog index 5ce4b7e..08d333c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,8 +1,23 @@ xorg-server (2:1.11.4-0ubuntu5) UNRELEASED; urgency=low * Update to 1.12 input stack + * Drop input patches that have been merged upstream: + - 600-Revert-dix-deduplicate-callers-of-DeliverDeviceEvent.patch + - 601-Store-window-pointer-in-touch-listener-record.patch + - 602-Factor-out-TouchEnd-generation-and-delivery.patch + - 603-Export-TouchEventRejected-as-TouchRejected.patch + - 604-Move-AllowTouch-to-dix-touch.c-and-rename-to-TouchAc.patch + - 605-Check-for-proper-window-ID-when-processing-touch-all.patch + - 606-Implement-early-touch-reject.patch + - 607-Implement-touch-early-accept.patch + - 608-dix-fix-an-out-of-memory-crash.patch + - 609-Xi-handle-new-XIAllowEvents-request-in-inputproto-2..patch + - 610-Fix-scrolling.patch + - 611-Fix-touch-punt-crash.patch + - 612-Fix-vcp-touches-corruption.patch + - 613-Keep-vcp-touch-class.patch - -- Chase Douglas <[email protected]> Mon, 05 Mar 2012 15:11:25 -0800 + -- Chase Douglas <[email protected]> Mon, 05 Mar 2012 15:16:28 -0800 xorg-server (2:1.11.4-0ubuntu4) precise; urgency=low diff --git a/debian/patches/600-Revert-dix-deduplicate-callers-of-DeliverDeviceEvent.patch b/debian/patches/600-Revert-dix-deduplicate-callers-of-DeliverDeviceEvent.patch deleted file mode 100644 index 2630963..0000000 --- a/debian/patches/600-Revert-dix-deduplicate-callers-of-DeliverDeviceEvent.patch +++ /dev/null @@ -1,59 +0,0 @@ -From f92ba92adfce0e1975feb54ab0e1165b7c2a7bea Mon Sep 17 00:00:00 2001 -From: Peter Hutterer <[email protected]> -Date: Sat, 4 Feb 2012 19:27:21 +1000 -Subject: [PATCH] Revert "dix: deduplicate callers of DeliverDeviceEvents in - DeliverGrabbedEvents" - -This call was supposed to have no functional changes but in some cases -DeliverDeviceEvents() was called with a uninitialised win variable. -Revert, safer than trying to sort this out otherwise. - -This reverts commit 6eff14a789341d366b3013c5aa020e959c954651. - -Reported-by: Mathieu Taillefumier <[email protected]> -Signed-off-by: Peter Hutterer <[email protected]> -Reviewed-by: Keith Packard <[email protected]> ---- - dix/events.c | 18 ++++++++---------- - 1 files changed, 8 insertions(+), 10 deletions(-) - -diff --git a/dix/events.c b/dix/events.c -index 04d7fb5..3c7d5d0 100644 ---- a/dix/events.c -+++ b/dix/events.c -@@ -4266,7 +4266,6 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev, - if (grab->ownerEvents) - { - WindowPtr focus; -- WindowPtr win; - - /* Hack: Some pointer device have a focus class. So we need to check - * for the type of event, to see if we really want to deliver it to -@@ -4283,16 +4282,15 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev, - else - focus = PointerRootWin; - if (focus == PointerRootWin) -- { -- win = pSprite->win; -- focus = NullWindow; -- } else if (focus && (focus == pSprite->win || -- IsParent(focus, pSprite->win))) -- win = pSprite->win; -+ deliveries = DeliverDeviceEvents(pSprite->win, event, grab, -+ NullWindow, thisDev); -+ else if (focus && (focus == pSprite->win || -+ IsParent(focus, pSprite->win))) -+ deliveries = DeliverDeviceEvents(pSprite->win, event, grab, focus, -+ thisDev); - else if (focus) -- win = focus; -- -- deliveries = DeliverDeviceEvents(win, event, grab, focus, thisDev); -+ deliveries = DeliverDeviceEvents(focus, event, grab, focus, -+ thisDev); - } - if (!deliveries) - { --- -1.7.8.3 - diff --git a/debian/patches/601-Store-window-pointer-in-touch-listener-record.patch b/debian/patches/601-Store-window-pointer-in-touch-listener-record.patch deleted file mode 100644 index 58ee8db..0000000 --- a/debian/patches/601-Store-window-pointer-in-touch-listener-record.patch +++ /dev/null @@ -1,110 +0,0 @@ -From ab60cadc2afb9d8882144e30fde11c3ef0f999cd Mon Sep 17 00:00:00 2001 -From: Chase Douglas <[email protected]> -Date: Fri, 3 Feb 2012 16:19:05 -0800 -Subject: [PATCH] Store window pointer in touch listener record - -Signed-off-by: Chase Douglas <[email protected]> -Signed-off-by: Peter Hutterer <[email protected]> -Reviewed-by: Peter Hutterer <[email protected]> ---- - dix/touch.c | 16 ++++++++++------ - include/input.h | 3 ++- - include/inputstr.h | 1 + - 3 files changed, 13 insertions(+), 7 deletions(-) - -diff --git a/dix/touch.c b/dix/touch.c -index db0bf33..b42859d 100644 ---- a/dix/touch.c -+++ b/dix/touch.c -@@ -697,12 +697,14 @@ TouchResourceIsOwner(TouchPointInfoPtr ti, XID resource) - */ - void - TouchAddListener(TouchPointInfoPtr ti, XID resource, enum InputLevel level, -- enum TouchListenerType type, enum TouchListenerState state) -+ enum TouchListenerType type, enum TouchListenerState state, -+ WindowPtr window) - { - ti->listeners[ti->num_listeners].listener = resource; - ti->listeners[ti->num_listeners].level = level; - ti->listeners[ti->num_listeners].state = state; - ti->listeners[ti->num_listeners].type = type; -+ ti->listeners[ti->num_listeners].window = window; - ti->num_listeners++; - } - -@@ -753,7 +755,7 @@ TouchAddGrabListener(DeviceIntPtr dev, TouchPointInfoPtr ti, - } - - TouchAddListener(ti, grab->resource, grab->grabtype, -- type, LISTENER_AWAITING_BEGIN); -+ type, LISTENER_AWAITING_BEGIN, grab->window); - ti->num_grabs++; - } - -@@ -814,7 +816,7 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti, - TouchEventHistoryAllocate(ti); - - TouchAddListener(ti, iclients->resource, XI2, -- type, LISTENER_AWAITING_BEGIN); -+ type, LISTENER_AWAITING_BEGIN, win); - return TRUE; - } - } -@@ -830,7 +832,8 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti, - - TouchEventHistoryAllocate(ti); - TouchAddListener(ti, iclients->resource, XI, -- LISTENER_POINTER_REGULAR, LISTENER_AWAITING_BEGIN); -+ LISTENER_POINTER_REGULAR, LISTENER_AWAITING_BEGIN, -+ win); - return TRUE; - } - } -@@ -845,7 +848,8 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti, - { - TouchEventHistoryAllocate(ti); - TouchAddListener(ti, win->drawable.id, CORE, -- LISTENER_POINTER_REGULAR, LISTENER_AWAITING_BEGIN); -+ LISTENER_POINTER_REGULAR, LISTENER_AWAITING_BEGIN, -+ win); - return TRUE; - } - -@@ -857,7 +861,7 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti, - - TouchEventHistoryAllocate(ti); - TouchAddListener(ti, iclients->resource, CORE, -- type, LISTENER_AWAITING_BEGIN); -+ type, LISTENER_AWAITING_BEGIN, win); - return TRUE; - } - } -diff --git a/include/input.h b/include/input.h -index fb45617..53645b4 100644 ---- a/include/input.h -+++ b/include/input.h -@@ -613,7 +613,8 @@ extern void TouchEventHistoryPush(TouchPointInfoPtr ti, const DeviceEvent *ev); - extern void TouchEventHistoryReplay(TouchPointInfoPtr ti, DeviceIntPtr dev, XID resource); - extern Bool TouchResourceIsOwner(TouchPointInfoPtr ti, XID resource); - extern void TouchAddListener(TouchPointInfoPtr ti, XID resource, enum InputLevel level, -- enum TouchListenerType type, enum TouchListenerState state); -+ enum TouchListenerType type, enum TouchListenerState state, -+ WindowPtr window); - extern Bool TouchRemoveListener(TouchPointInfoPtr ti, XID resource); - extern void TouchSetupListeners(DeviceIntPtr dev, TouchPointInfoPtr ti, InternalEvent *ev); - extern Bool TouchEnsureSprite(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, -diff --git a/include/inputstr.h b/include/inputstr.h -index c3297db..4e28bc7 100644 ---- a/include/inputstr.h -+++ b/include/inputstr.h -@@ -314,6 +314,7 @@ typedef struct _TouchPointInfo { - enum TouchListenerType type; - enum TouchListenerState state; - enum InputLevel level; /* matters only for emulating touches */ -+ WindowPtr window; - } *listeners; - int num_listeners; - int num_grabs; /* number of open grabs on this touch --- -1.7.8.3 - diff --git a/debian/patches/602-Factor-out-TouchEnd-generation-and-delivery.patch b/debian/patches/602-Factor-out-TouchEnd-generation-and-delivery.patch deleted file mode 100644 index 1202d02..0000000 --- a/debian/patches/602-Factor-out-TouchEnd-generation-and-delivery.patch +++ /dev/null @@ -1,184 +0,0 @@ -From 19073425e5df1317f73f74ce0b95ab24e0e0da14 Mon Sep 17 00:00:00 2001 -From: Chase Douglas <[email protected]> -Date: Fri, 3 Feb 2012 16:19:06 -0800 -Subject: [PATCH] Factor out TouchEnd generation and delivery - -The server often needs to generate and deliver TouchEnd events for -circumstances including touch grab acceptance and rejection. This change -refactors the code so it can be used more easily. - -Signed-off-by: Chase Douglas <[email protected]> -Signed-off-by: Peter Hutterer <[email protected]> -Reviewed-by: Peter Hutterer <[email protected]> ---- - Xi/exevents.c | 103 ++++++++++++++++++++------------------------------------ - 1 files changed, 37 insertions(+), 66 deletions(-) - -diff --git a/Xi/exevents.c b/Xi/exevents.c -index 6b2db4b..218df2a 100644 ---- a/Xi/exevents.c -+++ b/Xi/exevents.c -@@ -1089,17 +1089,46 @@ DeliverOneTouchEvent(ClientPtr client, DeviceIntPtr dev, TouchPointInfoPtr ti, - } - - /** -- * If the current owner has rejected the event, deliver the -- * TouchOwnership/TouchBegin to the next item in the sprite stack. -+ * Generate and deliver a TouchEnd event. -+ * -+ * @param dev The device to deliver the event for. -+ * @param ti The touch point record to deliver the event for. -+ * @param flags Internal event flags. The called does not need to provide -+ * TOUCH_CLIENT_ID and TOUCH_POINTER_EMULATED, this function will ensure -+ * they are set appropriately. -+ * @param resource The client resource to deliver to, or 0 for all clients. - */ - static void --TouchPuntToNextOwner(DeviceIntPtr dev, TouchPointInfoPtr ti, -- TouchOwnershipEvent *ev) -+EmitTouchEnd(DeviceIntPtr dev, TouchPointInfoPtr ti, int flags, XID resource) - { - InternalEvent *tel = InitEventList(GetMaximumEventsNum()); - ValuatorMask *mask = valuator_mask_new(2); - int i, nev; - -+ valuator_mask_set_double(mask, 0, -+ valuator_mask_get_double(ti->valuators, 0)); -+ valuator_mask_set_double(mask, 1, -+ valuator_mask_get_double(ti->valuators, 1)); -+ -+ flags |= TOUCH_CLIENT_ID; -+ if (ti->emulate_pointer) -+ flags |= TOUCH_POINTER_EMULATED; -+ nev = GetTouchEvents(tel, dev, ti->client_id, XI_TouchEnd, flags, mask); -+ for (i = 0; i < nev; i++) -+ DeliverTouchEvents(dev, ti, tel + i, resource); -+ -+ valuator_mask_free(&mask); -+ FreeEventList(tel, GetMaximumEventsNum()); -+} -+ -+/** -+ * If the current owner has rejected the event, deliver the -+ * TouchOwnership/TouchBegin to the next item in the sprite stack. -+ */ -+static void -+TouchPuntToNextOwner(DeviceIntPtr dev, TouchPointInfoPtr ti, -+ TouchOwnershipEvent *ev) -+{ - /* Deliver the ownership */ - if (ti->listeners[0].state == LISTENER_AWAITING_OWNER) - DeliverTouchEvents(dev, ti, (InternalEvent*)ev, ti->listeners[0].listener); -@@ -1111,60 +1140,30 @@ TouchPuntToNextOwner(DeviceIntPtr dev, TouchPointInfoPtr ti, - if (ti->num_listeners == 1 && ti->num_grabs == 0 && - ti->pending_finish) - { -- int flags; -- valuator_mask_set_double(mask, 0, -- valuator_mask_get_double(ti->valuators, 0)); -- valuator_mask_set_double(mask, 1, -- valuator_mask_get_double(ti->valuators, 1)); -- -- flags = TOUCH_CLIENT_ID; -- if (ti->emulate_pointer) -- flags |= TOUCH_POINTER_EMULATED; -- nev = GetTouchEvents(tel, dev, ti->client_id, XI_TouchEnd, flags, mask); -- for (i = 0; i < nev; i++) -- DeliverTouchEvents(dev, ti, tel + i, 0); -+ EmitTouchEnd(dev, ti, 0, 0); - TouchEndTouch(dev, ti); - } -- -- valuator_mask_free(&mask); -- FreeEventList(tel, GetMaximumEventsNum()); - } - - static void - TouchEventRejected(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, - TouchOwnershipEvent *ev) - { -- InternalEvent *tel = InitEventList(GetMaximumEventsNum()); -- ValuatorMask *mask = valuator_mask_new(2); - Bool was_owner = (ev->resource == ti->listeners[0].listener); - void *grab; -- int nev, i; - - - /* Send a TouchEnd event to the resource being removed, but only if they - * haven't received one yet already */ - if (ti->listeners[0].state != LISTENER_HAS_END) -- { -- int flags; -- valuator_mask_set_double(mask, 0, -- valuator_mask_get_double(ti->valuators, 0)); -- valuator_mask_set_double(mask, 1, -- valuator_mask_get_double(ti->valuators, 1)); -- -- flags = TOUCH_CLIENT_ID|TOUCH_REJECT; -- if (ti->emulate_pointer) -- flags |= TOUCH_POINTER_EMULATED; -- nev = GetTouchEvents(tel, sourcedev, ti->client_id, XI_TouchEnd, flags, mask); -- for (i = 0; i < nev; i++) -- DeliverTouchEvents(sourcedev, ti, tel + i, ev->resource); -- } -+ EmitTouchEnd(sourcedev, ti, TOUCH_REJECT, ev->resource); - - /* If there are no other listeners left, and the touchpoint is pending - * finish, then we can just kill it now. */ - if (ti->num_listeners == 1 && ti->pending_finish) - { - TouchEndTouch(sourcedev, ti); -- goto out; -+ return; - } - - /* Remove the resource from the listener list, updating -@@ -1180,10 +1179,6 @@ TouchEventRejected(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, - * the TouchOwnership or TouchBegin event to the new owner. */ - if (ti->num_listeners > 0 && was_owner) - TouchPuntToNextOwner(sourcedev, ti, ev); -- --out: -- FreeEventList(tel, GetMaximumEventsNum()); -- valuator_mask_free(&mask); - } - - /** -@@ -1201,33 +1196,9 @@ ProcessTouchOwnershipEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, - if (ev->reason == XIRejectTouch) - TouchEventRejected(dev, ti, ev); - else if (ev->reason == XIAcceptTouch) { -- int flags; -- int nev, i; -- ValuatorMask *mask; -- -- InternalEvent *tel = InitEventList(GetMaximumEventsNum()); -- -- mask = valuator_mask_new(dev->valuator->numAxes); -- valuator_mask_set_double(mask, 0, -- valuator_mask_get_double(ti->valuators, 0)); -- valuator_mask_set_double(mask, 1, -- valuator_mask_get_double(ti->valuators, 1)); -- -- /* FIXME: what about early acceptance? a client may accept before it -- * owns the touch. */ -- - /* The touch owner has accepted the touch. Send TouchEnd events to - * everyone else, and truncate the list of listeners. */ -- flags = TOUCH_ACCEPT|TOUCH_CLIENT_ID; -- if (ti->emulate_pointer) -- flags |= TOUCH_POINTER_EMULATED; -- nev = GetTouchEvents(tel, dev, ti->client_id, XI_TouchEnd, -- flags, mask); -- for (i = 0; i < nev; i++) -- DeliverTouchEvents(dev, ti, tel + i, 0); -- -- FreeEventList(tel, GetMaximumEventsNum()); -- valuator_mask_free(&mask); -+ EmitTouchEnd(dev, ti, TOUCH_ACCEPT, 0); - - while (ti->num_listeners > 1) - TouchRemoveListener(ti, ti->listeners[1].listener); --- -1.7.8.3 - diff --git a/debian/patches/603-Export-TouchEventRejected-as-TouchRejected.patch b/debian/patches/603-Export-TouchEventRejected-as-TouchRejected.patch deleted file mode 100644 index 5701ece..0000000 --- a/debian/patches/603-Export-TouchEventRejected-as-TouchRejected.patch +++ /dev/null @@ -1,115 +0,0 @@ -From 192b2c9a2ec04522655675ddfe71de5cf974cc7b Mon Sep 17 00:00:00 2001 -From: Chase Douglas <[email protected]> -Date: Fri, 3 Feb 2012 16:19:07 -0800 -Subject: [PATCH] Export TouchEventRejected as TouchRejected - -This function is mostly correct for early reject usage. With a small -change to pass the client resource explicitly and making the -TouchOwnership event optional, it is usable for all rejection scenarios. -This change exports it for use outside Xi/exevents.c and modifies the -name accordingly. - -Signed-off-by: Chase Douglas <[email protected]> -Signed-off-by: Peter Hutterer <[email protected]> -Reviewed-by: Peter Hutterer <[email protected]> ---- - Xi/exevents.c | 38 +++++++++++++++++++++++++++----------- - include/exevents.h | 7 +++++++ - 2 files changed, 34 insertions(+), 11 deletions(-) - -diff --git a/Xi/exevents.c b/Xi/exevents.c -index 218df2a..b0832d0 100644 ---- a/Xi/exevents.c -+++ b/Xi/exevents.c -@@ -1145,18 +1145,34 @@ TouchPuntToNextOwner(DeviceIntPtr dev, TouchPointInfoPtr ti, - } - } - --static void --TouchEventRejected(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, -- TouchOwnershipEvent *ev) -+/** -+ * Process a touch rejection. -+ * -+ * @param sourcedev The source device of the touch sequence. -+ * @param ti The touchpoint info record. -+ * @param resource The resource of the client rejecting the touch. -+ * @param ev TouchOwnership event to send. Set to NULL if no event should be -+ * sent. -+ */ -+void -+TouchRejected(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, XID resource, -+ TouchOwnershipEvent *ev) - { -- Bool was_owner = (ev->resource == ti->listeners[0].listener); -+ Bool was_owner = (resource == ti->listeners[0].listener); - void *grab; -- -+ int i; - - /* Send a TouchEnd event to the resource being removed, but only if they - * haven't received one yet already */ -- if (ti->listeners[0].state != LISTENER_HAS_END) -- EmitTouchEnd(sourcedev, ti, TOUCH_REJECT, ev->resource); -+ for (i = 0; i < ti->num_listeners; i++) -+ { -+ if (ti->listeners[i].listener == resource) -+ { -+ if (ti->listeners[i].state != LISTENER_HAS_END) -+ EmitTouchEnd(sourcedev, ti, TOUCH_REJECT, resource); -+ break; -+ } -+ } - - /* If there are no other listeners left, and the touchpoint is pending - * finish, then we can just kill it now. */ -@@ -1168,16 +1184,16 @@ TouchEventRejected(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, - - /* Remove the resource from the listener list, updating - * ti->num_listeners, as well as ti->num_grabs if it was a grab. */ -- if (TouchRemoveListener(ti, ev->resource)) -+ if (TouchRemoveListener(ti, resource)) - { -- if (dixLookupResourceByType(&grab, ev->resource, RT_PASSIVEGRAB, -+ if (dixLookupResourceByType(&grab, resource, RT_PASSIVEGRAB, - serverClient, DixGetAttrAccess) == Success) - ti->num_grabs--; - } - - /* If the current owner was removed and there are further listeners, deliver - * the TouchOwnership or TouchBegin event to the new owner. */ -- if (ti->num_listeners > 0 && was_owner) -+ if (ev && ti->num_listeners > 0 && was_owner) - TouchPuntToNextOwner(sourcedev, ti, ev); - } - -@@ -1194,7 +1210,7 @@ ProcessTouchOwnershipEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, - { - - if (ev->reason == XIRejectTouch) -- TouchEventRejected(dev, ti, ev); -+ TouchRejected(dev, ti, ev->resource, ev); - else if (ev->reason == XIAcceptTouch) { - /* The touch owner has accepted the touch. Send TouchEnd events to - * everyone else, and truncate the list of listeners. */ -diff --git a/include/exevents.h b/include/exevents.h -index 31acb30..fb2ef27 100644 ---- a/include/exevents.h -+++ b/include/exevents.h -@@ -323,6 +323,13 @@ SendEventToAllWindows( - xEvent * /* ev */, - int /* count */); - -+extern void -+TouchRejected( -+ DeviceIntPtr /* sourcedev */, -+ TouchPointInfoPtr /* ti */, -+ XID /* resource */, -+ TouchOwnershipEvent * /* ev */); -+ - extern _X_HIDDEN void XI2EventSwap( - xGenericEvent * /* from */, - xGenericEvent * /* to */); --- -1.7.8.3 - diff --git a/debian/patches/604-Move-AllowTouch-to-dix-touch.c-and-rename-to-TouchAc.patch b/debian/patches/604-Move-AllowTouch-to-dix-touch.c-and-rename-to-TouchAc.patch deleted file mode 100644 index 62207be..0000000 --- a/debian/patches/604-Move-AllowTouch-to-dix-touch.c-and-rename-to-TouchAc.patch +++ /dev/null @@ -1,155 +0,0 @@ -From 9a260e9af83feb5c53ffd3b2da2dc3adf06240a1 Mon Sep 17 00:00:00 2001 -From: Chase Douglas <[email protected]> -Date: Fri, 3 Feb 2012 16:19:08 -0800 -Subject: [PATCH] Move AllowTouch to dix/touch.c, and rename to - TouchAcceptReject - -Signed-off-by: Chase Douglas <[email protected]> -Signed-off-by: Peter Hutterer <[email protected]> -Reviewed-by: Peter Hutterer <[email protected]> ---- - Xi/xiallowev.c | 46 ++-------------------------------------------- - dix/touch.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ - include/input.h | 2 ++ - 3 files changed, 49 insertions(+), 44 deletions(-) - -diff --git a/Xi/xiallowev.c b/Xi/xiallowev.c -index a4b2f57..dab3393 100644 ---- a/Xi/xiallowev.c -+++ b/Xi/xiallowev.c -@@ -57,47 +57,6 @@ SProcXIAllowEvents(ClientPtr client) - return ProcXIAllowEvents(client); - } - --static int --AllowTouch(ClientPtr client, DeviceIntPtr dev, int mode, uint32_t touchid, XID *error) --{ -- TouchPointInfoPtr ti; -- int nev, i; -- InternalEvent *events = InitEventList(GetMaximumEventsNum()); -- -- if (!events) -- return BadAlloc; -- -- if (!dev->touch) -- { -- *error = dev->id; -- return BadDevice; -- } -- -- /* FIXME window is unhandled */ -- -- ti = TouchFindByClientID(dev, touchid); -- if (!ti) -- { -- *error = touchid; -- return BadValue; -- } -- -- /* FIXME: Allow for early accept */ -- if (ti->num_listeners == 0 || CLIENT_ID(ti->listeners[0].listener) != client->index) -- return BadAccess; -- -- nev = GetTouchOwnershipEvents(events, dev, ti, mode, ti->listeners[0].listener, 0); -- if (nev == 0) -- return BadAlloc; -- for (i = 0; i < nev; i++) -- mieqProcessDeviceEvent(dev, events + i, NULL); -- -- ProcessInputEvents(); -- -- FreeEventList(events, GetMaximumEventsNum()); -- return Success; --} -- - int - ProcXIAllowEvents(ClientPtr client) - { -@@ -138,9 +97,8 @@ ProcXIAllowEvents(ClientPtr client) - break; - case XIRejectTouch: - case XIAcceptTouch: -- ret = AllowTouch(client, dev, -- stuff->mode, stuff->touchid, -- &client->errorValue); -+ ret = TouchAcceptReject(client, dev, stuff->mode, stuff->touchid, -+ &client->errorValue); - break; - default: - client->errorValue = stuff->mode; -diff --git a/dix/touch.c b/dix/touch.c -index b42859d..4a116ee 100644 ---- a/dix/touch.c -+++ b/dix/touch.c -@@ -34,6 +34,7 @@ - - #include "eventstr.h" - #include "exevents.h" -+#include "exglobals.h" - #include "inpututils.h" - #include "eventconvert.h" - #include "windowstr.h" -@@ -984,3 +985,47 @@ TouchListenerGone(XID resource) - - FreeEventList(events, GetMaximumEventsNum()); - } -+ -+int -+TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode, -+ uint32_t touchid, XID *error) -+{ -+ TouchPointInfoPtr ti; -+ int nev, i; -+ InternalEvent *events = InitEventList(GetMaximumEventsNum()); -+ -+ if (!events) -+ return BadAlloc; -+ -+ if (!dev->touch) -+ { -+ *error = dev->id; -+ return BadDevice; -+ } -+ -+ /* FIXME window is unhandled */ -+ -+ ti = TouchFindByClientID(dev, touchid); -+ if (!ti) -+ { -+ *error = touchid; -+ return BadValue; -+ } -+ -+ /* FIXME: Allow for early accept */ -+ if (ti->num_listeners == 0 || -+ CLIENT_ID(ti->listeners[0].listener) != client->index) -+ return BadAccess; -+ -+ nev = GetTouchOwnershipEvents(events, dev, ti, mode, -+ ti->listeners[0].listener, 0); -+ if (nev == 0) -+ return BadAlloc; -+ for (i = 0; i < nev; i++) -+ mieqProcessDeviceEvent(dev, events + i, NULL); -+ -+ ProcessInputEvents(); -+ -+ FreeEventList(events, GetMaximumEventsNum()); -+ return Success; -+} -diff --git a/include/input.h b/include/input.h -index 53645b4..605e74d 100644 ---- a/include/input.h -+++ b/include/input.h -@@ -625,6 +625,8 @@ extern int TouchConvertToPointerEvent(const InternalEvent *ev, - extern int TouchGetPointerEventType(const InternalEvent *ev); - extern void TouchRemovePointerGrab(DeviceIntPtr dev); - extern void TouchListenerGone(XID resource); -+extern int TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode, -+ uint32_t touchid, XID *error); - - /* misc event helpers */ - extern Mask GetEventMask(DeviceIntPtr dev, xEvent* ev, InputClientsPtr clients); --- -1.7.8.3 - diff --git a/debian/patches/605-Check-for-proper-window-ID-when-processing-touch-all.patch b/debian/patches/605-Check-for-proper-window-ID-when-processing-touch-all.patch deleted file mode 100644 index 0f328a6..0000000 --- a/debian/patches/605-Check-for-proper-window-ID-when-processing-touch-all.patch +++ /dev/null @@ -1,87 +0,0 @@ -From 656ab879f20892975510723ce8fe78faf64aadb4 Mon Sep 17 00:00:00 2001 -From: Chase Douglas <[email protected]> -Date: Fri, 3 Feb 2012 16:19:09 -0800 -Subject: [PATCH] Check for proper window ID when processing touch allow - requests - -Signed-off-by: Chase Douglas <[email protected]> -Signed-off-by: Peter Hutterer <[email protected]> -Reviewed-by: Peter Hutterer <[email protected]> ---- - Xi/xiallowev.c | 2 +- - dix/touch.c | 18 ++++++++++++------ - include/input.h | 2 +- - 3 files changed, 14 insertions(+), 8 deletions(-) - -diff --git a/Xi/xiallowev.c b/Xi/xiallowev.c -index dab3393..38967b2 100644 ---- a/Xi/xiallowev.c -+++ b/Xi/xiallowev.c -@@ -98,7 +98,7 @@ ProcXIAllowEvents(ClientPtr client) - case XIRejectTouch: - case XIAcceptTouch: - ret = TouchAcceptReject(client, dev, stuff->mode, stuff->touchid, -- &client->errorValue); -+ stuff->grab_window, &client->errorValue); - break; - default: - client->errorValue = stuff->mode; -diff --git a/dix/touch.c b/dix/touch.c -index 4a116ee..7daf81b 100644 ---- a/dix/touch.c -+++ b/dix/touch.c -@@ -988,7 +988,7 @@ TouchListenerGone(XID resource) - - int - TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode, -- uint32_t touchid, XID *error) -+ uint32_t touchid, Window grab_window, XID *error) - { - TouchPointInfoPtr ti; - int nev, i; -@@ -1003,8 +1003,6 @@ TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode, - return BadDevice; - } - -- To UNSUBSCRIBE, email to [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected] Archive: http://lists.debian.org/[email protected]

