[PATCH] unstable: add xdg-session-management protocol

Mike Blumenkrantz zmike at osg.samsung.com
Mon Feb 26 13:58:55 UTC 2018


for a variety of cases it's desirable to have a method for negotiating
the restoration of previously-used states for a client's windows. this
helps for e.g., a compositor/client crashing (definitely not due to
bugs) or a backgrounded client deciding to temporarily destroy its
surfaces in order to conserve resources

this protocol adds a method for managing such negotiation and is loosely
based on the Enlightenment "session recovery" protocol which has been
implemented and functional for roughly two years

some further reading: https://blogs.s-osg.org/recovery-journey-discovery/

Signed-off-by: Mike Blumenkrantz <zmike at osg.samsung.com>
Signed-off-by: Jonas Ã…dahl <jadahl at gmail.com>
---
 Makefile.am                                        |   1 +
 unstable/xdg-session-management/README             |   4 +
 .../xdg-session-management-unstable-v1.xml         | 181 +++++++++++++++++++++
 3 files changed, 186 insertions(+)
 create mode 100644 unstable/xdg-session-management/README
 create mode 100644 unstable/xdg-session-management/xdg-session-management-unstable-v1.xml

diff --git a/Makefile.am b/Makefile.am
index 4b9a901..2b75114 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -17,6 +17,7 @@ unstable_protocols =								\
 	unstable/keyboard-shortcuts-inhibit/keyboard-shortcuts-inhibit-unstable-v1.xml \
 	unstable/xdg-output/xdg-output-unstable-v1.xml				\
 	unstable/input-timestamps/input-timestamps-unstable-v1.xml	\
+	unstable/xdg-session-management/xdg-session-management-unstable-v1.xml  \
 	$(NULL)
 
 stable_protocols =								\
