From 1b620900bad840e9d3579e924afe4634dbd0633f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= Date: Sat, 13 Jul 2024 23:35:21 -0600 Subject: [PATCH] use the new output swapchain manager in outputmgrapplyortest() --- dwl.c | 68 ++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 29 deletions(-) diff --git a/dwl.c b/dwl.c index 8a587d1..7c176f0 100644 --- a/dwl.c +++ b/dwl.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -1941,49 +1942,58 @@ outputmgrapplyortest(struct wlr_output_configuration_v1 *config, int test) * output_layout.change event, not here. */ struct wlr_output_configuration_head_v1 *config_head; - int ok = 1; + size_t states_len, i; + struct wlr_output_swapchain_manager swapchain_manager; + struct wlr_backend_output_state *states = wlr_output_configuration_v1_build_state(config, &states_len); + int ok = 0; + + if (!states) { + wlr_output_configuration_v1_send_failed(config); + return; + } + + wlr_output_swapchain_manager_init(&swapchain_manager, backend); + + ok = wlr_output_swapchain_manager_prepare(&swapchain_manager, states, states_len); + if (!ok || test) + goto out; + + for (i = 0; i < states_len; i++) { + Monitor *m = states[i].output->data; + wlr_scene_output_build_state(m->scene_output, &states[i].base, NULL); + } + + if (!(ok = wlr_backend_commit(backend, states, states_len))) + goto out; + + wlr_output_swapchain_manager_apply(&swapchain_manager); wl_list_for_each(config_head, &config->heads, link) { struct wlr_output *wlr_output = config_head->state.output; Monitor *m = wlr_output->data; - struct wlr_output_state state; /* Ensure displays previously disabled by wlr-output-power-management-v1 * are properly handled*/ m->asleep = 0; - wlr_output_state_init(&state); - wlr_output_state_set_enabled(&state, config_head->state.enabled); - if (!config_head->state.enabled) - goto apply_or_test; - - if (config_head->state.mode) - wlr_output_state_set_mode(&state, config_head->state.mode); - else - wlr_output_state_set_custom_mode(&state, - config_head->state.custom_mode.width, - config_head->state.custom_mode.height, - config_head->state.custom_mode.refresh); - - wlr_output_state_set_transform(&state, config_head->state.transform); - wlr_output_state_set_scale(&state, config_head->state.scale); - wlr_output_state_set_adaptive_sync_enabled(&state, - config_head->state.adaptive_sync_enabled); - -apply_or_test: - ok &= test ? wlr_output_test_state(wlr_output, &state) - : wlr_output_commit_state(wlr_output, &state); - /* Don't move monitors if position wouldn't change, this to avoid - * wlroots marking the output as manually configured. - * wlr_output_layout_add does not like disabled outputs */ - if (!test && wlr_output->enabled && (m->m.x != config_head->state.x || m->m.y != config_head->state.y)) + * wlroots marking the output as manually configured. + * wlr_output_layout_add does not like disabled outputs */ + if (config_head->state.enabled + && (m->m.x != config_head->state.x || m->m.y != config_head->state.y + || !wlr_output_layout_get(output_layout, wlr_output))) { wlr_output_layout_add(output_layout, wlr_output, config_head->state.x, config_head->state.y); - - wlr_output_state_finish(&state); + } } +out: + wlr_output_swapchain_manager_finish(&swapchain_manager); + for (i = 0; i < states_len; i++) + wlr_output_state_finish(&states[i].base); + + free(states); + if (ok) wlr_output_configuration_v1_send_succeeded(config); else