1 #include "e_mod_comp_shared_types.h"
2 #include "e_mod_comp.h"
3 #include "e_mod_comp_atoms.h"
4 #include "e_mod_comp_debug.h"
7 struct _E_Comp_Effect_Type
9 Eina_Bool animatable : 1; // if this valuse is true then window can show animaton.
10 E_Comp_Effect_Style show; // indicate show effect type
11 E_Comp_Effect_Style hide; // indicate hide effect type
12 E_Comp_Effect_Style restack; // indicate restack effect type
13 E_Comp_Effect_Style rotation; // indicate rotation effect type
14 E_Comp_Effect_Style focusin; // indicate focus in effect type
15 E_Comp_Effect_Style focusout; // indicate focus out effect type
18 struct _E_Comp_Effect_Job
21 E_Comp_Canvas *canvas;
30 static Eina_List *effect_jobs = NULL;
32 /* local subsystem functions */
33 static E_Comp_Effect_Style _effect_style_get(Ecore_X_Atom a);
34 static Eina_Bool _state_send(E_Comp_Win *cw, Eina_Bool state);
35 static Eina_Bool _effect_signal_del_intern(E_Comp_Win *cw, Evas_Object *obj, const char *name, Eina_Bool clean_all);
37 static void _effect_win_set(E_Comp_Win *cw, const char *emission);
38 static void _effect_below_wins_set(E_Comp_Win *cw);
39 static void _effect_above_wins_set(E_Comp_Win *cw, Eina_Bool show);
40 static void _effect_show(E_Comp_Win *cw);
41 static void _effect_hide(E_Comp_Win *cw);
42 static Eina_Bool _effect_obj_win_set(E_Comp_Effect_Object *o, E_Comp_Win *cw);
43 static void _effect_obj_effect_done(void *data, Evas_Object *obj, const char *emission, const char *source);
44 static Eina_Bool _effect_obj_find(E_Comp_Win *cw);
46 /* externally accessible functions */
47 EINTERN E_Comp_Effect_Object *
48 e_mod_comp_effect_object_new(E_Comp_Layer *ly,
51 E_Comp_Effect_Object *o = NULL;
53 E_CHECK_RETURN(ly, NULL);
54 E_CHECK_RETURN(cw, NULL);
56 res = _effect_obj_find(cw);
57 /* TODO: clean up previous effect job */
58 E_CHECK_RETURN(!res, NULL);
60 o = E_NEW(E_Comp_Effect_Object, 1);
61 E_CHECK_RETURN(o, NULL);
63 o->edje = edje_object_add(ly->canvas->evas);
64 E_CHECK_GOTO(o->edje, fail);
66 e_mod_comp_layer_populate(ly, o->edje);
68 evas_object_data_set(o->edje, "comp.effect_obj.ly", ly);
69 evas_object_data_set(o->edje, "comp.effect_obj.cwin",
70 (void *)e_mod_comp_util_client_xid_get(cw));
72 res = _effect_obj_win_set(o, cw);
73 E_CHECK_GOTO(res, fail);
75 ly->objs = eina_list_append(ly->objs, o);
77 ELBF(ELBT_COMP, 0, o->cwin,
78 "%15.15s| OBJ_NEW %p", "EFFECT", o->edje);
83 ELBF(ELBT_COMP, 0, e_mod_comp_util_client_xid_get(cw),
84 "%15.15s| OBJ_NEW Failed", "EFFECT");
89 e_layout_unpack(o->edje);
90 evas_object_del(o->edje);
98 e_mod_comp_effect_object_free(E_Comp_Effect_Object *o)
102 if ((o->edje) && (o->img))
103 edje_object_part_unswallow(o->edje, o->img);
107 /* TODO: consider when using an xim */
108 evas_object_image_native_surface_set(o->img, NULL);
109 evas_object_image_size_set(o->img, 1, 1);
110 evas_object_image_data_set(o->img, NULL);
111 evas_object_hide(o->img);
112 evas_object_del(o->img);
116 ecore_x_pixmap_free(o->pixmap);
120 evas_object_data_del(o->edje, "comp.effect_obj.ly");
121 evas_object_data_del(o->edje, "comp.effect_obj.cwin");
122 evas_object_hide(o->edje);
123 evas_object_del(o->edje);
126 ELBF(ELBT_COMP, 0, o->cwin,
127 "%15.15s| OBJ_FREE", "EFFECT");
129 memset(o, 0, sizeof(E_Comp_Effect_Object));
135 e_mod_comp_effect_signal_del(E_Comp_Win *cw,
139 return _effect_signal_del_intern(cw, obj, name, EINA_FALSE);
143 e_mod_comp_effect_jobs_clean(E_Comp_Win *cw,
147 return _effect_signal_del_intern(cw, obj, name, EINA_TRUE);
151 e_mod_comp_effect_signal_flush(void)
153 E_Comp_Effect_Job *job;
158 EINA_LIST_FOREACH(effect_jobs, l, job)
161 if (job->emitted) continue;
163 if ((job->win) && (job->canvas))
165 if ((cw = e_mod_comp_win_find(job->win)))
169 ELBF(ELBT_COMP, 0, job->cwin,
170 "%15.15s| SIG_PEND:%s", "EFFECT",
176 e_mod_comp_effect_animating_set(cw->c, cw, EINA_TRUE);
177 job->emitted = EINA_TRUE;
179 edje_object_signal_emit(job->o, job->emission, job->src);
181 ELBF(ELBT_COMP, 0, job->cwin,
182 "%15.15s| SIG_EMIT>%s", "EFFECT",
188 ELBF(ELBT_COMP, 0, job->cwin,
189 "%15.15s| SIG_DEL :%s", "EFFECT",
192 /* remove this job if cw was already removed */
193 effect_jobs = eina_list_remove(effect_jobs, job);
199 edje_object_signal_emit(job->o, job->emission, job->src);
201 ELBF(ELBT_COMP, 0, job->cwin,
202 "%15.15s| OBJ SIG_EMIT>%s", "EFFECT",
205 ly = evas_object_data_get(job->o, "comp.effect_obj.ly");
206 if (ly) e_mod_comp_layer_effect_set(ly, EINA_TRUE);
208 effect_jobs = eina_list_remove(effect_jobs, job);
216 EINTERN E_Comp_Effect_Type *
217 e_mod_comp_effect_type_new(void)
219 E_Comp_Effect_Type *t;
220 t = E_NEW(E_Comp_Effect_Type, 1);
221 E_CHECK_RETURN(t, 0);
222 t->animatable = EINA_TRUE;
227 e_mod_comp_effect_type_free(E_Comp_Effect_Type *type)
234 e_mod_comp_effect_type_setup(E_Comp_Effect_Type *type,
237 E_CHECK_RETURN(type, 0);
238 E_CHECK_RETURN(win, 0);
240 e_mod_comp_effect_state_setup(type, win);
241 e_mod_comp_effect_style_setup(type, win);
247 e_mod_comp_effect_state_setup(E_Comp_Effect_Type *type,
251 int ret, size_ret = 0;
252 unsigned long num_ret = 0, bytes = 0;
253 unsigned char *prop_ret = NULL;
254 Ecore_X_Display *dpy;
257 E_CHECK_RETURN(type, 0);
258 E_CHECK_RETURN(win, 0);
260 dpy = ecore_x_display_get();
261 ret = XGetWindowProperty(dpy, win, ATOM_WINDOW_EFFECT_ENABLE, 0, LONG_MAX,
262 False, ECORE_X_ATOM_CARDINAL, &type_ret, &size_ret,
263 &num_ret, &bytes, &prop_ret);
264 if (ret == 0) // success
266 if (prop_ret && num_ret)
268 type->animatable = prop_ret[0];
279 if (prop_ret) XFree(prop_ret);
284 e_mod_comp_effect_state_get(E_Comp_Effect_Type *type)
286 E_CHECK_RETURN(type, 0);
287 return type->animatable;
291 e_mod_comp_effect_style_setup(E_Comp_Effect_Type *type,
294 Ecore_X_Atom *atoms = NULL;
295 Eina_Bool res = EINA_FALSE;
298 E_CHECK_RETURN(type, 0);
299 E_CHECK_RETURN(win, 0);
301 num = ecore_x_window_prop_atom_list_get
302 (win, ATOM_WINDOW_EFFECT_TYPE, &atoms);
303 E_CHECK_GOTO((num == 6), cleanup);
304 E_CHECK_GOTO(atoms, cleanup);
306 type->show = _effect_style_get(atoms[0]);
307 type->hide = _effect_style_get(atoms[1]);
308 type->restack = _effect_style_get(atoms[2]);
309 type->rotation = _effect_style_get(atoms[3]);
310 type->focusin = _effect_style_get(atoms[4]);
311 type->focusout = _effect_style_get(atoms[5]);
316 if (atoms) E_FREE(atoms);
320 EINTERN E_Comp_Effect_Style
321 e_mod_comp_effect_style_get(E_Comp_Effect_Type *type,
322 E_Comp_Effect_Kind kind)
324 E_Comp_Effect_Style res;
325 E_CHECK_RETURN(type, E_COMP_EFFECT_STYLE_NONE);
328 case E_COMP_EFFECT_KIND_SHOW: res = type->show; break;
329 case E_COMP_EFFECT_KIND_HIDE: res = type->hide; break;
330 case E_COMP_EFFECT_KIND_RESTACK: res = type->restack; break;
331 case E_COMP_EFFECT_KIND_ROTATION: res = type->rotation; break;
332 case E_COMP_EFFECT_KIND_FOCUSIN: res = type->focusin; break;
333 case E_COMP_EFFECT_KIND_FOCUSOUT: res = type->focusout; break;
334 default: res = E_COMP_EFFECT_STYLE_NONE; break;
339 #define _MAKE_EMISSION(f, x...) do { snprintf(emission, sizeof(emission), f, ##x); } while(0)
342 e_mod_comp_effect_win_restack(E_Comp_Win *cw,
346 Eina_Bool animatable = e_mod_comp_effect_state_get(cw->eff_type);
347 if (!((cw->c->animatable) && (animatable))) return;
348 if ((v1) == (v2)) return;
357 e_mod_comp_effect_win_show(E_Comp_Win *cw)
359 Eina_Bool animatable = e_mod_comp_effect_state_get(cw->eff_type);
361 if (cw->c->fake_image_launch)
363 if ((e_mod_comp_effect_image_launch_window_check(cw->c->eff_img, cw)) &&
364 (e_mod_comp_effect_image_launch_running_check(cw->c->eff_img)))
366 if (e_mod_comp_effect_image_launch_fake_show_done_check(cw->c->eff_img))
368 e_mod_comp_effect_image_launch_disable(cw->c->eff_img);
372 e_mod_comp_effect_image_launch_window_set(cw->c->eff_img, cw->win);
377 if ((cw->c->animatable) && (animatable))
383 /* for the composite window */
384 e_mod_comp_effect_signal_add(cw, NULL, "e,state,visible,on,noeffect", "e");
386 /* TODO: message of comp object visibility should be sent after finishing effect */
387 e_mod_comp_comp_event_src_visibility_send(cw);
391 e_mod_comp_effect_win_hide(E_Comp_Win *cw)
393 Eina_Bool animatable, visible;
395 animatable = e_mod_comp_effect_state_get(cw->eff_type);
396 visible = e_mod_comp_util_win_visible_get(cw);
398 ELBF(ELBT_COMP, 0, e_mod_comp_util_client_xid_get(cw),
399 "%15.15s| CHECK visible:%d cw->visible:%d a:%d", "EFFECT",
400 visible, cw->visible, animatable);
402 if ((cw->c->animatable) && (animatable) &&
408 /* for the composite window */
409 e_mod_comp_effect_signal_add(cw, NULL, "e,state,visible,off,noeffect", "e");
411 /* TODO: message of comp object visibility should be sent after finishing effect */
412 e_mod_comp_comp_event_src_visibility_send(cw);
417 e_mod_comp_effect_signal_add(E_Comp_Win *cw,
419 const char *emission,
426 E_Comp_Effect_Job *job = NULL;
429 E_CHECK_RETURN((cw || o), 0);
430 E_CHECK_RETURN(emission, 0);
431 E_CHECK_RETURN(src, 0);
437 EINA_LIST_FOREACH(cw->objs, l, co)
440 if (!co->shadow) continue;
442 job = E_NEW(E_Comp_Effect_Job, 1);
447 job->cwin = e_mod_comp_util_client_xid_get(cw);
448 job->canvas = co->canvas;
450 len = sizeof(job->emission);
451 strncpy(job->emission, emission, len);
452 job->emission[len-1] = '\0';
454 len = sizeof(job->src);
455 strncpy(job->src, src, len);
456 job->src[len-1] = '\0';
458 effect_jobs = eina_list_append(effect_jobs, job);
460 e_mod_comp_hw_ov_win_msg_show
461 (E_COMP_LOG_TYPE_EFFECT,
463 job->cwin, emission);
468 job = E_NEW(E_Comp_Effect_Job, 1);
471 job->effect_obj = EINA_TRUE;
474 job->cwin = (Ecore_X_Window)evas_object_data_get(o, "comp.effect_obj.cwin");
476 len = sizeof(job->emission);
477 strncpy(job->emission, emission, len);
478 job->emission[len-1] = '\0';
480 len = sizeof(job->src);
481 strncpy(job->src, src, len);
482 job->src[len-1] = '\0';
484 effect_jobs = eina_list_append(effect_jobs, job);
490 ELBF(ELBT_COMP, 0, job->cwin,
491 "%15.15s| %s SIG_ADD:%s", "EFFECT",
492 job->effect_obj ? "OBJ" : " ",
500 e_mod_comp_effect_animating_set(E_Comp *c,
505 E_CHECK_RETURN(c, 0);
506 E_CHECK_GOTO(cw, postjob);
513 _state_send(cw, EINA_FALSE);
522 cw->animating = state;
523 _state_send(cw, state);
526 if (set) c->animating++;
531 /* local subsystem functions */
532 static E_Comp_Effect_Style
533 _effect_style_get(Ecore_X_Atom a)
535 E_CHECK_RETURN(a, E_COMP_EFFECT_STYLE_NONE);
537 if (a == ATOM_EFFECT_DEFAULT) return E_COMP_EFFECT_STYLE_DEFAULT;
538 else if (a == ATOM_EFFECT_NONE ) return E_COMP_EFFECT_STYLE_NONE;
539 else if (a == ATOM_EFFECT_CUSTOM0) return E_COMP_EFFECT_STYLE_CUSTOM0;
540 else if (a == ATOM_EFFECT_CUSTOM1) return E_COMP_EFFECT_STYLE_CUSTOM1;
541 else if (a == ATOM_EFFECT_CUSTOM2) return E_COMP_EFFECT_STYLE_CUSTOM2;
542 else if (a == ATOM_EFFECT_CUSTOM3) return E_COMP_EFFECT_STYLE_CUSTOM3;
543 else if (a == ATOM_EFFECT_CUSTOM4) return E_COMP_EFFECT_STYLE_CUSTOM4;
544 else if (a == ATOM_EFFECT_CUSTOM5) return E_COMP_EFFECT_STYLE_CUSTOM5;
545 else if (a == ATOM_EFFECT_CUSTOM6) return E_COMP_EFFECT_STYLE_CUSTOM6;
546 else if (a == ATOM_EFFECT_CUSTOM7) return E_COMP_EFFECT_STYLE_CUSTOM7;
547 else if (a == ATOM_EFFECT_CUSTOM8) return E_COMP_EFFECT_STYLE_CUSTOM8;
548 else if (a == ATOM_EFFECT_CUSTOM9) return E_COMP_EFFECT_STYLE_CUSTOM9;
550 return E_COMP_EFFECT_STYLE_NONE;
554 _state_send(E_Comp_Win *cw,
557 long d[5] = {0L, 0L, 0L, 0L, 0L};
559 E_CHECK_RETURN(cw, 0);
561 win = e_mod_comp_util_client_xid_get(cw);
562 E_CHECK_RETURN(win, 0);
564 if (state) d[0] = 1L;
567 ecore_x_client_message32_send
568 (win, ATOM_WINDOW_EFFECT_CLIENT_STATE,
569 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
570 d[0], d[1], d[2], d[3], d[4]);
576 _effect_signal_del_intern(E_Comp_Win *cw,
581 E_Comp_Effect_Job *job;
583 EINA_LIST_FOREACH(effect_jobs, l, job)
586 if (!job->emitted) continue;
587 if (!job->win) continue;
588 if (!job->canvas) continue;
590 Ecore_X_Window win = cw ? cw->win : 0;
593 job->canvas->animation.num--;
595 if (job->canvas->animation.num <= 0)
597 job->canvas->animation.run = 0;
598 job->canvas->animation.num = 0;
601 ELBF(ELBT_COMP, 0, job->cwin,
602 "%15.15s| SIG_DEL :%s", "EFFECT",
605 e_mod_comp_hw_ov_win_msg_show
606 (E_COMP_LOG_TYPE_EFFECT,
608 job->win, job->emission);
610 effect_jobs = eina_list_remove(effect_jobs, job);
614 if (!clean_all) break;
621 _effect_obj_win_set(E_Comp_Effect_Object *o,
624 E_Comp_Object *co = NULL;
625 E_Comp_Layer *ly = NULL;
626 const char *file = NULL, *group = NULL;
627 int ok = 0, pw = 0, ph = 0;
629 ly = evas_object_data_get(o->edje, "comp.effect_obj.ly");
630 E_CHECK_RETURN(ly, EINA_FALSE);
631 E_CHECK_RETURN(ly->canvas, EINA_FALSE);
633 co = eina_list_nth(cw->objs, 0);
634 E_CHECK_RETURN(co, EINA_FALSE);
636 edje_object_file_get(co->shadow, &file, &group);
637 E_CHECK_RETURN(file, EINA_FALSE);
638 E_CHECK_RETURN(group, EINA_FALSE);
640 ok = edje_object_file_set(o->edje, file, group);
641 E_CHECK_RETURN(ok, EINA_FALSE);
643 o->img = evas_object_image_filled_add(ly->canvas->evas);
644 E_CHECK_RETURN(o->img, EINA_FALSE);
646 evas_object_image_colorspace_set(o->img, EVAS_COLORSPACE_ARGB8888);
647 evas_object_image_smooth_scale_set(o->img, _comp_mod->conf->smooth_windows);
648 if (cw->argb) evas_object_image_alpha_set(o->img, 1);
649 else evas_object_image_alpha_set(o->img, 0);
651 /* set nocomp mode before getting named pixmap */
652 E_Comp_Win *nocomp_cw = e_mod_comp_util_win_nocomp_get(cw->c, ly->canvas->zone);
654 e_mod_comp_canvas_nocomp_end(ly->canvas);
656 o->pixmap = ecore_x_composite_name_window_pixmap_get(cw->win);
657 E_CHECK_GOTO(o->pixmap, fail);
659 ecore_x_pixmap_geometry_get(o->pixmap, NULL, NULL, &pw, &ph);
660 E_CHECK_GOTO((pw > 0), fail);
661 E_CHECK_GOTO((ph > 0), fail);
663 Evas_Native_Surface ns;
664 ns.version = EVAS_NATIVE_SURFACE_VERSION;
665 ns.type = EVAS_NATIVE_SURFACE_X11;
666 ns.data.x11.visual = cw->vis;
667 ns.data.x11.pixmap = o->pixmap;
669 evas_object_image_size_set(o->img, pw, ph);
670 evas_object_image_native_surface_set(o->img, &ns);
671 evas_object_image_data_update_add(o->img, 0, 0, pw, ph);
673 ELBF(ELBT_COMP, 0, e_mod_comp_util_client_xid_get(cw),
674 "%15.15s| OBJ_NEW pix:0x%x %dx%d", "EFFECT",
677 edje_object_part_swallow(o->edje, "e.swallow.content", o->img);
679 e_layout_child_move(o->edje, cw->x, cw->y);
680 e_layout_child_resize(o->edje, pw, ph);
682 edje_object_signal_callback_add(o->edje, "e,action,show,done", "e", _effect_obj_effect_done, o);
683 edje_object_signal_callback_add(o->edje, "e,action,hide,done", "e", _effect_obj_effect_done, o);
686 o->cwin = e_mod_comp_util_client_xid_get(cw);
693 evas_object_del(o->img);
698 ecore_x_pixmap_free(o->pixmap);
705 _effect_obj_effect_done(void *data,
707 const char *emission __UNUSED__,
708 const char *source __UNUSED__)
710 E_Comp_Effect_Object *o = data;
715 ly = evas_object_data_get(obj, "comp.effect_obj.ly");
718 /* decrease effect count and hide effect layer if it is 0 */
719 e_mod_comp_layer_effect_set(ly, EINA_FALSE);
723 _effect_win_set(E_Comp_Win *cw,
724 const char *emission)
726 E_Comp_Canvas *canvas;
728 E_Comp_Effect_Object *o;
730 canvas = eina_list_nth(cw->c->canvases, 0);
731 ly = e_mod_comp_canvas_layer_get(canvas, "effect");
734 o = e_mod_comp_effect_object_new(ly, cw);
737 evas_object_show(o->img);
738 evas_object_show(o->edje);
739 e_mod_comp_effect_signal_add(NULL, o->edje, emission, "e");
745 _effect_below_wins_set(E_Comp_Win *cw)
747 E_Comp_Canvas *canvas;
749 E_Comp_Effect_Object *o;
751 E_Comp_Win *_cw = cw, *nocomp_cw = NULL;
754 _MAKE_EMISSION("e,state,visible,on,noeffect");
756 canvas = eina_list_nth(cw->c->canvases, 0);
757 ly = e_mod_comp_canvas_layer_get(canvas, "effect");
763 nocomp_cw = e_mod_comp_util_win_nocomp_get(cw->c, zone);
765 /* create effect objects until finding a non-alpha full-screen window */
766 while ((l = EINA_INLIST_GET(_cw)->prev))
768 _cw = _EINA_INLIST_CONTAINER(_cw, l);
769 if (!(_cw->visible)) continue;
770 if (_cw->invalid) continue;
771 if (_cw->input_only) continue;
772 if (!E_INTERSECTS(zone->x, zone->y, zone->w, zone->h,
773 _cw->x, _cw->y, _cw->w, _cw->h))
776 /* if nocomp exist, change mode to the composite mode */
777 if ((nocomp_cw) && (nocomp_cw == _cw))
779 ELBF(ELBT_COMP, 0, e_mod_comp_util_client_xid_get(_cw),
780 "%15.15s| END EFFECT_OBJ_NEW", "NOCOMP");
781 e_mod_comp_canvas_nocomp_end(canvas);
783 else if (!((_cw->pixmap) &&
784 (_cw->pw > 0) && (_cw->ph > 0) &&
785 (_cw->dmg_updates >= 1)))
790 o = e_mod_comp_effect_object_new(ly, _cw);
793 evas_object_show(o->img);
794 evas_object_show(o->edje);
795 e_mod_comp_effect_signal_add(NULL, o->edje, emission, "e");
797 /* change the stack position of the object to the bottom
798 * of layer and also background object too
800 e_layout_child_lower(o->edje);
801 e_mod_comp_layer_bg_adjust(ly);
804 /* found a non-alpha full-screen window */
805 if ((REGION_EQUAL_TO_ZONE(_cw, zone)) && !(_cw->argb))
811 _effect_above_wins_set(E_Comp_Win *cw,
814 E_Comp_Canvas *canvas;
816 E_Comp_Effect_Object *o;
818 E_Comp_Win *_cw = cw;
822 canvas = eina_list_nth(cw->c->canvases, 0);
823 ly = e_mod_comp_canvas_layer_get(canvas, "effect");
829 while ((l = EINA_INLIST_GET(_cw)->next))
831 _cw = _EINA_INLIST_CONTAINER(_cw, l);
832 if (!(_cw->visible)) continue;
833 if (_cw->invalid) continue;
834 if (_cw->input_only) continue;
835 if (!E_INTERSECTS(zone->x, zone->y, zone->w, zone->h,
836 _cw->x, _cw->y, _cw->w, _cw->h))
838 if (!((_cw->pixmap) &&
839 (_cw->pw > 0) && (_cw->ph > 0) &&
840 (_cw->dmg_updates >= 1)))
843 _MAKE_EMISSION("e,state,visible,on,noeffect");
845 if ((TYPE_KEYBOARD_CHECK(_cw)) && (!show))
847 if (cw->c->keyboard_effect)
849 if (e_mod_comp_effect_win_angle_get(_cw))
850 _MAKE_EMISSION("e,state,visible,off,angle,%d", _cw->angle);
852 _MAKE_EMISSION("e,state,visible,off,angle,0");
858 o = e_mod_comp_effect_object_new(ly, _cw);
861 evas_object_show(o->img);
862 evas_object_show(o->edje);
863 e_mod_comp_effect_signal_add(NULL, o->edje, emission, "e");
869 _effect_obj_find(E_Comp_Win *cw)
871 E_Comp_Canvas *canvas = eina_list_nth(cw->c->canvases, 0);
872 E_CHECK_RETURN(canvas, EINA_FALSE);
874 E_Comp_Layer *ly = e_mod_comp_canvas_layer_get(canvas, "effect");
875 E_CHECK_RETURN(ly, EINA_FALSE);
878 E_Comp_Effect_Object *o = NULL;
879 EINA_LIST_FOREACH(ly->objs, l, o)
882 if (o->win == cw->win)
884 ELBF(ELBT_COMP, 0, e_mod_comp_util_client_xid_get(cw),
885 "%15.15s| OBJ already exists!", "EFFECT");
894 _effect_show(E_Comp_Win *cw)
896 E_Comp_Effect_Style st;
898 E_Comp_Win *cw2 = NULL;
899 Eina_Bool launch, visible;
901 Eina_Bool res = _effect_obj_find(cw);
904 /* check effect condition and make emission string */
905 st = e_mod_comp_effect_style_get(cw->eff_type, E_COMP_EFFECT_KIND_SHOW);
906 visible = e_mod_comp_util_win_visible_get(cw);
908 ELBF(ELBT_COMP, 0, e_mod_comp_util_client_xid_get(cw),
909 "%15.15s|SHOW", "EFFECT");
911 if (E_COMP_EFFECT_STYLE_DEFAULT == st)
913 launch = e_mod_comp_policy_app_launch_check(cw);
914 if ((launch) && (visible))
916 _effect_below_wins_set(cw);
918 ELBF(ELBT_COMP, 0, e_mod_comp_util_client_xid_get(cw),
919 "%15.15s|>FG", "EFFECT");
921 _MAKE_EMISSION("e,state,visible,on");
922 _effect_win_set(cw, emission);
923 _effect_above_wins_set(cw, EINA_TRUE);
925 else if ((TYPE_KEYBOARD_CHECK(cw)) && (visible))
927 if (cw->c->keyboard_effect)
929 _effect_below_wins_set(cw);
931 if (e_mod_comp_effect_win_angle_get(cw))
932 _MAKE_EMISSION("e,state,window,angle,%d", cw->angle);
934 _MAKE_EMISSION("e,state,window,angle,0");
936 _effect_win_set(cw, emission);
937 _effect_above_wins_set(cw, EINA_TRUE);
940 /* in most cases, border show events of home window are generated
941 * by pressing the h/w home button. at that moment, home window
942 * is invisible thus the wm doesn't need to check visibility for
943 * home window. just make app closing effect except lock and
944 * setup wizard window.
946 else if (TYPE_HOME_CHECK(cw))
948 /* app window hide effect by pressing the h/w home button */
949 cw2 = e_mod_comp_util_win_normal_get(NULL);
952 /* do nothing, if cw2 is such exceptional windows as lock
953 * and setup wizard window. this case usually happens when
954 * system is booting. (first show of the home window)
956 res = e_mod_comp_policy_home_app_win_check(cw2);
958 ELBF(ELBT_COMP, 0, e_mod_comp_util_client_xid_get(cw),
959 "%15.15s|>BG HOME 0x%08x FG 0x%08x SKIP:%d", "EFFECT",
960 e_mod_comp_util_client_xid_get(cw),
961 e_mod_comp_util_client_xid_get(cw2),
966 /* background is home */
967 _MAKE_EMISSION("e,state,visible,on,noeffect");
968 _effect_win_set(cw, emission);
970 /* app window will hide */
971 _MAKE_EMISSION("e,state,visible,off");
972 _effect_win_set(cw2, emission);
973 _effect_above_wins_set(cw2, EINA_FALSE);
980 _effect_hide(E_Comp_Win *cw)
982 E_Comp_Effect_Style st;
984 E_Comp_Win *cw2 = NULL;
987 Eina_Bool res = _effect_obj_find(cw);
990 /* check effect condition and make emission string */
991 st = e_mod_comp_effect_style_get(cw->eff_type, E_COMP_EFFECT_KIND_HIDE);
993 ELBF(ELBT_COMP, 0, e_mod_comp_util_client_xid_get(cw),
994 "%15.15s|HIDE", "EFFECT");
996 if (E_COMP_EFFECT_STYLE_DEFAULT == st)
998 close = e_mod_comp_policy_app_close_check(cw);
1001 /* background window */
1002 cw2 = e_mod_comp_util_win_normal_get(cw);
1005 ELBF(ELBT_COMP, 0, e_mod_comp_util_client_xid_get(cw),
1006 "%15.15s|>BG 0x%08x", "EFFECT",
1007 e_mod_comp_util_client_xid_get(cw2));
1009 _MAKE_EMISSION("e,state,visible,on,noeffect");
1010 _effect_win_set(cw2, emission);
1013 ELBF(ELBT_COMP, 0, e_mod_comp_util_client_xid_get(cw),
1014 "%15.15s|>FG", "EFFECT");
1016 _MAKE_EMISSION("e,state,visible,off");
1017 _effect_win_set(cw, emission);
1018 _effect_above_wins_set(cw, EINA_FALSE);
1020 else if (TYPE_KEYBOARD_CHECK(cw))
1022 if (cw->c->keyboard_effect)
1024 _effect_below_wins_set(cw);
1026 if (e_mod_comp_effect_win_angle_get(cw))
1027 _MAKE_EMISSION("e,state,visible,off,angle,%d", cw->angle);
1029 _MAKE_EMISSION("e,state,visible,off,angle,0");
1031 _effect_win_set(cw, emission);
1032 _effect_above_wins_set(cw, EINA_FALSE);