]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
script: adds a new native GetCapslockState function to lib-plymouth
authorTomás Pinho <me@tomaspinho.com>
Fri, 2 Jun 2023 12:13:34 +0000 (13:13 +0100)
committerTomás Pinho <me@tomaspinho.com>
Mon, 5 Jun 2023 17:21:10 +0000 (18:21 +0100)
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
src/libply-splash-core/ply-keyboard.h
src/plugins/splash/script/plugin.c
src/plugins/splash/script/script-lib-plymouth.c
src/plugins/splash/script/script-lib-plymouth.h

index 31e1ca5363b0bd47cf89587a7318fb4635fc0c76..477bfaaaba91d9c5c489edee6ae05fbb5a02fe0c 100644 (file)
@@ -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
index dd8a3f8496fae5cfc0de6b8929b2cbc125596160..101defdb82933c57b9766b4c163530734e695ec9 100644 (file)
@@ -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
 
index 6b04fd0026f58912466bd1c50b8e61a3c4b4c1de..083fc0b986cd0e3ae3735c59f904e53dfb143952 100644 (file)
@@ -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);
 
index 528ed303881e8d629a01c8449a41d2b3b507a109..df3a79837755f62dda8dc6da378f6b58b66d61c3 100644 (file)
@@ -19,6 +19,7 @@
  *
  * Written by: Charlie Brej <cbrej@cs.man.ac.uk>
  */
+#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,
index 69ca1335e132ac7e5a848bdc333a4d671073168a..9d2a5e9c8fe9b928bb1994cec4150a32cac333cd 100644 (file)
@@ -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,