diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index d6dc179c5f..a0abb3a4c2 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -2047,18 +2047,18 @@ Desktop::RedrawBackground() bool -Desktop::ReloadDecor() +Desktop::ReloadDecor(DecorAddOn* oldDecor) { AutoWriteLocker _(fWindowLock); bool returnValue = true; - // TODO it is assumed all listeners are registered by one decor - // unregister old listeners - const DesktopListenerDLList& currentListeners = GetDesktopListenerList(); - for (DesktopListener* listener = currentListeners.First(); - listener != NULL; listener = currentListeners.GetNext(listener)) - UnregisterListener(listener); + if (oldDecor != NULL) { + const DesktopListenerList* oldListeners + = &oldDecor->GetDesktopListeners(); + for (int i = 0; i < oldListeners->CountItems(); i++) + UnregisterListener(oldListeners->ItemAt(i)); + } for (Window* window = fAllWindows.FirstWindow(); window != NULL; window = window->NextWindow(kAllWindowList)) { diff --git a/src/servers/app/Desktop.h b/src/servers/app/Desktop.h index ae663ac690..39cb7a5a01 100644 --- a/src/servers/app/Desktop.h +++ b/src/servers/app/Desktop.h @@ -39,6 +39,7 @@ class BMessage; +class DecorAddOn; class DrawingEngine; class HWInterface; class ServerApp; @@ -221,7 +222,7 @@ public: void Redraw(); void RedrawBackground(); - bool ReloadDecor(); + bool ReloadDecor(DecorAddOn* oldDecor); BRegion& BackgroundRegion() { return fBackgroundRegion; } diff --git a/src/servers/app/decorator/DecorManager.cpp b/src/servers/app/decorator/DecorManager.cpp index c06ef07dc7..a020e20909 100644 --- a/src/servers/app/decorator/DecorManager.cpp +++ b/src/servers/app/decorator/DecorManager.cpp @@ -243,13 +243,14 @@ DecorManager::SetDecorator(BString path, Desktop* desktop) return error == B_OK ? B_ERROR : error; DecorAddOn* oldDecor = fCurrentDecor; + BString oldPath = fCurrentDecorPath; image_id oldImage = fCurrentDecor->ImageID(); fCurrentDecor = newDecor; fCurrentDecorPath = path.String(); - if (desktop->ReloadDecor()) { + if (desktop->ReloadDecor(oldDecor)) { // now safe to unload all old decorator data // saves us from deleting oldDecor... unload_add_on(oldImage);