diff --git a/dmserver/include/display_manager_service.h b/dmserver/include/display_manager_service.h index 05bca8099739a2ae959fa910b60f56b65c80f6f6..b26d2498b1072b54607c3a5b24285f5f20a693a2 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 5907c5b93706b1319df6ce0e0ad37cd965d0ac1b..9f40069198316407e23536f933eed0a97060af71 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 2cee42de12eaa89f08936248270da22edce82eea..883b67cde93d3fd68d320579a09ee18986d4e7af 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 04430981cf25d6a0acc1192053eabdbad8fa45fa..66b360203d8812d7840ba79ac27928ffa8c2e628 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 594f9a0f6c88f8d4db67d330a8c73677435da8fb..1c613860ae7c36e366eeb3e4673088249b8b02f6 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 38dc36447ef356b971a101b09dae80f0f90dc7bc..6cb62ec7862bae9399ad78ad43468a42cdd38a20 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_; +} } }