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