From 946beb16f8002e8f52af082d424aac74e6fd34a9 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Fri, 7 Mar 2008 19:09:35 -0500 Subject: Unlibcwrap. --- src/evdev.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) (limited to 'src/evdev.c') diff --git a/src/evdev.c b/src/evdev.c index aa1eb5d..1ce21e1 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1,5 +1,5 @@ /* - * Copyright © 2004 Red Hat, Inc. + * Copyright © 2004-2008 Red Hat, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without @@ -12,9 +12,9 @@ * for any purpose. It is provided "as is" without express or implied * warranty. * - * RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN - * NO EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN @@ -31,24 +31,21 @@ #include #include -/* The libc wrapper just blows... linux/input.h must be included - * before xf86_ansic.h and xf86_libc.h so we avoid defining ioctl - * twice. */ - #include #include #include #include #include -#include -#include #include #include #include #include +#include +#include + /* 2.4 compatibility */ #ifndef EVIOCGRAB #define EVIOCGRAB _IOW('E', 0x90, int) -- cgit v1.2.3 From 40a1e1439c120d791a2f106293f4a712c452fcc5 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Sun, 9 Jul 2006 18:08:50 +0100 Subject: remove XFree86LOADER usage Build evdevModuleData, et al, unconditionally. --- src/evdev.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'src/evdev.c') diff --git a/src/evdev.c b/src/evdev.c index 1ce21e1..9b59421 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -708,8 +708,6 @@ _X_EXPORT InputDriverRec EVDEV = { 0 }; -#ifdef XFree86LOADER - static void EvdevUnplug(pointer p) { @@ -745,4 +743,3 @@ _X_EXPORT XF86ModuleData evdevModuleData = EvdevPlug, EvdevUnplug }; -#endif /* XFree86LOADER */ -- cgit v1.2.3 From bb36ca65c64d1d863f8fa4e6f058a384fbc80eb0 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Fri, 7 Mar 2008 19:43:07 -0500 Subject: Support the new DIX motion history API Spiritually cherry-picked from 036b457c1b3f7d2d174da890cb8598d907181f8e --- src/evdev.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/evdev.c') diff --git a/src/evdev.c b/src/evdev.c index 9b59421..e21cea3 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -439,9 +439,8 @@ EvdevAddRelClass(DeviceIntPtr device) pInfo = device->public.devicePrivate; - if (!InitValuatorClassDeviceStruct(device, 2, - miPointerGetMotionEvents, - miPointerGetMotionBufferSize(), 0)) + if (!InitValuatorClassDeviceStruct(device, 2, GetMotionHistory, + GetMotionHistorySize(), 0)) return !Success; /* X valuator */ @@ -456,6 +455,8 @@ EvdevAddRelClass(DeviceIntPtr device) if (!InitPtrFeedbackClassDeviceStruct(device, EvdevPtrCtrlProc)) return !Success; + xf86MotionHistoryAllocate(pInfo); + return Success; } @@ -654,7 +655,6 @@ EvdevPreInit(InputDriverPtr drv, IDevPtr dev, int flags) pInfo->type_name = "UNKNOWN"; pInfo->device_control = EvdevProc; pInfo->read_input = EvdevReadInput; - pInfo->motion_history_proc = xf86GetMotionEvents; pInfo->history_size = 0; pInfo->control_proc = NULL; pInfo->close_proc = NULL; -- cgit v1.2.3 From ad5bdcb50f511b1cd3bd0118d2b1f4fe58c4ab72 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Fri, 7 Mar 2008 20:29:58 -0500 Subject: Ignore button events above BTN_TASK for now. --- src/evdev.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/evdev.c') diff --git a/src/evdev.c b/src/evdev.c index e21cea3..2a53ded 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -183,6 +183,9 @@ EvdevReadInput(InputInfoPtr pInfo) break; default: + if (ev.code > BTN_TASK && ev.code < KEY_OK) + break; + PostKbdEvent(pInfo, &ev, value); } break; -- cgit v1.2.3 From f1445feac77af65098eef1c2d86ae067d81fc6cb Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Sat, 8 Mar 2008 16:09:47 -0500 Subject: Parse Option "Path" as well as Option "Device". The hotplug core passes Path not Device. With this change, hotplugging works. --- src/evdev.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/evdev.c') diff --git a/src/evdev.c b/src/evdev.c index 2a53ded..f641468 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -676,7 +676,9 @@ EvdevPreInit(InputDriverPtr drv, IDevPtr dev, int flags) xf86CollectInputOptions(pInfo, NULL, NULL); xf86ProcessCommonOptions(pInfo, pInfo->options); - device = xf86CheckStrOption(dev->commonOptions, "Device", NULL); + device = xf86CheckStrOption(dev->commonOptions, "Path", NULL); + if (!device) + device = xf86CheckStrOption(dev->commonOptions, "Device", NULL); if (!device) { xf86Msg(X_ERROR, "%s: No device specified.\n", pInfo->name); xfree(pEvdev); -- cgit v1.2.3 From bf0848ec8e1ab45cb72fc8da0cc5dc47eefd0760 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Sat, 8 Mar 2008 16:37:42 -0500 Subject: Re-add XKB support. Almost entirely taken from a patch I did ages ago in bug #3912, with slight cleanups, and with the KcCGST options removed as per evdev 1.x. --- src/evdev.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 102 insertions(+), 11 deletions(-) (limited to 'src/evdev.c') diff --git a/src/evdev.c b/src/evdev.c index f641468..1771ee8 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -20,7 +20,9 @@ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * Author: Kristian Høgsberg (krh@redhat.com) + * Authors: + * Kristian Høgsberg (krh@redhat.com) + * Adam Jackson (ajax@redhat.com) */ #ifdef HAVE_CONFIG_H @@ -41,6 +43,11 @@ #include #include +#if defined(XKB) +/* XXX VERY WRONG. this is a client side header. */ +#include +#endif + #include #include @@ -78,8 +85,61 @@ typedef struct { int kernel24; + int noXkb; + + /* XKB stuff has to be per-device rather than per-driver */ +#ifdef XKB + char *xkb_rules; + char *xkb_model; + char *xkb_layout; + char *xkb_variant; + char *xkb_options; + XkbComponentNamesRec xkbnames; +#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", "xfree86", + "XkbModel", "evdev", + "XkbLayout", "us", + NULL +}; + +static void +SetXkbOption(InputInfoPtr pInfo, char *name, char **option) +{ + char *s; + + if ((s = xf86SetStrOption(pInfo->options, name, NULL))) { + if (!s[0]) { + xfree(s); + *option = NULL; + } else { + *option = s; + xf86Msg(X_CONFIG, "%s: %s: \"%s\"\n", pInfo->name, name, s); + } + } +} + static int wheel_up_button = 4; static int wheel_down_button = 5; static int wheel_left_button = 6; @@ -383,6 +443,7 @@ EvdevAddKeyClass(DeviceIntPtr device) CARD8 modMap[MAP_LENGTH]; KeySym sym; int i, j; + EvdevPtr pEvdev; static struct { KeySym keysym; CARD8 mask; } modifiers[] = { { XK_Shift_L, ShiftMask }, @@ -399,11 +460,11 @@ EvdevAddKeyClass(DeviceIntPtr device) /* TODO: * Ctrl-Alt-Backspace and other Ctrl-Alt-stuff should work - * XKB, let's try without the #ifdef nightmare * Get keyboard repeat under control (right now caps lock repeats!) */ pInfo = device->public.devicePrivate; + pEvdev = pInfo->private; /* Compute the modifier map */ memset(modMap, 0, sizeof modMap); @@ -421,14 +482,36 @@ EvdevAddKeyClass(DeviceIntPtr device) keySyms.minKeyCode = MIN_KEYCODE; keySyms.maxKeyCode = MIN_KEYCODE + ArrayLength(map) / GLYPHS_PER_KEY - 1; - if (!InitKeyClassDeviceStruct(device, &keySyms, modMap)) - return !Success; - - if (!InitFocusClassDeviceStruct(device)) - return !Success; - - if (!InitKbdFeedbackClassDeviceStruct(device, EvdevKbdBell, EvdevKbdCtrl)) - return !Success; +#ifdef XKB + if (pEvdev->noXkb) +#endif + { + xf86Msg(X_CONFIG, "XKB: disabled\n"); + if (!InitKeyboardDeviceStruct((DevicePtr)device, &keySyms, modMap, + EvdevKbdBell, EvdevKbdCtrl)) + return !Success; + } +#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); + + if (pEvdev->xkbnames.keymap) + pEvdev->xkb_rules = NULL; + + XkbSetRulesDflts(pEvdev->xkb_rules, pEvdev->xkb_model, + pEvdev->xkb_layout, pEvdev->xkb_variant, + pEvdev->xkb_options); + if (!XkbInitKeyboardDeviceStruct(device, &pEvdev->xkbnames, + &keySyms, modMap, EvdevKbdBell, + EvdevKbdCtrl)) + return !Success; + } +#endif pInfo->flags |= XI86_KEYBOARD_CAPABLE; @@ -673,7 +756,12 @@ EvdevPreInit(InputDriverPtr drv, IDevPtr dev, int flags) return pInfo; pInfo->private = pEvdev; - xf86CollectInputOptions(pInfo, NULL, NULL); + if (!(pEvdev = xcalloc(sizeof(EvdevRec), 1))) + return pInfo; + + pInfo->private = pEvdev; + + xf86CollectInputOptions(pInfo, evdevDefaults, NULL); xf86ProcessCommonOptions(pInfo, pInfo->options); device = xf86CheckStrOption(dev->commonOptions, "Path", NULL); @@ -697,6 +785,9 @@ EvdevPreInit(InputDriverPtr drv, IDevPtr dev, int flags) return pInfo; } + pEvdev->noXkb = noXkbExtension; + /* parse the XKB options during kbd setup */ + if (EvdevProbe(pInfo)) xfree(pEvdev); -- cgit v1.2.3 From f5bfc7ec3c132276ab7152b283f75387ee656ec2 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Sat, 8 Mar 2008 16:52:17 -0500 Subject: Nuke the keyboard bell code. It did nothing, and the core won't invoke it anymore anyway. --- src/evdev.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'src/evdev.c') diff --git a/src/evdev.c b/src/evdev.c index 1771ee8..6dd6c8d 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -404,12 +404,6 @@ static KeySym map[] = { /* 0x7f */ XK_Multi_key, NoSymbol, }; -static void -EvdevKbdBell(int percent, DeviceIntPtr dev, pointer ctrl, int unused) -{ - /* hat */ -} - static void EvdevKbdCtrl(DeviceIntPtr device, KeybdCtrl *ctrl) { @@ -488,7 +482,7 @@ EvdevAddKeyClass(DeviceIntPtr device) { xf86Msg(X_CONFIG, "XKB: disabled\n"); if (!InitKeyboardDeviceStruct((DevicePtr)device, &keySyms, modMap, - EvdevKbdBell, EvdevKbdCtrl)) + NULL, EvdevKbdCtrl)) return !Success; } #ifdef XKB @@ -507,7 +501,7 @@ EvdevAddKeyClass(DeviceIntPtr device) pEvdev->xkb_layout, pEvdev->xkb_variant, pEvdev->xkb_options); if (!XkbInitKeyboardDeviceStruct(device, &pEvdev->xkbnames, - &keySyms, modMap, EvdevKbdBell, + &keySyms, modMap, NULL, EvdevKbdCtrl)) return !Success; } -- cgit v1.2.3 From 6271494faa4c45f4fa10509f72e0515f2cef36c6 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Sat, 8 Mar 2008 19:54:44 -0500 Subject: 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. --- src/evdev.c | 213 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 186 insertions(+), 27 deletions(-) (limited to 'src/evdev.c') 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))) @@ -512,6 +580,56 @@ EvdevAddKeyClass(DeviceIntPtr device) return Success; } +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) { @@ -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; @@ -661,6 +792,12 @@ EvdevProbe(InputInfoPtr pInfo) return 1; } + 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)); @@ -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); + pEvdev->flags |= EVDEV_KEYBOARD_EVENTS; has_keys = TRUE; } @@ -758,13 +908,20 @@ EvdevPreInit(InputDriverPtr drv, IDevPtr dev, int flags) xf86CollectInputOptions(pInfo, evdevDefaults, NULL); xf86ProcessCommonOptions(pInfo, pInfo->options); + pEvdev->screen = xf86SetIntOption(pInfo->options, "ScreenNumber", 0); + /* + * We initialize pEvdev->tool to 1 so that device that doesn't use + * proximity will still report events. + */ + pEvdev->tool = 1; + device = xf86CheckStrOption(dev->commonOptions, "Path", NULL); if (!device) device = xf86CheckStrOption(dev->commonOptions, "Device", NULL); if (!device) { xf86Msg(X_ERROR, "%s: No device specified.\n", pInfo->name); - xfree(pEvdev); - return pInfo; + xf86DeleteInput(pInfo, 0); + return NULL; } xf86Msg(deviceFrom, "%s: Device: \"%s\"\n", pInfo->name, device); @@ -775,15 +932,17 @@ EvdevPreInit(InputDriverPtr drv, IDevPtr dev, int flags) if (pInfo->fd < 0) { xf86Msg(X_ERROR, "Unable to open evdev device \"%s\".\n", device); - xfree(pEvdev); - return pInfo; + xf86DeleteInput(pInfo, 0); + return NULL; } pEvdev->noXkb = noXkbExtension; /* parse the XKB options during kbd setup */ - if (EvdevProbe(pInfo)) - xfree(pEvdev); + if (EvdevProbe(pInfo)) { + xf86DeleteInput(pInfo, 0); + return NULL; + } return pInfo; } -- cgit v1.2.3 From 1a0bc8e64a9ba6e8647b5908673b57710518f6c2 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Sat, 8 Mar 2008 20:01:15 -0500 Subject: 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. --- src/evdev.c | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 121 insertions(+), 2 deletions(-) (limited to 'src/evdev.c') 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 -- cgit v1.2.3