video_shell: Use E_Comp_Wl_Subsurf_Data 20/316220/1
authorSeunghun Lee <shiin.lee@samsung.com>
Fri, 9 Aug 2024 05:46:38 +0000 (14:46 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Fri, 16 Aug 2024 04:45:16 +0000 (13:45 +0900)
Instead of using e_subsurface_internal_create(), the
E_Video_Viewport_Source now embeds E_Comp_Wl_Subsurf_Data.

This enables us to have two different sub-types of
E_Comp_Wl_Subsurf_Data. One is E_Subsurface for a wl_resource of
wl_subsurface, and the other is E_Video_Viewport_Source for
subsurface-like view without wl_subsurface.

Change-Id: I08a30b6230d7c12b692ab1b635d3a71cd5812538

src/bin/core/e_client.c
src/bin/core/e_client_intern.h
src/bin/displaymgr/video/e_video_hwc.c
src/bin/server/e_comp_wl.c
src/bin/server/e_comp_wl_subsurface.c
src/bin/server/e_comp_wl_subsurface_intern.h
src/bin/server/e_compositor.c
src/bin/server/e_compositor_intern.h
src/bin/server/e_video_shell.c

index 389edd7f306e9544549ea61be7cd4bba31aa899d..1a7b52201bcb48cd8f1ab4ff80f7a0c6a55f2139 100644 (file)
@@ -8447,3 +8447,8 @@ e_client_vkbd_vkbd_get(E_Client *ec)
    return ec->vkbd.vkbd;
 }
 /////////////////////////////////////////////////////////
+EINTERN E_Comp_Wl_Subsurf_Data *
+e_client_subsurface_data_try_get(E_Client *ec)
+{
+   return ec->comp_data ? ec->comp_data->sub.data : NULL;
+}
index 021f5d33a526a430a6c3c9c925b5461628da3fc6..598cb8b3ab03d06bf5c9f0484bfb1b32aeb9408d 100644 (file)
@@ -262,4 +262,5 @@ void e_client_shell_unmap(E_Client *ec);
 EINTERN void e_client_resize_handle(E_Client *ec);
 EINTERN int  e_client_resize_end(E_Client *ec);
 
+E_Comp_Wl_Subsurf_Data *e_client_subsurface_data_try_get(E_Client *ec);
 #endif
