From 020e898c48d1e78da2746942a27a23f12b6200ad Mon Sep 17 00:00:00 2001 From: ludao Date: Mon, 29 Apr 2024 14:42:29 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=A4=9A=E5=B1=8F=E5=BC=82?= =?UTF-8?q?=E6=98=BE=E6=97=B6=E9=BC=A0=E6=A0=87=E8=B7=A8=E5=B1=8F=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Id40eb01eeafb86cb8154fbc19fd99bb7238b42b2 Signed-off-by: ludao --- service/BUILD.gn | 5 ++- .../include/pointer_drawing_manager.h | 2 +- .../src/input_windows_manager.cpp | 33 ++++++++++++++----- .../src/pointer_drawing_manager.cpp | 32 +++++++++++------- 4 files changed, 51 insertions(+), 21 deletions(-) diff --git a/service/BUILD.gn b/service/BUILD.gn index 563afa512a..65ecc3cf9c 100644 --- a/service/BUILD.gn +++ b/service/BUILD.gn @@ -217,7 +217,10 @@ ohos_shared_library("libmmi-server") { external_deps = [ "c_utils:utils" ] if (input_feature_pointer_drawing) { - external_deps += [ "window_manager:libwm" ] + external_deps += [ + "window_manager:libdm", + "window_manager:libwm", + ] } if (input_ext_feature_magiccursor) { diff --git a/service/window_manager/include/pointer_drawing_manager.h b/service/window_manager/include/pointer_drawing_manager.h index ac95264951..a1c0b22d04 100644 --- a/service/window_manager/include/pointer_drawing_manager.h +++ b/service/window_manager/include/pointer_drawing_manager.h @@ -136,7 +136,7 @@ private: bool mouseDisplayState_ { false }; bool mouseIconUpdate_ { false }; std::unique_ptr userIcon_ { nullptr }; - uint64_t screenId_ { 0 }; + uint64_t displayId_ { 0 }; std::shared_ptr surfaceNode_; std::shared_ptr canvasNode_; int32_t userIconHotSpotX_ { 0 }; diff --git a/service/window_manager/src/input_windows_manager.cpp b/service/window_manager/src/input_windows_manager.cpp index 80ce159ff5..1f19a41899 100644 --- a/service/window_manager/src/input_windows_manager.cpp +++ b/service/window_manager/src/input_windows_manager.cpp @@ -2419,7 +2419,11 @@ int32_t InputWindowsManager::UpdateTargetPointer(std::shared_ptr p #ifdef OHOS_BUILD_ENABLE_POINTER bool InputWindowsManager::IsInsideDisplay(const DisplayInfo& displayInfo, int32_t physicalX, int32_t physicalY) { - return (physicalX >= 0 && physicalX < displayInfo.width) && (physicalY >= 0 && physicalY < displayInfo.height); + if (displayInfo.direction == DIRECTION0 || displayInfo.direction == DIRECTION180) { + return (physicalX >= 0 && physicalX < displayInfo.width) && (physicalY >= 0 && physicalY < displayInfo.height); + } + + return (physicalX >= 0 && physicalX < displayInfo.height) && (physicalY >= 0 && physicalY < displayInfo.width); } void InputWindowsManager::FindPhysicalDisplay(const DisplayInfo& displayInfo, int32_t& physicalX, @@ -2436,17 +2440,30 @@ void InputWindowsManager::FindPhysicalDisplay(const DisplayInfo& displayInfo, in MMI_HILOGE("The addition of logicalY overflows"); return; } + for (const auto &item : displayGroupInfo_.displaysInfo) { int32_t displayMaxX = 0; int32_t displayMaxY = 0; - if (!AddInt32(item.x, item.width, displayMaxX)) { - MMI_HILOGE("The addition of displayMaxX overflows"); - return; - } - if (!AddInt32(item.y, item.height, displayMaxY)) { - MMI_HILOGE("The addition of displayMaxY overflows"); - return; + if (item.direction == DIRECTION0 || item.direction == DIRECTION180) { + if (!AddInt32(item.x, item.width, displayMaxX)) { + MMI_HILOGE("The addition of displayMaxX overflows"); + return; + } + if (!AddInt32(item.y, item.height, displayMaxY)) { + MMI_HILOGE("The addition of displayMaxY overflows"); + return; + } + } else { + if (!AddInt32(item.x, item.height, displayMaxX)) { + MMI_HILOGE("The addition of displayMaxX overflows"); + return; + } + if (!AddInt32(item.y, item.width, displayMaxY)) { + MMI_HILOGE("The addition of displayMaxY overflows"); + return; + } } + if ((logicalX >= item.x && logicalX < displayMaxX) && (logicalY >= item.y && logicalY < displayMaxY)) { physicalX = logicalX - item.x; diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp index 1041376711..48a6c6a0b7 100644 --- a/service/window_manager/src/pointer_drawing_manager.cpp +++ b/service/window_manager/src/pointer_drawing_manager.cpp @@ -41,6 +41,8 @@ #include "util.h" #include "timer_manager.h" +#include "display_manager.h" + #undef MMI_LOG_TAG #define MMI_LOG_TAG "PointerDrawingManager" @@ -113,6 +115,14 @@ void PointerDrawingManager::DrawMovePointer(int32_t displayId, int32_t physicalX surfaceNode_->SetBounds(physicalX + displayInfo_.x, physicalY + displayInfo_.y, surfaceNode_->GetStagingProperties().GetBounds().z_, surfaceNode_->GetStagingProperties().GetBounds().w_); + + if (displayId_ != static_cast(displayId)) { + // Move pointer to another display. 'Add' before 'Remove' to avoid the surfaceNode_ to be destroyed by dms. + Rosen::DisplayManager::GetInstance().AddSurfaceNodeToDisplay(displayId, surfaceNode_); + Rosen::DisplayManager::GetInstance().RemoveSurfaceNodeFromDisplay(displayId_, surfaceNode_); + displayId_ = static_cast(displayId); + } + Rosen::RSTransaction::FlushImplicitTransaction(); MMI_HILOGD("The lastpointerStyle is equal with pointerStyle,id %{public}d size:%{public}d", pointerStyle.id, pointerStyle.size); @@ -257,7 +267,7 @@ void PointerDrawingManager::CreatePointerSwiftObserver(isMagicCursor& item) if (item.isShow != tmp) { MMI_HILOGD("switch pointer style"); if (surfaceNode_ != nullptr) { - surfaceNode_->DetachToDisplay(screenId_); + Rosen::DisplayManager::GetInstance().RemoveSurfaceNodeFromDisplay(displayId_, surfaceNode_); Rosen::RSTransaction::FlushImplicitTransaction(); this->SwitchPointerStyle(); } @@ -304,7 +314,7 @@ int32_t PointerDrawingManager::DrawCursor(const MOUSE_ICON mouseStyle) sptr layer = GetLayer(); if (layer == nullptr) { MMI_HILOGE("Init layer is failed, Layer is nullptr"); - surfaceNode_->DetachToDisplay(screenId_); + Rosen::DisplayManager::GetInstance().RemoveSurfaceNodeFromDisplay(displayId_, surfaceNode_); surfaceNode_ = nullptr; Rosen::RSTransaction::FlushImplicitTransaction(); MMI_HILOGE("Pointer window destroy success"); @@ -314,7 +324,7 @@ int32_t PointerDrawingManager::DrawCursor(const MOUSE_ICON mouseStyle) sptr buffer = GetSurfaceBuffer(layer); if (buffer == nullptr || buffer->GetVirAddr() == nullptr) { MMI_HILOGE("Init layer is failed, buffer or virAddr is nullptr"); - surfaceNode_->DetachToDisplay(screenId_); + Rosen::DisplayManager::GetInstance().RemoveSurfaceNodeFromDisplay(displayId_, surfaceNode_); surfaceNode_ = nullptr; Rosen::RSTransaction::FlushImplicitTransaction(); MMI_HILOGE("Pointer window destroy success"); @@ -652,10 +662,10 @@ void PointerDrawingManager::CreatePointerWindow(int32_t displayId, int32_t physi #else surfaceNode_->SetBackgroundColor(Rosen::Drawing::Color::COLOR_TRANSPARENT); #endif - - screenId_ = static_cast(displayId); - std::cout << "ScreenId: " << screenId_ << std::endl; - surfaceNode_->AttachToDisplay(screenId_); + + displayId_ = static_cast(displayId); + MMI_HILOGD("DisplayId: %{public}" PRIu64 "", displayId_); + Rosen::DisplayManager::GetInstance().AddSurfaceNodeToDisplay(displayId_, surfaceNode_); RotateDegree(direction); lastDirection_ = direction; @@ -1058,7 +1068,7 @@ void PointerDrawingManager::OnDisplayInfo(const DisplayGroupInfo &displayGroupIn lastPhysicalY_ = displayGroupInfo.displaysInfo[0].height / CALCULATE_MIDDLE; MouseEventHdr->OnDisplayLost(displayInfo_.id); if (surfaceNode_ != nullptr) { - surfaceNode_->DetachToDisplay(screenId_); + Rosen::DisplayManager::GetInstance().RemoveSurfaceNodeFromDisplay(displayId_, surfaceNode_); surfaceNode_ = nullptr; Rosen::RSTransaction::FlushImplicitTransaction(); MMI_HILOGD("Pointer window destroy success"); @@ -1093,7 +1103,7 @@ void PointerDrawingManager::UpdatePointerDevice(bool hasPointerDevice, bool isPo DrawManager(); if (!hasPointerDevice_ && surfaceNode_ != nullptr) { MMI_HILOGD("Pointer window destroy start"); - surfaceNode_->DetachToDisplay(screenId_); + Rosen::DisplayManager::GetInstance().RemoveSurfaceNodeFromDisplay(displayId_, surfaceNode_); surfaceNode_ = nullptr; Rosen::RSTransaction::FlushImplicitTransaction(); MMI_HILOGD("Pointer window destroy success"); @@ -1180,7 +1190,7 @@ void PointerDrawingManager::DeletePointerVisible(int32_t pid) MMI_HILOGI("isRsRemoteDied:%{public}d", isRsRemoteDied ? 1 : 0); if (isRsRemoteDied && surfaceNode_ != nullptr) { isRsRemoteDied = false; - surfaceNode_->DetachToDisplay(screenId_); + Rosen::DisplayManager::GetInstance().RemoveSurfaceNodeFromDisplay(displayId_, surfaceNode_); surfaceNode_ = nullptr; Rosen::RSTransaction::FlushImplicitTransaction(); } @@ -1436,7 +1446,7 @@ void PointerDrawingManager::DrawPointerStyle(const PointerStyle& pointerStyle) } if (hasDisplay_ && hasPointerDevice_) { if (surfaceNode_ != nullptr) { - surfaceNode_->AttachToDisplay(screenId_); + Rosen::DisplayManager::GetInstance().AddSurfaceNodeToDisplay(displayId_, surfaceNode_); Rosen::RSTransaction::FlushImplicitTransaction(); } Direction direction = DIRECTION0; -- Gitee