From 88cd7616dbeff4367c41757490aa5f6f663a7318 Mon Sep 17 00:00:00 2001
From: emersion <contact@emersion.fr>
Date: Sat, 9 Jun 2018 11:38:16 +0100
Subject: Fix compilation errors related to disabled outputs

---
 sway/desktop/output.c | 23 +++++++++++++----------
 sway/ipc-json.c       |  7 ++++---
 2 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index 3142bdb4..bd1d760d 100644
--- a/sway/desktop/output.c
+++ b/sway/desktop/output.c
@@ -1169,12 +1169,10 @@ static void handle_destroy(struct wl_listener *listener, void *data) {
 		container_destroy(output->swayc);
 	}
 
-	if (&output->link) {
-		wl_list_remove(&output->link);
-		wl_list_remove(&output->destroy.link);
-		output->wlr_output = NULL;
-		free(output);
-	}
+	wl_list_remove(&output->link);
+	wl_list_remove(&output->destroy.link);
+	output->wlr_output->data = NULL;
+	free(output);
 }
 
 static void handle_mode(struct wl_listener *listener, void *data) {
@@ -1212,10 +1210,13 @@ void handle_new_output(struct wl_listener *listener, void *data) {
 	output->wlr_output = wlr_output;
 	wlr_output->data = output;
 	output->server = server;
-	wl_list_insert(&root_container.sway_root->outputs, &output->link);
-
 	output->damage = wlr_output_damage_create(wlr_output);
 
+	wl_signal_add(&wlr_output->events.destroy, &output->destroy);
+	output->destroy.notify = handle_destroy;
+
+	wl_list_insert(&root_container.sway_root->outputs, &output->link);
+
 	if (!wl_list_empty(&wlr_output->modes)) {
 		struct wlr_output_mode *mode =
 			wl_container_of(wlr_output->modes.prev, mode, link);
@@ -1228,6 +1229,10 @@ void handle_new_output(struct wl_listener *listener, void *data) {
 void output_enable(struct sway_output *output) {
 	struct wlr_output *wlr_output = output->wlr_output;
 
+	if (!sway_assert(output->swayc == NULL, "output is already enabled")) {
+		return;
+	}
+
 	output->swayc = output_create(output);
 	if (!output->swayc) {
 		// Output is disabled
@@ -1241,8 +1246,6 @@ void output_enable(struct sway_output *output) {
 
 	input_manager_configure_xcursor(input_manager);
 
-	wl_signal_add(&wlr_output->events.destroy, &output->destroy);
-	output->destroy.notify = handle_destroy;
 	wl_signal_add(&wlr_output->events.mode, &output->mode);
 	output->mode.notify = handle_mode;
 	wl_signal_add(&wlr_output->events.transform, &output->transform);
diff --git a/sway/ipc-json.c b/sway/ipc-json.c
index 5d402d1b..b9289e25 100644
--- a/sway/ipc-json.c
+++ b/sway/ipc-json.c
@@ -83,7 +83,8 @@ static const char *ipc_json_get_output_transform(enum wl_output_transform transf
 	return NULL;
 }
 
-static void ipc_json_describe_output(struct sway_container *container, json_object *object) {
+static void ipc_json_describe_output(struct sway_container *container,
+		json_object *object) {
 	struct wlr_output *wlr_output = container->sway_output->wlr_output;
 	json_object_object_add(object, "type",
 			json_object_new_string("output"));
@@ -141,12 +142,12 @@ static void ipc_json_describe_output(struct sway_container *container, json_obje
 
 json_object *ipc_json_describe_disabled_output(struct sway_output *output) {
 	struct wlr_output *wlr_output = output->wlr_output;
-	
+
 	json_object *object = json_object_new_object();
 
 	json_object_object_add(object, "type", json_object_new_string("output"));
 	json_object_object_add(object, "name",
-			wlr_output->name ? json_object_new_string(wlr_output->name) : NULL);
+			json_object_new_string(wlr_output->name));
 	json_object_object_add(object, "active", json_object_new_boolean(false));
 	json_object_object_add(object, "make",
 			json_object_new_string(wlr_output->make));
-- 
cgit v1.2.3