xorg-server: Changes to 'ubuntu'
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.douglas@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.douglas@ubuntu.com> Sat, 11 Feb 2012 00:23:30 +0100
+ -- Chase Douglas <chase.douglas@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.douglas@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.douglas@ubuntu.com> Sat, 11 Feb 2012 00:18:30 +0100
+ -- Chase Douglas <chase.douglas@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.douglas@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.douglas@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.douglas@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.hutterer@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.taillefumier@free.fr>
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+Reviewed-by: Keith Packard <keithp@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.douglas@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.douglas@canonical.com>
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+Reviewed-by: Peter Hutterer <peter.hutterer@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.douglas@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.douglas@canonical.com>
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+Reviewed-by: Peter Hutterer <peter.hutterer@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.douglas@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.douglas@canonical.com>
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+Reviewed-by: Peter Hutterer <peter.hutterer@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.douglas@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.douglas@canonical.com>
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+Reviewed-by: Peter Hutterer <peter.hutterer@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.douglas@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.douglas@canonical.com>
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+Reviewed-by: Peter Hutterer <peter.hutterer@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.douglas@canonical.com>
+Date: Fri, 3 Feb 2012 16:19:10 -0800
+Subject: [PATCH] Implement early touch reject
+
+Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+Reviewed-by: Peter Hutterer <peter.hutterer@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.douglas@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.douglas@canonical.com>
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+Reviewed-by: Peter Hutterer <peter.hutterer@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 */
Reply to: