From b45be730dbc67f6901a74c74770c4a53af7f9fb5 Mon Sep 17 00:00:00 2001 From: likaiyuan Date: Sat, 13 Sep 2025 16:26:35 +0800 Subject: [PATCH] fix pointer window can't hide Change-Id: Ia18bf97dc46f45f480e828fe637f5fc248f42a5a Signed-off-by: likaiyuan --- service/BUILD.gn | 2 +- service/window_manager/include/screen_pointer.h | 2 +- .../window_manager/src/cursor_drawing_component.cpp | 9 +-------- service/window_manager/src/pointer_drawing_manager.cpp | 8 ++++++++ service/window_manager/src/screen_pointer.cpp | 10 ++++++++++ 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/service/BUILD.gn b/service/BUILD.gn index bb8efa34db..591a1d798e 100644 --- a/service/BUILD.gn +++ b/service/BUILD.gn @@ -478,8 +478,8 @@ ohos_shared_library("libmmi-server") { if (input_feature_touch_drawing) { external_deps += [ - "graphic_2d:librender_service_base", "graphic_2d:librender_service_client", + "graphic_2d:window_animation", ] } diff --git a/service/window_manager/include/screen_pointer.h b/service/window_manager/include/screen_pointer.h index 63593fa476..3a96729bf8 100644 --- a/service/window_manager/include/screen_pointer.h +++ b/service/window_manager/include/screen_pointer.h @@ -38,7 +38,7 @@ public: DISALLOW_COPY_AND_MOVE(ScreenPointer); ScreenPointer(hwcmgr_ptr_t hwcmgr, handler_ptr_t handler, const OLD::DisplayInfo &di); ScreenPointer(hwcmgr_ptr_t hwcmgr, handler_ptr_t handler, screen_info_ptr_t si); - ~ScreenPointer() = default; + ~ScreenPointer(); bool Init(PointerRenderer &render); bool InitSurface(); diff --git a/service/window_manager/src/cursor_drawing_component.cpp b/service/window_manager/src/cursor_drawing_component.cpp index 4be47e37c2..ff3f4e292d 100644 --- a/service/window_manager/src/cursor_drawing_component.cpp +++ b/service/window_manager/src/cursor_drawing_component.cpp @@ -21,9 +21,6 @@ #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) \ @@ -161,10 +158,6 @@ 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); } @@ -504,11 +497,11 @@ void CursorDrawingComponent::NotifyPointerEventToRS(int32_t pointAction, int32_t CHK_IS_LOADV(isLoaded_, pointerInstance_) pointerInstance_->NotifyPointerEventToRS(pointAction, pointCnt); } +#endif // OHOS_BUILD_ENABLE_WATCH void CursorDrawingComponent::InitDefaultMouseIconPath() { CHK_IS_LOADV(isLoaded_, pointerInstance_) pointerInstance_->InitDefaultMouseIconPath(); } -#endif // OHOS_BUILD_ENABLE_WATCH } // namespace OHOS diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp index fdf9da0fe5..6ad9777cb6 100644 --- a/service/window_manager/src/pointer_drawing_manager.cpp +++ b/service/window_manager/src/pointer_drawing_manager.cpp @@ -339,6 +339,14 @@ PointerDrawingManager::~PointerDrawingManager() } screenModeChangeListener_ = nullptr; } + } else { + auto surfaceNodePtr = GetSurfaceNode(); + if (surfaceNodePtr != nullptr) { + surfaceNodePtr->DetachToDisplay(screenId_); + SetSurfaceNode(nullptr); + MMI_HILOGI("Detach screenId:%{public}" PRIu64, screenId_); + Rosen::RSTransaction::FlushImplicitTransaction(); + } } INPUT_DEV_MGR->Detach(self_); Rosen::RSInterfaces::GetInstance().SetOnRemoteDiedCallback(nullptr); diff --git a/service/window_manager/src/screen_pointer.cpp b/service/window_manager/src/screen_pointer.cpp index d6da11bde4..b9edaad24c 100644 --- a/service/window_manager/src/screen_pointer.cpp +++ b/service/window_manager/src/screen_pointer.cpp @@ -98,6 +98,16 @@ ScreenPointer::ScreenPointer(hwcmgr_ptr_t hwcMgr, handler_ptr_t handler, screen_ "rotation=%{public}u, dpi=%{public}f", screenId_, width_, height_, mode_, rotation_, dpi_); } +ScreenPointer::~ScreenPointer() +{ + if (surfaceNode_ != nullptr) { + surfaceNode_->DetachToDisplay(screenId_); + surfaceNode_ = nullptr; + MMI_HILOGI("Detach screenId:%{public}" PRIu64, screenId_); + Rosen::RSTransaction::FlushImplicitTransaction(); + } +} + bool ScreenPointer::Init(PointerRenderer &render) { if (!InitSurface()) { -- Gitee