rework outputmgrapplyortest()

first disable requested monitors, then enable and/or change mode, x and y, etc.
This is mostly what sway does
This commit is contained in:
Leonardo Hernández Hernández 2022-08-10 23:57:03 -05:00 committed by Leonardo Hernández
parent 3431ac165d
commit b6e3fc1645
1 changed files with 35 additions and 21 deletions

56
dwl.c
View File

@ -1583,34 +1583,48 @@ outputmgrapplyortest(struct wlr_output_configuration_v1 *config, int test)
struct wlr_output_configuration_head_v1 *config_head; struct wlr_output_configuration_head_v1 *config_head;
int ok = 1; int ok = 1;
/* First disable outputs we need to disable */
wl_list_for_each(config_head, &config->heads, link) { wl_list_for_each(config_head, &config->heads, link) {
struct wlr_output *wlr_output = config_head->state.output; struct wlr_output *wlr_output = config_head->state.output;
if (!wlr_output->enabled || config_head->state.enabled)
wlr_output_enable(wlr_output, config_head->state.enabled); continue;
if (config_head->state.enabled) { wlr_output_enable(wlr_output, 0);
if (config_head->state.mode) if (test) {
wlr_output_set_mode(wlr_output, config_head->state.mode); ok &= wlr_output_test(wlr_output);
else wlr_output_rollback(wlr_output);
wlr_output_set_custom_mode(wlr_output, } else {
config_head->state.custom_mode.width, ok &= wlr_output_commit(wlr_output);
config_head->state.custom_mode.height,
config_head->state.custom_mode.refresh);
wlr_output_layout_move(output_layout, wlr_output,
config_head->state.x, config_head->state.y);
wlr_output_set_transform(wlr_output, config_head->state.transform);
wlr_output_set_scale(wlr_output, config_head->state.scale);
} }
}
if (!(ok = wlr_output_test(wlr_output))) /* Then enable outputs that need to */
break;
}
wl_list_for_each(config_head, &config->heads, link) { wl_list_for_each(config_head, &config->heads, link) {
if (ok && !test) struct wlr_output *wlr_output = config_head->state.output;
wlr_output_commit(config_head->state.output); if (!config_head->state.enabled)
continue;
wlr_output_enable(wlr_output, 1);
if (config_head->state.mode)
wlr_output_set_mode(wlr_output, config_head->state.mode);
else else
wlr_output_rollback(config_head->state.output); wlr_output_set_custom_mode(wlr_output,
config_head->state.custom_mode.width,
config_head->state.custom_mode.height,
config_head->state.custom_mode.refresh);
wlr_output_layout_move(output_layout, wlr_output,
config_head->state.x, config_head->state.y);
wlr_output_set_transform(wlr_output, config_head->state.transform);
wlr_output_set_scale(wlr_output, config_head->state.scale);
if (test) {
ok &= wlr_output_test(wlr_output);
wlr_output_rollback(wlr_output);
} else {
ok &= wlr_output_commit(wlr_output);
}
} }
if (ok) if (ok)
wlr_output_configuration_v1_send_succeeded(config); wlr_output_configuration_v1_send_succeeded(config);
else else