From 621d2666b1ac214c63628bbe0ac8f5d6485cb501 Mon Sep 17 00:00:00 2001
From: vilhalmer <vil@vil.lv>
Date: Sun, 8 Jul 2018 17:35:01 -0400
Subject: Destroy empty workspace when destroying its output

---
 sway/tree/container.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

(limited to 'sway/tree')

diff --git a/sway/tree/container.c b/sway/tree/container.c
index 5fdcb6e3..7cea43fa 100644
--- a/sway/tree/container.c
+++ b/sway/tree/container.c
@@ -204,16 +204,23 @@ static struct sway_container *container_workspace_destroy(
 		return NULL;
 	}
 
-	// Do not destroy this if it's the last workspace on this output
 	struct sway_container *output = container_parent(workspace, C_OUTPUT);
-	if (output && output->children->length == 1) {
+
+	// If we're destroying the output, it will be NULL here. Return the root so
+	// that it doesn't appear that the workspace has refused to be destoyed,
+	// which would leave it in a broken state with no parent.
+	if (output == NULL) {
+		return &root_container;
+	}
+
+	// Do not destroy this if it's the last workspace on this output
+	if (output->children->length == 1) {
 		return NULL;
 	}
 
 	wlr_log(L_DEBUG, "destroying workspace '%s'", workspace->name);
 
-	struct sway_container *parent = workspace->parent;
-	if (!workspace_is_empty(workspace) && output) {
+	if (!workspace_is_empty(workspace)) {
 		// Move children to a different workspace on this output
 		struct sway_container *new_workspace = NULL;
 		for (int i = 0; i < output->children->length; i++) {
@@ -235,7 +242,7 @@ static struct sway_container *container_workspace_destroy(
 		}
 	}
 
-	return parent;
+	return output;
 }
 
 static struct sway_container *container_output_destroy(
-- 
cgit v1.2.3