Imported Debian patch 1.11.4-0ubuntu3
authorChase Douglas <chase.douglas@ubuntu.com>
Mon, 13 Feb 2012 23:54:04 +0000 (15:54 -0800)
committerDavid Bercovitz <d-bercovitz@ti.com>
Tue, 21 Feb 2012 16:56:22 +0000 (17:56 +0100)
225 files changed:
ChangeLog
Xi/exevents.c
Xi/extinit.c
Xi/grabdev.c
Xi/grabdevb.c
Xi/grabdevk.c
Xi/ungrdev.c
Xi/ungrdevb.c
Xi/ungrdevk.c
Xi/xiallowev.c
Xi/xigrabdev.c
Xi/xipassivegrab.c
Xi/xiproperty.c
Xi/xiquerydevice.c
Xi/xiquerydevice.h
Xi/xiquerypointer.c
Xi/xiselectev.c
Xi/xiwarppointer.c
config/config-backends.h
config/config.c
config/dbus-api [new file with mode: 0644]
config/dbus.c
config/hal.c
config/udev.c
configure.ac
debian/README.source [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/gbp.conf [new file with mode: 0644]
debian/local/10-kbd.conf [new file with mode: 0644]
debian/local/10-mouse.conf [new file with mode: 0644]
debian/local/64-xorg-xkb.rules [new file with mode: 0644]
debian/local/dh_xsf_substvars [new file with mode: 0644]
debian/local/xsf.pm [new file with mode: 0644]
debian/local/xvfb-run [new file with mode: 0644]
debian/local/xvfb-run.1 [new file with mode: 0644]
debian/patches/001_fedora_extramodes.patch [new file with mode: 0644]
debian/patches/02_Add-libnettle-as-option-for-sha1.diff [new file with mode: 0644]
debian/patches/07-xfree86-fix-build-with-xv-disabled.diff [new file with mode: 0644]
debian/patches/100_rethrow_signals.patch [new file with mode: 0644]
debian/patches/105_nvidia_fglrx_autodetect.patch [new file with mode: 0644]
debian/patches/111_armel-drv-fallbacks.patch [new file with mode: 0644]
debian/patches/122_xext_fix_card32_overflow_in_xauth.patch [new file with mode: 0644]
debian/patches/13_debian_add_xkbpath_env_variable.diff [new file with mode: 0644]
debian/patches/15-nouveau.diff [new file with mode: 0644]
debian/patches/157_check_null_modes.patch [new file with mode: 0644]
debian/patches/162_null_crtc_in_rotation.patch [new file with mode: 0644]
debian/patches/165_man_xorg_conf_no_device_ident.patch [new file with mode: 0644]
debian/patches/166_nullptr_xinerama_keyrepeat.patch [new file with mode: 0644]
debian/patches/167_nullptr_xisbread.patch [new file with mode: 0644]
debian/patches/168_glibc_trace_to_stderr.patch [new file with mode: 0644]
debian/patches/172_cwgetbackingpicture_nullptr_check.patch [new file with mode: 0644]
debian/patches/188_default_primary_to_first_busid.patch [new file with mode: 0644]
debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch [new file with mode: 0644]
debian/patches/191-Xorg-add-an-extra-module-path.patch [new file with mode: 0644]
debian/patches/198_nohwaccess.patch [new file with mode: 0644]
debian/patches/200_randr-null.patch [new file with mode: 0644]
debian/patches/201_report-real-dpi.patch [new file with mode: 0644]
debian/patches/208_switch_on_release.diff [new file with mode: 0644]
debian/patches/209_add_legacy_bgnone_option.patch [new file with mode: 0644]
debian/patches/214_glx_dri_searchdirs.patch [new file with mode: 0644]
debian/patches/217_revert_bgnonevisitwindow.patch [new file with mode: 0644]
debian/patches/219_fedora-pointer-barriers.diff [new file with mode: 0644]
debian/patches/224_return_BadWindow_not_BadMatch.diff [new file with mode: 0644]
debian/patches/225_non-root_config_paths.patch [new file with mode: 0644]
debian/patches/226_fall_back_to_autoconfiguration.patch [new file with mode: 0644]
debian/patches/500_pointer_barrier_thresholds.diff [new file with mode: 0644]
debian/patches/600-Revert-dix-deduplicate-callers-of-DeliverDeviceEvent.patch [new file with mode: 0644]
debian/patches/601-Store-window-pointer-in-touch-listener-record.patch [new file with mode: 0644]
debian/patches/602-Factor-out-TouchEnd-generation-and-delivery.patch [new file with mode: 0644]
debian/patches/603-Export-TouchEventRejected-as-TouchRejected.patch [new file with mode: 0644]
debian/patches/604-Move-AllowTouch-to-dix-touch.c-and-rename-to-TouchAc.patch [new file with mode: 0644]
debian/patches/605-Check-for-proper-window-ID-when-processing-touch-all.patch [new file with mode: 0644]
debian/patches/606-Implement-early-touch-reject.patch [new file with mode: 0644]
debian/patches/607-Implement-touch-early-accept.patch [new file with mode: 0644]
debian/patches/608-dix-fix-an-out-of-memory-crash.patch [new file with mode: 0644]
debian/patches/609-Xi-handle-new-XIAllowEvents-request-in-inputproto-2..patch [new file with mode: 0644]
debian/patches/610-Fix-scrolling.patch [new file with mode: 0644]
debian/patches/611-Fix-touch-punt-crash.patch [new file with mode: 0644]
debian/patches/612-Fix-vcp-touches-corruption.patch [new file with mode: 0644]
debian/patches/613-Keep-vcp-touch-class.patch [new file with mode: 0644]
debian/patches/series [new file with mode: 0644]
debian/rules [new file with mode: 0755]
debian/serverminver [new file with mode: 0644]
debian/watch [new file with mode: 0644]
debian/xdmx-tools.install [new file with mode: 0644]
debian/xdmx.install [new file with mode: 0644]
debian/xnest.install [new file with mode: 0644]
debian/xserver-common.install [new file with mode: 0644]
debian/xserver-xephyr.docs [new file with mode: 0644]
debian/xserver-xephyr.install [new file with mode: 0644]
debian/xserver-xfbdev.install [new file with mode: 0644]
debian/xserver-xorg-core-udeb.install [new file with mode: 0644]
debian/xserver-xorg-core.bug.script [new file with mode: 0644]
debian/xserver-xorg-core.install [new file with mode: 0644]
debian/xserver-xorg-core.lintian-overrides [new file with mode: 0644]
debian/xserver-xorg-core.postrm [new file with mode: 0644]
debian/xserver-xorg-dev.install [new file with mode: 0644]
debian/xvfb.install [new file with mode: 0644]
dix/Makefile.am
dix/devices.c
dix/dispatch.c
dix/enterleave.c
dix/eventconvert.c
dix/events.c
dix/extension.c
dix/getevents.c
dix/grabs.c
dix/inpututils.c
dix/ptrveloc.c
dix/tables.c
dix/touch.c [new file with mode: 0644]
dix/window.c
doc/c-extensions [new file with mode: 0644]
fix-miregion [new file with mode: 0644]
fix-miregion-private [new file with mode: 0644]
fix-patch-whitespace [new file with mode: 0644]
fix-region [new file with mode: 0644]
hw/kdrive/Xkdrive.man [new file with mode: 0644]
hw/kdrive/ephyr/ephyrhostproxy.c [new file with mode: 0644]
hw/kdrive/ephyr/ephyrhostproxy.h [new file with mode: 0644]
hw/kdrive/ephyr/ephyrproxyext.c [new file with mode: 0644]
hw/kdrive/ephyr/ephyrproxyext.h [new file with mode: 0644]
hw/kdrive/fbdev/Xfbdev.man [new file with mode: 0644]
hw/xfree86/common/xf86Config.c
hw/xfree86/common/xf86Cursor.c
hw/xfree86/common/xf86DGA.c
hw/xfree86/common/xf86Init.c
hw/xfree86/common/xf86Module.h
hw/xfree86/common/xf86Option.c
hw/xfree86/common/xf86RandR.c
hw/xfree86/common/xf86Xinput.c
hw/xfree86/common/xf86Xinput.h
hw/xfree86/doc/ddxDesign.xml
hw/xfree86/man/xorg.conf.man
hw/xfree86/modes/xf86RandR12.c
hw/xfree86/xaa/xaalocal.h
hw/xquartz/GL/glcontextmodes.c [new file with mode: 0644]
hw/xquartz/GL/glcontextmodes.h [new file with mode: 0644]
hw/xquartz/bundle/Resources/Dutch.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/English.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/French.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/French.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/German.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/German.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/Italian.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/Italian.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/Japanese.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/Japanese.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/Spanish.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/ar.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/da.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/da.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/el.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/el.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/fi.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/fi.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/he.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/he.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/ko.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/ko.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/no.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/no.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/pl.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/pl.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/pt.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/pt.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/pt_PT.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/ru.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/ru.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/sk.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/sk.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/sv.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/sv.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/zh_CN.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/zh_CN.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xquartz/bundle/Resources/zh_TW.lproj/locversion.plist [new file with mode: 0644]
hw/xquartz/bundle/Resources/zh_TW.lproj/main.nib/designable.nib [new file with mode: 0644]
hw/xwin/XWin.exe.manifest [new file with mode: 0644]
hw/xwin/glx/wgl_ext_api.h [new file with mode: 0644]
hw/xwin/winglobals.h [new file with mode: 0644]
hw/xwin/winmonitors.h [new file with mode: 0644]
include/dix.h
include/dixgrabs.h
include/eventconvert.h
include/events.h
include/eventstr.h
include/exevents.h
include/input.h
include/inputstr.h
include/inpututils.h
include/list.h
include/misc.h
include/protocol-versions.h
include/ptrveloc.h
include/scrnintstr.h
include/xserver-properties.h
mi/mi.h
mi/mibstore.c [new file with mode: 0644]
mi/mieq.c
mi/mipointer.c
mi/mipointer.h
mi/misprite.c
mi/mivaltree.c
test/Makefile.am
test/input.c
test/list.c
test/misc.c
test/touch.c [new file with mode: 0644]
test/xfree86.c [new file with mode: 0644]
test/xi2/Makefile.am
test/xi2/protocol-common.c
test/xi2/protocol-eventconvert.c
test/xi2/protocol-xipassivegrabdevice.c
test/xi2/protocol-xiquerydevice.c
test/xi2/protocol-xiselectevents.c
test/xi2/xi2.c [new file with mode: 0644]
xkb/XKM_file_format.txt [new file with mode: 0644]
xkb/xkbAccessX.c
xkb/xkbActions.c

index 29c791133b06619300df6d2b977364e213989fb0..a3980c30e9376e5a68352a49f08b3495a65cd569 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,59 +1,94 @@
-commit e597f0119cd69b6d9edf86d06d941468f90d8e6d
-Author: Jeremy Huddleston <jeremyhu@apple.com>
-Date:   Fri Jan 27 21:07:17 2012 -0800
+commit 03e15dc10aa7cec2d1db294beb0c006ea0e24e25
+Author: Chase Douglas <chase.douglas@canonical.com>
+Date:   Wed Jan 18 19:09:21 2012 -0800
 
 
-    configure.ac: 1.11.4
+    Don't set X and Y valuators for indirect touch events
     
     
-    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+    For expediency, it made sense to always have the X and Y axes set for
+    direct touch device event propagation. The last X and Y values are
+    stored internally. However, indirect device touch event propagation
+    does not depend on the touch's X and Y values. Thus, we don't need to
+    set the values for every indirect touch event.
+    
+    On top of this, the previous X and Y values aren't stored for indirect
+    touches, so without this change the axes get erroneously set to 0.
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    (cherry picked from commit e1085a0da0b9299f48b3dc41dee5e33bf022bea5)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit 6c491463ee7a3637c8aae7ddae9625b36b792078
-Author: Jeremy Huddleston <jeremyhu@apple.com>
-Date:   Fri Jan 20 23:54:58 2012 -0800
+commit 17e9669a686c5b943b6e22ed740c2e8ffcb39c27
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Thu Jan 19 22:40:32 2012 +1100
 
 
-    1.11.3.902 (1.11.4 RC2)
+    UngrabAllDevices: Don't kill clients if not told to
     
     
-    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+    The kill_client argument to UngrabAllClients specifies if we want to
+    kill the client holding the grab or just deactivate the grab.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+    Reported-by: Julien Cristau <jcristau@debian.org>
+    Reviewed-by: Cyril Brulebois <kibi@debian.org>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    (cherry picked from commit 5201310559fe8708ba8278bdef77cdc1673fff71)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit b747a91485184649c05aba6fa10734f70e926032
-Author: Jeremy Huddleston <jeremyhu@apple.com>
-Date:   Wed Jan 18 11:47:21 2012 -0800
+commit 36d20ea69467e0a873a457078c5032d7447ac984
+Author: Chase Douglas <chase.douglas@canonical.com>
+Date:   Wed Jan 18 18:04:14 2012 -0800
 
 
-    XQuartz: Bump bundle version to 2.7.1
+    Only update pointer motion data for pointer emulated touch events
     
     
-    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    (cherry picked from commit 9b1e18f42a05a79d9ebec372a37b47442e397ca9)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit a1ed67fa0551ee2b39d002d3b786a2017b37c7ac
-Author: Peter Hutterer <peter.hutterer@who-t.net>
-Date:   Fri Jan 6 13:20:45 2012 +1000
+commit b6e21d8b973f46fe70517d37385342b5e2f47d22
+Author: Chase Douglas <chase.douglas@canonical.com>
+Date:   Wed Jan 18 18:04:13 2012 -0800
 
 
-    render: don't bother with animated cursors on floating slaves (#39989)
+    Only scale direct device touch coordinates
     
     
-    X.Org Bug 39989 <http://bugs.freedesktop.org/show_bug.cgi?id=39989>
+    Indirect touch devices provide valuator values in pure device
+    coordinates. They also don't need to be fixed up for screen crossings.
     
     
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
-    (cherry picked from commit bbb6b8c834e0e1491ca14403b5d0840dd14380d3)
+    (cherry picked from commit f00e5b02f5d9928cd88961e761da91b5faff1b32)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit f89c39e6c9e20ffc3c1ae228ee601c2ab9007ff4
+commit ebf3e90cbb271b00dbe767ce848a9687390ec887
 Author: Peter Hutterer <peter.hutterer@who-t.net>
 Author: Peter Hutterer <peter.hutterer@who-t.net>
-Date:   Mon Jan 9 15:04:10 2012 +1000
+Date:   Mon Jan 16 12:53:39 2012 +1000
 
 
-    dix: Update pointer limits for floating devices too (#43635)
+    include: Fix comment typo
     
     
-    When the screen is restructured, the pointer limits need to be reset for
-    floating slave devices as well, not just for master pointers. Only skip
-    devices that don't have a cursor (attached slaves and keyboard)
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    (cherry picked from commit 24dc0389da3970e83e4908039957567e55f9ea05)
     
     
-    Bug reproducer: float an absolute slave device, rotate the screen - the
-    device is now confined to a section of the screen only.
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 1fbd9c6f967484485f1e8b333f21a1dac0da7680
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Wed Jan 18 11:47:21 2012 -0800
+
+    XQuartz: Bump bundle version to 2.7.1
     
     
-    X.Org Bug 43635 <http://bugs.freedesktop.org/show_bug.cgi?id=43635>
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+    (cherry picked from commit b747a91485184649c05aba6fa10734f70e926032)
     
     
-    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
-    (cherry picked from commit 35bd77e9d0701daae87d681900d749604fc6471f)
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit dea9377a257a402b2c7fe4a96c958d951a7d4579
+commit 800d82ff45f150aa6680d8c3a0172a851d8a55ab
 Author: Zhigang Gong <zhigang.gong@linux.intel.com>
 Date:   Wed Jan 4 07:01:19 2012 +0000
 
 Author: Zhigang Gong <zhigang.gong@linux.intel.com>
 Date:   Wed Jan 4 07:01:19 2012 +0000
 
@@ -68,8 +103,11 @@ Date:   Wed Jan 4 07:01:19 2012 +0000
     Reviewed-by: Adam Jackson <ajax@redhat.com>
     Signed-off-by: Keith Packard <keithp@keithp.com>
     (cherry picked from commit f4956faab9ccf9aba6cf9603f4489f5dad19a347)
     Reviewed-by: Adam Jackson <ajax@redhat.com>
     Signed-off-by: Keith Packard <keithp@keithp.com>
     (cherry picked from commit f4956faab9ccf9aba6cf9603f4489f5dad19a347)
+    (cherry picked from commit dea9377a257a402b2c7fe4a96c958d951a7d4579)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit d2db5100b1bafeeea8c1febd390631c8f8abb094
+commit 8f40cad6e07065691799b54da37204747cb428fa
 Author: Alan Coopersmith <alan.coopersmith@oracle.com>
 Date:   Fri Oct 28 21:29:50 2011 -0700
 
 Author: Alan Coopersmith <alan.coopersmith@oracle.com>
 Date:   Fri Oct 28 21:29:50 2011 -0700
 
@@ -82,8 +120,11 @@ Date:   Fri Oct 28 21:29:50 2011 -0700
     Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
     Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
     (cherry picked from commit 780133f9ae7fada462714b47e79d26075bbd9abe)
     Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
     Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
     (cherry picked from commit 780133f9ae7fada462714b47e79d26075bbd9abe)
+    (cherry picked from commit d2db5100b1bafeeea8c1febd390631c8f8abb094)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit 5b28bcb340e279e7f4e76617e86b439092367690
+commit 2538c43541a48bddc654eea645bd3408e741a49a
 Author: Adam Jackson <ajax@redhat.com>
 Date:   Tue Dec 13 21:23:12 2011 -0500
 
 Author: Adam Jackson <ajax@redhat.com>
 Date:   Tue Dec 13 21:23:12 2011 -0500
 
@@ -103,8 +144,11 @@ Date:   Tue Dec 13 21:23:12 2011 -0500
     Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
     Signed-off-by: Adam Jackson <ajax@redhat.com>
     (cherry picked from commit 8f9bdfd293ad8e45755efe8d764b4dcc2a724f51)
     Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
     Signed-off-by: Adam Jackson <ajax@redhat.com>
     (cherry picked from commit 8f9bdfd293ad8e45755efe8d764b4dcc2a724f51)
+    (cherry picked from commit 5b28bcb340e279e7f4e76617e86b439092367690)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit e1ea93fec93b13d18df4451210aaaf322b769b6a
+commit d0c6ccbfb61eb4b0e5c83b8ecf5ebcf3a4e90ba7
 Author: Adam Jackson <ajax@redhat.com>
 Date:   Tue Dec 13 20:23:40 2011 -0500
 
 Author: Adam Jackson <ajax@redhat.com>
 Date:   Tue Dec 13 20:23:40 2011 -0500
 
@@ -123,8 +167,11 @@ Date:   Tue Dec 13 20:23:40 2011 -0500
     Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
     Signed-off-by: Adam Jackson <ajax@redhat.com>
     (cherry picked from commit 83a98543b58c661a22574a6f8d8f9d777c0955b8)
     Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
     Signed-off-by: Adam Jackson <ajax@redhat.com>
     (cherry picked from commit 83a98543b58c661a22574a6f8d8f9d777c0955b8)
+    (cherry picked from commit e1ea93fec93b13d18df4451210aaaf322b769b6a)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit 9eaa0b5c89f645c50ea90e07e8b49ebacf4349a0
+commit 33af6a8d422a6ba95883e448dbfe6fb8ff4ce2ec
 Author: Adam Jackson <ajax@redhat.com>
 Date:   Tue Dec 13 21:00:05 2011 -0500
 
 Author: Adam Jackson <ajax@redhat.com>
 Date:   Tue Dec 13 21:00:05 2011 -0500
 
@@ -144,8 +191,11 @@ Date:   Tue Dec 13 21:00:05 2011 -0500
     Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
     Signed-off-by: Adam Jackson <ajax@redhat.com>
     (cherry picked from commit 11977fab546da35d579ebe285e3c26864007805e)
     Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
     Signed-off-by: Adam Jackson <ajax@redhat.com>
     (cherry picked from commit 11977fab546da35d579ebe285e3c26864007805e)
+    (cherry picked from commit 9eaa0b5c89f645c50ea90e07e8b49ebacf4349a0)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit a3b6ecc893e17028cfbe16d8d7981c9037fc0766
+commit eecdd1c758c3a610038384308e0f9ae558cc92fc
 Author: Peter Hutterer <peter.hutterer@who-t.net>
 Date:   Tue Jan 3 10:45:45 2012 +1000
 
 Author: Peter Hutterer <peter.hutterer@who-t.net>
 Date:   Tue Jan 3 10:45:45 2012 +1000
 
@@ -160,8 +210,11 @@ Date:   Tue Jan 3 10:45:45 2012 +1000
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
     Reviewed-by: Cyril Brulebois <kibi@debian.org>
     (cherry picked from commit 75953ccb9e9e5f1dbbaa44c714716a0049e22aae)
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
     Reviewed-by: Cyril Brulebois <kibi@debian.org>
     (cherry picked from commit 75953ccb9e9e5f1dbbaa44c714716a0049e22aae)
+    (cherry picked from commit a3b6ecc893e17028cfbe16d8d7981c9037fc0766)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit 4a339afc586d55a9a248b893f007219d79c72600
+commit f17bd8187cbce7f848c9613c51d0fcfe86c49489
 Author: Julien Cristau <jcristau@debian.org>
 Date:   Fri Dec 30 20:41:25 2011 +0100
 
 Author: Julien Cristau <jcristau@debian.org>
 Date:   Fri Dec 30 20:41:25 2011 +0100
 
@@ -177,8 +230,11 @@ Date:   Fri Dec 30 20:41:25 2011 +0100
     Reviewed-by: Cyril Brulebois <kibi@debian.org>
     Signed-off-by: Julien Cristau <jcristau@debian.org>
     (cherry picked from commit 6269977c91071e0ea16ca5b4b8e15fd6db0b6fcf)
     Reviewed-by: Cyril Brulebois <kibi@debian.org>
     Signed-off-by: Julien Cristau <jcristau@debian.org>
     (cherry picked from commit 6269977c91071e0ea16ca5b4b8e15fd6db0b6fcf)
+    (cherry picked from commit 4a339afc586d55a9a248b893f007219d79c72600)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit 9a4be7e99f0e832df87b8e7fb548793dd4b52717
+commit 70130bf9e5feaefe9807a47d12c520b91baa5dca
 Author: Matthieu Herrb <matthieu.herrb@laas.fr>
 Date:   Mon Jan 2 13:23:59 2012 +0000
 
 Author: Matthieu Herrb <matthieu.herrb@laas.fr>
 Date:   Mon Jan 2 13:23:59 2012 +0000
 
@@ -190,8 +246,11 @@ Date:   Mon Jan 2 13:23:59 2012 +0000
     Reviewed-by: Adam Jackson <ajax@redhat.com>
     Signed-off-by: Keith Packard <keithp@keithp.com>
     (cherry picked from commit 6d6d4cb6043905d850834946e9bfc526ed5a9ef7)
     Reviewed-by: Adam Jackson <ajax@redhat.com>
     Signed-off-by: Keith Packard <keithp@keithp.com>
     (cherry picked from commit 6d6d4cb6043905d850834946e9bfc526ed5a9ef7)
+    (cherry picked from commit 9a4be7e99f0e832df87b8e7fb548793dd4b52717)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit 8046717d720c1bbbf02ba986622bc96c6b52a36c
+commit 364540f76e0c80ef26f301785214e6a9cb0e5a04
 Author: Alan Coopersmith <alan.coopersmith@oracle.com>
 Date:   Sat Dec 24 10:00:56 2011 -0800
 
 Author: Alan Coopersmith <alan.coopersmith@oracle.com>
 Date:   Sat Dec 24 10:00:56 2011 -0800
 
@@ -209,268 +268,2130 @@ Date:   Sat Dec 24 10:00:56 2011 -0800
     Reviewed-by: Rami Ylimäki <rami.ylimaki@vincit.fi>
     Signed-off-by: Keith Packard <keithp@keithp.com>
     (cherry picked from commit cfc4c3d7fa8bd4da4c08b2ab8e6f85435f75353a)
     Reviewed-by: Rami Ylimäki <rami.ylimaki@vincit.fi>
     Signed-off-by: Keith Packard <keithp@keithp.com>
     (cherry picked from commit cfc4c3d7fa8bd4da4c08b2ab8e6f85435f75353a)
+    (cherry picked from commit 8046717d720c1bbbf02ba986622bc96c6b52a36c)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit cea9f9f273cb525cb5daa2d2819d3f635582cb24
-Author: Jeremy Huddleston <jeremyhu@apple.com>
-Date:   Fri Jan 6 22:01:03 2012 -0800
+commit 2c973d2c078e8af01a06334a4a2ee8705e369bf2
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Nov 9 15:31:10 2011 +1000
 
 
-    configure.ac: 1.11.3.901 (1.11.4 RC1)
+    Xext: don't swap CARD8 in SProcSELinuxQueryVersion
     
     
-    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+    xselinux_ext.c: In function 'SELinuxSendItemsToClient':
+    xselinux_ext.c:340:16: warning: unused variable 'n' [-Wunused-variable]
+    xselinux_ext.c: In function 'SProcSELinuxQueryVersion':
+    xselinux_ext.c:532:62: error: call to 'wrong_size' declared with attribute
+    error: wrong sized variable passed to swap
+    xselinux_ext.c:533:62: error: call to 'wrong_size' declared with attribute
+    error: wrong sized variable passed to swap
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Julien Cristau <jcristau@debian.org>
+    (cherry picked from commit bb4aa1f263ad38c175bfda3b7e6c325260ce3f28)
+    
+    Conflicts:
+    
+       Xext/xselinux_ext.c
+    (cherry picked from commit cf296f2eeffe4b438e9378268f84a1f63c555e52)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit b15be8547d4d204f3e498f52d86713a76766e871
-Author: Jeremy Huddleston <jeremyhu@apple.com>
-Date:   Fri Jan 6 22:12:14 2012 -0800
+commit 7014cf0a6497f122bfa2b0e6e7794dc3e30c0c6f
+Author: Chase Douglas <chase.douglas@canonical.com>
+Date:   Wed Jan 11 07:38:12 2012 -0800
 
 
-    Xi: Fix mishandled git merge
+    Use event time instead of CurrentTime for grab times
     
     
-    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+    When {XI,X,}AllowEvents is called, the timestamp is compared against the
+    grab time to ensure that the request pertains to the current grab in the
+    server. While many clients may use CurrentTime (client-side), the
+    timestamp of the event causing the grab is also valid.
+    
+    This change ensures that the server's notion of the grab time is the
+    time of the event that activated the grab rather than the time that the
+    grab is actually activated.
+    
+    This bug was exposed through nested touch then pointer grabs.
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    (cherry picked from commit f9e6858d5c10be6a8439c0f18bfb2325fa0ee070)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit 82e0ae042379181eb143431e1413084432a17079
-Merge: f9b00c2 4e4bb31
-Author: Jeremy Huddleston <jeremyhu@apple.com>
-Date:   Mon Jan 2 20:58:22 2012 -0500
+commit 4989bff6bfe2c0409127a523e56f177b3141b8d1
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Jan 6 13:20:45 2012 +1000
 
 
-    Merge remote-tracking branch 'whot/server-1.11-branch' into server-1.11-branch
+    render: don't bother with animated cursors on floating slaves (#39989)
+    
+    X.Org Bug 39989 <http://bugs.freedesktop.org/show_bug.cgi?id=39989>
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
+    (cherry picked from commit bbb6b8c834e0e1491ca14403b5d0840dd14380d3)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit 4e4bb319a4f9510277557f65676948cd1db10e93
-Author: Carlos Garnacho <carlosg@gnome.org>
-Date:   Tue Dec 13 15:41:23 2011 +0100
+commit b5f71a5f124eb44eab08f68d3c8ef946df05bb45
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Jan 9 15:04:10 2012 +1000
 
 
-    Xi: assign correct grab_mode/other_device_mode in XI2 passive grabs
+    dix: Update pointer limits for floating devices too (#43635)
     
     
-    CreateGrab() expects the keyboard mode to be stored in grab_mode, and the
-    pointer mode in other_device_mode, so respect this in passive XI2 grabs,
-    and switch modes if needed.
+    When the screen is restructured, the pointer limits need to be reset for
+    floating slave devices as well, not just for master pointers. Only skip
+    devices that don't have a cursor (attached slaves and keyboard)
+    
+    Bug reproducer: float an absolute slave device, rotate the screen - the
+    device is now confined to a section of the screen only.
+    
+    X.Org Bug 43635 <http://bugs.freedesktop.org/show_bug.cgi?id=43635>
     
     
-    Signed-off-by: Carlos Garnacho <carlosg@gnome.org>
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
     Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
     Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
-    (cherry picked from commit 5b169cb695bd450d7f64e3800f00c9237ee67f96)
+    (cherry picked from commit 35bd77e9d0701daae87d681900d749604fc6471f)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit 8c73f6bcbdc04380cc41d9f6dc7e849c7c4f9298
-Author: Alan Coopersmith <alan.coopersmith@oracle.com>
-Date:   Thu Dec 8 21:52:07 2011 -0800
+commit 0c292448ebcfcc6e5072efada55f8135b60b7795
+Author: Keith Packard <keithp@keithp.com>
+Date:   Thu Dec 22 09:35:51 2011 -0800
 
 
-    Change disable_clientpointer return type to void
+    test/xi2: Fix infinite loop in test_convert_XITouchOwnershipEvent
     
     
-    It doesn't return anything, nor does it's caller expect it to.
+    The touchid test was using a loop like:
     
     
-    Fixes Solaris Studio compiler error:
-    "xichangehierarchy.c", line 214: Function has no return statement : disable_clientpointer
+       for(i = 1; i < 0xffffffff; i <<= 1)
+    
+    When 'i' is a 32-bit variable, this infinite loops as it goes from
+    0x80000000 to 0. 'i' is declared as 'long', which is 32-bit in 32-bit mode.
     
     
-    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
-    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
     Signed-off-by: Keith Packard <keithp@keithp.com>
     Signed-off-by: Keith Packard <keithp@keithp.com>
-    (cherry picked from commit 372a6f10dc2d74d2d179e8b92449e9b8636a99ef)
+    (cherry picked from commit e7df42ab68e30588a5e32ed543b0711821daf009)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit ae4272a5742119b10074a542d0dcd4c493cb83e4
+commit 738549e470ea1ae792840bbc50766a017de23cff
 Author: Peter Hutterer <peter.hutterer@who-t.net>
 Author: Peter Hutterer <peter.hutterer@who-t.net>
-Date:   Wed Nov 30 09:06:06 2011 +1000
+Date:   Thu Dec 22 10:00:15 2011 +1000
 
 
-    xfixes: don't dereference a NULL cursor
+    test: fix grab mode value tests for new XIGrabModeTouch
     
     
-    If the new cursor is the NULL cursor, don't dereference it and use zeros
-    instead.
+    This test checks that last-valid-mode + 1 returns a BadValue. With the
+    addition of XIGrabModeTouch, that value has changed - sync it up again.
     
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
     
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
-    (cherry picked from commit 1ab50be938524dcd4a9e56d27e3b96a27c2db2c0)
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit f75bdf7fbe757f4603e39139acc3c90538a45e15)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit 20efd3c15829d8fbb3610d5af41b67a627e63d21
+commit bc282a9a1492137b44486e39f08b2e4cbc34f92b
 Author: Peter Hutterer <peter.hutterer@who-t.net>
 Author: Peter Hutterer <peter.hutterer@who-t.net>
-Date:   Tue Nov 29 16:15:37 2011 +1000
+Date:   Wed Dec 21 14:45:27 2011 +1000
 
 
-    Xi: when removing a device, reset ClientPointers where needed
+    Xi: only activate the device grab if we don't already have one
     
     
-    if a client had the to-be-removed device as ClientPointer, reset to NULL.
+    If the device is already grabbed, don't activate the passive grab, it screws
+    with our event masks. Just deliver to the grabbing client instead.
     
     
-    Fixes #43165
+    Reported-by: Carlos Garnacho <carlosg@gnome.org>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 2bb282cd45cb8149b39d72397ef5bbcfebca11d2)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 3fc68a253e8f45bedeebf6d6a5e885cc720b68cf
+Author: Carlos Garnacho <carlosg@gnome.org>
+Date:   Wed Dec 21 01:08:40 2011 +0100
+
+    dix: fix xi2 mask/filter when delivering grabbed events
     
     
+    Signed-off-by: Carlos Garnacho <carlosg@gnome.org>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
-    (cherry picked from commit d2ebbcdaf6b13d70eee704b1764ff349e1be22a0)
+    (cherry picked from commit 475ef5cc8339fac3696fe654ef683f92f0b0cc2c)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit cf296f2eeffe4b438e9378268f84a1f63c555e52
+commit a4d462fa2cdec99ae4444be843cd2eca8b7598ca
 Author: Peter Hutterer <peter.hutterer@who-t.net>
 Author: Peter Hutterer <peter.hutterer@who-t.net>
-Date:   Wed Nov 9 15:31:10 2011 +1000
+Date:   Mon Dec 19 09:08:05 2011 +1000
 
 
-    Xext: don't swap CARD8 in SProcSELinuxQueryVersion
-    
-    xselinux_ext.c: In function 'SELinuxSendItemsToClient':
-    xselinux_ext.c:340:16: warning: unused variable 'n' [-Wunused-variable]
-    xselinux_ext.c: In function 'SProcSELinuxQueryVersion':
-    xselinux_ext.c:532:62: error: call to 'wrong_size' declared with attribute
-    error: wrong sized variable passed to swap
-    xselinux_ext.c:533:62: error: call to 'wrong_size' declared with attribute
-    error: wrong sized variable passed to swap
+    test: add a basic test for ownership event values
     
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
     
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-    Reviewed-by: Julien Cristau <jcristau@debian.org>
-    (cherry picked from commit bb4aa1f263ad38c175bfda3b7e6c325260ce3f28)
+    (cherry picked from commit 4551510f752624592f9201f73db89ac1325a234a)
     
     
-    Conflicts:
+    Backported swap macros for test_values_XITouchOwnershipEvent.
     
     
-       Xext/xselinux_ext.c
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit 4b386610243b1a30db7e4cdb89cb43012198407d
+commit 4f18583067c194b6e484405752a85708e2a1a00b
 Author: Peter Hutterer <peter.hutterer@who-t.net>
 Author: Peter Hutterer <peter.hutterer@who-t.net>
-Date:   Fri Dec 16 12:41:08 2011 +1000
+Date:   Mon Dec 19 08:31:37 2011 +1000
 
 
-    dix: button state must show the logical buttons, not physical buttons
-    
-    If the device is mapped 3 2 1, a click on physical button 1 sends a button 3
-    press, but the state was set for button 1. Fix this, the state must be set
-    for that button's logical mapping.
+    test: drop printfs from protocol-eventconvert.c
     
     
-    https://bugzilla.gnome.org/show_bug.cgi?id=655928
+    The test outputs are noisy enough, no need having these here too.
     
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
     
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-    (cherry picked from commit 9567d21e85b99febe805263a4d93b15fd1f7ab42)
-    
-    Conflicts:
+    (cherry picked from commit 0c661dc478b4b436a3e61066d31bc510c7a08456)
     
     
-       dix/inpututils.c
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit f9b00c2aba496fe470c24d0f8d3e3d0e3b05aa65
+commit e3a9114e1e31378e96eaacf660e665ed6e50c428
 Author: Peter Hutterer <peter.hutterer@who-t.net>
 Author: Peter Hutterer <peter.hutterer@who-t.net>
-Date:   Tue Nov 29 16:15:37 2011 +1000
+Date:   Wed Dec 21 11:11:48 2011 +1000
 
 
-    Xi: when removing a device, reset ClientPointers where needed
+    dix: remove requirement for client_id be the first element
     
     
-    if a client had the to-be-removed device as ClientPointer, reset to NULL.
-    
-    Fixes #43165
+    Leftover code from an earlier version of GetTouchEvents.
     
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
     
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
-    (cherry picked from commit d2ebbcdaf6b13d70eee704b1764ff349e1be22a0)
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 8080d785b2c1e5791312ed0975efd1b8aea58d98)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit e4984b3023351b5fcc506f4a196ad699db8b0535
+commit 717ac30a73beac953c6aa5d94ca8df1bce7bb97d
 Author: Peter Hutterer <peter.hutterer@who-t.net>
 Author: Peter Hutterer <peter.hutterer@who-t.net>
