From 69b430201cb19c666f102586b18f1dfbda7c44a3 Mon Sep 17 00:00:00 2001 From: Tuomas Yrjölä Date: Mon, 17 Jan 2022 19:47:42 +0200 Subject: xwayland: listen to `request_activate` event When REAPER submenu is closed `XCB_CLIENT_MESSAGE` with type `NET_ACTIVE_WINDOW` is sent to set focus to parent menu. Closes: https://github.com/swaywm/sway/issues/6324 --- sway/desktop/xwayland.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'sway/desktop/xwayland.c') diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index 40288f97..2f11b5fc 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c @@ -121,6 +121,20 @@ static void unmanaged_handle_unmap(struct wl_listener *listener, void *data) { } } +static void unmanaged_handle_request_activate(struct wl_listener *listener, void *data) { + struct wlr_xwayland_surface *xsurface = data; + if (!xsurface->mapped) { + return; + } + struct sway_seat *seat = input_manager_current_seat(); + struct sway_container *focus = seat_get_focused_container(seat); + if (focus && focus->view && focus->view->pid != xsurface->pid) { + return; + } + + seat_set_focus_surface(seat, xsurface->surface, false); +} + static void unmanaged_handle_destroy(struct wl_listener *listener, void *data) { struct sway_xwayland_unmanaged *surface = wl_container_of(listener, surface, destroy); @@ -129,6 +143,7 @@ static void unmanaged_handle_destroy(struct wl_listener *listener, void *data) { wl_list_remove(&surface->unmap.link); wl_list_remove(&surface->destroy.link); wl_list_remove(&surface->override_redirect.link); + wl_list_remove(&surface->request_activate.link); free(surface); } @@ -176,6 +191,8 @@ static struct sway_xwayland_unmanaged *create_unmanaged( surface->destroy.notify = unmanaged_handle_destroy; wl_signal_add(&xsurface->events.set_override_redirect, &surface->override_redirect); surface->override_redirect.notify = unmanaged_handle_override_redirect; + wl_signal_add(&xsurface->events.request_activate, &surface->request_activate); + surface->request_activate.notify = unmanaged_handle_request_activate; return surface; } -- cgit v1.2.3-54-g00ecf