From 3e6d59cbd915836b209100c72e3173637af54886 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tom=C3=A1s=20Pinho?= Date: Fri, 2 Jun 2023 13:13:34 +0100 Subject: [PATCH] script: adds a new native GetCapslockState function to lib-plymouth Allows Plymouth Script-based themes to query the Capslock state directly to act on it by showing an icon or message. Takes in Ray's suggestions and base the implemention around the keyboard type instead, delegating to the renderer/terminal renderer types instead. --- src/libply-splash-core/ply-keyboard.c | 16 +++++++++++ src/libply-splash-core/ply-keyboard.h | 1 + src/plugins/splash/script/plugin.c | 3 +- .../splash/script/script-lib-plymouth.c | 28 ++++++++++++++++++- .../splash/script/script-lib-plymouth.h | 4 ++- 5 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/libply-splash-core/ply-keyboard.c b/src/libply-splash-core/ply-keyboard.c index 31e1ca53..477bfaaa 100644 --- a/src/libply-splash-core/ply-keyboard.c +++ b/src/libply-splash-core/ply-keyboard.c @@ -651,3 +651,19 @@ ply_keyboard_get_renderer (ply_keyboard_t *keyboard) return NULL; } +bool +ply_keyboard_get_capslock_state (ply_keyboard_t *keyboard) +{ + assert (keyboard != NULL); + + switch (keyboard->provider_type) { + case PLY_KEYBOARD_PROVIDER_TYPE_RENDERER: + return ply_renderer_get_capslock_state (keyboard->provider.if_renderer->renderer); + + + case PLY_KEYBOARD_PROVIDER_TYPE_TERMINAL: + return ply_terminal_get_capslock_state (keyboard->provider.if_terminal->terminal); + } + + return NULL; +} \ No newline at end of file diff --git a/src/libply-splash-core/ply-keyboard.h b/src/libply-splash-core/ply-keyboard.h index dd8a3f84..101defdb 100644 --- a/src/libply-splash-core/ply-keyboard.h +++ b/src/libply-splash-core/ply-keyboard.h @@ -73,6 +73,7 @@ bool ply_keyboard_watch_for_input (ply_keyboard_t *keyboard); void ply_keyboard_stop_watching_for_input (ply_keyboard_t *keyboard); bool ply_keyboard_is_active (ply_keyboard_t *keyboard); ply_renderer_t *ply_keyboard_get_renderer (ply_keyboard_t *keyboard); +bool ply_keyboard_get_capslock_state (ply_keyboard_t *keyboard); #endif diff --git a/src/plugins/splash/script/plugin.c b/src/plugins/splash/script/plugin.c index 6b04fd00..083fc0b9 100644 --- a/src/plugins/splash/script/plugin.c +++ b/src/plugins/splash/script/plugin.c @@ -273,7 +273,8 @@ start_script_animation (ply_boot_splash_plugin_t *plugin) plugin->displays); plugin->script_plymouth_lib = script_lib_plymouth_setup (plugin->script_state, plugin->mode, - FRAMES_PER_SECOND); + FRAMES_PER_SECOND, + plugin->keyboard); plugin->script_math_lib = script_lib_math_setup (plugin->script_state); plugin->script_string_lib = script_lib_string_setup (plugin->script_state); diff --git a/src/plugins/splash/script/script-lib-plymouth.c b/src/plugins/splash/script/script-lib-plymouth.c index 528ed303..df3a7983 100644 --- a/src/plugins/splash/script/script-lib-plymouth.c +++ b/src/plugins/splash/script/script-lib-plymouth.c @@ -19,6 +19,7 @@ * * Written by: Charlie Brej */ +#pragma weak ply_keyboard_get_capslock_state #include "config.h" @@ -91,9 +92,28 @@ static script_return_t plymouth_get_mode (script_state_t *state, return script_return_obj (obj); } +static script_return_t plymouth_get_capslock_state (script_state_t *state, + void *user_data) +{ + script_lib_plymouth_data_t *data = user_data; + script_obj_t *obj; + + bool is_on = false; + + if (ply_keyboard_get_capslock_state != NULL) { + is_on = ply_keyboard_get_capslock_state (data->keyboard); + } + + + obj = is_on ? script_obj_new_number (1) : script_obj_new_number (0); + + return script_return_obj (obj); +} + script_lib_plymouth_data_t *script_lib_plymouth_setup (script_state_t *state, ply_boot_splash_mode_t mode, - int refresh_rate) + int refresh_rate, + ply_keyboard_t *keyboard) { script_lib_plymouth_data_t *data = malloc (sizeof(script_lib_plymouth_data_t)); @@ -114,6 +134,7 @@ script_lib_plymouth_data_t *script_lib_plymouth_setup (script_state_t *st data->script_system_update_func = script_obj_new_null (); data->mode = mode; data->refresh_rate = refresh_rate; + data->keyboard = keyboard; script_obj_t *plymouth_hash = script_obj_hash_get_element (state->global, "Plymouth"); @@ -207,6 +228,11 @@ script_lib_plymouth_data_t *script_lib_plymouth_setup (script_state_t *st &data->script_quit_func, "function", NULL); + script_add_native_function (plymouth_hash, + "GetCapslockState", + plymouth_get_capslock_state, + data, + NULL); script_add_native_function (plymouth_hash, "GetMode", plymouth_get_mode, diff --git a/src/plugins/splash/script/script-lib-plymouth.h b/src/plugins/splash/script/script-lib-plymouth.h index 69ca1335..9d2a5e9c 100644 --- a/src/plugins/splash/script/script-lib-plymouth.h +++ b/src/plugins/splash/script/script-lib-plymouth.h @@ -45,11 +45,13 @@ typedef struct script_obj_t *script_system_update_func; ply_boot_splash_mode_t mode; int refresh_rate; + ply_keyboard_t *keyboard; } script_lib_plymouth_data_t; script_lib_plymouth_data_t *script_lib_plymouth_setup (script_state_t *state, ply_boot_splash_mode_t mode, - int refresh_rate); + int refresh_rate, + ply_keyboard_t *keyboard); void script_lib_plymouth_destroy (script_lib_plymouth_data_t *data); void script_lib_plymouth_on_refresh (script_state_t *state, -- 2.47.3