e_magnifier: change code to use e_view system 78/319178/1
authorDoyoun Kang <doyoun.kang@samsung.com>
Mon, 3 Feb 2025 07:00:46 +0000 (16:00 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 5 Feb 2025 04:58:06 +0000 (13:58 +0900)
I changed code to use e_view system instead of evas_object directly.
However, since there is no way to group multiple e_view_images within one e_view_image
in current e_view system, we have applied zoom to each e_view_images.

We will need to find another way to appliy zoom functionality.

Change-Id: Ic1e5db4f1fcbbe7f377f9a02191cf6eb8d7d70b4

src/bin/windowmgr/e_magnifier.c
src/bin/windowmgr/e_magnifier_intern.h
src/include/e_client.h

index c4ee0d832ad29dff637bfca9714e94bcca1040e0..e3340ce36d37bc231c79d1ac51c40f8d0fd46787 100644 (file)
@@ -2,6 +2,8 @@
 #include "e_client_intern.h"
 #include "e_view_intern.h"
 #include "e_view_client_intern.h"
+#include "e_view_rect.h"
+#include "e_utils.h"
 
 #define E_MAGNIFIER_SMART_DATA_GET(obj, ptr)                        \
    E_Magnifier_Smart_Data *ptr = evas_object_smart_data_get(obj);
@@ -48,14 +50,17 @@ struct _E_Magnifier_Listener
    struct wl_listener resize_listener;
 };
 
-EVAS_SMART_SUBCLASS_NEW(E_MAGNIFIER_SMART_OBJ_TYPE, _e_magnifier,
-                    Evas_Smart_Class, Evas_Smart_Class,
-                    evas_object_smart_clipped_class_get, NULL);
+static Eina_Bool _e_magnifier_smart_client_cb_add(void *data, int type, void *event);
+static Eina_Bool _e_magnifier_smart_client_cb_remove(void *data, int type, void *event);
+static Eina_Bool _e_magnifier_smart_client_cb_stack(void *data, int type, void *event);
+static Eina_Bool _e_magnifier_smart_client_cb_show(void *data, int type, void *event);
+static Eina_Bool _e_magnifier_smart_client_cb_hide(void *data, int type, void *event);
+static Eina_Bool _e_magnifier_smart_client_cb_move(void *data, int type, void *event);
+static Eina_Bool _e_magnifier_smart_client_cb_resize(void *data, int type, void *event);
+static void      _e_magnifier_smart_cb_hook_client_del(void *data, E_Client *ec);
+static Eina_Bool _e_magnifier_smart_cb_hook_effect_end(void *data, E_Client *ec);
+static void      _e_magnifier_smart_cb_hook_client_reuse(void *data, E_Client *ec);
 
-
-static Eina_Bool _e_magnifier_smart_init(void);
-static void      _e_magnifier_smart_add(Evas_Object *obj);
-static void      _e_magnifier_smart_del(Evas_Object *obj);
 static Eina_Bool _e_magnifier_proxy_ec_new(E_Client *ec);
 static void      _e_magnifier_proxy_ec_del(E_Client *ec);
 static Eina_Bool _e_magnifier_proxy_ec_all_add(void);
@@ -63,39 +68,126 @@ static Eina_Bool _e_magnifier_proxy_ec_all_remove(void);
 static void _e_magnifier_owner_set(E_Client *ec);
 static void _e_magnifier_owner_unset(E_Client *ec);
 
-static Evas_Object *_e_magnifier_mgr = NULL;
 static E_Magnifier_Listener *_e_magnifier_listener = NULL;
 
-static Eina_Bool
-_e_magnifier_smart_init(void)
+typedef struct _E_Magnifier_Manager
 {
-   E_Zone *zone;
+   E_View_Tree tree;
+   E_View_Rect *base_rect;
+   E_View_Rect *clip_rect;
+
+   Eina_List *handlers;
+   Eina_List *hooks;
+   Eina_List *cp_hooks;
+   Eina_List *wl_hooks;
+   E_Desk *desk;
+   E_Client *owner;
 
-   zone = e_zone_current_get();
-   EINA_SAFETY_ON_NULL_RETURN_VAL(zone, EINA_FALSE);
+   int stand_alone_mode;
+   E_Magnifier_Zoom_Ratio ratio;
+   struct
+   {
+      struct
+      {
+         int x, y, w, h;
+      } user;
+      struct
+      {
+         int x, y, w, h;
+      } system;
+   } geom;
+   Eina_Bool enabled;
 
-   _e_magnifier_mgr = evas_object_smart_add(e_comp_evas_get(), _e_magnifier_smart_class_new());
-   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) EINA_FALSE;
+   struct wl_listener show;
+} E_Magnifier_Manager;
 
-   ELOGF("MAGNIFIER", "INIT Magnifier (%p)", NULL, _e_magnifier_mgr);
+static E_Magnifier_Manager *_e_magnifier_mgr = NULL;
 
-   sd->ratio = E_MAGNIFIER_ZOOM_RATIO_150;
+static E_View_Tree *_e_magnifier_tree_get(E_Magnifier_Manager *emm)
+{
+   E_View_Tree *tree;
+   tree = &_e_magnifier_mgr->tree;
 
-   sd->geom.system.x = 0;
-   sd->geom.system.y = 0;
-   sd->geom.system.w = 360;
-   sd->geom.system.h = 360;
+   return tree;
+}
 
-   evas_object_move(_e_magnifier_mgr, zone->x, zone->y);
-   evas_object_resize(_e_magnifier_mgr, zone->w, zone->h);
+static void
+_clip_rect_geometry_set(E_Magnifier_Manager *emm, int x, int y, int w, int h)
+{
+   e_view_rect_size_set(emm->clip_rect, w, h);
+   e_view_position_set(e_view_rect_view_get(emm->clip_rect), x, y);
+}
 
