e_video_shell: Replace evas smart object by E_View 96/317796/1
authorSeunghun Lee <shiin.lee@samsung.com>
Tue, 31 Dec 2024 08:02:51 +0000 (17:02 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 8 Jan 2025 04:57:00 +0000 (13:57 +0900)
E_View is recommended to build scene graph instead of using evas object
directly.

Change-Id: I0e1c718fe234b2c130b080c9fd98e19834841936

src/bin/server/e_video_shell.c

index 28cf8eaa2f636f4dda0abd1948d6a45d7807aec2..c11c2e784b9b664991c7f6036abd42dd3750bb90 100644 (file)
@@ -12,6 +12,7 @@
 #include "e_comp_wl_subsurface_intern.h"
 #include "e_video_shell_intern.h"
 #include "e_view_intern.h"
+#include "e_view_rect.h"
 #include "e_view_client_intern.h"
 
 #include <assert.h>
@@ -69,6 +70,28 @@ typedef struct
    Eina_Bool map;
 } E_Video_Viewport_State;
 
+typedef enum
+{
+   TOP = 0,
+   BOTTOM,
+   LEFT,
+   RIGHT,
+   NUM_DIRECTIONS,
+} Viewport_Border_Direction;
+
+typedef struct
+{
+   E_View_Tree tree;
+   E_View_Rect *interior_rect;
+   E_View_Rect *rects[NUM_DIRECTIONS];
+
+   int width;
+
+   struct wl_listener show;
+   struct wl_listener hide;
+   struct wl_listener restack;
+} Viewport_Border;
+
 typedef struct
 {
    struct wl_resource *resource;
@@ -76,7 +99,7 @@ typedef struct
    E_Video_Shell *shell;
    E_Video_Viewport_Source *source;
 
-   Evas_Object *border;
+   Viewport_Border *border;
 
    E_Video_Viewport_State pending, cache, current;
 
@@ -181,6 +204,8 @@ static void _source_transform_update(E_Video_Viewport_Source *source);
 static void _viewport_border_init(E_Video_Viewport *viewport);
 static void _viewport_border_finish(E_Video_Viewport *viewport);
 static void _viewport_border_geometry_update(E_Video_Viewport *viewport);
+static void _border_show(Viewport_Border *border);
+static void _border_hide(Viewport_Border *border);
 
 static void
 _viewport_cb_source_destroy(struct wl_listener *listener, void *data)
@@ -426,8 +451,7 @@ _viewport_consider_map(E_Video_Viewport *viewport)
      {
         viewport->mapped = EINA_TRUE;
 
-        if (viewport->border)
-          evas_object_show(viewport->border);
+        _border_show(viewport->border);
 
         if (viewport->source)
           _source_viewport_map_state_changed(viewport->source);
@@ -442,8 +466,7 @@ _viewport_unmap(E_Video_Viewport *viewport)
 
    viewport->mapped = EINA_FALSE;
 
-   if (viewport->border)
-     evas_object_hide(viewport->border);
+   _border_hide(viewport->border);
 
    if (viewport->source)
      _source_viewport_map_state_changed(viewport->source);
@@ -2089,107 +2112,126 @@ e_video_shell_viewport_transform(const char *handle, E_Video_Shell_Transform tra
      }
 }
 
-typedef enum
-{
-   TOP = 0,
-   BOTTOM,
-   LEFT,
-   RIGHT,
-   NUM_DIRECTIONS,
-} E_Video_Viewport_Border_Direction;
-
-typedef struct
+static void
+_border_rects_add(Viewport_Border *border, const int color[4])
 {
-   Evas_Object_Smart_Clipped_Data base;
-   Evas_Object *objs[NUM_DIRECTIONS];
-   Evas_Object *inner_obj;
-} E_Video_Viewport_Border_Smart_Data;
+   const int interior_color[4] = {50, 50, 50, 50};
+   int i;
 
-EVAS_SMART_SUBCLASS_NEW("Viewport_Border", _viewport_border,
-                        Evas_Smart_Class, Evas_Smart_Class,
-                        evas_object_smart_clipped_class_get, NULL)
+   border->interior_rect = e_view_rect_create(&border->tree, 1, 1, interior_color);
+   e_view_show(e_view_rect_view_get(border->interior_rect));
+   for (i = 0; i < NUM_DIRECTIONS; i++)
+     {
+        border->rects[i] = e_view_rect_create(&border->tree, 1, 1, color);
+        e_view_show(e_view_rect_view_get(border->rects[i]));
+     }
+}
 
 static void
-_viewport_border_smart_add(Evas_Object *o)
+_border_show(Viewport_Border *border)
 {
-   EVAS_SMART_DATA_ALLOC(o, E_Video_Viewport_Border_Smart_Data);
+   if (!border) return;
+   e_view_show(e_view_tree_view_get(&border->tree));
+}
 
