srect, drect);
}
+static E_Client*
+_e_comp_wl_topmost_parent_get(E_Client *ec)
+{
+ E_Client *parent = NULL;
+
+ if (!ec->comp_data || !ec->comp_data->sub.data)
+ return ec;
+
+ parent = ec->comp_data->sub.data->parent;
+ while (parent)
+ {
+ if (!parent->comp_data || !parent->comp_data->sub.data)
+ return parent;
+
+ parent = parent->comp_data->sub.data->parent;
+ }
+
+ return ec;
+}
+
+static void
+_e_comp_wl_extern_parent_commit(E_Client *ec)
+{
+ E_Client **subc;
+ Eina_List *l;
+
+ EINA_LIST_FOREACH(ec->comp_data->sub.list, l, subc)
+ _e_comp_wl_extern_parent_commit(subc);
+
+ EINA_LIST_FOREACH(ec->comp_data->sub.below_list, l, subc)
+ _e_comp_wl_extern_parent_commit(subc);
+
+ if (ec->comp_data->has_extern_parent)
+ _e_comp_wl_subsurface_parent_commit(ec, EINA_TRUE);
+}
+
static void
_e_comp_wl_map_apply(E_Client *ec)
{
e_comp_wl_surface_commit(ec);
+ if (ec->comp_data->need_commit_extern_parent)
+ {
+ ec->comp_data->need_commit_extern_parent = 0;
+ _e_comp_wl_extern_parent_commit(ec);
+ }
+
EINA_LIST_FOREACH(ec->comp_data->sub.list, l, subc)
{
if (ec != subc)
e_comp_wl_subsurface_commit(E_Client *ec)
{
E_Comp_Wl_Subsurf_Data *sdata;
+ E_Client *topmost;
/* check for valid subcompositor data */
if (!(sdata = ec->comp_data->sub.data)) return EINA_FALSE;
+ topmost = _e_comp_wl_topmost_parent_get(ec);
+
if (_e_comp_wl_subsurface_synchronized_get(sdata))
_e_comp_wl_subsurface_commit_to_cache(ec);
+ else if (ec->comp_data->has_extern_parent && !topmost->visible)
+ {
+ _e_comp_wl_subsurface_commit_to_cache(ec);
+ topmost->comp_data->need_commit_extern_parent = 1;
+ }
else
{
E_Client *subc;