-   return EINA_TRUE;
+static E_Magnifier_Manager *
+_e_magnifier_manager_create(E_Zone *zone)
+{
+   E_Magnifier_Manager *emm = NULL;
+
+   emm = E_NEW(E_Magnifier_Manager, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(emm, NULL);
+
+   ELOGF("MAGNIFIER", "===== START  Create Magnifier Manager(%p)", NULL, emm);
+
+   emm->ratio = E_MAGNIFIER_ZOOM_RATIO_100;
+
+   emm->geom.system.x = 0;
+   emm->geom.system.y = 0;
+   emm->geom.system.w = 360;
+   emm->geom.system.h = 360;
+
+   E_View_Tree *layer_tree = e_canvas_layer_view_tree_get(e_comp_canvas_get(), E_CANVAS_LAYER_DESK_OBJECT_BELOW);
+   e_view_tree_init(&emm->tree, NULL, layer_tree);
+   e_view_show(e_view_tree_view_get(&emm->tree));
+
+   // for clipping
+   const int color[4] = {255, 255, 255, 255};
+   emm->clip_rect = e_view_rect_create(layer_tree, zone->w, zone->h, color);
+   e_view_show(e_view_rect_view_get(emm->clip_rect));
+
+   E_LIST_HANDLER_APPEND(emm->handlers, E_EVENT_CLIENT_ADD, _e_magnifier_smart_client_cb_add, emm);
+   E_LIST_HANDLER_APPEND(emm->handlers, E_EVENT_CLIENT_REMOVE, _e_magnifier_smart_client_cb_remove, emm);
+   E_LIST_HANDLER_APPEND(emm->handlers, E_EVENT_CLIENT_STACK, _e_magnifier_smart_client_cb_stack, emm);
+   E_LIST_HANDLER_APPEND(emm->handlers, E_EVENT_CLIENT_SHOW, _e_magnifier_smart_client_cb_show, emm);
+   E_LIST_HANDLER_APPEND(emm->handlers, E_EVENT_CLIENT_HIDE, _e_magnifier_smart_client_cb_hide, emm);
+   E_LIST_HANDLER_APPEND(emm->handlers, E_EVENT_CLIENT_MOVE, _e_magnifier_smart_client_cb_move, emm);
+   E_LIST_HANDLER_APPEND(emm->handlers, E_EVENT_CLIENT_RESIZE, _e_magnifier_smart_client_cb_resize, emm);
+
+   // e_client hooks
+   E_LIST_HOOK_APPEND(emm->hooks, E_CLIENT_HOOK_DEL, _e_magnifier_smart_cb_hook_client_del, emm);
+
+   // e_comp_object hooks
+   E_COMP_COMP_HOOK_APPEND(emm->cp_hooks, E_COMP_OBJECT_HOOK_EFFECT_END, _e_magnifier_smart_cb_hook_effect_end, emm);
+
+   // e_comp_wl hooks
+   E_COMP_WL_HOOK_APPEND(emm->wl_hooks, E_COMP_WL_HOOK_CLIENT_REUSE, _e_magnifier_smart_cb_hook_client_reuse, emm);
+
+
+   ELOGF("MAGNIFIER", "===== END   Create Magnifier Manager(%p)", NULL, emm);
+
+   return emm;
+}
+
+static void
+_e_magnifier_manager_destroy(E_Magnifier_Manager *emm)
+{
+   if (!emm) return;
+
+   E_FREE_LIST(emm->handlers, ecore_event_handler_del);
+   E_FREE_LIST(emm->hooks, e_client_hook_del);
+   E_FREE_LIST(emm->cp_hooks, e_comp_object_hook_del);
+   E_FREE_LIST(emm->wl_hooks, e_comp_wl_hook_del);
+
+   e_view_destroy(e_view_rect_view_get(emm->clip_rect));
+   e_view_destroy(e_view_tree_view_get(&emm->tree));
+
+   E_FREE(emm);
 }
 
 static Eina_Bool
 _e_magnifier_proxy_ec_new(E_Client *ec)
 {
    Eina_Bool ret;
+   E_View *proxy_view;
 
    if (!ec) return EINA_FALSE;
    if (!e_client_view_get(ec)) return EINA_FALSE;
@@ -106,29 +198,35 @@ _e_magnifier_proxy_ec_new(E_Client *ec)
         return EINA_FALSE;
      }
 
-   ec->magnifier_proxy = evas_object_image_filled_add(e_comp_evas_get());
+   ec->magnifier_proxy = e_view_image_create(_e_magnifier_tree_get(_e_magnifier_mgr));
    if (!ec->magnifier_proxy)
      {
         ELOGF("MAGNIFIER", "CAN NOT make PROXY object..", ec);
         return EINA_FALSE;
      }
+   e_view_image_filled_set(ec->magnifier_proxy, true);
+   proxy_view = e_view_image_view_get(ec->magnifier_proxy);
 
-   ELOGF("MAGNIFIER", "New PROXY object.. proxy:%p", ec, ec->magnifier_proxy);
+   ELOGF("MAGNIFIER", "New PROXY object.. proxy:(view_image:%p view:%p, evas_object:%p", ec, ec->magnifier_proxy, proxy_view, proxy_view->eo);
 
-   ret = evas_object_image_source_set(ec->magnifier_proxy, ec->frame);
+   E_View_Client *evc = e_client_view_get(ec);
+   E_View *ev = e_view_client_view_get(evc);
+
+   ret = e_view_image_source_set(ec->magnifier_proxy, ev);
    if (!ret)
      {
         ELOGF("MAGNIFIER", "Fail to set image source to PROXY object..", ec);
         return EINA_FALSE;
      }
 
-   evas_object_image_source_events_set(ec->magnifier_proxy, EINA_TRUE);
-   evas_object_image_source_clip_set(ec->magnifier_proxy, EINA_FALSE);
+   // doesn't support below APIs
+   //   evas_object_image_source_events_set(ec->magnifier_proxy, EINA_TRUE);
+   //   evas_object_image_source_clip_set(ec->magnifier_proxy, EINA_FALSE);
 
-   evas_object_move(ec->magnifier_proxy, ec->x, ec->y);
-   evas_object_resize(ec->magnifier_proxy, ec->w, ec->h);
+   e_view_image_geometry_set(ec->magnifier_proxy, ec->x, ec->y, ec->w, ec->h);
 
-   evas_object_show(ec->magnifier_proxy);
+   e_view_clip_set(proxy_view, e_view_rect_view_get(_e_magnifier_mgr->clip_rect));
+   e_view_show(proxy_view);
 
    return EINA_TRUE;
 }
