From 7ba41b2eb4f5792d6b17ba68e00135c5d22baac4 Mon Sep 17 00:00:00 2001 From: wanghui Date: Sun, 27 Apr 2025 20:31:44 +0800 Subject: [PATCH] fix dpi changed draw new pointer Signed-off-by: wanghui --- .../include/i_pointer_drawing_manager.h | 4 +++ .../include/input_windows_manager.h | 2 -- .../include/pointer_drawing_manager.h | 1 + .../src/input_windows_manager.cpp | 28 +++++++++---------- .../src/pointer_drawing_manager.cpp | 5 ++++ .../test/input_windows_manager_test.cpp | 1 - 6 files changed, 23 insertions(+), 18 deletions(-) diff --git a/service/window_manager/include/i_pointer_drawing_manager.h b/service/window_manager/include/i_pointer_drawing_manager.h index c8b4489ee7..5de019f703 100644 --- a/service/window_manager/include/i_pointer_drawing_manager.h +++ b/service/window_manager/include/i_pointer_drawing_manager.h @@ -139,6 +139,10 @@ public: { return 0; } + virtual DisplayInfo GetCurrentDisplayInfo() + { + return {}; + } #ifdef OHOS_BUILD_ENABLE_MAGICCURSOR virtual int32_t GetPointerSnapshot(void *pixelMapPtr) { diff --git a/service/window_manager/include/input_windows_manager.h b/service/window_manager/include/input_windows_manager.h index aeaa208b12..0db32a3e09 100644 --- a/service/window_manager/include/input_windows_manager.h +++ b/service/window_manager/include/input_windows_manager.h @@ -525,8 +525,6 @@ private: static std::unordered_map convertToolTypeMap_; bool IsFoldable_ { false }; int32_t timerId_ { -1 }; - int32_t lastDpi_ { 0 }; - std::map lastDpiMap_; std::shared_ptr GetlastPointerEvent(); std::mutex mtx_; std::atomic_bool isHPR_ { false }; diff --git a/service/window_manager/include/pointer_drawing_manager.h b/service/window_manager/include/pointer_drawing_manager.h index b280cc36db..be2f5dd6a6 100644 --- a/service/window_manager/include/pointer_drawing_manager.h +++ b/service/window_manager/include/pointer_drawing_manager.h @@ -121,6 +121,7 @@ public: int32_t EnableHardwareCursorStats(int32_t pid, bool enable) override; int32_t GetHardwareCursorStats(int32_t pid, uint32_t &frameCount, uint32_t &vsyncCount) override; void SubscribeScreenModeChange() override; + DisplayInfo GetCurrentDisplayInfo() override; #ifdef OHOS_BUILD_ENABLE_MAGICCURSOR int32_t GetPointerSnapshot(void *pixelMapPtr) override; #endif // OHOS_BUILD_ENABLE_MAGICCURSOR diff --git a/service/window_manager/src/input_windows_manager.cpp b/service/window_manager/src/input_windows_manager.cpp index 40c4829712..174cce9761 100644 --- a/service/window_manager/src/input_windows_manager.cpp +++ b/service/window_manager/src/input_windows_manager.cpp @@ -1635,7 +1635,6 @@ void InputWindowsManager::UpdateDisplayInfo(DisplayGroupInfo &displayGroupInfo) lastPointerEventforWindowChangeMap_[displayGroupInfo.groupId] = lastPointerEventforWindowChange_; displayModeMap_[displayGroupInfo.groupId] = displayMode_; windowsHotAreasMap_[displayGroupInfo.groupId] = windowsHotAreas_; - lastDpiMap_[displayGroupInfo.groupId] = lastDpi_; } DisplayGroupInfo &curDisplayGroupInfo = displayGroupInfoMap_[displayGroupInfo.groupId]; @@ -1711,13 +1710,8 @@ void InputWindowsManager::UpdateDisplayInfo(DisplayGroupInfo &displayGroupInfo) PointerDrawingManagerOnDisplayInfo(displayGroupInfo); #endif // OHOS_BUILD_ENABLE_HARDWARE_CURSOR } - if (curDisplayGroupInfo.displaysInfo.empty()) { - lastDpiMap_[groupId] = DEFAULT_DPI; - } else { - lastDpiMap_[groupId] = curDisplayGroupInfo.displaysInfo[0].dpi; - } - if (INPUT_DEV_MGR->HasPointerDevice() && pointerDrawFlagMap_[groupId]) { - NotifyPointerToWindow(groupId); + if (INPUT_DEV_MGR->HasPointerDevice() && pointerDrawFlag_) { + NotifyPointerToWindow(); } #endif // OHOS_BUILD_ENABLE_POINTER_DRAWING #endif // OHOS_BUILD_ENABLE_POINTER @@ -1855,9 +1849,9 @@ void InputWindowsManager::DrawPointer(bool isDisplayRemoved) void InputWindowsManager::PointerDrawingManagerOnDisplayInfo(const DisplayGroupInfo &displayGroupInfo, bool isDisplayRemoved) { + auto currentDisplayInfo = IPointerDrawingManager::GetInstance()->GetCurrentDisplayInfo(); IPointerDrawingManager::GetInstance()->OnDisplayInfo(displayGroupInfo); int32_t groupId = displayGroupInfo.groupId; - int32_t newDpi = 0; int32_t newId = 0; { std::shared_lock lock(displayGroupInfoMtx); @@ -1867,21 +1861,25 @@ void InputWindowsManager::PointerDrawingManagerOnDisplayInfo(const DisplayGroupI MMI_HILOGE("DisplayGroup is empty."); return; } - newDpi = iter->second.displaysInfo[0].dpi; newId = iter->second.displaysInfo[0].id; } else { if (displayGroupInfo_.displaysInfo.empty()) { MMI_HILOGE("DisplayGroup is empty."); return; } - newDpi = displayGroupInfo_.displaysInfo[0].dpi; newId = displayGroupInfo_.displaysInfo[0].id; } } - if (lastDpiMap_[groupId] != DEFAULT_DPI && lastDpiMap_[groupId] != newDpi) { - auto drawNewDpiRes = IPointerDrawingManager::GetInstance()->DrawNewDpiPointer(); - if (drawNewDpiRes != RET_OK) { - MMI_HILOGE("Draw New Dpi pointer failed."); + for (auto displayInfo : displayGroupInfo.displaysInfo) { + if (displayInfo.uniqueId == currentDisplayInfo.uniqueId && displayInfo.dpi != currentDisplayInfo.dpi) { + MMI_HILOGD("dpi changed, current displayId: %{public}d, dpi: %{public}d, " + "latest displayId: %{public}d, dpi: %{public}d", + currentDisplayInfo.uniqueId, currentDisplayInfo.dpi, displayInfo.uniqueId, displayInfo.dpi); + auto drawNewDpiRes = IPointerDrawingManager::GetInstance()->DrawNewDpiPointer(); + if (drawNewDpiRes != RET_OK) { + MMI_HILOGE("Draw New Dpi pointer failed."); + } + break; } } auto lastPointerEventCopy = GetlastPointerEvent(); diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp index 4369624913..10ae0ea105 100644 --- a/service/window_manager/src/pointer_drawing_manager.cpp +++ b/service/window_manager/src/pointer_drawing_manager.cpp @@ -3834,5 +3834,10 @@ void PointerDrawingManager::SetSurfaceNode(std::shared_ptr std::unique_lock lockGuard(surfaceNodeMutex_); surfaceNode_ = ptr; } + +DisplayInfo PointerDrawingManager::GetCurrentDisplayInfo() +{ + return displayInfo_; +} } // namespace MMI } // namespace OHOS diff --git a/service/window_manager/test/input_windows_manager_test.cpp b/service/window_manager/test/input_windows_manager_test.cpp index 194e27be36..fcabd42f67 100644 --- a/service/window_manager/test/input_windows_manager_test.cpp +++ b/service/window_manager/test/input_windows_manager_test.cpp @@ -8632,7 +8632,6 @@ HWTEST_F(InputWindowsManagerTest, InputWindowsManagerTest_PointerDrawingManagerO displayInfo.dpi++; displayInfo.x = 300; displayInfo.y = 300; - inputWindowsManager->lastDpi_ = displayInfo.dpi + 1; inputWindowsManager->displayGroupInfo_.displaysInfo.push_back(displayInfo); EXPECT_NO_FATAL_FAILURE(inputWindowsManager->PointerDrawingManagerOnDisplayInfo(displayGroupInfo)); -- Gitee