[PATCH v2 4/4] xkb: push locked modifier state down to attached slave devices
Peter Hutterer
peter.hutterer at who-t.net
Mon Mar 3 17:47:53 PST 2014
On Mon, Mar 03, 2014 at 02:18:29PM +0000, Daniel Stone wrote:
> 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?
an earlier version of this fix re-used the event struct for all devices,
that was before I factored everything out into functions. I'm fine to drop
it, it doesn't hurt either way IMO.
Cheers,
Peter
>
> > 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