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

  • From: clemens.zeidler@xxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 20 May 2010 01:27:19 +0200 (CEST)

Author: czeidler
Date: 2010-05-20 01:27:19 +0200 (Thu, 20 May 2010)
New Revision: 36869
Changeset: http://dev.haiku-os.org/changeset/36869/haiku

Modified:
   haiku/branches/features/stack-and-tile/src/servers/app/Desktop.cpp
   haiku/branches/features/stack-and-tile/src/servers/app/Desktop.h
Log:
Add a basic, unfinished observer interface into Desktop.



Modified: haiku/branches/features/stack-and-tile/src/servers/app/Desktop.cpp
===================================================================
--- haiku/branches/features/stack-and-tile/src/servers/app/Desktop.cpp  
2010-05-19 23:01:17 UTC (rev 36868)
+++ haiku/branches/features/stack-and-tile/src/servers/app/Desktop.cpp  
2010-05-19 23:27:19 UTC (rev 36869)
@@ -249,12 +249,14 @@
                switch (message->what) {
                        case B_MOUSE_DOWN:
                                window->MouseDown(message, where, &viewToken);
+                               fDesktop->InvokeMouseDown(window);
                                break;
 
                        case B_MOUSE_UP:
                                window->MouseUp(message, where, &viewToken);
                                if (buttons == 0)
                                        fDesktop->SetMouseEventWindow(NULL);
+                               fDesktop->InvokeMouseUp(window);
                                break;
 
                        case B_MOUSE_MOVED:
@@ -291,6 +293,118 @@
 //     #pragma mark -
 
 
+DesktopListener::~DesktopListener()
+{
+       
+}
+
+
+AnchorList<DesktopListener>::list_anchor&
+DesktopListener::Anchor()
+{
+       return fAnchor;
+}
+
+
+void
+DesktopObservable::RegisterListener(DesktopListener* listener)
+{
+       fDesktopListenerList.AddItem(listener);
+}
+
+
+void
+DesktopObservable::UnregisterListener(DesktopListener* listener)
+{
+       fDesktopListenerList.RemoveItem(listener);
+}
+
+
+#define FOR_ALL_DESKTOP_LISTENER                                               
                                        \
+       for (DesktopListener* listener = fDesktopListenerList.FirstItem();      
        \
+               listener != NULL; listener = 
fDesktopListenerList.NextItem(listener))
+
+
+void
+DesktopObservable::InvokeWindowAdded(Window* window)
+{
+       FOR_ALL_DESKTOP_LISTENER
+               listener->WindowAdded(window);
+}
+
+
+void
+DesktopObservable::InvokeWindowRemoved(Window* window)
+{
+       FOR_ALL_DESKTOP_LISTENER
+               listener->WindowRemoved(window);
+}
+
+
+void
+DesktopObservable::InvokeKeyEvent(uint32 what, int32 key, int32 modifiers)
+{
+       FOR_ALL_DESKTOP_LISTENER
+               listener->KeyEvent(what, key, modifiers);       
+}
+
+
+void
+DesktopObservable::InvokeMouseDown(Window* window)
+{
+       FOR_ALL_DESKTOP_LISTENER
+               listener->MouseDown(window);
+}
+
+
+void
+DesktopObservable::InvokeMouseUp(Window* window)
+{
+       FOR_ALL_DESKTOP_LISTENER
+               listener->MouseUp(window);
+}
+
+
+void
+DesktopObservable::InvokeMoveWindow(Window* window)
+{
+       FOR_ALL_DESKTOP_LISTENER
+               listener->MoveWindow(window);
+}
+
+
+void
+DesktopObservable::InvokeResizeWindow(Window* window)
+{
+       FOR_ALL_DESKTOP_LISTENER
+               listener->ResizeWindow(window);
+}
+
+
+void
+DesktopObservable::InvokeActivateWindow(Window* window,
+       WindowList& bringToTopList)
+{
+       FOR_ALL_DESKTOP_LISTENER
+               listener->ActivateWindow(window, bringToTopList);
+}
+
+
+bool
+DesktopObservable::InvokeSetDecoratorSettings(Window* window,
+       const BMessage& settings)
+{
+       bool changed = false;
+       FOR_ALL_DESKTOP_LISTENER
+               changed = changed | listener->SetDecoratorSettings(window, 
settings);
+
+       return changed;
+}
+
+
+//     #pragma mark -
+
+
 static inline uint32
 workspace_to_workspaces(int32 index)
 {
@@ -475,7 +589,7 @@
 void
 Desktop::KeyEvent(uint32 what, int32 key, int32 modifiers)
 {
-       return fStackAndTile->KeyEvent(what, key, modifiers);
+       InvokeKeyEvent(what, key, modifiers);
 }
 
 
@@ -977,9 +1091,8 @@
 
        Window* frontmost = window->Frontmost();
 
-       //stack and tile
-       window->GetStackAndTileWindow()->ActivateWindow(window, windows);
-       
+       InvokeActivateWindow(window, windows);
+
        CurrentWindows().RemoveWindow(window);
        windows.AddWindow(window);
 
@@ -1180,8 +1293,10 @@
 
                        window->Anchor(workspace).position += BPoint(x, y);
                        _WindowChanged(window);
-               } else
+               } else {
                        window->MoveBy((int32)x, (int32)y);
+                       InvokeMoveWindow(window);
+               }
 
                UnlockAllWindows();
                return;
