1e0dac50fSopenharmony_ci/* 2e0dac50fSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3e0dac50fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e0dac50fSopenharmony_ci * you may not use this file except in compliance with the License. 5e0dac50fSopenharmony_ci * You may obtain a copy of the License at 6e0dac50fSopenharmony_ci * 7e0dac50fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e0dac50fSopenharmony_ci * 9e0dac50fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e0dac50fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e0dac50fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e0dac50fSopenharmony_ci * See the License for the specific language governing permissions and 13e0dac50fSopenharmony_ci * limitations under the License. 14e0dac50fSopenharmony_ci */ 15e0dac50fSopenharmony_ci 16e0dac50fSopenharmony_ci#ifndef OHOS_ROSEN_WINDOW_PAIR_H 17e0dac50fSopenharmony_ci#define OHOS_ROSEN_WINDOW_PAIR_H 18e0dac50fSopenharmony_ci 19e0dac50fSopenharmony_ci#include <refbase.h> 20e0dac50fSopenharmony_ci#include "class_var_definition.h" 21e0dac50fSopenharmony_ci#include "window_node.h" 22e0dac50fSopenharmony_ci#include "window_layout_policy.h" 23e0dac50fSopenharmony_ci#include "wm_common_inner.h" 24e0dac50fSopenharmony_ci#include "wm_common.h" 25e0dac50fSopenharmony_ci 26e0dac50fSopenharmony_cinamespace OHOS { 27e0dac50fSopenharmony_cinamespace Rosen { 28e0dac50fSopenharmony_ci/** 29e0dac50fSopenharmony_ci * @brief Enumerates the status of window pair. 30e0dac50fSopenharmony_ci */ 31e0dac50fSopenharmony_cienum class WindowPairStatus : uint32_t { 32e0dac50fSopenharmony_ci EMPTY, 33e0dac50fSopenharmony_ci SINGLE_PRIMARY, 34e0dac50fSopenharmony_ci SINGLE_SECONDARY, 35e0dac50fSopenharmony_ci SINGLE_SPLIT, 36e0dac50fSopenharmony_ci PRIMARY_AND_SECONDARY, 37e0dac50fSopenharmony_ci PRIMARY_AND_DIVIDER, 38e0dac50fSopenharmony_ci SECONDARY_AND_DIVIDER, 39e0dac50fSopenharmony_ci PAIRED_DONE 40e0dac50fSopenharmony_ci}; 41e0dac50fSopenharmony_ci/** 42e0dac50fSopenharmony_ci * @brief Enumerates the message of split event. 43e0dac50fSopenharmony_ci */ 44e0dac50fSopenharmony_cienum class SplitEventMsgType : uint32_t { 45e0dac50fSopenharmony_ci MSG_SHOW_PRIMARY, 46e0dac50fSopenharmony_ci MSG_SHOW_SECONDARY, 47e0dac50fSopenharmony_ci MSG_SHOW_DIVIDER, 48e0dac50fSopenharmony_ci MSG_DESTROY_DIVIDER, 49e0dac50fSopenharmony_ci}; 50e0dac50fSopenharmony_ci 51e0dac50fSopenharmony_ciclass WindowPair : public RefBase { 52e0dac50fSopenharmony_cipublic: 53e0dac50fSopenharmony_ci /** 54e0dac50fSopenharmony_ci * @brief Constructor used to create an empty WindowPair instance. 55e0dac50fSopenharmony_ci * 56e0dac50fSopenharmony_ci * @param displayId the display of window pair 57e0dac50fSopenharmony_ci */ 58e0dac50fSopenharmony_ci explicit WindowPair(const DisplayId& displayId) : displayId_(displayId) {}; 59e0dac50fSopenharmony_ci 60e0dac50fSopenharmony_ci /** 61e0dac50fSopenharmony_ci * @brief Deconstructor used to deconstruct. 62e0dac50fSopenharmony_ci * 63e0dac50fSopenharmony_ci */ 64e0dac50fSopenharmony_ci ~WindowPair(); 65e0dac50fSopenharmony_ci 66e0dac50fSopenharmony_ci /** 67e0dac50fSopenharmony_ci * @brief Clear window pair. 68e0dac50fSopenharmony_ci * 69e0dac50fSopenharmony_ci */ 70e0dac50fSopenharmony_ci void Clear(); 71e0dac50fSopenharmony_ci 72e0dac50fSopenharmony_ci /** 73e0dac50fSopenharmony_ci * @brief Set split ratio. 74e0dac50fSopenharmony_ci * 75e0dac50fSopenharmony_ci * @param ratio split ratio 76e0dac50fSopenharmony_ci */ 77e0dac50fSopenharmony_ci void SetSplitRatio(float ratio); 78e0dac50fSopenharmony_ci 79e0dac50fSopenharmony_ci /** 80e0dac50fSopenharmony_ci * @brief Get split ratio. 81e0dac50fSopenharmony_ci * 82e0dac50fSopenharmony_ci * @return split ratio 83e0dac50fSopenharmony_ci */ 84e0dac50fSopenharmony_ci float GetSplitRatio() const; 85e0dac50fSopenharmony_ci 86e0dac50fSopenharmony_ci /** 87e0dac50fSopenharmony_ci * @brief Get whether the window pair is paired. 88e0dac50fSopenharmony_ci * 89e0dac50fSopenharmony_ci * @return the pair state of window pair 90e0dac50fSopenharmony_ci */ 91e0dac50fSopenharmony_ci bool IsPaired() const; 92e0dac50fSopenharmony_ci 93e0dac50fSopenharmony_ci /** 94e0dac50fSopenharmony_ci * @brief Get whether the window status_ is valid. 95e0dac50fSopenharmony_ci */ 96e0dac50fSopenharmony_ci bool IsAbnormalStatus() const; 97e0dac50fSopenharmony_ci 98e0dac50fSopenharmony_ci /** 99e0dac50fSopenharmony_ci * @brief Check pair status support recent update 100e0dac50fSopenharmony_ci * 101e0dac50fSopenharmony_ci * @param node trigger window node 102e0dac50fSopenharmony_ci */ 103e0dac50fSopenharmony_ci bool StatusSupprtedWhenRecentUpdate(sptr<WindowNode>& node); 104e0dac50fSopenharmony_ci /** 105e0dac50fSopenharmony_ci * @brief Handle changes in the state of the window pair 106e0dac50fSopenharmony_ci * 107e0dac50fSopenharmony_ci * @param node trigger window node 108e0dac50fSopenharmony_ci */ 109e0dac50fSopenharmony_ci void UpdateIfSplitRelated(sptr<WindowNode>& node); 110e0dac50fSopenharmony_ci 111e0dac50fSopenharmony_ci /** 112e0dac50fSopenharmony_ci * @brief Handle remove window from pair. 113e0dac50fSopenharmony_ci * 114e0dac50fSopenharmony_ci * @param node target node 115e0dac50fSopenharmony_ci */ 116e0dac50fSopenharmony_ci void HandleRemoveWindow(sptr<WindowNode>& node); 117e0dac50fSopenharmony_ci 118e0dac50fSopenharmony_ci /** 119e0dac50fSopenharmony_ci * @brief Find window node from window pair. 120e0dac50fSopenharmony_ci * 121e0dac50fSopenharmony_ci * @param node target window node 122e0dac50fSopenharmony_ci * @return window node 123e0dac50fSopenharmony_ci */ 124e0dac50fSopenharmony_ci sptr<WindowNode> Find(sptr<WindowNode>& node); 125e0dac50fSopenharmony_ci 126e0dac50fSopenharmony_ci /** 127e0dac50fSopenharmony_ci * @brief Get divider window node. 128e0dac50fSopenharmony_ci * 129e0dac50fSopenharmony_ci * @return divider window node 130e0dac50fSopenharmony_ci */ 131e0dac50fSopenharmony_ci sptr<WindowNode> GetDividerWindow() const; 132e0dac50fSopenharmony_ci 133e0dac50fSopenharmony_ci /** 134e0dac50fSopenharmony_ci * @brief Get pair status. 135e0dac50fSopenharmony_ci * 136e0dac50fSopenharmony_ci * @return the pair status of window pair 137e0dac50fSopenharmony_ci */ 138e0dac50fSopenharmony_ci WindowPairStatus GetPairStatus() const; 139e0dac50fSopenharmony_ci 140e0dac50fSopenharmony_ci /** 141e0dac50fSopenharmony_ci * @brief Get all window node form pair in Z order. 142e0dac50fSopenharmony_ci * 143e0dac50fSopenharmony_ci * @return the list window form pair 144e0dac50fSopenharmony_ci */ 145e0dac50fSopenharmony_ci std::vector<sptr<WindowNode>> GetOrderedPair(sptr<WindowNode>& node); 146e0dac50fSopenharmony_ci 147e0dac50fSopenharmony_ci /** 148e0dac50fSopenharmony_ci * @brief Get all window node form pair. 149e0dac50fSopenharmony_ci * 150e0dac50fSopenharmony_ci * @return the list window form pair 151e0dac50fSopenharmony_ci */ 152e0dac50fSopenharmony_ci std::vector<sptr<WindowNode>> GetPairedWindows(); 153e0dac50fSopenharmony_ci 154e0dac50fSopenharmony_ci /** 155e0dac50fSopenharmony_ci * @brief Get whether dock slice is forbidden to move. 156e0dac50fSopenharmony_ci * 157e0dac50fSopenharmony_ci * @return whether dock slice is forbidden to move 158e0dac50fSopenharmony_ci */ 159e0dac50fSopenharmony_ci bool IsForbidDockSliceMove() const; 160e0dac50fSopenharmony_ci 161e0dac50fSopenharmony_ci /** 162e0dac50fSopenharmony_ci * @brief Exit split screen mode when dock slice in exit split screen mode area. 163e0dac50fSopenharmony_ci */ 164e0dac50fSopenharmony_ci void ExitSplitMode(); 165e0dac50fSopenharmony_ci 166e0dac50fSopenharmony_ci /** 167e0dac50fSopenharmony_ci * @brief whether dock slice in exit split screen mode area 168e0dac50fSopenharmony_ci */ 169e0dac50fSopenharmony_ci bool IsDockSliceInExitSplitModeArea(const std::vector<int32_t>& exitSplitPoints); 170e0dac50fSopenharmony_ci 171e0dac50fSopenharmony_ci /** 172e0dac50fSopenharmony_ci * @brief Set the initial rect of divider window. 173e0dac50fSopenharmony_ci * 174e0dac50fSopenharmony_ci * @param rect divider window rect 175e0dac50fSopenharmony_ci */ 176e0dac50fSopenharmony_ci void SetDividerRect(const Rect& rect); 177e0dac50fSopenharmony_ci 178e0dac50fSopenharmony_ci /** 179e0dac50fSopenharmony_ci * @brief Update divider window rect when display orientation changed. 180e0dac50fSopenharmony_ci * 181e0dac50fSopenharmony_ci * @param rect default divider rect 182e0dac50fSopenharmony_ci */ 183e0dac50fSopenharmony_ci void RotateDividerWindow(const Rect& rect); 184e0dac50fSopenharmony_ci 185e0dac50fSopenharmony_ci /** 186e0dac50fSopenharmony_ci * @brief Take window pair node snapshot. 187e0dac50fSopenharmony_ci */ 188e0dac50fSopenharmony_ci bool TakePairSnapshot(); 189e0dac50fSopenharmony_ci 190e0dac50fSopenharmony_ci /** 191e0dac50fSopenharmony_ci * @brief Clear window pair node snapshot. 192e0dac50fSopenharmony_ci */ 193e0dac50fSopenharmony_ci void ClearPairSnapshot(); 194e0dac50fSopenharmony_ci 195e0dac50fSopenharmony_ci /** 196e0dac50fSopenharmony_ci * @brief Set split ratio config. 197e0dac50fSopenharmony_ci */ 198e0dac50fSopenharmony_ci void SetSplitRatioConfig(const SplitRatioConfig& splitRatioConfig); 199e0dac50fSopenharmony_ci 200e0dac50fSopenharmony_ci /** 201e0dac50fSopenharmony_ci * @brief Calculate split ratio points. 202e0dac50fSopenharmony_ci */ 203e0dac50fSopenharmony_ci void CalculateSplitRatioPoints(const Rect& displayRect); 204e0dac50fSopenharmony_ci 205e0dac50fSopenharmony_ci /** 206e0dac50fSopenharmony_ci * @brief Get exit split points. 207e0dac50fSopenharmony_ci */ 208e0dac50fSopenharmony_ci std::vector<int32_t> GetExitSplitPoints(); 209e0dac50fSopenharmony_ci 210e0dac50fSopenharmony_ci /** 211e0dac50fSopenharmony_ci * @brief Get split ratio points. 212e0dac50fSopenharmony_ci */ 213e0dac50fSopenharmony_ci std::vector<int32_t> GetSplitRatioPoints(); 214e0dac50fSopenharmony_ci 215e0dac50fSopenharmony_ci /** 216e0dac50fSopenharmony_ci * @brief is during split. 217e0dac50fSopenharmony_ci * @return true means existing recent or status is not PARI_DONE. 218e0dac50fSopenharmony_ci */ 219e0dac50fSopenharmony_ci bool IsDuringSplit(); 220e0dac50fSopenharmony_ci 221e0dac50fSopenharmony_ciprivate: 222e0dac50fSopenharmony_ci /** 223e0dac50fSopenharmony_ci * @brief Gets whether the window is related to split window. 224e0dac50fSopenharmony_ci * 225e0dac50fSopenharmony_ci * @param node target node 226e0dac50fSopenharmony_ci * @return Whether target node is related to the split window 227e0dac50fSopenharmony_ci */ 228e0dac50fSopenharmony_ci bool IsSplitRelated(sptr<WindowNode>& node) const; 229e0dac50fSopenharmony_ci 230e0dac50fSopenharmony_ci /** 231e0dac50fSopenharmony_ci * @brief Check Z order for window node form pair. 232e0dac50fSopenharmony_ci * 233e0dac50fSopenharmony_ci * @return the Z order of window form pair 234e0dac50fSopenharmony_ci */ 235e0dac50fSopenharmony_ci void CheckOrderedPairZorder( 236e0dac50fSopenharmony_ci sptr<WindowNode>& node, bool& hasPrimaryDialog, bool& hasSecondaryDialog, bool& isPrimaryAbove); 237e0dac50fSopenharmony_ci 238e0dac50fSopenharmony_ci /** 239e0dac50fSopenharmony_ci * @brief Create all window node form pair. 240e0dac50fSopenharmony_ci * 241e0dac50fSopenharmony_ci * @return the list window form pair 242e0dac50fSopenharmony_ci */ 243e0dac50fSopenharmony_ci std::vector<sptr<WindowNode>> CreateOrderedPair( 244e0dac50fSopenharmony_ci sptr<WindowNode>& bottom, sptr<WindowNode>& mid, sptr<WindowNode>& top); 245e0dac50fSopenharmony_ci 246e0dac50fSopenharmony_ci /** 247e0dac50fSopenharmony_ci * @brief Replace paired window. 248e0dac50fSopenharmony_ci * 249e0dac50fSopenharmony_ci * @param node current node 250e0dac50fSopenharmony_ci */ 251e0dac50fSopenharmony_ci void Insert(sptr<WindowNode>& node); 252e0dac50fSopenharmony_ci 253e0dac50fSopenharmony_ci /** 254e0dac50fSopenharmony_ci * @brief Update paired window node 255e0dac50fSopenharmony_ci * 256e0dac50fSopenharmony_ci */ 257e0dac50fSopenharmony_ci void HandlePairedNodesChange(); 258e0dac50fSopenharmony_ci 259e0dac50fSopenharmony_ci /** 260e0dac50fSopenharmony_ci * @brief Update pair status 261e0dac50fSopenharmony_ci * 262e0dac50fSopenharmony_ci */ 263e0dac50fSopenharmony_ci void UpdateWindowPairStatus(); 264e0dac50fSopenharmony_ci 265e0dac50fSopenharmony_ci /** 266e0dac50fSopenharmony_ci * @brief Switch the position of two paired window. 267e0dac50fSopenharmony_ci * 268e0dac50fSopenharmony_ci */ 269e0dac50fSopenharmony_ci void SwitchPosition(); 270e0dac50fSopenharmony_ci 271e0dac50fSopenharmony_ci /** 272e0dac50fSopenharmony_ci * @brief Dump the info of pair. 273e0dac50fSopenharmony_ci * 274e0dac50fSopenharmony_ci */ 275e0dac50fSopenharmony_ci void DumpPairInfo(); 276e0dac50fSopenharmony_ci 277e0dac50fSopenharmony_ci /** 278e0dac50fSopenharmony_ci * @brief Send split screen event. 279e0dac50fSopenharmony_ci * 280e0dac50fSopenharmony_ci * @param msgType split event message type 281e0dac50fSopenharmony_ci * @param missionId mission id 282e0dac50fSopenharmony_ci */ 283e0dac50fSopenharmony_ci void SendSplitScreenCommonEvent(SplitEventMsgType msgType, int32_t missionId); 284e0dac50fSopenharmony_ci 285e0dac50fSopenharmony_ci /** 286e0dac50fSopenharmony_ci * @brief Send split screen event to notify create recent view. 287e0dac50fSopenharmony_ci * 288e0dac50fSopenharmony_ci * @param node split node 289e0dac50fSopenharmony_ci */ 290e0dac50fSopenharmony_ci void NotifyShowRecent(sptr<WindowNode> node); 291e0dac50fSopenharmony_ci 292e0dac50fSopenharmony_ci /** 293e0dac50fSopenharmony_ci * @brief Send split screen event to notify create or destroy divider window. 294e0dac50fSopenharmony_ci * 295e0dac50fSopenharmony_ci * @param node split node 296e0dac50fSopenharmony_ci * @param isDestroy destroy or create divider window flag 297e0dac50fSopenharmony_ci */ 298e0dac50fSopenharmony_ci void NotifyCreateOrDestroyDivider(sptr<WindowNode> node, bool isDestroy); 299e0dac50fSopenharmony_ci 300e0dac50fSopenharmony_ci /** 301e0dac50fSopenharmony_ci * @brief Calculate and Get split ratio point 302e0dac50fSopenharmony_ci */ 303e0dac50fSopenharmony_ci int32_t GetSplitRatioPoint(float ratio, const Rect& displayRect); 304e0dac50fSopenharmony_ci 305e0dac50fSopenharmony_ciprivate: 306e0dac50fSopenharmony_ci float ratio_ = DEFAULT_SPLIT_RATIO; 307e0dac50fSopenharmony_ci DisplayId displayId_; 308e0dac50fSopenharmony_ci sptr<WindowNode> primary_; 309e0dac50fSopenharmony_ci sptr<WindowNode> secondary_; 310e0dac50fSopenharmony_ci sptr<WindowNode> divider_; 311e0dac50fSopenharmony_ci WindowPairStatus status_ = {WindowPairStatus::EMPTY}; 312e0dac50fSopenharmony_ci Rect dividerRect_ {0, 0, 0, 0}; 313e0dac50fSopenharmony_ci std::vector<int32_t> exitSplitPoints_; // 2 element, first element < second element 314e0dac50fSopenharmony_ci std::vector<int32_t> splitRatioPoints_; 315e0dac50fSopenharmony_ci SplitRatioConfig splitRatioConfig_; 316e0dac50fSopenharmony_ci DEFINE_VAR_DEFAULT_FUNC_SET(bool, AllSplitAppWindowsRestoring, isAllSplitAppWindowsRestoring, false) 317e0dac50fSopenharmony_ci}; 318e0dac50fSopenharmony_ci} // namespace Rosen 319e0dac50fSopenharmony_ci} // namespace OHOS 320e0dac50fSopenharmony_ci#endif // OHOS_ROSEN_WINDOW_PAIR_H