diff --git a/dm/src/display_manager.cpp b/dm/src/display_manager.cpp index 2df4a0af41512d8cb6456be7a9dc131f431a4282..2cc87bc92e33878746d59608f331862c947a248b 100644 --- a/dm/src/display_manager.cpp +++ b/dm/src/display_manager.cpp @@ -136,7 +136,7 @@ std::vector> DisplayManager::GetAllDisplays() if (display != nullptr) { res.push_back(display); } else { - WLOGFE("DisplayManager::GetAllDisplays display %" PRIu64" nullptr!", displayId); + WLOGFE("DisplayManager::GetAllDisplays display %{public}" PRIu64" nullptr!", displayId); } } return res; diff --git a/dmserver/include/display_manager_service.h b/dmserver/include/display_manager_service.h index 05bca8099739a2ae959fa910b60f56b65c80f6f6..5e64bd40376aea411722ca6aa94fcad118395d4b 100644 --- a/dmserver/include/display_manager_service.h +++ b/dmserver/include/display_manager_service.h @@ -21,6 +21,7 @@ #include #include +#include #include "abstract_display.h" #include "abstract_display_manager.h" @@ -28,6 +29,7 @@ #include "display_power_controller.h" #include "single_instance.h" #include "singleton_delegator.h" +#include "transaction/rs_interfaces.h" namespace OHOS::Rosen { class DisplayManagerService : public SystemAbility, public DisplayManagerStub { @@ -60,6 +62,9 @@ private: static inline SingletonDelegator delegator_; std::map> abstractDisplayMap_; +#ifdef FOUNDATION_DMSERVER_RSDISPLAYNODE + std::map> displayNodeMap_; +#endif DisplayPowerController displayPowerController_; }; } // namespace OHOS::Rosen diff --git a/dmserver/src/abstract_display_manager.cpp b/dmserver/src/abstract_display_manager.cpp index 2ed3b24e268ee374a83ddcb8ba224b596c159988..e79ec9ecc069f262d5936a4afdaeea7080bb1ed8 100644 --- a/dmserver/src/abstract_display_manager.cpp +++ b/dmserver/src/abstract_display_manager.cpp @@ -63,7 +63,7 @@ ScreenId AbstractDisplayManager::CreateVirtualScreen(const VirtualDisplayInfo &v } ScreenId result = rsInterface_->CreateVirtualScreen(virtualDisplayInfo.name_, virtualDisplayInfo.width_, virtualDisplayInfo.height_, surface, virtualDisplayInfo.displayIdToMirror_, virtualDisplayInfo.flags_); - WLOGFI("AbstractDisplayManager::CreateVirtualDisplay id: %{public}llu", result >> 32); + WLOGFI("AbstractDisplayManager::CreateVirtualDisplay id: %{public}" PRIu64"", result >> 32); return result; } diff --git a/dmserver/src/display_manager_service.cpp b/dmserver/src/display_manager_service.cpp index 5907c5b93706b1319df6ce0e0ad37cd965d0ac1b..be2aebee7f08c8678643bf4af1372b00959a63c3 100644 --- a/dmserver/src/display_manager_service.cpp +++ b/dmserver/src/display_manager_service.cpp @@ -23,6 +23,7 @@ #include #include "window_manager_hilog.h" +#include "window_manager_service.h" namespace OHOS::Rosen { namespace { @@ -68,7 +69,7 @@ ScreenId DisplayManagerService::GetScreenIdFromDisplayId(DisplayId displayId) DisplayId DisplayManagerService::GetDefaultDisplayId() { ScreenId screenId = AbstractDisplayManager::GetInstance().GetDefaultScreenId(); - WLOGFI("GetDefaultDisplayId %{public}llu", screenId); + WLOGFI("GetDefaultDisplayId %{public}" PRIu64"", screenId); return GetDisplayIdFromScreenId(screenId); } @@ -87,10 +88,20 @@ DisplayInfo DisplayManagerService::GetDisplayInfoById(DisplayId displayId) DisplayId DisplayManagerService::CreateVirtualDisplay(const VirtualDisplayInfo &virtualDisplayInfo, sptr surface) { - WLOGFI("name %{public}s, width %{public}u, height %{public}u, mirrotId %{public}llu, flags %{public}d", + WLOGFI("name %{public}s, width %{public}u, height %{public}u, mirrotId %{public}" PRIu64", flags %{public}d", 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 +109,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/dmserver/src/display_manager_service_inner.cpp b/dmserver/src/display_manager_service_inner.cpp index 6b65413d81694550c5b212a3bee7113ff60eb2a3..a22f2e93fa4e87bb598c2c9fd0ebc3e00bbb2400 100644 --- a/dmserver/src/display_manager_service_inner.cpp +++ b/dmserver/src/display_manager_service_inner.cpp @@ -68,7 +68,7 @@ std::vector> DisplayManagerServiceInner::GetAllDispl if (display != nullptr) { res.push_back(display); } else { - WLOGFE("GetAllDisplays display %" PRIu64" nullptr!", displayId); + WLOGFE("GetAllDisplays display %{public}" PRIu64" nullptr!", displayId); } } return res; 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..f26b0b6adc9bebc72bcbc2e574a8ac9edb1b4b0b 100644 --- a/wmserver/src/window_manager_service.cpp +++ b/wmserver/src/window_manager_service.cpp @@ -225,6 +225,11 @@ void WindowManagerService::OnWindowEvent(Event event, uint32_t windowId) } } +std::shared_ptr WindowManagerService::GetDisplayNode(int32_t displayId) const +{ + return windowRoot_->GetOrCreateWindowNodeContainer(displayId)->GetDisplayNode(); +} + WMError WindowManagerService::NotifyDisplaySuspend() { WLOGFI("NotifyDisplaySuspend"); @@ -239,5 +244,4 @@ void WindowManagerService::RestoreSuspendedWindows() std::lock_guard lock(mutex_); // TODO: restore windows covered by keyguard } -} } \ 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_; +} } }