From 5eefb51feab42add01c25a51ef50f296c721da04 Mon Sep 17 00:00:00 2001
From: "Devin J. Pohly" <djpohly@gmail.com>
Date: Mon, 18 Jan 2021 14:34:05 -0600
Subject: use updatemons as handler for output_layout.change

This should end up firing precisely when we need to adjust our geometry,
rather than us guessing about it based on requests.
---
 dwl.c | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

(limited to 'dwl.c')

diff --git a/dwl.c b/dwl.c
index 95a001f..d3d0d5e 100644
--- a/dwl.c
+++ b/dwl.c
@@ -290,7 +290,7 @@ static void toggleview(const Arg *arg);
 static void unmaplayersurface(LayerSurface *layersurface);
 static void unmaplayersurfacenotify(struct wl_listener *listener, void *data);
 static void unmapnotify(struct wl_listener *listener, void *data);
-static void updatemons();
+static void updatemons(struct wl_listener *listener, void *data);
 static void view(const Arg *arg);
 static void virtualkeyboard(struct wl_listener *listener, void *data);
 static Client *xytoclient(double x, double y);
@@ -341,6 +341,7 @@ static struct wl_listener cursor_button = {.notify = buttonpress};
 static struct wl_listener cursor_frame = {.notify = cursorframe};
 static struct wl_listener cursor_motion = {.notify = motionrelative};
 static struct wl_listener cursor_motion_absolute = {.notify = motionabsolute};
+static struct wl_listener layout_change = {.notify = updatemons};
 static struct wl_listener new_input = {.notify = inputdevice};
 static struct wl_listener new_virtual_keyboard = {.notify = virtualkeyboard};
 static struct wl_listener new_output = {.notify = createmon};
@@ -723,7 +724,6 @@ cleanupmon(struct wl_listener *listener, void *data)
 	wl_list_remove(&m->frame.link);
 	wl_list_remove(&m->link);
 	wlr_output_layout_remove(output_layout, m->wlr_output);
-	updatemons();
 
 	nmons = wl_list_length(&mons);
 	do // don't switch to disabled mons
@@ -862,7 +862,6 @@ createmon(struct wl_listener *listener, void *data)
 	sgeom = *wlr_output_layout_get_box(output_layout, NULL);
 
 	/* When adding monitors, the geometries of all monitors must be updated */
-	updatemons();
 	wl_list_for_each(m, &mons, link) {
 		/* The first monitor in the list is the most recently added */
 		Client *c;
@@ -1552,11 +1551,9 @@ outputmgrapplyortest(struct wlr_output_configuration_v1 *config, int test)
 		} else
 			ok &= wlr_output_commit(wlr_output);
 	}
-	if (ok) {
+	if (ok)
 		wlr_output_configuration_v1_send_succeeded(config);
-		if (!test)
-			updatemons();
-	} else
+	else
 		wlr_output_configuration_v1_send_failed(config);
 	wlr_output_configuration_v1_destroy(config);
 }
@@ -2027,6 +2024,7 @@ setup(void)
 	/* Creates an output layout, which a wlroots utility for working with an
 	 * arrangement of screens in a physical layout. */
 	output_layout = wlr_output_layout_create();
+	wl_signal_add(&output_layout->events.change, &layout_change);
 	wlr_xdg_output_manager_v1_create(dpy, output_layout);
 
 	/* Configure a listener to be notified when new outputs are available on the
@@ -2283,7 +2281,7 @@ unmapnotify(struct wl_listener *listener, void *data)
 }
 
 void
-updatemons()
+updatemons(struct wl_listener *listener, void *data)
 {
 	struct wlr_output_configuration_v1 *config =
 		wlr_output_configuration_v1_create();
-- 
cgit v1.2.3