static void _e_comp_wl_subsurface_parent_commit(E_Client *ec, Eina_Bool parent_synchronized);
static Eina_Bool _e_comp_wl_subsurface_synchronized_get(E_Comp_Wl_Subsurf_Data *sdata);
static void _e_comp_wl_subsurface_synchronized_commit(E_Client *ec);
+static void _e_comp_wl_subsurface_remove_from_parent(E_Client *parent, E_Client *subc);
static void
_e_comp_wl_subsurface_restack_bg_rectangle(E_Client *ec)
}
static void
-_e_comp_wl_subsurface_destroy_sdata(E_Client *ec)
+_e_comp_wl_subsurface_data_destroy(E_Comp_Wl_Subsurf_Data *sdata)
{
- E_Comp_Wl_Subsurf_Data *sdata;
-
- if (!ec || !ec->comp_data || !ec->comp_data->sub.data) return;
-
- sdata = ec->comp_data->sub.data;
- if (sdata->parent)
- {
- /* remove this client from parents sub list */
- sdata->parent->comp_data->sub.list =
- eina_list_remove(sdata->parent->comp_data->sub.list, ec);
- sdata->parent->comp_data->sub.list_pending =
- eina_list_remove(sdata->parent->comp_data->sub.list_pending, ec);
- sdata->parent->comp_data->sub.below_list =
- eina_list_remove(sdata->parent->comp_data->sub.below_list, ec);
- sdata->parent->comp_data->sub.below_list_pending =
- eina_list_remove(sdata->parent->comp_data->sub.below_list_pending, ec);
- }
-
e_comp_wl_surface_state_finish(&sdata->cached);
e_comp_wl_buffer_reference(&sdata->cached_buffer_ref, NULL);
/* wl_resource_set_user_data(ec->comp_data->surface, NULL); */
E_FREE(sdata);
-
- ec->comp_data->sub.data = NULL;
}
static void
/* make sure this is a wayland client */
if (e_pixmap_type_get(ec->pixmap) != E_PIXMAP_TYPE_WL) return;
+ if (!ec->comp_data)
+ return;
+
if (ec->comp_data->sub.data)
- _e_comp_wl_subsurface_destroy_sdata(ec);
+ {
+ if (ec->comp_data->sub.data->parent)
+ _e_comp_wl_subsurface_remove_from_parent(ec->comp_data->sub.data->parent, ec);
+ _e_comp_wl_subsurface_data_destroy(ec->comp_data->sub.data);
+ ec->comp_data->sub.data = NULL;
+ }
if (ec->comp_data->sub.below_obj)
{
if (!e_object_unref(E_OBJECT(ec))) return;
if (e_object_is_del(E_OBJECT(ec))) return;
- _e_comp_wl_subsurface_destroy_sdata(ec);
+ if ((ec->comp_data) && (ec->comp_data->sub.data))
+ {
+ if (ec->comp_data->sub.data->parent)
+ _e_comp_wl_subsurface_remove_from_parent(ec->comp_data->sub.data->parent, ec);
+ _e_comp_wl_subsurface_data_destroy(ec->comp_data->sub.data);
+ ec->comp_data->sub.data = NULL;
+ }
}
static Eina_Bool
*/
wl_resource_set_implementation(resource, &_e_subsurface_dummy_interface, NULL, NULL);
}
+
+static void
+_e_comp_wl_subsurface_remove_from_parent(E_Client *parent, E_Client *subc)
+{
+ parent->comp_data->sub.list =
+ eina_list_remove(parent->comp_data->sub.list, subc);
+ parent->comp_data->sub.list_pending =
+ eina_list_remove(parent->comp_data->sub.list_pending, subc);
+ parent->comp_data->sub.below_list =
+ eina_list_remove(parent->comp_data->sub.below_list, subc);
+ parent->comp_data->sub.below_list_pending =
+ eina_list_remove(parent->comp_data->sub.below_list_pending, subc);
+}