From 3ef6915cf36e2c650e0ec54d77e184f3179a99b0 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Sat, 30 Jul 2022 13:42:37 -0400 Subject: [PATCH] IK: Propagate B_WORKSPACE_ACTIVATED to child views MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... and B_WORKSPACES_CHANGED too. hrev50148 propagated B_SCREEN_CHANGED messages to children allowing them to respond to screen changes fixing #8035 back in 2016. This does the same thing for workspace messages only I spelled propagate correctly this time. Add private _PropagateMessageToChildViews() convinience method to BWindow to do this work. Call PostMessage() instead of calling MessageReceived() directly which can work better in certain circumstances. Change-Id: I5978c3fe674bbe75d9eafb7afb654a49ee3e0c11 Reviewed-on: https://review.haiku-os.org/c/haiku/+/5516 Reviewed-by: Axel Dörfler Reviewed-by: waddlesplash --- headers/os/interface/Window.h | 1 + src/kits/interface/View.cpp | 10 ++++++++-- src/kits/interface/Window.cpp | 33 +++++++++++++++++++++++---------- 3 files changed, 32 insertions(+), 12 deletions(-) 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