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 <[email protected]> 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 <[email protected]> Mon, 21 Feb 2011 18:49:27 -0500 + -- Chase Douglas <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 = @[email protected] \ +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, -- To UNSUBSCRIBE, email to [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected] Archive: http://lists.debian.org/[email protected]