diff --git a/unstable/xdg-session-management/README b/unstable/xdg-session-management/README
new file mode 100644
index 0000000..7bff401
--- /dev/null
+++ b/unstable/xdg-session-management/README
@@ -0,0 +1,4 @@
+xdg session management protocol
+
+Maintainers:
+Mike Blumenkrantz <zmike at osg.samsung.com>
diff --git a/unstable/xdg-session-management/xdg-session-management-unstable-v1.xml b/unstable/xdg-session-management/xdg-session-management-unstable-v1.xml
new file mode 100644
index 0000000..0c36c16
--- /dev/null
+++ b/unstable/xdg-session-management/xdg-session-management-unstable-v1.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<protocol name="session management">
+  <copyright>
+    Copyright 2018 Mike Blumenkrantz
+    Copyright 2018 Samsung Electronics Co., Ltd
+    Copyright 2018 Red Hat Inc.
+
+    Permission is hereby granted, free of charge, to any person obtaining a
+    copy of this software and associated documentation files (the "Software"),
+    to deal in the Software without restriction, including without limitation
+    the rights to use, copy, modify, merge, publish, distribute, sublicense,
+    and/or sell copies of the Software, and to permit persons to whom the
+    Software is furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice (including the next
+    paragraph) shall be included in all copies or substantial portions of the
+    Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+    THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+    DEALINGS IN THE SOFTWARE.
+  </copyright>
+  <description summary="Protocol for managing application sessions">
+    Warning! The protocol described in this file is experimental and backward
+    incompatible changes may be made. Backward compatible changes may be added
+    together with the corresponding interface version bump. Backward
+    incompatible changes are done by bumping the version number in the protocol
+    and interface names and resetting the interface version. Once the protocol
+    is to be declared stable, the 'z' prefix and the version number in the
+    protocol and interface names are removed and the interface version number is
+    reset.
+  </description>
+  <interface name="zxdg_session_manager_v1" version="1">
+    <description summary="manage sessions for applications">
+      The xdg_session_manager interface defines base requests for creating and
+      managing a session for an application. Sessions persist across application
+      and compositor restarts unless explicitly destroyed. A session is created
+      for the purpose of maintaining an application's xdg_toplevel surfaces
+      across compositor or application restarts. The compositor should remember
+      as many states as possible for surfaces in a given session, but there is
+      no requirement for which states must be remembered.
+    </description>
+    <request name="destroy" type="destructor">
+      <description summary="Destroy this object">
+       This has no effect other than to destroy the xdg_session_manager object.
+      </description>
+    </request>
+    <request name="get_session">
+      <description summary="create or restore a session">
+        Create a session object corresponding to the given session
+        identifier string. While the session object exists, the session is
+        considered to be "in use".
+
+        It is a client error if the given identifier string represents a session
+        which is already in use.
+
+        NULL is passed to initiate a new session. If an id is passed which does
+        not represent a valid session, the compositor treats it as if NULL had
+        been passed.
+      </description>
+      <arg name="id" type="new_id" interface="zxdg_session_v1"/>
+      <arg name="session" type="string" summary="the session identifier string"
+           allow-null="true"/>
+    </request>
+  </interface>
+  <interface name="zxdg_session_v1" version="1">
+    <description summary="A session for an application">
+      A xdg_session object represents a session for an application. While the
+      object exists, all surfaces which have been added to the session will
+      have states stored by the compositor which can be reapplied at a later
+      time. Two sessions cannot exist for the same identifier string.
+
+      States for surfaces added to a session are automatically updated by the
+      compositor when they are changed.
+
+      Surfaces which have been added to a session are automatically removed from
+      the session if xdg_toplevel.destroy is called for the surface.
+    </description>
+    <enum name="error">
+      <entry name="in_use" summary="a requested session is already in use"
+             value="1"/>
+      <entry name="invalid_restore"
+             summary="restore cannot be performed after initial toplevel commit"
+             value="2"/>
+    </enum>
+    <request name="destroy" type="destructor">
+      <description summary="Destroy the session">
+        Destroy a session object, preserving the current state but not continuing
+        to make further updates if state changes occur.
+      </description>
+    </request>
+    <request name="remove" type="destructor">
+      <description summary="Remove the session">
+        Remove a session from the compositor's storage, destroying
+        all xdg_session objects and all session data recursively.
+      </description>
+    </request>
+    <request name="add_surface">
+      <description summary="add a new surface to the session">
+        Attempt to add a given surface to the session. If successful,
+        a zxdg_surface_session_v1.surface_id event is emitted with a
+        session-unique identifier which can be used to restore states of the
+        toplevel surface.
+
+        Multiple requests for the same surface will always return the same
+        string identifier.
+
+        The surface will be added to the session at the next wl_surface.commit.
+      </description>
+      <arg name="surface" type="object" interface="xdg_toplevel"/>
+      <arg name="id" type="new_id" interface="zxdg_surface_session_v1"/>
+    </request>
+    <request name="restore_surface">
+      <description summary="restore a surface state">
+        Inform the compositor that the next configured state should
+        be the same as the state which was stored by the compositor during the
+        given surface's previous session.
+
+        This request must be called prior to the first commit for an
+        xdg_toplevel surface.
+
+        See the zxdg_surface_session_v1.surface_restored event for further
+        details.
+      </description>
+      <arg name="id" type="new_id" interface="zxdg_surface_session_v1"/>
+      <arg name="surface" type="object" interface="xdg_toplevel"/>
+      <arg name="surface_id" type="string"
+           summary="the identifier for the surface"/>
+    </request>
+    <request name="remove_surface">
+      <description summary="remove a surface from the session">
+        Remove a specified surface from the session and render any corresponding
+        xdg_surface_session object inert.
+
+        Passing an unknown surface identifier has no effect.
+      </description>
+      <arg name="surface_id" type="string"/>
+    </request>
+    <event name="created">
+      <description summary="newly-created session id">
+        Emitted immediately after creating a new session object. This id can be
+        used to restore previous sessions.
+      </description>
+      <arg name="id" type="string"/>
+    </event>
+    <event name="restored">
+      <description
+       summary="the session has been restored from a previous state"/>
+    </event>
+  </interface>
+  <interface name="zxdg_surface_session_v1" version="1">
+    <request name="destroy" type="destructor">
+      <description summary="Destroy the object">
+        Destroy the object.
+      </description>
+    </request>
+    <event name="surface_restored">
+      <description summary="a surface's session has been restored">
+        surface_restored is emitted prior to the first xdg_surface.configure for
+        a surface. It will only be emitted after zxdg_session_v1.restore_surface
+        and wl_surface.commit have been called for that surface, and it
+        indicates that the surface's session is being restored with this
+        configure event.
+      </description>
+      <arg name="surface" type="object" interface="xdg_toplevel"/>
+    </event>
+    <event name="surface_id">
+      <description summary="a surface has been added to the session">
+        surface_id is emitted after the wl_surface.commit of a surface which has
+        been passed to add_surface. The id is an identifier which can be passed
+        to restore_surface to restore the state of that surface.
+      </description>
+      <arg name="surface" type="object" interface="xdg_toplevel"/>
+      <arg name="id" type="string"/>
+    </event>
+  </interface>
+</protocol>
-- 
2.14.3



More information about the wayland-devel mailing list