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 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 - 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 +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 +Reviewed-by: Dan Nicholson +--- + 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 +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 +Reviewed-by: Dan Nicholson +--- + 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 +