subsurface: Assign E_Subsurface to user data of wl_resource 77/261077/6 accepted/tizen/unified/20210713.090217 submit/tizen/20210713.053811
authorSeunghun Lee <shiin.lee@samsung.com>
Fri, 9 Jul 2021 08:16:15 +0000 (17:16 +0900)
committerSeunghun Lee <chwila927@gmail.com>
Tue, 13 Jul 2021 01:20:12 +0000 (10:20 +0900)
Now that E_Subsurface was introduced for sub-surface, it's better to use
this as a user data of wl_resource of sub-surface. And E_Subsurface data
will be destroyed with destruction of an associated E_Client or of
wl_resource.

Change-Id: I9561df474127753a9c9d80ca9b595fed62363bd8

src/bin/e_comp_wl_subsurface.c

index f0e443f4632b9f0d4da2ab6ced23863ba071a490..c40e9612f04667732e7d7293a241a94de0fad06c 100644 (file)
@@ -584,21 +584,17 @@ _e_comp_wl_subsurface_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl
 static void
 _e_comp_wl_subsurface_cb_position_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, int32_t x, int32_t y)
 {
-   E_Client *ec;
-   E_Comp_Wl_Subsurf_Data *sdata;
+   E_Subsurface *sub;
 
    DBG("Subsurface Cb Position Set: %d", wl_resource_get_id(resource));
 
-   ec = wl_resource_get_user_data(resource);
-
-   if (e_object_is_del(E_OBJECT(ec)) || !ec->comp_data) return;
-
-   sdata = _e_comp_wl_subsurface_data_get(ec);
-   EINA_SAFETY_ON_NULL_RETURN(sdata);
+   sub = wl_resource_get_user_data(resource);
+   if (!sub)
+     return;
 
-   sdata->position.x = x;
-   sdata->position.y = y;
-   sdata->position.set = EINA_TRUE;
+   sub->base.position.x = x;
+   sub->base.position.y = y;
+   sub->base.position.set = EINA_TRUE;
 }
 
 static Eina_Bool
