aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rootston/text_input.c4
-rw-r--r--types/wlr_text_input_v3.c13
-rw-r--r--xwayland/xwm.c6
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);
}