-Date:   Wed Nov 30 09:06:06 2011 +1000
+Date:   Thu Dec 15 07:59:06 2011 +1000
 
 
-    xfixes: don't dereference a NULL cursor
-    
-    If the new cursor is the NULL cursor, don't dereference it and use zeros
-    instead.
+    mi: handle screen switching on pointer emulated touch events
     
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
     
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
-    (cherry picked from commit 1ab50be938524dcd4a9e56d27e3b96a27c2db2c0)
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 8a32c39c00789c16006de61112627722ce548be1)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit 625d1088192a9ad972c20fbdbcb4bb9fda979157
+commit 0f9cfff4971ba9f2559312e4ab75fe576aec4b1c
 Author: Peter Hutterer <peter.hutterer@who-t.net>
 Author: Peter Hutterer <peter.hutterer@who-t.net>
-Date:   Fri Dec 16 09:15:25 2011 -0500
+Date:   Thu Dec 15 07:57:47 2011 +1000
 
 
-    dmx: force -fno-strict-aliasing for xinput example
+    mi: split move to new screen logic to a helper function
     
     
-    Compiler warning:
-    xinput.c:272: warning: dereferencing pointer 'e' does break strict-aliasing
-    rules
+    No functional changes.
     
     
-    The code itself is the usual XInput client-side code:
-            XEvent event;
-            XDeviceMotionEvent *e = (XDeviceMotionEvent *)&event;
-            XNextEvent(display, &event);
-            printf("%d\n", e->type);
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 48547068b115b1f5e5f46a70110454a2175fb9a4)
     
     
-    Since XDeviceMotionEvent is not guaranteed the same size as XEvent, clients
-    must use pointer aliasing as above when using the XNextEvent API. Disable
-    strict aliasing for this example.
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 73d9c55a86bf1361fcaabb8780fd01ddf5fc5e57
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Thu Dec 15 07:52:28 2011 +1000
+
+    dix: Remove touch grabs if the grab disappears
     
     
-    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
-    Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
     Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
-    Signed-off-by: Keith Packard <keithp@keithp.com>
-    (cherry picked from commit 3aca8199405cff5097ee5813605ec78b5ae44a43)
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 3b1e2035cc4740711360c845cfcdff07f7b60558)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit 53e347b22bb79043243e25891cd7d6f374a8aa23
-Author: Keith Packard <keithp@keithp.com>
-Date:   Tue Nov 8 10:13:15 2011 -0800
+commit dcb3ee2ba3f533f2cabbce9c0c94b7acde4d5fa3
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Thu Dec 15 07:48:49 2011 +1000
 
 
-    Save major/minor opcodes in ClientRec for RecordAReply
+    dix: hook up passive grabs and pointer emulated passive grabs
     
     
-    The record extension needs the major and minor opcodes in the reply
-    hook, but the request buffer may have been freed by the time the hook
-    is invoked. Saving the request major and minor codes as the request is
-    executed avoids fetching from the defunct request buffer.
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit cd3de8324e8908955a2e4be3000c8ffee8684c68)
     
     
-    This patch also eliminates the public MinorOpcodeOfRequest function,
-    inlining it into Dispatch. Usages of that function have been replaced
-    with direct access to the new ClientRec field.
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit d87933d11530e056181bc13f0ee6724149c3d78c
+Author: Carlos Garnacho <carlosg@gnome.org>
+Date:   Tue Dec 13 15:41:23 2011 +0100
+
+    Xi: assign correct grab_mode/other_device_mode in XI2 passive grabs
     
     
-    Signed-off-by: Keith Packard <keithp@keithp.com>
-    Reviewed-by: Jamey Sharp <jamey@minilop.net>
-    (cherry picked from commit fb22a408c69a84f81905147de9e82cf66ffb6eb2)
+    CreateGrab() expects the keyboard mode to be stored in grab_mode, and the
+    pointer mode in other_device_mode, so respect this in passive XI2 grabs,
+    and switch modes if needed.
+    
+    Signed-off-by: Carlos Garnacho <carlosg@gnome.org>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 5b169cb695bd450d7f64e3800f00c9237ee67f96)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 55e1e8691f2aa5f375a9c79bb469a3ad44ccd139
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Thu Dec 15 07:42:12 2011 +1000
+
+    Xi: add the hooks for passive touch grabs
+    
+    Co-authored-by: Daniel Stone <daniel@fooishbar.org>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 4469430b109fa2da7ba3d2fadf66eca78b7156a0)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 118d0e5841ea025f573df777491ff07abb3a616b
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Thu Dec 15 07:21:38 2011 +1000
+
+    Xi: handle grab accept/reject requests
+    
+    Consists mostly of generating an ownership event and processing it.
+    
+    Co-authored-by: Daniel Stone <daniel@fooishbar.org>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit bb0af002dc9ad5b464dc6793aedb6d1ff65d001d)
     
     Conflicts:
     
     
     Conflicts:
     
