From 7e688f1a7db4dc493a1609271d478152dded759e Mon Sep 17 00:00:00 2001 From: Daniel Martin Date: Sun, 2 Mar 2014 17:59:53 +0100 Subject: [PATCH] HACK: Handle kbd events at slave pointers Bugzilla: Bug 49950 - Logitech Unifying Receiver and wrong keyboard layout https://bugs.freedesktop.org/show_bug.cgi?id=49950 --- Xi/exevents.c | 5 +++++ dix/getevents.c | 17 +++++++++++++++++ include/inputstr.h | 1 + 3 files changed, 23 insertions(+) diff --git a/Xi/exevents.c b/Xi/exevents.c index e9f670e..58a2cf6 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -665,7 +665,12 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to, DeepCopyFeedbackClasses(from, to); if ((dce->flags & DEVCHANGE_KEYBOARD_EVENT)) +#if 0 DeepCopyKeyboardClasses(from, to); +#else + /* We need to copy to MASTER_KEYBOARD. Didn't worked with 'to'. */ + DeepCopyKeyboardClasses(from, GetMaster(from, MASTER_KEYBOARD)); +#endif if ((dce->flags & DEVCHANGE_POINTER_EVENT)) DeepCopyPointerClasses(from, to); } diff --git a/dix/getevents.c b/dix/getevents.c index ffa89fa..5b2e37c 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -706,12 +706,29 @@ UpdateFromMaster(InternalEvent *events, DeviceIntPtr dev, int type, { DeviceIntPtr master; +#if 0 master = GetMaster(dev, (type & DEVCHANGE_POINTER_EVENT) ? MASTER_POINTER : MASTER_KEYBOARD); if (master && master->last.slave != dev) { +#else + /* Don't guess the master upon the event type. Use MASTER_ATTACHED, + * otherwise we'll never get a DeviceChangedEvent(reason:SlaveSwith). */ + master = GetMaster(dev, MASTER_ATTACHED); + + /* Need to track the slave event type. Other we'le never get a + * DeviceChangedEvent(reason:SlaveSwith) for the 'keyboard' if the + * 'pointer' has been touched before. */ + int slave_type = (type & DEVCHANGE_KEYBOARD_EVENT) | + (type & DEVCHANGE_POINTER_EVENT); + + if (master && + ((master->last.slave != dev) || + (master->last.slave == dev && master->last.slave_type != slave_type))) { + master->last.slave_type = slave_type; +#endif CreateClassesChangedEvent(events, master, dev, type | DEVCHANGE_SLAVE_SWITCH); if (IsPointerDevice(master)) { 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.0