@@ -630,104 +626,96 @@ _subsurface_sibling_check(E_Client *ec1, E_Client *ec2)
 static void
 _e_comp_wl_subsurface_cb_place_above(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, struct wl_resource *sibling_resource)
 {
-   E_Client *ec, *ecs;
+   E_Subsurface *sub;
+   E_Client *ecs;
    E_Client *parent;
 
    DBG("Subsurface Cb Place Above: %d", wl_resource_get_id(resource));
 
-   ec = wl_resource_get_user_data(resource);
-
-   if (e_object_is_del(E_OBJECT(ec)) || !ec->comp_data) return;
-   if (!ec->comp_data->sub.data) return;
+   sub = wl_resource_get_user_data(resource);
+   if (!sub)
+     return;
 
-   if (!(parent = ec->comp_data->sub.data->parent)) return;
+   if (!(parent = sub->base.parent)) return;
    if (e_object_is_del(E_OBJECT(parent)) || !parent->comp_data) return;
 
    /* try to get the client from the sibling resource */
    if (!(ecs = wl_resource_get_user_data(sibling_resource))) return;
 
-   if (!_subsurface_sibling_check(ec, ecs))
+   if (!_subsurface_sibling_check(sub->ec, ecs))
      {
-        wl_resource_post_error(ec->comp_data->sub.data->resource,
+        wl_resource_post_error(sub->base.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;
      }
 
-   _e_comp_wl_subsurface_place_above(parent, ec, ecs);
+   _e_comp_wl_subsurface_place_above(parent, sub->ec, ecs);
 }
 
 static void
 _e_comp_wl_subsurface_cb_place_below(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, struct wl_resource *sibling_resource)
 {
-   E_Client *ec, *ecs;
+   E_Subsurface *sub;
+   E_Client *ecs;
    E_Client *parent;
 
    DBG("Subsurface Cb Place Below: %d", wl_resource_get_id(resource));
 
-   ec = wl_resource_get_user_data(resource);
-
-   if (e_object_is_del(E_OBJECT(ec)) || !ec->comp_data) return;
-   if (!ec->comp_data->sub.data) return;
+   sub = wl_resource_get_user_data(resource);
+   if (!sub)
+     return;
 
-   if (!(parent = ec->comp_data->sub.data->parent)) return;
+   if (!(parent = sub->base.parent)) return;
    if (e_object_is_del(E_OBJECT(parent)) || !parent->comp_data) return;
 
    /* try to get the client from the sibling resource */
    if (!(ecs = wl_resource_get_user_data(sibling_resource))) return;
 
-   if (!_subsurface_sibling_check(ec, ecs))
+   if (!_subsurface_sibling_check(sub->ec, ecs))
      {
-        wl_resource_post_error(ec->comp_data->sub.data->resource,
+        wl_resource_post_error(sub->base.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;
      }
 
-   _e_comp_wl_subsurface_place_below(parent, ec, ecs);
+   _e_comp_wl_subsurface_place_below(parent, sub->ec, ecs);
 }
 
 static void
 _e_comp_wl_subsurface_cb_sync_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
 {
-   E_Client *ec;
-   E_Comp_Wl_Subsurf_Data *sdata;
+   E_Subsurface *sub;
 
    DBG("Subsurface Cb Sync Set: %d", wl_resource_get_id(resource));
 
-   ec = wl_resource_get_user_data(resource);
-
-   if (e_object_is_del(E_OBJECT(ec)) || !ec->comp_data) return;
-
-   sdata = _e_comp_wl_subsurface_data_get(ec);
-   EINA_SAFETY_ON_NULL_RETURN(sdata);
+   sub = wl_resource_get_user_data(resource);
+   if (!sub)
+     return;
 
-   sdata->synchronized = EINA_TRUE;
+   sub->base.synchronized = EINA_TRUE;
 }
 
 static void
 _e_comp_wl_subsurface_cb_desync_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
 {
-   E_Client *ec;
-   E_Comp_Wl_Subsurf_Data *sdata;
+   E_Subsurface *sub;
 
    DBG("Subsurface Cb Desync Set: %d", wl_resource_get_id(resource));
 
-   ec = wl_resource_get_user_data(resource);
-
-   if (e_object_is_del(E_OBJECT(ec)) || !ec->comp_data) return;
-
-   sdata = _e_comp_wl_subsurface_data_get(ec);
-   EINA_SAFETY_ON_NULL_RETURN(sdata);
+   sub = wl_resource_get_user_data(resource);
+   if (!sub)
+     return;
 
-   if (sdata->synchronized)
+   if (sub->base.synchronized)
      {
-        sdata->synchronized = EINA_FALSE;
+        sub->base.synchronized = EINA_FALSE;
 
-        if (!_e_comp_wl_subsurface_synchronized_get(sdata))
-          _e_comp_wl_subsurface_synchronized_commit(ec);
+        if (!_e_comp_wl_subsurface_synchronized_get(&sub->base))
+          _e_comp_wl_subsurface_synchronized_commit(sub->ec);
      }
 }
 
@@ -839,15 +827,13 @@ _e_comp_wl_subsurface_cb_ec_uniconify(void *data EINA_UNUSED, E_Client *ec)
 static void
 _e_comp_wl_subsurface_cb_resource_destroy(struct wl_resource *resource)
 {
-   E_Client *ec = wl_resource_get_user_data(resource);
-
-   if (!e_object_unref(E_OBJECT(ec))) return;
-   if (e_object_is_del(E_OBJECT(ec))) return;
+   E_Subsurface *sub;
 
-   if (!ec->comp_data->sub.data)
+   sub = wl_resource_get_user_data(resource);
+   if (!sub)
      return;
 
-   _e_comp_wl_subsurface_destroy((E_Subsurface *)ec->comp_data->sub.data);
+   _e_comp_wl_subsurface_destroy(sub);
 }
 
 static Eina_Bool
@@ -1045,7 +1031,7 @@ e_comp_wl_subsurface_create(E_Client *ec, E_Client *epc, uint32_t id, struct wl_
    sub->base.resource = res;
 
   /* set resource implementation */
-   wl_resource_set_implementation(res, &_e_subsurface_interface, ec,
+   wl_resource_set_implementation(res, &_e_subsurface_interface, sub,
                                   _e_comp_wl_subsurface_cb_resource_destroy);
 
    _e_comp_wl_subsurface_ec_link(sub, ec);
@@ -1276,19 +1262,17 @@ e_comp_wl_subsurface_parent_get(E_Client *ec)
 EINTERN void
 e_comp_wl_subsurface_resource_stand_alone_mode_set(struct wl_resource *subsurface_resource)
 {
-   E_Client *ec;
+   E_Subsurface *sub;
 
    EINA_SAFETY_ON_FALSE_RETURN(wl_resource_instance_of(subsurface_resource,
                                                        &wl_subsurface_interface,
                                                        &_e_subsurface_interface));
 
-   ec = wl_resource_get_user_data(subsurface_resource);
-   EINA_SAFETY_ON_NULL_RETURN(ec);
-   EINA_SAFETY_ON_FALSE_RETURN(e_comp_wl_subsurface_check(ec));
+   sub = wl_resource_get_user_data(subsurface_resource);
+   EINA_SAFETY_ON_NULL_RETURN(sub);
 
-   ELOGF("SUBSURFACE", "SUBSURF|STAND_ALONE", ec);
-   if (ec->comp_data->sub.data)
-     ec->comp_data->sub.data->stand_alone = EINA_TRUE;
+   ELOGF("SUBSURFACE", "SUBSURF|STAND_ALONE", sub->ec);
+   sub->base.stand_alone = EINA_TRUE;
 }
 
 EINTERN Eina_Bool
@@ -1305,31 +1289,28 @@ e_comp_wl_subsurface_stand_alone_mode_get(E_Client *ec)
 EINTERN void
 e_comp_wl_subsurface_resource_place_below_parent(struct wl_resource *subsurface_resource)
 {
-   E_Client *ec;
-   E_Client *epc;
+   E_Subsurface *sub;
    E_Comp_Wl_Client_Data *epc_cdata;
 
    EINA_SAFETY_ON_FALSE_RETURN(wl_resource_instance_of(subsurface_resource,
                                                        &wl_subsurface_interface,
                                                        &_e_subsurface_interface));
 
-   ec = wl_resource_get_user_data(subsurface_resource);
-   EINA_SAFETY_ON_NULL_RETURN(ec);
-   EINA_SAFETY_ON_FALSE_RETURN(e_comp_wl_subsurface_check(ec));
+   sub = wl_resource_get_user_data(subsurface_resource);
+   EINA_SAFETY_ON_NULL_RETURN(sub);
 
-   epc = e_comp_wl_subsurface_parent_get(ec);
-   EINA_SAFETY_ON_NULL_RETURN(epc);
-   epc_cdata = e_client_cdata_get(epc);
+   EINA_SAFETY_ON_NULL_RETURN(sub->base.parent);
+   epc_cdata = e_client_cdata_get(sub->base.parent);
    EINA_SAFETY_ON_NULL_RETURN(epc_cdata);
 
-   ELOGF("SUBSURFACE", "SUBSURF|BELOW_PARENT", ec);
-   epc_cdata->sub.list = eina_list_remove(epc_cdata->sub.list, ec);
-   epc_cdata->sub.list_pending = eina_list_remove(epc_cdata->sub.list_pending, ec);
-   epc_cdata->sub.below_list = eina_list_remove(epc_cdata->sub.below_list, ec);
-   epc_cdata->sub.below_list_pending = eina_list_remove(epc_cdata->sub.below_list_pending, ec);
+   ELOGF("SUBSURFACE", "SUBSURF|BELOW_PARENT", sub->ec);
+   epc_cdata->sub.list = eina_list_remove(epc_cdata->sub.list, sub->ec);
+   epc_cdata->sub.list_pending = eina_list_remove(epc_cdata->sub.list_pending, sub->ec);
+   epc_cdata->sub.below_list = eina_list_remove(epc_cdata->sub.below_list, sub->ec);
+   epc_cdata->sub.below_list_pending = eina_list_remove(epc_cdata->sub.below_list_pending, sub->ec);
 
-   epc_cdata->sub.below_list_pending = eina_list_append(epc_cdata->sub.below_list_pending, ec);
-   epc_cdata->sub.below_list = eina_list_append(epc_cdata->sub.below_list, ec);
+   epc_cdata->sub.below_list_pending = eina_list_append(epc_cdata->sub.below_list_pending, sub->ec);
+   epc_cdata->sub.below_list = eina_list_append(epc_cdata->sub.below_list, sub->ec);
    epc_cdata->sub.list_changed = EINA_TRUE;
 }
 
@@ -1603,6 +1584,8 @@ _e_comp_wl_subsurface_cb_comp_data_del(void *data, E_Client *ec)
 
    ELOGF("SUBSURFACE", "The comp_data of E_Client is deleted", ec);
 
+   wl_resource_set_user_data(sub->base.resource, NULL);
+
    _e_comp_wl_subsurface_destroy(sub);
 }
 
@@ -1618,7 +1601,6 @@ _e_comp_wl_subsurface_ec_link(E_Subsurface *sub, E_Client *ec)
    ec->comp_data->surface = ec->comp_data->wl_surface;
    ec->comp_data->sub.data = &sub->base;
 
-   e_object_ref(E_OBJECT(ec));
    e_comp_wl_surface_state_init(&sub->base.cached, ec->w, ec->h);
 
    /* set subsurface client properties */