Author: czeidler Date: 2010-06-03 07:40:37 +0200 (Thu, 03 Jun 2010) New Revision: 37004 Changeset: http://dev.haiku-os.org/changeset/37004/haiku Modified: haiku/branches/features/stack-and-tile/src/servers/app/Desktop.cpp haiku/branches/features/stack-and-tile/src/servers/app/Desktop.h haiku/branches/features/stack-and-tile/src/servers/app/Snapping.cpp haiku/branches/features/stack-and-tile/src/servers/app/StackAndTile.cpp haiku/branches/features/stack-and-tile/src/servers/app/StackAndTile.h haiku/branches/features/stack-and-tile/src/servers/app/Stacking.cpp Log: Simplify ActivateWindow interface and make the activation of a window more or less working. Stacked windows are not always correctly activated. Modified: haiku/branches/features/stack-and-tile/src/servers/app/Desktop.cpp =================================================================== --- haiku/branches/features/stack-and-tile/src/servers/app/Desktop.cpp 2010-06-03 00:08:00 UTC (rev 37003) +++ haiku/branches/features/stack-and-tile/src/servers/app/Desktop.cpp 2010-06-03 05:40:37 UTC (rev 37004) @@ -300,6 +300,14 @@ } +DesktopObservable::DesktopObservable() + : + fWeAreInvoking(false) +{ + +} + + void DesktopObservable::RegisterListener(DesktopListener* listener) { @@ -322,6 +330,10 @@ void DesktopObservable::InvokeWindowAdded(Window* window) { + if (fWeAreInvoking) + return; + InvokeGuard invokeGuard(fWeAreInvoking); + FOR_ALL_DESKTOP_LISTENER listener->WindowAdded(window); } @@ -330,6 +342,10 @@ void DesktopObservable::InvokeWindowRemoved(Window* window) { + if (fWeAreInvoking) + return; + InvokeGuard invokeGuard(fWeAreInvoking); + FOR_ALL_DESKTOP_LISTENER listener->WindowRemoved(window); } @@ -338,6 +354,10 @@ void DesktopObservable::InvokeKeyEvent(uint32 what, int32 key, int32 modifiers) { + if (fWeAreInvoking) + return; + InvokeGuard invokeGuard(fWeAreInvoking); + FOR_ALL_DESKTOP_LISTENER listener->KeyEvent(what, key, modifiers); } @@ -346,6 +366,10 @@ void DesktopObservable::InvokeMouseDown(Window* window) { + if (fWeAreInvoking) + return; + InvokeGuard invokeGuard(fWeAreInvoking); + FOR_ALL_DESKTOP_LISTENER listener->MouseDown(window); } @@ -354,6 +378,10 @@ void DesktopObservable::InvokeMouseUp(Window* window) { + if (fWeAreInvoking) + return; + InvokeGuard invokeGuard(fWeAreInvoking); + FOR_ALL_DESKTOP_LISTENER listener->MouseUp(window); } @@ -362,6 +390,10 @@ void DesktopObservable::InvokeMoveWindow(Window* window) { + if (fWeAreInvoking) + return; + InvokeGuard invokeGuard(fWeAreInvoking); + FOR_ALL_DESKTOP_LISTENER listener->MoveWindow(window); } @@ -370,17 +402,24 @@ void DesktopObservable::InvokeResizeWindow(Window* window) { + if (fWeAreInvoking) + return; + InvokeGuard invokeGuard(fWeAreInvoking); + FOR_ALL_DESKTOP_LISTENER listener->ResizeWindow(window); } void -DesktopObservable::InvokeActivateWindow(Window* window, - WindowList& bringToTopList) +DesktopObservable::InvokeActivateWindow(Window* window) { + if (fWeAreInvoking) + return; + InvokeGuard invokeGuard(fWeAreInvoking); + FOR_ALL_DESKTOP_LISTENER - listener->ActivateWindow(window, bringToTopList); + listener->ActivateWindow(window); } @@ -396,6 +435,20 @@ } +DesktopObservable::InvokeGuard::InvokeGuard(bool& invoking) + : + fInvoking(invoking) +{ + fInvoking = true; +} + + +DesktopObservable::InvokeGuard::~InvokeGuard() +{ + fInvoking = false; +} + + // #pragma mark - @@ -1014,6 +1067,8 @@ AutoWriteLocker _(fWindowLock); + InvokeActivateWindow(window); + bool windowOnOtherWorkspace = !window->InWorkspace(fCurrentWorkspace); if (windowOnOtherWorkspace && (window->Flags() & B_NOT_ANCHORED_ON_ACTIVATE) == 0) { @@ -1087,8 +1142,6 @@ Window* frontmost = window->Frontmost(); - InvokeActivateWindow(window, windows); - CurrentWindows().RemoveWindow(window); windows.AddWindow(window); Modified: haiku/branches/features/stack-and-tile/src/servers/app/Desktop.h =================================================================== --- haiku/branches/features/stack-and-tile/src/servers/app/Desktop.h 2010-06-03 00:08:00 UTC (rev 37003) +++ haiku/branches/features/stack-and-tile/src/servers/app/Desktop.h 2010-06-03 05:40:37 UTC (rev 37004) @@ -74,8 +74,7 @@ virtual void MouseUp(Window* window) = 0; virtual void MoveWindow(Window* window) = 0; virtual void ResizeWindow(Window* window) = 0; - virtual void ActivateWindow(Window* window, - WindowList& bringToTopList) = 0; + virtual void ActivateWindow(Window* window) = 0; virtual bool SetDecoratorSettings(Window* window, const BMessage& settings) = 0; @@ -88,6 +87,8 @@ class DesktopObservable { public: + DesktopObservable(); + void RegisterListener(DesktopListener* listener); void UnregisterListener(DesktopListener* listener); @@ -100,13 +101,23 @@ void InvokeMouseUp(Window* window); void InvokeMoveWindow(Window* window); void InvokeResizeWindow(Window* window); - void InvokeActivateWindow(Window* window, - WindowList& bringToTopList); + void InvokeActivateWindow(Window* window); bool InvokeSetDecoratorSettings(Window* window, const BMessage& settings); private: + class InvokeGuard{ + public: + InvokeGuard(bool& invoking); + ~InvokeGuard(); + private: + bool& fInvoking; + }; + DesktopListenerList fDesktopListenerList; + + // prevent recursive invokes + bool fWeAreInvoking; }; Modified: haiku/branches/features/stack-and-tile/src/servers/app/Snapping.cpp =================================================================== --- haiku/branches/features/stack-and-tile/src/servers/app/Snapping.cpp 2010-06-03 00:08:00 UTC (rev 37003) +++ haiku/branches/features/stack-and-tile/src/servers/app/Snapping.cpp 2010-06-03 05:40:37 UTC (rev 37004) @@ -119,7 +119,7 @@ void -SATWindowSnapping::ActivateWindow(Window* window, WindowList& bringToTopList) +SATWindowSnapping::ActivateWindow(Window* window) { BObjectList<Window> stackedAndTiledWindows; @@ -144,11 +144,10 @@ // Do the actual moving here for (int i = 0; i < stackedAndTiledWindows.CountItems(); i ++) { Window* win = stackedAndTiledWindows.ItemAt(i); - fWindow->Desktop()->CurrentWindows().RemoveWindow(win); - bringToTopList.AddWindow(win); + fWindow->Desktop()->ActivateWindow(win); } - SATWindow::ActivateWindow(window, bringToTopList); + SATWindow::ActivateWindow(window); } Modified: haiku/branches/features/stack-and-tile/src/servers/app/StackAndTile.cpp =================================================================== --- haiku/branches/features/stack-and-tile/src/servers/app/StackAndTile.cpp 2010-06-03 00:08:00 UTC (rev 37003) +++ haiku/branches/features/stack-and-tile/src/servers/app/StackAndTile.cpp 2010-06-03 05:40:37 UTC (rev 37004) @@ -155,14 +155,13 @@ void -StackAndTile::ActivateWindow(Window* window, - WindowList& bringToTopList) +StackAndTile::ActivateWindow(Window* window) { SATWindow* satWindow = GetSATWindow(window); if (!satWindow) return; - satWindow->ActivateWindow(window, bringToTopList); + satWindow->ActivateWindow(window); } @@ -313,9 +312,9 @@ void -SATWindow::ActivateWindow(Window* window, WindowList& bringToTopList) +SATWindow::ActivateWindow(Window* window) { - fStacking.ActivateWindow(window, bringToTopList); + fStacking.ActivateWindow(window); } Modified: haiku/branches/features/stack-and-tile/src/servers/app/StackAndTile.h =================================================================== --- haiku/branches/features/stack-and-tile/src/servers/app/StackAndTile.h 2010-06-03 00:08:00 UTC (rev 37003) +++ haiku/branches/features/stack-and-tile/src/servers/app/StackAndTile.h 2010-06-03 05:40:37 UTC (rev 37004) @@ -47,8 +47,7 @@ void MouseUp(Window* window); void MoveWindow(Window* window); void ResizeWindow(Window* window); - void ActivateWindow(Window* window, - WindowList& bringToTopList); + void ActivateWindow(Window* window); bool SetDecoratorSettings(Window* window, const BMessage& settings); @@ -89,8 +88,7 @@ virtual void MouseUp(); virtual void MoveWindow(); virtual void ResizeWindow(); - virtual void ActivateWindow(Window* window, - WindowList& bringToTopList); + virtual void ActivateWindow(Window* window); virtual bool SetSettings(const BMessage& settings); virtual bool GetSettings(BMessage* settings) const; @@ -135,8 +133,7 @@ virtual void MouseUp(); virtual void MoveWindow(); virtual void ResizeWindow(); - virtual void ActivateWindow(Window* window, - WindowList& bringToTopList); + virtual void ActivateWindow(Window* window); virtual bool SetSettings(const BMessage& settings); virtual bool GetSettings(BMessage* settings) const; @@ -202,8 +199,7 @@ virtual void MouseUp(); virtual void MoveWindow(); virtual void ResizeWindow(); - virtual void ActivateWindow(Window* window, - WindowList& bringToTopList); + virtual void ActivateWindow(Window* window); virtual bool SetSettings(const BMessage& settings); virtual bool GetSettings(BMessage* settings) const; Modified: haiku/branches/features/stack-and-tile/src/servers/app/Stacking.cpp =================================================================== --- haiku/branches/features/stack-and-tile/src/servers/app/Stacking.cpp 2010-06-03 00:08:00 UTC (rev 37003) +++ haiku/branches/features/stack-and-tile/src/servers/app/Stacking.cpp 2010-06-03 05:40:37 UTC (rev 37004) @@ -86,27 +86,17 @@ void -Stacking::ActivateWindow(Window* window, ::WindowList& bringToTopList) +Stacking::ActivateWindow(Window* window) { - BObjectList<Window> stackedAndTiledWindows; - // And then prepare to move stacked windows to the front SATWindowList* stackedWindows = StackedWindows(); if (stackedWindows) { for (int i = 0; i < stackedWindows->CountItems(); i++) { Window* stackedWindow = stackedWindows->ItemAt(i)->GetWindow(); - if (stackedWindow != window - && !stackedAndTiledWindows.HasItem(stackedWindow)) - stackedAndTiledWindows.AddItem(stackedWindow); + if (stackedWindow != window) + fSATWindow->Desktop()->ActivateWindow(stackedWindow); } } - - // Do the actual moving here - for (int i = 0; i < stackedAndTiledWindows.CountItems(); i ++) { - Window* win = stackedAndTiledWindows.ItemAt(i); - fSATWindow->Desktop()->CurrentWindows().RemoveWindow(win); - bringToTopList.AddWindow(win); - } }