@@ -141,7 +239,9 @@ _e_magnifier_proxy_ec_del(E_Client *ec)
 
    ELOGF("MAGNIFIER", "Delete PROXY object.. proxy:%p", ec, ec->magnifier_proxy);
 
-   evas_object_del(ec->magnifier_proxy);
+   E_View *view = e_view_image_view_get(ec->magnifier_proxy);
+   e_view_destroy(view);
+
    ec->magnifier_proxy = NULL;
 }
 
@@ -149,7 +249,6 @@ static Eina_Bool
 _e_magnifier_proxy_ec_all_add(void)
 {
    E_Client *ec = NULL;
-   Eina_Bool ret;
    E_Zone *zone;
    E_Desk *desk, *desk2;
 
@@ -166,10 +265,7 @@ _e_magnifier_proxy_ec_all_add(void)
         if (!e_client_view_get(ec)) continue;
         if (ec->is_magnifier) continue;
 
-        ret = _e_magnifier_proxy_ec_new(ec);
-        if (!ret) continue;
-
-        e_magnifier_smart_member_add(desk, ec->magnifier_proxy);
+        _e_magnifier_proxy_ec_new(ec);
      }
 
    return EINA_TRUE;
@@ -182,7 +278,6 @@ _e_magnifier_proxy_ec_all_remove(void)
 
    E_CLIENT_FOREACH(ec)
      {
-        e_magnifier_smart_member_del(ec->magnifier_proxy);
         _e_magnifier_proxy_ec_del(ec);
      }
 
@@ -190,31 +285,36 @@ _e_magnifier_proxy_ec_all_remove(void)
 }
 
 static void
-_e_magnifier_smart_member_reorder(E_Desk *desk)
+_e_magnifier_view_member_reorder(E_Desk *desk)
 {
    E_Client *ec;
-   Evas_Object *proxy;
-   Evas_Object *smart_parent;
+   E_View_Image *proxy;
+   E_View_Tree *parent;
+   E_View *proxy_view;
 
    E_CLIENT_FOREACH(ec)
      {
         proxy = ec->magnifier_proxy;
         if (!proxy) continue;
 
-        smart_parent = evas_object_smart_parent_get(proxy);
-        if (smart_parent == _e_magnifier_mgr)
+        proxy_view = e_view_image_view_get(proxy);
+        parent = e_view_parent_get(proxy_view);
+        if (parent == _e_magnifier_tree_get(_e_magnifier_mgr))
           {
-             evas_object_raise(proxy);
+             e_view_raise_to_top(proxy_view);
           }
      }
 }
 
 static void
