From e17138c20bb4205cf0cc540f66c10b0e4f19216e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lubo=C5=A1=20Lu=C5=88=C3=A1k?= Date: Tue, 7 Nov 2006 17:07:24 +0000 Subject: [PATCH] Fix stacking order and focus chain when opening links in background in Konqueror. svn path=/trunk/KDE/kdebase/workspace/; revision=603050 --- layers.cpp | 76 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 27 deletions(-) diff --git a/layers.cpp b/layers.cpp index 78d22d692f..5f4c7806e5 100644 --- a/layers.cpp +++ b/layers.cpp @@ -394,20 +394,27 @@ void Workspace::restackClientUnderActive( Client* c ) return; } - // put in the stacking order below _all_ windows belonging to the active application assert( unconstrained_stacking_order.contains( active_client )); - for( ClientList::Iterator it = unconstrained_stacking_order.begin(); - it != unconstrained_stacking_order.end(); - ++it ) - { // TODO ignore topmenus? - if( Client::belongToSameApplication( active_client, *it )) - { - if( *it != c ) + if( Client::belongToSameApplication( active_client, c )) + { // put it below the active window if it's the same app + unconstrained_stacking_order.removeAll( c ); + unconstrained_stacking_order.insert( unconstrained_stacking_order.find( active_client ), c ); + } + else + { // put in the stacking order below _all_ windows belonging to the active application + for( ClientList::Iterator it = unconstrained_stacking_order.begin(); + it != unconstrained_stacking_order.end(); + ++it ) + { // TODO ignore topmenus? + if( Client::belongToSameApplication( active_client, *it )) { - unconstrained_stacking_order.removeAll( c ); - unconstrained_stacking_order.insert( it, c ); + if( *it != c ) + { + unconstrained_stacking_order.removeAll( c ); + unconstrained_stacking_order.insert( it, c ); + } + break; } - break; } } assert( unconstrained_stacking_order.contains( c )); @@ -417,16 +424,23 @@ void Workspace::restackClientUnderActive( Client* c ) { // do for every virtual desktop to handle the case of onalldesktop windows if( c->wantsTabFocus() && c->isOnDesktop( desktop ) && focus_chain[ desktop ].contains( active_client )) { - // also put in focus_chain[currentDesktop()] after all windows belonging to the active applicationa - focus_chain[ desktop ].removeAll( c ); - for ( int i = focus_chain[ desktop ].size() - 1; - i >= 0; - --i ) - { - if( Client::belongToSameApplication( active_client, focus_chain[ desktop ].at( i ) )) + if( Client::belongToSameApplication( active_client, c )) + { // put it after the active window if it's the same app + focus_chain[ desktop ].removeAll( c ); + focus_chain[ desktop ].insert( focus_chain[ desktop ].find( active_client ), c ); + } + else + { // put it in focus_chain[currentDesktop()] after all windows belonging to the active applicationa + focus_chain[ desktop ].removeAll( c ); + for( int i = focus_chain[ desktop ].size() - 1; + i >= 0; + --i ) { - focus_chain[ desktop ].insert( i, c ); - break; + if( Client::belongToSameApplication( active_client, focus_chain[ desktop ].at( i ))) + { + focus_chain[ desktop ].insert( i, c ); + break; + } } } } @@ -434,15 +448,23 @@ void Workspace::restackClientUnderActive( Client* c ) // the same for global_focus_chain if( c->wantsTabFocus() && global_focus_chain.contains( active_client )) { - global_focus_chain.removeAll( c ); - for ( int i = global_focus_chain.size() - 1; - i >= 0; - --i ) + if( Client::belongToSameApplication( active_client, c )) { - if( Client::belongToSameApplication( active_client, global_focus_chain.at( i ) )) + global_focus_chain.removeAll( c ); + global_focus_chain.insert( global_focus_chain.find( active_client ), c ); + } + else + { + global_focus_chain.removeAll( c ); + for ( int i = global_focus_chain.size() - 1; + i >= 0; + --i ) { - global_focus_chain.insert( i, c ); - break; + if( Client::belongToSameApplication( active_client, global_focus_chain.at( i ) )) + { + global_focus_chain.insert( i, c ); + break; + } } } }