diff --git a/layers.cpp b/layers.cpp index fc7695e86f..d8328ccafd 100644 --- a/layers.cpp +++ b/layers.cpp @@ -92,6 +92,10 @@ along with this program. If not, see . #include "effects.h" #include "composite.h" #include "screenedge.h" +#if HAVE_WAYLAND +#include "shell_client.h" +#include "wayland_server.h" +#endif #include @@ -688,6 +692,14 @@ ToplevelList Workspace::xStackingOrder() const } } } +#if HAVE_WAYLAND + if (waylandServer()) { + const auto clients = waylandServer()->internalClients(); + for (auto c: clients) { + x_stacking << c; + } + } +#endif if (m_compositor) { const_cast< Workspace* >(this)->m_compositor->checkUnredirect(); } diff --git a/wayland_server.cpp b/wayland_server.cpp index 16eda82570..2d19525195 100644 --- a/wayland_server.cpp +++ b/wayland_server.cpp @@ -116,7 +116,11 @@ void WaylandServer::init(const QByteArray &socketName) if (auto c = Compositor::self()) { connect(client, &Toplevel::needsRepaint, c, &Compositor::scheduleRepaint); } - m_clients << client; + if (client->isInternal()) { + m_internalClients << client; + } else { + m_clients << client; + } emit shellClientAdded(client); } ); @@ -209,6 +213,7 @@ void WaylandServer::uninstallBackend(AbstractBackend *backend) void WaylandServer::removeClient(ShellClient *c) { m_clients.removeAll(c); + m_internalClients.removeAll(c); emit shellClientRemoved(c); } @@ -261,20 +266,31 @@ void WaylandServer::dispatch() m_display->dispatchEvents(0); } +static ShellClient *findClientInList(const QList &clients, quint32 id) +{ + auto it = std::find_if(clients.begin(), clients.end(), + [id] (ShellClient *c) { + return c->windowId() == id; + } + ); + if (it == clients.end()) { + return nullptr; + } + return *it; +} + ShellClient *WaylandServer::findClient(quint32 id) const { if (id == 0) { return nullptr; } - auto it = std::find_if(m_clients.constBegin(), m_clients.constEnd(), - [id] (ShellClient *c) { - return c->windowId() == id; - } - ); - if (it == m_clients.constEnd()) { - return nullptr; + if (ShellClient *c = findClientInList(m_clients, id)) { + return c; } - return *it; + if (ShellClient *c = findClientInList(m_internalClients, id)) { + return c; + } + return nullptr; } quint32 WaylandServer::createWindowId(SurfaceInterface *surface) diff --git a/wayland_server.h b/wayland_server.h index 980cc32edf..ebb32db804 100644 --- a/wayland_server.h +++ b/wayland_server.h @@ -75,6 +75,9 @@ public: QList clients() const { return m_clients; } + QList internalClients() const { + return m_internalClients; + } void removeClient(ShellClient *c); ShellClient *findClient(quint32 id) const; @@ -136,6 +139,7 @@ private: } m_internalConnection; AbstractBackend *m_backend = nullptr; QList m_clients; + QList m_internalClients; QScopedPointer m_dummyWindow; KWayland::Client::Surface *m_dummyWindowSurface = nullptr; QHash m_clientIds; diff --git a/workspace.cpp b/workspace.cpp index 8f9e70acbe..a0b9da9013 100644 --- a/workspace.cpp +++ b/workspace.cpp @@ -378,10 +378,12 @@ void Workspace::init() if (auto w = waylandServer()) { connect(w, &WaylandServer::shellClientAdded, this, [this] (ShellClient *c) { - if (!unconstrained_stacking_order.contains(c)) - unconstrained_stacking_order.append(c); // Raise if it hasn't got any stacking position yet - if (!stacking_order.contains(c)) // It'll be updated later, and updateToolWindows() requires - stacking_order.append(c); // c to be in stacking_order + if (!c->isInternal()) { + if (!unconstrained_stacking_order.contains(c)) + unconstrained_stacking_order.append(c); // Raise if it hasn't got any stacking position yet + if (!stacking_order.contains(c)) // It'll be updated later, and updateToolWindows() requires + stacking_order.append(c); // c to be in stacking_order + } x_stacking_dirty = true; updateStackingOrder(true); }