|
|
|
@ -98,6 +98,22 @@ populate_compound_surface(struct compound_surface *com, struct client *client) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
fini_compound_surface(struct compound_surface *com) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < NUM_SUBSURFACES; i++) { |
|
|
|
|
if (com->sub[i]) |
|
|
|
|
wl_subsurface_destroy(com->sub[i]); |
|
|
|
|
if (com->child[i]) |
|
|
|
|
wl_surface_destroy(com->child[i]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
wl_surface_destroy(com->parent); |
|
|
|
|
wl_subcompositor_destroy(com->subco); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_basic_protocol) |
|
|
|
|
{ |
|
|
|
|
struct client *client; |
|
|
|
@ -111,6 +127,10 @@ TEST(test_subsurface_basic_protocol) |
|
|
|
|
populate_compound_surface(&com2, client); |
|
|
|
|
|
|
|
|
|
client_roundtrip(client); |
|
|
|
|
|
|
|
|
|
fini_compound_surface(&com1); |
|
|
|
|
fini_compound_surface(&com2); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_position_protocol) |
|
|
|
@ -128,6 +148,9 @@ TEST(test_subsurface_position_protocol) |
|
|
|
|
(i + 2) * 20, (i + 2) * 10); |
|
|
|
|
|
|
|
|
|
client_roundtrip(client); |
|
|
|
|
|
|
|
|
|
fini_compound_surface(&com); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_placement_protocol) |
|
|
|
@ -146,6 +169,9 @@ TEST(test_subsurface_placement_protocol) |
|
|
|
|
wl_subsurface_place_below(com.sub[1], com.parent); |
|
|
|
|
|
|
|
|
|
client_roundtrip(client); |
|
|
|
|
|
|
|
|
|
fini_compound_surface(&com); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_paradox) |
|
|
|
@ -153,6 +179,7 @@ TEST(test_subsurface_paradox) |
|
|
|
|
struct client *client; |
|
|
|
|
struct wl_surface *parent; |
|
|
|
|
struct wl_subcompositor *subco; |
|
|
|
|
struct wl_subsurface *sub; |
|
|
|
|
|
|
|
|
|
client = create_client_and_test_surface(100, 50, 123, 77); |
|
|
|
|
assert(client); |
|
|
|
@ -161,16 +188,22 @@ TEST(test_subsurface_paradox) |
|
|
|
|
parent = wl_compositor_create_surface(client->wl_compositor); |
|
|
|
|
|
|
|
|
|
/* surface is its own parent */ |
|
|
|
|
wl_subcompositor_get_subsurface(subco, parent, parent); |
|
|
|
|
sub = wl_subcompositor_get_subsurface(subco, parent, parent); |
|
|
|
|
|
|
|
|
|
expect_protocol_error(client, &wl_subcompositor_interface, |
|
|
|
|
WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE); |
|
|
|
|
|
|
|
|
|
wl_subsurface_destroy(sub); |
|
|
|
|
wl_surface_destroy(parent); |
|
|
|
|
wl_subcompositor_destroy(subco); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_identical_link) |
|
|
|
|
{ |
|
|
|
|
struct client *client; |
|
|
|
|
struct compound_surface com; |
|
|
|
|
struct wl_subsurface *sub; |
|
|
|
|
|
|
|
|
|
client = create_client_and_test_surface(100, 50, 123, 77); |
|
|
|
|
assert(client); |
|
|
|
@ -178,10 +211,14 @@ TEST(test_subsurface_identical_link) |
|
|
|
|
populate_compound_surface(&com, client); |
|
|
|
|
|
|
|
|
|
/* surface is already a subsurface */ |
|
|
|
|
wl_subcompositor_get_subsurface(com.subco, com.child[0], com.parent); |
|
|
|
|
sub = wl_subcompositor_get_subsurface(com.subco, com.child[0], com.parent); |
|
|
|
|
|
|
|
|
|
expect_protocol_error(client, &wl_subcompositor_interface, |
|
|
|
|
WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE); |
|
|
|
|
|
|
|
|
|
wl_subsurface_destroy(sub); |
|
|
|
|
fini_compound_surface(&com); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_change_link) |
|
|
|
@ -189,6 +226,7 @@ TEST(test_subsurface_change_link) |
|
|
|
|
struct client *client; |
|
|
|
|
struct compound_surface com; |
|
|
|
|
struct wl_surface *stranger; |
|
|
|
|
struct wl_subsurface *sub; |
|
|
|
|
|
|
|
|
|
client = create_client_and_test_surface(100, 50, 123, 77); |
|
|
|
|
assert(client); |
|
|
|
@ -197,10 +235,15 @@ TEST(test_subsurface_change_link) |
|
|
|
|
populate_compound_surface(&com, client); |
|
|
|
|
|
|
|
|
|
/* surface is already a subsurface */ |
|
|
|
|
wl_subcompositor_get_subsurface(com.subco, com.child[0], stranger); |
|
|
|
|
sub = wl_subcompositor_get_subsurface(com.subco, com.child[0], stranger); |
|
|
|
|
|
|
|
|
|
expect_protocol_error(client, &wl_subcompositor_interface, |
|
|
|
|
WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE); |
|
|
|
|
|
|
|
|
|
fini_compound_surface(&com); |
|
|
|
|
wl_subsurface_destroy(sub); |
|
|
|
|
wl_surface_destroy(stranger); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_nesting) |
|
|
|
@ -208,6 +251,7 @@ TEST(test_subsurface_nesting) |
|
|
|
|
struct client *client; |
|
|
|
|
struct compound_surface com; |
|
|
|
|
struct wl_surface *stranger; |
|
|
|
|
struct wl_subsurface *sub; |
|
|
|
|
|
|
|
|
|
client = create_client_and_test_surface(100, 50, 123, 77); |
|
|
|
|
assert(client); |
|
|
|
@ -216,9 +260,14 @@ TEST(test_subsurface_nesting) |
|
|
|
|
populate_compound_surface(&com, client); |
|
|
|
|
|
|
|
|
|
/* parent is a sub-surface */ |
|
|
|
|
wl_subcompositor_get_subsurface(com.subco, stranger, com.child[0]); |
|
|
|
|
sub = wl_subcompositor_get_subsurface(com.subco, stranger, com.child[0]); |
|
|
|
|
|
|
|
|
|
client_roundtrip(client); |
|
|
|
|
|
|
|
|
|
wl_subsurface_destroy(sub); |
|
|
|
|
wl_surface_destroy(stranger); |
|
|
|
|
fini_compound_surface(&com); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_nesting_parent) |
|
|
|
@ -226,6 +275,7 @@ TEST(test_subsurface_nesting_parent) |
|
|
|
|
struct client *client; |
|
|
|
|
struct compound_surface com; |
|
|
|
|
struct wl_surface *stranger; |
|
|
|
|
struct wl_subsurface *sub; |
|
|
|
|
|
|
|
|
|
client = create_client_and_test_surface(100, 50, 123, 77); |
|
|
|
|
assert(client); |
|
|
|
@ -234,16 +284,23 @@ TEST(test_subsurface_nesting_parent) |
|
|
|
|
populate_compound_surface(&com, client); |
|
|
|
|
|
|
|
|
|
/* surface is already a parent */ |
|
|
|
|
wl_subcompositor_get_subsurface(com.subco, com.parent, stranger); |
|
|
|
|
sub = wl_subcompositor_get_subsurface(com.subco, com.parent, stranger); |
|
|
|
|
|
|
|
|
|
client_roundtrip(client); |
|
|
|
|
|
|
|
|
|
wl_subsurface_destroy(sub); |
|
|
|
|
fini_compound_surface(&com); |
|
|
|
|
wl_surface_destroy(stranger); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_loop_paradox) |
|
|
|
|
{ |
|
|
|
|
struct client *client; |
|
|
|
|
struct wl_surface *surface[3]; |
|
|
|
|
struct wl_subsurface *sub[3]; |
|
|
|
|
struct wl_subcompositor *subco; |
|
|
|
|
unsigned i; |
|
|
|
|
|
|
|
|
|
client = create_client_and_test_surface(100, 50, 123, 77); |
|
|
|
|
assert(client); |
|
|
|
@ -254,12 +311,20 @@ TEST(test_subsurface_loop_paradox) |
|
|
|
|
surface[2] = wl_compositor_create_surface(client->wl_compositor); |
|
|
|
|
|
|
|
|
|
/* create a nesting loop */ |
|
|
|
|
wl_subcompositor_get_subsurface(subco, surface[1], surface[0]); |
|
|
|
|
wl_subcompositor_get_subsurface(subco, surface[2], surface[1]); |
|
|
|
|
wl_subcompositor_get_subsurface(subco, surface[0], surface[2]); |
|
|
|
|
sub[0] = wl_subcompositor_get_subsurface(subco, surface[1], surface[0]); |
|
|
|
|
sub[1] = wl_subcompositor_get_subsurface(subco, surface[2], surface[1]); |
|
|
|
|
sub[2] = wl_subcompositor_get_subsurface(subco, surface[0], surface[2]); |
|
|
|
|
|
|
|
|
|
expect_protocol_error(client, &wl_subcompositor_interface, |
|
|
|
|
WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_LENGTH(sub); i++) { |
|
|
|
|
wl_subsurface_destroy(sub[i]); |
|
|
|
|
wl_surface_destroy(surface[i]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
wl_subcompositor_destroy(subco); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_place_above_nested_parent) |
|
|
|
@ -282,6 +347,12 @@ TEST(test_subsurface_place_above_nested_parent) |
|
|
|
|
wl_subsurface_place_above(sub, com.child[0]); |
|
|
|
|
|
|
|
|
|
client_roundtrip(client); |
|
|
|
|
|
|
|
|
|
wl_subsurface_destroy(sub); |
|
|
|
|
wl_surface_destroy(grandchild); |
|
|
|
|
wl_subcompositor_destroy(subco); |
|
|
|
|
fini_compound_surface(&com); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_place_above_grandparent) |
|
|
|
@ -306,6 +377,12 @@ TEST(test_subsurface_place_above_grandparent) |
|
|
|
|
|
|
|
|
|
expect_protocol_error(client, &wl_subsurface_interface, |
|
|
|
|
WL_SUBSURFACE_ERROR_BAD_SURFACE); |
|
|
|
|
|
|
|
|
|
wl_subsurface_destroy(sub); |
|
|
|
|
wl_surface_destroy(grandchild); |
|
|
|
|
wl_subcompositor_destroy(subco); |
|
|
|
|
fini_compound_surface(&com); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_place_above_great_aunt) |
|
|
|
@ -330,6 +407,12 @@ TEST(test_subsurface_place_above_great_aunt) |
|
|
|
|
|
|
|
|
|
expect_protocol_error(client, &wl_subsurface_interface, |
|
|
|
|
WL_SUBSURFACE_ERROR_BAD_SURFACE); |
|
|
|
|
|
|
|
|
|
wl_subsurface_destroy(sub); |
|
|
|
|
wl_surface_destroy(grandchild); |
|
|
|
|
wl_subcompositor_destroy(subco); |
|
|
|
|
fini_compound_surface(&com); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_place_above_child) |
|
|
|
@ -338,6 +421,7 @@ TEST(test_subsurface_place_above_child) |
|
|
|
|
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); |
|
|
|
@ -346,13 +430,19 @@ TEST(test_subsurface_place_above_child) |
|
|
|
|
|
|
|
|
|
subco = get_subcompositor(client); |
|
|
|
|
grandchild = wl_compositor_create_surface(client->wl_compositor); |
|
|
|
|
wl_subcompositor_get_subsurface(subco, grandchild, com.child[0]); |
|
|
|
|
sub = wl_subcompositor_get_subsurface(subco, grandchild, com.child[0]); |
|
|
|
|
|
|
|
|
|
/* can't place a subsurface above its own child subsurface */ |
|
|
|
|
wl_subsurface_place_above(com.sub[0], grandchild); |
|
|
|
|
|
|
|
|
|
expect_protocol_error(client, &wl_subsurface_interface, |
|
|
|
|
WL_SUBSURFACE_ERROR_BAD_SURFACE); |
|
|
|
|
|
|
|
|
|
wl_subsurface_destroy(sub); |
|
|
|
|
wl_surface_destroy(grandchild); |
|
|
|
|
wl_subcompositor_destroy(subco); |
|
|
|
|
fini_compound_surface(&com); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_place_below_nested_parent) |
|
|
|
@ -375,6 +465,12 @@ TEST(test_subsurface_place_below_nested_parent) |
|
|
|
|
wl_subsurface_place_below(sub, com.child[0]); |
|
|
|
|
|
|
|
|
|
client_roundtrip(client); |
|
|
|
|
|
|
|
|
|
wl_subsurface_destroy(sub); |
|
|
|
|
wl_surface_destroy(grandchild); |
|
|
|
|
wl_subcompositor_destroy(subco); |
|
|
|
|
fini_compound_surface(&com); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_place_below_grandparent) |
|
|
|
@ -399,6 +495,12 @@ TEST(test_subsurface_place_below_grandparent) |
|
|
|
|
|
|
|
|
|
expect_protocol_error(client, &wl_subsurface_interface, |
|
|
|
|
WL_SUBSURFACE_ERROR_BAD_SURFACE); |
|
|
|
|
|
|
|
|
|
wl_subsurface_destroy(sub); |
|
|
|
|
wl_surface_destroy(grandchild); |
|
|
|
|
wl_subcompositor_destroy(subco); |
|
|
|
|
fini_compound_surface(&com); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_place_below_great_aunt) |
|
|
|
@ -423,6 +525,12 @@ TEST(test_subsurface_place_below_great_aunt) |
|
|
|
|
|
|
|
|
|
expect_protocol_error(client, &wl_subsurface_interface, |
|
|
|
|
WL_SUBSURFACE_ERROR_BAD_SURFACE); |
|
|
|
|
|
|
|
|
|
wl_subsurface_destroy(sub); |
|
|
|
|
wl_surface_destroy(grandchild); |
|
|
|
|
wl_subcompositor_destroy(subco); |
|
|
|
|
fini_compound_surface(&com); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_place_below_child) |
|
|
|
@ -431,6 +539,7 @@ TEST(test_subsurface_place_below_child) |
|
|
|
|
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); |
|
|
|
@ -439,13 +548,19 @@ TEST(test_subsurface_place_below_child) |
|
|
|
|
|
|
|
|
|
subco = get_subcompositor(client); |
|
|
|
|
grandchild = wl_compositor_create_surface(client->wl_compositor); |
|
|
|
|
wl_subcompositor_get_subsurface(subco, grandchild, com.child[0]); |
|
|
|
|
sub = wl_subcompositor_get_subsurface(subco, grandchild, com.child[0]); |
|
|
|
|
|
|
|
|
|
/* can't place a subsurface below its own child subsurface */ |
|
|
|
|
wl_subsurface_place_below(com.sub[0], grandchild); |
|
|
|
|
|
|
|
|
|
expect_protocol_error(client, &wl_subsurface_interface, |
|
|
|
|
WL_SUBSURFACE_ERROR_BAD_SURFACE); |
|
|
|
|
|
|
|
|
|
wl_subsurface_destroy(sub); |
|
|
|
|
wl_surface_destroy(grandchild); |
|
|
|
|
wl_subcompositor_destroy(subco); |
|
|
|
|
fini_compound_surface(&com); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_place_above_stranger) |
|
|
|
@ -465,6 +580,10 @@ TEST(test_subsurface_place_above_stranger) |
|
|
|
|
|
|
|
|
|
expect_protocol_error(client, &wl_subsurface_interface, |
|
|
|
|
WL_SUBSURFACE_ERROR_BAD_SURFACE); |
|
|
|
|
|
|
|
|
|
wl_surface_destroy(stranger); |
|
|
|
|
fini_compound_surface(&com); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_place_below_stranger) |
|
|
|
@ -484,6 +603,10 @@ TEST(test_subsurface_place_below_stranger) |
|
|
|
|
|
|
|
|
|
expect_protocol_error(client, &wl_subsurface_interface, |
|
|
|
|
WL_SUBSURFACE_ERROR_BAD_SURFACE); |
|
|
|
|
|
|
|
|
|
wl_surface_destroy(stranger); |
|
|
|
|
fini_compound_surface(&com); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_place_above_foreign) |
|
|
|
@ -503,6 +626,10 @@ TEST(test_subsurface_place_above_foreign) |
|
|
|
|
|
|
|
|
|
expect_protocol_error(client, &wl_subsurface_interface, |
|
|
|
|
WL_SUBSURFACE_ERROR_BAD_SURFACE); |
|
|
|
|
|
|
|
|
|
fini_compound_surface(&com1); |
|
|
|
|
fini_compound_surface(&com2); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_place_below_foreign) |
|
|
|
@ -522,6 +649,10 @@ TEST(test_subsurface_place_below_foreign) |
|
|
|
|
|
|
|
|
|
expect_protocol_error(client, &wl_subsurface_interface, |
|
|
|
|
WL_SUBSURFACE_ERROR_BAD_SURFACE); |
|
|
|
|
|
|
|
|
|
fini_compound_surface(&com1); |
|
|
|
|
fini_compound_surface(&com2); |
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(test_subsurface_destroy_protocol) |
|
|
|
@ -555,6 +686,8 @@ TEST(test_subsurface_destroy_protocol) |
|
|
|
|
wl_subsurface_destroy(com.sub[1]); |
|
|
|
|
|
|
|
|
|
client_roundtrip(client); |
|
|
|
|
|
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
@ -621,6 +754,8 @@ create_subsurface_tree(struct client *client, struct wl_surface **surfs, |
|
|
|
|
|
|
|
|
|
#undef SUB_LINK |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
wl_subcompositor_destroy(subco); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
@ -765,4 +900,6 @@ TEST(test_subsurface_destroy_permutations) |
|
|
|
|
|
|
|
|
|
client_roundtrip(client); |
|
|
|
|
testlog("tried %d destroy permutations\n", counter); |
|
|
|
|
|
|
|
|
|
client_destroy(client); |
|
|
|
|
} |
|
|
|
|