From d4f59e3ddc92ef58b56611420101db86936b367d Mon Sep 17 00:00:00 2001 From: Furkan Sahin Date: Sat, 20 Sep 2025 17:50:13 -0400 Subject: [PATCH 1/2] input/text_input: Fix crash on im destroy Problem: Exiting input manager like fcitx5 causes sway to segfault Solution: add null check. --- sway/input/text_input.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sway/input/text_input.c b/sway/input/text_input.c index e496bff1..8063cd27 100644 --- a/sway/input/text_input.c +++ b/sway/input/text_input.c @@ -64,9 +64,13 @@ static void handle_im_commit(struct wl_listener *listener, void *data) { static void handle_im_keyboard_grab_destroy(struct wl_listener *listener, void *data) { struct sway_input_method_relay *relay = wl_container_of(listener, relay, input_method_keyboard_grab_destroy); - struct wlr_input_method_keyboard_grab_v2 *keyboard_grab = relay->input_method->keyboard_grab; - struct wlr_seat *wlr_seat = keyboard_grab->input_method->seat; wl_list_remove(&relay->input_method_keyboard_grab_destroy.link); + // input_method may already be torn down; seat is compositor-owned + struct wlr_input_method_keyboard_grab_v2 *keyboard_grab = + relay->input_method ? relay->input_method->keyboard_grab : NULL; + struct wlr_seat *wlr_seat = relay->seat ? relay->seat->wlr_seat : NULL; + if (!keyboard_grab || !wlr_seat) + return; if (keyboard_grab->keyboard) { // send modifier state to original client From 7640105256c817b869744e27c6ce92a00fb96bdc Mon Sep 17 00:00:00 2001 From: Furkan Sahin Date: Sat, 20 Sep 2025 18:17:28 -0400 Subject: [PATCH 2/2] input/text_input: send done on enable Problem: ime popup appears in top left corner of screen Solution: send_done when enabled fixes #8884 --- sway/input/text_input.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sway/input/text_input.c b/sway/input/text_input.c index 8063cd27..a04d2021 100644 --- a/sway/input/text_input.c +++ b/sway/input/text_input.c @@ -258,6 +258,7 @@ static void handle_text_input_enable(struct wl_listener *listener, void *data) { } wlr_input_method_v2_send_activate(text_input->relay->input_method); relay_send_im_state(text_input->relay, text_input->input); + wlr_text_input_v3_send_done(text_input->input); } static void handle_text_input_commit(struct wl_listener *listener,