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;