Merge branch 'toplevel-workspace' into 'main'

Draft: staging: add ext-workspace-foreign-toplevel protocol

See merge request wayland/wayland-protocols!474
This commit is contained in:
Hiroaki Yamamoto 2026-04-06 02:29:42 +00:00
commit 111c10ce1c
2 changed files with 170 additions and 0 deletions

View file

@ -0,0 +1,4 @@
Workspace foreign toplevel protocol
Maintainers:
Hiroaki Yamamoto <hrak1529@gmail.com>

View file

@ -0,0 +1,166 @@
<?xml version="1.0" encoding="UTF-8"?>
<protocol name="ext_workspace_foreign_toplevel_v1">
<copyright>
Copyright © 2025 Hiroaki Yamamoto
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in
all copies and that both that copyright notice and this permission
notice appear in supporting documentation, and that the name of
the copyright holders not be used in advertising or publicity
pertaining to distribution of the software without specific,
written prior permission. The copyright holders make no
representations about the suitability of this software for any
purpose. It is provided "as is" without express or implied
warranty.
THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
THIS SOFTWARE.
</copyright>
<description summary="Protocol to manage toplevels in workspaces">
This protocol serves as an intermediary between ext_workspace_v1 protocol
and ext_foreign_toplevel_list_v1 protocol to manage toplevels in workspaces.
Warning! The protocol described in this file is currently in the testing
phase. Backward compatible changes may be added together with the
corresponding interface version bump. Backward incompatible changes can
only be done by creating a new major version of the extension.
</description>
<interface name="ext_workspace_foreign_toplevel_manager_v1" version="1">
<description summary="manage handles for toplevels in workspaces">
The ext_workspace_foreign_toplevel_manager_v1 interface defines a base
request for creating ext_workspace_foreign_toplevel_handle_v1 objects.
</description>
<request name="get_workspace_toplevel_handle">
<description summary="get a handle for a toplevel in workspaces">
Request a toplevel handle for workspace-related operations on the given
ext_foreign_toplevel_handle_v1. The workspace_manager argument specifies
the source of workspaces objects used in events and requests on the
returned handle.
</description>
<arg name="id" type="new_id" interface="ext_workspace_foreign_toplevel_handle_v1"/>
<arg name="toplevel_handle" type="object" interface="ext_foreign_toplevel_handle_v1"/>
<arg name="workspace_manager" type="object" interface="ext_workspace_manager_v1"/>
</request>
<request name="destroy" type="destructor">
<description summary="destroy the ext_workspace_foreign_toplevel_manager_v1 object">
Destroys the ext_workspace_foreign_toplevel_manager_v1 object.
</description>
</request>
</interface>
<interface name="ext_workspace_foreign_toplevel_handle_v1" version="1">
<description summary="toplevel handle">
A ext_workspace_foreign_toplevel_handle_v1 object represents a handle to
associate a toplevel with workspaces.
This object extends the ext_foreign_toplevel_handle_v1 interface and uses the
ext_foreign_toplevel_handle_v1.done event to atomically apply pending state.
</description>
<enum name="error">
<entry name="unsupported_feature" value="0" summary="request not supported"/>
<entry name="unknown_workspace" value="1" summary="workspace is unknown"/>
</enum>
<request name="assign_workspace">
<description summary="assign a toplevel to this workspace">
Request that the toplevel associated with this handle is assigned to
the given workspace. This request is double-buffered and applied on
the next ext_workspace_foreign_toplevel_handle_v1.commit request.
The workspace must belong to the ext_workspace_manager_v1 that was used
to create this handle. Otherwise, this request raises the
unknown_workspace error.
The client must not make this request if the handle does not have the
set_workspace capability. Otherwise, this request raises the
unsupported_feature error.
</description>
<arg name="workspace" type="object" interface="ext_workspace_handle_v1"/>
</request>
<request name="unassign_workspace">
<description summary="unassign a toplevel from this workspace">
Request that the toplevel associated with this handle is unassigned
from the given workspace. This request is double-buffered and applied on
the next ext_workspace_foreign_toplevel_handle_v1.commit request.
The workspace must belong to the ext_workspace_manager_v1 that was used
to create this handle. Otherwise, this request raises the
unknown_workspace error.
The client must not make this request if the handle does not have the
set_workspace capability. Otherwise, this request raises the
unsupported_feature error.
</description>
<arg name="workspace" type="object" interface="ext_workspace_handle_v1"/>
</request>
<request name="commit">
<description summary="apply states on the toplevel">
The client must send this request after it has finished sending other
requests. The compositor must process a series of requests preceding a
commit request atomically.
This allows changes to the toplevel properties to be seen as atomic,
even if they happen via multiple requests, and even if they involve
multiple workspaces.
</description>
</request>
<request name="destroy" type="destructor">
<description summary="destroy the ext_workspace_foreign_toplevel_handle_v1 object">
Destroys the ext_workspace_foreign_toplevel_handle_v1 object.
</description>
</request>
<event name="enter_workspace">
<description summary="toplevel is assigned to a workspace">
This event is emitted whenever the toplevel is assigned to a workspace.
This event is double-buffered and applied on
ext_foreign_toplevel_handle_v1.done event.
</description>
<arg name="workspace" type="object" interface="ext_workspace_handle_v1"/>
</event>
<event name="leave_workspace">
<description summary="toplevel is unassigned from a workspace">
This event is emitted whenever the toplevel is unassigned from a workspace.
This event is double-buffered and applied on
ext_foreign_toplevel_handle_v1.done event.
</description>
<arg name="workspace" type="object" interface="ext_workspace_handle_v1"/>
</event>
<enum name="capabilities" bitfield="true">
<entry name="set_workspace" value="1"
summary="assign_workspace and unassign_workspace request is available"/>
</enum>
<event name="capabilities">
<description summary="compositor capabilities">
This event advertises the capabilities supported by the compositor. If
a capability isn't supported, clients should hide or disable the UI
elements that expose this functionality.
Compositors must send this event once after creation of an
ext_workspace_foreign_toplevel_handle_v1. When the capabilities change,
compositors must send this event again.
</description>
<arg name="capabilities" type="uint" summary="capabilities"
enum="capabilities"/>
</event>
</interface>
</protocol>