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