|
|
|
|
@ -854,15 +854,32 @@ void Workspace::raiseClient( Client* c ) |
|
|
|
|
if ( c == desktop_client ) |
|
|
|
|
return; // deny
|
|
|
|
|
|
|
|
|
|
Window* new_stack = new Window[ stacking_order.count()+1]; |
|
|
|
|
|
|
|
|
|
stacking_order.remove( c ); |
|
|
|
|
stacking_order.append( c ); |
|
|
|
|
|
|
|
|
|
ClientList saveset; |
|
|
|
|
if ( c->transientFor() ) { |
|
|
|
|
saveset.append( c ); |
|
|
|
|
Client* t = findClient( c->transientFor() ); |
|
|
|
|
Client* tmp; |
|
|
|
|
while ( t && !saveset.contains( t ) && t->transientFor() ) { |
|
|
|
|
tmp = findClient( t->transientFor() ); |
|
|
|
|
if ( !tmp ) |
|
|
|
|
break; |
|
|
|
|
saveset.append( t ); |
|
|
|
|
t = tmp; |
|
|
|
|
} |
|
|
|
|
if ( t && !saveset.contains( t ) && t != desktop_client ) { |
|
|
|
|
raiseClient( t ); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
saveset.clear(); |
|
|
|
|
saveset.append( c ); |
|
|
|
|
raiseTransientsOf(saveset, c ); |
|
|
|
|
|
|
|
|
|
Window* new_stack = new Window[ stacking_order.count()+1]; |
|
|
|
|
int i = 0; |
|
|
|
|
for ( ClientList::ConstIterator it = stacking_order.fromLast(); it != stacking_order.end(); --it) { |
|
|
|
|
new_stack[i++] = (*it)->winId(); |
|
|
|
|
@ -871,21 +888,7 @@ void Workspace::raiseClient( Client* c ) |
|
|
|
|
XRestackWindows(qt_xdisplay(), new_stack, i); |
|
|
|
|
delete [] new_stack; |
|
|
|
|
|
|
|
|
|
if ( c->transientFor() ) { |
|
|
|
|
Client* t = findClient( c->transientFor() ); |
|
|
|
|
Client* t2; |
|
|
|
|
while (t && t->transientFor() ) { |
|
|
|
|
t2 = findClient( t->transientFor() ); |
|
|
|
|
if ( t2 == c ) |
|
|
|
|
goto end; |
|
|
|
|
if ( t2 == t ) |
|
|
|
|
break; |
|
|
|
|
t = t2; |
|
|
|
|
} |
|
|
|
|
raiseClient( t ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
end:
|
|
|
|
|
propagateClients( TRUE ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|