diff options
Diffstat (limited to 'sway/desktop/xdg_shell.c')
-rw-r--r-- | sway/desktop/xdg_shell.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c index a8b527a7..9036448b 100644 --- a/sway/desktop/xdg_shell.c +++ b/sway/desktop/xdg_shell.c | |||
@@ -20,6 +20,19 @@ | |||
20 | 20 | ||
21 | static const struct sway_view_child_impl popup_impl; | 21 | static const struct sway_view_child_impl popup_impl; |
22 | 22 | ||
23 | static void popup_get_root_coords(struct sway_view_child *child, | ||
24 | int *root_sx, int *root_sy) { | ||
25 | struct sway_xdg_popup *popup = (struct sway_xdg_popup *)child; | ||
26 | struct wlr_xdg_surface *surface = popup->wlr_xdg_surface; | ||
27 | *root_sx = -surface->geometry.x; | ||
28 | *root_sy = -surface->geometry.y; | ||
29 | while (surface && surface->role == WLR_XDG_SURFACE_ROLE_POPUP) { | ||
30 | *root_sx += surface->popup->geometry.x; | ||
31 | *root_sy += surface->popup->geometry.y; | ||
32 | surface = wlr_xdg_surface_from_wlr_surface(surface->popup->parent); | ||
33 | } | ||
34 | } | ||
35 | |||
23 | static void popup_destroy(struct sway_view_child *child) { | 36 | static void popup_destroy(struct sway_view_child *child) { |
24 | if (!sway_assert(child->impl == &popup_impl, | 37 | if (!sway_assert(child->impl == &popup_impl, |
25 | "Expected an xdg_shell popup")) { | 38 | "Expected an xdg_shell popup")) { |
@@ -32,6 +45,7 @@ static void popup_destroy(struct sway_view_child *child) { | |||
32 | } | 45 | } |
33 | 46 | ||
34 | static const struct sway_view_child_impl popup_impl = { | 47 | static const struct sway_view_child_impl popup_impl = { |
48 | .get_root_coords = popup_get_root_coords, | ||
35 | .destroy = popup_destroy, | 49 | .destroy = popup_destroy, |
36 | }; | 50 | }; |
37 | 51 | ||
@@ -85,6 +99,9 @@ static struct sway_xdg_popup *popup_create( | |||
85 | wl_signal_add(&xdg_surface->events.destroy, &popup->destroy); | 99 | wl_signal_add(&xdg_surface->events.destroy, &popup->destroy); |
86 | popup->destroy.notify = popup_handle_destroy; | 100 | popup->destroy.notify = popup_handle_destroy; |
87 | 101 | ||
102 | wl_signal_add(&xdg_surface->events.map, &popup->child.surface_map); | ||
103 | wl_signal_add(&xdg_surface->events.unmap, &popup->child.surface_unmap); | ||
104 | |||
88 | popup_unconstrain(popup); | 105 | popup_unconstrain(popup); |
89 | 106 | ||
90 | return popup; | 107 | return popup; |