diff options
Diffstat (limited to 'xkb/xkbActions.c')
-rw-r--r-- | xkb/xkbActions.c | 64 |
1 files changed, 59 insertions, 5 deletions
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c index 403c2fb89..853a8c426 100644 --- a/xkb/xkbActions.c +++ b/xkb/xkbActions.c @@ -46,8 +46,47 @@ extern void ProcessOtherEvent( ); #endif +static unsigned int _xkbServerGeneration; +int xkbDevicePrivateIndex = -1; + /***====================================================================***/ +void +xkbUnwrapProc(DeviceIntPtr device, DeviceHandleProc proc, + pointer data) +{ + xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(device); + ProcessInputProc tmp = device->public.processInputProc; + + UNWRAP_PROCESS_INPUT_PROC(device,xkbPrivPtr); + proc(device,data); + WRAP_PROCESS_INPUT_PROC(device,xkbPrivPtr, + tmp,xkbUnwrapProc); +} + +void +XkbSetExtension(DeviceIntPtr device, ProcessInputProc proc) +{ + xkbDeviceInfoPtr xkbPrivPtr; + + if (serverGeneration != _xkbServerGeneration) { + if ((xkbDevicePrivateIndex = AllocateDevicePrivateIndex()) == -1) + return; + _xkbServerGeneration = serverGeneration; + } + if (!AllocateDevicePrivate(device, xkbDevicePrivateIndex)) + return; + + xkbPrivPtr = (xkbDeviceInfoPtr) xcalloc(sizeof(xkbDeviceInfoRec),1); + if (!xkbPrivPtr) + return; + xkbPrivPtr->unwrapProc = NULL; + + device->devPrivates[xkbDevicePrivateIndex].ptr = xkbPrivPtr; + WRAP_PROCESS_INPUT_PROC(device,xkbPrivPtr, + proc,xkbUnwrapProc); +} + static XkbAction _FixUpAction(XkbDescPtr xkb,XkbAction *act) { @@ -822,6 +861,7 @@ xEvent ev; int x,y; XkbStateRec old; unsigned mods,mask,oldCoreState = 0,oldCorePrevState = 0; +xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(xkbi->device); if ((filter->keycode!=0)&&(filter->keycode!=keycode)) return 1; @@ -870,7 +910,10 @@ unsigned mods,mask,oldCoreState = 0,oldCorePrevState = 0; realMods = xkbi->device->key->modifierMap[ev.u.u.detail]; xkbi->device->key->modifierMap[ev.u.u.detail] = 0; - CoreProcessKeyboardEvent(&ev,xkbi->device,1); + UNWRAP_PROCESS_INPUT_PROC(xkbi->device,xkbPrivPtr); + xkbi->device->public.processInputProc(&ev,xkbi->device,1); + COND_WRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr, + ProcessKeyboardEvent,xkbUnwrapProc); xkbi->device->key->modifierMap[ev.u.u.detail] = realMods; if ( mask || mods ) { @@ -908,7 +951,10 @@ unsigned mods,mask,oldCoreState = 0,oldCorePrevState = 0; realMods = xkbi->device->key->modifierMap[ev.u.u.detail]; xkbi->device->key->modifierMap[ev.u.u.detail] = 0; - CoreProcessKeyboardEvent(&ev,xkbi->device,1); + UNWRAP_PROCESS_INPUT_PROC(xkbi->device,xkbPrivPtr); + xkbi->device->public.processInputProc(&ev,xkbi->device,1); + COND_WRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr, + ProcessKeyboardEvent,xkbUnwrapProc); xkbi->device->key->modifierMap[ev.u.u.detail] = realMods; if ( mask || mods ) { @@ -1102,7 +1148,8 @@ Bool pressEvent; #ifdef XINPUT Bool xiEvent; #endif - +xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(dev); + keyc= kbd->key; xkbi= keyc->xkbInfo; key= xE->u.u.detail; @@ -1244,10 +1291,17 @@ Bool xiEvent; if (keyEvent) { realMods = keyc->modifierMap[key]; keyc->modifierMap[key] = 0; - CoreProcessKeyboardEvent(xE,dev,count); + UNWRAP_PROCESS_INPUT_PROC(dev,xkbPrivPtr); + dev->public.processInputProc(xE,dev,count); + COND_WRAP_PROCESS_INPUT_PROC(dev, xkbPrivPtr, + ProcessKeyboardEvent,xkbUnwrapProc); keyc->modifierMap[key] = realMods; + } else { + UNWRAP_PROCESS_INPUT_PROC(dev,xkbPrivPtr); + dev->public.processInputProc(xE,dev,count); + COND_WRAP_PROCESS_INPUT_PROC(dev, xkbPrivPtr, + ProcessPointerEvent,xkbUnwrapProc); } - else CoreProcessPointerEvent(xE,dev,count); } else if (keyEvent) FixKeyState(xE,dev); |