From ab83b322353e74f9b89ad1df667198fa5e812591 Mon Sep 17 00:00:00 2001 From: Live System User Date: Thu, 8 Aug 2013 23:38:22 +0200 Subject: [PATCH] apply the keyboard language settings on boot --- fedora-live-base.ks | 169 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) diff --git a/fedora-live-base.ks b/fedora-live-base.ks index 7227308..9cfdfa5 100644 --- a/fedora-live-base.ks +++ b/fedora-live-base.ks @@ -223,6 +223,173 @@ fi # https://bugzilla.redhat.com/show_bug.cgi?id=679486 echo "localhost" > /etc/hostname +# Apply the keyboard settings from "/etc/sysconfig/keyboard" +mkdir -p /etc/X11/xinit/xinitrc.d/ +cat > /etc/X11/xinit/xinitrc.d/keyboard.py << KEYBOARD_PY_EOF +# +# keyboard.py - keyboard backend data object +# +# Brent Fox +# Mike Fulbright +# Jeremy Katz +# Lubomir Rintel +# +# Copyright 2002 Red Hat, Inc. +# Copyright 2009 Lubomir Rintel +# +# 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. +# + +import dbus +import string +import os +from subprocess import call +import system_config_keyboard.keyboard_models as keyboard_models + +class Keyboard(): + def __init__(self): + self._mods = keyboard_models.KeyboardModels() + + self.type = "PC" + self.beenset = 0 + self.config = [] + + # default to us + self.set("us") + + try: + bus = dbus.SystemBus() + hal = dbus.Interface(bus.get_object("org.freedesktop.Hal","/org/freedesktop/Hal/Manager"),"org.freedesktop.Hal.Manager") + kbs = hal.FindDeviceByCapability("input.keyboard") + if len(kbs) == 0: + self.type = "Serial" + else: + self._var ("KEYBOARDTYPE", "pc") + kb = dbus.Interface(bus.get_object("org.freedesktop.Hal", kbs[0]), 'org.freedesktop.Hal.Device') + if kb.GetPropertyString("info.product").startswith("Sun Type"): + self.type == "Sun" + self._var ("KEYBOARDTYPE", "sun") + except: + pass + + def _get_models(self): + return self._mods.get_models() + modelDict = property(_get_models) + + def _var (self, name, value = None): + found = 0 + for line in self.config: + if line[1] == name: + found = 1 + break + if not found: + line = [None, None, None] + # get or set? + if not value: + return line[2] + line[1:3] = (name, value) + line[0] = '{0}="{1}"\n'.format (name, value) + if not found: + self.config.append (line) + + def set(self, keytable): + if self.type != "Serial": + kb = self.modelDict[keytable] + self._var ("KEYTABLE", keytable) + self._var ("MODEL", kb[2]) + self._var ("LAYOUT", kb[1]) + self._var ("VARIANT", kb[3]) + self._var ("OPTIONS", kb[4]) + + def get(self): + return self._var ("KEYTABLE") + + def read(self, instPath = "/"): + try: + file = open(instPath + "/etc/sysconfig/keyboard", "r") + except: + return + 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]) + self.beenset = 1 + + def activate(self): + # XXX do isys.loadkeys + console_kbd = self.get() + if not console_kbd: + return + + # Call loadkeys to change the console keymap + if os.access("/bin/loadkeys", os.X_OK): + command = "/bin/loadkeys" + elif os.access("/usr/bin/loadkeys", os.X_OK): + command = "/usr/bin/loadkeys" + else: + command = "/bin/loadkeys" + argv = [ command, console_kbd ] + + if os.access(argv[0], os.X_OK) == 1: + call (argv) + + try: + kbd = self.modelDict[console_kbd] + except KeyError: + return + + if not kbd: + return + (name, layout, model, variant, options) = kbd + + # only set the X keyboard map if running X + if not os.environ.has_key("DISPLAY"): + return + + argv = [ "/usr/bin/setxkbmap", "-layout", layout ] + + # XXX setxkbmap(1) needs one -option flag for each option + if options: + argv = argv + [ "-option", options ] + + if variant: + argv = argv + [ "-variant", variant ] + + if os.access(argv[0], os.X_OK) == 1: + call (argv) + +def ActivateKeyboard(): + kbd = Keyboard() + kbd.read() + kbd.set(kbd.get()) + kbd.activate() + +if __name__ == "__main__": + ActivateKeyboard() +KEYBOARD_PY_EOF + +cat > /etc/X11/xinit/xinitrc.d/set-keyboard.sh << SET_KEYBOARD_SH_EOF +#!/bin/sh + +export PYTHONPATH=/usr/share/system-config-keyboard +/usr/bin/python /etc/X11/xinit/xinitrc.d/keyboard.py \$* +SET_KEYBOARD_SH_EOF + EOF # bah, hal starts way too late @@ -289,6 +456,8 @@ chmod 755 /etc/rc.d/init.d/livesys-late /sbin/restorecon /etc/rc.d/init.d/livesys-late /sbin/chkconfig --add livesys-late +chmod 755 /etc/X11/xinit/xinitrc.d/set-keyboard.sh + # enable tmpfs for /tmp systemctl enable tmp.mount -- 1.8.3.1