From 59a91f172e190490488570a70aa98705977624ac Mon Sep 17 00:00:00 2001 From: Olivier Samyn Date: Thu, 12 Aug 2010 02:39:37 +0200 Subject: [PATCH] aiptek: Generate keyboard events for XInput ABI >=7 This patch modifies the driver behaviour when XInput ABI s >= 7: It adds initialization code and generates keyboard events using xf86PostKeyboardEvent instead of xf86PostKeyEvent. It also skips the existing keysym tranlation code; this will be replaced by a following patch. Signed-off-by: Olivier Samyn --- src/xf86Aiptek.c | 32 +++++++++++++++++++++++++++----- src/xf86Aiptek.h | 1 + 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/xf86Aiptek.c b/src/xf86Aiptek.c index c282bf3..bbda26b 100644 --- a/src/xf86Aiptek.c +++ b/src/xf86Aiptek.c @@ -155,6 +155,7 @@ _X_EXPORT InputDriverRec AIPTEK = * XK_whatever... */ +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 7 static int linux_inputDevice_keyMap[] = { KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, @@ -164,7 +165,6 @@ static int linux_inputDevice_keyMap[] = KEY_OPEN, KEY_PASTE }; -#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 7 /* * Function/Macro keys variables. * @@ -431,6 +431,11 @@ xf86AiptekSendEvents(LocalDevicePtr local, int r_z) */ if (common->currentValues.macroKey != VALUE_NA) { +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7 + xf86PostKeyboardEvent(local->dev, + common->currentValues.macroKey+8, + common->currentValues.macroVal); +#else int i; /* This is a little silly, but: The Linux Event Input @@ -468,6 +473,7 @@ xf86AiptekSendEvents(LocalDevicePtr local, int r_z) } } +#endif } /* As the coordinates are ready, we can send events to X */ @@ -863,6 +869,7 @@ xf86AiptekHIDReadInput(LocalDevicePtr local) { ++eventsInMessage; common->currentValues.macroKey = event->code; + common->currentValues.macroVal = event->value; } break; } @@ -928,12 +935,14 @@ xf86AiptekHIDReadInput(LocalDevicePtr local) <= device->xTiltThreshold && ABS(common->currentValues.yTilt - common->previousValues.yTilt) <= device->yTiltThreshold && - common->currentValues.proximity == + common->currentValues.proximity == common->previousValues.proximity && common->currentValues.button == common->previousValues.button && common->currentValues.macroKey == - common->previousValues.macroKey) + common->previousValues.macroKey && + common->currentValues.macroVal == + common->previousValues.macroVal) { DBG(10, ErrorF("Event Filtered Out by Thresholds\n")); continue; @@ -999,12 +1008,14 @@ xf86AiptekHIDReadInput(LocalDevicePtr local) common->previousValues.proximity = common->currentValues.proximity; common->previousValues.button = common->currentValues.button; common->previousValues.macroKey = common->currentValues.macroKey; + common->previousValues.macroVal = common->currentValues.macroVal; common->previousValues.xTilt = common->currentValues.xTilt; common->previousValues.yTilt = common->currentValues.yTilt; common->previousValues.distance = common->currentValues.distance; common->previousValues.wheel = common->currentValues.wheel; common->currentValues.macroKey = VALUE_NA; + common->currentValues.macroVal = -1; } } @@ -1564,6 +1575,7 @@ xf86AiptekOpenDevice(DeviceIntPtr pDriver) return (local->fd != -1); } +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 7 /* * xf86AiptekBellCallback */ @@ -1571,6 +1583,7 @@ static void xf86AiptekBellCallback(int pct, DeviceIntPtr di, pointer ctrl, int x) { } +#endif /* * xf86AiptekKbdCtrlCallback @@ -1669,7 +1682,13 @@ xf86AiptekProc(DeviceIntPtr pAiptek, int requestCode) ErrorF("Unable to init Keyboard Feedback Class Device\n"); return !Success; } - +#elif GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7 + if (InitKeyboardDeviceStruct(pAiptek, NULL, NULL, + xf86AiptekKbdCtrlCallback) == FALSE ) + { + ErrorF("Unable to init Key Class Device\n"); + return !Success; + } #endif /* we don't label the axes here, done later in @@ -1943,6 +1963,7 @@ xf86AiptekAllocate(char* name, common->currentValues.yTilt = 0; /* YTilt */ common->currentValues.proximity = 0; /* proximity bit */ common->currentValues.macroKey = VALUE_NA; /* tablet macro key code */ + common->currentValues.macroVal = -1; /* tablet macro key value */ common->currentValues.button = 0; /* bitmask of buttons pressed */ common->currentValues.distance = 0; /* currently unsupported */ common->currentValues.wheel = 0; /* likewise */ @@ -1956,6 +1977,7 @@ xf86AiptekAllocate(char* name, common->previousValues.yTilt = 0; common->previousValues.proximity = 0; common->previousValues.macroKey = VALUE_NA; + common->previousValues.macroVal = -1; common->previousValues.button = 0; common->previousValues.distance = 0; common->previousValues.wheel = 0; @@ -2510,7 +2532,7 @@ xf86AiptekInit(InputDriverPtr drv, xf86Msg(X_CONFIG, "%s: xf86AiptekInit() finished\n", dev->identifier); /* Mark the device as configured */ - local->flags |= XI86_POINTER_CAPABLE | XI86_CONFIGURED; + local->flags |= XI86_KEYBOARD_CAPABLE | XI86_POINTER_CAPABLE | XI86_CONFIGURED; /* return the LocalDevice */ return (local); diff --git a/src/xf86Aiptek.h b/src/xf86Aiptek.h index 8a8b5cc..9663a1e 100644 --- a/src/xf86Aiptek.h +++ b/src/xf86Aiptek.h @@ -205,6 +205,7 @@ typedef struct int yTilt; /* Angle at which stylus is held, Y coord */ int proximity; /* Stylus proximity bit. */ int macroKey; /* Macrokey read from tablet */ + int macroVal; /* Macro value(key press/release) */ int button; /* Button bitmask */ int distance; /* Future capacity */ int wheel; /* Future capacity */ -- 1.7.0.4