From f33cf3fd44d0877037b3cf8f82c2b40f4189bf28 Mon Sep 17 00:00:00 2001 From: Clemens Zeidler Date: Sat, 13 Aug 2011 22:59:47 +0000 Subject: [PATCH] Activating all windows in a stack caused flickering. The reason to activate all windows was to get all windows form a stack into the upper window layers, otherwise it was possible that the top layer stack window is activated but another window in the stack is at the bottommost layer position. Sending this window to the back does not triggered sending the complete stack to the back. The send behind call is now redirected to the top most stack window to ensure the stack is send behind. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42632 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/Desktop.cpp | 41 +++++++++++-------- src/servers/app/Desktop.h | 6 +-- src/servers/app/stackandtile/StackAndTile.cpp | 16 -------- 3 files changed, 27 insertions(+), 36 deletions(-) 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); - } }