aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKirill Primak <vyivel@posteo.net>2021-08-17 15:20:37 +0300
committerSimon Ser <contact@emersion.fr>2021-08-18 16:01:18 +0200
commit109405729b5a384b08f2faf6196e8a31041eab8f (patch)
treeae6da056fe01dc8af7be79312a30473b090259c5
parentcdd9a60f72e1067e3b7b0ad1846e83f489e51be2 (diff)
surface: fix place_below handling
If a subsurface is being placed below a subsurface right above it, this should be a noop. However, `node` pointed to the subsurface that was moved, which resulted in `subsurface->parent_pending_link` being inserted into itself, breaking parent's pending subsurface list. This commit separates finding the requested node and getting it's `prev` field, fixing the issue.
-rw-r--r--types/wlr_surface.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/types/wlr_surface.c b/types/wlr_surface.c
index 620a5256..be872b7c 100644
--- a/types/wlr_surface.c
+++ b/types/wlr_surface.c
@@ -961,7 +961,7 @@ static void subsurface_handle_place_below(struct wl_client *client,
struct wl_list *node;
if (sibling_surface == subsurface->parent) {
- node = subsurface->parent->subsurfaces_pending_below.prev;
+ node = &subsurface->parent->subsurfaces_pending_below;
} else {
struct wlr_subsurface *sibling =
subsurface_find_sibling(subsurface, sibling_surface);
@@ -972,11 +972,11 @@ static void subsurface_handle_place_below(struct wl_client *client,
"place_below", wl_resource_get_id(sibling_resource));
return;
}
- node = sibling->parent_pending_link.prev;
+ node = &sibling->parent_pending_link;
}
wl_list_remove(&subsurface->parent_pending_link);
- wl_list_insert(node, &subsurface->parent_pending_link);
+ wl_list_insert(node->prev, &subsurface->parent_pending_link);
subsurface->reordered = true;
}