[PATCH] handle disable_caplock and compose_table and kbd_rate

Frederic Crozat fcrozat at suse.com
Thu Aug 18 09:28:01 PDT 2011


---
 src/vconsole-setup.c |   93 ++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 90 insertions(+), 3 deletions(-)

diff --git a/src/vconsole-setup.c b/src/vconsole-setup.c
index 4347a20..28dc1d9 100644
--- a/src/vconsole-setup.c
+++ b/src/vconsole-setup.c
@@ -39,6 +39,7 @@
 #include "util.h"
 #include "log.h"
 #include "macro.h"
+#include "strv.h"
 
 static bool is_vconsole(int fd) {
         unsigned char data[1];
@@ -78,8 +79,8 @@ static int disable_utf8(int fd) {
         return r;
 }
 
-static int load_keymap(const char *vc, const char *map, const char *map_toggle, bool utf8, pid_t *_pid) {
-        const char *args[8];
+static int load_keymap(const char *vc, const char *map, const char *map_toggle, bool utf8, bool disable_capslock, const char *compose_table, pid_t *_pid) {
+        const char *args[1024];
         int i = 0;
         pid_t pid;
 
@@ -98,6 +99,35 @@ static int load_keymap(const char *vc, const char *map, const char *map_toggle,
         args[i++] = map;
         if (map_toggle)
                 args[i++] = map_toggle;
+        if (disable_capslock)
+                args[i++] = "disable.capslock";
+        if (compose_table) {
+                char **strv_compose_table = NULL;
+
+                strv_compose_table = strv_split(compose_table, WHITESPACE);
+                if (strv_compose_table) {
+                        bool compose_loaded = false;
+                        bool compose_clear = false;
+                        char **name;
+                        char *arg;
+
+                        STRV_FOREACH (name, strv_compose_table) {
+                                if (streq(*name,"-c") || streq(*name,"clear")) {
+                                        compose_clear = true;
+                                        continue;
+                                }
+                                if (!compose_loaded) {
+                                        if (compose_clear)
+                                                args[i++] = "-c";
+                                }
+                                asprintf(&arg, "compose.%s",*name);
+                                compose_loaded = true;
+                                args[i++] = arg;
+
+                        }
+                }
+                strv_free(strv_compose_table);
+        }
         args[i++] = NULL;
 
         if ((pid = fork()) < 0) {
@@ -149,6 +179,42 @@ static int load_font(const char *vc, const char *font, const char *map, const ch
         return 0;
 }
 
+#ifdef TARGET_SUSE
+static int set_kbd_rate(const char *vc, const char *kbd_rate, const char *kbd_delay, pid_t *_pid) {
+        const char *args[7];
+        int i = 0;
+        pid_t pid;
+
+        if (isempty(kbd_rate) && isempty(kbd_delay)) {
+                *_pid = 0;
+                return 0;
+        }
+
+        args[i++] = "/bin/kbdrate";
+        if (!isempty(kbd_rate)) {
+                args[i++] = "-r";
+                args[i++] = kbd_rate;
+        }
+        if (!isempty(kbd_delay)) {
+                args[i++] = "-d";
+                args[i++] = kbd_delay;
+        }
+        args[i++] = "-s";
+        args[i++] = NULL;
+
+        if ((pid = fork()) < 0) {
+                log_error("Failed to fork: %m");
+                return -errno;
+        } else if (pid == 0) {
+                execv(args[0], (char **) args);
+                _exit(EXIT_FAILURE);
+        }
+
+        *_pid = pid;
+        return 0;
+}
+#endif
+
 int main(int argc, char **argv) {
         const char *vc;
         char *vc_keymap = NULL;
@@ -156,14 +222,22 @@ int main(int argc, char **argv) {
         char *vc_font = NULL;
         char *vc_font_map = NULL;
         char *vc_font_unimap = NULL;
+        char *vc_compose_table = NULL;
 #ifdef TARGET_GENTOO
         char *vc_unicode = NULL;
 #endif
 #ifdef TARGET_MANDRIVA
         char *vc_keytable = NULL;
 #endif
+#ifdef TARGET_SUSE
+        char *vc_kbd_delay = NULL;
+        char *vc_kbd_rate = NULL;
+        char *vc_kbd_disable_caps_lock = NULL;
+        pid_t kbd_rate_pid = 0;
+#endif
         int fd = -1;
         bool utf8;
+        bool disable_capslock = false;
         int r = EXIT_FAILURE;
         pid_t font_pid = 0, keymap_pid = 0;
 
@@ -268,6 +342,10 @@ int main(int argc, char **argv) {
 #elif defined(TARGET_SUSE)
                 if ((r = parse_env_file("/etc/sysconfig/keyboard", NEWLINE,
                                         "KEYTABLE", &vc_keymap,
+                                        "KBD_DELAY", &vc_kbd_delay,
+                                        "KBD_RATE", &vc_kbd_rate,
+                                        "KBD_DISABLE_CAPS_LOCK", &vc_kbd_disable_caps_lock,
+                                        "COMPOSETABLE", &vc_compose_table,
                                         NULL)) < 0) {
 
                         if (r != -ENOENT)
@@ -283,6 +361,7 @@ int main(int argc, char **argv) {
                         if (r != -ENOENT)
                                 log_warning("Failed to read /etc/sysconfig/console: %s", strerror(-r));
                 }
+                disable_capslock = strcasecmp(vc_kbd_disable_caps_lock, "YES") == 0;
 
 #elif defined(TARGET_ARCH)
                 if ((r = parse_env_file("/etc/rc.conf", NEWLINE,
@@ -439,7 +518,10 @@ int main(int argc, char **argv) {
         if (!utf8)
                 disable_utf8(fd);
 
-        if (load_keymap(vc, vc_keymap, vc_keymap_toggle, utf8, &keymap_pid) >= 0 &&
+        if (load_keymap(vc, vc_keymap, vc_keymap_toggle, utf8, disable_capslock, vc_compose_table, &keymap_pid) >= 0 &&
+#ifdef TARGET_SUSE
+            set_kbd_rate(vc, vc_kbd_rate, vc_kbd_delay, &kbd_rate_pid) >= 0 &&
+#endif
             load_font(vc, vc_font, vc_font_map, vc_font_unimap, &font_pid) >= 0)
                 r = EXIT_SUCCESS;
 
@@ -447,6 +529,11 @@ finish:
         if (keymap_pid > 0)
                 wait_for_terminate_and_warn(KBD_LOADKEYS, keymap_pid);
 
+#ifdef TARGET_SUSE
+        if (kbd_rate_pid > 0)
+                wait_for_terminate_and_warn("/bin/kbdrate", kbd_rate_pid);
+#endif
+
         if (font_pid > 0)
                 wait_for_terminate_and_warn(KBD_SETFONT, font_pid);
 
-- 
1.7.3.4


--=-07ROXbTdDiP7vafmT/Fy--



More information about the systemd-devel mailing list