From 6a7d78bb544888d2feb6a4499d5f5063b884da88 Mon Sep 17 00:00:00 2001 From: Johan Malm Date: Thu, 12 Feb 2026 21:21:53 +0000 Subject: [PATCH] Add `grab` to `wlr_xdg_popup.events` ...so that compositors can give keyboard focus to unfocused layer-shell clients on popup grab. A use case is to give xfce4-panel and lxqt-panel keyboard focus when their respective menus are opened via IPC mechanisms (xfce4-panel-applicationmenu and lxqt-qdbus-openmenu respectively). --- include/wlr/types/wlr_xdg_shell.h | 1 + types/xdg_shell/wlr_xdg_popup.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/include/wlr/types/wlr_xdg_shell.h b/include/wlr/types/wlr_xdg_shell.h index 517d77442..916695624 100644 --- a/include/wlr/types/wlr_xdg_shell.h +++ b/include/wlr/types/wlr_xdg_shell.h @@ -108,6 +108,7 @@ struct wlr_xdg_popup { struct wl_signal destroy; struct wl_signal reposition; + struct wl_signal grab; } events; struct wl_list grab_link; // wlr_xdg_popup_grab.popups diff --git a/types/xdg_shell/wlr_xdg_popup.c b/types/xdg_shell/wlr_xdg_popup.c index 0c3b9fe44..046606859 100644 --- a/types/xdg_shell/wlr_xdg_popup.c +++ b/types/xdg_shell/wlr_xdg_popup.c @@ -312,6 +312,8 @@ static void xdg_popup_handle_grab(struct wl_client *client, &popup_grab->keyboard_grab); wlr_seat_touch_start_grab(seat_client->seat, &popup_grab->touch_grab); + + wl_signal_emit_mutable(&popup->events.grab, NULL); } static void xdg_popup_handle_reposition( @@ -416,6 +418,7 @@ void create_xdg_popup(struct wlr_xdg_surface *surface, struct wlr_xdg_surface *p wl_signal_init(&surface->popup->events.destroy); wl_signal_init(&surface->popup->events.reposition); + wl_signal_init(&surface->popup->events.grab); if (parent) { surface->popup->parent = parent->surface; @@ -475,6 +478,7 @@ void destroy_xdg_popup(struct wlr_xdg_popup *popup) { assert(wl_list_empty(&popup->events.destroy.listener_list)); assert(wl_list_empty(&popup->events.reposition.listener_list)); + assert(wl_list_empty(&popup->events.grab.listener_list)); wlr_surface_synced_finish(&popup->synced); popup->base->popup = NULL;