xserver-xorg-input-evdev: Changes to 'ubuntu'
debian/changelog | 14
debian/control | 13
debian/local/60-magictrackpad.conf | 5
debian/patches/100-fix-touchup-problem-on-touchpads.patch | 28
debian/patches/100-xi2.1.patch | 1671 ++++++++++++++
debian/patches/101-gestures.patch | 201 +
debian/patches/series | 2
debian/rules | 4
8 files changed, 1825 insertions(+), 113 deletions(-)
New commits:
commit 97bf773b022b8666539707b4bf4a9f71fde2e970
Author: Chase Douglas <chase.douglas@canonical.com>
Date: Wed Feb 9 10:47:52 2011 -0500
Revert rule for Magic Trackpad, synaptics will handle it now
diff --git a/debian/changelog b/debian/changelog
index a9aa511..1a74640 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -8,8 +8,9 @@ xserver-xorg-input-evdev (1:2.6.0-1ubuntu7) UNRELEASED; urgency=low
- Bump dependency on xserver-xorg-dev for xi 2.1
- Add new xi 2.1 dependency on libmtdev-dev and libutouch-grail1-dev
- Bump runtime dependency on libutouch-grail1 to 1.0.19
+ * Revert rule for Magic Trackpad, synaptics will handle it now
- -- Chase Douglas <chase.douglas@ubuntu.com> Mon, 21 Feb 2011 18:49:27 -0500
+ -- Chase Douglas <chase.douglas@ubuntu.com> Mon, 21 Feb 2011 18:50:15 -0500
xserver-xorg-input-evdev (1:2.6.0-1ubuntu6) natty; urgency=low
diff --git a/debian/local/60-magictrackpad.conf b/debian/local/60-magictrackpad.conf
deleted file mode 100644
index 4b7f4aa..0000000
--- a/debian/local/60-magictrackpad.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-Section "InputClass"
- Identifier "Magic Trackpad"
- MatchUSBID "05ac:030e"
- Driver "evdev"
-EndSection
diff --git a/debian/rules b/debian/rules
index d9e4e1c..cddc86e 100755
--- a/debian/rules
+++ b/debian/rules
@@ -21,7 +21,6 @@ ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
endif
DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH)
-DEB_HOST_ARCH_OS ?= $(shell dpkg-architecture -qDEB_HOST_ARCH_OS)
DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE))
@@ -85,9 +84,6 @@ binary-arch: build install serverabi
dh_installdocs
dh_installchangelogs ChangeLog
dh_install --sourcedir=debian/tmp --list-missing --exclude=evdev_drv.la
-ifeq ($(DEB_HOST_ARCH_OS), linux)
- install -D -m 644 debian/local/60-magictrackpad.conf debian/xserver-xorg-input-evdev/usr/share/X11/xorg.conf.d/60-magictrackpad.conf
-endif
dh_installman
dh_link
dh_strip
commit a12a1f9e2b80e8a9a1515c309d0094f898139a83
Author: Chase Douglas <chase.douglas@canonical.com>
Date: Tue Feb 1 17:15:54 2011 -0500
Add xi 2.1 support
* Add xi 2.1 support
- Added 100-xi2.1.patch
- Refreshed 101-gestures.patch
- Bump dependency on xserver-xorg-dev for xi 2.1
- Add new xi 2.1 dependency on libmtdev-dev
- Bump runtime dependency on libutouch-grail1 to 1.0.19
diff --git a/debian/changelog b/debian/changelog
index 5b39258..a9aa511 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,8 +2,14 @@ xserver-xorg-input-evdev (1:2.6.0-1ubuntu7) UNRELEASED; urgency=low
* Drop 100-fix-touchup-problem-on-touchpads.patch
- Upstream fixed the issue
-
- -- Chase Douglas <chase.douglas@ubuntu.com> Tue, 01 Feb 2011 17:10:23 -0500
+ * Add xi 2.1 support
+ - Added 100-xi2.1.patch
+ - Refreshed 101-gestures.patch
+ - Bump dependency on xserver-xorg-dev for xi 2.1
+ - Add new xi 2.1 dependency on libmtdev-dev and libutouch-grail1-dev
+ - Bump runtime dependency on libutouch-grail1 to 1.0.19
+
+ -- Chase Douglas <chase.douglas@ubuntu.com> Mon, 21 Feb 2011 18:49:27 -0500
xserver-xorg-input-evdev (1:2.6.0-1ubuntu6) natty; urgency=low
diff --git a/debian/control b/debian/control
index 8e91a38..3d3c14b 100644
--- a/debian/control
+++ b/debian/control
@@ -8,17 +8,18 @@ Build-Depends:
debhelper (>= 5.0.0),
pkg-config,
quilt,
- xserver-xorg-dev (>= 2:1.9.99.901+git20110131),
+ xserver-xorg-dev (>= 2:1.9.99.902-2ubuntu1),
x11proto-core-dev,
x11proto-randr-dev,
- x11proto-input-dev,
+ x11proto-input-dev (>= 2.0.1-1ubuntu1),
x11proto-kb-dev,
libxkbfile-dev,
dpkg-dev (>= 1.14.17),
automake,
libtool,
xutils-dev (>= 1:7.5+4),
- libutouch-grail-dev (>= 1.0.10)
+ libutouch-grail-dev (>= 1.0.10),
+ libmtdev-dev
Standards-Version: 3.8.4
Vcs-Git: git://git.debian.org/git/pkg-xorg/driver/xserver-xorg-input-evdev
Vcs-Browser: http://git.debian.org/?p=pkg-xorg/driver/xserver-xorg-input-evdev.git
@@ -26,7 +27,8 @@ Vcs-Browser: http://git.debian.org/?p=pkg-xorg/driver/xserver-xorg-input-evdev.g
Package: xserver-xorg-input-evdev
Architecture: linux-any
Depends: ${shlibs:Depends}, ${misc:Depends}, ${xinpdriver:Depends},
- libutouch-grail1 (>= 1.0.10)
+ libutouch-grail1 (>= 1.0.19),
+ xserver-xorg-core (>= 2:1.9.99.902-2ubuntu1)
Provides: ${xinpdriver:Provides}
Replaces: xserver-xorg (<< 6.8.2-35), xserver-xorg-input-gevdev
Conflicts: xserver-xorg-input-gevdev
@@ -46,7 +48,8 @@ Section: debian-installer
Architecture: linux-any
Depends: ${shlibs:Depends}, ${misc:Depends}, ${xserver:Depends},
udev-udeb [linux-any],
- libutouch-grail1-udeb (>= 1.0.10)
+ libutouch-grail1-udeb (>= 1.0.19),
+ xserver-xorg-core (>= 2:1.9.99.902-2ubuntu1)
Provides: ${xinpdriver:Provides}
Description: X.Org X server -- evdev input driver
This is a udeb, or a microdeb, for the debian-installer.
diff --git a/debian/patches/100-xi2.1.patch b/debian/patches/100-xi2.1.patch
new file mode 100644
index 0000000..4d07e16
--- /dev/null
+++ b/debian/patches/100-xi2.1.patch
@@ -0,0 +1,1671 @@
+diff --git a/configure.ac b/configure.ac
+index 887021c..b4b0bad 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -47,6 +47,9 @@ XORG_DEFAULT_OPTIONS
+ # Obtain compiler/linker options from server and required extensions
+ PKG_CHECK_MODULES(XORG, xorg-server xproto inputproto)
+
++# Obtain compiler/linker options for mtdev
++PKG_CHECK_MODULES(MTDEV, mtdev)
++
+ # Define a configure option for an alternate input module directory
+ AC_ARG_WITH(xorg-module-dir,
+ AC_HELP_STRING([--with-xorg-module-dir=DIR],
+diff --git a/src/Makefile.am b/src/Makefile.am
+index a5c89ac..b8d0dd9 100644
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -30,6 +30,7 @@ AM_CPPFLAGS =-I$(top_srcdir)/include
+
+ @DRIVER_NAME@_drv_la_LTLIBRARIES = @DRIVER_NAME@_drv.la
+ @DRIVER_NAME@_drv_la_LDFLAGS = -module -avoid-version
++@DRIVER_NAME@_drv_la_LIBADD = $(MTDEV_LIBS)
+ @DRIVER_NAME@_drv_ladir = @inputdir@
+
+ @DRIVER_NAME@_drv_la_SOURCES = @DRIVER_NAME@.c \
+diff --git a/src/draglock.c b/src/draglock.c
+index af80cf6..0b430f0 100644
+--- a/src/draglock.c
++++ b/src/draglock.c
+@@ -44,9 +44,7 @@
+
+ #include <evdev-properties.h>
+
+-#ifdef HAVE_PROPERTIES
+ static Atom prop_dlock = 0; /* Drag lock buttons. */
+-#endif
+
+ void EvdevDragLockLockButton(InputInfoPtr pInfo, unsigned int button);
+
+@@ -211,7 +209,6 @@ EvdevDragLockFilterEvent(InputInfoPtr pInfo, unsigned int button, int value)
+ return FALSE;
+ }
+
+-#ifdef HAVE_PROPERTIES
+ /**
+ * Set the drag lock property.
+ * If only one value is supplied, then this is used as the meta button.
+@@ -319,5 +316,3 @@ EvdevDragLockInitProperty(DeviceIntPtr dev)
+
+ XIRegisterPropertyHandler(dev, EvdevDragLockSetProperty, NULL, NULL);
+ }
+-
+-#endif
+diff --git a/src/emuMB.c b/src/emuMB.c
+index 764b30e..b7a57b8 100644
+--- a/src/emuMB.c
++++ b/src/emuMB.c
+@@ -43,10 +43,8 @@
+
+ #include <evdev-properties.h>
+
+-#ifdef HAVE_PROPERTIES
+ static Atom prop_mbemu = 0; /* Middle button emulation on/off property */
+ static Atom prop_mbtimeout = 0; /* Middle button timeout property */
+-#endif
+ /*
+ * Lets create a simple finite-state machine for 3 button emulation:
+ *
+@@ -330,7 +328,6 @@ EvdevMBEmuFinalize(InputInfoPtr pInfo)
+
+ }
+
+-#ifdef HAVE_PROPERTIES
+ static int
+ EvdevMBEmuSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
+ BOOL checkonly)
+@@ -391,4 +388,3 @@ EvdevMBEmuInitProperty(DeviceIntPtr dev)
+
+ XIRegisterPropertyHandler(dev, EvdevMBEmuSetProperty, NULL, NULL);
+ }
+-#endif
+diff --git a/src/emuWheel.c b/src/emuWheel.c
+index 9a53211..715f8d1 100644
+--- a/src/emuWheel.c
++++ b/src/emuWheel.c
+@@ -44,13 +44,11 @@
+
+ #define WHEEL_NOT_CONFIGURED 0
+
+-#ifdef HAVE_PROPERTIES
+ static Atom prop_wheel_emu = 0;
+ static Atom prop_wheel_axismap = 0;
+ static Atom prop_wheel_inertia = 0;
+ static Atom prop_wheel_timeout = 0;
+ static Atom prop_wheel_button = 0;
+-#endif
+
+ /* Local Funciton Prototypes */
+ static BOOL EvdevWheelEmuHandleButtonMap(InputInfoPtr pInfo, WheelAxisPtr pAxis, char *axis_name);
+@@ -120,8 +118,9 @@ EvdevWheelEmuFilterMotion(InputInfoPtr pInfo, struct input_event *pEv)
+
+ /* We don't want to intercept real mouse wheel events */
+ if(pEv->type == EV_ABS) {
+- oldValue = pEvdev->vals[pEvdev->axis_map[pEv->code]];
+- pEvdev->vals[pEvdev->axis_map[pEv->code]] = value;
++ int axis = pEvdev->axis_map[pEv->code];
++ oldValue = valuator_mask_get(pEvdev->vals, axis);
++ valuator_mask_set(pEvdev->vals, axis, value);
+ value -= oldValue; /* make value into a differential measurement */
+ }
+
+@@ -335,7 +334,6 @@ EvdevWheelEmuPreInit(InputInfoPtr pInfo)
+ pInfo->name, pEvdev->emulateWheel.button, inertia, timeout);
+ }
+
+-#ifdef HAVE_PROPERTIES
+ static int
+ EvdevWheelEmuSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
+ BOOL checkonly)
+@@ -485,4 +483,3 @@ EvdevWheelEmuInitProperty(DeviceIntPtr dev)
+
+ XIRegisterPropertyHandler(dev, EvdevWheelEmuSetProperty, NULL, NULL);
+ }
+-#endif
+diff --git a/src/evdev.c b/src/evdev.c
+index 45873c1..446abb9 100644
+--- a/src/evdev.c
++++ b/src/evdev.c
+@@ -48,23 +48,12 @@
+ #include <xorgVersion.h>
+ #include <xkbsrv.h>
+
+-#ifdef HAVE_PROPERTIES
+ #include <X11/Xatom.h>
+ #include <evdev-properties.h>
+ #include <xserver-properties.h>
+-/* 1.6 has properties, but no labels */
+-#ifdef AXIS_LABEL_PROP
+-#define HAVE_LABELS
+-#else
+-#undef HAVE_LABELS
+-#endif
+-
+-#endif
+
+-#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 12
+ /* removed from server, purge when dropping support for server 1.10 */
+ #define XI86_SEND_DRAG_EVENTS 0x08
+-#endif
+
+ #ifndef MAXDEVICES
+ #include <inputstr.h> /* for MAX_DEVICES */
+@@ -87,6 +76,14 @@
+ #define MODEFLAG 8
+ #define COMPOSEFLAG 16
+
++#ifndef ABS_MT_SLOT
++#define ABS_MT_SLOT 0x2f
++#endif
++
++#ifndef ABS_MT_TRACKING_ID
++#define ABS_MT_TRACKING_ID 0x39
++#endif
++
+ static char *evdevDefaults[] = {
+ "XkbRules", "evdev",
+ "XkbModel", "evdev",
+@@ -114,7 +111,6 @@ static BOOL EvdevGrabDevice(InputInfoPtr pInfo, int grab, int ungrab);
+ static void EvdevSetCalibration(InputInfoPtr pInfo, int num_calibration, int calibration[4]);
+ static int EvdevOpenDevice(InputInfoPtr pInfo);
+
+-#ifdef HAVE_PROPERTIES
+ static void EvdevInitAxesLabels(EvdevPtr pEvdev, int natoms, Atom *atoms);
+ static void EvdevInitButtonLabels(EvdevPtr pEvdev, int natoms, Atom *atoms);
+ static void EvdevInitProperty(DeviceIntPtr dev);
+@@ -125,7 +121,6 @@ static Atom prop_calibration = 0;
+ static Atom prop_swap = 0;
+ static Atom prop_axis_label = 0;
+ static Atom prop_btn_label = 0;
+-#endif
+
+ /* All devices the evdev driver has allocated and knows about.
+ * MAXDEVICES is safe as null-terminated array, as two devices (VCP and VCK)
+@@ -302,22 +297,13 @@ EvdevQueueKbdEvent(InputInfoPtr pInfo, struct input_event *ev, int value)
+
+ /* Filter all repeated events from device.
+ We'll do softrepeat in the server, but only since 1.6 */
+- if (value == 2
+-#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) <= 2
+- && (ev->code == KEY_LEFTCTRL || ev->code == KEY_RIGHTCTRL ||
+- ev->code == KEY_LEFTSHIFT || ev->code == KEY_RIGHTSHIFT ||
+- ev->code == KEY_LEFTALT || ev->code == KEY_RIGHTALT ||
+- ev->code == KEY_LEFTMETA || ev->code == KEY_RIGHTMETA ||
+- ev->code == KEY_CAPSLOCK || ev->code == KEY_NUMLOCK ||
+- ev->code == KEY_SCROLLLOCK) /* XXX windows keys? */
+-#endif
+- )
+- return;
++ if (value == 2)
++ return;
+
+ if ((pQueue = EvdevNextInQueue(pInfo)))
+ {
+ pQueue->type = EV_QUEUE_KEY;
+- pQueue->key = code;
++ pQueue->detail.key = code;
+ pQueue->val = value;
+ }
+ }
+@@ -327,10 +313,14 @@ EvdevQueueButtonEvent(InputInfoPtr pInfo, int button, int value)
+ {
+ EventQueuePtr pQueue;
+
++ /* Direct touch devices use server side pointer emulation */
++ if (pInfo->dev->touch && pInfo->dev->touch->mode == XIDirectTouch)
++ return;
++
+ if ((pQueue = EvdevNextInQueue(pInfo)))
+ {
+ pQueue->type = EV_QUEUE_BTN;
+- pQueue->key = button;
++ pQueue->detail.key = button;
+ pQueue->val = value;
+ }
+ }
+@@ -342,11 +332,27 @@ EvdevQueueProximityEvent(InputInfoPtr pInfo, int value)
+ if ((pQueue = EvdevNextInQueue(pInfo)))
+ {
+ pQueue->type = EV_QUEUE_PROXIMITY;
+- pQueue->key = 0;
++ pQueue->detail.key = 0;
+ pQueue->val = value;
+ }
+ }
+
++#ifdef MULTITOUCH
++void
++EvdevQueueTouchEvent(InputInfoPtr pInfo, unsigned int touch, ValuatorMask *mask,
++ uint16_t evtype)
++{
++ EventQueuePtr pQueue;
++ if ((pQueue = EvdevNextInQueue(pInfo)))
++ {
++ pQueue->type = EV_QUEUE_TOUCH;
++ pQueue->detail.touch = touch;
++ valuator_mask_copy(pQueue->touch_vals, mask);
++ pQueue->val = evtype;
++ }
++}
++#endif
++
+ /**
+ * Post button event right here, right now.
+ * Interface for MB emulation since these need to post immediately.
+@@ -368,41 +374,44 @@ EvdevQueueButtonClicks(InputInfoPtr pInfo, int button, int count)
+ }
+ }
+
+-#define ABS_X_VALUE 0x1
+-#define ABS_Y_VALUE 0x2
+-#define ABS_VALUE 0x4
+ /**
+ * Take the valuators and process them accordingly.
+ */
+ static void
+-EvdevProcessValuators(InputInfoPtr pInfo, int v[MAX_VALUATORS], int *num_v,
+- int *first_v)
++EvdevProcessValuators(InputInfoPtr pInfo)
+ {
+ int tmp;
+ EvdevPtr pEvdev = pInfo->private;
+-
+- *num_v = *first_v = 0;
++ int *delta = pEvdev->delta;
+
+ /* convert to relative motion for touchpads */
+ if (pEvdev->abs_queued && (pEvdev->flags & EVDEV_RELATIVE_MODE)) {
+ if (pEvdev->in_proximity) {
+- if (pEvdev->old_vals[0] != -1)
+- pEvdev->delta[REL_X] = pEvdev->vals[0] - pEvdev->old_vals[0];
+- if (pEvdev->old_vals[1] != -1)
+- pEvdev->delta[REL_Y] = pEvdev->vals[1] - pEvdev->old_vals[1];
+- if (pEvdev->abs_queued & ABS_X_VALUE)
+- pEvdev->old_vals[0] = pEvdev->vals[0];
+- if (pEvdev->abs_queued & ABS_Y_VALUE)
+- pEvdev->old_vals[1] = pEvdev->vals[1];
++ if (valuator_mask_isset(pEvdev->vals, 0))
++ {
++ if (valuator_mask_isset(pEvdev->old_vals, 0))
++ delta[REL_X] = valuator_mask_get(pEvdev->vals, 0) -
++ valuator_mask_get(pEvdev->old_vals, 0);
++ valuator_mask_set(pEvdev->old_vals, 0,
++ valuator_mask_get(pEvdev->vals, 0));
++ }
++ if (valuator_mask_isset(pEvdev->vals, 1))
++ {
++ if (valuator_mask_isset(pEvdev->old_vals, 1))
++ delta[REL_Y] = valuator_mask_get(pEvdev->vals, 1) -
++ valuator_mask_get(pEvdev->old_vals, 1);
++ valuator_mask_set(pEvdev->old_vals, 1,
++ valuator_mask_get(pEvdev->vals, 1));
++ }
+ } else {
+- pEvdev->old_vals[0] = pEvdev->old_vals[1] = -1;
++ valuator_mask_zero(pEvdev->old_vals);
+ }
++ valuator_mask_zero(pEvdev->vals);
+ pEvdev->abs_queued = 0;
+ pEvdev->rel_queued = 1;
+ }
+
+ if (pEvdev->rel_queued) {
+- int first = REL_CNT, last = -1;
+ int i;
+
+ if (pEvdev->swap_axes) {
+@@ -419,19 +428,7 @@ EvdevProcessValuators(InputInfoPtr pInfo, int v[MAX_VALUATORS], int *num_v,
+ {
+ int map = pEvdev->axis_map[i];
+ if (pEvdev->delta[i] && map != -1)
+- {
+- v[map] = pEvdev->delta[i];
+- if (map < first)
+- first = map;
+- if (map > last)
+- last = map;
+- }
+- }
+-
+- if (last >= 0)
+- {
+- *num_v = (last - first + 1);
+- *first_v = first;
++ valuator_mask_set(pEvdev->vals, map, pEvdev->delta[i]);
+ }
+ }
+ /*
+@@ -444,43 +441,46 @@ EvdevProcessValuators(InputInfoPtr pInfo, int v[MAX_VALUATORS], int *num_v,
+ * just works.
+ */
+ else if (pEvdev->abs_queued && pEvdev->in_proximity) {
+- memcpy(v, pEvdev->vals, sizeof(int) * pEvdev->num_vals);
++ int unswapped_x = valuator_mask_get(pEvdev->vals, 0);
++ int unswapped_y = valuator_mask_get(pEvdev->vals, 1);
++ int i;
+
+- if (pEvdev->swap_axes) {
+- int tmp = v[0];
+- v[0] = xf86ScaleAxis(v[1],
+- pEvdev->absinfo[ABS_X].maximum,
+- pEvdev->absinfo[ABS_X].minimum,
+- pEvdev->absinfo[ABS_Y].maximum,
+- pEvdev->absinfo[ABS_Y].minimum);
+- v[1] = xf86ScaleAxis(tmp,
+- pEvdev->absinfo[ABS_Y].maximum,
+- pEvdev->absinfo[ABS_Y].minimum,
+- pEvdev->absinfo[ABS_X].maximum,
+- pEvdev->absinfo[ABS_X].minimum);
+- }
++ for (i = 0; i <= 1; i++) {
++ int val;
++ int calib_min;
++ int calib_max;
+
+- if (pEvdev->flags & EVDEV_CALIBRATED)
+- {
+- v[0] = xf86ScaleAxis(v[0],
+- pEvdev->absinfo[ABS_X].maximum,
+- pEvdev->absinfo[ABS_X].minimum,
+- pEvdev->calibration.max_x, pEvdev->calibration.min_x);
+- v[1] = xf86ScaleAxis(v[1],
+- pEvdev->absinfo[ABS_Y].maximum,
+- pEvdev->absinfo[ABS_Y].minimum,
+- pEvdev->calibration.max_y, pEvdev->calibration.min_y);
+- }
++ if (!valuator_mask_isset(pEvdev->vals, i))
++ continue;
+
+- if (pEvdev->invert_x)
+- v[0] = (pEvdev->absinfo[ABS_X].maximum - v[0] +
+- pEvdev->absinfo[ABS_X].minimum);
+- if (pEvdev->invert_y)
+- v[1] = (pEvdev->absinfo[ABS_Y].maximum - v[1] +
+- pEvdev->absinfo[ABS_Y].minimum);
++ val = valuator_mask_get(pEvdev->vals, i);
++
++ if (i == 0) {
++ calib_min = pEvdev->calibration.min_x;
++ calib_max = pEvdev->calibration.max_x;
++ } else {
++ calib_min = pEvdev->calibration.min_y;
++ calib_max = pEvdev->calibration.max_y;
++ }
++
++ if (pEvdev->swap_axes)
++ val = xf86ScaleAxis((i == 0 ? unswapped_y : unswapped_x),
++ pEvdev->absinfo[i].maximum,
++ pEvdev->absinfo[i].minimum,
++ pEvdev->absinfo[1 - i].maximum,
++ pEvdev->absinfo[1 - i].minimum);
+
+- *num_v = pEvdev->num_vals;
+- *first_v = 0;
++ if (pEvdev->flags & EVDEV_CALIBRATED)
++ val = xf86ScaleAxis(val, pEvdev->absinfo[i].maximum,
++ pEvdev->absinfo[i].minimum, calib_max,
++ calib_min);
++
++ if ((i == 0 && pEvdev->invert_x) || (i == 1 && pEvdev->invert_y))
++ val = (pEvdev->absinfo[i].maximum - val +
++ pEvdev->absinfo[i].minimum);
++
++ valuator_mask_set(pEvdev->vals, i, val);
++ }
+ }
+ }
+
+@@ -518,11 +518,15 @@ EvdevProcessProximityState(InputInfoPtr pInfo)
+ int prox_state = 0;
+ int i;
+
++ /* Does this device have any proximity axes? */
++ if (!pEvdev->prox)
++ return 0;
++
+ /* no proximity change in the queue */
+ if (!pEvdev->prox_queued)
+ {
+ if (pEvdev->abs_queued && !pEvdev->in_proximity)
+- pEvdev->abs_prox = pEvdev->abs_queued;
++ valuator_mask_copy(pEvdev->prox, pEvdev->vals);
+ return 0;
+ }
+
+@@ -540,10 +544,11 @@ EvdevProcessProximityState(InputInfoPtr pInfo)
+ {
+ /* We're about to go into/out of proximity but have no abs events
+ * within the EV_SYN. Use the last coordinates we have. */
+- if (!pEvdev->abs_queued && pEvdev->abs_prox)
++ if (!pEvdev->abs_queued &&
++ valuator_mask_num_valuators(pEvdev->prox) > 0)
+ {
+- pEvdev->abs_queued = pEvdev->abs_prox;
+- pEvdev->abs_prox = 0;
++ valuator_mask_copy(pEvdev->vals, pEvdev->prox);
++ valuator_mask_zero(pEvdev->prox);
+ }
+ }
+
+@@ -590,6 +595,7 @@ EvdevProcessRelativeMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
+ {
+ int value;
+ EvdevPtr pEvdev = pInfo->private;
++ int map;
+
+ /* Get the signed value, earlier kernels had this as unsigned */
+ value = ev->value;
+@@ -622,10 +628,63 @@ EvdevProcessRelativeMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
+
+ pEvdev->rel_queued = 1;
+ pEvdev->delta[ev->code] += value;
++ map = pEvdev->axis_map[ev->code];
++ valuator_mask_set(pEvdev->vals, map, value);
+ break;
+ }
+ }
+
++#ifdef MULTITOUCH
++static void
++EvdevProcessTouch(InputInfoPtr pInfo)
++{
++ EvdevPtr pEvdev = pInfo->private;
++
++ if (pEvdev->cur_slot < 0 || !pEvdev->mt_vals ||
++ (!pEvdev->open_slot && !pEvdev->close_slot &&
++ valuator_mask_num_valuators(pEvdev->mt_vals) == 0))
++ return;
++
++ if (pEvdev->close_slot) {
++ EvdevQueueTouchEvent(pInfo, pEvdev->cur_slot, pEvdev->mt_vals,
++ XI_TouchEnd);
++ pEvdev->close_slot = 0;
++ } else {
++ EvdevQueueTouchEvent(pInfo, pEvdev->cur_slot, pEvdev->mt_vals,
++ pEvdev->open_slot ? XI_TouchBegin :
++ XI_TouchUpdate);
++ pEvdev->open_slot = 0;
++ }
++
++ valuator_mask_zero(pEvdev->mt_vals);
++}
++
++static void
++EvdevProcessTouchEvent(InputInfoPtr pInfo, struct input_event *ev)
++{
++ EvdevPtr pEvdev = pInfo->private;
++ int map;
++
++ if (ev->code == ABS_MT_SLOT) {
++ EvdevProcessTouch(pInfo);
++ pEvdev->cur_slot = ev->value;
++ } else if (ev->code == ABS_MT_TRACKING_ID) {
++ if (ev->value >= 0) {
++ pEvdev->open_slot = 1;
++ valuator_mask_copy(pEvdev->mt_vals, pEvdev->cur_vals);
++ } else
++ pEvdev->close_slot = 1;
++ } else {
++ map = pEvdev->axis_map[ev->code] - pEvdev->num_vals;
++ valuator_mask_set(pEvdev->mt_vals, map, ev->value);
++ valuator_mask_set(pEvdev->cur_vals, map, ev->value);
++ }
++}
++#else
++#define EvdevProcessTouch(pInfo)
++#define EvdevProcessTouchEvent(pInfo, ev)
++#endif /* MULTITOUCH */
++
+ /**
+ * Take the absolute motion input event and process it accordingly.
+ */
+@@ -634,6 +693,7 @@ EvdevProcessAbsoluteMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
+ {
+ int value;
+ EvdevPtr pEvdev = pInfo->private;
++ int map;
+
+ /* Get the signed value, earlier kernels had this as unsigned */
+ value = ev->value;
+@@ -648,13 +708,16 @@ EvdevProcessAbsoluteMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
+ if (EvdevWheelEmuFilterMotion(pInfo, ev))
+ return;
+
+- pEvdev->vals[pEvdev->axis_map[ev->code]] = value;
+- if (ev->code == ABS_X)
+- pEvdev->abs_queued |= ABS_X_VALUE;
+- else if (ev->code == ABS_Y)
+- pEvdev->abs_queued |= ABS_Y_VALUE;
+- else
+- pEvdev->abs_queued |= ABS_VALUE;
++ if (ev->code >= ABS_MT_SLOT) {
++ EvdevProcessTouchEvent(pInfo, ev);
++ pEvdev->abs_queued = 1;
++ }
++ /* Direct touch devices use server side pointer emulation */
++ else if (!pInfo->dev->touch || pInfo->dev->touch->mode != XIDirectTouch) {
++ map = pEvdev->axis_map[ev->code];
++ valuator_mask_set(pEvdev->vals, map, value);
++ pEvdev->abs_queued = 1;
++ }
+ }
+
+ /**
+@@ -712,7 +775,7 @@ EvdevPostRelativeMotionEvents(InputInfoPtr pInfo, int num_v, int first_v,
+ EvdevPtr pEvdev = pInfo->private;
+
+ if (pEvdev->rel_queued) {
+- xf86PostMotionEventP(pInfo->dev, FALSE, first_v, num_v, v + first_v);
++ xf86PostMotionEventM(pInfo->dev, FALSE, pEvdev->vals);
+ }
+ }
+
+@@ -735,7 +798,7 @@ EvdevPostAbsoluteMotionEvents(InputInfoPtr pInfo, int num_v, int first_v,
+ * this scheme still just work.
+ */
+ if (pEvdev->abs_queued && pEvdev->in_proximity) {
+- xf86PostMotionEventP(pInfo->dev, TRUE, first_v, num_v, v + first_v);
++ xf86PostMotionEventM(pInfo->dev, TRUE, pEvdev->vals);
+ }
+ }
+
+@@ -750,6 +813,9 @@ EvdevPostProximityEvents(InputInfoPtr pInfo, int which, int num_v, int first_v,
+ switch (pEvdev->queue[i].type) {
+ case EV_QUEUE_KEY:
+ case EV_QUEUE_BTN:
++#ifdef MULTITOUCH
++ case EV_QUEUE_TOUCH:
++#endif
+ break;
+ case EV_QUEUE_PROXIMITY:
+ if (pEvdev->queue[i].val == which)
+@@ -772,23 +838,28 @@ static void EvdevPostQueuedEvents(InputInfoPtr pInfo, int num_v, int first_v,
+ for (i = 0; i < pEvdev->num_queue; i++) {
+ switch (pEvdev->queue[i].type) {
+ case EV_QUEUE_KEY:
+- xf86PostKeyboardEvent(pInfo->dev, pEvdev->queue[i].key,
++ xf86PostKeyboardEvent(pInfo->dev, pEvdev->queue[i].detail.key,
+ pEvdev->queue[i].val);
+ break;
+ case EV_QUEUE_BTN:
+-#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 11
+ if (pEvdev->abs_queued && pEvdev->in_proximity) {
+- xf86PostButtonEventP(pInfo->dev, 1, pEvdev->queue[i].key,
++ xf86PostButtonEventP(pInfo->dev, 1, pEvdev->queue[i].detail.key,
+ pEvdev->queue[i].val, first_v, num_v,
+ v + first_v);
+
+ } else
+-#endif
+- xf86PostButtonEvent(pInfo->dev, 0, pEvdev->queue[i].key,
++ xf86PostButtonEvent(pInfo->dev, 0, pEvdev->queue[i].detail.key,
+ pEvdev->queue[i].val, 0, 0);
+ break;
+ case EV_QUEUE_PROXIMITY:
+ break;
++#ifdef MULTITOUCH
++ case EV_QUEUE_TOUCH:
++ xf86PostTouchEvent(pInfo->dev, pEvdev->queue[i].detail.touch,
++ pEvdev->queue[i].val, 0,
++ pEvdev->queue[i].touch_vals);
++ break;
++#endif
+ }
+ }
+ }
+@@ -806,7 +877,8 @@ EvdevProcessSyncEvent(InputInfoPtr pInfo, struct input_event *ev)
+
+ EvdevProcessProximityState(pInfo);
+
+- EvdevProcessValuators(pInfo, v, &num_v, &first_v);
++ EvdevProcessValuators(pInfo);
++ EvdevProcessTouch(pInfo);
+
+ EvdevPostProximityEvents(pInfo, TRUE, num_v, first_v, v);
+ EvdevPostRelativeMotionEvents(pInfo, num_v, first_v, v);
+@@ -815,7 +887,8 @@ EvdevProcessSyncEvent(InputInfoPtr pInfo, struct input_event *ev)
+ EvdevPostProximityEvents(pInfo, FALSE, num_v, first_v, v);
+
+ memset(pEvdev->delta, 0, sizeof(pEvdev->delta));
+- memset(pEvdev->queue, 0, sizeof(pEvdev->queue));
++ if (pEvdev->vals)
++ valuator_mask_zero(pEvdev->vals);
+ pEvdev->num_queue = 0;
+ pEvdev->abs_queued = 0;
+ pEvdev->rel_queued = 0;
+@@ -861,7 +934,17 @@ EvdevReadInput(InputInfoPtr pInfo)
+
+ while (len == sizeof(ev))
+ {
+- len = read(pInfo->fd, &ev, sizeof(ev));
++#ifdef MULTITOUCH
++ EvdevPtr pEvdev = pInfo->private;
++
++ if (pEvdev->mtdev)
++ len = mtdev_get(pEvdev->mtdev, pInfo->fd, ev, NUM_EVENTS) *
++ sizeof(struct input_event);
++ else
++ len = read(pInfo->fd, &ev, sizeof(ev));
++#else
++ len = read(pInfo->fd, &ev, sizeof(ev));
++#endif
+ if (len <= 0)
+ {
+ if (errno == ENODEV) /* May happen after resume */
+@@ -900,317 +983,6 @@ EvdevPtrCtrlProc(DeviceIntPtr device, PtrCtrl *ctrl)
+ /* Nothing to do, dix handles all settings */
+ }
+
+-#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 5
+-static KeySym map[] = {
+- /* 0x00 */ NoSymbol, NoSymbol,
+- /* 0x01 */ XK_Escape, NoSymbol,
+- /* 0x02 */ XK_1, XK_exclam,
+- /* 0x03 */ XK_2, XK_at,
+- /* 0x04 */ XK_3, XK_numbersign,
+- /* 0x05 */ XK_4, XK_dollar,
+- /* 0x06 */ XK_5, XK_percent,
+- /* 0x07 */ XK_6, XK_asciicircum,
+- /* 0x08 */ XK_7, XK_ampersand,
+- /* 0x09 */ XK_8, XK_asterisk,
+- /* 0x0a */ XK_9, XK_parenleft,
+- /* 0x0b */ XK_0, XK_parenright,
+- /* 0x0c */ XK_minus, XK_underscore,
+- /* 0x0d */ XK_equal, XK_plus,
+- /* 0x0e */ XK_BackSpace, NoSymbol,
+- /* 0x0f */ XK_Tab, XK_ISO_Left_Tab,
+- /* 0x10 */ XK_Q, NoSymbol,
+- /* 0x11 */ XK_W, NoSymbol,
+- /* 0x12 */ XK_E, NoSymbol,
+- /* 0x13 */ XK_R, NoSymbol,
+- /* 0x14 */ XK_T, NoSymbol,
+- /* 0x15 */ XK_Y, NoSymbol,
+- /* 0x16 */ XK_U, NoSymbol,
+- /* 0x17 */ XK_I, NoSymbol,
+- /* 0x18 */ XK_O, NoSymbol,
+- /* 0x19 */ XK_P, NoSymbol,
+- /* 0x1a */ XK_bracketleft, XK_braceleft,
+- /* 0x1b */ XK_bracketright,XK_braceright,
+- /* 0x1c */ XK_Return, NoSymbol,
+- /* 0x1d */ XK_Control_L, NoSymbol,
+- /* 0x1e */ XK_A, NoSymbol,
+- /* 0x1f */ XK_S, NoSymbol,
+- /* 0x20 */ XK_D, NoSymbol,
+- /* 0x21 */ XK_F, NoSymbol,
+- /* 0x22 */ XK_G, NoSymbol,
+- /* 0x23 */ XK_H, NoSymbol,
+- /* 0x24 */ XK_J, NoSymbol,
+- /* 0x25 */ XK_K, NoSymbol,
+- /* 0x26 */ XK_L, NoSymbol,
+- /* 0x27 */ XK_semicolon, XK_colon,
+- /* 0x28 */ XK_quoteright, XK_quotedbl,
+- /* 0x29 */ XK_quoteleft, XK_asciitilde,
+- /* 0x2a */ XK_Shift_L, NoSymbol,
+- /* 0x2b */ XK_backslash, XK_bar,
+- /* 0x2c */ XK_Z, NoSymbol,
+- /* 0x2d */ XK_X, NoSymbol,
+- /* 0x2e */ XK_C, NoSymbol,
+- /* 0x2f */ XK_V, NoSymbol,
+- /* 0x30 */ XK_B, NoSymbol,
+- /* 0x31 */ XK_N, NoSymbol,
+- /* 0x32 */ XK_M, NoSymbol,
+- /* 0x33 */ XK_comma, XK_less,
+- /* 0x34 */ XK_period, XK_greater,
+- /* 0x35 */ XK_slash, XK_question,
+- /* 0x36 */ XK_Shift_R, NoSymbol,
+- /* 0x37 */ XK_KP_Multiply, NoSymbol,
+- /* 0x38 */ XK_Alt_L, XK_Meta_L,
+- /* 0x39 */ XK_space, NoSymbol,
+- /* 0x3a */ XK_Caps_Lock, NoSymbol,
+- /* 0x3b */ XK_F1, NoSymbol,
+- /* 0x3c */ XK_F2, NoSymbol,
+- /* 0x3d */ XK_F3, NoSymbol,
+- /* 0x3e */ XK_F4, NoSymbol,
+- /* 0x3f */ XK_F5, NoSymbol,
+- /* 0x40 */ XK_F6, NoSymbol,
+- /* 0x41 */ XK_F7, NoSymbol,
+- /* 0x42 */ XK_F8, NoSymbol,
+- /* 0x43 */ XK_F9, NoSymbol,
+- /* 0x44 */ XK_F10, NoSymbol,
+- /* 0x45 */ XK_Num_Lock, NoSymbol,
+- /* 0x46 */ XK_Scroll_Lock, NoSymbol,
+- /* These KP keys should have the KP_7 keysyms in the numlock
+- * modifer... ? */
+- /* 0x47 */ XK_KP_Home, XK_KP_7,
+- /* 0x48 */ XK_KP_Up, XK_KP_8,
+- /* 0x49 */ XK_KP_Prior, XK_KP_9,
+- /* 0x4a */ XK_KP_Subtract, NoSymbol,
+- /* 0x4b */ XK_KP_Left, XK_KP_4,
+- /* 0x4c */ XK_KP_Begin, XK_KP_5,
+- /* 0x4d */ XK_KP_Right, XK_KP_6,
+- /* 0x4e */ XK_KP_Add, NoSymbol,
+- /* 0x4f */ XK_KP_End, XK_KP_1,
+- /* 0x50 */ XK_KP_Down, XK_KP_2,
+- /* 0x51 */ XK_KP_Next, XK_KP_3,
+- /* 0x52 */ XK_KP_Insert, XK_KP_0,
+- /* 0x53 */ XK_KP_Delete, XK_KP_Decimal,
+- /* 0x54 */ NoSymbol, NoSymbol,
+- /* 0x55 */ XK_F13, NoSymbol,
+- /* 0x56 */ XK_less, XK_greater,
+- /* 0x57 */ XK_F11, NoSymbol,
+- /* 0x58 */ XK_F12, NoSymbol,
+- /* 0x59 */ XK_F14, NoSymbol,
+- /* 0x5a */ XK_F15, NoSymbol,
+- /* 0x5b */ XK_F16, NoSymbol,
+- /* 0x5c */ XK_F17, NoSymbol,
+- /* 0x5d */ XK_F18, NoSymbol,
+- /* 0x5e */ XK_F19, NoSymbol,
+- /* 0x5f */ XK_F20, NoSymbol,
+- /* 0x60 */ XK_KP_Enter, NoSymbol,
+- /* 0x61 */ XK_Control_R, NoSymbol,
+- /* 0x62 */ XK_KP_Divide, NoSymbol,
+- /* 0x63 */ XK_Print, XK_Sys_Req,
+- /* 0x64 */ XK_Alt_R, XK_Meta_R,
+- /* 0x65 */ NoSymbol, NoSymbol, /* KEY_LINEFEED */
+- /* 0x66 */ XK_Home, NoSymbol,
+- /* 0x67 */ XK_Up, NoSymbol,
+- /* 0x68 */ XK_Prior, NoSymbol,
+- /* 0x69 */ XK_Left, NoSymbol,
+- /* 0x6a */ XK_Right, NoSymbol,
+- /* 0x6b */ XK_End, NoSymbol,
+- /* 0x6c */ XK_Down, NoSymbol,
+- /* 0x6d */ XK_Next, NoSymbol,
+- /* 0x6e */ XK_Insert, NoSymbol,
+- /* 0x6f */ XK_Delete, NoSymbol,
+- /* 0x70 */ NoSymbol, NoSymbol, /* KEY_MACRO */
+- /* 0x71 */ NoSymbol, NoSymbol,
+- /* 0x72 */ NoSymbol, NoSymbol,
+- /* 0x73 */ NoSymbol, NoSymbol,
+- /* 0x74 */ NoSymbol, NoSymbol,
+- /* 0x75 */ XK_KP_Equal, NoSymbol,
+- /* 0x76 */ NoSymbol, NoSymbol,
+- /* 0x77 */ NoSymbol, NoSymbol,
+- /* 0x78 */ XK_F21, NoSymbol,
+- /* 0x79 */ XK_F22, NoSymbol,
+- /* 0x7a */ XK_F23, NoSymbol,
+- /* 0x7b */ XK_F24, NoSymbol,
+- /* 0x7c */ XK_KP_Separator, NoSymbol,
+- /* 0x7d */ XK_Meta_L, NoSymbol,
+- /* 0x7e */ XK_Meta_R, NoSymbol,
+- /* 0x7f */ XK_Multi_key, NoSymbol,
+- /* 0x80 */ NoSymbol, NoSymbol,
+- /* 0x81 */ NoSymbol, NoSymbol,
+- /* 0x82 */ NoSymbol, NoSymbol,
+- /* 0x83 */ NoSymbol, NoSymbol,
+- /* 0x84 */ NoSymbol, NoSymbol,
+- /* 0x85 */ NoSymbol, NoSymbol,
+- /* 0x86 */ NoSymbol, NoSymbol,
+- /* 0x87 */ NoSymbol, NoSymbol,
+- /* 0x88 */ NoSymbol, NoSymbol,
+- /* 0x89 */ NoSymbol, NoSymbol,
+- /* 0x8a */ NoSymbol, NoSymbol,
+- /* 0x8b */ NoSymbol, NoSymbol,
+- /* 0x8c */ NoSymbol, NoSymbol,
+- /* 0x8d */ NoSymbol, NoSymbol,
+- /* 0x8e */ NoSymbol, NoSymbol,
+- /* 0x8f */ NoSymbol, NoSymbol,
+- /* 0x90 */ NoSymbol, NoSymbol,
+- /* 0x91 */ NoSymbol, NoSymbol,
+- /* 0x92 */ NoSymbol, NoSymbol,
+- /* 0x93 */ NoSymbol, NoSymbol,
+- /* 0x94 */ NoSymbol, NoSymbol,
+- /* 0x95 */ NoSymbol, NoSymbol,
+- /* 0x96 */ NoSymbol, NoSymbol,
+- /* 0x97 */ NoSymbol, NoSymbol,
+- /* 0x98 */ NoSymbol, NoSymbol,
+- /* 0x99 */ NoSymbol, NoSymbol,
+- /* 0x9a */ NoSymbol, NoSymbol,
+- /* 0x9b */ NoSymbol, NoSymbol,
+- /* 0x9c */ NoSymbol, NoSymbol,
+- /* 0x9d */ NoSymbol, NoSymbol,
+- /* 0x9e */ NoSymbol, NoSymbol,
+- /* 0x9f */ NoSymbol, NoSymbol,
+- /* 0xa0 */ NoSymbol, NoSymbol,
+- /* 0xa1 */ NoSymbol, NoSymbol,
+- /* 0xa2 */ NoSymbol, NoSymbol,
+- /* 0xa3 */ NoSymbol, NoSymbol,
+- /* 0xa4 */ NoSymbol, NoSymbol,
+- /* 0xa5 */ NoSymbol, NoSymbol,
+- /* 0xa6 */ NoSymbol, NoSymbol,
+- /* 0xa7 */ NoSymbol, NoSymbol,
+- /* 0xa8 */ NoSymbol, NoSymbol,
+- /* 0xa9 */ NoSymbol, NoSymbol,
+- /* 0xaa */ NoSymbol, NoSymbol,
+- /* 0xab */ NoSymbol, NoSymbol,
+- /* 0xac */ NoSymbol, NoSymbol,
+- /* 0xad */ NoSymbol, NoSymbol,
+- /* 0xae */ NoSymbol, NoSymbol,
+- /* 0xaf */ NoSymbol, NoSymbol,
+- /* 0xb0 */ NoSymbol, NoSymbol,
+- /* 0xb1 */ NoSymbol, NoSymbol,
+- /* 0xb2 */ NoSymbol, NoSymbol,
+- /* 0xb3 */ NoSymbol, NoSymbol,
+- /* 0xb4 */ NoSymbol, NoSymbol,
+- /* 0xb5 */ NoSymbol, NoSymbol,
+- /* 0xb6 */ NoSymbol, NoSymbol,
+- /* 0xb7 */ NoSymbol, NoSymbol,
+- /* 0xb8 */ NoSymbol, NoSymbol,
Reply to: