On Mon, Nov 24, 2014 at 10:17:32PM +0000, Daniel Stone wrote: > 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 <[email protected]> > Tested-by: Giulio Camuffo <[email protected]>
Reviewed-by: Peter Hutterer <[email protected]> Cheers, Peter > --- > 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 > > _______________________________________________ > [email protected]: X.Org development > Archives: http://lists.x.org/archives/xorg-devel > Info: http://lists.x.org/mailman/listinfo/xorg-devel > _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
