[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: