From c1046fb3785da279d48564b0dc2b2ff57ab9409a Mon Sep 17 00:00:00 2001 From: jincanran Date: Tue, 25 Jan 2022 12:06:51 +0800 Subject: [PATCH] bugfix layout result w/h can not be minus Change-Id: I1e4a5d7dd54c27ca267b8d39ba4c53ab868f781c Signed-off-by: jincanran --- wmserver/src/window_layout_policy.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/wmserver/src/window_layout_policy.cpp b/wmserver/src/window_layout_policy.cpp index 619d30a0..377cc40f 100644 --- a/wmserver/src/window_layout_policy.cpp +++ b/wmserver/src/window_layout_policy.cpp @@ -260,9 +260,6 @@ void WindowLayoutPolicy::LimitWindowSize(const sptr& node, const Rec winRect.width_ = std::max(MIN_VERTICAL_FLOATING_HEIGHT, winRect.width_); winRect.height_ = std::max(MIN_VERTICAL_FLOATING_WIDTH, winRect.height_); } - } else { - winRect.width_ = std::max(1u, winRect.width_); - winRect.height_ = std::max(1u, winRect.height_); } } @@ -339,6 +336,10 @@ void WindowLayoutPolicy::UpdateSplitLimitRect(const Rect& limitRect, Rect& limit void WindowLayoutPolicy::UpdateLimitRect(const sptr& node, Rect& limitRect) { auto& layoutRect = node->GetLayoutRect(); + int32_t limitH = static_cast(limitRect.height_); + int32_t limitW = static_cast(limitRect.width_); + int32_t layoutH = static_cast(layoutRect.height_); + int32_t layoutW = static_cast(layoutRect.width_); if (node->GetWindowType() == WindowType::WINDOW_TYPE_STATUS_BAR || node->GetWindowType() == WindowType::WINDOW_TYPE_NAVIGATION_BAR) { auto avoidPosType = GetAvoidPosType(layoutRect); @@ -346,27 +347,29 @@ void WindowLayoutPolicy::UpdateLimitRect(const sptr& node, Rect& lim int32_t offsetW = 0; switch (avoidPosType) { case AvoidPosType::AVOID_POS_TOP: - offsetH = layoutRect.posY_ + layoutRect.height_ - limitRect.posY_; + offsetH = layoutRect.posY_ + layoutH - limitRect.posY_; limitRect.posY_ += offsetH; - limitRect.height_ -= offsetH; + limitH -= offsetH; break; case AvoidPosType::AVOID_POS_BOTTOM: - offsetH = limitRect.posY_ + limitRect.height_ - layoutRect.posY_; - limitRect.height_ -= offsetH; + offsetH = limitRect.posY_ + limitH - layoutRect.posY_; + limitH -= offsetH; break; case AvoidPosType::AVOID_POS_LEFT: - offsetW = layoutRect.posX_ + layoutRect.width_ - limitRect.posX_; + offsetW = layoutRect.posX_ + layoutW - limitRect.posX_; limitRect.posX_ += offsetW; - limitRect.width_ -= offsetW; + limitW -= offsetW; break; case AvoidPosType::AVOID_POS_RIGHT: - offsetW = limitRect.posX_ + limitRect.width_ - layoutRect.posX_; - limitRect.width_ -= offsetW; + offsetW = limitRect.posX_ + limitW - layoutRect.posX_; + limitW -= offsetW; break; default: WLOGFE("invaild avoidPosType: %{public}d", avoidPosType); } } + limitRect.height_ = static_cast(limitH < 0 ? 0 : limitH); + limitRect.width_ = static_cast(limitW < 0 ? 0 : limitW); WLOGFI("Type: %{public}d, limitRect: %{public}d %{public}d %{public}d %{public}d", node->GetWindowType(), limitRect.posX_, limitRect.posY_, limitRect.width_, limitRect.height_); }