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>