XKB: Remove duplicate keymap-copying loop

Previously we had:
    foreach (device + slaves of device) {
        XkbCopyDeviceKeymap(i, device);
        [...]
    }
    if (device was last slave of its MD) {
        XkbCopyDeviceKeymap(master, device);
    }
and now:
    foreach (device + slaves of device + MD if device was last slave) {
        XkbCopyDeviceKeymap(i, device);
        [...]
    }

As an extra bonus, when changing the keymap on a slave device, we now
ensure the LED info on the master is kept in sync.

Signed-off-by: Daniel Stone <daniel@fooishbar.org>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Daniel Stone 2011-05-03 02:59:53 +01:00 committed by Peter Hutterer
parent b8540d18c7
commit c7634498d4

View File

@ -5586,6 +5586,7 @@ ProcXkbGetKbdByName(ClientPtr client)
{ {
DeviceIntPtr dev; DeviceIntPtr dev;
DeviceIntPtr tmpd; DeviceIntPtr tmpd;
DeviceIntPtr master;
xkbGetKbdByNameReply rep = {0}; xkbGetKbdByNameReply rep = {0};
xkbGetMapReply mrep = {0}; xkbGetMapReply mrep = {0};
xkbGetCompatMapReply crep = {0}; xkbGetCompatMapReply crep = {0};
@ -5611,6 +5612,7 @@ ProcXkbGetKbdByName(ClientPtr client)
return BadAccess; return BadAccess;
CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, access_mode); CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, access_mode);
master = GetMaster(dev, MASTER_KEYBOARD);
xkb = dev->key->xkbInfo->desc; xkb = dev->key->xkbInfo->desc;
status= Success; status= Success;
@ -5869,8 +5871,12 @@ ProcXkbGetKbdByName(ClientPtr client)
} }
xkb->ctrls->num_groups= nTG; xkb->ctrls->num_groups= nTG;
/* Update the map and LED info on the device itself, as well as
* any slaves if it's an MD, or its MD if it's an SD and was the
* last device used on that MD. */
for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) { for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
if (tmpd != dev && GetMaster(tmpd, MASTER_KEYBOARD) != dev) if (tmpd != dev && GetMaster(tmpd, MASTER_KEYBOARD) != dev &&
(tmpd != master || dev != master->lastSlave))
continue; continue;
if (tmpd != dev) if (tmpd != dev)
@ -5900,12 +5906,6 @@ ProcXkbGetKbdByName(ClientPtr client)
if (geom_changed) if (geom_changed)
nkn.changed|= XkbNKN_GeometryMask; nkn.changed|= XkbNKN_GeometryMask;
XkbSendNewKeyboardNotify(dev,&nkn); XkbSendNewKeyboardNotify(dev,&nkn);
if (!IsMaster(dev)) {
DeviceIntPtr master = GetMaster(dev, MASTER_KEYBOARD);
if (master && master->lastSlave == dev)
XkbCopyDeviceKeymap(master, dev);
}
} }
if ((new!=NULL)&&(new!=xkb)) { if ((new!=NULL)&&(new!=xkb)) {
XkbFreeKeyboard(new,XkbAllComponentsMask,TRUE); XkbFreeKeyboard(new,XkbAllComponentsMask,TRUE);