diff options
author | emersion <contact@emersion.fr> | 2017-11-15 14:03:13 +0100 |
---|---|---|
committer | emersion <contact@emersion.fr> | 2017-11-15 14:03:13 +0100 |
commit | 3f6cf517b9b8d5efa0c6001db5ed0871e5d8d2b4 (patch) | |
tree | 5aa4127dfa5411864ff4fcccd64bf32b692f151c | |
parent | bb973ff27d5b735d2eb8ec620d7ea74e43eab301 (diff) |
Add wlr_xdg_surface_v6_popup_get_position
-rw-r--r-- | include/wlr/types/wlr_xdg_shell_v6.h | 6 | ||||
-rw-r--r-- | rootston/output.c | 14 | ||||
-rw-r--r-- | types/wlr_xdg_shell_v6.c | 10 |
3 files changed, 22 insertions, 8 deletions
diff --git a/include/wlr/types/wlr_xdg_shell_v6.h b/include/wlr/types/wlr_xdg_shell_v6.h index 07911ffa..e3982003 100644 --- a/include/wlr/types/wlr_xdg_shell_v6.h +++ b/include/wlr/types/wlr_xdg_shell_v6.h @@ -210,6 +210,12 @@ void wlr_xdg_toplevel_v6_set_resizing(struct wlr_xdg_surface_v6 *surface, void wlr_xdg_toplevel_v6_send_close(struct wlr_xdg_surface_v6 *surface); /** + * Compute the popup position in surface-local coordinates. + */ +void wlr_xdg_surface_v6_popup_get_position(struct wlr_xdg_surface_v6 *surface, + double *popup_sx, double *popup_sy); + +/** * Find a popup within this surface at the surface-local coordinates. Returns * the popup and coordinates in the topmost surface coordinate system or NULL if * no popup is found at that location. diff --git a/rootston/output.c b/rootston/output.c index cfab3756..28312c2c 100644 --- a/rootston/output.c +++ b/rootston/output.c @@ -115,17 +115,15 @@ static void render_xdg_v6_popups(struct wlr_xdg_surface_v6 *surface, double popup_width = popup->surface->current->width; double popup_height = popup->surface->current->height; - double popup_x = surface->geometry->x + popup->popup_state->geometry.x - - popup->geometry->x; - double popup_y = surface->geometry->y + popup->popup_state->geometry.y - - popup->geometry->y; - rotate_child_position(&popup_x, &popup_y, popup_width, popup_height, + double popup_sx, popup_sy; + wlr_xdg_surface_v6_popup_get_position(popup, &popup_sx, &popup_sy); + rotate_child_position(&popup_sx, &popup_sy, popup_width, popup_height, width, height, rotation); render_surface(popup->surface, desktop, wlr_output, when, - base_x + popup_x, base_y + popup_y, rotation); - render_xdg_v6_popups(popup, desktop, wlr_output, when, base_x + popup_x, - base_y + popup_y, rotation); + base_x + popup_sx, base_y + popup_sy, rotation); + render_xdg_v6_popups(popup, desktop, wlr_output, when, + base_x + popup_sx, base_y + popup_sy, rotation); } } diff --git a/types/wlr_xdg_shell_v6.c b/types/wlr_xdg_shell_v6.c index 05ca2b76..429baa70 100644 --- a/types/wlr_xdg_shell_v6.c +++ b/types/wlr_xdg_shell_v6.c @@ -1350,6 +1350,16 @@ void wlr_xdg_toplevel_v6_send_close(struct wlr_xdg_surface_v6 *surface) { zxdg_toplevel_v6_send_close(surface->toplevel_state->resource); } +void wlr_xdg_surface_v6_popup_get_position(struct wlr_xdg_surface_v6 *surface, + double *popup_sx, double *popup_sy) { + assert(surface->role == WLR_XDG_SURFACE_V6_ROLE_POPUP); + struct wlr_xdg_surface_v6 *parent = surface->popup_state->parent; + *popup_sx = parent->geometry->x + surface->popup_state->geometry.x - + surface->geometry->x; + *popup_sy = parent->geometry->y + surface->popup_state->geometry.y - + surface->geometry->y; +} + struct wlr_xdg_surface_v6 *wlr_xdg_surface_v6_popup_at( struct wlr_xdg_surface_v6 *surface, double sx, double sy, double *popup_sx, double *popup_sy) { |