From ebfe432ec3064094faebe0913b2d98932d590bfd Mon Sep 17 00:00:00 2001
From: Ronan Pigott <rpigott@berkeley.edu>
Date: Sun, 24 Oct 2021 18:49:39 -0700
Subject: output: change output::destroy to output::disable

This changes output::destroy to output::disable and emits it only
once when an output is disabled, instead of twice in succession.
---
 include/sway/output.h      | 2 +-
 sway/desktop/layer_shell.c | 2 +-
 sway/desktop/output.c      | 8 ++++++--
 sway/tree/output.c         | 8 ++------
 4 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/include/sway/output.h b/include/sway/output.h
index 5dfe0fff..26b9709f 100644
--- a/include/sway/output.h
+++ b/include/sway/output.h
@@ -48,7 +48,7 @@ struct sway_output {
 	struct wl_listener damage_frame;
 
 	struct {
-		struct wl_signal destroy;
+		struct wl_signal disable;
 	} events;
 
 	struct timespec last_presentation;
diff --git a/sway/desktop/layer_shell.c b/sway/desktop/layer_shell.c
index db78b59f..da59016d 100644
--- a/sway/desktop/layer_shell.c
+++ b/sway/desktop/layer_shell.c
@@ -664,7 +664,7 @@ void handle_layer_shell_surface(struct wl_listener *listener, void *data) {
 
 	struct sway_output *output = layer_surface->output->data;
 	sway_layer->output_destroy.notify = handle_output_destroy;
-	wl_signal_add(&output->events.destroy, &sway_layer->output_destroy);
+	wl_signal_add(&output->events.disable, &sway_layer->output_destroy);
 
 	wl_list_insert(&output->layers[layer_surface->pending.layer],
 			&sway_layer->link);
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index 3ae97e66..68f095c0 100644
--- a/sway/desktop/output.c
+++ b/sway/desktop/output.c
@@ -754,18 +754,22 @@ static void update_output_manager_config(struct sway_server *server) {
 static void handle_destroy(struct wl_listener *listener, void *data) {
 	struct sway_output *output = wl_container_of(listener, output, destroy);
 	struct sway_server *server = output->server;
-	wl_signal_emit(&output->events.destroy, output);
+	output_begin_destroy(output);
 
 	if (output->enabled) {
 		output_disable(output);
 	}
-	output_begin_destroy(output);
+
+	wl_list_remove(&output->link);
 
 	wl_list_remove(&output->destroy.link);
 	wl_list_remove(&output->commit.link);
 	wl_list_remove(&output->mode.link);
 	wl_list_remove(&output->present.link);
 
+	output->wlr_output->data = NULL;
+	output->wlr_output = NULL;
+
 	transaction_commit_dirty();
 
 	update_output_manager_config(server);
diff --git a/sway/tree/output.c b/sway/tree/output.c
index 242e6fac..8eefcee3 100644
--- a/sway/tree/output.c
+++ b/sway/tree/output.c
@@ -95,7 +95,7 @@ struct sway_output *output_create(struct wlr_output *wlr_output) {
 	output->detected_subpixel = wlr_output->subpixel;
 	output->scale_filter = SCALE_FILTER_NEAREST;
 
-	wl_signal_init(&output->events.destroy);
+	wl_signal_init(&output->events.disable);
 
 	wl_list_insert(&root->all_outputs, &output->link);
 
@@ -262,7 +262,7 @@ void output_disable(struct sway_output *output) {
 	}
 
 	sway_log(SWAY_DEBUG, "Disabling output '%s'", output->wlr_output->name);
-	wl_signal_emit(&output->events.destroy, output);
+	wl_signal_emit(&output->events.disable, output);
 
 	output_evacuate(output);
 
@@ -289,10 +289,6 @@ void output_begin_destroy(struct sway_output *output) {
 
 	output->node.destroying = true;
 	node_set_dirty(&output->node);
-
-	wl_list_remove(&output->link);
-	output->wlr_output->data = NULL;
-	output->wlr_output = NULL;
 }
 
 struct sway_output *output_from_wlr_output(struct wlr_output *output) {
-- 
cgit v1.2.3