aboutsummaryrefslogtreecommitdiffstats
path: root/sway/input/text_input.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/input/text_input.c')
-rw-r--r--sway/input/text_input.c53
1 files changed, 48 insertions, 5 deletions
diff --git a/sway/input/text_input.c b/sway/input/text_input.c
index f83726ee..b8c19c17 100644
--- a/sway/input/text_input.c
+++ b/sway/input/text_input.c
@@ -55,6 +55,37 @@ static void handle_im_commit(struct wl_listener *listener, void *data) {
55 wlr_text_input_v3_send_done(text_input->input); 55 wlr_text_input_v3_send_done(text_input->input);
56} 56}
57 57
58static void handle_im_keyboard_grab_destroy(struct wl_listener *listener, void *data) {
59 struct sway_input_method_relay *relay = wl_container_of(listener, relay,
60 input_method_keyboard_grab_destroy);
61 struct wlr_input_method_keyboard_grab_v2 *keyboard_grab = data;
62 wl_list_remove(&relay->input_method_keyboard_grab_destroy.link);
63
64 if (keyboard_grab->keyboard) {
65 // send modifier state to original client
66 wlr_seat_keyboard_notify_modifiers(keyboard_grab->input_method->seat,
67 &keyboard_grab->keyboard->modifiers);
68 }
69}
70
71static void handle_im_grab_keyboard(struct wl_listener *listener, void *data) {
72 struct sway_input_method_relay *relay = wl_container_of(listener, relay,
73 input_method_grab_keyboard);
74 struct wlr_input_method_keyboard_grab_v2 *keyboard_grab = data;
75
76 // send modifier state to grab
77 struct wlr_keyboard *active_keyboard = wlr_seat_get_keyboard(relay->seat->wlr_seat);
78 wlr_input_method_keyboard_grab_v2_set_keyboard(keyboard_grab,
79 active_keyboard);
80 wlr_input_method_keyboard_grab_v2_send_modifiers(keyboard_grab,
81 &active_keyboard->modifiers);
82
83 wl_signal_add(&keyboard_grab->events.destroy,
84 &relay->input_method_keyboard_grab_destroy);
85 relay->input_method_keyboard_grab_destroy.notify =
86 handle_im_keyboard_grab_destroy;
87}
88
58static void text_input_set_pending_focused_surface( 89static void text_input_set_pending_focused_surface(
59 struct sway_text_input *text_input, struct wlr_surface *surface) { 90 struct sway_text_input *text_input, struct wlr_surface *surface) {
60 wl_list_remove(&text_input->pending_focused_surface_destroy.link); 91 wl_list_remove(&text_input->pending_focused_surface_destroy.link);
@@ -92,13 +123,18 @@ static void relay_send_im_state(struct sway_input_method_relay *relay,
92 return; 123 return;
93 } 124 }
94 // TODO: only send each of those if they were modified 125 // TODO: only send each of those if they were modified
95 wlr_input_method_v2_send_surrounding_text(input_method, 126 if (input->active_features & WLR_TEXT_INPUT_V3_FEATURE_SURROUNDING_TEXT) {
96 input->current.surrounding.text, input->current.surrounding.cursor, 127 wlr_input_method_v2_send_surrounding_text(input_method,
97 input->current.surrounding.anchor); 128 input->current.surrounding.text, input->current.surrounding.cursor,
129 input->current.surrounding.anchor);
130 }
98 wlr_input_method_v2_send_text_change_cause(input_method, 131 wlr_input_method_v2_send_text_change_cause(input_method,
99 input->current.text_change_cause); 132 input->current.text_change_cause);
100 wlr_input_method_v2_send_content_type(input_method, 133 if (input->active_features & WLR_TEXT_INPUT_V3_FEATURE_CONTENT_TYPE) {
101 input->current.content_type.hint, input->current.content_type.purpose); 134 wlr_input_method_v2_send_content_type(input_method,
135 input->current.content_type.hint,
136 input->current.content_type.purpose);
137 }
102 wlr_input_method_v2_send_done(input_method); 138 wlr_input_method_v2_send_done(input_method);
103 // TODO: pass intent, display popup size 139 // TODO: pass intent, display popup size
104} 140}
@@ -144,6 +180,10 @@ static void handle_text_input_disable(struct wl_listener *listener,
144 void *data) { 180 void *data) {
145 struct sway_text_input *text_input = wl_container_of(listener, text_input, 181 struct sway_text_input *text_input = wl_container_of(listener, text_input,
146 text_input_disable); 182 text_input_disable);
183 if (text_input->input->focused_surface == NULL) {
184 sway_log(SWAY_DEBUG, "Disabling text input, but no longer focused");
185 return;
186 }
147 relay_disable_text_input(text_input->relay, text_input); 187 relay_disable_text_input(text_input->relay, text_input);
148} 188}
149 189
@@ -236,6 +276,9 @@ static void relay_handle_input_method(struct wl_listener *listener,
236 wl_signal_add(&relay->input_method->events.commit, 276 wl_signal_add(&relay->input_method->events.commit,
237 &relay->input_method_commit); 277 &relay->input_method_commit);
238 relay->input_method_commit.notify = handle_im_commit; 278 relay->input_method_commit.notify = handle_im_commit;
279 wl_signal_add(&relay->input_method->events.grab_keyboard,
280 &relay->input_method_grab_keyboard);
281 relay->input_method_grab_keyboard.notify = handle_im_grab_keyboard;
239 wl_signal_add(&relay->input_method->events.destroy, 282 wl_signal_add(&relay->input_method->events.destroy,
240 &relay->input_method_destroy); 283 &relay->input_method_destroy);
241 relay->input_method_destroy.notify = handle_im_destroy; 284 relay->input_method_destroy.notify = handle_im_destroy;