ChangeLog | 299 ++++++++++ Xext/xace.c | 4 Xext/xselinux_ext.c | 6 configure.ac | 7 debian/changelog | 26 debian/control | 4 debian/patches/220_dont_scale_indirect.patch | 34 - debian/patches/221_pointer_motion_update_fix.patch | 34 - debian/patches/222_touch_valuators_absolute.patch | 49 - debian/patches/223_indirect_touch_x_y_valuators.patch | 35 - 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/series | 17 dix/dispatch.c | 14 dix/dixutils.c | 7 dix/getevents.c | 17 dix/grabs.c | 3 hw/xquartz/bundle/Info.plist.cpp | 8 include/inputstr.h | 2 mi/mibitblt.c | 2 os/backtrace.c | 6 os/client.c | 118 +++ 31 files changed, 1594 insertions(+), 204 deletions(-)
New commits: commit a601c3ec36667ac610281830ce23780a10a97189 Author: Chase Douglas <chase.doug...@ubuntu.com> Date: Fri Feb 10 16:27:32 2012 -0800 releasing version 2:1.11.4-0ubuntu1 diff --git a/debian/changelog b/debian/changelog index cefbb8b..0af4c20 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -xorg-server (2:1.11.4-0ubuntu1) UNRELEASED; urgency=low +xorg-server (2:1.11.4-0ubuntu1) precise; urgency=low [ Chase Douglas ] * Allow for non-root config paths so xorg-gtest can be run without root @@ -31,7 +31,7 @@ xorg-server (2:1.11.4-0ubuntu1) UNRELEASED; urgency=low - 610-Fix-scrolling.patch (LP: #925785) * Bump deps on x11proto-input-dev to 2.1.99.6 - -- Chase Douglas <chase.doug...@ubuntu.com> Sat, 11 Feb 2012 00:23:30 +0100 + -- Chase Douglas <chase.doug...@ubuntu.com> Fri, 10 Feb 2012 16:27:25 -0800 xorg-server (2:1.11.3-0ubuntu10) precise; urgency=low commit d085a4e70c27c8f20a31496cedf29b6de4bc0aaa Author: Chase Douglas <chase.doug...@canonical.com> Date: Sat Feb 11 00:23:59 2012 +0100 Bump deps on x11proto-input-dev to 2.1.99.6 diff --git a/debian/changelog b/debian/changelog index 77348ae..cefbb8b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -29,8 +29,9 @@ xorg-server (2:1.11.4-0ubuntu1) UNRELEASED; urgency=low - 608-dix-fix-an-out-of-memory-crash.patch - 609-Xi-handle-new-XIAllowEvents-request-in-inputproto-2..patch - 610-Fix-scrolling.patch (LP: #925785) + * Bump deps on x11proto-input-dev to 2.1.99.6 - -- Chase Douglas <chase.doug...@ubuntu.com> Sat, 11 Feb 2012 00:18:30 +0100 + -- Chase Douglas <chase.doug...@ubuntu.com> Sat, 11 Feb 2012 00:23:30 +0100 xorg-server (2:1.11.3-0ubuntu10) precise; urgency=low diff --git a/debian/control b/debian/control index 88514fe..7da92bf 100644 --- a/debian/control +++ b/debian/control @@ -41,7 +41,7 @@ Build-Depends: x11proto-xf86vidmode-dev (>= 2.2.99.1), xtrans-dev (>= 1.2.2), libxau-dev (>= 1:1.0.5-2), - x11proto-input-dev (>= 2.1.99.5), + x11proto-input-dev (>= 2.1.99.6), x11proto-dri2-dev (>= 2.6), libxdmcp-dev (>= 1:0.99.1), libxfont-dev (>= 1:1.4.2), @@ -163,7 +163,7 @@ Architecture: any Depends: libpixman-1-dev (>= 0.21.8), x11proto-core-dev (>= 7.0.22), - x11proto-input-dev (>= 2.1.99.4), + x11proto-input-dev (>= 2.1.99.6), x11proto-xext-dev (>= 7.1.99), x11proto-video-dev, x11proto-randr-dev (>= 1.2.99.3), commit 3a743ea3011c049045d6a7135ca0925cecf3d713 Author: Chase Douglas <chase.doug...@canonical.com> Date: Sat Feb 11 00:19:33 2012 +0100 Add reviewed input patches that have not been merged upstream yet: * Add reviewed input patches that have not been merged upstream yet: - 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 diff --git a/debian/changelog b/debian/changelog index 7a839c9..77348ae 100644 --- a/debian/changelog +++ b/debian/changelog @@ -17,8 +17,20 @@ xorg-server (2:1.11.4-0ubuntu1) UNRELEASED; urgency=low - 221_pointer_motion_update_fix.patch - 222_touch_valuators_absolute.patch - 223_indirect_touch_x_y_valuators.patch - - -- Chase Douglas <chase.doug...@ubuntu.com> Sat, 11 Feb 2012 00:07:32 +0100 + * Add reviewed input patches that have not been merged upstream yet: + - 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 (LP: #925785) + + -- Chase Douglas <chase.doug...@ubuntu.com> Sat, 11 Feb 2012 00:18:30 +0100 xorg-server (2:1.11.3-0ubuntu10) 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 new file mode 100644 index 0000000..2630963 --- /dev/null +++ b/debian/patches/600-Revert-dix-deduplicate-callers-of-DeliverDeviceEvent.patch @@ -0,0 +1,59 @@ +From f92ba92adfce0e1975feb54ab0e1165b7c2a7bea Mon Sep 17 00:00:00 2001 +From: Peter Hutterer <peter.hutte...@who-t.net> +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 <mathieu.taillefum...@free.fr> +Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> +Reviewed-by: Keith Packard <kei...@keithp.com> +--- + 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 new file mode 100644 index 0000000..58ee8db --- /dev/null +++ b/debian/patches/601-Store-window-pointer-in-touch-listener-record.patch @@ -0,0 +1,110 @@ +From ab60cadc2afb9d8882144e30fde11c3ef0f999cd Mon Sep 17 00:00:00 2001 +From: Chase Douglas <chase.doug...@canonical.com> +Date: Fri, 3 Feb 2012 16:19:05 -0800 +Subject: [PATCH] Store window pointer in touch listener record + +Signed-off-by: Chase Douglas <chase.doug...@canonical.com> +Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> +Reviewed-by: Peter Hutterer <peter.hutte...@who-t.net> +--- + 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 new file mode 100644 index 0000000..1202d02 --- /dev/null +++ b/debian/patches/602-Factor-out-TouchEnd-generation-and-delivery.patch @@ -0,0 +1,184 @@ +From 19073425e5df1317f73f74ce0b95ab24e0e0da14 Mon Sep 17 00:00:00 2001 +From: Chase Douglas <chase.doug...@canonical.com> +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 <chase.doug...@canonical.com> +Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> +Reviewed-by: Peter Hutterer <peter.hutte...@who-t.net> +--- + 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 new file mode 100644 index 0000000..5701ece --- /dev/null +++ b/debian/patches/603-Export-TouchEventRejected-as-TouchRejected.patch @@ -0,0 +1,115 @@ +From 192b2c9a2ec04522655675ddfe71de5cf974cc7b Mon Sep 17 00:00:00 2001 +From: Chase Douglas <chase.doug...@canonical.com> +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 <chase.doug...@canonical.com> +Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> +Reviewed-by: Peter Hutterer <peter.hutte...@who-t.net> +--- + 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 new file mode 100644 index 0000000..62207be --- /dev/null +++ b/debian/patches/604-Move-AllowTouch-to-dix-touch.c-and-rename-to-TouchAc.patch @@ -0,0 +1,155 @@ +From 9a260e9af83feb5c53ffd3b2da2dc3adf06240a1 Mon Sep 17 00:00:00 2001 +From: Chase Douglas <chase.doug...@canonical.com> +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 <chase.doug...@canonical.com> +Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> +Reviewed-by: Peter Hutterer <peter.hutte...@who-t.net> +--- + 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 new file mode 100644 index 0000000..0f328a6 --- /dev/null +++ b/debian/patches/605-Check-for-proper-window-ID-when-processing-touch-all.patch @@ -0,0 +1,87 @@ +From 656ab879f20892975510723ce8fe78faf64aadb4 Mon Sep 17 00:00:00 2001 +From: Chase Douglas <chase.doug...@canonical.com> +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 <chase.doug...@canonical.com> +Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> +Reviewed-by: Peter Hutterer <peter.hutte...@who-t.net> +--- + 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; + } + +- /* FIXME window is unhandled */ +- + ti = TouchFindByClientID(dev, touchid); + if (!ti) + { +@@ -1012,9 +1010,17 @@ TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode, + return BadValue; + } + +- /* FIXME: Allow for early accept */ +- if (ti->num_listeners == 0 || +- CLIENT_ID(ti->listeners[0].listener) != client->index) ++ for (i = 0; i < ti->num_listeners; i++) ++ { ++ if (CLIENT_ID(ti->listeners[i].listener) == client->index && ++ ti->listeners[i].window->drawable.id == grab_window) ++ break; ++ } ++ if (i == ti->num_listeners) ++ return BadAccess; ++ ++ /* FIXME: Implement early accept/reject */ ++ if (i > 0) + return BadAccess; + + nev = GetTouchOwnershipEvents(events, dev, ti, mode, +diff --git a/include/input.h b/include/input.h +index 605e74d..fea5a31 100644 +--- a/include/input.h ++++ b/include/input.h +@@ -626,7 +626,7 @@ 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); ++ uint32_t touchid, Window grab_window, XID *error); + + /* misc event helpers */ + extern Mask GetEventMask(DeviceIntPtr dev, xEvent* ev, InputClientsPtr clients); +-- +1.7.8.3 + diff --git a/debian/patches/606-Implement-early-touch-reject.patch b/debian/patches/606-Implement-early-touch-reject.patch new file mode 100644 index 0000000..bd8f4b1 --- /dev/null +++ b/debian/patches/606-Implement-early-touch-reject.patch @@ -0,0 +1,37 @@ +From b0c54856df71f9cabf9dad176fdade960ef8c5d9 Mon Sep 17 00:00:00 2001 +From: Chase Douglas <chase.doug...@canonical.com> +Date: Fri, 3 Feb 2012 16:19:10 -0800 +Subject: [PATCH] Implement early touch reject + +Signed-off-by: Chase Douglas <chase.doug...@canonical.com> +Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> +Reviewed-by: Peter Hutterer <peter.hutte...@who-t.net> +--- + dix/touch.c | 9 ++++++++- + 1 files changed, 8 insertions(+), 1 deletions(-) + +diff --git a/dix/touch.c b/dix/touch.c +index 7daf81b..f55bb8c 100644 +--- a/dix/touch.c ++++ b/dix/touch.c +@@ -1019,9 +1019,16 @@ TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode, + if (i == ti->num_listeners) + return BadAccess; + +- /* FIXME: Implement early accept/reject */ + if (i > 0) ++ { ++ if (mode == XIRejectTouch) ++ { ++ TouchRejected(dev, ti, ti->listeners[i].listener, NULL); ++ return Success; ++ } ++ /* FIXME: Implement early accept */ + return BadAccess; ++ } + + nev = GetTouchOwnershipEvents(events, dev, ti, mode, + ti->listeners[0].listener, 0); +-- +1.7.8.3 + diff --git a/debian/patches/607-Implement-touch-early-accept.patch b/debian/patches/607-Implement-touch-early-accept.patch new file mode 100644 index 0000000..1d92132 --- /dev/null +++ b/debian/patches/607-Implement-touch-early-accept.patch @@ -0,0 +1,108 @@ +From 6241b5e4fdbdb08d30cc8787d858ac27122d2d49 Mon Sep 17 00:00:00 2001 +From: Chase Douglas <chase.doug...@canonical.com> +Date: Fri, 3 Feb 2012 16:19:11 -0800 +Subject: [PATCH] Implement touch early accept + +This doesn't really implement early accept as it should. Ideally, the +server should send end events to all subsequent touch clients as soon as +an early accept comes in. However, this implementation is still protocol +compliant. We can always improve it later. + +Signed-off-by: Chase Douglas <chase.doug...@canonical.com> +Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> +Reviewed-by: Peter Hutterer <peter.hutte...@who-t.net> +--- + Xi/exevents.c | 27 ++++++++++++++++++++++++++- + dix/touch.c | 9 ++++----- + include/input.h | 2 ++ + 3 files changed, 32 insertions(+), 6 deletions(-) + +diff --git a/Xi/exevents.c b/Xi/exevents.c +index b0832d0..1ecc3ba 100644 +--- a/Xi/exevents.c ++++ b/Xi/exevents.c +@@ -1088,6 +1088,27 @@ DeliverOneTouchEvent(ClientPtr client, DeviceIntPtr dev, TouchPointInfoPtr ti, + return TRUE; + } + ++static void ++ActivateEarlyAccept(DeviceIntPtr dev, TouchPointInfoPtr ti) ++{ ++ int rc; ++ ClientPtr client; ++ XID error; ++ ++ rc = dixLookupClient(&client, ti->listeners[0].listener, serverClient, ++ DixSendAccess); ++ if (rc != Success) ++ { ++ ErrorF("[Xi] Failed to lookup early accepting client.\n"); ++ return; ++ } ++ ++ if (TouchAcceptReject(client, dev, XIAcceptTouch, ti->client_id, ++ ti->listeners[0].window->drawable.id, &error) != ++ Success) ++ ErrorF("[Xi] Failed to accept touch grab after early acceptance.\n"); ++} ++ + /** + * Generate and deliver a TouchEnd event. + * +@@ -1130,7 +1151,8 @@ TouchPuntToNextOwner(DeviceIntPtr dev, TouchPointInfoPtr ti, + TouchOwnershipEvent *ev) + { + /* Deliver the ownership */ -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/e1rw17t-0000v7...@vasks.debian.org