diff --git a/bridge.cpp b/bridge.cpp index f93705d7c6..8520dc703d 100644 --- a/bridge.cpp +++ b/bridge.cpp @@ -49,8 +49,18 @@ BRIDGE_HELPER( void, maximize, MaximizeMode m, m, ) BRIDGE_HELPER( void, minimize,,, ) BRIDGE_HELPER( void, showContextHelp,,, ) BRIDGE_HELPER( void, setDesktop, int desktop, desktop, ) -BRIDGE_HELPER( void, setKeepAbove, bool set, set, ) -BRIDGE_HELPER( void, setKeepBelow, bool set, set, ) + +void Bridge::setKeepAbove( bool set ) + { + if( c->keepAbove() != set ) + c->workspace()->performWindowOperation( c, KeepAboveOp ); + } + +void Bridge::setKeepBelow( bool set ) + { + if( c->keepBelow() != set ) + c->workspace()->performWindowOperation( c, KeepBelowOp ); + } NET::WindowType Bridge::windowType( unsigned long supported_types ) const { diff --git a/useractions.cpp b/useractions.cpp index 9474d88e87..0bc3390ffe 100644 --- a/useractions.cpp +++ b/useractions.cpp @@ -396,11 +396,23 @@ void Workspace::performWindowOperation( Client* c, Options::WindowOperation op ) c->setUserNoBorder( !c->isUserNoBorder()); break; case Options::KeepAboveOp: + { + StackingUpdatesBlocker blocker( this ); + bool was = c->keepAbove(); c->setKeepAbove( !c->keepAbove() ); + if( was && !c->keepAbove()) + raiseClient( c ); break; + } case Options::KeepBelowOp: + { c->setKeepBelow( !c->keepBelow() ); + StackingUpdatesBlocker blocker( this ); + bool was = c->keepBelow(); + if( was && !c->keepBelow()) + lowerClient( c ); break; + } case Options::WindowRulesOp: editWindowRules( c ); break;