From 81be3031ea02505d36dfef4674f51fded238325b Mon Sep 17 00:00:00 2001 From: l00574490 Date: Tue, 17 May 2022 12:09:29 +0800 Subject: [PATCH] process node which is not showing when destroy display Signed-off-by: l00574490 Change-Id: Ia90c0a92439ded9a86ee59e38146cf5216090a09 --- wmserver/include/window_root.h | 1 + wmserver/src/display_group_controller.cpp | 8 ++++---- wmserver/src/window_root.cpp | 20 +++++++++++++++++++- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/wmserver/include/window_root.h b/wmserver/include/window_root.h index a03e17f3..f83b4b4e 100644 --- a/wmserver/include/window_root.h +++ b/wmserver/include/window_root.h @@ -96,6 +96,7 @@ private: ScreenId GetScreenGroupId(DisplayId displayId, bool& isRecordedDisplay); void ProcessExpandDisplayCreate(DisplayId displayId, ScreenId screenGroupId); std::map> GetAllDisplayInfos(const std::vector& displayIdVec); + void MoveNotShowingWindowToDefaultDisplay(DisplayId displayId); std::recursive_mutex& mutex_; std::map> windowNodeMap_; diff --git a/wmserver/src/display_group_controller.cpp b/wmserver/src/display_group_controller.cpp index 75fc3baa..37a03290 100644 --- a/wmserver/src/display_group_controller.cpp +++ b/wmserver/src/display_group_controller.cpp @@ -294,8 +294,8 @@ void DisplayGroupController::MoveCrossNodeToTargetDisplay(const sptr { node->isShowingOnMultiDisplays_ = false; // update showing display - std::vector newShownDisplays = { targetDisplayId }; - node->SetShowingDisplays(newShownDisplays); + std::vector newShowingDisplays = { targetDisplayId }; + node->SetShowingDisplays(newShowingDisplays); // update new displayId if (node->GetDisplayId() != targetDisplayId) { UpdateWindowDisplayId(node, targetDisplayId); @@ -318,8 +318,8 @@ void DisplayGroupController::MoveNotCrossNodeToDefaultDisplay(const sptrSetRequestRect(newRect); // update showing display - std::vector newShownDisplays = { defaultDisplayId_ }; - node->SetShowingDisplays(newShownDisplays); + std::vector newShowingDisplays = { defaultDisplayId_ }; + node->SetShowingDisplays(newShowingDisplays); // update new displayId UpdateWindowDisplayId(node, defaultDisplayId_); diff --git a/wmserver/src/window_root.cpp b/wmserver/src/window_root.cpp index c065a868..80ec474d 100644 --- a/wmserver/src/window_root.cpp +++ b/wmserver/src/window_root.cpp @@ -940,6 +940,23 @@ void WindowRoot::ProcessDisplayCreate(DisplayId displayId) } } +void WindowRoot::MoveNotShowingWindowToDefaultDisplay(DisplayId displayId) +{ + DisplayId defaultDisplayId = DisplayManagerServiceInner::GetInstance().GetDefaultDisplayId(); + for (auto& elem : windowNodeMap_) { + auto& windowNode = elem.second; + if (windowNode->GetDisplayId() == displayId && !windowNode->currentVisibility_) { + std::vector newShowingDisplays = { defaultDisplayId }; + windowNode->SetShowingDisplays(newShowingDisplays); + windowNode->isShowingOnMultiDisplays_ = false; + if (windowNode->GetWindowToken()) { + windowNode->GetWindowToken()->UpdateDisplayId(windowNode->GetDisplayId(), defaultDisplayId); + } + windowNode->SetDisplayId(defaultDisplayId); + } + } +} + void WindowRoot::ProcessDisplayDestroy(DisplayId displayId) { ScreenId screenGroupId = DisplayManagerServiceInner::GetInstance().GetScreenGroupIdByDisplayId(displayId); @@ -972,7 +989,8 @@ void WindowRoot::ProcessDisplayDestroy(DisplayId displayId) DestroyWindowInner(node); } } - + // move window which is not showing on destroied display to default display + MoveNotShowingWindowToDefaultDisplay(displayId); WLOGFI("[Display Destroy] displayId: %{public}" PRIu64" ", displayId); }