aboutsummaryrefslogtreecommitdiffstats
path: root/sway/desktop/output.c
diff options
context:
space:
mode:
authorLibravatar Simon Ser <contact@emersion.fr>2020-07-10 18:04:45 +0200
committerLibravatar Simon Ser <contact@emersion.fr>2020-07-15 19:27:12 +0200
commitd5f5885c941d9f74f131734b253133108c759e20 (patch)
tree59b5e3e01b63e7a8a8d5c794f776dc24913565b5 /sway/desktop/output.c
parentReload command now matches i3's implementation (diff)
downloadsway-d5f5885c941d9f74f131734b253133108c759e20.tar.gz
sway-d5f5885c941d9f74f131734b253133108c759e20.tar.zst
sway-d5f5885c941d9f74f131734b253133108c759e20.zip
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 (cherry picked from commit 5432f00adfdd8375fb422ad9033253d17f04efc7)
Diffstat (limited to 'sway/desktop/output.c')
-rw-r--r--sway/desktop/output.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index 4a51b5cc..5fdaba68 100644
--- a/sway/desktop/output.c
+++ b/sway/desktop/output.c
@@ -844,7 +844,7 @@ static void handle_destroy(struct wl_listener *listener, void *data) {
844 844
845static void handle_mode(struct wl_listener *listener, void *data) { 845static void handle_mode(struct wl_listener *listener, void *data) {
846 struct sway_output *output = wl_container_of(listener, output, mode); 846 struct sway_output *output = wl_container_of(listener, output, mode);
847 if (!output->configured && !output->enabled) { 847 if (!output->enabled && !output->enabling) {
848 struct output_config *oc = find_output_config(output); 848 struct output_config *oc = find_output_config(output);
849 if (output->wlr_output->current_mode != NULL && 849 if (output->wlr_output->current_mode != NULL &&
850 (!oc || oc->enabled)) { 850 (!oc || oc->enabled)) {
@@ -857,7 +857,7 @@ static void handle_mode(struct wl_listener *listener, void *data) {
857 } 857 }
858 return; 858 return;
859 } 859 }
860 if (!output->enabled || !output->configured) { 860 if (!output->enabled) {
861 return; 861 return;
862 } 862 }
863 arrange_layers(output); 863 arrange_layers(output);
@@ -869,7 +869,7 @@ static void handle_mode(struct wl_listener *listener, void *data) {
869 869
870static void handle_transform(struct wl_listener *listener, void *data) { 870static void handle_transform(struct wl_listener *listener, void *data) {
871 struct sway_output *output = wl_container_of(listener, output, transform); 871 struct sway_output *output = wl_container_of(listener, output, transform);
872 if (!output->enabled || !output->configured) { 872 if (!output->enabled) {
873 return; 873 return;
874 } 874 }
875 arrange_layers(output); 875 arrange_layers(output);
@@ -886,7 +886,7 @@ static void update_textures(struct sway_container *con, void *data) {
886 886
887static void handle_scale(struct wl_listener *listener, void *data) { 887static void handle_scale(struct wl_listener *listener, void *data) {
888 struct sway_output *output = wl_container_of(listener, output, scale); 888 struct sway_output *output = wl_container_of(listener, output, scale);
889 if (!output->enabled || !output->configured) { 889 if (!output->enabled) {
890 return; 890 return;
891 } 891 }
892 arrange_layers(output); 892 arrange_layers(output);