main: introduce delay as a daemon option

Briefly, the two-step plugin would delay showing itself
for a few seconds (in case the machine boots quickly).

That got reverted, because i'm not convinced any longer
that doing it in the splash is the right level.  Also,
the implementation had various bugs causing the delay
to show up at the wrong time.

This commit makes it a daemon option instead.

This makes it easier to apply to all themes, and also makes it
so the admin can opt-out without changing themes.
This commit is contained in:
Ray Strode 2014-01-10 13:01:02 -05:00
parent 112b5eb1de
commit 6cc3d93888

View file

@ -23,6 +23,7 @@
#include <sys/stat.h>
#include <sys/types.h>
#include <math.h>
#include <ctype.h>
#include <limits.h>
#include <dirent.h>
@ -35,6 +36,7 @@
#include <wchar.h>
#include <paths.h>
#include <assert.h>
#include <values.h>
#include <linux/kd.h>
#include <linux/vt.h>
@ -103,6 +105,9 @@ typedef struct
ply_trigger_t *deactivate_trigger;
ply_trigger_t *quit_trigger;
double start_time;
double splash_delay;
char kernel_command_line[PLY_MAX_COMMAND_LINE_SIZE];
uint32_t kernel_command_line_is_set : 1;
uint32_t no_boot_log : 1;
@ -262,6 +267,7 @@ load_settings (state_t *state,
char **theme_path)
{
ply_key_file_t *key_file = NULL;
const char *delay_string;
bool settings_loaded = false;
const char *splash_string;
@ -280,6 +286,17 @@ load_settings (state_t *state,
PLYMOUTH_THEME_PATH "%s/%s.plymouth",
splash_string, splash_string);
if (isnan (state->splash_delay))
{
delay_string = ply_key_file_get_value (key_file, "Daemon", "ShowDelay");
if (delay_string != NULL)
{
ply_trace ("Splash delay is set to %lf", state->splash_delay);
state->splash_delay = atof (delay_string);
}
}
settings_loaded = true;
out:
ply_key_file_free (key_file);
@ -367,6 +384,16 @@ find_override_splash (state_t *state)
PLYMOUTH_THEME_PATH "%*.*s/%*.*s.plymouth",
length, length, splash_string, length, length, splash_string);
}
if (isnan (state->splash_delay))
{
const char *delay_string;
delay_string = command_line_get_string_after_prefix (state->kernel_command_line, "plymouth.splash-delay=");
if (delay_string != NULL)
state->splash_delay = atof (delay_string);
}
}
static void
@ -453,6 +480,28 @@ show_default_splash (state_t *state)
}
}
static void
cancel_pending_delayed_show (state_t *state)
{
bool has_open_seats;
if (isnan (state->splash_delay))
return;
ply_event_loop_stop_watching_for_timeout (state->loop,
(ply_event_loop_timeout_handler_t)
show_splash,
state);
state->splash_delay = NAN;
has_open_seats = ply_device_manager_has_open_seats (state->device_manager);
if (state->is_shown && has_open_seats)
{
ply_trace ("splash delay cancelled, showing splash immediately");
show_splash (state);
}
}
static void
on_ask_for_password (state_t *state,
const char *prompt,
@ -466,6 +515,7 @@ on_ask_for_password (state_t *state,
if (state->show_trigger != NULL)
{
ply_trace ("splash still coming up, waiting a bit");
cancel_pending_delayed_show (state);
}
else if (state->boot_splash == NULL)
{
@ -899,6 +949,31 @@ show_splash (state_t *state)
if (state->boot_splash != NULL)
return;
if (!isnan (state->splash_delay))
{
double now, running_time;
now = ply_get_timestamp ();
running_time = now - state->start_time;
if (state->splash_delay > running_time)
{
double time_left = state->splash_delay - running_time;
ply_trace ("delaying show splash for %lf seconds",
time_left);
ply_event_loop_stop_watching_for_timeout (state->loop,
(ply_event_loop_timeout_handler_t)
show_splash,
state);
ply_event_loop_watch_for_timeout (state->loop,
time_left,
(ply_event_loop_timeout_handler_t)
show_splash,
state);
return;
}
}
if (plymouth_should_show_default_splash (state))
{
show_default_splash (state);
@ -1003,6 +1078,8 @@ hide_splash (state_t *state)
{
state->is_shown = false;
cancel_pending_delayed_show (state);
if (state->boot_splash == NULL)
return;
@ -2048,6 +2125,7 @@ main (int argc,
char *tty = NULL;
ply_device_manager_flags_t device_manager_flags = PLY_DEVICE_MANAGER_FLAGS_NONE;
state.start_time = ply_get_timestamp ();
state.command_parser = ply_command_parser_new ("plymouthd", "Splash server");
state.loop = ply_event_loop_get_default ();
@ -2207,6 +2285,7 @@ main (int argc,
}
state.progress = ply_progress_new ();
state.splash_delay = NAN;
ply_progress_load_cache (state.progress,
get_cache_file_for_mode (state.mode));