diff --git a/wm/include/window_scene_session_impl.h b/wm/include/window_scene_session_impl.h index fc79746e47270aab5fd8695880ed081e1effbe16..01867d8aaed3f07ea0b9adb154343a76c90e3269 100644 --- a/wm/include/window_scene_session_impl.h +++ b/wm/include/window_scene_session_impl.h @@ -285,6 +285,11 @@ private: void CalculateNewLimitsByRatio(WindowLimits& newLimits, WindowLimits& customizedLimits); void NotifyDisplayInfoChange(const sptr& info = nullptr); void UpdateDensityInner(const sptr& info = nullptr); + + /* + * Window Input Event + */ + void ResetSuperFoldDisplayY(const std::shared_ptr& pointerEvent); /* * Window Recover @@ -353,6 +358,11 @@ private: * PC Window */ bool isExecuteDelayRaise_ = false; + + /* + * Window Input Event + */ + int32_t superFoldOffsetY_ = -1; // calculate the total height of the display_B area and crease area. }; } // namespace Rosen } // namespace OHOS diff --git a/wm/src/window_scene_session_impl.cpp b/wm/src/window_scene_session_impl.cpp index 2b11009eb7f00a97d65efef25f87d754402a9c61..4163f0520752112e8049b7399528ec779aab5802 100644 --- a/wm/src/window_scene_session_impl.cpp +++ b/wm/src/window_scene_session_impl.cpp @@ -28,6 +28,7 @@ #include "display_manager.h" #include "display_manager_adapter.h" #include "dm_common.h" +#include "fold_screen_controller/super_fold_state_manager.h" #include "input_transfer_station.h" #include "perform_reporter.h" #include "session_helper.h" @@ -703,6 +704,35 @@ bool WindowSceneSessionImpl::HandlePointDownEvent(const std::shared_ptr& pointerEvent) +{ + if (superFoldOffsetY_ == -1) { + auto foldCreaseRegion = DisplayManager::GetInstance().GetCurrentFoldCreaseRegion(); + if (foldCreaseRegion == nullptr) { + TLOGE(WmsLogTag::WMS_INPUT_KEY_FLOW, "foldCreaseRegion is nullptr"); + return; + } + const auto& creaseRects = foldCreaseRegion->GetCreaseRects(); + if (creaseRects.empty()) { + TLOGE(WmsLogTag::WMS_INPUT_KEY_FLOW, "creaseRects is empty"); + return; + } + const auto& rect = creaseRects.front(); + superFoldOffsetY_ = rect.height_ + rect.posY_; + TLOGI(WmsLogTag::WMS_EVENT, "height: %{public}d, posY: %{public}d", rect.height_, rect.posY_); + } + MMI::PointerEvent::PointerItem pointerItem; + if (!pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointerItem)) { + TLOGE(WmsLogTag::WMS_INPUT_KEY_FLOW, "pointerItem is empty"); + return; + } + if (auto displayY = pointerItem.GetDisplayY(); displayY >= superFoldOffsetY_) { + pointerItem.SetDisplayY(displayY - superFoldOffsetY_); + pointerEvent->AddPointerItem(pointerItem); + TLOGD(WmsLogTag::WMS_EVENT, "Calculated superFoldOffsetY: %{public}d", superFoldOffsetY_); + } +} + void WindowSceneSessionImpl::ConsumePointerEventInner(const std::shared_ptr& pointerEvent, MMI::PointerEvent::PointerItem& pointerItem, bool isHitTargetDraggable) { @@ -747,6 +777,10 @@ void WindowSceneSessionImpl::ConsumePointerEventInner(const std::shared_ptr option = sptr::MakeSptr(); + option->SetWindowName("ResetSuperFoldDisplayY"); + sptr windowSceneSessionImpl = sptr::MakeSptr(option); + + std::shared_ptr pointerEvent = MMI::PointerEvent::Create(); + ASSERT_NE(nullptr, pointerEvent); + windowSceneSessionImpl->superFoldOffsetY_ = 150; + MMI::PointerEvent::PointerItem pointerItem; + pointerItem.SetDisplayY(100); + pointerEvent->AddPointerItem(pointerItem); + int32_t originalDisplayY = pointerItem.GetDisplayY(); + windowSceneSessionImpl->ResetSuperFoldDisplayY(pointerEvent); + pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointerItem); + int32_t updatedDisplayY = pointerItem.GetDisplayY(); + ASSERT_EQ(updatedDisplayY, originalDisplayY); + + pointerItem.SetDisplayY(150); + pointerEvent->AddPointerItem(pointerItem); + originalDisplayY = pointerItem.GetDisplayY(); + windowSceneSessionImpl->ResetSuperFoldDisplayY(pointerEvent); + pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointerItem); + updatedDisplayY = pointerItem.GetDisplayY(); + ASSERT_EQ(updatedDisplayY, originalDisplayY - 150); +} + /** * @tc.name: ConsumePointerEventInner * @tc.desc: ConsumePointerEventInner