Peter Hutterer c2c05e9
From d3499556d8d83396fa2585bd00371a81e086be36 Mon Sep 17 00:00:00 2001
Peter Hutterer c2c05e9
From: Peter Hutterer <peter.hutterer@who-t.net>
Peter Hutterer c2c05e9
Date: Thu, 10 Feb 2011 15:12:14 +1000
Peter Hutterer c2c05e9
Subject: [PATCH] xkb: if the keymap failed to compile, load the default keymap instead.
Peter Hutterer c2c05e9
Peter Hutterer c2c05e9
We really need symbols, compat, keynames, vmods and types for a sensible keymap.
Peter Hutterer c2c05e9
Peter Hutterer c2c05e9
Try this in your xorg.conf.d snippets for all keyboards:
Peter Hutterer c2c05e9
        Option "XkbLayout" "us"
Peter Hutterer c2c05e9
        Option "XkbVariant" "nodeadkeys"
Peter Hutterer c2c05e9
Peter Hutterer c2c05e9
us(nodeadkeys) doesn't exist so xkbcomp provides everything but the symbols
Peter Hutterer c2c05e9
map. We say we want everything but don't _need_ anything, the server happily
Peter Hutterer c2c05e9
gives us a keymap with every key mapped to NoSymbol. This in turn isn't what
Peter Hutterer c2c05e9
we want after all.
Peter Hutterer c2c05e9
Peter Hutterer c2c05e9
So instead, require symbols, compat, keynames, vmods and types from the
Peter Hutterer c2c05e9
keymap and if that fails, load the default keymap instead. If that fails
Peter Hutterer c2c05e9
too, all bets are off.
Peter Hutterer c2c05e9
Peter Hutterer c2c05e9
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Peter Hutterer c2c05e9
Reviewed-by: Dan Nicholson <dbn.lists@gmail.com>
Peter Hutterer c2c05e9
---
Peter Hutterer c2c05e9
 xkb/ddxLoad.c |   23 ++++++++++++++++++++++-
Peter Hutterer c2c05e9
 1 files changed, 22 insertions(+), 1 deletions(-)
Peter Hutterer c2c05e9
Peter Hutterer c2c05e9
diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c
Peter Hutterer c2c05e9
index b968c43..ac587fc 100644
Peter Hutterer c2c05e9
--- a/xkb/ddxLoad.c
Peter Hutterer c2c05e9
+++ b/xkb/ddxLoad.c
Peter Hutterer c2c05e9
@@ -470,13 +470,34 @@ XkbDescPtr
Peter Hutterer c2c05e9
 XkbCompileKeymap(DeviceIntPtr dev, XkbRMLVOSet *rmlvo)
Peter Hutterer c2c05e9
 {
Peter Hutterer c2c05e9
     XkbDescPtr xkb;
Peter Hutterer c2c05e9
+    unsigned int need;
Peter Hutterer c2c05e9
 
Peter Hutterer c2c05e9
     if (!dev || !rmlvo) {
Peter Hutterer c2c05e9
         LogMessage(X_ERROR, "XKB: No device or RMLVO specified\n");
Peter Hutterer c2c05e9
         return NULL;
Peter Hutterer c2c05e9
     }
Peter Hutterer c2c05e9
 
Peter Hutterer c2c05e9
-    xkb = XkbCompileKeymapForDevice(dev, rmlvo, 0);
Peter Hutterer c2c05e9
+    /* These are the components we really really need */
Peter Hutterer c2c05e9
+    need = XkmSymbolsMask | XkmCompatMapMask | XkmTypesMask |
Peter Hutterer c2c05e9
+           XkmKeyNamesMask | XkmVirtualModsMask;
Peter Hutterer c2c05e9
+
Peter Hutterer c2c05e9
+
Peter Hutterer c2c05e9
+    xkb = XkbCompileKeymapForDevice(dev, rmlvo, need);
Peter Hutterer c2c05e9
+
Peter Hutterer c2c05e9
+    if (!xkb) {
Peter Hutterer c2c05e9
+        XkbRMLVOSet dflts;
Peter Hutterer c2c05e9
+
Peter Hutterer c2c05e9
+        /* we didn't get what we really needed. And that will likely leave
Peter Hutterer c2c05e9
+         * us with a keyboard that doesn't work. Use the defaults instead */
Peter Hutterer c2c05e9
+        LogMessage(X_ERROR, "XKB: Failed to load keymap. Loading default "
Peter Hutterer c2c05e9
+                   "keymap instead.\n");
Peter Hutterer c2c05e9
+
Peter Hutterer c2c05e9
+        XkbGetRulesDflts(&dflts);
Peter Hutterer c2c05e9
+
Peter Hutterer c2c05e9
+        xkb = XkbCompileKeymapForDevice(dev, &dflts, 0);
Peter Hutterer c2c05e9
+
Peter Hutterer c2c05e9
+        XkbFreeRMLVOSet(&dflts, FALSE);
Peter Hutterer c2c05e9
+    }
Peter Hutterer c2c05e9
 
Peter Hutterer c2c05e9
     return xkb;
Peter Hutterer c2c05e9
 }
Peter Hutterer c2c05e9
-- 
Peter Hutterer c2c05e9
1.7.4
Peter Hutterer c2c05e9