-   _viewport_border_parent_sc->add(o);
+static void
+_border_hide(Viewport_Border *border)
+{
+   if (!border) return;
+   e_view_hide(e_view_tree_view_get(&border->tree));
+}
 
-   for (int i = 0; i < NUM_DIRECTIONS; i++)
-     {
-        priv->objs[i] = evas_object_rectangle_add(evas_object_evas_get(o));
-        evas_object_smart_member_add(priv->objs[i], o);
-        evas_object_show(priv->objs[i]);
-     }
+static void
+_border_place_above(Viewport_Border *border, E_View *sibling)
+{
+   e_view_reparent(e_view_tree_view_get(&border->tree), e_view_parent_get(sibling));
+   e_view_place_above(e_view_tree_view_get(&border->tree), sibling);
+}
 
-   priv->inner_obj = evas_object_rectangle_add(evas_object_evas_get(o));
-   evas_object_smart_member_add(priv->inner_obj, o);
-   evas_object_color_set(priv->inner_obj, 50, 50, 50, 50);
-   evas_object_show(priv->inner_obj);
+static void
+_border_move(Viewport_Border *border, int x, int y)
+{
+   e_view_position_set(e_view_tree_view_get(&border->tree), x, y);
 }
 
 static void
-_viewport_border_smart_resize(Evas_Object *o, Evas_Coord w, Evas_Coord h)
+_border_resize(Viewport_Border *border, int width, int height)
 {
-   E_Video_Viewport_Border_Smart_Data *priv = evas_object_smart_data_get(o);
-   Evas_Coord ox, oy, ow, oh;
-   const int BORDER_SIZE = 3;
+   e_view_rect_size_set(border->interior_rect, width, height);
+
+   e_view_rect_size_set(border->rects[TOP], width, border->width);
 
-   evas_object_geometry_get(o, &ox, &oy, &ow, &oh);
-   if ((ow == w) && (oh == h)) return;
+   e_view_position_set(e_view_rect_view_get(border->rects[BOTTOM]), 0, (height - border->width));
+   e_view_rect_size_set(border->rects[BOTTOM], width, border->width);
 
-   evas_object_resize(priv->objs[TOP], w, BORDER_SIZE);
+   e_view_position_set(e_view_rect_view_get(border->rects[LEFT]), 0, border->width);
+   e_view_rect_size_set(border->rects[LEFT], border->width, height - (border->width * 2));
 
-   evas_object_move(priv->objs[BOTTOM], ox, oy + (h - BORDER_SIZE));
-   evas_object_resize(priv->objs[BOTTOM], w, BORDER_SIZE);
+   e_view_position_set(e_view_rect_view_get(border->rects[RIGHT]), width - border->width, border->width);
+   e_view_rect_size_set(border->rects[RIGHT], border->width, height - (border->width * 2));
+}
+
+static Viewport_Border *
+_border_create(E_View_Tree *parent, const int color[4])
+{
+   const int BORDER_WIDTH = 3;
+   Viewport_Border *border;
+
+   border = calloc(1, sizeof(*border));
+   if (!border)
+     return NULL;
 
-   evas_object_move(priv->objs[LEFT], ox, oy + BORDER_SIZE);
-   evas_object_resize(priv->objs[LEFT], BORDER_SIZE, h - (BORDER_SIZE * 2));
+   border->width = BORDER_WIDTH;
 
-   evas_object_move(priv->objs[RIGHT], ox + (w - BORDER_SIZE), oy + BORDER_SIZE);
-   evas_object_resize(priv->objs[RIGHT], BORDER_SIZE, h - (BORDER_SIZE * 2));
+   e_view_tree_init(&border->tree, NULL, parent);
+   _border_rects_add(border, color);
 
-   evas_object_resize(priv->inner_obj, w, h);
+   return border;
 }
 
 static void
-_viewport_border_smart_set_user(Evas_Smart_Class *sc)
+_border_destroy(Viewport_Border *border)
 {
-   sc->add = _viewport_border_smart_add;
-   sc->resize = _viewport_border_smart_resize;
+   e_view_destroy(e_view_tree_view_get(&border->tree));
+
+   wl_list_remove(&border->show.link);
+   wl_list_remove(&border->hide.link);
+   wl_list_remove(&border->restack.link);
+   free(border);
 }
 
 static void
