Merge branch 'scancodes' of ssh://deepthought/home/sascha/develop/xorg/xf86-input-joystick into scancodes

This commit is contained in:
Sascha Hlusiak
2009-09-11 17:54:13 +02:00
13 changed files with 456 additions and 2959 deletions

View File

@@ -33,13 +33,13 @@
<!-- EXAMPLES
<merge key="input.x11_options.DebugLevel" type="string">5</merge>
<merge key="input.x11_options.AutoRepeat" type="string">500 4</merge>
<merge key="input.x11_options.MapButton4" type="string">key=Alt_L+Tab</merge>
<merge key="input.x11_options.MapButton4" type="string">key=64+23</merge>
<merge key="input.x11_options.MapButton8" type="string">amplify=0.3</merge>
<merge key="input.x11_options.MapButton9" type="string">disable-mouse</merge>
<merge key="input.x11_options.MapButton10" type="string">key=space</merge>
<merge key="input.x11_options.MapButton10" type="string">key=65</merge>
<merge key="input.x11_options.MapAxis1" type="string">mode=accelerated keylow=Left keyhigh=Right</merge>
<merge key="input.x11_options.MapAxis2" type="string">mode=accelerated keylow=Up keyhigh=Down</merge>
<merge key="input.x11_options.MapAxis1" type="string">mode=accelerated keylow=113 keyhigh=114</merge>
<merge key="input.x11_options.MapAxis2" type="string">mode=accelerated keylow=111 keyhigh=116</merge>
-->
</match>
</match>

View File

@@ -22,7 +22,7 @@
AC_PREREQ(2.57)
AC_INIT([xf86-input-joystick],
1.4.0,
1.4.99,
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
xf86-input-joystick)

View File

