]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
Fix keymap and capslock icon on displays on second GPU
authorHans de Goede <hansg@kernel.org>
Wed, 2 Jul 2025 07:31:21 +0000 (09:31 +0200)
committerHans de Goede <hansg@kernel.org>
Mon, 14 Jul 2025 09:21:48 +0000 (11:21 +0200)
The keymap and capslock code in src/plugins/renderers/drm/plugin.c relies
on the terminal passed to backend_create() to get the keymap and current
capslock state (when not using evdev input because of e.g. no XKBLAYOUT
in /etc/vconsole.conf which is the default in at least Fedora).

When 2 GPUs which both have displays attached are used only the first
one gets passed the local_console_terminal as terminal (it is considered
the terminal owner and e.g. listens for keypresses). This leads to keymap
and capslock icons not being shown on displays attached to the second GPU.

To fix this add a second ply_terminal_t argument to backend_create() called
local_console_terminal, which will pass the local_console_terminal to both
drm plugin instances. And modify the drm plugin capslock and keymap code to
use this instead of the normal terminal argument which will be NULL on
the second GPU.

Link: https://bugzilla.redhat.com/show_bug.cgi?id=2375854
Signed-off-by: Hans de Goede <hansg@kernel.org>
src/libply-splash-core/ply-device-manager.c
src/libply-splash-core/ply-renderer-plugin.h
src/libply-splash-core/ply-renderer.c
src/libply-splash-core/ply-renderer.h
src/plugins/renderers/drm/plugin.c
src/plugins/renderers/frame-buffer/plugin.c
src/plugins/renderers/x11/plugin.c

index 7406d5f5c523b071844515d0badf53ca7984a42a..da53f3ae6ce3b7697f1b6e347fbfb0025e782d3b 100644 (file)
@@ -1116,7 +1116,8 @@ create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
                 bool force = manager->device_timeout_elapsed ||
                              (manager->flags & PLY_DEVICE_MANAGER_FLAGS_FORCE_OPEN);
 
-                renderer = ply_renderer_new (renderer_type, device_path, terminal);
+                renderer = ply_renderer_new (renderer_type, device_path,
+                                             terminal, manager->local_console_terminal);
 
                 if (renderer != NULL && !ply_renderer_open (renderer, force)) {
                         ply_trace ("could not open renderer for %s", device_path);
index d9f31de9f6f277317eb2a9b470f4ec26417edad3..7d18f1198b2ef5e898ef9d90d3e4436cf1fa1660 100644 (file)
@@ -39,7 +39,8 @@ typedef struct _ply_renderer_backend ply_renderer_backend_t;
 typedef struct
 {
         ply_renderer_backend_t * (*create_backend)(const char     *device_name,
-                                                   ply_terminal_t *terminal);
+                                                   ply_terminal_t *terminal,
+                                                   ply_terminal_t *local_console_terminal);
         void (*destroy_backend)(ply_renderer_backend_t *backend);
         bool (*open_device)(ply_renderer_backend_t *backend);
         void (*close_device)(ply_renderer_backend_t *backend);
index 2c555f464dc881f5b49df04745babf86043d1c77..21df22f99faac5899baeb48286204072e1b900d2 100644 (file)
@@ -51,6 +51,7 @@ struct _ply_renderer
         ply_renderer_type_t                    type;
         char                                  *device_name;
         ply_terminal_t                        *terminal;
+        ply_terminal_t                        *local_console_terminal;
 
         uint32_t                               input_source_is_open : 1;
         uint32_t                               is_mapped : 1;
@@ -65,7 +66,8 @@ static void ply_renderer_unload_plugin (ply_renderer_t *renderer);
 ply_renderer_t *
 ply_renderer_new (ply_renderer_type_t renderer_type,
                   const char         *device_name,
-                  ply_terminal_t     *terminal)
+                  ply_terminal_t     *terminal,
+                  ply_terminal_t     *local_console_terminal)
 {
         ply_renderer_t *renderer;
 
@@ -77,6 +79,7 @@ ply_renderer_new (ply_renderer_type_t renderer_type,
                 renderer->device_name = strdup (device_name);
 
         renderer->terminal = terminal;
+        renderer->local_console_terminal = local_console_terminal;
 
         return renderer;
 }
@@ -148,7 +151,8 @@ ply_renderer_load_plugin (ply_renderer_t *renderer,
         }
 
         renderer->backend = renderer->plugin_interface->create_backend (renderer->device_name,
-                                                                        renderer->terminal);
+                                                                        renderer->terminal,
+                                                                        renderer->local_console_terminal);
 
         if (renderer->backend == NULL) {
                 ply_save_errno ();
index 5ba181189d5616654d411eea4245955e8a858d65..7c3406e2821208a02f9a320584d9f4c149d0bd1f 100644 (file)
@@ -53,7 +53,8 @@ typedef void (*ply_renderer_input_source_handler_t) (void
 #ifndef PLY_HIDE_FUNCTION_DECLARATIONS
 ply_renderer_t *ply_renderer_new (ply_renderer_type_t renderer_type,
                                   const char         *device_name,
-                                  ply_terminal_t     *terminal);
+                                  ply_terminal_t     *terminal,
+                                  ply_terminal_t     *local_console_terminal);
 void ply_renderer_free (ply_renderer_t *renderer);
 bool ply_renderer_open (ply_renderer_t *renderer,
                         bool            force);
index 759d6f3e9cba61663ee162ce5116554039a364b1..54db911e5995acc31ad0ab64552d93c059141ae2 100644 (file)
@@ -138,6 +138,7 @@ struct _ply_renderer_backend
 {
         ply_event_loop_t           *loop;
         ply_terminal_t             *terminal;
+        ply_terminal_t             *local_console_terminal;
 
         int                         device_fd;
         bool                        simpledrm;
@@ -880,7 +881,8 @@ free_heads (ply_renderer_backend_t *backend)
 
 static ply_renderer_backend_t *
 create_backend (const char     *device_name,
-                ply_terminal_t *terminal)
+                ply_terminal_t *terminal,
+                ply_terminal_t *local_console_terminal)
 {
         ply_renderer_backend_t *backend;
 
@@ -900,6 +902,7 @@ create_backend (const char     *device_name,
         backend->input_source.key_buffer = ply_buffer_new ();
         backend->input_source.input_devices = ply_list_new ();
         backend->terminal = terminal;
+        backend->local_console_terminal = local_console_terminal;
         backend->requires_explicit_flushing = true;
         backend->output_buffers = ply_hashtable_new (ply_hashtable_direct_hash,
                                                      ply_hashtable_direct_compare);
@@ -2025,10 +2028,10 @@ get_capslock_state (ply_renderer_backend_t *backend)
 
                 return ply_input_device_get_capslock_state (dev);
         }
-        if (!backend->terminal)
+        if (!backend->local_console_terminal)
                 return false;
 
-        return ply_terminal_get_capslock_state (backend->terminal);
+        return ply_terminal_get_capslock_state (backend->local_console_terminal);
 }
 
 static const char *
@@ -2045,10 +2048,10 @@ get_keymap (ply_renderer_backend_t *backend)
                         return keymap;
                 }
         }
-        if (!backend->terminal)
+        if (!backend->local_console_terminal)
                 return NULL;
 
-        return ply_terminal_get_keymap (backend->terminal);
+        return ply_terminal_get_keymap (backend->local_console_terminal);
 }
 
 static void
index ea787f29a6ef896a671ed24720d0051258024cca..2e44812c4e8ed61dd05fb32864f46bbf05651eb7 100644 (file)
@@ -243,7 +243,8 @@ flush_area_to_xrgb32_device (ply_renderer_backend_t *backend,
 
 static ply_renderer_backend_t *
 create_backend (const char     *device_name,
-                ply_terminal_t *terminal)
+                ply_terminal_t *terminal,
+                ply_terminal_t *local_console_terminal)
 {
         ply_renderer_backend_t *backend;
 
index 87aa7a93c22e3cd499f070c7f84ae10d6942b59a..24c1859ec9d76d4efbf16355183658091c442a77 100644 (file)
@@ -115,7 +115,8 @@ static gboolean on_key_event (GtkWidget   *widget,
 
 static ply_renderer_backend_t *
 create_backend (const char     *device_name,
-                ply_terminal_t *terminal)
+                ply_terminal_t *terminal,
+                ply_terminal_t *local_console_terminal)
 {
         ply_renderer_backend_t *backend;