1 #include "e_comp_object_intern.h"
2 #include "e_bindings_intern.h"
3 #include "e_utils_intern.h"
4 #include "e_comp_canvas_intern.h"
5 #include "e_comp_cfdata_intern.h"
6 #include "e_comp_wl_subsurface_intern.h"
7 #include "e_comp_wl_tbm_intern.h"
8 #include "e_comp_intern.h"
9 #include "e_pixmap_intern.h"
10 #include "e_map_intern.h"
11 #include "e_hwc_window_intern.h"
12 #include "e_hwc_windows_intern.h"
13 #include "e_policy_visibility_intern.h"
14 #include "e_client_video_intern.h"
15 #include "e_client_intern.h"
16 #include "e_zone_intern.h"
17 #include "e_theme_intern.h"
18 #include "e_config_intern.h"
22 = keys that return objects =
23 - E_Client: the client associated with the object (E_Client*)
24 - comp_smart_obj: cw->smart_obj (Evas_Object*)
25 - comp_obj: cw (E_Comp_Object*)
27 = keys that are bool flags =
28 - client_restack: client needs a protocol-level restack
29 - comp_override: object is triggering a nocomp override to force compositing
30 - comp_ref: object has a ref from visibility animations
31 - comp_showing: object is currently running its show animation
32 - comp_hiding: object is currently running its hiding animation
33 - comp_object: object is a compositor-created object
34 - comp_object_skip: object has a name which prohibits theme shadows
35 - comp_object-to_del: list of objects which will be deleted when this object is deleted
36 - comp_mirror: object is the result of e_comp_object_util_mirror_add()
37 - effect_running: object is animating by external module
40 #define UPDATE_MAX 512 // same as evas
41 #define FAILURE_MAX 2 // seems reasonable
42 #define SMART_NAME "e_comp_object"
43 #define INPUT_OBJ_SMART_NAME "input_object"
45 /* for non-util functions */
46 #define API_ENTRY E_Comp_Object *cw; \
47 cw = evas_object_smart_data_get(obj); \
48 if ((!obj) || (!cw) || (e_util_strcmp(evas_object_type_get(obj), SMART_NAME))) return
50 /* for util functions (obj may or may not be E_Comp_Object */
51 #define SOFT_ENTRY(...) E_Comp_Object *cw; \
54 CRI("YOU PASSED NULL! ARGH!"); \
57 cw = evas_object_smart_data_get(obj); \
58 if ((!cw) || (e_util_strcmp(evas_object_type_get(obj), SMART_NAME))) \
60 #define INTERNAL_ENTRY E_Comp_Object *cw; cw = evas_object_smart_data_get(obj); if (!cw) return;
62 /* enable for lots of client size info in console output */
64 # define e_util_size_debug_set(x, y)
67 /* enable along with display-specific damage INF calls to enable render tracing
71 #define RENDER_DEBUG(...) INF(__VA_ARGS__)
73 #define RENDER_DEBUG(...)
76 typedef struct _E_Input_Rect_Data
82 typedef struct _E_Input_Rect_Smart_Data
84 Eina_List *input_rect_data_list;
86 } E_Input_Rect_Smart_Data;
88 struct E_Comp_Object_Mover
91 E_Comp_Object_Mover_Cb func;
97 static Eina_Inlist *_e_comp_object_movers = NULL;
98 static Evas_Smart *_e_comp_smart = NULL;
99 static Evas_Smart *_e_comp_input_obj_smart = NULL;
101 static int _e_comp_object_hooks_delete = 0;
102 static int _e_comp_object_hooks_walking = 0;
104 static Eina_Inlist *_e_comp_object_hooks[] =
106 [E_COMP_OBJECT_HOOK_EFFECT_START] = NULL,
107 [E_COMP_OBJECT_HOOK_EFFECT_END] = NULL,
108 [E_COMP_OBJECT_HOOK_RESTACK] = NULL,
109 [E_COMP_OBJECT_HOOK_OBJECT_SETUP] = NULL,
110 [E_COMP_OBJECT_HOOK_LAYER_SET] = NULL,
111 [E_COMP_OBJECT_HOOK_MASK_OBJECT_SET] = NULL,
112 [E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET] = NULL,
113 [E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET] = NULL,
114 [E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_UNSET] = NULL,
117 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
118 static int _e_comp_object_intercept_hooks_delete = 0;
119 static int _e_comp_object_intercept_hooks_walking = 0;
121 static Eina_Inlist *_e_comp_object_intercept_hooks[] =
123 [E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER] = NULL,
124 [E_COMP_OBJECT_INTERCEPT_HOOK_HIDE] = NULL,
128 static Eina_Bool _damage_trace = EINA_FALSE;
129 static Eina_List *_damage_trace_objs = NULL;
130 static Eina_List *_damage_trace_post_objs = NULL;
132 /* sekrit functionzzz */
133 EINTERN void e_client_focused_set(E_Client *ec);
135 /* emitted every time a new noteworthy comp object is added */
136 EINTERN int E_EVENT_COMP_OBJECT_ADD = -1;
138 /* ecore event define */
139 EINTERN int E_EVENT_COMP_OBJECT_IMG_RENDER = -1;
140 EINTERN int E_EVENT_COMP_OBJECT_EFFECT_START = -1;
141 EINTERN int E_EVENT_COMP_OBJECT_EFFECT_END = -1;
143 static void _e_comp_object_dim_enable_set(E_Client *ec, Evas_Object *obj, Eina_Bool enable, Eina_Bool noeffect);
144 static Eina_Bool _e_comp_object_dim_enable_get(E_Client *ec, Evas_Object *obj);
145 static void _e_comp_object_dim_update(E_Comp_Object *cw);
146 static void _e_comp_object_native_surface_set(E_Comp_Object *cw, Evas_Native_Surface *ns, Eina_Bool with_mirror);
147 #ifdef REFACTOR_DESK_AREA
149 static void _e_comp_object_lower(E_Comp_Object *cw, Evas_Object *obj);
150 static void _e_comp_object_raise(Evas_Object *obj);
151 static void _e_comp_object_layer_set(Evas_Object *obj, short layer);
152 static void _e_comp_object_stack_above(Evas_Object *obj, Evas_Object *target);
153 static void _e_comp_object_stack_below(Evas_Object *obj, Evas_Object *target);
154 static void _e_comp_object_transform_obj_stack_update(Evas_Object *obj);
157 static E_Client *dim_client = NULL;
160 _e_comp_object_hooks_clean(void)
163 E_Comp_Object_Hook *ch;
166 for (x = 0; x < E_COMP_OBJECT_HOOK_LAST; x++)
167 EINA_INLIST_FOREACH_SAFE(_e_comp_object_hooks[x], l, ch)
169 if (!ch->delete_me) continue;
170 _e_comp_object_hooks[x] = eina_inlist_remove(_e_comp_object_hooks[x], EINA_INLIST_GET(ch));
176 _e_comp_object_hook_call(E_Comp_Object_Hook_Point hookpoint, E_Client *ec)
178 E_Comp_Object_Hook *ch;
179 Eina_Bool ret = EINA_TRUE;
181 if (e_object_is_del(E_OBJECT(ec)))
183 if ((hookpoint != E_COMP_OBJECT_HOOK_EFFECT_START) &&
184 (hookpoint != E_COMP_OBJECT_HOOK_EFFECT_END) &&
185 (hookpoint != E_COMP_OBJECT_HOOK_OBJECT_SETUP) &&
186 (hookpoint != E_COMP_OBJECT_HOOK_LAYER_SET) &&
187 (hookpoint != E_COMP_OBJECT_HOOK_RESTACK) &&
188 (hookpoint != E_COMP_OBJECT_HOOK_MASK_OBJECT_SET) &&
189 (hookpoint != E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET) &&
190 (hookpoint != E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET) &&
191 (hookpoint != E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_UNSET)
197 e_object_ref(E_OBJECT(ec));
198 _e_comp_object_hooks_walking++;
199 EINA_INLIST_FOREACH(_e_comp_object_hooks[hookpoint], ch)
201 if (ch->delete_me) continue;
202 if (!(ch->func(ch->data, ec)))
208 _e_comp_object_hooks_walking--;
209 if ((_e_comp_object_hooks_walking == 0) && (_e_comp_object_hooks_delete > 0))
210 _e_comp_object_hooks_clean();
212 e_object_unref(E_OBJECT(ec));
217 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
219 _e_comp_object_intercept_hooks_clean(void)
222 E_Comp_Object_Intercept_Hook *ch;
225 for (x = 0; x < E_COMP_OBJECT_INTERCEPT_HOOK_LAST; x++)
226 EINA_INLIST_FOREACH_SAFE(_e_comp_object_intercept_hooks[x], l, ch)
228 if (!ch->delete_me) continue;
229 _e_comp_object_intercept_hooks[x] = eina_inlist_remove(_e_comp_object_intercept_hooks[x], EINA_INLIST_GET(ch));
235 _e_comp_object_intercept_hook_call(E_Comp_Object_Intercept_Hook_Point hookpoint, E_Client *ec)
237 E_Comp_Object_Intercept_Hook *ch;
238 Eina_Bool ret = EINA_TRUE;
240 if (e_object_is_del(E_OBJECT(ec))) return ret;
241 e_object_ref(E_OBJECT(ec));
242 _e_comp_object_intercept_hooks_walking++;
243 EINA_INLIST_FOREACH(_e_comp_object_intercept_hooks[hookpoint], ch)
245 if (ch->delete_me) continue;
246 if (!(ch->func(ch->data, ec)))
252 _e_comp_object_intercept_hooks_walking--;
253 if ((_e_comp_object_intercept_hooks_walking == 0) && (_e_comp_object_intercept_hooks_delete > 0))
254 _e_comp_object_intercept_hooks_clean();
256 e_object_unref(E_OBJECT(ec));
263 _e_comp_object_event_free(void *d EINA_UNUSED, void *event)
265 E_Event_Comp_Object *ev = event;
268 ec = evas_object_data_get(ev->comp_object, "E_Client");
272 e_object_unref(E_OBJECT(ec));
274 evas_object_unref(ev->comp_object);
279 _e_comp_object_event_add(Evas_Object *obj)
281 E_Event_Comp_Object *ev;
284 if (stopping) return;
285 ev = E_NEW(E_Event_Comp_Object, 1);
286 EINA_SAFETY_ON_NULL_RETURN(ev);
288 evas_object_ref(obj);
289 ev->comp_object = obj;
290 ec = evas_object_data_get(ev->comp_object, "E_Client");
294 e_object_ref(E_OBJECT(ec));
296 ecore_event_add(E_EVENT_COMP_OBJECT_ADD, ev, _e_comp_object_event_free, NULL);
300 _e_comp_object_simple_free(void *d EINA_UNUSED, void *event)
302 E_Event_Comp_Object *ev = event;
305 ec = evas_object_data_get(ev->comp_object, "E_Client");
309 e_object_unref(E_OBJECT(ec));
311 evas_object_unref(ev->comp_object);
316 _e_comp_object_event_simple(Evas_Object *obj, int type)
318 E_Event_Comp_Object *ev;
321 ev = E_NEW(E_Event_Comp_Object, 1);
324 evas_object_ref(obj);
325 ev->comp_object = obj;
326 ec = evas_object_data_get(ev->comp_object, "E_Client");
330 e_object_ref(E_OBJECT(ec));
332 ecore_event_add(type, ev, (Ecore_End_Cb)_e_comp_object_simple_free, NULL);
334 /////////////////////////////////////
337 _e_comp_object_cb_mirror_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
339 E_Comp_Object *cw = data;
341 cw->obj_mirror = eina_list_remove(cw->obj_mirror, obj);
345 _e_comp_object_cb_mirror_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
347 E_Comp_Object *cw = data;
349 if ((!cw->force_visible) && (!e_object_is_del(E_OBJECT(cw->ec))))
350 evas_object_smart_callback_call(cw->smart_obj, "visibility_force", cw->ec);
353 if (e_comp->hwc && !e_comp_is_on_overlay(cw->ec))
354 e_comp_hwc_client_end(cw->ec, __FUNCTION__);
358 _e_comp_object_cb_mirror_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
360 E_Comp_Object *cw = data;
363 if ((!cw->force_visible) && (!e_object_is_del(E_OBJECT(cw->ec))))
364 evas_object_smart_callback_call(cw->smart_obj, "visibility_normal", cw->ec);
367 /////////////////////////////////////
369 #ifdef REFACTOR_DESK_AREA
371 e_comp_object_transform_obj_stack_update(Evas_Object *obj)
374 _e_comp_object_transform_obj_stack_update(Evas_Object *obj)
379 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
380 if (cw->ec->input_only) return;
382 layer = evas_object_layer_get(obj);
384 if (cw->transform_bg_obj)
386 if (layer != evas_object_layer_get(cw->transform_bg_obj))
388 evas_object_layer_set(cw->transform_bg_obj, layer);
391 evas_object_stack_below(cw->transform_bg_obj, obj);
394 if (cw->transform_tranp_obj)
396 if (layer != evas_object_layer_get(cw->transform_tranp_obj))
398 evas_object_layer_set(cw->transform_tranp_obj, layer);
401 evas_object_stack_below(cw->transform_tranp_obj, obj);
406 _e_comp_object_transform_obj_map_new(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
413 if (!map) return NULL;
415 e_map_util_points_populate_from_object_full(map, obj, 0);
416 e_map_util_points_color_set(map, 255, 255, 255, 255);
418 for (i = 0 ; i < 4 ; ++i)
423 e_util_transform_vertices_pos_round_get(vertices, i, &x, &y, 0, 0);
424 e_map_point_coord_set(map, i, x, y, 1.0);
431 _e_comp_object_transform_obj_map_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
437 E_Map *map = _e_comp_object_transform_obj_map_new(obj, vertices);
440 e_comp_object_map_set(obj, map);
441 e_comp_object_map_enable_set(obj, EINA_TRUE);
448 evas_object_map_enable_set(obj, EINA_FALSE);
453 _e_comp_object_transform_obj_map_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
459 E_Map *map = _e_comp_object_transform_obj_map_new(obj, vertices);
462 e_map_util_zoom(map, zoom.zoom_x, zoom.zoom_y, zoom.cx, zoom.cy);
464 e_comp_object_map_set(obj, map);
465 e_comp_object_map_enable_set(obj, EINA_TRUE);
472 evas_object_map_enable_set(obj, EINA_FALSE);
475 /////////////////////////////////////
477 static inline Eina_Bool
478 _e_comp_shaped_check(int w, int h, const Eina_Rectangle *rects, int num)
480 if (num > 1) return EINA_TRUE;
481 if ((rects[0].x == 0) && (rects[0].y == 0) &&
482 ((int)rects[0].w == w) && ((int)rects[0].h == h))
487 /////////////////////////////////////
489 /* add a client to the layer-client list */
490 #ifdef REFACTOR_DESK_AREA
493 _e_comp_input_thread_layers_update(void *data)
495 E_Comp_Input_Layer_Data *layer_data = data;
496 EINA_SAFETY_ON_NULL_RETURN(layer_data);
498 INF("[input thread|%s] layer(%u), function type(%d), item(%p), relative(%p)\n",
499 __func__, layer_data->layer, layer_data->type, layer_data->item, layer_data->relative);
500 e_comp_input_layers_update(layer_data);
504 _e_comp_object_layers_update(unsigned int layer, E_Comp_Input_Inlist_Function_Type type, E_Client *item, E_Client *relative)
506 E_Comp_Input_Layer_Data layer_data;
507 memset(&layer_data, 0, sizeof(E_Comp_Input_Layer_Data));
509 layer_data.layer = layer;
510 layer_data.type = type;
511 layer_data.item = item;
512 layer_data.relative = relative;
514 INF("[%s] layer(%u), function type(%d), item(%p), relative(%p)\n", __func__, layer, type, item, relative);
515 e_input_thread_safe_call(_e_comp_input_thread_layers_update, &layer_data, sizeof(E_Comp_Input_Layer_Data));
519 _e_comp_object_layers_add(E_Comp_Object *cw, E_Comp_Object *above, E_Comp_Object *below, Eina_Bool prepend)
521 g_rec_mutex_lock(&e_comp->ec_list_mutex);
525 e_comp->layers[above->layer].clients = eina_inlist_append_relative(e_comp->layers[above->layer].clients, EINA_INLIST_GET(cw->ec), EINA_INLIST_GET(above->ec));
526 _e_comp_object_layers_update(above->layer, E_COMP_INPUT_INLIST_APPEND_RELATIVE, e_comp->layers[above->layer].clients, cw->ec, above->ec);
530 e_comp->layers[below->layer].clients = eina_inlist_prepend_relative(e_comp->layers[below->layer].clients, EINA_INLIST_GET(cw->ec), EINA_INLIST_GET(below->ec));
531 _e_comp_object_layers_update(above->layer, E_COMP_INPUT_INLIST_APPEND_RELATIVE, cw->ec, above->ec);
533 if ((!above) && (!below))
537 e_comp->layers[cw->layer].clients = eina_inlist_prepend(e_comp->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
538 _e_comp_object_layers_update(cw->layer, E_COMP_INPUT_INLIST_PREPEND, cw->ec, NULL);
540 else //this is either the layer object or a tough actin tinactin^W^W^Wfast stacking client
542 e_comp->layers[cw->layer].clients = eina_inlist_append(e_comp->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
543 _e_comp_object_layers_update(cw->layer, E_COMP_INPUT_INLIST_APPEND, cw->ec, NULL);
546 e_comp->layers[cw->layer].clients_count++;
548 g_rec_mutex_unlock(&e_comp->ec_list_mutex);
552 _e_comp_object_layers_remove(E_Comp_Object *cw)
554 g_rec_mutex_lock(&e_comp->ec_list_mutex);
556 if (cw->ec && e_comp->layers[cw->layer].clients)
558 e_comp->layers[cw->layer].clients = eina_inlist_remove(e_comp->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
559 _e_comp_object_layers_update(cw->layer, E_COMP_INPUT_INLIST_REMOVE, cw->ec, NULL);
560 e_comp->layers[cw->layer].clients_count--;
563 g_rec_mutex_unlock(&e_comp->ec_list_mutex);
567 /////////////////////////////////////
569 _e_comp_object_alpha_set(E_Comp_Object *cw)
571 Eina_Bool alpha = cw->ec->argb;
573 if ((cw->external_content) &&
574 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
579 if (cw->blanked || cw->ns || cw->ec->shaped) alpha = EINA_TRUE;
580 if (cw->user_alpha_set) alpha = cw->user_alpha;
582 evas_object_image_alpha_set(cw->obj, alpha);
586 _e_comp_object_shadow(E_Comp_Object *cw)
588 if (e_client_util_shadow_state_get(cw->ec))
589 edje_object_signal_emit(cw->frame_object ?: cw->shobj, "e,state,shadow,on", "e");
591 edje_object_signal_emit(cw->frame_object ?: cw->shobj, "e,state,shadow,off", "e");
592 if (cw->frame_object)
593 edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e");
594 evas_object_smart_callback_call(cw->smart_obj, "shadow_change", cw->ec);
597 /* convert from the surface coordinates to the buffer coordinates */
599 _e_comp_object_map_transform_pos(E_Client *ec, int sx, int sy, int *dx, int *dy)
601 E_Comp_Wl_Buffer_Viewport *vp;
602 E_Comp_Wl_Client_Data *cdata;
606 cdata = e_client_cdata_get(ec);
608 if (!ec || !cdata || e_object_is_del(E_OBJECT(ec)))
615 vp = &cdata->scaler.buffer_viewport;
616 transform = e_comp_wl_output_buffer_transform_get(ec);
618 e_pixmap_size_get(ec->pixmap, &bw, &bh);
620 /* for subsurface, it should be swap 90 and 270 */
621 if (e_comp_wl_subsurface_check(ec))
624 case WL_OUTPUT_TRANSFORM_90: transform = WL_OUTPUT_TRANSFORM_270; break;
625 case WL_OUTPUT_TRANSFORM_270: transform = WL_OUTPUT_TRANSFORM_90; break;
626 case WL_OUTPUT_TRANSFORM_FLIPPED_90: transform = WL_OUTPUT_TRANSFORM_FLIPPED_270; break;
627 case WL_OUTPUT_TRANSFORM_FLIPPED_270: transform = WL_OUTPUT_TRANSFORM_FLIPPED_90; break;
633 case WL_OUTPUT_TRANSFORM_NORMAL:
634 default: tx = sx, ty = sy; break;
635 case WL_OUTPUT_TRANSFORM_90: tx = sy, ty = bw - sx; break;
636 case WL_OUTPUT_TRANSFORM_180: tx = bw - sx, ty = bh - sy; break;
637 case WL_OUTPUT_TRANSFORM_270: tx = bh - sy, ty = sx; break;
638 case WL_OUTPUT_TRANSFORM_FLIPPED: tx = bw - sx, ty = sy; break;
639 case WL_OUTPUT_TRANSFORM_FLIPPED_90: tx = sy, ty = sx; break;
640 case WL_OUTPUT_TRANSFORM_FLIPPED_180: tx = sx, ty = bh - sy; break;
641 case WL_OUTPUT_TRANSFORM_FLIPPED_270: tx = bh - sy, ty = bw - sx; break;
644 tx *= vp->buffer.scale;
645 ty *= vp->buffer.scale;
652 _e_comp_object_map_transform_rect(E_Client *ec, int sx, int sy, int sw, int sh, int *dx, int *dy, int *dw, int *dh)
660 _e_comp_object_map_transform_pos(ec, x1, y1, &x1, &y1);
661 _e_comp_object_map_transform_pos(ec, x2, y2, &x2, &y2);
668 if (dw) *dw = MAX(x1, x2) - mx;
669 if (dh) *dh = MAX(y1, y2) - my;
673 _e_comp_object_map_damage_transform_rect(E_Client *ec, E_Map *m, int sx, int sy, int sw, int sh,
674 int *dx, int *dy, int *dw, int *dh)
676 E_Util_Transform_Rect rect = {sx, sy, sw, sh};
677 E_Util_Transform_Rect_Vertex sv, dv;
681 e_pixmap_size_get(ec->pixmap, &bw, &bh);
683 sv = e_util_transform_rect_to_vertices(&rect);
685 for (i = 0; i < 4; i++)
687 double x = 0.0, y = 0.0;
689 e_map_coords_get(m, sv.vertices[i].vertex[0], sv.vertices[i].vertex[1], &x, &y, 0);
691 /* if evas decide coordinate is outside of map, it returns (0, 0)
692 in this case, full damage is added.
694 if ((i != 0) && (x == 0.0) && (y == 0.0))
697 dv.vertices[i].vertex[0] = x;
698 dv.vertices[i].vertex[1] = y;
699 dv.vertices[i].vertex[2] = 1.0;
700 dv.vertices[i].vertex[3] = 1.0;
703 rect = e_util_transform_vertices_to_rect(&dv);
705 if (dx) *dx = rect.x;
706 if (dy) *dy = rect.y;
707 if (dw) *dw = rect.w;
708 if (dh) *dh = rect.h;
722 _e_comp_object_map_damage_transform_get(E_Client *ec)
729 if (!e_client_transform_core_enable_get(ec))
732 m = e_client_map_get(ec);
736 e_pixmap_size_get(ec->pixmap, &bw, &bh);
737 if ((bw == 0) || (bh == 0))
750 e_map_point_coord_set(m2, 0, 0, 0, 0);
751 e_map_point_coord_set(m2, 1, bw, 0, 0);
752 e_map_point_coord_set(m2, 2, bw, bh, 0);
753 e_map_point_coord_set(m2, 3, 0, bh, 0);
755 for (i = 0; i < 4; i++)
759 e_map_point_coord_get(m, i, &map_x, &map_y, NULL);
760 e_map_point_image_uv_set(m2, i, map_x, map_y);
767 /////////////////////////////////////
769 /* handle evas mouse-in events on client object */
771 _e_comp_object_cb_mouse_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
773 Evas_Event_Mouse_In *ev = event_info;
774 E_Comp_Object *cw = data;
776 e_client_mouse_in(cw->ec, ev->output.x, ev->output.y);
779 /* handle evas mouse-out events on client object */
781 _e_comp_object_cb_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
783 Evas_Event_Mouse_Out *ev = event_info;
784 E_Comp_Object *cw = data;
786 e_client_mouse_out(cw->ec, ev->output.x, ev->output.y);
789 /* handle evas mouse wheel events on client object */
791 _e_comp_object_cb_mouse_wheel(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
793 Evas_Event_Mouse_Wheel *ev = event_info;
794 E_Comp_Object *cw = data;
795 E_Binding_Event_Wheel ev2;
798 if (e_client_action_get()) return;
799 e_bindings_evas_event_mouse_wheel_convert(ev, &ev2);
800 e_client_mouse_wheel(cw->ec, &ev->output, &ev2);
803 /* handle evas mouse down events on client object */
805 _e_comp_object_cb_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
807 Evas_Event_Mouse_Down *ev = event_info;
808 E_Comp_Object *cw = data;
809 E_Binding_Event_Mouse_Button ev2;
812 if (e_client_action_get()) return;
813 e_bindings_evas_event_mouse_down_button_convert(ev, &ev2);
814 e_client_mouse_down(cw->ec, ev->button, &ev->output, &ev2);
817 /* handle evas mouse up events on client object */
819 _e_comp_object_cb_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
821 Evas_Event_Mouse_Up *ev = event_info;
822 E_Comp_Object *cw = data;
823 E_Binding_Event_Mouse_Button ev2;
826 if (e_client_action_get() && (e_client_action_get() != cw->ec)) return;
827 e_bindings_evas_event_mouse_up_button_convert(ev, &ev2);
828 e_client_mouse_up(cw->ec, ev->button, &ev->output, &ev2);
831 /* handle evas mouse movement events on client object */
833 _e_comp_object_cb_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
835 Evas_Event_Mouse_Move *ev = event_info;
836 E_Comp_Object *cw = data;
839 if (e_client_action_get() && (e_client_action_get() != cw->ec)) return;
840 e_client_mouse_move(cw->ec, &ev->cur.output);
842 /////////////////////////////////////
844 /* helper function for checking compositor themes based on user-defined matches */
846 _e_comp_object_shadow_client_match(const E_Client *ec, E_Comp_Match *m)
848 if (((m->title) && (!ec->netwm.name)) ||
849 ((ec->netwm.name) && (m->title) && (!e_util_glob_match(ec->netwm.name, m->title))))
851 #if defined(__cplusplus) || defined(c_plusplus)
852 if (((m->clas) && (!ec->icccm.cpp_class)) ||
853 ((ec->icccm.cpp_class) && (m->clas) && (!e_util_glob_match(ec->icccm.cpp_class, m->clas))))
856 if (((m->clas) && (!ec->icccm.class)) ||
857 ((ec->icccm.class) && (m->clas) && (!e_util_glob_match(ec->icccm.class, m->clas))))
861 if (((m->role) && (!ec->icccm.window_role)) ||
862 ((ec->icccm.window_role) && (m->role) && (!e_util_glob_match(ec->icccm.window_role, m->role))))
868 if ((int)ec->netwm.type != m->primary_type)
871 else if (m->primary_type != E_WINDOW_TYPE_REAL_UNKNOWN)
874 if (m->borderless != 0)
878 if (e_client_util_borderless(ec))
880 if (!(((m->borderless == -1) && (!borderless)) ||
881 ((m->borderless == 1) && (borderless))))
888 if (((ec->icccm.transient_for != 0) ||
891 if (!(((m->dialog == -1) && (!dialog)) ||
892 ((m->dialog == 1) && (dialog))))
895 if (m->accepts_focus != 0)
897 int accepts_focus = 0;
899 if (ec->icccm.accepts_focus)
901 if (!(((m->accepts_focus == -1) && (!accepts_focus)) ||
902 ((m->accepts_focus == 1) && (accepts_focus))))
911 if (!(((m->vkbd == -1) && (!vkbd)) ||
912 ((m->vkbd == 1) && (vkbd))))
917 if (!(((m->argb == -1) && (!ec->argb)) ||
918 ((m->argb == 1) && (ec->argb))))
921 if (m->fullscreen != 0)
923 int fullscreen = ec->fullscreen;
925 if (!(((m->fullscreen == -1) && (!fullscreen)) ||
926 ((m->fullscreen == 1) && (fullscreen))))
931 if (!(m->modal == -1))
937 /* function for setting up a client's compositor frame theme (cw->shobj) */
939 _e_comp_object_shadow_setup(E_Comp_Object *cw)
943 Eina_List *list = NULL, *l;
944 E_Input_Rect_Data *input_rect_data;
945 E_Input_Rect_Smart_Data *input_rect_sd;
947 Eina_Stringshare *reshadow_group = NULL;
948 Eina_Bool focus = EINA_FALSE, skip = EINA_FALSE, fast = EINA_FALSE, reshadow = EINA_FALSE, no_shadow = EINA_FALSE, pass_event_flag = EINA_FALSE;
949 Eina_Stringshare *name, *title;
950 E_Comp_Config *conf = e_comp_config_get();
952 edje_object_file_get(cw->shobj, NULL, &reshadow_group);
953 /* match correct client type */
954 list = cw->ec->override ? conf->match.overrides : conf->match.borders;
955 name = cw->ec->icccm.name;
956 title = cw->ec->icccm.title;
957 skip = (cw->ec->override ? conf->match.disable_overrides : conf->match.disable_borders) || (title && (!strncmp(title, "noshadow", 8)));
958 fast = cw->ec->override ? conf->fast_overrides : conf->fast_borders;
960 /* skipping here is mostly a hack for systray because I hate it */
963 EINA_LIST_FOREACH(list, l, m)
965 if (((m->name) && (!name)) ||
966 ((name) && (m->name) && (!e_util_glob_match(name, m->name))))
968 if (!_e_comp_object_shadow_client_match(cw->ec, m)) continue;
971 no_shadow = m->no_shadow;
974 /* fast effects are just themes with "/fast" appended and shorter effect times */
977 snprintf(buf, sizeof(buf), "e/comp/frame/%s/fast", m->shadow_style);
978 reshadow = ok = !e_util_strcmp(reshadow_group, buf);
980 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", buf);
982 /* default to non-fast style if fast not available */
985 snprintf(buf, sizeof(buf), "e/comp/frame/%s", m->shadow_style);
986 reshadow = ok = !e_util_strcmp(reshadow_group, buf);
988 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", buf);
990 if (ok && m->visibility_effect)
991 eina_stringshare_refplace(&cw->visibility_effect, m->visibility_effect);
998 if (skip || (cw->ec->e.state.video))
1000 reshadow = ok = !e_util_strcmp(reshadow_group, "e/comp/frame/none");
1002 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", "e/comp/frame/none");
1005 if (conf->shadow_style)
1009 snprintf(buf, sizeof(buf), "e/comp/frame/%s/fast", conf->shadow_style);
1010 reshadow = ok = !e_util_strcmp(reshadow_group, buf);
1012 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", buf);
1016 snprintf(buf, sizeof(buf), "e/comp/frame/%s", conf->shadow_style);
1017 reshadow = ok = !e_util_strcmp(reshadow_group, buf);
1019 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", buf);
1026 reshadow = ok = !e_util_strcmp(reshadow_group, "e/comp/frame/default/fast");
1028 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", "e/comp/frame/default/fast");
1032 reshadow = ok = !e_util_strcmp(reshadow_group, "e/comp/frame/default");
1034 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", "e/comp/frame/default");
1039 /* reshadow means this entire function call has been a no-op since we're re-setting the current style */
1044 if (cw->ec->override)
1046 if ((!cw->ec->shaped) && (!no_shadow) && (!cw->ec->argb))
1047 edje_object_signal_emit(cw->shobj, "e,state,shadow,on", "e");
1049 edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e");
1050 evas_object_smart_callback_call(cw->smart_obj, "shadow_change", cw->ec);
1056 edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e");
1057 evas_object_smart_callback_call(cw->smart_obj, "shadow_change", cw->ec);
1060 _e_comp_object_shadow(cw);
1063 if (focus || cw->ec->focused || cw->ec->override)
1064 e_comp_object_signal_emit(cw->smart_obj, "e,state,focused", "e");
1066 e_comp_object_signal_emit(cw->smart_obj, "e,state,unfocused", "e");
1067 /* visibility must always be enabled for re_manage clients to prevent
1068 * pop-in animations every time the user sees a persistent client again;
1069 * applying visibility for iconic clients prevents the client from getting
1072 if (cw->visible || cw->ec->re_manage)
1073 e_comp_object_signal_emit(cw->smart_obj, "e,state,visible", "e");
1075 e_comp_object_signal_emit(cw->smart_obj, "e,state,hidden", "e");
1077 /* breaks animation counter */
1078 if (cw->frame_object)
1080 edje_object_part_swallow(cw->frame_object, "e.swallow.client", cw->obj);
1081 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object);
1082 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object);
1083 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object);
1089 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->obj);
1093 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
1096 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
1098 if (input_rect_data->obj)
1100 pass_event_flag = EINA_TRUE;
1106 if (cw->indicator.obj)
1108 Evas_Object *indicator;
1109 indicator = edje_object_part_swallow_get(cw->shobj, "e.swallow.indicator");
1110 if (indicator != cw->indicator.obj)
1112 edje_object_part_unswallow(cw->shobj, indicator);
1113 edje_object_part_swallow(cw->shobj, "e.swallow.indicator", cw->indicator.obj);
1114 e_comp_object_indicator_size_set(cw->smart_obj, cw->indicator.w, cw->indicator.h);
1118 evas_object_pass_events_set(cw->default_input_obj, pass_event_flag);
1119 evas_object_pass_events_set(cw->obj, pass_event_flag);
1124 /////////////////////////////////////////////
1127 _e_comp_object_animating_begin(E_Comp_Object *cw)
1130 if (cw->animating == 1)
1132 e_comp->animating++;
1134 e_object_ref(E_OBJECT(cw->ec));
1139 _e_comp_object_animating_end(E_Comp_Object *cw)
1148 if (cw->ec->launching)
1150 if (!cw->ec->extra_animating)
1152 ELOGF("COMP", "Un-Set launching flag..", cw->ec);
1153 cw->ec->launching = EINA_FALSE;
1154 if (cw->ec->first_mapped)
1156 ELOGF("LAUNCH", "SHOW real win", cw->ec);
1157 e_comp_object_signal_emit(cw->ec->frame, "e,action,launch_real,done", "e");
1160 e_comp_object_signal_emit(cw->ec->frame, "e,action,launch,done", "e");
1164 e_comp->animating--;
1165 cw->showing = cw->hiding = 0;
1167 if (e_comp->animating == 0)
1168 e_comp_visibility_calculation_set(EINA_TRUE);
1169 /* remove ref from animation start, account for possibility of deletion from unref */
1170 return !!e_object_unref(E_OBJECT(cw->ec));
1176 /* handle the end of a compositor animation */
1178 _e_comp_object_done_defer(void *data, Evas_Object *obj EINA_UNUSED, const char *emission, const char *source EINA_UNUSED)
1180 E_Comp_Object *cw = data;
1182 /* visible clients which have never been sized are a bug */
1183 if ((!cw->ec->new_client) && (!cw->ec->changes.size) && ((cw->w < 0) || (cw->h < 0)) && (!strcmp(emission, "e,action,show,done")))
1184 CRI("ACK! ec:%p", cw->ec);
1185 if (!_e_comp_object_animating_end(cw)) return;
1186 if (cw->animating) return;
1187 /* hide only after animation finishes to guarantee a full run of the animation */
1188 if (!cw->defer_hide) return;
1189 if ((!strcmp(emission, "e,action,hide,done")) ||
1190 (!strcmp(emission, "e,action,done")) ||
1191 ((cw->ec->iconic) && (!strcmp(emission, "e,action,show,done"))))
1193 ELOGF("COMP", "defer hide emission:%s", cw->ec, emission);
1194 evas_object_hide(cw->smart_obj);
1198 /* run a visibility compositor effect if available, return false if object is dead */
1200 _e_comp_object_effect_visibility_start(E_Comp_Object *cw, Eina_Bool state)
1206 if ((!cw->visibility_effect) || (!e_comp_object_effect_allowed_get(cw->smart_obj))) return EINA_TRUE;;
1207 if (!cw->effect_running)
1208 _e_comp_object_animating_begin(cw);
1209 if (!e_comp_object_effect_stop(cw->smart_obj, _e_comp_object_done_defer))
1210 return _e_comp_object_animating_end(cw);
1211 if (!e_comp_object_effect_set(cw->smart_obj, cw->visibility_effect))
1212 return _e_comp_object_animating_end(cw);
1214 evas_pointer_canvas_xy_get(e_comp->evas, &x, &y);
1217 zone = e_comp_zone_find_by_ec(cw->ec);
1219 zw = zone->w, zh = zone->h;
1224 zone = e_comp_object_util_zone_get(cw->smart_obj);
1225 if (!zone) zone = e_zone_current_get();
1232 e_comp_object_effect_params_set(cw->smart_obj, 1, (int[]){cw->x, cw->y,
1233 cw->w, cw->h, zw, zh, x, y}, 8);
1234 e_comp_object_effect_params_set(cw->smart_obj, 0, (int[]){state}, 1);
1235 e_comp_object_effect_start(cw->smart_obj, _e_comp_object_done_defer, cw);
1238 /////////////////////////////////////////////
1240 /* create necessary objects for clients that e manages */
1242 _e_comp_object_mouse_event_callback_set(E_Comp_Object *cw)
1244 if (cw->set_mouse_callbacks) return;
1245 if (!cw->smart_obj) return;
1247 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_IN, _e_comp_object_cb_mouse_in, cw);
1248 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_OUT, _e_comp_object_cb_mouse_out, cw);
1249 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_comp_object_cb_mouse_down, cw);
1250 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_cb_mouse_up, cw);
1251 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_comp_object_cb_mouse_move, cw);
1252 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_WHEEL, _e_comp_object_cb_mouse_wheel, cw);
1254 cw->set_mouse_callbacks = EINA_TRUE;
1258 _e_comp_object_mouse_event_callback_unset(E_Comp_Object *cw)
1260 if (!cw->set_mouse_callbacks) return;
1261 if (!cw->smart_obj) return;
1263 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_IN, _e_comp_object_cb_mouse_in);
1264 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_OUT, _e_comp_object_cb_mouse_out);
1265 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_comp_object_cb_mouse_down);
1266 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_cb_mouse_up);
1267 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_comp_object_cb_mouse_move);
1268 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_WHEEL, _e_comp_object_cb_mouse_wheel);
1270 cw->set_mouse_callbacks = EINA_FALSE;
1274 _e_comp_object_color_visible_set(E_Comp_Object *cw, Eina_Bool set)
1276 if (cw->color_visible == set) return EINA_TRUE;
1278 cw->color_visible = set;
1280 ELOGF("COMP", "color_visible set:%d", cw->ec, set);
1282 wl_signal_emit(&cw->events.color_visible_set, NULL);
1288 _e_comp_object_color_visible_update(E_Comp_Object *cw)
1292 e_comp_object_color_get(cw->smart_obj, NULL, NULL, NULL, &a);
1295 _e_comp_object_color_visible_set(cw, EINA_FALSE);
1301 evas_object_color_get(cw->effect_obj, NULL, NULL, NULL, &a);
1304 _e_comp_object_color_visible_set(cw, EINA_FALSE);
1312 evas_object_color_get(cw->shobj, NULL, NULL, NULL, &a);
1315 _e_comp_object_color_visible_set(cw, EINA_FALSE);
1322 evas_object_color_get(cw->obj, NULL, NULL, NULL, &a);
1325 _e_comp_object_color_visible_set(cw, EINA_FALSE);
1330 _e_comp_object_color_visible_set(cw, EINA_TRUE);
1334 _e_comp_intercept_effect_obj_color_set(void *data, Evas_Object *obj, int r, int g, int b, int a)
1336 E_Comp_Object *cw = data;
1338 evas_object_color_set(obj, r, g, b, a);
1340 _e_comp_object_color_visible_update(cw);
1344 _e_comp_intercept_shobj_color_set(void *data, Evas_Object *obj, int r, int g, int b, int a)
1346 E_Comp_Object *cw = data;
1348 evas_object_color_set(obj, r, g, b, a);
1350 _e_comp_object_color_visible_update(cw);
1354 _e_comp_intercept_obj_color_set(void *data, Evas_Object *obj, int r, int g, int b, int a)
1356 E_Comp_Object *cw = data;
1358 evas_object_color_set(obj, r, g, b, a);
1360 _e_comp_object_color_visible_update(cw);
1364 _e_comp_object_setup(E_Comp_Object *cw)
1366 cw->clip = evas_object_rectangle_add(e_comp->evas);
1367 evas_object_move(cw->clip, -9999, -9999);
1368 evas_object_resize(cw->clip, 999999, 999999);
1369 evas_object_smart_member_add(cw->clip, cw->smart_obj);
1370 cw->effect_obj = edje_object_add(e_comp->evas);
1371 evas_object_move(cw->effect_obj, cw->x, cw->y);
1372 evas_object_clip_set(cw->effect_obj, cw->clip);
1373 evas_object_smart_member_add(cw->effect_obj, cw->smart_obj);
1374 evas_object_intercept_color_set_callback_add(cw->effect_obj, _e_comp_intercept_effect_obj_color_set, cw);
1375 e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", "e/comp/effects/none");
1376 cw->shobj = edje_object_add(e_comp->evas);
1377 evas_object_data_set(cw->shobj, "comp_smart_obj", cw->smart_obj);
1378 edje_object_part_swallow(cw->effect_obj, "e.swallow.content", cw->shobj);
1379 edje_object_signal_callback_add(cw->shobj, "e,action,*,done", "e", _e_comp_object_done_defer, cw);
1380 evas_object_intercept_color_set_callback_add(cw->shobj, _e_comp_intercept_shobj_color_set, cw);
1382 /* name objects appropriately for nicer printing when using e_comp_util_wins_print() */
1383 if (cw->ec->override)
1385 evas_object_name_set(cw->shobj, "cw->shobj::WINDOW");
1386 evas_object_name_set(cw->effect_obj, "cw->effect_obj::WINDOW");
1387 evas_object_name_set(cw->clip, "cw->clip::WINDOW");
1389 else if (!cw->ec->input_only)
1391 evas_object_name_set(cw->shobj, "cw->shobj::CLIENT");
1392 evas_object_name_set(cw->effect_obj, "cw->effect_obj::CLIENT");
1393 evas_object_name_set(cw->clip, "cw->clip::CLIENT");
1395 cw->real_hid = !cw->ec->input_only;
1396 if (!cw->ec->input_only)
1398 e_util_size_debug_set(cw->effect_obj, 1);
1399 _e_comp_object_mouse_event_callback_set(cw);
1402 cw->default_input_obj = evas_object_rectangle_add(e_comp->evas);
1403 evas_object_name_set(cw->default_input_obj, "cw->default_input_obj");
1404 evas_object_move(cw->default_input_obj, cw->x, cw->y);
1405 evas_object_resize(cw->default_input_obj, cw->w, cw->h);
1406 evas_object_color_set(cw->default_input_obj, 0, 0, 0, 0);
1407 evas_object_smart_member_add(cw->default_input_obj, cw->smart_obj);
1409 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_OBJECT_SETUP, cw->ec);
1412 /////////////////////////////////////////////
1414 /* for fast path evas rendering; only called during render */
1416 _e_comp_object_pixels_get(void *data, Evas_Object *obj EINA_UNUSED)
1418 E_Comp_Object *cw = data;
1419 E_Client *ec = cw->ec;
1421 int bx, by, bxx, byy;
1423 if (e_object_is_del(E_OBJECT(ec))) return;
1424 if (cw->external_content) return;
1425 if (!e_pixmap_size_get(ec->pixmap, &pw, &ph)) return;
1426 e_pixmap_image_opaque_get(cw->ec->pixmap, &bx, &by, &bxx, &byy);
1429 bxx = pw - (bx + bxx), byy = ph - (by + byy);
1430 evas_object_image_border_set(cw->obj, bx, bxx, by, byy);
1432 else if (cw->client_inset.calc && (!cw->frame_object)) //CSD
1434 bx = -cw->client_inset.l + 4, by = -cw->client_inset.t + 4;
1435 bxx = -cw->client_inset.r, byy = -cw->client_inset.b;
1439 bx = by = bxx = byy = 0;
1440 evas_object_image_border_set(cw->obj, bx, bxx, by, byy);
1443 Edje_Message_Int_Set *msg;
1444 Edje_Message_Int msg2;
1445 Eina_Bool id = (bx || by || bxx || byy);
1447 msg = alloca(sizeof(Edje_Message_Int_Set) + (sizeof(int) * 3));
1453 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT_SET, 1, msg);
1455 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT, 0, &msg2);
1459 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
1460 e_comp_client_post_update_add(cw->ec);
1462 else if (e_comp_object_render(ec->frame))
1464 /* apply shape mask if necessary */
1465 if ((!cw->native) && (ec->shaped))
1466 e_comp_object_shape_apply(ec->frame);
1468 /* shaped clients get precise mouse events to handle transparent pixels */
1469 evas_object_precise_is_inside_set(cw->obj, ec->shaped);
1471 /* queue another render if client is still dirty; cannot refresh here. */
1472 if (e_pixmap_dirty_get(ec->pixmap) && e_pixmap_size_get(ec->pixmap, &pw, &ph))
1473 e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
1475 if (cw->render_trace)
1477 _e_comp_object_event_simple(ec->frame, E_EVENT_COMP_OBJECT_IMG_RENDER);
1483 _e_comp_object_pixels_noti(void *data, Evas_Object *obj EINA_UNUSED)
1485 E_Comp_Object *cw = data;
1486 E_Client *ec = cw->ec;
1488 if (e_object_is_del(E_OBJECT(ec))) return;
1489 if (cw->external_content) return;
1490 if (!e_comp->hwc) return;
1492 e_comp_client_render_list_add(cw->ec);
1494 if (!ec->hwc_window) return;
1496 e_hwc_windows_rendered_window_add(ec->hwc_window);
1499 /////////////////////////////////////////////
1502 _e_comp_intercept_move(void *data, Evas_Object *obj, int x, int y)
1504 E_Comp_Object *cw = data;
1507 if (cw->render_update_lock.lock)
1509 cw->render_update_lock.pending_move_x = x;
1510 cw->render_update_lock.pending_move_y = y;
1511 cw->render_update_lock.pending_move_set = EINA_TRUE;
1515 if ((e_pixmap_type_get(cw->ec->pixmap) != E_PIXMAP_TYPE_EXT_OBJECT) &&
1516 (e_pixmap_usable_get(cw->ec->pixmap)) &&
1517 (cw->external_content))
1519 /* delay to move until the external content is unset */
1520 cw->ec->changes.pos = 1;
1525 if (cw->ec->move_after_resize)
1527 if ((x != cw->ec->x) || (y != cw->ec->y))
1529 if (!cw->ec->is_cursor)
1530 ELOGF("COMP", "Set Pos to (%d,%d). current ec_pos(%d,%d)", cw->ec, x, y, cw->ec->x, cw->ec->y);
1531 e_client_pos_set(cw->ec, x, y);
1532 cw->ec->changes.pos = 1;
1538 if ((cw->ec->resize_mode == E_POINTER_RESIZE_NONE) &&
1539 (cw->ec->manage_resize.resize_obj))
1541 e_client_pos_set(cw->ec, x, y);
1542 cw->ec->client.x = x + cw->client_inset.l;
1543 cw->ec->client.y = y + cw->client_inset.t;
1544 e_policy_visibility_client_defer_move(cw->ec);
1548 /* if frame_object does not exist, client_inset indicates CSD.
1549 * this means that ec->client matches cw->x/y, the opposite
1552 fx = (!cw->frame_object) * cw->client_inset.l;
1553 fy = (!cw->frame_object) * cw->client_inset.t;
1554 if ((cw->x == x + fx) && (cw->y == y + fy))
1556 if ((cw->ec->x != x) || (cw->ec->y != y))
1558 /* handle case where client tries to move to position and back very quickly */
1559 e_client_pos_set(cw->ec, x, y);
1560 cw->ec->client.x = x + cw->client_inset.l;
1561 cw->ec->client.y = y + cw->client_inset.t;
1565 if (!cw->ec->maximize_override)
1567 /* prevent moving in some directions while directionally maximized */
1568 if ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL)
1570 if ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_HORIZONTAL)
1573 ix = x + cw->client_inset.l;
1574 iy = y + cw->client_inset.t;
1575 if (cw->ec->maximized && (!cw->ec->maximize_override) && ((cw->ec->x != x) || (cw->ec->y != y)) &&
1576 ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) != E_MAXIMIZE_VERTICAL) &&
1577 ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) != E_MAXIMIZE_HORIZONTAL))
1579 /* prevent moving at all if move isn't allowed in current maximize state */
1580 if ((!e_config->allow_manip) && ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH)) return;
1581 /* queue unmaximize if we are allowing move and update unmaximize geometry */
1584 zone = e_comp_zone_find_by_ec(cw->ec);
1587 cw->ec->changes.need_unmaximize = 1;
1588 cw->ec->saved.x = ix - zone->x;
1589 cw->ec->saved.y = iy - zone->y;
1590 cw->ec->saved.w = cw->ec->client.w;
1591 cw->ec->saved.h = cw->ec->client.h;
1595 /* only update during resize if triggered by resize */
1596 if (e_client_util_resizing_get(cw->ec) && (!cw->force_move)) return;
1597 /* delay to move while surface waits paired commit serial*/
1598 if (e_client_pending_geometry_has(cw->ec))
1600 /* do nothing while waiting paired commit serial*/
1604 e_client_pos_set(cw->ec, x, y);
1605 if (cw->ec->new_client)
1607 /* don't actually do anything until first client idler loop */
1608 cw->ec->placed = ((!cw->ec->dialog) && (!cw->ec->parent));
1609 cw->ec->changes.pos = 1;
1614 /* only update xy position of client to avoid invalid
1615 * first damage region if it is not a new_client. */
1616 cw->ec->client.x = ix;
1617 cw->ec->client.y = iy;
1620 if (!cw->frame_object)
1622 evas_object_move(obj, x, y);
1627 _e_comp_intercept_resize(void *data, Evas_Object *obj, int w, int h)
1629 E_Comp_Object *cw = data;
1630 int pw = 0, ph = 0, fw, fh, iw, ih, prev_w, prev_h, x, y;
1633 if (cw->render_update_lock.lock)
1635 cw->render_update_lock.pending_resize_w = w;
1636 cw->render_update_lock.pending_resize_h = h;
1637 cw->render_update_lock.pending_resize_set = EINA_TRUE;
1641 if (!e_util_strcmp("input_panel_surface", cw->ec->icccm.window_role))
1643 e_client_size_set(cw->ec, w, h);
1644 evas_object_resize(obj, w, h);
1648 /* if frame_object does not exist, client_inset indicates CSD.
1649 * this means that ec->client matches cw->w/h, the opposite
1652 fw = (!cw->frame_object) * (-cw->client_inset.l - cw->client_inset.r);
1653 fh = (!cw->frame_object) * (-cw->client_inset.t - cw->client_inset.b);
1654 if ((cw->w == w + fw) && (cw->h == h + fh))
1656 if (((cw->ec->w != w) || (cw->ec->h != h)) ||
1657 (cw->ec->client.w != w - cw->client_inset.l - cw->client_inset.r) ||
1658 (cw->ec->client.h != h - cw->client_inset.t - cw->client_inset.b))
1660 /* handle case where client tries to resize itself and back very quickly */
1661 e_client_size_set(cw->ec, w, h);
1662 cw->ec->client.w = w - cw->client_inset.l - cw->client_inset.r;
1663 cw->ec->client.h = h - cw->client_inset.t - cw->client_inset.b;
1664 wl_signal_emit(&cw->events.resize, NULL);
1668 /* guarantee that fullscreen is fullscreen */
1669 zone = e_comp_zone_find_by_ec(cw->ec);
1671 if (cw->ec->fullscreen && ((w != zone->w) || (h != zone->h)))
1673 if (!e_client_transform_core_enable_get(cw->ec))
1676 /* calculate client size */
1677 iw = w - cw->client_inset.l - cw->client_inset.r;
1678 ih = h - cw->client_inset.t - cw->client_inset.b;
1679 if (cw->ec->maximized && (!cw->ec->maximize_override) && ((cw->ec->w != w) || (cw->ec->h != h)))
1681 /* prevent resizing while maximized depending on direction and config */
1682 if ((!e_config->allow_manip) && ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH)) return;
1684 Eina_Bool reject = EINA_FALSE;
1685 if (cw->ec->maximized & E_MAXIMIZE_VERTICAL)
1687 if (cw->ec->client.h != ih)
1689 cw->ec->saved.h = ih;
1690 cw->ec->saved.y = cw->ec->client.y - zone->y;
1691 reject = cw->ec->changes.need_unmaximize = 1;
1694 if (cw->ec->maximized & E_MAXIMIZE_HORIZONTAL)
1696 if (cw->ec->client.w != iw)
1698 cw->ec->saved.w = iw;
1699 cw->ec->saved.x = cw->ec->client.x - zone->x;
1700 reject = cw->ec->changes.need_unmaximize = 1;
1709 if (cw->ec->new_client || (!cw->ec->visible) || (!cw->effect_obj))
1711 /* do nothing until client idler loops */
1712 if ((cw->ec->w != w) || (cw->ec->h != h))
1714 e_client_size_set(cw->ec, w, h);
1715 cw->ec->changes.size = 1;
1720 if (e_client_pending_geometry_has(cw->ec))
1722 /* do nothing while waiting paired commit serial*/
1726 e_client_size_set(cw->ec, w, h);
1728 cw->ec->client.w = iw;
1729 cw->ec->client.h = ih;
1730 if ((cw->ec->client.w < 0) || (cw->ec->client.h < 0)) CRI("WTF. ec:%p", cw->ec);
1732 /* The size of non-compositing window can be changed, so there is a
1733 * need to check that cw is H/W composited if cw is not redirected.
1734 * And of course we have to change size of evas object of H/W composited cw,
1735 * otherwise cw can't receive input events even if it is shown on the screen.
1737 Eina_Bool redirected = cw->redirected;
1739 redirected = e_comp_is_on_overlay(cw->ec);
1741 if ((!cw->ec->input_only) && (redirected) &&
1742 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE) &&
1743 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE) &&
1744 (e_pixmap_dirty_get(cw->ec->pixmap) ||
1745 (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph))))
1748 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE ||
1749 cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE)
1751 prev_w = cw->w, prev_h = cw->h;
1752 e_comp_object_frame_wh_adjust(obj, 0, 0, &fw, &fh);
1753 /* check shading and clamp to pixmap size for regular clients */
1754 if ((!cw->ec->input_only) && (!cw->ec->override) &&
1755 (((w - fw != pw) || (h - fh != ph))))
1757 //INF("CALLBACK: REQ(%dx%d) != CUR(%dx%d)", w - fw, h - fh, pw, ph);
1758 wl_signal_emit(&cw->events.resize, NULL);
1760 if (cw->frame_object || cw->ec->input_only)
1761 e_comp_object_frame_wh_adjust(obj, pw, ph, &w, &h);
1764 if ((cw->w == w) && (cw->h == h))
1766 /* going to be a noop resize which won't trigger smart resize */
1767 RENDER_DEBUG("DAMAGE RESIZE(%p): %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
1768 if (cw->updates) eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
1770 evas_object_resize(obj, w, h);
1775 if ((!cw->frame_object) && (!cw->ec->input_only))
1778 wl_signal_emit(&cw->events.resize, NULL);
1779 /* "just do it" for overrides */
1780 evas_object_resize(obj, w, h);
1782 if (!cw->ec->override)
1784 /* shape probably changed for non-overrides */
1789 /* this fixes positioning jiggles when using a resize mode
1790 * which also changes the client's position
1793 if (cw->frame_object)
1794 x = cw->x, y = cw->y;
1796 x = cw->ec->x, y = cw->ec->y;
1797 switch (cw->ec->resize_mode)
1799 case E_POINTER_RESIZE_BL:
1800 case E_POINTER_RESIZE_L:
1801 evas_object_move(obj, x + prev_w - cw->w, y);
1803 case E_POINTER_RESIZE_TL:
1804 evas_object_move(obj, x + prev_w - cw->w, y + prev_h - cw->h);
1806 case E_POINTER_RESIZE_T:
1807 case E_POINTER_RESIZE_TR:
1808 evas_object_move(obj, x, y + prev_h - cw->h);
1817 _e_comp_intercept_layer_set(void *data, Evas_Object *obj, int layer)
1819 #ifdef REFACTOR_DESK_AREA
1820 E_Comp_Object *cw = data;
1821 E_Comp_Object_Data_Set_Layer layer_set_data;
1823 layer_set_data.cw = cw;
1824 layer_set_data.layer = layer;
1826 wl_signal_emit(&cw->events.set_layer, &layer_set_data);
1830 e_comp_render_queue();
1831 e_comp_object_transform_obj_stack_update(obj);
1835 E_Comp_Object *cw = data;
1836 E_Comp_Wl_Client_Data *child_cdata;
1837 unsigned int l = e_comp_canvas_layer_map(layer);
1840 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
1842 /* doing a compositor effect, follow directions */
1843 _e_comp_object_layer_set(obj, layer);
1844 if (layer == cw->ec->layer) //trying to put layer back
1848 /* if ec->layer and layer are the same but the client is not belong to the given(l)
1849 that means, layer is changed during layer_pending. in this case, need to update layer inlist*/
1850 if (cw->layer != l) goto layer_set;
1854 e_comp_render_queue();
1856 ec = e_client_above_get(cw->ec);
1857 /* skip subsurface: stacking subsurface is handled by e_comp_wl */
1858 while ((ec) && (e_comp_wl_subsurface_check(ec)))
1859 ec = e_client_above_get(ec);
1860 if (ec && (evas_object_layer_get(ec->frame) != evas_object_layer_get(obj)))
1862 ec = e_client_below_get(cw->ec);
1863 /* skip subsurface: stacking subsurface is handled by e_comp_wl */
1864 while ((ec) && (e_comp_wl_subsurface_check(ec)))
1865 ec = e_client_below_get(ec);
1866 if (ec && (evas_object_layer_get(ec->frame) == evas_object_layer_get(cw->smart_obj)))
1868 evas_object_stack_above(obj, ec->frame);
1873 if (ec && (cw->ec->parent == ec))
1875 if (e_client_transient_policy_get(cw->ec) == E_TRANSIENT_ABOVE)
1876 evas_object_stack_above(obj, ec->frame);
1878 evas_object_stack_below(obj, ec->frame);
1881 evas_object_stack_below(obj, ec ? ec->frame : e_comp->layers[cw->layer].obj);
1887 if (cw->layer == l) return;
1888 if (e_comp_canvas_client_layer_map(layer) == 9999)
1889 return; //invalid layer for clients not doing comp effects
1890 if (cw->ec->fullscreen)
1892 cw->ec->saved.layer = layer;
1895 oldraise = e_config->transient.raise;
1897 /* clamp to valid client layer */
1898 layer = e_comp_canvas_client_layer_map_nearest(layer);
1899 cw->ec->layer = layer;
1900 e_client_input_thread_layer_set(cw->ec, layer);
1901 if (e_config->transient.layer)
1904 Eina_List *list = eina_list_clone(cw->ec->transients);
1906 /* We need to set raise to one, else the child wont
1907 * follow to the new layer. It should be like this,
1908 * even if the user usually doesn't want to raise
1911 e_config->transient.raise = 1;
1912 EINA_LIST_FREE(list, child)
1914 child_cdata = e_client_cdata_get(child);
1915 if (child_cdata && !child_cdata->mapped)
1917 ELOGF("COMP", "LAYER_SET CHILD. BUT not mapped. skip. child(ec:%p, win:0x%08zx)", cw->ec, child, e_client_util_win_get(child));
1920 e_client_layer_set(child, layer);
1924 e_config->transient.raise = oldraise;
1926 _e_comp_object_layers_remove(cw);
1927 cw->layer = e_comp_canvas_layer_map(layer);
1928 _e_comp_object_layers_add(cw, NULL, NULL, 0);
1929 //if (cw->ec->new_client)
1930 //INF("CLIENT STACKED %p: %u", cw->ec, layer);
1931 _e_comp_object_layer_set(obj, layer);
1932 if (!e_comp->layers[cw->layer].obj) return; //this is a layer marker
1933 evas_object_stack_below(obj, e_comp->layers[cw->layer].obj);
1934 if (evas_object_below_get(obj) == e_comp->layers[cw->layer].obj)
1936 /* can't stack a client above its own layer marker */
1937 CRI("STACKING ERROR!!! ec:%p (cw->layer:%d, ec->layer:%d)", cw->ec, cw->layer, cw->ec->layer);
1939 if (!cw->visible) return;
1940 e_comp_render_queue();
1941 _e_comp_object_transform_obj_stack_update(obj);
1945 #ifdef REFACTOR_DESK_AREA
1947 typedef void (*E_Comp_Object_Stack_Func)(Evas_Object *obj, Evas_Object *stack);
1950 #ifdef REFACTOR_DESK_AREA
1952 e_comp_object_raise(Evas_Object *obj)
1955 _e_comp_object_raise(Evas_Object *obj)
1958 evas_object_raise(obj);
1960 if (evas_object_smart_smart_get(obj))
1962 E_Client *ec = e_comp_object_client_get(obj);
1964 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
1968 #ifdef REFACTOR_DESK_AREA
1970 e_comp_object_lower(E_Comp_Object *cw, Evas_Object *obj)
1973 _e_comp_object_lower(E_Comp_Object *cw, Evas_Object *obj)
1976 evas_object_lower(obj);
1978 if (evas_object_smart_smart_get(obj))
1980 E_Client *ec = e_comp_object_client_get(obj);
1983 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
1984 #ifdef REFACTOR_DESK_AREA
1985 wl_signal_emit(&cw->events.lower_done, NULL);
1987 wl_signal_emit(&cw->events.lower, NULL);
1993 #ifdef REFACTOR_DESK_AREA
1995 e_comp_object_stack_above(Evas_Object *obj, Evas_Object *target)
1998 _e_comp_object_stack_above(Evas_Object *obj, Evas_Object *target)
2001 evas_object_stack_above(obj, target);
2003 if (evas_object_smart_smart_get(obj))
2005 E_Client *ec = e_comp_object_client_get(obj);
2007 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2011 #ifdef REFACTOR_DESK_AREA
2013 e_comp_object_stack_below(Evas_Object *obj, Evas_Object *target)
2016 _e_comp_object_stack_below(Evas_Object *obj, Evas_Object *target)
2019 evas_object_stack_below(obj, target);
2021 if (evas_object_smart_smart_get(obj))
2023 E_Client *ec = e_comp_object_client_get(obj);
2025 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2029 #ifdef REFACTOR_DESK_AREA
2031 e_comp_object_layer_set(Evas_Object *obj, short layer)
2034 _e_comp_object_layer_set(Evas_Object *obj, short layer)
2037 evas_object_layer_set(obj, layer);
2039 if (evas_object_smart_smart_get(obj))
2041 E_Client *ec = e_comp_object_client_get(obj);
2043 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_LAYER_SET, ec);
2047 #ifdef REFACTOR_DESK_AREA
2050 _e_comp_object_is_pending(E_Client *ec)
2054 if (!ec) return EINA_FALSE;
2056 topmost = e_comp_wl_topmost_parent_get(ec);
2058 return (topmost) ? topmost->layer_pending : EINA_FALSE;
2062 _e_comp_intercept_stack_helper(E_Comp_Object *cw, Evas_Object *stack, E_Comp_Object_Stack_Func stack_cb)
2064 E_Comp_Object *cw2 = NULL;
2067 Evas_Object *o = stack;
2068 #ifdef REFACTOR_DESK_AREA
2069 Eina_Bool raising = stack_cb == e_comp_object_stack_above;
2071 Eina_Bool raising = stack_cb == _e_comp_object_stack_above;
2074 /* We should consider topmost's layer_pending for subsurface */
2075 if ((cw->ec->layer_block) || _e_comp_object_is_pending(cw->ec))
2077 if (_e_comp_object_is_pending(cw->ec))
2078 e_comp_object_layer_update(cw->smart_obj,
2079 raising? stack : NULL,
2080 raising? NULL : stack);
2082 /* obey compositor effects! */
2083 if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
2084 evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
2085 stack_cb(cw->smart_obj, stack);
2086 if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
2087 evas_object_data_del(cw->smart_obj, "client_restack");
2091 cw2 = evas_object_data_get(o, "comp_obj");
2093 /* assume someone knew what they were doing during client init */
2094 if (cw->ec->new_client)
2095 layer = cw->ec->layer;
2096 else if ((cw2) && _e_comp_object_is_pending(cw2->ec))
2097 layer = cw2->ec->layer;
2099 layer = evas_object_layer_get(stack);
2100 ecstack = e_client_below_get(cw->ec);
2101 if (layer != e_comp_canvas_layer_map_to(cw->layer))
2103 evas_object_layer_set(cw->smart_obj, layer);
2104 /* we got our layer wrangled, return now! */
2105 if (layer != e_comp_canvas_layer_map_to(cw->layer)) return;
2108 /* check if we're stacking below another client */
2111 /* check for non-client layer object */
2112 if (!e_util_strcmp(evas_object_name_get(o), "layer_obj"))
2114 /* find an existing client to use for layering
2115 * by walking up the object stack
2117 * this is guaranteed to be pretty quick since we'll either:
2118 * - run out of client layers
2119 * - find a stacking client
2121 o = evas_object_above_get(o);
2122 if ((!o) || (o == cw->smart_obj)) break;
2123 if (evas_object_layer_get(o) != layer)
2125 /* reached the top client layer somehow
2126 * use top client object
2128 o = e_comp->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR)].obj;
2131 /* top client layer window hasn't been stacked yet. this probably shouldn't happen?
2132 * return here since the top client layer window
2137 ec = e_client_top_get();
2142 if (o) cw2 = evas_object_data_get(o, "comp_obj");
2145 if (cw2 && cw->layer != cw2->layer)
2148 /* remove existing layers */
2149 _e_comp_object_layers_remove(cw);
2152 if (o == stack) //if stacking above, cw2 is above; else cw2 is below
2153 _e_comp_object_layers_add(cw, raising ? cw2 : NULL, raising ? NULL : cw2, 0);
2154 else if (o == cw->smart_obj) //prepend (lower) if not stacking above
2155 _e_comp_object_layers_add(cw, NULL, NULL, !raising);
2156 else //if no stacking objects found, either raise or lower
2157 _e_comp_object_layers_add(cw, raising ? NULL : cw2, raising ? cw2 : NULL, 0);
2160 _e_comp_object_layers_add(cw, NULL, NULL, 0);
2162 /* find new object for stacking if cw2 is on state of layer_pending */
2163 if ((cw2) && _e_comp_object_is_pending(cw2->ec))
2165 E_Client *new_stack = NULL, *current_ec = NULL;
2166 current_ec = cw2->ec;
2169 while ((new_stack = e_client_below_get(current_ec)))
2171 current_ec = new_stack;
2172 if (new_stack == cw->ec) continue;
2173 if (new_stack->layer != cw2->ec->layer) break;
2174 if (!_e_comp_object_is_pending(new_stack)) break;
2176 if ((new_stack) && (new_stack->layer == cw2->ec->layer))
2177 stack = new_stack->frame;
2180 /* stack it above layer object */
2182 below_layer = (cw2->layer <= 0)? 0 : cw2->layer - 1 ;
2183 stack = e_comp->layers[below_layer].obj;
2188 while ((new_stack = e_client_above_get(current_ec)))
2190 current_ec = new_stack;
2191 if (new_stack == cw->ec) continue;
2192 if (new_stack->layer != cw2->ec->layer) break;
2193 if (!_e_comp_object_is_pending(new_stack)) break;
2195 if ((new_stack) && (new_stack->layer == cw2->ec->layer))
2196 stack = new_stack->frame;
2198 stack = e_comp->layers[cw2->layer].obj;
2202 /* set restack if stacking has changed */
2203 if (cw->ec->new_client || (!ecstack) || (ecstack->frame != o))
2204 evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
2205 stack_cb(cw->smart_obj, stack);
2206 if (e_comp->layers[cw->layer].obj)
2207 if (evas_object_below_get(cw->smart_obj) == e_comp->layers[cw->layer].obj)
2209 CRI("STACKING ERROR!!! ec:%p (cw->layer:%d, ec->layer:%d)", cw->ec, cw->layer, cw->ec->layer);
2211 if (cw->ec->new_client || (!ecstack) || (ecstack->frame != o))
2212 evas_object_data_del(cw->smart_obj, "client_restack");
2213 if (!cw->visible) return;
2214 e_comp_render_queue();
2219 _e_comp_intercept_stack_above(void *data, Evas_Object *obj, Evas_Object *above)
2221 EINA_SAFETY_ON_TRUE_RETURN(obj == above);
2223 TRACE_DS_BEGIN(COMP:INTERCEPT STACK ABOVE);
2225 #ifdef REFACTOR_DESK_AREA
2226 E_Comp_Object *cw = data;
2227 E_Comp_Object_Data_Stack_Above stack_above_data;
2229 stack_above_data.cw = cw;
2230 stack_above_data.above_obj = above;
2232 wl_signal_emit(&cw->events.stack_above, &stack_above_data);
2234 if (evas_object_below_get(obj) == above)
2236 e_comp_object_layer_update(obj, above, NULL);
2240 _e_comp_intercept_stack_helper(data, above, _e_comp_object_stack_above);
2242 _e_comp_object_transform_obj_stack_update(obj);
2243 _e_comp_object_transform_obj_stack_update(above);
2250 _e_comp_intercept_stack_below(void *data, Evas_Object *obj, Evas_Object *below)
2252 EINA_SAFETY_ON_TRUE_RETURN(obj == below);
2254 TRACE_DS_BEGIN(COMP:INTERCEPT STACK BELOW);
2256 #ifdef REFACTOR_DESK_AREA
2257 E_Comp_Object *cw = data;
2258 E_Comp_Object_Data_Stack_Below stack_below_data;
2260 stack_below_data.cw = cw;
2261 stack_below_data.below_obj = below;
2263 wl_signal_emit(&cw->events.stack_below, &stack_below_data);
2266 e_comp_render_queue();
2268 if (evas_object_above_get(obj) == below)
2270 e_comp_object_layer_update(obj, NULL, below);
2274 _e_comp_intercept_stack_helper(data, below, _e_comp_object_stack_below);
2276 if (evas_object_smart_smart_get(obj))
2277 _e_comp_object_transform_obj_stack_update(obj);
2278 if (evas_object_smart_smart_get(below))
2279 _e_comp_object_transform_obj_stack_update(below);
2286 _e_comp_intercept_lower(void *data, Evas_Object *obj)
2288 E_Comp_Object *cw = data;
2290 #ifdef REFACTOR_DESK_AREA
2295 TRACE_DS_BEGIN(COMP:INTERCEPT LOWER);
2297 #ifdef REFACTOR_DESK_AREA
2298 wl_signal_emit(&cw->events.lower, cw);
2300 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
2302 if (cw->ec->layer_pending)
2303 e_comp_object_layer_update(obj, NULL, obj);
2305 #ifdef REFACTOR_DESK_AREA
2306 e_comp_object_lower(cw, obj);
2308 _e_comp_object_lower(cw, obj);
2312 if (!EINA_INLIST_GET(cw->ec)->prev) goto end; //already lowest on layer
2313 o = evas_object_below_get(obj);
2314 _e_comp_object_layers_remove(cw);
2315 /* prepend to client list since this client should be the first item now */
2316 _e_comp_object_layers_add(cw, NULL, NULL, 1);
2317 if (evas_object_layer_get(o) != evas_object_layer_get(obj)) goto end; //already at bottom!
2318 evas_object_data_set(obj, "client_restack", (void*)1);
2319 #ifdef REFACTOR_DESK_AREA
2320 e_comp_object_lower(cw, obj);
2322 _e_comp_object_lower(cw, obj);
2324 evas_object_data_del(obj, "client_restack");
2325 if (!cw->visible) goto end;
2326 e_comp_render_queue();
2327 #ifdef REFACTOR_DESK_AREA
2328 e_comp_object_transform_obj_stack_update(obj);
2330 _e_comp_object_transform_obj_stack_update(obj);
2339 _e_comp_intercept_raise(void *data, Evas_Object *obj)
2341 E_Comp_Object *cw = data;
2342 #ifdef REFACTOR_DESK_AREA
2348 TRACE_DS_BEGIN(COMP:INTERCEPT RAISE);
2350 #ifdef REFACTOR_DESK_AREA
2351 wl_signal_emit(&cw->events.raise, cw);
2353 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
2355 if (cw->ec->layer_pending)
2357 int obj_layer = evas_object_layer_get(obj);
2358 if (cw->ec->layer != obj_layer)
2359 e_comp_object_layer_update(obj, NULL, NULL);
2361 #ifdef REFACTOR_DESK_AREA
2362 e_comp_object_raise(obj);
2364 _e_comp_object_raise(obj);
2368 if (!EINA_INLIST_GET(cw->ec)->next) goto end;//already highest on layer
2369 o = evas_object_above_get(obj);
2370 if (evas_object_layer_get(o) != evas_object_layer_get(obj)) goto end; //already at top!
2372 /* still stack below override below the layer marker */
2373 for (op = o = e_comp->layers[cw->layer].obj;
2374 o && o != e_comp->layers[cw->layer - 1].obj;
2375 op = o, o = evas_object_below_get(o))
2377 if (evas_object_smart_smart_get(o))
2381 ec = e_comp_object_client_get(o);
2382 if (ec && (!ec->override)) break;
2385 #ifdef REFACTOR_DESK_AREA
2386 e_comp_object_stack_below(obj, op);
2388 _e_comp_object_stack_below(obj, op);
2390 e_client_focus_defer_set(cw->ec);
2392 if (!cw->visible) goto end;
2393 e_comp_render_queue();
2394 #ifdef REFACTOR_DESK_AREA
2395 e_comp_object_transform_obj_stack_update(obj);
2397 _e_comp_object_transform_obj_stack_update(obj);
2406 _e_comp_intercept_hide(void *data, Evas_Object *obj)
2408 E_Comp_Object *cw = data;
2410 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
2411 if( !_e_comp_object_intercept_hook_call(E_COMP_OBJECT_INTERCEPT_HOOK_HIDE, cw->ec))
2413 ELOGF("COMP", "Hide. intercepted", cw->ec);
2418 if (cw->ec->launching == EINA_TRUE)
2420 ELOGF("COMP", "Hide. Cancel launching flag", cw->ec);
2421 cw->ec->launching = EINA_FALSE;
2422 e_comp_object_signal_emit(cw->ec->frame, "e,action,launch,cancel", "e");
2427 /* hidden flag = just do it */
2428 ELOGF("COMP", "Hide hidden evas_object:%p", cw->ec, obj);
2429 evas_object_hide(obj);
2431 wl_signal_emit(&cw->events.hide, NULL);
2436 if (cw->ec->input_only)
2438 /* input_only = who cares */
2439 ELOGF("COMP", "Hide input_only evas_object:%p", cw->ec, obj);
2440 evas_object_hide(obj);
2442 wl_signal_emit(&cw->events.hide, NULL);
2446 /* already hidden or currently animating */
2447 if ((!cw->visible) || (cw->animating && cw->hiding && (!cw->ec->iconic)))
2449 ELOGF("COMP", "Hide. but already hidden or currently animating", cw->ec);
2453 /* don't try hiding during shutdown */
2454 cw->defer_hide |= stopping;
2455 if (!cw->defer_hide)
2457 if ((!cw->ec->iconic) && (!cw->ec->override))
2458 /* unset delete requested so the client doesn't break */
2459 cw->ec->delete_requested = 0;
2460 if ((!cw->animating) || (!cw->hiding) || cw->ec->iconic)
2462 ELOGF("COMP", "Hide. but after iconify or hide animation, cw->animating:%d, cw->hiding:%d, iconic:%d",
2463 cw->ec, cw->animating, cw->hiding, cw->ec->iconic);
2466 e_comp_object_signal_emit(obj, "e,action,iconify", "e");
2469 e_comp_object_signal_emit(obj, "e,state,hidden", "e");
2471 _e_comp_object_animating_begin(cw);
2472 if (!_e_comp_object_effect_visibility_start(cw, 0)) return;
2474 evas_object_smart_callback_call(obj, "hiding", cw->ec);
2475 cw->defer_hide = !!cw->animating;
2477 e_comp_object_effect_set(obj, NULL);
2480 if (cw->animating) return;
2481 /* if we have no animations running, go ahead and hide */
2483 ELOGF("COMP", "Hide normal object:%p", cw->ec, obj);
2484 evas_object_hide(obj);
2486 wl_signal_emit(&cw->events.hide, NULL);
2490 _e_comp_intercept_show_helper(E_Comp_Object *cw)
2492 E_Client *ec = cw->ec;
2495 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
2497 if (ec->show_pending.count > 0)
2499 ELOGF("COMP", "show_helper. Show PENDING!!! show_pending:%d", ec, ec->show_pending.count);
2500 ec->show_pending.running = EINA_TRUE;
2504 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
2505 if (!_e_comp_object_intercept_hook_call(E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER, ec))
2507 ELOGF("COMP", "show_helper. intercepted", cw->ec);
2512 ELOGF("COMP", "show_helper. cw(v:%d,a:%d,dh:%d,ct:%d,u:%p,s(%d,%d)), ec(i:%d(%d,%d),o:%d,g:%d,n:%d)", ec,
2513 cw->visible, cw->animating, cw->defer_hide, cw->content_type, cw->updates, cw->w, cw->h,
2514 ec->iconic, ec->exp_iconify.by_client, ec->exp_iconify.type, ec->input_only, ec->ignored, ec->new_client);
2518 if (ec->iconic && cw->animating)
2520 /* triggered during iconify animation */
2521 e_comp_object_signal_emit(cw->smart_obj, "e,action,uniconify", "e");
2524 ELOGF("COMP", "show_helper. return. already cw->visible", ec);
2527 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE ||
2528 cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE)
2530 evas_object_move(cw->smart_obj, ec->x, ec->y);
2531 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2532 e_comp_object_frame_theme_set(cw->smart_obj, E_COMP_OBJECT_FRAME_RESHADOW);
2534 if (e_comp->image_filter != E_COMP_IMAGE_FILTER_NONE)
2535 e_comp_object_image_filter_set(cw->smart_obj, e_comp->image_filter);
2538 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2539 evas_object_show(cw->smart_obj);
2542 e_client_focus_defer_set(ec);
2546 if ((!cw->updates) && (!ec->input_only) && (!ec->ignored))
2550 pw = ec->client.w, ph = ec->client.h;
2552 if (!e_pixmap_size_get(ec->pixmap, &pw, &ph))
2554 ec->changes.visible = !ec->hidden;
2557 ELOGF("COMP", "show_helper. return. no pixmap size", ec);
2561 cw->updates = eina_tiler_new(pw, ph);
2564 ec->changes.visible = !ec->hidden;
2567 ELOGF("COMP", "show_helper. return. no cw->updates", ec);
2572 eina_tiler_tile_size_set(cw->updates, 1, 1);
2575 /* ignore until client idler first run */
2576 ec->changes.visible = !ec->hidden;
2579 ELOGF("COMP", "show_helper. return. new_client", ec);
2586 evas_object_move(cw->smart_obj, ec->x, ec->y);
2587 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2588 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2589 evas_object_show(cw->smart_obj);
2592 if (ec->netwm.type == E_WINDOW_TYPE_DND && !e_comp_wl->drag_client)
2594 /* start_drag not received */
2595 ec->changes.visible = 1;
2598 ELOGF("COMP", "show_helper. return. start_drag not received yet", ec);
2601 /* re-set geometry */
2602 evas_object_move(cw->smart_obj, ec->x, ec->y);
2603 /* force resize in case it hasn't happened yet, or just to update size */
2604 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2605 if ((cw->w < 1) || (cw->h < 1))
2607 /* if resize didn't go through, try again */
2608 ec->visible = ec->changes.visible = 1;
2610 ELOGF("COMP", "show_helper. return. cw_size(%d,%d)", ec, cw->w, cw->h);
2613 /* if pixmap not available, clear pixmap since we're going to fetch it again */
2614 if (!e_pixmap_size_get(ec->pixmap, &w, &h))
2615 e_pixmap_clear(ec->pixmap);
2617 if (cw->real_hid && w && h)
2620 /* force comp theming in case it didn't happen already */
2621 e_comp_object_frame_theme_set(cw->smart_obj, E_COMP_OBJECT_FRAME_RESHADOW);
2622 if (e_comp->image_filter != E_COMP_IMAGE_FILTER_NONE)
2623 e_comp_object_image_filter_set(cw->smart_obj, e_comp->image_filter);
2626 /* only do the show if show is allowed */
2629 if (ec->internal) //internal clients render when they feel like it
2630 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
2632 if (!e_client_is_iconified_by_client(ec)||
2633 e_policy_visibility_client_is_uniconic(ec))
2635 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2636 evas_object_show(cw->smart_obj);
2638 /* if comp object is shown in idle enterer before(E_CLIENT_HOOK_EVAL_FETCH),
2639 it is rendered in idle callback without native surface and
2640 compositor shows an empty frame if other objects aren't shown
2641 because job callback of e_comp called at the next loop.
2642 it causes a visual defect when windows are switched.
2646 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
2647 e_comp_object_dirty(cw->smart_obj);
2648 e_comp_object_render(cw->smart_obj);
2653 wl_signal_emit(&cw->events.show, NULL);
2657 _e_comp_intercept_show(void *data, Evas_Object *obj EINA_UNUSED)
2659 E_Comp_Object *cw = data;
2660 E_Client *ec = cw->ec;
2662 E_Input_Rect_Data *input_rect_data;
2663 E_Input_Rect_Smart_Data *input_rect_sd;
2666 if (ec->ignored) return;
2670 //INF("SHOW2 %p", ec);
2671 _e_comp_intercept_show_helper(cw);
2674 //INF("SHOW %p", ec);
2677 cw->effect_obj = evas_object_rectangle_add(e_comp->evas);
2678 evas_object_color_set(cw->effect_obj, 0, 0, 0, 0);
2679 evas_object_smart_member_add(cw->effect_obj, cw->smart_obj);
2680 evas_object_name_set(cw->effect_obj, "cw->effect_obj::input_only");
2684 if ((!cw->obj) && (cw->external_content))
2686 ERR("cw->obj for external content is not created! ec:%p", cw->ec);
2690 _e_comp_object_setup(cw);
2693 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE;
2694 cw->obj = evas_object_image_filled_add(e_comp->evas);
2695 evas_object_image_border_center_fill_set(cw->obj, EVAS_BORDER_FILL_SOLID);
2696 e_util_size_debug_set(cw->obj, 1);
2697 evas_object_image_pixels_get_callback_set(cw->obj, _e_comp_object_pixels_get, cw);
2698 evas_object_image_pixels_noti_callback_set(cw->obj, _e_comp_object_pixels_noti, cw);
2699 evas_object_image_smooth_scale_set(cw->obj, e_comp_config_get()->smooth_windows);
2700 evas_object_name_set(cw->obj, "cw->obj");
2701 evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888);
2702 evas_object_intercept_color_set_callback_add(cw->obj, _e_comp_intercept_obj_color_set, cw);
2704 _e_comp_object_alpha_set(cw);
2707 evas_object_color_set(cw->clip, ec->netwm.opacity, ec->netwm.opacity, ec->netwm.opacity, ec->netwm.opacity);
2710 _e_comp_object_map_transform_rect(cw->ec, 0, 0, cw->w, cw->h, NULL, NULL, &tw, &th);
2711 evas_object_geometry_set(cw->effect_obj, cw->x, cw->y, tw, th);
2714 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
2717 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
2719 if (input_rect_data->obj)
2721 evas_object_geometry_set(input_rect_data->obj,
2722 cw->x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
2723 cw->y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
2724 input_rect_data->rect.w, input_rect_data->rect.h);
2731 evas_object_resize(cw->mask.obj, cw->w, cw->h);
2733 _e_comp_intercept_show_helper(cw);
2737 _e_comp_intercept_focus(void *data, Evas_Object *obj, Eina_Bool focus)
2739 E_Comp_Object *cw = data;
2743 /* note: this is here as it seems there are enough apps that do not even
2744 * expect us to emulate a look of focus but not actually set x input
2745 * focus as we do - so simply abort any focus set on such windows */
2746 /* be strict about accepting focus hint */
2747 /* be strict about accepting focus hint */
2748 if ((!ec->icccm.accepts_focus) &&
2749 (!ec->icccm.take_focus))
2753 if (e_client_focused_get() == ec)
2754 e_client_focused_set(NULL);
2756 ELOGF("FOCUS", "FOCUS UNSET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2757 evas_object_focus_set(obj, focus);
2761 if (focus && ec->lock_focus_out) return;
2762 if (e_object_is_del(E_OBJECT(ec)) && focus)
2763 CRI("CAN'T FOCUS DELETED CLIENT! ec:%p", ec);
2765 /* filter focus setting based on current state */
2770 ELOGF("FOCUS", "FOCUS SET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2771 evas_object_focus_set(obj, focus);
2774 if ((ec->iconic) && (!ec->deskshow))
2776 if (!e_policy_visibility_client_is_uniconify_render_running(ec))
2778 /* don't focus an iconified window. that's silly! */
2779 ELOGF("FOCUS", "Do uniconify to set focus", ec);
2780 e_client_uniconify(ec);
2781 e_client_focus_latest_set(ec);
2793 /* check for modal child and set focus to modal child */
2794 E_Client *modal_child = e_client_modal_child_get(ec);
2795 if ((modal_child) && (modal_child != ec) &&
2796 (!e_client_is_iconified_by_client(modal_child)) &&
2797 (modal_child->visible) && (!e_object_is_del(E_OBJECT(modal_child))))
2799 // add ec to latest focus stack
2800 e_client_focus_latest_set(ec);
2802 ELOGF("FOCUS", "FOCUS SET to MODAL (ec:%p, win:0x%08zx, frame:%p)", ec, modal_child, e_client_util_win_get(modal_child), modal_child->frame);
2803 //e_client_focused_set(modal_child);
2804 evas_object_focus_set(modal_child->frame, focus);
2809 /* not yet visible, wait till the next time... */
2810 ec->want_focus = !ec->hidden;
2815 e_client_focused_set(ec);
2819 if (e_client_focused_get() == ec)
2820 e_client_focused_set(NULL);
2824 ELOGF("FOCUS", "FOCUS SET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2826 ELOGF("FOCUS", "FOCUS UNSET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2828 evas_object_focus_set(obj, focus);
2832 _e_comp_intercept_color_set(void *data, Evas_Object *obj, int r, int g, int b, int a)
2834 E_Comp_Object *cw = data;
2836 if (cw->transparent.set)
2838 cw->transparent.user_r = r;
2839 cw->transparent.user_g = g;
2840 cw->transparent.user_b = b;
2841 cw->transparent.user_a = a;
2843 ELOGF("COMP", "Transparent user_color(%d,%d,%d,%d)",
2845 cw->transparent.user_r,
2846 cw->transparent.user_g,
2847 cw->transparent.user_b,
2848 cw->transparent.user_a);
2852 evas_object_color_set(obj, r, g, b, a);
2855 wl_signal_emit(&cw->events.color_set, NULL);
2857 _e_comp_object_color_visible_update(cw);
2860 ////////////////////////////////////////////////////
2863 _e_comp_object_frame_recalc(E_Comp_Object *cw)
2865 int w, h, ox, oy, ow, oh;
2867 Eina_Bool pass_event_flag = EINA_FALSE;
2868 E_Input_Rect_Data *input_rect_data;
2869 E_Input_Rect_Smart_Data *input_rect_sd;
2871 if (cw->frame_object)
2873 if (cw->obj) edje_object_part_unswallow(cw->frame_object, cw->obj);
2874 evas_object_geometry_get(cw->frame_object, NULL, NULL, &w, &h);
2875 /* set a fixed size, force edje calc, check size difference */
2876 evas_object_resize(cw->frame_object, MAX(w, 50), MAX(h, 50));
2877 edje_object_message_signal_process(cw->frame_object);
2878 edje_object_calc_force(cw->frame_object);
2879 edje_object_part_geometry_get(cw->frame_object, "e.swallow.client", &ox, &oy, &ow, &oh);
2880 cw->client_inset.l = ox;
2881 cw->client_inset.r = MAX(w, 50) - (ox + ow);
2882 cw->client_inset.t = oy;
2883 cw->client_inset.b = MAX(h, 50) - (oy + oh);
2884 if (cw->obj) edje_object_part_swallow(cw->frame_object, "e.swallow.client", cw->obj);
2885 evas_object_resize(cw->frame_object, w, h);
2889 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
2892 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
2894 if (input_rect_data->obj)
2896 pass_event_flag = EINA_TRUE;
2902 evas_object_pass_events_set(cw->default_input_obj, pass_event_flag);
2903 evas_object_pass_events_set(cw->obj, pass_event_flag);
2907 cw->client_inset.l = 0;
2908 cw->client_inset.r = 0;
2909 cw->client_inset.t = 0;
2910 cw->client_inset.b = 0;
2912 cw->client_inset.calc = !!cw->frame_object;
2916 _e_comp_smart_cb_frame_recalc(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2918 E_Comp_Object *cw = data;
2922 /* - get current size
2924 * - readjust for new frame size
2927 w = cw->ec->w, h = cw->ec->h;
2928 e_comp_object_frame_wh_unadjust(obj, w, h, &pw, &ph);
2930 _e_comp_object_frame_recalc(cw);
2932 if (!cw->ec->fullscreen)
2933 e_comp_object_frame_wh_adjust(obj, cw->ec->client.w, cw->ec->client.h, &w, &h);
2935 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2936 if (cw->ec->fullscreen)
2938 zone = e_comp_zone_find_by_ec(cw->ec);
2940 evas_object_resize(cw->ec->frame, zone->w, zone->h);
2942 else if (cw->ec->new_client)
2944 if ((cw->ec->w < 1) || (cw->ec->h < 1)) return;
2945 e_comp_object_frame_wh_adjust(obj, pw, ph, &w, &h);
2946 evas_object_resize(cw->ec->frame, w, h);
2948 else if ((w != cw->ec->w) || (h != cw->ec->h))
2949 evas_object_resize(cw->ec->frame, w, h);
2953 _e_comp_smart_cb_maximize(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2955 E_Comp_Object *cw = data;
2957 _e_comp_object_shadow_setup(cw);
2958 if (cw->frame_object)
2960 _e_comp_object_shadow(cw);
2961 e_comp_object_signal_emit(cw->smart_obj, "e,action,maximize", "e");
2962 _e_comp_object_frame_recalc(cw);
2963 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2968 _e_comp_smart_cb_fullscreen(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2970 E_Comp_Object *cw = data;
2972 if (_e_comp_object_shadow_setup(cw))
2973 e_comp_object_damage(cw->smart_obj, 0, 0, cw->ec->w, cw->ec->h);
2974 if (cw->frame_object)
2976 _e_comp_object_shadow(cw);
2977 e_comp_object_signal_emit(cw->smart_obj, "e,action,maximize,fullscreen", "e");
2978 _e_comp_object_frame_recalc(cw);
2979 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2984 _e_comp_smart_cb_unmaximize(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2986 E_Comp_Object *cw = data;
2988 if (cw->frame_object)
2990 _e_comp_object_shadow(cw);
2991 e_comp_object_signal_emit(obj, "e,action,unmaximize", "e");
2992 _e_comp_object_frame_recalc(cw);
2993 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2998 _e_comp_smart_cb_unfullscreen(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
3000 E_Comp_Object *cw = data;
3002 if (_e_comp_object_shadow_setup(cw))
3005 cw->ec->changes.size = 1;
3007 if (cw->frame_object)
3009 _e_comp_object_shadow(cw);
3010 e_comp_object_signal_emit(obj, "e,action,unmaximize,unfullscreen", "e");
3011 _e_comp_object_frame_recalc(cw);
3012 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
3017 _e_comp_smart_focus_in(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3019 e_comp_object_signal_emit(obj, "e,state,focused", "e");
3023 _e_comp_smart_focus_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3025 E_Comp_Object *cw = data;
3027 if (!e_object_is_del(E_OBJECT(cw->ec)))
3028 e_comp_object_signal_emit(obj, "e,state,unfocused", "e");
3032 _e_comp_input_obj_smart_add(Evas_Object *obj)
3034 E_Input_Rect_Smart_Data *input_rect_sd;
3035 input_rect_sd = E_NEW(E_Input_Rect_Smart_Data, 1);
3037 if (!input_rect_sd) return;
3038 evas_object_smart_data_set(obj, input_rect_sd);
3042 _e_comp_input_obj_smart_del(Evas_Object *obj)
3044 E_Input_Rect_Smart_Data *input_rect_sd;
3045 E_Input_Rect_Data *input_rect_data;
3047 input_rect_sd = evas_object_smart_data_get(obj);
3048 if (!input_rect_sd) return;
3050 EINA_LIST_FREE(input_rect_sd->input_rect_data_list, input_rect_data)
3052 if (input_rect_data->obj)
3054 evas_object_smart_member_del(input_rect_data->obj);
3055 E_FREE_FUNC(input_rect_data->obj, evas_object_del);
3057 E_FREE(input_rect_data);
3059 E_FREE(input_rect_sd);
3063 _e_comp_input_obj_smart_move(Evas_Object *obj, int x, int y)
3065 E_Input_Rect_Smart_Data *input_rect_sd;
3066 E_Input_Rect_Data *input_rect_data;
3070 input_rect_sd = evas_object_smart_data_get(obj);
3071 if (!input_rect_sd) return;
3073 cw = input_rect_sd->cw;
3074 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3076 if (input_rect_data->obj)
3078 evas_object_geometry_set(input_rect_data->obj,
3079 x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
3080 y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
3081 input_rect_data->rect.w, input_rect_data->rect.h);
3087 _e_comp_input_obj_smart_resize(Evas_Object *obj, int w, int h)
3089 E_Input_Rect_Smart_Data *input_rect_sd;
3090 E_Input_Rect_Data *input_rect_data;
3094 input_rect_sd = evas_object_smart_data_get(obj);
3095 if (!input_rect_sd) return;
3097 cw = input_rect_sd->cw;
3098 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3100 if (input_rect_data->obj)
3102 evas_object_geometry_set(input_rect_data->obj,
3103 cw->x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
3104 cw->y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
3105 input_rect_data->rect.w, input_rect_data->rect.h);
3111 _e_comp_input_obj_smart_show(Evas_Object *obj)
3113 E_Input_Rect_Smart_Data *input_rect_sd;
3114 E_Input_Rect_Data *input_rect_data;
3117 input_rect_sd = evas_object_smart_data_get(obj);
3118 if (!input_rect_sd) return;
3120 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3122 if (input_rect_data->obj)
3124 evas_object_show(input_rect_data->obj);
3130 _e_comp_input_obj_smart_hide(Evas_Object *obj)
3132 E_Input_Rect_Smart_Data *input_rect_sd;
3133 E_Input_Rect_Data *input_rect_data;
3136 input_rect_sd = evas_object_smart_data_get(obj);
3137 if (!input_rect_sd) return;
3139 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3141 if (input_rect_data->obj)
3143 evas_object_hide(input_rect_data->obj);
3149 _e_comp_input_obj_smart_init(void)
3151 if (_e_comp_input_obj_smart) return;
3153 static const Evas_Smart_Class sc =
3155 INPUT_OBJ_SMART_NAME,
3156 EVAS_SMART_CLASS_VERSION,
3157 _e_comp_input_obj_smart_add,
3158 _e_comp_input_obj_smart_del,
3159 _e_comp_input_obj_smart_move,
3160 _e_comp_input_obj_smart_resize,
3161 _e_comp_input_obj_smart_show,
3162 _e_comp_input_obj_smart_hide,
3175 _e_comp_input_obj_smart = evas_smart_class_new(&sc);
3181 _e_comp_smart_add(Evas_Object *obj)
3185 cw = E_NEW(E_Comp_Object, 1);
3186 EINA_SAFETY_ON_NULL_RETURN(cw);
3188 wl_signal_init(&cw->events.lower);
3189 #ifdef REFACTOR_DESK_AREA
3190 wl_signal_init(&cw->events.lower_done);
3191 wl_signal_init(&cw->events.raise);
3193 wl_signal_init(&cw->events.show);
3194 wl_signal_init(&cw->events.hide);
3195 #ifdef REFACTOR_DESK_AREA
3196 wl_signal_init(&cw->events.set_layer);
3197 wl_signal_init(&cw->events.stack_above);
3198 wl_signal_init(&cw->events.stack_below);
3200 wl_signal_init(&cw->events.image_filter_set);
3201 wl_signal_init(&cw->events.render_op_set);
3202 wl_signal_init(&cw->events.content_type_set);
3203 wl_signal_init(&cw->events.color_set);
3204 wl_signal_init(&cw->events.color_visible_set);
3205 wl_signal_init(&cw->events.resize);
3207 cw->smart_obj = obj;
3208 cw->x = cw->y = cw->w = cw->h = -1;
3209 evas_object_smart_data_set(obj, cw);
3210 cw->opacity = 255.0;
3211 cw->external_content = 0;
3212 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_NONE;
3213 cw->transform_bg_color.r = 0;
3214 cw->transform_bg_color.g = 0;
3215 cw->transform_bg_color.b = 0;
3216 cw->transform_bg_color.a = 255;
3217 cw->color_visible = EINA_TRUE;
3218 evas_object_data_set(obj, "comp_obj", cw);
3219 evas_object_move(obj, -1, -1);
3220 /* intercept ALL the callbacks! */
3221 evas_object_intercept_stack_above_callback_add(obj, _e_comp_intercept_stack_above, cw);
3222 evas_object_intercept_stack_below_callback_add(obj, _e_comp_intercept_stack_below, cw);
3223 evas_object_intercept_raise_callback_add(obj, _e_comp_intercept_raise, cw);
3224 evas_object_intercept_lower_callback_add(obj, _e_comp_intercept_lower, cw);
3225 evas_object_intercept_layer_set_callback_add(obj, _e_comp_intercept_layer_set, cw);
3226 evas_object_intercept_move_callback_add(obj, _e_comp_intercept_move, cw);
3227 evas_object_intercept_resize_callback_add(obj, _e_comp_intercept_resize, cw);
3228 evas_object_intercept_show_callback_add(obj, _e_comp_intercept_show, cw);
3229 evas_object_intercept_hide_callback_add(obj, _e_comp_intercept_hide, cw);
3230 evas_object_intercept_focus_set_callback_add(obj, _e_comp_intercept_focus, cw);
3231 evas_object_intercept_color_set_callback_add(obj, _e_comp_intercept_color_set, cw);
3233 evas_object_smart_callback_add(obj, "maximize", _e_comp_smart_cb_maximize, cw);
3234 evas_object_smart_callback_add(obj, "fullscreen", _e_comp_smart_cb_fullscreen, cw);
3235 evas_object_smart_callback_add(obj, "unmaximize", _e_comp_smart_cb_unmaximize, cw);
3236 evas_object_smart_callback_add(obj, "unfullscreen", _e_comp_smart_cb_unfullscreen, cw);
3238 evas_object_smart_callback_add(obj, "frame_recalc", _e_comp_smart_cb_frame_recalc, cw);
3240 evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_IN, _e_comp_smart_focus_in, cw);
3241 evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_OUT, _e_comp_smart_focus_out, cw);
3245 _e_comp_smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
3248 evas_object_color_set(cw->clip, r, g, b, a);
3253 _e_comp_smart_clip_set(Evas_Object *obj, Evas_Object *clip)
3256 evas_object_clip_set(cw->clip, clip);
3260 _e_comp_smart_clip_unset(Evas_Object *obj)
3263 evas_object_clip_unset(cw->clip);
3267 _e_comp_smart_hide(Evas_Object *obj)
3269 TRACE_DS_BEGIN(COMP:SMART HIDE);
3274 evas_object_hide(cw->clip);
3275 if (cw->input_obj) evas_object_hide(cw->input_obj);
3276 evas_object_hide(cw->effect_obj);
3277 if (cw->default_input_obj) evas_object_hide(cw->default_input_obj);
3278 if (cw->transform_bg_obj) evas_object_hide(cw->transform_bg_obj);
3279 if (cw->transform_tranp_obj) evas_object_hide(cw->transform_tranp_obj);
3286 /* unset native surface if current displaying buffer was destroied */
3287 if (!cw->buffer_destroy_listener.notify)
3289 Evas_Native_Surface *ns;
3290 ns = evas_object_image_native_surface_get(cw->obj);
3291 if ((ns) && (ns->type == EVAS_NATIVE_SURFACE_WL) && (ns->data.wl.legacy_buffer))
3292 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
3295 if (!cw->ec->input_only)
3297 edje_object_freeze(cw->effect_obj);
3298 edje_object_freeze(cw->shobj);
3299 edje_object_play_set(cw->shobj, 0);
3300 if (cw->frame_object)
3301 edje_object_play_set(cw->frame_object, 0);
3304 e_comp_render_queue(); //force nocomp recheck
3310 _e_comp_smart_show(Evas_Object *obj)
3318 if ((cw->w < 0) || (cw->h < 0))
3319 CRI("ACK! ec:%p", cw->ec);
3321 TRACE_DS_BEGIN(COMP:SMART SHOW);
3323 e_comp_object_map_update(obj);
3325 EINA_LIST_FOREACH(cw->ec->e.state.video_child, l, tmp)
3326 evas_object_show(tmp->frame);
3328 evas_object_show(cw->clip);
3329 if (cw->input_obj) evas_object_show(cw->input_obj);
3330 if (!cw->ec->input_only)
3332 edje_object_thaw(cw->effect_obj);
3333 edje_object_thaw(cw->shobj);
3334 edje_object_play_set(cw->shobj, 1);
3335 if (cw->frame_object)
3336 edje_object_play_set(cw->frame_object, 1);
3338 evas_object_show(cw->effect_obj);
3339 if (cw->mask.obj) evas_object_show(cw->mask.obj);
3340 if (cw->transform_bg_obj) evas_object_show(cw->transform_bg_obj);
3341 if (cw->transform_tranp_obj) evas_object_show(cw->transform_tranp_obj);
3342 if (cw->default_input_obj) evas_object_show(cw->default_input_obj);
3343 e_comp_render_queue();
3344 if (cw->ec->input_only)
3349 if (cw->ec->iconic && (!cw->ec->new_client))
3351 if (e_client_is_iconified_by_client(cw->ec))
3353 ELOGF("COMP", "Set launching flag..", cw->ec);
3354 cw->ec->launching = EINA_TRUE;
3357 e_comp_object_signal_emit(cw->smart_obj, "e,action,uniconify", "e");
3359 else if (!cw->showing) /* if set, client was ec->hidden during show animation */
3362 ELOGF("COMP", "Set launching flag..", cw->ec);
3363 cw->ec->launching = EINA_TRUE;
3365 e_comp_object_signal_emit(cw->smart_obj, "e,state,visible", "e");
3366 _e_comp_object_animating_begin(cw);
3367 if (!_e_comp_object_effect_visibility_start(cw, 1))
3373 /* ensure some random effect doesn't lock the client offscreen */
3377 e_comp_object_effect_set(obj, NULL);
3380 _e_comp_object_dim_update(cw);
3386 _e_comp_smart_del(Evas_Object *obj)
3392 if (cw->buffer_destroy_listener.notify)
3394 wl_list_remove(&cw->buffer_destroy_listener.link);
3395 cw->buffer_destroy_listener.notify = NULL;
3398 if (cw->tbm_surface)
3400 tbm_surface_internal_unref(cw->tbm_surface);
3401 cw->tbm_surface = NULL;
3404 if (cw->render_update_lock.buffer_ref.buffer)
3406 ELOGF("COMP", "Clear buffer_ref of render_update_lock:%d",
3407 cw->ec, cw->render_update_lock.lock);
3408 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, NULL);
3411 e_comp_object_render_update_del(cw->smart_obj);
3412 E_FREE_FUNC(cw->updates, eina_tiler_free);
3413 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
3420 EINA_LIST_FREE(cw->obj_mirror, o)
3422 evas_object_image_data_set(o, NULL);
3423 evas_object_freeze_events_set(o, 1);
3424 evas_object_event_callback_del_full(o, EVAS_CALLBACK_DEL, _e_comp_object_cb_mirror_del, cw);
3428 #ifdef REFACTOR_DESK_AREA
3430 _e_comp_object_layers_remove(cw);
3432 l = evas_object_data_get(obj, "comp_object-to_del");
3433 E_FREE_LIST(l, evas_object_del);
3434 _e_comp_object_mouse_event_callback_unset(cw);
3435 evas_object_del(cw->clip);
3436 evas_object_del(cw->obj);
3437 evas_object_del(cw->shobj);
3438 evas_object_del(cw->effect_obj);
3439 evas_object_del(cw->frame_object);
3440 evas_object_del(cw->input_obj);
3441 evas_object_del(cw->mask.obj);
3442 if (cw->dim.mask_obj) evas_object_del(cw->dim.mask_obj);
3443 evas_object_del(cw->transform_bg_obj);
3444 evas_object_del(cw->transform_tranp_obj);
3445 evas_object_del(cw->default_input_obj);
3446 eina_stringshare_del(cw->frame_theme);
3447 eina_stringshare_del(cw->frame_name);
3451 e_comp->animating--;
3453 e_object_unref(E_OBJECT(cw->ec));
3455 cw->ec->frame = NULL;
3460 _e_comp_smart_move(Evas_Object *obj, int x, int y)
3464 cw->x = x, cw->y = y;
3465 evas_object_move(cw->effect_obj, x, y);
3466 evas_object_move(cw->default_input_obj, x, y);
3467 if (cw->input_obj) evas_object_move(cw->input_obj, x, y);
3469 e_comp_object_map_update(obj);
3473 _e_comp_smart_resize(Evas_Object *obj, int w, int h)
3475 Eina_Bool first = EINA_FALSE;
3480 if (!cw->effect_obj) CRI("ACK! ec:%p", cw->ec);
3482 TRACE_DS_BEGIN(COMP:SMART RESIZE);
3484 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
3486 if (cw->w != w || cw->h != h)
3487 e_comp_object_map_update(obj);
3489 first = ((cw->w < 1) || (cw->h < 1));
3490 cw->w = w, cw->h = h;
3494 if (cw->frame_object)
3495 e_comp_object_frame_wh_unadjust(obj, w, h, &ww, &hh);
3498 /* verify pixmap:object size */
3499 if (e_pixmap_size_get(cw->ec->pixmap, &pw, &ph) && (!cw->ec->override))
3501 if ((ww != pw) || (hh != ph))
3502 ELOGF("COMP", "CW RSZ: %dx%d || PX: %dx%d.", cw->ec, ww, hh, pw, ph);
3504 evas_object_resize(cw->effect_obj, tw, th);
3505 evas_object_resize(cw->default_input_obj, w, h);
3507 evas_object_resize(cw->input_obj, w, h);
3509 evas_object_resize(cw->mask.obj, w, h);
3510 /* resize render update tiler */
3513 RENDER_DEBUG("DAMAGE UNFULL: %p", cw->ec);
3514 cw->updates_full = 0;
3515 if (cw->updates) eina_tiler_clear(cw->updates);
3519 RENDER_DEBUG("DAMAGE RESIZE(%p): %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
3520 if (cw->updates) eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
3528 e_comp_render_queue();
3534 _e_comp_smart_init(void)
3536 if (_e_comp_smart) return;
3538 static const Evas_Smart_Class sc =
3541 EVAS_SMART_CLASS_VERSION,
3545 _e_comp_smart_resize,
3548 _e_comp_smart_color_set,
3549 _e_comp_smart_clip_set,
3550 _e_comp_smart_clip_unset,
3560 _e_comp_smart = evas_smart_class_new(&sc);
3565 e_comp_object_init(void)
3567 E_EVENT_COMP_OBJECT_ADD = ecore_event_type_new();
3568 E_EVENT_COMP_OBJECT_IMG_RENDER = ecore_event_type_new();
3569 E_EVENT_COMP_OBJECT_EFFECT_START = ecore_event_type_new();
3570 E_EVENT_COMP_OBJECT_EFFECT_END = ecore_event_type_new();
3574 e_comp_object_shutdown(void)
3580 e_comp_object_mirror_visibility_check(Evas_Object *obj)
3582 API_ENTRY EINA_FALSE;
3583 return !!cw->force_visible;
3585 /////////////////////////////////////////////////////////
3588 _e_comp_object_util_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3591 Eina_Bool comp_object;
3593 comp_object = !!evas_object_data_get(obj, "comp_object");
3598 o = edje_object_part_swallow_get(obj, "e.swallow.content");
3600 e_comp_render_queue();
3602 l = evas_object_data_get(obj, "comp_object-to_del");
3603 E_FREE_LIST(l, evas_object_del);
3607 _e_comp_object_util_restack(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3609 if (e_comp_util_object_is_above_nocomp(obj) &&
3610 (!evas_object_data_get(obj, "comp_override")))
3612 evas_object_data_set(obj, "comp_override", (void*)1);
3613 e_comp_override_add();
3618 _e_comp_object_util_show(void *data EINA_UNUSED, Evas_Object *obj)
3620 Eina_Bool ref = EINA_TRUE;
3621 if (evas_object_visible_get(obj))
3625 d = evas_object_data_del(obj, "comp_hiding");
3627 /* currently trying to hide */
3630 /* already visible */
3634 evas_object_show(obj);
3637 evas_object_ref(obj);
3638 evas_object_data_set(obj, "comp_ref", (void*)1);
3640 edje_object_signal_emit(obj, "e,state,visible", "e");
3641 evas_object_data_set(obj, "comp_showing", (void*)1);
3642 if (e_comp_util_object_is_above_nocomp(obj))
3644 evas_object_data_set(obj, "comp_override", (void*)1);
3645 e_comp_override_add();
3650 _e_comp_object_util_hide(void *data EINA_UNUSED, Evas_Object *obj)
3652 if (!evas_object_visible_get(obj)) return;
3653 /* already hiding */
3654 if (evas_object_data_get(obj, "comp_hiding")) return;
3655 if (!evas_object_data_del(obj, "comp_showing"))
3657 evas_object_ref(obj);
3658 evas_object_data_set(obj, "comp_ref", (void*)1);
3660 edje_object_signal_emit(obj, "e,state,hidden", "e");
3661 evas_object_data_set(obj, "comp_hiding", (void*)1);
3663 if (evas_object_data_del(obj, "comp_override"))
3664 e_comp_override_timed_pop();
3668 _e_comp_object_util_done_defer(void *data, Evas_Object *obj, const char *emission, const char *source EINA_UNUSED)
3670 if (!e_util_strcmp(emission, "e,action,hide,done"))
3672 if (!evas_object_data_del(obj, "comp_hiding")) return;
3673 evas_object_intercept_hide_callback_del(obj, _e_comp_object_util_hide);
3674 evas_object_hide(obj);
3675 evas_object_intercept_hide_callback_add(obj, _e_comp_object_util_hide, data);
3678 evas_object_data_del(obj, "comp_showing");
3679 if (evas_object_data_del(obj, "comp_ref"))
3680 evas_object_unref(obj);
3684 _e_comp_object_util_moveresize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3690 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
3694 E_API E_Comp_Object_Hook *
3695 e_comp_object_hook_add(E_Comp_Object_Hook_Point hookpoint, E_Comp_Object_Hook_Cb func, const void *data)
3697 E_Comp_Object_Hook *ch;
3699 EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_COMP_OBJECT_HOOK_LAST, NULL);
3700 ch = E_NEW(E_Comp_Object_Hook, 1);
3701 if (!ch) return NULL;
3702 ch->hookpoint = hookpoint;
3704 ch->data = (void*)data;
3705 _e_comp_object_hooks[hookpoint] = eina_inlist_append(_e_comp_object_hooks[hookpoint], EINA_INLIST_GET(ch));
3710 e_comp_object_hook_del(E_Comp_Object_Hook *ch)
3713 if (_e_comp_object_hooks_walking == 0)
3715 _e_comp_object_hooks[ch->hookpoint] = eina_inlist_remove(_e_comp_object_hooks[ch->hookpoint], EINA_INLIST_GET(ch));
3719 _e_comp_object_hooks_delete++;
3722 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
3723 E_API E_Comp_Object_Intercept_Hook *
3724 e_comp_object_intercept_hook_add(E_Comp_Object_Intercept_Hook_Point hookpoint, E_Comp_Object_Intercept_Hook_Cb func, const void *data)
3726 E_Comp_Object_Intercept_Hook *ch;
3728 EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_COMP_OBJECT_INTERCEPT_HOOK_LAST, NULL);
3729 ch = E_NEW(E_Comp_Object_Intercept_Hook, 1);
3730 if (!ch) return NULL;
3731 ch->hookpoint = hookpoint;
3733 ch->data = (void*)data;
3734 _e_comp_object_intercept_hooks[hookpoint] = eina_inlist_append(_e_comp_object_intercept_hooks[hookpoint], EINA_INLIST_GET(ch));
3739 e_comp_object_intercept_hook_del(E_Comp_Object_Intercept_Hook *ch)
3742 if (_e_comp_object_intercept_hooks_walking == 0)
3744 _e_comp_object_intercept_hooks[ch->hookpoint] = eina_inlist_remove(_e_comp_object_intercept_hooks[ch->hookpoint], EINA_INLIST_GET(ch));
3748 _e_comp_object_intercept_hooks_delete++;
3753 e_comp_object_util_add(Evas_Object *obj)
3757 E_Comp_Config *conf = e_comp_config_get();
3758 Eina_Bool skip = EINA_FALSE;
3764 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
3766 name = evas_object_name_get(obj);
3767 vis = evas_object_visible_get(obj);
3768 o = edje_object_add(e_comp->evas);
3769 evas_object_data_set(o, "comp_object", (void*)1);
3771 skip = (!strncmp(name, "noshadow", 8));
3773 evas_object_data_set(o, "comp_object_skip", (void*)1);
3775 if (conf->shadow_style)
3777 snprintf(buf, sizeof(buf), "e/comp/frame/%s", conf->shadow_style);
3778 ok = e_theme_edje_object_set(o, "base/theme/comp", buf);
3781 e_theme_edje_object_set(o, "base/theme/comp", "e/comp/frame/default");
3782 if (e_util_strcmp(evas_object_type_get(obj), "edje") || (!edje_object_data_get(obj, "noshadow")))
3783 edje_object_signal_emit(o, "e,state,shadow,on", "e");
3785 edje_object_signal_emit(o, "e,state,shadow,off", "e");
3787 evas_object_geometry_get(obj, &x, &y, &w, &h);
3788 evas_object_geometry_set(o, x, y, w, h);
3789 evas_object_pass_events_set(o, evas_object_pass_events_get(obj));
3791 edje_object_signal_callback_add(o, "e,action,*,done", "e", _e_comp_object_util_done_defer, NULL);
3793 evas_object_intercept_show_callback_add(o, _e_comp_object_util_show, NULL);
3794 evas_object_intercept_hide_callback_add(o, _e_comp_object_util_hide, NULL);
3795 evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _e_comp_object_util_moveresize, NULL);
3796 evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, _e_comp_object_util_del, NULL);
3797 evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE, _e_comp_object_util_moveresize, NULL);
3798 evas_object_event_callback_add(o, EVAS_CALLBACK_RESTACK, _e_comp_object_util_restack, NULL);
3800 e_comp_object_signal_emit(o, "e,state,hidden", "e");
3802 edje_object_part_swallow(o, "e.swallow.content", obj);
3804 _e_comp_object_event_add(o);
3807 evas_object_show(o);
3812 /* utility functions for deleting objects when their "owner" is deleted */
3814 e_comp_object_util_del_list_append(Evas_Object *obj, Evas_Object *to_del)
3819 EINA_SAFETY_ON_NULL_RETURN(to_del);
3820 l = evas_object_data_get(obj, "comp_object-to_del");
3821 evas_object_data_set(obj, "comp_object-to_del", eina_list_append(l, to_del));
3822 evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _e_comp_object_util_del);
3823 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_util_del, NULL);
3827 e_comp_object_util_del_list_remove(Evas_Object *obj, Evas_Object *to_del)
3832 EINA_SAFETY_ON_NULL_RETURN(to_del);
3833 l = evas_object_data_get(obj, "comp_object-to_del");
3835 evas_object_data_set(obj, "comp_object-to_del", eina_list_remove(l, to_del));
3838 /////////////////////////////////////////////////////////
3840 EINTERN Evas_Object *
3841 e_comp_object_client_add(E_Client *ec)
3846 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, NULL);
3847 if (ec->frame) return NULL;
3848 _e_comp_smart_init();
3849 o = evas_object_smart_add(e_comp->evas, _e_comp_smart);
3850 cw = evas_object_smart_data_get(o);
3851 if (!cw) return NULL;
3852 evas_object_data_set(o, "E_Client", ec);
3855 evas_object_data_set(o, "comp_object", (void*)1);
3857 _e_comp_object_event_add(o);
3862 /* utility functions for getting client inset */
3864 e_comp_object_frame_xy_adjust(Evas_Object *obj, int x, int y, int *ax, int *ay)
3867 if (!cw->client_inset.calc)
3873 if (ax) *ax = x - cw->client_inset.l;
3874 if (ay) *ay = y - cw->client_inset.t;
3878 e_comp_object_frame_xy_unadjust(Evas_Object *obj, int x, int y, int *ax, int *ay)
3881 if (!cw->client_inset.calc)
3887 if (ax) *ax = x + cw->client_inset.l;
3888 if (ay) *ay = y + cw->client_inset.t;
3892 e_comp_object_frame_wh_adjust(Evas_Object *obj, int w, int h, int *aw, int *ah)
3895 if (!cw->client_inset.calc)
3901 if (aw) *aw = w + cw->client_inset.l + cw->client_inset.r;
3902 if (ah) *ah = h + cw->client_inset.t + cw->client_inset.b;
3906 e_comp_object_frame_wh_unadjust(Evas_Object *obj, int w, int h, int *aw, int *ah)
3909 if (!cw->client_inset.calc)
3915 if (aw) *aw = w - cw->client_inset.l - cw->client_inset.r;
3916 if (ah) *ah = h - cw->client_inset.t - cw->client_inset.b;
3920 e_comp_object_client_get(Evas_Object *obj)
3925 /* FIXME: remove this when eo is used */
3926 o = evas_object_data_get(obj, "comp_smart_obj");
3928 return e_comp_object_client_get(o);
3929 return cw ? cw->ec : NULL;
3933 e_comp_object_frame_extends_get(Evas_Object *obj, int *x, int *y, int *w, int *h)
3936 if (cw->frame_extends)
3937 edje_object_parts_extends_calc(cw->frame_object, x, y, w, h);
3942 if (w) *w = cw->ec->w;
3943 if (h) *h = cw->ec->h;
3948 e_comp_object_util_zone_get(Evas_Object *obj)
3950 E_Zone *zone = NULL;
3954 zone = e_comp_zone_find_by_ec(cw->ec);
3959 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
3960 zone = e_comp_zone_xy_get(x, y);
3966 e_comp_object_util_center(Evas_Object *obj)
3968 int x, y, w, h, ow, oh;
3973 zone = e_comp_object_util_zone_get(obj);
3974 EINA_SAFETY_ON_NULL_RETURN(zone);
3975 e_zone_useful_geometry_get(zone, &x, &y, &w, &h);
3976 if (cw && (cw->ec->changes.size || cw->ec->new_client))
3977 ow = cw->ec->w, oh = cw->ec->h;
3979 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
3980 x = x + (w - ow) / 2;
3981 y = y + (h - oh) / 2;
3982 evas_object_move(obj, x, y);
3986 e_comp_object_util_center_on(Evas_Object *obj, Evas_Object *on)
3988 int x, y, w, h, ow, oh;
3991 EINA_SAFETY_ON_NULL_RETURN(on);
3992 evas_object_geometry_get(on, &x, &y, &w, &h);
3993 if (cw && (cw->ec->changes.size || cw->ec->new_client))
3994 ow = cw->ec->w, oh = cw->ec->h;
3996 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
3997 evas_object_move(obj, x + (w / 2) - (ow / 2), y + (h / 2) - (oh / 2));
4001 e_comp_object_util_fullscreen(Evas_Object *obj)
4006 e_client_fullscreen(cw->ec, E_FULLSCREEN_RESIZE);
4009 evas_object_move(obj, 0, 0);
4010 evas_object_resize(obj, e_comp->w, e_comp->h);
4015 e_comp_object_util_center_pos_get(Evas_Object *obj, int *x, int *y)
4023 ow = cw->w, oh = cw->h;
4025 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
4026 zone = e_comp_object_util_zone_get(obj);
4027 e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh);
4028 if (x) *x = zx + (zw - ow) / 2;
4029 if (y) *y = zy + (zh - oh) / 2;
4033 e_comp_object_input_objs_del(Evas_Object *obj)
4036 E_Input_Rect_Data *input_rect_data;
4037 E_Input_Rect_Smart_Data *input_rect_sd;
4042 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4043 if (!input_rect_sd) return;
4045 EINA_LIST_FREE(input_rect_sd->input_rect_data_list, input_rect_data)
4047 if (input_rect_data->obj)
4049 evas_object_smart_member_del(input_rect_data->obj);
4050 E_FREE_FUNC(input_rect_data->obj, evas_object_del);
4052 E_FREE(input_rect_data);
4057 e_comp_object_input_area_set(Evas_Object *obj, int x, int y, int w, int h)
4060 E_Input_Rect_Data *input_rect_data = NULL;
4061 E_Input_Rect_Smart_Data *input_rect_sd;
4062 int client_w, client_h;
4064 if (cw->ec->client.w)
4065 client_w = cw->ec->client.w;
4067 client_w = cw->ec->w;
4069 if (cw->ec->client.h)
4070 client_h = cw->ec->client.h;
4072 client_h = cw->ec->h;
4074 E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, client_w, client_h);
4078 _e_comp_input_obj_smart_init();
4079 cw->input_obj = evas_object_smart_add(e_comp->evas, _e_comp_input_obj_smart);
4080 evas_object_smart_member_add(cw->input_obj, cw->smart_obj);
4081 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4084 input_rect_sd->cw = cw;
4087 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4090 input_rect_data = E_NEW(E_Input_Rect_Data, 1);
4091 if (input_rect_data)
4093 EINA_RECTANGLE_SET(&input_rect_data->rect, x, y, w, h);
4094 input_rect_sd->input_rect_data_list = eina_list_append(input_rect_sd->input_rect_data_list, input_rect_data);
4098 if ((input_rect_data) &&
4099 (x || y || (w != cw->ec->client.w) || (h != cw->ec->client.h)))
4101 input_rect_data->obj = evas_object_rectangle_add(e_comp->evas);
4102 evas_object_name_set(input_rect_data->obj, "cw->input_obj");
4103 evas_object_color_set(input_rect_data->obj, 0, 0, 0, 0);
4104 evas_object_clip_set(input_rect_data->obj, cw->clip);
4105 evas_object_smart_member_add(input_rect_data->obj, cw->input_obj);
4106 evas_object_geometry_set(input_rect_data->obj,
4107 cw->ec->client.x + (!!cw->frame_object * cw->client_inset.l) + x,
4108 cw->ec->client.y + (!!cw->frame_object * cw->client_inset.t) + y, w, h);
4109 evas_object_pass_events_set(cw->default_input_obj, 1);
4110 evas_object_pass_events_set(cw->obj, 1);
4113 evas_object_show(input_rect_data->obj);
4114 evas_object_show(cw->input_obj);
4119 evas_object_smart_member_del(cw->input_obj);
4120 E_FREE_FUNC(cw->input_obj, evas_object_del);
4121 evas_object_pass_events_set(cw->default_input_obj, 0);
4122 evas_object_pass_events_set(cw->obj, 0);
4127 e_comp_object_input_rect_get(Evas_Object *obj, Eina_List **list)
4130 E_Input_Rect_Smart_Data *input_rect_sd;
4131 E_Input_Rect_Data *input_rect_data;
4134 if (!cw->input_obj) return;
4136 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4139 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
4141 *list = eina_list_append(*list, &input_rect_data->rect);
4147 e_comp_object_frame_geometry_get(Evas_Object *obj, int *l, int *r, int *t, int *b)
4150 if (l) *l = cw->client_inset.l;
4151 if (r) *r = cw->client_inset.r;
4152 if (t) *t = cw->client_inset.t;
4153 if (b) *b = cw->client_inset.b;
4156 /* set geometry for CSD */
4158 e_comp_object_frame_geometry_set(Evas_Object *obj, int l, int r, int t, int b)
4164 if (cw->frame_object)
4165 CRI("ACK! ec:%p", cw->ec);
4166 if ((cw->client_inset.l == l) && (cw->client_inset.r == r) &&
4167 (cw->client_inset.t == t) && (cw->client_inset.b == b)) return;
4168 calc = cw->client_inset.calc;
4169 cw->client_inset.calc = l || r || t || b;
4170 eina_stringshare_replace(&cw->frame_theme, "borderless");
4171 if (cw->client_inset.calc)
4173 tw = cw->ec->w + ((l + r) - (cw->client_inset.l + cw->client_inset.r));
4174 th = cw->ec->h + ((t + b) - (cw->client_inset.t + cw->client_inset.b));
4175 e_client_size_set(cw->ec, tw, th);
4177 else if (cw->ec->maximized || cw->ec->fullscreen)
4179 cw->ec->saved.w -= ((l + r) - (cw->client_inset.l + cw->client_inset.r));
4180 cw->ec->saved.h -= ((t + b) - (cw->client_inset.t + cw->client_inset.b));
4182 if (!cw->ec->new_client)
4184 if (calc && cw->client_inset.calc)
4186 tx = cw->ec->x - (l - cw->client_inset.l);
4187 ty = cw->ec->y - (t - cw->client_inset.t);
4188 e_client_pos_set(cw->ec, tx, ty);
4190 cw->ec->changes.pos = cw->ec->changes.size = 1;
4193 cw->client_inset.l = l;
4194 cw->client_inset.r = r;
4195 cw->client_inset.t = t;
4196 cw->client_inset.b = b;
4200 e_comp_object_frame_allowed(Evas_Object *obj)
4202 API_ENTRY EINA_FALSE;
4203 return (cw->frame_object || (!cw->client_inset.calc));
4207 e_comp_object_frame_exists(Evas_Object *obj)
4209 API_ENTRY EINA_FALSE;
4210 return !!cw->frame_object;
4214 e_comp_object_frame_theme_set(Evas_Object *obj, const char *name)
4216 Evas_Object *o, *pbg;
4219 Eina_Stringshare *theme;
4221 API_ENTRY EINA_FALSE;
4223 if (!e_util_strcmp(cw->frame_theme, name))
4224 return edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object ?: cw->obj);
4225 if (!e_util_strcmp(name, "COMP_RESHADOW"))
4226 return _e_comp_object_shadow_setup(cw);
4227 pbg = cw->frame_object;
4228 theme = eina_stringshare_add(name);
4230 if (cw->frame_object)
4234 w = cw->ec->w, h = cw->ec->h;
4235 e_comp_object_frame_wh_unadjust(obj, w, h, &cw->ec->w, &cw->ec->h);
4236 if ((cw->ec->w != w) || (cw->ec->h != h))
4238 cw->ec->changes.size = 1;
4241 E_FREE_FUNC(cw->frame_object, evas_object_del);
4242 if (!name) goto reshadow;
4244 o = edje_object_add(e_comp->evas);
4245 snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", name);
4246 ok = e_theme_edje_object_set(o, "base/theme/border", buf);
4247 if ((!ok) && (!e_util_strcmp(name, "borderless")))
4249 cw->frame_object = NULL;
4251 eina_stringshare_del(cw->frame_theme);
4252 cw->frame_theme = theme;
4257 if (theme != e_config->theme_default_border_style)
4259 snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", e_config->theme_default_border_style);
4260 ok = e_theme_edje_object_set(o, "base/theme/border", buf);
4264 ok = e_theme_edje_object_set(o, "base/theme/border",
4265 "e/widgets/border/default/border");
4266 if (ok && (theme == e_config->theme_default_border_style))
4268 /* Reset default border style to default */
4269 eina_stringshare_replace(&e_config->theme_default_border_style, "default");
4270 e_config_save_queue();
4277 cw->frame_object = o;
4278 eina_stringshare_del(cw->frame_theme);
4279 cw->frame_theme = theme;
4280 evas_object_name_set(o, "cw->frame_object");
4283 edje_object_part_text_set(o, "e.text.title", cw->frame_name);
4287 cw->ec->changes.icon = 1;
4293 CRI("USER IS USING A SHITTY THEME! ABORT!!!!");
4298 _e_comp_object_shadow_setup(cw);
4301 int old_x, old_y, new_x = 0, new_y = 0;
4303 old_x = cw->x, old_y = cw->y;
4305 _e_comp_smart_cb_frame_recalc(cw, cw->smart_obj, NULL);
4307 new_x = cw->ec->x, new_y = cw->ec->y;
4308 else if (cw->ec->placed || (!cw->ec->new_client))
4310 /* if no previous frame:
4311 * - reapply client_inset
4316 if (cw->ec->changes.size)
4324 zone = e_comp_zone_find_by_ec(cw->ec);
4327 x = cw->ec->client.x, y = cw->ec->client.y;
4328 x = MAX(zone->x, cw->ec->client.x - cw->client_inset.l);
4329 y = MAX(zone->y, cw->ec->client.y - cw->client_inset.t);
4331 new_x = x, new_y = y;
4334 if (old_x != new_x || old_y != new_y)
4336 /* this guarantees that we won't get blocked by the NOP check in the interceptor */
4337 cw->y = cw->x = -99999;
4338 evas_object_move(obj, new_x, new_y);
4342 if (cw->ec->maximized)
4344 cw->ec->changes.need_maximize = 1;
4347 evas_object_smart_callback_call(cw->smart_obj, "frame_changed", NULL);
4348 if (cw->frame_object)
4350 cw->frame_extends = !!edje_object_data_get(cw->frame_object, "frame_extends");
4353 cw->frame_extends = 0;
4354 evas_object_del(pbg);
4359 e_comp_object_signal_emit(Evas_Object *obj, const char *sig, const char *src)
4361 E_Comp_Object_Mover *prov;
4364 //INF("EMIT %p: %s %s", cw->ec, sig, src);
4365 edje_object_signal_emit(cw->shobj, sig, src);
4366 if (cw->frame_object) edje_object_signal_emit(cw->frame_object, sig, src);
4367 if ((cw->ec->override && e_comp_config_get()->match.disable_overrides) ||
4368 ((!cw->ec->override) && e_comp_config_get()->match.disable_borders))
4370 /* start with highest priority callback first */
4371 EINA_INLIST_REVERSE_FOREACH(_e_comp_object_movers, prov)
4373 if (!e_util_glob_match(sig, prov->sig)) continue;
4374 if (prov->func(prov->data, obj, sig)) break;
4379 e_comp_object_signal_callback_add(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb, const void *data)
4381 /* FIXME: at some point I guess this should use eo to inherit
4382 * -EDJE_OBJ_SUB_ID_SIGNAL_CALLBACK_ADD
4383 * -EDJE_OBJ_SUB_ID_SIGNAL_CALLBACK_DEL
4386 edje_object_signal_callback_add(cw->shobj, sig, src, cb, (void*)data);
4390 e_comp_object_signal_callback_del(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb)
4393 edje_object_signal_callback_del(cw->shobj, sig, src, cb);
4397 e_comp_object_signal_callback_del_full(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb, const void *data)
4400 edje_object_signal_callback_del_full(cw->shobj, sig, src, cb, (void*)data);
4404 e_comp_object_damage(Evas_Object *obj, int x, int y, int w, int h)
4407 Eina_Rectangle rect;
4410 if (cw->ec->input_only || (!cw->updates)) return;
4411 if (cw->nocomp) return;
4412 rect.x = x, rect.y = y;
4413 rect.w = w, rect.h = h;
4414 evas_object_smart_callback_call(obj, "damage", &rect);
4416 if (e_comp_is_on_overlay(cw->ec))
4418 /* It will not set hwc_need_update value if E modules already cleanup pixmap
4419 * resource on the E_COMP_WL_HOOK_BUFFER_CHANGE hook function. It means that
4420 * E module attempts to block screen update due to the particular policy.
4422 if (e_pixmap_resource_get(cw->ec->pixmap))
4423 cw->hwc_need_update = EINA_TRUE;
4426 /* ignore overdraw */
4427 if (cw->updates_full)
4429 RENDER_DEBUG("IGNORED %p: %d,%d %dx%d", cw->ec, x, y, w, h);
4430 e_comp_object_render_update_add(obj);
4432 if ((cw->ec->visible) && (!evas_object_visible_get(cw->smart_obj)) && (!cw->ec->iconic))
4433 evas_object_show(cw->smart_obj);
4437 /* clip rect to client surface */
4438 RENDER_DEBUG("DAMAGE(%d,%d %dx%d) CLIP(%dx%d)", x, y, w, h, cw->ec->client.w, cw->ec->client.h);
4439 E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, cw->ec->client.w, cw->ec->client.h);
4440 /* if rect is the total size of the client after clip, clear the updates
4441 * since this is guaranteed to be the whole region anyway
4443 eina_tiler_area_size_get(cw->updates, &tw, &th);
4444 if ((w > tw) || (h > th))
4446 RENDER_DEBUG("DAMAGE RESIZE %p: %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
4447 eina_tiler_clear(cw->updates);
4448 eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
4450 tw = cw->ec->client.w, th = cw->ec->client.h;
4452 if ((!x) && (!y) && (w == tw) && (h == th))
4454 eina_tiler_clear(cw->updates);
4455 RENDER_DEBUG("DAMAGE FULL: %p", cw->ec);
4456 cw->updates_full = 1;
4457 cw->update_count = 0;
4460 if (cw->update_count > UPDATE_MAX)
4462 /* this is going to get really dumb, so just update the whole thing */
4463 eina_tiler_clear(cw->updates);
4464 cw->update_count = cw->updates_full = 1;
4465 eina_tiler_rect_add(cw->updates, &(Eina_Rectangle){0, 0, tw, th});
4466 RENDER_DEBUG("DAMAGE MAX: %dx%d", tw, th);
4470 eina_tiler_rect_add(cw->updates, &(Eina_Rectangle){x, y, w, h});
4471 RENDER_DEBUG("DAMAGE: %d,%d %dx%d", x, y, w, h);
4473 cw->updates_exist = 1;
4474 e_comp_object_render_update_add(obj);
4476 if ((cw->ec->visible) && (!evas_object_visible_get(cw->smart_obj)) && (!cw->ec->iconic))
4477 evas_object_show(cw->smart_obj);
4481 e_comp_object_damage_exists(Evas_Object *obj)
4483 API_ENTRY EINA_FALSE;
4484 return cw->updates_exist;
4488 e_comp_object_render_update_add(Evas_Object *obj)
4492 if (cw->ec->input_only || (!cw->updates) || (!cw->redirected)) return;
4493 if (cw->render_update_lock.lock) return;
4494 if (!e_pixmap_usable_get(cw->ec->pixmap)) return;
4498 e_comp->updates = eina_list_append(e_comp->updates, cw->ec);
4500 e_comp_render_queue();
4504 e_comp_object_render_update_del(Evas_Object *obj)
4508 if (cw->ec->input_only || (!cw->updates)) return;
4509 if (!cw->update) return;
4511 /* this gets called during comp animating to clear the update flag */
4512 if (e_comp->grabbed) return;
4513 e_comp->updates = eina_list_remove(e_comp->updates, cw->ec);
4514 if (!e_comp->updates)
4516 E_FREE_FUNC(e_comp->update_job, ecore_job_del);
4517 if (e_comp->render_animator)
4518 ecore_animator_freeze(e_comp->render_animator);
4523 e_comp_object_shape_apply(Evas_Object *obj)
4527 unsigned int i, *pix, *p;
4531 if (!cw->ec) return; //NYI
4532 if (cw->external_content) return;
4535 if ((cw->ec->shape_rects_num >= 1) &&
4536 (!_e_comp_shaped_check(cw->ec->client.w, cw->ec->client.h, cw->ec->shape_rects, cw->ec->shape_rects_num)))
4541 ERR("BUGGER: shape with native surface? cw=%p", cw);
4544 evas_object_image_size_get(cw->obj, &w, &h);
4545 if ((w < 1) || (h < 1)) return;
4548 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4549 _e_comp_object_alpha_set(cw);
4550 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4551 evas_object_image_alpha_set(o, 1);
4553 p = pix = evas_object_image_data_get(cw->obj, 1);
4556 evas_object_image_data_set(cw->obj, pix);
4561 unsigned char *spix, *sp;
4563 spix = calloc(w * h, sizeof(unsigned char));
4565 for (i = 0; i < cw->ec->shape_rects_num; i++)
4569 rx = cw->ec->shape_rects[i].x; ry = cw->ec->shape_rects[i].y;
4570 rw = cw->ec->shape_rects[i].w; rh = cw->ec->shape_rects[i].h;
4571 E_RECTS_CLIP_TO_RECT(rx, ry, rw, rh, 0, 0, w, h);
4572 sp = spix + (w * ry) + rx;
4573 for (py = 0; py < rh; py++)
4575 for (px = 0; px < rw; px++)
4583 for (py = 0; py < h; py++)
4585 for (px = 0; px < w; px++)
4587 unsigned int mask, imask;
4589 mask = ((unsigned int)(*sp)) << 24;
4591 imask |= imask >> 8;
4592 imask |= imask >> 8;
4593 *p = mask | (*p & imask);
4594 //if (*sp) *p = 0xff000000 | *p;
4595 //else *p = 0x00000000;
4604 for (py = 0; py < h; py++)
4606 for (px = 0; px < w; px++)
4610 evas_object_image_data_set(cw->obj, pix);
4611 evas_object_image_data_update_add(cw->obj, 0, 0, w, h);
4612 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4614 evas_object_image_data_set(o, pix);
4615 evas_object_image_data_update_add(o, 0, 0, w, h);
4617 // don't need to fix alpha chanel as blending
4618 // should be totally off here regardless of
4619 // alpha channel content
4623 _e_comp_object_clear(E_Comp_Object *cw)
4628 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
4630 if (cw->render_update_lock.lock) return;
4633 e_pixmap_clear(cw->ec->pixmap);
4635 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4636 evas_object_image_size_set(cw->obj, 1, 1);
4637 evas_object_image_data_set(cw->obj, NULL);
4638 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4640 evas_object_image_size_set(o, 1, 1);
4641 evas_object_image_data_set(o, NULL);
4644 e_comp_object_render_update_del(cw->smart_obj);
4648 _e_comp_object_transparent_set(Evas_Object *obj, Eina_Bool set)
4652 API_ENTRY EINA_FALSE;
4654 if (cw->transparent.set == set)
4659 evas_object_color_get(obj, &r, &g, &b, &a);
4661 cw->transparent.user_r = r;
4662 cw->transparent.user_g = g;
4663 cw->transparent.user_b = b;
4664 cw->transparent.user_a = a;
4666 cw->transparent.setting = EINA_TRUE;
4667 evas_object_color_set(obj, 0, 0, 0, 0);
4668 cw->transparent.setting = EINA_FALSE;
4670 ELOGF("COMP", "Transparent enabled user_color(%d,%d,%d,%d)",
4672 cw->transparent.user_r,
4673 cw->transparent.user_g,
4674 cw->transparent.user_b,
4675 cw->transparent.user_a);
4677 cw->transparent.set = EINA_TRUE;
4681 cw->transparent.set = EINA_FALSE;
4683 evas_object_color_set(obj,
4684 cw->transparent.user_r,
4685 cw->transparent.user_g,
4686 cw->transparent.user_b,
4687 cw->transparent.user_a);
4689 ELOGF("COMP", "Transparent disabled user_color(%d,%d,%d,%d)",
4691 cw->transparent.user_r,
4692 cw->transparent.user_g,
4693 cw->transparent.user_b,
4694 cw->transparent.user_a);
4700 /* helper function to simplify toggling of redirection for display servers which support it */
4702 e_comp_object_redirected_set(Evas_Object *obj, Eina_Bool set)
4707 if (cw->redirected == set) return;
4708 cw->redirected = set;
4709 if (cw->external_content) return;
4711 e_comp_object_map_update(obj);
4715 if (cw->updates_exist)
4716 e_comp_object_render_update_add(obj);
4718 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4720 _e_comp_object_transparent_set(obj, EINA_FALSE);
4721 evas_object_smart_callback_call(obj, "redirected", NULL);
4725 _e_comp_object_clear(cw);
4726 _e_comp_object_transparent_set(obj, EINA_TRUE);
4727 evas_object_smart_callback_call(obj, "unredirected", NULL);
4732 _e_comp_object_cb_buffer_destroy(struct wl_listener *listener, void *data EINA_UNUSED)
4735 cw = container_of(listener, E_Comp_Object, buffer_destroy_listener);
4737 if (cw->buffer_destroy_listener.notify)
4739 cw->buffer_destroy_listener.notify = NULL;
4740 wl_list_remove(&cw->buffer_destroy_listener.link);
4743 if (e_object_is_del(E_OBJECT(cw->ec)))
4745 if (!e_object_delay_del_ref_get(E_OBJECT(cw->ec)))
4750 /* if it's current displaying buffer, do not remove its content */
4751 if (!evas_object_visible_get(cw->ec->frame))
4752 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4757 _e_comp_object_native_surface_set(E_Comp_Object *cw, Evas_Native_Surface *ns, Eina_Bool with_mirror)
4762 if (cw->buffer_destroy_listener.notify)
4764 wl_list_remove(&cw->buffer_destroy_listener.link);
4765 cw->buffer_destroy_listener.notify = NULL;
4768 if (cw->tbm_surface)
4770 tbm_surface_internal_unref(cw->tbm_surface);
4771 cw->tbm_surface = NULL;
4776 if ((ns->type == EVAS_NATIVE_SURFACE_WL) && (ns->data.wl.legacy_buffer))
4778 cw->buffer_destroy_listener.notify = _e_comp_object_cb_buffer_destroy;
4779 wl_resource_add_destroy_listener((struct wl_resource *)ns->data.wl.legacy_buffer, &cw->buffer_destroy_listener);
4781 else if ((ns->type == EVAS_NATIVE_SURFACE_TBM) && (ns->data.tbm.buffer))
4783 tbm_surface_internal_ref(ns->data.tbm.buffer);
4784 cw->tbm_surface = ns->data.tbm.buffer;
4788 TRACE_DS_BEGIN(NATIVE_SURFACE_SET);
4789 evas_object_image_native_surface_set(cw->obj, ns);
4793 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4795 evas_object_image_alpha_set(o, !!cw->ns ? 1 : cw->ec->argb);
4796 TRACE_DS_BEGIN(NATIVE_SURFACE_SET);
4797 evas_object_image_native_surface_set(o, ns);
4804 e_comp_object_native_surface_set(Evas_Object *obj, Eina_Bool set)
4806 Evas_Native_Surface ns;
4809 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
4810 if (cw->ec->input_only) return;
4811 if (cw->external_content) return;
4812 if (cw->render_update_lock.lock) return;
4815 memset(&ns, 0, sizeof(Evas_Native_Surface));
4819 /* native requires gl enabled, texture from pixmap enabled, and a non-shaped client */
4820 set = (!cw->ec->shaped);
4822 set = (!!cw->ns) || e_pixmap_native_surface_init(cw->ec->pixmap, &ns);
4826 _e_comp_object_native_surface_set(cw, set && (!cw->blanked) ? (cw->ns ? cw->ns : &ns) : NULL, EINA_TRUE);
4830 e_comp_object_native_surface_override(Evas_Object *obj, Evas_Native_Surface *ns)
4833 if (cw->ec->input_only) return;
4836 cw->ns = (Evas_Native_Surface*)eina_memdup((unsigned char*)ns, sizeof(Evas_Native_Surface), 0);
4837 _e_comp_object_alpha_set(cw);
4839 e_comp_object_native_surface_set(obj, cw->native);
4840 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4844 e_comp_object_blank(Evas_Object *obj, Eina_Bool set)
4850 if (cw->blanked == set) return;
4852 _e_comp_object_alpha_set(cw);
4855 _e_comp_object_native_surface_set(cw, NULL, EINA_FALSE);
4856 evas_object_image_data_set(cw->obj, NULL);
4860 e_comp_object_native_surface_set(obj, 1);
4861 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4865 _e_comp_object_damage_trace_rect_set(Evas_Object *obj, Eina_Rectangle *origin, int dmg_x, int dmg_y, int dmg_w, int dmg_h)
4870 if (!_damage_trace) return;
4874 if (!evas_object_visible_get(cw->obj)) return;
4876 evas_object_geometry_get(cw->obj, &obj_x, &obj_y, NULL, NULL);
4878 o = evas_object_rectangle_add(e_comp->evas);
4879 evas_object_layer_set(o, E_LAYER_MAX);
4880 evas_object_name_set(o, "damage_trace");
4881 evas_object_move(o, dmg_x + obj_x, dmg_y + obj_y);
4882 evas_object_resize(o, dmg_w, dmg_h);
4883 evas_object_color_set(o, 0, 128, 0, 128);
4884 evas_object_render_op_set(o, EVAS_RENDER_BLEND);
4885 evas_object_pass_events_set(o, EINA_TRUE);
4886 evas_object_show(o);
4888 ELOGF("COMP", "add damage(%dx%d+%d+%d) origin(%dx%d+%d+%d)",
4890 dmg_w, dmg_h, dmg_x, dmg_y,
4891 origin->w, origin->h, origin->x, origin->y);
4893 _damage_trace_objs = eina_list_append(_damage_trace_objs, o);
4896 /* mark an object as dirty and setup damages */
4898 e_comp_object_dirty(Evas_Object *obj)
4901 Eina_Rectangle *rect;
4905 Eina_Bool dirty, visible;
4909 if (cw->external_content) return;
4910 if (!cw->redirected) return;
4911 if (cw->render_update_lock.lock)
4913 ELOGF("COMP", "Render update locked:%d", cw->ec, cw->render_update_lock.lock);
4916 /* only actually dirty if pixmap is available */
4917 if (!e_pixmap_resource_get(cw->ec->pixmap))
4919 // e_pixmap_size_get returns last attached buffer size
4920 // eventhough it is destroyed
4921 ERR("ERROR NO PIXMAP FOR ec:%p", cw->ec);
4924 dirty = e_pixmap_size_get(cw->ec->pixmap, &w, &h);
4925 visible = cw->visible;
4926 if (!dirty) w = h = 1;
4927 evas_object_image_pixels_dirty_set(cw->obj, cw->blanked ? 0 : dirty);
4929 evas_object_image_data_set(cw->obj, NULL);
4930 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
4931 evas_object_image_size_set(cw->obj, tw, th);
4932 if (cw->mask.obj) evas_object_resize(cw->mask.obj, w, h);
4933 if (cw->pending_updates)
4934 eina_tiler_area_size_set(cw->pending_updates, w, h);
4935 EINA_LIST_FOREACH(cw->obj_mirror, ll, o)
4937 evas_object_image_pixels_dirty_set(o, dirty);
4939 evas_object_image_data_set(o, NULL);
4940 evas_object_image_size_set(o, tw, th);
4941 visible |= evas_object_visible_get(o);
4945 ERR("ERROR FETCHING PIXMAP FOR %p", cw->ec);
4949 e_comp_object_native_surface_set(obj, 1);
4951 m = _e_comp_object_map_damage_transform_get(cw->ec);
4952 it = eina_tiler_iterator_new(cw->updates);
4953 EINA_ITERATOR_FOREACH(it, rect)
4955 /* evas converts damage according to rotation of ecore_evas in damage_region_set
4956 * of evas engine and doesn't convert damage according to evas_map.
4957 * so damage of evas_object_image use surface coordinate.
4961 int damage_x, damage_y, damage_w, damage_h;
4963 _e_comp_object_map_damage_transform_rect(cw->ec, m, rect->x, rect->y, rect->w, rect->h,
4964 &damage_x, &damage_y, &damage_w, &damage_h);
4965 evas_object_image_data_update_add(cw->obj, damage_x, damage_y, damage_w, damage_h);
4966 _e_comp_object_damage_trace_rect_set(obj, rect, damage_x, damage_y, damage_w, damage_h);
4970 evas_object_image_data_update_add(cw->obj, rect->x, rect->y, rect->w, rect->h);
4971 _e_comp_object_damage_trace_rect_set(obj, rect, rect->x, rect->y, rect->w, rect->h);
4974 EINA_LIST_FOREACH(cw->obj_mirror, ll, o)
4975 evas_object_image_data_update_add(o, rect->x, rect->y, rect->w, rect->h);
4976 if (cw->pending_updates)
4977 eina_tiler_rect_add(cw->pending_updates, rect);
4979 eina_iterator_free(it);
4980 if (m) e_map_free(m);
4981 if (cw->pending_updates)
4982 eina_tiler_clear(cw->updates);
4985 cw->pending_updates = cw->updates;
4986 cw->updates = eina_tiler_new(w, h);
4987 eina_tiler_tile_size_set(cw->updates, 1, 1);
4989 cw->update_count = cw->updates_full = cw->updates_exist = 0;
4990 evas_object_smart_callback_call(obj, "dirty", NULL);
4991 if (cw->visible || (!visible) || (!cw->pending_updates) || cw->native) return;
4992 /* force render if main object is hidden but mirrors are visible */
4993 RENDER_DEBUG("FORCING RENDER %p", cw->ec);
4994 e_comp_object_render(obj);
4998 e_comp_object_render(Evas_Object *obj)
5005 API_ENTRY EINA_FALSE;
5007 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5008 if (cw->ec->input_only) return EINA_TRUE;
5009 if (cw->external_content) return EINA_TRUE;
5010 if (cw->native) return EINA_FALSE;
5011 /* if comp object is not redirected state, comp object should not be set by newly committed data
5012 because image size of comp object is 1x1 and it should not be shown on canvas */
5013 if (!cw->redirected) return EINA_TRUE;
5014 if (cw->render_update_lock.lock)
5016 ELOGF("COMP", "Render update locked:%d", cw->ec, cw->render_update_lock.lock);
5019 e_comp_object_render_update_del(obj);
5020 if (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph)) return EINA_FALSE;
5022 if (!cw->pending_updates)
5024 WRN("RENDER [%p]: NO RECTS!", cw->ec);
5025 evas_object_image_data_set(cw->obj, NULL);
5026 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
5027 evas_object_image_data_set(o, NULL);
5031 evas_object_image_pixels_dirty_set(cw->obj, EINA_FALSE);
5033 RENDER_DEBUG("RENDER SIZE: %dx%d", pw, ph);
5035 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5038 e_pixmap_image_refresh(cw->ec->pixmap);
5039 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5042 if ((pix) && ((!cw->blanked) || (cw->obj_mirror)))
5043 e_pixmap_image_data_ref(cw->ec->pixmap);
5045 /* set pixel data */
5046 evas_object_image_data_set(cw->obj, cw->blanked ? NULL : pix);
5047 _e_comp_object_alpha_set(cw);
5048 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
5050 evas_object_image_data_set(o, pix);
5051 evas_object_image_alpha_set(o, evas_object_image_alpha_get(cw->obj));
5052 evas_object_image_pixels_dirty_set(o, EINA_FALSE);
5055 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
5057 e_comp_client_post_update_add(cw->ec);
5062 /* create a duplicate of an evas object */
5064 e_comp_object_util_mirror_add(Evas_Object *obj)
5068 unsigned int *pix = NULL;
5069 Eina_Bool argb = EINA_FALSE;
5074 cw = evas_object_data_get(obj, "comp_mirror");
5077 o = evas_object_image_filled_add(evas_object_evas_get(obj));
5078 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
5079 evas_object_image_smooth_scale_set(o, e_comp_config_get()->smooth_windows);
5080 evas_object_image_alpha_set(o, 1);
5081 evas_object_image_source_set(o, obj);
5084 if ((!cw->ec) || (!e_pixmap_size_get(cw->ec->pixmap, &w, &h))) return NULL;
5085 if (cw->external_content)
5087 ERR("%p of client %p is external content.", obj, cw->ec);
5090 o = evas_object_image_filled_add(evas_object_evas_get(obj));
5091 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
5092 evas_object_image_smooth_scale_set(o, e_comp_config_get()->smooth_windows);
5093 cw->obj_mirror = eina_list_append(cw->obj_mirror, o);
5094 evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, _e_comp_object_cb_mirror_del, cw);
5095 evas_object_event_callback_add(o, EVAS_CALLBACK_SHOW, _e_comp_object_cb_mirror_show, cw);
5096 evas_object_event_callback_add(o, EVAS_CALLBACK_HIDE, _e_comp_object_cb_mirror_hide, cw);
5097 evas_object_data_set(o, "E_Client_Mirror", cw->ec);
5098 evas_object_data_set(o, "comp_mirror", cw);
5100 evas_object_image_alpha_set(o, evas_object_image_alpha_get(cw->obj));
5101 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
5103 evas_object_image_size_set(o, tw, th);
5106 pix = evas_object_image_data_get(cw->obj, 0);
5112 evas_object_image_native_surface_set(o, cw->ns);
5115 Evas_Native_Surface ns;
5116 memset(&ns, 0, sizeof(Evas_Native_Surface));
5117 if (e_pixmap_native_surface_init(cw->ec->pixmap, &ns))
5118 evas_object_image_native_surface_set(o, &ns);
5123 /* FIXME: legacy code, please refer to commit 5e6831187a1 */
5124 argb = e_pixmap_image_is_argb(cw->ec->pixmap);
5126 (e_pixmap_image_exists(cw->ec->pixmap)))
5127 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5129 pix = evas_object_image_data_get(cw->obj, EINA_FALSE);
5136 dirty = evas_object_image_pixels_dirty_get(cw->obj);
5137 evas_object_image_pixels_dirty_set(o, dirty);
5138 evas_object_image_data_set(o, pix);
5139 evas_object_image_data_set(cw->obj, pix);
5141 evas_object_image_data_update_add(o, 0, 0, tw, th);
5146 //////////////////////////////////////////////////////
5149 e_comp_object_effect_allowed_get(Evas_Object *obj)
5151 API_ENTRY EINA_FALSE;
5153 if (!cw->shobj) return EINA_FALSE;
5154 if (cw->ec->override) return !e_comp_config_get()->match.disable_overrides;
5155 return !e_comp_config_get()->match.disable_borders;
5158 /* setup an api effect for a client */
5160 e_comp_object_effect_set(Evas_Object *obj, const char *effect)
5163 Eina_Stringshare *grp;
5164 E_Comp_Config *config;
5165 Eina_Bool loaded = EINA_FALSE;
5167 API_ENTRY EINA_FALSE;
5168 if (!cw->shobj) return EINA_FALSE; //input window
5170 if (!effect) effect = "none";
5171 snprintf(buf, sizeof(buf), "e/comp/effects/%s", effect);
5173 config = e_comp_config_get();
5174 if ((config) && (config->effect_file))
5176 if (edje_object_file_set(cw->effect_obj, config->effect_file, buf))
5178 cw->effect_set = EINA_TRUE;
5185 edje_object_file_get(cw->effect_obj, NULL, &grp);
5186 cw->effect_set = !eina_streq(effect, "none");
5187 if (!e_util_strcmp(buf, grp)) return cw->effect_set;
5188 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", buf))
5190 snprintf(buf, sizeof(buf), "e/comp/effects/auto/%s", effect);
5191 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", buf))
5192 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", "e/comp/effects/none"))
5194 if (cw->effect_running)
5196 if (!e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb")))
5199 cw->effect_set = EINA_FALSE;
5200 return cw->effect_set;
5204 if (cw->effect_running)
5206 if (!e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb")))
5209 ELOGF("COMP", "EFFECT Set GROUP[%s]", cw->ec, buf);
5210 edje_object_part_swallow(cw->effect_obj, "e.swallow.content", cw->shobj);
5211 if (cw->effect_clip)
5213 evas_object_clip_unset(cw->clip);
5214 cw->effect_clip = 0;
5216 cw->effect_clip_able = !edje_object_data_get(cw->effect_obj, "noclip");
5218 _e_comp_object_dim_update(cw);
5220 return cw->effect_set;
5223 /* set params for embryo scripts in effect */
5225 e_comp_object_effect_params_set(Evas_Object *obj, int id, int *params, unsigned int count)
5227 Edje_Message_Int_Set *msg;
5231 EINA_SAFETY_ON_NULL_RETURN(params);
5232 EINA_SAFETY_ON_FALSE_RETURN(count);
5233 if (!cw->effect_set) return;
5235 msg = alloca(sizeof(Edje_Message_Int_Set) + ((count - 1) * sizeof(int)));
5236 msg->count = (int)count;
5237 for (x = 0; x < count; x++)
5238 msg->val[x] = params[x];
5239 edje_object_message_send(cw->effect_obj, EDJE_MESSAGE_INT_SET, id, msg);
5240 edje_object_message_signal_process(cw->effect_obj);
5244 _e_comp_object_effect_end_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
5246 Edje_Signal_Cb end_cb;
5248 E_Comp_Object *cw = data;
5250 edje_object_signal_callback_del_full(obj, "e,action,done", "e", _e_comp_object_effect_end_cb, NULL);
5251 cw->effect_running = 0;
5252 if (!_e_comp_object_animating_end(cw)) return;
5254 if (evas_object_data_get(cw->smart_obj, "effect_running"))
5256 evas_object_data_del(cw->smart_obj, "effect_running");
5257 _e_comp_object_event_simple(obj, E_EVENT_COMP_OBJECT_EFFECT_END);
5258 e_comp_visibility_calculation_set(EINA_TRUE);
5261 end_cb = evas_object_data_get(obj, "_e_comp.end_cb");
5262 if (!end_cb) return;
5263 end_data = evas_object_data_get(obj, "_e_comp.end_data");
5264 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_END, cw->ec);
5265 end_cb(end_data, cw->smart_obj, emission, source);
5268 /* clip effect to client's zone */
5270 e_comp_object_effect_clip(Evas_Object *obj)
5274 zone = e_comp_zone_find_by_ec(cw->ec);
5276 if (cw->effect_clip) e_comp_object_effect_unclip(cw->smart_obj);
5277 if (!cw->effect_clip_able) return;
5278 evas_object_clip_set(cw->smart_obj, zone->bg_clip_object);
5279 cw->effect_clip = 1;
5282 /* unclip effect from client's zone */
5284 e_comp_object_effect_unclip(Evas_Object *obj)
5287 if (!cw->effect_clip) return;
5288 evas_object_clip_unset(cw->smart_obj);
5289 cw->effect_clip = 0;
5292 /* start effect, running end_cb after */
5294 e_comp_object_effect_start(Evas_Object *obj, Edje_Signal_Cb end_cb, const void *end_data)
5296 API_ENTRY EINA_FALSE;
5297 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE); //NYI
5298 if (!cw->effect_set) return EINA_FALSE;
5300 if (cw->effect_running)
5302 e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb"));
5305 e_comp_object_effect_clip(obj);
5306 edje_object_signal_callback_del(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb);
5308 edje_object_signal_callback_add(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb, cw);
5309 evas_object_data_set(cw->effect_obj, "_e_comp.end_cb", end_cb);
5310 evas_object_data_set(cw->effect_obj, "_e_comp.end_data", end_data);
5311 evas_object_data_set(cw->smart_obj, "effect_running", (void*)1);
5313 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_START, cw->ec);
5314 _e_comp_object_event_simple(obj, E_EVENT_COMP_OBJECT_EFFECT_START);
5316 edje_object_signal_emit(cw->effect_obj, "e,action,go", "e");
5317 _e_comp_object_animating_begin(cw);
5318 cw->effect_running = 1;
5322 /* stop a currently-running effect immediately */
5324 e_comp_object_effect_stop(Evas_Object *obj, Edje_Signal_Cb end_cb)
5327 Edje_Signal_Cb end_cb_before = NULL;
5328 void *end_data_before = NULL;
5329 API_ENTRY EINA_FALSE;
5331 end_cb_before = evas_object_data_get(cw->effect_obj, "_e_comp.end_cb");
5332 end_data_before = evas_object_data_get(cw->effect_obj, "_e_comp.end_data");
5334 if (end_cb_before != end_cb) return EINA_TRUE;
5335 e_comp_object_effect_unclip(obj);
5336 if (cw->effect_clip)
5338 evas_object_clip_unset(cw->effect_obj);
5339 cw->effect_clip = 0;
5341 edje_object_signal_emit(cw->effect_obj, "e,action,stop", "e");
5342 edje_object_signal_callback_del_full(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb, cw);
5344 if (evas_object_data_get(cw->smart_obj, "effect_running"))
5346 evas_object_data_del(cw->smart_obj, "effect_running");
5347 e_comp_visibility_calculation_set(EINA_TRUE);
5350 cw->effect_running = 0;
5351 ret = _e_comp_object_animating_end(cw);
5353 if ((ret) && (end_cb_before))
5355 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_END, cw->ec);
5356 end_cb_before(end_data_before, cw->smart_obj, "e,action,done", "e");
5363 _e_comp_object_effect_mover_sort_cb(E_Comp_Object_Mover *a, E_Comp_Object_Mover *b)
5365 return a->pri - b->pri;
5368 /* add a function to trigger based on signal emissions for the purpose of modifying effects */
5369 E_API E_Comp_Object_Mover *
5370 e_comp_object_effect_mover_add(int pri, const char *sig, E_Comp_Object_Mover_Cb provider, const void *data)
5372 E_Comp_Object_Mover *prov;
5374 prov = E_NEW(E_Comp_Object_Mover, 1);
5375 EINA_SAFETY_ON_NULL_RETURN_VAL(prov, NULL);
5376 prov->func = provider;
5377 prov->data = (void*)data;
5380 _e_comp_object_movers = eina_inlist_sorted_insert(_e_comp_object_movers, EINA_INLIST_GET(prov),
5381 (Eina_Compare_Cb)_e_comp_object_effect_mover_sort_cb);
5386 e_comp_object_effect_mover_del(E_Comp_Object_Mover *prov)
5388 EINA_SAFETY_ON_NULL_RETURN(prov);
5389 _e_comp_object_movers = eina_inlist_remove(_e_comp_object_movers, EINA_INLIST_GET(prov));
5394 e_comp_object_effect_object_get(Evas_Object *obj)
5398 return cw->effect_obj;
5402 e_comp_object_effect_hiding_set(Evas_Object *obj, Eina_Bool set)
5404 API_ENTRY EINA_FALSE;
5405 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5406 if (!cw->effect_set) return EINA_FALSE;
5413 ////////////////////////////////////
5416 _e_comp_object_autoclose_cleanup(Eina_Bool already_del)
5418 if (e_comp->autoclose.obj)
5420 e_comp_ungrab_input(0, 1);
5421 if (e_comp->autoclose.del_cb)
5422 e_comp->autoclose.del_cb(e_comp->autoclose.data, e_comp->autoclose.obj);
5423 else if (!already_del)
5425 evas_object_hide(e_comp->autoclose.obj);
5426 E_FREE_FUNC(e_comp->autoclose.obj, evas_object_del);
5428 E_FREE_FUNC(e_comp->autoclose.rect, evas_object_del);
5430 e_comp->autoclose.obj = NULL;
5431 e_comp->autoclose.data = NULL;
5432 e_comp->autoclose.del_cb = NULL;
5433 e_comp->autoclose.key_cb = NULL;
5434 E_FREE_FUNC(e_comp->autoclose.key_handler, ecore_event_handler_del);
5438 _e_comp_object_autoclose_mouse_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
5440 _e_comp_object_autoclose_cleanup(0);
5444 _e_comp_object_autoclose_setup(Evas_Object *obj)
5446 if (!e_comp->autoclose.rect)
5448 /* create rect just below autoclose object to catch mouse events */
5449 e_comp->autoclose.rect = evas_object_rectangle_add(e_comp->evas);
5450 evas_object_move(e_comp->autoclose.rect, 0, 0);
5451 evas_object_resize(e_comp->autoclose.rect, e_comp->w, e_comp->h);
5452 evas_object_show(e_comp->autoclose.rect);
5453 evas_object_name_set(e_comp->autoclose.rect, "e_comp->autoclose.rect");
5454 evas_object_color_set(e_comp->autoclose.rect, 0, 0, 0, 0);
5455 evas_object_event_callback_add(e_comp->autoclose.rect, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_autoclose_mouse_up_cb, e_comp);
5456 e_comp_grab_input(0, 1);
5458 evas_object_layer_set(e_comp->autoclose.rect, evas_object_layer_get(obj) - 1);
5459 evas_object_focus_set(obj, 1);
5463 _e_comp_object_autoclose_show(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
5465 _e_comp_object_autoclose_setup(obj);
5466 evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show);
5470 _e_comp_object_autoclose_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
5472 evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show);
5473 _e_comp_object_autoclose_cleanup(1);
5474 if (e_client_focused_get()) return;
5476 E_Zone *zone = e_zone_current_get();
5479 e_zone_focus_reset(zone);
5483 e_comp_object_util_autoclose(Evas_Object *obj, E_Comp_Object_Autoclose_Cb del_cb, E_Comp_Object_Key_Cb cb, const void *data)
5487 if (e_comp->autoclose.obj)
5489 if (e_comp->autoclose.obj == obj) return;
5490 evas_object_event_callback_del_full(e_comp->autoclose.obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5491 e_comp->autoclose.obj = obj;
5492 e_comp->autoclose.del_cb = del_cb;
5493 e_comp->autoclose.key_cb = cb;
5494 e_comp->autoclose.data = (void*)data;
5495 if (evas_object_visible_get(obj))
5496 _e_comp_object_autoclose_setup(obj);
5498 evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show, e_comp);
5499 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5502 e_comp->autoclose.obj = obj;
5503 e_comp->autoclose.del_cb = del_cb;
5504 e_comp->autoclose.key_cb = cb;
5505 e_comp->autoclose.data = (void*)data;
5506 if (evas_object_visible_get(obj))
5507 _e_comp_object_autoclose_setup(obj);
5509 evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show, e_comp);
5510 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5514 e_comp_object_is_animating(Evas_Object *obj)
5518 return cw->animating;
5522 e_comp_object_alpha_set(Evas_Object *obj, Eina_Bool alpha)
5526 if ((cw->external_content) &&
5527 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
5529 WRN("Can set up alpha value to ONLY evas \"image\" object. "
5530 "But current external content is %d object for %p.",
5531 cw->content_type, cw->ec);
5535 cw->user_alpha_set = EINA_TRUE;
5536 cw->user_alpha = alpha;
5538 if (!cw->obj) return;
5540 if (alpha == evas_object_image_alpha_get(cw->obj)) return;
5542 evas_object_image_alpha_set(cw->obj, alpha);
5544 if ((!cw->native) && (!cw->external_content))
5545 evas_object_image_data_set(cw->obj, NULL);
5549 e_comp_object_alpha_get(Evas_Object *obj)
5551 API_ENTRY EINA_FALSE;
5553 return evas_object_image_alpha_get(cw->obj);
5557 e_comp_object_mask_set(Evas_Object *obj, Eina_Bool set)
5559 Eina_Bool mask_set = EINA_FALSE;
5563 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5564 if (cw->ec->input_only) return;
5571 o = evas_object_rectangle_add(e_comp->evas);
5572 evas_object_color_set(o, 0, 0, 0, 0);
5573 evas_object_clip_set(o, cw->clip);
5574 evas_object_smart_member_add(o, obj);
5575 evas_object_move(o, 0, 0);
5576 evas_object_resize(o, cw->w, cw->h);
5577 /* save render op value to restore when clear a mask.
5579 * NOTE: DO NOT change the render op on ec->frame while mask object
5580 * is set. it will overwrite the changed op value. */
5581 cw->mask.saved_render_op = evas_object_render_op_get(obj);
5582 evas_object_render_op_set(obj, EVAS_RENDER_COPY);
5583 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5584 if (cw->visible) evas_object_show(o);
5587 evas_object_name_set(cw->mask.obj, "cw->mask_obj");
5588 ELOGF("COMP", " |mask_obj", cw->ec);
5589 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_MASK_OBJECT_SET, cw->ec);
5596 evas_object_smart_member_del(cw->mask.obj);
5597 E_FREE_FUNC(cw->mask.obj, evas_object_del);
5599 evas_object_render_op_set(obj, cw->mask.saved_render_op);
5600 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET, cw->ec);
5606 e_comp_object_mask_has(Evas_Object *obj)
5608 API_ENTRY EINA_FALSE;
5610 return (cw->mask.obj) ? EINA_TRUE : EINA_FALSE;
5614 e_comp_object_size_update(Evas_Object *obj, int w, int h)
5619 if ((cw->external_content) &&
5620 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
5622 WRN("Can set up size to ONLY evas \"image\" object. "
5623 "But current external content is %d object for %p.",
5624 cw->content_type, cw->ec);
5628 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
5630 evas_object_image_size_set(cw->obj, tw, th);
5634 e_comp_object_transform_bg_set(Evas_Object *obj, Eina_Bool set)
5636 Eina_Bool transform_set = EINA_FALSE;
5638 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5639 if (cw->ec->input_only) return;
5641 transform_set = !!set;
5645 if (!cw->transform_bg_obj)
5647 Evas_Object *o = evas_object_rectangle_add(e_comp->evas);
5648 evas_object_move(o, 0, 0);
5649 evas_object_resize(o, 1, 1);
5650 if (cw->transform_bg_color.a >= 255)
5651 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5653 evas_object_render_op_set(o, EVAS_RENDER_BLEND);
5654 evas_object_color_set(o,
5655 cw->transform_bg_color.r,
5656 cw->transform_bg_color.g,
5657 cw->transform_bg_color.b,
5658 cw->transform_bg_color.a);
5659 if (cw->visible) evas_object_show(o);
5661 cw->transform_bg_obj = o;
5662 evas_object_name_set(cw->transform_bg_obj, "cw->transform_bg_obj");
5664 #ifdef REFACTOR_DESK_AREA
5665 e_comp_object_transform_obj_stack_update(obj);
5667 _e_comp_object_transform_obj_stack_update(obj);
5672 if (cw->transform_bg_obj)
5674 evas_object_smart_member_del(cw->transform_bg_obj);
5675 E_FREE_FUNC(cw->transform_bg_obj, evas_object_del);
5681 e_comp_object_transform_bg_color_set(Evas_Object *obj, int r, int g, int b, int a)
5685 cw->transform_bg_color.r = r;
5686 cw->transform_bg_color.g = g;
5687 cw->transform_bg_color.b = b;
5688 cw->transform_bg_color.a = a;
5690 if (cw->transform_bg_obj)
5692 evas_object_color_set(cw->transform_bg_obj,
5693 cw->transform_bg_color.r,
5694 cw->transform_bg_color.g,
5695 cw->transform_bg_color.b,
5696 cw->transform_bg_color.a);
5701 e_comp_object_transform_bg_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
5704 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5705 if (cw->ec->input_only) return;
5706 if (!cw->transform_bg_obj) return;
5708 _e_comp_object_transform_obj_map_set(cw->transform_bg_obj, vertices);
5712 e_comp_object_transform_bg_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
5715 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5716 if (cw->ec->input_only) return;
5717 if (!cw->transform_bg_obj) return;
5719 _e_comp_object_transform_obj_map_set_with_zoom(cw->transform_bg_obj, vertices, zoom);
5723 e_comp_object_transform_transp_set(Evas_Object *obj, Eina_Bool set)
5725 Eina_Bool transform_set = EINA_FALSE;
5727 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5728 if (cw->ec->input_only) return;
5730 transform_set = !!set;
5734 if (!cw->transform_tranp_obj)
5736 Evas_Object *o = evas_object_rectangle_add(e_comp->evas);
5737 evas_object_move(o, 0, 0);
5738 evas_object_resize(o, 1, 1);
5739 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5740 evas_object_color_set(o, 0, 0, 0, 0);
5741 if (cw->visible) evas_object_show(o);
5743 cw->transform_tranp_obj = o;
5744 evas_object_pass_events_set(cw->transform_tranp_obj, EINA_TRUE);
5745 ELOGF("TRANSFORM","transform set: TRUE", cw->ec);
5746 evas_object_name_set(cw->transform_tranp_obj, "cw->transform_trasp_obj");
5748 #ifdef REFACTOR_DESK_AREA
5749 e_comp_object_transform_obj_stack_update(obj);
5751 _e_comp_object_transform_obj_stack_update(obj);
5756 if (cw->transform_tranp_obj)
5758 ELOGF("TRANSFORM","transform set: FALSE", cw->ec);
5759 evas_object_smart_member_del(cw->transform_tranp_obj);
5760 E_FREE_FUNC(cw->transform_tranp_obj, evas_object_del);
5766 e_comp_object_transform_transp_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
5769 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5770 if (cw->ec->input_only) return;
5771 if (!cw->transform_tranp_obj) return;
5773 _e_comp_object_transform_obj_map_set(cw->transform_tranp_obj, vertices);
5777 e_comp_object_transform_transp_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
5780 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5781 if (cw->ec->input_only) return;
5782 if (!cw->transform_tranp_obj) return;
5784 _e_comp_object_transform_obj_map_set_with_zoom(cw->transform_tranp_obj, vertices, zoom);
5787 #ifdef REFACTOR_DESK_AREA
5790 e_comp_object_layer_update(Evas_Object *obj,
5791 Evas_Object *above, Evas_Object *below)
5793 E_Comp_Object *cw2 = NULL;
5794 Evas_Object *o = NULL;
5799 if (cw->ec->layer_block) return;
5800 if ((above) && (below))
5802 ERR("Invalid layer update request! cw=%p", cw);
5810 layer = evas_object_layer_get(o);
5811 cw2 = evas_object_data_get(o, "comp_obj");
5814 if (!e_util_strcmp(evas_object_name_get(o), "layer_obj")) break;
5816 o = evas_object_above_get(o);
5817 if ((!o) || (o == cw->smart_obj)) break;
5818 if (evas_object_layer_get(o) != layer)
5820 o = e_comp->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_ALERT)].obj;
5825 ec = e_client_top_get();
5826 if (ec) o = ec->frame;
5829 if (o) cw2 = evas_object_data_get(o, "comp_obj");
5833 _e_comp_object_layers_remove(cw);
5836 if (cw2->layer > cw->layer)
5837 _e_comp_object_layers_add(cw, NULL, NULL, 0);
5838 else if (cw2->layer == cw->layer)
5841 _e_comp_object_layers_add(cw, cw2, NULL, 0);
5843 _e_comp_object_layers_add(cw, NULL, NULL, above? 0 : 1);
5845 _e_comp_object_layers_add(cw, NULL, cw2, 0);
5848 _e_comp_object_layers_add(cw, NULL, NULL, 1);
5851 _e_comp_object_layers_add(cw, NULL, NULL, 0);
5856 e_comp_object_layer_get(Evas_Object *obj)
5863 e_comp_object_content_set(Evas_Object *obj,
5864 Evas_Object *content,
5865 E_Comp_Object_Content_Type type)
5867 API_ENTRY EINA_FALSE;
5869 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5870 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec->pixmap, EINA_FALSE);
5871 EINA_SAFETY_ON_NULL_RETURN_VAL(content, EINA_FALSE);
5875 ERR("Can't set e.swallow.content to requested content. "
5876 "Previous comp object should not be changed at all.");
5880 if (e_pixmap_usable_get(cw->ec->pixmap)) return EINA_FALSE;
5882 if ((type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE) &&
5883 (type != E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE))
5885 ERR("Content type %d for %p is not supported ec:%p pixmap:%p",
5886 type, content, cw->ec, cw->ec->pixmap);
5890 cw->external_content = EINA_TRUE;
5893 cw->content_type = type;
5894 e_util_size_debug_set(cw->obj, 1);
5895 evas_object_name_set(cw->obj, "cw->obj");
5896 _e_comp_object_alpha_set(cw);
5899 _e_comp_object_shadow_setup(cw);
5901 wl_signal_emit(&cw->events.content_type_set, NULL);
5907 e_comp_object_content_unset(Evas_Object *obj)
5909 API_ENTRY EINA_FALSE;
5911 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5912 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec->pixmap, EINA_FALSE);
5914 if (!cw->obj && !cw->ec->visible)
5916 ELOGF("COMP", "is not visible yet. no need to unset", cw->ec);
5920 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE)
5922 ELOGF("COMP", "has been set to internal image object already", cw->ec);
5928 if (cw->frame_object)
5929 edje_object_part_unswallow(cw->frame_object, cw->obj);
5931 edje_object_part_unswallow(cw->shobj, cw->obj);
5933 evas_object_del(cw->obj);
5934 evas_object_hide(cw->obj);
5938 cw->external_content = EINA_FALSE;
5939 if (cw->ec->is_cursor)
5942 DBG("%p is cursor surface..", cw->ec);
5943 if (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph))
5945 evas_object_resize(cw->ec->frame, pw, ph);
5946 evas_object_hide(cw->ec->frame);
5951 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE;
5952 cw->obj = evas_object_image_filled_add(e_comp->evas);
5953 evas_object_image_border_center_fill_set(cw->obj, EVAS_BORDER_FILL_SOLID);
5954 e_util_size_debug_set(cw->obj, 1);
5955 evas_object_image_pixels_get_callback_set(cw->obj, _e_comp_object_pixels_get, cw);
5956 evas_object_image_pixels_noti_callback_set(cw->obj, _e_comp_object_pixels_noti, cw);
5957 evas_object_image_smooth_scale_set(cw->obj, e_comp_config_get()->smooth_windows);
5958 evas_object_name_set(cw->obj, "cw->obj");
5959 evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888);
5960 evas_object_intercept_color_set_callback_add(obj, _e_comp_intercept_obj_color_set, cw);
5961 _e_comp_object_alpha_set(cw);
5964 _e_comp_object_shadow_setup(cw);
5969 _e_comp_intercept_show_helper(cw);
5973 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
5974 e_comp_object_dirty(cw->smart_obj);
5975 e_comp_object_render(cw->smart_obj);
5976 e_comp_object_render_update_add(obj);
5978 wl_signal_emit(&cw->events.content_type_set, NULL);
5983 EINTERN Evas_Object *
5984 e_comp_object_content_get(Evas_Object *obj)
5988 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, NULL);
5990 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE)
5992 ELOGF("COMP", "has been set to internal image object. couldn't return internal image object", cw->ec);
5999 E_API E_Comp_Object_Content_Type
6000 e_comp_object_content_type_get(Evas_Object *obj)
6002 API_ENTRY E_COMP_OBJECT_CONTENT_TYPE_NONE;
6004 return cw->content_type;
6008 e_comp_object_dim_mask_update(Evas_Object *obj, Eina_Bool mask_set, int x, int y, int w, int h)
6011 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
6012 E_Comp_Config *conf = e_comp_config_get();
6013 if (cw->ec->input_only) return;
6014 if (!conf->dim_rect_enable) return;
6016 cw->dim.mask_set = mask_set;
6022 if (!cw->dim.enable) return;
6023 e_comp_object_dim_mask_set(cw->ec->frame, mask_set);
6027 e_comp_object_dim_mask_set(Evas_Object *obj, Eina_Bool set)
6029 Eina_Bool mask_set = EINA_FALSE;
6033 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
6034 E_Comp_Config *conf = e_comp_config_get();
6035 if (cw->ec->input_only) return;
6036 if (!conf->dim_rect_enable) return;
6042 if (cw->dim.mask_obj)
6044 evas_object_smart_member_del(cw->dim.mask_obj);
6045 E_FREE_FUNC(cw->dim.mask_obj, evas_object_del);
6048 ELOGF("COMP", "DIM |Mask applied on Dim rect mask_rect[%d %d %d %d]", cw->ec, cw->dim.mask_x, cw->dim.mask_y, cw->dim.mask_w, cw->dim.mask_h);
6049 o = evas_object_rectangle_add(e_comp->evas);
6050 evas_object_color_set(o, 0, 0, 0, 0);
6051 evas_object_smart_member_add(o, obj);
6052 evas_object_resize(o, cw->dim.mask_w, cw->dim.mask_h);
6053 evas_object_move(o, cw->dim.mask_x, cw->dim.mask_y);
6055 evas_object_render_op_set(o, EVAS_RENDER_COPY);
6056 if (cw->visible) evas_object_show(o);
6058 cw->dim.mask_obj = o;
6059 evas_object_name_set(cw->dim.mask_obj, "cw->dim_mask_obj");
6061 evas_object_layer_set(cw->dim.mask_obj, 9998);
6065 if (cw->dim.mask_obj)
6067 ELOGF("COMP", "DIM |Mask on Dim rect Removed", cw->ec);
6068 evas_object_smart_member_del(cw->dim.mask_obj);
6069 E_FREE_FUNC(cw->dim.mask_obj, evas_object_del);
6075 e_comp_object_dim_client_set(E_Client *ec)
6077 E_Comp_Config *conf = e_comp_config_get();
6079 if (!conf->dim_rect_enable) return ;
6080 if (dim_client == ec) return;
6082 Eina_Bool prev_dim = EINA_FALSE;
6083 ELOGF("COMP", "DIM |Client Set %p -> %p", ec, dim_client, ec);
6085 if (dim_client && _e_comp_object_dim_enable_get(dim_client, dim_client->frame))
6086 prev_dim = EINA_TRUE;
6088 if (prev_dim && dim_client->visible && ec)
6090 _e_comp_object_dim_enable_set(dim_client, dim_client->frame, EINA_FALSE, EINA_TRUE);
6091 _e_comp_object_dim_enable_set(ec, ec->frame, EINA_TRUE, EINA_TRUE);
6095 if (prev_dim) _e_comp_object_dim_enable_set(dim_client, dim_client->frame, EINA_FALSE, EINA_FALSE);
6096 if (ec) _e_comp_object_dim_enable_set(ec, ec->frame, EINA_TRUE, EINA_FALSE);
6102 e_comp_object_dim_client_get(void)
6104 E_Comp_Config *conf = e_comp_config_get();
6106 if (!conf->dim_rect_enable ) return NULL;
6112 _e_comp_object_dim_enable_set(E_Client *ec, Evas_Object *obj, Eina_Bool enable, Eina_Bool noeffect)
6115 char emit[32] = "\0";
6116 E_Comp_Config *conf = e_comp_config_get();
6119 if (!conf->dim_rect_enable) return;
6120 if (!cw->effect_obj) return;
6121 if (enable == cw->dim.enable) return;
6123 ELOGF("COMP", "DIM |set on Client [%d]", ec, enable);
6124 if (noeffect || !conf->dim_rect_effect)
6126 strncpy(emit, (enable ? "e,state,dim,on,noeffect" : "e,state,dim,off,noeffect"), sizeof(emit) - 1);
6130 strncpy(emit, (enable ? "e,state,dim,on" : "e,state,dim,off"), sizeof(emit) - 1);
6133 cw->dim.enable = enable;
6135 if (cw->dim.mask_set && !enable)
6137 e_comp_object_dim_mask_set(cw->ec->frame, enable);
6138 edje_object_signal_emit(cw->effect_obj, emit, "e");
6140 else if (cw->dim.mask_set && enable)
6142 edje_object_signal_emit(cw->effect_obj, emit, "e");
6143 e_comp_object_dim_mask_set(cw->ec->frame, enable);
6147 edje_object_signal_emit(cw->effect_obj, emit, "e");
6152 _e_comp_object_dim_enable_get(E_Client *ec, Evas_Object *obj)
6154 API_ENTRY EINA_FALSE;
6155 E_Comp_Config *conf = e_comp_config_get();
6157 if (!ec) return EINA_FALSE;
6158 if (!conf->dim_rect_enable) return EINA_FALSE;
6160 if (cw->dim.enable) return EINA_TRUE;
6166 _e_comp_object_dim_update(E_Comp_Object *cw)
6168 E_Comp_Config *conf = e_comp_config_get();
6171 if (!conf->dim_rect_enable) return;
6172 if (!cw->effect_obj) return;
6175 edje_object_signal_emit(cw->effect_obj, (cw->dim.enable ? "e,state,dim,on,noeffect" : "e,state,dim,off,noeffect"), "e");
6176 ELOGF("COMP", "DIM |Applied on Client dim.enable[%d]", cw->ec, cw->dim.enable);
6178 if (cw->dim.mask_set)
6180 e_comp_object_dim_mask_set(cw->ec->frame, cw->dim.mask_set);
6186 e_comp_object_clear(Evas_Object *obj)
6190 _e_comp_object_clear(cw);
6194 e_comp_object_hwc_update_exists(Evas_Object *obj)
6196 API_ENTRY EINA_FALSE;
6197 return cw->hwc_need_update;
6202 e_comp_object_hwc_update_set(Evas_Object *obj, Eina_Bool set)
6205 cw->hwc_need_update = set;
6209 e_comp_object_effect_object_part_swallow(Evas_Object *obj, const char *part_name, Evas_Object *swallow_obj)
6211 API_ENTRY EINA_FALSE;
6212 return edje_object_part_swallow(cw->effect_obj, part_name, swallow_obj);
6216 e_comp_object_indicator_swallow(Evas_Object *obj, Evas_Object *indicator)
6219 if (cw->indicator.obj != indicator)
6220 edje_object_part_unswallow(cw->shobj, cw->indicator.obj);
6221 cw->indicator.obj = indicator;
6222 edje_object_part_swallow(cw->shobj, "e.swallow.indicator", indicator);
6226 e_comp_object_indicator_unswallow(Evas_Object *obj, Evas_Object *indicator)
6229 if (cw->indicator.obj != indicator) return;
6230 cw->indicator.obj = NULL;
6231 edje_object_part_unswallow(cw->shobj, indicator);
6235 e_comp_object_indicator_size_set(Evas_Object *obj, int w, int h)
6238 Edje_Message_Int_Set *msg;
6240 if (!cw->indicator.obj) return;
6242 cw->indicator.w = w;
6243 cw->indicator.h = h;
6245 if (!cw->shobj) return;
6247 msg = alloca(sizeof(Edje_Message_Int_Set) + (sizeof(int)));
6251 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT_SET, 0, msg);
6252 edje_object_message_signal_process(cw->shobj);
6255 /* buffer transform and scale are applied to e_comp_object and e_pixmap internaly */
6257 e_comp_object_map_update(Evas_Object *obj)
6260 E_Client *ec = cw->ec;
6261 E_Comp_Wl_Client_Data *cdata;
6263 int x1, y1, x2, y2, x, y, bw, bh, tw, th;
6266 int l, remain = sizeof buffer;
6269 if (e_object_is_del(E_OBJECT(ec))) return;
6270 cdata = e_client_cdata_get(ec);
6273 /* if buffer had been flushed, buffer could be NULL. Then map will be applied
6274 * when new buffer is attached.
6276 if (!cdata->buffer_ref.buffer) return;
6278 if ((!cw->redirected) ||
6279 (e_client_video_hw_composition_check(ec)) ||
6280 (!e_comp_wl_output_buffer_transform_get(ec) &&
6281 cdata->scaler.buffer_viewport.buffer.scale == 1))
6283 if (evas_object_map_enable_get(cw->effect_obj))
6285 ELOGF("TRANSFORM", "map: disable", cw->ec);
6286 evas_object_map_enable_set(cw->effect_obj, EINA_FALSE);
6287 _e_comp_object_map_transform_rect(cw->ec, 0, 0, cw->w, cw->h, NULL, NULL, &tw, &th);
6288 evas_object_resize(cw->effect_obj, tw, th);
6295 EINA_SAFETY_ON_NULL_RETURN(map);
6297 e_pixmap_size_get(ec->pixmap, &bw, &bh);
6303 e_map_util_points_populate_from_geometry(map, ec->x, ec->y, bw, bh, 0);
6305 _e_comp_object_map_transform_pos(ec, x1, y1, &x, &y);
6306 e_map_point_image_uv_set(map, 0, x, y);
6307 l = snprintf(p, remain, "%d,%d", x, y);
6308 p += l, remain -= l;
6310 _e_comp_object_map_transform_pos(ec, x2, y1, &x, &y);
6311 e_map_point_image_uv_set(map, 1, x, y);
6312 l = snprintf(p, remain, " %d,%d", x, y);
6313 p += l, remain -= l;
6315 _e_comp_object_map_transform_pos(ec, x2, y2, &x, &y);
6316 e_map_point_image_uv_set(map, 2, x, y);
6317 l = snprintf(p, remain, " %d,%d", x, y);
6318 p += l, remain -= l;
6320 _e_comp_object_map_transform_pos(ec, x1, y2, &x, &y);
6321 e_map_point_image_uv_set(map, 3, x, y);
6322 l = snprintf(p, remain, " %d,%d", x, y);
6323 p += l, remain -= l;
6325 ELOGF("TRANSFORM", "map: point(%d,%d %dx%d) uv(%d,%d %d,%d %d,%d %d,%d=>%s)",
6327 ec->x, ec->y, bw, bh, x1, y1, x2, y1, x2, y2, x1, y2, buffer);
6329 e_comp_object_map_set(cw->effect_obj, map);
6330 e_comp_object_map_enable_set(cw->effect_obj, EINA_TRUE);
6334 /* if there's screen rotation with comp mode, then ec->effect_obj and
6335 * ec->obj should rotate. if not, in evas_map, update region is clipped.
6337 _e_comp_object_map_transform_rect(cw->ec, 0, 0, bw, bh, NULL, NULL, &tw, &th);
6338 evas_object_resize(cw->effect_obj, tw, th);
6342 e_comp_object_render_trace_set(Evas_Object *obj, Eina_Bool set)
6344 API_ENTRY EINA_FALSE;
6346 cw->render_trace = set;
6352 e_comp_object_native_usable_get(Evas_Object *obj)
6354 API_ENTRY EINA_FALSE;
6355 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6357 if (cw->ec->input_only) return EINA_FALSE;
6358 if (cw->external_content) return EINA_FALSE;
6359 if (e_comp_object_content_type_get(cw->ec->frame) != E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE) return EINA_FALSE;
6361 /* just return true value, if it is normal case */
6362 if (e_pixmap_usable_get(cw->ec->pixmap)) return EINA_TRUE;
6365 Evas_Native_Surface *ns;
6366 ns = evas_object_image_native_surface_get(cw->obj);
6368 /* client pixmap is not usable but cw->obj is drawable due to it holds valid native surface*/
6371 ELOGF("COMP", "Client pixmap is Not usable but still holds valid native surface", cw->ec);
6379 e_comp_object_image_filter_set(Evas_Object *obj, E_Comp_Image_Filter filter)
6381 API_ENTRY EINA_FALSE;
6382 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6383 if (e_object_is_del(E_OBJECT(cw->ec))) return EINA_FALSE;
6384 if (!e_client_cdata_get(cw->ec)) return EINA_FALSE;
6386 if (cw->image_filter == filter) return EINA_TRUE;
6390 case E_COMP_IMAGE_FILTER_BLUR:
6391 efl_gfx_filter_program_set(cw->obj, "blur (20) padding_set (0)", "image_filter");
6393 case E_COMP_IMAGE_FILTER_GRAYSCALE:
6394 efl_gfx_filter_program_set(cw->obj, "grayscale ()", "image_filter");
6396 case E_COMP_IMAGE_FILTER_INVERSE:
6397 efl_gfx_filter_program_set(cw->obj, "inverse_color ()", "image_filter");
6399 case E_COMP_IMAGE_FILTER_NONE:
6401 efl_gfx_filter_program_set(cw->obj, NULL, "image_filter");
6405 cw->image_filter = filter;
6407 wl_signal_emit(&cw->events.image_filter_set, NULL);
6412 EINTERN E_Comp_Image_Filter
6413 e_comp_object_image_filter_get(Evas_Object *obj)
6415 API_ENTRY E_COMP_IMAGE_FILTER_NONE;
6416 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, E_COMP_IMAGE_FILTER_NONE);
6417 if (e_object_is_del(E_OBJECT(cw->ec))) return E_COMP_IMAGE_FILTER_NONE;
6418 if (!e_client_cdata_get(cw->ec)) return E_COMP_IMAGE_FILTER_NONE;
6420 return cw->image_filter;
6424 _e_comp_object_damage_trace_render_pre_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
6428 if (!_damage_trace) return;
6430 EINA_LIST_FREE(_damage_trace_post_objs, obj)
6431 evas_object_del(obj);
6433 _damage_trace_post_objs = NULL;
6437 _e_comp_object_damage_trace_render_post_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
6439 if (!_damage_trace) return;
6441 _damage_trace_post_objs = _damage_trace_objs;
6442 _damage_trace_objs = NULL;
6446 e_comp_object_damage_trace_debug(Eina_Bool onoff)
6448 if (_damage_trace == onoff) return;
6452 evas_event_callback_add(e_comp->evas,
6453 EVAS_CALLBACK_RENDER_PRE,
6454 _e_comp_object_damage_trace_render_pre_cb,
6457 evas_event_callback_add(e_comp->evas,
6458 EVAS_CALLBACK_RENDER_POST,
6459 _e_comp_object_damage_trace_render_post_cb,
6466 EINA_LIST_FREE(_damage_trace_objs, obj)
6467 evas_object_del(obj);
6469 _damage_trace_objs = NULL;
6471 EINA_LIST_FREE(_damage_trace_post_objs, obj)
6472 evas_object_del(obj);
6474 _damage_trace_post_objs = NULL;
6476 evas_event_callback_del(e_comp->evas,
6477 EVAS_CALLBACK_RENDER_PRE,
6478 _e_comp_object_damage_trace_render_pre_cb);
6480 evas_event_callback_del(e_comp->evas,
6481 EVAS_CALLBACK_RENDER_POST,
6482 _e_comp_object_damage_trace_render_post_cb);
6485 _damage_trace = onoff;
6489 e_comp_object_redirected_get(Evas_Object *obj)
6491 API_ENTRY EINA_FALSE;
6492 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6494 return cw->redirected;
6498 e_comp_object_color_visible_get(Evas_Object *obj)
6500 API_ENTRY EINA_FALSE;
6502 return cw->color_visible;
6506 e_comp_object_map_set(Evas_Object *obj, E_Map *em)
6508 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
6510 return e_map_set_to_comp_object(em, obj);
6514 e_comp_object_map_get(const Evas_Object *obj)
6516 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
6518 return e_map_get_from_comp_object(obj);
6522 e_comp_object_map_enable_set(Evas_Object *obj, Eina_Bool enable)
6524 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
6526 evas_object_map_enable_set(obj, enable);
6532 e_comp_object_render_update_lock(Evas_Object *obj)
6534 E_Comp_Wl_Buffer *buffer;
6535 struct wayland_tbm_client_queue *cqueue;
6537 API_ENTRY EINA_FALSE;
6539 if (cw->render_update_lock.lock == 0)
6541 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET, cw->ec);
6543 buffer = e_pixmap_resource_get(cw->ec->pixmap);
6544 if ((buffer) && (buffer->resource))
6546 cqueue = e_comp_wl_tbm_client_queue_get(cw->ec);
6548 wayland_tbm_server_client_queue_flush(cqueue);
6551 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, buffer);
6552 e_comp_object_render_update_del(obj);
6554 ELOGF("COMP", "Render update lock enabled", cw->ec);
6557 cw->render_update_lock.lock++;
6563 e_comp_object_render_update_unlock(Evas_Object *obj)
6567 if (cw->render_update_lock.lock == 0)
6570 cw->render_update_lock.lock--;
6572 if (cw->render_update_lock.lock == 0)
6575 if (cw->render_update_lock.pending_move_set)
6577 evas_object_move(obj,
6578 cw->render_update_lock.pending_move_x,
6579 cw->render_update_lock.pending_move_y);
6580 cw->render_update_lock.pending_move_x = 0;
6581 cw->render_update_lock.pending_move_y = 0;
6582 cw->render_update_lock.pending_move_set = EINA_FALSE;
6585 if (cw->render_update_lock.pending_resize_set)
6587 evas_object_resize(obj,
6588 cw->render_update_lock.pending_resize_w,
6589 cw->render_update_lock.pending_resize_h);
6590 cw->render_update_lock.pending_resize_w = 0;
6591 cw->render_update_lock.pending_resize_h = 0;
6592 cw->render_update_lock.pending_resize_set = EINA_FALSE;
6595 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, NULL);
6597 if ((cw->ec->exp_iconify.buffer_flush) &&
6598 (e_policy_visibility_client_is_iconic(cw->ec)) &&
6599 (cw->ec->comp_data) && (!cw->ec->comp_data->buffer_ref.buffer))
6600 e_comp_object_clear(obj);
6602 e_comp_object_render_update_add(obj);
6604 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_UNSET, cw->ec);
6606 ELOGF("COMP", "Render update lock disabled", cw->ec);
6611 e_comp_object_render_update_lock_get(Evas_Object *obj)
6613 API_ENTRY EINA_FALSE;
6615 if (cw->render_update_lock.lock > 0)
6622 e_comp_object_color_get(Evas_Object *obj, int *r, int *g, int *b, int *a)
6626 if ((cw->transparent.set) || (cw->transparent.setting))
6628 if (r) *r = cw->transparent.user_r;
6629 if (g) *g = cw->transparent.user_g;
6630 if (b) *b = cw->transparent.user_b;
6631 if (a) *a = cw->transparent.user_a;
6635 evas_object_color_get(obj, r, g, b, a);
6640 e_comp_object_render_op_set(Evas_Object *obj, Evas_Render_Op op)
6644 evas_object_render_op_set(cw->obj, op);
6646 wl_signal_emit(&cw->events.render_op_set, NULL);
6649 EINTERN Evas_Render_Op
6650 e_comp_object_render_op_get(Evas_Object *obj)
6652 API_ENTRY EVAS_RENDER_BLEND;
6654 return evas_object_render_op_get(cw->obj);
6658 e_comp_object_lower_listener_add(Evas_Object *obj, struct wl_listener *listener)
6661 wl_signal_add(&cw->events.lower, listener);
6664 #ifdef REFACTOR_DESK_AREA
6666 e_comp_object_lower_done_listener_add(Evas_Object *obj, struct wl_listener *listener)
6669 wl_signal_add(&cw->events.lower_done, listener);
6673 e_comp_object_raise_listener_add(Evas_Object *obj, struct wl_listener *listener)
6676 wl_signal_add(&cw->events.raise, listener);
6681 e_comp_object_show_listener_add(Evas_Object *obj, struct wl_listener *listener)
6684 wl_signal_add(&cw->events.show, listener);
6688 e_comp_object_hide_listener_add(Evas_Object *obj, struct wl_listener *listener)
6691 wl_signal_add(&cw->events.hide, listener);
6694 #ifdef REFACTOR_DESK_AREA
6696 e_comp_object_set_layer_listener_add(Evas_Object *obj, struct wl_listener *listener)
6699 wl_signal_add(&cw->events.set_layer, listener);
6703 e_comp_object_stack_above_listener_add(Evas_Object *obj, struct wl_listener *listener)
6706 wl_signal_add(&cw->events.stack_above, listener);
6710 e_comp_object_stack_below_listener_add(Evas_Object *obj, struct wl_listener *listener)
6713 wl_signal_add(&cw->events.stack_below, listener);
6718 e_comp_object_image_filter_set_listener_add(Evas_Object *obj, struct wl_listener *listener)
6721 wl_signal_add(&cw->events.image_filter_set, listener);
6725 e_comp_object_render_op_set_listener_add(Evas_Object *obj, struct wl_listener *listener)
6728 wl_signal_add(&cw->events.render_op_set, listener);
6732 e_comp_object_content_type_set_listener_add(Evas_Object *obj, struct wl_listener *listener)
6735 wl_signal_add(&cw->events.content_type_set, listener);
6739 e_comp_object_color_set_listener_add(Evas_Object *obj, struct wl_listener *listener)
6742 wl_signal_add(&cw->events.color_set, listener);
6746 e_comp_object_color_visible_set_listener_add(Evas_Object *obj, struct wl_listener *listener)
6749 wl_signal_add(&cw->events.color_visible_set, listener);
6753 e_comp_object_resize_listener_add(Evas_Object *obj, struct wl_listener *listener)
6756 wl_signal_add(&cw->events.resize, listener);