-       include/extension.h
+       Xi/xiallowev.c
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit b736f8c92bae7773ff6e1fca886f9ccc50156488
-Author: Julien Cristau <jcristau@debian.org>
-Date:   Sat Nov 5 13:00:07 2011 +0100
+commit 9507e4e1f1562c37b1877f921e288124393d7a6e
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Tue Dec 20 16:34:43 2011 -0800
 
 
-    Fix ShmPutImage for XYBitmap
+    Xi: hook up touch ownership handling
     
     
-    We can't call CopyArea in that case because the image has depth 1, which
-    might not match the target drawable, so we might overrun the shm
-    segment.  Commit 11817a881cb93a89788105d1e575a468f2a8d27c apparently
-    fixed a similar bug for XYPixmap, but missed the bitmap case.
+    Ownership changes don't get processed directly when they happen, instead the
+    DIX submits an ownership event which goes through ProcessTouchEvents and
+    ProcessTouchOwnershipEvents.
+    Then on the required events are generated and sent to clients.
     
     
-    Fixes: http://bugs.debian.org/629611
+    Co-authored-by: Daniel Stone <daniel@fooishbar.org>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 209b3d613a7bed126c81daedbad6461e4391e9e6)
     
     
-    Thanks to Alan Curry for diagnosing this and providing a test case.
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 151ecb96cbb5747aa9a58dbf0d5c5afaae553025
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Tue Dec 20 16:33:33 2011 -0800
+
+    Xi: hook up pointer emulation for emulating touches
     
     
-    Reported-and-tested-by: Alan Curry <pacman@kosh.dhis.org>
-    Reviewed-by: Peter Harris <pharris@opentext.com>
-    Signed-off-by: Julien Cristau <jcristau@debian.org>
-    (cherry picked from commit 08ec4da6a7617637914bee1636858474213cf39d)
+    Includes a hack for implicit grab activation, because integrating this
+    requires a larger rewrite and I'm not sleeping enough as it is.
+    Right now, we deliver the event and check before/after if there is an
+    implicit grab on. If one activated, then store the event in the grab and
+    switch the listener type to a grab listener.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 1894468c2b9788efa70ef4fb5fc911711402f3a7)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit b2a4c09507b267495ea5e4c2e05373b323c80edf
-Author: Jeremy Huddleston <jeremyhu@apple.com>
-Date:   Sat Dec 17 12:56:59 2011 -0800
+commit 4ef22a181992b7348757f84a49909a7f6a5d12e0
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Dec 14 17:04:38 2011 +1000
 
 
-    kdrive/linux: Fix compilation with -Werror=int-to-pointer-cast -Werror=pointer-to-int-cast
+    dix: add touch to pointer event conversion helper
     
     
-    Reported-by: Arkadiusz Miśkiewicz <arekm@maven.pl>
-    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
-    Reviewed-by: Jamey Sharp <jamey@minilop.net>
-    (cherry picked from commit 1deede3c48d5ac91f50774c79f02afc6e036614e)
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 753c4dca1e42035e29fb21458a746e484ed93ca3)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit beaa7ad2ec45811e16722283a8b557a08e91ef18
-Author: Jeremy Huddleston <jeremyhu@apple.com>
-Date:   Sat Dec 17 12:25:26 2011 -0800
+commit b3af3cbbd525d432f294c1ca2e0c458dd5c41a6d
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Dec 14 17:02:30 2011 +1000
 
 
-    configure.ac: Make Xephyr dependency error message more informative
+    dix: add real_event parameter to ActivatePassiveGrab
     
     
-    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
-    Reviewed-by: Jamey Sharp <jamey@minilop.net>
-    (cherry picked from commit d0170d54c71fc761b8f1ae7a0e555dc2ca23cf9c)
+    For touch events with pointer emulation, the event that triggers the grab
+    (the pointer event) is not the same as the actual event (the touch event).
+    For replaying, we need to store the real event then.
+    
+    No effective changes at this point, for the current caller event and
+    real_event are identical.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit c3843f5498a849920ab68cca3557411ad8ab3454)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit 41524dd61020f2a446ec54643fa17aa791338cac
-Author: Jeremy Huddleston <jeremyhu@apple.com>
-Date:   Fri Dec 16 17:47:46 2011 -0800
+commit a9b4de42cce42a4185365b449c95b7569b0f45db
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Tue Dec 20 16:32:52 2011 -0800
 
 
-    configure.ac: 1.11.3
+    Process and deliver touch events
     
     
-    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+    Does not include pointer emulation handling.
+    Does include partial ownership handling but not the actual processing of
+    ownership events.
+    
+    Note: this commit is a retroactive commit extracted from a series of ~50
+    commits and may thus appear a bit more complicated than what you'd write out
+    from scratch.
+    
+    Pointer processing tree is roughly:
+    - ProcessOtherEvents
+      - ProcessTouchEvents
+        - DeliverTouchEvents
+          - DeliverTouchBeginEvent|DeliverTouchEndEvent|...
+            - DeliverOneTouchEvent
+    
+    Also hooks up the event history playing to the right function now.
+    
+    Co-authored-by: Daniel Stone <daniel@fooishbar.org>
+    Co-authored-by: Chase Douglas <chase.douglas@canonical.com>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit e389a19a730055d4550ff708da83c78099a516fd)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 
-commit ee66474eb2009118a41539c6773e514a09d27e4d
-Author: Gaetan Nadon <memsize@videotron.ca>
-Date:   Fri Dec 9 07:45:02 2011 -0500
+commit 0951b7cc0c573a06600a8b0cb8a8cb423a471d77
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Thu Dec 15 07:53:19 2011 +1000
 
 
-    dmx: fix distcheck failure, missing compsize.h in Makefile.am
+    dix: set core and button state based on the touch state
     
     
-    which was added in commit:
-    dmx: Build fix for -Werror=implicit-function-declaration
+    If a pointer-emulating touch caused a button to be logically down, set that
+    state in the input events.
     
     
-    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
-    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
-    Signed-off-by: Keith Packard <keithp@keithp.com>
-    (cherry picked from commit 2c1d0a539c0fb1860ac89a00d1fb609f1959e1b6)
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 634b0da9a83076d0e9e0fc44dc5dc77b0c368bc1)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 90814f2ea800c5fa3f7121d4185e47b406565119
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Dec 14 16:33:05 2011 +1000
+
+    Xi: make UpdateDeviceState aware of touch events
+    
+    Update the logical button state for pointer-emulating events. Button state
+    must be kept separate from the ButtonClassRec to avoid clearing the button
+    state on a touch end if there is a physical button still down.
+    
+    And obviously don't change the button state if we're currently replaying the
+    event history for some client.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit dbfd7b37a0ba21899d8ebb7e0b324301bd466c49)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 2636f32908aeefeabade64ba1b81b8430cfd6653
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Dec 14 16:30:05 2011 +1000
+
+    dix: add TouchResourceIsOwner helper function
+    
+    The first listener in the sequence is the owner of the touch sequence.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 593c3e2eb3da5c5fb957b68c8025dfdbe1139639)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 83ea5e519c7e233409bcc9a210d7ce74518138e6
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Dec 14 16:24:17 2011 +1000
+
+    dix: add helper functions for adding/removing touch listeners
+    
+    The DIX will call TouchSetupListeners once for a new touch. After that
+    the listener list remains static, with listeners only dropping out when they
+    either reject the grab or disappear.
+    
+    Exception: if grabs activate they are prefixed to the listeners.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 5d0260cc986e8c1f0907870b851d47fd73bb1b7d)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit dbd4702466dfe0c7b6d5be3942294708dfa0df21
+Author: Chase Douglas <chase.douglas@canonical.com>
+Date:   Wed Dec 14 16:26:04 2011 +1000
+
+    dix: add TouchGetPointerEventType helper function
+    
+    Returns the respective pointer event type for a given touch event type.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 6a68f97ce6704dd2ff2a50f91acd2da72c9995bd)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 125fbadadcd8dbc3dfd88a1bf7f610a5baf7a975
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Wed Dec 14 16:53:04 2011 +1000
+
+    dix: when a window disappears, remove it from the touch sprite trace
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 8e58ce73c8b79cb86e890369d0216cdd850c52a5)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit a02a40fd7ac661737d895dc1852c74a8a84e5b26
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Wed Dec 14 16:03:01 2011 +1000
+
+    dix: add helper functions to build up/verify the sprite trace
+    
+    Touch events' sprite trace stays the same for the duration of the touch
+    sequence.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit c18a173cf5f53778356c5e8f25ab132956f8c27d)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 6ca95a9524b0ebd47eab7e0b8b016014ff65ed2f
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Dec 14 15:56:05 2011 +1000
+
+    dix: add touch event history helper functions
+    
+    If touch client has not registered for ownership events and a grab above
+    that client is rejected, the client needs to receive the complete event
+    history.
+    
+    The history currently doesn't really do fancy overflow handling. We assume
+    that the first TOUCH_HISTORY_SIZE events are the important ones and anything
+    after that is dropped. If that is a problem, fix the client that takes > 100
+    event to decide whether to accept or reject.
+    
+    Events marked with TOUCH_CLIENT_ID or TOUCH_REPLAYING must not be stored in
+    the history, they are events created by the DIX to comply with the protocol.
+    Any such event should already be in the history anyway.
+    
+    A fixme in this patch: we don't have a function to actually deliver the
+    event yet.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 40475261eacabb79a824db1138407a9d0f9fe37f)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 697dfd87140dac9c30d137631869287036bc938c
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Oct 26 09:08:17 2011 +1000
+
+    Support XI 2.2 officially
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit b274c472a5ad700aea5fe651d677e8cb34ffc976)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 88280f374162c8cca3e494226826cbcc27cdec86
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Wed Dec 14 15:45:19 2011 +1000
+
+    Xi: allow selecting for touch events
+    
+    Selecting for any of XI_TouchBegin/Update/End/Ownership requires the three
+    bits for begin/update/end to be set.
+    
+    Only one client at a time may select for XI_TouchBegin event
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit d2af968cb65873780a6e61342d5d3c23b9654e2a)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 4bcad5fc184ef3c22a7e0f417dc87ccb453d0791
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Dec 14 16:45:04 2011 +1000
+
+    dix: handle DIX-submitted touch events
+    
+    The DIX needs to submit touch events for e.g. TouchEnd after an
+    acceptance/rejection. These have the TOUCH_CLIENT_ID flag set.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit f3df3ad668fcd417ffb5afa3bea79a73a348bc1a)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 61770844df70cffd9611e780f48396bbb929382a
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Wed Dec 14 15:41:07 2011 +1000
+
+    dix: generate touchpoints from driver-submitted data
+    
+    The touchpoints are generated, enqueued but not processed since we don't
+    handle them in the event processing yet.
+    
+    Co-authored-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 9ce8463a3334f76f128bb35b541aa6e67b4e4374)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit c1846423c3f36f3760f733bef69f841ad6417c93
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Wed Dec 14 15:29:48 2011 +1000
+
+    dix: add GetTouchOwnership event API
+    
+    No callers yet. This API is not to be used by drivers, it's an API for the
+    DIX which will create ownership events mainly on touch acceptance/rejection.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit bec51f5ec6575a1971ae5371a4b6d8563933032c)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit f63fb7517d9dc41abb6d666353f84f7b334b00ac
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Dec 14 14:57:46 2011 +1000
+
+    dix: add DIX API to create touchpoints
+    
+    The DIX touchpoints are the ones used for event processing.
+    
+    Co-authored-by: Daniel Stone <daniel@fooishbar.org>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 5c63dc6dbcbebbb19d79575a9f1ec9878e6537f1)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit fc1f1f21580d76a2aacdf2fe8d3896e104d307f7
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Dec 14 14:53:52 2011 +1000
+
+    dix: if we run out of space for new touch events, resize the queue
+    
+    The SIGIO handler forces us to drop the current touch and schedule the
+    actual resize for later. Should not happen if the device sets up the
+    TouchClassRec with the correct number of touchpoints.
+    
+    Co-authored-by: Daniel Stone <daniel@fooishbar.org>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 7f8127d203394cae45c3ded0d063030d7c5fdb70)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 5550bcd5b377bf67b2b79ce6f1447b86bdbd98f9
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Dec 14 14:48:56 2011 +1000
+
+    dix: add helper functions to create DDX touch recs
+    
+    DDX touch points are the ones that keep records of the driver-submitted
+    touchpoints. They're unaffected by the grab state and terminate on a
+    TouchEnd submitted by the driver.
+    
+    The client ID assigned is server-global.
+    
+    Since drivers usually submit in the SIGIO handler, we cannot allocate in the
+    these functions.
+    
+    Co-authored-by: Daniel Stone <daniel@fooishbar.org>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 758bc57ba5a89f765d83f0b169aa09e79a89bf89)
+    
+    Conflicts:
+    
+       test/Makefile.am
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 378fb64a547a6ad2be4451a7aa634a3c91038644
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Thu Dec 15 08:30:02 2011 +1000
+
+    xfree86: bump the input ABI for the touch changes
+    
+    New additions to the API:
+    - InitTouchClassDeviceStruct
+    - xf86PostTouchEvent
+    
+    Changes to the ABI:
+    - DeviceIntRec now contains a TouchClassPtr
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 1a133eb8b1ddbe0da7c2fbf7f6a686ec4512373e)
+    
+    Conflicts:
+    
+       hw/xfree86/common/xf86Module.h
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 508df2ddd779504c3fef213e2a2d1a1ed61104c1
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Wed Dec 14 12:46:40 2011 +1000
+
+    input: add a TouchClassRec to the devices
+    
+    These structs will be used to store touch-related data, events and
+    information.
+    
+    Drivers must call InitTouchClassDeviceStruct to set up a multi-touch capable
+    device.
+    
+    Touchpoints for the DDX and the DIX are handled separately - touchpoints
+    submitted by the driver/DDX will be stored in the DDXTouchPointInfoRec. Once
+    the touchpoints are processed by the DIX, new TouchPointInfoRecs are created
+    and stored. This process is already used for pointer events with the
+    last.valuators field.
+    
+    Note that this patch does not actually add the generation of touch events,
+    only the required structs.
+    
+    TouchListeners are (future) recipients of touch or emulated pointer events.
+    Each listener is in a state, depending which event they have already
+    received. The type of listener defines how the listener got to be one.
+    
+    Co-authored-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 3fb258ca28850c998097b55884774cb95f476f69)
+    
+    Backported swap macros for SwapTouchInfo.
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit db04a6a8ea22c43daea1c26892694d89e7644c1c
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Wed Dec 14 14:41:48 2011 +1000
+
+    Add the touch input API stubs
+    
+    xf86PostTouchEvent is the driver API to submit touch events to the server.
+    This API doesn't do anything yet though but now we can at least bump the
+    API.
+    
+    For valuators, drivers should use the existing xf86InitValuatorAxisStruct
+    function.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 098b837440e40bbc485368ec9658e12efd6ef581)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 2e040f9bb00c8dbeda5cfbf768c618e23c2a25b1
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Dec 14 13:51:12 2011 +1000
+
+    Hook up the ownership events
+    
+    This patch applies most of the protocol conversions and the internal event
+    type for ownership events.
+    
+    Note that ownership events are generated by the DIX only, they do not pass
+    through the event queue.
+    
+    Co-authored-by: Daniel Stone <daniel@fooishbar.org>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 93c2a1628a9f6e7480d834bf55c080997fd18911)
+    
+    Backported swap macros in STouchOwnershipEvent.
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit bb67773ce0ee49f80de8828777285780a64ea60d
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Dec 14 13:21:59 2011 +1000
+
+    Xi: process raw touch events
+    
+    No-one can generated them yet, but if they could, we'd be processing them
+    like there was no tomorrow.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 3390d3fc0347947796aa245d70fefecf59b7bfe4)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit e7298a1fefc4b6083d6c5a45bf1f992e4e6c2233
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Dec 14 12:45:28 2011 +1000
+
+    Hook up TouchBegin/Update/End events
+    
+    The are the same as device events internally but require the touch ID
+    separately from the detail.button field (the protocol uses the detail field
+    for the touch id).
+    For simpler integration of pointer emulation we need to set the
+    detail.button field while keeping the touchid around.
+    
+    Add the three new touch event types to the various places in the server
+    where they need to be handled. The actual handling of the events is somewhat
+    more complicated in most places.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 84db813b9db34975b5fe288a8a551bb98f0cc1c1)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 1274c19c51b08cb8ad42f1655cf13112c06ad7ca
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Dec 14 15:00:33 2011 +1000
+
+    include: add a bunch of flags for GetTouchEvent processing
+    
+    TOUCH_CLIENT_ID is set if the touch was generated from a client ID instead
+    of a DDX/driver touch ID. i.e. submitted by the dix.
+    
+    TOUCH_END is a special flag that's required to force the touch to end.
+    Since the protocol with grab replaying and pointer emulation is rather
+    complex, it's quite hard to know otherwise when a touch sequence should
+    really die.
+    
+    The others do what it says on the imaginary box.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 92a5862d0c120b009a688237ec7142b7c21ae272)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 092f816c7f36fd22b5ec09a720327474c9ac5a16
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Dec 14 12:19:27 2011 +1000
+
+    include: RawTouchEnd is the last event now
+    
+    Plus, use the actual definition from the protocol instead of the numeric
+    values. Turns out not everyone knows the protocol event IDs by heart.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 956a97487beada8cf5f354550ff779635cc64361)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 73c74a9b5ec4e22698a5ba1e31e84c7305160054
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Dec 14 12:15:29 2011 +1000
+
+    tests: update for touch support
+    
+    Touch event mask must be set for all three event types.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 92c6c0c1d2d6a8882ed97b0e7f2952978ee5ce82)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 7452df21f4131365efd9fffd7dfff03bb1ad965a
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Dec 14 10:41:17 2011 +1000
+
+    Require inputproto 2.1.99.3
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 731b1db2fcc82c0a8afd28d7f28363c1db0a20ce)
+    
+    Conflicts:
+    
+       configure.ac
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit cb61ae915cbfc34697ed527bb87f4eeb1f9b61da
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Nov 2 10:38:26 2011 +1000
+
+    Xi: add a FIXME
+    
+    All the DeepCopy stuff really needs to be shared between the init calls the
+    drivers use and this code here. Too many bugs by not keeping the two in
+    sync.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 4c825eae89063fdc2241f92ab4101ba682b5b4b7)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 5a9d46a4afdfb726185e437eb7f071e10b7ca5b6
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Dec 14 13:21:03 2011 +1000
+
+    Xi: split ProcessOtherEvent into ProcessDeviceEvent
+    
+    No functional changes.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 0b9d2e426defabbf6df7e872e158b080a6a5e0be)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 01d34fb8bbeca48be09247a25fd54060da80725d
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Dec 16 09:52:43 2011 +1000
+
+    dix: split positionSprite into scale_to_desktop and positionSprite
+    
+    For future touch points, we need positionSprite to calculate the coordinates
+    but we don't want to actually change the cursor position for non-emulating
+    touches.
+    
+    No functional changes at this point.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Jamey Sharp <jamey@minilop.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 190a6f45ee7412870b3d95c5db6c1079a285bc59)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit a303ee4bb638e58f32ceb5f606db6879c1c16a77
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Thu Dec 15 10:19:26 2011 +1000
+
+    include: fix BUG_WARN_MSG for constant messages only
+    
+    Previous declaration required the use of a message + printf varargs. We
+    obviously want to allow the use of just a message.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    (cherry picked from commit ff6d9c79c1aa502f1aef81d8063425e5fc002534)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 17d456955ca912ff6536b7cff2f491f8b951e35e
+Merge: ce03688 625d108
+Author: Chase Douglas <chase.douglas@canonical.com>
+Date:   Wed Dec 21 12:30:03 2011 -0800
+
+    Merge remote-tracking branch 'upstream/server-1.11-branch' into upstream-1.11+input
+
+commit 625d1088192a9ad972c20fbdbcb4bb9fda979157
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Dec 16 09:15:25 2011 -0500
+
+    dmx: force -fno-strict-aliasing for xinput example
+    
+    Compiler warning:
+    xinput.c:272: warning: dereferencing pointer 'e' does break strict-aliasing
+    rules
+    
+    The code itself is the usual XInput client-side code:
+            XEvent event;
+            XDeviceMotionEvent *e = (XDeviceMotionEvent *)&event;
+            XNextEvent(display, &event);
+            printf("%d\n", e->type);
+    
+    Since XDeviceMotionEvent is not guaranteed the same size as XEvent, clients
+    must use pointer aliasing as above when using the XNextEvent API. Disable
+    strict aliasing for this example.
+    
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+    Signed-off-by: Keith Packard <keithp@keithp.com>
+    (cherry picked from commit 3aca8199405cff5097ee5813605ec78b5ae44a43)
+
+commit ce03688df5447e6634667a32785276105c31230e
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Dec 16 12:41:08 2011 +1000
+
+    dix: button state must show the logical buttons, not physical buttons
+    
+    If the device is mapped 3 2 1, a click on physical button 1 sends a button 3
+    press, but the state was set for button 1. Fix this, the state must be set
+    for that button's logical mapping.
+    
+    https://bugzilla.gnome.org/show_bug.cgi?id=655928
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit fcda98c48610fd507ca0b89c6006a5497d9dc1c9)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit d2178c5f2931363c8626ee27352235aa5688931d
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Dec 19 14:52:41 2011 +1000
+
+    dix: don't retrieve the syncEvents tail on an empty list
+    
+    An empty list points to itself but syncEvents has the list head only and is
+    of a different format than the elements. Thus, casting it to a QdEventPtr
+    gives us garbage.
+    
+    Segfaults with XTS test case Xlib13/XGrabKeyboard
+    
+    Introduced in 7af23259d88f4c28ed21140f82cc03b3724c06bb.
+    
+    Reported-by: Aaron Plattner <aplattner@nvidia.com>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
+    (cherry picked from commit 47da6b6b2c2e9245422655f94770146fb8cd430b)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 53e347b22bb79043243e25891cd7d6f374a8aa23
+Author: Keith Packard <keithp@keithp.com>
+Date:   Tue Nov 8 10:13:15 2011 -0800
+
+    Save major/minor opcodes in ClientRec for RecordAReply
+    
+    The record extension needs the major and minor opcodes in the reply
+    hook, but the request buffer may have been freed by the time the hook
+    is invoked. Saving the request major and minor codes as the request is
+    executed avoids fetching from the defunct request buffer.
+    
+    This patch also eliminates the public MinorOpcodeOfRequest function,
+    inlining it into Dispatch. Usages of that function have been replaced
+    with direct access to the new ClientRec field.
+    
+    Signed-off-by: Keith Packard <keithp@keithp.com>
+    Reviewed-by: Jamey Sharp <jamey@minilop.net>
+    (cherry picked from commit fb22a408c69a84f81905147de9e82cf66ffb6eb2)
+    
+    Conflicts:
+    
+       include/extension.h
+
+commit b736f8c92bae7773ff6e1fca886f9ccc50156488
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Sat Nov 5 13:00:07 2011 +0100
+
+    Fix ShmPutImage for XYBitmap
+    
+    We can't call CopyArea in that case because the image has depth 1, which
+    might not match the target drawable, so we might overrun the shm
+    segment.  Commit 11817a881cb93a89788105d1e575a468f2a8d27c apparently
+    fixed a similar bug for XYPixmap, but missed the bitmap case.
+    
+    Fixes: http://bugs.debian.org/629611
+    
+    Thanks to Alan Curry for diagnosing this and providing a test case.
+    
+    Reported-and-tested-by: Alan Curry <pacman@kosh.dhis.org>
+    Reviewed-by: Peter Harris <pharris@opentext.com>
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+    (cherry picked from commit 08ec4da6a7617637914bee1636858474213cf39d)
+
+commit b2a4c09507b267495ea5e4c2e05373b323c80edf
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Sat Dec 17 12:56:59 2011 -0800
+
+    kdrive/linux: Fix compilation with -Werror=int-to-pointer-cast -Werror=pointer-to-int-cast
+    
+    Reported-by: Arkadiusz Miśkiewicz <arekm@maven.pl>
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+    Reviewed-by: Jamey Sharp <jamey@minilop.net>
+    (cherry picked from commit 1deede3c48d5ac91f50774c79f02afc6e036614e)
+
+commit beaa7ad2ec45811e16722283a8b557a08e91ef18
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Sat Dec 17 12:25:26 2011 -0800
+
+    configure.ac: Make Xephyr dependency error message more informative
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+    Reviewed-by: Jamey Sharp <jamey@minilop.net>
+    (cherry picked from commit d0170d54c71fc761b8f1ae7a0e555dc2ca23cf9c)
+
+commit 41524dd61020f2a446ec54643fa17aa791338cac
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Fri Dec 16 17:47:46 2011 -0800
+
+    configure.ac: 1.11.3
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit ee66474eb2009118a41539c6773e514a09d27e4d
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Dec 9 07:45:02 2011 -0500
+
+    dmx: fix distcheck failure, missing compsize.h in Makefile.am
+    
+    which was added in commit:
+    dmx: Build fix for -Werror=implicit-function-declaration
+    
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+    Signed-off-by: Keith Packard <keithp@keithp.com>
+    (cherry picked from commit 2c1d0a539c0fb1860ac89a00d1fb609f1959e1b6)
+
+commit 3eaf942e727652db144d055a08ac2deb93c86105
+Author: Keith Packard <keithp@keithp.com>
+Date:   Wed Dec 14 11:40:10 2011 -0800
+
+    Merge remote-tracking branch 'whot/for-keith'
+    (cherry picked from commit 7da7aa96a0acb895e1fe57a9d3f2d093479cf2a2)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 481c6f70eb9889fa52e9ac2cc2805101ff2b8777
+Author: Chase Douglas <chase.douglas@canonical.com>
+Date:   Tue Dec 13 17:39:20 2011 -0800
+
+    A few random fixes that are needed due to backport cherry-picking
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit a44c1d329d1284939f9948161838193e9de2ef4f
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Dec 8 21:52:07 2011 -0800
+
+    Change disable_clientpointer return type to void
+    
+    It doesn't return anything, nor does it's caller expect it to.
+    
+    Fixes Solaris Studio compiler error:
+    "xichangehierarchy.c", line 214: Function has no return statement : disable_clientpointer
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Signed-off-by: Keith Packard <keithp@keithp.com>
+    (cherry picked from commit 372a6f10dc2d74d2d179e8b92449e9b8636a99ef)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 77cae4b31f9e22210d3b98dfd2f413818915ffc3
+Author: Keith Packard <keithp@keithp.com>
+Date:   Thu Dec 8 20:57:26 2011 -0800
+
+    Merge remote-tracking branch 'whot/for-keith'
+    (cherry picked from commit 522f8bcc0360d6a117e929a004bc956ab92037e9)
+    
+    Conflicts:
+    
+       hw/xfree86/common/xf86Module.h
+       include/input.h
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 9963b023509a8ec3ff33700faf331994b14bbd84
+Author: Keith Packard <keithp@keithp.com>
+Date:   Thu Dec 1 14:36:58 2011 +0000
+
+    Merge remote-tracking branch 'whot/for-keith'
+    (cherry picked from commit 3197b773c81e58cd4aa412eccaee49526012ed6f)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit cec13888543742bed1bee9edad0e7ad96b911539
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Nov 1 16:56:18 2011 -0700
+
+    Make XIGetKnownProperty take a const char * argument
+    
+    Now that MakeAtom takes const char *, so can XIGetKnownProperty.
+    Clears 71 warnings from gcc -Wwrite-strings of the form:
+    devices.c:145:5: warning: passing argument 1 of 'XIGetKnownProperty' discards qualifiers from pointer target type
+    ../include/exevents.h:128:23: note: expected 'char *' but argument is of type 'const char *'
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    (cherry picked from commit 5f285a30a1d6ffba82ebe5e08a0b68352bb51556)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 92f7f64c91c07ce5a74e5714166ce2372301e807
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Mon Oct 24 23:40:45 2011 -0700
+
+    Enable memory checking during unit testing
+    
+    If configure is generated with xorg-macros 1.16.0 or newer, and
+    an appropriate memory checking library is found for the platform,
+    use it when running unit tests.   If not, then no harm is done.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
+    (cherry picked from commit e47aa9475027ed6a255daefec85561c6b15789bd)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 3ea81b1d44befe9fa51bb3fefb51bba5b4a67454
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Oct 25 00:12:48 2011 -0700
+
+    Don't require ld -wrap for tests that don't need it
+    
+    If configure is generated with xorg-macros 1.16 or later, this allows
+    builders to --enable-unit-test and run the tests other than the xi2
+    tests which require ld -wrap (and are still wrapped in if HAVE_LD_WRAP
+    in tests/xi2/Makefile).  If an older xorg-macros is used, the existing
+    behaviour is preserved of requiring ld -wrap for all unit tests, but
+    no side effects occur, so the minimum xorg-macros version is not raised.
+    
+    If unit testing is enabled without ld -wrap, then we create a bogus
+    "xi2-tests" script just to report that we're skipping them.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
+    (cherry picked from commit 36670065bd74b870d0da7c6a69a9c0d222b21706)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 8eece5a0ef9547a247872419a63c81a9d6cf0223
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Aug 1 14:14:02 2011 +1000
+
+    input: replace remaining GetPairedDevice() with GetMaster()
+    
+    Wherever it's obvious which device we need (keyboard or pointer), use
+    GetMaster() instead of GetPairedDevice(). It is more reliable in actually
+    getting the device type we want.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 35ec24cf245e5ef676e98a0bf7c77296a3f1ff63)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 4b7dd4523c11ef4952b78e4164b2fa7b34588867
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Tue Nov 1 12:17:50 2011 +1000
+
+    xfree86: duplicate name and driver from pInfo for NewInputDeviceRequest
+    
+    xorg.conf devices had the name and driver set in the DDX's InputInfoPtr list
+    but not in the option list for those devices. That information was lost when
+    passing the options into NewInputDeviceRequest. NIDR then refused to start
+    the devices.
+    
+    Introduced in xorg-server-1.11.0-250-ge4cd24e
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Tested-by: James Cloos <cloos@jhcloos.com>
+    (cherry picked from commit c643c2b7bf480f5c27ff8606bda087f8bff3b154)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit cb5044370af84c760feeb32522d98e157f88fb6a
+Author: Keith Packard <keithp@keithp.com>
+Date:   Wed Nov 2 21:20:07 2011 -0700
+
+    Merge remote-tracking branch 'whot/two-screen-coordinates'
+    (cherry picked from commit d91aa0e6601bdf3e2cfa57b3412ab14ac486edc4)
+    
+    Conflicts:
+    
+       dix/dispatch.c
+       dix/inpututils.c
+       hw/xfree86/common/xf86Xinput.h
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 5f6416463b2acb5e434eb1e2209f79b2040e9fae
+Author: Dave Airlie <airlied@redhat.com>
+Date:   Thu Oct 27 08:38:45 2011 +1000
+
+    test: fix two more failing FP3232 tests
+    
+    And put a comment in to explain why we're testing for a frac between .3 and
+    .6. We can't directly compare the frac since the floating/fixed point
+    conversion loses precision.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    (cherry picked from commit 005ab41986b0bb6a4e626aee7a7a542247f422e7)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 869bd27ab17d46f3982ea4930d861b616fc90330
+Author: Alexandr Shadchin <alexandr.shadchin@gmail.com>
+Date:   Sat Oct 29 00:14:32 2011 +0600
+
+    Fix position _X_EXPORT
+    
+    Signed-off-by: Alexandr Shadchin <Alexandr.Shadchin@gmail.com>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Signed-off-by: Keith Packard <keithp@keithp.com>
+    (cherry picked from commit 91131037a2d2e07079de5d222d8a8c95300750cc)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit c8e249e5bd0dee563effb7ae58d97b0e1d5865d1
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Thu Oct 20 16:42:20 2011 +1000
+
+    Use new FP1616/FP3232 conversion functions
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
+    (cherry picked from commit ffe20acedb3cdc4811eb52f8fc540ba6af7339fa)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 11b244ab6ea1dd2a8655d1fd5d1e2055531bf0fe
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Thu Oct 20 16:49:28 2011 +1000
+
+    test: fix test with new double -> fp3232 conversion functions
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Tested-by: Dave Airlie <airlied@redhat.com>
+    Reviewed-by: Dave Airlie <airlied@redhat.com>
+    (cherry picked from commit 7500d841f4c709ae0edc6420332096d3b9ef9fcc)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit dc06150807ecd57d13959fbfda87b0512efed91a
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Oct 19 13:17:51 2011 +1000
+
+    Xi: send DeviceChangedEvents when the scroll valuators change value
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 4bb5d8fae4f9a70f12591315f0b267a2ea826a0c)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 1036c8b3233766a9a7e392a5c11d2972efcea81c
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Oct 19 12:28:37 2011 +1000
+
+    dix: accept a NULL master for CreateClassesChangedEvent
+    
+    If a floating device changes, the master is NULL but we must still create a
+    DCE for it.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 1f4af6c12fb5d4c19f4eac3df768517c9132cc88)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit a3e6b576402e02c5b03483f96c8eaf72ebcd73fb
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Oct 19 12:11:16 2011 +1000
+
+    Xi: ensure the deviceid for DeviceChangedEvents is always the right one
+    
+    If we're sending the event for a given device, make sure the deviceid is
+    that of the device.
+    This allows callers to use the same DCE for slave and master without having
+    to fiddle the DCE's internal fields.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit d77dec6971e4a0b306c8dbd5adf627908d7972cb)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 740d7e37a1e2d3b2f955f95276f746afe43515ec
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Tue Oct 18 17:47:59 2011 +1000
+
+    dix: pass the flags into the CreateClassesChangedEvent
+    
+    No effective functional changes, prep work for future patches.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit e9dee21fa3213bfe87b2b728a38eb41d3ba0e664)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 4d7824db35c4121a6a3a9560981c8f6f3826f8bf
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Tue Oct 18 17:41:29 2011 +1000
+
+    dix: drop unused argument from XISendDeviceChangedEvent
+    
+    Instead of device and master (and just using master), drop the master
+    argument and let the callers pass in the device the event is to be sent for.
+    
+    No effective functional changes.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit fcdd2587a17437b643b4592aa7f65d11c05a4cd8)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 5647fd210d0d7d7c723689f95c84eeb968339b7e
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Tue Oct 18 17:11:27 2011 +1000
+
+    dix: add ScrollInfo to DeviceChangedEvents
+    
+    3304bbff9b4ed63f1a47410a5320a136420ba2c6 added smooth scrolling support for
+    pointer events and for XIQueryDevice but didn't add the matching parts to
+    XIDeviceChangedEvents.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 8473e441b0f832775153281bc3df5e2d4feb2b36)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit e3744f444174c63d0a297e2127c9437483a84546
+Author: Andreas Wettstein <wettstein509@solnet.ch>
+Date:   Thu Aug 11 16:33:33 2011 +1000
+
+    xkb: Support noLock and noUnlock flags for LockMods
+    
+    These flags are required by the XKB spec section 6.3.
+    
+    Signed-off-by: Andreas Wettstein <wettstein509@solnet.ch>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    (cherry picked from commit e3f6a76dd480717eae4b17ad8e2ff707de2ffe4c)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit c6325a9d104029ae7e7045b7a8a0612b1da802f9
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Oct 21 09:09:55 2011 +1000
+
+    xfree86 doc: replace driver "keyboard" with "kbd"
+    
+    We've deprecated keyboard a long time ago
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    (cherry picked from commit 6f33593dc087d367d899d1cb6e6e30b282d922e2)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 7ee1621364d2b6230bb1c02bbdb5b6abb74ad2ff
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Aug 5 14:48:02 2011 +1000
+
+    xfree86: use NewInputDeviceRequest for xorg.conf devices too
+    
+    Only use one init path for input devices - through NIDR.
+    
+    This requires that inp_driver and inp_identifier from the
+    XF86ConfInputRec are copied over into the options for NIDR to see them.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit e4cd24e717ef1059804b3f6bb483810b708cd56a)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 2d2cf90360126ddf9c3d404568bafacbc7456d84
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Aug 10 14:37:41 2011 +1000
+
+    dix: move #if statement to stop compiler warning
+    
+    ptrveloc.c: In function 'QueryTrackers':
+    ptrveloc.c:598:34: warning: variable 'used_offset' set but not used
+    [-Wunused-but-set-variable]
+    
+    used_offset is used, but only in the debugging code. Move the #if statement
+    to ignore that warning.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 1ecc427a39d41e723912492b846512fd0ad9af2d)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 9c5d621fc6a6c0c067c0a7de8872771271985554
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Aug 5 14:05:58 2011 +1000
+
+    xfree86: Fix a comment, the old function doesn't exist anymore
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit f9067c1dd8ce9058eb48a20dfae52bc8cf3a1e55)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit c3deb23e59a4d93899a8e9025fd0215a4a4d7723
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Aug 10 15:58:34 2011 +1000
+
+    xfree86: use xf86AddNewOption instead of xf86addNewOption
+    
+    The former strdups for us. If the strdup fails we miss out on the
+    CorePointer option (default on anyway) and we're likely to fall over soon
+    anyway, so let's pretend this is the same behaviour.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit aeab26e9e1751e1e3514798fa53e9bd604b0d254)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 58c411bd0f5d867f21f98c965deb054404211780
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Mon Oct 17 23:45:32 2011 -0700
+
+    test: Add unit test for mieq
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    (cherry picked from commit 4597ac6fe0580323860080dae2576733acc49757)
+    
+    Conflicts:
+    
+       test/input.c
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit ab7c89d52bf043d7eaa1a5adecf2412fac048325
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Mon Oct 17 21:16:37 2011 -0700
+
+    mieq: Reserve some space in EQ for release and other special events
+    
+    The last 64 events in the event queue will be reserved for release
+    events in order to help return the system to a cleaner state when
+    it comes back from a soft wedge.
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    (cherry picked from commit ad450d76e468cd62406c4f09e71e131f7ff4555c)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 1ecb0b451bb622d22b4a34b0c60a5caee8ca5137
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Sat Oct 15 22:51:30 2011 -0700
+
+    mieq: Provide better adaptability and diagnostics during mieq overflow
+    
+    This patch changes from a static length event queue (512) to one that
+    starts at 128 and grows to 4096 as it overflows, logging each time it
+    grows.
+    
+    This change also allows for multiple backtraces to be printed when the
+    server is wedged rather than just one.  This increased sampling should
+    help identify the true hog in cases where one backtrace might be
+    insufficient.
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    (cherry picked from commit 7d153f25be678acf500236ae422b33d17e6cb7a6)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 809ff8badee654467329182e21fc35db0f01704c
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Wed Oct 5 15:02:52 2011 -0700
+
+    test: Silence some debug lines from the input unit tests
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    (cherry picked from commit a046d649e4c7e4d28f350382dcdd293e92a59aad)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 3c12875447cbe24664ae5578df832110e58fb76f
+Author: Keith Packard <keithp@keithp.com>
+Date:   Wed Oct 19 17:26:50 2011 -0700
+
+    Merge remote-tracking branch 'whot/for-keith'
+    (cherry picked from commit 15bbdc103b34b6b374815698946e6c409421a644)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit e4b0c485ff3dafc90e0171ad49f88345193e3b7a
+Author: Dave Airlie <airlied@redhat.com>
+Date:   Wed Oct 12 09:59:38 2011 +0100
+
+    test: fix input test
+    
+    The test was memsetting the wrong thing, this fixes make check in my tinderbox.
+    
+    Signed-off-by: Dave Airlie <airlied@redhat.com>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
+    (cherry picked from commit 1433103a49b97e356da0f20aa65046cdb2f5ece6)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 44431b35e6fe1e8ab3152b784a951d9c54b72242
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Wed Oct 5 15:02:52 2011 -0700
+
+    dix: add utility functions for double to/fro FP1616/FP3232 conversion
+    
+    Co-authored-by: Jeremy Huddleston <jeremyhu@apple.com>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
+    Reviewed-by: Mark Kettenis <kettenis@openbsd.org>
+    (cherry picked from commit f9c6903d4a90b59c328f4fa05d2be9e0ce1c5189)
+    
+    Conflicts:
+    
+       test/input.c
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit ddf22daa6f7f4c7c01e95cd11218e7357fdda337
+Author: Keith Packard <keithp@keithp.com>
+Date:   Mon Oct 17 13:50:25 2011 -0700
+
+    Merge remote-tracking branch 'whot/next'
+    (cherry picked from commit fb84be47db7cdaff406792c08e34670e8e0cbda9)
+    
+    Conflicts:
+    
+       dix/inpututils.c
+       include/input.h
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit cf4e91a4c8a9dd227dce2a9fe15e507b7ae844e4
+Author: Keith Packard <keithp@keithp.com>
+Date:   Mon Oct 3 11:36:28 2011 -0700
+
+    Merge remote-tracking branch 'whot/next'
+    (cherry picked from commit f5d50b46ddeb039ab6564141f61261e94ee67637)
+    
+    Conflicts:
+    
+       hw/xfree86/common/xf86Xinput.h
+       test/xi2/protocol-eventconvert.c
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit a17c72bc0ed96441662a8d827220d389041bbafb
+Author: vdb@picaros.org <vdb@picaros.org>
+Date:   Wed Aug 31 07:23:01 2011 +0200
+
+    xfree86: .BI style: monitor section in xorg.conf man page
+    
+    The xorg.conf manual uses the following convention in most of its
+    sections:
+    
+    bold = text to be copied literally to the config file,
+    italic = a symbolic name to be substituted by a true value.
+    
+    Some configuration keywords seem to have been changed into generic
+    options.  Prepending Option to the manual entry swapped the
+    bold-italic logic.  This patch restores the convention in the monitor
+    section and consists of
+    
+    -.BI "Option " "\*qPreferredMode\*q  " \*qstring\*q
+    +.BI "Option \*qPreferredMode\*q \*q" name \*q
+    
+    modifications.
+    
+    Plus a few minor changes (Modes → Mode) and a typo fix.
+    
+    Signed-off-by: Servaas Vandenberghe
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    (cherry picked from commit c7163fdd302f706a3d67f0fdf93eeb3396bb3332)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit f5be70465e8125bb30596761207e16d5487161e2
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Tue Sep 6 09:33:43 2011 +1000
+
+    xfree86: expose Option "TransformationMatrix"
+    
+    Recent changes to the server change the default absolute input device
+    behaviour on zaphods to span the whole desktop too. Since these setups
+    usually use an xorg.conf, allow the transformation matrix to be specified in
+    the config as well.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Simon Thum <simon.thum@gmx.de>
+    (cherry picked from commit 4b4caecb7d2c8e0b7e4fedc95fba2a728bbc25e6)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 6f1775f76248561367cb908207f05b9e7ab74864
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Tue Sep 6 09:39:01 2011 +1000
+
+    xfree86: use subheader for Pointer Acceleration parts in xorg.conf(5)
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    (cherry picked from commit cf51424a34fb2b567a867338ab44f83b5c43251c)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit dee2412a68e04d43c86c2aa7a4e1f70ee98f4a60
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Sep 5 15:43:14 2011 +1000
+
+    xfree86: fix comment typo
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    (cherry picked from commit 9125952b407090b040bffb3d752288293137cf77)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit e36277e9e31190d403e1ddb44539ab262cf0eea2
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Aug 8 15:21:46 2011 +1000
+
+    Add null-terminated list interface.
+    
+    This is a set of macros to provide a struct list-alike interface for classic
+    linked lists such as the XF86OptionRec or the DeviceIntRec. The typical
+    format for these is to have a "struct foo *next" pointer in each struct foo
+    and walk through those. These macros provide a few basic functions to add to,
+    remove from and iterate through these lists.
+    
+    While struct list is in some ways more flexible, switching legacy code to
+    use struct list is not alway viable. These macros at least reduce the amount
+    of open-coded lists.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    (cherry picked from commit fcafe825751bef99f4c0b36250ca6f15f127502f)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 4cc88f2c59eb21689ecba221bc0eaeaa46e7374d
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Aug 12 15:55:48 2011 +1000
+
+    xfree86: comment typo fix
+    
+    in synch → in sync
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    (cherry picked from commit 79ca7c0b5786a02a80a1c40ed475e928da7c82b3)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 95bc0b5705bb0e78a9cb2aaaf8d7ba61af21450c
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Jul 29 16:33:54 2011 +1000
+
+    dix: don't XWarpPointer through the last slave anymore (#38313)
+    
+    This line was introduced pre-1.6 to fix Bug 19297. The effect of warping
+    through the VCP then was that if a device had custom valuator ranges, the
+    warp position would be wrong. The better device for this effect is the the
+    XTest device.
+    
+    This fixes a server crash where the lastSlave is a pointer device without
+    valuators (Bug 38313#0).
+    
+    And while we're at it, make sure the Xinerama code-path does the same.
+    
+    X.Org Bug 38313 <http://bugs.freedesktop.org/show_bug.cgi?id=38313>
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 2bfb802839688ecf328119c4c6979390fc60348d)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 0bfa207c31ce962e7373a3e9c0d4e4764474c867
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Thu Aug 11 10:59:07 2011 +1000
+
+    dix: use helper functions in EventIsDeliverable
+    
+    Proximity events don't have an XI2 type and caused error messages in the
+    log when trying to get the event filter. Use this opportunity to
+    clean up the code, instead of manually setting the fields that
+    GetEventFilter requires use EventTo(XI2|XI|Core) instead.
+    
+    Co-Authored-by: Keith Packard <keithp@keithp.com>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Keith Packard <keithp@keithp.com>
+    (cherry picked from commit 3be379f5076566edaf92c27df5a4d447bcf5d015)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit d6b224872b2a950c91cab3369a1d18015376e3a7
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Thu Aug 11 10:57:05 2011 +1000
+
+    dix: abstract XI2 filter mask lookup
+    
+    Don't access the xi2mask bytes directly or calculate the offsets manually,
+    use a few helper functions instead. XI2 masks are a bit weird in the event
+    handling code since they slot onto the legacy code. For core/XI 1.x events,
+    the event mask is a CARD32. That mask is used together with the event filter
+    (also 32 bit) to determine if event delivery should be attempted.
+    XI2 masks are of arbitrary size and their mask is simply the byte of the
+    mask that contains the event mask. Likewise, the filter is a single byte
+    matching that mask. Provide helper functions get these bytes and masks in
+    the right order instead of accessing them manually.
+    
+    EventIsDeliverable should be part of this cleanup patch but it will be
+    gutted with the next patch.
+    
+    Co-Authored-by: Keith Packard <keithp@keithp.com>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Keith Packard <keithp@keithp.com>
+    (cherry picked from commit 799879797505a5e891ccaec2bea73fd838c94b7a)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 3df4cf9f986a1758972d47e1a4955dd6148bb9bf
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Aug 3 15:07:23 2011 +1000
+
+    input: provide a single function to init DeviceEvents to 0
+    
+    getevents.c already had that function, but XKB was manually initializing it,
+    causing bugs when the event structure was updated in one place but not the
+    other.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    (cherry picked from commit 3a077f246e9ac07a37c1b01c3d321e0f5ceb4153)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 93b29777be13d2d1055b6a4d191b4dd03e953961
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Aug 1 14:20:53 2011 +1000
+
+    dix: fix compiler warnings ("foo" set but not used)
+    
+    devices.c: In function 'AttachDevice':
+    devices.c:2409:18: warning: variable 'oldmaster' set but not used
+    [-Wunused-but-set-variable]
+    
+    events.c: In function 'ConfineToShape':
+    events.c:683:15: warning: variable 'pSprite' set but not used
+    [-Wunused-but-set-variable]
+    
+    events.c: In function 'ProcGrabPointer':
+    events.c:4759:15: warning: variable 'time' set but not used
+    [-Wunused-but-set-variable]
+    
+    getevents.c: In function 'GetMotionHistory':
+    getevents.c:425:9: warning: variable 'dflt' set but not used
+    [-Wunused-but-set-variable]
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 4b376ddeb4f3c9d9d279ffd2946d88edd5af4cfc)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit af899fc57c08a3f7bbf033204b2fb0aacc5f0aa4
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Aug 1 14:27:54 2011 +1000
+
+    mi: fix compiler warnings ("foo" set but not used)
+    
+    misprite.c: In function 'miSpriteSaveUnderCursor':
+    misprite.c:940:12: warning: variable 'y' set but not used
+    [-Wunused-but-set-variable]
+    misprite.c:940:9: warning: variable 'x' set but not used
+    [-Wunused-but-set-variable]
+    
+    mivaltree.c: In function 'miComputeClips':
+    mivaltree.c:226:10: warning: variable 'resized' set but not used
+    [-Wunused-but-set-variable]
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 6fd2adc179141310e45a56ee90ef5b5f6115a1f6)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 2ad6d4c3abe3e3d4c517a50f30c73016c5e683d0
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Tue Aug 2 09:21:00 2011 +1000
+
+    Xi: silence compiler warnings (set but not used)
+    
+    exevents.c: In function 'UpdateDeviceState':
+    exevents.c:719:9: warning: variable 'bit' set but not used
+    [-Wunused-but-set-variable]
+    
+    exevents.c: In function 'ProcessOtherEvent':
+    exevents.c:889:22: warning: variable 'v' set but not used
+    [-Wunused-but-set-variable]
+    exevents.c:888:17: warning: variable 'k' set but not used
+    [-Wunused-but-set-variable]
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 484cef5b29ef82402a15e155b3b8505b1e4a6830)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 4ce019c541c41bb5533a5a5a8b74db82049115a7
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Aug 1 13:52:13 2011 +1000
+
+    dix: add KEYBOARD_OR_FLOAT and POINTER_OR_FLOAT to GetMaster()
+    
+    GetMaster() currently requires an attached slave device as parameter,
+    resuling in many calls being IsFloating(dev) ? dev : GetMaster(...);
+    
+    Add two new parameters so GetMaster can be called unconditionally to get the
+    right device.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 98fe735ea1d756711019c3d90ed6abd9c06abebf)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 7127c6960d04dd681cd3de8852220d2f90513e82
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Tue Aug 2 08:54:00 2011 +1000
+
+    test: add a test for GetMaster() behaviour
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit dbbe5735d1451bb32f43bce90f0bcfeff46f9743)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 7cea2bd9a921ae55d6d9f5072b8f9a6d7b761146
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Aug 1 11:54:17 2011 +1000
+
+    mi: fix comment typo, whitespace in miPointerSetPosition
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit b3c76b0c53ac42b70d12849da18465e8467e474c)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 82241760f5e738646d30253c08ec2e1c91bcf513
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Aug 1 09:52:38 2011 +1000
+
+    dix: rename mieqSwitchScreen argument fromDix → set_dequeue_screen, document
+    
+    fromDIX is neither exactly true nor particularly helpful in understanding
+    what this parameter triggers. Rename to set_dequeue_screen, because that's
+    exactly what happens.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit c9562bed0d5e26b7e3e55e26cf1ddc5086d61cc6)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit e4e5c3806093da3c8d798da3771fadce30f8858a
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Tue Aug 9 11:21:06 2011 +1000
+
+    config: use add_option for '_source' too
+    
+    _source was being allocated manually, with all other options added to that
+    list through add_option. Skip the manual part, allocate the first option
+    _source with add_option too.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 20a61845d3c93c337bf3331a6bac30cf66c2a293)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 79289b346559876579be1cffc1d2fd35b33ccc2b
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Tue Aug 9 11:20:31 2011 +1000
+
+    config: return the new InputOption from add_option.
+    
+    Change add_option to return the new InputOption on success, or NULL
+    failure. This way we can at least check for errors in callers.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit d33652dad8838ab0a9175ca4613a3161ebc5676f)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 9d4324b005d177671827048b25e0314c6470cf8e
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Jul 8 16:13:45 2011 +1000
+
+    Revert "Attempt to add the 'mouse' driver in more situations."
+    
+    This reverts commit 43d9edd31e31b33b9da4a50d8ab05004881c8d5a.
+    
+    This commit was introduced in the 1.2 cycle when hotplugging was less than
+    ideal (i.e. it didn't exist). From the commit message:
+    
+        Always add a mouse driver instance configured to send core events, unless
+        a core pointer already exists using either the mouse or void drivers.  This
+        handles the laptop case where the config file only specifies, say,
+        synaptics, which causes the touchpad to work but not the pointing stick.
+        We don't double-instantiate the mouse driver to avoid the mouse moving twice
+        as fast, and we skip this logic when the user asked for a void core pointer
+        since that probably means they want to run with no pointer at all.
+    
+    To get this case above, a user would need to disable hotplugging _and_ have a
+    xorg.conf that only references one device. This is possible, but not a use-case
+    we should worry about too much now.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 1357cd725143c1a35e32f15df658de111b151692)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 94283b6b5b0d529041a061f96a90f357c5e091e3
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Jul 8 16:10:07 2011 +1000
+
+    xfree86: use xf86AllocateInput for implicit devices too
+    
+    Slowly merging the vastly different code-paths.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 95772598b57f6054fbf88683fa0a492c77605790)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 025dd499ae9c1190b8f6baef5bd50f9b26ae6d80
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Jul 4 15:02:20 2011 +1000
+
+    xfree86: factor out adding/removing a device from the input device array
+    
+    No functional changes, just readability improvements. This also gets rid of
+    the count variable. Count was just used for resizing the null-terminated
+    list. Since we're not in a time-critical path here at all we can afford to
+    loop the list multiple times instead of keeping an extra variable around.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit fa8f4652819b692faaf2789cf32d7fa99fbb34aa)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 22434f6706b9742ea9c350ae61324d7045a2e30e
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Jul 4 14:14:11 2011 +1000
+
+    xfree86: update comment for InitInput
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 5b5477c05f691205064ca4d8034f8dd47ab975b7)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 8362af42e29add5d02c88712f49808bed072fbd0
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Jul 4 14:26:13 2011 +1000
+
+    xfree86: nest loops instead of 0x1 pointers.
+    
+    If we find the core device, move all other device pointers forward right
+    then and there. The break will jump out of the top loop.
+    
+    They had a special on braces today, so I added some for readability (and
+    fixed up tab vs space indentation.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 7354f607833c69626d8692bc5176b18ea1cf6263)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit c5c869867c5fcc7b60cad3c69237624ad51162db
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Jul 4 14:05:30 2011 +1000
+
+    xfree86: improve readability of synthesized device.
+    
+    No functional changes.
+    
+    The options we assign are the ones from the Pointer/Keyboard device so we
+    might as well use those readable names instead of dev[count-1]->options.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 5669aa2d24dff9ab276e5f74a09f97ec77b90e75)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 19cdfec1b49afcf9d00f486526f14aa0ac32e94a
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Jul 4 13:52:11 2011 +1000
+
+    test: add a option duplication test
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 5aa826cdd1f2e768bedf23d399703a5d0b6302be)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit eebfaa128b6b87012918545e19ee67acd0306433
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Jul 4 13:46:24 2011 +1000
+
+    xfree86: when implicitly choosing a core device, set the option to a value
+    
+    Devices are core pointers/keyboards by default now anyway, but let's set the
+    option to some value instead of just NULL.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 4527e2b776cfcdac2b189b5439b9a3d0b6433077)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
+
+commit 7a6b7fba273adf42b80fcb278db2a9dafcb9d2b6
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Jul 4 13:44:44 2011 +1000
+
+    xfree86: don't warn about duplicate core devices
+    
+    It doesn't matter. All devices are core pointer devices by default now
+    anyway.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    (cherry picked from commit 44d53728a6a533fc0a6e0a10269d1cc99e9dad32)
+    
+    Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
 
 commit 0ca8869e4537412f25bfd5610aba5e604952608c
 Author: Jeremy Huddleston <jeremyhu@apple.com>
 
 commit 0ca8869e4537412f25bfd5610aba5e604952608c
 Author: Jeremy Huddleston <jeremyhu@apple.com>
index 9d43564f86609ac875a2f176949bb5ccfe9fa67d..6b2db4b5988060da60ffb61706edabe3576732db 100644 (file)
@@ -44,6 +44,32 @@ SOFTWARE.
 
 ********************************************************/
 
 
 ********************************************************/
 
+/*
+ * Copyright © 2010 Collabora Ltd.
+ * Copyright © 2011 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Daniel Stone <daniel@fooishbar.org>
+ */
+
 /********************************************************************
  *
  *  Routines to register and initialize extension input devices.
 /********************************************************************
  *
  *  Routines to register and initialize extension input devices.
@@ -78,6 +104,7 @@ SOFTWARE.
 #include "eventconvert.h"
 #include "eventstr.h"
 #include "inpututils.h"
 #include "eventconvert.h"
 #include "eventstr.h"
 #include "inpututils.h"
+#include "mi.h"
 
 #include <X11/extensions/XKBproto.h>
 #include "xkbsrv.h"
 
 #include <X11/extensions/XKBproto.h>
 #include "xkbsrv.h"
@@ -104,7 +131,7 @@ int
 XIShouldNotify(ClientPtr client, DeviceIntPtr dev)
 {
     DeviceIntPtr current_ptr = PickPointer(client);
 XIShouldNotify(ClientPtr client, DeviceIntPtr dev)
 {
     DeviceIntPtr current_ptr = PickPointer(client);
-    DeviceIntPtr current_kbd = GetPairedDevice(current_ptr);
+    DeviceIntPtr current_kbd = GetMaster(current_ptr, KEYBOARD_OR_FLOAT);
 
     if (dev == current_kbd || dev == current_ptr)
         return 1;
 
     if (dev == current_kbd || dev == current_ptr)
         return 1;
@@ -128,6 +155,21 @@ IsPointerEvent(InternalEvent* event)
     return FALSE;
 }
 
     return FALSE;
 }
 
+Bool
+IsTouchEvent(InternalEvent* event)
+{
+    switch(event->any.type)
+    {
+        case ET_TouchBegin:
+        case ET_TouchUpdate:
+        case ET_TouchEnd:
+            return TRUE;
+        default:
+            break;
+    }
+    return FALSE;
+}
+
 /**
  * @return the device matching the deviceid of the device set in the event, or
  * NULL if the event is not an XInput event.
 /**
  * @return the device matching the deviceid of the device set in the event, or
  * NULL if the event is not an XInput event.
@@ -492,6 +534,8 @@ DeepCopyKeyboardClasses(DeviceIntPtr from, DeviceIntPtr to)
 
 }
 
 
 }
 
+/* FIXME: this should really be shared with the InitValuatorAxisClassRec and
+ * similar */
 static void
 DeepCopyPointerClasses(DeviceIntPtr from, DeviceIntPtr to)
 {
 static void
 DeepCopyPointerClasses(DeviceIntPtr from, DeviceIntPtr to)
 {
@@ -624,6 +668,41 @@ DeepCopyPointerClasses(DeviceIntPtr from, DeviceIntPtr to)
         classes->proximity = to->proximity;
         to->proximity      = NULL;
     }
         classes->proximity = to->proximity;
         to->proximity      = NULL;
     }
+
+    if (from->touch)
+    {
+        TouchPointInfoPtr tmp;
+        if (!to->touch)
+        {
+            classes = to->unused_classes;
+            to->touch = classes->touch;
+            if (!to->touch)
+            {
+                int i;
+                to->touch = calloc(1, sizeof(TouchClassRec));
+                if (!to->touch)
+                    FatalError("[Xi] no memory for class shift.\n");
+                to->touch->num_touches = from->touch->num_touches;
+                to->touch->touches = calloc(to->touch->num_touches,
+                                            sizeof(TouchPointInfoRec));
+                for (i = 0; i < to->touch->num_touches; i++)
+                    TouchInitTouchPoint(to->touch, to->valuator, i);
+                if (!to->touch)
+                    FatalError("[Xi] no memory for class shift.\n");
+            } else
+                classes->touch = NULL;
+        }
+        tmp = to->touch->touches;
+        memcpy(to->touch, from->touch, sizeof(TouchClassRec));
+        to->touch->touches = tmp;
+        to->touch->sourceid = from->id;
+    } else if (to->touch)
+    {
+        ClassesPtr classes;
+        classes = to->unused_classes;
+        classes->touch = to->touch;
+        to->touch      = NULL;
+    }
 }
 
 /**
 }
 
 /**
@@ -651,7 +730,7 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to, DeviceChangedEvent *dc
  * Send an XI2 DeviceChangedEvent to all interested clients.
  */
 void
  * Send an XI2 DeviceChangedEvent to all interested clients.
  */
 void
-XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master, DeviceChangedEvent *dce)
+XISendDeviceChangedEvent(DeviceIntPtr device, DeviceChangedEvent *dce)
 {
     xXIDeviceChangedEvent *dcce;
     int rc;
 {
     xXIDeviceChangedEvent *dcce;
     int rc;
@@ -665,7 +744,7 @@ XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master, DeviceChanged
 
     /* we don't actually swap if there's a NullClient, swapping is done
      * later when event is delivered. */
 
     /* we don't actually swap if there's a NullClient, swapping is done
      * later when event is delivered. */
-    SendEventToAllWindows(master, XI_DeviceChangedMask, (xEvent*)dcce, 1);
+    SendEventToAllWindows(device, XI_DeviceChangedMask, (xEvent*)dcce, 1);
     free(dcce);
 }
 
     free(dcce);
 }
 
@@ -699,7 +778,57 @@ ChangeMasterDeviceClasses(DeviceIntPtr device, DeviceChangedEvent *dce)
 
     /* FIXME: the classes may have changed since we generated the event. */
     DeepCopyDeviceClasses(slave, device, dce);
 
     /* FIXME: the classes may have changed since we generated the event. */
     DeepCopyDeviceClasses(slave, device, dce);
