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:
parent
b8540d18c7
commit
c7634498d4
14
xkb/xkb.c
14
xkb/xkb.c
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue