From: Ray Strode Date: Mon, 22 Sep 2008 03:49:15 +0000 (-0400) Subject: implement become_idle interface in spinfinity X-Git-Tag: 0.6.0~136 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8dba43de52d008e231e517a7ddcad6dc1d66e110;p=thirdparty%2Fplymouth.git implement become_idle interface in spinfinity This means extending throbber to optionally take a trigger to stop when ready. --- diff --git a/src/libplybootsplash/ply-throbber.c b/src/libplybootsplash/ply-throbber.c index 361a24f2..79ab5b24 100644 --- a/src/libplybootsplash/ply-throbber.c +++ b/src/libplybootsplash/ply-throbber.c @@ -65,10 +65,11 @@ struct _ply_throbber ply_window_t *window; ply_frame_buffer_t *frame_buffer; ply_frame_buffer_area_t frame_area; + ply_trigger_t *stop_trigger; long x, y; long width, height; - double start_time, now; + double start_time, previous_time, now; }; ply_throbber_t * @@ -130,7 +131,7 @@ draw_background (ply_throbber_t *throbber) throbber->frame_area.height); } -static void +static bool animate_at_time (ply_throbber_t *throbber, double time) { @@ -138,16 +139,26 @@ animate_at_time (ply_throbber_t *throbber, int frame_number; ply_image_t * const * frames; uint32_t *frame_data; + bool should_continue; ply_window_set_mode (throbber->window, PLY_WINDOW_MODE_GRAPHICS); number_of_frames = ply_array_get_size (throbber->frames); if (number_of_frames == 0) - return; + return true; + + should_continue = true; frame_number = (.5 * sin (time) + .5) * number_of_frames; + if (throbber->stop_trigger != NULL) + { + if ((time - throbber->previous_time) >= 2 * M_PI) + frame_number = number_of_frames - 1; + should_continue = false; + } + ply_frame_buffer_pause_updates (throbber->frame_buffer); if (throbber->frame_area.width > 0) draw_background (throbber); @@ -164,31 +175,49 @@ animate_at_time (ply_throbber_t *throbber, &throbber->frame_area, 0, 0, frame_data); ply_frame_buffer_unpause_updates (throbber->frame_buffer); + + return should_continue; } static void on_timeout (ply_throbber_t *throbber) { double sleep_time; + bool should_continue; + throbber->previous_time = throbber->now; throbber->now = ply_get_timestamp (); #ifdef REAL_TIME_ANIMATION - animate_at_time (throbber, - throbber->now - throbber->start_time); + should_continue = animate_at_time (throbber, + throbber->now - throbber->start_time); #else static double time = 0.0; time += 1.0 / FRAMES_PER_SECOND; - animate_at_time (throbber, time); + should_continue = animate_at_time (throbber, time); #endif sleep_time = 1.0 / FRAMES_PER_SECOND; sleep_time = MAX (sleep_time - (ply_get_timestamp () - throbber->now), 0.005); - ply_event_loop_watch_for_timeout (throbber->loop, - sleep_time, - (ply_event_loop_timeout_handler_t) - on_timeout, throbber); + if (!should_continue) + { + + draw_background (throbber); + + if (throbber->stop_trigger != NULL) + { + ply_trigger_pull (throbber->stop_trigger, NULL); + throbber->stop_trigger = NULL; + } + } + else + { + ply_event_loop_watch_for_timeout (throbber->loop, + sleep_time, + (ply_event_loop_timeout_handler_t) + on_timeout, throbber); + } } static bool @@ -308,8 +337,8 @@ ply_throbber_start (ply_throbber_t *throbber, return true; } -void -ply_throbber_stop (ply_throbber_t *throbber) +static void +ply_throbber_stop_now (ply_throbber_t *throbber) { if (throbber->frame_area.width > 0) draw_background (throbber); @@ -326,6 +355,20 @@ ply_throbber_stop (ply_throbber_t *throbber) } } +void +ply_throbber_stop (ply_throbber_t *throbber, + ply_trigger_t *stop_trigger) +{ + + if (stop_trigger == NULL) + { + ply_throbber_stop_now (throbber); + return; + } + + throbber->stop_trigger = stop_trigger; +} + long ply_throbber_get_width (ply_throbber_t *throbber) { diff --git a/src/libplybootsplash/ply-throbber.h b/src/libplybootsplash/ply-throbber.h index 21ff17ee..83f6b43e 100644 --- a/src/libplybootsplash/ply-throbber.h +++ b/src/libplybootsplash/ply-throbber.h @@ -28,6 +28,7 @@ #include "ply-event-loop.h" #include "ply-frame-buffer.h" +#include "ply-trigger.h" #include "ply-window.h" typedef struct _ply_throbber ply_throbber_t; @@ -43,7 +44,8 @@ bool ply_throbber_start (ply_throbber_t *throbber, ply_window_t *window, long x, long y); -void ply_throbber_stop (ply_throbber_t *throbber); +void ply_throbber_stop (ply_throbber_t *throbber, + ply_trigger_t *stop_trigger); long ply_throbber_get_width (ply_throbber_t *throbber); long ply_throbber_get_height (ply_throbber_t *throbber); diff --git a/src/plugins/splash/spinfinity/plugin.c b/src/plugins/splash/spinfinity/plugin.c index ec8176c0..df32442b 100644 --- a/src/plugins/splash/spinfinity/plugin.c +++ b/src/plugins/splash/spinfinity/plugin.c @@ -75,6 +75,7 @@ struct _ply_boot_splash_plugin ply_label_t *label; ply_answer_t *pending_password_answer; + ply_trigger_t *idle_trigger; uint32_t root_is_mounted : 1; uint32_t is_visible : 1; @@ -205,14 +206,15 @@ start_animation (ply_boot_splash_plugin_t *plugin) } static void -stop_animation (ply_boot_splash_plugin_t *plugin) +stop_animation (ply_boot_splash_plugin_t *plugin, + ply_trigger_t *trigger) { int i; assert (plugin != NULL); assert (plugin->loop != NULL); - ply_throbber_stop (plugin->throbber); + ply_throbber_stop (plugin->throbber, trigger); #ifdef ENABLE_FADE_OUT for (i = 0; i < 10; i++) @@ -240,7 +242,7 @@ static void on_interrupt (ply_boot_splash_plugin_t *plugin) { ply_event_loop_exit (plugin->loop, 1); - stop_animation (plugin); + stop_animation (plugin, NULL); ply_window_set_mode (plugin->window, PLY_WINDOW_MODE_TEXT); } @@ -440,7 +442,7 @@ hide_splash_screen (ply_boot_splash_plugin_t *plugin, if (plugin->loop != NULL) { - stop_animation (plugin); + stop_animation (plugin, NULL); ply_event_loop_stop_watching_for_exit (plugin->loop, (ply_event_loop_exit_handler_t) detach_from_event_loop, @@ -521,7 +523,7 @@ ask_for_password (ply_boot_splash_plugin_t *plugin, if (ply_entry_is_hidden (plugin->entry)) { - stop_animation (plugin); + stop_animation (plugin, NULL); show_password_prompt (plugin, prompt); } else @@ -537,6 +539,13 @@ on_root_mounted (ply_boot_splash_plugin_t *plugin) plugin->root_is_mounted = true; } +void +become_idle (ply_boot_splash_plugin_t *plugin, + ply_trigger_t *idle_trigger) +{ + stop_animation (plugin, idle_trigger); +} + ply_boot_splash_plugin_interface_t * ply_boot_splash_plugin_get_interface (void) { @@ -550,7 +559,8 @@ ply_boot_splash_plugin_get_interface (void) .update_status = update_status, .hide_splash_screen = hide_splash_screen, .ask_for_password = ask_for_password, - .on_root_mounted = on_root_mounted + .on_root_mounted = on_root_mounted, + .become_idle = become_idle }; return &plugin_interface;