1 #include "e_mod_effect.h"
4 static E_Effect *_eff = NULL;
6 typedef struct _E_Effect_Client
9 unsigned int animating;
10 unsigned int delay_del_ref;
11 E_Comp_Wl_Buffer_Ref buffer_ref;
16 unsigned int under_ref;
18 unsigned int bg_animating;
28 _eff_object_underlayer_sort(const void *data1, const void *data2)
30 const Under_Layer *layer1, *layer2;
35 if (layer1->zpos < layer2->zpos)
37 else if (layer1->zpos > layer2->zpos)
44 _eff_object_underlayer_get(E_Client *ec)
46 Evas_Object *underlay = NULL;
47 E_Comp_Screen *e_comp_screen;
51 e_comp_screen = e_comp->e_comp_screen;
55 if (e_client_video_client_has(ec))
57 if ((!_eff->under_layers) && (!_eff->under_checked))
59 tdm_layer_capability capabilities;
62 const Eina_List *planes, *l;
64 if (!ec->zone) return NULL;
66 eoutput = e_output_find(ec->zone->output_id);
67 if (eoutput) return NULL;
69 planes = e_output_planes_get(eoutput);
70 if (!planes) return NULL;
72 /* Find a plane which is placed under primary and used for video.
73 * planes is supposed to be sorted by zpos (lower -> higher) */
74 EINA_LIST_FOREACH(planes, l, plane)
76 if (e_plane_is_primary(plane))
82 tdm_layer_get_capabilities(plane->tlayer, &capabilities);
83 if (!(capabilities & TDM_LAYER_CAPABILITY_GRAPHIC)) continue;
85 ulayer = E_NEW(Under_Layer, 1);
86 if (!ulayer) continue;
87 ulayer->zpos = plane->zpos;
88 ulayer->tlayer = plane->tlayer;
90 _eff->under_layers = eina_list_append(_eff->under_layers,
94 _eff->under_checked = EINA_TRUE;
96 if (!_eff->under_layers)
99 _eff->under_layers = eina_list_sort(_eff->under_layers,
100 eina_list_count(_eff->under_layers),
101 _eff_object_underlayer_sort);
104 if (!_eff->under_layers) return NULL;
106 EINA_LIST_FOREACH(_eff->under_layers, l, ulayer)
110 tbm_surface_h buffer;
111 Evas_Native_Surface ns;
113 tdm_error err = TDM_ERROR_NONE;
115 layer = ulayer->tlayer;
117 buffer = tdm_layer_get_displaying_buffer(layer, NULL);
118 if (!buffer) continue;
120 err = tdm_layer_get_info(layer, &info);
121 if (err != TDM_ERROR_NONE) continue;
123 if (info.dst_pos.w <= 0 || info.dst_pos.h <= 0)
126 img = evas_object_image_filled_add(e_comp->evas);
129 memset(&ns, 0, sizeof(Evas_Native_Surface));
130 ns.version = EVAS_NATIVE_SURFACE_VERSION;
131 ns.type = EVAS_NATIVE_SURFACE_TBM;
132 ns.data.tbm.buffer = buffer;
134 evas_object_image_size_set(img, info.dst_pos.w, info.dst_pos.h);
135 evas_object_image_native_surface_set(img, &ns);
136 evas_object_image_pixels_dirty_set(img, EINA_TRUE);
142 underlay = e_layout_add(e_comp->evas);
145 evas_object_del(img);
149 evas_object_name_set(underlay, "effect-under-layout");
150 e_layout_virtual_size_set(underlay, ec->zone->w, ec->zone->h);
151 evas_object_move(underlay, ec->zone->x, ec->zone->y);
153 bg = evas_object_rectangle_add(e_comp->evas);
154 evas_object_color_set(bg, 0, 0, 0, 255);
155 e_layout_pack(underlay, bg);
156 e_layout_child_move(bg, 0, 0);
157 e_layout_child_resize(bg, ec->zone->w, ec->zone->h);
158 evas_object_show(bg);
161 e_layout_pack(underlay, img);
162 e_layout_child_move(img, info.dst_pos.x, info.dst_pos.y);
163 e_layout_child_resize(img, info.dst_pos.w, info.dst_pos.h);
164 e_layout_child_raise(img);
165 evas_object_show(img);
167 EFFDBG("Video Object Created img(%p) %d,%d %dx%d underlay(%p)",
169 img, info.dst_pos.x, info.dst_pos.y, info.dst_pos.w, info.dst_pos.h,
178 _eff_event_send(E_Client *ec, Eina_Bool start, E_Effect_Type type)
180 struct wl_resource *res_surf;
181 struct wl_resource *res_eff;
182 struct wl_client *wc;
183 unsigned int tizen_effect_type = TIZEN_EFFECT_TYPE_NONE;
186 if ((!ec) || (!ec->comp_data)) return;
187 if (e_object_is_del(E_OBJECT(ec))) return;
189 res_surf = ec->comp_data->surface;
190 if (!res_surf) return;
192 wc = wl_resource_get_client(res_surf);
195 res_eff = eina_hash_find(_eff->resources, &wc);
196 if (!res_eff) return;
200 case E_EFFECT_TYPE_SHOW:
201 tizen_effect_type = TIZEN_EFFECT_TYPE_SHOW;
203 case E_EFFECT_TYPE_HIDE:
204 tizen_effect_type = TIZEN_EFFECT_TYPE_HIDE;
206 case E_EFFECT_TYPE_RESTACK_SHOW:
207 case E_EFFECT_TYPE_RESTACK_HIDE:
208 tizen_effect_type = TIZEN_EFFECT_TYPE_RESTACK;
211 ERR("Unsupported effect type: %d for %p", type, ec);
215 EFFINF("SEND %.5s|type:%d|win:0x%08x|tz_effect:0x%08x",
217 start ? "START" : "END", type,
218 (unsigned int)e_client_util_win_get(ec),
219 (unsigned int)res_eff);
222 tizen_effect_send_start(res_eff, res_surf, tizen_effect_type);
225 tizen_effect_send_end(res_eff, res_surf, tizen_effect_type);
227 EFFINF("Un-SET EXTRA_ANIMATING...", ec);
228 ec->extra_animating = EINA_FALSE;
229 if (ec->launching == EINA_TRUE)
231 ELOGF("COMP", "Un-Set launching flag..", ec);
232 ec->launching = EINA_FALSE;
233 if (ec->first_mapped)
235 ELOGF("LAUNCH", "SHOW real win", ec);
236 e_comp_object_signal_emit(ec->frame, "e,action,launch_real,done", "e");
238 e_comp_object_signal_emit(ec->frame, "e,action,launch,done", "e");
243 static E_Effect_Client*
244 _eff_client_new(E_Client *ec)
246 E_Effect_Client *efc;
248 efc = E_NEW(E_Effect_Client, 1);
249 if (!efc) return NULL;
252 efc->delay_del_ref = 0;
260 static E_Effect_Client *
261 _eff_client_get(E_Client *ec)
263 if (!_eff) return NULL;
264 return eina_hash_find(_eff->clients, &ec);
267 static E_Effect_Group
268 _eff_group_get(E_Client *ec)
270 E_Effect_Group group = E_EFFECT_GROUP_NORMAL;
272 /* animatable setting by aux_hint */
273 if (!ec->animatable) return E_EFFECT_GROUP_NONE;
276 switch (ec->client_type)
279 group = E_EFFECT_GROUP_HOME;
282 group = E_EFFECT_GROUP_LOCKSCREEN;
289 if ((ec->comp_data) && (ec->comp_data->sub.data))
290 group = E_EFFECT_GROUP_NONE;
293 if (group == E_EFFECT_GROUP_NORMAL)
295 if (ec->layer > E_LAYER_CLIENT_NORMAL)
296 group = E_EFFECT_GROUP_NONE;
303 group = E_EFFECT_GROUP_KEYBOARD;
309 _eff_group_angle_get(E_Client *ec, E_Effect_Group group)
311 if (group == E_EFFECT_GROUP_KEYBOARD)
315 int buffer_transform = e_comp_wl_output_buffer_transform_get(ec);
316 int rot = ec->parent->e.state.rot.ang.curr;
318 rot = (rot + (buffer_transform * 90)) % 360;
324 return ec->e.state.rot.ang.curr;
328 _eff_object_setup(E_Client *ec, E_Effect_Group group)
331 cfg = e_comp_config_get();
335 if (group == E_EFFECT_GROUP_KEYBOARD)
336 e_comp_object_effect_set(ec->frame, cfg->kbd_effect_style);
337 else if (group == E_EFFECT_GROUP_BACKGROUND)
338 e_comp_object_effect_set(ec->frame, cfg->bg_effect_style);
341 E_Effect_Client *efc = NULL;
342 E_Client *parent_ec = ec;
344 efc = _eff_client_get(ec);
346 while (parent_ec->parent)
347 parent_ec = parent_ec->parent;
349 if ((parent_ec != ec) && (parent_ec->launching)) // Launchig case with parent at same time
350 e_comp_object_effect_set(ec->frame, "no-effect");
351 else if ((efc) && (e_policy_client_is_home_screen(efc->reverse_ec))) // Home key effect senario
352 e_comp_object_effect_set(ec->frame, cfg->effect_style);
353 else if ((cfg) && (cfg->depth_in_style) && (ec->effect_type)) //depth-in senario
354 e_comp_object_effect_set(ec->frame, cfg->depth_in_style);
355 else if ((cfg) && (cfg->effect_style)) // normal launching case
356 e_comp_object_effect_set(ec->frame, cfg->effect_style);
358 e_comp_object_effect_set(ec->frame, "no-effect");
360 EFFINF("eff Setup efc(%p) home(%d) type(%d) parent(%d)",
362 efc? e_policy_client_is_home_screen(efc->reverse_ec) : 0,
364 parent_ec == ec ? -1 : parent_ec->launching);
369 _eff_object_under_cb_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
371 E_Effect_Client *efc = (E_Effect_Client *)data;
375 if (efc->under != obj) return;
377 children = e_layout_children_get(obj);
378 EINA_LIST_FREE(children, child)
380 e_layout_unpack(child);
381 evas_object_del(child);
389 _eff_object_under_setup(E_Client *ec)
391 E_Effect_Client *efc = NULL;
392 Evas_Object *underlay = NULL;
394 efc = _eff_client_get(ec);
401 else if ((underlay = _eff_object_underlayer_get(ec)))
406 if (e_comp_object_effect_object_part_swallow(ec->frame, "under", underlay))
408 evas_object_event_callback_add(underlay,
410 _eff_object_under_cb_del,
412 evas_object_show(underlay);
413 efc->under = underlay;
418 children = e_layout_children_get(underlay);
419 EINA_LIST_FREE(children, child)
421 e_layout_unpack(child);
422 evas_object_del(child);
425 evas_object_del(underlay);
431 _eff_object_under_del(E_Client *ec)
433 E_Effect_Client *efc = NULL;
437 efc = _eff_client_get(ec);
439 if (!efc->under) return;
440 if (efc->under_ref <= 0)
447 if (efc->under_ref > 0) return;
449 evas_object_event_callback_del_full(efc->under,
451 _eff_object_under_cb_del,
454 children = e_layout_children_get(efc->under);
455 EINA_LIST_FREE(children, child)
457 e_layout_unpack(child);
458 evas_object_del(child);
461 evas_object_del(efc->under);
466 _eff_object_background_below_clients_get(E_Client *ec, E_Effect_Type type, Eina_List **below_list)
468 Eina_List *stack = NULL, *list, *next;
469 E_Client *below = NULL;
473 if (type == E_EFFECT_TYPE_RESTACK_HIDE)
474 stack = _eff->stack.old;
476 stack = _eff->stack.cur;
480 list = eina_list_data_find_list(stack, ec);
484 while ((next = eina_list_next(next)))
486 below = eina_list_data_get(next);
489 eina_list_free(*below_list);
494 if (e_object_is_del(E_OBJECT(below))) continue;
495 if (ec->zone != below->zone) continue;
496 if (e_client_util_ignored_get(below) ||
497 (!evas_object_visible_get(below->frame))) continue;
499 if (below->vkbd.vkbd)
502 *below_list = eina_list_prepend(*below_list, below);
508 if (below->visibility.opaque > 0)
515 _eff_object_background_cb_zoom_in_done(void *data, Evas_Object *obj, const char *sig, const char *src)
518 E_Effect_Client *bg_efc;
520 bg_ec = (E_Client *)data;
523 bg_efc = _eff_client_get(bg_ec);
525 bg_efc->bg_animating = 0;
527 e_object_unref(E_OBJECT(bg_ec));
531 _eff_object_background_cb_zoom_out_done(void *data, Evas_Object *obj, const char *sig, const char *src)
534 E_Effect_Client *bg_efc;
536 bg_ec = (E_Client *)data;
539 bg_efc = _eff_client_get(bg_ec);
541 bg_efc->bg_animating = 0;
543 e_object_unref(E_OBJECT(bg_ec));
547 _eff_object_background_start(E_Client *bg_ec, E_Effect_Type type, int bg_opaque)
549 E_Effect_Client *bg_efc = NULL;
553 if (e_object_is_del(E_OBJECT(bg_ec))) return;
554 if (!bg_ec->animatable) return;
556 bg_efc = _eff_client_get(bg_ec);
558 if ((bg_efc->bg_animating) ||
559 ((bg_efc->animating) && !((bg_ec->launching) && (bg_efc->animating == 1))))
562 // 1st param : zoom-in(0) zoom-out(1)
563 // 2nd param : rotation angle
564 // 3rd param : background rect transparency(0) opaque(1)
567 case E_EFFECT_TYPE_SHOW:
568 case E_EFFECT_TYPE_RESTACK_SHOW:
569 if (bg_ec->visibility.obscured != E_VISIBILITY_FULLY_OBSCURED)
571 e_object_ref(E_OBJECT(bg_ec));
572 _eff_object_setup(bg_ec, E_EFFECT_GROUP_BACKGROUND);
573 ang = _eff_group_angle_get(bg_ec, E_EFFECT_GROUP_BACKGROUND);
574 e_comp_object_effect_params_set(bg_ec->frame, 0, (int[]){0, ang, bg_opaque}, 3);
575 e_comp_object_effect_start(bg_ec->frame, _eff_object_background_cb_zoom_in_done, bg_ec);
576 bg_efc->bg_animating = 1;
580 case E_EFFECT_TYPE_RESTACK_HIDE:
581 e_object_ref(E_OBJECT(bg_ec));
582 _eff_object_setup(bg_ec, E_EFFECT_GROUP_BACKGROUND);
583 ang = _eff_group_angle_get(bg_ec, E_EFFECT_GROUP_BACKGROUND);
584 e_comp_object_effect_params_set(bg_ec->frame, 0, (int[]){1, ang, bg_opaque}, 3);
585 e_comp_object_effect_start(bg_ec->frame, _eff_object_background_cb_zoom_out_done, bg_ec);
586 bg_efc->bg_animating = 1;
589 case E_EFFECT_TYPE_HIDE:
590 if (bg_ec->visibility.obscured == E_VISIBILITY_FULLY_OBSCURED)
592 e_object_ref(E_OBJECT(bg_ec));
593 _eff_object_setup(bg_ec, E_EFFECT_GROUP_BACKGROUND);
594 ang = _eff_group_angle_get(bg_ec, E_EFFECT_GROUP_BACKGROUND);
595 e_comp_object_effect_params_set(bg_ec->frame, 0, (int[]){1, ang, bg_opaque}, 3);
596 e_comp_object_effect_start(bg_ec->frame, _eff_object_background_cb_zoom_out_done, bg_ec);
597 bg_efc->bg_animating = 1;
608 _eff_object_background_setup(E_Client *ec, E_Client *home_ec, E_Effect_Group group, E_Effect_Type type)
611 E_Client *bg_ec = NULL;
612 Eina_List *bg_list = NULL;
614 cfg = e_comp_config_get();
616 if (!cfg->bg_effect_style) return;
619 if (group != E_EFFECT_GROUP_NORMAL) return;
620 if ((ec->argb) || (ec->effect_type)) return; //need to check opaque?
623 _eff_object_background_start(home_ec, type, 1);
628 _eff_object_background_below_clients_get(ec, type, &bg_list);
629 if (!bg_list) return;
631 EINA_LIST_FREE(bg_list, bg_ec)
635 EFFDBG("make bottom most background to be opaque", bg_ec);
636 _eff_object_background_start(bg_ec, type, 1);
641 _eff_object_background_start(bg_ec, type, 0);
648 _eff_object_layer_up(E_Client *ec)
652 map_ly = e_comp_canvas_client_layer_map(ec->layer);
653 if (map_ly == 9999) return;
655 if (!_eff->layers[map_ly].obj)
657 _eff->layers[map_ly].obj = evas_object_rectangle_add(e_comp->evas);
658 evas_object_layer_set(_eff->layers[map_ly].obj, ec->layer + 1);
659 evas_object_name_set(_eff->layers[map_ly].obj, "layer_obj(effect)");
662 ec->layer_pending = 1;
663 evas_object_layer_set(ec->frame, ec->layer + 1);
667 _eff_object_layer_down(E_Client *ec)
669 evas_object_layer_set(ec->frame, ec->layer);
670 ec->layer_pending = 0;
674 _eff_pending_effect_start(void)
678 ec = _eff->next_done.ec;
681 EFFINF("Pending eff Start type(%d)",
682 ec, _eff->next_done.type);
684 if (_eff->next_done.cb)
686 _eff_event_send(ec, EINA_TRUE, _eff->next_done.type);
687 e_comp_object_effect_start(ec->frame,
689 _eff->next_done.data);
692 memset(&_eff->next_done, 0, sizeof(_eff->next_done));
696 _eff_pending_effect_set(E_Client *ec, void *data, E_Effect_Type type, Edje_Signal_Cb done_cb)
698 _eff_pending_effect_start();
700 EFFINF("Pending eff Set type(%d)",
703 _eff->next_done.cb = done_cb;
704 _eff->next_done.ec = ec;
705 _eff->next_done.data = data;
706 _eff->next_done.type = type;
710 _eff_stack_update(void)
717 _eff->stack.old = eina_list_free(_eff->stack.old);
718 _eff->stack.old = eina_list_clone(_eff->stack.cur);
720 for (o = evas_object_top_get(e_comp->evas); o; o = evas_object_below_get(o))
722 ec = evas_object_data_get(o, "E_Client");
724 if (e_client_util_ignored_get(ec)) continue;
725 if (e_object_is_del(E_OBJECT(ec))) continue;
727 _eff->stack.cur = eina_list_remove(_eff->stack.cur, ec);
728 _eff->stack.cur = eina_list_append(_eff->stack.cur, ec);
733 _eff_visibility_stack_check(E_Client *ec, Eina_List *stack)
739 Eina_Bool vis = EINA_TRUE;
742 if (!stack) return EINA_FALSE;
744 tiler = eina_tiler_new(ec->desk->geom.w, ec->desk->geom.h);
745 eina_tiler_tile_size_set(tiler, 1, 1);
746 EINA_RECTANGLE_SET(&r, ec->desk->geom.x, ec->desk->geom.y, ec->desk->geom.w, ec->desk->geom.h);
747 eina_tiler_rect_add(tiler, &r);
749 EINA_LIST_FOREACH(stack, l, _ec)
751 if (_ec == ec) break;
752 if (!_ec->visible) continue;
753 if (!evas_object_visible_get(_ec->frame))
755 if (!_ec->iconic) continue;
756 if (_ec->iconic && _ec->exp_iconify.by_client) continue;
758 if (!e_pixmap_resource_get(_ec->pixmap)) continue;
759 if ((_ec->argb) && (_ec->visibility.opaque != 1)) continue;
761 e_client_geometry_get(_ec, &x, &y, &w, &h);
763 EINA_RECTANGLE_SET(&r, x, y, w, h);
764 eina_tiler_rect_del(tiler, &r);
766 if (eina_tiler_empty(tiler))
772 eina_tiler_free(tiler);
778 _eff_restack_effect_check(E_Client *ec)
780 const char *emission = NULL;
782 E_Effect_Client *efc;
784 if (!evas_object_visible_get(ec->frame)) return NULL;
785 if (ec->new_client) return NULL;
787 v1 = _eff_visibility_stack_check(ec, _eff->stack.old);
788 v2 = _eff_visibility_stack_check(ec, _eff->stack.cur);
792 if ((v2) && (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED))
793 emission = "e,action,restack,show";
794 else if ((!v2) && (ec->visibility.obscured == E_VISIBILITY_UNOBSCURED))
795 emission = "e,action,restack,hide";
799 efc = _eff_client_get(ec);
801 // TODO : it's for transients windows. wish using other check */
802 if ((efc) && (!efc->animating))
804 if ((v2) && (!ec->iconic) &&
805 (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED))
806 emission = "e,action,restack,show";
807 else if ((!v2) && (ec->iconic) &&
808 (ec->visibility.obscured == E_VISIBILITY_UNOBSCURED))
809 emission = "e,action,restack,hide";
813 EFFINF("Restack eff Check v1(%d) -> v2(%d) iconic:%d "
814 "obscured:%d(%d) emission:%s",
817 ec->visibility.obscured, ec->visibility.changed, emission);
823 _eff_ref(E_Client *ec)
825 E_Effect_Client *efc;
827 if (!_eff) return EINA_FALSE;
829 efc = _eff_client_get(ec);
830 if (!efc) return EINA_FALSE;
832 if (e_object_is_del(E_OBJECT(ec)))
834 if (!e_object_delay_del_ref_get(E_OBJECT(ec)))
836 ERR("Client is deleted already! ec(%p)", ec);
837 eina_hash_del_by_key(_eff->clients, &ec);
842 if (!ec->pixmap) return EINA_FALSE;
843 if ((e_comp_object_content_type_get(ec->frame) == E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE) &&
844 (!e_comp_object_native_usable_get(ec->frame)))
847 if (e_object_is_del(E_OBJECT(ec)))
849 e_object_delay_del_ref(E_OBJECT(ec));
850 efc->delay_del_ref ++;
853 efc->bg_animating = 0;
855 e_object_ref(E_OBJECT(ec));
856 efc->ep = e_pixmap_ref(ec->pixmap);
858 EFFINF("effect ref efc(%p) animating:%d",
859 efc->ec, efc, efc->animating);
865 _eff_unref(E_Client *ec)
867 E_Effect_Client *efc;
870 if (!_eff) return NULL;
871 if (!ec) return NULL;
873 efc = _eff_client_get(ec);
874 if (!efc) return NULL;
876 while (efc->delay_del_ref)
878 e_object_delay_del_unref(E_OBJECT(ec));
879 efc->delay_del_ref--;
882 if (e_object_is_del(E_OBJECT(ec)))
883 do_unref = efc->animating;
885 efc->animating -= do_unref;
888 e_pixmap_free(efc->ep);
890 _eff_object_under_del(ec);
891 if (!e_object_unref(E_OBJECT(ec)))
893 EFFINF("eff unref ec(%p) ep(%p) efc(%p) Client free'd",
894 NULL, ec, efc->ep, efc);
898 eina_hash_del_by_key(_eff->clients, &ec);
904 EFFINF("eff Unref efc(%p) animating:%d",
905 ec, efc, efc->animating);
907 /* The reference count of wl_buffer will get decremented
908 * immediately after window effect.
910 if ((efc) && (efc->buffer_ref.buffer))
911 e_comp_wl_buffer_reference(&efc->buffer_ref, NULL);
917 _eff_cb_visible_done(void *data, Evas_Object *obj EINA_UNUSED, const char *sig EINA_UNUSED, const char *src EINA_UNUSED)
919 E_Client *ec = (E_Client *)data;
923 _eff_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_SHOW);
924 e_comp_client_override_del(ec);
932 _eff_cb_visible(void *data, Evas_Object *obj, const char *signal)
935 E_Effect_Group group;
938 if (!_eff) return EINA_FALSE;
940 ec = e_comp_object_client_get(obj);
941 if (!ec) return EINA_FALSE;
942 if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
944 group = _eff_group_get(ec);
945 if ((group != E_EFFECT_GROUP_NORMAL) &&
946 (group != E_EFFECT_GROUP_KEYBOARD))
948 e_comp_object_effect_set(ec->frame, NULL);
952 if (evas_object_visible_get(obj)) return EINA_FALSE;
954 e_comp_client_override_add(ec);
958 e_comp_client_override_del(ec);
964 EFFINF("SET EXTRA_ANIMATING...", ec);
965 ec->extra_animating = EINA_TRUE;
967 _eff_object_setup(ec, group);
968 _eff_object_under_setup(ec);
970 ang = _eff_group_angle_get(ec, group);
971 e_comp_object_effect_params_set(ec->frame, 0, (int[]){0, ang}, 2);
974 _eff_pending_effect_set(ec,
977 _eff_cb_visible_done);
981 _eff_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_SHOW);
983 e_comp_object_effect_start(ec->frame, _eff_cb_visible_done, ec);
985 _eff_object_background_setup(ec, NULL, group, E_EFFECT_TYPE_SHOW);
991 _eff_cb_hidden_done(void *data, Evas_Object *obj, const char *sig, const char *src)
993 E_Client *ec = (E_Client *)data;
997 _eff_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_HIDE);
998 e_comp_client_override_del(ec);
1001 if (_eff_client_get(ec))
1003 _eff_object_layer_down(ec);
1004 evas_object_hide(ec->frame);
1005 e_comp_object_effect_hiding_set(ec->frame, 0);
1012 _eff_cb_hidden(void *data, Evas_Object *obj, const char *signal)
1015 E_Effect_Group group;
1016 Eina_Bool lowered = 0;
1022 if (!_eff) return EINA_FALSE;
1024 ec = e_comp_object_client_get(obj);
1025 if (!ec) return EINA_FALSE;
1026 if (e_object_is_del(E_OBJECT(ec)))
1028 if (!e_object_delay_del_ref_get(E_OBJECT(ec))) return EINA_FALSE;
1031 /* check for effect group */
1032 group = _eff_group_get(ec);
1033 if ((group != E_EFFECT_GROUP_NORMAL) &&
1034 (group != E_EFFECT_GROUP_KEYBOARD))
1036 e_comp_object_effect_set(ec->frame, NULL);
1040 if (group == E_EFFECT_GROUP_KEYBOARD)
1042 if (ec->visibility.obscured == E_VISIBILITY_FULLY_OBSCURED)
1046 /* check for object visibility */
1047 if (!evas_object_visible_get(obj)) return EINA_FALSE;
1049 /* check for stack visibility */
1050 v1 = _eff_visibility_stack_check(ec, _eff->stack.old);
1051 v2 = _eff_visibility_stack_check(ec, _eff->stack.cur);
1052 if ((!v1) && (!v2)) return EINA_FALSE;
1054 e_comp_client_override_add(ec);
1058 e_comp_client_override_del(ec);
1062 // check if client was lowered
1063 below = evas_object_below_get(obj);
1064 map_ly = e_comp_canvas_layer_map(evas_object_layer_get(obj));
1065 if ((below) && (map_ly != 9999) &&
1066 (evas_object_layer_get(below) != evas_object_layer_get(obj)) &&
1067 (evas_object_above_get(obj) != e_comp->layers[map_ly].obj))
1071 _eff_object_layer_up(ec);
1073 _eff_object_setup(ec, group);
1074 _eff_object_under_setup(ec);
1076 ang = _eff_group_angle_get(ec, group);
1077 e_comp_object_effect_params_set(ec->frame, 0, (int[]){1, ang}, 2);
1081 _eff_pending_effect_set(ec,
1084 _eff_cb_hidden_done);
1088 _eff_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_HIDE);
1089 if (e_comp_object_effect_start(ec->frame, _eff_cb_hidden_done, ec))
1091 e_comp_object_effect_hiding_set(ec->frame, 1);
1094 _eff_object_background_setup(ec, NULL, group, E_EFFECT_TYPE_HIDE);
1100 _eff_cb_uniconify_done(void *data, Evas_Object *obj, const char *sig, const char *src)
1102 E_Client *ec = (E_Client *)data;
1106 _eff_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_SHOW);
1107 e_comp_client_override_del(ec);
1113 _eff_cb_uniconify(void *data, Evas_Object *obj, const char *signal)
1116 E_Effect_Group group;
1120 if (!_eff) return EINA_FALSE;
1122 ec = e_comp_object_client_get(obj);
1123 if (!ec) return EINA_FALSE;
1124 if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
1126 if (evas_object_visible_get(obj)) return EINA_FALSE;
1128 group = _eff_group_get(ec);
1130 /* for HOME group */
1131 if (group == E_EFFECT_GROUP_HOME)
1135 v1 = _eff_visibility_stack_check(ec, _eff->stack.old);
1136 v2 = _eff_visibility_stack_check(ec, _eff->stack.cur);
1138 EFFINF("Uniconify eff Check v1(%d) -> v2(%d) obscured:%d changed:%d",
1140 v1, v2, ec->visibility.obscured, ec->visibility.changed);
1142 if (v1 == v2) return EINA_FALSE;
1143 if ((v2) && (ec->visibility.obscured == E_VISIBILITY_UNOBSCURED)) return EINA_FALSE;
1144 if ((!v2) && (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED)) return EINA_FALSE;
1146 below = e_client_below_get(ec);
1149 if ((evas_object_visible_get(below->frame)) &&
1150 (below->layer == ec->layer) &&
1151 ((below->visibility.obscured == E_VISIBILITY_UNOBSCURED) ||
1152 (below->visibility.changed)))
1155 below = e_client_below_get(below);
1158 if (!below) return EINA_FALSE;
1159 group = _eff_group_get(below);
1160 if (group != E_EFFECT_GROUP_NORMAL) return EINA_FALSE;
1162 EFFINF("Uniconify HOME group do hide eff of %p",
1165 e_comp_object_signal_emit(below->frame, "e,action,restack,hide", "e");
1168 /* for NORMAL and KEYBOARD group */
1169 else if ((group == E_EFFECT_GROUP_NORMAL) ||
1170 (group == E_EFFECT_GROUP_KEYBOARD))
1172 v1 = _eff_visibility_stack_check(ec, _eff->stack.old);
1173 v2 = _eff_visibility_stack_check(ec, _eff->stack.cur);
1175 EFFINF("Uniconify eff Check v1(%d) -> v2(%d) obscured:%d changed:%d",
1177 v1, v2, ec->visibility.obscured, ec->visibility.changed);
1179 if (v1 == v2) return EINA_FALSE;
1180 if ((v2) && (ec->visibility.obscured == E_VISIBILITY_UNOBSCURED)) return EINA_FALSE;
1181 if ((!v2) && (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED)) return EINA_FALSE;
1183 e_comp_client_override_add(ec);
1187 e_comp_client_override_del(ec);
1191 _eff_object_setup(ec, group);
1192 _eff_object_under_setup(ec);
1194 ang = _eff_group_angle_get(ec, group);
1195 e_comp_object_effect_params_set(ec->frame, 0, (int[]){0, ang}, 2);
1199 _eff_pending_effect_set(ec,
1202 _eff_cb_uniconify_done);
1206 _eff_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_SHOW);
1207 e_comp_object_effect_start(ec->frame, _eff_cb_uniconify_done, ec);
1212 e_comp_object_effect_set(ec->frame, NULL);
1219 _eff_cb_iconify_done(void *data, Evas_Object *obj, const char *sig, const char *src)
1221 E_Client *ec = (E_Client *)data;
1225 _eff_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_HIDE);
1226 e_comp_client_override_del(ec);
1229 if (_eff_client_get(ec))
1231 evas_object_hide(ec->frame);
1232 e_comp_object_effect_hiding_set(ec->frame, 0);
1239 _eff_cb_iconify(void *data, Evas_Object *obj, const char *signal)
1242 E_Effect_Group group;
1246 if (!_eff) return EINA_FALSE;
1248 ec = e_comp_object_client_get(obj);
1249 if (!ec) return EINA_FALSE;
1250 if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
1252 group = _eff_group_get(ec);
1253 if ((group != E_EFFECT_GROUP_NORMAL) &&
1254 (group != E_EFFECT_GROUP_KEYBOARD))
1256 e_comp_object_effect_set(ec->frame, NULL);
1260 if (!evas_object_visible_get(obj)) return EINA_FALSE;
1262 v1 = _eff_visibility_stack_check(ec, _eff->stack.old);
1263 v2 = _eff_visibility_stack_check(ec, _eff->stack.cur);
1265 EFFINF("Iconify eff Check v1(%d) -> v2(%d) obscured:%d changed:%d",
1267 v1, v2, ec->visibility.obscured, ec->visibility.changed);
1269 if (v1 == v2) return EINA_FALSE;
1270 if ((v2) && (ec->visibility.obscured == E_VISIBILITY_UNOBSCURED)) return EINA_FALSE;
1271 if ((!v2) && (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED)) return EINA_FALSE;
1273 e_comp_client_override_add(ec);
1277 e_comp_client_override_del(ec);
1281 _eff_object_setup(ec, group);
1282 _eff_object_under_setup(ec);
1284 ang = _eff_group_angle_get(ec, group);
1285 e_comp_object_effect_params_set(ec->frame, 0, (int[]){1, ang}, 2);
1289 _eff_pending_effect_set(ec,
1292 _eff_cb_iconify_done);
1296 _eff_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_HIDE);
1297 if (e_comp_object_effect_start(ec->frame, _eff_cb_iconify_done, ec))
1299 e_comp_object_effect_hiding_set(ec->frame, 1);
1306 _eff_cb_restack_show_done(void *data, Evas_Object *obj, const char *sig, const char *src)
1308 E_Client *ec = (E_Client *)data;
1312 _eff_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_RESTACK_SHOW);
1313 e_comp_client_override_del(ec);
1317 _eff_stack_update();
1321 _eff_cb_restack_hide_done(void *data, Evas_Object *obj, const char *sig, const char *src)
1323 E_Client *ec = (E_Client *)data;
1327 e_comp_client_override_del(ec);
1330 if (_eff_client_get(ec))
1332 _eff_object_layer_down(ec);
1333 e_comp_object_signal_emit(ec->frame,
1334 "e,action,restack,finish",
1336 e_comp_object_effect_hiding_set(ec->frame, 0);
1341 _eff_stack_update();
1345 _eff_cb_restack_finish_done(void *data, Evas_Object *obj, const char *sig, const char *src)
1347 E_Client *ec = (E_Client *)data;
1348 E_Effect_Client *efc = NULL;
1352 _eff_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_RESTACK_HIDE);
1353 efc = _eff_client_get(ec);
1354 if (efc && efc->reverse_ec)
1356 E_Client *ec_home = efc->reverse_ec;
1357 if (ec_home->extra_animating)
1359 ec_home->extra_animating = EINA_FALSE;
1360 if (ec_home->launching == EINA_TRUE)
1362 ELOGF("COMP", "Un-Set launching flag..", ec_home);
1363 ec_home->launching = EINA_FALSE;
1364 if (ec_home->first_mapped)
1366 ELOGF("LAUNCH", "SHOW real win", ec_home);
1367 e_comp_object_signal_emit(ec_home->frame, "e,action,launch_real,done", "e");
1370 e_comp_object_signal_emit(ec_home->frame, "e,action,launch,done", "e");
1372 _eff_unref(ec_home);
1374 efc->reverse_ec = NULL;
1377 e_comp_client_override_del(ec);
1383 _eff_cb_restack(void *data, Evas_Object *obj, const char *signal)
1386 E_Effect_Group group;
1387 const char *emission;
1388 E_Client *ec_home = NULL;
1391 if (!_eff) return EINA_FALSE;
1393 ec = e_comp_object_client_get(obj);
1394 if (!ec) return EINA_FALSE;
1395 if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
1397 group = _eff_group_get(ec);
1398 emission = eina_stringshare_add(signal);
1400 /* for HOME group: replace eff target client */
1401 if (group == E_EFFECT_GROUP_HOME)
1405 below = e_client_below_get(ec);
1408 if ((!e_object_is_del(E_OBJECT(below))) &&
1409 (evas_object_visible_get(below->frame)) &&
1410 (below->visibility.obscured == E_VISIBILITY_UNOBSCURED) &&
1411 (below->layer == ec->layer))
1414 below = e_client_below_get(below);
1417 if (!below) return EINA_FALSE;
1418 if (e_util_strcmp(signal, "e,action,restack,show")) return EINA_FALSE;
1422 group = _eff_group_get(ec);
1423 if (group != E_EFFECT_GROUP_NORMAL) return EINA_FALSE;
1425 if (emission) eina_stringshare_del(emission);
1426 emission = eina_stringshare_add("e,action,restack,hide");
1429 if ((group != E_EFFECT_GROUP_NORMAL) &&
1430 (group != E_EFFECT_GROUP_KEYBOARD))
1432 e_comp_object_effect_set(ec->frame, NULL);
1436 if ((!e_util_strcmp(emission, "e,action,restack,show")))
1438 /* if ec wass changed to non-animatable, just up and down layer */
1439 if (!ec->animatable)
1441 _eff_object_layer_up(ec);
1442 _eff_object_layer_down(ec);
1446 e_comp_client_override_add(ec);
1450 e_comp_client_override_del(ec);
1454 EFFINF("SET EXTRA_ANIMATING...", ec);
1455 ec->extra_animating = EINA_TRUE;
1457 _eff_object_setup(ec, group);
1458 _eff_object_under_setup(ec);
1460 ang = _eff_group_angle_get(ec, group);
1461 e_comp_object_effect_params_set(ec->frame, 0, (int[]){2, ang}, 2);
1465 _eff_pending_effect_set(ec,
1468 _eff_cb_restack_show_done);
1472 _eff_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_RESTACK_SHOW);
1473 e_comp_object_effect_start(ec->frame, _eff_cb_restack_show_done, ec);
1474 _eff_object_background_setup(ec, NULL, group, E_EFFECT_TYPE_RESTACK_SHOW);
1476 else if (!e_util_strcmp(emission, "e,action,restack,hide"))
1478 /* if ec was changed to non-animatable, just up and down layer */
1479 if (!ec->animatable)
1481 _eff_object_layer_up(ec);
1482 _eff_object_layer_down(ec);
1486 e_comp_client_override_add(ec);
1490 e_comp_client_override_del(ec);
1496 E_Effect_Client *efc = NULL;
1497 efc = _eff_client_get(ec);
1500 if (_eff_ref(ec_home))
1502 EFFINF("SET EXTRA_ANIMATING...", ec_home);
1503 ec_home->extra_animating = EINA_TRUE;
1505 efc->reverse_ec = ec_home;
1507 EFFINF("SET EXTRA_ANIMATING...", ec);
1508 ec->extra_animating = EINA_TRUE;
1513 _eff_object_layer_up(ec);
1515 _eff_object_setup(ec, group);
1516 _eff_object_under_setup(ec);
1518 ang = _eff_group_angle_get(ec, group);
1519 e_comp_object_effect_params_set(ec->frame, 0, (int[]){3, ang}, 2);
1523 _eff_pending_effect_set(ec,
1526 _eff_cb_restack_hide_done);
1530 _eff_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_RESTACK_HIDE);
1531 if (e_comp_object_effect_start(ec->frame, _eff_cb_restack_hide_done, ec))
1533 e_comp_object_effect_hiding_set(ec->frame, 1);
1536 _eff_object_background_setup(ec, ec_home, group, E_EFFECT_TYPE_RESTACK_HIDE);
1538 else if (!e_util_strcmp(emission, "e,action,restack,finish"))
1540 e_comp_client_override_add(ec);
1544 e_comp_client_override_del(ec);
1548 _eff_object_setup(ec, group);
1549 _eff_object_under_setup(ec);
1551 ang = _eff_group_angle_get(ec, group);
1552 e_comp_object_effect_params_set(ec->frame, 0, (int[]){4, ang}, 2);
1556 _eff_pending_effect_set(ec,
1559 _eff_cb_restack_finish_done);
1563 e_comp_object_effect_start(ec->frame, _eff_cb_restack_finish_done, ec);
1570 _eff_cb_launch(void *data, Evas_Object *obj, const char *signal)
1573 struct wl_resource *res_surf;
1574 struct wl_resource *res_eff;
1575 struct wl_client *wc;
1576 unsigned int tizen_effect_type = 4;
1578 if (!_eff) return EINA_FALSE;
1580 ec = e_comp_object_client_get(obj);
1581 if ((!ec) || (!ec->comp_data)) return EINA_FALSE;
1582 if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
1584 res_surf = ec->comp_data->surface;
1585 if (!res_surf) return EINA_FALSE;
1587 wc = wl_resource_get_client(res_surf);
1588 if (!wc) return EINA_FALSE;
1590 res_eff = eina_hash_find(_eff->resources, &wc);
1591 if (!res_eff) return EINA_FALSE;
1593 EFFINF("SEND END |type:LAUNCH|win:0x%08x|tz_effect:0x%08x",
1595 (unsigned int)e_client_util_win_get(ec),
1596 (unsigned int)res_eff);
1598 tizen_effect_send_end(res_eff, res_surf, tizen_effect_type);
1604 _eff_cb_hook_client_new(void *d EINA_UNUSED, E_Client *ec)
1606 E_Effect_Client *efc;
1610 efc = _eff_client_get(ec);
1613 efc = _eff_client_new(ec);
1615 eina_hash_add(_eff->clients, &ec, efc);
1619 _eff_cb_hook_client_del(void *d EINA_UNUSED, E_Client *ec)
1621 E_Effect_Client *efc = NULL;
1625 _eff->stack.old = eina_list_remove(_eff->stack.old, ec);
1626 _eff->stack.cur = eina_list_remove(_eff->stack.cur, ec);
1628 if (_eff->next_done.ec == ec)
1629 memset(&_eff->next_done, 0, sizeof(_eff->next_done));
1631 if ((efc = _eff_client_get(ec)))
1633 if (!efc->animating)
1635 _eff_object_under_del(ec);
1636 eina_hash_del_by_key(_eff->clients, &ec);
1642 _eff_cb_client_restack(void *data, int type, void *event)
1645 E_Event_Client *ev = event;
1646 const char *emission = NULL;
1648 if (!_eff) return ECORE_CALLBACK_PASS_ON;
1651 if (!ec) return ECORE_CALLBACK_PASS_ON;
1652 if (e_object_is_del(E_OBJECT(ec))) return ECORE_CALLBACK_PASS_ON;
1654 EFFINF("Client restacked", ec);
1656 _eff_stack_update();
1658 if (!ec->animatable) return ECORE_CALLBACK_PASS_ON;
1659 if (!_eff_client_get(ec)) return ECORE_CALLBACK_PASS_ON;
1661 if ((emission = _eff_restack_effect_check(ec)))
1662 e_comp_object_signal_emit(ec->frame, emission, "e");
1664 return ECORE_CALLBACK_PASS_ON;
1668 _eff_cb_comp_enabled(void *data, int ev_type, void *event)
1670 if (!_eff) return ECORE_CALLBACK_PASS_ON;
1672 _eff_pending_effect_start();
1674 return ECORE_CALLBACK_PASS_ON;
1678 _eff_cb_client_buffer_change(void *data, int ev_type, void *event)
1680 E_Event_Client *ev = event;
1682 E_Effect_Client *efc;
1683 E_Comp_Wl_Buffer *buffer = NULL;
1685 if (!_eff) return ECORE_CALLBACK_PASS_ON;
1688 if (!ec) return ECORE_CALLBACK_PASS_ON;
1690 efc = _eff_client_get(ec);
1691 if (!efc) return ECORE_CALLBACK_PASS_ON;
1692 if (!efc->animating) return ECORE_CALLBACK_PASS_ON;
1696 buffer = e_pixmap_resource_get(ec->pixmap);
1697 if (buffer != efc->buffer_ref.buffer)
1699 e_comp_wl_buffer_reference(&efc->buffer_ref, buffer);
1703 return ECORE_CALLBACK_PASS_ON;
1707 _tz_effect_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *tz_res_eff)
1709 wl_resource_destroy(tz_res_eff);
1712 static const struct tizen_effect_interface _tz_effect_interface =
1714 _tz_effect_cb_destroy,
1718 _tz_effect_cb_effect_destroy(struct wl_resource *tz_res_eff)
1720 if ((!_eff) || (!_eff->resources)) return;
1722 eina_hash_del_by_data(_eff->resources, tz_res_eff);
1726 _eff_cb_bind(struct wl_client *client, void *data EINA_UNUSED, uint32_t version EINA_UNUSED, uint32_t id)
1728 struct wl_resource *res;
1730 if (!(res = wl_resource_create(client, &tizen_effect_interface, 1, id)))
1732 ERR("Could not create tizen_effect interface");
1733 wl_client_post_no_memory(client);
1737 wl_resource_set_implementation(res,
1738 &_tz_effect_interface,
1740 _tz_effect_cb_effect_destroy);
1742 eina_hash_add(_eff->resources, &client, res);
1746 _eff_cb_client_data_free(void *data)
1748 E_Effect_Client *efc = data;
1752 if (efc->buffer_ref.buffer)
1753 e_comp_wl_buffer_reference(&efc->buffer_ref, NULL);
1758 #undef E_CLIENT_HOOK_APPEND
1759 #define E_CLIENT_HOOK_APPEND(l, t, cb, d) \
1762 E_Client_Hook *_h; \
1763 _h = e_client_hook_add(t, cb, d); \
1765 l = eina_list_append(l, _h); \
1769 #undef E_COMP_OBJ_EFF_MOVER_APPEND
1770 #define E_COMP_OBJ_EFF_MOVER_APPEND(l, i, s, p, d) \
1773 E_Comp_Object_Mover *_m; \
1774 _m = e_comp_object_effect_mover_add(i, s, p, d); \
1776 l = eina_list_append(l, _m); \
1781 e_mod_effect_init(void)
1787 E_Effect_Client *efc;
1789 EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp, EINA_FALSE);
1790 EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp->evas, EINA_FALSE);
1792 eff = E_NEW(E_Effect, 1);
1793 EINA_SAFETY_ON_NULL_RETURN_VAL(eff, EINA_FALSE);
1797 if ((cfg = e_comp_config_get()))
1799 eff->file = eina_stringshare_add(cfg->effect_file);
1800 eff->style = eina_stringshare_add(cfg->effect_style);
1805 eff->style = "no-effect";
1808 eff->clients = eina_hash_pointer_new(_eff_cb_client_data_free);
1809 EINA_SAFETY_ON_NULL_GOTO(eff->clients, err);
1811 EINA_LIST_FOREACH(e_comp->clients, l, ec)
1813 if (ec->ignored) continue;
1815 efc = _eff_client_get(ec);
1817 efc = _eff_client_new(ec);
1819 eina_hash_add(eff->clients, &ec, efc);
1822 eff->resources = eina_hash_pointer_new(NULL);
1823 EINA_SAFETY_ON_NULL_GOTO(eff->resources, err);
1825 eff->global = wl_global_create(e_comp_wl->wl.disp,
1826 &tizen_effect_interface,
1832 ERR("Could not add tizen_efffect wayland globals: %m");
1836 E_LIST_HANDLER_APPEND(eff->event_hdlrs, E_EVENT_COMPOSITOR_ENABLE, _eff_cb_comp_enabled, eff);
1837 E_LIST_HANDLER_APPEND(eff->event_hdlrs, E_EVENT_CLIENT_BUFFER_CHANGE, _eff_cb_client_buffer_change, eff);
1838 E_LIST_HANDLER_APPEND(eff->event_hdlrs, E_EVENT_CLIENT_STACK, _eff_cb_client_restack, eff);
1839 E_CLIENT_HOOK_APPEND(eff->hooks_ec, E_CLIENT_HOOK_NEW_CLIENT, _eff_cb_hook_client_new, eff);
1840 E_CLIENT_HOOK_APPEND(eff->hooks_ec, E_CLIENT_HOOK_DEL, _eff_cb_hook_client_del, eff);
1841 E_COMP_OBJ_EFF_MOVER_APPEND(eff->providers, 100, "e,state,visible", _eff_cb_visible, eff);
1842 E_COMP_OBJ_EFF_MOVER_APPEND(eff->providers, 100, "e,state,hidden", _eff_cb_hidden, eff);
1843 E_COMP_OBJ_EFF_MOVER_APPEND(eff->providers, 100, "e,action,iconify", _eff_cb_iconify, eff);
1844 E_COMP_OBJ_EFF_MOVER_APPEND(eff->providers, 100, "e,action,uniconify", _eff_cb_uniconify, eff);
1845 E_COMP_OBJ_EFF_MOVER_APPEND(eff->providers, 100, "e,action,restack*", _eff_cb_restack, eff);
1846 E_COMP_OBJ_EFF_MOVER_APPEND(eff->providers, 100, "e,action,launch,done", _eff_cb_launch, eff);
1851 e_mod_effect_shutdown();
1856 e_mod_effect_shutdown()
1860 E_FREE_FUNC(_eff->stack.old, eina_list_free);
1861 E_FREE_FUNC(_eff->stack.cur, eina_list_free);
1863 E_FREE_LIST(_eff->under_layers, free);
1864 E_FREE_LIST(_eff->providers, e_comp_object_effect_mover_del);
1865 E_FREE_LIST(_eff->event_hdlrs, ecore_event_handler_del);
1866 E_FREE_LIST(_eff->hooks_ec, e_client_hook_del);
1869 wl_global_destroy(_eff->global);
1871 E_FREE_FUNC(_eff->resources, eina_hash_free);
1872 E_FREE_FUNC(_eff->clients, eina_hash_free);
1874 if (e_comp_config_get())
1876 eina_stringshare_del(_eff->file);
1877 eina_stringshare_del(_eff->style);