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,