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:
parent
71ba826901
commit
2e61901e46
144
xkb/xkbActions.c
144
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)
|
||||
|
|
Loading…
Reference in New Issue