From ab032822958dd3041f478c48498f17e5d259dd6f Mon Sep 17 00:00:00 2001 From: "Devin J. Pohly" Date: Mon, 18 Jan 2021 15:02:15 -0600 Subject: [PATCH] commit entire output config, or fail and rollback The wlr-output-management protocol requires that either all of the changes from an apply request be applied successfully, in which case a "succeeded" event is sent, or all of the changes are reverted and a "failed" event is sent. As written, this could partially commit changes, then fail. Test the changes first (even for an "apply" event), then commit or rollback as appropriate. --- dwl.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/dwl.c b/dwl.c index d3d0d5e..ef51b0c 100644 --- a/dwl.c +++ b/dwl.c @@ -1545,11 +1545,14 @@ outputmgrapplyortest(struct wlr_output_configuration_v1 *config, int test) } } - if (test) { - ok &= wlr_output_test(wlr_output); - wlr_output_rollback(wlr_output); - } else - ok &= wlr_output_commit(wlr_output); + if (!(ok = wlr_output_test(wlr_output))) + break; + } + wl_list_for_each(config_head, &config->heads, link) { + if (ok && !test) + wlr_output_commit(config_head->state.output); + else + wlr_output_rollback(config_head->state.output); } if (ok) wlr_output_configuration_v1_send_succeeded(config);