5 = keys that return objects =
6 - E_Client: the client associated with the object (E_Client*)
7 - comp_smart_obj: cw->smart_obj (Evas_Object*)
8 - comp_obj: cw (E_Comp_Object*)
10 = keys that are bool flags =
11 - client_restack: client needs a protocol-level restack
12 - comp_override: object is triggering a nocomp override to force compositing
13 - comp_ref: object has a ref from visibility animations
14 - comp_showing: object is currently running its show animation
15 - comp_hiding: object is currently running its hiding animation
16 - comp_object: object is a compositor-created object
17 - comp_object_skip: object has a name which prohibits theme shadows
18 - comp_object-to_del: list of objects which will be deleted when this object is deleted
19 - comp_mirror: object is the result of e_comp_object_util_mirror_add()
20 - effect_running: object is animating by external module
23 #define UPDATE_MAX 512 // same as evas
24 #define FAILURE_MAX 2 // seems reasonable
25 #define SMART_NAME "e_comp_object"
26 #define INPUT_OBJ_SMART_NAME "input_object"
28 /* for non-util functions */
29 #define API_ENTRY E_Comp_Object *cw; \
30 cw = evas_object_smart_data_get(obj); \
31 if ((!obj) || (!cw) || (e_util_strcmp(evas_object_type_get(obj), SMART_NAME))) return
33 /* for util functions (obj may or may not be E_Comp_Object */
34 #define SOFT_ENTRY(...) E_Comp_Object *cw; \
37 CRI("YOU PASSED NULL! ARGH!"); \
40 cw = evas_object_smart_data_get(obj); \
41 if ((!cw) || (e_util_strcmp(evas_object_type_get(obj), SMART_NAME))) \
43 #define INTERNAL_ENTRY E_Comp_Object *cw; cw = evas_object_smart_data_get(obj); if (!cw) return;
45 /* enable for lots of client size info in console output */
47 # define e_util_size_debug_set(x, y)
50 /* enable along with display-specific damage INF calls to enable render tracing
54 #define RENDER_DEBUG(...) INF(__VA_ARGS__)
56 #define RENDER_DEBUG(...)
59 typedef struct _E_Comp_Object
63 int x, y, w, h; // geometry
67 E_Comp_Object_Frame client_inset;
77 Eina_Stringshare *frame_theme;
78 Eina_Stringshare *frame_name;
79 Eina_Stringshare *visibility_effect; //effect when toggling visibility
81 E_Comp_Object_Content_Type content_type; // type of e.swallow.content
83 Evas_Object *smart_obj; // smart object
84 Evas_Object *clip; // clipper over effect object
85 Evas_Object *input_obj; // input smart object
86 Evas_Object *obj; // composite object
87 Evas_Object *frame_object; // for client frames
88 Evas_Object *zoomobj; // zoomap
89 Evas_Object *shobj; // shadow object
90 Evas_Object *effect_obj; // effects object
91 Evas_Object *transform_bg_obj; // transform backgroung with keep_ratio option
96 Evas_Object *transform_tranp_obj;// transform transp rect obj
97 Evas_Object *default_input_obj; // default input object
98 unsigned int layer; //e_comp_canvas_layer_map(cw->ec->layer)
99 Eina_List *obj_mirror; // extra mirror objects
100 Eina_Tiler *updates; //render update regions
101 Eina_Tiler *pending_updates; //render update regions which are about to render
103 Evas_Native_Surface *ns; //for custom gl rendering
105 struct wl_listener buffer_destroy_listener;
107 unsigned int update_count; // how many updates have happened to this obj
109 unsigned int opacity; // opacity set with _NET_WM_WINDOW_OPACITY
111 unsigned int animating; // it's busy animating
112 unsigned int failures; //number of consecutive e_pixmap_image_draw() failures
113 unsigned int force_visible; //number of visible obj_mirror objects
114 Eina_Bool delete_pending : 1; // delete pending
115 Eina_Bool defer_hide : 1; // flag to get hide to work on deferred hide
116 Eina_Bool showing : 1; // object is currently in "show" animation
117 Eina_Bool hiding : 1; // object is currently in "hide" animation
118 Eina_Bool visible : 1; // is visible
120 Eina_Bool shaped : 1; // is shaped
121 Eina_Bool update : 1; // has updates to fetch
122 Eina_Bool redirected : 1; // has updates to fetch
123 Eina_Bool native : 1; // native
125 Eina_Bool nocomp : 1; // nocomp applied
126 Eina_Bool hwc_need_update : 1; // this window updated while on e_plane to do hw composite
127 Eina_Bool real_hid : 1; // last hide was a real window unmap
129 Eina_Bool effect_set : 1; //effect_obj has a valid group
130 Eina_Bool effect_running : 1; //effect_obj is playing an animation
131 Eina_Bool effect_clip : 1; //effect_obj is clipped
132 Eina_Bool effect_clip_able : 1; //effect_obj will be clipped for effects
134 Eina_Bool zoomap_disabled : 1; //whether zoomap is usable
135 Eina_Bool updates_exist : 1;
136 Eina_Bool updates_full : 1; // entire object will be updated
138 Eina_Bool force_move : 1;
139 Eina_Bool frame_extends : 1; //frame may extend beyond object size
140 Eina_Bool blanked : 1; //window is rendering blank content (externally composited)
141 Eina_Bool external_content : 1; // e.swallow.content(obj) is set by external evas object
142 Eina_Bool user_alpha_set : 1;
143 Eina_Bool user_alpha : 1;
147 Evas_Object *obj; // mask object: transparent parts of this comp object allow to copy the alpha to current H/W plane.
148 Evas_Render_Op saved_render_op; // saved render operation value to restore when clear a mask.
155 } indicator; //indicator object for internal client
159 Evas_Object *mask_obj;
162 int mask_x, mask_y, mask_w, mask_h;
165 Eina_Bool render_trace : 1; // trace co->obj rendering on canvas
167 tbm_surface_h tbm_surface;
168 E_Comp_Image_Filter image_filter;
169 Eina_Bool set_mouse_callbacks;
174 E_Comp_Wl_Buffer_Ref buffer_ref;
175 Eina_Bool pending_move_set;
176 int pending_move_x, pending_move_y;
177 Eina_Bool pending_resize_set;
178 int pending_resize_w, pending_resize_h;
179 } render_update_lock;
182 typedef struct _E_Input_Rect_Data
188 typedef struct _E_Input_Rect_Smart_Data
190 Eina_List *input_rect_data_list;
192 } E_Input_Rect_Smart_Data;
194 struct E_Comp_Object_Mover
197 E_Comp_Object_Mover_Cb func;
203 static Eina_Inlist *_e_comp_object_movers = NULL;
204 static Evas_Smart *_e_comp_smart = NULL;
205 static Evas_Smart *_e_comp_input_obj_smart = NULL;
207 static int _e_comp_object_hooks_delete = 0;
208 static int _e_comp_object_hooks_walking = 0;
210 static Eina_Inlist *_e_comp_object_hooks[] =
212 [E_COMP_OBJECT_HOOK_EFFECT_START] = NULL,
213 [E_COMP_OBJECT_HOOK_EFFECT_END] = NULL,
214 [E_COMP_OBJECT_HOOK_RESTACK] = NULL,
215 [E_COMP_OBJECT_HOOK_OBJECT_SETUP] = NULL,
216 [E_COMP_OBJECT_HOOK_LAYER_SET] = NULL,
217 [E_COMP_OBJECT_HOOK_MASK_OBJECT_SET] = NULL,
218 [E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET] = NULL,
219 [E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET] = NULL,
222 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
223 static int _e_comp_object_intercept_hooks_delete = 0;
224 static int _e_comp_object_intercept_hooks_walking = 0;
226 static Eina_Inlist *_e_comp_object_intercept_hooks[] =
228 [E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER] = NULL,
229 [E_COMP_OBJECT_INTERCEPT_HOOK_HIDE] = NULL,
233 static Eina_Bool _damage_trace = EINA_FALSE;
234 static Eina_List *_damage_trace_objs = NULL;
235 static Eina_List *_damage_trace_post_objs = NULL;
237 /* sekrit functionzzz */
238 EINTERN void e_client_focused_set(E_Client *ec);
240 /* emitted every time a new noteworthy comp object is added */
241 E_API int E_EVENT_COMP_OBJECT_ADD = -1;
243 /* ecore event define */
244 E_API int E_EVENT_COMP_OBJECT_IMG_RENDER = -1;
245 E_API int E_EVENT_COMP_OBJECT_EFFECT_START = -1;
246 E_API int E_EVENT_COMP_OBJECT_EFFECT_END = -1;
248 static void _e_comp_object_dim_enable_set(E_Client *ec, Evas_Object *obj, Eina_Bool enable, Eina_Bool noeffect);
249 static Eina_Bool _e_comp_object_dim_enable_get(E_Client *ec, Evas_Object *obj);
250 static void _e_comp_object_dim_update(E_Comp_Object *cw);
251 static void _e_comp_object_native_surface_set(E_Comp_Object *cw, Evas_Native_Surface *ns, Eina_Bool with_mirror);
252 static void _e_comp_object_layer_set(Evas_Object *obj, short layer);
254 static E_Client *dim_client = NULL;
257 _e_comp_object_hooks_clean(void)
260 E_Comp_Object_Hook *ch;
263 for (x = 0; x < E_COMP_OBJECT_HOOK_LAST; x++)
264 EINA_INLIST_FOREACH_SAFE(_e_comp_object_hooks[x], l, ch)
266 if (!ch->delete_me) continue;
267 _e_comp_object_hooks[x] = eina_inlist_remove(_e_comp_object_hooks[x], EINA_INLIST_GET(ch));
273 _e_comp_object_hook_call(E_Comp_Object_Hook_Point hookpoint, E_Client *ec)
275 E_Comp_Object_Hook *ch;
276 Eina_Bool ret = EINA_TRUE;
278 if (e_object_is_del(E_OBJECT(ec)))
280 if ((hookpoint != E_COMP_OBJECT_HOOK_EFFECT_START) &&
281 (hookpoint != E_COMP_OBJECT_HOOK_EFFECT_END) &&
282 (hookpoint != E_COMP_OBJECT_HOOK_OBJECT_SETUP) &&
283 (hookpoint != E_COMP_OBJECT_HOOK_LAYER_SET) &&
284 (hookpoint != E_COMP_OBJECT_HOOK_RESTACK) &&
285 (hookpoint != E_COMP_OBJECT_HOOK_MASK_OBJECT_SET) &&
286 (hookpoint != E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET) &&
287 (hookpoint != E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET))
292 e_object_ref(E_OBJECT(ec));
293 _e_comp_object_hooks_walking++;
294 EINA_INLIST_FOREACH(_e_comp_object_hooks[hookpoint], ch)
296 if (ch->delete_me) continue;
297 if (!(ch->func(ch->data, ec)))
303 _e_comp_object_hooks_walking--;
304 if ((_e_comp_object_hooks_walking == 0) && (_e_comp_object_hooks_delete > 0))
305 _e_comp_object_hooks_clean();
307 e_object_unref(E_OBJECT(ec));
312 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
314 _e_comp_object_intercept_hooks_clean(void)
317 E_Comp_Object_Intercept_Hook *ch;
320 for (x = 0; x < E_COMP_OBJECT_INTERCEPT_HOOK_LAST; x++)
321 EINA_INLIST_FOREACH_SAFE(_e_comp_object_intercept_hooks[x], l, ch)
323 if (!ch->delete_me) continue;
324 _e_comp_object_intercept_hooks[x] = eina_inlist_remove(_e_comp_object_intercept_hooks[x], EINA_INLIST_GET(ch));
330 _e_comp_object_intercept_hook_call(E_Comp_Object_Intercept_Hook_Point hookpoint, E_Client *ec)
332 E_Comp_Object_Intercept_Hook *ch;
333 Eina_Bool ret = EINA_TRUE;
335 if (e_object_is_del(E_OBJECT(ec))) return ret;
336 e_object_ref(E_OBJECT(ec));
337 _e_comp_object_intercept_hooks_walking++;
338 EINA_INLIST_FOREACH(_e_comp_object_intercept_hooks[hookpoint], ch)
340 if (ch->delete_me) continue;
341 if (!(ch->func(ch->data, ec)))
347 _e_comp_object_intercept_hooks_walking--;
348 if ((_e_comp_object_intercept_hooks_walking == 0) && (_e_comp_object_intercept_hooks_delete > 0))
349 _e_comp_object_intercept_hooks_clean();
351 e_object_unref(E_OBJECT(ec));
358 _e_comp_object_event_free(void *d EINA_UNUSED, void *event)
360 E_Event_Comp_Object *ev = event;
363 ec = evas_object_data_get(ev->comp_object, "E_Client");
367 e_object_unref(E_OBJECT(ec));
369 evas_object_unref(ev->comp_object);
374 _e_comp_object_event_add(Evas_Object *obj)
376 E_Event_Comp_Object *ev;
379 if (stopping) return;
380 ev = E_NEW(E_Event_Comp_Object, 1);
381 EINA_SAFETY_ON_NULL_RETURN(ev);
383 evas_object_ref(obj);
384 ev->comp_object = obj;
385 ec = evas_object_data_get(ev->comp_object, "E_Client");
389 e_object_ref(E_OBJECT(ec));
391 ecore_event_add(E_EVENT_COMP_OBJECT_ADD, ev, _e_comp_object_event_free, NULL);
395 _e_comp_object_simple_free(void *d EINA_UNUSED, void *event)
397 E_Event_Comp_Object *ev = event;
400 ec = evas_object_data_get(ev->comp_object, "E_Client");
404 e_object_unref(E_OBJECT(ec));
406 evas_object_unref(ev->comp_object);
411 _e_comp_object_event_simple(Evas_Object *obj, int type)
413 E_Event_Comp_Object *ev;
416 ev = E_NEW(E_Event_Comp_Object, 1);
419 evas_object_ref(obj);
420 ev->comp_object = obj;
421 ec = evas_object_data_get(ev->comp_object, "E_Client");
425 e_object_ref(E_OBJECT(ec));
427 ecore_event_add(type, ev, (Ecore_End_Cb)_e_comp_object_simple_free, NULL);
429 /////////////////////////////////////
432 _e_comp_object_cb_mirror_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
434 E_Comp_Object *cw = data;
436 cw->obj_mirror = eina_list_remove(cw->obj_mirror, obj);
440 _e_comp_object_cb_mirror_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
442 E_Comp_Object *cw = data;
444 if ((!cw->force_visible) && (!e_object_is_del(E_OBJECT(cw->ec))))
445 evas_object_smart_callback_call(cw->smart_obj, "visibility_force", cw->ec);
448 if (e_comp->hwc && !e_comp_is_on_overlay(cw->ec))
449 e_comp_hwc_client_end(cw->ec, __FUNCTION__);
453 _e_comp_object_cb_mirror_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
455 E_Comp_Object *cw = data;
458 if ((!cw->force_visible) && (!e_object_is_del(E_OBJECT(cw->ec))))
459 evas_object_smart_callback_call(cw->smart_obj, "visibility_normal", cw->ec);
462 /////////////////////////////////////
465 _e_comp_object_transform_obj_stack_update(Evas_Object *obj)
469 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
470 if (cw->ec->input_only) return;
472 layer = evas_object_layer_get(obj);
474 if (cw->transform_bg_obj)
476 if (layer != evas_object_layer_get(cw->transform_bg_obj))
478 evas_object_layer_set(cw->transform_bg_obj, layer);
481 evas_object_stack_below(cw->transform_bg_obj, obj);
484 if (cw->transform_tranp_obj)
486 if (layer != evas_object_layer_get(cw->transform_tranp_obj))
488 evas_object_layer_set(cw->transform_tranp_obj, layer);
491 evas_object_stack_below(cw->transform_tranp_obj, obj);
496 _e_comp_object_transform_obj_map_new(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
503 if (!map) return NULL;
505 e_map_util_points_populate_from_object_full(map, obj, 0);
506 e_map_util_points_color_set(map, 255, 255, 255, 255);
508 for (i = 0 ; i < 4 ; ++i)
513 e_util_transform_vertices_pos_round_get(vertices, i, &x, &y, 0, 0);
514 e_map_point_coord_set(map, i, x, y, 1.0);
521 _e_comp_object_transform_obj_map_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
527 E_Map *map = _e_comp_object_transform_obj_map_new(obj, vertices);
530 e_comp_object_map_set(obj, map);
531 e_comp_object_map_enable_set(obj, EINA_TRUE);
538 evas_object_map_enable_set(obj, EINA_FALSE);
543 _e_comp_object_transform_obj_map_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
549 E_Map *map = _e_comp_object_transform_obj_map_new(obj, vertices);
552 e_map_util_zoom(map, zoom.zoom_x, zoom.zoom_y, zoom.cx, zoom.cy);
554 e_comp_object_map_set(obj, map);
555 e_comp_object_map_enable_set(obj, EINA_TRUE);
562 evas_object_map_enable_set(obj, EINA_FALSE);
565 /////////////////////////////////////
567 static inline Eina_Bool
568 _e_comp_shaped_check(int w, int h, const Eina_Rectangle *rects, int num)
570 if (num > 1) return EINA_TRUE;
571 if ((rects[0].x == 0) && (rects[0].y == 0) &&
572 ((int)rects[0].w == w) && ((int)rects[0].h == h))
577 /////////////////////////////////////
579 /* add a client to the layer-client list */
581 _e_comp_object_layers_add(E_Comp_Object *cw, E_Comp_Object *above, E_Comp_Object *below, Eina_Bool prepend)
583 E_Comp_Object *layer_cw = NULL;
585 /* try to get the internal data for the layer;
586 * will return NULL for fake layers (eg. wayland)
588 if (e_comp->layers[cw->layer].obj)
590 if (evas_object_smart_smart_get(e_comp->layers[cw->layer].obj))
591 layer_cw = evas_object_smart_data_get(e_comp->layers[cw->layer].obj);
593 if (layer_cw == cw) layer_cw = NULL;
595 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));
597 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));
598 if ((!above) && (!below))
601 e_comp->layers[cw->layer].clients = eina_inlist_prepend(e_comp->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
603 e_comp->layers[cw->layer].clients = eina_inlist_prepend_relative(e_comp->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec), EINA_INLIST_GET(layer_cw->ec));
604 else //this is either the layer object or a tough actin tinactin^W^W^Wfast stacking client
605 e_comp->layers[cw->layer].clients = eina_inlist_append(e_comp->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
607 e_comp->layers[cw->layer].clients_count++;
608 #ifndef E_RELEASE_BUILD
611 E_Client *below_ec = e_client_below_get(cw->ec);
614 if (e_comp->layers[cw->layer].obj == below_ec->frame)
615 CRI("ACK! ec:%p", cw->ec);
622 _e_comp_object_layers_remove(E_Comp_Object *cw)
624 if (cw->ec && e_comp->layers[cw->layer].clients)
626 e_comp->layers[cw->layer].clients = eina_inlist_remove(e_comp->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
627 e_comp->layers[cw->layer].clients_count--;
630 e_comp->layers[cw->layer].objs = eina_inlist_remove(e_comp->layers[cw->layer].objs, EINA_INLIST_GET(cw));
631 e_comp->layers[cw->layer].objs_count--;
635 /////////////////////////////////////
637 _e_comp_object_alpha_set(E_Comp_Object *cw)
639 Eina_Bool alpha = cw->ec->argb;
641 if ((cw->external_content) &&
642 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
647 if (cw->blanked || cw->ns || cw->ec->shaped) alpha = EINA_TRUE;
648 if (cw->user_alpha_set) alpha = cw->user_alpha;
650 evas_object_image_alpha_set(cw->obj, alpha);
654 _e_comp_object_shadow(E_Comp_Object *cw)
656 if (e_client_util_shadow_state_get(cw->ec))
657 edje_object_signal_emit(cw->frame_object ?: cw->shobj, "e,state,shadow,on", "e");
659 edje_object_signal_emit(cw->frame_object ?: cw->shobj, "e,state,shadow,off", "e");
660 if (cw->frame_object)
661 edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e");
662 evas_object_smart_callback_call(cw->smart_obj, "shadow_change", cw->ec);
665 /* convert from the surface coordinates to the buffer coordinates */
667 _e_comp_object_map_transform_pos(E_Client *ec, int sx, int sy, int *dx, int *dy)
669 E_Comp_Wl_Buffer_Viewport *vp;
670 E_Comp_Wl_Client_Data *cdata;
674 cdata = e_client_cdata_get(ec);
676 if (!ec || !cdata || e_object_is_del(E_OBJECT(ec)))
683 vp = &cdata->scaler.buffer_viewport;
684 transform = e_comp_wl_output_buffer_transform_get(ec);
686 e_pixmap_size_get(ec->pixmap, &bw, &bh);
688 /* for subsurface, it should be swap 90 and 270 */
689 if (e_comp_wl_subsurface_check(ec))
692 case WL_OUTPUT_TRANSFORM_90: transform = WL_OUTPUT_TRANSFORM_270; break;
693 case WL_OUTPUT_TRANSFORM_270: transform = WL_OUTPUT_TRANSFORM_90; break;
694 case WL_OUTPUT_TRANSFORM_FLIPPED_90: transform = WL_OUTPUT_TRANSFORM_FLIPPED_270; break;
695 case WL_OUTPUT_TRANSFORM_FLIPPED_270: transform = WL_OUTPUT_TRANSFORM_FLIPPED_90; break;
701 case WL_OUTPUT_TRANSFORM_NORMAL:
702 default: tx = sx, ty = sy; break;
703 case WL_OUTPUT_TRANSFORM_90: tx = sy, ty = bw - sx; break;
704 case WL_OUTPUT_TRANSFORM_180: tx = bw - sx, ty = bh - sy; break;
705 case WL_OUTPUT_TRANSFORM_270: tx = bh - sy, ty = sx; break;
706 case WL_OUTPUT_TRANSFORM_FLIPPED: tx = bw - sx, ty = sy; break;
707 case WL_OUTPUT_TRANSFORM_FLIPPED_90: tx = sy, ty = sx; break;
708 case WL_OUTPUT_TRANSFORM_FLIPPED_180: tx = sx, ty = bh - sy; break;
709 case WL_OUTPUT_TRANSFORM_FLIPPED_270: tx = bh - sy, ty = bw - sx; break;
712 tx *= vp->buffer.scale;
713 ty *= vp->buffer.scale;
720 _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)
728 _e_comp_object_map_transform_pos(ec, x1, y1, &x1, &y1);
729 _e_comp_object_map_transform_pos(ec, x2, y2, &x2, &y2);
736 if (dw) *dw = MAX(x1, x2) - mx;
737 if (dh) *dh = MAX(y1, y2) - my;
741 _e_comp_object_map_damage_transform_rect(E_Client *ec, E_Map *m, int sx, int sy, int sw, int sh,
742 int *dx, int *dy, int *dw, int *dh)
744 E_Util_Transform_Rect rect = {sx, sy, sw, sh};
745 E_Util_Transform_Rect_Vertex sv, dv;
749 e_pixmap_size_get(ec->pixmap, &bw, &bh);
751 sv = e_util_transform_rect_to_vertices(&rect);
753 for (i = 0; i < 4; i++)
755 double x = 0.0, y = 0.0;
757 e_map_coords_get(m, sv.vertices[i].vertex[0], sv.vertices[i].vertex[1], &x, &y, 0);
759 /* if evas decide coordinate is outside of map, it returns (0, 0)
760 in this case, full damage is added.
762 if ((i != 0) && (x == 0.0) && (y == 0.0))
765 dv.vertices[i].vertex[0] = x;
766 dv.vertices[i].vertex[1] = y;
767 dv.vertices[i].vertex[2] = 1.0;
768 dv.vertices[i].vertex[3] = 1.0;
771 rect = e_util_transform_vertices_to_rect(&dv);
773 if (dx) *dx = rect.x;
774 if (dy) *dy = rect.y;
775 if (dw) *dw = rect.w;
776 if (dh) *dh = rect.h;
790 _e_comp_object_map_damage_transform_get(E_Client *ec)
797 if (!evas_object_map_enable_get(ec->frame))
800 m = e_client_map_get(ec);
804 e_pixmap_size_get(ec->pixmap, &bw, &bh);
805 if ((bw == 0) || (bh == 0))
818 e_map_point_coord_set(m2, 0, 0, 0, 0);
819 e_map_point_coord_set(m2, 1, bw, 0, 0);
820 e_map_point_coord_set(m2, 2, bw, bh, 0);
821 e_map_point_coord_set(m2, 3, 0, bh, 0);
823 for (i = 0; i < 4; i++)
827 e_map_point_coord_get(m, i, &map_x, &map_y, NULL);
828 e_map_point_image_uv_set(m2, i, map_x, map_y);
835 /////////////////////////////////////
837 /* handle evas mouse-in events on client object */
839 _e_comp_object_cb_mouse_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
841 Evas_Event_Mouse_In *ev = event_info;
842 E_Comp_Object *cw = data;
844 e_client_mouse_in(cw->ec, ev->output.x, ev->output.y);
847 /* handle evas mouse-out events on client object */
849 _e_comp_object_cb_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
851 Evas_Event_Mouse_Out *ev = event_info;
852 E_Comp_Object *cw = data;
854 e_client_mouse_out(cw->ec, ev->output.x, ev->output.y);
857 /* handle evas mouse wheel events on client object */
859 _e_comp_object_cb_mouse_wheel(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
861 Evas_Event_Mouse_Wheel *ev = event_info;
862 E_Comp_Object *cw = data;
863 E_Binding_Event_Wheel ev2;
866 if (e_client_action_get()) return;
867 e_bindings_evas_event_mouse_wheel_convert(ev, &ev2);
868 e_client_mouse_wheel(cw->ec, &ev->output, &ev2);
871 /* handle evas mouse down events on client object */
873 _e_comp_object_cb_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
875 Evas_Event_Mouse_Down *ev = event_info;
876 E_Comp_Object *cw = data;
877 E_Binding_Event_Mouse_Button ev2;
880 if (e_client_action_get()) return;
881 e_bindings_evas_event_mouse_down_button_convert(ev, &ev2);
882 e_client_mouse_down(cw->ec, ev->button, &ev->output, &ev2);
885 /* handle evas mouse up events on client object */
887 _e_comp_object_cb_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
889 Evas_Event_Mouse_Up *ev = event_info;
890 E_Comp_Object *cw = data;
891 E_Binding_Event_Mouse_Button ev2;
894 if (e_client_action_get() && (e_client_action_get() != cw->ec)) return;
895 e_bindings_evas_event_mouse_up_button_convert(ev, &ev2);
896 e_client_mouse_up(cw->ec, ev->button, &ev->output, &ev2);
899 /* handle evas mouse movement events on client object */
901 _e_comp_object_cb_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
903 Evas_Event_Mouse_Move *ev = event_info;
904 E_Comp_Object *cw = data;
907 if (e_client_action_get() && (e_client_action_get() != cw->ec)) return;
908 e_client_mouse_move(cw->ec, &ev->cur.output);
910 /////////////////////////////////////
912 /* helper function for checking compositor themes based on user-defined matches */
914 _e_comp_object_shadow_client_match(const E_Client *ec, E_Comp_Match *m)
916 if (((m->title) && (!ec->netwm.name)) ||
917 ((ec->netwm.name) && (m->title) && (!e_util_glob_match(ec->netwm.name, m->title))))
919 #if defined(__cplusplus) || defined(c_plusplus)
920 if (((m->clas) && (!ec->icccm.cpp_class)) ||
921 ((ec->icccm.cpp_class) && (m->clas) && (!e_util_glob_match(ec->icccm.cpp_class, m->clas))))
924 if (((m->clas) && (!ec->icccm.class)) ||
925 ((ec->icccm.class) && (m->clas) && (!e_util_glob_match(ec->icccm.class, m->clas))))
929 if (((m->role) && (!ec->icccm.window_role)) ||
930 ((ec->icccm.window_role) && (m->role) && (!e_util_glob_match(ec->icccm.window_role, m->role))))
936 if ((int)ec->netwm.type != m->primary_type)
939 else if (m->primary_type != E_WINDOW_TYPE_REAL_UNKNOWN)
942 if (m->borderless != 0)
946 if (e_client_util_borderless(ec))
948 if (!(((m->borderless == -1) && (!borderless)) ||
949 ((m->borderless == 1) && (borderless))))
956 if (((ec->icccm.transient_for != 0) ||
959 if (!(((m->dialog == -1) && (!dialog)) ||
960 ((m->dialog == 1) && (dialog))))
963 if (m->accepts_focus != 0)
965 int accepts_focus = 0;
967 if (ec->icccm.accepts_focus)
969 if (!(((m->accepts_focus == -1) && (!accepts_focus)) ||
970 ((m->accepts_focus == 1) && (accepts_focus))))
979 if (!(((m->vkbd == -1) && (!vkbd)) ||
980 ((m->vkbd == 1) && (vkbd))))
985 if (!(((m->argb == -1) && (!ec->argb)) ||
986 ((m->argb == 1) && (ec->argb))))
989 if (m->fullscreen != 0)
991 int fullscreen = ec->fullscreen;
993 if (!(((m->fullscreen == -1) && (!fullscreen)) ||
994 ((m->fullscreen == 1) && (fullscreen))))
1001 if (ec->netwm.state.modal)
1003 if (!(((m->modal == -1) && (!modal)) ||
1004 ((m->modal == 1) && (modal))))
1010 /* function for setting up a client's compositor frame theme (cw->shobj) */
1012 _e_comp_object_shadow_setup(E_Comp_Object *cw)
1016 Eina_List *list = NULL, *l;
1017 E_Input_Rect_Data *input_rect_data;
1018 E_Input_Rect_Smart_Data *input_rect_sd;
1020 Eina_Stringshare *reshadow_group = NULL;
1021 Eina_Bool focus = EINA_FALSE, urgent = EINA_FALSE, skip = EINA_FALSE, fast = EINA_FALSE, reshadow = EINA_FALSE, no_shadow = EINA_FALSE, pass_event_flag = EINA_FALSE;
1022 Eina_Stringshare *name, *title;
1023 E_Comp_Config *conf = e_comp_config_get();
1025 edje_object_file_get(cw->shobj, NULL, &reshadow_group);
1026 /* match correct client type */
1027 list = cw->ec->override ? conf->match.overrides : conf->match.borders;
1028 name = cw->ec->icccm.name;
1029 title = cw->ec->icccm.title;
1030 skip = (cw->ec->override ? conf->match.disable_overrides : conf->match.disable_borders) || (title && (!strncmp(title, "noshadow", 8)));
1031 fast = cw->ec->override ? conf->fast_overrides : conf->fast_borders;
1033 /* skipping here is mostly a hack for systray because I hate it */
1036 EINA_LIST_FOREACH(list, l, m)
1038 if (((m->name) && (!name)) ||
1039 ((name) && (m->name) && (!e_util_glob_match(name, m->name))))
1041 if (!_e_comp_object_shadow_client_match(cw->ec, m)) continue;
1045 no_shadow = m->no_shadow;
1046 if (m->shadow_style)
1048 /* fast effects are just themes with "/fast" appended and shorter effect times */
1051 snprintf(buf, sizeof(buf), "e/comp/frame/%s/fast", m->shadow_style);
1052 reshadow = ok = !e_util_strcmp(reshadow_group, buf);
1054 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", buf);
1056 /* default to non-fast style if fast not available */
1059 snprintf(buf, sizeof(buf), "e/comp/frame/%s", m->shadow_style);
1060 reshadow = ok = !e_util_strcmp(reshadow_group, buf);
1062 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", buf);
1064 if (ok && m->visibility_effect)
1065 eina_stringshare_refplace(&cw->visibility_effect, m->visibility_effect);
1072 if (skip || (cw->ec->e.state.video))
1074 reshadow = ok = !e_util_strcmp(reshadow_group, "e/comp/frame/none");
1076 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", "e/comp/frame/none");
1079 if (conf->shadow_style)
1083 snprintf(buf, sizeof(buf), "e/comp/frame/%s/fast", conf->shadow_style);
1084 reshadow = ok = !e_util_strcmp(reshadow_group, buf);
1086 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", buf);
1090 snprintf(buf, sizeof(buf), "e/comp/frame/%s", conf->shadow_style);
1091 reshadow = ok = !e_util_strcmp(reshadow_group, buf);
1093 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", buf);
1100 reshadow = ok = !e_util_strcmp(reshadow_group, "e/comp/frame/default/fast");
1102 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", "e/comp/frame/default/fast");
1106 reshadow = ok = !e_util_strcmp(reshadow_group, "e/comp/frame/default");
1108 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", "e/comp/frame/default");
1113 /* reshadow means this entire function call has been a no-op since we're re-setting the current style */
1116 if (cw->zoomap_disabled)
1118 if (cw->frame_object && (e_zoomap_child_get(cw->zoomobj) == cw->frame_object)) return EINA_FALSE;
1122 if (cw->frame_object && (edje_object_part_swallow_get(cw->shobj, "e.swallow.content") == cw->frame_object)) return EINA_FALSE;
1125 if (cw->ec->override)
1127 if ((!cw->ec->shaped) && (!no_shadow) && (!cw->ec->argb))
1128 edje_object_signal_emit(cw->shobj, "e,state,shadow,on", "e");
1130 edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e");
1131 evas_object_smart_callback_call(cw->smart_obj, "shadow_change", cw->ec);
1137 edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e");
1138 evas_object_smart_callback_call(cw->smart_obj, "shadow_change", cw->ec);
1141 _e_comp_object_shadow(cw);
1144 if (focus || cw->ec->focused || cw->ec->override)
1145 e_comp_object_signal_emit(cw->smart_obj, "e,state,focused", "e");
1147 e_comp_object_signal_emit(cw->smart_obj, "e,state,unfocused", "e");
1148 if (urgent || cw->ec->urgent)
1149 e_comp_object_signal_emit(cw->smart_obj, "e,state,urgent", "e");
1151 e_comp_object_signal_emit(cw->smart_obj, "e,state,not_urgent", "e");
1153 e_comp_object_signal_emit(cw->smart_obj, "e,state,shaded", "e");
1155 e_comp_object_signal_emit(cw->smart_obj, "e,state,sticky", "e");
1157 e_comp_object_signal_emit(cw->smart_obj, "e,state,hung", "e");
1158 /* visibility must always be enabled for re_manage clients to prevent
1159 * pop-in animations every time the user sees a persistent client again;
1160 * applying visibility for iconic clients prevents the client from getting
1163 if (cw->visible || cw->ec->re_manage)
1164 e_comp_object_signal_emit(cw->smart_obj, "e,state,visible", "e");
1166 e_comp_object_signal_emit(cw->smart_obj, "e,state,hidden", "e");
1168 /* breaks animation counter */
1169 if (!cw->zoomap_disabled)
1172 e_zoomap_child_set(cw->zoomobj, NULL);
1174 if (cw->frame_object)
1176 edje_object_part_swallow(cw->frame_object, "e.swallow.client", cw->obj);
1177 if (cw->zoomap_disabled)
1178 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object);
1182 e_zoomap_child_set(cw->zoomobj, cw->frame_object);
1183 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->zoomobj);
1192 e_zoomap_child_set(cw->zoomobj, cw->obj);
1193 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->zoomobj);
1196 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->obj);
1200 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
1203 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
1205 if (input_rect_data->obj)
1207 pass_event_flag = EINA_TRUE;
1213 if (cw->indicator.obj)
1215 Evas_Object *indicator;
1216 indicator = edje_object_part_swallow_get(cw->shobj, "e.swallow.indicator");
1217 if (indicator != cw->indicator.obj)
1219 edje_object_part_unswallow(cw->shobj, indicator);
1220 edje_object_part_swallow(cw->shobj, "e.swallow.indicator", cw->indicator.obj);
1221 e_comp_object_indicator_size_set(cw->smart_obj, cw->indicator.w, cw->indicator.h);
1225 evas_object_pass_events_set(cw->default_input_obj, pass_event_flag);
1226 evas_object_pass_events_set(cw->obj, pass_event_flag);
1227 #ifdef BORDER_ZOOMAPS
1228 e_zoomap_child_edje_solid_setup(cw->zoomobj);
1233 /////////////////////////////////////////////
1236 _e_comp_object_animating_begin(E_Comp_Object *cw)
1239 if (cw->animating == 1)
1241 e_comp->animating++;
1243 e_object_ref(E_OBJECT(cw->ec));
1248 _e_comp_object_animating_end(E_Comp_Object *cw)
1257 if (cw->ec->launching)
1259 if (!cw->ec->extra_animating)
1261 ELOGF("COMP", "Un-Set launching flag..", cw->ec);
1262 cw->ec->launching = EINA_FALSE;
1263 if (cw->ec->first_mapped)
1265 ELOGF("LAUNCH", "SHOW real win", cw->ec);
1266 e_comp_object_signal_emit(cw->ec->frame, "e,action,launch_real,done", "e");
1269 e_comp_object_signal_emit(cw->ec->frame, "e,action,launch,done", "e");
1273 e_comp->animating--;
1274 cw->showing = cw->hiding = 0;
1276 if (e_comp->animating == 0)
1277 e_client_visibility_calculate();
1278 /* remove ref from animation start, account for possibility of deletion from unref */
1279 return !!e_object_unref(E_OBJECT(cw->ec));
1285 /* handle the end of a compositor animation */
1287 _e_comp_object_done_defer(void *data, Evas_Object *obj EINA_UNUSED, const char *emission, const char *source EINA_UNUSED)
1289 E_Comp_Object *cw = data;
1291 /* visible clients which have never been sized are a bug */
1292 if ((!cw->ec->new_client) && (!cw->ec->changes.size) && ((cw->w < 0) || (cw->h < 0)) && (!strcmp(emission, "e,action,show,done")))
1293 CRI("ACK! ec:%p", cw->ec);
1294 if (!_e_comp_object_animating_end(cw)) return;
1295 if (cw->animating) return;
1296 /* hide only after animation finishes to guarantee a full run of the animation */
1297 if (cw->defer_hide && ((!strcmp(emission, "e,action,hide,done")) || (!strcmp(emission, "e,action,done"))))
1298 evas_object_hide(cw->smart_obj);
1301 /* run a visibility compositor effect if available, return false if object is dead */
1303 _e_comp_object_effect_visibility_start(E_Comp_Object *cw, Eina_Bool state)
1308 if ((!cw->visibility_effect) || (!e_comp_object_effect_allowed_get(cw->smart_obj))) return EINA_TRUE;;
1309 if (!cw->effect_running)
1310 _e_comp_object_animating_begin(cw);
1311 if (!e_comp_object_effect_stop(cw->smart_obj, _e_comp_object_done_defer))
1312 return _e_comp_object_animating_end(cw);
1313 if (!e_comp_object_effect_set(cw->smart_obj, cw->visibility_effect))
1314 return _e_comp_object_animating_end(cw);
1316 evas_pointer_canvas_xy_get(e_comp->evas, &x, &y);
1320 zw = cw->ec->zone->w, zh = cw->ec->zone->h;
1325 zone = e_comp_object_util_zone_get(cw->smart_obj);
1326 if (!zone) zone = e_zone_current_get();
1333 e_comp_object_effect_params_set(cw->smart_obj, 1, (int[]){cw->x, cw->y,
1334 cw->w, cw->h, zw, zh, x, y}, 8);
1335 e_comp_object_effect_params_set(cw->smart_obj, 0, (int[]){state}, 1);
1336 e_comp_object_effect_start(cw->smart_obj, _e_comp_object_done_defer, cw);
1339 /////////////////////////////////////////////
1341 /* create necessary objects for clients that e manages */
1343 _e_comp_object_mouse_event_callback_set(E_Comp_Object *cw)
1345 if (cw->set_mouse_callbacks) return;
1346 if (!cw->smart_obj) return;
1348 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_IN, _e_comp_object_cb_mouse_in, cw);
1349 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_OUT, _e_comp_object_cb_mouse_out, cw);
1350 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_comp_object_cb_mouse_down, cw);
1351 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_cb_mouse_up, cw);
1352 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_comp_object_cb_mouse_move, cw);
1353 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_WHEEL, _e_comp_object_cb_mouse_wheel, cw);
1355 cw->set_mouse_callbacks = EINA_TRUE;
1359 _e_comp_object_mouse_event_callback_unset(E_Comp_Object *cw)
1361 if (!cw->set_mouse_callbacks) return;
1362 if (!cw->smart_obj) return;
1364 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_IN, _e_comp_object_cb_mouse_in);
1365 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_OUT, _e_comp_object_cb_mouse_out);
1366 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_comp_object_cb_mouse_down);
1367 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_cb_mouse_up);
1368 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_comp_object_cb_mouse_move);
1369 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_WHEEL, _e_comp_object_cb_mouse_wheel);
1371 cw->set_mouse_callbacks = EINA_FALSE;
1375 _e_comp_object_setup(E_Comp_Object *cw)
1377 cw->clip = evas_object_rectangle_add(e_comp->evas);
1378 evas_object_move(cw->clip, -9999, -9999);
1379 evas_object_resize(cw->clip, 999999, 999999);
1380 evas_object_smart_member_add(cw->clip, cw->smart_obj);
1381 cw->effect_obj = edje_object_add(e_comp->evas);
1382 evas_object_move(cw->effect_obj, cw->x, cw->y);
1383 evas_object_clip_set(cw->effect_obj, cw->clip);
1384 evas_object_smart_member_add(cw->effect_obj, cw->smart_obj);
1385 e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", "e/comp/effects/none");
1386 cw->shobj = edje_object_add(e_comp->evas);
1387 evas_object_data_set(cw->shobj, "comp_smart_obj", cw->smart_obj);
1388 edje_object_part_swallow(cw->effect_obj, "e.swallow.content", cw->shobj);
1389 edje_object_signal_callback_add(cw->shobj, "e,action,*,done", "e", _e_comp_object_done_defer, cw);
1391 /* name objects appropriately for nicer printing when using e_comp_util_wins_print() */
1392 if (cw->ec->override)
1394 evas_object_name_set(cw->shobj, "cw->shobj::WINDOW");
1395 evas_object_name_set(cw->effect_obj, "cw->effect_obj::WINDOW");
1396 evas_object_name_set(cw->clip, "cw->clip::WINDOW");
1398 else if (!cw->ec->input_only)
1400 evas_object_name_set(cw->shobj, "cw->shobj::CLIENT");
1401 evas_object_name_set(cw->effect_obj, "cw->effect_obj::CLIENT");
1402 evas_object_name_set(cw->clip, "cw->clip::CLIENT");
1404 cw->real_hid = !cw->ec->input_only;
1405 if (!cw->ec->input_only)
1407 e_util_size_debug_set(cw->effect_obj, 1);
1408 _e_comp_object_mouse_event_callback_set(cw);
1411 cw->default_input_obj = evas_object_rectangle_add(e_comp->evas);
1412 evas_object_name_set(cw->default_input_obj, "cw->default_input_obj");
1413 evas_object_move(cw->default_input_obj, cw->x, cw->y);
1414 evas_object_resize(cw->default_input_obj, cw->w, cw->h);
1415 evas_object_color_set(cw->default_input_obj, 0, 0, 0, 0);
1416 evas_object_smart_member_add(cw->default_input_obj, cw->smart_obj);
1418 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_OBJECT_SETUP, cw->ec);
1421 /////////////////////////////////////////////
1423 /* for fast path evas rendering; only called during render */
1425 _e_comp_object_pixels_get(void *data, Evas_Object *obj EINA_UNUSED)
1427 E_Comp_Object *cw = data;
1428 E_Client *ec = cw->ec;
1430 int bx, by, bxx, byy;
1432 if (e_object_is_del(E_OBJECT(ec))) return;
1433 if (cw->external_content) return;
1434 if (!e_pixmap_size_get(ec->pixmap, &pw, &ph)) return;
1435 e_pixmap_image_opaque_get(cw->ec->pixmap, &bx, &by, &bxx, &byy);
1438 bxx = pw - (bx + bxx), byy = ph - (by + byy);
1439 evas_object_image_border_set(cw->obj, bx, bxx, by, byy);
1441 else if (cw->client_inset.calc && (!cw->frame_object)) //CSD
1443 bx = -cw->client_inset.l + 4, by = -cw->client_inset.t + 4;
1444 bxx = -cw->client_inset.r, byy = -cw->client_inset.b;
1448 bx = by = bxx = byy = 0;
1449 evas_object_image_border_set(cw->obj, bx, bxx, by, byy);
1452 Edje_Message_Int_Set *msg;
1453 Edje_Message_Int msg2;
1454 Eina_Bool id = (bx || by || bxx || byy);
1456 msg = alloca(sizeof(Edje_Message_Int_Set) + (sizeof(int) * 3));
1462 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT_SET, 1, msg);
1464 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT, 0, &msg2);
1468 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
1469 e_comp_client_post_update_add(cw->ec);
1471 else if (e_comp_object_render(ec->frame))
1473 /* apply shape mask if necessary */
1474 if ((!cw->native) && (ec->shaped || ec->shape_changed))
1475 e_comp_object_shape_apply(ec->frame);
1476 ec->shape_changed = 0;
1478 /* shaped clients get precise mouse events to handle transparent pixels */
1479 evas_object_precise_is_inside_set(cw->obj, ec->shaped || ec->shaped_input);
1481 /* queue another render if client is still dirty; cannot refresh here. */
1482 if (e_pixmap_dirty_get(ec->pixmap) && e_pixmap_size_get(ec->pixmap, &pw, &ph))
1483 e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
1485 if (cw->render_trace)
1487 _e_comp_object_event_simple(ec->frame, E_EVENT_COMP_OBJECT_IMG_RENDER);
1493 _e_comp_object_pixels_noti(void *data, Evas_Object *obj EINA_UNUSED)
1495 E_Comp_Object *cw = data;
1496 E_Client *ec = cw->ec;
1498 if (e_object_is_del(E_OBJECT(ec))) return;
1499 if (cw->external_content) return;
1500 if (!e_comp->hwc) return;
1502 e_comp_client_render_list_add(cw->ec);
1504 if (!ec->hwc_window) return;
1506 e_hwc_windows_rendered_window_add(ec->hwc_window);
1509 /////////////////////////////////////////////
1512 _e_comp_object_client_pending_resize_add(E_Client *ec,
1515 unsigned int serial)
1517 E_Client_Pending_Resize *pnd;
1519 pnd = E_NEW(E_Client_Pending_Resize, 1);
1523 pnd->serial = serial;
1524 ec->pending_resize = eina_list_append(ec->pending_resize, pnd);
1528 _e_comp_intercept_move(void *data, Evas_Object *obj, int x, int y)
1530 E_Comp_Object *cw = data;
1533 if (cw->render_update_lock.lock)
1535 cw->render_update_lock.pending_move_x = x;
1536 cw->render_update_lock.pending_move_y = y;
1537 cw->render_update_lock.pending_move_set = EINA_TRUE;
1541 if ((e_pixmap_type_get(cw->ec->pixmap) != E_PIXMAP_TYPE_EXT_OBJECT) &&
1542 (e_pixmap_usable_get(cw->ec->pixmap)) &&
1543 (cw->external_content))
1545 /* delay to move until the external content is unset */
1546 cw->ec->changes.pos = 1;
1551 if (cw->ec->move_after_resize)
1553 if ((x != cw->ec->x) || (y != cw->ec->y))
1555 ELOGF("COMP", "Set Pos to (%d,%d). current ec_pos(%d,%d)", cw->ec, x, y, cw->ec->x, cw->ec->y);
1556 e_client_pos_set(cw->ec, x, y);
1557 cw->ec->changes.pos = 1;
1563 if ((cw->ec->resize_mode == E_POINTER_RESIZE_NONE) &&
1564 (cw->ec->manage_resize.resize_obj))
1566 e_client_pos_set(cw->ec, x, y);
1567 cw->ec->client.x = x + cw->client_inset.l;
1568 cw->ec->client.y = y + cw->client_inset.t;
1569 e_policy_visibility_client_defer_move(cw->ec);
1573 /* if frame_object does not exist, client_inset indicates CSD.
1574 * this means that ec->client matches cw->x/y, the opposite
1577 fx = (!cw->frame_object) * cw->client_inset.l;
1578 fy = (!cw->frame_object) * cw->client_inset.t;
1579 if ((cw->x == x + fx) && (cw->y == y + fy))
1581 if ((cw->ec->x != x) || (cw->ec->y != y))
1583 /* handle case where client tries to move to position and back very quickly */
1584 e_client_pos_set(cw->ec, x, y);
1585 cw->ec->client.x = x + cw->client_inset.l;
1586 cw->ec->client.y = y + cw->client_inset.t;
1590 if (!cw->ec->maximize_override)
1592 /* prevent moving in some directions while directionally maximized */
1593 if ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL)
1595 if ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_HORIZONTAL)
1598 ix = x + cw->client_inset.l;
1599 iy = y + cw->client_inset.t;
1600 if (cw->ec->maximized && (!cw->ec->maximize_override) && ((cw->ec->x != x) || (cw->ec->y != y)) &&
1601 ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) != E_MAXIMIZE_VERTICAL) &&
1602 ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) != E_MAXIMIZE_HORIZONTAL))
1604 /* prevent moving at all if move isn't allowed in current maximize state */
1605 if ((!e_config->allow_manip) && ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH)) return;
1606 /* queue unmaximize if we are allowing move and update unmaximize geometry */
1607 if ((!cw->ec->shading) && (!cw->ec->shaded))
1609 cw->ec->changes.need_unmaximize = 1;
1610 cw->ec->saved.x = ix - cw->ec->zone->x;
1611 cw->ec->saved.y = iy - cw->ec->zone->y;
1612 cw->ec->saved.w = cw->ec->client.w;
1613 cw->ec->saved.h = cw->ec->client.h;
1619 /* only update during resize if triggered by resize */
1620 if (e_client_util_resizing_get(cw->ec) && (!cw->force_move)) return;
1621 /* delay to move while surface waits paired commit serial*/
1622 if (e_client_pending_geometry_has(cw->ec))
1624 /* do nothing while waiting paired commit serial*/
1628 e_client_pos_set(cw->ec, x, y);
1629 if (cw->ec->new_client)
1631 /* don't actually do anything until first client idler loop */
1632 cw->ec->placed = ((!cw->ec->dialog) && (!cw->ec->parent));
1633 cw->ec->changes.pos = 1;
1638 /* only update xy position of client to avoid invalid
1639 * first damage region if it is not a new_client. */
1640 if (!cw->ec->shading)
1642 cw->ec->client.x = ix;
1643 cw->ec->client.y = iy;
1646 if (!cw->frame_object)
1648 evas_object_move(obj, x, y);
1653 _e_comp_intercept_resize(void *data, Evas_Object *obj, int w, int h)
1655 E_Comp_Object *cw = data;
1656 int pw = 0, ph = 0, fw, fh, iw, ih, prev_w, prev_h, x, y;
1658 if (cw->render_update_lock.lock)
1660 cw->render_update_lock.pending_resize_w = w;
1661 cw->render_update_lock.pending_resize_h = h;
1662 cw->render_update_lock.pending_resize_set = EINA_TRUE;
1666 if (!e_util_strcmp("input_panel_surface", cw->ec->icccm.window_role))
1668 e_client_size_set(cw->ec, w, h);
1669 evas_object_resize(obj, w, h);
1673 /* if frame_object does not exist, client_inset indicates CSD.
1674 * this means that ec->client matches cw->w/h, the opposite
1677 fw = (!cw->frame_object) * (-cw->client_inset.l - cw->client_inset.r);
1678 fh = (!cw->frame_object) * (-cw->client_inset.t - cw->client_inset.b);
1679 if ((cw->w == w + fw) && (cw->h == h + fh))
1681 if (cw->ec->shading || cw->ec->shaded) return;
1682 if (((cw->ec->w != w) || (cw->ec->h != h)) ||
1683 (cw->ec->client.w != w - cw->client_inset.l - cw->client_inset.r) ||
1684 (cw->ec->client.h != h - cw->client_inset.t - cw->client_inset.b))
1686 /* handle case where client tries to resize itself and back very quickly */
1687 e_client_size_set(cw->ec, w, h);
1688 cw->ec->client.w = w - cw->client_inset.l - cw->client_inset.r;
1689 cw->ec->client.h = h - cw->client_inset.t - cw->client_inset.b;
1690 evas_object_smart_callback_call(obj, "client_resize", NULL);
1694 /* guarantee that fullscreen is fullscreen */
1695 if (cw->ec->fullscreen && ((w != cw->ec->zone->w) || (h != cw->ec->zone->h)))
1697 /* calculate client size */
1698 iw = w - cw->client_inset.l - cw->client_inset.r;
1699 ih = h - cw->client_inset.t - cw->client_inset.b;
1700 if (cw->ec->maximized && (!cw->ec->maximize_override) && ((cw->ec->w != w) || (cw->ec->h != h)))
1702 /* prevent resizing while maximized depending on direction and config */
1703 if ((!e_config->allow_manip) && ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH)) return;
1704 if ((!cw->ec->shading) && (!cw->ec->shaded))
1706 Eina_Bool reject = EINA_FALSE;
1707 if (cw->ec->maximized & E_MAXIMIZE_VERTICAL)
1709 if (cw->ec->client.h != ih)
1711 cw->ec->saved.h = ih;
1712 cw->ec->saved.y = cw->ec->client.y - cw->ec->zone->y;
1713 reject = cw->ec->changes.need_unmaximize = 1;
1716 if (cw->ec->maximized & E_MAXIMIZE_HORIZONTAL)
1718 if (cw->ec->client.w != iw)
1720 cw->ec->saved.w = iw;
1721 cw->ec->saved.x = cw->ec->client.x - cw->ec->zone->x;
1722 reject = cw->ec->changes.need_unmaximize = 1;
1732 if (cw->ec->new_client || (!cw->ec->visible) || (!cw->effect_obj))
1734 /* do nothing until client idler loops */
1735 if ((cw->ec->w != w) || (cw->ec->h != h))
1737 e_client_size_set(cw->ec, w, h);
1738 cw->ec->changes.size = 1;
1743 if ((!cw->ec->internal) && e_client_util_resizing_get(cw->ec) && cw->ec->netwm.sync.request &&
1744 ((cw->ec->w != w) || (cw->ec->h != h)))
1747 /* netwm sync resizes queue themselves and then trigger later on */
1748 _e_comp_object_client_pending_resize_add(cw->ec, iw, ih, cw->ec->netwm.sync.serial);
1750 if (e_client_pending_geometry_has(cw->ec))
1752 /* do nothing while waiting paired commit serial*/
1756 e_client_size_set(cw->ec, w, h);
1757 if ((!cw->ec->shading) && (!cw->ec->shaded))
1759 /* client geom never changes when shading since the client is never altered */
1760 cw->ec->client.w = iw;
1761 cw->ec->client.h = ih;
1762 if ((cw->ec->client.w < 0) || (cw->ec->client.h < 0)) CRI("WTF. ec:%p", cw->ec);
1765 /* The size of non-compositing window can be changed, so there is a
1766 * need to check that cw is H/W composited if cw is not redirected.
1767 * And of course we have to change size of evas object of H/W composited cw,
1768 * otherwise cw can't receive input events even if it is shown on the screen.
1770 Eina_Bool redirected = cw->redirected;
1772 redirected = e_comp_is_on_overlay(cw->ec);
1774 if ((!cw->ec->input_only) && (redirected) &&
1775 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE) &&
1776 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE) &&
1777 (e_pixmap_dirty_get(cw->ec->pixmap) ||
1778 (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph))))
1781 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE ||
1782 cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE)
1784 prev_w = cw->w, prev_h = cw->h;
1785 e_comp_object_frame_wh_adjust(obj, 0, 0, &fw, &fh);
1786 /* check shading and clamp to pixmap size for regular clients */
1787 if ((!cw->ec->shading) && (!cw->ec->shaded) && (!cw->ec->input_only) && (!cw->ec->override) &&
1788 (((w - fw != pw) || (h - fh != ph))))
1790 //INF("CALLBACK: REQ(%dx%d) != CUR(%dx%d)", w - fw, h - fh, pw, ph);
1791 evas_object_smart_callback_call(obj, "client_resize", NULL);
1793 if (cw->frame_object || cw->ec->input_only)
1794 e_comp_object_frame_wh_adjust(obj, pw, ph, &w, &h);
1797 if ((cw->w == w) && (cw->h == h))
1799 /* going to be a noop resize which won't trigger smart resize */
1800 RENDER_DEBUG("DAMAGE RESIZE(%p): %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
1801 if (cw->updates) eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
1803 evas_object_resize(obj, w, h);
1807 evas_object_smart_callback_call(obj, "client_resize", NULL);
1810 if ((!cw->frame_object) && (!cw->ec->input_only))
1812 /* "just do it" for overrides */
1813 evas_object_resize(obj, w, h);
1815 if (!cw->ec->override)
1817 /* shape probably changed for non-overrides */
1818 cw->ec->need_shape_merge |= cw->ec->shaped || cw->ec->shaped_input;
1819 cw->ec->need_shape_export |= cw->ec->shaped;
1820 if (cw->ec->shaped || cw->ec->shaped_input)
1824 /* this fixes positioning jiggles when using a resize mode
1825 * which also changes the client's position
1828 if (cw->frame_object)
1829 x = cw->x, y = cw->y;
1831 x = cw->ec->x, y = cw->ec->y;
1832 switch (cw->ec->resize_mode)
1834 case E_POINTER_RESIZE_BL:
1835 case E_POINTER_RESIZE_L:
1836 evas_object_move(obj, x + prev_w - cw->w, y);
1838 case E_POINTER_RESIZE_TL:
1839 evas_object_move(obj, x + prev_w - cw->w, y + prev_h - cw->h);
1841 case E_POINTER_RESIZE_T:
1842 case E_POINTER_RESIZE_TR:
1843 evas_object_move(obj, x, y + prev_h - cw->h);
1852 _e_comp_intercept_layer_set(void *data, Evas_Object *obj, int layer)
1854 E_Comp_Object *cw = data;
1855 E_Comp_Wl_Client_Data *child_cdata;
1856 unsigned int l = e_comp_canvas_layer_map(layer);
1859 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
1861 /* doing a compositor effect, follow directions */
1862 _e_comp_object_layer_set(obj, layer);
1863 if (layer == cw->ec->layer) //trying to put layer back
1867 /* if ec->layer and layer are the same but the client is not belong to the given(l)
1868 that means, layer is changed during layer_pending. in this case, need to update layer inlist*/
1869 if (cw->layer != l) goto layer_set;
1873 e_comp_render_queue();
1875 ec = e_client_above_get(cw->ec);
1876 /* skip subsurface: stacking subsurface is handled by e_comp_wl */
1877 while ((ec) && (e_comp_wl_subsurface_check(ec)))
1878 ec = e_client_above_get(ec);
1879 if (ec && (evas_object_layer_get(ec->frame) != evas_object_layer_get(obj)))
1881 ec = e_client_below_get(cw->ec);
1882 /* skip subsurface: stacking subsurface is handled by e_comp_wl */
1883 while ((ec) && (e_comp_wl_subsurface_check(ec)))
1884 ec = e_client_below_get(ec);
1885 if (ec && (evas_object_layer_get(ec->frame) == evas_object_layer_get(cw->smart_obj)))
1887 evas_object_stack_above(obj, ec->frame);
1892 if (ec && (cw->ec->parent == ec))
1894 if (e_client_transient_policy_get(cw->ec) == E_TRANSIENT_ABOVE)
1895 evas_object_stack_above(obj, ec->frame);
1897 evas_object_stack_below(obj, ec->frame);
1900 evas_object_stack_below(obj, ec ? ec->frame : e_comp->layers[cw->layer].obj);
1906 if (cw->layer == l) return;
1907 if (e_comp_canvas_client_layer_map(layer) == 9999)
1908 return; //invalid layer for clients not doing comp effects
1909 if (cw->ec->fullscreen)
1911 cw->ec->saved.layer = layer;
1914 oldraise = e_config->transient.raise;
1916 /* clamp to valid client layer */
1917 layer = e_comp_canvas_client_layer_map_nearest(layer);
1918 cw->ec->layer = layer;
1919 if (e_config->transient.layer)
1922 Eina_List *list = eina_list_clone(cw->ec->transients);
1924 /* We need to set raise to one, else the child wont
1925 * follow to the new layer. It should be like this,
1926 * even if the user usually doesn't want to raise
1929 e_config->transient.raise = 1;
1930 EINA_LIST_FREE(list, child)
1932 child_cdata = e_client_cdata_get(child);
1933 if (child_cdata && !child_cdata->mapped)
1935 ELOGF("COMP", "LAYER_SET CHILD. BUT not mapped. skip. child(ec:%p, win:0x%08zx)", cw->ec, child, e_client_util_win_get(child));
1938 e_client_layer_set(child, layer);
1941 if (!cw->ec->override)
1943 /* set client stacking hints based on layer */
1944 if (layer == E_LAYER_CLIENT_BELOW)
1945 e_hints_window_stacking_set(cw->ec, E_STACKING_BELOW);
1946 else if (layer == E_LAYER_CLIENT_ABOVE)
1947 e_hints_window_stacking_set(cw->ec, E_STACKING_ABOVE);
1949 e_hints_window_stacking_set(cw->ec, E_STACKING_NONE);
1952 e_config->transient.raise = oldraise;
1954 _e_comp_object_layers_remove(cw);
1955 cw->layer = e_comp_canvas_layer_map(layer);
1956 _e_comp_object_layers_add(cw, NULL, NULL, 0);
1957 //if (cw->ec->new_client)
1958 //INF("CLIENT STACKED %p: %u", cw->ec, layer);
1959 _e_comp_object_layer_set(obj, layer);
1960 if (!e_comp->layers[cw->layer].obj) return; //this is a layer marker
1961 evas_object_stack_below(obj, e_comp->layers[cw->layer].obj);
1962 if (evas_object_below_get(obj) == e_comp->layers[cw->layer].obj)
1964 /* can't stack a client above its own layer marker */
1965 CRI("STACKING ERROR!!! ec:%p (cw->layer:%d, ec->layer:%d)", cw->ec, cw->layer, cw->ec->layer);
1967 if (!cw->visible) return;
1968 e_comp_render_queue();
1969 _e_comp_object_transform_obj_stack_update(obj);
1972 typedef void (*E_Comp_Object_Stack_Func)(Evas_Object *obj, Evas_Object *stack);
1975 _e_comp_object_raise(Evas_Object *obj)
1977 evas_object_raise(obj);
1979 if (evas_object_smart_smart_get(obj))
1981 E_Client *ec = e_comp_object_client_get(obj);
1983 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
1988 _e_comp_object_lower(Evas_Object *obj)
1990 evas_object_lower(obj);
1992 if (evas_object_smart_smart_get(obj))
1994 E_Client *ec = e_comp_object_client_get(obj);
1996 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2001 _e_comp_object_stack_above(Evas_Object *obj, Evas_Object *target)
2003 evas_object_stack_above(obj, target);
2005 if (evas_object_smart_smart_get(obj))
2007 E_Client *ec = e_comp_object_client_get(obj);
2009 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2014 _e_comp_object_stack_below(Evas_Object *obj, Evas_Object *target)
2016 evas_object_stack_below(obj, target);
2018 if (evas_object_smart_smart_get(obj))
2020 E_Client *ec = e_comp_object_client_get(obj);
2022 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2027 _e_comp_object_layer_set(Evas_Object *obj, short layer)
2029 evas_object_layer_set(obj, layer);
2031 if (evas_object_smart_smart_get(obj))
2033 E_Client *ec = e_comp_object_client_get(obj);
2035 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_LAYER_SET, ec);
2040 _e_comp_object_is_pending(E_Client *ec)
2044 if (!ec) return EINA_FALSE;
2046 topmost = e_comp_wl_topmost_parent_get(ec);
2048 return (topmost) ? topmost->layer_pending : EINA_FALSE;
2052 _e_comp_intercept_stack_helper(E_Comp_Object *cw, Evas_Object *stack, E_Comp_Object_Stack_Func stack_cb)
2054 E_Comp_Object *cw2 = NULL;
2057 Evas_Object *o = stack;
2058 Eina_Bool raising = stack_cb == _e_comp_object_stack_above;
2060 /* We should consider topmost's layer_pending for subsurface */
2061 if ((cw->ec->layer_block) || _e_comp_object_is_pending(cw->ec))
2063 if (_e_comp_object_is_pending(cw->ec))
2064 e_comp_object_layer_update(cw->smart_obj,
2065 raising? stack : NULL,
2066 raising? NULL : stack);
2068 /* obey compositor effects! */
2069 if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
2070 evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
2071 stack_cb(cw->smart_obj, stack);
2072 if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
2073 evas_object_data_del(cw->smart_obj, "client_restack");
2077 cw2 = evas_object_data_get(o, "comp_obj");
2079 /* assume someone knew what they were doing during client init */
2080 if (cw->ec->new_client)
2081 layer = cw->ec->layer;
2082 else if ((cw2) && _e_comp_object_is_pending(cw2->ec))
2083 layer = cw2->ec->layer;
2085 layer = evas_object_layer_get(stack);
2086 ecstack = e_client_below_get(cw->ec);
2087 if (layer != e_comp_canvas_layer_map_to(cw->layer))
2089 /* some FOOL is trying to restack a layer marker */
2090 if (cw->smart_obj == e_comp->layers[cw->layer].obj) return;
2091 evas_object_layer_set(cw->smart_obj, layer);
2092 /* we got our layer wrangled, return now! */
2093 if (layer != e_comp_canvas_layer_map_to(cw->layer)) return;
2096 /* check if we're stacking below another client */
2099 /* check for non-client layer object */
2100 if (!e_util_strcmp(evas_object_name_get(o), "layer_obj"))
2102 /* find an existing client to use for layering
2103 * by walking up the object stack
2105 * this is guaranteed to be pretty quick since we'll either:
2106 * - run out of client layers
2107 * - find a stacking client
2109 o = evas_object_above_get(o);
2110 if ((!o) || (o == cw->smart_obj)) break;
2111 if (evas_object_layer_get(o) != layer)
2113 /* reached the top client layer somehow
2114 * use top client object
2116 o = e_comp->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR)].obj;
2119 /* top client layer window hasn't been stacked yet. this probably shouldn't happen?
2120 * return here since the top client layer window
2125 ec = e_client_top_get();
2130 if (o) cw2 = evas_object_data_get(o, "comp_obj");
2133 if (cw2 && cw->layer != cw2->layer)
2136 /* remove existing layers */
2137 _e_comp_object_layers_remove(cw);
2140 if (o == stack) //if stacking above, cw2 is above; else cw2 is below
2141 _e_comp_object_layers_add(cw, raising ? cw2 : NULL, raising ? NULL : cw2, 0);
2142 else if (o == cw->smart_obj) //prepend (lower) if not stacking above
2143 _e_comp_object_layers_add(cw, NULL, NULL, !raising);
2144 else //if no stacking objects found, either raise or lower
2145 _e_comp_object_layers_add(cw, raising ? NULL : cw2, raising ? cw2 : NULL, 0);
2148 _e_comp_object_layers_add(cw, NULL, NULL, 0);
2150 /* find new object for stacking if cw2 is on state of layer_pending */
2151 if ((cw2) && _e_comp_object_is_pending(cw2->ec))
2153 E_Client *new_stack = NULL, *current_ec = NULL;
2154 current_ec = cw2->ec;
2157 while ((new_stack = e_client_below_get(current_ec)))
2159 current_ec = new_stack;
2160 if (new_stack == cw->ec) continue;
2161 if (new_stack->layer != cw2->ec->layer) break;
2162 if (!_e_comp_object_is_pending(new_stack)) break;
2164 if ((new_stack) && (new_stack->layer == cw2->ec->layer))
2165 stack = new_stack->frame;
2168 /* stack it above layer object */
2170 below_layer = (cw2->layer <= 0)? 0 : cw2->layer - 1 ;
2171 stack = e_comp->layers[below_layer].obj;
2176 while ((new_stack = e_client_above_get(current_ec)))
2178 current_ec = new_stack;
2179 if (new_stack == cw->ec) continue;
2180 if (new_stack->layer != cw2->ec->layer) break;
2181 if (!_e_comp_object_is_pending(new_stack)) break;
2183 if ((new_stack) && (new_stack->layer == cw2->ec->layer))
2184 stack = new_stack->frame;
2186 stack = e_comp->layers[cw2->layer].obj;
2190 /* set restack if stacking has changed */
2191 if (cw->ec->new_client || (!ecstack) || (ecstack->frame != o))
2192 evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
2193 stack_cb(cw->smart_obj, stack);
2194 if (e_comp->layers[cw->layer].obj)
2195 if (evas_object_below_get(cw->smart_obj) == e_comp->layers[cw->layer].obj)
2197 CRI("STACKING ERROR!!! ec:%p (cw->layer:%d, ec->layer:%d)", cw->ec, cw->layer, cw->ec->layer);
2199 if (cw->ec->new_client || (!ecstack) || (ecstack->frame != o))
2200 evas_object_data_del(cw->smart_obj, "client_restack");
2201 if (!cw->visible) return;
2202 e_comp_render_queue();
2206 _e_comp_intercept_stack_above(void *data, Evas_Object *obj, Evas_Object *above)
2208 EINA_SAFETY_ON_TRUE_RETURN(obj == above);
2210 if (evas_object_below_get(obj) == above)
2212 e_comp_object_layer_update(obj, above, NULL);
2216 TRACE_DS_BEGIN(COMP:INTERCEPT STACK ABOVE);
2217 _e_comp_intercept_stack_helper(data, above, _e_comp_object_stack_above);
2218 _e_comp_object_transform_obj_stack_update(obj);
2219 _e_comp_object_transform_obj_stack_update(above);
2224 _e_comp_intercept_stack_below(void *data, Evas_Object *obj, Evas_Object *below)
2226 EINA_SAFETY_ON_TRUE_RETURN(obj == below);
2227 if (evas_object_above_get(obj) == below)
2229 e_comp_object_layer_update(obj, NULL, below);
2233 TRACE_DS_BEGIN(COMP:INTERCEPT STACK BELOW);
2234 _e_comp_intercept_stack_helper(data, below, _e_comp_object_stack_below);
2235 if (evas_object_smart_smart_get(obj))
2236 _e_comp_object_transform_obj_stack_update(obj);
2237 if (evas_object_smart_smart_get(below))
2238 _e_comp_object_transform_obj_stack_update(below);
2243 _e_comp_intercept_lower(void *data, Evas_Object *obj)
2245 E_Comp_Object *cw = data;
2248 TRACE_DS_BEGIN(COMP:INTERCEPT LOWER);
2250 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
2252 if (cw->ec->layer_pending)
2253 e_comp_object_layer_update(obj, NULL, obj);
2255 _e_comp_object_lower(obj);
2258 if (!EINA_INLIST_GET(cw->ec)->prev) goto end; //already lowest on layer
2259 o = evas_object_below_get(obj);
2260 _e_comp_object_layers_remove(cw);
2261 /* prepend to client list since this client should be the first item now */
2262 _e_comp_object_layers_add(cw, NULL, NULL, 1);
2263 if (evas_object_layer_get(o) != evas_object_layer_get(obj)) goto end; //already at bottom!
2264 if (obj == e_comp->layers[cw->layer].obj) goto end; //never lower a layer marker!
2265 evas_object_data_set(obj, "client_restack", (void*)1);
2266 _e_comp_object_lower(obj);
2267 evas_object_data_del(obj, "client_restack");
2268 if (!cw->visible) goto end;
2269 e_comp_render_queue();
2270 _e_comp_object_transform_obj_stack_update(obj);
2273 if (!cw->ec->post_lower)
2274 e_client_focus_stack_lower(cw->ec);
2279 _e_comp_intercept_raise(void *data, Evas_Object *obj)
2281 E_Comp_Object *cw = data;
2284 TRACE_DS_BEGIN(COMP:INTERCEPT RAISE);
2286 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
2288 if (cw->ec->layer_pending)
2290 int obj_layer = evas_object_layer_get(obj);
2291 if (cw->ec->layer != obj_layer)
2292 e_comp_object_layer_update(obj, NULL, NULL);
2295 _e_comp_object_raise(obj);
2298 if (!EINA_INLIST_GET(cw->ec)->next) goto end;//already highest on layer
2299 o = evas_object_above_get(obj);
2301 E_Client *ecabove = e_client_above_get(cw->ec);
2302 if (ecabove && (ecabove->frame == e_comp->layers[cw->layer].obj) &&
2303 (ecabove->frame == o)) goto end; //highest below marker
2305 if (evas_object_layer_get(o) != evas_object_layer_get(obj)) goto end; //already at top!
2306 if (obj == e_comp->layers[cw->layer].obj) //never raise a non-layer marker!
2307 _e_comp_object_raise(obj);
2312 /* still stack below override below the layer marker */
2313 for (op = o = e_comp->layers[cw->layer].obj;
2314 o && o != e_comp->layers[cw->layer - 1].obj;
2315 op = o, o = evas_object_below_get(o))
2317 if (evas_object_smart_smart_get(o))
2321 ec = e_comp_object_client_get(o);
2322 if (ec && (!ec->override)) break;
2325 _e_comp_object_stack_below(obj, op);
2326 e_client_focus_defer_set(cw->ec);
2328 if (!cw->visible) goto end;
2329 e_comp_render_queue();
2330 _e_comp_object_transform_obj_stack_update(obj);
2337 _e_comp_intercept_hide(void *data, Evas_Object *obj)
2339 E_Comp_Object *cw = data;
2341 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
2342 if( !_e_comp_object_intercept_hook_call(E_COMP_OBJECT_INTERCEPT_HOOK_HIDE, cw->ec))
2344 ELOGF("COMP", "Hide. intercepted", cw->ec);
2349 if (cw->ec->launching == EINA_TRUE)
2351 ELOGF("COMP", "Hide. Cancel launching flag", cw->ec);
2352 cw->ec->launching = EINA_FALSE;
2357 /* hidden flag = just do it */
2358 ELOGF("COMP", "Hide hidden evas_object:%p", cw->ec, obj);
2359 evas_object_hide(obj);
2363 if (cw->ec->input_only)
2365 /* input_only = who cares */
2366 ELOGF("COMP", "Hide input_only evas_object:%p", cw->ec, obj);
2367 evas_object_hide(obj);
2370 /* already hidden or currently animating */
2371 if ((!cw->visible) || (cw->animating && cw->hiding && (!cw->ec->iconic)))
2373 ELOGF("COMP", "Hide. but already hidden or currently animating", cw->ec);
2377 /* don't try hiding during shutdown */
2378 cw->defer_hide |= stopping;
2379 if (!cw->defer_hide)
2381 if ((!cw->ec->iconic) && (!cw->ec->override))
2382 /* unset delete requested so the client doesn't break */
2383 cw->ec->delete_requested = 0;
2384 if ((!cw->animating) || (!cw->hiding) || cw->ec->iconic)
2386 ELOGF("COMP", "Hide. but after iconify or hide animation, cw->animating:%d, cw->hiding:%d, iconic:%d",
2387 cw->ec, cw->animating, cw->hiding, cw->ec->iconic);
2390 e_comp_object_signal_emit(obj, "e,action,iconify", "e");
2393 e_comp_object_signal_emit(obj, "e,state,hidden", "e");
2395 _e_comp_object_animating_begin(cw);
2396 if (!_e_comp_object_effect_visibility_start(cw, 0)) return;
2398 evas_object_smart_callback_call(obj, "hiding", cw->ec);
2399 cw->defer_hide = !!cw->animating;
2401 e_comp_object_effect_set(obj, NULL);
2404 if (cw->animating) return;
2405 /* if we have no animations running, go ahead and hide */
2407 ELOGF("COMP", "Hide normal object:%p", cw->ec, obj);
2408 evas_object_hide(obj);
2412 _e_comp_intercept_show_helper(E_Comp_Object *cw)
2414 E_Client *ec = cw->ec;
2417 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
2419 if (ec->show_pending.count > 0)
2421 ELOGF("COMP", "show_helper. Show PENDING!!! show_pending:%d", ec, ec->show_pending.count);
2422 ec->show_pending.running = EINA_TRUE;
2426 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
2427 if (!_e_comp_object_intercept_hook_call(E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER, ec))
2429 ELOGF("COMP", "show_helper. intercepted", cw->ec);
2434 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,
2435 cw->visible, cw->animating, cw->defer_hide, cw->content_type, cw->updates, cw->w, cw->h,
2436 ec->iconic, ec->exp_iconify.by_client, ec->exp_iconify.type, ec->input_only, ec->ignored, ec->new_client);
2439 e_comp_object_signal_emit(cw->smart_obj, "e,state,sticky", "e");
2442 if (ec->iconic && cw->animating)
2444 /* triggered during iconify animation */
2445 e_comp_object_signal_emit(cw->smart_obj, "e,action,uniconify", "e");
2448 ELOGF("COMP", "show_helper. return. already cw->visible", ec);
2451 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE ||
2452 cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE)
2454 evas_object_move(cw->smart_obj, ec->x, ec->y);
2455 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2456 e_comp_object_frame_theme_set(cw->smart_obj, E_COMP_OBJECT_FRAME_RESHADOW);
2458 if (e_comp->image_filter != E_COMP_IMAGE_FILTER_NONE)
2459 e_comp_object_image_filter_set(cw->smart_obj, e_comp->image_filter);
2462 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2463 evas_object_show(cw->smart_obj);
2466 e_client_focus_defer_set(ec);
2470 if ((!cw->updates) && (!ec->input_only) && (!ec->ignored))
2474 pw = ec->client.w, ph = ec->client.h;
2476 if (!e_pixmap_size_get(ec->pixmap, &pw, &ph))
2478 ec->changes.visible = !ec->hidden;
2481 ELOGF("COMP", "show_helper. return. no pixmap size", ec);
2485 cw->updates = eina_tiler_new(pw, ph);
2488 ec->changes.visible = !ec->hidden;
2491 ELOGF("COMP", "show_helper. return. no cw->updates", ec);
2496 eina_tiler_tile_size_set(cw->updates, 1, 1);
2499 /* ignore until client idler first run */
2500 ec->changes.visible = !ec->hidden;
2503 ELOGF("COMP", "show_helper. return. new_client", ec);
2510 evas_object_move(cw->smart_obj, ec->x, ec->y);
2511 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2512 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2513 evas_object_show(cw->smart_obj);
2516 if (ec->netwm.type == E_WINDOW_TYPE_DND && !e_comp_wl->drag_client)
2518 /* start_drag not received */
2519 ec->changes.visible = 1;
2522 ELOGF("COMP", "show_helper. return. start_drag not received yet", ec);
2525 /* re-set geometry */
2526 evas_object_move(cw->smart_obj, ec->x, ec->y);
2527 /* force resize in case it hasn't happened yet, or just to update size */
2528 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2529 if ((cw->w < 1) || (cw->h < 1))
2531 /* if resize didn't go through, try again */
2532 ec->visible = ec->changes.visible = 1;
2534 ELOGF("COMP", "show_helper. return. cw_size(%d,%d)", ec, cw->w, cw->h);
2537 /* if pixmap not available, clear pixmap since we're going to fetch it again */
2538 if (!e_pixmap_size_get(ec->pixmap, &w, &h))
2539 e_pixmap_clear(ec->pixmap);
2541 if (cw->real_hid && w && h)
2544 /* force comp theming in case it didn't happen already */
2545 e_comp_object_frame_theme_set(cw->smart_obj, E_COMP_OBJECT_FRAME_RESHADOW);
2546 if (e_comp->image_filter != E_COMP_IMAGE_FILTER_NONE)
2547 e_comp_object_image_filter_set(cw->smart_obj, e_comp->image_filter);
2550 /* only do the show if show is allowed */
2553 if (ec->internal) //internal clients render when they feel like it
2554 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
2556 if (!e_client_is_iconified_by_client(ec)||
2557 e_policy_visibility_client_is_uniconic(ec))
2559 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2560 evas_object_show(cw->smart_obj);
2562 /* if comp object is shown in idle enterer before(E_CLIENT_HOOK_EVAL_FETCH),
2563 it is rendered in idle callback without native surface and
2564 compositor shows an empty frame if other objects aren't shown
2565 because job callback of e_comp called at the next loop.
2566 it causes a visual defect when windows are switched.
2570 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
2571 e_comp_object_dirty(cw->smart_obj);
2572 e_comp_object_render(cw->smart_obj);
2576 e_policy_visibility_client_is_uniconic(ec))
2578 if (ec->exp_iconify.not_raise &&
2579 e_client_check_above_focused(ec))
2580 e_client_focus_stack_append_current_focused(ec);
2582 e_client_focus_defer_set(ec);
2589 _e_comp_intercept_show(void *data, Evas_Object *obj EINA_UNUSED)
2591 E_Comp_Object *cw = data;
2592 E_Client *ec = cw->ec;
2594 E_Input_Rect_Data *input_rect_data;
2595 E_Input_Rect_Smart_Data *input_rect_sd;
2598 if (ec->ignored) return;
2602 //INF("SHOW2 %p", ec);
2603 _e_comp_intercept_show_helper(cw);
2606 //INF("SHOW %p", ec);
2609 cw->effect_obj = evas_object_rectangle_add(e_comp->evas);
2610 evas_object_color_set(cw->effect_obj, 0, 0, 0, 0);
2611 evas_object_smart_member_add(cw->effect_obj, cw->smart_obj);
2612 evas_object_name_set(cw->effect_obj, "cw->effect_obj::input_only");
2616 if ((!cw->obj) && (cw->external_content))
2618 ERR("cw->obj for external content is not created! ec:%p", cw->ec);
2622 _e_comp_object_setup(cw);
2625 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE;
2626 cw->obj = evas_object_image_filled_add(e_comp->evas);
2627 evas_object_image_border_center_fill_set(cw->obj, EVAS_BORDER_FILL_SOLID);
2628 e_util_size_debug_set(cw->obj, 1);
2629 evas_object_image_pixels_get_callback_set(cw->obj, _e_comp_object_pixels_get, cw);
2630 evas_object_image_pixels_noti_callback_set(cw->obj, _e_comp_object_pixels_noti, cw);
2631 evas_object_image_smooth_scale_set(cw->obj, e_comp_config_get()->smooth_windows);
2632 evas_object_name_set(cw->obj, "cw->obj");
2633 evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888);
2635 _e_comp_object_alpha_set(cw);
2636 #ifdef BORDER_ZOOMAPS
2637 e_comp_object_zoomap_set(o, 1);
2639 cw->zoomap_disabled = 1;
2642 evas_object_color_set(cw->clip, ec->netwm.opacity, ec->netwm.opacity, ec->netwm.opacity, ec->netwm.opacity);
2645 _e_comp_object_map_transform_rect(cw->ec, 0, 0, cw->w, cw->h, NULL, NULL, &tw, &th);
2646 evas_object_geometry_set(cw->effect_obj, cw->x, cw->y, tw, th);
2649 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
2652 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
2654 if (input_rect_data->obj)
2656 evas_object_geometry_set(input_rect_data->obj,
2657 cw->x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
2658 cw->y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
2659 input_rect_data->rect.w, input_rect_data->rect.h);
2666 evas_object_resize(cw->mask.obj, cw->w, cw->h);
2668 _e_comp_intercept_show_helper(cw);
2672 _e_comp_intercept_focus(void *data, Evas_Object *obj, Eina_Bool focus)
2674 E_Comp_Object *cw = data;
2678 /* note: this is here as it seems there are enough apps that do not even
2679 * expect us to emulate a look of focus but not actually set x input
2680 * focus as we do - so simply abort any focus set on such windows */
2681 /* be strict about accepting focus hint */
2682 /* be strict about accepting focus hint */
2683 if ((!ec->icccm.accepts_focus) &&
2684 (!ec->icccm.take_focus))
2688 if (e_client_focused_get() == ec)
2689 e_client_focused_set(NULL);
2691 ELOGF("FOCUS", "FOCUS UNSET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2692 evas_object_focus_set(obj, focus);
2696 if (focus && ec->lock_focus_out) return;
2697 if (e_object_is_del(E_OBJECT(ec)) && focus)
2698 CRI("CAN'T FOCUS DELETED CLIENT! ec:%p", ec);
2700 /* filter focus setting based on current state */
2705 ELOGF("FOCUS", "FOCUS SET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2706 evas_object_focus_set(obj, focus);
2709 if ((ec->iconic) && (!ec->deskshow))
2711 if (!e_policy_visibility_client_is_uniconify_render_running(ec))
2713 /* don't focus an iconified window. that's silly! */
2714 ELOGF("FOCUS", "Do uniconify to set focus", ec);
2715 e_client_uniconify(ec);
2716 if (e_client_focus_track_enabled())
2717 e_client_focus_latest_set(ec);
2725 if ((!ec->sticky) && (ec->desk) && (!ec->desk->visible))
2727 if (ec->desk->animate_count) return;
2728 e_desk_show(ec->desk);
2729 if (!ec->desk->visible) return;
2735 /* check for dialog children that steal focus */
2736 if ((ec->modal) && (ec->modal != ec) &&
2737 (ec->modal->visible) && (!e_object_is_del(E_OBJECT(ec->modal))))
2739 if (e_config->focus_policy_ext != E_FOCUS_EXT_TOP_STACK)
2741 ELOGF("FOCUS", "focus set | intercept focus to modal", ec->modal);
2742 e_client_frame_focus_set(ec->modal, focus);
2746 else if ((ec->leader) && (ec->leader->modal) &&
2747 (ec->leader->modal != ec) && ec->leader->modal->visible &&
2748 (!e_object_is_del(E_OBJECT(ec->leader->modal))))
2750 if (e_config->focus_policy_ext != E_FOCUS_EXT_TOP_STACK)
2752 ELOGF("FOCUS", "focus set | intercept focus to leader->modal", ec->leader->modal);
2753 e_client_frame_focus_set(ec->leader->modal, focus);
2759 /* not yet visible, wait till the next time... */
2760 ec->want_focus = !ec->hidden;
2765 e_client_focused_set(ec);
2769 if (e_client_focused_get() == ec)
2770 e_client_focused_set(NULL);
2774 ELOGF("FOCUS", "FOCUS SET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2776 ELOGF("FOCUS", "FOCUS UNSET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2778 evas_object_focus_set(obj, focus);
2781 ////////////////////////////////////////////////////
2784 _e_comp_object_frame_recalc(E_Comp_Object *cw)
2786 int w, h, ox, oy, ow, oh;
2788 Eina_Bool pass_event_flag = EINA_FALSE;
2789 E_Input_Rect_Data *input_rect_data;
2790 E_Input_Rect_Smart_Data *input_rect_sd;
2792 if (cw->frame_object)
2794 if (cw->obj) edje_object_part_unswallow(cw->frame_object, cw->obj);
2795 evas_object_geometry_get(cw->frame_object, NULL, NULL, &w, &h);
2796 /* set a fixed size, force edje calc, check size difference */
2797 evas_object_resize(cw->frame_object, MAX(w, 50), MAX(h, 50));
2798 edje_object_message_signal_process(cw->frame_object);
2799 edje_object_calc_force(cw->frame_object);
2800 edje_object_part_geometry_get(cw->frame_object, "e.swallow.client", &ox, &oy, &ow, &oh);
2801 cw->client_inset.l = ox;
2802 cw->client_inset.r = MAX(w, 50) - (ox + ow);
2803 cw->client_inset.t = oy;
2804 cw->client_inset.b = MAX(h, 50) - (oy + oh);
2805 if (cw->obj) edje_object_part_swallow(cw->frame_object, "e.swallow.client", cw->obj);
2806 evas_object_resize(cw->frame_object, w, h);
2810 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
2813 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
2815 if (input_rect_data->obj)
2817 pass_event_flag = EINA_TRUE;
2823 evas_object_pass_events_set(cw->default_input_obj, pass_event_flag);
2824 evas_object_pass_events_set(cw->obj, pass_event_flag);
2828 cw->client_inset.l = 0;
2829 cw->client_inset.r = 0;
2830 cw->client_inset.t = 0;
2831 cw->client_inset.b = 0;
2833 cw->client_inset.calc = !!cw->frame_object;
2837 _e_comp_smart_cb_frame_recalc(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2839 E_Comp_Object *cw = data;
2842 /* - get current size
2844 * - readjust for new frame size
2847 w = cw->ec->w, h = cw->ec->h;
2848 e_comp_object_frame_wh_unadjust(obj, w, h, &pw, &ph);
2850 _e_comp_object_frame_recalc(cw);
2852 if (!cw->ec->fullscreen)
2853 e_comp_object_frame_wh_adjust(obj, cw->ec->client.w, cw->ec->client.h, &w, &h);
2855 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2856 if (cw->ec->shading || cw->ec->shaded) return;
2857 if (cw->ec->fullscreen)
2858 evas_object_resize(cw->ec->frame, cw->ec->zone->w, cw->ec->zone->h);
2859 else if (cw->ec->new_client)
2861 if ((cw->ec->w < 1) || (cw->ec->h < 1)) return;
2862 e_comp_object_frame_wh_adjust(obj, pw, ph, &w, &h);
2863 evas_object_resize(cw->ec->frame, w, h);
2865 else if ((w != cw->ec->w) || (h != cw->ec->h))
2866 evas_object_resize(cw->ec->frame, w, h);
2870 _e_comp_smart_cb_shading(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2872 E_Comp_Object *cw = data;
2874 if (!cw->ec) return; //NYI
2875 E_FREE_FUNC(cw->shade.anim, ecore_timer_del);
2877 cw->shade.x = cw->x;
2878 cw->shade.y = cw->y;
2879 e_comp_object_signal_emit(cw->smart_obj, "e,state,shading", "e");
2883 _e_comp_smart_cb_shaded(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2885 E_Comp_Object *cw = data;
2887 if (!cw->ec) return; //NYI
2888 E_FREE_FUNC(cw->shade.anim, ecore_timer_del);
2890 e_comp_object_signal_emit(cw->smart_obj, "e,state,shaded", "e");
2894 _e_comp_smart_cb_unshading(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2896 E_Comp_Object *cw = data;
2898 if (!cw->ec) return; //NYI
2899 E_FREE_FUNC(cw->shade.anim, ecore_timer_del);
2901 e_comp_object_signal_emit(cw->smart_obj, "e,state,unshading", "e");
2905 _e_comp_smart_cb_unshaded(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2907 E_Comp_Object *cw = data;
2909 if (!cw->ec) return; //NYI
2910 E_FREE_FUNC(cw->shade.anim, ecore_timer_del);
2912 e_comp_object_signal_emit(cw->smart_obj, "e,state,unshaded", "e");
2916 _e_comp_smart_cb_maximize(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2918 E_Comp_Object *cw = data;
2920 _e_comp_object_shadow_setup(cw);
2921 if (cw->frame_object)
2923 _e_comp_object_shadow(cw);
2924 e_comp_object_signal_emit(cw->smart_obj, "e,action,maximize", "e");
2925 _e_comp_object_frame_recalc(cw);
2926 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2931 _e_comp_smart_cb_fullscreen(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2933 E_Comp_Object *cw = data;
2935 if (_e_comp_object_shadow_setup(cw))
2936 e_comp_object_damage(cw->smart_obj, 0, 0, cw->ec->w, cw->ec->h);
2937 if (cw->frame_object)
2939 _e_comp_object_shadow(cw);
2940 e_comp_object_signal_emit(cw->smart_obj, "e,action,maximize,fullscreen", "e");
2941 _e_comp_object_frame_recalc(cw);
2942 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2947 _e_comp_smart_cb_unmaximize(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2949 E_Comp_Object *cw = data;
2951 if (cw->frame_object)
2953 _e_comp_object_shadow(cw);
2954 e_comp_object_signal_emit(obj, "e,action,unmaximize", "e");
2955 _e_comp_object_frame_recalc(cw);
2956 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2961 _e_comp_smart_cb_unfullscreen(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2963 E_Comp_Object *cw = data;
2965 if (_e_comp_object_shadow_setup(cw))
2968 cw->ec->changes.size = 1;
2970 if (cw->frame_object)
2972 _e_comp_object_shadow(cw);
2973 e_comp_object_signal_emit(obj, "e,action,unmaximize,unfullscreen", "e");
2974 _e_comp_object_frame_recalc(cw);
2975 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2980 _e_comp_smart_cb_sticky(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
2982 e_comp_object_signal_emit(obj, "e,state,sticky", "e");
2986 _e_comp_smart_cb_unsticky(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
2988 e_comp_object_signal_emit(obj, "e,state,unsticky", "e");
2992 _e_comp_smart_cb_unhung(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2994 E_Comp_Object *cw = data;
2996 if (!cw->ec) return; //NYI
2997 e_comp_object_signal_emit(cw->smart_obj, "e,state,unhung", "e");
3001 _e_comp_smart_cb_hung(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3003 E_Comp_Object *cw = data;
3005 if (!cw->ec) return; //NYI
3006 e_comp_object_signal_emit(cw->smart_obj, "e,state,hung", "e");
3010 _e_comp_smart_focus_in(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3012 e_comp_object_signal_emit(obj, "e,state,focused", "e");
3016 _e_comp_smart_focus_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3018 E_Comp_Object *cw = data;
3020 if (!e_object_is_del(E_OBJECT(cw->ec)))
3021 e_comp_object_signal_emit(obj, "e,state,unfocused", "e");
3025 _e_comp_input_obj_smart_add(Evas_Object *obj)
3027 E_Input_Rect_Smart_Data *input_rect_sd;
3028 input_rect_sd = E_NEW(E_Input_Rect_Smart_Data, 1);
3030 if (!input_rect_sd) return;
3031 evas_object_smart_data_set(obj, input_rect_sd);
3035 _e_comp_input_obj_smart_del(Evas_Object *obj)
3037 E_Input_Rect_Smart_Data *input_rect_sd;
3038 E_Input_Rect_Data *input_rect_data;
3040 input_rect_sd = evas_object_smart_data_get(obj);
3041 if (!input_rect_sd) return;
3043 EINA_LIST_FREE(input_rect_sd->input_rect_data_list, input_rect_data)
3045 if (input_rect_data->obj)
3047 evas_object_smart_member_del(input_rect_data->obj);
3048 E_FREE_FUNC(input_rect_data->obj, evas_object_del);
3050 E_FREE(input_rect_data);
3052 E_FREE(input_rect_sd);
3056 _e_comp_input_obj_smart_move(Evas_Object *obj, int x, int y)
3058 E_Input_Rect_Smart_Data *input_rect_sd;
3059 E_Input_Rect_Data *input_rect_data;
3063 input_rect_sd = evas_object_smart_data_get(obj);
3064 if (!input_rect_sd) return;
3066 cw = input_rect_sd->cw;
3067 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3069 if (input_rect_data->obj)
3071 evas_object_geometry_set(input_rect_data->obj,
3072 x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
3073 y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
3074 input_rect_data->rect.w, input_rect_data->rect.h);
3080 _e_comp_input_obj_smart_resize(Evas_Object *obj, int w, int h)
3082 E_Input_Rect_Smart_Data *input_rect_sd;
3083 E_Input_Rect_Data *input_rect_data;
3087 input_rect_sd = evas_object_smart_data_get(obj);
3088 if (!input_rect_sd) return;
3090 cw = input_rect_sd->cw;
3091 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3093 if (input_rect_data->obj)
3095 evas_object_geometry_set(input_rect_data->obj,
3096 cw->x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
3097 cw->y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
3098 input_rect_data->rect.w, input_rect_data->rect.h);
3104 _e_comp_input_obj_smart_show(Evas_Object *obj)
3106 E_Input_Rect_Smart_Data *input_rect_sd;
3107 E_Input_Rect_Data *input_rect_data;
3110 input_rect_sd = evas_object_smart_data_get(obj);
3111 if (!input_rect_sd) return;
3113 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3115 if (input_rect_data->obj)
3117 evas_object_show(input_rect_data->obj);
3123 _e_comp_input_obj_smart_hide(Evas_Object *obj)
3125 E_Input_Rect_Smart_Data *input_rect_sd;
3126 E_Input_Rect_Data *input_rect_data;
3129 input_rect_sd = evas_object_smart_data_get(obj);
3130 if (!input_rect_sd) return;
3132 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3134 if (input_rect_data->obj)
3136 evas_object_hide(input_rect_data->obj);
3142 _e_comp_input_obj_smart_init(void)
3144 if (_e_comp_input_obj_smart) return;
3146 static const Evas_Smart_Class sc =
3148 INPUT_OBJ_SMART_NAME,
3149 EVAS_SMART_CLASS_VERSION,
3150 _e_comp_input_obj_smart_add,
3151 _e_comp_input_obj_smart_del,
3152 _e_comp_input_obj_smart_move,
3153 _e_comp_input_obj_smart_resize,
3154 _e_comp_input_obj_smart_show,
3155 _e_comp_input_obj_smart_hide,
3168 _e_comp_input_obj_smart = evas_smart_class_new(&sc);
3174 _e_comp_smart_add(Evas_Object *obj)
3178 cw = E_NEW(E_Comp_Object, 1);
3179 EINA_SAFETY_ON_NULL_RETURN(cw);
3181 cw->smart_obj = obj;
3182 cw->x = cw->y = cw->w = cw->h = -1;
3183 evas_object_smart_data_set(obj, cw);
3184 cw->opacity = 255.0;
3185 cw->external_content = 0;
3186 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_NONE;
3187 cw->transform_bg_color.r = 0;
3188 cw->transform_bg_color.g = 0;
3189 cw->transform_bg_color.b = 0;
3190 cw->transform_bg_color.a = 255;
3191 evas_object_data_set(obj, "comp_obj", cw);
3192 evas_object_move(obj, -1, -1);
3193 /* intercept ALL the callbacks! */
3194 evas_object_intercept_stack_above_callback_add(obj, _e_comp_intercept_stack_above, cw);
3195 evas_object_intercept_stack_below_callback_add(obj, _e_comp_intercept_stack_below, cw);
3196 evas_object_intercept_raise_callback_add(obj, _e_comp_intercept_raise, cw);
3197 evas_object_intercept_lower_callback_add(obj, _e_comp_intercept_lower, cw);
3198 evas_object_intercept_layer_set_callback_add(obj, _e_comp_intercept_layer_set, cw);
3199 evas_object_intercept_move_callback_add(obj, _e_comp_intercept_move, cw);
3200 evas_object_intercept_resize_callback_add(obj, _e_comp_intercept_resize, cw);
3201 evas_object_intercept_show_callback_add(obj, _e_comp_intercept_show, cw);
3202 evas_object_intercept_hide_callback_add(obj, _e_comp_intercept_hide, cw);
3203 evas_object_intercept_focus_set_callback_add(obj, _e_comp_intercept_focus, cw);
3205 evas_object_smart_callback_add(obj, "shading", _e_comp_smart_cb_shading, cw);
3206 evas_object_smart_callback_add(obj, "shaded", _e_comp_smart_cb_shaded, cw);
3207 evas_object_smart_callback_add(obj, "unshading", _e_comp_smart_cb_unshading, cw);
3208 evas_object_smart_callback_add(obj, "unshaded", _e_comp_smart_cb_unshaded, cw);
3210 evas_object_smart_callback_add(obj, "maximize", _e_comp_smart_cb_maximize, cw);
3211 evas_object_smart_callback_add(obj, "fullscreen", _e_comp_smart_cb_fullscreen, cw);
3212 evas_object_smart_callback_add(obj, "unmaximize", _e_comp_smart_cb_unmaximize, cw);
3213 evas_object_smart_callback_add(obj, "unfullscreen", _e_comp_smart_cb_unfullscreen, cw);
3215 evas_object_smart_callback_add(obj, "stick", _e_comp_smart_cb_sticky, cw);
3216 evas_object_smart_callback_add(obj, "unstick", _e_comp_smart_cb_unsticky, cw);
3218 evas_object_smart_callback_add(obj, "hung", _e_comp_smart_cb_hung, cw);
3219 evas_object_smart_callback_add(obj, "unhung", _e_comp_smart_cb_unhung, cw);
3221 evas_object_smart_callback_add(obj, "frame_recalc", _e_comp_smart_cb_frame_recalc, cw);
3223 evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_IN, _e_comp_smart_focus_in, cw);
3224 evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_OUT, _e_comp_smart_focus_out, cw);
3228 _e_comp_smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
3231 evas_object_color_set(cw->clip, r, g, b, a);
3232 evas_object_smart_callback_call(obj, "color_set", NULL);
3237 _e_comp_smart_clip_set(Evas_Object *obj, Evas_Object *clip)
3240 evas_object_clip_set(cw->clip, clip);
3244 _e_comp_smart_clip_unset(Evas_Object *obj)
3247 evas_object_clip_unset(cw->clip);
3251 _e_comp_smart_hide(Evas_Object *obj)
3253 TRACE_DS_BEGIN(COMP:SMART HIDE);
3258 evas_object_hide(cw->clip);
3259 if (cw->input_obj) evas_object_hide(cw->input_obj);
3260 evas_object_hide(cw->effect_obj);
3261 if (cw->default_input_obj) evas_object_hide(cw->default_input_obj);
3262 if (cw->transform_bg_obj) evas_object_hide(cw->transform_bg_obj);
3263 if (cw->transform_tranp_obj) evas_object_hide(cw->transform_tranp_obj);
3270 /* unset native surface if current displaying buffer was destroied */
3271 if (!cw->buffer_destroy_listener.notify)
3273 Evas_Native_Surface *ns;
3274 ns = evas_object_image_native_surface_get(cw->obj);
3275 if ((ns) && (ns->type == EVAS_NATIVE_SURFACE_WL) && (ns->data.wl.legacy_buffer))
3276 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
3279 if (!cw->ec->input_only)
3281 edje_object_freeze(cw->effect_obj);
3282 edje_object_freeze(cw->shobj);
3283 edje_object_play_set(cw->shobj, 0);
3284 if (cw->frame_object)
3285 edje_object_play_set(cw->frame_object, 0);
3287 /* ensure focus-out */
3288 if (cw->ec->focused &&
3289 (e_config->focus_policy_ext != E_FOCUS_EXT_TOP_STACK))
3291 ELOGF("FOCUS", "focus unset | smart_hide", cw->ec);
3292 e_client_frame_focus_set(cw->ec, EINA_FALSE);
3293 e_client_focus_defer_unset(cw->ec);
3295 e_comp_render_queue(); //force nocomp recheck
3301 _e_comp_smart_show(Evas_Object *obj)
3309 if ((cw->w < 0) || (cw->h < 0))
3310 CRI("ACK! ec:%p", cw->ec);
3312 TRACE_DS_BEGIN(COMP:SMART SHOW);
3314 e_comp_object_map_update(obj);
3316 EINA_LIST_FOREACH(cw->ec->e.state.video_child, l, tmp)
3317 evas_object_show(tmp->frame);
3319 evas_object_show(cw->clip);
3320 if (cw->input_obj) evas_object_show(cw->input_obj);
3321 if (!cw->ec->input_only)
3323 edje_object_thaw(cw->effect_obj);
3324 edje_object_thaw(cw->shobj);
3325 edje_object_play_set(cw->shobj, 1);
3326 if (cw->frame_object)
3327 edje_object_play_set(cw->frame_object, 1);
3329 evas_object_show(cw->effect_obj);
3330 if (cw->mask.obj) evas_object_show(cw->mask.obj);
3331 if (cw->transform_bg_obj) evas_object_show(cw->transform_bg_obj);
3332 if (cw->transform_tranp_obj) evas_object_show(cw->transform_tranp_obj);
3333 if (cw->default_input_obj) evas_object_show(cw->default_input_obj);
3334 e_comp_render_queue();
3335 if (cw->ec->input_only)
3340 if (cw->ec->iconic && (!cw->ec->new_client))
3342 if (e_client_is_iconified_by_client(cw->ec))
3344 ELOGF("COMP", "Set launching flag..", cw->ec);
3345 cw->ec->launching = EINA_TRUE;
3348 e_comp_object_signal_emit(cw->smart_obj, "e,action,uniconify", "e");
3350 else if (!cw->showing) /* if set, client was ec->hidden during show animation */
3353 ELOGF("COMP", "Set launching flag..", cw->ec);
3354 cw->ec->launching = EINA_TRUE;
3356 e_comp_object_signal_emit(cw->smart_obj, "e,state,visible", "e");
3357 _e_comp_object_animating_begin(cw);
3358 if (!_e_comp_object_effect_visibility_start(cw, 1))
3364 /* ensure some random effect doesn't lock the client offscreen */
3368 e_comp_object_effect_set(obj, NULL);
3371 _e_comp_object_dim_update(cw);
3377 _e_comp_smart_del(Evas_Object *obj)
3383 if (cw->buffer_destroy_listener.notify)
3385 wl_list_remove(&cw->buffer_destroy_listener.link);
3386 cw->buffer_destroy_listener.notify = NULL;
3389 if (cw->tbm_surface)
3391 tbm_surface_internal_unref(cw->tbm_surface);
3392 cw->tbm_surface = NULL;
3395 if (cw->render_update_lock.buffer_ref.buffer)
3397 ELOGF("COMP", "Clear buffer_ref of render_update_lock:%d",
3398 cw->ec, cw->render_update_lock.lock);
3399 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, NULL);
3402 e_comp_object_render_update_del(cw->smart_obj);
3403 E_FREE_FUNC(cw->updates, eina_tiler_free);
3404 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
3411 EINA_LIST_FREE(cw->obj_mirror, o)
3413 evas_object_image_data_set(o, NULL);
3414 evas_object_freeze_events_set(o, 1);
3415 evas_object_event_callback_del_full(o, EVAS_CALLBACK_DEL, _e_comp_object_cb_mirror_del, cw);
3419 _e_comp_object_layers_remove(cw);
3420 l = evas_object_data_get(obj, "comp_object-to_del");
3421 E_FREE_LIST(l, evas_object_del);
3422 _e_comp_object_mouse_event_callback_unset(cw);
3423 evas_object_del(cw->clip);
3424 evas_object_del(cw->effect_obj);
3425 evas_object_del(cw->shobj);
3426 evas_object_del(cw->frame_object);
3427 evas_object_del(cw->zoomobj);
3428 evas_object_del(cw->input_obj);
3429 evas_object_del(cw->obj);
3430 evas_object_del(cw->mask.obj);
3431 if (cw->dim.mask_obj) evas_object_del(cw->dim.mask_obj);
3432 evas_object_del(cw->transform_bg_obj);
3433 evas_object_del(cw->transform_tranp_obj);
3434 evas_object_del(cw->default_input_obj);
3435 eina_stringshare_del(cw->frame_theme);
3436 eina_stringshare_del(cw->frame_name);
3440 e_comp->animating--;
3442 e_object_unref(E_OBJECT(cw->ec));
3444 cw->ec->frame = NULL;
3449 _e_comp_smart_move(Evas_Object *obj, int x, int y)
3453 cw->x = x, cw->y = y;
3454 evas_object_move(cw->effect_obj, x, y);
3455 evas_object_move(cw->default_input_obj, x, y);
3456 if (cw->input_obj) evas_object_move(cw->input_obj, x, y);
3458 e_comp_object_map_update(obj);
3462 _e_comp_smart_resize(Evas_Object *obj, int w, int h)
3464 Eina_Bool first = EINA_FALSE;
3469 if (!cw->effect_obj) CRI("ACK! ec:%p", cw->ec);
3471 TRACE_DS_BEGIN(COMP:SMART RESIZE);
3473 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
3475 if (cw->w != w || cw->h != h)
3476 e_comp_object_map_update(obj);
3478 first = ((cw->w < 1) || (cw->h < 1));
3479 cw->w = w, cw->h = h;
3480 if ((!cw->ec->shading) && (!cw->ec->shaded))
3484 if (cw->frame_object)
3485 e_comp_object_frame_wh_unadjust(obj, w, h, &ww, &hh);
3488 /* verify pixmap:object size */
3489 if (e_pixmap_size_get(cw->ec->pixmap, &pw, &ph) && (!cw->ec->override))
3491 if ((ww != pw) || (hh != ph))
3492 ELOGF("COMP", "CW RSZ: %dx%d || PX: %dx%d.", cw->ec, ww, hh, pw, ph);
3494 evas_object_resize(cw->effect_obj, tw, th);
3495 evas_object_resize(cw->default_input_obj, w, h);
3496 if (cw->zoomobj) e_zoomap_child_resize(cw->zoomobj, pw, ph);
3498 evas_object_resize(cw->input_obj, w, h);
3500 evas_object_resize(cw->mask.obj, w, h);
3501 /* resize render update tiler */
3504 RENDER_DEBUG("DAMAGE UNFULL: %p", cw->ec);
3505 cw->updates_full = 0;
3506 if (cw->updates) eina_tiler_clear(cw->updates);
3510 RENDER_DEBUG("DAMAGE RESIZE(%p): %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
3511 if (cw->updates) eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
3516 evas_object_resize(cw->effect_obj, tw, th);
3517 evas_object_resize(cw->default_input_obj, w, h);
3524 e_comp_render_queue();
3530 _e_comp_smart_init(void)
3532 if (_e_comp_smart) return;
3534 static const Evas_Smart_Class sc =
3537 EVAS_SMART_CLASS_VERSION,
3541 _e_comp_smart_resize,
3544 _e_comp_smart_color_set,
3545 _e_comp_smart_clip_set,
3546 _e_comp_smart_clip_unset,
3556 _e_comp_smart = evas_smart_class_new(&sc);
3561 e_comp_object_init(void)
3563 E_EVENT_COMP_OBJECT_ADD = ecore_event_type_new();
3564 E_EVENT_COMP_OBJECT_IMG_RENDER = ecore_event_type_new();
3565 E_EVENT_COMP_OBJECT_EFFECT_START = ecore_event_type_new();
3566 E_EVENT_COMP_OBJECT_EFFECT_END = ecore_event_type_new();
3570 e_comp_object_shutdown(void)
3576 e_comp_object_zoomap_set(Evas_Object *obj, Eina_Bool enabled)
3580 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
3583 if (cw->zoomap_disabled == enabled) return;
3586 cw->zoomobj = e_zoomap_add(e_comp->evas);
3587 e_zoomap_smooth_set(cw->zoomobj, e_comp_config_get()->smooth_windows);
3588 e_zoomap_child_set(cw->zoomobj, cw->frame_object);
3589 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->zoomobj);
3590 e_zoomap_child_edje_solid_setup(cw->zoomobj);
3591 if (cw->ec->override)
3592 evas_object_name_set(cw->zoomobj, "cw->zoomobj::WINDOW");
3593 else if (!cw->ec->input_only)
3594 evas_object_name_set(cw->zoomobj, "cw->zoomobj::CLIENT");
3598 edje_object_part_unswallow(cw->shobj, cw->zoomobj);
3599 E_FREE_FUNC(cw->zoomobj, evas_object_del);
3600 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object);
3602 cw->zoomap_disabled = enabled;
3606 e_comp_object_mirror_visibility_check(Evas_Object *obj)
3608 API_ENTRY EINA_FALSE;
3609 return !!cw->force_visible;
3611 /////////////////////////////////////////////////////////
3614 _e_comp_object_util_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3617 Eina_Bool comp_object;
3619 comp_object = !!evas_object_data_get(obj, "comp_object");
3624 o = edje_object_part_swallow_get(obj, "e.swallow.content");
3626 e_comp_render_queue();
3628 l = evas_object_data_get(obj, "comp_object-to_del");
3629 E_FREE_LIST(l, evas_object_del);
3633 _e_comp_object_util_restack(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3635 if (e_comp_util_object_is_above_nocomp(obj) &&
3636 (!evas_object_data_get(obj, "comp_override")))
3638 evas_object_data_set(obj, "comp_override", (void*)1);
3639 e_comp_override_add();
3644 _e_comp_object_util_show(void *data EINA_UNUSED, Evas_Object *obj)
3646 Eina_Bool ref = EINA_TRUE;
3647 if (evas_object_visible_get(obj))
3651 d = evas_object_data_del(obj, "comp_hiding");
3653 /* currently trying to hide */
3656 /* already visible */
3660 evas_object_show(obj);
3663 evas_object_ref(obj);
3664 evas_object_data_set(obj, "comp_ref", (void*)1);
3666 edje_object_signal_emit(obj, "e,state,visible", "e");
3667 evas_object_data_set(obj, "comp_showing", (void*)1);
3668 if (e_comp_util_object_is_above_nocomp(obj))
3670 evas_object_data_set(obj, "comp_override", (void*)1);
3671 e_comp_override_add();
3676 _e_comp_object_util_hide(void *data EINA_UNUSED, Evas_Object *obj)
3678 if (!evas_object_visible_get(obj)) return;
3679 /* already hiding */
3680 if (evas_object_data_get(obj, "comp_hiding")) return;
3681 if (!evas_object_data_del(obj, "comp_showing"))
3683 evas_object_ref(obj);
3684 evas_object_data_set(obj, "comp_ref", (void*)1);
3686 edje_object_signal_emit(obj, "e,state,hidden", "e");
3687 evas_object_data_set(obj, "comp_hiding", (void*)1);
3689 if (evas_object_data_del(obj, "comp_override"))
3690 e_comp_override_timed_pop();
3694 _e_comp_object_util_done_defer(void *data, Evas_Object *obj, const char *emission, const char *source EINA_UNUSED)
3696 if (!e_util_strcmp(emission, "e,action,hide,done"))
3698 if (!evas_object_data_del(obj, "comp_hiding")) return;
3699 evas_object_intercept_hide_callback_del(obj, _e_comp_object_util_hide);
3700 evas_object_hide(obj);
3701 evas_object_intercept_hide_callback_add(obj, _e_comp_object_util_hide, data);
3704 evas_object_data_del(obj, "comp_showing");
3705 if (evas_object_data_del(obj, "comp_ref"))
3706 evas_object_unref(obj);
3710 _e_comp_object_util_moveresize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3716 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
3717 e_zoomap_child_resize(data, w, h);
3721 E_API E_Comp_Object_Hook *
3722 e_comp_object_hook_add(E_Comp_Object_Hook_Point hookpoint, E_Comp_Object_Hook_Cb func, const void *data)
3724 E_Comp_Object_Hook *ch;
3726 EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_COMP_OBJECT_HOOK_LAST, NULL);
3727 ch = E_NEW(E_Comp_Object_Hook, 1);
3728 if (!ch) return NULL;
3729 ch->hookpoint = hookpoint;
3731 ch->data = (void*)data;
3732 _e_comp_object_hooks[hookpoint] = eina_inlist_append(_e_comp_object_hooks[hookpoint], EINA_INLIST_GET(ch));
3737 e_comp_object_hook_del(E_Comp_Object_Hook *ch)
3740 if (_e_comp_object_hooks_walking == 0)
3742 _e_comp_object_hooks[ch->hookpoint] = eina_inlist_remove(_e_comp_object_hooks[ch->hookpoint], EINA_INLIST_GET(ch));
3746 _e_comp_object_hooks_delete++;
3749 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
3750 E_API E_Comp_Object_Intercept_Hook *
3751 e_comp_object_intercept_hook_add(E_Comp_Object_Intercept_Hook_Point hookpoint, E_Comp_Object_Intercept_Hook_Cb func, const void *data)
3753 E_Comp_Object_Intercept_Hook *ch;
3755 EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_COMP_OBJECT_INTERCEPT_HOOK_LAST, NULL);
3756 ch = E_NEW(E_Comp_Object_Intercept_Hook, 1);
3757 if (!ch) return NULL;
3758 ch->hookpoint = hookpoint;
3760 ch->data = (void*)data;
3761 _e_comp_object_intercept_hooks[hookpoint] = eina_inlist_append(_e_comp_object_intercept_hooks[hookpoint], EINA_INLIST_GET(ch));
3766 e_comp_object_intercept_hook_del(E_Comp_Object_Intercept_Hook *ch)
3769 if (_e_comp_object_intercept_hooks_walking == 0)
3771 _e_comp_object_intercept_hooks[ch->hookpoint] = eina_inlist_remove(_e_comp_object_intercept_hooks[ch->hookpoint], EINA_INLIST_GET(ch));
3775 _e_comp_object_intercept_hooks_delete++;
3780 e_comp_object_util_add(Evas_Object *obj, E_Comp_Object_Type type)
3782 Evas_Object *o, *z = NULL;
3784 Eina_List *l, *list = NULL;
3785 E_Comp_Config *conf = e_comp_config_get();
3786 Eina_Bool skip = EINA_FALSE, fast = EINA_FALSE, shadow = EINA_FALSE;
3793 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
3797 case E_COMP_OBJECT_TYPE_MENU:
3798 list = conf->match.menus;
3799 skip = conf->match.disable_menus;
3800 fast = conf->fast_menus;
3803 case E_COMP_OBJECT_TYPE_POPUP:
3804 list = conf->match.popups;
3805 skip = conf->match.disable_popups;
3806 fast = conf->fast_popups;
3809 list = conf->match.objects;
3810 skip = conf->match.disable_objects;
3811 fast = conf->fast_objects;
3813 name = evas_object_name_get(obj);
3814 vis = evas_object_visible_get(obj);
3815 o = edje_object_add(e_comp->evas);
3816 evas_object_data_set(o, "comp_object", (void*)1);
3817 if (name && (!skip))
3818 skip = (!strncmp(name, "noshadow", 8));
3820 evas_object_data_set(o, "comp_object_skip", (void*)1);
3823 EINA_LIST_FOREACH(list, l, m)
3825 if (((m->name) && (!name)) ||
3826 ((name) && (m->name) && (!e_util_glob_match(name, m->name))))
3828 if (!m->shadow_style) continue;
3831 snprintf(buf, sizeof(buf), "e/comp/frame/%s/fast", m->shadow_style);
3832 ok = e_theme_edje_object_set(o, "base/theme/comp", buf);
3836 snprintf(buf, sizeof(buf), "e/comp/frame/%s", m->shadow_style);
3837 ok = e_theme_edje_object_set(o, "base/theme/comp", buf);
3841 shadow = !m->no_shadow;
3851 ok = e_theme_edje_object_set(o, "base/theme/comp", "e/comp/frame/none");
3853 if (conf->shadow_style)
3857 snprintf(buf, sizeof(buf), "e/comp/frame/%s/fast", conf->shadow_style);
3858 ok = e_theme_edje_object_set(o, "base/theme/comp", buf);
3862 snprintf(buf, sizeof(buf), "e/comp/frame/%s", conf->shadow_style);
3863 ok = e_theme_edje_object_set(o, "base/theme/comp", buf);
3868 ok = e_theme_edje_object_set(o, "base/theme/comp", "e/comp/frame/default/fast");
3870 ok = e_theme_edje_object_set(o, "base/theme/comp", "e/comp/frame/default");
3873 if (shadow && (e_util_strcmp(evas_object_type_get(obj), "edje") || (!edje_object_data_get(obj, "noshadow"))))
3874 edje_object_signal_emit(o, "e,state,shadow,on", "e");
3876 edje_object_signal_emit(o, "e,state,shadow,off", "e");
3878 evas_object_geometry_get(obj, &x, &y, &w, &h);
3879 evas_object_geometry_set(o, x, y, w, h);
3880 evas_object_pass_events_set(o, evas_object_pass_events_get(obj));
3884 z = e_zoomap_add(e_comp->evas);
3885 e_zoomap_child_edje_solid_setup(z);
3886 e_zoomap_smooth_set(z, conf->smooth_windows);
3887 e_zoomap_child_set(z, obj);
3888 e_zoomap_child_resize(z, w, h);
3889 evas_object_show(z);
3891 edje_object_signal_callback_add(o, "e,action,*,done", "e", _e_comp_object_util_done_defer, z);
3893 evas_object_intercept_show_callback_add(o, _e_comp_object_util_show, z);
3894 evas_object_intercept_hide_callback_add(o, _e_comp_object_util_hide, z);
3895 evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _e_comp_object_util_moveresize, z);
3896 evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, _e_comp_object_util_del, z);
3897 evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE, _e_comp_object_util_moveresize, z);
3898 evas_object_event_callback_add(o, EVAS_CALLBACK_RESTACK, _e_comp_object_util_restack, z);
3900 e_comp_object_signal_emit(o, "e,state,hidden", "e");
3902 edje_object_part_swallow(o, "e.swallow.content", z ?: obj);
3904 _e_comp_object_event_add(o);
3907 evas_object_show(o);
3912 /* utility functions for deleting objects when their "owner" is deleted */
3914 e_comp_object_util_del_list_append(Evas_Object *obj, Evas_Object *to_del)
3919 EINA_SAFETY_ON_NULL_RETURN(to_del);
3920 l = evas_object_data_get(obj, "comp_object-to_del");
3921 evas_object_data_set(obj, "comp_object-to_del", eina_list_append(l, to_del));
3922 evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _e_comp_object_util_del);
3923 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_util_del, NULL);
3927 e_comp_object_util_del_list_remove(Evas_Object *obj, Evas_Object *to_del)
3932 EINA_SAFETY_ON_NULL_RETURN(to_del);
3933 l = evas_object_data_get(obj, "comp_object-to_del");
3935 evas_object_data_set(obj, "comp_object-to_del", eina_list_remove(l, to_del));
3938 /////////////////////////////////////////////////////////
3941 e_comp_object_client_add(E_Client *ec)
3946 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, NULL);
3947 if (ec->frame) return NULL;
3948 _e_comp_smart_init();
3949 o = evas_object_smart_add(e_comp->evas, _e_comp_smart);
3950 cw = evas_object_smart_data_get(o);
3951 if (!cw) return NULL;
3952 evas_object_data_set(o, "E_Client", ec);
3955 evas_object_data_set(o, "comp_object", (void*)1);
3957 _e_comp_object_event_add(o);
3962 /* utility functions for getting client inset */
3964 e_comp_object_frame_xy_adjust(Evas_Object *obj, int x, int y, int *ax, int *ay)
3967 if (!cw->client_inset.calc)
3973 if (ax) *ax = x - cw->client_inset.l;
3974 if (ay) *ay = y - cw->client_inset.t;
3978 e_comp_object_frame_xy_unadjust(Evas_Object *obj, int x, int y, int *ax, int *ay)
3981 if (!cw->client_inset.calc)
3987 if (ax) *ax = x + cw->client_inset.l;
3988 if (ay) *ay = y + cw->client_inset.t;
3992 e_comp_object_frame_wh_adjust(Evas_Object *obj, int w, int h, int *aw, int *ah)
3995 if (!cw->client_inset.calc)
4001 if (aw) *aw = w + cw->client_inset.l + cw->client_inset.r;
4002 if (ah) *ah = h + cw->client_inset.t + cw->client_inset.b;
4006 e_comp_object_frame_wh_unadjust(Evas_Object *obj, int w, int h, int *aw, int *ah)
4009 if (!cw->client_inset.calc)
4015 if (aw) *aw = w - cw->client_inset.l - cw->client_inset.r;
4016 if (ah) *ah = h - cw->client_inset.t - cw->client_inset.b;
4020 e_comp_object_client_get(Evas_Object *obj)
4025 /* FIXME: remove this when eo is used */
4026 o = evas_object_data_get(obj, "comp_smart_obj");
4028 return e_comp_object_client_get(o);
4029 return cw ? cw->ec : NULL;
4033 e_comp_object_frame_extends_get(Evas_Object *obj, int *x, int *y, int *w, int *h)
4036 if (cw->frame_extends)
4037 edje_object_parts_extends_calc(cw->frame_object, x, y, w, h);
4042 if (w) *w = cw->ec->w;
4043 if (h) *h = cw->ec->h;
4048 e_comp_object_util_zone_get(Evas_Object *obj)
4050 E_Zone *zone = NULL;
4054 zone = cw->ec->zone;
4059 if (e_win_client_get(obj))
4060 return e_win_client_get(obj)->zone;
4061 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
4062 zone = e_comp_zone_xy_get(x, y);
4068 e_comp_object_util_center(Evas_Object *obj)
4070 int x, y, w, h, ow, oh;
4075 zone = e_comp_object_util_zone_get(obj);
4076 EINA_SAFETY_ON_NULL_RETURN(zone);
4077 e_zone_useful_geometry_get(zone, &x, &y, &w, &h);
4078 if (cw && (cw->ec->changes.size || cw->ec->new_client))
4079 ow = cw->ec->w, oh = cw->ec->h;
4081 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
4082 x = x + (w - ow) / 2;
4083 y = y + (h - oh) / 2;
4084 evas_object_move(obj, x, y);
4088 e_comp_object_util_center_on(Evas_Object *obj, Evas_Object *on)
4090 int x, y, w, h, ow, oh;
4093 EINA_SAFETY_ON_NULL_RETURN(on);
4094 evas_object_geometry_get(on, &x, &y, &w, &h);
4095 if (cw && (cw->ec->changes.size || cw->ec->new_client))
4096 ow = cw->ec->w, oh = cw->ec->h;
4098 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
4099 evas_object_move(obj, x + (w / 2) - (ow / 2), y + (h / 2) - (oh / 2));
4103 e_comp_object_util_fullscreen(Evas_Object *obj)
4108 e_client_fullscreen(cw->ec, E_FULLSCREEN_RESIZE);
4111 evas_object_move(obj, 0, 0);
4112 evas_object_resize(obj, e_comp->w, e_comp->h);
4117 e_comp_object_util_center_pos_get(Evas_Object *obj, int *x, int *y)
4125 ow = cw->w, oh = cw->h;
4127 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
4128 zone = e_comp_object_util_zone_get(obj);
4129 e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh);
4130 if (x) *x = zx + (zw - ow) / 2;
4131 if (y) *y = zy + (zh - oh) / 2;
4135 e_comp_object_input_objs_del(Evas_Object *obj)
4138 E_Input_Rect_Data *input_rect_data;
4139 E_Input_Rect_Smart_Data *input_rect_sd;
4144 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4145 if (!input_rect_sd) return;
4147 EINA_LIST_FREE(input_rect_sd->input_rect_data_list, input_rect_data)
4149 if (input_rect_data->obj)
4151 evas_object_smart_member_del(input_rect_data->obj);
4152 E_FREE_FUNC(input_rect_data->obj, evas_object_del);
4154 E_FREE(input_rect_data);
4159 e_comp_object_input_area_set(Evas_Object *obj, int x, int y, int w, int h)
4162 E_Input_Rect_Data *input_rect_data = NULL;
4163 E_Input_Rect_Smart_Data *input_rect_sd;
4164 int client_w, client_h;
4166 if (cw->ec->client.w)
4167 client_w = cw->ec->client.w;
4169 client_w = cw->ec->w;
4171 if (cw->ec->client.h)
4172 client_h = cw->ec->client.h;
4174 client_h = cw->ec->h;
4176 E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, client_w, client_h);
4180 _e_comp_input_obj_smart_init();
4181 cw->input_obj = evas_object_smart_add(e_comp->evas, _e_comp_input_obj_smart);
4182 evas_object_smart_member_add(cw->input_obj, cw->smart_obj);
4183 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4186 input_rect_sd->cw = cw;
4189 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4192 input_rect_data = E_NEW(E_Input_Rect_Data, 1);
4193 if (input_rect_data)
4195 EINA_RECTANGLE_SET(&input_rect_data->rect, x, y, w, h);
4196 input_rect_sd->input_rect_data_list = eina_list_append(input_rect_sd->input_rect_data_list, input_rect_data);
4200 if ((input_rect_data) &&
4201 (x || y || (w != cw->ec->client.w) || (h != cw->ec->client.h)))
4203 input_rect_data->obj = evas_object_rectangle_add(e_comp->evas);
4204 evas_object_name_set(input_rect_data->obj, "cw->input_obj");
4205 evas_object_color_set(input_rect_data->obj, 0, 0, 0, 0);
4206 evas_object_clip_set(input_rect_data->obj, cw->clip);
4207 evas_object_smart_member_add(input_rect_data->obj, cw->input_obj);
4208 evas_object_geometry_set(input_rect_data->obj,
4209 MAX(cw->ec->client.x + (!!cw->frame_object * cw->client_inset.l), 0) + x,
4210 MAX(cw->ec->client.y + (!!cw->frame_object * cw->client_inset.t), 0) + y, w, h);
4211 evas_object_pass_events_set(cw->default_input_obj, 1);
4212 evas_object_pass_events_set(cw->obj, 1);
4215 evas_object_show(input_rect_data->obj);
4216 evas_object_show(cw->input_obj);
4221 evas_object_smart_member_del(cw->input_obj);
4222 E_FREE_FUNC(cw->input_obj, evas_object_del);
4223 evas_object_pass_events_set(cw->default_input_obj, 0);
4224 evas_object_pass_events_set(cw->obj, 0);
4229 e_comp_object_input_rect_get(Evas_Object *obj, Eina_List **list)
4232 E_Input_Rect_Smart_Data *input_rect_sd;
4233 E_Input_Rect_Data *input_rect_data;
4236 if (!cw->input_obj) return;
4238 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4241 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
4243 *list = eina_list_append(*list, &input_rect_data->rect);
4249 e_comp_object_frame_geometry_get(Evas_Object *obj, int *l, int *r, int *t, int *b)
4252 if (l) *l = cw->client_inset.l;
4253 if (r) *r = cw->client_inset.r;
4254 if (t) *t = cw->client_inset.t;
4255 if (b) *b = cw->client_inset.b;
4258 /* set geometry for CSD */
4260 e_comp_object_frame_geometry_set(Evas_Object *obj, int l, int r, int t, int b)
4266 if (cw->frame_object)
4267 CRI("ACK! ec:%p", cw->ec);
4268 if ((cw->client_inset.l == l) && (cw->client_inset.r == r) &&
4269 (cw->client_inset.t == t) && (cw->client_inset.b == b)) return;
4270 calc = cw->client_inset.calc;
4271 cw->client_inset.calc = l || r || t || b;
4272 eina_stringshare_replace(&cw->frame_theme, "borderless");
4273 if (cw->client_inset.calc)
4275 tw = cw->ec->w + ((l + r) - (cw->client_inset.l + cw->client_inset.r));
4276 th = cw->ec->h + ((t + b) - (cw->client_inset.t + cw->client_inset.b));
4277 e_client_size_set(cw->ec, tw, th);
4279 else if (cw->ec->maximized || cw->ec->fullscreen)
4281 cw->ec->saved.w -= ((l + r) - (cw->client_inset.l + cw->client_inset.r));
4282 cw->ec->saved.h -= ((t + b) - (cw->client_inset.t + cw->client_inset.b));
4284 if (!cw->ec->new_client)
4286 if (calc && cw->client_inset.calc)
4288 tx = cw->ec->x - (l - cw->client_inset.l);
4289 ty = cw->ec->y - (t - cw->client_inset.t);
4290 e_client_pos_set(cw->ec, tx, ty);
4292 cw->ec->changes.pos = cw->ec->changes.size = 1;
4295 cw->client_inset.l = l;
4296 cw->client_inset.r = r;
4297 cw->client_inset.t = t;
4298 cw->client_inset.b = b;
4302 e_comp_object_frame_allowed(Evas_Object *obj)
4304 API_ENTRY EINA_FALSE;
4305 return (!cw->ec->mwm.borderless) && (cw->frame_object || (!cw->client_inset.calc));
4309 e_comp_object_frame_title_set(Evas_Object *obj, const char *name)
4311 API_ENTRY EINA_FALSE;
4312 if (!e_util_strcmp(cw->frame_name, name)) return EINA_FALSE;
4313 eina_stringshare_replace(&cw->frame_name, name);
4314 if (cw->frame_object)
4315 edje_object_part_text_set(cw->frame_object, "e.text.title", cw->frame_name);
4320 e_comp_object_frame_exists(Evas_Object *obj)
4322 API_ENTRY EINA_FALSE;
4323 return !!cw->frame_object;
4327 e_comp_object_frame_theme_set(Evas_Object *obj, const char *name)
4329 Evas_Object *o, *pbg;
4332 Eina_Stringshare *theme;
4334 API_ENTRY EINA_FALSE;
4336 if (!e_util_strcmp(cw->frame_theme, name))
4337 return edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object ?: cw->obj);
4338 if (!e_util_strcmp(name, "COMP_RESHADOW"))
4339 return _e_comp_object_shadow_setup(cw);
4340 pbg = cw->frame_object;
4341 theme = eina_stringshare_add(name);
4343 if (cw->frame_object)
4347 w = cw->ec->w, h = cw->ec->h;
4348 e_comp_object_frame_wh_unadjust(obj, w, h, &cw->ec->w, &cw->ec->h);
4349 if ((cw->ec->w != w) || (cw->ec->h != h))
4351 cw->ec->changes.size = 1;
4354 E_FREE_FUNC(cw->frame_object, evas_object_del);
4355 if (!name) goto reshadow;
4357 o = edje_object_add(e_comp->evas);
4358 snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", name);
4359 ok = e_theme_edje_object_set(o, "base/theme/border", buf);
4360 if ((!ok) && (!e_util_strcmp(name, "borderless")))
4362 cw->frame_object = NULL;
4364 eina_stringshare_del(cw->frame_theme);
4365 cw->frame_theme = theme;
4370 if (theme != e_config->theme_default_border_style)
4372 snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", e_config->theme_default_border_style);
4373 ok = e_theme_edje_object_set(o, "base/theme/border", buf);
4377 ok = e_theme_edje_object_set(o, "base/theme/border",
4378 "e/widgets/border/default/border");
4379 if (ok && (theme == e_config->theme_default_border_style))
4381 /* Reset default border style to default */
4382 eina_stringshare_replace(&e_config->theme_default_border_style, "default");
4383 e_config_save_queue();
4390 cw->frame_object = o;
4391 eina_stringshare_del(cw->frame_theme);
4392 cw->frame_theme = theme;
4393 evas_object_name_set(o, "cw->frame_object");
4396 edje_object_part_text_set(o, "e.text.title", cw->frame_name);
4400 cw->ec->changes.icon = 1;
4406 CRI("USER IS USING A SHITTY THEME! ABORT!!!!");
4411 _e_comp_object_shadow_setup(cw);
4414 int old_x, old_y, new_x = 0, new_y = 0;
4416 old_x = cw->x, old_y = cw->y;
4418 _e_comp_smart_cb_frame_recalc(cw, cw->smart_obj, NULL);
4420 new_x = cw->ec->x, new_y = cw->ec->y;
4421 else if (cw->ec->placed || (!cw->ec->new_client))
4423 /* if no previous frame:
4424 * - reapply client_inset
4429 if (cw->ec->changes.size)
4436 x = cw->ec->client.x, y = cw->ec->client.y;
4437 x = MAX(cw->ec->zone->x, cw->ec->client.x - cw->client_inset.l);
4438 y = MAX(cw->ec->zone->y, cw->ec->client.y - cw->client_inset.t);
4440 new_x = x, new_y = y;
4443 if (old_x != new_x || old_y != new_y)
4445 /* this guarantees that we won't get blocked by the NOP check in the interceptor */
4446 cw->y = cw->x = -99999;
4447 evas_object_move(obj, new_x, new_y);
4451 if (cw->ec->maximized)
4453 cw->ec->changes.need_maximize = 1;
4456 evas_object_smart_callback_call(cw->smart_obj, "frame_changed", NULL);
4457 if (cw->frame_object)
4459 cw->frame_extends = !!edje_object_data_get(cw->frame_object, "frame_extends");
4462 cw->frame_extends = 0;
4463 evas_object_del(pbg);
4468 e_comp_object_signal_emit(Evas_Object *obj, const char *sig, const char *src)
4470 E_Comp_Object_Mover *prov;
4473 //INF("EMIT %p: %s %s", cw->ec, sig, src);
4474 edje_object_signal_emit(cw->shobj, sig, src);
4475 if (cw->frame_object) edje_object_signal_emit(cw->frame_object, sig, src);
4476 if ((cw->ec->override && e_comp_config_get()->match.disable_overrides) ||
4477 ((!cw->ec->override) && e_comp_config_get()->match.disable_borders))
4479 /* start with highest priority callback first */
4480 EINA_INLIST_REVERSE_FOREACH(_e_comp_object_movers, prov)
4482 if (!e_util_glob_match(sig, prov->sig)) continue;
4483 if (prov->func(prov->data, obj, sig)) break;
4488 e_comp_object_signal_callback_add(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb, const void *data)
4490 /* FIXME: at some point I guess this should use eo to inherit
4491 * -EDJE_OBJ_SUB_ID_SIGNAL_CALLBACK_ADD
4492 * -EDJE_OBJ_SUB_ID_SIGNAL_CALLBACK_DEL
4495 edje_object_signal_callback_add(cw->shobj, sig, src, cb, (void*)data);
4499 e_comp_object_signal_callback_del(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb)
4502 edje_object_signal_callback_del(cw->shobj, sig, src, cb);
4506 e_comp_object_signal_callback_del_full(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb, const void *data)
4509 edje_object_signal_callback_del_full(cw->shobj, sig, src, cb, (void*)data);
4513 e_comp_object_damage(Evas_Object *obj, int x, int y, int w, int h)
4516 Eina_Rectangle rect;
4519 if (cw->ec->input_only || (!cw->updates)) return;
4520 if (cw->nocomp) return;
4521 rect.x = x, rect.y = y;
4522 rect.w = w, rect.h = h;
4523 evas_object_smart_callback_call(obj, "damage", &rect);
4525 if (e_comp_is_on_overlay(cw->ec))
4527 /* It will not set hwc_need_update value if E modules already cleanup pixmap
4528 * resource on the E_COMP_WL_HOOK_BUFFER_CHANGE hook function. It means that
4529 * E module attempts to block screen update due to the particular policy.
4531 if (e_pixmap_resource_get(cw->ec->pixmap))
4532 cw->hwc_need_update = EINA_TRUE;
4535 /* ignore overdraw */
4536 if (cw->updates_full)
4538 RENDER_DEBUG("IGNORED %p: %d,%d %dx%d", cw->ec, x, y, w, h);
4539 e_comp_object_render_update_add(obj);
4541 if ((cw->ec->visible) && (!evas_object_visible_get(cw->smart_obj)) && (!cw->ec->iconic))
4542 evas_object_show(cw->smart_obj);
4546 /* clip rect to client surface */
4547 RENDER_DEBUG("DAMAGE(%d,%d %dx%d) CLIP(%dx%d)", x, y, w, h, cw->ec->client.w, cw->ec->client.h);
4548 E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, cw->ec->client.w, cw->ec->client.h);
4549 /* if rect is the total size of the client after clip, clear the updates
4550 * since this is guaranteed to be the whole region anyway
4552 eina_tiler_area_size_get(cw->updates, &tw, &th);
4553 if ((w > tw) || (h > th))
4555 RENDER_DEBUG("DAMAGE RESIZE %p: %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
4556 eina_tiler_clear(cw->updates);
4557 eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
4559 tw = cw->ec->client.w, th = cw->ec->client.h;
4561 if ((!x) && (!y) && (w == tw) && (h == th))
4563 eina_tiler_clear(cw->updates);
4564 RENDER_DEBUG("DAMAGE FULL: %p", cw->ec);
4565 cw->updates_full = 1;
4566 cw->update_count = 0;
4569 if (cw->update_count > UPDATE_MAX)
4571 /* this is going to get really dumb, so just update the whole thing */
4572 eina_tiler_clear(cw->updates);
4573 cw->update_count = cw->updates_full = 1;
4574 eina_tiler_rect_add(cw->updates, &(Eina_Rectangle){0, 0, tw, th});
4575 RENDER_DEBUG("DAMAGE MAX: %dx%d", tw, th);
4579 eina_tiler_rect_add(cw->updates, &(Eina_Rectangle){x, y, w, h});
4580 RENDER_DEBUG("DAMAGE: %d,%d %dx%d", x, y, w, h);
4582 cw->updates_exist = 1;
4583 e_comp_object_render_update_add(obj);
4585 if ((cw->ec->visible) && (!evas_object_visible_get(cw->smart_obj)) && (!cw->ec->iconic))
4586 evas_object_show(cw->smart_obj);
4590 e_comp_object_damage_exists(Evas_Object *obj)
4592 API_ENTRY EINA_FALSE;
4593 return cw->updates_exist;
4597 e_comp_object_render_update_add(Evas_Object *obj)
4601 if (cw->ec->input_only || (!cw->updates) || (!cw->redirected)) return;
4602 if (cw->render_update_lock.lock) return;
4603 if (e_object_is_del(E_OBJECT(cw->ec)))
4604 CRI("CAN'T RENDER A DELETED CLIENT!!! ec:%p", cw->ec);
4605 if (!e_pixmap_usable_get(cw->ec->pixmap)) return;
4609 e_comp->updates = eina_list_append(e_comp->updates, cw->ec);
4611 e_comp_render_queue();
4615 e_comp_object_render_update_del(Evas_Object *obj)
4619 if (cw->ec->input_only || (!cw->updates)) return;
4620 if (!cw->update) return;
4622 /* this gets called during comp animating to clear the update flag */
4623 if (e_comp->grabbed) return;
4624 e_comp->updates = eina_list_remove(e_comp->updates, cw->ec);
4625 if (!e_comp->updates)
4627 E_FREE_FUNC(e_comp->update_job, ecore_job_del);
4628 if (e_comp->render_animator)
4629 ecore_animator_freeze(e_comp->render_animator);
4634 e_comp_object_shape_apply(Evas_Object *obj)
4638 unsigned int i, *pix, *p;
4642 if (!cw->ec) return; //NYI
4643 if (cw->external_content) return;
4646 if ((cw->ec->shape_rects_num >= 1) &&
4647 (!_e_comp_shaped_check(cw->ec->client.w, cw->ec->client.h, cw->ec->shape_rects, cw->ec->shape_rects_num)))
4652 ERR("BUGGER: shape with native surface? cw=%p", cw);
4655 evas_object_image_size_get(cw->obj, &w, &h);
4656 if ((w < 1) || (h < 1)) return;
4659 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4660 _e_comp_object_alpha_set(cw);
4661 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4662 evas_object_image_alpha_set(o, 1);
4664 p = pix = evas_object_image_data_get(cw->obj, 1);
4667 evas_object_image_data_set(cw->obj, pix);
4672 unsigned char *spix, *sp;
4674 spix = calloc(w * h, sizeof(unsigned char));
4676 for (i = 0; i < cw->ec->shape_rects_num; i++)
4680 rx = cw->ec->shape_rects[i].x; ry = cw->ec->shape_rects[i].y;
4681 rw = cw->ec->shape_rects[i].w; rh = cw->ec->shape_rects[i].h;
4682 E_RECTS_CLIP_TO_RECT(rx, ry, rw, rh, 0, 0, w, h);
4683 sp = spix + (w * ry) + rx;
4684 for (py = 0; py < rh; py++)
4686 for (px = 0; px < rw; px++)
4694 for (py = 0; py < h; py++)
4696 for (px = 0; px < w; px++)
4698 unsigned int mask, imask;
4700 mask = ((unsigned int)(*sp)) << 24;
4702 imask |= imask >> 8;
4703 imask |= imask >> 8;
4704 *p = mask | (*p & imask);
4705 //if (*sp) *p = 0xff000000 | *p;
4706 //else *p = 0x00000000;
4715 for (py = 0; py < h; py++)
4717 for (px = 0; px < w; px++)
4721 evas_object_image_data_set(cw->obj, pix);
4722 evas_object_image_data_update_add(cw->obj, 0, 0, w, h);
4723 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4725 evas_object_image_data_set(o, pix);
4726 evas_object_image_data_update_add(o, 0, 0, w, h);
4728 // don't need to fix alpha chanel as blending
4729 // should be totally off here regardless of
4730 // alpha channel content
4734 _e_comp_object_clear(E_Comp_Object *cw)
4739 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
4741 if (cw->render_update_lock.lock) return;
4744 e_pixmap_clear(cw->ec->pixmap);
4746 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4747 evas_object_image_size_set(cw->obj, 1, 1);
4748 evas_object_image_data_set(cw->obj, NULL);
4749 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4751 evas_object_image_size_set(o, 1, 1);
4752 evas_object_image_data_set(o, NULL);
4755 e_comp_object_render_update_del(cw->smart_obj);
4758 /* helper function to simplify toggling of redirection for display servers which support it */
4760 e_comp_object_redirected_set(Evas_Object *obj, Eina_Bool set)
4765 if (cw->redirected == set) return;
4766 cw->redirected = set;
4767 if (cw->external_content) return;
4769 e_comp_object_map_update(obj);
4773 if (cw->updates_exist)
4774 e_comp_object_render_update_add(obj);
4776 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4777 evas_object_smart_callback_call(obj, "redirected", NULL);
4781 _e_comp_object_clear(cw);
4782 evas_object_smart_callback_call(obj, "unredirected", NULL);
4787 _e_comp_object_cb_buffer_destroy(struct wl_listener *listener, void *data EINA_UNUSED)
4790 cw = container_of(listener, E_Comp_Object, buffer_destroy_listener);
4792 if (cw->buffer_destroy_listener.notify)
4794 cw->buffer_destroy_listener.notify = NULL;
4795 wl_list_remove(&cw->buffer_destroy_listener.link);
4798 if (e_object_is_del(E_OBJECT(cw->ec)))
4800 if (!e_object_delay_del_ref_get(E_OBJECT(cw->ec)))
4805 /* if it's current displaying buffer, do not remove its content */
4806 if (!evas_object_visible_get(cw->ec->frame))
4807 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4812 _e_comp_object_native_surface_set(E_Comp_Object *cw, Evas_Native_Surface *ns, Eina_Bool with_mirror)
4817 if (cw->buffer_destroy_listener.notify)
4819 wl_list_remove(&cw->buffer_destroy_listener.link);
4820 cw->buffer_destroy_listener.notify = NULL;
4823 if (cw->tbm_surface)
4825 tbm_surface_internal_unref(cw->tbm_surface);
4826 cw->tbm_surface = NULL;
4831 if ((ns->type == EVAS_NATIVE_SURFACE_WL) && (ns->data.wl.legacy_buffer))
4833 cw->buffer_destroy_listener.notify = _e_comp_object_cb_buffer_destroy;
4834 wl_resource_add_destroy_listener((struct wl_resource *)ns->data.wl.legacy_buffer, &cw->buffer_destroy_listener);
4836 else if ((ns->type == EVAS_NATIVE_SURFACE_TBM) && (ns->data.tbm.buffer))
4838 tbm_surface_internal_ref(ns->data.tbm.buffer);
4839 cw->tbm_surface = ns->data.tbm.buffer;
4843 evas_object_image_native_surface_set(cw->obj, ns);
4846 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4848 evas_object_image_alpha_set(o, !!cw->ns ? 1 : cw->ec->argb);
4849 evas_object_image_native_surface_set(o, ns);
4855 e_comp_object_native_surface_set(Evas_Object *obj, Eina_Bool set)
4857 Evas_Native_Surface ns;
4860 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
4861 if (cw->ec->input_only) return;
4862 if (cw->external_content) return;
4863 if (cw->render_update_lock.lock) return;
4866 memset(&ns, 0, sizeof(Evas_Native_Surface));
4870 /* native requires gl enabled, texture from pixmap enabled, and a non-shaped client */
4871 set = (!cw->ec->shaped);
4873 set = (!!cw->ns) || e_pixmap_native_surface_init(cw->ec->pixmap, &ns);
4877 _e_comp_object_native_surface_set(cw, set && (!cw->blanked) ? (cw->ns ? cw->ns : &ns) : NULL, EINA_TRUE);
4881 e_comp_object_native_surface_override(Evas_Object *obj, Evas_Native_Surface *ns)
4884 if (cw->ec->input_only) return;
4887 cw->ns = (Evas_Native_Surface*)eina_memdup((unsigned char*)ns, sizeof(Evas_Native_Surface), 0);
4888 _e_comp_object_alpha_set(cw);
4890 e_comp_object_native_surface_set(obj, cw->native);
4891 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4895 e_comp_object_blank(Evas_Object *obj, Eina_Bool set)
4901 if (cw->blanked == set) return;
4903 _e_comp_object_alpha_set(cw);
4906 _e_comp_object_native_surface_set(cw, NULL, EINA_FALSE);
4907 evas_object_image_data_set(cw->obj, NULL);
4911 e_comp_object_native_surface_set(obj, 1);
4912 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4916 _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)
4921 if (!_damage_trace) return;
4925 if (!evas_object_visible_get(cw->obj)) return;
4927 evas_object_geometry_get(cw->obj, &obj_x, &obj_y, NULL, NULL);
4929 o = evas_object_rectangle_add(e_comp->evas);
4930 evas_object_layer_set(o, E_LAYER_MAX);
4931 evas_object_name_set(o, "damage_trace");
4932 evas_object_move(o, dmg_x + obj_x, dmg_y + obj_y);
4933 evas_object_resize(o, dmg_w, dmg_h);
4934 evas_object_color_set(o, 0, 128, 0, 128);
4935 evas_object_render_op_set(o, EVAS_RENDER_BLEND);
4936 evas_object_pass_events_set(o, EINA_TRUE);
4937 evas_object_show(o);
4939 ELOGF("COMP", "add damage(%dx%d+%d+%d) origin(%dx%d+%d+%d)",
4941 dmg_w, dmg_h, dmg_x, dmg_y,
4942 origin->w, origin->h, origin->x, origin->y);
4944 _damage_trace_objs = eina_list_append(_damage_trace_objs, o);
4947 /* mark an object as dirty and setup damages */
4949 e_comp_object_dirty(Evas_Object *obj)
4952 Eina_Rectangle *rect;
4956 Eina_Bool dirty, visible;
4960 if (cw->external_content) return;
4961 if (!cw->redirected) return;
4962 if (cw->render_update_lock.lock)
4964 ELOGF("COMP", "Render update locked:%d", cw->ec, cw->render_update_lock.lock);
4967 /* only actually dirty if pixmap is available */
4968 if (!e_pixmap_resource_get(cw->ec->pixmap))
4970 // e_pixmap_size_get returns last attached buffer size
4971 // eventhough it is destroyed
4972 ERR("ERROR NO PIXMAP FOR ec:%p", cw->ec);
4975 dirty = e_pixmap_size_get(cw->ec->pixmap, &w, &h);
4976 visible = cw->visible;
4977 if (!dirty) w = h = 1;
4978 evas_object_image_pixels_dirty_set(cw->obj, cw->blanked ? 0 : dirty);
4980 evas_object_image_data_set(cw->obj, NULL);
4981 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
4982 evas_object_image_size_set(cw->obj, tw, th);
4983 if (cw->mask.obj) evas_object_resize(cw->mask.obj, w, h);
4984 if (cw->pending_updates)
4985 eina_tiler_area_size_set(cw->pending_updates, w, h);
4986 EINA_LIST_FOREACH(cw->obj_mirror, ll, o)
4988 evas_object_image_pixels_dirty_set(o, dirty);
4990 evas_object_image_data_set(o, NULL);
4991 evas_object_image_size_set(o, tw, th);
4992 visible |= evas_object_visible_get(o);
4996 ERR("ERROR FETCHING PIXMAP FOR %p", cw->ec);
5000 e_comp_object_native_surface_set(obj, 1);
5002 m = _e_comp_object_map_damage_transform_get(cw->ec);
5003 it = eina_tiler_iterator_new(cw->updates);
5004 EINA_ITERATOR_FOREACH(it, rect)
5006 /* evas converts damage according to rotation of ecore_evas in damage_region_set
5007 * of evas engine and doesn't convert damage according to evas_map.
5008 * so damage of evas_object_image use surface coordinate.
5012 int damage_x, damage_y, damage_w, damage_h;
5014 _e_comp_object_map_damage_transform_rect(cw->ec, m, rect->x, rect->y, rect->w, rect->h,
5015 &damage_x, &damage_y, &damage_w, &damage_h);
5016 evas_object_image_data_update_add(cw->obj, damage_x, damage_y, damage_w, damage_h);
5017 _e_comp_object_damage_trace_rect_set(obj, rect, damage_x, damage_y, damage_w, damage_h);
5021 evas_object_image_data_update_add(cw->obj, rect->x, rect->y, rect->w, rect->h);
5022 _e_comp_object_damage_trace_rect_set(obj, rect, rect->x, rect->y, rect->w, rect->h);
5025 EINA_LIST_FOREACH(cw->obj_mirror, ll, o)
5026 evas_object_image_data_update_add(o, rect->x, rect->y, rect->w, rect->h);
5027 if (cw->pending_updates)
5028 eina_tiler_rect_add(cw->pending_updates, rect);
5030 eina_iterator_free(it);
5031 if (m) e_map_free(m);
5032 if (cw->pending_updates)
5033 eina_tiler_clear(cw->updates);
5036 cw->pending_updates = cw->updates;
5037 cw->updates = eina_tiler_new(w, h);
5038 eina_tiler_tile_size_set(cw->updates, 1, 1);
5040 cw->update_count = cw->updates_full = cw->updates_exist = 0;
5041 evas_object_smart_callback_call(obj, "dirty", NULL);
5042 if (cw->visible || (!visible) || (!cw->pending_updates) || cw->native) return;
5043 /* force render if main object is hidden but mirrors are visible */
5044 RENDER_DEBUG("FORCING RENDER %p", cw->ec);
5045 e_comp_object_render(obj);
5049 e_comp_object_render(Evas_Object *obj)
5056 API_ENTRY EINA_FALSE;
5058 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5059 if (cw->ec->input_only) return EINA_TRUE;
5060 if (cw->external_content) return EINA_TRUE;
5061 if (cw->native) return EINA_FALSE;
5062 /* if comp object is not redirected state, comp object should not be set by newly committed data
5063 because image size of comp object is 1x1 and it should not be shown on canvas */
5064 if (!cw->redirected) return EINA_TRUE;
5065 if (cw->render_update_lock.lock)
5067 ELOGF("COMP", "Render update locked:%d", cw->ec, cw->render_update_lock.lock);
5070 e_comp_object_render_update_del(obj);
5071 if (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph)) return EINA_FALSE;
5073 if (!cw->pending_updates)
5075 WRN("RENDER [%p]: NO RECTS!", cw->ec);
5076 evas_object_image_data_set(cw->obj, NULL);
5077 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
5078 evas_object_image_data_set(o, NULL);
5082 evas_object_image_pixels_dirty_set(cw->obj, EINA_FALSE);
5084 RENDER_DEBUG("RENDER SIZE: %dx%d", pw, ph);
5086 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5089 e_pixmap_image_refresh(cw->ec->pixmap);
5090 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5093 if ((pix) && ((!cw->blanked) || (cw->obj_mirror)))
5094 e_pixmap_image_data_ref(cw->ec->pixmap);
5096 /* set pixel data */
5097 evas_object_image_data_set(cw->obj, cw->blanked ? NULL : pix);
5098 _e_comp_object_alpha_set(cw);
5099 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
5101 evas_object_image_data_set(o, pix);
5102 evas_object_image_alpha_set(o, evas_object_image_alpha_get(cw->obj));
5103 evas_object_image_pixels_dirty_set(o, EINA_FALSE);
5106 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
5108 e_comp_client_post_update_add(cw->ec);
5113 /* create a duplicate of an evas object */
5115 e_comp_object_util_mirror_add(Evas_Object *obj)
5119 unsigned int *pix = NULL;
5120 Eina_Bool argb = EINA_FALSE;
5125 cw = evas_object_data_get(obj, "comp_mirror");
5128 o = evas_object_image_filled_add(evas_object_evas_get(obj));
5129 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
5130 evas_object_image_smooth_scale_set(o, e_comp_config_get()->smooth_windows);
5131 evas_object_image_alpha_set(o, 1);
5132 evas_object_image_source_set(o, obj);
5135 if ((!cw->ec) || (!e_pixmap_size_get(cw->ec->pixmap, &w, &h))) return NULL;
5136 if (cw->external_content)
5138 ERR("%p of client %p is external content.", obj, cw->ec);
5141 o = evas_object_image_filled_add(evas_object_evas_get(obj));
5142 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
5143 evas_object_image_smooth_scale_set(o, e_comp_config_get()->smooth_windows);
5144 cw->obj_mirror = eina_list_append(cw->obj_mirror, o);
5145 evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, _e_comp_object_cb_mirror_del, cw);
5146 evas_object_event_callback_add(o, EVAS_CALLBACK_SHOW, _e_comp_object_cb_mirror_show, cw);
5147 evas_object_event_callback_add(o, EVAS_CALLBACK_HIDE, _e_comp_object_cb_mirror_hide, cw);
5148 evas_object_data_set(o, "E_Client_Mirror", cw->ec);
5149 evas_object_data_set(o, "comp_mirror", cw);
5151 evas_object_image_alpha_set(o, evas_object_image_alpha_get(cw->obj));
5152 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
5154 evas_object_image_size_set(o, tw, th);
5157 pix = evas_object_image_data_get(cw->obj, 0);
5163 evas_object_image_native_surface_set(o, cw->ns);
5166 Evas_Native_Surface ns;
5167 memset(&ns, 0, sizeof(Evas_Native_Surface));
5168 if (e_pixmap_native_surface_init(cw->ec->pixmap, &ns))
5169 evas_object_image_native_surface_set(o, &ns);
5174 /* FIXME: legacy code, please refer to commit 5e6831187a1 */
5175 argb = e_pixmap_image_is_argb(cw->ec->pixmap);
5177 (e_pixmap_image_exists(cw->ec->pixmap)))
5178 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5180 pix = evas_object_image_data_get(cw->obj, EINA_FALSE);
5187 dirty = evas_object_image_pixels_dirty_get(cw->obj);
5188 evas_object_image_pixels_dirty_set(o, dirty);
5189 evas_object_image_data_set(o, pix);
5190 evas_object_image_data_set(cw->obj, pix);
5192 evas_object_image_data_update_add(o, 0, 0, tw, th);
5197 //////////////////////////////////////////////////////
5200 e_comp_object_effect_allowed_get(Evas_Object *obj)
5202 API_ENTRY EINA_FALSE;
5204 if (!cw->shobj) return EINA_FALSE;
5205 if (cw->ec->override) return !e_comp_config_get()->match.disable_overrides;
5206 return !e_comp_config_get()->match.disable_borders;
5209 /* setup an api effect for a client */
5211 e_comp_object_effect_set(Evas_Object *obj, const char *effect)
5214 Eina_Stringshare *grp;
5215 E_Comp_Config *config;
5216 Eina_Bool loaded = EINA_FALSE;
5218 API_ENTRY EINA_FALSE;
5219 if (!cw->shobj) return EINA_FALSE; //input window
5221 if (!effect) effect = "none";
5222 snprintf(buf, sizeof(buf), "e/comp/effects/%s", effect);
5224 config = e_comp_config_get();
5225 if ((config) && (config->effect_file))
5227 if (edje_object_file_set(cw->effect_obj, config->effect_file, buf))
5229 cw->effect_set = EINA_TRUE;
5236 edje_object_file_get(cw->effect_obj, NULL, &grp);
5237 cw->effect_set = !eina_streq(effect, "none");
5238 if (!e_util_strcmp(buf, grp)) return cw->effect_set;
5239 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", buf))
5241 snprintf(buf, sizeof(buf), "e/comp/effects/auto/%s", effect);
5242 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", buf))
5243 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", "e/comp/effects/none"))
5245 if (cw->effect_running)
5247 if (!e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb")))
5250 cw->effect_set = EINA_FALSE;
5251 return cw->effect_set;
5255 if (cw->effect_running)
5257 if (!e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb")))
5260 ELOGF("COMP", "EFFECT Set GROUP[%s]", cw->ec, buf);
5261 edje_object_part_swallow(cw->effect_obj, "e.swallow.content", cw->shobj);
5262 if (cw->effect_clip)
5264 evas_object_clip_unset(cw->clip);
5265 cw->effect_clip = 0;
5267 cw->effect_clip_able = !edje_object_data_get(cw->effect_obj, "noclip");
5269 _e_comp_object_dim_update(cw);
5271 return cw->effect_set;
5274 /* set params for embryo scripts in effect */
5276 e_comp_object_effect_params_set(Evas_Object *obj, int id, int *params, unsigned int count)
5278 Edje_Message_Int_Set *msg;
5282 EINA_SAFETY_ON_NULL_RETURN(params);
5283 EINA_SAFETY_ON_FALSE_RETURN(count);
5284 if (!cw->effect_set) return;
5286 msg = alloca(sizeof(Edje_Message_Int_Set) + ((count - 1) * sizeof(int)));
5287 msg->count = (int)count;
5288 for (x = 0; x < count; x++)
5289 msg->val[x] = params[x];
5290 edje_object_message_send(cw->effect_obj, EDJE_MESSAGE_INT_SET, id, msg);
5291 edje_object_message_signal_process(cw->effect_obj);
5295 _e_comp_object_effect_end_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
5297 Edje_Signal_Cb end_cb;
5299 E_Comp_Object *cw = data;
5301 edje_object_signal_callback_del_full(obj, "e,action,done", "e", _e_comp_object_effect_end_cb, NULL);
5302 cw->effect_running = 0;
5303 if (!_e_comp_object_animating_end(cw)) return;
5305 if (evas_object_data_get(cw->smart_obj, "effect_running"))
5307 evas_object_data_del(cw->smart_obj, "effect_running");
5308 _e_comp_object_event_simple(obj, E_EVENT_COMP_OBJECT_EFFECT_END);
5309 e_client_visibility_calculate();
5312 end_cb = evas_object_data_get(obj, "_e_comp.end_cb");
5313 if (!end_cb) return;
5314 end_data = evas_object_data_get(obj, "_e_comp.end_data");
5315 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_END, cw->ec);
5316 end_cb(end_data, cw->smart_obj, emission, source);
5319 /* clip effect to client's zone */
5321 e_comp_object_effect_clip(Evas_Object *obj)
5324 if (!cw->ec->zone) return;
5325 if (cw->effect_clip) e_comp_object_effect_unclip(cw->smart_obj);
5326 if (!cw->effect_clip_able) return;
5327 evas_object_clip_set(cw->smart_obj, cw->ec->zone->bg_clip_object);
5328 cw->effect_clip = 1;
5331 /* unclip effect from client's zone */
5333 e_comp_object_effect_unclip(Evas_Object *obj)
5336 if (!cw->effect_clip) return;
5337 evas_object_clip_unset(cw->smart_obj);
5338 cw->effect_clip = 0;
5341 /* start effect, running end_cb after */
5343 e_comp_object_effect_start(Evas_Object *obj, Edje_Signal_Cb end_cb, const void *end_data)
5345 API_ENTRY EINA_FALSE;
5346 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE); //NYI
5347 if (!cw->effect_set) return EINA_FALSE;
5349 if (cw->effect_running)
5351 e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb"));
5354 e_comp_object_effect_clip(obj);
5355 edje_object_signal_callback_del(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb);
5357 edje_object_signal_callback_add(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb, cw);
5358 evas_object_data_set(cw->effect_obj, "_e_comp.end_cb", end_cb);
5359 evas_object_data_set(cw->effect_obj, "_e_comp.end_data", end_data);
5360 evas_object_data_set(cw->smart_obj, "effect_running", (void*)1);
5362 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_START, cw->ec);
5363 _e_comp_object_event_simple(obj, E_EVENT_COMP_OBJECT_EFFECT_START);
5365 edje_object_signal_emit(cw->effect_obj, "e,action,go", "e");
5366 _e_comp_object_animating_begin(cw);
5367 cw->effect_running = 1;
5371 /* stop a currently-running effect immediately */
5373 e_comp_object_effect_stop(Evas_Object *obj, Edje_Signal_Cb end_cb)
5376 Edje_Signal_Cb end_cb_before = NULL;
5377 void *end_data_before = NULL;
5378 API_ENTRY EINA_FALSE;
5380 end_cb_before = evas_object_data_get(cw->effect_obj, "_e_comp.end_cb");
5381 end_data_before = evas_object_data_get(cw->effect_obj, "_e_comp.end_data");
5383 if (end_cb_before != end_cb) return EINA_TRUE;
5384 e_comp_object_effect_unclip(obj);
5385 if (cw->effect_clip)
5387 evas_object_clip_unset(cw->effect_obj);
5388 cw->effect_clip = 0;
5390 edje_object_signal_emit(cw->effect_obj, "e,action,stop", "e");
5391 edje_object_signal_callback_del_full(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb, cw);
5393 if (evas_object_data_get(cw->smart_obj, "effect_running"))
5395 evas_object_data_del(cw->smart_obj, "effect_running");
5396 e_client_visibility_calculate();
5399 cw->effect_running = 0;
5400 ret = _e_comp_object_animating_end(cw);
5402 if ((ret) && (end_cb_before))
5404 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_END, cw->ec);
5405 end_cb_before(end_data_before, cw->smart_obj, "e,action,done", "e");
5412 _e_comp_object_effect_mover_sort_cb(E_Comp_Object_Mover *a, E_Comp_Object_Mover *b)
5414 return a->pri - b->pri;
5417 /* add a function to trigger based on signal emissions for the purpose of modifying effects */
5418 E_API E_Comp_Object_Mover *
5419 e_comp_object_effect_mover_add(int pri, const char *sig, E_Comp_Object_Mover_Cb provider, const void *data)
5421 E_Comp_Object_Mover *prov;
5423 prov = E_NEW(E_Comp_Object_Mover, 1);
5424 EINA_SAFETY_ON_NULL_RETURN_VAL(prov, NULL);
5425 prov->func = provider;
5426 prov->data = (void*)data;
5429 _e_comp_object_movers = eina_inlist_sorted_insert(_e_comp_object_movers, EINA_INLIST_GET(prov),
5430 (Eina_Compare_Cb)_e_comp_object_effect_mover_sort_cb);
5435 e_comp_object_effect_mover_del(E_Comp_Object_Mover *prov)
5437 EINA_SAFETY_ON_NULL_RETURN(prov);
5438 _e_comp_object_movers = eina_inlist_remove(_e_comp_object_movers, EINA_INLIST_GET(prov));
5443 e_comp_object_effect_object_get(Evas_Object *obj)
5447 return cw->effect_obj;
5451 e_comp_object_effect_hiding_set(Evas_Object *obj, Eina_Bool set)
5453 API_ENTRY EINA_FALSE;
5454 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5455 if (!cw->effect_set) return EINA_FALSE;
5462 ////////////////////////////////////
5465 _e_comp_object_autoclose_cleanup(Eina_Bool already_del)
5467 if (e_comp->autoclose.obj)
5469 e_comp_ungrab_input(0, 1);
5470 if (e_comp->autoclose.del_cb)
5471 e_comp->autoclose.del_cb(e_comp->autoclose.data, e_comp->autoclose.obj);
5472 else if (!already_del)
5474 evas_object_hide(e_comp->autoclose.obj);
5475 E_FREE_FUNC(e_comp->autoclose.obj, evas_object_del);
5477 E_FREE_FUNC(e_comp->autoclose.rect, evas_object_del);
5479 e_comp->autoclose.obj = NULL;
5480 e_comp->autoclose.data = NULL;
5481 e_comp->autoclose.del_cb = NULL;
5482 e_comp->autoclose.key_cb = NULL;
5483 E_FREE_FUNC(e_comp->autoclose.key_handler, ecore_event_handler_del);
5487 _e_comp_object_autoclose_key_down_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
5489 Ecore_Event_Key *ev = event;
5490 Eina_Bool del = EINA_TRUE;
5492 /* returning false in key_cb means delete the object */
5493 if (e_comp->autoclose.key_cb)
5494 del = !e_comp->autoclose.key_cb(e_comp->autoclose.data, ev);
5495 if (del) _e_comp_object_autoclose_cleanup(0);
5496 return ECORE_CALLBACK_DONE;
5500 _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)
5502 _e_comp_object_autoclose_cleanup(0);
5506 _e_comp_object_autoclose_setup(Evas_Object *obj)
5508 if (!e_comp->autoclose.rect)
5510 /* create rect just below autoclose object to catch mouse events */
5511 e_comp->autoclose.rect = evas_object_rectangle_add(e_comp->evas);
5512 evas_object_move(e_comp->autoclose.rect, 0, 0);
5513 evas_object_resize(e_comp->autoclose.rect, e_comp->w, e_comp->h);
5514 evas_object_show(e_comp->autoclose.rect);
5515 evas_object_name_set(e_comp->autoclose.rect, "e_comp->autoclose.rect");
5516 evas_object_color_set(e_comp->autoclose.rect, 0, 0, 0, 0);
5517 evas_object_event_callback_add(e_comp->autoclose.rect, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_autoclose_mouse_up_cb, e_comp);
5518 e_comp_grab_input(0, 1);
5520 evas_object_layer_set(e_comp->autoclose.rect, evas_object_layer_get(obj) - 1);
5521 evas_object_focus_set(obj, 1);
5522 if (!e_comp->autoclose.key_handler)
5523 e_comp->autoclose.key_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _e_comp_object_autoclose_key_down_cb, e_comp);
5527 _e_comp_object_autoclose_show(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
5529 _e_comp_object_autoclose_setup(obj);
5530 evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show);
5534 _e_comp_object_autoclose_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
5536 evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show);
5537 _e_comp_object_autoclose_cleanup(1);
5538 if (e_client_focused_get()) return;
5539 if (e_config->focus_policy != E_FOCUS_MOUSE)
5544 e_comp_object_util_autoclose(Evas_Object *obj, E_Comp_Object_Autoclose_Cb del_cb, E_Comp_Object_Key_Cb cb, const void *data)
5548 if (e_comp->autoclose.obj)
5550 if (e_comp->autoclose.obj == obj) return;
5551 evas_object_event_callback_del_full(e_comp->autoclose.obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5552 e_comp->autoclose.obj = obj;
5553 e_comp->autoclose.del_cb = del_cb;
5554 e_comp->autoclose.key_cb = cb;
5555 e_comp->autoclose.data = (void*)data;
5556 if (evas_object_visible_get(obj))
5557 _e_comp_object_autoclose_setup(obj);
5559 evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show, e_comp);
5560 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5563 e_comp->autoclose.obj = obj;
5564 e_comp->autoclose.del_cb = del_cb;
5565 e_comp->autoclose.key_cb = cb;
5566 e_comp->autoclose.data = (void*)data;
5567 if (evas_object_visible_get(obj))
5568 _e_comp_object_autoclose_setup(obj);
5570 evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show, e_comp);
5571 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5575 e_comp_object_is_animating(Evas_Object *obj)
5579 return cw->animating;
5583 e_comp_object_alpha_set(Evas_Object *obj, Eina_Bool alpha)
5587 if ((cw->external_content) &&
5588 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
5590 WRN("Can set up alpha value to ONLY evas \"image\" object. "
5591 "But current external content is %d object for %p.",
5592 cw->content_type, cw->ec);
5596 cw->user_alpha_set = EINA_TRUE;
5597 cw->user_alpha = alpha;
5599 if (!cw->obj) return;
5601 if (alpha == evas_object_image_alpha_get(cw->obj)) return;
5603 evas_object_image_alpha_set(cw->obj, alpha);
5605 if ((!cw->native) && (!cw->external_content))
5606 evas_object_image_data_set(cw->obj, NULL);
5610 e_comp_object_alpha_get(Evas_Object *obj)
5612 API_ENTRY EINA_FALSE;
5614 return evas_object_image_alpha_get(cw->obj);
5618 e_comp_object_mask_set(Evas_Object *obj, Eina_Bool set)
5620 Eina_Bool mask_set = EINA_FALSE;
5624 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5625 if (cw->ec->input_only) return;
5632 o = evas_object_rectangle_add(e_comp->evas);
5633 evas_object_color_set(o, 0, 0, 0, 0);
5634 evas_object_clip_set(o, cw->clip);
5635 evas_object_smart_member_add(o, obj);
5636 evas_object_move(o, 0, 0);
5637 evas_object_resize(o, cw->w, cw->h);
5638 /* save render op value to restore when clear a mask.
5640 * NOTE: DO NOT change the render op on ec->frame while mask object
5641 * is set. it will overwrite the changed op value. */
5642 cw->mask.saved_render_op = evas_object_render_op_get(obj);
5643 evas_object_render_op_set(obj, EVAS_RENDER_COPY);
5644 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5645 if (cw->visible) evas_object_show(o);
5648 evas_object_name_set(cw->mask.obj, "cw->mask_obj");
5649 ELOGF("COMP", " |mask_obj", cw->ec);
5650 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_MASK_OBJECT_SET, cw->ec);
5657 evas_object_smart_member_del(cw->mask.obj);
5658 E_FREE_FUNC(cw->mask.obj, evas_object_del);
5660 evas_object_render_op_set(obj, cw->mask.saved_render_op);
5661 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET, cw->ec);
5667 e_comp_object_mask_has(Evas_Object *obj)
5669 API_ENTRY EINA_FALSE;
5671 return (cw->mask.obj) ? EINA_TRUE : EINA_FALSE;
5675 e_comp_object_size_update(Evas_Object *obj, int w, int h)
5680 if ((cw->external_content) &&
5681 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
5683 WRN("Can set up size to ONLY evas \"image\" object. "
5684 "But current external content is %d object for %p.",
5685 cw->content_type, cw->ec);
5689 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
5691 evas_object_image_size_set(cw->obj, tw, th);
5695 e_comp_object_transform_bg_set(Evas_Object *obj, Eina_Bool set)
5697 Eina_Bool transform_set = EINA_FALSE;
5699 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5700 if (cw->ec->input_only) return;
5702 transform_set = !!set;
5706 if (!cw->transform_bg_obj)
5708 Evas_Object *o = evas_object_rectangle_add(e_comp->evas);
5709 evas_object_move(o, 0, 0);
5710 evas_object_resize(o, 1, 1);
5711 if (cw->transform_bg_color.a >= 255)
5712 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5714 evas_object_render_op_set(o, EVAS_RENDER_BLEND);
5715 evas_object_color_set(o,
5716 cw->transform_bg_color.r,
5717 cw->transform_bg_color.g,
5718 cw->transform_bg_color.b,
5719 cw->transform_bg_color.a);
5720 if (cw->visible) evas_object_show(o);
5722 cw->transform_bg_obj = o;
5723 evas_object_name_set(cw->transform_bg_obj, "cw->transform_bg_obj");
5725 _e_comp_object_transform_obj_stack_update(obj);
5729 if (cw->transform_bg_obj)
5731 evas_object_smart_member_del(cw->transform_bg_obj);
5732 E_FREE_FUNC(cw->transform_bg_obj, evas_object_del);
5738 e_comp_object_transform_bg_color_set(Evas_Object *obj, int r, int g, int b, int a)
5742 cw->transform_bg_color.r = r;
5743 cw->transform_bg_color.g = g;
5744 cw->transform_bg_color.b = b;
5745 cw->transform_bg_color.a = a;
5747 if (cw->transform_bg_obj)
5749 evas_object_color_set(cw->transform_bg_obj,
5750 cw->transform_bg_color.r,
5751 cw->transform_bg_color.g,
5752 cw->transform_bg_color.b,
5753 cw->transform_bg_color.a);
5758 e_comp_object_transform_bg_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
5761 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5762 if (cw->ec->input_only) return;
5763 if (!cw->transform_bg_obj) return;
5765 _e_comp_object_transform_obj_map_set(cw->transform_bg_obj, vertices);
5769 e_comp_object_transform_bg_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
5772 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5773 if (cw->ec->input_only) return;
5774 if (!cw->transform_bg_obj) return;
5776 _e_comp_object_transform_obj_map_set_with_zoom(cw->transform_bg_obj, vertices, zoom);
5780 e_comp_object_transform_transp_set(Evas_Object *obj, Eina_Bool set)
5782 Eina_Bool transform_set = EINA_FALSE;
5784 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5785 if (cw->ec->input_only) return;
5787 transform_set = !!set;
5791 if (!cw->transform_tranp_obj)
5793 Evas_Object *o = evas_object_rectangle_add(e_comp->evas);
5794 evas_object_move(o, 0, 0);
5795 evas_object_resize(o, 1, 1);
5796 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5797 evas_object_color_set(o, 0, 0, 0, 0);
5798 if (cw->visible) evas_object_show(o);
5800 cw->transform_tranp_obj = o;
5801 evas_object_name_set(cw->transform_tranp_obj, "cw->transform_trasp_obj");
5803 _e_comp_object_transform_obj_stack_update(obj);
5807 if (cw->transform_tranp_obj)
5809 evas_object_smart_member_del(cw->transform_tranp_obj);
5810 E_FREE_FUNC(cw->transform_tranp_obj, evas_object_del);
5816 e_comp_object_transform_transp_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
5819 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5820 if (cw->ec->input_only) return;
5821 if (!cw->transform_tranp_obj) return;
5823 _e_comp_object_transform_obj_map_set(cw->transform_tranp_obj, vertices);
5827 e_comp_object_transform_transp_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
5830 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5831 if (cw->ec->input_only) return;
5832 if (!cw->transform_tranp_obj) return;
5834 _e_comp_object_transform_obj_map_set_with_zoom(cw->transform_tranp_obj, vertices, zoom);
5838 e_comp_object_layer_update(Evas_Object *obj,
5839 Evas_Object *above, Evas_Object *below)
5841 E_Comp_Object *cw2 = NULL;
5842 Evas_Object *o = NULL;
5847 if (cw->ec->layer_block) return;
5848 if ((above) && (below))
5850 ERR("Invalid layer update request! cw=%p", cw);
5858 layer = evas_object_layer_get(o);
5859 cw2 = evas_object_data_get(o, "comp_obj");
5862 if (!e_util_strcmp(evas_object_name_get(o), "layer_obj")) break;
5864 o = evas_object_above_get(o);
5865 if ((!o) || (o == cw->smart_obj)) break;
5866 if (evas_object_layer_get(o) != layer)
5868 o = e_comp->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_ALERT)].obj;
5873 ec = e_client_top_get();
5874 if (ec) o = ec->frame;
5877 if (o) cw2 = evas_object_data_get(o, "comp_obj");
5881 _e_comp_object_layers_remove(cw);
5884 if (cw2->layer > cw->layer)
5885 _e_comp_object_layers_add(cw, NULL, NULL, 0);
5886 else if (cw2->layer == cw->layer)
5889 _e_comp_object_layers_add(cw, cw2, NULL, 0);
5891 _e_comp_object_layers_add(cw, NULL, NULL, above? 0 : 1);
5893 _e_comp_object_layers_add(cw, NULL, cw2, 0);
5896 _e_comp_object_layers_add(cw, NULL, NULL, 1);
5899 _e_comp_object_layers_add(cw, NULL, NULL, 0);
5903 e_comp_object_layer_get(Evas_Object *obj)
5910 e_comp_object_content_set(Evas_Object *obj,
5911 Evas_Object *content,
5912 E_Comp_Object_Content_Type type)
5914 API_ENTRY EINA_FALSE;
5916 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5917 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec->pixmap, EINA_FALSE);
5918 EINA_SAFETY_ON_NULL_RETURN_VAL(content, EINA_FALSE);
5922 ERR("Can't set e.swallow.content to requested content. "
5923 "Previous comp object should not be changed at all.");
5927 if (e_pixmap_usable_get(cw->ec->pixmap)) return EINA_FALSE;
5929 if ((type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE) &&
5930 (type != E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE))
5932 ERR("Content type %d for %p is not supported ec:%p pixmap:%p",
5933 type, content, cw->ec, cw->ec->pixmap);
5937 cw->external_content = EINA_TRUE;
5940 cw->content_type = type;
5941 e_util_size_debug_set(cw->obj, 1);
5942 evas_object_name_set(cw->obj, "cw->obj");
5943 _e_comp_object_alpha_set(cw);
5946 _e_comp_object_shadow_setup(cw);
5952 e_comp_object_content_unset(Evas_Object *obj)
5954 API_ENTRY EINA_FALSE;
5956 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5957 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec->pixmap, EINA_FALSE);
5959 if (!cw->obj && !cw->ec->visible)
5961 ELOGF("COMP", "is not visible yet. no need to unset", cw->ec);
5965 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE)
5967 ELOGF("COMP", "has been set to internal image object already", cw->ec);
5973 if (cw->frame_object)
5974 edje_object_part_unswallow(cw->frame_object, cw->obj);
5976 edje_object_part_unswallow(cw->shobj, cw->obj);
5978 evas_object_del(cw->obj);
5979 evas_object_hide(cw->obj);
5983 cw->external_content = EINA_FALSE;
5984 if (cw->ec->is_cursor)
5987 DBG("%p is cursor surface..", cw->ec);
5988 if (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph))
5990 evas_object_resize(cw->ec->frame, pw, ph);
5991 evas_object_hide(cw->ec->frame);
5996 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE;
5997 cw->obj = evas_object_image_filled_add(e_comp->evas);
5998 evas_object_image_border_center_fill_set(cw->obj, EVAS_BORDER_FILL_SOLID);
5999 e_util_size_debug_set(cw->obj, 1);
6000 evas_object_image_pixels_get_callback_set(cw->obj, _e_comp_object_pixels_get, cw);
6001 evas_object_image_pixels_noti_callback_set(cw->obj, _e_comp_object_pixels_noti, cw);
6002 evas_object_image_smooth_scale_set(cw->obj, e_comp_config_get()->smooth_windows);
6003 evas_object_name_set(cw->obj, "cw->obj");
6004 evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888);
6005 _e_comp_object_alpha_set(cw);
6008 _e_comp_object_shadow_setup(cw);
6013 _e_comp_intercept_show_helper(cw);
6017 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
6018 e_comp_object_dirty(cw->smart_obj);
6019 e_comp_object_render(cw->smart_obj);
6020 e_comp_object_render_update_add(obj);
6026 e_comp_object_content_get(Evas_Object *obj)
6030 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, NULL);
6032 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE)
6034 ELOGF("COMP", "has been set to internal image object. couldn't return internal image object", cw->ec);
6041 E_API E_Comp_Object_Content_Type
6042 e_comp_object_content_type_get(Evas_Object *obj)
6044 API_ENTRY E_COMP_OBJECT_CONTENT_TYPE_NONE;
6046 return cw->content_type;
6050 e_comp_object_dim_mask_update(Evas_Object *obj, Eina_Bool mask_set, int x, int y, int w, int h)
6053 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
6054 E_Comp_Config *conf = e_comp_config_get();
6055 if (cw->ec->input_only) return;
6056 if (!conf->dim_rect_enable) return;
6058 cw->dim.mask_set = mask_set;
6064 if (!cw->dim.enable) return;
6065 e_comp_object_dim_mask_set(cw->ec->frame, mask_set);
6069 e_comp_object_dim_mask_set(Evas_Object *obj, Eina_Bool set)
6071 Eina_Bool mask_set = EINA_FALSE;
6075 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
6076 E_Comp_Config *conf = e_comp_config_get();
6077 if (cw->ec->input_only) return;
6078 if (!conf->dim_rect_enable) return;
6084 if (cw->dim.mask_obj)
6086 evas_object_smart_member_del(cw->dim.mask_obj);
6087 E_FREE_FUNC(cw->dim.mask_obj, evas_object_del);
6090 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);
6091 o = evas_object_rectangle_add(e_comp->evas);
6092 evas_object_color_set(o, 0, 0, 0, 0);
6093 evas_object_smart_member_add(o, obj);
6094 evas_object_resize(o, cw->dim.mask_w, cw->dim.mask_h);
6095 evas_object_move(o, cw->dim.mask_x, cw->dim.mask_y);
6097 evas_object_render_op_set(o, EVAS_RENDER_COPY);
6098 if (cw->visible) evas_object_show(o);
6100 cw->dim.mask_obj = o;
6101 evas_object_name_set(cw->dim.mask_obj, "cw->dim_mask_obj");
6103 evas_object_layer_set(cw->dim.mask_obj, 9998);
6107 if (cw->dim.mask_obj)
6109 ELOGF("COMP", "DIM |Mask on Dim rect Removed", cw->ec);
6110 evas_object_smart_member_del(cw->dim.mask_obj);
6111 E_FREE_FUNC(cw->dim.mask_obj, evas_object_del);
6117 e_comp_object_dim_client_set(E_Client *ec)
6119 E_Comp_Config *conf = e_comp_config_get();
6121 if (!conf->dim_rect_enable) return ;
6122 if (dim_client == ec) return;
6124 Eina_Bool prev_dim = EINA_FALSE;
6125 ELOGF("COMP", "DIM |Client Set %p -> %p", ec, dim_client, ec);
6127 if (dim_client && _e_comp_object_dim_enable_get(dim_client, dim_client->frame))
6128 prev_dim = EINA_TRUE;
6130 if (prev_dim && dim_client->visible && ec)
6132 _e_comp_object_dim_enable_set(dim_client, dim_client->frame, EINA_FALSE, EINA_TRUE);
6133 _e_comp_object_dim_enable_set(ec, ec->frame, EINA_TRUE, EINA_TRUE);
6137 if (prev_dim) _e_comp_object_dim_enable_set(dim_client, dim_client->frame, EINA_FALSE, EINA_FALSE);
6138 if (ec) _e_comp_object_dim_enable_set(ec, ec->frame, EINA_TRUE, EINA_FALSE);
6144 e_comp_object_dim_client_get(void)
6146 E_Comp_Config *conf = e_comp_config_get();
6148 if (!conf->dim_rect_enable ) return NULL;
6154 _e_comp_object_dim_enable_set(E_Client *ec, Evas_Object *obj, Eina_Bool enable, Eina_Bool noeffect)
6157 char emit[32] = "\0";
6158 E_Comp_Config *conf = e_comp_config_get();
6161 if (!conf->dim_rect_enable) return;
6162 if (!cw->effect_obj) return;
6163 if (enable == cw->dim.enable) return;
6165 ELOGF("COMP", "DIM |set on Client [%d]", ec, enable);
6166 if (noeffect || !conf->dim_rect_effect)
6168 strncpy(emit, (enable ? "e,state,dim,on,noeffect" : "e,state,dim,off,noeffect"), sizeof(emit) - 1);
6172 strncpy(emit, (enable ? "e,state,dim,on" : "e,state,dim,off"), sizeof(emit) - 1);
6175 cw->dim.enable = enable;
6177 if (cw->dim.mask_set && !enable)
6179 e_comp_object_dim_mask_set(cw->ec->frame, enable);
6180 edje_object_signal_emit(cw->effect_obj, emit, "e");
6182 else if (cw->dim.mask_set && enable)
6184 edje_object_signal_emit(cw->effect_obj, emit, "e");
6185 e_comp_object_dim_mask_set(cw->ec->frame, enable);
6189 edje_object_signal_emit(cw->effect_obj, emit, "e");
6194 _e_comp_object_dim_enable_get(E_Client *ec, Evas_Object *obj)
6196 API_ENTRY EINA_FALSE;
6197 E_Comp_Config *conf = e_comp_config_get();
6199 if (!ec) return EINA_FALSE;
6200 if (!conf->dim_rect_enable) return EINA_FALSE;
6202 if (cw->dim.enable) return EINA_TRUE;
6208 _e_comp_object_dim_update(E_Comp_Object *cw)
6210 E_Comp_Config *conf = e_comp_config_get();
6213 if (!conf->dim_rect_enable) return;
6214 if (!cw->effect_obj) return;
6217 edje_object_signal_emit(cw->effect_obj, (cw->dim.enable ? "e,state,dim,on,noeffect" : "e,state,dim,off,noeffect"), "e");
6218 ELOGF("COMP", "DIM |Applied on Client dim.enable[%d]", cw->ec, cw->dim.enable);
6220 if (cw->dim.mask_set)
6222 e_comp_object_dim_mask_set(cw->ec->frame, cw->dim.mask_set);
6228 e_comp_object_clear(Evas_Object *obj)
6232 _e_comp_object_clear(cw);
6236 e_comp_object_hwc_update_exists(Evas_Object *obj)
6238 API_ENTRY EINA_FALSE;
6239 return cw->hwc_need_update;
6244 e_comp_object_hwc_update_set(Evas_Object *obj, Eina_Bool set)
6247 cw->hwc_need_update = set;
6251 e_comp_object_effect_object_part_swallow(Evas_Object *obj, const char *part_name, Evas_Object *swallow_obj)
6253 API_ENTRY EINA_FALSE;
6254 return edje_object_part_swallow(cw->effect_obj, part_name, swallow_obj);
6258 e_comp_object_indicator_swallow(Evas_Object *obj, Evas_Object *indicator)
6261 if (cw->indicator.obj != indicator)
6262 edje_object_part_unswallow(cw->shobj, cw->indicator.obj);
6263 cw->indicator.obj = indicator;
6264 edje_object_part_swallow(cw->shobj, "e.swallow.indicator", indicator);
6268 e_comp_object_indicator_unswallow(Evas_Object *obj, Evas_Object *indicator)
6271 if (cw->indicator.obj != indicator) return;
6272 cw->indicator.obj = NULL;
6273 edje_object_part_unswallow(cw->shobj, indicator);
6277 e_comp_object_indicator_size_set(Evas_Object *obj, int w, int h)
6280 Edje_Message_Int_Set *msg;
6282 if (!cw->indicator.obj) return;
6284 cw->indicator.w = w;
6285 cw->indicator.h = h;
6287 if (!cw->shobj) return;
6289 msg = alloca(sizeof(Edje_Message_Int_Set) + (sizeof(int)));
6293 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT_SET, 0, msg);
6294 edje_object_message_signal_process(cw->shobj);
6297 /* buffer transform and scale are applied to e_comp_object and e_pixmap internaly */
6299 e_comp_object_map_update(Evas_Object *obj)
6302 E_Client *ec = cw->ec;
6303 E_Comp_Wl_Client_Data *cdata;
6305 int x1, y1, x2, y2, x, y, bw, bh, tw, th;
6308 int l, remain = sizeof buffer;
6311 if (e_object_is_del(E_OBJECT(ec))) return;
6312 cdata = e_client_cdata_get(ec);
6315 /* if buffer had been flushed, buffer could be NULL. Then map will be applied
6316 * when new buffer is attached.
6318 if (!cdata->buffer_ref.buffer) return;
6320 if ((!cw->redirected) ||
6321 (e_client_video_hw_composition_check(ec)) ||
6322 (!e_comp_wl_output_buffer_transform_get(ec) &&
6323 cdata->scaler.buffer_viewport.buffer.scale == 1))
6325 if (evas_object_map_enable_get(cw->effect_obj))
6327 ELOGF("TRANSFORM", "map: disable", cw->ec);
6328 evas_object_map_enable_set(cw->effect_obj, EINA_FALSE);
6329 _e_comp_object_map_transform_rect(cw->ec, 0, 0, cw->w, cw->h, NULL, NULL, &tw, &th);
6330 evas_object_resize(cw->effect_obj, tw, th);
6337 EINA_SAFETY_ON_NULL_RETURN(map);
6339 e_pixmap_size_get(ec->pixmap, &bw, &bh);
6345 e_map_util_points_populate_from_geometry(map, ec->x, ec->y, bw, bh, 0);
6347 _e_comp_object_map_transform_pos(ec, x1, y1, &x, &y);
6348 e_map_point_image_uv_set(map, 0, x, y);
6349 l = snprintf(p, remain, "%d,%d", x, y);
6350 p += l, remain -= l;
6352 _e_comp_object_map_transform_pos(ec, x2, y1, &x, &y);
6353 e_map_point_image_uv_set(map, 1, x, y);
6354 l = snprintf(p, remain, " %d,%d", x, y);
6355 p += l, remain -= l;
6357 _e_comp_object_map_transform_pos(ec, x2, y2, &x, &y);
6358 e_map_point_image_uv_set(map, 2, x, y);
6359 l = snprintf(p, remain, " %d,%d", x, y);
6360 p += l, remain -= l;
6362 _e_comp_object_map_transform_pos(ec, x1, y2, &x, &y);
6363 e_map_point_image_uv_set(map, 3, x, y);
6364 l = snprintf(p, remain, " %d,%d", x, y);
6365 p += l, remain -= l;
6367 ELOGF("TRANSFORM", "map: point(%d,%d %dx%d) uv(%d,%d %d,%d %d,%d %d,%d=>%s)",
6369 ec->x, ec->y, bw, bh, x1, y1, x2, y1, x2, y2, x1, y2, buffer);
6371 e_comp_object_map_set(cw->effect_obj, map);
6372 e_comp_object_map_enable_set(cw->effect_obj, EINA_TRUE);
6376 /* if there's screen rotation with comp mode, then ec->effect_obj and
6377 * ec->obj should rotate. if not, in evas_map, update region is clipped.
6379 _e_comp_object_map_transform_rect(cw->ec, 0, 0, bw, bh, NULL, NULL, &tw, &th);
6380 evas_object_resize(cw->effect_obj, tw, th);
6384 e_comp_object_render_trace_set(Evas_Object *obj, Eina_Bool set)
6386 API_ENTRY EINA_FALSE;
6388 cw->render_trace = set;
6394 e_comp_object_native_usable_get(Evas_Object *obj)
6396 API_ENTRY EINA_FALSE;
6397 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6399 if (cw->ec->input_only) return EINA_FALSE;
6400 if (cw->external_content) return EINA_FALSE;
6401 if (e_comp_object_content_type_get(cw->ec->frame) != E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE) return EINA_FALSE;
6403 /* just return true value, if it is normal case */
6404 if (e_pixmap_usable_get(cw->ec->pixmap)) return EINA_TRUE;
6407 Evas_Native_Surface *ns;
6408 ns = evas_object_image_native_surface_get(cw->obj);
6410 /* client pixmap is not usable but cw->obj is drawable due to it holds valid native surface*/
6413 ELOGF("COMP", "Client pixmap is Not usable but still holds valid native surface", cw->ec);
6421 e_comp_object_image_filter_set(Evas_Object *obj, E_Comp_Image_Filter filter)
6423 API_ENTRY EINA_FALSE;
6424 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6425 if (e_object_is_del(E_OBJECT(cw->ec))) return EINA_FALSE;
6426 if (!e_client_cdata_get(cw->ec)) return EINA_FALSE;
6430 case E_COMP_IMAGE_FILTER_BLUR:
6431 efl_gfx_filter_program_set(cw->obj, "blur (20) padding_set (0)", "image_filter");
6433 case E_COMP_IMAGE_FILTER_GRAYSCALE:
6434 efl_gfx_filter_program_set(cw->obj, "grayscale ()", "image_filter");
6436 case E_COMP_IMAGE_FILTER_INVERSE:
6437 efl_gfx_filter_program_set(cw->obj, "inverse_color ()", "image_filter");
6439 case E_COMP_IMAGE_FILTER_NONE:
6441 efl_gfx_filter_program_set(cw->obj, NULL, "image_filter");
6445 cw->image_filter = filter;
6450 EINTERN E_Comp_Image_Filter
6451 e_comp_object_image_filter_get(Evas_Object *obj)
6453 API_ENTRY E_COMP_IMAGE_FILTER_NONE;
6454 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, E_COMP_IMAGE_FILTER_NONE);
6455 if (e_object_is_del(E_OBJECT(cw->ec))) return E_COMP_IMAGE_FILTER_NONE;
6456 if (!e_client_cdata_get(cw->ec)) return E_COMP_IMAGE_FILTER_NONE;
6458 return cw->image_filter;
6462 _e_comp_object_damage_trace_render_pre_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
6466 if (!_damage_trace) return;
6468 EINA_LIST_FREE(_damage_trace_post_objs, obj)
6469 evas_object_del(obj);
6471 _damage_trace_post_objs = NULL;
6475 _e_comp_object_damage_trace_render_post_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
6477 if (!_damage_trace) return;
6479 _damage_trace_post_objs = _damage_trace_objs;
6480 _damage_trace_objs = NULL;
6484 e_comp_object_damage_trace_debug(Eina_Bool onoff)
6486 if (_damage_trace == onoff) return;
6490 evas_event_callback_add(e_comp->evas,
6491 EVAS_CALLBACK_RENDER_PRE,
6492 _e_comp_object_damage_trace_render_pre_cb,
6495 evas_event_callback_add(e_comp->evas,
6496 EVAS_CALLBACK_RENDER_POST,
6497 _e_comp_object_damage_trace_render_post_cb,
6504 EINA_LIST_FREE(_damage_trace_objs, obj)
6505 evas_object_del(obj);
6507 _damage_trace_objs = NULL;
6509 EINA_LIST_FREE(_damage_trace_post_objs, obj)
6510 evas_object_del(obj);
6512 _damage_trace_post_objs = NULL;
6514 evas_event_callback_del(e_comp->evas,
6515 EVAS_CALLBACK_RENDER_PRE,
6516 _e_comp_object_damage_trace_render_pre_cb);
6518 evas_event_callback_del(e_comp->evas,
6519 EVAS_CALLBACK_RENDER_POST,
6520 _e_comp_object_damage_trace_render_post_cb);
6523 _damage_trace = onoff;
6527 e_comp_object_redirected_get(Evas_Object *obj)
6529 API_ENTRY EINA_FALSE;
6530 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6532 return cw->redirected;
6536 e_comp_object_color_visible_get(Evas_Object *obj)
6538 API_ENTRY EINA_FALSE;
6541 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6543 e_comp_object_color_get(obj, NULL, NULL, NULL, &a);
6547 evas_object_color_get(cw->effect_obj, NULL, NULL, NULL, &a);
6551 evas_object_color_get(cw->shobj, NULL, NULL, NULL, &a);
6555 evas_object_color_get(cw->obj, NULL, NULL, NULL, &a);
6563 e_comp_object_map_set(Evas_Object *obj, E_Map *em)
6565 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
6567 return e_map_set_to_comp_object(em, obj);
6571 e_comp_object_map_get(const Evas_Object *obj)
6573 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
6575 return e_map_get_from_comp_object(obj);
6579 e_comp_object_map_enable_set(Evas_Object *obj, Eina_Bool enable)
6581 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
6583 evas_object_map_enable_set(obj, enable);
6589 e_comp_object_render_update_lock(Evas_Object *obj)
6591 API_ENTRY EINA_FALSE;
6593 if (cw->render_update_lock.lock == 0)
6595 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET, cw->ec);
6596 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref,
6597 e_pixmap_resource_get(cw->ec->pixmap));
6598 e_comp_object_render_update_del(obj);
6599 ELOGF("COMP", "Render update lock enabled", cw->ec);
6602 cw->render_update_lock.lock++;
6608 e_comp_object_render_update_unlock(Evas_Object *obj)
6612 if (cw->render_update_lock.lock == 0)
6615 cw->render_update_lock.lock--;
6617 if (cw->render_update_lock.lock == 0)
6620 if (cw->render_update_lock.pending_move_set)
6622 evas_object_move(obj,
6623 cw->render_update_lock.pending_move_x,
6624 cw->render_update_lock.pending_move_y);
6625 cw->render_update_lock.pending_move_x = 0;
6626 cw->render_update_lock.pending_move_y = 0;
6627 cw->render_update_lock.pending_move_set = EINA_FALSE;
6630 if (cw->render_update_lock.pending_resize_set)
6632 evas_object_resize(obj,
6633 cw->render_update_lock.pending_resize_w,
6634 cw->render_update_lock.pending_resize_h);
6635 cw->render_update_lock.pending_resize_w = 0;
6636 cw->render_update_lock.pending_resize_h = 0;
6637 cw->render_update_lock.pending_resize_set = EINA_FALSE;
6640 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, NULL);
6642 if ((cw->ec->exp_iconify.buffer_flush) &&
6643 (e_policy_visibility_client_is_iconic(cw->ec)) &&
6644 (cw->ec->comp_data) && (!cw->ec->comp_data->buffer_ref.buffer))
6645 e_comp_object_clear(obj);
6647 e_comp_object_render_update_add(obj);
6649 ELOGF("COMP", "Render update lock disabled", cw->ec);
6654 e_comp_object_render_update_lock_get(Evas_Object *obj)
6656 API_ENTRY EINA_FALSE;
6658 if (cw->render_update_lock.lock > 0)
6665 e_comp_object_color_get(Evas_Object *obj, int *r, int *g, int *b, int *a)
6669 evas_object_color_get(obj, r, g, b, a);