xkb: push locked modifier state down to attached slave devices

Whenever the master changes, push the locked modifier state to the attached
slave devices, then update the indicators. This way, when NumLock or CapsLock
are hit on any device, the LED will light up on all devices. Likewise, a new
keyboard attached to a master device will light up with the correct
indicators.

The indicators are handled per-keyboard, depending on the layout, i.e. if one
keyboard has grp_led:num set, the NumLock LED won't light up on that keyboard.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Daniel Stone <daniel@fooishbar.org>
This commit is contained in:
Peter Hutterer 2014-02-26 16:20:08 +10:00
parent 656841798c
commit 45fb3a934d
3 changed files with 27 additions and 0 deletions

View File

@ -416,6 +416,8 @@ EnableDevice(DeviceIntPtr dev, BOOL sendevent)
XISendDeviceHierarchyEvent(flags);
}
if (!IsMaster(dev))
XkbPushLockedStateToSlaves(GetMaster(dev, MASTER_KEYBOARD), 0, 0);
RecalculateMasterButtons(dev);
/* initialise an idle timer for this device*/
@ -2649,6 +2651,7 @@ AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
dev->spriteInfo->paired = master;
dev->spriteInfo->spriteOwner = FALSE;
XkbPushLockedStateToSlaves(GetMaster(dev, MASTER_KEYBOARD), 0, 0);
RecalculateMasterButtons(master);
}

View File

@ -638,6 +638,10 @@ extern _X_EXPORT void XkbHandleActions(DeviceIntPtr /* dev */ ,
DeviceEvent * /* event */
);
extern void XkbPushLockedStateToSlaves(DeviceIntPtr /* master */,
int /* evtype */,
int /* key */);
extern _X_EXPORT Bool XkbEnableDisableControls(XkbSrvInfoPtr /* xkbi */ ,
unsigned long /* change */ ,
unsigned long /* newValues */ ,

View File

@ -1173,6 +1173,25 @@ _XkbApplyState(DeviceIntPtr dev, Bool genStateNotify, int evtype, int key)
}
}
void
XkbPushLockedStateToSlaves(DeviceIntPtr master, int evtype, int key)
{
DeviceIntPtr dev;
Bool genStateNotify;
nt_list_for_each_entry(dev, inputInfo.devices, next) {
if (!dev->key || GetMaster(dev, MASTER_KEYBOARD) != master)
continue;
genStateNotify = _XkbEnsureStateChange(dev->key->xkbInfo);
dev->key->xkbInfo->state.locked_mods =
master->key->xkbInfo->state.locked_mods;
_XkbApplyState(dev, genStateNotify, evtype, key);
}
}
void
XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent *event)
{
@ -1327,6 +1346,7 @@ XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent *event)
}
_XkbApplyState(dev, genStateNotify, event->type, key);
XkbPushLockedStateToSlaves(dev, event->type, key);
}
int