Enabled background effect 46/123846/1
authorMinJeong Kim <minjjj.kim@samsung.com>
Fri, 7 Apr 2017 08:07:24 +0000 (17:07 +0900)
committerMinJeong Kim <minjjj.kim@samsung.com>
Fri, 7 Apr 2017 08:07:24 +0000 (17:07 +0900)
Change-Id: I2ae11d18a69a8592ced214e50c84a84c5efdbad7
Signed-off-by: MinJeong Kim <minjjj.kim@samsung.com>
data/effect.edc
data/group/background-zoom.edc [new file with mode: 0644]
src/e_mod_effect.c
src/e_mod_effect.h

index bd616bb..235d0f7 100644 (file)
@@ -22,5 +22,10 @@ collections {
    /* group "e/comp/effects/keyboard"                     */
    /*-----------------------------------------------------*/
    #include "group/keyboard.edc"
+
+   /*-----------------------------------------------------*/
+   /* group "e/comp/effects/background-zoom"              */
+   /*-----------------------------------------------------*/
+   #include "group/background-zoom.edc"
 }
 
diff --git a/data/group/background-zoom.edc b/data/group/background-zoom.edc
new file mode 100644 (file)
index 0000000..9571d35
--- /dev/null
@@ -0,0 +1,124 @@
+group { name: "e/comp/effects/background-zoom";
+     script {
+          public message(Msg_Type:type, id, ...) {
+             if ((type == MSG_INT_SET) && (id == 0)) {
+                  /*set state */
+                  new st;
+                  st = getarg(2);
+                  if (st == 0)
+                    {
+                       set_state(PART:"e.swallow.content", "zoom-in", 0.0);
+                    }
+                  else if (st == 1)
+                    {
+                       set_state(PART:"e.swallow.content", "zoom-out", 0.0);
+                    }
+             } else if ((type == MSG_INT_SET) && (id == 1))
+               {
+               }
+          }
+     }
+   parts {
+        part { name: "clipper";
+        type: RECT;
+        mouse_events: 0;
+        description { state: "default" 0.0;
+           color: 255 255 255 255;
+           rel1.relative: -1.0  -1.0;
+           rel1.offset:  -9999 -9999;
+           rel2.relative:  2.0   2.0;
+           rel2.offset:   9999  9999;
+           visible: 1;
+        }
+      }
+       part { name: "shower";
+        type: SPACER;
+        description { state: "default" 0.0;
+           rel1.relative: 0 0;
+           rel2.relative: 1 1;
+        }
+     }
+      part { name: "e.swallow.content"; type: SWALLOW;
+        type: SWALLOW;
+        clip_to: "clipper";
+        description { state: "default" 0.0;
+           rel1.to: "shower";
+           rel2.to: "shower";
+           map.on : 0;
+        }
+        description { state: "zoom-in" 0.0;
+           rel1.to: "shower";
+           rel2.to: "shower";
+            map {
+              on: 1;
+              smooth: 1;
+              zoom.x: 1;
+              zoom.y: 1;
+           }
+        }
+        description { state: "zoom-in" 1.0;
+           rel1.to: "shower";
+           rel2.to: "shower";
+           map {
+              on: 1;
+              smooth: 1;
+              zoom.x: 1.2;
+              zoom.y: 1.2;
+           }
+        }
+        description { state: "zoom-out" 0.0;
+           rel1.to: "shower";
+           rel2.to: "shower";
+           map {
+              on: 1;
+              smooth: 1;
+              zoom.x: 1.2;
+              zoom.y: 1.2;
+           }
+        }
+        description { state: "zoom-out" 1.0;
+           rel1.to: "shower";
+           rel2.to: "shower";
+            map {
+              on: 1;
+              smooth: 1;
+              zoom.x: 1;
+              zoom.y: 1;
+           }
+        }
+     }
+   }
+    programs {
+     program { name: "zoom-in1";
+        signal: "e,action,go";
+        source: "e";
+        filter: "e.swallow.content" "zoom-in";
+        action: STATE_SET "zoom-in" 1.0;
+        transition: CUBIC_BEZIER 0.3 0.45 0.03 0.41 1.0;
+        target: "e.swallow.content";
+        after: "zoom-in2";
+     }
+     program { name: "zoom-in2";
+        action: STATE_SET "default" 0.0;
+        target: "e.swallow.content";
+        after: "done";
+     }
+     program { name: "zoom-out1";
+        signal: "e,action,go";
+        source: "e";
+        filter: "e.swallow.content" "zoom-out";
+        action: STATE_SET "zoom-out" 1.0;
+        transition: CUBIC_BEZIER 0.25 0.45 0.03 0.41 1.0;
+        target: "e.swallow.content";
+        after: "zoom-out2";
+     }
+     program { name: "zoom-out2";
+        action: STATE_SET "default" 0.0;
+        target: "e.swallow.content";
+        after: "done";
+     }
+     program { name: "done";
+        action: SIGNAL_EMIT "e,action,done" "e";
+     }
+    }
+}
index 7e4c585..9d0d969 100644 (file)
@@ -14,6 +14,8 @@ typedef struct _E_Effect_Client
 
    Evas_Object *under;
    unsigned int under_ref;