index cb2c0bac0debb704a61814c64203e0261078d050..5d4ede323679c249c26991d7a2350731c3c405d8 100644 (file)
@@ -1464,12 +1464,12 @@ _e_video_hwc_geometry_input_rect_get_with_viewport(tbm_surface_h tbm_surf, E_Com
 static void
 _e_video_hwc_geometry_output_rect_get(E_Client *ec, Eina_Rectangle *out)
 {
-   E_Subsurface *subsurface;
+   E_Comp_Wl_Subsurf_Data *sdata;
 
-   if (e_comp_wl_subsurface_check(ec))
+   sdata = e_client_subsurface_data_try_get(ec);
+   if (sdata)
      {
-        subsurface = e_subsurface_from_ec(ec);
-        e_subsurface_coord_get(subsurface, &out->x, &out->y);
+        e_comp_wl_subsurface_data_coord_get(sdata, &out->x, &out->y);
      }
    else
      {
index 09a0acf5886f9021d45b9ad918804880ff115c5e..1e0e9409481aa8b2817d5052ed66be582b81536f 100644 (file)
@@ -560,7 +560,6 @@ e_comp_wl_map_apply(E_Client *ec)
    E_Comp_Wl_Buffer_Viewport *vp;
    E_Comp_Wl_Subsurf_Data *sdata;
    E_Comp_Wl_Client_Data *cdata;
-   E_Subsurface *subsurface;
    int x1, y1, x2, y2, x, y;
    int dx = 0, dy = 0;
    Eina_Bool zoom_animating = EINA_FALSE;
@@ -575,12 +574,11 @@ e_comp_wl_map_apply(E_Client *ec)
        (!cdata->viewport_transform))
      return;
 
-   if (e_comp_wl_subsurface_check(ec))
+   sdata = e_client_subsurface_data_try_get(ec);
+   if (sdata)
      {
-        subsurface = e_subsurface_from_ec(ec);
-        e_subsurface_coord_get(subsurface, &dx, &dy);
+        e_comp_wl_subsurface_data_coord_get(sdata, &dx, &dy);
 
-        sdata = ec->comp_data->sub.data;
         if (sdata->remote_surface.offscreen_parent)
           {
              E_Client *offscreen_parent = sdata->remote_surface.offscreen_parent;
@@ -598,21 +596,17 @@ e_comp_wl_map_apply(E_Client *ec)
                   break;
                }
           }
-
-        e_view_client_geometry_get(e_client_view_get(ec), &x, &y, NULL, NULL);
-        if (x != dx || y != dy)
-          e_subsurface_view_position_set(subsurface, dx, dy);
      }
    else
      {
         dx = ec->x;
         dy = ec->y;
-
-        e_view_client_geometry_get(e_client_view_get(ec), &x, &y, NULL, NULL);
-        if (x != dx || y != dy)
-          e_view_position_set(e_view_client_view_get(e_client_view_get(ec)), dx, dy);
      }
 
+   e_view_client_geometry_get(e_client_view_get(ec), &x, &y, NULL, NULL);
+   if (x != dx || y != dy)
+       e_view_position_set(e_view_client_view_get(e_client_view_get(ec)), dx, dy);
+
    if (!cdata->viewport_transform)
      {
         cdata->viewport_transform = e_util_transform_new();
@@ -766,13 +760,26 @@ _e_comp_wl_evas_cb_hide(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EIN
    wl_signal_emit(&e_comp_wl->ptr_constraints.surface_unmap_signal, ec);
 }
 
+static void
+_e_comp_wl_subsurface_client_reposition(E_Client *subc)
+{
+   int x, y;
+
+   e_comp_wl_subsurface_data_coord_get(subc->comp_data->sub.data, &x, &y);
+   evas_object_move(subc->frame, x, y);
+
+   if (subc->comp_data->viewport_transform)
+     e_comp_wl_map_apply(subc);
+   else
+     e_client_transform_core_update(subc);
+}
+
 static void
 _e_comp_wl_evas_cb_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    E_Client *ec;
    E_Client *subc;
    Eina_List *l;
-   E_Subsurface *subsurface;
 
    if (!(ec = data)) return;
    if (e_object_is_del(E_OBJECT(ec))) return;
@@ -780,23 +787,13 @@ _e_comp_wl_evas_cb_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_U
    EINA_LIST_FOREACH(ec->comp_data->sub.list, l, subc)
      {
         if (!e_comp_wl_subsurface_check(subc)) continue;
-        subsurface = e_subsurface_from_ec(subc);
-        e_subsurface_view_reposition(subsurface);
-
-        E_Comp_Wl_Client_Data *cdata = subc->comp_data;
-        if (cdata->viewport_transform)
-          e_comp_wl_map_apply(subc);
+        _e_comp_wl_subsurface_client_reposition(subc);
      }
 
    EINA_LIST_FOREACH(ec->comp_data->sub.below_list, l, subc)
      {
         if (!e_comp_wl_subsurface_check(subc)) continue;
-        subsurface = e_subsurface_from_ec(subc);
-        e_subsurface_view_reposition(subsurface);
-
-        E_Comp_Wl_Client_Data *cdata = subc->comp_data;
-        if (cdata->viewport_transform)
-          e_comp_wl_map_apply(subc);
+        _e_comp_wl_subsurface_client_reposition(subc);
      }
 }
 
@@ -5973,7 +5970,7 @@ _transform_merge_with_rotation(enum wl_output_transform transform, unsigned int
 static void
 _e_comp_wl_surface_output_viewport_get(E_Client *ec, Eina_Rectangle *out)
 {
-   E_Subsurface *subsurface;
+   E_Comp_Wl_Subsurf_Data *sdata;
 
    if (!out)
      return;
@@ -5981,10 +5978,10 @@ _e_comp_wl_surface_output_viewport_get(E_Client *ec, Eina_Rectangle *out)
    if (!ec->comp_data)
      return;
 
-   if (e_comp_wl_subsurface_check(ec))
+   sdata = e_client_subsurface_data_try_get(ec);
+   if (sdata)
      {
-        subsurface = e_subsurface_from_ec(ec);
-        e_subsurface_coord_get(subsurface, &out->x, &out->y);
+        e_comp_wl_subsurface_data_coord_get(sdata, &out->x, &out->y);
      }
    else
      {
index ea1c5a0a6b4ba24caf4ebebefb72cf138c561d29..354283c460556b52d2685a66c2cc8fe7a172841b 100644 (file)
@@ -891,6 +891,51 @@ e_comp_wl_subsurface_position_get(E_Client *ec, int *x, int *y)
    return EINA_TRUE;
 }
 
+EINTERN void
+e_comp_wl_subsurface_data_position_set(E_Comp_Wl_Subsurf_Data *sdata, int x, int y)
+{
+   if ((sdata->position.x == x) && (sdata->position.y == y))
+     return;
+
+   sdata->position.x = x;
+   sdata->position.y = y;
+   sdata->position.set = EINA_TRUE;
+}
+
+EINTERN void
+e_comp_wl_subsurface_data_coord_get(E_Comp_Wl_Subsurf_Data *sdata, int *x, int *y)
+{
+   E_Comp_Wl_Subsurf_Data *iter = sdata;
+   E_Client *parent;
+   int ret_x = 0, ret_y = 0;
+
+   while (1)
+     {
+        ret_x += iter->position.x;
+        ret_y += iter->position.y;
+
+        parent = iter->parent;
+        if (!parent)
+          break;
+
+        if (parent->comp_data && parent->comp_data->sub.data)
+          {
+             iter = parent->comp_data->sub.data;
+          }
+        else
+          {
+             ret_x += parent->x;
+             ret_y += parent->y;
+             break;
+          }
+     }
+
+   if (x)
+     *x = ret_x;
+   if (y)
+     *y = ret_y;
+}
+
 static E_Comp_Wl_Subsurf_Data *
 _e_comp_wl_subsurface_data_get(E_Client *ec)
 {
index 34b15b184633be3eea5f1340a7664b94fa1e99fe..87b3fd9b2caca034c4a944ea214611ed51eddf49 100644 (file)
@@ -21,6 +21,8 @@ EINTERN void          e_comp_wl_subsurface_resource_place_below_parent(struct wl
 EINTERN void e_comp_wl_subsurface_data_init(E_Comp_Wl_Subsurf_Data *sdata, E_Client *ec, E_Client *parent, E_Client *offscreen_parent);
 EINTERN void e_comp_wl_subsurface_data_finish(E_Comp_Wl_Subsurf_Data *sdata);
 EINTERN void e_comp_wl_subsurface_data_parent_unset(E_Comp_Wl_Subsurf_Data *sdata);
+EINTERN void e_comp_wl_subsurface_data_position_set(E_Comp_Wl_Subsurf_Data *sdata, int x, int y);
+EINTERN void e_comp_wl_subsurface_data_coord_get(E_Comp_Wl_Subsurf_Data *sdata, int *x, int *y);
 
 EINTERN Eina_Bool     e_comp_wl_subsurface_add(struct wl_resource *resource, uint32_t id, struct wl_resource *surface_resource, struct wl_resource *parent_resource);
 EINTERN Eina_Bool     e_comp_wl_subsurface_order_commit(E_Client *ec);
index 24be0bc9b92268b755bea0336bffe720e15cfa35..c8762913309952134fcd40761e438c775122cd75 100644 (file)
@@ -86,8 +86,6 @@ struct _E_Subsurface
         struct wl_signal destroy;
         struct wl_signal reposition;
      } events;
-
-   Eina_Bool internal;
 };
 
 struct _E_Frame_Callback
@@ -126,6 +124,7 @@ static void _e_subsurface_cb_surface_destroy(struct wl_listener *listener, void
 static void _e_subsurface_cb_parent_surface_destroy(struct wl_listener *listener, void *data);
 static void _e_subsurface_view_init(E_Subsurface_View *view, E_Subsurface *subsurface);
 static void _e_subsurface_view_finish(E_Subsurface_View *view);
+static void _e_subsurface_view_reposition(E_Subsurface *subsurface);
 
 static void _ds_surface_buffer_transform_set(struct ds_surface *ds_surface, enum wl_output_transform transform);
 static void _ds_surface_viewport_source_box_set(struct ds_surface *ds_surface, Eina_Rectangle *box);
@@ -197,45 +196,6 @@ e_subsurface_create(struct wl_resource *factory_resource, uint32_t id, E_Surface
    return _e_subsurface_try_from_surface(surface);
 }
 
-EINTERN E_Subsurface *
-e_subsurface_internal_create(E_Surface *surface, E_Subsurface *parent_subsurface)
-{
-   E_Subsurface *sub;
-
-   sub = E_NEW(E_Subsurface, 1);
-   if (!sub)
-     return NULL;
-
-   sub->internal = EINA_TRUE;
-   sub->surface = surface;
-
-   sub->parent = parent_subsurface->surface;
-   sub->parent_surface_destroy.notify = _e_subsurface_cb_parent_surface_destroy;
-   wl_signal_add(&sub->parent->events.destroy, &sub->parent_surface_destroy);
-
-   e_comp_wl_subsurface_data_init(&sub->base, surface->ec, sub->parent->ec, NULL);
-
-   _e_subsurface_view_init(&sub->view, sub);
-
-   ELOGF("SUBSURFACE", "Create for internal use: parent(%p)", surface->ec, sub->parent->ec);
-
-   return sub;
-}
-
-EINTERN void
-e_subsurface_internal_destroy(E_Subsurface *sub)
-{
-   assert(sub->internal);
-
-   ELOGF("SUBSURFACE", "Destroy internal subsurface", sub->surface->ec);
-
-   _e_subsurface_view_finish(&sub->view);
-   e_comp_wl_subsurface_data_finish(&sub->base);
-   sub->surface->ec->comp_data->sub.data = NULL;
-   wl_list_remove(&sub->parent_surface_destroy.link);
-   free(sub);
-}
-
 EINTERN void
 e_subsurface_stand_alone_mode_set(E_Subsurface *sub)
 {
@@ -687,12 +647,7 @@ e_subsurface_position_set(E_Subsurface *subsurface, int x, int y)
 {
    EINA_SAFETY_ON_NULL_RETURN_VAL(subsurface, EINA_FALSE);
 
-   if ((subsurface->base.position.x == x) && (subsurface->base.position.y == y))
-    return EINA_FALSE;
-
-   subsurface->base.position.x = x;
-   subsurface->base.position.y = y;
-   subsurface->base.position.set = EINA_TRUE;
+   e_comp_wl_subsurface_data_position_set(&subsurface->base, x, y);
 
    if (subsurface->ds_subsurface)
      _ds_subsurface_position_set(subsurface->ds_subsurface, x, y);
@@ -1587,7 +1542,7 @@ _e_subsurface_view_init(E_Subsurface_View *view, E_Subsurface *subsurface)
 {
    view->ec = subsurface->surface->ec;
 
-   e_subsurface_view_reposition(subsurface);
+   _e_subsurface_view_reposition(subsurface);
 }
 
 static void
@@ -1797,7 +1752,7 @@ _e_subsurface_cb_request_move(struct wl_listener *listener, void *data)
    sub->base.position.x = ds_subsurface->current.x;
    sub->base.position.y = ds_subsurface->current.y;
 
-   e_subsurface_view_reposition(sub);
+   _e_subsurface_view_reposition(sub);
 
    wl_signal_emit(&sub->events.reposition, sub);
 }
@@ -1912,7 +1867,6 @@ EINTERN void
 e_subsurface_destroy_listener_add(E_Subsurface *subsurface, struct wl_listener *listener)
 {
    EINA_SAFETY_ON_NULL_RETURN(subsurface);
-   assert(!subsurface->internal);
    wl_signal_add(&subsurface->events.destroy, listener);
 }
 
@@ -1920,42 +1874,13 @@ EINTERN void
 e_subsurface_reposition_listener_add(E_Subsurface *subsurface, struct wl_listener *listener)
 {
    EINA_SAFETY_ON_NULL_RETURN(subsurface);
-   assert(!subsurface->internal);
    wl_signal_add(&subsurface->events.reposition, listener);
 }
 
 EINTERN void
 e_subsurface_coord_get(E_Subsurface *subsurface, int *x, int *y)
 {
-   E_Subsurface *iter = subsurface;
-   E_Client *parent;
-   int ret_x = 0, ret_y = 0;
-
-   while (1)
-     {
-        ret_x += iter->base.position.x;
-        ret_y += iter->base.position.y;
-
-        parent = iter->base.parent;
-        if (!parent)
-          break;
-
-        if (parent->comp_data && parent->comp_data->sub.data)
-          {
-             iter = wl_container_of(parent->comp_data->sub.data, iter, base);
-          }
-        else
-          {
-             ret_x += parent->x;
-             ret_y += parent->y;
-             break;
-          }
-     }
-
-   if (x)
-     *x = ret_x;
-   if (y)
-     *y = ret_y;
+   e_comp_wl_subsurface_data_coord_get(&subsurface->base, x, y);
 }
 
 EINTERN E_Surface *
@@ -1970,8 +1895,8 @@ e_subsurface_parent_try_get(E_Subsurface *subsurface)
    return subsurface->parent;
 }
 
-EINTERN void
-e_subsurface_view_position_set(E_Subsurface *subsurface, int x, int y)
+static void
+_e_subsurface_view_position_set(E_Subsurface *subsurface, int x, int y)
 {
    E_Subsurface_View *view = &subsurface->view;
    E_View_Client *view_client;
@@ -1984,11 +1909,11 @@ e_subsurface_view_position_set(E_Subsurface *subsurface, int x, int y)
    e_client_transform_core_update(view->ec);
 }
 
-EINTERN void
-e_subsurface_view_reposition(E_Subsurface *subsurface)
+static void
+_e_subsurface_view_reposition(E_Subsurface *subsurface)
 {
    int x, y;
 
-   e_subsurface_coord_get(subsurface, &x, &y);
-   e_subsurface_view_position_set(subsurface, x, y);
+   e_comp_wl_subsurface_data_coord_get(&subsurface->base, &x, &y);
+   _e_subsurface_view_position_set(subsurface, x, y);
 }
index 3ec3e6e79b01bf3d98b364f1e126721c8dfc851e..40bb8236928b56906e3f35351accdd0ed8a4ae08 100644 (file)
@@ -59,7 +59,6 @@ void e_subsurface_coord_get(E_Subsurface *subsurface, int *x, int *y);
 E_Surface *e_subsurface_surface_get(E_Subsurface *subsurface);
 E_Surface *e_subsurface_parent_try_get(E_Subsurface *subsurface);
 void e_subsurface_view_position_set(E_Subsurface *subsurface, int x, int y);
-void e_subsurface_view_reposition(E_Subsurface *subsurface);
 
 E_Subsurface *e_subsurface_internal_create(E_Surface *surface, E_Subsurface *parent_subsurface);
 void e_subsurface_internal_destroy(E_Subsurface *subsurface);
index d1b6e98ea6280118b7d593fd4b38754d03e795fd..2ea6522874e7f7e00cf5e490396436ed243e6e8b 100644 (file)
@@ -151,6 +151,7 @@ typedef struct
 
 struct _E_Video_Viewport_Source
 {
+   E_Comp_Wl_Subsurf_Data base;
    struct wl_resource *resource;
    E_Video_Surface *surface;
    E_Video_Viewport *viewport;
@@ -794,7 +795,7 @@ _source_create(E_Video_Surface *surface)
 static void
 _source_destroy(E_Video_Viewport_Source *source)
 {
-   E_Client *ec;
+   E_Client *ec = e_surface_ec_get(source->surface->surface);
 
    VS_INF("SOURCE %p| Destroy", source);
 
@@ -802,14 +803,13 @@ _source_destroy(E_Video_Viewport_Source *source)
 
    if (source->transform)
      {
-        ec = e_surface_ec_get(source->surface->surface);
         e_client_transform_core_remove(ec, source->transform);
         e_util_transform_del(source->transform);
         // TODO: Is it necessary to call e_client_transform_core_update?
      }
 
-   if (source->subsurface)
-     e_subsurface_internal_destroy(source->subsurface);
+   e_comp_wl_subsurface_data_finish(&source->base);
+   ec->comp_data->sub.data = NULL;
 
    if (source->resource)
      wl_resource_set_user_data(source->resource, NULL);
@@ -924,6 +924,24 @@ _letter_box_geometry_calc(Eina_Rectangle *in_out, double ratio_width, double rat
    in_out->h = fit_height;
 }
 
+static void
+_source_view_move(E_Video_Viewport_Source *source, int x, int y)
+{
+   E_Client *ec = e_surface_ec_get(source->surface->surface);
+
+   evas_object_move(ec->frame, x, y);
+   e_client_transform_core_update(ec);
+}
+
+static void
+_source_view_reposition(E_Video_Viewport_Source *source)
+{
+   int x, y;
+
+   e_comp_wl_subsurface_data_coord_get(&source->base, &x, &y);
+   _source_view_move(source, x, y);
+}
+
 static void
 _source_viewport_destination_update(E_Video_Viewport_Source *source)
 {
@@ -953,11 +971,9 @@ _source_viewport_destination_update(E_Video_Viewport_Source *source)
      }
 
 end:
-   if (source->subsurface)
-     {
-        e_subsurface_position_set(source->subsurface, dest_rect.x, dest_rect.y);
-        e_subsurface_view_reposition(source->subsurface);
-     }
+   e_comp_wl_subsurface_data_position_set(&source->base, dest_rect.x, dest_rect.y);
+   _source_view_reposition(source);
+
    e_surface_viewport_destination_set(source->surface->surface, dest_rect.w, dest_rect.h);
 }
 
@@ -991,7 +1007,7 @@ _source_viewport_transform_update(E_Video_Viewport_Source *source)
         e_client_transform_core_add(ec, source->transform);
      }
 
-   e_subsurface_coord_get(source->subsurface, &x, &y);
+   e_comp_wl_subsurface_data_coord_get(&source->base, &x, &y);
    w = ec->comp_data->width_from_viewport;
    h = ec->comp_data->height_from_viewport;
    transform = viewport->current.transform;
@@ -1053,7 +1069,6 @@ _source_viewport_apply(E_Video_Viewport_Source *source)
    E_Comp_Wl_Buffer_Viewport *vp;
    E_Comp_Wl_Subsurf_Data *sdata;
    E_Comp_Wl_Client_Data *cdata;
-   E_Subsurface *subsurface;
    int x1, y1, x2, y2, x, y;
    int dx = 0, dy = 0;
    Eina_Bool zoom_animating = EINA_FALSE;
@@ -1066,8 +1081,7 @@ _source_viewport_apply(E_Video_Viewport_Source *source)
 
    if (e_comp_wl_subsurface_check(ec))
      {
-        subsurface = e_subsurface_from_ec(ec);
-        e_subsurface_coord_get(subsurface, &dx, &dy);
+        e_comp_wl_subsurface_data_coord_get(&source->base, &dx, &dy);
 
         sdata = ec->comp_data->sub.data;
         if (sdata->remote_surface.offscreen_parent)
@@ -1090,7 +1104,7 @@ _source_viewport_apply(E_Video_Viewport_Source *source)
 
         e_view_client_geometry_get(e_client_view_get(ec), &x, &y, NULL, NULL);
         if (x != dx || y != dy)
-          e_subsurface_view_position_set(subsurface, dx, dy);
+          _source_view_move(source, dx, dy);
      }
    else
      {
@@ -1318,19 +1332,28 @@ _source_surface_link(E_Video_Viewport_Source *source, E_Video_Surface *surface)
 static Eina_Bool
 _source_viewport_link(E_Video_Viewport_Source *source, E_Video_Viewport *viewport)
 {
+   E_Client *ec = e_surface_ec_get(source->surface->surface);
+   E_Client *parent_surface = NULL;
+
+   if (viewport)
+     {
+        _viewport_source_set(viewport, source);
+        parent_surface = e_surface_ec_get(e_subsurface_surface_get(viewport->subsurface));
+     }
+   else
+     wtz_video_viewport_source_send_viewport_destroyed(source->resource);
+
    source->viewport = viewport;
 
-   source->subsurface = e_subsurface_internal_create(source->surface->surface, viewport->subsurface);
-   if (!source->subsurface)
+   e_comp_wl_subsurface_data_init(&source->base, ec, parent_surface, NULL);
+   if (source->base.parent)
      {
-        VS_ERR("SOURCE %p| Could not create an internal subsurface", source);
-        return EINA_FALSE;
+        source->base.parent->comp_data->sub.list = eina_list_append(source->base.parent->comp_data->sub.list, ec);
+        source->base.parent->comp_data->sub.list_changed = EINA_FALSE;
      }
 
    if (source->surface->stand_alone)
-     e_subsurface_stand_alone_mode_set(source->subsurface);
-
-   _viewport_source_set(viewport, source);
+     source->base.stand_alone = EINA_TRUE;
 
    _source_viewport_destination_update(source);
    _source_viewport_apply(source);
@@ -1344,6 +1367,7 @@ _source_viewport_destroyed(E_Video_Viewport_Source *source)
    VS_INF("SOURCE %p| viewport destroyed", source);
 
    source->viewport = NULL;
+   e_comp_wl_subsurface_data_parent_unset(&source->base);
    wtz_video_viewport_source_send_viewport_destroyed(source->resource);
 }
 
@@ -1430,17 +1454,7 @@ _video_surface_cb_get_viewport_source(struct wl_client *client, struct wl_resour
      }
    wl_resource_set_implementation(source->resource, &_source_impl, source, _source_cb_resource_destroy);
 
-   if (!viewport)
-     {
-        wtz_video_viewport_source_send_viewport_destroyed(source->resource);
-     }
-   else if (!_source_viewport_link(source, viewport))
-     {
-        wl_resource_post_no_memory(resource);
-        _source_destroy(source);
-        return;
-     }
-
+   _source_viewport_link(source, viewport);
    _video_surface_name_update(surface);
 
    VS_INF("SOURCE %p| Created with E_Video_Surface(%p), Viewport(%p)", source, surface, viewport);
@@ -1556,7 +1570,7 @@ _video_surface_stand_alone_set(E_Video_Surface *surface)
    else if (surface->role == E_VIDEO_SURFACE_ROLE_VIEWPORT_SOURCE &&
             surface->source->subsurface)
      {
-        e_subsurface_stand_alone_mode_set(surface->source->subsurface);
+        surface->source->base.stand_alone = EINA_TRUE;
      }
 }
 
@@ -1575,7 +1589,7 @@ _video_surface_stand_alone_unset(E_Video_Surface *surface)
    else if (surface->role == E_VIDEO_SURFACE_ROLE_VIEWPORT_SOURCE &&
             surface->source->subsurface)
      {
-        e_subsurface_stand_alone_mode_unset(surface->source->subsurface);
+        surface->source->base.stand_alone = EINA_FALSE;
      }
 }
 
@@ -1905,7 +1919,7 @@ _viewport_info_print(E_Video_Viewport *viewport, FILE *fp)
    if (source)
      {
         source = viewport->source;
-        ec = e_surface_ec_get(e_subsurface_surface_get(source->subsurface));
+        ec = e_surface_ec_get(source->surface->surface);
         name = (char *)e_client_netwm_name_get(ec);
         if (!name)
           name = (char *)e_client_icccm_title_get(ec);
@@ -2073,8 +2087,8 @@ _viewport_border_init(E_Video_Viewport *viewport)
    if (viewport->border)
      return;
 
-   if (viewport->source && viewport->source->subsurface)
-     ec = e_surface_ec_get(e_subsurface_surface_get(viewport->source->subsurface));
+   if (viewport->source)
+     ec = e_surface_ec_get(viewport->source->surface->surface);
    else
      ec = e_surface_ec_get(e_subsurface_surface_get(viewport->subsurface));
 
@@ -2101,8 +2115,8 @@ _viewport_border_finish(E_Video_Viewport *viewport)
    if (!viewport->border)
      return;
 
-   if (viewport->source && viewport->source->subsurface)
-     ec = e_surface_ec_get(e_subsurface_surface_get(viewport->source->subsurface));
+   if (viewport->source)
+     ec = e_surface_ec_get(viewport->source->surface->surface);
    else
      ec = e_surface_ec_get(e_subsurface_surface_get(viewport->subsurface));