first disable requested monitors, then enable and/or change mode, x and y, etc. This is mostly what sway does
LWFDWL3LH5PLBYUJJKI6C24PXWIRLE2UF64GVFLB23JWBSJHJQDQC
ECWSMUGSFAFGG3BNRFXTRJRC3NLZF67M5RSSW6AXAZP42O3F4VPQC
LYYPWYVJLPUXGDW4QBAUY3643G3ZUNLL65VCYM42Z7WPGYE3E6JQC
ZSSVUMLBSC7P4VMBM5GPNOBJGCUGYQGSU5SXIIZWX54Y674EZWDAC
NLOBELMSKHUSKSMPZ2QSDVIOJRGWV7HNXNIKZ55TMUCH7DI73TAAC
7B74AT3BXYB7PVW4F6SGQNPMHOU5TEV5TZ54CG6VSQI46XSEKWXQC
AIDYDXHNT7UR4GXSJFEYFSB4NG4VLJFBRU655SRHWRRXSOZTRWHAC
RFDLUIJFB6GDI3FPSAWV66ZLOSMCJG6OWKORIWTVUZPSGTK4OL5QC
Z5S64ZSKKSAUU62WBIQFYQP6B6M2STGV7PSJKEL2FGC4VRLWFLDAC
wlr_output_enable(wlr_output, config_head->state.enabled);
if (config_head->state.enabled) {
if (config_head->state.mode)
wlr_output_set_mode(wlr_output, config_head->state.mode);
else
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 (!wlr_output->enabled || config_head->state.enabled)
continue;
wlr_output_enable(wlr_output, 0);
if (test) {
ok &= wlr_output_test(wlr_output);
wlr_output_rollback(wlr_output);
} else {
ok &= wlr_output_commit(wlr_output);
if (ok && !test)
wlr_output_commit(config_head->state.output);
struct wlr_output *wlr_output = 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);
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);
}