From 9eec690d9e6d8a194916120cf7d2bbb8e5e88d7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lubo=C5=A1=20Lu=C5=88=C3=A1k?= Date: Fri, 21 Mar 2008 17:12:21 +0000 Subject: [PATCH] Redo how transients raise their mainwindows - simply raise everything in the group, instead of trying to walk up the possibly complicated parents tree. svn path=/trunk/KDE/kdebase/workspace/; revision=788489 --- layers.cpp | 28 +++++++++++++++------------- workspace.h | 4 ++-- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/layers.cpp b/layers.cpp index de97cf2478..5286a5e50c 100644 --- a/layers.cpp +++ b/layers.cpp @@ -289,7 +289,7 @@ void Workspace::raiseOrLowerClient( Client *c) } -void Workspace::lowerClient( Client* c ) +void Workspace::lowerClient( Client* c, bool nogroup ) { if ( !c ) return; @@ -302,14 +302,17 @@ void Workspace::lowerClient( Client* c ) unconstrained_stacking_order.removeAll( c ); unconstrained_stacking_order.prepend( c ); - if( c->isTransient()) + if( !nogroup && c->isTransient() ) { - // lower also mainclients, in their reversed stacking order - ClientList mainclients = ensureStackingOrder( c->mainClients()); - for( int i = mainclients.size() - 1; + // lower also all windows in the group, in their reversed stacking order + ClientList wins = ensureStackingOrder( c->group()->members()); + for( int i = wins.size() - 1; i >= 0; --i ) - lowerClient( mainclients[ i ] ); + { + if( wins[ i ] != c ) + lowerClient( wins[ i ], true ); + } } if ( c == most_recently_raised ) @@ -344,7 +347,7 @@ void Workspace::lowerClientWithinApplication( Client* c ) // ignore mainwindows } -void Workspace::raiseClient( Client* c ) +void Workspace::raiseClient( Client* c, bool nogroup ) { if ( !c ) return; @@ -355,13 +358,12 @@ void Workspace::raiseClient( Client* c ) StackingUpdatesBlocker blocker( this ); - if( c->isTransient()) + if( !nogroup && c->isTransient()) { - ClientList mainclients = ensureStackingOrder( c->mainClients()); - for( ClientList::ConstIterator it = mainclients.begin(); - it != mainclients.end(); - ++it ) - raiseClient( *it ); + ClientList wins = ensureStackingOrder( c->group()->members()); + foreach( Client* c2, wins ) + if( c2 != c ) + raiseClient( c2, true ); } unconstrained_stacking_order.removeAll( c ); diff --git a/workspace.h b/workspace.h index 6d7155ebca..b434016c86 100644 --- a/workspace.h +++ b/workspace.h @@ -129,8 +129,8 @@ class Workspace : public QObject, public KDecorationDefines QPoint adjustClientPosition( Client* c, QPoint pos ); QRect adjustClientSize( Client* c, QRect moveResizeGeom, int mode ); - void raiseClient( Client* c ); - void lowerClient( Client* c ); + void raiseClient( Client* c, bool nogroup = false ); + void lowerClient( Client* c, bool nogroup = false ); void raiseClientRequest( Client* c, NET::RequestSource src, Time timestamp ); void lowerClientRequest( Client* c, NET::RequestSource src, Time timestamp ); void restackClientUnderActive( Client* );