2 #include "e_mod_comp.h"
3 #include "e_mod_comp_atoms.h"
4 #include "e_mod_comp_debug.h"
8 //////////////////////////////////////////////////////////////////////////
10 // TODO (no specific order):
11 // 1. abstract evas object and compwin so we can duplicate the object N times
12 // in N canvases - for winlist, everything, pager etc. too
13 // 2. implement "unmapped composite cache" -> N pixels worth of unmapped
14 // windows to be fully composited. only the most active/recent.
15 // 3. for unmapped windows - when window goes out of unmapped comp cache
16 // make a miniature copy (1/4 width+height?) and set property on window
18 // 8. obey transparent property
19 // 9. shortcut lots of stuff to draw inside the compositor - shelf,
20 // wallpaper, efm - hell even menus and anything else in e (this is what
21 // e18 was mostly about)
22 // 10. fullscreen windows need to be able to bypass compositing *seems buggy*
24 //////////////////////////////////////////////////////////////////////////
26 /* static global variables */
27 static Eina_List *handlers = NULL;
28 static Eina_List *compositors = NULL;
29 static Eina_Hash *windows = NULL;
30 static Eina_Hash *borders = NULL;
31 static Eina_Hash *damages = NULL;
33 /* static functions */
34 static void _e_mod_comp_render_queue(E_Comp *c);
35 static void _e_mod_comp_win_damage(E_Comp_Win *cw, int x, int y, int w, int h, Eina_Bool dmg);
36 static void _e_mod_comp_win_del(E_Comp_Win *cw);
37 static void _e_mod_comp_win_real_hide(E_Comp_Win *cw);
38 static void _e_mod_comp_win_hide(E_Comp_Win *cw);
39 static void _e_mod_comp_win_configure(E_Comp_Win *cw, int x, int y, int w, int h, int border);
40 static Eina_Bool _e_mod_comp_win_damage_timeout(void *data);
41 static void _e_mod_comp_win_raise(E_Comp_Win *cw);
42 static void _e_mod_comp_win_lower(E_Comp_Win *cw);
43 static E_Comp_Win *_e_mod_comp_win_find(Ecore_X_Window win);
44 static E_Comp_Win *_e_mod_comp_border_client_find(Ecore_X_Window win);
45 static Eina_Bool _e_mod_comp_cb_update(E_Comp *c);
46 static Eina_Bool _e_mod_comp_win_is_border(E_Comp_Win *cw);
47 static void _e_mod_comp_cb_pending_after(void *data, E_Manager *man, E_Manager_Comp_Source *src);
48 static E_Comp *_e_mod_comp_find(Ecore_X_Window root);
49 static void _e_mod_comp_win_render_queue(E_Comp_Win *cw);
50 static void _e_mod_comp_x_grab_set(E_Comp *c, Eina_Bool grab);
51 static Evas_Object *_e_mod_comp_win_mirror_add(E_Comp_Win *cw);
52 static void _e_mod_comp_cb_win_mirror_del(void *data, Evas *e, Evas_Object *obj, void *event_info);
53 static void _e_mod_comp_src_hidden_set_func(void *data, E_Manager *man, E_Manager_Comp_Source *src, Eina_Bool hidden);
54 static Eina_Bool _e_mod_comp_prop_window_use_dri2_get(Ecore_X_Window win);
55 static Eina_Bool _e_mod_comp_prop_use_dri2(Ecore_X_Event_Window_Property *ev);
57 ///////////////////////////////////////////////////////////////////////////////////
60 e_mod_comp_comp_event_src_visibility_send(E_Comp_Win *cw)
62 E_CHECK_RETURN(cw, 0);
63 E_CHECK_RETURN(cw->c, 0);
64 E_CHECK_RETURN(cw->c->man, 0);
67 e_manager_comp_event_src_visibility_send
68 (cw->c->man, (E_Manager_Comp_Source *)cw,
69 _e_mod_comp_cb_pending_after, cw->c);
75 _e_mod_comp_x_grab_set(E_Comp *c,
78 E_CHECK(_comp_mod->conf->grab);
80 E_CHECK((c->grabbed != grab));
89 _e_mod_comp_win_is_border(E_Comp_Win *cw)
91 E_CHECK_RETURN(cw, 0);
92 if (cw->bd) return EINA_TRUE;
93 else return EINA_FALSE;
97 _e_mod_comp_fps_update(E_Comp_Canvas *canvas)
100 double fps = 0.0, t, dt;
102 Evas_Coord x = 0, y = 0, w = 0, h = 0;
105 if (!_comp_mod->conf->fps_show) return;
107 t = ecore_time_get();
109 if (_comp_mod->conf->fps_average_range < 1)
110 _comp_mod->conf->fps_average_range = 30;
111 else if (_comp_mod->conf->fps_average_range > 120)
112 _comp_mod->conf->fps_average_range = 120;
114 dt = t - canvas->fps.frametimes[_comp_mod->conf->fps_average_range - 1];
116 if (dt > 0.0) fps = (double)_comp_mod->conf->fps_average_range / dt;
119 if (fps > 0.0) snprintf(buf, sizeof(buf), "FPS: %1.1f", fps);
120 else snprintf(buf, sizeof(buf), "FPS: N/A");
122 for (i = 121; i >= 1; i--) canvas->fps.frametimes[i] = canvas->fps.frametimes[i - 1];
123 canvas->fps.frametimes[0] = t;
124 canvas->fps.frameskip++;
126 if (canvas->fps.frameskip >= _comp_mod->conf->fps_average_range)
128 canvas->fps.frameskip = 0;
129 evas_object_text_text_set(canvas->fps.fg, buf);
132 evas_object_geometry_get(canvas->fps.fg, NULL, NULL, &w, &h);
140 switch (_comp_mod->conf->fps_corner)
142 case 3: // bottom-right
146 case 2: // bottom-left
154 default: // 0 // top-left
160 evas_object_move(canvas->fps.bg, x, y);
161 evas_object_resize(canvas->fps.bg, w, h);
162 evas_object_move(canvas->fps.fg, x + 4, y + 4);
166 e_mod_comp_fps_toggle(void)
173 if (_comp_mod->conf->fps_show)
175 _comp_mod->conf->fps_show = 0;
179 _comp_mod->conf->fps_show = 1;
181 e_config_save_queue();
182 EINA_LIST_FOREACH(compositors, l, c) _e_mod_comp_cb_update(c);
187 e_mod_comp_win_add_damage(E_Comp_Win *cw,
190 E_CHECK_RETURN(cw, 0);
191 E_CHECK_RETURN(dmg, 0);
192 return eina_hash_add(damages, e_util_winid_str_get(dmg), cw);
196 e_mod_comp_win_del_damage(E_Comp_Win *cw,
199 E_CHECK_RETURN(cw, 0);
200 E_CHECK_RETURN(dmg, 0);
201 return eina_hash_del(damages, e_util_winid_str_get(dmg), cw);
205 _e_mod_comp_cb_pending_after(void *data __UNUSED__,
206 E_Manager *man __UNUSED__,
207 E_Manager_Comp_Source *src)
209 E_Comp_Win *cw = (E_Comp_Win *)src;
211 if (!cw->delete_pending) return;
212 if (cw->pending_count == 0)
218 static inline Eina_Bool
219 _e_mod_comp_shaped_check(int w,
221 const Ecore_X_Rectangle *rects,
224 if ((!rects) || (num < 1)) return EINA_FALSE;
225 if (num > 1) return EINA_TRUE;
226 if ((rects[0].x == 0) && (rects[0].y == 0) &&
227 ((int)rects[0].width == w) && ((int)rects[0].height == h))
232 static inline Eina_Bool
233 _e_mod_comp_win_shaped_check(const E_Comp_Win *cw,
234 const Ecore_X_Rectangle *rects,
237 return _e_mod_comp_shaped_check(cw->w, cw->h, rects, num);
241 _e_mod_comp_win_shape_rectangles_apply(E_Comp_Win *cw,
242 const Ecore_X_Rectangle *rects,
250 if (!_e_mod_comp_win_shaped_check(cw, rects, num))
254 EINA_LIST_FOREACH(cw->objs, l, co)
258 unsigned int *pix, *p;
259 unsigned char *spix, *sp;
262 evas_object_image_size_get(co->img, &w, &h);
263 if ((w > 0) && (h > 0))
265 if (co->native) return;
266 evas_object_image_native_surface_set(co->img, NULL);
267 evas_object_image_alpha_set(co->img, 1);
268 EINA_LIST_FOREACH(co->img_mirror, ll, o)
270 evas_object_image_native_surface_set(o, NULL);
271 evas_object_image_alpha_set(o, 1);
274 pix = evas_object_image_data_get(co->img, 1);
277 spix = calloc(w * h, sizeof(unsigned char));
280 for (i = 0; i < num; i++)
284 rx = rects[i].x; ry = rects[i].y;
285 rw = rects[i].width; rh = rects[i].height;
286 E_RECTS_CLIP_TO_RECT(rx, ry, rw, rh, 0, 0, w, h);
287 sp = spix + (w * ry) + rx;
288 for (py = 0; py < rh; py++)
290 for (px = 0; px < rw; px++)
299 for (py = 0; py < h; py++)
301 for (px = 0; px < w; px++)
303 unsigned int mask, imask;
304 mask = ((unsigned int)(*sp)) << 24;
308 *p = mask | (*p & imask);
315 evas_object_image_data_set(co->img, pix);
316 evas_object_image_data_update_add(co->img, 0, 0, w, h);
317 EINA_LIST_FOREACH(co->img_mirror, ll, o)
319 evas_object_image_data_set(o, pix);
320 evas_object_image_data_update_add(o, 0, 0, w, h);
329 unsigned int *pix, *p;
332 evas_object_image_size_get(co->img, &w, &h);
333 if ((w > 0) && (h > 0))
335 if (co->native) return;
336 evas_object_image_alpha_set(co->img, 0);
337 EINA_LIST_FOREACH(co->img_mirror, l, o)
339 evas_object_image_alpha_set(o, 1);
341 pix = evas_object_image_data_get(co->img, 1);
345 for (py = 0; py < h; py++)
347 for (px = 0; px < w; px++)
351 evas_object_image_data_set(co->img, pix);
352 evas_object_image_data_update_add(co->img, 0, 0, w, h);
353 EINA_LIST_FOREACH(co->img_mirror, ll, o)
355 evas_object_image_data_set(o, pix);
356 evas_object_image_data_update_add(o, 0, 0, w, h);
360 // dont need to fix alpha chanel as blending
361 // should be totally off here regardless of
362 // alpha channel content
368 _e_mod_comp_win_update(E_Comp_Win *cw)
373 if (_comp_mod->conf->use_hw_ov &&
374 TYPE_INDICATOR_CHECK(cw))
377 E_Comp_Canvas *canvas;
378 EINA_LIST_FOREACH(cw->c->canvases, l, canvas)
380 if (!canvas) continue;
381 if (!canvas->ov) continue;
382 e_mod_comp_hw_ov_win_update(canvas->ov, cw);
388 _e_mod_comp_x_grab_set(cw->c, EINA_TRUE);
402 if (cw->shape_changed)
410 ecore_x_pixmap_geometry_get(cw->win, NULL, NULL, &(cw->w), &(cw->h));
411 cw->rects = ecore_x_window_shape_rectangles_get(cw->win, &(cw->rects_num));
414 for (i = 0; i < cw->rects_num; i++)
416 E_RECTS_CLIP_TO_RECT(cw->rects[i].x,
423 if (!_e_mod_comp_win_shaped_check(cw, cw->rects, cw->rects_num))
429 if ((cw->rects) && (!cw->shaped))
433 else if ((!cw->rects) && (cw->shaped))
440 if ((cw->needpix) && (cw->dmg_updates <= 0))
442 _e_mod_comp_x_grab_set(cw->c, EINA_FALSE);
446 if ((!cw->pixmap) || (cw->needpix))
448 Ecore_X_Pixmap pm = 0;
449 pm = ecore_x_composite_name_window_pixmap_get(cw->win);
452 Ecore_X_Pixmap oldpm;
454 e_mod_comp_win_comp_objs_needxim_set(cw, 1);
459 ecore_x_pixmap_geometry_get(cw->pixmap, NULL, NULL, &(cw->pw), &(cw->ph));
460 // pixmap's size is not equal with window's size case
461 if (!((cw->pw == cw->w) && (cw->ph == cw->h)))
467 ecore_x_pixmap_free(pm);
468 _e_mod_comp_x_grab_set(cw->c, EINA_FALSE);
471 if ((cw->pw > 0) && (cw->ph > 0))
472 e_mod_comp_win_comp_objs_img_resize(cw, cw->pw, cw->ph);
479 if ((cw->pw <= 0) || (cw->ph <= 0))
481 e_mod_comp_win_comp_objs_img_deinit(cw);
484 ecore_x_pixmap_free(cw->pixmap);
490 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
491 e_mod_comp_win_comp_objs_native_set(cw, 0);
492 e_mod_comp_update_resize(cw->up, cw->pw, cw->ph);
493 e_mod_comp_update_add(cw->up, 0, 0, cw->pw, cw->ph);
494 if (oldpm) ecore_x_pixmap_free(oldpm);
498 if (!((cw->pw > 0) && (cw->ph > 0)))
500 _e_mod_comp_x_grab_set(cw->c, EINA_FALSE);
504 // update obj geometry when task switcher is not open
505 // or task switcher is open and new window is added
506 cw->defer_move_resize = EINA_FALSE;
507 if ((!cw->c->switcher) ||
508 ((cw->c->switcher) && (!cw->first_show_worked)) ||
509 ((cw->c->switcher) && TYPE_INDICATOR_CHECK(cw)))
512 e_mod_comp_win_comp_objs_move(cw, cw->x, cw->y);
513 e_mod_comp_win_comp_objs_resize(cw,
514 cw->pw + (cw->border * 2),
515 cw->ph + (cw->border * 2));
519 cw->defer_move_resize = EINA_TRUE;
523 && (_comp_mod->conf->texture_from_pixmap)
527 e_mod_comp_win_comp_objs_img_size_set(cw, cw->pw, cw->ph);
528 e_mod_comp_win_comp_objs_img_init(cw);
530 r = e_mod_comp_update_rects_get(cw->up);
533 for (i = 0; r[i].w > 0; i++)
536 x = r[i].x; y = r[i].y;
537 w = r[i].w; h = r[i].h;
538 e_mod_comp_win_comp_objs_img_data_update_add(cw, x, y, w, h);
540 e_mod_comp_update_clear(cw->up);
549 EINA_LIST_FOREACH(cw->objs, l, co)
553 evas_object_image_native_surface_set(co->img, NULL);
554 EINA_LIST_FOREACH(co->img_mirror, ll, o)
556 evas_object_image_native_surface_set(o, NULL);
565 evas_object_image_size_set(co->img, 1, 1);
566 evas_object_image_data_set(co->img, NULL);
567 EINA_LIST_FOREACH(co->img_mirror, ll, o)
569 evas_object_image_size_set(o, 1, 1);
570 evas_object_image_data_set(o, NULL);
572 ecore_x_image_free(co->xim);
578 if ((co->xim = ecore_x_image_new(cw->pw, cw->ph, cw->vis, cw->depth)))
579 e_mod_comp_update_add(cw->up, 0, 0, cw->pw, cw->ph);
582 r = e_mod_comp_update_rects_get(cw->up);
585 EINA_LIST_FOREACH(cw->objs, l, co)
591 pix = ecore_x_image_data_get(co->xim, NULL, NULL, NULL);
592 evas_object_image_data_set(co->img, pix);
593 evas_object_image_size_set(co->img, cw->pw, cw->ph);
594 EINA_LIST_FOREACH(co->img_mirror, ll, o)
596 evas_object_image_data_set(o, pix);
597 evas_object_image_size_set(o, cw->pw, cw->ph);
600 e_mod_comp_update_clear(cw->up);
601 for (i = 0; r[i].w > 0; i++)
604 x = r[i].x; y = r[i].y;
605 w = r[i].w; h = r[i].h;
606 if (!ecore_x_image_get(co->xim, cw->pixmap, x, y, x, y, w, h))
608 e_mod_comp_update_add(cw->up, x, y, w, h);
613 // why do we neeed these 2? this smells wrong
614 pix = ecore_x_image_data_get(co->xim, NULL, NULL, NULL);
615 evas_object_image_data_set(co->img, pix);
616 evas_object_image_data_update_add(co->img, x, y, w, h);
617 EINA_LIST_FOREACH(co->img_mirror, ll, o)
619 evas_object_image_data_set(o, pix);
620 evas_object_image_data_update_add(o, x, y, w, h);
629 _e_mod_comp_win_shape_rectangles_apply(cw, cw->rects, cw->rects_num);
633 if (cw->shape_changed)
634 _e_mod_comp_win_shape_rectangles_apply(cw, cw->rects, cw->rects_num);
636 cw->shape_changed = 0;
639 e_mod_comp_win_comp_objs_show(cw);
640 e_mod_comp_effect_win_rotation_handler_update(cw);
641 _e_mod_comp_x_grab_set(cw->c, EINA_FALSE);
645 e_mod_comp_pre_swap(void *data,
648 E_Comp *c = (E_Comp *)data;
650 E_Comp_Canvas *canvas;
653 _e_mod_comp_x_grab_set(c, EINA_FALSE);
655 EINA_LIST_FOREACH(c->canvases, l, canvas)
657 if (!canvas) continue;
658 if (canvas->evas != e) continue;
660 L(LT_EVENT_X, "[COMP] %31s canvas:%d\n", "PRE_SWAP",
661 canvas->zone ? canvas->zone->num : -1);
663 e_mod_comp_hw_ov_win_msg_show
664 (E_COMP_LOG_TYPE_SWAP,
665 "%d %s SWAP a%d m%d",
667 canvas->nocomp.run ? "NOCOMP" : "COMP",
668 canvas->animation.num,
669 ecore_evas_manual_render_get(canvas->ee));
671 if (_comp_mod->conf->fps_show)
675 canvas->fps.bg = evas_object_rectangle_add(canvas->evas);
676 evas_object_color_set(canvas->fps.bg, 0, 0, 0, 128);
677 evas_object_layer_set(canvas->fps.bg, EVAS_LAYER_MAX);
678 evas_object_show(canvas->fps.bg);
682 canvas->fps.fg = evas_object_text_add(canvas->evas);
683 evas_object_text_font_set(canvas->fps.fg, "Sans", 30);
684 evas_object_text_text_set(canvas->fps.fg, "FPS: 0.0");
685 evas_object_color_set(canvas->fps.fg, 255, 255, 255, 255);
686 evas_object_layer_set(canvas->fps.fg, EVAS_LAYER_MAX);
687 evas_object_show(canvas->fps.fg);
689 _e_mod_comp_fps_update(canvas);
695 evas_object_del(canvas->fps.fg);
696 canvas->fps.fg = NULL;
700 evas_object_del(canvas->fps.bg);
701 canvas->fps.bg = NULL;
708 _e_mod_comp_cb_delayed_update_timer(void *data)
711 _e_mod_comp_render_queue(c);
712 c->new_up_timer = NULL;
713 return ECORE_CALLBACK_CANCEL;
717 _e_mod_comp_fullscreen_check(E_Comp *c,
718 E_Comp_Canvas *canvas)
721 E_Zone *z = canvas->zone;
722 if (!c->wins) return NULL;
723 if (!_comp_mod->conf->nocomp_fs) return NULL;
724 EINA_INLIST_REVERSE_FOREACH(c->wins, cw)
729 if ((!cw->visible) ||
735 if (!E_INTERSECTS(z->x, z->y, z->w, z->h,
736 cw->x, cw->y, cw->w, cw->h))
740 if (TYPE_INDICATOR_CHECK(cw)) continue;
741 if (REGION_EQUAL_TO_ZONE(cw, z) &&
744 (cw->dmg_updates >= 1) &&
756 _e_mod_comp_nocomp_begin(E_Comp *c,
757 E_Comp_Canvas *canvas,
761 "[COMP] %31s w:0x%08x canvas:%d dmg:%d\n",
762 "NOCOMP_BEGIN", e_mod_comp_util_client_xid_get(cw),
763 canvas->num, cw->dmg_updates);
765 e_mod_comp_hw_ov_win_msg_show
766 (E_COMP_LOG_TYPE_NOCOMP,
767 ">> %d NOCOMP 0x%x dmg:%d",
769 e_mod_comp_util_client_xid_get(cw),
773 ecore_evas_manual_render_set(canvas->ee, 1);
775 c->render_overflow = OVER_FLOW;
776 canvas->nocomp.run = 1;
777 canvas->nocomp.cw = cw;
781 ecore_x_composite_unredirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL);
786 Ecore_X_Region parts;
787 eina_hash_del(damages, e_util_winid_str_get(cw->damage), cw);
788 parts = ecore_x_region_new(NULL, 0);
789 ecore_x_damage_subtract(cw->damage, 0, parts);
790 ecore_x_region_free(parts);
791 ecore_x_damage_free(cw->damage);
794 if (cw->update_timeout)
796 ecore_timer_del(cw->update_timeout);
797 cw->update_timeout = NULL;
800 e_mod_comp_win_comp_objs_img_deinit(cw);
803 ecore_x_pixmap_free(cw->pixmap);
805 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
811 _e_mod_comp_render_queue(c);
812 e_mod_comp_win_shape_input_invalid_set(c, 1);
813 ecore_x_window_shape_rectangle_subtract(c->win,
824 _e_mod_comp_nocomp_end(E_Comp *c,
825 E_Comp_Canvas *canvas,
828 Ecore_X_Pixmap pm = 0;
832 if (!_comp_mod->conf->nocomp_fs) return EINA_FALSE;
835 "[COMP] %31s new_w:0x%08x nocomp.cw:0x%08x canvas:%d\n",
836 "NOCOMP_END", cw ? e_mod_comp_util_client_xid_get(cw) : 0,
837 e_mod_comp_util_client_xid_get(canvas->nocomp.cw),
840 e_mod_comp_hw_ov_win_msg_show
841 (E_COMP_LOG_TYPE_NOCOMP,
844 cw ? e_mod_comp_util_client_xid_get(cw) : 0);
847 ecore_evas_manual_render_set(canvas->ee, 0);
848 ecore_x_window_shape_rectangle_add(c->win,
856 c->render_overflow = OVER_FLOW;
857 canvas->nocomp.run = 0;
858 canvas->nocomp.cw = NULL;
873 e_mod_comp_win_comp_objs_img_deinit(cw);
876 ecore_x_pixmap_free(cw->pixmap);
878 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
886 ecore_x_composite_redirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL);
890 pm = ecore_x_composite_name_window_pixmap_get(cw->win);
893 Ecore_X_Pixmap oldpm;
895 e_mod_comp_win_comp_objs_needxim_set(cw, 1);
900 ecore_x_pixmap_geometry_get(cw->pixmap, NULL, NULL, &(cw->pw), &(cw->ph));
901 if (!((cw->pw == cw->w) && (cw->ph == cw->h)))
907 ecore_x_pixmap_free(pm);
909 if ((cw->pw > 0) && (cw->ph > 0))
910 e_mod_comp_win_comp_objs_img_resize(cw, cw->pw, cw->ph);
917 if ((cw->pw <= 0) || (cw->ph <= 0))
919 e_mod_comp_win_comp_objs_img_deinit(cw);
922 ecore_x_pixmap_free(cw->pixmap);
928 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
929 e_mod_comp_win_comp_objs_native_set(cw, 0);
930 e_mod_comp_update_resize(cw->up, cw->pw, cw->ph);
931 e_mod_comp_update_add(cw->up, 0, 0, cw->pw, cw->ph);
932 if (oldpm) ecore_x_pixmap_free(oldpm);
935 && (_comp_mod->conf->texture_from_pixmap)
939 e_mod_comp_win_comp_objs_img_size_set(cw, cw->pw, cw->ph);
940 e_mod_comp_win_comp_objs_img_init(cw);
941 r = e_mod_comp_update_rects_get(cw->up);
944 for (i = 0; r[i].w > 0; i++)
947 x = r[i].x; y = r[i].y;
948 w = r[i].w; h = r[i].h;
949 e_mod_comp_win_comp_objs_img_data_update_add(cw, x, y, w, h);
951 e_mod_comp_update_clear(cw->up);
958 cw->damage = ecore_x_damage_new
959 (cw->win, ECORE_X_DAMAGE_REPORT_DELTA_RECTANGLES);
960 eina_hash_add(damages, e_util_winid_str_get(cw->damage), cw);
968 e_mod_comp_post_swap(void *data,
971 E_Comp *c = (E_Comp *)data;
973 E_Comp_Canvas *canvas;
977 if (!_comp_mod->conf->nocomp_fs) return;
979 EINA_LIST_FOREACH(c->canvases, l, canvas)
981 if (!canvas) continue;
982 if (canvas->nocomp.run) continue;
983 if (canvas->evas != e) continue;
984 if (canvas->nocomp.force_composite) continue;
985 if (canvas->animation.run) continue;
986 cw = _e_mod_comp_fullscreen_check(c, canvas);
988 _e_mod_comp_nocomp_begin(canvas->comp,
994 _e_mod_comp_cb_update(E_Comp *c)
998 E_Comp_Canvas *canvas;
999 Eina_List *new_updates = NULL;
1000 Eina_List *update_done = NULL;
1002 c->update_job = NULL;
1004 if (_comp_mod->conf->nocomp_fs)
1006 EINA_LIST_FOREACH(c->canvases, l, canvas)
1008 if (!canvas) continue;
1009 if (!canvas->nocomp.run) continue;
1010 cw = _e_mod_comp_fullscreen_check(c, canvas);
1011 if ((!cw) || (cw != canvas->nocomp.cw) ||
1012 (canvas->nocomp.force_composite))
1015 "[COMP] %31s new_w:0x%08x nocomp.cw:0x%08x canvas:%d\n",
1016 "NOCOMP_END", cw ? e_mod_comp_util_client_xid_get(cw) : 0,
1017 e_mod_comp_util_client_xid_get(canvas->nocomp.cw),
1020 _e_mod_comp_nocomp_end(canvas->comp,
1027 _e_mod_comp_x_grab_set(c, EINA_TRUE);
1029 EINA_LIST_FREE(c->updates, cw)
1032 if (_comp_mod->conf->efl_sync)
1034 if (((cw->counter) && (cw->drawme)) || (!cw->counter))
1036 _e_mod_comp_win_update(cw);
1039 update_done = eina_list_append(update_done, cw);
1047 _e_mod_comp_win_update(cw);
1049 new_updates = eina_list_append(new_updates, cw);
1052 if (_comp_mod->conf->efl_sync)
1054 EINA_LIST_FREE(update_done, cw)
1057 ecore_x_sync_counter_inc(cw->counter, 1);
1058 cw->sync_info.val++;
1061 "[COMP] %31.31s w:0x%08x done:%d val:%d\n",
1062 "INC", e_mod_comp_util_client_xid_get(cw),
1063 cw->sync_info.done_count, cw->sync_info.val);
1066 e_mod_comp_win_shape_input_update(c);
1067 _e_mod_comp_x_grab_set(c, EINA_FALSE);
1070 if (c->new_up_timer) ecore_timer_del(c->new_up_timer);
1072 ecore_timer_add(0.001, _e_mod_comp_cb_delayed_update_timer, c);
1074 c->updates = new_updates;
1075 if (!c->animating) c->render_overflow--;
1078 e_mod_comp_effect_signal_flush();
1080 if (c->render_overflow <= 0)
1082 c->render_overflow = 0;
1083 if (c->render_animator) c->render_animator = NULL;
1084 return ECORE_CALLBACK_CANCEL;
1086 return ECORE_CALLBACK_RENEW;
1090 _e_mod_comp_cb_job(void *data)
1092 _e_mod_comp_cb_update(data);
1096 _e_mod_comp_cb_animator(void *data)
1098 return _e_mod_comp_cb_update(data);
1102 _e_mod_comp_render_queue(E_Comp *c)
1104 if (_comp_mod->conf->lock_fps)
1106 if (c->render_animator)
1108 c->render_overflow = OVER_FLOW;
1111 c->render_animator = ecore_animator_add(_e_mod_comp_cb_animator, c);
1117 ecore_job_del(c->update_job);
1118 c->update_job = NULL;
1119 c->render_overflow = 0;
1121 c->update_job = ecore_job_add(_e_mod_comp_cb_job, c);
1126 _e_mod_comp_win_render_queue(E_Comp_Win *cw)
1128 _e_mod_comp_render_queue(cw->c);
1132 _e_mod_comp_find(Ecore_X_Window root)
1136 EINA_LIST_FOREACH(compositors, l, c)
1139 if (c->man->root == root) return c;
1145 _e_mod_comp_win_find(Ecore_X_Window win)
1147 return eina_hash_find(windows, e_util_winid_str_get(win));
1151 _e_mod_comp_border_client_find(Ecore_X_Window win)
1153 return eina_hash_find(borders, e_util_winid_str_get(win));
1156 /* wrapper function for external file */
1157 EINTERN E_Comp_Win *
1158 e_mod_comp_win_find(Ecore_X_Window win)
1160 return _e_mod_comp_win_find(win);
1163 EINTERN E_Comp_Win *
1164 e_mod_comp_border_client_find(Ecore_X_Window win)
1166 return _e_mod_comp_border_client_find(win);
1170 e_mod_comp_find(Ecore_X_Window win)
1172 E_CHECK_RETURN(win, 0);
1173 return _e_mod_comp_find(win);
1177 e_mod_comp_win_render_queue(E_Comp_Win *cw)
1180 _e_mod_comp_win_render_queue(cw);
1184 e_mod_comp_win_damage_timeout(void *data)
1186 E_CHECK_RETURN(data, 0);
1187 return _e_mod_comp_win_damage_timeout(data);
1191 e_mod_comp_cb_update(E_Comp *c)
1193 E_CHECK_RETURN(c, 0);
1194 return _e_mod_comp_cb_update(c);
1197 EINTERN Evas_Object *
1198 e_mod_comp_win_mirror_add(E_Comp_Win *cw)
1200 E_CHECK_RETURN(cw, 0);
1201 return _e_mod_comp_win_mirror_add(cw);
1205 e_mod_comp_cb_win_mirror_del(void *data,
1211 _e_mod_comp_cb_win_mirror_del(data,
1218 e_mod_comp_src_hidden_set_func(void *data,
1220 E_Manager_Comp_Source *src,
1223 _e_mod_comp_src_hidden_set_func(data, man, src, hidden);
1227 _e_mod_comp_win_damage_find(Ecore_X_Damage damage)
1229 return eina_hash_find(damages, e_util_winid_str_get(damage));
1233 _e_mod_comp_win_is_borderless(E_Comp_Win *cw)
1235 if (!cw->bd) return 1;
1236 if ((cw->bd->client.border.name) &&
1237 (!strcmp(cw->bd->client.border.name, "borderless")))
1243 _e_mod_comp_win_damage_timeout(void *data)
1245 E_Comp_Win *cw = data;
1246 E_CHECK_RETURN(cw, 0);
1250 if (cw->update_timeout)
1252 ecore_timer_del(cw->update_timeout);
1253 cw->update_timeout = NULL;
1256 cw->c->updates = eina_list_append(cw->c->updates, cw);
1259 _e_mod_comp_win_render_queue(cw);
1260 if (cw->update_timeout)
1262 ecore_timer_del(cw->update_timeout);
1263 cw->update_timeout = NULL;
1265 return ECORE_CALLBACK_CANCEL;
1269 _e_mod_comp_object_del(void *data,
1272 E_Comp_Win *cw = (E_Comp_Win *)data;
1275 _e_mod_comp_win_render_queue(cw);
1281 Ecore_X_Window _w = e_mod_comp_util_client_xid_get(cw);
1282 ecore_x_e_comp_sync_cancel_send(_w);
1283 ecore_x_sync_counter_inc(cw->counter, 1);
1284 cw->sync_info.val++;
1286 if (cw->bd) eina_hash_del(borders, e_util_winid_str_get(cw->bd->client.win), cw);
1288 e_mod_comp_win_comp_objs_data_del(cw, "border");
1290 else if (obj == cw->pop)
1293 e_mod_comp_win_comp_objs_data_del(cw, "popup");
1295 else if (obj == cw->menu)
1298 e_mod_comp_win_comp_objs_data_del(cw, "menu");
1302 e_object_delfn_del(obj, cw->dfn);
1308 e_mod_comp_done_defer(E_Comp_Win *cw)
1311 e_mod_comp_effect_disable_stage(cw->c, cw);
1312 e_mod_comp_effect_animating_set(cw->c, cw, EINA_FALSE);
1314 if (cw->defer_raise)
1317 "[COMP] w:0x%08x force win to raise. bd:%s\n",
1318 e_mod_comp_util_client_xid_get(cw),
1319 cw->bd ? "O" : "X");
1322 EINA_INLIST_FOREACH(cw->c->wins, _cw)
1325 e_mod_comp_win_comp_objs_raise(_cw);
1326 Eina_Bool run = e_mod_comp_effect_win_roation_run_check(_cw->eff_winrot);
1330 E_Comp_Canvas *canvas;
1332 EINA_LIST_FOREACH(_cw->c->canvases, l, canvas)
1334 if (!canvas) continue;
1335 if (!canvas->use_bg_img) continue;
1336 EINA_LIST_FOREACH(_cw->objs, ll, co)
1339 if (co->canvas == canvas)
1341 evas_object_stack_below(canvas->bg_img,
1347 cw->defer_raise = EINA_FALSE;
1348 e_mod_comp_effect_signal_add
1349 (cw, NULL, "e,state,raise_above_post,on", "e");
1355 "[COMP] %31s w:0x%08x force win to hide. bd:%s\n",
1356 "EDJ_DONE", e_mod_comp_util_client_xid_get(cw),
1357 cw->bd ? "O" : "X");
1359 _e_mod_comp_win_hide(cw);
1365 "[COMP] %31s w:0x%08x force win to delete. bd:%s\n",
1366 "EDJ_DONE", e_mod_comp_util_client_xid_get(cw),
1367 cw->bd ? "O" : "X");
1369 _e_mod_comp_win_del(cw);
1375 _e_mod_comp_show_done(void *data,
1377 const char *emission __UNUSED__,
1378 const char *source __UNUSED__)
1380 E_Comp_Win *cw = (E_Comp_Win *)data;
1383 LOG(LOG_DEBUG, "LAUNCH",
1384 "[e17:Application:Launching:done] win:0x%07x name:%s",
1385 cw->bd ? cw->bd->client.win : cw->win,
1386 cw->bd ? cw->bd->client.netwm.name : NULL);
1389 "[COMP] %18.18s w:0x%08x %s\n", "SIGNAL",
1390 e_mod_comp_util_client_xid_get(cw),
1393 e_mod_comp_effect_signal_del(cw, obj, "show,done");
1395 cw->show_done = EINA_TRUE;
1396 e_mod_comp_done_defer(cw);
1400 _e_mod_comp_hide_done(void *data,
1402 const char *emission __UNUSED__,
1403 const char *source __UNUSED__)
1405 E_Comp_Win *cw = (E_Comp_Win *)data;
1409 "[COMP] %18.18s w:0x%08x %s\n", "SIGNAL",
1410 e_mod_comp_util_client_xid_get(cw),
1413 e_mod_comp_effect_signal_del(cw, obj, "hide,done");
1415 cw->show_done = EINA_FALSE;
1416 e_mod_comp_done_defer(cw);
1420 _e_mod_comp_raise_above_hide_done(void *data,
1422 const char *emission __UNUSED__,
1423 const char *source __UNUSED__)
1425 E_Comp_Win *cw = data;
1429 "[COMP] %18.18s w:0x%08x %s\n", "SIGNAL",
1430 e_mod_comp_util_client_xid_get(cw),
1433 e_mod_comp_effect_signal_del(cw, obj, "raise,hide,done");
1435 e_mod_comp_done_defer(cw);
1439 _e_mod_comp_background_show_done(void *data,
1441 const char *emission __UNUSED__,
1442 const char *source __UNUSED__)
1444 E_Comp_Win *cw = data;
1448 "[COMP] %18.18s w:0x%08x %s\n", "SIGNAL",
1449 e_mod_comp_util_client_xid_get(cw),
1452 e_mod_comp_effect_signal_del(cw, obj, "bg,show,done");
1454 e_mod_comp_done_defer(cw);
1458 _e_mod_comp_background_hide_done(void *data,
1460 const char *emission __UNUSED__,
1461 const char *source __UNUSED__)
1463 E_Comp_Win *cw = data;
1467 "[COMP] %18.18s w:0x%08x %s\n", "SIGNAL",
1468 e_mod_comp_util_client_xid_get(cw),
1471 e_mod_comp_effect_signal_del(cw, obj, "bg,hide,done");
1473 e_mod_comp_done_defer(cw);
1477 _e_mod_comp_win_sync_setup(E_Comp_Win *cw,
1480 if (!_comp_mod->conf->efl_sync) return;
1483 if (_e_mod_comp_win_is_borderless(cw) ||
1484 (_comp_mod->conf->loose_sync))
1486 cw->counter = ecore_x_e_comp_sync_counter_get(win);
1490 ecore_x_e_comp_sync_cancel_send(win);
1495 cw->counter = ecore_x_e_comp_sync_counter_get(win);
1501 E_Comp_Win *client_cw = _e_mod_comp_win_find(win);
1503 client_cw->counter == cw->counter)
1505 ecore_x_sync_counter_inc(cw->counter, 1);
1506 cw->sync_info.val++;
1511 ecore_x_e_comp_sync_begin_send(win);
1512 ecore_x_sync_counter_inc(cw->counter, 1);
1513 cw->sync_info.val++;
1518 e_mod_comp_win_shadow_setup(E_Comp_Win *cw,
1526 evas_object_image_smooth_scale_set(co->img, _comp_mod->conf->smooth_windows);
1527 EINA_LIST_FOREACH(co->img_mirror, l, o)
1529 evas_object_image_smooth_scale_set(o, _comp_mod->conf->smooth_windows);
1532 if (_comp_mod->conf->shadow_file)
1533 ok = edje_object_file_set
1534 (co->shadow, _comp_mod->conf->shadow_file,
1535 e_mod_comp_policy_win_shadow_group_get(cw));
1539 fprintf(stdout, "[E17-comp] EDC file ERROR win:0x%08x %s(%d) f:%s\n",
1540 cw->win, __func__, __LINE__, _comp_mod->conf->shadow_file);
1541 e_mod_comp_debug_edje_error_get
1542 (co->shadow, e_mod_comp_util_client_xid_get(cw));
1544 if (_comp_mod->conf->shadow_style)
1546 snprintf(buf, sizeof(buf), "e/comp/%s",
1547 _comp_mod->conf->shadow_style);
1548 ok = e_theme_edje_object_set(co->shadow,
1549 "base/theme/borders",
1554 ok = e_theme_edje_object_set(co->shadow,
1555 "base/theme/borders",
1559 // fallback to local shadow.edj - will go when default theme supports this
1562 fprintf(stdout, "[E17-comp] EDC file ERROR win:0x%08x %s(%d)\n",
1563 cw->win, __func__, __LINE__);
1564 e_mod_comp_debug_edje_error_get
1565 (co->shadow, e_mod_comp_util_client_xid_get(cw));
1566 snprintf(buf, sizeof(buf), "%s/shadow.edj",
1567 e_module_dir_get(_comp_mod->module));
1568 ok = edje_object_file_set(co->shadow, buf, "shadow");
1570 if (!edje_object_part_swallow(co->shadow,
1571 "e.swallow.content",
1574 fprintf(stdout, "[E17-comp] EDC swallow ERROR win:0x%08x %s(%d)\n",
1575 cw->win, __func__, __LINE__);
1578 e_mod_comp_debug_edje_error_get
1579 (co->shadow, e_mod_comp_util_client_xid_get(cw));
1581 e_mod_comp_effect_signal_add
1582 (cw, NULL, "e,state,shadow,off", "e");
1586 if (cw->bd->focused)
1587 e_mod_comp_effect_signal_add
1588 (cw, NULL, "e,state,focus,on", "e");
1589 if (cw->bd->client.icccm.urgent)
1590 e_mod_comp_effect_signal_add
1591 (cw, NULL, "e,state,urgent,on", "e");
1596 _e_mod_comp_cb_win_mirror_del(void *data,
1599 void *event_info __UNUSED__)
1601 E_Comp_Win *cw = (E_Comp_Win *)data;
1606 EINA_LIST_FOREACH(cw->objs, l, co)
1608 if (co->canvas->evas == e)
1610 co->img_mirror = eina_list_remove(co->img_mirror, obj);
1616 static Evas_Object *
1617 _e_mod_comp_win_mirror_add(E_Comp_Win *cw)
1624 E_CHECK_RETURN(cw->c, 0);
1626 if (cw->bd) z = cw->bd->zone;
1627 else z = e_util_zone_current_get(cw->c->man);
1628 EINA_LIST_FOREACH(cw->objs, l, co)
1630 if ((_comp_mod->conf->canvas_per_zone) &&
1631 ((co->zone) != (z)))
1634 o = evas_object_image_filled_add(co->canvas->evas);
1635 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
1636 co->img_mirror = eina_list_append(co->img_mirror, o);
1637 evas_object_image_smooth_scale_set(o, _comp_mod->conf->smooth_windows);
1639 evas_object_event_callback_add(o, EVAS_CALLBACK_DEL,
1640 _e_mod_comp_cb_win_mirror_del, cw);
1642 if ((cw->pixmap) && (cw->pw > 0) && (cw->ph > 0))
1648 alpha = evas_object_image_alpha_get(co->img);
1649 evas_object_image_size_get(co->img, &w, &h);
1651 evas_object_image_alpha_set(o, alpha);
1655 pix = evas_object_image_data_get(co->img, 0);
1656 evas_object_image_data_set(o, pix);
1657 evas_object_image_size_set(o, w, h);
1658 evas_object_image_data_set(o, pix);
1659 evas_object_image_data_update_add(o, 0, 0, w, h);
1665 Evas_Native_Surface ns;
1667 ns.version = EVAS_NATIVE_SURFACE_VERSION;
1668 ns.type = EVAS_NATIVE_SURFACE_X11;
1669 ns.data.x11.visual = cw->vis;
1670 ns.data.x11.pixmap = cw->pixmap;
1671 evas_object_image_size_set(o, w, h);
1672 evas_object_image_native_surface_set(o, &ns);
1673 evas_object_image_data_update_add(o, 0, 0, w, h);
1682 pix = ecore_x_image_data_get(co->xim, NULL, NULL, NULL);
1683 evas_object_image_data_set(o, pix);
1684 evas_object_image_size_set(o, w, h);
1685 evas_object_image_data_set(o, pix);
1686 evas_object_image_data_update_add(o, 0, 0, w, h);
1689 evas_object_image_size_set(o, w, h);
1690 evas_object_image_data_update_add(o, 0, 0, w, h);
1692 evas_object_stack_above(o, co->shadow);
1699 _e_mod_comp_win_add(E_Comp *c,
1702 Ecore_X_Window_Attributes att;
1707 cw = E_NEW(E_Comp_Win, 1);
1708 E_CHECK_RETURN(cw, 0);
1711 cw->opacity = 255.0;
1712 cw->bd = e_border_find_by_window(cw->win);
1713 _e_mod_comp_x_grab_set(c, EINA_TRUE);
1716 eina_hash_add(borders, e_util_winid_str_get(cw->bd->client.win), cw);
1717 cw->dfn = e_object_delfn_add(E_OBJECT(cw->bd), _e_mod_comp_object_del, cw);
1719 else if ((cw->pop = e_popup_find_by_window(cw->win)))
1721 cw->dfn = e_object_delfn_add(E_OBJECT(cw->pop),
1722 _e_mod_comp_object_del, cw);
1725 else if ((cw->menu = e_menu_find_by_window(cw->win)))
1727 cw->dfn = e_object_delfn_add(E_OBJECT(cw->menu),
1728 _e_mod_comp_object_del, cw);
1733 char *netwm_title = NULL;
1735 cw->title = ecore_x_icccm_title_get(cw->win);
1736 if (ecore_x_netwm_name_get(cw->win, &netwm_title))
1738 if (cw->title) free(cw->title);
1739 cw->title = netwm_title;
1741 ecore_x_icccm_name_class_get(cw->win, &cw->name, &cw->clas);
1742 cw->role = ecore_x_icccm_window_role_get(cw->win);
1743 if (!ecore_x_netwm_window_type_get(cw->win, &cw->primary_type))
1744 cw->primary_type = ECORE_X_WINDOW_TYPE_UNKNOWN;
1747 e_mod_comp_win_type_setup(cw);
1748 memset((&att), 0, sizeof(Ecore_X_Window_Attributes));
1749 if (!ecore_x_window_attributes_get(cw->win, &att))
1752 _e_mod_comp_x_grab_set(c, EINA_FALSE);
1756 if ((!att.input_only) &&
1757 ((att.depth != 24) && (att.depth != 32)))
1759 printf("WARNING: window 0x%x not 24/32bpp -> %ibpp\n",
1760 cw->win, att.depth);
1763 cw->input_only = att.input_only;
1764 cw->override = att.override;
1765 cw->vis = att.visual;
1766 cw->depth = att.depth;
1767 cw->argb = ecore_x_window_argb_get(cw->win);
1769 eina_hash_add(windows, e_util_winid_str_get(cw->win), cw);
1771 if ((!cw->input_only) && (!cw->invalid))
1773 Ecore_X_Rectangle *rects;
1776 cw->damage = ecore_x_damage_new
1777 (cw->win, ECORE_X_DAMAGE_REPORT_DELTA_RECTANGLES);
1778 eina_hash_add(damages, e_util_winid_str_get(cw->damage), cw);
1779 cw->objs = e_mod_comp_win_comp_objs_add(cw);
1783 _e_mod_comp_x_grab_set(c, EINA_FALSE);
1787 E_Comp_Canvas *canvas;
1788 EINA_LIST_FOREACH(c->canvases, l, canvas)
1790 if (!canvas) continue;
1791 if (canvas->use_bg_img) continue;
1792 evas_object_lower(canvas->bg_img);
1795 EINA_LIST_FOREACH(cw->objs, l, co)
1798 e_mod_comp_win_shadow_setup(cw, co);
1799 e_mod_comp_win_cb_setup(cw, co);
1800 if (co->img) evas_object_show(co->img);
1803 ecore_x_window_shape_events_select(cw->win, 1);
1804 rects = ecore_x_window_shape_rectangles_get(cw->win, &num);
1808 for (i = 0; i < num; i++)
1809 E_RECTS_CLIP_TO_RECT(rects[i].x, rects[i].y,
1810 rects[i].width, rects[i].height,
1811 0, 0, att.w, att.h);
1812 if (_e_mod_comp_shaped_check(att.w, att.h, rects, num))
1813 cw->shape_changed = 1;
1818 if (cw->bd) e_mod_comp_win_comp_objs_data_set(cw, "border", cw->bd);
1820 e_mod_comp_win_comp_objs_data_set(cw, "popup", cw->pop);
1822 e_mod_comp_win_comp_objs_data_set(cw, "menu", cw->menu);
1824 e_mod_comp_win_comp_objs_img_pass_events_set(cw, 1);
1826 cw->pending_count++;
1827 e_manager_comp_event_src_add_send
1828 (cw->c->man, (E_Manager_Comp_Source *)cw,
1829 _e_mod_comp_cb_pending_after, cw->c);
1833 cw->objs = e_mod_comp_win_comp_objs_add(cw);
1837 _e_mod_comp_x_grab_set(c, EINA_FALSE);
1841 e_mod_comp_win_comp_objs_pass_events_set(cw, 1);
1842 e_mod_comp_win_comp_objs_data_set(cw, "win",
1843 (void *)((unsigned long)cw->win));
1844 e_mod_comp_win_comp_objs_data_set(cw, "src", cw);
1846 c->wins_invalid = 1;
1847 c->wins = eina_inlist_append(c->wins, EINA_INLIST_GET(cw));
1848 cw->up = e_mod_comp_update_new();
1849 e_mod_comp_update_tile_size_set(cw->up, 32, 32);
1851 e_mod_comp_update_policy_set
1852 (cw->up, E_UPDATE_POLICY_HALF_WIDTH_OR_MORE_ROUND_UP_TO_FULL_WIDTH);
1853 if (((!cw->input_only) && (!cw->invalid)) && (cw->override))
1856 cw->dmg_updates = 0;
1859 cw->eff_type = e_mod_comp_effect_type_new();
1862 e_mod_comp_effect_type_setup
1864 e_mod_comp_util_client_xid_get(cw));
1867 _e_mod_comp_x_grab_set(c, EINA_FALSE);
1872 _e_mod_comp_win_del(E_Comp_Win *cw)
1878 EINA_LIST_FOREACH(cw->objs, l, co)
1881 e_mod_comp_effect_signal_del(cw,
1886 // while win_hide animation is progressing, at that time win_del is called,
1887 // background window effect is may not work fully.
1888 // so, explicit call disable effect stage function.
1889 if (cw->effect_stage)
1890 e_mod_comp_effect_disable_stage(cw->c, cw);
1893 e_mod_comp_effect_animating_set(cw->c, cw, EINA_FALSE);
1895 if (cw->shape_input)
1897 e_mod_comp_win_shape_input_free(cw->shape_input);
1898 cw->shape_input = NULL;
1901 if ((!cw->input_only) && (!cw->invalid))
1903 cw->pending_count++;
1904 e_manager_comp_event_src_del_send
1905 (cw->c->man, (E_Manager_Comp_Source *)cw,
1906 _e_mod_comp_cb_pending_after, cw->c);
1909 e_mod_comp_update_free(cw->up);
1910 e_mod_comp_effect_win_rotation_handler_release(cw);
1911 e_mod_comp_bg_win_handler_release(cw);
1918 if (cw->update_timeout)
1920 ecore_timer_del(cw->update_timeout);
1921 cw->update_timeout = NULL;
1927 eina_hash_del(borders, e_util_winid_str_get(cw->bd->client.win), cw);
1928 e_object_delfn_del(E_OBJECT(cw->bd), cw->dfn);
1933 e_object_delfn_del(E_OBJECT(cw->pop), cw->dfn);
1938 e_object_delfn_del(E_OBJECT(cw->menu), cw->dfn);
1945 e_mod_comp_win_comp_objs_img_deinit(cw);
1947 ecore_x_pixmap_free(cw->pixmap);
1951 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
1952 e_mod_comp_win_comp_objs_xim_free(cw);
1963 cw->c->updates = eina_list_remove(cw->c->updates, cw);
1965 e_mod_comp_win_comp_objs_del(cw, cw->objs);
1967 eina_hash_del(windows, e_util_winid_str_get(cw->win), cw);
1970 Ecore_X_Region parts;
1971 eina_hash_del(damages, e_util_winid_str_get(cw->damage), cw);
1972 parts = ecore_x_region_new(NULL, 0);
1973 ecore_x_damage_subtract(cw->damage, 0, parts);
1974 ecore_x_region_free(parts);
1975 ecore_x_damage_free(cw->damage);
1978 if (cw->title) free(cw->title);
1979 if (cw->name) free(cw->name);
1980 if (cw->clas) free(cw->clas);
1981 if (cw->role) free(cw->role);
1984 e_mod_comp_effect_type_free(cw->eff_type);
1985 cw->eff_type = NULL;
1987 cw->c->wins_invalid = 1;
1988 cw->c->wins = eina_inlist_remove(cw->c->wins, EINA_INLIST_GET(cw));
1989 pending_count = cw->pending_count;
1990 memset(cw, 0, sizeof(E_Comp_Win));
1991 cw->pending_count = pending_count;
1992 cw->delete_pending = 1;
1993 if (cw->pending_count > 0) return;
1998 _e_mod_comp_win_show(E_Comp_Win *cw)
2002 // if win_hide was showed then immediatly win_show() function is called. case.
2003 if (cw->defer_hide == 1) cw->defer_hide = 0;
2004 if (cw->visible) return;
2006 _e_mod_comp_win_configure(cw,
2007 cw->hidden.x, cw->hidden.y,
2010 if ((cw->input_only) || (cw->invalid)) return;
2013 _e_mod_comp_win_sync_setup(cw, cw->bd->client.win);
2015 _e_mod_comp_win_sync_setup(cw, cw->win);
2020 e_mod_comp_win_comp_objs_img_deinit(cw);
2023 ecore_x_pixmap_free(cw->pixmap);
2027 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
2029 e_mod_comp_win_comp_objs_xim_free(cw);
2038 if ((!cw->redirected) || (!cw->pixmap))
2041 cw->pixmap = ecore_x_composite_name_window_pixmap_get(cw->win);
2043 ecore_x_pixmap_geometry_get(cw->pixmap, NULL, NULL, &(cw->pw), &(cw->ph));
2049 if ((cw->pw <= 0) || (cw->ph <= 0))
2053 ecore_x_pixmap_free(cw->pixmap);
2060 e_mod_comp_update_resize(cw->up, cw->pw, cw->ph);
2061 e_mod_comp_update_add(cw->up, 0, 0, cw->pw, cw->ph);
2063 e_mod_comp_win_comp_objs_img_size_set(cw, cw->pw, cw->ph);
2064 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
2067 if (cw->dmg_updates >= 1)
2069 if ((cw->c->gl) && (_comp_mod->conf->texture_from_pixmap))
2072 cw->pixmap = ecore_x_composite_name_window_pixmap_get(cw->win);
2076 ecore_x_pixmap_geometry_get(cw->pixmap,
2078 &(cw->pw), &(cw->ph));
2086 if ((cw->pw <= 0) || (cw->ph <= 0))
2089 ecore_x_pixmap_free(cw->pixmap);
2095 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
2096 e_mod_comp_win_comp_objs_img_size_set(cw, cw->pw, cw->ph);
2097 e_mod_comp_win_comp_objs_img_init(cw);
2104 if (!cw->hidden_override)
2106 if (cw->defer_move_resize)
2109 e_mod_comp_win_comp_objs_move(cw, cw->x, cw->y);
2110 e_mod_comp_win_comp_objs_resize(cw,
2111 cw->pw + (cw->border * 2),
2112 cw->ph + (cw->border * 2));
2113 cw->defer_move_resize = EINA_FALSE;
2115 e_mod_comp_win_comp_objs_force_show(cw);
2119 e_mod_comp_bg_win_handler_show(cw);
2121 win = e_mod_comp_util_client_xid_get(cw);
2122 cw->use_dri2 = _e_mod_comp_prop_window_use_dri2_get(win);
2124 e_mod_comp_win_shape_input_invalid_set(cw->c, 1);
2125 _e_mod_comp_win_render_queue(cw);
2129 _e_mod_comp_win_real_hide(E_Comp_Win *cw)
2133 _e_mod_comp_win_hide(cw);
2137 _e_mod_comp_win_hide(cw);
2141 _e_mod_comp_win_hide(E_Comp_Win *cw)
2145 if ((!cw->visible) && (!cw->defer_hide)) return;
2147 e_mod_comp_win_shape_input_invalid_set(cw->c, 1);
2150 if ((cw->input_only) || (cw->invalid)) return;
2152 e_mod_comp_effect_win_rotation_handler_release(cw);
2157 if (STATE_INSET_CHECK(cw))
2158 e_mod_comp_effect_signal_add
2159 (cw, NULL, "e,state,shadow,off", "e");
2160 e_mod_comp_effect_win_hide(cw);
2166 EINA_LIST_FOREACH(cw->objs, l, co)
2169 e_mod_comp_effect_signal_del(cw,
2176 e_mod_comp_win_comp_objs_hide(cw);
2178 if (cw->update_timeout)
2180 ecore_timer_del(cw->update_timeout);
2181 cw->update_timeout = NULL;
2183 if (_comp_mod->conf->keep_unmapped)
2188 e_mod_comp_win_comp_objs_img_deinit(cw);
2191 ecore_x_pixmap_free(cw->pixmap);
2195 ecore_x_e_comp_pixmap_set(cw->win, cw->pixmap);
2198 e_mod_comp_win_comp_objs_xim_free(cw);
2208 _e_mod_comp_win_render_queue(cw);
2209 _w = e_mod_comp_util_client_xid_get(cw);
2210 if (_comp_mod->conf->send_flush) ecore_x_e_comp_flush_send(_w);
2211 if (_comp_mod->conf->send_dump) ecore_x_e_comp_dump_send(_w);
2215 _e_mod_comp_win_raise_above(E_Comp_Win *cw,
2219 Eina_Bool raise = EINA_FALSE;
2220 Eina_Bool lower = EINA_FALSE;
2223 v1 = e_mod_comp_util_win_visible_get(cw);
2224 below = e_mod_comp_util_win_below_get(cw, 0);
2226 cw->c->wins_invalid = 1;
2227 cw->c->wins = eina_inlist_remove(cw->c->wins, EINA_INLIST_GET(cw));
2228 cw->c->wins = eina_inlist_append_relative(cw->c->wins,
2229 EINA_INLIST_GET(cw),
2230 EINA_INLIST_GET(cw2));
2231 v2 = e_mod_comp_util_win_visible_get(cw);
2234 lower = e_mod_comp_policy_win_lower_check(cw, below);
2235 else if ((!v1) && (v2))
2236 raise = e_mod_comp_policy_win_restack_check(cw, cw2);
2239 "[COMP] %18.18s w:0x%08x w2:0x%08x wb:0x%08x [fs%d sd%d v%d v%d l%d r%d]\n", "EFF",
2240 e_mod_comp_util_client_xid_get(cw),
2241 e_mod_comp_util_client_xid_get(cw2),
2242 e_mod_comp_util_client_xid_get(below),
2243 cw->first_show_worked, cw->show_done,
2244 v1, v2, lower, raise);
2246 if ((raise) && (cw->first_show_worked))
2248 e_mod_comp_effect_win_restack(cw, cw2);
2250 else if ((lower) && (cw->show_done))
2252 e_mod_comp_effect_win_lower(cw, below);
2256 e_mod_comp_win_comp_objs_stack_above(cw, cw2);
2257 if ((cw->visible) && (cw->first_show_worked))
2259 e_mod_comp_effect_signal_add
2260 (cw, NULL, "e,state,visible,on,noeffect", "e");
2264 _e_mod_comp_win_render_queue(cw);
2265 cw->pending_count++;
2266 e_manager_comp_event_src_config_send
2267 (cw->c->man, (E_Manager_Comp_Source *)cw,
2268 _e_mod_comp_cb_pending_after, cw->c);
2272 _e_mod_comp_win_raise(E_Comp_Win *cw)
2274 cw->c->wins = eina_inlist_remove(cw->c->wins, EINA_INLIST_GET(cw));
2275 cw->c->wins = eina_inlist_append(cw->c->wins, EINA_INLIST_GET(cw));
2277 e_mod_comp_win_comp_objs_raise(cw);
2278 _e_mod_comp_win_render_queue(cw);
2282 _e_mod_comp_win_lower(E_Comp_Win *cw)
2284 cw->c->wins_invalid = 1;
2285 cw->c->wins = eina_inlist_remove(cw->c->wins, EINA_INLIST_GET(cw));
2286 cw->c->wins = eina_inlist_prepend(cw->c->wins, EINA_INLIST_GET(cw));
2288 e_mod_comp_win_comp_objs_lower(cw);
2289 _e_mod_comp_win_render_queue(cw);
2290 cw->pending_count++;
2291 e_manager_comp_event_src_config_send
2292 (cw->c->man, (E_Manager_Comp_Source *)cw,
2293 _e_mod_comp_cb_pending_after, cw->c);
2297 _e_mod_comp_win_configure(E_Comp_Win *cw,
2302 Eina_Bool geo_changed = EINA_FALSE;
2303 if (!((w == cw->w) && (h == cw->h)))
2308 cw->dmg_updates = 0;
2309 geo_changed = EINA_TRUE;
2316 cw->border = border;
2320 if (!((x == cw->x) && (y == cw->y)))
2324 geo_changed = EINA_TRUE;
2325 if (!cw->needpix && !cw->move_lock)
2326 e_mod_comp_win_comp_objs_move(cw, cw->x, cw->y);
2332 if (cw->border != border)
2334 cw->border = border;
2335 geo_changed = EINA_TRUE;
2336 e_mod_comp_win_comp_objs_resize(cw,
2337 cw->pw + (cw->border * 2),
2338 cw->ph + (cw->border * 2));
2340 cw->hidden.w = cw->w;
2341 cw->hidden.h = cw->h;
2343 e_mod_comp_win_shape_input_invalid_set(cw->c, 1);
2344 if ((cw->input_only) || (cw->invalid) || (cw->needpix)) return;
2345 _e_mod_comp_win_render_queue(cw);
2346 cw->pending_count++;
2347 e_manager_comp_event_src_config_send
2348 (cw->c->man, (E_Manager_Comp_Source *)cw,
2349 _e_mod_comp_cb_pending_after, cw->c);
2353 _e_mod_comp_win_damage(E_Comp_Win *cw,
2360 if ((cw->input_only) || (cw->invalid)) return;
2361 if ((dmg) && (cw->damage))
2363 Ecore_X_Region parts;
2364 parts = ecore_x_region_new(NULL, 0);
2365 ecore_x_damage_subtract(cw->damage, 0, parts);
2366 ecore_x_region_free(parts);
2369 e_mod_comp_update_add(cw->up, x, y, w, h);
2374 if (!cw->update_timeout)
2375 cw->update_timeout = ecore_timer_add
2376 (_comp_mod->conf->damage_timeout,
2377 _e_mod_comp_win_damage_timeout, cw);
2383 (cw->dmg_updates <= 1))
2388 "[COMP] %31s w:0x%08x bd:%s skip first damage.\n",
2389 "X_DAMAGE", e_mod_comp_util_client_xid_get(cw),
2390 cw->bd ? "O" : "X");
2398 cw->c->updates = eina_list_append(cw->c->updates, cw);
2400 _e_mod_comp_win_render_queue(cw);
2404 _e_mod_comp_win_reshape(E_Comp_Win *cw)
2406 if (cw->shape_changed) return;
2407 cw->shape_changed = 1;
2411 cw->c->updates = eina_list_append(cw->c->updates, cw);
2413 e_mod_comp_update_add(cw->up, 0, 0, cw->w, cw->h);
2414 _e_mod_comp_win_render_queue(cw);
2418 _e_mod_comp_create(void *data __UNUSED__,
2419 int type __UNUSED__,
2422 Ecore_X_Event_Window_Create *ev = event;
2425 E_Comp_Canvas *canvas;
2426 E_Comp *c = _e_mod_comp_find(ev->parent);
2427 if (!c) return ECORE_CALLBACK_PASS_ON;
2428 if (_e_mod_comp_win_find(ev->win)) return ECORE_CALLBACK_PASS_ON;
2429 if (c->win == ev->win) return ECORE_CALLBACK_PASS_ON;
2430 EINA_LIST_FOREACH(c->canvases, l, canvas)
2432 if (canvas->ee_win == ev->win) return ECORE_CALLBACK_PASS_ON;
2435 "[COMP] ev:%15.15s w:0x%08x\n",
2436 "X_CREATE", ev->win);
2437 cw = _e_mod_comp_win_add(c, ev->win);
2439 _e_mod_comp_win_configure(cw,
2443 return ECORE_CALLBACK_PASS_ON;
2447 _e_mod_comp_destroy(void *data __UNUSED__,
2448 int type __UNUSED__,
2451 Ecore_X_Event_Window_Destroy *ev = event;
2452 E_Comp_Win *cw = _e_mod_comp_win_find(ev->win);
2453 if (!cw) return ECORE_CALLBACK_PASS_ON;
2455 "[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p\n",
2456 "X_DESTROY", ev->win, _e_mod_comp_win_is_border(cw),
2457 e_mod_comp_util_client_xid_get(cw), cw);
2458 if (!cw->c->nocomp && cw->animating) cw->delete_me = 1;
2459 else _e_mod_comp_win_del(cw);
2460 return ECORE_CALLBACK_PASS_ON;
2464 _e_mod_comp_show(void *data __UNUSED__,
2465 int type __UNUSED__,
2468 Ecore_X_Event_Window_Show *ev = event;
2469 E_Comp_Win *cw = _e_mod_comp_win_find(ev->win);
2470 if (!cw) return ECORE_CALLBACK_PASS_ON;
2471 if (cw->visible) return ECORE_CALLBACK_PASS_ON;
2472 if (_e_mod_comp_win_is_border(cw)) return ECORE_CALLBACK_PASS_ON;
2474 "[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p\n",
2475 "X_SHOW", ev->win, _e_mod_comp_win_is_border(cw),
2476 e_mod_comp_util_client_xid_get(cw), cw);
2477 _e_mod_comp_win_show(cw);
2478 return ECORE_CALLBACK_PASS_ON;
2482 _e_mod_comp_hide(void *data __UNUSED__,
2483 int type __UNUSED__,
2486 Ecore_X_Event_Window_Hide *ev = event;
2487 E_Comp_Win *cw = _e_mod_comp_win_find(ev->win);
2488 if (!cw) return ECORE_CALLBACK_PASS_ON;
2489 if (!cw->visible) return ECORE_CALLBACK_PASS_ON;
2490 if (_e_mod_comp_win_is_border(cw)) return ECORE_CALLBACK_PASS_ON;
2492 "[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p\n",
2493 "X_HIDE", ev->win, _e_mod_comp_win_is_border(cw),
2494 e_mod_comp_util_client_xid_get(cw), cw);
2495 _e_mod_comp_win_real_hide(cw);
2496 return ECORE_CALLBACK_PASS_ON;
2500 _e_mod_comp_reparent(void *data __UNUSED__,
2501 int type __UNUSED__,
2504 Ecore_X_Event_Window_Reparent *ev = event;
2505 E_Comp_Win *cw = _e_mod_comp_win_find(ev->win);
2506 if (!cw) return ECORE_CALLBACK_PASS_ON;
2508 "[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p TO rw:0x%08x\n",
2509 "X_REPARENT", ev->win, _e_mod_comp_win_is_border(cw),
2510 e_mod_comp_util_client_xid_get(cw), cw, ev->parent);
2511 if (ev->parent != cw->c->man->root)
2513 L(LT_EVENT_X, "[COMP] %31s w:0x%08x\n", "DEL", ev->win);
2514 _e_mod_comp_win_del(cw);
2516 return ECORE_CALLBACK_PASS_ON;
2520 _e_mod_comp_configure(void *data __UNUSED__,
2521 int type __UNUSED__,
2524 Ecore_X_Event_Window_Configure *ev = event;
2525 E_Comp_Win *cw = _e_mod_comp_win_find(ev->win);
2526 Eina_Bool need_shape_merge = EINA_FALSE;
2527 if (!cw) return ECORE_CALLBACK_PASS_ON;
2529 "[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p %4d %4d %3dx%3d\n",
2530 "X_CONFIGURE", ev->win, _e_mod_comp_win_is_border(cw),
2531 e_mod_comp_util_client_xid_get(cw), cw, ev->x, ev->y, ev->w, ev->h);
2532 if (ev->abovewin == 0)
2534 if (EINA_INLIST_GET(cw)->prev)
2537 "[COMP] %31s w:0x%08x\n",
2540 _e_mod_comp_win_lower(cw);
2541 need_shape_merge = EINA_TRUE;
2546 E_Comp_Win *cw2 = _e_mod_comp_win_find(ev->abovewin);
2549 E_Comp_Win *cw3 = (E_Comp_Win *)(EINA_INLIST_GET(cw)->prev);
2553 "[COMP] %31s bd:%d above_w:0x%08x\n",
2554 "RAISE_ABOVE", _e_mod_comp_win_is_border(cw2),
2555 e_mod_comp_util_client_xid_get(cw2));
2557 _e_mod_comp_win_raise_above(cw, cw2);
2558 need_shape_merge = EINA_TRUE;
2563 if (need_shape_merge)
2565 e_mod_comp_win_shape_input_invalid_set(cw->c, 1);
2566 _e_mod_comp_win_render_queue(cw);
2569 if (!((cw->x == ev->x) && (cw->y == ev->y)) &&
2570 ((cw->w == ev->w) && (cw->h == ev->h)) &&
2571 _e_mod_comp_win_is_border(cw))
2573 return ECORE_CALLBACK_PASS_ON;
2576 if (!((cw->x == ev->x) && (cw->y == ev->y) &&
2577 (cw->w == ev->w) && (cw->h == ev->h) &&
2578 (cw->border == ev->border)))
2580 _e_mod_comp_win_configure(cw,
2585 return ECORE_CALLBACK_PASS_ON;
2589 _e_mod_comp_stack(void *data __UNUSED__,
2590 int type __UNUSED__,
2593 Ecore_X_Event_Window_Stack *ev = event;
2594 E_Comp_Win *cw = _e_mod_comp_win_find(ev->win);
2596 "[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p\n",
2597 "X_STACK", ev->win, _e_mod_comp_win_is_border(cw), e_mod_comp_util_client_xid_get(cw), cw);
2598 if (!cw) return ECORE_CALLBACK_PASS_ON;
2599 if (ev->detail == ECORE_X_WINDOW_STACK_ABOVE) _e_mod_comp_win_raise(cw);
2600 else _e_mod_comp_win_lower(cw);
2601 return ECORE_CALLBACK_PASS_ON;
2605 _e_mod_comp_prop_effect_state(Ecore_X_Event_Window_Property *ev __UNUSED__)
2611 c = e_mod_comp_util_get();
2612 E_CHECK_RETURN(c, 0);
2614 ret = ecore_x_window_prop_card32_get
2615 (c->man->root, ATOM_EFFECT_ENABLE, &val, 1);
2616 E_CHECK_RETURN((ret >= 0), 0);
2620 c->animatable = EINA_TRUE;
2621 if (_comp_mod->conf->default_window_effect != 1)
2623 _comp_mod->conf->default_window_effect = 1;
2624 e_config_domain_save("module.comp-slp",
2625 _comp_mod->conf_edd,
2632 c->animatable = EINA_FALSE;
2633 if (_comp_mod->conf->default_window_effect != 0)
2635 _comp_mod->conf->default_window_effect = 0;
2636 e_config_domain_save("module.comp-slp",
2637 _comp_mod->conf_edd,
2643 "[COMP] %31s c->animatable:%d\n",
2644 "ATOM_EFFECT_ENABLE",
2651 _e_mod_comp_prop_window_effect_state(Ecore_X_Event_Window_Property *ev)
2653 E_Comp_Win *cw = NULL;
2654 Ecore_X_Window w = 0;
2655 E_CHECK_RETURN(ev, 0);
2657 cw = _e_mod_comp_win_find(ev->win);
2660 cw = _e_mod_comp_border_client_find(ev->win);
2661 E_CHECK_RETURN(cw, 0);
2664 E_CHECK_RETURN(cw->eff_type, 0);
2666 w = e_mod_comp_util_client_xid_get(cw);
2667 e_mod_comp_effect_state_setup(cw->eff_type, w);
2673 _e_mod_comp_prop_effect_style(Ecore_X_Event_Window_Property *ev)
2675 E_Comp_Win *cw = NULL;
2676 Ecore_X_Window w = 0;
2677 E_CHECK_RETURN(ev, 0);
2679 cw = _e_mod_comp_win_find(ev->win);
2682 cw = _e_mod_comp_border_client_find(ev->win);
2683 E_CHECK_RETURN(cw, 0);
2686 E_CHECK_RETURN(cw->eff_type, 0);
2688 w = e_mod_comp_util_client_xid_get(cw);
2689 e_mod_comp_effect_style_setup(cw->eff_type, w);
2695 _e_mod_comp_prop_opacity(Ecore_X_Event_Window_Property *ev)
2697 E_Comp_Win *cw = NULL;
2698 unsigned int val = 0;
2701 cw = _e_mod_comp_win_find(ev->win);
2704 cw = _e_mod_comp_border_client_find(ev->win);
2705 E_CHECK_RETURN(cw, 0);
2708 ret = ecore_x_window_prop_card32_get
2709 (cw->win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY, &val, 1);
2710 E_CHECK_RETURN((ret > 0), 0);
2712 cw->opacity = (val >> 24);
2716 EINA_LIST_FOREACH(cw->objs, l, co)
2718 evas_object_color_set(co->shadow,
2728 _e_mod_comp_prop_illume_window_state(Ecore_X_Event_Window_Property *ev)
2730 E_Comp_Win *cw = NULL;
2733 cw = _e_mod_comp_border_client_find(ev->win);
2734 E_CHECK_RETURN(cw, 0);
2735 E_CHECK_RETURN((cw->bd), 0);
2737 state = cw->bd->client.illume.win_state.state;
2740 case ECORE_X_ILLUME_WINDOW_STATE_FLOATING:
2741 e_mod_comp_effect_signal_add
2742 (cw, NULL, "e,state,shadow,on", "e");
2744 case ECORE_X_ILLUME_WINDOW_STATE_NORMAL:
2746 e_mod_comp_effect_signal_add
2747 (cw, NULL, "e,state,shadow,off", "e");
2754 _e_mod_comp_prop_sync_counter(Ecore_X_Event_Window_Property *ev)
2756 E_Comp_Win *cw = NULL;
2757 cw = _e_mod_comp_win_find(ev->win);
2758 if (!cw) cw = _e_mod_comp_border_client_find(ev->win);
2760 Ecore_X_Sync_Counter counter = ecore_x_e_comp_sync_counter_get(ev->win);
2763 if (cw->counter != counter)
2765 Ecore_X_Window _w = e_mod_comp_util_client_xid_get(cw);
2768 ecore_x_e_comp_sync_cancel_send(_w);
2769 ecore_x_sync_counter_inc(cw->counter, 1);
2770 cw->sync_info.val++;
2772 cw->counter = counter;
2775 ecore_x_sync_counter_inc(cw->counter, 1);
2776 ecore_x_e_comp_sync_begin_send(_w);
2777 cw->sync_info.val = 1;
2783 if (counter) ecore_x_sync_counter_inc(counter, 1);
2789 _e_mod_comp_prop_window_use_dri2_get(Ecore_X_Window win)
2791 unsigned int val = 0;
2792 int ret = ecore_x_window_prop_card32_get(win,
2793 ATOM_X_WIN_USE_DRI2,
2796 if (ret == -1) return EINA_FALSE;
2798 return val ? EINA_TRUE : EINA_FALSE;
2802 _e_mod_comp_prop_use_dri2(Ecore_X_Event_Window_Property *ev)
2804 E_Comp_Win *cw = NULL;
2806 cw = _e_mod_comp_win_find(ev->win);
2809 cw = _e_mod_comp_border_client_find(ev->win);
2810 E_CHECK_RETURN(cw, 0);
2813 win = e_mod_comp_util_client_xid_get(cw);
2814 cw->use_dri2 = _e_mod_comp_prop_window_use_dri2_get(win);
2820 _e_mod_comp_property(void *data __UNUSED__,
2821 int type __UNUSED__,
2822 void *event __UNUSED__)
2824 Ecore_X_Event_Window_Property *ev = event;
2826 if (!ev) return ECORE_CALLBACK_PASS_ON;
2827 if (!ev->atom) return ECORE_CALLBACK_PASS_ON;
2828 if (!e_mod_comp_atoms_name_get(ev->atom)) return ECORE_CALLBACK_PASS_ON;
2832 "[COMP] ev:%15.15s w:0x%08x atom:%s\n",
2833 "X_PROPERTY", ev->win,
2834 e_mod_comp_atoms_name_get(a));
2836 if (a == ECORE_X_ATOM_E_COMP_SYNC_COUNTER ) _e_mod_comp_prop_sync_counter(ev);
2837 else if (a == ATOM_X_WIN_USE_DRI2 ) _e_mod_comp_prop_use_dri2(ev);
2838 else if (a == ATOM_EFFECT_ENABLE ) _e_mod_comp_prop_effect_state(ev);
2839 else if (a == ATOM_WINDOW_EFFECT_ENABLE ) _e_mod_comp_prop_window_effect_state(ev);
2840 else if (a == ATOM_WINDOW_EFFECT_TYPE ) _e_mod_comp_prop_effect_style(ev);
2841 else if (a == ECORE_X_ATOM_NET_WM_WINDOW_OPACITY ) _e_mod_comp_prop_opacity(ev);
2842 else if (a == ECORE_X_ATOM_E_ILLUME_WINDOW_STATE ) _e_mod_comp_prop_illume_window_state(ev);
2843 else if (a == ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE) e_mod_comp_effect_win_rotation_handler_prop(ev);
2844 else if (a == ECORE_X_ATOM_WM_CLASS ) e_mod_comp_win_type_handler_prop(ev);
2845 else if (a == ATOM_NET_CM_WINDOW_BACKGROUND ) e_mod_comp_bg_win_handler_prop(ev);
2846 else if (a == ATOM_CM_LOG ) e_mod_comp_debug_prop_handle(ev);
2848 return ECORE_CALLBACK_PASS_ON;
2852 _e_mod_comp_msg_sync_draw_done(Ecore_X_Event_Client_Message *ev)
2854 E_Comp_Win *cw = NULL;
2855 int v = 0, w = 0, h = 0;
2856 cw = _e_mod_comp_border_client_find(ev->data.l[0]);
2862 cw->sync_info.version = v;
2863 if (!cw->bd) return EINA_FALSE;
2864 if ((Ecore_X_Window)(ev->data.l[0]) != cw->bd->client.win) return EINA_FALSE;
2868 cw = _e_mod_comp_win_find(ev->data.l[0]);
2869 if (!cw || (ev->data.l[0] != (int)cw->win))
2871 Ecore_X_Sync_Counter counter = ecore_x_e_comp_sync_counter_get(ev->win);
2872 ecore_x_e_comp_sync_cancel_send(ev->win);
2873 if (counter) ecore_x_sync_counter_inc(counter, 1);
2875 "[COMP] ev:%15.15s w:0x%08x type:%s !cw v%d %03dx%03d\n",
2876 "X_CLIENT_MSG", ev->win, "SYNC_DRAW_DONE", v, w, h);
2882 cw->counter = ecore_x_e_comp_sync_counter_get(e_mod_comp_util_client_xid_get(cw));
2885 ecore_x_sync_counter_inc(cw->counter, 1);
2886 ecore_x_e_comp_sync_begin_send(e_mod_comp_util_client_xid_get(cw));
2887 cw->sync_info.val = 1;
2888 cw->sync_info.done_count = 1;
2891 "[COMP] ev:%15.15s w:0x%08x type:%s !cw->counter v%d %03dx%03d\n",
2892 "X_CLIENT_MSG", e_mod_comp_util_client_xid_get(cw),
2893 "SYNC_DRAW_DONE", v, w, h);
2897 if ((_comp_mod->conf->efl_sync) &&
2898 (_comp_mod->conf->nocomp_fs) &&
2901 ecore_x_sync_counter_inc(cw->counter, 1);
2904 cw->sync_info.done_count++;
2905 cw->sync_info.val++;
2908 "[COMP] ev:%15.15s w:0x%08x type:%s v%d %03dx%03d NOCOMP INC done:%d val:%d\n",
2909 "X_CLIENT_MSG", e_mod_comp_util_client_xid_get(cw),
2910 "SYNC_DRAW_DONE", v, w, h, cw->sync_info.done_count,
2918 if (cw->update_timeout)
2920 ecore_timer_del(cw->update_timeout);
2921 cw->update_timeout = NULL;
2924 cw->c->updates = eina_list_append(cw->c->updates, cw);
2928 cw->sync_info.done_count++;
2931 "[COMP] ev:%15.15s w:0x%08x type:%s v%d %03dx%03d\n",
2932 "X_CLIENT_MSG", e_mod_comp_util_client_xid_get(cw),
2933 "SYNC_DRAW_DONE", v, w, h);
2935 _e_mod_comp_win_render_queue(cw);
2940 _e_mod_comp_hib_leave(Ecore_X_Event_Client_Message *ev)
2945 E_CHECK_RETURN(ev, 0);
2946 E_CHECK_RETURN((ev->data.l[0] == 0), 0);
2947 E_CHECK_RETURN(_comp_mod, 0);
2949 c = _e_mod_comp_find(ev->win);
2950 E_CHECK_RETURN(c, 0);
2952 cfg = e_config_domain_load("module.comp-slp",
2953 _comp_mod->conf_edd);
2954 E_CHECK_RETURN(cfg, 0);
2956 if (cfg->default_window_effect != c->animatable)
2958 if (cfg->default_window_effect)
2960 c->animatable = EINA_TRUE;
2961 _comp_mod->conf->default_window_effect = 1;
2965 c->animatable = EINA_FALSE;
2966 _comp_mod->conf->default_window_effect = 0;
2968 ecore_x_window_prop_card32_set
2969 (c->man->root, ATOM_EFFECT_ENABLE,
2970 (unsigned int *)(&(_comp_mod->conf->default_window_effect)), 1);
2973 if (cfg->shadow_file) eina_stringshare_del(cfg->shadow_file);
2974 if (cfg->shadow_style) eina_stringshare_del(cfg->shadow_style);
2981 _e_mod_comp_message(void *data __UNUSED__,
2982 int type __UNUSED__,
2985 Ecore_X_Event_Client_Message *ev;
2987 ev = (Ecore_X_Event_Client_Message *)event;
2989 E_CHECK_RETURN(ev, 0);
2990 E_CHECK_RETURN((ev->format == 32), 0);
2992 t = ev->message_type;
2994 if (t == ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE) _e_mod_comp_msg_sync_draw_done(ev);
2995 else if (t == ATOM_CM_LOCK_SCREEN ) e_mod_comp_screen_lock_handler_message(ev);
2996 else if (t == ATOM_X_HIBERNATION_STATE ) _e_mod_comp_hib_leave(ev);
2998 return ECORE_CALLBACK_PASS_ON;
3002 _e_mod_comp_shape(void *data __UNUSED__,
3003 int type __UNUSED__,
3006 Ecore_X_Event_Window_Shape *ev = event;
3007 E_Comp_Win *cw = _e_mod_comp_win_find(ev->win);
3008 if (!cw) return ECORE_CALLBACK_PASS_ON;
3009 if (ev->type != ECORE_X_SHAPE_BOUNDING) return ECORE_CALLBACK_PASS_ON;
3011 "[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p\n",
3012 "X_SHAPE", ev->win, _e_mod_comp_win_is_border(cw),
3013 e_mod_comp_util_client_xid_get(cw), cw);
3014 _e_mod_comp_win_reshape(cw);
3015 return ECORE_CALLBACK_PASS_ON;
3019 _e_mod_comp_damage(void *data __UNUSED__,
3020 int type __UNUSED__,
3023 Ecore_X_Event_Damage *ev = event;
3024 E_Comp_Win *cw = _e_mod_comp_win_damage_find(ev->damage);
3027 "[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p %4d %4d %3dx%3d\n",
3028 "X_DAMAGE", ev->drawable, _e_mod_comp_win_is_border(cw),
3029 e_mod_comp_util_client_xid_get(cw), cw,
3030 ev->area.x, ev->area.y, ev->area.width, ev->area.height);
3035 "[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p %4d %4d %3dx%3d ERR1\n",
3036 "X_DAMAGE", ev->drawable, _e_mod_comp_win_is_border(cw),
3037 e_mod_comp_util_client_xid_get(cw), cw,
3038 ev->area.x, ev->area.y, ev->area.width, ev->area.height);
3040 cw = _e_mod_comp_border_client_find(ev->drawable);
3044 L(LT_EVENT_X,"[COMP] ev:%15.15s w:0x%08x bd:%d c:0x%08x cw:%p %4d %4d %3dx%3d ERR2\n",
3045 "X_DAMAGE", ev->drawable, _e_mod_comp_win_is_border(cw),
3046 e_mod_comp_util_client_xid_get(cw), cw,
3047 ev->area.x, ev->area.y, ev->area.width, ev->area.height);
3048 return ECORE_CALLBACK_PASS_ON;
3052 _e_mod_comp_win_damage(cw,
3053 ev->area.x, ev->area.y,
3054 ev->area.width, ev->area.height, 1);
3055 return ECORE_CALLBACK_PASS_ON;
3059 _e_mod_comp_damage_win(void *data __UNUSED__,
3060 int type __UNUSED__,
3063 Ecore_X_Event_Window_Damage *ev = event;
3066 E_Comp_Canvas *canvas;
3068 L(LT_EVENT_X, "[COMP] ev:%15.15s w:0x%08x\n", "WINDOW_DAMAGE", ev->win);
3070 // fixme: use hash if compositors list > 4
3071 EINA_LIST_FOREACH(compositors, l, c)
3074 EINA_LIST_FOREACH(c->canvases, ll, canvas)
3076 if (!canvas) continue;
3077 if (ev->win == canvas->ee_win)
3079 // expose on comp win - init win or some other bypass win did it
3080 _e_mod_comp_render_queue(c);
3085 return ECORE_CALLBACK_PASS_ON;
3089 _e_mod_comp_randr(void *data __UNUSED__,
3090 int type __UNUSED__,
3091 void *event __UNUSED__)
3095 E_Comp_Canvas *canvas;
3098 "[COMP] ev:%15.15s\n",
3101 if (_comp_mod->conf->canvas_per_zone)
3102 return ECORE_CALLBACK_PASS_ON;
3104 EINA_LIST_FOREACH(compositors, l, c)
3107 canvas = eina_list_data_get(c->canvases);
3108 if (!canvas) continue;
3109 ecore_evas_resize(canvas->ee,
3113 return ECORE_CALLBACK_PASS_ON;
3117 _e_mod_comp_bd_add(void *data __UNUSED__,
3118 int type __UNUSED__,
3121 E_Event_Border_Add *ev = event;
3124 E_Comp_Canvas *canvas;
3125 E_Comp* c = _e_mod_comp_find(ev->border->zone->container->manager->root);
3128 "[COMP] ev:%15.15s w:0x%08x c:0x%08x\n", "BD_ADD",
3129 ev->border->win, ev->border->client.win);
3131 if (!c) return ECORE_CALLBACK_PASS_ON;
3132 if (_e_mod_comp_win_find(ev->border->win)) return ECORE_CALLBACK_PASS_ON;
3133 if (c->win == ev->border->win) return ECORE_CALLBACK_PASS_ON;
3134 EINA_LIST_FOREACH(c->canvases, l, canvas)
3136 if (canvas->ee_win == ev->border->win) return ECORE_CALLBACK_PASS_ON;
3138 cw = _e_mod_comp_win_add(c, ev->border->win);
3140 _e_mod_comp_win_configure
3141 (cw, ev->border->x, ev->border->y,
3142 ev->border->w, ev->border->h,
3143 ev->border->client.initial_attributes.border);
3145 if (ev->border->internal && ev->border->visible)
3146 _e_mod_comp_win_show(cw);
3148 if (!ev->border->borderless)
3149 e_mod_comp_effect_signal_add(cw, NULL, "e,state,shadow,on", "e");
3151 return ECORE_CALLBACK_PASS_ON;
3155 _e_mod_comp_bd_del(void *data __UNUSED__,
3156 int type __UNUSED__,
3159 E_Event_Border_Remove *ev = event;
3160 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
3163 "[COMP] ev:%15.15s w:0x%08x c:0x%08x\n", "BD_DEL",
3164 ev->border->win, ev->border->client.win);
3166 if (!cw) return ECORE_CALLBACK_PASS_ON;
3167 if (cw->bd == ev->border)
3169 if (!ev->border->borderless)
3170 e_mod_comp_effect_signal_add(cw, NULL, "e,state,shadow,off", "e");
3172 _e_mod_comp_object_del(cw, ev->border);
3174 return ECORE_CALLBACK_PASS_ON;
3178 _e_mod_comp_bd_show(void *data __UNUSED__,
3179 int type __UNUSED__,
3182 E_Event_Border_Show *ev = event;
3183 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
3186 "[COMP] ev:%15.15s w:0x%08x c:0x%08x\n", "BD_SHOW",
3187 ev->border->win, ev->border->client.win);
3189 if (!cw) return ECORE_CALLBACK_PASS_ON;
3190 if (cw->visible) return ECORE_CALLBACK_PASS_ON;
3191 _e_mod_comp_win_show(cw);
3193 if (_comp_mod->conf->use_hw_ov &&
3194 TYPE_INDICATOR_CHECK(cw))
3197 E_Comp_Canvas *canvas;
3198 EINA_LIST_FOREACH(cw->c->canvases, l, canvas)
3200 if (!canvas) continue;
3201 if (!canvas->ov) continue;
3202 e_mod_comp_hw_ov_win_update(canvas->ov, cw);
3207 return ECORE_CALLBACK_PASS_ON;
3211 _e_mod_comp_bd_hide(void *data __UNUSED__,
3212 int type __UNUSED__,
3215 E_Event_Border_Hide *ev = event;
3216 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
3219 "[COMP] ev:%15.15s w:0x%08x c:0x%08x\n", "BD_HIDE",
3220 ev->border->win, ev->border->client.win);
3222 if (!cw) return ECORE_CALLBACK_PASS_ON;
3223 if (!cw->visible) return ECORE_CALLBACK_PASS_ON;
3224 _e_mod_comp_win_hide(cw);
3226 if (_comp_mod->conf->use_hw_ov &&
3227 TYPE_INDICATOR_CHECK(cw))
3230 E_Comp_Canvas *canvas;
3231 EINA_LIST_FOREACH(cw->c->canvases, l, canvas)
3233 if (!canvas) continue;
3234 if (!canvas->ov) continue;
3235 e_mod_comp_hw_ov_win_hide(canvas->ov, cw);
3238 return ECORE_CALLBACK_PASS_ON;
3242 _e_mod_comp_bd_move(void *data __UNUSED__,
3243 int type __UNUSED__,
3246 E_Event_Border_Move *ev = event;
3247 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
3248 if (!cw) return ECORE_CALLBACK_PASS_ON;
3251 "[COMP] ev:%15.15s w:0x%08x c:0x%08x v:%d \
3252 cw[%d,%d] hidden[%d,%d] ev[%d,%d]\n", "BD_MOVE",
3253 ev->border->win, ev->border->client.win, cw->visible,
3254 cw->x, cw->y, cw->hidden.x, cw->hidden.y,
3255 ev->border->x, ev->border->y);
3257 if (!((cw->x == ev->border->x) &&
3258 (cw->y == ev->border->y)) &&
3261 _e_mod_comp_win_configure
3262 (cw, ev->border->x, ev->border->y,
3263 ev->border->w, ev->border->h, 0);
3265 else if (!((cw->hidden.x == ev->border->x) &&
3266 (cw->hidden.y == ev->border->y)) &&
3269 _e_mod_comp_win_configure
3270 (cw, ev->border->x, ev->border->y,
3271 ev->border->w, ev->border->h, 0);
3273 return ECORE_CALLBACK_PASS_ON;
3277 _e_mod_comp_bd_resize(void *data __UNUSED__,
3278 int type __UNUSED__,
3281 E_Event_Border_Resize *ev = event;
3282 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
3285 "[COMP] ev:%15.15s w:0x%08x c:0x%08x ev:%4dx%4d\n",
3286 "BD_RESIZE", ev->border->win, ev->border->client.win,
3287 ev->border->w, ev->border->h);
3289 if (!cw) return ECORE_CALLBACK_PASS_ON;
3290 if ((cw->w == ev->border->w) && (cw->h == ev->border->h))
3291 return ECORE_CALLBACK_PASS_ON;
3292 _e_mod_comp_win_configure
3294 ev->border->w, ev->border->h, cw->border);
3295 return ECORE_CALLBACK_PASS_ON;
3299 _e_mod_comp_bd_iconify(void *data __UNUSED__,
3300 int type __UNUSED__,
3303 E_Event_Border_Iconify *ev = event;
3304 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
3307 "[COMP] ev:%15.15s w:0x%08x c:0x%08x\n", "BD_ICONIFY",
3308 ev->border->win, ev->border->client.win);
3310 if (!cw) return ECORE_CALLBACK_PASS_ON;
3311 // fimxe: special iconfiy anim
3312 return ECORE_CALLBACK_PASS_ON;
3316 _e_mod_comp_bd_uniconify(void *data __UNUSED__,
3317 int type __UNUSED__,
3320 E_Event_Border_Uniconify *ev = event;
3321 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
3324 "[COMP] ev:%15.15s w:0x%08x c:0x%08x\n", "BD_UNICONIFY",
3325 ev->border->win, ev->border->client.win);
3327 if (!cw) return ECORE_CALLBACK_PASS_ON;
3328 // fimxe: special uniconfiy anim
3329 return ECORE_CALLBACK_PASS_ON;
3333 _e_mod_comp_bd_urgent_change(void *data __UNUSED__,
3334 int type __UNUSED__,
3337 E_Event_Border_Urgent_Change *ev = event;
3338 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
3340 L(LT_EVENT_X, "[COMP] ev:%15.15s w:0x%08x\n",
3341 "URGENT_CHANGE", ev->border ? ev->border->win : 0);
3343 if (!cw) return ECORE_CALLBACK_PASS_ON;
3344 if (cw->bd->client.icccm.urgent)
3345 e_mod_comp_effect_signal_add(cw, NULL, "e,state,urgent,on", "e");
3347 e_mod_comp_effect_signal_add(cw, NULL, "e,state,urgent,off", "e");
3348 return ECORE_CALLBACK_PASS_ON;
3352 _e_mod_comp_bd_focus_in(void *data __UNUSED__,
3353 int type __UNUSED__,
3356 E_Event_Border_Focus_In *ev = event;
3357 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
3360 "[COMP] ev:%15.15s w:0x%08x c:0x%08x\n", "BD_FOCUS_IN",
3361 ev->border->win, ev->border->client.win);
3363 if (!cw) return ECORE_CALLBACK_PASS_ON;
3364 e_mod_comp_effect_signal_add(cw, NULL, "e,state,focus,on", "e");
3365 return ECORE_CALLBACK_PASS_ON;
3369 _e_mod_comp_bd_focus_out(void *data __UNUSED__,
3370 int type __UNUSED__,
3373 E_Event_Border_Focus_Out *ev = event;
3374 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
3377 "[COMP] ev:%15.15s w:0x%08x c:0x%08x\n", "BD_FOCUS_OUT",
3378 ev->border->win, ev->border->client.win);
3380 if (!cw) return ECORE_CALLBACK_PASS_ON;
3381 e_mod_comp_effect_signal_add(cw, NULL, "e,state,focus,off", "e");
3382 return ECORE_CALLBACK_PASS_ON;
3386 _e_mod_comp_bd_property(void *data __UNUSED__,
3387 int type __UNUSED__,
3390 E_Event_Border_Property *ev = event;
3391 E_Comp_Win *cw = _e_mod_comp_win_find(ev->border->win);
3392 if (!cw) return ECORE_CALLBACK_PASS_ON;
3393 // fimxe: other properties?
3394 return ECORE_CALLBACK_PASS_ON;
3398 _e_mod_comp_key_down(void *data __UNUSED__,
3399 int type __UNUSED__,
3402 Ecore_Event_Key *ev = (Ecore_Event_Key *)event;
3403 E_CHECK_RETURN(ev, 0);
3405 if ((!strcmp(ev->keyname, "Home")) &&
3406 (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) &&
3407 (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) &&
3408 (ev->modifiers & ECORE_EVENT_MODIFIER_ALT))
3412 _e_mod_config_free(_comp_mod->module);
3413 _e_mod_config_new(_comp_mod->module);
3415 e_module_disable(_comp_mod->module);
3417 e_sys_action_do(E_SYS_RESTART, NULL);
3420 return ECORE_CALLBACK_PASS_ON;
3423 //////////////////////////////////////////////////////////////////////////
3425 _e_mod_comp_evas_get_func(void *data,
3426 E_Manager *man __UNUSED__)
3428 E_Comp *c = (E_Comp *)data;
3430 E_Comp_Canvas *canvas;
3432 E_CHECK_RETURN(c, 0);
3434 z = e_util_zone_current_get(c->man);
3435 EINA_LIST_FOREACH(c->canvases, l, canvas)
3437 if (!_comp_mod->conf->canvas_per_zone)
3438 return canvas->evas;
3439 else if ((canvas->zone) && (canvas->zone == z))
3440 return canvas->evas;
3446 _e_mod_comp_update_func(void *data,
3447 E_Manager *man __UNUSED__)
3449 E_Comp *c = (E_Comp *)data;
3451 _e_mod_comp_render_queue(c);
3454 static E_Manager_Comp_Source *
3455 _e_mod_comp_src_get_func(void *data __UNUSED__,
3456 E_Manager *man __UNUSED__,
3459 return (E_Manager_Comp_Source *)_e_mod_comp_win_find(win);
3462 static const Eina_List *
3463 _e_mod_comp_src_list_get_func(void *data,
3464 E_Manager *man __UNUSED__)
3466 E_Comp *c = (E_Comp *)data;
3470 E_CHECK_RETURN(c, 0);
3471 E_CHECK_RETURN(c->wins, 0);
3473 // source list should always be updated if multi-canvas is enabled.
3474 if (_comp_mod->conf->canvas_per_zone)
3476 if (c->wins_invalid) c->wins_invalid = 0;
3479 eina_list_free(c->wins_list);
3480 c->wins_list = NULL;
3482 E_Zone *z = e_util_zone_current_get(c->man);
3483 EINA_INLIST_FOREACH(c->wins, cw)
3485 EINA_LIST_FOREACH(cw->objs, l, co)
3487 if ((co->shadow) && (co->img) && (z == co->zone))
3488 c->wins_list = eina_list_append(c->wins_list, cw);
3494 if (c->wins_invalid)
3496 c->wins_invalid = 0;
3499 eina_list_free(c->wins_list);
3500 c->wins_list = NULL;
3502 EINA_INLIST_FOREACH(c->wins, cw)
3504 EINA_LIST_FOREACH(cw->objs, l, co)
3506 if ((co->shadow) && (co->img))
3507 c->wins_list = eina_list_append(c->wins_list, cw);
3512 return c->wins_list;
3515 static Evas_Object *
3516 _e_mod_comp_src_image_get_func(void *data,
3517 E_Manager *man __UNUSED__,
3518 E_Manager_Comp_Source *src)
3520 E_Comp *c = (E_Comp *)data;
3521 E_Comp_Win *cw = (E_Comp_Win *)src;
3525 E_CHECK_RETURN(cw, 0);
3526 E_CHECK_RETURN(cw->c, 0);
3528 if (cw->bd) z = cw->bd->zone;
3529 else z = e_util_zone_current_get(c->man);
3530 EINA_LIST_FOREACH(cw->objs, l, co)
3532 if (!_comp_mod->conf->canvas_per_zone)
3534 else if ((co->zone) && (co->zone == z))
3540 static Evas_Object *
3541 _e_mod_comp_src_shadow_get_func(void *data,
3542 E_Manager *man __UNUSED__,
3543 E_Manager_Comp_Source *src)
3545 E_Comp *c = (E_Comp *)data;
3546 E_Comp_Win *cw = (E_Comp_Win *)src;
3550 E_CHECK_RETURN(cw, 0);
3551 E_CHECK_RETURN(cw->c, 0);
3553 if (cw->bd) z = cw->bd->zone;
3554 else z = e_util_zone_current_get(c->man);
3555 EINA_LIST_FOREACH(cw->objs, l, co)
3557 if (!_comp_mod->conf->canvas_per_zone)
3559 else if ((co->zone) && (co->zone == z))
3565 static Evas_Object *
3566 _e_mod_comp_src_image_mirror_add_func(void *data __UNUSED__,
3567 E_Manager *man __UNUSED__,
3568 E_Manager_Comp_Source *src)
3570 E_Comp_Win *cw = (E_Comp_Win *)src;
3572 E_Comp_Canvas *canvas;
3573 E_CHECK_RETURN(cw, 0);
3574 E_CHECK_RETURN(cw->c, 0);
3576 if (_comp_mod->conf->nocomp_fs)
3578 EINA_LIST_FOREACH(cw->c->canvases, l, canvas)
3580 if (!canvas) continue;
3581 if (!canvas->nocomp.run) continue;
3582 if (cw == canvas->nocomp.cw)
3585 "[COMP] %31s new_w:0x%08x nocomp.cw:0x%08x canvas:%d\n",
3586 "NOCOMP_END MIRROR_ADD", cw ? e_mod_comp_util_client_xid_get(cw) : 0,
3587 e_mod_comp_util_client_xid_get(canvas->nocomp.cw),
3590 _e_mod_comp_nocomp_end(canvas->comp,
3596 return _e_mod_comp_win_mirror_add(cw);
3600 _e_mod_comp_src_visible_get_func(void *data __UNUSED__,
3601 E_Manager *man __UNUSED__,
3602 E_Manager_Comp_Source *src)
3604 E_Comp_Win *cw = (E_Comp_Win *)src;
3605 E_CHECK_RETURN(cw, 0);
3606 E_CHECK_RETURN(cw->c, 0);
3611 _e_mod_comp_src_hidden_set_func(void *data __UNUSED__,
3612 E_Manager *man __UNUSED__,
3613 E_Manager_Comp_Source *src,
3616 E_Comp_Win *cw = (E_Comp_Win *)src;
3621 if (cw->hidden_override == hidden) return;
3622 cw->hidden_override = hidden;
3624 e_border_comp_hidden_set(cw->bd,
3625 cw->hidden_override);
3626 EINA_LIST_FOREACH(cw->objs, l, co)
3630 if (cw->hidden_override)
3631 evas_object_hide(co->shadow);
3632 else if (!cw->bd || cw->bd->visible)
3633 evas_object_show(co->shadow);
3637 if (cw->hidden_override)
3638 evas_object_hide(co->shadow);
3644 _e_mod_comp_src_hidden_get_func(void *data __UNUSED__,
3645 E_Manager *man __UNUSED__,
3646 E_Manager_Comp_Source *src)
3648 E_Comp_Win *cw = (E_Comp_Win *)src;
3649 E_CHECK_RETURN(cw, 0);
3650 E_CHECK_RETURN(cw->c, 0);
3651 return cw->hidden_override;
3655 _e_mod_comp_src_popup_get_func(void *data __UNUSED__,
3656 E_Manager *man __UNUSED__,
3657 E_Manager_Comp_Source *src)
3659 E_Comp_Win *cw = (E_Comp_Win *)src;
3660 E_CHECK_RETURN(cw, 0);
3661 E_CHECK_RETURN(cw->c, 0);
3666 _e_mod_comp_src_border_get_func(void *data __UNUSED__,
3667 E_Manager *man __UNUSED__,
3668 E_Manager_Comp_Source *src)
3670 E_Comp_Win *cw = (E_Comp_Win *)src;
3671 E_CHECK_RETURN(cw, 0);
3672 E_CHECK_RETURN(cw->c, 0);
3676 static Ecore_X_Window
3677 _e_mod_comp_src_window_get_func(void *data __UNUSED__,
3678 E_Manager *man __UNUSED__,
3679 E_Manager_Comp_Source *src)
3681 E_Comp_Win *cw = (E_Comp_Win *)src;
3682 E_CHECK_RETURN(cw, 0);
3683 E_CHECK_RETURN(cw->c, 0);
3688 _e_mod_comp_src_input_region_set_func(void *data __UNUSED__,
3689 E_Manager *man __UNUSED__,
3690 E_Manager_Comp_Source *src,
3696 E_Comp_Win *cw = (E_Comp_Win *)src;
3697 Eina_Bool res = EINA_FALSE;
3698 E_CHECK_RETURN(cw, 0);
3699 E_CHECK_RETURN(cw->c, 0);
3701 if (!cw->shape_input)
3702 cw->shape_input = e_mod_comp_win_shape_input_new(cw);
3703 E_CHECK_RETURN(cw->shape_input, 0);
3705 res = e_mod_comp_win_shape_input_rect_set(cw->shape_input, x, y, w, h);
3706 E_CHECK_RETURN(res, 0);
3708 e_mod_comp_win_shape_input_invalid_set(cw->c, 1);
3709 _e_mod_comp_win_render_queue(cw);
3714 _e_mod_comp_src_move_lock_func(void *data __UNUSED__,
3715 E_Manager *man __UNUSED__,
3716 E_Manager_Comp_Source *src)
3718 E_Comp_Win *cw = (E_Comp_Win *)src;
3719 E_CHECK_RETURN(cw, 0);
3720 E_CHECK_RETURN(cw->c, 0);
3722 cw->move_lock = EINA_TRUE;
3728 _e_mod_comp_src_move_unlock_func(void *data __UNUSED__,
3729 E_Manager *man __UNUSED__,
3730 E_Manager_Comp_Source *src)
3732 E_Comp_Win *cw = (E_Comp_Win *)src;
3733 E_CHECK_RETURN(cw, 0);
3734 E_CHECK_RETURN(cw->c, 0);
3736 cw->move_lock = EINA_FALSE;
3737 e_mod_comp_win_comp_objs_move(cw, cw->x, cw->y);
3742 _e_mod_comp_composite_mode_set(void *data,
3743 E_Manager *man __UNUSED__,
3747 E_Comp *c = (E_Comp *)data;
3748 E_Comp_Canvas *canvas;
3751 E_CHECK(_comp_mod->conf->nocomp_fs);
3754 EINA_LIST_FOREACH(c->canvases, l, canvas)
3756 if (!canvas) continue;
3757 if (canvas->zone == zone)
3761 if (!canvas->nocomp.force_composite)
3763 canvas->nocomp.force_composite = set;
3764 e_mod_comp_hw_ov_win_msg_show
3765 (E_COMP_LOG_TYPE_NOCOMP,
3766 ">> %d COMP REQUEST", canvas->num);
3768 if (canvas->nocomp.cw)
3770 canvas->nocomp.cw->update = 1;
3771 c->updates = eina_list_append(c->updates, canvas->nocomp.cw);
3772 _e_mod_comp_win_render_queue(canvas->nocomp.cw);
3776 _e_mod_comp_render_queue(c);
3782 if (canvas->nocomp.force_composite)
3784 canvas->nocomp.force_composite = EINA_FALSE;
3785 e_mod_comp_hw_ov_win_msg_show
3786 (E_COMP_LOG_TYPE_NOCOMP,
3787 ">> %d NOCOMP REQUEST", canvas->num);
3796 _e_mod_comp_composite_mode_get(void *data,
3797 E_Manager *man __UNUSED__,
3800 E_Comp *c = (E_Comp *)data;
3801 E_Comp_Canvas *canvas;
3804 E_CHECK_RETURN(_comp_mod->conf->nocomp_fs, 1);
3805 E_CHECK_RETURN(c, 1);
3807 EINA_LIST_FOREACH(c->canvases, l, canvas)
3809 if (!canvas) continue;
3810 if (canvas->zone == zone)
3811 return !(canvas->nocomp.run);
3817 _e_mod_comp_add(E_Manager *man)
3820 Ecore_X_Window *wins;
3821 Ecore_X_Window_Attributes att;
3827 E_Comp_Canvas *canvas;
3830 c = E_NEW(E_Comp, 1);
3831 E_CHECK_RETURN(c, NULL);
3833 res = ecore_x_screen_is_composited(man->num);
3836 e_util_dialog_internal
3837 (_("Compositor Error"),
3838 _("Another compositor is already running<br>"
3839 "on your screen."));
3844 c->cm_selection = ecore_x_window_input_new(man->root, 0, 0, 1, 1);
3845 if (!c->cm_selection)
3850 ecore_x_screen_is_composited_set(man->num, c->cm_selection);
3852 ecore_x_e_comp_sync_supported_set(man->root, _comp_mod->conf->efl_sync);
3855 c->win = ecore_x_composite_render_window_enable(man->root);
3858 e_util_dialog_internal
3859 (_("Compositor Error"),
3860 _("Your screen does not support the compositor<br>"
3861 "overlay window. This is needed for it to<br>"
3867 memset((&att), 0, sizeof(Ecore_X_Window_Attributes));
3868 ecore_x_window_attributes_get(c->win, &att);
3870 if ((att.depth != 24) && (att.depth != 32))
3872 e_util_dialog_internal
3873 (_("Compositor Error"),
3874 _("Your screen is not in 24/32bit display mode.<br>"
3875 "This is required to be your default depth<br>"
3876 "setting for the compositor to work properly."));
3877 ecore_x_composite_render_window_disable(c->win);
3882 if (c->man->num == 0) e_alert_composite_win = c->win;
3884 e_mod_comp_screen_lock_init(&(c->lock));
3886 if (_comp_mod->conf->canvas_per_zone)
3888 EINA_LIST_FOREACH(man->containers, l, con)
3890 EINA_LIST_FOREACH(con->zones, ll, zone)
3892 if (!zone) continue;
3893 canvas = e_mod_comp_canvas_add(c, zone);
3896 ecore_x_composite_render_window_disable(c->win);
3906 canvas = e_mod_comp_canvas_add(c, NULL);
3909 ecore_x_composite_render_window_disable(c->win);
3915 ecore_x_composite_redirect_subwindows
3916 (c->man->root, ECORE_X_COMPOSITE_UPDATE_MANUAL);
3918 wins = ecore_x_window_children_get(c->man->root, &num);
3921 for (i = 0; i < num; i++)
3924 int x, y, w, h, border;
3925 char *wname = NULL, *wclass = NULL;
3927 ecore_x_icccm_name_class_get(wins[i], &wname, &wclass);
3928 if ((man->initwin == wins[i]) ||
3929 ((wname) && (wclass) && (!strcmp(wname, "E")) &&
3930 (!strcmp(wclass, "Init_Window"))))
3934 ecore_x_window_reparent(wins[i], c->win, 0, 0);
3938 if (wname) free(wname);
3939 if (wclass) free(wclass);
3940 wname = wclass = NULL;
3941 cw = _e_mod_comp_win_add(c, wins[i]);
3943 ecore_x_window_geometry_get(cw->win, &x, &y, &w, &h);
3944 border = ecore_x_window_border_width_get(cw->win);
3945 if (wins[i] == c->win) continue;
3946 _e_mod_comp_win_configure(cw, x, y, w, h, border);
3947 if (ecore_x_window_visible_get(wins[i]))
3948 _e_mod_comp_win_show(cw);
3953 ecore_x_window_key_grab
3954 (c->man->root, "Home",
3955 ECORE_EVENT_MODIFIER_SHIFT |
3956 ECORE_EVENT_MODIFIER_CTRL |
3957 ECORE_EVENT_MODIFIER_ALT, 0);
3958 ecore_x_window_key_grab
3960 ECORE_EVENT_MODIFIER_SHIFT |
3961 ECORE_EVENT_MODIFIER_CTRL |
3962 ECORE_EVENT_MODIFIER_ALT, 0);
3965 c->comp.func.evas_get = _e_mod_comp_evas_get_func;
3966 c->comp.func.update = _e_mod_comp_update_func;
3967 c->comp.func.src_get = _e_mod_comp_src_get_func;
3968 c->comp.func.src_list_get = _e_mod_comp_src_list_get_func;
3969 c->comp.func.src_image_get = _e_mod_comp_src_image_get_func;
3970 c->comp.func.src_shadow_get = _e_mod_comp_src_shadow_get_func;
3971 c->comp.func.src_image_mirror_add = _e_mod_comp_src_image_mirror_add_func;
3972 c->comp.func.src_visible_get = _e_mod_comp_src_visible_get_func;
3973 c->comp.func.src_hidden_set = _e_mod_comp_src_hidden_set_func;
3974 c->comp.func.src_hidden_get = _e_mod_comp_src_hidden_get_func;
3975 c->comp.func.src_window_get = _e_mod_comp_src_window_get_func;
3976 c->comp.func.src_border_get = _e_mod_comp_src_border_get_func;
3977 c->comp.func.src_popup_get = _e_mod_comp_src_popup_get_func;
3978 c->comp.func.screen_lock = e_mod_comp_screen_lock_func;
3979 c->comp.func.screen_unlock = e_mod_comp_screen_unlock_func;
3980 c->comp.func.src_input_region_set = _e_mod_comp_src_input_region_set_func;
3981 c->comp.func.src_move_lock = _e_mod_comp_src_move_lock_func;
3982 c->comp.func.src_move_unlock = _e_mod_comp_src_move_unlock_func;
3983 c->comp.func.composite_mode_set = _e_mod_comp_composite_mode_set;
3984 c->comp.func.composite_mode_get = _e_mod_comp_composite_mode_get;
3986 e_manager_comp_set(c->man, &(c->comp));
3991 _e_mod_comp_del(E_Comp *c)
3994 E_Comp_Canvas *canvas;
3996 e_manager_comp_set(c->man, NULL);
3998 ecore_x_window_key_ungrab
4000 ECORE_EVENT_MODIFIER_SHIFT |
4001 ECORE_EVENT_MODIFIER_CTRL |
4002 ECORE_EVENT_MODIFIER_ALT, 0);
4003 ecore_x_window_key_ungrab
4004 (c->man->root, "Home",
4005 ECORE_EVENT_MODIFIER_SHIFT |
4006 ECORE_EVENT_MODIFIER_CTRL |
4007 ECORE_EVENT_MODIFIER_ALT, 0);
4009 _e_mod_comp_x_grab_set(c, EINA_FALSE);
4012 cw = (E_Comp_Win *)(c->wins);
4015 ecore_x_sync_counter_free(cw->counter);
4017 cw->sync_info.val = 0;
4020 _e_mod_comp_win_hide(cw);
4022 _e_mod_comp_win_del(cw);
4025 EINA_LIST_FREE(c->canvases, canvas) e_mod_comp_canvas_del(canvas);
4028 ecore_x_composite_unredirect_subwindows
4029 (c->man->root, ECORE_X_COMPOSITE_UPDATE_MANUAL);
4030 ecore_x_composite_render_window_disable(c->win);
4031 if (c->man->num == 0) e_alert_composite_win = 0;
4032 if (c->render_animator) ecore_animator_del(c->render_animator);
4033 if (c->new_up_timer) ecore_timer_del(c->new_up_timer);
4034 if (c->update_job) ecore_job_del(c->update_job);
4035 if (c->wins_list) eina_list_free(c->wins_list);
4037 ecore_x_window_free(c->cm_selection);
4038 ecore_x_e_comp_sync_supported_set(c->man->root, 0);
4039 ecore_x_screen_is_composited_set(c->man->num, 0);
4044 ///////////////////////////////////////////////////////////////////////////////////////////
4046 _e_mod_comp_zone_move_resize(void *data __UNUSED__,
4047 int type __UNUSED__,
4050 E_Event_Zone_Move_Resize *ev = (E_Event_Zone_Move_Resize *)event;
4053 E_Comp_Canvas *canvas;
4054 if (!(ev && ev->zone))
4055 return ECORE_CALLBACK_PASS_ON;
4057 if (!_comp_mod->conf->canvas_per_zone)
4058 return ECORE_CALLBACK_PASS_ON;
4061 "[COMP] ev:%15.15s\n",
4062 "E_ZONE_MOVE_RESIZE");
4064 EINA_LIST_FOREACH(compositors, l, c)
4067 EINA_LIST_FOREACH(c->canvases, ll, canvas)
4069 if (!canvas) continue;
4070 if (canvas->zone != ev->zone) continue;
4071 if (!((ev->zone->x == canvas->x) &&
4072 (ev->zone->y == canvas->y)))
4074 canvas->x = ev->zone->x;
4075 canvas->y = ev->zone->y;
4076 ecore_evas_move(canvas->ee,
4080 if (!((ev->zone->w == canvas->w) &&
4081 (ev->zone->h == canvas->h)))
4083 canvas->w = ev->zone->w;
4084 canvas->h = ev->zone->h;
4085 ecore_evas_resize(canvas->ee,
4092 return ECORE_CALLBACK_PASS_ON;
4096 _e_mod_comp_zone_add(void *data __UNUSED__,
4097 int type __UNUSED__,
4100 E_Event_Zone_Add *ev = (E_Event_Zone_Add *)event;
4103 E_Comp_Canvas *canvas;
4106 Eina_Bool found = EINA_FALSE;
4107 if ((!ev) || (!ev->zone) ||
4108 (!ev->zone->container))
4110 return ECORE_CALLBACK_PASS_ON;
4112 if (!_comp_mod->conf->canvas_per_zone)
4114 return ECORE_CALLBACK_PASS_ON;
4117 EINA_LIST_FOREACH(compositors, l, c)
4119 EINA_LIST_FOREACH(c->canvases, ll, canvas)
4121 if (canvas->zone == ev->zone)
4129 if (found) return ECORE_CALLBACK_PASS_ON;
4132 "[COMP] ev:%15.15s\n",
4135 EINA_LIST_FOREACH(compositors, l, c)
4137 if ((!c) || (c->man != ev->zone->container->manager))
4142 canvas = e_mod_comp_canvas_add(c, ev->zone);
4143 if (!canvas) return ECORE_CALLBACK_PASS_ON;
4145 ecore_x_window_shape_rectangle_add(c->win,
4152 EINA_INLIST_FOREACH(c->wins, cw)
4154 Eina_Bool found = EINA_FALSE;
4156 E_Comp_Canvas *_canvas;
4157 EINA_LIST_FOREACH(c->canvases, lll, _canvas)
4159 if (_canvas->ee_win == cw->win)
4166 co = e_mod_comp_obj_add(cw, canvas);
4169 cw->objs = eina_list_append(cw->objs, co);
4171 if ((!cw->input_only) && (!cw->invalid))
4173 e_mod_comp_win_shadow_setup(cw, co);
4174 e_mod_comp_win_cb_setup(cw, co);
4175 evas_object_show(co->img);
4177 if (cw->bd) evas_object_data_set(co->shadow, "border", cw->bd);
4179 evas_object_data_set(co->shadow, "popup", cw->pop);
4181 evas_object_data_set(co->shadow, "menu", cw->menu);
4183 evas_object_pass_events_set(co->img, 1);
4186 evas_object_pass_events_set(co->shadow, 1);
4187 evas_object_data_set(co->shadow, "win",
4188 (void *)((unsigned long)cw->win));
4189 evas_object_data_set(co->shadow, "src", cw);
4194 evas_object_move(co->shadow, cw->x - zx, cw->y - zy);
4195 evas_object_resize(co->shadow, cw->pw, cw->ph);
4199 evas_object_image_size_set(co->img, cw->pw, cw->ph);
4201 EINA_LIST_FOREACH(co->img_mirror, ll, o)
4203 evas_object_image_size_set(o, cw->pw, cw->ph);
4205 if ((cw->dmg_updates >= 1))
4208 if (!cw->hidden_override)
4209 evas_object_show(co->shadow);
4210 edje_object_signal_emit(co->shadow, "e,state,visible,on", "e");
4216 _e_mod_comp_win_render_queue(cw);
4218 cw->pending_count++;
4219 e_manager_comp_event_src_visibility_send
4220 (cw->c->man, (E_Manager_Comp_Source *)cw,
4221 _e_mod_comp_cb_pending_after, cw->c);
4224 } // end of eina_inlist
4226 return ECORE_CALLBACK_PASS_ON;
4230 _e_mod_comp_zone_del(void *data __UNUSED__,
4231 int type __UNUSED__,
4234 E_Event_Zone_Del *ev = (E_Event_Zone_Del *)event;
4235 Eina_List *l, *ll, *lll;
4237 E_Comp_Canvas *canvas;
4240 if (!ev || !ev->zone)
4242 return ECORE_CALLBACK_PASS_ON;
4244 if (!_comp_mod->conf->canvas_per_zone)
4246 return ECORE_CALLBACK_PASS_ON;
4250 "[COMP] ev:%15.15s\n",
4253 EINA_LIST_FOREACH(compositors, l, c)
4255 EINA_LIST_FOREACH(c->canvases, ll, canvas)
4257 if (canvas->zone != ev->zone) continue;
4258 EINA_INLIST_REVERSE_FOREACH(c->wins, cw)
4260 EINA_LIST_FOREACH(cw->objs, lll, co)
4262 if (co->zone != ev->zone) continue;
4263 cw->objs = eina_list_remove(cw->objs, co);
4264 e_mod_comp_obj_del(co);
4268 ecore_x_window_shape_rectangle_subtract(c->win,
4275 c->canvases = eina_list_remove(c->canvases, canvas);
4276 e_mod_comp_canvas_del(canvas);
4280 return ECORE_CALLBACK_PASS_ON;
4283 //////////////////////////////////////////////////////////////////////////
4286 e_mod_comp_init(void)
4290 unsigned int effect = 0;
4293 windows = eina_hash_string_superfast_new(NULL);
4294 borders = eina_hash_string_superfast_new(NULL);
4295 damages = eina_hash_string_superfast_new(NULL);
4297 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CREATE, _e_mod_comp_create, NULL));
4298 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DESTROY, _e_mod_comp_destroy, NULL));
4299 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW, _e_mod_comp_show, NULL));
4300 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_HIDE, _e_mod_comp_hide, NULL));
4301 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_REPARENT, _e_mod_comp_reparent, NULL));
4302 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE, _e_mod_comp_configure, NULL));
4303 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_STACK, _e_mod_comp_stack, NULL));
4304 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, _e_mod_comp_property, NULL));
4305 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, _e_mod_comp_message, NULL));
4306 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHAPE, _e_mod_comp_shape, NULL));
4307 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_DAMAGE_NOTIFY, _e_mod_comp_damage, NULL));
4308 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DAMAGE, _e_mod_comp_damage_win, NULL));
4309 handlers = eina_list_append(handlers, ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _e_mod_comp_key_down, NULL));
4310 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_CONTAINER_RESIZE, _e_mod_comp_randr, NULL));
4311 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_ADD, _e_mod_comp_bd_add, NULL));
4312 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_REMOVE, _e_mod_comp_bd_del, NULL));
4313 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_SHOW, _e_mod_comp_bd_show, NULL));
4314 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_HIDE, _e_mod_comp_bd_hide, NULL));
4315 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_MOVE, _e_mod_comp_bd_move, NULL));
4316 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_RESIZE, _e_mod_comp_bd_resize, NULL));
4317 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_ICONIFY, _e_mod_comp_bd_iconify, NULL));
4318 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_UNICONIFY, _e_mod_comp_bd_uniconify, NULL));
4319 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_URGENT_CHANGE, _e_mod_comp_bd_urgent_change, NULL));
4320 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_FOCUS_IN, _e_mod_comp_bd_focus_in, NULL));
4321 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_FOCUS_OUT, _e_mod_comp_bd_focus_out, NULL));
4322 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_BORDER_PROPERTY, _e_mod_comp_bd_property, NULL));
4323 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_ZONE_MOVE_RESIZE, _e_mod_comp_zone_move_resize, NULL));
4324 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_ZONE_ADD, _e_mod_comp_zone_add, NULL));
4325 handlers = eina_list_append(handlers, ecore_event_handler_add(E_EVENT_ZONE_DEL, _e_mod_comp_zone_del, NULL));
4327 res = e_mod_comp_atoms_init();
4328 E_CHECK_RETURN(res, 0);
4330 res = e_mod_comp_win_type_init();
4331 E_CHECK_RETURN(res, 0);
4333 res = e_mod_comp_policy_init();
4334 E_CHECK_RETURN(res, 0);
4336 if (!ecore_x_composite_query())
4338 e_util_dialog_internal
4339 (_("Compositor Error"),
4340 _("Your X Display does not support the XComposite extension<br>"
4341 "or Ecore was built without XComposite support.<br>"
4342 "Note that for composite support you will also need<br>"
4343 "XRender and XFixes support in X11 and Ecore."));
4346 if (!ecore_x_damage_query())
4348 e_util_dialog_internal
4349 (_("Compositor Error"),
4350 _("Your screen does not support the XDamage extension<br>"
4351 "or Ecore was built without XDamage support."));
4355 /* enable nocomp_fs for the authorized device */
4356 FILE *_fp = fopen("/sys/devices/platform/exynos-busfreq/modalias", "r");
4359 if (_comp_mod->conf->nocomp_fs)
4361 _comp_mod->conf->nocomp_fs = 0;
4362 printf("[COMP] change nocomp_fs 1 -> 0\n");
4364 if (_comp_mod->conf->use_hw_ov)
4366 _comp_mod->conf->use_hw_ov = 0;
4367 printf("[COMP] change use_hw_ov 1 -> 0\n");
4373 printf("[COMP] nocomp_fs:%d use_hw_ov:%d\n",
4374 _comp_mod->conf->nocomp_fs,
4375 _comp_mod->conf->use_hw_ov);
4377 EINA_LIST_FOREACH(e_manager_list(), l, man)
4381 c = _e_mod_comp_add(man);
4384 compositors = eina_list_append(compositors, c);
4385 e_mod_comp_util_set(c, man);
4386 ecore_animator_frametime_set(1.0f/60.0f);
4388 if (_comp_mod->conf->default_window_effect) effect = 1;
4389 ecore_x_window_prop_card32_set
4390 (c->man->root, ATOM_EFFECT_ENABLE,
4392 ecore_x_window_prop_property_set
4393 (c->man->root, ATOM_OVERAY_WINDOW,
4394 ECORE_X_ATOM_WINDOW, 32, &c->win, 1);
4402 e_mod_comp_shutdown(void)
4406 EINA_LIST_FREE(compositors, c) _e_mod_comp_del(c);
4408 E_FREE_LIST(handlers, ecore_event_handler_del);
4410 if (damages) eina_hash_free(damages);
4411 if (windows) eina_hash_free(windows);
4412 if (borders) eina_hash_free(borders);
4417 e_mod_comp_policy_shutdown();
4418 e_mod_comp_win_type_shutdown();
4419 e_mod_comp_atoms_shutdown();
4421 e_mod_comp_util_set(NULL, NULL);
4425 e_mod_comp_shadow_set(void)
4431 EINA_LIST_FOREACH(compositors, l, c)
4435 EINA_INLIST_FOREACH(c->wins, cw)
4438 Eina_Bool animatable = EINA_FALSE;
4439 Eina_Bool pending = EINA_TRUE;
4440 e_mod_comp_win_type_setup(cw);
4441 EINA_LIST_FOREACH(cw->objs, ll, co)
4444 if ((co->shadow) && (co->img))
4446 e_mod_comp_win_shadow_setup(cw, co);
4449 edje_object_signal_emit(co->shadow, "e,state,visible,on", "e");
4452 pending = EINA_FALSE;
4456 pending = EINA_FALSE;
4458 animatable = e_mod_comp_effect_state_get(cw->eff_type);
4460 e_mod_comp_effect_signal_add
4461 (cw, NULL, "e,state,visible,on", "e");
4463 e_mod_comp_effect_signal_add
4464 (cw, NULL, "e,state,visible,on,noeffect", "e");
4466 if (_comp_mod->conf->use_shadow)
4470 if (!cw->bd->borderless)
4471 e_mod_comp_effect_signal_add(cw, NULL, "e,state,shadow,on", "e");
4475 e_mod_comp_comp_event_src_visibility_send(cw);
4481 e_mod_comp_win_cb_setup(E_Comp_Win *cw,
4484 edje_object_signal_callback_add(co->shadow, "e,action,show,done", "e", _e_mod_comp_show_done, cw);
4485 edje_object_signal_callback_add(co->shadow, "e,action,hide,done", "e", _e_mod_comp_hide_done, cw);
4486 edje_object_signal_callback_add(co->shadow, "e,action,background,show,done", "e", _e_mod_comp_background_show_done, cw);
4487 edje_object_signal_callback_add(co->shadow, "e,action,background,hide,done", "e", _e_mod_comp_background_hide_done, cw);
4488 edje_object_signal_callback_add(co->shadow, "e,action,raise_above_hide,done","e", _e_mod_comp_raise_above_hide_done,cw);