diff options
-rw-r--r-- | rootston/text_input.c | 4 | ||||
-rw-r--r-- | types/wlr_text_input_v3.c | 13 | ||||
-rw-r--r-- | xwayland/xwm.c | 6 |
3 files changed, 19 insertions, 4 deletions
diff --git a/rootston/text_input.c b/rootston/text_input.c index 84dd253e..cca64353 100644 --- a/rootston/text_input.c +++ b/rootston/text_input.c @@ -65,6 +65,7 @@ static void text_input_set_pending_focused_surface( static void text_input_clear_pending_focused_surface( struct roots_text_input *text_input) { wl_list_remove(&text_input->pending_focused_surface_destroy.link); + wl_list_init(&text_input->pending_focused_surface_destroy.link); text_input->pending_focused_surface = NULL; } @@ -179,7 +180,7 @@ static void handle_text_input_destroy(struct wl_listener *listener, if (text_input->input->current_enabled) { relay_disable_text_input(relay, text_input); } - + text_input_clear_pending_focused_surface(text_input); wl_list_remove(&text_input->link); text_input->input = NULL; free(text_input); @@ -218,6 +219,7 @@ struct roots_text_input *roots_text_input_create( input->pending_focused_surface_destroy.notify = handle_pending_focused_surface_destroy; + wl_list_init(&input->pending_focused_surface_destroy.link); return input; } diff --git a/types/wlr_text_input_v3.c b/types/wlr_text_input_v3.c index eb46d207..52c0fcc9 100644 --- a/types/wlr_text_input_v3.c +++ b/types/wlr_text_input_v3.c @@ -9,6 +9,12 @@ #include "text-input-unstable-v3-protocol.h" #include "util/signal.h" +static void text_input_clear_focused_surface(struct wlr_text_input_v3 *text_input) { + wl_list_remove(&text_input->surface_destroy.link); + wl_list_init(&text_input->surface_destroy.link); + text_input->focused_surface = NULL; +} + static const struct zwp_text_input_v3_interface text_input_impl; static struct wlr_text_input_v3 *text_input_from_resource( @@ -32,8 +38,7 @@ void wlr_text_input_v3_send_enter(struct wlr_text_input_v3 *text_input, void wlr_text_input_v3_send_leave(struct wlr_text_input_v3 *text_input) { zwp_text_input_v3_send_leave(text_input->resource, text_input->focused_surface->resource); - wl_list_remove(&text_input->surface_destroy.link); - text_input->focused_surface = NULL; + text_input_clear_focused_surface(text_input); } void wlr_text_input_v3_send_preedit_string(struct wlr_text_input_v3 *text_input, @@ -61,6 +66,7 @@ void wlr_text_input_v3_send_done(struct wlr_text_input_v3 *text_input) { static void wlr_text_input_destroy(struct wlr_text_input_v3 *text_input) { wlr_signal_emit_safe(&text_input->events.destroy, text_input); + text_input_clear_focused_surface(text_input); wl_list_remove(&text_input->seat_destroy.link); // remove from manager::text_inputs wl_list_remove(&text_input->link); @@ -221,7 +227,7 @@ static void text_input_handle_focused_surface_destroy( struct wl_listener *listener, void *data) { struct wlr_text_input_v3 *text_input = wl_container_of(listener, text_input, surface_destroy); - text_input->focused_surface = NULL; + text_input_clear_focused_surface(text_input); } static void text_input_manager_get_text_input(struct wl_client *client, @@ -260,6 +266,7 @@ static void text_input_manager_get_text_input(struct wl_client *client, text_input_handle_seat_destroy; text_input->surface_destroy.notify = text_input_handle_focused_surface_destroy; + wl_list_init(&text_input->surface_destroy.link); struct wlr_text_input_manager_v3 *manager = text_input_manager_from_resource(resource); diff --git a/xwayland/xwm.c b/xwayland/xwm.c index 1fb6f331..fce61f6b 100644 --- a/xwayland/xwm.c +++ b/xwayland/xwm.c @@ -522,6 +522,12 @@ static void read_surface_hints(struct wlr_xwm *xwm, memcpy(xsurface->hints, &hints, sizeof(struct wlr_xwayland_surface_hints)); xsurface->hints_urgency = xcb_icccm_wm_hints_get_urgency(&hints); + if (!(xsurface->hints->flags & XCB_ICCCM_WM_HINT_INPUT)) { + // The client didn't specify whether it wants input. + // Assume it does. + xsurface->hints->input = true; + } + wlr_log(WLR_DEBUG, "WM_HINTS (%d)", reply->value_len); wlr_signal_emit_safe(&xsurface->events.set_hints, xsurface); } |