e_magnifier: update code for magnifier feature
authorDoyoun Kang <doyoun.kang@samsung.com>
Mon, 18 Mar 2019 09:36:34 +0000 (18:36 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Tue, 19 Mar 2019 08:04:34 +0000 (17:04 +0900)
- add an owner of the magnifier
- handle move/resize event of smart members
- handle the splash launch image

Change-Id: I81a0f8718fa4d2ad878b3af89dbb49a74743242f

src/bin/e.h
src/bin/e_magnifier.c
src/bin/e_magnifier.h
src/bin/e_policy_wl.c

index ba77ecc8cadf15bb62ce949f6a9aa960501b037e..e5a032a8ec245fa5e5926f1bac239be698f87f6d 100644 (file)
@@ -266,6 +266,16 @@ typedef struct _E_Rect         E_Rect;
     } \
   while (0)
 
+# define E_COMP_COMP_HOOK_APPEND(list, type, callback, data) \
+  do \
+    { \
+       E_Comp_Object_Hook *_coh; \
+       _coh = e_comp_object_hook_add(type, callback, data); \
+       assert(_coh); \
+       list = eina_list_append(list, _coh); \
+    } \
+  while (0)
+
 # define E_CLAMP(x, min, max) (x < min ? min : (x > max ? max : x))
 # define E_RECTS_CLIP_TO_RECT(_x, _y, _w, _h, _cx, _cy, _cw, _ch) \
   {                                                               \
index 5ee427137c895c1e2ac87702e839001f9f533179..990d97a167246a746499c4aadf48f94fc9b98049 100644 (file)
@@ -13,11 +13,15 @@ struct _E_Magnifier_Smart_Data
 {
    Evas_Object_Smart_Clipped_Data base;
    Eina_List      *handlers;
+   Eina_List      *hooks;
+   Eina_List      *cp_hooks;
+   Eina_List      *wl_hooks;
    E_Desk         *desk;
+   E_Client       *owner;
 
    int stand_alone_mode;
    E_Magnifier_Zoom_Ratio ratio;
-   struct 
+   struct
    {
       struct
       {
@@ -36,24 +40,25 @@ EVAS_SMART_SUBCLASS_NEW(E_MAGNIFIER_SMART_OBJ_TYPE, _e_magnifier,
                     evas_object_smart_clipped_class_get, NULL);
 
 
-static void      _e_magnifier_smart_init(void);
+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(E_Desk *desk);
 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 void
+static Eina_Bool
 _e_magnifier_smart_init(void)
 {
    E_Zone *zone;
 
    _e_magnifier_mgr = evas_object_smart_add(e_comp->evas, _e_magnifier_smart_class_new());
-   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
+   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) EINA_FALSE;
 
    ELOGF("MAGNIFIER", "INIT Magnifier (%p)", NULL, _e_magnifier_mgr);
 
@@ -68,6 +73,8 @@ _e_magnifier_smart_init(void)
 
    evas_object_move(_e_magnifier_mgr, zone->x, zone->y);
    evas_object_resize(_e_magnifier_mgr, zone->w, zone->h);
+
+   return EINA_TRUE;
 }
 
 static Eina_Bool
@@ -327,12 +334,10 @@ _e_magnifier_smart_client_cb_remove(void *data, int type, void *event)
    ev = event;
    ec = ev->ec;
    if (!ec) goto end;
+   if (!ec->magnifier_proxy) goto end;
 
-   if (ec->magnifier_proxy)
-     {
-        e_magnifier_smart_member_del(ec->magnifier_proxy);
-        _e_magnifier_proxy_ec_del(ec);
-     }
+   e_magnifier_smart_member_del(ec->magnifier_proxy);
+   _e_magnifier_proxy_ec_del(ec);
 
 end:
    return ECORE_CALLBACK_PASS_ON;
@@ -369,11 +374,9 @@ _e_magnifier_smart_client_cb_show(void *data, int type, void *event)
    ev = event;
    ec = ev->ec;
    if (!ec) goto end;
+   if (!ec->magnifier_proxy) goto end;
 
-   if (ec->magnifier_proxy)
-     {
-        evas_object_show(ec->magnifier_proxy);
-     }
+   evas_object_show(ec->magnifier_proxy);
 
 end:
    return ECORE_CALLBACK_PASS_ON;
@@ -391,29 +394,120 @@ _e_magnifier_smart_client_cb_hide(void *data, int type, void *event)
    ev = event;
    ec = ev->ec;
    if (!ec) goto end;
+   if (!ec->magnifier_proxy) goto end;
 
-   if (ec->magnifier_proxy)
-     {
-        evas_object_hide(ec->magnifier_proxy);
-     }
+   evas_object_hide(ec->magnifier_proxy);
 
 end:
    return ECORE_CALLBACK_PASS_ON;
 }
 
+static Eina_Bool
+_e_magnifier_smart_client_cb_move(void *data, int type, void *event)
+{
+   E_Event_Client *ev;
+   E_Client *ec = NULL;
+
+   if (!data) goto end;
+   if (!event) goto end;
+
+   ev = event;
+   ec = ev->ec;
+   if (!ec) goto end;
+   if (!ec->magnifier_proxy) goto end;
+   if (ec->is_magnifier) goto end;
+
+   evas_object_move(ec->magnifier_proxy, ec->x, ec->y);
+
+end:
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_e_magnifier_smart_client_cb_resize(void *data, int type, void *event)
+{
+   E_Event_Client *ev;
+   E_Client *ec = NULL;
+
+   if (!data) goto end;
+   if (!event) goto end;
+
+   ev = event;
+   ec = ev->ec;
+   if (!ec) goto end;
+   if (!ec->magnifier_proxy) goto end;
+   if (ec->is_magnifier) goto end;
+
+   evas_object_resize(ec->magnifier_proxy, ec->w, ec->h);
+
+end:
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_e_magnifier_smart_cb_hook_effect_end(void *data, E_Client *ec)
+{
+   if (!ec) goto end;
+   if (!ec->magnifier_proxy) goto end;
+   if (ec->is_magnifier) goto end;
+
+   _e_magnifier_smart_member_reorder(ec->desk);
+
+end:
+   return EINA_TRUE;
+}
+
+static void
+_e_magnifier_smart_cb_hook_client_reuse(void *data, E_Client *ec)
+{
+   Eina_Bool ret;
+   if (!ec) return;
+
+   _e_magnifier_proxy_ec_del(ec);
+   ret = _e_magnifier_proxy_ec_new(ec);
+   if (ret)
+     e_magnifier_smart_member_add(ec->desk, ec->magnifier_proxy);
+}
+
+static void
+_e_magnifier_smart_cb_hook_client_del(void *data, E_Client *ec)
+{
+   if (!data) return;
+   if (!ec) return;
+
+   if (!_e_magnifier_mgr) return;
+   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
+
+   if (sd->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);
 
-   /* to apply zoom transformation whenever the client's size is changed. */
+   // 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);
 
-   /* FIXME hard coded, it will be laid upper than unpacked clients */
    evas_object_layer_set(obj, E_LAYER_DESK_OBJECT_BELOW);
 
    _e_magnifier_parent_sc->add(obj);
@@ -427,6 +521,9 @@ _e_magnifier_smart_del(Evas_Object *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);
@@ -570,9 +667,21 @@ e_magnifier_shutdown(void)
 E_API Eina_Bool
 e_magnifier_new(void)
 {
+   Eina_Bool ret;
    ELOGF("MAGNIFIER", "NEW Magnifier", NULL);
 
-   _e_magnifier_smart_init();
+   if (_e_magnifier_mgr)
+     {
+        ELOGF("MAGNIFIER", "Already exist Magnifier", NULL);
+        return EINA_TRUE;
+     }
+
+   ret = _e_magnifier_smart_init();
+   if (!ret)
+     {
+        ELOGF("MAGNIFIER", "Fail to NEW Magnifier", NULL);
+        return EINA_FALSE;
+     }
 
    E_Zone *zone;
    E_Desk *desk;
@@ -590,27 +699,42 @@ e_magnifier_del(void)
 {
    ELOGF("MAGNIFIER", "DELETE Magnifier", NULL);
 
-   _e_magnifier_proxy_ec_all_remove();
+   if (!_e_magnifier_mgr) return;
+   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
 
-   if (_e_magnifier_mgr)
+   if (sd->owner)
      {
-        evas_object_del(_e_magnifier_mgr);
-        _e_magnifier_mgr = NULL;
+        ELOGF("MAGNIFIER", "Fail to DELETE Magnifier.. Owner (win:0x%08zx, ec:%p) exists",
+              NULL, e_client_util_win_get(sd->owner), sd->owner);
+        return;
      }
+
+   _e_magnifier_proxy_ec_all_remove();
+
+   evas_object_del(_e_magnifier_mgr);
+   _e_magnifier_mgr = NULL;
 }
 
-E_API void
-e_magnifier_show(void)
+E_API Eina_Bool
+e_magnifier_show(E_Client *ec)
 {
    Evas_Object *target_obj;
 
    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)
+     {
+        ELOGF("MAGNIFIER", "Not owner... Failed to show...", ec);
+        return EINA_FALSE;
+     }
+
    evas_object_show(_e_magnifier_mgr);
 
    _e_magnifier_apply_zoom(_e_magnifier_mgr);
 
-   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
-
    if (sd->stand_alone_mode)
      {
         target_obj = _e_magnifier_mgr;
@@ -618,17 +742,28 @@ e_magnifier_show(void)
         evas_object_event_callback_add(target_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_magnifier_cb_mouse_down_proxy, NULL);
         evas_object_event_callback_add(target_obj, EVAS_CALLBACK_MOUSE_UP, _e_magnifier_cb_mouse_up_proxy, NULL);
      }
+
+   return EINA_TRUE;
 }
 
 E_API void
-e_magnifier_hide(void)
+e_magnifier_hide(E_Client *ec)
 {
    Evas_Object *target_obj;
 
    ELOGF("MAGNIFIER", "HIDE Magnifier", NULL);
-   evas_object_hide(_e_magnifier_mgr);
 
+   if (!_e_magnifier_mgr) return;
    E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
+
+   if (sd->owner != ec)
+     {
+        ELOGF("MAGNIFIER", "Not owner... Failed to hide...", ec);
+        return;
+     }
+
+   evas_object_hide(_e_magnifier_mgr);
+
    if (sd->stand_alone_mode)
      {
         target_obj = _e_magnifier_mgr;
@@ -636,6 +771,7 @@ e_magnifier_hide(void)
         evas_object_event_callback_del(target_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_magnifier_cb_mouse_down_proxy);
         evas_object_event_callback_del(target_obj, EVAS_CALLBACK_MOUSE_UP, _e_magnifier_cb_mouse_up_proxy);
      }
+
 }
 
 E_API Eina_Bool
@@ -646,6 +782,12 @@ e_magnifier_zoom_obj_ratio_set(E_Client* ec, E_Magnifier_Zoom_Ratio ratio)
      return EINA_FALSE;
 
    E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) EINA_FALSE;
+   if (sd->owner != ec)
+     {
+        ELOGF("MAGNIFIER", "Not owner... Failed to set ratio...", ec);
+        return EINA_FALSE;
+     }
+
    sd->ratio = ratio;
 
    _e_magnifier_apply_zoom(_e_magnifier_mgr);
@@ -660,6 +802,13 @@ 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)
+     {
+        ELOGF("MAGNIFIER", "Not owner... Failed to set geometry...", ec);
+        return EINA_FALSE;
+     }
+
    E_Desk *desk = NULL;
    int tx, ty, tw, th;
 
@@ -691,7 +840,7 @@ 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("WAYFORU", "MAGNIFIER.... SMART MEMBER ADD... obj:%p", NULL, obj);
+   ELOGF("MAGNIFIER", "SMART MEMBER ADD.. obj  :%p", NULL, obj);
    evas_object_smart_member_add(obj, _e_magnifier_mgr);
 
    return EINA_TRUE;
@@ -705,23 +854,19 @@ e_magnifier_smart_member_del(Evas_Object *obj)
    if (!obj) return EINA_FALSE;
    parent = evas_object_smart_parent_get(obj);
 
-   ELOGF("WAYFORU", "MAGNIFIER.... SMART MEMBER DEL... obj:%p", NULL, obj);
-
    if (parent != _e_magnifier_mgr)
      return EINA_FALSE;
 
-   ELOGF("WAYFORU", "MAGNIFIER.... SMART MEMBER DEL... obj:%p", NULL, obj);
+   ELOGF("MAGNIFIER", "SMART MEMBER DEL..    obj  :%p", NULL, obj);
 
    evas_object_smart_member_del(obj);
    return EINA_TRUE;
 }
 
-E_API Eina_Bool
-e_magnifier_owner_set(E_Client *ec)
+static void
+_e_magnifier_owner_set(E_Client *ec)
 {
-   if (!ec) return EINA_FALSE;
-
-   ELOGF("MAGNIFIER", "SET Magnifier Owner", ec);
+   if (!ec) return;
 
    ec->is_magnifier = EINA_TRUE;
    ec->exp_iconify.deiconify_update = EINA_FALSE;
@@ -729,6 +874,84 @@ e_magnifier_owner_set(E_Client *ec)
 
    evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_MOVE, _e_magnifier_cb_owner_move_resize, NULL);
    evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_RESIZE, _e_magnifier_cb_owner_move_resize, NULL);
+}
+
+static void
+_e_magnifier_owner_unset(E_Client *ec)
+{
+   if (!ec) return;
+
+   ec->is_magnifier = EINA_FALSE;
+
+   evas_object_event_callback_del(ec->frame, EVAS_CALLBACK_MOVE, _e_magnifier_cb_owner_move_resize);
+   evas_object_event_callback_del(ec->frame, EVAS_CALLBACK_RESIZE, _e_magnifier_cb_owner_move_resize);
+}
+
+E_API Eina_Bool
+e_magnifier_owner_set(E_Client *ec)
+{
+   ELOGF("MAGNIFIER", "SET Magnifier Owner", ec);
+   if (!_e_magnifier_mgr)
+     {
+        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)
+     {
+        ELOGF("MAGNIFIER", "Already exist owner (win:0x%08zx, ec:%p)", ec, e_client_util_win_get(sd->owner), sd->owner);
+        return EINA_FALSE;
+     }
+
+   sd->owner = ec;
+   _e_magnifier_owner_set(ec);
 
    return EINA_TRUE;
 }
