summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSascha Hlusiak <saschahlusiak@arcor.de>2007-10-03 21:37:25 +0200
committerSascha Hlusiak <saschahlusiak@arcor.de>2007-10-03 21:37:25 +0200
commita62abe36b8b0af91539cf7e7dfa90795a73434bb (patch)
tree9691589223b803a18fbd6dcc9b1881c685f1a84d
parent65009ab568500fac9980239a752d346a0d9b5ff1 (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.am1
-rw-r--r--src/jstk.c23
-rw-r--r--src/jstk.h3
-rw-r--r--src/jstk_axis.c32
-rw-r--r--src/jstk_key.c134
-rw-r--r--src/jstk_key.h31
-rw-r--r--src/jstk_options.c70
-rw-r--r--src/jstk_options.h3
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
diff --git a/src/jstk.c b/src/jstk.c
index a11500c..70cfcae 100644
--- a/src/jstk.c
+++ b/src/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);
diff --git a/src/jstk.h b/src/jstk.h
index d17f5af..e74115d 100644
--- a/src/jstk.h
+++ b/src/jstk.h
@@ -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);