summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSascha Hlusiak <saschahlusiak@arcor.de>2007-03-26 18:05:41 -0400
committerSascha Hlusiak <saschahlusiak@arcor.de>2007-03-26 18:05:41 -0400
commit0a0b5a3e24701734c55679a7c05e022e01d831f8 (patch)
treee96fece1bdc3d90b73bb4253e8e7abdc0cdc41a6
parent423a0e79266734e4dc2427673401c65f7e783305 (diff)
Added code to generate key eventy
-rw-r--r--man/joystick.man24
-rw-r--r--src/Makefile.am2
-rw-r--r--src/jstk.c45
-rw-r--r--src/jstk.h6
-rw-r--r--src/jstk_axis.c1
-rw-r--r--src/jstk_options.h6
6 files changed, 56 insertions, 28 deletions
diff --git a/man/joystick.man b/man/joystick.man
index 30fab40..43cf7e8 100644
--- a/man/joystick.man
+++ b/man/joystick.man
@@ -63,7 +63,14 @@ Use positive and negative values to control the direction. Default: 1.0
.TP 7
.BI "\*qamplify="<factor> \*q
Amplifies the movement of all axes by the given factor when pressed. Different
-factors can be combined.
+factors can be combined.
+.TP 7
+.BI "\*qkey="<keycode>[,<keycode>[,<keycode>[,<keycode>]]]
+When button is pressed, a series of keydown events with the specified keycode is
+generated. When the button is released, there are keyup events in the opposite
+order generated.
+
+See special section about key events below.
.TP 7
.B "\*qdisable-mouse\*q"
.TP 7
@@ -108,8 +115,21 @@ This can be between
Default: 10
.RE
+.SH "GENERATING KEY EVENTS"
+Proving a \*qkey=<keycode>[,<keycode>[...]]\*q option will generate X Events with the specified keycode.
+To lookup keycodes for KeySyms, you can use
+.BR "xmodmap -pk" .
+You can use unused keycodes and map to a KEYSYMNAME of your choice using xmodmap(1).
+
+Example:
+To make the button perform
+.I "Alt_L+Tab"
+, use \*qkey=64,23\*q. For a lowercase
+.I d
+, use \*qkey=40\*q.
+
.SH "SEE ALSO"
-__xservername__(__appmansuffix__), __xconfigfile__(__filemansuffix__), xorgconfig(__appmansuffix__), Xserver(__appmansuffix__), X(__miscmansuffix__)
+__xservername__(__appmansuffix__), __xconfigfile__(__filemansuffix__), xorgconfig(__appmansuffix__), Xserver(__appmansuffix__), X(__miscmansuffix__), xmodmap(1)
.SH AUTHORS
Sascha Hlusiak
.fi
diff --git a/src/Makefile.am b/src/Makefile.am
index ac4ea27..1beb07c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -31,4 +31,4 @@
@DRIVER_NAME@_drv_la_SOURCES = jstk.c jstk.h \
linux_jstk.c linux_jstk.h \
jstk_axis.c jstk_axis.h \
- jstk_options.c jstk_options.h \ No newline at end of file
+ jstk_options.c jstk_options.h
diff --git a/src/jstk.c b/src/jstk.c
index 760ac37..8e0ed52 100644
--- a/src/jstk.c
+++ b/src/jstk.c
@@ -33,7 +33,6 @@
#include <xf86Xinput.h>
#include <xisb.h>
#include <exevents.h> /* Needed for InitValuator/Proximity stuff */
-#include <X11/keysym.h>
#include <math.h>
@@ -91,7 +90,6 @@ xf86JstkConvert(LocalDevicePtr local,
-
/*
* xf86JstkRead --
* This is called, when there is data to read at the device
@@ -134,7 +132,18 @@ xf86JstkRead(LocalDevicePtr local)
jstkStartButtonAxisTimer(local, number);
break;
- case MAPPING_KEY: /* FIXME */
+ case MAPPING_KEY:
+ for (i=0;i<MAXKEYSPERBUTTON;i++) {
+ unsigned int k;
+ if (priv->button[number].pressed == 1)
+ k = priv->button[number].keys[i];
+ else k = priv->button[number].keys[MAXKEYSPERBUTTON - i - 1];
+ if (k != 0) {
+ DBG(1, ErrorF("Generating key %s event with keycode %d\n",
+ (priv->button[number].pressed)?"press":"release", k));
+ xf86PostKeyboardEvent(local->dev, k, priv->button[number].pressed);
+ }
+ }
break;
case MAPPING_SPEED_MULTIPLY:
priv->amplify = 1.0;
@@ -184,7 +193,7 @@ xf86JstkRead(LocalDevicePtr local)
if (priv->mouse_enabled == TRUE)
jstkStartAxisTimer(local, number);
break;
- case TYPE_ABSOLUTE: /* FIXME */
+ case TYPE_ABSOLUTE: /* FIXME: add range */
if (priv->mouse_enabled == TRUE)
jstkHandleAbsoluteAxis(local, number);
break;
@@ -216,19 +225,15 @@ xf86JstkProc(DeviceIntPtr pJstk,
DBG(1, ErrorF("xf86JstkProc what=INIT\n"));
for (i=1; i<MAXBUTTONS; i++) map[i] = i;
- if (InitButtonClassDeviceStruct(pJstk,
- priv->buttons,
- map) == FALSE)
- {
- ErrorF("unable to allocate Button class device\n");
- return !Success;
- }
+ if (InitButtonClassDeviceStruct(pJstk,priv->buttons,map) == FALSE) {
+ ErrorF("unable to allocate Button class device\n");
+ return !Success;
+ }
- if (InitFocusClassDeviceStruct(pJstk) == FALSE)
- {
- ErrorF("unable to init Focus class device\n");
- return !Success;
- }
+ if (InitFocusClassDeviceStruct(pJstk) == FALSE) {
+ ErrorF("unable to init Focus class device\n");
+ return !Success;
+ }
// if (InitPtrFeedbackClassDeviceStruct(pJstk,
// xf86JstkControlProc) == FALSE)
@@ -238,7 +243,7 @@ xf86JstkProc(DeviceIntPtr pJstk,
// }
if (InitValuatorClassDeviceStruct(pJstk,
- 2, /* FIXME */
+ 2,
xf86GetMotionEvents,
local->history_size,
Relative) /* relative or absolute */
@@ -363,7 +368,7 @@ xf86JstkCorePreInit(InputDriverPtr drv, IDevPtr dev, int flags)
priv = (JoystickDevPtr) local->private;
local->name = dev->identifier;
- local->flags = XI86_POINTER_CAPABLE | XI86_SEND_DRAG_EVENTS;
+ local->flags = XI86_POINTER_CAPABLE | XI86_KEYBOARD_CAPABLE | XI86_SEND_DRAG_EVENTS;
local->device_control = xf86JstkProc;
local->read_input = xf86JstkRead;
local->close_proc = NULL;
@@ -373,7 +378,7 @@ xf86JstkCorePreInit(InputDriverPtr drv, IDevPtr dev, int flags)
local->fd = -1;
local->dev = NULL;
local->private = priv;
- local->type_name = XI_MOUSE;
+ local->type_name = "JOYSTICK";
local->history_size = 0;
local->always_core_feedback = 0;
local->conf_idev = dev;
@@ -464,7 +469,7 @@ xf86JstkCorePreInit(InputDriverPtr drv, IDevPtr dev, int flags)
if (s != NULL) {
xf86Msg(X_CONFIG, "%s: Option \"mapbutton%d\" \"%s\"\n",
local->name, i+1, s);
- jstkParseButtonOption(s, &priv->button[i], local->name);
+ jstkParseButtonOption(s, priv, i, local->name);
}
}
diff --git a/src/jstk.h b/src/jstk.h
index 44fa9b4..8642d92 100644
--- a/src/jstk.h
+++ b/src/jstk.h
@@ -52,6 +52,7 @@ extern int debug_level;
#define MAXBUTTONS 32
#define MAXAXES MAXBUTTONS
+#define MAXKEYSPERBUTTON 4
enum JOYSTICKTYPE {
TYPE_NONE,
@@ -101,15 +102,16 @@ typedef struct
float temp,amplify;
enum JOYSTICKTYPE type;
enum JOYSTICKMAPPING mapping;
- }axis[32]; /* Configuration per axis */
+ }axis[MAXAXES]; /* Configuration per axis */
struct BUTTON
{
char pressed;
int value;
+ unsigned int keys[MAXKEYSPERBUTTON];
float temp;
enum JOYSTICKMAPPING mapping;
- }button[32]; /* Configuration per button */
+ }button[MAXBUTTONS]; /* Configuration per button */
int axes, buttons; /* Number of axes and buttons */
} JoystickDevRec, *JoystickDevPtr;
diff --git a/src/jstk_axis.c b/src/jstk_axis.c
index ad5254d..91c0455 100644
--- a/src/jstk_axis.c
+++ b/src/jstk_axis.c
@@ -30,6 +30,7 @@
#include <xf86Xinput.h>
#include <xf86_OSproc.h>
+#include <math.h>
#include "jstk.h"
#include "jstk_axis.h"
diff --git a/src/jstk_options.h b/src/jstk_options.h
index 494da6b..b6c2dfc 100644
--- a/src/jstk_options.h
+++ b/src/jstk_options.h
@@ -24,10 +24,10 @@
#ifndef __JSTK_OPTIONS_H_INCLUDED__
#define __JSTK_OPTIONS_H_INCLUDED__
-
void jstkParseButtonOption(const char* org,
- struct BUTTON *button,
- const char* name);
+ JoystickDevPtr priv,
+ int number,
+ const char* name);
void jstkParseAxisOption(const char* org,
struct AXIS *axis,
const char* name);