When having a slave pointer with a XIKeyPress class and we touch the pointer part before the keyboard part, we never get a DeviceChangedEvent and therefore never trigger DeepCopyDeviceClasses() - never get a pending keyboard layout change applied.
Track the last used type of the slave device and raise a DeviceChangedEvent even if the slave didn't, but the type (i.e. DEVCHANGE_KEYBOARD_EVENT or DEVCHANGE_POINTER_EVENT) changed. Signed-off-by: Daniel Martin <[email protected]> --- dix/getevents.c | 5 ++++- include/inputstr.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/dix/getevents.c b/dix/getevents.c index bab5ac3..131b15f 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -708,7 +708,9 @@ UpdateFromMaster(InternalEvent *events, DeviceIntPtr dev, int type, master = GetMaster(dev, MASTER_ATTACHED); - if (master && master->last.slave != dev) { + if (master && + ((master->last.slave != dev) || + (master->last.slave == dev && master->last.slave_type != type))) { CreateClassesChangedEvent(events, master, dev, type | DEVCHANGE_SLAVE_SWITCH); if (IsPointerDevice(master)) { @@ -716,6 +718,7 @@ UpdateFromMaster(InternalEvent *events, DeviceIntPtr dev, int type, master->last.numValuators = dev->last.numValuators; } master->last.slave = dev; + master->last.slave_type = type; (*num_events)++; events++; } diff --git a/include/inputstr.h b/include/inputstr.h index f6cfb04..214e33c 100644 --- a/include/inputstr.h +++ b/include/inputstr.h @@ -577,6 +577,7 @@ typedef struct _DeviceIntRec { double valuators[MAX_VALUATORS]; int numValuators; DeviceIntPtr slave; + int slave_type; ValuatorMask *scroll; int num_touches; /* size of the touches array */ DDXTouchPointInfoPtr touches; -- 1.9.1 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
