From 89e9a4be33c5cf6c56435c4617563fe740074d39 Mon Sep 17 00:00:00 2001
From: "Devin J. Pohly" <djpohly@gmail.com>
Date: Thu, 23 Jul 2020 18:03:13 -0400
Subject: add monitor destroy listener

---
 dwl.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/dwl.c b/dwl.c
index 7c35ae9..07f74a8 100644
--- a/dwl.c
+++ b/dwl.c
@@ -110,6 +110,7 @@ struct Monitor {
 	struct wl_list link;
 	struct wlr_output *wlr_output;
 	struct wl_listener frame;
+	struct wl_listener destroy;
 	struct wlr_box m;      /* monitor area, layout-relative */
 	struct wlr_box w;      /* window area, layout-relative */
 	const Layout *lt[2];
@@ -152,6 +153,7 @@ static void arrange(Monitor *m);
 static void axisnotify(struct wl_listener *listener, void *data);
 static void buttonpress(struct wl_listener *listener, void *data);
 static void chvt(const Arg *arg);
+static void cleanupmon(struct wl_listener *listener, void *data);
 static void createkeyboard(struct wlr_input_device *device);
 static void createmon(struct wl_listener *listener, void *data);
 static void createnotify(struct wl_listener *listener, void *data);
@@ -393,6 +395,16 @@ chvt(const Arg *arg)
 	wlr_session_change_vt(s, arg->ui);
 }
 
+void
+cleanupmon(struct wl_listener *listener, void *data)
+{
+	struct wlr_output *wlr_output = data;
+	Monitor *m = wlr_output->data;
+
+	wl_list_remove(&m->destroy.link);
+	free(m);
+}
+
 void
 createkeyboard(struct wlr_input_device *device)
 {
@@ -455,11 +467,15 @@ createmon(struct wl_listener *listener, void *data)
 			break;
 		}
 	}
-	/* Sets up a listener for the frame notify event. */
+	/* Set up event listeners */
 	m->frame.notify = rendermon;
 	wl_signal_add(&wlr_output->events.frame, &m->frame);
 	wl_list_insert(&mons, &m->link);
 
+	m->destroy.notify = cleanupmon;
+	wl_signal_add(&wlr_output->events.destroy, &m->destroy);
+	wl_list_insert(&mons, &m->link);
+
 	wlr_output_enable(wlr_output, 1);
 	if (!wlr_output_commit(wlr_output))
 		return;
-- 
cgit v1.2.3