From 57698c2689c6075b0acf5c5631638206be29fd08 Mon Sep 17 00:00:00 2001 From: Keyu Tao Date: Fri, 21 Feb 2025 17:44:13 +0800 Subject: [PATCH] wayland/text-input: Reset focus state when destroying text_input When closing some wayland apps using text-input-v3, text_input_destructor could remove resource in focus_resource_list without resetting focus. This could be an issue if, the focus is on a wayland app not using text- input-v3 after closing those. Text committing would fail, and the candidate window would always show on previous entry. This commit adds check in text_input_destructor, resetting focus if necessary. Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4776 Part-of: --- src/wayland/meta-wayland-text-input.c | 37 +++++++++++++++++---------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/wayland/meta-wayland-text-input.c b/src/wayland/meta-wayland-text-input.c index c4d2119f2..b70d8c8c1 100644 --- a/src/wayland/meta-wayland-text-input.c +++ b/src/wayland/meta-wayland-text-input.c @@ -378,6 +378,27 @@ move_resources_for_client (struct wl_list *destination, } } +static void +reset_text_input_focus (MetaWaylandTextInput *text_input) +{ + if (wl_list_empty (&text_input->focus_resource_list)) + { + ClutterInputFocus *focus = text_input->input_focus; + MetaBackend *backend = backend_from_text_input (text_input); + ClutterBackend *clutter_backend = + meta_backend_get_clutter_backend (backend); + ClutterInputMethod *input_method; + + if (clutter_input_focus_is_focused (focus)) + { + input_method = clutter_backend_get_input_method (clutter_backend); + clutter_input_focus_reset (focus); + meta_wayland_text_input_focus_flush_done (focus); + clutter_input_method_focus_out (input_method); + } + } +} + void meta_wayland_text_input_set_focus (MetaWaylandTextInput *text_input, MetaWaylandSurface *surface) @@ -391,21 +412,8 @@ meta_wayland_text_input_set_focus (MetaWaylandTextInput *text_input, { if (!wl_list_empty (&text_input->focus_resource_list)) { - ClutterInputFocus *focus = text_input->input_focus; - MetaBackend *backend = backend_from_text_input (text_input); - ClutterBackend *clutter_backend = - meta_backend_get_clutter_backend (backend); - ClutterInputMethod *input_method; struct wl_resource *resource; - if (clutter_input_focus_is_focused (focus)) - { - input_method = clutter_backend_get_input_method (clutter_backend); - clutter_input_focus_reset (focus); - meta_wayland_text_input_focus_flush_done (focus); - clutter_input_method_focus_out (input_method); - } - wl_resource_for_each (resource, &text_input->focus_resource_list) { zwp_text_input_v3_send_leave (resource, @@ -414,6 +422,8 @@ meta_wayland_text_input_set_focus (MetaWaylandTextInput *text_input, move_resources (&text_input->resource_list, &text_input->focus_resource_list); + + reset_text_input_focus (text_input); } wl_list_remove (&text_input->surface_listener.link); @@ -459,6 +469,7 @@ text_input_destructor (struct wl_resource *resource) g_hash_table_remove (text_input->resource_serials, resource); wl_list_remove (wl_resource_get_link (resource)); + reset_text_input_focus (text_input); } static void