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");
1068 e_comp_object_signal_emit(cw->smart_obj, "e,state,sticky", "e");
1069 /* visibility must always be enabled for re_manage clients to prevent
1070 * pop-in animations every time the user sees a persistent client again;
1071 * applying visibility for iconic clients prevents the client from getting
1074 if (cw->visible || cw->ec->re_manage)
1075 e_comp_object_signal_emit(cw->smart_obj, "e,state,visible", "e");
1077 e_comp_object_signal_emit(cw->smart_obj, "e,state,hidden", "e");
1079 /* breaks animation counter */
1080 if (cw->frame_object)
1082 edje_object_part_swallow(cw->frame_object, "e.swallow.client", cw->obj);
1083 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object);
1084 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object);
1085 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object);
1091 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->obj);
1095 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
1098 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
1100 if (input_rect_data->obj)
1102 pass_event_flag = EINA_TRUE;
1108 if (cw->indicator.obj)
1110 Evas_Object *indicator;
1111 indicator = edje_object_part_swallow_get(cw->shobj, "e.swallow.indicator");
1112 if (indicator != cw->indicator.obj)
1114 edje_object_part_unswallow(cw->shobj, indicator);
1115 edje_object_part_swallow(cw->shobj, "e.swallow.indicator", cw->indicator.obj);
1116 e_comp_object_indicator_size_set(cw->smart_obj, cw->indicator.w, cw->indicator.h);
1120 evas_object_pass_events_set(cw->default_input_obj, pass_event_flag);
1121 evas_object_pass_events_set(cw->obj, pass_event_flag);
1126 /////////////////////////////////////////////
1129 _e_comp_object_animating_begin(E_Comp_Object *cw)
1132 if (cw->animating == 1)
1134 e_comp->animating++;
1136 e_object_ref(E_OBJECT(cw->ec));
1141 _e_comp_object_animating_end(E_Comp_Object *cw)
1150 if (cw->ec->launching)
1152 if (!cw->ec->extra_animating)
1154 ELOGF("COMP", "Un-Set launching flag..", cw->ec);
1155 cw->ec->launching = EINA_FALSE;
1156 if (cw->ec->first_mapped)
1158 ELOGF("LAUNCH", "SHOW real win", cw->ec);
1159 e_comp_object_signal_emit(cw->ec->frame, "e,action,launch_real,done", "e");
1162 e_comp_object_signal_emit(cw->ec->frame, "e,action,launch,done", "e");
1166 e_comp->animating--;
1167 cw->showing = cw->hiding = 0;
1169 if (e_comp->animating == 0)
1170 e_comp_visibility_calculation_set(EINA_TRUE);
1171 /* remove ref from animation start, account for possibility of deletion from unref */
1172 return !!e_object_unref(E_OBJECT(cw->ec));
1178 /* handle the end of a compositor animation */
1180 _e_comp_object_done_defer(void *data, Evas_Object *obj EINA_UNUSED, const char *emission, const char *source EINA_UNUSED)
1182 E_Comp_Object *cw = data;
1184 /* visible clients which have never been sized are a bug */
1185 if ((!cw->ec->new_client) && (!cw->ec->changes.size) && ((cw->w < 0) || (cw->h < 0)) && (!strcmp(emission, "e,action,show,done")))
1186 CRI("ACK! ec:%p", cw->ec);
1187 if (!_e_comp_object_animating_end(cw)) return;
1188 if (cw->animating) return;
1189 /* hide only after animation finishes to guarantee a full run of the animation */
1190 if (!cw->defer_hide) return;
1191 if ((!strcmp(emission, "e,action,hide,done")) ||
1192 (!strcmp(emission, "e,action,done")) ||
1193 ((cw->ec->iconic) && (!strcmp(emission, "e,action,show,done"))))
1195 ELOGF("COMP", "defer hide emission:%s", cw->ec, emission);
1196 evas_object_hide(cw->smart_obj);
1200 /* run a visibility compositor effect if available, return false if object is dead */
1202 _e_comp_object_effect_visibility_start(E_Comp_Object *cw, Eina_Bool state)
1208 if ((!cw->visibility_effect) || (!e_comp_object_effect_allowed_get(cw->smart_obj))) return EINA_TRUE;;
1209 if (!cw->effect_running)
1210 _e_comp_object_animating_begin(cw);
1211 if (!e_comp_object_effect_stop(cw->smart_obj, _e_comp_object_done_defer))
1212 return _e_comp_object_animating_end(cw);
1213 if (!e_comp_object_effect_set(cw->smart_obj, cw->visibility_effect))
1214 return _e_comp_object_animating_end(cw);
1216 evas_pointer_canvas_xy_get(e_comp->evas, &x, &y);
1219 zone = e_comp_zone_find_by_ec(cw->ec);
1221 zw = zone->w, zh = zone->h;
1226 zone = e_comp_object_util_zone_get(cw->smart_obj);
1227 if (!zone) zone = e_zone_current_get();
1234 e_comp_object_effect_params_set(cw->smart_obj, 1, (int[]){cw->x, cw->y,
1235 cw->w, cw->h, zw, zh, x, y}, 8);
1236 e_comp_object_effect_params_set(cw->smart_obj, 0, (int[]){state}, 1);
1237 e_comp_object_effect_start(cw->smart_obj, _e_comp_object_done_defer, cw);
1240 /////////////////////////////////////////////
1242 /* create necessary objects for clients that e manages */
1244 _e_comp_object_mouse_event_callback_set(E_Comp_Object *cw)
1246 if (cw->set_mouse_callbacks) return;
1247 if (!cw->smart_obj) return;
1249 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_IN, _e_comp_object_cb_mouse_in, cw);
1250 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_OUT, _e_comp_object_cb_mouse_out, cw);
1251 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_comp_object_cb_mouse_down, cw);
1252 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_cb_mouse_up, cw);
1253 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_comp_object_cb_mouse_move, cw);
1254 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_WHEEL, _e_comp_object_cb_mouse_wheel, cw);
1256 cw->set_mouse_callbacks = EINA_TRUE;
1260 _e_comp_object_mouse_event_callback_unset(E_Comp_Object *cw)
1262 if (!cw->set_mouse_callbacks) return;
1263 if (!cw->smart_obj) return;
1265 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_IN, _e_comp_object_cb_mouse_in);
1266 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_OUT, _e_comp_object_cb_mouse_out);
1267 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_comp_object_cb_mouse_down);
1268 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_cb_mouse_up);
1269 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_comp_object_cb_mouse_move);
1270 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_WHEEL, _e_comp_object_cb_mouse_wheel);
1272 cw->set_mouse_callbacks = EINA_FALSE;
1276 _e_comp_object_color_visible_set(E_Comp_Object *cw, Eina_Bool set)
1278 if (cw->color_visible == set) return EINA_TRUE;
1280 cw->color_visible = set;
1282 ELOGF("COMP", "color_visible set:%d", cw->ec, set);
1284 wl_signal_emit(&cw->events.color_visible_set, NULL);
1290 _e_comp_object_color_visible_update(E_Comp_Object *cw)
1294 e_comp_object_color_get(cw->smart_obj, NULL, NULL, NULL, &a);
1297 _e_comp_object_color_visible_set(cw, EINA_FALSE);
1303 evas_object_color_get(cw->effect_obj, NULL, NULL, NULL, &a);
1306 _e_comp_object_color_visible_set(cw, EINA_FALSE);
1314 evas_object_color_get(cw->shobj, NULL, NULL, NULL, &a);
1317 _e_comp_object_color_visible_set(cw, EINA_FALSE);
1324 evas_object_color_get(cw->obj, NULL, NULL, NULL, &a);
1327 _e_comp_object_color_visible_set(cw, EINA_FALSE);
1332 _e_comp_object_color_visible_set(cw, EINA_TRUE);
1336 _e_comp_intercept_effect_obj_color_set(void *data, Evas_Object *obj, int r, int g, int b, int a)
1338 E_Comp_Object *cw = data;
1340 evas_object_color_set(obj, r, g, b, a);
1342 _e_comp_object_color_visible_update(cw);
1346 _e_comp_intercept_shobj_color_set(void *data, Evas_Object *obj, int r, int g, int b, int a)
1348 E_Comp_Object *cw = data;
1350 evas_object_color_set(obj, r, g, b, a);
1352 _e_comp_object_color_visible_update(cw);
1356 _e_comp_intercept_obj_color_set(void *data, Evas_Object *obj, int r, int g, int b, int a)
1358 E_Comp_Object *cw = data;
1360 evas_object_color_set(obj, r, g, b, a);
1362 _e_comp_object_color_visible_update(cw);
1366 _e_comp_object_setup(E_Comp_Object *cw)
1368 cw->clip = evas_object_rectangle_add(e_comp->evas);
1369 evas_object_move(cw->clip, -9999, -9999);
1370 evas_object_resize(cw->clip, 999999, 999999);
1371 evas_object_smart_member_add(cw->clip, cw->smart_obj);
1372 cw->effect_obj = edje_object_add(e_comp->evas);
1373 evas_object_move(cw->effect_obj, cw->x, cw->y);
1374 evas_object_clip_set(cw->effect_obj, cw->clip);
1375 evas_object_smart_member_add(cw->effect_obj, cw->smart_obj);
1376 evas_object_intercept_color_set_callback_add(cw->effect_obj, _e_comp_intercept_effect_obj_color_set, cw);
1377 e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", "e/comp/effects/none");
1378 cw->shobj = edje_object_add(e_comp->evas);
1379 evas_object_data_set(cw->shobj, "comp_smart_obj", cw->smart_obj);
1380 edje_object_part_swallow(cw->effect_obj, "e.swallow.content", cw->shobj);
1381 edje_object_signal_callback_add(cw->shobj, "e,action,*,done", "e", _e_comp_object_done_defer, cw);
1382 evas_object_intercept_color_set_callback_add(cw->shobj, _e_comp_intercept_shobj_color_set, cw);
1384 /* name objects appropriately for nicer printing when using e_comp_util_wins_print() */
1385 if (cw->ec->override)
1387 evas_object_name_set(cw->shobj, "cw->shobj::WINDOW");
1388 evas_object_name_set(cw->effect_obj, "cw->effect_obj::WINDOW");
1389 evas_object_name_set(cw->clip, "cw->clip::WINDOW");
1391 else if (!cw->ec->input_only)
1393 evas_object_name_set(cw->shobj, "cw->shobj::CLIENT");
1394 evas_object_name_set(cw->effect_obj, "cw->effect_obj::CLIENT");
1395 evas_object_name_set(cw->clip, "cw->clip::CLIENT");
1397 cw->real_hid = !cw->ec->input_only;
1398 if (!cw->ec->input_only)
1400 e_util_size_debug_set(cw->effect_obj, 1);
1401 _e_comp_object_mouse_event_callback_set(cw);
1404 cw->default_input_obj = evas_object_rectangle_add(e_comp->evas);
1405 evas_object_name_set(cw->default_input_obj, "cw->default_input_obj");
1406 evas_object_move(cw->default_input_obj, cw->x, cw->y);
1407 evas_object_resize(cw->default_input_obj, cw->w, cw->h);
1408 evas_object_color_set(cw->default_input_obj, 0, 0, 0, 0);
1409 evas_object_smart_member_add(cw->default_input_obj, cw->smart_obj);
1411 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_OBJECT_SETUP, cw->ec);
1414 /////////////////////////////////////////////
1416 /* for fast path evas rendering; only called during render */
1418 _e_comp_object_pixels_get(void *data, Evas_Object *obj EINA_UNUSED)
1420 E_Comp_Object *cw = data;
1421 E_Client *ec = cw->ec;
1423 int bx, by, bxx, byy;
1425 if (e_object_is_del(E_OBJECT(ec))) return;
1426 if (cw->external_content) return;
1427 if (!e_pixmap_size_get(ec->pixmap, &pw, &ph)) return;
1428 e_pixmap_image_opaque_get(cw->ec->pixmap, &bx, &by, &bxx, &byy);
1431 bxx = pw - (bx + bxx), byy = ph - (by + byy);
1432 evas_object_image_border_set(cw->obj, bx, bxx, by, byy);
1434 else if (cw->client_inset.calc && (!cw->frame_object)) //CSD
1436 bx = -cw->client_inset.l + 4, by = -cw->client_inset.t + 4;
1437 bxx = -cw->client_inset.r, byy = -cw->client_inset.b;
1441 bx = by = bxx = byy = 0;
1442 evas_object_image_border_set(cw->obj, bx, bxx, by, byy);
1445 Edje_Message_Int_Set *msg;
1446 Edje_Message_Int msg2;
1447 Eina_Bool id = (bx || by || bxx || byy);
1449 msg = alloca(sizeof(Edje_Message_Int_Set) + (sizeof(int) * 3));
1455 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT_SET, 1, msg);
1457 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT, 0, &msg2);
1461 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
1462 e_comp_client_post_update_add(cw->ec);
1464 else if (e_comp_object_render(ec->frame))
1466 /* apply shape mask if necessary */
1467 if ((!cw->native) && (ec->shaped))
1468 e_comp_object_shape_apply(ec->frame);
1470 /* shaped clients get precise mouse events to handle transparent pixels */
1471 evas_object_precise_is_inside_set(cw->obj, ec->shaped);
1473 /* queue another render if client is still dirty; cannot refresh here. */
1474 if (e_pixmap_dirty_get(ec->pixmap) && e_pixmap_size_get(ec->pixmap, &pw, &ph))
1475 e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
1477 if (cw->render_trace)
1479 _e_comp_object_event_simple(ec->frame, E_EVENT_COMP_OBJECT_IMG_RENDER);
1485 _e_comp_object_pixels_noti(void *data, Evas_Object *obj EINA_UNUSED)
1487 E_Comp_Object *cw = data;
1488 E_Client *ec = cw->ec;
1490 if (e_object_is_del(E_OBJECT(ec))) return;
1491 if (cw->external_content) return;
1492 if (!e_comp->hwc) return;
1494 e_comp_client_render_list_add(cw->ec);
1496 if (!ec->hwc_window) return;
1498 e_hwc_windows_rendered_window_add(ec->hwc_window);
1501 /////////////////////////////////////////////
1504 _e_comp_intercept_move(void *data, Evas_Object *obj, int x, int y)
1506 E_Comp_Object *cw = data;
1509 if (cw->render_update_lock.lock)
1511 cw->render_update_lock.pending_move_x = x;
1512 cw->render_update_lock.pending_move_y = y;
1513 cw->render_update_lock.pending_move_set = EINA_TRUE;
1517 if ((e_pixmap_type_get(cw->ec->pixmap) != E_PIXMAP_TYPE_EXT_OBJECT) &&
1518 (e_pixmap_usable_get(cw->ec->pixmap)) &&
1519 (cw->external_content))
1521 /* delay to move until the external content is unset */
1522 cw->ec->changes.pos = 1;
1527 if (cw->ec->move_after_resize)
1529 if ((x != cw->ec->x) || (y != cw->ec->y))
1531 if (!cw->ec->is_cursor)
1532 ELOGF("COMP", "Set Pos to (%d,%d). current ec_pos(%d,%d)", cw->ec, x, y, cw->ec->x, cw->ec->y);
1533 e_client_pos_set(cw->ec, x, y);
1534 cw->ec->changes.pos = 1;
1540 if ((cw->ec->resize_mode == E_POINTER_RESIZE_NONE) &&
1541 (cw->ec->manage_resize.resize_obj))
1543 e_client_pos_set(cw->ec, x, y);
1544 cw->ec->client.x = x + cw->client_inset.l;
1545 cw->ec->client.y = y + cw->client_inset.t;
1546 e_policy_visibility_client_defer_move(cw->ec);
1550 /* if frame_object does not exist, client_inset indicates CSD.
1551 * this means that ec->client matches cw->x/y, the opposite
1554 fx = (!cw->frame_object) * cw->client_inset.l;
1555 fy = (!cw->frame_object) * cw->client_inset.t;
1556 if ((cw->x == x + fx) && (cw->y == y + fy))
1558 if ((cw->ec->x != x) || (cw->ec->y != y))
1560 /* handle case where client tries to move to position and back very quickly */
1561 e_client_pos_set(cw->ec, x, y);
1562 cw->ec->client.x = x + cw->client_inset.l;
1563 cw->ec->client.y = y + cw->client_inset.t;
1567 if (!cw->ec->maximize_override)
1569 /* prevent moving in some directions while directionally maximized */
1570 if ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL)
1572 if ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_HORIZONTAL)
1575 ix = x + cw->client_inset.l;
1576 iy = y + cw->client_inset.t;
1577 if (cw->ec->maximized && (!cw->ec->maximize_override) && ((cw->ec->x != x) || (cw->ec->y != y)) &&
1578 ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) != E_MAXIMIZE_VERTICAL) &&
1579 ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) != E_MAXIMIZE_HORIZONTAL))
1581 /* prevent moving at all if move isn't allowed in current maximize state */
1582 if ((!e_config->allow_manip) && ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH)) return;
1583 /* queue unmaximize if we are allowing move and update unmaximize geometry */
1586 zone = e_comp_zone_find_by_ec(cw->ec);
1589 cw->ec->changes.need_unmaximize = 1;
1590 cw->ec->saved.x = ix - zone->x;
1591 cw->ec->saved.y = iy - zone->y;
1592 cw->ec->saved.w = cw->ec->client.w;
1593 cw->ec->saved.h = cw->ec->client.h;
1597 /* only update during resize if triggered by resize */
1598 if (e_client_util_resizing_get(cw->ec) && (!cw->force_move)) return;
1599 /* delay to move while surface waits paired commit serial*/
1600 if (e_client_pending_geometry_has(cw->ec))
1602 /* do nothing while waiting paired commit serial*/
1606 e_client_pos_set(cw->ec, x, y);
1607 if (cw->ec->new_client)
1609 /* don't actually do anything until first client idler loop */
1610 cw->ec->placed = ((!cw->ec->dialog) && (!cw->ec->parent));
1611 cw->ec->changes.pos = 1;
1616 /* only update xy position of client to avoid invalid
1617 * first damage region if it is not a new_client. */
1618 cw->ec->client.x = ix;
1619 cw->ec->client.y = iy;
1622 if (!cw->frame_object)
1624 evas_object_move(obj, x, y);
1629 _e_comp_intercept_resize(void *data, Evas_Object *obj, int w, int h)
1631 E_Comp_Object *cw = data;
1632 int pw = 0, ph = 0, fw, fh, iw, ih, prev_w, prev_h, x, y;
1635 if (cw->render_update_lock.lock)
1637 cw->render_update_lock.pending_resize_w = w;
1638 cw->render_update_lock.pending_resize_h = h;
1639 cw->render_update_lock.pending_resize_set = EINA_TRUE;
1643 if (!e_util_strcmp("input_panel_surface", cw->ec->icccm.window_role))
1645 e_client_size_set(cw->ec, w, h);
1646 evas_object_resize(obj, w, h);
1650 /* if frame_object does not exist, client_inset indicates CSD.
1651 * this means that ec->client matches cw->w/h, the opposite
1654 fw = (!cw->frame_object) * (-cw->client_inset.l - cw->client_inset.r);
1655 fh = (!cw->frame_object) * (-cw->client_inset.t - cw->client_inset.b);
1656 if ((cw->w == w + fw) && (cw->h == h + fh))
1658 if (((cw->ec->w != w) || (cw->ec->h != h)) ||
1659 (cw->ec->client.w != w - cw->client_inset.l - cw->client_inset.r) ||
1660 (cw->ec->client.h != h - cw->client_inset.t - cw->client_inset.b))
1662 /* handle case where client tries to resize itself and back very quickly */
1663 e_client_size_set(cw->ec, w, h);
1664 cw->ec->client.w = w - cw->client_inset.l - cw->client_inset.r;
1665 cw->ec->client.h = h - cw->client_inset.t - cw->client_inset.b;
1666 evas_object_smart_callback_call(obj, "client_resize", NULL);
1670 /* guarantee that fullscreen is fullscreen */
1671 zone = e_comp_zone_find_by_ec(cw->ec);
1673 if (cw->ec->fullscreen && ((w != zone->w) || (h != zone->h)))
1675 if (!e_client_transform_core_enable_get(cw->ec))
1678 /* calculate client size */
1679 iw = w - cw->client_inset.l - cw->client_inset.r;
1680 ih = h - cw->client_inset.t - cw->client_inset.b;
1681 if (cw->ec->maximized && (!cw->ec->maximize_override) && ((cw->ec->w != w) || (cw->ec->h != h)))
1683 /* prevent resizing while maximized depending on direction and config */
1684 if ((!e_config->allow_manip) && ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH)) return;
1686 Eina_Bool reject = EINA_FALSE;
1687 if (cw->ec->maximized & E_MAXIMIZE_VERTICAL)
1689 if (cw->ec->client.h != ih)
1691 cw->ec->saved.h = ih;
1692 cw->ec->saved.y = cw->ec->client.y - zone->y;
1693 reject = cw->ec->changes.need_unmaximize = 1;
1696 if (cw->ec->maximized & E_MAXIMIZE_HORIZONTAL)
1698 if (cw->ec->client.w != iw)
1700 cw->ec->saved.w = iw;
1701 cw->ec->saved.x = cw->ec->client.x - zone->x;
1702 reject = cw->ec->changes.need_unmaximize = 1;
1711 if (cw->ec->new_client || (!cw->ec->visible) || (!cw->effect_obj))
1713 /* do nothing until client idler loops */
1714 if ((cw->ec->w != w) || (cw->ec->h != h))
1716 e_client_size_set(cw->ec, w, h);
1717 cw->ec->changes.size = 1;
1722 if (e_client_pending_geometry_has(cw->ec))
1724 /* do nothing while waiting paired commit serial*/
1728 e_client_size_set(cw->ec, w, h);
1730 cw->ec->client.w = iw;
1731 cw->ec->client.h = ih;
1732 if ((cw->ec->client.w < 0) || (cw->ec->client.h < 0)) CRI("WTF. ec:%p", cw->ec);
1734 /* The size of non-compositing window can be changed, so there is a
1735 * need to check that cw is H/W composited if cw is not redirected.
1736 * And of course we have to change size of evas object of H/W composited cw,
1737 * otherwise cw can't receive input events even if it is shown on the screen.
1739 Eina_Bool redirected = cw->redirected;
1741 redirected = e_comp_is_on_overlay(cw->ec);
1743 if ((!cw->ec->input_only) && (redirected) &&
1744 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE) &&
1745 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE) &&
1746 (e_pixmap_dirty_get(cw->ec->pixmap) ||
1747 (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph))))
1750 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE ||
1751 cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE)
1753 prev_w = cw->w, prev_h = cw->h;
1754 e_comp_object_frame_wh_adjust(obj, 0, 0, &fw, &fh);
1755 /* check shading and clamp to pixmap size for regular clients */
1756 if ((!cw->ec->input_only) && (!cw->ec->override) &&
1757 (((w - fw != pw) || (h - fh != ph))))
1759 //INF("CALLBACK: REQ(%dx%d) != CUR(%dx%d)", w - fw, h - fh, pw, ph);
1760 evas_object_smart_callback_call(obj, "client_resize", NULL);
1762 if (cw->frame_object || cw->ec->input_only)
1763 e_comp_object_frame_wh_adjust(obj, pw, ph, &w, &h);
1766 if ((cw->w == w) && (cw->h == h))
1768 /* going to be a noop resize which won't trigger smart resize */
1769 RENDER_DEBUG("DAMAGE RESIZE(%p): %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
1770 if (cw->updates) eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
1772 evas_object_resize(obj, w, h);
1776 evas_object_smart_callback_call(obj, "client_resize", NULL);
1779 if ((!cw->frame_object) && (!cw->ec->input_only))
1781 /* "just do it" for overrides */
1782 evas_object_resize(obj, w, h);
1784 if (!cw->ec->override)
1786 /* shape probably changed for non-overrides */
1791 /* this fixes positioning jiggles when using a resize mode
1792 * which also changes the client's position
1795 if (cw->frame_object)
1796 x = cw->x, y = cw->y;
1798 x = cw->ec->x, y = cw->ec->y;
1799 switch (cw->ec->resize_mode)
1801 case E_POINTER_RESIZE_BL:
1802 case E_POINTER_RESIZE_L:
1803 evas_object_move(obj, x + prev_w - cw->w, y);
1805 case E_POINTER_RESIZE_TL:
1806 evas_object_move(obj, x + prev_w - cw->w, y + prev_h - cw->h);
1808 case E_POINTER_RESIZE_T:
1809 case E_POINTER_RESIZE_TR:
1810 evas_object_move(obj, x, y + prev_h - cw->h);
1819 _e_comp_intercept_layer_set(void *data, Evas_Object *obj, int layer)
1821 #ifdef REFACTOR_DESK_AREA
1822 E_Comp_Object *cw = data;
1823 E_Comp_Object_Data_Set_Layer layer_set_data;
1825 layer_set_data.cw = cw;
1826 layer_set_data.layer = layer;
1828 wl_signal_emit(&cw->events.set_layer, &layer_set_data);
1832 e_comp_render_queue();
1833 e_comp_object_transform_obj_stack_update(obj);
1837 E_Comp_Object *cw = data;
1838 E_Comp_Wl_Client_Data *child_cdata;
1839 unsigned int l = e_comp_canvas_layer_map(layer);
1842 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
1844 /* doing a compositor effect, follow directions */
1845 _e_comp_object_layer_set(obj, layer);
1846 if (layer == cw->ec->layer) //trying to put layer back
1850 /* if ec->layer and layer are the same but the client is not belong to the given(l)
1851 that means, layer is changed during layer_pending. in this case, need to update layer inlist*/
1852 if (cw->layer != l) goto layer_set;
1856 e_comp_render_queue();
1858 ec = e_client_above_get(cw->ec);
1859 /* skip subsurface: stacking subsurface is handled by e_comp_wl */
1860 while ((ec) && (e_comp_wl_subsurface_check(ec)))
1861 ec = e_client_above_get(ec);
1862 if (ec && (evas_object_layer_get(ec->frame) != evas_object_layer_get(obj)))
1864 ec = e_client_below_get(cw->ec);
1865 /* skip subsurface: stacking subsurface is handled by e_comp_wl */
1866 while ((ec) && (e_comp_wl_subsurface_check(ec)))
1867 ec = e_client_below_get(ec);
1868 if (ec && (evas_object_layer_get(ec->frame) == evas_object_layer_get(cw->smart_obj)))
1870 evas_object_stack_above(obj, ec->frame);
1875 if (ec && (cw->ec->parent == ec))
1877 if (e_client_transient_policy_get(cw->ec) == E_TRANSIENT_ABOVE)
1878 evas_object_stack_above(obj, ec->frame);
1880 evas_object_stack_below(obj, ec->frame);
1883 evas_object_stack_below(obj, ec ? ec->frame : e_comp->layers[cw->layer].obj);
1889 if (cw->layer == l) return;
1890 if (e_comp_canvas_client_layer_map(layer) == 9999)
1891 return; //invalid layer for clients not doing comp effects
1892 if (cw->ec->fullscreen)
1894 cw->ec->saved.layer = layer;
1897 oldraise = e_config->transient.raise;
1899 /* clamp to valid client layer */
1900 layer = e_comp_canvas_client_layer_map_nearest(layer);
1901 cw->ec->layer = layer;
1902 e_client_input_thread_layer_set(cw->ec, layer);
1903 if (e_config->transient.layer)
1906 Eina_List *list = eina_list_clone(cw->ec->transients);
1908 /* We need to set raise to one, else the child wont
1909 * follow to the new layer. It should be like this,
1910 * even if the user usually doesn't want to raise
1913 e_config->transient.raise = 1;
1914 EINA_LIST_FREE(list, child)
1916 child_cdata = e_client_cdata_get(child);
1917 if (child_cdata && !child_cdata->mapped)
1919 ELOGF("COMP", "LAYER_SET CHILD. BUT not mapped. skip. child(ec:%p, win:0x%08zx)", cw->ec, child, e_client_util_win_get(child));
1922 e_client_layer_set(child, layer);
1926 e_config->transient.raise = oldraise;
1928 _e_comp_object_layers_remove(cw);
1929 cw->layer = e_comp_canvas_layer_map(layer);
1930 _e_comp_object_layers_add(cw, NULL, NULL, 0);
1931 //if (cw->ec->new_client)
1932 //INF("CLIENT STACKED %p: %u", cw->ec, layer);
1933 _e_comp_object_layer_set(obj, layer);
1934 if (!e_comp->layers[cw->layer].obj) return; //this is a layer marker
1935 evas_object_stack_below(obj, e_comp->layers[cw->layer].obj);
1936 if (evas_object_below_get(obj) == e_comp->layers[cw->layer].obj)
1938 /* can't stack a client above its own layer marker */
1939 CRI("STACKING ERROR!!! ec:%p (cw->layer:%d, ec->layer:%d)", cw->ec, cw->layer, cw->ec->layer);
1941 if (!cw->visible) return;
1942 e_comp_render_queue();
1943 _e_comp_object_transform_obj_stack_update(obj);
1947 #ifdef REFACTOR_DESK_AREA
1949 typedef void (*E_Comp_Object_Stack_Func)(Evas_Object *obj, Evas_Object *stack);
1952 #ifdef REFACTOR_DESK_AREA
1954 e_comp_object_raise(Evas_Object *obj)
1957 _e_comp_object_raise(Evas_Object *obj)
1960 evas_object_raise(obj);
1962 if (evas_object_smart_smart_get(obj))
1964 E_Client *ec = e_comp_object_client_get(obj);
1966 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
1970 #ifdef REFACTOR_DESK_AREA
1972 e_comp_object_lower(E_Comp_Object *cw, Evas_Object *obj)
1975 _e_comp_object_lower(E_Comp_Object *cw, Evas_Object *obj)
1978 evas_object_lower(obj);
1980 if (evas_object_smart_smart_get(obj))
1982 E_Client *ec = e_comp_object_client_get(obj);
1985 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
1986 #ifdef REFACTOR_DESK_AREA
1987 wl_signal_emit(&cw->events.lower_done, NULL);
1989 wl_signal_emit(&cw->events.lower, NULL);
1995 #ifdef REFACTOR_DESK_AREA
1997 e_comp_object_stack_above(Evas_Object *obj, Evas_Object *target)
2000 _e_comp_object_stack_above(Evas_Object *obj, Evas_Object *target)
2003 evas_object_stack_above(obj, target);
2005 if (evas_object_smart_smart_get(obj))
2007 E_Client *ec = e_comp_object_client_get(obj);
2009 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2013 #ifdef REFACTOR_DESK_AREA
2015 e_comp_object_stack_below(Evas_Object *obj, Evas_Object *target)
2018 _e_comp_object_stack_below(Evas_Object *obj, Evas_Object *target)
2021 evas_object_stack_below(obj, target);
2023 if (evas_object_smart_smart_get(obj))
2025 E_Client *ec = e_comp_object_client_get(obj);
2027 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2031 #ifdef REFACTOR_DESK_AREA
2033 e_comp_object_layer_set(Evas_Object *obj, short layer)
2036 _e_comp_object_layer_set(Evas_Object *obj, short layer)
2039 evas_object_layer_set(obj, layer);
2041 if (evas_object_smart_smart_get(obj))
2043 E_Client *ec = e_comp_object_client_get(obj);
2045 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_LAYER_SET, ec);
2049 #ifdef REFACTOR_DESK_AREA
2052 _e_comp_object_is_pending(E_Client *ec)
2056 if (!ec) return EINA_FALSE;
2058 topmost = e_comp_wl_topmost_parent_get(ec);
2060 return (topmost) ? topmost->layer_pending : EINA_FALSE;
2064 _e_comp_intercept_stack_helper(E_Comp_Object *cw, Evas_Object *stack, E_Comp_Object_Stack_Func stack_cb)
2066 E_Comp_Object *cw2 = NULL;
2069 Evas_Object *o = stack;
2070 #ifdef REFACTOR_DESK_AREA
2071 Eina_Bool raising = stack_cb == e_comp_object_stack_above;
2073 Eina_Bool raising = stack_cb == _e_comp_object_stack_above;
2076 /* We should consider topmost's layer_pending for subsurface */
2077 if ((cw->ec->layer_block) || _e_comp_object_is_pending(cw->ec))
2079 if (_e_comp_object_is_pending(cw->ec))
2080 e_comp_object_layer_update(cw->smart_obj,
2081 raising? stack : NULL,
2082 raising? NULL : stack);
2084 /* obey compositor effects! */
2085 if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
2086 evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
2087 stack_cb(cw->smart_obj, stack);
2088 if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
2089 evas_object_data_del(cw->smart_obj, "client_restack");
2093 cw2 = evas_object_data_get(o, "comp_obj");
2095 /* assume someone knew what they were doing during client init */
2096 if (cw->ec->new_client)
2097 layer = cw->ec->layer;
2098 else if ((cw2) && _e_comp_object_is_pending(cw2->ec))
2099 layer = cw2->ec->layer;
2101 layer = evas_object_layer_get(stack);
2102 ecstack = e_client_below_get(cw->ec);
2103 if (layer != e_comp_canvas_layer_map_to(cw->layer))
2105 evas_object_layer_set(cw->smart_obj, layer);
2106 /* we got our layer wrangled, return now! */
2107 if (layer != e_comp_canvas_layer_map_to(cw->layer)) return;
2110 /* check if we're stacking below another client */
2113 /* check for non-client layer object */
2114 if (!e_util_strcmp(evas_object_name_get(o), "layer_obj"))
2116 /* find an existing client to use for layering
2117 * by walking up the object stack
2119 * this is guaranteed to be pretty quick since we'll either:
2120 * - run out of client layers
2121 * - find a stacking client
2123 o = evas_object_above_get(o);
2124 if ((!o) || (o == cw->smart_obj)) break;
2125 if (evas_object_layer_get(o) != layer)
2127 /* reached the top client layer somehow
2128 * use top client object
2130 o = e_comp->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR)].obj;
2133 /* top client layer window hasn't been stacked yet. this probably shouldn't happen?
2134 * return here since the top client layer window
2139 ec = e_client_top_get();
2144 if (o) cw2 = evas_object_data_get(o, "comp_obj");
2147 if (cw2 && cw->layer != cw2->layer)
2150 /* remove existing layers */
2151 _e_comp_object_layers_remove(cw);
2154 if (o == stack) //if stacking above, cw2 is above; else cw2 is below
2155 _e_comp_object_layers_add(cw, raising ? cw2 : NULL, raising ? NULL : cw2, 0);
2156 else if (o == cw->smart_obj) //prepend (lower) if not stacking above
2157 _e_comp_object_layers_add(cw, NULL, NULL, !raising);
2158 else //if no stacking objects found, either raise or lower
2159 _e_comp_object_layers_add(cw, raising ? NULL : cw2, raising ? cw2 : NULL, 0);
2162 _e_comp_object_layers_add(cw, NULL, NULL, 0);
2164 /* find new object for stacking if cw2 is on state of layer_pending */
2165 if ((cw2) && _e_comp_object_is_pending(cw2->ec))
2167 E_Client *new_stack = NULL, *current_ec = NULL;
2168 current_ec = cw2->ec;
2171 while ((new_stack = e_client_below_get(current_ec)))
2173 current_ec = new_stack;
2174 if (new_stack == cw->ec) continue;
2175 if (new_stack->layer != cw2->ec->layer) break;
2176 if (!_e_comp_object_is_pending(new_stack)) break;
2178 if ((new_stack) && (new_stack->layer == cw2->ec->layer))
2179 stack = new_stack->frame;
2182 /* stack it above layer object */
2184 below_layer = (cw2->layer <= 0)? 0 : cw2->layer - 1 ;
2185 stack = e_comp->layers[below_layer].obj;
2190 while ((new_stack = e_client_above_get(current_ec)))
2192 current_ec = new_stack;
2193 if (new_stack == cw->ec) continue;
2194 if (new_stack->layer != cw2->ec->layer) break;
2195 if (!_e_comp_object_is_pending(new_stack)) break;
2197 if ((new_stack) && (new_stack->layer == cw2->ec->layer))
2198 stack = new_stack->frame;
2200 stack = e_comp->layers[cw2->layer].obj;
2204 /* set restack if stacking has changed */
2205 if (cw->ec->new_client || (!ecstack) || (ecstack->frame != o))
2206 evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
2207 stack_cb(cw->smart_obj, stack);
2208 if (e_comp->layers[cw->layer].obj)
2209 if (evas_object_below_get(cw->smart_obj) == e_comp->layers[cw->layer].obj)
2211 CRI("STACKING ERROR!!! ec:%p (cw->layer:%d, ec->layer:%d)", cw->ec, cw->layer, cw->ec->layer);
2213 if (cw->ec->new_client || (!ecstack) || (ecstack->frame != o))
2214 evas_object_data_del(cw->smart_obj, "client_restack");
2215 if (!cw->visible) return;
2216 e_comp_render_queue();
2221 _e_comp_intercept_stack_above(void *data, Evas_Object *obj, Evas_Object *above)
2223 EINA_SAFETY_ON_TRUE_RETURN(obj == above);
2225 TRACE_DS_BEGIN(COMP:INTERCEPT STACK ABOVE);
2227 #ifdef REFACTOR_DESK_AREA
2228 E_Comp_Object *cw = data;
2229 E_Comp_Object_Data_Stack_Above stack_above_data;
2231 stack_above_data.cw = cw;
2232 stack_above_data.above_obj = above;
2234 wl_signal_emit(&cw->events.stack_above, &stack_above_data);
2236 if (evas_object_below_get(obj) == above)
2238 e_comp_object_layer_update(obj, above, NULL);
2242 _e_comp_intercept_stack_helper(data, above, _e_comp_object_stack_above);
2244 _e_comp_object_transform_obj_stack_update(obj);
2245 _e_comp_object_transform_obj_stack_update(above);
2252 _e_comp_intercept_stack_below(void *data, Evas_Object *obj, Evas_Object *below)
2254 EINA_SAFETY_ON_TRUE_RETURN(obj == below);
2256 TRACE_DS_BEGIN(COMP:INTERCEPT STACK BELOW);
2258 #ifdef REFACTOR_DESK_AREA
2259 E_Comp_Object *cw = data;
2260 E_Comp_Object_Data_Stack_Below stack_below_data;
2262 stack_below_data.cw = cw;
2263 stack_below_data.below_obj = below;
2265 wl_signal_emit(&cw->events.stack_below, &stack_below_data);
2268 e_comp_render_queue();
2270 if (evas_object_above_get(obj) == below)
2272 e_comp_object_layer_update(obj, NULL, below);
2276 _e_comp_intercept_stack_helper(data, below, _e_comp_object_stack_below);
2278 if (evas_object_smart_smart_get(obj))
2279 _e_comp_object_transform_obj_stack_update(obj);
2280 if (evas_object_smart_smart_get(below))
2281 _e_comp_object_transform_obj_stack_update(below);
2288 _e_comp_intercept_lower(void *data, Evas_Object *obj)
2290 E_Comp_Object *cw = data;
2292 #ifdef REFACTOR_DESK_AREA
2297 TRACE_DS_BEGIN(COMP:INTERCEPT LOWER);
2299 #ifdef REFACTOR_DESK_AREA
2300 wl_signal_emit(&cw->events.lower, cw);
2302 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
2304 if (cw->ec->layer_pending)
2305 e_comp_object_layer_update(obj, NULL, obj);
2307 #ifdef REFACTOR_DESK_AREA
2308 e_comp_object_lower(cw, obj);
2310 _e_comp_object_lower(cw, obj);
2314 if (!EINA_INLIST_GET(cw->ec)->prev) goto end; //already lowest on layer
2315 o = evas_object_below_get(obj);
2316 _e_comp_object_layers_remove(cw);
2317 /* prepend to client list since this client should be the first item now */
2318 _e_comp_object_layers_add(cw, NULL, NULL, 1);
2319 if (evas_object_layer_get(o) != evas_object_layer_get(obj)) goto end; //already at bottom!
2320 evas_object_data_set(obj, "client_restack", (void*)1);
2321 #ifdef REFACTOR_DESK_AREA
2322 e_comp_object_lower(cw, obj);
2324 _e_comp_object_lower(cw, obj);
2326 evas_object_data_del(obj, "client_restack");
2327 if (!cw->visible) goto end;
2328 e_comp_render_queue();
2329 #ifdef REFACTOR_DESK_AREA
2330 e_comp_object_transform_obj_stack_update(obj);
2332 _e_comp_object_transform_obj_stack_update(obj);
2341 _e_comp_intercept_raise(void *data, Evas_Object *obj)
2343 E_Comp_Object *cw = data;
2344 #ifdef REFACTOR_DESK_AREA
2350 TRACE_DS_BEGIN(COMP:INTERCEPT RAISE);
2352 #ifdef REFACTOR_DESK_AREA
2353 wl_signal_emit(&cw->events.raise, cw);
2355 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
2357 if (cw->ec->layer_pending)
2359 int obj_layer = evas_object_layer_get(obj);
2360 if (cw->ec->layer != obj_layer)
2361 e_comp_object_layer_update(obj, NULL, NULL);
2363 #ifdef REFACTOR_DESK_AREA
2364 e_comp_object_raise(obj);
2366 _e_comp_object_raise(obj);
2370 if (!EINA_INLIST_GET(cw->ec)->next) goto end;//already highest on layer
2371 o = evas_object_above_get(obj);
2372 if (evas_object_layer_get(o) != evas_object_layer_get(obj)) goto end; //already at top!
2374 /* still stack below override below the layer marker */
2375 for (op = o = e_comp->layers[cw->layer].obj;
2376 o && o != e_comp->layers[cw->layer - 1].obj;
2377 op = o, o = evas_object_below_get(o))
2379 if (evas_object_smart_smart_get(o))
2383 ec = e_comp_object_client_get(o);
2384 if (ec && (!ec->override)) break;
2387 #ifdef REFACTOR_DESK_AREA
2388 e_comp_object_stack_below(obj, op);
2390 _e_comp_object_stack_below(obj, op);
2392 e_client_focus_defer_set(cw->ec);
2394 if (!cw->visible) goto end;
2395 e_comp_render_queue();
2396 #ifdef REFACTOR_DESK_AREA
2397 e_comp_object_transform_obj_stack_update(obj);
2399 _e_comp_object_transform_obj_stack_update(obj);
2408 _e_comp_intercept_hide(void *data, Evas_Object *obj)
2410 E_Comp_Object *cw = data;
2412 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
2413 if( !_e_comp_object_intercept_hook_call(E_COMP_OBJECT_INTERCEPT_HOOK_HIDE, cw->ec))
2415 ELOGF("COMP", "Hide. intercepted", cw->ec);
2420 if (cw->ec->launching == EINA_TRUE)
2422 ELOGF("COMP", "Hide. Cancel launching flag", cw->ec);
2423 cw->ec->launching = EINA_FALSE;
2424 e_comp_object_signal_emit(cw->ec->frame, "e,action,launch,cancel", "e");
2429 /* hidden flag = just do it */
2430 ELOGF("COMP", "Hide hidden evas_object:%p", cw->ec, obj);
2431 evas_object_hide(obj);
2433 wl_signal_emit(&cw->events.hide, NULL);
2438 if (cw->ec->input_only)
2440 /* input_only = who cares */
2441 ELOGF("COMP", "Hide input_only evas_object:%p", cw->ec, obj);
2442 evas_object_hide(obj);
2444 wl_signal_emit(&cw->events.hide, NULL);
2448 /* already hidden or currently animating */
2449 if ((!cw->visible) || (cw->animating && cw->hiding && (!cw->ec->iconic)))
2451 ELOGF("COMP", "Hide. but already hidden or currently animating", cw->ec);
2455 /* don't try hiding during shutdown */
2456 cw->defer_hide |= stopping;
2457 if (!cw->defer_hide)
2459 if ((!cw->ec->iconic) && (!cw->ec->override))
2460 /* unset delete requested so the client doesn't break */
2461 cw->ec->delete_requested = 0;
2462 if ((!cw->animating) || (!cw->hiding) || cw->ec->iconic)
2464 ELOGF("COMP", "Hide. but after iconify or hide animation, cw->animating:%d, cw->hiding:%d, iconic:%d",
2465 cw->ec, cw->animating, cw->hiding, cw->ec->iconic);
2468 e_comp_object_signal_emit(obj, "e,action,iconify", "e");
2471 e_comp_object_signal_emit(obj, "e,state,hidden", "e");
2473 _e_comp_object_animating_begin(cw);
2474 if (!_e_comp_object_effect_visibility_start(cw, 0)) return;
2476 evas_object_smart_callback_call(obj, "hiding", cw->ec);
2477 cw->defer_hide = !!cw->animating;
2479 e_comp_object_effect_set(obj, NULL);
2482 if (cw->animating) return;
2483 /* if we have no animations running, go ahead and hide */
2485 ELOGF("COMP", "Hide normal object:%p", cw->ec, obj);
2486 evas_object_hide(obj);
2488 wl_signal_emit(&cw->events.hide, NULL);
2492 _e_comp_intercept_show_helper(E_Comp_Object *cw)
2494 E_Client *ec = cw->ec;
2497 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
2499 if (ec->show_pending.count > 0)
2501 ELOGF("COMP", "show_helper. Show PENDING!!! show_pending:%d", ec, ec->show_pending.count);
2502 ec->show_pending.running = EINA_TRUE;
2506 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
2507 if (!_e_comp_object_intercept_hook_call(E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER, ec))
2509 ELOGF("COMP", "show_helper. intercepted", cw->ec);
2514 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,
2515 cw->visible, cw->animating, cw->defer_hide, cw->content_type, cw->updates, cw->w, cw->h,
2516 ec->iconic, ec->exp_iconify.by_client, ec->exp_iconify.type, ec->input_only, ec->ignored, ec->new_client);
2519 e_comp_object_signal_emit(cw->smart_obj, "e,state,sticky", "e");
2522 if (ec->iconic && cw->animating)
2524 /* triggered during iconify animation */
2525 e_comp_object_signal_emit(cw->smart_obj, "e,action,uniconify", "e");
2528 ELOGF("COMP", "show_helper. return. already cw->visible", ec);
2531 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE ||
2532 cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE)
2534 evas_object_move(cw->smart_obj, ec->x, ec->y);
2535 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2536 e_comp_object_frame_theme_set(cw->smart_obj, E_COMP_OBJECT_FRAME_RESHADOW);
2538 if (e_comp->image_filter != E_COMP_IMAGE_FILTER_NONE)
2539 e_comp_object_image_filter_set(cw->smart_obj, e_comp->image_filter);
2542 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2543 evas_object_show(cw->smart_obj);
2546 e_client_focus_defer_set(ec);
2550 if ((!cw->updates) && (!ec->input_only) && (!ec->ignored))
2554 pw = ec->client.w, ph = ec->client.h;
2556 if (!e_pixmap_size_get(ec->pixmap, &pw, &ph))
2558 ec->changes.visible = !ec->hidden;
2561 ELOGF("COMP", "show_helper. return. no pixmap size", ec);
2565 cw->updates = eina_tiler_new(pw, ph);
2568 ec->changes.visible = !ec->hidden;
2571 ELOGF("COMP", "show_helper. return. no cw->updates", ec);
2576 eina_tiler_tile_size_set(cw->updates, 1, 1);
2579 /* ignore until client idler first run */
2580 ec->changes.visible = !ec->hidden;
2583 ELOGF("COMP", "show_helper. return. new_client", ec);
2590 evas_object_move(cw->smart_obj, ec->x, ec->y);
2591 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2592 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2593 evas_object_show(cw->smart_obj);
2596 if (ec->netwm.type == E_WINDOW_TYPE_DND && !e_comp_wl->drag_client)
2598 /* start_drag not received */
2599 ec->changes.visible = 1;
2602 ELOGF("COMP", "show_helper. return. start_drag not received yet", ec);
2605 /* re-set geometry */
2606 evas_object_move(cw->smart_obj, ec->x, ec->y);
2607 /* force resize in case it hasn't happened yet, or just to update size */
2608 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2609 if ((cw->w < 1) || (cw->h < 1))
2611 /* if resize didn't go through, try again */
2612 ec->visible = ec->changes.visible = 1;
2614 ELOGF("COMP", "show_helper. return. cw_size(%d,%d)", ec, cw->w, cw->h);
2617 /* if pixmap not available, clear pixmap since we're going to fetch it again */
2618 if (!e_pixmap_size_get(ec->pixmap, &w, &h))
2619 e_pixmap_clear(ec->pixmap);
2621 if (cw->real_hid && w && h)
2624 /* force comp theming in case it didn't happen already */
2625 e_comp_object_frame_theme_set(cw->smart_obj, E_COMP_OBJECT_FRAME_RESHADOW);
2626 if (e_comp->image_filter != E_COMP_IMAGE_FILTER_NONE)
2627 e_comp_object_image_filter_set(cw->smart_obj, e_comp->image_filter);
2630 /* only do the show if show is allowed */
2633 if (ec->internal) //internal clients render when they feel like it
2634 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
2636 if (!e_client_is_iconified_by_client(ec)||
2637 e_policy_visibility_client_is_uniconic(ec))
2639 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2640 evas_object_show(cw->smart_obj);
2642 /* if comp object is shown in idle enterer before(E_CLIENT_HOOK_EVAL_FETCH),
2643 it is rendered in idle callback without native surface and
2644 compositor shows an empty frame if other objects aren't shown
2645 because job callback of e_comp called at the next loop.
2646 it causes a visual defect when windows are switched.
2650 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
2651 e_comp_object_dirty(cw->smart_obj);
2652 e_comp_object_render(cw->smart_obj);
2657 wl_signal_emit(&cw->events.show, NULL);
2661 _e_comp_intercept_show(void *data, Evas_Object *obj EINA_UNUSED)
2663 E_Comp_Object *cw = data;
2664 E_Client *ec = cw->ec;
2666 E_Input_Rect_Data *input_rect_data;
2667 E_Input_Rect_Smart_Data *input_rect_sd;
2670 if (ec->ignored) return;
2674 //INF("SHOW2 %p", ec);
2675 _e_comp_intercept_show_helper(cw);
2678 //INF("SHOW %p", ec);
2681 cw->effect_obj = evas_object_rectangle_add(e_comp->evas);
2682 evas_object_color_set(cw->effect_obj, 0, 0, 0, 0);
2683 evas_object_smart_member_add(cw->effect_obj, cw->smart_obj);
2684 evas_object_name_set(cw->effect_obj, "cw->effect_obj::input_only");
2688 if ((!cw->obj) && (cw->external_content))
2690 ERR("cw->obj for external content is not created! ec:%p", cw->ec);
2694 _e_comp_object_setup(cw);
2697 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE;
2698 cw->obj = evas_object_image_filled_add(e_comp->evas);
2699 evas_object_image_border_center_fill_set(cw->obj, EVAS_BORDER_FILL_SOLID);
2700 e_util_size_debug_set(cw->obj, 1);
2701 evas_object_image_pixels_get_callback_set(cw->obj, _e_comp_object_pixels_get, cw);
2702 evas_object_image_pixels_noti_callback_set(cw->obj, _e_comp_object_pixels_noti, cw);
2703 evas_object_image_smooth_scale_set(cw->obj, e_comp_config_get()->smooth_windows);
2704 evas_object_name_set(cw->obj, "cw->obj");
2705 evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888);
2706 evas_object_intercept_color_set_callback_add(cw->obj, _e_comp_intercept_obj_color_set, cw);
2708 _e_comp_object_alpha_set(cw);
2711 evas_object_color_set(cw->clip, ec->netwm.opacity, ec->netwm.opacity, ec->netwm.opacity, ec->netwm.opacity);
2714 _e_comp_object_map_transform_rect(cw->ec, 0, 0, cw->w, cw->h, NULL, NULL, &tw, &th);
2715 evas_object_geometry_set(cw->effect_obj, cw->x, cw->y, tw, th);
2718 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
2721 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
2723 if (input_rect_data->obj)
2725 evas_object_geometry_set(input_rect_data->obj,
2726 cw->x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
2727 cw->y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
2728 input_rect_data->rect.w, input_rect_data->rect.h);
2735 evas_object_resize(cw->mask.obj, cw->w, cw->h);
2737 _e_comp_intercept_show_helper(cw);
2741 _e_comp_intercept_focus(void *data, Evas_Object *obj, Eina_Bool focus)
2743 E_Comp_Object *cw = data;
2747 /* note: this is here as it seems there are enough apps that do not even
2748 * expect us to emulate a look of focus but not actually set x input
2749 * focus as we do - so simply abort any focus set on such windows */
2750 /* be strict about accepting focus hint */
2751 /* be strict about accepting focus hint */
2752 if ((!ec->icccm.accepts_focus) &&
2753 (!ec->icccm.take_focus))
2757 if (e_client_focused_get() == ec)
2758 e_client_focused_set(NULL);
2760 ELOGF("FOCUS", "FOCUS UNSET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2761 evas_object_focus_set(obj, focus);
2765 if (focus && ec->lock_focus_out) return;
2766 if (e_object_is_del(E_OBJECT(ec)) && focus)
2767 CRI("CAN'T FOCUS DELETED CLIENT! ec:%p", ec);
2769 /* filter focus setting based on current state */
2774 ELOGF("FOCUS", "FOCUS SET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2775 evas_object_focus_set(obj, focus);
2778 if ((ec->iconic) && (!ec->deskshow))
2780 if (!e_policy_visibility_client_is_uniconify_render_running(ec))
2782 /* don't focus an iconified window. that's silly! */
2783 ELOGF("FOCUS", "Do uniconify to set focus", ec);
2784 e_client_uniconify(ec);
2785 e_client_focus_latest_set(ec);
2797 /* check for modal child and set focus to modal child */
2798 E_Client *modal_child = e_client_modal_child_get(ec);
2799 if ((modal_child) && (modal_child != ec) &&
2800 (!e_client_is_iconified_by_client(modal_child)) &&
2801 (modal_child->visible) && (!e_object_is_del(E_OBJECT(modal_child))))
2803 // add ec to latest focus stack
2804 e_client_focus_latest_set(ec);
2806 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);
2807 //e_client_focused_set(modal_child);
2808 evas_object_focus_set(modal_child->frame, focus);
2813 /* not yet visible, wait till the next time... */
2814 ec->want_focus = !ec->hidden;
2819 e_client_focused_set(ec);
2823 if (e_client_focused_get() == ec)
2824 e_client_focused_set(NULL);
2828 ELOGF("FOCUS", "FOCUS SET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2830 ELOGF("FOCUS", "FOCUS UNSET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2832 evas_object_focus_set(obj, focus);
2836 _e_comp_intercept_color_set(void *data, Evas_Object *obj, int r, int g, int b, int a)
2838 E_Comp_Object *cw = data;
2840 if (cw->transparent.set)
2842 cw->transparent.user_r = r;
2843 cw->transparent.user_g = g;
2844 cw->transparent.user_b = b;
2845 cw->transparent.user_a = a;
2847 ELOGF("COMP", "Transparent user_color(%d,%d,%d,%d)",
2849 cw->transparent.user_r,
2850 cw->transparent.user_g,
2851 cw->transparent.user_b,
2852 cw->transparent.user_a);
2856 evas_object_color_set(obj, r, g, b, a);
2859 wl_signal_emit(&cw->events.color_set, NULL);
2861 _e_comp_object_color_visible_update(cw);
2864 ////////////////////////////////////////////////////
2867 _e_comp_object_frame_recalc(E_Comp_Object *cw)
2869 int w, h, ox, oy, ow, oh;
2871 Eina_Bool pass_event_flag = EINA_FALSE;
2872 E_Input_Rect_Data *input_rect_data;
2873 E_Input_Rect_Smart_Data *input_rect_sd;
2875 if (cw->frame_object)
2877 if (cw->obj) edje_object_part_unswallow(cw->frame_object, cw->obj);
2878 evas_object_geometry_get(cw->frame_object, NULL, NULL, &w, &h);
2879 /* set a fixed size, force edje calc, check size difference */
2880 evas_object_resize(cw->frame_object, MAX(w, 50), MAX(h, 50));
2881 edje_object_message_signal_process(cw->frame_object);
2882 edje_object_calc_force(cw->frame_object);
2883 edje_object_part_geometry_get(cw->frame_object, "e.swallow.client", &ox, &oy, &ow, &oh);
2884 cw->client_inset.l = ox;
2885 cw->client_inset.r = MAX(w, 50) - (ox + ow);
2886 cw->client_inset.t = oy;
2887 cw->client_inset.b = MAX(h, 50) - (oy + oh);
2888 if (cw->obj) edje_object_part_swallow(cw->frame_object, "e.swallow.client", cw->obj);
2889 evas_object_resize(cw->frame_object, w, h);
2893 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
2896 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
2898 if (input_rect_data->obj)
2900 pass_event_flag = EINA_TRUE;
2906 evas_object_pass_events_set(cw->default_input_obj, pass_event_flag);
2907 evas_object_pass_events_set(cw->obj, pass_event_flag);
2911 cw->client_inset.l = 0;
2912 cw->client_inset.r = 0;
2913 cw->client_inset.t = 0;
2914 cw->client_inset.b = 0;
2916 cw->client_inset.calc = !!cw->frame_object;
2920 _e_comp_smart_cb_frame_recalc(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2922 E_Comp_Object *cw = data;
2926 /* - get current size
2928 * - readjust for new frame size
2931 w = cw->ec->w, h = cw->ec->h;
2932 e_comp_object_frame_wh_unadjust(obj, w, h, &pw, &ph);
2934 _e_comp_object_frame_recalc(cw);
2936 if (!cw->ec->fullscreen)
2937 e_comp_object_frame_wh_adjust(obj, cw->ec->client.w, cw->ec->client.h, &w, &h);
2939 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2940 if (cw->ec->fullscreen)
2942 zone = e_comp_zone_find_by_ec(cw->ec);
2944 evas_object_resize(cw->ec->frame, zone->w, zone->h);
2946 else if (cw->ec->new_client)
2948 if ((cw->ec->w < 1) || (cw->ec->h < 1)) return;
2949 e_comp_object_frame_wh_adjust(obj, pw, ph, &w, &h);
2950 evas_object_resize(cw->ec->frame, w, h);
2952 else if ((w != cw->ec->w) || (h != cw->ec->h))
2953 evas_object_resize(cw->ec->frame, w, h);
2957 _e_comp_smart_cb_maximize(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2959 E_Comp_Object *cw = data;
2961 _e_comp_object_shadow_setup(cw);
2962 if (cw->frame_object)
2964 _e_comp_object_shadow(cw);
2965 e_comp_object_signal_emit(cw->smart_obj, "e,action,maximize", "e");
2966 _e_comp_object_frame_recalc(cw);
2967 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2972 _e_comp_smart_cb_fullscreen(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2974 E_Comp_Object *cw = data;
2976 if (_e_comp_object_shadow_setup(cw))
2977 e_comp_object_damage(cw->smart_obj, 0, 0, cw->ec->w, cw->ec->h);
2978 if (cw->frame_object)
2980 _e_comp_object_shadow(cw);
2981 e_comp_object_signal_emit(cw->smart_obj, "e,action,maximize,fullscreen", "e");
2982 _e_comp_object_frame_recalc(cw);
2983 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2988 _e_comp_smart_cb_unmaximize(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2990 E_Comp_Object *cw = data;
2992 if (cw->frame_object)
2994 _e_comp_object_shadow(cw);
2995 e_comp_object_signal_emit(obj, "e,action,unmaximize", "e");
2996 _e_comp_object_frame_recalc(cw);
2997 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
3002 _e_comp_smart_cb_unfullscreen(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
3004 E_Comp_Object *cw = data;
3006 if (_e_comp_object_shadow_setup(cw))
3009 cw->ec->changes.size = 1;
3011 if (cw->frame_object)
3013 _e_comp_object_shadow(cw);
3014 e_comp_object_signal_emit(obj, "e,action,unmaximize,unfullscreen", "e");
3015 _e_comp_object_frame_recalc(cw);
3016 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
3021 _e_comp_smart_cb_sticky(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3023 e_comp_object_signal_emit(obj, "e,state,sticky", "e");
3027 _e_comp_smart_cb_unsticky(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3029 e_comp_object_signal_emit(obj, "e,state,unsticky", "e");
3033 _e_comp_smart_focus_in(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3035 e_comp_object_signal_emit(obj, "e,state,focused", "e");
3039 _e_comp_smart_focus_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3041 E_Comp_Object *cw = data;
3043 if (!e_object_is_del(E_OBJECT(cw->ec)))
3044 e_comp_object_signal_emit(obj, "e,state,unfocused", "e");
3048 _e_comp_input_obj_smart_add(Evas_Object *obj)
3050 E_Input_Rect_Smart_Data *input_rect_sd;
3051 input_rect_sd = E_NEW(E_Input_Rect_Smart_Data, 1);
3053 if (!input_rect_sd) return;
3054 evas_object_smart_data_set(obj, input_rect_sd);
3058 _e_comp_input_obj_smart_del(Evas_Object *obj)
3060 E_Input_Rect_Smart_Data *input_rect_sd;
3061 E_Input_Rect_Data *input_rect_data;
3063 input_rect_sd = evas_object_smart_data_get(obj);
3064 if (!input_rect_sd) return;
3066 EINA_LIST_FREE(input_rect_sd->input_rect_data_list, input_rect_data)
3068 if (input_rect_data->obj)
3070 evas_object_smart_member_del(input_rect_data->obj);
3071 E_FREE_FUNC(input_rect_data->obj, evas_object_del);
3073 E_FREE(input_rect_data);
3075 E_FREE(input_rect_sd);
3079 _e_comp_input_obj_smart_move(Evas_Object *obj, int x, int y)
3081 E_Input_Rect_Smart_Data *input_rect_sd;
3082 E_Input_Rect_Data *input_rect_data;
3086 input_rect_sd = evas_object_smart_data_get(obj);
3087 if (!input_rect_sd) return;
3089 cw = input_rect_sd->cw;
3090 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3092 if (input_rect_data->obj)
3094 evas_object_geometry_set(input_rect_data->obj,
3095 x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
3096 y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
3097 input_rect_data->rect.w, input_rect_data->rect.h);
3103 _e_comp_input_obj_smart_resize(Evas_Object *obj, int w, int h)
3105 E_Input_Rect_Smart_Data *input_rect_sd;
3106 E_Input_Rect_Data *input_rect_data;
3110 input_rect_sd = evas_object_smart_data_get(obj);
3111 if (!input_rect_sd) return;
3113 cw = input_rect_sd->cw;
3114 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3116 if (input_rect_data->obj)
3118 evas_object_geometry_set(input_rect_data->obj,
3119 cw->x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
3120 cw->y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
3121 input_rect_data->rect.w, input_rect_data->rect.h);
3127 _e_comp_input_obj_smart_show(Evas_Object *obj)
3129 E_Input_Rect_Smart_Data *input_rect_sd;
3130 E_Input_Rect_Data *input_rect_data;
3133 input_rect_sd = evas_object_smart_data_get(obj);
3134 if (!input_rect_sd) return;
3136 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3138 if (input_rect_data->obj)
3140 evas_object_show(input_rect_data->obj);
3146 _e_comp_input_obj_smart_hide(Evas_Object *obj)
3148 E_Input_Rect_Smart_Data *input_rect_sd;
3149 E_Input_Rect_Data *input_rect_data;
3152 input_rect_sd = evas_object_smart_data_get(obj);
3153 if (!input_rect_sd) return;
3155 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3157 if (input_rect_data->obj)
3159 evas_object_hide(input_rect_data->obj);
3165 _e_comp_input_obj_smart_init(void)
3167 if (_e_comp_input_obj_smart) return;
3169 static const Evas_Smart_Class sc =
3171 INPUT_OBJ_SMART_NAME,
3172 EVAS_SMART_CLASS_VERSION,
3173 _e_comp_input_obj_smart_add,
3174 _e_comp_input_obj_smart_del,
3175 _e_comp_input_obj_smart_move,
3176 _e_comp_input_obj_smart_resize,
3177 _e_comp_input_obj_smart_show,
3178 _e_comp_input_obj_smart_hide,
3191 _e_comp_input_obj_smart = evas_smart_class_new(&sc);
3197 _e_comp_smart_add(Evas_Object *obj)
3201 cw = E_NEW(E_Comp_Object, 1);
3202 EINA_SAFETY_ON_NULL_RETURN(cw);
3204 wl_signal_init(&cw->events.lower);
3205 #ifdef REFACTOR_DESK_AREA
3206 wl_signal_init(&cw->events.lower_done);
3207 wl_signal_init(&cw->events.raise);
3209 wl_signal_init(&cw->events.show);
3210 wl_signal_init(&cw->events.hide);
3211 #ifdef REFACTOR_DESK_AREA
3212 wl_signal_init(&cw->events.set_layer);
3213 wl_signal_init(&cw->events.stack_above);
3214 wl_signal_init(&cw->events.stack_below);
3216 wl_signal_init(&cw->events.image_filter_set);
3217 wl_signal_init(&cw->events.render_op_set);
3218 wl_signal_init(&cw->events.content_type_set);
3219 wl_signal_init(&cw->events.color_set);
3220 wl_signal_init(&cw->events.color_visible_set);
3222 cw->smart_obj = obj;
3223 cw->x = cw->y = cw->w = cw->h = -1;
3224 evas_object_smart_data_set(obj, cw);
3225 cw->opacity = 255.0;
3226 cw->external_content = 0;
3227 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_NONE;
3228 cw->transform_bg_color.r = 0;
3229 cw->transform_bg_color.g = 0;
3230 cw->transform_bg_color.b = 0;
3231 cw->transform_bg_color.a = 255;
3232 cw->color_visible = EINA_TRUE;
3233 evas_object_data_set(obj, "comp_obj", cw);
3234 evas_object_move(obj, -1, -1);
3235 /* intercept ALL the callbacks! */
3236 evas_object_intercept_stack_above_callback_add(obj, _e_comp_intercept_stack_above, cw);
3237 evas_object_intercept_stack_below_callback_add(obj, _e_comp_intercept_stack_below, cw);
3238 evas_object_intercept_raise_callback_add(obj, _e_comp_intercept_raise, cw);
3239 evas_object_intercept_lower_callback_add(obj, _e_comp_intercept_lower, cw);
3240 evas_object_intercept_layer_set_callback_add(obj, _e_comp_intercept_layer_set, cw);
3241 evas_object_intercept_move_callback_add(obj, _e_comp_intercept_move, cw);
3242 evas_object_intercept_resize_callback_add(obj, _e_comp_intercept_resize, cw);
3243 evas_object_intercept_show_callback_add(obj, _e_comp_intercept_show, cw);
3244 evas_object_intercept_hide_callback_add(obj, _e_comp_intercept_hide, cw);
3245 evas_object_intercept_focus_set_callback_add(obj, _e_comp_intercept_focus, cw);
3246 evas_object_intercept_color_set_callback_add(obj, _e_comp_intercept_color_set, cw);
3248 evas_object_smart_callback_add(obj, "maximize", _e_comp_smart_cb_maximize, cw);
3249 evas_object_smart_callback_add(obj, "fullscreen", _e_comp_smart_cb_fullscreen, cw);
3250 evas_object_smart_callback_add(obj, "unmaximize", _e_comp_smart_cb_unmaximize, cw);
3251 evas_object_smart_callback_add(obj, "unfullscreen", _e_comp_smart_cb_unfullscreen, cw);
3253 evas_object_smart_callback_add(obj, "stick", _e_comp_smart_cb_sticky, cw);
3254 evas_object_smart_callback_add(obj, "unstick", _e_comp_smart_cb_unsticky, cw);
3256 evas_object_smart_callback_add(obj, "frame_recalc", _e_comp_smart_cb_frame_recalc, cw);
3258 evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_IN, _e_comp_smart_focus_in, cw);
3259 evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_OUT, _e_comp_smart_focus_out, cw);
3263 _e_comp_smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
3266 evas_object_color_set(cw->clip, r, g, b, a);
3267 evas_object_smart_callback_call(obj, "color_set", NULL);
3272 _e_comp_smart_clip_set(Evas_Object *obj, Evas_Object *clip)
3275 evas_object_clip_set(cw->clip, clip);
3279 _e_comp_smart_clip_unset(Evas_Object *obj)
3282 evas_object_clip_unset(cw->clip);
3286 _e_comp_smart_hide(Evas_Object *obj)
3288 TRACE_DS_BEGIN(COMP:SMART HIDE);
3293 evas_object_hide(cw->clip);
3294 if (cw->input_obj) evas_object_hide(cw->input_obj);
3295 evas_object_hide(cw->effect_obj);
3296 if (cw->default_input_obj) evas_object_hide(cw->default_input_obj);
3297 if (cw->transform_bg_obj) evas_object_hide(cw->transform_bg_obj);
3298 if (cw->transform_tranp_obj) evas_object_hide(cw->transform_tranp_obj);
3305 /* unset native surface if current displaying buffer was destroied */
3306 if (!cw->buffer_destroy_listener.notify)
3308 Evas_Native_Surface *ns;
3309 ns = evas_object_image_native_surface_get(cw->obj);
3310 if ((ns) && (ns->type == EVAS_NATIVE_SURFACE_WL) && (ns->data.wl.legacy_buffer))
3311 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
3314 if (!cw->ec->input_only)
3316 edje_object_freeze(cw->effect_obj);
3317 edje_object_freeze(cw->shobj);
3318 edje_object_play_set(cw->shobj, 0);
3319 if (cw->frame_object)
3320 edje_object_play_set(cw->frame_object, 0);
3323 e_comp_render_queue(); //force nocomp recheck
3329 _e_comp_smart_show(Evas_Object *obj)
3337 if ((cw->w < 0) || (cw->h < 0))
3338 CRI("ACK! ec:%p", cw->ec);
3340 TRACE_DS_BEGIN(COMP:SMART SHOW);
3342 e_comp_object_map_update(obj);
3344 EINA_LIST_FOREACH(cw->ec->e.state.video_child, l, tmp)
3345 evas_object_show(tmp->frame);
3347 evas_object_show(cw->clip);
3348 if (cw->input_obj) evas_object_show(cw->input_obj);
3349 if (!cw->ec->input_only)
3351 edje_object_thaw(cw->effect_obj);
3352 edje_object_thaw(cw->shobj);
3353 edje_object_play_set(cw->shobj, 1);
3354 if (cw->frame_object)
3355 edje_object_play_set(cw->frame_object, 1);
3357 evas_object_show(cw->effect_obj);
3358 if (cw->mask.obj) evas_object_show(cw->mask.obj);
3359 if (cw->transform_bg_obj) evas_object_show(cw->transform_bg_obj);
3360 if (cw->transform_tranp_obj) evas_object_show(cw->transform_tranp_obj);
3361 if (cw->default_input_obj) evas_object_show(cw->default_input_obj);
3362 e_comp_render_queue();
3363 if (cw->ec->input_only)
3368 if (cw->ec->iconic && (!cw->ec->new_client))
3370 if (e_client_is_iconified_by_client(cw->ec))
3372 ELOGF("COMP", "Set launching flag..", cw->ec);
3373 cw->ec->launching = EINA_TRUE;
3376 e_comp_object_signal_emit(cw->smart_obj, "e,action,uniconify", "e");
3378 else if (!cw->showing) /* if set, client was ec->hidden during show animation */
3381 ELOGF("COMP", "Set launching flag..", cw->ec);
3382 cw->ec->launching = EINA_TRUE;
3384 e_comp_object_signal_emit(cw->smart_obj, "e,state,visible", "e");
3385 _e_comp_object_animating_begin(cw);
3386 if (!_e_comp_object_effect_visibility_start(cw, 1))
3392 /* ensure some random effect doesn't lock the client offscreen */
3396 e_comp_object_effect_set(obj, NULL);
3399 _e_comp_object_dim_update(cw);
3405 _e_comp_smart_del(Evas_Object *obj)
3411 if (cw->buffer_destroy_listener.notify)
3413 wl_list_remove(&cw->buffer_destroy_listener.link);
3414 cw->buffer_destroy_listener.notify = NULL;
3417 if (cw->tbm_surface)
3419 tbm_surface_internal_unref(cw->tbm_surface);
3420 cw->tbm_surface = NULL;
3423 if (cw->render_update_lock.buffer_ref.buffer)
3425 ELOGF("COMP", "Clear buffer_ref of render_update_lock:%d",
3426 cw->ec, cw->render_update_lock.lock);
3427 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, NULL);
3430 e_comp_object_render_update_del(cw->smart_obj);
3431 E_FREE_FUNC(cw->updates, eina_tiler_free);
3432 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
3439 EINA_LIST_FREE(cw->obj_mirror, o)
3441 evas_object_image_data_set(o, NULL);
3442 evas_object_freeze_events_set(o, 1);
3443 evas_object_event_callback_del_full(o, EVAS_CALLBACK_DEL, _e_comp_object_cb_mirror_del, cw);
3447 #ifdef REFACTOR_DESK_AREA
3449 _e_comp_object_layers_remove(cw);
3451 l = evas_object_data_get(obj, "comp_object-to_del");
3452 E_FREE_LIST(l, evas_object_del);
3453 _e_comp_object_mouse_event_callback_unset(cw);
3454 evas_object_del(cw->clip);
3455 evas_object_del(cw->obj);
3456 evas_object_del(cw->shobj);
3457 evas_object_del(cw->effect_obj);
3458 evas_object_del(cw->frame_object);
3459 evas_object_del(cw->input_obj);
3460 evas_object_del(cw->mask.obj);
3461 if (cw->dim.mask_obj) evas_object_del(cw->dim.mask_obj);
3462 evas_object_del(cw->transform_bg_obj);
3463 evas_object_del(cw->transform_tranp_obj);
3464 evas_object_del(cw->default_input_obj);
3465 eina_stringshare_del(cw->frame_theme);
3466 eina_stringshare_del(cw->frame_name);
3470 e_comp->animating--;
3472 e_object_unref(E_OBJECT(cw->ec));
3474 cw->ec->frame = NULL;
3479 _e_comp_smart_move(Evas_Object *obj, int x, int y)
3483 cw->x = x, cw->y = y;
3484 evas_object_move(cw->effect_obj, x, y);
3485 evas_object_move(cw->default_input_obj, x, y);
3486 if (cw->input_obj) evas_object_move(cw->input_obj, x, y);
3488 e_comp_object_map_update(obj);
3492 _e_comp_smart_resize(Evas_Object *obj, int w, int h)
3494 Eina_Bool first = EINA_FALSE;
3499 if (!cw->effect_obj) CRI("ACK! ec:%p", cw->ec);
3501 TRACE_DS_BEGIN(COMP:SMART RESIZE);
3503 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
3505 if (cw->w != w || cw->h != h)
3506 e_comp_object_map_update(obj);
3508 first = ((cw->w < 1) || (cw->h < 1));
3509 cw->w = w, cw->h = h;
3513 if (cw->frame_object)
3514 e_comp_object_frame_wh_unadjust(obj, w, h, &ww, &hh);
3517 /* verify pixmap:object size */
3518 if (e_pixmap_size_get(cw->ec->pixmap, &pw, &ph) && (!cw->ec->override))
3520 if ((ww != pw) || (hh != ph))
3521 ELOGF("COMP", "CW RSZ: %dx%d || PX: %dx%d.", cw->ec, ww, hh, pw, ph);
3523 evas_object_resize(cw->effect_obj, tw, th);
3524 evas_object_resize(cw->default_input_obj, w, h);
3526 evas_object_resize(cw->input_obj, w, h);
3528 evas_object_resize(cw->mask.obj, w, h);
3529 /* resize render update tiler */
3532 RENDER_DEBUG("DAMAGE UNFULL: %p", cw->ec);
3533 cw->updates_full = 0;
3534 if (cw->updates) eina_tiler_clear(cw->updates);
3538 RENDER_DEBUG("DAMAGE RESIZE(%p): %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
3539 if (cw->updates) eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
3547 e_comp_render_queue();
3553 _e_comp_smart_init(void)
3555 if (_e_comp_smart) return;
3557 static const Evas_Smart_Class sc =
3560 EVAS_SMART_CLASS_VERSION,
3564 _e_comp_smart_resize,
3567 _e_comp_smart_color_set,
3568 _e_comp_smart_clip_set,
3569 _e_comp_smart_clip_unset,
3579 _e_comp_smart = evas_smart_class_new(&sc);
3584 e_comp_object_init(void)
3586 E_EVENT_COMP_OBJECT_ADD = ecore_event_type_new();
3587 E_EVENT_COMP_OBJECT_IMG_RENDER = ecore_event_type_new();
3588 E_EVENT_COMP_OBJECT_EFFECT_START = ecore_event_type_new();
3589 E_EVENT_COMP_OBJECT_EFFECT_END = ecore_event_type_new();
3593 e_comp_object_shutdown(void)
3599 e_comp_object_mirror_visibility_check(Evas_Object *obj)
3601 API_ENTRY EINA_FALSE;
3602 return !!cw->force_visible;
3604 /////////////////////////////////////////////////////////
3607 _e_comp_object_util_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3610 Eina_Bool comp_object;
3612 comp_object = !!evas_object_data_get(obj, "comp_object");
3617 o = edje_object_part_swallow_get(obj, "e.swallow.content");
3619 e_comp_render_queue();
3621 l = evas_object_data_get(obj, "comp_object-to_del");
3622 E_FREE_LIST(l, evas_object_del);
3626 _e_comp_object_util_restack(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3628 if (e_comp_util_object_is_above_nocomp(obj) &&
3629 (!evas_object_data_get(obj, "comp_override")))
3631 evas_object_data_set(obj, "comp_override", (void*)1);
3632 e_comp_override_add();
3637 _e_comp_object_util_show(void *data EINA_UNUSED, Evas_Object *obj)
3639 Eina_Bool ref = EINA_TRUE;
3640 if (evas_object_visible_get(obj))
3644 d = evas_object_data_del(obj, "comp_hiding");
3646 /* currently trying to hide */
3649 /* already visible */
3653 evas_object_show(obj);
3656 evas_object_ref(obj);
3657 evas_object_data_set(obj, "comp_ref", (void*)1);
3659 edje_object_signal_emit(obj, "e,state,visible", "e");
3660 evas_object_data_set(obj, "comp_showing", (void*)1);
3661 if (e_comp_util_object_is_above_nocomp(obj))
3663 evas_object_data_set(obj, "comp_override", (void*)1);
3664 e_comp_override_add();
3669 _e_comp_object_util_hide(void *data EINA_UNUSED, Evas_Object *obj)
3671 if (!evas_object_visible_get(obj)) return;
3672 /* already hiding */
3673 if (evas_object_data_get(obj, "comp_hiding")) return;
3674 if (!evas_object_data_del(obj, "comp_showing"))
3676 evas_object_ref(obj);
3677 evas_object_data_set(obj, "comp_ref", (void*)1);
3679 edje_object_signal_emit(obj, "e,state,hidden", "e");
3680 evas_object_data_set(obj, "comp_hiding", (void*)1);
3682 if (evas_object_data_del(obj, "comp_override"))
3683 e_comp_override_timed_pop();
3687 _e_comp_object_util_done_defer(void *data, Evas_Object *obj, const char *emission, const char *source EINA_UNUSED)
3689 if (!e_util_strcmp(emission, "e,action,hide,done"))
3691 if (!evas_object_data_del(obj, "comp_hiding")) return;
3692 evas_object_intercept_hide_callback_del(obj, _e_comp_object_util_hide);
3693 evas_object_hide(obj);
3694 evas_object_intercept_hide_callback_add(obj, _e_comp_object_util_hide, data);
3697 evas_object_data_del(obj, "comp_showing");
3698 if (evas_object_data_del(obj, "comp_ref"))
3699 evas_object_unref(obj);
3703 _e_comp_object_util_moveresize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3709 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
3713 E_API E_Comp_Object_Hook *
3714 e_comp_object_hook_add(E_Comp_Object_Hook_Point hookpoint, E_Comp_Object_Hook_Cb func, const void *data)
3716 E_Comp_Object_Hook *ch;
3718 EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_COMP_OBJECT_HOOK_LAST, NULL);
3719 ch = E_NEW(E_Comp_Object_Hook, 1);
3720 if (!ch) return NULL;
3721 ch->hookpoint = hookpoint;
3723 ch->data = (void*)data;
3724 _e_comp_object_hooks[hookpoint] = eina_inlist_append(_e_comp_object_hooks[hookpoint], EINA_INLIST_GET(ch));
3729 e_comp_object_hook_del(E_Comp_Object_Hook *ch)
3732 if (_e_comp_object_hooks_walking == 0)
3734 _e_comp_object_hooks[ch->hookpoint] = eina_inlist_remove(_e_comp_object_hooks[ch->hookpoint], EINA_INLIST_GET(ch));
3738 _e_comp_object_hooks_delete++;
3741 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
3742 E_API E_Comp_Object_Intercept_Hook *
3743 e_comp_object_intercept_hook_add(E_Comp_Object_Intercept_Hook_Point hookpoint, E_Comp_Object_Intercept_Hook_Cb func, const void *data)
3745 E_Comp_Object_Intercept_Hook *ch;
3747 EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_COMP_OBJECT_INTERCEPT_HOOK_LAST, NULL);
3748 ch = E_NEW(E_Comp_Object_Intercept_Hook, 1);
3749 if (!ch) return NULL;
3750 ch->hookpoint = hookpoint;
3752 ch->data = (void*)data;
3753 _e_comp_object_intercept_hooks[hookpoint] = eina_inlist_append(_e_comp_object_intercept_hooks[hookpoint], EINA_INLIST_GET(ch));
3758 e_comp_object_intercept_hook_del(E_Comp_Object_Intercept_Hook *ch)
3761 if (_e_comp_object_intercept_hooks_walking == 0)
3763 _e_comp_object_intercept_hooks[ch->hookpoint] = eina_inlist_remove(_e_comp_object_intercept_hooks[ch->hookpoint], EINA_INLIST_GET(ch));
3767 _e_comp_object_intercept_hooks_delete++;
3772 e_comp_object_util_add(Evas_Object *obj)
3776 E_Comp_Config *conf = e_comp_config_get();
3777 Eina_Bool skip = EINA_FALSE;
3783 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
3785 name = evas_object_name_get(obj);
3786 vis = evas_object_visible_get(obj);
3787 o = edje_object_add(e_comp->evas);
3788 evas_object_data_set(o, "comp_object", (void*)1);
3790 skip = (!strncmp(name, "noshadow", 8));
3792 evas_object_data_set(o, "comp_object_skip", (void*)1);
3794 if (conf->shadow_style)
3796 snprintf(buf, sizeof(buf), "e/comp/frame/%s", conf->shadow_style);
3797 ok = e_theme_edje_object_set(o, "base/theme/comp", buf);
3800 e_theme_edje_object_set(o, "base/theme/comp", "e/comp/frame/default");
3801 if (e_util_strcmp(evas_object_type_get(obj), "edje") || (!edje_object_data_get(obj, "noshadow")))
3802 edje_object_signal_emit(o, "e,state,shadow,on", "e");
3804 edje_object_signal_emit(o, "e,state,shadow,off", "e");
3806 evas_object_geometry_get(obj, &x, &y, &w, &h);
3807 evas_object_geometry_set(o, x, y, w, h);
3808 evas_object_pass_events_set(o, evas_object_pass_events_get(obj));
3810 edje_object_signal_callback_add(o, "e,action,*,done", "e", _e_comp_object_util_done_defer, NULL);
3812 evas_object_intercept_show_callback_add(o, _e_comp_object_util_show, NULL);
3813 evas_object_intercept_hide_callback_add(o, _e_comp_object_util_hide, NULL);
3814 evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _e_comp_object_util_moveresize, NULL);
3815 evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, _e_comp_object_util_del, NULL);
3816 evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE, _e_comp_object_util_moveresize, NULL);
3817 evas_object_event_callback_add(o, EVAS_CALLBACK_RESTACK, _e_comp_object_util_restack, NULL);
3819 e_comp_object_signal_emit(o, "e,state,hidden", "e");
3821 edje_object_part_swallow(o, "e.swallow.content", obj);
3823 _e_comp_object_event_add(o);
3826 evas_object_show(o);
3831 /* utility functions for deleting objects when their "owner" is deleted */
3833 e_comp_object_util_del_list_append(Evas_Object *obj, Evas_Object *to_del)
3838 EINA_SAFETY_ON_NULL_RETURN(to_del);
3839 l = evas_object_data_get(obj, "comp_object-to_del");
3840 evas_object_data_set(obj, "comp_object-to_del", eina_list_append(l, to_del));
3841 evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _e_comp_object_util_del);
3842 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_util_del, NULL);
3846 e_comp_object_util_del_list_remove(Evas_Object *obj, Evas_Object *to_del)
3851 EINA_SAFETY_ON_NULL_RETURN(to_del);
3852 l = evas_object_data_get(obj, "comp_object-to_del");
3854 evas_object_data_set(obj, "comp_object-to_del", eina_list_remove(l, to_del));
3857 /////////////////////////////////////////////////////////
3859 EINTERN Evas_Object *
3860 e_comp_object_client_add(E_Client *ec)
3865 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, NULL);
3866 if (ec->frame) return NULL;
3867 _e_comp_smart_init();
3868 o = evas_object_smart_add(e_comp->evas, _e_comp_smart);
3869 cw = evas_object_smart_data_get(o);
3870 if (!cw) return NULL;
3871 evas_object_data_set(o, "E_Client", ec);
3874 evas_object_data_set(o, "comp_object", (void*)1);
3876 _e_comp_object_event_add(o);
3881 /* utility functions for getting client inset */
3883 e_comp_object_frame_xy_adjust(Evas_Object *obj, int x, int y, int *ax, int *ay)
3886 if (!cw->client_inset.calc)
3892 if (ax) *ax = x - cw->client_inset.l;
3893 if (ay) *ay = y - cw->client_inset.t;
3897 e_comp_object_frame_xy_unadjust(Evas_Object *obj, int x, int y, int *ax, int *ay)
3900 if (!cw->client_inset.calc)
3906 if (ax) *ax = x + cw->client_inset.l;
3907 if (ay) *ay = y + cw->client_inset.t;
3911 e_comp_object_frame_wh_adjust(Evas_Object *obj, int w, int h, int *aw, int *ah)
3914 if (!cw->client_inset.calc)
3920 if (aw) *aw = w + cw->client_inset.l + cw->client_inset.r;
3921 if (ah) *ah = h + cw->client_inset.t + cw->client_inset.b;
3925 e_comp_object_frame_wh_unadjust(Evas_Object *obj, int w, int h, int *aw, int *ah)
3928 if (!cw->client_inset.calc)
3934 if (aw) *aw = w - cw->client_inset.l - cw->client_inset.r;
3935 if (ah) *ah = h - cw->client_inset.t - cw->client_inset.b;
3939 e_comp_object_client_get(Evas_Object *obj)
3944 /* FIXME: remove this when eo is used */
3945 o = evas_object_data_get(obj, "comp_smart_obj");
3947 return e_comp_object_client_get(o);
3948 return cw ? cw->ec : NULL;
3952 e_comp_object_frame_extends_get(Evas_Object *obj, int *x, int *y, int *w, int *h)
3955 if (cw->frame_extends)
3956 edje_object_parts_extends_calc(cw->frame_object, x, y, w, h);
3961 if (w) *w = cw->ec->w;
3962 if (h) *h = cw->ec->h;
3967 e_comp_object_util_zone_get(Evas_Object *obj)
3969 E_Zone *zone = NULL;
3973 zone = e_comp_zone_find_by_ec(cw->ec);
3978 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
3979 zone = e_comp_zone_xy_get(x, y);
3985 e_comp_object_util_center(Evas_Object *obj)
3987 int x, y, w, h, ow, oh;
3992 zone = e_comp_object_util_zone_get(obj);
3993 EINA_SAFETY_ON_NULL_RETURN(zone);
3994 e_zone_useful_geometry_get(zone, &x, &y, &w, &h);
3995 if (cw && (cw->ec->changes.size || cw->ec->new_client))
3996 ow = cw->ec->w, oh = cw->ec->h;
3998 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
3999 x = x + (w - ow) / 2;
4000 y = y + (h - oh) / 2;
4001 evas_object_move(obj, x, y);
4005 e_comp_object_util_center_on(Evas_Object *obj, Evas_Object *on)
4007 int x, y, w, h, ow, oh;
4010 EINA_SAFETY_ON_NULL_RETURN(on);
4011 evas_object_geometry_get(on, &x, &y, &w, &h);
4012 if (cw && (cw->ec->changes.size || cw->ec->new_client))
4013 ow = cw->ec->w, oh = cw->ec->h;
4015 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
4016 evas_object_move(obj, x + (w / 2) - (ow / 2), y + (h / 2) - (oh / 2));
4020 e_comp_object_util_fullscreen(Evas_Object *obj)
4025 e_client_fullscreen(cw->ec, E_FULLSCREEN_RESIZE);
4028 evas_object_move(obj, 0, 0);
4029 evas_object_resize(obj, e_comp->w, e_comp->h);
4034 e_comp_object_util_center_pos_get(Evas_Object *obj, int *x, int *y)
4042 ow = cw->w, oh = cw->h;
4044 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
4045 zone = e_comp_object_util_zone_get(obj);
4046 e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh);
4047 if (x) *x = zx + (zw - ow) / 2;
4048 if (y) *y = zy + (zh - oh) / 2;
4052 e_comp_object_input_objs_del(Evas_Object *obj)
4055 E_Input_Rect_Data *input_rect_data;
4056 E_Input_Rect_Smart_Data *input_rect_sd;
4061 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4062 if (!input_rect_sd) return;
4064 EINA_LIST_FREE(input_rect_sd->input_rect_data_list, input_rect_data)
4066 if (input_rect_data->obj)
4068 evas_object_smart_member_del(input_rect_data->obj);
4069 E_FREE_FUNC(input_rect_data->obj, evas_object_del);
4071 E_FREE(input_rect_data);
4076 e_comp_object_input_area_set(Evas_Object *obj, int x, int y, int w, int h)
4079 E_Input_Rect_Data *input_rect_data = NULL;
4080 E_Input_Rect_Smart_Data *input_rect_sd;
4081 int client_w, client_h;
4083 if (cw->ec->client.w)
4084 client_w = cw->ec->client.w;
4086 client_w = cw->ec->w;
4088 if (cw->ec->client.h)
4089 client_h = cw->ec->client.h;
4091 client_h = cw->ec->h;
4093 E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, client_w, client_h);
4097 _e_comp_input_obj_smart_init();
4098 cw->input_obj = evas_object_smart_add(e_comp->evas, _e_comp_input_obj_smart);
4099 evas_object_smart_member_add(cw->input_obj, cw->smart_obj);
4100 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4103 input_rect_sd->cw = cw;
4106 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4109 input_rect_data = E_NEW(E_Input_Rect_Data, 1);
4110 if (input_rect_data)
4112 EINA_RECTANGLE_SET(&input_rect_data->rect, x, y, w, h);
4113 input_rect_sd->input_rect_data_list = eina_list_append(input_rect_sd->input_rect_data_list, input_rect_data);
4117 if ((input_rect_data) &&
4118 (x || y || (w != cw->ec->client.w) || (h != cw->ec->client.h)))
4120 input_rect_data->obj = evas_object_rectangle_add(e_comp->evas);
4121 evas_object_name_set(input_rect_data->obj, "cw->input_obj");
4122 evas_object_color_set(input_rect_data->obj, 0, 0, 0, 0);
4123 evas_object_clip_set(input_rect_data->obj, cw->clip);
4124 evas_object_smart_member_add(input_rect_data->obj, cw->input_obj);
4125 evas_object_geometry_set(input_rect_data->obj,
4126 cw->ec->client.x + (!!cw->frame_object * cw->client_inset.l) + x,
4127 cw->ec->client.y + (!!cw->frame_object * cw->client_inset.t) + y, w, h);
4128 evas_object_pass_events_set(cw->default_input_obj, 1);
4129 evas_object_pass_events_set(cw->obj, 1);
4132 evas_object_show(input_rect_data->obj);
4133 evas_object_show(cw->input_obj);
4138 evas_object_smart_member_del(cw->input_obj);
4139 E_FREE_FUNC(cw->input_obj, evas_object_del);
4140 evas_object_pass_events_set(cw->default_input_obj, 0);
4141 evas_object_pass_events_set(cw->obj, 0);
4146 e_comp_object_input_rect_get(Evas_Object *obj, Eina_List **list)
4149 E_Input_Rect_Smart_Data *input_rect_sd;
4150 E_Input_Rect_Data *input_rect_data;
4153 if (!cw->input_obj) return;
4155 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4158 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
4160 *list = eina_list_append(*list, &input_rect_data->rect);
4166 e_comp_object_frame_geometry_get(Evas_Object *obj, int *l, int *r, int *t, int *b)
4169 if (l) *l = cw->client_inset.l;
4170 if (r) *r = cw->client_inset.r;
4171 if (t) *t = cw->client_inset.t;
4172 if (b) *b = cw->client_inset.b;
4175 /* set geometry for CSD */
4177 e_comp_object_frame_geometry_set(Evas_Object *obj, int l, int r, int t, int b)
4183 if (cw->frame_object)
4184 CRI("ACK! ec:%p", cw->ec);
4185 if ((cw->client_inset.l == l) && (cw->client_inset.r == r) &&
4186 (cw->client_inset.t == t) && (cw->client_inset.b == b)) return;
4187 calc = cw->client_inset.calc;
4188 cw->client_inset.calc = l || r || t || b;
4189 eina_stringshare_replace(&cw->frame_theme, "borderless");
4190 if (cw->client_inset.calc)
4192 tw = cw->ec->w + ((l + r) - (cw->client_inset.l + cw->client_inset.r));
4193 th = cw->ec->h + ((t + b) - (cw->client_inset.t + cw->client_inset.b));
4194 e_client_size_set(cw->ec, tw, th);
4196 else if (cw->ec->maximized || cw->ec->fullscreen)
4198 cw->ec->saved.w -= ((l + r) - (cw->client_inset.l + cw->client_inset.r));
4199 cw->ec->saved.h -= ((t + b) - (cw->client_inset.t + cw->client_inset.b));
4201 if (!cw->ec->new_client)
4203 if (calc && cw->client_inset.calc)
4205 tx = cw->ec->x - (l - cw->client_inset.l);
4206 ty = cw->ec->y - (t - cw->client_inset.t);
4207 e_client_pos_set(cw->ec, tx, ty);
4209 cw->ec->changes.pos = cw->ec->changes.size = 1;
4212 cw->client_inset.l = l;
4213 cw->client_inset.r = r;
4214 cw->client_inset.t = t;
4215 cw->client_inset.b = b;
4219 e_comp_object_frame_allowed(Evas_Object *obj)
4221 API_ENTRY EINA_FALSE;
4222 return (cw->frame_object || (!cw->client_inset.calc));
4226 e_comp_object_frame_exists(Evas_Object *obj)
4228 API_ENTRY EINA_FALSE;
4229 return !!cw->frame_object;
4233 e_comp_object_frame_theme_set(Evas_Object *obj, const char *name)
4235 Evas_Object *o, *pbg;
4238 Eina_Stringshare *theme;
4240 API_ENTRY EINA_FALSE;
4242 if (!e_util_strcmp(cw->frame_theme, name))
4243 return edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object ?: cw->obj);
4244 if (!e_util_strcmp(name, "COMP_RESHADOW"))
4245 return _e_comp_object_shadow_setup(cw);
4246 pbg = cw->frame_object;
4247 theme = eina_stringshare_add(name);
4249 if (cw->frame_object)
4253 w = cw->ec->w, h = cw->ec->h;
4254 e_comp_object_frame_wh_unadjust(obj, w, h, &cw->ec->w, &cw->ec->h);
4255 if ((cw->ec->w != w) || (cw->ec->h != h))
4257 cw->ec->changes.size = 1;
4260 E_FREE_FUNC(cw->frame_object, evas_object_del);
4261 if (!name) goto reshadow;
4263 o = edje_object_add(e_comp->evas);
4264 snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", name);
4265 ok = e_theme_edje_object_set(o, "base/theme/border", buf);
4266 if ((!ok) && (!e_util_strcmp(name, "borderless")))
4268 cw->frame_object = NULL;
4270 eina_stringshare_del(cw->frame_theme);
4271 cw->frame_theme = theme;
4276 if (theme != e_config->theme_default_border_style)
4278 snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", e_config->theme_default_border_style);
4279 ok = e_theme_edje_object_set(o, "base/theme/border", buf);
4283 ok = e_theme_edje_object_set(o, "base/theme/border",
4284 "e/widgets/border/default/border");
4285 if (ok && (theme == e_config->theme_default_border_style))
4287 /* Reset default border style to default */
4288 eina_stringshare_replace(&e_config->theme_default_border_style, "default");
4289 e_config_save_queue();
4296 cw->frame_object = o;
4297 eina_stringshare_del(cw->frame_theme);
4298 cw->frame_theme = theme;
4299 evas_object_name_set(o, "cw->frame_object");
4302 edje_object_part_text_set(o, "e.text.title", cw->frame_name);
4306 cw->ec->changes.icon = 1;
4312 CRI("USER IS USING A SHITTY THEME! ABORT!!!!");
4317 _e_comp_object_shadow_setup(cw);
4320 int old_x, old_y, new_x = 0, new_y = 0;
4322 old_x = cw->x, old_y = cw->y;
4324 _e_comp_smart_cb_frame_recalc(cw, cw->smart_obj, NULL);
4326 new_x = cw->ec->x, new_y = cw->ec->y;
4327 else if (cw->ec->placed || (!cw->ec->new_client))
4329 /* if no previous frame:
4330 * - reapply client_inset
4335 if (cw->ec->changes.size)
4343 zone = e_comp_zone_find_by_ec(cw->ec);
4346 x = cw->ec->client.x, y = cw->ec->client.y;
4347 x = MAX(zone->x, cw->ec->client.x - cw->client_inset.l);
4348 y = MAX(zone->y, cw->ec->client.y - cw->client_inset.t);
4350 new_x = x, new_y = y;
4353 if (old_x != new_x || old_y != new_y)
4355 /* this guarantees that we won't get blocked by the NOP check in the interceptor */
4356 cw->y = cw->x = -99999;
4357 evas_object_move(obj, new_x, new_y);
4361 if (cw->ec->maximized)
4363 cw->ec->changes.need_maximize = 1;
4366 evas_object_smart_callback_call(cw->smart_obj, "frame_changed", NULL);
4367 if (cw->frame_object)
4369 cw->frame_extends = !!edje_object_data_get(cw->frame_object, "frame_extends");
4372 cw->frame_extends = 0;
4373 evas_object_del(pbg);
4378 e_comp_object_signal_emit(Evas_Object *obj, const char *sig, const char *src)
4380 E_Comp_Object_Mover *prov;
4383 //INF("EMIT %p: %s %s", cw->ec, sig, src);
4384 edje_object_signal_emit(cw->shobj, sig, src);
4385 if (cw->frame_object) edje_object_signal_emit(cw->frame_object, sig, src);
4386 if ((cw->ec->override && e_comp_config_get()->match.disable_overrides) ||
4387 ((!cw->ec->override) && e_comp_config_get()->match.disable_borders))
4389 /* start with highest priority callback first */
4390 EINA_INLIST_REVERSE_FOREACH(_e_comp_object_movers, prov)
4392 if (!e_util_glob_match(sig, prov->sig)) continue;
4393 if (prov->func(prov->data, obj, sig)) break;
4398 e_comp_object_signal_callback_add(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb, const void *data)
4400 /* FIXME: at some point I guess this should use eo to inherit
4401 * -EDJE_OBJ_SUB_ID_SIGNAL_CALLBACK_ADD
4402 * -EDJE_OBJ_SUB_ID_SIGNAL_CALLBACK_DEL
4405 edje_object_signal_callback_add(cw->shobj, sig, src, cb, (void*)data);
4409 e_comp_object_signal_callback_del(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb)
4412 edje_object_signal_callback_del(cw->shobj, sig, src, cb);
4416 e_comp_object_signal_callback_del_full(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb, const void *data)
4419 edje_object_signal_callback_del_full(cw->shobj, sig, src, cb, (void*)data);
4423 e_comp_object_damage(Evas_Object *obj, int x, int y, int w, int h)
4426 Eina_Rectangle rect;
4429 if (cw->ec->input_only || (!cw->updates)) return;
4430 if (cw->nocomp) return;
4431 rect.x = x, rect.y = y;
4432 rect.w = w, rect.h = h;
4433 evas_object_smart_callback_call(obj, "damage", &rect);
4435 if (e_comp_is_on_overlay(cw->ec))
4437 /* It will not set hwc_need_update value if E modules already cleanup pixmap
4438 * resource on the E_COMP_WL_HOOK_BUFFER_CHANGE hook function. It means that
4439 * E module attempts to block screen update due to the particular policy.
4441 if (e_pixmap_resource_get(cw->ec->pixmap))
4442 cw->hwc_need_update = EINA_TRUE;
4445 /* ignore overdraw */
4446 if (cw->updates_full)
4448 RENDER_DEBUG("IGNORED %p: %d,%d %dx%d", cw->ec, x, y, w, h);
4449 e_comp_object_render_update_add(obj);
4451 if ((cw->ec->visible) && (!evas_object_visible_get(cw->smart_obj)) && (!cw->ec->iconic))
4452 evas_object_show(cw->smart_obj);
4456 /* clip rect to client surface */
4457 RENDER_DEBUG("DAMAGE(%d,%d %dx%d) CLIP(%dx%d)", x, y, w, h, cw->ec->client.w, cw->ec->client.h);
4458 E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, cw->ec->client.w, cw->ec->client.h);
4459 /* if rect is the total size of the client after clip, clear the updates
4460 * since this is guaranteed to be the whole region anyway
4462 eina_tiler_area_size_get(cw->updates, &tw, &th);
4463 if ((w > tw) || (h > th))
4465 RENDER_DEBUG("DAMAGE RESIZE %p: %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
4466 eina_tiler_clear(cw->updates);
4467 eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
4469 tw = cw->ec->client.w, th = cw->ec->client.h;
4471 if ((!x) && (!y) && (w == tw) && (h == th))
4473 eina_tiler_clear(cw->updates);
4474 RENDER_DEBUG("DAMAGE FULL: %p", cw->ec);
4475 cw->updates_full = 1;
4476 cw->update_count = 0;
4479 if (cw->update_count > UPDATE_MAX)
4481 /* this is going to get really dumb, so just update the whole thing */
4482 eina_tiler_clear(cw->updates);
4483 cw->update_count = cw->updates_full = 1;
4484 eina_tiler_rect_add(cw->updates, &(Eina_Rectangle){0, 0, tw, th});
4485 RENDER_DEBUG("DAMAGE MAX: %dx%d", tw, th);
4489 eina_tiler_rect_add(cw->updates, &(Eina_Rectangle){x, y, w, h});
4490 RENDER_DEBUG("DAMAGE: %d,%d %dx%d", x, y, w, h);
4492 cw->updates_exist = 1;
4493 e_comp_object_render_update_add(obj);
4495 if ((cw->ec->visible) && (!evas_object_visible_get(cw->smart_obj)) && (!cw->ec->iconic))
4496 evas_object_show(cw->smart_obj);
4500 e_comp_object_damage_exists(Evas_Object *obj)
4502 API_ENTRY EINA_FALSE;
4503 return cw->updates_exist;
4507 e_comp_object_render_update_add(Evas_Object *obj)
4511 if (cw->ec->input_only || (!cw->updates) || (!cw->redirected)) return;
4512 if (cw->render_update_lock.lock) return;
4513 if (!e_pixmap_usable_get(cw->ec->pixmap)) return;
4517 e_comp->updates = eina_list_append(e_comp->updates, cw->ec);
4519 e_comp_render_queue();
4523 e_comp_object_render_update_del(Evas_Object *obj)
4527 if (cw->ec->input_only || (!cw->updates)) return;
4528 if (!cw->update) return;
4530 /* this gets called during comp animating to clear the update flag */
4531 if (e_comp->grabbed) return;
4532 e_comp->updates = eina_list_remove(e_comp->updates, cw->ec);
4533 if (!e_comp->updates)
4535 E_FREE_FUNC(e_comp->update_job, ecore_job_del);
4536 if (e_comp->render_animator)
4537 ecore_animator_freeze(e_comp->render_animator);
4542 e_comp_object_shape_apply(Evas_Object *obj)
4546 unsigned int i, *pix, *p;
4550 if (!cw->ec) return; //NYI
4551 if (cw->external_content) return;
4554 if ((cw->ec->shape_rects_num >= 1) &&
4555 (!_e_comp_shaped_check(cw->ec->client.w, cw->ec->client.h, cw->ec->shape_rects, cw->ec->shape_rects_num)))
4560 ERR("BUGGER: shape with native surface? cw=%p", cw);
4563 evas_object_image_size_get(cw->obj, &w, &h);
4564 if ((w < 1) || (h < 1)) return;
4567 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4568 _e_comp_object_alpha_set(cw);
4569 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4570 evas_object_image_alpha_set(o, 1);
4572 p = pix = evas_object_image_data_get(cw->obj, 1);
4575 evas_object_image_data_set(cw->obj, pix);
4580 unsigned char *spix, *sp;
4582 spix = calloc(w * h, sizeof(unsigned char));
4584 for (i = 0; i < cw->ec->shape_rects_num; i++)
4588 rx = cw->ec->shape_rects[i].x; ry = cw->ec->shape_rects[i].y;
4589 rw = cw->ec->shape_rects[i].w; rh = cw->ec->shape_rects[i].h;
4590 E_RECTS_CLIP_TO_RECT(rx, ry, rw, rh, 0, 0, w, h);
4591 sp = spix + (w * ry) + rx;
4592 for (py = 0; py < rh; py++)
4594 for (px = 0; px < rw; px++)
4602 for (py = 0; py < h; py++)
4604 for (px = 0; px < w; px++)
4606 unsigned int mask, imask;
4608 mask = ((unsigned int)(*sp)) << 24;
4610 imask |= imask >> 8;
4611 imask |= imask >> 8;
4612 *p = mask | (*p & imask);
4613 //if (*sp) *p = 0xff000000 | *p;
4614 //else *p = 0x00000000;
4623 for (py = 0; py < h; py++)
4625 for (px = 0; px < w; px++)
4629 evas_object_image_data_set(cw->obj, pix);
4630 evas_object_image_data_update_add(cw->obj, 0, 0, w, h);
4631 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4633 evas_object_image_data_set(o, pix);
4634 evas_object_image_data_update_add(o, 0, 0, w, h);
4636 // don't need to fix alpha chanel as blending
4637 // should be totally off here regardless of
4638 // alpha channel content
4642 _e_comp_object_clear(E_Comp_Object *cw)
4647 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
4649 if (cw->render_update_lock.lock) return;
4652 e_pixmap_clear(cw->ec->pixmap);
4654 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4655 evas_object_image_size_set(cw->obj, 1, 1);
4656 evas_object_image_data_set(cw->obj, NULL);
4657 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4659 evas_object_image_size_set(o, 1, 1);
4660 evas_object_image_data_set(o, NULL);
4663 e_comp_object_render_update_del(cw->smart_obj);
4667 _e_comp_object_transparent_set(Evas_Object *obj, Eina_Bool set)
4671 API_ENTRY EINA_FALSE;
4673 if (cw->transparent.set == set)
4678 evas_object_color_get(obj, &r, &g, &b, &a);
4680 cw->transparent.user_r = r;
4681 cw->transparent.user_g = g;
4682 cw->transparent.user_b = b;
4683 cw->transparent.user_a = a;
4685 cw->transparent.setting = EINA_TRUE;
4686 evas_object_color_set(obj, 0, 0, 0, 0);
4687 cw->transparent.setting = EINA_FALSE;
4689 ELOGF("COMP", "Transparent enabled 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);
4696 cw->transparent.set = EINA_TRUE;
4700 cw->transparent.set = EINA_FALSE;
4702 evas_object_color_set(obj,
4703 cw->transparent.user_r,
4704 cw->transparent.user_g,
4705 cw->transparent.user_b,
4706 cw->transparent.user_a);
4708 ELOGF("COMP", "Transparent disabled user_color(%d,%d,%d,%d)",
4710 cw->transparent.user_r,
4711 cw->transparent.user_g,
4712 cw->transparent.user_b,
4713 cw->transparent.user_a);
4719 /* helper function to simplify toggling of redirection for display servers which support it */
4721 e_comp_object_redirected_set(Evas_Object *obj, Eina_Bool set)
4726 if (cw->redirected == set) return;
4727 cw->redirected = set;
4728 if (cw->external_content) return;
4730 e_comp_object_map_update(obj);
4734 if (cw->updates_exist)
4735 e_comp_object_render_update_add(obj);
4737 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4739 _e_comp_object_transparent_set(obj, EINA_FALSE);
4740 evas_object_smart_callback_call(obj, "redirected", NULL);
4744 _e_comp_object_clear(cw);
4745 _e_comp_object_transparent_set(obj, EINA_TRUE);
4746 evas_object_smart_callback_call(obj, "unredirected", NULL);
4751 _e_comp_object_cb_buffer_destroy(struct wl_listener *listener, void *data EINA_UNUSED)
4754 cw = container_of(listener, E_Comp_Object, buffer_destroy_listener);
4756 if (cw->buffer_destroy_listener.notify)
4758 cw->buffer_destroy_listener.notify = NULL;
4759 wl_list_remove(&cw->buffer_destroy_listener.link);
4762 if (e_object_is_del(E_OBJECT(cw->ec)))
4764 if (!e_object_delay_del_ref_get(E_OBJECT(cw->ec)))
4769 /* if it's current displaying buffer, do not remove its content */
4770 if (!evas_object_visible_get(cw->ec->frame))
4771 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4776 _e_comp_object_native_surface_set(E_Comp_Object *cw, Evas_Native_Surface *ns, Eina_Bool with_mirror)
4781 if (cw->buffer_destroy_listener.notify)
4783 wl_list_remove(&cw->buffer_destroy_listener.link);
4784 cw->buffer_destroy_listener.notify = NULL;
4787 if (cw->tbm_surface)
4789 tbm_surface_internal_unref(cw->tbm_surface);
4790 cw->tbm_surface = NULL;
4795 if ((ns->type == EVAS_NATIVE_SURFACE_WL) && (ns->data.wl.legacy_buffer))
4797 cw->buffer_destroy_listener.notify = _e_comp_object_cb_buffer_destroy;
4798 wl_resource_add_destroy_listener((struct wl_resource *)ns->data.wl.legacy_buffer, &cw->buffer_destroy_listener);
4800 else if ((ns->type == EVAS_NATIVE_SURFACE_TBM) && (ns->data.tbm.buffer))
4802 tbm_surface_internal_ref(ns->data.tbm.buffer);
4803 cw->tbm_surface = ns->data.tbm.buffer;
4807 TRACE_DS_BEGIN(NATIVE_SURFACE_SET);
4808 evas_object_image_native_surface_set(cw->obj, ns);
4812 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4814 evas_object_image_alpha_set(o, !!cw->ns ? 1 : cw->ec->argb);
4815 TRACE_DS_BEGIN(NATIVE_SURFACE_SET);
4816 evas_object_image_native_surface_set(o, ns);
4823 e_comp_object_native_surface_set(Evas_Object *obj, Eina_Bool set)
4825 Evas_Native_Surface ns;
4828 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
4829 if (cw->ec->input_only) return;
4830 if (cw->external_content) return;
4831 if (cw->render_update_lock.lock) return;
4834 memset(&ns, 0, sizeof(Evas_Native_Surface));
4838 /* native requires gl enabled, texture from pixmap enabled, and a non-shaped client */
4839 set = (!cw->ec->shaped);
4841 set = (!!cw->ns) || e_pixmap_native_surface_init(cw->ec->pixmap, &ns);
4845 _e_comp_object_native_surface_set(cw, set && (!cw->blanked) ? (cw->ns ? cw->ns : &ns) : NULL, EINA_TRUE);
4849 e_comp_object_native_surface_override(Evas_Object *obj, Evas_Native_Surface *ns)
4852 if (cw->ec->input_only) return;
4855 cw->ns = (Evas_Native_Surface*)eina_memdup((unsigned char*)ns, sizeof(Evas_Native_Surface), 0);
4856 _e_comp_object_alpha_set(cw);
4858 e_comp_object_native_surface_set(obj, cw->native);
4859 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4863 e_comp_object_blank(Evas_Object *obj, Eina_Bool set)
4869 if (cw->blanked == set) return;
4871 _e_comp_object_alpha_set(cw);
4874 _e_comp_object_native_surface_set(cw, NULL, EINA_FALSE);
4875 evas_object_image_data_set(cw->obj, NULL);
4879 e_comp_object_native_surface_set(obj, 1);
4880 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4884 _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)
4889 if (!_damage_trace) return;
4893 if (!evas_object_visible_get(cw->obj)) return;
4895 evas_object_geometry_get(cw->obj, &obj_x, &obj_y, NULL, NULL);
4897 o = evas_object_rectangle_add(e_comp->evas);
4898 evas_object_layer_set(o, E_LAYER_MAX);
4899 evas_object_name_set(o, "damage_trace");
4900 evas_object_move(o, dmg_x + obj_x, dmg_y + obj_y);
4901 evas_object_resize(o, dmg_w, dmg_h);
4902 evas_object_color_set(o, 0, 128, 0, 128);
4903 evas_object_render_op_set(o, EVAS_RENDER_BLEND);
4904 evas_object_pass_events_set(o, EINA_TRUE);
4905 evas_object_show(o);
4907 ELOGF("COMP", "add damage(%dx%d+%d+%d) origin(%dx%d+%d+%d)",
4909 dmg_w, dmg_h, dmg_x, dmg_y,
4910 origin->w, origin->h, origin->x, origin->y);
4912 _damage_trace_objs = eina_list_append(_damage_trace_objs, o);
4915 /* mark an object as dirty and setup damages */
4917 e_comp_object_dirty(Evas_Object *obj)
4920 Eina_Rectangle *rect;
4924 Eina_Bool dirty, visible;
4928 if (cw->external_content) return;
4929 if (!cw->redirected) return;
4930 if (cw->render_update_lock.lock)
4932 ELOGF("COMP", "Render update locked:%d", cw->ec, cw->render_update_lock.lock);
4935 /* only actually dirty if pixmap is available */
4936 if (!e_pixmap_resource_get(cw->ec->pixmap))
4938 // e_pixmap_size_get returns last attached buffer size
4939 // eventhough it is destroyed
4940 ERR("ERROR NO PIXMAP FOR ec:%p", cw->ec);
4943 dirty = e_pixmap_size_get(cw->ec->pixmap, &w, &h);
4944 visible = cw->visible;
4945 if (!dirty) w = h = 1;
4946 evas_object_image_pixels_dirty_set(cw->obj, cw->blanked ? 0 : dirty);
4948 evas_object_image_data_set(cw->obj, NULL);
4949 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
4950 evas_object_image_size_set(cw->obj, tw, th);
4951 if (cw->mask.obj) evas_object_resize(cw->mask.obj, w, h);
4952 if (cw->pending_updates)
4953 eina_tiler_area_size_set(cw->pending_updates, w, h);
4954 EINA_LIST_FOREACH(cw->obj_mirror, ll, o)
4956 evas_object_image_pixels_dirty_set(o, dirty);
4958 evas_object_image_data_set(o, NULL);
4959 evas_object_image_size_set(o, tw, th);
4960 visible |= evas_object_visible_get(o);
4964 ERR("ERROR FETCHING PIXMAP FOR %p", cw->ec);
4968 e_comp_object_native_surface_set(obj, 1);
4970 m = _e_comp_object_map_damage_transform_get(cw->ec);
4971 it = eina_tiler_iterator_new(cw->updates);
4972 EINA_ITERATOR_FOREACH(it, rect)
4974 /* evas converts damage according to rotation of ecore_evas in damage_region_set
4975 * of evas engine and doesn't convert damage according to evas_map.
4976 * so damage of evas_object_image use surface coordinate.
4980 int damage_x, damage_y, damage_w, damage_h;
4982 _e_comp_object_map_damage_transform_rect(cw->ec, m, rect->x, rect->y, rect->w, rect->h,
4983 &damage_x, &damage_y, &damage_w, &damage_h);
4984 evas_object_image_data_update_add(cw->obj, damage_x, damage_y, damage_w, damage_h);
4985 _e_comp_object_damage_trace_rect_set(obj, rect, damage_x, damage_y, damage_w, damage_h);
4989 evas_object_image_data_update_add(cw->obj, rect->x, rect->y, rect->w, rect->h);
4990 _e_comp_object_damage_trace_rect_set(obj, rect, rect->x, rect->y, rect->w, rect->h);
4993 EINA_LIST_FOREACH(cw->obj_mirror, ll, o)
4994 evas_object_image_data_update_add(o, rect->x, rect->y, rect->w, rect->h);
4995 if (cw->pending_updates)
4996 eina_tiler_rect_add(cw->pending_updates, rect);
4998 eina_iterator_free(it);
4999 if (m) e_map_free(m);
5000 if (cw->pending_updates)
5001 eina_tiler_clear(cw->updates);
5004 cw->pending_updates = cw->updates;
5005 cw->updates = eina_tiler_new(w, h);
5006 eina_tiler_tile_size_set(cw->updates, 1, 1);
5008 cw->update_count = cw->updates_full = cw->updates_exist = 0;
5009 evas_object_smart_callback_call(obj, "dirty", NULL);
5010 if (cw->visible || (!visible) || (!cw->pending_updates) || cw->native) return;
5011 /* force render if main object is hidden but mirrors are visible */
5012 RENDER_DEBUG("FORCING RENDER %p", cw->ec);
5013 e_comp_object_render(obj);
5017 e_comp_object_render(Evas_Object *obj)
5024 API_ENTRY EINA_FALSE;
5026 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5027 if (cw->ec->input_only) return EINA_TRUE;
5028 if (cw->external_content) return EINA_TRUE;
5029 if (cw->native) return EINA_FALSE;
5030 /* if comp object is not redirected state, comp object should not be set by newly committed data
5031 because image size of comp object is 1x1 and it should not be shown on canvas */
5032 if (!cw->redirected) return EINA_TRUE;
5033 if (cw->render_update_lock.lock)
5035 ELOGF("COMP", "Render update locked:%d", cw->ec, cw->render_update_lock.lock);
5038 e_comp_object_render_update_del(obj);
5039 if (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph)) return EINA_FALSE;
5041 if (!cw->pending_updates)
5043 WRN("RENDER [%p]: NO RECTS!", cw->ec);
5044 evas_object_image_data_set(cw->obj, NULL);
5045 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
5046 evas_object_image_data_set(o, NULL);
5050 evas_object_image_pixels_dirty_set(cw->obj, EINA_FALSE);
5052 RENDER_DEBUG("RENDER SIZE: %dx%d", pw, ph);
5054 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5057 e_pixmap_image_refresh(cw->ec->pixmap);
5058 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5061 if ((pix) && ((!cw->blanked) || (cw->obj_mirror)))
5062 e_pixmap_image_data_ref(cw->ec->pixmap);
5064 /* set pixel data */
5065 evas_object_image_data_set(cw->obj, cw->blanked ? NULL : pix);
5066 _e_comp_object_alpha_set(cw);
5067 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
5069 evas_object_image_data_set(o, pix);
5070 evas_object_image_alpha_set(o, evas_object_image_alpha_get(cw->obj));
5071 evas_object_image_pixels_dirty_set(o, EINA_FALSE);
5074 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
5076 e_comp_client_post_update_add(cw->ec);
5081 /* create a duplicate of an evas object */
5083 e_comp_object_util_mirror_add(Evas_Object *obj)
5087 unsigned int *pix = NULL;
5088 Eina_Bool argb = EINA_FALSE;
5093 cw = evas_object_data_get(obj, "comp_mirror");
5096 o = evas_object_image_filled_add(evas_object_evas_get(obj));
5097 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
5098 evas_object_image_smooth_scale_set(o, e_comp_config_get()->smooth_windows);
5099 evas_object_image_alpha_set(o, 1);
5100 evas_object_image_source_set(o, obj);
5103 if ((!cw->ec) || (!e_pixmap_size_get(cw->ec->pixmap, &w, &h))) return NULL;
5104 if (cw->external_content)
5106 ERR("%p of client %p is external content.", obj, cw->ec);
5109 o = evas_object_image_filled_add(evas_object_evas_get(obj));
5110 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
5111 evas_object_image_smooth_scale_set(o, e_comp_config_get()->smooth_windows);
5112 cw->obj_mirror = eina_list_append(cw->obj_mirror, o);
5113 evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, _e_comp_object_cb_mirror_del, cw);
5114 evas_object_event_callback_add(o, EVAS_CALLBACK_SHOW, _e_comp_object_cb_mirror_show, cw);
5115 evas_object_event_callback_add(o, EVAS_CALLBACK_HIDE, _e_comp_object_cb_mirror_hide, cw);
5116 evas_object_data_set(o, "E_Client_Mirror", cw->ec);
5117 evas_object_data_set(o, "comp_mirror", cw);
5119 evas_object_image_alpha_set(o, evas_object_image_alpha_get(cw->obj));
5120 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
5122 evas_object_image_size_set(o, tw, th);
5125 pix = evas_object_image_data_get(cw->obj, 0);
5131 evas_object_image_native_surface_set(o, cw->ns);
5134 Evas_Native_Surface ns;
5135 memset(&ns, 0, sizeof(Evas_Native_Surface));
5136 if (e_pixmap_native_surface_init(cw->ec->pixmap, &ns))
5137 evas_object_image_native_surface_set(o, &ns);
5142 /* FIXME: legacy code, please refer to commit 5e6831187a1 */
5143 argb = e_pixmap_image_is_argb(cw->ec->pixmap);
5145 (e_pixmap_image_exists(cw->ec->pixmap)))
5146 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5148 pix = evas_object_image_data_get(cw->obj, EINA_FALSE);
5155 dirty = evas_object_image_pixels_dirty_get(cw->obj);
5156 evas_object_image_pixels_dirty_set(o, dirty);
5157 evas_object_image_data_set(o, pix);
5158 evas_object_image_data_set(cw->obj, pix);
5160 evas_object_image_data_update_add(o, 0, 0, tw, th);
5165 //////////////////////////////////////////////////////
5168 e_comp_object_effect_allowed_get(Evas_Object *obj)
5170 API_ENTRY EINA_FALSE;
5172 if (!cw->shobj) return EINA_FALSE;
5173 if (cw->ec->override) return !e_comp_config_get()->match.disable_overrides;
5174 return !e_comp_config_get()->match.disable_borders;
5177 /* setup an api effect for a client */
5179 e_comp_object_effect_set(Evas_Object *obj, const char *effect)
5182 Eina_Stringshare *grp;
5183 E_Comp_Config *config;
5184 Eina_Bool loaded = EINA_FALSE;
5186 API_ENTRY EINA_FALSE;
5187 if (!cw->shobj) return EINA_FALSE; //input window
5189 if (!effect) effect = "none";
5190 snprintf(buf, sizeof(buf), "e/comp/effects/%s", effect);
5192 config = e_comp_config_get();
5193 if ((config) && (config->effect_file))
5195 if (edje_object_file_set(cw->effect_obj, config->effect_file, buf))
5197 cw->effect_set = EINA_TRUE;
5204 edje_object_file_get(cw->effect_obj, NULL, &grp);
5205 cw->effect_set = !eina_streq(effect, "none");
5206 if (!e_util_strcmp(buf, grp)) return cw->effect_set;
5207 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", buf))
5209 snprintf(buf, sizeof(buf), "e/comp/effects/auto/%s", effect);
5210 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", buf))
5211 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", "e/comp/effects/none"))
5213 if (cw->effect_running)
5215 if (!e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb")))
5218 cw->effect_set = EINA_FALSE;
5219 return cw->effect_set;
5223 if (cw->effect_running)
5225 if (!e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb")))
5228 ELOGF("COMP", "EFFECT Set GROUP[%s]", cw->ec, buf);
5229 edje_object_part_swallow(cw->effect_obj, "e.swallow.content", cw->shobj);
5230 if (cw->effect_clip)
5232 evas_object_clip_unset(cw->clip);
5233 cw->effect_clip = 0;
5235 cw->effect_clip_able = !edje_object_data_get(cw->effect_obj, "noclip");
5237 _e_comp_object_dim_update(cw);
5239 return cw->effect_set;
5242 /* set params for embryo scripts in effect */
5244 e_comp_object_effect_params_set(Evas_Object *obj, int id, int *params, unsigned int count)
5246 Edje_Message_Int_Set *msg;
5250 EINA_SAFETY_ON_NULL_RETURN(params);
5251 EINA_SAFETY_ON_FALSE_RETURN(count);
5252 if (!cw->effect_set) return;
5254 msg = alloca(sizeof(Edje_Message_Int_Set) + ((count - 1) * sizeof(int)));
5255 msg->count = (int)count;
5256 for (x = 0; x < count; x++)
5257 msg->val[x] = params[x];
5258 edje_object_message_send(cw->effect_obj, EDJE_MESSAGE_INT_SET, id, msg);
5259 edje_object_message_signal_process(cw->effect_obj);
5263 _e_comp_object_effect_end_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
5265 Edje_Signal_Cb end_cb;
5267 E_Comp_Object *cw = data;
5269 edje_object_signal_callback_del_full(obj, "e,action,done", "e", _e_comp_object_effect_end_cb, NULL);
5270 cw->effect_running = 0;
5271 if (!_e_comp_object_animating_end(cw)) return;
5273 if (evas_object_data_get(cw->smart_obj, "effect_running"))
5275 evas_object_data_del(cw->smart_obj, "effect_running");
5276 _e_comp_object_event_simple(obj, E_EVENT_COMP_OBJECT_EFFECT_END);
5277 e_comp_visibility_calculation_set(EINA_TRUE);
5280 end_cb = evas_object_data_get(obj, "_e_comp.end_cb");
5281 if (!end_cb) return;
5282 end_data = evas_object_data_get(obj, "_e_comp.end_data");
5283 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_END, cw->ec);
5284 end_cb(end_data, cw->smart_obj, emission, source);
5287 /* clip effect to client's zone */
5289 e_comp_object_effect_clip(Evas_Object *obj)
5293 zone = e_comp_zone_find_by_ec(cw->ec);
5295 if (cw->effect_clip) e_comp_object_effect_unclip(cw->smart_obj);
5296 if (!cw->effect_clip_able) return;
5297 evas_object_clip_set(cw->smart_obj, zone->bg_clip_object);
5298 cw->effect_clip = 1;
5301 /* unclip effect from client's zone */
5303 e_comp_object_effect_unclip(Evas_Object *obj)
5306 if (!cw->effect_clip) return;
5307 evas_object_clip_unset(cw->smart_obj);
5308 cw->effect_clip = 0;
5311 /* start effect, running end_cb after */
5313 e_comp_object_effect_start(Evas_Object *obj, Edje_Signal_Cb end_cb, const void *end_data)
5315 API_ENTRY EINA_FALSE;
5316 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE); //NYI
5317 if (!cw->effect_set) return EINA_FALSE;
5319 if (cw->effect_running)
5321 e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb"));
5324 e_comp_object_effect_clip(obj);
5325 edje_object_signal_callback_del(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb);
5327 edje_object_signal_callback_add(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb, cw);
5328 evas_object_data_set(cw->effect_obj, "_e_comp.end_cb", end_cb);
5329 evas_object_data_set(cw->effect_obj, "_e_comp.end_data", end_data);
5330 evas_object_data_set(cw->smart_obj, "effect_running", (void*)1);
5332 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_START, cw->ec);
5333 _e_comp_object_event_simple(obj, E_EVENT_COMP_OBJECT_EFFECT_START);
5335 edje_object_signal_emit(cw->effect_obj, "e,action,go", "e");
5336 _e_comp_object_animating_begin(cw);
5337 cw->effect_running = 1;
5341 /* stop a currently-running effect immediately */
5343 e_comp_object_effect_stop(Evas_Object *obj, Edje_Signal_Cb end_cb)
5346 Edje_Signal_Cb end_cb_before = NULL;
5347 void *end_data_before = NULL;
5348 API_ENTRY EINA_FALSE;
5350 end_cb_before = evas_object_data_get(cw->effect_obj, "_e_comp.end_cb");
5351 end_data_before = evas_object_data_get(cw->effect_obj, "_e_comp.end_data");
5353 if (end_cb_before != end_cb) return EINA_TRUE;
5354 e_comp_object_effect_unclip(obj);
5355 if (cw->effect_clip)
5357 evas_object_clip_unset(cw->effect_obj);
5358 cw->effect_clip = 0;
5360 edje_object_signal_emit(cw->effect_obj, "e,action,stop", "e");
5361 edje_object_signal_callback_del_full(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb, cw);
5363 if (evas_object_data_get(cw->smart_obj, "effect_running"))
5365 evas_object_data_del(cw->smart_obj, "effect_running");
5366 e_comp_visibility_calculation_set(EINA_TRUE);
5369 cw->effect_running = 0;
5370 ret = _e_comp_object_animating_end(cw);
5372 if ((ret) && (end_cb_before))
5374 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_END, cw->ec);
5375 end_cb_before(end_data_before, cw->smart_obj, "e,action,done", "e");
5382 _e_comp_object_effect_mover_sort_cb(E_Comp_Object_Mover *a, E_Comp_Object_Mover *b)
5384 return a->pri - b->pri;
5387 /* add a function to trigger based on signal emissions for the purpose of modifying effects */
5388 E_API E_Comp_Object_Mover *
5389 e_comp_object_effect_mover_add(int pri, const char *sig, E_Comp_Object_Mover_Cb provider, const void *data)
5391 E_Comp_Object_Mover *prov;
5393 prov = E_NEW(E_Comp_Object_Mover, 1);
5394 EINA_SAFETY_ON_NULL_RETURN_VAL(prov, NULL);
5395 prov->func = provider;
5396 prov->data = (void*)data;
5399 _e_comp_object_movers = eina_inlist_sorted_insert(_e_comp_object_movers, EINA_INLIST_GET(prov),
5400 (Eina_Compare_Cb)_e_comp_object_effect_mover_sort_cb);
5405 e_comp_object_effect_mover_del(E_Comp_Object_Mover *prov)
5407 EINA_SAFETY_ON_NULL_RETURN(prov);
5408 _e_comp_object_movers = eina_inlist_remove(_e_comp_object_movers, EINA_INLIST_GET(prov));
5413 e_comp_object_effect_object_get(Evas_Object *obj)
5417 return cw->effect_obj;
5421 e_comp_object_effect_hiding_set(Evas_Object *obj, Eina_Bool set)
5423 API_ENTRY EINA_FALSE;
5424 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5425 if (!cw->effect_set) return EINA_FALSE;
5432 ////////////////////////////////////
5435 _e_comp_object_autoclose_cleanup(Eina_Bool already_del)
5437 if (e_comp->autoclose.obj)
5439 e_comp_ungrab_input(0, 1);
5440 if (e_comp->autoclose.del_cb)
5441 e_comp->autoclose.del_cb(e_comp->autoclose.data, e_comp->autoclose.obj);
5442 else if (!already_del)
5444 evas_object_hide(e_comp->autoclose.obj);
5445 E_FREE_FUNC(e_comp->autoclose.obj, evas_object_del);
5447 E_FREE_FUNC(e_comp->autoclose.rect, evas_object_del);
5449 e_comp->autoclose.obj = NULL;
5450 e_comp->autoclose.data = NULL;
5451 e_comp->autoclose.del_cb = NULL;
5452 e_comp->autoclose.key_cb = NULL;
5453 E_FREE_FUNC(e_comp->autoclose.key_handler, ecore_event_handler_del);
5457 _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)
5459 _e_comp_object_autoclose_cleanup(0);
5463 _e_comp_object_autoclose_setup(Evas_Object *obj)
5465 if (!e_comp->autoclose.rect)
5467 /* create rect just below autoclose object to catch mouse events */
5468 e_comp->autoclose.rect = evas_object_rectangle_add(e_comp->evas);
5469 evas_object_move(e_comp->autoclose.rect, 0, 0);
5470 evas_object_resize(e_comp->autoclose.rect, e_comp->w, e_comp->h);
5471 evas_object_show(e_comp->autoclose.rect);
5472 evas_object_name_set(e_comp->autoclose.rect, "e_comp->autoclose.rect");
5473 evas_object_color_set(e_comp->autoclose.rect, 0, 0, 0, 0);
5474 evas_object_event_callback_add(e_comp->autoclose.rect, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_autoclose_mouse_up_cb, e_comp);
5475 e_comp_grab_input(0, 1);
5477 evas_object_layer_set(e_comp->autoclose.rect, evas_object_layer_get(obj) - 1);
5478 evas_object_focus_set(obj, 1);
5482 _e_comp_object_autoclose_show(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
5484 _e_comp_object_autoclose_setup(obj);
5485 evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show);
5489 _e_comp_object_autoclose_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
5491 evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show);
5492 _e_comp_object_autoclose_cleanup(1);
5493 if (e_client_focused_get()) return;
5495 E_Zone *zone = e_zone_current_get();
5498 e_zone_focus_reset(zone);
5502 e_comp_object_util_autoclose(Evas_Object *obj, E_Comp_Object_Autoclose_Cb del_cb, E_Comp_Object_Key_Cb cb, const void *data)
5506 if (e_comp->autoclose.obj)
5508 if (e_comp->autoclose.obj == obj) return;
5509 evas_object_event_callback_del_full(e_comp->autoclose.obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5510 e_comp->autoclose.obj = obj;
5511 e_comp->autoclose.del_cb = del_cb;
5512 e_comp->autoclose.key_cb = cb;
5513 e_comp->autoclose.data = (void*)data;
5514 if (evas_object_visible_get(obj))
5515 _e_comp_object_autoclose_setup(obj);
5517 evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show, e_comp);
5518 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5521 e_comp->autoclose.obj = obj;
5522 e_comp->autoclose.del_cb = del_cb;
5523 e_comp->autoclose.key_cb = cb;
5524 e_comp->autoclose.data = (void*)data;
5525 if (evas_object_visible_get(obj))
5526 _e_comp_object_autoclose_setup(obj);
5528 evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show, e_comp);
5529 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5533 e_comp_object_is_animating(Evas_Object *obj)
5537 return cw->animating;
5541 e_comp_object_alpha_set(Evas_Object *obj, Eina_Bool alpha)
5545 if ((cw->external_content) &&
5546 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
5548 WRN("Can set up alpha value to ONLY evas \"image\" object. "
5549 "But current external content is %d object for %p.",
5550 cw->content_type, cw->ec);
5554 cw->user_alpha_set = EINA_TRUE;
5555 cw->user_alpha = alpha;
5557 if (!cw->obj) return;
5559 if (alpha == evas_object_image_alpha_get(cw->obj)) return;
5561 evas_object_image_alpha_set(cw->obj, alpha);
5563 if ((!cw->native) && (!cw->external_content))
5564 evas_object_image_data_set(cw->obj, NULL);
5568 e_comp_object_alpha_get(Evas_Object *obj)
5570 API_ENTRY EINA_FALSE;
5572 return evas_object_image_alpha_get(cw->obj);
5576 e_comp_object_mask_set(Evas_Object *obj, Eina_Bool set)
5578 Eina_Bool mask_set = EINA_FALSE;
5582 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5583 if (cw->ec->input_only) return;
5590 o = evas_object_rectangle_add(e_comp->evas);
5591 evas_object_color_set(o, 0, 0, 0, 0);
5592 evas_object_clip_set(o, cw->clip);
5593 evas_object_smart_member_add(o, obj);
5594 evas_object_move(o, 0, 0);
5595 evas_object_resize(o, cw->w, cw->h);
5596 /* save render op value to restore when clear a mask.
5598 * NOTE: DO NOT change the render op on ec->frame while mask object
5599 * is set. it will overwrite the changed op value. */
5600 cw->mask.saved_render_op = evas_object_render_op_get(obj);
5601 evas_object_render_op_set(obj, EVAS_RENDER_COPY);
5602 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5603 if (cw->visible) evas_object_show(o);
5606 evas_object_name_set(cw->mask.obj, "cw->mask_obj");
5607 ELOGF("COMP", " |mask_obj", cw->ec);
5608 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_MASK_OBJECT_SET, cw->ec);
5615 evas_object_smart_member_del(cw->mask.obj);
5616 E_FREE_FUNC(cw->mask.obj, evas_object_del);
5618 evas_object_render_op_set(obj, cw->mask.saved_render_op);
5619 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET, cw->ec);
5625 e_comp_object_mask_has(Evas_Object *obj)
5627 API_ENTRY EINA_FALSE;
5629 return (cw->mask.obj) ? EINA_TRUE : EINA_FALSE;
5633 e_comp_object_size_update(Evas_Object *obj, int w, int h)
5638 if ((cw->external_content) &&
5639 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
5641 WRN("Can set up size to ONLY evas \"image\" object. "
5642 "But current external content is %d object for %p.",
5643 cw->content_type, cw->ec);
5647 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
5649 evas_object_image_size_set(cw->obj, tw, th);
5653 e_comp_object_transform_bg_set(Evas_Object *obj, Eina_Bool set)
5655 Eina_Bool transform_set = EINA_FALSE;
5657 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5658 if (cw->ec->input_only) return;
5660 transform_set = !!set;
5664 if (!cw->transform_bg_obj)
5666 Evas_Object *o = evas_object_rectangle_add(e_comp->evas);
5667 evas_object_move(o, 0, 0);
5668 evas_object_resize(o, 1, 1);
5669 if (cw->transform_bg_color.a >= 255)
5670 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5672 evas_object_render_op_set(o, EVAS_RENDER_BLEND);
5673 evas_object_color_set(o,
5674 cw->transform_bg_color.r,
5675 cw->transform_bg_color.g,
5676 cw->transform_bg_color.b,
5677 cw->transform_bg_color.a);
5678 if (cw->visible) evas_object_show(o);
5680 cw->transform_bg_obj = o;
5681 evas_object_name_set(cw->transform_bg_obj, "cw->transform_bg_obj");
5683 #ifdef REFACTOR_DESK_AREA
5684 e_comp_object_transform_obj_stack_update(obj);
5686 _e_comp_object_transform_obj_stack_update(obj);
5691 if (cw->transform_bg_obj)
5693 evas_object_smart_member_del(cw->transform_bg_obj);
5694 E_FREE_FUNC(cw->transform_bg_obj, evas_object_del);
5700 e_comp_object_transform_bg_color_set(Evas_Object *obj, int r, int g, int b, int a)
5704 cw->transform_bg_color.r = r;
5705 cw->transform_bg_color.g = g;
5706 cw->transform_bg_color.b = b;
5707 cw->transform_bg_color.a = a;
5709 if (cw->transform_bg_obj)
5711 evas_object_color_set(cw->transform_bg_obj,
5712 cw->transform_bg_color.r,
5713 cw->transform_bg_color.g,
5714 cw->transform_bg_color.b,
5715 cw->transform_bg_color.a);
5720 e_comp_object_transform_bg_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
5723 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5724 if (cw->ec->input_only) return;
5725 if (!cw->transform_bg_obj) return;
5727 _e_comp_object_transform_obj_map_set(cw->transform_bg_obj, vertices);
5731 e_comp_object_transform_bg_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
5734 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5735 if (cw->ec->input_only) return;
5736 if (!cw->transform_bg_obj) return;
5738 _e_comp_object_transform_obj_map_set_with_zoom(cw->transform_bg_obj, vertices, zoom);
5742 e_comp_object_transform_transp_set(Evas_Object *obj, Eina_Bool set)
5744 Eina_Bool transform_set = EINA_FALSE;
5746 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5747 if (cw->ec->input_only) return;
5749 transform_set = !!set;
5753 if (!cw->transform_tranp_obj)
5755 Evas_Object *o = evas_object_rectangle_add(e_comp->evas);
5756 evas_object_move(o, 0, 0);
5757 evas_object_resize(o, 1, 1);
5758 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5759 evas_object_color_set(o, 0, 0, 0, 0);
5760 if (cw->visible) evas_object_show(o);
5762 cw->transform_tranp_obj = o;
5763 evas_object_pass_events_set(cw->transform_tranp_obj, EINA_TRUE);
5764 ELOGF("TRANSFORM","transform set: TRUE", cw->ec);
5765 evas_object_name_set(cw->transform_tranp_obj, "cw->transform_trasp_obj");
5767 #ifdef REFACTOR_DESK_AREA
5768 e_comp_object_transform_obj_stack_update(obj);
5770 _e_comp_object_transform_obj_stack_update(obj);
5775 if (cw->transform_tranp_obj)
5777 ELOGF("TRANSFORM","transform set: FALSE", cw->ec);
5778 evas_object_smart_member_del(cw->transform_tranp_obj);
5779 E_FREE_FUNC(cw->transform_tranp_obj, evas_object_del);
5785 e_comp_object_transform_transp_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
5788 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5789 if (cw->ec->input_only) return;
5790 if (!cw->transform_tranp_obj) return;
5792 _e_comp_object_transform_obj_map_set(cw->transform_tranp_obj, vertices);
5796 e_comp_object_transform_transp_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
5799 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5800 if (cw->ec->input_only) return;
5801 if (!cw->transform_tranp_obj) return;
5803 _e_comp_object_transform_obj_map_set_with_zoom(cw->transform_tranp_obj, vertices, zoom);
5806 #ifdef REFACTOR_DESK_AREA
5809 e_comp_object_layer_update(Evas_Object *obj,
5810 Evas_Object *above, Evas_Object *below)
5812 E_Comp_Object *cw2 = NULL;
5813 Evas_Object *o = NULL;
5818 if (cw->ec->layer_block) return;
5819 if ((above) && (below))
5821 ERR("Invalid layer update request! cw=%p", cw);
5829 layer = evas_object_layer_get(o);
5830 cw2 = evas_object_data_get(o, "comp_obj");
5833 if (!e_util_strcmp(evas_object_name_get(o), "layer_obj")) break;
5835 o = evas_object_above_get(o);
5836 if ((!o) || (o == cw->smart_obj)) break;
5837 if (evas_object_layer_get(o) != layer)
5839 o = e_comp->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_ALERT)].obj;
5844 ec = e_client_top_get();
5845 if (ec) o = ec->frame;
5848 if (o) cw2 = evas_object_data_get(o, "comp_obj");
5852 _e_comp_object_layers_remove(cw);
5855 if (cw2->layer > cw->layer)
5856 _e_comp_object_layers_add(cw, NULL, NULL, 0);
5857 else if (cw2->layer == cw->layer)
5860 _e_comp_object_layers_add(cw, cw2, NULL, 0);
5862 _e_comp_object_layers_add(cw, NULL, NULL, above? 0 : 1);
5864 _e_comp_object_layers_add(cw, NULL, cw2, 0);
5867 _e_comp_object_layers_add(cw, NULL, NULL, 1);
5870 _e_comp_object_layers_add(cw, NULL, NULL, 0);
5875 e_comp_object_layer_get(Evas_Object *obj)
5882 e_comp_object_content_set(Evas_Object *obj,
5883 Evas_Object *content,
5884 E_Comp_Object_Content_Type type)
5886 API_ENTRY EINA_FALSE;
5888 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5889 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec->pixmap, EINA_FALSE);
5890 EINA_SAFETY_ON_NULL_RETURN_VAL(content, EINA_FALSE);
5894 ERR("Can't set e.swallow.content to requested content. "
5895 "Previous comp object should not be changed at all.");
5899 if (e_pixmap_usable_get(cw->ec->pixmap)) return EINA_FALSE;
5901 if ((type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE) &&
5902 (type != E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE))
5904 ERR("Content type %d for %p is not supported ec:%p pixmap:%p",
5905 type, content, cw->ec, cw->ec->pixmap);
5909 cw->external_content = EINA_TRUE;
5912 cw->content_type = type;
5913 e_util_size_debug_set(cw->obj, 1);
5914 evas_object_name_set(cw->obj, "cw->obj");
5915 _e_comp_object_alpha_set(cw);
5918 _e_comp_object_shadow_setup(cw);
5920 wl_signal_emit(&cw->events.content_type_set, NULL);
5926 e_comp_object_content_unset(Evas_Object *obj)
5928 API_ENTRY EINA_FALSE;
5930 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5931 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec->pixmap, EINA_FALSE);
5933 if (!cw->obj && !cw->ec->visible)
5935 ELOGF("COMP", "is not visible yet. no need to unset", cw->ec);
5939 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE)
5941 ELOGF("COMP", "has been set to internal image object already", cw->ec);
5947 if (cw->frame_object)
5948 edje_object_part_unswallow(cw->frame_object, cw->obj);
5950 edje_object_part_unswallow(cw->shobj, cw->obj);
5952 evas_object_del(cw->obj);
5953 evas_object_hide(cw->obj);
5957 cw->external_content = EINA_FALSE;
5958 if (cw->ec->is_cursor)
5961 DBG("%p is cursor surface..", cw->ec);
5962 if (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph))
5964 evas_object_resize(cw->ec->frame, pw, ph);
5965 evas_object_hide(cw->ec->frame);
5970 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE;
5971 cw->obj = evas_object_image_filled_add(e_comp->evas);
5972 evas_object_image_border_center_fill_set(cw->obj, EVAS_BORDER_FILL_SOLID);
5973 e_util_size_debug_set(cw->obj, 1);
5974 evas_object_image_pixels_get_callback_set(cw->obj, _e_comp_object_pixels_get, cw);
5975 evas_object_image_pixels_noti_callback_set(cw->obj, _e_comp_object_pixels_noti, cw);
5976 evas_object_image_smooth_scale_set(cw->obj, e_comp_config_get()->smooth_windows);
5977 evas_object_name_set(cw->obj, "cw->obj");
5978 evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888);
5979 evas_object_intercept_color_set_callback_add(obj, _e_comp_intercept_obj_color_set, cw);
5980 _e_comp_object_alpha_set(cw);
5983 _e_comp_object_shadow_setup(cw);
5988 _e_comp_intercept_show_helper(cw);
5992 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
5993 e_comp_object_dirty(cw->smart_obj);
5994 e_comp_object_render(cw->smart_obj);
5995 e_comp_object_render_update_add(obj);
5997 wl_signal_emit(&cw->events.content_type_set, NULL);
6002 EINTERN Evas_Object *
6003 e_comp_object_content_get(Evas_Object *obj)
6007 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, NULL);
6009 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE)
6011 ELOGF("COMP", "has been set to internal image object. couldn't return internal image object", cw->ec);
6018 E_API E_Comp_Object_Content_Type
6019 e_comp_object_content_type_get(Evas_Object *obj)
6021 API_ENTRY E_COMP_OBJECT_CONTENT_TYPE_NONE;
6023 return cw->content_type;
6027 e_comp_object_dim_mask_update(Evas_Object *obj, Eina_Bool mask_set, int x, int y, int w, int h)
6030 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
6031 E_Comp_Config *conf = e_comp_config_get();
6032 if (cw->ec->input_only) return;
6033 if (!conf->dim_rect_enable) return;
6035 cw->dim.mask_set = mask_set;
6041 if (!cw->dim.enable) return;
6042 e_comp_object_dim_mask_set(cw->ec->frame, mask_set);
6046 e_comp_object_dim_mask_set(Evas_Object *obj, Eina_Bool set)
6048 Eina_Bool mask_set = EINA_FALSE;
6052 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
6053 E_Comp_Config *conf = e_comp_config_get();
6054 if (cw->ec->input_only) return;
6055 if (!conf->dim_rect_enable) return;
6061 if (cw->dim.mask_obj)
6063 evas_object_smart_member_del(cw->dim.mask_obj);
6064 E_FREE_FUNC(cw->dim.mask_obj, evas_object_del);
6067 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);
6068 o = evas_object_rectangle_add(e_comp->evas);
6069 evas_object_color_set(o, 0, 0, 0, 0);
6070 evas_object_smart_member_add(o, obj);
6071 evas_object_resize(o, cw->dim.mask_w, cw->dim.mask_h);
6072 evas_object_move(o, cw->dim.mask_x, cw->dim.mask_y);
6074 evas_object_render_op_set(o, EVAS_RENDER_COPY);
6075 if (cw->visible) evas_object_show(o);
6077 cw->dim.mask_obj = o;
6078 evas_object_name_set(cw->dim.mask_obj, "cw->dim_mask_obj");
6080 evas_object_layer_set(cw->dim.mask_obj, 9998);
6084 if (cw->dim.mask_obj)
6086 ELOGF("COMP", "DIM |Mask on Dim rect Removed", cw->ec);
6087 evas_object_smart_member_del(cw->dim.mask_obj);
6088 E_FREE_FUNC(cw->dim.mask_obj, evas_object_del);
6094 e_comp_object_dim_client_set(E_Client *ec)
6096 E_Comp_Config *conf = e_comp_config_get();
6098 if (!conf->dim_rect_enable) return ;
6099 if (dim_client == ec) return;
6101 Eina_Bool prev_dim = EINA_FALSE;
6102 ELOGF("COMP", "DIM |Client Set %p -> %p", ec, dim_client, ec);
6104 if (dim_client && _e_comp_object_dim_enable_get(dim_client, dim_client->frame))
6105 prev_dim = EINA_TRUE;
6107 if (prev_dim && dim_client->visible && ec)
6109 _e_comp_object_dim_enable_set(dim_client, dim_client->frame, EINA_FALSE, EINA_TRUE);
6110 _e_comp_object_dim_enable_set(ec, ec->frame, EINA_TRUE, EINA_TRUE);
6114 if (prev_dim) _e_comp_object_dim_enable_set(dim_client, dim_client->frame, EINA_FALSE, EINA_FALSE);
6115 if (ec) _e_comp_object_dim_enable_set(ec, ec->frame, EINA_TRUE, EINA_FALSE);
6121 e_comp_object_dim_client_get(void)
6123 E_Comp_Config *conf = e_comp_config_get();
6125 if (!conf->dim_rect_enable ) return NULL;
6131 _e_comp_object_dim_enable_set(E_Client *ec, Evas_Object *obj, Eina_Bool enable, Eina_Bool noeffect)
6134 char emit[32] = "\0";
6135 E_Comp_Config *conf = e_comp_config_get();
6138 if (!conf->dim_rect_enable) return;
6139 if (!cw->effect_obj) return;
6140 if (enable == cw->dim.enable) return;
6142 ELOGF("COMP", "DIM |set on Client [%d]", ec, enable);
6143 if (noeffect || !conf->dim_rect_effect)
6145 strncpy(emit, (enable ? "e,state,dim,on,noeffect" : "e,state,dim,off,noeffect"), sizeof(emit) - 1);
6149 strncpy(emit, (enable ? "e,state,dim,on" : "e,state,dim,off"), sizeof(emit) - 1);
6152 cw->dim.enable = enable;
6154 if (cw->dim.mask_set && !enable)
6156 e_comp_object_dim_mask_set(cw->ec->frame, enable);
6157 edje_object_signal_emit(cw->effect_obj, emit, "e");
6159 else if (cw->dim.mask_set && enable)
6161 edje_object_signal_emit(cw->effect_obj, emit, "e");
6162 e_comp_object_dim_mask_set(cw->ec->frame, enable);
6166 edje_object_signal_emit(cw->effect_obj, emit, "e");
6171 _e_comp_object_dim_enable_get(E_Client *ec, Evas_Object *obj)
6173 API_ENTRY EINA_FALSE;
6174 E_Comp_Config *conf = e_comp_config_get();
6176 if (!ec) return EINA_FALSE;
6177 if (!conf->dim_rect_enable) return EINA_FALSE;
6179 if (cw->dim.enable) return EINA_TRUE;
6185 _e_comp_object_dim_update(E_Comp_Object *cw)
6187 E_Comp_Config *conf = e_comp_config_get();
6190 if (!conf->dim_rect_enable) return;
6191 if (!cw->effect_obj) return;
6194 edje_object_signal_emit(cw->effect_obj, (cw->dim.enable ? "e,state,dim,on,noeffect" : "e,state,dim,off,noeffect"), "e");
6195 ELOGF("COMP", "DIM |Applied on Client dim.enable[%d]", cw->ec, cw->dim.enable);
6197 if (cw->dim.mask_set)
6199 e_comp_object_dim_mask_set(cw->ec->frame, cw->dim.mask_set);
6205 e_comp_object_clear(Evas_Object *obj)
6209 _e_comp_object_clear(cw);
6213 e_comp_object_hwc_update_exists(Evas_Object *obj)
6215 API_ENTRY EINA_FALSE;
6216 return cw->hwc_need_update;
6221 e_comp_object_hwc_update_set(Evas_Object *obj, Eina_Bool set)
6224 cw->hwc_need_update = set;
6228 e_comp_object_effect_object_part_swallow(Evas_Object *obj, const char *part_name, Evas_Object *swallow_obj)
6230 API_ENTRY EINA_FALSE;
6231 return edje_object_part_swallow(cw->effect_obj, part_name, swallow_obj);
6235 e_comp_object_indicator_swallow(Evas_Object *obj, Evas_Object *indicator)
6238 if (cw->indicator.obj != indicator)
6239 edje_object_part_unswallow(cw->shobj, cw->indicator.obj);
6240 cw->indicator.obj = indicator;
6241 edje_object_part_swallow(cw->shobj, "e.swallow.indicator", indicator);
6245 e_comp_object_indicator_unswallow(Evas_Object *obj, Evas_Object *indicator)
6248 if (cw->indicator.obj != indicator) return;
6249 cw->indicator.obj = NULL;
6250 edje_object_part_unswallow(cw->shobj, indicator);
6254 e_comp_object_indicator_size_set(Evas_Object *obj, int w, int h)
6257 Edje_Message_Int_Set *msg;
6259 if (!cw->indicator.obj) return;
6261 cw->indicator.w = w;
6262 cw->indicator.h = h;
6264 if (!cw->shobj) return;
6266 msg = alloca(sizeof(Edje_Message_Int_Set) + (sizeof(int)));
6270 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT_SET, 0, msg);
6271 edje_object_message_signal_process(cw->shobj);
6274 /* buffer transform and scale are applied to e_comp_object and e_pixmap internaly */
6276 e_comp_object_map_update(Evas_Object *obj)
6279 E_Client *ec = cw->ec;
6280 E_Comp_Wl_Client_Data *cdata;
6282 int x1, y1, x2, y2, x, y, bw, bh, tw, th;
6285 int l, remain = sizeof buffer;
6288 if (e_object_is_del(E_OBJECT(ec))) return;
6289 cdata = e_client_cdata_get(ec);
6292 /* if buffer had been flushed, buffer could be NULL. Then map will be applied
6293 * when new buffer is attached.
6295 if (!cdata->buffer_ref.buffer) return;
6297 if ((!cw->redirected) ||
6298 (e_client_video_hw_composition_check(ec)) ||
6299 (!e_comp_wl_output_buffer_transform_get(ec) &&
6300 cdata->scaler.buffer_viewport.buffer.scale == 1))
6302 if (evas_object_map_enable_get(cw->effect_obj))
6304 ELOGF("TRANSFORM", "map: disable", cw->ec);
6305 evas_object_map_enable_set(cw->effect_obj, EINA_FALSE);
6306 _e_comp_object_map_transform_rect(cw->ec, 0, 0, cw->w, cw->h, NULL, NULL, &tw, &th);
6307 evas_object_resize(cw->effect_obj, tw, th);
6314 EINA_SAFETY_ON_NULL_RETURN(map);
6316 e_pixmap_size_get(ec->pixmap, &bw, &bh);
6322 e_map_util_points_populate_from_geometry(map, ec->x, ec->y, bw, bh, 0);
6324 _e_comp_object_map_transform_pos(ec, x1, y1, &x, &y);
6325 e_map_point_image_uv_set(map, 0, x, y);
6326 l = snprintf(p, remain, "%d,%d", x, y);
6327 p += l, remain -= l;
6329 _e_comp_object_map_transform_pos(ec, x2, y1, &x, &y);
6330 e_map_point_image_uv_set(map, 1, x, y);
6331 l = snprintf(p, remain, " %d,%d", x, y);
6332 p += l, remain -= l;
6334 _e_comp_object_map_transform_pos(ec, x2, y2, &x, &y);
6335 e_map_point_image_uv_set(map, 2, x, y);
6336 l = snprintf(p, remain, " %d,%d", x, y);
6337 p += l, remain -= l;
6339 _e_comp_object_map_transform_pos(ec, x1, y2, &x, &y);
6340 e_map_point_image_uv_set(map, 3, x, y);
6341 l = snprintf(p, remain, " %d,%d", x, y);
6342 p += l, remain -= l;
6344 ELOGF("TRANSFORM", "map: point(%d,%d %dx%d) uv(%d,%d %d,%d %d,%d %d,%d=>%s)",
6346 ec->x, ec->y, bw, bh, x1, y1, x2, y1, x2, y2, x1, y2, buffer);
6348 e_comp_object_map_set(cw->effect_obj, map);
6349 e_comp_object_map_enable_set(cw->effect_obj, EINA_TRUE);
6353 /* if there's screen rotation with comp mode, then ec->effect_obj and
6354 * ec->obj should rotate. if not, in evas_map, update region is clipped.
6356 _e_comp_object_map_transform_rect(cw->ec, 0, 0, bw, bh, NULL, NULL, &tw, &th);
6357 evas_object_resize(cw->effect_obj, tw, th);
6361 e_comp_object_render_trace_set(Evas_Object *obj, Eina_Bool set)
6363 API_ENTRY EINA_FALSE;
6365 cw->render_trace = set;
6371 e_comp_object_native_usable_get(Evas_Object *obj)
6373 API_ENTRY EINA_FALSE;
6374 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6376 if (cw->ec->input_only) return EINA_FALSE;
6377 if (cw->external_content) return EINA_FALSE;
6378 if (e_comp_object_content_type_get(cw->ec->frame) != E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE) return EINA_FALSE;
6380 /* just return true value, if it is normal case */
6381 if (e_pixmap_usable_get(cw->ec->pixmap)) return EINA_TRUE;
6384 Evas_Native_Surface *ns;
6385 ns = evas_object_image_native_surface_get(cw->obj);
6387 /* client pixmap is not usable but cw->obj is drawable due to it holds valid native surface*/
6390 ELOGF("COMP", "Client pixmap is Not usable but still holds valid native surface", cw->ec);
6398 e_comp_object_image_filter_set(Evas_Object *obj, E_Comp_Image_Filter filter)
6400 API_ENTRY EINA_FALSE;
6401 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6402 if (e_object_is_del(E_OBJECT(cw->ec))) return EINA_FALSE;
6403 if (!e_client_cdata_get(cw->ec)) return EINA_FALSE;
6405 if (cw->image_filter == filter) return EINA_TRUE;
6409 case E_COMP_IMAGE_FILTER_BLUR:
6410 efl_gfx_filter_program_set(cw->obj, "blur (20) padding_set (0)", "image_filter");
6412 case E_COMP_IMAGE_FILTER_GRAYSCALE:
6413 efl_gfx_filter_program_set(cw->obj, "grayscale ()", "image_filter");
6415 case E_COMP_IMAGE_FILTER_INVERSE:
6416 efl_gfx_filter_program_set(cw->obj, "inverse_color ()", "image_filter");
6418 case E_COMP_IMAGE_FILTER_NONE:
6420 efl_gfx_filter_program_set(cw->obj, NULL, "image_filter");
6424 cw->image_filter = filter;
6426 wl_signal_emit(&cw->events.image_filter_set, NULL);
6431 EINTERN E_Comp_Image_Filter
6432 e_comp_object_image_filter_get(Evas_Object *obj)
6434 API_ENTRY E_COMP_IMAGE_FILTER_NONE;
6435 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, E_COMP_IMAGE_FILTER_NONE);
6436 if (e_object_is_del(E_OBJECT(cw->ec))) return E_COMP_IMAGE_FILTER_NONE;
6437 if (!e_client_cdata_get(cw->ec)) return E_COMP_IMAGE_FILTER_NONE;
6439 return cw->image_filter;
6443 _e_comp_object_damage_trace_render_pre_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
6447 if (!_damage_trace) return;
6449 EINA_LIST_FREE(_damage_trace_post_objs, obj)
6450 evas_object_del(obj);
6452 _damage_trace_post_objs = NULL;
6456 _e_comp_object_damage_trace_render_post_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
6458 if (!_damage_trace) return;
6460 _damage_trace_post_objs = _damage_trace_objs;
6461 _damage_trace_objs = NULL;
6465 e_comp_object_damage_trace_debug(Eina_Bool onoff)
6467 if (_damage_trace == onoff) return;
6471 evas_event_callback_add(e_comp->evas,
6472 EVAS_CALLBACK_RENDER_PRE,
6473 _e_comp_object_damage_trace_render_pre_cb,
6476 evas_event_callback_add(e_comp->evas,
6477 EVAS_CALLBACK_RENDER_POST,
6478 _e_comp_object_damage_trace_render_post_cb,
6485 EINA_LIST_FREE(_damage_trace_objs, obj)
6486 evas_object_del(obj);
6488 _damage_trace_objs = NULL;
6490 EINA_LIST_FREE(_damage_trace_post_objs, obj)
6491 evas_object_del(obj);
6493 _damage_trace_post_objs = NULL;
6495 evas_event_callback_del(e_comp->evas,
6496 EVAS_CALLBACK_RENDER_PRE,
6497 _e_comp_object_damage_trace_render_pre_cb);
6499 evas_event_callback_del(e_comp->evas,
6500 EVAS_CALLBACK_RENDER_POST,
6501 _e_comp_object_damage_trace_render_post_cb);
6504 _damage_trace = onoff;
6508 e_comp_object_redirected_get(Evas_Object *obj)
6510 API_ENTRY EINA_FALSE;
6511 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6513 return cw->redirected;
6517 e_comp_object_color_visible_get(Evas_Object *obj)
6519 API_ENTRY EINA_FALSE;
6521 return cw->color_visible;
6525 e_comp_object_map_set(Evas_Object *obj, E_Map *em)
6527 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
6529 return e_map_set_to_comp_object(em, obj);
6533 e_comp_object_map_get(const Evas_Object *obj)
6535 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
6537 return e_map_get_from_comp_object(obj);
6541 e_comp_object_map_enable_set(Evas_Object *obj, Eina_Bool enable)
6543 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
6545 evas_object_map_enable_set(obj, enable);
6551 e_comp_object_render_update_lock(Evas_Object *obj)
6553 E_Comp_Wl_Buffer *buffer;
6554 struct wayland_tbm_client_queue *cqueue;
6556 API_ENTRY EINA_FALSE;
6558 if (cw->render_update_lock.lock == 0)
6560 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET, cw->ec);
6562 buffer = e_pixmap_resource_get(cw->ec->pixmap);
6563 if ((buffer) && (buffer->resource))
6565 cqueue = e_comp_wl_tbm_client_queue_get(cw->ec);
6567 wayland_tbm_server_client_queue_flush(cqueue);
6570 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, buffer);
6571 e_comp_object_render_update_del(obj);
6573 ELOGF("COMP", "Render update lock enabled", cw->ec);
6576 cw->render_update_lock.lock++;
6582 e_comp_object_render_update_unlock(Evas_Object *obj)
6586 if (cw->render_update_lock.lock == 0)
6589 cw->render_update_lock.lock--;
6591 if (cw->render_update_lock.lock == 0)
6594 if (cw->render_update_lock.pending_move_set)
6596 evas_object_move(obj,
6597 cw->render_update_lock.pending_move_x,
6598 cw->render_update_lock.pending_move_y);
6599 cw->render_update_lock.pending_move_x = 0;
6600 cw->render_update_lock.pending_move_y = 0;
6601 cw->render_update_lock.pending_move_set = EINA_FALSE;
6604 if (cw->render_update_lock.pending_resize_set)
6606 evas_object_resize(obj,
6607 cw->render_update_lock.pending_resize_w,
6608 cw->render_update_lock.pending_resize_h);
6609 cw->render_update_lock.pending_resize_w = 0;
6610 cw->render_update_lock.pending_resize_h = 0;
6611 cw->render_update_lock.pending_resize_set = EINA_FALSE;
6614 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, NULL);
6616 if ((cw->ec->exp_iconify.buffer_flush) &&
6617 (e_policy_visibility_client_is_iconic(cw->ec)) &&
6618 (cw->ec->comp_data) && (!cw->ec->comp_data->buffer_ref.buffer))
6619 e_comp_object_clear(obj);
6621 e_comp_object_render_update_add(obj);
6623 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_UNSET, cw->ec);
6625 ELOGF("COMP", "Render update lock disabled", cw->ec);
6630 e_comp_object_render_update_lock_get(Evas_Object *obj)
6632 API_ENTRY EINA_FALSE;
6634 if (cw->render_update_lock.lock > 0)
6641 e_comp_object_color_get(Evas_Object *obj, int *r, int *g, int *b, int *a)
6645 if ((cw->transparent.set) || (cw->transparent.setting))
6647 if (r) *r = cw->transparent.user_r;
6648 if (g) *g = cw->transparent.user_g;
6649 if (b) *b = cw->transparent.user_b;
6650 if (a) *a = cw->transparent.user_a;
6654 evas_object_color_get(obj, r, g, b, a);
6659 e_comp_object_render_op_set(Evas_Object *obj, Evas_Render_Op op)
6663 evas_object_render_op_set(cw->obj, op);
6665 wl_signal_emit(&cw->events.render_op_set, NULL);
6668 EINTERN Evas_Render_Op
6669 e_comp_object_render_op_get(Evas_Object *obj)
6671 API_ENTRY EVAS_RENDER_BLEND;
6673 return evas_object_render_op_get(cw->obj);
6677 e_comp_object_lower_listener_add(Evas_Object *obj, struct wl_listener *listener)
6680 wl_signal_add(&cw->events.lower, listener);
6683 #ifdef REFACTOR_DESK_AREA
6685 e_comp_object_lower_done_listener_add(Evas_Object *obj, struct wl_listener *listener)
6688 wl_signal_add(&cw->events.lower_done, listener);
6692 e_comp_object_raise_listener_add(Evas_Object *obj, struct wl_listener *listener)
6695 wl_signal_add(&cw->events.raise, listener);
6700 e_comp_object_show_listener_add(Evas_Object *obj, struct wl_listener *listener)
6703 wl_signal_add(&cw->events.show, listener);
6707 e_comp_object_hide_listener_add(Evas_Object *obj, struct wl_listener *listener)
6710 wl_signal_add(&cw->events.hide, listener);
6713 #ifdef REFACTOR_DESK_AREA
6715 e_comp_object_set_layer_listener_add(Evas_Object *obj, struct wl_listener *listener)
6718 wl_signal_add(&cw->events.set_layer, listener);
6722 e_comp_object_stack_above_listener_add(Evas_Object *obj, struct wl_listener *listener)
6725 wl_signal_add(&cw->events.stack_above, listener);
6729 e_comp_object_stack_below_listener_add(Evas_Object *obj, struct wl_listener *listener)
6732 wl_signal_add(&cw->events.stack_below, listener);
6737 e_comp_object_image_filter_set_listener_add(Evas_Object *obj, struct wl_listener *listener)
6740 wl_signal_add(&cw->events.image_filter_set, listener);
6744 e_comp_object_render_op_set_listener_add(Evas_Object *obj, struct wl_listener *listener)
6747 wl_signal_add(&cw->events.render_op_set, listener);
6751 e_comp_object_content_type_set_listener_add(Evas_Object *obj, struct wl_listener *listener)
6754 wl_signal_add(&cw->events.content_type_set, listener);
6758 e_comp_object_color_set_listener_add(Evas_Object *obj, struct wl_listener *listener)
6761 wl_signal_add(&cw->events.color_set, listener);
6765 e_comp_object_color_visible_set_listener_add(Evas_Object *obj, struct wl_listener *listener)
6768 wl_signal_add(&cw->events.color_visible_set, listener);