mirror of
https://invent.kde.org/plasma/layer-shell-qt.git
synced 2025-05-25 17:40:21 -04:00
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.
This commit is contained in:
parent
488c6d759c
commit
7d1fb40d07
@ -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")
|
||||
|
||||
|
@ -5,11 +5,15 @@
|
||||
*/
|
||||
|
||||
#include "window.h"
|
||||
#include "../qwaylandlayershellintegration_p.h"
|
||||
|
||||
#include <layershellqt_logging.h>
|
||||
|
||||
#include <QPointer>
|
||||
#include <optional>
|
||||
|
||||
#include <QtWaylandClient/private/qwaylandwindow_p.h>
|
||||
|
||||
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<QtWaylandClient::QWaylandWindow *>(window->handle())) {
|
||||
static QWaylandLayerShellIntegration integration;
|
||||
waylandWindow->setShellIntegration(&integration);
|
||||
}
|
||||
}
|
||||
|
||||
Window *Window::get(QWindow *window)
|
||||
|
@ -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<QWaylandLayerShell>(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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -8,23 +8,20 @@
|
||||
#ifndef _LAYERSHELL_H
|
||||
#define _LAYERSHELL_H
|
||||
|
||||
#include "layershellqt_export.h"
|
||||
|
||||
#include <wayland-client.h>
|
||||
|
||||
#include <QtWaylandClient/private/qwaylandshellintegration_p.h>
|
||||
#include <qwayland-wlr-layer-shell-unstable-v1.h>
|
||||
|
||||
#include "qwaylandlayersurface_p.h"
|
||||
|
||||
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:
|
||||
QWaylandLayerShell(::wl_registry *registry, uint32_t id, uint32_t version);
|
||||
QWaylandLayerShell();
|
||||
~QWaylandLayerShell() override;
|
||||
|
||||
QWaylandLayerSurface *createLayerSurface(QtWaylandClient::QWaylandWindow *window);
|
||||
// TODO: Popups
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -7,6 +7,7 @@
|
||||
|
||||
#include "qwaylandlayershell_p.h"
|
||||
#include "qwaylandlayershellintegration_p.h"
|
||||
#include "qwaylandlayersurface_p.h"
|
||||
|
||||
#include <QtWaylandClient/private/qwaylanddisplay_p.h>
|
||||
#include <QtWaylandClient/private/qwaylandwindow_p.h>
|
||||
@ -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<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"
|
||||
|
@ -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<QWaylandLayerShell> m_layerShell;
|
||||
};
|
||||
|
||||
|
@ -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"
|
||||
|
@ -14,7 +14,6 @@
|
||||
|
||||
#include <QMetaEnum>
|
||||
|
||||
#include <interfaces/shell.h>
|
||||
#include <interfaces/window.h>
|
||||
|
||||
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<Window::Layer>();
|
||||
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user