diff --git a/layers.cpp b/layers.cpp index ad81345a25..c4646ffc73 100644 --- a/layers.cpp +++ b/layers.cpp @@ -617,18 +617,21 @@ void Workspace::blockStackingUpdates(bool block) } } -// Ensure list is in stacking order -ClientList Workspace::ensureStackingOrder(const ClientList& list) const +namespace { +template +QList ensureStackingOrderInList(const ToplevelList &stackingOrder, const QList &list) { + static_assert(std::is_base_of::value, + "U must be derived from T"); // TODO Q_ASSERT( block_stacking_updates == 0 ); if (list.count() < 2) return list; // TODO is this worth optimizing? - ClientList result = list; - for (ToplevelList::ConstIterator it = stacking_order.constBegin(); - it != stacking_order.constEnd(); + QList result = list; + for (auto it = stackingOrder.begin(); + it != stackingOrder.end(); ++it) { - Client *c = qobject_cast(*it); + T *c = qobject_cast(*it); if (!c) { continue; } @@ -637,6 +640,18 @@ ClientList Workspace::ensureStackingOrder(const ClientList& list) const } return result; } +} + +// Ensure list is in stacking order +ClientList Workspace::ensureStackingOrder(const ClientList& list) const +{ + return ensureStackingOrderInList(stacking_order, list); +} + +QList Workspace::ensureStackingOrder(const QList &list) const +{ + return ensureStackingOrderInList(stacking_order, list); +} // check whether a transient should be actually kept above its mainwindow // there may be some special cases where this rule shouldn't be enfored diff --git a/workspace.h b/workspace.h index 93d76d99c0..a815d717fb 100644 --- a/workspace.h +++ b/workspace.h @@ -243,6 +243,7 @@ public: const ToplevelList& stackingOrder() const; ToplevelList xStackingOrder() const; ClientList ensureStackingOrder(const ClientList& clients) const; + QList ensureStackingOrder(const QList &clients) const; Client* topClientOnDesktop(int desktop, int screen, bool unconstrained = false, bool only_normal = true) const;