From 6e45901844eb4283f84a8519e72cd6cc6cdd6e91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Thu, 5 Mar 2015 13:59:18 +0100 Subject: [PATCH] TabBoxClientImpl changed to using an AbstractClient The change is mostly straight forward. Effects are straight forward adjusted. Client::findModal is moved up, this causes still a few dynamic_casts to Client. Mostly because Workspace::activateClient still operates on Client. --- abstract_client.h | 3 +++ activation.cpp | 2 +- client.h | 4 ++-- effects.cpp | 11 +++++------ group.cpp | 6 +++--- tabbox/tabbox.cpp | 36 ++++++++++++++++++++---------------- tabbox/tabbox.h | 13 +++++++------ 7 files changed, 41 insertions(+), 34 deletions(-) diff --git a/abstract_client.h b/abstract_client.h index 71727b0a6b..fac62dd1ed 100644 --- a/abstract_client.h +++ b/abstract_client.h @@ -47,6 +47,9 @@ public: virtual bool wantsTabFocus() const = 0; virtual bool isFullScreen() const = 0; virtual const QIcon &icon() const = 0; + virtual bool skipSwitcher() const = 0; + // TODO: remove boolean trap + virtual AbstractClient *findModal(bool allow_itself = false) = 0; virtual void cancelAutoRaise() = 0; virtual bool isTransient() const; /** diff --git a/activation.cpp b/activation.cpp index fe0a51fa83..5ceee90809 100644 --- a/activation.cpp +++ b/activation.cpp @@ -349,7 +349,7 @@ void Workspace::takeActivity(Client* c, ActivityFlags flags) } if (flags & ActivityFocus) { - Client* modal = c->findModal(); + Client* modal = dynamic_cast(c->findModal()); if (modal != NULL && modal != c) { if (!modal->isOnDesktop(c->desktop())) { modal->setDesktop(c->desktop()); diff --git a/client.h b/client.h index 1293021db9..3f5e3e3e32 100644 --- a/client.h +++ b/client.h @@ -303,7 +303,7 @@ public: bool hasTransient(const Client* c, bool indirect) const; const ClientList& transients() const; // Is not indirect void checkTransient(xcb_window_t w); - Client* findModal(bool allow_itself = false); + AbstractClient* findModal(bool allow_itself = false) override; const Group* group() const; Group* group(); void checkGroup(Group* gr = NULL, bool force = false); @@ -422,7 +422,7 @@ public: bool skipPager() const; void setSkipPager(bool); - bool skipSwitcher() const; + bool skipSwitcher() const override; void setSkipSwitcher(bool set); bool keepAbove() const; diff --git a/effects.cpp b/effects.cpp index 13865dc952..86ecc9a512 100644 --- a/effects.cpp +++ b/effects.cpp @@ -1073,9 +1073,8 @@ EffectWindowList EffectsHandlerImpl::currentTabBoxWindowList() const { #ifdef KWIN_BUILD_TABBOX EffectWindowList ret; - ClientList clients; - clients = TabBox::TabBox::self()->currentClientList(); - for (Client * c : clients) + const auto clients = TabBox::TabBox::self()->currentClientList(); + for (auto c : clients) ret.append(c->effectWindow()); return ret; #else @@ -1123,7 +1122,7 @@ int EffectsHandlerImpl::currentTabBoxDesktop() const EffectWindow* EffectsHandlerImpl::currentTabBoxWindow() const { #ifdef KWIN_BUILD_TABBOX - if (Client* c = TabBox::TabBox::self()->currentClient()) + if (auto c = TabBox::TabBox::self()->currentClient()) return c->effectWindow(); #endif return NULL; @@ -1633,8 +1632,8 @@ void EffectWindowImpl::deleteProperty(long int atom) const EffectWindow* EffectWindowImpl::findModal() { - if (Client* c = dynamic_cast< Client* >(toplevel)) { - if (Client* c2 = c->findModal()) + if (AbstractClient* c = dynamic_cast< AbstractClient* >(toplevel)) { + if (AbstractClient* c2 = c->findModal()) return c2->effectWindow(); } return NULL; diff --git a/group.cpp b/group.cpp index fdb9fa7582..2e9f0edba0 100644 --- a/group.cpp +++ b/group.cpp @@ -902,12 +902,12 @@ ClientList Client::allMainClients() const return result; } -Client* Client::findModal(bool allow_itself) +AbstractClient* Client::findModal(bool allow_itself) { for (ClientList::ConstIterator it = transients().constBegin(); it != transients().constEnd(); ++it) - if (Client* ret = (*it)->findModal(true)) + if (AbstractClient* ret = (*it)->findModal(true)) return ret; if (isModal() && allow_itself) return this; @@ -1054,7 +1054,7 @@ void Client::checkActiveModal() // exist loops, breaking findModal Client* check_modal = workspace()->mostRecentlyActivatedClient(); if (check_modal != NULL && check_modal->check_active_modal) { - Client* new_modal = check_modal->findModal(); + Client* new_modal = dynamic_cast(check_modal->findModal()); if (new_modal != NULL && new_modal != check_modal) { if (!new_modal->isManaged()) return; // postpone check until end of manage() diff --git a/tabbox/tabbox.cpp b/tabbox/tabbox.cpp index 094c6f2dbf..14e8256d85 100644 --- a/tabbox/tabbox.cpp +++ b/tabbox/tabbox.cpp @@ -155,7 +155,7 @@ QWeakPointer TabBoxHandlerImpl::activeClient() const bool TabBoxHandlerImpl::checkDesktop(TabBoxClient* client, int desktop) const { - Client* current = (static_cast< TabBoxClientImpl* >(client))->client(); + auto current = (static_cast< TabBoxClientImpl* >(client))->client(); switch (config().clientDesktopMode()) { case TabBoxConfig::AllDesktopsClients: @@ -169,7 +169,7 @@ bool TabBoxHandlerImpl::checkDesktop(TabBoxClient* client, int desktop) const bool TabBoxHandlerImpl::checkActivity(TabBoxClient* client) const { - Client* current = (static_cast< TabBoxClientImpl* >(client))->client(); + auto current = (static_cast< TabBoxClientImpl* >(client))->client(); switch (config().clientActivitiesMode()) { case TabBoxConfig::AllActivitiesClients: @@ -183,7 +183,7 @@ bool TabBoxHandlerImpl::checkActivity(TabBoxClient* client) const bool TabBoxHandlerImpl::checkApplications(TabBoxClient* client) const { - Client* current = (static_cast< TabBoxClientImpl* >(client))->client(); + auto current = (static_cast< TabBoxClientImpl* >(client))->client(); TabBoxClientImpl* c; QListIterator< QWeakPointer > i(clientList()); @@ -233,7 +233,7 @@ bool TabBoxHandlerImpl::checkMinimized(TabBoxClient* client) const bool TabBoxHandlerImpl::checkMultiScreen(TabBoxClient* client) const { - Client* current = (static_cast< TabBoxClientImpl* >(client))->client(); + auto current = (static_cast< TabBoxClientImpl* >(client))->client(); switch (config().clientMultiScreenMode()) { case TabBoxConfig::IgnoreMultiScreen: @@ -250,8 +250,8 @@ QWeakPointer TabBoxHandlerImpl::clientToAddToList(TabBoxClient* cl if (!client) { return QWeakPointer(); } - Client* ret = nullptr; - Client* current = (static_cast< TabBoxClientImpl* >(client))->client(); + AbstractClient* ret = nullptr; + AbstractClient* current = (static_cast< TabBoxClientImpl* >(client))->client(); bool addClient = checkDesktop(client, desktop) && checkActivity(client) @@ -261,7 +261,7 @@ QWeakPointer TabBoxHandlerImpl::clientToAddToList(TabBoxClient* cl addClient = addClient && current->wantsTabFocus() && !current->skipSwitcher(); if (addClient) { // don't add windows that have modal dialogs - Client* modal = current->findModal(); + AbstractClient* modal = current->findModal(); if (modal == nullptr || modal == current) ret = current; else if (!clientList().contains(modal->tabBoxClient())) @@ -305,7 +305,7 @@ void TabBoxHandlerImpl::restack(TabBoxClient *c, TabBoxClient *under) void TabBoxHandlerImpl::elevateClient(TabBoxClient *c, WId tabbox, bool b) const { - Client *cl = static_cast(c)->client(); + auto cl = static_cast(c)->client(); cl->elevate(b); if (Unmanaged *w = Workspace::self()->findUnmanaged(tabbox)) w->elevate(b); @@ -313,7 +313,11 @@ void TabBoxHandlerImpl::elevateClient(TabBoxClient *c, WId tabbox, bool b) const void TabBoxHandlerImpl::shadeClient(TabBoxClient *c, bool b) const { - Client *cl = static_cast(c)->client(); + Client *cl = dynamic_cast(static_cast(c)->client()); + if (!cl) { + // shading is X11 specific + return; + } cl->cancelShadeHoverTimer(); // stop core shading action if (!b && cl->shadeMode() == ShadeNormal) cl->setShade(ShadeHover); @@ -341,7 +345,7 @@ void TabBoxHandlerImpl::activateAndClose() * TabBoxClientImpl *********************************************************/ -TabBoxClientImpl::TabBoxClientImpl(Client *client) +TabBoxClientImpl::TabBoxClientImpl(AbstractClient *client) : TabBoxClient() , m_client(client) { @@ -640,7 +644,7 @@ void TabBox::nextPrev(bool next) Returns the currently displayed client ( only works in TabBoxWindowsMode ). Returns 0 if no client is displayed. */ -Client* TabBox::currentClient() +AbstractClient* TabBox::currentClient() { if (TabBoxClientImpl* client = static_cast< TabBoxClientImpl* >(m_tabBox->client(m_tabBox->currentIndex()))) { if (!Workspace::self()->hasClient(client->client())) @@ -655,10 +659,10 @@ Client* TabBox::currentClient() TabBoxWindowsMode ). Returns an empty list if no clients are available. */ -ClientList TabBox::currentClientList() +QList TabBox::currentClientList() { TabBoxClientList list = m_tabBox->clientList(); - ClientList ret; + QList ret; foreach (const QWeakPointer &clientPointer, list) { QSharedPointer client = clientPointer.toStrongRef(); if (!client) @@ -694,7 +698,7 @@ QList< int > TabBox::currentDesktopList() \sa setCurrentDesktop() */ -void TabBox::setCurrentClient(Client* newClient) +void TabBox::setCurrentClient(AbstractClient *newClient) { setCurrentIndex(m_tabBox->index(newClient->tabBoxClient())); } @@ -1245,7 +1249,7 @@ void TabBox::KDEOneStepThroughWindows(bool forward, TabBoxMode mode) setMode(mode); reset(); nextPrev(forward); - if (Client* c = currentClient()) { + if (Client* c = dynamic_cast(currentClient())) { Workspace::self()->activateClient(c); shadeActivate(c); } @@ -1435,7 +1439,7 @@ void TabBox::close(bool abort) void TabBox::accept() { - Client* c = currentClient(); + Client* c = dynamic_cast(currentClient()); close(); if (c) { Workspace::self()->activateClient(c); diff --git a/tabbox/tabbox.h b/tabbox/tabbox.h index 4837f6b262..c3cfaedda5 100644 --- a/tabbox/tabbox.h +++ b/tabbox/tabbox.h @@ -40,6 +40,7 @@ namespace KWin { class Workspace; +class AbstractClient; class Client; namespace TabBox { @@ -86,7 +87,7 @@ private: class TabBoxClientImpl : public TabBoxClient { public: - explicit TabBoxClientImpl(Client *client); + explicit TabBoxClientImpl(AbstractClient *client); virtual ~TabBoxClientImpl(); virtual QString caption() const; @@ -101,12 +102,12 @@ public: virtual void close(); virtual bool isFirstInTabBox() const; - Client* client() const { + AbstractClient* client() const { return m_client; } private: - Client* m_client; + AbstractClient* m_client; }; class TabBox : public QObject @@ -115,12 +116,12 @@ class TabBox : public QObject public: ~TabBox(); - Client* currentClient(); - ClientList currentClientList(); + AbstractClient *currentClient(); + QList currentClientList(); int currentDesktop(); QList< int > currentDesktopList(); - void setCurrentClient(Client* newClient); + void setCurrentClient(AbstractClient *newClient); void setCurrentDesktop(int newDesktop); void setMode(TabBoxMode mode);