diff options
author | Daniel Stone <daniels@collabora.com> | 2015-11-20 15:37:28 +0000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2015-11-24 11:36:26 +1000 |
commit | 2e61901e46d28ce2f436219ad1a495aa0dcd0fba (patch) | |
tree | 42d101caccbd8979e761bf782aaf1a7dbb797ab0 | |
parent | 71ba82690158f46d50a455e69a83ee0d685bb274 (diff) |
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 <daniels@collabora.com>
Tested-by: Giulio Camuffo <giuliocamuffo@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | xkb/xkbActions.c | 144 |
1 files changed, 76 insertions, 68 deletions
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) |