From a1b5b93d299bfe129f2b3409a7f642049fcce1d6 Mon Sep 17 00:00:00 2001 From: Brian Ashworth Date: Tue, 5 Jun 2018 17:56:32 -0400 Subject: Store sway_outputs so that they can be reenabled --- sway/desktop/output.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) (limited to 'sway/desktop/output.c') diff --git a/sway/desktop/output.c b/sway/desktop/output.c index acc9caae..5d02f5eb 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -1157,6 +1157,10 @@ void output_damage_whole_container(struct sway_output *output, wlr_output_damage_add_box(output->damage, &box); } +static int find_output(const void *output1, const void *output2) { + return output1 == output2 ? 0 : 1; +} + static void damage_handle_destroy(struct wl_listener *listener, void *data) { struct sway_output *output = wl_container_of(listener, output, damage_destroy); @@ -1165,7 +1169,19 @@ static void damage_handle_destroy(struct wl_listener *listener, void *data) { static void handle_destroy(struct wl_listener *listener, void *data) { struct sway_output *output = wl_container_of(listener, output, destroy); - container_destroy(output->swayc); + if (output->swayc) { + container_destroy(output->swayc); + } + int index = list_seq_find(root_container.sway_root->outputs, find_output, + output); + if (index >= 0 && index < root_container.sway_root->outputs->length) { + wlr_log(L_DEBUG, "Removing %s from outputs list", + output->wlr_output->name); + list_del(root_container.sway_root->outputs, index); + wl_list_remove(&output->destroy.link); + output->wlr_output = NULL; + free(output); + } } static void handle_mode(struct wl_listener *listener, void *data) { @@ -1203,6 +1219,7 @@ void handle_new_output(struct wl_listener *listener, void *data) { output->wlr_output = wlr_output; wlr_output->data = output; output->server = server; + list_add(root_container.sway_root->outputs, output); if (!wl_list_empty(&wlr_output->modes)) { struct wlr_output_mode *mode = @@ -1210,11 +1227,23 @@ void handle_new_output(struct wl_listener *listener, void *data) { wlr_output_set_mode(wlr_output, mode); } - output->damage = wlr_output_damage_create(wlr_output); + output_enable(output); +} + +void output_enable(struct sway_output *output) { + struct wlr_output *wlr_output = output->wlr_output; + + if (!wlr_output->data) { + wlr_output->data = output; + } + + if (!output->damage) { + output->damage = wlr_output_damage_create(wlr_output); + } output->swayc = output_create(output); if (!output->swayc) { - free(output); + // Output is disabled return; } -- cgit v1.2.3 From a0bbe67076b8e32b47a272bc1e96be853006c65d Mon Sep 17 00:00:00 2001 From: Brian Ashworth Date: Wed, 6 Jun 2018 17:12:02 -0400 Subject: Address emersions comments on output re-enabling --- sway/desktop/output.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'sway/desktop/output.c') diff --git a/sway/desktop/output.c b/sway/desktop/output.c index 5d02f5eb..cb53a980 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -1221,6 +1221,8 @@ void handle_new_output(struct wl_listener *listener, void *data) { output->server = server; list_add(root_container.sway_root->outputs, output); + output->damage = wlr_output_damage_create(wlr_output); + if (!wl_list_empty(&wlr_output->modes)) { struct wlr_output_mode *mode = wl_container_of(wlr_output->modes.prev, mode, link); @@ -1233,14 +1235,6 @@ 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 (!wlr_output->data) { - wlr_output->data = output; - } - - if (!output->damage) { - output->damage = wlr_output_damage_create(wlr_output); - } - output->swayc = output_create(output); if (!output->swayc) { // Output is disabled -- cgit v1.2.3 From e072fbc6d98784e5610aa88251a15f64e30bbcae Mon Sep 17 00:00:00 2001 From: Brian Ashworth Date: Wed, 6 Jun 2018 20:10:42 -0400 Subject: Switch output storing from list_t to wl_list --- sway/desktop/output.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) (limited to 'sway/desktop/output.c') diff --git a/sway/desktop/output.c b/sway/desktop/output.c index cb53a980..3142bdb4 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -1157,10 +1157,6 @@ void output_damage_whole_container(struct sway_output *output, wlr_output_damage_add_box(output->damage, &box); } -static int find_output(const void *output1, const void *output2) { - return output1 == output2 ? 0 : 1; -} - static void damage_handle_destroy(struct wl_listener *listener, void *data) { struct sway_output *output = wl_container_of(listener, output, damage_destroy); @@ -1172,12 +1168,9 @@ static void handle_destroy(struct wl_listener *listener, void *data) { if (output->swayc) { container_destroy(output->swayc); } - int index = list_seq_find(root_container.sway_root->outputs, find_output, - output); - if (index >= 0 && index < root_container.sway_root->outputs->length) { - wlr_log(L_DEBUG, "Removing %s from outputs list", - output->wlr_output->name); - list_del(root_container.sway_root->outputs, index); + + if (&output->link) { + wl_list_remove(&output->link); wl_list_remove(&output->destroy.link); output->wlr_output = NULL; free(output); @@ -1219,7 +1212,7 @@ void handle_new_output(struct wl_listener *listener, void *data) { output->wlr_output = wlr_output; wlr_output->data = output; output->server = server; - list_add(root_container.sway_root->outputs, output); + wl_list_insert(&root_container.sway_root->outputs, &output->link); output->damage = wlr_output_damage_create(wlr_output); -- cgit v1.2.3