diff --git a/headers/os/interface/Window.h b/headers/os/interface/Window.h index c59a5494b2..004f004b7f 100644 --- a/headers/os/interface/Window.h +++ b/headers/os/interface/Window.h @@ -365,6 +365,7 @@ private: void _GetDecoratorSize(float* _borderWidth, float* _tabHeight) const; void _SendShowOrHideMessage(); + void _PropagateMessageToChildViews(BMessage*); private: char* fTitle; diff --git a/src/kits/interface/View.cpp b/src/kits/interface/View.cpp index 7671604ac4..74821b4029 100644 --- a/src/kits/interface/View.cpp +++ b/src/kits/interface/View.cpp @@ -5122,13 +5122,19 @@ BView::MessageReceived(BMessage* message) break; case B_SCREEN_CHANGED: + case B_WORKSPACE_ACTIVATED: + case B_WORKSPACES_CHANGED: { - // propegate message to child views + BWindow* window = Window(); + if (window == NULL) + break; + + // propagate message to child views int32 childCount = CountChildren(); for (int32 i = 0; i < childCount; i++) { BView* view = ChildAt(i); if (view != NULL) - view->MessageReceived(message); + window->PostMessage(message, view); } break; } diff --git a/src/kits/interface/Window.cpp b/src/kits/interface/Window.cpp index a4c409f58e..2686607f6e 100644 --- a/src/kits/interface/Window.cpp +++ b/src/kits/interface/Window.cpp @@ -1113,13 +1113,7 @@ FrameMoved(origin); uint32 mode; if (message->FindRect("frame", &frame) == B_OK && message->FindInt32("mode", (int32*)&mode) == B_OK) { - // propegate message to child views - int32 childCount = CountChildren(); - for (int32 i = 0; i < childCount; i++) { - BView* view = ChildAt(i); - if (view != NULL) - view->MessageReceived(message); - } + _PropagateMessageToChildViews(message); // call hook method ScreenChanged(frame, (color_space)mode); } @@ -1132,18 +1126,25 @@ FrameMoved(origin); uint32 workspace; bool active; if (message->FindInt32("workspace", (int32*)&workspace) == B_OK - && message->FindBool("active", &active) == B_OK) + && message->FindBool("active", &active) == B_OK) { + _PropagateMessageToChildViews(message); + // call hook method WorkspaceActivated(workspace, active); + } } else target->MessageReceived(message); break; case B_WORKSPACES_CHANGED: if (target == this) { - uint32 oldWorkspace, newWorkspace; + uint32 oldWorkspace; + uint32 newWorkspace; if (message->FindInt32("old", (int32*)&oldWorkspace) == B_OK - && message->FindInt32("new", (int32*)&newWorkspace) == B_OK) + && message->FindInt32("new", (int32*)&newWorkspace) == B_OK) { + _PropagateMessageToChildViews(message); + // call hook method WorkspacesChanged(oldWorkspace, newWorkspace); + } } else target->MessageReceived(message); break; @@ -4083,6 +4084,18 @@ BWindow::_SendShowOrHideMessage() } +void +BWindow::_PropagateMessageToChildViews(BMessage* message) +{ + int32 childrenCount = CountChildren(); + for (int32 index = 0; index < childrenCount; index++) { + BView* view = ChildAt(index); + if (view != NULL) + PostMessage(message, view); + } +} + + // #pragma mark - C++ binary compatibility kludge