[haiku-commits] r37004 - haiku/branches/features/stack-and-tile/src/servers/app

  • From: clemens.zeidler@xxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 3 Jun 2010 07:40:37 +0200 (CEST)

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


Other related posts:

  • » [haiku-commits] r37004 - haiku/branches/features/stack-and-tile/src/servers/app - clemens . zeidler