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/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;