layer-shell: add v5 support

master
Kirill Primak 5 months ago committed by Alexander Orzechowski
parent e88988e364
commit 270e6f4ebb

@ -49,6 +49,7 @@ enum wlr_layer_surface_v1_state_field {
WLR_LAYER_SURFACE_V1_STATE_MARGIN = 1 << 3,
WLR_LAYER_SURFACE_V1_STATE_KEYBOARD_INTERACTIVITY = 1 << 4,
WLR_LAYER_SURFACE_V1_STATE_LAYER = 1 << 5,
WLR_LAYER_SURFACE_V1_STATE_EXCLUSIVE_EDGE = 1 << 6,
};
struct wlr_layer_surface_v1_state {
@ -62,6 +63,7 @@ struct wlr_layer_surface_v1_state {
enum zwlr_layer_surface_v1_keyboard_interactivity keyboard_interactive;
uint32_t desired_width, desired_height;
enum zwlr_layer_shell_v1_layer layer;
uint32_t exclusive_edge;
uint32_t configure_serial;
uint32_t actual_width, actual_height;

@ -25,7 +25,7 @@
THIS SOFTWARE.
</copyright>
<interface name="zwlr_layer_shell_v1" version="4">
<interface name="zwlr_layer_shell_v1" version="5">
<description summary="create surfaces that are layers of the desktop">
Clients can use this interface to assign the surface_layer role to
wl_surfaces. Such surfaces are assigned to a "layer" of the output and
@ -100,7 +100,7 @@
</request>
</interface>
<interface name="zwlr_layer_surface_v1" version="4">
<interface name="zwlr_layer_surface_v1" version="5">
<description summary="layer metadata interface">
An interface that may be implemented by a wl_surface, for surfaces that
are designed to be rendered as a layer of a stacked desktop-like
@ -367,6 +367,7 @@
<entry name="invalid_size" value="1" summary="size is invalid"/>
<entry name="invalid_anchor" value="2" summary="anchor bitfield is invalid"/>
<entry name="invalid_keyboard_interactivity" value="3" summary="keyboard interactivity is invalid"/>
<entry name="invalid_exclusive_edge" value="4" summary="exclusive edge is invalid given the surface anchors"/>
</enum>
<enum name="anchor" bitfield="true">
@ -386,5 +387,21 @@
</description>
<arg name="layer" type="uint" enum="zwlr_layer_shell_v1.layer" summary="layer to move this surface to"/>
</request>
<!-- Version 5 additions -->
<request name="set_exclusive_edge" since="5">
<description summary="set the edge the exclusive zone will be applied to">
Requests an edge for the exclusive zone to apply. The exclusive
edge will be automatically deduced from anchor points when possible,
but when the surface is anchored to a corner, it will be necessary
to set it explicitly to disambiguate, as it is not possible to deduce
which one of the two corner edges should be used.
The edge must be one the surface is anchored to, otherwise the
invalid_exclusive_edge protocol error will be raised.
</description>
<arg name="edge" type="uint" enum="anchor"/>
</request>
</interface>
</protocol>

@ -11,7 +11,7 @@
// Note: zwlr_layer_surface_v1 becomes inert on wlr_layer_surface_v1_destroy()
#define LAYER_SHELL_VERSION 4
#define LAYER_SHELL_VERSION 5
static void resource_handle_destroy(struct wl_client *client,
struct wl_resource *resource) {
@ -264,6 +264,7 @@ static void layer_surface_set_layer(struct wl_client *client,
return;
}
if (layer > ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY) {
// XXX: this sends a zwlr_layer_shell_v1 error to a zwlr_layer_surface_v1 object
wl_resource_post_error(surface->resource,
ZWLR_LAYER_SHELL_V1_ERROR_INVALID_LAYER,
"Invalid layer %" PRIu32, layer);
@ -278,6 +279,31 @@ static void layer_surface_set_layer(struct wl_client *client,
surface->pending.layer = layer;
}
static void layer_surface_set_exclusive_edge(struct wl_client *client,
struct wl_resource *surface_resource, uint32_t edge) {
struct wlr_layer_surface_v1 *surface =
wlr_layer_surface_v1_from_resource(surface_resource);
if (!surface) {
return;
}
switch (edge) {
case 0:
case ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP:
case ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM:
case ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT:
case ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT:
break;
default:
wl_resource_post_error(surface->resource,
ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_EXCLUSIVE_EDGE,
"invalid exclusive edge %" PRIu32, edge);
return;
}
surface->pending.committed |= WLR_LAYER_SURFACE_V1_STATE_EXCLUSIVE_EDGE;
surface->pending.exclusive_edge = edge;
}
static const struct zwlr_layer_surface_v1_interface layer_surface_implementation = {
.destroy = resource_handle_destroy,
.ack_configure = layer_surface_handle_ack_configure,
@ -288,6 +314,7 @@ static const struct zwlr_layer_surface_v1_interface layer_surface_implementation
.set_keyboard_interactivity = layer_surface_handle_set_keyboard_interactivity,
.get_popup = layer_surface_handle_get_popup,
.set_layer = layer_surface_set_layer,
.set_exclusive_edge = layer_surface_set_exclusive_edge,
};
uint32_t wlr_layer_surface_v1_configure(struct wlr_layer_surface_v1 *surface,
@ -336,10 +363,11 @@ static void layer_surface_role_client_commit(struct wlr_surface *wlr_surface) {
return;
}
uint32_t anchor = surface->pending.anchor;
const uint32_t horiz = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT |
ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT;
if (surface->pending.desired_width == 0 &&
(surface->pending.anchor & horiz) != horiz) {
if (surface->pending.desired_width == 0 && (anchor & horiz) != horiz) {
wlr_surface_reject_pending(wlr_surface, surface->resource,
ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_SIZE,
"width 0 requested without setting left and right anchors");
@ -348,13 +376,18 @@ static void layer_surface_role_client_commit(struct wlr_surface *wlr_surface) {
const uint32_t vert = ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP |
ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM;
if (surface->pending.desired_height == 0 &&
(surface->pending.anchor & vert) != vert) {
if (surface->pending.desired_height == 0 && (anchor & vert) != vert) {
wlr_surface_reject_pending(wlr_surface, surface->resource,
ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_SIZE,
"height 0 requested without setting top and bottom anchors");
return;
}
if ((anchor & surface->pending.exclusive_edge) != surface->pending.exclusive_edge) {
wlr_surface_reject_pending(wlr_surface, surface->resource,
ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_EXCLUSIVE_EDGE,
"exclusive edge is invalid given the surface anchors");
}
}
static void layer_surface_role_commit(struct wlr_surface *wlr_surface) {

Loading…
Cancel
Save