From 7defd93047de5ed542ad679f5b2e205c8175cac5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Fl=C3=B6ser?= Date: Sat, 5 May 2018 12:06:24 +0200 Subject: [PATCH] Port TabGroup from Client to AbstractClient First step towards a return of window tabbing. --- abstract_client.cpp | 10 ++++++++++ abstract_client.h | 2 ++ client.h | 4 ++-- tabgroup.cpp | 38 +++++++++++++++++++------------------- tabgroup.h | 32 ++++++++++++++++---------------- useractions.cpp | 2 +- 6 files changed, 50 insertions(+), 38 deletions(-) diff --git a/abstract_client.cpp b/abstract_client.cpp index 393e17bcc0..bc3774d73e 100644 --- a/abstract_client.cpp +++ b/abstract_client.cpp @@ -119,6 +119,16 @@ TabGroup *AbstractClient::tabGroup() const return nullptr; } +void AbstractClient::setTabGroup(TabGroup* group) +{ + Q_UNUSED(group) +} + +void AbstractClient::setClientShown(bool shown) +{ + Q_UNUSED(shown) +} + bool AbstractClient::untab(const QRect &toGeometry, bool clientRemoved) { Q_UNUSED(toGeometry) diff --git a/abstract_client.h b/abstract_client.h index 237f3b1c49..c7401a8f83 100644 --- a/abstract_client.h +++ b/abstract_client.h @@ -423,6 +423,8 @@ public: } virtual void setFullScreen(bool set, bool user = true) = 0; virtual TabGroup *tabGroup() const; + virtual void setTabGroup(TabGroup* group); + virtual void setClientShown(bool shown); Q_INVOKABLE virtual bool untab(const QRect &toGeometry = QRect(), bool clientRemoved = false); virtual bool isCurrentTab() const; virtual QRect geometryRestore() const = 0; diff --git a/client.h b/client.h index cd13885d0c..288c4b18df 100644 --- a/client.h +++ b/client.h @@ -270,14 +270,14 @@ public: /** * Set tab group - this is to be invoked by TabGroup::add/remove(client) and NO ONE ELSE */ - void setTabGroup(TabGroup* group); + void setTabGroup(TabGroup* group) override; /* * If shown is true the client is mapped and raised, if false * the client is unmapped and hidden, this function is called * when the tabbing group of the client switches its visible * client. */ - void setClientShown(bool shown); + void setClientShown(bool shown) override; /* * When a click is done in the decoration and it calls the group * to change the visible client it starts to move-resize the new diff --git a/tabgroup.cpp b/tabgroup.cpp index 9cc183a2b6..ee4b287cf7 100644 --- a/tabgroup.cpp +++ b/tabgroup.cpp @@ -27,7 +27,7 @@ along with this program. If not, see . namespace KWin { -TabGroup::TabGroup(Client *c) +TabGroup::TabGroup(AbstractClient *c) : m_clients() , m_current(c) , m_minSize(c->minSize()) @@ -58,7 +58,7 @@ void TabGroup::activatePrev() setCurrent(m_clients.at((index > 0) ? index - 1 : m_clients.count() - 1)); } -bool TabGroup::add(Client* c, Client *other, bool after, bool becomeVisible) +bool TabGroup::add(AbstractClient* c, AbstractClient *other, bool after, bool becomeVisible) { Q_ASSERT(!c->tabGroup()); @@ -144,7 +144,7 @@ bool TabGroup::add(Client* c, Client *other, bool after, bool becomeVisible) return true; } -bool TabGroup::remove(Client* c) +bool TabGroup::remove(AbstractClient* c) { if (!c) return false; @@ -189,15 +189,15 @@ void TabGroup::closeAll() // after this function exits. // However later Wayland support or similar might not share this bahaviour - and we really had // enough trouble with a polluted client list around the tabbing code .... - ClientList list(m_clients); - for (ClientList::const_iterator i = list.constBegin(), end = list.constEnd(); i != end; ++i) + auto list(m_clients); + for (auto i = list.constBegin(), end = list.constEnd(); i != end; ++i) if (*i != m_current) (*i)->closeWindow(); m_current->closeWindow(); } -void TabGroup::move(Client *c, Client *other, bool after) +void TabGroup::move(AbstractClient *c, AbstractClient *other, bool after) { if (c == other) return; @@ -222,10 +222,10 @@ void TabGroup::move(Client *c, Client *other, bool after) bool TabGroup::isActive() const { - return contains(dynamic_cast(Workspace::self()->activeClient())); + return contains(Workspace::self()->activeClient()); } -void TabGroup::setCurrent(Client* c, bool force) +void TabGroup::setCurrent(AbstractClient* c, bool force) { if ((c == m_current && !force) || !contains(c)) return; @@ -236,18 +236,18 @@ void TabGroup::setCurrent(Client* c, bool force) m_current = c; c->setClientShown(true); // reduce flicker? - for (ClientList::const_iterator i = m_clients.constBegin(), end = m_clients.constEnd(); i != end; ++i) + for (auto i = m_clients.constBegin(), end = m_clients.constEnd(); i != end; ++i) (*i)->setClientShown((*i) == m_current); } -void TabGroup::sync(const char *property, Client *c) +void TabGroup::sync(const char *property, AbstractClient *c) { if (c->metaObject()->indexOfProperty(property) > -1) { qCWarning(KWIN_CORE, "caught attempt to sync non dynamic property: %s", property); return; } QVariant v = c->property(property); - for (ClientList::iterator i = m_clients.begin(), end = m_clients.end(); i != end; ++i) { + for (auto i = m_clients.begin(), end = m_clients.end(); i != end; ++i) { if (*i != m_current) (*i)->setProperty(property, v); } @@ -263,7 +263,7 @@ void TabGroup::updateMinMaxSize() m_minSize = QSize(0, 0); m_maxSize = QSize(INT_MAX, INT_MAX); - for (ClientList::const_iterator i = m_clients.constBegin(); i != m_clients.constEnd(); ++i) { + for (auto i = m_clients.constBegin(); i != m_clients.constEnd(); ++i) { m_minSize = m_minSize.expandedTo((*i)->minSize()); m_maxSize = m_maxSize.boundedTo((*i)->maxSize()); } @@ -276,7 +276,7 @@ void TabGroup::updateMinMaxSize() const QSize size = m_current->clientSize().expandedTo(m_minSize).boundedTo(m_maxSize); if (size != m_current->clientSize()) { const QRect r(m_current->pos(), m_current->sizeForClientSize(size)); - for (ClientList::const_iterator i = m_clients.constBegin(), end = m_clients.constEnd(); i != end; ++i) + for (auto i = m_clients.constBegin(), end = m_clients.constEnd(); i != end; ++i) (*i)->setGeometry(r); } } @@ -290,7 +290,7 @@ void TabGroup::blockStateUpdates(bool more) { } } -void TabGroup::updateStates(Client* main, States states, Client* only) +void TabGroup::updateStates(AbstractClient* main, States states, AbstractClient* only) { if (main == only) return; // there's no need to only align "us" to "us" @@ -302,15 +302,15 @@ void TabGroup::updateStates(Client* main, States states, Client* only) states |= m_pendingUpdates; m_pendingUpdates = TabGroup::None; - ClientList toBeRemoved, onlyDummy; - ClientList *list = &m_clients; + QVector toBeRemoved, onlyDummy; + auto *list = &m_clients; if (only) { onlyDummy << only; list = &onlyDummy; } - for (ClientList::const_iterator i = list->constBegin(), end = list->constEnd(); i != end; ++i) { - Client *c = (*i); + for (auto i = list->constBegin(), end = list->constEnd(); i != end; ++i) { + auto *c = (*i); if (c != main) { if ((states & Minimized) && c->isMinimized() != main->isMinimized()) { if (main->isMinimized()) @@ -353,7 +353,7 @@ void TabGroup::updateStates(Client* main, States states, Client* only) } } - for (ClientList::const_iterator i = toBeRemoved.constBegin(), end = toBeRemoved.constEnd(); i != end; ++i) + for (auto i = toBeRemoved.constBegin(), end = toBeRemoved.constEnd(); i != end; ++i) remove(*i); } diff --git a/tabgroup.h b/tabgroup.h index 5c93907dc6..544910f8c3 100644 --- a/tabgroup.h +++ b/tabgroup.h @@ -28,7 +28,7 @@ along with this program. If not, see . namespace KWin { -class Client; +class AbstractClient; /** * This class represents a group of clients for use in window tabbing. All @@ -52,7 +52,7 @@ public: /** * Creates a new group containing \p c. */ - explicit TabGroup(Client* c); + explicit TabGroup(AbstractClient* c); ~TabGroup(); enum State { @@ -87,7 +87,7 @@ public: /** * Whether client \p c is member of this group */ - bool contains(Client* c) const; + bool contains(AbstractClient* c) const; /** * The amount of clients in this group @@ -107,22 +107,22 @@ public: /** * Returns the list of all the clients contained in this group in their current order. */ - const ClientList &clients() const; + const QVector &clients() const; /** * Returns the currently visible client. */ - Client* current() const; + AbstractClient* current() const; /** * Makes \p c the visible client in the group - force is only used when the window becomes ready for painting. * Any other usage just causes pointless action */ - void setCurrent(Client* c, bool force = false); + void setCurrent(AbstractClient* c, bool force = false); /** * Alignes the dynamic Qt @param property of all clients to the one of @param c */ - void sync(const char *property, Client *c); + void sync(const char *property, AbstractClient *c); /** * Returns combined minimum size of all clients in the group. @@ -138,7 +138,7 @@ public: * \p main as the primary client to copy the settings off. If \p only is set then only * that client is updated to match \p main. */ - void updateStates(Client* main, States states, Client* only = NULL); + void updateStates(AbstractClient* main, States states, AbstractClient* only = NULL); /** * updates geometry restrictions of this group, basically called from Client::getWmNormalHints(), otherwise rather private @@ -152,21 +152,21 @@ Q_SIGNALS: private: friend class Client; // friend bool Client::tabTo(Client*, bool, bool); - bool add(KWin::Client *c, Client *other, bool behind, bool activateC); - void move(KWin::Client* c, KWin::Client* before, bool behind); + bool add(KWin::AbstractClient *c, AbstractClient *other, bool behind, bool activateC); + void move(KWin::AbstractClient* c, KWin::AbstractClient* before, bool behind); // friend bool Client::untab(const QRect&); - bool remove(KWin::Client *c); + bool remove(KWin::AbstractClient *c); - ClientList m_clients; - Client *m_current; + QVector m_clients; + AbstractClient *m_current; QSize m_minSize; QSize m_maxSize; int m_stateUpdatesBlocked; States m_pendingUpdates; }; -inline bool TabGroup::contains(Client* c) const +inline bool TabGroup::contains(AbstractClient* c) const { return c && m_clients.contains(c); } @@ -176,7 +176,7 @@ inline int TabGroup::count() const return m_clients.count(); } -inline const ClientList &TabGroup::clients() const +inline const QVector &TabGroup::clients() const { return m_clients; } @@ -186,7 +186,7 @@ inline bool TabGroup::isEmpty() const return m_clients.isEmpty(); } -inline Client* TabGroup::current() const +inline AbstractClient* TabGroup::current() const { return m_current; } diff --git a/useractions.cpp b/useractions.cpp index 59344685a7..71219dd319 100644 --- a/useractions.cpp +++ b/useractions.cpp @@ -534,7 +534,7 @@ void UserActionsMenu::rebuildTabListPopup() m_switchToTabMenu->addSeparator(); - for (QList::const_iterator i = m_client.data()->tabGroup()->clients().constBegin(), + for (auto i = m_client.data()->tabGroup()->clients().constBegin(), end = m_client.data()->tabGroup()->clients().constEnd(); i != end; ++i) { if ((*i)->noBorder() || *i == m_client.data()->tabGroup()->current()) continue; // cannot tab there anyway