diff options
author | Sascha Hlusiak <saschahlusiak@arcor.de> | 2009-04-14 23:25:44 +0200 |
---|---|---|
committer | Sascha Hlusiak <saschahlusiak@arcor.de> | 2009-04-14 23:25:44 +0200 |
commit | bf8626967263ee92d45759c58dc5bcc42a57176b (patch) | |
tree | f2d86222362412a5ccad8baf889c93d0380c684e | |
parent | 57bf11bc03a04fd68bb3ee2cd5375f04326e5c28 (diff) |
Property support for scancodes
Allows setting scancodes for keys using input-properties
-rw-r--r-- | include/joystick-properties.h | 12 | ||||
-rw-r--r-- | src/jstk.h | 2 | ||||
-rw-r--r-- | src/jstk_properties.c | 91 |
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" @@ -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; } |