mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	xdg shell: add wlr_xdg_surface_for_each_popup_surface()
When rendering, it is necessary to iterate the subsurfaces as well, so add a function that makes this easy.
This commit is contained in:
		
							parent
							
								
									129e02b57d
								
							
						
					
					
						commit
						c5c5ab9724
					
				
					 2 changed files with 40 additions and 0 deletions
				
			
		| 
						 | 
					@ -392,6 +392,14 @@ void wlr_xdg_surface_get_geometry(struct wlr_xdg_surface *surface,
 | 
				
			||||||
void wlr_xdg_surface_for_each_surface(struct wlr_xdg_surface *surface,
 | 
					void wlr_xdg_surface_for_each_surface(struct wlr_xdg_surface *surface,
 | 
				
			||||||
		wlr_surface_iterator_func_t iterator, void *user_data);
 | 
							wlr_surface_iterator_func_t iterator, void *user_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Call `iterator` on each popup's surface and popup's subsurface in the
 | 
				
			||||||
 | 
					 * xdg-surface tree, with the surfaces's position relative to the root
 | 
				
			||||||
 | 
					 * xdg-surface. The function is called from root to leaves (in rendering order).
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void wlr_xdg_surface_for_each_popup_surface(struct wlr_xdg_surface *surface,
 | 
				
			||||||
 | 
							wlr_surface_iterator_func_t iterator, void *user_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Schedule a surface configuration. This should only be called by protocols
 | 
					 * Schedule a surface configuration. This should only be called by protocols
 | 
				
			||||||
 * extending the shell.
 | 
					 * extending the shell.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -662,11 +662,43 @@ static void xdg_surface_for_each_popup(struct wlr_xdg_surface *surface,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void xdg_surface_for_each_popup_surface(struct wlr_xdg_surface *surface,
 | 
				
			||||||
 | 
							int x, int y, wlr_surface_iterator_func_t iterator, void *user_data) {
 | 
				
			||||||
 | 
						struct wlr_xdg_popup *popup_state;
 | 
				
			||||||
 | 
						wl_list_for_each(popup_state, &surface->popups, link) {
 | 
				
			||||||
 | 
							struct wlr_xdg_surface *popup = popup_state->base;
 | 
				
			||||||
 | 
							if (!popup->configured) {
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							double popup_sx, popup_sy;
 | 
				
			||||||
 | 
							xdg_popup_get_position(popup_state, &popup_sx, &popup_sy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							struct xdg_surface_iterator_data data = {
 | 
				
			||||||
 | 
								.user_iterator = iterator,
 | 
				
			||||||
 | 
								.user_data = user_data,
 | 
				
			||||||
 | 
								.x = x + popup_sx, .y = y + popup_sy,
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							wlr_surface_for_each_surface(popup->surface, xdg_surface_iterator,
 | 
				
			||||||
 | 
								&data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							xdg_surface_for_each_popup_surface(popup,
 | 
				
			||||||
 | 
								x + popup_sx,
 | 
				
			||||||
 | 
								y + popup_sy,
 | 
				
			||||||
 | 
								iterator, user_data);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wlr_xdg_surface_for_each_surface(struct wlr_xdg_surface *surface,
 | 
					void wlr_xdg_surface_for_each_surface(struct wlr_xdg_surface *surface,
 | 
				
			||||||
		wlr_surface_iterator_func_t iterator, void *user_data) {
 | 
							wlr_surface_iterator_func_t iterator, void *user_data) {
 | 
				
			||||||
	xdg_surface_for_each_surface(surface, 0, 0, iterator, user_data);
 | 
						xdg_surface_for_each_surface(surface, 0, 0, iterator, user_data);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wlr_xdg_surface_for_each_popup_surface(struct wlr_xdg_surface *surface,
 | 
				
			||||||
 | 
							wlr_surface_iterator_func_t iterator, void *user_data) {
 | 
				
			||||||
 | 
						xdg_surface_for_each_popup_surface(surface, 0, 0, iterator, user_data);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wlr_xdg_surface_for_each_popup(struct wlr_xdg_surface *surface,
 | 
					void wlr_xdg_surface_for_each_popup(struct wlr_xdg_surface *surface,
 | 
				
			||||||
		wlr_surface_iterator_func_t iterator, void *user_data) {
 | 
							wlr_surface_iterator_func_t iterator, void *user_data) {
 | 
				
			||||||
	xdg_surface_for_each_popup(surface, 0, 0, iterator, user_data);
 | 
						xdg_surface_for_each_popup(surface, 0, 0, iterator, user_data);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue