From 45c328f493429671567715e9ea71f9d151699d81 Mon Sep 17 00:00:00 2001 From: gcw_bkPrirku Date: Thu, 11 Sep 2025 21:47:26 +0800 Subject: [PATCH] add sync when rotate with no animation. Signed-off-by: gcw_bkPrirku --- utils/include/rs_adapter.h | 2 + utils/src/rs_adapter.cpp | 12 ++++++ .../js_transaction_manager.cpp | 38 +++++++++++++++++-- .../src/zidl/session_stage_proxy.cpp | 3 ++ 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/utils/include/rs_adapter.h b/utils/include/rs_adapter.h index 4c88fb9ab1..964d54bbaf 100644 --- a/utils/include/rs_adapter.h +++ b/utils/include/rs_adapter.h @@ -109,6 +109,8 @@ public: static std::shared_ptr GetRSTransaction(const std::shared_ptr& rsUIContext); static std::shared_ptr GetRSTransaction(const std::shared_ptr& rsNode); + static void OpenSyncTransaction(const std::shared_ptr& rsUIContext, bool isInnerProcess, + const std::shared_ptr& handler = nullptr); static void OpenSyncTransaction(const std::shared_ptr& rsUIContext, const std::shared_ptr& handler = nullptr); static void OpenSyncTransaction(const std::shared_ptr& rsNode, diff --git a/utils/src/rs_adapter.cpp b/utils/src/rs_adapter.cpp index b2992bdb21..2885c48bca 100644 --- a/utils/src/rs_adapter.cpp +++ b/utils/src/rs_adapter.cpp @@ -374,6 +374,18 @@ void RSSyncTransactionAdapter::OpenSyncTransaction( __func__); } +void RSSyncTransactionAdapter::OpenSyncTransaction(const std::shared_ptr& rsUIContext, + bool isInnerProcess, const std::shared_ptr& handler) +{ + InvokeSyncTransaction( + rsUIContext, + [isInnerProcess, handler](auto& invoker) { + RETURN_IF_PARAM_IS_NULL(invoker); + invoker->OpenSyncTransaction(handler, isInnerProcess); + }, + __func__); +} + void RSSyncTransactionAdapter::OpenSyncTransaction( const std::shared_ptr& rsNode, const std::shared_ptr& handler) { diff --git a/window_scene/interfaces/kits/napi/transaction_manager/js_transaction_manager.cpp b/window_scene/interfaces/kits/napi/transaction_manager/js_transaction_manager.cpp index 144dad2029..79ec13ab8b 100644 --- a/window_scene/interfaces/kits/napi/transaction_manager/js_transaction_manager.cpp +++ b/window_scene/interfaces/kits/napi/transaction_manager/js_transaction_manager.cpp @@ -120,13 +120,45 @@ ScreenId ParseScreenIdFromArgs(napi_env env, napi_callback_info info) return static_cast(screenIdValue); } +std::pair ParseScreenIdAndInnerProcessFromArgs(napi_env env, napi_callback_info info) +{ + size_t argc = 2; + napi_value argv[2] = { nullptr }; + napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); + int64_t screenIdValue = static_cast(SCREEN_ID_INVALID); + bool isInnerProcess = false; + if (argc != 2) { + TLOGW(WmsLogTag::DEFAULT, "Argc is invalid: %{public}zu", argc); + return std::make_pair(SCREEN_ID_INVALID, isInnerProcess); + } + + if (!ConvertFromJsValue(env, argv[0], screenIdValue)) { + TLOGW(WmsLogTag::DEFAULT, "Failed to convert parameter to screenId"); + return std::make_pair(SCREEN_ID_INVALID, isInnerProcess); + } + + if (screenIdValue == static_cast(SCREEN_ID_INVALID)) { + TLOGW(WmsLogTag::DEFAULT, "Invalid screenId"); + return std::make_pair(SCREEN_ID_INVALID, isInnerProcess); + } + + if (!ConvertFromJsValue(env, argv[1], isInnerProcess)) { + TLOGW(WmsLogTag::DEFAULT, "Failed to convert parameter to isInnerProcess"); + return std::make_pair(SCREEN_ID_INVALID, isInnerProcess); + } + TLOGW(WmsLogTag::DEFAULT, "screenId: %{public}ld, isInnerProcess: %{public}d", screenIdValue, isInnerProcess); + return std::make_pair(static_cast(screenIdValue), isInnerProcess); +} + napi_value JsTransactionManager::OnOpenSyncTransaction(napi_env env, napi_callback_info info) { - ScreenId screenId = ParseScreenIdFromArgs(env, info); - auto task = [screenId] { + std::pair res = ParseScreenIdAndInnerProcessFromArgs(env, info); + ScreenId screenId = res.first; + bool isInnerProcess = res.second; + auto task = [screenId, isInnerProcess] { auto rsUIContext = ScreenSessionManagerClient::GetInstance().GetRSUIContext(screenId); RSTransactionAdapter::FlushImplicitTransaction(rsUIContext); - RSSyncTransactionAdapter::OpenSyncTransaction(rsUIContext); + RSSyncTransactionAdapter::OpenSyncTransaction(rsUIContext, isInnerProcess); }; auto handler = SceneSessionManager::GetInstance().GetTaskScheduler(); if (handler) { diff --git a/window_scene/session/container/src/zidl/session_stage_proxy.cpp b/window_scene/session/container/src/zidl/session_stage_proxy.cpp index 53ec21dbf6..0412c4df74 100644 --- a/window_scene/session/container/src/zidl/session_stage_proxy.cpp +++ b/window_scene/session/container/src/zidl/session_stage_proxy.cpp @@ -199,6 +199,9 @@ WSError SessionStageProxy::UpdateRect(const WSRect& rect, SizeChangeReason reaso WLOGFE("Write has transaction failed"); return WSError::WS_ERROR_IPC_FAILED; } + bool isInnerProcess = hasRSTransaction ? rsTransaction->GetInnerProcessFlag() : false; + TLOGD(WmsLogTag::DEFAULT, "hasRSTransaction: %{public}d, isInnerProcess: %{public}d", hasRSTransaction, + isInnerProcess); if (hasRSTransaction) { auto pid = rsTransaction->GetParentPid(); rsTransaction->SetParentPid(getprocpid()); -- Gitee