sdata->position.set = EINA_TRUE;
}
+static Eina_Bool
+_subsurface_sibling_check(E_Client *ec1, E_Client *ec2)
+{
+ E_Client *parent, *sibling;
+ Eina_List *l;
+
+ parent = ec1->comp_data->sub.data->parent;
+
+ EINA_LIST_FOREACH(parent->comp_data->sub.list_pending, l, sibling)
+ {
+ if ((sibling != ec1) && (sibling == ec2))
+ return EINA_TRUE;
+ }
+
+ EINA_LIST_FOREACH(parent->comp_data->sub.below_list_pending, l, sibling)
+ {
+ if ((sibling != ec1) && (sibling == ec2))
+ return EINA_TRUE;
+ }
+
+ return EINA_FALSE;
+}
+
static void
_e_comp_wl_subsurface_cb_place_above(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, struct wl_resource *sibling_resource)
{
if (!(parent = ec->comp_data->sub.data->parent)) return;
if (e_object_is_del(E_OBJECT(parent)) || !parent->comp_data) return;
+ if (!_subsurface_sibling_check(ec, ecs))
+ {
+ wl_resource_post_error(ec->comp_data->sub.data->resource,
+ WL_SUBSURFACE_ERROR_BAD_SURFACE,
+ "%s: wl_surface@%d is not a parent or sibling",
+ "place_above", wl_resource_get_id(ecs->comp_data->surface));
+ return;
+ }
+
parent->comp_data->sub.list_pending =
eina_list_remove(parent->comp_data->sub.list_pending, ec);
if (!(parent = ec->comp_data->sub.data->parent)) return;
if (e_object_is_del(E_OBJECT(parent)) || !parent->comp_data) return;
+ if (!_subsurface_sibling_check(ec, ecs))
+ {
+ wl_resource_post_error(ec->comp_data->sub.data->resource,
+ WL_SUBSURFACE_ERROR_BAD_SURFACE,
+ "%s: wl_surface@%d is not a parent or sibling",
+ "place_below", wl_resource_get_id(ecs->comp_data->surface));
+ return;
+ }
+
parent->comp_data->sub.list_pending =
eina_list_remove(parent->comp_data->sub.list_pending, ec);