mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	xdg_popup_grab: add listener on seat destroy
This commit is contained in:
		
							parent
							
								
									ff2e08aa74
								
							
						
					
					
						commit
						de955a0f63
					
				
					 4 changed files with 44 additions and 0 deletions
				
			
		| 
						 | 
					@ -53,6 +53,7 @@ struct wlr_xdg_popup_grab {
 | 
				
			||||||
	struct wlr_seat *seat;
 | 
						struct wlr_seat *seat;
 | 
				
			||||||
	struct wl_list popups;
 | 
						struct wl_list popups;
 | 
				
			||||||
	struct wl_list link; // wlr_xdg_shell::popup_grabs
 | 
						struct wl_list link; // wlr_xdg_shell::popup_grabs
 | 
				
			||||||
 | 
						struct wl_listener seat_destroy;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum wlr_xdg_surface_role {
 | 
					enum wlr_xdg_surface_role {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,6 +53,7 @@ struct wlr_xdg_popup_grab_v6 {
 | 
				
			||||||
	struct wlr_seat *seat;
 | 
						struct wlr_seat *seat;
 | 
				
			||||||
	struct wl_list popups;
 | 
						struct wl_list popups;
 | 
				
			||||||
	struct wl_list link; // wlr_xdg_shell_v6::popup_grabs
 | 
						struct wl_list link; // wlr_xdg_shell_v6::popup_grabs
 | 
				
			||||||
 | 
						struct wl_listener seat_destroy;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum wlr_xdg_surface_v6_role {
 | 
					enum wlr_xdg_surface_v6_role {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -131,6 +131,24 @@ static const struct wlr_keyboard_grab_interface xdg_keyboard_grab_impl = {
 | 
				
			||||||
	.cancel = xdg_keyboard_grab_cancel,
 | 
						.cancel = xdg_keyboard_grab_cancel,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void xdg_surface_destroy(struct wlr_xdg_surface *surface);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void wlr_xdg_popup_grab_handle_seat_destroy(
 | 
				
			||||||
 | 
							struct wl_listener *listener, void *data) {
 | 
				
			||||||
 | 
						struct wlr_xdg_popup_grab *xdg_grab =
 | 
				
			||||||
 | 
							wl_container_of(listener, xdg_grab, seat_destroy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wl_list_remove(&xdg_grab->seat_destroy.link);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct wlr_xdg_popup *popup, *next;
 | 
				
			||||||
 | 
						wl_list_for_each_safe(popup, next, &xdg_grab->popups, grab_link) {
 | 
				
			||||||
 | 
							xdg_surface_destroy(popup->base);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wl_list_remove(&xdg_grab->link);
 | 
				
			||||||
 | 
						free(xdg_grab);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct wlr_xdg_popup_grab *xdg_shell_popup_grab_from_seat(
 | 
					static struct wlr_xdg_popup_grab *xdg_shell_popup_grab_from_seat(
 | 
				
			||||||
		struct wlr_xdg_shell *shell, struct wlr_seat *seat) {
 | 
							struct wlr_xdg_shell *shell, struct wlr_seat *seat) {
 | 
				
			||||||
	struct wlr_xdg_popup_grab *xdg_grab;
 | 
						struct wlr_xdg_popup_grab *xdg_grab;
 | 
				
			||||||
| 
						 | 
					@ -155,6 +173,9 @@ static struct wlr_xdg_popup_grab *xdg_shell_popup_grab_from_seat(
 | 
				
			||||||
	wl_list_insert(&shell->popup_grabs, &xdg_grab->link);
 | 
						wl_list_insert(&shell->popup_grabs, &xdg_grab->link);
 | 
				
			||||||
	xdg_grab->seat = seat;
 | 
						xdg_grab->seat = seat;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xdg_grab->seat_destroy.notify = wlr_xdg_popup_grab_handle_seat_destroy;
 | 
				
			||||||
 | 
						wl_signal_add(&seat->events.destroy, &xdg_grab->seat_destroy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return xdg_grab;
 | 
						return xdg_grab;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -131,6 +131,24 @@ static const struct wlr_keyboard_grab_interface xdg_keyboard_grab_impl = {
 | 
				
			||||||
	.cancel = xdg_keyboard_grab_cancel,
 | 
						.cancel = xdg_keyboard_grab_cancel,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void xdg_surface_destroy(struct wlr_xdg_surface_v6 *surface);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void wlr_xdg_popup_grab_handle_seat_destroy(
 | 
				
			||||||
 | 
							struct wl_listener *listener, void *data) {
 | 
				
			||||||
 | 
						struct wlr_xdg_popup_grab_v6 *xdg_grab =
 | 
				
			||||||
 | 
							wl_container_of(listener, xdg_grab, seat_destroy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wl_list_remove(&xdg_grab->seat_destroy.link);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct wlr_xdg_popup_v6 *popup, *next;
 | 
				
			||||||
 | 
						wl_list_for_each_safe(popup, next, &xdg_grab->popups, grab_link) {
 | 
				
			||||||
 | 
							xdg_surface_destroy(popup->base);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wl_list_remove(&xdg_grab->link);
 | 
				
			||||||
 | 
						free(xdg_grab);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct wlr_xdg_popup_grab_v6 *xdg_shell_popup_grab_from_seat(
 | 
					static struct wlr_xdg_popup_grab_v6 *xdg_shell_popup_grab_from_seat(
 | 
				
			||||||
		struct wlr_xdg_shell_v6 *shell, struct wlr_seat *seat) {
 | 
							struct wlr_xdg_shell_v6 *shell, struct wlr_seat *seat) {
 | 
				
			||||||
	struct wlr_xdg_popup_grab_v6 *xdg_grab;
 | 
						struct wlr_xdg_popup_grab_v6 *xdg_grab;
 | 
				
			||||||
| 
						 | 
					@ -155,6 +173,9 @@ static struct wlr_xdg_popup_grab_v6 *xdg_shell_popup_grab_from_seat(
 | 
				
			||||||
	wl_list_insert(&shell->popup_grabs, &xdg_grab->link);
 | 
						wl_list_insert(&shell->popup_grabs, &xdg_grab->link);
 | 
				
			||||||
	xdg_grab->seat = seat;
 | 
						xdg_grab->seat = seat;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xdg_grab->seat_destroy.notify = wlr_xdg_popup_grab_handle_seat_destroy;
 | 
				
			||||||
 | 
						wl_signal_add(&seat->events.destroy, &xdg_grab->seat_destroy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return xdg_grab;
 | 
						return xdg_grab;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue