config/output: don't change output state before commit

Previously, we called output_disable prior to wlr_output_commit. This
mutates Sway's output state before the output commit actually succeeds.
This results in Sway's state getting out-of-sync with wlroots'.

An alternative fix [1] was to revert the changes made by output_disable
in case of failure. This is a little complicated. Instead, this patch
makes it so Sway's internal state is never changed before a successful
wlr_output commit.

We had two output flags: enabled and configured. However enabled was set
prior to the output becoming enabled, and was used to prevent the output
event handlers (specifically, the mode handler) from calling
apply_output_config again (infinite loop).

Rename enabled to enabling and use it exclusively for this purpose.
Rename configure to enabled, because that's what it really means.

[1]: https://github.com/swaywm/sway/pull/5521

Closes: https://github.com/swaywm/sway/issues/5483
This commit is contained in:
Simon Ser 2020-07-10 18:04:45 +02:00 committed by Brian Ashworth
parent ea3ba203cc
commit 5432f00adf
5 changed files with 23 additions and 26 deletions

View file

@ -110,12 +110,12 @@ struct sway_output *output_create(struct wlr_output *wlr_output) {
return output;
}
void output_configure(struct sway_output *output) {
if (!sway_assert(!output->configured, "output is already configured")) {
void output_enable(struct sway_output *output) {
if (!sway_assert(!output->enabled, "output is already enabled")) {
return;
}
struct wlr_output *wlr_output = output->wlr_output;
output->configured = true;
output->enabled = true;
list_add(root->outputs, output);
restore_workspaces(output);
@ -262,7 +262,6 @@ void output_disable(struct sway_output *output) {
list_del(root->outputs, index);
output->enabled = false;
output->configured = false;
output->current_mode = NULL;
arrange_root();