If invalid layouts are given in the kickstart we should just log an error and
fallback to the default values instead of raising an exception.
Signed-off-by: Vratislav Podzimek <vpodzime(a)redhat.com>
---
pyanaconda/keyboard.py | 15 ++++++++++++++-
pyanaconda/ui/gui/spokes/keyboard.py | 26 ++++++++++++++++++++++----
2 files changed, 36 insertions(+), 5 deletions(-)
diff --git a/pyanaconda/keyboard.py b/pyanaconda/keyboard.py
index 06bc683..9b8567f 100755
--- a/pyanaconda/keyboard.py
+++ b/pyanaconda/keyboard.py
@@ -366,7 +366,20 @@ class XklWrapper(object):
if diff > 0:
self._rec.set_variants(self._rec.variants + (diff * [""]))
if not self._rec.activate(self._engine):
- raise XklWrapperError("Failed to initialize layouts")
+ # failed to activate layouts given e.g. by a kickstart (may be
+ # invalid)
+ lay_var_str = ",".join(map(_join_layout_variant,
+ self._rec.layouts,
+ self._rec.variants))
+ log.error("Failed to activate layouts: '%s', "
+ "falling back to default 'us'" %
lay_var_str)
+ self._rec.set_layouts(["us"])
+ self._rec.set_variants([""])
+
+ if not self._rec.activate(self._engine):
+ # failed to activate even the default "us" layout,
something
+ # is really wrong
+ raise XklWrapperError("Failed to initialize layouts")
#needed also for Gkbd.KeyboardDrawingDialog
self.configreg = Xkl.ConfigRegistry.get_instance(self._engine)
diff --git a/pyanaconda/ui/gui/spokes/keyboard.py b/pyanaconda/ui/gui/spokes/keyboard.py
index b280635..f0cb859 100644
--- a/pyanaconda/ui/gui/spokes/keyboard.py
+++ b/pyanaconda/ui/gui/spokes/keyboard.py
@@ -31,6 +31,9 @@ from pyanaconda import keyboard
from pyanaconda import flags
from pyanaconda.i18n import _, N_
+import logging
+log = logging.getLogger("anaconda")
+
__all__ = ["KeyboardSpoke"]
# %s will be replaced by key combination like Alt+Shift
@@ -348,10 +351,13 @@ class KeyboardSpoke(NormalSpoke):
self._refresh_switching_info()
def _addLayout(self, store, name):
- store.append([name])
+ # first try to add the layout
if flags.can_touch_runtime_system("add runtime X layout"):
self._xkl_wrapper.add_layout(name)
+ # valid layout, append it to the store
+ store.append([name])
+
def _removeLayout(self, store, itr):
"""
Remove the layout specified by store iterator from the store and
@@ -536,11 +542,23 @@ class KeyboardSpoke(NormalSpoke):
self._refresh_switching_info()
def _add_data_layouts(self):
- if self.data.keyboard.x_layouts:
- for layout in self.data.keyboard.x_layouts:
+ if not self.data.keyboard.x_layouts:
+ # nothing specified, just add the default 'us'
+ self._addLayout(self._store, "us")
+ return
+
+ valid_layouts = []
+ for layout in self.data.keyboard.x_layouts:
+ try:
self._addLayout(self._store, layout)
- else:
+ valid_layouts += layout
+ except keyboard.XklWrapperError as xklerr:
+ log.error("Failed to add layout '%s'" % layout)
+
+ if not valid_layouts:
+ log.error("No valid layout given, falling back to default
'us'")
self._addLayout(self._store, "us")
+ self.data.keyboard.x_layouts = ["us"]
def _flush_layouts_to_X(self):
layouts_list = list()
--
1.7.11.7