1 #include "e_mod_effect.h"
3 static E_Effect *_eff = NULL;
5 typedef struct _E_Effect_Client
8 unsigned int animating;
9 E_Comp_Wl_Buffer_Ref buffer_ref;
15 _eff_event_send(E_Client *ec, Eina_Bool start, E_Effect_Type type)
17 struct wl_resource *res_surf;
18 struct wl_resource *res_eff;
20 unsigned int tizen_effect_type = TIZEN_EFFECT_TYPE_NONE;
23 if ((!ec) || (!ec->comp_data)) return;
24 if (e_object_is_del(E_OBJECT(ec))) return;
26 res_surf = ec->comp_data->surface;
27 if (!res_surf) return;
29 wc = wl_resource_get_client(res_surf);
32 res_eff = eina_hash_find(_eff->resources, &wc);
37 case E_EFFECT_TYPE_SHOW:
38 tizen_effect_type = TIZEN_EFFECT_TYPE_SHOW;
40 case E_EFFECT_TYPE_HIDE:
41 tizen_effect_type = TIZEN_EFFECT_TYPE_HIDE;
43 case E_EFFECT_TYPE_RESTACK_SHOW:
44 case E_EFFECT_TYPE_RESTACK_HIDE:
45 tizen_effect_type = TIZEN_EFFECT_TYPE_RESTACK;
48 ERR("Unsupported effect type: %d for %p", type, ec);
52 EFFINF("SEND %.5s|type:%d|win:0x%08x|tz_effect:0x%08x",
54 start ? "START" : "END", type,
55 (unsigned int)e_client_util_win_get(ec),
56 (unsigned int)res_eff);
59 tizen_effect_send_start(res_eff, res_surf, tizen_effect_type);
62 tizen_effect_send_end(res_eff, res_surf, tizen_effect_type);
64 EFFINF("Un-SET EXTRA_ANIMATING...", ec->pixmap, ec);
65 ec->extra_animating = EINA_FALSE;
66 if (ec->launching == EINA_TRUE)
68 ec->launching = EINA_FALSE;
69 e_comp_object_signal_emit(ec->frame, "e,action,launch,done", "e");
74 static E_Effect_Client*
75 _eff_client_new(E_Client *ec)
79 efc = E_NEW(E_Effect_Client, 1);
87 static E_Effect_Client *
88 _eff_client_get(E_Client *ec)
90 if (!_eff) return NULL;
91 return eina_hash_find(_eff->clients, &ec);
95 _eff_group_get(E_Client *ec)
97 E_Effect_Group group = E_EFFECT_GROUP_NORMAL;
99 /* animatable setting by aux_hint */
100 if (!ec->animatable) return E_EFFECT_GROUP_NONE;
103 switch (ec->client_type)
106 group = E_EFFECT_GROUP_HOME;
109 group = E_EFFECT_GROUP_LOCKSCREEN;
116 if (group == E_EFFECT_GROUP_NORMAL)
118 if (ec->layer > E_LAYER_CLIENT_NORMAL)
119 group = E_EFFECT_GROUP_NONE;
126 group = E_EFFECT_GROUP_KEYBOARD;
132 _eff_group_angle_get(E_Client *ec, E_Effect_Group group)
134 if (group == E_EFFECT_GROUP_KEYBOARD)
137 return ec->parent->e.state.rot.ang.curr;
140 return ec->e.state.rot.ang.curr;
144 _eff_ref(E_Client *ec)
146 E_Effect_Client *efc;
148 if (!_eff) return EINA_FALSE;
150 if (e_object_is_del(E_OBJECT(ec)))
152 ERR("Client is deleted already! ec(%p)", ec);
153 eina_hash_del_by_key(_eff->clients, &ec);
157 efc = _eff_client_get(ec);
158 if (!efc) return EINA_FALSE;
160 if (!ec->pixmap) return EINA_FALSE;
161 if ((e_comp_object_content_type_get(ec->frame) == E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE) &&
162 (!e_pixmap_usable_get(ec->pixmap)))
166 e_object_ref(E_OBJECT(ec));
167 efc->ep = e_pixmap_ref(ec->pixmap);
169 EFFINF("effect ref efc(%p) animating:%d",
170 efc->ep, efc->ec, efc, efc->animating);
176 _eff_unref(E_Client *ec)
178 E_Effect_Client *efc;
181 if (!_eff) return NULL;
182 if (!ec) return NULL;
184 efc = _eff_client_get(ec);
185 if (!efc) return NULL;
187 if (e_object_is_del(E_OBJECT(ec)))
188 do_unref = efc->animating;
190 efc->animating -= do_unref;
193 e_pixmap_free(efc->ep);
194 if (!e_object_unref(E_OBJECT(ec)))
196 EFFINF("eff unref ec(%p) ep(%p) efc(%p) Client free'd",
197 NULL, NULL, ec, efc->ep, efc);
201 eina_hash_del_by_key(_eff->clients, &ec);
207 EFFINF("eff Unref efc(%p) animating:%d",
208 ec->pixmap, ec, efc, efc->animating);
210 /* The reference count of wl_buffer will get decremented
211 * immediately after window effect.
213 if ((efc) && (efc->buffer_ref.buffer))
214 e_comp_wl_buffer_reference(&efc->buffer_ref, NULL);
220 _eff_object_setup(E_Client *ec, E_Effect_Group group)
223 cfg = e_comp_config_get();
225 if (group == E_EFFECT_GROUP_KEYBOARD)
226 e_comp_object_effect_set(ec->frame, "keyboard");
229 if ((cfg) && (cfg->effect_style))
230 e_comp_object_effect_set(ec->frame, cfg->effect_style);
232 e_comp_object_effect_set(ec->frame, "no-effect");
237 _eff_object_layer_up(E_Client *ec)
241 map_ly = e_comp_canvas_client_layer_map(ec->layer);
242 if (map_ly == 9999) return;
244 if (!_eff->layers[map_ly].obj)
246 _eff->layers[map_ly].obj = evas_object_rectangle_add(e_comp->evas);
247 evas_object_layer_set(_eff->layers[map_ly].obj, ec->layer + 1);
248 evas_object_name_set(_eff->layers[map_ly].obj, "layer_obj(effect)");
251 ec->layer_pending = 1;
252 evas_object_layer_set(ec->frame, ec->layer + 1);
256 _eff_object_layer_down(E_Client *ec)
258 evas_object_layer_set(ec->frame, ec->layer);
259 ec->layer_pending = 0;
263 _eff_pending_effect_start(void)
267 ec = _eff->next_done.ec;
270 EFFINF("Pending eff Start type(%d)",
271 ec->pixmap, ec, _eff->next_done.type);
273 if (_eff->next_done.cb)
275 _eff_event_send(ec, EINA_TRUE, _eff->next_done.type);
276 e_comp_object_effect_start(ec->frame,
278 _eff->next_done.data);
281 memset(&_eff->next_done, 0, sizeof(_eff->next_done));
285 _eff_pending_effect_set(E_Client *ec, void *data, E_Effect_Type type, Edje_Signal_Cb done_cb)
287 _eff_pending_effect_start();
289 EFFINF("Pending eff Set type(%d)",
290 ec->pixmap, ec, type);
292 _eff->next_done.cb = done_cb;
293 _eff->next_done.ec = ec;
294 _eff->next_done.data = data;
295 _eff->next_done.type = type;
299 _eff_stack_update(void)
306 _eff->stack.old = eina_list_free(_eff->stack.old);
307 _eff->stack.old = eina_list_clone(_eff->stack.cur);
309 for (o = evas_object_top_get(e_comp->evas); o; o = evas_object_below_get(o))
311 ec = evas_object_data_get(o, "E_Client");
313 if (e_client_util_ignored_get(ec)) continue;
314 if (e_object_is_del(E_OBJECT(ec))) continue;
316 _eff->stack.cur = eina_list_remove(_eff->stack.cur, ec);
317 _eff->stack.cur = eina_list_append(_eff->stack.cur, ec);
322 _eff_visibility_stack_check(E_Client *ec, Eina_List *stack)
328 Eina_Bool vis = EINA_TRUE;
331 if (!stack) return EINA_FALSE;
333 tiler = eina_tiler_new(ec->desk->geom.w, ec->desk->geom.h);
334 eina_tiler_tile_size_set(tiler, 1, 1);
335 EINA_RECTANGLE_SET(&r, ec->desk->geom.x, ec->desk->geom.y, ec->desk->geom.w, ec->desk->geom.h);
336 eina_tiler_rect_add(tiler, &r);
338 EINA_LIST_FOREACH(stack, l, _ec)
340 if (_ec == ec) break;
341 if (!_ec->visible) continue;
342 if (!evas_object_visible_get(_ec->frame))
344 if (!_ec->iconic) continue;
345 if (_ec->iconic && _ec->exp_iconify.by_client) continue;
347 if (!e_pixmap_resource_get(_ec->pixmap)) continue;
349 e_client_geometry_get(_ec, &x, &y, &w, &h);
351 EINA_RECTANGLE_SET(&r, x, y, w, h);
352 eina_tiler_rect_del(tiler, &r);
354 if (eina_tiler_empty(tiler))
360 eina_tiler_free(tiler);
366 _eff_restack_effect_check(E_Client *ec)
368 const char *emission = NULL;
370 E_Effect_Client *efc;
372 if (!evas_object_visible_get(ec->frame)) return NULL;
373 if (ec->new_client) return NULL;
375 v1 = _eff_visibility_stack_check(ec, _eff->stack.old);
376 v2 = _eff_visibility_stack_check(ec, _eff->stack.cur);
380 if ((v2) && (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED))
381 emission = "e,action,restack,show";
382 else if ((!v2) && (ec->visibility.obscured == E_VISIBILITY_UNOBSCURED))
383 emission = "e,action,restack,hide";
387 efc = _eff_client_get(ec);
389 // TODO : it's for transients windows. wish using other check */
390 if ((efc) && (!efc->animating))
392 if ((v2) && (!ec->iconic) &&
393 (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED))
394 emission = "e,action,restack,show";
395 else if ((!v2) && (ec->iconic) &&
396 (ec->visibility.obscured == E_VISIBILITY_UNOBSCURED))
397 emission = "e,action,restack,hide";
401 EFFINF("Restack eff Check v1(%d) -> v2(%d) iconic:%d "
402 "obscured:%d(%d) emission:%s",
405 ec->visibility.obscured, ec->visibility.changed, emission);
411 _eff_cb_visible_done(void *data, Evas_Object *obj EINA_UNUSED, const char *sig EINA_UNUSED, const char *src EINA_UNUSED)
413 E_Client *ec = (E_Client *)data;
417 _eff_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_SHOW);
422 e_comp_override_del();
426 _eff_cb_visible(void *data, Evas_Object *obj, const char *signal)
429 E_Effect_Group group;
432 if (!_eff) return EINA_FALSE;
434 ec = e_comp_object_client_get(obj);
435 if (!ec) return EINA_FALSE;
436 if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
438 group = _eff_group_get(ec);
439 if ((group != E_EFFECT_GROUP_NORMAL) &&
440 (group != E_EFFECT_GROUP_KEYBOARD)) return EINA_FALSE;
442 if (evas_object_visible_get(obj)) return EINA_FALSE;
443 if (!_eff_ref(ec)) return EINA_FALSE;
445 e_comp_override_add();
447 EFFINF("SET EXTRA_ANIMATING...", ec->pixmap, ec);
448 ec->extra_animating = EINA_TRUE;
450 _eff_object_setup(ec, group);
451 ang = _eff_group_angle_get(ec, group);
452 e_comp_object_effect_params_set(ec->frame, 0, (int[]){0, ang}, 2);
455 _eff_pending_effect_set(ec,
458 _eff_cb_visible_done);
462 _eff_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_SHOW);
464 e_comp_object_effect_start(ec->frame, _eff_cb_visible_done, ec);
470 _eff_cb_hidden_done(void *data, Evas_Object *obj, const char *sig, const char *src)
472 E_Client *ec = (E_Client *)data;
476 _eff_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_HIDE);
479 if (_eff_client_get(ec))
481 _eff_object_layer_down(ec);
482 evas_object_hide(ec->frame);
487 e_comp_override_del();
491 _eff_cb_hidden(void *data, Evas_Object *obj, const char *signal)
494 E_Effect_Group group;
495 Eina_Bool lowered = 0;
500 if (!_eff) return EINA_FALSE;
502 ec = e_comp_object_client_get(obj);
503 if (!ec) return EINA_FALSE;
504 if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
506 /* check for effect group */
507 group = _eff_group_get(ec);
508 if ((group != E_EFFECT_GROUP_NORMAL) &&
509 (group != E_EFFECT_GROUP_KEYBOARD)) return EINA_FALSE;
511 if (group == E_EFFECT_GROUP_KEYBOARD)
513 if (ec->visibility.obscured == E_VISIBILITY_FULLY_OBSCURED)
517 if (!evas_object_visible_get(obj)) return EINA_FALSE;
518 if (!_eff_ref(ec)) return EINA_FALSE;
520 e_comp_override_add();
522 // check if client was lowered
523 below = evas_object_below_get(obj);
524 map_ly = e_comp_canvas_layer_map(evas_object_layer_get(obj));
525 if ((below) && (map_ly != 9999) &&
526 (evas_object_layer_get(below) != evas_object_layer_get(obj)) &&
527 (evas_object_above_get(obj) != e_comp->layers[map_ly].obj))
531 _eff_object_layer_up(ec);
533 _eff_object_setup(ec, group);
534 ang = _eff_group_angle_get(ec, group);
535 e_comp_object_effect_params_set(ec->frame, 0, (int[]){1, ang}, 2);
539 _eff_pending_effect_set(ec,
542 _eff_cb_hidden_done);
546 _eff_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_HIDE);
547 e_comp_object_effect_start(ec->frame, _eff_cb_hidden_done, ec);
553 _eff_cb_uniconify_done(void *data, Evas_Object *obj, const char *sig, const char *src)
555 E_Client *ec = (E_Client *)data;
559 _eff_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_SHOW);
563 e_comp_override_del();
567 _eff_cb_uniconify(void *data, Evas_Object *obj, const char *signal)
570 E_Effect_Group group;
574 if (!_eff) return EINA_FALSE;
576 ec = e_comp_object_client_get(obj);
577 if (!ec) return EINA_FALSE;
578 if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
580 if (evas_object_visible_get(obj)) return EINA_FALSE;
582 group = _eff_group_get(ec);
585 if (group == E_EFFECT_GROUP_HOME)
589 v1 = _eff_visibility_stack_check(ec, _eff->stack.old);
590 v2 = _eff_visibility_stack_check(ec, _eff->stack.cur);
592 EFFINF("Uniconify eff Check v1(%d) -> v2(%d) obscured:%d changed:%d",
594 v1, v2, ec->visibility.obscured, ec->visibility.changed);
596 if (v1 == v2) return EINA_FALSE;
597 if ((v2) && (ec->visibility.obscured == E_VISIBILITY_UNOBSCURED)) return EINA_FALSE;
598 if ((!v2) && (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED)) return EINA_FALSE;
600 below = e_client_below_get(ec);
603 if ((evas_object_visible_get(below->frame)) &&
604 (below->layer == ec->layer) &&
605 ((below->visibility.obscured == E_VISIBILITY_UNOBSCURED) ||
606 (below->visibility.changed)))
609 below = e_client_below_get(below);
612 if (!below) return EINA_FALSE;
613 group = _eff_group_get(below);
614 if (group != E_EFFECT_GROUP_NORMAL) return EINA_FALSE;
616 EFFINF("Uniconify HOME group do hide eff of %p",
617 ec->pixmap, ec, below);
619 e_comp_object_signal_emit(below->frame, "e,action,restack,hide", "e");
622 /* for NORMAL and KEYBOARD group */
623 else if ((group == E_EFFECT_GROUP_NORMAL) ||
624 (group == E_EFFECT_GROUP_KEYBOARD))
626 v1 = _eff_visibility_stack_check(ec, _eff->stack.old);
627 v2 = _eff_visibility_stack_check(ec, _eff->stack.cur);
629 EFFINF("Uniconify eff Check v1(%d) -> v2(%d) obscured:%d changed:%d",
631 v1, v2, ec->visibility.obscured, ec->visibility.changed);
633 if (v1 == v2) return EINA_FALSE;
634 if ((v2) && (ec->visibility.obscured == E_VISIBILITY_UNOBSCURED)) return EINA_FALSE;
635 if ((!v2) && (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED)) return EINA_FALSE;
637 if (!_eff_ref(ec)) return EINA_FALSE;
639 e_comp_override_add();
641 _eff_object_setup(ec, group);
642 ang = _eff_group_angle_get(ec, group);
643 e_comp_object_effect_params_set(ec->frame, 0, (int[]){0, ang}, 2);
647 _eff_pending_effect_set(ec,
650 _eff_cb_uniconify_done);
654 _eff_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_SHOW);
655 e_comp_object_effect_start(ec->frame, _eff_cb_uniconify_done, ec);
663 _eff_cb_iconify_done(void *data, Evas_Object *obj, const char *sig, const char *src)
665 E_Client *ec = (E_Client *)data;
669 _eff_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_HIDE);
672 if (_eff_client_get(ec))
673 evas_object_hide(ec->frame);
677 e_comp_override_del();
681 _eff_cb_iconify(void *data, Evas_Object *obj, const char *signal)
684 E_Effect_Group group;
688 if (!_eff) return EINA_FALSE;
690 ec = e_comp_object_client_get(obj);
691 if (!ec) return EINA_FALSE;
692 if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
694 group = _eff_group_get(ec);
695 if ((group != E_EFFECT_GROUP_NORMAL) &&
696 (group != E_EFFECT_GROUP_KEYBOARD)) return EINA_FALSE;
698 if (!evas_object_visible_get(obj)) return EINA_FALSE;
700 v1 = _eff_visibility_stack_check(ec, _eff->stack.old);
701 v2 = _eff_visibility_stack_check(ec, _eff->stack.cur);
703 EFFINF("Iconify eff Check v1(%d) -> v2(%d) obscured:%d changed:%d",
705 v1, v2, ec->visibility.obscured, ec->visibility.changed);
707 if (v1 == v2) return EINA_FALSE;
708 if ((v2) && (ec->visibility.obscured == E_VISIBILITY_UNOBSCURED)) return EINA_FALSE;
709 if ((!v2) && (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED)) return EINA_FALSE;
711 if (!_eff_ref(ec)) return EINA_FALSE;
713 e_comp_override_add();
715 _eff_object_setup(ec, group);
716 ang = _eff_group_angle_get(ec, group);
717 e_comp_object_effect_params_set(ec->frame, 0, (int[]){1, ang}, 2);
721 _eff_pending_effect_set(ec,
724 _eff_cb_iconify_done);
728 _eff_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_HIDE);
729 e_comp_object_effect_start(ec->frame, _eff_cb_iconify_done, ec);
735 _eff_cb_restack_show_done(void *data, Evas_Object *obj, const char *sig, const char *src)
737 E_Client *ec = (E_Client *)data;
741 _eff_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_RESTACK_SHOW);
746 e_comp_override_del();
750 _eff_cb_restack_hide_done(void *data, Evas_Object *obj, const char *sig, const char *src)
752 E_Client *ec = (E_Client *)data;
758 if (_eff_client_get(ec))
760 _eff_object_layer_down(ec);
761 e_comp_object_signal_emit(ec->frame,
762 "e,action,restack,finish",
769 e_comp_override_del();
773 _eff_cb_restack_finish_done(void *data, Evas_Object *obj, const char *sig, const char *src)
775 E_Client *ec = (E_Client *)data;
776 E_Effect_Client *efc = NULL;
780 _eff_event_send(ec, EINA_FALSE, E_EFFECT_TYPE_RESTACK_HIDE);
781 efc = _eff_client_get(ec);
782 if (efc && efc->reverse_ec)
784 E_Client *ec_home = efc->reverse_ec;
785 if (ec_home->extra_animating)
787 ec_home->extra_animating = EINA_FALSE;
788 if (ec_home->launching == EINA_TRUE)
790 ec_home->launching = EINA_FALSE;
791 e_comp_object_signal_emit(ec_home->frame, "e,action,launch,done", "e");
800 e_comp_override_del();
804 _eff_cb_restack(void *data, Evas_Object *obj, const char *signal)
807 E_Effect_Group group;
808 const char *emission;
809 E_Client *ec_home = NULL;
812 if (!_eff) return EINA_FALSE;
814 ec = e_comp_object_client_get(obj);
815 if (!ec) return EINA_FALSE;
816 if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
818 group = _eff_group_get(ec);
819 emission = eina_stringshare_add(signal);
821 /* for HOME group: replace eff target client */
822 if (group == E_EFFECT_GROUP_HOME)
826 below = e_client_below_get(ec);
829 if ((!e_object_is_del(E_OBJECT(below))) &&
830 (evas_object_visible_get(below->frame)) &&
831 (below->visibility.obscured == E_VISIBILITY_UNOBSCURED) &&
832 (below->layer == ec->layer))
835 below = e_client_below_get(below);
838 if (!below) return EINA_FALSE;
839 if (e_util_strcmp(signal, "e,action,restack,show")) return EINA_FALSE;
843 group = _eff_group_get(ec);
844 if (group != E_EFFECT_GROUP_NORMAL) return EINA_FALSE;
846 if (emission) eina_stringshare_del(emission);
847 emission = eina_stringshare_add("e,action,restack,hide");
850 if ((group != E_EFFECT_GROUP_NORMAL) &&
851 (group != E_EFFECT_GROUP_KEYBOARD)) return EINA_FALSE;
853 if ((!e_util_strcmp(emission, "e,action,restack,show")))
855 if (!_eff_ref(ec)) return EINA_FALSE;
857 EFFINF("SET EXTRA_ANIMATING...", ec->pixmap, ec);
858 ec->extra_animating = EINA_TRUE;
860 e_comp_override_add();
862 _eff_object_setup(ec, group);
863 ang = _eff_group_angle_get(ec, group);
864 e_comp_object_effect_params_set(ec->frame, 0, (int[]){2, ang}, 2);
868 _eff_pending_effect_set(ec,
871 _eff_cb_restack_show_done);
875 _eff_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_RESTACK_SHOW);
876 e_comp_object_effect_start(ec->frame, _eff_cb_restack_show_done, ec);
878 else if (!e_util_strcmp(emission, "e,action,restack,hide"))
880 if (!_eff_ref(ec)) return EINA_FALSE;
884 E_Effect_Client *efc = NULL;
885 efc = _eff_client_get(ec);
888 if (_eff_ref(ec_home))
890 EFFINF("SET EXTRA_ANIMATING...", ec_home->pixmap, ec_home);
891 ec_home->extra_animating = EINA_TRUE;
893 efc->reverse_ec = ec_home;
895 EFFINF("SET EXTRA_ANIMATING...", ec->pixmap, ec);
896 ec->extra_animating = EINA_TRUE;
901 e_comp_override_add();
903 _eff_object_layer_up(ec);
905 _eff_object_setup(ec, group);
906 ang = _eff_group_angle_get(ec, group);
907 e_comp_object_effect_params_set(ec->frame, 0, (int[]){3, ang}, 2);
911 _eff_pending_effect_set(ec,
914 _eff_cb_restack_hide_done);
918 _eff_event_send(ec, EINA_TRUE, E_EFFECT_TYPE_RESTACK_HIDE);
919 e_comp_object_effect_start(ec->frame, _eff_cb_restack_hide_done, ec);
921 else if (!e_util_strcmp(emission, "e,action,restack,finish"))
923 if (!_eff_ref(ec)) return EINA_FALSE;
925 e_comp_override_add();
927 _eff_object_setup(ec, group);
928 ang = _eff_group_angle_get(ec, group);
929 e_comp_object_effect_params_set(ec->frame, 0, (int[]){4, ang}, 2);
933 _eff_pending_effect_set(ec,
936 _eff_cb_restack_finish_done);
940 e_comp_object_effect_start(ec->frame, _eff_cb_restack_finish_done, ec);
947 _eff_cb_launch(void *data, Evas_Object *obj, const char *signal)
950 struct wl_resource *res_surf;
951 struct wl_resource *res_eff;
952 struct wl_client *wc;
953 unsigned int tizen_effect_type = 4;
955 if (!_eff) return EINA_FALSE;
957 ec = e_comp_object_client_get(obj);
958 if ((!ec) || (!ec->comp_data)) return EINA_FALSE;
959 if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
961 res_surf = ec->comp_data->surface;
962 if (!res_surf) return EINA_FALSE;
964 wc = wl_resource_get_client(res_surf);
965 if (!wc) return EINA_FALSE;
967 res_eff = eina_hash_find(_eff->resources, &wc);
968 if (!res_eff) return EINA_FALSE;
970 EFFINF("SEND END |type:LAUNCH|win:0x%08x|tz_effect:0x%08x",
972 (unsigned int)e_client_util_win_get(ec),
973 (unsigned int)res_eff);
975 tizen_effect_send_end(res_eff, res_surf, tizen_effect_type);
981 _eff_cb_hook_client_new(void *d EINA_UNUSED, E_Client *ec)
983 E_Effect_Client *efc;
987 efc = _eff_client_get(ec);
990 efc = _eff_client_new(ec);
992 eina_hash_add(_eff->clients, &ec, efc);
996 _eff_cb_hook_client_del(void *d EINA_UNUSED, E_Client *ec)
998 E_Effect_Client *efc = NULL;
1002 _eff->stack.old = eina_list_remove(_eff->stack.old, ec);
1003 _eff->stack.cur = eina_list_remove(_eff->stack.cur, ec);
1005 if (_eff->next_done.ec == ec)
1006 memset(&_eff->next_done, 0, sizeof(_eff->next_done));
1008 if ((efc = _eff_client_get(ec)))
1010 if (!efc->animating)
1011 eina_hash_del_by_key(_eff->clients, &ec);
1016 _eff_cb_client_restack(void *data, int type, void *event)
1019 E_Event_Client *ev = event;
1020 const char *emission = NULL;
1022 if (!_eff) return ECORE_CALLBACK_PASS_ON;
1025 if (!ec) return ECORE_CALLBACK_PASS_ON;
1026 if (e_object_is_del(E_OBJECT(ec))) return ECORE_CALLBACK_PASS_ON;
1028 EFFINF("Client restacked", ec->pixmap, ec);
1030 _eff_stack_update();
1032 if (!_eff_client_get(ec)) return ECORE_CALLBACK_PASS_ON;
1034 if ((emission = _eff_restack_effect_check(ec)))
1035 e_comp_object_signal_emit(ec->frame, emission, "e");
1037 return ECORE_CALLBACK_PASS_ON;
1041 _eff_cb_comp_enabled(void *data, int ev_type, void *event)
1043 if (!_eff) return ECORE_CALLBACK_PASS_ON;
1045 _eff_pending_effect_start();
1047 return ECORE_CALLBACK_PASS_ON;
1051 _eff_cb_client_buffer_change(void *data, int ev_type, void *event)
1053 E_Event_Client *ev = event;
1055 E_Effect_Client *efc;
1056 E_Comp_Wl_Buffer *buffer = NULL;
1058 if (!_eff) return ECORE_CALLBACK_PASS_ON;
1061 if (!ec) return ECORE_CALLBACK_PASS_ON;
1063 efc = _eff_client_get(ec);
1064 if (!efc) return ECORE_CALLBACK_PASS_ON;
1068 buffer = e_pixmap_resource_get(ec->pixmap);
1069 if (buffer != efc->buffer_ref.buffer)
1071 e_comp_wl_buffer_reference(&efc->buffer_ref, buffer);
1075 return ECORE_CALLBACK_PASS_ON;
1079 _tz_effect_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *tz_res_eff)
1081 wl_resource_destroy(tz_res_eff);
1084 static const struct tizen_effect_interface _tz_effect_interface =
1086 _tz_effect_cb_destroy,
1090 _tz_effect_cb_effect_destroy(struct wl_resource *tz_res_eff)
1092 if ((!_eff) || (!_eff->resources)) return;
1094 eina_hash_del_by_data(_eff->resources, tz_res_eff);
1098 _eff_cb_bind(struct wl_client *client, void *data EINA_UNUSED, uint32_t version EINA_UNUSED, uint32_t id)
1100 struct wl_resource *res;
1102 if (!(res = wl_resource_create(client, &tizen_effect_interface, 1, id)))
1104 ERR("Could not create tizen_effect interface");
1105 wl_client_post_no_memory(client);
1109 wl_resource_set_implementation(res,
1110 &_tz_effect_interface,
1112 _tz_effect_cb_effect_destroy);
1114 eina_hash_add(_eff->resources, &client, res);
1118 _eff_cb_client_data_free(void *data)
1120 E_Effect_Client *efc = data;
1124 if (efc->buffer_ref.buffer)
1125 e_comp_wl_buffer_reference(&efc->buffer_ref, NULL);
1130 #undef E_CLIENT_HOOK_APPEND
1131 #define E_CLIENT_HOOK_APPEND(l, t, cb, d) \
1134 E_Client_Hook *_h; \
1135 _h = e_client_hook_add(t, cb, d); \
1137 l = eina_list_append(l, _h); \
1141 #undef E_COMP_OBJ_EFF_MOVER_APPEND
1142 #define E_COMP_OBJ_EFF_MOVER_APPEND(l, i, s, p, d) \
1145 E_Comp_Object_Mover *_m; \
1146 _m = e_comp_object_effect_mover_add(i, s, p, d); \
1148 l = eina_list_append(l, _m); \
1153 e_mod_effect_init(void)
1159 E_Effect_Client *efc;
1161 EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp, EINA_FALSE);
1162 EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp->evas, EINA_FALSE);
1164 eff = E_NEW(E_Effect, 1);
1165 EINA_SAFETY_ON_NULL_RETURN_VAL(eff, EINA_FALSE);
1167 if ((cfg = e_comp_config_get()))
1169 eff->file = eina_stringshare_add(cfg->effect_file);
1170 eff->style = eina_stringshare_add(cfg->effect_style);
1175 eff->style = "no-effect";
1178 eff->clients = eina_hash_pointer_new(_eff_cb_client_data_free);
1179 EINA_SAFETY_ON_NULL_GOTO(eff->clients, err);
1181 EINA_LIST_FOREACH(e_comp->clients, l, ec)
1183 if (ec->ignored) continue;
1185 efc = _eff_client_get(ec);
1187 efc = _eff_client_new(ec);
1189 eina_hash_add(eff->clients, &ec, efc);
1192 eff->resources = eina_hash_pointer_new(NULL);
1193 EINA_SAFETY_ON_NULL_GOTO(eff->resources, err);
1195 eff->global = wl_global_create(e_comp_wl->wl.disp,
1196 &tizen_effect_interface,
1202 ERR("Could not add tizen_efffect wayland globals: %m");
1206 E_LIST_HANDLER_APPEND(eff->event_hdlrs, E_EVENT_COMPOSITOR_ENABLE, _eff_cb_comp_enabled, eff);
1207 E_LIST_HANDLER_APPEND(eff->event_hdlrs, E_EVENT_CLIENT_BUFFER_CHANGE, _eff_cb_client_buffer_change, eff);
1208 E_LIST_HANDLER_APPEND(eff->event_hdlrs, E_EVENT_CLIENT_STACK, _eff_cb_client_restack, eff);
1209 E_CLIENT_HOOK_APPEND(eff->hooks_ec, E_CLIENT_HOOK_NEW_CLIENT, _eff_cb_hook_client_new, eff);
1210 E_CLIENT_HOOK_APPEND(eff->hooks_ec, E_CLIENT_HOOK_DEL, _eff_cb_hook_client_del, eff);
1211 E_COMP_OBJ_EFF_MOVER_APPEND(eff->providers, 100, "e,state,visible", _eff_cb_visible, eff);
1212 E_COMP_OBJ_EFF_MOVER_APPEND(eff->providers, 100, "e,state,hidden", _eff_cb_hidden, eff);
1213 E_COMP_OBJ_EFF_MOVER_APPEND(eff->providers, 100, "e,action,iconify", _eff_cb_iconify, eff);
1214 E_COMP_OBJ_EFF_MOVER_APPEND(eff->providers, 100, "e,action,uniconify", _eff_cb_uniconify, eff);
1215 E_COMP_OBJ_EFF_MOVER_APPEND(eff->providers, 100, "e,action,restack*", _eff_cb_restack, eff);
1216 E_COMP_OBJ_EFF_MOVER_APPEND(eff->providers, 100, "e,action,launch,done", _eff_cb_launch, eff);
1223 e_mod_effect_shutdown();
1228 e_mod_effect_shutdown()
1232 E_FREE_FUNC(_eff->stack.old, eina_list_free);
1233 E_FREE_FUNC(_eff->stack.cur, eina_list_free);
1235 E_FREE_LIST(_eff->providers, e_comp_object_effect_mover_del);
1236 E_FREE_LIST(_eff->event_hdlrs, ecore_event_handler_del);
1237 E_FREE_LIST(_eff->hooks_ec, e_client_hook_del);
1240 wl_global_destroy(_eff->global);
1242 E_FREE_FUNC(_eff->resources, eina_hash_free);
1243 E_FREE_FUNC(_eff->clients, eina_hash_free);