+
+   unsigned int bg_animating;
 } E_Effect_Client;
 
 typedef struct
@@ -325,6 +327,8 @@ _eff_object_setup(E_Client *ec, E_Effect_Group group)
 
    if (group == E_EFFECT_GROUP_KEYBOARD)
      e_comp_object_effect_set(ec->frame, "keyboard");
+   else if (group == E_EFFECT_GROUP_BACKGROUND)
+     e_comp_object_effect_set(ec->frame, cfg->bg_effect_style);
    else
      {
         E_Effect_Client *efc = NULL;
@@ -451,6 +455,140 @@ _eff_object_under_del(E_Client *ec)
    efc->under = NULL;
 }
 
+static E_Client *
+_eff_object_background_below_client_get(E_Client *ec, E_Effect_Type type)
+{
+   Eina_List *stack = NULL, *list, *next;
+   E_Client *below = NULL;
+
+   if (!_eff) return NULL;
+
+   if (type == E_EFFECT_TYPE_RESTACK_HIDE)
+     stack = _eff->stack.old;
+   else
+     stack = _eff->stack.cur;
+
+   if (!stack) return NULL;
+
+   list = eina_list_data_find_list(stack, ec);
+   if (!list) return NULL;
+
+   next = list;
+   while ((next = eina_list_next(next)))
+     {
+        below = eina_list_data_get(next);
+        if (below == ec)
+          return NULL;
+
+        if (below->vkbd.vkbd)
+          continue;
+
+        break;
+     }
+
+   return below;
+}
+
+static void
+_eff_object_background_cb_zoom_in_done(void *data, Evas_Object *obj, const char *sig, const char *src)
+{
+   E_Client *bg_ec;
+   E_Effect_Client *bg_efc;
+
+   bg_ec = (E_Client *)data;
+   if (!bg_ec) return;
+
+   bg_efc = _eff_client_get(bg_ec);
+   if (bg_efc)
+     bg_efc->bg_animating = 0;
+
+   e_object_unref(E_OBJECT(bg_ec));
+}
+
+static void
+_eff_object_background_cb_zoom_out_done(void *data, Evas_Object *obj, const char *sig, const char *src)
+{
+   E_Client *bg_ec;
+   E_Effect_Client *bg_efc;
+
+   bg_ec = (E_Client *)data;
+   if (!bg_ec) return;
+
+   bg_efc = _eff_client_get(bg_ec);
+   if (bg_efc)
+     bg_efc->bg_animating = 0;
+
+   e_object_unref(E_OBJECT(bg_ec));
+}
+
+static E_Client *
+_eff_object_background_setup(E_Client *ec, E_Client *home_ec, E_Effect_Group group, E_Effect_Type type)
+{
+   E_Comp_Config *cfg;
+   E_Client *bg_ec = NULL;
+   E_Effect_Client *bg_efc = NULL;
+
+   cfg = e_comp_config_get();
+   if (!cfg) return NULL;
+   if (!cfg->bg_effect_style) return NULL;
+
+   if (!ec) return NULL;
+   if (group != E_EFFECT_GROUP_NORMAL) return NULL;
+   if ((ec->argb) || (ec->effect_type)) return NULL; //need to check opaque?
+
+   if (home_ec) bg_ec = home_ec;
+   else bg_ec = _eff_object_background_below_client_get(ec, type);
+
+   if (!bg_ec) return NULL;
+   if (e_object_is_del(E_OBJECT(bg_ec))) return NULL;
+   if (!bg_ec->animatable) return NULL;
+
+   bg_efc = _eff_client_get(bg_ec);
+   if (!bg_efc) return NULL;
+   if ((bg_efc->bg_animating) ||
+       ((bg_efc->animating) && !((bg_ec->launching) && (bg_efc->animating == 1))))
+     return NULL;
+
+   switch (type)
+     {
+      case E_EFFECT_TYPE_SHOW:
+      case E_EFFECT_TYPE_RESTACK_SHOW:
+         if (bg_ec->visibility.obscured != E_VISIBILITY_FULLY_OBSCURED)
+           {
+              e_object_ref(E_OBJECT(bg_ec));
+              _eff_object_setup(bg_ec, E_EFFECT_GROUP_BACKGROUND);
+              e_comp_object_effect_params_set(bg_ec->frame, 0, (int[]){0}, 1);
+              e_comp_object_effect_start(bg_ec->frame, _eff_object_background_cb_zoom_in_done, bg_ec);
+              bg_efc->bg_animating = 1;
+              return bg_ec;
+           }
+         break;
+      case E_EFFECT_TYPE_RESTACK_HIDE:
+         e_object_ref(E_OBJECT(bg_ec));
+         _eff_object_setup(bg_ec, E_EFFECT_GROUP_BACKGROUND);
+         e_comp_object_effect_params_set(bg_ec->frame, 0, (int[]){1}, 1);
+         e_comp_object_effect_start(bg_ec->frame, _eff_object_background_cb_zoom_out_done, bg_ec);
+         bg_efc->bg_animating = 1;
+         return bg_ec;
+      case E_EFFECT_TYPE_HIDE:
+         if (bg_ec->visibility.obscured == E_VISIBILITY_FULLY_OBSCURED)
+           {
+              e_object_ref(E_OBJECT(bg_ec));
+              _eff_object_setup(bg_ec, E_EFFECT_GROUP_BACKGROUND);
+              e_comp_object_effect_params_set(bg_ec->frame, 0, (int[]){1}, 1);
+              e_comp_object_effect_start(bg_ec->frame, _eff_object_background_cb_zoom_out_done, bg_ec);
+              bg_efc->bg_animating = 1;
+              return bg_ec;
+           }
+         break;
+      default:
+         /* do nothing */
+         break;
+     }
+
+   return NULL;
+}
+
 static void
 _eff_object_layer_up(E_Client *ec)
 {
@@ -657,6 +795,7 @@ _eff_ref(E_Client *ec)
         efc->delay_del_ref ++;
      }
 
