From fe7a6834b200d2192ae1b50779e9017c6463e5c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Thu, 5 Mar 2015 10:24:54 +0100 Subject: [PATCH] FocusChain operates on AbstractClient instead of Client As external interface it still returns Client* to not force the casts to be done at usages. This will be changed once the users are migrated to AbstractClient*. --- focuschain.cpp | 49 ++++++++++++++++++++++++----------------------- focuschain.h | 41 ++++++++++++++++++++------------------- tabbox/tabbox.cpp | 4 ++-- workspace.cpp | 4 ++-- 4 files changed, 50 insertions(+), 48 deletions(-) diff --git a/focuschain.cpp b/focuschain.cpp index 1930ff813c..4556c38113 100644 --- a/focuschain.cpp +++ b/focuschain.cpp @@ -18,6 +18,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . *********************************************************************/ #include "focuschain.h" +#include "abstract_client.h" #include "client.h" #include "screens.h" @@ -39,7 +40,7 @@ FocusChain::~FocusChain() s_manager = NULL; } -void FocusChain::remove(Client *client) +void FocusChain::remove(AbstractClient *client) { for (DesktopChains::iterator it = m_desktopFocusChains.begin(); it != m_desktopFocusChains.end(); @@ -52,7 +53,7 @@ void FocusChain::remove(Client *client) void FocusChain::resize(uint previousSize, uint newSize) { for (uint i = previousSize + 1; i <= newSize; ++i) { - m_desktopFocusChains.insert(i, QList()); + m_desktopFocusChains.insert(i, QList()); } for (uint i = previousSize; i > newSize; --i) { m_desktopFocusChains.remove(i); @@ -70,19 +71,19 @@ Client *FocusChain::getForActivation(uint desktop, int screen) const if (it == m_desktopFocusChains.constEnd()) { return NULL; } - const QList &chain = it.value(); + const auto &chain = it.value(); for (int i = chain.size() - 1; i >= 0; --i) { - Client *tmp = chain.at(i); + auto tmp = chain.at(i); // TODO: move the check into Client if (tmp->isShown(false) && tmp->isOnCurrentActivity() && ( !m_separateScreenFocus || tmp->screen() == screen)) { - return tmp; + return dynamic_cast(tmp); } } return NULL; } -void FocusChain::update(Client *client, FocusChain::Change change) +void FocusChain::update(AbstractClient *client, FocusChain::Change change) { if (!client->wantsTabFocus()) { // Doesn't want tab focus, remove @@ -95,7 +96,7 @@ void FocusChain::update(Client *client, FocusChain::Change change) for (DesktopChains::iterator it = m_desktopFocusChains.begin(); it != m_desktopFocusChains.end(); ++it) { - QList &chain = it.value(); + auto &chain = it.value(); // Making first/last works only on current desktop, don't affect all desktops if (it.key() == m_currentDesktop && (change == MakeFirst || change == MakeLast)) { @@ -113,7 +114,7 @@ void FocusChain::update(Client *client, FocusChain::Change change) for (DesktopChains::iterator it = m_desktopFocusChains.begin(); it != m_desktopFocusChains.end(); ++it) { - QList &chain = it.value(); + auto &chain = it.value(); if (client->isOnDesktop(it.key())) { updateClientInChain(client, change, chain); } else { @@ -126,7 +127,7 @@ void FocusChain::update(Client *client, FocusChain::Change change) updateClientInChain(client, change, m_mostRecentlyUsed); } -void FocusChain::updateClientInChain(Client *client, FocusChain::Change change, QList< Client * >& chain) +void FocusChain::updateClientInChain(AbstractClient *client, FocusChain::Change change, QList< AbstractClient * >& chain) { if (change == MakeFirst) { makeFirstInChain(client, chain); @@ -137,7 +138,7 @@ void FocusChain::updateClientInChain(Client *client, FocusChain::Change change, } } -void FocusChain::insertClientIntoChain(Client *client, QList< Client * >& chain) +void FocusChain::insertClientIntoChain(AbstractClient *client, QList< AbstractClient * >& chain) { if (chain.contains(client)) { return; @@ -152,7 +153,7 @@ void FocusChain::insertClientIntoChain(Client *client, QList< Client * >& chain) } } -void FocusChain::moveAfterClient(Client *client, Client *reference) +void FocusChain::moveAfterClient(AbstractClient *client, AbstractClient *reference) { if (!client->wantsTabFocus()) { return; @@ -169,18 +170,18 @@ void FocusChain::moveAfterClient(Client *client, Client *reference) moveAfterClientInChain(client, reference, m_mostRecentlyUsed); } -void FocusChain::moveAfterClientInChain(Client *client, Client *reference, QList &chain) +void FocusChain::moveAfterClientInChain(AbstractClient *client, AbstractClient *reference, QList &chain) { if (!chain.contains(reference)) { return; } - if (Client::belongToSameApplication(reference, client)) { + if (AbstractClient::belongToSameApplication(reference, client)) { chain.removeAll(client); chain.insert(chain.indexOf(reference), client); } else { chain.removeAll(client); for (int i = chain.size() - 1; i >= 0; --i) { - if (Client::belongToSameApplication(reference, chain.at(i))) { + if (AbstractClient::belongToSameApplication(reference, chain.at(i))) { chain.insert(i, client); break; } @@ -188,7 +189,7 @@ void FocusChain::moveAfterClientInChain(Client *client, Client *reference, QList } } -Client *FocusChain::firstMostRecentlyUsed() const +AbstractClient *FocusChain::firstMostRecentlyUsed() const { if (m_mostRecentlyUsed.isEmpty()) { return NULL; @@ -196,7 +197,7 @@ Client *FocusChain::firstMostRecentlyUsed() const return m_mostRecentlyUsed.first(); } -Client *FocusChain::nextMostRecentlyUsed(Client *reference) const +AbstractClient *FocusChain::nextMostRecentlyUsed(AbstractClient *reference) const { if (m_mostRecentlyUsed.isEmpty()) { return NULL; @@ -212,30 +213,30 @@ Client *FocusChain::nextMostRecentlyUsed(Client *reference) const } // copied from activation.cpp -bool FocusChain::isUsableFocusCandidate(Client *c, Client *prev) const +bool FocusChain::isUsableFocusCandidate(AbstractClient *c, AbstractClient *prev) const { return c != prev && c->isShown(false) && c->isOnCurrentDesktop() && c->isOnCurrentActivity() && (!m_separateScreenFocus || c->isOnScreen(prev ? prev->screen() : screens()->current())); } -Client *FocusChain::nextForDesktop(Client *reference, uint desktop) const +Client *FocusChain::nextForDesktop(AbstractClient *reference, uint desktop) const { DesktopChains::const_iterator it = m_desktopFocusChains.find(desktop); if (it == m_desktopFocusChains.end()) { return NULL; } - const QList &chain = it.value(); + const auto &chain = it.value(); for (int i = chain.size() - 1; i >= 0; --i) { - Client* client = chain.at(i); + auto client = chain.at(i); if (isUsableFocusCandidate(client, reference)) { - return client; + return dynamic_cast(client); } } return NULL; } -void FocusChain::makeFirstInChain(Client *client, QList< Client * >& chain) +void FocusChain::makeFirstInChain(AbstractClient *client, QList< AbstractClient * >& chain) { chain.removeAll(client); if (client->isMinimized()) { // add it before the first minimized ... @@ -251,13 +252,13 @@ void FocusChain::makeFirstInChain(Client *client, QList< Client * >& chain) } } -void FocusChain::makeLastInChain(Client *client, QList< Client * >& chain) +void FocusChain::makeLastInChain(AbstractClient *client, QList< AbstractClient * >& chain) { chain.removeAll(client); chain.prepend(client); } -bool FocusChain::contains(Client *client, uint desktop) const +bool FocusChain::contains(AbstractClient *client, uint desktop) const { DesktopChains::const_iterator it = m_desktopFocusChains.find(desktop); if (it == m_desktopFocusChains.end()) { diff --git a/focuschain.h b/focuschain.h index a565f5ba86..0ba6136918 100644 --- a/focuschain.h +++ b/focuschain.h @@ -28,6 +28,7 @@ along with this program. If not, see . namespace KWin { // forward declarations +class AbstractClient; class Client; /** @@ -79,7 +80,7 @@ public: * @param change Where to move the Client * @return void **/ - void update(Client *client, Change change); + void update(AbstractClient *client, Change change); /** * @brief Moves @p client behind the @p reference Client in all focus chains. * @@ -87,7 +88,7 @@ public: * @param reference The Client behind which the @p client should be moved * @return void **/ - void moveAfterClient(Client *client, Client *reference); + void moveAfterClient(AbstractClient *client, AbstractClient *reference); /** * @brief Finds the best Client to become the new active Client in the focus chain for the given * virtual @p desktop. @@ -120,7 +121,7 @@ public: * @param client The Client to look for. * @return bool @c true if the most recently used focus chain contains @p client, @c false otherwise. **/ - bool contains(Client *client) const; + bool contains(AbstractClient *client) const; /** * @brief Checks whether the focus chain for the given @p desktop contains the given @p client. * @@ -130,7 +131,7 @@ public: * @param desktop The virtual desktop whose focus chain should be used * @return bool @c true if the focus chain for @p desktop contains @p client, @c false otherwise. **/ - bool contains(Client *client, uint desktop) const; + bool contains(AbstractClient *client, uint desktop) const; /** * @brief Queries the most recently used focus chain for the next Client after the given * @p reference Client. @@ -144,7 +145,7 @@ public: * @param reference The start point in the focus chain to search * @return :Client* The relatively next Client in the most recently used chain. **/ - Client *nextMostRecentlyUsed(Client *reference) const; + AbstractClient *nextMostRecentlyUsed(AbstractClient *reference) const; /** * @brief Queries the focus chain for @p desktop for the next Client in relation to the given * @p reference Client. @@ -156,14 +157,14 @@ public: * @param desktop The virtual desktop whose focus chain should be used * @return :Client* The next usable Client or @c null if none can be found. **/ - Client *nextForDesktop(Client *reference, uint desktop) const; + Client *nextForDesktop(AbstractClient *reference, uint desktop) const; /** * @brief Returns the first Client in the most recently used focus chain. First Client in this * case means really the first Client in the chain and not the most recently used Client. * * @return :Client* The first Client in the most recently used chain. **/ - Client *firstMostRecentlyUsed() const; + AbstractClient *firstMostRecentlyUsed() const; public Q_SLOTS: /** @@ -182,11 +183,11 @@ public Q_SLOTS: * @param client The Client to remove from all focus chains. * @return void **/ - void remove(KWin::Client *client); + void remove(KWin::AbstractClient *client); void setSeparateScreenFocus(bool enabled); - void setActiveClient(KWin::Client *client); + void setActiveClient(KWin::AbstractClient *client); void setCurrentDesktop(uint previous, uint newDesktop); - bool isUsableFocusCandidate(Client *c, Client *prev) const; + bool isUsableFocusCandidate(AbstractClient *c, AbstractClient *prev) const; private: /** @@ -199,7 +200,7 @@ private: * @param chain The focus chain to operate on * @return void **/ - void makeFirstInChain(Client *client, QList &chain); + void makeFirstInChain(AbstractClient *client, QList &chain); /** * @brief Makes @p client the last Client in the given focus @p chain. * @@ -210,22 +211,22 @@ private: * @param chain The focus chain to operate on * @return void **/ - void makeLastInChain(Client *client, QList &chain); - void moveAfterClientInChain(Client *client, Client *reference, QList &chain); - void updateClientInChain(Client *client, Change change, QList &chain); - void insertClientIntoChain(Client *client, QList &chain); - typedef QHash > DesktopChains; - QList m_mostRecentlyUsed; + void makeLastInChain(AbstractClient *client, QList &chain); + void moveAfterClientInChain(AbstractClient *client, AbstractClient *reference, QList &chain); + void updateClientInChain(AbstractClient *client, Change change, QList &chain); + void insertClientIntoChain(AbstractClient *client, QList &chain); + typedef QHash > DesktopChains; + QList m_mostRecentlyUsed; DesktopChains m_desktopFocusChains; bool m_separateScreenFocus; - Client *m_activeClient; + AbstractClient *m_activeClient; uint m_currentDesktop; KWIN_SINGLETON_VARIABLE(FocusChain, s_manager) }; inline -bool FocusChain::contains(Client *client) const +bool FocusChain::contains(AbstractClient *client) const { return m_mostRecentlyUsed.contains(client); } @@ -237,7 +238,7 @@ void FocusChain::setSeparateScreenFocus(bool enabled) } inline -void FocusChain::setActiveClient(Client *client) +void FocusChain::setActiveClient(AbstractClient *client) { m_activeClient = client; } diff --git a/tabbox/tabbox.cpp b/tabbox/tabbox.cpp index 452ff50682..094c6f2dbf 100644 --- a/tabbox/tabbox.cpp +++ b/tabbox/tabbox.cpp @@ -111,7 +111,7 @@ QString TabBoxHandlerImpl::desktopName(int desktop) const QWeakPointer TabBoxHandlerImpl::nextClientFocusChain(TabBoxClient* client) const { if (TabBoxClientImpl* c = static_cast< TabBoxClientImpl* >(client)) { - Client* next = FocusChain::self()->nextMostRecentlyUsed(c->client()); + auto next = FocusChain::self()->nextMostRecentlyUsed(c->client()); if (next) return next->tabBoxClient(); } @@ -120,7 +120,7 @@ QWeakPointer TabBoxHandlerImpl::nextClientFocusChain(TabBoxClient* QWeakPointer< TabBoxClient > TabBoxHandlerImpl::firstClientFocusChain() const { - if (Client *c = FocusChain::self()->firstMostRecentlyUsed()) { + if (auto c = FocusChain::self()->firstMostRecentlyUsed()) { return QWeakPointer(c->tabBoxClient()); } else { return QWeakPointer(); diff --git a/workspace.cpp b/workspace.cpp index 7309ca5239..54a592ed32 100644 --- a/workspace.cpp +++ b/workspace.cpp @@ -229,8 +229,8 @@ void Workspace::init() connect(this, SIGNAL(clientActivated(KWin::Client*)), screenEdges, SIGNAL(checkBlocking())); FocusChain *focusChain = FocusChain::create(this); - connect(this, SIGNAL(clientRemoved(KWin::Client*)), focusChain, SLOT(remove(KWin::Client*))); - connect(this, SIGNAL(clientActivated(KWin::Client*)), focusChain, SLOT(setActiveClient(KWin::Client*))); + connect(this, &Workspace::clientRemoved, focusChain, &FocusChain::remove); + connect(this, &Workspace::clientActivated, focusChain, &FocusChain::setActiveClient); connect(VirtualDesktopManager::self(), SIGNAL(countChanged(uint,uint)), focusChain, SLOT(resize(uint,uint))); connect(VirtualDesktopManager::self(), SIGNAL(currentChanged(uint,uint)), focusChain, SLOT(setCurrentDesktop(uint,uint))); connect(options, SIGNAL(separateScreenFocusChanged(bool)), focusChain, SLOT(setSeparateScreenFocus(bool)));