Blame SOURCES/activate-new-renderers.patch

01552a
From 14bdb7cadcfb2d3aac54b89b91217ef58abd8377 Mon Sep 17 00:00:00 2001
01552a
From: Ray Strode <rstrode@redhat.com>
01552a
Date: Thu, 24 Sep 2015 09:21:18 -0400
01552a
Subject: [PATCH 1/6] device-manager: activate new renderers after adding to
01552a
 renderers list
01552a
01552a
When a new renderer gets created, we should activate it, if the device
01552a
manager is already active.
01552a
01552a
At the moment we call create_pixel_displays_for_renderer which would
01552a
implicitly activate it (from a callback), except we call it one line
01552a
too early, so the renderer isn't in the list of known renderers yet.
01552a
01552a
This commit swaps the two lines and also adds an explicit renderer
01552a
activation for clarity.  For symmetry it makes the same change to
01552a
keyboards that it makes to renderers.
01552a
---
01552a
 src/libply-splash-core/ply-device-manager.c | 20 ++++++++++++++++++--
01552a
 1 file changed, 18 insertions(+), 2 deletions(-)
01552a
01552a
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
01552a
index f09448a..14d7616 100644
01552a
--- a/src/libply-splash-core/ply-device-manager.c
01552a
+++ b/src/libply-splash-core/ply-device-manager.c
01552a
@@ -45,60 +45,62 @@ static void create_devices_for_terminal_and_renderer_type (ply_device_manager_t
01552a
                                                            const char           *device_path,
01552a
                                                            ply_terminal_t       *terminal,
01552a
                                                            ply_renderer_type_t   renderer_type);
01552a
 struct _ply_device_manager
01552a
 {
01552a
   ply_device_manager_flags_t  flags;
01552a
   ply_event_loop_t           *loop;
01552a
   ply_hashtable_t            *terminals;
01552a
   ply_hashtable_t            *renderers;
01552a
   ply_terminal_t             *local_console_terminal;
01552a
   ply_list_t                 *keyboards;
01552a
   ply_list_t                 *text_displays;
01552a
   ply_list_t                 *pixel_displays;
01552a
   struct udev                *udev_context;
01552a
   struct udev_queue          *udev_queue;
01552a
   int                         udev_queue_fd;
01552a
   ply_fd_watch_t             *udev_queue_fd_watch;
01552a
   struct udev_monitor        *udev_monitor;
01552a
 
01552a
   ply_keyboard_added_handler_t         keyboard_added_handler;
01552a
   ply_keyboard_removed_handler_t       keyboard_removed_handler;
01552a
   ply_pixel_display_added_handler_t    pixel_display_added_handler;
01552a
   ply_pixel_display_removed_handler_t  pixel_display_removed_handler;
01552a
   ply_text_display_added_handler_t     text_display_added_handler;
01552a
   ply_text_display_removed_handler_t   text_display_removed_handler;
01552a
   void                                *event_handler_data;
01552a
 
01552a
   uint32_t                    local_console_managed : 1;
01552a
   uint32_t                    local_console_is_text : 1;
01552a
   uint32_t                    serial_consoles_detected : 1;
01552a
+  uint32_t                    renderers_activated : 1;
01552a
+  uint32_t                    keyboards_activated : 1;
01552a
 };
01552a
 
01552a
 static void
01552a
 detach_from_event_loop (ply_device_manager_t *manager)
01552a
 {
01552a
   assert (manager != NULL);
01552a
 
01552a
   manager->loop = NULL;
01552a
 }
01552a
 
01552a
 static void
01552a
 attach_to_event_loop (ply_device_manager_t *manager,
01552a
                       ply_event_loop_t     *loop)
01552a
 {
01552a
   assert (manager != NULL);
01552a
   assert (loop != NULL);
01552a
   assert (manager->loop == NULL);
01552a
 
01552a
   manager->loop = loop;
01552a
 
01552a
   ply_event_loop_watch_for_exit (loop, (ply_event_loop_exit_handler_t)
01552a
                                  detach_from_event_loop,
01552a
                                  manager);
01552a
 }
01552a
 
01552a
 static bool
01552a
 drm_device_in_use (ply_device_manager_t *manager,
01552a
                    const char           *device_path)
01552a
 {
01552a
   ply_renderer_t *renderer;
01552a
@@ -696,85 +698,92 @@ create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
01552a
       ply_trace ("ignoring device %s since it's already managed",
01552a
                  device_path);
01552a
       return;
01552a
     }
01552a
 
01552a
   ply_trace ("creating devices for %s (renderer type: %u) (terminal: %s)",
01552a
              device_path? : "", renderer_type, terminal? ply_terminal_get_name (terminal): "none");
01552a
 
01552a
   if (renderer_type != PLY_RENDERER_TYPE_NONE)
01552a
     {
01552a
       renderer = ply_renderer_new (renderer_type, device_path, terminal);
01552a
 
01552a
       if (!ply_renderer_open (renderer))
01552a
         {
01552a
           ply_trace ("could not open renderer for %s", device_path);
01552a
           ply_renderer_free (renderer);
01552a
           renderer = NULL;
01552a
           if (renderer_type != PLY_RENDERER_TYPE_AUTO)
01552a
             return;
01552a
         }
01552a
     }
01552a
 
01552a
   if (renderer != NULL)
01552a
     {
01552a
       keyboard = ply_keyboard_new_for_renderer (renderer);
01552a
       ply_list_append_data (manager->keyboards, keyboard);
01552a
 
01552a
       if (manager->keyboard_added_handler != NULL)
01552a
         manager->keyboard_added_handler (manager->event_handler_data, keyboard);
01552a
 
01552a
-      create_pixel_displays_for_renderer (manager, renderer);
01552a
       ply_hashtable_insert (manager->renderers, strdup (device_path), renderer);
01552a
+      create_pixel_displays_for_renderer (manager, renderer);
01552a
+
01552a
+      if (manager->renderers_activated)
01552a
+        {
01552a
+          ply_trace ("activating renderer");
01552a
+          ply_renderer_activate (renderer);
01552a
+        }
01552a
     }
01552a
   else if (terminal != NULL)
01552a
     {
01552a
       keyboard = ply_keyboard_new_for_terminal (terminal);
01552a
       ply_list_append_data (manager->keyboards, keyboard);
01552a
 
01552a
       if (manager->keyboard_added_handler != NULL)
01552a
         manager->keyboard_added_handler (manager->event_handler_data, keyboard);
01552a
     }
01552a
 
01552a
   if (terminal != NULL)
01552a
     {
01552a
       create_text_displays_for_terminal (manager, terminal);
01552a
 
01552a
       if (terminal == manager->local_console_terminal)
01552a
         {
01552a
           manager->local_console_is_text = renderer == NULL;
01552a
           manager->local_console_managed = true;
01552a
         }
01552a
     }
01552a
 
01552a
-  if (keyboard != NULL)
01552a
+  if (keyboard != NULL && manager->keyboards_activated)
01552a
     {
01552a
+      ply_trace ("activating keyboards");
01552a
       ply_keyboard_watch_for_input (keyboard);
01552a
     }
01552a
 }
01552a
 
01552a
 static void
01552a
 create_devices_for_terminal (const char           *device_path,
01552a
                              ply_terminal_t       *terminal,
01552a
                              ply_device_manager_t *manager)
01552a
 {
01552a
   create_devices_for_terminal_and_renderer_type (manager,
01552a
                                                  device_path,
01552a
                                                  terminal,
01552a
                                                  PLY_RENDERER_TYPE_NONE);
01552a
 }
01552a
 static bool
01552a
 create_devices_from_terminals (ply_device_manager_t *manager)
01552a
 {
01552a
   bool has_serial_consoles;
01552a
 
01552a
   ply_trace ("checking for consoles");
01552a
 
01552a
   if (manager->flags & PLY_DEVICE_MANAGER_FLAGS_IGNORE_SERIAL_CONSOLES)
01552a
     {
01552a
       has_serial_consoles = false;
01552a
       ply_trace ("ignoring all consoles but default console because explicitly told to.");
01552a
     }
01552a
   else
01552a
     {
01552a
       has_serial_consoles = add_consoles_from_file (manager, "/sys/class/tty/console/active");
01552a
     }
01552a
@@ -946,91 +955,98 @@ ply_device_manager_get_text_displays (ply_device_manager_t *manager)
01552a
 }
01552a
 
01552a
 ply_terminal_t *
01552a
 ply_device_manager_get_default_terminal (ply_device_manager_t *manager)
01552a
 {
01552a
   return manager->local_console_terminal;
01552a
 }
01552a
 
01552a
 bool
01552a
 ply_device_manager_has_serial_consoles (ply_device_manager_t *manager)
01552a
 {
01552a
   return manager->serial_consoles_detected;
01552a
 }
01552a
 
01552a
 static void
01552a
 activate_renderer (char                 *device_path,
01552a
                    ply_renderer_t       *renderer,
01552a
                    ply_device_manager_t *manager)
01552a
 {
01552a
   ply_renderer_activate (renderer);
01552a
 }
01552a
 
01552a
 void
01552a
 ply_device_manager_activate_renderers (ply_device_manager_t *manager)
01552a
 {
01552a
   ply_trace ("activating renderers");
01552a
   ply_hashtable_foreach (manager->renderers,
01552a
                          (ply_hashtable_foreach_func_t *)
01552a
                          activate_renderer,
01552a
                          manager);
01552a
+
01552a
+  manager->renderers_activated = true;
01552a
 }
01552a
 
01552a
 static void
