]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
plugins: load view of hot plugged displays immediately
authorRay Strode <rstrode@redhat.com>
Thu, 24 Sep 2015 19:57:59 +0000 (15:57 -0400)
committerRay Strode <rstrode@redhat.com>
Mon, 23 May 2016 15:03:18 +0000 (11:03 -0400)
If we're already chugging along, and a new display
gets added make sure to load the view associated with
that display right away.

Using an unloaded view can lead to crashes.

src/plugins/splash/fade-throbber/plugin.c
src/plugins/splash/space-flares/plugin.c
src/plugins/splash/text/plugin.c
src/plugins/splash/throbgress/plugin.c
src/plugins/splash/tribar/plugin.c
src/plugins/splash/two-step/plugin.c

index aba2cc6213a54d4f499c3e7d97308f4130521d96..a7ab4ef4c4cfd61f17a8d50808e13f2c6ac4da00 100644 (file)
@@ -104,6 +104,7 @@ struct _ply_boot_splash_plugin
         double                         now;
 
         uint32_t                       is_animating : 1;
+        uint32_t                       is_visible : 1;
 };
 
 ply_boot_splash_plugin_interface_t *ply_boot_splash_plugin_get_interface (void);
@@ -751,7 +752,14 @@ add_pixel_display (ply_boot_splash_plugin_t *plugin,
                                             (ply_pixel_display_draw_handler_t)
                                             on_draw, view);
 
-        ply_list_append_data (plugin->views, view);
+        if (plugin->is_visible) {
+                if (view_load (view))
+                        ply_list_append_data (plugin->views, view);
+                else
+                        view_free (view);
+        } else {
+                ply_list_append_data (plugin->views, view);
+        }
 }
 
 static void
@@ -811,6 +819,8 @@ show_splash_screen (ply_boot_splash_plugin_t *plugin,
                 return false;
         }
 
+        plugin->is_visible = true;
+
         ply_trace ("starting boot animation");
         start_animation (plugin);
 
@@ -945,6 +955,8 @@ hide_splash_screen (ply_boot_splash_plugin_t *plugin,
 {
         assert (plugin != NULL);
 
+        plugin->is_visible = false;
+
         if (plugin->loop != NULL) {
                 stop_animation (plugin);
 
index 5212c38cbe69e6503df0facad0805ae52f3ef9db..5af99c11912491b8242269102877d8c009b9522c 100644 (file)
@@ -1387,7 +1387,14 @@ add_pixel_display (ply_boot_splash_plugin_t *plugin,
                                             (ply_pixel_display_draw_handler_t)
                                             on_draw, view);
 
-        ply_list_append_data (plugin->views, view);
+        if (plugin->is_visible) {
+                if (view_load (view))
+                        ply_list_append_data (plugin->views, view);
+                else
+                        view_free (view);
+        } else {
+                ply_list_append_data (plugin->views, view);
+        }
 }
 
 static void
index 468bb898728c6fec291311e6410a4a47f64c94af..1422e837da892ae6a954c8be0245ec825478d48a 100644 (file)
@@ -471,7 +471,8 @@ add_text_display (ply_boot_splash_plugin_t *plugin,
                                            (ply_text_display_draw_handler_t)
                                            on_draw, view);
 
-        ply_list_append_data (plugin->views, view);
+        if (plugin->is_animating)
+                view_start_animation (view);
 }
 
 static void
index c105e0227624beade3a9bde745bec69e73f3e197..a1c8a90576031c49120f2362ee80e4ba32890d6c 100644 (file)
@@ -625,7 +625,14 @@ add_pixel_display (ply_boot_splash_plugin_t *plugin,
                                             (ply_pixel_display_draw_handler_t)
                                             on_draw, view);
 
-        ply_list_append_data (plugin->views, view);
+        if (plugin->is_visible) {
+                if (view_load (view))
+                        ply_list_append_data (plugin->views, view);
+                else
+                        view_free (view);
+        } else {
+                ply_list_append_data (plugin->views, view);
+        }
 }
 
 static void
index 0dcd7f8de8538c1316ff07b51b545a550e8661e1..ecc17ea3a26f18b8cbc75a31522b4d45051728b4 100644 (file)
@@ -478,6 +478,9 @@ add_text_display (ply_boot_splash_plugin_t *plugin,
                                            on_draw, view);
 
         ply_list_append_data (plugin->views, view);
+
+        if (plugin->is_animating)
+                view_start_animation (view);
 }
 
 static void
@@ -559,7 +562,9 @@ on_boot_progress (ply_boot_splash_plugin_t *plugin,
                 next_node = ply_list_get_next_node (plugin->views, node);
 
                 ply_text_progress_bar_set_percent_done (view->progress_bar, percent_done);
-                ply_text_progress_bar_draw (view->progress_bar);
+
+                if (plugin->is_animating)
+                        ply_text_progress_bar_draw (view->progress_bar);
 
                 node = next_node;
         }
index bc36cc8c0ba03682ffc878f5974fa3551131eab5..070741d61d0a236d495822cdd2033cf02d67624e 100644 (file)
@@ -995,7 +995,14 @@ add_pixel_display (ply_boot_splash_plugin_t *plugin,
         ply_pixel_display_set_draw_handler (view->display,
                                             (ply_pixel_display_draw_handler_t)
                                             on_draw, view);
-        ply_list_append_data (plugin->views, view);
+        if (plugin->is_visible) {
+                if (view_load (view))
+                        ply_list_append_data (plugin->views, view);
+                else
+                        view_free (view);
+        } else {
+                ply_list_append_data (plugin->views, view);
+        }
 }
 
 static void