-    XISendDeviceChangedEvent(slave, device, dce);
+    dce->deviceid = device->id;
+    XISendDeviceChangedEvent(device, dce);
+}
+
+/**
+ * Add state and motionMask to the filter for this event. The protocol
+ * supports some extra masks for motion when a button is down:
+ * ButtonXMotionMask and the DeviceButtonMotionMask to trigger only when at
+ * least one button (or that specific button is down). These masks need to
+ * be added to the filters for core/XI motion events.
+ *
+ * @param device The device to update the mask for
+ * @param state The current button state mask
+ * @param motion_mask The motion mask (DeviceButtonMotionMask or 0)
+ */
+static void
+UpdateDeviceMotionMask(DeviceIntPtr device, unsigned short state,
+                       Mask motion_mask)
+{
+    Mask mask;
+
+    mask = DevicePointerMotionMask | state | motion_mask;
+    SetMaskForEvent(device->id, mask, DeviceMotionNotify);
+    mask = PointerMotionMask | state | motion_mask;
+    SetMaskForEvent(device->id, mask, MotionNotify);
+}
+
+static void
+IncreaseButtonCount(DeviceIntPtr dev, int key, CARD8 *buttons_down,
+                    Mask *motion_mask, unsigned short *state)
+{
+    if (dev->valuator)
+        dev->valuator->motionHintWindow = NullWindow;
+
+    (*buttons_down)++;
+    *motion_mask = DeviceButtonMotionMask;
+    if (dev->button->map[key] <= 5)
+        *state |= (Button1Mask >> 1) << dev->button->map[key];
+}
+
+static void
+DecreaseButtonCount(DeviceIntPtr dev, int key, CARD8 *buttons_down,
+                    Mask *motion_mask, unsigned short *state)
+{
+    if (dev->valuator)
+        dev->valuator->motionHintWindow = NullWindow;
+
+    if (*buttons_down >= 1 && !--(*buttons_down))
+        *motion_mask = 0;
+    if (dev->button->map[key] <= 5)
+        *state &= ~((Button1Mask >> 1) << dev->button->map[key]);
 }
 
 /**
 }
 
 /**
@@ -716,12 +845,12 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
 {
     int i;
     int key = 0,
 {
     int i;
     int key = 0,
-        bit = 0,
         last_valuator;
 
     KeyClassPtr k       = NULL;
     ButtonClassPtr b    = NULL;
     ValuatorClassPtr v  = NULL;
         last_valuator;
 
     KeyClassPtr k       = NULL;
     ButtonClassPtr b    = NULL;
     ValuatorClassPtr v  = NULL;
+    TouchClassPtr t     = NULL;
 
     /* This event is always the first we get, before the actual events with
      * the data. However, the way how the DDX is set up, "device" will
 
     /* This event is always the first we get, before the actual events with
      * the data. However, the way how the DDX is set up, "device" will
@@ -739,6 +868,9 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
         case ET_KeyRelease:
         case ET_ProximityIn:
         case ET_ProximityOut:
         case ET_KeyRelease:
         case ET_ProximityIn:
         case ET_ProximityOut:
+        case ET_TouchBegin:
+        case ET_TouchUpdate:
+        case ET_TouchEnd:
             break;
         default:
             /* other events don't update the device */
             break;
         default:
             /* other events don't update the device */
@@ -748,9 +880,9 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
     k = device->key;
     v = device->valuator;
     b = device->button;
     k = device->key;
     v = device->valuator;
     b = device->button;
+    t = device->touch;
 
     key = event->detail.key;
 
     key = event->detail.key;
-    bit = 1 << (key & 7);
 
     /* Update device axis */
     /* Check valuators first */
 
     /* Update device axis */
     /* Check valuators first */
@@ -776,12 +908,9 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
 
     for (i = 0; i <= last_valuator && i < v->numAxes; i++)
     {
 
     for (i = 0; i <= last_valuator && i < v->numAxes; i++)
     {
+        /* XXX: Relative/Absolute mode */
         if (BitIsOn(&event->valuators.mask, i))
         if (BitIsOn(&event->valuators.mask, i))
-        {
-            /* XXX: Relative/Absolute mode */
             v->axisVal[i] = event->valuators.data[i];
             v->axisVal[i] = event->valuators.data[i];
-            v->axisVal[i] += (event->valuators.data_frac[i] * 1.0f / (1 << 16) / (1 << 16));
-        }
     }
 
     if (event->type == ET_KeyPress) {
     }
 
     if (event->type == ET_KeyPress) {
@@ -805,7 +934,6 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
            device->valuator->motionHintWindow = NullWindow;
        set_key_up(device, key, KEY_PROCESSED);
     } else if (event->type == ET_ButtonPress) {
            device->valuator->motionHintWindow = NullWindow;
        set_key_up(device, key, KEY_PROCESSED);
     } else if (event->type == ET_ButtonPress) {
-        Mask mask;
         if (!b)
             return DONT_PROCESS;
 
         if (!b)
             return DONT_PROCESS;
 
@@ -813,22 +941,13 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
             return DONT_PROCESS;
 
         set_button_down(device, key, BUTTON_PROCESSED);
             return DONT_PROCESS;
 
         set_button_down(device, key, BUTTON_PROCESSED);
-       if (device->valuator)
-           device->valuator->motionHintWindow = NullWindow;
+
         if (!b->map[key])
             return DONT_PROCESS;
         if (!b->map[key])
             return DONT_PROCESS;
-        b->buttonsDown++;
-       b->motionMask = DeviceButtonMotionMask;
-        if (b->map[key] <= 5)
-           b->state |= (Button1Mask >> 1) << b->map[key];
-
-        /* Add state and motionMask to the filter for this event */
-        mask = DevicePointerMotionMask | b->state | b->motionMask;
-        SetMaskForEvent(device->id, mask, DeviceMotionNotify);
-        mask = PointerMotionMask | b->state | b->motionMask;
-        SetMaskForEvent(device->id, mask, MotionNotify);
+
+        IncreaseButtonCount(device, key, &b->buttonsDown, &b->motionMask, &b->state);
+        UpdateDeviceMotionMask(device, b->state, b->motionMask);
     } else if (event->type == ET_ButtonRelease) {
     } else if (event->type == ET_ButtonRelease) {
-        Mask mask;
         if (!b)
             return DONT_PROCESS;
 
         if (!b)
             return DONT_PROCESS;
 
@@ -854,108 +973,641 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent* event)
             }
         }
         set_button_up(device, key, BUTTON_PROCESSED);
             }
         }
         set_button_up(device, key, BUTTON_PROCESSED);
-       if (device->valuator)
-           device->valuator->motionHintWindow = NullWindow;
         if (!b->map[key])
             return DONT_PROCESS;
         if (!b->map[key])
             return DONT_PROCESS;
-        if (b->buttonsDown >= 1 && !--b->buttonsDown)
-           b->motionMask = 0;
-       if (b->map[key] <= 5)
-           b->state &= ~((Button1Mask >> 1) << b->map[key]);
-
-        /* Add state and motionMask to the filter for this event */
-        mask = DevicePointerMotionMask | b->state | b->motionMask;
-        SetMaskForEvent(device->id, mask, DeviceMotionNotify);
-        mask = PointerMotionMask | b->state | b->motionMask;
-        SetMaskForEvent(device->id, mask, MotionNotify);
+
+        DecreaseButtonCount(device, key, &b->buttonsDown, &b->motionMask, &b->state);
+        UpdateDeviceMotionMask(device,  b->state, b->motionMask);
     } else if (event->type == ET_ProximityIn)
        device->proximity->in_proximity = TRUE;
     else if (event->type == ET_ProximityOut)
        device->proximity->in_proximity = FALSE;
     } else if (event->type == ET_ProximityIn)
        device->proximity->in_proximity = TRUE;
     else if (event->type == ET_ProximityOut)
        device->proximity->in_proximity = FALSE;
+    else if (event->type == ET_TouchBegin) {
+        BUG_WARN(!b || !v);
+        BUG_WARN(!t);
+
+        if (!b || !t || !b->map[key])
+            return DONT_PROCESS;
+
+        if (!(event->flags & TOUCH_POINTER_EMULATED) ||
+            (event->flags & TOUCH_REPLAYING))
+            return DONT_PROCESS;
+
+        IncreaseButtonCount(device, key, &t->buttonsDown, &t->motionMask, &t->state);
+        UpdateDeviceMotionMask(device, t->state, DeviceButtonMotionMask);
+    } else if (event->type == ET_TouchEnd) {
+        BUG_WARN(!b || !v);
+        BUG_WARN(!t);
+
+        if (!b || !t || t->buttonsDown <= 0 || !b->map[key])
+            return DONT_PROCESS;
+
+        if (!(event->flags & TOUCH_POINTER_EMULATED))
+            return DONT_PROCESS;
+        if (!(event->flags & TOUCH_END))
+            return DONT_PROCESS;
+
+        DecreaseButtonCount(device, key, &t->buttonsDown, &t->motionMask, &t->state);
+        UpdateDeviceMotionMask(device, t->state, DeviceButtonMotionMask);
+    }
 
     return DEFAULT;
 }
 
 /**
 
     return DEFAULT;
 }
 
 /**
- * Main device event processing function.
- * Called from when processing the events from the event queue.
+ * A client that does not have the TouchOwnership mask set may not receive a
+ * TouchBegin event if there is at least one grab active.
  *
  *
+ * @return TRUE if the client selected for ownership events on the given
+ * window for this device, FALSE otherwise
  */
  */
-void
-ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
+static inline Bool
+TouchClientWantsOwnershipEvents(ClientPtr client, DeviceIntPtr dev, WindowPtr win)
+{
+    InputClients *iclient;
+
+    nt_list_for_each_entry(iclient, wOtherInputMasks(win)->inputClients, next)
+    {
+        if (rClient(iclient) != client)
+            continue;
+
+        return xi2mask_isset(iclient->xi2mask, dev, XI_TouchOwnership);
+    }
+
+    return FALSE;
+}
+
+static void
+TouchSendOwnershipEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, int reason, XID resource)
+{
+    int nev, i;
+    InternalEvent *tel = InitEventList(GetMaximumEventsNum());
+
+    nev = GetTouchOwnershipEvents(tel, dev, ti, reason, resource, 0);
+    for (i = 0; i < nev; i++)
+        mieqProcessDeviceEvent(dev, tel + i, NULL);
+
+    FreeEventList(tel, GetMaximumEventsNum());
+}
+
+/**
+ * Attempts to deliver a touch event to the given client.
+ */
+static Bool
+DeliverOneTouchEvent(ClientPtr client, DeviceIntPtr dev, TouchPointInfoPtr ti,
+                     GrabPtr grab, WindowPtr win, InternalEvent *ev)
+{
+    int err;
+    xEvent *xi2;
+    Mask filter;
+    Window child = DeepestSpriteWin(&ti->sprite)->drawable.id;
+
+    /* FIXME: owner event handling */
+
+    /* If the client does not have the ownership mask set and is not
+     * the current owner of the touch, only pretend we delivered */
+    if (!grab && ti->num_grabs != 0 &&
+           !TouchClientWantsOwnershipEvents(client, dev,win))
+           return TRUE;
+
+    /* If we fail here, we're going to leave a client hanging. */
+    err = EventToXI2(ev, &xi2);
+    if (err != Success)
+        FatalError("[Xi] %s: XI2 conversion failed in %s"
+                   " (%d)\n", dev->name, __func__, err);
+
+    FixUpEventFromWindow(&ti->sprite, xi2, win, child, FALSE);
+    filter = GetEventFilter(dev, xi2);
+    if (XaceHook(XACE_RECEIVE_ACCESS, client, win, xi2, 1) != Success)
+        return FALSE;
+    err = TryClientEvents(client, dev, xi2, 1, filter, filter, NullGrab);
+    free(xi2);
+
+    /* Returning the value from TryClientEvents isn't useful, since all our
+     * resource-gone cleanups will update the delivery list anyway. */
+    return TRUE;
+}
+
+/**
+ * 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)
+{
+    InternalEvent *tel = InitEventList(GetMaximumEventsNum());
+    ValuatorMask *mask = valuator_mask_new(2);
+    int i, nev;
+
+    /* Deliver the ownership */
+    if (ti->listeners[0].state == LISTENER_AWAITING_OWNER)
+        DeliverTouchEvents(dev, ti, (InternalEvent*)ev, ti->listeners[0].listener);
+    else if (ti->listeners[0].state == LISTENER_AWAITING_BEGIN)
+        TouchEventHistoryReplay(ti, dev, ti->listeners[0].listener);
+
+    /* If we've just removed the last grab and the touch has physically
+     * ended, send a TouchEnd event too and finalise the touch. */
+    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);
+        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);
+    }
+
+    /* 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;
+    }
+
+    /* 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 (dixLookupResourceByType(&grab, ev->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)
+        TouchPuntToNextOwner(sourcedev, ti, ev);
+
+out:
+    FreeEventList(tel, GetMaximumEventsNum());
+    valuator_mask_free(&mask);
+}
+
+/**
+ * Processes a TouchOwnership event, indicating a grab has accepted the touch
+ * it currently owns, or a grab or selection has been removed.  Will generate
+ * and send TouchEnd events to all clients removed from the delivery list, as
+ * well as possibly sending the new TouchOwnership event.  May end the
+ * touchpoint if it is pending finish.
+ */
+static void
+ProcessTouchOwnershipEvent(DeviceIntPtr dev, TouchPointInfoPtr ti,
+                           TouchOwnershipEvent *ev)
+{
+
+    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);
+
+        while (ti->num_listeners > 1)
+            TouchRemoveListener(ti, ti->listeners[1].listener);
+        /* Owner accepted after receiving end */
+        if (ti->listeners[0].state == LISTENER_HAS_END)
+            TouchEndTouch(dev, ti);
+    } else { /* this is the very first ownership event for a grab */
+        DeliverTouchEvents(dev, ti, (InternalEvent*)ev, ev->resource);
+    }
+}
+
+/**
+ * Copy the event's valuator information into the touchpoint, we may need
+ * this for emulated TouchEnd events.
+ */
+static void
+TouchCopyValuatorData(DeviceEvent *ev, TouchPointInfoPtr ti)
+{
+    int i;
+    for (i = 0; i < sizeof(ev->valuators.mask) * 8; i++)
+        if (BitIsOn(ev->valuators.mask, i))
+            valuator_mask_set_double(ti->valuators, i, ev->valuators.data[i]);
+}
+
+/**
+ * Given a touch event and a potential listener, retrieve info needed for
+ * processing the event.
+ *
+ * @param dev The device generating the touch event.
+ * @param ti The touch point info record for the touch event.
+ * @param ev The touch event to process.
+ * @param listener The touch event listener that may receive the touch event.
+ * @param[out] client The client that should receive the touch event.
+ * @param[out] win The window to deliver the event on.
+ * @param[out] grab The grab to deliver the event through, if any.
+ * @param[out] mask The XI 2.x event mask of the grab or selection, if any.
+ * @return TRUE if an event should be delivered to the listener, FALSE
+ *         otherwise.
+ */
+static Bool
+RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
+                          InternalEvent *ev, TouchListener *listener,
+                          ClientPtr *client, WindowPtr *win, GrabPtr *grab,
+                          XI2Mask **mask)
+{
+     int rc;
+     InputClients *iclients = NULL;
+
+    if (listener->type == LISTENER_GRAB ||
+        listener->type == LISTENER_POINTER_GRAB)
+    {
+        rc = dixLookupResourceByType((pointer*)grab, listener->listener,
+                RT_PASSIVEGRAB,
+                serverClient, DixSendAccess);
+        if (rc != Success)
+        {
+            /* the grab doesn't exist but we have a grabbing listener - this
+             * is an implicit/active grab */
+            rc = dixLookupClient(client, listener->listener, serverClient, DixSendAccess);
+            if (rc != Success)
+                return FALSE;
+
+            *grab = dev->deviceGrab.grab;
+            if (!*grab)
+                return FALSE;
+        }
+
+        *client = rClient(*grab);
+        *win = (*grab)->window;
+        *mask = (*grab)->xi2mask;
+    } else {
+        if (listener->level == CORE)
+            rc = dixLookupWindow(win, listener->listener,
+                                 serverClient, DixSendAccess);
+        else
+            rc = dixLookupResourceByType((pointer*)win, listener->listener,
+                                         RT_INPUTCLIENT,
+                                         serverClient, DixSendAccess);
+        if (rc != Success)
+            return FALSE;
+
+
+        if (listener->level == XI2)
+        {
+            int evtype;
+            if (ti->emulate_pointer && listener->type == LISTENER_POINTER_REGULAR)
+                evtype = GetXI2Type(TouchGetPointerEventType(ev));
+            else
+                evtype = GetXI2Type(ev->any.type);
+
+            nt_list_for_each_entry(iclients, wOtherInputMasks(*win)->inputClients, next)
+                if (xi2mask_isset(iclients->xi2mask, dev, evtype))
+                    break;
+            BUG_WARN(!iclients);
+            if (!iclients)
+                return FALSE;
+        } else if (listener->level == XI)
+        {
+            int xi_type = GetXIType(TouchGetPointerEventType(ev));
+            Mask xi_filter = event_get_filter_from_type(dev, xi_type);
+            nt_list_for_each_entry(iclients, wOtherInputMasks(*win)->inputClients, next)
+                if (iclients->mask[dev->id] & xi_filter)
+                    break;
+            BUG_WARN(!iclients);
+            if (!iclients)
+                return FALSE;
+        } else
+        {
+            int coretype = GetCoreType(TouchGetPointerEventType(ev));
+            Mask core_filter = event_get_filter_from_type(dev, coretype);
+
+            /* all others */
+            nt_list_for_each_entry(iclients, (InputClients*)wOtherClients(*win), next)
+                if (iclients->mask[XIAllDevices] & core_filter)
+                    break;
+            /* if owner selected, iclients is NULL */
+        }
+
+        *client = iclients ? rClient(iclients) : wClient(*win);
+        *mask = iclients ? iclients->xi2mask : NULL;
+        *grab = NULL;
+    }
+
+    return TRUE;
+}
+
+static int
+DeliverTouchEmulatedEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, InternalEvent *ev,
+                          TouchListener *listener, ClientPtr client,
+                          WindowPtr win, GrabPtr grab, XI2Mask *xi2mask)
+{
+    InternalEvent motion, button;
+    InternalEvent *ptrev = &motion;
+    int nevents;
+    DeviceIntPtr kbd;
+
+    /* We don't deliver pointer events to non-owners */
+    if (!TouchResourceIsOwner(ti, listener->listener))
+        return Success;
+
+    nevents = TouchConvertToPointerEvent(ev, &motion, &button);
+    BUG_WARN(nevents == 0);
+    if (nevents == 0)
+        return BadValue;
+
+    if (nevents > 1)
+        ptrev = &button;
+
+    kbd = GetMaster(dev, KEYBOARD_OR_FLOAT);
+    event_set_state(dev, kbd, &ptrev->device_event);
+    ptrev->device_event.corestate = event_get_corestate(dev, kbd);
+
+    if (grab)
+    {
+        /* this side-steps the usual activation mechansims, but... */
+        if (ev->any.type == ET_TouchBegin && !dev->deviceGrab.grab)
+                ActivatePassiveGrab(dev, grab, ptrev, ev); /* also delivers the event */
+        else {
+            int deliveries = 0;
+            /* 'grab' is the passive grab, but if the grab isn't active,
+             * don't deliver */
+            if (!dev->deviceGrab.grab)
+                return Success;
+
+            if (grab->ownerEvents)
+            {
+                WindowPtr focus = NullWindow;
+                WindowPtr win = dev->spriteInfo->sprite->win;
+                deliveries = DeliverDeviceEvents(win, ptrev, grab, focus, dev);
+            }
+
+            if (!deliveries)
+                DeliverOneGrabbedEvent(ptrev, dev, grab->grabtype);
+
+            if (ev->any.type == ET_TouchEnd &&
+                !dev->button->buttonsDown &&
+                dev->deviceGrab.fromPassiveGrab &&
+                GrabIsPointerGrab(grab))
+                (*dev->deviceGrab.DeactivateGrab)(dev);
+        }
+    } else
+    {
+        GrabPtr devgrab = dev->deviceGrab.grab;
+
+        DeliverDeviceEvents(win, ptrev, grab, win, dev);
+        /* FIXME: bad hack
+         * Implicit passive grab activated in response to this event. Store
+         * the event.
+         */
+        if (!devgrab && dev->deviceGrab.grab && dev->deviceGrab.implicitGrab)
+        {
+            TouchListener *listener;
+
+            devgrab = dev->deviceGrab.grab;
+
+            *dev->deviceGrab.sync.event = ev->device_event;
+
+            /* The listener array has a sequence of grabs and then one event
+             * selection. Implicit grab activation occurs through delivering an
+             * event selection. Thus, we update the last listener in the array.
+             */
+            listener = &ti->listeners[ti->num_listeners - 1];
+            listener->listener = devgrab->resource;
+
+            if (devgrab->grabtype != XI2 ||
+                devgrab->type != XI_TouchBegin)
+                listener->type = LISTENER_POINTER_GRAB;
+            else
+                listener->type = LISTENER_GRAB;
+        }
+
+    }
+    if (ev->any.type == ET_TouchBegin)
+        listener->state = LISTENER_IS_OWNER;
+    else if (ev->any.type == ET_TouchEnd)
+        listener->state = LISTENER_HAS_END;
+
+    return Success;
+}
+
+
+
+
+static void
+DeliverEmulatedMotionEvent(DeviceIntPtr dev, TouchPointInfoPtr ti,
+                           InternalEvent *ev)
+{
+    InternalEvent motion;
+
+    if (ti->num_listeners)
+    {
+        ClientPtr client;
+        WindowPtr win;
+        GrabPtr grab;
+        XI2Mask *mask;
+
+        if (ti->listeners[0].type != LISTENER_POINTER_REGULAR ||
+            ti->listeners[0].type != LISTENER_POINTER_GRAB)
+            return;
+
+        motion = *ev;
+        motion.any.type = ET_TouchUpdate;
+        motion.device_event.detail.button = 0;
+
+        if (!RetrieveTouchDeliveryData(dev, ti, &motion,
+                                       &ti->listeners[0], &client, &win, &grab,
+                                       &mask))
+            return;
+
+        /* There may be a pointer grab on the device */
+        if (!grab)
+        {
+            grab = dev->deviceGrab.grab;
+            if (grab)
+            {
+                win = grab->window;
+                mask = grab->xi2mask;
+                client = rClient(grab);
+            }
+        }
+
+        DeliverTouchEmulatedEvent(dev, ti, &motion, &ti->listeners[0], client, win, grab, mask);
+    } else {
+        InternalEvent button;
+        int converted;
+        converted = TouchConvertToPointerEvent(ev, &motion, &button);
+
+        BUG_WARN(converted == 0);
+        if (converted)
+            ProcessOtherEvent(&motion, dev);
+    }
+}
+
+/**
+ * Processes and delivers a TouchBegin, TouchUpdate, or a
+ * TouchEnd event.
+ *
+ * Due to having rather different delivery semantics (see the Xi 2.2 protocol
+ * spec for more information), this implements its own grab and event-selection
+ * delivery logic.
+ */
+static void
+ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
+{
+    TouchClassPtr t = dev->touch;
+    TouchPointInfoPtr ti;
+    uint32_t touchid;
+    int type = ev->any.type;
+    int emulate_pointer = !!(ev->device_event.flags & TOUCH_POINTER_EMULATED);
+
+    if (!t)
+        return;
+
+    if (ev->any.type == ET_TouchOwnership)
+        touchid = ev->touch_ownership_event.touchid;
+    else
+        touchid = ev->device_event.touchid;
+
+    if (type == ET_TouchBegin) {
+        ti = TouchBeginTouch(dev, ev->device_event.sourceid, touchid,
+                             emulate_pointer);
+    } else
+        ti = TouchFindByClientID(dev, touchid);
+
+    if (!ti)
+    {
+        DebugF("[Xi] %s: Failed to get event %d for touchpoint %d\n",
+               dev->name, type, touchid);
+        return;
+    }
+
+
+    /* if emulate_pointer is set, emulate the motion event right
+     * here, so we can ignore it for button event emulation. TouchUpdate
+     * events which _only_ emulate motion just work normally */
+    if (emulate_pointer && ev->any.type != ET_TouchUpdate)
+        DeliverEmulatedMotionEvent(dev, ti, ev);
+    if (emulate_pointer && IsMaster(dev))
+        CheckMotion(&ev->device_event, dev);
+
+    /* Make sure we have a valid window trace for event delivery; must be
+     * called after event type mutation. */
+    /* FIXME: check this */
+    if (!TouchEnsureSprite(dev, ti, ev))
+        return;
+
+    /* TouchOwnership events are handled separately from the rest, as they
+     * have more complex semantics. */
+    if (ev->any.type == ET_TouchOwnership)
+        ProcessTouchOwnershipEvent(dev, ti, &ev->touch_ownership_event);
+    else
+    {
+        TouchCopyValuatorData(&ev->device_event, ti);
+        /* WARNING: the event type may change to TouchUpdate in
+         * DeliverTouchEvents if a TouchEnd was delivered to a grabbing
+         * owner */
+        DeliverTouchEvents(dev, ti, (InternalEvent *) ev, 0);
+        if (ev->any.type == ET_TouchEnd)
+            TouchEndTouch(dev, ti);
+    }
+}
+
+
+/**
+ * Process DeviceEvents and DeviceChangedEvents.
+ */
+static void
+ProcessDeviceEvent(InternalEvent *ev, DeviceIntPtr device)
 {
     GrabPtr grab;
     Bool deactivateDeviceGrab = FALSE;
     int key = 0, rootX, rootY;
     ButtonClassPtr b;
 {
     GrabPtr grab;
     Bool deactivateDeviceGrab = FALSE;
     int key = 0, rootX, rootY;
     ButtonClassPtr b;
-    KeyClassPtr k;
-    ValuatorClassPtr v;
     int ret = 0;
     int ret = 0;
-    int state, i;
+    int corestate;
     DeviceIntPtr mouse = NULL, kbd = NULL;
     DeviceEvent *event = &ev->device_event;
 
     DeviceIntPtr mouse = NULL, kbd = NULL;
     DeviceEvent *event = &ev->device_event;
 
-    verify_internal_event(ev);
-
-    if (ev->any.type == ET_RawKeyPress ||
-        ev->any.type == ET_RawKeyRelease ||
-        ev->any.type == ET_RawButtonPress ||
-        ev->any.type == ET_RawButtonRelease ||
-        ev->any.type == ET_RawMotion)
-    {
-        DeliverRawEvent(&ev->raw_event, device);
-        return;
-    }
-
     if (IsPointerDevice(device))
     {
     if (IsPointerDevice(device))
     {
-        kbd = GetPairedDevice(device);
+        kbd = GetMaster(device, KEYBOARD_OR_FLOAT);
         mouse = device;
         if (!kbd->key) /* can happen with floating SDs */
             kbd = NULL;
     } else
     {
         mouse = device;
         if (!kbd->key) /* can happen with floating SDs */
             kbd = NULL;
     } else
     {
-        mouse = GetPairedDevice(device);
+        mouse = GetMaster(device, POINTER_OR_FLOAT);
         kbd = device;
         if (!mouse->valuator || !mouse->button) /* may be float. SDs */
             mouse = NULL;
     }
 
         kbd = device;
         if (!mouse->valuator || !mouse->button) /* may be float. SDs */
             mouse = NULL;
     }
 
-    /* State needs to be assembled BEFORE the device is updated. */
-    state = (kbd && kbd->key) ? XkbStateFieldFromRec(&kbd->key->xkbInfo->state) : 0;
-    state |= (mouse && mouse->button) ? (mouse->button->state) : 0;
-
-    for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
-        if (BitIsOn(mouse->button->down, i))
-            SetBit(event->buttons, mouse->button->map[i]);
-
-    if (kbd && kbd->key)
-    {
-        XkbStatePtr state;
-        /* we need the state before the event happens */
-        if (event->type == ET_KeyPress || event->type == ET_KeyRelease)
-            state = &kbd->key->xkbInfo->prev_state;
-        else
-            state = &kbd->key->xkbInfo->state;
-
-        event->mods.base = state->base_mods;
-        event->mods.latched = state->latched_mods;
-        event->mods.locked = state->locked_mods;
-        event->mods.effective = state->mods;
-
-        event->group.base = state->base_group;
-        event->group.latched = state->latched_group;
-        event->group.locked = state->locked_group;
-        event->group.effective = state->group;
-    }
+    corestate = event_get_corestate(mouse, kbd);
+    event_set_state(mouse, kbd, event);
 
     ret = UpdateDeviceState(device, event);
     if (ret == DONT_PROCESS)
         return;
 
 
     ret = UpdateDeviceState(device, event);
     if (ret == DONT_PROCESS)
         return;
 
-    v = device->valuator;
     b = device->button;
     b = device->button;
-    k = device->key;
 
     if (IsMaster(device) || IsFloating(device))
         CheckMotion(event, device);
 
     if (IsMaster(device) || IsFloating(device))
         CheckMotion(event, device);
@@ -973,7 +1625,7 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
             event->root_x = rootX;
             event->root_y = rootY;
             NoticeEventTime((InternalEvent*)event);
             event->root_x = rootX;
             event->root_y = rootY;
             NoticeEventTime((InternalEvent*)event);
-            event->corestate = state;
+            event->corestate = corestate;
             key = event->detail.key;
             break;
         default:
             key = event->detail.key;
             break;
         default:
@@ -1004,17 +1656,13 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
         case ET_KeyRelease:
             if (grab && device->deviceGrab.fromPassiveGrab &&
                 (key == device->deviceGrab.activatingKey) &&
         case ET_KeyRelease:
             if (grab && device->deviceGrab.fromPassiveGrab &&
                 (key == device->deviceGrab.activatingKey) &&
-                (device->deviceGrab.grab->type == KeyPress ||
-                 device->deviceGrab.grab->type == DeviceKeyPress ||
-                 device->deviceGrab.grab->type == XI_KeyPress))
+                GrabIsKeyboardGrab(device->deviceGrab.grab))
                 deactivateDeviceGrab = TRUE;
             break;
         case ET_ButtonPress:
                 deactivateDeviceGrab = TRUE;
             break;
         case ET_ButtonPress:
-            event->detail.button = b->map[key];
-            if (!event->detail.button) { /* there's no button 0 */
-                event->detail.button = key;
+            if (b->map[key] == 0) /* there's no button 0 */
                 return;
                 return;
-            }
+            event->detail.button = b->map[key];
             if (!grab && CheckDeviceGrabs(device, event, 0))
             {
                 /* if a passive grab was activated, the event has been sent
             if (!grab && CheckDeviceGrabs(device, event, 0))
             {
                 /* if a passive grab was activated, the event has been sent
@@ -1023,16 +1671,12 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
             }
             break;
         case ET_ButtonRelease:
             }
             break;
         case ET_ButtonRelease:
-            event->detail.button = b->map[key];
-            if (!event->detail.button) { /* there's no button 0 */
-                event->detail.button = key;
+            if (b->map[key] == 0) /* there's no button 0 */
                 return;
                 return;
-            }
+            event->detail.button = b->map[key];
             if (grab && !b->buttonsDown &&
                 device->deviceGrab.fromPassiveGrab &&
             if (grab && !b->buttonsDown &&
                 device->deviceGrab.fromPassiveGrab &&
-                (device->deviceGrab.grab->type == ButtonPress ||
-                 device->deviceGrab.grab->type == DeviceButtonPress ||
-                 device->deviceGrab.grab->type == XI_ButtonPress))
+                GrabIsPointerGrab(device->deviceGrab.grab))
                 deactivateDeviceGrab = TRUE;
         default:
             break;
                 deactivateDeviceGrab = TRUE;
         default:
             break;
@@ -1041,7 +1685,7 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
 
     if (grab)
         DeliverGrabbedEvent((InternalEvent*)event, device, deactivateDeviceGrab);
 
     if (grab)
         DeliverGrabbedEvent((InternalEvent*)event, device, deactivateDeviceGrab);
-    else if (device->focus && !IsPointerEvent((InternalEvent*)ev))
+    else if (device->focus && !IsPointerEvent(ev))
         DeliverFocusedEvent(device, (InternalEvent*)event,
                             GetSpriteWindow(device));
     else
         DeliverFocusedEvent(device, (InternalEvent*)event,
                             GetSpriteWindow(device));
     else
@@ -1053,6 +1697,206 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
     event->detail.key = key;
 }
 
     event->detail.key = key;
 }
 
