• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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