diff options
Diffstat (limited to 'sway/desktop/xdg_shell_v6.c')
-rw-r--r-- | sway/desktop/xdg_shell_v6.c | 39 |
1 files changed, 5 insertions, 34 deletions
diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c index 43e58918..88d9bb94 100644 --- a/sway/desktop/xdg_shell_v6.c +++ b/sway/desktop/xdg_shell_v6.c | |||
@@ -45,47 +45,18 @@ static void popup_handle_destroy(struct wl_listener *listener, void *data) { | |||
45 | } | 45 | } |
46 | 46 | ||
47 | static void popup_unconstrain(struct sway_xdg_popup_v6 *popup) { | 47 | static void popup_unconstrain(struct sway_xdg_popup_v6 *popup) { |
48 | // get the output of the popup's positioner anchor point and convert it to | ||
49 | // the toplevel parent's coordinate system and then pass it to | ||
50 | // wlr_xdg_popup_unconstrain_from_box | ||
51 | |||
52 | struct sway_view *view = popup->child.view; | 48 | struct sway_view *view = popup->child.view; |
53 | struct wlr_output_layout *output_layout = | ||
54 | root_container.sway_root->output_layout; | ||
55 | struct wlr_xdg_popup_v6 *wlr_popup = popup->wlr_xdg_surface_v6->popup; | 49 | struct wlr_xdg_popup_v6 *wlr_popup = popup->wlr_xdg_surface_v6->popup; |
56 | 50 | ||
57 | int anchor_lx, anchor_ly; | 51 | struct sway_container *output = container_parent(view->swayc, C_OUTPUT); |
58 | wlr_xdg_popup_v6_get_anchor_point(wlr_popup, &anchor_lx, &anchor_ly); | ||
59 | |||
60 | int popup_lx, popup_ly; | ||
61 | wlr_xdg_popup_v6_get_toplevel_coords(wlr_popup, wlr_popup->geometry.x, | ||
62 | wlr_popup->geometry.y, &popup_lx, &popup_ly); | ||
63 | popup_lx += view->x; | ||
64 | popup_ly += view->y; | ||
65 | |||
66 | anchor_lx += popup_lx; | ||
67 | anchor_ly += popup_ly; | ||
68 | |||
69 | double dest_x = 0, dest_y = 0; | ||
70 | wlr_output_layout_closest_point(output_layout, NULL, anchor_lx, anchor_ly, | ||
71 | &dest_x, &dest_y); | ||
72 | |||
73 | struct wlr_output *output = | ||
74 | wlr_output_layout_output_at(output_layout, dest_x, dest_y); | ||
75 | if (output == NULL) { | ||
76 | return; | ||
77 | } | ||
78 | |||
79 | int width = 0, height = 0; | ||
80 | wlr_output_effective_resolution(output, &width, &height); | ||
81 | 52 | ||
82 | // the output box expressed in the coordinate system of the toplevel parent | 53 | // the output box expressed in the coordinate system of the toplevel parent |
83 | // of the popup | 54 | // of the popup |
84 | struct wlr_box output_toplevel_sx_box = { | 55 | struct wlr_box output_toplevel_sx_box = { |
85 | .x = output->lx - view->x, | 56 | .x = output->x - view->x, |
86 | .y = output->ly - view->y, | 57 | .y = output->y - view->y, |
87 | .width = width, | 58 | .width = output->width, |
88 | .height = height | 59 | .height = output->height, |
89 | }; | 60 | }; |
90 | 61 | ||
91 | wlr_xdg_popup_v6_unconstrain_from_box(wlr_popup, &output_toplevel_sx_box); | 62 | wlr_xdg_popup_v6_unconstrain_from_box(wlr_popup, &output_toplevel_sx_box); |