diff --git a/src/interfaces/window.cpp b/src/interfaces/window.cpp index 7fd962f..ffd5afd 100644 --- a/src/interfaces/window.cpp +++ b/src/interfaces/window.cpp @@ -32,6 +32,7 @@ public: Window::KeyboardInteractivity keyboardInteractivity = Window::KeyboardInteractivityOnDemand; Window::Layer layer = Window::LayerTop; QMargins margins; + QSize desiredSize; Window::ScreenConfiguration screenConfiguration = Window::ScreenFromQWindow; bool closeOnDismissed = true; }; @@ -97,6 +98,21 @@ QMargins Window::margins() const return d->margins; } +void Window::setDesiredSize(const QSize &size) +{ + if (size == d->desiredSize) { + return; + } + + d->desiredSize = size; + Q_EMIT desiredSizeChanged(); +} + +QSize Window::desiredSize() const +{ + return d->desiredSize; +} + void Window::setKeyboardInteractivity(KeyboardInteractivity interactivity) { if (d->keyboardInteractivity != interactivity) { diff --git a/src/interfaces/window.h b/src/interfaces/window.h index 389a6df..40a9ca3 100644 --- a/src/interfaces/window.h +++ b/src/interfaces/window.h @@ -86,6 +86,9 @@ public: void setMargins(const QMargins &margins); QMargins margins() const; + void setDesiredSize(const QSize &size); + QSize desiredSize() const; + void setKeyboardInteractivity(KeyboardInteractivity interactivity); KeyboardInteractivity keyboardInteractivity() const; @@ -127,6 +130,7 @@ Q_SIGNALS: void exclusionZoneChanged(); void exclusiveEdgeChanged(); void marginsChanged(); + void desiredSizeChanged(); void keyboardInteractivityChanged(); void layerChanged(); diff --git a/src/qwaylandlayersurface.cpp b/src/qwaylandlayersurface.cpp index c03de35..170482e 100644 --- a/src/qwaylandlayersurface.cpp +++ b/src/qwaylandlayersurface.cpp @@ -44,7 +44,7 @@ QWaylandLayerSurface::QWaylandLayerSurface(QWaylandLayerShellIntegration *shell, setAnchor(m_interface->anchors()); connect(m_interface, &Window::anchorsChanged, this, [this]() { setAnchor(m_interface->anchors()); - setDesiredSize(m_window->windowContentGeometry().size()); + m_interface->setDesiredSize(m_window->windowContentGeometry().size()); }); setExclusiveZone(m_interface->exclusionZone()); @@ -61,12 +61,17 @@ QWaylandLayerSurface::QWaylandLayerSurface(QWaylandLayerShellIntegration *shell, setMargins(m_interface->margins()); }); + // setDesiredSize is called only by this connection, everywhere else we use m_interface->setDesiredSize() + connect(m_interface, &Window::desiredSizeChanged, this, [this]() { + setDesiredSize(m_interface->desiredSize()); + }); + setKeyboardInteractivity(m_interface->keyboardInteractivity()); connect(m_interface, &Window::keyboardInteractivityChanged, this, [this]() { setKeyboardInteractivity(m_interface->keyboardInteractivity()); }); - setDesiredSize(window->windowContentGeometry().size()); + m_interface->setDesiredSize(window->windowContentGeometry().size()); } QWaylandLayerSurface::~QWaylandLayerSurface() @@ -132,6 +137,8 @@ void QWaylandLayerSurface::setDesiredSize(const QSize &size) effectiveSize.setHeight(0); } set_size(effectiveSize.width(), effectiveSize.height()); + + m_window->window()->requestUpdate(); } void QWaylandLayerSurface::setAnchor(uint anchor) @@ -174,12 +181,12 @@ void QWaylandLayerSurface::setWindowGeometry(const QRect &geometry) return; } - setDesiredSize(geometry.size()); + m_interface->setDesiredSize(geometry.size()); } #else void QWaylandLayerSurface::setWindowSize(const QSize &size) { - setDesiredSize(size); + m_interface->setDesiredSize(size); } #endif diff --git a/src/qwaylandlayersurface_p.h b/src/qwaylandlayersurface_p.h index 079a295..cd9bb03 100644 --- a/src/qwaylandlayersurface_p.h +++ b/src/qwaylandlayersurface_p.h @@ -34,7 +34,6 @@ public: } void attachPopup(QtWaylandClient::QWaylandShellSurface *popup) override; - void setDesiredSize(const QSize &size); void setAnchor(uint32_t anchor); void setExclusiveZone(int32_t zone); void setExclusiveEdge(uint32_t edge); @@ -54,6 +53,7 @@ public: void requestXdgActivationToken(quint32 serial) override; private: + void setDesiredSize(const QSize &size); void sendExpose(); void zwlr_layer_surface_v1_configure(uint32_t serial, uint32_t width, uint32_t height) override; void zwlr_layer_surface_v1_closed() override;