[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