+
+E_API void
+e_magnifier_owner_unset(E_Client *ec)
+{
+   ELOGF("MAGNIFIER", "UNSET Magnifier Owner", ec);
+   if (!ec) return;
+
+   _e_magnifier_owner_unset(ec);
+
+   if (!_e_magnifier_mgr)
+     {
+        ELOGF("MAGNIFIER", "Magnifier is not exist", ec);
+        return;
+     }
+
+   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
+
+   if (sd->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);
+
+        return;
+     }
+
+   sd->owner = NULL;
+}
+
+E_API E_Client *
+e_magnifier_owner_get(void)
+{
+   E_Client *ec = NULL;
+
+   if (!_e_magnifier_mgr)
+     return NULL;
+
+   E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) NULL;
+
+   ec = sd->owner;
+
+   ELOGF("MAGNIFIER", "Current Magnifier owner (win:0x%08zx, ec:%p)",
+         NULL, e_client_util_win_get(ec), ec);
+
+   return ec;
+}
index 4cc52c1799762e1fbefcde38a149ce93d2666089..621f9ce5169dbb44eb4d3ec75a1ffb85a686861e 100644 (file)
@@ -26,8 +26,8 @@ EINTERN int       e_magnifier_shutdown(void);
 E_API Eina_Bool   e_magnifier_new(void);
 E_API void        e_magnifier_del(void);
 
