[PATCH v2 4/4] xkb: push locked modifier state down to attached slave devices
Daniel Stone
daniel at fooishbar.org
Mon Mar 3 06:18:29 PST 2014
Hi,
On 3 March 2014 05:44, Peter Hutterer <peter.hutterer at who-t.net> wrote:
> 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.
This and 3/4 look fine to me, but the consting of StateNotify is
pretty incongruous. Any reason why that was done?
Cheers,
Daniel
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> dix/devices.c | 3 +++
> include/xkbsrv.h | 4 ++++
> xkb/xkbActions.c | 20 ++++++++++++++++++++
> 3 files changed, 27 insertions(+)
>
> diff --git a/dix/devices.c b/dix/devices.c
> index 1c86d52..ab923d5 100644
> --- a/dix/devices.c
> +++ b/dix/devices.c
> @@ -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);
> }
>
> diff --git a/include/xkbsrv.h b/include/xkbsrv.h
> index 0299327..5c5459f 100644
> --- a/include/xkbsrv.h
> +++ b/include/xkbsrv.h
> @@ -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 */ ,
> diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
> index 9a257f5..17f2807 100644
> --- a/xkb/xkbActions.c
> +++ b/xkb/xkbActions.c
> @@ -1176,6 +1176,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 = _XkbWantStateNotify(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)
> {
> int key, bit, i;
> @@ -1329,6 +1348,7 @@ XkbHandleActions(DeviceIntPtr dev, DeviceIntPtr kbd, DeviceEvent *event)
> }
>
> _XkbApplyState(dev, genStateNotify, event->type, key);
> + XkbPushLockedStateToSlaves(dev, event->type, key);
> }
>
> int
> --
> 1.8.4.2
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
More information about the xorg-devel
mailing list