From f4a10b3ac2ccb10cd2ede309c326c70d04cdd0ce Mon Sep 17 00:00:00 2001 From: xukunkun Date: Mon, 15 Aug 2022 11:01:27 +0800 Subject: [PATCH] If window mode is undefined, set it from configuration. Signed-off-by: xukunkun --- interfaces/innerkits/wm/window_option.h | 2 +- interfaces/innerkits/wm/wm_common.h | 1 + .../config/rk3568/window_manager_config.xml | 2 + utils/include/window_property.h | 4 +- wm/include/window_impl.h | 4 + wm/src/window_impl.cpp | 75 +++++++++++++++---- wmserver/include/starting_window.h | 2 + wmserver/src/starting_window.cpp | 7 ++ wmserver/src/window_manager_config.cpp | 3 +- wmserver/src/window_manager_service.cpp | 14 +++- wmserver/src/zidl/window_manager_proxy.cpp | 1 + wmserver/src/zidl/window_manager_stub.cpp | 1 + 12 files changed, 97 insertions(+), 19 deletions(-) diff --git a/interfaces/innerkits/wm/window_option.h b/interfaces/innerkits/wm/window_option.h index 83dffb17..b39be110 100644 --- a/interfaces/innerkits/wm/window_option.h +++ b/interfaces/innerkits/wm/window_option.h @@ -71,7 +71,7 @@ public: private: Rect windowRect_ { 0, 0, 0, 0 }; WindowType type_ { WindowType::WINDOW_TYPE_APP_MAIN_WINDOW }; - WindowMode mode_ { WindowMode::WINDOW_MODE_FULLSCREEN }; + WindowMode mode_ { WindowMode::WINDOW_MODE_UNDEFINED }; WindowBlurLevel level_ { WindowBlurLevel::WINDOW_BLUR_OFF }; bool focusable_ { true }; bool touchable_ { true }; diff --git a/interfaces/innerkits/wm/wm_common.h b/interfaces/innerkits/wm/wm_common.h index 49536508..9edac951 100644 --- a/interfaces/innerkits/wm/wm_common.h +++ b/interfaces/innerkits/wm/wm_common.h @@ -359,6 +359,7 @@ enum class WindowUpdateType : int32_t { struct SystemConfig { bool isSystemDecorEnable_ = true; bool isStretchable_ = false; + WindowMode defaultWindowMode_ = WindowMode::WINDOW_MODE_FULLSCREEN; }; } } diff --git a/resources/config/rk3568/window_manager_config.xml b/resources/config/rk3568/window_manager_config.xml index db2b08f9..223b5bb1 100644 --- a/resources/config/rk3568/window_manager_config.xml +++ b/resources/config/rk3568/window_manager_config.xml @@ -28,4 +28,6 @@ 0.1 0.9 0.5 0.33 0.67 + + 1 \ No newline at end of file diff --git a/utils/include/window_property.h b/utils/include/window_property.h index dc6fb03a..c2b6d797 100644 --- a/utils/include/window_property.h +++ b/utils/include/window_property.h @@ -138,9 +138,9 @@ private: Rect windowRect_ { 0, 0, 0, 0 }; // actual window rect bool decoStatus_ { false }; // window has been decorated or not WindowType type_ { WindowType::WINDOW_TYPE_APP_MAIN_WINDOW }; - WindowMode mode_ { WindowMode::WINDOW_MODE_FULLSCREEN }; + WindowMode mode_ { WindowMode::WINDOW_MODE_UNDEFINED }; WindowBlurLevel level_ { WindowBlurLevel::WINDOW_BLUR_OFF }; - WindowMode lastMode_ { WindowMode::WINDOW_MODE_FULLSCREEN }; + WindowMode lastMode_ { WindowMode::WINDOW_MODE_UNDEFINED }; uint32_t flags_ { 0 }; bool isFullScreen_ { true }; bool focusable_ { true }; diff --git a/wm/include/window_impl.h b/wm/include/window_impl.h index 6f19d664..591eeeba 100644 --- a/wm/include/window_impl.h +++ b/wm/include/window_impl.h @@ -377,6 +377,9 @@ private: uint32_t GetModeSupportInfo() const; WMError PreProcessShow(uint32_t reason, bool withAnimation); bool NeedToStopShowing(); + bool WindowCreateCheck(const std::string& parentName); + bool IsAppMainOrSubOrFloatingWindow(); + void SetSystemConfig(); // colorspace, gamut using ColorSpaceConvertMap = struct { @@ -433,6 +436,7 @@ private: bool isWaitingFrame_ = false; bool needRemoveWindowInputChannel_ = false; bool isListenerHandlerRunning_ = false; + bool isAppFloatingWindow_ = false; }; } // namespace Rosen } // namespace OHOS diff --git a/wm/src/window_impl.cpp b/wm/src/window_impl.cpp index 52ca93ee..b6f1adf5 100755 --- a/wm/src/window_impl.cpp +++ b/wm/src/window_impl.cpp @@ -756,19 +756,62 @@ void WindowImpl::UpdateTitleButtonVisibility() uiContent_->HideWindowTitleButton(hideSplitButton, hideMaximizeButton, false); } -WMError WindowImpl::Create(const std::string& parentName, const std::shared_ptr& context) +bool WindowImpl::IsAppMainOrSubOrFloatingWindow() +{ + // App main window need decor config, stretchable config and effect config + // App sub window and float window need effect config + if (WindowHelper::IsAppWindow(GetType())) { + return true; + } + + if (WindowHelper::IsAppFloatingWindow(GetType())) { + for (auto& winPair : windowMap_) { + auto win = winPair.second.second; + if (win != nullptr && win->GetType() == WindowType::WINDOW_TYPE_APP_MAIN_WINDOW && + context_.get() == win->GetContext().get()) { + isAppFloatingWindow_ = true; + return true; + } + } + } + return false; +} + +void WindowImpl::SetSystemConfig() +{ + if (!IsAppMainOrSubOrFloatingWindow()) { + return; + } + if (SingletonContainer::Get().GetSystemConfig(windowSystemConfig_) == WMError::WM_OK) { + if (WindowHelper::IsMainWindow(property_->GetWindowType())) { + WLOGFI("get system decor enable:%{public}d", windowSystemConfig_.isSystemDecorEnable_); + property_->SetDecorEnable(windowSystemConfig_.isSystemDecorEnable_); + WLOGFI("get stretchable enable:%{public}d", windowSystemConfig_.isStretchable_); + property_->SetStretchable(windowSystemConfig_.isStretchable_); + // if window mode is undefined, set it from configuration + if (property_->GetWindowMode() == WindowMode::WINDOW_MODE_UNDEFINED) { + WLOGFI("get default window mode:%{public}u", windowSystemConfig_.defaultWindowMode_); + property_->SetWindowMode(windowSystemConfig_.defaultWindowMode_); + } + if (property_->GetLastWindowMode() == WindowMode::WINDOW_MODE_UNDEFINED) { + property_->SetLastWindowMode(windowSystemConfig_.defaultWindowMode_); + } + } + } +} + +bool WindowImpl::WindowCreateCheck(const std::string& parentName) { - WLOGFI("[Client] Window [name:%{public}s] Create", name_.c_str()); // check window name, same window names are forbidden if (windowMap_.find(name_) != windowMap_.end()) { WLOGFE("WindowName(%{public}s) already exists.", name_.c_str()); - return WMError::WM_ERROR_INVALID_PARAM; + return false; } // check parent name, if create sub window and there is not exist parent Window, then return if (parentName != "") { if (windowMap_.find(parentName) == windowMap_.end()) { WLOGFE("ParentName is empty or valid. ParentName is %{public}s", parentName.c_str()); - return WMError::WM_ERROR_INVALID_PARAM; + return false; } else { uint32_t parentId = windowMap_[parentName].first; property_->SetParentId(parentId); @@ -777,7 +820,16 @@ WMError WindowImpl::Create(const std::string& parentName, const std::shared_ptr< if (CheckCameraFloatingWindowMultiCreated(property_->GetWindowType())) { WLOGFE("Camera Floating Window already exists."); - return WMError::WM_ERROR_INVALID_WINDOW; + return false; + } + return true; +} + +WMError WindowImpl::Create(const std::string& parentName, const std::shared_ptr& context) +{ + WLOGFI("[Client] Window [name:%{public}s] Create", name_.c_str()); + if (!WindowCreateCheck(parentName)) { + return WMError::WM_ERROR_INVALID_PARAM; } context_ = context; @@ -792,17 +844,14 @@ WMError WindowImpl::Create(const std::string& parentName, const std::shared_ptr< property_->SetTokenState(true); } } + SetSystemConfig(); + if (WindowHelper::IsMainWindow(property_->GetWindowType())) { - if (SingletonContainer::Get().GetSystemConfig(windowSystemConfig_) == WMError::WM_OK) { - WLOGFE("get system decor enable:%{public}d", windowSystemConfig_.isSystemDecorEnable_); - if (windowSystemConfig_.isSystemDecorEnable_) { - property_->SetDecorEnable(true); - } - WLOGFI("get stretchable enable:%{public}d", windowSystemConfig_.isStretchable_); - property_->SetStretchable(windowSystemConfig_.isStretchable_); - } GetConfigurationFromAbilityInfo(); + } else if (property_->GetWindowMode() == WindowMode::WINDOW_MODE_UNDEFINED) { + property_->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN); } + WMError ret = SingletonContainer::Get().CreateWindow(windowAgent, property_, surfaceNode_, windowId, token); RecordLifeCycleExceptionEvent(LifeCycleEvent::CREATE_EVENT, ret); diff --git a/wmserver/include/starting_window.h b/wmserver/include/starting_window.h index 6385e6cd..4a53e18c 100644 --- a/wmserver/include/starting_window.h +++ b/wmserver/include/starting_window.h @@ -40,11 +40,13 @@ public: static void ReleaseStartWinSurfaceNode(sptr& node); static bool NeedToStopStartingWindow(WindowMode winMode, uint32_t modeSupportInfo, const sptr& info); + static void SetDefaultWindowMode(WindowMode defaultMode); private: static WMError CreateLeashAndStartingSurfaceNode(sptr& node); static SurfaceDraw surfaceDraw_; static std::recursive_mutex mutex_; + static WindowMode defaultMode_; }; } // Rosen } // OHOS diff --git a/wmserver/src/starting_window.cpp b/wmserver/src/starting_window.cpp index ff0c636a..1c83288e 100644 --- a/wmserver/src/starting_window.cpp +++ b/wmserver/src/starting_window.cpp @@ -30,6 +30,7 @@ namespace { } std::recursive_mutex StartingWindow::mutex_; +WindowMode StartingWindow::defaultMode_ = WindowMode::WINDOW_MODE_FULLSCREEN; bool StartingWindow::NeedToStopStartingWindow(WindowMode winMode, uint32_t modeSupportInfo, const sptr& info) @@ -56,6 +57,8 @@ sptr StartingWindow::CreateWindowNode(const sptrSetRequestRect(info->GetWindowRect()); if (WindowHelper::IsValidWindowMode(info->GetWindowMode())) { property->SetWindowMode(info->GetWindowMode()); + } else { + property->SetWindowMode(defaultMode_); } property->SetDisplayId(info->GetDisplayId()); @@ -220,5 +223,9 @@ void StartingWindow::UpdateRSTree(sptr& node) updateRSTreeFunc(); } } +void StartingWindow::SetDefaultWindowMode(WindowMode defaultMode) +{ + defaultMode_ = defaultMode; +} } // Rosen } // OHOS diff --git a/wmserver/src/window_manager_config.cpp b/wmserver/src/window_manager_config.cpp index cdc0d615..7cd3a2c7 100644 --- a/wmserver/src/window_manager_config.cpp +++ b/wmserver/src/window_manager_config.cpp @@ -73,7 +73,8 @@ bool WindowManagerConfig::LoadConfigXml() continue; } if (!xmlStrcmp(nodeName, reinterpret_cast("maxAppWindowNumber")) || - !xmlStrcmp(nodeName, reinterpret_cast("modeChangeHotZones"))) { + !xmlStrcmp(nodeName, reinterpret_cast("modeChangeHotZones")) || + !xmlStrcmp(nodeName, reinterpret_cast("defaultWindowMode"))) { ReadIntNumbersConfigInfo(curNodePtr); continue; } diff --git a/wmserver/src/window_manager_service.cpp b/wmserver/src/window_manager_service.cpp index cd4a505d..4e22fe4a 100644 --- a/wmserver/src/window_manager_service.cpp +++ b/wmserver/src/window_manager_service.cpp @@ -30,6 +30,7 @@ #include "permission.h" #include "remote_animation.h" #include "singleton_container.h" +#include "starting_window.h" #include "ui/rs_ui_director.h" #include "window_helper.h" #include "window_inner_manager.h" @@ -279,6 +280,16 @@ void WindowManagerService::ConfigureWindowManagerService() systemConfig_.isStretchable_ = enableConfig.at("stretchable"); } + if (intNumbersConfig.count("defaultWindowMode") != 0) { + auto numbers = intNumbersConfig.at("defaultWindowMode"); + if (numbers.size() == 1 && + (numbers[0] == static_cast(WindowMode::WINDOW_MODE_FULLSCREEN) || + numbers[0] == static_cast(WindowMode::WINDOW_MODE_FLOATING))) { + systemConfig_.defaultWindowMode_ = static_cast(static_cast(numbers[0])); + StartingWindow::SetDefaultWindowMode(systemConfig_.defaultWindowMode_); + } + } + if (intNumbersConfig.count("maxAppWindowNumber") != 0) { auto numbers = intNumbersConfig.at("maxAppWindowNumber"); if (numbers.size() == 1) { @@ -641,8 +652,7 @@ WMError WindowManagerService::GetAccessibilityWindowInfo(sptr(reply.ReadUint32()); int32_t ret = reply.ReadInt32(); return static_cast(ret); } diff --git a/wmserver/src/zidl/window_manager_stub.cpp b/wmserver/src/zidl/window_manager_stub.cpp index ba9832d4..52e07855 100644 --- a/wmserver/src/zidl/window_manager_stub.cpp +++ b/wmserver/src/zidl/window_manager_stub.cpp @@ -166,6 +166,7 @@ int32_t WindowManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, M WMError errCode = GetSystemConfig(config); reply.WriteBool(config.isSystemDecorEnable_); reply.WriteBool(config.isStretchable_); + reply.WriteUint32(static_cast(config.defaultWindowMode_)); reply.WriteInt32(static_cast(errCode)); break; }