+/**
+ * Main device event processing function.
+ * Called from when processing the events from the event queue.
+ *
+ */
+void
+ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
+{
+    verify_internal_event(ev);
+
+    switch(ev->any.type)
+    {
+        case  ET_RawKeyPress:
+        case  ET_RawKeyRelease:
+        case  ET_RawButtonPress:
+        case  ET_RawButtonRelease:
+        case  ET_RawMotion:
+        case  ET_RawTouchBegin:
+        case  ET_RawTouchUpdate:
+        case  ET_RawTouchEnd:
+            DeliverRawEvent(&ev->raw_event, device);
+            break;
+        case  ET_TouchBegin:
+        case  ET_TouchUpdate:
+        case  ET_TouchOwnership:
+        case  ET_TouchEnd:
+            ProcessTouchEvent(ev, device);
+            break;
+        default:
+            ProcessDeviceEvent(ev, device);
+            break;
+    }
+}
+
+static int
+DeliverTouchBeginEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, InternalEvent *ev,
+                       TouchListener *listener, ClientPtr client,
+                       WindowPtr win, GrabPtr grab, XI2Mask *xi2mask)
+{
+    enum TouchListenerState state;
+    int rc = Success;
+    Bool has_ownershipmask;
+
+    if (listener->type == LISTENER_POINTER_REGULAR ||
+        listener->type == LISTENER_POINTER_GRAB)
+    {
+        rc = DeliverTouchEmulatedEvent(dev, ti, ev, listener, client, win,
+                                       grab, xi2mask);
+        goto out;
+    }
+
+
+    has_ownershipmask = xi2mask_isset(xi2mask, dev, XI_TouchOwnership);
+
+    if (TouchResourceIsOwner(ti, listener->listener) || has_ownershipmask)
+        rc = DeliverOneTouchEvent(client, dev, ti, grab, win, ev);
+    if (!TouchResourceIsOwner(ti, listener->listener))
+    {
+        if (has_ownershipmask)
+            state = LISTENER_AWAITING_OWNER;
+        else
+            state = LISTENER_AWAITING_BEGIN;
+    } else
+    {
+        if (has_ownershipmask)
+            TouchSendOwnershipEvent(dev, ti, 0, listener->listener);
+        state = LISTENER_IS_OWNER;
+    }
+    listener->state = state;
+
+out:
+    return rc;
+}
+
+static int
+DeliverTouchEndEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, InternalEvent *ev,
+                     TouchListener *listener, ClientPtr client,
+                     WindowPtr win, GrabPtr grab, XI2Mask *xi2mask)
+{
+    int rc = Success;
+
+    if (listener->type == LISTENER_POINTER_REGULAR ||
+        listener->type == LISTENER_POINTER_GRAB)
+    {
+        rc = DeliverTouchEmulatedEvent(dev, ti, ev, listener, client, win,
+                                       grab, xi2mask);
+        goto out;
+    }
+
+    /* Event in response to reject */
+    if (ev->device_event.flags & TOUCH_REJECT)
+    {
+        if (listener->state != LISTENER_HAS_END)
+            rc = DeliverOneTouchEvent(client, dev, ti, grab, win, ev);
+        listener->state = LISTENER_HAS_END;
+    } else if (TouchResourceIsOwner(ti, listener->listener))
+    {
+        /* FIXME: what about early acceptance */
+        if (!(ev->device_event.flags & TOUCH_ACCEPT))
+        {
+            if (listener->state != LISTENER_HAS_END)
+                rc = DeliverOneTouchEvent(client, dev, ti, grab, win, ev);
+            listener->state = LISTENER_HAS_END;
+        }
+        if ((ti->num_listeners > 1 ||
+             (listener->type == LISTENER_GRAB &&
+              xi2mask_isset(xi2mask, dev, XI_TouchOwnership))) &&
+            (ev->device_event.flags & (TOUCH_ACCEPT|TOUCH_REJECT)) == 0)
+        {
+            ev->any.type = ET_TouchUpdate;
+            ev->device_event.flags |= TOUCH_PENDING_END;
+            ti->pending_finish = TRUE;
+        }
+    }
+
+out:
+    return rc;
+}
+
+static int
+DeliverTouchEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, InternalEvent *ev,
+                  TouchListener *listener, ClientPtr client,
+                  WindowPtr win, GrabPtr grab, XI2Mask *xi2mask)
+{
+    Bool has_ownershipmask = FALSE;
+    int rc = Success;
+
+    if (xi2mask)
+        has_ownershipmask = xi2mask_isset(xi2mask, dev, XI_TouchOwnership);
+
+    if (ev->any.type == ET_TouchOwnership)
+    {
+        ev->touch_ownership_event.deviceid = dev->id;
+        if (!TouchResourceIsOwner(ti, listener->listener))
+            goto out;
+        rc = DeliverOneTouchEvent(client, dev, ti, grab, win, ev);
+        listener->state = LISTENER_IS_OWNER;
+    } else
+        ev->device_event.deviceid = dev->id;
+
+    if (ev->any.type == ET_TouchBegin)
+    {
+        rc = DeliverTouchBeginEvent(dev, ti, ev, listener, client, win, grab, xi2mask);
+    } else if (ev->any.type == ET_TouchUpdate)
+    {
+        if (listener->type == LISTENER_POINTER_REGULAR ||
+            listener->type == LISTENER_POINTER_GRAB)
+            DeliverTouchEmulatedEvent(dev, ti, ev, listener, client, win, grab, xi2mask);
+        else if (TouchResourceIsOwner(ti, listener->listener) || has_ownershipmask)
+            rc = DeliverOneTouchEvent(client, dev, ti, grab, win, ev);
+    } else if (ev->any.type == ET_TouchEnd)
+        rc = DeliverTouchEndEvent(dev, ti, ev, listener, client, win, grab, xi2mask);
+
+out:
+    return rc;
+}
+
+/**
+ * Delivers a touch events to all interested clients.  For TouchBegin events,
+ * will update ti->listeners, ti->num_listeners, and ti->num_grabs.
+ * May also mutate ev (type and flags) upon successful delivery.  If
+ * @resource is non-zero, will only attempt delivery to the owner of that
+ * resource.
+ *
+ * @return TRUE if the event was delivered at least once, FALSE otherwise
+ */
+void
+DeliverTouchEvents(DeviceIntPtr dev, TouchPointInfoPtr ti,
+                   InternalEvent *ev, XID resource)
+{
+    int i;
+
+    if (ev->any.type == ET_TouchBegin &&
+        !(ev->device_event.flags & (TOUCH_CLIENT_ID|TOUCH_REPLAYING)))
+        TouchSetupListeners(dev, ti, ev);
+
+    TouchEventHistoryPush(ti, &ev->device_event);
+
+    for (i = 0; i < ti->num_listeners; i++)
+    {
+        GrabPtr grab = NULL;
+        ClientPtr client;
+        WindowPtr win;
+        XI2Mask *mask;
+        TouchListener *listener = &ti->listeners[i];
+
+        if (resource && listener->listener != resource)
+            continue;
+
+        if (!RetrieveTouchDeliveryData(dev, ti, ev, listener, &client, &win,
+                                       &grab, &mask))
+            continue;
+
+        DeliverTouchEvent(dev, ti, ev, listener, client, win, grab, mask);
+    }
+
+    if (ti->emulate_pointer)
+        UpdateDeviceState(dev, &ev->device_event);
+}
+
 int
 InitProximityClassDeviceStruct(DeviceIntPtr dev)
 {
 int
 InitProximityClassDeviceStruct(DeviceIntPtr dev)
 {
@@ -1076,16 +1920,16 @@ InitProximityClassDeviceStruct(DeviceIntPtr dev)
  *
  * @see InitValuatorClassDeviceStruct
  */
  *
  * @see InitValuatorClassDeviceStruct
  */
-void
+Bool
 InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, Atom label, int minval, int maxval,
                       int resolution, int min_res, int max_res, int mode)
 {
     AxisInfoPtr ax;
 
 InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, Atom label, int minval, int maxval,
                       int resolution, int min_res, int max_res, int mode)
 {
     AxisInfoPtr ax;
 
-    if (!dev || !dev->valuator || minval > maxval)
-        return;
+    if (!dev || !dev->valuator || (minval > maxval && mode == Absolute))
+        return FALSE;
     if (axnum >= dev->valuator->numAxes)
     if (axnum >= dev->valuator->numAxes)
-        return;
+        return FALSE;
 
     ax = dev->valuator->axes + axnum;
 
 
     ax = dev->valuator->axes + axnum;
 
@@ -1099,6 +1943,68 @@ InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, Atom label, int minval, int
 
     if (mode & OutOfProximity)
         dev->proximity->in_proximity = FALSE;
 
     if (mode & OutOfProximity)
         dev->proximity->in_proximity = FALSE;
+
+    return SetScrollValuator(dev, axnum, SCROLL_TYPE_NONE, 0, SCROLL_FLAG_NONE);
+}
+
+/**
+ * Set the given axis number as a scrolling valuator.
+ */
+Bool
+SetScrollValuator(DeviceIntPtr dev, int axnum, enum ScrollType type, double increment, int flags)
+{
+    AxisInfoPtr ax;
+    int *current_ax;
+    InternalEvent dce;
+    DeviceIntPtr master;
+
+    if (!dev || !dev->valuator || axnum >= dev->valuator->numAxes)
+        return FALSE;
+
+    switch (type)
+    {
+        case SCROLL_TYPE_VERTICAL:
+            current_ax = &dev->valuator->v_scroll_axis;
+            break;
+        case SCROLL_TYPE_HORIZONTAL:
+            current_ax = &dev->valuator->h_scroll_axis;
+            break;
+        case SCROLL_TYPE_NONE:
+            ax = &dev->valuator->axes[axnum];
+            ax->scroll.type = type;
+            return TRUE;
+        default:
+            return FALSE;
+    }
+
+    if (increment == 0.0)
+        return FALSE;
+
+    if (*current_ax != -1 && axnum != *current_ax)
+    {
+        ax = &dev->valuator->axes[*current_ax];
+        if (ax->scroll.type == type &&
+            (flags & SCROLL_FLAG_PREFERRED) && (ax->scroll.flags & SCROLL_FLAG_PREFERRED))
+            return FALSE;
+    }
+    *current_ax = axnum;
+
+    ax = &dev->valuator->axes[axnum];
+    ax->scroll.type = type;
+    ax->scroll.increment = increment;
+    ax->scroll.flags = flags;
+
+    master = GetMaster(dev, MASTER_ATTACHED);
+    CreateClassesChangedEvent(&dce, master, dev, DEVCHANGE_POINTER_EVENT | DEVCHANGE_DEVICE_CHANGE);
+    XISendDeviceChangedEvent(dev, &dce.changed_event);
+
+    /* if the current slave is us, update the master. If not, we'll update
+     * whenever the next slave switch happens anyway. CMDC sends the event
+     * for us */
+    if (master && master->lastSlave == dev)
+        ChangeMasterDeviceClasses(master, &dce.changed_event);
+
+    return TRUE;
 }
 
 static void
 }
 
 static void
@@ -1338,26 +2244,28 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
 int
 CheckGrabValues(ClientPtr client, GrabParameters* param)
 {
 int
 CheckGrabValues(ClientPtr client, GrabParameters* param)
 {
-    if (param->grabtype != GRABTYPE_CORE &&
-        param->grabtype != GRABTYPE_XI &&
-        param->grabtype != GRABTYPE_XI2)
+    if (param->grabtype != CORE &&
+        param->grabtype != XI &&
+        param->grabtype != XI2)
     {
         ErrorF("[Xi] grabtype is invalid. This is a bug.\n");
         return BadImplementation;
     }
 
     if ((param->this_device_mode != GrabModeSync) &&
     {
         ErrorF("[Xi] grabtype is invalid. This is a bug.\n");
         return BadImplementation;
     }
 
     if ((param->this_device_mode != GrabModeSync) &&
-       (param->this_device_mode != GrabModeAsync)) {
+       (param->this_device_mode != GrabModeAsync) &&
+        (param->this_device_mode != XIGrabModeTouch)) {
        client->errorValue = param->this_device_mode;
        return BadValue;
     }
     if ((param->other_devices_mode != GrabModeSync) &&
        client->errorValue = param->this_device_mode;
        return BadValue;
     }
     if ((param->other_devices_mode != GrabModeSync) &&
-       (param->other_devices_mode != GrabModeAsync)) {
+       (param->other_devices_mode != GrabModeAsync) &&
+        (param->other_devices_mode != XIGrabModeTouch)) {
        client->errorValue = param->other_devices_mode;
        return BadValue;
     }
 
        client->errorValue = param->other_devices_mode;
        return BadValue;
     }
 
-    if (param->grabtype != GRABTYPE_XI2 && (param->modifiers != AnyModifier) &&
+    if (param->grabtype != XI2 && (param->modifiers != AnyModifier) &&
         (param->modifiers & ~AllModifiersMask)) {
        client->errorValue = param->modifiers;
        return BadValue;
         (param->modifiers & ~AllModifiersMask)) {
        client->errorValue = param->modifiers;
        return BadValue;
@@ -1372,7 +2280,7 @@ CheckGrabValues(ClientPtr client, GrabParameters* param)
 
 int
 GrabButton(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
 
 int
 GrabButton(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
-           int button, GrabParameters *param, GrabType grabtype,
+           int button, GrabParameters *param, enum InputLevel grabtype,
           GrabMask *mask)
 {
     WindowPtr pWin, confineTo;
           GrabMask *mask)
 {
     WindowPtr pWin, confineTo;
@@ -1412,9 +2320,9 @@ GrabButton(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
     if (rc != Success)
        return rc;
 
     if (rc != Success)
        return rc;
 
-    if (grabtype == GRABTYPE_XI)
+    if (grabtype == XI)
         type = DeviceButtonPress;
         type = DeviceButtonPress;
-    else if (grabtype == GRABTYPE_XI2)
+    else if (grabtype == XI2)
         type = XI_ButtonPress;
 
     grab = CreateGrab(client->index, dev, modifier_device, pWin, grabtype,
         type = XI_ButtonPress;
 
     grab = CreateGrab(client->index, dev, modifier_device, pWin, grabtype,
@@ -1425,12 +2333,12 @@ GrabButton(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
 }
 
 /**
 }
 
 /**
- * Grab the given key. If grabtype is GRABTYPE_XI, the key is a keycode. If
- * grabtype is GRABTYPE_XI2, the key is a keysym.
+ * Grab the given key. If grabtype is XI, the key is a keycode. If
+ * grabtype is XI2, the key is a keysym.
  */
 int
 GrabKey(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
  */
 int
 GrabKey(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
-        int key, GrabParameters *param, GrabType grabtype, GrabMask *mask)
+        int key, GrabParameters *param, enum InputLevel grabtype, GrabMask *mask)
 {
     WindowPtr pWin;
     GrabPtr grab;
 {
     WindowPtr pWin;
     GrabPtr grab;
@@ -1443,7 +2351,7 @@ GrabKey(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
         return rc;
     if ((dev->id != XIAllDevices && dev->id != XIAllMasterDevices) && k == NULL)
        return BadMatch;
         return rc;
     if ((dev->id != XIAllDevices && dev->id != XIAllMasterDevices) && k == NULL)
        return BadMatch;
-    if (grabtype == GRABTYPE_XI)
+    if (grabtype == XI)
     {
         if ((key > k->xkbInfo->desc->max_key_code ||
                     key < k->xkbInfo->desc->min_key_code)
     {
         if ((key > k->xkbInfo->desc->max_key_code ||
                     key < k->xkbInfo->desc->min_key_code)
@@ -1452,7 +2360,7 @@ GrabKey(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
             return BadValue;
         }
         type = DeviceKeyPress;
             return BadValue;
         }
         type = DeviceKeyPress;
-    } else if (grabtype == GRABTYPE_XI2)
+    } else if (grabtype == XI2)
         type = XI_KeyPress;
 
     rc = dixLookupWindow(&pWin, param->grabWindow, client, DixSetAttrAccess);
         type = XI_KeyPress;
 
     rc = dixLookupWindow(&pWin, param->grabWindow, client, DixSetAttrAccess);
@@ -1507,7 +2415,7 @@ GrabWindow(ClientPtr client, DeviceIntPtr dev, int type,
     if (rc != Success)
        return rc;
 
     if (rc != Success)
        return rc;
 
-    grab = CreateGrab(client->index, dev, dev, pWin, GRABTYPE_XI2,
+    grab = CreateGrab(client->index, dev, dev, pWin, XI2,
                       mask, param, (type == XIGrabtypeEnter) ? XI_Enter : XI_FocusIn,
                       0, NULL, cursor);
 
                       mask, param, (type == XIGrabtypeEnter) ? XI_Enter : XI_FocusIn,
                       0, NULL, cursor);
 
@@ -1517,6 +2425,34 @@ GrabWindow(ClientPtr client, DeviceIntPtr dev, int type,
     return AddPassiveGrabToList(client, grab);
 }
 
     return AddPassiveGrabToList(client, grab);
 }
 
+/* Touch grab */
+int
+GrabTouch(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr mod_dev,
+          GrabParameters *param, GrabMask *mask)
+{
+    WindowPtr pWin;
+    GrabPtr grab;
+    int rc;
+
+    rc = CheckGrabValues(client, param);
+    if (rc != Success)
+        return rc;
+
+    rc = dixLookupWindow(&pWin, param->grabWindow, client, DixSetAttrAccess);
+    if (rc != Success)
+       return rc;
+    rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixGrabAccess);
+    if (rc != Success)
+       return rc;
+
+    grab = CreateGrab(client->index, dev, mod_dev, pWin, XI2,
+                      mask, param, XI_TouchBegin, 0, NullWindow, NullCursor);
+    if (!grab)
+        return BadAlloc;
+
+    return AddPassiveGrabToList(client, grab);
+}
+
 int
 SelectForWindow(DeviceIntPtr dev, WindowPtr pWin, ClientPtr client,
                Mask mask, Mask exclusivemasks)
 int
 SelectForWindow(DeviceIntPtr dev, WindowPtr pWin, ClientPtr client,
                Mask mask, Mask exclusivemasks)
@@ -1574,6 +2510,20 @@ SelectForWindow(DeviceIntPtr dev, WindowPtr pWin, ClientPtr client,
     return Success;
 }
 
     return Success;
 }
 
+static void
+FreeInputClient(InputClientsPtr *other)
+{
+    xi2mask_free(&(*other)->xi2mask);
+    free(*other);
+    *other = NULL;
+}
+
+static InputClientsPtr
+AllocInputClient(void)
+{
+    return calloc(1, sizeof(InputClients));
+}
+
 int
 AddExtensionClient(WindowPtr pWin, ClientPtr client, Mask mask, int mskidx)
 {
 int
 AddExtensionClient(WindowPtr pWin, ClientPtr client, Mask mask, int mskidx)
 {
@@ -1581,11 +2531,14 @@ AddExtensionClient(WindowPtr pWin, ClientPtr client, Mask mask, int mskidx)
 
     if (!pWin->optional && !MakeWindowOptional(pWin))
        return BadAlloc;
 
     if (!pWin->optional && !MakeWindowOptional(pWin))
        return BadAlloc;
-    others = calloc(1, sizeof(InputClients));
+    others = AllocInputClient();
     if (!others)
        return BadAlloc;
     if (!pWin->optional->inputMasks && !MakeInputMasks(pWin))
        goto bail;
     if (!others)
        return BadAlloc;
     if (!pWin->optional->inputMasks && !MakeInputMasks(pWin))
        goto bail;
+    others->xi2mask = xi2mask_new();
+    if (!others->xi2mask)
+        goto bail;
     others->mask[mskidx] = mask;
     others->resource = FakeClientID(client->index);
     others->next = pWin->optional->inputMasks->inputClients;
     others->mask[mskidx] = mask;
     others->resource = FakeClientID(client->index);
     others->next = pWin->optional->inputMasks->inputClients;
@@ -1595,7 +2548,7 @@ AddExtensionClient(WindowPtr pWin, ClientPtr client, Mask mask, int mskidx)
     return Success;
 
 bail:
     return Success;
 
 bail:
-    free(others);
+    FreeInputClient(&others);
     return BadAlloc;
 }
 
     return BadAlloc;
 }
 
@@ -1607,30 +2560,41 @@ MakeInputMasks(WindowPtr pWin)
     imasks = calloc(1, sizeof(struct _OtherInputMasks));
     if (!imasks)
        return FALSE;
     imasks = calloc(1, sizeof(struct _OtherInputMasks));
     if (!imasks)
        return FALSE;
+    imasks->xi2mask = xi2mask_new();
+    if (!imasks->xi2mask)
+    {
+        free(imasks);
+        return FALSE;
+    }
     pWin->optional->inputMasks = imasks;
     return TRUE;
 }
 
     pWin->optional->inputMasks = imasks;
     return TRUE;
 }
 
+static void
+FreeInputMask(OtherInputMasks **imask)
+{
+    xi2mask_free(&(*imask)->xi2mask);
+    free(*imask);
+    *imask = NULL;
+}
+
 void
 RecalculateDeviceDeliverableEvents(WindowPtr pWin)
 {
     InputClientsPtr others;
     struct _OtherInputMasks *inputMasks;       /* default: NULL */
     WindowPtr pChild, tmp;
 void
 RecalculateDeviceDeliverableEvents(WindowPtr pWin)
 {
     InputClientsPtr others;
     struct _OtherInputMasks *inputMasks;       /* default: NULL */
     WindowPtr pChild, tmp;
-    int i, j;
+    int i;
 
     pChild = pWin;
     while (1) {
        if ((inputMasks = wOtherInputMasks(pChild)) != 0) {
 
     pChild = pWin;
     while (1) {
        if ((inputMasks = wOtherInputMasks(pChild)) != 0) {
-            for (i = 0; i < EMASKSIZE; i++)
-                memset(inputMasks->xi2mask[i], 0, sizeof(inputMasks->xi2mask[i]));
+            xi2mask_zero(inputMasks->xi2mask, -1);
            for (others = inputMasks->inputClients; others;
                 others = others->next) {
                for (i = 0; i < EMASKSIZE; i++)
                    inputMasks->inputEvents[i] |= others->mask[i];
            for (others = inputMasks->inputClients; others;
                 others = others->next) {
                for (i = 0; i < EMASKSIZE; i++)
                    inputMasks->inputEvents[i] |= others->mask[i];
-                for (i = 0; i < EMASKSIZE; i++)
-                    for (j = 0; j < XI2MASKSIZE; j++)
-                        inputMasks->xi2mask[i][j] |= others->xi2mask[i][j];
+                xi2mask_merge(inputMasks->xi2mask, others->xi2mask);
            }
            for (i = 0; i < EMASKSIZE; i++)
                inputMasks->deliverableEvents[i] = inputMasks->inputEvents[i];
            }
            for (i = 0; i < EMASKSIZE; i++)
                inputMasks->deliverableEvents[i] = inputMasks->inputEvents[i];
@@ -1667,14 +2631,15 @@ InputClientGone(WindowPtr pWin, XID id)
        if (other->resource == id) {
            if (prev) {
                prev->next = other->next;
        if (other->resource == id) {
            if (prev) {
                prev->next = other->next;
-               free(other);
+               FreeInputClient(&other);
            } else if (!(other->next)) {
                if (ShouldFreeInputMasks(pWin, TRUE)) {
            } else if (!(other->next)) {
                if (ShouldFreeInputMasks(pWin, TRUE)) {
-                   wOtherInputMasks(pWin)->inputClients = other->next;
-                   free(wOtherInputMasks(pWin));
+                   OtherInputMasks *mask = wOtherInputMasks(pWin);
+                   mask->inputClients = other->next;
+                   FreeInputMask(&mask);
                    pWin->optional->inputMasks = (OtherInputMasks *) NULL;
                    CheckWindowOptionalNeed(pWin);
                    pWin->optional->inputMasks = (OtherInputMasks *) NULL;
                    CheckWindowOptionalNeed(pWin);
-                   free(other);
+                   FreeInputClient(&other);
                } else {
                    other->resource = FakeClientID(0);
                    if (!AddResource(other->resource, RT_INPUTCLIENT,
                } else {
                    other->resource = FakeClientID(0);
                    if (!AddResource(other->resource, RT_INPUTCLIENT,
@@ -1683,7 +2648,7 @@ InputClientGone(WindowPtr pWin, XID id)
                }
            } else {
                wOtherInputMasks(pWin)->inputClients = other->next;
                }
            } else {
                wOtherInputMasks(pWin)->inputClients = other->next;
-               free(other);
+               FreeInputClient(&other);
            }
            RecalculateDeviceDeliverableEvents(pWin);
            return Success;
            }
            RecalculateDeviceDeliverableEvents(pWin);
            return Success;
@@ -1693,6 +2658,36 @@ InputClientGone(WindowPtr pWin, XID id)
     FatalError("client not on device event list");
 }
 
     FatalError("client not on device event list");
 }
 
+/**
+ * Search for window in each touch trace for each device. Remove the window
+ * and all its subwindows from the trace when found. The initial window
+ * order is preserved.
+ */
+void WindowGone(WindowPtr win)
+{
+    DeviceIntPtr dev;
+
+    for (dev = inputInfo.devices; dev; dev = dev->next) {
+        TouchClassPtr t = dev->touch;
+        int i;
+
+        if (!t)
+            continue;
+
+        for (i = 0; i < t->num_touches; i++) {
+            SpritePtr sprite = &t->touches[i].sprite;
+            int j;
+
+            for (j = 0; j < sprite->spriteTraceGood; j++) {
+                if (sprite->spriteTrace[j] == win) {
+                    sprite->spriteTraceGood = j;
+                    break;
+                }
+            }
+        }
+    }
+}
+
 int
 SendEvent(ClientPtr client, DeviceIntPtr d, Window dest, Bool propagate,
          xEvent * ev, Mask mask, int count)
 int
 SendEvent(ClientPtr client, DeviceIntPtr d, Window dest, Bool propagate,
          xEvent * ev, Mask mask, int count)
@@ -1949,20 +2944,25 @@ CheckDeviceGrabAndHintWindow(WindowPtr pWin, int type,
        dev->valuator->motionHintWindow = pWin;
     else if ((type == DeviceButtonPress) && (!grab) &&
             (deliveryMask & DeviceButtonGrabMask)) {
        dev->valuator->motionHintWindow = pWin;
     else if ((type == DeviceButtonPress) && (!grab) &&
             (deliveryMask & DeviceButtonGrabMask)) {
-       GrabRec tempGrab;
+       GrabPtr tempGrab;
 
 
-       tempGrab.device = dev;
-       tempGrab.resource = client->clientAsMask;
-       tempGrab.window = pWin;
-       tempGrab.ownerEvents =
+       tempGrab = AllocGrab();
+       if (!tempGrab)
+           return;
+
+       tempGrab->device = dev;
+       tempGrab->resource = client->clientAsMask;
+       tempGrab->window = pWin;
+       tempGrab->ownerEvents =
            (deliveryMask & DeviceOwnerGrabButtonMask) ? TRUE : FALSE;
            (deliveryMask & DeviceOwnerGrabButtonMask) ? TRUE : FALSE;
-       tempGrab.eventMask = deliveryMask;
-       tempGrab.keyboardMode = GrabModeAsync;
-       tempGrab.pointerMode = GrabModeAsync;
-       tempGrab.confineTo = NullWindow;
-       tempGrab.cursor = NullCursor;
-        tempGrab.next = NULL;
-       (*dev->deviceGrab.ActivateGrab) (dev, &tempGrab, currentTime, TRUE);
+       tempGrab->eventMask = deliveryMask;
+       tempGrab->keyboardMode = GrabModeAsync;
+       tempGrab->pointerMode = GrabModeAsync;
+       tempGrab->confineTo = NullWindow;
+       tempGrab->cursor = NullCursor;
+       tempGrab->next = NULL;
+       (*dev->deviceGrab.ActivateGrab) (dev, tempGrab, currentTime, TRUE);
+       FreeGrab(tempGrab);
     }
 }
 
     }
 }
 
@@ -2108,14 +3108,12 @@ XISetEventMask(DeviceIntPtr dev, WindowPtr win, ClientPtr client,
        for (others = wOtherInputMasks(win)->inputClients; others;
             others = others->next) {
            if (SameClient(others, client)) {
        for (others = wOtherInputMasks(win)->inputClients; others;
             others = others->next) {
            if (SameClient(others, client)) {
-                memset(others->xi2mask[dev->id], 0,
-                       sizeof(others->xi2mask[dev->id]));
+                xi2mask_zero(others->xi2mask, dev->id);
                 break;
             }
         }
     }
 
                 break;
             }
         }
     }
 
-    len = min(len, sizeof(others->xi2mask[dev->id]));
 
     if (len && !others)
     {
 
     if (len && !others)
     {
@@ -2124,11 +3122,14 @@ XISetEventMask(DeviceIntPtr dev, WindowPtr win, ClientPtr client,
         others= wOtherInputMasks(win)->inputClients;
     }
 
         others= wOtherInputMasks(win)->inputClients;
     }
 
-    if (others)
-        memset(others->xi2mask[dev->id], 0, sizeof(others->xi2mask[dev->id]));
+    if (others) {
+        xi2mask_zero(others->xi2mask, dev->id);
+        len = min(len, xi2mask_mask_size(others->xi2mask));
+    }
 
 
-    if (len)
-        memcpy(others->xi2mask[dev->id], mask, len);
+    if (len) {
+        xi2mask_set_one_mask(others->xi2mask, dev->id, mask, len);
+    }
 
     RecalculateDeviceDeliverableEvents(win);
 
 
     RecalculateDeviceDeliverableEvents(win);
 
index 0ce4e060b879c9d26f65748d8ef7076d38c53f00..0d7b88fbef00a0234448555e232be2faa2a2f7a7 100644 (file)
@@ -853,6 +853,24 @@ static void SRawEvent(xXIRawEvent *from, xXIRawEvent *to)
     swaps(&to->valuators_len, n);
 }
 
     swaps(&to->valuators_len, n);
 }
 
+static void STouchOwnershipEvent(xXITouchOwnershipEvent *from,
+                                 xXITouchOwnershipEvent *to)
+{
+    char n;
+
+    *to = *from;
+    swaps(&to->sequenceNumber, n);
+    swapl(&to->length, n);
+    swaps(&to->evtype, n);
+    swaps(&to->deviceid, n);
+    swapl(&to->time, n);
+    swaps(&to->sourceid, n);
+    swapl(&to->touchid, n);
+    swapl(&to->flags, n);
+    swapl(&to->root, n);
+    swapl(&to->event, n);
+    swapl(&to->child, n);
+}
 
 /** Event swapping function for XI2 events. */
 void
 
 /** Event swapping function for XI2 events. */
 void
@@ -882,13 +900,23 @@ XI2EventSwap(xGenericEvent *from, xGenericEvent *to)
         case XI_KeyRelease:
         case XI_ButtonPress:
         case XI_ButtonRelease:
         case XI_KeyRelease:
         case XI_ButtonPress:
         case XI_ButtonRelease:
+        case XI_TouchBegin:
+        case XI_TouchUpdate:
+        case XI_TouchEnd:
             SDeviceEvent((xXIDeviceEvent*)from, (xXIDeviceEvent*)to);
             break;
             SDeviceEvent((xXIDeviceEvent*)from, (xXIDeviceEvent*)to);
             break;
+        case XI_TouchOwnership:
+            STouchOwnershipEvent((xXITouchOwnershipEvent*)from,
+                                 (xXITouchOwnershipEvent*)to);
+            break;
         case XI_RawMotion:
         case XI_RawKeyPress:
         case XI_RawKeyRelease:
         case XI_RawButtonPress:
         case XI_RawButtonRelease:
         case XI_RawMotion:
         case XI_RawKeyPress:
         case XI_RawKeyRelease:
         case XI_RawButtonPress:
         case XI_RawButtonRelease:
+        case XI_RawTouchBegin:
+        case XI_RawTouchUpdate:
+        case XI_RawTouchEnd:
             SRawEvent((xXIRawEvent*)from, (xXIRawEvent*)to);
             break;
         default:
             SRawEvent((xXIRawEvent*)from, (xXIRawEvent*)to);
             break;
         default:
index 925c9a6d2631cfa72150f037a3741b4ad00605db..eeeada70cce9806eb2f7c5d323abb24465b2c2eb 100644 (file)
@@ -132,7 +132,7 @@ ProcXGrabDevice(ClientPtr client)
     rc = GrabDevice(client, dev, stuff->other_devices_mode,
                     stuff->this_device_mode, stuff->grabWindow,
                    stuff->ownerEvents, stuff->time,
     rc = GrabDevice(client, dev, stuff->other_devices_mode,
                     stuff->this_device_mode, stuff->grabWindow,
                    stuff->ownerEvents, stuff->time,
-                   &mask, GRABTYPE_XI, None, None,
+                   &mask, XI, None, None,
                    &rep.status);
 
     if (rc != Success)
                    &rep.status);
 
     if (rc != Success)
index e235f5313ea3fa1a931c65eed1a499426e847e67..2d6431766028fe2b88d341d7e6faf4f610d04952 100644 (file)
@@ -139,7 +139,7 @@ ProcXGrabDeviceButton(ClientPtr client)
        return ret;
 
     memset(&param, 0, sizeof(param));
        return ret;
 
     memset(&param, 0, sizeof(param));
-    param.grabtype = GRABTYPE_XI;
+    param.grabtype = XI;
     param.ownerEvents = stuff->ownerEvents;
     param.this_device_mode = stuff->this_device_mode;
     param.other_devices_mode = stuff->other_devices_mode;
     param.ownerEvents = stuff->ownerEvents;
     param.this_device_mode = stuff->this_device_mode;
     param.other_devices_mode = stuff->other_devices_mode;
@@ -148,7 +148,7 @@ ProcXGrabDeviceButton(ClientPtr client)
     mask.xi = tmp[stuff->grabbed_device].mask;
 
     ret = GrabButton(client, dev, mdev, stuff->button, &param,
     mask.xi = tmp[stuff->grabbed_device].mask;
 
     ret = GrabButton(client, dev, mdev, stuff->button, &param,
-                     GRABTYPE_XI, &mask);
+                     XI, &mask);
 
     return ret;
 }
 
     return ret;
 }
index b34867b5fb7b88a99257ec9fa5ae7f4ac2c2abcc..675ae1d1a06126d7d45a3c473d6dd7de31d4f73c 100644 (file)
@@ -137,7 +137,7 @@ ProcXGrabDeviceKey(ClientPtr client)
 
 
     memset(&param, 0, sizeof(param));
 
 
     memset(&param, 0, sizeof(param));
-    param.grabtype = GRABTYPE_XI;
+    param.grabtype = XI;
     param.ownerEvents = stuff->ownerEvents;
     param.this_device_mode = stuff->this_device_mode;
     param.other_devices_mode = stuff->other_devices_mode;
     param.ownerEvents = stuff->ownerEvents;
     param.this_device_mode = stuff->this_device_mode;
     param.other_devices_mode = stuff->other_devices_mode;
@@ -145,7 +145,7 @@ ProcXGrabDeviceKey(ClientPtr client)
     param.modifiers = stuff->modifiers;
     mask.xi = tmp[stuff->grabbed_device].mask;
 
     param.modifiers = stuff->modifiers;
     mask.xi = tmp[stuff->grabbed_device].mask;
 
-    ret = GrabKey(client, dev, mdev, stuff->key, &param, GRABTYPE_XI, &mask);
+    ret = GrabKey(client, dev, mdev, stuff->key, &param, XI, &mask);
 
     return ret;
 }
 
     return ret;
 }
index a09c3d024656e0b58f0dff7f3924d528ca7e9fac..7bd4acb73e88e91d85f2bf5996358062c5d7282d 100644 (file)
@@ -104,7 +104,7 @@ ProcXUngrabDevice(ClientPtr client)
     time = ClientTimeToServerTime(stuff->time);
     if ((CompareTimeStamps(time, currentTime) != LATER) &&
        (CompareTimeStamps(time, dev->deviceGrab.grabTime) != EARLIER) &&
     time = ClientTimeToServerTime(stuff->time);
     if ((CompareTimeStamps(time, currentTime) != LATER) &&
        (CompareTimeStamps(time, dev->deviceGrab.grabTime) != EARLIER) &&
-       (grab) && SameClient(grab, client) && grab->grabtype == GRABTYPE_XI)
+       (grab) && SameClient(grab, client) && grab->grabtype == XI)
        (*dev->deviceGrab.DeactivateGrab) (dev);
     return Success;
 }
        (*dev->deviceGrab.DeactivateGrab) (dev);
     return Success;
 }
index 4e93f1ae35e873c2bb26115d66c280775a3343c0..241224d4f1e1235e17836610dfd15d14fafaabd4 100644 (file)
@@ -98,7 +98,7 @@ ProcXUngrabDeviceButton(ClientPtr client)
     DeviceIntPtr dev;
     DeviceIntPtr mdev;
     WindowPtr pWin;
     DeviceIntPtr dev;
     DeviceIntPtr mdev;
     WindowPtr pWin;
-    GrabRec temporaryGrab;
+    GrabPtr temporaryGrab;
     int rc;
 
     REQUEST(xUngrabDeviceButtonReq);
     int rc;
 
     REQUEST(xUngrabDeviceButtonReq);
@@ -128,17 +128,23 @@ ProcXUngrabDeviceButton(ClientPtr client)
        (stuff->modifiers & ~AllModifiersMask))
        return BadValue;
 
        (stuff->modifiers & ~AllModifiersMask))
        return BadValue;
 
-    temporaryGrab.resource = client->clientAsMask;
-    temporaryGrab.device = dev;
-    temporaryGrab.window = pWin;
-    temporaryGrab.type = DeviceButtonPress;
-    temporaryGrab.grabtype = GRABTYPE_XI;
-    temporaryGrab.modifierDevice = mdev;
-    temporaryGrab.modifiersDetail.exact = stuff->modifiers;
-    temporaryGrab.modifiersDetail.pMask = NULL;
-    temporaryGrab.detail.exact = stuff->button;
-    temporaryGrab.detail.pMask = NULL;
-
-    DeletePassiveGrabFromList(&temporaryGrab);
+    temporaryGrab = AllocGrab();
+    if (!temporaryGrab)
+        return BadAlloc;
+
+    temporaryGrab->resource = client->clientAsMask;
+    temporaryGrab->device = dev;
+    temporaryGrab->window = pWin;
+    temporaryGrab->type = DeviceButtonPress;
+    temporaryGrab->grabtype = XI;
+    temporaryGrab->modifierDevice = mdev;
+    temporaryGrab->modifiersDetail.exact = stuff->modifiers;
+    temporaryGrab->modifiersDetail.pMask = NULL;
+    temporaryGrab->detail.exact = stuff->button;
+    temporaryGrab->detail.pMask = NULL;
+
+    DeletePassiveGrabFromList(temporaryGrab);
+
+    FreeGrab(temporaryGrab);
     return Success;
 }
     return Success;
 }
index 3b4d6260ee17a4cf84de159bf6013dd27da73a80..6b9f7c24b546c05ced10353c3b10b36374bb83cb 100644 (file)
@@ -100,7 +100,7 @@ ProcXUngrabDeviceKey(ClientPtr client)
     DeviceIntPtr dev;
     DeviceIntPtr mdev;
     WindowPtr pWin;
     DeviceIntPtr dev;
     DeviceIntPtr mdev;
     WindowPtr pWin;
-    GrabRec temporaryGrab;
+    GrabPtr temporaryGrab;
     int rc;
 
     REQUEST(xUngrabDeviceKeyReq);
     int rc;
 
     REQUEST(xUngrabDeviceKeyReq);
@@ -135,17 +135,22 @@ ProcXUngrabDeviceKey(ClientPtr client)
        (stuff->modifiers & ~AllModifiersMask))
        return BadValue;
 
        (stuff->modifiers & ~AllModifiersMask))
        return BadValue;
 
-    temporaryGrab.resource = client->clientAsMask;
-    temporaryGrab.device = dev;
-    temporaryGrab.window = pWin;
-    temporaryGrab.type = DeviceKeyPress;
-    temporaryGrab.grabtype = GRABTYPE_XI;
-    temporaryGrab.modifierDevice = mdev;
-    temporaryGrab.modifiersDetail.exact = stuff->modifiers;
-    temporaryGrab.modifiersDetail.pMask = NULL;
-    temporaryGrab.detail.exact = stuff->key;
-    temporaryGrab.detail.pMask = NULL;
-
-    DeletePassiveGrabFromList(&temporaryGrab);
+    temporaryGrab = AllocGrab();
+    if (!temporaryGrab)
+        return BadAlloc;
+
+    temporaryGrab->resource = client->clientAsMask;
+    temporaryGrab->device = dev;
+    temporaryGrab->window = pWin;
+    temporaryGrab->type = DeviceKeyPress;
+    temporaryGrab->grabtype = XI;
+    temporaryGrab->modifierDevice = mdev;
+    temporaryGrab->modifiersDetail.exact = stuff->modifiers;
+    temporaryGrab->modifiersDetail.pMask = NULL;
+    temporaryGrab->detail.exact = stuff->key;
+    temporaryGrab->detail.pMask = NULL;
+
+    DeletePassiveGrabFromList(temporaryGrab);
+    FreeGrab(temporaryGrab);
     return Success;
 }
     return Success;
 }
index 3077e1a44b8f8a1eecc8017a1daf0717023ea549..207c5cb07a8c1178f1668801bb11038837a8888a 100644 (file)
@@ -35,6 +35,8 @@
 
 #include "inputstr.h"  /* DeviceIntPtr      */
 #include "windowstr.h" /* window structure  */
 
 #include "inputstr.h"  /* DeviceIntPtr      */
 #include "windowstr.h" /* window structure  */
+#include "mi.h"
+#include "eventstr.h"
 #include <X11/extensions/XI2.h>
 #include <X11/extensions/XI2proto.h>
 
 #include <X11/extensions/XI2.h>
 #include <X11/extensions/XI2proto.h>
 
@@ -51,10 +53,53 @@ SProcXIAllowEvents(ClientPtr client)
     swaps(&stuff->length, n);
     swaps(&stuff->deviceid, n);
     swapl(&stuff->time, n);
     swaps(&stuff->length, n);
     swaps(&stuff->deviceid, n);
     swapl(&stuff->time, n);
+    /* FIXME swap touchid */
+    /* FIXME swap window */
 
     return ProcXIAllowEvents(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)
 {
 int
 ProcXIAllowEvents(ClientPtr client)
 {
@@ -63,7 +108,7 @@ ProcXIAllowEvents(ClientPtr client)
     int ret = Success;
 
     REQUEST(xXIAllowEventsReq);
     int ret = Success;
 
     REQUEST(xXIAllowEventsReq);
-    REQUEST_SIZE_MATCH(xXIAllowEventsReq);
+    /* FIXME: check request length, 12 for XI 2.0+, 20 for XI 2.2+ */
 
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
     if (ret != Success)
 
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
     if (ret != Success)
@@ -93,6 +138,12 @@ ProcXIAllowEvents(ClientPtr client)
         if (IsMaster(dev))
             AllowSome(client, time, dev, THAWED_BOTH);
        break;
         if (IsMaster(dev))
             AllowSome(client, time, dev, THAWED_BOTH);
        break;
+    case XIRejectTouch:
+    case XIAcceptTouch:
+        ret = AllowTouch(client, dev,
+                         stuff->mode, stuff->touchid,
+                         &client->errorValue);
+        break;
     default:
        client->errorValue = stuff->mode;
        ret = BadValue;
     default:
        client->errorValue = stuff->mode;
        ret = BadValue;
index 0adc8787dd2d95fb0b47960ba5e8037c6c9ea0d6..23ccf8c2c4023c319d28ddf89cfa084cdc3a2364 100644 (file)
@@ -41,6 +41,7 @@
 #include "exglobals.h" /* BadDevice */
 #include "exevents.h"
 #include "xigrabdev.h"
 #include "exglobals.h" /* BadDevice */
 #include "exevents.h"
 #include "xigrabdev.h"
+#include "inpututils.h"
 
 int
 SProcXIGrabDevice(ClientPtr client)
 
 int
 SProcXIGrabDevice(ClientPtr client)
@@ -66,7 +67,7 @@ ProcXIGrabDevice(ClientPtr client)
     xXIGrabDeviceReply rep;
     int ret = Success;
     uint8_t status;
     xXIGrabDeviceReply rep;
     int ret = Success;
     uint8_t status;
-    GrabMask mask;
+    GrabMask mask = { 0 };
     int mask_len;
 
     REQUEST(xXIGrabDeviceReq);
     int mask_len;
 
     REQUEST(xXIGrabDeviceReq);
@@ -83,9 +84,13 @@ ProcXIGrabDevice(ClientPtr client)
                                stuff->mask_len * 4) != Success)
         return BadValue;
 
                                stuff->mask_len * 4) != Success)
         return BadValue;
 
