diff --git a/CHANGELOG.md b/CHANGELOG.md index 38dc027..d76ef1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Nothing at the moment - feat: Update lvgl to v8.3 (2023-03-08) - feat!: Deprecate -c CLI option and add support for reading from /etc/unl0kr.conf.d/ - fix: Print correct version in logs +- feat: Add config options to enable terminal quirks (#34) ## 0.3.0 (2022-11-13) diff --git a/config.c b/config.c index 3860bda..e507b3f 100644 --- a/config.c +++ b/config.c @@ -229,6 +229,16 @@ static int parsing_handler(void* user_data, const char* section, const char* key return 1; } } + } else if (strcmp(section, "quirks") == 0) { + if (strcmp(key, "terminal_prevent_graphics_mode") == 0) { + if (parse_bool(value, &(opts->quirks.terminal_prevent_graphics_mode))) { + return 1; + } + } else if (strcmp(key, "terminal_allow_keyboard_input") == 0) { + if (parse_bool(value, &(opts->quirks.terminal_allow_keyboard_input))) { + return 1; + } + } } ul_log(UL_LOG_LEVEL_ERROR, "Ignoring invalid config value \"%s\" for key \"%s\" in section \"%s\"", value, key, section); @@ -268,6 +278,8 @@ void ul_config_init_opts(ul_config_opts *opts) { opts->input.keyboard = true; opts->input.pointer = true; opts->input.touchscreen = true; + opts->quirks.terminal_prevent_graphics_mode = false; + opts->quirks.terminal_allow_keyboard_input = false; } void ul_config_parse_directory(const char *path, ul_config_opts *opts) { diff --git a/config.h b/config.h index fc94fb8..8aa2ae4 100644 --- a/config.h +++ b/config.h @@ -34,10 +34,10 @@ * General options */ typedef struct { - /* Backend to use */ - ul_backends_backend_id_t backend; /* If true, use animations */ bool animations; + /* Backend to use */ + ul_backends_backend_id_t backend; /* Timeout (in seconds) - once elapsed, the device will shutdown. 0 (default) to disable */ uint16_t timeout; } ul_config_opts_general; @@ -86,6 +86,16 @@ typedef struct { bool touchscreen; } ul_config_opts_input; +/** + * (Normally unneeded) quirky options + */ +typedef struct { + /* If true, do *not* switch terminal into graphics mode (will show terminal command prompt) */ + bool terminal_prevent_graphics_mode; + /* If true, do *not* turn off terminal keyboard input (will show entered characters) */ + bool terminal_allow_keyboard_input; +} ul_config_opts_quirks; + /** * Options parsed from config file(s) */ @@ -100,6 +110,8 @@ typedef struct { ul_config_opts_theme theme; /* Options related to input devices */ ul_config_opts_input input; + /* Options related to (normally unneeded) quirks */ + ul_config_opts_quirks quirks; } ul_config_opts; /** diff --git a/main.c b/main.c index 461dc50..990604c 100644 --- a/main.c +++ b/main.c @@ -357,7 +357,7 @@ int main(int argc, char *argv[]) { ul_config_parse_files(cli_opts.config_files, cli_opts.num_config_files, &conf_opts); /* Prepare current TTY and clean up on termination */ - ul_terminal_prepare_current_terminal(); + ul_terminal_prepare_current_terminal(!conf_opts.quirks.terminal_prevent_graphics_mode, !conf_opts.quirks.terminal_allow_keyboard_input); struct sigaction action; memset(&action, 0, sizeof(action)); action.sa_handler = sigaction_handler; diff --git a/terminal.c b/terminal.c index de99586..c95b4f2 100644 --- a/terminal.c +++ b/terminal.c @@ -37,8 +37,8 @@ static int current_fd = -1; -static int original_mode = KD_TEXT; -static int original_kb_mode = K_UNICODE; +static int original_mode = -1; +static int original_kb_mode = -1; /** @@ -88,7 +88,13 @@ static void close_current_terminal(void) { * Public functions */ -void ul_terminal_prepare_current_terminal(void) { +void ul_terminal_prepare_current_terminal(bool enable_graphics_mode, bool disable_keyboard_input) { + /* Exit early if there is nothing to do */ + if (!enable_graphics_mode && !disable_keyboard_input) { + return; + } + + /* Reopen the current terminal */ reopen_current_terminal(); if (current_fd < 0) { @@ -96,40 +102,43 @@ void ul_terminal_prepare_current_terminal(void) { return; } - // NB: The order of calls appears to matter for some devices. See - // https://gitlab.com/cherrypicker/unl0kr/-/issues/34 for further info. + /* Disable terminal keyboard input (hides entered text) */ + if (disable_keyboard_input) { + if (ioctl(current_fd, KDGKBMODE, &original_kb_mode) != 0) { + ul_log(UL_LOG_LEVEL_WARNING, "Could not get terminal keyboard mode"); + } - if (ioctl(current_fd, KDGKBMODE, &original_kb_mode) != 0) { - ul_log(UL_LOG_LEVEL_WARNING, "Could not get terminal keyboard mode"); + if (ioctl(current_fd, KDSKBMODE, K_OFF) != 0) { + ul_log(UL_LOG_LEVEL_WARNING, "Could not set terminal keyboard mode to off"); + } } - if (ioctl(current_fd, KDSKBMODE, K_OFF) != 0) { - ul_log(UL_LOG_LEVEL_WARNING, "Could not set terminal keyboard mode to off"); - } + /* Switch terminal into graphics mode (hides command prompt) */ + if (enable_graphics_mode) { + if (ioctl(current_fd, KDGETMODE, &original_mode) != 0) { + ul_log(UL_LOG_LEVEL_WARNING, "Could not get terminal mode"); + } - if (ioctl(current_fd, KDGETMODE, &original_mode) != 0) { - ul_log(UL_LOG_LEVEL_WARNING, "Could not get terminal mode"); - } - - if (ioctl(current_fd, KDSETMODE, KD_GRAPHICS) != 0) { - ul_log(UL_LOG_LEVEL_WARNING, "Could not set terminal mode to graphics"); + if (ioctl(current_fd, KDSETMODE, KD_GRAPHICS) != 0) { + ul_log(UL_LOG_LEVEL_WARNING, "Could not set terminal mode to graphics"); + } } } void ul_terminal_reset_current_terminal(void) { + /* If we haven't previously opened the current terminal, exit */ if (current_fd < 0) { ul_log(UL_LOG_LEVEL_WARNING, "Could not reset current terminal"); return; } - // NB: The order of calls appears to matter for some devices. See - // https://gitlab.com/cherrypicker/unl0kr/-/issues/34 for further info. - - if (ioctl(current_fd, KDSETMODE, original_mode) != 0) { + /* Reset terminal mode if needed */ + if (original_mode >= 0 && ioctl(current_fd, KDSETMODE, original_mode) != 0) { ul_log(UL_LOG_LEVEL_WARNING, "Could not reset terminal mode"); } - if (ioctl(current_fd, KDSKBMODE, original_kb_mode) != 0) { + /* Reset terminal keyboard mode if needed */ + if (original_kb_mode >= 0 && ioctl(current_fd, KDSKBMODE, original_kb_mode) != 0) { ul_log(UL_LOG_LEVEL_WARNING, "Could not reset terminal keyboard mode"); } diff --git a/terminal.h b/terminal.h index d7d1764..dc0ddb8 100644 --- a/terminal.h +++ b/terminal.h @@ -21,10 +21,15 @@ #ifndef UL_TERMINAL_H #define UL_TERMINAL_H +#include + /** * Prepare the current TTY for graphics output. + * + * @param enable_graphics_mode if true, switch terminal into graphics mode (hides command prompt) + * @param disable_keyboard_input if true, disable terminal keyboard input (hides entered text) */ -void ul_terminal_prepare_current_terminal(void); +void ul_terminal_prepare_current_terminal(bool enable_graphics_mode, bool disable_keyboard_input); /** * Reset the current TTY to text output. diff --git a/unl0kr.conf b/unl0kr.conf index b79b642..184824d 100644 --- a/unl0kr.conf +++ b/unl0kr.conf @@ -20,3 +20,7 @@ alternate=breezy-dark #keyboard=false #pointer=false #touchscreen=false + +#[quirks] +#terminal_prevent_graphics_mode=true +#terminal_allow_keyboard_input=true