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 <ppaalanen@gmail.com>
diff --git a/compositor/compositor.c b/compositor/compositor.c
index 118d0de..12678fd 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_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 @@
 
 	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 @@
 	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 @@
 		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 1584f80..3c88807 100644
--- a/compositor/compositor.h
+++ b/compositor/compositor.h
@@ -219,6 +219,8 @@
 	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 6cabcfc..bb6db32 100644
--- a/compositor/shell.c
+++ b/compositor/shell.c
@@ -59,6 +59,7 @@
 
 	struct {
 		const char *path;
+		int duration;
 		struct wl_resource *binding;
 		struct wl_list surfaces;
 		struct wlsc_process process;
@@ -102,9 +103,12 @@
 {
 	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 @@
 	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 @@
 
 	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 @@
 		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 @@
 		/* 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 d438a85..15ecedd 100644
--- a/wayland-desktop-shell.ini
+++ b/wayland-desktop-shell.ini
@@ -21,4 +21,5 @@
 
 [screensaver]
 #path=./clients/wscreensaver
+duration=600