From 6961ba0814ad49d1a40f667b5f34ad450a0ac488 Mon Sep 17 00:00:00 2001 From: xiaojianfeng Date: Tue, 28 Jun 2022 15:12:13 +0800 Subject: [PATCH] fix toggle split window states bug Signed-off-by: xiaojianfeng Change-Id: Iab9fcb834ac0ee71fe3a38efedec4b661de07515 --- wm/src/window_impl.cpp | 3 +- wmserver/include/window_node_container.h | 2 + wmserver/include/window_pair.h | 10 +--- wmserver/src/window_node_container.cpp | 76 +++++++++++++++--------- wmserver/src/window_pair.cpp | 7 +-- wmserver/src/window_root.cpp | 7 +-- 6 files changed, 56 insertions(+), 49 deletions(-) diff --git a/wm/src/window_impl.cpp b/wm/src/window_impl.cpp index 0dcecf56..51ab9274 100644 --- a/wm/src/window_impl.cpp +++ b/wm/src/window_impl.cpp @@ -2023,8 +2023,7 @@ void WindowImpl::UpdateWindowState(WindowState state) WLOGFD("MinimizeAbility, id: %{public}u", GetWindowId()); AAFwk::AbilityManagerClient::GetInstance()->MinimizeAbility(abilityContext->GetToken(), true); } else { - state_ = WindowState::STATE_HIDDEN; - NotifyAfterBackground(); + Hide(static_cast(WindowStateChangeReason::TOGGLING)); } break; } diff --git a/wmserver/include/window_node_container.h b/wmserver/include/window_node_container.h index 6803edeb..6115d75a 100644 --- a/wmserver/include/window_node_container.h +++ b/wmserver/include/window_node_container.h @@ -76,6 +76,7 @@ public: void MinimizeAllAppWindows(DisplayId displayId); void MinimizeOldestAppWindow(); WMError ToggleShownStateForAllAppWindows(std::function restoreFunc, bool restore); + void BackUpAllAppWindows(); void RestoreAllAppWindows(std::function restoreFunc); bool IsAppWindowsEmpty() const; void ProcessWindowStateChange(WindowState state, WindowStateChangeReason reason); @@ -160,6 +161,7 @@ private: std::vector backupWindowIds_; std::map backupWindowMode_; std::map backupDividerWindowRect_; + std::map> backupDisplaySplitWindowMode_; sptr zorderPolicy_ = new WindowZorderPolicy(); std::unordered_map> layoutPolicies_; WindowLayoutMode layoutMode_ = WindowLayoutMode::CASCADE; diff --git a/wmserver/include/window_pair.h b/wmserver/include/window_pair.h index 86d8391c..e1a25daf 100644 --- a/wmserver/include/window_pair.h +++ b/wmserver/include/window_pair.h @@ -17,6 +17,7 @@ #define OHOS_ROSEN_WINDOW_PAIR_H #include +#include "class_var_definition.h" #include "window_inner_manager.h" #include "window_node.h" #include "window_layout_policy.h" @@ -171,13 +172,6 @@ public: */ bool IsDockSliceInExitSplitModeArea(const std::vector& exitSplitPoints); - /** - * Set all app windows are restoring. - * - * @param ratio Indicates whether all app windows are restoring. - */ - void SetAllAppWindowsRestoring(bool isAllAppWindowsRestoring); - void SetInitalDividerRect(const Rect& rect); private: @@ -252,8 +246,8 @@ private: sptr divider_; WindowPairStatus status_ = {WindowPairStatus::STATUS_EMPTY}; DisplayGroupWindowTree& displayGroupWindowTree_; - bool isAllAppWindowsRestoring_ { false }; Rect initalDividerRect_ {0, 0, 0, 0}; + DEFINE_VAR_DEFAULT_FUNC_SET(bool, AllSplitAppWindowsRestoring, isAllSplitAppWindowsRestoring, false) }; } // namespace Rosen } // namespace OHOS diff --git a/wmserver/src/window_node_container.cpp b/wmserver/src/window_node_container.cpp index a2e77c39..0d64518f 100644 --- a/wmserver/src/window_node_container.cpp +++ b/wmserver/src/window_node_container.cpp @@ -1387,44 +1387,29 @@ WMError WindowNodeContainer::ToggleShownStateForAllAppWindows( std::function restoreFunc, bool restore) { WLOGFI("ToggleShownStateForAllAppWindows"); + sptr recentWindowNode = nullptr; for (auto node : aboveAppWindowNode_->children_) { if (node->GetWindowType() == WindowType::WINDOW_TYPE_LAUNCHER_RECENT) { - return WMError::WM_DO_NOTHING; + recentWindowNode = node; + if (node->GetWindowMode() == WindowMode::WINDOW_MODE_FULLSCREEN) { + return WMError::WM_OK; + } } } // to do, backup reentry: 1.ToggleShownStateForAllAppWindows fast; 2.this display should reset backupWindowIds_. if (!restore && appWindowNode_->children_.empty() && !backupWindowIds_.empty()) { backupWindowIds_.clear(); backupWindowMode_.clear(); + backupDisplaySplitWindowMode_.clear(); backupDividerWindowRect_.clear(); } if (!restore && !appWindowNode_->children_.empty() && backupWindowIds_.empty()) { WLOGFI("backup"); - std::set displayIdSet; - backupWindowMode_.clear(); - for (auto& appNode : appWindowNode_->children_) { - // exclude exceptional window - if (!WindowHelper::IsMainWindow(appNode->GetWindowType())) { - WLOGFE("is not main window, windowId:%{public}u", appNode->GetWindowId()); - continue; - } - // minimize window - WLOGFD("minimize window, windowId:%{public}u", appNode->GetWindowId()); - backupWindowIds_.emplace_back(appNode->GetWindowId()); - backupWindowMode_[appNode->GetWindowId()] = appNode->GetWindowMode(); - displayIdSet.insert(appNode->GetDisplayId()); - if (appNode->GetWindowToken()) { - appNode->GetWindowToken()->UpdateWindowState(WindowState::STATE_HIDDEN); - } - } - backupDividerWindowRect_.clear(); - for (auto displayId : displayIdSet) { - auto windowPair = displayGroupController_->GetWindowPairByDisplayId(displayId); - if (windowPair == nullptr || windowPair->GetDividerWindow() == nullptr) { - continue; - } - backupDividerWindowRect_[displayId] = windowPair->GetDividerWindow()->GetWindowRect(); + if (recentWindowNode != nullptr && recentWindowNode->GetWindowToken() != nullptr) { + WLOGFI("hide recent"); + recentWindowNode->GetWindowToken()->UpdateWindowState(WindowState::STATE_HIDDEN); } + BackUpAllAppWindows(); } else if (restore && !backupWindowIds_.empty()) { WLOGFI("restore"); RestoreAllAppWindows(restoreFunc); @@ -1434,6 +1419,40 @@ WMError WindowNodeContainer::ToggleShownStateForAllAppWindows( return WMError::WM_OK; } +void WindowNodeContainer::BackUpAllAppWindows() +{ + std::set displayIdSet; + backupWindowMode_.clear(); + backupDisplaySplitWindowMode_.clear(); + for (auto& appNode : appWindowNode_->children_) { + // exclude exceptional window + if (!WindowHelper::IsMainWindow(appNode->GetWindowType())) { + WLOGFE("is not main window, windowId:%{public}u", appNode->GetWindowId()); + continue; + } + // minimize window + WLOGFD("minimize window, windowId:%{public}u", appNode->GetWindowId()); + backupWindowIds_.emplace_back(appNode->GetWindowId()); + auto windowMode = appNode->GetWindowMode(); + backupWindowMode_[appNode->GetWindowId()] = windowMode; + if (WindowHelper::IsSplitWindowMode(windowMode)) { + backupDisplaySplitWindowMode_[appNode->GetWindowId()].insert(windowMode); + } + displayIdSet.insert(appNode->GetDisplayId()); + if (appNode->GetWindowToken()) { + appNode->GetWindowToken()->UpdateWindowState(WindowState::STATE_HIDDEN); + } + } + backupDividerWindowRect_.clear(); + for (auto displayId : displayIdSet) { + auto windowPair = displayGroupController_->GetWindowPairByDisplayId(displayId); + if (windowPair == nullptr || windowPair->GetDividerWindow() == nullptr) { + continue; + } + backupDividerWindowRect_[displayId] = windowPair->GetDividerWindow()->GetWindowRect(); + } +} + void WindowNodeContainer::RestoreAllAppWindows(std::function restoreFunc) { std::vector backupWindowIds(backupWindowIds_); @@ -1442,7 +1461,10 @@ void WindowNodeContainer::RestoreAllAppWindows(std::functionGetWindowPairByDisplayId(displayId); if (windowPair != nullptr) { - windowPair->SetAllAppWindowsRestoring(true); + if (backupDisplaySplitWindowMode_[displayId].count(WindowMode::WINDOW_MODE_SPLIT_PRIMARY) > 0 && + backupDisplaySplitWindowMode_[displayId].count(WindowMode::WINDOW_MODE_SPLIT_SECONDARY) > 0) { + windowPair->SetAllSplitAppWindowsRestoring(true); + } windowPairs.emplace_back(windowPair); } } @@ -1454,7 +1476,7 @@ void WindowNodeContainer::RestoreAllAppWindows(std::functionSetAllAppWindowsRestoring(false); + windowPair->SetAllSplitAppWindowsRestoring(false); } layoutPolicy_->SetSplitDividerWindowRects(backupDividerWindowRect_); backupWindowIds_.clear(); diff --git a/wmserver/src/window_pair.cpp b/wmserver/src/window_pair.cpp index 095b4add..359b17ac 100644 --- a/wmserver/src/window_pair.cpp +++ b/wmserver/src/window_pair.cpp @@ -331,7 +331,7 @@ void WindowPair::UpdateIfSplitRelated(sptr& node) status_, node->GetWindowId(), node->GetWindowMode()); if (status_ == WindowPairStatus::STATUS_EMPTY) { Insert(node); - if (!isAllAppWindowsRestoring_) { + if (!isAllSplitAppWindowsRestoring_) { // find pairable window from trees or send broadcast sptr pairableNode = GetPairableWindow(node); // insert pairable node @@ -487,11 +487,6 @@ void WindowPair::HandleRemoveWindow(sptr& node) } } -void WindowPair::SetAllAppWindowsRestoring(bool isAllAppWindowsRestoring) -{ - isAllAppWindowsRestoring_ = isAllAppWindowsRestoring; -} - void WindowPair::SetInitalDividerRect(const Rect& rect) { initalDividerRect_ = rect; diff --git a/wmserver/src/window_root.cpp b/wmserver/src/window_root.cpp index 59b64bac..f71a2973 100644 --- a/wmserver/src/window_root.cpp +++ b/wmserver/src/window_root.cpp @@ -395,12 +395,7 @@ WMError WindowRoot::ToggleShownStateForAllAppWindows() WindowManagerService::GetInstance().HandleAddWindow(property); return true; }; - WMError tmpRes = WMError::WM_OK; - if (isAllAppWindowsEmpty) { - tmpRes = container->ToggleShownStateForAllAppWindows(restoreFunc, true); - } else { - tmpRes = container->ToggleShownStateForAllAppWindows(restoreFunc, false); - } + WMError tmpRes = tmpRes = container->ToggleShownStateForAllAppWindows(restoreFunc, isAllAppWindowsEmpty); res = (res == WMError::WM_OK) ? tmpRes : res; }); return res;