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 | void | ||||||
| XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent *event) | XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent *event) | ||||||
| { | { | ||||||
|  | @ -1208,7 +1282,6 @@ XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent *event) | ||||||
|     int sendEvent; |     int sendEvent; | ||||||
|     Bool genStateNotify; |     Bool genStateNotify; | ||||||
|     XkbAction act; |     XkbAction act; | ||||||
|     XkbFilterPtr filter; |  | ||||||
|     Bool keyEvent; |     Bool keyEvent; | ||||||
|     Bool pressEvent; |     Bool pressEvent; | ||||||
|     ProcessInputProc backupproc; |     ProcessInputProc backupproc; | ||||||
|  | @ -1236,74 +1309,9 @@ XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent *event) | ||||||
|             act = XkbGetButtonAction(kbd, dev, key); |             act = XkbGetButtonAction(kbd, dev, key); | ||||||
|             key |= BTN_ACT_FLAG; |             key |= BTN_ACT_FLAG; | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|         sendEvent = _XkbApplyFilters(xkbi, key, &act); |         sendEvent = _XkbApplyFilters(xkbi, key, &act); | ||||||
|         if (sendEvent) { |         XkbActionGetFilter(dev, event, key, &act, &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; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
|         if (!keyEvent) |         if (!keyEvent) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue