diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index d1cef6acb4..0f6080eb19 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -1036,21 +1036,11 @@ Desktop::SelectWindow(Window* window) of their subset. */ void -Desktop::ActivateWindow(Window* window, bool activateStack) +Desktop::ActivateWindow(Window* window) { STRACE(("ActivateWindow(%p, %s)\n", window, window ? window->Title() : "")); - WindowStack* stack = window->GetWindowStack(); - if (activateStack && stack != NULL) { - for (int32 i = 0; i < stack->CountWindows(); i++) { - Window* win = stack->LayerOrder().ItemAt(i); - if (window == win) - continue; - ActivateWindow(win, false); - } - } - if (window == NULL) { fBack = NULL; fFront = NULL; @@ -1164,11 +1154,16 @@ Desktop::ActivateWindow(Window* window, bool activateStack) void -Desktop::SendWindowBehind(Window* window, Window* behindOf) +Desktop::SendWindowBehind(Window* window, Window* behindOf, bool sendStack) { if (!LockAllWindows()) return; + Window* orgWindow = window; + WindowStack* stack = window->GetWindowStack(); + if (sendStack && stack != NULL) + window = stack->TopLayerWindow(); + // TODO: should the "not in current workspace" be handled anyway? // (the code below would have to be changed then, though) if (window == BackWindow() @@ -1195,10 +1190,13 @@ Desktop::SendWindowBehind(Window* window, Window* behindOf) BRegion dummy; _RebuildClippingForAllWindows(dummy); - // mark everything dirty that is no longer visible - BRegion clean(window->VisibleRegion()); - dirty.Exclude(&clean); - MarkDirty(dirty); + // only redraw the top layer window to avoid flicker + if (sendStack) { + // mark everything dirty that is no longer visible + BRegion clean(window->VisibleRegion()); + dirty.Exclude(&clean); + MarkDirty(dirty); + } _UpdateFronts(); if (fSettings->MouseMode() == B_FOCUS_FOLLOWS_MOUSE) @@ -1212,7 +1210,16 @@ Desktop::SendWindowBehind(Window* window, Window* behindOf) _WindowChanged(window); - NotifyWindowSentBehind(window, behindOf); + if (sendStack && stack != NULL) { + for (int32 i = 0; i < stack->CountWindows(); i++) { + Window* stackWindow = stack->LayerOrder().ItemAt(i); + if (stackWindow == window) + continue; + SendWindowBehind(stackWindow, behindOf, false); + } + } + + NotifyWindowSentBehind(orgWindow, behindOf); UnlockAllWindows(); diff --git a/src/servers/app/Desktop.h b/src/servers/app/Desktop.h index 477b03b987..daa6f78c4b 100644 --- a/src/servers/app/Desktop.h +++ b/src/servers/app/Desktop.h @@ -160,10 +160,10 @@ public: // Window methods void SelectWindow(Window* window); - void ActivateWindow(Window* window, - bool activateStack = true); + void ActivateWindow(Window* window); void SendWindowBehind(Window* window, - Window* behindOf = NULL); + Window* behindOf = NULL, + bool sendStack = true); void ShowWindow(Window* window); void HideWindow(Window* window, diff --git a/src/servers/app/stackandtile/StackAndTile.cpp b/src/servers/app/stackandtile/StackAndTile.cpp index acbacd7268..6bf2963963 100644 --- a/src/servers/app/stackandtile/StackAndTile.cpp +++ b/src/servers/app/stackandtile/StackAndTile.cpp @@ -308,22 +308,6 @@ StackAndTile::WindowActitvated(Window* window) void StackAndTile::WindowSentBehind(Window* window, Window* behindOf) { - SATWindow* satWindow = GetSATWindow(window); - if (satWindow == NULL) - return; - SATGroup* group = satWindow->GetGroup(); - if (group == NULL) - return; - Desktop* desktop = satWindow->GetWindow()->Desktop(); - if (desktop == NULL) - return; - - WindowIterator iter(group, true); - for (SATWindow* listWindow = iter.NextWindow(); listWindow != NULL; - listWindow = iter.NextWindow()) { - if (listWindow != satWindow) - desktop->SendWindowBehind(listWindow->GetWindow(), behindOf); - } }