XKB: Fix processInputProc wrapping
If input processing is frozen, only wrap realInputProc: don't smash processInputProc as well. When input processing is thawed, pIP will be rewrapped correctly. This supersedes the previous workaround in 50e80c9. Signed-off-by: Daniel Stone <daniel@fooishbar.org>
This commit is contained in:
		
							parent
							
								
									a4d0349411
								
							
						
					
					
						commit
						37b1258f0a
					
				| 
						 | 
					@ -237,6 +237,14 @@ typedef struct	_XkbSrvLedInfo {
 | 
				
			||||||
typedef struct
 | 
					typedef struct
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ProcessInputProc processInputProc;
 | 
					    ProcessInputProc processInputProc;
 | 
				
			||||||
 | 
					    /* If processInputProc is set to something different than realInputProc,
 | 
				
			||||||
 | 
					     * UNWRAP and COND_WRAP will not touch processInputProc and update only
 | 
				
			||||||
 | 
					     * realInputProc.  This ensures that
 | 
				
			||||||
 | 
					     *   processInputProc == (frozen ? EnqueueEvent : realInputProc)
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * WRAP_PROCESS_INPUT_PROC should only be called during initialization,
 | 
				
			||||||
 | 
					     * since it may destroy this invariant.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    ProcessInputProc realInputProc;
 | 
					    ProcessInputProc realInputProc;
 | 
				
			||||||
    DeviceUnwrapProc unwrapProc;
 | 
					    DeviceUnwrapProc unwrapProc;
 | 
				
			||||||
} xkbDeviceInfoRec, *xkbDeviceInfoPtr;
 | 
					} xkbDeviceInfoRec, *xkbDeviceInfoPtr;
 | 
				
			||||||
| 
						 | 
					@ -254,14 +262,14 @@ typedef struct
 | 
				
			||||||
	    device->public.processInputProc = proc; \
 | 
						    device->public.processInputProc = proc; \
 | 
				
			||||||
	oldprocs->processInputProc = \
 | 
						oldprocs->processInputProc = \
 | 
				
			||||||
	oldprocs->realInputProc = device->public.realInputProc; \
 | 
						oldprocs->realInputProc = device->public.realInputProc; \
 | 
				
			||||||
	if (proc != device->public.enqueueInputProc) \
 | 
						device->public.realInputProc = proc; \
 | 
				
			||||||
		device->public.realInputProc = proc; \
 | 
					 | 
				
			||||||
	oldprocs->unwrapProc = device->unwrapProc; \
 | 
						oldprocs->unwrapProc = device->unwrapProc; \
 | 
				
			||||||
	device->unwrapProc = unwrapproc;
 | 
						device->unwrapProc = unwrapproc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define UNWRAP_PROCESS_INPUT_PROC(device, oldprocs, backupproc) \
 | 
					#define UNWRAP_PROCESS_INPUT_PROC(device, oldprocs, backupproc) \
 | 
				
			||||||
        backupproc = device->public.processInputProc; \
 | 
					        backupproc = device->public.realInputProc; \
 | 
				
			||||||
	device->public.processInputProc = oldprocs->processInputProc; \
 | 
						if (device->public.processInputProc == device->public.realInputProc)\
 | 
				
			||||||
 | 
						    device->public.processInputProc = oldprocs->realInputProc; \
 | 
				
			||||||
	device->public.realInputProc = oldprocs->realInputProc; \
 | 
						device->public.realInputProc = oldprocs->realInputProc; \
 | 
				
			||||||
	device->unwrapProc = oldprocs->unwrapProc;
 | 
						device->unwrapProc = oldprocs->unwrapProc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,15 +49,14 @@ xkbUnwrapProc(DeviceIntPtr device, DeviceHandleProc proc,
 | 
				
			||||||
                   pointer data)
 | 
					                   pointer data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(device);
 | 
					    xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(device);
 | 
				
			||||||
    ProcessInputProc tmp = device->public.processInputProc;
 | 
					    ProcessInputProc backupproc;
 | 
				
			||||||
    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, dummy);
 | 
					    UNWRAP_PROCESS_INPUT_PROC(device,xkbPrivPtr, backupproc);
 | 
				
			||||||
    proc(device,data);
 | 
					    proc(device,data);
 | 
				
			||||||
    WRAP_PROCESS_INPUT_PROC(device,xkbPrivPtr,
 | 
					    COND_WRAP_PROCESS_INPUT_PROC(device,xkbPrivPtr,
 | 
				
			||||||
			    tmp,xkbUnwrapProc);
 | 
									 backupproc,xkbUnwrapProc);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue