]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
device-manager: free keyboards when deactivating a renderer
authorMathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>
Tue, 4 Dec 2018 19:41:35 +0000 (14:41 -0500)
committerMathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>
Tue, 4 Dec 2018 20:15:28 +0000 (15:15 -0500)
Based on an original patch by Gert van de Kraats, on Ubuntu Launchpad bug:
https://bugs.launchpad.net/ubuntu/+source/plymouth/+bug/1794292

Signed-off-by: Mathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>
src/libply-splash-core/ply-device-manager.c

index d70e709de8be8a154d7d2d05a3353be38235adb4..8ceee10da2d609f15bb306aa2b6e889841899b46 100644 (file)
@@ -136,6 +136,34 @@ free_displays_for_renderer (ply_device_manager_t *manager,
         }
 }
 
+static void
+free_keyboards_for_renderer (ply_device_manager_t *manager,
+                            ply_renderer_t       *renderer)
+{
+        ply_list_node_t *node;
+
+        node = ply_list_get_first_node (manager->keyboards);
+        while (node != NULL) {
+                ply_list_node_t *next_node;
+                ply_keyboard_t *keyboard;
+                ply_renderer_t *keyboard_renderer;
+
+                keyboard = ply_list_node_get_data (node);
+                next_node = ply_list_get_next_node (manager->keyboards, node);
+                keyboard_renderer = ply_keyboard_get_renderer (keyboard);
+
+                if (keyboard_renderer == renderer) {
+                        ply_keyboard_free (keyboard);
+                        ply_list_remove_node (manager->keyboards, node);
+                }
+
+                node = next_node;
+        }
+        if (ply_list_get_first_node (manager->keyboards) == NULL) {
+                manager->local_console_managed = false;
+        }
+}
+
 static void
 free_devices_from_device_path (ply_device_manager_t *manager,
                                const char           *device_path)
@@ -152,6 +180,7 @@ free_devices_from_device_path (ply_device_manager_t *manager,
                 return;
 
         free_displays_for_renderer (manager, renderer);
+        free_keyboards_for_renderer (manager, renderer);
 
         ply_hashtable_remove (manager->renderers, (void *) device_path);
         free (key);