diff options
author | Kirill Primak <vyivel@posteo.net> | 2021-08-17 15:20:37 +0300 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2021-08-18 16:01:18 +0200 |
commit | 109405729b5a384b08f2faf6196e8a31041eab8f (patch) | |
tree | ae6da056fe01dc8af7be79312a30473b090259c5 | |
parent | cdd9a60f72e1067e3b7b0ad1846e83f489e51be2 (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.c | 6 |
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; } |