summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSascha Hlusiak <saschahlusiak@arcor.de>2009-04-14 23:25:44 +0200
committerSascha Hlusiak <saschahlusiak@arcor.de>2009-04-14 23:25:44 +0200
commitbf8626967263ee92d45759c58dc5bcc42a57176b (patch)
treef2d86222362412a5ccad8baf889c93d0380c684e
parent57bf11bc03a04fd68bb3ee2cd5375f04326e5c28 (diff)
Property support for scancodes
Allows setting scancodes for keys using input-properties
-rw-r--r--include/joystick-properties.h12
-rw-r--r--src/jstk.h2
-rw-r--r--src/jstk_properties.c91
3 files changed, 83 insertions, 22 deletions
diff --git a/include/joystick-properties.h b/include/joystick-properties.h
index 0f0d4ed..49ef800 100644
--- a/include/joystick-properties.h
+++ b/include/joystick-properties.h
@@ -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"
diff --git a/src/jstk.h b/src/jstk.h
index 9d42fb0..78a1f83 100644
--- a/src/jstk.h
+++ b/src/jstk.h
@@ -80,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;
diff --git a/src/jstk_properties.c b/src/jstk_properties.c
index f2c562a..1ceeb06 100644
--- a/src/jstk_properties.c
+++ b/src/jstk_properties.c
@@ -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;
}