+   efc->bg_animating = 0;
    efc->animating++;
    e_object_ref(E_OBJECT(ec));
    efc->ep = e_pixmap_ref(ec->pixmap);
@@ -719,7 +858,6 @@ _eff_unref(E_Client *ec)
    return ec;
 }
 
-
 static void
 _eff_cb_visible_done(void *data, Evas_Object *obj EINA_UNUSED, const char *sig EINA_UNUSED, const char *src EINA_UNUSED)
 {
@@ -779,6 +917,8 @@ _eff_cb_visible(void *data, Evas_Object *obj, const char *signal)
 
    e_comp_object_effect_start(ec->frame, _eff_cb_visible_done, ec);
 
+   _eff_object_background_setup(ec, NULL, group, E_EFFECT_TYPE_SHOW);
+
    return EINA_TRUE;
 }
 
@@ -874,6 +1014,7 @@ _eff_cb_hidden(void *data, Evas_Object *obj, const char *signal)
 
    _eff_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_HIDE);
    e_comp_object_effect_start(ec->frame, _eff_cb_hidden_done, ec);
+   _eff_object_background_setup(ec, NULL, group, E_EFFECT_TYPE_HIDE);
 
    return EINA_TRUE;
 }
@@ -1223,6 +1364,7 @@ _eff_cb_restack(void *data, Evas_Object *obj, const char *signal)
 
         _eff_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_RESTACK_SHOW);
         e_comp_object_effect_start(ec->frame, _eff_cb_restack_show_done, ec);
+        _eff_object_background_setup(ec, NULL, group, E_EFFECT_TYPE_RESTACK_SHOW);
      }
    else if (!e_util_strcmp(emission, "e,action,restack,hide"))
      {
@@ -1275,6 +1417,7 @@ _eff_cb_restack(void *data, Evas_Object *obj, const char *signal)
 
         _eff_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_RESTACK_HIDE);
         e_comp_object_effect_start(ec->frame, _eff_cb_restack_hide_done, ec);
+        _eff_object_background_setup(ec, ec_home, group, E_EFFECT_TYPE_RESTACK_HIDE);
      }
    else if (!e_util_strcmp(emission, "e,action,restack,finish"))
      {
index b7074ba..8044dc1 100644 (file)
@@ -42,6 +42,7 @@ enum _E_Effect_Group
    E_EFFECT_GROUP_HOME,
    E_EFFECT_GROUP_LOCKSCREEN,
    E_EFFECT_GROUP_KEYBOARD,
+   E_EFFECT_GROUP_BACKGROUND,
    E_EFFECT_GROUP_NONE,
 };