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;
191 typedef struct _E_Input_Rect_Data
197 typedef struct _E_Input_Rect_Smart_Data
199 Eina_List *input_rect_data_list;
201 } E_Input_Rect_Smart_Data;
203 struct E_Comp_Object_Mover
206 E_Comp_Object_Mover_Cb func;
212 static Eina_Inlist *_e_comp_object_movers = NULL;
213 static Evas_Smart *_e_comp_smart = NULL;
214 static Evas_Smart *_e_comp_input_obj_smart = NULL;
216 static int _e_comp_object_hooks_delete = 0;
217 static int _e_comp_object_hooks_walking = 0;
219 static Eina_Inlist *_e_comp_object_hooks[] =
221 [E_COMP_OBJECT_HOOK_EFFECT_START] = NULL,
222 [E_COMP_OBJECT_HOOK_EFFECT_END] = NULL,
223 [E_COMP_OBJECT_HOOK_RESTACK] = NULL,
224 [E_COMP_OBJECT_HOOK_OBJECT_SETUP] = NULL,
225 [E_COMP_OBJECT_HOOK_LAYER_SET] = NULL,
226 [E_COMP_OBJECT_HOOK_MASK_OBJECT_SET] = NULL,
227 [E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET] = NULL,
228 [E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET] = NULL,
231 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
232 static int _e_comp_object_intercept_hooks_delete = 0;
233 static int _e_comp_object_intercept_hooks_walking = 0;
235 static Eina_Inlist *_e_comp_object_intercept_hooks[] =
237 [E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER] = NULL,
238 [E_COMP_OBJECT_INTERCEPT_HOOK_HIDE] = NULL,
242 static Eina_Bool _damage_trace = EINA_FALSE;
243 static Eina_List *_damage_trace_objs = NULL;
244 static Eina_List *_damage_trace_post_objs = NULL;
246 /* sekrit functionzzz */
247 EINTERN void e_client_focused_set(E_Client *ec);
249 /* emitted every time a new noteworthy comp object is added */
250 EINTERN int E_EVENT_COMP_OBJECT_ADD = -1;
252 /* ecore event define */
253 EINTERN int E_EVENT_COMP_OBJECT_IMG_RENDER = -1;
254 EINTERN int E_EVENT_COMP_OBJECT_EFFECT_START = -1;
255 EINTERN int E_EVENT_COMP_OBJECT_EFFECT_END = -1;
257 static void _e_comp_object_dim_enable_set(E_Client *ec, Evas_Object *obj, Eina_Bool enable, Eina_Bool noeffect);
258 static Eina_Bool _e_comp_object_dim_enable_get(E_Client *ec, Evas_Object *obj);
259 static void _e_comp_object_dim_update(E_Comp_Object *cw);
260 static void _e_comp_object_native_surface_set(E_Comp_Object *cw, Evas_Native_Surface *ns, Eina_Bool with_mirror);
261 static void _e_comp_object_layer_set(Evas_Object *obj, short layer);
263 static E_Client *dim_client = NULL;
266 _e_comp_object_hooks_clean(void)
269 E_Comp_Object_Hook *ch;
272 for (x = 0; x < E_COMP_OBJECT_HOOK_LAST; x++)
273 EINA_INLIST_FOREACH_SAFE(_e_comp_object_hooks[x], l, ch)
275 if (!ch->delete_me) continue;
276 _e_comp_object_hooks[x] = eina_inlist_remove(_e_comp_object_hooks[x], EINA_INLIST_GET(ch));
282 _e_comp_object_hook_call(E_Comp_Object_Hook_Point hookpoint, E_Client *ec)
284 E_Comp_Object_Hook *ch;
285 Eina_Bool ret = EINA_TRUE;
287 if (e_object_is_del(E_OBJECT(ec)))
289 if ((hookpoint != E_COMP_OBJECT_HOOK_EFFECT_START) &&
290 (hookpoint != E_COMP_OBJECT_HOOK_EFFECT_END) &&
291 (hookpoint != E_COMP_OBJECT_HOOK_OBJECT_SETUP) &&
292 (hookpoint != E_COMP_OBJECT_HOOK_LAYER_SET) &&
293 (hookpoint != E_COMP_OBJECT_HOOK_RESTACK) &&
294 (hookpoint != E_COMP_OBJECT_HOOK_MASK_OBJECT_SET) &&
295 (hookpoint != E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET) &&
296 (hookpoint != E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET))
301 e_object_ref(E_OBJECT(ec));
302 _e_comp_object_hooks_walking++;
303 EINA_INLIST_FOREACH(_e_comp_object_hooks[hookpoint], ch)
305 if (ch->delete_me) continue;
306 if (!(ch->func(ch->data, ec)))
312 _e_comp_object_hooks_walking--;
313 if ((_e_comp_object_hooks_walking == 0) && (_e_comp_object_hooks_delete > 0))
314 _e_comp_object_hooks_clean();
316 e_object_unref(E_OBJECT(ec));
321 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
323 _e_comp_object_intercept_hooks_clean(void)
326 E_Comp_Object_Intercept_Hook *ch;
329 for (x = 0; x < E_COMP_OBJECT_INTERCEPT_HOOK_LAST; x++)
330 EINA_INLIST_FOREACH_SAFE(_e_comp_object_intercept_hooks[x], l, ch)
332 if (!ch->delete_me) continue;
333 _e_comp_object_intercept_hooks[x] = eina_inlist_remove(_e_comp_object_intercept_hooks[x], EINA_INLIST_GET(ch));
339 _e_comp_object_intercept_hook_call(E_Comp_Object_Intercept_Hook_Point hookpoint, E_Client *ec)
341 E_Comp_Object_Intercept_Hook *ch;
342 Eina_Bool ret = EINA_TRUE;
344 if (e_object_is_del(E_OBJECT(ec))) return ret;
345 e_object_ref(E_OBJECT(ec));
346 _e_comp_object_intercept_hooks_walking++;
347 EINA_INLIST_FOREACH(_e_comp_object_intercept_hooks[hookpoint], ch)
349 if (ch->delete_me) continue;
350 if (!(ch->func(ch->data, ec)))
356 _e_comp_object_intercept_hooks_walking--;
357 if ((_e_comp_object_intercept_hooks_walking == 0) && (_e_comp_object_intercept_hooks_delete > 0))
358 _e_comp_object_intercept_hooks_clean();
360 e_object_unref(E_OBJECT(ec));
367 _e_comp_object_event_free(void *d EINA_UNUSED, void *event)
369 E_Event_Comp_Object *ev = event;
372 ec = evas_object_data_get(ev->comp_object, "E_Client");
376 e_object_unref(E_OBJECT(ec));
378 evas_object_unref(ev->comp_object);
383 _e_comp_object_event_add(Evas_Object *obj)
385 E_Event_Comp_Object *ev;
388 if (stopping) return;
389 ev = E_NEW(E_Event_Comp_Object, 1);
390 EINA_SAFETY_ON_NULL_RETURN(ev);
392 evas_object_ref(obj);
393 ev->comp_object = obj;
394 ec = evas_object_data_get(ev->comp_object, "E_Client");
398 e_object_ref(E_OBJECT(ec));
400 ecore_event_add(E_EVENT_COMP_OBJECT_ADD, ev, _e_comp_object_event_free, NULL);
404 _e_comp_object_simple_free(void *d EINA_UNUSED, void *event)
406 E_Event_Comp_Object *ev = event;
409 ec = evas_object_data_get(ev->comp_object, "E_Client");
413 e_object_unref(E_OBJECT(ec));
415 evas_object_unref(ev->comp_object);
420 _e_comp_object_event_simple(Evas_Object *obj, int type)
422 E_Event_Comp_Object *ev;
425 ev = E_NEW(E_Event_Comp_Object, 1);
428 evas_object_ref(obj);
429 ev->comp_object = obj;
430 ec = evas_object_data_get(ev->comp_object, "E_Client");
434 e_object_ref(E_OBJECT(ec));
436 ecore_event_add(type, ev, (Ecore_End_Cb)_e_comp_object_simple_free, NULL);
438 /////////////////////////////////////
441 _e_comp_object_cb_mirror_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
443 E_Comp_Object *cw = data;
445 cw->obj_mirror = eina_list_remove(cw->obj_mirror, obj);
449 _e_comp_object_cb_mirror_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
451 E_Comp_Object *cw = data;
453 if ((!cw->force_visible) && (!e_object_is_del(E_OBJECT(cw->ec))))
454 evas_object_smart_callback_call(cw->smart_obj, "visibility_force", cw->ec);
457 if (e_comp->hwc && !e_comp_is_on_overlay(cw->ec))
458 e_comp_hwc_client_end(cw->ec, __FUNCTION__);
462 _e_comp_object_cb_mirror_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
464 E_Comp_Object *cw = data;
467 if ((!cw->force_visible) && (!e_object_is_del(E_OBJECT(cw->ec))))
468 evas_object_smart_callback_call(cw->smart_obj, "visibility_normal", cw->ec);
471 /////////////////////////////////////
474 _e_comp_object_transform_obj_stack_update(Evas_Object *obj)
478 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
479 if (cw->ec->input_only) return;
481 layer = evas_object_layer_get(obj);
483 if (cw->transform_bg_obj)
485 if (layer != evas_object_layer_get(cw->transform_bg_obj))
487 evas_object_layer_set(cw->transform_bg_obj, layer);
490 evas_object_stack_below(cw->transform_bg_obj, obj);
493 if (cw->transform_tranp_obj)
495 if (layer != evas_object_layer_get(cw->transform_tranp_obj))
497 evas_object_layer_set(cw->transform_tranp_obj, layer);
500 evas_object_stack_below(cw->transform_tranp_obj, obj);
505 _e_comp_object_transform_obj_map_new(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
512 if (!map) return NULL;
514 e_map_util_points_populate_from_object_full(map, obj, 0);
515 e_map_util_points_color_set(map, 255, 255, 255, 255);
517 for (i = 0 ; i < 4 ; ++i)
522 e_util_transform_vertices_pos_round_get(vertices, i, &x, &y, 0, 0);
523 e_map_point_coord_set(map, i, x, y, 1.0);
530 _e_comp_object_transform_obj_map_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
536 E_Map *map = _e_comp_object_transform_obj_map_new(obj, vertices);
539 e_comp_object_map_set(obj, map);
540 e_comp_object_map_enable_set(obj, EINA_TRUE);
547 evas_object_map_enable_set(obj, EINA_FALSE);
552 _e_comp_object_transform_obj_map_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
558 E_Map *map = _e_comp_object_transform_obj_map_new(obj, vertices);
561 e_map_util_zoom(map, zoom.zoom_x, zoom.zoom_y, zoom.cx, zoom.cy);
563 e_comp_object_map_set(obj, map);
564 e_comp_object_map_enable_set(obj, EINA_TRUE);
571 evas_object_map_enable_set(obj, EINA_FALSE);
574 /////////////////////////////////////
576 static inline Eina_Bool
577 _e_comp_shaped_check(int w, int h, const Eina_Rectangle *rects, int num)
579 if (num > 1) return EINA_TRUE;
580 if ((rects[0].x == 0) && (rects[0].y == 0) &&
581 ((int)rects[0].w == w) && ((int)rects[0].h == h))
586 /////////////////////////////////////
588 /* add a client to the layer-client list */
590 _e_comp_object_layers_add(E_Comp_Object *cw, E_Comp_Object *above, E_Comp_Object *below, Eina_Bool prepend)
592 E_Comp_Object *layer_cw = NULL;
594 /* try to get the internal data for the layer;
595 * will return NULL for fake layers (eg. wayland)
597 if (e_comp->layers[cw->layer].obj)
599 if (evas_object_smart_smart_get(e_comp->layers[cw->layer].obj))
600 layer_cw = evas_object_smart_data_get(e_comp->layers[cw->layer].obj);
602 if (layer_cw == cw) layer_cw = NULL;
604 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));
606 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));
607 if ((!above) && (!below))
610 e_comp->layers[cw->layer].clients = eina_inlist_prepend(e_comp->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
612 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));
613 else //this is either the layer object or a tough actin tinactin^W^W^Wfast stacking client
614 e_comp->layers[cw->layer].clients = eina_inlist_append(e_comp->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
616 e_comp->layers[cw->layer].clients_count++;
617 #ifndef E_RELEASE_BUILD
620 E_Client *below_ec = e_client_below_get(cw->ec);
623 if (e_comp->layers[cw->layer].obj == below_ec->frame)
624 CRI("ACK! ec:%p", cw->ec);
631 _e_comp_object_layers_remove(E_Comp_Object *cw)
633 if (cw->ec && e_comp->layers[cw->layer].clients)
635 e_comp->layers[cw->layer].clients = eina_inlist_remove(e_comp->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
636 e_comp->layers[cw->layer].clients_count--;
639 e_comp->layers[cw->layer].objs = eina_inlist_remove(e_comp->layers[cw->layer].objs, EINA_INLIST_GET(cw));
640 e_comp->layers[cw->layer].objs_count--;
644 /////////////////////////////////////
646 _e_comp_object_alpha_set(E_Comp_Object *cw)
648 Eina_Bool alpha = cw->ec->argb;
650 if ((cw->external_content) &&
651 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
656 if (cw->blanked || cw->ns || cw->ec->shaped) alpha = EINA_TRUE;
657 if (cw->user_alpha_set) alpha = cw->user_alpha;
659 evas_object_image_alpha_set(cw->obj, alpha);
663 _e_comp_object_shadow(E_Comp_Object *cw)
665 if (e_client_util_shadow_state_get(cw->ec))
666 edje_object_signal_emit(cw->frame_object ?: cw->shobj, "e,state,shadow,on", "e");
668 edje_object_signal_emit(cw->frame_object ?: cw->shobj, "e,state,shadow,off", "e");
669 if (cw->frame_object)
670 edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e");
671 evas_object_smart_callback_call(cw->smart_obj, "shadow_change", cw->ec);
674 /* convert from the surface coordinates to the buffer coordinates */
676 _e_comp_object_map_transform_pos(E_Client *ec, int sx, int sy, int *dx, int *dy)
678 E_Comp_Wl_Buffer_Viewport *vp;
679 E_Comp_Wl_Client_Data *cdata;
683 cdata = e_client_cdata_get(ec);
685 if (!ec || !cdata || e_object_is_del(E_OBJECT(ec)))
692 vp = &cdata->scaler.buffer_viewport;
693 transform = e_comp_wl_output_buffer_transform_get(ec);
695 e_pixmap_size_get(ec->pixmap, &bw, &bh);
697 /* for subsurface, it should be swap 90 and 270 */
698 if (e_comp_wl_subsurface_check(ec))
701 case WL_OUTPUT_TRANSFORM_90: transform = WL_OUTPUT_TRANSFORM_270; break;
702 case WL_OUTPUT_TRANSFORM_270: transform = WL_OUTPUT_TRANSFORM_90; break;
703 case WL_OUTPUT_TRANSFORM_FLIPPED_90: transform = WL_OUTPUT_TRANSFORM_FLIPPED_270; break;
704 case WL_OUTPUT_TRANSFORM_FLIPPED_270: transform = WL_OUTPUT_TRANSFORM_FLIPPED_90; break;
710 case WL_OUTPUT_TRANSFORM_NORMAL:
711 default: tx = sx, ty = sy; break;
712 case WL_OUTPUT_TRANSFORM_90: tx = sy, ty = bw - sx; break;
713 case WL_OUTPUT_TRANSFORM_180: tx = bw - sx, ty = bh - sy; break;
714 case WL_OUTPUT_TRANSFORM_270: tx = bh - sy, ty = sx; break;
715 case WL_OUTPUT_TRANSFORM_FLIPPED: tx = bw - sx, ty = sy; break;
716 case WL_OUTPUT_TRANSFORM_FLIPPED_90: tx = sy, ty = sx; break;
717 case WL_OUTPUT_TRANSFORM_FLIPPED_180: tx = sx, ty = bh - sy; break;
718 case WL_OUTPUT_TRANSFORM_FLIPPED_270: tx = bh - sy, ty = bw - sx; break;
721 tx *= vp->buffer.scale;
722 ty *= vp->buffer.scale;
729 _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)
737 _e_comp_object_map_transform_pos(ec, x1, y1, &x1, &y1);
738 _e_comp_object_map_transform_pos(ec, x2, y2, &x2, &y2);
745 if (dw) *dw = MAX(x1, x2) - mx;
746 if (dh) *dh = MAX(y1, y2) - my;
750 _e_comp_object_map_damage_transform_rect(E_Client *ec, E_Map *m, int sx, int sy, int sw, int sh,
751 int *dx, int *dy, int *dw, int *dh)
753 E_Util_Transform_Rect rect = {sx, sy, sw, sh};
754 E_Util_Transform_Rect_Vertex sv, dv;
758 e_pixmap_size_get(ec->pixmap, &bw, &bh);
760 sv = e_util_transform_rect_to_vertices(&rect);
762 for (i = 0; i < 4; i++)
764 double x = 0.0, y = 0.0;
766 e_map_coords_get(m, sv.vertices[i].vertex[0], sv.vertices[i].vertex[1], &x, &y, 0);
768 /* if evas decide coordinate is outside of map, it returns (0, 0)
769 in this case, full damage is added.
771 if ((i != 0) && (x == 0.0) && (y == 0.0))
774 dv.vertices[i].vertex[0] = x;
775 dv.vertices[i].vertex[1] = y;
776 dv.vertices[i].vertex[2] = 1.0;
777 dv.vertices[i].vertex[3] = 1.0;
780 rect = e_util_transform_vertices_to_rect(&dv);
782 if (dx) *dx = rect.x;
783 if (dy) *dy = rect.y;
784 if (dw) *dw = rect.w;
785 if (dh) *dh = rect.h;
799 _e_comp_object_map_damage_transform_get(E_Client *ec)
806 if (!evas_object_map_enable_get(ec->frame))
809 m = e_client_map_get(ec);
813 e_pixmap_size_get(ec->pixmap, &bw, &bh);
814 if ((bw == 0) || (bh == 0))
827 e_map_point_coord_set(m2, 0, 0, 0, 0);
828 e_map_point_coord_set(m2, 1, bw, 0, 0);
829 e_map_point_coord_set(m2, 2, bw, bh, 0);
830 e_map_point_coord_set(m2, 3, 0, bh, 0);
832 for (i = 0; i < 4; i++)
836 e_map_point_coord_get(m, i, &map_x, &map_y, NULL);
837 e_map_point_image_uv_set(m2, i, map_x, map_y);
844 /////////////////////////////////////
846 /* handle evas mouse-in events on client object */
848 _e_comp_object_cb_mouse_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
850 Evas_Event_Mouse_In *ev = event_info;
851 E_Comp_Object *cw = data;
853 e_client_mouse_in(cw->ec, ev->output.x, ev->output.y);
856 /* handle evas mouse-out events on client object */
858 _e_comp_object_cb_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
860 Evas_Event_Mouse_Out *ev = event_info;
861 E_Comp_Object *cw = data;
863 e_client_mouse_out(cw->ec, ev->output.x, ev->output.y);
866 /* handle evas mouse wheel events on client object */
868 _e_comp_object_cb_mouse_wheel(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
870 Evas_Event_Mouse_Wheel *ev = event_info;
871 E_Comp_Object *cw = data;
872 E_Binding_Event_Wheel ev2;
875 if (e_client_action_get()) return;
876 e_bindings_evas_event_mouse_wheel_convert(ev, &ev2);
877 e_client_mouse_wheel(cw->ec, &ev->output, &ev2);
880 /* handle evas mouse down events on client object */
882 _e_comp_object_cb_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
884 Evas_Event_Mouse_Down *ev = event_info;
885 E_Comp_Object *cw = data;
886 E_Binding_Event_Mouse_Button ev2;
889 if (e_client_action_get()) return;
890 e_bindings_evas_event_mouse_down_button_convert(ev, &ev2);
891 e_client_mouse_down(cw->ec, ev->button, &ev->output, &ev2);
894 /* handle evas mouse up events on client object */
896 _e_comp_object_cb_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
898 Evas_Event_Mouse_Up *ev = event_info;
899 E_Comp_Object *cw = data;
900 E_Binding_Event_Mouse_Button ev2;
903 if (e_client_action_get() && (e_client_action_get() != cw->ec)) return;
904 e_bindings_evas_event_mouse_up_button_convert(ev, &ev2);
905 e_client_mouse_up(cw->ec, ev->button, &ev->output, &ev2);
908 /* handle evas mouse movement events on client object */
910 _e_comp_object_cb_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
912 Evas_Event_Mouse_Move *ev = event_info;
913 E_Comp_Object *cw = data;
916 if (e_client_action_get() && (e_client_action_get() != cw->ec)) return;
917 e_client_mouse_move(cw->ec, &ev->cur.output);
919 /////////////////////////////////////
921 /* helper function for checking compositor themes based on user-defined matches */
923 _e_comp_object_shadow_client_match(const E_Client *ec, E_Comp_Match *m)
925 if (((m->title) && (!ec->netwm.name)) ||
926 ((ec->netwm.name) && (m->title) && (!e_util_glob_match(ec->netwm.name, m->title))))
928 #if defined(__cplusplus) || defined(c_plusplus)
929 if (((m->clas) && (!ec->icccm.cpp_class)) ||
930 ((ec->icccm.cpp_class) && (m->clas) && (!e_util_glob_match(ec->icccm.cpp_class, m->clas))))
933 if (((m->clas) && (!ec->icccm.class)) ||
934 ((ec->icccm.class) && (m->clas) && (!e_util_glob_match(ec->icccm.class, m->clas))))
938 if (((m->role) && (!ec->icccm.window_role)) ||
939 ((ec->icccm.window_role) && (m->role) && (!e_util_glob_match(ec->icccm.window_role, m->role))))
945 if ((int)ec->netwm.type != m->primary_type)
948 else if (m->primary_type != E_WINDOW_TYPE_REAL_UNKNOWN)
951 if (m->borderless != 0)
955 if (e_client_util_borderless(ec))
957 if (!(((m->borderless == -1) && (!borderless)) ||
958 ((m->borderless == 1) && (borderless))))
965 if (((ec->icccm.transient_for != 0) ||
968 if (!(((m->dialog == -1) && (!dialog)) ||
969 ((m->dialog == 1) && (dialog))))
972 if (m->accepts_focus != 0)
974 int accepts_focus = 0;
976 if (ec->icccm.accepts_focus)
978 if (!(((m->accepts_focus == -1) && (!accepts_focus)) ||
979 ((m->accepts_focus == 1) && (accepts_focus))))
988 if (!(((m->vkbd == -1) && (!vkbd)) ||
989 ((m->vkbd == 1) && (vkbd))))
994 if (!(((m->argb == -1) && (!ec->argb)) ||
995 ((m->argb == 1) && (ec->argb))))
998 if (m->fullscreen != 0)
1000 int fullscreen = ec->fullscreen;
1002 if (!(((m->fullscreen == -1) && (!fullscreen)) ||
1003 ((m->fullscreen == 1) && (fullscreen))))
1010 if (ec->netwm.state.modal)
1012 if (!(((m->modal == -1) && (!modal)) ||
1013 ((m->modal == 1) && (modal))))
1019 /* function for setting up a client's compositor frame theme (cw->shobj) */
1021 _e_comp_object_shadow_setup(E_Comp_Object *cw)
1025 Eina_List *list = NULL, *l;
1026 E_Input_Rect_Data *input_rect_data;
1027 E_Input_Rect_Smart_Data *input_rect_sd;
1029 Eina_Stringshare *reshadow_group = NULL;
1030 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;
1031 Eina_Stringshare *name, *title;
1032 E_Comp_Config *conf = e_comp_config_get();
1034 edje_object_file_get(cw->shobj, NULL, &reshadow_group);
1035 /* match correct client type */
1036 list = cw->ec->override ? conf->match.overrides : conf->match.borders;
1037 name = cw->ec->icccm.name;
1038 title = cw->ec->icccm.title;
1039 skip = (cw->ec->override ? conf->match.disable_overrides : conf->match.disable_borders) || (title && (!strncmp(title, "noshadow", 8)));
1040 fast = cw->ec->override ? conf->fast_overrides : conf->fast_borders;
1042 /* skipping here is mostly a hack for systray because I hate it */
1045 EINA_LIST_FOREACH(list, l, m)
1047 if (((m->name) && (!name)) ||
1048 ((name) && (m->name) && (!e_util_glob_match(name, m->name))))
1050 if (!_e_comp_object_shadow_client_match(cw->ec, m)) continue;
1054 no_shadow = m->no_shadow;
1055 if (m->shadow_style)
1057 /* fast effects are just themes with "/fast" appended and shorter effect times */
1060 snprintf(buf, sizeof(buf), "e/comp/frame/%s/fast", m->shadow_style);
1061 reshadow = ok = !e_util_strcmp(reshadow_group, buf);
1063 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", buf);
1065 /* default to non-fast style if fast not available */
1068 snprintf(buf, sizeof(buf), "e/comp/frame/%s", m->shadow_style);
1069 reshadow = ok = !e_util_strcmp(reshadow_group, buf);
1071 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", buf);
1073 if (ok && m->visibility_effect)
1074 eina_stringshare_refplace(&cw->visibility_effect, m->visibility_effect);
1081 if (skip || (cw->ec->e.state.video))
1083 reshadow = ok = !e_util_strcmp(reshadow_group, "e/comp/frame/none");
1085 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", "e/comp/frame/none");
1088 if (conf->shadow_style)
1092 snprintf(buf, sizeof(buf), "e/comp/frame/%s/fast", conf->shadow_style);
1093 reshadow = ok = !e_util_strcmp(reshadow_group, buf);
1095 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", buf);
1099 snprintf(buf, sizeof(buf), "e/comp/frame/%s", conf->shadow_style);
1100 reshadow = ok = !e_util_strcmp(reshadow_group, buf);
1102 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", buf);
1109 reshadow = ok = !e_util_strcmp(reshadow_group, "e/comp/frame/default/fast");
1111 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", "e/comp/frame/default/fast");
1115 reshadow = ok = !e_util_strcmp(reshadow_group, "e/comp/frame/default");
1117 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", "e/comp/frame/default");
1122 /* reshadow means this entire function call has been a no-op since we're re-setting the current style */
1125 if (cw->zoomap_disabled)
1127 if (cw->frame_object && (e_zoomap_child_get(cw->zoomobj) == cw->frame_object)) return EINA_FALSE;
1131 if (cw->frame_object && (edje_object_part_swallow_get(cw->shobj, "e.swallow.content") == cw->frame_object)) return EINA_FALSE;
1134 if (cw->ec->override)
1136 if ((!cw->ec->shaped) && (!no_shadow) && (!cw->ec->argb))
1137 edje_object_signal_emit(cw->shobj, "e,state,shadow,on", "e");
1139 edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e");
1140 evas_object_smart_callback_call(cw->smart_obj, "shadow_change", cw->ec);
1146 edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e");
1147 evas_object_smart_callback_call(cw->smart_obj, "shadow_change", cw->ec);
1150 _e_comp_object_shadow(cw);
1153 if (focus || cw->ec->focused || cw->ec->override)
1154 e_comp_object_signal_emit(cw->smart_obj, "e,state,focused", "e");
1156 e_comp_object_signal_emit(cw->smart_obj, "e,state,unfocused", "e");
1157 if (urgent || cw->ec->urgent)
1158 e_comp_object_signal_emit(cw->smart_obj, "e,state,urgent", "e");
1160 e_comp_object_signal_emit(cw->smart_obj, "e,state,not_urgent", "e");
1162 e_comp_object_signal_emit(cw->smart_obj, "e,state,shaded", "e");
1164 e_comp_object_signal_emit(cw->smart_obj, "e,state,sticky", "e");
1166 e_comp_object_signal_emit(cw->smart_obj, "e,state,hung", "e");
1167 /* visibility must always be enabled for re_manage clients to prevent
1168 * pop-in animations every time the user sees a persistent client again;
1169 * applying visibility for iconic clients prevents the client from getting
1172 if (cw->visible || cw->ec->re_manage)
1173 e_comp_object_signal_emit(cw->smart_obj, "e,state,visible", "e");
1175 e_comp_object_signal_emit(cw->smart_obj, "e,state,hidden", "e");
1177 /* breaks animation counter */
1178 if (!cw->zoomap_disabled)
1181 e_zoomap_child_set(cw->zoomobj, NULL);
1183 if (cw->frame_object)
1185 edje_object_part_swallow(cw->frame_object, "e.swallow.client", cw->obj);
1186 if (cw->zoomap_disabled)
1187 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object);
1191 e_zoomap_child_set(cw->zoomobj, cw->frame_object);
1192 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->zoomobj);
1201 e_zoomap_child_set(cw->zoomobj, cw->obj);
1202 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->zoomobj);
1205 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->obj);
1209 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
1212 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
1214 if (input_rect_data->obj)
1216 pass_event_flag = EINA_TRUE;
1222 if (cw->indicator.obj)
1224 Evas_Object *indicator;
1225 indicator = edje_object_part_swallow_get(cw->shobj, "e.swallow.indicator");
1226 if (indicator != cw->indicator.obj)
1228 edje_object_part_unswallow(cw->shobj, indicator);
1229 edje_object_part_swallow(cw->shobj, "e.swallow.indicator", cw->indicator.obj);
1230 e_comp_object_indicator_size_set(cw->smart_obj, cw->indicator.w, cw->indicator.h);
1234 evas_object_pass_events_set(cw->default_input_obj, pass_event_flag);
1235 evas_object_pass_events_set(cw->obj, pass_event_flag);
1236 #ifdef BORDER_ZOOMAPS
1237 e_zoomap_child_edje_solid_setup(cw->zoomobj);
1242 /////////////////////////////////////////////
1245 _e_comp_object_animating_begin(E_Comp_Object *cw)
1248 if (cw->animating == 1)
1250 e_comp->animating++;
1252 e_object_ref(E_OBJECT(cw->ec));
1257 _e_comp_object_animating_end(E_Comp_Object *cw)
1266 if (cw->ec->launching)
1268 if (!cw->ec->extra_animating)
1270 ELOGF("COMP", "Un-Set launching flag..", cw->ec);
1271 cw->ec->launching = EINA_FALSE;
1272 if (cw->ec->first_mapped)
1274 ELOGF("LAUNCH", "SHOW real win", cw->ec);
1275 e_comp_object_signal_emit(cw->ec->frame, "e,action,launch_real,done", "e");
1278 e_comp_object_signal_emit(cw->ec->frame, "e,action,launch,done", "e");
1282 e_comp->animating--;
1283 cw->showing = cw->hiding = 0;
1285 if (e_comp->animating == 0)
1286 e_client_visibility_calculate();
1287 /* remove ref from animation start, account for possibility of deletion from unref */
1288 return !!e_object_unref(E_OBJECT(cw->ec));
1294 /* handle the end of a compositor animation */
1296 _e_comp_object_done_defer(void *data, Evas_Object *obj EINA_UNUSED, const char *emission, const char *source EINA_UNUSED)
1298 E_Comp_Object *cw = data;
1300 /* visible clients which have never been sized are a bug */
1301 if ((!cw->ec->new_client) && (!cw->ec->changes.size) && ((cw->w < 0) || (cw->h < 0)) && (!strcmp(emission, "e,action,show,done")))
1302 CRI("ACK! ec:%p", cw->ec);
1303 if (!_e_comp_object_animating_end(cw)) return;
1304 if (cw->animating) return;
1305 /* hide only after animation finishes to guarantee a full run of the animation */
1306 if (cw->defer_hide && ((!strcmp(emission, "e,action,hide,done")) || (!strcmp(emission, "e,action,done"))))
1307 evas_object_hide(cw->smart_obj);
1310 /* run a visibility compositor effect if available, return false if object is dead */
1312 _e_comp_object_effect_visibility_start(E_Comp_Object *cw, Eina_Bool state)
1317 if ((!cw->visibility_effect) || (!e_comp_object_effect_allowed_get(cw->smart_obj))) return EINA_TRUE;;
1318 if (!cw->effect_running)
1319 _e_comp_object_animating_begin(cw);
1320 if (!e_comp_object_effect_stop(cw->smart_obj, _e_comp_object_done_defer))
1321 return _e_comp_object_animating_end(cw);
1322 if (!e_comp_object_effect_set(cw->smart_obj, cw->visibility_effect))
1323 return _e_comp_object_animating_end(cw);
1325 evas_pointer_canvas_xy_get(e_comp->evas, &x, &y);
1329 zw = cw->ec->zone->w, zh = cw->ec->zone->h;
1334 zone = e_comp_object_util_zone_get(cw->smart_obj);
1335 if (!zone) zone = e_zone_current_get();
1342 e_comp_object_effect_params_set(cw->smart_obj, 1, (int[]){cw->x, cw->y,
1343 cw->w, cw->h, zw, zh, x, y}, 8);
1344 e_comp_object_effect_params_set(cw->smart_obj, 0, (int[]){state}, 1);
1345 e_comp_object_effect_start(cw->smart_obj, _e_comp_object_done_defer, cw);
1348 /////////////////////////////////////////////
1350 /* create necessary objects for clients that e manages */
1352 _e_comp_object_mouse_event_callback_set(E_Comp_Object *cw)
1354 if (cw->set_mouse_callbacks) return;
1355 if (!cw->smart_obj) return;
1357 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_IN, _e_comp_object_cb_mouse_in, cw);
1358 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_OUT, _e_comp_object_cb_mouse_out, cw);
1359 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_comp_object_cb_mouse_down, cw);
1360 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_cb_mouse_up, cw);
1361 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_comp_object_cb_mouse_move, cw);
1362 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_WHEEL, _e_comp_object_cb_mouse_wheel, cw);
1364 cw->set_mouse_callbacks = EINA_TRUE;
1368 _e_comp_object_mouse_event_callback_unset(E_Comp_Object *cw)
1370 if (!cw->set_mouse_callbacks) return;
1371 if (!cw->smart_obj) return;
1373 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_IN, _e_comp_object_cb_mouse_in);
1374 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_OUT, _e_comp_object_cb_mouse_out);
1375 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_comp_object_cb_mouse_down);
1376 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_cb_mouse_up);
1377 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_comp_object_cb_mouse_move);
1378 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_WHEEL, _e_comp_object_cb_mouse_wheel);
1380 cw->set_mouse_callbacks = EINA_FALSE;
1384 _e_comp_object_setup(E_Comp_Object *cw)
1386 cw->clip = evas_object_rectangle_add(e_comp->evas);
1387 evas_object_move(cw->clip, -9999, -9999);
1388 evas_object_resize(cw->clip, 999999, 999999);
1389 evas_object_smart_member_add(cw->clip, cw->smart_obj);
1390 cw->effect_obj = edje_object_add(e_comp->evas);
1391 evas_object_move(cw->effect_obj, cw->x, cw->y);
1392 evas_object_clip_set(cw->effect_obj, cw->clip);
1393 evas_object_smart_member_add(cw->effect_obj, cw->smart_obj);
1394 e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", "e/comp/effects/none");
1395 cw->shobj = edje_object_add(e_comp->evas);
1396 evas_object_data_set(cw->shobj, "comp_smart_obj", cw->smart_obj);
1397 edje_object_part_swallow(cw->effect_obj, "e.swallow.content", cw->shobj);
1398 edje_object_signal_callback_add(cw->shobj, "e,action,*,done", "e", _e_comp_object_done_defer, cw);
1400 /* name objects appropriately for nicer printing when using e_comp_util_wins_print() */
1401 if (cw->ec->override)
1403 evas_object_name_set(cw->shobj, "cw->shobj::WINDOW");
1404 evas_object_name_set(cw->effect_obj, "cw->effect_obj::WINDOW");
1405 evas_object_name_set(cw->clip, "cw->clip::WINDOW");
1407 else if (!cw->ec->input_only)
1409 evas_object_name_set(cw->shobj, "cw->shobj::CLIENT");
1410 evas_object_name_set(cw->effect_obj, "cw->effect_obj::CLIENT");
1411 evas_object_name_set(cw->clip, "cw->clip::CLIENT");
1413 cw->real_hid = !cw->ec->input_only;
1414 if (!cw->ec->input_only)
1416 e_util_size_debug_set(cw->effect_obj, 1);
1417 _e_comp_object_mouse_event_callback_set(cw);
1420 cw->default_input_obj = evas_object_rectangle_add(e_comp->evas);
1421 evas_object_name_set(cw->default_input_obj, "cw->default_input_obj");
1422 evas_object_move(cw->default_input_obj, cw->x, cw->y);
1423 evas_object_resize(cw->default_input_obj, cw->w, cw->h);
1424 evas_object_color_set(cw->default_input_obj, 0, 0, 0, 0);
1425 evas_object_smart_member_add(cw->default_input_obj, cw->smart_obj);
1427 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_OBJECT_SETUP, cw->ec);
1430 /////////////////////////////////////////////
1432 /* for fast path evas rendering; only called during render */
1434 _e_comp_object_pixels_get(void *data, Evas_Object *obj EINA_UNUSED)
1436 E_Comp_Object *cw = data;
1437 E_Client *ec = cw->ec;
1439 int bx, by, bxx, byy;
1441 if (e_object_is_del(E_OBJECT(ec))) return;
1442 if (cw->external_content) return;
1443 if (!e_pixmap_size_get(ec->pixmap, &pw, &ph)) return;
1444 e_pixmap_image_opaque_get(cw->ec->pixmap, &bx, &by, &bxx, &byy);
1447 bxx = pw - (bx + bxx), byy = ph - (by + byy);
1448 evas_object_image_border_set(cw->obj, bx, bxx, by, byy);
1450 else if (cw->client_inset.calc && (!cw->frame_object)) //CSD
1452 bx = -cw->client_inset.l + 4, by = -cw->client_inset.t + 4;
1453 bxx = -cw->client_inset.r, byy = -cw->client_inset.b;
1457 bx = by = bxx = byy = 0;
1458 evas_object_image_border_set(cw->obj, bx, bxx, by, byy);
1461 Edje_Message_Int_Set *msg;
1462 Edje_Message_Int msg2;
1463 Eina_Bool id = (bx || by || bxx || byy);
1465 msg = alloca(sizeof(Edje_Message_Int_Set) + (sizeof(int) * 3));
1471 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT_SET, 1, msg);
1473 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT, 0, &msg2);
1477 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
1478 e_comp_client_post_update_add(cw->ec);
1480 else if (e_comp_object_render(ec->frame))
1482 /* apply shape mask if necessary */
1483 if ((!cw->native) && (ec->shaped || ec->shape_changed))
1484 e_comp_object_shape_apply(ec->frame);
1485 ec->shape_changed = 0;
1487 /* shaped clients get precise mouse events to handle transparent pixels */
1488 evas_object_precise_is_inside_set(cw->obj, ec->shaped || ec->shaped_input);
1490 /* queue another render if client is still dirty; cannot refresh here. */
1491 if (e_pixmap_dirty_get(ec->pixmap) && e_pixmap_size_get(ec->pixmap, &pw, &ph))
1492 e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
1494 if (cw->render_trace)
1496 _e_comp_object_event_simple(ec->frame, E_EVENT_COMP_OBJECT_IMG_RENDER);
1502 _e_comp_object_pixels_noti(void *data, Evas_Object *obj EINA_UNUSED)
1504 E_Comp_Object *cw = data;
1505 E_Client *ec = cw->ec;
1507 if (e_object_is_del(E_OBJECT(ec))) return;
1508 if (cw->external_content) return;
1509 if (!e_comp->hwc) return;
1511 e_comp_client_render_list_add(cw->ec);
1513 if (!ec->hwc_window) return;
1515 e_hwc_windows_rendered_window_add(ec->hwc_window);
1518 /////////////////////////////////////////////
1521 _e_comp_object_client_pending_resize_add(E_Client *ec,
1524 unsigned int serial)
1526 E_Client_Pending_Resize *pnd;
1528 pnd = E_NEW(E_Client_Pending_Resize, 1);
1532 pnd->serial = serial;
1533 ec->pending_resize = eina_list_append(ec->pending_resize, pnd);
1537 _e_comp_intercept_move(void *data, Evas_Object *obj, int x, int y)
1539 E_Comp_Object *cw = data;
1542 if (cw->render_update_lock.lock)
1544 cw->render_update_lock.pending_move_x = x;
1545 cw->render_update_lock.pending_move_y = y;
1546 cw->render_update_lock.pending_move_set = EINA_TRUE;
1550 if ((e_pixmap_type_get(cw->ec->pixmap) != E_PIXMAP_TYPE_EXT_OBJECT) &&
1551 (e_pixmap_usable_get(cw->ec->pixmap)) &&
1552 (cw->external_content))
1554 /* delay to move until the external content is unset */
1555 cw->ec->changes.pos = 1;
1560 if (cw->ec->move_after_resize)
1562 if ((x != cw->ec->x) || (y != cw->ec->y))
1564 ELOGF("COMP", "Set Pos to (%d,%d). current ec_pos(%d,%d)", cw->ec, x, y, cw->ec->x, cw->ec->y);
1565 e_client_pos_set(cw->ec, x, y);
1566 cw->ec->changes.pos = 1;
1572 if ((cw->ec->resize_mode == E_POINTER_RESIZE_NONE) &&
1573 (cw->ec->manage_resize.resize_obj))
1575 e_client_pos_set(cw->ec, x, y);
1576 cw->ec->client.x = x + cw->client_inset.l;
1577 cw->ec->client.y = y + cw->client_inset.t;
1578 e_policy_visibility_client_defer_move(cw->ec);
1582 /* if frame_object does not exist, client_inset indicates CSD.
1583 * this means that ec->client matches cw->x/y, the opposite
1586 fx = (!cw->frame_object) * cw->client_inset.l;
1587 fy = (!cw->frame_object) * cw->client_inset.t;
1588 if ((cw->x == x + fx) && (cw->y == y + fy))
1590 if ((cw->ec->x != x) || (cw->ec->y != y))
1592 /* handle case where client tries to move to position and back very quickly */
1593 e_client_pos_set(cw->ec, x, y);
1594 cw->ec->client.x = x + cw->client_inset.l;
1595 cw->ec->client.y = y + cw->client_inset.t;
1599 if (!cw->ec->maximize_override)
1601 /* prevent moving in some directions while directionally maximized */
1602 if ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL)
1604 if ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_HORIZONTAL)
1607 ix = x + cw->client_inset.l;
1608 iy = y + cw->client_inset.t;
1609 if (cw->ec->maximized && (!cw->ec->maximize_override) && ((cw->ec->x != x) || (cw->ec->y != y)) &&
1610 ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) != E_MAXIMIZE_VERTICAL) &&
1611 ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) != E_MAXIMIZE_HORIZONTAL))
1613 /* prevent moving at all if move isn't allowed in current maximize state */
1614 if ((!e_config->allow_manip) && ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH)) return;
1615 /* queue unmaximize if we are allowing move and update unmaximize geometry */
1616 if ((!cw->ec->shading) && (!cw->ec->shaded))
1618 cw->ec->changes.need_unmaximize = 1;
1619 cw->ec->saved.x = ix - cw->ec->zone->x;
1620 cw->ec->saved.y = iy - cw->ec->zone->y;
1621 cw->ec->saved.w = cw->ec->client.w;
1622 cw->ec->saved.h = cw->ec->client.h;
1628 /* only update during resize if triggered by resize */
1629 if (e_client_util_resizing_get(cw->ec) && (!cw->force_move)) return;
1630 /* delay to move while surface waits paired commit serial*/
1631 if (e_client_pending_geometry_has(cw->ec))
1633 /* do nothing while waiting paired commit serial*/
1637 e_client_pos_set(cw->ec, x, y);
1638 if (cw->ec->new_client)
1640 /* don't actually do anything until first client idler loop */
1641 cw->ec->placed = ((!cw->ec->dialog) && (!cw->ec->parent));
1642 cw->ec->changes.pos = 1;
1647 /* only update xy position of client to avoid invalid
1648 * first damage region if it is not a new_client. */
1649 if (!cw->ec->shading)
1651 cw->ec->client.x = ix;
1652 cw->ec->client.y = iy;
1655 if (!cw->frame_object)
1657 evas_object_move(obj, x, y);
1662 _e_comp_intercept_resize(void *data, Evas_Object *obj, int w, int h)
1664 E_Comp_Object *cw = data;
1665 int pw = 0, ph = 0, fw, fh, iw, ih, prev_w, prev_h, x, y;
1667 if (cw->render_update_lock.lock)
1669 cw->render_update_lock.pending_resize_w = w;
1670 cw->render_update_lock.pending_resize_h = h;
1671 cw->render_update_lock.pending_resize_set = EINA_TRUE;
1675 if (!e_util_strcmp("input_panel_surface", cw->ec->icccm.window_role))
1677 e_client_size_set(cw->ec, w, h);
1678 evas_object_resize(obj, w, h);
1682 /* if frame_object does not exist, client_inset indicates CSD.
1683 * this means that ec->client matches cw->w/h, the opposite
1686 fw = (!cw->frame_object) * (-cw->client_inset.l - cw->client_inset.r);
1687 fh = (!cw->frame_object) * (-cw->client_inset.t - cw->client_inset.b);
1688 if ((cw->w == w + fw) && (cw->h == h + fh))
1690 if (cw->ec->shading || cw->ec->shaded) return;
1691 if (((cw->ec->w != w) || (cw->ec->h != h)) ||
1692 (cw->ec->client.w != w - cw->client_inset.l - cw->client_inset.r) ||
1693 (cw->ec->client.h != h - cw->client_inset.t - cw->client_inset.b))
1695 /* handle case where client tries to resize itself and back very quickly */
1696 e_client_size_set(cw->ec, w, h);
1697 cw->ec->client.w = w - cw->client_inset.l - cw->client_inset.r;
1698 cw->ec->client.h = h - cw->client_inset.t - cw->client_inset.b;
1699 evas_object_smart_callback_call(obj, "client_resize", NULL);
1703 /* guarantee that fullscreen is fullscreen */
1704 if (cw->ec->fullscreen && ((w != cw->ec->zone->w) || (h != cw->ec->zone->h)))
1706 /* calculate client size */
1707 iw = w - cw->client_inset.l - cw->client_inset.r;
1708 ih = h - cw->client_inset.t - cw->client_inset.b;
1709 if (cw->ec->maximized && (!cw->ec->maximize_override) && ((cw->ec->w != w) || (cw->ec->h != h)))
1711 /* prevent resizing while maximized depending on direction and config */
1712 if ((!e_config->allow_manip) && ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH)) return;
1713 if ((!cw->ec->shading) && (!cw->ec->shaded))
1715 Eina_Bool reject = EINA_FALSE;
1716 if (cw->ec->maximized & E_MAXIMIZE_VERTICAL)
1718 if (cw->ec->client.h != ih)
1720 cw->ec->saved.h = ih;
1721 cw->ec->saved.y = cw->ec->client.y - cw->ec->zone->y;
1722 reject = cw->ec->changes.need_unmaximize = 1;
1725 if (cw->ec->maximized & E_MAXIMIZE_HORIZONTAL)
1727 if (cw->ec->client.w != iw)
1729 cw->ec->saved.w = iw;
1730 cw->ec->saved.x = cw->ec->client.x - cw->ec->zone->x;
1731 reject = cw->ec->changes.need_unmaximize = 1;
1741 if (cw->ec->new_client || (!cw->ec->visible) || (!cw->effect_obj))
1743 /* do nothing until client idler loops */
1744 if ((cw->ec->w != w) || (cw->ec->h != h))
1746 e_client_size_set(cw->ec, w, h);
1747 cw->ec->changes.size = 1;
1752 if ((!cw->ec->internal) && e_client_util_resizing_get(cw->ec) && cw->ec->netwm.sync.request &&
1753 ((cw->ec->w != w) || (cw->ec->h != h)))
1756 /* netwm sync resizes queue themselves and then trigger later on */
1757 _e_comp_object_client_pending_resize_add(cw->ec, iw, ih, cw->ec->netwm.sync.serial);
1759 if (e_client_pending_geometry_has(cw->ec))
1761 /* do nothing while waiting paired commit serial*/
1765 e_client_size_set(cw->ec, w, h);
1766 if ((!cw->ec->shading) && (!cw->ec->shaded))
1768 /* client geom never changes when shading since the client is never altered */
1769 cw->ec->client.w = iw;
1770 cw->ec->client.h = ih;
1771 if ((cw->ec->client.w < 0) || (cw->ec->client.h < 0)) CRI("WTF. ec:%p", cw->ec);
1774 /* The size of non-compositing window can be changed, so there is a
1775 * need to check that cw is H/W composited if cw is not redirected.
1776 * And of course we have to change size of evas object of H/W composited cw,
1777 * otherwise cw can't receive input events even if it is shown on the screen.
1779 Eina_Bool redirected = cw->redirected;
1781 redirected = e_comp_is_on_overlay(cw->ec);
1783 if ((!cw->ec->input_only) && (redirected) &&
1784 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE) &&
1785 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE) &&
1786 (e_pixmap_dirty_get(cw->ec->pixmap) ||
1787 (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph))))
1790 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE ||
1791 cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE)
1793 prev_w = cw->w, prev_h = cw->h;
1794 e_comp_object_frame_wh_adjust(obj, 0, 0, &fw, &fh);
1795 /* check shading and clamp to pixmap size for regular clients */
1796 if ((!cw->ec->shading) && (!cw->ec->shaded) && (!cw->ec->input_only) && (!cw->ec->override) &&
1797 (((w - fw != pw) || (h - fh != ph))))
1799 //INF("CALLBACK: REQ(%dx%d) != CUR(%dx%d)", w - fw, h - fh, pw, ph);
1800 evas_object_smart_callback_call(obj, "client_resize", NULL);
1802 if (cw->frame_object || cw->ec->input_only)
1803 e_comp_object_frame_wh_adjust(obj, pw, ph, &w, &h);
1806 if ((cw->w == w) && (cw->h == h))
1808 /* going to be a noop resize which won't trigger smart resize */
1809 RENDER_DEBUG("DAMAGE RESIZE(%p): %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
1810 if (cw->updates) eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
1812 evas_object_resize(obj, w, h);
1816 evas_object_smart_callback_call(obj, "client_resize", NULL);
1819 if ((!cw->frame_object) && (!cw->ec->input_only))
1821 /* "just do it" for overrides */
1822 evas_object_resize(obj, w, h);
1824 if (!cw->ec->override)
1826 /* shape probably changed for non-overrides */
1827 cw->ec->need_shape_merge |= cw->ec->shaped || cw->ec->shaped_input;
1828 cw->ec->need_shape_export |= cw->ec->shaped;
1829 if (cw->ec->shaped || cw->ec->shaped_input)
1833 /* this fixes positioning jiggles when using a resize mode
1834 * which also changes the client's position
1837 if (cw->frame_object)
1838 x = cw->x, y = cw->y;
1840 x = cw->ec->x, y = cw->ec->y;
1841 switch (cw->ec->resize_mode)
1843 case E_POINTER_RESIZE_BL:
1844 case E_POINTER_RESIZE_L:
1845 evas_object_move(obj, x + prev_w - cw->w, y);
1847 case E_POINTER_RESIZE_TL:
1848 evas_object_move(obj, x + prev_w - cw->w, y + prev_h - cw->h);
1850 case E_POINTER_RESIZE_T:
1851 case E_POINTER_RESIZE_TR:
1852 evas_object_move(obj, x, y + prev_h - cw->h);
1861 _e_comp_intercept_layer_set(void *data, Evas_Object *obj, int layer)
1863 E_Comp_Object *cw = data;
1864 E_Comp_Wl_Client_Data *child_cdata;
1865 unsigned int l = e_comp_canvas_layer_map(layer);
1868 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
1870 /* doing a compositor effect, follow directions */
1871 _e_comp_object_layer_set(obj, layer);
1872 if (layer == cw->ec->layer) //trying to put layer back
1876 /* if ec->layer and layer are the same but the client is not belong to the given(l)
1877 that means, layer is changed during layer_pending. in this case, need to update layer inlist*/
1878 if (cw->layer != l) goto layer_set;
1882 e_comp_render_queue();
1884 ec = e_client_above_get(cw->ec);
1885 /* skip subsurface: stacking subsurface is handled by e_comp_wl */
1886 while ((ec) && (e_comp_wl_subsurface_check(ec)))
1887 ec = e_client_above_get(ec);
1888 if (ec && (evas_object_layer_get(ec->frame) != evas_object_layer_get(obj)))
1890 ec = e_client_below_get(cw->ec);
1891 /* skip subsurface: stacking subsurface is handled by e_comp_wl */
1892 while ((ec) && (e_comp_wl_subsurface_check(ec)))
1893 ec = e_client_below_get(ec);
1894 if (ec && (evas_object_layer_get(ec->frame) == evas_object_layer_get(cw->smart_obj)))
1896 evas_object_stack_above(obj, ec->frame);
1901 if (ec && (cw->ec->parent == ec))
1903 if (e_client_transient_policy_get(cw->ec) == E_TRANSIENT_ABOVE)
1904 evas_object_stack_above(obj, ec->frame);
1906 evas_object_stack_below(obj, ec->frame);
1909 evas_object_stack_below(obj, ec ? ec->frame : e_comp->layers[cw->layer].obj);
1915 if (cw->layer == l) return;
1916 if (e_comp_canvas_client_layer_map(layer) == 9999)
1917 return; //invalid layer for clients not doing comp effects
1918 if (cw->ec->fullscreen)
1920 cw->ec->saved.layer = layer;
1923 oldraise = e_config->transient.raise;
1925 /* clamp to valid client layer */
1926 layer = e_comp_canvas_client_layer_map_nearest(layer);
1927 cw->ec->layer = layer;
1928 if (e_config->transient.layer)
1931 Eina_List *list = eina_list_clone(cw->ec->transients);
1933 /* We need to set raise to one, else the child wont
1934 * follow to the new layer. It should be like this,
1935 * even if the user usually doesn't want to raise
1938 e_config->transient.raise = 1;
1939 EINA_LIST_FREE(list, child)
1941 child_cdata = e_client_cdata_get(child);
1942 if (child_cdata && !child_cdata->mapped)
1944 ELOGF("COMP", "LAYER_SET CHILD. BUT not mapped. skip. child(ec:%p, win:0x%08zx)", cw->ec, child, e_client_util_win_get(child));
1947 e_client_layer_set(child, layer);
1950 if (!cw->ec->override)
1952 /* set client stacking hints based on layer */
1953 if (layer == E_LAYER_CLIENT_BELOW)
1954 e_hints_window_stacking_set(cw->ec, E_STACKING_BELOW);
1955 else if (layer == E_LAYER_CLIENT_ABOVE)
1956 e_hints_window_stacking_set(cw->ec, E_STACKING_ABOVE);
1958 e_hints_window_stacking_set(cw->ec, E_STACKING_NONE);
1961 e_config->transient.raise = oldraise;
1963 _e_comp_object_layers_remove(cw);
1964 cw->layer = e_comp_canvas_layer_map(layer);
1965 _e_comp_object_layers_add(cw, NULL, NULL, 0);
1966 //if (cw->ec->new_client)
1967 //INF("CLIENT STACKED %p: %u", cw->ec, layer);
1968 _e_comp_object_layer_set(obj, layer);
1969 if (!e_comp->layers[cw->layer].obj) return; //this is a layer marker
1970 evas_object_stack_below(obj, e_comp->layers[cw->layer].obj);
1971 if (evas_object_below_get(obj) == e_comp->layers[cw->layer].obj)
1973 /* can't stack a client above its own layer marker */
1974 CRI("STACKING ERROR!!! ec:%p (cw->layer:%d, ec->layer:%d)", cw->ec, cw->layer, cw->ec->layer);
1976 if (!cw->visible) return;
1977 e_comp_render_queue();
1978 _e_comp_object_transform_obj_stack_update(obj);
1981 typedef void (*E_Comp_Object_Stack_Func)(Evas_Object *obj, Evas_Object *stack);
1984 _e_comp_object_raise(Evas_Object *obj)
1986 evas_object_raise(obj);
1988 if (evas_object_smart_smart_get(obj))
1990 E_Client *ec = e_comp_object_client_get(obj);
1992 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
1997 _e_comp_object_lower(Evas_Object *obj)
1999 evas_object_lower(obj);
2001 if (evas_object_smart_smart_get(obj))
2003 E_Client *ec = e_comp_object_client_get(obj);
2005 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2010 _e_comp_object_stack_above(Evas_Object *obj, Evas_Object *target)
2012 evas_object_stack_above(obj, target);
2014 if (evas_object_smart_smart_get(obj))
2016 E_Client *ec = e_comp_object_client_get(obj);
2018 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2023 _e_comp_object_stack_below(Evas_Object *obj, Evas_Object *target)
2025 evas_object_stack_below(obj, target);
2027 if (evas_object_smart_smart_get(obj))
2029 E_Client *ec = e_comp_object_client_get(obj);
2031 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2036 _e_comp_object_layer_set(Evas_Object *obj, short layer)
2038 evas_object_layer_set(obj, layer);
2040 if (evas_object_smart_smart_get(obj))
2042 E_Client *ec = e_comp_object_client_get(obj);
2044 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_LAYER_SET, ec);
2049 _e_comp_object_is_pending(E_Client *ec)
2053 if (!ec) return EINA_FALSE;
2055 topmost = e_comp_wl_topmost_parent_get(ec);
2057 return (topmost) ? topmost->layer_pending : EINA_FALSE;
2061 _e_comp_intercept_stack_helper(E_Comp_Object *cw, Evas_Object *stack, E_Comp_Object_Stack_Func stack_cb)
2063 E_Comp_Object *cw2 = NULL;
2066 Evas_Object *o = stack;
2067 Eina_Bool raising = stack_cb == _e_comp_object_stack_above;
2069 /* We should consider topmost's layer_pending for subsurface */
2070 if ((cw->ec->layer_block) || _e_comp_object_is_pending(cw->ec))
2072 if (_e_comp_object_is_pending(cw->ec))
2073 e_comp_object_layer_update(cw->smart_obj,
2074 raising? stack : NULL,
2075 raising? NULL : stack);
2077 /* obey compositor effects! */
2078 if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
2079 evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
2080 stack_cb(cw->smart_obj, stack);
2081 if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
2082 evas_object_data_del(cw->smart_obj, "client_restack");
2086 cw2 = evas_object_data_get(o, "comp_obj");
2088 /* assume someone knew what they were doing during client init */
2089 if (cw->ec->new_client)
2090 layer = cw->ec->layer;
2091 else if ((cw2) && _e_comp_object_is_pending(cw2->ec))
2092 layer = cw2->ec->layer;
2094 layer = evas_object_layer_get(stack);
2095 ecstack = e_client_below_get(cw->ec);
2096 if (layer != e_comp_canvas_layer_map_to(cw->layer))
2098 /* some FOOL is trying to restack a layer marker */
2099 if (cw->smart_obj == e_comp->layers[cw->layer].obj) return;
2100 evas_object_layer_set(cw->smart_obj, layer);
2101 /* we got our layer wrangled, return now! */
2102 if (layer != e_comp_canvas_layer_map_to(cw->layer)) return;
2105 /* check if we're stacking below another client */
2108 /* check for non-client layer object */
2109 if (!e_util_strcmp(evas_object_name_get(o), "layer_obj"))
2111 /* find an existing client to use for layering
2112 * by walking up the object stack
2114 * this is guaranteed to be pretty quick since we'll either:
2115 * - run out of client layers
2116 * - find a stacking client
2118 o = evas_object_above_get(o);
2119 if ((!o) || (o == cw->smart_obj)) break;
2120 if (evas_object_layer_get(o) != layer)
2122 /* reached the top client layer somehow
2123 * use top client object
2125 o = e_comp->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR)].obj;
2128 /* top client layer window hasn't been stacked yet. this probably shouldn't happen?
2129 * return here since the top client layer window
2134 ec = e_client_top_get();
2139 if (o) cw2 = evas_object_data_get(o, "comp_obj");
2142 if (cw2 && cw->layer != cw2->layer)
2145 /* remove existing layers */
2146 _e_comp_object_layers_remove(cw);
2149 if (o == stack) //if stacking above, cw2 is above; else cw2 is below
2150 _e_comp_object_layers_add(cw, raising ? cw2 : NULL, raising ? NULL : cw2, 0);
2151 else if (o == cw->smart_obj) //prepend (lower) if not stacking above
2152 _e_comp_object_layers_add(cw, NULL, NULL, !raising);
2153 else //if no stacking objects found, either raise or lower
2154 _e_comp_object_layers_add(cw, raising ? NULL : cw2, raising ? cw2 : NULL, 0);
2157 _e_comp_object_layers_add(cw, NULL, NULL, 0);
2159 /* find new object for stacking if cw2 is on state of layer_pending */
2160 if ((cw2) && _e_comp_object_is_pending(cw2->ec))
2162 E_Client *new_stack = NULL, *current_ec = NULL;
2163 current_ec = cw2->ec;
2166 while ((new_stack = e_client_below_get(current_ec)))
2168 current_ec = new_stack;
2169 if (new_stack == cw->ec) continue;
2170 if (new_stack->layer != cw2->ec->layer) break;
2171 if (!_e_comp_object_is_pending(new_stack)) break;
2173 if ((new_stack) && (new_stack->layer == cw2->ec->layer))
2174 stack = new_stack->frame;
2177 /* stack it above layer object */
2179 below_layer = (cw2->layer <= 0)? 0 : cw2->layer - 1 ;
2180 stack = e_comp->layers[below_layer].obj;
2185 while ((new_stack = e_client_above_get(current_ec)))
2187 current_ec = new_stack;
2188 if (new_stack == cw->ec) continue;
2189 if (new_stack->layer != cw2->ec->layer) break;
2190 if (!_e_comp_object_is_pending(new_stack)) break;
2192 if ((new_stack) && (new_stack->layer == cw2->ec->layer))
2193 stack = new_stack->frame;
2195 stack = e_comp->layers[cw2->layer].obj;
2199 /* set restack if stacking has changed */
2200 if (cw->ec->new_client || (!ecstack) || (ecstack->frame != o))
2201 evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
2202 stack_cb(cw->smart_obj, stack);
2203 if (e_comp->layers[cw->layer].obj)
2204 if (evas_object_below_get(cw->smart_obj) == e_comp->layers[cw->layer].obj)
2206 CRI("STACKING ERROR!!! ec:%p (cw->layer:%d, ec->layer:%d)", cw->ec, cw->layer, cw->ec->layer);
2208 if (cw->ec->new_client || (!ecstack) || (ecstack->frame != o))
2209 evas_object_data_del(cw->smart_obj, "client_restack");
2210 if (!cw->visible) return;
2211 e_comp_render_queue();
2215 _e_comp_intercept_stack_above(void *data, Evas_Object *obj, Evas_Object *above)
2217 EINA_SAFETY_ON_TRUE_RETURN(obj == above);
2219 if (evas_object_below_get(obj) == above)
2221 e_comp_object_layer_update(obj, above, NULL);
2225 TRACE_DS_BEGIN(COMP:INTERCEPT STACK ABOVE);
2226 _e_comp_intercept_stack_helper(data, above, _e_comp_object_stack_above);
2227 _e_comp_object_transform_obj_stack_update(obj);
2228 _e_comp_object_transform_obj_stack_update(above);
2233 _e_comp_intercept_stack_below(void *data, Evas_Object *obj, Evas_Object *below)
2235 EINA_SAFETY_ON_TRUE_RETURN(obj == below);
2236 if (evas_object_above_get(obj) == below)
2238 e_comp_object_layer_update(obj, NULL, below);
2242 TRACE_DS_BEGIN(COMP:INTERCEPT STACK BELOW);
2243 _e_comp_intercept_stack_helper(data, below, _e_comp_object_stack_below);
2244 if (evas_object_smart_smart_get(obj))
2245 _e_comp_object_transform_obj_stack_update(obj);
2246 if (evas_object_smart_smart_get(below))
2247 _e_comp_object_transform_obj_stack_update(below);
2252 _e_comp_intercept_lower(void *data, Evas_Object *obj)
2254 E_Comp_Object *cw = data;
2257 TRACE_DS_BEGIN(COMP:INTERCEPT LOWER);
2259 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
2261 if (cw->ec->layer_pending)
2262 e_comp_object_layer_update(obj, NULL, obj);
2264 _e_comp_object_lower(obj);
2267 if (!EINA_INLIST_GET(cw->ec)->prev) goto end; //already lowest on layer
2268 o = evas_object_below_get(obj);
2269 _e_comp_object_layers_remove(cw);
2270 /* prepend to client list since this client should be the first item now */
2271 _e_comp_object_layers_add(cw, NULL, NULL, 1);
2272 if (evas_object_layer_get(o) != evas_object_layer_get(obj)) goto end; //already at bottom!
2273 if (obj == e_comp->layers[cw->layer].obj) goto end; //never lower a layer marker!
2274 evas_object_data_set(obj, "client_restack", (void*)1);
2275 _e_comp_object_lower(obj);
2276 evas_object_data_del(obj, "client_restack");
2277 if (!cw->visible) goto end;
2278 e_comp_render_queue();
2279 _e_comp_object_transform_obj_stack_update(obj);
2282 if (!cw->ec->post_lower)
2283 e_client_focus_stack_lower(cw->ec);
2288 _e_comp_intercept_raise(void *data, Evas_Object *obj)
2290 E_Comp_Object *cw = data;
2293 TRACE_DS_BEGIN(COMP:INTERCEPT RAISE);
2295 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
2297 if (cw->ec->layer_pending)
2299 int obj_layer = evas_object_layer_get(obj);
2300 if (cw->ec->layer != obj_layer)
2301 e_comp_object_layer_update(obj, NULL, NULL);
2304 _e_comp_object_raise(obj);
2307 if (!EINA_INLIST_GET(cw->ec)->next) goto end;//already highest on layer
2308 o = evas_object_above_get(obj);
2310 E_Client *ecabove = e_client_above_get(cw->ec);
2311 if (ecabove && (ecabove->frame == e_comp->layers[cw->layer].obj) &&
2312 (ecabove->frame == o)) goto end; //highest below marker
2314 if (evas_object_layer_get(o) != evas_object_layer_get(obj)) goto end; //already at top!
2315 if (obj == e_comp->layers[cw->layer].obj) //never raise a non-layer marker!
2316 _e_comp_object_raise(obj);
2321 /* still stack below override below the layer marker */
2322 for (op = o = e_comp->layers[cw->layer].obj;
2323 o && o != e_comp->layers[cw->layer - 1].obj;
2324 op = o, o = evas_object_below_get(o))
2326 if (evas_object_smart_smart_get(o))
2330 ec = e_comp_object_client_get(o);
2331 if (ec && (!ec->override)) break;
2334 _e_comp_object_stack_below(obj, op);
2335 e_client_focus_defer_set(cw->ec);
2337 if (!cw->visible) goto end;
2338 e_comp_render_queue();
2339 _e_comp_object_transform_obj_stack_update(obj);
2346 _e_comp_intercept_hide(void *data, Evas_Object *obj)
2348 E_Comp_Object *cw = data;
2350 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
2351 if( !_e_comp_object_intercept_hook_call(E_COMP_OBJECT_INTERCEPT_HOOK_HIDE, cw->ec))
2353 ELOGF("COMP", "Hide. intercepted", cw->ec);
2358 if (cw->ec->launching == EINA_TRUE)
2360 ELOGF("COMP", "Hide. Cancel launching flag", cw->ec);
2361 cw->ec->launching = EINA_FALSE;
2366 /* hidden flag = just do it */
2367 ELOGF("COMP", "Hide hidden evas_object:%p", cw->ec, obj);
2368 evas_object_hide(obj);
2372 if (cw->ec->input_only)
2374 /* input_only = who cares */
2375 ELOGF("COMP", "Hide input_only evas_object:%p", cw->ec, obj);
2376 evas_object_hide(obj);
2379 /* already hidden or currently animating */
2380 if ((!cw->visible) || (cw->animating && cw->hiding && (!cw->ec->iconic)))
2382 ELOGF("COMP", "Hide. but already hidden or currently animating", cw->ec);
2386 /* don't try hiding during shutdown */
2387 cw->defer_hide |= stopping;
2388 if (!cw->defer_hide)
2390 if ((!cw->ec->iconic) && (!cw->ec->override))
2391 /* unset delete requested so the client doesn't break */
2392 cw->ec->delete_requested = 0;
2393 if ((!cw->animating) || (!cw->hiding) || cw->ec->iconic)
2395 ELOGF("COMP", "Hide. but after iconify or hide animation, cw->animating:%d, cw->hiding:%d, iconic:%d",
2396 cw->ec, cw->animating, cw->hiding, cw->ec->iconic);
2399 e_comp_object_signal_emit(obj, "e,action,iconify", "e");
2402 e_comp_object_signal_emit(obj, "e,state,hidden", "e");
2404 _e_comp_object_animating_begin(cw);
2405 if (!_e_comp_object_effect_visibility_start(cw, 0)) return;
2407 evas_object_smart_callback_call(obj, "hiding", cw->ec);
2408 cw->defer_hide = !!cw->animating;
2410 e_comp_object_effect_set(obj, NULL);
2413 if (cw->animating) return;
2414 /* if we have no animations running, go ahead and hide */
2416 ELOGF("COMP", "Hide normal object:%p", cw->ec, obj);
2417 evas_object_hide(obj);
2421 _e_comp_intercept_show_helper(E_Comp_Object *cw)
2423 E_Client *ec = cw->ec;
2426 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
2428 if (ec->show_pending.count > 0)
2430 ELOGF("COMP", "show_helper. Show PENDING!!! show_pending:%d", ec, ec->show_pending.count);
2431 ec->show_pending.running = EINA_TRUE;
2435 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
2436 if (!_e_comp_object_intercept_hook_call(E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER, ec))
2438 ELOGF("COMP", "show_helper. intercepted", cw->ec);
2443 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,
2444 cw->visible, cw->animating, cw->defer_hide, cw->content_type, cw->updates, cw->w, cw->h,
2445 ec->iconic, ec->exp_iconify.by_client, ec->exp_iconify.type, ec->input_only, ec->ignored, ec->new_client);
2448 e_comp_object_signal_emit(cw->smart_obj, "e,state,sticky", "e");
2451 if (ec->iconic && cw->animating)
2453 /* triggered during iconify animation */
2454 e_comp_object_signal_emit(cw->smart_obj, "e,action,uniconify", "e");
2457 ELOGF("COMP", "show_helper. return. already cw->visible", ec);
2460 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE ||
2461 cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE)
2463 evas_object_move(cw->smart_obj, ec->x, ec->y);
2464 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2465 e_comp_object_frame_theme_set(cw->smart_obj, E_COMP_OBJECT_FRAME_RESHADOW);
2467 if (e_comp->image_filter != E_COMP_IMAGE_FILTER_NONE)
2468 e_comp_object_image_filter_set(cw->smart_obj, e_comp->image_filter);
2471 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2472 evas_object_show(cw->smart_obj);
2475 e_client_focus_defer_set(ec);
2479 if ((!cw->updates) && (!ec->input_only) && (!ec->ignored))
2483 pw = ec->client.w, ph = ec->client.h;
2485 if (!e_pixmap_size_get(ec->pixmap, &pw, &ph))
2487 ec->changes.visible = !ec->hidden;
2490 ELOGF("COMP", "show_helper. return. no pixmap size", ec);
2494 cw->updates = eina_tiler_new(pw, ph);
2497 ec->changes.visible = !ec->hidden;
2500 ELOGF("COMP", "show_helper. return. no cw->updates", ec);
2505 eina_tiler_tile_size_set(cw->updates, 1, 1);
2508 /* ignore until client idler first run */
2509 ec->changes.visible = !ec->hidden;
2512 ELOGF("COMP", "show_helper. return. new_client", ec);
2519 evas_object_move(cw->smart_obj, ec->x, ec->y);
2520 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2521 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2522 evas_object_show(cw->smart_obj);
2525 if (ec->netwm.type == E_WINDOW_TYPE_DND && !e_comp_wl->drag_client)
2527 /* start_drag not received */
2528 ec->changes.visible = 1;
2531 ELOGF("COMP", "show_helper. return. start_drag not received yet", ec);
2534 /* re-set geometry */
2535 evas_object_move(cw->smart_obj, ec->x, ec->y);
2536 /* force resize in case it hasn't happened yet, or just to update size */
2537 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2538 if ((cw->w < 1) || (cw->h < 1))
2540 /* if resize didn't go through, try again */
2541 ec->visible = ec->changes.visible = 1;
2543 ELOGF("COMP", "show_helper. return. cw_size(%d,%d)", ec, cw->w, cw->h);
2546 /* if pixmap not available, clear pixmap since we're going to fetch it again */
2547 if (!e_pixmap_size_get(ec->pixmap, &w, &h))
2548 e_pixmap_clear(ec->pixmap);
2550 if (cw->real_hid && w && h)
2553 /* force comp theming in case it didn't happen already */
2554 e_comp_object_frame_theme_set(cw->smart_obj, E_COMP_OBJECT_FRAME_RESHADOW);
2555 if (e_comp->image_filter != E_COMP_IMAGE_FILTER_NONE)
2556 e_comp_object_image_filter_set(cw->smart_obj, e_comp->image_filter);
2559 /* only do the show if show is allowed */
2562 if (ec->internal) //internal clients render when they feel like it
2563 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
2565 if (!e_client_is_iconified_by_client(ec)||
2566 e_policy_visibility_client_is_uniconic(ec))
2568 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2569 evas_object_show(cw->smart_obj);
2571 /* if comp object is shown in idle enterer before(E_CLIENT_HOOK_EVAL_FETCH),
2572 it is rendered in idle callback without native surface and
2573 compositor shows an empty frame if other objects aren't shown
2574 because job callback of e_comp called at the next loop.
2575 it causes a visual defect when windows are switched.
2579 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
2580 e_comp_object_dirty(cw->smart_obj);
2581 e_comp_object_render(cw->smart_obj);
2585 e_policy_visibility_client_is_uniconic(ec))
2587 if (ec->exp_iconify.not_raise &&
2588 e_client_check_above_focused(ec))
2589 e_client_focus_stack_append_current_focused(ec);
2591 e_client_focus_defer_set(ec);
2598 _e_comp_intercept_show(void *data, Evas_Object *obj EINA_UNUSED)
2600 E_Comp_Object *cw = data;
2601 E_Client *ec = cw->ec;
2603 E_Input_Rect_Data *input_rect_data;
2604 E_Input_Rect_Smart_Data *input_rect_sd;
2607 if (ec->ignored) return;
2611 //INF("SHOW2 %p", ec);
2612 _e_comp_intercept_show_helper(cw);
2615 //INF("SHOW %p", ec);
2618 cw->effect_obj = evas_object_rectangle_add(e_comp->evas);
2619 evas_object_color_set(cw->effect_obj, 0, 0, 0, 0);
2620 evas_object_smart_member_add(cw->effect_obj, cw->smart_obj);
2621 evas_object_name_set(cw->effect_obj, "cw->effect_obj::input_only");
2625 if ((!cw->obj) && (cw->external_content))
2627 ERR("cw->obj for external content is not created! ec:%p", cw->ec);
2631 _e_comp_object_setup(cw);
2634 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE;
2635 cw->obj = evas_object_image_filled_add(e_comp->evas);
2636 evas_object_image_border_center_fill_set(cw->obj, EVAS_BORDER_FILL_SOLID);
2637 e_util_size_debug_set(cw->obj, 1);
2638 evas_object_image_pixels_get_callback_set(cw->obj, _e_comp_object_pixels_get, cw);
2639 evas_object_image_pixels_noti_callback_set(cw->obj, _e_comp_object_pixels_noti, cw);
2640 evas_object_image_smooth_scale_set(cw->obj, e_comp_config_get()->smooth_windows);
2641 evas_object_name_set(cw->obj, "cw->obj");
2642 evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888);
2644 _e_comp_object_alpha_set(cw);
2645 #ifdef BORDER_ZOOMAPS
2646 e_comp_object_zoomap_set(o, 1);
2648 cw->zoomap_disabled = 1;
2651 evas_object_color_set(cw->clip, ec->netwm.opacity, ec->netwm.opacity, ec->netwm.opacity, ec->netwm.opacity);
2654 _e_comp_object_map_transform_rect(cw->ec, 0, 0, cw->w, cw->h, NULL, NULL, &tw, &th);
2655 evas_object_geometry_set(cw->effect_obj, cw->x, cw->y, tw, th);
2658 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
2661 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
2663 if (input_rect_data->obj)
2665 evas_object_geometry_set(input_rect_data->obj,
2666 cw->x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
2667 cw->y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
2668 input_rect_data->rect.w, input_rect_data->rect.h);
2675 evas_object_resize(cw->mask.obj, cw->w, cw->h);
2677 _e_comp_intercept_show_helper(cw);
2681 _e_comp_intercept_focus(void *data, Evas_Object *obj, Eina_Bool focus)
2683 E_Comp_Object *cw = data;
2687 /* note: this is here as it seems there are enough apps that do not even
2688 * expect us to emulate a look of focus but not actually set x input
2689 * focus as we do - so simply abort any focus set on such windows */
2690 /* be strict about accepting focus hint */
2691 /* be strict about accepting focus hint */
2692 if ((!ec->icccm.accepts_focus) &&
2693 (!ec->icccm.take_focus))
2697 if (e_client_focused_get() == ec)
2698 e_client_focused_set(NULL);
2700 ELOGF("FOCUS", "FOCUS UNSET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2701 evas_object_focus_set(obj, focus);
2705 if (focus && ec->lock_focus_out) return;
2706 if (e_object_is_del(E_OBJECT(ec)) && focus)
2707 CRI("CAN'T FOCUS DELETED CLIENT! ec:%p", ec);
2709 /* filter focus setting based on current state */
2714 ELOGF("FOCUS", "FOCUS SET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2715 evas_object_focus_set(obj, focus);
2718 if ((ec->iconic) && (!ec->deskshow))
2720 if (!e_policy_visibility_client_is_uniconify_render_running(ec))
2722 /* don't focus an iconified window. that's silly! */
2723 ELOGF("FOCUS", "Do uniconify to set focus", ec);
2724 e_client_uniconify(ec);
2725 if (e_client_focus_track_enabled())
2726 e_client_focus_latest_set(ec);
2734 if ((!ec->sticky) && (ec->desk) && (!ec->desk->visible))
2736 if (ec->desk->animate_count) return;
2737 e_desk_show(ec->desk);
2738 if (!ec->desk->visible) return;
2744 /* check for dialog children that steal focus */
2745 if ((ec->modal) && (ec->modal != ec) &&
2746 (ec->modal->visible) && (!e_object_is_del(E_OBJECT(ec->modal))))
2748 if (e_config->focus_policy_ext != E_FOCUS_EXT_TOP_STACK)
2750 ELOGF("FOCUS", "focus set | intercept focus to modal", ec->modal);
2751 e_client_frame_focus_set(ec->modal, focus);
2755 else if ((ec->leader) && (ec->leader->modal) &&
2756 (ec->leader->modal != ec) && ec->leader->modal->visible &&
2757 (!e_object_is_del(E_OBJECT(ec->leader->modal))))
2759 if (e_config->focus_policy_ext != E_FOCUS_EXT_TOP_STACK)
2761 ELOGF("FOCUS", "focus set | intercept focus to leader->modal", ec->leader->modal);
2762 e_client_frame_focus_set(ec->leader->modal, focus);
2768 /* not yet visible, wait till the next time... */
2769 ec->want_focus = !ec->hidden;
2774 e_client_focused_set(ec);
2778 if (e_client_focused_get() == ec)
2779 e_client_focused_set(NULL);
2783 ELOGF("FOCUS", "FOCUS SET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2785 ELOGF("FOCUS", "FOCUS UNSET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2787 evas_object_focus_set(obj, focus);
2791 _e_comp_intercept_color_set(void *data, Evas_Object *obj, int r, int g, int b, int a)
2793 E_Comp_Object *cw = data;
2795 if (cw->transparent.set)
2797 cw->transparent.user_r = r;
2798 cw->transparent.user_g = g;
2799 cw->transparent.user_b = b;
2800 cw->transparent.user_a = a;
2802 ELOGF("COMP", "Transparent user_color(%d,%d,%d,%d)",
2804 cw->transparent.user_r,
2805 cw->transparent.user_g,
2806 cw->transparent.user_b,
2807 cw->transparent.user_a);
2811 evas_object_color_set(obj, r, g, b, a);
2814 ////////////////////////////////////////////////////
2817 _e_comp_object_frame_recalc(E_Comp_Object *cw)
2819 int w, h, ox, oy, ow, oh;
2821 Eina_Bool pass_event_flag = EINA_FALSE;
2822 E_Input_Rect_Data *input_rect_data;
2823 E_Input_Rect_Smart_Data *input_rect_sd;
2825 if (cw->frame_object)
2827 if (cw->obj) edje_object_part_unswallow(cw->frame_object, cw->obj);
2828 evas_object_geometry_get(cw->frame_object, NULL, NULL, &w, &h);
2829 /* set a fixed size, force edje calc, check size difference */
2830 evas_object_resize(cw->frame_object, MAX(w, 50), MAX(h, 50));
2831 edje_object_message_signal_process(cw->frame_object);
2832 edje_object_calc_force(cw->frame_object);
2833 edje_object_part_geometry_get(cw->frame_object, "e.swallow.client", &ox, &oy, &ow, &oh);
2834 cw->client_inset.l = ox;
2835 cw->client_inset.r = MAX(w, 50) - (ox + ow);
2836 cw->client_inset.t = oy;
2837 cw->client_inset.b = MAX(h, 50) - (oy + oh);
2838 if (cw->obj) edje_object_part_swallow(cw->frame_object, "e.swallow.client", cw->obj);
2839 evas_object_resize(cw->frame_object, w, h);
2843 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
2846 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
2848 if (input_rect_data->obj)
2850 pass_event_flag = EINA_TRUE;
2856 evas_object_pass_events_set(cw->default_input_obj, pass_event_flag);
2857 evas_object_pass_events_set(cw->obj, pass_event_flag);
2861 cw->client_inset.l = 0;
2862 cw->client_inset.r = 0;
2863 cw->client_inset.t = 0;
2864 cw->client_inset.b = 0;
2866 cw->client_inset.calc = !!cw->frame_object;
2870 _e_comp_smart_cb_frame_recalc(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2872 E_Comp_Object *cw = data;
2875 /* - get current size
2877 * - readjust for new frame size
2880 w = cw->ec->w, h = cw->ec->h;
2881 e_comp_object_frame_wh_unadjust(obj, w, h, &pw, &ph);
2883 _e_comp_object_frame_recalc(cw);
2885 if (!cw->ec->fullscreen)
2886 e_comp_object_frame_wh_adjust(obj, cw->ec->client.w, cw->ec->client.h, &w, &h);
2888 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2889 if (cw->ec->shading || cw->ec->shaded) return;
2890 if (cw->ec->fullscreen)
2891 evas_object_resize(cw->ec->frame, cw->ec->zone->w, cw->ec->zone->h);
2892 else if (cw->ec->new_client)
2894 if ((cw->ec->w < 1) || (cw->ec->h < 1)) return;
2895 e_comp_object_frame_wh_adjust(obj, pw, ph, &w, &h);
2896 evas_object_resize(cw->ec->frame, w, h);
2898 else if ((w != cw->ec->w) || (h != cw->ec->h))
2899 evas_object_resize(cw->ec->frame, w, h);
2903 _e_comp_smart_cb_shading(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2905 E_Comp_Object *cw = data;
2907 if (!cw->ec) return; //NYI
2908 E_FREE_FUNC(cw->shade.anim, ecore_timer_del);
2910 cw->shade.x = cw->x;
2911 cw->shade.y = cw->y;
2912 e_comp_object_signal_emit(cw->smart_obj, "e,state,shading", "e");
2916 _e_comp_smart_cb_shaded(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2918 E_Comp_Object *cw = data;
2920 if (!cw->ec) return; //NYI
2921 E_FREE_FUNC(cw->shade.anim, ecore_timer_del);
2923 e_comp_object_signal_emit(cw->smart_obj, "e,state,shaded", "e");
2927 _e_comp_smart_cb_unshading(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2929 E_Comp_Object *cw = data;
2931 if (!cw->ec) return; //NYI
2932 E_FREE_FUNC(cw->shade.anim, ecore_timer_del);
2934 e_comp_object_signal_emit(cw->smart_obj, "e,state,unshading", "e");
2938 _e_comp_smart_cb_unshaded(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2940 E_Comp_Object *cw = data;
2942 if (!cw->ec) return; //NYI
2943 E_FREE_FUNC(cw->shade.anim, ecore_timer_del);
2945 e_comp_object_signal_emit(cw->smart_obj, "e,state,unshaded", "e");
2949 _e_comp_smart_cb_maximize(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2951 E_Comp_Object *cw = data;
2953 _e_comp_object_shadow_setup(cw);
2954 if (cw->frame_object)
2956 _e_comp_object_shadow(cw);
2957 e_comp_object_signal_emit(cw->smart_obj, "e,action,maximize", "e");
2958 _e_comp_object_frame_recalc(cw);
2959 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2964 _e_comp_smart_cb_fullscreen(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2966 E_Comp_Object *cw = data;
2968 if (_e_comp_object_shadow_setup(cw))
2969 e_comp_object_damage(cw->smart_obj, 0, 0, cw->ec->w, cw->ec->h);
2970 if (cw->frame_object)
2972 _e_comp_object_shadow(cw);
2973 e_comp_object_signal_emit(cw->smart_obj, "e,action,maximize,fullscreen", "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_unmaximize(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2982 E_Comp_Object *cw = data;
2984 if (cw->frame_object)
2986 _e_comp_object_shadow(cw);
2987 e_comp_object_signal_emit(obj, "e,action,unmaximize", "e");
2988 _e_comp_object_frame_recalc(cw);
2989 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2994 _e_comp_smart_cb_unfullscreen(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2996 E_Comp_Object *cw = data;
2998 if (_e_comp_object_shadow_setup(cw))
3001 cw->ec->changes.size = 1;
3003 if (cw->frame_object)
3005 _e_comp_object_shadow(cw);
3006 e_comp_object_signal_emit(obj, "e,action,unmaximize,unfullscreen", "e");
3007 _e_comp_object_frame_recalc(cw);
3008 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
3013 _e_comp_smart_cb_sticky(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3015 e_comp_object_signal_emit(obj, "e,state,sticky", "e");
3019 _e_comp_smart_cb_unsticky(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3021 e_comp_object_signal_emit(obj, "e,state,unsticky", "e");
3025 _e_comp_smart_cb_unhung(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3027 E_Comp_Object *cw = data;
3029 if (!cw->ec) return; //NYI
3030 e_comp_object_signal_emit(cw->smart_obj, "e,state,unhung", "e");
3034 _e_comp_smart_cb_hung(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3036 E_Comp_Object *cw = data;
3038 if (!cw->ec) return; //NYI
3039 e_comp_object_signal_emit(cw->smart_obj, "e,state,hung", "e");
3043 _e_comp_smart_focus_in(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3045 e_comp_object_signal_emit(obj, "e,state,focused", "e");
3049 _e_comp_smart_focus_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3051 E_Comp_Object *cw = data;
3053 if (!e_object_is_del(E_OBJECT(cw->ec)))
3054 e_comp_object_signal_emit(obj, "e,state,unfocused", "e");
3058 _e_comp_input_obj_smart_add(Evas_Object *obj)
3060 E_Input_Rect_Smart_Data *input_rect_sd;
3061 input_rect_sd = E_NEW(E_Input_Rect_Smart_Data, 1);
3063 if (!input_rect_sd) return;
3064 evas_object_smart_data_set(obj, input_rect_sd);
3068 _e_comp_input_obj_smart_del(Evas_Object *obj)
3070 E_Input_Rect_Smart_Data *input_rect_sd;
3071 E_Input_Rect_Data *input_rect_data;
3073 input_rect_sd = evas_object_smart_data_get(obj);
3074 if (!input_rect_sd) return;
3076 EINA_LIST_FREE(input_rect_sd->input_rect_data_list, input_rect_data)
3078 if (input_rect_data->obj)
3080 evas_object_smart_member_del(input_rect_data->obj);
3081 E_FREE_FUNC(input_rect_data->obj, evas_object_del);
3083 E_FREE(input_rect_data);
3085 E_FREE(input_rect_sd);
3089 _e_comp_input_obj_smart_move(Evas_Object *obj, int x, int y)
3091 E_Input_Rect_Smart_Data *input_rect_sd;
3092 E_Input_Rect_Data *input_rect_data;
3096 input_rect_sd = evas_object_smart_data_get(obj);
3097 if (!input_rect_sd) return;
3099 cw = input_rect_sd->cw;
3100 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3102 if (input_rect_data->obj)
3104 evas_object_geometry_set(input_rect_data->obj,
3105 x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
3106 y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
3107 input_rect_data->rect.w, input_rect_data->rect.h);
3113 _e_comp_input_obj_smart_resize(Evas_Object *obj, int w, int h)
3115 E_Input_Rect_Smart_Data *input_rect_sd;
3116 E_Input_Rect_Data *input_rect_data;
3120 input_rect_sd = evas_object_smart_data_get(obj);
3121 if (!input_rect_sd) return;
3123 cw = input_rect_sd->cw;
3124 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3126 if (input_rect_data->obj)
3128 evas_object_geometry_set(input_rect_data->obj,
3129 cw->x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
3130 cw->y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
3131 input_rect_data->rect.w, input_rect_data->rect.h);
3137 _e_comp_input_obj_smart_show(Evas_Object *obj)
3139 E_Input_Rect_Smart_Data *input_rect_sd;
3140 E_Input_Rect_Data *input_rect_data;
3143 input_rect_sd = evas_object_smart_data_get(obj);
3144 if (!input_rect_sd) return;
3146 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3148 if (input_rect_data->obj)
3150 evas_object_show(input_rect_data->obj);
3156 _e_comp_input_obj_smart_hide(Evas_Object *obj)
3158 E_Input_Rect_Smart_Data *input_rect_sd;
3159 E_Input_Rect_Data *input_rect_data;
3162 input_rect_sd = evas_object_smart_data_get(obj);
3163 if (!input_rect_sd) return;
3165 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3167 if (input_rect_data->obj)
3169 evas_object_hide(input_rect_data->obj);
3175 _e_comp_input_obj_smart_init(void)
3177 if (_e_comp_input_obj_smart) return;
3179 static const Evas_Smart_Class sc =
3181 INPUT_OBJ_SMART_NAME,
3182 EVAS_SMART_CLASS_VERSION,
3183 _e_comp_input_obj_smart_add,
3184 _e_comp_input_obj_smart_del,
3185 _e_comp_input_obj_smart_move,
3186 _e_comp_input_obj_smart_resize,
3187 _e_comp_input_obj_smart_show,
3188 _e_comp_input_obj_smart_hide,
3201 _e_comp_input_obj_smart = evas_smart_class_new(&sc);
3207 _e_comp_smart_add(Evas_Object *obj)
3211 cw = E_NEW(E_Comp_Object, 1);
3212 EINA_SAFETY_ON_NULL_RETURN(cw);
3214 cw->smart_obj = obj;
3215 cw->x = cw->y = cw->w = cw->h = -1;
3216 evas_object_smart_data_set(obj, cw);
3217 cw->opacity = 255.0;
3218 cw->external_content = 0;
3219 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_NONE;
3220 cw->transform_bg_color.r = 0;
3221 cw->transform_bg_color.g = 0;
3222 cw->transform_bg_color.b = 0;
3223 cw->transform_bg_color.a = 255;
3224 evas_object_data_set(obj, "comp_obj", cw);
3225 evas_object_move(obj, -1, -1);
3226 /* intercept ALL the callbacks! */
3227 evas_object_intercept_stack_above_callback_add(obj, _e_comp_intercept_stack_above, cw);
3228 evas_object_intercept_stack_below_callback_add(obj, _e_comp_intercept_stack_below, cw);
3229 evas_object_intercept_raise_callback_add(obj, _e_comp_intercept_raise, cw);
3230 evas_object_intercept_lower_callback_add(obj, _e_comp_intercept_lower, cw);
3231 evas_object_intercept_layer_set_callback_add(obj, _e_comp_intercept_layer_set, cw);
3232 evas_object_intercept_move_callback_add(obj, _e_comp_intercept_move, cw);
3233 evas_object_intercept_resize_callback_add(obj, _e_comp_intercept_resize, cw);
3234 evas_object_intercept_show_callback_add(obj, _e_comp_intercept_show, cw);
3235 evas_object_intercept_hide_callback_add(obj, _e_comp_intercept_hide, cw);
3236 evas_object_intercept_focus_set_callback_add(obj, _e_comp_intercept_focus, cw);
3237 evas_object_intercept_color_set_callback_add(obj, _e_comp_intercept_color_set, cw);
3239 evas_object_smart_callback_add(obj, "shading", _e_comp_smart_cb_shading, cw);
3240 evas_object_smart_callback_add(obj, "shaded", _e_comp_smart_cb_shaded, cw);
3241 evas_object_smart_callback_add(obj, "unshading", _e_comp_smart_cb_unshading, cw);
3242 evas_object_smart_callback_add(obj, "unshaded", _e_comp_smart_cb_unshaded, cw);
3244 evas_object_smart_callback_add(obj, "maximize", _e_comp_smart_cb_maximize, cw);
3245 evas_object_smart_callback_add(obj, "fullscreen", _e_comp_smart_cb_fullscreen, cw);
3246 evas_object_smart_callback_add(obj, "unmaximize", _e_comp_smart_cb_unmaximize, cw);
3247 evas_object_smart_callback_add(obj, "unfullscreen", _e_comp_smart_cb_unfullscreen, cw);
3249 evas_object_smart_callback_add(obj, "stick", _e_comp_smart_cb_sticky, cw);
3250 evas_object_smart_callback_add(obj, "unstick", _e_comp_smart_cb_unsticky, cw);
3252 evas_object_smart_callback_add(obj, "hung", _e_comp_smart_cb_hung, cw);
3253 evas_object_smart_callback_add(obj, "unhung", _e_comp_smart_cb_unhung, cw);
3255 evas_object_smart_callback_add(obj, "frame_recalc", _e_comp_smart_cb_frame_recalc, cw);
3257 evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_IN, _e_comp_smart_focus_in, cw);
3258 evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_OUT, _e_comp_smart_focus_out, cw);
3262 _e_comp_smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
3265 evas_object_color_set(cw->clip, r, g, b, a);
3266 evas_object_smart_callback_call(obj, "color_set", NULL);
3271 _e_comp_smart_clip_set(Evas_Object *obj, Evas_Object *clip)
3274 evas_object_clip_set(cw->clip, clip);
3278 _e_comp_smart_clip_unset(Evas_Object *obj)
3281 evas_object_clip_unset(cw->clip);
3285 _e_comp_smart_hide(Evas_Object *obj)
3287 TRACE_DS_BEGIN(COMP:SMART HIDE);
3292 evas_object_hide(cw->clip);
3293 if (cw->input_obj) evas_object_hide(cw->input_obj);
3294 evas_object_hide(cw->effect_obj);
3295 if (cw->default_input_obj) evas_object_hide(cw->default_input_obj);
3296 if (cw->transform_bg_obj) evas_object_hide(cw->transform_bg_obj);
3297 if (cw->transform_tranp_obj) evas_object_hide(cw->transform_tranp_obj);
3304 /* unset native surface if current displaying buffer was destroied */
3305 if (!cw->buffer_destroy_listener.notify)
3307 Evas_Native_Surface *ns;
3308 ns = evas_object_image_native_surface_get(cw->obj);
3309 if ((ns) && (ns->type == EVAS_NATIVE_SURFACE_WL) && (ns->data.wl.legacy_buffer))
3310 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
3313 if (!cw->ec->input_only)
3315 edje_object_freeze(cw->effect_obj);
3316 edje_object_freeze(cw->shobj);
3317 edje_object_play_set(cw->shobj, 0);
3318 if (cw->frame_object)
3319 edje_object_play_set(cw->frame_object, 0);
3321 /* ensure focus-out */
3322 if (cw->ec->focused &&
3323 (e_config->focus_policy_ext != E_FOCUS_EXT_TOP_STACK))
3325 ELOGF("FOCUS", "focus unset | smart_hide", cw->ec);
3326 e_client_frame_focus_set(cw->ec, EINA_FALSE);
3327 e_client_focus_defer_unset(cw->ec);
3329 e_comp_render_queue(); //force nocomp recheck
3335 _e_comp_smart_show(Evas_Object *obj)
3343 if ((cw->w < 0) || (cw->h < 0))
3344 CRI("ACK! ec:%p", cw->ec);
3346 TRACE_DS_BEGIN(COMP:SMART SHOW);
3348 e_comp_object_map_update(obj);
3350 EINA_LIST_FOREACH(cw->ec->e.state.video_child, l, tmp)
3351 evas_object_show(tmp->frame);
3353 evas_object_show(cw->clip);
3354 if (cw->input_obj) evas_object_show(cw->input_obj);
3355 if (!cw->ec->input_only)
3357 edje_object_thaw(cw->effect_obj);
3358 edje_object_thaw(cw->shobj);
3359 edje_object_play_set(cw->shobj, 1);
3360 if (cw->frame_object)
3361 edje_object_play_set(cw->frame_object, 1);
3363 evas_object_show(cw->effect_obj);
3364 if (cw->mask.obj) evas_object_show(cw->mask.obj);
3365 if (cw->transform_bg_obj) evas_object_show(cw->transform_bg_obj);
3366 if (cw->transform_tranp_obj) evas_object_show(cw->transform_tranp_obj);
3367 if (cw->default_input_obj) evas_object_show(cw->default_input_obj);
3368 e_comp_render_queue();
3369 if (cw->ec->input_only)
3374 if (cw->ec->iconic && (!cw->ec->new_client))
3376 if (e_client_is_iconified_by_client(cw->ec))
3378 ELOGF("COMP", "Set launching flag..", cw->ec);
3379 cw->ec->launching = EINA_TRUE;
3382 e_comp_object_signal_emit(cw->smart_obj, "e,action,uniconify", "e");
3384 else if (!cw->showing) /* if set, client was ec->hidden during show animation */
3387 ELOGF("COMP", "Set launching flag..", cw->ec);
3388 cw->ec->launching = EINA_TRUE;
3390 e_comp_object_signal_emit(cw->smart_obj, "e,state,visible", "e");
3391 _e_comp_object_animating_begin(cw);
3392 if (!_e_comp_object_effect_visibility_start(cw, 1))
3398 /* ensure some random effect doesn't lock the client offscreen */
3402 e_comp_object_effect_set(obj, NULL);
3405 _e_comp_object_dim_update(cw);
3411 _e_comp_smart_del(Evas_Object *obj)
3417 if (cw->buffer_destroy_listener.notify)
3419 wl_list_remove(&cw->buffer_destroy_listener.link);
3420 cw->buffer_destroy_listener.notify = NULL;
3423 if (cw->tbm_surface)
3425 tbm_surface_internal_unref(cw->tbm_surface);
3426 cw->tbm_surface = NULL;
3429 if (cw->render_update_lock.buffer_ref.buffer)
3431 ELOGF("COMP", "Clear buffer_ref of render_update_lock:%d",
3432 cw->ec, cw->render_update_lock.lock);
3433 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, NULL);
3436 e_comp_object_render_update_del(cw->smart_obj);
3437 E_FREE_FUNC(cw->updates, eina_tiler_free);
3438 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
3445 EINA_LIST_FREE(cw->obj_mirror, o)
3447 evas_object_image_data_set(o, NULL);
3448 evas_object_freeze_events_set(o, 1);
3449 evas_object_event_callback_del_full(o, EVAS_CALLBACK_DEL, _e_comp_object_cb_mirror_del, cw);
3453 _e_comp_object_layers_remove(cw);
3454 l = evas_object_data_get(obj, "comp_object-to_del");
3455 E_FREE_LIST(l, evas_object_del);
3456 _e_comp_object_mouse_event_callback_unset(cw);
3457 evas_object_del(cw->clip);
3458 evas_object_del(cw->effect_obj);
3459 evas_object_del(cw->shobj);
3460 evas_object_del(cw->frame_object);
3461 evas_object_del(cw->zoomobj);
3462 evas_object_del(cw->input_obj);
3463 evas_object_del(cw->obj);
3464 evas_object_del(cw->mask.obj);
3465 if (cw->dim.mask_obj) evas_object_del(cw->dim.mask_obj);
3466 evas_object_del(cw->transform_bg_obj);
3467 evas_object_del(cw->transform_tranp_obj);
3468 evas_object_del(cw->default_input_obj);
3469 eina_stringshare_del(cw->frame_theme);
3470 eina_stringshare_del(cw->frame_name);
3474 e_comp->animating--;
3476 e_object_unref(E_OBJECT(cw->ec));
3478 cw->ec->frame = NULL;
3483 _e_comp_smart_move(Evas_Object *obj, int x, int y)
3487 cw->x = x, cw->y = y;
3488 evas_object_move(cw->effect_obj, x, y);
3489 evas_object_move(cw->default_input_obj, x, y);
3490 if (cw->input_obj) evas_object_move(cw->input_obj, x, y);
3492 e_comp_object_map_update(obj);
3496 _e_comp_smart_resize(Evas_Object *obj, int w, int h)
3498 Eina_Bool first = EINA_FALSE;
3503 if (!cw->effect_obj) CRI("ACK! ec:%p", cw->ec);
3505 TRACE_DS_BEGIN(COMP:SMART RESIZE);
3507 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
3509 if (cw->w != w || cw->h != h)
3510 e_comp_object_map_update(obj);
3512 first = ((cw->w < 1) || (cw->h < 1));
3513 cw->w = w, cw->h = h;
3514 if ((!cw->ec->shading) && (!cw->ec->shaded))
3518 if (cw->frame_object)
3519 e_comp_object_frame_wh_unadjust(obj, w, h, &ww, &hh);
3522 /* verify pixmap:object size */
3523 if (e_pixmap_size_get(cw->ec->pixmap, &pw, &ph) && (!cw->ec->override))
3525 if ((ww != pw) || (hh != ph))
3526 ELOGF("COMP", "CW RSZ: %dx%d || PX: %dx%d.", cw->ec, ww, hh, pw, ph);
3528 evas_object_resize(cw->effect_obj, tw, th);
3529 evas_object_resize(cw->default_input_obj, w, h);
3530 if (cw->zoomobj) e_zoomap_child_resize(cw->zoomobj, pw, ph);
3532 evas_object_resize(cw->input_obj, w, h);
3534 evas_object_resize(cw->mask.obj, w, h);
3535 /* resize render update tiler */
3538 RENDER_DEBUG("DAMAGE UNFULL: %p", cw->ec);
3539 cw->updates_full = 0;
3540 if (cw->updates) eina_tiler_clear(cw->updates);
3544 RENDER_DEBUG("DAMAGE RESIZE(%p): %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
3545 if (cw->updates) eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
3550 evas_object_resize(cw->effect_obj, tw, th);
3551 evas_object_resize(cw->default_input_obj, w, h);
3558 e_comp_render_queue();
3564 _e_comp_smart_init(void)
3566 if (_e_comp_smart) return;
3568 static const Evas_Smart_Class sc =
3571 EVAS_SMART_CLASS_VERSION,
3575 _e_comp_smart_resize,
3578 _e_comp_smart_color_set,
3579 _e_comp_smart_clip_set,
3580 _e_comp_smart_clip_unset,
3590 _e_comp_smart = evas_smart_class_new(&sc);
3595 e_comp_object_init(void)
3597 E_EVENT_COMP_OBJECT_ADD = ecore_event_type_new();
3598 E_EVENT_COMP_OBJECT_IMG_RENDER = ecore_event_type_new();
3599 E_EVENT_COMP_OBJECT_EFFECT_START = ecore_event_type_new();
3600 E_EVENT_COMP_OBJECT_EFFECT_END = ecore_event_type_new();
3604 e_comp_object_shutdown(void)
3610 e_comp_object_zoomap_set(Evas_Object *obj, Eina_Bool enabled)
3614 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
3617 if (cw->zoomap_disabled == enabled) return;
3620 cw->zoomobj = e_zoomap_add(e_comp->evas);
3621 e_zoomap_smooth_set(cw->zoomobj, e_comp_config_get()->smooth_windows);
3622 e_zoomap_child_set(cw->zoomobj, cw->frame_object);
3623 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->zoomobj);
3624 e_zoomap_child_edje_solid_setup(cw->zoomobj);
3625 if (cw->ec->override)
3626 evas_object_name_set(cw->zoomobj, "cw->zoomobj::WINDOW");
3627 else if (!cw->ec->input_only)
3628 evas_object_name_set(cw->zoomobj, "cw->zoomobj::CLIENT");
3632 edje_object_part_unswallow(cw->shobj, cw->zoomobj);
3633 E_FREE_FUNC(cw->zoomobj, evas_object_del);
3634 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object);
3636 cw->zoomap_disabled = enabled;
3640 e_comp_object_mirror_visibility_check(Evas_Object *obj)
3642 API_ENTRY EINA_FALSE;
3643 return !!cw->force_visible;
3645 /////////////////////////////////////////////////////////
3648 _e_comp_object_util_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3651 Eina_Bool comp_object;
3653 comp_object = !!evas_object_data_get(obj, "comp_object");
3658 o = edje_object_part_swallow_get(obj, "e.swallow.content");
3660 e_comp_render_queue();
3662 l = evas_object_data_get(obj, "comp_object-to_del");
3663 E_FREE_LIST(l, evas_object_del);
3667 _e_comp_object_util_restack(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3669 if (e_comp_util_object_is_above_nocomp(obj) &&
3670 (!evas_object_data_get(obj, "comp_override")))
3672 evas_object_data_set(obj, "comp_override", (void*)1);
3673 e_comp_override_add();
3678 _e_comp_object_util_show(void *data EINA_UNUSED, Evas_Object *obj)
3680 Eina_Bool ref = EINA_TRUE;
3681 if (evas_object_visible_get(obj))
3685 d = evas_object_data_del(obj, "comp_hiding");
3687 /* currently trying to hide */
3690 /* already visible */
3694 evas_object_show(obj);
3697 evas_object_ref(obj);
3698 evas_object_data_set(obj, "comp_ref", (void*)1);
3700 edje_object_signal_emit(obj, "e,state,visible", "e");
3701 evas_object_data_set(obj, "comp_showing", (void*)1);
3702 if (e_comp_util_object_is_above_nocomp(obj))
3704 evas_object_data_set(obj, "comp_override", (void*)1);
3705 e_comp_override_add();
3710 _e_comp_object_util_hide(void *data EINA_UNUSED, Evas_Object *obj)
3712 if (!evas_object_visible_get(obj)) return;
3713 /* already hiding */
3714 if (evas_object_data_get(obj, "comp_hiding")) return;
3715 if (!evas_object_data_del(obj, "comp_showing"))
3717 evas_object_ref(obj);
3718 evas_object_data_set(obj, "comp_ref", (void*)1);
3720 edje_object_signal_emit(obj, "e,state,hidden", "e");
3721 evas_object_data_set(obj, "comp_hiding", (void*)1);
3723 if (evas_object_data_del(obj, "comp_override"))
3724 e_comp_override_timed_pop();
3728 _e_comp_object_util_done_defer(void *data, Evas_Object *obj, const char *emission, const char *source EINA_UNUSED)
3730 if (!e_util_strcmp(emission, "e,action,hide,done"))
3732 if (!evas_object_data_del(obj, "comp_hiding")) return;
3733 evas_object_intercept_hide_callback_del(obj, _e_comp_object_util_hide);
3734 evas_object_hide(obj);
3735 evas_object_intercept_hide_callback_add(obj, _e_comp_object_util_hide, data);
3738 evas_object_data_del(obj, "comp_showing");
3739 if (evas_object_data_del(obj, "comp_ref"))
3740 evas_object_unref(obj);
3744 _e_comp_object_util_moveresize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3750 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
3751 e_zoomap_child_resize(data, w, h);
3755 E_API E_Comp_Object_Hook *
3756 e_comp_object_hook_add(E_Comp_Object_Hook_Point hookpoint, E_Comp_Object_Hook_Cb func, const void *data)
3758 E_Comp_Object_Hook *ch;
3760 EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_COMP_OBJECT_HOOK_LAST, NULL);
3761 ch = E_NEW(E_Comp_Object_Hook, 1);
3762 if (!ch) return NULL;
3763 ch->hookpoint = hookpoint;
3765 ch->data = (void*)data;
3766 _e_comp_object_hooks[hookpoint] = eina_inlist_append(_e_comp_object_hooks[hookpoint], EINA_INLIST_GET(ch));
3771 e_comp_object_hook_del(E_Comp_Object_Hook *ch)
3774 if (_e_comp_object_hooks_walking == 0)
3776 _e_comp_object_hooks[ch->hookpoint] = eina_inlist_remove(_e_comp_object_hooks[ch->hookpoint], EINA_INLIST_GET(ch));
3780 _e_comp_object_hooks_delete++;
3783 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
3784 E_API E_Comp_Object_Intercept_Hook *
3785 e_comp_object_intercept_hook_add(E_Comp_Object_Intercept_Hook_Point hookpoint, E_Comp_Object_Intercept_Hook_Cb func, const void *data)
3787 E_Comp_Object_Intercept_Hook *ch;
3789 EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_COMP_OBJECT_INTERCEPT_HOOK_LAST, NULL);
3790 ch = E_NEW(E_Comp_Object_Intercept_Hook, 1);
3791 if (!ch) return NULL;
3792 ch->hookpoint = hookpoint;
3794 ch->data = (void*)data;
3795 _e_comp_object_intercept_hooks[hookpoint] = eina_inlist_append(_e_comp_object_intercept_hooks[hookpoint], EINA_INLIST_GET(ch));
3800 e_comp_object_intercept_hook_del(E_Comp_Object_Intercept_Hook *ch)
3803 if (_e_comp_object_intercept_hooks_walking == 0)
3805 _e_comp_object_intercept_hooks[ch->hookpoint] = eina_inlist_remove(_e_comp_object_intercept_hooks[ch->hookpoint], EINA_INLIST_GET(ch));
3809 _e_comp_object_intercept_hooks_delete++;
3813 EINTERN Evas_Object *
3814 e_comp_object_util_add(Evas_Object *obj, E_Comp_Object_Type type)
3816 Evas_Object *o, *z = NULL;
3818 Eina_List *l, *list = NULL;
3819 E_Comp_Config *conf = e_comp_config_get();
3820 Eina_Bool skip = EINA_FALSE, fast = EINA_FALSE, shadow = EINA_FALSE;
3827 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
3831 case E_COMP_OBJECT_TYPE_MENU:
3832 list = conf->match.menus;
3833 skip = conf->match.disable_menus;
3834 fast = conf->fast_menus;
3837 case E_COMP_OBJECT_TYPE_POPUP:
3838 list = conf->match.popups;
3839 skip = conf->match.disable_popups;
3840 fast = conf->fast_popups;
3843 list = conf->match.objects;
3844 skip = conf->match.disable_objects;
3845 fast = conf->fast_objects;
3847 name = evas_object_name_get(obj);
3848 vis = evas_object_visible_get(obj);
3849 o = edje_object_add(e_comp->evas);
3850 evas_object_data_set(o, "comp_object", (void*)1);
3851 if (name && (!skip))
3852 skip = (!strncmp(name, "noshadow", 8));
3854 evas_object_data_set(o, "comp_object_skip", (void*)1);
3857 EINA_LIST_FOREACH(list, l, m)
3859 if (((m->name) && (!name)) ||
3860 ((name) && (m->name) && (!e_util_glob_match(name, m->name))))
3862 if (!m->shadow_style) continue;
3865 snprintf(buf, sizeof(buf), "e/comp/frame/%s/fast", m->shadow_style);
3866 ok = e_theme_edje_object_set(o, "base/theme/comp", buf);
3870 snprintf(buf, sizeof(buf), "e/comp/frame/%s", m->shadow_style);
3871 ok = e_theme_edje_object_set(o, "base/theme/comp", buf);
3875 shadow = !m->no_shadow;
3885 ok = e_theme_edje_object_set(o, "base/theme/comp", "e/comp/frame/none");
3887 if (conf->shadow_style)
3891 snprintf(buf, sizeof(buf), "e/comp/frame/%s/fast", conf->shadow_style);
3892 ok = e_theme_edje_object_set(o, "base/theme/comp", buf);
3896 snprintf(buf, sizeof(buf), "e/comp/frame/%s", conf->shadow_style);
3897 ok = e_theme_edje_object_set(o, "base/theme/comp", buf);
3902 ok = e_theme_edje_object_set(o, "base/theme/comp", "e/comp/frame/default/fast");
3904 ok = e_theme_edje_object_set(o, "base/theme/comp", "e/comp/frame/default");
3907 if (shadow && (e_util_strcmp(evas_object_type_get(obj), "edje") || (!edje_object_data_get(obj, "noshadow"))))
3908 edje_object_signal_emit(o, "e,state,shadow,on", "e");
3910 edje_object_signal_emit(o, "e,state,shadow,off", "e");
3912 evas_object_geometry_get(obj, &x, &y, &w, &h);
3913 evas_object_geometry_set(o, x, y, w, h);
3914 evas_object_pass_events_set(o, evas_object_pass_events_get(obj));
3918 z = e_zoomap_add(e_comp->evas);
3919 e_zoomap_child_edje_solid_setup(z);
3920 e_zoomap_smooth_set(z, conf->smooth_windows);
3921 e_zoomap_child_set(z, obj);
3922 e_zoomap_child_resize(z, w, h);
3923 evas_object_show(z);
3925 edje_object_signal_callback_add(o, "e,action,*,done", "e", _e_comp_object_util_done_defer, z);
3927 evas_object_intercept_show_callback_add(o, _e_comp_object_util_show, z);
3928 evas_object_intercept_hide_callback_add(o, _e_comp_object_util_hide, z);
3929 evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _e_comp_object_util_moveresize, z);
3930 evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, _e_comp_object_util_del, z);
3931 evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE, _e_comp_object_util_moveresize, z);
3932 evas_object_event_callback_add(o, EVAS_CALLBACK_RESTACK, _e_comp_object_util_restack, z);
3934 e_comp_object_signal_emit(o, "e,state,hidden", "e");
3936 edje_object_part_swallow(o, "e.swallow.content", z ?: obj);
3938 _e_comp_object_event_add(o);
3941 evas_object_show(o);
3946 /* utility functions for deleting objects when their "owner" is deleted */
3948 e_comp_object_util_del_list_append(Evas_Object *obj, Evas_Object *to_del)
3953 EINA_SAFETY_ON_NULL_RETURN(to_del);
3954 l = evas_object_data_get(obj, "comp_object-to_del");
3955 evas_object_data_set(obj, "comp_object-to_del", eina_list_append(l, to_del));
3956 evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _e_comp_object_util_del);
3957 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_util_del, NULL);
3961 e_comp_object_util_del_list_remove(Evas_Object *obj, Evas_Object *to_del)
3966 EINA_SAFETY_ON_NULL_RETURN(to_del);
3967 l = evas_object_data_get(obj, "comp_object-to_del");
3969 evas_object_data_set(obj, "comp_object-to_del", eina_list_remove(l, to_del));
3972 /////////////////////////////////////////////////////////
3974 EINTERN Evas_Object *
3975 e_comp_object_client_add(E_Client *ec)
3980 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, NULL);
3981 if (ec->frame) return NULL;
3982 _e_comp_smart_init();
3983 o = evas_object_smart_add(e_comp->evas, _e_comp_smart);
3984 cw = evas_object_smart_data_get(o);
3985 if (!cw) return NULL;
3986 evas_object_data_set(o, "E_Client", ec);
3989 evas_object_data_set(o, "comp_object", (void*)1);
3991 _e_comp_object_event_add(o);
3996 /* utility functions for getting client inset */
3998 e_comp_object_frame_xy_adjust(Evas_Object *obj, int x, int y, int *ax, int *ay)
4001 if (!cw->client_inset.calc)
4007 if (ax) *ax = x - cw->client_inset.l;
4008 if (ay) *ay = y - cw->client_inset.t;
4012 e_comp_object_frame_xy_unadjust(Evas_Object *obj, int x, int y, int *ax, int *ay)
4015 if (!cw->client_inset.calc)
4021 if (ax) *ax = x + cw->client_inset.l;
4022 if (ay) *ay = y + cw->client_inset.t;
4026 e_comp_object_frame_wh_adjust(Evas_Object *obj, int w, int h, int *aw, int *ah)
4029 if (!cw->client_inset.calc)
4035 if (aw) *aw = w + cw->client_inset.l + cw->client_inset.r;
4036 if (ah) *ah = h + cw->client_inset.t + cw->client_inset.b;
4040 e_comp_object_frame_wh_unadjust(Evas_Object *obj, int w, int h, int *aw, int *ah)
4043 if (!cw->client_inset.calc)
4049 if (aw) *aw = w - cw->client_inset.l - cw->client_inset.r;
4050 if (ah) *ah = h - cw->client_inset.t - cw->client_inset.b;
4054 e_comp_object_client_get(Evas_Object *obj)
4059 /* FIXME: remove this when eo is used */
4060 o = evas_object_data_get(obj, "comp_smart_obj");
4062 return e_comp_object_client_get(o);
4063 return cw ? cw->ec : NULL;
4067 e_comp_object_frame_extends_get(Evas_Object *obj, int *x, int *y, int *w, int *h)
4070 if (cw->frame_extends)
4071 edje_object_parts_extends_calc(cw->frame_object, x, y, w, h);
4076 if (w) *w = cw->ec->w;
4077 if (h) *h = cw->ec->h;
4082 e_comp_object_util_zone_get(Evas_Object *obj)
4084 E_Zone *zone = NULL;
4088 zone = cw->ec->zone;
4093 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
4094 zone = e_comp_zone_xy_get(x, y);
4100 e_comp_object_util_center(Evas_Object *obj)
4102 int x, y, w, h, ow, oh;
4107 zone = e_comp_object_util_zone_get(obj);
4108 EINA_SAFETY_ON_NULL_RETURN(zone);
4109 e_zone_useful_geometry_get(zone, &x, &y, &w, &h);
4110 if (cw && (cw->ec->changes.size || cw->ec->new_client))
4111 ow = cw->ec->w, oh = cw->ec->h;
4113 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
4114 x = x + (w - ow) / 2;
4115 y = y + (h - oh) / 2;
4116 evas_object_move(obj, x, y);
4120 e_comp_object_util_center_on(Evas_Object *obj, Evas_Object *on)
4122 int x, y, w, h, ow, oh;
4125 EINA_SAFETY_ON_NULL_RETURN(on);
4126 evas_object_geometry_get(on, &x, &y, &w, &h);
4127 if (cw && (cw->ec->changes.size || cw->ec->new_client))
4128 ow = cw->ec->w, oh = cw->ec->h;
4130 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
4131 evas_object_move(obj, x + (w / 2) - (ow / 2), y + (h / 2) - (oh / 2));
4135 e_comp_object_util_fullscreen(Evas_Object *obj)
4140 e_client_fullscreen(cw->ec, E_FULLSCREEN_RESIZE);
4143 evas_object_move(obj, 0, 0);
4144 evas_object_resize(obj, e_comp->w, e_comp->h);
4149 e_comp_object_util_center_pos_get(Evas_Object *obj, int *x, int *y)
4157 ow = cw->w, oh = cw->h;
4159 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
4160 zone = e_comp_object_util_zone_get(obj);
4161 e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh);
4162 if (x) *x = zx + (zw - ow) / 2;
4163 if (y) *y = zy + (zh - oh) / 2;
4167 e_comp_object_input_objs_del(Evas_Object *obj)
4170 E_Input_Rect_Data *input_rect_data;
4171 E_Input_Rect_Smart_Data *input_rect_sd;
4176 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4177 if (!input_rect_sd) return;
4179 EINA_LIST_FREE(input_rect_sd->input_rect_data_list, input_rect_data)
4181 if (input_rect_data->obj)
4183 evas_object_smart_member_del(input_rect_data->obj);
4184 E_FREE_FUNC(input_rect_data->obj, evas_object_del);
4186 E_FREE(input_rect_data);
4191 e_comp_object_input_area_set(Evas_Object *obj, int x, int y, int w, int h)
4194 E_Input_Rect_Data *input_rect_data = NULL;
4195 E_Input_Rect_Smart_Data *input_rect_sd;
4196 int client_w, client_h;
4198 if (cw->ec->client.w)
4199 client_w = cw->ec->client.w;
4201 client_w = cw->ec->w;
4203 if (cw->ec->client.h)
4204 client_h = cw->ec->client.h;
4206 client_h = cw->ec->h;
4208 E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, client_w, client_h);
4212 _e_comp_input_obj_smart_init();
4213 cw->input_obj = evas_object_smart_add(e_comp->evas, _e_comp_input_obj_smart);
4214 evas_object_smart_member_add(cw->input_obj, cw->smart_obj);
4215 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4218 input_rect_sd->cw = cw;
4221 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4224 input_rect_data = E_NEW(E_Input_Rect_Data, 1);
4225 if (input_rect_data)
4227 EINA_RECTANGLE_SET(&input_rect_data->rect, x, y, w, h);
4228 input_rect_sd->input_rect_data_list = eina_list_append(input_rect_sd->input_rect_data_list, input_rect_data);
4232 if ((input_rect_data) &&
4233 (x || y || (w != cw->ec->client.w) || (h != cw->ec->client.h)))
4235 input_rect_data->obj = evas_object_rectangle_add(e_comp->evas);
4236 evas_object_name_set(input_rect_data->obj, "cw->input_obj");
4237 evas_object_color_set(input_rect_data->obj, 0, 0, 0, 0);
4238 evas_object_clip_set(input_rect_data->obj, cw->clip);
4239 evas_object_smart_member_add(input_rect_data->obj, cw->input_obj);
4240 evas_object_geometry_set(input_rect_data->obj,
4241 MAX(cw->ec->client.x + (!!cw->frame_object * cw->client_inset.l), 0) + x,
4242 MAX(cw->ec->client.y + (!!cw->frame_object * cw->client_inset.t), 0) + y, w, h);
4243 evas_object_pass_events_set(cw->default_input_obj, 1);
4244 evas_object_pass_events_set(cw->obj, 1);
4247 evas_object_show(input_rect_data->obj);
4248 evas_object_show(cw->input_obj);
4253 evas_object_smart_member_del(cw->input_obj);
4254 E_FREE_FUNC(cw->input_obj, evas_object_del);
4255 evas_object_pass_events_set(cw->default_input_obj, 0);
4256 evas_object_pass_events_set(cw->obj, 0);
4261 e_comp_object_input_rect_get(Evas_Object *obj, Eina_List **list)
4264 E_Input_Rect_Smart_Data *input_rect_sd;
4265 E_Input_Rect_Data *input_rect_data;
4268 if (!cw->input_obj) return;
4270 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4273 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
4275 *list = eina_list_append(*list, &input_rect_data->rect);
4281 e_comp_object_frame_geometry_get(Evas_Object *obj, int *l, int *r, int *t, int *b)
4284 if (l) *l = cw->client_inset.l;
4285 if (r) *r = cw->client_inset.r;
4286 if (t) *t = cw->client_inset.t;
4287 if (b) *b = cw->client_inset.b;
4290 /* set geometry for CSD */
4292 e_comp_object_frame_geometry_set(Evas_Object *obj, int l, int r, int t, int b)
4298 if (cw->frame_object)
4299 CRI("ACK! ec:%p", cw->ec);
4300 if ((cw->client_inset.l == l) && (cw->client_inset.r == r) &&
4301 (cw->client_inset.t == t) && (cw->client_inset.b == b)) return;
4302 calc = cw->client_inset.calc;
4303 cw->client_inset.calc = l || r || t || b;
4304 eina_stringshare_replace(&cw->frame_theme, "borderless");
4305 if (cw->client_inset.calc)
4307 tw = cw->ec->w + ((l + r) - (cw->client_inset.l + cw->client_inset.r));
4308 th = cw->ec->h + ((t + b) - (cw->client_inset.t + cw->client_inset.b));
4309 e_client_size_set(cw->ec, tw, th);
4311 else if (cw->ec->maximized || cw->ec->fullscreen)
4313 cw->ec->saved.w -= ((l + r) - (cw->client_inset.l + cw->client_inset.r));
4314 cw->ec->saved.h -= ((t + b) - (cw->client_inset.t + cw->client_inset.b));
4316 if (!cw->ec->new_client)
4318 if (calc && cw->client_inset.calc)
4320 tx = cw->ec->x - (l - cw->client_inset.l);
4321 ty = cw->ec->y - (t - cw->client_inset.t);
4322 e_client_pos_set(cw->ec, tx, ty);
4324 cw->ec->changes.pos = cw->ec->changes.size = 1;
4327 cw->client_inset.l = l;
4328 cw->client_inset.r = r;
4329 cw->client_inset.t = t;
4330 cw->client_inset.b = b;
4334 e_comp_object_frame_allowed(Evas_Object *obj)
4336 API_ENTRY EINA_FALSE;
4337 return (!cw->ec->mwm.borderless) && (cw->frame_object || (!cw->client_inset.calc));
4341 e_comp_object_frame_title_set(Evas_Object *obj, const char *name)
4343 API_ENTRY EINA_FALSE;
4344 if (!e_util_strcmp(cw->frame_name, name)) return EINA_FALSE;
4345 eina_stringshare_replace(&cw->frame_name, name);
4346 if (cw->frame_object)
4347 edje_object_part_text_set(cw->frame_object, "e.text.title", cw->frame_name);
4352 e_comp_object_frame_exists(Evas_Object *obj)
4354 API_ENTRY EINA_FALSE;
4355 return !!cw->frame_object;
4359 e_comp_object_frame_theme_set(Evas_Object *obj, const char *name)
4361 Evas_Object *o, *pbg;
4364 Eina_Stringshare *theme;
4366 API_ENTRY EINA_FALSE;
4368 if (!e_util_strcmp(cw->frame_theme, name))
4369 return edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object ?: cw->obj);
4370 if (!e_util_strcmp(name, "COMP_RESHADOW"))
4371 return _e_comp_object_shadow_setup(cw);
4372 pbg = cw->frame_object;
4373 theme = eina_stringshare_add(name);
4375 if (cw->frame_object)
4379 w = cw->ec->w, h = cw->ec->h;
4380 e_comp_object_frame_wh_unadjust(obj, w, h, &cw->ec->w, &cw->ec->h);
4381 if ((cw->ec->w != w) || (cw->ec->h != h))
4383 cw->ec->changes.size = 1;
4386 E_FREE_FUNC(cw->frame_object, evas_object_del);
4387 if (!name) goto reshadow;
4389 o = edje_object_add(e_comp->evas);
4390 snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", name);
4391 ok = e_theme_edje_object_set(o, "base/theme/border", buf);
4392 if ((!ok) && (!e_util_strcmp(name, "borderless")))
4394 cw->frame_object = NULL;
4396 eina_stringshare_del(cw->frame_theme);
4397 cw->frame_theme = theme;
4402 if (theme != e_config->theme_default_border_style)
4404 snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", e_config->theme_default_border_style);
4405 ok = e_theme_edje_object_set(o, "base/theme/border", buf);
4409 ok = e_theme_edje_object_set(o, "base/theme/border",
4410 "e/widgets/border/default/border");
4411 if (ok && (theme == e_config->theme_default_border_style))
4413 /* Reset default border style to default */
4414 eina_stringshare_replace(&e_config->theme_default_border_style, "default");
4415 e_config_save_queue();
4422 cw->frame_object = o;
4423 eina_stringshare_del(cw->frame_theme);
4424 cw->frame_theme = theme;
4425 evas_object_name_set(o, "cw->frame_object");
4428 edje_object_part_text_set(o, "e.text.title", cw->frame_name);
4432 cw->ec->changes.icon = 1;
4438 CRI("USER IS USING A SHITTY THEME! ABORT!!!!");
4443 _e_comp_object_shadow_setup(cw);
4446 int old_x, old_y, new_x = 0, new_y = 0;
4448 old_x = cw->x, old_y = cw->y;
4450 _e_comp_smart_cb_frame_recalc(cw, cw->smart_obj, NULL);
4452 new_x = cw->ec->x, new_y = cw->ec->y;
4453 else if (cw->ec->placed || (!cw->ec->new_client))
4455 /* if no previous frame:
4456 * - reapply client_inset
4461 if (cw->ec->changes.size)
4468 x = cw->ec->client.x, y = cw->ec->client.y;
4469 x = MAX(cw->ec->zone->x, cw->ec->client.x - cw->client_inset.l);
4470 y = MAX(cw->ec->zone->y, cw->ec->client.y - cw->client_inset.t);
4472 new_x = x, new_y = y;
4475 if (old_x != new_x || old_y != new_y)
4477 /* this guarantees that we won't get blocked by the NOP check in the interceptor */
4478 cw->y = cw->x = -99999;
4479 evas_object_move(obj, new_x, new_y);
4483 if (cw->ec->maximized)
4485 cw->ec->changes.need_maximize = 1;
4488 evas_object_smart_callback_call(cw->smart_obj, "frame_changed", NULL);
4489 if (cw->frame_object)
4491 cw->frame_extends = !!edje_object_data_get(cw->frame_object, "frame_extends");
4494 cw->frame_extends = 0;
4495 evas_object_del(pbg);
4500 e_comp_object_signal_emit(Evas_Object *obj, const char *sig, const char *src)
4502 E_Comp_Object_Mover *prov;
4505 //INF("EMIT %p: %s %s", cw->ec, sig, src);
4506 edje_object_signal_emit(cw->shobj, sig, src);
4507 if (cw->frame_object) edje_object_signal_emit(cw->frame_object, sig, src);
4508 if ((cw->ec->override && e_comp_config_get()->match.disable_overrides) ||
4509 ((!cw->ec->override) && e_comp_config_get()->match.disable_borders))
4511 /* start with highest priority callback first */
4512 EINA_INLIST_REVERSE_FOREACH(_e_comp_object_movers, prov)
4514 if (!e_util_glob_match(sig, prov->sig)) continue;
4515 if (prov->func(prov->data, obj, sig)) break;
4520 e_comp_object_signal_callback_add(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb, const void *data)
4522 /* FIXME: at some point I guess this should use eo to inherit
4523 * -EDJE_OBJ_SUB_ID_SIGNAL_CALLBACK_ADD
4524 * -EDJE_OBJ_SUB_ID_SIGNAL_CALLBACK_DEL
4527 edje_object_signal_callback_add(cw->shobj, sig, src, cb, (void*)data);
4531 e_comp_object_signal_callback_del(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb)
4534 edje_object_signal_callback_del(cw->shobj, sig, src, cb);
4538 e_comp_object_signal_callback_del_full(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb, const void *data)
4541 edje_object_signal_callback_del_full(cw->shobj, sig, src, cb, (void*)data);
4545 e_comp_object_damage(Evas_Object *obj, int x, int y, int w, int h)
4548 Eina_Rectangle rect;
4551 if (cw->ec->input_only || (!cw->updates)) return;
4552 if (cw->nocomp) return;
4553 rect.x = x, rect.y = y;
4554 rect.w = w, rect.h = h;
4555 evas_object_smart_callback_call(obj, "damage", &rect);
4557 if (e_comp_is_on_overlay(cw->ec))
4559 /* It will not set hwc_need_update value if E modules already cleanup pixmap
4560 * resource on the E_COMP_WL_HOOK_BUFFER_CHANGE hook function. It means that
4561 * E module attempts to block screen update due to the particular policy.
4563 if (e_pixmap_resource_get(cw->ec->pixmap))
4564 cw->hwc_need_update = EINA_TRUE;
4567 /* ignore overdraw */
4568 if (cw->updates_full)
4570 RENDER_DEBUG("IGNORED %p: %d,%d %dx%d", cw->ec, x, y, w, h);
4571 e_comp_object_render_update_add(obj);
4573 if ((cw->ec->visible) && (!evas_object_visible_get(cw->smart_obj)) && (!cw->ec->iconic))
4574 evas_object_show(cw->smart_obj);
4578 /* clip rect to client surface */
4579 RENDER_DEBUG("DAMAGE(%d,%d %dx%d) CLIP(%dx%d)", x, y, w, h, cw->ec->client.w, cw->ec->client.h);
4580 E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, cw->ec->client.w, cw->ec->client.h);
4581 /* if rect is the total size of the client after clip, clear the updates
4582 * since this is guaranteed to be the whole region anyway
4584 eina_tiler_area_size_get(cw->updates, &tw, &th);
4585 if ((w > tw) || (h > th))
4587 RENDER_DEBUG("DAMAGE RESIZE %p: %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
4588 eina_tiler_clear(cw->updates);
4589 eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
4591 tw = cw->ec->client.w, th = cw->ec->client.h;
4593 if ((!x) && (!y) && (w == tw) && (h == th))
4595 eina_tiler_clear(cw->updates);
4596 RENDER_DEBUG("DAMAGE FULL: %p", cw->ec);
4597 cw->updates_full = 1;
4598 cw->update_count = 0;
4601 if (cw->update_count > UPDATE_MAX)
4603 /* this is going to get really dumb, so just update the whole thing */
4604 eina_tiler_clear(cw->updates);
4605 cw->update_count = cw->updates_full = 1;
4606 eina_tiler_rect_add(cw->updates, &(Eina_Rectangle){0, 0, tw, th});
4607 RENDER_DEBUG("DAMAGE MAX: %dx%d", tw, th);
4611 eina_tiler_rect_add(cw->updates, &(Eina_Rectangle){x, y, w, h});
4612 RENDER_DEBUG("DAMAGE: %d,%d %dx%d", x, y, w, h);
4614 cw->updates_exist = 1;
4615 e_comp_object_render_update_add(obj);
4617 if ((cw->ec->visible) && (!evas_object_visible_get(cw->smart_obj)) && (!cw->ec->iconic))
4618 evas_object_show(cw->smart_obj);
4622 e_comp_object_damage_exists(Evas_Object *obj)
4624 API_ENTRY EINA_FALSE;
4625 return cw->updates_exist;
4629 e_comp_object_render_update_add(Evas_Object *obj)
4633 if (cw->ec->input_only || (!cw->updates) || (!cw->redirected)) return;
4634 if (cw->render_update_lock.lock) return;
4635 if (e_object_is_del(E_OBJECT(cw->ec)))
4636 CRI("CAN'T RENDER A DELETED CLIENT!!! ec:%p", cw->ec);
4637 if (!e_pixmap_usable_get(cw->ec->pixmap)) return;
4641 e_comp->updates = eina_list_append(e_comp->updates, cw->ec);
4643 e_comp_render_queue();
4647 e_comp_object_render_update_del(Evas_Object *obj)
4651 if (cw->ec->input_only || (!cw->updates)) return;
4652 if (!cw->update) return;
4654 /* this gets called during comp animating to clear the update flag */
4655 if (e_comp->grabbed) return;
4656 e_comp->updates = eina_list_remove(e_comp->updates, cw->ec);
4657 if (!e_comp->updates)
4659 E_FREE_FUNC(e_comp->update_job, ecore_job_del);
4660 if (e_comp->render_animator)
4661 ecore_animator_freeze(e_comp->render_animator);
4666 e_comp_object_shape_apply(Evas_Object *obj)
4670 unsigned int i, *pix, *p;
4674 if (!cw->ec) return; //NYI
4675 if (cw->external_content) return;
4678 if ((cw->ec->shape_rects_num >= 1) &&
4679 (!_e_comp_shaped_check(cw->ec->client.w, cw->ec->client.h, cw->ec->shape_rects, cw->ec->shape_rects_num)))
4684 ERR("BUGGER: shape with native surface? cw=%p", cw);
4687 evas_object_image_size_get(cw->obj, &w, &h);
4688 if ((w < 1) || (h < 1)) return;
4691 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4692 _e_comp_object_alpha_set(cw);
4693 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4694 evas_object_image_alpha_set(o, 1);
4696 p = pix = evas_object_image_data_get(cw->obj, 1);
4699 evas_object_image_data_set(cw->obj, pix);
4704 unsigned char *spix, *sp;
4706 spix = calloc(w * h, sizeof(unsigned char));
4708 for (i = 0; i < cw->ec->shape_rects_num; i++)
4712 rx = cw->ec->shape_rects[i].x; ry = cw->ec->shape_rects[i].y;
4713 rw = cw->ec->shape_rects[i].w; rh = cw->ec->shape_rects[i].h;
4714 E_RECTS_CLIP_TO_RECT(rx, ry, rw, rh, 0, 0, w, h);
4715 sp = spix + (w * ry) + rx;
4716 for (py = 0; py < rh; py++)
4718 for (px = 0; px < rw; px++)
4726 for (py = 0; py < h; py++)
4728 for (px = 0; px < w; px++)
4730 unsigned int mask, imask;
4732 mask = ((unsigned int)(*sp)) << 24;
4734 imask |= imask >> 8;
4735 imask |= imask >> 8;
4736 *p = mask | (*p & imask);
4737 //if (*sp) *p = 0xff000000 | *p;
4738 //else *p = 0x00000000;
4747 for (py = 0; py < h; py++)
4749 for (px = 0; px < w; px++)
4753 evas_object_image_data_set(cw->obj, pix);
4754 evas_object_image_data_update_add(cw->obj, 0, 0, w, h);
4755 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4757 evas_object_image_data_set(o, pix);
4758 evas_object_image_data_update_add(o, 0, 0, w, h);
4760 // don't need to fix alpha chanel as blending
4761 // should be totally off here regardless of
4762 // alpha channel content
4766 _e_comp_object_clear(E_Comp_Object *cw)
4771 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
4773 if (cw->render_update_lock.lock) return;
4776 e_pixmap_clear(cw->ec->pixmap);
4778 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4779 evas_object_image_size_set(cw->obj, 1, 1);
4780 evas_object_image_data_set(cw->obj, NULL);
4781 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4783 evas_object_image_size_set(o, 1, 1);
4784 evas_object_image_data_set(o, NULL);
4787 e_comp_object_render_update_del(cw->smart_obj);
4791 _e_comp_object_transparent_set(Evas_Object *obj, Eina_Bool set)
4795 API_ENTRY EINA_FALSE;
4797 if (cw->transparent.set == set)
4802 evas_object_color_get(obj, &r, &g, &b, &a);
4803 evas_object_color_set(obj, 0, 0, 0, 0);
4805 cw->transparent.user_r = r;
4806 cw->transparent.user_g = g;
4807 cw->transparent.user_b = b;
4808 cw->transparent.user_a = a;
4810 ELOGF("COMP", "Transparent enabled user_color(%d,%d,%d,%d)",
4812 cw->transparent.user_r,
4813 cw->transparent.user_g,
4814 cw->transparent.user_b,
4815 cw->transparent.user_a);
4817 cw->transparent.set = EINA_TRUE;
4821 cw->transparent.set = EINA_FALSE;
4823 evas_object_color_set(obj,
4824 cw->transparent.user_r,
4825 cw->transparent.user_g,
4826 cw->transparent.user_b,
4827 cw->transparent.user_a);
4829 ELOGF("COMP", "Transparent disabled user_color(%d,%d,%d,%d)",
4831 cw->transparent.user_r,
4832 cw->transparent.user_g,
4833 cw->transparent.user_b,
4834 cw->transparent.user_a);
4840 /* helper function to simplify toggling of redirection for display servers which support it */
4842 e_comp_object_redirected_set(Evas_Object *obj, Eina_Bool set)
4847 if (cw->redirected == set) return;
4848 cw->redirected = set;
4849 if (cw->external_content) return;
4851 e_comp_object_map_update(obj);
4855 if (cw->updates_exist)
4856 e_comp_object_render_update_add(obj);
4858 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4860 _e_comp_object_transparent_set(obj, EINA_FALSE);
4861 evas_object_smart_callback_call(obj, "redirected", NULL);
4865 _e_comp_object_clear(cw);
4866 _e_comp_object_transparent_set(obj, EINA_TRUE);
4867 evas_object_smart_callback_call(obj, "unredirected", NULL);
4872 _e_comp_object_cb_buffer_destroy(struct wl_listener *listener, void *data EINA_UNUSED)
4875 cw = container_of(listener, E_Comp_Object, buffer_destroy_listener);
4877 if (cw->buffer_destroy_listener.notify)
4879 cw->buffer_destroy_listener.notify = NULL;
4880 wl_list_remove(&cw->buffer_destroy_listener.link);
4883 if (e_object_is_del(E_OBJECT(cw->ec)))
4885 if (!e_object_delay_del_ref_get(E_OBJECT(cw->ec)))
4890 /* if it's current displaying buffer, do not remove its content */
4891 if (!evas_object_visible_get(cw->ec->frame))
4892 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4897 _e_comp_object_native_surface_set(E_Comp_Object *cw, Evas_Native_Surface *ns, Eina_Bool with_mirror)
4902 if (cw->buffer_destroy_listener.notify)
4904 wl_list_remove(&cw->buffer_destroy_listener.link);
4905 cw->buffer_destroy_listener.notify = NULL;
4908 if (cw->tbm_surface)
4910 tbm_surface_internal_unref(cw->tbm_surface);
4911 cw->tbm_surface = NULL;
4916 if ((ns->type == EVAS_NATIVE_SURFACE_WL) && (ns->data.wl.legacy_buffer))
4918 cw->buffer_destroy_listener.notify = _e_comp_object_cb_buffer_destroy;
4919 wl_resource_add_destroy_listener((struct wl_resource *)ns->data.wl.legacy_buffer, &cw->buffer_destroy_listener);
4921 else if ((ns->type == EVAS_NATIVE_SURFACE_TBM) && (ns->data.tbm.buffer))
4923 tbm_surface_internal_ref(ns->data.tbm.buffer);
4924 cw->tbm_surface = ns->data.tbm.buffer;
4928 TRACE_DS_BEGIN(NATIVE_SURFACE_SET);
4929 evas_object_image_native_surface_set(cw->obj, ns);
4933 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4935 evas_object_image_alpha_set(o, !!cw->ns ? 1 : cw->ec->argb);
4936 TRACE_DS_BEGIN(NATIVE_SURFACE_SET);
4937 evas_object_image_native_surface_set(o, ns);
4944 e_comp_object_native_surface_set(Evas_Object *obj, Eina_Bool set)
4946 Evas_Native_Surface ns;
4949 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
4950 if (cw->ec->input_only) return;
4951 if (cw->external_content) return;
4952 if (cw->render_update_lock.lock) return;
4955 memset(&ns, 0, sizeof(Evas_Native_Surface));
4959 /* native requires gl enabled, texture from pixmap enabled, and a non-shaped client */
4960 set = (!cw->ec->shaped);
4962 set = (!!cw->ns) || e_pixmap_native_surface_init(cw->ec->pixmap, &ns);
4966 _e_comp_object_native_surface_set(cw, set && (!cw->blanked) ? (cw->ns ? cw->ns : &ns) : NULL, EINA_TRUE);
4970 e_comp_object_native_surface_override(Evas_Object *obj, Evas_Native_Surface *ns)
4973 if (cw->ec->input_only) return;
4976 cw->ns = (Evas_Native_Surface*)eina_memdup((unsigned char*)ns, sizeof(Evas_Native_Surface), 0);
4977 _e_comp_object_alpha_set(cw);
4979 e_comp_object_native_surface_set(obj, cw->native);
4980 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4984 e_comp_object_blank(Evas_Object *obj, Eina_Bool set)
4990 if (cw->blanked == set) return;
4992 _e_comp_object_alpha_set(cw);
4995 _e_comp_object_native_surface_set(cw, NULL, EINA_FALSE);
4996 evas_object_image_data_set(cw->obj, NULL);
5000 e_comp_object_native_surface_set(obj, 1);
5001 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
5005 _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)
5010 if (!_damage_trace) return;
5014 if (!evas_object_visible_get(cw->obj)) return;
5016 evas_object_geometry_get(cw->obj, &obj_x, &obj_y, NULL, NULL);
5018 o = evas_object_rectangle_add(e_comp->evas);
5019 evas_object_layer_set(o, E_LAYER_MAX);
5020 evas_object_name_set(o, "damage_trace");
5021 evas_object_move(o, dmg_x + obj_x, dmg_y + obj_y);
5022 evas_object_resize(o, dmg_w, dmg_h);
5023 evas_object_color_set(o, 0, 128, 0, 128);
5024 evas_object_render_op_set(o, EVAS_RENDER_BLEND);
5025 evas_object_pass_events_set(o, EINA_TRUE);
5026 evas_object_show(o);
5028 ELOGF("COMP", "add damage(%dx%d+%d+%d) origin(%dx%d+%d+%d)",
5030 dmg_w, dmg_h, dmg_x, dmg_y,
5031 origin->w, origin->h, origin->x, origin->y);
5033 _damage_trace_objs = eina_list_append(_damage_trace_objs, o);
5036 /* mark an object as dirty and setup damages */
5038 e_comp_object_dirty(Evas_Object *obj)
5041 Eina_Rectangle *rect;
5045 Eina_Bool dirty, visible;
5049 if (cw->external_content) return;
5050 if (!cw->redirected) return;
5051 if (cw->render_update_lock.lock)
5053 ELOGF("COMP", "Render update locked:%d", cw->ec, cw->render_update_lock.lock);
5056 /* only actually dirty if pixmap is available */
5057 if (!e_pixmap_resource_get(cw->ec->pixmap))
5059 // e_pixmap_size_get returns last attached buffer size
5060 // eventhough it is destroyed
5061 ERR("ERROR NO PIXMAP FOR ec:%p", cw->ec);
5064 dirty = e_pixmap_size_get(cw->ec->pixmap, &w, &h);
5065 visible = cw->visible;
5066 if (!dirty) w = h = 1;
5067 evas_object_image_pixels_dirty_set(cw->obj, cw->blanked ? 0 : dirty);
5069 evas_object_image_data_set(cw->obj, NULL);
5070 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
5071 evas_object_image_size_set(cw->obj, tw, th);
5072 if (cw->mask.obj) evas_object_resize(cw->mask.obj, w, h);
5073 if (cw->pending_updates)
5074 eina_tiler_area_size_set(cw->pending_updates, w, h);
5075 EINA_LIST_FOREACH(cw->obj_mirror, ll, o)
5077 evas_object_image_pixels_dirty_set(o, dirty);
5079 evas_object_image_data_set(o, NULL);
5080 evas_object_image_size_set(o, tw, th);
5081 visible |= evas_object_visible_get(o);
5085 ERR("ERROR FETCHING PIXMAP FOR %p", cw->ec);
5089 e_comp_object_native_surface_set(obj, 1);
5091 m = _e_comp_object_map_damage_transform_get(cw->ec);
5092 it = eina_tiler_iterator_new(cw->updates);
5093 EINA_ITERATOR_FOREACH(it, rect)
5095 /* evas converts damage according to rotation of ecore_evas in damage_region_set
5096 * of evas engine and doesn't convert damage according to evas_map.
5097 * so damage of evas_object_image use surface coordinate.
5101 int damage_x, damage_y, damage_w, damage_h;
5103 _e_comp_object_map_damage_transform_rect(cw->ec, m, rect->x, rect->y, rect->w, rect->h,
5104 &damage_x, &damage_y, &damage_w, &damage_h);
5105 evas_object_image_data_update_add(cw->obj, damage_x, damage_y, damage_w, damage_h);
5106 _e_comp_object_damage_trace_rect_set(obj, rect, damage_x, damage_y, damage_w, damage_h);
5110 evas_object_image_data_update_add(cw->obj, rect->x, rect->y, rect->w, rect->h);
5111 _e_comp_object_damage_trace_rect_set(obj, rect, rect->x, rect->y, rect->w, rect->h);
5114 EINA_LIST_FOREACH(cw->obj_mirror, ll, o)
5115 evas_object_image_data_update_add(o, rect->x, rect->y, rect->w, rect->h);
5116 if (cw->pending_updates)
5117 eina_tiler_rect_add(cw->pending_updates, rect);
5119 eina_iterator_free(it);
5120 if (m) e_map_free(m);
5121 if (cw->pending_updates)
5122 eina_tiler_clear(cw->updates);
5125 cw->pending_updates = cw->updates;
5126 cw->updates = eina_tiler_new(w, h);
5127 eina_tiler_tile_size_set(cw->updates, 1, 1);
5129 cw->update_count = cw->updates_full = cw->updates_exist = 0;
5130 evas_object_smart_callback_call(obj, "dirty", NULL);
5131 if (cw->visible || (!visible) || (!cw->pending_updates) || cw->native) return;
5132 /* force render if main object is hidden but mirrors are visible */
5133 RENDER_DEBUG("FORCING RENDER %p", cw->ec);
5134 e_comp_object_render(obj);
5138 e_comp_object_render(Evas_Object *obj)
5145 API_ENTRY EINA_FALSE;
5147 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5148 if (cw->ec->input_only) return EINA_TRUE;
5149 if (cw->external_content) return EINA_TRUE;
5150 if (cw->native) return EINA_FALSE;
5151 /* if comp object is not redirected state, comp object should not be set by newly committed data
5152 because image size of comp object is 1x1 and it should not be shown on canvas */
5153 if (!cw->redirected) return EINA_TRUE;
5154 if (cw->render_update_lock.lock)
5156 ELOGF("COMP", "Render update locked:%d", cw->ec, cw->render_update_lock.lock);
5159 e_comp_object_render_update_del(obj);
5160 if (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph)) return EINA_FALSE;
5162 if (!cw->pending_updates)
5164 WRN("RENDER [%p]: NO RECTS!", cw->ec);
5165 evas_object_image_data_set(cw->obj, NULL);
5166 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
5167 evas_object_image_data_set(o, NULL);
5171 evas_object_image_pixels_dirty_set(cw->obj, EINA_FALSE);
5173 RENDER_DEBUG("RENDER SIZE: %dx%d", pw, ph);
5175 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5178 e_pixmap_image_refresh(cw->ec->pixmap);
5179 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5182 if ((pix) && ((!cw->blanked) || (cw->obj_mirror)))
5183 e_pixmap_image_data_ref(cw->ec->pixmap);
5185 /* set pixel data */
5186 evas_object_image_data_set(cw->obj, cw->blanked ? NULL : pix);
5187 _e_comp_object_alpha_set(cw);
5188 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
5190 evas_object_image_data_set(o, pix);
5191 evas_object_image_alpha_set(o, evas_object_image_alpha_get(cw->obj));
5192 evas_object_image_pixels_dirty_set(o, EINA_FALSE);
5195 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
5197 e_comp_client_post_update_add(cw->ec);
5202 /* create a duplicate of an evas object */
5203 EINTERN Evas_Object *
5204 e_comp_object_util_mirror_add(Evas_Object *obj)
5208 unsigned int *pix = NULL;
5209 Eina_Bool argb = EINA_FALSE;
5214 cw = evas_object_data_get(obj, "comp_mirror");
5217 o = evas_object_image_filled_add(evas_object_evas_get(obj));
5218 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
5219 evas_object_image_smooth_scale_set(o, e_comp_config_get()->smooth_windows);
5220 evas_object_image_alpha_set(o, 1);
5221 evas_object_image_source_set(o, obj);
5224 if ((!cw->ec) || (!e_pixmap_size_get(cw->ec->pixmap, &w, &h))) return NULL;
5225 if (cw->external_content)
5227 ERR("%p of client %p is external content.", obj, cw->ec);
5230 o = evas_object_image_filled_add(evas_object_evas_get(obj));
5231 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
5232 evas_object_image_smooth_scale_set(o, e_comp_config_get()->smooth_windows);
5233 cw->obj_mirror = eina_list_append(cw->obj_mirror, o);
5234 evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, _e_comp_object_cb_mirror_del, cw);
5235 evas_object_event_callback_add(o, EVAS_CALLBACK_SHOW, _e_comp_object_cb_mirror_show, cw);
5236 evas_object_event_callback_add(o, EVAS_CALLBACK_HIDE, _e_comp_object_cb_mirror_hide, cw);
5237 evas_object_data_set(o, "E_Client_Mirror", cw->ec);
5238 evas_object_data_set(o, "comp_mirror", cw);
5240 evas_object_image_alpha_set(o, evas_object_image_alpha_get(cw->obj));
5241 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
5243 evas_object_image_size_set(o, tw, th);
5246 pix = evas_object_image_data_get(cw->obj, 0);
5252 evas_object_image_native_surface_set(o, cw->ns);
5255 Evas_Native_Surface ns;
5256 memset(&ns, 0, sizeof(Evas_Native_Surface));
5257 if (e_pixmap_native_surface_init(cw->ec->pixmap, &ns))
5258 evas_object_image_native_surface_set(o, &ns);
5263 /* FIXME: legacy code, please refer to commit 5e6831187a1 */
5264 argb = e_pixmap_image_is_argb(cw->ec->pixmap);
5266 (e_pixmap_image_exists(cw->ec->pixmap)))
5267 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5269 pix = evas_object_image_data_get(cw->obj, EINA_FALSE);
5276 dirty = evas_object_image_pixels_dirty_get(cw->obj);
5277 evas_object_image_pixels_dirty_set(o, dirty);
5278 evas_object_image_data_set(o, pix);
5279 evas_object_image_data_set(cw->obj, pix);
5281 evas_object_image_data_update_add(o, 0, 0, tw, th);
5286 //////////////////////////////////////////////////////
5289 e_comp_object_effect_allowed_get(Evas_Object *obj)
5291 API_ENTRY EINA_FALSE;
5293 if (!cw->shobj) return EINA_FALSE;
5294 if (cw->ec->override) return !e_comp_config_get()->match.disable_overrides;
5295 return !e_comp_config_get()->match.disable_borders;
5298 /* setup an api effect for a client */
5300 e_comp_object_effect_set(Evas_Object *obj, const char *effect)
5303 Eina_Stringshare *grp;
5304 E_Comp_Config *config;
5305 Eina_Bool loaded = EINA_FALSE;
5307 API_ENTRY EINA_FALSE;
5308 if (!cw->shobj) return EINA_FALSE; //input window
5310 if (!effect) effect = "none";
5311 snprintf(buf, sizeof(buf), "e/comp/effects/%s", effect);
5313 config = e_comp_config_get();
5314 if ((config) && (config->effect_file))
5316 if (edje_object_file_set(cw->effect_obj, config->effect_file, buf))
5318 cw->effect_set = EINA_TRUE;
5325 edje_object_file_get(cw->effect_obj, NULL, &grp);
5326 cw->effect_set = !eina_streq(effect, "none");
5327 if (!e_util_strcmp(buf, grp)) return cw->effect_set;
5328 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", buf))
5330 snprintf(buf, sizeof(buf), "e/comp/effects/auto/%s", effect);
5331 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", buf))
5332 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", "e/comp/effects/none"))
5334 if (cw->effect_running)
5336 if (!e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb")))
5339 cw->effect_set = EINA_FALSE;
5340 return cw->effect_set;
5344 if (cw->effect_running)
5346 if (!e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb")))
5349 ELOGF("COMP", "EFFECT Set GROUP[%s]", cw->ec, buf);
5350 edje_object_part_swallow(cw->effect_obj, "e.swallow.content", cw->shobj);
5351 if (cw->effect_clip)
5353 evas_object_clip_unset(cw->clip);
5354 cw->effect_clip = 0;
5356 cw->effect_clip_able = !edje_object_data_get(cw->effect_obj, "noclip");
5358 _e_comp_object_dim_update(cw);
5360 return cw->effect_set;
5363 /* set params for embryo scripts in effect */
5365 e_comp_object_effect_params_set(Evas_Object *obj, int id, int *params, unsigned int count)
5367 Edje_Message_Int_Set *msg;
5371 EINA_SAFETY_ON_NULL_RETURN(params);
5372 EINA_SAFETY_ON_FALSE_RETURN(count);
5373 if (!cw->effect_set) return;
5375 msg = alloca(sizeof(Edje_Message_Int_Set) + ((count - 1) * sizeof(int)));
5376 msg->count = (int)count;
5377 for (x = 0; x < count; x++)
5378 msg->val[x] = params[x];
5379 edje_object_message_send(cw->effect_obj, EDJE_MESSAGE_INT_SET, id, msg);
5380 edje_object_message_signal_process(cw->effect_obj);
5384 _e_comp_object_effect_end_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
5386 Edje_Signal_Cb end_cb;
5388 E_Comp_Object *cw = data;
5390 edje_object_signal_callback_del_full(obj, "e,action,done", "e", _e_comp_object_effect_end_cb, NULL);
5391 cw->effect_running = 0;
5392 if (!_e_comp_object_animating_end(cw)) return;
5394 if (evas_object_data_get(cw->smart_obj, "effect_running"))
5396 evas_object_data_del(cw->smart_obj, "effect_running");
5397 _e_comp_object_event_simple(obj, E_EVENT_COMP_OBJECT_EFFECT_END);
5398 e_client_visibility_calculate();
5401 end_cb = evas_object_data_get(obj, "_e_comp.end_cb");
5402 if (!end_cb) return;
5403 end_data = evas_object_data_get(obj, "_e_comp.end_data");
5404 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_END, cw->ec);
5405 end_cb(end_data, cw->smart_obj, emission, source);
5408 /* clip effect to client's zone */
5410 e_comp_object_effect_clip(Evas_Object *obj)
5413 if (!cw->ec->zone) return;
5414 if (cw->effect_clip) e_comp_object_effect_unclip(cw->smart_obj);
5415 if (!cw->effect_clip_able) return;
5416 evas_object_clip_set(cw->smart_obj, cw->ec->zone->bg_clip_object);
5417 cw->effect_clip = 1;
5420 /* unclip effect from client's zone */
5422 e_comp_object_effect_unclip(Evas_Object *obj)
5425 if (!cw->effect_clip) return;
5426 evas_object_clip_unset(cw->smart_obj);
5427 cw->effect_clip = 0;
5430 /* start effect, running end_cb after */
5432 e_comp_object_effect_start(Evas_Object *obj, Edje_Signal_Cb end_cb, const void *end_data)
5434 API_ENTRY EINA_FALSE;
5435 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE); //NYI
5436 if (!cw->effect_set) return EINA_FALSE;
5438 if (cw->effect_running)
5440 e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb"));
5443 e_comp_object_effect_clip(obj);
5444 edje_object_signal_callback_del(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb);
5446 edje_object_signal_callback_add(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb, cw);
5447 evas_object_data_set(cw->effect_obj, "_e_comp.end_cb", end_cb);
5448 evas_object_data_set(cw->effect_obj, "_e_comp.end_data", end_data);
5449 evas_object_data_set(cw->smart_obj, "effect_running", (void*)1);
5451 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_START, cw->ec);
5452 _e_comp_object_event_simple(obj, E_EVENT_COMP_OBJECT_EFFECT_START);
5454 edje_object_signal_emit(cw->effect_obj, "e,action,go", "e");
5455 _e_comp_object_animating_begin(cw);
5456 cw->effect_running = 1;
5460 /* stop a currently-running effect immediately */
5462 e_comp_object_effect_stop(Evas_Object *obj, Edje_Signal_Cb end_cb)
5465 Edje_Signal_Cb end_cb_before = NULL;
5466 void *end_data_before = NULL;
5467 API_ENTRY EINA_FALSE;
5469 end_cb_before = evas_object_data_get(cw->effect_obj, "_e_comp.end_cb");
5470 end_data_before = evas_object_data_get(cw->effect_obj, "_e_comp.end_data");
5472 if (end_cb_before != end_cb) return EINA_TRUE;
5473 e_comp_object_effect_unclip(obj);
5474 if (cw->effect_clip)
5476 evas_object_clip_unset(cw->effect_obj);
5477 cw->effect_clip = 0;
5479 edje_object_signal_emit(cw->effect_obj, "e,action,stop", "e");
5480 edje_object_signal_callback_del_full(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb, cw);
5482 if (evas_object_data_get(cw->smart_obj, "effect_running"))
5484 evas_object_data_del(cw->smart_obj, "effect_running");
5485 e_client_visibility_calculate();
5488 cw->effect_running = 0;
5489 ret = _e_comp_object_animating_end(cw);
5491 if ((ret) && (end_cb_before))
5493 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_END, cw->ec);
5494 end_cb_before(end_data_before, cw->smart_obj, "e,action,done", "e");
5501 _e_comp_object_effect_mover_sort_cb(E_Comp_Object_Mover *a, E_Comp_Object_Mover *b)
5503 return a->pri - b->pri;
5506 /* add a function to trigger based on signal emissions for the purpose of modifying effects */
5507 E_API E_Comp_Object_Mover *
5508 e_comp_object_effect_mover_add(int pri, const char *sig, E_Comp_Object_Mover_Cb provider, const void *data)
5510 E_Comp_Object_Mover *prov;
5512 prov = E_NEW(E_Comp_Object_Mover, 1);
5513 EINA_SAFETY_ON_NULL_RETURN_VAL(prov, NULL);
5514 prov->func = provider;
5515 prov->data = (void*)data;
5518 _e_comp_object_movers = eina_inlist_sorted_insert(_e_comp_object_movers, EINA_INLIST_GET(prov),
5519 (Eina_Compare_Cb)_e_comp_object_effect_mover_sort_cb);
5524 e_comp_object_effect_mover_del(E_Comp_Object_Mover *prov)
5526 EINA_SAFETY_ON_NULL_RETURN(prov);
5527 _e_comp_object_movers = eina_inlist_remove(_e_comp_object_movers, EINA_INLIST_GET(prov));
5532 e_comp_object_effect_object_get(Evas_Object *obj)
5536 return cw->effect_obj;
5540 e_comp_object_effect_hiding_set(Evas_Object *obj, Eina_Bool set)
5542 API_ENTRY EINA_FALSE;
5543 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5544 if (!cw->effect_set) return EINA_FALSE;
5551 ////////////////////////////////////
5554 _e_comp_object_autoclose_cleanup(Eina_Bool already_del)
5556 if (e_comp->autoclose.obj)
5558 e_comp_ungrab_input(0, 1);
5559 if (e_comp->autoclose.del_cb)
5560 e_comp->autoclose.del_cb(e_comp->autoclose.data, e_comp->autoclose.obj);
5561 else if (!already_del)
5563 evas_object_hide(e_comp->autoclose.obj);
5564 E_FREE_FUNC(e_comp->autoclose.obj, evas_object_del);
5566 E_FREE_FUNC(e_comp->autoclose.rect, evas_object_del);
5568 e_comp->autoclose.obj = NULL;
5569 e_comp->autoclose.data = NULL;
5570 e_comp->autoclose.del_cb = NULL;
5571 e_comp->autoclose.key_cb = NULL;
5572 E_FREE_FUNC(e_comp->autoclose.key_handler, ecore_event_handler_del);
5576 _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)
5578 _e_comp_object_autoclose_cleanup(0);
5582 _e_comp_object_autoclose_setup(Evas_Object *obj)
5584 if (!e_comp->autoclose.rect)
5586 /* create rect just below autoclose object to catch mouse events */
5587 e_comp->autoclose.rect = evas_object_rectangle_add(e_comp->evas);
5588 evas_object_move(e_comp->autoclose.rect, 0, 0);
5589 evas_object_resize(e_comp->autoclose.rect, e_comp->w, e_comp->h);
5590 evas_object_show(e_comp->autoclose.rect);
5591 evas_object_name_set(e_comp->autoclose.rect, "e_comp->autoclose.rect");
5592 evas_object_color_set(e_comp->autoclose.rect, 0, 0, 0, 0);
5593 evas_object_event_callback_add(e_comp->autoclose.rect, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_autoclose_mouse_up_cb, e_comp);
5594 e_comp_grab_input(0, 1);
5596 evas_object_layer_set(e_comp->autoclose.rect, evas_object_layer_get(obj) - 1);
5597 evas_object_focus_set(obj, 1);
5601 _e_comp_object_autoclose_show(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
5603 _e_comp_object_autoclose_setup(obj);
5604 evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show);
5608 _e_comp_object_autoclose_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
5610 evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show);
5611 _e_comp_object_autoclose_cleanup(1);
5612 if (e_client_focused_get()) return;
5613 if (e_config->focus_policy != E_FOCUS_MOUSE)
5618 e_comp_object_util_autoclose(Evas_Object *obj, E_Comp_Object_Autoclose_Cb del_cb, E_Comp_Object_Key_Cb cb, const void *data)
5622 if (e_comp->autoclose.obj)
5624 if (e_comp->autoclose.obj == obj) return;
5625 evas_object_event_callback_del_full(e_comp->autoclose.obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5626 e_comp->autoclose.obj = obj;
5627 e_comp->autoclose.del_cb = del_cb;
5628 e_comp->autoclose.key_cb = cb;
5629 e_comp->autoclose.data = (void*)data;
5630 if (evas_object_visible_get(obj))
5631 _e_comp_object_autoclose_setup(obj);
5633 evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show, e_comp);
5634 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5637 e_comp->autoclose.obj = obj;
5638 e_comp->autoclose.del_cb = del_cb;
5639 e_comp->autoclose.key_cb = cb;
5640 e_comp->autoclose.data = (void*)data;
5641 if (evas_object_visible_get(obj))
5642 _e_comp_object_autoclose_setup(obj);
5644 evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show, e_comp);
5645 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5649 e_comp_object_is_animating(Evas_Object *obj)
5653 return cw->animating;
5657 e_comp_object_alpha_set(Evas_Object *obj, Eina_Bool alpha)
5661 if ((cw->external_content) &&
5662 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
5664 WRN("Can set up alpha value to ONLY evas \"image\" object. "
5665 "But current external content is %d object for %p.",
5666 cw->content_type, cw->ec);
5670 cw->user_alpha_set = EINA_TRUE;
5671 cw->user_alpha = alpha;
5673 if (!cw->obj) return;
5675 if (alpha == evas_object_image_alpha_get(cw->obj)) return;
5677 evas_object_image_alpha_set(cw->obj, alpha);
5679 if ((!cw->native) && (!cw->external_content))
5680 evas_object_image_data_set(cw->obj, NULL);
5684 e_comp_object_alpha_get(Evas_Object *obj)
5686 API_ENTRY EINA_FALSE;
5688 return evas_object_image_alpha_get(cw->obj);
5692 e_comp_object_mask_set(Evas_Object *obj, Eina_Bool set)
5694 Eina_Bool mask_set = EINA_FALSE;
5698 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5699 if (cw->ec->input_only) return;
5706 o = evas_object_rectangle_add(e_comp->evas);
5707 evas_object_color_set(o, 0, 0, 0, 0);
5708 evas_object_clip_set(o, cw->clip);
5709 evas_object_smart_member_add(o, obj);
5710 evas_object_move(o, 0, 0);
5711 evas_object_resize(o, cw->w, cw->h);
5712 /* save render op value to restore when clear a mask.
5714 * NOTE: DO NOT change the render op on ec->frame while mask object
5715 * is set. it will overwrite the changed op value. */
5716 cw->mask.saved_render_op = evas_object_render_op_get(obj);
5717 evas_object_render_op_set(obj, EVAS_RENDER_COPY);
5718 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5719 if (cw->visible) evas_object_show(o);
5722 evas_object_name_set(cw->mask.obj, "cw->mask_obj");
5723 ELOGF("COMP", " |mask_obj", cw->ec);
5724 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_MASK_OBJECT_SET, cw->ec);
5731 evas_object_smart_member_del(cw->mask.obj);
5732 E_FREE_FUNC(cw->mask.obj, evas_object_del);
5734 evas_object_render_op_set(obj, cw->mask.saved_render_op);
5735 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET, cw->ec);
5741 e_comp_object_mask_has(Evas_Object *obj)
5743 API_ENTRY EINA_FALSE;
5745 return (cw->mask.obj) ? EINA_TRUE : EINA_FALSE;
5749 e_comp_object_size_update(Evas_Object *obj, int w, int h)
5754 if ((cw->external_content) &&
5755 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
5757 WRN("Can set up size to ONLY evas \"image\" object. "
5758 "But current external content is %d object for %p.",
5759 cw->content_type, cw->ec);
5763 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
5765 evas_object_image_size_set(cw->obj, tw, th);
5769 e_comp_object_transform_bg_set(Evas_Object *obj, Eina_Bool set)
5771 Eina_Bool transform_set = EINA_FALSE;
5773 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5774 if (cw->ec->input_only) return;
5776 transform_set = !!set;
5780 if (!cw->transform_bg_obj)
5782 Evas_Object *o = evas_object_rectangle_add(e_comp->evas);
5783 evas_object_move(o, 0, 0);
5784 evas_object_resize(o, 1, 1);
5785 if (cw->transform_bg_color.a >= 255)
5786 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5788 evas_object_render_op_set(o, EVAS_RENDER_BLEND);
5789 evas_object_color_set(o,
5790 cw->transform_bg_color.r,
5791 cw->transform_bg_color.g,
5792 cw->transform_bg_color.b,
5793 cw->transform_bg_color.a);
5794 if (cw->visible) evas_object_show(o);
5796 cw->transform_bg_obj = o;
5797 evas_object_name_set(cw->transform_bg_obj, "cw->transform_bg_obj");
5799 _e_comp_object_transform_obj_stack_update(obj);
5803 if (cw->transform_bg_obj)
5805 evas_object_smart_member_del(cw->transform_bg_obj);
5806 E_FREE_FUNC(cw->transform_bg_obj, evas_object_del);
5812 e_comp_object_transform_bg_color_set(Evas_Object *obj, int r, int g, int b, int a)
5816 cw->transform_bg_color.r = r;
5817 cw->transform_bg_color.g = g;
5818 cw->transform_bg_color.b = b;
5819 cw->transform_bg_color.a = a;
5821 if (cw->transform_bg_obj)
5823 evas_object_color_set(cw->transform_bg_obj,
5824 cw->transform_bg_color.r,
5825 cw->transform_bg_color.g,
5826 cw->transform_bg_color.b,
5827 cw->transform_bg_color.a);
5832 e_comp_object_transform_bg_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
5835 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5836 if (cw->ec->input_only) return;
5837 if (!cw->transform_bg_obj) return;
5839 _e_comp_object_transform_obj_map_set(cw->transform_bg_obj, vertices);
5843 e_comp_object_transform_bg_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
5846 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5847 if (cw->ec->input_only) return;
5848 if (!cw->transform_bg_obj) return;
5850 _e_comp_object_transform_obj_map_set_with_zoom(cw->transform_bg_obj, vertices, zoom);
5854 e_comp_object_transform_transp_set(Evas_Object *obj, Eina_Bool set)
5856 Eina_Bool transform_set = EINA_FALSE;
5858 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5859 if (cw->ec->input_only) return;
5861 transform_set = !!set;
5865 if (!cw->transform_tranp_obj)
5867 Evas_Object *o = evas_object_rectangle_add(e_comp->evas);
5868 evas_object_move(o, 0, 0);
5869 evas_object_resize(o, 1, 1);
5870 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5871 evas_object_color_set(o, 0, 0, 0, 0);
5872 if (cw->visible) evas_object_show(o);
5874 cw->transform_tranp_obj = o;
5875 evas_object_name_set(cw->transform_tranp_obj, "cw->transform_trasp_obj");
5877 _e_comp_object_transform_obj_stack_update(obj);
5881 if (cw->transform_tranp_obj)
5883 evas_object_smart_member_del(cw->transform_tranp_obj);
5884 E_FREE_FUNC(cw->transform_tranp_obj, evas_object_del);
5890 e_comp_object_transform_transp_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
5893 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5894 if (cw->ec->input_only) return;
5895 if (!cw->transform_tranp_obj) return;
5897 _e_comp_object_transform_obj_map_set(cw->transform_tranp_obj, vertices);
5901 e_comp_object_transform_transp_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
5904 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5905 if (cw->ec->input_only) return;
5906 if (!cw->transform_tranp_obj) return;
5908 _e_comp_object_transform_obj_map_set_with_zoom(cw->transform_tranp_obj, vertices, zoom);
5912 e_comp_object_layer_update(Evas_Object *obj,
5913 Evas_Object *above, Evas_Object *below)
5915 E_Comp_Object *cw2 = NULL;
5916 Evas_Object *o = NULL;
5921 if (cw->ec->layer_block) return;
5922 if ((above) && (below))
5924 ERR("Invalid layer update request! cw=%p", cw);
5932 layer = evas_object_layer_get(o);
5933 cw2 = evas_object_data_get(o, "comp_obj");
5936 if (!e_util_strcmp(evas_object_name_get(o), "layer_obj")) break;
5938 o = evas_object_above_get(o);
5939 if ((!o) || (o == cw->smart_obj)) break;
5940 if (evas_object_layer_get(o) != layer)
5942 o = e_comp->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_ALERT)].obj;
5947 ec = e_client_top_get();
5948 if (ec) o = ec->frame;
5951 if (o) cw2 = evas_object_data_get(o, "comp_obj");
5955 _e_comp_object_layers_remove(cw);
5958 if (cw2->layer > cw->layer)
5959 _e_comp_object_layers_add(cw, NULL, NULL, 0);
5960 else if (cw2->layer == cw->layer)
5963 _e_comp_object_layers_add(cw, cw2, NULL, 0);
5965 _e_comp_object_layers_add(cw, NULL, NULL, above? 0 : 1);
5967 _e_comp_object_layers_add(cw, NULL, cw2, 0);
5970 _e_comp_object_layers_add(cw, NULL, NULL, 1);
5973 _e_comp_object_layers_add(cw, NULL, NULL, 0);
5977 e_comp_object_layer_get(Evas_Object *obj)
5984 e_comp_object_content_set(Evas_Object *obj,
5985 Evas_Object *content,
5986 E_Comp_Object_Content_Type type)
5988 API_ENTRY EINA_FALSE;
5990 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5991 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec->pixmap, EINA_FALSE);
5992 EINA_SAFETY_ON_NULL_RETURN_VAL(content, EINA_FALSE);
5996 ERR("Can't set e.swallow.content to requested content. "
5997 "Previous comp object should not be changed at all.");
6001 if (e_pixmap_usable_get(cw->ec->pixmap)) return EINA_FALSE;
6003 if ((type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE) &&
6004 (type != E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE))
6006 ERR("Content type %d for %p is not supported ec:%p pixmap:%p",
6007 type, content, cw->ec, cw->ec->pixmap);
6011 cw->external_content = EINA_TRUE;
6014 cw->content_type = type;
6015 e_util_size_debug_set(cw->obj, 1);
6016 evas_object_name_set(cw->obj, "cw->obj");
6017 _e_comp_object_alpha_set(cw);
6020 _e_comp_object_shadow_setup(cw);
6026 e_comp_object_content_unset(Evas_Object *obj)
6028 API_ENTRY EINA_FALSE;
6030 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6031 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec->pixmap, EINA_FALSE);
6033 if (!cw->obj && !cw->ec->visible)
6035 ELOGF("COMP", "is not visible yet. no need to unset", cw->ec);
6039 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE)
6041 ELOGF("COMP", "has been set to internal image object already", cw->ec);
6047 if (cw->frame_object)
6048 edje_object_part_unswallow(cw->frame_object, cw->obj);
6050 edje_object_part_unswallow(cw->shobj, cw->obj);
6052 evas_object_del(cw->obj);
6053 evas_object_hide(cw->obj);
6057 cw->external_content = EINA_FALSE;
6058 if (cw->ec->is_cursor)
6061 DBG("%p is cursor surface..", cw->ec);
6062 if (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph))
6064 evas_object_resize(cw->ec->frame, pw, ph);
6065 evas_object_hide(cw->ec->frame);
6070 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE;
6071 cw->obj = evas_object_image_filled_add(e_comp->evas);
6072 evas_object_image_border_center_fill_set(cw->obj, EVAS_BORDER_FILL_SOLID);
6073 e_util_size_debug_set(cw->obj, 1);
6074 evas_object_image_pixels_get_callback_set(cw->obj, _e_comp_object_pixels_get, cw);
6075 evas_object_image_pixels_noti_callback_set(cw->obj, _e_comp_object_pixels_noti, cw);
6076 evas_object_image_smooth_scale_set(cw->obj, e_comp_config_get()->smooth_windows);
6077 evas_object_name_set(cw->obj, "cw->obj");
6078 evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888);
6079 _e_comp_object_alpha_set(cw);
6082 _e_comp_object_shadow_setup(cw);
6087 _e_comp_intercept_show_helper(cw);
6091 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
6092 e_comp_object_dirty(cw->smart_obj);
6093 e_comp_object_render(cw->smart_obj);
6094 e_comp_object_render_update_add(obj);
6099 EINTERN Evas_Object *
6100 e_comp_object_content_get(Evas_Object *obj)
6104 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, NULL);
6106 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE)
6108 ELOGF("COMP", "has been set to internal image object. couldn't return internal image object", cw->ec);
6115 E_API E_Comp_Object_Content_Type
6116 e_comp_object_content_type_get(Evas_Object *obj)
6118 API_ENTRY E_COMP_OBJECT_CONTENT_TYPE_NONE;
6120 return cw->content_type;
6124 e_comp_object_dim_mask_update(Evas_Object *obj, Eina_Bool mask_set, int x, int y, int w, int h)
6127 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
6128 E_Comp_Config *conf = e_comp_config_get();
6129 if (cw->ec->input_only) return;
6130 if (!conf->dim_rect_enable) return;
6132 cw->dim.mask_set = mask_set;
6138 if (!cw->dim.enable) return;
6139 e_comp_object_dim_mask_set(cw->ec->frame, mask_set);
6143 e_comp_object_dim_mask_set(Evas_Object *obj, Eina_Bool set)
6145 Eina_Bool mask_set = EINA_FALSE;
6149 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
6150 E_Comp_Config *conf = e_comp_config_get();
6151 if (cw->ec->input_only) return;
6152 if (!conf->dim_rect_enable) return;
6158 if (cw->dim.mask_obj)
6160 evas_object_smart_member_del(cw->dim.mask_obj);
6161 E_FREE_FUNC(cw->dim.mask_obj, evas_object_del);
6164 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);
6165 o = evas_object_rectangle_add(e_comp->evas);
6166 evas_object_color_set(o, 0, 0, 0, 0);
6167 evas_object_smart_member_add(o, obj);
6168 evas_object_resize(o, cw->dim.mask_w, cw->dim.mask_h);
6169 evas_object_move(o, cw->dim.mask_x, cw->dim.mask_y);
6171 evas_object_render_op_set(o, EVAS_RENDER_COPY);
6172 if (cw->visible) evas_object_show(o);
6174 cw->dim.mask_obj = o;
6175 evas_object_name_set(cw->dim.mask_obj, "cw->dim_mask_obj");
6177 evas_object_layer_set(cw->dim.mask_obj, 9998);
6181 if (cw->dim.mask_obj)
6183 ELOGF("COMP", "DIM |Mask on Dim rect Removed", cw->ec);
6184 evas_object_smart_member_del(cw->dim.mask_obj);
6185 E_FREE_FUNC(cw->dim.mask_obj, evas_object_del);
6191 e_comp_object_dim_client_set(E_Client *ec)
6193 E_Comp_Config *conf = e_comp_config_get();
6195 if (!conf->dim_rect_enable) return ;
6196 if (dim_client == ec) return;
6198 Eina_Bool prev_dim = EINA_FALSE;
6199 ELOGF("COMP", "DIM |Client Set %p -> %p", ec, dim_client, ec);
6201 if (dim_client && _e_comp_object_dim_enable_get(dim_client, dim_client->frame))
6202 prev_dim = EINA_TRUE;
6204 if (prev_dim && dim_client->visible && ec)
6206 _e_comp_object_dim_enable_set(dim_client, dim_client->frame, EINA_FALSE, EINA_TRUE);
6207 _e_comp_object_dim_enable_set(ec, ec->frame, EINA_TRUE, EINA_TRUE);
6211 if (prev_dim) _e_comp_object_dim_enable_set(dim_client, dim_client->frame, EINA_FALSE, EINA_FALSE);
6212 if (ec) _e_comp_object_dim_enable_set(ec, ec->frame, EINA_TRUE, EINA_FALSE);
6218 e_comp_object_dim_client_get(void)
6220 E_Comp_Config *conf = e_comp_config_get();
6222 if (!conf->dim_rect_enable ) return NULL;
6228 _e_comp_object_dim_enable_set(E_Client *ec, Evas_Object *obj, Eina_Bool enable, Eina_Bool noeffect)
6231 char emit[32] = "\0";
6232 E_Comp_Config *conf = e_comp_config_get();
6235 if (!conf->dim_rect_enable) return;
6236 if (!cw->effect_obj) return;
6237 if (enable == cw->dim.enable) return;
6239 ELOGF("COMP", "DIM |set on Client [%d]", ec, enable);
6240 if (noeffect || !conf->dim_rect_effect)
6242 strncpy(emit, (enable ? "e,state,dim,on,noeffect" : "e,state,dim,off,noeffect"), sizeof(emit) - 1);
6246 strncpy(emit, (enable ? "e,state,dim,on" : "e,state,dim,off"), sizeof(emit) - 1);
6249 cw->dim.enable = enable;
6251 if (cw->dim.mask_set && !enable)
6253 e_comp_object_dim_mask_set(cw->ec->frame, enable);
6254 edje_object_signal_emit(cw->effect_obj, emit, "e");
6256 else if (cw->dim.mask_set && enable)
6258 edje_object_signal_emit(cw->effect_obj, emit, "e");
6259 e_comp_object_dim_mask_set(cw->ec->frame, enable);
6263 edje_object_signal_emit(cw->effect_obj, emit, "e");
6268 _e_comp_object_dim_enable_get(E_Client *ec, Evas_Object *obj)
6270 API_ENTRY EINA_FALSE;
6271 E_Comp_Config *conf = e_comp_config_get();
6273 if (!ec) return EINA_FALSE;
6274 if (!conf->dim_rect_enable) return EINA_FALSE;
6276 if (cw->dim.enable) return EINA_TRUE;
6282 _e_comp_object_dim_update(E_Comp_Object *cw)
6284 E_Comp_Config *conf = e_comp_config_get();
6287 if (!conf->dim_rect_enable) return;
6288 if (!cw->effect_obj) return;
6291 edje_object_signal_emit(cw->effect_obj, (cw->dim.enable ? "e,state,dim,on,noeffect" : "e,state,dim,off,noeffect"), "e");
6292 ELOGF("COMP", "DIM |Applied on Client dim.enable[%d]", cw->ec, cw->dim.enable);
6294 if (cw->dim.mask_set)
6296 e_comp_object_dim_mask_set(cw->ec->frame, cw->dim.mask_set);
6302 e_comp_object_clear(Evas_Object *obj)
6306 _e_comp_object_clear(cw);
6310 e_comp_object_hwc_update_exists(Evas_Object *obj)
6312 API_ENTRY EINA_FALSE;
6313 return cw->hwc_need_update;
6318 e_comp_object_hwc_update_set(Evas_Object *obj, Eina_Bool set)
6321 cw->hwc_need_update = set;
6325 e_comp_object_effect_object_part_swallow(Evas_Object *obj, const char *part_name, Evas_Object *swallow_obj)
6327 API_ENTRY EINA_FALSE;
6328 return edje_object_part_swallow(cw->effect_obj, part_name, swallow_obj);
6332 e_comp_object_indicator_swallow(Evas_Object *obj, Evas_Object *indicator)
6335 if (cw->indicator.obj != indicator)
6336 edje_object_part_unswallow(cw->shobj, cw->indicator.obj);
6337 cw->indicator.obj = indicator;
6338 edje_object_part_swallow(cw->shobj, "e.swallow.indicator", indicator);
6342 e_comp_object_indicator_unswallow(Evas_Object *obj, Evas_Object *indicator)
6345 if (cw->indicator.obj != indicator) return;
6346 cw->indicator.obj = NULL;
6347 edje_object_part_unswallow(cw->shobj, indicator);
6351 e_comp_object_indicator_size_set(Evas_Object *obj, int w, int h)
6354 Edje_Message_Int_Set *msg;
6356 if (!cw->indicator.obj) return;
6358 cw->indicator.w = w;
6359 cw->indicator.h = h;
6361 if (!cw->shobj) return;
6363 msg = alloca(sizeof(Edje_Message_Int_Set) + (sizeof(int)));
6367 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT_SET, 0, msg);
6368 edje_object_message_signal_process(cw->shobj);
6371 /* buffer transform and scale are applied to e_comp_object and e_pixmap internaly */
6373 e_comp_object_map_update(Evas_Object *obj)
6376 E_Client *ec = cw->ec;
6377 E_Comp_Wl_Client_Data *cdata;
6379 int x1, y1, x2, y2, x, y, bw, bh, tw, th;
6382 int l, remain = sizeof buffer;
6385 if (e_object_is_del(E_OBJECT(ec))) return;
6386 cdata = e_client_cdata_get(ec);
6389 /* if buffer had been flushed, buffer could be NULL. Then map will be applied
6390 * when new buffer is attached.
6392 if (!cdata->buffer_ref.buffer) return;
6394 if ((!cw->redirected) ||
6395 (e_client_video_hw_composition_check(ec)) ||
6396 (!e_comp_wl_output_buffer_transform_get(ec) &&
6397 cdata->scaler.buffer_viewport.buffer.scale == 1))
6399 if (evas_object_map_enable_get(cw->effect_obj))
6401 ELOGF("TRANSFORM", "map: disable", cw->ec);
6402 evas_object_map_enable_set(cw->effect_obj, EINA_FALSE);
6403 _e_comp_object_map_transform_rect(cw->ec, 0, 0, cw->w, cw->h, NULL, NULL, &tw, &th);
6404 evas_object_resize(cw->effect_obj, tw, th);
6411 EINA_SAFETY_ON_NULL_RETURN(map);
6413 e_pixmap_size_get(ec->pixmap, &bw, &bh);
6419 e_map_util_points_populate_from_geometry(map, ec->x, ec->y, bw, bh, 0);
6421 _e_comp_object_map_transform_pos(ec, x1, y1, &x, &y);
6422 e_map_point_image_uv_set(map, 0, x, y);
6423 l = snprintf(p, remain, "%d,%d", x, y);
6424 p += l, remain -= l;
6426 _e_comp_object_map_transform_pos(ec, x2, y1, &x, &y);
6427 e_map_point_image_uv_set(map, 1, x, y);
6428 l = snprintf(p, remain, " %d,%d", x, y);
6429 p += l, remain -= l;
6431 _e_comp_object_map_transform_pos(ec, x2, y2, &x, &y);
6432 e_map_point_image_uv_set(map, 2, x, y);
6433 l = snprintf(p, remain, " %d,%d", x, y);
6434 p += l, remain -= l;
6436 _e_comp_object_map_transform_pos(ec, x1, y2, &x, &y);
6437 e_map_point_image_uv_set(map, 3, x, y);
6438 l = snprintf(p, remain, " %d,%d", x, y);
6439 p += l, remain -= l;
6441 ELOGF("TRANSFORM", "map: point(%d,%d %dx%d) uv(%d,%d %d,%d %d,%d %d,%d=>%s)",
6443 ec->x, ec->y, bw, bh, x1, y1, x2, y1, x2, y2, x1, y2, buffer);
6445 e_comp_object_map_set(cw->effect_obj, map);
6446 e_comp_object_map_enable_set(cw->effect_obj, EINA_TRUE);
6450 /* if there's screen rotation with comp mode, then ec->effect_obj and
6451 * ec->obj should rotate. if not, in evas_map, update region is clipped.
6453 _e_comp_object_map_transform_rect(cw->ec, 0, 0, bw, bh, NULL, NULL, &tw, &th);
6454 evas_object_resize(cw->effect_obj, tw, th);
6458 e_comp_object_render_trace_set(Evas_Object *obj, Eina_Bool set)
6460 API_ENTRY EINA_FALSE;
6462 cw->render_trace = set;
6468 e_comp_object_native_usable_get(Evas_Object *obj)
6470 API_ENTRY EINA_FALSE;
6471 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6473 if (cw->ec->input_only) return EINA_FALSE;
6474 if (cw->external_content) return EINA_FALSE;
6475 if (e_comp_object_content_type_get(cw->ec->frame) != E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE) return EINA_FALSE;
6477 /* just return true value, if it is normal case */
6478 if (e_pixmap_usable_get(cw->ec->pixmap)) return EINA_TRUE;
6481 Evas_Native_Surface *ns;
6482 ns = evas_object_image_native_surface_get(cw->obj);
6484 /* client pixmap is not usable but cw->obj is drawable due to it holds valid native surface*/
6487 ELOGF("COMP", "Client pixmap is Not usable but still holds valid native surface", cw->ec);
6495 e_comp_object_image_filter_set(Evas_Object *obj, E_Comp_Image_Filter filter)
6497 API_ENTRY EINA_FALSE;
6498 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6499 if (e_object_is_del(E_OBJECT(cw->ec))) return EINA_FALSE;
6500 if (!e_client_cdata_get(cw->ec)) return EINA_FALSE;
6504 case E_COMP_IMAGE_FILTER_BLUR:
6505 efl_gfx_filter_program_set(cw->obj, "blur (20) padding_set (0)", "image_filter");
6507 case E_COMP_IMAGE_FILTER_GRAYSCALE:
6508 efl_gfx_filter_program_set(cw->obj, "grayscale ()", "image_filter");
6510 case E_COMP_IMAGE_FILTER_INVERSE:
6511 efl_gfx_filter_program_set(cw->obj, "inverse_color ()", "image_filter");
6513 case E_COMP_IMAGE_FILTER_NONE:
6515 efl_gfx_filter_program_set(cw->obj, NULL, "image_filter");
6519 cw->image_filter = filter;
6524 EINTERN E_Comp_Image_Filter
6525 e_comp_object_image_filter_get(Evas_Object *obj)
6527 API_ENTRY E_COMP_IMAGE_FILTER_NONE;
6528 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, E_COMP_IMAGE_FILTER_NONE);
6529 if (e_object_is_del(E_OBJECT(cw->ec))) return E_COMP_IMAGE_FILTER_NONE;
6530 if (!e_client_cdata_get(cw->ec)) return E_COMP_IMAGE_FILTER_NONE;
6532 return cw->image_filter;
6536 _e_comp_object_damage_trace_render_pre_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
6540 if (!_damage_trace) return;
6542 EINA_LIST_FREE(_damage_trace_post_objs, obj)
6543 evas_object_del(obj);
6545 _damage_trace_post_objs = NULL;
6549 _e_comp_object_damage_trace_render_post_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
6551 if (!_damage_trace) return;
6553 _damage_trace_post_objs = _damage_trace_objs;
6554 _damage_trace_objs = NULL;
6558 e_comp_object_damage_trace_debug(Eina_Bool onoff)
6560 if (_damage_trace == onoff) return;
6564 evas_event_callback_add(e_comp->evas,
6565 EVAS_CALLBACK_RENDER_PRE,
6566 _e_comp_object_damage_trace_render_pre_cb,
6569 evas_event_callback_add(e_comp->evas,
6570 EVAS_CALLBACK_RENDER_POST,
6571 _e_comp_object_damage_trace_render_post_cb,
6578 EINA_LIST_FREE(_damage_trace_objs, obj)
6579 evas_object_del(obj);
6581 _damage_trace_objs = NULL;
6583 EINA_LIST_FREE(_damage_trace_post_objs, obj)
6584 evas_object_del(obj);
6586 _damage_trace_post_objs = NULL;
6588 evas_event_callback_del(e_comp->evas,
6589 EVAS_CALLBACK_RENDER_PRE,
6590 _e_comp_object_damage_trace_render_pre_cb);
6592 evas_event_callback_del(e_comp->evas,
6593 EVAS_CALLBACK_RENDER_POST,
6594 _e_comp_object_damage_trace_render_post_cb);
6597 _damage_trace = onoff;
6601 e_comp_object_redirected_get(Evas_Object *obj)
6603 API_ENTRY EINA_FALSE;
6604 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6606 return cw->redirected;
6610 e_comp_object_color_visible_get(Evas_Object *obj)
6612 API_ENTRY EINA_FALSE;
6615 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6617 e_comp_object_color_get(obj, NULL, NULL, NULL, &a);
6621 evas_object_color_get(cw->effect_obj, NULL, NULL, NULL, &a);
6625 evas_object_color_get(cw->shobj, NULL, NULL, NULL, &a);
6629 evas_object_color_get(cw->obj, NULL, NULL, NULL, &a);
6637 e_comp_object_map_set(Evas_Object *obj, E_Map *em)
6639 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
6641 return e_map_set_to_comp_object(em, obj);
6645 e_comp_object_map_get(const Evas_Object *obj)
6647 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
6649 return e_map_get_from_comp_object(obj);
6653 e_comp_object_map_enable_set(Evas_Object *obj, Eina_Bool enable)
6655 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
6657 evas_object_map_enable_set(obj, enable);
6663 e_comp_object_render_update_lock(Evas_Object *obj)
6665 API_ENTRY EINA_FALSE;
6667 if (cw->render_update_lock.lock == 0)
6669 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET, cw->ec);
6670 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref,
6671 e_pixmap_resource_get(cw->ec->pixmap));
6672 e_comp_object_render_update_del(obj);
6673 ELOGF("COMP", "Render update lock enabled", cw->ec);
6676 cw->render_update_lock.lock++;
6682 e_comp_object_render_update_unlock(Evas_Object *obj)
6686 if (cw->render_update_lock.lock == 0)
6689 cw->render_update_lock.lock--;
6691 if (cw->render_update_lock.lock == 0)
6694 if (cw->render_update_lock.pending_move_set)
6696 evas_object_move(obj,
6697 cw->render_update_lock.pending_move_x,
6698 cw->render_update_lock.pending_move_y);
6699 cw->render_update_lock.pending_move_x = 0;
6700 cw->render_update_lock.pending_move_y = 0;
6701 cw->render_update_lock.pending_move_set = EINA_FALSE;
6704 if (cw->render_update_lock.pending_resize_set)
6706 evas_object_resize(obj,
6707 cw->render_update_lock.pending_resize_w,
6708 cw->render_update_lock.pending_resize_h);
6709 cw->render_update_lock.pending_resize_w = 0;
6710 cw->render_update_lock.pending_resize_h = 0;
6711 cw->render_update_lock.pending_resize_set = EINA_FALSE;
6714 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, NULL);
6716 if ((cw->ec->exp_iconify.buffer_flush) &&
6717 (e_policy_visibility_client_is_iconic(cw->ec)) &&
6718 (cw->ec->comp_data) && (!cw->ec->comp_data->buffer_ref.buffer))
6719 e_comp_object_clear(obj);
6721 e_comp_object_render_update_add(obj);
6723 ELOGF("COMP", "Render update lock disabled", cw->ec);
6728 e_comp_object_render_update_lock_get(Evas_Object *obj)
6730 API_ENTRY EINA_FALSE;
6732 if (cw->render_update_lock.lock > 0)
6739 e_comp_object_color_get(Evas_Object *obj, int *r, int *g, int *b, int *a)
6743 if (cw->transparent.set)
6745 if (r) *r = cw->transparent.user_r;
6746 if (g) *g = cw->transparent.user_g;
6747 if (b) *b = cw->transparent.user_b;
6748 if (a) *a = cw->transparent.user_a;
6752 evas_object_color_get(obj, r, g, b, a);