Oops, r527758 broke blocking of stacking updates.

svn path=/branches/work/kwin_composite/; revision=621280
This commit is contained in:
Luboš Luňák 2007-01-08 15:01:49 +00:00
parent de4d1bc518
commit 4c27cb9729

View file

@ -97,9 +97,10 @@ void Workspace::updateClientLayer( Client* c )
void Workspace::updateStackingOrder( bool propagate_new_clients ) void Workspace::updateStackingOrder( bool propagate_new_clients )
{ {
if( block_stacking_updates > 0 && propagate_new_clients ) if( block_stacking_updates > 0 )
{ {
blocked_propagating_new_clients = true; if( propagate_new_clients )
blocked_propagating_new_clients = true;
return; return;
} }
ClientList new_stacking_order = constrainedStackingOrder(); ClientList new_stacking_order = constrainedStackingOrder();
@ -116,11 +117,7 @@ void Workspace::updateStackingOrder( bool propagate_new_clients )
} }
#endif #endif
if( changed || propagate_new_clients ) if( changed || propagate_new_clients )
{
propagateClients( propagate_new_clients ); propagateClients( propagate_new_clients );
if( active_client )
active_client->updateMouseGrab();
}
} }
/*! /*!
@ -191,26 +188,24 @@ void Workspace::propagateClients( bool propagate_new_clients )
doesn't accept focus it's excluded. doesn't accept focus it's excluded.
*/ */
// TODO misleading name for this method // TODO misleading name for this method
Client* Workspace::topClientOnDesktop( int desktop, bool unconstrained, bool only_normal ) const Client* Workspace::topClientOnDesktop( int desktop, bool unconstrained ) const
{ {
// TODO Q_ASSERT( block_stacking_updates == 0 ); // TODO Q_ASSERT( block_stacking_updates == 0 );
ClientList list; ClientList list;
if( !unconstrained ) if( !unconstrained )
list = stacking_order;
else
list = unconstrained_stacking_order;
for( int i = list.size() - 1;
i >= 0;
--i )
{ {
if( list.at( i )->isOnDesktop( desktop ) && list.at( i )->isShown( false )) list = stacking_order;
{
if( !only_normal )
return list.at( i );
if( list.at( i )->wantsTabFocus() && !list.at( i )->isSpecialWindow())
return list.at( i );
}
} }
else
{
list = unconstrained_stacking_order;
}
for ( int i = list.size() - 1; i>=0; i-- )
{
if ( list.at( i )->isOnDesktop( desktop ) && !list.at( i )->isSpecialWindow()
&& list.at( i )->isShown( false ) && list.at( i )->wantsTabFocus())
return list.at( i );
}
return 0; return 0;
} }
@ -400,27 +395,20 @@ void Workspace::restackClientUnderActive( Client* c )
return; return;
} }
// put in the stacking order below _all_ windows belonging to the active application
assert( unconstrained_stacking_order.contains( active_client )); assert( unconstrained_stacking_order.contains( active_client ));
if( Client::belongToSameApplication( active_client, c )) for( ClientList::Iterator it = unconstrained_stacking_order.begin();
{ // put it below the active window if it's the same app it != unconstrained_stacking_order.end();
unconstrained_stacking_order.removeAll( c ); ++it )
unconstrained_stacking_order.insert( unconstrained_stacking_order.find( active_client ), c ); { // TODO ignore topmenus?
} if( Client::belongToSameApplication( active_client, *it ))
else {
{ // put in the stacking order below _all_ windows belonging to the active application if( *it != c )
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 ) unconstrained_stacking_order.removeAll( c );
{ unconstrained_stacking_order.insert( it, c );
unconstrained_stacking_order.removeAll( c );
unconstrained_stacking_order.insert( it, c );
}
break;
} }
break;
} }
} }
assert( unconstrained_stacking_order.contains( c )); assert( unconstrained_stacking_order.contains( c ));
@ -430,23 +418,16 @@ void Workspace::restackClientUnderActive( Client* c )
{ // do for every virtual desktop to handle the case of onalldesktop windows { // do for every virtual desktop to handle the case of onalldesktop windows
if( c->wantsTabFocus() && c->isOnDesktop( desktop ) && focus_chain[ desktop ].contains( active_client )) if( c->wantsTabFocus() && c->isOnDesktop( desktop ) && focus_chain[ desktop ].contains( active_client ))
{ {
if( Client::belongToSameApplication( active_client, c )) // also put in focus_chain[currentDesktop()] after all windows belonging to the active applicationa
{ // put it after the active window if it's the same app focus_chain[ desktop ].removeAll( c );
focus_chain[ desktop ].removeAll( c ); for ( int i = focus_chain[ desktop ].size() - 1;
focus_chain[ desktop ].insert( focus_chain[ desktop ].find( active_client ), c ); i >= 0;
} --i )
else {
{ // put it in focus_chain[currentDesktop()] after all windows belonging to the active applicationa if( Client::belongToSameApplication( active_client, focus_chain[ desktop ].at( i ) ))
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 ))) focus_chain[ desktop ].insert( i, c );
{ break;
focus_chain[ desktop ].insert( i, c );
break;
}
} }
} }
} }
@ -454,23 +435,15 @@ void Workspace::restackClientUnderActive( Client* c )
// the same for global_focus_chain // the same for global_focus_chain
if( c->wantsTabFocus() && global_focus_chain.contains( active_client )) if( c->wantsTabFocus() && global_focus_chain.contains( active_client ))
{ {
if( Client::belongToSameApplication( active_client, c )) global_focus_chain.removeAll( c );
for ( int i = global_focus_chain.size() - 1;
i >= 0;
--i )
{ {
global_focus_chain.removeAll( c ); if( Client::belongToSameApplication( active_client, global_focus_chain.at( i ) ))
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 )
{ {
if( Client::belongToSameApplication( active_client, global_focus_chain.at( i ) )) global_focus_chain.insert( i, c );
{ break;
global_focus_chain.insert( i, c );
break;
}
} }
} }
} }