Diogo Galvao writes:
> On Thu, Nov 1, 2018 at 10:15 PM Diogo Galvao <diog...@gmail.com> wrote:
> > So the condition ((wsenc & kbdvar[i].val) == kbdvar[i].val) ends up
> > being true for KB_BR & KB_SF, therefore "fr" variant gets configured.
> > That bitmasking was introduced in revision 1.15 along with a bitmask for
> > choosing keyboard options:
> >
> > https://cvsweb.openbsd.org/cgi-bin/cvsweb/xenocara/xserver/config/wscons.c#
> rev1.15
> >
> > I used this small patch to get back part of the old behavior:

Thanks for the bug report (and the reminder).

The code is indeed broken in the way you describe. However, you're also
correct that reverting it would re-break the case where multiple options
are set, like us.dvorak.swapctrlcaps.

I came up with the following diff. Please give it a try.

In my tests, the following kbd(8) settings are no longer marked "using
variant fr":

ua
pt
pt.apple
lt
la
br
tr
pl
si
lv
nl
is
ee

tr.nodead, nl.nodead, is.nodead, and ee.nodead become "variant nodeadkeys"
instead of "variant fr_nodeadkeys".

cf becomes "variant fr-legacy" instead of "variant fr".

cf.nodead becomes "variant fr-legacy" instead of "variant fr_nodeadkeys".

The remainder of the 54 keyboards listed by kbd -l for pc-xt/pc-at and
usb are unchanged.

All this seems like the result we want.

ok?


Index: xserver/config/wscons.c
===================================================================
RCS file: /cvs/xenocara/xserver/config/wscons.c,v
retrieving revision 1.22
diff -u -p -r1.22 wscons.c
--- xserver/config/wscons.c     30 Jul 2018 16:00:39 -0000      1.22
+++ xserver/config/wscons.c     3 Apr 2019 15:50:16 -0000
@@ -139,7 +139,9 @@ wscons_add_keyboard(void)
             break;
         }
     for (i = 0; kbdvar[i].val; i++)
-        if ((wsenc & kbdvar[i].val) == kbdvar[i].val) {
+        if ((wsenc & kbdvar[i].val) == kbdvar[i].val &&
+            (KB_ENCODING(wsenc) == KB_ENCODING(kbdvar[i].val) ||
+            !KB_ENCODING(kbdvar[i].val))) {
             LogMessageVerb(X_INFO, 3, "wskbd: using variant %s\n",
                            kbdvar[i].name);
             input_options = input_option_new(input_options,

Reply via email to