From ef5d241f56007642ca0ea91ddea4d83aca75a2ef Mon Sep 17 00:00:00 2001 From: wlj Date: Wed, 13 Jul 2022 16:22:07 +0800 Subject: [PATCH] limit divider bound Signed-off-by: wlj Change-Id: I0983d8a31cf1a701138abc3bb369e06ebda20058 --- .../include/window_layout_policy_cascade.h | 2 +- wmserver/src/window_layout_policy_cascade.cpp | 43 +++++++++---------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/wmserver/include/window_layout_policy_cascade.h b/wmserver/include/window_layout_policy_cascade.h index db3ca76e..13096013 100644 --- a/wmserver/include/window_layout_policy_cascade.h +++ b/wmserver/include/window_layout_policy_cascade.h @@ -55,7 +55,7 @@ private: void LayoutWindowNode(const sptr& node) override; void LayoutWindowTree(DisplayId displayId) override; void InitLimitRects(DisplayId displayId); - void LimitMoveBounds(Rect& rect, DisplayId displayId) const; + void LimitDividerMoveBounds(Rect& rect, DisplayId displayId) const; void InitCascadeRect(DisplayId displayId); void SetCascadeRect(const sptr& node); void ApplyWindowRectConstraints(const sptr& node, Rect& winRect) const; diff --git a/wmserver/src/window_layout_policy_cascade.cpp b/wmserver/src/window_layout_policy_cascade.cpp index 5c8c6c6f..384e261a 100644 --- a/wmserver/src/window_layout_policy_cascade.cpp +++ b/wmserver/src/window_layout_policy_cascade.cpp @@ -204,26 +204,22 @@ void WindowLayoutPolicyCascade::SetSplitDividerWindowRects(std::map(MIN_HORIZONTAL_SPLIT_WIDTH * virtualPixelRatio); - uint32_t minVerticalSplitH = static_cast(MIN_VERTICAL_SPLIT_HEIGHT * virtualPixelRatio); - const Rect& limitRect = limitRectMap_[displayId]; if (rect.width_ < rect.height_) { - if (rect.posX_ < (limitRect.posX_ + static_cast(minHorizontalSplitW))) { - rect.posX_ = limitRect.posX_ + static_cast(minHorizontalSplitW); - } else if (rect.posX_ > - (limitRect.posX_ + static_cast(limitRect.width_ - minHorizontalSplitW))) { - rect.posX_ = limitRect.posX_ + static_cast(limitRect.width_ - minHorizontalSplitW); + if (rect.posX_ < limitRect.posX_) { + rect.posX_ = limitRect.posX_; + } else if (rect.posX_ + static_cast(rect.width_) > + limitRect.posX_ + static_cast(limitRect.width_)) { + rect.posX_ = limitRect.posX_ + static_cast(limitRect.width_ - rect.width_); } } else { - if (rect.posY_ < (limitRect.posY_ + static_cast(minVerticalSplitH))) { - rect.posY_ = limitRect.posY_ + static_cast(minVerticalSplitH); - } else if (rect.posY_ > - (limitRect.posY_ + static_cast(limitRect.height_ - minVerticalSplitH))) { - rect.posY_ = limitRect.posY_ + static_cast(limitRect.height_ - minVerticalSplitH); + if (rect.posY_ < limitRect.posY_) { + rect.posY_ = limitRect.posY_; + } else if (rect.posY_ + static_cast(rect.height_) > + limitRect.posY_ + static_cast(limitRect.height_)) { + rect.posY_ = limitRect.posY_ + static_cast(limitRect.height_ - rect.height_); } } WLOGFI("limit divider move bounds:[%{public}d, %{public}d, %{public}u, %{public}u]", @@ -260,13 +256,16 @@ void WindowLayoutPolicyCascade::ApplyWindowRectConstraints(const sptrGetWindowSizeChangeReason(); - if (node->GetWindowType() == WindowType::WINDOW_TYPE_DOCK_SLICE && - reason == WindowSizeChangeReason::DRAG_END) { - DisplayId displayId = node->GetDisplayId(); - if (!IsVerticalDisplay(displayId)) { - UpdateDockSlicePosition(displayId, winRect.posX_); - } else { - UpdateDockSlicePosition(displayId, winRect.posY_); + DisplayId displayId = node->GetDisplayId(); + if (node->GetWindowType() == WindowType::WINDOW_TYPE_DOCK_SLICE) { + // make sure the divider is entirely within display + LimitDividerMoveBounds(winRect, displayId); + if (reason == WindowSizeChangeReason::DRAG_END) { + if (!IsVerticalDisplay(displayId)) { + UpdateDockSlicePosition(displayId, winRect.posX_); + } else { + UpdateDockSlicePosition(displayId, winRect.posY_); + } } } LimitFloatingWindowSize(node, displayGroupInfo_->GetDisplayRect(node->GetDisplayId()), winRect);