@@ -93,12 +93,12 @@ typedef enum _JSTK_MAPPING {
/* FLOAT[MAXAXES], movement amplify per axis */
#define JSTK_PROP_AXIS_AMPLIFY "Axis Amplify"
/** Set KeySyms for axis in low position */
/* TODO 16 bit */
/** Scancodes for axis in low position */
/* 8 bit, 4 per axis */
#define JSTK_PROP_AXIS_KEYS_LOW "Axis Keys (low)"
/** Set KeySyms for axis in high position */
/* TODO 16 bit */
/** Scancodes for axis in high position */
/* 8 bit, 4 per axis */
#define JSTK_PROP_AXIS_KEYS_HIGH "Axis keys (high)"
/** Set the mapping of each button to
@@ -115,8 +115,8 @@ typedef enum _JSTK_MAPPING {
/* FLOAT[MAXBUTTONS], amplify value per button */
#define JSTK_PROP_BUTTON_AMPLIFY "Button Amplify"
/** Set KeySyms for button */
/* TODO 16 bit, set keysyms for button. Format: (button keysym1 keysym2 keysym3 keysym4) */
/** Scancodes for button */
/* 8 bit, 4 per button */
#define JSTK_PROP_BUTTON_KEYS "Button Keys"

View File

@@ -93,10 +93,10 @@ Use positive and negative values to control the direction. Default: 1.0
Amplifies the movement of all axes by the given factor when pressed. Different
factors can be combined.
.TP 7
.BI "\*qkey="<keysym>[,<keysym>[,<keysym>[,<keysym>]]]
When button is pressed, a series of keydown events with the specified keysym is
.BI "\*qkey="<scancode>[,<scancode>[,<scancode>[,<scancode>]]]
When button is pressed, a series of keydown events with the specified scancode is
generated. When the button is released, keyup events in the opposite
order are generated. You can specify up to 4 keysyms per button.
order are generated. You can specify up to 4 scancodes per button.
See special section about key events below.
.TP 7
@@ -150,12 +150,12 @@ is an optional amplifier of the axis, like
.B -, +, -5, 0.4, 1.3, ...
Negative values will invert the movement. Default: 1.0
.TP 7
.BI "\*qkeylow= "<keysym>[,<keysym>[,<keysym>[,<keysym>]]]
.BI "\*qkeylow= "<scancode>[,<scancode>[,<scancode>[,<scancode>]]]
.TP 7
.BI "\*qkeyhigh="<keysym>[,<keysym>[,<keysym>[,<keysym>]]]
.BI "\*qkeyhigh="<scancode>[,<scancode>[,<scancode>[,<scancode>]]]
When the axis is moved out of the deadzone, a series of keydown events according
to the direction of the movement is generated. When the axis is released, keyup
events will be generated. You can specify up to 4 keysyms for each direction.
events will be generated. You can specify up to 4 scancodes for each direction.
.B keylow
defines the keys to be generated when the axis is moved in negative direction (ie. left or up),
@@ -270,45 +270,41 @@ total range of 200 pixels, 100 to the top and 100 to the bottom:
.fi
.SH "GENERATING KEY EVENTS"
Providing a \*qkey=<keysym>[,<keysym>[...]]\*q option will generate X Events with the specified keysyms
Providing a \*qkey=<scancode>[,<scancode>[...]]\*q option will generate X Events with the specified scancodes
when the joystick button is pressed or the axis changed it's position. When the button/axis is released, the keys are released in the reverse order.
The keysym parameter can be defined as a numerical value, which can be looked up in the file
.IR /usr/include/X11/keysymdef.h ,
or as the symbolic identifier (case sensitive, without the leading XK_).
To lookup keycodes for KeySyms, you can use
.BR "xmodmap -pk" .
You can use unused keycodes and map them to a KeySym of your choice using xmodmap(1).
You can specify up to 4 keysyms per joystick button/axis, which is useful to use modificators. Make sure you use the modificators
You can specify up to 4 scancodes per joystick button/axis, which is useful to use modificators. Make sure you use modificators
that are necessary to get a certain keysym.
Examples:
.nf
.BI " Option \*qMapButton1\*q \*q" "key=0xffe9,0xff09" \*q
.BI " Option \*qMapButton1\*q \*q" "key=Alt_L,Tab" \*q
.BI " Option \*qMapButton1\*q \*q" "key=64,23" \*q
.fi
will generate
.I "Alt_L+Tab"
when the button is pressed.
.nf
.BI " Option \*qMapButton1\*q \*q" "key=0xffe1,0x0064" \*q
.BI " Option \*qMapButton1\*q \*q" "key=Shift_L,d" \*q
.BI " Option \*qMapButton1\*q \*q" "key=50,40" \*q
.fi
will generate an uppercase
will generate a Shift_L+d which will be an uppercase
.IR d .
.nf
.BI " Option \*qMapButton1\*q \*q" "key=0x0020" \*q
.BI " Option \*qMapButton1\*q \*q" "key=32" \*q
.BI " Option \*qMapButton1\*q \*q" "key=space" \*q
.BI " Option \*qMapButton1\*q \*q" "key=65" \*q
.fi
is for the
.IR "space " key.
.nf
.BI " Option \*qMapAxis1\*q \*q" "mode=relative keylow=Left keyhigh=Right axis=0.5key" \*q
.BI " Option \*qMapAxis2\*q \*q" "mode=relative keylow=Up keyhigh=Down" \*q
.BI " Option \*qMapAxis3\*q \*q" "mode=accelerated keylow=Left keyhigh=Right" \*q
.BI " Option \*qMapAxis4\*q \*q" "mode=accelerated keylow=Up keyhigh=Down" \*q
.BI " Option \*qMapAxis1\*q \*q" "mode=relative keylow=113 keyhigh=114 axis=0.5key" \*q
.BI " Option \*qMapAxis2\*q \*q" "mode=relative keylow=111 keyhigh=116" \*q
.BI " Option \*qMapAxis3\*q \*q" "mode=accelerated keylow=113 keyhigh=114" \*q
.BI " Option \*qMapAxis4\*q \*q" "mode=accelerated keylow=111 keyhigh=116" \*q
.fi
will map the first and third axis to the arrow keys
.IR left " and " right
@@ -345,6 +341,6 @@ Example:
.SH "SEE ALSO"
__xservername__(__appmansuffix__), __xconfigfile__(__filemansuffix__), Xserver(__appmansuffix__), X(__miscmansuffix__), xmodmap(1)
.SH AUTHORS
Sascha Hlusiak (2007-2008),
Sascha Hlusiak (2007-2009),
.fi
Frederic Lepied (1995-1999)

View File

@@ -36,8 +36,7 @@ INCLUDES=-I$(top_srcdir)/include/
jstk_axis.c jstk_axis.h \
jstk_key.c jstk_key.h \
jstk_options.c jstk_options.h \
jstk_properties.c jstk_properties.h \
StrKeysym.c StrKeysym.h ks_tables.h
jstk_properties.c jstk_properties.h
BSD_SRCS = backend_bsd.c backend_bsd.h
LINUX_SRCS = backend_joystick.c backend_joystick.h

View File

@@ -1,82 +0,0 @@
/* $Xorg: StrKeysym.c,v 1.5 2001/02/09 02:03:37 xorgcvs Exp $ */
/*
Copyright 1985, 1987, 1990, 1998 The Open Group
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.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of The Open Group shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from The Open Group.
*/
/* $XFree86: xc/lib/X11/StrKeysym.c,v 3.7 2003/04/13 19:22:18 dawes Exp $ */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <xf86.h>
#include <X11/keysymdef.h>
#define NEEDKTABLE
#include "ks_tables.h"
#include "StrKeysym.h"
KeySym
XStringToKeysym(_Xconst char *s)
{
register int i, n;
int h;
register unsigned long sig = 0;
register const char *p = s;
register int c;
register int idx;
const unsigned char *entry;
unsigned char sig1, sig2;
KeySym val;
while ((c = *p++))
sig = (sig << 1) + c;
i = sig % KTABLESIZE;
h = i + 1;
sig1 = (sig >> 8) & 0xff;
sig2 = sig & 0xff;
n = KMAXHASH;
while ((idx = hashString[i]))
{
entry = &_XkeyTable[idx];
if ((entry[0] == sig1) && (entry[1] == sig2) &&
!strcmp(s, (char *)entry + 6))
{
val = (entry[2] << 24) | (entry[3] << 16) |
(entry[4] << 8) | entry[5];
if (!val)
val = XK_VoidSymbol;
return val;
}
if (!--n)
break;
i += h;
if (i >= KTABLESIZE)
i -= KTABLESIZE;
}
return NoSymbol;
}

View File

@@ -1,28 +0,0 @@
/*
* Copyright 2007-2008 by Sascha Hlusiak. <saschahlusiak@freedesktop.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 _STRKEYSYM_H_INCLUDED_
#define _STRKEYSYM_H_INCLUDED_
KeySym XStringToKeysym(_Xconst char *s);
#endif

View File

@@ -555,8 +555,6 @@ jstkCorePreInit(InputDriverPtr drv, IDevPtr dev, int flags)
priv->keys_enabled = TRUE;
priv->amplify = 1.0f;
priv->keyboard_device = NULL;
priv->keymap.size = 1;
memset(priv->keymap.map, NoSymbol, sizeof(priv->keymap.map));
priv->repeat_delay = 0;
priv->repeat_interval = 0;
priv->num_axes = MAXAXES;
@@ -660,6 +658,26 @@ jstkCorePreInit(InputDriverPtr drv, IDevPtr dev, int flags)
}
xfree(s);
}
priv->rmlvo.rules = xf86SetStrOption(dev->commonOptions, "xkb_rules", NULL);
if (!priv->rmlvo.rules)
priv->rmlvo.rules = xf86SetStrOption(dev->commonOptions, "XkbRules", "evdev");
priv->rmlvo.model = xf86SetStrOption(dev->commonOptions, "xkb_model", NULL);
if (!priv->rmlvo.model)
priv->rmlvo.model = xf86SetStrOption(dev->commonOptions, "XkbModel", "evdev");
priv->rmlvo.layout = xf86SetStrOption(dev->commonOptions, "xkb_layout", NULL);
if (!priv->rmlvo.layout)
priv->rmlvo.layout = xf86SetStrOption(dev->commonOptions, "XkbLayout", "uk");
priv->rmlvo.variant = xf86SetStrOption(dev->commonOptions, "xkb_variant", NULL);
if (!priv->rmlvo.variant)
priv->rmlvo.variant = xf86SetStrOption(dev->commonOptions, "XkbVariant", NULL);
priv->rmlvo.options = xf86SetStrOption(dev->commonOptions, "xkb_options", NULL);
if (!priv->rmlvo.options)
priv->rmlvo.options = xf86SetStrOption(dev->commonOptions, "XkbOptions", NULL);
priv->mouse_enabled = xf86SetBoolOption(dev->commonOptions, "StartMouseEnabled", TRUE);
priv->keys_enabled = xf86SetBoolOption(dev->commonOptions, "StartKeysEnabled", TRUE);

View File

@@ -55,6 +55,17 @@
#define XI_JOYSTICK "JOYSTICK"
#endif
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 5
typedef struct {
char *rules;
char *model;
char *layout;
char *variant;
char *options;
} XkbRMLVOSet;
#endif
typedef enum _JOYSTICKEVENT {
EVENT_NONE=0,
@@ -69,7 +80,7 @@ typedef void(*jstkCloseDeviceProc)(JoystickDevPtr joystick);
typedef int(*jstkReadDataProc)(JoystickDevPtr joystick,
JOYSTICKEVENT *event, int *number);
typedef unsigned int KEYSCANCODES [MAXKEYSPERBUTTON];
typedef unsigned char KEYSCANCODES [MAXKEYSPERBUTTON];
typedef struct _AXIS {
JSTK_TYPE type;
@@ -118,11 +129,7 @@ typedef struct _JoystickDevRec {
CARD8 num_buttons, num_axes; /* Detected number of buttons/axes */
struct _KEYMAP {
int size;
KeySym map[256-MIN_KEYCODE];
} keymap;
XkbRMLVOSet rmlvo;
AXIS axis[MAXAXES]; /* Configuration per axis */
BUTTON button[MAXBUTTONS]; /* Configuration per button */
} JoystickDevRec;

