diff options
author | Sascha Hlusiak <saschahlusiak@arcor.de> | 2007-10-03 21:37:25 +0200 |
---|---|---|
committer | Sascha Hlusiak <saschahlusiak@arcor.de> | 2007-10-03 21:37:25 +0200 |
commit | a62abe36b8b0af91539cf7e7dfa90795a73434bb (patch) | |
tree | 9691589223b803a18fbd6dcc9b1881c685f1a84d | |
parent | 65009ab568500fac9980239a752d346a0d9b5ff1 (diff) |
Readded own keymap for Joystick keys. This changes meaning of key, keylow and
keyhigh values in xorg.conf from scancodes to keysyms!
New xorg-server 1.4 fixes a lot of keyboard things. This makes it necessary to
provide an own mapping rather than using the mapping of the current keyboard. A
keymap is built dynamically from the options provided. The options now need to
provide a keysym for each button instead of the scancodes of another keyboard
attached keyboard.
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/jstk.c | 23 | ||||
-rw-r--r-- | src/jstk.h | 3 | ||||
-rw-r--r-- | src/jstk_axis.c | 32 | ||||
-rw-r--r-- | src/jstk_key.c | 134 | ||||
-rw-r--r-- | src/jstk_key.h | 31 | ||||
-rw-r--r-- | src/jstk_options.c | 70 | ||||
-rw-r--r-- | src/jstk_options.h | 3 |
8 files changed, 246 insertions, 51 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 2987e21..147c537 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -30,6 +30,7 @@ @DRIVER_NAME@_drv_la_SOURCES = jstk.c jstk.h jstk_hw.h \ jstk_axis.c jstk_axis.h \ + jstk_key.c jstk_key.h \ jstk_options.c jstk_options.h BSD_SRCS = bsd_jstk.c @@ -41,6 +41,7 @@ #include "jstk.h" #include "jstk_hw.h" #include "jstk_axis.h" +#include "jstk_key.h" #include "jstk_options.h" @@ -294,6 +295,7 @@ jstkDeviceControlProc(DeviceIntPtr pJstk, return !Success; } } + jstkInitKeys(pJstk, priv); m = 2; for (i=0; i<MAXAXES; i++) @@ -322,7 +324,6 @@ jstkDeviceControlProc(DeviceIntPtr pJstk, 1, /* resolution */ 0, /* min_res */ 1); /* max_res */ - for (i=0; i<MAXAXES; i++) if (priv->axis[i].type != TYPE_NONE) { @@ -419,7 +420,7 @@ jstkCorePreInit(InputDriverPtr drv, IDevPtr dev, int flags) local->fd = -1; local->dev = NULL; local->private = priv; - local->type_name = "JOYSTICK"; + local->type_name = XI_MOUSE; local->history_size = 0; local->always_core_feedback = 0; local->conf_idev = dev; @@ -433,7 +434,8 @@ jstkCorePreInit(InputDriverPtr drv, IDevPtr dev, int flags) priv->keys_enabled = TRUE; priv->amplify = 1.0f; priv->buttonmap.size = 0; - priv->keymap.size = 0; + priv->keymap.size = 1; + priv->keymap.map[0] = NoSymbol; /* Initialize default mappings */ for (i=0; i<MAXAXES; i++) { @@ -473,6 +475,17 @@ jstkCorePreInit(InputDriverPtr drv, IDevPtr dev, int flags) priv->axis[1].type = TYPE_BYVALUE; priv->axis[1].mapping = MAPPING_Y; + priv->axis[2].type = TYPE_BYVALUE; + priv->axis[2].mapping = MAPPING_ZX; + priv->axis[3].type = TYPE_BYVALUE; + priv->axis[3].mapping = MAPPING_ZY; + + /* Two axes by default */ + priv->axis[4].type = TYPE_ACCELERATED; + priv->axis[4].mapping = MAPPING_X; + priv->axis[5].type = TYPE_ACCELERATED; + priv->axis[5].mapping = MAPPING_Y; + priv->buttonmap.scrollbutton[0] = jstkGetButtonNumberInMap(priv, 4); priv->buttonmap.scrollbutton[1] = jstkGetButtonNumberInMap(priv, 5); priv->buttonmap.scrollbutton[2] = jstkGetButtonNumberInMap(priv, 6); @@ -525,7 +538,7 @@ jstkCorePreInit(InputDriverPtr drv, IDevPtr dev, int flags) sprintf(p,"MapAxis%d",i+1); s = xf86SetStrOption(dev->commonOptions, p, NULL); if (s != NULL) { - jstkParseAxisOption(s, &priv->axis[i], local->name); + jstkParseAxisOption(s, priv, &priv->axis[i], local->name); } DBG(1, xf86Msg(X_CONFIG, "Axis %d type is %d, mapped to %d, amplify=%.3f\n", i+1, @@ -535,7 +548,7 @@ jstkCorePreInit(InputDriverPtr drv, IDevPtr dev, int flags) } /* return the LocalDevice */ - local->flags |= XI86_CONFIGURED ; + local->flags |= XI86_CONFIGURED; return (local); @@ -28,6 +28,7 @@ #define MAXBUTTONS 32 #define MAXAXES 32 #define MAXKEYSPERBUTTON 4 +#define MIN_KEYCODE 8 /****************************************************************************** @@ -110,7 +111,7 @@ typedef struct _JoystickDevRec { } buttonmap; struct _KEYMAP { int size; - KeySym map[MAXBUTTONS+1]; + KeySym map[MAP_LENGTH]; } keymap; AXIS axis[MAXAXES]; /* Configuration per axis */ diff --git a/src/jstk_axis.c b/src/jstk_axis.c index dd2df0f..ae979f0 100644 --- a/src/jstk_axis.c +++ b/src/jstk_axis.c @@ -381,35 +381,3 @@ jstkHandleAbsoluteAxis(LocalDevicePtr device, int number) xf86PostMotionEvent(device->dev, 0, 0, 2, x, y); } } - - - - -/* - *************************************************************************** - * - * jstkGenerateKeys - * - * Generates a series of keydown or keyup events of the specified - * KEYSCANCODES - * - *************************************************************************** - */ -void -jstkGenerateKeys(DeviceIntPtr device, KEYSCANCODES keys, char pressed) -{ - int i; - unsigned int k; - - for (i=0;i<MAXKEYSPERBUTTON;i++) { - if (pressed != 0) - k = keys[i]; - else k = keys[MAXKEYSPERBUTTON - i - 1]; - - if (k != 0) { - DBG(2, ErrorF("Generating key %s event with keycode %d\n", - (pressed)?"press":"release", k)); - xf86PostKeyboardEvent(device, k, pressed); - } - } -} diff --git a/src/jstk_key.c b/src/jstk_key.c new file mode 100644 index 0000000..aa14438 --- /dev/null +++ b/src/jstk_key.c @@ -0,0 +1,134 @@ +/* + * Copyright 2007 by Sascha Hlusiak. <saschahlusiak@freedesktop.org> + * Copyright 1995-1999 by Frederic Lepied, France. <Lepied@XFree86.org> + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the names of copyright holders not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. The copyright holders make no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS 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 CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + + +#include <xf86.h> +#include <X11/extensions/XKB.h> +#include <X11/extensions/XKBstr.h> +#include <X11/extensions/XKBsrv.h> +#include <X11/keysym.h> +#include <X11/XF86keysym.h> +// #include <xf86Xinput.h> +#include "jstk.h" +#include "jstk_key.h" + +#define AltMask Mod1Mask +#define NumLockMask Mod2Mask +#define AltLangMask Mod3Mask +#define KanaMask Mod4Mask +#define ScrollLockMask Mod5Mask + +int +jstkInitKeys(DeviceIntPtr pJstk, JoystickDevPtr priv) +{ + KeySymsRec keySyms; + CARD8 modMap[MAP_LENGTH]; + KeySym sym; + int i, j; + static XkbComponentNamesRec xkbnames; + + static struct { KeySym keysym; CARD8 mask; } modifiers[] = { + { XK_Shift_L, ShiftMask }, + { XK_Shift_R, ShiftMask }, + { XK_Control_L, ControlMask }, + { XK_Control_R, ControlMask }, + { XK_Caps_Lock, LockMask }, + { XK_Alt_L, AltMask }, + { XK_Alt_R, AltMask }, + { XK_Num_Lock, NumLockMask }, + { XK_Scroll_Lock, ScrollLockMask }, + { XK_Mode_switch, AltLangMask } + }; + + DBG(1, xf86Msg(X_CONFIG, "Initializing Keyboard with %d keys\n", + priv->keymap.size)); + + memset(modMap, 0, sizeof modMap); + + for (i = 0; i < priv->keymap.size; i++) { + sym = priv->keymap.map[i]; + for (j = 0; j < sizeof(modifiers)/sizeof(modifiers[0]); j++) { + if (modifiers[j].keysym == sym) + modMap[i + MIN_KEYCODE] = modifiers[j].mask; + } + } + + keySyms.map = priv->keymap.map; + keySyms.mapWidth = 1; + keySyms.minKeyCode = MIN_KEYCODE; + keySyms.maxKeyCode = MIN_KEYCODE + priv->keymap.size - 1; + + for (i = 0; i < priv->keymap.size; i++) { + sym = priv->keymap.map[i]; + for (j = 0; j < sizeof(modifiers)/sizeof(modifiers[0]); j++) { + if (modifiers[j].keysym == sym) + modMap[i + MIN_KEYCODE] = modifiers[j].mask; + } + } + + XkbSetRulesDflts(__XKBDEFRULES__, "evdev", "us", "nodeadkeys", NULL); + XkbInitKeyboardDeviceStruct (pJstk, &xkbnames, &keySyms, modMap, + NULL, NULL); + + return Success; +} + + + +/* + *************************************************************************** + * + * jstkGenerateKeys + * + * Generates a series of keydown or keyup events of the specified + * KEYSCANCODES + * + *************************************************************************** + */ +void +jstkGenerateKeys(DeviceIntPtr device, KEYSCANCODES keys, char pressed) +{ + int i; + unsigned int k; + + for (i=0;i<MAXKEYSPERBUTTON;i++) { + if (pressed != 0) + k = keys[i]; + else k = keys[MAXKEYSPERBUTTON - i - 1]; + + if (k != 0) { + k = k + MIN_KEYCODE; + DBG(2, ErrorF("Generating key %s event with keycode %d\n", + (pressed)?"press":"release", k)); + xf86PostKeyboardEvent(device, k, pressed); + } + } +} + + diff --git a/src/jstk_key.h b/src/jstk_key.h new file mode 100644 index 0000000..bbc3b59 --- /dev/null +++ b/src/jstk_key.h @@ -0,0 +1,31 @@ +/* + * Copyright 2007 by Sascha Hlusiak. <saschahlusiak@freedesktop.org> + * Copyright 1995-1999 by Frederic Lepied, France. <Lepied@XFree86.org> + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the names of copyright holders not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. The copyright holders make no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS 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 CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + + +#ifndef __JSTK_KEY_H_INCLUDED__ +#define __JSTK_KEY_H_INCLUDED__ + +int jstkInitKeys(DeviceIntPtr pJstk, JoystickDevPtr priv); + + +#endif diff --git a/src/jstk_options.c b/src/jstk_options.c index 369c5d1..6a3cb01 100644 --- a/src/jstk_options.c +++ b/src/jstk_options.c @@ -31,6 +31,8 @@ #include <string.h> #include <ctype.h> #include <xf86.h> +#include <X11/keysym.h> +#include <X11/XF86keysym.h> #include "jstk.h" #include "jstk_options.h" @@ -39,7 +41,9 @@ /*********************************************************************** * - * jstkGetAxisMapping -- + * jstkGetButtonNumberInMap -- + * + * Adds a button number to the button map and returns the index * *********************************************************************** */ @@ -62,6 +66,30 @@ jstkGetButtonNumberInMap(JoystickDevPtr priv, /*********************************************************************** * + * jstkGetKeyNumberInMap -- + * + * Adds a KeySym to the keymap and returns the index + * + *********************************************************************** + */ + +int +jstkGetKeyNumberInMap(JoystickDevPtr priv, + KeySym keysym) +{ + int j; + for (j=0; j<=priv->keymap.size; j++) + if (priv->keymap.map[j] == keysym) + break; + if (j > MAP_LENGTH+1) return 0; + priv->keymap.map[j] = keysym; + if (j + 1 > priv->keymap.size) priv->keymap.size = j + 1; + return j; +} + + +/*********************************************************************** + * * jstkGetAxisMapping -- * * Parses strings like: @@ -145,13 +173,19 @@ jstkParseButtonOption(const char* org, p[30]='\0'; current = p; button->mapping = MAPPING_KEY; + for (value = 0; value < MAXKEYSPERBUTTON; value++) if (current != NULL) { + unsigned key; next = strchr(current, ','); if (next) *(next++) = '\0'; - button->keys[value] = atoi(current); - if (button->keys[value] == 0) + key = strtol(current, NULL, 0); + DBG(3, ErrorF("Parsed %s to %d\n", current, key)); + if (key == 0) xf86Msg(X_WARNING, "%s: error parsing key value: %s.\n", name, current); + else { + button->keys[value] = jstkGetKeyNumberInMap(priv, key); + } current = next; } else button->keys[value] = 0; } else if (strcmp(param, "disable-all") == 0) { @@ -180,7 +214,10 @@ jstkParseButtonOption(const char* org, */ void -jstkParseAxisOption(const char* org, AXIS *axis, const char *name) +jstkParseAxisOption(const char* org, + JoystickDevPtr priv, + AXIS *axis, + const char *name) { char *param; char *tmp; @@ -234,6 +271,7 @@ jstkParseAxisOption(const char* org, AXIS *axis, const char *name) if ((tmp = strstr(param, "keylow=")) != NULL) { if (sscanf(tmp, "keylow=%30s", p) == 1) { char *current, *next; + unsigned int key; p[30]='\0'; current = p; axis->mapping = MAPPING_KEY; @@ -241,11 +279,15 @@ jstkParseAxisOption(const char* org, AXIS *axis, const char *name) if (current != NULL) { next = strchr(current, ','); if (next) *(next++) = '\0'; - axis->keys_low[value] = atoi(current); - if (axis->keys_low[value] == 0) - xf86Msg(X_WARNING, - "%s: error parsing keylow value: %s.\n", + + key = strtol(current, NULL, 0); + DBG(3, ErrorF("Parsed %s to %d\n", current, key)); + if (key == 0) + xf86Msg(X_WARNING, "%s: error parsing keylow value: %s.\n", name, current); + else { + axis->keys_low[value] = jstkGetKeyNumberInMap(priv, key); + } current = next; } else axis->keys_low[value] = 0; } @@ -254,6 +296,7 @@ jstkParseAxisOption(const char* org, AXIS *axis, const char *name) if ((tmp = strstr(param, "keyhigh=")) != NULL) { if (sscanf(tmp, "keyhigh=%30s", p) == 1) { char *current, *next; + unsigned int key; p[30]='\0'; current = p; axis->mapping = MAPPING_KEY; @@ -261,11 +304,14 @@ jstkParseAxisOption(const char* org, AXIS *axis, const char *name) if (current != NULL) { next = strchr(current, ','); if (next) *(next++) = '\0'; - axis->keys_high[value] = atoi(current); - if (axis->keys_high[value] == 0) - xf86Msg(X_WARNING, - "%s: error parsing keyhigh value: %s.\n", + key = strtol(current, NULL, 0); + DBG(3, ErrorF("Parsed %s to %d\n", current, key)); + if (key == 0) + xf86Msg(X_WARNING, "%s: error parsing keyhigh value: %s.\n", name, current); + else { + axis->keys_high[value] = jstkGetKeyNumberInMap(priv, key); + } current = next; } else axis->keys_high[value] = 0; } diff --git a/src/jstk_options.h b/src/jstk_options.h index 237ac12..7bbbf5b 100644 --- a/src/jstk_options.h +++ b/src/jstk_options.h @@ -31,7 +31,8 @@ void jstkParseButtonOption(const char* org, JoystickDevPtr priv, int number, const char* name); -void jstkParseAxisOption(const char* org, +void jstkParseAxisOption(const char* org, + JoystickDevPtr priv, AXIS *axis, const char* name); |