diff --git a/meson.build b/meson.build index 1846f3de88a9e30cbc8d94de35852be1f5399df2..28275de81fc4dc4dcc0d27c2a22ee40a7f5858e0 100644 --- a/meson.build +++ b/meson.build @@ -53,6 +53,7 @@ staging_protocols = { 'xdg-activation': ['v1'], 'xdg-dialog': ['v1'], 'xdg-toplevel-drag': ['v1'], + 'xdg-toplevel-icon': ['v1'], 'xwayland-shell': ['v1'], 'alpha-modifier': ['v1'], } diff --git a/staging/xdg-toplevel-icon/README b/staging/xdg-toplevel-icon/README new file mode 100644 index 0000000000000000000000000000000000000000..41938ae94a7ee8d31058198eab26806fa6e7c321 --- /dev/null +++ b/staging/xdg-toplevel-icon/README @@ -0,0 +1,4 @@ +xdg_toplevel_icon protocol + +Maintainers: +Matthias Klumpp <matthias@tenstral.net> diff --git a/staging/xdg-toplevel-icon/xdg-toplevel-icon-v1.xml b/staging/xdg-toplevel-icon/xdg-toplevel-icon-v1.xml new file mode 100644 index 0000000000000000000000000000000000000000..e9cb5d0a3a4d0dc18da1f634b1d965087e90a640 --- /dev/null +++ b/staging/xdg-toplevel-icon/xdg-toplevel-icon-v1.xml @@ -0,0 +1,199 @@ +<?xml version="1.0" encoding="UTF-8"?> +<protocol name="xdg_toplevel_icon_v1"> + + <copyright> + Copyright © 2023-2024 Matthias Klumpp + Copyright © 2024 David Edmundson + + 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 to assign icons to toplevels"> + This protocol allows clients to set icons for their toplevel surfaces + either via the XDG icon stock (using an icon name), or from pixel data. + + A toplevel icon represents the individual toplevel (unlike the application + or launcher icon, which represents the application as a whole), and may be + shown in window switchers, window overviews and taskbars that list + individual windows. + + This document adheres to RFC 2119 when using words like "must", + "should", "may", etc. + + 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="xdg_toplevel_icon_manager_v1" version="1"> + <description summary="interface to manage toplevel icons"> + This interface allows clients to create toplevel window icons and set + them on toplevel windows to be displayed to the user. + </description> + + <request name="destroy" type="destructor"> + <description summary="destroy the toplevel icon manager"> + Destroy the toplevel icon manager. + This does not destroy objects created with the manager. + </description> + </request> + + <request name="create_icon"> + <description summary="create a new icon instance"> + Creates a new icon object. This icon can then be attached to a + xdg_toplevel via the 'set_icon' request. + </description> + <arg name="id" type="new_id" interface="xdg_toplevel_icon_v1"/> + </request> + + <request name="set_icon"> + <description summary="set an icon on a toplevel window"> + This request assigns the icon 'icon' to 'toplevel', or clears the + toplevel icon if 'icon' was null. + This state is double-buffered and is applied on the next + wl_surface.commit of the toplevel. + + After making this call, the xdg_toplevel_icon_v1 provided as 'icon' + can be destroyed by the client without 'toplevel' losing its icon. + The xdg_toplevel_icon_v1 is immutable from this point, and any + future attempts to change it must raise the + 'xdg_toplevel_icon_v1.immutable' protocol error. + + The compositor must set the toplevel icon from either the pixel data + the icon provides, or by loading a stock icon using the icon name. + See the description of 'xdg_toplevel_icon_v1' for details. + + If 'icon' is set to null, the icon of the respective toplevel is reset + to its default icon (usually the icon of the application, derived from + its desktop-entry file, or a placeholder icon). + If this request is passed an icon with no pixel buffers or icon name + assigned, the icon must be reset just like if 'icon' was null. + </description> + <arg name="toplevel" type="object" interface="xdg_toplevel" summary="the toplevel to act on"/> + <arg name="icon" type="object" interface="xdg_toplevel_icon_v1" allow-null="true"/> + </request> + + <event name="icon_size"> + <description summary="describes a supported & preferred icon size"> + This event indicates an icon size the compositor prefers to be + available if the client has scalable icons and can render to any size. + + When the 'xdg_toplevel_icon_manager_v1' object is created, the + compositor may send one or more 'icon_size' events to describe the list + of preferred icon sizes. If the compositor has no size preference, it + may not send any 'icon_size' event, and it is up to the client to + decide a suitable icon size. + + A sequence of 'icon_size' events must be finished with a 'done' event. + If the compositor has no size preferences, it must still send the + 'done' event, without any preceding 'icon_size' events. + </description> + <arg name="size" type="int" + summary="the edge size of the square icon in surface-local coordinates, e.g. 64"/> + </event> + + <event name="done"> + <description summary="all information has been sent"> + This event is sent after all 'icon_size' events have been sent. + </description> + </event> + </interface> + + <interface name="xdg_toplevel_icon_v1" version="1"> + <description summary="a toplevel window icon"> + This interface defines a toplevel icon. + An icon can have a name, and multiple buffers. + In order to be applied, the icon must have either a name, or at least + one buffer assigned. Applying an empty icon (with no buffer or name) to + a toplevel should reset its icon to the default icon. + + It is up to compositor policy whether to prefer using a buffer or loading + an icon via its name. See 'set_name' and 'add_buffer' for details. + </description> + + <enum name="error"> + <entry name="invalid_buffer" + summary="the provided buffer does not satisfy requirements" + value="1"/> + <entry name="immutable" + summary="the icon has already been assigned to a toplevel and must not be changed" + value="2"/> + </enum> + + <request name="destroy" type="destructor"> + <description summary="destroy the icon object"> + Destroys the 'xdg_toplevel_icon_v1' object. + The icon must still remain set on every toplevel it was assigned to, + until the toplevel icon is reset explicitly. + </description> + </request> + + <request name="set_name"> + <description summary="set an icon name"> + This request assigns an icon name to this icon. + Any previously set name is overridden. + + The compositor must resolve 'icon_name' according to the lookup rules + described in the XDG icon theme specification[1] using the + environment's current icon theme. + + If the compositor does not support icon names or cannot resolve + 'icon_name' according to the XDG icon theme specification it must + fall back to using pixel buffer data instead. + + If this request is made after the icon has been assigned to a toplevel + via 'set_icon', a 'immutable' error must be raised. + + [1]: https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html + </description> + <arg name="icon_name" type="string"/> + </request> + + <request name="add_buffer"> + <description summary="add icon data from a pixel buffer"> + This request adds pixel data supplied as wl_buffer to the icon. + + The client should add pixel data for all icon sizes and scales that + it can provide, or which are explicitly requested by the compositor + via 'icon_size' events on xdg_toplevel_icon_manager_v1. + + The wl_buffer supplying pixel data as 'buffer' must be backed by wl_shm + and must be a square (width and height being equal). + If any of these buffer requirements are not fulfilled, a 'invalid_buffer' + error must be raised. + + If this icon instance already has a buffer of the same size and scale + from a previous 'add_buffer' request, data from the last request + overrides the preexisting pixel data. + + The wl_buffer must be kept alive for as long as the xdg_toplevel_icon + it is associated with is not destroyed. The buffer contents must not be + modified after it was assigned to the icon. + + If this request is made after the icon has been assigned to a toplevel + via 'set_icon', a 'immutable' error must be raised. + </description> + <arg name="buffer" type="object" interface="wl_buffer"/> + <arg name="scale" type="int" + summary="the scaling factor of the icon, e.g. 1"/> + </request> + </interface> +</protocol>