-_e_magnifier_calculate_zoom_geometry(E_Magnifier_Zoom_Ratio ratio, int x, int y, int w, int h, int *nx, int *ny, int *nw, int *nh)
+_e_magnifier_calculate_zoom_geometry(E_Magnifier_Zoom_Ratio ratio, int x, int y, int w, int h, int *nx, int *ny, int *nw, int *nh, int *gapx, int *gapy)
 {
    if (!nx || !ny || !nw || !nh)
      return;
 
+   if (gapx) *gapx = 0;
+   if (gapy) *gapy = 0;
+
    switch (ratio)
      {
       case E_MAGNIFIER_ZOOM_RATIO_100:
@@ -223,6 +323,8 @@ _e_magnifier_calculate_zoom_geometry(E_Magnifier_Zoom_Ratio ratio, int x, int y,
          *ny = y;
          *nw = w;
          *nh = h;
+         if (gapx) *gapx = 0;
+         if (gapy) *gapy = 0;
          break;
       case E_MAGNIFIER_ZOOM_RATIO_110:
          // TODO: need to implement
@@ -242,6 +344,8 @@ _e_magnifier_calculate_zoom_geometry(E_Magnifier_Zoom_Ratio ratio, int x, int y,
          *ny = y + (h/8);
          *nw = w * 0.67;
          *nh = h * 0.67;
+         if (gapx) *gapx = w/8;
+         if (gapy) *gapy = h/8;
          break;
       case E_MAGNIFIER_ZOOM_RATIO_160:
          // TODO: need to implement
@@ -260,6 +364,8 @@ _e_magnifier_calculate_zoom_geometry(E_Magnifier_Zoom_Ratio ratio, int x, int y,
          *ny = y + (h/4);
          *nw = w/2;
          *nh = h/2;
+         if (gapx) *gapx = w/4;
+         if (gapy) *gapy = h/4;
          break;
       default:
          break;
@@ -267,62 +373,105 @@ _e_magnifier_calculate_zoom_geometry(E_Magnifier_Zoom_Ratio ratio, int x, int y,
 }
 
 static void
-_e_magnifier_apply_zoom(Evas_Object *zoom_obj)
+_e_magnifier_apply_zoom(E_Magnifier_Manager *emm)
 {
-   if (!zoom_obj) return;
+   if (!emm) return;
 
    E_Magnifier_Zoom_Ratio zoom_ratio;
    int x, y, w, h;
    int mx, my, mw, mh;
    E_Map *map;
 
-   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
+   int gapx, gapy;
+   int cx, cy, cw, ch;
+   E_View_Image *evi;
 
    //Evas Map
    map = e_map_new();
 
-   x = sd->geom.system.x;
-   y = sd->geom.system.y;
-   w = sd->geom.system.w;
-   h = sd->geom.system.h;
+   E_View *child;
+   E_View_Tree *tree;
 
-   mx = sd->geom.system.x;
-   my = sd->geom.system.y;
-   mw = sd->geom.system.w;
-   mh = sd->geom.system.h;
+   tree = &emm->tree;
 
-   e_map_point_coord_set(map, 0, x, y, 0);
-   e_map_point_coord_set(map, 1, x + w, y, 0);
-   e_map_point_coord_set(map, 2, x + w, y + h, 0);
-   e_map_point_coord_set(map, 3, x, y + h, 0);
+   wl_list_for_each(child, &tree->children, link)
+     {
+        evi = e_view_image_try_from_view(child);
+        if (!evi) continue;
+
+        e_view_image_geometry_get(evi, &cx, &cy, &cw, &ch);
+
+        x = emm->geom.system.x;
+        y = emm->geom.system.y;
+        w = emm->geom.system.w;
+        h = emm->geom.system.h;
+
+        mx = emm->geom.system.x;
+        my = emm->geom.system.y;
+        mw = emm->geom.system.w;
+        mh = emm->geom.system.h;
+
+        //ELOGF("MAGNIFIER", "zoom_obj(%p) sd->geom.system(%d,%d,%d,%d)", NULL, zoom_obj, x, y, w, h);
+
+        zoom_ratio = emm->ratio;
+        _e_magnifier_calculate_zoom_geometry(zoom_ratio, x, y, w, h, &mx, &my, &mw, &mh, &gapx, &gapy);
+
+        //ELOGF("MAGNIFIER", "zoom_obj(%p) uv set(%d,%d,%d,%d)", NULL, zoom_obj, mx, my, mw, mh);
+
+        if (mx >= cx)
+          {
+             if (mx+mw > cx+cw)
+               {
+                  mx = cw - mw;
+                  x = cx + mx - gapx;
+               }
+             else
+               mx -= cx;
+          }
+        else
+          {
+             x = (x - (mx - cx));
+             mx = 0;
+          }
 
-   //ELOGF("MAGNIFIER", "zoom_obj(%p) sd->geom.system(%d,%d,%d,%d)", NULL, zoom_obj, x, y, w, h);
+        if (my >= cy)
+          {
+             if (my+mh > cy+ch)
+               {
+                  my = ch - mh;
+                  y = cy + my - gapy;
+               }
+             else
+               {
+                  my -= cy;
+               }
+          }
+        else
+          {
+             y = (y - (my - cy));
+             my = 0;
 
-   zoom_ratio = sd->ratio;
-   _e_magnifier_calculate_zoom_geometry(zoom_ratio, x, y, w, h, &mx, &my, &mw, &mh);
+          }
 
-   //ELOGF("MAGNIFIER", "zoom_obj(%p) uv set(%d,%d,%d,%d)", NULL, zoom_obj, mx, my, mw, mh);
+        e_map_point_coord_set(map, 0, x, y, 0);
+        e_map_point_coord_set(map, 1, x + w, y, 0);
+        e_map_point_coord_set(map, 2, x + w, y + h, 0);
+        e_map_point_coord_set(map, 3, x, y + h, 0);
 
-   e_map_point_image_uv_set(map, 0, mx, my);
-   e_map_point_image_uv_set(map, 1, mx+mw, my);
-   e_map_point_image_uv_set(map, 2, mx+mw, my+mh);
-   e_map_point_image_uv_set(map, 3, mx, my+mh);
+        e_map_point_image_uv_set(map, 0, mx, my);
+        e_map_point_image_uv_set(map, 1, mx+mw, my);
+        e_map_point_image_uv_set(map, 2, mx+mw, my+mh);
+        e_map_point_image_uv_set(map, 3, mx, my+mh);
 
-   // apply Evas Map to btn
-   e_comp_object_map_set(zoom_obj, map);
-   e_comp_object_map_enable_set(zoom_obj, EINA_TRUE);
+        // apply Evas Map
+        e_view_map_set(child, map);
+        e_view_map_enable_set(child, EINA_TRUE);
+     }
 
    // Remove Map
    e_map_free(map);
 }
 
-static void
-_e_magnifier_smart_set_user(Evas_Smart_Class *sc)
-{
-   sc->add = _e_magnifier_smart_add;
-   sc->del = _e_magnifier_smart_del;
-}
-
 static Eina_Bool
 _e_magnifier_smart_client_cb_add(void *data, int type, void *event)
 {
@@ -343,7 +492,6 @@ _e_magnifier_smart_client_cb_add(void *data, int type, void *event)
    if (!desk) goto end;
 
    _e_magnifier_proxy_ec_new(ec);
-   e_magnifier_smart_member_add(desk, ec->magnifier_proxy);
 
 end:
    return ECORE_CALLBACK_PASS_ON;
@@ -363,7 +511,6 @@ _e_magnifier_smart_client_cb_remove(void *data, int type, void *event)
    if (!ec) goto end;
    if (!ec->magnifier_proxy) goto end;
 
-   e_magnifier_smart_member_del(ec->magnifier_proxy);
    _e_magnifier_proxy_ec_del(ec);
 
 end:
@@ -389,7 +536,7 @@ _e_magnifier_smart_client_cb_stack(void *data, int type, void *event)
    desk = e_zone_desk_find_by_ec(zone, ec);
    if (!desk) goto end;
 
-   _e_magnifier_smart_member_reorder(desk);
+   _e_magnifier_view_member_reorder(desk);
 
 end:
    return ECORE_CALLBACK_PASS_ON;
@@ -409,7 +556,8 @@ _e_magnifier_smart_client_cb_show(void *data, int type, void *event)
    if (!ec) goto end;
    if (!ec->magnifier_proxy) goto end;
 
-   evas_object_show(ec->magnifier_proxy);
+   E_View *proxy_view = e_view_image_view_get(ec->magnifier_proxy);
+   e_view_show(proxy_view);
 
 end:
    return ECORE_CALLBACK_PASS_ON;
@@ -429,7 +577,8 @@ _e_magnifier_smart_client_cb_hide(void *data, int type, void *event)
    if (!ec) goto end;
    if (!ec->magnifier_proxy) goto end;
 
-   evas_object_hide(ec->magnifier_proxy);
+   E_View *proxy_view = e_view_image_view_get(ec->magnifier_proxy);
+   e_view_hide(proxy_view);
 
 end:
    return ECORE_CALLBACK_PASS_ON;
@@ -450,7 +599,7 @@ _e_magnifier_smart_client_cb_move(void *data, int type, void *event)
    if (!ec->magnifier_proxy) goto end;
    if (ec->is_magnifier) goto end;
 
-   evas_object_move(ec->magnifier_proxy, ec->x, ec->y);
+   e_view_image_geometry_set(ec->magnifier_proxy, ec->x, ec->y, ec->w, ec->h);
 
 end:
    return ECORE_CALLBACK_PASS_ON;
@@ -471,7 +620,7 @@ _e_magnifier_smart_client_cb_resize(void *data, int type, void *event)
    if (!ec->magnifier_proxy) goto end;
    if (ec->is_magnifier) goto end;
 
-   evas_object_resize(ec->magnifier_proxy, ec->w, ec->h);
+   e_view_image_geometry_set(ec->magnifier_proxy, ec->x, ec->y, ec->w, ec->h);
 
 end:
    return ECORE_CALLBACK_PASS_ON;
@@ -491,7 +640,7 @@ _e_magnifier_smart_cb_hook_effect_end(void *data, E_Client *ec)
    desk = e_zone_desk_find_by_ec(zone, ec);
    if (!desk) goto end;
 
-   _e_magnifier_smart_member_reorder(desk);
+   _e_magnifier_view_member_reorder(desk);
 
 end:
    return EINA_TRUE;
@@ -500,7 +649,6 @@ end:
 static void
 _e_magnifier_smart_cb_hook_client_reuse(void *data, E_Client *ec)
 {
-   Eina_Bool ret;
    E_Zone *zone;
    E_Desk *desk;
 
@@ -511,9 +659,7 @@ _e_magnifier_smart_cb_hook_client_reuse(void *data, E_Client *ec)
    if (!desk) return;
 
    _e_magnifier_proxy_ec_del(ec);
-   ret = _e_magnifier_proxy_ec_new(ec);
-   if (ret)
-     e_magnifier_smart_member_add(desk, ec->magnifier_proxy);
+   _e_magnifier_proxy_ec_new(ec);
 }
 
 static void
@@ -523,128 +669,23 @@ _e_magnifier_smart_cb_hook_client_del(void *data, E_Client *ec)
    if (!ec) return;
 
    if (!_e_magnifier_mgr) return;
-   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
 
-   if (sd->owner == ec)
+   if (_e_magnifier_mgr->owner == ec)
      {
         ELOGF("MAGNIFIER", "Deleted Owner.. So, Unset owner", ec);
         e_magnifier_owner_unset(ec);
      }
 }
 
-static void
-_e_magnifier_smart_add(Evas_Object *obj)
-{
-   EVAS_SMART_DATA_ALLOC(obj, E_Magnifier_Smart_Data);
-
-   // e_client event handler
-   E_LIST_HANDLER_APPEND(priv->handlers, E_EVENT_CLIENT_ADD, _e_magnifier_smart_client_cb_add, priv);
-   E_LIST_HANDLER_APPEND(priv->handlers, E_EVENT_CLIENT_REMOVE, _e_magnifier_smart_client_cb_remove, priv);
-   E_LIST_HANDLER_APPEND(priv->handlers, E_EVENT_CLIENT_STACK, _e_magnifier_smart_client_cb_stack, priv);
-   E_LIST_HANDLER_APPEND(priv->handlers, E_EVENT_CLIENT_SHOW, _e_magnifier_smart_client_cb_show, priv);
-   E_LIST_HANDLER_APPEND(priv->handlers, E_EVENT_CLIENT_HIDE, _e_magnifier_smart_client_cb_hide, priv);
-   E_LIST_HANDLER_APPEND(priv->handlers, E_EVENT_CLIENT_MOVE, _e_magnifier_smart_client_cb_move, priv);
-   E_LIST_HANDLER_APPEND(priv->handlers, E_EVENT_CLIENT_RESIZE, _e_magnifier_smart_client_cb_resize, priv);
-
-   // e_client hooks
-   E_LIST_HOOK_APPEND(priv->hooks, E_CLIENT_HOOK_DEL, _e_magnifier_smart_cb_hook_client_del, priv);
-
-   // e_comp_object hooks
-   E_COMP_COMP_HOOK_APPEND(priv->cp_hooks, E_COMP_OBJECT_HOOK_EFFECT_END, _e_magnifier_smart_cb_hook_effect_end, priv);
-
-   // e_comp_wl hooks
-   E_COMP_WL_HOOK_APPEND(priv->wl_hooks, E_COMP_WL_HOOK_CLIENT_REUSE, _e_magnifier_smart_cb_hook_client_reuse, priv);
-
-   evas_object_layer_set(obj, E_LAYER_DESK_OBJECT_BELOW);
-
-   _e_magnifier_parent_sc->add(obj);
-}
-
-static void
-_e_magnifier_smart_del(Evas_Object *obj)
-{
-   _e_magnifier_parent_sc->del(obj);
-
-   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(obj, sd);
-
-   E_FREE_LIST(sd->handlers, ecore_event_handler_del);
-   E_FREE_LIST(sd->hooks, e_client_hook_del);
-   E_FREE_LIST(sd->cp_hooks, e_comp_object_hook_del);
-   E_FREE_LIST(sd->wl_hooks, e_comp_wl_hook_del);
-   free(sd);
-
-   evas_object_smart_data_set(obj, NULL);
-}
-
-static void
-_e_magnifier_cb_mouse_move_proxy(void *data,
-                                 Evas *e EINA_UNUSED,
-                                 Evas_Object *obj,
-                                 void *event_info)
-{
-   Evas_Event_Mouse_Move *ev = event_info;
-   Evas_Object *target_obj;
-   int w, h;
-   int nx, ny;
-
-   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
-
-   target_obj = _e_magnifier_mgr;
-   if (!target_obj) return;
-
-   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
-
-   w = sd->geom.system.w;
-   h = sd->geom.system.h;
-
-   nx = ev->cur.output.x - (w/2);
-   ny = ev->cur.output.y - (h/2);
-
-   sd->geom.system.x = nx;
-   sd->geom.system.y = ny;
-
-   _e_magnifier_apply_zoom(_e_magnifier_mgr);
-}
-
-static void
-_e_magnifier_cb_mouse_down_proxy(void *data,
-                                 Evas *e EINA_UNUSED,
-                                 Evas_Object *obj,
-                                 void *event_info)
-{
-   Evas_Object *target_obj;
-   Evas_Event_Mouse_Down *ev = event_info;
-
-   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
-
-   target_obj = _e_magnifier_mgr;
-   if (!target_obj) return;
-
-   evas_object_event_callback_add(target_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_magnifier_cb_mouse_move_proxy, NULL);
-}
-
-static void
-_e_magnifier_cb_mouse_up_proxy(void *data,
-                               Evas *e EINA_UNUSED,
-                               Evas_Object *obj,
-                               void *event_info)
-{
-   Evas_Object *target_obj;
-   Evas_Event_Mouse_Up *ev = event_info;
-
-   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
-
-   target_obj = _e_magnifier_mgr;
-   if (!target_obj) return;
-
-   evas_object_event_callback_del(target_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_magnifier_cb_mouse_move_proxy);
-}
-
 static void
 _e_magnifier_zoom_obj_geometry_convert_set(int angle, int x, int y, int w, int h, int tx, int ty, int tw, int th)
 {
+   E_Magnifier_Manager *emm;
    int nx, ny, nw, nh;
 
+   emm = _e_magnifier_mgr;
+   if (!emm) return;
+
    switch (angle)
      {
       case 90:
@@ -665,40 +706,43 @@ _e_magnifier_zoom_obj_geometry_convert_set(int angle, int x, int y, int w, int h
          break;
      }
 
-   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
-
-   sd->geom.user.x = nx;
-   sd->geom.user.y = ny;
-   sd->geom.user.w = nw;
-   sd->geom.user.h = nh;
+   emm->geom.user.x = nx;
+   emm->geom.user.y = ny;
+   emm->geom.user.w = nw;
+   emm->geom.user.h = nh;
 
-   //   ELOGF("MAGNIFIER", "New position.. (%d,%d,%dx%d)", NULL, nx, ny, nw, nh);
-   _e_magnifier_apply_zoom(_e_magnifier_mgr);
+   //ELOGF("MAGNIFIER", "New position.. (%d,%d,%dx%d)", NULL, nx, ny, nw, nh);
+   _e_magnifier_apply_zoom(emm);
 }
 
 static void
 _e_magnifier_cb_owner_move_resize(E_Client *ec)
 {
+   E_Magnifier_Manager *emm;
    int x, y, w, h;
    int nx, ny, nw, nh;
 
-   e_view_client_geometry_get(e_client_view_get(ec), &x, &y, &w, &h);
+   emm = _e_magnifier_mgr;
+   if (!emm) return;
 
-   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
+   e_view_client_geometry_get(e_client_view_get(ec), &x, &y, &w, &h);
 
    // TODO: Need to check rotation...
-   nx = x + sd->geom.user.x;
-   ny = y + sd->geom.user.y;
-   nw = sd->geom.user.w;
-   nh = sd->geom.user.h;
+   nx = x + emm->geom.user.x;
+   ny = y + emm->geom.user.y;
+   nw = emm->geom.user.w;
+   nh = emm->geom.user.h;
 
-   sd->geom.system.x = nx;
-   sd->geom.system.y = ny;
-   sd->geom.system.w = nw;
-   sd->geom.system.h = nh;
+   emm->geom.system.x = nx;
+   emm->geom.system.y = ny;
+   emm->geom.system.w = nw;
+   emm->geom.system.h = nh;
 
-   //ELOGF("MAGNIFIER", "Magnifier Owner MoveResize (%,%d,%dx%d). Apply Geometry (%d,%d,%dx%d)", NULL, x, y, w, h, nx, ny, nw, nh);
-   _e_magnifier_apply_zoom(_e_magnifier_mgr);
+   // for clip rect
+   _clip_rect_geometry_set(emm, nx, ny, nw, nh);
+
+   //ELOGF("MAGNIFIER", "Magnifier Owner MoveResize (%d,%d,%dx%d). Apply Geometry (%d,%d,%dx%d)", NULL, x, y, w, h, nx, ny, nw, nh);
+   _e_magnifier_apply_zoom(emm);
 }
 
 static void
@@ -742,7 +786,6 @@ e_magnifier_shutdown(void)
 EINTERN Eina_Bool
 e_magnifier_new(void)
 {
-   Eina_Bool ret;
    ELOGF("MAGNIFIER", "NEW Magnifier", NULL);
 
    if (_e_magnifier_mgr)
@@ -751,10 +794,15 @@ e_magnifier_new(void)
         return EINA_TRUE;
      }
 
-   ret = _e_magnifier_smart_init();
-   if (!ret)
+   E_Zone *zone;
+
+   zone = e_zone_current_get();
+   EINA_SAFETY_ON_NULL_RETURN_VAL(zone, EINA_FALSE);
+
+   _e_magnifier_mgr = _e_magnifier_manager_create(zone);
+   if (!_e_magnifier_mgr)
      {
-        ELOGF("MAGNIFIER", "Fail to NEW Magnifier", NULL);
+        ELOGF("MAGNIFIER", "FAIL to Create Magnifier!!!", NULL);
         return EINA_FALSE;
      }
 
@@ -769,19 +817,16 @@ e_magnifier_del(void)
    ELOGF("MAGNIFIER", "DELETE Magnifier", NULL);
 
    if (!_e_magnifier_mgr) return;
-   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
 
-   if (sd->owner)
+   if (_e_magnifier_mgr->owner)
      {
-        ELOGF("MAGNIFIER", "Fail to DELETE Magnifier.. Owner (win:0x%08zx, ec:%p) exists",
-              NULL, e_client_util_win_get(sd->owner), sd->owner);
+        ELOGF("MAGNIFIER", "Fail to DELETE Magnifier.. Owner (win:0x%08zx_e_magnifier_mgr ec:%p) exists",
+              NULL, e_client_util_win_get(_e_magnifier_mgr->owner), _e_magnifier_mgr->owner);
         return;
      }
 
    _e_magnifier_proxy_ec_all_remove();
-
-   evas_object_del(_e_magnifier_mgr);
-   _e_magnifier_mgr = NULL;
+   _e_magnifier_manager_destroy(_e_magnifier_mgr);
 }
 
 EINTERN Eina_Bool
@@ -790,16 +835,14 @@ e_magnifier_show(E_Client *ec)
    ELOGF("MAGNIFIER", "SHOW Magnifier", NULL);
 
    if (!_e_magnifier_mgr) return EINA_FALSE;
-   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) EINA_FALSE;
 
-   if (sd->owner != ec)
+   if (_e_magnifier_mgr->owner != ec)
      {
         ELOGF("MAGNIFIER", "Not owner... Failed to show...", ec);
         return EINA_FALSE;
      }
 
-   evas_object_show(_e_magnifier_mgr);
-
+   e_view_show(e_view_tree_view_get(_e_magnifier_tree_get(_e_magnifier_mgr)));
    _e_magnifier_apply_zoom(_e_magnifier_mgr);
 
    return EINA_TRUE;
@@ -811,15 +854,14 @@ e_magnifier_hide(E_Client *ec)
    ELOGF("MAGNIFIER", "HIDE Magnifier", NULL);
 
    if (!_e_magnifier_mgr) return;
-   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
 
-   if (sd->owner != ec)
+   if (_e_magnifier_mgr->owner != ec)
      {
         ELOGF("MAGNIFIER", "Not owner... Failed to hide...", ec);
         return;
      }
 
-   evas_object_hide(_e_magnifier_mgr);
+   e_view_hide(e_view_tree_view_get(_e_magnifier_tree_get(_e_magnifier_mgr)));
 }
 
 EINTERN Eina_Bool
@@ -829,14 +871,15 @@ e_magnifier_zoom_obj_ratio_set(E_Client* ec, E_Magnifier_Zoom_Ratio ratio)
        (ratio > E_MAGNIFIER_ZOOM_RATIO_200))
      return EINA_FALSE;
 
-   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) EINA_FALSE;
-   if (sd->owner != ec)
+   if (!_e_magnifier_mgr) return EINA_FALSE;
+
+   if (_e_magnifier_mgr->owner != ec)
      {
         ELOGF("MAGNIFIER", "Not owner... Failed to set ratio...", ec);
         return EINA_FALSE;
      }
 
-   sd->ratio = ratio;
+   _e_magnifier_mgr->ratio = ratio;
 
    _e_magnifier_apply_zoom(_e_magnifier_mgr);
 
@@ -850,8 +893,9 @@ e_magnifier_zoom_obj_geometry_set(E_Client *ec, int angle, int x, int y, int w,
 
    ELOGF("MAGNIFIER", "Zoom obj geometry set (%d,%d,%dx%d)", ec, x, y, w, h);
 
-   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) EINA_FALSE;
-   if (sd->owner != ec)
+   if (!_e_magnifier_mgr) return EINA_FALSE;
+
+   if (_e_magnifier_mgr->owner != ec)
      {
         ELOGF("MAGNIFIER", "Not owner... Failed to set geometry...", ec);
         return EINA_FALSE;
@@ -883,35 +927,6 @@ e_magnifier_zoom_obj_geometry_set(E_Client *ec, int angle, int x, int y, int w,
    return EINA_TRUE;
 }
 
-EINTERN Eina_Bool
-e_magnifier_smart_member_add(E_Desk *desk, Evas_Object *obj)
-{
-   E_OBJECT_CHECK_RETURN(desk, EINA_FALSE);
-   E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, EINA_FALSE);
-
-   ELOGF("MAGNIFIER", "SMART MEMBER ADD.. obj  :%p", NULL, obj);
-   evas_object_smart_member_add(obj, _e_magnifier_mgr);
-
-   return EINA_TRUE;
-}
-
-EINTERN Eina_Bool
-e_magnifier_smart_member_del(Evas_Object *obj)
-{
-   Evas_Object *parent = NULL;
-
-   if (!obj) return EINA_FALSE;
-   parent = evas_object_smart_parent_get(obj);
-
-   if (parent != _e_magnifier_mgr)
-     return EINA_FALSE;
-
-   ELOGF("MAGNIFIER", "SMART MEMBER DEL..    obj  :%p", NULL, obj);
-
-   evas_object_smart_member_del(obj);
-   return EINA_TRUE;
-}
-
 static void
 _e_magnifier_owner_set(E_Client *ec)
 {
@@ -961,26 +976,26 @@ _e_magnifier_owner_unset(E_Client *ec)
 }
 
 static Eina_Bool
-_e_magnifier_stand_alone_mode_set(Evas_Object *magnifier_mgr, Eina_Bool set)
+_e_magnifier_stand_alone_mode_set(E_Magnifier_Manager *emm, Eina_Bool set)
 {
-   if (!magnifier_mgr) return EINA_FALSE;
-   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(magnifier_mgr, sd) EINA_FALSE;
+   if (!emm) return EINA_FALSE;
 
-   if (sd->stand_alone_mode == set)
+   if (emm->stand_alone_mode == set)
      return EINA_TRUE;
 
-   sd->stand_alone_mode = set;
-   if (sd->stand_alone_mode)
+   emm->stand_alone_mode = set;
+   if (emm->stand_alone_mode)
      {
-        evas_object_event_callback_add(magnifier_mgr, EVAS_CALLBACK_MOUSE_DOWN, _e_magnifier_cb_mouse_down_proxy, NULL);
-        evas_object_event_callback_add(magnifier_mgr, EVAS_CALLBACK_MOUSE_UP, _e_magnifier_cb_mouse_up_proxy, NULL);
+        // TODO: change below functions to relative e_view's API
+        //evas_object_event_callback_add(magnifier_mgr, EVAS_CALLBACK_MOUSE_DOWN, _e_magnifier_cb_mouse_down_proxy, NULL);
+        //evas_object_event_callback_add(magnifier_mgr, EVAS_CALLBACK_MOUSE_UP, _e_magnifier_cb_mouse_up_proxy, NULL);
      }
    else
      {
-        evas_object_event_callback_del(magnifier_mgr, EVAS_CALLBACK_MOUSE_DOWN, _e_magnifier_cb_mouse_down_proxy);
-        evas_object_event_callback_del(magnifier_mgr, EVAS_CALLBACK_MOUSE_UP, _e_magnifier_cb_mouse_up_proxy);
+        // TODO: change below functions to relative e_view's API
+        //evas_object_event_callback_del(magnifier_mgr, EVAS_CALLBACK_MOUSE_DOWN, _e_magnifier_cb_mouse_down_proxy);
+        //evas_object_event_callback_del(magnifier_mgr, EVAS_CALLBACK_MOUSE_UP, _e_magnifier_cb_mouse_up_proxy);
      }
-
    return EINA_TRUE;
 }
 
@@ -988,24 +1003,25 @@ EINTERN Eina_Bool
 e_magnifier_owner_set(E_Client *ec)
 {
    ELOGF("MAGNIFIER", "SET Magnifier Owner", ec);
-   if (!_e_magnifier_mgr)
+
+   E_Magnifier_Manager *emm;
+   emm = _e_magnifier_mgr;
+   if (!emm)
      {
         ELOGF("MAGNIFIER", "Magnifier is not exist", ec);
         return EINA_FALSE;
      }
 
-   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) EINA_FALSE;
-
-   if (sd->owner)
+   if (emm->owner)
      {
-        ELOGF("MAGNIFIER", "Already exist owner (win:0x%08zx, ec:%p)", ec, e_client_util_win_get(sd->owner), sd->owner);
+        ELOGF("MAGNIFIER", "Already exist owner (win:0x%08zx, ec:%p)", ec, e_client_util_win_get(emm->owner), emm->owner);
         return EINA_FALSE;
      }
 
-   sd->owner = ec;
+   emm->owner = ec;
    _e_magnifier_owner_set(ec);
 
-   if (ec && sd->stand_alone_mode)
+   if (ec && emm->stand_alone_mode)
      {
         _e_magnifier_stand_alone_mode_set(_e_magnifier_mgr, EINA_FALSE);
      }
@@ -1021,23 +1037,23 @@ e_magnifier_owner_unset(E_Client *ec)
 
    _e_magnifier_owner_unset(ec);
 
-   if (!_e_magnifier_mgr)
+   E_Magnifier_Manager *emm;
+   emm = _e_magnifier_mgr;
+   if (!emm)
      {
         ELOGF("MAGNIFIER", "Magnifier is not exist", ec);
         return;
      }
 
-   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
-
-   if (sd->owner != ec)
+   if (emm->owner != ec)
      {
         ELOGF("MAGNIFIER", "Owner is not matched..  current owner (win:0x%08zx, ec:%p)",
-              ec, e_client_util_win_get(sd->owner), sd->owner);
+              ec, e_client_util_win_get(emm->owner), emm->owner);
 
         return;
      }
 
