diff --git a/window_scene/session/host/include/move_drag_controller.h b/window_scene/session/host/include/move_drag_controller.h index 89e0baea862818fc3e7e1f626cb8d533e6869423..3b4c1a27983c337e0a087011dc5ca0cfc9daea4d 100644 --- a/window_scene/session/host/include/move_drag_controller.h +++ b/window_scene/session/host/include/move_drag_controller.h @@ -44,6 +44,9 @@ const uint32_t WINDOW_HOT_AREA_TYPE_UNDEFINED = 0; const int32_t POSITIVE_CORRELATION = 1; const int32_t NEGATIVE_CORRELATION = -1; +constexpr int32_t INVALID_POINTER_ID = -1; +constexpr int32_t INVALID_POINTER_TYPE = -1; + enum class MoveDirection : uint32_t { UNKNOWN, LEFT_TO_RIGHT, @@ -155,8 +158,8 @@ public: private: struct MoveDragProperty { - int32_t pointerId_ = -1; - int32_t pointerType_ = -1; + int32_t pointerId_ = INVALID_POINTER_ID; + int32_t pointerType_ = INVALID_POINTER_TYPE; int32_t originalPointerPosX_ = -1; int32_t originalPointerPosY_ = -1; // the x coordinate of the pointer related to the active window @@ -172,13 +175,13 @@ private: bool isEmpty() const { - return (pointerId_ == -1 && originalPointerPosX_ == -1 && originalPointerPosY_ == -1); + return pointerId_ == INVALID_POINTER_ID && originalPointerPosX_ == -1 && originalPointerPosY_ == -1; } }; struct MoveTempProperty { - int32_t pointerId_ = -1; - int32_t pointerType_ = -1; + int32_t pointerId_ = INVALID_POINTER_ID; + int32_t pointerType_ = INVALID_POINTER_TYPE; int32_t lastDownPointerPosX_ = -1; int32_t lastDownPointerPosY_ = -1; int32_t lastDownPointerWindowX_ = -1; @@ -188,7 +191,7 @@ private: bool isEmpty() const { - return (pointerId_ == -1 && lastDownPointerPosX_ == -1 && lastDownPointerPosY_ == -1); + return pointerId_ == INVALID_POINTER_ID && lastDownPointerPosX_ == -1 && lastDownPointerPosY_ == -1; } }; @@ -275,8 +278,8 @@ private: int32_t sourceType, const WSRect& winRect); void CalculateStartRectExceptHotZone(float vpr, const WSRect& winRect); WSError UpdateMoveTempProperty(const std::shared_ptr& pointerEvent); - bool CheckDragEventLegal(const std::shared_ptr& pointerEvent, - const sptr property); + bool CheckDragEventLegal( + const std::shared_ptr& pointerEvent, const sptr& property); void ResSchedReportData(int32_t type, bool onOffTag); void NotifyWindowInputPidChange(bool isServerPid); @@ -285,6 +288,9 @@ private: */ std::pair CalcUnifiedTranslate(const std::shared_ptr& pointerEvent); + bool IsPointerConsistent( + int32_t startPointerId, int32_t startPointerType, int32_t currentPointerId, int32_t currentPointerType) const; + bool isStartMove_ = false; bool isStartDrag_ = false; bool isMovable_ = true; diff --git a/window_scene/session/host/src/move_drag_controller.cpp b/window_scene/session/host/src/move_drag_controller.cpp index c49e516defb9c041c5accec6eac028594e1a7102..d23d8c3db85e664178adb62dbb4787142826089c 100644 --- a/window_scene/session/host/src/move_drag_controller.cpp +++ b/window_scene/session/host/src/move_drag_controller.cpp @@ -39,6 +39,14 @@ #include "res_type.h" #endif +#define RETURN_IF_IS_NULL(param, ...) \ + do { \ + if (!param) { \ + TLOGE(WmsLogTag::WMS_LAYOUT, "The %{public}s is null", #param); \ + return __VA_ARGS__; \ + } \ + } while (false) \ + namespace OHOS::Rosen { namespace { constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "MoveDragController"}; @@ -342,10 +350,7 @@ void MoveDragController::SetAspectRatio(float ratio) bool MoveDragController::ConsumeMoveEvent(const std::shared_ptr& pointerEvent, const WSRect& originalRect) { - if (pointerEvent == nullptr) { - TLOGE(WmsLogTag::WMS_LAYOUT, "ConsumeMoveEvent stop because of nullptr"); - return false; - } + RETURN_IF_IS_NULL(pointerEvent, false); if (GetStartDragFlag()) { TLOGI(WmsLogTag::WMS_LAYOUT, "the window is being resized"); return false; @@ -356,11 +361,9 @@ bool MoveDragController::ConsumeMoveEvent(const std::shared_ptrGetSourceType(); - if ((startPointerId != -1 && startPointerId != pointerItem.GetOriginPointerId()) || - (startPointerType != -1 && startPointerType != sourceType)) { + if (!IsPointerConsistent(moveDragProperty_.pointerId_, moveDragProperty_.pointerType_, + pointerItem.GetOriginPointerId(), sourceType)) { TLOGI(WmsLogTag::WMS_LAYOUT, "block unnecessary pointer event inside the window"); return false; } @@ -1399,13 +1402,10 @@ void MoveDragController::CalculateStartRectExceptHotZone(float vpr, const WSRect WSError MoveDragController::UpdateMoveTempProperty(const std::shared_ptr& pointerEvent) { int32_t pointerId = pointerEvent->GetPointerId(); - int32_t startPointerId = moveTempProperty_.pointerId_; int32_t pointerType = pointerEvent->GetSourceType(); - int32_t startPointerType = moveDragProperty_.pointerType_; MMI::PointerEvent::PointerItem pointerItem; - int32_t sourceType = pointerEvent->GetSourceType(); if (!pointerEvent->GetPointerItem(pointerId, pointerItem) || - (sourceType == MMI::PointerEvent::SOURCE_TYPE_MOUSE && + (pointerType == MMI::PointerEvent::SOURCE_TYPE_MOUSE && pointerEvent->GetButtonId() != MMI::PointerEvent::MOUSE_BUTTON_LEFT)) { TLOGW(WmsLogTag::WMS_LAYOUT, "invalid pointerEvent"); return WSError::WS_ERROR_NULLPTR; @@ -1428,8 +1428,8 @@ WSError MoveDragController::UpdateMoveTempProperty(const std::shared_ptr& pointerEvent, - const sptr property) +bool MoveDragController::CheckDragEventLegal( + const std::shared_ptr& pointerEvent, const sptr& property) { - if (pointerEvent == nullptr || property == nullptr) { - TLOGE(WmsLogTag::WMS_LAYOUT, "ConsumeDragEvent stop because of nullptr"); - return false; - } - if (GetStartMoveFlag()) { - TLOGD(WmsLogTag::WMS_LAYOUT, "the window is being moved"); + RETURN_IF_NULL(pointerEvent, false); + RETURN_IF_NULL(property, false); + + if (isStartMove_) { + TLOGD(WmsLogTag::WMS_LAYOUT, "Window is being moved, drag event ignored, windowId: %{public}d", persistentId_); return false; } - if (!GetStartDragFlag() && pointerEvent->GetPointerAction() != MMI::PointerEvent::POINTER_ACTION_DOWN && - pointerEvent->GetPointerAction() != MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN) { - return false; + + if (!isStartDrag_) { + auto action = pointerEvent->GetPointerAction(); + return action == MMI::PointerEvent::POINTER_ACTION_DOWN || + action == MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN; } + int32_t pointerId = pointerEvent->GetPointerId(); MMI::PointerEvent::PointerItem pointerItem; if (!pointerEvent->GetPointerItem(pointerId, pointerItem)) { - TLOGW(WmsLogTag::WMS_LAYOUT, "Failed to get pointer item, pointerId: %{public}d", pointerId); + TLOGW(WmsLogTag::WMS_LAYOUT, + "Failed to get pointer item, pointerId: %{public}d, windowId: %{public}d", pointerId); return false; } - int32_t startPointerId = moveDragProperty_.pointerId_; - int32_t startPointerType = moveDragProperty_.pointerType_; - if (GetStartDragFlag() && ((startPointerId != -1 && startPointerId != pointerItem.GetOriginPointerId()) || - (startPointerType != -1 && startPointerType != pointerEvent->GetSourceType()))) { - TLOGE(WmsLogTag::WMS_LAYOUT, "block unnecessary pointer event inside the window"); - return false; + + bool isConsistent = IsPointerConsistent(moveDragProperty_.pointerId_, moveDragProperty_.pointerType_, + pointerItem.GetOriginPointerId(), pointerEvent->GetSourceType()); + if (!isConsistent) { + TLOGE(WmsLogTag::WMS_LAYOUT, "Block unnecessary pointer event inside the window"); } - return true; + return isConsistent; } /** @note @window.drag */ @@ -1660,4 +1662,11 @@ void MoveDragController::ResSchedReportData(int32_t type, bool onOffTag) WLOGFD("ResSchedReportData success type: %{public}d onOffTag: %{public}d", type, onOffTag); #endif } + +bool MoveDragController::IsPointerConsistent( + int32_t startPointerId, int32_t startPointerType, int32_t currentPointerId, int32_t currentPointerType) const +{ + return (startPointerId == INVALID_POINTER_ID || startPointerId == currentPointerId) && + (startPointerType == INVALID_POINTER_TYPE || startPointerType == currentPointerType); +} } // namespace OHOS::Rosen