From 6accc77d444e80df5eddc04d54affe51433c9617 Mon Sep 17 00:00:00 2001 From: elviosak <33790211+elviosak@users.noreply.github.com> Date: Sun, 3 May 2026 06:05:25 -0300 Subject: [PATCH] When output is turned off and there is a mirror, assign it to views. --- src/output.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/output.c b/src/output.c index aea35062..8cb39c39 100644 --- a/src/output.c +++ b/src/output.c @@ -1080,18 +1080,44 @@ output_usable_area_in_layout_coords(struct output *output) return box; } +static struct output * +output_get_usable_mirror(struct output *output) +{ + struct output *mirror; + struct wlr_box mirror_box, output_box; + wlr_output_layout_get_box(server.output_layout, output->wlr_output, &output_box); + wl_list_for_each(mirror, &server.outputs, link) { + if (!output_is_usable(mirror) || output->id_bit == mirror->id_bit) { + continue; + } + wlr_output_layout_get_box(server.output_layout, mirror->wlr_output, &mirror_box); + if (wlr_box_equal(&output_box, &mirror_box)) { + return mirror; + } + } + return NULL; +} + void handle_output_power_manager_set_mode(struct wl_listener *listener, void *data) { struct wlr_output_power_v1_set_mode_event *event = data; struct output *output = event->output->data; assert(output); - + struct output *mirror = output_get_usable_mirror(output); switch (event->mode) { case ZWLR_OUTPUT_POWER_V1_MODE_OFF: if (!event->output->enabled) { return; } + if (mirror) { + struct view *view; + for_each_view(view, &server.views, LAB_VIEW_CRITERIA_NONE) { + if (view->output == output) { + view->output = mirror; + } + } + } wlr_output_state_set_enabled(&output->pending, false); output_state_commit(output); break;