From 2e61901e46d28ce2f436219ad1a495aa0dcd0fba Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Fri, 20 Nov 2015 15:37:28 +0000 Subject: XKB: Split filter execution into a separate function Move the giant state machine which maps from a key action to actually running the filters into a separate function, to be used when adding KeyFocusIn. Signed-off-by: Daniel Stone Tested-by: Giulio Camuffo Reviewed-by: Peter Hutterer Signed-off-by: Peter Hutterer --- xkb/xkbActions.c | 144 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 76 insertions(+), 68 deletions(-) (limited to 'xkb') diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c index 1a9878dda..ddd09abd1 100644 --- a/xkb/xkbActions.c +++ b/xkb/xkbActions.c @@ -1199,6 +1199,80 @@ XkbPushLockedStateToSlaves(DeviceIntPtr master, int evtype, int key) } } +static void +XkbActionGetFilter(DeviceIntPtr dev, DeviceEvent *event, KeyCode key, + XkbAction *act, int *sendEvent) +{ + XkbSrvInfoPtr xkbi = dev->key->xkbInfo; + XkbFilterPtr filter; + + switch (act->type) { + case XkbSA_SetMods: + case XkbSA_SetGroup: + filter = _XkbNextFreeFilter(xkbi); + *sendEvent = _XkbFilterSetState(xkbi, filter, key, act); + break; + case XkbSA_LatchMods: + case XkbSA_LatchGroup: + filter = _XkbNextFreeFilter(xkbi); + *sendEvent = _XkbFilterLatchState(xkbi, filter, key, act); + break; + case XkbSA_LockMods: + case XkbSA_LockGroup: + filter = _XkbNextFreeFilter(xkbi); + *sendEvent = _XkbFilterLockState(xkbi, filter, key, act); + break; + case XkbSA_ISOLock: + filter = _XkbNextFreeFilter(xkbi); + *sendEvent = _XkbFilterISOLock(xkbi, filter, key, act); + break; + case XkbSA_MovePtr: + filter = _XkbNextFreeFilter(xkbi); + *sendEvent = _XkbFilterPointerMove(xkbi, filter, key, act); + break; + case XkbSA_PtrBtn: + case XkbSA_LockPtrBtn: + case XkbSA_SetPtrDflt: + filter = _XkbNextFreeFilter(xkbi); + *sendEvent = _XkbFilterPointerBtn(xkbi, filter, key, act); + break; + case XkbSA_Terminate: + *sendEvent = XkbDDXTerminateServer(dev, key, act); + break; + case XkbSA_SwitchScreen: + filter = _XkbNextFreeFilter(xkbi); + *sendEvent = _XkbFilterSwitchScreen(xkbi, filter, key, act); + break; + case XkbSA_SetControls: + case XkbSA_LockControls: + filter = _XkbNextFreeFilter(xkbi); + *sendEvent = _XkbFilterControls(xkbi, filter, key, act); + break; + case XkbSA_ActionMessage: + filter = _XkbNextFreeFilter(xkbi); + *sendEvent = _XkbFilterActionMessage(xkbi, filter, key, act); + break; + case XkbSA_RedirectKey: + filter = _XkbNextFreeFilter(xkbi); + /* redirect actions must create a new DeviceEvent. The + * source device id for this event cannot be obtained from + * xkbi, so we pass it here explicitly. The field deviceid + * equals to xkbi->device->id. */ + filter->priv = event->sourceid; + *sendEvent = _XkbFilterRedirectKey(xkbi, filter, key, act); + break; + case XkbSA_DeviceBtn: + case XkbSA_LockDeviceBtn: + filter = _XkbNextFreeFilter(xkbi); + *sendEvent = _XkbFilterDeviceBtn(xkbi, filter, key, act); + break; + case XkbSA_XFree86Private: + filter = _XkbNextFreeFilter(xkbi); + *sendEvent = _XkbFilterXF86Private(xkbi, filter, key, act); + break; + } +} + void XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent *event) { @@ -1208,7 +1282,6 @@ XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent *event) int sendEvent; Bool genStateNotify; XkbAction act; - XkbFilterPtr filter; Bool keyEvent; Bool pressEvent; ProcessInputProc backupproc; @@ -1236,74 +1309,9 @@ XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent *event) act = XkbGetButtonAction(kbd, dev, key); key |= BTN_ACT_FLAG; } + sendEvent = _XkbApplyFilters(xkbi, key, &act); - if (sendEvent) { - switch (act.type) { - case XkbSA_SetMods: - case XkbSA_SetGroup: - filter = _XkbNextFreeFilter(xkbi); - sendEvent = _XkbFilterSetState(xkbi, filter, key, &act); - break; - case XkbSA_LatchMods: - case XkbSA_LatchGroup: - filter = _XkbNextFreeFilter(xkbi); - sendEvent = _XkbFilterLatchState(xkbi, filter, key, &act); - break; - case XkbSA_LockMods: - case XkbSA_LockGroup: - filter = _XkbNextFreeFilter(xkbi); - sendEvent = _XkbFilterLockState(xkbi, filter, key, &act); - break; - case XkbSA_ISOLock: - filter = _XkbNextFreeFilter(xkbi); - sendEvent = _XkbFilterISOLock(xkbi, filter, key, &act); - break; - case XkbSA_MovePtr: - filter = _XkbNextFreeFilter(xkbi); - sendEvent = _XkbFilterPointerMove(xkbi, filter, key, &act); - break; - case XkbSA_PtrBtn: - case XkbSA_LockPtrBtn: - case XkbSA_SetPtrDflt: - filter = _XkbNextFreeFilter(xkbi); - sendEvent = _XkbFilterPointerBtn(xkbi, filter, key, &act); - break; - case XkbSA_Terminate: - sendEvent = XkbDDXTerminateServer(dev, key, &act); - break; - case XkbSA_SwitchScreen: - filter = _XkbNextFreeFilter(xkbi); - sendEvent = _XkbFilterSwitchScreen(xkbi, filter, key, &act); - break; - case XkbSA_SetControls: - case XkbSA_LockControls: - filter = _XkbNextFreeFilter(xkbi); - sendEvent = _XkbFilterControls(xkbi, filter, key, &act); - break; - case XkbSA_ActionMessage: - filter = _XkbNextFreeFilter(xkbi); - sendEvent = _XkbFilterActionMessage(xkbi, filter, key, &act); - break; - case XkbSA_RedirectKey: - filter = _XkbNextFreeFilter(xkbi); - /* redirect actions must create a new DeviceEvent. The - * source device id for this event cannot be obtained from - * xkbi, so we pass it here explicitly. The field deviceid - * equals to xkbi->device->id. */ - filter->priv = event->sourceid; - sendEvent = _XkbFilterRedirectKey(xkbi, filter, key, &act); - break; - case XkbSA_DeviceBtn: - case XkbSA_LockDeviceBtn: - filter = _XkbNextFreeFilter(xkbi); - sendEvent = _XkbFilterDeviceBtn(xkbi, filter, key, &act); - break; - case XkbSA_XFree86Private: - filter = _XkbNextFreeFilter(xkbi); - sendEvent = _XkbFilterXF86Private(xkbi, filter, key, &act); - break; - } - } + XkbActionGetFilter(dev, event, key, &act, &sendEvent); } else { if (!keyEvent) -- cgit v1.2.3