-    mask_len = min(sizeof(mask.xi2mask[stuff->deviceid]), stuff->mask_len * 4);
-    memset(mask.xi2mask, 0, sizeof(mask.xi2mask));
-    memcpy(mask.xi2mask, (char*)&stuff[1], mask_len);
+    mask.xi2mask = xi2mask_new();
+    if (!mask.xi2mask)
+        return BadAlloc;
+
+    mask_len = min(xi2mask_mask_size(mask.xi2mask), stuff->mask_len * 4);
+    /* FIXME: I think the old code was broken here */
+    xi2mask_set_one_mask(mask.xi2mask, dev->id, (unsigned char*)&stuff[1], mask_len);
 
     ret = GrabDevice(client, dev, stuff->grab_mode,
                      stuff->paired_device_mode,
 
     ret = GrabDevice(client, dev, stuff->grab_mode,
                      stuff->paired_device_mode,
@@ -93,11 +98,13 @@ ProcXIGrabDevice(ClientPtr client)
                      stuff->owner_events,
                      stuff->time,
                      &mask,
                      stuff->owner_events,
                      stuff->time,
                      &mask,
-                     GRABTYPE_XI2,
+                     XI2,
                      stuff->cursor,
                      None /* confineTo */,
                      &status);
 
                      stuff->cursor,
                      None /* confineTo */,
                      &status);
 
+    xi2mask_free(&mask.xi2mask);
+
     if (ret != Success)
         return ret;
 
     if (ret != Success)
         return ret;
 
@@ -145,7 +152,7 @@ ProcXIUngrabDevice(ClientPtr client)
     time = ClientTimeToServerTime(stuff->time);
     if ((CompareTimeStamps(time, currentTime) != LATER) &&
        (CompareTimeStamps(time, dev->deviceGrab.grabTime) != EARLIER) &&
     time = ClientTimeToServerTime(stuff->time);
     if ((CompareTimeStamps(time, currentTime) != LATER) &&
        (CompareTimeStamps(time, dev->deviceGrab.grabTime) != EARLIER) &&
-       (grab) && SameClient(grab, client) && grab->grabtype == GRABTYPE_XI2)
+       (grab) && SameClient(grab, client) && grab->grabtype == XI2)
        (*dev->deviceGrab.DeactivateGrab) (dev);
 
     return Success;
        (*dev->deviceGrab.DeactivateGrab) (dev);
 
     return Success;
index af46282c8e3ba786528ec0db6e9e218bbb5ed707..d91170241e34cb78f65cd344c8234ff37b934d31 100644 (file)
@@ -44,6 +44,7 @@
 #include "xipassivegrab.h"
 #include "dixgrabs.h"
 #include "misc.h"
 #include "xipassivegrab.h"
 #include "dixgrabs.h"
 #include "misc.h"
+#include "inpututils.h"
 
 int
 SProcXIPassiveGrabDevice(ClientPtr client)
 
 int
 SProcXIPassiveGrabDevice(ClientPtr client)
@@ -81,10 +82,9 @@ ProcXIPassiveGrabDevice(ClientPtr client)
     DeviceIntPtr dev, mod_dev;
     xXIPassiveGrabDeviceReply rep;
     int i, ret = Success;
     DeviceIntPtr dev, mod_dev;
     xXIPassiveGrabDeviceReply rep;
     int i, ret = Success;
-    uint8_t status;
     uint32_t *modifiers;
     xXIGrabModifierInfo *modifiers_failed;
     uint32_t *modifiers;
     xXIGrabModifierInfo *modifiers_failed;
-    GrabMask mask;
+    GrabMask mask = { 0 };
     GrabParameters param;
     void *tmp;
     int mask_len;
     GrabParameters param;
     void *tmp;
     int mask_len;
@@ -110,26 +110,39 @@ ProcXIPassiveGrabDevice(ClientPtr client)
     if (stuff->grab_type != XIGrabtypeButton &&
         stuff->grab_type != XIGrabtypeKeycode &&
         stuff->grab_type != XIGrabtypeEnter &&
     if (stuff->grab_type != XIGrabtypeButton &&
         stuff->grab_type != XIGrabtypeKeycode &&
         stuff->grab_type != XIGrabtypeEnter &&
-        stuff->grab_type != XIGrabtypeFocusIn)
+        stuff->grab_type != XIGrabtypeFocusIn &&
+        stuff->grab_type != XIGrabtypeTouchBegin)
     {
         client->errorValue = stuff->grab_type;
         return BadValue;
     }
 
     if ((stuff->grab_type == XIGrabtypeEnter ||
     {
         client->errorValue = stuff->grab_type;
         return BadValue;
     }
 
     if ((stuff->grab_type == XIGrabtypeEnter ||
-         stuff->grab_type == XIGrabtypeFocusIn) && stuff->detail != 0)
+         stuff->grab_type == XIGrabtypeFocusIn ||
+         stuff->grab_type == XIGrabtypeTouchBegin) && stuff->detail != 0)
     {
         client->errorValue = stuff->detail;
         return BadValue;
     }
 
     {
         client->errorValue = stuff->detail;
         return BadValue;
     }
 
+    if (stuff->grab_type == XIGrabtypeTouchBegin &&
+        (stuff->grab_mode != XIGrabModeTouch ||
+         stuff->paired_device_mode != GrabModeAsync))
+    {
+        client->errorValue = stuff->grab_mode;
+        return BadValue;
+    }
+
     if (XICheckInvalidMaskBits(client, (unsigned char*)&stuff[1],
                                stuff->mask_len * 4) != Success)
         return BadValue;
 
     if (XICheckInvalidMaskBits(client, (unsigned char*)&stuff[1],
                                stuff->mask_len * 4) != Success)
         return BadValue;
 
-    mask_len = min(sizeof(mask.xi2mask[stuff->deviceid]), stuff->mask_len * 4);
-    memset(mask.xi2mask, 0, sizeof(mask.xi2mask));
-    memcpy(mask.xi2mask[stuff->deviceid], &stuff[1], mask_len * 4);
+    mask.xi2mask = xi2mask_new();
+    if (!mask.xi2mask)
+        return BadAlloc;
+
+    mask_len = min(xi2mask_mask_size(mask.xi2mask), stuff->mask_len * 4);
+    xi2mask_set_one_mask(mask.xi2mask, stuff->deviceid, (unsigned char*)&stuff[1], mask_len * 4);
 
     rep.repType = X_Reply;
     rep.RepType = X_XIPassiveGrabDevice;
 
     rep.repType = X_Reply;
     rep.RepType = X_XIPassiveGrabDevice;
@@ -138,7 +151,7 @@ ProcXIPassiveGrabDevice(ClientPtr client)
     rep.num_modifiers = 0;
 
     memset(&param, 0, sizeof(param));
     rep.num_modifiers = 0;
 
     memset(&param, 0, sizeof(param));
-    param.grabtype = GRABTYPE_XI2;
+    param.grabtype = XI2;
     param.ownerEvents = stuff->owner_events;
     param.grabWindow = stuff->grab_window;
     param.cursor = stuff->cursor;
     param.ownerEvents = stuff->owner_events;
     param.grabWindow = stuff->grab_window;
     param.cursor = stuff->cursor;
@@ -153,48 +166,55 @@ ProcXIPassiveGrabDevice(ClientPtr client)
 
     if (stuff->cursor != None)
     {
 
     if (stuff->cursor != None)
     {
-        status = dixLookupResourceByType(&tmp, stuff->cursor,
-                                         RT_CURSOR, client, DixUseAccess);
-       if (status != Success)
-       {
-           client->errorValue = stuff->cursor;
-           return status;
-       }
+        ret = dixLookupResourceByType(&tmp, stuff->cursor,
+                                      RT_CURSOR, client, DixUseAccess);
+        if (ret != Success)
+        {
+            client->errorValue = stuff->cursor;
+            goto out;
+        }
     }
 
     }
 
-    status = dixLookupWindow((WindowPtr*)&tmp, stuff->grab_window, client, DixSetAttrAccess);
-    if (status != Success)
-       return status;
+    ret = dixLookupWindow((WindowPtr*)&tmp, stuff->grab_window, client, DixSetAttrAccess);
+    if (ret != Success)
+        goto out;
 
 
-    status = CheckGrabValues(client, &param);
-    if (status != Success)
-        return status;
+    ret = CheckGrabValues(client, &param);
+    if (ret != Success)
+        goto out;
 
     modifiers = (uint32_t*)&stuff[1] + stuff->mask_len;
     modifiers_failed = calloc(stuff->num_modifiers, sizeof(xXIGrabModifierInfo));
 
     modifiers = (uint32_t*)&stuff[1] + stuff->mask_len;
     modifiers_failed = calloc(stuff->num_modifiers, sizeof(xXIGrabModifierInfo));
-    if (!modifiers_failed)
-        return BadAlloc;
+    if (!modifiers_failed) {
+        ret = BadAlloc;
+        goto out;
+    }
 
     mod_dev = (IsFloating(dev)) ? dev : GetMaster(dev, MASTER_KEYBOARD);
 
     for (i = 0; i < stuff->num_modifiers; i++, modifiers++)
     {
 
     mod_dev = (IsFloating(dev)) ? dev : GetMaster(dev, MASTER_KEYBOARD);
 
     for (i = 0; i < stuff->num_modifiers; i++, modifiers++)
     {
+        uint8_t status = Success;
+
         param.modifiers = *modifiers;
         switch(stuff->grab_type)
         {
             case XIGrabtypeButton:
                 status = GrabButton(client, dev, mod_dev, stuff->detail,
         param.modifiers = *modifiers;
         switch(stuff->grab_type)
         {
             case XIGrabtypeButton:
                 status = GrabButton(client, dev, mod_dev, stuff->detail,
-                                    &param, GRABTYPE_XI2, &mask);
+                                    &param, XI2, &mask);
                 break;
             case XIGrabtypeKeycode:
                 status = GrabKey(client, dev, mod_dev, stuff->detail,
                 break;
             case XIGrabtypeKeycode:
                 status = GrabKey(client, dev, mod_dev, stuff->detail,
-                                 &param, GRABTYPE_XI2, &mask);
+                                 &param, XI2, &mask);
                 break;
             case XIGrabtypeEnter:
             case XIGrabtypeFocusIn:
                 status = GrabWindow(client, dev, stuff->grab_type,
                                     &param, &mask);
                 break;
                 break;
             case XIGrabtypeEnter:
             case XIGrabtypeFocusIn:
                 status = GrabWindow(client, dev, stuff->grab_type,
                                     &param, &mask);
                 break;
+            case XIGrabtypeTouchBegin:
+                status = GrabTouch(client, dev, mod_dev, &param, &mask);
+                break;
         }
 
         if (status != GrabSuccess)
         }
 
         if (status != GrabSuccess)
@@ -216,6 +236,8 @@ ProcXIPassiveGrabDevice(ClientPtr client)
         WriteToClient(client, rep.length * 4, (char*)modifiers_failed);
 
     free(modifiers_failed);
         WriteToClient(client, rep.length * 4, (char*)modifiers_failed);
 
     free(modifiers_failed);
+out:
+    xi2mask_free(&mask.xi2mask);
     return ret;
 }
 
     return ret;
 }
 
@@ -260,7 +282,7 @@ ProcXIPassiveUngrabDevice(ClientPtr client)
 {
     DeviceIntPtr dev, mod_dev;
     WindowPtr win;
 {
     DeviceIntPtr dev, mod_dev;
     WindowPtr win;
-    GrabRec tempGrab;
+    GrabPtr tempGrab;
     uint32_t* modifiers;
     int i, rc;
 
     uint32_t* modifiers;
     int i, rc;
 
@@ -300,29 +322,36 @@ ProcXIPassiveUngrabDevice(ClientPtr client)
 
     mod_dev = (IsFloating(dev)) ? dev : GetMaster(dev, MASTER_KEYBOARD);
 
 
     mod_dev = (IsFloating(dev)) ? dev : GetMaster(dev, MASTER_KEYBOARD);
 
-    tempGrab.resource = client->clientAsMask;
-    tempGrab.device = dev;
-    tempGrab.window = win;
+
+    tempGrab = AllocGrab();
+    if (!tempGrab)
+        return BadAlloc;
+
+    tempGrab->resource = client->clientAsMask;
+    tempGrab->device = dev;
+    tempGrab->window = win;
     switch(stuff->grab_type)
     {
     switch(stuff->grab_type)
     {
-        case XIGrabtypeButton:  tempGrab.type = XI_ButtonPress; break;
-        case XIGrabtypeKeycode:  tempGrab.type = XI_KeyPress;    break;
-        case XIGrabtypeEnter:   tempGrab.type = XI_Enter;       break;
-        case XIGrabtypeFocusIn: tempGrab.type = XI_FocusIn;     break;
+        case XIGrabtypeButton:  tempGrab->type = XI_ButtonPress; break;
+        case XIGrabtypeKeycode:  tempGrab->type = XI_KeyPress;    break;
+        case XIGrabtypeEnter:   tempGrab->type = XI_Enter;       break;
+        case XIGrabtypeFocusIn: tempGrab->type = XI_FocusIn;     break;
     }
     }
-    tempGrab.grabtype = GRABTYPE_XI2;
-    tempGrab.modifierDevice = mod_dev;
-    tempGrab.modifiersDetail.pMask = NULL;
-    tempGrab.detail.exact = stuff->detail;
-    tempGrab.detail.pMask = NULL;
+    tempGrab->grabtype = XI2;
+    tempGrab->modifierDevice = mod_dev;
+    tempGrab->modifiersDetail.pMask = NULL;
+    tempGrab->detail.exact = stuff->detail;
+    tempGrab->detail.pMask = NULL;
 
     modifiers = (uint32_t*)&stuff[1];
 
     for (i = 0; i < stuff->num_modifiers; i++, modifiers++)
     {
 
     modifiers = (uint32_t*)&stuff[1];
 
     for (i = 0; i < stuff->num_modifiers; i++, modifiers++)
     {
-        tempGrab.modifiersDetail.exact = *modifiers;
-        DeletePassiveGrabFromList(&tempGrab);
+        tempGrab->modifiersDetail.exact = *modifiers;
+        DeletePassiveGrabFromList(tempGrab);
     }
 
     }
 
+    FreeGrab(tempGrab);
+
     return Success;
 }
     return Success;
 }
index 83ce930147e6680e185a66dea7f9fb82702aec1b..3061283d65ee39377a85cc652316a557c37c0c00 100644 (file)
@@ -52,11 +52,14 @@ static struct dev_properties
 } dev_properties[] = {
     {0, XI_PROP_ENABLED},
     {0, XI_PROP_XTEST_DEVICE},
 } dev_properties[] = {
     {0, XI_PROP_ENABLED},
     {0, XI_PROP_XTEST_DEVICE},
+
     {0, XATOM_FLOAT},
     {0, XATOM_FLOAT},
+
     {0, ACCEL_PROP_PROFILE_NUMBER},
     {0, ACCEL_PROP_CONSTANT_DECELERATION},
     {0, ACCEL_PROP_ADAPTIVE_DECELERATION},
     {0, ACCEL_PROP_VELOCITY_SCALING},
     {0, ACCEL_PROP_PROFILE_NUMBER},
     {0, ACCEL_PROP_CONSTANT_DECELERATION},
     {0, ACCEL_PROP_ADAPTIVE_DECELERATION},
     {0, ACCEL_PROP_VELOCITY_SCALING},
+
     {0, AXIS_LABEL_PROP},
     {0, AXIS_LABEL_PROP_REL_X},
     {0, AXIS_LABEL_PROP_REL_Y},
     {0, AXIS_LABEL_PROP},
     {0, AXIS_LABEL_PROP_REL_X},
     {0, AXIS_LABEL_PROP_REL_Y},
@@ -68,6 +71,8 @@ static struct dev_properties
     {0, AXIS_LABEL_PROP_REL_DIAL},
     {0, AXIS_LABEL_PROP_REL_WHEEL},
     {0, AXIS_LABEL_PROP_REL_MISC},
     {0, AXIS_LABEL_PROP_REL_DIAL},
     {0, AXIS_LABEL_PROP_REL_WHEEL},
     {0, AXIS_LABEL_PROP_REL_MISC},
+    {0, AXIS_LABEL_PROP_REL_VSCROLL},
+    {0, AXIS_LABEL_PROP_REL_HSCROLL},
     {0, AXIS_LABEL_PROP_ABS_X},
     {0, AXIS_LABEL_PROP_ABS_Y},
     {0, AXIS_LABEL_PROP_ABS_Z},
     {0, AXIS_LABEL_PROP_ABS_X},
     {0, AXIS_LABEL_PROP_ABS_Y},
     {0, AXIS_LABEL_PROP_ABS_Z},
@@ -381,7 +386,7 @@ change_property(ClientPtr client, DeviceIntPtr dev, Atom property, Atom type,
  * If name is NULL, None is returned.
  */
 Atom
  * If name is NULL, None is returned.
  */
 Atom
-XIGetKnownProperty(char *name)
+XIGetKnownProperty(const char *name)
 {
     int i;
 
 {
     int i;
 
@@ -701,7 +706,7 @@ XIDeleteDeviceProperty (DeviceIntPtr device, Atom property, Bool fromClient)
 int
 XIChangeDeviceProperty (DeviceIntPtr dev, Atom property, Atom type,
                         int format, int mode, unsigned long len,
 int
 XIChangeDeviceProperty (DeviceIntPtr dev, Atom property, Atom type,
                         int format, int mode, unsigned long len,
-                        const pointer value, Bool sendevent)
+                        const void *value, Bool sendevent)
 {
     XIPropertyPtr               prop;
     int                         size_in_bytes;
 {
     XIPropertyPtr               prop;
     int                         size_in_bytes;
index a768d499c88d4d46e3bef06525b03275cadbfc2e..cd6005693e145acb67fa1273104914adf9c7b614 100644 (file)
@@ -41,6 +41,7 @@
 #include "xserver-properties.h"
 #include "exevents.h"
 #include "xace.h"
 #include "xserver-properties.h"
 #include "exevents.h"
 #include "xace.h"
+#include "inpututils.h"
 
 #include "xiquerydevice.h"
 
 
 #include "xiquerydevice.h"
 
@@ -233,7 +234,18 @@ SizeDeviceClasses(DeviceIntPtr dev)
     }
 
     if (dev->valuator)
     }
 
     if (dev->valuator)
-        len += sizeof(xXIValuatorInfo) * dev->valuator->numAxes;
+    {
+        int i;
+        len += (sizeof(xXIValuatorInfo)) * dev->valuator->numAxes;
+
+        for (i = 0; i < dev->valuator->numAxes; i++) {
+            if (dev->valuator->axes[i].scroll.type != SCROLL_TYPE_NONE)
+                len += sizeof(xXIScrollInfo);
+        }
+    }
+
+    if (dev->touch)
+        len += sizeof(xXITouchInfo);
 
     return len;
 }
 
     return len;
 }
@@ -348,8 +360,7 @@ ListValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info, int axisnumber,
     info->min.frac = 0;
     info->max.integral = v->axes[axisnumber].max_value;
     info->max.frac = 0;
     info->min.frac = 0;
     info->max.integral = v->axes[axisnumber].max_value;
     info->max.frac = 0;
-    info->value.integral = (int)v->axisVal[axisnumber];
-    info->value.frac = (int)(v->axisVal[axisnumber] * (1 << 16) * (1 << 16));
+    info->value = double_to_fp3232(v->axisVal[axisnumber]);
     info->resolution = v->axes[axisnumber].resolution;
     info->number = axisnumber;
     info->mode = valuator_get_mode(dev, axisnumber);
     info->resolution = v->axes[axisnumber].resolution;
     info->number = axisnumber;
     info->mode = valuator_get_mode(dev, axisnumber);
@@ -376,6 +387,84 @@ SwapValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info)
     swaps(&info->sourceid, n);
 }
 
     swaps(&info->sourceid, n);
 }
 
+int
+ListScrollInfo(DeviceIntPtr dev, xXIScrollInfo *info, int axisnumber)
+{
+    ValuatorClassPtr v = dev->valuator;
+    AxisInfoPtr axis = &v->axes[axisnumber];
+
+    if (axis->scroll.type == SCROLL_TYPE_NONE)
+        return 0;
+
+    info->type = XIScrollClass;
+    info->length = sizeof(xXIScrollInfo)/4;
+    info->number = axisnumber;
+    switch(axis->scroll.type)
+    {
+        case SCROLL_TYPE_VERTICAL:
+            info->scroll_type = XIScrollTypeVertical;
+            break;
+        case SCROLL_TYPE_HORIZONTAL:
+            info->scroll_type = XIScrollTypeHorizontal;
+            break;
+        default:
+            ErrorF("[Xi] Unknown scroll type %d. This is a bug.\n", axis->scroll.type);
+            break;
+    }
+    info->increment = double_to_fp3232(axis->scroll.increment);
+    info->sourceid = v->sourceid;
+
+    info->flags = 0;
+
+    if (axis->scroll.flags & SCROLL_FLAG_DONT_EMULATE)
+        info->flags |= XIScrollFlagNoEmulation;
+    if (axis->scroll.flags & SCROLL_FLAG_PREFERRED)
+        info->flags |= XIScrollFlagPreferred;
+
+    return info->length * 4;
+}
+
+static void
+SwapScrollInfo(DeviceIntPtr dev, xXIScrollInfo* info)
+{
+    char n;
+
+    swaps(&info->type, n);
+    swaps(&info->length, n);
+    swaps(&info->number, n);
+    swaps(&info->sourceid, n);
+    swaps(&info->scroll_type, n);
+    swapl(&info->increment.integral, n);
+    swapl(&info->increment.frac, n);
+}
+
+/**
+ * List multitouch information
+ *
+ * @return The number of bytes written into info.
+ */
+int
+ListTouchInfo(DeviceIntPtr dev, xXITouchInfo *touch)
+{
+    touch->type = XITouchClass;
+    touch->length = sizeof(xXITouchInfo) >> 2;
+    touch->sourceid = touch->sourceid;
+    touch->mode = dev->touch->mode;
+    touch->num_touches = dev->touch->num_touches;
+
+    return touch->length << 2;
+}
+
+static void
+SwapTouchInfo(DeviceIntPtr dev, xXITouchInfo* touch)
+{
+    char n;
+
+    swaps(&touch->type, n);
+    swaps(&touch->length, n);
+    swaps(&touch->sourceid, n);
+}
+
 int GetDeviceUse(DeviceIntPtr dev, uint16_t *attachment)
 {
     DeviceIntPtr master = GetMaster(dev, MASTER_ATTACHED);
 int GetDeviceUse(DeviceIntPtr dev, uint16_t *attachment)
 {
     DeviceIntPtr master = GetMaster(dev, MASTER_ATTACHED);
@@ -465,6 +554,23 @@ ListDeviceClasses(ClientPtr client, DeviceIntPtr dev,
         total_len += len;
     }
 
         total_len += len;
     }
 
+    for (i = 0; dev->valuator && i < dev->valuator->numAxes; i++)
+    {
+        len = ListScrollInfo(dev, (xXIScrollInfo*)any, i);
+        if (len)
+            (*nclasses)++;
+        any += len;
+        total_len += len;
+    }
+
+    if (dev->touch)
+    {
+        (*nclasses)++;
+        len = ListTouchInfo(dev, (xXITouchInfo*)any);
+        any += len;
+        total_len += len;
+    }
+
     return total_len;
 }
 
     return total_len;
 }
 
@@ -492,6 +598,13 @@ SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info)
             case XIValuatorClass:
                 SwapValuatorInfo(dev, (xXIValuatorInfo*)any);
                 break;
             case XIValuatorClass:
                 SwapValuatorInfo(dev, (xXIValuatorInfo*)any);
                 break;
+            case XIScrollClass:
+                SwapScrollInfo(dev, (xXIScrollInfo*)any);
+                break;
+            case XITouchClass:
+                SwapTouchInfo(dev, (xXITouchInfo*)any);
+                break;
+
         }
 
         any += len * 4;
         }
 
         any += len * 4;
index 02f06591e651eb1a0cc1df8cf4d1b6a4c393c782..632c42eebcb5da056664c138863a7423cfae7e15 100644 (file)
@@ -44,4 +44,6 @@ int ListButtonInfo(DeviceIntPtr dev, xXIButtonInfo* info, Bool reportState);
 int ListKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info);
 int ListValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info,
                     int axisnumber, Bool reportState);
 int ListKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info);
 int ListValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info,
                     int axisnumber, Bool reportState);
+int ListScrollInfo(DeviceIntPtr dev, xXIScrollInfo* info, int axisnumber);
+int ListTouchInfo(DeviceIntPtr dev, xXITouchInfo* info);
 #endif /* QUERYDEV_H */
 #endif /* QUERYDEV_H */
index 51317994b0c67d4bf524a0938eeb3149f6d7e246..efc778209a86be31632ef84037d6310e5614540f 100644 (file)
@@ -111,7 +111,7 @@ ProcXIQueryPointer(ClientPtr client)
         MaybeStopHint(pDev, client);
 
     if (IsMaster(pDev))
         MaybeStopHint(pDev, client);
 
     if (IsMaster(pDev))
-        kbd = GetPairedDevice(pDev);
+        kbd = GetMaster(pDev, MASTER_KEYBOARD);
     else
         kbd = (pDev->key) ? pDev : NULL;
 
     else
         kbd = (pDev->key) ? pDev : NULL;
 
index 22fbaf5e7398cd854f4fb815266645c5b25671db..c667999bee2408445048d8fb401aa86248b30a9d 100644 (file)
@@ -33,6 +33,7 @@
 #include "exglobals.h"
 #include "exevents.h"
 #include <X11/extensions/XI2proto.h>
 #include "exglobals.h"
 #include "exevents.h"
 #include <X11/extensions/XI2proto.h>
+#include "inpututils.h"
 
 #include "xiselectev.h"
 
 
 #include "xiselectev.h"
 
@@ -145,13 +146,59 @@ ProcXISelectEvents(ClientPtr client)
                 BitIsOn(bits, XI_RawKeyRelease) ||
                 BitIsOn(bits, XI_RawButtonPress) ||
                 BitIsOn(bits, XI_RawButtonRelease) ||
                 BitIsOn(bits, XI_RawKeyRelease) ||
                 BitIsOn(bits, XI_RawButtonPress) ||
                 BitIsOn(bits, XI_RawButtonRelease) ||
-                BitIsOn(bits, XI_RawMotion))
+                BitIsOn(bits, XI_RawMotion) ||
+                BitIsOn(bits, XI_RawTouchBegin) ||
+                BitIsOn(bits, XI_RawTouchUpdate) ||
+                BitIsOn(bits, XI_RawTouchEnd))
             {
                 client->errorValue = XI_RawKeyPress;
                 return BadValue;
             }
         }
 
             {
                 client->errorValue = XI_RawKeyPress;
                 return BadValue;
             }
         }
 