01552a
 deactivate_renderer (char                 *device_path,
01552a
                      ply_renderer_t       *renderer,
01552a
                      ply_device_manager_t *manager)
01552a
 {
01552a
   ply_renderer_deactivate (renderer);
01552a
 }
01552a
 
01552a
 void
01552a
 ply_device_manager_deactivate_renderers (ply_device_manager_t *manager)
01552a
 {
01552a
   ply_trace ("deactivating renderers");
01552a
   ply_hashtable_foreach (manager->renderers,
01552a
                          (ply_hashtable_foreach_func_t *)
01552a
                          deactivate_renderer,
01552a
                          manager);
01552a
+  manager->renderers_activated = false;
01552a
 }
01552a
 
01552a
 void
01552a
 ply_device_manager_activate_keyboards (ply_device_manager_t *manager)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   ply_trace ("activating keyboards");
01552a
   node = ply_list_get_first_node (manager->keyboards);
01552a
   while (node != NULL)
01552a
     {
01552a
       ply_keyboard_t *keyboard;
01552a
       ply_list_node_t *next_node;
01552a
 
01552a
       keyboard = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (manager->keyboards, node);
01552a
 
01552a
       ply_keyboard_watch_for_input (keyboard);
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
+
01552a
+  manager->keyboards_activated = true;
01552a
 }
01552a
 
01552a
 void
01552a
 ply_device_manager_deactivate_keyboards (ply_device_manager_t *manager)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   ply_trace ("deactivating keyboards");
01552a
   node = ply_list_get_first_node (manager->keyboards);
01552a
   while (node != NULL)
01552a
     {
01552a
       ply_keyboard_t *keyboard;
01552a
       ply_list_node_t *next_node;
01552a
 
01552a
       keyboard = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (manager->keyboards, node);
01552a
 
01552a
       ply_keyboard_stop_watching_for_input (keyboard);
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
+
01552a
+  manager->keyboards_activated = false;
01552a
 }
01552a
-- 
01552a
2.5.0
01552a
01552a
01552a
From 61ca85cd95de1e467e4996a5563c5f77221e569f Mon Sep 17 00:00:00 2001
01552a
From: Ray Strode <rstrode@redhat.com>
01552a
Date: Thu, 24 Sep 2015 15:53:01 -0400
01552a
Subject: [PATCH 2/6] plugins: unset draw handler when freeing view
01552a
01552a
If the view is freed, we definitely shouldn't draw
01552a
the view's display anymore.
01552a
---
01552a
 src/plugins/splash/fade-throbber/plugin.c | 4 ++--
01552a
 src/plugins/splash/space-flares/plugin.c  | 4 ++--
01552a
 src/plugins/splash/throbgress/plugin.c    | 4 ++--
01552a
 src/plugins/splash/two-step/plugin.c      | 3 ++-
01552a
 4 files changed, 8 insertions(+), 7 deletions(-)
01552a
01552a
diff --git a/src/plugins/splash/fade-throbber/plugin.c b/src/plugins/splash/fade-throbber/plugin.c
01552a
index 4af6cae..7b097c0 100644
01552a
--- a/src/plugins/splash/fade-throbber/plugin.c
01552a
+++ b/src/plugins/splash/fade-throbber/plugin.c
01552a
@@ -240,60 +240,62 @@ free_stars (view_t *view)
01552a
 
01552a
 static void detach_from_event_loop (ply_boot_splash_plugin_t *plugin);
01552a
 
01552a
 static view_t *
01552a
 view_new (ply_boot_splash_plugin_t *plugin,
01552a
           ply_pixel_display_t      *display)
01552a
 {
01552a
   view_t *view;
01552a
 
01552a
   view = calloc (1, sizeof (view_t));
01552a
   view->plugin = plugin;
01552a
   view->display = display;
01552a
 
01552a
   view->entry = ply_entry_new (plugin->image_dir);
01552a
   view->stars = ply_list_new ();
01552a
   view->label = ply_label_new ();
01552a
 
01552a
   view->message_label = ply_label_new ();
01552a
 
01552a
   return view;
01552a
 }
01552a
 
01552a
 static void
01552a
 view_free (view_t *view)
01552a
 {
01552a
 
01552a
   ply_entry_free (view->entry);
01552a
   ply_label_free (view->message_label);
01552a
   free_stars (view);
01552a
 
01552a
+  ply_pixel_display_set_draw_handler (view->display, NULL, NULL);
01552a
+
01552a
   free (view);
01552a
 }
01552a
 
01552a
 static bool
01552a
 view_load (view_t *view)
01552a
 {
01552a
   ply_trace ("loading entry");
01552a
   if (!ply_entry_load (view->entry))
01552a
     return false;
01552a
 
01552a
   return true;
01552a
 }
01552a
 
01552a
 static bool
01552a
 load_views (ply_boot_splash_plugin_t *plugin)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
   bool view_loaded;
01552a
 
01552a
   view_loaded = false;
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
 
01552a
   while (node != NULL)