-_viewport_border_cb_show(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+_border_cb_show(struct wl_listener *listener, void *data)
 {
-   E_Video_Viewport *viewport = data;
+   Viewport_Border *border = wl_container_of(listener, border, show);
 
-   evas_object_show(viewport->border);
+   _border_show(border);
 }
 
 static void
-_viewport_border_cb_hide(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+_border_cb_hide(struct wl_listener *listener, void *data)
 {
-   E_Video_Viewport *viewport = data;
+   Viewport_Border *border = wl_container_of(listener, border, hide);
 
-   evas_object_hide(viewport->border);
+   _border_hide(border);
 }
 
 static void
-_viewport_border_cb_restack(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
+_border_cb_restack(struct wl_listener *listener, void *data)
 {
-   E_Video_Viewport *viewport = data;
+   Viewport_Border *border = wl_container_of(listener, border, restack);
 
-   evas_object_layer_set(viewport->border, evas_object_layer_get(obj));
-   evas_object_stack_above(viewport->border, obj);
+   _border_place_above(border, ((E_View_Event_Callback_Data *)data)->view);
 }
 
 static void
 _viewport_border_init(E_Video_Viewport *viewport)
 {
    E_Client *ec;
-   E_Client *parent_ec;
+   E_View *view;
+   E_View_Client *parent_view;
+   Viewport_Border *border;
+   const int color[4] = {255, 0, 0, 255};
 
    if (viewport->border)
      return;
@@ -2199,44 +2241,38 @@ _viewport_border_init(E_Video_Viewport *viewport)
    else
      ec = e_surface_ec_get(e_subsurface_surface_get(viewport->subsurface));
 
-   viewport->border = evas_object_smart_add(evas_object_evas_get(ec->frame), _viewport_border_smart_class_new());
-   evas_object_color_set(viewport->border, 255, 0, 0, 255);
-   evas_object_layer_set(viewport->border, evas_object_layer_get(ec->frame));
-   evas_object_stack_above(viewport->border, ec->frame);
+   view = e_view_client_view_get(e_client_view_get(ec));
+   border = _border_create(e_view_parent_get(view), color);
+   if (!border)
+     {
+        VS_ERR("Failed to create Viewport_Border");
+        return;
+     }
+   _border_place_above(border, view);
+
+   if (e_view_visible_get(view))
+     _border_show(border);
+
+   parent_view = e_client_view_get(e_surface_ec_get(e_subsurface_parent_try_get(viewport->subsurface)));
+   border->show.notify = _border_cb_show;
+   e_view_client_show_listener_add(parent_view, &border->show);
+
+   border->hide.notify = _border_cb_hide;
+   e_view_client_hide_listener_add(parent_view, &border->hide);
 
-   parent_ec = e_surface_ec_get(e_subsurface_parent_try_get(viewport->subsurface));
-   if (evas_object_visible_get(parent_ec->frame))
-     evas_object_show(viewport->border);
+   border->restack.notify = _border_cb_restack;
+   e_view_event_listener_add(view, E_VIEW_RESTACK, &border->restack);
 
-   evas_object_event_callback_add(parent_ec->frame, EVAS_CALLBACK_SHOW, _viewport_border_cb_show, viewport);
-   evas_object_event_callback_add(parent_ec->frame, EVAS_CALLBACK_HIDE, _viewport_border_cb_hide, viewport);
-   evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_RESTACK, _viewport_border_cb_restack, viewport);
+   viewport->border = border;
 }
 
 static void
 _viewport_border_finish(E_Video_Viewport *viewport)
 {
-   E_Surface *parent_surface;
-   E_Client *ec, *parent_ec;
-
    if (!viewport->border)
      return;
 
-   if (viewport->source)
-     ec = e_surface_ec_get(viewport->source->surface->surface);
-   else
-     ec = e_surface_ec_get(e_subsurface_surface_get(viewport->subsurface));
-
-   parent_surface = e_subsurface_parent_try_get(viewport->subsurface);
-   if (parent_surface)
-     {
-        parent_ec = e_surface_ec_get(parent_surface);
-        evas_object_event_callback_del(parent_ec->frame, EVAS_CALLBACK_SHOW, _viewport_border_cb_show);
-        evas_object_event_callback_del(parent_ec->frame, EVAS_CALLBACK_HIDE, _viewport_border_cb_hide);
-     }
-
-   evas_object_event_callback_del(ec->frame, EVAS_CALLBACK_RESTACK, _viewport_border_cb_restack);
-   evas_object_del(viewport->border);
+   _border_destroy(viewport->border);
    viewport->border = NULL;
 }
 
@@ -2245,10 +2281,11 @@ _viewport_border_geometry_update(E_Video_Viewport *viewport)
 {
    int x, y;
 
-   if (!viewport->border)
+   if ((!viewport->border) ||
+       (viewport->current.width <= 0 || viewport->current.height <= 0))
      return;
 
    e_subsurface_coord_get(viewport->subsurface, &x, &y);
-   evas_object_move(viewport->border, x, y);
-   evas_object_resize(viewport->border, viewport->current.width, viewport->current.height);
+   _border_move(viewport->border, x, y);
+   _border_resize(viewport->border, viewport->current.width, viewport->current.height);
 }