#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
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,
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);
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);
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;
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;
(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,
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;
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);
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;
}
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);
add_handlers (plugin);
plugin->loop = loop;
+ plugin->mode = mode;
ply_trace ("loading logo image");
if (!ply_image_load (plugin->logo_image))
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;
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);
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))
struct _ply_boot_splash_plugin
{
ply_event_loop_t *loop;
+ ply_boot_splash_mode_t mode;
ply_window_t *window;
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);
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);
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);
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;
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;
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);
add_handlers (plugin);
plugin->loop = loop;
+ plugin->mode = mode;
ply_trace ("loading logo image");
if (!ply_image_load (plugin->logo_image))
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;
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);
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);
add_handlers (plugin);
plugin->loop = loop;
+ plugin->mode = mode;
ply_trace ("loading logo image");
if (!ply_image_load (plugin->logo_image))
struct _ply_boot_splash_plugin
{
ply_event_loop_t *loop;
+ ply_boot_splash_mode_t mode;
ply_window_t *window;
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);
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);
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);
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);
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 ();
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,