17#include "qwayland-server-wlr-layer-shell-unstable-v1.h"
21static const int s_version = 5;
34 struct ::wl_resource *surface_resource,
35 struct ::wl_resource *output_resource,
37 const QString &scope)
override;
43 std::optional<LayerSurfaceV1Interface::Layer>
layer;
98 : QtWaylandServer::zwlr_layer_shell_v1(*display, s_version)
106 wl_resource *surface_resource,
107 wl_resource *output_resource,
109 const QString &scope)
115 wl_resource_post_error(resource->handle, error_already_constructed,
"the wl_surface already has a buffer attached");
119 if (layer > layer_overlay) {
120 wl_resource_post_error(resource->handle, error_invalid_layer,
"invalid layer %d", layer);
126 wl_resource_post_error(resource->handle, error_role,
127 "the wl_surface already has a role assigned %s", role->name().constData());
134 wl_resource *layerSurfaceResource = wl_resource_create(resource->client(), &zwlr_layer_surface_v1_interface, resource->version(),
id);
135 if (!layerSurfaceResource) {
136 wl_resource_post_no_memory(resource->handle);
146 wl_resource_destroy(resource->handle);
184 const uint32_t anchorMask = anchor_top | anchor_left | anchor_right | anchor_bottom;
185 if (anchor > anchorMask) {
186 wl_resource_post_error(resource->handle, error_invalid_anchor,
"invalid anchor %d", anchor);
192 if (anchor & anchor_top) {
196 if (anchor & anchor_right) {
200 if (anchor & anchor_bottom) {
204 if (anchor & anchor_left) {
213 }
else if (edge == anchor_top) {
215 }
else if (edge == anchor_right) {
217 }
else if (edge == anchor_bottom) {
219 }
else if (edge == anchor_left) {
222 wl_resource_post_error(resource->handle, error_invalid_exclusive_edge,
"Invalid exclusive edge: %d", edge);
247 wl_resource_post_error(resource->handle, error_invalid_surface_state,
"xdg_popup surface is already configured");
257 wl_resource_post_error(resource->handle, error_invalid_surface_state,
"invalid configure serial %d", serial);
262 if (head == serial) {
273 wl_resource_destroy(resource->handle);
278 if (Q_UNLIKELY(layer > LayerShellV1InterfacePrivate::layer_overlay)) {
279 wl_resource_post_error(resource->handle, LayerShellV1InterfacePrivate::error_invalid_layer,
"invalid layer %d", layer);
296 wl_resource_post_error(resource()->handle,
297 error_invalid_surface_state,
298 "a buffer has been attached to a layer surface prior "
299 "to the first layer_surface.configure event");
305 if (!(anchor & Qt::LeftEdge) || !(anchor & Qt::RightEdge)) {
306 wl_resource_post_error(resource()->handle,
308 "the layer surface has a width of 0 but its anchor "
309 "doesn't include the left and the right screen edge");
316 if (!(anchor & Qt::TopEdge) || !(anchor & Qt::BottomEdge)) {
317 wl_resource_post_error(resource()->handle,
319 "the layer surface has a height of 0 but its anchor "
320 "doesn't include the top and the bottom screen edge");
328 if (exclusiveEdge && !(exclusiveEdge & anchor)) {
329 wl_resource_post_error(resource()->handle, error_invalid_exclusive_edge,
"Exclusive edge is not of the anchors");
350 if (commit->
layer.has_value()) {
353 if (commit->
anchor.has_value()) {
356 if (commit->
margins.has_value()) {
397 const QString &scope,
398 wl_resource *resource)
401 d->state.layer =
layer;
422 return d->state.committed;
432 return d->state.anchor;
437 return d->state.desiredSize;
442 return d->state.acceptsFocus;
447 return d->state.layer;
452 return d->state.margins;
457 return d->state.margins.left();
462 return d->state.margins.top();
467 return d->state.margins.right();
472 return d->state.margins.bottom();
477 return d->state.exclusiveZone;
486 if (d->state.exclusiveEdge) {
487 return d->state.exclusiveEdge;
490 if (
anchor() == (Qt::LeftEdge | Qt::TopEdge | Qt::RightEdge) ||
anchor() == Qt::TopEdge) {
493 if (
anchor() == (Qt::TopEdge | Qt::RightEdge | Qt::BottomEdge) ||
anchor() == Qt::RightEdge) {
494 return Qt::RightEdge;
496 if (
anchor() == (Qt::RightEdge | Qt::BottomEdge | Qt::LeftEdge) ||
anchor() == Qt::BottomEdge) {
497 return Qt::BottomEdge;
499 if (
anchor() == (Qt::BottomEdge | Qt::LeftEdge | Qt::TopEdge) ||
anchor() == Qt::LeftEdge) {
517 if (d->state.closed) {
518 qCWarning(KWIN_CORE) <<
"Cannot configure a closed layer shell surface";
522 const uint32_t serial = d->shell->display()->nextSerial();
523 d->state.serials << serial;
525 d->send_configure(serial, size.width(), size.height());
526 d->state.configured =
true;
533 if (!d->state.closed) {
535 d->state.closed =
true;
541#include "moc_layershell_v1.cpp"
Class holding the Wayland server display loop.
LayerShellV1Interface(Display *display, QObject *parent=nullptr)
~LayerShellV1Interface() override
Display * display() const
void surfaceCreated(LayerSurfaceV1Interface *surface)
LayerShellV1InterfacePrivate(LayerShellV1Interface *q, Display *display)
void zwlr_layer_shell_v1_get_layer_surface(Resource *resource, uint32_t id, struct ::wl_resource *surface_resource, struct ::wl_resource *output_resource, uint32_t layer, const QString &scope) override
void zwlr_layer_shell_v1_destroy(Resource *resource) override
LayerShellV1Interface * q
void desiredSizeChanged()
void aboutToBeDestroyed()
int exclusiveZone() const
bool acceptsFocus() const
void acceptsFocusChanged()
LayerSurfaceV1Interface(LayerShellV1Interface *shell, SurfaceInterface *surface, OutputInterface *output, Layer layer, const QString &scope, wl_resource *resource)
Qt::Edge exclusiveEdge() const
void configureAcknowledged(quint32 serial)
static SurfaceRole * role()
void exclusiveZoneChanged()
SurfaceInterface * surface() const
QSize desiredSize() const
~LayerSurfaceV1Interface() override
OutputInterface * output() const
quint32 sendConfigure(const QSize &size)
LayerSurfaceV1Interface * q
void zwlr_layer_surface_v1_set_exclusive_edge(Resource *resource, uint32_t edge) override
void zwlr_layer_surface_v1_set_layer(Resource *resource, uint32_t layer) override
void apply(LayerSurfaceV1Commit *commit) override
LayerSurfaceV1InterfacePrivate(LayerSurfaceV1Interface *q, SurfaceInterface *surface)
void zwlr_layer_surface_v1_ack_configure(Resource *resource, uint32_t serial) override
void zwlr_layer_surface_v1_set_keyboard_interactivity(Resource *resource, uint32_t keyboard_interactivity) override
void zwlr_layer_surface_v1_set_margin(Resource *resource, int32_t top, int32_t right, int32_t bottom, int32_t left) override
LayerShellV1Interface * shell
void zwlr_layer_surface_v1_destroy(Resource *resource) override
void zwlr_layer_surface_v1_set_size(Resource *resource, uint32_t width, uint32_t height) override
void zwlr_layer_surface_v1_set_anchor(Resource *resource, uint32_t anchor) override
void zwlr_layer_surface_v1_set_exclusive_zone(Resource *resource, int32_t zone) override
void zwlr_layer_surface_v1_destroy_resource(Resource *resource) override
QPointer< SurfaceInterface > surface
QPointer< OutputInterface > output
LayerSurfaceV1State state
void zwlr_layer_surface_v1_get_popup(Resource *resource, struct ::wl_resource *popup) override
static OutputInterface * get(wl_resource *native)
QMap< quint32, LayerSurfaceV1Commit > stashed
LayerSurfaceV1Commit pending
Resource representing a wl_surface.
static SurfaceInterface * get(wl_resource *native)
GraphicsBuffer * buffer() const
SurfaceRole * role() const
void setRole(SurfaceRole *role)
std::optional< QMargins > margins
std::optional< int > exclusiveZone
std::optional< QSize > desiredSize
std::optional< Qt::Edges > anchor
std::optional< bool > acceptsFocus
std::optional< LayerSurfaceV1Interface::Layer > layer
std::optional< quint32 > acknowledgedConfigure
std::optional< Qt::Edge > exclusiveEdge
QQueue< quint32 > serials
LayerSurfaceV1Interface::Layer layer