--- /dev/null
+#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)
+
--- /dev/null
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+
+set -x
+aclocal
+autoconf
+libtoolize --copy --force
+autoheader
+automake --foreign --add-missing --copy
+
--- /dev/null
+# 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
+
+
--- /dev/null
+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
+
--- /dev/null
+#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"
+}
+
--- /dev/null
+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";
+ }
+ }
+}
--- /dev/null
+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";
+ }
+ }
+}
--- /dev/null
+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}
+
--- /dev/null
+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)
--- /dev/null
+#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;
+}
--- /dev/null
+#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
--- /dev/null
+#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;
+}
--- /dev/null
+#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