From a57d46292694e388d74add7b0869bcafdb42b2bd Mon Sep 17 00:00:00 2001
From: Drew DeVault <sir@cmpwn.com>
Date: Sat, 25 Nov 2017 15:49:10 -0500
Subject: [PATCH] Fix rendering issues, wire up some xdg listeners

---
 include/sway/view.h         |  3 +++
 sway/desktop/output.c       |  6 ++++--
 sway/desktop/xdg_shell_v6.c | 22 ++++++++++++++++++++--
 sway/tree/layout.c          |  5 ++---
 4 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/include/sway/view.h b/include/sway/view.h
index 9d503674..fca444b7 100644
--- a/include/sway/view.h
+++ b/include/sway/view.h
@@ -14,6 +14,8 @@ struct sway_xdg_surface_v6 {
 	struct wl_listener request_move;
 	struct wl_listener request_resize;
 	struct wl_listener request_maximize;
+
+	int pending_width, pending_height;
 };
 
 enum sway_view_type {
@@ -40,6 +42,7 @@ struct sway_view {
 	enum sway_view_type type;
 	struct sway_container *swayc;
 	struct wlr_surface *surface;
+	int width, height;
 
 	union {
 		struct wlr_xdg_surface_v6 *wlr_xdg_surface_v6;
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index 033a4c44..99c74d89 100644
--- a/sway/desktop/output.c
+++ b/sway/desktop/output.c
@@ -27,8 +27,8 @@ static void output_frame_view(swayc_t *view, void *data) {
 	}
 	// TODO
 	// - Deal with wlr_output_layout
-	int width = sway_view->swayc->width;
-	int height = sway_view->swayc->height;
+	int width = sway_view->width;
+	int height = sway_view->height;
 	int render_width = width * wlr_output->scale;
 	int render_height = height * wlr_output->scale;
 	double ox = view->x, oy = view->y;
@@ -122,6 +122,8 @@ void output_add_notify(struct wl_listener *listener, void *data) {
 
 	output->resolution.notify = output_resolution_notify;
 	wl_signal_add(&wlr_output->events.resolution, &output->resolution);
+
+	arrange_windows(output->swayc, -1, -1);
 }
 
 void output_remove_notify(struct wl_listener *listener, void *data) {
diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c
index 8f1885c1..94682fcd 100644
--- a/sway/desktop/xdg_shell_v6.c
+++ b/sway/desktop/xdg_shell_v6.c
@@ -29,9 +29,24 @@ static const char *get_prop(struct sway_view *view, enum sway_view_prop prop) {
 }
 
 static void set_dimensions(struct sway_view *view, int width, int height) {
-	if (assert_xdg(view)) {
-		wlr_xdg_toplevel_v6_set_size(view->wlr_xdg_surface_v6, width, height);
+	if (!assert_xdg(view)) {
+		return;
 	}
+	view->sway_xdg_surface_v6->pending_width = width;
+	view->sway_xdg_surface_v6->pending_height = height;
+	wlr_xdg_toplevel_v6_set_size(view->wlr_xdg_surface_v6, width, height);
+}
+
+static void handle_commit(struct wl_listener *listener, void *data) {
+	struct sway_xdg_surface_v6 *sway_surface =
+		wl_container_of(listener, sway_surface, commit);
+	struct sway_view *view = sway_surface->view;
+	sway_log(L_DEBUG, "xdg surface commit %dx%d",
+			sway_surface->pending_width, sway_surface->pending_height);
+	// NOTE: We intentionally discard the view's desired width here
+	// TODO: Don't do that for floating views
+	view->width = sway_surface->pending_width;
+	view->height = sway_surface->pending_height;
 }
 
 void handle_xdg_shell_v6_surface(struct wl_listener *listener, void *data) {
@@ -72,6 +87,9 @@ void handle_xdg_shell_v6_surface(struct wl_listener *listener, void *data) {
 	// - Look up pid and open on appropriate workspace
 	// - Set new view to maximized so it behaves nicely
 	// - Criteria
+	
+	sway_surface->commit.notify = handle_commit;
+	wl_signal_add(&xdg_surface->events.commit, &sway_surface->commit);
 
 	// TODO: actual focus semantics
 	swayc_t *parent = root_container.children->items[0];
diff --git a/sway/tree/layout.c b/sway/tree/layout.c
index 3d6b404d..6e2586a7 100644
--- a/sway/tree/layout.c
+++ b/sway/tree/layout.c
@@ -129,11 +129,10 @@ void arrange_windows(swayc_t *container, double width, double height) {
 	case C_WORKSPACE:
 		{
 			swayc_t *output = swayc_parent_by_type(container, C_OUTPUT);
-			width = output->width, height = output->height;
+			container->width = output->width;
+			container->height = output->height;
 			container->x = x;
 			container->y = y;
-			width = container->width;
-			height = container->height;
 			sway_log(L_DEBUG, "Arranging workspace '%s' at %f, %f",
 					container->name, container->x, container->y);
 		}