aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;
}