xdg shell: add wlr_xdg_surface_popup_surface_at()
This function will allow compositors to implement input handling in a way consistent with rendering more easily. Calling wlr_xdg_surface_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
c5c5ab9724
commit
8f63557ed7
|
@ -369,6 +369,15 @@ struct wlr_surface *wlr_xdg_surface_surface_at(
|
||||||
struct wlr_xdg_surface *surface, double sx, double sy,
|
struct wlr_xdg_surface *surface, double sx, double sy,
|
||||||
double *sub_x, double *sub_y);
|
double *sub_x, double *sub_y);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find a surface within this xdg-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_xdg_surface_popup_surface_at(
|
||||||
|
struct wlr_xdg_surface *surface, double sx, double sy,
|
||||||
|
double *sub_x, double *sub_y);
|
||||||
|
|
||||||
bool wlr_surface_is_xdg_surface(struct wlr_surface *surface);
|
bool wlr_surface_is_xdg_surface(struct wlr_surface *surface);
|
||||||
|
|
||||||
struct wlr_xdg_surface *wlr_xdg_surface_from_wlr_surface(
|
struct wlr_xdg_surface *wlr_xdg_surface_from_wlr_surface(
|
||||||
|
|
|
@ -583,6 +583,17 @@ static void xdg_popup_get_position(struct wlr_xdg_popup *popup,
|
||||||
struct wlr_surface *wlr_xdg_surface_surface_at(
|
struct wlr_surface *wlr_xdg_surface_surface_at(
|
||||||
struct wlr_xdg_surface *surface, double sx, double sy,
|
struct wlr_xdg_surface *surface, double sx, double sy,
|
||||||
double *sub_x, double *sub_y) {
|
double *sub_x, double *sub_y) {
|
||||||
|
struct wlr_surface *sub = wlr_xdg_surface_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_xdg_surface_popup_surface_at(
|
||||||
|
struct wlr_xdg_surface *surface, double sx, double sy,
|
||||||
|
double *sub_x, double *sub_y) {
|
||||||
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;
|
||||||
|
@ -599,7 +610,7 @@ struct wlr_surface *wlr_xdg_surface_surface_at(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return wlr_surface_surface_at(surface->surface, sx, sy, sub_x, sub_y);
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct xdg_surface_iterator_data {
|
struct xdg_surface_iterator_data {
|
||||||
|
|
Loading…
Reference in New Issue