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>
This commit is contained in:
Daniel Stone 2015-11-20 15:37:28 +00:00 committed by Peter Hutterer
parent 71ba826901
commit 2e61901e46
1 changed files with 76 additions and 68 deletions

View File

@ -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)