static void stop_animation (ply_boot_splash_plugin_t *plugin, ply_trigger_t *trigger) { ply_list_node_t *node; assert (plugin != NULL); assert (plugin->loop != NULL); if (!plugin->is_animating) return; plugin->is_animating = false; node = ply_list_get_first_node (plugin->views); while (node != NULL) { ply_list_node_t *next_node; view_t *view; view = ply_list_node_get_data (node); next_node = ply_list_get_next_node (plugin->views, node); ply_progress_bar_hide (view->progress_bar); if (trigger != NULL) ply_trigger_ignore_next_pull (trigger); ply_throbber_stop (view->throbber, trigger); node = next_node; } if (trigger != NULL) ply_trigger_pull (trigger, NULL); }
static void on_timeout (ply_throbber_t *throbber) { double sleep_time; bool should_continue; throbber->now = ply_get_timestamp (); should_continue = animate_at_time (throbber, throbber->now - throbber->start_time); sleep_time = 1.0 / FRAMES_PER_SECOND; sleep_time = MAX (sleep_time - (ply_get_timestamp () - throbber->now), 0.005); if (!should_continue) { throbber->is_stopped = true; 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 void become_idle (ply_boot_splash_plugin_t *plugin, ply_trigger_t *idle_trigger) { stop_animation (plugin); ply_trigger_pull (idle_trigger, NULL); }
static void on_animation_stopped (ply_boot_splash_plugin_t *plugin) { if (plugin->idle_trigger != NULL) { ply_trigger_pull (plugin->idle_trigger, NULL); plugin->idle_trigger = NULL; } plugin->is_idle = true; }
static void become_idle (ply_boot_splash_plugin_t *plugin, ply_trigger_t *idle_trigger) { ply_trace ("deactivation requested"); if (plugin->is_idle) { ply_trace ("plugin is already idle"); ply_trigger_pull (idle_trigger, NULL); return; } stop_animation (plugin, idle_trigger); plugin->is_idle = true; }
void ply_throbber_stop (ply_throbber_t *throbber, ply_trigger_t *stop_trigger) { if (throbber->is_stopped) { ply_trace ("throbber already stopped"); if (stop_trigger != NULL) { ply_trace ("pulling stop trigger right away"); ply_trigger_pull (stop_trigger, NULL); } return; } if (stop_trigger == NULL) { ply_throbber_stop_now (throbber); return; } throbber->stop_trigger = stop_trigger; }
static void become_idle (ply_boot_splash_plugin_t *plugin, ply_trigger_t *idle_trigger) { if (plugin->is_idle) { ply_trigger_pull (idle_trigger, NULL); return; } plugin->idle_trigger = idle_trigger; if (plugin->stop_trigger == NULL) { plugin->stop_trigger = ply_trigger_new (&plugin->stop_trigger); ply_trigger_add_handler (plugin->stop_trigger, (ply_trigger_handler_t) on_animation_stopped, plugin); start_end_animation (plugin, plugin->stop_trigger); } }
static void on_timeout (ply_animation_t *animation) { double sleep_time; bool should_continue; animation->previous_time = animation->now; animation->now = ply_get_timestamp (); #ifdef REAL_TIME_ANIMATION should_continue = animate_at_time (animation, animation->now - animation->start_time); #else static double time = 0.0; time += 1.0 / FRAMES_PER_SECOND; should_continue = animate_at_time (animation, time); #endif sleep_time = 1.0 / FRAMES_PER_SECOND; sleep_time = MAX (sleep_time - (ply_get_timestamp () - animation->now), 0.005); if (!should_continue) { if (animation->stop_trigger != NULL) { ply_trigger_pull (animation->stop_trigger, NULL); animation->stop_trigger = NULL; } } else { ply_event_loop_watch_for_timeout (animation->loop, sleep_time, (ply_event_loop_timeout_handler_t) on_timeout, animation); } }
static void start_end_animation (ply_boot_splash_plugin_t *plugin, ply_trigger_t *trigger) { ply_list_node_t *node; node = ply_list_get_first_node (plugin->views); while (node != NULL) { ply_list_node_t *next_node; view_t *view; view = ply_list_node_get_data (node); next_node = ply_list_get_next_node (plugin->views, node); ply_progress_animation_hide (view->progress_animation); ply_trigger_ignore_next_pull (trigger); view_start_end_animation (view, trigger); node = next_node; } ply_trigger_pull (trigger, NULL); }
static void become_idle (ply_boot_splash_plugin_t *plugin, ply_trigger_t *idle_trigger) { ply_trigger_pull (idle_trigger, NULL); }