diff --git a/compositor/compositor.c b/compositor/compositor.c index 118d0ded..12678fde 100644 --- a/compositor/compositor.c +++ b/compositor/compositor.c @@ -48,7 +48,6 @@ #include "compositor.h" static const char *option_socket_name = NULL; -static int option_idle_time = 300; static struct wl_list child_process_list; @@ -1299,7 +1298,7 @@ wlsc_compositor_wake(struct wlsc_compositor *compositor) wlsc_compositor_fade(compositor, 0.0); wl_event_source_timer_update(compositor->idle_source, - option_idle_time * 1000); + compositor->idle_time * 1000); } WL_EXPORT void @@ -2070,7 +2069,7 @@ wlsc_compositor_init(struct wlsc_compositor *ec, struct wl_display *display) loop = wl_display_get_event_loop(ec->wl_display); ec->idle_source = wl_event_loop_add_timer(loop, idle_handler, ec); - wl_event_source_timer_update(ec->idle_source, option_idle_time * 1000); + wl_event_source_timer_update(ec->idle_source, ec->idle_time * 1000); wlsc_compositor_schedule_repaint(ec); @@ -2139,6 +2138,7 @@ int main(int argc, char *argv[]) char *backend_options = ""; char *shell = NULL; char *p; + int option_idle_time = 300; static const char opts[] = "B:b:o:S:i:s:x"; static const struct option longopts[ ] = { @@ -2218,6 +2218,9 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } + ec->option_idle_time = option_idle_time; + ec->idle_time = option_idle_time; + if (shell_init(ec) < 0) exit(EXIT_FAILURE); diff --git a/compositor/compositor.h b/compositor/compositor.h index 1584f809..3c88807e 100644 --- a/compositor/compositor.h +++ b/compositor/compositor.h @@ -219,6 +219,8 @@ struct wlsc_compositor { uint32_t state; struct wl_event_source *idle_source; uint32_t idle_inhibit; + int option_idle_time; /* default timeout, s */ + int idle_time; /* effective timeout, s */ /* Repaint state. */ struct timespec previous_swap; diff --git a/compositor/shell.c b/compositor/shell.c index 6cabcfcb..bb6db32f 100644 --- a/compositor/shell.c +++ b/compositor/shell.c @@ -59,6 +59,7 @@ struct wl_shell { struct { const char *path; + int duration; struct wl_resource *binding; struct wl_list surfaces; struct wlsc_process process; @@ -102,9 +103,12 @@ shell_configuration(struct wl_shell *shell) { int ret; char *config_file; + char *path = NULL; + int duration = 60; struct config_key saver_keys[] = { - { "path", CONFIG_KEY_STRING, &shell->screensaver.path }, + { "path", CONFIG_KEY_STRING, &path }, + { "duration", CONFIG_KEY_INTEGER, &duration }, }; struct config_section cs[] = { @@ -115,6 +119,9 @@ shell_configuration(struct wl_shell *shell) ret = parse_config_file(config_file, cs, ARRAY_LENGTH(cs), shell); free(config_file); + shell->screensaver.path = path; + shell->screensaver.duration = duration; + return ret; /* FIXME: free(shell->screensaver.path) on plugin fini */ } @@ -716,6 +723,7 @@ resume_desktop(struct wl_shell *shell) shell->locked = false; wlsc_compositor_repick(shell->compositor); + shell->compositor->idle_time = shell->compositor->option_idle_time; wlsc_compositor_wake(shell->compositor); } @@ -907,6 +915,7 @@ lock(struct wlsc_shell *base) show_screensaver(shell, shsurf); if (!wl_list_empty(&shell->screensaver.surfaces)) { + shell->compositor->idle_time = shell->screensaver.duration; wlsc_compositor_wake(shell->compositor); shell->compositor->state = WLSC_COMPOSITOR_IDLE; } @@ -1025,6 +1034,7 @@ map(struct wlsc_shell *base, /* If locked, show it. */ if (shell->locked) { show_screensaver(shell, shsurf); + compositor->idle_time = shell->screensaver.duration; wlsc_compositor_wake(compositor); if (!shell->lock_surface) compositor->state = WLSC_COMPOSITOR_IDLE; diff --git a/wayland-desktop-shell.ini b/wayland-desktop-shell.ini index d438a85e..15ecedd5 100644 --- a/wayland-desktop-shell.ini +++ b/wayland-desktop-shell.ini @@ -21,4 +21,5 @@ path=./clients/flower [screensaver] #path=./clients/wscreensaver +duration=600