diff --git a/activation.cpp b/activation.cpp index 38716b850..fe0a51fa8 100644 --- a/activation.cpp +++ b/activation.cpp @@ -731,7 +731,7 @@ xcb_timestamp_t Client::readUserTimeMapTimestamp(const KStartupInfoId *asn_id, c ; // is transient for currently active window, even though it's not // the same app (e.g. kcookiejar dialog) -> allow activation else if (groupTransient() && - findInList(mainClients(), sameApplicationActiveHackPredicate) == NULL) + findInList(mainClients(), sameApplicationActiveHackPredicate) == NULL) ; // standalone transient else first_window = false; diff --git a/toplevel.h b/toplevel.h index 5cc652e27..10b8b59af 100644 --- a/toplevel.h +++ b/toplevel.h @@ -361,8 +361,8 @@ public: * @param func The condition function (compare std::find_if) * @return T* The found Toplevel or @c null if there is no matching Toplevel */ - template - static T *findInList(const QList &list, std::function func); + template + static T *findInList(const QList &list, std::function func); Q_SIGNALS: void opacityChanged(KWin::Toplevel* toplevel, qreal oldOpacity); @@ -718,9 +718,11 @@ inline quint32 Toplevel::surfaceId() const return m_surfaceId; } -template -inline T *Toplevel::findInList(const QList &list, std::function func) +template +inline T *Toplevel::findInList(const QList &list, std::function func) { + static_assert(std::is_base_of::value, + "U must be derived from T"); const auto it = std::find_if(list.begin(), list.end(), func); if (it == list.end()) { return nullptr; diff --git a/workspace.cpp b/workspace.cpp index b4882daed..d38f3ac32 100644 --- a/workspace.cpp +++ b/workspace.cpp @@ -1576,6 +1576,20 @@ Client *Workspace::findClient(Predicate predicate, xcb_window_t w) const return nullptr; } +Toplevel *Workspace::findToplevel(std::function func) const +{ + if (Client *ret = Toplevel::findInList(clients, func)) { + return ret; + } + if (Client *ret = Toplevel::findInList(desktops, func)) { + return ret; + } + if (Unmanaged *ret = Toplevel::findInList(unmanaged, func)) { + return ret; + } + return nullptr; +} + } // namespace #include "workspace.moc" diff --git a/workspace.h b/workspace.h index 4ecac3d78..6f528d90a 100644 --- a/workspace.h +++ b/workspace.h @@ -122,6 +122,7 @@ public: */ Unmanaged *findUnmanaged(xcb_window_t w) const; void forEachUnmanaged(std::function func); + Toplevel *findToplevel(std::function func) const; QRect clientArea(clientAreaOption, const QPoint& p, int desktop) const; QRect clientArea(clientAreaOption, const Client* c) const;