diff --git a/utils/include/rs_adapter.h b/utils/include/rs_adapter.h index 4c88fb9ab1c9862dc7e0ee3169da6c93cbbff47e..964d54bbafa2d0588496198f4b927b7b15f61b91 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 b2992bdb215774fff294a9a225f0eed47419f55c..2885c48bca87d96bcb9d01ed576ae138ec491c33 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 144dad2029f0c5f17e3d6f86bf745f28432f12f5..79ec13ab8b3b3a41a042481b5e731ee585d028f1 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 53ec21dbf669bed366b8051e59c420e6f70303f8..0412c4df74e1ff5f6fd8772dd850669997ee6d5e 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());