From: Hans de Goede Date: Mon, 30 Sep 2019 09:01:34 +0000 (+0200) Subject: terminal: add ply_terminal_get_keymap function X-Git-Tag: 0.9.5~34^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f91e78f446701b729d359cde61171d0dc340fb80;p=thirdparty%2Fplymouth.git terminal: add ply_terminal_get_keymap function Add a helper function to get the keymap from the terminal. Signed-off-by: Hans de Goede --- diff --git a/src/libply-splash-core/ply-terminal.c b/src/libply-splash-core/ply-terminal.c index 2a19579d..2b566863 100644 --- a/src/libply-splash-core/ply-terminal.c +++ b/src/libply-splash-core/ply-terminal.c @@ -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) { diff --git a/src/libply-splash-core/ply-terminal.h b/src/libply-splash-core/ply-terminal.h index 3ca1dc0c..4ca4c81c 100644 --- a/src/libply-splash-core/ply-terminal.h +++ b/src/libply-splash-core/ply-terminal.h @@ -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);