diff --git a/wmserver/include/window_node_container.h b/wmserver/include/window_node_container.h index b6a335ac51e9cd0bbdacaade902d68c67e543fc9..a209de1b7f68be9882ae563a84097f04df2e54bb 100644 --- a/wmserver/include/window_node_container.h +++ b/wmserver/include/window_node_container.h @@ -129,6 +129,8 @@ private: }; std::unordered_map pairedWindowMap_; sptr displayRects_ = new DisplayRects(); + void RaiseInputMethodWindowPriorityIfNeeded(const sptr& node) const; + const int32_t WINDOW_TYPE_RAISED_INPUT_METHOD = 113; }; } } diff --git a/wmserver/src/window_node_container.cpp b/wmserver/src/window_node_container.cpp index fb771bc9967731ea7a5f8e88de38ad3e7880ed75..14ed4b7b124cc48260845d19705fca67c9b0ea4f 100644 --- a/wmserver/src/window_node_container.cpp +++ b/wmserver/src/window_node_container.cpp @@ -155,6 +155,7 @@ void WindowNodeContainer::UpdateWindowTree(sptr& node) { WM_FUNCTION_TRACE(); node->priority_ = zorderPolicy_->GetWindowPriority(node->GetWindowType()); + RaiseInputMethodWindowPriorityIfNeeded(node); auto parentNode = node->parent_; auto position = parentNode->children_.end(); for (auto iter = parentNode->children_.begin(); iter < parentNode->children_.end(); ++iter) { @@ -746,5 +747,20 @@ WMError WindowNodeContainer::UpdateWindowPairInfo(sptr& triggerNode, SingletonContainer::Get().SendMessage(INNER_WM_CREATE_DIVIDER, screenId_, dividerRect); return WMError::WM_OK; } + +void WindowNodeContainer::RaiseInputMethodWindowPriorityIfNeeded(const sptr& node) const +{ + if (node->GetWindowType() != WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT) { + return; + } + auto iter = std::find_if(aboveAppWindowNode_->children_.begin(), aboveAppWindowNode_->children_.end(), + [](sptr node) { + return node->GetWindowType() == WindowType::WINDOW_TYPE_KEYGUARD; + }); + if (iter != aboveAppWindowNode_->children_.end()) { + WLOGFI("raise input method float window priority."); + node->priority_ = WINDOW_TYPE_RAISED_INPUT_METHOD; + } } } +} \ No newline at end of file