1 /* 2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef OHOS_ROSEN_WINDOW_LAYOUT_POLICY_H 17 #define OHOS_ROSEN_WINDOW_LAYOUT_POLICY_H 18 19 #include <map> 20 #include <refbase.h> 21 #include <set> 22 23 #include "display_group_info.h" 24 #include "display_info.h" 25 #include "window_node.h" 26 #include "wm_common.h" 27 28 29 namespace OHOS { 30 namespace Rosen { 31 using DisplayGroupWindowTree = std::map<DisplayId, 32 std::map<WindowRootNodeType, std::unique_ptr<std::vector<sptr<WindowNode>>>>>; 33 enum class DockWindowShowState : uint32_t { 34 NOT_SHOWN = 0, 35 SHOWN_IN_BOTTOM = 1, 36 SHOWN_IN_LEFT = 2, 37 SHOWN_IN_RIGHT = 3, 38 SHOWN_IN_TOP = 4, 39 }; 40 class WindowLayoutPolicy : public RefBase { 41 public: 42 WindowLayoutPolicy() = delete; 43 WindowLayoutPolicy(const sptr<DisplayGroupInfo>& displayGroupInfo, DisplayGroupWindowTree& displayGroupWindowTree); 44 ~WindowLayoutPolicy() = default; 45 virtual void Launch(); 46 virtual void Clean(); 47 virtual void Reset(); 48 virtual void Reorder(); 49 virtual void AddWindowNode(const sptr<WindowNode>& node) = 0; 50 virtual void LayoutWindowTree(DisplayId displayId); 51 virtual void RemoveWindowNode(const sptr<WindowNode>& node); 52 virtual void UpdateWindowNode(const sptr<WindowNode>& node, bool isAddWindow = false); 53 virtual void UpdateLayoutRect(const sptr<WindowNode>& node) = 0; SetSplitDividerWindowRects(std::map<DisplayId,Rect> dividerWindowRects)54 virtual void SetSplitDividerWindowRects(std::map<DisplayId, Rect> dividerWindowRects) {}; 55 virtual Rect GetDividerRect(DisplayId displayId) const; 56 virtual std::vector<int32_t> GetExitSplitPoints(DisplayId displayId) const; 57 float GetVirtualPixelRatio(DisplayId displayId) const; 58 void UpdateClientRectAndResetReason(const sptr<WindowNode>& node, const Rect& winRect); 59 void UpdateClientRect(const Rect& rect, const sptr<WindowNode>& node, WindowSizeChangeReason reason); 60 Rect GetDisplayGroupRect() const; 61 bool IsMultiDisplay(); 62 void ProcessDisplayCreate(DisplayId displayId, const std::map<DisplayId, Rect>& displayRectMap); 63 void ProcessDisplayDestroy(DisplayId displayId, const std::map<DisplayId, Rect>& displayRectMap); 64 void ProcessDisplaySizeChangeOrRotation(DisplayId displayId, const std::map<DisplayId, Rect>& displayRectMap); 65 void SetSplitRatioConfig(const SplitRatioConfig& splitRatioConfig); 66 virtual bool IsTileRectSatisfiedWithSizeLimits(const sptr<WindowNode>& node); 67 // methods for setting bottom posY limit for cascade rect on pc 68 static void SetCascadeRectBottomPosYLimit(uint32_t floatingBottomPosY); 69 70 protected: 71 void UpdateFloatingLayoutRect(Rect& limitRect, Rect& winRect); 72 void UpdateLimitRect(const sptr<WindowNode>& node, Rect& limitRect); 73 virtual void LayoutWindowNode(const sptr<WindowNode>& node); 74 AvoidPosType GetAvoidPosType(const Rect& rect, DisplayId displayId) const; 75 void CalcAndSetNodeHotZone(const Rect& winRect, const sptr<WindowNode>& node) const; 76 void ComputeDecoratedRequestRect(const sptr<WindowNode>& node) const; 77 bool IsVerticalDisplay(DisplayId displayId) const; 78 bool IsFullScreenRecentWindowExist(const std::vector<sptr<WindowNode>>& nodeVec) const; 79 void LayoutWindowNodesByRootType(const std::vector<sptr<WindowNode>>& nodeVec); 80 virtual void UpdateSurfaceBounds(const sptr<WindowNode>& node, const Rect& winRect, const Rect& preRect); 81 void UpdateRectInDisplayGroupForAllNodes(DisplayId displayId, 82 const Rect& oriDisplayRect, const Rect& newDisplayRect); 83 void UpdateRectInDisplayGroup(const sptr<WindowNode>& node, 84 const Rect& oriDisplayRect, const Rect& newDisplayRect); 85 void LimitWindowToBottomRightCorner(const sptr<WindowNode>& node); 86 void UpdateDisplayGroupRect(); 87 void UpdateDisplayGroupLimitRect(); 88 void UpdateMultiDisplayFlag(); 89 void PostProcessWhenDisplayChange(); 90 void UpdateDisplayRectAndDisplayGroupInfo(const std::map<DisplayId, Rect>& displayRectMap); 91 DockWindowShowState GetDockWindowShowState(DisplayId displayId, Rect& dockWinRect) const; 92 void LimitFloatingWindowSize(const sptr<WindowNode>& node, const Rect& displayRect, Rect& winRect) const; 93 void LimitMainFloatingWindowPosition(const sptr<WindowNode>& node, Rect& winRect) const; 94 95 void UpdateFloatingWindowSizeForStretchableWindow(const sptr<WindowNode>& node, 96 const Rect& displayRect, Rect& winRect) const; 97 void UpdateFloatingWindowSizeBySizeLimits(const sptr<WindowNode>& node, 98 const Rect& displayRect, Rect& winRect) const; 99 void LimitWindowPositionWhenInitRectOrMove(const sptr<WindowNode>& node, Rect& winRect) const; 100 void LimitWindowPositionWhenDrag(const sptr<WindowNode>& node, Rect& winRect) const; 101 void FixWindowSizeByRatioIfDragBeyondLimitRegion(const sptr<WindowNode>& node, Rect& winRect); 102 void UpdateWindowSizeLimits(const sptr<WindowNode>& node); 103 WindowSizeLimits GetSystemSizeLimits(const sptr<WindowNode>& node, 104 const Rect& displayRect, float virtualPixelRatio); 105 Rect CalcEntireWindowHotZone(const sptr<WindowNode>& node, const Rect& winRect, uint32_t hotZone, 106 float vpr, TransformHelper::Vector2 hotZoneScale) const; 107 void NotifyAnimationSizeChangeIfNeeded(); 108 const std::set<WindowType> avoidTypes_ { 109 WindowType::WINDOW_TYPE_STATUS_BAR, 110 WindowType::WINDOW_TYPE_NAVIGATION_BAR, 111 }; 112 struct LayoutRects { 113 Rect primaryRect_; 114 Rect secondaryRect_; 115 Rect primaryLimitRect_; 116 Rect secondaryLimitRect_; 117 Rect dividerRect_; 118 Rect firstCascadeRect_; 119 std::vector<int32_t> exitSplitPoints_; // 2 element, first element < second element 120 std::vector<int32_t> splitRatioPoints_; 121 }; 122 sptr<DisplayGroupInfo> displayGroupInfo_; 123 mutable std::map<DisplayId, Rect> limitRectMap_; 124 DisplayGroupWindowTree& displayGroupWindowTree_; 125 Rect displayGroupRect_; 126 Rect displayGroupLimitRect_; 127 bool isMultiDisplay_ = false; 128 SplitRatioConfig splitRatioConfig_; 129 // bottom posY limit for cascade rect on pc 130 static uint32_t floatingBottomPosY_; 131 }; 132 } 133 } 134 #endif // OHOS_ROSEN_WINDOW_LAYOUT_POLICY_H 135