+        if (evmask->mask_len >= 1)
+        {
+            unsigned char *bits = (unsigned char*)&evmask[1];
+
+            /* All three touch events must be selected at once */
+            if ((BitIsOn(bits, XI_TouchBegin) ||
+                 BitIsOn(bits, XI_TouchUpdate) ||
+                 BitIsOn(bits, XI_TouchOwnership) ||
+                 BitIsOn(bits, XI_TouchEnd)) &&
+                (!BitIsOn(bits, XI_TouchBegin) ||
+                 !BitIsOn(bits, XI_TouchUpdate) ||
+                 !BitIsOn(bits, XI_TouchEnd)))
+            {
+                client->errorValue = XI_TouchBegin;
+                return BadValue;
+            }
+
+            /* Only one client per window may select for touch events on the
+             * same devices, including master devices.
+             * XXX: This breaks if a device goes from floating to attached. */
+            if (BitIsOn(bits, XI_TouchBegin))
+            {
+                OtherInputMasks *inputMasks = wOtherInputMasks(win);
+                InputClients *iclient = NULL;
+                if (inputMasks)
+                    iclient = inputMasks->inputClients;
+                for (; iclient; iclient = iclient->next)
+                {
+                    DeviceIntPtr dummy;
+
+                    if (CLIENT_ID(iclient->resource) == client->index)
+                        continue;
+
+                    dixLookupDevice(&dummy, evmask->deviceid, serverClient, DixReadAccess);
+                    if (!dummy)
+                        return BadImplementation; /* this shouldn't happen */
+
+                    if (xi2mask_isset(iclient->xi2mask, dummy, XI_TouchBegin))
+                        return BadAccess;
+                }
+            }
+        }
+
         if (XICheckInvalidMaskBits(client, (unsigned char*)&evmask[1],
                                    evmask->mask_len * 4) != Success)
             return BadValue;
         if (XICheckInvalidMaskBits(client, (unsigned char*)&evmask[1],
                                    evmask->mask_len * 4) != Success)
             return BadValue;
