From aaaf6f4e5dafdf341cd2e8f5e0df05bece339152 Mon Sep 17 00:00:00 2001 From: qianlf Date: Tue, 17 May 2022 21:13:39 +0800 Subject: [PATCH] fix starting window show when locked bug Signed-off-by: qianlf Change-Id: I38617df53fcb838855e56379badaf557594e3681 --- wmserver/include/window_node_container.h | 3 ++- wmserver/src/window_controller.cpp | 3 ++- wmserver/src/window_node_container.cpp | 25 ++++++++++++++++++++---- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/wmserver/include/window_node_container.h b/wmserver/include/window_node_container.h index 6399c53f..62b170e9 100644 --- a/wmserver/include/window_node_container.h +++ b/wmserver/include/window_node_container.h @@ -129,8 +129,9 @@ private: static bool ReadIsWindowAnimationEnabledProperty(); void DumpScreenWindowTree(); void RaiseInputMethodWindowPriorityIfNeeded(const sptr& node) const; + void ReZOrderShowWhenLockedWindowIfNeeded(const sptr& node); void RaiseShowWhenLockedWindowIfNeeded(const sptr& node); - void ReZOrderShowWhenLockedWindows(const sptr& node, bool up); + void ReZOrderShowWhenLockedWindows(bool up); WMError AddWindowNodeOnWindowTree(sptr& node, const sptr& parentNode); void RemoveWindowNodeFromWindowTree(sptr& node); diff --git a/wmserver/src/window_controller.cpp b/wmserver/src/window_controller.cpp index 9a35201e..20ccfa0e 100644 --- a/wmserver/src/window_controller.cpp +++ b/wmserver/src/window_controller.cpp @@ -172,9 +172,10 @@ WMError WindowController::AddWindowNode(sptr& property) return WMError::WM_ERROR_INVALID_OPERATION; } // using starting window rect if client rect is empty - if (WindowHelper::IsEmptyRect(property->GetRequestRect())) { // for tile and cascade + if (WindowHelper::IsEmptyRect(property->GetRequestRect()) && node->startingWindowShown_) { // for tile and cascade property->SetRequestRect(node->GetRequestRect()); property->SetWindowRect(node->GetWindowRect()); + property->SetDecoStatus(true); } node->GetWindowProperty()->CopyFrom(property); diff --git a/wmserver/src/window_node_container.cpp b/wmserver/src/window_node_container.cpp index 5279a70f..23569e7e 100644 --- a/wmserver/src/window_node_container.cpp +++ b/wmserver/src/window_node_container.cpp @@ -169,12 +169,13 @@ WMError WindowNodeContainer::AddWindowNode(sptr& node, sptrGetShowingDisplays()) { UpdateRSTree(node, displayId, true, node->isPlayAnimationShow_); } - AssignZOrder(); } else { node->isPlayAnimationShow_ = false; node->startingWindowShown_ = false; + ReZOrderShowWhenLockedWindowIfNeeded(node); } + AssignZOrder(); layoutPolicy_->AddWindowNode(node); if (WindowHelper::IsAvoidAreaWindow(node->GetWindowType())) { avoidController_->AvoidControl(node, AvoidControlType::AVOID_NODE_ADD); @@ -1373,7 +1374,7 @@ void WindowNodeContainer::RaiseInputMethodWindowPriorityIfNeeded(const sptr& node, bool up) +void WindowNodeContainer::ReZOrderShowWhenLockedWindows(bool up) { WLOGFI("Keyguard change %{public}u, re-zorder showWhenLocked window", up); std::vector> needReZOrderNodes; @@ -1410,11 +1411,27 @@ void WindowNodeContainer::ReZOrderShowWhenLockedWindows(const sptr& } } +void WindowNodeContainer::ReZOrderShowWhenLockedWindowIfNeeded(const sptr& node) +{ + if (!(node->GetWindowFlags() & static_cast(WindowFlag::WINDOW_FLAG_SHOW_WHEN_LOCKED))) { + return; + } + + auto iter = std::find_if(aboveAppWindowNode_->children_.begin(), aboveAppWindowNode_->children_.end(), + [](sptr node) { + return node->GetWindowType() == WindowType::WINDOW_TYPE_KEYGUARD; + }); + if (iter != aboveAppWindowNode_->children_.end()) { + WLOGFI("ShowWhenLocked window %{public}u re-zorder to up", node->GetWindowId()); + ReZOrderShowWhenLockedWindows(true); + } +} + void WindowNodeContainer::RaiseShowWhenLockedWindowIfNeeded(const sptr& node) { // if keyguard window show, raise show when locked windows if (node->GetWindowType() == WindowType::WINDOW_TYPE_KEYGUARD) { - ReZOrderShowWhenLockedWindows(node, true); + ReZOrderShowWhenLockedWindows(true); return; } @@ -1438,7 +1455,7 @@ void WindowNodeContainer::DropShowWhenLockedWindowIfNeeded(const sptrGetWindowType() == WindowType::WINDOW_TYPE_KEYGUARD) { - ReZOrderShowWhenLockedWindows(node, false); + ReZOrderShowWhenLockedWindows(false); AssignZOrder(); } }