From cb6303234934b152a9727e4baee6ab834ea46255 Mon Sep 17 00:00:00 2001 From: zhoulingxiao Date: Mon, 17 Mar 2025 12:11:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A3=80=E8=A7=86=E6=84=8F=E8=A7=81=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhoulingxiao --- utils/src/vsync_station.cpp | 11 +- .../session/host/include/scene_session.h | 2 +- .../session/host/src/scene_session.cpp | 141 +++++++++--------- wm/include/window_scene_session_impl.h | 8 +- wm/include/window_session_impl.h | 10 +- wm/src/window_scene_session_impl.cpp | 2 +- 6 files changed, 94 insertions(+), 80 deletions(-) diff --git a/utils/src/vsync_station.cpp b/utils/src/vsync_station.cpp index a9850ebd60..dbe7309775 100644 --- a/utils/src/vsync_station.cpp +++ b/utils/src/vsync_station.cpp @@ -285,8 +285,15 @@ void VsyncStation::SetUiDvsyncSwitch(bool dvsyncSwitch) void VsyncStation::DecreaseRequestVsyncTimes() { - requestVsyncTimes_--; - requestVsyncTimes_ = std::max(requestVsyncTimes_.load(), 0); + int32_t current = 0; + int32_t desired = 0; + do { + current = requestVsyncTimes_.load(); + if (current == 0) { + break; + } + desired = current - 1; + } while (!requestVsyncTimes_.compare_exchange_weak(current, desired)); } } // namespace Rosen diff --git a/window_scene/session/host/include/scene_session.h b/window_scene/session/host/include/scene_session.h index b76ad639ae..2f6f4b2acc 100644 --- a/window_scene/session/host/include/scene_session.h +++ b/window_scene/session/host/include/scene_session.h @@ -861,7 +861,7 @@ private: * Window Immersive */ void SetSystemBarPropertyForRotation(const std::map& properties); - std::map GetSystemBarPropertyForRotation(); + std::map& GetSystemBarPropertyForRotation(); void GetSystemAvoidArea(WSRect& rect, AvoidArea& avoidArea); void GetCutoutAvoidArea(WSRect& rect, AvoidArea& avoidArea); void GetKeyboardAvoidArea(WSRect& rect, AvoidArea& avoidArea); diff --git a/window_scene/session/host/src/scene_session.cpp b/window_scene/session/host/src/scene_session.cpp index 83bc3f324f..b4ca887b38 100644 --- a/window_scene/session/host/src/scene_session.cpp +++ b/window_scene/session/host/src/scene_session.cpp @@ -2441,77 +2441,6 @@ WSError SceneSession::GetAllAvoidAreas(std::map& avoid }, __func__); } -void SceneSession::SetSessionGetTargetOrientationConfigInfoCallback( - const NotifySessionGetTargetOrientationConfigInfoFunc& func) -{ - PostTask([weakThis = wptr(this), func, where = __func__] { - auto session = weakThis.promote(); - if (!session) { - TLOGNE(WmsLogTag::WMS_ROTATION, "%{public}s session is null", where); - return WSError::WS_ERROR_NULLPTR; - } - session->sessionGetTargetOrientationConfigInfoFunc_ = func; - return WSError::WS_OK; - }, __func__); -} - -WSError SceneSession::GetTargetOrientationConfigInfo(Orientation targetOrientation, - const std::map& properties) -{ - PostTask( - [weakThis = wptr(this), targetOrientation, properties, where = __func__] { - auto session = weakThis.promote(); - if (!session) { - TLOGNE(WmsLogTag::WMS_ROTATION, "%{public}s session is null", where); - return WSError::WS_ERROR_NULLPTR; - } - session->SetSystemBarPropertyForRotation(properties); - if (session->sessionGetTargetOrientationConfigInfoFunc_) { - session->sessionGetTargetOrientationConfigInfoFunc_(static_cast(targetOrientation)); - } - return WSError::WS_OK; - }, - __func__); - return WSError::WS_OK; -} - -WSError SceneSession::NotifyRotationProperty(int32_t rotation, uint32_t width, uint32_t height) -{ - PostTask( - [weakThis = wptr(this), rotation, width, height, where = __func__] { - auto session = weakThis.promote(); - if (!session) { - TLOGNE(WmsLogTag::WMS_ROTATION, "%{public}s session is null", where); - return WSError::WS_ERROR_NULLPTR; - } - WSRect wsrect = { 0, 0, width, height }; - auto properties = session->GetSystemBarPropertyForRotation(); - std::map avoidAreas; - // session->GetAvoidAreasByRotation(rotation, wsrect, properties, avoidAreas); // - // 此行代码依赖沉浸式,需要先注释 - if (!session->sessionStage_) { - return WSError::WS_ERROR_NULLPTR; - } - Rect rect = { wsrect.posX_, wsrect.posY_, wsrect.width_, wsrect.height_ }; - OrientationInfo info = { rotation, rect, avoidAreas }; - session->sessionStage_->NotifyTargetRotationInfo(info); - return WSError::WS_OK; - }, - __func__); - return WSError::WS_OK; -} - -void SceneSession::SetSystemBarPropertyForRotation( - const std::map& properties) -{ - targetSystemBarProperty_ = properties; -} - -std::map SceneSession::GetSystemBarPropertyForRotation() -{ - return targetSystemBarProperty_; -} - WSError SceneSession::UpdateAvoidArea(const sptr& avoidArea, AvoidAreaType type) { if (!sessionStage_) { @@ -7199,6 +7128,76 @@ void SceneSession::AddSidebarBlur() } } +void SceneSession::SetSessionGetTargetOrientationConfigInfoCallback( + const NotifySessionGetTargetOrientationConfigInfoFunc& func) +{ + PostTask( + [weakThis = wptr(this), func, where = __func__] { + auto session = weakThis.promote(); + if (!session) { + TLOGNE(WmsLogTag::WMS_ROTATION, "%{public}s session is null", where); + return WSError::WS_ERROR_NULLPTR; + } + session->sessionGetTargetOrientationConfigInfoFunc_ = func; + return WSError::WS_OK; + }, __func__); +} + +WSError SceneSession::GetTargetOrientationConfigInfo(Orientation targetOrientation, + const std::map& properties) +{ + PostTask( + [weakThis = wptr(this), targetOrientation, properties, where = __func__] { + auto session = weakThis.promote(); + if (!session) { + TLOGNE(WmsLogTag::WMS_ROTATION, "%{public}s session is null", where); + return WSError::WS_ERROR_NULLPTR; + } + session->SetSystemBarPropertyForRotation(properties); + if (session->sessionGetTargetOrientationConfigInfoFunc_) { + session->sessionGetTargetOrientationConfigInfoFunc_(static_cast(targetOrientation)); + } + return WSError::WS_OK; + }, __func__); + return WSError::WS_OK; +} + +WSError SceneSession::NotifyRotationProperty(int32_t rotation, uint32_t width, uint32_t height) +{ + PostTask( + [weakThis = wptr(this), rotation, width, height, where = __func__] { + auto session = weakThis.promote(); + if (!session) { + TLOGNE(WmsLogTag::WMS_ROTATION, "%{public}s session is null", where); + return WSError::WS_ERROR_NULLPTR; + } + WSRect wsrect = { 0, 0, width, height }; + auto properties = session->GetSystemBarPropertyForRotation(); + std::map avoidAreas; + // session->GetAvoidAreasByRotation(rotation, wsrect, properties, avoidAreas); // + // 此行代码依赖沉浸式,需要先注释 + if (!session->sessionStage_) { + return WSError::WS_ERROR_NULLPTR; + } + Rect rect = { wsrect.posX_, wsrect.posY_, wsrect.width_, wsrect.height_ }; + OrientationInfo info = { rotation, rect, avoidAreas }; + session->sessionStage_->NotifyTargetRotationInfo(info); + return WSError::WS_OK; + }, __func__); + return WSError::WS_OK; +} + +void SceneSession::SetSystemBarPropertyForRotation( + const std::map& properties) +{ + targetSystemBarProperty_ = properties; +} + +std::map& SceneSession::GetSystemBarPropertyForRotation() +{ + return targetSystemBarProperty_; +} + void SceneSession::AddRSNodeModifier(bool isDark, const std::shared_ptr& rsNode) { if (!rsNode) { diff --git a/wm/include/window_scene_session_impl.h b/wm/include/window_scene_session_impl.h index d2a52a711f..b4a7e2d96b 100644 --- a/wm/include/window_scene_session_impl.h +++ b/wm/include/window_scene_session_impl.h @@ -140,8 +140,6 @@ public: WMError GetTargetOrientationConfigInfo(Orientation targetOrientation, const std::map& properties, Ace::ViewportConfig& config, std::map& avoidAreas) override; - Ace::ViewportConfig FillTargetOrientationConfig( - OrientationInfo info, const sptr& displayInfo, uint64_t displayId); WSError NotifyTargetRotationInfo(OrientationInfo& info) override; WSError UpdateDisplayId(uint64_t displayId) override; WMError AdjustKeyboardLayout(const KeyboardLayoutParams params) override; @@ -436,6 +434,12 @@ private: sptr windowAttachStateChangeListener_; WSError NotifyWindowAttachStateChange(bool isAttach) override; + /* + * Window Rotation + */ + Ace::ViewportConfig FillTargetOrientationConfig( + const OrientationInfo& info, const sptr& displayInfo, uint64_t displayId); + /* * Window Lifecycle */ diff --git a/wm/include/window_session_impl.h b/wm/include/window_session_impl.h index 4a745e38aa..9ae03424be 100644 --- a/wm/include/window_session_impl.h +++ b/wm/include/window_session_impl.h @@ -139,7 +139,6 @@ public: WMError UnregisterPreferredOrientationChangeListener( const sptr& listener) override; void NotifyPreferredOrientationChange(Orientation orientation) override; - void NotifyClientOrientationChange(); WMError RegisterOrientationChangeListener(const sptr& listener) override; WMError UnregisterOrientationChangeListener(const sptr& listener) override; bool GetTouchable() const override; @@ -755,8 +754,8 @@ private: static std::map>> windowStatusChangeListeners_; static std::map>> windowRectChangeListeners_; static std::map>> switchFreeMultiWindowListeners_; - static std::map>> preferredOrientationChangeListener_; - static std::map>> windowOrientationChangeListener_; + static std::map> preferredOrientationChangeListener_; + static std::map> windowOrientationChangeListener_; static std::map>> highlightChangeListeners_; // FA only @@ -835,6 +834,11 @@ private: */ WSError NotifyWindowAttachStateChange(bool isAttach) override { return WSError::WS_OK; } + /* + * Window Rotation + */ + void NotifyClientOrientationChange(); + /* * keyboard */ diff --git a/wm/src/window_scene_session_impl.cpp b/wm/src/window_scene_session_impl.cpp index f1d7a37916..b03ac362b0 100644 --- a/wm/src/window_scene_session_impl.cpp +++ b/wm/src/window_scene_session_impl.cpp @@ -2022,7 +2022,7 @@ WMError WindowSceneSessionImpl::GetTargetOrientationConfigInfo(Orientation targe } Ace::ViewportConfig WindowSceneSessionImpl::FillTargetOrientationConfig( - OrientationInfo info, const sptr& displayInfo, uint64_t displayId) + const OrientationInfo& info, const sptr& displayInfo, uint64_t displayId) { Ace::ViewportConfig config; Rect targetRect = info.rect;