mirror of
https://github.com/swaywm/sway.git
synced 2025-11-24 06:59:51 -05:00
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:
parent
ea3ba203cc
commit
5432f00adf
5 changed files with 23 additions and 26 deletions
|
|
@ -397,17 +397,8 @@ bool apply_output_config(struct output_config *oc, struct sway_output *output) {
|
|||
|
||||
struct wlr_output *wlr_output = output->wlr_output;
|
||||
|
||||
bool was_enabled = output->enabled;
|
||||
if (oc && !oc->enabled) {
|
||||
// Output is configured to be disabled
|
||||
sway_log(SWAY_DEBUG, "Disabling output %s", oc->name);
|
||||
if (output->enabled) {
|
||||
output_disable(output);
|
||||
wlr_output_layout_remove(root->output_layout, wlr_output);
|
||||
}
|
||||
} else {
|
||||
output->enabled = true;
|
||||
}
|
||||
// Flag to prevent the output mode event handler from calling us
|
||||
output->enabling = (!oc || oc->enabled);
|
||||
|
||||
queue_output_config(oc, output);
|
||||
|
||||
|
|
@ -421,11 +412,18 @@ bool apply_output_config(struct output_config *oc, struct sway_output *output) {
|
|||
// Leave the output disabled for now and try again when the output gets
|
||||
// the mode we asked for.
|
||||
sway_log(SWAY_ERROR, "Failed to commit output %s", wlr_output->name);
|
||||
output->enabled = was_enabled;
|
||||
output->enabling = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
output->enabling = false;
|
||||
|
||||
if (oc && !oc->enabled) {
|
||||
sway_log(SWAY_DEBUG, "Disabling output %s", oc->name);
|
||||
if (output->enabled) {
|
||||
output_disable(output);
|
||||
wlr_output_layout_remove(root->output_layout, wlr_output);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -468,8 +466,8 @@ bool apply_output_config(struct output_config *oc, struct sway_output *output) {
|
|||
output->width = output_box->width;
|
||||
output->height = output_box->height;
|
||||
|
||||
if (!output->configured) {
|
||||
output_configure(output);
|
||||
if (!output->enabled) {
|
||||
output_enable(output);
|
||||
}
|
||||
|
||||
if (oc && oc->max_render_time >= 0) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue