mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2024-11-22 07:02:28 +00:00
layer shell: add wlr_layer_surface_v1_popup_surface_at()
This function will allow compositors to implement input handling in a way consistent with rendering more easily. Calling wlr_layer_surface_v1_surface_at() and checking if the result is a wlr_xdg_popup is flawed as there may be subsurfaces in the popup tree.
This commit is contained in:
parent
8f63557ed7
commit
4ee4a36c0c
@ -151,4 +151,13 @@ struct wlr_surface *wlr_layer_surface_v1_surface_at(
|
||||
struct wlr_layer_surface_v1 *surface, double sx, double sy,
|
||||
double *sub_x, double *sub_y);
|
||||
|
||||
/**
|
||||
* Find a surface within this layer-surface's popup tree at the given
|
||||
* surface-local coordinates. Returns the surface and coordinates in the leaf
|
||||
* surface coordinate system or NULL if no surface is found at that location.
|
||||
*/
|
||||
struct wlr_surface *wlr_layer_surface_v1_popup_surface_at(
|
||||
struct wlr_layer_surface_v1 *surface, double sx, double sy,
|
||||
double *sub_x, double *sub_y);
|
||||
|
||||
#endif
|
||||
|
@ -590,6 +590,17 @@ void wlr_layer_surface_v1_for_each_popup(struct wlr_layer_surface_v1 *surface,
|
||||
struct wlr_surface *wlr_layer_surface_v1_surface_at(
|
||||
struct wlr_layer_surface_v1 *surface, double sx, double sy,
|
||||
double *sub_x, double *sub_y) {
|
||||
struct wlr_surface *sub = wlr_layer_surface_v1_popup_surface_at(surface,
|
||||
sx, sy, sub_x, sub_y);
|
||||
if (sub != NULL) {
|
||||
return sub;
|
||||
}
|
||||
return wlr_surface_surface_at(surface->surface, sx, sy, sub_x, sub_y);
|
||||
}
|
||||
|
||||
struct wlr_surface *wlr_layer_surface_v1_popup_surface_at(
|
||||
struct wlr_layer_surface_v1 *surface, double sx, double sy,
|
||||
double *sub_x, double *sub_y) {
|
||||
struct wlr_xdg_popup *popup_state;
|
||||
wl_list_for_each(popup_state, &surface->popups, link) {
|
||||
struct wlr_xdg_surface *popup = popup_state->base;
|
||||
@ -606,5 +617,5 @@ struct wlr_surface *wlr_layer_surface_v1_surface_at(
|
||||
}
|
||||
}
|
||||
|
||||
return wlr_surface_surface_at(surface->surface, sx, sy, sub_x, sub_y);
|
||||
return NULL;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user