diff options
author | Vratislav Podzimek <vpodzime@redhat.com> | 2012-10-03 15:47:15 +0200 |
---|---|---|
committer | Vratislav Podzimek <vpodzime@redhat.com> | 2012-10-12 15:46:48 +0200 |
commit | 4dbff52bd69a20a49881a90ac5f0cb8a8dc3eac2 (patch) | |
tree | bccfaa493a446c0d9e6fefd8f2f83ac26db4bd83 | |
parent | dce36fd01334d291189f1bdfb5cfbea85bc48db7 (diff) | |
download | anaconda-4dbff52bd69a20a49881a90ac5f0cb8a8dc3eac2.tar.gz anaconda-4dbff52bd69a20a49881a90ac5f0cb8a8dc3eac2.tar.xz anaconda-4dbff52bd69a20a49881a90ac5f0cb8a8dc3eac2.zip |
Add class wrapping systemd-localed functionality
-rwxr-xr-x | pyanaconda/keyboard.py | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/pyanaconda/keyboard.py b/pyanaconda/keyboard.py index 0cfcd6b60..42e8380ef 100755 --- a/pyanaconda/keyboard.py +++ b/pyanaconda/keyboard.py @@ -32,6 +32,7 @@ for listing and various modifications of keyboard layouts settings. import os import re +import dbus from pyanaconda import iutil from gi.repository import Xkl @@ -39,6 +40,10 @@ from gi.repository import Xkl import logging log = logging.getLogger("anaconda") +LOCALED_SERVICE = "org.freedesktop.locale1" +LOCALED_OBJECT_PATH = "/org/freedesktop/locale1" +LOCALED_IFACE = "org.freedesktop.locale1" + class KeyboardConfigError(Exception): """Exception class for keyboard configuration related problems""" @@ -64,6 +69,23 @@ def _parse_layout_variant(layout): return (layout, variant) +def _join_layout_variant(layout, variant=""): + """ + Join layout and variant to form the commonly used 'layout (variant)' + or 'layout' (if variant is missing) format. + + @type layout: string + @type variant: string + @return: 'layout (variant)' or 'layout' string + @rtype: string + + """ + + if variant: + return "%s (%s)" % (layout, variant) + else: + return layout + def get_layouts_xorg_conf(keyboard): """ Get the xorg.conf content setting up layouts in the ksdata. @@ -232,6 +254,7 @@ class XklWrapper(object): return XklWrapper._instance def __init__(self): + # pylint: disable-msg=E0611 from gi.repository import GdkX11 #initialize Xkl-related stuff @@ -417,3 +440,92 @@ class XklWrapper(object): if not self._rec.activate(self._engine): msg = "Failed to replace layouts with: %s" % ",".join(layouts_list) raise XklWrapperError(msg) + +class LocaledWrapperError(KeyboardConfigError): + """Exception class for reporting Localed-related problems""" + pass + +class LocaledWrapper(object): + """ + Class wrapping systemd-localed daemon functionality. + + """ + + def __init__(self): + bus = dbus.SystemBus() + + try: + localed = bus.get_object(LOCALED_SERVICE, LOCALED_OBJECT_PATH) + except dbus.DBusException: + raise LocaledWrapperError("Failed to get locale object") + + try: + self._locale_iface = dbus.Interface(localed, LOCALED_IFACE) + except dbus.DBusException: + raise LocaledWrapperError("Failed to get locale interface") + + try: + self._props_iface = dbus.Interface(localed, dbus.PROPERTIES_IFACE) + except dbus.DBusException: + raise LocaledWrapperError("Failed to get properties interface") + + def set_and_convert_keymap(self, keymap): + """ + Method that sets VConsole keymap and returns X11 layout and + variant that (systemd-localed thinks) match given keymap best. + + @return: string containing "layout (variant)" or "layout" if variant + is missing + @rtype: string + + """ + + # args: keymap, keymap_toggle, convert, user_interaction + # where convert indicates whether the keymap should be converted + # to X11 layout and user_interaction indicates whether PolicyKit + # should ask for credentials or not + try: + self._locale_iface.SetVConsoleKeyboard(keymap, "", True, False) + except dbus.DBusException: + msg = "Failed to call SetVConsoleKeyboard method" + raise LocaledWrapperError(msg) + + try: + layout = self._props_iface.Get(LOCALED_IFACE, "X11Layout") + except dbus.DBusException: + raise LocaledWrapperError("locale has no X11Layout property") + + try: + variant = self._props_iface.Get(LOCALED_IFACE, "X11Variant") + except dbus.DBusException: + raise LocaledWrapperError("locale has no X11Variant property") + + return _join_layout_variant(layout, variant) + + def set_and_convert_layout(self, layout_variant): + """ + Method that sets X11 layout and variant (for later X sessions) + and returns VConsole keymap that (systemd-localed thinks) matches + given layout and variant best. + + @return: a keymap matching layout and variant best + @rtype: string + + """ + + (layout, variant) = _parse_layout_variant(layout_variant) + + # args: layout, model, variant, options, convert, user_interaction + # where convert indicates whether the keymap should be converted + # to X11 layout and user_interaction indicates whether PolicyKit + # should ask for credentials or not + try: + self._locale_iface.SetX11Keyboard(layout, "", variant, "", True, False) + except dbus.DBusException: + msg = "Failed to call SetX11Keyboard method" + raise LocaledWrapperError(msg) + + try: + return self._props_iface.Get(LOCALED_IFACE, "VConsoleKeymap") + except dbus.DBusException: + raise LocaledWrapperError("locale has no VConsoleKeymap property") |