protocol: add screensaver interface

Add the screensaver interface to the desktop-shell protocol file. Also
add stubs for it in the compositor, and make wscreensaver to bind to the
screensaver interface. Wscreensaver gets a new option --demo to retain
the current behaviour as a regular wayland client.

When a screensaver application starts, it should bind to the screensaver
interface, enumerate all outputs, create a surface per output, and
register those surfaces via screensaver::set_surface request. Then it
continues with the usual animation loop, waiting for frame events. The
compositor will decide, when the given screensaver surfaces are
displayed. A screensaver application should respond to outputs coming
and going away by creating and destroying surfaces.

The compositor is supposed to activate a screensaver by exec'ing it, and
stop the screensaver by killing the client process. Only one client may
be bound to the screensaver interface at a time. If there already is a
client, the compositor could either kill it first, or not exec a new
one.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
diff --git a/protocol/desktop-shell.xml b/protocol/desktop-shell.xml
index 3c3ead4..c40cf17 100644
--- a/protocol/desktop-shell.xml
+++ b/protocol/desktop-shell.xml
@@ -35,4 +35,17 @@
     <event name="prepare_lock_surface"/>
   </interface>
 
+  <!-- Only one client can bind this interface at a time. -->
+  <interface name="screensaver" version="1">
+
+    <!-- Set the surface type as a screensaver for a particular output.
+         A screensaver surface is normally hidden, and only visible after
+         an idle timeout. -->
+    <request name="set_surface">
+      <arg name="surface" type="object" interface="wl_shell_surface"/>
+      <arg name="output" type="object" interface="wl_output"/>
+    </request>
+
+  </interface>
+
 </protocol>