summaryrefslogtreecommitdiff
path: root/xkb
diff options
context:
space:
mode:
authorDaniel Stone <daniels@collabora.com>2015-11-20 15:37:28 +0000
committerPeter Hutterer <peter.hutterer@who-t.net>2015-11-24 11:36:26 +1000
commit2e61901e46d28ce2f436219ad1a495aa0dcd0fba (patch)
tree42d101caccbd8979e761bf782aaf1a7dbb797ab0 /xkb
parent71ba82690158f46d50a455e69a83ee0d685bb274 (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>
Diffstat (limited to 'xkb')
-rw-r--r--xkb/xkbActions.c144
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)