Port to QWaylandWindow::setShellIntegration()

This commit is contained in:
Vlad Zahorodnii 2022-12-08 12:04:35 +02:00
parent 488c6d759c
commit 030df45a0d
8 changed files with 36 additions and 36 deletions

View File

@ -51,7 +51,6 @@ ecm_generate_headers(LayerShellQt_HEADERS
REQUIRED_HEADERS LayerShellQt_HEADERS REQUIRED_HEADERS LayerShellQt_HEADERS
) )
generate_export_header(LayerShellQtInterface generate_export_header(LayerShellQtInterface
BASE_NAME LayerShellQtInterface BASE_NAME LayerShellQtInterface
EXPORT_MACRO_NAME LAYERSHELLQT_EXPORT EXPORT_MACRO_NAME LAYERSHELLQT_EXPORT

View File

@ -5,11 +5,15 @@
*/ */
#include "window.h" #include "window.h"
#include "../qwaylandlayershellintegration_p.h"
#include <layershellqt_logging.h> #include <layershellqt_logging.h>
#include <QPointer> #include <QPointer>
#include <optional> #include <optional>
#include <QtWaylandClient/private/qwaylandwindow_p.h>
using namespace LayerShellQt; using namespace LayerShellQt;
class LayerShellQt::WindowPrivate class LayerShellQt::WindowPrivate
@ -121,6 +125,18 @@ Window::Window(QWindow *window)
: QObject(window) : QObject(window)
, d(new WindowPrivate(window)) , d(new WindowPrivate(window))
{ {
window->winId(); // ensure that the platform window is created
auto waylandWindow = dynamic_cast<QtWaylandClient::QWaylandWindow *>(window->handle());
if (!waylandWindow) {
return;
}
static QWaylandLayerShellIntegration *s_integration = new QWaylandLayerShellIntegration();
if (waylandWindow->shellIntegration() != s_integration) {
waylandWindow->setShellIntegration(s_integration);
}
s_map.insert(d->parentWindow, this); s_map.insert(d->parentWindow, this);
} }

View File

@ -10,9 +10,11 @@
namespace LayerShellQt namespace LayerShellQt
{ {
QWaylandLayerShell::QWaylandLayerShell(::wl_registry *registry, uint32_t id, uint32_t version) QWaylandLayerShell::QWaylandLayerShell()
: QtWayland::zwlr_layer_shell_v1(registry, id, version) : QWaylandClientExtensionTemplate<QWaylandLayerShell>(2)
, QtWayland::zwlr_layer_shell_v1()
{ {
initialize();
} }
QWaylandLayerShell::~QWaylandLayerShell() QWaylandLayerShell::~QWaylandLayerShell()
@ -21,9 +23,4 @@ QWaylandLayerShell::~QWaylandLayerShell()
zwlr_layer_shell_v1_destroy(object()); zwlr_layer_shell_v1_destroy(object());
} }
QWaylandLayerSurface *QWaylandLayerShell::createLayerSurface(QtWaylandClient::QWaylandWindow *window)
{
return new QWaylandLayerSurface(this, window);
}
} }

View File

@ -8,23 +8,20 @@
#ifndef _LAYERSHELL_H #ifndef _LAYERSHELL_H
#define _LAYERSHELL_H #define _LAYERSHELL_H
#include "layershellqt_export.h"
#include <wayland-client.h> #include <wayland-client.h>
#include <QtWaylandClient/private/qwaylandshellintegration_p.h> #include <QtWaylandClient/private/qwaylandshellintegration_p.h>
#include <qwayland-wlr-layer-shell-unstable-v1.h> #include <qwayland-wlr-layer-shell-unstable-v1.h>
#include "qwaylandlayersurface_p.h"
namespace LayerShellQt namespace LayerShellQt
{ {
class LAYERSHELLQT_EXPORT QWaylandLayerShell : public QtWayland::zwlr_layer_shell_v1 class LAYERSHELLQT_EXPORT QWaylandLayerShell : public QWaylandClientExtensionTemplate<QWaylandLayerShell>, public QtWayland::zwlr_layer_shell_v1
{ {
public: public:
QWaylandLayerShell(::wl_registry *registry, uint32_t id, uint32_t version); QWaylandLayerShell();
~QWaylandLayerShell() override; ~QWaylandLayerShell() override;
QWaylandLayerSurface *createLayerSurface(QtWaylandClient::QWaylandWindow *window);
// TODO: Popups
}; };
} }

View File

