compositor: allow using nested parent as a subsurface sibling
The parent of a subsurface can be used as a sibling in the place_below and place_above calls. However this did not work when the parent is nested, so fix the sibling check and add a test to check this case. Signed-off-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:
parent
11f8fcbefe
commit
b8c16c995b
@ -3521,17 +3521,16 @@ subsurface_set_position(struct wl_client *client,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct weston_subsurface *
|
static struct weston_subsurface *
|
||||||
subsurface_from_surface(struct weston_surface *surface)
|
subsurface_find_sibling(struct weston_subsurface *sub,
|
||||||
|
struct weston_surface *surface)
|
||||||
{
|
{
|
||||||
struct weston_subsurface *sub;
|
struct weston_surface *parent = sub->parent;
|
||||||
|
struct weston_subsurface *sibling;
|
||||||
|
|
||||||
sub = weston_surface_to_subsurface(surface);
|
wl_list_for_each(sibling, &parent->subsurface_list, parent_link) {
|
||||||
if (sub)
|
if (sibling->surface == surface && sibling != sub)
|
||||||
return sub;
|
return sibling;
|
||||||
|
}
|
||||||
wl_list_for_each(sub, &surface->subsurface_list, parent_link)
|
|
||||||
if (sub->surface == surface)
|
|
||||||
return sub;
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -3543,8 +3542,7 @@ subsurface_sibling_check(struct weston_subsurface *sub,
|
|||||||
{
|
{
|
||||||
struct weston_subsurface *sibling;
|
struct weston_subsurface *sibling;
|
||||||
|
|
||||||
sibling = subsurface_from_surface(surface);
|
sibling = subsurface_find_sibling(sub, surface);
|
||||||
|
|
||||||
if (!sibling) {
|
if (!sibling) {
|
||||||
wl_resource_post_error(sub->resource,
|
wl_resource_post_error(sub->resource,
|
||||||
WL_SUBSURFACE_ERROR_BAD_SURFACE,
|
WL_SUBSURFACE_ERROR_BAD_SURFACE,
|
||||||
@ -3553,13 +3551,7 @@ subsurface_sibling_check(struct weston_subsurface *sub,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sibling->parent != sub->parent) {
|
assert(sibling->parent == sub->parent);
|
||||||
wl_resource_post_error(sub->resource,
|
|
||||||
WL_SUBSURFACE_ERROR_BAD_SURFACE,
|
|
||||||
"%s: wl_surface@%d has a different parent",
|
|
||||||
request, wl_resource_get_id(surface->resource));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sibling;
|
return sibling;
|
||||||
}
|
}
|
||||||
|
@ -250,6 +250,50 @@ TEST(test_subsurface_loop_paradox)
|
|||||||
WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE);
|
WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(test_subsurface_place_above_nested_parent)
|
||||||
|
{
|
||||||
|
struct client *client;
|
||||||
|
struct compound_surface com;
|
||||||
|
struct wl_surface *grandchild;
|
||||||
|
struct wl_subcompositor *subco;
|
||||||
|
struct wl_subsurface *sub;
|
||||||
|
|
||||||
|
client = create_client_and_test_surface(100, 50, 123, 77);
|
||||||
|
assert(client);
|
||||||
|
|
||||||
|
populate_compound_surface(&com, client);
|
||||||
|
|
||||||
|
subco = get_subcompositor(client);
|
||||||
|
grandchild = wl_compositor_create_surface(client->wl_compositor);
|
||||||
|
sub = wl_subcompositor_get_subsurface(subco, grandchild, com.child[0]);
|
||||||
|
|
||||||
|
wl_subsurface_place_above(sub, com.child[0]);
|
||||||
|
|
||||||
|
client_roundtrip(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(test_subsurface_place_below_nested_parent)
|
||||||
|
{
|
||||||
|
struct client *client;
|
||||||
|
struct compound_surface com;
|
||||||
|
struct wl_subcompositor *subco;
|
||||||
|
struct wl_surface *grandchild;
|
||||||
|
struct wl_subsurface *sub;
|
||||||
|
|
||||||
|
client = create_client_and_test_surface(100, 50, 123, 77);
|
||||||
|
assert(client);
|
||||||
|
|
||||||
|
populate_compound_surface(&com, client);
|
||||||
|
|
||||||
|
subco = get_subcompositor(client);
|
||||||
|
grandchild = wl_compositor_create_surface(client->wl_compositor);
|
||||||
|
sub = wl_subcompositor_get_subsurface(subco, grandchild, com.child[0]);
|
||||||
|
|
||||||
|
wl_subsurface_place_below(sub, com.child[0]);
|
||||||
|
|
||||||
|
client_roundtrip(client);
|
||||||
|
}
|
||||||
|
|
||||||
TEST(test_subsurface_place_above_stranger)
|
TEST(test_subsurface_place_above_stranger)
|
||||||
{
|
{
|
||||||
struct client *client;
|
struct client *client;
|
||||||
|
Loading…
Reference in New Issue
Block a user