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");
1070 e_comp_object_signal_emit(cw->smart_obj, "e,state,hung", "e");
1071 /* visibility must always be enabled for re_manage clients to prevent
1072 * pop-in animations every time the user sees a persistent client again;
1073 * applying visibility for iconic clients prevents the client from getting
1076 if (cw->visible || cw->ec->re_manage)
1077 e_comp_object_signal_emit(cw->smart_obj, "e,state,visible", "e");
1079 e_comp_object_signal_emit(cw->smart_obj, "e,state,hidden", "e");
1081 /* breaks animation counter */
1082 if (cw->frame_object)
1084 edje_object_part_swallow(cw->frame_object, "e.swallow.client", cw->obj);
1085 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object);
1086 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object);
1087 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object);
1093 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->obj);
1097 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
1100 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
1102 if (input_rect_data->obj)
1104 pass_event_flag = EINA_TRUE;
1110 if (cw->indicator.obj)
1112 Evas_Object *indicator;
1113 indicator = edje_object_part_swallow_get(cw->shobj, "e.swallow.indicator");
1114 if (indicator != cw->indicator.obj)
1116 edje_object_part_unswallow(cw->shobj, indicator);
1117 edje_object_part_swallow(cw->shobj, "e.swallow.indicator", cw->indicator.obj);
1118 e_comp_object_indicator_size_set(cw->smart_obj, cw->indicator.w, cw->indicator.h);
1122 evas_object_pass_events_set(cw->default_input_obj, pass_event_flag);
1123 evas_object_pass_events_set(cw->obj, pass_event_flag);
1128 /////////////////////////////////////////////
1131 _e_comp_object_animating_begin(E_Comp_Object *cw)
1134 if (cw->animating == 1)
1136 e_comp->animating++;
1138 e_object_ref(E_OBJECT(cw->ec));
1143 _e_comp_object_animating_end(E_Comp_Object *cw)
1152 if (cw->ec->launching)
1154 if (!cw->ec->extra_animating)
1156 ELOGF("COMP", "Un-Set launching flag..", cw->ec);
1157 cw->ec->launching = EINA_FALSE;
1158 if (cw->ec->first_mapped)
1160 ELOGF("LAUNCH", "SHOW real win", cw->ec);
1161 e_comp_object_signal_emit(cw->ec->frame, "e,action,launch_real,done", "e");
1164 e_comp_object_signal_emit(cw->ec->frame, "e,action,launch,done", "e");
1168 e_comp->animating--;
1169 cw->showing = cw->hiding = 0;
1171 if (e_comp->animating == 0)
1172 e_comp_visibility_calculation_set(EINA_TRUE);
1173 /* remove ref from animation start, account for possibility of deletion from unref */
1174 return !!e_object_unref(E_OBJECT(cw->ec));
1180 /* handle the end of a compositor animation */
1182 _e_comp_object_done_defer(void *data, Evas_Object *obj EINA_UNUSED, const char *emission, const char *source EINA_UNUSED)
1184 E_Comp_Object *cw = data;
1186 /* visible clients which have never been sized are a bug */
1187 if ((!cw->ec->new_client) && (!cw->ec->changes.size) && ((cw->w < 0) || (cw->h < 0)) && (!strcmp(emission, "e,action,show,done")))
1188 CRI("ACK! ec:%p", cw->ec);
1189 if (!_e_comp_object_animating_end(cw)) return;
1190 if (cw->animating) return;
1191 /* hide only after animation finishes to guarantee a full run of the animation */
1192 if (!cw->defer_hide) return;
1193 if ((!strcmp(emission, "e,action,hide,done")) ||
1194 (!strcmp(emission, "e,action,done")) ||
1195 ((cw->ec->iconic) && (!strcmp(emission, "e,action,show,done"))))
1197 ELOGF("COMP", "defer hide emission:%s", cw->ec, emission);
1198 evas_object_hide(cw->smart_obj);
1202 /* run a visibility compositor effect if available, return false if object is dead */
1204 _e_comp_object_effect_visibility_start(E_Comp_Object *cw, Eina_Bool state)
1210 if ((!cw->visibility_effect) || (!e_comp_object_effect_allowed_get(cw->smart_obj))) return EINA_TRUE;;
1211 if (!cw->effect_running)
1212 _e_comp_object_animating_begin(cw);
1213 if (!e_comp_object_effect_stop(cw->smart_obj, _e_comp_object_done_defer))
1214 return _e_comp_object_animating_end(cw);
1215 if (!e_comp_object_effect_set(cw->smart_obj, cw->visibility_effect))
1216 return _e_comp_object_animating_end(cw);
1218 evas_pointer_canvas_xy_get(e_comp->evas, &x, &y);
1221 zone = e_comp_zone_find_by_ec(cw->ec);
1223 zw = zone->w, zh = zone->h;
1228 zone = e_comp_object_util_zone_get(cw->smart_obj);
1229 if (!zone) zone = e_zone_current_get();
1236 e_comp_object_effect_params_set(cw->smart_obj, 1, (int[]){cw->x, cw->y,
1237 cw->w, cw->h, zw, zh, x, y}, 8);
1238 e_comp_object_effect_params_set(cw->smart_obj, 0, (int[]){state}, 1);
1239 e_comp_object_effect_start(cw->smart_obj, _e_comp_object_done_defer, cw);
1242 /////////////////////////////////////////////
1244 /* create necessary objects for clients that e manages */
1246 _e_comp_object_mouse_event_callback_set(E_Comp_Object *cw)
1248 if (cw->set_mouse_callbacks) return;
1249 if (!cw->smart_obj) return;
1251 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_IN, _e_comp_object_cb_mouse_in, cw);
1252 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_OUT, _e_comp_object_cb_mouse_out, cw);
1253 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_comp_object_cb_mouse_down, cw);
1254 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_cb_mouse_up, cw);
1255 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_comp_object_cb_mouse_move, cw);
1256 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_WHEEL, _e_comp_object_cb_mouse_wheel, cw);
1258 cw->set_mouse_callbacks = EINA_TRUE;
1262 _e_comp_object_mouse_event_callback_unset(E_Comp_Object *cw)
1264 if (!cw->set_mouse_callbacks) return;
1265 if (!cw->smart_obj) return;
1267 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_IN, _e_comp_object_cb_mouse_in);
1268 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_OUT, _e_comp_object_cb_mouse_out);
1269 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_comp_object_cb_mouse_down);
1270 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_cb_mouse_up);
1271 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_comp_object_cb_mouse_move);
1272 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_WHEEL, _e_comp_object_cb_mouse_wheel);
1274 cw->set_mouse_callbacks = EINA_FALSE;
1278 _e_comp_object_color_visible_set(E_Comp_Object *cw, Eina_Bool set)
1280 if (cw->color_visible == set) return EINA_TRUE;
1282 cw->color_visible = set;
1284 ELOGF("COMP", "color_visible set:%d", cw->ec, set);
1286 wl_signal_emit(&cw->events.color_visible_set, NULL);
1292 _e_comp_object_color_visible_update(E_Comp_Object *cw)
1296 e_comp_object_color_get(cw->smart_obj, NULL, NULL, NULL, &a);
1299 _e_comp_object_color_visible_set(cw, EINA_FALSE);
1305 evas_object_color_get(cw->effect_obj, NULL, NULL, NULL, &a);
1308 _e_comp_object_color_visible_set(cw, EINA_FALSE);
1316 evas_object_color_get(cw->shobj, NULL, NULL, NULL, &a);
1319 _e_comp_object_color_visible_set(cw, EINA_FALSE);
1326 evas_object_color_get(cw->obj, NULL, NULL, NULL, &a);
1329 _e_comp_object_color_visible_set(cw, EINA_FALSE);
1334 _e_comp_object_color_visible_set(cw, EINA_TRUE);
1338 _e_comp_intercept_effect_obj_color_set(void *data, Evas_Object *obj, int r, int g, int b, int a)
1340 E_Comp_Object *cw = data;
1342 evas_object_color_set(obj, r, g, b, a);
1344 _e_comp_object_color_visible_update(cw);
1348 _e_comp_intercept_shobj_color_set(void *data, Evas_Object *obj, int r, int g, int b, int a)
1350 E_Comp_Object *cw = data;
1352 evas_object_color_set(obj, r, g, b, a);
1354 _e_comp_object_color_visible_update(cw);
1358 _e_comp_intercept_obj_color_set(void *data, Evas_Object *obj, int r, int g, int b, int a)
1360 E_Comp_Object *cw = data;
1362 evas_object_color_set(obj, r, g, b, a);
1364 _e_comp_object_color_visible_update(cw);
1368 _e_comp_object_setup(E_Comp_Object *cw)
1370 cw->clip = evas_object_rectangle_add(e_comp->evas);
1371 evas_object_move(cw->clip, -9999, -9999);
1372 evas_object_resize(cw->clip, 999999, 999999);
1373 evas_object_smart_member_add(cw->clip, cw->smart_obj);
1374 cw->effect_obj = edje_object_add(e_comp->evas);
1375 evas_object_move(cw->effect_obj, cw->x, cw->y);
1376 evas_object_clip_set(cw->effect_obj, cw->clip);
1377 evas_object_smart_member_add(cw->effect_obj, cw->smart_obj);
1378 evas_object_intercept_color_set_callback_add(cw->effect_obj, _e_comp_intercept_effect_obj_color_set, cw);
1379 e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", "e/comp/effects/none");
1380 cw->shobj = edje_object_add(e_comp->evas);
1381 evas_object_data_set(cw->shobj, "comp_smart_obj", cw->smart_obj);
1382 edje_object_part_swallow(cw->effect_obj, "e.swallow.content", cw->shobj);
1383 edje_object_signal_callback_add(cw->shobj, "e,action,*,done", "e", _e_comp_object_done_defer, cw);
1384 evas_object_intercept_color_set_callback_add(cw->shobj, _e_comp_intercept_shobj_color_set, cw);
1386 /* name objects appropriately for nicer printing when using e_comp_util_wins_print() */
1387 if (cw->ec->override)
1389 evas_object_name_set(cw->shobj, "cw->shobj::WINDOW");
1390 evas_object_name_set(cw->effect_obj, "cw->effect_obj::WINDOW");
1391 evas_object_name_set(cw->clip, "cw->clip::WINDOW");
1393 else if (!cw->ec->input_only)
1395 evas_object_name_set(cw->shobj, "cw->shobj::CLIENT");
1396 evas_object_name_set(cw->effect_obj, "cw->effect_obj::CLIENT");
1397 evas_object_name_set(cw->clip, "cw->clip::CLIENT");
1399 cw->real_hid = !cw->ec->input_only;
1400 if (!cw->ec->input_only)
1402 e_util_size_debug_set(cw->effect_obj, 1);
1403 _e_comp_object_mouse_event_callback_set(cw);
1406 cw->default_input_obj = evas_object_rectangle_add(e_comp->evas);
1407 evas_object_name_set(cw->default_input_obj, "cw->default_input_obj");
1408 evas_object_move(cw->default_input_obj, cw->x, cw->y);
1409 evas_object_resize(cw->default_input_obj, cw->w, cw->h);
1410 evas_object_color_set(cw->default_input_obj, 0, 0, 0, 0);
1411 evas_object_smart_member_add(cw->default_input_obj, cw->smart_obj);
1413 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_OBJECT_SETUP, cw->ec);
1416 /////////////////////////////////////////////
1418 /* for fast path evas rendering; only called during render */
1420 _e_comp_object_pixels_get(void *data, Evas_Object *obj EINA_UNUSED)
1422 E_Comp_Object *cw = data;
1423 E_Client *ec = cw->ec;
1425 int bx, by, bxx, byy;
1427 if (e_object_is_del(E_OBJECT(ec))) return;
1428 if (cw->external_content) return;
1429 if (!e_pixmap_size_get(ec->pixmap, &pw, &ph)) return;
1430 e_pixmap_image_opaque_get(cw->ec->pixmap, &bx, &by, &bxx, &byy);
1433 bxx = pw - (bx + bxx), byy = ph - (by + byy);
1434 evas_object_image_border_set(cw->obj, bx, bxx, by, byy);
1436 else if (cw->client_inset.calc && (!cw->frame_object)) //CSD
1438 bx = -cw->client_inset.l + 4, by = -cw->client_inset.t + 4;
1439 bxx = -cw->client_inset.r, byy = -cw->client_inset.b;
1443 bx = by = bxx = byy = 0;
1444 evas_object_image_border_set(cw->obj, bx, bxx, by, byy);
1447 Edje_Message_Int_Set *msg;
1448 Edje_Message_Int msg2;
1449 Eina_Bool id = (bx || by || bxx || byy);
1451 msg = alloca(sizeof(Edje_Message_Int_Set) + (sizeof(int) * 3));
1457 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT_SET, 1, msg);
1459 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT, 0, &msg2);
1463 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
1464 e_comp_client_post_update_add(cw->ec);
1466 else if (e_comp_object_render(ec->frame))
1468 /* apply shape mask if necessary */
1469 if ((!cw->native) && (ec->shaped))
1470 e_comp_object_shape_apply(ec->frame);
1472 /* shaped clients get precise mouse events to handle transparent pixels */
1473 evas_object_precise_is_inside_set(cw->obj, ec->shaped);
1475 /* queue another render if client is still dirty; cannot refresh here. */
1476 if (e_pixmap_dirty_get(ec->pixmap) && e_pixmap_size_get(ec->pixmap, &pw, &ph))
1477 e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
1479 if (cw->render_trace)
1481 _e_comp_object_event_simple(ec->frame, E_EVENT_COMP_OBJECT_IMG_RENDER);
1487 _e_comp_object_pixels_noti(void *data, Evas_Object *obj EINA_UNUSED)
1489 E_Comp_Object *cw = data;
1490 E_Client *ec = cw->ec;
1492 if (e_object_is_del(E_OBJECT(ec))) return;
1493 if (cw->external_content) return;
1494 if (!e_comp->hwc) return;
1496 e_comp_client_render_list_add(cw->ec);
1498 if (!ec->hwc_window) return;
1500 e_hwc_windows_rendered_window_add(ec->hwc_window);
1503 /////////////////////////////////////////////
1506 _e_comp_intercept_move(void *data, Evas_Object *obj, int x, int y)
1508 E_Comp_Object *cw = data;
1511 if (cw->render_update_lock.lock)
1513 cw->render_update_lock.pending_move_x = x;
1514 cw->render_update_lock.pending_move_y = y;
1515 cw->render_update_lock.pending_move_set = EINA_TRUE;
1519 if ((e_pixmap_type_get(cw->ec->pixmap) != E_PIXMAP_TYPE_EXT_OBJECT) &&
1520 (e_pixmap_usable_get(cw->ec->pixmap)) &&
1521 (cw->external_content))
1523 /* delay to move until the external content is unset */
1524 cw->ec->changes.pos = 1;
1529 if (cw->ec->move_after_resize)
1531 if ((x != cw->ec->x) || (y != cw->ec->y))
1533 if (!cw->ec->is_cursor)
1534 ELOGF("COMP", "Set Pos to (%d,%d). current ec_pos(%d,%d)", cw->ec, x, y, cw->ec->x, cw->ec->y);
1535 e_client_pos_set(cw->ec, x, y);
1536 cw->ec->changes.pos = 1;
1542 if ((cw->ec->resize_mode == E_POINTER_RESIZE_NONE) &&
1543 (cw->ec->manage_resize.resize_obj))
1545 e_client_pos_set(cw->ec, x, y);
1546 cw->ec->client.x = x + cw->client_inset.l;
1547 cw->ec->client.y = y + cw->client_inset.t;
1548 e_policy_visibility_client_defer_move(cw->ec);
1552 /* if frame_object does not exist, client_inset indicates CSD.
1553 * this means that ec->client matches cw->x/y, the opposite
1556 fx = (!cw->frame_object) * cw->client_inset.l;
1557 fy = (!cw->frame_object) * cw->client_inset.t;
1558 if ((cw->x == x + fx) && (cw->y == y + fy))
1560 if ((cw->ec->x != x) || (cw->ec->y != y))
1562 /* handle case where client tries to move to position and back very quickly */
1563 e_client_pos_set(cw->ec, x, y);
1564 cw->ec->client.x = x + cw->client_inset.l;
1565 cw->ec->client.y = y + cw->client_inset.t;
1569 if (!cw->ec->maximize_override)
1571 /* prevent moving in some directions while directionally maximized */
1572 if ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL)
1574 if ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_HORIZONTAL)
1577 ix = x + cw->client_inset.l;
1578 iy = y + cw->client_inset.t;
1579 if (cw->ec->maximized && (!cw->ec->maximize_override) && ((cw->ec->x != x) || (cw->ec->y != y)) &&
1580 ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) != E_MAXIMIZE_VERTICAL) &&
1581 ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) != E_MAXIMIZE_HORIZONTAL))
1583 /* prevent moving at all if move isn't allowed in current maximize state */
1584 if ((!e_config->allow_manip) && ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH)) return;
1585 /* queue unmaximize if we are allowing move and update unmaximize geometry */
1588 zone = e_comp_zone_find_by_ec(cw->ec);
1591 cw->ec->changes.need_unmaximize = 1;
1592 cw->ec->saved.x = ix - zone->x;
1593 cw->ec->saved.y = iy - zone->y;
1594 cw->ec->saved.w = cw->ec->client.w;
1595 cw->ec->saved.h = cw->ec->client.h;
1599 /* only update during resize if triggered by resize */
1600 if (e_client_util_resizing_get(cw->ec) && (!cw->force_move)) return;
1601 /* delay to move while surface waits paired commit serial*/
1602 if (e_client_pending_geometry_has(cw->ec))
1604 /* do nothing while waiting paired commit serial*/
1608 e_client_pos_set(cw->ec, x, y);
1609 if (cw->ec->new_client)
1611 /* don't actually do anything until first client idler loop */
1612 cw->ec->placed = ((!cw->ec->dialog) && (!cw->ec->parent));
1613 cw->ec->changes.pos = 1;
1618 /* only update xy position of client to avoid invalid
1619 * first damage region if it is not a new_client. */
1620 cw->ec->client.x = ix;
1621 cw->ec->client.y = iy;
1624 if (!cw->frame_object)
1626 evas_object_move(obj, x, y);
1631 _e_comp_intercept_resize(void *data, Evas_Object *obj, int w, int h)
1633 E_Comp_Object *cw = data;
1634 int pw = 0, ph = 0, fw, fh, iw, ih, prev_w, prev_h, x, y;
1637 if (cw->render_update_lock.lock)
1639 cw->render_update_lock.pending_resize_w = w;
1640 cw->render_update_lock.pending_resize_h = h;
1641 cw->render_update_lock.pending_resize_set = EINA_TRUE;
1645 if (!e_util_strcmp("input_panel_surface", cw->ec->icccm.window_role))
1647 e_client_size_set(cw->ec, w, h);
1648 evas_object_resize(obj, w, h);
1652 /* if frame_object does not exist, client_inset indicates CSD.
1653 * this means that ec->client matches cw->w/h, the opposite
1656 fw = (!cw->frame_object) * (-cw->client_inset.l - cw->client_inset.r);
1657 fh = (!cw->frame_object) * (-cw->client_inset.t - cw->client_inset.b);
1658 if ((cw->w == w + fw) && (cw->h == h + fh))
1660 if (((cw->ec->w != w) || (cw->ec->h != h)) ||
1661 (cw->ec->client.w != w - cw->client_inset.l - cw->client_inset.r) ||
1662 (cw->ec->client.h != h - cw->client_inset.t - cw->client_inset.b))
1664 /* handle case where client tries to resize itself and back very quickly */
1665 e_client_size_set(cw->ec, w, h);
1666 cw->ec->client.w = w - cw->client_inset.l - cw->client_inset.r;
1667 cw->ec->client.h = h - cw->client_inset.t - cw->client_inset.b;
1668 evas_object_smart_callback_call(obj, "client_resize", NULL);
1672 /* guarantee that fullscreen is fullscreen */
1673 zone = e_comp_zone_find_by_ec(cw->ec);
1675 if (cw->ec->fullscreen && ((w != zone->w) || (h != zone->h)))
1677 if (!e_client_transform_core_enable_get(cw->ec))
1680 /* calculate client size */
1681 iw = w - cw->client_inset.l - cw->client_inset.r;
1682 ih = h - cw->client_inset.t - cw->client_inset.b;
1683 if (cw->ec->maximized && (!cw->ec->maximize_override) && ((cw->ec->w != w) || (cw->ec->h != h)))
1685 /* prevent resizing while maximized depending on direction and config */
1686 if ((!e_config->allow_manip) && ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH)) return;
1688 Eina_Bool reject = EINA_FALSE;
1689 if (cw->ec->maximized & E_MAXIMIZE_VERTICAL)
1691 if (cw->ec->client.h != ih)
1693 cw->ec->saved.h = ih;
1694 cw->ec->saved.y = cw->ec->client.y - zone->y;
1695 reject = cw->ec->changes.need_unmaximize = 1;
1698 if (cw->ec->maximized & E_MAXIMIZE_HORIZONTAL)
1700 if (cw->ec->client.w != iw)
1702 cw->ec->saved.w = iw;
1703 cw->ec->saved.x = cw->ec->client.x - zone->x;
1704 reject = cw->ec->changes.need_unmaximize = 1;
1713 if (cw->ec->new_client || (!cw->ec->visible) || (!cw->effect_obj))
1715 /* do nothing until client idler loops */
1716 if ((cw->ec->w != w) || (cw->ec->h != h))
1718 e_client_size_set(cw->ec, w, h);
1719 cw->ec->changes.size = 1;
1724 if (e_client_pending_geometry_has(cw->ec))
1726 /* do nothing while waiting paired commit serial*/
1730 e_client_size_set(cw->ec, w, h);
1732 cw->ec->client.w = iw;
1733 cw->ec->client.h = ih;
1734 if ((cw->ec->client.w < 0) || (cw->ec->client.h < 0)) CRI("WTF. ec:%p", cw->ec);
1736 /* The size of non-compositing window can be changed, so there is a
1737 * need to check that cw is H/W composited if cw is not redirected.
1738 * And of course we have to change size of evas object of H/W composited cw,
1739 * otherwise cw can't receive input events even if it is shown on the screen.
1741 Eina_Bool redirected = cw->redirected;
1743 redirected = e_comp_is_on_overlay(cw->ec);
1745 if ((!cw->ec->input_only) && (redirected) &&
1746 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE) &&
1747 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE) &&
1748 (e_pixmap_dirty_get(cw->ec->pixmap) ||
1749 (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph))))
1752 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE ||
1753 cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE)
1755 prev_w = cw->w, prev_h = cw->h;
1756 e_comp_object_frame_wh_adjust(obj, 0, 0, &fw, &fh);
1757 /* check shading and clamp to pixmap size for regular clients */
1758 if ((!cw->ec->input_only) && (!cw->ec->override) &&
1759 (((w - fw != pw) || (h - fh != ph))))
1761 //INF("CALLBACK: REQ(%dx%d) != CUR(%dx%d)", w - fw, h - fh, pw, ph);
1762 evas_object_smart_callback_call(obj, "client_resize", NULL);
1764 if (cw->frame_object || cw->ec->input_only)
1765 e_comp_object_frame_wh_adjust(obj, pw, ph, &w, &h);
1768 if ((cw->w == w) && (cw->h == h))
1770 /* going to be a noop resize which won't trigger smart resize */
1771 RENDER_DEBUG("DAMAGE RESIZE(%p): %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
1772 if (cw->updates) eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
1774 evas_object_resize(obj, w, h);
1778 evas_object_smart_callback_call(obj, "client_resize", NULL);
1781 if ((!cw->frame_object) && (!cw->ec->input_only))
1783 /* "just do it" for overrides */
1784 evas_object_resize(obj, w, h);
1786 if (!cw->ec->override)
1788 /* shape probably changed for non-overrides */
1793 /* this fixes positioning jiggles when using a resize mode
1794 * which also changes the client's position
1797 if (cw->frame_object)
1798 x = cw->x, y = cw->y;
1800 x = cw->ec->x, y = cw->ec->y;
1801 switch (cw->ec->resize_mode)
1803 case E_POINTER_RESIZE_BL:
1804 case E_POINTER_RESIZE_L:
1805 evas_object_move(obj, x + prev_w - cw->w, y);
1807 case E_POINTER_RESIZE_TL:
1808 evas_object_move(obj, x + prev_w - cw->w, y + prev_h - cw->h);
1810 case E_POINTER_RESIZE_T:
1811 case E_POINTER_RESIZE_TR:
1812 evas_object_move(obj, x, y + prev_h - cw->h);
1821 _e_comp_intercept_layer_set(void *data, Evas_Object *obj, int layer)
1823 #ifdef REFACTOR_DESK_AREA
1824 E_Comp_Object *cw = data;
1825 E_Comp_Object_Data_Set_Layer layer_set_data;
1827 layer_set_data.cw = cw;
1828 layer_set_data.layer = layer;
1830 wl_signal_emit(&cw->events.set_layer, &layer_set_data);
1834 e_comp_render_queue();
1835 e_comp_object_transform_obj_stack_update(obj);
1839 E_Comp_Object *cw = data;
1840 E_Comp_Wl_Client_Data *child_cdata;
1841 unsigned int l = e_comp_canvas_layer_map(layer);
1844 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
1846 /* doing a compositor effect, follow directions */
1847 _e_comp_object_layer_set(obj, layer);
1848 if (layer == cw->ec->layer) //trying to put layer back
1852 /* if ec->layer and layer are the same but the client is not belong to the given(l)
1853 that means, layer is changed during layer_pending. in this case, need to update layer inlist*/
1854 if (cw->layer != l) goto layer_set;
1858 e_comp_render_queue();
1860 ec = e_client_above_get(cw->ec);
1861 /* skip subsurface: stacking subsurface is handled by e_comp_wl */
1862 while ((ec) && (e_comp_wl_subsurface_check(ec)))
1863 ec = e_client_above_get(ec);
1864 if (ec && (evas_object_layer_get(ec->frame) != evas_object_layer_get(obj)))
1866 ec = e_client_below_get(cw->ec);
1867 /* skip subsurface: stacking subsurface is handled by e_comp_wl */
1868 while ((ec) && (e_comp_wl_subsurface_check(ec)))
1869 ec = e_client_below_get(ec);
1870 if (ec && (evas_object_layer_get(ec->frame) == evas_object_layer_get(cw->smart_obj)))
1872 evas_object_stack_above(obj, ec->frame);
1877 if (ec && (cw->ec->parent == ec))
1879 if (e_client_transient_policy_get(cw->ec) == E_TRANSIENT_ABOVE)
1880 evas_object_stack_above(obj, ec->frame);
1882 evas_object_stack_below(obj, ec->frame);
1885 evas_object_stack_below(obj, ec ? ec->frame : e_comp->layers[cw->layer].obj);
1891 if (cw->layer == l) return;
1892 if (e_comp_canvas_client_layer_map(layer) == 9999)
1893 return; //invalid layer for clients not doing comp effects
1894 if (cw->ec->fullscreen)
1896 cw->ec->saved.layer = layer;
1899 oldraise = e_config->transient.raise;
1901 /* clamp to valid client layer */
1902 layer = e_comp_canvas_client_layer_map_nearest(layer);
1903 cw->ec->layer = layer;
1904 e_client_input_thread_layer_set(cw->ec, layer);
1905 if (e_config->transient.layer)
1908 Eina_List *list = eina_list_clone(cw->ec->transients);
1910 /* We need to set raise to one, else the child wont
1911 * follow to the new layer. It should be like this,
1912 * even if the user usually doesn't want to raise
1915 e_config->transient.raise = 1;
1916 EINA_LIST_FREE(list, child)
1918 child_cdata = e_client_cdata_get(child);
1919 if (child_cdata && !child_cdata->mapped)
1921 ELOGF("COMP", "LAYER_SET CHILD. BUT not mapped. skip. child(ec:%p, win:0x%08zx)", cw->ec, child, e_client_util_win_get(child));
1924 e_client_layer_set(child, layer);
1928 e_config->transient.raise = oldraise;
1930 _e_comp_object_layers_remove(cw);
1931 cw->layer = e_comp_canvas_layer_map(layer);
1932 _e_comp_object_layers_add(cw, NULL, NULL, 0);
1933 //if (cw->ec->new_client)
1934 //INF("CLIENT STACKED %p: %u", cw->ec, layer);
1935 _e_comp_object_layer_set(obj, layer);
1936 if (!e_comp->layers[cw->layer].obj) return; //this is a layer marker
1937 evas_object_stack_below(obj, e_comp->layers[cw->layer].obj);
1938 if (evas_object_below_get(obj) == e_comp->layers[cw->layer].obj)
1940 /* can't stack a client above its own layer marker */
1941 CRI("STACKING ERROR!!! ec:%p (cw->layer:%d, ec->layer:%d)", cw->ec, cw->layer, cw->ec->layer);
1943 if (!cw->visible) return;
1944 e_comp_render_queue();
1945 _e_comp_object_transform_obj_stack_update(obj);
1949 #ifdef REFACTOR_DESK_AREA
1951 typedef void (*E_Comp_Object_Stack_Func)(Evas_Object *obj, Evas_Object *stack);
1954 #ifdef REFACTOR_DESK_AREA
1956 e_comp_object_raise(Evas_Object *obj)
1959 _e_comp_object_raise(Evas_Object *obj)
1962 evas_object_raise(obj);
1964 if (evas_object_smart_smart_get(obj))
1966 E_Client *ec = e_comp_object_client_get(obj);
1968 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
1972 #ifdef REFACTOR_DESK_AREA
1974 e_comp_object_lower(E_Comp_Object *cw, Evas_Object *obj)
1977 _e_comp_object_lower(E_Comp_Object *cw, Evas_Object *obj)
1980 evas_object_lower(obj);
1982 if (evas_object_smart_smart_get(obj))
1984 E_Client *ec = e_comp_object_client_get(obj);
1987 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
1988 #ifdef REFACTOR_DESK_AREA
1989 wl_signal_emit(&cw->events.lower_done, NULL);
1991 wl_signal_emit(&cw->events.lower, NULL);
1997 #ifdef REFACTOR_DESK_AREA
1999 e_comp_object_stack_above(Evas_Object *obj, Evas_Object *target)
2002 _e_comp_object_stack_above(Evas_Object *obj, Evas_Object *target)
2005 evas_object_stack_above(obj, target);
2007 if (evas_object_smart_smart_get(obj))
2009 E_Client *ec = e_comp_object_client_get(obj);
2011 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2015 #ifdef REFACTOR_DESK_AREA
2017 e_comp_object_stack_below(Evas_Object *obj, Evas_Object *target)
2020 _e_comp_object_stack_below(Evas_Object *obj, Evas_Object *target)
2023 evas_object_stack_below(obj, target);
2025 if (evas_object_smart_smart_get(obj))
2027 E_Client *ec = e_comp_object_client_get(obj);
2029 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2033 #ifdef REFACTOR_DESK_AREA
2035 e_comp_object_layer_set(Evas_Object *obj, short layer)
2038 _e_comp_object_layer_set(Evas_Object *obj, short layer)
2041 evas_object_layer_set(obj, layer);
2043 if (evas_object_smart_smart_get(obj))
2045 E_Client *ec = e_comp_object_client_get(obj);
2047 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_LAYER_SET, ec);
2051 #ifdef REFACTOR_DESK_AREA
2054 _e_comp_object_is_pending(E_Client *ec)
2058 if (!ec) return EINA_FALSE;
2060 topmost = e_comp_wl_topmost_parent_get(ec);
2062 return (topmost) ? topmost->layer_pending : EINA_FALSE;
2066 _e_comp_intercept_stack_helper(E_Comp_Object *cw, Evas_Object *stack, E_Comp_Object_Stack_Func stack_cb)
2068 E_Comp_Object *cw2 = NULL;
2071 Evas_Object *o = stack;
2072 #ifdef REFACTOR_DESK_AREA
2073 Eina_Bool raising = stack_cb == e_comp_object_stack_above;
2075 Eina_Bool raising = stack_cb == _e_comp_object_stack_above;
2078 /* We should consider topmost's layer_pending for subsurface */
2079 if ((cw->ec->layer_block) || _e_comp_object_is_pending(cw->ec))
2081 if (_e_comp_object_is_pending(cw->ec))
2082 e_comp_object_layer_update(cw->smart_obj,
2083 raising? stack : NULL,
2084 raising? NULL : stack);
2086 /* obey compositor effects! */
2087 if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
2088 evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
2089 stack_cb(cw->smart_obj, stack);
2090 if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
2091 evas_object_data_del(cw->smart_obj, "client_restack");
2095 cw2 = evas_object_data_get(o, "comp_obj");
2097 /* assume someone knew what they were doing during client init */
2098 if (cw->ec->new_client)
2099 layer = cw->ec->layer;
2100 else if ((cw2) && _e_comp_object_is_pending(cw2->ec))
2101 layer = cw2->ec->layer;
2103 layer = evas_object_layer_get(stack);
2104 ecstack = e_client_below_get(cw->ec);
2105 if (layer != e_comp_canvas_layer_map_to(cw->layer))
2107 evas_object_layer_set(cw->smart_obj, layer);
2108 /* we got our layer wrangled, return now! */
2109 if (layer != e_comp_canvas_layer_map_to(cw->layer)) return;
2112 /* check if we're stacking below another client */
2115 /* check for non-client layer object */
2116 if (!e_util_strcmp(evas_object_name_get(o), "layer_obj"))
2118 /* find an existing client to use for layering
2119 * by walking up the object stack
2121 * this is guaranteed to be pretty quick since we'll either:
2122 * - run out of client layers
2123 * - find a stacking client
2125 o = evas_object_above_get(o);
2126 if ((!o) || (o == cw->smart_obj)) break;
2127 if (evas_object_layer_get(o) != layer)
2129 /* reached the top client layer somehow
2130 * use top client object
2132 o = e_comp->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR)].obj;
2135 /* top client layer window hasn't been stacked yet. this probably shouldn't happen?
2136 * return here since the top client layer window
2141 ec = e_client_top_get();
2146 if (o) cw2 = evas_object_data_get(o, "comp_obj");
2149 if (cw2 && cw->layer != cw2->layer)
2152 /* remove existing layers */
2153 _e_comp_object_layers_remove(cw);
2156 if (o == stack) //if stacking above, cw2 is above; else cw2 is below
2157 _e_comp_object_layers_add(cw, raising ? cw2 : NULL, raising ? NULL : cw2, 0);
2158 else if (o == cw->smart_obj) //prepend (lower) if not stacking above
2159 _e_comp_object_layers_add(cw, NULL, NULL, !raising);
2160 else //if no stacking objects found, either raise or lower
2161 _e_comp_object_layers_add(cw, raising ? NULL : cw2, raising ? cw2 : NULL, 0);
2164 _e_comp_object_layers_add(cw, NULL, NULL, 0);
2166 /* find new object for stacking if cw2 is on state of layer_pending */
2167 if ((cw2) && _e_comp_object_is_pending(cw2->ec))
2169 E_Client *new_stack = NULL, *current_ec = NULL;
2170 current_ec = cw2->ec;
2173 while ((new_stack = e_client_below_get(current_ec)))
2175 current_ec = new_stack;
2176 if (new_stack == cw->ec) continue;
2177 if (new_stack->layer != cw2->ec->layer) break;
2178 if (!_e_comp_object_is_pending(new_stack)) break;
2180 if ((new_stack) && (new_stack->layer == cw2->ec->layer))
2181 stack = new_stack->frame;
2184 /* stack it above layer object */
2186 below_layer = (cw2->layer <= 0)? 0 : cw2->layer - 1 ;
2187 stack = e_comp->layers[below_layer].obj;
2192 while ((new_stack = e_client_above_get(current_ec)))
2194 current_ec = new_stack;
2195 if (new_stack == cw->ec) continue;
2196 if (new_stack->layer != cw2->ec->layer) break;
2197 if (!_e_comp_object_is_pending(new_stack)) break;
2199 if ((new_stack) && (new_stack->layer == cw2->ec->layer))
2200 stack = new_stack->frame;
2202 stack = e_comp->layers[cw2->layer].obj;
2206 /* set restack if stacking has changed */
2207 if (cw->ec->new_client || (!ecstack) || (ecstack->frame != o))
2208 evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
2209 stack_cb(cw->smart_obj, stack);
2210 if (e_comp->layers[cw->layer].obj)
2211 if (evas_object_below_get(cw->smart_obj) == e_comp->layers[cw->layer].obj)
2213 CRI("STACKING ERROR!!! ec:%p (cw->layer:%d, ec->layer:%d)", cw->ec, cw->layer, cw->ec->layer);
2215 if (cw->ec->new_client || (!ecstack) || (ecstack->frame != o))
2216 evas_object_data_del(cw->smart_obj, "client_restack");
2217 if (!cw->visible) return;
2218 e_comp_render_queue();
2223 _e_comp_intercept_stack_above(void *data, Evas_Object *obj, Evas_Object *above)
2225 EINA_SAFETY_ON_TRUE_RETURN(obj == above);
2227 TRACE_DS_BEGIN(COMP:INTERCEPT STACK ABOVE);
2229 #ifdef REFACTOR_DESK_AREA
2230 E_Comp_Object *cw = data;
2231 E_Comp_Object_Data_Stack_Above stack_above_data;
2233 stack_above_data.cw = cw;
2234 stack_above_data.above_obj = above;
2236 wl_signal_emit(&cw->events.stack_above, &stack_above_data);
2238 if (evas_object_below_get(obj) == above)
2240 e_comp_object_layer_update(obj, above, NULL);
2244 _e_comp_intercept_stack_helper(data, above, _e_comp_object_stack_above);
2246 _e_comp_object_transform_obj_stack_update(obj);
2247 _e_comp_object_transform_obj_stack_update(above);
2254 _e_comp_intercept_stack_below(void *data, Evas_Object *obj, Evas_Object *below)
2256 EINA_SAFETY_ON_TRUE_RETURN(obj == below);
2258 TRACE_DS_BEGIN(COMP:INTERCEPT STACK BELOW);
2260 #ifdef REFACTOR_DESK_AREA
2261 E_Comp_Object *cw = data;
2262 E_Comp_Object_Data_Stack_Below stack_below_data;
2264 stack_below_data.cw = cw;
2265 stack_below_data.below_obj = below;
2267 wl_signal_emit(&cw->events.stack_below, &stack_below_data);
2270 e_comp_render_queue();
2272 if (evas_object_above_get(obj) == below)
2274 e_comp_object_layer_update(obj, NULL, below);
2278 _e_comp_intercept_stack_helper(data, below, _e_comp_object_stack_below);
2280 if (evas_object_smart_smart_get(obj))
2281 _e_comp_object_transform_obj_stack_update(obj);
2282 if (evas_object_smart_smart_get(below))
2283 _e_comp_object_transform_obj_stack_update(below);
2290 _e_comp_intercept_lower(void *data, Evas_Object *obj)
2292 E_Comp_Object *cw = data;
2294 #ifdef REFACTOR_DESK_AREA
2299 TRACE_DS_BEGIN(COMP:INTERCEPT LOWER);
2301 #ifdef REFACTOR_DESK_AREA
2302 wl_signal_emit(&cw->events.lower, cw);
2304 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
2306 if (cw->ec->layer_pending)
2307 e_comp_object_layer_update(obj, NULL, obj);
2309 #ifdef REFACTOR_DESK_AREA
2310 e_comp_object_lower(cw, obj);
2312 _e_comp_object_lower(cw, obj);
2316 if (!EINA_INLIST_GET(cw->ec)->prev) goto end; //already lowest on layer
2317 o = evas_object_below_get(obj);
2318 _e_comp_object_layers_remove(cw);
2319 /* prepend to client list since this client should be the first item now */
2320 _e_comp_object_layers_add(cw, NULL, NULL, 1);
2321 if (evas_object_layer_get(o) != evas_object_layer_get(obj)) goto end; //already at bottom!
2322 evas_object_data_set(obj, "client_restack", (void*)1);
2323 #ifdef REFACTOR_DESK_AREA
2324 e_comp_object_lower(cw, obj);
2326 _e_comp_object_lower(cw, obj);
2328 evas_object_data_del(obj, "client_restack");
2329 if (!cw->visible) goto end;
2330 e_comp_render_queue();
2331 #ifdef REFACTOR_DESK_AREA
2332 e_comp_object_transform_obj_stack_update(obj);
2334 _e_comp_object_transform_obj_stack_update(obj);
2343 _e_comp_intercept_raise(void *data, Evas_Object *obj)
2345 E_Comp_Object *cw = data;
2346 #ifdef REFACTOR_DESK_AREA
2352 TRACE_DS_BEGIN(COMP:INTERCEPT RAISE);
2354 #ifdef REFACTOR_DESK_AREA
2355 wl_signal_emit(&cw->events.raise, cw);
2357 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
2359 if (cw->ec->layer_pending)
2361 int obj_layer = evas_object_layer_get(obj);
2362 if (cw->ec->layer != obj_layer)
2363 e_comp_object_layer_update(obj, NULL, NULL);
2365 #ifdef REFACTOR_DESK_AREA
2366 e_comp_object_raise(obj);
2368 _e_comp_object_raise(obj);
2372 if (!EINA_INLIST_GET(cw->ec)->next) goto end;//already highest on layer
2373 o = evas_object_above_get(obj);
2374 if (evas_object_layer_get(o) != evas_object_layer_get(obj)) goto end; //already at top!
2376 /* still stack below override below the layer marker */
2377 for (op = o = e_comp->layers[cw->layer].obj;
2378 o && o != e_comp->layers[cw->layer - 1].obj;
2379 op = o, o = evas_object_below_get(o))
2381 if (evas_object_smart_smart_get(o))
2385 ec = e_comp_object_client_get(o);
2386 if (ec && (!ec->override)) break;
2389 #ifdef REFACTOR_DESK_AREA
2390 e_comp_object_stack_below(obj, op);
2392 _e_comp_object_stack_below(obj, op);
2394 e_client_focus_defer_set(cw->ec);
2396 if (!cw->visible) goto end;
2397 e_comp_render_queue();
2398 #ifdef REFACTOR_DESK_AREA
2399 e_comp_object_transform_obj_stack_update(obj);
2401 _e_comp_object_transform_obj_stack_update(obj);
2410 _e_comp_intercept_hide(void *data, Evas_Object *obj)
2412 E_Comp_Object *cw = data;
2414 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
2415 if( !_e_comp_object_intercept_hook_call(E_COMP_OBJECT_INTERCEPT_HOOK_HIDE, cw->ec))
2417 ELOGF("COMP", "Hide. intercepted", cw->ec);
2422 if (cw->ec->launching == EINA_TRUE)
2424 ELOGF("COMP", "Hide. Cancel launching flag", cw->ec);
2425 cw->ec->launching = EINA_FALSE;
2426 e_comp_object_signal_emit(cw->ec->frame, "e,action,launch,cancel", "e");
2431 /* hidden flag = just do it */
2432 ELOGF("COMP", "Hide hidden evas_object:%p", cw->ec, obj);
2433 evas_object_hide(obj);
2435 wl_signal_emit(&cw->events.hide, NULL);
2440 if (cw->ec->input_only)
2442 /* input_only = who cares */
2443 ELOGF("COMP", "Hide input_only evas_object:%p", cw->ec, obj);
2444 evas_object_hide(obj);
2446 wl_signal_emit(&cw->events.hide, NULL);
2450 /* already hidden or currently animating */
2451 if ((!cw->visible) || (cw->animating && cw->hiding && (!cw->ec->iconic)))
2453 ELOGF("COMP", "Hide. but already hidden or currently animating", cw->ec);
2457 /* don't try hiding during shutdown */
2458 cw->defer_hide |= stopping;
2459 if (!cw->defer_hide)
2461 if ((!cw->ec->iconic) && (!cw->ec->override))
2462 /* unset delete requested so the client doesn't break */
2463 cw->ec->delete_requested = 0;
2464 if ((!cw->animating) || (!cw->hiding) || cw->ec->iconic)
2466 ELOGF("COMP", "Hide. but after iconify or hide animation, cw->animating:%d, cw->hiding:%d, iconic:%d",
2467 cw->ec, cw->animating, cw->hiding, cw->ec->iconic);
2470 e_comp_object_signal_emit(obj, "e,action,iconify", "e");
2473 e_comp_object_signal_emit(obj, "e,state,hidden", "e");
2475 _e_comp_object_animating_begin(cw);
2476 if (!_e_comp_object_effect_visibility_start(cw, 0)) return;
2478 evas_object_smart_callback_call(obj, "hiding", cw->ec);
2479 cw->defer_hide = !!cw->animating;
2481 e_comp_object_effect_set(obj, NULL);
2484 if (cw->animating) return;
2485 /* if we have no animations running, go ahead and hide */
2487 ELOGF("COMP", "Hide normal object:%p", cw->ec, obj);
2488 evas_object_hide(obj);
2490 wl_signal_emit(&cw->events.hide, NULL);
2494 _e_comp_intercept_show_helper(E_Comp_Object *cw)
2496 E_Client *ec = cw->ec;
2499 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
2501 if (ec->show_pending.count > 0)
2503 ELOGF("COMP", "show_helper. Show PENDING!!! show_pending:%d", ec, ec->show_pending.count);
2504 ec->show_pending.running = EINA_TRUE;
2508 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
2509 if (!_e_comp_object_intercept_hook_call(E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER, ec))
2511 ELOGF("COMP", "show_helper. intercepted", cw->ec);
2516 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,
2517 cw->visible, cw->animating, cw->defer_hide, cw->content_type, cw->updates, cw->w, cw->h,
2518 ec->iconic, ec->exp_iconify.by_client, ec->exp_iconify.type, ec->input_only, ec->ignored, ec->new_client);
2521 e_comp_object_signal_emit(cw->smart_obj, "e,state,sticky", "e");
2524 if (ec->iconic && cw->animating)
2526 /* triggered during iconify animation */
2527 e_comp_object_signal_emit(cw->smart_obj, "e,action,uniconify", "e");
2530 ELOGF("COMP", "show_helper. return. already cw->visible", ec);
2533 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE ||
2534 cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE)
2536 evas_object_move(cw->smart_obj, ec->x, ec->y);
2537 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2538 e_comp_object_frame_theme_set(cw->smart_obj, E_COMP_OBJECT_FRAME_RESHADOW);
2540 if (e_comp->image_filter != E_COMP_IMAGE_FILTER_NONE)
2541 e_comp_object_image_filter_set(cw->smart_obj, e_comp->image_filter);
2544 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2545 evas_object_show(cw->smart_obj);
2548 e_client_focus_defer_set(ec);
2552 if ((!cw->updates) && (!ec->input_only) && (!ec->ignored))
2556 pw = ec->client.w, ph = ec->client.h;
2558 if (!e_pixmap_size_get(ec->pixmap, &pw, &ph))
2560 ec->changes.visible = !ec->hidden;
2563 ELOGF("COMP", "show_helper. return. no pixmap size", ec);
2567 cw->updates = eina_tiler_new(pw, ph);
2570 ec->changes.visible = !ec->hidden;
2573 ELOGF("COMP", "show_helper. return. no cw->updates", ec);
2578 eina_tiler_tile_size_set(cw->updates, 1, 1);
2581 /* ignore until client idler first run */
2582 ec->changes.visible = !ec->hidden;
2585 ELOGF("COMP", "show_helper. return. new_client", ec);
2592 evas_object_move(cw->smart_obj, ec->x, ec->y);
2593 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2594 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2595 evas_object_show(cw->smart_obj);
2598 if (ec->netwm.type == E_WINDOW_TYPE_DND && !e_comp_wl->drag_client)
2600 /* start_drag not received */
2601 ec->changes.visible = 1;
2604 ELOGF("COMP", "show_helper. return. start_drag not received yet", ec);
2607 /* re-set geometry */
2608 evas_object_move(cw->smart_obj, ec->x, ec->y);
2609 /* force resize in case it hasn't happened yet, or just to update size */
2610 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2611 if ((cw->w < 1) || (cw->h < 1))
2613 /* if resize didn't go through, try again */
2614 ec->visible = ec->changes.visible = 1;
2616 ELOGF("COMP", "show_helper. return. cw_size(%d,%d)", ec, cw->w, cw->h);
2619 /* if pixmap not available, clear pixmap since we're going to fetch it again */
2620 if (!e_pixmap_size_get(ec->pixmap, &w, &h))
2621 e_pixmap_clear(ec->pixmap);
2623 if (cw->real_hid && w && h)
2626 /* force comp theming in case it didn't happen already */
2627 e_comp_object_frame_theme_set(cw->smart_obj, E_COMP_OBJECT_FRAME_RESHADOW);
2628 if (e_comp->image_filter != E_COMP_IMAGE_FILTER_NONE)
2629 e_comp_object_image_filter_set(cw->smart_obj, e_comp->image_filter);
2632 /* only do the show if show is allowed */
2635 if (ec->internal) //internal clients render when they feel like it
2636 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
2638 if (!e_client_is_iconified_by_client(ec)||
2639 e_policy_visibility_client_is_uniconic(ec))
2641 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2642 evas_object_show(cw->smart_obj);
2644 /* if comp object is shown in idle enterer before(E_CLIENT_HOOK_EVAL_FETCH),
2645 it is rendered in idle callback without native surface and
2646 compositor shows an empty frame if other objects aren't shown
2647 because job callback of e_comp called at the next loop.
2648 it causes a visual defect when windows are switched.
2652 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
2653 e_comp_object_dirty(cw->smart_obj);
2654 e_comp_object_render(cw->smart_obj);
2659 wl_signal_emit(&cw->events.show, NULL);
2663 _e_comp_intercept_show(void *data, Evas_Object *obj EINA_UNUSED)
2665 E_Comp_Object *cw = data;
2666 E_Client *ec = cw->ec;
2668 E_Input_Rect_Data *input_rect_data;
2669 E_Input_Rect_Smart_Data *input_rect_sd;
2672 if (ec->ignored) return;
2676 //INF("SHOW2 %p", ec);
2677 _e_comp_intercept_show_helper(cw);
2680 //INF("SHOW %p", ec);
2683 cw->effect_obj = evas_object_rectangle_add(e_comp->evas);
2684 evas_object_color_set(cw->effect_obj, 0, 0, 0, 0);
2685 evas_object_smart_member_add(cw->effect_obj, cw->smart_obj);
2686 evas_object_name_set(cw->effect_obj, "cw->effect_obj::input_only");
2690 if ((!cw->obj) && (cw->external_content))
2692 ERR("cw->obj for external content is not created! ec:%p", cw->ec);
2696 _e_comp_object_setup(cw);
2699 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE;
2700 cw->obj = evas_object_image_filled_add(e_comp->evas);
2701 evas_object_image_border_center_fill_set(cw->obj, EVAS_BORDER_FILL_SOLID);
2702 e_util_size_debug_set(cw->obj, 1);
2703 evas_object_image_pixels_get_callback_set(cw->obj, _e_comp_object_pixels_get, cw);
2704 evas_object_image_pixels_noti_callback_set(cw->obj, _e_comp_object_pixels_noti, cw);
2705 evas_object_image_smooth_scale_set(cw->obj, e_comp_config_get()->smooth_windows);
2706 evas_object_name_set(cw->obj, "cw->obj");
2707 evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888);
2708 evas_object_intercept_color_set_callback_add(cw->obj, _e_comp_intercept_obj_color_set, cw);
2710 _e_comp_object_alpha_set(cw);
2713 evas_object_color_set(cw->clip, ec->netwm.opacity, ec->netwm.opacity, ec->netwm.opacity, ec->netwm.opacity);
2716 _e_comp_object_map_transform_rect(cw->ec, 0, 0, cw->w, cw->h, NULL, NULL, &tw, &th);
2717 evas_object_geometry_set(cw->effect_obj, cw->x, cw->y, tw, th);
2720 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
2723 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
2725 if (input_rect_data->obj)
2727 evas_object_geometry_set(input_rect_data->obj,
2728 cw->x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
2729 cw->y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
2730 input_rect_data->rect.w, input_rect_data->rect.h);
2737 evas_object_resize(cw->mask.obj, cw->w, cw->h);
2739 _e_comp_intercept_show_helper(cw);
2743 _e_comp_intercept_focus(void *data, Evas_Object *obj, Eina_Bool focus)
2745 E_Comp_Object *cw = data;
2749 /* note: this is here as it seems there are enough apps that do not even
2750 * expect us to emulate a look of focus but not actually set x input
2751 * focus as we do - so simply abort any focus set on such windows */
2752 /* be strict about accepting focus hint */
2753 /* be strict about accepting focus hint */
2754 if ((!ec->icccm.accepts_focus) &&
2755 (!ec->icccm.take_focus))
2759 if (e_client_focused_get() == ec)
2760 e_client_focused_set(NULL);
2762 ELOGF("FOCUS", "FOCUS UNSET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2763 evas_object_focus_set(obj, focus);
2767 if (focus && ec->lock_focus_out) return;
2768 if (e_object_is_del(E_OBJECT(ec)) && focus)
2769 CRI("CAN'T FOCUS DELETED CLIENT! ec:%p", ec);
2771 /* filter focus setting based on current state */
2776 ELOGF("FOCUS", "FOCUS SET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2777 evas_object_focus_set(obj, focus);
2780 if ((ec->iconic) && (!ec->deskshow))
2782 if (!e_policy_visibility_client_is_uniconify_render_running(ec))
2784 /* don't focus an iconified window. that's silly! */
2785 ELOGF("FOCUS", "Do uniconify to set focus", ec);
2786 e_client_uniconify(ec);
2787 e_client_focus_latest_set(ec);
2801 /* not yet visible, wait till the next time... */
2802 ec->want_focus = !ec->hidden;
2807 e_client_focused_set(ec);
2811 if (e_client_focused_get() == ec)
2812 e_client_focused_set(NULL);
2816 ELOGF("FOCUS", "FOCUS SET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2818 ELOGF("FOCUS", "FOCUS UNSET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2820 evas_object_focus_set(obj, focus);
2824 _e_comp_intercept_color_set(void *data, Evas_Object *obj, int r, int g, int b, int a)
2826 E_Comp_Object *cw = data;
2828 if (cw->transparent.set)
2830 cw->transparent.user_r = r;
2831 cw->transparent.user_g = g;
2832 cw->transparent.user_b = b;
2833 cw->transparent.user_a = a;
2835 ELOGF("COMP", "Transparent user_color(%d,%d,%d,%d)",
2837 cw->transparent.user_r,
2838 cw->transparent.user_g,
2839 cw->transparent.user_b,
2840 cw->transparent.user_a);
2844 evas_object_color_set(obj, r, g, b, a);
2847 wl_signal_emit(&cw->events.color_set, NULL);
2849 _e_comp_object_color_visible_update(cw);
2852 ////////////////////////////////////////////////////
2855 _e_comp_object_frame_recalc(E_Comp_Object *cw)
2857 int w, h, ox, oy, ow, oh;
2859 Eina_Bool pass_event_flag = EINA_FALSE;
2860 E_Input_Rect_Data *input_rect_data;
2861 E_Input_Rect_Smart_Data *input_rect_sd;
2863 if (cw->frame_object)
2865 if (cw->obj) edje_object_part_unswallow(cw->frame_object, cw->obj);
2866 evas_object_geometry_get(cw->frame_object, NULL, NULL, &w, &h);
2867 /* set a fixed size, force edje calc, check size difference */
2868 evas_object_resize(cw->frame_object, MAX(w, 50), MAX(h, 50));
2869 edje_object_message_signal_process(cw->frame_object);
2870 edje_object_calc_force(cw->frame_object);
2871 edje_object_part_geometry_get(cw->frame_object, "e.swallow.client", &ox, &oy, &ow, &oh);
2872 cw->client_inset.l = ox;
2873 cw->client_inset.r = MAX(w, 50) - (ox + ow);
2874 cw->client_inset.t = oy;
2875 cw->client_inset.b = MAX(h, 50) - (oy + oh);
2876 if (cw->obj) edje_object_part_swallow(cw->frame_object, "e.swallow.client", cw->obj);
2877 evas_object_resize(cw->frame_object, w, h);
2881 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
2884 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
2886 if (input_rect_data->obj)
2888 pass_event_flag = EINA_TRUE;
2894 evas_object_pass_events_set(cw->default_input_obj, pass_event_flag);
2895 evas_object_pass_events_set(cw->obj, pass_event_flag);
2899 cw->client_inset.l = 0;
2900 cw->client_inset.r = 0;
2901 cw->client_inset.t = 0;
2902 cw->client_inset.b = 0;
2904 cw->client_inset.calc = !!cw->frame_object;
2908 _e_comp_smart_cb_frame_recalc(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2910 E_Comp_Object *cw = data;
2914 /* - get current size
2916 * - readjust for new frame size
2919 w = cw->ec->w, h = cw->ec->h;
2920 e_comp_object_frame_wh_unadjust(obj, w, h, &pw, &ph);
2922 _e_comp_object_frame_recalc(cw);
2924 if (!cw->ec->fullscreen)
2925 e_comp_object_frame_wh_adjust(obj, cw->ec->client.w, cw->ec->client.h, &w, &h);
2927 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2928 if (cw->ec->fullscreen)
2930 zone = e_comp_zone_find_by_ec(cw->ec);
2932 evas_object_resize(cw->ec->frame, zone->w, zone->h);
2934 else if (cw->ec->new_client)
2936 if ((cw->ec->w < 1) || (cw->ec->h < 1)) return;
2937 e_comp_object_frame_wh_adjust(obj, pw, ph, &w, &h);
2938 evas_object_resize(cw->ec->frame, w, h);
2940 else if ((w != cw->ec->w) || (h != cw->ec->h))
2941 evas_object_resize(cw->ec->frame, w, h);
2945 _e_comp_smart_cb_maximize(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2947 E_Comp_Object *cw = data;
2949 _e_comp_object_shadow_setup(cw);
2950 if (cw->frame_object)
2952 _e_comp_object_shadow(cw);
2953 e_comp_object_signal_emit(cw->smart_obj, "e,action,maximize", "e");
2954 _e_comp_object_frame_recalc(cw);
2955 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2960 _e_comp_smart_cb_fullscreen(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2962 E_Comp_Object *cw = data;
2964 if (_e_comp_object_shadow_setup(cw))
2965 e_comp_object_damage(cw->smart_obj, 0, 0, cw->ec->w, cw->ec->h);
2966 if (cw->frame_object)
2968 _e_comp_object_shadow(cw);
2969 e_comp_object_signal_emit(cw->smart_obj, "e,action,maximize,fullscreen", "e");
2970 _e_comp_object_frame_recalc(cw);
2971 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2976 _e_comp_smart_cb_unmaximize(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2978 E_Comp_Object *cw = data;
2980 if (cw->frame_object)
2982 _e_comp_object_shadow(cw);
2983 e_comp_object_signal_emit(obj, "e,action,unmaximize", "e");
2984 _e_comp_object_frame_recalc(cw);
2985 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2990 _e_comp_smart_cb_unfullscreen(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2992 E_Comp_Object *cw = data;
2994 if (_e_comp_object_shadow_setup(cw))
2997 cw->ec->changes.size = 1;
2999 if (cw->frame_object)
3001 _e_comp_object_shadow(cw);
3002 e_comp_object_signal_emit(obj, "e,action,unmaximize,unfullscreen", "e");
3003 _e_comp_object_frame_recalc(cw);
3004 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
3009 _e_comp_smart_cb_sticky(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3011 e_comp_object_signal_emit(obj, "e,state,sticky", "e");
3015 _e_comp_smart_cb_unsticky(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3017 e_comp_object_signal_emit(obj, "e,state,unsticky", "e");
3021 _e_comp_smart_cb_unhung(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3023 E_Comp_Object *cw = data;
3025 if (!cw->ec) return; //NYI
3026 e_comp_object_signal_emit(cw->smart_obj, "e,state,unhung", "e");
3030 _e_comp_smart_cb_hung(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3032 E_Comp_Object *cw = data;
3034 if (!cw->ec) return; //NYI
3035 e_comp_object_signal_emit(cw->smart_obj, "e,state,hung", "e");
3039 _e_comp_smart_focus_in(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3041 e_comp_object_signal_emit(obj, "e,state,focused", "e");
3045 _e_comp_smart_focus_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3047 E_Comp_Object *cw = data;
3049 if (!e_object_is_del(E_OBJECT(cw->ec)))
3050 e_comp_object_signal_emit(obj, "e,state,unfocused", "e");
3054 _e_comp_input_obj_smart_add(Evas_Object *obj)
3056 E_Input_Rect_Smart_Data *input_rect_sd;
3057 input_rect_sd = E_NEW(E_Input_Rect_Smart_Data, 1);
3059 if (!input_rect_sd) return;
3060 evas_object_smart_data_set(obj, input_rect_sd);
3064 _e_comp_input_obj_smart_del(Evas_Object *obj)
3066 E_Input_Rect_Smart_Data *input_rect_sd;
3067 E_Input_Rect_Data *input_rect_data;
3069 input_rect_sd = evas_object_smart_data_get(obj);
3070 if (!input_rect_sd) return;
3072 EINA_LIST_FREE(input_rect_sd->input_rect_data_list, input_rect_data)
3074 if (input_rect_data->obj)
3076 evas_object_smart_member_del(input_rect_data->obj);
3077 E_FREE_FUNC(input_rect_data->obj, evas_object_del);
3079 E_FREE(input_rect_data);
3081 E_FREE(input_rect_sd);
3085 _e_comp_input_obj_smart_move(Evas_Object *obj, int x, int y)
3087 E_Input_Rect_Smart_Data *input_rect_sd;
3088 E_Input_Rect_Data *input_rect_data;
3092 input_rect_sd = evas_object_smart_data_get(obj);
3093 if (!input_rect_sd) return;
3095 cw = input_rect_sd->cw;
3096 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3098 if (input_rect_data->obj)
3100 evas_object_geometry_set(input_rect_data->obj,
3101 x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
3102 y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
3103 input_rect_data->rect.w, input_rect_data->rect.h);
3109 _e_comp_input_obj_smart_resize(Evas_Object *obj, int w, int h)
3111 E_Input_Rect_Smart_Data *input_rect_sd;
3112 E_Input_Rect_Data *input_rect_data;
3116 input_rect_sd = evas_object_smart_data_get(obj);
3117 if (!input_rect_sd) return;
3119 cw = input_rect_sd->cw;
3120 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3122 if (input_rect_data->obj)
3124 evas_object_geometry_set(input_rect_data->obj,
3125 cw->x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
3126 cw->y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
3127 input_rect_data->rect.w, input_rect_data->rect.h);
3133 _e_comp_input_obj_smart_show(Evas_Object *obj)
3135 E_Input_Rect_Smart_Data *input_rect_sd;
3136 E_Input_Rect_Data *input_rect_data;
3139 input_rect_sd = evas_object_smart_data_get(obj);
3140 if (!input_rect_sd) return;
3142 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3144 if (input_rect_data->obj)
3146 evas_object_show(input_rect_data->obj);
3152 _e_comp_input_obj_smart_hide(Evas_Object *obj)
3154 E_Input_Rect_Smart_Data *input_rect_sd;
3155 E_Input_Rect_Data *input_rect_data;
3158 input_rect_sd = evas_object_smart_data_get(obj);
3159 if (!input_rect_sd) return;
3161 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3163 if (input_rect_data->obj)
3165 evas_object_hide(input_rect_data->obj);
3171 _e_comp_input_obj_smart_init(void)
3173 if (_e_comp_input_obj_smart) return;
3175 static const Evas_Smart_Class sc =
3177 INPUT_OBJ_SMART_NAME,
3178 EVAS_SMART_CLASS_VERSION,
3179 _e_comp_input_obj_smart_add,
3180 _e_comp_input_obj_smart_del,
3181 _e_comp_input_obj_smart_move,
3182 _e_comp_input_obj_smart_resize,
3183 _e_comp_input_obj_smart_show,
3184 _e_comp_input_obj_smart_hide,
3197 _e_comp_input_obj_smart = evas_smart_class_new(&sc);
3203 _e_comp_smart_add(Evas_Object *obj)
3207 cw = E_NEW(E_Comp_Object, 1);
3208 EINA_SAFETY_ON_NULL_RETURN(cw);
3210 wl_signal_init(&cw->events.lower);
3211 #ifdef REFACTOR_DESK_AREA
3212 wl_signal_init(&cw->events.lower_done);
3213 wl_signal_init(&cw->events.raise);
3215 wl_signal_init(&cw->events.show);
3216 wl_signal_init(&cw->events.hide);
3217 #ifdef REFACTOR_DESK_AREA
3218 wl_signal_init(&cw->events.set_layer);
3219 wl_signal_init(&cw->events.stack_above);
3220 wl_signal_init(&cw->events.stack_below);
3222 wl_signal_init(&cw->events.image_filter_set);
3223 wl_signal_init(&cw->events.render_op_set);
3224 wl_signal_init(&cw->events.content_type_set);
3225 wl_signal_init(&cw->events.color_set);
3226 wl_signal_init(&cw->events.color_visible_set);
3228 cw->smart_obj = obj;
3229 cw->x = cw->y = cw->w = cw->h = -1;
3230 evas_object_smart_data_set(obj, cw);
3231 cw->opacity = 255.0;
3232 cw->external_content = 0;
3233 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_NONE;
3234 cw->transform_bg_color.r = 0;
3235 cw->transform_bg_color.g = 0;
3236 cw->transform_bg_color.b = 0;
3237 cw->transform_bg_color.a = 255;
3238 cw->color_visible = EINA_TRUE;
3239 evas_object_data_set(obj, "comp_obj", cw);
3240 evas_object_move(obj, -1, -1);
3241 /* intercept ALL the callbacks! */
3242 evas_object_intercept_stack_above_callback_add(obj, _e_comp_intercept_stack_above, cw);
3243 evas_object_intercept_stack_below_callback_add(obj, _e_comp_intercept_stack_below, cw);
3244 evas_object_intercept_raise_callback_add(obj, _e_comp_intercept_raise, cw);
3245 evas_object_intercept_lower_callback_add(obj, _e_comp_intercept_lower, cw);
3246 evas_object_intercept_layer_set_callback_add(obj, _e_comp_intercept_layer_set, cw);
3247 evas_object_intercept_move_callback_add(obj, _e_comp_intercept_move, cw);
3248 evas_object_intercept_resize_callback_add(obj, _e_comp_intercept_resize, cw);
3249 evas_object_intercept_show_callback_add(obj, _e_comp_intercept_show, cw);
3250 evas_object_intercept_hide_callback_add(obj, _e_comp_intercept_hide, cw);
3251 evas_object_intercept_focus_set_callback_add(obj, _e_comp_intercept_focus, cw);
3252 evas_object_intercept_color_set_callback_add(obj, _e_comp_intercept_color_set, cw);
3254 evas_object_smart_callback_add(obj, "maximize", _e_comp_smart_cb_maximize, cw);
3255 evas_object_smart_callback_add(obj, "fullscreen", _e_comp_smart_cb_fullscreen, cw);
3256 evas_object_smart_callback_add(obj, "unmaximize", _e_comp_smart_cb_unmaximize, cw);
3257 evas_object_smart_callback_add(obj, "unfullscreen", _e_comp_smart_cb_unfullscreen, cw);
3259 evas_object_smart_callback_add(obj, "stick", _e_comp_smart_cb_sticky, cw);
3260 evas_object_smart_callback_add(obj, "unstick", _e_comp_smart_cb_unsticky, cw);
3262 evas_object_smart_callback_add(obj, "hung", _e_comp_smart_cb_hung, cw);
3263 evas_object_smart_callback_add(obj, "unhung", _e_comp_smart_cb_unhung, cw);
3265 evas_object_smart_callback_add(obj, "frame_recalc", _e_comp_smart_cb_frame_recalc, cw);
3267 evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_IN, _e_comp_smart_focus_in, cw);
3268 evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_OUT, _e_comp_smart_focus_out, cw);
3272 _e_comp_smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
3275 evas_object_color_set(cw->clip, r, g, b, a);
3276 evas_object_smart_callback_call(obj, "color_set", NULL);
3281 _e_comp_smart_clip_set(Evas_Object *obj, Evas_Object *clip)
3284 evas_object_clip_set(cw->clip, clip);
3288 _e_comp_smart_clip_unset(Evas_Object *obj)
3291 evas_object_clip_unset(cw->clip);
3295 _e_comp_smart_hide(Evas_Object *obj)
3297 TRACE_DS_BEGIN(COMP:SMART HIDE);
3302 evas_object_hide(cw->clip);
3303 if (cw->input_obj) evas_object_hide(cw->input_obj);
3304 evas_object_hide(cw->effect_obj);
3305 if (cw->default_input_obj) evas_object_hide(cw->default_input_obj);
3306 if (cw->transform_bg_obj) evas_object_hide(cw->transform_bg_obj);
3307 if (cw->transform_tranp_obj) evas_object_hide(cw->transform_tranp_obj);
3314 /* unset native surface if current displaying buffer was destroied */
3315 if (!cw->buffer_destroy_listener.notify)
3317 Evas_Native_Surface *ns;
3318 ns = evas_object_image_native_surface_get(cw->obj);
3319 if ((ns) && (ns->type == EVAS_NATIVE_SURFACE_WL) && (ns->data.wl.legacy_buffer))
3320 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
3323 if (!cw->ec->input_only)
3325 edje_object_freeze(cw->effect_obj);
3326 edje_object_freeze(cw->shobj);
3327 edje_object_play_set(cw->shobj, 0);
3328 if (cw->frame_object)
3329 edje_object_play_set(cw->frame_object, 0);
3332 e_comp_render_queue(); //force nocomp recheck
3338 _e_comp_smart_show(Evas_Object *obj)
3346 if ((cw->w < 0) || (cw->h < 0))
3347 CRI("ACK! ec:%p", cw->ec);
3349 TRACE_DS_BEGIN(COMP:SMART SHOW);
3351 e_comp_object_map_update(obj);
3353 EINA_LIST_FOREACH(cw->ec->e.state.video_child, l, tmp)
3354 evas_object_show(tmp->frame);
3356 evas_object_show(cw->clip);
3357 if (cw->input_obj) evas_object_show(cw->input_obj);
3358 if (!cw->ec->input_only)
3360 edje_object_thaw(cw->effect_obj);
3361 edje_object_thaw(cw->shobj);
3362 edje_object_play_set(cw->shobj, 1);
3363 if (cw->frame_object)
3364 edje_object_play_set(cw->frame_object, 1);
3366 evas_object_show(cw->effect_obj);
3367 if (cw->mask.obj) evas_object_show(cw->mask.obj);
3368 if (cw->transform_bg_obj) evas_object_show(cw->transform_bg_obj);
3369 if (cw->transform_tranp_obj) evas_object_show(cw->transform_tranp_obj);
3370 if (cw->default_input_obj) evas_object_show(cw->default_input_obj);
3371 e_comp_render_queue();
3372 if (cw->ec->input_only)
3377 if (cw->ec->iconic && (!cw->ec->new_client))
3379 if (e_client_is_iconified_by_client(cw->ec))
3381 ELOGF("COMP", "Set launching flag..", cw->ec);
3382 cw->ec->launching = EINA_TRUE;
3385 e_comp_object_signal_emit(cw->smart_obj, "e,action,uniconify", "e");
3387 else if (!cw->showing) /* if set, client was ec->hidden during show animation */
3390 ELOGF("COMP", "Set launching flag..", cw->ec);
3391 cw->ec->launching = EINA_TRUE;
3393 e_comp_object_signal_emit(cw->smart_obj, "e,state,visible", "e");
3394 _e_comp_object_animating_begin(cw);
3395 if (!_e_comp_object_effect_visibility_start(cw, 1))
3401 /* ensure some random effect doesn't lock the client offscreen */
3405 e_comp_object_effect_set(obj, NULL);
3408 _e_comp_object_dim_update(cw);
3414 _e_comp_smart_del(Evas_Object *obj)
3420 if (cw->buffer_destroy_listener.notify)
3422 wl_list_remove(&cw->buffer_destroy_listener.link);
3423 cw->buffer_destroy_listener.notify = NULL;
3426 if (cw->tbm_surface)
3428 tbm_surface_internal_unref(cw->tbm_surface);
3429 cw->tbm_surface = NULL;
3432 if (cw->render_update_lock.buffer_ref.buffer)
3434 ELOGF("COMP", "Clear buffer_ref of render_update_lock:%d",
3435 cw->ec, cw->render_update_lock.lock);
3436 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, NULL);
3439 e_comp_object_render_update_del(cw->smart_obj);
3440 E_FREE_FUNC(cw->updates, eina_tiler_free);
3441 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
3448 EINA_LIST_FREE(cw->obj_mirror, o)
3450 evas_object_image_data_set(o, NULL);
3451 evas_object_freeze_events_set(o, 1);
3452 evas_object_event_callback_del_full(o, EVAS_CALLBACK_DEL, _e_comp_object_cb_mirror_del, cw);
3456 #ifdef REFACTOR_DESK_AREA
3458 _e_comp_object_layers_remove(cw);
3460 l = evas_object_data_get(obj, "comp_object-to_del");
3461 E_FREE_LIST(l, evas_object_del);
3462 _e_comp_object_mouse_event_callback_unset(cw);
3463 evas_object_del(cw->clip);
3464 evas_object_del(cw->obj);
3465 evas_object_del(cw->shobj);
3466 evas_object_del(cw->effect_obj);
3467 evas_object_del(cw->frame_object);
3468 evas_object_del(cw->input_obj);
3469 evas_object_del(cw->mask.obj);
3470 if (cw->dim.mask_obj) evas_object_del(cw->dim.mask_obj);
3471 evas_object_del(cw->transform_bg_obj);
3472 evas_object_del(cw->transform_tranp_obj);
3473 evas_object_del(cw->default_input_obj);
3474 eina_stringshare_del(cw->frame_theme);
3475 eina_stringshare_del(cw->frame_name);
3479 e_comp->animating--;
3481 e_object_unref(E_OBJECT(cw->ec));
3483 cw->ec->frame = NULL;
3488 _e_comp_smart_move(Evas_Object *obj, int x, int y)
3492 cw->x = x, cw->y = y;
3493 evas_object_move(cw->effect_obj, x, y);
3494 evas_object_move(cw->default_input_obj, x, y);
3495 if (cw->input_obj) evas_object_move(cw->input_obj, x, y);
3497 e_comp_object_map_update(obj);
3501 _e_comp_smart_resize(Evas_Object *obj, int w, int h)
3503 Eina_Bool first = EINA_FALSE;
3508 if (!cw->effect_obj) CRI("ACK! ec:%p", cw->ec);
3510 TRACE_DS_BEGIN(COMP:SMART RESIZE);
3512 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
3514 if (cw->w != w || cw->h != h)
3515 e_comp_object_map_update(obj);
3517 first = ((cw->w < 1) || (cw->h < 1));
3518 cw->w = w, cw->h = h;
3522 if (cw->frame_object)
3523 e_comp_object_frame_wh_unadjust(obj, w, h, &ww, &hh);
3526 /* verify pixmap:object size */
3527 if (e_pixmap_size_get(cw->ec->pixmap, &pw, &ph) && (!cw->ec->override))
3529 if ((ww != pw) || (hh != ph))
3530 ELOGF("COMP", "CW RSZ: %dx%d || PX: %dx%d.", cw->ec, ww, hh, pw, ph);
3532 evas_object_resize(cw->effect_obj, tw, th);
3533 evas_object_resize(cw->default_input_obj, w, h);
3535 evas_object_resize(cw->input_obj, w, h);
3537 evas_object_resize(cw->mask.obj, w, h);
3538 /* resize render update tiler */
3541 RENDER_DEBUG("DAMAGE UNFULL: %p", cw->ec);
3542 cw->updates_full = 0;
3543 if (cw->updates) eina_tiler_clear(cw->updates);
3547 RENDER_DEBUG("DAMAGE RESIZE(%p): %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
3548 if (cw->updates) eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
3556 e_comp_render_queue();
3562 _e_comp_smart_init(void)
3564 if (_e_comp_smart) return;
3566 static const Evas_Smart_Class sc =
3569 EVAS_SMART_CLASS_VERSION,
3573 _e_comp_smart_resize,
3576 _e_comp_smart_color_set,
3577 _e_comp_smart_clip_set,
3578 _e_comp_smart_clip_unset,
3588 _e_comp_smart = evas_smart_class_new(&sc);
3593 e_comp_object_init(void)
3595 E_EVENT_COMP_OBJECT_ADD = ecore_event_type_new();
3596 E_EVENT_COMP_OBJECT_IMG_RENDER = ecore_event_type_new();
3597 E_EVENT_COMP_OBJECT_EFFECT_START = ecore_event_type_new();
3598 E_EVENT_COMP_OBJECT_EFFECT_END = ecore_event_type_new();
3602 e_comp_object_shutdown(void)
3608 e_comp_object_mirror_visibility_check(Evas_Object *obj)
3610 API_ENTRY EINA_FALSE;
3611 return !!cw->force_visible;
3613 /////////////////////////////////////////////////////////
3616 _e_comp_object_util_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3619 Eina_Bool comp_object;
3621 comp_object = !!evas_object_data_get(obj, "comp_object");
3626 o = edje_object_part_swallow_get(obj, "e.swallow.content");
3628 e_comp_render_queue();
3630 l = evas_object_data_get(obj, "comp_object-to_del");
3631 E_FREE_LIST(l, evas_object_del);
3635 _e_comp_object_util_restack(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3637 if (e_comp_util_object_is_above_nocomp(obj) &&
3638 (!evas_object_data_get(obj, "comp_override")))
3640 evas_object_data_set(obj, "comp_override", (void*)1);
3641 e_comp_override_add();
3646 _e_comp_object_util_show(void *data EINA_UNUSED, Evas_Object *obj)
3648 Eina_Bool ref = EINA_TRUE;
3649 if (evas_object_visible_get(obj))
3653 d = evas_object_data_del(obj, "comp_hiding");
3655 /* currently trying to hide */
3658 /* already visible */
3662 evas_object_show(obj);
3665 evas_object_ref(obj);
3666 evas_object_data_set(obj, "comp_ref", (void*)1);
3668 edje_object_signal_emit(obj, "e,state,visible", "e");
3669 evas_object_data_set(obj, "comp_showing", (void*)1);
3670 if (e_comp_util_object_is_above_nocomp(obj))
3672 evas_object_data_set(obj, "comp_override", (void*)1);
3673 e_comp_override_add();
3678 _e_comp_object_util_hide(void *data EINA_UNUSED, Evas_Object *obj)
3680 if (!evas_object_visible_get(obj)) return;
3681 /* already hiding */
3682 if (evas_object_data_get(obj, "comp_hiding")) return;
3683 if (!evas_object_data_del(obj, "comp_showing"))
3685 evas_object_ref(obj);
3686 evas_object_data_set(obj, "comp_ref", (void*)1);
3688 edje_object_signal_emit(obj, "e,state,hidden", "e");
3689 evas_object_data_set(obj, "comp_hiding", (void*)1);
3691 if (evas_object_data_del(obj, "comp_override"))
3692 e_comp_override_timed_pop();
3696 _e_comp_object_util_done_defer(void *data, Evas_Object *obj, const char *emission, const char *source EINA_UNUSED)
3698 if (!e_util_strcmp(emission, "e,action,hide,done"))
3700 if (!evas_object_data_del(obj, "comp_hiding")) return;
3701 evas_object_intercept_hide_callback_del(obj, _e_comp_object_util_hide);
3702 evas_object_hide(obj);
3703 evas_object_intercept_hide_callback_add(obj, _e_comp_object_util_hide, data);
3706 evas_object_data_del(obj, "comp_showing");
3707 if (evas_object_data_del(obj, "comp_ref"))
3708 evas_object_unref(obj);
3712 _e_comp_object_util_moveresize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3718 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
3722 E_API E_Comp_Object_Hook *
3723 e_comp_object_hook_add(E_Comp_Object_Hook_Point hookpoint, E_Comp_Object_Hook_Cb func, const void *data)
3725 E_Comp_Object_Hook *ch;
3727 EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_COMP_OBJECT_HOOK_LAST, NULL);
3728 ch = E_NEW(E_Comp_Object_Hook, 1);
3729 if (!ch) return NULL;
3730 ch->hookpoint = hookpoint;
3732 ch->data = (void*)data;
3733 _e_comp_object_hooks[hookpoint] = eina_inlist_append(_e_comp_object_hooks[hookpoint], EINA_INLIST_GET(ch));
3738 e_comp_object_hook_del(E_Comp_Object_Hook *ch)
3741 if (_e_comp_object_hooks_walking == 0)
3743 _e_comp_object_hooks[ch->hookpoint] = eina_inlist_remove(_e_comp_object_hooks[ch->hookpoint], EINA_INLIST_GET(ch));
3747 _e_comp_object_hooks_delete++;
3750 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
3751 E_API E_Comp_Object_Intercept_Hook *
3752 e_comp_object_intercept_hook_add(E_Comp_Object_Intercept_Hook_Point hookpoint, E_Comp_Object_Intercept_Hook_Cb func, const void *data)
3754 E_Comp_Object_Intercept_Hook *ch;
3756 EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_COMP_OBJECT_INTERCEPT_HOOK_LAST, NULL);
3757 ch = E_NEW(E_Comp_Object_Intercept_Hook, 1);
3758 if (!ch) return NULL;
3759 ch->hookpoint = hookpoint;
3761 ch->data = (void*)data;
3762 _e_comp_object_intercept_hooks[hookpoint] = eina_inlist_append(_e_comp_object_intercept_hooks[hookpoint], EINA_INLIST_GET(ch));
3767 e_comp_object_intercept_hook_del(E_Comp_Object_Intercept_Hook *ch)
3770 if (_e_comp_object_intercept_hooks_walking == 0)
3772 _e_comp_object_intercept_hooks[ch->hookpoint] = eina_inlist_remove(_e_comp_object_intercept_hooks[ch->hookpoint], EINA_INLIST_GET(ch));
3776 _e_comp_object_intercept_hooks_delete++;
3781 e_comp_object_util_add(Evas_Object *obj)
3785 E_Comp_Config *conf = e_comp_config_get();
3786 Eina_Bool skip = EINA_FALSE;
3792 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
3794 name = evas_object_name_get(obj);
3795 vis = evas_object_visible_get(obj);
3796 o = edje_object_add(e_comp->evas);
3797 evas_object_data_set(o, "comp_object", (void*)1);
3799 skip = (!strncmp(name, "noshadow", 8));
3801 evas_object_data_set(o, "comp_object_skip", (void*)1);
3803 if (conf->shadow_style)
3805 snprintf(buf, sizeof(buf), "e/comp/frame/%s", conf->shadow_style);
3806 ok = e_theme_edje_object_set(o, "base/theme/comp", buf);
3809 e_theme_edje_object_set(o, "base/theme/comp", "e/comp/frame/default");
3810 if (e_util_strcmp(evas_object_type_get(obj), "edje") || (!edje_object_data_get(obj, "noshadow")))
3811 edje_object_signal_emit(o, "e,state,shadow,on", "e");
3813 edje_object_signal_emit(o, "e,state,shadow,off", "e");
3815 evas_object_geometry_get(obj, &x, &y, &w, &h);
3816 evas_object_geometry_set(o, x, y, w, h);
3817 evas_object_pass_events_set(o, evas_object_pass_events_get(obj));
3819 edje_object_signal_callback_add(o, "e,action,*,done", "e", _e_comp_object_util_done_defer, NULL);
3821 evas_object_intercept_show_callback_add(o, _e_comp_object_util_show, NULL);
3822 evas_object_intercept_hide_callback_add(o, _e_comp_object_util_hide, NULL);
3823 evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _e_comp_object_util_moveresize, NULL);
3824 evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, _e_comp_object_util_del, NULL);
3825 evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE, _e_comp_object_util_moveresize, NULL);
3826 evas_object_event_callback_add(o, EVAS_CALLBACK_RESTACK, _e_comp_object_util_restack, NULL);
3828 e_comp_object_signal_emit(o, "e,state,hidden", "e");
3830 edje_object_part_swallow(o, "e.swallow.content", obj);
3832 _e_comp_object_event_add(o);
3835 evas_object_show(o);
3840 /* utility functions for deleting objects when their "owner" is deleted */
3842 e_comp_object_util_del_list_append(Evas_Object *obj, Evas_Object *to_del)
3847 EINA_SAFETY_ON_NULL_RETURN(to_del);
3848 l = evas_object_data_get(obj, "comp_object-to_del");
3849 evas_object_data_set(obj, "comp_object-to_del", eina_list_append(l, to_del));
3850 evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _e_comp_object_util_del);
3851 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_util_del, NULL);
3855 e_comp_object_util_del_list_remove(Evas_Object *obj, Evas_Object *to_del)
3860 EINA_SAFETY_ON_NULL_RETURN(to_del);
3861 l = evas_object_data_get(obj, "comp_object-to_del");
3863 evas_object_data_set(obj, "comp_object-to_del", eina_list_remove(l, to_del));
3866 /////////////////////////////////////////////////////////
3868 EINTERN Evas_Object *
3869 e_comp_object_client_add(E_Client *ec)
3874 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, NULL);
3875 if (ec->frame) return NULL;
3876 _e_comp_smart_init();
3877 o = evas_object_smart_add(e_comp->evas, _e_comp_smart);
3878 cw = evas_object_smart_data_get(o);
3879 if (!cw) return NULL;
3880 evas_object_data_set(o, "E_Client", ec);
3883 evas_object_data_set(o, "comp_object", (void*)1);
3885 _e_comp_object_event_add(o);
3890 /* utility functions for getting client inset */
3892 e_comp_object_frame_xy_adjust(Evas_Object *obj, int x, int y, int *ax, int *ay)
3895 if (!cw->client_inset.calc)
3901 if (ax) *ax = x - cw->client_inset.l;
3902 if (ay) *ay = y - cw->client_inset.t;
3906 e_comp_object_frame_xy_unadjust(Evas_Object *obj, int x, int y, int *ax, int *ay)
3909 if (!cw->client_inset.calc)
3915 if (ax) *ax = x + cw->client_inset.l;
3916 if (ay) *ay = y + cw->client_inset.t;
3920 e_comp_object_frame_wh_adjust(Evas_Object *obj, int w, int h, int *aw, int *ah)
3923 if (!cw->client_inset.calc)
3929 if (aw) *aw = w + cw->client_inset.l + cw->client_inset.r;
3930 if (ah) *ah = h + cw->client_inset.t + cw->client_inset.b;
3934 e_comp_object_frame_wh_unadjust(Evas_Object *obj, int w, int h, int *aw, int *ah)
3937 if (!cw->client_inset.calc)
3943 if (aw) *aw = w - cw->client_inset.l - cw->client_inset.r;
3944 if (ah) *ah = h - cw->client_inset.t - cw->client_inset.b;
3948 e_comp_object_client_get(Evas_Object *obj)
3953 /* FIXME: remove this when eo is used */
3954 o = evas_object_data_get(obj, "comp_smart_obj");
3956 return e_comp_object_client_get(o);
3957 return cw ? cw->ec : NULL;
3961 e_comp_object_frame_extends_get(Evas_Object *obj, int *x, int *y, int *w, int *h)
3964 if (cw->frame_extends)
3965 edje_object_parts_extends_calc(cw->frame_object, x, y, w, h);
3970 if (w) *w = cw->ec->w;
3971 if (h) *h = cw->ec->h;
3976 e_comp_object_util_zone_get(Evas_Object *obj)
3978 E_Zone *zone = NULL;
3982 zone = e_comp_zone_find_by_ec(cw->ec);
3987 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
3988 zone = e_comp_zone_xy_get(x, y);
3994 e_comp_object_util_center(Evas_Object *obj)
3996 int x, y, w, h, ow, oh;
4001 zone = e_comp_object_util_zone_get(obj);
4002 EINA_SAFETY_ON_NULL_RETURN(zone);
4003 e_zone_useful_geometry_get(zone, &x, &y, &w, &h);
4004 if (cw && (cw->ec->changes.size || cw->ec->new_client))
4005 ow = cw->ec->w, oh = cw->ec->h;
4007 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
4008 x = x + (w - ow) / 2;
4009 y = y + (h - oh) / 2;
4010 evas_object_move(obj, x, y);
4014 e_comp_object_util_center_on(Evas_Object *obj, Evas_Object *on)
4016 int x, y, w, h, ow, oh;
4019 EINA_SAFETY_ON_NULL_RETURN(on);
4020 evas_object_geometry_get(on, &x, &y, &w, &h);
4021 if (cw && (cw->ec->changes.size || cw->ec->new_client))
4022 ow = cw->ec->w, oh = cw->ec->h;
4024 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
4025 evas_object_move(obj, x + (w / 2) - (ow / 2), y + (h / 2) - (oh / 2));
4029 e_comp_object_util_fullscreen(Evas_Object *obj)
4034 e_client_fullscreen(cw->ec, E_FULLSCREEN_RESIZE);
4037 evas_object_move(obj, 0, 0);
4038 evas_object_resize(obj, e_comp->w, e_comp->h);
4043 e_comp_object_util_center_pos_get(Evas_Object *obj, int *x, int *y)
4051 ow = cw->w, oh = cw->h;
4053 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
4054 zone = e_comp_object_util_zone_get(obj);
4055 e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh);
4056 if (x) *x = zx + (zw - ow) / 2;
4057 if (y) *y = zy + (zh - oh) / 2;
4061 e_comp_object_input_objs_del(Evas_Object *obj)
4064 E_Input_Rect_Data *input_rect_data;
4065 E_Input_Rect_Smart_Data *input_rect_sd;
4070 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4071 if (!input_rect_sd) return;
4073 EINA_LIST_FREE(input_rect_sd->input_rect_data_list, input_rect_data)
4075 if (input_rect_data->obj)
4077 evas_object_smart_member_del(input_rect_data->obj);
4078 E_FREE_FUNC(input_rect_data->obj, evas_object_del);
4080 E_FREE(input_rect_data);
4085 e_comp_object_input_area_set(Evas_Object *obj, int x, int y, int w, int h)
4088 E_Input_Rect_Data *input_rect_data = NULL;
4089 E_Input_Rect_Smart_Data *input_rect_sd;
4090 int client_w, client_h;
4092 if (cw->ec->client.w)
4093 client_w = cw->ec->client.w;
4095 client_w = cw->ec->w;
4097 if (cw->ec->client.h)
4098 client_h = cw->ec->client.h;
4100 client_h = cw->ec->h;
4102 E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, client_w, client_h);
4106 _e_comp_input_obj_smart_init();
4107 cw->input_obj = evas_object_smart_add(e_comp->evas, _e_comp_input_obj_smart);
4108 evas_object_smart_member_add(cw->input_obj, cw->smart_obj);
4109 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4112 input_rect_sd->cw = cw;
4115 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4118 input_rect_data = E_NEW(E_Input_Rect_Data, 1);
4119 if (input_rect_data)
4121 EINA_RECTANGLE_SET(&input_rect_data->rect, x, y, w, h);
4122 input_rect_sd->input_rect_data_list = eina_list_append(input_rect_sd->input_rect_data_list, input_rect_data);
4126 if ((input_rect_data) &&
4127 (x || y || (w != cw->ec->client.w) || (h != cw->ec->client.h)))
4129 input_rect_data->obj = evas_object_rectangle_add(e_comp->evas);
4130 evas_object_name_set(input_rect_data->obj, "cw->input_obj");
4131 evas_object_color_set(input_rect_data->obj, 0, 0, 0, 0);
4132 evas_object_clip_set(input_rect_data->obj, cw->clip);
4133 evas_object_smart_member_add(input_rect_data->obj, cw->input_obj);
4134 evas_object_geometry_set(input_rect_data->obj,
4135 cw->ec->client.x + (!!cw->frame_object * cw->client_inset.l) + x,
4136 cw->ec->client.y + (!!cw->frame_object * cw->client_inset.t) + y, w, h);
4137 evas_object_pass_events_set(cw->default_input_obj, 1);
4138 evas_object_pass_events_set(cw->obj, 1);
4141 evas_object_show(input_rect_data->obj);
4142 evas_object_show(cw->input_obj);
4147 evas_object_smart_member_del(cw->input_obj);
4148 E_FREE_FUNC(cw->input_obj, evas_object_del);
4149 evas_object_pass_events_set(cw->default_input_obj, 0);
4150 evas_object_pass_events_set(cw->obj, 0);
4155 e_comp_object_input_rect_get(Evas_Object *obj, Eina_List **list)
4158 E_Input_Rect_Smart_Data *input_rect_sd;
4159 E_Input_Rect_Data *input_rect_data;
4162 if (!cw->input_obj) return;
4164 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4167 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
4169 *list = eina_list_append(*list, &input_rect_data->rect);
4175 e_comp_object_frame_geometry_get(Evas_Object *obj, int *l, int *r, int *t, int *b)
4178 if (l) *l = cw->client_inset.l;
4179 if (r) *r = cw->client_inset.r;
4180 if (t) *t = cw->client_inset.t;
4181 if (b) *b = cw->client_inset.b;
4184 /* set geometry for CSD */
4186 e_comp_object_frame_geometry_set(Evas_Object *obj, int l, int r, int t, int b)
4192 if (cw->frame_object)
4193 CRI("ACK! ec:%p", cw->ec);
4194 if ((cw->client_inset.l == l) && (cw->client_inset.r == r) &&
4195 (cw->client_inset.t == t) && (cw->client_inset.b == b)) return;
4196 calc = cw->client_inset.calc;
4197 cw->client_inset.calc = l || r || t || b;
4198 eina_stringshare_replace(&cw->frame_theme, "borderless");
4199 if (cw->client_inset.calc)
4201 tw = cw->ec->w + ((l + r) - (cw->client_inset.l + cw->client_inset.r));
4202 th = cw->ec->h + ((t + b) - (cw->client_inset.t + cw->client_inset.b));
4203 e_client_size_set(cw->ec, tw, th);
4205 else if (cw->ec->maximized || cw->ec->fullscreen)
4207 cw->ec->saved.w -= ((l + r) - (cw->client_inset.l + cw->client_inset.r));
4208 cw->ec->saved.h -= ((t + b) - (cw->client_inset.t + cw->client_inset.b));
4210 if (!cw->ec->new_client)
4212 if (calc && cw->client_inset.calc)
4214 tx = cw->ec->x - (l - cw->client_inset.l);
4215 ty = cw->ec->y - (t - cw->client_inset.t);
4216 e_client_pos_set(cw->ec, tx, ty);
4218 cw->ec->changes.pos = cw->ec->changes.size = 1;
4221 cw->client_inset.l = l;
4222 cw->client_inset.r = r;
4223 cw->client_inset.t = t;
4224 cw->client_inset.b = b;
4228 e_comp_object_frame_allowed(Evas_Object *obj)
4230 API_ENTRY EINA_FALSE;
4231 return (cw->frame_object || (!cw->client_inset.calc));
4235 e_comp_object_frame_exists(Evas_Object *obj)
4237 API_ENTRY EINA_FALSE;
4238 return !!cw->frame_object;
4242 e_comp_object_frame_theme_set(Evas_Object *obj, const char *name)
4244 Evas_Object *o, *pbg;
4247 Eina_Stringshare *theme;
4249 API_ENTRY EINA_FALSE;
4251 if (!e_util_strcmp(cw->frame_theme, name))
4252 return edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object ?: cw->obj);
4253 if (!e_util_strcmp(name, "COMP_RESHADOW"))
4254 return _e_comp_object_shadow_setup(cw);
4255 pbg = cw->frame_object;
4256 theme = eina_stringshare_add(name);
4258 if (cw->frame_object)
4262 w = cw->ec->w, h = cw->ec->h;
4263 e_comp_object_frame_wh_unadjust(obj, w, h, &cw->ec->w, &cw->ec->h);
4264 if ((cw->ec->w != w) || (cw->ec->h != h))
4266 cw->ec->changes.size = 1;
4269 E_FREE_FUNC(cw->frame_object, evas_object_del);
4270 if (!name) goto reshadow;
4272 o = edje_object_add(e_comp->evas);
4273 snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", name);
4274 ok = e_theme_edje_object_set(o, "base/theme/border", buf);
4275 if ((!ok) && (!e_util_strcmp(name, "borderless")))
4277 cw->frame_object = NULL;
4279 eina_stringshare_del(cw->frame_theme);
4280 cw->frame_theme = theme;
4285 if (theme != e_config->theme_default_border_style)
4287 snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", e_config->theme_default_border_style);
4288 ok = e_theme_edje_object_set(o, "base/theme/border", buf);
4292 ok = e_theme_edje_object_set(o, "base/theme/border",
4293 "e/widgets/border/default/border");
4294 if (ok && (theme == e_config->theme_default_border_style))
4296 /* Reset default border style to default */
4297 eina_stringshare_replace(&e_config->theme_default_border_style, "default");
4298 e_config_save_queue();
4305 cw->frame_object = o;
4306 eina_stringshare_del(cw->frame_theme);
4307 cw->frame_theme = theme;
4308 evas_object_name_set(o, "cw->frame_object");
4311 edje_object_part_text_set(o, "e.text.title", cw->frame_name);
4315 cw->ec->changes.icon = 1;
4321 CRI("USER IS USING A SHITTY THEME! ABORT!!!!");
4326 _e_comp_object_shadow_setup(cw);
4329 int old_x, old_y, new_x = 0, new_y = 0;
4331 old_x = cw->x, old_y = cw->y;
4333 _e_comp_smart_cb_frame_recalc(cw, cw->smart_obj, NULL);
4335 new_x = cw->ec->x, new_y = cw->ec->y;
4336 else if (cw->ec->placed || (!cw->ec->new_client))
4338 /* if no previous frame:
4339 * - reapply client_inset
4344 if (cw->ec->changes.size)
4352 zone = e_comp_zone_find_by_ec(cw->ec);
4355 x = cw->ec->client.x, y = cw->ec->client.y;
4356 x = MAX(zone->x, cw->ec->client.x - cw->client_inset.l);
4357 y = MAX(zone->y, cw->ec->client.y - cw->client_inset.t);
4359 new_x = x, new_y = y;
4362 if (old_x != new_x || old_y != new_y)
4364 /* this guarantees that we won't get blocked by the NOP check in the interceptor */
4365 cw->y = cw->x = -99999;
4366 evas_object_move(obj, new_x, new_y);
4370 if (cw->ec->maximized)
4372 cw->ec->changes.need_maximize = 1;
4375 evas_object_smart_callback_call(cw->smart_obj, "frame_changed", NULL);
4376 if (cw->frame_object)
4378 cw->frame_extends = !!edje_object_data_get(cw->frame_object, "frame_extends");
4381 cw->frame_extends = 0;
4382 evas_object_del(pbg);
4387 e_comp_object_signal_emit(Evas_Object *obj, const char *sig, const char *src)
4389 E_Comp_Object_Mover *prov;
4392 //INF("EMIT %p: %s %s", cw->ec, sig, src);
4393 edje_object_signal_emit(cw->shobj, sig, src);
4394 if (cw->frame_object) edje_object_signal_emit(cw->frame_object, sig, src);
4395 if ((cw->ec->override && e_comp_config_get()->match.disable_overrides) ||
4396 ((!cw->ec->override) && e_comp_config_get()->match.disable_borders))
4398 /* start with highest priority callback first */
4399 EINA_INLIST_REVERSE_FOREACH(_e_comp_object_movers, prov)
4401 if (!e_util_glob_match(sig, prov->sig)) continue;
4402 if (prov->func(prov->data, obj, sig)) break;
4407 e_comp_object_signal_callback_add(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb, const void *data)
4409 /* FIXME: at some point I guess this should use eo to inherit
4410 * -EDJE_OBJ_SUB_ID_SIGNAL_CALLBACK_ADD
4411 * -EDJE_OBJ_SUB_ID_SIGNAL_CALLBACK_DEL
4414 edje_object_signal_callback_add(cw->shobj, sig, src, cb, (void*)data);
4418 e_comp_object_signal_callback_del(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb)
4421 edje_object_signal_callback_del(cw->shobj, sig, src, cb);
4425 e_comp_object_signal_callback_del_full(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb, const void *data)
4428 edje_object_signal_callback_del_full(cw->shobj, sig, src, cb, (void*)data);
4432 e_comp_object_damage(Evas_Object *obj, int x, int y, int w, int h)
4435 Eina_Rectangle rect;
4438 if (cw->ec->input_only || (!cw->updates)) return;
4439 if (cw->nocomp) return;
4440 rect.x = x, rect.y = y;
4441 rect.w = w, rect.h = h;
4442 evas_object_smart_callback_call(obj, "damage", &rect);
4444 if (e_comp_is_on_overlay(cw->ec))
4446 /* It will not set hwc_need_update value if E modules already cleanup pixmap
4447 * resource on the E_COMP_WL_HOOK_BUFFER_CHANGE hook function. It means that
4448 * E module attempts to block screen update due to the particular policy.
4450 if (e_pixmap_resource_get(cw->ec->pixmap))
4451 cw->hwc_need_update = EINA_TRUE;
4454 /* ignore overdraw */
4455 if (cw->updates_full)
4457 RENDER_DEBUG("IGNORED %p: %d,%d %dx%d", cw->ec, x, y, w, h);
4458 e_comp_object_render_update_add(obj);
4460 if ((cw->ec->visible) && (!evas_object_visible_get(cw->smart_obj)) && (!cw->ec->iconic))
4461 evas_object_show(cw->smart_obj);
4465 /* clip rect to client surface */
4466 RENDER_DEBUG("DAMAGE(%d,%d %dx%d) CLIP(%dx%d)", x, y, w, h, cw->ec->client.w, cw->ec->client.h);
4467 E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, cw->ec->client.w, cw->ec->client.h);
4468 /* if rect is the total size of the client after clip, clear the updates
4469 * since this is guaranteed to be the whole region anyway
4471 eina_tiler_area_size_get(cw->updates, &tw, &th);
4472 if ((w > tw) || (h > th))
4474 RENDER_DEBUG("DAMAGE RESIZE %p: %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
4475 eina_tiler_clear(cw->updates);
4476 eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
4478 tw = cw->ec->client.w, th = cw->ec->client.h;
4480 if ((!x) && (!y) && (w == tw) && (h == th))
4482 eina_tiler_clear(cw->updates);
4483 RENDER_DEBUG("DAMAGE FULL: %p", cw->ec);
4484 cw->updates_full = 1;
4485 cw->update_count = 0;
4488 if (cw->update_count > UPDATE_MAX)
4490 /* this is going to get really dumb, so just update the whole thing */
4491 eina_tiler_clear(cw->updates);
4492 cw->update_count = cw->updates_full = 1;
4493 eina_tiler_rect_add(cw->updates, &(Eina_Rectangle){0, 0, tw, th});
4494 RENDER_DEBUG("DAMAGE MAX: %dx%d", tw, th);
4498 eina_tiler_rect_add(cw->updates, &(Eina_Rectangle){x, y, w, h});
4499 RENDER_DEBUG("DAMAGE: %d,%d %dx%d", x, y, w, h);
4501 cw->updates_exist = 1;
4502 e_comp_object_render_update_add(obj);
4504 if ((cw->ec->visible) && (!evas_object_visible_get(cw->smart_obj)) && (!cw->ec->iconic))
4505 evas_object_show(cw->smart_obj);
4509 e_comp_object_damage_exists(Evas_Object *obj)
4511 API_ENTRY EINA_FALSE;
4512 return cw->updates_exist;
4516 e_comp_object_render_update_add(Evas_Object *obj)
4520 if (cw->ec->input_only || (!cw->updates) || (!cw->redirected)) return;
4521 if (cw->render_update_lock.lock) return;
4522 if (!e_pixmap_usable_get(cw->ec->pixmap)) return;
4526 e_comp->updates = eina_list_append(e_comp->updates, cw->ec);
4528 e_comp_render_queue();
4532 e_comp_object_render_update_del(Evas_Object *obj)
4536 if (cw->ec->input_only || (!cw->updates)) return;
4537 if (!cw->update) return;
4539 /* this gets called during comp animating to clear the update flag */
4540 if (e_comp->grabbed) return;
4541 e_comp->updates = eina_list_remove(e_comp->updates, cw->ec);
4542 if (!e_comp->updates)
4544 E_FREE_FUNC(e_comp->update_job, ecore_job_del);
4545 if (e_comp->render_animator)
4546 ecore_animator_freeze(e_comp->render_animator);
4551 e_comp_object_shape_apply(Evas_Object *obj)
4555 unsigned int i, *pix, *p;
4559 if (!cw->ec) return; //NYI
4560 if (cw->external_content) return;
4563 if ((cw->ec->shape_rects_num >= 1) &&
4564 (!_e_comp_shaped_check(cw->ec->client.w, cw->ec->client.h, cw->ec->shape_rects, cw->ec->shape_rects_num)))
4569 ERR("BUGGER: shape with native surface? cw=%p", cw);
4572 evas_object_image_size_get(cw->obj, &w, &h);
4573 if ((w < 1) || (h < 1)) return;
4576 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4577 _e_comp_object_alpha_set(cw);
4578 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4579 evas_object_image_alpha_set(o, 1);
4581 p = pix = evas_object_image_data_get(cw->obj, 1);
4584 evas_object_image_data_set(cw->obj, pix);
4589 unsigned char *spix, *sp;
4591 spix = calloc(w * h, sizeof(unsigned char));
4593 for (i = 0; i < cw->ec->shape_rects_num; i++)
4597 rx = cw->ec->shape_rects[i].x; ry = cw->ec->shape_rects[i].y;
4598 rw = cw->ec->shape_rects[i].w; rh = cw->ec->shape_rects[i].h;
4599 E_RECTS_CLIP_TO_RECT(rx, ry, rw, rh, 0, 0, w, h);
4600 sp = spix + (w * ry) + rx;
4601 for (py = 0; py < rh; py++)
4603 for (px = 0; px < rw; px++)
4611 for (py = 0; py < h; py++)
4613 for (px = 0; px < w; px++)
4615 unsigned int mask, imask;
4617 mask = ((unsigned int)(*sp)) << 24;
4619 imask |= imask >> 8;
4620 imask |= imask >> 8;
4621 *p = mask | (*p & imask);
4622 //if (*sp) *p = 0xff000000 | *p;
4623 //else *p = 0x00000000;
4632 for (py = 0; py < h; py++)
4634 for (px = 0; px < w; px++)
4638 evas_object_image_data_set(cw->obj, pix);
4639 evas_object_image_data_update_add(cw->obj, 0, 0, w, h);
4640 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4642 evas_object_image_data_set(o, pix);
4643 evas_object_image_data_update_add(o, 0, 0, w, h);
4645 // don't need to fix alpha chanel as blending
4646 // should be totally off here regardless of
4647 // alpha channel content
4651 _e_comp_object_clear(E_Comp_Object *cw)
4656 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
4658 if (cw->render_update_lock.lock) return;
4661 e_pixmap_clear(cw->ec->pixmap);
4663 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4664 evas_object_image_size_set(cw->obj, 1, 1);
4665 evas_object_image_data_set(cw->obj, NULL);
4666 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4668 evas_object_image_size_set(o, 1, 1);
4669 evas_object_image_data_set(o, NULL);
4672 e_comp_object_render_update_del(cw->smart_obj);
4676 _e_comp_object_transparent_set(Evas_Object *obj, Eina_Bool set)
4680 API_ENTRY EINA_FALSE;
4682 if (cw->transparent.set == set)
4687 evas_object_color_get(obj, &r, &g, &b, &a);
4689 cw->transparent.user_r = r;
4690 cw->transparent.user_g = g;
4691 cw->transparent.user_b = b;
4692 cw->transparent.user_a = a;
4694 cw->transparent.setting = EINA_TRUE;
4695 evas_object_color_set(obj, 0, 0, 0, 0);
4696 cw->transparent.setting = EINA_FALSE;
4698 ELOGF("COMP", "Transparent enabled user_color(%d,%d,%d,%d)",
4700 cw->transparent.user_r,
4701 cw->transparent.user_g,
4702 cw->transparent.user_b,
4703 cw->transparent.user_a);
4705 cw->transparent.set = EINA_TRUE;
4709 cw->transparent.set = EINA_FALSE;
4711 evas_object_color_set(obj,
4712 cw->transparent.user_r,
4713 cw->transparent.user_g,
4714 cw->transparent.user_b,
4715 cw->transparent.user_a);
4717 ELOGF("COMP", "Transparent disabled user_color(%d,%d,%d,%d)",
4719 cw->transparent.user_r,
4720 cw->transparent.user_g,
4721 cw->transparent.user_b,
4722 cw->transparent.user_a);
4728 /* helper function to simplify toggling of redirection for display servers which support it */
4730 e_comp_object_redirected_set(Evas_Object *obj, Eina_Bool set)
4735 if (cw->redirected == set) return;
4736 cw->redirected = set;
4737 if (cw->external_content) return;
4739 e_comp_object_map_update(obj);
4743 if (cw->updates_exist)
4744 e_comp_object_render_update_add(obj);
4746 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4748 _e_comp_object_transparent_set(obj, EINA_FALSE);
4749 evas_object_smart_callback_call(obj, "redirected", NULL);
4753 _e_comp_object_clear(cw);
4754 _e_comp_object_transparent_set(obj, EINA_TRUE);
4755 evas_object_smart_callback_call(obj, "unredirected", NULL);
4760 _e_comp_object_cb_buffer_destroy(struct wl_listener *listener, void *data EINA_UNUSED)
4763 cw = container_of(listener, E_Comp_Object, buffer_destroy_listener);
4765 if (cw->buffer_destroy_listener.notify)
4767 cw->buffer_destroy_listener.notify = NULL;
4768 wl_list_remove(&cw->buffer_destroy_listener.link);
4771 if (e_object_is_del(E_OBJECT(cw->ec)))
4773 if (!e_object_delay_del_ref_get(E_OBJECT(cw->ec)))
4778 /* if it's current displaying buffer, do not remove its content */
4779 if (!evas_object_visible_get(cw->ec->frame))
4780 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4785 _e_comp_object_native_surface_set(E_Comp_Object *cw, Evas_Native_Surface *ns, Eina_Bool with_mirror)
4790 if (cw->buffer_destroy_listener.notify)
4792 wl_list_remove(&cw->buffer_destroy_listener.link);
4793 cw->buffer_destroy_listener.notify = NULL;
4796 if (cw->tbm_surface)
4798 tbm_surface_internal_unref(cw->tbm_surface);
4799 cw->tbm_surface = NULL;
4804 if ((ns->type == EVAS_NATIVE_SURFACE_WL) && (ns->data.wl.legacy_buffer))
4806 cw->buffer_destroy_listener.notify = _e_comp_object_cb_buffer_destroy;
4807 wl_resource_add_destroy_listener((struct wl_resource *)ns->data.wl.legacy_buffer, &cw->buffer_destroy_listener);
4809 else if ((ns->type == EVAS_NATIVE_SURFACE_TBM) && (ns->data.tbm.buffer))
4811 tbm_surface_internal_ref(ns->data.tbm.buffer);
4812 cw->tbm_surface = ns->data.tbm.buffer;
4816 TRACE_DS_BEGIN(NATIVE_SURFACE_SET);
4817 evas_object_image_native_surface_set(cw->obj, ns);
4821 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4823 evas_object_image_alpha_set(o, !!cw->ns ? 1 : cw->ec->argb);
4824 TRACE_DS_BEGIN(NATIVE_SURFACE_SET);
4825 evas_object_image_native_surface_set(o, ns);
4832 e_comp_object_native_surface_set(Evas_Object *obj, Eina_Bool set)
4834 Evas_Native_Surface ns;
4837 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
4838 if (cw->ec->input_only) return;
4839 if (cw->external_content) return;
4840 if (cw->render_update_lock.lock) return;
4843 memset(&ns, 0, sizeof(Evas_Native_Surface));
4847 /* native requires gl enabled, texture from pixmap enabled, and a non-shaped client */
4848 set = (!cw->ec->shaped);
4850 set = (!!cw->ns) || e_pixmap_native_surface_init(cw->ec->pixmap, &ns);
4854 _e_comp_object_native_surface_set(cw, set && (!cw->blanked) ? (cw->ns ? cw->ns : &ns) : NULL, EINA_TRUE);
4858 e_comp_object_native_surface_override(Evas_Object *obj, Evas_Native_Surface *ns)
4861 if (cw->ec->input_only) return;
4864 cw->ns = (Evas_Native_Surface*)eina_memdup((unsigned char*)ns, sizeof(Evas_Native_Surface), 0);
4865 _e_comp_object_alpha_set(cw);
4867 e_comp_object_native_surface_set(obj, cw->native);
4868 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4872 e_comp_object_blank(Evas_Object *obj, Eina_Bool set)
4878 if (cw->blanked == set) return;
4880 _e_comp_object_alpha_set(cw);
4883 _e_comp_object_native_surface_set(cw, NULL, EINA_FALSE);
4884 evas_object_image_data_set(cw->obj, NULL);
4888 e_comp_object_native_surface_set(obj, 1);
4889 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4893 _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)
4898 if (!_damage_trace) return;
4902 if (!evas_object_visible_get(cw->obj)) return;
4904 evas_object_geometry_get(cw->obj, &obj_x, &obj_y, NULL, NULL);
4906 o = evas_object_rectangle_add(e_comp->evas);
4907 evas_object_layer_set(o, E_LAYER_MAX);
4908 evas_object_name_set(o, "damage_trace");
4909 evas_object_move(o, dmg_x + obj_x, dmg_y + obj_y);
4910 evas_object_resize(o, dmg_w, dmg_h);
4911 evas_object_color_set(o, 0, 128, 0, 128);
4912 evas_object_render_op_set(o, EVAS_RENDER_BLEND);
4913 evas_object_pass_events_set(o, EINA_TRUE);
4914 evas_object_show(o);
4916 ELOGF("COMP", "add damage(%dx%d+%d+%d) origin(%dx%d+%d+%d)",
4918 dmg_w, dmg_h, dmg_x, dmg_y,
4919 origin->w, origin->h, origin->x, origin->y);
4921 _damage_trace_objs = eina_list_append(_damage_trace_objs, o);
4924 /* mark an object as dirty and setup damages */
4926 e_comp_object_dirty(Evas_Object *obj)
4929 Eina_Rectangle *rect;
4933 Eina_Bool dirty, visible;
4937 if (cw->external_content) return;
4938 if (!cw->redirected) return;
4939 if (cw->render_update_lock.lock)
4941 ELOGF("COMP", "Render update locked:%d", cw->ec, cw->render_update_lock.lock);
4944 /* only actually dirty if pixmap is available */
4945 if (!e_pixmap_resource_get(cw->ec->pixmap))
4947 // e_pixmap_size_get returns last attached buffer size
4948 // eventhough it is destroyed
4949 ERR("ERROR NO PIXMAP FOR ec:%p", cw->ec);
4952 dirty = e_pixmap_size_get(cw->ec->pixmap, &w, &h);
4953 visible = cw->visible;
4954 if (!dirty) w = h = 1;
4955 evas_object_image_pixels_dirty_set(cw->obj, cw->blanked ? 0 : dirty);
4957 evas_object_image_data_set(cw->obj, NULL);
4958 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
4959 evas_object_image_size_set(cw->obj, tw, th);
4960 if (cw->mask.obj) evas_object_resize(cw->mask.obj, w, h);
4961 if (cw->pending_updates)
4962 eina_tiler_area_size_set(cw->pending_updates, w, h);
4963 EINA_LIST_FOREACH(cw->obj_mirror, ll, o)
4965 evas_object_image_pixels_dirty_set(o, dirty);
4967 evas_object_image_data_set(o, NULL);
4968 evas_object_image_size_set(o, tw, th);
4969 visible |= evas_object_visible_get(o);
4973 ERR("ERROR FETCHING PIXMAP FOR %p", cw->ec);
4977 e_comp_object_native_surface_set(obj, 1);
4979 m = _e_comp_object_map_damage_transform_get(cw->ec);
4980 it = eina_tiler_iterator_new(cw->updates);
4981 EINA_ITERATOR_FOREACH(it, rect)
4983 /* evas converts damage according to rotation of ecore_evas in damage_region_set
4984 * of evas engine and doesn't convert damage according to evas_map.
4985 * so damage of evas_object_image use surface coordinate.
4989 int damage_x, damage_y, damage_w, damage_h;
4991 _e_comp_object_map_damage_transform_rect(cw->ec, m, rect->x, rect->y, rect->w, rect->h,
4992 &damage_x, &damage_y, &damage_w, &damage_h);
4993 evas_object_image_data_update_add(cw->obj, damage_x, damage_y, damage_w, damage_h);
4994 _e_comp_object_damage_trace_rect_set(obj, rect, damage_x, damage_y, damage_w, damage_h);
4998 evas_object_image_data_update_add(cw->obj, rect->x, rect->y, rect->w, rect->h);
4999 _e_comp_object_damage_trace_rect_set(obj, rect, rect->x, rect->y, rect->w, rect->h);
5002 EINA_LIST_FOREACH(cw->obj_mirror, ll, o)
5003 evas_object_image_data_update_add(o, rect->x, rect->y, rect->w, rect->h);
5004 if (cw->pending_updates)
5005 eina_tiler_rect_add(cw->pending_updates, rect);
5007 eina_iterator_free(it);
5008 if (m) e_map_free(m);
5009 if (cw->pending_updates)
5010 eina_tiler_clear(cw->updates);
5013 cw->pending_updates = cw->updates;
5014 cw->updates = eina_tiler_new(w, h);
5015 eina_tiler_tile_size_set(cw->updates, 1, 1);
5017 cw->update_count = cw->updates_full = cw->updates_exist = 0;
5018 evas_object_smart_callback_call(obj, "dirty", NULL);
5019 if (cw->visible || (!visible) || (!cw->pending_updates) || cw->native) return;
5020 /* force render if main object is hidden but mirrors are visible */
5021 RENDER_DEBUG("FORCING RENDER %p", cw->ec);
5022 e_comp_object_render(obj);
5026 e_comp_object_render(Evas_Object *obj)
5033 API_ENTRY EINA_FALSE;
5035 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5036 if (cw->ec->input_only) return EINA_TRUE;
5037 if (cw->external_content) return EINA_TRUE;
5038 if (cw->native) return EINA_FALSE;
5039 /* if comp object is not redirected state, comp object should not be set by newly committed data
5040 because image size of comp object is 1x1 and it should not be shown on canvas */
5041 if (!cw->redirected) return EINA_TRUE;
5042 if (cw->render_update_lock.lock)
5044 ELOGF("COMP", "Render update locked:%d", cw->ec, cw->render_update_lock.lock);
5047 e_comp_object_render_update_del(obj);
5048 if (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph)) return EINA_FALSE;
5050 if (!cw->pending_updates)
5052 WRN("RENDER [%p]: NO RECTS!", cw->ec);
5053 evas_object_image_data_set(cw->obj, NULL);
5054 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
5055 evas_object_image_data_set(o, NULL);
5059 evas_object_image_pixels_dirty_set(cw->obj, EINA_FALSE);
5061 RENDER_DEBUG("RENDER SIZE: %dx%d", pw, ph);
5063 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5066 e_pixmap_image_refresh(cw->ec->pixmap);
5067 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5070 if ((pix) && ((!cw->blanked) || (cw->obj_mirror)))
5071 e_pixmap_image_data_ref(cw->ec->pixmap);
5073 /* set pixel data */
5074 evas_object_image_data_set(cw->obj, cw->blanked ? NULL : pix);
5075 _e_comp_object_alpha_set(cw);
5076 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
5078 evas_object_image_data_set(o, pix);
5079 evas_object_image_alpha_set(o, evas_object_image_alpha_get(cw->obj));
5080 evas_object_image_pixels_dirty_set(o, EINA_FALSE);
5083 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
5085 e_comp_client_post_update_add(cw->ec);
5090 /* create a duplicate of an evas object */
5092 e_comp_object_util_mirror_add(Evas_Object *obj)
5096 unsigned int *pix = NULL;
5097 Eina_Bool argb = EINA_FALSE;
5102 cw = evas_object_data_get(obj, "comp_mirror");
5105 o = evas_object_image_filled_add(evas_object_evas_get(obj));
5106 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
5107 evas_object_image_smooth_scale_set(o, e_comp_config_get()->smooth_windows);
5108 evas_object_image_alpha_set(o, 1);
5109 evas_object_image_source_set(o, obj);
5112 if ((!cw->ec) || (!e_pixmap_size_get(cw->ec->pixmap, &w, &h))) return NULL;
5113 if (cw->external_content)
5115 ERR("%p of client %p is external content.", obj, cw->ec);
5118 o = evas_object_image_filled_add(evas_object_evas_get(obj));
5119 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
5120 evas_object_image_smooth_scale_set(o, e_comp_config_get()->smooth_windows);
5121 cw->obj_mirror = eina_list_append(cw->obj_mirror, o);
5122 evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, _e_comp_object_cb_mirror_del, cw);
5123 evas_object_event_callback_add(o, EVAS_CALLBACK_SHOW, _e_comp_object_cb_mirror_show, cw);
5124 evas_object_event_callback_add(o, EVAS_CALLBACK_HIDE, _e_comp_object_cb_mirror_hide, cw);
5125 evas_object_data_set(o, "E_Client_Mirror", cw->ec);
5126 evas_object_data_set(o, "comp_mirror", cw);
5128 evas_object_image_alpha_set(o, evas_object_image_alpha_get(cw->obj));
5129 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
5131 evas_object_image_size_set(o, tw, th);
5134 pix = evas_object_image_data_get(cw->obj, 0);
5140 evas_object_image_native_surface_set(o, cw->ns);
5143 Evas_Native_Surface ns;
5144 memset(&ns, 0, sizeof(Evas_Native_Surface));
5145 if (e_pixmap_native_surface_init(cw->ec->pixmap, &ns))
5146 evas_object_image_native_surface_set(o, &ns);
5151 /* FIXME: legacy code, please refer to commit 5e6831187a1 */
5152 argb = e_pixmap_image_is_argb(cw->ec->pixmap);
5154 (e_pixmap_image_exists(cw->ec->pixmap)))
5155 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5157 pix = evas_object_image_data_get(cw->obj, EINA_FALSE);
5164 dirty = evas_object_image_pixels_dirty_get(cw->obj);
5165 evas_object_image_pixels_dirty_set(o, dirty);
5166 evas_object_image_data_set(o, pix);
5167 evas_object_image_data_set(cw->obj, pix);
5169 evas_object_image_data_update_add(o, 0, 0, tw, th);
5174 //////////////////////////////////////////////////////
5177 e_comp_object_effect_allowed_get(Evas_Object *obj)
5179 API_ENTRY EINA_FALSE;
5181 if (!cw->shobj) return EINA_FALSE;
5182 if (cw->ec->override) return !e_comp_config_get()->match.disable_overrides;
5183 return !e_comp_config_get()->match.disable_borders;
5186 /* setup an api effect for a client */
5188 e_comp_object_effect_set(Evas_Object *obj, const char *effect)
5191 Eina_Stringshare *grp;
5192 E_Comp_Config *config;
5193 Eina_Bool loaded = EINA_FALSE;
5195 API_ENTRY EINA_FALSE;
5196 if (!cw->shobj) return EINA_FALSE; //input window
5198 if (!effect) effect = "none";
5199 snprintf(buf, sizeof(buf), "e/comp/effects/%s", effect);
5201 config = e_comp_config_get();
5202 if ((config) && (config->effect_file))
5204 if (edje_object_file_set(cw->effect_obj, config->effect_file, buf))
5206 cw->effect_set = EINA_TRUE;
5213 edje_object_file_get(cw->effect_obj, NULL, &grp);
5214 cw->effect_set = !eina_streq(effect, "none");
5215 if (!e_util_strcmp(buf, grp)) return cw->effect_set;
5216 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", buf))
5218 snprintf(buf, sizeof(buf), "e/comp/effects/auto/%s", effect);
5219 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", buf))
5220 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", "e/comp/effects/none"))
5222 if (cw->effect_running)
5224 if (!e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb")))
5227 cw->effect_set = EINA_FALSE;
5228 return cw->effect_set;
5232 if (cw->effect_running)
5234 if (!e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb")))
5237 ELOGF("COMP", "EFFECT Set GROUP[%s]", cw->ec, buf);
5238 edje_object_part_swallow(cw->effect_obj, "e.swallow.content", cw->shobj);
5239 if (cw->effect_clip)
5241 evas_object_clip_unset(cw->clip);
5242 cw->effect_clip = 0;
5244 cw->effect_clip_able = !edje_object_data_get(cw->effect_obj, "noclip");
5246 _e_comp_object_dim_update(cw);
5248 return cw->effect_set;
5251 /* set params for embryo scripts in effect */
5253 e_comp_object_effect_params_set(Evas_Object *obj, int id, int *params, unsigned int count)
5255 Edje_Message_Int_Set *msg;
5259 EINA_SAFETY_ON_NULL_RETURN(params);
5260 EINA_SAFETY_ON_FALSE_RETURN(count);
5261 if (!cw->effect_set) return;
5263 msg = alloca(sizeof(Edje_Message_Int_Set) + ((count - 1) * sizeof(int)));
5264 msg->count = (int)count;
5265 for (x = 0; x < count; x++)
5266 msg->val[x] = params[x];
5267 edje_object_message_send(cw->effect_obj, EDJE_MESSAGE_INT_SET, id, msg);
5268 edje_object_message_signal_process(cw->effect_obj);
5272 _e_comp_object_effect_end_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
5274 Edje_Signal_Cb end_cb;
5276 E_Comp_Object *cw = data;
5278 edje_object_signal_callback_del_full(obj, "e,action,done", "e", _e_comp_object_effect_end_cb, NULL);
5279 cw->effect_running = 0;
5280 if (!_e_comp_object_animating_end(cw)) return;
5282 if (evas_object_data_get(cw->smart_obj, "effect_running"))
5284 evas_object_data_del(cw->smart_obj, "effect_running");
5285 _e_comp_object_event_simple(obj, E_EVENT_COMP_OBJECT_EFFECT_END);
5286 e_comp_visibility_calculation_set(EINA_TRUE);
5289 end_cb = evas_object_data_get(obj, "_e_comp.end_cb");
5290 if (!end_cb) return;
5291 end_data = evas_object_data_get(obj, "_e_comp.end_data");
5292 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_END, cw->ec);
5293 end_cb(end_data, cw->smart_obj, emission, source);
5296 /* clip effect to client's zone */
5298 e_comp_object_effect_clip(Evas_Object *obj)
5302 zone = e_comp_zone_find_by_ec(cw->ec);
5304 if (cw->effect_clip) e_comp_object_effect_unclip(cw->smart_obj);
5305 if (!cw->effect_clip_able) return;
5306 evas_object_clip_set(cw->smart_obj, zone->bg_clip_object);
5307 cw->effect_clip = 1;
5310 /* unclip effect from client's zone */
5312 e_comp_object_effect_unclip(Evas_Object *obj)
5315 if (!cw->effect_clip) return;
5316 evas_object_clip_unset(cw->smart_obj);
5317 cw->effect_clip = 0;
5320 /* start effect, running end_cb after */
5322 e_comp_object_effect_start(Evas_Object *obj, Edje_Signal_Cb end_cb, const void *end_data)
5324 API_ENTRY EINA_FALSE;
5325 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE); //NYI
5326 if (!cw->effect_set) return EINA_FALSE;
5328 if (cw->effect_running)
5330 e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb"));
5333 e_comp_object_effect_clip(obj);
5334 edje_object_signal_callback_del(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb);
5336 edje_object_signal_callback_add(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb, cw);
5337 evas_object_data_set(cw->effect_obj, "_e_comp.end_cb", end_cb);
5338 evas_object_data_set(cw->effect_obj, "_e_comp.end_data", end_data);
5339 evas_object_data_set(cw->smart_obj, "effect_running", (void*)1);
5341 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_START, cw->ec);
5342 _e_comp_object_event_simple(obj, E_EVENT_COMP_OBJECT_EFFECT_START);
5344 edje_object_signal_emit(cw->effect_obj, "e,action,go", "e");
5345 _e_comp_object_animating_begin(cw);
5346 cw->effect_running = 1;
5350 /* stop a currently-running effect immediately */
5352 e_comp_object_effect_stop(Evas_Object *obj, Edje_Signal_Cb end_cb)
5355 Edje_Signal_Cb end_cb_before = NULL;
5356 void *end_data_before = NULL;
5357 API_ENTRY EINA_FALSE;
5359 end_cb_before = evas_object_data_get(cw->effect_obj, "_e_comp.end_cb");
5360 end_data_before = evas_object_data_get(cw->effect_obj, "_e_comp.end_data");
5362 if (end_cb_before != end_cb) return EINA_TRUE;
5363 e_comp_object_effect_unclip(obj);
5364 if (cw->effect_clip)
5366 evas_object_clip_unset(cw->effect_obj);
5367 cw->effect_clip = 0;
5369 edje_object_signal_emit(cw->effect_obj, "e,action,stop", "e");
5370 edje_object_signal_callback_del_full(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb, cw);
5372 if (evas_object_data_get(cw->smart_obj, "effect_running"))
5374 evas_object_data_del(cw->smart_obj, "effect_running");
5375 e_comp_visibility_calculation_set(EINA_TRUE);
5378 cw->effect_running = 0;
5379 ret = _e_comp_object_animating_end(cw);
5381 if ((ret) && (end_cb_before))
5383 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_END, cw->ec);
5384 end_cb_before(end_data_before, cw->smart_obj, "e,action,done", "e");
5391 _e_comp_object_effect_mover_sort_cb(E_Comp_Object_Mover *a, E_Comp_Object_Mover *b)
5393 return a->pri - b->pri;
5396 /* add a function to trigger based on signal emissions for the purpose of modifying effects */
5397 E_API E_Comp_Object_Mover *
5398 e_comp_object_effect_mover_add(int pri, const char *sig, E_Comp_Object_Mover_Cb provider, const void *data)
5400 E_Comp_Object_Mover *prov;
5402 prov = E_NEW(E_Comp_Object_Mover, 1);
5403 EINA_SAFETY_ON_NULL_RETURN_VAL(prov, NULL);
5404 prov->func = provider;
5405 prov->data = (void*)data;
5408 _e_comp_object_movers = eina_inlist_sorted_insert(_e_comp_object_movers, EINA_INLIST_GET(prov),
5409 (Eina_Compare_Cb)_e_comp_object_effect_mover_sort_cb);
5414 e_comp_object_effect_mover_del(E_Comp_Object_Mover *prov)
5416 EINA_SAFETY_ON_NULL_RETURN(prov);
5417 _e_comp_object_movers = eina_inlist_remove(_e_comp_object_movers, EINA_INLIST_GET(prov));
5422 e_comp_object_effect_object_get(Evas_Object *obj)
5426 return cw->effect_obj;
5430 e_comp_object_effect_hiding_set(Evas_Object *obj, Eina_Bool set)
5432 API_ENTRY EINA_FALSE;
5433 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5434 if (!cw->effect_set) return EINA_FALSE;
5441 ////////////////////////////////////
5444 _e_comp_object_autoclose_cleanup(Eina_Bool already_del)
5446 if (e_comp->autoclose.obj)
5448 e_comp_ungrab_input(0, 1);
5449 if (e_comp->autoclose.del_cb)
5450 e_comp->autoclose.del_cb(e_comp->autoclose.data, e_comp->autoclose.obj);
5451 else if (!already_del)
5453 evas_object_hide(e_comp->autoclose.obj);
5454 E_FREE_FUNC(e_comp->autoclose.obj, evas_object_del);
5456 E_FREE_FUNC(e_comp->autoclose.rect, evas_object_del);
5458 e_comp->autoclose.obj = NULL;
5459 e_comp->autoclose.data = NULL;
5460 e_comp->autoclose.del_cb = NULL;
5461 e_comp->autoclose.key_cb = NULL;
5462 E_FREE_FUNC(e_comp->autoclose.key_handler, ecore_event_handler_del);
5466 _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)
5468 _e_comp_object_autoclose_cleanup(0);
5472 _e_comp_object_autoclose_setup(Evas_Object *obj)
5474 if (!e_comp->autoclose.rect)
5476 /* create rect just below autoclose object to catch mouse events */
5477 e_comp->autoclose.rect = evas_object_rectangle_add(e_comp->evas);
5478 evas_object_move(e_comp->autoclose.rect, 0, 0);
5479 evas_object_resize(e_comp->autoclose.rect, e_comp->w, e_comp->h);
5480 evas_object_show(e_comp->autoclose.rect);
5481 evas_object_name_set(e_comp->autoclose.rect, "e_comp->autoclose.rect");
5482 evas_object_color_set(e_comp->autoclose.rect, 0, 0, 0, 0);
5483 evas_object_event_callback_add(e_comp->autoclose.rect, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_autoclose_mouse_up_cb, e_comp);
5484 e_comp_grab_input(0, 1);
5486 evas_object_layer_set(e_comp->autoclose.rect, evas_object_layer_get(obj) - 1);
5487 evas_object_focus_set(obj, 1);
5491 _e_comp_object_autoclose_show(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
5493 _e_comp_object_autoclose_setup(obj);
5494 evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show);
5498 _e_comp_object_autoclose_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
5500 evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show);
5501 _e_comp_object_autoclose_cleanup(1);
5502 if (e_client_focused_get()) return;
5504 E_Zone *zone = e_zone_current_get();
5507 e_zone_focus_reset(zone);
5511 e_comp_object_util_autoclose(Evas_Object *obj, E_Comp_Object_Autoclose_Cb del_cb, E_Comp_Object_Key_Cb cb, const void *data)
5515 if (e_comp->autoclose.obj)
5517 if (e_comp->autoclose.obj == obj) return;
5518 evas_object_event_callback_del_full(e_comp->autoclose.obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5519 e_comp->autoclose.obj = obj;
5520 e_comp->autoclose.del_cb = del_cb;
5521 e_comp->autoclose.key_cb = cb;
5522 e_comp->autoclose.data = (void*)data;
5523 if (evas_object_visible_get(obj))
5524 _e_comp_object_autoclose_setup(obj);
5526 evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show, e_comp);
5527 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5530 e_comp->autoclose.obj = obj;
5531 e_comp->autoclose.del_cb = del_cb;
5532 e_comp->autoclose.key_cb = cb;
5533 e_comp->autoclose.data = (void*)data;
5534 if (evas_object_visible_get(obj))
5535 _e_comp_object_autoclose_setup(obj);
5537 evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show, e_comp);
5538 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5542 e_comp_object_is_animating(Evas_Object *obj)
5546 return cw->animating;
5550 e_comp_object_alpha_set(Evas_Object *obj, Eina_Bool alpha)
5554 if ((cw->external_content) &&
5555 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
5557 WRN("Can set up alpha value to ONLY evas \"image\" object. "
5558 "But current external content is %d object for %p.",
5559 cw->content_type, cw->ec);
5563 cw->user_alpha_set = EINA_TRUE;
5564 cw->user_alpha = alpha;
5566 if (!cw->obj) return;
5568 if (alpha == evas_object_image_alpha_get(cw->obj)) return;
5570 evas_object_image_alpha_set(cw->obj, alpha);
5572 if ((!cw->native) && (!cw->external_content))
5573 evas_object_image_data_set(cw->obj, NULL);
5577 e_comp_object_alpha_get(Evas_Object *obj)
5579 API_ENTRY EINA_FALSE;
5581 return evas_object_image_alpha_get(cw->obj);
5585 e_comp_object_mask_set(Evas_Object *obj, Eina_Bool set)
5587 Eina_Bool mask_set = EINA_FALSE;
5591 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5592 if (cw->ec->input_only) return;
5599 o = evas_object_rectangle_add(e_comp->evas);
5600 evas_object_color_set(o, 0, 0, 0, 0);
5601 evas_object_clip_set(o, cw->clip);
5602 evas_object_smart_member_add(o, obj);
5603 evas_object_move(o, 0, 0);
5604 evas_object_resize(o, cw->w, cw->h);
5605 /* save render op value to restore when clear a mask.
5607 * NOTE: DO NOT change the render op on ec->frame while mask object
5608 * is set. it will overwrite the changed op value. */
5609 cw->mask.saved_render_op = evas_object_render_op_get(obj);
5610 evas_object_render_op_set(obj, EVAS_RENDER_COPY);
5611 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5612 if (cw->visible) evas_object_show(o);
5615 evas_object_name_set(cw->mask.obj, "cw->mask_obj");
5616 ELOGF("COMP", " |mask_obj", cw->ec);
5617 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_MASK_OBJECT_SET, cw->ec);
5624 evas_object_smart_member_del(cw->mask.obj);
5625 E_FREE_FUNC(cw->mask.obj, evas_object_del);
5627 evas_object_render_op_set(obj, cw->mask.saved_render_op);
5628 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET, cw->ec);
5634 e_comp_object_mask_has(Evas_Object *obj)
5636 API_ENTRY EINA_FALSE;
5638 return (cw->mask.obj) ? EINA_TRUE : EINA_FALSE;
5642 e_comp_object_size_update(Evas_Object *obj, int w, int h)
5647 if ((cw->external_content) &&
5648 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
5650 WRN("Can set up size to ONLY evas \"image\" object. "
5651 "But current external content is %d object for %p.",
5652 cw->content_type, cw->ec);
5656 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
5658 evas_object_image_size_set(cw->obj, tw, th);
5662 e_comp_object_transform_bg_set(Evas_Object *obj, Eina_Bool set)
5664 Eina_Bool transform_set = EINA_FALSE;
5666 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5667 if (cw->ec->input_only) return;
5669 transform_set = !!set;
5673 if (!cw->transform_bg_obj)
5675 Evas_Object *o = evas_object_rectangle_add(e_comp->evas);
5676 evas_object_move(o, 0, 0);
5677 evas_object_resize(o, 1, 1);
5678 if (cw->transform_bg_color.a >= 255)
5679 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5681 evas_object_render_op_set(o, EVAS_RENDER_BLEND);
5682 evas_object_color_set(o,
5683 cw->transform_bg_color.r,
5684 cw->transform_bg_color.g,
5685 cw->transform_bg_color.b,
5686 cw->transform_bg_color.a);
5687 if (cw->visible) evas_object_show(o);
5689 cw->transform_bg_obj = o;
5690 evas_object_name_set(cw->transform_bg_obj, "cw->transform_bg_obj");
5692 #ifdef REFACTOR_DESK_AREA
5693 e_comp_object_transform_obj_stack_update(obj);
5695 _e_comp_object_transform_obj_stack_update(obj);
5700 if (cw->transform_bg_obj)
5702 evas_object_smart_member_del(cw->transform_bg_obj);
5703 E_FREE_FUNC(cw->transform_bg_obj, evas_object_del);
5709 e_comp_object_transform_bg_color_set(Evas_Object *obj, int r, int g, int b, int a)
5713 cw->transform_bg_color.r = r;
5714 cw->transform_bg_color.g = g;
5715 cw->transform_bg_color.b = b;
5716 cw->transform_bg_color.a = a;
5718 if (cw->transform_bg_obj)
5720 evas_object_color_set(cw->transform_bg_obj,
5721 cw->transform_bg_color.r,
5722 cw->transform_bg_color.g,
5723 cw->transform_bg_color.b,
5724 cw->transform_bg_color.a);
5729 e_comp_object_transform_bg_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
5732 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5733 if (cw->ec->input_only) return;
5734 if (!cw->transform_bg_obj) return;
5736 _e_comp_object_transform_obj_map_set(cw->transform_bg_obj, vertices);
5740 e_comp_object_transform_bg_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
5743 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5744 if (cw->ec->input_only) return;
5745 if (!cw->transform_bg_obj) return;
5747 _e_comp_object_transform_obj_map_set_with_zoom(cw->transform_bg_obj, vertices, zoom);
5751 e_comp_object_transform_transp_set(Evas_Object *obj, Eina_Bool set)
5753 Eina_Bool transform_set = EINA_FALSE;
5755 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5756 if (cw->ec->input_only) return;
5758 transform_set = !!set;
5762 if (!cw->transform_tranp_obj)
5764 Evas_Object *o = evas_object_rectangle_add(e_comp->evas);
5765 evas_object_move(o, 0, 0);
5766 evas_object_resize(o, 1, 1);
5767 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5768 evas_object_color_set(o, 0, 0, 0, 0);
5769 if (cw->visible) evas_object_show(o);
5771 cw->transform_tranp_obj = o;
5772 evas_object_pass_events_set(cw->transform_tranp_obj, EINA_TRUE);
5773 ELOGF("TRANSFORM","transform set: TRUE", cw->ec);
5774 evas_object_name_set(cw->transform_tranp_obj, "cw->transform_trasp_obj");
5776 #ifdef REFACTOR_DESK_AREA
5777 e_comp_object_transform_obj_stack_update(obj);
5779 _e_comp_object_transform_obj_stack_update(obj);
5784 if (cw->transform_tranp_obj)
5786 ELOGF("TRANSFORM","transform set: FALSE", cw->ec);
5787 evas_object_smart_member_del(cw->transform_tranp_obj);
5788 E_FREE_FUNC(cw->transform_tranp_obj, evas_object_del);
5794 e_comp_object_transform_transp_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
5797 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5798 if (cw->ec->input_only) return;
5799 if (!cw->transform_tranp_obj) return;
5801 _e_comp_object_transform_obj_map_set(cw->transform_tranp_obj, vertices);
5805 e_comp_object_transform_transp_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
5808 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5809 if (cw->ec->input_only) return;
5810 if (!cw->transform_tranp_obj) return;
5812 _e_comp_object_transform_obj_map_set_with_zoom(cw->transform_tranp_obj, vertices, zoom);
5815 #ifdef REFACTOR_DESK_AREA
5818 e_comp_object_layer_update(Evas_Object *obj,
5819 Evas_Object *above, Evas_Object *below)
5821 E_Comp_Object *cw2 = NULL;
5822 Evas_Object *o = NULL;
5827 if (cw->ec->layer_block) return;
5828 if ((above) && (below))
5830 ERR("Invalid layer update request! cw=%p", cw);
5838 layer = evas_object_layer_get(o);
5839 cw2 = evas_object_data_get(o, "comp_obj");
5842 if (!e_util_strcmp(evas_object_name_get(o), "layer_obj")) break;
5844 o = evas_object_above_get(o);
5845 if ((!o) || (o == cw->smart_obj)) break;
5846 if (evas_object_layer_get(o) != layer)
5848 o = e_comp->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_ALERT)].obj;
5853 ec = e_client_top_get();
5854 if (ec) o = ec->frame;
5857 if (o) cw2 = evas_object_data_get(o, "comp_obj");
5861 _e_comp_object_layers_remove(cw);
5864 if (cw2->layer > cw->layer)
5865 _e_comp_object_layers_add(cw, NULL, NULL, 0);
5866 else if (cw2->layer == cw->layer)
5869 _e_comp_object_layers_add(cw, cw2, NULL, 0);
5871 _e_comp_object_layers_add(cw, NULL, NULL, above? 0 : 1);
5873 _e_comp_object_layers_add(cw, NULL, cw2, 0);
5876 _e_comp_object_layers_add(cw, NULL, NULL, 1);
5879 _e_comp_object_layers_add(cw, NULL, NULL, 0);
5884 e_comp_object_layer_get(Evas_Object *obj)
5891 e_comp_object_content_set(Evas_Object *obj,
5892 Evas_Object *content,
5893 E_Comp_Object_Content_Type type)
5895 API_ENTRY EINA_FALSE;
5897 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5898 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec->pixmap, EINA_FALSE);
5899 EINA_SAFETY_ON_NULL_RETURN_VAL(content, EINA_FALSE);
5903 ERR("Can't set e.swallow.content to requested content. "
5904 "Previous comp object should not be changed at all.");
5908 if (e_pixmap_usable_get(cw->ec->pixmap)) return EINA_FALSE;
5910 if ((type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE) &&
5911 (type != E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE))
5913 ERR("Content type %d for %p is not supported ec:%p pixmap:%p",
5914 type, content, cw->ec, cw->ec->pixmap);
5918 cw->external_content = EINA_TRUE;
5921 cw->content_type = type;
5922 e_util_size_debug_set(cw->obj, 1);
5923 evas_object_name_set(cw->obj, "cw->obj");
5924 _e_comp_object_alpha_set(cw);
5927 _e_comp_object_shadow_setup(cw);
5929 wl_signal_emit(&cw->events.content_type_set, NULL);
5935 e_comp_object_content_unset(Evas_Object *obj)
5937 API_ENTRY EINA_FALSE;
5939 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5940 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec->pixmap, EINA_FALSE);
5942 if (!cw->obj && !cw->ec->visible)
5944 ELOGF("COMP", "is not visible yet. no need to unset", cw->ec);
5948 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE)
5950 ELOGF("COMP", "has been set to internal image object already", cw->ec);
5956 if (cw->frame_object)
5957 edje_object_part_unswallow(cw->frame_object, cw->obj);
5959 edje_object_part_unswallow(cw->shobj, cw->obj);
5961 evas_object_del(cw->obj);
5962 evas_object_hide(cw->obj);
5966 cw->external_content = EINA_FALSE;
5967 if (cw->ec->is_cursor)
5970 DBG("%p is cursor surface..", cw->ec);
5971 if (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph))
5973 evas_object_resize(cw->ec->frame, pw, ph);
5974 evas_object_hide(cw->ec->frame);
5979 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE;
5980 cw->obj = evas_object_image_filled_add(e_comp->evas);
5981 evas_object_image_border_center_fill_set(cw->obj, EVAS_BORDER_FILL_SOLID);
5982 e_util_size_debug_set(cw->obj, 1);
5983 evas_object_image_pixels_get_callback_set(cw->obj, _e_comp_object_pixels_get, cw);
5984 evas_object_image_pixels_noti_callback_set(cw->obj, _e_comp_object_pixels_noti, cw);
5985 evas_object_image_smooth_scale_set(cw->obj, e_comp_config_get()->smooth_windows);
5986 evas_object_name_set(cw->obj, "cw->obj");
5987 evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888);
5988 evas_object_intercept_color_set_callback_add(obj, _e_comp_intercept_obj_color_set, cw);
5989 _e_comp_object_alpha_set(cw);
5992 _e_comp_object_shadow_setup(cw);
5997 _e_comp_intercept_show_helper(cw);
6001 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
6002 e_comp_object_dirty(cw->smart_obj);
6003 e_comp_object_render(cw->smart_obj);
6004 e_comp_object_render_update_add(obj);
6006 wl_signal_emit(&cw->events.content_type_set, NULL);
6011 EINTERN Evas_Object *
6012 e_comp_object_content_get(Evas_Object *obj)
6016 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, NULL);
6018 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE)
6020 ELOGF("COMP", "has been set to internal image object. couldn't return internal image object", cw->ec);
6027 E_API E_Comp_Object_Content_Type
6028 e_comp_object_content_type_get(Evas_Object *obj)
6030 API_ENTRY E_COMP_OBJECT_CONTENT_TYPE_NONE;
6032 return cw->content_type;
6036 e_comp_object_dim_mask_update(Evas_Object *obj, Eina_Bool mask_set, int x, int y, int w, int h)
6039 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
6040 E_Comp_Config *conf = e_comp_config_get();
6041 if (cw->ec->input_only) return;
6042 if (!conf->dim_rect_enable) return;
6044 cw->dim.mask_set = mask_set;
6050 if (!cw->dim.enable) return;
6051 e_comp_object_dim_mask_set(cw->ec->frame, mask_set);
6055 e_comp_object_dim_mask_set(Evas_Object *obj, Eina_Bool set)
6057 Eina_Bool mask_set = EINA_FALSE;
6061 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
6062 E_Comp_Config *conf = e_comp_config_get();
6063 if (cw->ec->input_only) return;
6064 if (!conf->dim_rect_enable) return;
6070 if (cw->dim.mask_obj)
6072 evas_object_smart_member_del(cw->dim.mask_obj);
6073 E_FREE_FUNC(cw->dim.mask_obj, evas_object_del);
6076 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);
6077 o = evas_object_rectangle_add(e_comp->evas);
6078 evas_object_color_set(o, 0, 0, 0, 0);
6079 evas_object_smart_member_add(o, obj);
6080 evas_object_resize(o, cw->dim.mask_w, cw->dim.mask_h);
6081 evas_object_move(o, cw->dim.mask_x, cw->dim.mask_y);
6083 evas_object_render_op_set(o, EVAS_RENDER_COPY);
6084 if (cw->visible) evas_object_show(o);
6086 cw->dim.mask_obj = o;
6087 evas_object_name_set(cw->dim.mask_obj, "cw->dim_mask_obj");
6089 evas_object_layer_set(cw->dim.mask_obj, 9998);
6093 if (cw->dim.mask_obj)
6095 ELOGF("COMP", "DIM |Mask on Dim rect Removed", cw->ec);
6096 evas_object_smart_member_del(cw->dim.mask_obj);
6097 E_FREE_FUNC(cw->dim.mask_obj, evas_object_del);
6103 e_comp_object_dim_client_set(E_Client *ec)
6105 E_Comp_Config *conf = e_comp_config_get();
6107 if (!conf->dim_rect_enable) return ;
6108 if (dim_client == ec) return;
6110 Eina_Bool prev_dim = EINA_FALSE;
6111 ELOGF("COMP", "DIM |Client Set %p -> %p", ec, dim_client, ec);
6113 if (dim_client && _e_comp_object_dim_enable_get(dim_client, dim_client->frame))
6114 prev_dim = EINA_TRUE;
6116 if (prev_dim && dim_client->visible && ec)
6118 _e_comp_object_dim_enable_set(dim_client, dim_client->frame, EINA_FALSE, EINA_TRUE);
6119 _e_comp_object_dim_enable_set(ec, ec->frame, EINA_TRUE, EINA_TRUE);
6123 if (prev_dim) _e_comp_object_dim_enable_set(dim_client, dim_client->frame, EINA_FALSE, EINA_FALSE);
6124 if (ec) _e_comp_object_dim_enable_set(ec, ec->frame, EINA_TRUE, EINA_FALSE);
6130 e_comp_object_dim_client_get(void)
6132 E_Comp_Config *conf = e_comp_config_get();
6134 if (!conf->dim_rect_enable ) return NULL;
6140 _e_comp_object_dim_enable_set(E_Client *ec, Evas_Object *obj, Eina_Bool enable, Eina_Bool noeffect)
6143 char emit[32] = "\0";
6144 E_Comp_Config *conf = e_comp_config_get();
6147 if (!conf->dim_rect_enable) return;
6148 if (!cw->effect_obj) return;
6149 if (enable == cw->dim.enable) return;
6151 ELOGF("COMP", "DIM |set on Client [%d]", ec, enable);
6152 if (noeffect || !conf->dim_rect_effect)
6154 strncpy(emit, (enable ? "e,state,dim,on,noeffect" : "e,state,dim,off,noeffect"), sizeof(emit) - 1);
6158 strncpy(emit, (enable ? "e,state,dim,on" : "e,state,dim,off"), sizeof(emit) - 1);
6161 cw->dim.enable = enable;
6163 if (cw->dim.mask_set && !enable)
6165 e_comp_object_dim_mask_set(cw->ec->frame, enable);
6166 edje_object_signal_emit(cw->effect_obj, emit, "e");
6168 else if (cw->dim.mask_set && enable)
6170 edje_object_signal_emit(cw->effect_obj, emit, "e");
6171 e_comp_object_dim_mask_set(cw->ec->frame, enable);
6175 edje_object_signal_emit(cw->effect_obj, emit, "e");
6180 _e_comp_object_dim_enable_get(E_Client *ec, Evas_Object *obj)
6182 API_ENTRY EINA_FALSE;
6183 E_Comp_Config *conf = e_comp_config_get();
6185 if (!ec) return EINA_FALSE;
6186 if (!conf->dim_rect_enable) return EINA_FALSE;
6188 if (cw->dim.enable) return EINA_TRUE;
6194 _e_comp_object_dim_update(E_Comp_Object *cw)
6196 E_Comp_Config *conf = e_comp_config_get();
6199 if (!conf->dim_rect_enable) return;
6200 if (!cw->effect_obj) return;
6203 edje_object_signal_emit(cw->effect_obj, (cw->dim.enable ? "e,state,dim,on,noeffect" : "e,state,dim,off,noeffect"), "e");
6204 ELOGF("COMP", "DIM |Applied on Client dim.enable[%d]", cw->ec, cw->dim.enable);
6206 if (cw->dim.mask_set)
6208 e_comp_object_dim_mask_set(cw->ec->frame, cw->dim.mask_set);
6214 e_comp_object_clear(Evas_Object *obj)
6218 _e_comp_object_clear(cw);
6222 e_comp_object_hwc_update_exists(Evas_Object *obj)
6224 API_ENTRY EINA_FALSE;
6225 return cw->hwc_need_update;
6230 e_comp_object_hwc_update_set(Evas_Object *obj, Eina_Bool set)
6233 cw->hwc_need_update = set;
6237 e_comp_object_effect_object_part_swallow(Evas_Object *obj, const char *part_name, Evas_Object *swallow_obj)
6239 API_ENTRY EINA_FALSE;
6240 return edje_object_part_swallow(cw->effect_obj, part_name, swallow_obj);
6244 e_comp_object_indicator_swallow(Evas_Object *obj, Evas_Object *indicator)
6247 if (cw->indicator.obj != indicator)
6248 edje_object_part_unswallow(cw->shobj, cw->indicator.obj);
6249 cw->indicator.obj = indicator;
6250 edje_object_part_swallow(cw->shobj, "e.swallow.indicator", indicator);
6254 e_comp_object_indicator_unswallow(Evas_Object *obj, Evas_Object *indicator)
6257 if (cw->indicator.obj != indicator) return;
6258 cw->indicator.obj = NULL;
6259 edje_object_part_unswallow(cw->shobj, indicator);
6263 e_comp_object_indicator_size_set(Evas_Object *obj, int w, int h)
6266 Edje_Message_Int_Set *msg;
6268 if (!cw->indicator.obj) return;
6270 cw->indicator.w = w;
6271 cw->indicator.h = h;
6273 if (!cw->shobj) return;
6275 msg = alloca(sizeof(Edje_Message_Int_Set) + (sizeof(int)));
6279 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT_SET, 0, msg);
6280 edje_object_message_signal_process(cw->shobj);
6283 /* buffer transform and scale are applied to e_comp_object and e_pixmap internaly */
6285 e_comp_object_map_update(Evas_Object *obj)
6288 E_Client *ec = cw->ec;
6289 E_Comp_Wl_Client_Data *cdata;
6291 int x1, y1, x2, y2, x, y, bw, bh, tw, th;
6294 int l, remain = sizeof buffer;
6297 if (e_object_is_del(E_OBJECT(ec))) return;
6298 cdata = e_client_cdata_get(ec);
6301 /* if buffer had been flushed, buffer could be NULL. Then map will be applied
6302 * when new buffer is attached.
6304 if (!cdata->buffer_ref.buffer) return;
6306 if ((!cw->redirected) ||
6307 (e_client_video_hw_composition_check(ec)) ||
6308 (!e_comp_wl_output_buffer_transform_get(ec) &&
6309 cdata->scaler.buffer_viewport.buffer.scale == 1))
6311 if (evas_object_map_enable_get(cw->effect_obj))
6313 ELOGF("TRANSFORM", "map: disable", cw->ec);
6314 evas_object_map_enable_set(cw->effect_obj, EINA_FALSE);
6315 _e_comp_object_map_transform_rect(cw->ec, 0, 0, cw->w, cw->h, NULL, NULL, &tw, &th);
6316 evas_object_resize(cw->effect_obj, tw, th);
6323 EINA_SAFETY_ON_NULL_RETURN(map);
6325 e_pixmap_size_get(ec->pixmap, &bw, &bh);
6331 e_map_util_points_populate_from_geometry(map, ec->x, ec->y, bw, bh, 0);
6333 _e_comp_object_map_transform_pos(ec, x1, y1, &x, &y);
6334 e_map_point_image_uv_set(map, 0, x, y);
6335 l = snprintf(p, remain, "%d,%d", x, y);
6336 p += l, remain -= l;
6338 _e_comp_object_map_transform_pos(ec, x2, y1, &x, &y);
6339 e_map_point_image_uv_set(map, 1, x, y);
6340 l = snprintf(p, remain, " %d,%d", x, y);
6341 p += l, remain -= l;
6343 _e_comp_object_map_transform_pos(ec, x2, y2, &x, &y);
6344 e_map_point_image_uv_set(map, 2, x, y);
6345 l = snprintf(p, remain, " %d,%d", x, y);
6346 p += l, remain -= l;
6348 _e_comp_object_map_transform_pos(ec, x1, y2, &x, &y);
6349 e_map_point_image_uv_set(map, 3, x, y);
6350 l = snprintf(p, remain, " %d,%d", x, y);
6351 p += l, remain -= l;
6353 ELOGF("TRANSFORM", "map: point(%d,%d %dx%d) uv(%d,%d %d,%d %d,%d %d,%d=>%s)",
6355 ec->x, ec->y, bw, bh, x1, y1, x2, y1, x2, y2, x1, y2, buffer);
6357 e_comp_object_map_set(cw->effect_obj, map);
6358 e_comp_object_map_enable_set(cw->effect_obj, EINA_TRUE);
6362 /* if there's screen rotation with comp mode, then ec->effect_obj and
6363 * ec->obj should rotate. if not, in evas_map, update region is clipped.
6365 _e_comp_object_map_transform_rect(cw->ec, 0, 0, bw, bh, NULL, NULL, &tw, &th);
6366 evas_object_resize(cw->effect_obj, tw, th);
6370 e_comp_object_render_trace_set(Evas_Object *obj, Eina_Bool set)
6372 API_ENTRY EINA_FALSE;
6374 cw->render_trace = set;
6380 e_comp_object_native_usable_get(Evas_Object *obj)
6382 API_ENTRY EINA_FALSE;
6383 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6385 if (cw->ec->input_only) return EINA_FALSE;
6386 if (cw->external_content) return EINA_FALSE;
6387 if (e_comp_object_content_type_get(cw->ec->frame) != E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE) return EINA_FALSE;
6389 /* just return true value, if it is normal case */
6390 if (e_pixmap_usable_get(cw->ec->pixmap)) return EINA_TRUE;
6393 Evas_Native_Surface *ns;
6394 ns = evas_object_image_native_surface_get(cw->obj);
6396 /* client pixmap is not usable but cw->obj is drawable due to it holds valid native surface*/
6399 ELOGF("COMP", "Client pixmap is Not usable but still holds valid native surface", cw->ec);
6407 e_comp_object_image_filter_set(Evas_Object *obj, E_Comp_Image_Filter filter)
6409 API_ENTRY EINA_FALSE;
6410 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6411 if (e_object_is_del(E_OBJECT(cw->ec))) return EINA_FALSE;
6412 if (!e_client_cdata_get(cw->ec)) return EINA_FALSE;
6414 if (cw->image_filter == filter) return EINA_TRUE;
6418 case E_COMP_IMAGE_FILTER_BLUR:
6419 efl_gfx_filter_program_set(cw->obj, "blur (20) padding_set (0)", "image_filter");
6421 case E_COMP_IMAGE_FILTER_GRAYSCALE:
6422 efl_gfx_filter_program_set(cw->obj, "grayscale ()", "image_filter");
6424 case E_COMP_IMAGE_FILTER_INVERSE:
6425 efl_gfx_filter_program_set(cw->obj, "inverse_color ()", "image_filter");
6427 case E_COMP_IMAGE_FILTER_NONE:
6429 efl_gfx_filter_program_set(cw->obj, NULL, "image_filter");
6433 cw->image_filter = filter;
6435 wl_signal_emit(&cw->events.image_filter_set, NULL);
6440 EINTERN E_Comp_Image_Filter
6441 e_comp_object_image_filter_get(Evas_Object *obj)
6443 API_ENTRY E_COMP_IMAGE_FILTER_NONE;
6444 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, E_COMP_IMAGE_FILTER_NONE);
6445 if (e_object_is_del(E_OBJECT(cw->ec))) return E_COMP_IMAGE_FILTER_NONE;
6446 if (!e_client_cdata_get(cw->ec)) return E_COMP_IMAGE_FILTER_NONE;
6448 return cw->image_filter;
6452 _e_comp_object_damage_trace_render_pre_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
6456 if (!_damage_trace) return;
6458 EINA_LIST_FREE(_damage_trace_post_objs, obj)
6459 evas_object_del(obj);
6461 _damage_trace_post_objs = NULL;
6465 _e_comp_object_damage_trace_render_post_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
6467 if (!_damage_trace) return;
6469 _damage_trace_post_objs = _damage_trace_objs;
6470 _damage_trace_objs = NULL;
6474 e_comp_object_damage_trace_debug(Eina_Bool onoff)
6476 if (_damage_trace == onoff) return;
6480 evas_event_callback_add(e_comp->evas,
6481 EVAS_CALLBACK_RENDER_PRE,
6482 _e_comp_object_damage_trace_render_pre_cb,
6485 evas_event_callback_add(e_comp->evas,
6486 EVAS_CALLBACK_RENDER_POST,
6487 _e_comp_object_damage_trace_render_post_cb,
6494 EINA_LIST_FREE(_damage_trace_objs, obj)
6495 evas_object_del(obj);
6497 _damage_trace_objs = NULL;
6499 EINA_LIST_FREE(_damage_trace_post_objs, obj)
6500 evas_object_del(obj);
6502 _damage_trace_post_objs = NULL;
6504 evas_event_callback_del(e_comp->evas,
6505 EVAS_CALLBACK_RENDER_PRE,
6506 _e_comp_object_damage_trace_render_pre_cb);
6508 evas_event_callback_del(e_comp->evas,
6509 EVAS_CALLBACK_RENDER_POST,
6510 _e_comp_object_damage_trace_render_post_cb);
6513 _damage_trace = onoff;
6517 e_comp_object_redirected_get(Evas_Object *obj)
6519 API_ENTRY EINA_FALSE;
6520 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6522 return cw->redirected;
6526 e_comp_object_color_visible_get(Evas_Object *obj)
6528 API_ENTRY EINA_FALSE;
6530 return cw->color_visible;
6534 e_comp_object_map_set(Evas_Object *obj, E_Map *em)
6536 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
6538 return e_map_set_to_comp_object(em, obj);
6542 e_comp_object_map_get(const Evas_Object *obj)
6544 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
6546 return e_map_get_from_comp_object(obj);
6550 e_comp_object_map_enable_set(Evas_Object *obj, Eina_Bool enable)
6552 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
6554 evas_object_map_enable_set(obj, enable);
6560 e_comp_object_render_update_lock(Evas_Object *obj)
6562 E_Comp_Wl_Buffer *buffer;
6563 struct wayland_tbm_client_queue *cqueue;
6565 API_ENTRY EINA_FALSE;
6567 if (cw->render_update_lock.lock == 0)
6569 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET, cw->ec);
6571 buffer = e_pixmap_resource_get(cw->ec->pixmap);
6572 if ((buffer) && (buffer->resource))
6574 cqueue = e_comp_wl_tbm_client_queue_get(cw->ec);
6576 wayland_tbm_server_client_queue_flush(cqueue);
6579 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, buffer);
6580 e_comp_object_render_update_del(obj);
6582 ELOGF("COMP", "Render update lock enabled", cw->ec);
6585 cw->render_update_lock.lock++;
6591 e_comp_object_render_update_unlock(Evas_Object *obj)
6595 if (cw->render_update_lock.lock == 0)
6598 cw->render_update_lock.lock--;
6600 if (cw->render_update_lock.lock == 0)
6603 if (cw->render_update_lock.pending_move_set)
6605 evas_object_move(obj,
6606 cw->render_update_lock.pending_move_x,
6607 cw->render_update_lock.pending_move_y);
6608 cw->render_update_lock.pending_move_x = 0;
6609 cw->render_update_lock.pending_move_y = 0;
6610 cw->render_update_lock.pending_move_set = EINA_FALSE;
6613 if (cw->render_update_lock.pending_resize_set)
6615 evas_object_resize(obj,
6616 cw->render_update_lock.pending_resize_w,
6617 cw->render_update_lock.pending_resize_h);
6618 cw->render_update_lock.pending_resize_w = 0;
6619 cw->render_update_lock.pending_resize_h = 0;
6620 cw->render_update_lock.pending_resize_set = EINA_FALSE;
6623 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, NULL);
6625 if ((cw->ec->exp_iconify.buffer_flush) &&
6626 (e_policy_visibility_client_is_iconic(cw->ec)) &&
6627 (cw->ec->comp_data) && (!cw->ec->comp_data->buffer_ref.buffer))
6628 e_comp_object_clear(obj);
6630 e_comp_object_render_update_add(obj);
6632 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_UNSET, cw->ec);
6634 ELOGF("COMP", "Render update lock disabled", cw->ec);
6639 e_comp_object_render_update_lock_get(Evas_Object *obj)
6641 API_ENTRY EINA_FALSE;
6643 if (cw->render_update_lock.lock > 0)
6650 e_comp_object_color_get(Evas_Object *obj, int *r, int *g, int *b, int *a)
6654 if ((cw->transparent.set) || (cw->transparent.setting))
6656 if (r) *r = cw->transparent.user_r;
6657 if (g) *g = cw->transparent.user_g;
6658 if (b) *b = cw->transparent.user_b;
6659 if (a) *a = cw->transparent.user_a;
6663 evas_object_color_get(obj, r, g, b, a);
6668 e_comp_object_render_op_set(Evas_Object *obj, Evas_Render_Op op)
6672 evas_object_render_op_set(cw->obj, op);
6674 wl_signal_emit(&cw->events.render_op_set, NULL);
6677 EINTERN Evas_Render_Op
6678 e_comp_object_render_op_get(Evas_Object *obj)
6680 API_ENTRY EVAS_RENDER_BLEND;
6682 return evas_object_render_op_get(cw->obj);
6686 e_comp_object_lower_listener_add(Evas_Object *obj, struct wl_listener *listener)
6689 wl_signal_add(&cw->events.lower, listener);
6692 #ifdef REFACTOR_DESK_AREA
6694 e_comp_object_lower_done_listener_add(Evas_Object *obj, struct wl_listener *listener)
6697 wl_signal_add(&cw->events.lower_done, listener);
6701 e_comp_object_raise_listener_add(Evas_Object *obj, struct wl_listener *listener)
6704 wl_signal_add(&cw->events.raise, listener);
6709 e_comp_object_show_listener_add(Evas_Object *obj, struct wl_listener *listener)
6712 wl_signal_add(&cw->events.show, listener);
6716 e_comp_object_hide_listener_add(Evas_Object *obj, struct wl_listener *listener)
6719 wl_signal_add(&cw->events.hide, listener);
6722 #ifdef REFACTOR_DESK_AREA
6724 e_comp_object_set_layer_listener_add(Evas_Object *obj, struct wl_listener *listener)
6727 wl_signal_add(&cw->events.set_layer, listener);
6731 e_comp_object_stack_above_listener_add(Evas_Object *obj, struct wl_listener *listener)
6734 wl_signal_add(&cw->events.stack_above, listener);
6738 e_comp_object_stack_below_listener_add(Evas_Object *obj, struct wl_listener *listener)
6741 wl_signal_add(&cw->events.stack_below, listener);
6746 e_comp_object_image_filter_set_listener_add(Evas_Object *obj, struct wl_listener *listener)
6749 wl_signal_add(&cw->events.image_filter_set, listener);
6753 e_comp_object_render_op_set_listener_add(Evas_Object *obj, struct wl_listener *listener)
6756 wl_signal_add(&cw->events.render_op_set, listener);
6760 e_comp_object_content_type_set_listener_add(Evas_Object *obj, struct wl_listener *listener)
6763 wl_signal_add(&cw->events.content_type_set, listener);
6767 e_comp_object_color_set_listener_add(Evas_Object *obj, struct wl_listener *listener)
6770 wl_signal_add(&cw->events.color_set, listener);
6774 e_comp_object_color_visible_set_listener_add(Evas_Object *obj, struct wl_listener *listener)
6777 wl_signal_add(&cw->events.color_visible_set, listener);