aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTuomas Yrjölä <mail@yrhki.fi>2022-01-17 19:47:42 +0200
committerSimon Ser <contact@emersion.fr>2022-01-31 11:23:36 +0100
commit69b430201cb19c666f102586b18f1dfbda7c44a3 (patch)
tree2cae09d689061602acc4d1d6bb22c87d6e2c8aa4
parent518e18a54b9fc07682b46f6bb3bb848ff8760a7f (diff)
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
-rw-r--r--include/sway/tree/view.h1
-rw-r--r--sway/desktop/xwayland.c17
2 files changed, 18 insertions, 0 deletions
diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h
index 789a67c0..9e34b0d1 100644
--- a/include/sway/tree/view.h
+++ b/include/sway/tree/view.h
@@ -169,6 +169,7 @@ struct sway_xwayland_unmanaged {
int lx, ly;
+ struct wl_listener request_activate;
struct wl_listener request_configure;
struct wl_listener request_fullscreen;
struct wl_listener commit;
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;
}