From 95e7315df391fa0185c89865b8c053522a107858 Mon Sep 17 00:00:00 2001 From: wangxinpeng Date: Thu, 6 Jan 2022 15:34:42 +0800 Subject: [PATCH] fix updating display resolution to IMS Signed-off-by: wangxinpeng Change-Id: Ib4db3a24ec00ca302519758deef41e9628a42eb7 --- wmserver/include/input_window_monitor.h | 38 +++------------- wmserver/include/window_node_container.h | 5 ++- wmserver/src/input_window_monitor.cpp | 56 ++++++++++++++++++++++++ wmserver/src/window_node_container.cpp | 10 +++++ 4 files changed, 76 insertions(+), 33 deletions(-) diff --git a/wmserver/include/input_window_monitor.h b/wmserver/include/input_window_monitor.h index ed44650580..9ea20b1f80 100644 --- a/wmserver/include/input_window_monitor.h +++ b/wmserver/include/input_window_monitor.h @@ -16,6 +16,7 @@ #ifndef OHOS_INPUT_WINDOW_MONITOR_H #define OHOS_INPUT_WINDOW_MONITOR_H +#include #include #include @@ -25,38 +26,7 @@ namespace OHOS { namespace Rosen { class InputWindowMonitor : public RefBase { public: - InputWindowMonitor(sptr& root) : windowRoot_(root) - { - MMI::PhysicalDisplayInfo physicalDisplayInfo = { - .id = 0, //todo: update when DMS is ready - .leftDisplayId = -1, // todo: invalid displayId for testing - .upDisplayId = -1, // todo: invalid displayId for testing - .topLeftX = 0, // todo: use wgn info for testing - .topLeftY = 0, // todo: use wgn info for testing - .width = 2560, // todo: use wgn info for testing - .height = 1600, // todo: use wgn info for testing - .name = "physical_display0", // todo: wait for DMS - .seatId = "seat0", // todo: update seatId - .seatName = "default0", // todo: update seatId - .logicWidth = 2560, // todo: use wgn info for testing - .logicHeight = 1600, // todo: use wgn info for testing - .direction = MMI::Direction0 // todo: use direction 0 for testing - }; - physicalDisplays_.emplace_back(physicalDisplayInfo); - MMI::LogicalDisplayInfo logicalDisplayInfo = { - .id = 0, //todo: update when DMS is ready - .topLeftX = 0, // todo: use wgn info for testing - .topLeftY = 0, // todo: use wgn info for testing - .width = 2560, // todo: use wgn info for testing - .height = 1600, // todo: use wgn info for testing - .name = "logical_display0", // todo: wait for DMS - .seatId = "seat0", // todo: update seatId - .seatName = "default0", // todo: update seatName - .focusWindowId = -1, - .windowsInfo_ = {}, - }; - logicalDisplays_.emplace_back(logicalDisplayInfo); - } + InputWindowMonitor(sptr& root) : windowRoot_(root) {} ~InputWindowMonitor() = default; void UpdateInputWindow(uint32_t windowId); @@ -64,8 +34,12 @@ private: sptr windowRoot_; std::vector physicalDisplays_; std::vector logicalDisplays_; + std::unordered_set windowTypeSkipped_ { WindowType::WINDOW_TYPE_POINTER}; + const int INVALID_DISPLAY_ID = -1; + const int INVALID_WINDOW_ID = -1; void TraverseWindowNodes(const std::vector>& windowNodes, std::vector::iterator& iter); + void UpdateDisplaysInfo(const sptr& container); }; } } diff --git a/wmserver/include/window_node_container.h b/wmserver/include/window_node_container.h index 251683b665..7c8f77e83f 100644 --- a/wmserver/include/window_node_container.h +++ b/wmserver/include/window_node_container.h @@ -26,7 +26,7 @@ namespace OHOS { namespace Rosen { class WindowNodeContainer : public RefBase { public: - WindowNodeContainer(uint64_t screenId, uint32_t width, uint32_t height) + WindowNodeContainer(uint64_t screenId, uint32_t width, uint32_t height) : screenId_(screenId) { struct RSDisplayNodeConfig config = {screenId}; displayNode_ = RSDisplayNode::Create(config); @@ -49,6 +49,8 @@ public: WMError MinimizeOtherFullScreenAbility(); // adapt to api7 void TraverseContainer(std::vector>& windowNodes); WMError LayoutWindowNodes(); + uint64_t GetScreenId() const; + Rect GetDisplayRect() const; private: void AssignZOrder(sptr& node); @@ -67,6 +69,7 @@ private: std::shared_ptr displayNode_; std::vector removedIds_; uint32_t zOrder_ { 0 }; + uint64_t screenId_ = 0; uint32_t focusedWindow_ { 0 }; Rect displayRect_; WMError LayoutWindowNode(sptr& node); diff --git a/wmserver/src/input_window_monitor.cpp b/wmserver/src/input_window_monitor.cpp index 9dc6ff82a8..8a71df9d22 100644 --- a/wmserver/src/input_window_monitor.cpp +++ b/wmserver/src/input_window_monitor.cpp @@ -44,6 +44,7 @@ void InputWindowMonitor::UpdateInputWindow(uint32_t windowId) WLOGFE("can not get window node container."); return; } + UpdateDisplaysInfo(container); std::vector> windowNodes; container->TraverseContainer(windowNodes); @@ -64,11 +65,66 @@ void InputWindowMonitor::UpdateInputWindow(uint32_t windowId) MMI::InputManager::GetInstance()->UpdateDisplayInfo(physicalDisplays_, logicalDisplays_); } +void InputWindowMonitor::UpdateDisplaysInfo(const sptr& container) +{ + MMI::PhysicalDisplayInfo physicalDisplayInfo = { + .id = static_cast(container->GetScreenId()), + .leftDisplayId = INVALID_DISPLAY_ID, + .upDisplayId = INVALID_DISPLAY_ID, + .topLeftX = container->GetDisplayRect().posX_, + .topLeftY = container->GetDisplayRect().posY_, + .width = static_cast(container->GetDisplayRect().width_), + .height = static_cast(container->GetDisplayRect().height_), + .name = "physical_display0", + .seatId = "seat0", + .seatName = "default0", + .logicWidth = static_cast(container->GetDisplayRect().width_), + .logicHeight = static_cast(container->GetDisplayRect().height_), + .direction = MMI::Direction0 + }; + auto physicalDisplayIter = std::find_if(physicalDisplays_.begin(), physicalDisplays_.end(), + [&physicalDisplayInfo](MMI::PhysicalDisplayInfo& physicalDisplay) { + return physicalDisplay.id = physicalDisplayInfo.id; + }); + if (physicalDisplayIter != physicalDisplays_.end()) { + *physicalDisplayIter = physicalDisplayInfo; + } else { + physicalDisplays_.emplace_back(physicalDisplayInfo); + } + + MMI::LogicalDisplayInfo logicalDisplayInfo = { + .id = static_cast(container->GetScreenId()), + .topLeftX = container->GetDisplayRect().posX_, + .topLeftY = container->GetDisplayRect().posY_, + .width = static_cast(container->GetDisplayRect().width_), + .height = static_cast(container->GetDisplayRect().height_), + .name = "logical_display0", + .seatId = "seat0", + .seatName = "default0", + .focusWindowId = INVALID_WINDOW_ID, + .windowsInfo_ = {}, + }; + auto logicalDisplayIter = std::find_if(logicalDisplays_.begin(), logicalDisplays_.end(), + [&logicalDisplayInfo](MMI::LogicalDisplayInfo& logicalDisplay) { + return logicalDisplay.id = logicalDisplayInfo.id; + }); + if (logicalDisplayIter != logicalDisplays_.end()) { + *logicalDisplayIter = logicalDisplayInfo; + } else { + logicalDisplays_.emplace_back(logicalDisplayInfo); + } +} + void InputWindowMonitor::TraverseWindowNodes(const std::vector> &windowNodes, std::vector::iterator& iter) { iter->windowsInfo_.clear(); for (auto& windowNode: windowNodes) { + if (windowTypeSkipped_.find(windowNode->GetWindowProperty()->GetWindowType()) != windowTypeSkipped_.end()) { + WLOGFI("window has been skipped. [id: %{public}d, type: %{public}d]", windowNode->GetWindowId(), + windowNode->GetWindowProperty()->GetWindowType()); + continue; + } MMI::WindowInfo windowInfo = { .id = static_cast(windowNode->GetWindowId()), .pid = windowNode->GetCallingPid(), diff --git a/wmserver/src/window_node_container.cpp b/wmserver/src/window_node_container.cpp index f4ed70a0c0..564cb4a5a7 100644 --- a/wmserver/src/window_node_container.cpp +++ b/wmserver/src/window_node_container.cpp @@ -362,5 +362,15 @@ void WindowNodeContainer::TraverseWindowNode(sptr& node, std::vector windowNodes.emplace_back(*iter); } } + +uint64_t WindowNodeContainer::GetScreenId() const +{ + return screenId_; +} + +Rect WindowNodeContainer::GetDisplayRect() const +{ + return displayRect_; +} } } -- Gitee