@@ -1198,6 +1313,7 @@
        }
 
        window->MoveBy((int32)x, (int32)y);
+       InvokeMoveWindow(window);
 
        BRegion background;
        _RebuildClippingForAllWindows(background);
@@ -1252,6 +1368,7 @@
 
        if (!window->IsVisible()) {
                window->ResizeBy((int32)x, (int32)y, NULL);
+               InvokeResizeWindow(window);
                UnlockAllWindows();
                return;
        }
@@ -1271,6 +1388,7 @@
        }
 
        window->ResizeBy((int32)x, (int32)y, &newDirtyRegion);
+       InvokeResizeWindow(window);
 
        BRegion background;
        _RebuildClippingForAllWindows(background);
@@ -1319,7 +1437,8 @@
 
        BRegion dirty;
        bool changed = window->SetDecoratorSettings(settings, dirty);
-       if (changed)
+       bool listenerChanged = InvokeSetDecoratorSettings(window, settings);
+       if (changed || listenerChanged)
                _RebuildAndRedrawAfterWindowChange(window, dirty);
 
        return changed;
@@ -1365,6 +1484,9 @@
        }
 
        _ChangeWindowWorkspaces(window, 0, window->Workspaces());
+       
+       InvokeWindowAdded(window);
+
        UnlockAllWindows();
 }
 
@@ -1382,6 +1504,9 @@
                fSubsetWindows.RemoveWindow(window);
 
        _ChangeWindowWorkspaces(window, window->Workspaces(), 0);
+       
+       InvokeWindowRemoved(window);
+
        UnlockAllWindows();
 
        // make sure this window won't get any events anymore

Modified: haiku/branches/features/stack-and-tile/src/servers/app/Desktop.h
===================================================================
--- haiku/branches/features/stack-and-tile/src/servers/app/Desktop.h    
2010-05-19 23:01:17 UTC (rev 36868)
+++ haiku/branches/features/stack-and-tile/src/servers/app/Desktop.h    
2010-05-19 23:27:19 UTC (rev 36869)
@@ -13,6 +13,7 @@
 #define DESKTOP_H
 
 
+#include "AnchorList.h"
 #include "CursorManager.h"
 #include "DesktopSettings.h"
 #include "EventDispatcher.h"
@@ -59,7 +60,61 @@
 };
 
 
-class Desktop : public MessageLooper, public ScreenOwner {
+class DesktopListener
+{
+       public:
+       virtual                                         ~DesktopListener();
+
+       virtual void                            WindowAdded(Window* window) = 0;
+       virtual void                            WindowRemoved(Window* window) = 
0;
+       
+       virtual void                            KeyEvent(uint32 what, int32 key,
+                                                                       int32 
modifiers) = 0;
+       virtual void                            MouseDown(Window* window) = 0;
+       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 bool                            SetDecoratorSettings(Window* 
window,
+                                                                       const 
BMessage& settings) = 0;
+
+
+                       AnchorList<DesktopListener>::list_anchor&       
Anchor();
+
+       private:
+               AnchorList<DesktopListener>::list_anchor        fAnchor;
+};
+
+
+class DesktopObservable
+{
+       public:
+               void                            
RegisterListener(DesktopListener* listener);
+               void                            
UnregisterListener(DesktopListener* listener);
+
+               void                            InvokeWindowAdded(Window* 
window);
+               void                            InvokeWindowRemoved(Window* 
window);
+
+               void                            InvokeKeyEvent(uint32 what, 
int32 key,
+                                                               int32 
modifiers);
+               void                            InvokeMouseDown(Window* window);
+               void                            InvokeMouseUp(Window* window);
+               void                            InvokeMoveWindow(Window* 
window);
+               void                            InvokeResizeWindow(Window* 
window);
+               void                            InvokeActivateWindow(Window* 
window,
+                                                               WindowList& 
bringToTopList);
+               bool                            
InvokeSetDecoratorSettings(Window* window,
+                                                               const BMessage& 
settings);
+
+       private:
+               AnchorList<DesktopListener>             fDesktopListenerList;
+};
+
+
+class Desktop : public DesktopObservable, public MessageLooper,
+       public ScreenOwner {
 public:
                                                                Desktop(uid_t 
userID, const char* targetScreen);
        virtual                                         ~Desktop();


Other related posts:

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