From efda33b28568f2065c2a995d0a05a497b7d33e91 Mon Sep 17 00:00:00 2001
From: emersion <contact@emersion.fr>
Date: Fri, 13 Jul 2018 21:17:31 +0100
Subject: [PATCH] Simplify popup_unconstrain

Just use the parent output.
---
 sway/desktop/xdg_shell.c    | 39 +++++--------------------------------
 sway/desktop/xdg_shell_v6.c | 39 +++++--------------------------------
 2 files changed, 10 insertions(+), 68 deletions(-)

diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c
index 17b7b750..fbeeb2e3 100644
--- a/sway/desktop/xdg_shell.c
+++ b/sway/desktop/xdg_shell.c
@@ -46,47 +46,18 @@ static void popup_handle_destroy(struct wl_listener *listener, void *data) {
 }
 
 static void popup_unconstrain(struct sway_xdg_popup *popup) {
-	// get the output of the popup's positioner anchor point and convert it to
-	// the toplevel parent's coordinate system and then pass it to
-	// wlr_xdg_popup_unconstrain_from_box
-
 	struct sway_view *view = popup->child.view;
-	struct wlr_output_layout *output_layout =
-		root_container.sway_root->output_layout;
 	struct wlr_xdg_popup *wlr_popup = popup->wlr_xdg_surface->popup;
 
-	int anchor_lx, anchor_ly;
-	wlr_xdg_popup_get_anchor_point(wlr_popup, &anchor_lx, &anchor_ly);
-
-	int popup_lx, popup_ly;
-	wlr_xdg_popup_get_toplevel_coords(wlr_popup, wlr_popup->geometry.x,
-		wlr_popup->geometry.y, &popup_lx, &popup_ly);
-	popup_lx += view->x;
-	popup_ly += view->y;
-
-	anchor_lx += popup_lx;
-	anchor_ly += popup_ly;
-
-	double dest_x = 0, dest_y = 0;
-	wlr_output_layout_closest_point(output_layout, NULL, anchor_lx, anchor_ly,
-		&dest_x, &dest_y);
-
-	struct wlr_output *output =
-		wlr_output_layout_output_at(output_layout, dest_x, dest_y);
-	if (output == NULL) {
-		return;
-	}
-
-	int width = 0, height = 0;
-	wlr_output_effective_resolution(output, &width, &height);
+	struct sway_container *output = container_parent(view->swayc, C_OUTPUT);
 
 	// the output box expressed in the coordinate system of the toplevel parent
 	// of the popup
 	struct wlr_box output_toplevel_sx_box = {
-		.x = output->lx - view->x,
-		.y = output->ly - view->y,
-		.width = width,
-		.height = height
+		.x = output->x - view->x,
+		.y = output->y - view->y,
+		.width = output->width,
+		.height = output->height,
 	};
 
 	wlr_xdg_popup_unconstrain_from_box(wlr_popup, &output_toplevel_sx_box);
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) {
 }
 
 static void popup_unconstrain(struct sway_xdg_popup_v6 *popup) {
-	// get the output of the popup's positioner anchor point and convert it to
-	// the toplevel parent's coordinate system and then pass it to
-	// wlr_xdg_popup_unconstrain_from_box
-
 	struct sway_view *view = popup->child.view;
-	struct wlr_output_layout *output_layout =
-		root_container.sway_root->output_layout;
 	struct wlr_xdg_popup_v6 *wlr_popup = popup->wlr_xdg_surface_v6->popup;
 
-	int anchor_lx, anchor_ly;
-	wlr_xdg_popup_v6_get_anchor_point(wlr_popup, &anchor_lx, &anchor_ly);
-
-	int popup_lx, popup_ly;
-	wlr_xdg_popup_v6_get_toplevel_coords(wlr_popup, wlr_popup->geometry.x,
-		wlr_popup->geometry.y, &popup_lx, &popup_ly);
-	popup_lx += view->x;
-	popup_ly += view->y;
-
-	anchor_lx += popup_lx;
-	anchor_ly += popup_ly;
-
-	double dest_x = 0, dest_y = 0;
-	wlr_output_layout_closest_point(output_layout, NULL, anchor_lx, anchor_ly,
-		&dest_x, &dest_y);
-
-	struct wlr_output *output =
-		wlr_output_layout_output_at(output_layout, dest_x, dest_y);
-	if (output == NULL) {
-		return;
-	}
-
-	int width = 0, height = 0;
-	wlr_output_effective_resolution(output, &width, &height);
+	struct sway_container *output = container_parent(view->swayc, C_OUTPUT);
 
 	// the output box expressed in the coordinate system of the toplevel parent
 	// of the popup
 	struct wlr_box output_toplevel_sx_box = {
-		.x = output->lx - view->x,
-		.y = output->ly - view->y,
-		.width = width,
-		.height = height
+		.x = output->x - view->x,
+		.y = output->y - view->y,
+		.width = output->width,
+		.height = output->height,
 	};
 
 	wlr_xdg_popup_v6_unconstrain_from_box(wlr_popup, &output_toplevel_sx_box);