Hi, As X starts, it will attempt to detect features from the kbd(8) setting--for example, us.dvorak will enable dvorak in X, and fr.dvorak will enable French dvorak in X. However, it detects these features with equality checks, which will fail if multiple options are set, as in the case of us.dvorak.swapctrlcaps or fr.dvorak.swapctrlcaps.
Instead of checking for equality, this diff instead checks if the bits are set. Now us.dvorak.swapctrlcaps and fr.dvorak.swapctrlcaps work, us.swapctrlcaps.iopener swaps ctrl/caps, and the ones that already worked (de.nodead, etc) still do. This was reported on misc@ by "Sevan / Venture37" back in June. ok? Index: config/wscons.c =================================================================== RCS file: /cvs/xenocara/xserver/config/wscons.c,v retrieving revision 1.14 diff -u -p -r1.14 wscons.c --- config/wscons.c 15 Jan 2015 01:30:40 -0000 1.14 +++ config/wscons.c 25 Dec 2015 21:37:21 -0000 @@ -139,7 +139,7 @@ wscons_add_keyboard(void) break; } for (i = 0; kbdvar[i].val; i++) - if (wsenc == kbdvar[i].val || KB_VARIANT(wsenc) == kbdvar[i].val) { + if ((wsenc & kbdvar[i].val) == kbdvar[i].val) { LogMessageVerb(X_INFO, 3, "wskbd: using variant %s\n", kbdvar[i].name); input_options = input_option_new(input_options, @@ -147,7 +147,7 @@ wscons_add_keyboard(void) break; } for (i = 0; kbdopt[i].val; i++) - if (KB_VARIANT(wsenc) == kbdopt[i].val) { + if (KB_VARIANT(wsenc) & kbdopt[i].val) { LogMessageVerb(X_INFO, 3, "wskbd: using option %s\n", kbdopt[i].name); input_options = input_option_new(input_options,