From 28d74a0f6aa87a8c744423015b40de36a9f888cd Mon Sep 17 00:00:00 2001 From: MinJeong Kim Date: Tue, 6 Jan 2015 14:39:52 +0900 Subject: [PATCH] Added Show/Hide/Restack Effect Change-Id: I8aa2aea4113c798b596be61332527a7899f84330 Signed-off-by: MinJeong Kim --- Makefile.am | 12 ++ autogen.sh | 10 ++ configure.ac | 116 ++++++++++++++++ data/Makefile.am | 19 +++ data/effect.edc | 16 +++ data/group/fade.edc | 174 ++++++++++++++++++++++++ data/group/no_effect.edc | 114 ++++++++++++++++ packaging/e-mod-tizen-effect.spec | 53 ++++++++ src/Makefile.am | 18 +++ src/e_mod_effect.c | 274 ++++++++++++++++++++++++++++++++++++++ src/e_mod_effect.h | 7 + src/e_mod_main.c | 28 ++++ src/e_mod_main.h | 11 ++ 13 files changed, 852 insertions(+) create mode 100644 Makefile.am create mode 100755 autogen.sh create mode 100644 configure.ac create mode 100644 data/Makefile.am create mode 100644 data/effect.edc create mode 100644 data/group/fade.edc create mode 100644 data/group/no_effect.edc create mode 100644 packaging/e-mod-tizen-effect.spec create mode 100644 src/Makefile.am create mode 100644 src/e_mod_effect.c create mode 100644 src/e_mod_effect.h create mode 100644 src/e_mod_main.c create mode 100644 src/e_mod_main.h diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..e0485d2 --- /dev/null +++ b/Makefile.am @@ -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 index 0000000..5a30991 --- /dev/null +++ b/autogen.sh @@ -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 index 0000000..d1e0713 --- /dev/null +++ b/configure.ac @@ -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 index 0000000..d3f4d74 --- /dev/null +++ b/data/Makefile.am @@ -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 index 0000000..9640e49 --- /dev/null +++ b/data/effect.edc @@ -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 index 0000000..8ad3788 --- /dev/null +++ b/data/group/fade.edc @@ -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 index 0000000..bd23ae1 --- /dev/null +++ b/data/group/no_effect.edc @@ -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 index 0000000..5a0d7ab --- /dev/null +++ b/packaging/e-mod-tizen-effect.spec @@ -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 index 0000000..0da8baa --- /dev/null +++ b/src/Makefile.am @@ -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 index 0000000..9e37b5d --- /dev/null +++ b/src/e_mod_effect.c @@ -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 index 0000000..30237d6 --- /dev/null +++ b/src/e_mod_effect.h @@ -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 index 0000000..60b932a --- /dev/null +++ b/src/e_mod_main.c @@ -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 index 0000000..474c1f2 --- /dev/null +++ b/src/e_mod_main.h @@ -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 -- 2.7.4