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