From d45b896673a4c73ffc6507f0d2a40c369ca3d8ad Mon Sep 17 00:00:00 2001 From: bruvzg <7645683+bruvzg@users.noreply.github.com> Date: Tue, 4 Jun 2024 00:03:02 +0300 Subject: [PATCH] Fix IME activation in subviewports. --- scene/gui/line_edit.cpp | 21 ++++++++++++--------- scene/gui/text_edit.cpp | 14 ++++++++------ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index aa41e46f829..2d978fe54ab 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -1088,13 +1088,14 @@ void LineEdit::_notification(int p_what) { } if (has_focus()) { - if (get_viewport()->get_window_id() != DisplayServer::INVALID_WINDOW_ID && DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_IME)) { - DisplayServer::get_singleton()->window_set_ime_active(true, get_viewport()->get_window_id()); + DisplayServer::WindowID wid = get_window() ? get_window()->get_window_id() : DisplayServer::INVALID_WINDOW_ID; + if (wid != DisplayServer::INVALID_WINDOW_ID && DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_IME)) { + DisplayServer::get_singleton()->window_set_ime_active(true, wid); Point2 pos = Point2(get_caret_pixel_pos().x, (get_size().y + theme_cache.font->get_height(theme_cache.font_size)) / 2) + get_global_position(); if (get_window()->get_embedder()) { pos += get_viewport()->get_popup_base_transform().get_origin(); } - DisplayServer::get_singleton()->window_set_ime_position(pos, get_viewport()->get_window_id()); + DisplayServer::get_singleton()->window_set_ime_position(pos, wid); } } } break; @@ -1111,13 +1112,14 @@ void LineEdit::_notification(int p_what) { } } - if (get_viewport()->get_window_id() != DisplayServer::INVALID_WINDOW_ID && DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_IME)) { - DisplayServer::get_singleton()->window_set_ime_active(true, get_viewport()->get_window_id()); + DisplayServer::WindowID wid = get_window() ? get_window()->get_window_id() : DisplayServer::INVALID_WINDOW_ID; + if (wid != DisplayServer::INVALID_WINDOW_ID && DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_IME)) { + DisplayServer::get_singleton()->window_set_ime_active(true, wid); Point2 pos = Point2(get_caret_pixel_pos().x, (get_size().y + theme_cache.font->get_height(theme_cache.font_size)) / 2) + get_global_position(); if (get_window()->get_embedder()) { pos += get_viewport()->get_popup_base_transform().get_origin(); } - DisplayServer::get_singleton()->window_set_ime_position(pos, get_viewport()->get_window_id()); + DisplayServer::get_singleton()->window_set_ime_position(pos, wid); } show_virtual_keyboard(); @@ -1126,9 +1128,10 @@ void LineEdit::_notification(int p_what) { case NOTIFICATION_FOCUS_EXIT: { _validate_caret_can_draw(); - if (get_viewport()->get_window_id() != DisplayServer::INVALID_WINDOW_ID && DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_IME)) { - DisplayServer::get_singleton()->window_set_ime_position(Point2(), get_viewport()->get_window_id()); - DisplayServer::get_singleton()->window_set_ime_active(false, get_viewport()->get_window_id()); + DisplayServer::WindowID wid = get_window() ? get_window()->get_window_id() : DisplayServer::INVALID_WINDOW_ID; + if (wid != DisplayServer::INVALID_WINDOW_ID && DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_IME)) { + DisplayServer::get_singleton()->window_set_ime_position(Point2(), wid); + DisplayServer::get_singleton()->window_set_ime_active(false, wid); } ime_text = ""; ime_selection = Point2(); diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index a9dc4c765c0..a46d77c61e8 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -2831,24 +2831,26 @@ void TextEdit::_update_caches() { } void TextEdit::_close_ime_window() { - if (get_viewport()->get_window_id() == DisplayServer::INVALID_WINDOW_ID || !DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_IME)) { + DisplayServer::WindowID wid = get_window() ? get_window()->get_window_id() : DisplayServer::INVALID_WINDOW_ID; + if (wid == DisplayServer::INVALID_WINDOW_ID || !DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_IME)) { return; } - DisplayServer::get_singleton()->window_set_ime_position(Point2(), get_viewport()->get_window_id()); - DisplayServer::get_singleton()->window_set_ime_active(false, get_viewport()->get_window_id()); + DisplayServer::get_singleton()->window_set_ime_position(Point2(), wid); + DisplayServer::get_singleton()->window_set_ime_active(false, wid); } void TextEdit::_update_ime_window_position() { - if (get_viewport()->get_window_id() == DisplayServer::INVALID_WINDOW_ID || !DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_IME)) { + DisplayServer::WindowID wid = get_window() ? get_window()->get_window_id() : DisplayServer::INVALID_WINDOW_ID; + if (wid == DisplayServer::INVALID_WINDOW_ID || !DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_IME)) { return; } - DisplayServer::get_singleton()->window_set_ime_active(true, get_viewport()->get_window_id()); + DisplayServer::get_singleton()->window_set_ime_active(true, wid); Point2 pos = get_global_position() + get_caret_draw_pos(); if (get_window()->get_embedder()) { pos += get_viewport()->get_popup_base_transform().get_origin(); } // The window will move to the updated position the next time the IME is updated, not immediately. - DisplayServer::get_singleton()->window_set_ime_position(pos, get_viewport()->get_window_id()); + DisplayServer::get_singleton()->window_set_ime_position(pos, wid); } void TextEdit::_update_ime_text() {