Window: Ensure we integrate windows that were already were shown in a different shell

This commit is contained in:
Aleix Pol
2025-09-11 00:57:44 +02:00
parent cb79d3f60a
commit b9e1260949
2 changed files with 33 additions and 17 deletions

View File

@ -9,6 +9,7 @@
#include <layershellqt_logging.h>
#include <QPlatformSurfaceEvent>
#include <QPointer>
#include <optional>
@ -187,6 +188,13 @@ Window::Window(QWindow *window)
{
s_map.insert(d->parentWindow, this);
window->installEventFilter(this);
if (window->isVisible()) {
qCWarning(LAYERSHELLQT) << d->parentWindow << "already has a shell integration. Call QWindow::close() first and show it again.";
}
if (window->handle()) {
initializeShell();
}
}
bool Window::eventFilter(QObject *watched, QEvent *event)
@ -196,28 +204,34 @@ bool Window::eventFilter(QObject *watched, QEvent *event)
return false;
}
if (event->type() == QEvent::PlatformSurface) {
auto waylandWindow = dynamic_cast<QtWaylandClient::QWaylandWindow *>(window->handle());
if (!waylandWindow) {
qCWarning(LAYERSHELLQT) << window << "is not a wayland window. Not creating zwlr_layer_surface";
return false;
if (auto pse = static_cast<QPlatformSurfaceEvent *>(event); pse->surfaceEventType() == QPlatformSurfaceEvent::SurfaceCreated) {
initializeShell();
}
static QWaylandLayerShellIntegration *shellIntegration = nullptr;
if (!shellIntegration) {
shellIntegration = new QWaylandLayerShellIntegration();
if (!shellIntegration->initialize(waylandWindow->display())) {
delete shellIntegration;
shellIntegration = nullptr;
qCWarning(LAYERSHELLQT)
<< "Failed to initialize layer-shell integration, possibly because compositor does not support the layer-shell protocol";
return false;
}
}
waylandWindow->setShellIntegration(shellIntegration);
}
return false;
}
void Window::initializeShell()
{
auto waylandWindow = dynamic_cast<QtWaylandClient::QWaylandWindow *>(d->parentWindow->handle());
if (!waylandWindow) {
qCWarning(LAYERSHELLQT) << d->parentWindow << "is not a wayland window. Not creating zwlr_layer_surface";
return;
}
static QWaylandLayerShellIntegration *shellIntegration = nullptr;
if (!shellIntegration) {
shellIntegration = new QWaylandLayerShellIntegration();
if (!shellIntegration->initialize(waylandWindow->display())) {
delete shellIntegration;
shellIntegration = nullptr;
qCWarning(LAYERSHELLQT) << "Failed to initialize layer-shell integration, possibly because compositor does not support the layer-shell protocol";
return;
}
}
waylandWindow->setShellIntegration(shellIntegration);
}
Window *Window::get(QWindow *window)
{
if (!window) {

View File

@ -150,6 +150,8 @@ Q_SIGNALS:
void layerChanged();
private:
void initializeShell();
Window(QWindow *window);
QScopedPointer<WindowPrivate> d;
};