c2c05e9e2f
xserver-1.9.99.1-xkb-if-the-keymap-failed-to-compile-load-the-default.patch (#676827 fix)
70 lines
2.2 KiB
Diff
70 lines
2.2 KiB
Diff
From d3499556d8d83396fa2585bd00371a81e086be36 Mon Sep 17 00:00:00 2001
|
|
From: Peter Hutterer <peter.hutterer@who-t.net>
|
|
Date: Thu, 10 Feb 2011 15:12:14 +1000
|
|
Subject: [PATCH] xkb: if the keymap failed to compile, load the default keymap instead.
|
|
|
|
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 <peter.hutterer@who-t.net>
|
|
Reviewed-by: Dan Nicholson <dbn.lists@gmail.com>
|
|
---
|
|
xkb/ddxLoad.c | 23 ++++++++++++++++++++++-
|
|
1 files changed, 22 insertions(+), 1 deletions(-)
|
|
|
|
diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c
|
|
index b968c43..ac587fc 100644
|
|
--- a/xkb/ddxLoad.c
|
|
+++ b/xkb/ddxLoad.c
|
|
@@ -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;
|
|
}
|
|
--
|
|
1.7.4
|
|
|