-E_API void        e_magnifier_show(void);
-E_API void        e_magnifier_hide(void);
+E_API Eina_Bool   e_magnifier_show(E_Client *ec);
+E_API void        e_magnifier_hide(E_Client *ec);
 
 E_API Eina_Bool   e_magnifier_zoom_obj_ratio_set(E_Client *ec, E_Magnifier_Zoom_Ratio ratio);
 E_API Eina_Bool   e_magnifier_zoom_obj_geometry_set(E_Client *ec, int angle, int x, int y, int w, int h);
@@ -36,7 +36,8 @@ 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);
 
 E_API Eina_Bool   e_magnifier_owner_set(E_Client *ec);
-
+E_API void        e_magnifier_owner_unset(E_Client *ec);
+E_API E_Client   *e_magnifier_owner_get(void);
 #endif
 #endif
 
index a8221b30f282b1c1544beb8d2cec1913ced9fc28..a6f45a3e1ea2c39325bd82024788348c736ef101 100644 (file)
@@ -620,6 +620,7 @@ _e_policy_wl_tzsh_srv_del(E_Policy_Wl_Tzsh_Srv *tzsh_srv)
         magnifier_ec = tzsh_srv->tzsh->ec;
         if (magnifier_ec)
           {
+             e_magnifier_owner_unset(magnifier_ec);
              e_magnifier_del();
           }
      }
@@ -3724,6 +3725,7 @@ static void
 _tzsh_srv_magnifier_cb_enable_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, int32_t enable)
 {
    E_Policy_Wl_Tzsh_Srv *tzsh_srv;
+   E_Client *ec;
 
    tzsh_srv = wl_resource_get_user_data(resource);
 
@@ -3733,10 +3735,12 @@ _tzsh_srv_magnifier_cb_enable_set(struct wl_client *client EINA_UNUSED, struct w
 
    ELOGF("TZSH", "[MAGNIFIER] Set Enable. enable:%d", tzsh_srv->tzsh->ec, enable);
 
+   ec = tzsh_srv->tzsh->ec;
+
    if (enable)
-     e_magnifier_show();
+     e_magnifier_show(ec);
    else
-     e_magnifier_hide();
+     e_magnifier_hide(ec);
 }
 
 static const struct tws_service_magnifier_interface _tzsh_srv_magnifier_iface =