Skip to content

Commit

Permalink
xkb: if the keymap failed to compile, load the default keymap instead.
Browse files Browse the repository at this point in the history
We really need symbols, compat, keynames, vmods and types for a sensible keymap.

Try this in your xorg.conf.d snippets for all keyboards:
        Option "XkbLayout" "us"
        Option "XkbVariant" "nodeadkeys"

us(nodeadkeys) doesn't exist so xkbcomp provides everything but the symbols
map. We say we want everything but don't _need_ anything, the server happily
gives us a keymap with every key mapped to NoSymbol. This in turn isn't what
we want after all.

So instead, require symbols, compat, keynames, vmods and types from the
keymap and if that fails, load the default keymap instead. If that fails
too, all bets are off.

Signed-off-by: Peter Hutterer <[email protected]>
Reviewed-by: Dan Nicholson <[email protected]>
  • Loading branch information
whot committed Feb 13, 2011
1 parent 47d1d2f commit d349955
Showing 1 changed file with 22 additions and 1 deletion.
23 changes: 22 additions & 1 deletion xkb/ddxLoad.c
Original file line number Diff line number Diff line change
Expand Up @@ -470,13 +470,34 @@ XkbDescPtr
XkbCompileKeymap(DeviceIntPtr dev, XkbRMLVOSet *rmlvo)
{
XkbDescPtr xkb;
unsigned int need;

if (!dev || !rmlvo) {
LogMessage(X_ERROR, "XKB: No device or RMLVO specified\n");
return NULL;
}

xkb = XkbCompileKeymapForDevice(dev, rmlvo, 0);
/* These are the components we really really need */
need = XkmSymbolsMask | XkmCompatMapMask | XkmTypesMask |
XkmKeyNamesMask | XkmVirtualModsMask;


xkb = XkbCompileKeymapForDevice(dev, rmlvo, need);

if (!xkb) {
XkbRMLVOSet dflts;

/* we didn't get what we really needed. And that will likely leave
* us with a keyboard that doesn't work. Use the defaults instead */
LogMessage(X_ERROR, "XKB: Failed to load keymap. Loading default "
"keymap instead.\n");

XkbGetRulesDflts(&dflts);

xkb = XkbCompileKeymapForDevice(dev, &dflts, 0);

XkbFreeRMLVOSet(&dflts, FALSE);
}

return xkb;
}

0 comments on commit d349955

Please sign in to comment.