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