]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
terminal: add ply_terminal_get_keymap function
authorHans de Goede <hdegoede@redhat.com>
Mon, 30 Sep 2019 09:01:34 +0000 (11:01 +0200)
committerHans de Goede <hdegoede@redhat.com>
Mon, 30 Sep 2019 22:43:34 +0000 (00:43 +0200)
Add a helper function to get the keymap from the terminal.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
src/libply-splash-core/ply-terminal.c
src/libply-splash-core/ply-terminal.h

index 2a19579d2b20369301c6e43bd494bafb22f15c31..2b56686361518293f41b9cc3d445c1b60e8284f0 100644 (file)
@@ -43,6 +43,7 @@
 
 #include "ply-buffer.h"
 #include "ply-event-loop.h"
+#include "ply-key-file.h"
 #include "ply-list.h"
 #include "ply-logger.h"
 #include "ply-utils.h"
@@ -79,6 +80,7 @@ struct _ply_terminal
         struct termios       original_locked_term_attributes;
 
         char                *name;
+        char                *keymap;
         int                  fd;
         int                  vt_number;
         int                  initial_vt_number;
@@ -115,6 +117,35 @@ typedef enum
 
 static ply_terminal_open_result_t ply_terminal_open_device (ply_terminal_t *terminal);
 
+static char *
+ply_terminal_parse_keymap_conf (ply_terminal_t *terminal)
+{
+        ply_key_file_t *vconsole_conf;
+        char *keymap, *old_keymap;
+
+        keymap = ply_kernel_command_line_get_key_value ("rd.vconsole.keymap=");
+        if (keymap)
+                return keymap;
+
+        keymap = ply_kernel_command_line_get_key_value ("vconsole.keymap=");
+        if (keymap)
+                return keymap;
+
+        vconsole_conf = ply_key_file_new ("/etc/vconsole.conf");
+        if (ply_key_file_load_groupless_file (vconsole_conf))
+                keymap = ply_key_file_get_value (vconsole_conf, NULL, "KEYMAP");
+        ply_key_file_free (vconsole_conf);
+
+        /* The keymap name in vconsole.conf might be quoted, strip these */
+        if (keymap && keymap[0] == '"' && keymap[strlen (keymap) - 1] == '"') {
+                old_keymap = keymap;
+                keymap = strndup(keymap + 1, strlen (keymap) - 2);
+                free (old_keymap);
+        }
+
+        return keymap;
+}
+
 ply_terminal_t *
 ply_terminal_new (const char *device_name)
 {
@@ -136,6 +167,9 @@ ply_terminal_new (const char *device_name)
         terminal->fd = -1;
         terminal->vt_number = -1;
         terminal->initial_vt_number = -1;
+        terminal->keymap = ply_terminal_parse_keymap_conf (terminal);
+        if (terminal->keymap)
+                ply_trace ("terminal %s keymap: %s", terminal->name, terminal->keymap);
 
         return terminal;
 }
@@ -845,6 +879,7 @@ ply_terminal_free (ply_terminal_t *terminal)
 
         free_vt_change_closures (terminal);
         free_input_closures (terminal);
+        free (terminal->keymap);
         free (terminal->name);
         free (terminal);
 }
@@ -855,6 +890,12 @@ ply_terminal_get_name (ply_terminal_t *terminal)
         return terminal->name;
 }
 
+const char *
+ply_terminal_get_keymap (ply_terminal_t *terminal)
+{
+        return terminal->keymap;
+}
+
 bool
 ply_terminal_get_capslock_state (ply_terminal_t *terminal)
 {
index 3ca1dc0c57aad348dfa4c1b2f85fd3de96a0bd7c..4ca4c81ce30a871bd5ae97a05628862af43db827 100644 (file)
@@ -93,6 +93,7 @@ void ply_terminal_ignore_mode_changes (ply_terminal_t *terminal,
                                        bool            should_ignore);
 
 const char *ply_terminal_get_name (ply_terminal_t *terminal);
+const char *ply_terminal_get_keymap (ply_terminal_t *terminal);
 bool ply_terminal_get_capslock_state (ply_terminal_t *terminal);
 int ply_terminal_get_vt_number (ply_terminal_t *terminal);
 bool ply_terminal_activate_vt (ply_terminal_t *terminal);