/* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef OHOS_ROSEN_WINDOW_LAYOUT_POLICY_H #define OHOS_ROSEN_WINDOW_LAYOUT_POLICY_H #include #include #include #include "display_group_info.h" #include "display_info.h" #include "window_node.h" #include "wm_common.h" namespace OHOS { namespace Rosen { using DisplayGroupWindowTree = std::map>>>>; enum class DockWindowShowState : uint32_t { NOT_SHOWN = 0, SHOWN_IN_BOTTOM = 1, SHOWN_IN_LEFT = 2, SHOWN_IN_RIGHT = 3, SHOWN_IN_TOP = 4, }; class WindowLayoutPolicy : public RefBase { public: WindowLayoutPolicy() = delete; WindowLayoutPolicy(const sptr& displayGroupInfo, DisplayGroupWindowTree& displayGroupWindowTree); ~WindowLayoutPolicy() = default; virtual void Launch(); virtual void Clean(); virtual void Reset(); virtual void Reorder(); virtual void AddWindowNode(const sptr& node) = 0; virtual void LayoutWindowTree(DisplayId displayId); virtual void RemoveWindowNode(const sptr& node); virtual void UpdateWindowNode(const sptr& node, bool isAddWindow = false); virtual void UpdateLayoutRect(const sptr& node) = 0; virtual void SetSplitDividerWindowRects(std::map dividerWindowRects) {}; virtual Rect GetDividerRect(DisplayId displayId) const; virtual std::vector GetExitSplitPoints(DisplayId displayId) const; float GetVirtualPixelRatio(DisplayId displayId) const; void UpdateClientRectAndResetReason(const sptr& node, const Rect& winRect); void UpdateClientRect(const Rect& rect, const sptr& node, WindowSizeChangeReason reason); Rect GetDisplayGroupRect() const; bool IsMultiDisplay(); void ProcessDisplayCreate(DisplayId displayId, const std::map& displayRectMap); void ProcessDisplayDestroy(DisplayId displayId, const std::map& displayRectMap); void ProcessDisplaySizeChangeOrRotation(DisplayId displayId, const std::map& displayRectMap); void SetSplitRatioConfig(const SplitRatioConfig& splitRatioConfig); virtual bool IsTileRectSatisfiedWithSizeLimits(const sptr& node); // methods for setting bottom posY limit for cascade rect on pc static void SetCascadeRectBottomPosYLimit(uint32_t floatingBottomPosY); protected: void UpdateFloatingLayoutRect(Rect& limitRect, Rect& winRect); void UpdateLimitRect(const sptr& node, Rect& limitRect); virtual void LayoutWindowNode(const sptr& node); AvoidPosType GetAvoidPosType(const Rect& rect, DisplayId displayId) const; void CalcAndSetNodeHotZone(const Rect& winRect, const sptr& node) const; void ComputeDecoratedRequestRect(const sptr& node) const; bool IsVerticalDisplay(DisplayId displayId) const; bool IsFullScreenRecentWindowExist(const std::vector>& nodeVec) const; void LayoutWindowNodesByRootType(const std::vector>& nodeVec); virtual void UpdateSurfaceBounds(const sptr& node, const Rect& winRect, const Rect& preRect); void UpdateRectInDisplayGroupForAllNodes(DisplayId displayId, const Rect& oriDisplayRect, const Rect& newDisplayRect); void UpdateRectInDisplayGroup(const sptr& node, const Rect& oriDisplayRect, const Rect& newDisplayRect); void LimitWindowToBottomRightCorner(const sptr& node); void UpdateDisplayGroupRect(); void UpdateDisplayGroupLimitRect(); void UpdateMultiDisplayFlag(); void PostProcessWhenDisplayChange(); void UpdateDisplayRectAndDisplayGroupInfo(const std::map& displayRectMap); DockWindowShowState GetDockWindowShowState(DisplayId displayId, Rect& dockWinRect) const; void LimitFloatingWindowSize(const sptr& node, const Rect& displayRect, Rect& winRect) const; void LimitMainFloatingWindowPosition(const sptr& node, Rect& winRect) const; void UpdateFloatingWindowSizeForStretchableWindow(const sptr& node, const Rect& displayRect, Rect& winRect) const; void UpdateFloatingWindowSizeBySizeLimits(const sptr& node, const Rect& displayRect, Rect& winRect) const; void LimitWindowPositionWhenInitRectOrMove(const sptr& node, Rect& winRect) const; void LimitWindowPositionWhenDrag(const sptr& node, Rect& winRect) const; void FixWindowSizeByRatioIfDragBeyondLimitRegion(const sptr& node, Rect& winRect); void UpdateWindowSizeLimits(const sptr& node); WindowSizeLimits GetSystemSizeLimits(const sptr& node, const Rect& displayRect, float virtualPixelRatio); Rect CalcEntireWindowHotZone(const sptr& node, const Rect& winRect, uint32_t hotZone, float vpr, TransformHelper::Vector2 hotZoneScale) const; void NotifyAnimationSizeChangeIfNeeded(); const std::set avoidTypes_ { WindowType::WINDOW_TYPE_STATUS_BAR, WindowType::WINDOW_TYPE_NAVIGATION_BAR, }; struct LayoutRects { Rect primaryRect_; Rect secondaryRect_; Rect primaryLimitRect_; Rect secondaryLimitRect_; Rect dividerRect_; Rect firstCascadeRect_; std::vector exitSplitPoints_; // 2 element, first element < second element std::vector splitRatioPoints_; }; sptr displayGroupInfo_; mutable std::map limitRectMap_; DisplayGroupWindowTree& displayGroupWindowTree_; Rect displayGroupRect_; Rect displayGroupLimitRect_; bool isMultiDisplay_ = false; SplitRatioConfig splitRatioConfig_; // bottom posY limit for cascade rect on pc static uint32_t floatingBottomPosY_; }; } } #endif // OHOS_ROSEN_WINDOW_LAYOUT_POLICY_H