layer-shell: add for_each_popup

This brings the layer-shell api in line with that of xdg-shell and
avoids reimplementing this function in every compositor in order to
render layer shell popups correctly.
This commit is contained in:
Isaac Freund 2020-09-08 18:03:33 +02:00 committed by Simon Ser
parent bae8d7593c
commit 8ad2cc39eb
2 changed files with 11 additions and 8 deletions

View file

@ -138,6 +138,10 @@ struct wlr_layer_surface_v1 *wlr_layer_surface_v1_from_wlr_surface(
void wlr_layer_surface_v1_for_each_surface(struct wlr_layer_surface_v1 *surface, void wlr_layer_surface_v1_for_each_surface(struct wlr_layer_surface_v1 *surface,
wlr_surface_iterator_func_t iterator, void *user_data); wlr_surface_iterator_func_t iterator, void *user_data);
/* Calls the iterator function for each popup of this surface */
void wlr_layer_surface_v1_for_each_popup(struct wlr_layer_surface_v1 *surface,
wlr_surface_iterator_func_t iterator, void *user_data);
/** /**
* Find a surface within this layer-surface tree at the given surface-local * Find a surface within this layer-surface tree at the given surface-local
* coordinates. Returns the surface and coordinates in the leaf surface * coordinates. Returns the surface and coordinates in the leaf surface

View file

@ -534,16 +534,20 @@ static void xdg_surface_for_each_surface(struct wlr_xdg_surface *surface,
} }
} }
static void layer_surface_for_each_surface(struct wlr_layer_surface_v1 *surface, void wlr_layer_surface_v1_for_each_surface(struct wlr_layer_surface_v1 *surface,
int x, int y, wlr_surface_iterator_func_t iterator, void *user_data) { wlr_surface_iterator_func_t iterator, void *user_data) {
struct layer_surface_iterator_data data = { struct layer_surface_iterator_data data = {
.user_iterator = iterator, .user_iterator = iterator,
.user_data = user_data, .user_data = user_data,
.x = x, .y = y, .x = 0, .y = 0,
}; };
wlr_surface_for_each_surface(surface->surface, wlr_surface_for_each_surface(surface->surface,
layer_surface_iterator, &data); layer_surface_iterator, &data);
wlr_layer_surface_v1_for_each_popup(surface, iterator, user_data);
}
void wlr_layer_surface_v1_for_each_popup(struct wlr_layer_surface_v1 *surface,
wlr_surface_iterator_func_t iterator, void *user_data){
struct wlr_xdg_popup *popup_state; struct wlr_xdg_popup *popup_state;
wl_list_for_each(popup_state, &surface->popups, link) { wl_list_for_each(popup_state, &surface->popups, link) {
struct wlr_xdg_surface *popup = popup_state->base; struct wlr_xdg_surface *popup = popup_state->base;
@ -560,11 +564,6 @@ static void layer_surface_for_each_surface(struct wlr_layer_surface_v1 *surface,
} }
} }
void wlr_layer_surface_v1_for_each_surface(struct wlr_layer_surface_v1 *surface,
wlr_surface_iterator_func_t iterator, void *user_data) {
layer_surface_for_each_surface(surface, 0, 0, iterator, user_data);
}
struct wlr_surface *wlr_layer_surface_v1_surface_at( struct wlr_surface *wlr_layer_surface_v1_surface_at(
struct wlr_layer_surface_v1 *surface, double sx, double sy, struct wlr_layer_surface_v1 *surface, double sx, double sy,
double *sub_x, double *sub_y) { double *sub_x, double *sub_y) {