aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoremersion <contact@emersion.fr>2017-11-15 14:03:13 +0100
committeremersion <contact@emersion.fr>2017-11-15 14:03:13 +0100
commit3f6cf517b9b8d5efa0c6001db5ed0871e5d8d2b4 (patch)
tree5aa4127dfa5411864ff4fcccd64bf32b692f151c
parentbb973ff27d5b735d2eb8ec620d7ea74e43eab301 (diff)
Add wlr_xdg_surface_v6_popup_get_position
-rw-r--r--include/wlr/types/wlr_xdg_shell_v6.h6
-rw-r--r--rootston/output.c14
-rw-r--r--types/wlr_xdg_shell_v6.c10
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) {