01552a
     {
01552a
       ply_list_node_t *next_node;
01552a
       view_t *view;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
@@ -753,62 +755,60 @@ add_pixel_display (ply_boot_splash_plugin_t *plugin,
01552a
                    ply_pixel_display_t      *display)
01552a
 {
01552a
   view_t *view;
01552a
 
01552a
   view = view_new (plugin, display);
01552a
 
01552a
   ply_pixel_display_set_draw_handler (view->display,
01552a
                                       (ply_pixel_display_draw_handler_t)
01552a
                                       on_draw, view);
01552a
 
01552a
   ply_list_append_data (plugin->views, view);
01552a
 }
01552a
 
01552a
 static void
01552a
 remove_pixel_display (ply_boot_splash_plugin_t *plugin,
01552a
                       ply_pixel_display_t      *display)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
   while (node != NULL)
01552a
     {
01552a
       view_t *view;
01552a
       ply_list_node_t *next_node;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       if (view->display == display)
01552a
         {
01552a
-
01552a
-          ply_pixel_display_set_draw_handler (view->display, NULL, NULL);
01552a
           view_free (view);
01552a
           ply_list_remove_node (plugin->views, node);
01552a
           return;
01552a
         }
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 }
01552a
 
01552a
 static bool
01552a
 show_splash_screen (ply_boot_splash_plugin_t *plugin,
01552a
                     ply_event_loop_t         *loop,
01552a
                     ply_buffer_t             *boot_buffer,
01552a
                     ply_boot_splash_mode_t    mode)
01552a
 {
01552a
   assert (plugin != NULL);
01552a
   assert (plugin->logo_image != NULL);
01552a
 
01552a
   plugin->loop = loop;
01552a
   plugin->mode = mode;
01552a
 
01552a
   ply_trace ("loading logo image");
01552a
   if (!ply_image_load (plugin->logo_image))
01552a
     return false;
01552a
 
01552a
   ply_trace ("loading star image");
01552a
   if (!ply_image_load (plugin->star_image))
01552a
     return false;
01552a
 
01552a
   ply_trace ("loading lock image");
01552a
diff --git a/src/plugins/splash/space-flares/plugin.c b/src/plugins/splash/space-flares/plugin.c
01552a
index e31dce8..45863ff 100644
01552a
--- a/src/plugins/splash/space-flares/plugin.c
01552a
+++ b/src/plugins/splash/space-flares/plugin.c
01552a
@@ -210,60 +210,62 @@ static view_t *
01552a
 view_new (ply_boot_splash_plugin_t *plugin,
01552a
           ply_pixel_display_t      *display)
01552a
 {
01552a
   view_t *view;
01552a
 
01552a
   view = calloc (1, sizeof (view_t));
01552a
   view->plugin = plugin;
01552a
   view->display = display;
01552a
 
01552a
   view->entry = ply_entry_new (plugin->image_dir);
01552a
   view->label = ply_label_new ();
01552a
   view->message_label = ply_label_new ();
01552a
 
01552a
   view->sprites = ply_list_new ();
01552a
 
01552a
   return view;
01552a
 }
01552a
 
01552a
 static void view_free_sprites (view_t *view);
01552a
 
01552a
 static void
01552a
 view_free (view_t *view)
01552a
 {
01552a
 
01552a
   ply_entry_free (view->entry);
01552a
   ply_label_free (view->label);
01552a
   ply_label_free (view->message_label);
01552a
   view_free_sprites (view);
01552a
   ply_list_free (view->sprites);
01552a
 
01552a
+  ply_pixel_display_set_draw_handler (view->display, NULL, NULL);
01552a
+
01552a
   ply_image_free (view->scaled_background_image);
01552a
 
01552a
   free (view);
01552a
 }
01552a
 
01552a
 static void
01552a
 free_views (ply_boot_splash_plugin_t *plugin)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
   while (node != NULL)
01552a
     {
01552a
       ply_list_node_t *next_node;
01552a
       view_t *view;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       view_free (view);
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 
01552a
   ply_list_free (plugin->views);
01552a
   plugin->views = NULL;
01552a
 }
01552a
 
01552a
 static bool
01552a
 view_load (view_t *view)
01552a
@@ -1428,62 +1430,60 @@ add_pixel_display (ply_boot_splash_plugin_t *plugin,
01552a
                    ply_pixel_display_t      *display)
01552a
 {
01552a
   view_t *view;
01552a
 
01552a
   view = view_new (plugin, display);
01552a
 
01552a
   ply_pixel_display_set_draw_handler (view->display,
01552a
                                       (ply_pixel_display_draw_handler_t)
01552a
                                       on_draw, view);
01552a
 
01552a
   ply_list_append_data (plugin->views, view);
01552a
 }
01552a
 
01552a
 static void
01552a
 remove_pixel_display (ply_boot_splash_plugin_t *plugin,
01552a
                       ply_pixel_display_t      *display)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
   while (node != NULL)
01552a
     {
01552a
       view_t *view;
01552a
       ply_list_node_t *next_node;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       if (view->display == display)
01552a
         {
01552a
-
01552a
-          ply_pixel_display_set_draw_handler (view->display, NULL, NULL);
01552a
           view_free (view);
01552a
           ply_list_remove_node (plugin->views, node);
01552a
           return;
01552a
         }
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 }
01552a
 
01552a
 static void
01552a
 view_setup_scene (view_t *view)
01552a
 {
01552a
   ply_boot_splash_plugin_t *plugin;
01552a
   sprite_t *sprite;
01552a
   int i;
01552a
   int x, y;
01552a
   int width = 360;
01552a
   int height = 460;
01552a
   unsigned long screen_width, screen_height;
01552a
 
01552a
   plugin = view->plugin;
01552a
 
01552a
   screen_width = ply_pixel_display_get_width (view->display);
01552a
   screen_height = ply_pixel_display_get_height (view->display);
01552a
 
01552a
     {
01552a
       star_bg_t* star_bg;
01552a
       if (view->scaled_background_image)
01552a
         ply_image_free (view->scaled_background_image);
01552a
       view->scaled_background_image = ply_image_resize (plugin->logo_image, screen_width, screen_height);
01552a
diff --git a/src/plugins/splash/throbgress/plugin.c b/src/plugins/splash/throbgress/plugin.c
01552a
index fba809b..d669a74 100644
01552a
--- a/src/plugins/splash/throbgress/plugin.c
01552a
+++ b/src/plugins/splash/throbgress/plugin.c
01552a
@@ -115,60 +115,62 @@ static void become_idle (ply_boot_splash_plugin_t *plugin,
01552a
 static view_t *
01552a
 view_new (ply_boot_splash_plugin_t *plugin,
01552a
           ply_pixel_display_t      *display)
01552a
 {
01552a
   view_t *view;
01552a
 
01552a
   view = calloc (1, sizeof (view_t));
01552a
   view->plugin = plugin;
01552a
   view->display = display;
01552a
 
01552a
   view->entry = ply_entry_new (plugin->image_dir);
01552a
   view->throbber = ply_throbber_new (plugin->image_dir,
01552a
                                      "throbber-");
01552a
   view->progress_bar = ply_progress_bar_new ();
01552a
   view->label = ply_label_new ();
01552a
   view->message_label = ply_label_new ();
01552a
 
01552a
   return view;
01552a
 }
01552a
 
01552a
 static void
01552a
 view_free (view_t *view)
01552a
 {
01552a
 
01552a
   ply_entry_free (view->entry);
01552a
   ply_throbber_free (view->throbber);
01552a
   ply_progress_bar_free (view->progress_bar);
01552a
   ply_label_free (view->label);
01552a
   ply_label_free (view->message_label);
01552a
 
01552a
+  ply_pixel_display_set_draw_handler (view->display, NULL, NULL);
01552a
+
01552a
   free (view);
01552a
 }
01552a
 
01552a
 static void
01552a
 free_views (ply_boot_splash_plugin_t *plugin)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
 
01552a
   while (node != NULL)
01552a
     {
01552a
       ply_list_node_t *next_node;
01552a
       view_t *view;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       view_free (view);
01552a
       ply_list_remove_node (plugin->views, node);
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 
01552a
   ply_list_free (plugin->views);
01552a
   plugin->views = NULL;
01552a
 }
01552a
 
01552a
 static bool
01552a
 view_load (view_t *view)
01552a
@@ -631,62 +633,60 @@ add_pixel_display (ply_boot_splash_plugin_t *plugin,
01552a
   view_t *view;
01552a
 
01552a
   ply_trace ("adding pixel display to plugin");
01552a
   view = view_new (plugin, display);
01552a
 
01552a
   ply_pixel_display_set_draw_handler (view->display,
01552a
                                       (ply_pixel_display_draw_handler_t)
01552a
                                       on_draw, view);
01552a
 
01552a
   ply_list_append_data (plugin->views, view);
01552a
 }
01552a
 
01552a
 static void
01552a
 remove_pixel_display (ply_boot_splash_plugin_t *plugin,
01552a
                       ply_pixel_display_t      *display)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   ply_trace ("removing pixel display from plugin");
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
   while (node != NULL)
01552a
     {
01552a
       view_t *view;
01552a
       ply_list_node_t *next_node;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       if (view->display == display)
01552a
         {
01552a
-
01552a
-          ply_pixel_display_set_draw_handler (view->display, NULL, NULL);
01552a
           view_free (view);
01552a
           ply_list_remove_node (plugin->views, node);
01552a
           return;
01552a
         }
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 }
01552a
 
01552a
 static bool
01552a
 show_splash_screen (ply_boot_splash_plugin_t *plugin,
01552a
                     ply_event_loop_t         *loop,
01552a
                     ply_buffer_t             *boot_buffer,
01552a
                     ply_boot_splash_mode_t    mode)
01552a
 {
01552a
   assert (plugin != NULL);
01552a
   assert (plugin->logo_image != NULL);
01552a
 
01552a
   plugin->loop = loop;
01552a
   plugin->mode = mode;
01552a
 
01552a
   ply_trace ("loading logo image");
01552a
   if (!ply_image_load (plugin->logo_image))
01552a
     return false;
01552a
 
01552a
   ply_trace ("loading lock image");
01552a
   if (!ply_image_load (plugin->lock_image))
01552a
     return false;
01552a
 
01552a
   ply_trace ("loading box image");
01552a
diff --git a/src/plugins/splash/two-step/plugin.c b/src/plugins/splash/two-step/plugin.c
01552a
index f48b41e..0253aac 100644
01552a
--- a/src/plugins/splash/two-step/plugin.c
01552a
+++ b/src/plugins/splash/two-step/plugin.c
01552a
@@ -155,60 +155,62 @@ view_new (ply_boot_splash_plugin_t *plugin,
01552a
 
01552a
   view->entry = ply_entry_new (plugin->animation_dir);
01552a
   view->end_animation = ply_animation_new (plugin->animation_dir,
01552a
                                            "animation-");
01552a
   view->progress_animation = ply_progress_animation_new (plugin->animation_dir,
01552a
                                                          "progress-");
01552a
 
01552a
   view->throbber = ply_throbber_new (plugin->animation_dir,
01552a
                                      "throbber-");
01552a
   ply_progress_animation_set_transition (view->progress_animation,
01552a
                                          plugin->transition,
01552a
                                          plugin->transition_duration);
01552a
 
01552a
   view->label = ply_label_new ();
01552a
   view->message_label = ply_label_new ();
01552a
 
01552a
   return view;
01552a
 }
01552a
 
01552a
 static void
01552a
 view_free (view_t *view)
01552a
 {
01552a
 
01552a
   ply_entry_free (view->entry);
01552a
   ply_animation_free (view->end_animation);
01552a
   ply_progress_animation_free (view->progress_animation);
01552a
   ply_throbber_free (view->throbber);
01552a
   ply_label_free (view->label);
01552a
   ply_label_free (view->message_label);
01552a
 
01552a
+  ply_pixel_display_set_draw_handler (view->display, NULL, NULL);
01552a
+
01552a
   if (view->background_image != NULL)
01552a
     ply_image_free (view->background_image);
01552a
 
01552a
   free (view);
01552a
 }
01552a
 
01552a
 static bool
01552a
 view_load (view_t *view)
01552a
 {
01552a
   unsigned long screen_width, screen_height;
01552a
   ply_boot_splash_plugin_t *plugin;
01552a
 
01552a
   plugin = view->plugin;
01552a
 
01552a
   screen_width = ply_pixel_display_get_width (view->display);
01552a
   screen_height = ply_pixel_display_get_height (view->display);
01552a
 
01552a
   if (plugin->background_tile_image != NULL)
01552a
     {
01552a
       ply_trace ("tiling background to %lux%lu", screen_width, screen_height);
01552a
       view->background_image = ply_image_tile (plugin->background_tile_image, screen_width, screen_height);
01552a
     }
01552a
 
01552a
   if (plugin->watermark_image != NULL)
01552a
     {
01552a
       view->watermark_area.width = ply_image_get_width (plugin->watermark_image);
01552a
       view->watermark_area.height = ply_image_get_height (plugin->watermark_image);
01552a
       view->watermark_area.x = screen_width * plugin->watermark_horizontal_alignment - ply_image_get_width (plugin->watermark_image) * plugin->watermark_horizontal_alignment;
01552a
       view->watermark_area.y = screen_height * plugin->watermark_vertical_alignment - ply_image_get_height (plugin->watermark_image) * plugin->watermark_vertical_alignment;
01552a
     }
01552a
@@ -993,61 +995,60 @@ add_pixel_display (ply_boot_splash_plugin_t *plugin,
01552a
   view_t *view;
01552a
 
01552a
   ply_trace ("adding pixel display to plugin");
01552a
   view = view_new (plugin, display);
01552a
 
01552a
   ply_pixel_display_set_draw_handler (view->display,
01552a
                                       (ply_pixel_display_draw_handler_t)
01552a
                                       on_draw, view);
01552a
   ply_list_append_data (plugin->views, view);
01552a
 }
01552a
 
01552a
 static void
01552a
 remove_pixel_display (ply_boot_splash_plugin_t *plugin,
01552a
                       ply_pixel_display_t      *display)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   ply_trace ("removing pixel display from plugin");
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
   while (node != NULL)
01552a
     {
01552a
       view_t *view;
01552a
       ply_list_node_t *next_node;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       if (view->display == display)
01552a
         {
01552a
 
01552a
-          ply_pixel_display_set_draw_handler (view->display, NULL, NULL);
01552a
           view_free (view);
01552a
           ply_list_remove_node (plugin->views, node);
01552a
           return;
01552a
         }
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 }
01552a
 
01552a
 static bool
01552a
 show_splash_screen (ply_boot_splash_plugin_t *plugin,
01552a
                     ply_event_loop_t         *loop,
01552a
                     ply_buffer_t             *boot_buffer,
01552a
                     ply_boot_splash_mode_t    mode)
01552a
 {
01552a
   assert (plugin != NULL);
01552a
 
01552a
   plugin->loop = loop;
01552a
   plugin->mode = mode;
01552a
 
01552a
   ply_trace ("loading lock image");
01552a
   if (!ply_image_load (plugin->lock_image))
01552a
     return false;
01552a
 
01552a
   ply_trace ("loading box image");
01552a
   if (!ply_image_load (plugin->box_image))
01552a
     return false;
01552a
 
01552a
   if (plugin->corner_image != NULL)
01552a
     {
01552a
-- 
01552a
2.5.0
01552a
01552a
01552a
From b849b3edc60cac8d1c1f7a66d103768abdb71666 Mon Sep 17 00:00:00 2001
01552a
From: Ray Strode <rstrode@redhat.com>
01552a
Date: Thu, 24 Sep 2015 15:55:08 -0400
01552a
Subject: [PATCH 3/6] plugins: free views that can't load
01552a
01552a
Trying to use an unloaded view can lead to crashes.
01552a
If a view can't be loaded, free it right away.
01552a
---
01552a
 src/plugins/splash/fade-throbber/plugin.c | 9 ++++++++-
01552a
 src/plugins/splash/space-flares/plugin.c  | 9 ++++++++-
01552a
 src/plugins/splash/throbgress/plugin.c    | 9 ++++++++-
01552a
 src/plugins/splash/two-step/plugin.c      | 9 ++++++++-
01552a
 4 files changed, 32 insertions(+), 4 deletions(-)
01552a
01552a
diff --git a/src/plugins/splash/fade-throbber/plugin.c b/src/plugins/splash/fade-throbber/plugin.c
01552a
index 7b097c0..953186d 100644
01552a
--- a/src/plugins/splash/fade-throbber/plugin.c
01552a
+++ b/src/plugins/splash/fade-throbber/plugin.c
01552a
@@ -273,61 +273,68 @@ view_free (view_t *view)
01552a
 }
01552a
 
01552a
 static bool
01552a
 view_load (view_t *view)
01552a
 {
01552a
   ply_trace ("loading entry");
01552a
   if (!ply_entry_load (view->entry))
01552a
     return false;
01552a
 
01552a
   return true;
01552a
 }
01552a
 
01552a
 static bool
01552a
 load_views (ply_boot_splash_plugin_t *plugin)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
   bool view_loaded;
01552a
 
01552a
   view_loaded = false;
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
 
01552a
   while (node != NULL)
01552a
     {
01552a
       ply_list_node_t *next_node;
01552a
       view_t *view;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       if (view_load (view))
01552a
-        view_loaded = true;
01552a
+        {
01552a
+          view_loaded = true;
01552a
+        }
01552a
+      else
01552a
+        {
01552a
+          ply_list_remove_node (plugin->views, node);
01552a
+          view_free (view);
01552a
+        }
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 
01552a
   return view_loaded;
01552a
 }
01552a
 
01552a
 static void
01552a
 view_redraw (view_t *view)
01552a
 {
01552a
   unsigned long screen_width, screen_height;
01552a
 
01552a
   screen_width = ply_pixel_display_get_width (view->display);
01552a
   screen_height = ply_pixel_display_get_height (view->display);
01552a
 
01552a
   ply_pixel_display_draw_area (view->display, 0, 0,
01552a
                                screen_width, screen_height);
01552a
 }
01552a
 
01552a
 static void
01552a
 redraw_views (ply_boot_splash_plugin_t *plugin)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
   while (node != NULL)
01552a
     {
01552a
       ply_list_node_t *next_node;
01552a
       view_t *view;
01552a
 
01552a
diff --git a/src/plugins/splash/space-flares/plugin.c b/src/plugins/splash/space-flares/plugin.c
01552a
index 45863ff..b18f39f 100644
01552a
--- a/src/plugins/splash/space-flares/plugin.c
01552a
+++ b/src/plugins/splash/space-flares/plugin.c
01552a
@@ -268,61 +268,68 @@ free_views (ply_boot_splash_plugin_t *plugin)
01552a
 }
01552a
 
01552a
 static bool
01552a
 view_load (view_t *view)
01552a
 {
01552a
   ply_trace ("loading entry");
01552a
   if (!ply_entry_load (view->entry))
01552a
     return false;
01552a
 
01552a
   return true;
01552a
 }
01552a
 
01552a
 static bool
01552a
 load_views (ply_boot_splash_plugin_t *plugin)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
   bool view_loaded;
01552a
 
01552a
   view_loaded = false;
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
 
01552a
   while (node != NULL)
01552a
     {
01552a
       ply_list_node_t *next_node;
01552a
       view_t *view;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       if (view_load (view))
01552a
-        view_loaded = true;
01552a
+        {
01552a
+          view_loaded = true;
01552a
+        }
01552a
+      else
01552a
+        {
01552a
+          ply_list_remove_node (plugin->views, node);
01552a
+          view_free (view);
01552a
+        }
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 
01552a
   return view_loaded;
01552a
 }
01552a
 
01552a
 static void
01552a
 view_redraw (view_t *view)
01552a
 {
01552a
   unsigned long screen_width, screen_height;
01552a
 
01552a
   screen_width = ply_pixel_display_get_width (view->display);
01552a
   screen_height = ply_pixel_display_get_height (view->display);
01552a
 
01552a
   ply_pixel_display_draw_area (view->display, 0, 0,
01552a
                                screen_width, screen_height);
01552a
 }
01552a
 
01552a
 static void
01552a
 redraw_views (ply_boot_splash_plugin_t *plugin)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
   while (node != NULL)
01552a
     {
01552a
       ply_list_node_t *next_node;
01552a
       view_t *view;
01552a
 
01552a
diff --git a/src/plugins/splash/throbgress/plugin.c b/src/plugins/splash/throbgress/plugin.c
01552a
index d669a74..e3ce91b 100644
01552a
--- a/src/plugins/splash/throbgress/plugin.c
01552a
+++ b/src/plugins/splash/throbgress/plugin.c
01552a
@@ -177,61 +177,68 @@ view_load (view_t *view)
01552a
 {
01552a
   ply_trace ("loading entry");
01552a
   if (!ply_entry_load (view->entry))
01552a
     return false;
01552a
 
01552a
   ply_trace ("loading throbber");
01552a
   if (!ply_throbber_load (view->throbber))
01552a
     return false;
01552a
 
01552a
   return true;
01552a
 }
01552a
 
01552a
 static bool
01552a
 load_views (ply_boot_splash_plugin_t *plugin)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
   bool view_loaded;
01552a
 
01552a
   view_loaded = false;
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
 
01552a
   while (node != NULL)
01552a
     {
01552a
       ply_list_node_t *next_node;
01552a
       view_t *view;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       if (view_load (view))
01552a
-        view_loaded = true;
01552a
+        {
01552a
+          view_loaded = true;
01552a
+        }
01552a
+      else
01552a
+        {
01552a
+          ply_list_remove_node (plugin->views, node);
01552a
+          view_free (view);
01552a
+        }
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 
01552a
   return view_loaded;
01552a
 }
01552a
 
01552a
 static void
01552a
 view_redraw (view_t *view)
01552a
 {
01552a
   unsigned long screen_width, screen_height;
01552a
 
01552a
   screen_width = ply_pixel_display_get_width (view->display);
01552a
   screen_height = ply_pixel_display_get_height (view->display);
01552a
 
01552a
   ply_pixel_display_draw_area (view->display, 0, 0,
01552a
                                screen_width, screen_height);
01552a
 }
01552a
 
01552a
 static void
01552a
 redraw_views (ply_boot_splash_plugin_t *plugin)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
   while (node != NULL)
01552a
     {
01552a
       ply_list_node_t *next_node;
01552a
       view_t *view;
01552a
 
01552a
diff --git a/src/plugins/splash/two-step/plugin.c b/src/plugins/splash/two-step/plugin.c
01552a
index 0253aac..4612e3f 100644
01552a
--- a/src/plugins/splash/two-step/plugin.c
01552a
+++ b/src/plugins/splash/two-step/plugin.c
01552a
@@ -257,61 +257,68 @@ view_load (view_t *view)
01552a
           ply_throbber_free (view->throbber);
01552a
           view->throbber = NULL;
01552a
         }
01552a
     }
01552a
   else
01552a
     {
01552a
       ply_trace ("this theme has no throbber\n");
01552a
     }
01552a
 
01552a
   return true;
01552a
 }
01552a
 
01552a
 static bool
01552a
 load_views (ply_boot_splash_plugin_t *plugin)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
   bool view_loaded;
01552a
 
01552a
   view_loaded = false;
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
 
01552a
   while (node != NULL)
01552a
     {
01552a
       ply_list_node_t *next_node;
01552a
       view_t *view;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       if (view_load (view))
01552a
-        view_loaded = true;
01552a
+        {
01552a
+          view_loaded = true;
01552a
+        }
01552a
+      else
01552a
+        {
01552a
+          ply_list_remove_node (plugin->views, node);
01552a
+          view_free (view);
01552a
+        }
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 
01552a
   return view_loaded;
01552a
 }
01552a
 
01552a
 static void
01552a
 view_redraw (view_t *view)
01552a
 {
01552a
   unsigned long screen_width, screen_height;
01552a
 
01552a
   screen_width = ply_pixel_display_get_width (view->display);
01552a
   screen_height = ply_pixel_display_get_height (view->display);
01552a
 
01552a
   ply_pixel_display_draw_area (view->display, 0, 0,
01552a
                                screen_width, screen_height);
01552a
 }
01552a
 
01552a
 static void
01552a
 redraw_views (ply_boot_splash_plugin_t *plugin)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
   while (node != NULL)
01552a
     {
01552a
       ply_list_node_t *next_node;
01552a
       view_t *view;
01552a
 
01552a
-- 
01552a
2.5.0
01552a
01552a
01552a
From a790e8d26d81b978ed2d90a5730c717af9dc673b Mon Sep 17 00:00:00 2001
01552a
From: Ray Strode <rstrode@redhat.com>
01552a
Date: Thu, 24 Sep 2015 15:57:59 -0400
01552a
Subject: [PATCH 4/6] plugins: load view of hot plugged displays immediately
01552a
01552a
If we're already chugging along, and a new display
01552a
gets added make sure to load the view associated with
01552a
that display right away.
01552a
01552a
Using an unloaded view can lead to crashes.
01552a
---
01552a
 src/plugins/splash/fade-throbber/plugin.c | 18 ++++++++++++++++--
01552a
 src/plugins/splash/space-flares/plugin.c  | 13 +++++++++++--
01552a
 src/plugins/splash/text/plugin.c          |  3 +++
01552a
 src/plugins/splash/throbgress/plugin.c    | 13 +++++++++++--
01552a
 src/plugins/splash/tribar/plugin.c        |  7 ++++++-
01552a
 src/plugins/splash/two-step/plugin.c      | 12 +++++++++++-
01552a
 6 files changed, 58 insertions(+), 8 deletions(-)
01552a
01552a
diff --git a/src/plugins/splash/fade-throbber/plugin.c b/src/plugins/splash/fade-throbber/plugin.c
01552a
index 953186d..946a732 100644
01552a
--- a/src/plugins/splash/fade-throbber/plugin.c
01552a
+++ b/src/plugins/splash/fade-throbber/plugin.c
01552a
@@ -76,60 +76,61 @@ typedef struct
01552a
 } star_t;
01552a
 
01552a
 typedef struct
01552a
 {
01552a
   ply_boot_splash_plugin_t *plugin;
01552a
   ply_pixel_display_t *display;
01552a
   ply_list_t *stars;
01552a
   ply_entry_t *entry;
01552a
   ply_label_t *label;
01552a
   ply_label_t *message_label;
01552a
   ply_rectangle_t lock_area;
01552a
   double logo_opacity;
01552a
 } view_t;
01552a
 
01552a
 struct _ply_boot_splash_plugin
01552a
 {
01552a
   ply_event_loop_t *loop;
01552a
   ply_boot_splash_mode_t mode;
01552a
   ply_image_t *logo_image;
01552a
   ply_image_t *star_image;
01552a
   ply_image_t *lock_image;
01552a
   char *image_dir;
01552a
   ply_list_t *views;
01552a
 
01552a
   ply_boot_splash_display_type_t state;
01552a
 
01552a
   double start_time;
01552a
   double now;
01552a
 
01552a
   uint32_t is_animating : 1;
01552a
+  uint32_t is_visible : 1;
01552a
 };
01552a
 
01552a
 ply_boot_splash_plugin_interface_t *ply_boot_splash_plugin_get_interface (void);
01552a
 
01552a
 static void
01552a
 view_show_prompt (view_t     *view,
01552a
                   const char *prompt)
01552a
 {
01552a
   ply_boot_splash_plugin_t *plugin;
01552a
   int x, y;
01552a
   int entry_width, entry_height;
01552a
 
01552a
   assert (view != NULL);
01552a
 
01552a
   plugin = view->plugin;
01552a
 
01552a
   if (ply_entry_is_hidden (view->entry))
01552a
     {
01552a
       unsigned long screen_width, screen_height;
01552a
 
01552a
       screen_width = ply_pixel_display_get_width (view->display);
01552a
       screen_height = ply_pixel_display_get_height (view->display);
01552a
 
01552a
       view->lock_area.width = ply_image_get_width (plugin->lock_image);
01552a
       view->lock_area.height = ply_image_get_height (plugin->lock_image);
01552a
 
01552a
       entry_width = ply_entry_get_width (view->entry);
01552a
       entry_height = ply_entry_get_height (view->entry);
01552a
 
01552a
       x = screen_width / 2.0 - (view->lock_area.width + entry_width) / 2.0 + view->lock_area.width;
01552a
@@ -741,62 +742,71 @@ on_draw (view_t                   *view,
01552a
          int                       width,
01552a
          int                       height)
01552a
 {
01552a
   ply_boot_splash_plugin_t *plugin;
01552a
 
01552a
   plugin = view->plugin;
01552a
 
01552a
   draw_background (view, pixel_buffer, x, y, width, height);
01552a
 
01552a
   if (plugin->state == PLY_BOOT_SPLASH_DISPLAY_NORMAL)
01552a
     draw_normal_view (view, pixel_buffer, x, y, width, height);
01552a
   else
01552a
     draw_prompt_view (view, pixel_buffer, x, y, width, height);
01552a
 
01552a
   ply_label_draw_area (view->message_label,
01552a
                        pixel_buffer,
01552a
                        x, y, width, height);
01552a
 }
01552a
 
01552a
 static void
01552a
 add_pixel_display (ply_boot_splash_plugin_t *plugin,
01552a
                    ply_pixel_display_t      *display)
01552a
 {
01552a
   view_t *view;
01552a
 
01552a
   view = view_new (plugin, display);
01552a
 
01552a
   ply_pixel_display_set_draw_handler (view->display,
01552a
                                       (ply_pixel_display_draw_handler_t)
01552a
                                       on_draw, view);
01552a
-
01552a
-  ply_list_append_data (plugin->views, view);
01552a
+  if (plugin->is_visible)
01552a
+    {
01552a
+      if (view_load (view))
01552a
+        ply_list_append_data (plugin->views, view);
01552a
+      else
01552a
+        view_free (view);
01552a
+    }
01552a
+  else
01552a
+    {
01552a
+      ply_list_append_data (plugin->views, view);
01552a
+    }
01552a
 }
01552a
 
01552a
 static void
01552a
 remove_pixel_display (ply_boot_splash_plugin_t *plugin,
01552a
                       ply_pixel_display_t      *display)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
   while (node != NULL)
01552a
     {
01552a
       view_t *view;
01552a
       ply_list_node_t *next_node;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       if (view->display == display)
01552a
         {
01552a
           view_free (view);
01552a
           ply_list_remove_node (plugin->views, node);
01552a
           return;
01552a
         }
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 }
01552a
 
01552a
 static bool
01552a
 show_splash_screen (ply_boot_splash_plugin_t *plugin,
01552a
@@ -805,60 +815,62 @@ show_splash_screen (ply_boot_splash_plugin_t *plugin,
01552a
                     ply_boot_splash_mode_t    mode)
01552a
 {
01552a
   assert (plugin != NULL);
01552a
   assert (plugin->logo_image != NULL);
01552a
 
01552a
   plugin->loop = loop;
01552a
   plugin->mode = mode;
01552a
 
01552a
   ply_trace ("loading logo image");
01552a
   if (!ply_image_load (plugin->logo_image))
01552a
     return false;
01552a
 
01552a
   ply_trace ("loading star image");
01552a
   if (!ply_image_load (plugin->star_image))
01552a
     return false;
01552a
 
01552a
   ply_trace ("loading lock image");
01552a
   if (!ply_image_load (plugin->lock_image))
01552a
     return false;
01552a
 
01552a
   ply_event_loop_watch_for_exit (loop, (ply_event_loop_exit_handler_t)
01552a
                                  detach_from_event_loop,
01552a
                                  plugin);
01552a
 
01552a
   if (!load_views (plugin))
01552a
     {
01552a
       ply_trace ("couldn't load views");
01552a
       return false;
01552a
     }
01552a
 
01552a
+  plugin->is_visible = true;
01552a
+
01552a
   ply_trace ("starting boot animation");
01552a
   start_animation (plugin);
01552a
 
01552a
   return true;
01552a
 }
01552a
 
01552a
 static void
01552a
 view_add_star (view_t *view)
01552a
 {
01552a
   ply_boot_splash_plugin_t *plugin;
01552a
   ply_rectangle_t logo_area;
01552a
   star_t *star;
01552a
   unsigned int x, y;
01552a
   unsigned int width, height;
01552a
   unsigned long screen_width, screen_height;
01552a
   ply_list_node_t *node;
01552a
 
01552a
   assert (view != NULL);
01552a
 
01552a
   plugin = view->plugin;
01552a
 
01552a
   screen_width = ply_pixel_display_get_width (view->display);
01552a
   screen_height = ply_pixel_display_get_height (view->display);
01552a
   width = ply_image_get_width (plugin->logo_image);
01552a
   height = ply_image_get_height (plugin->logo_image);
01552a
   logo_area.x = (screen_width / 2) - (width / 2);
01552a
   logo_area.y = (screen_height / 2) - (height / 2);
01552a
   logo_area.width = width;
01552a
   logo_area.height = height;
01552a
 
01552a
@@ -944,60 +956,62 @@ update_status (ply_boot_splash_plugin_t *plugin,
01552a
 static void
01552a
 show_message (ply_boot_splash_plugin_t *plugin,
01552a
               const char               *message)
01552a
 {
01552a
   ply_trace ("Showing message '%s'", message);
01552a
   ply_list_node_t *node;
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
   while (node != NULL)
01552a
     {
01552a
       ply_list_node_t *next_node;
01552a
       view_t *view;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
       ply_label_set_text (view->message_label, message);
01552a
       ply_label_show (view->message_label, view->display, 10, 10);
01552a
 
01552a
       ply_pixel_display_draw_area (view->display, 10, 10,
01552a
                                    ply_label_get_width (view->message_label),
01552a
                                    ply_label_get_height(view->message_label));
01552a
       node = next_node;
01552a
     }
01552a
 }
01552a
 
01552a
 static void
01552a
 hide_splash_screen (ply_boot_splash_plugin_t *plugin,
01552a
                     ply_event_loop_t         *loop)
01552a
 {
01552a
   assert (plugin != NULL);
01552a
 
01552a
+  plugin->is_visible = false;
01552a
+
01552a
   if (plugin->loop != NULL)
01552a
     {
01552a
       stop_animation (plugin);
01552a
 
01552a
       ply_event_loop_stop_watching_for_exit (plugin->loop, (ply_event_loop_exit_handler_t)
01552a
                                              detach_from_event_loop,
01552a
                                              plugin);
01552a
       detach_from_event_loop (plugin);
01552a
     }
01552a
 }
01552a
 
01552a
 static void
01552a
 show_password_prompt (ply_boot_splash_plugin_t *plugin,
01552a
                       const char               *text,
01552a
                       int                       number_of_bullets)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
   while (node != NULL)
01552a
     {
01552a
       ply_list_node_t *next_node;
01552a
       view_t *view;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       view_show_prompt (view, text);
01552a
       ply_entry_set_bullet_count (view->entry, number_of_bullets);
01552a
 
01552a
diff --git a/src/plugins/splash/space-flares/plugin.c b/src/plugins/splash/space-flares/plugin.c
01552a
index b18f39f..9e53617 100644
01552a
--- a/src/plugins/splash/space-flares/plugin.c
01552a
+++ b/src/plugins/splash/space-flares/plugin.c
01552a
@@ -1416,62 +1416,71 @@ draw_background (view_t             *view,
01552a
   image_area.width = ply_image_get_width(plugin->star_image);
01552a
   image_area.height = ply_image_get_height(plugin->star_image);
01552a
   
01552a
   
01552a
   ply_pixel_buffer_fill_with_argb32_data_with_clip (pixel_buffer,
01552a
                                                      &image_area, &area,
01552a
                                                      ply_image_get_data (plugin->star_image));
01552a
                                                      
01552a
   image_area.x = 20;
01552a
   image_area.y = 20;
01552a
   image_area.width = ply_image_get_width(plugin->logo_image);
01552a
   image_area.height = ply_image_get_height(plugin->logo_image);
01552a
   
01552a
   
01552a
   ply_pixel_buffer_fill_with_argb32_data_with_clip (pixel_buffer,
01552a
                                                      &image_area, &area,
01552a
                                                      ply_image_get_data (plugin->logo_image));
01552a
 }
01552a
 
01552a
 static void
01552a
 add_pixel_display (ply_boot_splash_plugin_t *plugin,
01552a
                    ply_pixel_display_t      *display)
01552a
 {
01552a
   view_t *view;
01552a
 
01552a
   view = view_new (plugin, display);
01552a
 
01552a
   ply_pixel_display_set_draw_handler (view->display,
01552a
                                       (ply_pixel_display_draw_handler_t)
01552a
                                       on_draw, view);
01552a
-
01552a
-  ply_list_append_data (plugin->views, view);
01552a
+  if (plugin->is_visible)
01552a
+    {
01552a
+      if (view_load (view))
01552a
+        ply_list_append_data (plugin->views, view);
01552a
+      else
01552a
+        view_free (view);
01552a
+    }
01552a
+  else
01552a
+    {
01552a
+      ply_list_append_data (plugin->views, view);
01552a
+    }
01552a
 }
01552a
 
01552a
 static void
01552a
 remove_pixel_display (ply_boot_splash_plugin_t *plugin,
01552a
                       ply_pixel_display_t      *display)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
   while (node != NULL)
01552a
     {
01552a
       view_t *view;
01552a
       ply_list_node_t *next_node;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       if (view->display == display)
01552a
         {
01552a
           view_free (view);
01552a
           ply_list_remove_node (plugin->views, node);
01552a
           return;
01552a
         }
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 }
01552a
 
01552a
 static void
01552a
 view_setup_scene (view_t *view)
01552a
diff --git a/src/plugins/splash/text/plugin.c b/src/plugins/splash/text/plugin.c
01552a
index fb97c14..69125a2 100644
01552a
--- a/src/plugins/splash/text/plugin.c
01552a
+++ b/src/plugins/splash/text/plugin.c
01552a
@@ -458,60 +458,63 @@ stop_animation (ply_boot_splash_plugin_t *plugin)
01552a
 
01552a
 static void
01552a
 on_draw (view_t                   *view,
01552a
          ply_terminal_t           *terminal,
01552a
          int                       x,
01552a
          int                       y,
01552a
          int                       width,
01552a
          int                       height)
01552a
 {
01552a
   ply_text_display_clear_screen (view->display);
01552a
 }
01552a
 
01552a
 static void
01552a
 add_text_display (ply_boot_splash_plugin_t *plugin,
01552a
                   ply_text_display_t       *display)
01552a
 {
01552a
   view_t *view;
01552a
   ply_terminal_t *terminal;
01552a
 
01552a
   view = view_new (plugin, display);
01552a
 
01552a
   terminal = ply_text_display_get_terminal (view->display);
01552a
   if (ply_terminal_open (terminal))
01552a
     ply_terminal_activate_vt (terminal);
01552a
 
01552a
   ply_text_display_set_draw_handler (view->display,
01552a
                                      (ply_text_display_draw_handler_t)
01552a
                                      on_draw, view);
01552a
 
01552a
   ply_list_append_data (plugin->views, view);
01552a
+
01552a
+  if (plugin->is_animating)
01552a
+    view_start_animation (view);
01552a
 }
01552a
 
01552a
 static void
01552a
 remove_text_display (ply_boot_splash_plugin_t *plugin,
01552a
                      ply_text_display_t       *display)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
   while (node != NULL)
01552a
     {
01552a
       view_t *view;
01552a
       ply_list_node_t *next_node;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       if (view->display == display)
01552a
         {
01552a
           ply_text_display_set_draw_handler (view->display,
01552a
                                              NULL, NULL);
01552a
           view_free (view);
01552a
           ply_list_remove_node (plugin->views, node);
01552a
           return;
01552a
         }
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 }
01552a
 
01552a
diff --git a/src/plugins/splash/throbgress/plugin.c b/src/plugins/splash/throbgress/plugin.c
01552a
index e3ce91b..c4d0555 100644
01552a
--- a/src/plugins/splash/throbgress/plugin.c
01552a
+++ b/src/plugins/splash/throbgress/plugin.c
01552a
@@ -618,62 +618,71 @@ on_draw (view_t                   *view,
01552a
       lock_data = ply_image_get_data (plugin->lock_image);
01552a
       ply_pixel_buffer_fill_with_argb32_data (pixel_buffer,
01552a
                                               &view->lock_area,
01552a
                                               lock_data);
01552a
     }
01552a
   else
01552a
     {
01552a
       draw_logo (view, pixel_buffer);
01552a
       ply_throbber_draw_area (view->throbber,
01552a
                               pixel_buffer, x, y, width, height);
01552a
       ply_progress_bar_draw_area (view->progress_bar,
01552a
                                   pixel_buffer, x, y, width, height);
01552a
     }
01552a
   ply_label_draw_area (view->message_label,
01552a
                        pixel_buffer,
01552a
                        x, y, width, height);
01552a
 }
01552a
 
01552a
 static void
01552a
 add_pixel_display (ply_boot_splash_plugin_t *plugin,
01552a
                    ply_pixel_display_t      *display)
01552a
 {
01552a
   view_t *view;
01552a
 
01552a
   ply_trace ("adding pixel display to plugin");
01552a
   view = view_new (plugin, display);
01552a
 
01552a
   ply_pixel_display_set_draw_handler (view->display,
01552a
                                       (ply_pixel_display_draw_handler_t)
01552a
                                       on_draw, view);
01552a
-
01552a
-  ply_list_append_data (plugin->views, view);
01552a
+  if (plugin->is_visible)
01552a
+    {
01552a
+      if (view_load (view))
01552a
+        ply_list_append_data (plugin->views, view);
01552a
+      else
01552a
+        view_free (view);
01552a
+    }
01552a
+  else
01552a
+    {
01552a
+      ply_list_append_data (plugin->views, view);
01552a
+    }
01552a
 }
01552a
 
01552a
 static void
01552a
 remove_pixel_display (ply_boot_splash_plugin_t *plugin,
01552a
                       ply_pixel_display_t      *display)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   ply_trace ("removing pixel display from plugin");
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
   while (node != NULL)
01552a
     {
01552a
       view_t *view;
01552a
       ply_list_node_t *next_node;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       if (view->display == display)
01552a
         {
01552a
           view_free (view);
01552a
           ply_list_remove_node (plugin->views, node);
01552a
           return;
01552a
         }
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 }
01552a
 
01552a
 static bool
01552a
diff --git a/src/plugins/splash/tribar/plugin.c b/src/plugins/splash/tribar/plugin.c
01552a
index 4458bad..5b89cc3 100644
01552a
--- a/src/plugins/splash/tribar/plugin.c
01552a
+++ b/src/plugins/splash/tribar/plugin.c
01552a
@@ -461,60 +461,63 @@ stop_animation (ply_boot_splash_plugin_t *plugin)
01552a
 
01552a
 static void
01552a
 on_draw (view_t                   *view,
01552a
          ply_terminal_t           *terminal,
01552a
          int                       x,
01552a
          int                       y,
01552a
          int                       width,
01552a
          int                       height)
01552a
 {
01552a
   ply_text_display_clear_screen (view->display);
01552a
 }
01552a
 
01552a
 static void
01552a
 add_text_display (ply_boot_splash_plugin_t *plugin,
01552a
                   ply_text_display_t       *display)
01552a
 {
01552a
   view_t *view;
01552a
   ply_terminal_t *terminal;
01552a
 
01552a
   view = view_new (plugin, display);
01552a
 
01552a
   terminal = ply_text_display_get_terminal (view->display);
01552a
   if (ply_terminal_open (terminal))
01552a
     ply_terminal_activate_vt (terminal);
01552a
 
01552a
   ply_text_display_set_draw_handler (view->display,
01552a
                                      (ply_text_display_draw_handler_t)
01552a
                                      on_draw, view);
01552a
 
01552a
   ply_list_append_data (plugin->views, view);
01552a
+
01552a
+  if (plugin->is_animating)
01552a
+    view_start_animation (view);
01552a
 }
01552a
 
01552a
 static void
01552a
 remove_text_display (ply_boot_splash_plugin_t *plugin,
01552a
                      ply_text_display_t       *display)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
   while (node != NULL)
01552a
     {
01552a
       view_t *view;
01552a
       ply_list_node_t *next_node;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       if (view->display == display)
01552a
         {
01552a
           ply_text_display_set_draw_handler (view->display,
01552a
                                              NULL, NULL);
01552a
           view_free (view);
01552a
           ply_list_remove_node (plugin->views, node);
01552a
           return;
01552a
         }
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 }
01552a
 
01552a
@@ -545,61 +548,63 @@ update_status (ply_boot_splash_plugin_t *plugin,
01552a
   assert (plugin != NULL);
01552a
 
01552a
   ply_trace ("status update");
01552a
 }
01552a
 
01552a
 static void
01552a
 on_boot_progress (ply_boot_splash_plugin_t *plugin,
01552a
                   double                    duration,
01552a
                   double                    percent_done)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
   double total_duration;
01552a
 
01552a
   total_duration = duration / percent_done;
01552a
 
01552a
   /* Fun made-up smoothing function to make the growth asymptotic:
01552a
    * fraction(time,estimate)=1-2^(-(time^1.45)/estimate) */
01552a
   percent_done = 1.0 - pow (2.0, -pow (duration, 1.45) / total_duration) * (1.0 - percent_done);
01552a
 
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
 
01552a
   while (node != NULL)
01552a
     {
01552a
       ply_list_node_t *next_node;
01552a
       view_t *view;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       ply_text_progress_bar_set_percent_done (view->progress_bar, percent_done);
01552a
-      ply_text_progress_bar_draw (view->progress_bar);
01552a
+
01552a
+      if (plugin->is_animating)
01552a
+        ply_text_progress_bar_draw (view->progress_bar);
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 }
01552a
 
01552a
 static void
01552a
 hide_splash_screen (ply_boot_splash_plugin_t *plugin,
01552a
                     ply_event_loop_t         *loop)
01552a
 {
01552a
   assert (plugin != NULL);
01552a
 
01552a
   ply_trace ("hiding splash screen");
01552a
 
01552a
   if (plugin->loop != NULL)
01552a
     {
01552a
       stop_animation (plugin);
01552a
 
01552a
       ply_event_loop_stop_watching_for_exit (plugin->loop,
01552a
                                              (ply_event_loop_exit_handler_t)
01552a
                                              detach_from_event_loop,
01552a
                                              plugin);
01552a
       detach_from_event_loop (plugin);
01552a
     }
01552a
 
01552a
   hide_views (plugin);
01552a
   ply_show_new_kernel_messages (true);
01552a
 }
01552a
 
01552a
 static void
01552a
 display_normal (ply_boot_splash_plugin_t *plugin)
01552a
diff --git a/src/plugins/splash/two-step/plugin.c b/src/plugins/splash/two-step/plugin.c
01552a
index 4612e3f..a1d1f00 100644
01552a
--- a/src/plugins/splash/two-step/plugin.c
01552a
+++ b/src/plugins/splash/two-step/plugin.c
01552a
@@ -980,61 +980,71 @@ on_draw (view_t                   *view,
01552a
 
01552a
           if (view->throbber != NULL)
01552a
             sprite_height = MAX (ply_throbber_get_height (view->throbber),
01552a
                                  sprite_height);
01552a
 
01552a
           image_area.width = ply_image_get_width (plugin->header_image);
01552a
           image_area.height = ply_image_get_height (plugin->header_image);
01552a
           image_area.x = screen_area.width / 2.0 - image_area.width / 2.0;
01552a
           image_area.y = plugin->animation_vertical_alignment * screen_area.height - sprite_height / 2.0 - image_area.height;
01552a
 
01552a
           ply_pixel_buffer_fill_with_argb32_data (pixel_buffer, &image_area, ply_image_get_data (plugin->header_image));
01552a
         }
01552a
     }
01552a
   ply_label_draw_area (view->message_label,
01552a
                        pixel_buffer,
01552a
                        x, y, width, height);
01552a
 }
01552a
 
01552a
 static void
01552a
 add_pixel_display (ply_boot_splash_plugin_t *plugin,
01552a
                    ply_pixel_display_t      *display)
01552a
 {
01552a
   view_t *view;
01552a
 
01552a
   ply_trace ("adding pixel display to plugin");
01552a
   view = view_new (plugin, display);
01552a
 
01552a
   ply_pixel_display_set_draw_handler (view->display,
01552a
                                       (ply_pixel_display_draw_handler_t)
01552a
                                       on_draw, view);
01552a
-  ply_list_append_data (plugin->views, view);
01552a
+  if (plugin->is_visible)
01552a
+    {
01552a
+      if (view_load (view))
01552a
+        ply_list_append_data (plugin->views, view);
01552a
+      else
01552a
+        view_free (view);
01552a
+    }
01552a
+  else
01552a
+    {
01552a
+      ply_list_append_data (plugin->views, view);
01552a
+    }
01552a
 }
01552a
 
01552a
 static void
01552a
 remove_pixel_display (ply_boot_splash_plugin_t *plugin,
01552a
                       ply_pixel_display_t      *display)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   ply_trace ("removing pixel display from plugin");
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
   while (node != NULL)
01552a
     {
01552a
       view_t *view;
01552a
       ply_list_node_t *next_node;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       if (view->display == display)
01552a
         {
01552a
 
01552a
           view_free (view);
01552a
           ply_list_remove_node (plugin->views, node);
01552a
           return;
01552a
         }
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 }
01552a
 
01552a
-- 
01552a
2.5.0
01552a
01552a
01552a
From 3dc6d04a80329bb97e574c2785f79a684bfdc41b Mon Sep 17 00:00:00 2001
01552a
From: Ray Strode <rstrode@redhat.com>
01552a
Date: Fri, 9 Oct 2015 12:46:49 -0400
01552a
Subject: [PATCH 5/6] details: update new views with current boot buffer
01552a
01552a
if a view is added after the splash is shown, make sure
01552a
to update the view with the current contents of the boot
01552a
buffer.
01552a
---
01552a
 src/plugins/splash/details/plugin.c | 15 +++++++++++++--
01552a
 1 file changed, 13 insertions(+), 2 deletions(-)
01552a
01552a
diff --git a/src/plugins/splash/details/plugin.c b/src/plugins/splash/details/plugin.c
01552a
index aff2f1c..6ddd654 100644
01552a
--- a/src/plugins/splash/details/plugin.c
01552a
+++ b/src/plugins/splash/details/plugin.c
01552a
@@ -49,61 +49,61 @@
01552a
 #include "ply-text-display.h"
01552a
 #include "ply-trigger.h"
01552a
 #include "ply-utils.h"
01552a
 
01552a
 #include <linux/kd.h>
01552a
 
01552a
 #define CLEAR_LINE_SEQUENCE "\033[2K\r"
01552a
 
01552a
 typedef enum {
01552a
    PLY_BOOT_SPLASH_DISPLAY_NORMAL,
01552a
    PLY_BOOT_SPLASH_DISPLAY_QUESTION_ENTRY,
01552a
    PLY_BOOT_SPLASH_DISPLAY_PASSWORD_ENTRY
01552a
 } ply_boot_splash_display_type_t;
01552a
 
01552a
 typedef struct
01552a
 {
01552a
   ply_boot_splash_plugin_t *plugin;
01552a
   ply_text_display_t *display;
01552a
 } view_t;
01552a
 
01552a
 ply_boot_splash_plugin_interface_t *ply_boot_splash_plugin_get_interface (void);
01552a
 static void detach_from_event_loop (ply_boot_splash_plugin_t *plugin);
01552a
 
01552a
 struct _ply_boot_splash_plugin
01552a
 {
01552a
   ply_event_loop_t *loop;
01552a
   ply_boot_splash_mode_t mode;
01552a
   ply_list_t *views;
01552a
   ply_boot_splash_display_type_t state;
01552a
   ply_list_t *messages;
01552a
-
01552a
+  ply_buffer_t *boot_buffer;
01552a
 };
01552a
 
01552a
 static view_t *
01552a
 view_new (ply_boot_splash_plugin_t *plugin,
01552a
           ply_text_display_t      *display)
01552a
 {
01552a
   view_t *view;
01552a
 
01552a
   view = calloc (1, sizeof (view_t));
01552a
   view->plugin = plugin;
01552a
   view->display = display;
01552a
 
01552a
   return view;
01552a
 }
01552a
 
01552a
 static void
01552a
 view_free (view_t *view)
01552a
 {
01552a
   free (view);
01552a
 }
01552a
 
01552a
 static void
01552a
 free_views (ply_boot_splash_plugin_t *plugin)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
 
01552a
   while (node != NULL)
01552a
     {
01552a
@@ -217,108 +217,119 @@ write_on_views (ply_boot_splash_plugin_t *plugin,
01552a
 
01552a
   while (node != NULL)
01552a
     {
01552a
       ply_list_node_t *next_node;
01552a
       view_t *view;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       view_write (view, text, number_of_bytes);
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 
01552a
 }
01552a
 
01552a
 static void
01552a
 add_text_display (ply_boot_splash_plugin_t *plugin,
01552a
                   ply_text_display_t       *display)
01552a
 {
01552a
   view_t *view;
01552a
   ply_terminal_t *terminal;
01552a
 
01552a
   view = view_new (plugin, display);
01552a
 
01552a
   terminal = ply_text_display_get_terminal (view->display);
01552a
   if (ply_terminal_open (terminal))
01552a
     ply_terminal_activate_vt (terminal);
01552a
 
01552a
   ply_list_append_data (plugin->views, view);
01552a
+
01552a
+  if (plugin->boot_buffer != NULL)
01552a
+    {
01552a
+      size_t size;
01552a
+      const char *bytes;
01552a
+
01552a
+      size = ply_buffer_get_size (plugin->boot_buffer);
01552a
+      bytes = ply_buffer_get_bytes (plugin->boot_buffer);
01552a
+      view_write (view, bytes, size);
01552a
+    }
01552a
 }
01552a
 
01552a
 static void
01552a
 remove_text_display (ply_boot_splash_plugin_t *plugin,
01552a
                      ply_text_display_t       *display)
01552a
 {
01552a
   ply_list_node_t *node;
01552a
 
01552a
   node = ply_list_get_first_node (plugin->views);
01552a
   while (node != NULL)
01552a
     {
01552a
       view_t *view;
01552a
       ply_list_node_t *next_node;
01552a
 
01552a
       view = ply_list_node_get_data (node);
01552a
       next_node = ply_list_get_next_node (plugin->views, node);
01552a
 
01552a
       if (view->display == display)
01552a
         {
01552a
           ply_list_remove_node (plugin->views, node);
01552a
           return;
01552a
         }
01552a
 
01552a
       node = next_node;
01552a
     }
01552a
 }
01552a
 
01552a
 static bool
01552a
 show_splash_screen (ply_boot_splash_plugin_t *plugin,
01552a
                     ply_event_loop_t         *loop,
01552a
                     ply_buffer_t             *boot_buffer,
01552a
                     ply_boot_splash_mode_t    mode)
01552a
 {
01552a
   size_t size;
01552a
 
01552a
   assert (plugin != NULL);
01552a
 
01552a
   plugin->loop = loop;
01552a
   plugin->mode = mode;
01552a
 
01552a
   ply_event_loop_watch_for_exit (loop, (ply_event_loop_exit_handler_t)
01552a
                                  detach_from_event_loop,
01552a
                                  plugin);
01552a
 
01552a
   if (boot_buffer)
01552a
     {
01552a
-      size = ply_buffer_get_size (boot_buffer);
01552a
+      plugin->boot_buffer = boot_buffer;
01552a
 
01552a
+      size = ply_buffer_get_size (boot_buffer);
01552a
       write_on_views (plugin, ply_buffer_get_bytes (boot_buffer), size);
01552a
     }
01552a
 
01552a
   return true;
01552a
 }
01552a
 
01552a
 static void
01552a
 update_status (ply_boot_splash_plugin_t *plugin,
01552a
                const char               *status)
01552a
 {
01552a
   assert (plugin != NULL);
01552a
 
01552a
   ply_trace ("status update");
01552a
 }
01552a
 
01552a
 static void
01552a
 on_boot_output (ply_boot_splash_plugin_t *plugin,
01552a
                 const char               *output,
01552a
                 size_t                    size)
01552a
 {
01552a
   ply_trace ("writing '%s' to all views (%d bytes)",
01552a
              output, (int) size);
01552a
   write_on_views (plugin, output, size);
01552a
 }
01552a
 
01552a
 static void
01552a
 hide_splash_screen (ply_boot_splash_plugin_t *plugin,
01552a
                     ply_event_loop_t         *loop)
01552a
 {
01552a
   assert (plugin != NULL);
01552a
-- 
01552a
2.5.0
01552a
01552a
01552a
From 07864d66b30aa37908df83495d3bffc681fb34d3 Mon Sep 17 00:00:00 2001
01552a
From: Ray Strode <rstrode@redhat.com>
01552a
Date: Fri, 9 Oct 2015 12:48:17 -0400
01552a
Subject: [PATCH 6/6] main: make sure to reshow prompts when new display is
01552a
 added
01552a
01552a
When a display is added, we need to tell the splash plugin
01552a
to redisplay any pending questions, so those questions show
01552a
up on the new display.
01552a
---
01552a
 src/main.c | 3 +++
01552a
 1 file changed, 3 insertions(+)
01552a
01552a
diff --git a/src/main.c b/src/main.c
01552a
index 875dd1a..7c4ea3c 100644
01552a
--- a/src/main.c
01552a
+++ b/src/main.c
01552a
@@ -1022,89 +1022,92 @@ on_keyboard_removed (state_t        *state,
01552a
                                       (ply_keyboard_escape_handler_t)
01552a
                                       on_escape_pressed);
01552a
   ply_trace ("no longer listening for backspace");
01552a
   ply_keyboard_remove_backspace_handler (keyboard,
01552a
                                          (ply_keyboard_backspace_handler_t)
01552a
                                          on_backspace);
01552a
   ply_trace ("no longer listening for enter");
01552a
   ply_keyboard_remove_enter_handler (keyboard,
01552a
                                      (ply_keyboard_enter_handler_t)
01552a
                                      on_enter);
01552a
 
01552a
   if (state->boot_splash != NULL)
01552a
     ply_boot_splash_unset_keyboard (state->boot_splash);
01552a
 }
01552a
 
01552a
 static void
01552a
 on_pixel_display_added (state_t                    *state,
01552a
                         ply_pixel_display_t *display)
01552a
 {
01552a
   if (state->is_shown)
01552a
     {
01552a
       if (state->boot_splash == NULL)
01552a
         {
01552a
           ply_trace ("pixel display added before splash loaded, so loading splash now");
01552a
           show_splash (state);
01552a
         }
01552a
       else
01552a
         {
01552a
           ply_trace ("pixel display added after splash loaded, so attaching to splash");
01552a
           ply_boot_splash_add_pixel_display (state->boot_splash, display);
01552a
+          update_display (state);
01552a
         }
01552a
     }
01552a
 }
01552a
 
01552a
 static void
01552a
 on_pixel_display_removed (state_t                    *state,
01552a
                           ply_pixel_display_t *display)
01552a
 {
01552a
   if (state->boot_splash == NULL)
01552a
     return;
01552a
 
01552a
   ply_boot_splash_remove_pixel_display (state->boot_splash, display);
01552a
 }
01552a
 
01552a
 static void
01552a
 on_text_display_added (state_t                   *state,
01552a
                        ply_text_display_t *display)
01552a
 {
01552a
   if (state->is_shown)
01552a
     {
01552a
       if (state->boot_splash == NULL)
01552a
         {
01552a
           ply_trace ("text display added before splash loaded, so loading splash now");
01552a
           show_splash (state);
01552a
         }
01552a
       else
01552a
         {
01552a
           ply_trace ("text display added after splash loaded, so attaching to splash");
01552a
           ply_boot_splash_add_text_display (state->boot_splash, display);
01552a
+
01552a
+          update_display (state);
01552a
         }
01552a
     }
01552a
 }
01552a
 
01552a
 static void
01552a
 on_text_display_removed (state_t                   *state,
01552a
                          ply_text_display_t *display)
01552a
 {
01552a
   if (state->boot_splash == NULL)
01552a
     return;
01552a
 
01552a
   ply_boot_splash_remove_text_display (state->boot_splash, display);
01552a
 }
01552a
 
01552a
 static void
01552a
 load_devices (state_t                    *state,
01552a
               ply_device_manager_flags_t  flags)
01552a
 {
01552a
   state->device_manager = ply_device_manager_new (state->default_tty, flags);
01552a
   state->local_console_terminal = ply_device_manager_get_default_terminal (state->device_manager);
01552a
 
01552a
   ply_device_manager_watch_devices (state->device_manager,
01552a
                                     (ply_keyboard_added_handler_t)
01552a
                                     on_keyboard_added,
01552a
                                     (ply_keyboard_removed_handler_t)
01552a
                                     on_keyboard_removed,
01552a
                                     (ply_pixel_display_added_handler_t)
01552a
                                     on_pixel_display_added,
01552a
                                     (ply_pixel_display_removed_handler_t)
01552a
                                     on_pixel_display_removed,
01552a
-- 
01552a
2.5.0
01552a