[PATCH 1/3] XKB: Split filter execution into a separate function
Daniel Stone
daniels at collabora.com
Mon Nov 24 14:17:32 PST 2014
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 at collabora.com>
Tested-by: Giulio Camuffo <giuliocamuffo at gmail.com>
---
xkb/xkbActions.c | 144 +++++++++++++++++++++++++++++--------------------------
1 file changed, 76 insertions(+), 68 deletions(-)
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index c44f44b..c6cbf56 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -1192,6 +1192,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)
{
@@ -1201,7 +1275,6 @@ XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent *event)
int sendEvent;
Bool genStateNotify;
XkbAction act;
- XkbFilterPtr filter;
Bool keyEvent;
Bool pressEvent;
ProcessInputProc backupproc;
@@ -1229,74 +1302,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)
--
2.1.0
More information about the xorg-devel
mailing list