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