.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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> Date: Tue May 20 10:57:06 2008 +0930 Fix a trivial bug in testing for absolute axes. Signed-off-by: Peter Hutterer <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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); -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]