View File

@@ -42,6 +42,9 @@
#include <xkbsrv.h>
#endif
#define MIN_KEYCODE 8
#define GLYPHS_PER_KEY 2
#define AltMask Mod1Mask
#define NumLockMask Mod2Mask
#define AltLangMask Mod3Mask
@@ -50,6 +53,277 @@
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 5
static KeySym map[] = {
/* 0x00 */ NoSymbol, NoSymbol,
/* 0x01 */ XK_Escape, NoSymbol,
/* 0x02 */ XK_1, XK_exclam,
/* 0x03 */ XK_2, XK_at,
/* 0x04 */ XK_3, XK_numbersign,
/* 0x05 */ XK_4, XK_dollar,
/* 0x06 */ XK_5, XK_percent,
/* 0x07 */ XK_6, XK_asciicircum,
/* 0x08 */ XK_7, XK_ampersand,
/* 0x09 */ XK_8, XK_asterisk,
/* 0x0a */ XK_9, XK_parenleft,
/* 0x0b */ XK_0, XK_parenright,
/* 0x0c */ XK_minus, XK_underscore,
/* 0x0d */ XK_equal, XK_plus,
/* 0x0e */ XK_BackSpace, NoSymbol,
/* 0x0f */ XK_Tab, XK_ISO_Left_Tab,
/* 0x10 */ XK_Q, NoSymbol,
/* 0x11 */ XK_W, NoSymbol,
/* 0x12 */ XK_E, NoSymbol,
/* 0x13 */ XK_R, NoSymbol,
/* 0x14 */ XK_T, NoSymbol,
/* 0x15 */ XK_Y, NoSymbol,
/* 0x16 */ XK_U, NoSymbol,
/* 0x17 */ XK_I, NoSymbol,
/* 0x18 */ XK_O, NoSymbol,
/* 0x19 */ XK_P, NoSymbol,
/* 0x1a */ XK_bracketleft, XK_braceleft,
/* 0x1b */ XK_bracketright,XK_braceright,
/* 0x1c */ XK_Return, NoSymbol,
/* 0x1d */ XK_Control_L, NoSymbol,
/* 0x1e */ XK_A, NoSymbol,
/* 0x1f */ XK_S, NoSymbol,
/* 0x20 */ XK_D, NoSymbol,
/* 0x21 */ XK_F, NoSymbol,
/* 0x22 */ XK_G, NoSymbol,
/* 0x23 */ XK_H, NoSymbol,
/* 0x24 */ XK_J, NoSymbol,
/* 0x25 */ XK_K, NoSymbol,
/* 0x26 */ XK_L, NoSymbol,
/* 0x27 */ XK_semicolon, XK_colon,
/* 0x28 */ XK_quoteright, XK_quotedbl,
/* 0x29 */ XK_quoteleft, XK_asciitilde,
/* 0x2a */ XK_Shift_L, NoSymbol,
/* 0x2b */ XK_backslash, XK_bar,
/* 0x2c */ XK_Z, NoSymbol,
/* 0x2d */ XK_X, NoSymbol,
/* 0x2e */ XK_C, NoSymbol,
/* 0x2f */ XK_V, NoSymbol,
/* 0x30 */ XK_B, NoSymbol,
/* 0x31 */ XK_N, NoSymbol,
/* 0x32 */ XK_M, NoSymbol,
/* 0x33 */ XK_comma, XK_less,
/* 0x34 */ XK_period, XK_greater,
/* 0x35 */ XK_slash, XK_question,
/* 0x36 */ XK_Shift_R, NoSymbol,
/* 0x37 */ XK_KP_Multiply, NoSymbol,
/* 0x38 */ XK_Alt_L, XK_Meta_L,
/* 0x39 */ XK_space, NoSymbol,
/* 0x3a */ XK_Caps_Lock, NoSymbol,
/* 0x3b */ XK_F1, NoSymbol,
/* 0x3c */ XK_F2, NoSymbol,
/* 0x3d */ XK_F3, NoSymbol,
/* 0x3e */ XK_F4, NoSymbol,
/* 0x3f */ XK_F5, NoSymbol,
/* 0x40 */ XK_F6, NoSymbol,
/* 0x41 */ XK_F7, NoSymbol,
/* 0x42 */ XK_F8, NoSymbol,
/* 0x43 */ XK_F9, NoSymbol,
/* 0x44 */ XK_F10, NoSymbol,
/* 0x45 */ XK_Num_Lock, NoSymbol,
/* 0x46 */ XK_Scroll_Lock, NoSymbol,
/* These KP keys should have the KP_7 keysyms in the numlock
* modifer... ? */
/* 0x47 */ XK_KP_Home, XK_KP_7,
/* 0x48 */ XK_KP_Up, XK_KP_8,
/* 0x49 */ XK_KP_Prior, XK_KP_9,
/* 0x4a */ XK_KP_Subtract, NoSymbol,
/* 0x4b */ XK_KP_Left, XK_KP_4,
/* 0x4c */ XK_KP_Begin, XK_KP_5,
/* 0x4d */ XK_KP_Right, XK_KP_6,
/* 0x4e */ XK_KP_Add, NoSymbol,
/* 0x4f */ XK_KP_End, XK_KP_1,
/* 0x50 */ XK_KP_Down, XK_KP_2,
/* 0x51 */ XK_KP_Next, XK_KP_3,
/* 0x52 */ XK_KP_Insert, XK_KP_0,
/* 0x53 */ XK_KP_Delete, XK_KP_Decimal,
/* 0x54 */ NoSymbol, NoSymbol,
/* 0x55 */ XK_F13, NoSymbol,
/* 0x56 */ XK_less, XK_greater,
/* 0x57 */ XK_F11, NoSymbol,
/* 0x58 */ XK_F12, NoSymbol,
/* 0x59 */ XK_F14, NoSymbol,
/* 0x5a */ XK_F15, NoSymbol,
/* 0x5b */ XK_F16, NoSymbol,
/* 0x5c */ XK_F17, NoSymbol,
/* 0x5d */ XK_F18, NoSymbol,
/* 0x5e */ XK_F19, NoSymbol,
/* 0x5f */ XK_F20, NoSymbol,
/* 0x60 */ XK_KP_Enter, NoSymbol,
/* 0x61 */ XK_Control_R, NoSymbol,
/* 0x62 */ XK_KP_Divide, NoSymbol,
/* 0x63 */ XK_Print, XK_Sys_Req,
/* 0x64 */ XK_Alt_R, XK_Meta_R,
/* 0x65 */ NoSymbol, NoSymbol, /* KEY_LINEFEED */
/* 0x66 */ XK_Home, NoSymbol,
/* 0x67 */ XK_Up, NoSymbol,
/* 0x68 */ XK_Prior, NoSymbol,
/* 0x69 */ XK_Left, NoSymbol,
/* 0x6a */ XK_Right, NoSymbol,
/* 0x6b */ XK_End, NoSymbol,
/* 0x6c */ XK_Down, NoSymbol,
/* 0x6d */ XK_Next, NoSymbol,
/* 0x6e */ XK_Insert, NoSymbol,
/* 0x6f */ XK_Delete, NoSymbol,
/* 0x70 */ NoSymbol, NoSymbol, /* KEY_MACRO */
/* 0x71 */ NoSymbol, NoSymbol,
/* 0x72 */ NoSymbol, NoSymbol,
/* 0x73 */ NoSymbol, NoSymbol,
/* 0x74 */ NoSymbol, NoSymbol,
/* 0x75 */ XK_KP_Equal, NoSymbol,
/* 0x76 */ NoSymbol, NoSymbol,
/* 0x77 */ NoSymbol, NoSymbol,
/* 0x78 */ XK_F21, NoSymbol,
/* 0x79 */ XK_F22, NoSymbol,
/* 0x7a */ XK_F23, NoSymbol,
/* 0x7b */ XK_F24, NoSymbol,
/* 0x7c */ XK_KP_Separator, NoSymbol,
/* 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 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_Meta_L, Mod4Mask },
{ XK_Meta_R, Mod4Mask },
{ XK_Num_Lock, NumLockMask },
{ XK_Scroll_Lock, ScrollLockMask },
{ XK_Mode_switch, AltLangMask }
};
#endif
static void
jstkKbdCtrl(DeviceIntPtr device, KeybdCtrl *ctrl)
@@ -69,67 +343,52 @@ jstkKbdCtrl(DeviceIntPtr device, KeybdCtrl *ctrl)
static int
jstkInitKeys(DeviceIntPtr pJstk, JoystickDevPtr priv)
{
KeySymsRec keySyms;
CARD8 modMap[MAP_LENGTH];
KeySym sym;
int i, j;
XkbSrvInfoPtr xkbi;
XkbControlsPtr ctrls;
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));
for (i = 0; i < priv->keymap.size; i++)
{
DBG(6, xf86Msg(X_CONFIG, "Keymap [%d]: 0x%08X\n", MIN_KEYCODE+i,(unsigned int)priv->keymap.map[i]));
}
memset(modMap, 0, sizeof(modMap));
keySyms.map = priv->keymap.map;
keySyms.mapWidth = 1;
keySyms.minKeyCode = MIN_KEYCODE;
/* keySyms.maxKeyCode = MIN_KEYCODE + priv->keymap.size - 1; */
keySyms.maxKeyCode = MIN_KEYCODE + sizeof(priv->keymap.map)/sizeof(priv->keymap.map[0]) - 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;
}
}
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 5
{
XkbRMLVOSet rmlvo;
XkbGetRulesDflts(&rmlvo);
/* XkbRMLVOSet rmlvo; */
/* XkbGetRulesDflts(&rmlvo); */
/* FIXME */
#warning KEYMAP FOR ABI_XINPUT_VERSION >= 5 BROKEN RIGHT NOW
if (!InitKeyboardDeviceStruct(pJstk, &rmlvo, NULL, jstkKbdCtrl))
if (!InitKeyboardDeviceStruct(pJstk, &priv->rmlvo, NULL, jstkKbdCtrl))
{
ErrorF("unable to init keyboard device\n");
return !Success;
}
}
#else
if (InitKeyboardDeviceStruct((DevicePtr)pJstk, &keySyms, modMap, NULL, jstkKbdCtrl) == FALSE) {
ErrorF("unable to init keyboard device\n");
return !Success;
KeySymsRec keySyms;
CARD8 modMap[MAP_LENGTH];
KeySym sym;
int i, j;
XkbComponentNamesRec xkbnames;
memset(modMap, 0, sizeof(modMap));
memset(&xkbnames, 0, sizeof(xkbnames));
keySyms.map = map;
keySyms.mapWidth = GLYPHS_PER_KEY;
keySyms.minKeyCode = MIN_KEYCODE;
keySyms.maxKeyCode = MIN_KEYCODE + (sizeof(map) / sizeof(map[0])) / GLYPHS_PER_KEY - 1;
for (i = 0; i < (sizeof(map) / sizeof(map[0])) / GLYPHS_PER_KEY; i++) {
sym = map[i * GLYPHS_PER_KEY];
for (j = 0; j < sizeof(modifiers)/sizeof(modifiers[0]); j++) {
if (modifiers[j].keysym == sym)
modMap[i + MIN_KEYCODE] = modifiers[j].mask;
}
}
ErrorF("%s, %s, %s, %s, %s\n", priv->rmlvo.rules, priv->rmlvo.model, priv->rmlvo.layout, priv->rmlvo.variant, priv->rmlvo.options);
XkbSetRulesDflts(priv->rmlvo.rules, priv->rmlvo.model,
priv->rmlvo.layout, priv->rmlvo.variant,
priv->rmlvo.options);
if (!XkbInitKeyboardDeviceStruct(pJstk, &xkbnames,
&keySyms, modMap, NULL,
jstkKbdCtrl))
return 0;
#endif
/* Set Autorepeat and Delay */
@@ -175,7 +434,6 @@ jstkGenerateKeys(LocalDevicePtr device, KEYSCANCODES keys, char pressed)
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->dev, k, pressed);

