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.
(cherry picked from commit 4d5df14f2c
)
This commit is contained in:
parent
8b9481a113
commit
91077bfc50
|
@ -262,7 +262,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);
|
||||||
|
@ -851,6 +852,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. */
|
||||||
|
@ -903,10 +905,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 ) {
|
||||||
|
@ -944,10 +946,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 ) {
|
||||||
|
@ -1140,6 +1142,7 @@ Bool pressEvent;
|
||||||
#ifdef XINPUT
|
#ifdef XINPUT
|
||||||
Bool xiEvent;
|
Bool xiEvent;
|
||||||
#endif
|
#endif
|
||||||
|
ProcessInputProc backupproc;
|
||||||
|
|
||||||
xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(dev);
|
xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(dev);
|
||||||
|
|
||||||
|
@ -1284,10 +1287,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