diff --git a/include/sway/output.h b/include/sway/output.h index 6d8319bf..d72bf1b2 100644 --- a/include/sway/output.h +++ b/include/sway/output.h @@ -57,6 +57,12 @@ struct sway_output { struct wl_event_source *repaint_timer; }; +struct sway_output_non_desktop { + struct wlr_output *wlr_output; + + struct wl_listener destroy; +}; + struct sway_output *output_create(struct wlr_output *wlr_output); void output_destroy(struct sway_output *output); @@ -177,4 +183,6 @@ void handle_output_manager_test(struct wl_listener *listener, void *data); void handle_output_power_manager_set_mode(struct wl_listener *listener, void *data); +struct sway_output_non_desktop *output_non_desktop_create(struct wlr_output *wlr_output); + #endif diff --git a/include/sway/tree/root.h b/include/sway/tree/root.h index 5d4a2f2d..af4124a1 100644 --- a/include/sway/tree/root.h +++ b/include/sway/tree/root.h @@ -28,6 +28,7 @@ struct sway_root { double width, height; list_t *outputs; // struct sway_output + list_t *non_desktop_outputs; // struct sway_output_non_desktop list_t *scratchpad; // struct sway_container // For when there's no connected outputs diff --git a/sway/desktop/output.c b/sway/desktop/output.c index 7bb9dab2..3f3f9494 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -883,10 +883,12 @@ void handle_new_output(struct wl_listener *listener, void *data) { if (wlr_output->non_desktop) { sway_log(SWAY_DEBUG, "Not configuring non-desktop output"); + struct sway_output_non_desktop *non_desktop = output_non_desktop_create(wlr_output); if (server->drm_lease_manager) { wlr_drm_lease_v1_manager_offer_output(server->drm_lease_manager, wlr_output); } + list_add(root->non_desktop_outputs, non_desktop); return; } diff --git a/sway/tree/output.c b/sway/tree/output.c index 52826c91..b30e646e 100644 --- a/sway/tree/output.c +++ b/sway/tree/output.c @@ -9,6 +9,7 @@ #include "sway/output.h" #include "sway/tree/arrange.h" #include "sway/tree/workspace.h" +#include "sway/server.h" #include "log.h" #include "util.h" @@ -390,6 +391,33 @@ void output_get_box(struct sway_output *output, struct wlr_box *box) { box->height = output->height; } +static void handle_destroy_non_desktop(struct wl_listener *listener, void *data) { + struct sway_output_non_desktop *output = + wl_container_of(listener, output, destroy); + + sway_log(SWAY_DEBUG, "Destroying non-desktop output '%s'", output->wlr_output->name); + + int index = list_find(root->non_desktop_outputs, output); + list_del(root->non_desktop_outputs, index); + + wl_list_remove(&output->destroy.link); + + free(output); +} + +struct sway_output_non_desktop *output_non_desktop_create( + struct wlr_output *wlr_output) { + struct sway_output_non_desktop *output = + calloc(1, sizeof(struct sway_output_non_desktop)); + + output->wlr_output = wlr_output; + + wl_signal_add(&wlr_output->events.destroy, &output->destroy); + output->destroy.notify = handle_destroy_non_desktop; + + return output; +} + enum sway_container_layout output_get_default_layout( struct sway_output *output) { if (config->default_orientation != L_NONE) { diff --git a/sway/tree/root.c b/sway/tree/root.c index 8508e9eb..7df0b237 100644 --- a/sway/tree/root.c +++ b/sway/tree/root.c @@ -38,6 +38,7 @@ struct sway_root *root_create(void) { wl_list_init(&root->drag_icons); wl_signal_init(&root->events.new_node); root->outputs = create_list(); + root->non_desktop_outputs = create_list(); root->scratchpad = create_list(); root->output_layout_change.notify = output_layout_handle_change;