diff --git a/wmserver/include/input_window_monitor.h b/wmserver/include/input_window_monitor.h index ed446505805590d1edc8f2f1891476daa8c7a677..9ea20b1f80cc14521b73b36f9f5222de803db9fb 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 251683b665fea1a812bf9b756845b8193cf00ba6..7c8f77e83f68d3add4cc9088bd094f39664b430f 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 9dc6ff82a8cd355eebe41612d650631eec262bbd..8a71df9d2267f4c61bb92484ce604378c6c10405 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 f4ed70a0c0ba6898056e4fe2075e8e8081495be3..564cb4a5a766f5c1de106bf95b5f92919ce9d5f9 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_; +} } }