m 5c894bc1e45f7c34bf7fc4ca0d20bf1c3b679bef Mon Sep 17 00:00:00 2001 From: Frederic Crozat Date: Thu, 18 Aug 2011 18:28:01 +0200 Subject: [PATCH] handle disable_caplock and compose_table and kbd_rate --- src/vconsole-setup.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 121 insertions(+), 3 deletions(-) Index: systemd-195/src/vconsole/vconsole-setup.c =================================================================== --- systemd-195.orig/src/vconsole/vconsole-setup.c +++ systemd-195/src/vconsole/vconsole-setup.c @@ -40,6 +40,7 @@ #include "log.h" #include "macro.h" #include "virt.h" +#include "strv.h" static bool is_vconsole(int fd) { unsigned char data[1]; @@ -99,8 +100,8 @@ static int enable_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, pid_t *_pid) { + const char *args[9]; int i = 0; pid_t pid; @@ -119,6 +120,8 @@ static int load_keymap(const char *vc, c args[i++] = map; if (map_toggle) args[i++] = map_toggle; + if (disable_capslock) + args[i++] = "disable.capslock"; args[i++] = NULL; pid = fork(); @@ -172,6 +175,101 @@ static int load_font(const char *vc, con return 0; } +#ifdef TARGET_SUSE +static int load_compose_table(const char *vc, const char *compose_table, pid_t *_pid) { + const char *args[1024]; + int i = 0, j = 0; + pid_t pid; + char **strv_compose_table = NULL; + char *to_free[1024]; + + if (isempty(compose_table)) { + /* An empty map means no compose table*/ + *_pid = 0; + return 0; + } + + args[i++] = KBD_LOADKEYS; + args[i++] = "-q"; + args[i++] = "-C"; + args[i++] = vc; + + 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++] = to_free[j++] = arg; + + } + strv_free(strv_compose_table); + } + 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; + + for (i=0 ; i < j ; i++) + free (to_free[i]); + + return 0; +} + +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; @@ -185,8 +283,16 @@ int main(int argc, char **argv) { #if defined(TARGET_MANDRIVA) || defined(TARGET_MAGEIA) 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; + char *vc_compose_table = NULL; + pid_t kbd_rate_pid = 0, compose_table_pid = 0; +#endif int fd = -1; bool utf8; + bool disable_capslock = false; int r = EXIT_FAILURE; pid_t font_pid = 0, keymap_pid = 0; @@ -273,10 +379,15 @@ int main(int argc, char **argv) { free(vc_keymap); vc_keymap = t; } + disable_capslock = vc_kbd_disable_caps_lock && strcasecmp(vc_kbd_disable_caps_lock, "YES") == 0; #elif defined(TARGET_SUSE) 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); if (r < 0 && r != -ENOENT) log_warning("Failed to read /etc/sysconfig/keyboard: %s", strerror(-r)); @@ -435,7 +546,11 @@ int main(int argc, char **argv) { 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, &keymap_pid) >= 0 && +#ifdef TARGET_SUSE + load_compose_table(vc, vc_compose_table, &compose_table_pid) >= 0 && + 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; @@ -443,6 +558,14 @@ finish: if (keymap_pid > 0) wait_for_terminate_and_warn(KBD_LOADKEYS, keymap_pid); +#ifdef TARGET_SUSE + if (compose_table_pid > 0) + wait_for_terminate_and_warn(KBD_LOADKEYS, compose_table_pid); + + 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); @@ -450,6 +573,12 @@ finish: free(vc_font); free(vc_font_map); free(vc_font_unimap); +#ifdef TARGET_SUSE + free(vc_kbd_delay); + free(vc_kbd_rate); + free(vc_kbd_disable_caps_lock); + free(vc_compose_table); +#endif if (fd >= 0) close_nointr_nofail(fd);