From 5b2f010c03b3a7565f2b51a6f56a5ff8b306d512 Mon Sep 17 00:00:00 2001 From: Marius Vlad Date: Wed, 22 May 2024 12:51:18 +0300 Subject: [PATCH] kiosk-shell: Add session listener And use it to perform keyboard activation on the currently focused window. Fixes: #910 Signed-off-by: Marius Vlad --- kiosk-shell/kiosk-shell.c | 28 ++++++++++++++++++++++++++++ kiosk-shell/kiosk-shell.h | 1 + 2 files changed, 29 insertions(+) diff --git a/kiosk-shell/kiosk-shell.c b/kiosk-shell/kiosk-shell.c index f70e8a720..d02e96d05 100644 --- a/kiosk-shell/kiosk-shell.c +++ b/kiosk-shell/kiosk-shell.c @@ -1423,6 +1423,7 @@ kiosk_shell_destroy(struct wl_listener *listener, void *data) wl_list_remove(&shell->output_moved_listener.link); wl_list_remove(&shell->seat_created_listener.link); wl_list_remove(&shell->transform_listener.link); + wl_list_remove(&shell->session_listener.link); wl_list_for_each_safe(shoutput, tmp, &shell->output_list, link) { kiosk_shell_output_destroy(shoutput); @@ -1444,6 +1445,31 @@ kiosk_shell_destroy(struct wl_listener *listener, void *data) free(shell); } +static void +kiosk_shell_notify_session(struct wl_listener *listener, void *data) +{ + struct kiosk_shell *shell = + container_of(listener, struct kiosk_shell, session_listener); + struct kiosk_shell_seat *k_seat; + struct weston_compositor *compositor = data; + struct weston_seat *seat = get_kiosk_shell_first_seat(shell); + + + if (!compositor->session_active || !seat) + return; + + k_seat = get_kiosk_shell_seat(seat); + if (k_seat->focused_surface) { + struct kiosk_shell_surface *current_focus = + get_kiosk_shell_surface(k_seat->focused_surface); + + weston_view_activate_input(current_focus->view, + k_seat->seat, + WESTON_ACTIVATE_FLAG_NONE); + } + +} + WL_EXPORT int wet_shell_init(struct weston_compositor *ec, int *argc, char *argv[]) @@ -1509,6 +1535,8 @@ wet_shell_init(struct weston_compositor *ec, shell->output_moved_listener.notify = kiosk_shell_handle_output_moved; wl_signal_add(&ec->output_moved_signal, &shell->output_moved_listener); + shell->session_listener.notify = kiosk_shell_notify_session; + wl_signal_add(&ec->session_signal, &shell->session_listener); screenshooter_create(ec); kiosk_shell_add_bindings(shell); diff --git a/kiosk-shell/kiosk-shell.h b/kiosk-shell/kiosk-shell.h index b914147f6..ea4768549 100644 --- a/kiosk-shell/kiosk-shell.h +++ b/kiosk-shell/kiosk-shell.h @@ -48,6 +48,7 @@ struct kiosk_shell { const struct weston_xwayland_surface_api *xwayland_surface_api; struct weston_config *config; + struct wl_listener session_listener; }; struct kiosk_shell_surface {