diff options
Diffstat (limited to 'sway/desktop/xdg_shell.c')
-rw-r--r-- | sway/desktop/xdg_shell.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c index 4690a3c5..46582204 100644 --- a/sway/desktop/xdg_shell.c +++ b/sway/desktop/xdg_shell.c @@ -20,6 +20,17 @@ static const struct sway_view_child_impl popup_impl; +static void popup_get_root_coords(struct sway_view_child *child, + int *root_sx, int *root_sy) { + struct sway_xdg_popup *popup = (struct sway_xdg_popup *)child; + struct wlr_xdg_surface *surface = popup->wlr_xdg_surface; + + wlr_xdg_popup_get_toplevel_coords(surface->popup, + -surface->geometry.x + surface->popup->geometry.x, + -surface->geometry.y + surface->popup->geometry.y, + root_sx, root_sy); +} + static void popup_destroy(struct sway_view_child *child) { if (!sway_assert(child->impl == &popup_impl, "Expected an xdg_shell popup")) { @@ -32,6 +43,7 @@ static void popup_destroy(struct sway_view_child *child) { } static const struct sway_view_child_impl popup_impl = { + .get_root_coords = popup_get_root_coords, .destroy = popup_destroy, }; @@ -85,6 +97,9 @@ static struct sway_xdg_popup *popup_create( wl_signal_add(&xdg_surface->events.destroy, &popup->destroy); popup->destroy.notify = popup_handle_destroy; + wl_signal_add(&xdg_surface->events.map, &popup->child.surface_map); + wl_signal_add(&xdg_surface->events.unmap, &popup->child.surface_unmap); + popup_unconstrain(popup); return popup; |