diff --git a/shell_client.h b/shell_client.h --- a/shell_client.h +++ b/shell_client.h @@ -61,6 +61,9 @@ KWayland::Server::ShellSurfaceInterface *shellSurface() const { return m_shellSurface; } + KWayland::Server::XdgShellSurfaceInterface *xdgShellSurface() const { + return m_xdgShellSurface; + } void blockActivityUpdates(bool b = true) override; QString caption(bool full = true) const override; diff --git a/wayland_server.h b/wayland_server.h --- a/wayland_server.h +++ b/wayland_server.h @@ -56,6 +56,7 @@ class OutputManagementInterface; class OutputConfigurationInterface; class XdgShellInterface; +class XdgForeignInterface; } } @@ -229,6 +230,7 @@ KWayland::Server::ClientConnection *client = nullptr; QPointer ddi; } m_xclipbaordSync; + KWayland::Server::XdgForeignInterface *m_XdgForeign = nullptr; QList m_clients; QList m_internalClients; QHash m_clientIds; diff --git a/wayland_server.cpp b/wayland_server.cpp --- a/wayland_server.cpp +++ b/wayland_server.cpp @@ -52,6 +52,7 @@ #include #include #include +#include // Qt #include @@ -158,6 +159,24 @@ } else { connect(client, &ShellClient::windowShown, this, &WaylandServer::shellClientShown); } + //client->installXdgForeignInterface(m_XdgForeign); + connect(m_XdgForeign, &KWayland::Server::XdgForeignInterface::transientChanged, client, [this, client](KWayland::Server::SurfaceInterface *child, KWayland::Server::SurfaceInterface *parent) { + ShellClient *childClient = findClient(child); + //we are the parent, child is changed, manage all in this branch + if (findClient(parent) == client) { + if (!childClient || !childClient->xdgShellSurface() || !client->xdgShellSurface()) { + return; + } + if (client && client->surface() == parent) { + childClient->xdgShellSurface()->setTransientFor(client->xdgShellSurface()); + childClient->setModal(true); + } + //we are the child, just manage parent lost in this case + } else if (childClient == client && !parent) { + childClient->xdgShellSurface()->setTransientFor(nullptr); + childClient->setModal(false); + } + }); } bool WaylandServer::init(const QByteArray &socketName, InitalizationFlags flags) @@ -301,6 +320,9 @@ m_display->createSubCompositor(m_display)->create(); + m_XdgForeign = m_display->createXdgForeignUnstableInterface(m_display); + m_XdgForeign->create(); + return true; }