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
This commit is contained in:
Clemens Zeidler 2011-08-13 22:59:47 +00:00
parent 0e400be555
commit f33cf3fd44
3 changed files with 27 additions and 36 deletions

View File

@ -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() : "<none>"));
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();

View File

@ -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,

View File

@ -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);
}
}