From a48ad4d5f1951f2c4b685021b88b193ffc361840 Mon Sep 17 00:00:00 2001 From: MinJeong Kim Date: Tue, 6 Jan 2015 16:47:05 +0900 Subject: [PATCH 01/16] Packaging with license file Change-Id: Ib97fc78e3e9a5936819d0b125a26966cda7c77b3 Signed-off-by: MinJeong Kim --- packaging/e-mod-tizen-effect.spec | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packaging/e-mod-tizen-effect.spec b/packaging/e-mod-tizen-effect.spec index 39893c3..e626687 100644 --- a/packaging/e-mod-tizen-effect.spec +++ b/packaging/e-mod-tizen-effect.spec @@ -40,8 +40,8 @@ make rm -rf %{buildroot} # for license notification -#mkdir -p %{buildroot}/usr/share/license -#cp -a %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/%{name} +mkdir -p %{buildroot}/usr/share/license +cp -a %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/%{name} # install make install DESTDIR=%{buildroot} @@ -54,5 +54,5 @@ find %{buildroot}%{_libdir}/enlightenment/modules/%{name} -name *.la | xargs rm %defattr(-,root,root,-) %{_libdir}/enlightenment/modules/e-mod-tizen-effect %{_datadir}/enlightenment/data/themes -#/usr/share/license/%{name} +/usr/share/license/%{name} -- 2.7.4 From 468512321aecdd80d1a50c6e29403b7108a4c695 Mon Sep 17 00:00:00 2001 From: MinJeong Kim Date: Thu, 8 Jan 2015 21:47:20 +0900 Subject: [PATCH 02/16] Compare visibility of the client for restack To improve processing restacking effect, simple visibility calculation using eina_tiler is added. Change-Id: I1c436cc98a44fe18483e3595618fe8becf1b81c9 Signed-off-by: MinJeong Kim --- src/e_mod_effect.c | 92 +++++++++++++++++++++++++++++------------------------- 1 file changed, 50 insertions(+), 42 deletions(-) diff --git a/src/e_mod_effect.c b/src/e_mod_effect.c index 9e37b5d..f3b7abe 100644 --- a/src/e_mod_effect.c +++ b/src/e_mod_effect.c @@ -4,7 +4,8 @@ E_Comp *_comp = NULL; Eina_List *_providers = NULL; Eina_List *_event_hdlrs = NULL; -Eina_List *_stack = NULL; +Eina_List *_stack_old = NULL; +Eina_List *_stack_new = NULL; static void _e_mod_effect_object_setup(E_Client *ec) @@ -26,63 +27,70 @@ _e_mod_effect_stack_update() E_Client *ec; Evas_Object *o; + _stack_old = eina_list_free(_stack_old); + _stack_old = eina_list_clone(_stack_new); 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); + _stack_new = eina_list_remove(_stack_new, ec); + _stack_new = eina_list_append(_stack_new, ec); } } -static const char* -_e_mod_effect_restack_effect_check(E_Client *ec) +static Eina_Bool +_e_mod_effect_visibility_check(E_Client *ec, Eina_List *stack) { - Evas_Object *o; - const char* emission = NULL; Eina_List *l; E_Client *_ec; + Eina_Tiler *tiler; + Eina_Rectangle r; + Eina_Bool vis = EINA_TRUE; - if (!ec->visible) return NULL; - if (ec->new_client) return NULL; + if (!stack) return EINA_FALSE; + + tiler = eina_tiler_new(ec->zone->w, ec->zone->h); + eina_tiler_tile_size_set(tiler, 1, 1); + EINA_RECTANGLE_SET(&r, ec->zone->x, ec->zone->y, ec->zone->w, ec->zone->h); + eina_tiler_rect_add(tiler, &r); - o = evas_object_above_get(ec->frame); - if (o == _comp->layers[e_comp_canvas_layer_map(ec->layer)].obj) + EINA_LIST_FOREACH(stack, l, _ec) { - if (_stack) - { - EINA_LIST_FOREACH(_stack, l, _ec) - { - if (_ec == ec) break; - if ((_ec->iconic) || (!_ec->visible)) continue; + if (_ec == ec) break; + if ((_ec->iconic) || (!_ec->visible) || (_ec->argb)) continue; + + EINA_RECTANGLE_SET(&r, _ec->x, _ec->y, _ec->w, _ec->h); + eina_tiler_rect_del(tiler, &r); - emission = "e,action,restack,show"; - } + if (eina_tiler_empty(tiler)) + { + vis = EINA_FALSE; + break; } - else - emission = "e,action,restack,show"; } - else + eina_tiler_free(tiler); + + return vis; +} + +static const char* +_e_mod_effect_restack_effect_check(E_Client *ec) +{ + const char* emission = NULL; + Eina_Bool v1, v2; + + if (!ec->visible) return NULL; + if (ec->new_client) return NULL; + + v1 = _e_mod_effect_visibility_check(ec, _stack_old); + v2 = _e_mod_effect_visibility_check(ec, _stack_new); + + if (v1 != v2) { - _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"; - } + if (v2) emission = "e,action,restack,show"; + else emission = "e,action,restack,hide"; } return emission; @@ -95,7 +103,8 @@ _e_mod_effect_cb_client_remove(void *data, int type, void *event) E_Event_Client *ev = event; ec = ev->ec; - _stack = eina_list_remove(_stack, ec); + _stack_old = eina_list_remove(_stack_saved, ec); + _stack_new = eina_list_remove(_stack_new, ec); return ECORE_CALLBACK_PASS_ON; } @@ -108,11 +117,10 @@ _e_mod_effect_cb_client_restack(void *data, int type, void *event) const char* emission = NULL; ec = ev->ec; - + _e_mod_effect_stack_update(); 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; } -- 2.7.4 From 31e26898b32777c3eb818aca336cbdb6a5722f8c Mon Sep 17 00:00:00 2001 From: MinJeong Kim Date: Fri, 9 Jan 2015 10:31:21 +0900 Subject: [PATCH 03/16] Fix wrong list name Change-Id: Ia6c1f7030473369b83f12354dc1a9b4a9e30d059 --- src/e_mod_effect.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/e_mod_effect.c b/src/e_mod_effect.c index f3b7abe..fa2190e 100644 --- a/src/e_mod_effect.c +++ b/src/e_mod_effect.c @@ -103,7 +103,7 @@ _e_mod_effect_cb_client_remove(void *data, int type, void *event) E_Event_Client *ev = event; ec = ev->ec; - _stack_old = eina_list_remove(_stack_saved, ec); + _stack_old = eina_list_remove(_stack_old, ec); _stack_new = eina_list_remove(_stack_new, ec); return ECORE_CALLBACK_PASS_ON; -- 2.7.4 From e16b49dda263dba1eca19a1c03ac6d7b5bd970df Mon Sep 17 00:00:00 2001 From: MinJeong Kim Date: Wed, 25 Feb 2015 16:25:22 +0900 Subject: [PATCH 04/16] Added keyboard effect Change-Id: Ic439ca113298eef35047a656c6d7f88ca9578fec Signed-off-by: MinJeong Kim --- data/effect.edc | 5 ++ data/group/keyboard.edc | 174 ++++++++++++++++++++++++++++++++++++++++++++++++ src/e_mod_effect.c | 13 +++- 3 files changed, 189 insertions(+), 3 deletions(-) create mode 100644 data/group/keyboard.edc diff --git a/data/effect.edc b/data/effect.edc index 9640e49..81ed67b 100644 --- a/data/effect.edc +++ b/data/effect.edc @@ -12,5 +12,10 @@ collections { /* group "e/comp/effects/fade" */ /*-----------------------------------------------------*/ #include "group/fade.edc" + + /*-----------------------------------------------------*/ + /* group "e/comp/effects/keyboard" */ + /*-----------------------------------------------------*/ + #include "group/keyboard.edc" } diff --git a/data/group/keyboard.edc b/data/group/keyboard.edc new file mode 100644 index 0000000..1442cf6 --- /dev/null +++ b/data/group/keyboard.edc @@ -0,0 +1,174 @@ +group { name: "e/comp/effects/keyboard"; + 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 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; + } + 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 1; + rel2.relative: 1 2; + } + 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/src/e_mod_effect.c b/src/e_mod_effect.c index fa2190e..483bb7b 100644 --- a/src/e_mod_effect.c +++ b/src/e_mod_effect.c @@ -13,12 +13,19 @@ _e_mod_effect_object_setup(E_Client *ec) E_Comp_Config *config; config = e_comp_config_get(); - if ((config) && (config->effect_style)) + if (ec->vkbd.vkbd) { - e_comp_object_effect_set(ec->frame , config->effect_style); + e_comp_object_effect_set(ec->frame, "keyboard"); } else - e_comp_object_effect_set(ec->frame, "no-effect"); + { + 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 -- 2.7.4 From 5f79b8851afa8c79e6b208a7df64ea8b56eade73 Mon Sep 17 00:00:00 2001 From: Gwanglim Lee Date: Wed, 25 Feb 2015 17:53:34 +0900 Subject: [PATCH 05/16] Packaging: update version to 0.0.2 --- packaging/e-mod-tizen-effect.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/e-mod-tizen-effect.spec b/packaging/e-mod-tizen-effect.spec index e626687..231bc33 100644 --- a/packaging/e-mod-tizen-effect.spec +++ b/packaging/e-mod-tizen-effect.spec @@ -1,7 +1,7 @@ %bcond_with x Name: e-mod-tizen-effect -Version: 0.0.1 +Version: 0.0.2 Release: 1 Summary: The effect module for the enlightenment URL: http://www.enlightenment.org -- 2.7.4 From 2bacfcaf6bbb5eedea6128290d330ffd7d3a4427 Mon Sep 17 00:00:00 2001 From: MinJeong Kim Date: Fri, 6 Mar 2015 11:08:15 +0900 Subject: [PATCH 06/16] Fixed hide effect and Added E_Effect Object 1. To fixed hide effect, added refer/unref step for E_Client and E_Pixmap. 2. To manage variables, added E_Effect object. Change-Id: I77fb2d953aa309d6b16e40299eb598187000839f Signed-off-by: MinJeong Kim --- src/e_mod_effect.c | 297 +++++++++++++++++++++++++++++++++++++++-------------- src/e_mod_effect.h | 21 ++++ 2 files changed, 241 insertions(+), 77 deletions(-) diff --git a/src/e_mod_effect.c b/src/e_mod_effect.c index 483bb7b..c2f2745 100644 --- a/src/e_mod_effect.c +++ b/src/e_mod_effect.c @@ -1,11 +1,58 @@ #include "e.h" #include "e_mod_effect.h" -E_Comp *_comp = NULL; -Eina_List *_providers = NULL; -Eina_List *_event_hdlrs = NULL; -Eina_List *_stack_old = NULL; -Eina_List *_stack_new = NULL; + +E_Effect *_effect = NULL; + +typedef struct _E_Effect_Client +{ + E_Client *ec; + unsigned int animating; +} E_Effect_Client; + +static void +_e_mod_effect_ref(E_Client *ec) +{ + E_Effect_Client *efc; + + if (!_effect) return; + + if (e_object_is_del(E_OBJECT(ec))) + { + eina_hash_del_by_key(_effect->clients, &ec); + return; + } + + efc = eina_hash_find(_effect->clients, &ec); + if (!efc) return; + + efc->animating ++; + e_object_ref(E_OBJECT(ec)); + e_pixmap_ref(ec->pixmap); +} + +static void +_e_mod_effect_unref(E_Client *ec) +{ + E_Effect_Client *efc; + + if (!_effect) return; + + efc = eina_hash_find(_effect->clients, &ec); + if (!efc) return; + + while(efc->animating) + { + e_pixmap_free(ec->pixmap); + if (!e_object_unref(E_OBJECT(ec))) + { + eina_hash_del_by_key(_effect->clients, &ec); + break; + } + + efc->animating --; + } +} static void _e_mod_effect_object_setup(E_Client *ec) @@ -34,16 +81,19 @@ _e_mod_effect_stack_update() E_Client *ec; Evas_Object *o; - _stack_old = eina_list_free(_stack_old); - _stack_old = eina_list_clone(_stack_new); - for (o = evas_object_top_get(_comp->evas); o; o = evas_object_below_get(o)) + if (!_effect) return; + + _effect->stack.old = eina_list_free(_effect->stack.old); + _effect->stack.old = eina_list_clone(_effect->stack.cur); + + for (o = evas_object_top_get(_effect->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; + if (e_client_util_ignored_get(ec)) continue; - _stack_new = eina_list_remove(_stack_new, ec); - _stack_new = eina_list_append(_stack_new, ec); + _effect->stack.cur = eina_list_remove(_effect->stack.cur, ec); + _effect->stack.cur = eina_list_append(_effect->stack.cur, ec); } } @@ -88,11 +138,12 @@ _e_mod_effect_restack_effect_check(E_Client *ec) const char* emission = NULL; Eina_Bool v1, v2; + if (!_effect) return NULL; if (!ec->visible) return NULL; if (ec->new_client) return NULL; - v1 = _e_mod_effect_visibility_check(ec, _stack_old); - v2 = _e_mod_effect_visibility_check(ec, _stack_new); + v1 = _e_mod_effect_visibility_check(ec, _effect->stack.old); + v2 = _e_mod_effect_visibility_check(ec, _effect->stack.cur); if (v1 != v2) { @@ -103,44 +154,25 @@ _e_mod_effect_restack_effect_check(E_Client *ec) 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_old = eina_list_remove(_stack_old, ec); - _stack_new = eina_list_remove(_stack_new, ec); - - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_e_mod_effect_cb_client_restack(void *data, int type, void *event) +static void +_e_mod_effect_cb_visible_done(void *data, Evas_Object *obj, const char *sig, const char *src) { E_Client *ec; - E_Event_Client *ev = event; - const char* emission = NULL; - - ec = ev->ec; - _e_mod_effect_stack_update(); - if ((emission = _e_mod_effect_restack_effect_check(ec))) - e_comp_object_signal_emit(ec->frame, emission, "e"); + ec = (E_Client*) data; - return ECORE_CALLBACK_PASS_ON; + _e_mod_effect_unref(ec); } 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_ref(ec); _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); + e_comp_object_effect_start(ec->frame, _e_mod_effect_cb_visible_done, ec); return EINA_TRUE; } @@ -151,6 +183,8 @@ _e_mod_effect_cb_hidden_done(void *data, Evas_Object *obj, const char *sig, cons E_Client *ec; ec = (E_Client*) data; + _e_mod_effect_unref(ec); + if (ec->iconic) evas_object_hide(ec->frame); } @@ -159,9 +193,10 @@ 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_ref(ec); + _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); @@ -173,8 +208,9 @@ 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; + + _e_mod_effect_unref(ec); evas_object_layer_set(ec->frame, ec->layer); ec->layer_block = 0; _e_mod_effect_stack_update(); @@ -184,8 +220,9 @@ 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; + + _e_mod_effect_unref(ec); evas_object_layer_set(ec->frame, ec->layer); ec->layer_block = 0; _e_mod_effect_stack_update(); @@ -193,16 +230,25 @@ _e_mod_effect_cb_restack_hide_done(void *data, Evas_Object *obj, const char *sig e_comp_object_signal_emit(ec->frame, "e,action,restack,finish", "e"); } +static void +_e_mod_effect_cb_restack_finish_done(void *data, Evas_Object *obj, const char *sig, const char *src) +{ + E_Client *ec = data; + ec = (E_Client*)data; + + _e_mod_effect_unref(ec); +} + 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); + _e_mod_effect_object_setup(ec); if ((!e_util_strcmp(signal, "e,action,restack,show"))) { + _e_mod_effect_ref(ec); 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); @@ -210,6 +256,7 @@ _e_mod_effect_cb_restack(void *data, Evas_Object *obj, const char *signal) } else if (!e_util_strcmp(signal, "e,action,restack,hide")) { + _e_mod_effect_ref(ec); 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); @@ -217,73 +264,169 @@ _e_mod_effect_cb_restack(void *data, Evas_Object *obj, const char *signal) } else if (!e_util_strcmp(signal, "e,action,restack,finish")) { + _e_mod_effect_ref(ec); e_comp_object_effect_params_set(ec->frame, 0, (int[]){4}, 1); - e_comp_object_effect_start(ec->frame, NULL, NULL); + e_comp_object_effect_start(ec->frame, _e_mod_effect_cb_restack_finish_done, ec); } return EINA_TRUE; } + +static E_Effect_Client* +_e_mod_effect_client_new(E_Client *ec) +{ + E_Effect_Client* efc; + + efc = E_NEW(E_Effect_Client, 1); + efc->ec = ec; + efc->animating = 0; + + return efc; +} + +static Eina_Bool +_e_mod_effect_cb_client_add(void *data, int type, void *event) +{ + E_Client *ec; + E_Effect_Client *efc; + E_Event_Client *ev = event; + + if (!_effect) return ECORE_CALLBACK_PASS_ON; + + ec = ev->ec; + efc = eina_hash_find(_effect->clients, &ec); + if (!efc) + { + efc = _e_mod_effect_client_new(ec); + eina_hash_add(_effect->clients, &ec, efc); + } + + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_e_mod_effect_cb_client_remove(void *data, int type, void *event) +{ + E_Client *ec; + E_Event_Client *ev = event; + + if (!_effect) return ECORE_CALLBACK_PASS_ON; + + ec = ev->ec; + _effect->stack.old = eina_list_remove(_effect->stack.old, ec); + _effect->stack.cur = eina_list_remove(_effect->stack.cur, 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; + _e_mod_effect_stack_update(); + if ((emission = _e_mod_effect_restack_effect_check(ec))) + e_comp_object_signal_emit(ec->frame, emission, "e"); + + return ECORE_CALLBACK_PASS_ON; +} + +static void +_e_mod_effect_cb_client_data_free(void *data) +{ + free(data); +} + EAPI Eina_Bool -e_mod_effect_init() +e_mod_effect_init(void) { - if (!(_comp = e_comp_get(NULL))) - return EINA_FALSE; + E_Comp *comp; + E_Effect *effect; + E_Comp_Config *config; - _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, + if (!(effect = E_NEW(E_Effect, 1))) return EINA_FALSE; + if (!(effect->comp = e_comp_get(NULL))) return EINA_FALSE; + + if ((config = e_comp_config_get())) + { + effect->file = eina_stringshare_add(config->effect_file); + effect->style = eina_stringshare_add(config->effect_style); + } + else + { + effect->file = ""; + effect->style = "no-effect"; + } + + effect->clients = eina_hash_pointer_new(_e_mod_effect_cb_client_data_free); + + effect->event_hdlrs = + eina_list_append(effect->event_hdlrs, + ecore_event_handler_add(E_EVENT_CLIENT_ADD, + _e_mod_effect_cb_client_add, + effect)); + effect->event_hdlrs = + eina_list_append(effect->event_hdlrs, ecore_event_handler_add(E_EVENT_CLIENT_REMOVE, _e_mod_effect_cb_client_remove, - _comp)); - _providers = - eina_list_append(_providers, + effect)); + effect->event_hdlrs = + eina_list_append(effect->event_hdlrs, + ecore_event_handler_add(E_EVENT_CLIENT_STACK, + _e_mod_effect_cb_client_restack, + effect)); + effect->providers = + eina_list_append(effect->providers, e_comp_object_effect_mover_add(100, "e,state,visible", _e_mod_effect_cb_visible, - _comp)); - _providers = - eina_list_append(_providers, + effect)); + effect->providers = + eina_list_append(effect->providers, e_comp_object_effect_mover_add(100, "e,state,hidden", _e_mod_effect_cb_hidden, - _comp)); - _providers = - eina_list_append(_providers, + effect)); + effect->providers = + eina_list_append(effect->providers, e_comp_object_effect_mover_add(100, "e,action,iconify", _e_mod_effect_cb_hidden, - _comp)); - _providers = - eina_list_append(_providers, + effect)); + effect->providers = + eina_list_append(effect->providers, e_comp_object_effect_mover_add(100, "e,action,uniconify", _e_mod_effect_cb_visible, - _comp)); - _providers = - eina_list_append(_providers, + effect)); + effect->providers = + eina_list_append(effect->providers, e_comp_object_effect_mover_add(100, "e,action,restack*", _e_mod_effect_cb_restack, - _comp)); + effect)); + + _effect = effect; + return EINA_TRUE; } EAPI void e_mod_effect_shutdown() { - E_Comp_Object_Mover *prov = NULL; - Ecore_Event_Handler *hdl = NULL; + if (!_effect) return; + + E_FREE_FUNC(_effect->clients, eina_hash_free); - EINA_LIST_FREE(_providers, prov) - e_comp_object_effect_mover_del(prov); + E_FREE_LIST(_effect->providers, e_comp_object_effect_mover_del); + E_FREE_LIST(_effect->event_hdlrs, ecore_event_handler_del); - EINA_LIST_FREE(_event_hdlrs, hdl) - ecore_event_handler_del(hdl); + E_FREE_FUNC(_effect->stack.old, eina_list_free); + E_FREE_FUNC(_effect->stack.cur, eina_list_free); - _comp = NULL; + E_FREE(_effect); } diff --git a/src/e_mod_effect.h b/src/e_mod_effect.h index 30237d6..45b463a 100644 --- a/src/e_mod_effect.h +++ b/src/e_mod_effect.h @@ -1,6 +1,27 @@ #ifndef E_MOD_EFFECT_H #define E_MOD_EFFECT_H +typedef struct _E_Effect E_Effect; + +struct _E_Effect +{ + E_Comp *comp; + + const char *file; + const char *style; + + Eina_List *providers; + Eina_List *event_hdlrs; + + Eina_Hash *clients; + + struct { + Eina_List *old; + Eina_List *cur; + } stack; + +}; + EAPI Eina_Bool e_mod_effect_init(void); EAPI void e_mod_effect_shutdown(void); -- 2.7.4 From 0b19449f7874b2ac578849a038774ea6f524a1b4 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Mon, 6 Apr 2015 19:50:35 +0900 Subject: [PATCH 07/16] fix memory leak When client is deleted, _e_client_del is called. And ec->pixmap becomes NULL. After that, when _e_mod_effect_unref is called, ec->pixmap is NULL. But the ref_count of pixmap is 1. Change-Id: I6e33af1abd30bf5556bce8d300a3697e926ecf62 --- src/e_mod_effect.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/e_mod_effect.c b/src/e_mod_effect.c index c2f2745..8228494 100644 --- a/src/e_mod_effect.c +++ b/src/e_mod_effect.c @@ -8,6 +8,7 @@ typedef struct _E_Effect_Client { E_Client *ec; unsigned int animating; + E_Pixmap *ep; } E_Effect_Client; static void @@ -28,7 +29,7 @@ _e_mod_effect_ref(E_Client *ec) efc->animating ++; e_object_ref(E_OBJECT(ec)); - e_pixmap_ref(ec->pixmap); + efc->ep = e_pixmap_ref(ec->pixmap); } static void @@ -43,7 +44,7 @@ _e_mod_effect_unref(E_Client *ec) while(efc->animating) { - e_pixmap_free(ec->pixmap); + e_pixmap_free(efc->ep); if (!e_object_unref(E_OBJECT(ec))) { eina_hash_del_by_key(_effect->clients, &ec); @@ -52,6 +53,8 @@ _e_mod_effect_unref(E_Client *ec) efc->animating --; } + + efc->ep = NULL; } static void @@ -281,6 +284,7 @@ _e_mod_effect_client_new(E_Client *ec) efc = E_NEW(E_Effect_Client, 1); efc->ec = ec; efc->animating = 0; + efc->ep = NULL; return efc; } -- 2.7.4 From d169fd15e6d5975378c9f726f37528fe2ac2d261 Mon Sep 17 00:00:00 2001 From: MinJeong Kim Date: Wed, 17 Feb 2016 20:19:55 +0900 Subject: [PATCH 08/16] Prepared for wayland - removed e_comp_get - fixed skip for mouse_event - brought wayland options - refer buffer resource when buffer changed Change-Id: I3df895e3fcdbbc238a1253b325bbd74347cefe38 --- configure.ac | 12 ++++ data/group/fade.edc | 2 - data/group/keyboard.edc | 2 - data/group/no_effect.edc | 2 - packaging/e-mod-tizen-effect.spec | 9 ++- src/e_mod_effect.c | 146 ++++++++++++++++++++++++++++---------- src/e_mod_effect.h | 2 - 7 files changed, 128 insertions(+), 47 deletions(-) diff --git a/configure.ac b/configure.ac index d1e0713..79f2465 100644 --- a/configure.ac +++ b/configure.ac @@ -94,6 +94,18 @@ AC_ARG_ENABLE(homedir-install, [ datadir="${HOME}/.e/e/modules/${PACKAGE}" ] ) +have_wayland_only=no +AC_ARG_ENABLE([wayland-only], + AS_HELP_STRING([--enable-wayland-only],[enable wayland-only version of enlightenment @<:@default=disabled@:>@]), + [have_wayland_only=$enableval], + [have_wayland_only=no]) +AC_MSG_CHECKING([whether wayland-only version is enabled]) +if test "x${have_wayland_only}" != "xno"; then + AC_DEFINE_UNQUOTED([HAVE_WAYLAND_ONLY],[1],[enable wayland-only version of enlightenment]) + AC_DEFINE_UNQUOTED([HAVE_WAYLAND],[1],[enable wayland version]) +fi +AM_CONDITIONAL(HAVE_WAYLAND_ONLY, [test "x${have_wayland_only}" = xyes]) + dnl ======================================================================== # output files dnl ======================================================================== diff --git a/data/group/fade.edc b/data/group/fade.edc index 8ad3788..3ca7aa7 100644 --- a/data/group/fade.edc +++ b/data/group/fade.edc @@ -66,7 +66,6 @@ group { name: "e/comp/effects/fade"; } 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; @@ -93,7 +92,6 @@ group { name: "e/comp/effects/fade"; 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"; diff --git a/data/group/keyboard.edc b/data/group/keyboard.edc index 1442cf6..ae8dd2b 100644 --- a/data/group/keyboard.edc +++ b/data/group/keyboard.edc @@ -66,7 +66,6 @@ group { name: "e/comp/effects/keyboard"; } part { name: "shower"; type: SPACER; - mouse_events: 0; description { state: "default" 0.0; rel1.relative: 0 1; rel2.relative: 1 2; @@ -93,7 +92,6 @@ group { name: "e/comp/effects/keyboard"; 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"; diff --git a/data/group/no_effect.edc b/data/group/no_effect.edc index bd23ae1..d61dd5e 100644 --- a/data/group/no_effect.edc +++ b/data/group/no_effect.edc @@ -45,7 +45,6 @@ group { name: "e/comp/effects/no-effect"; } part { name: "shower"; type: SPACER; - mouse_events: 0; description { state: "default" 0.0; rel1.relative: 0 0; rel2.relative: 1 1; @@ -66,7 +65,6 @@ group { name: "e/comp/effects/no-effect"; 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"; diff --git a/packaging/e-mod-tizen-effect.spec b/packaging/e-mod-tizen-effect.spec index 231bc33..cc27e05 100644 --- a/packaging/e-mod-tizen-effect.spec +++ b/packaging/e-mod-tizen-effect.spec @@ -1,4 +1,5 @@ %bcond_with x +%bcond_with wayland Name: e-mod-tizen-effect Version: 0.0.2 @@ -15,9 +16,11 @@ BuildRequires: pkgconfig(edje) BuildRequires: gettext BuildRequires: edje-tools +## for wayland build plz remove below lines %if !%{with x} ExclusiveArch: %endif +### %description This package provides various window effect(animation) @@ -33,7 +36,11 @@ 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 +%configure \ +%if %{with wayland} + --enable-wayland-only \ +%endif + --prefix=/usr make %install diff --git a/src/e_mod_effect.c b/src/e_mod_effect.c index 8228494..6cf7724 100644 --- a/src/e_mod_effect.c +++ b/src/e_mod_effect.c @@ -1,3 +1,6 @@ +#ifdef HAVE_WAYLAND + #define E_COMP_WL +#endif #include "e.h" #include "e_mod_effect.h" @@ -8,9 +11,40 @@ typedef struct _E_Effect_Client { E_Client *ec; unsigned int animating; +#ifdef HAVE_WAYLAND + E_Comp_Wl_Buffer_Ref buffer_ref; +#else E_Pixmap *ep; +#endif } E_Effect_Client; +static E_Effect_Client* +_e_mod_effect_client_new(E_Client *ec) +{ + E_Effect_Client* efc; + + efc = E_NEW(E_Effect_Client, 1); + efc->ec = ec; + efc->animating = 0; +#ifndef HAVE_WAYLAND + efc->ep = NULL; +#endif + + return efc; +} + +static E_Effect_Client * +_e_mod_effect_client_get(E_Client *ec) +{ + E_Effect_Client *efc; + + if (!_effect) return NULL; + + efc = eina_hash_find(_effect->clients, &ec); + + return efc; +} + static void _e_mod_effect_ref(E_Client *ec) { @@ -24,12 +58,14 @@ _e_mod_effect_ref(E_Client *ec) return; } - efc = eina_hash_find(_effect->clients, &ec); + efc = _e_mod_effect_client_get(ec); if (!efc) return; efc->animating ++; e_object_ref(E_OBJECT(ec)); +#ifndef HAVE_WAYLAND efc->ep = e_pixmap_ref(ec->pixmap); +#endif } static void @@ -39,14 +75,17 @@ _e_mod_effect_unref(E_Client *ec) if (!_effect) return; - efc = eina_hash_find(_effect->clients, &ec); + efc = _e_mod_effect_client_get(ec); if (!efc) return; while(efc->animating) { +#ifndef HAVE_WAYLAND e_pixmap_free(efc->ep); +#endif if (!e_object_unref(E_OBJECT(ec))) { + efc = NULL; eina_hash_del_by_key(_effect->clients, &ec); break; } @@ -54,7 +93,10 @@ _e_mod_effect_unref(E_Client *ec) efc->animating --; } - efc->ep = NULL; +#ifndef HAVE_WAYLAND + if (efc) + efc->ep = NULL; +#endif } static void @@ -89,7 +131,7 @@ _e_mod_effect_stack_update() _effect->stack.old = eina_list_free(_effect->stack.old); _effect->stack.old = eina_list_clone(_effect->stack.cur); - for (o = evas_object_top_get(_effect->comp->evas); o; o = evas_object_below_get(o)) + for (o = evas_object_top_get(e_comp->evas); o; o = evas_object_below_get(o)) { ec = evas_object_data_get(o, "E_Client"); if (!ec) continue; @@ -188,7 +230,7 @@ _e_mod_effect_cb_hidden_done(void *data, Evas_Object *obj, const char *sig, cons _e_mod_effect_unref(ec); - if (ec->iconic) + if (_e_mod_effect_client_get(ec)) evas_object_hide(ec->frame); } @@ -275,20 +317,6 @@ _e_mod_effect_cb_restack(void *data, Evas_Object *obj, const char *signal) return EINA_TRUE; } - -static E_Effect_Client* -_e_mod_effect_client_new(E_Client *ec) -{ - E_Effect_Client* efc; - - efc = E_NEW(E_Effect_Client, 1); - efc->ec = ec; - efc->animating = 0; - efc->ep = NULL; - - return efc; -} - static Eina_Bool _e_mod_effect_cb_client_add(void *data, int type, void *event) { @@ -299,11 +327,12 @@ _e_mod_effect_cb_client_add(void *data, int type, void *event) if (!_effect) return ECORE_CALLBACK_PASS_ON; ec = ev->ec; - efc = eina_hash_find(_effect->clients, &ec); + efc = _e_mod_effect_client_get(ec); if (!efc) { efc = _e_mod_effect_client_new(ec); - eina_hash_add(_effect->clients, &ec, efc); + if (efc) + eina_hash_add(_effect->clients, &ec, efc); } return ECORE_CALLBACK_PASS_ON; @@ -313,6 +342,7 @@ static Eina_Bool _e_mod_effect_cb_client_remove(void *data, int type, void *event) { E_Client *ec; + E_Effect_Client *efc = NULL; E_Event_Client *ev = event; if (!_effect) return ECORE_CALLBACK_PASS_ON; @@ -321,6 +351,12 @@ _e_mod_effect_cb_client_remove(void *data, int type, void *event) _effect->stack.old = eina_list_remove(_effect->stack.old, ec); _effect->stack.cur = eina_list_remove(_effect->stack.cur, ec); + if ((efc = _e_mod_effect_client_get(ec))) + { + if (!efc->animating) + eina_hash_del_by_key(_effect->clients, &ec); + } + return ECORE_CALLBACK_PASS_ON; } @@ -339,21 +375,56 @@ _e_mod_effect_cb_client_restack(void *data, int type, void *event) return ECORE_CALLBACK_PASS_ON; } +#ifdef HAVE_WAYLAND +static Eina_Bool +_e_mod_effect_cb_client_buffer_change(void *data, int ev_type, void *event) +{ + E_Event_Client *ev = event; + E_Client *ec; + E_Effect_Client *efc; + E_Comp_Wl_Buffer *buffer = NULL; + + ec = ev->ec; + if (!ec) return ECORE_CALLBACK_PASS_ON; + + efc = _e_mod_effect_client_get(ec); + if (!efc) return NULL; + + if (ec->pixmap) + { + buffer = e_pixmap_resource_get(ec->pixmap); + + if ((buffer) && (buffer != efc->buffer_ref.buffer)) + { + e_comp_wl_buffer_reference(&efc->buffer_ref, buffer); + } + } + + return ECORE_CALLBACK_PASS_ON; +} + +#endif static void _e_mod_effect_cb_client_data_free(void *data) { +#ifdef HAVE_WAYLAND + E_Effect_Client *efc = data; + + if (efc->buffer_ref.buffer) + e_comp_wl_buffer_reference(&efc->buffer_ref, NULL); + +#endif free(data); } EAPI Eina_Bool e_mod_effect_init(void) { - E_Comp *comp; E_Effect *effect; E_Comp_Config *config; + if (!e_comp) return EINA_FALSE; if (!(effect = E_NEW(E_Effect, 1))) return EINA_FALSE; - if (!(effect->comp = e_comp_get(NULL))) return EINA_FALSE; if ((config = e_comp_config_get())) { @@ -368,21 +439,20 @@ e_mod_effect_init(void) effect->clients = eina_hash_pointer_new(_e_mod_effect_cb_client_data_free); - effect->event_hdlrs = - eina_list_append(effect->event_hdlrs, - ecore_event_handler_add(E_EVENT_CLIENT_ADD, - _e_mod_effect_cb_client_add, - effect)); - effect->event_hdlrs = - eina_list_append(effect->event_hdlrs, - ecore_event_handler_add(E_EVENT_CLIENT_REMOVE, - _e_mod_effect_cb_client_remove, - effect)); - effect->event_hdlrs = - eina_list_append(effect->event_hdlrs, - ecore_event_handler_add(E_EVENT_CLIENT_STACK, - _e_mod_effect_cb_client_restack, - effect)); + E_LIST_HANDLER_APPEND(effect->event_hdlrs, E_EVENT_CLIENT_ADD, + _e_mod_effect_cb_client_add, effect); + + E_LIST_HANDLER_APPEND(effect->event_hdlrs, E_EVENT_CLIENT_REMOVE, + _e_mod_effect_cb_client_remove, effect); + + E_LIST_HANDLER_APPEND(effect->event_hdlrs, E_EVENT_CLIENT_STACK, + _e_mod_effect_cb_client_restack, effect); + +#ifdef HAVE_WAYLAND + E_LIST_HANDLER_APPEND(effect->event_hdlrs, E_EVENT_CLIENT_BUFFER_CHANGE, + _e_mod_effect_cb_client_buffer_change, effect); +#endif + effect->providers = eina_list_append(effect->providers, e_comp_object_effect_mover_add(100, diff --git a/src/e_mod_effect.h b/src/e_mod_effect.h index 45b463a..6a56e9b 100644 --- a/src/e_mod_effect.h +++ b/src/e_mod_effect.h @@ -5,8 +5,6 @@ typedef struct _E_Effect E_Effect; struct _E_Effect { - E_Comp *comp; - const char *file; const char *style; -- 2.7.4 From a7db1c127fbc090694f9b452407d2f3699d2da62 Mon Sep 17 00:00:00 2001 From: MinJeong Kim Date: Fri, 4 Mar 2016 16:38:38 +0900 Subject: [PATCH 09/16] Support 'tizen_effect' wayland interface The effect module begins to support 'tizen_effect' interface which is for notifying clients of effect start/end event. Change-Id: I8dd5d7c66861788c043ef12b5d746e7b8604c76f Signed-off-by: MinJeong Kim --- packaging/e-mod-tizen-effect.spec | 4 + src/e_mod_effect.c | 156 +++++++++++++++++++++++++++++++++----- src/e_mod_effect.h | 27 ++++++- 3 files changed, 169 insertions(+), 18 deletions(-) diff --git a/packaging/e-mod-tizen-effect.spec b/packaging/e-mod-tizen-effect.spec index cc27e05..bf6730e 100644 --- a/packaging/e-mod-tizen-effect.spec +++ b/packaging/e-mod-tizen-effect.spec @@ -15,6 +15,10 @@ BuildRequires: pkgconfig(ecore) BuildRequires: pkgconfig(edje) BuildRequires: gettext BuildRequires: edje-tools +%if %{with wayland} +BuildRequires: pkgconfig(wayland-server) +BuildRequires: pkgconfig(tizen-extension-server) +%endif ## for wayland build plz remove below lines %if !%{with x} diff --git a/src/e_mod_effect.c b/src/e_mod_effect.c index 6cf7724..f994490 100644 --- a/src/e_mod_effect.c +++ b/src/e_mod_effect.c @@ -1,11 +1,6 @@ -#ifdef HAVE_WAYLAND - #define E_COMP_WL -#endif -#include "e.h" #include "e_mod_effect.h" - -E_Effect *_effect = NULL; +static E_Effect *_effect = NULL; typedef struct _E_Effect_Client { @@ -18,6 +13,55 @@ typedef struct _E_Effect_Client #endif } E_Effect_Client; +static void +_e_mod_effect_event_send(E_Client *ec, Eina_Bool start, E_Effect_Type type) +{ +#ifdef HAVE_WAYLAND + struct wl_resource *surface_resource; + struct wl_resource *effect_resource; + struct wl_client *wc; + unsigned int tizen_effect_type = TIZEN_EFFECT_TYPE_NONE; + + if (!_effect) return; + if ((!ec) || (!ec->comp_data)) return; + if (e_object_is_del(E_OBJECT(ec))) return; + + surface_resource = ec->comp_data->surface; + if (!surface_resource) return; + + wc = wl_resource_get_client(surface_resource); + if (!wc) return; + + effect_resource = eina_hash_find(_effect->resources, &wc); + if (!effect_resource) return; + + switch(type) + { + case E_EFFECT_TYPE_SHOW: + tizen_effect_type = TIZEN_EFFECT_TYPE_SHOW; + break; + case E_EFFECT_TYPE_HIDE: + tizen_effect_type = TIZEN_EFFECT_TYPE_HIDE; + break; + case E_EFFECT_TYPE_RESTACK_SHOW: + case E_EFFECT_TYPE_RESTACK_HIDE: + tizen_effect_type = TIZEN_EFFECT_TYPE_RESTACK; + break; + default: + return; + } + + if (start) + tizen_effect_send_start(effect_resource, surface_resource, tizen_effect_type); + else + tizen_effect_send_end(effect_resource, surface_resource, tizen_effect_type); +#else + (void)ec; + (void)start; + (void)type; +#endif +} + static E_Effect_Client* _e_mod_effect_client_new(E_Client *ec) { @@ -205,6 +249,7 @@ _e_mod_effect_cb_visible_done(void *data, Evas_Object *obj, const char *sig, con E_Client *ec; ec = (E_Client*) data; + _e_mod_effect_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_SHOW); _e_mod_effect_unref(ec); } @@ -214,9 +259,13 @@ _e_mod_effect_cb_visible(void *data, Evas_Object *obj, const char *signal) E_Client *ec; ec = e_comp_object_client_get(obj); + if (evas_object_visible_get(obj)) return EINA_FALSE; + _e_mod_effect_ref(ec); _e_mod_effect_object_setup(ec); e_comp_object_effect_params_set(ec->frame, 0, (int[]){0}, 1); + + _e_mod_effect_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_SHOW); e_comp_object_effect_start(ec->frame, _e_mod_effect_cb_visible_done, ec); return EINA_TRUE; @@ -228,6 +277,7 @@ _e_mod_effect_cb_hidden_done(void *data, Evas_Object *obj, const char *sig, cons E_Client *ec; ec = (E_Client*) data; + _e_mod_effect_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_HIDE); _e_mod_effect_unref(ec); if (_e_mod_effect_client_get(ec)) @@ -240,10 +290,14 @@ _e_mod_effect_cb_hidden(void *data, Evas_Object *obj, const char *signal) E_Client *ec; ec = e_comp_object_client_get(obj); + if (!evas_object_visible_get(obj)) return EINA_FALSE; + _e_mod_effect_ref(ec); _e_mod_effect_object_setup(ec); e_comp_object_effect_params_set(ec->frame, 0, (int[]){1}, 1); + + _e_mod_effect_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_HIDE); e_comp_object_effect_start(ec->frame, _e_mod_effect_cb_hidden_done, ec); return EINA_TRUE; @@ -281,6 +335,7 @@ _e_mod_effect_cb_restack_finish_done(void *data, Evas_Object *obj, const char *s E_Client *ec = data; ec = (E_Client*)data; + _e_mod_effect_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_RESTACK_SHOW); _e_mod_effect_unref(ec); } @@ -297,6 +352,8 @@ _e_mod_effect_cb_restack(void *data, Evas_Object *obj, const char *signal) 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_mod_effect_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_RESTACK_SHOW); 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")) @@ -305,6 +362,8 @@ _e_mod_effect_cb_restack(void *data, Evas_Object *obj, const char *signal) 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_mod_effect_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_RESTACK_HIDE); 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")) @@ -388,7 +447,7 @@ _e_mod_effect_cb_client_buffer_change(void *data, int ev_type, void *event) if (!ec) return ECORE_CALLBACK_PASS_ON; efc = _e_mod_effect_client_get(ec); - if (!efc) return NULL; + if (!efc) return ECORE_CALLBACK_PASS_ON; if (ec->pixmap) { @@ -403,6 +462,44 @@ _e_mod_effect_cb_client_buffer_change(void *data, int ev_type, void *event) return ECORE_CALLBACK_PASS_ON; } +static void +_tz_effect_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *tizen_effect_resource) +{ + wl_resource_destroy(tizen_effect_resource); +} + +static const struct tizen_effect_interface _tz_effect_interface = +{ + _tz_effect_cb_destroy, +}; + +static void +_tz_effect_cb_effect_destroy(struct wl_resource *tizen_effect_resource) +{ + if ((!_effect) || (!_effect->resources)) return; + + eina_hash_del_by_data(_effect->resources, tizen_effect_resource); +} + +static void +_e_mod_effect_cb_bind(struct wl_client *client, void *data EINA_UNUSED, uint32_t version EINA_UNUSED, uint32_t id) +{ + struct wl_resource *res; + + if (!(res = wl_resource_create(client, &tizen_effect_interface, 1, id))) + { + ERR("Could not create tizen_effect interface"); + wl_client_post_no_memory(client); + return; + } + + wl_resource_set_implementation(res, + &_tz_effect_interface, + NULL, + _tz_effect_cb_effect_destroy); + + eina_hash_add(_effect->resources, &client, res); +} #endif static void _e_mod_effect_cb_client_data_free(void *data) @@ -423,8 +520,13 @@ e_mod_effect_init(void) E_Effect *effect; E_Comp_Config *config; - if (!e_comp) return EINA_FALSE; - if (!(effect = E_NEW(E_Effect, 1))) return EINA_FALSE; + EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp->evas, EINA_FALSE); + + effect = E_NEW(E_Effect, 1); + EINA_SAFETY_ON_NULL_RETURN_VAL(effect, EINA_FALSE); + + _effect = effect; if ((config = e_comp_config_get())) { @@ -438,7 +540,22 @@ e_mod_effect_init(void) } effect->clients = eina_hash_pointer_new(_e_mod_effect_cb_client_data_free); + EINA_SAFETY_ON_NULL_GOTO(effect->clients, err); + +#ifdef HAVE_WAYLAND + effect->resources = eina_hash_pointer_new(NULL); + EINA_SAFETY_ON_NULL_GOTO(effect->resources, err); + + effect->global = wl_global_create(e_comp_wl->wl.disp, &tizen_effect_interface, 1, effect, _e_mod_effect_cb_bind); + if (!effect->global) + { + ERR("Could not add tizen_efffect wayland globals: %m"); + goto err; + } + E_LIST_HANDLER_APPEND(effect->event_hdlrs, E_EVENT_CLIENT_BUFFER_CHANGE, + _e_mod_effect_cb_client_buffer_change, effect); +#endif E_LIST_HANDLER_APPEND(effect->event_hdlrs, E_EVENT_CLIENT_ADD, _e_mod_effect_cb_client_add, effect); @@ -448,11 +565,6 @@ e_mod_effect_init(void) E_LIST_HANDLER_APPEND(effect->event_hdlrs, E_EVENT_CLIENT_STACK, _e_mod_effect_cb_client_restack, effect); -#ifdef HAVE_WAYLAND - E_LIST_HANDLER_APPEND(effect->event_hdlrs, E_EVENT_CLIENT_BUFFER_CHANGE, - _e_mod_effect_cb_client_buffer_change, effect); -#endif - effect->providers = eina_list_append(effect->providers, e_comp_object_effect_mover_add(100, @@ -487,6 +599,10 @@ e_mod_effect_init(void) _effect = effect; return EINA_TRUE; + +err: + e_mod_effect_shutdown(); + return EINA_FALSE; } EAPI void @@ -494,13 +610,19 @@ e_mod_effect_shutdown() { if (!_effect) return; - E_FREE_FUNC(_effect->clients, eina_hash_free); + E_FREE_FUNC(_effect->stack.old, eina_list_free); + E_FREE_FUNC(_effect->stack.cur, eina_list_free); E_FREE_LIST(_effect->providers, e_comp_object_effect_mover_del); E_FREE_LIST(_effect->event_hdlrs, ecore_event_handler_del); - E_FREE_FUNC(_effect->stack.old, eina_list_free); - E_FREE_FUNC(_effect->stack.cur, eina_list_free); +#ifdef HAVE_WAYLAND + if (_effect->global) + wl_global_destroy(_effect->global); + + E_FREE_FUNC(_effect->resources, eina_hash_free); +#endif + E_FREE_FUNC(_effect->clients, eina_hash_free); E_FREE(_effect); } diff --git a/src/e_mod_effect.h b/src/e_mod_effect.h index 6a56e9b..00fa8cc 100644 --- a/src/e_mod_effect.h +++ b/src/e_mod_effect.h @@ -1,10 +1,35 @@ #ifndef E_MOD_EFFECT_H -#define E_MOD_EFFECT_H +# define E_MOD_EFFECT_H + +# include "config.h" + +# ifdef HAVE_WAYLAND +# define E_COMP_WL +# include +# endif + +# include typedef struct _E_Effect E_Effect; +typedef enum _E_Effect_Type E_Effect_Type; + +enum _E_Effect_Type +{ + E_EFFECT_TYPE_SHOW, + E_EFFECT_TYPE_HIDE, + E_EFFECT_TYPE_ICONIFY, + E_EFFECT_TYPE_UNICONIFY, + E_EFFECT_TYPE_RESTACK_SHOW, + E_EFFECT_TYPE_RESTACK_HIDE, + E_EFFECT_TYPE_NONE, +}; struct _E_Effect { +# ifdef HAVE_WAYLAND + struct wl_global *global; + Eina_Hash *resources; +# endif const char *file; const char *style; -- 2.7.4 From fca755c3bbf71b0710c3aaa36b6b24a5f262b845 Mon Sep 17 00:00:00 2001 From: Doyoun Kang Date: Fri, 11 Mar 2016 13:52:54 +0900 Subject: [PATCH 10/16] Apply directory macros Change-Id: I5047157a58d2bf2f12af94744161544f6503e2eb --- packaging/e-mod-tizen-effect.spec | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packaging/e-mod-tizen-effect.spec b/packaging/e-mod-tizen-effect.spec index bf6730e..6f7e9f8 100644 --- a/packaging/e-mod-tizen-effect.spec +++ b/packaging/e-mod-tizen-effect.spec @@ -26,6 +26,8 @@ ExclusiveArch: %endif ### +%global TZ_SYS_RO_SHARE %{?TZ_SYS_RO_SHARE:%TZ_SYS_RO_SHARE}%{!?TZ_SYS_RO_SHARE:/usr/share} + %description This package provides various window effect(animation) as one module of enlightenment. @@ -44,15 +46,15 @@ export LDFLAGS+=" -Wl,--hash-style=both -Wl,--as-needed -Wl,--rpath=/usr/lib" %if %{with wayland} --enable-wayland-only \ %endif - --prefix=/usr + --prefix=%{_prefix} make %install rm -rf %{buildroot} # for license notification -mkdir -p %{buildroot}/usr/share/license -cp -a %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/%{name} +mkdir -p %{buildroot}/%{TZ_SYS_RO_SHARE}/license +cp -a %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/%{TZ_SYS_RO_SHARE}/license/%{name} # install make install DESTDIR=%{buildroot} @@ -65,5 +67,5 @@ find %{buildroot}%{_libdir}/enlightenment/modules/%{name} -name *.la | xargs rm %defattr(-,root,root,-) %{_libdir}/enlightenment/modules/e-mod-tizen-effect %{_datadir}/enlightenment/data/themes -/usr/share/license/%{name} +%{TZ_SYS_RO_SHARE}/license/%{name} -- 2.7.4 From 69bc373909299143941acf3ffcbed5e89e8dab54 Mon Sep 17 00:00:00 2001 From: Gwanglim Lee Date: Thu, 17 Mar 2016 17:13:43 +0900 Subject: [PATCH 11/16] Packaging: update version to 0.0.3 Change-Id: I89e7834cf74adfa6367f9ae628dfa508da5b9186 --- packaging/e-mod-tizen-effect.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/e-mod-tizen-effect.spec b/packaging/e-mod-tizen-effect.spec index 6f7e9f8..b8b6fbf 100644 --- a/packaging/e-mod-tizen-effect.spec +++ b/packaging/e-mod-tizen-effect.spec @@ -2,7 +2,7 @@ %bcond_with wayland Name: e-mod-tizen-effect -Version: 0.0.2 +Version: 0.0.3 Release: 1 Summary: The effect module for the enlightenment URL: http://www.enlightenment.org -- 2.7.4 From 6be60299db72f922118e79da40a9c2cd08dadd28 Mon Sep 17 00:00:00 2001 From: Gwanglim Lee Date: Tue, 31 May 2016 16:47:35 +0900 Subject: [PATCH 12/16] removed HAVE_WAYLAND and E_COMP_WL. make it wayland only. Change-Id: I5c06ad8c482e35a3c76e4488086a0569bc61d125 --- configure.ac | 12 ------------ packaging/e-mod-tizen-effect.spec | 17 +---------------- src/e_mod_effect.c | 34 ++-------------------------------- src/e_mod_effect.h | 9 +-------- src/e_mod_main.c | 1 - src/e_mod_main.h | 2 ++ 6 files changed, 6 insertions(+), 69 deletions(-) diff --git a/configure.ac b/configure.ac index 79f2465..d1e0713 100644 --- a/configure.ac +++ b/configure.ac @@ -94,18 +94,6 @@ AC_ARG_ENABLE(homedir-install, [ datadir="${HOME}/.e/e/modules/${PACKAGE}" ] ) -have_wayland_only=no -AC_ARG_ENABLE([wayland-only], - AS_HELP_STRING([--enable-wayland-only],[enable wayland-only version of enlightenment @<:@default=disabled@:>@]), - [have_wayland_only=$enableval], - [have_wayland_only=no]) -AC_MSG_CHECKING([whether wayland-only version is enabled]) -if test "x${have_wayland_only}" != "xno"; then - AC_DEFINE_UNQUOTED([HAVE_WAYLAND_ONLY],[1],[enable wayland-only version of enlightenment]) - AC_DEFINE_UNQUOTED([HAVE_WAYLAND],[1],[enable wayland version]) -fi -AM_CONDITIONAL(HAVE_WAYLAND_ONLY, [test "x${have_wayland_only}" = xyes]) - dnl ======================================================================== # output files dnl ======================================================================== diff --git a/packaging/e-mod-tizen-effect.spec b/packaging/e-mod-tizen-effect.spec index b8b6fbf..11f800f 100644 --- a/packaging/e-mod-tizen-effect.spec +++ b/packaging/e-mod-tizen-effect.spec @@ -1,6 +1,3 @@ -%bcond_with x -%bcond_with wayland - Name: e-mod-tizen-effect Version: 0.0.3 Release: 1 @@ -15,16 +12,8 @@ BuildRequires: pkgconfig(ecore) BuildRequires: pkgconfig(edje) BuildRequires: gettext BuildRequires: edje-tools -%if %{with wayland} BuildRequires: pkgconfig(wayland-server) BuildRequires: pkgconfig(tizen-extension-server) -%endif - -## for wayland build plz remove below lines -%if !%{with x} -ExclusiveArch: -%endif -### %global TZ_SYS_RO_SHARE %{?TZ_SYS_RO_SHARE:%TZ_SYS_RO_SHARE}%{!?TZ_SYS_RO_SHARE:/usr/share} @@ -42,11 +31,7 @@ export CFLAGS+=" -Wall -g -fPIC -rdynamic ${GC_SECTIONS_FLAGS}" export LDFLAGS+=" -Wl,--hash-style=both -Wl,--as-needed -Wl,--rpath=/usr/lib" %autogen -%configure \ -%if %{with wayland} - --enable-wayland-only \ -%endif - --prefix=%{_prefix} +%configure --prefix=%{_prefix} make %install diff --git a/src/e_mod_effect.c b/src/e_mod_effect.c index f994490..797a0d9 100644 --- a/src/e_mod_effect.c +++ b/src/e_mod_effect.c @@ -6,17 +6,12 @@ typedef struct _E_Effect_Client { E_Client *ec; unsigned int animating; -#ifdef HAVE_WAYLAND E_Comp_Wl_Buffer_Ref buffer_ref; -#else - E_Pixmap *ep; -#endif } E_Effect_Client; static void _e_mod_effect_event_send(E_Client *ec, Eina_Bool start, E_Effect_Type type) { -#ifdef HAVE_WAYLAND struct wl_resource *surface_resource; struct wl_resource *effect_resource; struct wl_client *wc; @@ -55,11 +50,6 @@ _e_mod_effect_event_send(E_Client *ec, Eina_Bool start, E_Effect_Type type) tizen_effect_send_start(effect_resource, surface_resource, tizen_effect_type); else tizen_effect_send_end(effect_resource, surface_resource, tizen_effect_type); -#else - (void)ec; - (void)start; - (void)type; -#endif } static E_Effect_Client* @@ -70,9 +60,6 @@ _e_mod_effect_client_new(E_Client *ec) efc = E_NEW(E_Effect_Client, 1); efc->ec = ec; efc->animating = 0; -#ifndef HAVE_WAYLAND - efc->ep = NULL; -#endif return efc; } @@ -107,9 +94,6 @@ _e_mod_effect_ref(E_Client *ec) efc->animating ++; e_object_ref(E_OBJECT(ec)); -#ifndef HAVE_WAYLAND - efc->ep = e_pixmap_ref(ec->pixmap); -#endif } static void @@ -124,9 +108,6 @@ _e_mod_effect_unref(E_Client *ec) while(efc->animating) { -#ifndef HAVE_WAYLAND - e_pixmap_free(efc->ep); -#endif if (!e_object_unref(E_OBJECT(ec))) { efc = NULL; @@ -136,11 +117,6 @@ _e_mod_effect_unref(E_Client *ec) efc->animating --; } - -#ifndef HAVE_WAYLAND - if (efc) - efc->ep = NULL; -#endif } static void @@ -434,7 +410,6 @@ _e_mod_effect_cb_client_restack(void *data, int type, void *event) return ECORE_CALLBACK_PASS_ON; } -#ifdef HAVE_WAYLAND static Eina_Bool _e_mod_effect_cb_client_buffer_change(void *data, int ev_type, void *event) { @@ -500,17 +475,15 @@ _e_mod_effect_cb_bind(struct wl_client *client, void *data EINA_UNUSED, uint32_t eina_hash_add(_effect->resources, &client, res); } -#endif + static void _e_mod_effect_cb_client_data_free(void *data) { -#ifdef HAVE_WAYLAND E_Effect_Client *efc = data; if (efc->buffer_ref.buffer) e_comp_wl_buffer_reference(&efc->buffer_ref, NULL); -#endif free(data); } @@ -542,7 +515,6 @@ e_mod_effect_init(void) effect->clients = eina_hash_pointer_new(_e_mod_effect_cb_client_data_free); EINA_SAFETY_ON_NULL_GOTO(effect->clients, err); -#ifdef HAVE_WAYLAND effect->resources = eina_hash_pointer_new(NULL); EINA_SAFETY_ON_NULL_GOTO(effect->resources, err); @@ -555,7 +527,7 @@ e_mod_effect_init(void) E_LIST_HANDLER_APPEND(effect->event_hdlrs, E_EVENT_CLIENT_BUFFER_CHANGE, _e_mod_effect_cb_client_buffer_change, effect); -#endif + E_LIST_HANDLER_APPEND(effect->event_hdlrs, E_EVENT_CLIENT_ADD, _e_mod_effect_cb_client_add, effect); @@ -616,12 +588,10 @@ e_mod_effect_shutdown() E_FREE_LIST(_effect->providers, e_comp_object_effect_mover_del); E_FREE_LIST(_effect->event_hdlrs, ecore_event_handler_del); -#ifdef HAVE_WAYLAND if (_effect->global) wl_global_destroy(_effect->global); E_FREE_FUNC(_effect->resources, eina_hash_free); -#endif E_FREE_FUNC(_effect->clients, eina_hash_free); E_FREE(_effect); diff --git a/src/e_mod_effect.h b/src/e_mod_effect.h index 00fa8cc..a312d7b 100644 --- a/src/e_mod_effect.h +++ b/src/e_mod_effect.h @@ -2,13 +2,8 @@ # define E_MOD_EFFECT_H # include "config.h" - -# ifdef HAVE_WAYLAND -# define E_COMP_WL -# include -# endif - # include +# include typedef struct _E_Effect E_Effect; typedef enum _E_Effect_Type E_Effect_Type; @@ -26,10 +21,8 @@ enum _E_Effect_Type struct _E_Effect { -# ifdef HAVE_WAYLAND struct wl_global *global; Eina_Hash *resources; -# endif const char *file; const char *style; diff --git a/src/e_mod_main.c b/src/e_mod_main.c index 60b932a..858e2e3 100644 --- a/src/e_mod_main.c +++ b/src/e_mod_main.c @@ -1,4 +1,3 @@ -#include "e.h" #include "e_mod_main.h" #include "e_mod_effect.h" diff --git a/src/e_mod_main.h b/src/e_mod_main.h index 474c1f2..94c197d 100644 --- a/src/e_mod_main.h +++ b/src/e_mod_main.h @@ -1,6 +1,8 @@ #ifndef E_MOD_MAIN_H #define E_MOD_MAIN_H +#include + /*** E Module ***/ EAPI extern E_Module_Api e_modapi; -- 2.7.4 From 923610052d843d42608c5a0dac8bf618186678f4 Mon Sep 17 00:00:00 2001 From: Gwanglim Lee Date: Tue, 31 May 2016 17:47:52 +0900 Subject: [PATCH 13/16] Packaging: make all warnings into errors. Change-Id: I397269cea8ee4eef789490ebf131b4b91b34c037 --- packaging/e-mod-tizen-effect.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/e-mod-tizen-effect.spec b/packaging/e-mod-tizen-effect.spec index 11f800f..ce03b26 100644 --- a/packaging/e-mod-tizen-effect.spec +++ b/packaging/e-mod-tizen-effect.spec @@ -27,7 +27,7 @@ as one module of enlightenment. %build export GC_SECTIONS_FLAGS="-fdata-sections -ffunction-sections -Wl,--gc-sections" -export CFLAGS+=" -Wall -g -fPIC -rdynamic ${GC_SECTIONS_FLAGS}" +export CFLAGS+=" -Wall -g -fPIC -Werror -rdynamic ${GC_SECTIONS_FLAGS}" export LDFLAGS+=" -Wl,--hash-style=both -Wl,--as-needed -Wl,--rpath=/usr/lib" %autogen -- 2.7.4 From bb627f4f60b8a232c902a33097b9ac0e84cb23e4 Mon Sep 17 00:00:00 2001 From: Gwanglim Lee Date: Mon, 13 Jun 2016 11:28:56 +0900 Subject: [PATCH 14/16] Revert "Packaging: make all warnings into errors." This reverts commit 923610052d843d42608c5a0dac8bf618186678f4. Change-Id: Ib42a0967e2ea58a4456d48e2fb1bf09ed3c22a66 Signed-off-by: Gwanglim Lee --- packaging/e-mod-tizen-effect.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/e-mod-tizen-effect.spec b/packaging/e-mod-tizen-effect.spec index ce03b26..11f800f 100644 --- a/packaging/e-mod-tizen-effect.spec +++ b/packaging/e-mod-tizen-effect.spec @@ -27,7 +27,7 @@ as one module of enlightenment. %build export GC_SECTIONS_FLAGS="-fdata-sections -ffunction-sections -Wl,--gc-sections" -export CFLAGS+=" -Wall -g -fPIC -Werror -rdynamic ${GC_SECTIONS_FLAGS}" +export CFLAGS+=" -Wall -g -fPIC -rdynamic ${GC_SECTIONS_FLAGS}" export LDFLAGS+=" -Wl,--hash-style=both -Wl,--as-needed -Wl,--rpath=/usr/lib" %autogen -- 2.7.4 From 23e50bdb377312c6fa5dde3f84ff9b0735d0d2eb Mon Sep 17 00:00:00 2001 From: MinJeong Kim Date: Tue, 14 Jun 2016 21:08:54 +0900 Subject: [PATCH 15/16] Refactor window show/hide/restack effect using edc Change-Id: Ib0d9dae67487453e318df7c2db4022fef757f4d2 Signed-off-by: MinJeong Kim --- data/effect.edc | 2 +- packaging/e-mod-tizen-effect.spec | 2 +- src/e_mod_effect.c | 604 ++++++++++++++++++++++++++++++++++---- src/e_mod_effect.h | 34 ++- 4 files changed, 577 insertions(+), 65 deletions(-) diff --git a/data/effect.edc b/data/effect.edc index 81ed67b..97f2355 100644 --- a/data/effect.edc +++ b/data/effect.edc @@ -1,5 +1,5 @@ #define COMP_EFFECT_DURATION 0.4 -#define COMP_EFFECT_DURATION_FAST 0.2 +#define COMP_EFFECT_DURATION_FAST 0.3 collections { diff --git a/packaging/e-mod-tizen-effect.spec b/packaging/e-mod-tizen-effect.spec index 11f800f..93b9f0d 100644 --- a/packaging/e-mod-tizen-effect.spec +++ b/packaging/e-mod-tizen-effect.spec @@ -27,7 +27,7 @@ as one module of enlightenment. %build export GC_SECTIONS_FLAGS="-fdata-sections -ffunction-sections -Wl,--gc-sections" -export CFLAGS+=" -Wall -g -fPIC -rdynamic ${GC_SECTIONS_FLAGS}" +export CFLAGS+=" -Wall -g -fPIC -rdynamic ${GC_SECTIONS_FLAGS} -DE_LOGGING=1" export LDFLAGS+=" -Wl,--hash-style=both -Wl,--as-needed -Wl,--rpath=/usr/lib" %autogen diff --git a/src/e_mod_effect.c b/src/e_mod_effect.c index 797a0d9..d733e1b 100644 --- a/src/e_mod_effect.c +++ b/src/e_mod_effect.c @@ -7,6 +7,7 @@ typedef struct _E_Effect_Client E_Client *ec; unsigned int animating; E_Comp_Wl_Buffer_Ref buffer_ref; + E_Pixmap *ep; } E_Effect_Client; static void @@ -43,9 +44,16 @@ _e_mod_effect_event_send(E_Client *ec, Eina_Bool start, E_Effect_Type type) tizen_effect_type = TIZEN_EFFECT_TYPE_RESTACK; break; default: + ERR("Unsupported effect type: %d for %p", type, ec); return; } + EFFINF("SEND %.5s|type:%d|win:0x%08x|tz_effect:0x%08x", + ec->pixmap, ec, + start? "START":"END", type, + (unsigned int)e_client_util_win_get(ec), + (unsigned int)effect_resource); + if (start) tizen_effect_send_start(effect_resource, surface_resource, tizen_effect_type); else @@ -60,6 +68,7 @@ _e_mod_effect_client_new(E_Client *ec) efc = E_NEW(E_Effect_Client, 1); efc->ec = ec; efc->animating = 0; + efc->ep = NULL; return efc; } @@ -76,47 +85,107 @@ _e_mod_effect_client_get(E_Client *ec) return efc; } -static void +static E_Effect_Group +_e_mod_effect_group_get(E_Client *ec) +{ + E_Effect_Group group = E_EFFECT_GROUP_NORMAL; + + /* client_type */ + switch (ec->client_type) + { + case 1: //homescreen + group = E_EFFECT_GROUP_HOME; + break; + case 2: //lockscreen + group = E_EFFECT_GROUP_LOCKSCREEN; + break; + default: + break; + } + + /* client layer */ + if (group == E_EFFECT_GROUP_NORMAL) + { + if (ec->layer > E_LAYER_CLIENT_NORMAL) + group = E_EFFECT_GROUP_NONE; + } + + /* window_role */ + + /* etc */ + if (ec->vkbd.vkbd) + group = E_EFFECT_GROUP_KEYBOARD; + + return group; +} + +static Eina_Bool _e_mod_effect_ref(E_Client *ec) { E_Effect_Client *efc; - if (!_effect) return; + if (!_effect) return EINA_FALSE; if (e_object_is_del(E_OBJECT(ec))) { + ERR("Client is deleted already! ec(%p)", ec); eina_hash_del_by_key(_effect->clients, &ec); - return; + return EINA_FALSE; } efc = _e_mod_effect_client_get(ec); - if (!efc) return; + if (!efc) return EINA_FALSE; + + if (!ec->pixmap) return EINA_FALSE; + if ((e_pixmap_type_get(ec->pixmap) != E_PIXMAP_TYPE_EXT_OBJECT) && + (!e_pixmap_usable_get(ec->pixmap))) + return EINA_FALSE; efc->animating ++; e_object_ref(E_OBJECT(ec)); + efc->ep = e_pixmap_ref(ec->pixmap); + + EFFINF("Effect ref efc(%p) animating:%d", + efc->ep, efc->ec, efc, efc->animating); + + return EINA_TRUE; } -static void +static E_Client * _e_mod_effect_unref(E_Client *ec) { E_Effect_Client *efc; + int do_unref = 1; - if (!_effect) return; + if (!_effect) return NULL; efc = _e_mod_effect_client_get(ec); - if (!efc) return; + if (!efc) return NULL; + + if (e_object_is_del(E_OBJECT(ec))) + do_unref = efc->animating; - while(efc->animating) + efc->animating -= do_unref; + while (do_unref) { + e_pixmap_free(efc->ep); if (!e_object_unref(E_OBJECT(ec))) { + EFFINF("Effect unref efc(%p) Client free'd", + efc->ep, ec, efc); + + efc->ec = NULL; efc = NULL; eina_hash_del_by_key(_effect->clients, &ec); - break; + return NULL; } - - efc->animating --; + do_unref --; } + + EFFINF("Effect Unref efc(%p) animating:%d", + ec->pixmap, ec, efc, efc->animating); + + return ec; } static void @@ -141,6 +210,42 @@ _e_mod_effect_object_setup(E_Client *ec) } static void +_e_mod_effect_pending_effect_start() +{ + E_Client *ec; + + ec = _effect->next_done.ec; + if (!ec) return; + + EFFINF("Pending Effect Start type(%d)", + ec->pixmap, ec, _effect->next_done.type); + + if (_effect->next_done.cb) + { + _e_mod_effect_event_send(ec, EINA_TRUE, _effect->next_done.type); + e_comp_object_effect_start(ec->frame, + _effect->next_done.cb, + _effect->next_done.data); + } + + memset(&_effect->next_done, 0, sizeof(_effect->next_done)); +} + +static void +_e_mod_effect_pending_effect_set(E_Client *ec, void *data, E_Effect_Type type, Edje_Signal_Cb done_cb) +{ + _e_mod_effect_pending_effect_start(); + + EFFINF("Pending Effect Set type(%d)", + ec->pixmap, ec, type); + + _effect->next_done.cb = done_cb; + _effect->next_done.ec = ec; + _effect->next_done.data = data; + _effect->next_done.type = type; +} + +static void _e_mod_effect_stack_update() { E_Client *ec; @@ -156,6 +261,7 @@ _e_mod_effect_stack_update() ec = evas_object_data_get(o, "E_Client"); if (!ec) continue; if (e_client_util_ignored_get(ec)) continue; + if (e_object_is_del(E_OBJECT(ec))) continue; _effect->stack.cur = eina_list_remove(_effect->stack.cur, ec); _effect->stack.cur = eina_list_append(_effect->stack.cur, ec); @@ -163,13 +269,14 @@ _e_mod_effect_stack_update() } static Eina_Bool -_e_mod_effect_visibility_check(E_Client *ec, Eina_List *stack) +_e_mod_effect_visibility_stack_check(E_Client *ec, Eina_List *stack) { Eina_List *l; E_Client *_ec; Eina_Tiler *tiler; Eina_Rectangle r; Eina_Bool vis = EINA_TRUE; + int x, y, w, h; if (!stack) return EINA_FALSE; @@ -181,9 +288,17 @@ _e_mod_effect_visibility_check(E_Client *ec, Eina_List *stack) EINA_LIST_FOREACH(stack, l, _ec) { if (_ec == ec) break; - if ((_ec->iconic) || (!_ec->visible) || (_ec->argb)) continue; + if (!_ec->visible) continue; + if (!evas_object_visible_get(_ec->frame)) + { + if (!_ec->iconic) continue; + if (_ec->iconic && _ec->exp_iconify.by_client) continue; + } + if (!e_pixmap_resource_get(_ec->pixmap)) continue; + + e_client_geometry_get(_ec, &x, &y, &w, &h); - EINA_RECTANGLE_SET(&r, _ec->x, _ec->y, _ec->w, _ec->h); + EINA_RECTANGLE_SET(&r, x, y, w, h); eina_tiler_rect_del(tiler, &r); if (eina_tiler_empty(tiler)) @@ -203,43 +318,81 @@ _e_mod_effect_restack_effect_check(E_Client *ec) const char* emission = NULL; Eina_Bool v1, v2; - if (!_effect) return NULL; - if (!ec->visible) return NULL; + if (!evas_object_visible_get(ec->frame)) return NULL; if (ec->new_client) return NULL; - v1 = _e_mod_effect_visibility_check(ec, _effect->stack.old); - v2 = _e_mod_effect_visibility_check(ec, _effect->stack.cur); + v1 = _e_mod_effect_visibility_stack_check(ec, _effect->stack.old); + v2 = _e_mod_effect_visibility_stack_check(ec, _effect->stack.cur); if (v1 != v2) { - if (v2) emission = "e,action,restack,show"; - else emission = "e,action,restack,hide"; + if (v2 && ec->visibility.obscured != E_VISIBILITY_UNOBSCURED) + emission = "e,action,restack,show"; + else if (!v2 && ec->visibility.obscured == E_VISIBILITY_FULLY_OBSCURED) + emission = "e,action,restack,hide"; } + EFFINF("Restack Effect Check v1(%d) -> v2(%d) obscured:%d emission:%s", + ec->pixmap, ec, + v1, v2, ec->visibility.obscured, emission); + return emission; } static void -_e_mod_effect_cb_visible_done(void *data, Evas_Object *obj, const char *sig, const char *src) +_e_mod_effect_cb_visible_done(void *data, Evas_Object *obj EINA_UNUSED, const char *sig EINA_UNUSED, const char *src EINA_UNUSED) { - E_Client *ec; - ec = (E_Client*) data; + E_Client *ec = NULL; + + if ((ec = (E_Client*) data)) + { + _e_mod_effect_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_SHOW); + if (_e_mod_effect_unref(ec)) + { + if (_e_mod_effect_client_get(ec)) + { + if (!eina_list_data_find(_effect->stack.cur, ec)) + _e_mod_effect_stack_update(); - _e_mod_effect_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_SHOW); - _e_mod_effect_unref(ec); + e_client_visibility_skip_set(ec, EINA_FALSE); + } + } + } + + e_comp_override_del(); } static Eina_Bool _e_mod_effect_cb_visible(void *data, Evas_Object *obj, const char *signal) { E_Client *ec; + E_Effect_Group group; + + if (!_effect) return EINA_FALSE; + ec = e_comp_object_client_get(obj); + if (!ec) return EINA_FALSE; + if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE; + + group = _e_mod_effect_group_get(ec); + if (group != E_EFFECT_GROUP_NORMAL) return EINA_FALSE; if (evas_object_visible_get(obj)) return EINA_FALSE; + if (!_e_mod_effect_ref(ec)) return EINA_FALSE; + + e_comp_override_add(); + e_client_visibility_skip_set(ec, EINA_TRUE); - _e_mod_effect_ref(ec); _e_mod_effect_object_setup(ec); e_comp_object_effect_params_set(ec->frame, 0, (int[]){0}, 1); + if (e_comp->nocomp) + { + _e_mod_effect_pending_effect_set(ec, + (void*)ec, + E_EFFECT_TYPE_SHOW, + _e_mod_effect_cb_visible_done); + return EINA_TRUE; + } _e_mod_effect_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_SHOW); e_comp_object_effect_start(ec->frame, _e_mod_effect_cb_visible_done, ec); @@ -250,29 +403,77 @@ _e_mod_effect_cb_visible(void *data, Evas_Object *obj, const char *signal) 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; + E_Client *ec = NULL; - _e_mod_effect_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_HIDE); - _e_mod_effect_unref(ec); - if (_e_mod_effect_client_get(ec)) - evas_object_hide(ec->frame); + if ((ec = (E_Client*) data)) + { + _e_mod_effect_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_HIDE); + if (_e_mod_effect_unref(ec)) + { + if (_e_mod_effect_client_get(ec)) + { + evas_object_layer_set(ec->frame, ec->layer); + ec->layer_block = 0; + e_client_visibility_skip_set(ec, EINA_FALSE); + evas_object_hide(ec->frame); + } + } + } + + e_comp_override_del(); } static Eina_Bool _e_mod_effect_cb_hidden(void *data, Evas_Object *obj, const char *signal) { E_Client *ec; + E_Effect_Group group; + Eina_Bool lowered = 0; + Evas_Object *below; + int map_layer; + + if (!_effect) return EINA_FALSE; + ec = e_comp_object_client_get(obj); + if (!ec) return EINA_FALSE; + if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE; + + group = _e_mod_effect_group_get(ec); + if (group != E_EFFECT_GROUP_NORMAL) return EINA_FALSE; if (!evas_object_visible_get(obj)) return EINA_FALSE; + if (!_e_mod_effect_ref(ec)) return EINA_FALSE; + + e_comp_override_add(); + + //check if client was lowered + below = evas_object_below_get(obj); + map_layer = e_comp_canvas_layer_map(evas_object_layer_get(obj)); + if ((below) && + (evas_object_layer_get(below) != evas_object_layer_get(obj)) && + (evas_object_above_get(obj) != e_comp->layers[map_layer].obj)) + lowered = 1; - _e_mod_effect_ref(ec); + if (lowered) + { + ec->layer_block = 1; + evas_object_layer_set(ec->frame, ec->layer + 1); + e_client_visibility_skip_set(ec, EINA_TRUE); + } _e_mod_effect_object_setup(ec); e_comp_object_effect_params_set(ec->frame, 0, (int[]){1}, 1); + if (e_comp->nocomp) + { + _e_mod_effect_pending_effect_set(ec, + (void*)ec, + E_EFFECT_TYPE_HIDE, + _e_mod_effect_cb_hidden_done); + return EINA_TRUE; + } + _e_mod_effect_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_HIDE); e_comp_object_effect_start(ec->frame, _e_mod_effect_cb_hidden_done, ec); @@ -280,72 +481,324 @@ _e_mod_effect_cb_hidden(void *data, Evas_Object *obj, const char *signal) } static void -_e_mod_effect_cb_restack_show_done(void *data, Evas_Object *obj, const char *sig, const char *src) +_e_mod_effect_cb_uniconify_done(void *data, Evas_Object *obj, const char *sig, const char *src) +{ + E_Client *ec = NULL; + + if ((ec = (E_Client*) data)) + { + _e_mod_effect_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_SHOW); + _e_mod_effect_unref(ec); + } + + e_comp_override_del(); +} + +static Eina_Bool +_e_mod_effect_cb_uniconify(void *data, Evas_Object *obj, const char *signal) { E_Client *ec; - ec = (E_Client*)data; + E_Effect_Group group; + Eina_Bool v1, v2; - _e_mod_effect_unref(ec); - evas_object_layer_set(ec->frame, ec->layer); - ec->layer_block = 0; - _e_mod_effect_stack_update(); + if (!_effect) return EINA_FALSE; + + ec = e_comp_object_client_get(obj); + if (!ec) return EINA_FALSE; + if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE; + + if (evas_object_visible_get(obj)) return EINA_FALSE; + + group = _e_mod_effect_group_get(ec); + + /* for HOME group */ + if (group == E_EFFECT_GROUP_HOME) + { + E_Client *below; + below = e_client_below_get(ec); + while (below) + { + if ((evas_object_visible_get(below->frame)) && + (below->layer == ec->layer) && + ((below->visibility.obscured == E_VISIBILITY_UNOBSCURED) || + (below->visibility.changed))) + break; + + below = e_client_below_get(below); + } + + if (!below) return EINA_FALSE; + group = _e_mod_effect_group_get(below); + if (group != E_EFFECT_GROUP_NORMAL) return EINA_FALSE; + + EFFINF("for HOME group do hide effect of %p", + ec->pixmap, ec, below); + e_comp_object_signal_emit(below->frame, "e,action,restack,hide", "e"); + return EINA_TRUE; + } + /* for NORMAL group */ + else if (group == E_EFFECT_GROUP_NORMAL) + { + v1 = _e_mod_effect_visibility_stack_check(ec, _effect->stack.old); + v2 = _e_mod_effect_visibility_stack_check(ec, _effect->stack.cur); + + if (v1 == v2) return EINA_FALSE; + if ((v2) && (ec->visibility.obscured == E_VISIBILITY_UNOBSCURED)) return EINA_FALSE; + if ((!v2) && (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED)) return EINA_FALSE; + + if (!_e_mod_effect_ref(ec)) return EINA_FALSE; + + e_comp_override_add(); + + _e_mod_effect_object_setup(ec); + e_comp_object_effect_params_set(ec->frame, 0, (int[]){0}, 1); + + if (e_comp->nocomp) + { + _e_mod_effect_pending_effect_set(ec, + (void*)ec, + E_EFFECT_TYPE_SHOW, + _e_mod_effect_cb_uniconify_done); + return EINA_TRUE; + } + + _e_mod_effect_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_SHOW); + e_comp_object_effect_start(ec->frame, _e_mod_effect_cb_uniconify_done, ec); + return EINA_TRUE; + } + + return EINA_FALSE; +} + +static void +_e_mod_effect_cb_iconify_done(void *data, Evas_Object *obj, const char *sig, const char *src) +{ + E_Client *ec = NULL; + + if ((ec = (E_Client*) data)) + { + _e_mod_effect_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_HIDE); + if (_e_mod_effect_unref(ec)) + { + if (_e_mod_effect_client_get(ec)) + evas_object_hide(ec->frame); + } + } + + e_comp_override_del(); +} + +static Eina_Bool +_e_mod_effect_cb_iconify(void *data, Evas_Object *obj, const char *signal) +{ + E_Client *ec; + E_Effect_Group group; + + if (!_effect) return EINA_FALSE; + + ec = e_comp_object_client_get(obj); + if (!ec) return EINA_FALSE; + if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE; + + group = _e_mod_effect_group_get(ec); + if (group != E_EFFECT_GROUP_NORMAL) return EINA_FALSE; + + if (!evas_object_visible_get(obj)) return EINA_FALSE; + if (!_e_mod_effect_visibility_stack_check(ec, _effect->stack.cur)) return EINA_FALSE; + if (!_e_mod_effect_ref(ec)) return EINA_FALSE; + + e_comp_override_add(); + + _e_mod_effect_object_setup(ec); + e_comp_object_effect_params_set(ec->frame, 0, (int[]){1}, 1); + + if (e_comp->nocomp) + { + _e_mod_effect_pending_effect_set(ec, + (void*)ec, + E_EFFECT_TYPE_HIDE, + _e_mod_effect_cb_iconify_done); + return EINA_TRUE; + } + + _e_mod_effect_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_HIDE); + e_comp_object_effect_start(ec->frame, _e_mod_effect_cb_iconify_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 = NULL; + + if ((ec = (E_Client*)data)) + { + if (_e_mod_effect_unref(ec)) + { + if (_e_mod_effect_client_get(ec)) + { + evas_object_layer_set(ec->frame, ec->layer); + ec->layer_block = 0; + e_client_visibility_skip_set(ec, EINA_FALSE); + _e_mod_effect_stack_update(); + } + } + } + + e_comp_override_del(); } 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; + E_Client *ec = NULL; - _e_mod_effect_unref(ec); - evas_object_layer_set(ec->frame, ec->layer); - ec->layer_block = 0; - _e_mod_effect_stack_update(); + if ((ec = (E_Client*)data)) + { + if (_e_mod_effect_unref(ec)) + { + if (_e_mod_effect_client_get(ec)) + { + evas_object_layer_set(ec->frame, ec->layer); + ec->layer_block = 0; + e_client_visibility_skip_set(ec, EINA_FALSE); + _e_mod_effect_stack_update(); + + e_comp_object_signal_emit(ec->frame, + "e,action,restack,finish", "e"); + } + } + } - e_comp_object_signal_emit(ec->frame, "e,action,restack,finish", "e"); + e_comp_override_del(); } static void _e_mod_effect_cb_restack_finish_done(void *data, Evas_Object *obj, const char *sig, const char *src) { - E_Client *ec = data; - ec = (E_Client*)data; + E_Client *ec = NULL; - _e_mod_effect_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_RESTACK_SHOW); - _e_mod_effect_unref(ec); + if ((ec = (E_Client*)data)) + { + _e_mod_effect_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_RESTACK_HIDE); + _e_mod_effect_unref(ec); + } + + e_comp_override_del(); } static Eina_Bool _e_mod_effect_cb_restack(void *data, Evas_Object *obj, const char *signal) { E_Client *ec; + E_Effect_Group group; + const char *emission; + + if (!_effect) return EINA_FALSE; + ec = e_comp_object_client_get(obj); + if (!ec) return EINA_FALSE; + if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE; - _e_mod_effect_object_setup(ec); - if ((!e_util_strcmp(signal, "e,action,restack,show"))) + group = _e_mod_effect_group_get(ec); + emission = eina_stringshare_add(signal); + + /* for HOME group: replace effect target client */ + if (group == E_EFFECT_GROUP_HOME) { - _e_mod_effect_ref(ec); + E_Client *below; + + below = e_client_below_get(ec); + while (below) + { + if ((!e_object_is_del(E_OBJECT(below))) && + (evas_object_visible_get(below->frame)) && + (below->visibility.obscured == E_VISIBILITY_UNOBSCURED) && + (below->layer == ec->layer)) + break; + + below = e_client_below_get(below); + } + + if (!below) return EINA_FALSE; + if (e_util_strcmp(signal, "e,action,restack,show")) return EINA_FALSE; + + ec = below; + group = _e_mod_effect_group_get(ec); + + if (emission) eina_stringshare_del(emission); + emission = eina_stringshare_add("e,action,restack,hide"); + } + + if (group != E_EFFECT_GROUP_NORMAL) return EINA_FALSE; + if ((!e_util_strcmp(emission, "e,action,restack,show"))) + { + if (!_e_mod_effect_ref(ec)) return EINA_FALSE; + + e_comp_override_add(); + ec->layer_block = 1; - evas_object_layer_set(ec->frame, E_LAYER_CLIENT_PRIO); + evas_object_layer_set(ec->frame, ec->layer + 1); + e_client_visibility_skip_set(ec, EINA_TRUE); + + _e_mod_effect_object_setup(ec); e_comp_object_effect_params_set(ec->frame, 0, (int[]){2}, 1); + if (e_comp->nocomp) + { + _e_mod_effect_pending_effect_set(ec, + (void*)ec, + E_EFFECT_TYPE_SHOW, + _e_mod_effect_cb_restack_show_done); + return EINA_TRUE; + } + _e_mod_effect_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_RESTACK_SHOW); 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")) + else if (!e_util_strcmp(emission, "e,action,restack,hide")) { - _e_mod_effect_ref(ec); + if (!_e_mod_effect_ref(ec)) return EINA_FALSE; + + e_comp_override_add(); + ec->layer_block = 1; - evas_object_layer_set(ec->frame, E_LAYER_CLIENT_PRIO); + evas_object_layer_set(ec->frame, ec->layer + 1); + e_client_visibility_skip_set(ec, EINA_TRUE); + + _e_mod_effect_object_setup(ec); e_comp_object_effect_params_set(ec->frame, 0, (int[]){3}, 1); + if (e_comp->nocomp) + { + _e_mod_effect_pending_effect_set(ec, + (void*)ec, + E_EFFECT_TYPE_HIDE, + _e_mod_effect_cb_restack_hide_done); + return EINA_TRUE; + } + _e_mod_effect_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_RESTACK_HIDE); 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")) + else if (!e_util_strcmp(emission, "e,action,restack,finish")) { - _e_mod_effect_ref(ec); + if (!_e_mod_effect_ref(ec)) return EINA_FALSE; + + e_comp_override_add(); + + _e_mod_effect_object_setup(ec); e_comp_object_effect_params_set(ec->frame, 0, (int[]){4}, 1); + + if (e_comp->nocomp) + { + _e_mod_effect_pending_effect_set(ec, + (void*)ec, + E_EFFECT_TYPE_HIDE, + _e_mod_effect_cb_restack_finish_done); + return EINA_TRUE; + } + e_comp_object_effect_start(ec->frame, _e_mod_effect_cb_restack_finish_done, ec); } @@ -383,9 +836,13 @@ _e_mod_effect_cb_client_remove(void *data, int type, void *event) if (!_effect) return ECORE_CALLBACK_PASS_ON; ec = ev->ec; + _effect->stack.old = eina_list_remove(_effect->stack.old, ec); _effect->stack.cur = eina_list_remove(_effect->stack.cur, ec); + if (_effect->next_done.ec == ec) + memset(&_effect->next_done, 0, sizeof(_effect->next_done)); + if ((efc = _e_mod_effect_client_get(ec))) { if (!efc->animating) @@ -402,8 +859,14 @@ _e_mod_effect_cb_client_restack(void *data, int type, void *event) E_Event_Client *ev = event; const char* emission = NULL; + if (!_effect) return ECORE_CALLBACK_PASS_ON; + ec = ev->ec; + if (!ec) return ECORE_CALLBACK_PASS_ON; + if (e_object_is_del(E_OBJECT(ec))) return ECORE_CALLBACK_PASS_ON; + _e_mod_effect_stack_update(); + if ((emission = _e_mod_effect_restack_effect_check(ec))) e_comp_object_signal_emit(ec->frame, emission, "e"); @@ -411,6 +874,16 @@ _e_mod_effect_cb_client_restack(void *data, int type, void *event) } static Eina_Bool +_e_mod_effect_cb_comp_enabled(void *data, int ev_type, void *event) +{ + if (!_effect) return ECORE_CALLBACK_PASS_ON; + + _e_mod_effect_pending_effect_start(); + + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool _e_mod_effect_cb_client_buffer_change(void *data, int ev_type, void *event) { E_Event_Client *ev = event; @@ -418,6 +891,8 @@ _e_mod_effect_cb_client_buffer_change(void *data, int ev_type, void *event) E_Effect_Client *efc; E_Comp_Wl_Buffer *buffer = NULL; + if (!_effect) return ECORE_CALLBACK_PASS_ON; + ec = ev->ec; if (!ec) return ECORE_CALLBACK_PASS_ON; @@ -481,10 +956,12 @@ _e_mod_effect_cb_client_data_free(void *data) { E_Effect_Client *efc = data; + if (!efc) return; + if (efc->buffer_ref.buffer) e_comp_wl_buffer_reference(&efc->buffer_ref, NULL); - free(data); + free(efc); } EAPI Eina_Bool @@ -525,6 +1002,9 @@ e_mod_effect_init(void) goto err; } + E_LIST_HANDLER_APPEND(effect->event_hdlrs, E_EVENT_COMPOSITOR_ENABLE, + _e_mod_effect_cb_comp_enabled, effect); + E_LIST_HANDLER_APPEND(effect->event_hdlrs, E_EVENT_CLIENT_BUFFER_CHANGE, _e_mod_effect_cb_client_buffer_change, effect); @@ -553,13 +1033,13 @@ e_mod_effect_init(void) eina_list_append(effect->providers, e_comp_object_effect_mover_add(100, "e,action,iconify", - _e_mod_effect_cb_hidden, + _e_mod_effect_cb_iconify, effect)); effect->providers = eina_list_append(effect->providers, e_comp_object_effect_mover_add(100, "e,action,uniconify", - _e_mod_effect_cb_visible, + _e_mod_effect_cb_uniconify, effect)); effect->providers = eina_list_append(effect->providers, diff --git a/src/e_mod_effect.h b/src/e_mod_effect.h index a312d7b..df08b94 100644 --- a/src/e_mod_effect.h +++ b/src/e_mod_effect.h @@ -1,12 +1,28 @@ #ifndef E_MOD_EFFECT_H # define E_MOD_EFFECT_H -# include "config.h" # include # include +#define EFFINF(f, cp, ec, x...) ELOGF("EFFECT", f, cp, ec, ##x) +#define EFFDBG(f, cp, ec, x...) \ + do \ + { \ + if ((!cp) && (!ec)) \ + DBG("EWL|%20.20s| | |"f, \ + "EFFECT", ##x); \ + else \ + DBG("EWL|%20.20s|cp:0x%08x|ec:0x%08x|"f, \ + "EFFECT", \ + (unsigned int)(cp), \ + (unsigned int)(ec), \ + ##x); \ + } \ + while (0) + typedef struct _E_Effect E_Effect; typedef enum _E_Effect_Type E_Effect_Type; +typedef enum _E_Effect_Group E_Effect_Group; enum _E_Effect_Type { @@ -19,6 +35,15 @@ enum _E_Effect_Type E_EFFECT_TYPE_NONE, }; +enum _E_Effect_Group +{ + E_EFFECT_GROUP_NORMAL, + E_EFFECT_GROUP_HOME, + E_EFFECT_GROUP_LOCKSCREEN, + E_EFFECT_GROUP_KEYBOARD, + E_EFFECT_GROUP_NONE, +}; + struct _E_Effect { struct wl_global *global; @@ -36,6 +61,13 @@ struct _E_Effect Eina_List *cur; } stack; + struct { + Edje_Signal_Cb cb; + E_Client *ec; + void *data; + E_Effect_Type type; + } next_done; + }; EAPI Eina_Bool e_mod_effect_init(void); -- 2.7.4 From d2845569a7cc4508302b2c2b4b001f96c834229b Mon Sep 17 00:00:00 2001 From: MinJeong Kim Date: Thu, 16 Jun 2016 13:45:32 +0900 Subject: [PATCH 16/16] Added layer object for running effect, more stack checking and logging Change-Id: I02379a0e9255d8824514c8a1ca4eaef0c154d370 Signed-off-by: MinJeong Kim --- src/e_mod_effect.c | 115 +++++++++++++++++++++++++++++++++++++++++------------ src/e_mod_effect.h | 4 ++ 2 files changed, 94 insertions(+), 25 deletions(-) diff --git a/src/e_mod_effect.c b/src/e_mod_effect.c index d733e1b..221a481 100644 --- a/src/e_mod_effect.c +++ b/src/e_mod_effect.c @@ -210,6 +210,30 @@ _e_mod_effect_object_setup(E_Client *ec) } static void +_e_mod_effect_object_layer_up(E_Client *ec) +{ + int map_layer; + + map_layer = e_comp_canvas_client_layer_map(ec->layer); + if (!_effect->layers[map_layer].obj) + { + _effect->layers[map_layer].obj = evas_object_rectangle_add(e_comp->evas); + evas_object_layer_set(_effect->layers[map_layer].obj, ec->layer + 1); + evas_object_name_set(_effect->layers[map_layer].obj, "layer_obj(effect)"); + } + + ec->layer_block = 1; + evas_object_layer_set(ec->frame, ec->layer + 1); +} + +static void +_e_mod_effect_object_layer_down(E_Client *ec) +{ + evas_object_layer_set(ec->frame, ec->layer); + ec->layer_block = 0; +} + +static void _e_mod_effect_pending_effect_start() { E_Client *ec; @@ -326,15 +350,33 @@ _e_mod_effect_restack_effect_check(E_Client *ec) if (v1 != v2) { - if (v2 && ec->visibility.obscured != E_VISIBILITY_UNOBSCURED) + if ((v2) && (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED)) emission = "e,action,restack,show"; - else if (!v2 && ec->visibility.obscured == E_VISIBILITY_FULLY_OBSCURED) + else if ((!v2) && (ec->visibility.obscured == E_VISIBILITY_UNOBSCURED)) emission = "e,action,restack,hide"; } + else + { + E_Effect_Client *efc; + efc = _e_mod_effect_client_get(ec); - EFFINF("Restack Effect Check v1(%d) -> v2(%d) obscured:%d emission:%s", + // TODO : it's for transients windows. wish using other check */ + if ((efc) && (!efc->animating)) + { + if ((v2) && (!ec->iconic) && + (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED)) + emission = "e,action,restack,show"; + else if ((!v2) && (ec->iconic) && + (ec->visibility.obscured == E_VISIBILITY_UNOBSCURED)) + emission = "e,action,restack,hide"; + } + } + + EFFINF("Restack Effect Check v1(%d) -> v2(%d) iconic:%d " + "obscured:%d(%d) emission:%s", ec->pixmap, ec, - v1, v2, ec->visibility.obscured, emission); + v1, v2, ec->iconic, + ec->visibility.obscured, ec->visibility.changed, emission); return emission; } @@ -351,14 +393,12 @@ _e_mod_effect_cb_visible_done(void *data, Evas_Object *obj EINA_UNUSED, const ch { if (_e_mod_effect_client_get(ec)) { - if (!eina_list_data_find(_effect->stack.cur, ec)) - _e_mod_effect_stack_update(); - e_client_visibility_skip_set(ec, EINA_FALSE); } } } + _e_mod_effect_stack_update(); e_comp_override_del(); } @@ -413,8 +453,7 @@ _e_mod_effect_cb_hidden_done(void *data, Evas_Object *obj, const char *sig, cons { if (_e_mod_effect_client_get(ec)) { - evas_object_layer_set(ec->frame, ec->layer); - ec->layer_block = 0; + _e_mod_effect_object_layer_down(ec); e_client_visibility_skip_set(ec, EINA_FALSE); evas_object_hide(ec->frame); } @@ -457,8 +496,7 @@ _e_mod_effect_cb_hidden(void *data, Evas_Object *obj, const char *signal) if (lowered) { - ec->layer_block = 1; - evas_object_layer_set(ec->frame, ec->layer + 1); + _e_mod_effect_object_layer_up(ec); e_client_visibility_skip_set(ec, EINA_TRUE); } @@ -515,6 +553,18 @@ _e_mod_effect_cb_uniconify(void *data, Evas_Object *obj, const char *signal) if (group == E_EFFECT_GROUP_HOME) { E_Client *below; + + v1 = _e_mod_effect_visibility_stack_check(ec, _effect->stack.old); + v2 = _e_mod_effect_visibility_stack_check(ec, _effect->stack.cur); + + EFFINF("Uniconify Effect Check v1(%d) -> v2(%d) obscured:%d changed:%d", + ec->pixmap, ec, + v1, v2, ec->visibility.obscured, ec->visibility.changed); + + if (v1 == v2) return EINA_FALSE; + if ((v2) && (ec->visibility.obscured == E_VISIBILITY_UNOBSCURED)) return EINA_FALSE; + if ((!v2) && (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED)) return EINA_FALSE; + below = e_client_below_get(ec); while (below) { @@ -531,8 +581,9 @@ _e_mod_effect_cb_uniconify(void *data, Evas_Object *obj, const char *signal) group = _e_mod_effect_group_get(below); if (group != E_EFFECT_GROUP_NORMAL) return EINA_FALSE; - EFFINF("for HOME group do hide effect of %p", + EFFINF("Uniconify HOME group do hide effect of %p", ec->pixmap, ec, below); + e_comp_object_signal_emit(below->frame, "e,action,restack,hide", "e"); return EINA_TRUE; } @@ -542,6 +593,10 @@ _e_mod_effect_cb_uniconify(void *data, Evas_Object *obj, const char *signal) v1 = _e_mod_effect_visibility_stack_check(ec, _effect->stack.old); v2 = _e_mod_effect_visibility_stack_check(ec, _effect->stack.cur); + EFFINF("Uniconify Effect Check v1(%d) -> v2(%d) obscured:%d changed:%d", + ec->pixmap, ec, + v1, v2, ec->visibility.obscured, ec->visibility.changed); + if (v1 == v2) return EINA_FALSE; if ((v2) && (ec->visibility.obscured == E_VISIBILITY_UNOBSCURED)) return EINA_FALSE; if ((!v2) && (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED)) return EINA_FALSE; @@ -593,6 +648,7 @@ _e_mod_effect_cb_iconify(void *data, Evas_Object *obj, const char *signal) { E_Client *ec; E_Effect_Group group; + Eina_Bool v1, v2; if (!_effect) return EINA_FALSE; @@ -604,7 +660,18 @@ _e_mod_effect_cb_iconify(void *data, Evas_Object *obj, const char *signal) if (group != E_EFFECT_GROUP_NORMAL) return EINA_FALSE; if (!evas_object_visible_get(obj)) return EINA_FALSE; - if (!_e_mod_effect_visibility_stack_check(ec, _effect->stack.cur)) return EINA_FALSE; + + v1 = _e_mod_effect_visibility_stack_check(ec, _effect->stack.old); + v2 = _e_mod_effect_visibility_stack_check(ec, _effect->stack.cur); + + EFFINF("Iconify Effect Check v1(%d) -> v2(%d) obscured:%d changed:%d", + ec->pixmap, ec, + v1, v2, ec->visibility.obscured, ec->visibility.changed); + + if (v1 == v2) return EINA_FALSE; + if ((v2) && (ec->visibility.obscured == E_VISIBILITY_UNOBSCURED)) return EINA_FALSE; + if ((!v2) && (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED)) return EINA_FALSE; + if (!_e_mod_effect_ref(ec)) return EINA_FALSE; e_comp_override_add(); @@ -637,14 +704,13 @@ _e_mod_effect_cb_restack_show_done(void *data, Evas_Object *obj, const char *sig { if (_e_mod_effect_client_get(ec)) { - evas_object_layer_set(ec->frame, ec->layer); - ec->layer_block = 0; + _e_mod_effect_object_layer_down(ec); e_client_visibility_skip_set(ec, EINA_FALSE); - _e_mod_effect_stack_update(); } } } + _e_mod_effect_stack_update(); e_comp_override_del(); } @@ -659,17 +725,15 @@ _e_mod_effect_cb_restack_hide_done(void *data, Evas_Object *obj, const char *sig { if (_e_mod_effect_client_get(ec)) { - evas_object_layer_set(ec->frame, ec->layer); - ec->layer_block = 0; + _e_mod_effect_object_layer_down(ec); e_client_visibility_skip_set(ec, EINA_FALSE); - _e_mod_effect_stack_update(); - e_comp_object_signal_emit(ec->frame, "e,action,restack,finish", "e"); } } } + _e_mod_effect_stack_update(); e_comp_override_del(); } @@ -683,7 +747,6 @@ _e_mod_effect_cb_restack_finish_done(void *data, Evas_Object *obj, const char *s _e_mod_effect_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_RESTACK_HIDE); _e_mod_effect_unref(ec); } - e_comp_override_del(); } @@ -737,8 +800,7 @@ _e_mod_effect_cb_restack(void *data, Evas_Object *obj, const char *signal) e_comp_override_add(); - ec->layer_block = 1; - evas_object_layer_set(ec->frame, ec->layer + 1); + _e_mod_effect_object_layer_up(ec); e_client_visibility_skip_set(ec, EINA_TRUE); _e_mod_effect_object_setup(ec); @@ -762,8 +824,7 @@ _e_mod_effect_cb_restack(void *data, Evas_Object *obj, const char *signal) e_comp_override_add(); - ec->layer_block = 1; - evas_object_layer_set(ec->frame, ec->layer + 1); + _e_mod_effect_object_layer_up(ec); e_client_visibility_skip_set(ec, EINA_TRUE); _e_mod_effect_object_setup(ec); @@ -865,8 +926,12 @@ _e_mod_effect_cb_client_restack(void *data, int type, void *event) if (!ec) return ECORE_CALLBACK_PASS_ON; if (e_object_is_del(E_OBJECT(ec))) return ECORE_CALLBACK_PASS_ON; + EFFINF("Client restacked", ec->pixmap, ec); + _e_mod_effect_stack_update(); + if (!_e_mod_effect_client_get(ec)) return ECORE_CALLBACK_PASS_ON; + if ((emission = _e_mod_effect_restack_effect_check(ec))) e_comp_object_signal_emit(ec->frame, emission, "e"); diff --git a/src/e_mod_effect.h b/src/e_mod_effect.h index df08b94..3778af3 100644 --- a/src/e_mod_effect.h +++ b/src/e_mod_effect.h @@ -57,6 +57,10 @@ struct _E_Effect Eina_Hash *clients; struct { + Evas_Object *obj; + }layers[E_CLIENT_LAYER_COUNT]; + + struct { Eina_List *old; Eina_List *cur; } stack; -- 2.7.4