[system-config-keyboard/f19] Use systemd-localed to read and write configuration

Adam Williamson adamwill at fedoraproject.org
Thu Jun 6 17:44:43 UTC 2013


commit 4fb8ea1c4670041ef765a678f058c0a2df7e6570
Author: Vratislav Podzimek <vpodzime at redhat.com>
Date:   Thu Jun 6 15:49:49 2013 +0200

    Use systemd-localed to read and write configuration
    
    This configuration is read by the other tools.
    
    Signed-off-by: Vratislav Podzimek <vpodzime at redhat.com>

 ...keyboard-1.3.1-use_systemd_localed_config.patch |  183 ++++++++++++++++++++
 system-config-keyboard.spec                        |    2 +
 2 files changed, 185 insertions(+), 0 deletions(-)
---
diff --git a/system-config-keyboard-1.3.1-use_systemd_localed_config.patch b/system-config-keyboard-1.3.1-use_systemd_localed_config.patch
new file mode 100644
index 0000000..05d257c
--- /dev/null
+++ b/system-config-keyboard-1.3.1-use_systemd_localed_config.patch
@@ -0,0 +1,183 @@
+--- system-config-keyboard-1.3.1.orig/lib/keyboard.py	2009-09-14 13:03:43.743577000 +0200
++++ system-config-keyboard-1.3.1/lib/keyboard.py	2013-06-06 15:28:41.003555860 +0200
+@@ -29,6 +29,7 @@ import string
+ import os
+ from subprocess import call
+ import keyboard_models
++import localed
+ 
+ class Keyboard():
+     def __init__(self):
+@@ -56,6 +57,8 @@ class Keyboard():
+         except:
+             pass
+ 
++        self._localed_wrap = localed.LocaledWrapper()
++
+     def _get_models(self):
+         return self._mods.get_models()
+     modelDict = property(_get_models)
+@@ -119,23 +122,22 @@ class Keyboard():
+             raise KeyError, item
+ 
+     def read(self, instPath = "/"):
+-        try:
+-            file = open(instPath + "/etc/sysconfig/keyboard", "r")
+-        except:
+-            return
++        conf_dict = self._localed_wrap.get_keyboard_info()
+         self.config = []
+-        while 1:
+-                line = file.readline ()
+-                if not line:
+-                        break
+-                (name, value) = line.rstrip("\n").split ('=')
+-                self.config.append ([line, name, value.strip ('"'), 0])
++        for key, val in conf_dict.iteritems():
++            line = '%s="%s"' % (key, val)
++            self.config.append([line, key, val, 0])
++
+         self.beenset = 1
+ 
+     def write(self, instPath = "/"):
+-	file = open(instPath + "/etc/sysconfig/keyboard", "w")
+-	for line in self.config:
+-                file.write (line[0]);
++        kbd = self.modelDict[self.get()]
++        if kbd:
++            (name, layout, model, variant, options) = kbd
++            self._localed_wrap.set_layout_variant(layout, variant, model, options)
++
++        self._localed_wrap.set_keymap(self.get())
++
+         try:
+             os.unlink(instPath + "/etc/sysconfig/console/default.kmap")
+         except:
+--- /dev/null	2013-05-29 10:21:13.888326445 +0200
++++ system-config-keyboard-1.3.1/lib/localed.py	2013-06-06 15:28:47.035443834 +0200
+@@ -0,0 +1,125 @@
++# Copyright 2013 Red Hat, Inc.
++#
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++#
++# Red Hat Author(s): Vratislav Podzimek <vpodzime at redhat.com>
++#
++# Code taken from the pyanaconda.keyboard module
++
++"""
++Module providing the LocaledWrapper class wrapping the systemd-localed DBus API.
++
++"""
++
++import dbus
++
++LOCALED_SERVICE = "org.freedesktop.locale1"
++LOCALED_OBJECT_PATH = "/org/freedesktop/locale1"
++LOCALED_IFACE = "org.freedesktop.locale1"
++
++class LocaledWrapperError(Exception):
++    """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_layout_variant(self, layout, variant, model, options):
++        """ Method that sets X11 layout and variant (for later X sessions). """
++
++        # args: layout, model, variant, options, convert, user_interaction
++        # where convert indicates whether the layout should be converted to a
++        # VConsole keymap and user_interaction indicates whether PolicyKit
++        # should ask for credentials or not
++        try:
++            self._locale_iface.SetX11Keyboard(layout, model, variant, options,
++                                              False, True)
++        except dbus.DBusException:
++            msg = "Failed to call SetX11Keyboard method"
++            raise LocaledWrapperError(msg)
++
++    def set_keymap(self, keymap):
++        """ Method that sets VConsole keymap. """
++
++        # args: keymap, keymap_toggle, convert, user_interaction
++        # where convert indicates whether the keymap should be converted to an
++        # X11 layout and user_interaction indicates whether PolicyKit should ask
++        # for credentials or not
++        try:
++            self._locale_iface.SetVConsoleKeyboard(keymap, "", False, True)
++        except dbus.DBusException:
++            msg = "Failed to call SetVConsoleKeyboard method"
++            raise LocaledWrapperError(msg)
++
++    def get_keyboard_info(self):
++        """
++        Method that returns the information about the Keyboard configuration.
++
++        :return: dictionary containing the key-value pairs representing the
++                 current keyboard configuration
++        :rtype: dict(string -> string)
++
++        """
++
++        rdict = dict()
++
++        # try to get as much values as we can
++        try:
++            rdict["KEYTABLE"] = str(self._props_iface.Get(LOCALED_IFACE, "VConsoleKeymap"))
++        except dbus.DBusException:
++            pass
++
++        try:
++            rdict["MODEL"] = str(self._props_iface.Get(LOCALED_IFACE, "X11Model"))
++        except dbus.DBusException:
++            pass
++
++        try:
++            rdict["LAYOUT"] = str(self._props_iface.Get(LOCALED_IFACE, "X11Layout"))
++        except dbus.DBusException:
++            pass
++
++        try:
++            rdict["VARIANT"] = str(self._props_iface.Get(LOCALED_IFACE, "X11Variant"))
++        except dbus.DBusException:
++            pass
++
++        try:
++            rdict["OPTIONS"] = str(self._props_iface.Get(LOCALED_IFACE, "X11Options"))
++        except dbus.DBusException:
++            pass
++
++        return rdict
diff --git a/system-config-keyboard.spec b/system-config-keyboard.spec
index a686fe3..4da4e69 100644
--- a/system-config-keyboard.spec
+++ b/system-config-keyboard.spec
@@ -27,6 +27,7 @@ Patch0:         system-config-keyboard-1.3.1-do_not_remove_the_OK_button.patch
 Patch1:         system-config-keyboard-1.3.1-no-pyxf86config.patch
 Patch2:         system-config-keyboard-1.3.1-pkexec.patch
 Patch3:         system-config-keyboard-1.3.1-manpage.patch
+Patch4:         system-config-keyboard-1.3.1-use_systemd_localed_config.patch
 
 
 %description
@@ -51,6 +52,7 @@ Base components of system-config-keyboard.
 %patch1 -p1 -b .no-pyxf86config
 %patch2 -p1 -b .pkexec
 %patch3 -p1 -b .manpage
+%patch4 -p1 -b .use_systemd_localed_config
 
 %build
 make


More information about the scm-commits mailing list