From 7d1fb40d074a90d38839f5956b0501354f3f839c Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Thu, 8 Dec 2022 12:04:35 +0200 Subject: [PATCH] Port to QWaylandWindow::setShellIntegration() With QWaylandWindow::setShellIntegration(), it's possible to use xdg-shell and layer-shell protocols in the same process. It's important for plasmashell, where we want to use the layer shell protocol for special surfaces such as the desktop background, and the xdg shell protocol for dialogs. In order to make a QWindow use the layer shell protocol, you need to call LayerShellQt::Window::get() before the window is mapped. --- CMakeLists.txt | 2 +- src/interfaces/window.cpp | 11 +++++++++++ src/qwaylandlayershell.cpp | 11 ++++------- src/qwaylandlayershell_p.h | 11 ++++------- src/qwaylandlayershellintegration.cpp | 20 +++++--------------- src/qwaylandlayershellintegration_p.h | 2 -- src/qwaylandlayersurface.cpp | 2 +- tests/main.cpp | 9 ++++++--- 8 files changed, 32 insertions(+), 36 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 28522a8..e985bb1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,7 @@ set(PROJECT_VERSION_MAJOR 5) set(CMAKE_C_STANDARD 99) -set(QT_MIN_VERSION "6.4.0") +set(QT_MIN_VERSION "6.5.0") set(KF6_MIN_VERSION "5.240.0") set(KDE_COMPILERSETTINGS_LEVEL "5.82") diff --git a/src/interfaces/window.cpp b/src/interfaces/window.cpp index 7aa39f4..1ae037e 100644 --- a/src/interfaces/window.cpp +++ b/src/interfaces/window.cpp @@ -5,11 +5,15 @@ */ #include "window.h" +#include "../qwaylandlayershellintegration_p.h" + #include #include #include +#include + using namespace LayerShellQt; class LayerShellQt::WindowPrivate @@ -122,6 +126,13 @@ Window::Window(QWindow *window) , d(new WindowPrivate(window)) { s_map.insert(d->parentWindow, this); + + window->create(); + + if (auto waylandWindow = dynamic_cast(window->handle())) { + static QWaylandLayerShellIntegration integration; + waylandWindow->setShellIntegration(&integration); + } } Window *Window::get(QWindow *window) diff --git a/src/qwaylandlayershell.cpp b/src/qwaylandlayershell.cpp index 9c54abb..62e9251 100644 --- a/src/qwaylandlayershell.cpp +++ b/src/qwaylandlayershell.cpp @@ -10,9 +10,11 @@ namespace LayerShellQt { -QWaylandLayerShell::QWaylandLayerShell(::wl_registry *registry, uint32_t id, uint32_t version) - : QtWayland::zwlr_layer_shell_v1(registry, id, version) +QWaylandLayerShell::QWaylandLayerShell() + : QWaylandClientExtensionTemplate(4) + , QtWayland::zwlr_layer_shell_v1() { + initialize(); } QWaylandLayerShell::~QWaylandLayerShell() @@ -21,9 +23,4 @@ QWaylandLayerShell::~QWaylandLayerShell() zwlr_layer_shell_v1_destroy(object()); } -QWaylandLayerSurface *QWaylandLayerShell::createLayerSurface(QtWaylandClient::QWaylandWindow *window) -{ - return new QWaylandLayerSurface(this, window); -} - } diff --git a/src/qwaylandlayershell_p.h b/src/qwaylandlayershell_p.h index 135b388..800e1bd 100644 --- a/src/qwaylandlayershell_p.h +++ b/src/qwaylandlayershell_p.h @@ -8,23 +8,20 @@ #ifndef _LAYERSHELL_H #define _LAYERSHELL_H +#include "layershellqt_export.h" + #include #include #include -#include "qwaylandlayersurface_p.h" - namespace LayerShellQt { -class LAYERSHELLQT_EXPORT QWaylandLayerShell : public QtWayland::zwlr_layer_shell_v1 +class LAYERSHELLQT_EXPORT QWaylandLayerShell : public QWaylandClientExtensionTemplate, public QtWayland::zwlr_layer_shell_v1 { public: - QWaylandLayerShell(::wl_registry *registry, uint32_t id, uint32_t version); + QWaylandLayerShell(); ~QWaylandLayerShell() override; - - QWaylandLayerSurface *createLayerSurface(QtWaylandClient::QWaylandWindow *window); - // TODO: Popups }; } diff --git a/src/qwaylandlayershellintegration.cpp b/src/qwaylandlayershellintegration.cpp index ada426f..58f4a50 100644 --- a/src/qwaylandlayershellintegration.cpp +++ b/src/qwaylandlayershellintegration.cpp @@ -7,6 +7,7 @@ #include "qwaylandlayershell_p.h" #include "qwaylandlayershellintegration_p.h" +#include "qwaylandlayersurface_p.h" #include #include @@ -15,6 +16,7 @@ namespace LayerShellQt { QWaylandLayerShellIntegration::QWaylandLayerShellIntegration() + : m_layerShell(new QWaylandLayerShell()) { } @@ -24,26 +26,14 @@ QWaylandLayerShellIntegration::~QWaylandLayerShellIntegration() bool QWaylandLayerShellIntegration::initialize(QtWaylandClient::QWaylandDisplay *display) { -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) - QWaylandShellIntegration::initialize(display); -#endif - display->addRegistryListener(registryLayer, this); - return m_layerShell != nullptr; + Q_UNUSED(display) + return m_layerShell->isActive(); } QtWaylandClient::QWaylandShellSurface *QWaylandLayerShellIntegration::createShellSurface(QtWaylandClient::QWaylandWindow *window) { - return m_layerShell->createLayerSurface(window); + return new QWaylandLayerSurface(m_layerShell.get(), window); } -void QWaylandLayerShellIntegration::registryLayer(void *data, struct wl_registry *registry, uint32_t id, const QString &interface, uint32_t version) -{ - QWaylandLayerShellIntegration *shell = static_cast(data); - - if (interface == zwlr_layer_shell_v1_interface.name) - shell->m_layerShell.reset(new QWaylandLayerShell(registry, id, std::min(version, 4u))); -} } - -//#include "qwaylandlayershellintegration.moc" diff --git a/src/qwaylandlayershellintegration_p.h b/src/qwaylandlayershellintegration_p.h index 2df4206..344be31 100644 --- a/src/qwaylandlayershellintegration_p.h +++ b/src/qwaylandlayershellintegration_p.h @@ -27,8 +27,6 @@ public: QtWaylandClient::QWaylandShellSurface *createShellSurface(QtWaylandClient::QWaylandWindow *window) override; private: - static void registryLayer(void *data, struct wl_registry *registry, uint32_t id, const QString &interface, uint32_t version); - QScopedPointer m_layerShell; }; diff --git a/src/qwaylandlayersurface.cpp b/src/qwaylandlayersurface.cpp index dd17aa0..bc70445 100644 --- a/src/qwaylandlayersurface.cpp +++ b/src/qwaylandlayersurface.cpp @@ -5,7 +5,7 @@ * SPDX-License-Identifier: LGPL-3.0-or-later */ -#include "interfaces/shell.h" +#include "interfaces/window.h" #include "layershellqt_logging.h" #include "qwaylandlayershell_p.h" #include "qwaylandlayersurface_p.h" diff --git a/tests/main.cpp b/tests/main.cpp index d6a0517..6d90734 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -14,7 +14,6 @@ #include -#include #include using namespace LayerShellQt; @@ -51,8 +50,6 @@ class BasicWindow : public QRasterWindow int main(int argc, char **argv) { - Shell::useLayerShell(); - QGuiApplication app(argc, argv); const auto layerMetaEnum = QMetaEnum::fromType(); @@ -79,6 +76,8 @@ int main(int argc, char **argv) BasicWindow window; LayerShellQt::Window *layerShell = LayerShellQt::Window::get(&window); + layerShell->setLayer(Window::LayerBottom); + if (parser.isSet(marginsOption)) { int margins = parser.value(marginsOption).toInt(); layerShell->setMargins({margins, margins, margins, margins}); @@ -102,6 +101,10 @@ int main(int argc, char **argv) window.show(); + BasicWindow window2; + window2.resize(400, 400); + window2.show(); + // just so you don't block yourself out whilst testing QTimer::singleShot(5000, &app, &QGuiApplication::quit); return app.exec();