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) | |
| download | wlroots-109405729b5a384b08f2faf6196e8a31041eab8f.tar.xz | |
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;  } | 
