From 961376ff83cfe7df01d7cf618f2281b0fb1afe0c Mon Sep 17 00:00:00 2001 From: dock_yu Date: Thu, 11 Sep 2025 16:22:18 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E9=95=9C=E5=83=8F=E9=BB=91=E8=BE=B9?= =?UTF-8?q?=E5=85=89=E6=A0=87=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: dock_yu --- multimodalinput_mini.gni | 1 + .../src/mouse_transform_processor.cpp | 2 +- .../src/touch_transform_processor.cpp | 19 +++++++---- .../include/i_input_windows_manager.h | 2 +- .../include/input_windows_manager.h | 7 ++-- .../window_manager/include/screen_pointer.h | 3 ++ .../src/input_windows_manager.cpp | 18 +++++++--- .../src/pointer_drawing_manager.cpp | 25 ++++++++++---- service/window_manager/src/screen_pointer.cpp | 34 ++++++++++++++++++- 9 files changed, 87 insertions(+), 24 deletions(-) diff --git a/multimodalinput_mini.gni b/multimodalinput_mini.gni index b480d73b26..358e4aba88 100644 --- a/multimodalinput_mini.gni +++ b/multimodalinput_mini.gni @@ -435,6 +435,7 @@ if (input_feature_product == "pc") { input_default_defines += [ "OHOS_BUILD_PC_PRIORITY" ] input_default_defines += [ "OHOS_BUILD_PC_UNIT_TEST" ] input_default_defines += [ "OHOS_BUILD_MOUSE_REPORTING_RATE" ] + input_default_defines += [ "OHOS_BUILD_PC_EXTERNAL_SCREEN" ] } if (input_feature_product == "watch") { diff --git a/service/mouse_event_normalize/src/mouse_transform_processor.cpp b/service/mouse_event_normalize/src/mouse_transform_processor.cpp index 133e6d1cf8..28e64b1525 100644 --- a/service/mouse_event_normalize/src/mouse_transform_processor.cpp +++ b/service/mouse_event_normalize/src/mouse_transform_processor.cpp @@ -223,8 +223,8 @@ int32_t MouseTransformProcessor::UpdateMouseMoveLocation(const OLD::DisplayInfo* #ifdef OHOS_BUILD_MOUSE_REPORTING_RATE dalta_time = filterInsertionPoint_.filterDeltaTime; HandleFilterMouseEvent(&offset); - CalculateOffset(displayInfo, offset); #endif // OHOS_BUILD_MOUSE_REPORTING_RATE + CalculateOffset(displayInfo, offset); if (!enableMouseAleaccelerateBool_) { abs_x += offset.dx; abs_y += offset.dy; diff --git a/service/touch_event_normalize/src/touch_transform_processor.cpp b/service/touch_event_normalize/src/touch_transform_processor.cpp index db9387aa8e..7a72726332 100644 --- a/service/touch_event_normalize/src/touch_transform_processor.cpp +++ b/service/touch_event_normalize/src/touch_transform_processor.cpp @@ -197,9 +197,19 @@ bool TouchTransformProcessor::OnEventTouchMotion(struct libinput_event *event) uint64_t time = libinput_event_touch_get_time_usec(touch); pointerEvent_->SetActionTime(time); pointerEvent_->SetPointerAction(PointerEvent::POINTER_ACTION_MOVE); + PointerEvent::PointerItem item; + int32_t seatSlot = libinput_event_touch_get_seat_slot(touch); + if (!(pointerEvent_->GetPointerItem(seatSlot, item))) { +#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN + CHKFR(OnEventTouchDown(event), nullptr, "Get OnEventTouchDown failed"); + return true; +#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN + MMI_HILOGD("Get pointer parameter failed"); + return false; + } EventTouch touchInfo; int32_t logicalDisplayId = pointerEvent_->GetTargetDisplayId(); - if (!WIN_MGR->TouchPointToDisplayPoint(deviceId_, touch, touchInfo, logicalDisplayId, true)) { + if (!WIN_MGR->TouchPointToDisplayPoint(deviceId_, touch, touchInfo, logicalDisplayId, true, true)) { processedCount_++; if (processedCount_ == PRINT_INTERVAL_COUNT) { MMI_HILOGE("Get TouchMotionPointToDisplayPoint failed"); @@ -207,12 +217,7 @@ bool TouchTransformProcessor::OnEventTouchMotion(struct libinput_event *event) } return false; } - PointerEvent::PointerItem item; - int32_t seatSlot = libinput_event_touch_get_seat_slot(touch); - if (!(pointerEvent_->GetPointerItem(seatSlot, item))) { - MMI_HILOGE("Get pointer parameter failed"); - return false; - } + int32_t blobId = libinput_event_touch_get_blob_id(touch); item.SetBlobId(blobId); double pressure = libinput_event_touch_get_pressure(touch); diff --git a/service/window_manager/include/i_input_windows_manager.h b/service/window_manager/include/i_input_windows_manager.h index 84d9f7bad7..dea9bde882 100644 --- a/service/window_manager/include/i_input_windows_manager.h +++ b/service/window_manager/include/i_input_windows_manager.h @@ -141,7 +141,7 @@ public: #ifdef OHOS_BUILD_ENABLE_TOUCH virtual bool TouchPointToDisplayPoint(int32_t deviceId, struct libinput_event_touch* touch, - EventTouch& touchInfo, int32_t& targetDisplayId, bool isNeedClear = false) = 0; + EventTouch& touchInfo, int32_t& targetDisplayId, bool isNeedClear = false, bool isPointerDowned = false) = 0; virtual bool CalculateTipPoint(struct libinput_event_tablet_tool* tip, int32_t& targetDisplayId, PhysicalCoordinate& coord, PointerEvent::PointerItem& pointerItem) = 0; virtual const OLD::DisplayInfo *GetDefaultDisplayInfo() const = 0; diff --git a/service/window_manager/include/input_windows_manager.h b/service/window_manager/include/input_windows_manager.h index bbd8e7d86c..de0fe11131 100644 --- a/service/window_manager/include/input_windows_manager.h +++ b/service/window_manager/include/input_windows_manager.h @@ -141,7 +141,7 @@ public: #ifdef OHOS_BUILD_ENABLE_TOUCH void AdjustDisplayCoordinate(const OLD::DisplayInfo& displayInfo, double& physicalX, double& physicalY) const; bool TouchPointToDisplayPoint(int32_t deviceId, struct libinput_event_touch* touch, - EventTouch& touchInfo, int32_t& targetDisplayId, bool isNeedClear = false); + EventTouch& touchInfo, int32_t& targetDisplayId, bool isNeedClear = false, bool isPointerDowned = false); #endif // OHOS_BUILD_ENABLE_TOUCH #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH) void ReverseRotateScreen(const OLD::DisplayInfo& info, const double x, const double y, @@ -393,7 +393,7 @@ void HandleOneHandMode(const OLD::DisplayInfo &displayInfo, std::shared_ptr keyEvent, int32_t focusWindowId, int32_t groupId = DEFAULT_GROUP_ID); diff --git a/service/window_manager/include/screen_pointer.h b/service/window_manager/include/screen_pointer.h index 63593fa476..b3e9afc4e5 100644 --- a/service/window_manager/include/screen_pointer.h +++ b/service/window_manager/include/screen_pointer.h @@ -205,6 +205,9 @@ private: void Rotate(rotation_t rotation, int32_t& x, int32_t& y); void CalculateHwcPositionForMirror(int32_t& x, int32_t& y); void CalculateHwcPositionForExtend(int32_t& x, int32_t& y); +#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN + void CalculateHwcPositionForMain(int32_t& x, int32_t& y); +#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN bool InitDefaultBuffer(const OHOS::BufferRequestConfig &bufferCfg, PointerRenderer &render); bool InitTransparentBuffer(const OHOS::BufferRequestConfig &bufferCfg); bool InitCommonBuffer(const OHOS::BufferRequestConfig &bufferCfg); diff --git a/service/window_manager/src/input_windows_manager.cpp b/service/window_manager/src/input_windows_manager.cpp index eac59d538c..379b559098 100644 --- a/service/window_manager/src/input_windows_manager.cpp +++ b/service/window_manager/src/input_windows_manager.cpp @@ -1453,7 +1453,7 @@ void InputWindowsManager::ResetPointerPositionIfOutValidDisplay(const OLD::Displ } bool InputWindowsManager::IsPositionOutValidDisplay( - Coordinate2D &position, const OLD::DisplayInfo ¤tDisplay, bool isPhysicalPos) + Coordinate2D &position, const OLD::DisplayInfo ¤tDisplay, bool isPhysicalPos, bool isPointerDowned) { double posX = position.x; double posY = position.y; @@ -1501,6 +1501,14 @@ bool InputWindowsManager::IsPositionOutValidDisplay( } bool isOut = (rotateX < offsetX) || (rotateX > offsetX + validW) || (rotateY < offsetY) || (rotateY > offsetY + validH); +#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN + if (isOut && isPointerDowned) { + if (rotateX < offsetX) { rotateX = offsetX; } + if (rotateX > offsetX + validW) { rotateX = offsetX + validW; } + if (rotateY < offsetY) { rotateY = offsetY; } + if (rotateY > offsetY + validH) { rotateY = offsetY + validH; } + } +#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN PrintDisplayInfo(currentDisplay); MMI_HILOGD("isOut=%{public}d,isPhysicalPos=%{public}d Position={%{private}f %{private}f}" "->{%{private}f %{private}f} RealValidWH={w:%{private}f h:%{private}f}", @@ -3018,7 +3026,7 @@ void InputWindowsManager::RotateDisplayScreen(const OLD::DisplayInfo& info, Phys #ifdef OHOS_BUILD_ENABLE_TOUCH bool InputWindowsManager::GetPhysicalDisplayCoord(int32_t deviceId, struct libinput_event_touch* touch, - const OLD::DisplayInfo& info, EventTouch& touchInfo, bool isNeedClear) + const OLD::DisplayInfo& info, EventTouch& touchInfo, bool isNeedClear, bool isPointerDowned) { PrintDisplayInfo(info); auto width = info.width; @@ -3037,7 +3045,7 @@ bool InputWindowsManager::GetPhysicalDisplayCoord(int32_t deviceId, struct libin MMI_HILOGD("width:%{private}d, height:%{private}d, physicalX:%{private}f, physicalY:%{private}f", width, height, coord.x, coord.y); Coordinate2D pos = { .x = coord.x, .y = coord.y }; - if (IsPositionOutValidDisplay(pos, info, true)) { + if (IsPositionOutValidDisplay(pos, info, true, isPointerDowned)) { if (INPUT_DEV_MGR->GetVendorConfig(deviceId).enableOutScreen != ENABLE_OUT_SCREEN_TOUCH) { MMI_HILOGW("Position out valid display width:%{private}d, height:%{private}d, " "physicalX:%{private}f, physicalY:%{private}f", width, height, pos.x, pos.y); @@ -3125,7 +3133,7 @@ void InputWindowsManager::SetAntiMisTakeStatus(bool state) } bool InputWindowsManager::TouchPointToDisplayPoint(int32_t deviceId, struct libinput_event_touch* touch, - EventTouch& touchInfo, int32_t& physicalDisplayId, bool isNeedClear) + EventTouch& touchInfo, int32_t& physicalDisplayId, bool isNeedClear, bool isPointerDowned) { CHKPF(touch); std::string screenId = bindInfo_.GetBindDisplayNameByInputDevice(deviceId); @@ -3139,7 +3147,7 @@ bool InputWindowsManager::TouchPointToDisplayPoint(int32_t deviceId, struct libi MMI_HILOGE("Get OLD::DisplayInfo is error"); return false; } - return GetPhysicalDisplayCoord(deviceId, touch, *info, touchInfo, isNeedClear); + return GetPhysicalDisplayCoord(deviceId, touch, *info, touchInfo, isNeedClear, isPointerDowned); } bool InputWindowsManager::TransformTipPoint(struct libinput_event_tablet_tool* tip, diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp index a123671b8f..85073c6897 100644 --- a/service/window_manager/src/pointer_drawing_manager.cpp +++ b/service/window_manager/src/pointer_drawing_manager.cpp @@ -3315,8 +3315,8 @@ void PointerDrawingManager::OnScreenModeChange(const std::vectorGetSourceMode() == OHOS::Rosen::ScreenSourceMode::SCREEN_MAIN) { - mainWidth = (si->GetMirrorWidth() == 0) ? GetScreenInfoWidth(si) : si->GetMirrorWidth(); - mainHeight = (si->GetMirrorHeight() == 0) ? GetScreenInfoHeight(si) : si->GetMirrorHeight(); + mainWidth = GetScreenInfoWidth(si); + mainHeight = GetScreenInfoHeight(si); mainRotation = static_cast(si->GetRotation()); } @@ -3325,8 +3325,6 @@ void PointerDrawingManager::OnScreenModeChange(const std::vectorsecond->UpdateScreenInfo(si); - it->second->SetMirrorWidth(mainWidth); - it->second->SetMirrorHeight(mainHeight); } else { // Create & Init ScreenPointer MMI_HILOGI("OnScreenModeChange got new screen %{public}" PRIu64, sid); @@ -3359,6 +3357,13 @@ void PointerDrawingManager::OnScreenModeChange(const std::vectorSetRotation(mainRotation); sp.second->UpdatePadding(mainWidth, mainHeight); } +#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN + if (sp.second->IsMirror() || sp.second->IsMain()) { + mainWidth = si->GetMirrorWidth() == 0 ? mainWidth : si->GetMirrorWidth(); + mainHeight = si->GetMirrorHeight() == 0 ? mainHeight : si->GetMirrorHeight(); + sp.second->UpdatePadding(mainWidth, mainHeight); + } +#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN } } UpdateDisplayInfo(displayInfo_); @@ -3522,8 +3527,8 @@ int32_t PointerDrawingManager::DrawHardCursor(std::shared_ptr sp, void PointerDrawingManager::UpdateMirrorScreens(std::shared_ptr sp, OLD::DisplayInfo displayInfo) { CHKPV(sp); - uint32_t mainWidth = (sp->GetMirrorWidth() == 0) ? sp->GetScreenWidth() : sp->GetMirrorWidth(); - uint32_t mainHeight = (sp->GetMirrorHeight() == 0) ? sp->GetScreenHeight(): sp->GetMirrorHeight(); + uint32_t mainWidth = sp->GetScreenWidth(); + uint32_t mainHeight = sp->GetScreenHeight(); std::lock_guard lock(mtx_); for (auto it : screenPointers_) { if (it.second == nullptr) { @@ -3546,7 +3551,15 @@ void PointerDrawingManager::UpdateMirrorScreens(std::shared_ptr s isDirectionChanged = true; } if (isDirectionChanged) { +#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN + if (mirrorScreen->IsMirror() || mirrorScreen->IsMain()) { + mainWidth = mirrorScreen->GetMirrorWidth() == 0 ? mainWidth : mirrorScreen->GetMirrorWidth(); + mainHeight = mirrorScreen->GetMirrorHeight() == 0 ? mainHeight : mirrorScreen->GetMirrorHeight(); + mirrorScreen->UpdatePadding(mainWidth, mainHeight); + } +#else mirrorScreen->UpdatePadding(mainWidth, mainHeight); +#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN } MMI_HILOGD("update mirror screen dpi, mainScreen dpi: %{public}f, original mirrorScreen dpi: %{public}f", sp->GetDPI(), mirrorScreen->GetDPI()); diff --git a/service/window_manager/src/screen_pointer.cpp b/service/window_manager/src/screen_pointer.cpp index d6da11bde4..a97e05ff5d 100644 --- a/service/window_manager/src/screen_pointer.cpp +++ b/service/window_manager/src/screen_pointer.cpp @@ -81,6 +81,10 @@ ScreenPointer::ScreenPointer(hwcmgr_ptr_t hwcMgr, handler_ptr_t handler, const O std::swap(width_, height_); } dpi_ = float(di.dpi) / BASELINE_DENSITY; +#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN + mirrorWidth_ = di.validWidth; + mirrorHeight_ = di.validHeight; +#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN MMI_HILOGI("Construct with DisplayInfo, id=%{public}" PRIu64 ", shape=(%{public}u, %{public}u), mode=%{public}u, " "rotation=%{public}u, dpi=%{public}f", screenId_, width_, height_, mode_, rotation_, dpi_); } @@ -94,6 +98,10 @@ ScreenPointer::ScreenPointer(hwcmgr_ptr_t hwcMgr, handler_ptr_t handler, screen_ mode_ = si->GetSourceMode(); rotation_ = si->GetRotation(); dpi_ = si->GetVirtualPixelRatio(); +#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN + mirrorWidth_ = si->GetMirrorWidth() == 0 ? GetScreenInfoWidth(si) : si->GetMirrorWidth(); + mirrorHeight_ = si->GetMirrorHeight() == 0 ? GetScreenInfoHeight(si) : si->GetMirrorHeight(); +#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN MMI_HILOGI("Construct with ScreenInfo, id=%{public}" PRIu64 ", shape=(%{public}u, %{public}u), mode=%{public}u, " "rotation=%{public}u, dpi=%{public}f", screenId_, width_, height_, mode_, rotation_, dpi_); } @@ -309,6 +317,10 @@ void ScreenPointer::UpdateScreenInfo(const sptr si) mode_ = si->GetSourceMode(); rotation_ = si->GetRotation(); dpi_ = si->GetVirtualPixelRatio(); +#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN + mirrorWidth_ = si->GetMirrorWidth() == 0 ? GetScreenInfoWidth(si) : si->GetMirrorWidth(); + mirrorHeight_ = si->GetMirrorHeight() == 0 ? GetScreenInfoHeight(si) : si->GetMirrorHeight(); +#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN surfaceNode_->AttachToDisplay(screenId_); Rosen::RSTransaction::FlushImplicitTransaction(); MMI_HILOGI("Update with ScreenInfo, id=%{public}" PRIu64 ", shape=(%{public}u, %{public}u), mode=%{public}u, " @@ -344,6 +356,7 @@ void ScreenPointer::OnDisplayInfo(const OLD::DisplayInfo &di, bool isWindowRotat bool ScreenPointer::UpdatePadding(uint32_t mainWidth, uint32_t mainHeight) { +#ifndef OHOS_BUILD_PC_EXTERNAL_SCREEN if (!IsMirror()) { MMI_HILOGI("UpdatePadidng, reset padding, screenId=%{public}" PRIu64 ", scale=%{public}f, " "paddingTop_=%{public}u, paddingLeft_=%{public}u", screenId_, scale_, paddingTop_, paddingLeft_); @@ -352,11 +365,12 @@ bool ScreenPointer::UpdatePadding(uint32_t mainWidth, uint32_t mainHeight) paddingLeft_ = 0; return false; } +#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN if (mainWidth == 0 || mainHeight == 0) { MMI_HILOGE("Invalid parameters, mainWidth=%{public}u, mainHeight=%{public}u", mainWidth, mainHeight); return false; } - if (rotation_ == rotation_t::ROTATION_90 || rotation_ == rotation_t::ROTATION_270) { + if ((rotation_ == rotation_t::ROTATION_90 || rotation_ == rotation_t::ROTATION_270) && IsMirror()) { std::swap(mainWidth, mainHeight); } @@ -364,6 +378,11 @@ bool ScreenPointer::UpdatePadding(uint32_t mainWidth, uint32_t mainHeight) scale_ = fmin(float(width_) / mainWidth, float(height_) / mainHeight); paddingTop_ = (height_ - mainHeight * scale_) / NUM_TWO; paddingLeft_ = (width_ - mainWidth * scale_) / NUM_TWO; +#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN + if (IsMain()) { + scale_ = 1.0; + } +#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN MMI_HILOGI("UpdatePadding, screenId=%{public}" PRIu64 ", scale=%{public}f, paddingTop_=%{public}u," " paddingLeft_=%{public}u", screenId_, scale_, paddingTop_, paddingLeft_); return true; @@ -418,6 +437,14 @@ void ScreenPointer::CalculateHwcPositionForMirror(int32_t& x, int32_t& y) y += paddingTop_; } +#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN +void ScreenPointer::CalculateHwcPositionForMain(int32_t& x, int32_t& y) +{ + x += paddingLeft_; + y += paddingTop_; +} +#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN + void ScreenPointer::CalculateHwcPositionForExtend(int32_t& x, int32_t& y) { x = x * offRenderScale_; @@ -433,6 +460,11 @@ bool ScreenPointer::Move(int32_t x, int32_t y, ICON_TYPE align) CHKPF(hwcMgr_); int32_t px = 0; int32_t py = 0; +#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN + if (IsMain()) { + CalculateHwcPositionForMain(x, y); + } +#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN if (IsMirror()) { CalculateHwcPositionForMirror(x, y); } else if (GetIsCurrentOffScreenRendering() && !IsMirror()) { -- Gitee From df547d7d43a1516404379db73746d7718b603e39 Mon Sep 17 00:00:00 2001 From: dock_yu Date: Thu, 11 Sep 2025 16:56:26 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=E9=95=9C=E5=83=8F=E9=BB=91=E8=BE=B9?= =?UTF-8?q?=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: dock_yu --- service/window_manager/src/pointer_drawing_manager.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp index 85073c6897..57b4ffdf4e 100644 --- a/service/window_manager/src/pointer_drawing_manager.cpp +++ b/service/window_manager/src/pointer_drawing_manager.cpp @@ -3552,11 +3552,9 @@ void PointerDrawingManager::UpdateMirrorScreens(std::shared_ptr s } if (isDirectionChanged) { #ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN - if (mirrorScreen->IsMirror() || mirrorScreen->IsMain()) { - mainWidth = mirrorScreen->GetMirrorWidth() == 0 ? mainWidth : mirrorScreen->GetMirrorWidth(); - mainHeight = mirrorScreen->GetMirrorHeight() == 0 ? mainHeight : mirrorScreen->GetMirrorHeight(); - mirrorScreen->UpdatePadding(mainWidth, mainHeight); - } + mainWidth = mirrorScreen->GetMirrorWidth() == 0 ? mainWidth : mirrorScreen->GetMirrorWidth(); + mainHeight = mirrorScreen->GetMirrorHeight() == 0 ? mainHeight : mirrorScreen->GetMirrorHeight(); + mirrorScreen->UpdatePadding(mainWidth, mainHeight); #else mirrorScreen->UpdatePadding(mainWidth, mainHeight); #endif // OHOS_BUILD_PC_EXTERNAL_SCREEN -- Gitee From f428fd54cffdd27cc2537c4ce9cbda4fd773fec2 Mon Sep 17 00:00:00 2001 From: dock_yu Date: Thu, 11 Sep 2025 20:11:54 +0800 Subject: [PATCH 03/11] =?UTF-8?q?mock=E4=BB=A3=E7=A2=BC=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: dock_yu --- test/facility/mock/include/input_windows_manager_mock.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/facility/mock/include/input_windows_manager_mock.h b/test/facility/mock/include/input_windows_manager_mock.h index c5cc3e01d3..7b34028c7d 100644 --- a/test/facility/mock/include/input_windows_manager_mock.h +++ b/test/facility/mock/include/input_windows_manager_mock.h @@ -103,7 +103,7 @@ public: #endif //OHOS_BUILD_ENABLE_POINTER #ifdef OHOS_BUILD_ENABLE_TOUCH - MOCK_METHOD(bool, TouchPointToDisplayPoint, (int32_t, struct libinput_event_touch*, EventTouch&, int32_t&, bool)); + MOCK_METHOD(bool, TouchPointToDisplayPoint, (int32_t, struct libinput_event_touch*, EventTouch&, int32_t&, bool, bool)); MOCK_METHOD(bool, CalculateTipPoint, (struct libinput_event_tablet_tool*, int32_t&, PhysicalCoordinate&, PointerEvent::PointerItem&)); MOCK_METHOD(const OLD::DisplayInfo *, GetDefaultDisplayInfo, (), (const)); -- Gitee From 8f688548e8cb276efc0797f6c4d29753c6f1a73a Mon Sep 17 00:00:00 2001 From: dock_yu Date: Fri, 12 Sep 2025 17:04:27 +0800 Subject: [PATCH 04/11] =?UTF-8?q?=E7=9B=A3=E8=A6=96=E6=84=8F=E8=A6=8B?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: dock_yu --- multimodalinput_mini.gni | 2 +- .../src/touch_transform_processor.cpp | 11 ++++---- .../window_manager/include/screen_pointer.h | 4 +-- .../src/input_windows_manager.cpp | 5 ++-- .../src/pointer_drawing_manager.cpp | 8 +++--- service/window_manager/src/screen_pointer.cpp | 28 +++++++++---------- 6 files changed, 30 insertions(+), 28 deletions(-) diff --git a/multimodalinput_mini.gni b/multimodalinput_mini.gni index 358e4aba88..6d62a3c787 100644 --- a/multimodalinput_mini.gni +++ b/multimodalinput_mini.gni @@ -435,7 +435,7 @@ if (input_feature_product == "pc") { input_default_defines += [ "OHOS_BUILD_PC_PRIORITY" ] input_default_defines += [ "OHOS_BUILD_PC_UNIT_TEST" ] input_default_defines += [ "OHOS_BUILD_MOUSE_REPORTING_RATE" ] - input_default_defines += [ "OHOS_BUILD_PC_EXTERNAL_SCREEN" ] + input_default_defines += [ "OHOS_BUILD_EXTERNAL_SCREEN" ] } if (input_feature_product == "watch") { diff --git a/service/touch_event_normalize/src/touch_transform_processor.cpp b/service/touch_event_normalize/src/touch_transform_processor.cpp index 7a72726332..f7ac03aa37 100644 --- a/service/touch_event_normalize/src/touch_transform_processor.cpp +++ b/service/touch_event_normalize/src/touch_transform_processor.cpp @@ -200,12 +200,10 @@ bool TouchTransformProcessor::OnEventTouchMotion(struct libinput_event *event) PointerEvent::PointerItem item; int32_t seatSlot = libinput_event_touch_get_seat_slot(touch); if (!(pointerEvent_->GetPointerItem(seatSlot, item))) { -#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN +#ifdef OHOS_BUILD_EXTERNAL_SCREEN CHKFR(OnEventTouchDown(event), nullptr, "Get OnEventTouchDown failed"); return true; -#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN - MMI_HILOGD("Get pointer parameter failed"); - return false; +#endif // OHOS_BUILD_EXTERNAL_SCREEN } EventTouch touchInfo; int32_t logicalDisplayId = pointerEvent_->GetTargetDisplayId(); @@ -217,7 +215,10 @@ bool TouchTransformProcessor::OnEventTouchMotion(struct libinput_event *event) } return false; } - + if (!(pointerEvent_->GetPointerItem(seatSlot, item))) { + MMI_HILOGD("Get pointer parameter failed"); + return false; + } int32_t blobId = libinput_event_touch_get_blob_id(touch); item.SetBlobId(blobId); double pressure = libinput_event_touch_get_pressure(touch); diff --git a/service/window_manager/include/screen_pointer.h b/service/window_manager/include/screen_pointer.h index b3e9afc4e5..1cb2a94062 100644 --- a/service/window_manager/include/screen_pointer.h +++ b/service/window_manager/include/screen_pointer.h @@ -205,9 +205,9 @@ private: void Rotate(rotation_t rotation, int32_t& x, int32_t& y); void CalculateHwcPositionForMirror(int32_t& x, int32_t& y); void CalculateHwcPositionForExtend(int32_t& x, int32_t& y); -#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN +#ifdef OHOS_BUILD_EXTERNAL_SCREEN void CalculateHwcPositionForMain(int32_t& x, int32_t& y); -#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN +#endif // OHOS_BUILD_EXTERNAL_SCREEN bool InitDefaultBuffer(const OHOS::BufferRequestConfig &bufferCfg, PointerRenderer &render); bool InitTransparentBuffer(const OHOS::BufferRequestConfig &bufferCfg); bool InitCommonBuffer(const OHOS::BufferRequestConfig &bufferCfg); diff --git a/service/window_manager/src/input_windows_manager.cpp b/service/window_manager/src/input_windows_manager.cpp index 379b559098..4239496243 100644 --- a/service/window_manager/src/input_windows_manager.cpp +++ b/service/window_manager/src/input_windows_manager.cpp @@ -1501,14 +1501,15 @@ bool InputWindowsManager::IsPositionOutValidDisplay( } bool isOut = (rotateX < offsetX) || (rotateX > offsetX + validW) || (rotateY < offsetY) || (rotateY > offsetY + validH); -#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN +#ifdef OHOS_BUILD_EXTERNAL_SCREEN if (isOut && isPointerDowned) { if (rotateX < offsetX) { rotateX = offsetX; } if (rotateX > offsetX + validW) { rotateX = offsetX + validW; } if (rotateY < offsetY) { rotateY = offsetY; } if (rotateY > offsetY + validH) { rotateY = offsetY + validH; } + isOut = false; } -#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN +#endif // OHOS_BUILD_EXTERNAL_SCREEN PrintDisplayInfo(currentDisplay); MMI_HILOGD("isOut=%{public}d,isPhysicalPos=%{public}d Position={%{private}f %{private}f}" "->{%{private}f %{private}f} RealValidWH={w:%{private}f h:%{private}f}", diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp index 57b4ffdf4e..18686087c6 100644 --- a/service/window_manager/src/pointer_drawing_manager.cpp +++ b/service/window_manager/src/pointer_drawing_manager.cpp @@ -3357,13 +3357,13 @@ void PointerDrawingManager::OnScreenModeChange(const std::vectorSetRotation(mainRotation); sp.second->UpdatePadding(mainWidth, mainHeight); } -#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN +#ifdef OHOS_BUILD_EXTERNAL_SCREEN if (sp.second->IsMirror() || sp.second->IsMain()) { mainWidth = si->GetMirrorWidth() == 0 ? mainWidth : si->GetMirrorWidth(); mainHeight = si->GetMirrorHeight() == 0 ? mainHeight : si->GetMirrorHeight(); sp.second->UpdatePadding(mainWidth, mainHeight); } -#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN +#endif // OHOS_BUILD_EXTERNAL_SCREEN } } UpdateDisplayInfo(displayInfo_); @@ -3551,13 +3551,13 @@ void PointerDrawingManager::UpdateMirrorScreens(std::shared_ptr s isDirectionChanged = true; } if (isDirectionChanged) { -#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN +#ifdef OHOS_BUILD_EXTERNAL_SCREEN mainWidth = mirrorScreen->GetMirrorWidth() == 0 ? mainWidth : mirrorScreen->GetMirrorWidth(); mainHeight = mirrorScreen->GetMirrorHeight() == 0 ? mainHeight : mirrorScreen->GetMirrorHeight(); mirrorScreen->UpdatePadding(mainWidth, mainHeight); #else mirrorScreen->UpdatePadding(mainWidth, mainHeight); -#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN +#endif // OHOS_BUILD_EXTERNAL_SCREEN } MMI_HILOGD("update mirror screen dpi, mainScreen dpi: %{public}f, original mirrorScreen dpi: %{public}f", sp->GetDPI(), mirrorScreen->GetDPI()); diff --git a/service/window_manager/src/screen_pointer.cpp b/service/window_manager/src/screen_pointer.cpp index a97e05ff5d..bf8b3f006e 100644 --- a/service/window_manager/src/screen_pointer.cpp +++ b/service/window_manager/src/screen_pointer.cpp @@ -81,10 +81,10 @@ ScreenPointer::ScreenPointer(hwcmgr_ptr_t hwcMgr, handler_ptr_t handler, const O std::swap(width_, height_); } dpi_ = float(di.dpi) / BASELINE_DENSITY; -#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN +#ifdef OHOS_BUILD_EXTERNAL_SCREEN mirrorWidth_ = di.validWidth; mirrorHeight_ = di.validHeight; -#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN +#endif // OHOS_BUILD_EXTERNAL_SCREEN MMI_HILOGI("Construct with DisplayInfo, id=%{public}" PRIu64 ", shape=(%{public}u, %{public}u), mode=%{public}u, " "rotation=%{public}u, dpi=%{public}f", screenId_, width_, height_, mode_, rotation_, dpi_); } @@ -98,10 +98,10 @@ ScreenPointer::ScreenPointer(hwcmgr_ptr_t hwcMgr, handler_ptr_t handler, screen_ mode_ = si->GetSourceMode(); rotation_ = si->GetRotation(); dpi_ = si->GetVirtualPixelRatio(); -#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN +#ifdef OHOS_BUILD_EXTERNAL_SCREEN mirrorWidth_ = si->GetMirrorWidth() == 0 ? GetScreenInfoWidth(si) : si->GetMirrorWidth(); mirrorHeight_ = si->GetMirrorHeight() == 0 ? GetScreenInfoHeight(si) : si->GetMirrorHeight(); -#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN +#endif // OHOS_BUILD_EXTERNAL_SCREEN MMI_HILOGI("Construct with ScreenInfo, id=%{public}" PRIu64 ", shape=(%{public}u, %{public}u), mode=%{public}u, " "rotation=%{public}u, dpi=%{public}f", screenId_, width_, height_, mode_, rotation_, dpi_); } @@ -317,10 +317,10 @@ void ScreenPointer::UpdateScreenInfo(const sptr si) mode_ = si->GetSourceMode(); rotation_ = si->GetRotation(); dpi_ = si->GetVirtualPixelRatio(); -#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN +#ifdef OHOS_BUILD_EXTERNAL_SCREEN mirrorWidth_ = si->GetMirrorWidth() == 0 ? GetScreenInfoWidth(si) : si->GetMirrorWidth(); mirrorHeight_ = si->GetMirrorHeight() == 0 ? GetScreenInfoHeight(si) : si->GetMirrorHeight(); -#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN +#endif // OHOS_BUILD_EXTERNAL_SCREEN surfaceNode_->AttachToDisplay(screenId_); Rosen::RSTransaction::FlushImplicitTransaction(); MMI_HILOGI("Update with ScreenInfo, id=%{public}" PRIu64 ", shape=(%{public}u, %{public}u), mode=%{public}u, " @@ -356,7 +356,7 @@ void ScreenPointer::OnDisplayInfo(const OLD::DisplayInfo &di, bool isWindowRotat bool ScreenPointer::UpdatePadding(uint32_t mainWidth, uint32_t mainHeight) { -#ifndef OHOS_BUILD_PC_EXTERNAL_SCREEN +#ifndef OHOS_BUILD_EXTERNAL_SCREEN if (!IsMirror()) { MMI_HILOGI("UpdatePadidng, reset padding, screenId=%{public}" PRIu64 ", scale=%{public}f, " "paddingTop_=%{public}u, paddingLeft_=%{public}u", screenId_, scale_, paddingTop_, paddingLeft_); @@ -365,7 +365,7 @@ bool ScreenPointer::UpdatePadding(uint32_t mainWidth, uint32_t mainHeight) paddingLeft_ = 0; return false; } -#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN +#endif // OHOS_BUILD_EXTERNAL_SCREEN if (mainWidth == 0 || mainHeight == 0) { MMI_HILOGE("Invalid parameters, mainWidth=%{public}u, mainHeight=%{public}u", mainWidth, mainHeight); return false; @@ -378,11 +378,11 @@ bool ScreenPointer::UpdatePadding(uint32_t mainWidth, uint32_t mainHeight) scale_ = fmin(float(width_) / mainWidth, float(height_) / mainHeight); paddingTop_ = (height_ - mainHeight * scale_) / NUM_TWO; paddingLeft_ = (width_ - mainWidth * scale_) / NUM_TWO; -#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN +#ifdef OHOS_BUILD_EXTERNAL_SCREEN if (IsMain()) { scale_ = 1.0; } -#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN +#endif // OHOS_BUILD_EXTERNAL_SCREEN MMI_HILOGI("UpdatePadding, screenId=%{public}" PRIu64 ", scale=%{public}f, paddingTop_=%{public}u," " paddingLeft_=%{public}u", screenId_, scale_, paddingTop_, paddingLeft_); return true; @@ -437,13 +437,13 @@ void ScreenPointer::CalculateHwcPositionForMirror(int32_t& x, int32_t& y) y += paddingTop_; } -#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN +#ifdef OHOS_BUILD_EXTERNAL_SCREEN void ScreenPointer::CalculateHwcPositionForMain(int32_t& x, int32_t& y) { x += paddingLeft_; y += paddingTop_; } -#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN +#endif // OHOS_BUILD_EXTERNAL_SCREEN void ScreenPointer::CalculateHwcPositionForExtend(int32_t& x, int32_t& y) { @@ -460,11 +460,11 @@ bool ScreenPointer::Move(int32_t x, int32_t y, ICON_TYPE align) CHKPF(hwcMgr_); int32_t px = 0; int32_t py = 0; -#ifdef OHOS_BUILD_PC_EXTERNAL_SCREEN +#ifdef OHOS_BUILD_EXTERNAL_SCREEN if (IsMain()) { CalculateHwcPositionForMain(x, y); } -#endif // OHOS_BUILD_PC_EXTERNAL_SCREEN +#endif // OHOS_BUILD_EXTERNAL_SCREEN if (IsMirror()) { CalculateHwcPositionForMirror(x, y); } else if (GetIsCurrentOffScreenRendering() && !IsMirror()) { -- Gitee From ed64192831abd429c806daa2e1e19b3e45d5fd48 Mon Sep 17 00:00:00 2001 From: dock_yu Date: Fri, 12 Sep 2025 17:10:35 +0800 Subject: [PATCH 05/11] =?UTF-8?q?=E9=9A=94=E9=9B=A2=E5=84=AA=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: dock_yu --- .../src/touch_transform_processor.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/service/touch_event_normalize/src/touch_transform_processor.cpp b/service/touch_event_normalize/src/touch_transform_processor.cpp index f7ac03aa37..c64c4a03a5 100644 --- a/service/touch_event_normalize/src/touch_transform_processor.cpp +++ b/service/touch_event_normalize/src/touch_transform_processor.cpp @@ -197,16 +197,17 @@ bool TouchTransformProcessor::OnEventTouchMotion(struct libinput_event *event) uint64_t time = libinput_event_touch_get_time_usec(touch); pointerEvent_->SetActionTime(time); pointerEvent_->SetPointerAction(PointerEvent::POINTER_ACTION_MOVE); + EventTouch touchInfo; + int32_t logicalDisplayId = pointerEvent_->GetTargetDisplayId(); PointerEvent::PointerItem item; int32_t seatSlot = libinput_event_touch_get_seat_slot(touch); - if (!(pointerEvent_->GetPointerItem(seatSlot, item))) { #ifdef OHOS_BUILD_EXTERNAL_SCREEN + if (!pointerEvent_->GetPointerItem(seatSlot, item) && + WIN_MGR->TouchPointToDisplayPoint(deviceId_, touch, touchInfo, logicalDisplayId, true, false)) { CHKFR(OnEventTouchDown(event), nullptr, "Get OnEventTouchDown failed"); return true; -#endif // OHOS_BUILD_EXTERNAL_SCREEN } - EventTouch touchInfo; - int32_t logicalDisplayId = pointerEvent_->GetTargetDisplayId(); +#endif // OHOS_BUILD_EXTERNAL_SCREEN if (!WIN_MGR->TouchPointToDisplayPoint(deviceId_, touch, touchInfo, logicalDisplayId, true, true)) { processedCount_++; if (processedCount_ == PRINT_INTERVAL_COUNT) { @@ -216,7 +217,7 @@ bool TouchTransformProcessor::OnEventTouchMotion(struct libinput_event *event) return false; } if (!(pointerEvent_->GetPointerItem(seatSlot, item))) { - MMI_HILOGD("Get pointer parameter failed"); + MMI_HILOGE("Get pointer parameter failed"); return false; } int32_t blobId = libinput_event_touch_get_blob_id(touch); -- Gitee From 27feaa5f933fe042556a2175c8a2f6ca21a60d7b Mon Sep 17 00:00:00 2001 From: dock_yu Date: Sat, 13 Sep 2025 09:14:22 +0800 Subject: [PATCH 06/11] =?UTF-8?q?bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: dock_yu --- service/window_manager/src/pointer_drawing_manager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/service/window_manager/src/pointer_drawing_manager.cpp b/service/window_manager/src/pointer_drawing_manager.cpp index 18686087c6..502406466f 100644 --- a/service/window_manager/src/pointer_drawing_manager.cpp +++ b/service/window_manager/src/pointer_drawing_manager.cpp @@ -3359,8 +3359,8 @@ void PointerDrawingManager::OnScreenModeChange(const std::vectorIsMirror() || sp.second->IsMain()) { - mainWidth = si->GetMirrorWidth() == 0 ? mainWidth : si->GetMirrorWidth(); - mainHeight = si->GetMirrorHeight() == 0 ? mainHeight : si->GetMirrorHeight(); + mainWidth = sp.second->GetMirrorWidth() == 0 ? mainWidth : sp.second->GetMirrorWidth(); + mainHeight = sp.second->GetMirrorHeight() == 0 ? mainHeight : sp.second->GetMirrorHeight(); sp.second->UpdatePadding(mainWidth, mainHeight); } #endif // OHOS_BUILD_EXTERNAL_SCREEN -- Gitee From 9896e29a283e14ee5887de167e80fccf04efdeb8 Mon Sep 17 00:00:00 2001 From: dock_yu Date: Sat, 13 Sep 2025 06:40:28 +0000 Subject: [PATCH 07/11] update test/facility/mock/include/input_windows_manager_mock.h. Signed-off-by: dock_yu --- test/facility/mock/include/input_windows_manager_mock.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/facility/mock/include/input_windows_manager_mock.h b/test/facility/mock/include/input_windows_manager_mock.h index 7b34028c7d..929b3ad358 100644 --- a/test/facility/mock/include/input_windows_manager_mock.h +++ b/test/facility/mock/include/input_windows_manager_mock.h @@ -103,7 +103,8 @@ public: #endif //OHOS_BUILD_ENABLE_POINTER #ifdef OHOS_BUILD_ENABLE_TOUCH - MOCK_METHOD(bool, TouchPointToDisplayPoint, (int32_t, struct libinput_event_touch*, EventTouch&, int32_t&, bool, bool)); + MOCK_METHOD(bool, TouchPointToDisplayPoint, (int32_t, struct libinput_event_touch*, EventTouch&, int32_t&, bool, + bool)); MOCK_METHOD(bool, CalculateTipPoint, (struct libinput_event_tablet_tool*, int32_t&, PhysicalCoordinate&, PointerEvent::PointerItem&)); MOCK_METHOD(const OLD::DisplayInfo *, GetDefaultDisplayInfo, (), (const)); -- Gitee From 182ff113dcfdfd65816d7f0070ee27133ff4ce39 Mon Sep 17 00:00:00 2001 From: dock_yu Date: Sat, 13 Sep 2025 14:59:16 +0800 Subject: [PATCH 08/11] =?UTF-8?q?cleanCode=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: dock_yu --- service/window_manager/src/input_windows_manager.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/service/window_manager/src/input_windows_manager.cpp b/service/window_manager/src/input_windows_manager.cpp index 4239496243..ee23964985 100644 --- a/service/window_manager/src/input_windows_manager.cpp +++ b/service/window_manager/src/input_windows_manager.cpp @@ -1503,10 +1503,10 @@ bool InputWindowsManager::IsPositionOutValidDisplay( (rotateY < offsetY) || (rotateY > offsetY + validH); #ifdef OHOS_BUILD_EXTERNAL_SCREEN if (isOut && isPointerDowned) { - if (rotateX < offsetX) { rotateX = offsetX; } - if (rotateX > offsetX + validW) { rotateX = offsetX + validW; } - if (rotateY < offsetY) { rotateY = offsetY; } - if (rotateY > offsetY + validH) { rotateY = offsetY + validH; } + rotateX = std::max(rotateX, offsetX); + rotateX = std::min(rotateX, offsetX + validW); + rotateY = std::max(rotateY, offsetY); + rotateY = std::min(rotateY, offsetY + validH); isOut = false; } #endif // OHOS_BUILD_EXTERNAL_SCREEN -- Gitee From 2b606c2ed61c13e6d76750d22d446437d1e26837 Mon Sep 17 00:00:00 2001 From: dock_yu Date: Sat, 13 Sep 2025 07:32:09 +0000 Subject: [PATCH 09/11] update service/touch_event_normalize/src/touch_transform_processor.cpp. Signed-off-by: dock_yu --- service/touch_event_normalize/src/touch_transform_processor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/touch_event_normalize/src/touch_transform_processor.cpp b/service/touch_event_normalize/src/touch_transform_processor.cpp index c64c4a03a5..faf7090023 100644 --- a/service/touch_event_normalize/src/touch_transform_processor.cpp +++ b/service/touch_event_normalize/src/touch_transform_processor.cpp @@ -204,7 +204,7 @@ bool TouchTransformProcessor::OnEventTouchMotion(struct libinput_event *event) #ifdef OHOS_BUILD_EXTERNAL_SCREEN if (!pointerEvent_->GetPointerItem(seatSlot, item) && WIN_MGR->TouchPointToDisplayPoint(deviceId_, touch, touchInfo, logicalDisplayId, true, false)) { - CHKFR(OnEventTouchDown(event), nullptr, "Get OnEventTouchDown failed"); + CHKFR(OnEventTouchDown(event), false, "Get OnEventTouchDown failed"); return true; } #endif // OHOS_BUILD_EXTERNAL_SCREEN -- Gitee From 15f61f7900f6882689c617a813541caf8ec0f590 Mon Sep 17 00:00:00 2001 From: dock_yu Date: Sat, 13 Sep 2025 18:59:11 +0800 Subject: [PATCH 10/11] =?UTF-8?q?=E8=A7=A6=E5=B1=8F=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I0494c609fcfca9acb95be6098f26422341641549 Signed-off-by: y30052698 --- .../include/touch_transform_processor.h | 8 +++ .../src/touch_transform_processor.cpp | 53 +++++++++++++++++-- .../include/input_windows_manager.h | 7 +-- .../src/input_windows_manager.cpp | 12 ++--- 4 files changed, 68 insertions(+), 12 deletions(-) diff --git a/service/touch_event_normalize/include/touch_transform_processor.h b/service/touch_event_normalize/include/touch_transform_processor.h index 341c9263b8..ab8fea8b61 100644 --- a/service/touch_event_normalize/include/touch_transform_processor.h +++ b/service/touch_event_normalize/include/touch_transform_processor.h @@ -44,6 +44,11 @@ private: void UpdatePointerItemByTouchInfo(PointerEvent::PointerItem &item, EventTouch &touchInfo); void InitToolTypes(); bool DumpInner(); +#ifdef OHOS_BUILD_EXTERNAL_SCREEN + void AddInvalidAreaDownedEvent(int32_t seatSlot); + void RemoveInvalidAreaDownedEvent(int32_t seatSlot); + bool isInvalidAreaDownedEvent(int32_t seatSlot); +#endif // OHOS_BUILD_EXTERNAL_SCREEN private: const int32_t deviceId_ { -1 }; int32_t processedCount_ { 0 }; @@ -67,6 +72,9 @@ private: #ifdef OHOS_BUILD_ENABLE_FINGERSENSE_WRAPPER TouchType rawTouch_; #endif // OHOS_BUILD_ENABLE_FINGERSENSE_WRAPPER +#ifdef OHOS_BUILD_EXTERNAL_SCREEN + std::list InvalidAreaDownedEvents_; +#endif // OHOS_BUILD_EXTERNAL_SCREEN }; } // namespace MMI } // namespace OHOS diff --git a/service/touch_event_normalize/src/touch_transform_processor.cpp b/service/touch_event_normalize/src/touch_transform_processor.cpp index faf7090023..dcf6c758c4 100644 --- a/service/touch_event_normalize/src/touch_transform_processor.cpp +++ b/service/touch_event_normalize/src/touch_transform_processor.cpp @@ -38,6 +38,7 @@ constexpr int32_t DRIVER_NUMBER { 8 }; constexpr int32_t MT_TOOL_THP_FEATURE {11}; constexpr uint32_t TOUCH_CANCEL_MASK { 1U << 29U }; constexpr int32_t PRINT_INTERVAL_COUNT { 50 }; +constexpr int32_t MAX_N_POINTER_ITEMS { 10 }; } // namespace TouchTransformProcessor::TouchTransformProcessor(int32_t deviceId) @@ -60,6 +61,9 @@ bool TouchTransformProcessor::OnEventTouchCancel(struct libinput_event *event) PointerEvent::PointerItem item; int32_t seatSlot = libinput_event_touch_get_seat_slot(touch); +#ifdef OHOS_BUILD_EXTERNAL_SCREEN + RemoveInvalidAreaDownedEvent(seatSlot); +#endif // OHOS_BUILD_EXTERNAL_SCREEN if (!(pointerEvent_->GetPointerItem(seatSlot, item))) { MMI_HILOGE("Get pointer parameter failed"); return false; @@ -86,10 +90,17 @@ bool TouchTransformProcessor::OnEventTouchDown(struct libinput_event *event) CHKPF(device); EventTouch touchInfo; int32_t logicalDisplayId = -1; + int32_t seatSlot = libinput_event_touch_get_seat_slot(touch); if (!WIN_MGR->TouchPointToDisplayPoint(deviceId_, touch, touchInfo, logicalDisplayId)) { MMI_HILOGE("TouchDownPointToDisplayPoint failed"); +#ifdef OHOS_BUILD_EXTERNAL_SCREEN + AddInvalidAreaDownedEvent(seatSlot); +#endif // OHOS_BUILD_EXTERNAL_SCREEN return false; } +#ifdef OHOS_BUILD_EXTERNAL_SCREEN + RemoveInvalidAreaDownedEvent(seatSlot); +#endif // OHOS_BUILD_EXTERNAL_SCREEN auto pointIds = pointerEvent_->GetPointerIds(); uint64_t time = libinput_event_touch_get_time_usec(touch); if (pointIds.empty()) { @@ -102,7 +113,6 @@ bool TouchTransformProcessor::OnEventTouchDown(struct libinput_event *event) int32_t blobId = libinput_event_touch_get_blob_id(touch); item.SetBlobId(blobId); double pressure = libinput_event_touch_get_pressure(touch); - int32_t seatSlot = libinput_event_touch_get_seat_slot(touch); // we clean up pointerItem's cancel mark at down stage to ensure newer event // always starts with a clean and inital state if (pointerItemCancelMarks_.find(seatSlot) != pointerItemCancelMarks_.end()) { @@ -199,12 +209,12 @@ bool TouchTransformProcessor::OnEventTouchMotion(struct libinput_event *event) pointerEvent_->SetPointerAction(PointerEvent::POINTER_ACTION_MOVE); EventTouch touchInfo; int32_t logicalDisplayId = pointerEvent_->GetTargetDisplayId(); - PointerEvent::PointerItem item; int32_t seatSlot = libinput_event_touch_get_seat_slot(touch); #ifdef OHOS_BUILD_EXTERNAL_SCREEN - if (!pointerEvent_->GetPointerItem(seatSlot, item) && + if (isInvalidAreaDownedEvent(seatSlot) && WIN_MGR->TouchPointToDisplayPoint(deviceId_, touch, touchInfo, logicalDisplayId, true, false)) { CHKFR(OnEventTouchDown(event), false, "Get OnEventTouchDown failed"); + RemoveInvalidAreaDownedEvent(seatSlot); return true; } #endif // OHOS_BUILD_EXTERNAL_SCREEN @@ -216,6 +226,7 @@ bool TouchTransformProcessor::OnEventTouchMotion(struct libinput_event *event) } return false; } + PointerEvent::PointerItem item; if (!(pointerEvent_->GetPointerItem(seatSlot, item))) { MMI_HILOGE("Get pointer parameter failed"); return false; @@ -249,6 +260,9 @@ bool TouchTransformProcessor::OnEventTouchUp(struct libinput_event *event) uint64_t time = libinput_event_touch_get_time_usec(touch); pointerEvent_->SetActionTime(time); int32_t seatSlot = libinput_event_touch_get_seat_slot(touch); +#ifdef OHOS_BUILD_EXTERNAL_SCREEN + RemoveInvalidAreaDownedEvent(seatSlot); +#endif // OHOS_BUILD_EXTERNAL_SCREEN if (pointerItemCancelMarks_.find(seatSlot) != pointerItemCancelMarks_.end()) { pointerEvent_->SetPointerAction(PointerEvent::POINTER_ACTION_CANCEL); pointerItemCancelMarks_.erase(seatSlot); @@ -413,5 +427,38 @@ void TouchTransformProcessor::InitToolTypes() vecToolType_.emplace_back(std::make_pair(BTN_TOOL_MOUSE, PointerEvent::TOOL_TYPE_MOUSE)); vecToolType_.emplace_back(std::make_pair(BTN_TOOL_LENS, PointerEvent::TOOL_TYPE_LENS)); } + +#ifdef OHOS_BUILD_EXTERNAL_SCREEN +bool TouchTransformProcessor::isInvalidAreaDownedEvent(int32_t seatSlot) { + for (auto& item : InvalidAreaDownedEvents_) { + if (item == seatSlot) { + return true; + } + } + return false; +} + +void TouchTransformProcessor::AddInvalidAreaDownedEvent(int32_t seatSlot) { + if (InvalidAreaDownedEvents_.size() >= MAX_N_POINTER_ITEMS) { + InvalidAreaDownedEvents_.erase(InvalidAreaDownedEvents_.begin()); + return; + } + for (auto& item : InvalidAreaDownedEvents_) { + if (item == seatSlot) { + return; + } + } + InvalidAreaDownedEvents_.push_back(seatSlot); +} + +void TouchTransformProcessor::RemoveInvalidAreaDownedEvent(int32_t seatSlot) { + for (auto it = InvalidAreaDownedEvents_.begin(); it != InvalidAreaDownedEvents_.end(); ++it) { + if (*it == seatSlot) { + InvalidAreaDownedEvents_.erase(it); + break; + } + } +} +#endif // OHOS_BUILD_EXTERNAL_SCREEN } // namespace MMI } // namespace OHOS diff --git a/service/window_manager/include/input_windows_manager.h b/service/window_manager/include/input_windows_manager.h index de0fe11131..cd4c56acb6 100644 --- a/service/window_manager/include/input_windows_manager.h +++ b/service/window_manager/include/input_windows_manager.h @@ -141,7 +141,7 @@ public: #ifdef OHOS_BUILD_ENABLE_TOUCH void AdjustDisplayCoordinate(const OLD::DisplayInfo& displayInfo, double& physicalX, double& physicalY) const; bool TouchPointToDisplayPoint(int32_t deviceId, struct libinput_event_touch* touch, - EventTouch& touchInfo, int32_t& targetDisplayId, bool isNeedClear = false, bool isPointerDowned = false); + EventTouch& touchInfo, int32_t& targetDisplayId, bool isNeedClear = false, bool hasValidAreaDowned = false); #endif // OHOS_BUILD_ENABLE_TOUCH #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH) void ReverseRotateScreen(const OLD::DisplayInfo& info, const double x, const double y, @@ -393,7 +393,8 @@ void HandleOneHandMode(const OLD::DisplayInfo &displayInfo, std::shared_ptr keyEvent, int32_t focusWindowId, int32_t groupId = DEFAULT_GROUP_ID); diff --git a/service/window_manager/src/input_windows_manager.cpp b/service/window_manager/src/input_windows_manager.cpp index ee23964985..fd7ecb0251 100644 --- a/service/window_manager/src/input_windows_manager.cpp +++ b/service/window_manager/src/input_windows_manager.cpp @@ -1453,7 +1453,7 @@ void InputWindowsManager::ResetPointerPositionIfOutValidDisplay(const OLD::Displ } bool InputWindowsManager::IsPositionOutValidDisplay( - Coordinate2D &position, const OLD::DisplayInfo ¤tDisplay, bool isPhysicalPos, bool isPointerDowned) + Coordinate2D &position, const OLD::DisplayInfo ¤tDisplay, bool isPhysicalPos, bool hasValidAreaDowned) { double posX = position.x; double posY = position.y; @@ -1502,7 +1502,7 @@ bool InputWindowsManager::IsPositionOutValidDisplay( bool isOut = (rotateX < offsetX) || (rotateX > offsetX + validW) || (rotateY < offsetY) || (rotateY > offsetY + validH); #ifdef OHOS_BUILD_EXTERNAL_SCREEN - if (isOut && isPointerDowned) { + if (isOut && hasValidAreaDowned) { rotateX = std::max(rotateX, offsetX); rotateX = std::min(rotateX, offsetX + validW); rotateY = std::max(rotateY, offsetY); @@ -3027,7 +3027,7 @@ void InputWindowsManager::RotateDisplayScreen(const OLD::DisplayInfo& info, Phys #ifdef OHOS_BUILD_ENABLE_TOUCH bool InputWindowsManager::GetPhysicalDisplayCoord(int32_t deviceId, struct libinput_event_touch* touch, - const OLD::DisplayInfo& info, EventTouch& touchInfo, bool isNeedClear, bool isPointerDowned) + const OLD::DisplayInfo& info, EventTouch& touchInfo, bool isNeedClear, bool hasValidAreaDowned) { PrintDisplayInfo(info); auto width = info.width; @@ -3046,7 +3046,7 @@ bool InputWindowsManager::GetPhysicalDisplayCoord(int32_t deviceId, struct libin MMI_HILOGD("width:%{private}d, height:%{private}d, physicalX:%{private}f, physicalY:%{private}f", width, height, coord.x, coord.y); Coordinate2D pos = { .x = coord.x, .y = coord.y }; - if (IsPositionOutValidDisplay(pos, info, true, isPointerDowned)) { + if (IsPositionOutValidDisplay(pos, info, true, hasValidAreaDowned)) { if (INPUT_DEV_MGR->GetVendorConfig(deviceId).enableOutScreen != ENABLE_OUT_SCREEN_TOUCH) { MMI_HILOGW("Position out valid display width:%{private}d, height:%{private}d, " "physicalX:%{private}f, physicalY:%{private}f", width, height, pos.x, pos.y); @@ -3134,7 +3134,7 @@ void InputWindowsManager::SetAntiMisTakeStatus(bool state) } bool InputWindowsManager::TouchPointToDisplayPoint(int32_t deviceId, struct libinput_event_touch* touch, - EventTouch& touchInfo, int32_t& physicalDisplayId, bool isNeedClear, bool isPointerDowned) + EventTouch& touchInfo, int32_t& physicalDisplayId, bool isNeedClear, bool hasValidAreaDowned) { CHKPF(touch); std::string screenId = bindInfo_.GetBindDisplayNameByInputDevice(deviceId); @@ -3148,7 +3148,7 @@ bool InputWindowsManager::TouchPointToDisplayPoint(int32_t deviceId, struct libi MMI_HILOGE("Get OLD::DisplayInfo is error"); return false; } - return GetPhysicalDisplayCoord(deviceId, touch, *info, touchInfo, isNeedClear, isPointerDowned); + return GetPhysicalDisplayCoord(deviceId, touch, *info, touchInfo, isNeedClear, hasValidAreaDowned); } bool InputWindowsManager::TransformTipPoint(struct libinput_event_tablet_tool* tip, -- Gitee From 26ba43aae42f4920bb35ae4856f4e7ae24412341 Mon Sep 17 00:00:00 2001 From: dock_yu Date: Sat, 13 Sep 2025 19:25:53 +0800 Subject: [PATCH 11/11] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I29453eec49a2d0739f0d57b2f1e5beb6b67b5a14 Signed-off-by: y30052698 --- .../src/touch_transform_processor.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/service/touch_event_normalize/src/touch_transform_processor.cpp b/service/touch_event_normalize/src/touch_transform_processor.cpp index dcf6c758c4..ed25aed587 100644 --- a/service/touch_event_normalize/src/touch_transform_processor.cpp +++ b/service/touch_event_normalize/src/touch_transform_processor.cpp @@ -38,7 +38,9 @@ constexpr int32_t DRIVER_NUMBER { 8 }; constexpr int32_t MT_TOOL_THP_FEATURE {11}; constexpr uint32_t TOUCH_CANCEL_MASK { 1U << 29U }; constexpr int32_t PRINT_INTERVAL_COUNT { 50 }; +#ifdef OHOS_BUILD_EXTERNAL_SCREEN constexpr int32_t MAX_N_POINTER_ITEMS { 10 }; +#endif // OHOS_BUILD_EXTERNAL_SCREEN } // namespace TouchTransformProcessor::TouchTransformProcessor(int32_t deviceId) @@ -429,7 +431,8 @@ void TouchTransformProcessor::InitToolTypes() } #ifdef OHOS_BUILD_EXTERNAL_SCREEN -bool TouchTransformProcessor::isInvalidAreaDownedEvent(int32_t seatSlot) { +bool TouchTransformProcessor::isInvalidAreaDownedEvent(int32_t seatSlot) +{ for (auto& item : InvalidAreaDownedEvents_) { if (item == seatSlot) { return true; @@ -438,7 +441,8 @@ bool TouchTransformProcessor::isInvalidAreaDownedEvent(int32_t seatSlot) { return false; } -void TouchTransformProcessor::AddInvalidAreaDownedEvent(int32_t seatSlot) { +void TouchTransformProcessor::AddInvalidAreaDownedEvent(int32_t seatSlot) +{ if (InvalidAreaDownedEvents_.size() >= MAX_N_POINTER_ITEMS) { InvalidAreaDownedEvents_.erase(InvalidAreaDownedEvents_.begin()); return; @@ -451,7 +455,8 @@ void TouchTransformProcessor::AddInvalidAreaDownedEvent(int32_t seatSlot) { InvalidAreaDownedEvents_.push_back(seatSlot); } -void TouchTransformProcessor::RemoveInvalidAreaDownedEvent(int32_t seatSlot) { +void TouchTransformProcessor::RemoveInvalidAreaDownedEvent(int32_t seatSlot) +{ for (auto it = InvalidAreaDownedEvents_.begin(); it != InvalidAreaDownedEvents_.end(); ++it) { if (*it == seatSlot) { InvalidAreaDownedEvents_.erase(it); -- Gitee