-   sd->owner = NULL;
+   emm->owner = NULL;
 }
 
 EINTERN E_Client *
@@ -1048,9 +1064,7 @@ e_magnifier_owner_get(void)
    if (!_e_magnifier_mgr)
      return NULL;
 
-   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) NULL;
-
-   ec = sd->owner;
+   ec = _e_magnifier_mgr->owner;
 
    ELOGF("MAGNIFIER", "Current Magnifier owner (win:0x%08zx, ec:%p)",
          NULL, e_client_util_win_get(ec), ec);
@@ -1074,11 +1088,9 @@ e_magnifier_stand_alone_mode_set(Eina_Bool stand_alone)
      }
    else
      {
-        E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) EINA_FALSE;
-
-        if (sd->owner)
+        if (_e_magnifier_mgr->owner)
           {
-             ELOGF("MAGNIFIER", "Failed to Stand_Alone mode. Magnifier window exists...", sd->owner);
+             ELOGF("MAGNIFIER", "Failed to Stand_Alone mode. Magnifier window exists...", _e_magnifier_mgr->owner);
              return EINA_FALSE;
           }
 
index b52a9faab1560f0afe46265fb4de519df03cb95f..04faae61d6028a146afda56e2f1a90adb3657752 100644 (file)
@@ -4,6 +4,7 @@
 #include "e_intern.h"
 #include "e_client_intern.h"
 #include "e_desk_intern.h"
