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..905cf3f96b8e72c972c89f0436c02a45e7ebc605 100644 --- a/dmserver/src/display_manager_service.cpp +++ b/dmserver/src/display_manager_service.cpp @@ -91,6 +91,31 @@ DisplayId DisplayManagerService::CreateVirtualDisplay(const VirtualDisplayInfo & virtualDisplayInfo.name_.c_str(), virtualDisplayInfo.width_, virtualDisplayInfo.height_, virtualDisplayInfo.displayIdToMirror_, virtualDisplayInfo.flags_); ScreenId screenId = AbstractDisplayManager::GetInstance().CreateVirtualScreen(virtualDisplayInfo, surface); + if (screenId == DISPLAY_ID_INVALD) { + WLOGFE("DisplayManagerService: Get virtualScreenId failed"); + return DISPLAY_ID_INVALD; + } +#ifdef FOUNDATION_DMSERVER_RSDISPLAYNODE + if (virtualDisplayInfo.displayIdToMirror_ != DISPLAY_ID_INVALD) { + std::shared_ptr displayNode = + SingletonContainer::Get().GetDisplayNode(virtualDisplayInfo.displayIdToMirror_); + if (displayNode == nullptr) { + WLOGFE("DisplayManagerService: GetDisplayNode failed, displayNode is nullptr"); + AbstractDisplayManager::GetInstance().DestroyVirtualScreen(screenId); + return DISPLAY_ID_INVALD; + } + NodeId nodeId = displayNode->GetId(); + if (nodeId == nullptr) { + WLOGFE("DisplayManagerService: Mirror mode failed, displayNodeId is nullptr"); + AbstractDisplayManager::GetInstance().DestroyVirtualScreen(screenId); + return DISPLAY_ID_INVALD; + } + + struct RSDisplayNodeConfig config = {screenId, true, nodeId}; + displayNodeMap_[screenId] = RSDisplayNode::Create(config); + WLOGFI("DisplayManagerService::NodeId: %{public}" PRIu64 "", nodeId >> 32); + } +#endif return GetDisplayIdFromScreenId(screenId); } @@ -98,6 +123,18 @@ bool DisplayManagerService::DestroyVirtualDisplay(DisplayId displayId) { WLOGFI("DisplayManagerService::DestroyVirtualDisplay"); ScreenId screenId = GetScreenIdFromDisplayId(displayId); +#ifdef FOUNDATION_DMSERVER_RSDISPLAYNODE + if (screenId == DISPLAY_ID_INVALD) { + WLOGFE("DisplayManagerService: virtualScreenId is invalid"); + return false; + } + if (displayNodeMap_[screenId] == nullptr) { + WLOGFE("DisplayManagerService: Mirror mode failed, displayNodeId is nullptr"); + return AbstractDisplayManager::GetInstance().DestroyVirtualScreen(screenId); + } + 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..8f39c96a6fbb5fc218689e52a0ae4e9e89a730b3 100644 --- a/wmserver/src/window_manager_service.cpp +++ b/wmserver/src/window_manager_service.cpp @@ -239,5 +239,19 @@ void WindowManagerService::RestoreSuspendedWindows() std::lock_guard lock(mutex_); // TODO: restore windows covered by keyguard } + +std::shared_ptr WindowManagerService::GetDisplayNode(int32_t displayId) const +{ + if (windowRoot_ == nullptr) { + WLOGFE("WindowManagerService: get windowRoot failed, windowRoot is nullptr"); + return nullptr; + } + sptr windowNodeContainer = windowRoot_->GetOrCreateWindowNodeContainer(displayId); + if (windowNodeContainer == nullptr) { + WLOGFE("WindowManagerService: get windowNodeContainer failed, windowNodeContainer is nullptr"); + return nullptr; + } + return windowNodeContainer->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_; +} } }