[PATCH] xkb: after making changes to the xkb ctrls, copy them back into kbdfeed.

Peter Hutterer peter.hutterer at who-t.net
Thu Jan 13 16:54:36 PST 2011


On Thu, Jan 13, 2011 at 07:05:52PM +0100, Dirk Wallenstein wrote:
> On Thu, Jan 13, 2011 at 01:45:02PM +1000, Peter Hutterer wrote:
> > enabled_ctrls_changes is nowhere near the usual event or config paths. So
> > this condition always evaluated to false and the memcpy would thus never
> > been hit. As a result, any modification to the XKB struct during
> > XkbUpdateDescActions was not reflected in the kbdfeed ctrls.
> > The flag that is set by XkbUpdateDescActions() if ctrls were changed are in
> > enabled_ctrls.
> > 
> > This mainly affected keyboard repeat control as XKB uses the kbdfeed ctrls,
> > not XKB's per_key_repeats, to determine if a key needs to be repeated. Thus,
> > adding a "repeat= False" to the XKB map of any action did not have any
> > effect.
> > 
> > Test case:
> > assign Mode_switch to any key that by default repeats, e.g. the menu key.
> > 
> >     key <COMP> {         [     Mode_switch ] };
> > 
> > Then modify the Mode_switch action to not repeat the key.
> > 
> >     interpret Mode_switch+AnyOfOrNone(all) {
> >         virtualModifier= AltGr;
> >         useModMapMods=level1;
> >         action= SetGroup(group=+1);
> >         // Add this line
> >         repeat= False;
> >     };
> > 
> > Though the flags are correctly reflected in the description loaded in the
> > server, the change is not handed back to the kbdfeed struct and XKB will
> > trigger softrepeats of this key.
> > 
> > This patch also adds two explanatory comments and an extra check, as this
> > path may be hit before the CtrlProc for the kbdfeed struct is set.
> > 
> > Red Hat Bug 537708 <https://bugzilla.redhat.com/show_bug.cgi?id=537708>
> > 
> > Also fixes broken auto-repeat of the backspace key in the colemak layout
> > (mapped to CapsLock).
> > 
> > X.Org Bug 16318 <http://bugs.freedesktop.org/show_bug.cgi?id=16318>
> > 
> > Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> > ---
> >  xkb/xkbUtils.c |    7 +++++--
> >  1 files changed, 5 insertions(+), 2 deletions(-)
> > 
> > diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
> > index 14dc784..23fe57e 100644
> > --- a/xkb/xkbUtils.c
> > +++ b/xkb/xkbUtils.c
> > @@ -342,15 +342,18 @@ CARD8 *			repeat;
> >      xkb= xkbi->desc;
> >      repeat= xkb->ctrls->per_key_repeat;
> >  
> > +    /* before letting XKB do any changes, copy the current core values */
> >      if (pXDev->kbdfeed)
> >  	memcpy(repeat,pXDev->kbdfeed->ctrl.autoRepeats,XkbPerKeyBitArraySize);
> >  
> >      XkbUpdateDescActions(xkb,first,num,changes);
> >  
> >      if ((pXDev->kbdfeed)&&
> > -	(changes->ctrls.enabled_ctrls_changes&XkbPerKeyRepeatMask)) {
> > +	(changes->ctrls.changed_ctrls&XkbPerKeyRepeatMask)) {
> > +        /* now copy the modified changes back to core */
> >          memcpy(pXDev->kbdfeed->ctrl.autoRepeats,repeat, XkbPerKeyBitArraySize);
> > -	(*pXDev->kbdfeed->CtrlProc)(pXDev, &pXDev->kbdfeed->ctrl);
> > +        if (pXDev->kbdfeed->CtrlProc)
> > +            (*pXDev->kbdfeed->CtrlProc)(pXDev, &pXDev->kbdfeed->ctrl);
> >      }
> >      return;
> >  }
> > -- 
> > 1.7.3.4
> > 
> 
> The continued condition could be indented an additional level.

that's the diff only (tab indentation), in the code it's properly aligned.
having said that, the new lines are space-indented instead of tab-indened.
Fixed to comply with the rest of the code.

> Tested-by: Dirk Wallenstein <halsmit at t-online.de>
> Reviewed-by: Dirk Wallenstein <halsmit at t-online.de>

thanks!

Cheers,
  Peter


More information about the xorg-devel mailing list