| <?xml version="1.0" encoding="UTF-8"?> |
| <protocol name="surface_augmenter"> |
| |
| <copyright> |
| Copyright 2021 The Chromium Authors |
| |
| 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> |
| |
| <interface name="surface_augmenter" version="12"> |
| <description summary="surface composition delegation"> |
| The global interface exposing surface delegated composition |
| capabilities is used to instantiate an interface extension for a |
| wl_surface object. This extended interface will then allow |
| delegated compostion of the surface contents, effectively |
| disconnecting the direct relationship between the buffer and the |
| surface content (adding support for solid quads and rounded corner |
| for instance). |
| </description> |
| |
| <request name="destroy" type="destructor"> |
| <description summary="Destroy the surface augmenter."> |
| Informs the server that the client will not be using this |
| protocol object anymore. This does not affect any other objects, |
| augmenter objects included. |
| </description> |
| </request> |
| |
| <enum name="error"> |
| <entry name="augmented_surface_exists" value="0" |
| summary="the surface already has a augmenter object |
| associated"/> |
| </enum> |
| |
| <request name="create_solid_color_buffer"> |
| <description summary="creates a solid color buffer"> |
| Instantiate a buffer of the given size for the purpose of a solid color |
| quad of a given color. |
| |
| <!-- Version 12 additions --> |
| This buffer does not require resources in the compositor, so it is immediately |
| reusable and shareable. So it is not responsible for sending wl_buffer.release |
| or zwp_linux_buffer_release_v1.*_release events. |
| </description> |
| <arg name="id" type="new_id" interface="wl_buffer"/> |
| <arg name="color" type="array" summary="quad color represented by a SkColor4f"/> |
| <arg name="width" type="int"/> |
| <arg name="height" type="int"/> |
| </request> |
| |
| <request name="get_augmented_surface"> |
| <description summary="extend surface interface for delegation"> |
| Instantiate an interface extension for the given wl_surface to |
| extend composition of its content. If the given wl_surface already has |
| a augmentation object associated, the delegate_exists protocol error is |
| raised. |
| |
| <!-- Version 12 additions --> |
| If needs to be called, this must be called before a surface role object is |
| created. |
| </description> |
| <arg name="id" type="new_id" interface="augmented_surface" |
| summary="the new augmenter interface id"/> |
| <arg name="surface" type="object" interface="wl_surface" |
| summary="the surface"/> |
| </request> |
| |
| <!-- Version 2 additions --> |
| |
| <request name="get_augmented_subsurface" since="2"> |
| <description summary="extend sub surface interface for delegation"> |
| Instantiate an interface extension for the given wl_subsurface to |
| extend composition of its content. If the given wl_subsurface already has |
| a augmentation object associated, the delegate_exists protocol error is |
| raised. |
| </description> |
| <arg name="id" type="new_id" interface="augmented_sub_surface" |
| summary="the new augmenter interface id"/> |
| <arg name="subsurface" type="object" interface="wl_subsurface" |
| summary="the subsurface"/> |
| </request> |
| </interface> |
| |
| <interface name="augmented_surface" version="12"> |
| <description summary="delegate composition of a wl_surface"> |
| An additional interface to a wl_surface object, which allows the |
| client to specify the delegated composition of the surface |
| contents. |
| |
| <!-- Version 12 additions --> |
| This makes the surface an object only used to composite its parent |
| surface. This means the surface will be clipped to the parent bounds, will |
| not receive input events or display enter/leave events, etc. |
| |
| Use wl_subsurface role objects to express which parent surface this will |
| perform delegate composition for. |
| |
| The commits to this surface is assumed to behave synchronized with its |
| parent commits, as a synchronized wl_subsurface would. |
| |
| The compositor does not perform fine-grained damage extension calculation |
| that is introduced by an augmented_surface moving, resizing, changing |
| stacking, or disappearing. A client performing such operations should |
| account for it and damage the parent non-augmented wl_surface accordingly. |
| |
| Various changes like adding or removing an augmented sub-surface, changing |
| its position or stacking order, will not introduce extra damage on the |
| compositor side. The parent wl_surface should account for the extra damage |
| introduced. |
| |
| This surface, using a wl_subsurface role of its parent, cannot be stacked |
| relative to non-augmented sub-surfaces of the parent, but can be stacked |
| relative to other augmented children. Nor can this surface have |
| non-augmented sub-surface children. |
| |
| A mixed tree structure of using augmented_surfaces to delegate composite |
| wl_surfaces would look like this: |
| |
| wl_surface@1:{ augmented_surface@1,2,3 } |
| / \_____ |
| / \ |
| wl_surface@2: wl_surface@3: |
| { augmented_surface@4,5 } { augmented_surface@6 } |
| |
| Every wl_surface has a list of augmented_surfaces. Assuming the |
| wl_surface stacking order, from bottom to top, is: |
| wl_surface@1, wl_surface@2, wl_surface@3 |
| |
| Then the final composition order, from bottom to top, is: |
| wl_surface@1, augmented_surface@1,2,3, wl_surface@2, augmented_surface@4,5, |
| wl_surface@3, augmented_surface@6 |
| </description> |
| <request name="destroy" type="destructor"> |
| <description summary="remove delegated composition of the surface"> |
| Client will no longer be able to control the delegated composition properties |
| of this surface. This does not change the existing delegated composition |
| behavior. |
| </description> |
| </request> |
| |
| <enum name="error"> |
| <entry name="bad_value" value="0" |
| summary="negative values in radius or size"/> |
| <entry name="no_surface" value="1" |
| summary="the wl_surface was destroyed"/> |
| <entry name="bad_surface" value="2" |
| summary="incompatible surface"/> |
| </enum> |
| |
| <request name="set_rounded_corners"> |
| <!-- Note that this might be moved to a different protocol if there is |
| usage for it outside of Chrome OS --> |
| <description summary="set the surface rounded corners"> |
| [Deprecated]. Use set_rounded_corners_clip_bounds request below. |
| |
| Informs the server that it must apply the rounded corners |
| mask filter that shall be applied on next commit. Use |
| set_rounded_corners_bounds instead. |
| </description> |
| <arg name="top_left" type="fixed" summary="top left corner"/> |
| <arg name="top_right" type="fixed" summary="top right corner"/> |
| <arg name="bottom_right" type="fixed" summary="bottom right corner"/> |
| <arg name="bottom_left" type="fixed" summary="bottom left corner"/> |
| </request> |
| |
| <!-- Version 2 additions --> |
| |
| <request name="set_destination_size" since="2"> |
| <description summary="set the surface destination viewport size, with subpixel accuracy"> |
| Sets the surface destination viewport size, with subpixel accuracy. |
| This state is double-buffered, and is applied on the next wl_surface.commit. |
| </description> |
| <arg name="width" type="fixed" summary="width of the surface"/> |
| <arg name="height" type="fixed" summary="height of the surface"/> |
| </request> |
| |
| <request name="set_rounded_clip_bounds" since="2"> |
| <!-- Note that this might be moved to a different protocol if there is |
| usage for it outside of Chrome OS --> |
| <description summary="set the surface rounded clip bounds"> |
| [Deprecated]. Use set_rounded_corners_clip_bounds request below. |
| |
| Informs the server that it must apply the rounded clipping mask filter |
| that shall be applied on next commit. The mask can be uniform for |
| several surfaces and applied uniformally so that two or more |
| surfaces visually look as a single surface with rounded corners. |
| Please note this is can only be used on surfaces that are used as |
| overlays, which must not have any subtrees. The rounding will be |
| ignored if the bounds are outside of the surface. |
| </description> |
| <arg name="x" type="int"/> |
| <arg name="y" type="int"/> |
| <arg name="width" type="int"/> |
| <arg name="height" type="int"/> |
| <arg name="top_left" type="fixed" summary="top left corner"/> |
| <arg name="top_right" type="fixed" summary="top right corner"/> |
| <arg name="bottom_right" type="fixed" summary="bottom right corner"/> |
| <arg name="bottom_left" type="fixed" summary="bottom left corner"/> |
| </request> |
| |
| <!-- Version 3 additions --> |
| |
| <request name="set_background_color" since="3"> |
| <description summary="sets a background color of this surface"> |
| Sets a background color of a this surface. This information will be |
| associated with the next buffer commit. Please note this is different |
| from solid color buffers, which creates a new buffer instance, and |
| rather provides additional information how the buffer should be |
| composited. Passing empty array means the background color is reset. |
| The default value is determined by the Wayland compositor then. |
| </description> |
| <arg name="color" type="array" |
| summary="overlay color represented by a SkColor4f"/> |
| </request> |
| |
| <!-- Version 6 additions --> |
| |
| <request name="set_trusted_damage" since="6"> |
| <description summary="sets the trusted damage state of this surface"> |
| [Deprecated] When set, this surface trusts all damage reported to this |
| surface and descendant sub-surfaces is accurate, and will not try to |
| recompute it. If not set, various changes like adding or removing a |
| sub-surface, changing its position or stacking order, can cause full |
| damage on this surface. |
| |
| The initial state is disabled. |
| </description> |
| <arg name="enabled" type="int"/> |
| </request> |
| |
| <!-- Version 7 additions --> |
| |
| <request name="set_rounded_corners_clip_bounds" since="7"> |
| <!-- Note that this might be moved to a different protocol if there is |
| usage for it outside of Chrome OS --> |
| <description summary="set the surface rounded corners clip bounds"> |
| Informs the server that it must apply the rounded clipping mask filter |
| that shall be applied on next commit. The mask can be uniform for |
| several surfaces and applied uniformally so that two or more |
| surfaces visually look as a single surface with rounded corners. |
| |
| Since version 9, the bounds will be placed with its origin (top left |
| corner pixel) at the location x, y of the surface local coordinate |
| system. On version 8 or before, it is placed with its root surface |
| coordinates, but this is deperecated. |
| |
| Please note this is can only be used on surfaces that are used as |
| overlays, which must not have any subtrees. The rounding will be |
| ignored if the bounds are outside of the surface. |
| </description> |
| <arg name="x" type="fixed"/> |
| <arg name="y" type="fixed"/> |
| <arg name="width" type="fixed"/> |
| <arg name="height" type="fixed"/> |
| <arg name="top_left" type="fixed" summary="top left corner"/> |
| <arg name="top_right" type="fixed" summary="top right corner"/> |
| <arg name="bottom_right" type="fixed" summary="bottom right corner"/> |
| <arg name="bottom_left" type="fixed" summary="bottom left corner"/> |
| </request> |
| |
| <!-- Version 8 additions --> |
| |
| <request name="set_clip_rect" since="8"> |
| <description summary="sets a subsurface clip rect on surface local coordinates"> |
| This schedules a clip rect to be applied when drawing this sub-surface. |
| The clip will be placed with its origin (top left corner pixel) at the |
| location x, y of the surface local coordinate system. The coordinates are not |
| restricted to the surface area. Negative x and y values are allowed. |
| |
| If all of x, y, width and height are -1.0, the clip rect is unset instead. |
| |
| Initially, surfaces have no clip set. |
| This state is double-buffered, and is applied on the next wl_surface.commit. |
| </description> |
| <arg name="x" type="fixed" summary="x coordinate in the surface local coordinates"/> |
| <arg name="y" type="fixed" summary="y coordinate in the surface local coordinates"/> |
| <arg name="width" type="fixed" summary="width of the clip rect"/> |
| <arg name="height" type="fixed" summary="height of the clip rect"/> |
| </request> |
| |
| <!-- Version 9 additions --> |
| |
| <!-- |
| This version updates `set_rounded_corners_clip_bounds` behavior. |
| No protocol is added for this version. |
| --> |
| |
| <!-- Version 10 additions --> |
| |
| <!-- |
| This version updates the inner implementation of surface coordinate. |
| No protocol is added for this version. |
| --> |
| |
| <!-- Version 11 additions --> |
| <request name="set_frame_trace_id" since="11"> |
| <description summary="sets a trace ID for tracking frame submission flow"> |
| This sets a trace ID to connect the frame submission trace event flow at |
| the client and the server side. |
| This state is double-buffered, and is applied on the next |
| wl_surface.commit. |
| </description> |
| <arg name="id_hi" type="uint" summary="high 32 bits of the trace ID"/> |
| <arg name="id_lo" type="uint" summary="low 32 bits of the trace ID"/> |
| </request> |
| |
| </interface> |
| |
| <interface name="augmented_sub_surface" version="5"> |
| <description summary="delegate composition of a wl_subsurface"> |
| An additional interface to a wl_subsurface object, which allows the |
| client to specify the delegated composition of the surface |
| contents. |
| </description> |
| <request name="destroy" type="destructor"> |
| <description summary="remove delegated composition of the surface"> |
| The associated wl_surface's augmenter is removed. |
| The change is applied on the next wl_surface.commit. |
| </description> |
| </request> |
| <request name="set_position"> |
| <description summary="sets a subsurface position with subpixel accuracy"> |
| This schedules a sub-surface position change. |
| The sub-surface will be moved so that its origin (top left |
| corner pixel) will be at the location x, y of the parent surface |
| coordinate system. The coordinates are not restricted to the parent |
| surface area. Negative values are allowed. |
| |
| The scheduled coordinates will take effect whenever the state of the |
| parent surface is applied. When this happens depends on whether the |
| parent surface is in synchronized mode or not. See |
| wl_subsurface.set_sync and wl_subsurface.set_desync for details. |
| |
| If more than one set_position request is invoked by the client before |
| the commit of the parent surface, the position of a new request always |
| replaces the scheduled position from any previous request. |
| |
| The initial position is 0, 0. |
| This state is double-buffered, and is applied on the next wl_surface.commit. |
| </description> |
| <arg name="x" type="fixed" summary="x coordinate in the parent surface"/> |
| <arg name="y" type="fixed" summary="y coordinate in the parent surface"/> |
| </request> |
| <request name="set_clip_rect" since="4"> |
| <description summary="sets a subsurface clip rect with subpixel accuracy"> |
| [Deprecated] Use set_clip_rect on augmented_surface instead. |
| This schedules a clip rect to be applied when drawing this sub-surface. |
| The clip will be placed with its origin (top left corner pixel) at the |
| location x, y of the parent surface coordinate system. The coordinates are not |
| restricted to the parent surface area. Negative x and y values are allowed. |
| |
| If all of x, y, width and height are -1.0, the clip rect is unset instead. |
| |
| Initially, surfaces have no clip set. |
| This state is double-buffered, and is applied on the next wl_surface.commit. |
| </description> |
| <arg name="x" type="fixed" summary="x coordinate in the parent surface"/> |
| <arg name="y" type="fixed" summary="y coordinate in the parent surface"/> |
| <arg name="width" type="fixed" summary="width of the clip rect"/> |
| <arg name="height" type="fixed" summary="height of the clip rect"/> |
| </request> |
| <request name="set_transform" since="5"> |
| <description summary="sets a subsurface transform as an affine matrix"> |
| This schedules a transform to be applied when drawing this sub-surface. |
| This transform does not apply to any child surfaces of this sub-surface. |
| |
| The matrix should be passed as an array of 6 floats in column major |
| order. An empty array can be sent to set the transform to the identity |
| matrix. |
| |
| The initial transform is identity. |
| This state is double-buffered, and is applied on the next |
| wl_surface.commit. |
| </description> |
| <arg name="matrix" type="array" summary="size 6 affine matrix, or size 0 for identity matrix"/> |
| </request> |
| |
| <enum name="error"> |
| <entry name="invalid_size" value="0" |
| summary="array sent with invalid dimensions"/> |
| </enum> |
| </interface> |
| |
| </protocol> |