+#include "e_comp_canvas.h"
 
 #include <Evas.h>
 
@@ -33,8 +34,6 @@ EINTERN Eina_Bool  e_magnifier_show(E_Client *ec);
 EINTERN void       e_magnifier_hide(E_Client *ec);
 EINTERN Eina_Bool  e_magnifier_zoom_obj_ratio_set(E_Client *ec, E_Magnifier_Zoom_Ratio ratio);
 EINTERN Eina_Bool  e_magnifier_zoom_obj_geometry_set(E_Client *ec, int angle, int x, int y, int w, int h);
-EINTERN Eina_Bool  e_magnifier_smart_member_add(E_Desk *desk, Evas_Object *obj);
-EINTERN Eina_Bool  e_magnifier_smart_member_del(Evas_Object *obj);
 EINTERN Eina_Bool  e_magnifier_owner_set(E_Client *ec);
 EINTERN void       e_magnifier_owner_unset(E_Client *ec);
 EINTERN E_Client  *e_magnifier_owner_get(void);
index b88da5c3499d7b4ff1729caec98f5606d6e4c59f..dadf6339cb1d2a013858d989e2ad27f0c97c0307 100644 (file)
@@ -14,6 +14,7 @@
 #include <e_bindings.h>
 #include <e_config.h>
 #include <e_view.h>
+#include <e_view_image.h>
 #include <e_view_client.h>
 
 #include <uuid.h>
@@ -794,7 +795,7 @@ struct _E_Client
       Eina_Bool show : 1; // SHOW / HIDE
    } reg_ev;
 
-   Evas_Object *magnifier_proxy;   // The proxy object used by magnifier
+   E_View_Image *magnifier_proxy;  // The proxy object used by magnifier
    Eina_Bool    is_magnifier : 1;  // The client is a magnifier client
 
    struct