diff options
author | Simon Ser <contact@emersion.fr> | 2023-02-21 09:38:41 +0100 |
---|---|---|
committer | Isaac Freund <mail@isaacfreund.com> | 2023-03-28 22:58:29 +0000 |
commit | e8a2f76eb495580ad81634a575a48f06ea74eb6a (patch) | |
tree | 0943df0b646a76a91122392ebeb68af42d1a9669 /backend | |
parent | e00c4cd7dc14862503513dc029aa4d3db1d70865 (diff) |
backend/wayland: only re-order sub-surfaces when necessary
Diffstat (limited to 'backend')
-rw-r--r-- | backend/wayland/output.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/backend/wayland/output.c b/backend/wayland/output.c index 3f16388d..1fa2cd32 100644 --- a/backend/wayland/output.c +++ b/backend/wayland/output.c @@ -345,6 +345,25 @@ static struct wlr_wl_output_layer *get_or_create_output_layer( return layer; } +static bool has_layers_order_changed(struct wlr_wl_output *output, + struct wlr_output_layer_state *layers, size_t layers_len) { + size_t i = 0; + struct wlr_output_layer *layer; + wl_list_for_each(layer, &output->wlr_output.layers, link) { + if (i >= layers_len) { + return true; + } + + const struct wlr_output_layer_state *layer_state = &layers[i]; + if (layer_state->layer != layer) { + return true; + } + + i++; + } + return i != layers_len; +} + static bool output_layer_commit(struct wlr_wl_output *output, struct wlr_wl_output_layer *layer, const struct wlr_output_layer_state *state) { @@ -372,6 +391,8 @@ static bool commit_layers(struct wlr_wl_output *output, return true; } + bool reordered = has_layers_order_changed(output, layers, layers_len); + struct wlr_wl_output_layer *prev_layer = NULL; for (size_t i = 0; i < layers_len; i++) { struct wlr_wl_output_layer *layer = @@ -388,8 +409,7 @@ static bool commit_layers(struct wlr_wl_output *output, continue; } - // TODO: only do this if layers were re-ordered - if (prev_layer != NULL) { + if (prev_layer != NULL && reordered) { wl_subsurface_place_above(layer->subsurface, prev_layer->surface); } |