aboutsummaryrefslogtreecommitdiff
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.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/sway/input/text_input.c b/sway/input/text_input.c
index 2a8f6222..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) {
wlr_text_input_v3_send_done(text_input->input);
}
+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 = data;
+ wl_list_remove(&relay->input_method_keyboard_grab_destroy.link);
+
+ if (keyboard_grab->keyboard) {
+ // send modifier state to original client
+ wlr_seat_keyboard_notify_modifiers(keyboard_grab->input_method->seat,
+ &keyboard_grab->keyboard->modifiers);
+ }
+}
+
+static void handle_im_grab_keyboard(struct wl_listener *listener, void *data) {
+ struct sway_input_method_relay *relay = wl_container_of(listener, relay,
+ input_method_grab_keyboard);
+ struct wlr_input_method_keyboard_grab_v2 *keyboard_grab = data;
+
+ // send modifier state to grab
+ struct wlr_keyboard *active_keyboard = wlr_seat_get_keyboard(relay->seat->wlr_seat);
+ wlr_input_method_keyboard_grab_v2_set_keyboard(keyboard_grab,
+ active_keyboard);
+ wlr_input_method_keyboard_grab_v2_send_modifiers(keyboard_grab,
+ &active_keyboard->modifiers);
+
+ wl_signal_add(&keyboard_grab->events.destroy,
+ &relay->input_method_keyboard_grab_destroy);
+ relay->input_method_keyboard_grab_destroy.notify =
+ handle_im_keyboard_grab_destroy;
+}
+
static void text_input_set_pending_focused_surface(
struct sway_text_input *text_input, struct wlr_surface *surface) {
wl_list_remove(&text_input->pending_focused_surface_destroy.link);
@@ -245,6 +276,9 @@ static void relay_handle_input_method(struct wl_listener *listener,
wl_signal_add(&relay->input_method->events.commit,
&relay->input_method_commit);
relay->input_method_commit.notify = handle_im_commit;
+ wl_signal_add(&relay->input_method->events.grab_keyboard,
+ &relay->input_method_grab_keyboard);
+ relay->input_method_grab_keyboard.notify = handle_im_grab_keyboard;
wl_signal_add(&relay->input_method->events.destroy,
&relay->input_method_destroy);
relay->input_method_destroy.notify = handle_im_destroy;