[xorg-x11-server/f15/master] xserver-1.9.99.1-xkb-split-out-keymap-compilation.patch (#676827 prep work) xserver-1.9.99.1-xkb-if-

Peter Hutterer whot at fedoraproject.org
Thu Feb 24 02:10:20 UTC 2011


commit c2c05e9e2fec0a6a0296f5df05a385299f12d3f3
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Feb 24 11:38:55 2011 +1000

    xserver-1.9.99.1-xkb-split-out-keymap-compilation.patch (#676827 prep work)
    xserver-1.9.99.1-xkb-if-the-keymap-failed-to-compile-load-the-default.patch
    (#676827 fix)

 xorg-x11-server.spec                               |   14 +++-
 ...keymap-failed-to-compile-load-the-default.patch |   69 ++++++++++++++
 ...1.9.99.1-xkb-split-out-keymap-compilation.patch |   95 ++++++++++++++++++++
 3 files changed, 177 insertions(+), 1 deletions(-)
---
diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec
index d116758..05bf6e5 100644
--- a/xorg-x11-server.spec
+++ b/xorg-x11-server.spec
@@ -30,7 +30,7 @@
 Summary:   X.Org X11 X server
 Name:      xorg-x11-server
 Version:   1.9.99.1
-Release:   4%{?gitdate:.%{gitdate}}%{dist}
+Release:   5%{?gitdate:.%{gitdate}}%{dist}
 URL:       http://www.x.org
 License:   MIT
 Group:     User Interface/X
@@ -93,6 +93,13 @@ Patch7005: xserver-1.9.0-qxl-fallback.patch
 # http://patchwork.freedesktop.org/patch/3653/
 Patch7006: xserver-1.9.99.901-xkb-repeat-issues.patch
 
+# 676827 keyboard with german layout doesn't work in gdm
+# 47d1d2fed656c3a3b2600491078da90962c46934
+Patch7007: xserver-1.9.99.1-xkb-split-out-keymap-compilation.patch
+# d3499556d8d83396fa2585bd00371a81e086be36
+Patch7008: xserver-1.9.99.1-xkb-if-the-keymap-failed-to-compile-load-the-default.patch
+
+
 %define moduledir	%{_libdir}/xorg/modules
 %define drimoduledir	%{_libdir}/dri
 %define sdkdir		%{_includedir}/xorg
@@ -552,6 +559,11 @@ rm -rf $RPM_BUILD_ROOT
 %{xserver_source_dir}
 
 %changelog
+* Thu Feb 24 2011 Peter Hutterer <peter.hutterer at redhat.com> 1.9.99.1-5.20101201
+- xserver-1.9.99.1-xkb-split-out-keymap-compilation.patch (#676827 prep work)
+- xserver-1.9.99.1-xkb-if-the-keymap-failed-to-compile-load-the-default.patch
+  (#676827 fix)
+
 * Tue Feb 08 2011 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 1.9.99.1-4.20101201
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
 
diff --git a/xserver-1.9.99.1-xkb-if-the-keymap-failed-to-compile-load-the-default.patch b/xserver-1.9.99.1-xkb-if-the-keymap-failed-to-compile-load-the-default.patch
new file mode 100644
index 0000000..eb91cc2
--- /dev/null
+++ b/xserver-1.9.99.1-xkb-if-the-keymap-failed-to-compile-load-the-default.patch
@@ -0,0 +1,69 @@
+From d3499556d8d83396fa2585bd00371a81e086be36 Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer at 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 at who-t.net>
+Reviewed-by: Dan Nicholson <dbn.lists at 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
+
diff --git a/xserver-1.9.99.1-xkb-split-out-keymap-compilation.patch b/xserver-1.9.99.1-xkb-split-out-keymap-compilation.patch
new file mode 100644
index 0000000..44c7f58
--- /dev/null
+++ b/xserver-1.9.99.1-xkb-split-out-keymap-compilation.patch
@@ -0,0 +1,95 @@
+From 47d1d2fed656c3a3b2600491078da90962c46934 Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer at who-t.net>
+Date: Thu, 10 Feb 2011 15:11:34 +1000
+Subject: [PATCH] xkb: split out keymap compilation.
+
+Refactoring for simpler double-use in the next patch. No functional changes.
+
+Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
+Reviewed-by: Dan Nicholson <dbn.lists at gmail.com>
+---
+ xkb/ddxLoad.c |   55 +++++++++++++++++++++++++++++++++++++++----------------
+ 1 files changed, 39 insertions(+), 16 deletions(-)
+
+diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c
+index 51b5777..b968c43 100644
+--- a/xkb/ddxLoad.c
++++ b/xkb/ddxLoad.c
+@@ -425,35 +425,58 @@ XkbRF_RulesPtr	rules;
+     return complete;
+ }
+ 
+-XkbDescPtr
+-XkbCompileKeymap(DeviceIntPtr dev, XkbRMLVOSet *rmlvo)
++static Bool
++XkbRMLVOtoKcCGST(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, XkbComponentNamesPtr kccgst)
+ {
+-    XkbComponentNamesRec kccgst;
+     XkbRF_VarDefsRec mlvo;
+-    XkbDescPtr xkb;
+-    char name[PATH_MAX];
+-
+-    if (!dev || !rmlvo) {
+-        LogMessage(X_ERROR, "XKB: No device or RMLVO specified\n");
+-        return NULL;
+-    }
+ 
+     mlvo.model = rmlvo->model;
+     mlvo.layout = rmlvo->layout;
+     mlvo.variant = rmlvo->variant;
+     mlvo.options = rmlvo->options;
+ 
+-    /* XDNFR already logs for us. */
+-    if (!XkbDDXNamesFromRules(dev, rmlvo->rules, &mlvo, &kccgst))
++    return XkbDDXNamesFromRules(dev, rmlvo->rules, &mlvo, kccgst);
++}
++
++/**
++ * Compile the given RMLVO keymap and return it. Returns the XkbDescPtr on
++ * success or NULL on failure. If the components compiled are not a superset
++ * or equal to need, the compiliation is treated as failure.
++ */
++static XkbDescPtr
++XkbCompileKeymapForDevice(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, int need)
++{
++    XkbDescPtr xkb;
++    unsigned int provided;
++    XkbComponentNamesRec kccgst;
++    char name[PATH_MAX];
++
++    if (!XkbRMLVOtoKcCGST(dev, rmlvo, &kccgst))
+         return NULL;
+ 
+-    /* XDLKBN too, but it might return 0 as well as allocating. */
+-    if (!XkbDDXLoadKeymapByNames(dev, &kccgst, XkmAllIndicesMask, 0, &xkb, name,
+-                                 PATH_MAX)) {
+-        if (xkb)
++    provided = XkbDDXLoadKeymapByNames(dev, &kccgst, XkmAllIndicesMask, need,
++                                       &xkb, name, PATH_MAX);
++    if ((need & provided) != need) {
++        if (xkb) {
+             XkbFreeKeyboard(xkb, 0, TRUE);
++            xkb = NULL;
++        }
++    }
++
++    return xkb;
++}
++
++XkbDescPtr
++XkbCompileKeymap(DeviceIntPtr dev, XkbRMLVOSet *rmlvo)
++{
++    XkbDescPtr xkb;
++
++    if (!dev || !rmlvo) {
++        LogMessage(X_ERROR, "XKB: No device or RMLVO specified\n");
+         return NULL;
+     }
+ 
++    xkb = XkbCompileKeymapForDevice(dev, rmlvo, 0);
++
+     return xkb;
+ }
+-- 
+1.7.4
+


More information about the scm-commits mailing list