Author: czeidler Date: 2010-08-05 00:09:57 +0200 (Thu, 05 Aug 2010) New Revision: 37912 Changeset: http://dev.haiku-os.org/changeset/37912 Modified: haiku/trunk/src/servers/app/Desktop.cpp haiku/trunk/src/servers/app/Desktop.h haiku/trunk/src/servers/app/DesktopListener.cpp haiku/trunk/src/servers/app/DesktopListener.h Log: - Notify listener when they are registered and unregistered. - First reload decorators and then the listeners. (my SAT listener caches the decorator when it is registered so the new one should already be loaded) - Make the Desktop all window list accessible, help full when a listener is registered and want to iterate over the existing windows. Modified: haiku/trunk/src/servers/app/Desktop.cpp =================================================================== --- haiku/trunk/src/servers/app/Desktop.cpp 2010-08-04 22:01:43 UTC (rev 37911) +++ haiku/trunk/src/servers/app/Desktop.cpp 2010-08-04 22:09:57 UTC (rev 37912) @@ -359,6 +359,12 @@ return; fLink.SetReceiverPort(fMessagePort); + + // register listeners + const DesktopListenerList& newListeners + = gDecorManager.GetDesktopListeners(); + for (int i = 0; i < newListeners.CountItems(); i++) + RegisterListener(newListeners.ItemAt(i)); } @@ -372,6 +378,13 @@ } +void +Desktop::RegisterListener(DesktopListener* listener) +{ + DesktopObservable::RegisterListener(listener, this); +} + + status_t Desktop::Init() { @@ -1906,6 +1919,20 @@ { AutoWriteLocker _(fWindowLock); + for (Window* window = fAllWindows.FirstWindow(); window != NULL; + window = window->NextWindow(kAllWindowList)) { + BRegion oldBorder; + window->GetBorderRegion(&oldBorder); + + window->ReloadDecor(); + + BRegion border; + window->GetBorderRegion(&border); + + border.Include(&oldBorder); + _RebuildAndRedrawAfterWindowChange(window, border); + } + // TODO it is assumed all listeners are registered by one decor // unregister old listeners const DesktopListenerDLList& currentListeners = GetDesktopListenerList(); @@ -1917,22 +1944,6 @@ = gDecorManager.GetDesktopListeners(); for (int i = 0; i < newListeners.CountItems(); i++) RegisterListener(newListeners.ItemAt(i)); - - for (int32 i = 0; i < kMaxWorkspaces; i++) { - for (Window* window = _Windows(i).LastWindow(); window; - window = window->PreviousWindow(i)) { - BRegion oldBorder; - window->GetBorderRegion(&oldBorder); - - window->ReloadDecor(); - - BRegion border; - window->GetBorderRegion(&border); - - border.Include(&oldBorder); - _RebuildAndRedrawAfterWindowChange(window, border); - } - } } @@ -2464,6 +2475,13 @@ WindowList& +Desktop::AllWindows() +{ + return fAllWindows; +} + + +WindowList& Desktop::_Windows(int32 index) { return fWorkspaces[index].Windows(); Modified: haiku/trunk/src/servers/app/Desktop.h =================================================================== --- haiku/trunk/src/servers/app/Desktop.h 2010-08-04 22:01:43 UTC (rev 37911) +++ haiku/trunk/src/servers/app/Desktop.h 2010-08-04 22:09:57 UTC (rev 37912) @@ -65,6 +65,8 @@ Desktop(uid_t userID, const char* targetScreen); virtual ~Desktop(); + void RegisterListener(DesktopListener* listener); + status_t Init(); uid_t UserID() const { return fUserID; } @@ -251,6 +253,7 @@ BPrivate::LinkSender& sender); WindowList& CurrentWindows(); + WindowList& AllWindows(); private: WindowList& _Windows(int32 index); Modified: haiku/trunk/src/servers/app/DesktopListener.cpp =================================================================== --- haiku/trunk/src/servers/app/DesktopListener.cpp 2010-08-04 22:01:43 UTC (rev 37911) +++ haiku/trunk/src/servers/app/DesktopListener.cpp 2010-08-04 22:09:57 UTC (rev 37912) @@ -25,9 +25,10 @@ void -DesktopObservable::RegisterListener(DesktopListener* listener) +DesktopObservable::RegisterListener(DesktopListener* listener, Desktop* desktop) { fDesktopListenerList.Add(listener); + listener->ListenerRegistered(desktop); } @@ -35,6 +36,7 @@ DesktopObservable::UnregisterListener(DesktopListener* listener) { fDesktopListenerList.Remove(listener); + listener->ListenerUnregistered(); } Modified: haiku/trunk/src/servers/app/DesktopListener.h =================================================================== --- haiku/trunk/src/servers/app/DesktopListener.h 2010-08-04 22:01:43 UTC (rev 37911) +++ haiku/trunk/src/servers/app/DesktopListener.h 2010-08-04 22:09:57 UTC (rev 37912) @@ -15,6 +15,7 @@ class BMessage; +class Desktop; class Window; @@ -22,6 +23,9 @@ public: virtual ~DesktopListener(); + virtual void ListenerRegistered(Desktop* desktop) = 0; + virtual void ListenerUnregistered() = 0; + virtual void AddWindow(Window* window) = 0; virtual void RemoveWindow(Window* window) = 0; @@ -61,7 +65,8 @@ public: DesktopObservable(); - void RegisterListener(DesktopListener* listener); + void RegisterListener(DesktopListener* listener, + Desktop* desktop); void UnregisterListener(DesktopListener* listener); const DesktopListenerDLList& GetDesktopListenerList();