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

xserver-xorg-input-evdev: Changes to 'upstream-experimental'



 .cvsignore       |   19 
 .gitignore       |   24 
 ChangeLog        |   47 +
 Makefile.am      |   11 
 configure.ac     |    5 
 man/.cvsignore   |    2 
 man/.gitignore   |    3 
 man/evdev.man    |  291 -----------
 src/.cvsignore   |    6 
 src/.gitignore   |    6 
 src/Makefile.am  |    3 
 src/evdev.c      | 1339 ++++++++++++++++++++++++++++++++++++++-----------------
 src/evdev.h      |  272 -----------
 src/evdev_axes.c |  930 --------------------------------------
 src/evdev_btn.c  |  477 -------------------
 src/evdev_key.c  |  549 ----------------------
 16 files changed, 1033 insertions(+), 2951 deletions(-)

New commits:
commit d45f315845e19a720af25dc5f6c8a4c654c6e225
Author: Adam Jackson <ajax@redhat.com>
Date:   Wed May 21 15:05:10 2008 -0400

    evdev 1.99.2

diff --git a/configure.ac b/configure.ac
index 7c8b681..b2da490 100644
--- a/configure.ac
+++ b/configure.ac
@@ -22,7 +22,7 @@
 
 AC_PREREQ(2.57)
 AC_INIT([xf86-input-evdev],
-        1.99.1,
+        1.99.2,
         [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
         xf86-input-evdev)
 

commit a4a7003f7c82ddf05d3aa88fa40698058648dbf6
Author: Dan A. Dickey <dan.dickey@savvis.net>
Date:   Tue May 20 10:57:06 2008 +0930

    Fix a trivial bug in testing for absolute axes.
    
    Signed-off-by: Peter Hutterer <peter@cs.unisa.edu.au>

diff --git a/src/evdev.c b/src/evdev.c
index 3e4a48c..e212c14 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -936,7 +936,7 @@ EvdevProbe(InputInfoPtr pInfo)
 	has_axes = TRUE;
     }
       