@@ -253,7 +300,7 @@ ProcXIGetSelectedEvents(ClientPtr client)
     for (i = 0; i < MAXDEVICES; i++)
     {
         int j;
     for (i = 0; i < MAXDEVICES; i++)
     {
         int j;
-        unsigned char *devmask = others->xi2mask[i];
+        const unsigned char *devmask = xi2mask_get_one_mask(others->xi2mask, i);
 
         if (i > 2)
         {
 
         if (i > 2)
         {
@@ -263,7 +310,7 @@ ProcXIGetSelectedEvents(ClientPtr client)
         }
 
 
         }
 
 
-        for (j = XI2MASKSIZE - 1; j >= 0; j--)
+        for (j = xi2mask_mask_size(others->xi2mask) - 1; j >= 0; j--)
         {
             if (devmask[j] != 0)
             {
         {
             if (devmask[j] != 0)
             {
index a463ab94de2da0539f5e0287d55ed64940c48e23..a9e34420f2e0b22661d7856fd24d21fc87b8d8f4 100644 (file)
@@ -192,8 +192,6 @@ ProcXIWarpPointer(ClientPtr client)
     /* if we don't update the device, we get a jump next time it moves */
     pDev->last.valuators[0] = x;
     pDev->last.valuators[1] = y;
     /* if we don't update the device, we get a jump next time it moves */
     pDev->last.valuators[0] = x;
     pDev->last.valuators[1] = y;
-    pDev->last.remainder[0] = 0;
-    pDev->last.remainder[1] = 0;
     miPointerUpdateSprite(pDev);
 
     /* FIXME: XWarpPointer is supposed to generate an event. It doesn't do it
     miPointerUpdateSprite(pDev);
 
     /* FIXME: XWarpPointer is supposed to generate an event. It doesn't do it
index 0a2a22af06c31707c238c12ada246fee95c8dea4..0d36d7208a4fd3f138354bec160d77ee9cf649f2 100644 (file)
@@ -30,7 +30,7 @@
 
 void remove_devices(const char *backend, const char *config_info);
 BOOL device_is_duplicate(const char *config_info);
 
 void remove_devices(const char *backend, const char *config_info);
 BOOL device_is_duplicate(const char *config_info);
-void add_option(InputOption **options, const char *key, const char *value);
+InputOption* add_option(InputOption **options, const char *key, const char *value);
 
 #ifdef CONFIG_UDEV
 int config_udev_init(void);
 
 #ifdef CONFIG_UDEV
 int config_udev_init(void);
index d86f7c649165fe865d0c908189e608805e19ba31..af8f4f9b21d823f3b5026fcee51a97cf4c1fb20a 100644 (file)
@@ -122,18 +122,25 @@ device_is_duplicate(const char *config_info)
     return FALSE;
 }
 
     return FALSE;
 }
 
-void
+/**
+ * Allocate a new option and append to the list.
+ *
+ * @return A pointer to the newly allocated InputOption struct.
+ */
+InputOption*
 add_option(InputOption **options, const char *key, const char *value)
 {
     if (!value || *value == '\0')
 add_option(InputOption **options, const char *key, const char *value)
 {
     if (!value || *value == '\0')
-        return;
+        return NULL;
 
     for (; *options; options = &(*options)->next)
         ;
     *options = calloc(sizeof(**options), 1);
     if (!*options) /* Yeesh. */
 
     for (; *options; options = &(*options)->next)
         ;
     *options = calloc(sizeof(**options), 1);
     if (!*options) /* Yeesh. */
-        return;
+        return NULL;
     (*options)->key = strdup(key);
     (*options)->value = strdup(value);
     (*options)->next = NULL;
     (*options)->key = strdup(key);
     (*options)->value = strdup(value);
     (*options)->next = NULL;
+
+    return *options;
 }
 }
diff --git a/config/dbus-api b/config/dbus-api
new file mode 100644 (file)
index 0000000..018e986
--- /dev/null
@@ -0,0 +1,40 @@
+D-BUS Configuration API v2
+----------------------------
+
+The X server will register the bus name org.x.config.displayN, and the 
+object /org/x/config/N, where N is the display number.
+
+Currently only hotplugging of input devices is supported.
+
+org.x.config.input:
+    org.x.config.input.version:
+        Returns one unsigned int32, which is the API version.
+
+    org.x.config.input.add:
+        Takes an argument of key/value option pairs in arrays, e.g.:
+         [ss][ss][ss][ss]
+        is the signature for four options.  These options will be passed
+        to the input driver as with any others.
+        Option names beginning with _ are not allowed; they are reserved
+        for internal use.
+
+        Returns a number of signed int32s.  Positive integers are the
+        device IDs of new devices; negative numbers are X error codes,
+        as defined in X.h.  BadMatch will be returned if the options
+        given do not match any device.  BadValue is returned for a malformed
+        message.  (Example: 8 is new device ID 8; -8 is BadMatch.)
+
+        Notably, BadAlloc is never returned: the server internally signals
+        to D-BUS that the attempt failed for lack of memory.
+
+    org.x.config.input.remove:
+        Takes one uint32 argument, which is the device ID to remove, i.e.:
+         u
+        is the signature.
+
+        Returns one signed int32 which represents an X status as defined in
+        X.h. See org.x.config.input.add. Error codes are negative numbers.
+
+    org.x.config.input.listDevices:
+        Lists the currently active devices. No argument. 
+        Return value is sequence of [<id> <name>] [<id> <name>] ..., i.e. [us].
index 34e3caade9a0405b4442724ced00d4081ce8c47e..41eca998aadbde28f00b7111552b426469fa6a3d 100644 (file)
@@ -80,15 +80,7 @@ add_device(DBusMessage *message, DBusMessage *reply, DBusError *error)
         MALFORMED_MESSAGE();
     }
 
         MALFORMED_MESSAGE();
     }
 
-    options = calloc(sizeof(*options), 1);
-    if (!options) {
-        ErrorF("[config/dbus] couldn't allocate option\n");
-        return BadAlloc;
-    }
-
-    options->key = strdup("_source");
-    options->value = strdup("client/dbus");
-    if (!options->key || !options->value) {
+    if (!add_option(&options, "_source", "client/dbus")) {
         ErrorF("[config/dbus] couldn't allocate first key/value pair\n");
         ret = BadAlloc;
         goto unwind;
         ErrorF("[config/dbus] couldn't allocate first key/value pair\n");
         ret = BadAlloc;
         goto unwind;
index a4141d552129882bd60b67b461dabca22d6641d1..d010b7c9ac04e05af347ba7f49bdfa51e5152b22 100644 (file)
@@ -205,15 +205,7 @@ device_added(LibHalContext *hal_ctx, const char *udi)
         free(parent);
     }
 
         free(parent);
     }
 
-    options = calloc(sizeof(*options), 1);
-    if (!options){
-        LogMessage(X_ERROR, "config/hal: couldn't allocate space for input options!\n");
-        goto unwind;
-    }
-
-    options->key = strdup("_source");
-    options->value = strdup("server/hal");
-    if (!options->key || !options->value) {
+    if (!add_option(&options, "_source", "server/hal")) {
         LogMessage(X_ERROR, "config/hal: couldn't allocate first key/value pair\n");
         goto unwind;
     }
         LogMessage(X_ERROR, "config/hal: couldn't allocate first key/value pair\n");
         goto unwind;
     }
index 42713e92dc4653a80d4b29095cc88b6bd3f5ccca..8ba5bee1872c961710a30f3c5372e7ed6671a893 100644 (file)
@@ -81,13 +81,7 @@ device_added(struct udev_device *udev_device)
         return;
     }
 
         return;
     }
 
-    options = calloc(sizeof(*options), 1);
-    if (!options)
-        return;
-
-    options->key = strdup("_source");
-    options->value = strdup("server/udev");
-    if (!options->key || !options->value)
+    if (!add_option(&options, "_source", "server/udev"))
         goto unwind;
 
     parent = udev_device_get_parent(udev_device);
         goto unwind;
 
     parent = udev_device_get_parent(udev_device);
index 7a13c4f27deadf792ae82ba0ca74ce482c06294e..6c83be9829c5127d8ea550bf732f7c8ad8e6154b 100644 (file)
@@ -26,8 +26,8 @@ dnl
 dnl Process this file with autoconf to create configure.
 
 AC_PREREQ(2.57)
 dnl Process this file with autoconf to create configure.
 
 AC_PREREQ(2.57)
-AC_INIT([xorg-server], 1.11.4, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
-RELEASE_DATE="2012-01-27"
+AC_INIT([xorg-server], 1.11.3, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
+RELEASE_DATE="2011-12-16"
 AC_CONFIG_SRCDIR([Makefile.am])
 AM_INIT_AUTOMAKE([foreign dist-bzip2])
 AM_MAINTAINER_MODE
 AC_CONFIG_SRCDIR([Makefile.am])
 AM_INIT_AUTOMAKE([foreign dist-bzip2])
 AM_MAINTAINER_MODE
@@ -45,7 +45,7 @@ XORG_WITH_XMLTO(0.0.20)
 XORG_WITH_FOP
 XORG_WITH_XSLTPROC
 XORG_ENABLE_UNIT_TESTS
 XORG_WITH_FOP
 XORG_WITH_XSLTPROC
 XORG_ENABLE_UNIT_TESTS
-XORG_LD_WRAP
+XORG_LD_WRAP([optional])
 
 m4_ifndef([XORG_FONT_MACROS_VERSION], [m4_fatal([must install fontutil 1.1 or later before running autoconf/autogen])])
 XORG_FONT_MACROS_VERSION(1.1)
 
 m4_ifndef([XORG_FONT_MACROS_VERSION], [m4_fatal([must install fontutil 1.1 or later before running autoconf/autogen])])
 XORG_FONT_MACROS_VERSION(1.1)
@@ -785,7 +785,7 @@ WINDOWSWMPROTO="windowswmproto"
 APPLEWMPROTO="applewmproto >= 1.4"
 
 dnl Core modules for most extensions, et al.
 APPLEWMPROTO="applewmproto >= 1.4"
 
 dnl Core modules for most extensions, et al.
-SDK_REQUIRED_MODULES="[xproto >= 7.0.22] [randrproto >= 1.2.99.3] [renderproto >= 0.11] [xextproto >= 7.1.99] [inputproto >= 1.9.99.902] [kbproto >= 1.0.3] fontsproto"
+SDK_REQUIRED_MODULES="[xproto >= 7.0.22] [randrproto >= 1.2.99.3] [renderproto >= 0.11] [xextproto >= 7.1.99] [inputproto >= 2.1.99.5] [kbproto >= 1.0.3] fontsproto"
 # Make SDK_REQUIRED_MODULES available for inclusion in xorg-server.pc
 AC_SUBST(SDK_REQUIRED_MODULES)
 
 # Make SDK_REQUIRED_MODULES available for inclusion in xorg-server.pc
 AC_SUBST(SDK_REQUIRED_MODULES)
 
diff --git a/debian/README.source b/debian/README.source
new file mode 100644 (file)
index 0000000..f33e314
--- /dev/null
@@ -0,0 +1,66 @@
+------------------------------------------------------
+Quick Guide To Patching This Package For The Impatient
+------------------------------------------------------
+
+1. Make sure you have quilt installed
+2. Unpack the package as usual with "dpkg-source -x"
+3. Run the "patch" target in debian/rules
+4. Create a new patch with "quilt new" (see quilt(1))
+5. Edit all the files you want to include in the patch with "quilt edit"
+   (see quilt(1)).
+6. Write the patch with "quilt refresh" (see quilt(1))
+7. Run the "clean" target in debian/rules
+
+Alternatively, instead of using quilt directly, you can drop the patch in to
+debian/patches and add the name of the patch to debian/patches/series.
+
+------------------------------------
+Guide To The X Strike Force Packages
+------------------------------------
+
+The X Strike Force team maintains X packages in git repositories on
+git.debian.org in the pkg-xorg subdirectory. Most upstream packages
+are actually maintained in git repositories as well, so they often
+just need to be pulled into git.debian.org in a "upstream-*" branch.
+Otherwise, the upstream sources are manually installed in the Debian
+git repository.
+
+The .orig.tar.gz upstream source file could be generated using this
+"upstream-*" branch in the Debian git repository but it is actually
+copied from upstream tarballs directly.
+
+Due to X.org being highly modular, packaging all X.org applications
+as their own independent packages would have created too many Debian
+packages. For this reason, some X.org applications have been grouped
+into larger packages: xutils, xutils-dev, x11-apps, x11-session-utils,
+x11-utils, x11-xfs-utils, x11-xkb-utils, x11-xserver-utils.
+Most packages, including the X.org server itself and all libraries
+and drivers are, however maintained independently.
+
+The Debian packaging is added by creating the "debian-*" git branch
+which contains the aforementioned "upstream-*" branch plus the debian/
+repository files.
+When a patch has to be applied to the Debian package, two solutions
+are involved:
+* If the patch is available in one of the upstream branches, it
+  may be git'cherry-picked into the Debian repository. In this
+  case, it appears directly in the .diff.gz.
+* Otherwise, the patch is added to debian/patches/ which is managed
+  with quilt as documented in /usr/share/doc/quilt/README.source.
+
+----------------------------------------------
+Updating xorg-server to a new upstream release
+----------------------------------------------
+
+* The abibumpcheck target helps us notice any ABI bump:
+  - A major ABI bump means drivers have to be rebuilt.
+  - A minor ABI bump means the version in serverminver has to be
+    bumped.
+  Reference documentation about dependencies is available at:
+    http://pkg-xorg.alioth.debian.org/reference/dependencies.html
+* We have to keep track of the SDK_REQUIRED_MODULES variable in
+  configure.ac. It is used to determine xorg-server.pc's dependencies
+  so xserver-xorg-dev's dependencies have to be adjusted when this
+  variable changes. This variable is set to a list of modules, but is
+  updated a few times. It's probably a good idea to use:
+    git grep SDK_REQUIRED_MODULES= -- configure.ac
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..5eb231c
--- /dev/null
@@ -0,0 +1,6653 @@
+xorg-server (2:1.11.4-0ubuntu3) precise; urgency=low
+
+  * Fix touch class memory corruption
+    - Add 612-Fix-vcp-touches-corruption.patch
+    - Add 613-Keep-vcp-touch-class.patch
+
+ -- Chase Douglas <chase.douglas@ubuntu.com>  Mon, 13 Feb 2012 15:54:04 -0800
+
+xorg-server (2:1.11.4-0ubuntu2) precise; urgency=low
+
+  * Fix crash when punting a touch to a non-existent owner
+    - Add 611-Fix-touch-punt-crash.patch
+
+ -- Chase Douglas <chase.douglas@ubuntu.com>  Mon, 13 Feb 2012 12:10:02 -0800
+
+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
+    - Add 225_non-root_config_paths.patch backported from upstream
+
+  [ Alberto Milone]
+  * debian/patches/226_fall_back_to_autoconfiguration.patch:
+    - Fall back to autoconfiguration for graphics drivers in some cases
+      instead of letting X fail when configuration files are available.
+
+  [ Chase Douglas ]
+  * Update to 1.11.99.902 input stack
+  * Update to 1.11.4 for everything else
+  * Drop input patches that have been merged upstream:
+    - 220_dont_scale_indirect.patch
+    - 221_pointer_motion_update_fix.patch
+    - 222_touch_valuators_absolute.patch
+    - 223_indirect_touch_x_y_valuators.patch
+  * 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)
+  * Bump deps on x11proto-input-dev to 2.1.99.6
+
+ -- Chase Douglas <chase.douglas@ubuntu.com>  Fri, 10 Feb 2012 16:27:25 -0800
+
+xorg-server (2:1.11.3-0ubuntu10) precise; urgency=low
+
+  * Drop 214_glx_dri_searchdirs.patch, drisearchdirs is no longer
+    exported in mesa's dri.pc because of multiarch and the only consumer
+    (dri-alternates) is no longer used.
+
+ -- Robert Hooker <sarvatt@ubuntu.com>  Thu, 02 Feb 2012 12:08:55 -0500
+
+xorg-server (2:1.11.3-0ubuntu9) precise; urgency=low
+
+  * debian/patches/500_pointer_barrier_thresholds.diff:
+    - Implement proposed XFIXES 6.0 protocol.  This protocol is subject to
+      change, use at own risk!
+  * debian/control:
+    - Bump build-dep on x11proto-fixes to pick up new protocol definition
+
+ -- Christopher James Halse Rogers <raof@ubuntu.com>  Fri, 27 Jan 2012 20:05:42 +1100
+
+xorg-server (2:1.11.3-0ubuntu8) precise; urgency=low
+
+  * debian/patches/224_return_BadWindow_not_BadMatch.diff:
+    - Fix the error values of a whole slew of window-related calls.
+      Fixes some gnome-settings-daemon aborts in XLib (LP: #903973)
+
+ -- Christopher James Halse Rogers <raof@ubuntu.com>  Mon, 23 Jan 2012 16:09:29 +1100
+
+xorg-server (2:1.11.3-0ubuntu7) precise; urgency=low
+
+  * Fixes for relative devices
+    - Add 220_dont_scale_indirect.patch
+    - Add 221_pointer_motion_update_fix.patch
+    - Add 222_touch_valuators_absolute.patch
+    - Add 223_indirect_touch_x_y_valuators.patch
+
+ -- Chase Douglas <chase.douglas@ubuntu.com>  Thu, 19 Jan 2012 16:23:28 -0800
+
+xorg-server (2:1.11.3-0ubuntu6) precise; urgency=low
+
+  * Bump Build-Depends on x11proto-input-dev to 2.1.99.5
+
+ -- Chase Douglas <chase.douglas@ubuntu.com>  Tue, 17 Jan 2012 22:22:57 +0100
+
+xorg-server (2:1.11.3-0ubuntu5) precise; urgency=low
+
+  * Add Breaks clause for XInput changes
+    - qt4-x11 < 4:4.8.0-1ubuntu2 (crashes due to XI ABI change)
+    - utouch-geis < 2.2.3 (infinite loop if utouch XCB backend is unavailable)
+    - utouch-frame < 2.1.0 (crashes due to XI ABI change)
+    - unity < 5.0.0 (crashes if utouch stack is unavailable)
+
+ -- Chase Douglas <chase.douglas@ubuntu.com>  Tue, 17 Jan 2012 22:03:35 +0100
+
+xorg-server (2:1.11.3-0ubuntu4) precise; urgency=low
+
+  * Merge in input changes from upstream master through commit 954bb99
+  * Remove temporary patch 220_grab_event_time.patch
+
+ -- Chase Douglas <chase.douglas@ubuntu.com>  Tue, 17 Jan 2012 19:52:04 +0100
+
+xorg-server (2:1.11.3-0ubuntu3) precise; urgency=low
+
+  * Add temporary patch for fixing grab time bug
+    - Add 220_grab_event_time.patch
+
+ -- Chase Douglas <chase.douglas@ubuntu.com>  Wed, 11 Jan 2012 07:41:04 -0800
+
+xorg-server (2:1.11.3-0ubuntu2) precise; urgency=low
+
+  * Merge in input changes from upstream master through commit 8722ad6
+  * Remove temporary patch 220_test-loop.patch, merged upstream
+
+ -- Chase Douglas <chase.douglas@ubuntu.com>  Tue, 10 Jan 2012 10:48:31 +0100
+
+xorg-server (2:1.11.3-0ubuntu1) precise; urgency=low
+
+  * New upstream bugfix release
+  * Merge in input changes from upstream master through commit e7df42a
+  * Bump input ABI
+  * Bump x11proto-input-dev build dependency version
+  * Add temporary patch for fixing a test case loop
+    - Add 220_test-loop.patch
+
+ -- Chase Douglas <chase.douglas@ubuntu.com>  Thu, 22 Dec 2011 12:11:39 -0800
+
+xorg-server (2:1.11.2.902-1ubuntu1) precise; urgency=low
+
+  * Drop prototype XI multitouch patches
+  * Merge in input changes from upstream master through commit 7da7aa9
+  * Bump input ABI
+  * Refresh patches
+    - Drop 210_pixman_null_ptr_check.patch, merged upstream
+
+ -- Chase Douglas <chase.douglas@ubuntu.com>  Wed, 14 Dec 2011 16:06:37 -0800
+
+xorg-server (2:1.11.2.902-1) unstable; urgency=low
+
+  [ Julien Cristau ]
+  * New upstream release candidate (1.11.3 RC2)
+
+ -- Cyril Brulebois <kibi@debian.org>  Sat, 10 Dec 2011 22:36:42 +0100
+
+xorg-server (2:1.11.2.901-1) unstable; urgency=low
+
+  * New upstream release candidate (1.11.3 RC1):
+    - As usual: Fixes for various crashes and correctness issues.
+    - In particular: Fix for crash when starting a game (in wine) twice
+      (Closes: #637448).
+    - Also: Fix crashes with server regeneration (Closes: #649420).
+  * Add some lintian overrides:
+    - xserver-xorg-core: breaks-without-version against virtual packages
+      is perfectly OK.
+  * Don't forget to ship xorg.conf.d(5) in xserver-xorg-core.
+
+ -- Cyril Brulebois <kibi@debian.org>  Tue, 29 Nov 2011 17:04:09 +0100
+
+xorg-server (2:1.11.1.902-1) unstable; urgency=low
+
+  * New upstream release candidate (1.11.2 RC2):
+    - Fixes for various crashes and correctness issues.
+
+ -- Cyril Brulebois <kibi@debian.org>  Wed, 02 Nov 2011 11:10:03 +0100
+
+xorg-server (2:1.11.1.901-2) unstable; urgency=high
+
+  * Merge from upstream to get CVEs fixed:
+    - Fix CVE-2011-4028: File disclosure vulnerability.
+    - Fix CVE-2011-4029: File permission change vulnerability.
+  * Set urgency to “high” accordingly.
+
+ -- Cyril Brulebois <kibi@debian.org>  Thu, 20 Oct 2011 15:04:53 +0200
+
+xorg-server (2:1.11.1.901-1) unstable; urgency=low
+
+  * New upstream release candidate (1.11.2 RC1)
+    + Disable check of double-aligned in test/input.c on Renesas SH
+      (closes: #636673)
+  * Use dpkg-buildflags to enable hardening with recent dpkg.
+  * Enable PIE with DEB_BUILD_MAINT_OPTIONS, but add -Bsymbolic to LDFLAGS to
+    reduce performance loss from PIE.
+  * Pass --disable-silent-rules to configure.
+  * Drop dh_testroot from clean target.
+  * Add dummy build-{arch,indep} targets depending on build.
+
+ -- Julien Cristau <jcristau@debian.org>  Sat, 15 Oct 2011 19:05:41 +0200
+
+xorg-server (2:1.11.1-1) unstable; urgency=high
+
+  [ Cyril Brulebois ]
+  * Bump glproto dependency for xserver-xorg-dev (Closes: #639651).
+  * Set urgency to “high” since there were no issues other than the libwfb
+    one (see below) in the last 4 weeks.
+
+  [ Julien Cristau ]
+  * New upstream bugfix release
+    - belatedly bump extension ABI major
+    - add missing fbFoo → wfbFoo renames for libwfb.so, fixing issues with the
+      nvidia driver (closes: #641344)
+
+ -- Cyril Brulebois <kibi@debian.org>  Sat, 24 Sep 2011 11:23:17 +0200
+
+xorg-server (2:1.11.0-1ubuntu1~prep1) oneiric; urgency=low
+
+  * Merge from Debian experimental.  Remaining Ubuntu changes
+    - Fill in later
+  * Drop all XI2.1 multitouch patches, pending Chase's rework.
+  * 217_revert_bgnonevisitwindow.patch:
+  * 219_fedora-pointer-barriers.diff:
+    - Drop; included in the new upstream release.
+
+ -- Christopher James Halse Rogers <chris@cooperteam.net>  Sat, 10 Sep 2011 21:26:49 -0700
+
+xorg-server (2:1.11.0-1) unstable; urgency=low
+
+  [ Julien Cristau ]
+  * Make xvfb, xnest, xserver-xephyr and xserver-xfbdev provide the xserver
+    virtual package again.
+
+  [ Cyril Brulebois ]
+  * New upstream release:
+    - Fix assertion failure when calling dixSetPrivate (Closes: #632549).
+      Thanks, Mohammed Sameer!
+    - Fix memcpy abuse in the fb layer (Closes: #626682).
+
+ -- Cyril Brulebois <kibi@debian.org>  Sun, 28 Aug 2011 12:53:06 +0200
+
+xorg-server (2:1.10.99.901+git20110731-1) experimental; urgency=low
+
+  [ Cyril Brulebois ]
+  * New upstream release candidate.
+  * Bump serverminver, as well as input and video ABI.
+  * Adapt 15-nouveau.diff to cope with the glxdricommon-ification of
+    GLX probing. Nouveau users might still see an error (EE) mentioning
+    the fallback to software rendering.
+  * Bump pixman build-dep/dep to 0.21.8.
+  * Bump xutils-dev build-dep for new macros.
+  * Drop libglib2.0-dev build-dep, no longer needed for unit tests.
+  * Bump x11proto-fixes-dev build-dep for pointer barriers support.
+
+  [ Julien Cristau ]
+  * Update to git HEAD.
+    + DIX: Set backgroundState correctly for root window (Closes: #632134)
+  * Bump xproto, dri2proto and glproto build-dependencies.
+  * Merge packaging changes from the 1.10.x branch:
+    + Bump libgl1-mesa-dri versioned Recommends to 7.10.2-4, to lower the
+      odds of having a server built against multiarched mesa, installed
+      along a pre-multiarch mesa. The Breaks in mesa packages take care of
+      the other way round already.
+    + And since the server's binNMU managed to migrate to testing way too
+      early, add a Breaks against pre-multiarch libgl1-mesa-dri and
+      libgl1-mesa-dri-experimental.
+    + Bump Standards-Version to 3.9.2 (no changes).
+    + Add Breaks on drivers abandoned between lenny and squeeze.  This helps
+      apt decide to remove them instead of removing all of X.  Thanks, David
+      Kalnischkies!
+  * Drop obsolete 20-workaround-36986.diff.
+  * Fix patch stamp dependency.
+
+ -- Julien Cristau <jcristau@debian.org>  Sun, 31 Jul 2011 22:15:07 +0200
+
+xorg-server (2:1.10.4-1ubuntu1) oneiric; urgency=low
+
+  [ Christopher James Halse Rogers ]
+  * Drop i8xx-disablement patch.  2.6.39 and later kernels contain a patch
+    which alledgedly fixes the cache-incoherency problems. (LP: #817814)
+
+  [ Ricardo Salveti de Araujo ]
+  * debian/patches/112_armel-pvr-drv.patch:
+    - Include support for the pvr driver available on OMAP 4 (LP: #828494)
+
+  [ Timo Aaltonen ]
+  * Merge from Debian unstable.
+    - Fixes Xephyr assert failure in dixGetPrivateAddr (LP: #821090)
+  * debian/rules: Modify the patch stampdir creation.
+  * Update patch 500_xi2.1.patch to apply.
+  * Refresh patches.
+  * debian/rules: Add PATH for the xvfb-run check, otherwise Xvfb is not found.
+  * debian/rules: Shift the xvfb-run test to be run later, to ensure that the
+    binaries are installed.
+
+  [ Bryce Harrington ]
+  * debian/rules: Add check target invoking xvfb-run to test that it works
+  * debian/control: Add build dependency on xauth, required by xvfb-run
+
+  [ Chase Douglas ]
+  * Add fixes for touch grab handling, courtesy of Carlos Garnacho
+    - 505_Xi_ensure_replayed_touch_events_have_devices.patch
+    - 506_Xi_ensure_touch_events_update_currentTime.patch
+    - 507_dix_Ensure_touch_events_are_delivered_to_next_client.patch
+
+ -- Timo Aaltonen <tjaalton@ubuntu.com>  Fri, 09 Sep 2011 14:13:07 +0300
+
+xorg-server (2:1.10.4-1) unstable; urgency=low
+
+  [ Timo Aaltonen ]
+  * New upstream release.
+
+ -- Cyril Brulebois <kibi@debian.org>  Wed, 24 Aug 2011 10:44:42 +0200
+
+xorg-server (2:1.10.3-1) unstable; urgency=medium
+
+  [ Cyril Brulebois ]
+  * New upstream release (with just a version bump).
+  * Remove the Replaces: xdmx from xdmx-tools, that was before lenny.
+  * Add a Breaks: libgl1-mesa-dri-no-multiarch, to handle upgrades from
+    squeeze-backports (without multiarch) to wheezy (with multiarch).
+  * Set urgency to “medium” to speed things up. Migration to testing is
+    a prerequisite for squeeze backports.
+
+  [ Julien Cristau ]
+  * Merge packaging changes lost from the 1.7 (squeeze) branch:
+    + Add Breaks on drivers abandoned between lenny and squeeze.  This helps
+      apt decide to remove them instead of removing all of X.  Thanks, David
+      Kalnischkies!
+    + Set default xkb rules to evdev on linux, to work around a wrong default in
+      configure.ac and an Xorg issue where it reverts to the default on reset.
+      Thanks to Bastian Blank for the report.
+
+ -- Cyril Brulebois <kibi@debian.org>  Sun, 07 Aug 2011 19:35:07 +0200
+
+xorg-server (2:1.10.2.902-1ubuntu3) oneiric; urgency=low
+
+  * debian/patches/220_xi21_always_deliver_raw_events.diff:
+    - Backport patch from the mailing list to deliver raw events regardless of
+      grab state.  Bon appétit, DX!
+
+ -- Christopher James Halse Rogers <raof@ubuntu.com>  Mon, 11 Jul 2011 10:03:26 +1000
+
+xorg-server (2:1.10.2.902-1ubuntu2) oneiric; urgency=low
+
+  [ Bryce Harrington ]
+  * rules:  patch needs to depend on stampdir, else it doesn't get created,
+    and 'debian/rules patch' malfunctions.
+
+  [ Chase Douglas ]
+  * Fix event handling when neither X nor Y coordinates are set (LP: #806256)
+    - Added 504_fix_no_coords.patch
+
+  [ Christopher James Halse Rogers ]
+  * rules: Add both /usr/lib/xorg/extra-modules and
+    /usr/lib/$MULTIARCH/xorg/extra-modules for extra modules.
+    Fixes GLX for the proprietary drivers after a mesa upgrade (LP: #807209)
+
+ -- Christopher James Halse Rogers <raof@ubuntu.com>  Fri, 08 Jul 2011 13:16:59 +1000
+
+xorg-server (2:1.10.2.902-1ubuntu1) oneiric; urgency=low
+
+  * Merge from Debian unstable. (LP: #441653)
+    - Update 500_xi2.1.patch to apply.
+    - Drop patch 218_randr-check-rotated-virtual-size-limits-correctly.diff,
+      fixed upstream.
+  * Update the crtc confinement patch with one that should work, with
+    further fixes from upstream. (LP: #389519)
+  * Dropped a bunch of old Breaks from xserver-xorg-core.
+
+ -- Timo Aaltonen <tjaalton@ubuntu.com>  Tue, 05 Jul 2011 16:22:23 +0300
+
+xorg-server (2:1.10.2.902-1) unstable; urgency=low
+
+  * New upstream release (1.10.3 rc2):
+    - DIX: Set backgroundState correctly for root window (Closes: #632134).
+  * Drop 20-workaround-36986.diff, fixed upstream.
+  * Bump Standards-Version to 3.9.2 (no changes).
+
+ -- Cyril Brulebois <kibi@debian.org>  Sat, 02 Jul 2011 11:58:58 +0200
+
+xorg-server (2:1.10.2-2) unstable; urgency=low
+
+  * Bump libgl1-mesa-dri versioned Recommends to 7.10.2-4, to lower the
+    odds of having a server built against multiarched mesa, installed
+    along a pre-multiarch mesa. The Breaks in mesa packages take care of
+    the other way round already.
+  * And since the server's binNMU managed to migrate to testing way too
+    early, add a Breaks against pre-multiarch libgl1-mesa-dri and
+    libgl1-mesa-dri-experimental.
+
+ -- Cyril Brulebois <kibi@debian.org>  Fri, 17 Jun 2011 18:09:36 +0200
+
+xorg-server (2:1.10.2-1ubuntu1) oneiric; urgency=low
+
+  [ Timo Aaltonen ]
+  * Merge from Debian unstable, remaining changes:
+     - rules:
+      + Disable SELinux, libaudit-dev is not in main yet. (LP #406226)
+      + Add --with-extra-module-dir to support GL alternatives.
+      + Mention Ubuntu support in builderstring rather than package uploader's
+        email address.
+      + Enable multitouch gestures.
+    - control:
+      + Xvfb depends on xauth, x11-xkb-utils, recommends libgl1-mesa-dri.
+        (LP #500102)
+      + Add breaks for incompatible drivers. (LP #614993)
+      + Drop libaudit-dev from build-deps.
+      + Build-depend on newer mesa to pick up DRI search paths variable.
+      + Bump dependency on x11proto-input-dev for Xi 2.1
+      + Drop linux-any specifier to make pbuilder less narky.
+    - local/xvfb-run*: Add correct docs about error codes. (LP #328205)
+    - debian/patches:
+      + 100_rethrow_signals.patch:
+        When aborting, re-raise signals for apport
+      + 105_nvidia_fglrx_autodetect.patch:
+        Load proprietary drivers automatically when installed.
+      + 109_fix-swcursor-crash.patch:
+        Avoid dereferencing null pointer while reloading cursors during
+        resume. (LP #371405)
+      + 111_armel-drv-fallbacks.patch:
+        Add support for armel driver fallbacks.
+      + 122_xext_fix_card32_overflow_in_xauth.patch:
+        Fix server crash when “xauth generate” is called with large timeout.
+      + 157_check_null_modes.patch, 162_null_crtc_in_rotation.patch,
+        166_nullptr_xinerama_keyrepeat.patch, 167_nullptr_xisbread.patch
+        172_cwgetbackingpicture_nullptr_check.patch:
+        Fix various segfaults in xserver by checking pointers for NULL
+        values before dereferencing them.
+      + 165_man_xorg_conf_no_device_ident.patch
+        Correct man page
+      + 168_glibc_trace_to_stderr.patch:
+        Report abort traces to stderr instead of terminal
+      + 188_default_primary_to_first_busid.patch:
+        Pick the first device and carry on (LP #459512)
+      + 190_cache-xkbcomp_output_for_fast_start_up.patch:
+        Cache keyboard settings.
+      + 191-Xorg-add-an-extra-module-path.patch:
+        Add support for the alternative module path.
+      + 198_nohwaccess.patch:
+        Adds a -nohwaccess argument to make X not access the hardware
+        ports directly.
+      + 200_randr-null.patch:
+        Clarify a pointer initialization.
+      + 206_intel_8xx_default_to_fbdev.patch:
+        Makes 8xx class intel GPUs default to fbdev for stability. (LP #633593)
+      + 208_switch_on_release.diff:
+        Switch keyboard layouts on key-release rather than key-press
+       (LP #36812)
+      + 209_add_legacy_bgnone_option.patch:
+        Add -nr as a synonym for -background none until all ?DM are updated for
+       the new option.
+      + 210_pixman_null_ptr_check.patch:
+        Catch NULL pointer access after pixman_image_create_bits() failure
+       (LP #705078)
+      + 214_glx_dri_searchdirs.patch:
+        Search in same paths as mesa for DRI drivers for AIGLX so we can handle
+        UMS fallback for radeon gracefully.
+      + 217_revert_bgnonevisitwindow.patch:
+        Revert a commit that causes brief graphical corruption. (LP: 726807)
+      + 218_randr-check-rotated-virtual-size-limits-correctly.diff:
+        Fix rotation with nvidia driver. (LP: 740933)
+      + 500_xi2.1.patch,
+        501_xf86CoordinatesToWindow.patch,
+        502_gestures-extension.patch:
+        Add Xi 2.1 and Gesture extension support.
+      + 503_fix_masked_transformed_valuators.patch:
+        Fix masked transformed valuator handling (LP #774938)
+  * Drop patch 215_glx_drawable_refcounting.diff, similar fix included
+    upstream.
+  * Drop patch 121_only_switch_vt_when_active.diff, doesn't seem to
+    work anymore.
+  * videoabiver, inputabiver, xserver-xorg-dev.install:
+    Drop changes that are obsolete post-natty.
+  * Add 219_fedora-pointer-barrier.diff:
+    Pointer barrier and cursor confinement patch backported to 1.10.
+
+  [ Christopher James Halse Rogers ]
+  * debian/control:
+    Bump mesa-common-dev build-dep to pick up multiarch DRI paths.
+
+ -- Christopher James Halse Rogers <raof@ubuntu.com>  Wed, 15 Jun 2011 10:51:18 +1000
+
+xorg-server (2:1.10.2-1) unstable; urgency=low
+
+  * New upstream release.
+  * Add 20-workaround-36986.diff to avoid test failures on *i386.
+  * On GNU/kFreeBSD, enable HAL support for the main build, but disable it
+    for the udeb build, thanks to Robert Millan (Closes: #596586).
+
+ -- Cyril Brulebois <kibi@debian.org>  Mon, 30 May 2011 11:37:37 +0200
+
+xorg-server (2:1.10.1.901-1) experimental; urgency=low
+
+  * New upstream release (1.10.2 rc1):
+    - Comes with some Xi fixes.
+    - Comes with many GLX fixes.
+
+ -- Cyril Brulebois <kibi@debian.org>  Sat, 07 May 2011 13:27:28 +0200
+
+xorg-server (2:1.10.1-2) unstable; urgency=low
+
+  * Build xserver-xorg-core-udeb on hurd-i386.  Thanks, Samuel Thibault!
+  * Upload to unstable.
+
+ -- Julien Cristau <jcristau@debian.org>  Thu, 28 Apr 2011 13:28:58 +0200
+
+xorg-server (2:1.10.1-1ubuntu3) oneiric; urgency=low
+
+  * Add 218_randr-check-rotated-virtual-size-limits-correctly.diff
+    - Fix rotation with nvidia driver. (LP: #740933)
+
+ -- Timo Aaltonen <tjaalton@ubuntu.com>  Fri, 20 May 2011 00:07:11 +0300
+
+xorg-server (2:1.10.1-1ubuntu2) oneiric; urgency=low
+
+  * Fix masked transformed valuator handling (LP: #774938)
+    - Added debian/patches/503_fix_masked_transformed_valuators.patch
+
+ -- Bryce Harrington <bryce@ubuntu.com>  Tue, 17 May 2011 14:44:58 -0700
+
+xorg-server (2:1.10.1-1ubuntu1) natty; urgency=low
+
+  * Merge from Debian experimental (LP: #757972)
+
+ -- Timo Aaltonen <tjaalton@ubuntu.com>  Tue, 19 Apr 2011 16:12:14 +0300
+
+xorg-server (2:1.10.1-1) experimental; urgency=low
+
+  * New upstream release.
+
+ -- Cyril Brulebois <kibi@debian.org>  Tue, 19 Apr 2011 03:08:08 +0200
+
+xorg-server (2:1.10.0.902-1ubuntu1) natty; urgency=low
+
+  * Merge from Debian experimental.
+    - dropped patches, included upstream:
+      213_xichangehierarchy-check-oom.patch
+      216_fix_sdksyms_build.diff, included upstream.
+      218_getValuatorEvents_cleanup.patch
+      219_xi1_handle_noncontinuous_valuator_data.patch
+
+ -- Timo Aaltonen <tjaalton@ubuntu.com>  Mon, 11 Apr 2011 09:51:56 +0300
+
+xorg-server (2:1.10.0.902-1) experimental; urgency=low
+
+  * New upstream release (1.10.1 rc2).
+
+ -- Cyril Brulebois <kibi@debian.org>  Sat, 09 Apr 2011 04:18:28 +0200
+
+xorg-server (2:1.10.0.901-1) experimental; urgency=low
+
+  * New upstream release (1.10.1 rc1).
+  * Relax build-dep and dep on x11proto-randr-dev since the XRandR 1.4
+    bits were finally reverted upstream.
+  * Remove patch: 16-construct-paths-in-doxygen.conf.diff (merged
+    upstream).
+  * Pass --enable-xcsecurity to the main build to restore the XC-SECURITY
+    extension, thanks to Stefan Fritsch's report (Closes: #599657).
+
+ -- Cyril Brulebois <kibi@debian.org>  Wed, 30 Mar 2011 02:22:56 +0200
+
+xorg-server (2:1.10.0-0ubuntu3) natty; urgency=low
+
+  [ Bryce Harrington ]
+  * patches/111_armel-drv-fallbacks.patch: Always fallback to -fbdev,
+    not just when no other X driver matches. (Thanks jcristau)
+
+  [ Chase Douglas ]
+  * Fix jumpy cursor in XI 1.x applications.
+    (LP: #736500)
+    - Added 218_getValuatorEvents_cleanup.patch
+    - Added 219_xi1_handle_noncontinuous_valuator_data.patch
+
+ -- Bryce Harrington <bryce@ubuntu.com>  Thu, 31 Mar 2011 23:58:07 -0700
+
+xorg-server (2:1.10.0-0ubuntu2) natty; urgency=low
+
+  [ Chase Douglas ]
+  * patches/500_xi2.1.patch: Process ownership properly when activating an
+    async passive grab.
+    (LP: #733483)
+
+  [ Bryce Harrington ]
+  * 217_revert_bgnonevisitwindow.patch: Cherrypick from upstream.  Drops
+    recent change that inhibits drawing backfill for non-bg-None windows.
+    This causes a regression on -ati (at least) where menus and other
+    windows display graphical corruption briefly.
+    (LP: #726807)
+
+ -- Bryce Harrington <bryce@ubuntu.com>  Thu, 24 Mar 2011 15:27:40 -0700
+
+xorg-server (2:1.10.0-0ubuntu1) natty; urgency=low
+
+  * Update to new upstream final release.
+    + Drop 16-construct-paths-in-doxygen.conf.diff; included in new upstream.
+  * debian/patches/216_fix_sdksyms_build.diff:
+    + Cherry-pick from 1.10 branch, fixing the stale sdksyms.c file picked up
+      in the udeb build, causing the udeb build to fail with missing symbols.
+  * Merge from unreleased Debian experimental.  Remaining Ubuntu changes:
+    - rules:
+      + Disable SELinux, libaudit-dev is not in main yet. (LP #406226)
+      + Enable xcsecurity. (LP #247537)
+      + Add --with-extra-module-dir to support GL alternatives.
+      + Mention Ubuntu support in builderstring rather than package uploader's
+        email address.
+    - control:
+      + Xvfb depends on xauth, x11-xkb-utils. (LP #500102)
+      + Add breaks for incompatible drivers. (LP #614993)
+      + Drop libaudit-dev from build-deps.
+      + Build-depend on newer mesa to pick up DRI search paths variable.
+      + Bump dependency on x11proto-input-dev for Xi 2.1
+      + Drop linux-any specifier to make pbuilder less narky.
+      + Bump build-depends on mesa-common-dev to pick up dri.pc DRI search
+        paths change for 214_glx_dri_searchdirs.patch
+    - local/xvfb-run*: Add correct docs about error codes. (LP #328205)
+    - debian/patches:
+      + 100_rethrow_signals.patch:
+        When aborting, re-raise signals for apport
+      + 105_nvidia_fglrx_autodetect.patch:
+        Load proprietary drivers automatically when installed.
+      + 109_fix-swcursor-crash.patch:
+        Avoid dereferencing null pointer while reloading cursors during
+        resume. (LP #371405)
+      + 111_armel-drv-fallbacks.patch:
+        Add support for armel driver fallbacks.
+      + 121_only_switch_vt_when_active.diff:
+        Add a check to prevent the X server from changing the VT when killing
+        GDM from the console.
+      + 122_xext_fix_card32_overflow_in_xauth.patch:
+        Fix server crash when “xauth generate” is called with large timeout.
+      + 157_check_null_modes.patch, 162_null_crtc_in_rotation.patch,
+        166_nullptr_xinerama_keyrepeat.patch, 167_nullptr_xisbread.patch
+        172_cwgetbackingpicture_nullptr_check.patch:
+        Fix various segfaults in xserver by checking pointers for NULL
+        values before dereferencing them.
+      + 165_man_xorg_conf_no_device_ident.patch
+        Correct man page
+      + 168_glibc_trace_to_stderr.patch:
+        Report abort traces to stderr instead of terminal
+      + 184_virtual_devices_autodetect.patch:
+        Use vesa for qemu device, which is not supported by cirrus
+      + 188_default_primary_to_first_busid.patch:
+        Pick the first device and carry on (LP #459512)
+      + 190_cache-xkbcomp_output_for_fast_start_up.patch:
+      + 191-Xorg-add-an-extra-module-path.patch:
+        Add support for the alternatives module path.
+      + 198_nohwaccess.patch:
+        Adds a -nohwaccess argument to make X not access the hardware
+        ports directly.
+      + 200_randr-null.patch:
+        Clarify a pointer initialization.
+      + 206_intel_8xx_default_to_fbdev.patch:
+        Makes 8xx class intel GPUs default to fbdev for stability. (LP #633593)
+      + 208_switch_on_release.diff:
+        Switch keyboard layouts on key-release rather than key-press
+       (LP #36812)
+      + 209_add_legacy_bgnone_option.patch:
+        Add -nr as a synonym for -background none until all ?DM are updated for
+       the new option.
+      + 210_pixman_null_ptr_check.patch:
+        Catch NULL pointer access after pixman_image_create_bits() failure
+       (LP #705078)
+      + 213_xichangehierarchy-check-oom.patch:
+        Add NULL pointer check for out-of-memory conditions. (LP #720445)
+      + 214_glx_dri_searchdirs.patch:
+        Search in same paths as mesa for DRI drivers for AIGLX so we can handle
+        UMS fallback for radeon gracefully.
+      + 215_glx_drawable_refcounting.diff:
+        Prevents segfault on logout and server regenerate, and possibly other
+        times. (LP #711422)
+      + 500_xi2.1.patch,
+        501_xf86CoordinatesToWindow.patch,
+        502_gestures-extension.patch:
+        Add Xi 2.1 and Gesture extension support.
+  * debian/serverminver:
+    - Bump to 1.10.0-0ubuntu1~ for Xi 2.1 ABI
+  * New upstream release fixes crash in Record, trigerred by x11vnc
+    (LP: #525066)
+  * Refresh 500_xi2.1.patch for new upstream version
+  * debian/videoabiver:
+    - Bump to 10 for XRandR 1.4 revert.
+
+ -- Cyril Brulebois <kibi@debian.org>  Wed, 30 Mar 2011 02:22:56 +0200
+
+
+xorg-server (2:1.9.99.903-1) experimental; urgency=low
+
+  * New upstream release candidate (1.10 rc3).
+  * Remove patch: 17-fix-ftbfs-on-sparc.diff (merged upstream).
+  * Remove patch: 20-update-gpu-pitch.diff (merged upstream).
+  * Refresh patch: 07-xfree86-fix-build-with-xv-disabled.diff
+  * Replace patch fixing out-of-tree-build:
+    - 16-oot-build.diff (dirty local hack).
+    + 16-construct-paths-in-doxygen.conf.diff (from upstream,
+      without the gitignore hunk to get patching working).
+  * Bump video ABI version, and serverminver accordingly.
+
+ -- Cyril Brulebois <kibi@debian.org>  Fri, 25 Feb 2011 15:22:39 +0100
+
+xorg-server (2:1.9.99.902-3) experimental; urgency=low
+
+  * Merge from master up to 93a7399370.
+  * New patch: 17-fix-ftbfs-on-sparc.diff; let's try it for real before
+    asking for its being merged upstream.
+  * Refresh all patches.
+
+ -- Cyril Brulebois <kibi@debian.org>  Wed, 23 Feb 2011 13:36:13 +0100
+
+xorg-server (2:1.9.99.902-2ubuntu2) natty; urgency=low
+
+  [ Timo Aaltonen ]
+  * Remove 169_mipointer_nullptr_checks.patch, fixed in another way
+    upstream since 1.6.1.901.
+
+  [ Chase Douglas ]
+  * Cancel touch clients if emulated button press is delivered.
+    (LP: #725191)
+  * Check slave device touch selection mask during implicit grab.
+    (LP: #725241)
+  * Cancel slave touch selections when attached to master device.
+    (LP: #723904)
+  * Check for touch selections only when there are active clients.
+    (LP: #723900)
+  * Prevent pointer motion when more than one touch on touchpad.
+    (LP: #730881)
+
+  [ Bryce Harrington ]
+  * Drop specification for linux-any.  Breaks pbuilder test builds.
+
+ -- Chase Douglas <chase.douglas@ubuntu.com>  Mon, 07 Mar 2011 14:28:02 -0500
+
+xorg-server (2:1.9.99.902-2ubuntu1) natty; urgency=low
+
+  [ Christopher James Halse Rogers ]
+  * Merge from Debian experimental.  Remaining Ubuntu changes:
+    - rules:
+      + Disable SELinux, libaudit-dev is not in main yet. (LP #406226)
+      + Enable xcsecurity. (LP #247537)
+      + Add --with-extra-module-dir to support GL alternatives.
+      + Mention Ubuntu support in builderstring rather than package uploader's
+        email address.
+    - control:
+      + Xvfb depends on xauth, x11-xkb-utils. (LP #500102)
+      + Add breaks for incompatible drivers. (LP #614993)
+      + Drop libaudit-dev from build-deps.
+      + Build-depend on newer mesa to pick up DRI search paths variable.
+    - local/xvfb-run*: Add correct docs about error codes. (LP #328205)
+    - debian/patches:
+      + 100_rethrow_signals.patch:
+        When aborting, re-raise signals for apport
+      + 105_nvidia_fglrx_autodetect.patch:
+        Load proprietary drivers automatically when installed.
+      + 109_fix-swcursor-crash.patch:
+        Avoid dereferencing null pointer while reloading cursors during
+        resume. (LP: #371405)
+      + 111_armel-drv-fallbacks.patch:
+        Add support for armel driver fallbacks.
+      + 121_only_switch_vt_when_active.diff:
+        Add a check to prevent the X server from changing the VT when killing
+        GDM from the console.
+      + 122_xext_fix_card32_overflow_in_xauth.patch:
+        Fix server crash when “xauth generate” is called with large timeout.
+      + 157_check_null_modes.patch, 162_null_crtc_in_rotation.patch,
+        166_nullptr_xinerama_keyrepeat.patch, 167_nullptr_xisbread.patch
+        169_mipointer_nullptr_checks.patch,
+        172_cwgetbackingpicture_nullptr_check.patch:
+        Fix various segfaults in xserver by checking pointers for NULL
+        values before dereferencing them.
+      + 165_man_xorg_conf_no_device_ident.patch
+        Correct man page
+      + 168_glibc_trace_to_stderr.patch:
+        Report abort traces to stderr instead of terminal
+      + 184_virtual_devices_autodetect.patch:
+        Use vesa for qemu device, which is not supported by cirrus
+      + 188_default_primary_to_first_busid.patch:
+        Pick the first device and carry on (LP: #459512)
+      + 190_cache-xkbcomp_output_for_fast_start_up.patch:
+      + 191-Xorg-add-an-extra-module-path.patch:
+        Add support for the alternatives module path.
+      + 198_nohwaccess.patch:
+        Adds a -nohwaccess argument to make X not access the hardware
+        ports directly.
+      + 200_randr-null.patch:
+        Clarify a pointer initialization.
+      + 206_intel_8xx_default_to_fbdev.patch:
+        Makes 8xx class intel GPUs default to fbdev for stability. (LP: #633593)
+      + 208_switch_on_release.diff:
+        Switch keyboard layouts on key-release rather than key-press
+       (LP #36812)
+      + 209_add_legacy_bgnone_option.patch:
+        Add -nr as a synonym for -background none until all ?DM are updated for
+       the new option.
+      + 210_pixman_null_ptr_check.patch:
+        Catch NULL pointer access after pixman_image_create_bits() failure
+       (LP #705078)
+      + 213_xichangehierarchy-check-oom.patch:
+        Add NULL pointer check for out-of-memory conditions. (LP #720445)
+      + 214_glx_dri_searchdirs.patch:
+        Search in same paths as mesa for DRI drivers for AIGLX so we can handle
+        UMS fallback for radeon gracefully.
+  * 211_glx_fix_bindtextimageext_length_check.patch:
+  * 212_fix_request_length_check_for_createglxpbuffersgix.patch:
+    - Drop; these cherry-picks are included in 1.10RC2
+  * 214_glx_dri_searchdirs.patch:
+    - Fix dlclose/free snafu. (LP: #722563)
+    - Fix nouveau check to downgrade missing DRI error messages to info.
+      We don't support nouveau's 3D, so let's not complain too strenuously
+      when it's not installed.
+  * 215_glx_drawable_refcounting.diff:
+    - Refcount GLXDrawables to avoid use-after-free crashes.  Patch from
+      xorg-devel mailing list.  Prevents segfault on logout and server
+      regenerate, and possibly other times. (LP: #711422)
+  * debian/inputabiver,
+    debian/videoabiver,
+    debian/xserver-xorg-dev.install
+    - Temporarily re-add these to xserver-xorg-dev so we don't need to merge
+      all the driver changes from Debian en masse.  These should be dropped
+      once all drivers have been merged from Debian, and certainly in Natty+1.
+  * debian/serverminver:
+    - Include 2ubuntu1 string; Xi 2.1 bumps the minor input ABI, so drivers
+      built against it need the Xi 2.1 patched server.
+
+  [ Timo Aaltonen ]
+  * debian/patches/216_dix-valuator-count-of-0-is-valid.diff:
+    - For all but motion and proximity events, having no valuators is ok.
+      Regression from 1.9, keyboard events are not converted to protocol
+      events. (LP: #714696)
+
+  [ Chase Douglas ]
+  * Add in preliminary xi2.1 support
+    - Added 500_xi2.1.patch
+    - Moved 202_xf86CoordinationsToWindows.patch to
+      501_xf86CoordinatesToWindow.patch
+    - Moved 203_gestures-extension.patch to 502_gestures-extension.patch
+    - Bump dependency on x11proto-input for xi 2.1
+
+ -- Christopher James Halse Rogers <raof@ubuntu.com>  Wed, 23 Feb 2011 09:40:07 +1100
+
+xorg-server (2:1.9.99.902-2) experimental; urgency=low
+
+  * Bump dependency on x11proto-randr-dev, needed since xorg-server.pc
+    pulls a newer randrproto version.
+  * Merge from debian-unstable (picking packaging updates from 2:1.9.4-3).
+  * Mention some basic checks to perform when updating to a new upstream
+    release, in README.source: ABI bumps and SDK_REQUIRED_MODULES updates.
+  * Accordingly:
+    - Bump the x11proto-xext-dev dependency.
+    - Don't bump the x11proto-kb-dev dependency (even etch had a
+      sufficient version).
+
+ -- Cyril Brulebois <kibi@debian.org>  Sun, 20 Feb 2011 07:02:20 +0100
+
+xorg-server (2:1.9.99.902-1) experimental; urgency=low
+
+  [ Christopher James Halse Rogers ]
+  * New upstream release (1.10 rc1)
+  * Drop 16-xaa-fbcomposite-fix-negative-size.diff, the mod macro that this
+    patch fixes is no longer used.
+  * debian/control:
+    - Bump x11proto-randr-dev and x11proto-xext-dev build-deps to 1.3.99 and
+      7.1.99 for new XRandR and XSync extension protocols.
+
+  [ Julien Cristau ]
+  * Bump serverminver and ABI versions.
+
+  [ Cyril Brulebois ]
+  * New upstream release (1.10 rc2).
+  * bug script: Report libGL-related diversions.
+  * Bump serverminver again, since ABI_XINPUT_VERSION was bumped from 12.0
+    to 12.2.
+  * Update debian/copyright from upstream COPYING.
+  * Add patch to work around out-of-tree issues: 16-oot-build.diff
+
+ -- Cyril Brulebois <kibi@debian.org>  Sat, 19 Feb 2011 15:29:54 +0100
+
+xorg-server (2:1.9.99.901+git20110131.be3be758-0ubuntu6) natty; urgency=low
+
+  * debian/patches/214_glx_dri_searchdirs.patch:
+    - Search for DRI drivers for AIGLX in the same set of directories as mesa.
+      Allows us to fall back to the classic radeon drivers when KMS is not
+      available.
+  * debian/rules:
+    - --disable-builddocs → --disable-devel-docs to match upstream rename.
+      Makes local builds faster and less prone to doxygen errors.
+  * debian/control:
+    - Bump build-depends on mesa to pick up new drisearchdirs variable in
+      dri.pc
+
+ -- Christopher James Halse Rogers <raof@ubuntu.com>  Fri, 18 Feb 2011 17:03:46 +1100
+
+xorg-server (2:1.9.99.901+git20110131.be3be758-0ubuntu5) natty; urgency=low
+
+  * Add 213_xichangehierarchy-check-oom.patch: Another NULL pointer check
+    for out-of-memory conditions, this time leading to a segfault in an
+    unchecked calloc in XISendDeviceHierarchyEvent().
+    (LP: #720445)
+
+ -- Bryce Harrington <bryce@ubuntu.com>  Wed, 16 Feb 2011 16:46:35 -0800
+
+xorg-server (2:1.9.99.901+git20110131.be3be758-0ubuntu4) natty; urgency=low
+
+  * Add 211_glx_fix_bindtextimageext_length_check.patch,
+    212_fix_request_length_check_for_createglxpbuffersgix.patch:
+    - Correct wrong request size match for xGLXCreateGLXPbufferSGIXReq.
+      This can result in some invalid BadLength errors.
+      (LP: #714280)
+
+ -- Bryce Harrington <bryce@ubuntu.com>  Mon, 14 Feb 2011 12:07:45 -0800
+
+xorg-server (2:1.9.99.901+git20110131.be3be758-0ubuntu3) natty; urgency=low
+
+  * Restore 208_switch_on_release.diff - the patch does not appear to be
+    upstream actually.  Users confirm the fix regressed without it.
+    (LP: #711842)
+  * Add 210_pixman_null_ptr_check.patch: pixman_image_create_bits() can
+    return NULL under a variety of circumstances, thus needs checked
+    before dereferencing it in the pixman_image_set_has_client_clip()
+    call.
+    (LP: #705078, deb: 596155, fdo: 28882)
+
+ -- Bryce Harrington <bryce@ubuntu.com>  Thu, 03 Feb 2011 22:42:52 -0800
+
+xorg-server (2:1.9.99.901+git20110131.be3be758-0ubuntu1) natty; urgency=low
+
+  * Merge from (unreleased) debian-experimental.  Remaining Ubuntu changes:
+    - rules:
+      + Disable SELinux, libaudit-dev is not in main yet. (LP: #406226)
+      + Enable xcsecurity. (LP: #247537)
+      + Add --with-extra-module-dir to support GL alternatives.
+    - control:
+      + Xvfb depends on xauth, x11-xkb-utils. (LP: #500102)
+      + Add breaks for incompatible drivers. (LP: #614993)
+      + Drop libaudit-dev from build-deps.
+    - local/xvfb-run*: Add correct docs about error codes. (LP #328205)
+    - debian/patches:
+      + 100_rethrow_signals.patch:
+        When aborting, re-raise signals for apport
+      + 109_fix-swcursor-crash.patch:
+        Avoid dereferencing null pointer while reloading cursors during
+        resume. (LP: #371405)
+      + 111_armel-drv-fallbacks.patch:
+        Add support for armel driver fallbacks.
+      + 121_only_switch_vt_when_active.diff:
+        Add a check to prevent the X server from changing the VT when killing
+        GDM from the console.
+      + 122_xext_fix_card32_overflow_in_xauth.patch:
+        Fix server crash when “xauth generate” is called with large timeout.
+      + 157_check_null_modes.patch, 162_null_crtc_in_rotation.patch,
+        166_nullptr_xinerama_keyrepeat.patch, 167_nullptr_xisbread.patch
+        169_mipointer_nullptr_checks.patch,
+        172_cwgetbackingpicture_nullptr_check.patch:
+        Fix various segfaults in xserver by checking pointers for NULL
+        values before dereferencing them.
+      + 165_man_xorg_conf_no_device_ident.patch
+        Correct man page
+      + 168_glibc_trace_to_stderr.patch:
+        Report abort traces to stderr instead of terminal
+      + 184_virtual_devices_autodetect.patch:
+        Use vesa for qemu device, which is not supported by cirrus
+      + 188_default_primary_to_first_busid.patch:
+        Pick the first device and carry on (LP: #459512)
+      + 190_cache-xkbcomp_output_for_fast_start_up.patch:
+      + 191-Xorg-add-an-extra-module-path.patch:
+        Add support for the alternatives module path.
+      + 198_nohwaccess.patch:
+        Adds a -nohwaccess argument to make X not access the hardware
+        ports directly.
+      + 200_randr-null.patch:
+        Clarify a pointer initialization.
+      + 206_intel_8xx_default_to_fbdev.patch:
+        Makes 8xx class intel GPUs default to fbdev for stability. (LP: #633593)
+  * Refresh 121_only_switch_vt_when_active.diff for new upstream.
+  * Drop 187_edid_quirk_hp_nc8430.patch; upstream.
+  * Drop 189_xserver_1.5.0_bg_none_root.patch; functionality now upstream.
+  * Refresh 190_cache-xkbcomp_output_for_fast_start_up.patch for new upstream.
+  * Drop 197_xvfb-randr.patch:
+    - miRandR, which this used, has been removed from the server.
+  * Drop 204_fix-neg-sync-transition.patch; upstream.
+  * Drop 207_dga_master_device.patch; upstream.
+  * Drop 208_switch_on_release.diff; upstream.
+  * debian/patches/209_add_legacy_bgnone_option.patch:
+    - Add "-nr" as a synonym for "-background none" to ease the transition from
+      the old 189_xserver_1.5.0_bg_none_root.patch patch.  Can be dropped once
+      all the ?DM have been updated to use the new option.
+  * debian/control:
+    - Add Breaks: to xserver-xorg-video-8 and current fglrx.  These proprietary
+      drivers don't yet have appropriate dependency information, so manually
+      handle them here to prevent broken upgrades.
+
+ -- Christopher James Halse Rogers <raof@ubuntu.com>  Mon, 31 Jan 2011 19:45:19 +1100
+
+xorg-server (2:1.9.4-3) unstable; urgency=low
+
+  * Maintainer script clean-up:
+    - xserver-xorg-core.preinst.in: Remove, 1.5 is long gone.
+    - xserver-xorg-core.postinst.in: Remove, 1.5 is long gone, and 1.7.4
+      was between lenny and squeeze.
+    - xserver-xorg-core.postrm.in: Rename as xserver-xorg-core.postrm,
+      handling upgrades from 1.5 is no longer needed, only keep the logs
+      removal and the #DEBHELPER# placeholder.
+  * Move remaining xsfbs bits to debian/rules:
+    - Create/clean stampdir/.
+    - Use quilt.make, $(QUILT_STAMPFN), unpatch.
+    - Define SOURCE_NAME and SOURCE_VERSION.
+  * Remove debian/xsfbs accordingly.
+  * Remove reference to xsfbs in README.source accordingly.
+  * Add patch: 20-update-gpu-pitch.diff (from upstream bug 33929), fixing
+    issues with the radeon driver (Closes: #613957).
+
+ -- Cyril Brulebois <kibi@debian.org>  Sun, 20 Feb 2011 05:35:50 +0100
+
+xorg-server (2:1.9.4-2) unstable; urgency=low
+
+  * Put an end to the dependency hell! Now that we have proper
+    dependencies between drivers and the server, remove xserver-xorg from
+    xserver-xorg-core's Depends (Closes: #362313). In a nutshell, one may
+    want to choose between installing:
+    - xserver-xorg-core: the server itself, with no strings attached.
+    - xserver-xorg: pulls the server and drivers, contains the X wrapper
+      and some documentation.
+    - xorg: pulls xserver-xorg as well as various X11 clients and fonts.
+  * bug script: Report KMS configuration files and their contents.
+  * bug script: Keep only one lspci call (with proper filtering), which
+    makes PCI IDs come back.
+  * bug script: Report libGL-related diversions.
+  * Stop providing xorg-input-abi-11.0 and xorg-video-abi-8.0 now that
+    drivers have reached unstable.
+  * Merge server-1.9-branch up to 0a4b0de9af.
+
+ -- Cyril Brulebois <kibi@debian.org>  Wed, 16 Feb 2011 23:17:07 +0100
+
+xorg-server (2:1.9.4-1) unstable; urgency=low
+
+  * The “squeeze is released, target sid!” upload.
+  * New upstream release.
+  * Unfuzzy all patches.
+  * Get rid of long obsolete NEWS file.
+  * Replace “--remaining-packages” with “-Nfoo -Nbar” in the “dh_strip -s”
+    call, to avoid non-stripped binaries if the build is resumed.
+  * Use “dh_prep” instead of deprecated “dh_clean -k”.
+  * Bump debhelper build-dep accordingly.
+  * Introduce dh_xsf_substvars, to be used in driver packages to set
+    appropriate substitution variables for Depends and Provides, before
+    calling dh_gencontrol. Ship it in xserver-xorg-dev.
+  * Also ship a debhelper sequence: xsf.pm, to insert dh_xsf_substvars
+    before dh_gencontrol. Usage: “dh $@ --with xsf” when using dh.
+  * Get rid of inputabiver and videoabiver files, they've been deprecated
+    for a while, and drivers should all have switched by now.
+  * rules: Only read the first line of debian/serverminver to set the
+    serverminver variable, used to prepare xinputdep and videodrvdep
+    files.
+  * rules: Keep only the major ABI version from pkg-config's output to
+    build xorg-{input,video}-abi-$ABI. To handle minor ABI versions, we
+    have the serverminver mechanism.
+  * To avoid having to binNMU all drivers to update their Depends from
+    xorg-*-abi-$MAJOR-$MINOR to xorg-*-abi-$MAJOR, add xorg-video-abi-8.0
+    and xorg-input-abi-11.0 to the server's Provides temporarily (until
+    the next ABI bump).
+  * Add ${videoabi}, ${inputabi} to the udeb's Provides. There's no reason
+    for udebs to have loose dependencies.
+  * Accordingly, copy server's substvars as udeb's substvars once the
+    videoabi/inputabi variables are computed.
+  * Add an abibumpcheck target which checks for xinput and videodrv ABI
+    updates, based on the versions stored in debian/serverminver; make
+    clean depend on it to make sure such an update is noticed at the very
+    beginning of the build.
+  * Add current versions to debian/serverminver accordingly.
+  * Remove “xserver” from Provides, it's deprecated.
+  * Use architecture wildcards for build-deps.
+  * Make xserver-xfbdev linux-any; add armhf and powerpcspe to the udeb