Save processInputProc before wrapping it and restore it later, instead of
using a hardcoded ProcessKeyboardEvent. Otherwise we lose the ability to process DeviceKeyEvents after the first key press. This should be the correct fix now.
This commit is contained in:
		
							parent
							
								
									f6f3322fc7
								
							
						
					
					
						commit
						4d5df14f2c
					
				|  | @ -241,7 +241,8 @@ typedef struct | ||||||
| 	oldprocs->unwrapProc = device->unwrapProc; \ | 	oldprocs->unwrapProc = device->unwrapProc; \ | ||||||
| 	device->unwrapProc = unwrapproc; | 	device->unwrapProc = unwrapproc; | ||||||
| 
 | 
 | ||||||
| #define UNWRAP_PROCESS_INPUT_PROC(device, oldprocs) \ | #define UNWRAP_PROCESS_INPUT_PROC(device, oldprocs, backupproc) \ | ||||||
|  |         backupproc = device->public.processInputProc; \ | ||||||
| 	device->public.processInputProc = oldprocs->processInputProc; \ | 	device->public.processInputProc = oldprocs->processInputProc; \ | ||||||
| 	device->public.realInputProc = oldprocs->realInputProc; \ | 	device->public.realInputProc = oldprocs->realInputProc; \ | ||||||
| 	device->unwrapProc = oldprocs->unwrapProc; | 	device->unwrapProc = oldprocs->unwrapProc; | ||||||
|  |  | ||||||
|  | @ -49,10 +49,11 @@ xkbUnwrapProc(DeviceIntPtr device, DeviceHandleProc proc, | ||||||
| { | { | ||||||
|     xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(device); |     xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(device); | ||||||
|     ProcessInputProc tmp = device->public.processInputProc; |     ProcessInputProc tmp = device->public.processInputProc; | ||||||
|  |     ProcessInputProc dummy; /* unused, but neede for macro */ | ||||||
|     if(xkbPrivPtr->unwrapProc) |     if(xkbPrivPtr->unwrapProc) | ||||||
| 	xkbPrivPtr->unwrapProc = NULL; | 	xkbPrivPtr->unwrapProc = NULL; | ||||||
| 
 | 
 | ||||||
|     UNWRAP_PROCESS_INPUT_PROC(device,xkbPrivPtr); |     UNWRAP_PROCESS_INPUT_PROC(device,xkbPrivPtr, dummy); | ||||||
|     proc(device,data); |     proc(device,data); | ||||||
|     WRAP_PROCESS_INPUT_PROC(device,xkbPrivPtr, |     WRAP_PROCESS_INPUT_PROC(device,xkbPrivPtr, | ||||||
| 			    tmp,xkbUnwrapProc); | 			    tmp,xkbUnwrapProc); | ||||||
|  | @ -867,6 +868,7 @@ int		x,y; | ||||||
| XkbStateRec	old; | XkbStateRec	old; | ||||||
| unsigned	mods,mask,oldCoreState = 0,oldCorePrevState = 0; | unsigned	mods,mask,oldCoreState = 0,oldCorePrevState = 0; | ||||||
| xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(xkbi->device); | xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(xkbi->device); | ||||||
|  | ProcessInputProc backupproc; | ||||||
| 
 | 
 | ||||||
|     /* never actually used uninitialised, but gcc isn't smart enough
 |     /* never actually used uninitialised, but gcc isn't smart enough
 | ||||||
|      * to work that out. */ |      * to work that out. */ | ||||||
|  | @ -919,10 +921,10 @@ xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(xkbi->device); | ||||||
| 
 | 
 | ||||||
| 	realMods = xkbi->device->key->modifierMap[ev.u.u.detail]; | 	realMods = xkbi->device->key->modifierMap[ev.u.u.detail]; | ||||||
| 	xkbi->device->key->modifierMap[ev.u.u.detail] = 0; | 	xkbi->device->key->modifierMap[ev.u.u.detail] = 0; | ||||||
| 	UNWRAP_PROCESS_INPUT_PROC(xkbi->device,xkbPrivPtr); | 	UNWRAP_PROCESS_INPUT_PROC(xkbi->device,xkbPrivPtr, backupproc); | ||||||
| 	xkbi->device->public.processInputProc(&ev,xkbi->device,1); | 	xkbi->device->public.processInputProc(&ev,xkbi->device,1); | ||||||
| 	COND_WRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr, | 	COND_WRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr, | ||||||
| 				     ProcessKeyboardEvent,xkbUnwrapProc); | 				     backupproc,xkbUnwrapProc); | ||||||
| 	xkbi->device->key->modifierMap[ev.u.u.detail] = realMods; | 	xkbi->device->key->modifierMap[ev.u.u.detail] = realMods; | ||||||
| 	 | 	 | ||||||
| 	if ( mask || mods ) { | 	if ( mask || mods ) { | ||||||
|  | @ -960,10 +962,10 @@ xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(xkbi->device); | ||||||
| 
 | 
 | ||||||
| 	realMods = xkbi->device->key->modifierMap[ev.u.u.detail]; | 	realMods = xkbi->device->key->modifierMap[ev.u.u.detail]; | ||||||
| 	xkbi->device->key->modifierMap[ev.u.u.detail] = 0; | 	xkbi->device->key->modifierMap[ev.u.u.detail] = 0; | ||||||
| 	UNWRAP_PROCESS_INPUT_PROC(xkbi->device,xkbPrivPtr); | 	UNWRAP_PROCESS_INPUT_PROC(xkbi->device,xkbPrivPtr, backupproc); | ||||||
| 	xkbi->device->public.processInputProc(&ev,xkbi->device,1); | 	xkbi->device->public.processInputProc(&ev,xkbi->device,1); | ||||||
| 	COND_WRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr, | 	COND_WRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr, | ||||||
| 				     ProcessKeyboardEvent,xkbUnwrapProc); | 				     backupproc,xkbUnwrapProc); | ||||||
| 	xkbi->device->key->modifierMap[ev.u.u.detail] = realMods; | 	xkbi->device->key->modifierMap[ev.u.u.detail] = realMods; | ||||||
| 
 | 
 | ||||||
| 	if ( mask || mods ) { | 	if ( mask || mods ) { | ||||||
|  | @ -1155,6 +1157,7 @@ Bool		pressEvent; | ||||||
| #ifdef XINPUT | #ifdef XINPUT | ||||||
| Bool		xiEvent; | Bool		xiEvent; | ||||||
| #endif | #endif | ||||||
|  | ProcessInputProc backupproc; | ||||||
|      |      | ||||||
| xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(dev); | xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(dev); | ||||||
| 
 | 
 | ||||||
|  | @ -1297,10 +1300,10 @@ xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(dev); | ||||||
| 	if (keyEvent) { | 	if (keyEvent) { | ||||||
| 	    realMods = keyc->modifierMap[key]; | 	    realMods = keyc->modifierMap[key]; | ||||||
| 	    keyc->modifierMap[key] = 0; | 	    keyc->modifierMap[key] = 0; | ||||||
| 	    UNWRAP_PROCESS_INPUT_PROC(dev,xkbPrivPtr); | 	    UNWRAP_PROCESS_INPUT_PROC(dev,xkbPrivPtr, backupproc); | ||||||
| 	    dev->public.processInputProc(xE,dev,count); | 	    dev->public.processInputProc(xE,dev,count); | ||||||
| 	    COND_WRAP_PROCESS_INPUT_PROC(dev, xkbPrivPtr, | 	    COND_WRAP_PROCESS_INPUT_PROC(dev, xkbPrivPtr, | ||||||
| 					 ProcessKeyboardEvent,xkbUnwrapProc); | 					 backupproc,xkbUnwrapProc); | ||||||
| 	    keyc->modifierMap[key] = realMods; | 	    keyc->modifierMap[key] = realMods; | ||||||
| 	} | 	} | ||||||
| 	else CoreProcessPointerEvent(xE,dev,count); | 	else CoreProcessPointerEvent(xE,dev,count); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue