diff --git a/service/BUILD.gn b/service/BUILD.gn index f3f776dc3961c07a151ef585996d68e7e52b9c86..0d4fcaf0707b7436bdcbee895d0aae6f5e435c3d 100644 --- a/service/BUILD.gn +++ b/service/BUILD.gn @@ -473,9 +473,13 @@ ohos_shared_library("libmmi-server") { } if (input_feature_product == "pc") { + external_deps += [ "eventhandler:libeventhandler" ] + } + + if (input_feature_touch_drawing) { external_deps += [ - "eventhandler:libeventhandler", "graphic_2d:librender_service_base", + "graphic_2d:librender_service_client", ] } diff --git a/service/device_manager/include/pointer_device_manager.h b/service/device_manager/include/pointer_device_manager.h index b8bb1cf5131b43338bd7f7a87a67587d2b990dd7..f29a18c8e1dc3e2f8e94d93569c48b61ee9f9736 100644 --- a/service/device_manager/include/pointer_device_manager.h +++ b/service/device_manager/include/pointer_device_manager.h @@ -37,6 +37,7 @@ public: std::atomic isFirstAddDisplayManagerService { true }; std::atomic isFirstAdddistributedKVDataService { true }; std::atomic isInitDefaultMouseIconPath { false }; + std::atomic isPointerVisible { false }; private: PointerDeviceManager() = default; diff --git a/service/window_manager/src/cursor_drawing_component.cpp b/service/window_manager/src/cursor_drawing_component.cpp index 5ca1ad854bb9e7bd98fde1fc056ef1e545ea0d76..4be47e37c20d7387daab941bcfe682cf2fb97761 100644 --- a/service/window_manager/src/cursor_drawing_component.cpp +++ b/service/window_manager/src/cursor_drawing_component.cpp @@ -21,6 +21,9 @@ #include "mmi_log.h" #include "pointer_device_manager.h" #include "timer_manager.h" +#ifdef OHOS_BUILD_ENABLE_TOUCH_DRAWING +#include "transaction/rs_transaction.h" +#endif // OHOS_BUILD_ENABLE_TOUCH_DRAWING #define MMI_LOG_TAG "CursorDrawingComponent" #define CHK_IS_LOADV(isLoaded, pointerInstance) \ @@ -88,7 +91,7 @@ void CursorDrawingComponent::Load() timerId_ = TimerMgr->AddLongTimer(CHECK_INTERVAL_MS, CHECK_COUNT, [this] { auto idleTime = std::chrono::duration_cast( std::chrono::steady_clock::now() - lastCallTime_).count(); - if ((idleTime >= UNLOAD_TIME_MS) && !POINTER_DEV_MGR.isInit) { + if ((idleTime >= UNLOAD_TIME_MS) && !POINTER_DEV_MGR.isInit && !POINTER_DEV_MGR.isPointerVisible) { CursorDrawingComponent::GetInstance().UnLoad(); } }, "libcursor_drawing_adapter-Unload"); @@ -158,6 +161,10 @@ void CursorDrawingComponent::UnLoad() soHandle_ = nullptr; getPointerInstance_ = nullptr; pointerInstance_ = nullptr; +#ifdef OHOS_BUILD_ENABLE_TOUCH_DRAWING + // When SO unload, surface node destruction needs submit to the render service + Rosen::RSTransaction::FlushImplicitTransaction(); +#endif // OHOS_BUILD_ENABLE_TOUCH_DRAWING MMI_HILOGI("UnLoad %{public}s is succeeded", MULTIMODAL_PATH_NAME); } diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp index 70bd61006fc58ed031434b84ecaef98f0fdf26fa..a123671b8f3d5c61b15e0787362b60890cbba569 100644 --- a/service/window_manager/src/pointer_drawing_manager.cpp +++ b/service/window_manager/src/pointer_drawing_manager.cpp @@ -38,6 +38,7 @@ #include "i_preference_manager.h" #include "parameters.h" #include "pipeline/rs_recording_canvas.h" +#include "pointer_device_manager.h" #include "preferences.h" #include "preferences_errno.h" #include "preferences_helper.h" @@ -2566,6 +2567,7 @@ void PointerDrawingManager::UpdatePointerVisible() CHKPV(surfaceNodePtr); if (IsPointerVisible() && mouseDisplayState_) { surfaceNodePtr->SetVisible(true); + POINTER_DEV_MGR.isPointerVisible = true; if (GetHardCursorEnabled()) { if (InitLayer(MOUSE_ICON(lastMouseStyle_.id)) != RET_OK) { MMI_HILOGE("Init Layer failed"); @@ -2586,6 +2588,7 @@ void PointerDrawingManager::UpdatePointerVisible() HideHardwareCursors(); } surfaceNodePtr->SetVisible(false); + POINTER_DEV_MGR.isPointerVisible = false; MMI_HILOGI("Pointer window hide success, mouseDisplayState_:%{public}s displayId_:%{public}" PRIu64, mouseDisplayState_ ? "true" : "false", displayId_); }