From 8124531ef1e6fc9e1b14b7fa3da610a92327cbc0 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 7 May 2009 14:38:50 -0400 Subject: [PATCH] Pass the mode plymouthd is running to splashes We don't want to show progress bars and things for shutdown, so pass the mode to the plugins so they can just do a static image. --- src/libplybootsplash/ply-boot-splash-plugin.h | 9 ++++++++- src/main.c | 8 +++++++- src/plugins/splash/details/plugin.c | 5 ++++- src/plugins/splash/fade-in/plugin.c | 19 +++++++++++++++---- src/plugins/splash/glow/plugin.c | 11 ++++++++++- src/plugins/splash/pulser/plugin.c | 8 +++++++- src/plugins/splash/solar/plugin.c | 9 ++++++++- src/plugins/splash/spinfinity/plugin.c | 8 +++++++- src/plugins/splash/text/plugin.c | 11 ++++++++++- src/ply-boot-splash.c | 6 ++++-- src/ply-boot-splash.h | 3 ++- 11 files changed, 82 insertions(+), 15 deletions(-) diff --git a/src/libplybootsplash/ply-boot-splash-plugin.h b/src/libplybootsplash/ply-boot-splash-plugin.h index 5eca3b3a..5cd408c8 100644 --- a/src/libplybootsplash/ply-boot-splash-plugin.h +++ b/src/libplybootsplash/ply-boot-splash-plugin.h @@ -31,6 +31,12 @@ #include "ply-trigger.h" #include "ply-window.h" +typedef enum +{ + PLY_BOOT_SPLASH_MODE_BOOT_UP, + PLY_BOOT_SPLASH_MODE_SHUTDOWN, +} ply_boot_splash_mode_t; + typedef struct _ply_boot_splash_plugin ply_boot_splash_plugin_t; typedef struct @@ -45,7 +51,8 @@ typedef struct ply_window_t *window); bool (* show_splash_screen) (ply_boot_splash_plugin_t *plugin, ply_event_loop_t *loop, - ply_buffer_t *boot_buffer); + ply_buffer_t *boot_buffer, + ply_boot_splash_mode_t mode); void (* update_status) (ply_boot_splash_plugin_t *plugin, const char *status); void (* on_boot_output) (ply_boot_splash_plugin_t *plugin, diff --git a/src/main.c b/src/main.c index a4d6b265..c903c75e 100644 --- a/src/main.c +++ b/src/main.c @@ -887,6 +887,7 @@ start_boot_splash (state_t *state, const char *module_path) { ply_boot_splash_t *splash; + ply_boot_splash_mode_t splash_mode; ply_trace ("Loading boot splash plugin '%s'", module_path); @@ -910,7 +911,12 @@ start_boot_splash (state_t *state, ply_trace ("adding windows to boot splash"); add_windows_to_boot_splash (state, splash); ply_trace ("showing plugin"); - if (!ply_boot_splash_show (splash)) + if (state->mode == PLY_MODE_SHUTDOWN) + splash_mode = PLY_BOOT_SPLASH_MODE_SHUTDOWN; + else + splash_mode = PLY_BOOT_SPLASH_MODE_BOOT_UP; + + if (!ply_boot_splash_show (splash, splash_mode)) { ply_save_errno (); ply_boot_splash_free (splash); diff --git a/src/plugins/splash/details/plugin.c b/src/plugins/splash/details/plugin.c index f6380bcc..168e6430 100644 --- a/src/plugins/splash/details/plugin.c +++ b/src/plugins/splash/details/plugin.c @@ -76,6 +76,7 @@ ply_boot_splash_plugin_interface_t *ply_boot_splash_plugin_get_interface (void); struct _ply_boot_splash_plugin { ply_event_loop_t *loop; + ply_boot_splash_mode_t mode; ply_list_t *windows; ply_boot_splash_display_type_t state; @@ -231,7 +232,8 @@ uninitialize_window (ply_window_t *window, bool show_splash_screen (ply_boot_splash_plugin_t *plugin, ply_event_loop_t *loop, - ply_buffer_t *boot_buffer) + ply_buffer_t *boot_buffer, + ply_boot_splash_mode_t mode) { size_t size; @@ -241,6 +243,7 @@ show_splash_screen (ply_boot_splash_plugin_t *plugin, (ply_boot_splash_plugin_window_handler_t) initialize_window, NULL, NULL); plugin->loop = loop; + plugin->mode = mode; ply_event_loop_watch_for_exit (loop, (ply_event_loop_exit_handler_t) detach_from_event_loop, diff --git a/src/plugins/splash/fade-in/plugin.c b/src/plugins/splash/fade-in/plugin.c index f06f4988..40c61ff7 100644 --- a/src/plugins/splash/fade-in/plugin.c +++ b/src/plugins/splash/fade-in/plugin.c @@ -74,6 +74,7 @@ typedef struct struct _ply_boot_splash_plugin { ply_event_loop_t *loop; + ply_boot_splash_mode_t mode; ply_frame_buffer_t *frame_buffer; ply_image_t *logo_image; ply_image_t *star_image; @@ -255,6 +256,9 @@ animate_at_time (ply_boot_splash_plugin_t *plugin, opacity = .5 * sin ((time / 5) * (2 * M_PI)) + .8; opacity = CLAMP (opacity, 0, 1.0); + if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN) + opacity = 1.0; + if (fabs (opacity - last_opacity) <= DBL_MIN) { ply_frame_buffer_unpause_updates (plugin->frame_buffer); @@ -318,14 +322,19 @@ start_animation (ply_boot_splash_plugin_t *plugin) if (plugin->is_animating) return; + draw_background (plugin, NULL); + + plugin->start_time = ply_get_timestamp (); + animate_at_time (plugin, plugin->start_time); + + if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN) + return; + ply_event_loop_watch_for_timeout (plugin->loop, 1.0 / FRAMES_PER_SECOND, (ply_event_loop_timeout_handler_t) on_timeout, plugin); - plugin->start_time = ply_get_timestamp (); - draw_background (plugin, NULL); - plugin->is_animating = true; } @@ -495,7 +504,8 @@ remove_window (ply_boot_splash_plugin_t *plugin, bool show_splash_screen (ply_boot_splash_plugin_t *plugin, ply_event_loop_t *loop, - ply_buffer_t *boot_buffer) + ply_buffer_t *boot_buffer, + ply_boot_splash_mode_t mode) { assert (plugin != NULL); assert (plugin->logo_image != NULL); @@ -503,6 +513,7 @@ show_splash_screen (ply_boot_splash_plugin_t *plugin, add_handlers (plugin); plugin->loop = loop; + plugin->mode = mode; ply_trace ("loading logo image"); if (!ply_image_load (plugin->logo_image)) diff --git a/src/plugins/splash/glow/plugin.c b/src/plugins/splash/glow/plugin.c index 25f7ba6b..6d2490e8 100644 --- a/src/plugins/splash/glow/plugin.c +++ b/src/plugins/splash/glow/plugin.c @@ -75,6 +75,7 @@ typedef enum { struct _ply_boot_splash_plugin { ply_event_loop_t *loop; + ply_boot_splash_mode_t mode; ply_frame_buffer_t *frame_buffer; ply_frame_buffer_area_t box_area, lock_area; ply_image_t *lock_image; @@ -192,6 +193,12 @@ start_animation (ply_boot_splash_plugin_t *plugin) draw_background (plugin, NULL); + if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN) + { + begin_animation (plugin, NULL); + return; + } + ply_frame_buffer_get_size (plugin->frame_buffer, &area); width = ply_progress_animation_get_width (plugin->progress_animation); @@ -372,13 +379,15 @@ remove_window (ply_boot_splash_plugin_t *plugin, bool show_splash_screen (ply_boot_splash_plugin_t *plugin, ply_event_loop_t *loop, - ply_buffer_t *boot_buffer) + ply_buffer_t *boot_buffer, + ply_boot_splash_mode_t mode) { assert (plugin != NULL); add_handlers (plugin); plugin->loop = loop; + plugin->mode = mode; ply_trace ("loading lock image"); if (!ply_image_load (plugin->lock_image)) diff --git a/src/plugins/splash/pulser/plugin.c b/src/plugins/splash/pulser/plugin.c index adfb7128..d767d78c 100644 --- a/src/plugins/splash/pulser/plugin.c +++ b/src/plugins/splash/pulser/plugin.c @@ -60,6 +60,7 @@ struct _ply_boot_splash_plugin { ply_event_loop_t *loop; + ply_boot_splash_mode_t mode; ply_window_t *window; @@ -140,6 +141,9 @@ start_animation (ply_boot_splash_plugin_t *plugin) ply_window_clear_screen (plugin->window); ply_window_hide_text_cursor (plugin->window); + if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN) + return; + window_width = ply_window_get_number_of_text_columns (plugin->window); window_height = ply_window_get_number_of_text_rows (plugin->window); width = ply_text_pulser_get_number_of_columns (plugin->pulser); @@ -255,7 +259,8 @@ remove_window (ply_boot_splash_plugin_t *plugin, bool show_splash_screen (ply_boot_splash_plugin_t *plugin, ply_event_loop_t *loop, - ply_buffer_t *boot_buffer) + ply_buffer_t *boot_buffer, + ply_boot_splash_mode_t mode) { assert (plugin != NULL); @@ -263,6 +268,7 @@ show_splash_screen (ply_boot_splash_plugin_t *plugin, ply_show_new_kernel_messages (false); plugin->loop = loop; + plugin->mode = mode; ply_event_loop_watch_for_exit (loop, (ply_event_loop_exit_handler_t) detach_from_event_loop, plugin); diff --git a/src/plugins/splash/solar/plugin.c b/src/plugins/splash/solar/plugin.c index 8ca3beb0..8ce2472f 100644 --- a/src/plugins/splash/solar/plugin.c +++ b/src/plugins/splash/solar/plugin.c @@ -161,6 +161,7 @@ typedef struct struct _ply_boot_splash_plugin { ply_event_loop_t *loop; + ply_boot_splash_mode_t mode; ply_frame_buffer_t *frame_buffer; ply_frame_buffer_area_t box_area, lock_area, logo_area; ply_image_t *logo_image; @@ -918,6 +919,10 @@ start_animation (ply_boot_splash_plugin_t *plugin) plugin->now = ply_get_timestamp (); setup_solar (plugin); ply_window_draw_area (plugin->window, area.x, area.y, area.width, area.height); + + if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN) + return; + on_timeout (plugin); plugin->is_animating = true; @@ -1370,7 +1375,8 @@ setup_solar (ply_boot_splash_plugin_t *plugin) bool show_splash_screen (ply_boot_splash_plugin_t *plugin, ply_event_loop_t *loop, - ply_buffer_t *boot_buffer) + ply_buffer_t *boot_buffer, + ply_boot_splash_mode_t mode) { assert (plugin != NULL); assert (plugin->logo_image != NULL); @@ -1378,6 +1384,7 @@ show_splash_screen (ply_boot_splash_plugin_t *plugin, add_handlers (plugin); plugin->loop = loop; + plugin->mode = mode; ply_trace ("loading logo image"); if (!ply_image_load (plugin->logo_image)) diff --git a/src/plugins/splash/spinfinity/plugin.c b/src/plugins/splash/spinfinity/plugin.c index c9004360..622fa715 100644 --- a/src/plugins/splash/spinfinity/plugin.c +++ b/src/plugins/splash/spinfinity/plugin.c @@ -75,6 +75,7 @@ typedef enum { struct _ply_boot_splash_plugin { ply_event_loop_t *loop; + ply_boot_splash_mode_t mode; ply_frame_buffer_t *frame_buffer; ply_frame_buffer_area_t box_area, lock_area, logo_area, bar_area; ply_image_t *logo_image; @@ -201,6 +202,9 @@ start_animation (ply_boot_splash_plugin_t *plugin) draw_background (plugin, NULL); draw_logo (plugin); + if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN) + return; + ply_frame_buffer_get_size (plugin->frame_buffer, &area); width = ply_throbber_get_width (plugin->throbber); @@ -388,7 +392,8 @@ remove_window (ply_boot_splash_plugin_t *plugin, bool show_splash_screen (ply_boot_splash_plugin_t *plugin, ply_event_loop_t *loop, - ply_buffer_t *boot_buffer) + ply_buffer_t *boot_buffer, + ply_boot_splash_mode_t mode) { assert (plugin != NULL); assert (plugin->logo_image != NULL); @@ -396,6 +401,7 @@ show_splash_screen (ply_boot_splash_plugin_t *plugin, add_handlers (plugin); plugin->loop = loop; + plugin->mode = mode; ply_trace ("loading logo image"); if (!ply_image_load (plugin->logo_image)) diff --git a/src/plugins/splash/text/plugin.c b/src/plugins/splash/text/plugin.c index f58474e0..b9b7ad28 100644 --- a/src/plugins/splash/text/plugin.c +++ b/src/plugins/splash/text/plugin.c @@ -62,6 +62,7 @@ struct _ply_boot_splash_plugin { ply_event_loop_t *loop; + ply_boot_splash_mode_t mode; ply_window_t *window; @@ -178,6 +179,12 @@ start_animation (ply_boot_splash_plugin_t *plugin) ply_window_clear_screen (plugin->window); ply_window_hide_text_cursor (plugin->window); + if (plugin->mode == PLY_BOOT_SPLASH_MODE_SHUTDOWN) + { + ply_text_progress_bar_hide (plugin->progress_bar); + return; + } + ply_text_progress_bar_show (plugin->progress_bar, plugin->window); @@ -288,7 +295,8 @@ remove_window (ply_boot_splash_plugin_t *plugin, bool show_splash_screen (ply_boot_splash_plugin_t *plugin, ply_event_loop_t *loop, - ply_buffer_t *boot_buffer) + ply_buffer_t *boot_buffer, + ply_boot_splash_mode_t mode) { assert (plugin != NULL); @@ -298,6 +306,7 @@ show_splash_screen (ply_boot_splash_plugin_t *plugin, ply_window_set_text_cursor_position (plugin->window, 0, 0); plugin->loop = loop; + plugin->mode = mode; ply_event_loop_watch_for_exit (loop, (ply_event_loop_exit_handler_t) detach_from_event_loop, plugin); diff --git a/src/ply-boot-splash.c b/src/ply-boot-splash.c index a8697d8b..9ef100a7 100644 --- a/src/ply-boot-splash.c +++ b/src/ply-boot-splash.c @@ -214,7 +214,8 @@ ply_boot_splash_attach_progress (ply_boot_splash_t *splash, bool -ply_boot_splash_show (ply_boot_splash_t *splash) +ply_boot_splash_show (ply_boot_splash_t *splash, + ply_boot_splash_mode_t mode) { assert (splash != NULL); assert (splash->module_name != NULL); @@ -230,7 +231,8 @@ ply_boot_splash_show (ply_boot_splash_t *splash) ply_trace ("showing splash screen\n"); if (!splash->plugin_interface->show_splash_screen (splash->plugin, splash->loop, - splash->boot_buffer)) + splash->boot_buffer, + mode)) { ply_save_errno (); diff --git a/src/ply-boot-splash.h b/src/ply-boot-splash.h index 43263578..04085ed1 100644 --- a/src/ply-boot-splash.h +++ b/src/ply-boot-splash.h @@ -46,7 +46,8 @@ void ply_boot_splash_add_window (ply_boot_splash_t *splash, void ply_boot_splash_remove_window (ply_boot_splash_t *splash, ply_window_t *window); void ply_boot_splash_free (ply_boot_splash_t *splash); -bool ply_boot_splash_show (ply_boot_splash_t *splash); +bool ply_boot_splash_show (ply_boot_splash_t *splash, + ply_boot_splash_mode_t mode); void ply_boot_splash_update_status (ply_boot_splash_t *splash, const char *status); void ply_boot_splash_update_output (ply_boot_splash_t *splash, -- 2.47.3