From 7296e7984f2a68459720882d5244a0109bc7c866 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Wed, 7 Dec 2011 16:22:00 +0200 Subject: [PATCH] compositor: let shell override idle time Move idle_time variable to struct wlsc_compositor, so that a shell plugin can change it. Also store the original value from the command line. Add "duration" option to the desktop-shell screensaver config. This is the time the screensaver will be visible, after idle timeout triggers another time and blanks the screen. Now you can have different delays to lock the screen, and switch off the screen while a screensaver is running. Signed-off-by: Pekka Paalanen --- compositor/compositor.c | 9 ++++++--- compositor/compositor.h | 2 ++ compositor/shell.c | 12 +++++++++++- wayland-desktop-shell.ini | 1 + 4 files changed, 20 insertions(+), 4 deletions(-) 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