View File

@@ -35,36 +35,10 @@
#include <X11/XF86keysym.h>
#include "jstk.h"
#include "jstk_options.h"
#include "StrKeysym.h"
/***********************************************************************
*
* jstkGetKeyNumberInMap --
*
* Adds a KeySym to the keymap and returns the index
*
***********************************************************************
*/
static 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 >= sizeof(priv->keymap.map)/sizeof(priv->keymap.map[0])) return 0;
priv->keymap.map[j] = keysym;
if (j + 1 > priv->keymap.size) priv->keymap.size = j + 1;
return j;
}
/***********************************************************************
*
* jstkGetAxisMapping --
@@ -156,21 +130,17 @@ jstkParseButtonOption(const char* org,
button->mapping = JSTK_MAPPING_KEY;
for (value = 0; value < MAXKEYSPERBUTTON; value++) if (current != NULL) {
unsigned key;
unsigned int key;
next = strchr(current, ',');
if (!next) next = strchr(current, '+');
if (!next) next = strchr(current, '+');
if (next) *(next++) = '\0';
#ifdef _STRKEYSYM_H_INCLUDED_
key = XStringToKeysym(current);
if (key == NoSymbol)
#endif
key = strtol(current, NULL, 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);
button->keys[value] = key;
}
current = next;
} else button->keys[value] = 0;
@@ -272,17 +242,13 @@ jstkParseAxisOption(const char* org,
if (!next) next = strchr(current, '+');
if (next) *(next++) = '\0';
#ifdef _STRKEYSYM_H_INCLUDED_
key = XStringToKeysym(current);
if (key == NoSymbol)
#endif
key = strtol(current, NULL, 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 keylow value: %s.\n",
name, current);
else {
axis->keys_low[value] = jstkGetKeyNumberInMap(priv, key);
axis->keys_low[value] = key;
}
current = next;
} else axis->keys_low[value] = 0;
@@ -299,20 +265,16 @@ jstkParseAxisOption(const char* org,
for (value = 0; value < MAXKEYSPERBUTTON; value++)
if (current != NULL) {
next = strchr(current, ',');
if (!next) next = strchr(current, '+');
if (!next) next = strchr(current, '+');
if (next) *(next++) = '\0';
key = strtol(current, NULL, 0);
#ifdef _STRKEYSYM_H_INCLUDED_
key = XStringToKeysym(current);
if (key == NoSymbol)
#endif
key = strtol(current, NULL, 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 keyhigh value: %s.\n",
name, current);
else {
axis->keys_high[value] = jstkGetKeyNumberInMap(priv, key);
axis->keys_high[value] = key;
}
current = next;
} else axis->keys_high[value] = 0;

View File

@@ -71,7 +71,7 @@ jstkSetProperty(DeviceIntPtr pJstk, Atom atom, XIPropertyValuePtr val,
{
InputInfoPtr pInfo = pJstk->public.devicePrivate;
JoystickDevPtr priv = pInfo->private;
int i;
int i, j;
if (atom == prop_debuglevel)
{
@@ -173,12 +173,38 @@ jstkSetProperty(DeviceIntPtr pJstk, Atom atom, XIPropertyValuePtr val,
}
}else if (atom == prop_axis_keys_low)
{
/* FIXME */
return BadValue;
unsigned char *values;
if (val->size != priv->num_axes*MAXKEYSPERBUTTON || val->format != 8 || val->type != XA_INTEGER)
return BadMatch;
if (!checkonly)
{
values = (unsigned char*)val->data;
for (i =0; i<val->size/MAXKEYSPERBUTTON; i++) {
DBG(1, ErrorF("key_low of axis %d set to ", i));
for (j = 0; j<MAXKEYSPERBUTTON; j++) {
priv->axis[i].keys_low[j] = values[i*MAXKEYSPERBUTTON+j];
DBG(1, ErrorF("%d ", priv->axis[i].keys_low[j]));
}
DBG(1, ErrorF("\n"));
}
}
}else if (atom == prop_axis_keys_high)
{
/* FIXME */
return BadValue;
unsigned char *values;
if (val->size != priv->num_axes*MAXKEYSPERBUTTON || val->format != 8 || val->type != XA_INTEGER)
return BadMatch;
if (!checkonly)
{
values = (unsigned char*)val->data;
for (i =0; i<val->size/MAXKEYSPERBUTTON; i++) {
DBG(1, ErrorF("key_high of axis %d set to ", i));
for (j = 0; j<MAXKEYSPERBUTTON; j++) {
priv->axis[i].keys_high[j] = values[i*MAXKEYSPERBUTTON+j];
DBG(1, ErrorF("%d ", priv->axis[i].keys_high[j]));
}
DBG(1, ErrorF("\n"));
}
}
}else if (atom == prop_button_mapping)
{
INT8 *values;
@@ -231,8 +257,21 @@ jstkSetProperty(DeviceIntPtr pJstk, Atom atom, XIPropertyValuePtr val,
}
}else if (atom == prop_button_keys)
{
/* FIXME */
return BadValue;
unsigned char *values;
if (val->size != priv->num_buttons*MAXKEYSPERBUTTON || val->format != 8 || val->type != XA_INTEGER)
return BadMatch;
if (!checkonly)
{
values = (unsigned char*)val->data;
for (i = 0; i<val->size/MAXKEYSPERBUTTON; i++) {
DBG(1, ErrorF("keys of button %d set to ", i));
for (j = 0; j<MAXKEYSPERBUTTON; j++) {
priv->button[i].keys[j] = values[i*MAXKEYSPERBUTTON+j];
DBG(1, ErrorF("%d ", priv->button[i].keys[j]));
}
DBG(1, ErrorF("\n"));
}
}
}
/* property not handled, report success */
@@ -243,11 +282,11 @@ Bool
jstkInitProperties(DeviceIntPtr pJstk, JoystickDevPtr priv)
{
INT32 axes_values32[MAXAXES];
INT8 axes_values8[MAXAXES];
INT8 button_values8[MAXBUTTONS];
INT8 axes_values8[MAXAXES*MAXKEYSPERBUTTON];
INT8 button_values8[MAXBUTTONS*MAXKEYSPERBUTTON];
float axes_floats[MAXAXES];
float button_floats[MAXBUTTONS];
int i;
int i, j;
XIRegisterPropertyHandler(pJstk, jstkSetProperty, NULL, NULL);
@@ -347,12 +386,26 @@ jstkInitProperties(DeviceIntPtr pJstk, JoystickDevPtr priv)
}
/* priv->axis[].keys_low */
/* FIXME: prop_axis_keys_low */
for (i=0;i<priv->num_axes;i++)
for (j=0;j<MAXKEYSPERBUTTON;j++)
axes_values8[i*MAXKEYSPERBUTTON+j] = (INT8)priv->axis[i].keys_low[j];
prop_axis_keys_low = MakeAtom(JSTK_PROP_AXIS_KEYS_LOW, strlen(JSTK_PROP_AXIS_KEYS_LOW), TRUE);
XIChangeDeviceProperty(pJstk, prop_axis_keys_low, XA_INTEGER, 8,
PropModeReplace, priv->num_axes*MAXKEYSPERBUTTON,
axes_values8,
FALSE);
XISetDevicePropertyDeletable(pJstk, prop_axis_keys_low, FALSE);
/* priv->axis[].keys_high */
/* FIXME: prop_axis_keys_high */
for (i=0;i<priv->num_axes;i++)
for (j=0;j<MAXKEYSPERBUTTON;j++)
axes_values8[i*MAXKEYSPERBUTTON+j] = (INT8)priv->axis[i].keys_high[j];
prop_axis_keys_high = MakeAtom(JSTK_PROP_AXIS_KEYS_HIGH, strlen(JSTK_PROP_AXIS_KEYS_HIGH), TRUE);
XIChangeDeviceProperty(pJstk, prop_axis_keys_high, XA_INTEGER, 8,
PropModeReplace, priv->num_axes*MAXKEYSPERBUTTON,
axes_values8,
FALSE);
XISetDevicePropertyDeletable(pJstk, prop_axis_keys_high, FALSE);
/* priv->button[].mapping */
@@ -391,7 +444,15 @@ jstkInitProperties(DeviceIntPtr pJstk, JoystickDevPtr priv)
}
/* priv->button[].keys */
/* FIXME: prop_button_keys */
for (i=0;i<priv->num_buttons;i++)
for (j=0;j<MAXKEYSPERBUTTON;j++)
button_values8[i*MAXKEYSPERBUTTON+j] = (INT8)priv->button[i].keys[j];
prop_button_keys = MakeAtom(JSTK_PROP_BUTTON_KEYS, strlen(JSTK_PROP_BUTTON_KEYS), TRUE);
XIChangeDeviceProperty(pJstk, prop_button_keys, XA_INTEGER, 8,
PropModeReplace, priv->num_buttons*MAXKEYSPERBUTTON,
button_values8,
FALSE);
XISetDevicePropertyDeletable(pJstk, prop_button_keys, FALSE);
return TRUE;
}

File diff suppressed because it is too large Load Diff