Added Show/Hide/Restack Effect 19/33119/1
authorMinJeong Kim <minjjj.kim@samsung.com>
Tue, 6 Jan 2015 05:39:52 +0000 (14:39 +0900)
committerMinJeong Kim <minjjj.kim@samsung.com>
Tue, 6 Jan 2015 05:40:02 +0000 (14:40 +0900)
Change-Id: I8aa2aea4113c798b596be61332527a7899f84330
Signed-off-by: MinJeong Kim <minjjj.kim@samsung.com>
13 files changed:
Makefile.am [new file with mode: 0644]
autogen.sh [new file with mode: 0755]
configure.ac [new file with mode: 0644]
data/Makefile.am [new file with mode: 0644]
data/effect.edc [new file with mode: 0644]
data/group/fade.edc [new file with mode: 0644]
data/group/no_effect.edc [new file with mode: 0644]
packaging/e-mod-tizen-effect.spec [new file with mode: 0644]
src/Makefile.am [new file with mode: 0644]
src/e_mod_effect.c [new file with mode: 0644]
src/e_mod_effect.h [new file with mode: 0644]
src/e_mod_main.c [new file with mode: 0644]
src/e_mod_main.h [new file with mode: 0644]

diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..e0485d2
--- /dev/null
@@ -0,0 +1,12 @@
+#maintainer-clean removes everything
+MAINTAINERCLEANFILES = aclocal.m4 compile config.sub config.guess config.h.in \
+                      configure depcomp install-sh ltmain.sh Makefile.in missing
+
+SUBDIRS = src \
+          data
+
+filesdir = $(datadir)
+
+uninstall:
+       rm -rf $(DESTDIR)$(datadir)
+
diff --git a/autogen.sh b/autogen.sh
new file mode 100755 (executable)
index 0000000..5a30991
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+
+set  -x
+aclocal
+autoconf
+libtoolize --copy --force
+autoheader
+automake --foreign --add-missing --copy
+
diff --git a/configure.ac b/configure.ac
new file mode 100644 (file)
index 0000000..d1e0713
--- /dev/null
@@ -0,0 +1,116 @@
+# Process this file with autoconf to produce a configure script.
+dnl Process this file with autoconf to produce a configure script.
+
+# Note )
+#
+# AC_DEFINE(VARIABLE, VALUE, DESCRIPTION)
+#   output the following to config.h
+#   /* DESCRIPTION */
+#   #define VARIABLE VALUE
+#
+# AC_SUBST(VARIABLE, [VALUE])
+#   define $(VARIABLE) as VALUE in Makefile
+
+dnl ========================================================================
+# initialization
+dnl ========================================================================
+AC_INIT([e-mod-tizen-effect], [0.1], [minjjj.kim@samsung.com])
+
+# check for tools needed by automake generated Makefiles
+# -Wall  : Turn all warnings on.
+# -Werror: report warings as errors.
+# foreign: relax some GNU standard requirements
+#AM_INIT_AUTOMAKE([-Wall -Werror foreign])
+AM_INIT_AUTOMAKE([-Wall foreign])
+
+dnl ========================================================================
+# checks for programs
+dnl ========================================================================
+AC_PROG_CC
+AC_DISABLE_STATIC
+AC_PROG_LIBTOOL
+
+dnl ========================================================================
+# checks for libraries
+dnl ========================================================================
+
+dnl ========================================================================
+# checks for header files
+dnl ========================================================================
+#AC_HEADER_STDC
+AC_CHECK_HEADERS([math.h fcntl.h stdlib.h string.h unistd.h])
+
+dnl ========================================================================
+# checks for typedefs, structures, and compiler characteristics
+AC_C_CONST
+
+dnl ========================================================================
+# checks for library functions
+dnl ========================================================================
+#AC_FUNC_MALLOC
+AC_FUNC_MMAP
+AC_CHECK_FUNCS([memset munmap strcasecmp strdup])
+
+dnl ========================================================================
+# checks for pkg-config
+dnl ========================================================================
+PKG_PROG_PKG_CONFIG
+
+
+dnl ========================================================================
+# checks for pkg-config
+dnl ========================================================================
+PKG_CHECK_MODULES(ENLIGHTENMENT, [enlightenment])
+AC_SUBST(ENLIGHTENMENT_CFLAGS)
+AC_SUBST(ENLIGHTENMENT_LIBS)
+
+# Find edje_cc
+PKG_CHECK_MODULES(EDJE, [edje >= 1.0.0])
+AC_ARG_WITH(edje-cc,
+       AC_HELP_STRING([--with-edje-cc=PATH], [specify a specific path to edje_cc]),
+       [
+               v=$withval;
+               EDJE_CC=$v
+       ],
+       [
+       EDJE_CC=$(pkg-config --variable=prefix edje)/bin/edje_cc
+       ]
+)
+AC_SUBST(EDJE_CC)
+AC_MSG_CHECKING([Which edje_cc to use])
+AC_MSG_RESULT(${EDJE_CC})
+
+
+dnl =======================================================================
+
+release=$(pkg-config --variable=release enlightenment)
+MODULE_ARCH="$host_os-$host_cpu-$release"
+AC_SUBST(MODULE_ARCH)
+AC_DEFINE_UNQUOTED(MODULE_ARCH, "$MODULE_ARCH", "Module architecture")
+
+datadir=$(pkg-config --variable=modules enlightenment)/${PACKAGE}
+AC_ARG_ENABLE(homedir-install,
+       AS_HELP_STRING([--enable-homedir-install], [Install module in homedir]),
+       [ datadir="${HOME}/.e/e/modules/${PACKAGE}" ]
+)
+
+dnl ========================================================================
+# output files
+dnl ========================================================================
+
+# create HEADER for all HEADER.in.
+# HEADERS contain definitions made with AC_DEFINE.
+# the following command will create config.h from config.h.in
+AC_CONFIG_HEADERS([config.h])
+
+# create FILE for all FILE.in.
+# FILES contains definitions made with AC_SUBST.
+AC_CONFIG_FILES([
+                Makefile
+                src/Makefile
+         data/Makefile
+                ])
+
+AC_OUTPUT
+
+
diff --git a/data/Makefile.am b/data/Makefile.am
new file mode 100644 (file)
index 0000000..d3f4d74
--- /dev/null
@@ -0,0 +1,19 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+EDJE_CC = @EDJE_CC@
+EDJE_CC_FLAGS = -v
+
+filesdir = /usr/share/enlightenment/data/themes
+files_DATA = effect.edj
+
+EXTRA_DIST = \
+effect.edc
+
+effect.edj: Makefile $(EXTRA_DIST)
+       $(EDJE_CC) $(EDJE_FLAGS) \
+       $(top_srcdir)/data/effect.edc \
+       $(top_builddir)/data/effect.edj
+
+clean-local:
+       rm -f *.edj
+
diff --git a/data/effect.edc b/data/effect.edc
new file mode 100644 (file)
index 0000000..9640e49
--- /dev/null
@@ -0,0 +1,16 @@
+#define COMP_EFFECT_DURATION 0.4
+#define COMP_EFFECT_DURATION_FAST 0.2
+
+collections {
+
+   /*-----------------------------------------------------*/
+   /* group "e/comp/effects/no-effect"                    */
+   /*-----------------------------------------------------*/
+   #include "group/no_effect.edc"
+
+   /*-----------------------------------------------------*/
+   /* group "e/comp/effects/fade"                         */
+   /*-----------------------------------------------------*/
+   #include "group/fade.edc"
+}
+
diff --git a/data/group/fade.edc b/data/group/fade.edc
new file mode 100644 (file)
index 0000000..8ad3788
--- /dev/null
@@ -0,0 +1,174 @@
+group { name: "e/comp/effects/fade";
+     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:"clipper", "default", 0.0);
+                       set_state(PART:"shower", "default", 0.0);
+                    }
+                  else if (st == 1)
+                    {
+                       set_state(PART:"clipper", "visible", 0.0);
+                       set_state(PART:"shower", "visible", 0.0);
+                    }
+                  else if (st == 2)
+                    {
+                       set_state(PART:"clipper", "restack_hidden", 0.0);
+                       set_state(PART:"shower", "restack_hidden", 0.0);
+                    }
+                  else if (st == 3)
+                    {
+                       set_state(PART:"clipper", "restack_visible", 0.0);
+                       set_state(PART:"shower", "restack_visible", 0.0);
+                    }
+                  else if (st == 4)
+                    {
+                       set_state(PART:"clipper", "restack_done", 0.0);
+                       set_state(PART:"shower", "restack_done", 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 0;
+           rel1.relative: -1.0  -1.0;
+           rel1.offset:  -9999 -9999;
+           rel2.relative:  2.0   2.0;
+           rel2.offset:   9999  9999;
+           visible: 1;
+        }
+        description { state: "visible" 0.0;
+           inherit: "default" 0.0;
+           color: 255 255 255 255;
+        }
+        description { state: "hide" 0.0;
+           inherit: "default" 0.0;
+        }
+        description { state: "restack_visible" 0.0;
+           inherit: "visible" 0.0;
+        }
+        description { state: "restack_hidden" 0.0;
+           inherit: "default" 0.0;
+        }
+        description { state: "restack_done" 0.0;
+           inherit: "visible" 0.0;
+        }
+        }
+        part { name: "shower";
+        type: SPACER;
+        mouse_events: 0;
+        description { state: "default" 0.0;
+           rel1.relative: 0.02 0.02;
+           rel2.relative: 0.98 0.98;
+        }
+        description { state: "visible" 0.0;
+           inherit: "default" 0.0;
+           rel1.relative: 0 0;
+           rel1.offset:   0 0;
+           rel2.relative: 1 1;
+        }
+        description { state: "hide" 0.0;
+           inherit: "default" 0.0;
+        }
+        description { state: "restack_visible" 0.0;
+           inherit: "visible" 0.0;
+        }
+        description { state: "restack_hidden" 0.0;
+           inherit: "default" 0.0;
+        }
+        description { state: "restack_done" 0.0;
+           inherit: "visible" 0.0;
+        }
+     }
+      part { name: "e.swallow.content"; type: SWALLOW;
+        type: SWALLOW;
+        clip_to: "clipper";
+        mouse_events: 0;
+        description { state: "default" 0.0;
+           rel1.to: "shower";
+           rel2.to: "shower";
+        }
+        description { state: "visible" 0.0;
+           rel1.to: "shower";
+           rel2.to: "shower";
+        }
+        description { state: "hide" 0.0;
+           rel1.to: "shower";
+           rel2.to: "shower";
+        }
+      }
+   }
+    programs {
+     program { name: "show1";
+        signal: "e,action,go";
+        source: "e";
+        filter: "shower" "default";
+        action: STATE_SET "visible" 0.0;
+        transition: ACCELERATE COMP_EFFECT_DURATION_FAST;
+        target: "shower";
+        target: "clipper";
+        target: "e.swallow.content";
+        after: "done";
+     }
+     program { name: "hide1";
+        signal: "e,action,go";
+        source: "e";
+        filter: "shower" "visible";
+        action: STATE_SET "hide" 0.0;
+        transition: ACCELERATE COMP_EFFECT_DURATION_FAST;
+        target: "shower";
+        target: "clipper";
+        after: "hide2";
+     }
+     program { name: "hide2";
+        action: STATE_SET "default" 0.0;
+        target: "shower";
+        target: "clipper";
+        after: "done";
+     }
+     program { name: "restack,hide";
+        signal: "e,action,go";
+        source: "e";
+        filter: "shower" "restack_visible";
+        action: STATE_SET "hide" 0.0;
+        transition: ACCELERATE COMP_EFFECT_DURATION_FAST;
+        target: "shower";
+        target: "clipper";
+        after: "done";
+     }
+     program { name: "restack,show";
+        signal: "e,action,go";
+        source: "e";
+        filter: "shower" "restack_hidden";
+        action: STATE_SET "visible" 0.0;
+        transition: ACCELERATE COMP_EFFECT_DURATION_FAST;
+        target: "shower";
+        target: "clipper";
+        target: "e.swallow.content";
+        after: "done";
+     }
+     program { name: "restack,finish";
+        signal: "e,action,go";
+        source: "e";
+        filter: "shower" "restack_done";
+        action: STATE_SET "visible" 0.0;
+        target: "shower";
+        target: "clipper";
+        target: "e.swallow.content";
+        after: "done";
+     }
+     program { name: "done";
+        action: SIGNAL_EMIT "e,action,done" "e";
+     }
+    }
+}
diff --git a/data/group/no_effect.edc b/data/group/no_effect.edc
new file mode 100644 (file)
index 0000000..bd23ae1
--- /dev/null
@@ -0,0 +1,114 @@
+group { name: "e/comp/effects/no-effect";
+     alias: "e/comp/effects/none";
+     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:"clipper", "default", 0.0);
+                       set_state(PART:"shower", "default", 0.0);
+                       set_state(PART:"e.swallow.content", "default", 0.0);
+                    }
+                  else if (st == 1)
+                    {
+                       set_state(PART:"clipper", "visible", 0.0);
+                       set_state(PART:"shower", "visible", 0.0);
+                       set_state(PART:"e.swallow.content", "visible", 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;
+        }
+        description { state: "visible" 0.0;
+           inherit: "default" 0.0;
+           color: 255 255 255 255;
+        }
+        description { state: "hide" 0.0;
+           inherit: "default" 0.0;
+        }             
+        }
+        part { name: "shower";
+        type: SPACER;
+        mouse_events: 0;
+        description { state: "default" 0.0;
+           rel1.relative: 0 0;
+           rel2.relative: 1 1;
+        }
+        description { state: "visible" 0.0;
+           inherit: "default" 0.0;
+           rel1.relative: 0 0;
+           rel1.offset:   0 0;
+           rel2.relative: 1 1;
+        }
+        description { state: "hide" 0.0;
+           inherit: "default" 0.0;
+           rel1.relative: 0.0 0.0;
+           rel1.offset:   0   0;
+           rel2.relative: 1.0 1.0;
+        }
+     }
+      part { name: "e.swallow.content"; type: SWALLOW;
+        type: SWALLOW;
+        clip_to: "clipper";
+        mouse_events: 0;
+        description { state: "default" 0.0;
+           rel1.to: "shower";
+           rel2.to: "shower";
+        }
+        description { state: "visible" 0.0;
+           rel1.to: "shower";
+           rel2.to: "shower";
+        }
+        description { state: "hide" 0.0;
+           rel1.to: "shower";
+           rel2.to: "shower";
+        }
+      }
+   }
+    programs {
+     program { name: "show1";
+        signal: "e,action,go";
+        source: "e";
+        filter: "shower" "default";
+        action: STATE_SET "visible" 0.0;
+        target: "shower";
+        target: "clipper";
+        target: "e.swallow.content";
+        after: "done";
+     }
+     program { name: "hide1";
+        signal: "e,action,go";
+        source: "e";
+        filter: "shower" "visible";
+        action: STATE_SET "hide" 0.0;
+        target: "shower";
+        target: "clipper";
+        after: "hide2";
+     }
+     program { name: "hide2";
+        action: STATE_SET "default" 0.0;
+        target: "shower";
+        target: "clipper";
+        after: "done";
+     }
+     program { name: "done";
+        action: SIGNAL_EMIT "e,action,done" "e";
+     }
+    }
+}
diff --git a/packaging/e-mod-tizen-effect.spec b/packaging/e-mod-tizen-effect.spec
new file mode 100644 (file)
index 0000000..5a0d7ab
--- /dev/null
@@ -0,0 +1,53 @@
+Name: e-mod-tizen-effect
+Version: 0.0.1
+Release: 1
+Summary: The effect module for the enlightenment
+URL: http://www.enlightenment.org
+Group: Graphics & UI Framework/Other
+Source0: %{name}-%{version}.tar.gz
+License: BSD-2-Clause
+BuildRequires: pkgconfig(enlightenment)
+BuildRequires: pkgconfig(eina)
+BuildRequires: pkgconfig(ecore)
+BuildRequires: pkgconfig(edje)
+BuildRequires:  gettext
+BuildRequires:  edje-tools
+
+%description
+This package provides various window effect(animation)
+as one module of enlightenment.
+
+%prep
+%setup -q
+
+%build
+
+export GC_SECTIONS_FLAGS="-fdata-sections -ffunction-sections -Wl,--gc-sections"
+export CFLAGS+=" -Wall -g -fPIC -rdynamic ${GC_SECTIONS_FLAGS}"
+export LDFLAGS+=" -Wl,--hash-style=both -Wl,--as-needed -Wl,--rpath=/usr/lib"
+
+%autogen
+%configure --prefix=/usr
+make
+
+%install
+rm -rf %{buildroot}
+
+# for license notification
+#mkdir -p %{buildroot}/usr/share/license
+#cp -a %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/%{name}
+
+# install
+make install DESTDIR=%{buildroot}
+
+# clear useless textual files
+find  %{buildroot}/usr/lib/enlightenment/modules/%{name} -name *.la | xargs rm
+#find  %{buildroot}/usr/lib/enlightenment/modules/%{name} -name *.a | xargs rm
+
+
+%files
+%defattr(-,root,root,-)
+%{_libdir}/enlightenment/modules/e-mod-tizen-effect
+%{_datadir}/enlightenment/data/themes
+#/usr/share/license/%{name}
+
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644 (file)
index 0000000..0da8baa
--- /dev/null
@@ -0,0 +1,18 @@
+MAINTAINERCLEANFILES = Makefile.in
+MODULE = e-mod-tizen-effect
+
+LDFLAGS +=
+
+pkgdir                 = $(libdir)/enlightenment/modules/$(MODULE)/$(MODULE_ARCH)
+pkg_LTLIBRARIES        = module.la
+module_la_SOURCES      = e_mod_main.c \
+                         e_mod_main.h \
+                         e_mod_effect.c \
+                         e_mod_effect.h
+module_la_LIBADD       =
+module_la_CFLAGS       = @ENLIGHTENMENT_CFLAGS@
+module_la_LDFLAGS      = -module -avoid-version @ENLIGHTENMENT_LIBS@
+module_la_DEPENDENCIES = $(top_builddir)/config.h
+
+#uninstall:
+#  rm -rf $(DESTDIR)$(libdir)/enlightenment/modules/$(MODULE)
diff --git a/src/e_mod_effect.c b/src/e_mod_effect.c
new file mode 100644 (file)
index 0000000..9e37b5d
--- /dev/null
@@ -0,0 +1,274 @@
+#include "e.h"
+#include "e_mod_effect.h"
+
+E_Comp *_comp = NULL;
+Eina_List *_providers = NULL;
+Eina_List *_event_hdlrs = NULL;
+Eina_List *_stack = NULL;
+
+static void
+_e_mod_effect_object_setup(E_Client *ec)
+{
+   E_Comp_Config *config;
+   config = e_comp_config_get();
+
+   if ((config) && (config->effect_style))
+     {
+        e_comp_object_effect_set(ec->frame , config->effect_style);
+     }
+   else
+     e_comp_object_effect_set(ec->frame, "no-effect");
+}
+
+static void
+_e_mod_effect_stack_update()
+{
+   E_Client *ec;
+   Evas_Object *o;
+
+   for (o = evas_object_top_get(_comp->evas); o; o = evas_object_below_get(o))
+     {
+        ec = evas_object_data_get(o, "E_Client");
+        if (!ec) continue;
+        if (!e_util_strcmp(evas_object_name_get(o), "layer_obj")) continue;
+
+        _stack = eina_list_remove(_stack, ec);
+        _stack = eina_list_append(_stack, ec);
+     }
+}
+
+static const char*
+_e_mod_effect_restack_effect_check(E_Client *ec)
+{
+   Evas_Object *o;
+   const char* emission = NULL;
+   Eina_List *l;
+   E_Client *_ec;
+
+   if (!ec->visible) return NULL;
+   if (ec->new_client) return NULL;
+
+   o = evas_object_above_get(ec->frame);
+   if (o == _comp->layers[e_comp_canvas_layer_map(ec->layer)].obj)
+     {
+        if (_stack)
+          {
+             EINA_LIST_FOREACH(_stack, l, _ec)
+               {
+                  if (_ec == ec) break;
+                  if ((_ec->iconic) || (!_ec->visible)) continue;
+
+                  emission = "e,action,restack,show";
+               }
+          }
+        else
+          emission = "e,action,restack,show";
+     }
+   else
+     {
+        _ec = evas_object_data_get(o, "E_Client");
+        if ((_ec) && (_ec->layer == ec->layer))
+          {
+             if (_stack)
+               {
+                  EINA_LIST_FOREACH(_stack, l, _ec)
+                    {
+                       if (_ec->layer > ec->layer) continue;
+                       if ((_ec->iconic) || (!_ec->visible)) continue;
+                       if (_ec != ec) break;
+
+                       emission = "e,action,restack,hide";
+                    }
+               }
+             else
+               emission = "e,action,restack,hide";
+          }
+     }
+
+   return emission;
+}
+
+static Eina_Bool
+_e_mod_effect_cb_client_remove(void *data, int type, void *event)
+{
+   E_Client *ec;
+   E_Event_Client *ev = event;
+
+   ec = ev->ec;
+   _stack = eina_list_remove(_stack, ec);
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_e_mod_effect_cb_client_restack(void *data, int type, void *event)
+{
+   E_Client *ec;
+   E_Event_Client *ev = event;
+   const char* emission = NULL;
+
+   ec = ev->ec;
+
+   if ((emission = _e_mod_effect_restack_effect_check(ec)))
+     e_comp_object_signal_emit(ec->frame, emission, "e");
+
+   _e_mod_effect_stack_update();
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_e_mod_effect_cb_visible(void *data, Evas_Object *obj, const char *signal)
+{
+   E_Client *ec;
+
+   ec = e_comp_object_client_get(obj);
+
+   _e_mod_effect_object_setup(ec);
+   e_comp_object_effect_params_set(ec->frame, 0, (int[]){0}, 1);
+   e_comp_object_effect_start(ec->frame, NULL, NULL);
+
+   return EINA_TRUE;
+}
+
+static void
+_e_mod_effect_cb_hidden_done(void *data, Evas_Object *obj, const char *sig, const char *src)
+{
+   E_Client *ec;
+   ec = (E_Client*) data;
+
+   if (ec->iconic)
+     evas_object_hide(ec->frame);
+}
+
+static Eina_Bool
+_e_mod_effect_cb_hidden(void *data, Evas_Object *obj, const char *signal)
+{
+   E_Client *ec;
+
+   ec = e_comp_object_client_get(obj);
+
+   _e_mod_effect_object_setup(ec);
+   e_comp_object_effect_params_set(ec->frame, 0, (int[]){1}, 1);
+   e_comp_object_effect_start(ec->frame, _e_mod_effect_cb_hidden_done, ec);
+
+   return EINA_TRUE;
+}
+
+static void
+_e_mod_effect_cb_restack_show_done(void *data, Evas_Object *obj, const char *sig, const char *src)
+{
+   E_Client *ec;
+
+   ec = (E_Client*)data;
+   evas_object_layer_set(ec->frame, ec->layer);
+   ec->layer_block = 0;
+   _e_mod_effect_stack_update();
+}
+
+static void
+_e_mod_effect_cb_restack_hide_done(void *data, Evas_Object *obj, const char *sig, const char *src)
+{
+   E_Client *ec = data;
+
+   ec = (E_Client*)data;
+   evas_object_layer_set(ec->frame, ec->layer);
+   ec->layer_block = 0;
+   _e_mod_effect_stack_update();
+
+   e_comp_object_signal_emit(ec->frame, "e,action,restack,finish", "e");
+}
+
+static Eina_Bool
+_e_mod_effect_cb_restack(void *data, Evas_Object *obj, const char *signal)
+{
+   E_Client *ec;
+
+   ec = e_comp_object_client_get(obj);
+   _e_mod_effect_object_setup(ec);
+
+   if ((!e_util_strcmp(signal, "e,action,restack,show")))
+     {
+        ec->layer_block = 1;
+        evas_object_layer_set(ec->frame, E_LAYER_CLIENT_PRIO);
+        e_comp_object_effect_params_set(ec->frame, 0, (int[]){2}, 1);
+        e_comp_object_effect_start(ec->frame, _e_mod_effect_cb_restack_show_done, ec);
+     }
+   else if (!e_util_strcmp(signal, "e,action,restack,hide"))
+     {
+        ec->layer_block = 1;
+        evas_object_layer_set(ec->frame, E_LAYER_CLIENT_PRIO);
+        e_comp_object_effect_params_set(ec->frame, 0, (int[]){3}, 1);
+        e_comp_object_effect_start(ec->frame, _e_mod_effect_cb_restack_hide_done, ec);
+     }
+   else if (!e_util_strcmp(signal, "e,action,restack,finish"))
+     {
+        e_comp_object_effect_params_set(ec->frame, 0, (int[]){4}, 1);
+        e_comp_object_effect_start(ec->frame, NULL, NULL);
+     }
+
+   return EINA_TRUE;
+}
+
+EAPI Eina_Bool
+e_mod_effect_init()
+{
+   if (!(_comp = e_comp_get(NULL)))
+     return EINA_FALSE;
+
+   _event_hdlrs =
+      eina_list_append(_event_hdlrs,
+                       ecore_event_handler_add(E_EVENT_CLIENT_STACK,
+                                               _e_mod_effect_cb_client_restack,
+                                               _comp));
+   _event_hdlrs =
+      eina_list_append(_event_hdlrs,
+                       ecore_event_handler_add(E_EVENT_CLIENT_REMOVE,
+                                               _e_mod_effect_cb_client_remove,
+                                               _comp));
+   _providers =
+      eina_list_append(_providers,
+                       e_comp_object_effect_mover_add(100,
+                                                      "e,state,visible",
+                                                      _e_mod_effect_cb_visible,
+                                                      _comp));
+   _providers =
+      eina_list_append(_providers,
+                       e_comp_object_effect_mover_add(100,
+                                                      "e,state,hidden",
+                                                      _e_mod_effect_cb_hidden,
+                                                      _comp));
+   _providers =
+      eina_list_append(_providers,
+                       e_comp_object_effect_mover_add(100,
+                                                      "e,action,iconify",
+                                                      _e_mod_effect_cb_hidden,
+                                                      _comp));
+   _providers =
+      eina_list_append(_providers,
+                       e_comp_object_effect_mover_add(100,
+                                                      "e,action,uniconify",
+                                                      _e_mod_effect_cb_visible,
+                                                      _comp));
+   _providers =
+      eina_list_append(_providers,
+                       e_comp_object_effect_mover_add(100,
+                                                      "e,action,restack*",
+                                                      _e_mod_effect_cb_restack,
+                                                      _comp));
+   return EINA_TRUE;
+}
+
+EAPI void
+e_mod_effect_shutdown()
+{
+   E_Comp_Object_Mover *prov = NULL;
+   Ecore_Event_Handler *hdl = NULL;
+
+   EINA_LIST_FREE(_providers, prov)
+      e_comp_object_effect_mover_del(prov);
+
+   EINA_LIST_FREE(_event_hdlrs, hdl)
+      ecore_event_handler_del(hdl);
+
+   _comp = NULL;
+}
diff --git a/src/e_mod_effect.h b/src/e_mod_effect.h
new file mode 100644 (file)
index 0000000..30237d6
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef E_MOD_EFFECT_H
+#define E_MOD_EFFECT_H
+
+EAPI Eina_Bool e_mod_effect_init(void);
+EAPI void e_mod_effect_shutdown(void);
+
+#endif
diff --git a/src/e_mod_main.c b/src/e_mod_main.c
new file mode 100644 (file)
index 0000000..60b932a
--- /dev/null
@@ -0,0 +1,28 @@
+#include "e.h"
+#include "e_mod_main.h"
+#include "e_mod_effect.h"
+
+EAPI E_Module_Api e_modapi = { E_MODULE_API_VERSION, "Effect Module" };
+
+EAPI void *
+e_modapi_init(E_Module *m)
+{
+   if (!e_mod_effect_init())
+     return NULL;
+
+   return m;
+}
+EAPI int
+e_modapi_shutdown(E_Module *m EINA_UNUSED)
+{
+   e_mod_effect_shutdown();
+
+   return 1;
+}
+
+EAPI int
+e_modapi_save(E_Module *m EINA_UNUSED)
+{
+   /* Save something to be kept */
+   return 1;
+}
diff --git a/src/e_mod_main.h b/src/e_mod_main.h
new file mode 100644 (file)
index 0000000..474c1f2
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef E_MOD_MAIN_H
+#define E_MOD_MAIN_H
+
+/*** E Module ***/
+EAPI extern E_Module_Api e_modapi;
+
+EAPI void *e_modapi_init     (E_Module *m);
+EAPI int   e_modapi_shutdown (E_Module *m);
+EAPI int   e_modapi_save     (E_Module *m);
+
+#endif