1 #include "e_mod_comp_shared_types.h"
2 #include "e_mod_comp_debug.h"
3 #include "e_mod_comp.h"
5 /* static global variables */
6 static int _canvas_num = 0;
8 /* local subsystem functions */
9 static void _fps_update(E_Comp_Canvas *canvas);
10 static void _pre_swap(void *data, Evas *e, void *event_info);
11 static void _post_swap(void *data, Evas *e, void *event_info);
12 static Eina_Bool _nocomp_prepare_timeout(void *data);
13 #if USE_NOCOMP_DISPOSE
14 static Eina_Bool _nocomp_end_timeout(void *data);
17 /* externally accessible functions */
19 e_mod_comp_layer_eval(E_Comp_Layer *ly)
21 e_layout_freeze(ly->layout);
25 ly->bg = evas_object_rectangle_add(ly->canvas->evas);
26 /* TODO: make it configurable */
27 if (!strncmp(ly->name, "move", strlen("move")))
28 evas_object_color_set(ly->bg, 0, 0, 0, 0);
29 else if (!strncmp(ly->name, "ly-ctrl", strlen("ly-ctrl")))
31 evas_object_color_set(ly->bg, 0, 255, 0, 80);
33 evas_object_color_set(ly->bg, 0, 0, 0, 0);
36 evas_object_color_set(ly->bg, 0, 0, 0, 255);
37 evas_object_show(ly->bg);
38 e_layout_pack(ly->layout, ly->bg);
40 e_layout_child_move(ly->bg, ly->x, ly->y);
41 e_layout_child_resize(ly->bg, ly->w, ly->h);
42 e_layout_child_lower(ly->bg);
44 evas_object_move(ly->layout, ly->x, ly->y);
45 evas_object_resize(ly->layout, ly->w, ly->h);
46 e_layout_virtual_size_set(ly->layout, ly->w, ly->h);
48 e_layout_thaw(ly->layout);
52 e_mod_comp_layer_populate(E_Comp_Layer *ly,
55 e_layout_pack(ly->layout, o);
59 e_mod_comp_layer_populate_above_normal(E_Comp_Layer *ly,
69 (ly->canvas->zone->container)))
74 /* try to look for the boundary of the normal layer in the E_Container */
75 Ecore_X_Window win = ly->canvas->zone->container->layers[3].win;
78 E_Comp *c = e_mod_comp_util_get();
79 Eina_Bool found = EINA_FALSE;
80 EINA_INLIST_REVERSE_FOREACH(c->wins, cw)
91 EINA_LIST_FOREACH(cw->objs, l, co)
93 e_layout_child_raise_above(o, co->shadow);
97 e_layout_child_raise(o);
101 e_mod_comp_layer_raise_above(E_Comp_Canvas *canvas,
111 (canvas->zone->container)))
116 E_Comp *c = e_mod_comp_util_get();
117 Eina_Bool found = EINA_FALSE;
118 EINA_INLIST_REVERSE_FOREACH(c->wins, cw)
120 if ((cw->bd) && (cw->bd == bd))
129 EINA_LIST_FOREACH(cw->objs, l, co)
131 e_layout_child_raise_above(o, co->shadow);
137 e_mod_comp_layer_lower_below(E_Comp_Canvas *canvas,
147 (canvas->zone->container)))
152 E_Comp *c = e_mod_comp_util_get();
153 Eina_Bool found = EINA_FALSE;
154 EINA_INLIST_REVERSE_FOREACH(c->wins, cw)
156 if ((cw->bd) && (cw->bd == bd))
165 EINA_LIST_FOREACH(cw->objs, l, co)
167 e_layout_child_lower_below(o, co->shadow);
172 /* adjust the stack position of the background object to the bottom of layer */
174 e_mod_comp_layer_bg_adjust(E_Comp_Layer *ly)
176 e_layout_freeze(ly->layout);
180 ly->bg = evas_object_rectangle_add(ly->canvas->evas);
181 evas_object_color_set(ly->bg, 0, 0, 0, 255);
182 evas_object_show(ly->bg);
183 e_layout_pack(ly->layout, ly->bg);
186 e_layout_child_lower(ly->bg);
188 e_layout_thaw(ly->layout);
192 e_mod_comp_layer_effect_set(E_Comp_Layer *ly,
195 if (strcmp(ly->name, "effect"))
201 ly->canvas->animation.run = 1;
202 ly->canvas->animation.num++;
204 if (!evas_object_visible_get(ly->layout))
206 e_mod_comp_composite_mode_set(ly->canvas->zone, EINA_TRUE);
207 evas_object_show(ly->layout);
212 /* decrease effect count and hide effect layer if it is 0 */
214 ly->canvas->animation.num--;
218 E_FREE_LIST(ly->objs, ly->canvas->comp->effect_funcs.object_free);
219 evas_object_hide(ly->layout);
221 ly->canvas->animation.run = 0;
222 ly->canvas->animation.num = 0;
225 e_mod_comp_composite_mode_set(ly->canvas->zone, EINA_FALSE);
231 e_mod_comp_layer_effect_get(E_Comp_Layer *ly)
233 E_CHECK_RETURN(ly, EINA_FALSE);
235 if (strcmp(ly->name, "effect"))
238 return ly->canvas->animation.run;
241 EAPI E_Comp_Effect_Object *
242 e_mod_comp_layer_effect_obj_get(E_Comp_Layer *ly,
245 E_Comp_Effect_Object *obj = NULL;
247 E_CHECK_RETURN(ly, NULL);
249 if (strcmp(ly->name, "effect"))
252 EINA_LIST_FOREACH(ly->objs, l, obj)
265 _ly_intercept_show(void *data,
268 E_Comp_Layer *ly = (E_Comp_Layer *)data;
270 ELBF(ELBT_COMP, 0, 0,
271 "%15.15s|name:%s layout:%p obj:%p",
272 "LY_PRE_SHOW", ly->name, ly->layout, obj);
274 /* TODO: an incontrollable effect layer show problem can occasionally occur. */
275 if (!strcmp(ly->name, "effect"))
277 if (!ly->canvas->animation.run)
279 ELBF(ELBT_COMP, 0, 0,
280 "%15.15s|name:%s layout:%p obj:%p SKIP SHOW run:%d",
281 "LY_PRE_SHOW", ly->name, ly->layout, obj,
282 ly->canvas->animation.run);
288 evas_object_show(obj);
292 _ly_intercept_hide(void *data,
295 E_Comp_Layer *ly = (E_Comp_Layer *)data;
297 ELBF(ELBT_COMP, 0, 0,
298 "%15.15s|name:%s layout:%p obj:%p",
299 "LY_PRE_HIDE", ly->name, ly->layout, obj);
301 evas_object_hide(obj);
304 /* externally accessible functions */
306 e_mod_comp_canvas_add(E_Comp *c,
309 E_Comp_Canvas *canvas;
312 E_CHECK_RETURN(c, 0);
314 canvas = E_NEW(E_Comp_Canvas, 1);
315 E_CHECK_RETURN(canvas, 0);
332 if (_comp_mod->conf->engine == ENGINE_GL)
337 if (_comp_mod->conf->indirect)
339 opt[opt_i] = ECORE_EVAS_GL_X11_OPT_INDIRECT;
344 if (_comp_mod->conf->vsync)
346 opt[opt_i] = ECORE_EVAS_GL_X11_OPT_VSYNC;
353 opt[opt_i] = ECORE_EVAS_GL_X11_OPT_NONE;
354 canvas->ee = ecore_evas_gl_x11_options_new(NULL, c->win, x, y, w, h, opt);
357 canvas->ee = ecore_evas_gl_x11_new(NULL, c->win, x, y, w, h);
365 if (_comp_mod->conf->engine == ENGINE_GL)
367 e_util_dialog_internal
368 (_("Compositor Warning"),
369 _("Your screen does not support OpenGL.<br>"
370 "Falling back to software engine."));
373 canvas->ee = ecore_evas_software_x11_new(NULL, c->win, x, y, w, h);
377 e_util_dialog_internal
378 (_("Compositor Error"),
379 _("Failed to initialize Ecore Evas."));
389 canvas->num = _canvas_num++;
391 ecore_evas_comp_sync_set(canvas->ee, 0);
392 canvas->evas = ecore_evas_get(canvas->ee);
394 evas_event_callback_add(canvas->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE,
396 evas_event_callback_add(canvas->evas, EVAS_CALLBACK_RENDER_FLUSH_POST,
399 canvas->bg_img = evas_object_rectangle_add(canvas->evas);
400 if (_comp_mod->conf->use_hwc)
402 ecore_evas_alpha_set(canvas->ee, EINA_TRUE);
403 evas_object_color_set(canvas->bg_img, 0, 0, 0, 0);
406 evas_object_color_set(canvas->bg_img, 0, 0, 0, 255);
408 evas_object_stack_below(canvas->bg_img, evas_object_bottom_get(canvas->evas));
409 evas_object_move(canvas->bg_img, 0, 0);
410 evas_object_resize(canvas->bg_img, w, h);
411 evas_object_show(canvas->bg_img);
413 ecore_evas_show(canvas->ee);
415 canvas->ee_win = ecore_evas_window_get(canvas->ee);
418 canvas->stereoscopic_mode = E_COMP_STEREO_MONO;
420 /* TODO: make a configurable list */
422 const char *names[] = {"comp", "effect", "move", "ly-ctrl"};
423 for (i = 0; i < 4; i++)
425 ly = E_NEW(E_Comp_Layer, 1);
426 E_CHECK_GOTO(ly, error_cleanup);
427 ly->name = strdup(names[i]);
434 ly->layout = e_layout_add(canvas->evas);
442 evas_object_color_set(ly->layout, 255, 255, 255, 255);
449 ly->need_init = EINA_TRUE;
451 e_mod_comp_layer_eval(ly);
453 if (!strcmp(names[i], "comp"))
454 evas_object_show(ly->layout);
456 evas_object_intercept_show_callback_add(ly->layout, _ly_intercept_show, ly);
457 evas_object_intercept_hide_callback_add(ly->layout, _ly_intercept_hide, ly);
459 canvas->layers = eina_list_append(canvas->layers, ly);
461 ELBF(ELBT_COMP, 0, i, "E_Comp_Layer:%s", names[i]);
464 // comp can create only one ecore_evas for H/W overlay window
465 // this limit will be removed later
466 if ((_comp_mod->conf->use_hw_ov) &&
467 ((!zone) || (zone->num == 0)) &&
470 canvas->ov = e_mod_comp_hw_ov_win_new(c->win, x, y, w, h);
473 c->use_hw_ov = EINA_TRUE;
474 e_mod_comp_hw_ov_win_root_set(canvas->ov, c->man->root);
478 canvas->zr = c->effect_funcs.zone_rotation_new(canvas);
479 E_CHECK_GOTO(canvas->zr, error_cleanup);
481 if (_comp_mod->conf->use_hwc)
483 if (c->hwcomp_funcs.hwcomp_new)
484 canvas->hwcomp = c->hwcomp_funcs.hwcomp_new(canvas);
486 canvas->hwcomp = NULL;
490 e_util_dialog_internal
491 (_("Compositor Error"),
492 _("Your screen does not support the HWC<br>"
493 "This is needed for it to function."));
498 _comp_mod->conf->nocomp_fs = 0;
501 c->canvases = eina_list_append(c->canvases, canvas);
507 c->effect_funcs.zone_rotation_free(canvas->zr);
509 EINA_LIST_FREE(canvas->layers, ly)
512 evas_object_del(ly->layout);
516 ecore_evas_free(canvas->ee);
518 memset(canvas, 0, sizeof(E_Comp_Canvas));
525 e_mod_comp_canvas_del(E_Comp_Canvas *canvas)
528 E_Comp *c = e_mod_comp_util_get();
530 if (_comp_mod->conf->use_hwc)
532 if (c->hwcomp_funcs.hwcomp_free)
533 c->hwcomp_funcs.hwcomp_free(canvas->hwcomp);
534 canvas->hwcomp = NULL;
539 evas_object_del(canvas->fps.fg);
540 canvas->fps.fg = NULL;
544 evas_object_del(canvas->fps.bg);
545 canvas->fps.bg = NULL;
549 evas_object_del(canvas->bg_img);
550 canvas->bg_img = NULL;
554 canvas->comp->effect_funcs.zone_rotation_free(canvas->zr);
559 e_mod_comp_hw_ov_win_free(canvas->ov);
561 canvas->comp->use_hw_ov = EINA_FALSE;
564 ecore_evas_gl_x11_pre_post_swap_callback_set(canvas->ee, NULL, NULL, NULL);
565 ecore_evas_manual_render(canvas->ee);
567 EINA_LIST_FREE(canvas->layers, ly)
570 evas_object_del(ly->layout);
574 ecore_evas_free(canvas->ee);
575 memset(canvas, 0, sizeof(E_Comp_Canvas));
580 e_mod_comp_canvas_layer_get(E_Comp_Canvas *canvas,
586 E_CHECK_RETURN(canvas, NULL);
587 E_CHECK_RETURN(name, NULL);
589 EINA_LIST_FOREACH(canvas->layers, l, ly)
591 if (!strcmp(ly->name, name))
599 e_mod_comp_canvas_fullscreen_check(E_Comp_Canvas *canvas)
601 E_Comp *c = canvas->comp;
602 E_Comp_Win *cw = NULL;
604 if (c->fake_image_launch)
606 Eina_Bool res = c->effect_funcs.image_launch_running_check(c->eff_img);
607 E_CHECK_RETURN(!res, NULL);
610 E_CHECK_RETURN(c->wins, NULL);
611 E_CHECK_RETURN(_comp_mod->conf->nocomp_fs, NULL);
613 EINA_INLIST_REVERSE_FOREACH(c->wins, cw)
615 if ((!cw->visible) ||
621 if (!E_INTERSECTS(canvas->x, canvas->y, canvas->w, canvas->h,
622 cw->x, cw->y, cw->w, cw->h))
626 #ifdef _F_USE_BORDER_TRANSFORM_
627 if ((cw) && (cw->bd) && (e_border_transform_enable_get(cw->bd)))
632 #endif /* end of _F_USE_BORDER_TRANSFORM_ */
634 if (REGION_EQUAL_TO_CANVAS(cw, canvas) &&
637 (cw->dmg_updates >= 1) &&
642 if (cw->always_selective_mode)
644 ELBF(ELBT_COMP, 0, 0, "ALWAYS_SELECTIVE_MODE [%x]", e_mod_comp_util_client_xid_get(cw));
657 e_mod_comp_canvas_nocomp_prepare(E_Comp_Canvas *canvas,
662 E_CHECK(canvas->nocomp.mode == E_NOCOMP_MODE_NONE);
664 canvas->nocomp.mode = E_NOCOMP_MODE_PREPARE;
665 canvas->nocomp.prepare.cw = cw;
666 canvas->nocomp.prepare.timer = ecore_timer_add(_comp_mod->conf->nocomp_begin_timeout,
667 _nocomp_prepare_timeout,
672 e_mod_comp_canvas_nocomp_begin(E_Comp_Canvas *canvas)
675 E_Comp_Win *cw = NULL;
677 E_CHECK_RETURN(canvas, EINA_FALSE);
679 E_CHECK_RETURN(c, EINA_FALSE);
680 cw = canvas->nocomp.prepare.cw;
681 E_CHECK_RETURN(cw, EINA_FALSE);
684 e_mod_comp_util_client_xid_get(cw),
685 "NOCOMP_BEGIN canvas:%d dmg:%d",
686 canvas->num, cw->dmg_updates);
688 e_mod_comp_hw_ov_win_msg_show
689 (E_COMP_LOG_TYPE_NOCOMP,
690 ">> %d NOCOMP 0x%x dmg:%d",
692 e_mod_comp_util_client_xid_get(cw),
699 ecore_x_composite_unredirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL);
705 Ecore_X_Region parts;
706 e_mod_comp_win_del_damage(cw, cw->damage);
707 parts = ecore_x_region_new(NULL, 0);
708 ecore_x_damage_subtract(cw->damage, 0, parts);
709 ecore_x_region_free(parts);
710 ecore_x_damage_free(cw->damage);
714 e_mod_comp_win_comp_objs_img_deinit(cw);
717 ecore_x_pixmap_free(cw->pixmap);
719 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
722 ecore_x_window_shape_rectangle_subtract(c->win,
730 ecore_evas_manual_render_set(canvas->ee, 1);
732 //c->render_overflow = OVER_FLOW;
733 canvas->nocomp.mode = E_NOCOMP_MODE_RUN;
734 canvas->nocomp.cw = cw;
735 canvas->nocomp.prepare.cw = NULL;
737 if (canvas->nocomp.prepare.timer)
739 ecore_timer_del(canvas->nocomp.prepare.timer);
740 canvas->nocomp.prepare.timer = NULL;
743 if (cw->update_timeout)
745 ecore_timer_del(cw->update_timeout);
746 cw->update_timeout = NULL;
754 e_mod_comp_win_shape_input_invalid_set(c, 1);
755 e_mod_comp_win_render_queue(cw);
761 e_mod_comp_canvas_nocomp_end(E_Comp_Canvas *canvas)
764 E_Comp_Win *cw = NULL;
766 E_CHECK_RETURN(_comp_mod->conf->nocomp_fs, EINA_FALSE);
769 E_CHECK_RETURN(c, EINA_FALSE);
771 cw = canvas->nocomp.cw;
772 E_CHECK_RETURN(cw, EINA_FALSE);
775 e_mod_comp_util_client_xid_get(cw),
776 "NOCOMP_END canvas:%d dmg:%d",
777 canvas->num, cw->dmg_updates);
779 e_mod_comp_hw_ov_win_msg_show
780 (E_COMP_LOG_TYPE_NOCOMP,
783 e_mod_comp_util_client_xid_get(cw));
788 cw->damage = ecore_x_damage_new
789 (cw->win, ECORE_X_DAMAGE_REPORT_DELTA_RECTANGLES);
790 e_mod_comp_win_add_damage(cw, cw->damage);
793 ecore_x_window_shape_rectangle_add(c->win,
800 ecore_x_composite_redirect_window(cw->win,
801 ECORE_X_COMPOSITE_UPDATE_MANUAL);
807 #if USE_NOCOMP_DISPOSE
808 canvas->nocomp.mode = E_NOCOMP_MODE_END;
809 canvas->nocomp.end.cw = cw;
810 canvas->nocomp.cw = NULL;
811 canvas->nocomp.end.dmg_updates = cw->dmg_updates + 2;
814 if (canvas->nocomp.end.timer)
816 ecore_timer_del(canvas->nocomp.end.timer);
817 canvas->nocomp.end.timer = NULL;
819 canvas->nocomp.end.timer = ecore_timer_add(2.0f,
823 e_mod_comp_canvas_nocomp_dispose(canvas);
829 e_mod_comp_canvas_nocomp_dispose(E_Comp_Canvas *canvas)
832 E_Comp_Win *cw = NULL;
837 E_CHECK_RETURN(_comp_mod->conf->nocomp_fs, EINA_FALSE);
838 #if USE_NOCOMP_DISPOSE
839 E_CHECK_RETURN((canvas->nocomp.mode == E_NOCOMP_MODE_END), EINA_FALSE);
843 E_CHECK_RETURN(c, EINA_FALSE);
845 #if USE_NOCOMP_DISPOSE
846 cw = canvas->nocomp.end.cw;
848 cw = canvas->nocomp.cw;
849 canvas->nocomp.cw = NULL;
851 E_CHECK_RETURN(cw, EINA_FALSE);
852 E_CHECK_GOTO(cw->win, finish);
855 e_mod_comp_util_client_xid_get(cw),
856 "NOCOMP_DISPOSE canvas:%d dmg:%d",
857 canvas->num, cw->dmg_updates);
859 if (canvas->nocomp.end.timer)
861 ecore_timer_del(canvas->nocomp.end.timer);
862 canvas->nocomp.end.timer = NULL;
865 pm = ecore_x_composite_name_window_pixmap_get(cw->win);
868 Ecore_X_Pixmap oldpm;
870 e_mod_comp_win_comp_objs_needxim_set(cw, 1);
875 ecore_x_pixmap_geometry_get(cw->pixmap, NULL, NULL, &(cw->pw), &(cw->ph));
876 if (!((cw->pw == cw->w) && (cw->ph == cw->h)))
879 e_mod_comp_util_client_xid_get(cw),
880 "NOCOMP_DISPOSE Size was not same. cw(w=%d, h=%d), pw(w=%d, h=%d)",
881 cw->w, cw->h, cw->pw, cw->ph);
883 #if USE_NOCOMP_DISPOSE
887 ecore_x_pixmap_free(pm);
890 if ((cw->pw > 0) && (cw->ph > 0))
892 e_mod_comp_win_comp_objs_img_resize(cw, cw->pw, cw->ph);
893 e_mod_comp_win_comp_objs_resize(cw, cw->pw, cw->ph);
901 if ((cw->pw <= 0) || (cw->ph <= 0))
903 e_mod_comp_win_comp_objs_img_deinit(cw);
906 ecore_x_pixmap_free(cw->pixmap);
912 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
913 e_mod_comp_win_comp_objs_native_set(cw, 0);
914 e_mod_comp_update_resize(cw->up, cw->pw, cw->ph);
915 e_mod_comp_update_add(cw->up, 0, 0, cw->pw, cw->ph);
916 if (oldpm) ecore_x_pixmap_free(oldpm);
918 if (((cw->c->gl && _comp_mod->conf->texture_from_pixmap) || _comp_mod->conf->use_efl_native_surface)
922 e_mod_comp_win_comp_objs_img_size_set(cw, cw->pw, cw->ph);
923 e_mod_comp_win_comp_objs_img_init(cw);
924 r = e_mod_comp_update_rects_get(cw->up);
927 for (i = 0; r[i].w > 0; i++)
930 x = r[i].x; y = r[i].y;
931 w = r[i].w; h = r[i].h;
932 e_mod_comp_win_comp_objs_img_data_update_add(cw, x, y, w, h);
934 e_mod_comp_update_clear(cw->up);
940 e_mod_comp_win_render_queue(cw);
943 ecore_evas_manual_render_set(canvas->ee, 0);
944 canvas->nocomp.end.cw = NULL;
945 canvas->nocomp.end.dmg_updates = 0;
946 canvas->nocomp.mode = E_NOCOMP_MODE_NONE;
953 e_mod_comp_canvas_stereo_layout_set(E_Comp_Canvas *canvas)
955 unsigned int stereo_mode = 0;
956 E_Comp_Layer *ly = NULL;
958 stereo_mode = canvas->stereoscopic_mode;
960 ly = e_mod_comp_canvas_layer_get(canvas, "comp");
964 e_layout_freeze(ly->layout);
965 if (stereo_mode == E_COMP_STEREO_HORIZONTAL)
967 e_layout_virtual_size_set(ly->layout, ly->w, (ly->h)*2);
969 else if (stereo_mode == E_COMP_STEREO_VERTICAL)
971 e_layout_virtual_size_set(ly->layout, (ly->w)*2, ly->h);
973 else if ((stereo_mode == E_COMP_STEREO_INTERLACED) ||
974 (stereo_mode == E_COMP_STEREO_MONO))
976 e_layout_virtual_size_set(ly->layout, ly->w, ly->h);
979 e_layout_thaw(ly->layout);
982 /* local subsystem functions */
984 _fps_update(E_Comp_Canvas *canvas)
987 double fps = 0.0, t, dt;
989 Evas_Coord x = 0, y = 0, w = 0, h = 0;
992 if (!_comp_mod->conf->fps_show) return;
994 t = ecore_time_get();
996 if (_comp_mod->conf->fps_average_range < 1)
997 _comp_mod->conf->fps_average_range = 30;
998 else if (_comp_mod->conf->fps_average_range > 120)
999 _comp_mod->conf->fps_average_range = 120;
1001 dt = t - canvas->fps.frametimes[_comp_mod->conf->fps_average_range - 1];
1003 if (dt > 0.0) fps = (double)_comp_mod->conf->fps_average_range / dt;
1006 if (fps > 0.0) snprintf(buf, sizeof(buf), "FPS: %1.1f", fps);
1007 else snprintf(buf, sizeof(buf), "FPS: N/A");
1009 for (i = 121; i >= 1; i--) canvas->fps.frametimes[i] = canvas->fps.frametimes[i - 1];
1010 canvas->fps.frametimes[0] = t;
1011 canvas->fps.frameskip++;
1013 if (canvas->fps.frameskip >= _comp_mod->conf->fps_average_range)
1015 canvas->fps.frameskip = 0;
1016 evas_object_text_text_set(canvas->fps.fg, buf);
1019 evas_object_geometry_get(canvas->fps.fg, NULL, NULL, &w, &h);
1027 switch (_comp_mod->conf->fps_corner)
1029 case 3: // bottom-right
1033 case 2: // bottom-left
1035 y = z->y + z->h - h;
1037 case 1: // top-right
1041 default: // 0 // top-left
1047 evas_object_move(canvas->fps.bg, x, y);
1048 evas_object_resize(canvas->fps.bg, w, h);
1049 evas_object_move(canvas->fps.fg, x + 4, y + 4);
1053 _pre_swap(void *data, Evas *e, void *event_info)
1055 E_Comp *c = (E_Comp *)data;
1057 E_Comp_Canvas *canvas;
1060 e_mod_comp_x_grab_set(c, EINA_FALSE);
1062 EINA_LIST_FOREACH(c->canvases, l, canvas)
1064 if (!canvas) continue;
1065 if (canvas->evas != e) continue;
1067 ELB(ELBT_COMP_RENDER, "----------------SWAP----------------", canvas->num);
1070 if ((_comp_mod->conf->use_hwc) && (c->hwcomp_funcs.fullcomp_pending_release))
1072 c->hwcomp_funcs.fullcomp_pending_release(canvas->hwcomp);
1075 if (_comp_mod->conf->fps_show)
1077 if (!canvas->fps.bg)
1079 canvas->fps.bg = evas_object_rectangle_add(canvas->evas);
1080 evas_object_color_set(canvas->fps.bg, 0, 0, 0, 128);
1081 evas_object_layer_set(canvas->fps.bg, EVAS_LAYER_MAX);
1082 evas_object_show(canvas->fps.bg);
1084 if (!canvas->fps.fg)
1086 canvas->fps.fg = evas_object_text_add(canvas->evas);
1087 evas_object_text_font_set(canvas->fps.fg, "Sans", 30);
1088 evas_object_text_text_set(canvas->fps.fg, "FPS: 0.0");
1089 evas_object_color_set(canvas->fps.fg, 255, 255, 255, 255);
1090 evas_object_layer_set(canvas->fps.fg, EVAS_LAYER_MAX);
1091 evas_object_show(canvas->fps.fg);
1093 _fps_update(canvas);
1099 evas_object_del(canvas->fps.fg);
1100 canvas->fps.fg = NULL;
1104 evas_object_del(canvas->fps.bg);
1105 canvas->fps.bg = NULL;
1112 _post_swap(void *data, Evas *e, void *event_info)
1114 E_Comp *c = (E_Comp *)data;
1116 E_CHECK(_comp_mod->conf->nocomp_fs);
1118 Eina_List *l = NULL;
1119 E_Comp_Canvas *canvas = NULL;
1120 E_Comp_Win *cw = NULL;
1121 EINA_LIST_FOREACH(c->canvases, l, canvas)
1123 if (canvas->evas != e) continue;
1124 if (canvas->nocomp.mode != E_NOCOMP_MODE_NONE) continue;
1125 if (canvas->nocomp.force_composite) continue;
1126 if (canvas->animation.run) continue;
1128 cw = e_mod_comp_canvas_fullscreen_check(canvas);
1131 e_mod_comp_canvas_nocomp_prepare(canvas, cw);
1136 _nocomp_prepare_timeout(void *data)
1138 E_Comp_Canvas *canvas = (E_Comp_Canvas *)data;
1140 E_CHECK_RETURN(canvas, ECORE_CALLBACK_CANCEL);
1142 if (canvas->nocomp.prepare.timer)
1144 ecore_timer_del(canvas->nocomp.prepare.timer);
1145 canvas->nocomp.prepare.timer = NULL;
1148 if ((canvas->nocomp.force_composite)||
1149 (canvas->animation.run))
1151 canvas->nocomp.prepare.cw = NULL;
1152 canvas->nocomp.mode = E_NOCOMP_MODE_NONE;
1153 return ECORE_CALLBACK_CANCEL;
1156 cw = e_mod_comp_canvas_fullscreen_check(canvas);
1159 canvas->nocomp.prepare.cw = NULL;
1160 canvas->nocomp.mode = E_NOCOMP_MODE_NONE;
1161 return ECORE_CALLBACK_CANCEL;
1163 else if (cw != canvas->nocomp.prepare.cw)
1165 canvas->nocomp.prepare.cw = cw;
1166 canvas->nocomp.prepare.timer = ecore_timer_add(_comp_mod->conf->nocomp_begin_timeout,
1167 _nocomp_prepare_timeout,
1169 return ECORE_CALLBACK_CANCEL;
1172 e_mod_comp_canvas_nocomp_begin(canvas);
1174 return ECORE_CALLBACK_CANCEL;
1177 #if USE_NOCOMP_DISPOSE
1179 _nocomp_end_timeout(void *data)
1181 E_Comp_Canvas *canvas = (E_Comp_Canvas *)data;
1182 if (canvas->nocomp.end.timer)
1184 ecore_timer_del(canvas->nocomp.end.timer);
1185 canvas->nocomp.end.timer = NULL;
1187 e_mod_comp_canvas_nocomp_dispose(canvas);
1188 return ECORE_CALLBACK_CANCEL;