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)
This commit is contained in:
parent
92cc1c1392
commit
c2c05e9e2f
@ -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@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@lists.fedoraproject.org> - 1.9.99.1-4.20101201
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
|
||||
|
||||
|
@ -0,0 +1,69 @@
|
||||
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
|
||||
|
95
xserver-1.9.99.1-xkb-split-out-keymap-compilation.patch
Normal file
95
xserver-1.9.99.1-xkb-split-out-keymap-compilation.patch
Normal file
@ -0,0 +1,95 @@
|
||||
From 47d1d2fed656c3a3b2600491078da90962c46934 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Hutterer <peter.hutterer@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@who-t.net>
|
||||
Reviewed-by: Dan Nicholson <dbn.lists@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
|
||||
|
Loading…
Reference in New Issue
Block a user