From 25671d79051e9054f64de88e77e089a2daf7008f Mon Sep 17 00:00:00 2001
From: Stivvo <stivvo01@gmail.com>
Date: Sat, 31 Oct 2020 12:43:07 +0100
Subject: Fix crash when disabling focused mon

m->link.next leads to errors if the monitor to disable doesn't have a
"next" (right) monitor and is currently focused. dirtmon() does more
checks.

In some previous commits m->link.next is told to be left monitor, which
is wrong

Also focusclient() explicitly checks for disabled monitors (this fixes
in case of more than one disabled monitor)
---
 dwl.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

(limited to 'dwl.c')

diff --git a/dwl.c b/dwl.c
index a2d5092..ab17546 100644
--- a/dwl.c
+++ b/dwl.c
@@ -1459,16 +1459,26 @@ outputmgrapplyortest(struct wlr_output_configuration_v1 *config, bool test)
 {
 	struct wlr_output_configuration_head_v1 *config_head;
 	bool ok = true;
+	Arg ar = {.i = -1};
 
 	wl_list_for_each(config_head, &config->heads, link) {
 		struct wlr_output *wlr_output = config_head->state.output;
 		Monitor *m, *newmon;
 
+		if (!config_head->state.enabled) {
+			wl_list_for_each(m, &mons, link) {
+				if (m->wlr_output->name == wlr_output->name) {
+					// make sure that the monitor to clean is focused
+					selmon = m;
+					focusclient(selclient(), focustop(selmon), 1);
+
+					// focus the left monitor (relative to the current focus)
+					focusmon(&ar);
+					closemon(m, wl_container_of(&selmon->link, newmon, link));
+				}
+			}
+		}
 		wlr_output_enable(wlr_output, config_head->state.enabled);
-		if (!config_head->state.enabled)
-			wl_list_for_each(m, &mons, link)
-				if (m->wlr_output->name == wlr_output->name)
-					closemon(m, wl_container_of(m->link.next, newmon, link));
 
 		if (config_head->state.enabled) {
 			if (config_head->state.mode)
-- 
cgit v1.2.3