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
Block a user