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

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: