From 55fbf11fd7ac3b4c6002b4d8ff3ec2372fa5e8c4 Mon Sep 17 00:00:00 2001 From: Clemens Zeidler Date: Tue, 2 Aug 2011 22:27:12 +0000 Subject: [PATCH] If a window is hidden remove it from the S&T group. This happens when MediaPlayer goes fullscreen. Maybe not optimal but at least consistent with terminal which also left the S&T group in fullscreen mode. This is because the terminal has no decorator in fullscreen mode and thus can't be stacked any more (maybe this should be solved in the future...). Fixes #7895, #7896. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42548 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/Desktop.cpp | 2 + src/servers/app/DesktopListener.cpp | 13 +++++ src/servers/app/DesktopListener.h | 2 + src/servers/app/stackandtile/StackAndTile.cpp | 47 ++++++++++++------- src/servers/app/stackandtile/StackAndTile.h | 1 + 5 files changed, 48 insertions(+), 17 deletions(-) diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index 7baf5bc41d..2cc554f0e0 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -1300,6 +1300,8 @@ Desktop::HideWindow(Window* window) } } + NotifyWindowHidden(window); + UnlockAllWindows(); if (window == fWindowUnderMouse) diff --git a/src/servers/app/DesktopListener.cpp b/src/servers/app/DesktopListener.cpp index b87e975dda..cce860ddc5 100644 --- a/src/servers/app/DesktopListener.cpp +++ b/src/servers/app/DesktopListener.cpp @@ -229,6 +229,19 @@ DesktopObservable::NotifyWindowWorkspacesChanged(Window* window, } +void +DesktopObservable::NotifyWindowHidden(Window* window) +{ + if (fWeAreInvoking) + return; + InvokeGuard invokeGuard(fWeAreInvoking); + + for (DesktopListener* listener = fDesktopListenerList.First(); + listener != NULL; listener = fDesktopListenerList.GetNext(listener)) + listener->WindowHidden(window); +} + + void DesktopObservable::NotifyWindowMinimized(Window* window, bool minimize) { diff --git a/src/servers/app/DesktopListener.h b/src/servers/app/DesktopListener.h index 0a257dce31..d44d242798 100644 --- a/src/servers/app/DesktopListener.h +++ b/src/servers/app/DesktopListener.h @@ -55,6 +55,7 @@ public: Window* behindOf) = 0; virtual void WindowWorkspacesChanged(Window* window, uint32 workspaces) = 0; + virtual void WindowHidden(Window* window) = 0; virtual void WindowMinimized(Window* window, bool minimize) = 0; @@ -111,6 +112,7 @@ public: Window* behindOf); void NotifyWindowWorkspacesChanged(Window* window, uint32 workspaces); + void NotifyWindowHidden(Window* window); void NotifyWindowMinimized(Window* window, bool minimize); diff --git a/src/servers/app/stackandtile/StackAndTile.cpp b/src/servers/app/stackandtile/StackAndTile.cpp index 2f26ab75e6..b4f76d993a 100644 --- a/src/servers/app/stackandtile/StackAndTile.cpp +++ b/src/servers/app/stackandtile/StackAndTile.cpp @@ -270,7 +270,7 @@ void StackAndTile::WindowMoved(Window* window) { SATWindow* satWindow = GetSATWindow(window); - if (!satWindow) + if (satWindow == NULL) return; if (SATKeyPressed() && fCurrentSATWindow) @@ -284,7 +284,7 @@ void StackAndTile::WindowResized(Window* window) { SATWindow* satWindow = GetSATWindow(window); - if (!satWindow) + if (satWindow == NULL) return; satWindow->Resized(); @@ -298,8 +298,8 @@ StackAndTile::WindowResized(Window* window) void StackAndTile::WindowActitvated(Window* window) { - SATWindow* satWindow = GetSATWindow(window); - if (!satWindow) + SATWindow* satWindow = GetSATWindow(window); + if (satWindow == NULL) return; _ActivateWindow(satWindow); } @@ -308,14 +308,14 @@ StackAndTile::WindowActitvated(Window* window) void StackAndTile::WindowSentBehind(Window* window, Window* behindOf) { - SATWindow* satWindow = GetSATWindow(window); - if (!satWindow) + SATWindow* satWindow = GetSATWindow(window); + if (satWindow == NULL) return; SATGroup* group = satWindow->GetGroup(); - if (!group) + if (group == NULL) return; Desktop* desktop = satWindow->GetWindow()->Desktop(); - if (!desktop) + if (desktop == NULL) return; WindowIterator iter(group, true); @@ -330,14 +330,14 @@ StackAndTile::WindowSentBehind(Window* window, Window* behindOf) void StackAndTile::WindowWorkspacesChanged(Window* window, uint32 workspaces) { - SATWindow* satWindow = GetSATWindow(window); - if (!satWindow) + SATWindow* satWindow = GetSATWindow(window); + if (satWindow == NULL) return; SATGroup* group = satWindow->GetGroup(); - if (!group) + if (group == NULL) return; Desktop* desktop = satWindow->GetWindow()->Desktop(); - if (!desktop) + if (desktop == NULL) return; for (int i = 0; i < group->CountItems(); i++) { @@ -349,16 +349,29 @@ StackAndTile::WindowWorkspacesChanged(Window* window, uint32 workspaces) void -StackAndTile::WindowMinimized(Window* window, bool minimize) +StackAndTile::WindowHidden(Window* window) { - SATWindow* satWindow = GetSATWindow(window); - if (!satWindow) + SATWindow* satWindow = GetSATWindow(window); + if (satWindow == NULL) return; SATGroup* group = satWindow->GetGroup(); - if (!group) + if (group == NULL) + return; + group->RemoveWindow(satWindow); +} + + +void +StackAndTile::WindowMinimized(Window* window, bool minimize) +{ + SATWindow* satWindow = GetSATWindow(window); + if (satWindow == NULL) + return; + SATGroup* group = satWindow->GetGroup(); + if (group == NULL) return; Desktop* desktop = satWindow->GetWindow()->Desktop(); - if (!desktop) + if (desktop == NULL) return; for (int i = 0; i < group->CountItems(); i++) { diff --git a/src/servers/app/stackandtile/StackAndTile.h b/src/servers/app/stackandtile/StackAndTile.h index 2aae3e9d04..7fc77dd042 100644 --- a/src/servers/app/stackandtile/StackAndTile.h +++ b/src/servers/app/stackandtile/StackAndTile.h @@ -72,6 +72,7 @@ public: Window* behindOf); virtual void WindowWorkspacesChanged(Window* window, uint32 workspaces); + virtual void WindowHidden(Window* window); virtual void WindowMinimized(Window* window, bool minimize); virtual void WindowTabLocationChanged(Window* window,