aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2023-02-21 09:38:41 +0100
committerIsaac Freund <mail@isaacfreund.com>2023-03-28 22:58:29 +0000
commite8a2f76eb495580ad81634a575a48f06ea74eb6a (patch)
tree0943df0b646a76a91122392ebeb68af42d1a9669
parente00c4cd7dc14862503513dc029aa4d3db1d70865 (diff)
backend/wayland: only re-order sub-surfaces when necessary
-rw-r--r--backend/wayland/output.c24
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);
}