From 0b18195ef9587f996ff1133da60d3ff04b41eaf2 Mon Sep 17 00:00:00 2001 From: Grady Date: Tue, 11 Jan 2022 15:54:42 +0800 Subject: [PATCH] Save RSDisplayNode in DMS Signed-off-by: Grady Change-Id: I78be363b5170d347a95d654518c08f84658dded4 --- dmserver/include/display_manager_service.h | 3 +++ dmserver/src/display_manager_service.cpp | 14 ++++++++++++++ wmserver/include/window_manager_service.h | 1 + wmserver/include/window_node_container.h | 1 + wmserver/src/window_manager_service.cpp | 5 +++++ wmserver/src/window_node_container.cpp | 5 +++++ 6 files changed, 29 insertions(+) diff --git a/dmserver/include/display_manager_service.h b/dmserver/include/display_manager_service.h index 05bca80997..b26d2498b1 100644 --- a/dmserver/include/display_manager_service.h +++ b/dmserver/include/display_manager_service.h @@ -61,6 +61,9 @@ private: static inline SingletonDelegator delegator_; std::map> abstractDisplayMap_; DisplayPowerController displayPowerController_; +#ifdef FOUNDATION_DMSERVER_RSDISPLAYNODE + std::map> displayNodeMap_; +#endif }; } // namespace OHOS::Rosen diff --git a/dmserver/src/display_manager_service.cpp b/dmserver/src/display_manager_service.cpp index 5907c5b937..9f40069198 100644 --- a/dmserver/src/display_manager_service.cpp +++ b/dmserver/src/display_manager_service.cpp @@ -91,6 +91,16 @@ DisplayId DisplayManagerService::CreateVirtualDisplay(const VirtualDisplayInfo & virtualDisplayInfo.name_.c_str(), virtualDisplayInfo.width_, virtualDisplayInfo.height_, virtualDisplayInfo.displayIdToMirror_, virtualDisplayInfo.flags_); ScreenId screenId = AbstractDisplayManager::GetInstance().CreateVirtualScreen(virtualDisplayInfo, surface); +#ifdef FOUNDATION_DMSERVER_RSDISPLAYNODE + if (virtualDisplayInfo.displayIdToMirror_ != DISPLAY_ID_INVALD) { + std::shared_ptr displayNode = + SingletonContainer::Get().GetDisplayNode(virtualDisplayInfo.displayIdToMirror_); + NodeId id = displayNode->GetId(); + struct RSDisplayNodeConfig config = {screenId, true, id}; + displayNodeMap_[screenId] = RSDisplayNode::Create(config); + WLOGFI("DisplayManagerService::NodeId: %{public}" PRIu64 "", id >> 32); + } +#endif return GetDisplayIdFromScreenId(screenId); } @@ -98,6 +108,10 @@ bool DisplayManagerService::DestroyVirtualDisplay(DisplayId displayId) { WLOGFI("DisplayManagerService::DestroyVirtualDisplay"); ScreenId screenId = GetScreenIdFromDisplayId(displayId); +#ifdef FOUNDATION_DMSERVER_RSDISPLAYNODE + displayNodeMap_[screenId]->RemoveFromTree(); + displayNodeMap_.erase(screenId); +#endif return AbstractDisplayManager::GetInstance().DestroyVirtualScreen(screenId); } diff --git a/wmserver/include/window_manager_service.h b/wmserver/include/window_manager_service.h index 2cee42de12..883b67cde9 100644 --- a/wmserver/include/window_manager_service.h +++ b/wmserver/include/window_manager_service.h @@ -55,6 +55,7 @@ public: void RegisterFocusChangedListener(const sptr& windowManagerAgent) override; void UnregisterFocusChangedListener(const sptr& windowManagerAgent) override; + std::shared_ptr GetDisplayNode(int32_t displayId) const; // Inner interfaces WMError NotifyDisplaySuspend(); diff --git a/wmserver/include/window_node_container.h b/wmserver/include/window_node_container.h index 04430981cf..66b360203d 100644 --- a/wmserver/include/window_node_container.h +++ b/wmserver/include/window_node_container.h @@ -45,6 +45,7 @@ public: Rect GetDisplayRect() const; sptr GetTopImmersiveNode() const; void NotifySystemBarIfChanged(); + std::shared_ptr GetDisplayNode() const; private: void AssignZOrder(sptr& node); diff --git a/wmserver/src/window_manager_service.cpp b/wmserver/src/window_manager_service.cpp index 594f9a0f6c..1c613860ae 100644 --- a/wmserver/src/window_manager_service.cpp +++ b/wmserver/src/window_manager_service.cpp @@ -239,5 +239,10 @@ void WindowManagerService::RestoreSuspendedWindows() std::lock_guard lock(mutex_); // TODO: restore windows covered by keyguard } + +std::shared_ptr WindowManagerService::GetDisplayNode(int32_t displayId) const +{ + return windowRoot_->GetOrCreateWindowNodeContainer(displayId)->GetDisplayNode(); +} } } \ No newline at end of file diff --git a/wmserver/src/window_node_container.cpp b/wmserver/src/window_node_container.cpp index 38dc36447e..6cb62ec786 100644 --- a/wmserver/src/window_node_container.cpp +++ b/wmserver/src/window_node_container.cpp @@ -451,5 +451,10 @@ Rect WindowNodeContainer::GetDisplayRect() const { return displayRect_; } + +std::shared_ptr WindowNodeContainer::GetDisplayNode() const +{ + return displayNode_; +} } } -- Gitee