@ -7,6 +7,7 @@
#include "qwaylandlayershell_p.h" #include "qwaylandlayershell_p.h"
#include "qwaylandlayershellintegration_p.h" #include "qwaylandlayershellintegration_p.h"
#include "qwaylandlayersurface_p.h"
#include <QtWaylandClient/private/qwaylanddisplay_p.h> #include <QtWaylandClient/private/qwaylanddisplay_p.h>
#include <QtWaylandClient/private/qwaylandwindow_p.h> #include <QtWaylandClient/private/qwaylandwindow_p.h>
@ -15,6 +16,7 @@
namespace LayerShellQt namespace LayerShellQt
{ {
QWaylandLayerShellIntegration::QWaylandLayerShellIntegration() QWaylandLayerShellIntegration::QWaylandLayerShellIntegration()
: m_layerShell(new QWaylandLayerShell())
{ {
} }
@ -24,26 +26,14 @@ QWaylandLayerShellIntegration::~QWaylandLayerShellIntegration()
bool QWaylandLayerShellIntegration::initialize(QtWaylandClient::QWaylandDisplay *display) bool QWaylandLayerShellIntegration::initialize(QtWaylandClient::QWaylandDisplay *display)
{ {
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) Q_UNUSED(display)
QWaylandShellIntegration::initialize(display); return m_layerShell->isActive();
#endif
display->addRegistryListener(registryLayer, this);
return m_layerShell != nullptr;
} }
QtWaylandClient::QWaylandShellSurface *QWaylandLayerShellIntegration::createShellSurface(QtWaylandClient::QWaylandWindow *window) 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<QWaylandLayerShellIntegration *>(data);
if (interface == zwlr_layer_shell_v1_interface.name)
shell->m_layerShell.reset(new QWaylandLayerShell(registry, id, std::min(version, 4u)));
}
} }
//#include "qwaylandlayershellintegration.moc"

View File

@ -27,8 +27,6 @@ public:
QtWaylandClient::QWaylandShellSurface *createShellSurface(QtWaylandClient::QWaylandWindow *window) override; QtWaylandClient::QWaylandShellSurface *createShellSurface(QtWaylandClient::QWaylandWindow *window) override;
private: private:
static void registryLayer(void *data, struct wl_registry *registry, uint32_t id, const QString &interface, uint32_t version);
QScopedPointer<QWaylandLayerShell> m_layerShell; QScopedPointer<QWaylandLayerShell> m_layerShell;
}; };

View File

@ -5,7 +5,7 @@
* SPDX-License-Identifier: LGPL-3.0-or-later * SPDX-License-Identifier: LGPL-3.0-or-later
*/ */
#include "interfaces/shell.h" #include "interfaces/window.h"
#include "layershellqt_logging.h" #include "layershellqt_logging.h"
#include "qwaylandlayershell_p.h" #include "qwaylandlayershell_p.h"
#include "qwaylandlayersurface_p.h" #include "qwaylandlayersurface_p.h"

View File

@ -14,7 +14,6 @@
#include <QMetaEnum> #include <QMetaEnum>
#include <interfaces/shell.h>
#include <interfaces/window.h> #include <interfaces/window.h>
using namespace LayerShellQt; using namespace LayerShellQt;
@ -51,8 +50,6 @@ class BasicWindow : public QRasterWindow
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
Shell::useLayerShell();
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
const auto layerMetaEnum = QMetaEnum::fromType<Window::Layer>(); const auto layerMetaEnum = QMetaEnum::fromType<Window::Layer>();
@ -79,6 +76,8 @@ int main(int argc, char **argv)
BasicWindow window; BasicWindow window;
LayerShellQt::Window *layerShell = LayerShellQt::Window::get(&window); LayerShellQt::Window *layerShell = LayerShellQt::Window::get(&window);
layerShell->setLayer(Window::LayerBottom);
if (parser.isSet(marginsOption)) { if (parser.isSet(marginsOption)) {
int margins = parser.value(marginsOption).toInt(); int margins = parser.value(marginsOption).toInt();
layerShell->setMargins({margins, margins, margins, margins}); layerShell->setMargins({margins, margins, margins, margins});
@ -102,6 +101,10 @@ int main(int argc, char **argv)
window.show(); window.show();
BasicWindow window2;
window2.resize(400, 400);
window2.show();
// just so you don't block yourself out whilst testing // just so you don't block yourself out whilst testing
QTimer::singleShot(5000, &app, &QGuiApplication::quit); QTimer::singleShot(5000, &app, &QGuiApplication::quit);
return app.exec(); return app.exec();