-    if (TestBit(ABS_X, abs_bitmask) && TestBit(REL_Y, abs_bitmask)) {
+    if (TestBit(ABS_X, abs_bitmask) && TestBit(ABS_Y, abs_bitmask)) {
         xf86Msg(X_INFO, "%s: Found x and y absolute axes\n", pInfo->name);
 	pEvdev->flags |= EVDEV_ABSOLUTE_EVENTS;
 	if (TestBit(BTN_TOUCH, key_bitmask)) {

commit 3e0dc9945d795cfd51ffe176100fa9416b6d3c4d
Author: Peter Hutterer <peter@cs.unisa.edu.au>
Date:   Mon May 19 08:36:20 2008 +0930

    Shut up two compiler warnings.

diff --git a/src/evdev.c b/src/evdev.c
index 68e6cc2..3e4a48c 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -34,6 +34,7 @@
 #include <X11/extensions/XIproto.h>
 
 #include <linux/input.h>
+#include <unistd.h>
 
 #include <misc.h>
 #include <xf86.h>
@@ -172,7 +173,6 @@ EvdevReadInput(InputInfoPtr pInfo)
     int len, value;
     int dx, dy;
     unsigned int abs;
-    Bool do_touchpad_motion = FALSE;
     EvdevPtr pEvdev = pInfo->private;
 
     dx = 0;

commit ff6251a2bd347eef7b3cd80825e84d983eeecfd3
Author: Peter Hutterer <peter@cs.unisa.edu.au>
Date:   Mon May 19 08:24:55 2008 +0930

    Remove unused EvdevOpts and EvdevOptions.
    
    In the mouse driver, these options are only used if XFree86LOADER is
    undefined. configure.ac in the xserver forces said define to 1 if we're
    building the xfree86 DDX, so I don't see the point of having them around.
    Especially since they weren't used in evdev anyway.

diff --git a/src/evdev.c b/src/evdev.c
index 9b1ea4f..68e6cc2 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -110,25 +110,6 @@ typedef struct {
 #endif
 } EvdevRec, *EvdevPtr;
 
-typedef enum {
-    OPTION_XKB_DISABLE,
-    OPTION_XKB_RULES,
-    OPTION_XKB_MODEL,
-    OPTION_XKB_LAYOUT,
-    OPTION_XKB_VARIANT,
-    OPTION_XKB_OPTIONS
-} EvdevOpts;
-
-static const OptionInfoRec EvdevOptions[] = {
-    { OPTION_XKB_DISABLE,   "XkbDisable",   OPTV_BOOLEAN, {0}, FALSE },
-    { OPTION_XKB_RULES,     "XkbRules",     OPTV_STRING,  {0}, FALSE },
-    { OPTION_XKB_MODEL,     "XkbModel",     OPTV_STRING,  {0}, FALSE },
-    { OPTION_XKB_LAYOUT,    "XkbLayout",    OPTV_STRING,  {0}, FALSE },
-    { OPTION_XKB_VARIANT,   "XkbVariant",   OPTV_STRING,  {0}, FALSE },
-    { OPTION_XKB_OPTIONS,   "XkbOptions",   OPTV_STRING,  {0}, FALSE },
-    { -1,                   NULL,           OPTV_NONE,    {0}, FALSE }
-};
-
 static const char *evdevDefaults[] = {
     "XkbRules",     "base",
     "XkbModel",     "evdev",

commit e9222a828582e560f9c3a29f0d3d9e1e46d973bd
Author: Peter Hutterer <peter@cs.unisa.edu.au>
Date:   Sun May 18 11:04:43 2008 +0930

    man: Option "Path" is supported in the code, add it to man page.

diff --git a/man/evdev.man b/man/evdev.man
index 2ad5552..dbe94f4 100644
--- a/man/evdev.man
+++ b/man/evdev.man
@@ -9,6 +9,7 @@ evdev \- Generic Linux input driver
 .BI "  Identifier \*q" devname \*q
 .B  "  Driver \*qevdev\*q"
 .BI "  Option \*qDevice\*q   \*q" devpath \*q
+.BI "  Option \*qPath\*q     \*q" path \*q
 \ \ ...
 .B EndSection
 .fi
@@ -45,7 +46,14 @@ are supported:
 Specifies the device through which the device can be accessed.  This will 
 generally be of the form \*q/dev/input/eventX\*q, where X is some integer.
 The mapping from device node to hardware is system-dependent.  This option is
-mandatory, and there is no default setting.
+mandatory unless \*qPath\*q is given, and there is no default setting.
+.TP 7
+.BI "Option \*qPath\*q \*q" string \*q
+Specifies the device through which the device can be accessed.  This will
+generally be of the form \*q/dev/input/by-path/xyz\*q, where xyz includes the
+name of the device. The mapping from device node to hardware is
+system-dependent. This option has precedence over the \*qDevice\*q option but
+one of \*qPath\*q or \*qDevice\*q must be given.
 .SH AUTHORS
 Kristian Høgsberg.
 .SH "SEE ALSO"

commit 8b7738457feef13e1fab88bb30c94093dd8bfcc5
Author: Peter Hutterer <peter@cs.unisa.edu.au>
Date:   Wed Apr 30 18:10:08 2008 +0930

    Don't allow relative and absolute axes on the same device.
    
    This is a bit of a mess. The MS Optical Desktop 2000 registers both relative
    and absolute axes on the same device (the mouse). The absolute axes have a
    valid min/max range for x/y and thus overwrite the x/y relative axes in the
    server (no, this is not a server bug). And I wouldn't be surprised if other
    devices have similar issues.
    
    Since the device only sends relative events after that, the mouse is
    essentially restricted to the min..max range of 0..255. The server simply
    doesn't do unrestricted relative axis and restricted absolute axis on the same
    device (not for the same axis numbers anyway).

diff --git a/src/evdev.c b/src/evdev.c
index f2ecdd2..9b1ea4f 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -832,10 +832,19 @@ EvdevInit(DeviceIntPtr device)
 	EvdevAddKeyClass(device);
     if (pEvdev->flags & EVDEV_BUTTON_EVENTS)
 	EvdevAddButtonClass(device);
+    /* We don't allow relative and absolute axes on the same device. Reason
+       Reason being that some devices (MS Optical Desktop 2000) register both
+       rel and abs axes for x/y.
+       The abs axes register min/max, this min/max then also applies to the
+       relative device (the mouse) and caps it at 0..255 for both axis.
+       So unless you have a small screen, you won't be enjoying it much.
+
+        FIXME: somebody volunteer to fix this.
+     */
     if (pEvdev->flags & EVDEV_RELATIVE_EVENTS)
 	EvdevAddRelClass(device);
-    if (pEvdev->flags & EVDEV_ABSOLUTE_EVENTS)
-	EvdevAddAbsClass(device);
+    else if (pEvdev->flags & EVDEV_ABSOLUTE_EVENTS)
+        EvdevAddAbsClass(device);
 
     return Success;
 }

commit 1b9deb8e7e50a905f94a371ab0aa39e09a703052
Author: Sascha Hlusiak <saschahlusiak@arcor.de>
Date:   Tue Apr 1 17:24:13 2008 +0200

    Add XK_Meta_L and XK_Meta_R to list of modifiers
    
    Stopps meta/super key from autorepeating

diff --git a/src/evdev.c b/src/evdev.c
index 054e87e..f2ecdd2 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -644,6 +644,8 @@ EvdevAddKeyClass(DeviceIntPtr device)
         { XK_Caps_Lock,		LockMask },
         { XK_Alt_L,		AltMask },
         { XK_Alt_R,		AltMask },
+	{ XK_Meta_L,		Mod4Mask },
+	{ XK_Meta_R,		Mod4Mask },
         { XK_Num_Lock,		NumLockMask },
         { XK_Scroll_Lock,	ScrollLockMask },
         { XK_Mode_switch,	AltLangMask }

commit 0ec391f51cef4550daef041110ed93699089bea3
Author: Daniel Stone <daniel@fooishbar.org>
Date:   Fri Mar 28 17:45:05 2008 +0200

    Keyboard: Don't allow arbitrary keymap settings
    
    Pretty much dead code anyway.

diff --git a/src/evdev.c b/src/evdev.c
index c1f7bba..054e87e 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -701,9 +701,6 @@ EvdevAddKeyClass(DeviceIntPtr device)
 	if (!pEvdev->xkb_options)
 	    SetXkbOption(pInfo, "XkbOptions", &pEvdev->xkb_options);
 
-        if (pEvdev->xkbnames.keymap)
-            pEvdev->xkb_rules = NULL;
-
         XkbSetRulesDflts(pEvdev->xkb_rules, pEvdev->xkb_model,
                          pEvdev->xkb_layout, pEvdev->xkb_variant,
                          pEvdev->xkb_options);

commit f77410e1f97d394e98c854fd174f712666b0544c
Author: Adam Jackson <ajax@redhat.com>
Date:   Fri Mar 14 11:15:01 2008 -0400

    Map REL_DIAL to REL_HWHEEL.
    
    Some Microsoft mice have this wrong.  And it seems like a sensible thing
    to do anyway.

diff --git a/src/evdev.c b/src/evdev.c
index f719647..c1f7bba 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -228,6 +228,7 @@ EvdevReadInput(InputInfoPtr pInfo)
                     PostButtonClicks(pInfo, wheel_down_button, -value);
                 break;
 
+	    case REL_DIAL:
             case REL_HWHEEL:
                 if (value > 0)
                     PostButtonClicks(pInfo, wheel_right_button, value);

commit d28c2e1efba9fd3e79d9dfecf23cdbded30b93f5
Author: Adam Jackson <ajax@redhat.com>
Date:   Wed Mar 12 13:54:10 2008 -0400

    Filter out repeat events for mouse buttons.
    
    Not many mice do this, but some do, Apple Mighty Mouse in particular, and
    it makes click-and-drag pretty much impossible to use.
    
    Arguably we should filter _all_ repeat events from the kernel and handle
    synthesizing them in the server.

diff --git a/src/evdev.c b/src/evdev.c
index 36fc231..f719647 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -251,6 +251,11 @@ EvdevReadInput(InputInfoPtr pInfo)
 	    break;
 
         case EV_KEY:
+	    /* don't repeat mouse buttons */
+	    if (ev.code >= BTN_MOUSE && ev.code < KEY_OK)
+		if (value == 2)
+		    break;
+
             switch (ev.code) {
 	    /* swap here, pretend we're an X-conformant device. */
             case BTN_LEFT:

commit 697e850a6387cf1e0a0a35ca8c694804a6c2427f
Author: Adam Jackson <ajax@redhat.com>
Date:   Tue Mar 11 19:07:58 2008 -0400

    Fix middle/right button munging.
    
    Don't do this in the button map.  That's writeable by clients, which means
    they have the chance to get it wrong.  Just swap right and middle around
    in event dispatch before you get to the user's map.

diff --git a/src/evdev.c b/src/evdev.c
index 89ff6a5..36fc231 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -252,11 +252,15 @@ EvdevReadInput(InputInfoPtr pInfo)
 
         case EV_KEY:
             switch (ev.code) {
+	    /* swap here, pretend we're an X-conformant device. */
             case BTN_LEFT:
+                xf86PostButtonEvent(pInfo->dev, 0, 1, value, 0, 0);
+                break;
             case BTN_RIGHT:
+                xf86PostButtonEvent(pInfo->dev, 0, 3, value, 0, 0);
+                break;
             case BTN_MIDDLE:
-                xf86PostButtonEvent(pInfo->dev, 0, ev.code - BTN_LEFT + 1,
-                                    value, 0, 0);
+                xf86PostButtonEvent(pInfo->dev, 0, 2, value, 0, 0);
                 break;
 
             case BTN_SIDE:
@@ -799,15 +803,9 @@ EvdevAddButtonClass(DeviceIntPtr device)
     pInfo = device->public.devicePrivate;
 
     /* FIXME: count number of actual buttons */
-
     for (i = 0; i < ArrayLength(map); i++)
         map[i] = i;
 
-    /* Linux reports BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, which should map
-     * to buttons 1, 2 and 3, so swap 2 and 3 in the map */
-    map[2] = 3;
-    map[3] = 2;
-
     if (!InitButtonClassDeviceStruct(device, ArrayLength(map), map))
         return !Success;
 

commit 87037b9953ebd47e9dbd99b3653050517aa490ff
Author: Adam Jackson <ajax@redhat.com>
Date:   Mon Mar 10 17:16:38 2008 -0400

    Force xkb_model to be "evdev".
    
    Or at least, refuse to recognise the config option.  It's nonsensical to
    use a model of something other than evdev, and it'll just break if you try.

diff --git a/src/evdev.c b/src/evdev.c
index e53e449..89ff6a5 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -678,9 +678,9 @@ EvdevAddKeyClass(DeviceIntPtr device)
         SetXkbOption(pInfo, "xkb_rules", &pEvdev->xkb_rules);
 	if (!pEvdev->xkb_rules)
 	    SetXkbOption(pInfo, "XkbRules", &pEvdev->xkb_rules);
+	/* sorry, no model change allowed for you */
+	xf86ReplaceStrOption(pInfo->options, "xkb_model", "evdev");
         SetXkbOption(pInfo, "xkb_model", &pEvdev->xkb_model);
-	if (!pEvdev->xkb_model)
-	    SetXkbOption(pInfo, "XkbModel", &pEvdev->xkb_model);
         SetXkbOption(pInfo, "xkb_layout", &pEvdev->xkb_layout);
 	if (!pEvdev->xkb_layout)
 	    SetXkbOption(pInfo, "XkbLayout", &pEvdev->xkb_layout);

commit 71f4eaec7713643a7e2d07e27b9afeabd6f1ce02
Author: Dan Nicholson <dbn.lists@gmail.com>
Date:   Sun Mar 9 14:46:56 2008 -0700

    Fix cut-and-paste errors in xkb alternate spellings code
    
    Fixes 2b334d6b69d7dde5d553c638e134ebdf974749f3.

diff --git a/src/evdev.c b/src/evdev.c
index 9f5d160..e53e449 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -679,17 +679,17 @@ EvdevAddKeyClass(DeviceIntPtr device)
 	if (!pEvdev->xkb_rules)
 	    SetXkbOption(pInfo, "XkbRules", &pEvdev->xkb_rules);
         SetXkbOption(pInfo, "xkb_model", &pEvdev->xkb_model);
-	if (!pEvdev->xkb_rules)
-	    SetXkbOption(pInfo, "XkbModel", &pEvdev->xkb_rules);
+	if (!pEvdev->xkb_model)
+	    SetXkbOption(pInfo, "XkbModel", &pEvdev->xkb_model);
         SetXkbOption(pInfo, "xkb_layout", &pEvdev->xkb_layout);
-	if (!pEvdev->xkb_rules)
-	    SetXkbOption(pInfo, "XkbLayout", &pEvdev->xkb_rules);
+	if (!pEvdev->xkb_layout)
+	    SetXkbOption(pInfo, "XkbLayout", &pEvdev->xkb_layout);
         SetXkbOption(pInfo, "xkb_variant", &pEvdev->xkb_variant);
-	if (!pEvdev->xkb_rules)
-	    SetXkbOption(pInfo, "XkbVariant", &pEvdev->xkb_rules);
+	if (!pEvdev->xkb_variant)
+	    SetXkbOption(pInfo, "XkbVariant", &pEvdev->xkb_variant);
         SetXkbOption(pInfo, "xkb_options", &pEvdev->xkb_options);
-	if (!pEvdev->xkb_rules)
-	    SetXkbOption(pInfo, "XkbOptions", &pEvdev->xkb_rules);
+	if (!pEvdev->xkb_options)
+	    SetXkbOption(pInfo, "XkbOptions", &pEvdev->xkb_options);
 
         if (pEvdev->xkbnames.keymap)
             pEvdev->xkb_rules = NULL;

commit 72083976127a1ff15f79b0316570a947e6dd2b42
Author: Adam Jackson <ajax@redhat.com>
Date:   Sun Mar 9 16:15:14 2008 -0400

    Fix cut-and-paste error in abs-to-rel translation.

diff --git a/src/evdev.c b/src/evdev.c
index 39c274b..9f5d160 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -300,7 +300,7 @@ EvdevReadInput(InputInfoPtr pInfo)
 	if (pEvdev->tool) { /* meaning, touch is active */
 	    if (pEvdev->old_x != -1)
 		dx = pEvdev->abs_x - pEvdev->old_x;
-	    if (pEvdev->old_x != -1)
+	    if (pEvdev->old_y != -1)
 		dy = pEvdev->abs_y - pEvdev->old_y;
 	    pEvdev->old_x = pEvdev->abs_x;
 	    pEvdev->old_y = pEvdev->abs_y;

commit c250f843833b1aac3732ca97af5b1c0076996598
Author: Adam Jackson <ajax@redhat.com>
Date:   Sun Mar 9 15:54:27 2008 -0400

    Fix the default XKB rules to be "base" instead of "xfree86".

diff --git a/src/evdev.c b/src/evdev.c
index cba77e9..39c274b 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -130,7 +130,7 @@ static const OptionInfoRec EvdevOptions[] = {
 };
 
 static const char *evdevDefaults[] = {
-    "XkbRules",     "xfree86",
+    "XkbRules",     "base",
     "XkbModel",     "evdev",
     "XkbLayout",    "us",
     NULL

commit 2b334d6b69d7dde5d553c638e134ebdf974749f3
Author: Adam Jackson <ajax@redhat.com>
Date:   Sun Mar 9 15:53:40 2008 -0400

    Handle the alternate spellings of the xkb options.

diff --git a/src/evdev.c b/src/evdev.c
index 61c6dca..cba77e9 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -675,11 +675,21 @@ EvdevAddKeyClass(DeviceIntPtr device)
 #ifdef XKB
     else
     {
-        SetXkbOption(pInfo, "XkbRules", &pEvdev->xkb_rules);
-        SetXkbOption(pInfo, "XkbModel", &pEvdev->xkb_model);
-        SetXkbOption(pInfo, "XkbLayout", &pEvdev->xkb_layout);
-        SetXkbOption(pInfo, "XkbVariant", &pEvdev->xkb_variant);
-        SetXkbOption(pInfo, "XkbOptions", &pEvdev->xkb_options);
+        SetXkbOption(pInfo, "xkb_rules", &pEvdev->xkb_rules);
+	if (!pEvdev->xkb_rules)
+	    SetXkbOption(pInfo, "XkbRules", &pEvdev->xkb_rules);
+        SetXkbOption(pInfo, "xkb_model", &pEvdev->xkb_model);
+	if (!pEvdev->xkb_rules)
+	    SetXkbOption(pInfo, "XkbModel", &pEvdev->xkb_rules);
+        SetXkbOption(pInfo, "xkb_layout", &pEvdev->xkb_layout);
+	if (!pEvdev->xkb_rules)
+	    SetXkbOption(pInfo, "XkbLayout", &pEvdev->xkb_rules);
+        SetXkbOption(pInfo, "xkb_variant", &pEvdev->xkb_variant);
+	if (!pEvdev->xkb_rules)
+	    SetXkbOption(pInfo, "XkbVariant", &pEvdev->xkb_rules);
+        SetXkbOption(pInfo, "xkb_options", &pEvdev->xkb_options);
+	if (!pEvdev->xkb_rules)
+	    SetXkbOption(pInfo, "XkbOptions", &pEvdev->xkb_rules);
 
         if (pEvdev->xkbnames.keymap)
             pEvdev->xkb_rules = NULL;

commit 1a0bc8e64a9ba6e8647b5908673b57710518f6c2
Author: Adam Jackson <ajax@redhat.com>
Date:   Sat Mar 8 20:01:15 2008 -0500

    Force maximum keycode to be 255
    
    Even though we don't have keycodes for anything above 127, make sure our
    map always covers up to 255.  This ensures that the keycode range never
    changes.
    
    Spiritually cherry-picked from a9e87f29ccdadebb0742317bb57d66eaaca4b593
    and 6db4a9fb84f828f745202c3fddc58d389fca220b.

diff --git a/src/evdev.c b/src/evdev.c
index b671f1c..61c6dca 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -453,8 +453,7 @@ static KeySym map[] = {
     /* 0x6d */  XK_Next,	NoSymbol,
     /* 0x6e */  XK_Insert,	NoSymbol,
     /* 0x6f */  XK_Delete,	NoSymbol,
-    /* 0x6f */  NoSymbol,	NoSymbol, /* KEY_MACRO */
-    /* 0x70 */  NoSymbol,	NoSymbol,
+    /* 0x70 */  NoSymbol,	NoSymbol, /* KEY_MACRO */
     /* 0x71 */  NoSymbol,	NoSymbol,
     /* 0x72 */  NoSymbol,	NoSymbol,
     /* 0x73 */  NoSymbol,	NoSymbol,
@@ -470,6 +469,126 @@ static KeySym map[] = {
     /* 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,
+    /* 0xb9 */  NoSymbol,	NoSymbol,
+    /* 0xba */  NoSymbol,	NoSymbol,
+    /* 0xbb */  NoSymbol,	NoSymbol,
+    /* 0xbc */  NoSymbol,	NoSymbol,
+    /* 0xbd */  NoSymbol,	NoSymbol,
+    /* 0xbe */  NoSymbol,	NoSymbol,
+    /* 0xbf */  NoSymbol,	NoSymbol,
+    /* 0xc0 */  NoSymbol,	NoSymbol,
+    /* 0xc1 */  NoSymbol,	NoSymbol,
+    /* 0xc2 */  NoSymbol,	NoSymbol,
+    /* 0xc3 */  NoSymbol,	NoSymbol,
+    /* 0xc4 */  NoSymbol,	NoSymbol,
+    /* 0xc5 */  NoSymbol,	NoSymbol,
+    /* 0xc6 */  NoSymbol,	NoSymbol,
+    /* 0xc7 */  NoSymbol,	NoSymbol,
+    /* 0xc8 */  NoSymbol,	NoSymbol,
+    /* 0xc9 */  NoSymbol,	NoSymbol,
+    /* 0xca */  NoSymbol,	NoSymbol,
+    /* 0xcb */  NoSymbol,	NoSymbol,
+    /* 0xcc */  NoSymbol,	NoSymbol,
+    /* 0xcd */  NoSymbol,	NoSymbol,
+    /* 0xce */  NoSymbol,	NoSymbol,
+    /* 0xcf */  NoSymbol,	NoSymbol,
+    /* 0xd0 */  NoSymbol,	NoSymbol,
+    /* 0xd1 */  NoSymbol,	NoSymbol,
+    /* 0xd2 */  NoSymbol,	NoSymbol,
+    /* 0xd3 */  NoSymbol,	NoSymbol,
+    /* 0xd4 */  NoSymbol,	NoSymbol,
+    /* 0xd5 */  NoSymbol,	NoSymbol,
+    /* 0xd6 */  NoSymbol,	NoSymbol,
+    /* 0xd7 */  NoSymbol,	NoSymbol,
+    /* 0xd8 */  NoSymbol,	NoSymbol,
+    /* 0xd9 */  NoSymbol,	NoSymbol,
+    /* 0xda */  NoSymbol,	NoSymbol,
+    /* 0xdb */  NoSymbol,	NoSymbol,
+    /* 0xdc */  NoSymbol,	NoSymbol,
+    /* 0xdd */  NoSymbol,	NoSymbol,
+    /* 0xde */  NoSymbol,	NoSymbol,
+    /* 0xdf */  NoSymbol,	NoSymbol,
+    /* 0xe0 */  NoSymbol,	NoSymbol,
+    /* 0xe1 */  NoSymbol,	NoSymbol,
+    /* 0xe2 */  NoSymbol,	NoSymbol,
+    /* 0xe3 */  NoSymbol,	NoSymbol,
+    /* 0xe4 */  NoSymbol,	NoSymbol,
+    /* 0xe5 */  NoSymbol,	NoSymbol,
+    /* 0xe6 */  NoSymbol,	NoSymbol,
+    /* 0xe7 */  NoSymbol,	NoSymbol,
+    /* 0xe8 */  NoSymbol,	NoSymbol,
+    /* 0xe9 */  NoSymbol,	NoSymbol,
+    /* 0xea */  NoSymbol,	NoSymbol,
+    /* 0xeb */  NoSymbol,	NoSymbol,
+    /* 0xec */  NoSymbol,	NoSymbol,
+    /* 0xed */  NoSymbol,	NoSymbol,
+    /* 0xee */  NoSymbol,	NoSymbol,
+    /* 0xef */  NoSymbol,	NoSymbol,
+    /* 0xf0 */  NoSymbol,	NoSymbol,
+    /* 0xf1 */  NoSymbol,	NoSymbol,
+    /* 0xf2 */  NoSymbol,	NoSymbol,
+    /* 0xf3 */  NoSymbol,	NoSymbol,
+    /* 0xf4 */  NoSymbol,	NoSymbol,
+    /* 0xf5 */  NoSymbol,	NoSymbol,
+    /* 0xf6 */  NoSymbol,	NoSymbol,
+    /* 0xf7 */  NoSymbol,	NoSymbol,
 };
 
 static void

commit 6271494faa4c45f4fa10509f72e0515f2cef36c6
Author: Adam Jackson <ajax@redhat.com>
Date:   Sat Mar 8 19:54:44 2008 -0500

    Add absolute coordinate event support.
    
    There are two major classes here, touchscreens and touchpads.  Touchpads
    are logically more like relative devices, in that your initial touch
    should not warp the cursor.  So attempt to detect touchpads (via the
    existence of BTN_TOUCH) and translate absolute events from those devices
    to relative motion.

diff --git a/src/evdev.c b/src/evdev.c
index 6dd6c8d..b671f1c 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -69,6 +69,13 @@
 
 #define ArrayLength(a) (sizeof(a) / (sizeof((a)[0])))
 
+/* evdev flags */
+#define EVDEV_KEYBOARD_EVENTS	(1 << 0)
+#define EVDEV_BUTTON_EVENTS	(1 << 1)
+#define EVDEV_RELATIVE_EVENTS	(1 << 2)
+#define EVDEV_ABSOLUTE_EVENTS	(1 << 3)
+#define EVDEV_TOUCHPAD		(1 << 4)
+
 #define MIN_KEYCODE 8
 #define GLYPHS_PER_KEY 2
 #define AltMask		Mod1Mask
@@ -85,9 +92,14 @@
 
 typedef struct {
     int kernel24;
-    int     noXkb;
+    int screen;
+    int min_x, min_y, max_x, max_y;
+    int abs_x, abs_y, old_x, old_y;
+    int flags;
+    int tool;
 
     /* XKB stuff has to be per-device rather than per-driver */
+    int noXkb;
 #ifdef XKB
     char                    *xkb_rules;
     char                    *xkb_model;
@@ -178,9 +190,13 @@ EvdevReadInput(InputInfoPtr pInfo)
     struct input_event ev;
     int len, value;
     int dx, dy;
+    unsigned int abs;
+    Bool do_touchpad_motion = FALSE;
+    EvdevPtr pEvdev = pInfo->private;
 
     dx = 0;
     dy = 0;
+    abs = 0;
 
     while (xf86WaitForInput (pInfo->fd, 0) > 0) {
         len = read(pInfo->fd, &ev, sizeof ev);
@@ -195,7 +211,7 @@ EvdevReadInput(InputInfoPtr pInfo)
         value = ev.value;
 
         switch (ev.type) {
-        case EV_REL:
+	case EV_REL:
             switch (ev.code) {
             case REL_X:
                 dx += value;
@@ -221,8 +237,18 @@ EvdevReadInput(InputInfoPtr pInfo)
             }
             break;
 
-        case EV_ABS:
-            break;
+	case EV_ABS:
+	    switch (ev.code) {
+	    case ABS_X:
+		pEvdev->abs_x = value;
+		abs = 1;
+		break;
+	    case ABS_Y:
+		pEvdev->abs_y = value;
+		abs = 1;
+		break;
+	    }
+	    break;
 
         case EV_KEY:
             switch (ev.code) {
@@ -242,11 +268,24 @@ EvdevReadInput(InputInfoPtr pInfo)
                                     value, 0, 0);
                 break;
 
+	    case BTN_TOUCH:
+ 	    case BTN_TOOL_PEN:
+ 	    case BTN_TOOL_RUBBER:
+ 	    case BTN_TOOL_BRUSH:
+ 	    case BTN_TOOL_PENCIL:
+ 	    case BTN_TOOL_AIRBRUSH:
+ 	    case BTN_TOOL_FINGER:
+ 	    case BTN_TOOL_MOUSE:
+ 	    case BTN_TOOL_LENS:
+		pEvdev->tool = value ? ev.code : 0;
+		break;
+
             default:
 		if (ev.code > BTN_TASK && ev.code < KEY_OK)
 		    break;
 
                 PostKbdEvent(pInfo, &ev, value);
+		break;
             }
             break;
 
@@ -255,8 +294,37 @@ EvdevReadInput(InputInfoPtr pInfo)
         }
     }
 
+    /* convert to relative motion for touchpads */
+    if (pEvdev->flags & EVDEV_TOUCHPAD) {
+	abs = 0;
+	if (pEvdev->tool) { /* meaning, touch is active */
+	    if (pEvdev->old_x != -1)
+		dx = pEvdev->abs_x - pEvdev->old_x;
+	    if (pEvdev->old_x != -1)
+		dy = pEvdev->abs_y - pEvdev->old_y;
+	    pEvdev->old_x = pEvdev->abs_x;
+	    pEvdev->old_y = pEvdev->abs_y;
+	} else {
+	    pEvdev->old_x = pEvdev->old_y = -1;
+	}
+    }
+
     if (dx != 0 || dy != 0)
-        xf86PostMotionEvent(pInfo->dev, 0, 0, 2, dx, dy);
+        xf86PostMotionEvent(pInfo->dev, FALSE, 0, 2, dx, dy);
+
+    /*
+     * Some devices only generate valid abs coords when BTN_DIGI is
+     * pressed.  On wacom tablets, this means that the pen is in
+     * proximity of the tablet.  After the pen is removed, BTN_DIGI is
+     * released, and a (0, 0) absolute event is generated.  Checking
+     * pEvdev->digi here, lets us ignore that event.  pEvdev is
+     * initialized to 1 so devices that doesn't use this scheme still
+     * just works.
+     */
+    if (abs && pEvdev->tool) {
+	xf86PostMotionEvent(pInfo->dev, TRUE, 0, 2,
+			    pEvdev->abs_x, pEvdev->abs_y);
+    }
 }
 
 #define TestBit(bit, array) (array[(bit) / 8] & (1 << ((bit) % 8)))
@@ -513,6 +581,56 @@ EvdevAddKeyClass(DeviceIntPtr device)
 }
 
 static int
+EvdevAddAbsClass(DeviceIntPtr device)
+{
+    InputInfoPtr pInfo;
+    EvdevPtr pEvdev;
+    struct input_absinfo absinfo_x, absinfo_y;
+
+    pInfo = device->public.devicePrivate;
+    pEvdev = pInfo->private;
+
+    if (ioctl(pInfo->fd,
+	      EVIOCGABS(ABS_X), &absinfo_x) < 0) {
+	xf86Msg(X_ERROR, "ioctl EVIOCGABS failed: %s\n", strerror(errno));
+	return !Success;
+    }
+
+    if (ioctl(pInfo->fd,
+	      EVIOCGABS(ABS_Y), &absinfo_y) < 0) {
+	xf86Msg(X_ERROR, "ioctl EVIOCGABS failed: %s\n", strerror(errno));
+	return !Success;
+    }
+
+    pEvdev->min_x = absinfo_x.minimum;
+    pEvdev->max_x = absinfo_x.maximum;
+    pEvdev->min_y = absinfo_y.minimum;
+    pEvdev->max_y = absinfo_y.maximum;
+
+    if (!InitValuatorClassDeviceStruct(device, 2, GetMotionHistory,
+                                       GetMotionHistorySize(), Absolute))
+        return !Success;
+
+    /* X valuator */
+    xf86InitValuatorAxisStruct(device, 0, pEvdev->min_x, pEvdev->max_x,
+			       10000, 0, 10000);
+    xf86InitValuatorDefaults(device, 0);
+
+    /* Y valuator */
+    xf86InitValuatorAxisStruct(device, 1, pEvdev->min_y, pEvdev->max_y,
+			       10000, 0, 10000);
+    xf86InitValuatorDefaults(device, 1);
+    xf86MotionHistoryAllocate(pInfo);
+
+    if (!InitPtrFeedbackClassDeviceStruct(device, EvdevPtrCtrlProc))
+        return !Success;
+
+    pInfo->flags |= XI86_POINTER_CAPABLE;
+
+    return Success;
+}
+
+static int
 EvdevAddRelClass(DeviceIntPtr device)
 {
     InputInfoPtr pInfo;
@@ -520,7 +638,7 @@ EvdevAddRelClass(DeviceIntPtr device)
     pInfo = device->public.devicePrivate;
 
     if (!InitValuatorClassDeviceStruct(device, 2, GetMotionHistory,
-                                       GetMotionHistorySize(), 0))
+                                       GetMotionHistorySize(), Relative))
         return !Success;
 
     /* X valuator */
@@ -535,6 +653,8 @@ EvdevAddRelClass(DeviceIntPtr device)
     if (!InitPtrFeedbackClassDeviceStruct(device, EvdevPtrCtrlProc))
         return !Success;
 
+    pInfo->flags |= XI86_POINTER_CAPABLE;
+
     xf86MotionHistoryAllocate(pInfo);
 
     return Success;
@@ -562,8 +682,6 @@ EvdevAddButtonClass(DeviceIntPtr device)
     if (!InitButtonClassDeviceStruct(device, ArrayLength(map), map))
         return !Success;
 
-    pInfo->flags |= XI86_POINTER_CAPABLE | XI86_SEND_DRAG_EVENTS;
-
     return Success;
 }
 
@@ -571,20 +689,21 @@ static int
 EvdevInit(DeviceIntPtr device)
 {
     InputInfoPtr pInfo;
+    EvdevPtr pEvdev;
 
     pInfo = device->public.devicePrivate;
+    pEvdev = pInfo->private;
 
-    /* FIXME: This doesn't add buttons for keyboards with
-     * scrollwheels. */
+    /* FIXME: This doesn't add buttons for keyboards with scrollwheels. */
 
-    if (pInfo->flags & XI86_KEYBOARD_CAPABLE) {
+    if (pEvdev->flags & EVDEV_KEYBOARD_EVENTS)
 	EvdevAddKeyClass(device);
-    }
-
-    if (pInfo->flags & XI86_POINTER_CAPABLE) {
+    if (pEvdev->flags & EVDEV_BUTTON_EVENTS)
 	EvdevAddButtonClass(device);
+    if (pEvdev->flags & EVDEV_RELATIVE_EVENTS)
 	EvdevAddRelClass(device);
-    }
+    if (pEvdev->flags & EVDEV_ABSOLUTE_EVENTS)
+	EvdevAddAbsClass(device);
 
     return Success;
 }
@@ -631,13 +750,24 @@ static Bool
 EvdevConvert(InputInfoPtr pInfo, int first, int num, int v0, int v1, int v2,
 	     int v3, int v4, int v5, int *x, int *y)
 {
-    if (first == 0 && num == 2) {
-        *x = v0;
-        *y = v1;
-        return TRUE;
+    EvdevPtr pEvdev = pInfo->private;
+    int screenWidth = screenInfo.screens[pEvdev->screen]->width;
+    int screenHeight = screenInfo.screens[pEvdev->screen]->height;
+
+    if (first != 0 || num != 2)
+	return FALSE;
+
+    /* on absolute touchpads, don't warp on initial touch */
+    if (pEvdev->flags & EVDEV_TOUCHPAD) {
+	*x = v0;
+	*y = v0;
+	return TRUE;
     }
-    else
-        return FALSE;
+
+    *x = (v0 - pEvdev->min_x) * screenWidth / (pEvdev->max_x - pEvdev->min_x);
+    *y = (v1 - pEvdev->min_y) * screenHeight / (pEvdev->max_y - pEvdev->min_y);
+
+    return TRUE;
 }
 
 static int
@@ -645,6 +775,7 @@ EvdevProbe(InputInfoPtr pInfo)
 {
     char key_bitmask[(KEY_MAX + 7) / 8];
     char rel_bitmask[(REL_MAX + 7) / 8];
+    char abs_bitmask[(ABS_MAX + 7) / 8];
     int i, has_axes, has_buttons, has_keys;
     EvdevPtr pEvdev = pInfo->private;
 
@@ -662,6 +793,12 @@ EvdevProbe(InputInfoPtr pInfo)
     }
 
     if (ioctl(pInfo->fd,
+              EVIOCGBIT(EV_ABS, sizeof(abs_bitmask)), abs_bitmask) < 0) {
+        xf86Msg(X_ERROR, "ioctl EVIOCGBIT failed: %s\n", strerror(errno));
+        return 1;
+    }
+
+    if (ioctl(pInfo->fd,
               EVIOCGBIT(EV_KEY, sizeof(key_bitmask)), key_bitmask) < 0) {
         xf86Msg(X_ERROR, "ioctl EVIOCGBIT failed: %s\n", strerror(errno));
         return 1;
@@ -673,12 +810,24 @@ EvdevProbe(InputInfoPtr pInfo)
 
     if (TestBit(REL_X, rel_bitmask) && TestBit(REL_Y, rel_bitmask)) {
         xf86Msg(X_INFO, "%s: Found x and y relative axes\n", pInfo->name);
+	pEvdev->flags |= EVDEV_RELATIVE_EVENTS;
 	has_axes = TRUE;
     }
       
+    if (TestBit(ABS_X, abs_bitmask) && TestBit(REL_Y, abs_bitmask)) {
+        xf86Msg(X_INFO, "%s: Found x and y absolute axes\n", pInfo->name);
+	pEvdev->flags |= EVDEV_ABSOLUTE_EVENTS;
+	if (TestBit(BTN_TOUCH, key_bitmask)) {
+	    xf86Msg(X_INFO, "%s: Found absolute touchpad\n", pInfo->name);
+	    pEvdev->flags |= EVDEV_TOUCHPAD;
+	    pEvdev->old_x = pEvdev->old_y = -1;
+	}
+	has_axes = TRUE;
+    }
 
     if (TestBit(BTN_LEFT, key_bitmask)) {
         xf86Msg(X_INFO, "%s: Found mouse buttons\n", pInfo->name);
+	pEvdev->flags |= EVDEV_BUTTON_EVENTS;
 	has_buttons = TRUE;
     }
 
@@ -688,6 +837,7 @@ EvdevProbe(InputInfoPtr pInfo)
 
     if (i < BTN_MISC) {
         xf86Msg(X_INFO, "%s: Found keys\n", pInfo->name);


Reply to: