From c81b755e9710e4f55557593a93d5330b5d101d4f Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Mon, 28 Apr 2025 16:52:17 +0200 Subject: [PATCH] Expose setDesiredSize to the C++ API Making it possible for clients to call setDesiredSize directly, The idea is that under Wayland, the panel calls this intead of setGeometry, not trying to set an abosulute geometry that might cause the panel sized wrongly, but just sets an hint which will ensure the panel won't overlap another one --- src/interfaces/window.cpp | 16 ++++++++++++++++ src/interfaces/window.h | 4 ++++ src/qwaylandlayersurface.cpp | 15 +++++++++++---- src/qwaylandlayersurface_p.h | 2 +- 4 files changed, 32 insertions(+), 5 deletions(-) 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;