cache blocked tabgroup state updates and do not check group breaking issues not being part of the updated states

BUG: 300847
FIXED-IN: 4.9
REVIEW: 105114
This commit is contained in:
Thomas Lübking 2012-05-31 10:20:20 +02:00
parent 11f28732db
commit 8ee66eff55
2 changed files with 13 additions and 4 deletions

View file

@ -32,6 +32,7 @@ TabGroup::TabGroup(Client *c)
, m_minSize(c->minSize()) , m_minSize(c->minSize())
, m_maxSize(c->maxSize()) , m_maxSize(c->maxSize())
, m_stateUpdatesBlocked(0) , m_stateUpdatesBlocked(0)
, m_pendingUpdates(TabGroup::None)
{ {
QIcon icon(c->icon()); QIcon icon(c->icon());
icon.addPixmap(c->miniIcon()); icon.addPixmap(c->miniIcon());
@ -291,8 +292,13 @@ void TabGroup::blockStateUpdates(bool more) {
void TabGroup::updateStates(Client* main, States states, Client* only) void TabGroup::updateStates(Client* main, States states, Client* only)
{ {
if (m_stateUpdatesBlocked > 0) if (m_stateUpdatesBlocked > 0) {
m_pendingUpdates |= states;
return; return;
}
states |= m_pendingUpdates;
m_pendingUpdates = TabGroup::None;
ClientList toBeRemoved; ClientList toBeRemoved;
for (ClientList::const_iterator i = m_clients.constBegin(), end = m_clients.constEnd(); i != end; ++i) { for (ClientList::const_iterator i = m_clients.constBegin(), end = m_clients.constEnd(); i != end; ++i) {
@ -322,8 +328,9 @@ void TabGroup::updateStates(Client* main, States states, Client* only)
if (c->desktop() != main->desktop()) if (c->desktop() != main->desktop())
c->setDesktop(main->desktop()); c->setDesktop(main->desktop());
} }
if ((states & Activity) && c->activities() != main->activities()) if ((states & Activity) && c->activities() != main->activities()) {
c->setOnActivities(main->activities()); c->setOnActivities(main->activities());
}
if (states & Layer) { if (states & Layer) {
if (c->keepAbove() != main->keepAbove()) if (c->keepAbove() != main->keepAbove())
c->setKeepAbove(main->keepAbove()); c->setKeepAbove(main->keepAbove());
@ -332,7 +339,8 @@ void TabGroup::updateStates(Client* main, States states, Client* only)
} }
// If it's not possible to have the same states then ungroup them, TODO: Check all states // If it's not possible to have the same states then ungroup them, TODO: Check all states
if (c->geometry() != main->geometry() || c->desktop() != main->desktop()) if (((states & Geometry) && c->geometry() != main->geometry()) ||
((states & Desktop) && c->desktop() != main->desktop()))
toBeRemoved << c; toBeRemoved << c;
} }
} }

View file

@ -57,7 +57,7 @@ public:
~TabGroup(); ~TabGroup();
enum State { enum State {
Minimized = 1<<0, Maximized = 1<<1, Shaded = 1<<2, None = 0, Minimized = 1<<0, Maximized = 1<<1, Shaded = 1<<2,
Geometry = 1<<3, Desktop = 1<<4, Activity = 1<<5, Geometry = 1<<3, Desktop = 1<<4, Activity = 1<<5,
Layer = 1<<6, QuickTile = 1<<7, All = 0xffffffff Layer = 1<<6, QuickTile = 1<<7, All = 0xffffffff
}; };
@ -164,6 +164,7 @@ private:
QSize m_minSize; QSize m_minSize;
QSize m_maxSize; QSize m_maxSize;
int m_stateUpdatesBlocked; int m_stateUpdatesBlocked;
States m_pendingUpdates;
}; };
inline bool TabGroup::contains(Client* c) const inline bool TabGroup::contains(Client* c) const