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);
1951 e_config->transient.raise = oldraise;
1953 _e_comp_object_layers_remove(cw);
1954 cw->layer = e_comp_canvas_layer_map(layer);
1955 _e_comp_object_layers_add(cw, NULL, NULL, 0);
1956 //if (cw->ec->new_client)
1957 //INF("CLIENT STACKED %p: %u", cw->ec, layer);
1958 _e_comp_object_layer_set(obj, layer);
1959 if (!e_comp->layers[cw->layer].obj) return; //this is a layer marker
1960 evas_object_stack_below(obj, e_comp->layers[cw->layer].obj);
1961 if (evas_object_below_get(obj) == e_comp->layers[cw->layer].obj)
1963 /* can't stack a client above its own layer marker */
1964 CRI("STACKING ERROR!!! ec:%p (cw->layer:%d, ec->layer:%d)", cw->ec, cw->layer, cw->ec->layer);
1966 if (!cw->visible) return;
1967 e_comp_render_queue();
1968 _e_comp_object_transform_obj_stack_update(obj);
1971 typedef void (*E_Comp_Object_Stack_Func)(Evas_Object *obj, Evas_Object *stack);
1974 _e_comp_object_raise(Evas_Object *obj)
1976 evas_object_raise(obj);
1978 if (evas_object_smart_smart_get(obj))
1980 E_Client *ec = e_comp_object_client_get(obj);
1982 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
1987 _e_comp_object_lower(Evas_Object *obj)
1989 evas_object_lower(obj);
1991 if (evas_object_smart_smart_get(obj))
1993 E_Client *ec = e_comp_object_client_get(obj);
1995 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2000 _e_comp_object_stack_above(Evas_Object *obj, Evas_Object *target)
2002 evas_object_stack_above(obj, target);
2004 if (evas_object_smart_smart_get(obj))
2006 E_Client *ec = e_comp_object_client_get(obj);
2008 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2013 _e_comp_object_stack_below(Evas_Object *obj, Evas_Object *target)
2015 evas_object_stack_below(obj, target);
2017 if (evas_object_smart_smart_get(obj))
2019 E_Client *ec = e_comp_object_client_get(obj);
2021 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2026 _e_comp_object_layer_set(Evas_Object *obj, short layer)
2028 evas_object_layer_set(obj, layer);
2030 if (evas_object_smart_smart_get(obj))
2032 E_Client *ec = e_comp_object_client_get(obj);
2034 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_LAYER_SET, ec);
2039 _e_comp_object_is_pending(E_Client *ec)
2043 if (!ec) return EINA_FALSE;
2045 topmost = e_comp_wl_topmost_parent_get(ec);
2047 return (topmost) ? topmost->layer_pending : EINA_FALSE;
2051 _e_comp_intercept_stack_helper(E_Comp_Object *cw, Evas_Object *stack, E_Comp_Object_Stack_Func stack_cb)
2053 E_Comp_Object *cw2 = NULL;
2056 Evas_Object *o = stack;
2057 Eina_Bool raising = stack_cb == _e_comp_object_stack_above;
2059 /* We should consider topmost's layer_pending for subsurface */
2060 if ((cw->ec->layer_block) || _e_comp_object_is_pending(cw->ec))
2062 if (_e_comp_object_is_pending(cw->ec))
2063 e_comp_object_layer_update(cw->smart_obj,
2064 raising? stack : NULL,
2065 raising? NULL : stack);
2067 /* obey compositor effects! */
2068 if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
2069 evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
2070 stack_cb(cw->smart_obj, stack);
2071 if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
2072 evas_object_data_del(cw->smart_obj, "client_restack");
2076 cw2 = evas_object_data_get(o, "comp_obj");
2078 /* assume someone knew what they were doing during client init */
2079 if (cw->ec->new_client)
2080 layer = cw->ec->layer;
2081 else if ((cw2) && _e_comp_object_is_pending(cw2->ec))
2082 layer = cw2->ec->layer;
2084 layer = evas_object_layer_get(stack);
2085 ecstack = e_client_below_get(cw->ec);
2086 if (layer != e_comp_canvas_layer_map_to(cw->layer))
2088 /* some FOOL is trying to restack a layer marker */
2089 if (cw->smart_obj == e_comp->layers[cw->layer].obj) return;
2090 evas_object_layer_set(cw->smart_obj, layer);
2091 /* we got our layer wrangled, return now! */
2092 if (layer != e_comp_canvas_layer_map_to(cw->layer)) return;
2095 /* check if we're stacking below another client */
2098 /* check for non-client layer object */
2099 if (!e_util_strcmp(evas_object_name_get(o), "layer_obj"))
2101 /* find an existing client to use for layering
2102 * by walking up the object stack
2104 * this is guaranteed to be pretty quick since we'll either:
2105 * - run out of client layers
2106 * - find a stacking client
2108 o = evas_object_above_get(o);
2109 if ((!o) || (o == cw->smart_obj)) break;
2110 if (evas_object_layer_get(o) != layer)
2112 /* reached the top client layer somehow
2113 * use top client object
2115 o = e_comp->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR)].obj;
2118 /* top client layer window hasn't been stacked yet. this probably shouldn't happen?
2119 * return here since the top client layer window
2124 ec = e_client_top_get();
2129 if (o) cw2 = evas_object_data_get(o, "comp_obj");
2132 if (cw2 && cw->layer != cw2->layer)
2135 /* remove existing layers */
2136 _e_comp_object_layers_remove(cw);
2139 if (o == stack) //if stacking above, cw2 is above; else cw2 is below
2140 _e_comp_object_layers_add(cw, raising ? cw2 : NULL, raising ? NULL : cw2, 0);
2141 else if (o == cw->smart_obj) //prepend (lower) if not stacking above
2142 _e_comp_object_layers_add(cw, NULL, NULL, !raising);
2143 else //if no stacking objects found, either raise or lower
2144 _e_comp_object_layers_add(cw, raising ? NULL : cw2, raising ? cw2 : NULL, 0);
2147 _e_comp_object_layers_add(cw, NULL, NULL, 0);
2149 /* find new object for stacking if cw2 is on state of layer_pending */
2150 if ((cw2) && _e_comp_object_is_pending(cw2->ec))
2152 E_Client *new_stack = NULL, *current_ec = NULL;
2153 current_ec = cw2->ec;
2156 while ((new_stack = e_client_below_get(current_ec)))
2158 current_ec = new_stack;
2159 if (new_stack == cw->ec) continue;
2160 if (new_stack->layer != cw2->ec->layer) break;
2161 if (!_e_comp_object_is_pending(new_stack)) break;
2163 if ((new_stack) && (new_stack->layer == cw2->ec->layer))
2164 stack = new_stack->frame;
2167 /* stack it above layer object */
2169 below_layer = (cw2->layer <= 0)? 0 : cw2->layer - 1 ;
2170 stack = e_comp->layers[below_layer].obj;
2175 while ((new_stack = e_client_above_get(current_ec)))
2177 current_ec = new_stack;
2178 if (new_stack == cw->ec) continue;
2179 if (new_stack->layer != cw2->ec->layer) break;
2180 if (!_e_comp_object_is_pending(new_stack)) break;
2182 if ((new_stack) && (new_stack->layer == cw2->ec->layer))
2183 stack = new_stack->frame;
2185 stack = e_comp->layers[cw2->layer].obj;
2189 /* set restack if stacking has changed */
2190 if (cw->ec->new_client || (!ecstack) || (ecstack->frame != o))
2191 evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
2192 stack_cb(cw->smart_obj, stack);
2193 if (e_comp->layers[cw->layer].obj)
2194 if (evas_object_below_get(cw->smart_obj) == e_comp->layers[cw->layer].obj)
2196 CRI("STACKING ERROR!!! ec:%p (cw->layer:%d, ec->layer:%d)", cw->ec, cw->layer, cw->ec->layer);
2198 if (cw->ec->new_client || (!ecstack) || (ecstack->frame != o))
2199 evas_object_data_del(cw->smart_obj, "client_restack");
2200 if (!cw->visible) return;
2201 e_comp_render_queue();
2205 _e_comp_intercept_stack_above(void *data, Evas_Object *obj, Evas_Object *above)
2207 EINA_SAFETY_ON_TRUE_RETURN(obj == above);
2209 if (evas_object_below_get(obj) == above)
2211 e_comp_object_layer_update(obj, above, NULL);
2215 TRACE_DS_BEGIN(COMP:INTERCEPT STACK ABOVE);
2216 _e_comp_intercept_stack_helper(data, above, _e_comp_object_stack_above);
2217 _e_comp_object_transform_obj_stack_update(obj);
2218 _e_comp_object_transform_obj_stack_update(above);
2223 _e_comp_intercept_stack_below(void *data, Evas_Object *obj, Evas_Object *below)
2225 EINA_SAFETY_ON_TRUE_RETURN(obj == below);
2226 if (evas_object_above_get(obj) == below)
2228 e_comp_object_layer_update(obj, NULL, below);
2232 TRACE_DS_BEGIN(COMP:INTERCEPT STACK BELOW);
2233 _e_comp_intercept_stack_helper(data, below, _e_comp_object_stack_below);
2234 if (evas_object_smart_smart_get(obj))
2235 _e_comp_object_transform_obj_stack_update(obj);
2236 if (evas_object_smart_smart_get(below))
2237 _e_comp_object_transform_obj_stack_update(below);
2242 _e_comp_intercept_lower(void *data, Evas_Object *obj)
2244 E_Comp_Object *cw = data;
2247 TRACE_DS_BEGIN(COMP:INTERCEPT LOWER);
2249 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
2251 if (cw->ec->layer_pending)
2252 e_comp_object_layer_update(obj, NULL, obj);
2254 _e_comp_object_lower(obj);
2257 if (!EINA_INLIST_GET(cw->ec)->prev) goto end; //already lowest on layer
2258 o = evas_object_below_get(obj);
2259 _e_comp_object_layers_remove(cw);
2260 /* prepend to client list since this client should be the first item now */
2261 _e_comp_object_layers_add(cw, NULL, NULL, 1);
2262 if (evas_object_layer_get(o) != evas_object_layer_get(obj)) goto end; //already at bottom!
2263 if (obj == e_comp->layers[cw->layer].obj) goto end; //never lower a layer marker!
2264 evas_object_data_set(obj, "client_restack", (void*)1);
2265 _e_comp_object_lower(obj);
2266 evas_object_data_del(obj, "client_restack");
2267 if (!cw->visible) goto end;
2268 e_comp_render_queue();
2269 _e_comp_object_transform_obj_stack_update(obj);
2272 if (!cw->ec->post_lower)
2273 e_client_focus_stack_lower(cw->ec);
2278 _e_comp_intercept_raise(void *data, Evas_Object *obj)
2280 E_Comp_Object *cw = data;
2283 TRACE_DS_BEGIN(COMP:INTERCEPT RAISE);
2285 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
2287 if (cw->ec->layer_pending)
2289 int obj_layer = evas_object_layer_get(obj);
2290 if (cw->ec->layer != obj_layer)
2291 e_comp_object_layer_update(obj, NULL, NULL);
2294 _e_comp_object_raise(obj);
2297 if (!EINA_INLIST_GET(cw->ec)->next) goto end;//already highest on layer
2298 o = evas_object_above_get(obj);
2300 E_Client *ecabove = e_client_above_get(cw->ec);
2301 if (ecabove && (ecabove->frame == e_comp->layers[cw->layer].obj) &&
2302 (ecabove->frame == o)) goto end; //highest below marker
2304 if (evas_object_layer_get(o) != evas_object_layer_get(obj)) goto end; //already at top!
2305 if (obj == e_comp->layers[cw->layer].obj) //never raise a non-layer marker!
2306 _e_comp_object_raise(obj);
2311 /* still stack below override below the layer marker */
2312 for (op = o = e_comp->layers[cw->layer].obj;
2313 o && o != e_comp->layers[cw->layer - 1].obj;
2314 op = o, o = evas_object_below_get(o))
2316 if (evas_object_smart_smart_get(o))
2320 ec = e_comp_object_client_get(o);
2321 if (ec && (!ec->override)) break;
2324 _e_comp_object_stack_below(obj, op);
2325 e_client_focus_defer_set(cw->ec);
2327 if (!cw->visible) goto end;
2328 e_comp_render_queue();
2329 _e_comp_object_transform_obj_stack_update(obj);
2336 _e_comp_intercept_hide(void *data, Evas_Object *obj)
2338 E_Comp_Object *cw = data;
2340 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
2341 if( !_e_comp_object_intercept_hook_call(E_COMP_OBJECT_INTERCEPT_HOOK_HIDE, cw->ec))
2343 ELOGF("COMP", "Hide. intercepted", cw->ec);
2348 if (cw->ec->launching == EINA_TRUE)
2350 ELOGF("COMP", "Hide. Cancel launching flag", cw->ec);
2351 cw->ec->launching = EINA_FALSE;
2356 /* hidden flag = just do it */
2357 ELOGF("COMP", "Hide hidden evas_object:%p", cw->ec, obj);
2358 evas_object_hide(obj);
2362 if (cw->ec->input_only)
2364 /* input_only = who cares */
2365 ELOGF("COMP", "Hide input_only evas_object:%p", cw->ec, obj);
2366 evas_object_hide(obj);
2369 /* already hidden or currently animating */
2370 if ((!cw->visible) || (cw->animating && cw->hiding && (!cw->ec->iconic)))
2372 ELOGF("COMP", "Hide. but already hidden or currently animating", cw->ec);
2376 /* don't try hiding during shutdown */
2377 cw->defer_hide |= stopping;
2378 if (!cw->defer_hide)
2380 if ((!cw->ec->iconic) && (!cw->ec->override))
2381 /* unset delete requested so the client doesn't break */
2382 cw->ec->delete_requested = 0;
2383 if ((!cw->animating) || (!cw->hiding) || cw->ec->iconic)
2385 ELOGF("COMP", "Hide. but after iconify or hide animation, cw->animating:%d, cw->hiding:%d, iconic:%d",
2386 cw->ec, cw->animating, cw->hiding, cw->ec->iconic);
2389 e_comp_object_signal_emit(obj, "e,action,iconify", "e");
2392 e_comp_object_signal_emit(obj, "e,state,hidden", "e");
2394 _e_comp_object_animating_begin(cw);
2395 if (!_e_comp_object_effect_visibility_start(cw, 0)) return;
2397 evas_object_smart_callback_call(obj, "hiding", cw->ec);
2398 cw->defer_hide = !!cw->animating;
2400 e_comp_object_effect_set(obj, NULL);
2403 if (cw->animating) return;
2404 /* if we have no animations running, go ahead and hide */
2406 ELOGF("COMP", "Hide normal object:%p", cw->ec, obj);
2407 evas_object_hide(obj);
2411 _e_comp_intercept_show_helper(E_Comp_Object *cw)
2413 E_Client *ec = cw->ec;
2416 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
2418 if (ec->show_pending.count > 0)
2420 ELOGF("COMP", "show_helper. Show PENDING!!! show_pending:%d", ec, ec->show_pending.count);
2421 ec->show_pending.running = EINA_TRUE;
2425 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
2426 if (!_e_comp_object_intercept_hook_call(E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER, ec))
2428 ELOGF("COMP", "show_helper. intercepted", cw->ec);
2433 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,
2434 cw->visible, cw->animating, cw->defer_hide, cw->content_type, cw->updates, cw->w, cw->h,
2435 ec->iconic, ec->exp_iconify.by_client, ec->exp_iconify.type, ec->input_only, ec->ignored, ec->new_client);
2438 e_comp_object_signal_emit(cw->smart_obj, "e,state,sticky", "e");
2441 if (ec->iconic && cw->animating)
2443 /* triggered during iconify animation */
2444 e_comp_object_signal_emit(cw->smart_obj, "e,action,uniconify", "e");
2447 ELOGF("COMP", "show_helper. return. already cw->visible", ec);
2450 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE ||
2451 cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE)
2453 evas_object_move(cw->smart_obj, ec->x, ec->y);
2454 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2455 e_comp_object_frame_theme_set(cw->smart_obj, E_COMP_OBJECT_FRAME_RESHADOW);
2457 if (e_comp->image_filter != E_COMP_IMAGE_FILTER_NONE)
2458 e_comp_object_image_filter_set(cw->smart_obj, e_comp->image_filter);
2461 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2462 evas_object_show(cw->smart_obj);
2465 e_client_focus_defer_set(ec);
2469 if ((!cw->updates) && (!ec->input_only) && (!ec->ignored))
2473 pw = ec->client.w, ph = ec->client.h;
2475 if (!e_pixmap_size_get(ec->pixmap, &pw, &ph))
2477 ec->changes.visible = !ec->hidden;
2480 ELOGF("COMP", "show_helper. return. no pixmap size", ec);
2484 cw->updates = eina_tiler_new(pw, ph);
2487 ec->changes.visible = !ec->hidden;
2490 ELOGF("COMP", "show_helper. return. no cw->updates", ec);
2495 eina_tiler_tile_size_set(cw->updates, 1, 1);
2498 /* ignore until client idler first run */
2499 ec->changes.visible = !ec->hidden;
2502 ELOGF("COMP", "show_helper. return. new_client", ec);
2509 evas_object_move(cw->smart_obj, ec->x, ec->y);
2510 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2511 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2512 evas_object_show(cw->smart_obj);
2515 if (ec->netwm.type == E_WINDOW_TYPE_DND && !e_comp_wl->drag_client)
2517 /* start_drag not received */
2518 ec->changes.visible = 1;
2521 ELOGF("COMP", "show_helper. return. start_drag not received yet", ec);
2524 /* re-set geometry */
2525 evas_object_move(cw->smart_obj, ec->x, ec->y);
2526 /* force resize in case it hasn't happened yet, or just to update size */
2527 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2528 if ((cw->w < 1) || (cw->h < 1))
2530 /* if resize didn't go through, try again */
2531 ec->visible = ec->changes.visible = 1;
2533 ELOGF("COMP", "show_helper. return. cw_size(%d,%d)", ec, cw->w, cw->h);
2536 /* if pixmap not available, clear pixmap since we're going to fetch it again */
2537 if (!e_pixmap_size_get(ec->pixmap, &w, &h))
2538 e_pixmap_clear(ec->pixmap);
2540 if (cw->real_hid && w && h)
2543 /* force comp theming in case it didn't happen already */
2544 e_comp_object_frame_theme_set(cw->smart_obj, E_COMP_OBJECT_FRAME_RESHADOW);
2545 if (e_comp->image_filter != E_COMP_IMAGE_FILTER_NONE)
2546 e_comp_object_image_filter_set(cw->smart_obj, e_comp->image_filter);
2549 /* only do the show if show is allowed */
2552 if (ec->internal) //internal clients render when they feel like it
2553 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
2555 if (!e_client_is_iconified_by_client(ec)||
2556 e_policy_visibility_client_is_uniconic(ec))
2558 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2559 evas_object_show(cw->smart_obj);
2561 /* if comp object is shown in idle enterer before(E_CLIENT_HOOK_EVAL_FETCH),
2562 it is rendered in idle callback without native surface and
2563 compositor shows an empty frame if other objects aren't shown
2564 because job callback of e_comp called at the next loop.
2565 it causes a visual defect when windows are switched.
2569 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
2570 e_comp_object_dirty(cw->smart_obj);
2571 e_comp_object_render(cw->smart_obj);
2575 e_policy_visibility_client_is_uniconic(ec))
2577 if (ec->exp_iconify.not_raise &&
2578 e_client_check_above_focused(ec))
2579 e_client_focus_stack_append_current_focused(ec);
2581 e_client_focus_defer_set(ec);
2588 _e_comp_intercept_show(void *data, Evas_Object *obj EINA_UNUSED)
2590 E_Comp_Object *cw = data;
2591 E_Client *ec = cw->ec;
2593 E_Input_Rect_Data *input_rect_data;
2594 E_Input_Rect_Smart_Data *input_rect_sd;
2597 if (ec->ignored) return;
2601 //INF("SHOW2 %p", ec);
2602 _e_comp_intercept_show_helper(cw);
2605 //INF("SHOW %p", ec);
2608 cw->effect_obj = evas_object_rectangle_add(e_comp->evas);
2609 evas_object_color_set(cw->effect_obj, 0, 0, 0, 0);
2610 evas_object_smart_member_add(cw->effect_obj, cw->smart_obj);
2611 evas_object_name_set(cw->effect_obj, "cw->effect_obj::input_only");
2615 if ((!cw->obj) && (cw->external_content))
2617 ERR("cw->obj for external content is not created! ec:%p", cw->ec);
2621 _e_comp_object_setup(cw);
2624 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE;
2625 cw->obj = evas_object_image_filled_add(e_comp->evas);
2626 evas_object_image_border_center_fill_set(cw->obj, EVAS_BORDER_FILL_SOLID);
2627 e_util_size_debug_set(cw->obj, 1);
2628 evas_object_image_pixels_get_callback_set(cw->obj, _e_comp_object_pixels_get, cw);
2629 evas_object_image_pixels_noti_callback_set(cw->obj, _e_comp_object_pixels_noti, cw);
2630 evas_object_image_smooth_scale_set(cw->obj, e_comp_config_get()->smooth_windows);
2631 evas_object_name_set(cw->obj, "cw->obj");
2632 evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888);
2634 _e_comp_object_alpha_set(cw);
2635 #ifdef BORDER_ZOOMAPS
2636 e_comp_object_zoomap_set(o, 1);
2638 cw->zoomap_disabled = 1;
2641 evas_object_color_set(cw->clip, ec->netwm.opacity, ec->netwm.opacity, ec->netwm.opacity, ec->netwm.opacity);
2644 _e_comp_object_map_transform_rect(cw->ec, 0, 0, cw->w, cw->h, NULL, NULL, &tw, &th);
2645 evas_object_geometry_set(cw->effect_obj, cw->x, cw->y, tw, th);
2648 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
2651 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
2653 if (input_rect_data->obj)
2655 evas_object_geometry_set(input_rect_data->obj,
2656 cw->x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
2657 cw->y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
2658 input_rect_data->rect.w, input_rect_data->rect.h);
2665 evas_object_resize(cw->mask.obj, cw->w, cw->h);
2667 _e_comp_intercept_show_helper(cw);
2671 _e_comp_intercept_focus(void *data, Evas_Object *obj, Eina_Bool focus)
2673 E_Comp_Object *cw = data;
2677 /* note: this is here as it seems there are enough apps that do not even
2678 * expect us to emulate a look of focus but not actually set x input
2679 * focus as we do - so simply abort any focus set on such windows */
2680 /* be strict about accepting focus hint */
2681 /* be strict about accepting focus hint */
2682 if ((!ec->icccm.accepts_focus) &&
2683 (!ec->icccm.take_focus))
2687 if (e_client_focused_get() == ec)
2688 e_client_focused_set(NULL);
2690 ELOGF("FOCUS", "FOCUS UNSET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2691 evas_object_focus_set(obj, focus);
2695 if (focus && ec->lock_focus_out) return;
2696 if (e_object_is_del(E_OBJECT(ec)) && focus)
2697 CRI("CAN'T FOCUS DELETED CLIENT! ec:%p", ec);
2699 /* filter focus setting based on current state */
2704 ELOGF("FOCUS", "FOCUS SET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2705 evas_object_focus_set(obj, focus);
2708 if ((ec->iconic) && (!ec->deskshow))
2710 if (!e_policy_visibility_client_is_uniconify_render_running(ec))
2712 /* don't focus an iconified window. that's silly! */
2713 ELOGF("FOCUS", "Do uniconify to set focus", ec);
2714 e_client_uniconify(ec);
2715 if (e_client_focus_track_enabled())
2716 e_client_focus_latest_set(ec);
2724 if ((!ec->sticky) && (ec->desk) && (!ec->desk->visible))
2726 if (ec->desk->animate_count) return;
2727 e_desk_show(ec->desk);
2728 if (!ec->desk->visible) return;
2734 /* check for dialog children that steal focus */
2735 if ((ec->modal) && (ec->modal != ec) &&
2736 (ec->modal->visible) && (!e_object_is_del(E_OBJECT(ec->modal))))
2738 if (e_config->focus_policy_ext != E_FOCUS_EXT_TOP_STACK)
2740 ELOGF("FOCUS", "focus set | intercept focus to modal", ec->modal);
2741 e_client_frame_focus_set(ec->modal, focus);
2745 else if ((ec->leader) && (ec->leader->modal) &&
2746 (ec->leader->modal != ec) && ec->leader->modal->visible &&
2747 (!e_object_is_del(E_OBJECT(ec->leader->modal))))
2749 if (e_config->focus_policy_ext != E_FOCUS_EXT_TOP_STACK)
2751 ELOGF("FOCUS", "focus set | intercept focus to leader->modal", ec->leader->modal);
2752 e_client_frame_focus_set(ec->leader->modal, focus);
2758 /* not yet visible, wait till the next time... */
2759 ec->want_focus = !ec->hidden;
2764 e_client_focused_set(ec);
2768 if (e_client_focused_get() == ec)
2769 e_client_focused_set(NULL);
2773 ELOGF("FOCUS", "FOCUS SET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2775 ELOGF("FOCUS", "FOCUS UNSET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2777 evas_object_focus_set(obj, focus);
2781 _e_comp_intercept_color_set(void *data, Evas_Object *obj, int r, int g, int b, int a)
2783 E_Comp_Object *cw = data;
2785 if (cw->transparent.set)
2787 cw->transparent.user_r = r;
2788 cw->transparent.user_g = g;
2789 cw->transparent.user_b = b;
2790 cw->transparent.user_a = a;
2792 ELOGF("COMP", "Transparent user_color(%d,%d,%d,%d)",
2794 cw->transparent.user_r,
2795 cw->transparent.user_g,
2796 cw->transparent.user_b,
2797 cw->transparent.user_a);
2801 evas_object_color_set(obj, r, g, b, a);
2804 ////////////////////////////////////////////////////
2807 _e_comp_object_frame_recalc(E_Comp_Object *cw)
2809 int w, h, ox, oy, ow, oh;
2811 Eina_Bool pass_event_flag = EINA_FALSE;
2812 E_Input_Rect_Data *input_rect_data;
2813 E_Input_Rect_Smart_Data *input_rect_sd;
2815 if (cw->frame_object)
2817 if (cw->obj) edje_object_part_unswallow(cw->frame_object, cw->obj);
2818 evas_object_geometry_get(cw->frame_object, NULL, NULL, &w, &h);
2819 /* set a fixed size, force edje calc, check size difference */
2820 evas_object_resize(cw->frame_object, MAX(w, 50), MAX(h, 50));
2821 edje_object_message_signal_process(cw->frame_object);
2822 edje_object_calc_force(cw->frame_object);
2823 edje_object_part_geometry_get(cw->frame_object, "e.swallow.client", &ox, &oy, &ow, &oh);
2824 cw->client_inset.l = ox;
2825 cw->client_inset.r = MAX(w, 50) - (ox + ow);
2826 cw->client_inset.t = oy;
2827 cw->client_inset.b = MAX(h, 50) - (oy + oh);
2828 if (cw->obj) edje_object_part_swallow(cw->frame_object, "e.swallow.client", cw->obj);
2829 evas_object_resize(cw->frame_object, w, h);
2833 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
2836 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
2838 if (input_rect_data->obj)
2840 pass_event_flag = EINA_TRUE;
2846 evas_object_pass_events_set(cw->default_input_obj, pass_event_flag);
2847 evas_object_pass_events_set(cw->obj, pass_event_flag);
2851 cw->client_inset.l = 0;
2852 cw->client_inset.r = 0;
2853 cw->client_inset.t = 0;
2854 cw->client_inset.b = 0;
2856 cw->client_inset.calc = !!cw->frame_object;
2860 _e_comp_smart_cb_frame_recalc(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2862 E_Comp_Object *cw = data;
2865 /* - get current size
2867 * - readjust for new frame size
2870 w = cw->ec->w, h = cw->ec->h;
2871 e_comp_object_frame_wh_unadjust(obj, w, h, &pw, &ph);
2873 _e_comp_object_frame_recalc(cw);
2875 if (!cw->ec->fullscreen)
2876 e_comp_object_frame_wh_adjust(obj, cw->ec->client.w, cw->ec->client.h, &w, &h);
2878 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2879 if (cw->ec->shading || cw->ec->shaded) return;
2880 if (cw->ec->fullscreen)
2881 evas_object_resize(cw->ec->frame, cw->ec->zone->w, cw->ec->zone->h);
2882 else if (cw->ec->new_client)
2884 if ((cw->ec->w < 1) || (cw->ec->h < 1)) return;
2885 e_comp_object_frame_wh_adjust(obj, pw, ph, &w, &h);
2886 evas_object_resize(cw->ec->frame, w, h);
2888 else if ((w != cw->ec->w) || (h != cw->ec->h))
2889 evas_object_resize(cw->ec->frame, w, h);
2893 _e_comp_smart_cb_shading(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2895 E_Comp_Object *cw = data;
2897 if (!cw->ec) return; //NYI
2898 E_FREE_FUNC(cw->shade.anim, ecore_timer_del);
2900 cw->shade.x = cw->x;
2901 cw->shade.y = cw->y;
2902 e_comp_object_signal_emit(cw->smart_obj, "e,state,shading", "e");
2906 _e_comp_smart_cb_shaded(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2908 E_Comp_Object *cw = data;
2910 if (!cw->ec) return; //NYI
2911 E_FREE_FUNC(cw->shade.anim, ecore_timer_del);
2913 e_comp_object_signal_emit(cw->smart_obj, "e,state,shaded", "e");
2917 _e_comp_smart_cb_unshading(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2919 E_Comp_Object *cw = data;
2921 if (!cw->ec) return; //NYI
2922 E_FREE_FUNC(cw->shade.anim, ecore_timer_del);
2924 e_comp_object_signal_emit(cw->smart_obj, "e,state,unshading", "e");
2928 _e_comp_smart_cb_unshaded(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2930 E_Comp_Object *cw = data;
2932 if (!cw->ec) return; //NYI
2933 E_FREE_FUNC(cw->shade.anim, ecore_timer_del);
2935 e_comp_object_signal_emit(cw->smart_obj, "e,state,unshaded", "e");
2939 _e_comp_smart_cb_maximize(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2941 E_Comp_Object *cw = data;
2943 _e_comp_object_shadow_setup(cw);
2944 if (cw->frame_object)
2946 _e_comp_object_shadow(cw);
2947 e_comp_object_signal_emit(cw->smart_obj, "e,action,maximize", "e");
2948 _e_comp_object_frame_recalc(cw);
2949 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2954 _e_comp_smart_cb_fullscreen(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2956 E_Comp_Object *cw = data;
2958 if (_e_comp_object_shadow_setup(cw))
2959 e_comp_object_damage(cw->smart_obj, 0, 0, cw->ec->w, cw->ec->h);
2960 if (cw->frame_object)
2962 _e_comp_object_shadow(cw);
2963 e_comp_object_signal_emit(cw->smart_obj, "e,action,maximize,fullscreen", "e");
2964 _e_comp_object_frame_recalc(cw);
2965 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2970 _e_comp_smart_cb_unmaximize(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2972 E_Comp_Object *cw = data;
2974 if (cw->frame_object)
2976 _e_comp_object_shadow(cw);
2977 e_comp_object_signal_emit(obj, "e,action,unmaximize", "e");
2978 _e_comp_object_frame_recalc(cw);
2979 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2984 _e_comp_smart_cb_unfullscreen(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2986 E_Comp_Object *cw = data;
2988 if (_e_comp_object_shadow_setup(cw))
2991 cw->ec->changes.size = 1;
2993 if (cw->frame_object)
2995 _e_comp_object_shadow(cw);
2996 e_comp_object_signal_emit(obj, "e,action,unmaximize,unfullscreen", "e");
2997 _e_comp_object_frame_recalc(cw);
2998 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
3003 _e_comp_smart_cb_sticky(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3005 e_comp_object_signal_emit(obj, "e,state,sticky", "e");
3009 _e_comp_smart_cb_unsticky(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3011 e_comp_object_signal_emit(obj, "e,state,unsticky", "e");
3015 _e_comp_smart_cb_unhung(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3017 E_Comp_Object *cw = data;
3019 if (!cw->ec) return; //NYI
3020 e_comp_object_signal_emit(cw->smart_obj, "e,state,unhung", "e");
3024 _e_comp_smart_cb_hung(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3026 E_Comp_Object *cw = data;
3028 if (!cw->ec) return; //NYI
3029 e_comp_object_signal_emit(cw->smart_obj, "e,state,hung", "e");
3033 _e_comp_smart_focus_in(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3035 e_comp_object_signal_emit(obj, "e,state,focused", "e");
3039 _e_comp_smart_focus_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3041 E_Comp_Object *cw = data;
3043 if (!e_object_is_del(E_OBJECT(cw->ec)))
3044 e_comp_object_signal_emit(obj, "e,state,unfocused", "e");
3048 _e_comp_input_obj_smart_add(Evas_Object *obj)
3050 E_Input_Rect_Smart_Data *input_rect_sd;
3051 input_rect_sd = E_NEW(E_Input_Rect_Smart_Data, 1);
3053 if (!input_rect_sd) return;
3054 evas_object_smart_data_set(obj, input_rect_sd);
3058 _e_comp_input_obj_smart_del(Evas_Object *obj)
3060 E_Input_Rect_Smart_Data *input_rect_sd;
3061 E_Input_Rect_Data *input_rect_data;
3063 input_rect_sd = evas_object_smart_data_get(obj);
3064 if (!input_rect_sd) return;
3066 EINA_LIST_FREE(input_rect_sd->input_rect_data_list, input_rect_data)
3068 if (input_rect_data->obj)
3070 evas_object_smart_member_del(input_rect_data->obj);
3071 E_FREE_FUNC(input_rect_data->obj, evas_object_del);
3073 E_FREE(input_rect_data);
3075 E_FREE(input_rect_sd);
3079 _e_comp_input_obj_smart_move(Evas_Object *obj, int x, int y)
3081 E_Input_Rect_Smart_Data *input_rect_sd;
3082 E_Input_Rect_Data *input_rect_data;
3086 input_rect_sd = evas_object_smart_data_get(obj);
3087 if (!input_rect_sd) return;
3089 cw = input_rect_sd->cw;
3090 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3092 if (input_rect_data->obj)
3094 evas_object_geometry_set(input_rect_data->obj,
3095 x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
3096 y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
3097 input_rect_data->rect.w, input_rect_data->rect.h);
3103 _e_comp_input_obj_smart_resize(Evas_Object *obj, int w, int h)
3105 E_Input_Rect_Smart_Data *input_rect_sd;
3106 E_Input_Rect_Data *input_rect_data;
3110 input_rect_sd = evas_object_smart_data_get(obj);
3111 if (!input_rect_sd) return;
3113 cw = input_rect_sd->cw;
3114 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3116 if (input_rect_data->obj)
3118 evas_object_geometry_set(input_rect_data->obj,
3119 cw->x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
3120 cw->y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
3121 input_rect_data->rect.w, input_rect_data->rect.h);
3127 _e_comp_input_obj_smart_show(Evas_Object *obj)
3129 E_Input_Rect_Smart_Data *input_rect_sd;
3130 E_Input_Rect_Data *input_rect_data;
3133 input_rect_sd = evas_object_smart_data_get(obj);
3134 if (!input_rect_sd) return;
3136 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3138 if (input_rect_data->obj)
3140 evas_object_show(input_rect_data->obj);
3146 _e_comp_input_obj_smart_hide(Evas_Object *obj)
3148 E_Input_Rect_Smart_Data *input_rect_sd;
3149 E_Input_Rect_Data *input_rect_data;
3152 input_rect_sd = evas_object_smart_data_get(obj);
3153 if (!input_rect_sd) return;
3155 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3157 if (input_rect_data->obj)
3159 evas_object_hide(input_rect_data->obj);
3165 _e_comp_input_obj_smart_init(void)
3167 if (_e_comp_input_obj_smart) return;
3169 static const Evas_Smart_Class sc =
3171 INPUT_OBJ_SMART_NAME,
3172 EVAS_SMART_CLASS_VERSION,
3173 _e_comp_input_obj_smart_add,
3174 _e_comp_input_obj_smart_del,
3175 _e_comp_input_obj_smart_move,
3176 _e_comp_input_obj_smart_resize,
3177 _e_comp_input_obj_smart_show,
3178 _e_comp_input_obj_smart_hide,
3191 _e_comp_input_obj_smart = evas_smart_class_new(&sc);
3197 _e_comp_smart_add(Evas_Object *obj)
3201 cw = E_NEW(E_Comp_Object, 1);
3202 EINA_SAFETY_ON_NULL_RETURN(cw);
3204 cw->smart_obj = obj;
3205 cw->x = cw->y = cw->w = cw->h = -1;
3206 evas_object_smart_data_set(obj, cw);
3207 cw->opacity = 255.0;
3208 cw->external_content = 0;
3209 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_NONE;
3210 cw->transform_bg_color.r = 0;
3211 cw->transform_bg_color.g = 0;
3212 cw->transform_bg_color.b = 0;
3213 cw->transform_bg_color.a = 255;
3214 evas_object_data_set(obj, "comp_obj", cw);
3215 evas_object_move(obj, -1, -1);
3216 /* intercept ALL the callbacks! */
3217 evas_object_intercept_stack_above_callback_add(obj, _e_comp_intercept_stack_above, cw);
3218 evas_object_intercept_stack_below_callback_add(obj, _e_comp_intercept_stack_below, cw);
3219 evas_object_intercept_raise_callback_add(obj, _e_comp_intercept_raise, cw);
3220 evas_object_intercept_lower_callback_add(obj, _e_comp_intercept_lower, cw);
3221 evas_object_intercept_layer_set_callback_add(obj, _e_comp_intercept_layer_set, cw);
3222 evas_object_intercept_move_callback_add(obj, _e_comp_intercept_move, cw);
3223 evas_object_intercept_resize_callback_add(obj, _e_comp_intercept_resize, cw);
3224 evas_object_intercept_show_callback_add(obj, _e_comp_intercept_show, cw);
3225 evas_object_intercept_hide_callback_add(obj, _e_comp_intercept_hide, cw);
3226 evas_object_intercept_focus_set_callback_add(obj, _e_comp_intercept_focus, cw);
3227 evas_object_intercept_color_set_callback_add(obj, _e_comp_intercept_color_set, cw);
3229 evas_object_smart_callback_add(obj, "shading", _e_comp_smart_cb_shading, cw);
3230 evas_object_smart_callback_add(obj, "shaded", _e_comp_smart_cb_shaded, cw);
3231 evas_object_smart_callback_add(obj, "unshading", _e_comp_smart_cb_unshading, cw);
3232 evas_object_smart_callback_add(obj, "unshaded", _e_comp_smart_cb_unshaded, cw);
3234 evas_object_smart_callback_add(obj, "maximize", _e_comp_smart_cb_maximize, cw);
3235 evas_object_smart_callback_add(obj, "fullscreen", _e_comp_smart_cb_fullscreen, cw);
3236 evas_object_smart_callback_add(obj, "unmaximize", _e_comp_smart_cb_unmaximize, cw);
3237 evas_object_smart_callback_add(obj, "unfullscreen", _e_comp_smart_cb_unfullscreen, cw);
3239 evas_object_smart_callback_add(obj, "stick", _e_comp_smart_cb_sticky, cw);
3240 evas_object_smart_callback_add(obj, "unstick", _e_comp_smart_cb_unsticky, cw);
3242 evas_object_smart_callback_add(obj, "hung", _e_comp_smart_cb_hung, cw);
3243 evas_object_smart_callback_add(obj, "unhung", _e_comp_smart_cb_unhung, cw);
3245 evas_object_smart_callback_add(obj, "frame_recalc", _e_comp_smart_cb_frame_recalc, cw);
3247 evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_IN, _e_comp_smart_focus_in, cw);
3248 evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_OUT, _e_comp_smart_focus_out, cw);
3252 _e_comp_smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
3255 evas_object_color_set(cw->clip, r, g, b, a);
3256 evas_object_smart_callback_call(obj, "color_set", NULL);
3261 _e_comp_smart_clip_set(Evas_Object *obj, Evas_Object *clip)
3264 evas_object_clip_set(cw->clip, clip);
3268 _e_comp_smart_clip_unset(Evas_Object *obj)
3271 evas_object_clip_unset(cw->clip);
3275 _e_comp_smart_hide(Evas_Object *obj)
3277 TRACE_DS_BEGIN(COMP:SMART HIDE);
3282 evas_object_hide(cw->clip);
3283 if (cw->input_obj) evas_object_hide(cw->input_obj);
3284 evas_object_hide(cw->effect_obj);
3285 if (cw->default_input_obj) evas_object_hide(cw->default_input_obj);
3286 if (cw->transform_bg_obj) evas_object_hide(cw->transform_bg_obj);
3287 if (cw->transform_tranp_obj) evas_object_hide(cw->transform_tranp_obj);
3294 /* unset native surface if current displaying buffer was destroied */
3295 if (!cw->buffer_destroy_listener.notify)
3297 Evas_Native_Surface *ns;
3298 ns = evas_object_image_native_surface_get(cw->obj);
3299 if ((ns) && (ns->type == EVAS_NATIVE_SURFACE_WL) && (ns->data.wl.legacy_buffer))
3300 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
3303 if (!cw->ec->input_only)
3305 edje_object_freeze(cw->effect_obj);
3306 edje_object_freeze(cw->shobj);
3307 edje_object_play_set(cw->shobj, 0);
3308 if (cw->frame_object)
3309 edje_object_play_set(cw->frame_object, 0);
3311 /* ensure focus-out */
3312 if (cw->ec->focused &&
3313 (e_config->focus_policy_ext != E_FOCUS_EXT_TOP_STACK))
3315 ELOGF("FOCUS", "focus unset | smart_hide", cw->ec);
3316 e_client_frame_focus_set(cw->ec, EINA_FALSE);
3317 e_client_focus_defer_unset(cw->ec);
3319 e_comp_render_queue(); //force nocomp recheck
3325 _e_comp_smart_show(Evas_Object *obj)
3333 if ((cw->w < 0) || (cw->h < 0))
3334 CRI("ACK! ec:%p", cw->ec);
3336 TRACE_DS_BEGIN(COMP:SMART SHOW);
3338 e_comp_object_map_update(obj);
3340 EINA_LIST_FOREACH(cw->ec->e.state.video_child, l, tmp)
3341 evas_object_show(tmp->frame);
3343 evas_object_show(cw->clip);
3344 if (cw->input_obj) evas_object_show(cw->input_obj);
3345 if (!cw->ec->input_only)
3347 edje_object_thaw(cw->effect_obj);
3348 edje_object_thaw(cw->shobj);
3349 edje_object_play_set(cw->shobj, 1);
3350 if (cw->frame_object)
3351 edje_object_play_set(cw->frame_object, 1);
3353 evas_object_show(cw->effect_obj);
3354 if (cw->mask.obj) evas_object_show(cw->mask.obj);
3355 if (cw->transform_bg_obj) evas_object_show(cw->transform_bg_obj);
3356 if (cw->transform_tranp_obj) evas_object_show(cw->transform_tranp_obj);
3357 if (cw->default_input_obj) evas_object_show(cw->default_input_obj);
3358 e_comp_render_queue();
3359 if (cw->ec->input_only)
3364 if (cw->ec->iconic && (!cw->ec->new_client))
3366 if (e_client_is_iconified_by_client(cw->ec))
3368 ELOGF("COMP", "Set launching flag..", cw->ec);
3369 cw->ec->launching = EINA_TRUE;
3372 e_comp_object_signal_emit(cw->smart_obj, "e,action,uniconify", "e");
3374 else if (!cw->showing) /* if set, client was ec->hidden during show animation */
3377 ELOGF("COMP", "Set launching flag..", cw->ec);
3378 cw->ec->launching = EINA_TRUE;
3380 e_comp_object_signal_emit(cw->smart_obj, "e,state,visible", "e");
3381 _e_comp_object_animating_begin(cw);
3382 if (!_e_comp_object_effect_visibility_start(cw, 1))
3388 /* ensure some random effect doesn't lock the client offscreen */
3392 e_comp_object_effect_set(obj, NULL);
3395 _e_comp_object_dim_update(cw);
3401 _e_comp_smart_del(Evas_Object *obj)
3407 if (cw->buffer_destroy_listener.notify)
3409 wl_list_remove(&cw->buffer_destroy_listener.link);
3410 cw->buffer_destroy_listener.notify = NULL;
3413 if (cw->tbm_surface)
3415 tbm_surface_internal_unref(cw->tbm_surface);
3416 cw->tbm_surface = NULL;
3419 if (cw->render_update_lock.buffer_ref.buffer)
3421 ELOGF("COMP", "Clear buffer_ref of render_update_lock:%d",
3422 cw->ec, cw->render_update_lock.lock);
3423 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, NULL);
3426 e_comp_object_render_update_del(cw->smart_obj);
3427 E_FREE_FUNC(cw->updates, eina_tiler_free);
3428 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
3435 EINA_LIST_FREE(cw->obj_mirror, o)
3437 evas_object_image_data_set(o, NULL);
3438 evas_object_freeze_events_set(o, 1);
3439 evas_object_event_callback_del_full(o, EVAS_CALLBACK_DEL, _e_comp_object_cb_mirror_del, cw);
3443 _e_comp_object_layers_remove(cw);
3444 l = evas_object_data_get(obj, "comp_object-to_del");
3445 E_FREE_LIST(l, evas_object_del);
3446 _e_comp_object_mouse_event_callback_unset(cw);
3447 evas_object_del(cw->clip);
3448 evas_object_del(cw->effect_obj);
3449 evas_object_del(cw->shobj);
3450 evas_object_del(cw->frame_object);
3451 evas_object_del(cw->zoomobj);
3452 evas_object_del(cw->input_obj);
3453 evas_object_del(cw->obj);
3454 evas_object_del(cw->mask.obj);
3455 if (cw->dim.mask_obj) evas_object_del(cw->dim.mask_obj);
3456 evas_object_del(cw->transform_bg_obj);
3457 evas_object_del(cw->transform_tranp_obj);
3458 evas_object_del(cw->default_input_obj);
3459 eina_stringshare_del(cw->frame_theme);
3460 eina_stringshare_del(cw->frame_name);
3464 e_comp->animating--;
3466 e_object_unref(E_OBJECT(cw->ec));
3468 cw->ec->frame = NULL;
3473 _e_comp_smart_move(Evas_Object *obj, int x, int y)
3477 cw->x = x, cw->y = y;
3478 evas_object_move(cw->effect_obj, x, y);
3479 evas_object_move(cw->default_input_obj, x, y);
3480 if (cw->input_obj) evas_object_move(cw->input_obj, x, y);
3482 e_comp_object_map_update(obj);
3486 _e_comp_smart_resize(Evas_Object *obj, int w, int h)
3488 Eina_Bool first = EINA_FALSE;
3493 if (!cw->effect_obj) CRI("ACK! ec:%p", cw->ec);
3495 TRACE_DS_BEGIN(COMP:SMART RESIZE);
3497 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
3499 if (cw->w != w || cw->h != h)
3500 e_comp_object_map_update(obj);
3502 first = ((cw->w < 1) || (cw->h < 1));
3503 cw->w = w, cw->h = h;
3504 if ((!cw->ec->shading) && (!cw->ec->shaded))
3508 if (cw->frame_object)
3509 e_comp_object_frame_wh_unadjust(obj, w, h, &ww, &hh);
3512 /* verify pixmap:object size */
3513 if (e_pixmap_size_get(cw->ec->pixmap, &pw, &ph) && (!cw->ec->override))
3515 if ((ww != pw) || (hh != ph))
3516 ELOGF("COMP", "CW RSZ: %dx%d || PX: %dx%d.", cw->ec, ww, hh, pw, ph);
3518 evas_object_resize(cw->effect_obj, tw, th);
3519 evas_object_resize(cw->default_input_obj, w, h);
3520 if (cw->zoomobj) e_zoomap_child_resize(cw->zoomobj, pw, ph);
3522 evas_object_resize(cw->input_obj, w, h);
3524 evas_object_resize(cw->mask.obj, w, h);
3525 /* resize render update tiler */
3528 RENDER_DEBUG("DAMAGE UNFULL: %p", cw->ec);
3529 cw->updates_full = 0;
3530 if (cw->updates) eina_tiler_clear(cw->updates);
3534 RENDER_DEBUG("DAMAGE RESIZE(%p): %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
3535 if (cw->updates) eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
3540 evas_object_resize(cw->effect_obj, tw, th);
3541 evas_object_resize(cw->default_input_obj, w, h);
3548 e_comp_render_queue();
3554 _e_comp_smart_init(void)
3556 if (_e_comp_smart) return;
3558 static const Evas_Smart_Class sc =
3561 EVAS_SMART_CLASS_VERSION,
3565 _e_comp_smart_resize,
3568 _e_comp_smart_color_set,
3569 _e_comp_smart_clip_set,
3570 _e_comp_smart_clip_unset,
3580 _e_comp_smart = evas_smart_class_new(&sc);
3585 e_comp_object_init(void)
3587 E_EVENT_COMP_OBJECT_ADD = ecore_event_type_new();
3588 E_EVENT_COMP_OBJECT_IMG_RENDER = ecore_event_type_new();
3589 E_EVENT_COMP_OBJECT_EFFECT_START = ecore_event_type_new();
3590 E_EVENT_COMP_OBJECT_EFFECT_END = ecore_event_type_new();
3594 e_comp_object_shutdown(void)
3600 e_comp_object_zoomap_set(Evas_Object *obj, Eina_Bool enabled)
3604 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
3607 if (cw->zoomap_disabled == enabled) return;
3610 cw->zoomobj = e_zoomap_add(e_comp->evas);
3611 e_zoomap_smooth_set(cw->zoomobj, e_comp_config_get()->smooth_windows);
3612 e_zoomap_child_set(cw->zoomobj, cw->frame_object);
3613 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->zoomobj);
3614 e_zoomap_child_edje_solid_setup(cw->zoomobj);
3615 if (cw->ec->override)
3616 evas_object_name_set(cw->zoomobj, "cw->zoomobj::WINDOW");
3617 else if (!cw->ec->input_only)
3618 evas_object_name_set(cw->zoomobj, "cw->zoomobj::CLIENT");
3622 edje_object_part_unswallow(cw->shobj, cw->zoomobj);
3623 E_FREE_FUNC(cw->zoomobj, evas_object_del);
3624 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object);
3626 cw->zoomap_disabled = enabled;
3630 e_comp_object_mirror_visibility_check(Evas_Object *obj)
3632 API_ENTRY EINA_FALSE;
3633 return !!cw->force_visible;
3635 /////////////////////////////////////////////////////////
3638 _e_comp_object_util_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3641 Eina_Bool comp_object;
3643 comp_object = !!evas_object_data_get(obj, "comp_object");
3648 o = edje_object_part_swallow_get(obj, "e.swallow.content");
3650 e_comp_render_queue();
3652 l = evas_object_data_get(obj, "comp_object-to_del");
3653 E_FREE_LIST(l, evas_object_del);
3657 _e_comp_object_util_restack(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3659 if (e_comp_util_object_is_above_nocomp(obj) &&
3660 (!evas_object_data_get(obj, "comp_override")))
3662 evas_object_data_set(obj, "comp_override", (void*)1);
3663 e_comp_override_add();
3668 _e_comp_object_util_show(void *data EINA_UNUSED, Evas_Object *obj)
3670 Eina_Bool ref = EINA_TRUE;
3671 if (evas_object_visible_get(obj))
3675 d = evas_object_data_del(obj, "comp_hiding");
3677 /* currently trying to hide */
3680 /* already visible */
3684 evas_object_show(obj);
3687 evas_object_ref(obj);
3688 evas_object_data_set(obj, "comp_ref", (void*)1);
3690 edje_object_signal_emit(obj, "e,state,visible", "e");
3691 evas_object_data_set(obj, "comp_showing", (void*)1);
3692 if (e_comp_util_object_is_above_nocomp(obj))
3694 evas_object_data_set(obj, "comp_override", (void*)1);
3695 e_comp_override_add();
3700 _e_comp_object_util_hide(void *data EINA_UNUSED, Evas_Object *obj)
3702 if (!evas_object_visible_get(obj)) return;
3703 /* already hiding */
3704 if (evas_object_data_get(obj, "comp_hiding")) return;
3705 if (!evas_object_data_del(obj, "comp_showing"))
3707 evas_object_ref(obj);
3708 evas_object_data_set(obj, "comp_ref", (void*)1);
3710 edje_object_signal_emit(obj, "e,state,hidden", "e");
3711 evas_object_data_set(obj, "comp_hiding", (void*)1);
3713 if (evas_object_data_del(obj, "comp_override"))
3714 e_comp_override_timed_pop();
3718 _e_comp_object_util_done_defer(void *data, Evas_Object *obj, const char *emission, const char *source EINA_UNUSED)
3720 if (!e_util_strcmp(emission, "e,action,hide,done"))
3722 if (!evas_object_data_del(obj, "comp_hiding")) return;
3723 evas_object_intercept_hide_callback_del(obj, _e_comp_object_util_hide);
3724 evas_object_hide(obj);
3725 evas_object_intercept_hide_callback_add(obj, _e_comp_object_util_hide, data);
3728 evas_object_data_del(obj, "comp_showing");
3729 if (evas_object_data_del(obj, "comp_ref"))
3730 evas_object_unref(obj);
3734 _e_comp_object_util_moveresize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3740 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
3741 e_zoomap_child_resize(data, w, h);
3745 E_API E_Comp_Object_Hook *
3746 e_comp_object_hook_add(E_Comp_Object_Hook_Point hookpoint, E_Comp_Object_Hook_Cb func, const void *data)
3748 E_Comp_Object_Hook *ch;
3750 EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_COMP_OBJECT_HOOK_LAST, NULL);
3751 ch = E_NEW(E_Comp_Object_Hook, 1);
3752 if (!ch) return NULL;
3753 ch->hookpoint = hookpoint;
3755 ch->data = (void*)data;
3756 _e_comp_object_hooks[hookpoint] = eina_inlist_append(_e_comp_object_hooks[hookpoint], EINA_INLIST_GET(ch));
3761 e_comp_object_hook_del(E_Comp_Object_Hook *ch)
3764 if (_e_comp_object_hooks_walking == 0)
3766 _e_comp_object_hooks[ch->hookpoint] = eina_inlist_remove(_e_comp_object_hooks[ch->hookpoint], EINA_INLIST_GET(ch));
3770 _e_comp_object_hooks_delete++;
3773 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
3774 E_API E_Comp_Object_Intercept_Hook *
3775 e_comp_object_intercept_hook_add(E_Comp_Object_Intercept_Hook_Point hookpoint, E_Comp_Object_Intercept_Hook_Cb func, const void *data)
3777 E_Comp_Object_Intercept_Hook *ch;
3779 EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_COMP_OBJECT_INTERCEPT_HOOK_LAST, NULL);
3780 ch = E_NEW(E_Comp_Object_Intercept_Hook, 1);
3781 if (!ch) return NULL;
3782 ch->hookpoint = hookpoint;
3784 ch->data = (void*)data;
3785 _e_comp_object_intercept_hooks[hookpoint] = eina_inlist_append(_e_comp_object_intercept_hooks[hookpoint], EINA_INLIST_GET(ch));
3790 e_comp_object_intercept_hook_del(E_Comp_Object_Intercept_Hook *ch)
3793 if (_e_comp_object_intercept_hooks_walking == 0)
3795 _e_comp_object_intercept_hooks[ch->hookpoint] = eina_inlist_remove(_e_comp_object_intercept_hooks[ch->hookpoint], EINA_INLIST_GET(ch));
3799 _e_comp_object_intercept_hooks_delete++;
3803 EINTERN Evas_Object *
3804 e_comp_object_util_add(Evas_Object *obj, E_Comp_Object_Type type)
3806 Evas_Object *o, *z = NULL;
3808 Eina_List *l, *list = NULL;
3809 E_Comp_Config *conf = e_comp_config_get();
3810 Eina_Bool skip = EINA_FALSE, fast = EINA_FALSE, shadow = EINA_FALSE;
3817 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
3821 case E_COMP_OBJECT_TYPE_MENU:
3822 list = conf->match.menus;
3823 skip = conf->match.disable_menus;
3824 fast = conf->fast_menus;
3827 case E_COMP_OBJECT_TYPE_POPUP:
3828 list = conf->match.popups;
3829 skip = conf->match.disable_popups;
3830 fast = conf->fast_popups;
3833 list = conf->match.objects;
3834 skip = conf->match.disable_objects;
3835 fast = conf->fast_objects;
3837 name = evas_object_name_get(obj);
3838 vis = evas_object_visible_get(obj);
3839 o = edje_object_add(e_comp->evas);
3840 evas_object_data_set(o, "comp_object", (void*)1);
3841 if (name && (!skip))
3842 skip = (!strncmp(name, "noshadow", 8));
3844 evas_object_data_set(o, "comp_object_skip", (void*)1);
3847 EINA_LIST_FOREACH(list, l, m)
3849 if (((m->name) && (!name)) ||
3850 ((name) && (m->name) && (!e_util_glob_match(name, m->name))))
3852 if (!m->shadow_style) continue;
3855 snprintf(buf, sizeof(buf), "e/comp/frame/%s/fast", m->shadow_style);
3856 ok = e_theme_edje_object_set(o, "base/theme/comp", buf);
3860 snprintf(buf, sizeof(buf), "e/comp/frame/%s", m->shadow_style);
3861 ok = e_theme_edje_object_set(o, "base/theme/comp", buf);
3865 shadow = !m->no_shadow;
3875 ok = e_theme_edje_object_set(o, "base/theme/comp", "e/comp/frame/none");
3877 if (conf->shadow_style)
3881 snprintf(buf, sizeof(buf), "e/comp/frame/%s/fast", conf->shadow_style);
3882 ok = e_theme_edje_object_set(o, "base/theme/comp", buf);
3886 snprintf(buf, sizeof(buf), "e/comp/frame/%s", conf->shadow_style);
3887 ok = e_theme_edje_object_set(o, "base/theme/comp", buf);
3892 ok = e_theme_edje_object_set(o, "base/theme/comp", "e/comp/frame/default/fast");
3894 ok = e_theme_edje_object_set(o, "base/theme/comp", "e/comp/frame/default");
3897 if (shadow && (e_util_strcmp(evas_object_type_get(obj), "edje") || (!edje_object_data_get(obj, "noshadow"))))
3898 edje_object_signal_emit(o, "e,state,shadow,on", "e");
3900 edje_object_signal_emit(o, "e,state,shadow,off", "e");
3902 evas_object_geometry_get(obj, &x, &y, &w, &h);
3903 evas_object_geometry_set(o, x, y, w, h);
3904 evas_object_pass_events_set(o, evas_object_pass_events_get(obj));
3908 z = e_zoomap_add(e_comp->evas);
3909 e_zoomap_child_edje_solid_setup(z);
3910 e_zoomap_smooth_set(z, conf->smooth_windows);
3911 e_zoomap_child_set(z, obj);
3912 e_zoomap_child_resize(z, w, h);
3913 evas_object_show(z);
3915 edje_object_signal_callback_add(o, "e,action,*,done", "e", _e_comp_object_util_done_defer, z);
3917 evas_object_intercept_show_callback_add(o, _e_comp_object_util_show, z);
3918 evas_object_intercept_hide_callback_add(o, _e_comp_object_util_hide, z);
3919 evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _e_comp_object_util_moveresize, z);
3920 evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, _e_comp_object_util_del, z);
3921 evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE, _e_comp_object_util_moveresize, z);
3922 evas_object_event_callback_add(o, EVAS_CALLBACK_RESTACK, _e_comp_object_util_restack, z);
3924 e_comp_object_signal_emit(o, "e,state,hidden", "e");
3926 edje_object_part_swallow(o, "e.swallow.content", z ?: obj);
3928 _e_comp_object_event_add(o);
3931 evas_object_show(o);
3936 /* utility functions for deleting objects when their "owner" is deleted */
3938 e_comp_object_util_del_list_append(Evas_Object *obj, Evas_Object *to_del)
3943 EINA_SAFETY_ON_NULL_RETURN(to_del);
3944 l = evas_object_data_get(obj, "comp_object-to_del");
3945 evas_object_data_set(obj, "comp_object-to_del", eina_list_append(l, to_del));
3946 evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _e_comp_object_util_del);
3947 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_util_del, NULL);
3951 e_comp_object_util_del_list_remove(Evas_Object *obj, Evas_Object *to_del)
3956 EINA_SAFETY_ON_NULL_RETURN(to_del);
3957 l = evas_object_data_get(obj, "comp_object-to_del");
3959 evas_object_data_set(obj, "comp_object-to_del", eina_list_remove(l, to_del));
3962 /////////////////////////////////////////////////////////
3964 EINTERN Evas_Object *
3965 e_comp_object_client_add(E_Client *ec)
3970 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, NULL);
3971 if (ec->frame) return NULL;
3972 _e_comp_smart_init();
3973 o = evas_object_smart_add(e_comp->evas, _e_comp_smart);
3974 cw = evas_object_smart_data_get(o);
3975 if (!cw) return NULL;
3976 evas_object_data_set(o, "E_Client", ec);
3979 evas_object_data_set(o, "comp_object", (void*)1);
3981 _e_comp_object_event_add(o);
3986 /* utility functions for getting client inset */
3988 e_comp_object_frame_xy_adjust(Evas_Object *obj, int x, int y, int *ax, int *ay)
3991 if (!cw->client_inset.calc)
3997 if (ax) *ax = x - cw->client_inset.l;
3998 if (ay) *ay = y - cw->client_inset.t;
4002 e_comp_object_frame_xy_unadjust(Evas_Object *obj, int x, int y, int *ax, int *ay)
4005 if (!cw->client_inset.calc)
4011 if (ax) *ax = x + cw->client_inset.l;
4012 if (ay) *ay = y + cw->client_inset.t;
4016 e_comp_object_frame_wh_adjust(Evas_Object *obj, int w, int h, int *aw, int *ah)
4019 if (!cw->client_inset.calc)
4025 if (aw) *aw = w + cw->client_inset.l + cw->client_inset.r;
4026 if (ah) *ah = h + cw->client_inset.t + cw->client_inset.b;
4030 e_comp_object_frame_wh_unadjust(Evas_Object *obj, int w, int h, int *aw, int *ah)
4033 if (!cw->client_inset.calc)
4039 if (aw) *aw = w - cw->client_inset.l - cw->client_inset.r;
4040 if (ah) *ah = h - cw->client_inset.t - cw->client_inset.b;
4044 e_comp_object_client_get(Evas_Object *obj)
4049 /* FIXME: remove this when eo is used */
4050 o = evas_object_data_get(obj, "comp_smart_obj");
4052 return e_comp_object_client_get(o);
4053 return cw ? cw->ec : NULL;
4057 e_comp_object_frame_extends_get(Evas_Object *obj, int *x, int *y, int *w, int *h)
4060 if (cw->frame_extends)
4061 edje_object_parts_extends_calc(cw->frame_object, x, y, w, h);
4066 if (w) *w = cw->ec->w;
4067 if (h) *h = cw->ec->h;
4072 e_comp_object_util_zone_get(Evas_Object *obj)
4074 E_Zone *zone = NULL;
4078 zone = cw->ec->zone;
4083 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
4084 zone = e_comp_zone_xy_get(x, y);
4090 e_comp_object_util_center(Evas_Object *obj)
4092 int x, y, w, h, ow, oh;
4097 zone = e_comp_object_util_zone_get(obj);
4098 EINA_SAFETY_ON_NULL_RETURN(zone);
4099 e_zone_useful_geometry_get(zone, &x, &y, &w, &h);
4100 if (cw && (cw->ec->changes.size || cw->ec->new_client))
4101 ow = cw->ec->w, oh = cw->ec->h;
4103 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
4104 x = x + (w - ow) / 2;
4105 y = y + (h - oh) / 2;
4106 evas_object_move(obj, x, y);
4110 e_comp_object_util_center_on(Evas_Object *obj, Evas_Object *on)
4112 int x, y, w, h, ow, oh;
4115 EINA_SAFETY_ON_NULL_RETURN(on);
4116 evas_object_geometry_get(on, &x, &y, &w, &h);
4117 if (cw && (cw->ec->changes.size || cw->ec->new_client))
4118 ow = cw->ec->w, oh = cw->ec->h;
4120 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
4121 evas_object_move(obj, x + (w / 2) - (ow / 2), y + (h / 2) - (oh / 2));
4125 e_comp_object_util_fullscreen(Evas_Object *obj)
4130 e_client_fullscreen(cw->ec, E_FULLSCREEN_RESIZE);
4133 evas_object_move(obj, 0, 0);
4134 evas_object_resize(obj, e_comp->w, e_comp->h);
4139 e_comp_object_util_center_pos_get(Evas_Object *obj, int *x, int *y)
4147 ow = cw->w, oh = cw->h;
4149 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
4150 zone = e_comp_object_util_zone_get(obj);
4151 e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh);
4152 if (x) *x = zx + (zw - ow) / 2;
4153 if (y) *y = zy + (zh - oh) / 2;
4157 e_comp_object_input_objs_del(Evas_Object *obj)
4160 E_Input_Rect_Data *input_rect_data;
4161 E_Input_Rect_Smart_Data *input_rect_sd;
4166 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4167 if (!input_rect_sd) return;
4169 EINA_LIST_FREE(input_rect_sd->input_rect_data_list, input_rect_data)
4171 if (input_rect_data->obj)
4173 evas_object_smart_member_del(input_rect_data->obj);
4174 E_FREE_FUNC(input_rect_data->obj, evas_object_del);
4176 E_FREE(input_rect_data);
4181 e_comp_object_input_area_set(Evas_Object *obj, int x, int y, int w, int h)
4184 E_Input_Rect_Data *input_rect_data = NULL;
4185 E_Input_Rect_Smart_Data *input_rect_sd;
4186 int client_w, client_h;
4188 if (cw->ec->client.w)
4189 client_w = cw->ec->client.w;
4191 client_w = cw->ec->w;
4193 if (cw->ec->client.h)
4194 client_h = cw->ec->client.h;
4196 client_h = cw->ec->h;
4198 E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, client_w, client_h);
4202 _e_comp_input_obj_smart_init();
4203 cw->input_obj = evas_object_smart_add(e_comp->evas, _e_comp_input_obj_smart);
4204 evas_object_smart_member_add(cw->input_obj, cw->smart_obj);
4205 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4208 input_rect_sd->cw = cw;
4211 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4214 input_rect_data = E_NEW(E_Input_Rect_Data, 1);
4215 if (input_rect_data)
4217 EINA_RECTANGLE_SET(&input_rect_data->rect, x, y, w, h);
4218 input_rect_sd->input_rect_data_list = eina_list_append(input_rect_sd->input_rect_data_list, input_rect_data);
4222 if ((input_rect_data) &&
4223 (x || y || (w != cw->ec->client.w) || (h != cw->ec->client.h)))
4225 input_rect_data->obj = evas_object_rectangle_add(e_comp->evas);
4226 evas_object_name_set(input_rect_data->obj, "cw->input_obj");
4227 evas_object_color_set(input_rect_data->obj, 0, 0, 0, 0);
4228 evas_object_clip_set(input_rect_data->obj, cw->clip);
4229 evas_object_smart_member_add(input_rect_data->obj, cw->input_obj);
4230 evas_object_geometry_set(input_rect_data->obj,
4231 MAX(cw->ec->client.x + (!!cw->frame_object * cw->client_inset.l), 0) + x,
4232 MAX(cw->ec->client.y + (!!cw->frame_object * cw->client_inset.t), 0) + y, w, h);
4233 evas_object_pass_events_set(cw->default_input_obj, 1);
4234 evas_object_pass_events_set(cw->obj, 1);
4237 evas_object_show(input_rect_data->obj);
4238 evas_object_show(cw->input_obj);
4243 evas_object_smart_member_del(cw->input_obj);
4244 E_FREE_FUNC(cw->input_obj, evas_object_del);
4245 evas_object_pass_events_set(cw->default_input_obj, 0);
4246 evas_object_pass_events_set(cw->obj, 0);
4251 e_comp_object_input_rect_get(Evas_Object *obj, Eina_List **list)
4254 E_Input_Rect_Smart_Data *input_rect_sd;
4255 E_Input_Rect_Data *input_rect_data;
4258 if (!cw->input_obj) return;
4260 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4263 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
4265 *list = eina_list_append(*list, &input_rect_data->rect);
4271 e_comp_object_frame_geometry_get(Evas_Object *obj, int *l, int *r, int *t, int *b)
4274 if (l) *l = cw->client_inset.l;
4275 if (r) *r = cw->client_inset.r;
4276 if (t) *t = cw->client_inset.t;
4277 if (b) *b = cw->client_inset.b;
4280 /* set geometry for CSD */
4282 e_comp_object_frame_geometry_set(Evas_Object *obj, int l, int r, int t, int b)
4288 if (cw->frame_object)
4289 CRI("ACK! ec:%p", cw->ec);
4290 if ((cw->client_inset.l == l) && (cw->client_inset.r == r) &&
4291 (cw->client_inset.t == t) && (cw->client_inset.b == b)) return;
4292 calc = cw->client_inset.calc;
4293 cw->client_inset.calc = l || r || t || b;
4294 eina_stringshare_replace(&cw->frame_theme, "borderless");
4295 if (cw->client_inset.calc)
4297 tw = cw->ec->w + ((l + r) - (cw->client_inset.l + cw->client_inset.r));
4298 th = cw->ec->h + ((t + b) - (cw->client_inset.t + cw->client_inset.b));
4299 e_client_size_set(cw->ec, tw, th);
4301 else if (cw->ec->maximized || cw->ec->fullscreen)
4303 cw->ec->saved.w -= ((l + r) - (cw->client_inset.l + cw->client_inset.r));
4304 cw->ec->saved.h -= ((t + b) - (cw->client_inset.t + cw->client_inset.b));
4306 if (!cw->ec->new_client)
4308 if (calc && cw->client_inset.calc)
4310 tx = cw->ec->x - (l - cw->client_inset.l);
4311 ty = cw->ec->y - (t - cw->client_inset.t);
4312 e_client_pos_set(cw->ec, tx, ty);
4314 cw->ec->changes.pos = cw->ec->changes.size = 1;
4317 cw->client_inset.l = l;
4318 cw->client_inset.r = r;
4319 cw->client_inset.t = t;
4320 cw->client_inset.b = b;
4324 e_comp_object_frame_allowed(Evas_Object *obj)
4326 API_ENTRY EINA_FALSE;
4327 return (!cw->ec->mwm.borderless) && (cw->frame_object || (!cw->client_inset.calc));
4331 e_comp_object_frame_title_set(Evas_Object *obj, const char *name)
4333 API_ENTRY EINA_FALSE;
4334 if (!e_util_strcmp(cw->frame_name, name)) return EINA_FALSE;
4335 eina_stringshare_replace(&cw->frame_name, name);
4336 if (cw->frame_object)
4337 edje_object_part_text_set(cw->frame_object, "e.text.title", cw->frame_name);
4342 e_comp_object_frame_exists(Evas_Object *obj)
4344 API_ENTRY EINA_FALSE;
4345 return !!cw->frame_object;
4349 e_comp_object_frame_theme_set(Evas_Object *obj, const char *name)
4351 Evas_Object *o, *pbg;
4354 Eina_Stringshare *theme;
4356 API_ENTRY EINA_FALSE;
4358 if (!e_util_strcmp(cw->frame_theme, name))
4359 return edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object ?: cw->obj);
4360 if (!e_util_strcmp(name, "COMP_RESHADOW"))
4361 return _e_comp_object_shadow_setup(cw);
4362 pbg = cw->frame_object;
4363 theme = eina_stringshare_add(name);
4365 if (cw->frame_object)
4369 w = cw->ec->w, h = cw->ec->h;
4370 e_comp_object_frame_wh_unadjust(obj, w, h, &cw->ec->w, &cw->ec->h);
4371 if ((cw->ec->w != w) || (cw->ec->h != h))
4373 cw->ec->changes.size = 1;
4376 E_FREE_FUNC(cw->frame_object, evas_object_del);
4377 if (!name) goto reshadow;
4379 o = edje_object_add(e_comp->evas);
4380 snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", name);
4381 ok = e_theme_edje_object_set(o, "base/theme/border", buf);
4382 if ((!ok) && (!e_util_strcmp(name, "borderless")))
4384 cw->frame_object = NULL;
4386 eina_stringshare_del(cw->frame_theme);
4387 cw->frame_theme = theme;
4392 if (theme != e_config->theme_default_border_style)
4394 snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", e_config->theme_default_border_style);
4395 ok = e_theme_edje_object_set(o, "base/theme/border", buf);
4399 ok = e_theme_edje_object_set(o, "base/theme/border",
4400 "e/widgets/border/default/border");
4401 if (ok && (theme == e_config->theme_default_border_style))
4403 /* Reset default border style to default */
4404 eina_stringshare_replace(&e_config->theme_default_border_style, "default");
4405 e_config_save_queue();
4412 cw->frame_object = o;
4413 eina_stringshare_del(cw->frame_theme);
4414 cw->frame_theme = theme;
4415 evas_object_name_set(o, "cw->frame_object");
4418 edje_object_part_text_set(o, "e.text.title", cw->frame_name);
4422 cw->ec->changes.icon = 1;
4428 CRI("USER IS USING A SHITTY THEME! ABORT!!!!");
4433 _e_comp_object_shadow_setup(cw);
4436 int old_x, old_y, new_x = 0, new_y = 0;
4438 old_x = cw->x, old_y = cw->y;
4440 _e_comp_smart_cb_frame_recalc(cw, cw->smart_obj, NULL);
4442 new_x = cw->ec->x, new_y = cw->ec->y;
4443 else if (cw->ec->placed || (!cw->ec->new_client))
4445 /* if no previous frame:
4446 * - reapply client_inset
4451 if (cw->ec->changes.size)
4458 x = cw->ec->client.x, y = cw->ec->client.y;
4459 x = MAX(cw->ec->zone->x, cw->ec->client.x - cw->client_inset.l);
4460 y = MAX(cw->ec->zone->y, cw->ec->client.y - cw->client_inset.t);
4462 new_x = x, new_y = y;
4465 if (old_x != new_x || old_y != new_y)
4467 /* this guarantees that we won't get blocked by the NOP check in the interceptor */
4468 cw->y = cw->x = -99999;
4469 evas_object_move(obj, new_x, new_y);
4473 if (cw->ec->maximized)
4475 cw->ec->changes.need_maximize = 1;
4478 evas_object_smart_callback_call(cw->smart_obj, "frame_changed", NULL);
4479 if (cw->frame_object)
4481 cw->frame_extends = !!edje_object_data_get(cw->frame_object, "frame_extends");
4484 cw->frame_extends = 0;
4485 evas_object_del(pbg);
4490 e_comp_object_signal_emit(Evas_Object *obj, const char *sig, const char *src)
4492 E_Comp_Object_Mover *prov;
4495 //INF("EMIT %p: %s %s", cw->ec, sig, src);
4496 edje_object_signal_emit(cw->shobj, sig, src);
4497 if (cw->frame_object) edje_object_signal_emit(cw->frame_object, sig, src);
4498 if ((cw->ec->override && e_comp_config_get()->match.disable_overrides) ||
4499 ((!cw->ec->override) && e_comp_config_get()->match.disable_borders))
4501 /* start with highest priority callback first */
4502 EINA_INLIST_REVERSE_FOREACH(_e_comp_object_movers, prov)
4504 if (!e_util_glob_match(sig, prov->sig)) continue;
4505 if (prov->func(prov->data, obj, sig)) break;
4510 e_comp_object_signal_callback_add(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb, const void *data)
4512 /* FIXME: at some point I guess this should use eo to inherit
4513 * -EDJE_OBJ_SUB_ID_SIGNAL_CALLBACK_ADD
4514 * -EDJE_OBJ_SUB_ID_SIGNAL_CALLBACK_DEL
4517 edje_object_signal_callback_add(cw->shobj, sig, src, cb, (void*)data);
4521 e_comp_object_signal_callback_del(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb)
4524 edje_object_signal_callback_del(cw->shobj, sig, src, cb);
4528 e_comp_object_signal_callback_del_full(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb, const void *data)
4531 edje_object_signal_callback_del_full(cw->shobj, sig, src, cb, (void*)data);
4535 e_comp_object_damage(Evas_Object *obj, int x, int y, int w, int h)
4538 Eina_Rectangle rect;
4541 if (cw->ec->input_only || (!cw->updates)) return;
4542 if (cw->nocomp) return;
4543 rect.x = x, rect.y = y;
4544 rect.w = w, rect.h = h;
4545 evas_object_smart_callback_call(obj, "damage", &rect);
4547 if (e_comp_is_on_overlay(cw->ec))
4549 /* It will not set hwc_need_update value if E modules already cleanup pixmap
4550 * resource on the E_COMP_WL_HOOK_BUFFER_CHANGE hook function. It means that
4551 * E module attempts to block screen update due to the particular policy.
4553 if (e_pixmap_resource_get(cw->ec->pixmap))
4554 cw->hwc_need_update = EINA_TRUE;
4557 /* ignore overdraw */
4558 if (cw->updates_full)
4560 RENDER_DEBUG("IGNORED %p: %d,%d %dx%d", cw->ec, x, y, w, h);
4561 e_comp_object_render_update_add(obj);
4563 if ((cw->ec->visible) && (!evas_object_visible_get(cw->smart_obj)) && (!cw->ec->iconic))
4564 evas_object_show(cw->smart_obj);
4568 /* clip rect to client surface */
4569 RENDER_DEBUG("DAMAGE(%d,%d %dx%d) CLIP(%dx%d)", x, y, w, h, cw->ec->client.w, cw->ec->client.h);
4570 E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, cw->ec->client.w, cw->ec->client.h);
4571 /* if rect is the total size of the client after clip, clear the updates
4572 * since this is guaranteed to be the whole region anyway
4574 eina_tiler_area_size_get(cw->updates, &tw, &th);
4575 if ((w > tw) || (h > th))
4577 RENDER_DEBUG("DAMAGE RESIZE %p: %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
4578 eina_tiler_clear(cw->updates);
4579 eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
4581 tw = cw->ec->client.w, th = cw->ec->client.h;
4583 if ((!x) && (!y) && (w == tw) && (h == th))
4585 eina_tiler_clear(cw->updates);
4586 RENDER_DEBUG("DAMAGE FULL: %p", cw->ec);
4587 cw->updates_full = 1;
4588 cw->update_count = 0;
4591 if (cw->update_count > UPDATE_MAX)
4593 /* this is going to get really dumb, so just update the whole thing */
4594 eina_tiler_clear(cw->updates);
4595 cw->update_count = cw->updates_full = 1;
4596 eina_tiler_rect_add(cw->updates, &(Eina_Rectangle){0, 0, tw, th});
4597 RENDER_DEBUG("DAMAGE MAX: %dx%d", tw, th);
4601 eina_tiler_rect_add(cw->updates, &(Eina_Rectangle){x, y, w, h});
4602 RENDER_DEBUG("DAMAGE: %d,%d %dx%d", x, y, w, h);
4604 cw->updates_exist = 1;
4605 e_comp_object_render_update_add(obj);
4607 if ((cw->ec->visible) && (!evas_object_visible_get(cw->smart_obj)) && (!cw->ec->iconic))
4608 evas_object_show(cw->smart_obj);
4612 e_comp_object_damage_exists(Evas_Object *obj)
4614 API_ENTRY EINA_FALSE;
4615 return cw->updates_exist;
4619 e_comp_object_render_update_add(Evas_Object *obj)
4623 if (cw->ec->input_only || (!cw->updates) || (!cw->redirected)) return;
4624 if (cw->render_update_lock.lock) return;
4625 if (e_object_is_del(E_OBJECT(cw->ec)))
4626 CRI("CAN'T RENDER A DELETED CLIENT!!! ec:%p", cw->ec);
4627 if (!e_pixmap_usable_get(cw->ec->pixmap)) return;
4631 e_comp->updates = eina_list_append(e_comp->updates, cw->ec);
4633 e_comp_render_queue();
4637 e_comp_object_render_update_del(Evas_Object *obj)
4641 if (cw->ec->input_only || (!cw->updates)) return;
4642 if (!cw->update) return;
4644 /* this gets called during comp animating to clear the update flag */
4645 if (e_comp->grabbed) return;
4646 e_comp->updates = eina_list_remove(e_comp->updates, cw->ec);
4647 if (!e_comp->updates)
4649 E_FREE_FUNC(e_comp->update_job, ecore_job_del);
4650 if (e_comp->render_animator)
4651 ecore_animator_freeze(e_comp->render_animator);
4656 e_comp_object_shape_apply(Evas_Object *obj)
4660 unsigned int i, *pix, *p;
4664 if (!cw->ec) return; //NYI
4665 if (cw->external_content) return;
4668 if ((cw->ec->shape_rects_num >= 1) &&
4669 (!_e_comp_shaped_check(cw->ec->client.w, cw->ec->client.h, cw->ec->shape_rects, cw->ec->shape_rects_num)))
4674 ERR("BUGGER: shape with native surface? cw=%p", cw);
4677 evas_object_image_size_get(cw->obj, &w, &h);
4678 if ((w < 1) || (h < 1)) return;
4681 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4682 _e_comp_object_alpha_set(cw);
4683 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4684 evas_object_image_alpha_set(o, 1);
4686 p = pix = evas_object_image_data_get(cw->obj, 1);
4689 evas_object_image_data_set(cw->obj, pix);
4694 unsigned char *spix, *sp;
4696 spix = calloc(w * h, sizeof(unsigned char));
4698 for (i = 0; i < cw->ec->shape_rects_num; i++)
4702 rx = cw->ec->shape_rects[i].x; ry = cw->ec->shape_rects[i].y;
4703 rw = cw->ec->shape_rects[i].w; rh = cw->ec->shape_rects[i].h;
4704 E_RECTS_CLIP_TO_RECT(rx, ry, rw, rh, 0, 0, w, h);
4705 sp = spix + (w * ry) + rx;
4706 for (py = 0; py < rh; py++)
4708 for (px = 0; px < rw; px++)
4716 for (py = 0; py < h; py++)
4718 for (px = 0; px < w; px++)
4720 unsigned int mask, imask;
4722 mask = ((unsigned int)(*sp)) << 24;
4724 imask |= imask >> 8;
4725 imask |= imask >> 8;
4726 *p = mask | (*p & imask);
4727 //if (*sp) *p = 0xff000000 | *p;
4728 //else *p = 0x00000000;
4737 for (py = 0; py < h; py++)
4739 for (px = 0; px < w; px++)
4743 evas_object_image_data_set(cw->obj, pix);
4744 evas_object_image_data_update_add(cw->obj, 0, 0, w, h);
4745 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4747 evas_object_image_data_set(o, pix);
4748 evas_object_image_data_update_add(o, 0, 0, w, h);
4750 // don't need to fix alpha chanel as blending
4751 // should be totally off here regardless of
4752 // alpha channel content
4756 _e_comp_object_clear(E_Comp_Object *cw)
4761 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
4763 if (cw->render_update_lock.lock) return;
4766 e_pixmap_clear(cw->ec->pixmap);
4768 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4769 evas_object_image_size_set(cw->obj, 1, 1);
4770 evas_object_image_data_set(cw->obj, NULL);
4771 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4773 evas_object_image_size_set(o, 1, 1);
4774 evas_object_image_data_set(o, NULL);
4777 e_comp_object_render_update_del(cw->smart_obj);
4781 _e_comp_object_transparent_set(Evas_Object *obj, Eina_Bool set)
4785 API_ENTRY EINA_FALSE;
4787 if (cw->transparent.set == set)
4792 evas_object_color_get(obj, &r, &g, &b, &a);
4793 evas_object_color_set(obj, 0, 0, 0, 0);
4795 cw->transparent.user_r = r;
4796 cw->transparent.user_g = g;
4797 cw->transparent.user_b = b;
4798 cw->transparent.user_a = a;
4800 ELOGF("COMP", "Transparent enabled user_color(%d,%d,%d,%d)",
4802 cw->transparent.user_r,
4803 cw->transparent.user_g,
4804 cw->transparent.user_b,
4805 cw->transparent.user_a);
4807 cw->transparent.set = EINA_TRUE;
4811 cw->transparent.set = EINA_FALSE;
4813 evas_object_color_set(obj,
4814 cw->transparent.user_r,
4815 cw->transparent.user_g,
4816 cw->transparent.user_b,
4817 cw->transparent.user_a);
4819 ELOGF("COMP", "Transparent disabled user_color(%d,%d,%d,%d)",
4821 cw->transparent.user_r,
4822 cw->transparent.user_g,
4823 cw->transparent.user_b,
4824 cw->transparent.user_a);
4830 /* helper function to simplify toggling of redirection for display servers which support it */
4832 e_comp_object_redirected_set(Evas_Object *obj, Eina_Bool set)
4837 if (cw->redirected == set) return;
4838 cw->redirected = set;
4839 if (cw->external_content) return;
4841 e_comp_object_map_update(obj);
4845 if (cw->updates_exist)
4846 e_comp_object_render_update_add(obj);
4848 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4850 _e_comp_object_transparent_set(obj, EINA_FALSE);
4851 evas_object_smart_callback_call(obj, "redirected", NULL);
4855 _e_comp_object_clear(cw);
4856 _e_comp_object_transparent_set(obj, EINA_TRUE);
4857 evas_object_smart_callback_call(obj, "unredirected", NULL);
4862 _e_comp_object_cb_buffer_destroy(struct wl_listener *listener, void *data EINA_UNUSED)
4865 cw = container_of(listener, E_Comp_Object, buffer_destroy_listener);
4867 if (cw->buffer_destroy_listener.notify)
4869 cw->buffer_destroy_listener.notify = NULL;
4870 wl_list_remove(&cw->buffer_destroy_listener.link);
4873 if (e_object_is_del(E_OBJECT(cw->ec)))
4875 if (!e_object_delay_del_ref_get(E_OBJECT(cw->ec)))
4880 /* if it's current displaying buffer, do not remove its content */
4881 if (!evas_object_visible_get(cw->ec->frame))
4882 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4887 _e_comp_object_native_surface_set(E_Comp_Object *cw, Evas_Native_Surface *ns, Eina_Bool with_mirror)
4892 if (cw->buffer_destroy_listener.notify)
4894 wl_list_remove(&cw->buffer_destroy_listener.link);
4895 cw->buffer_destroy_listener.notify = NULL;
4898 if (cw->tbm_surface)
4900 tbm_surface_internal_unref(cw->tbm_surface);
4901 cw->tbm_surface = NULL;
4906 if ((ns->type == EVAS_NATIVE_SURFACE_WL) && (ns->data.wl.legacy_buffer))
4908 cw->buffer_destroy_listener.notify = _e_comp_object_cb_buffer_destroy;
4909 wl_resource_add_destroy_listener((struct wl_resource *)ns->data.wl.legacy_buffer, &cw->buffer_destroy_listener);
4911 else if ((ns->type == EVAS_NATIVE_SURFACE_TBM) && (ns->data.tbm.buffer))
4913 tbm_surface_internal_ref(ns->data.tbm.buffer);
4914 cw->tbm_surface = ns->data.tbm.buffer;
4918 TRACE_DS_BEGIN(NATIVE_SURFACE_SET);
4919 evas_object_image_native_surface_set(cw->obj, ns);
4923 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4925 evas_object_image_alpha_set(o, !!cw->ns ? 1 : cw->ec->argb);
4926 TRACE_DS_BEGIN(NATIVE_SURFACE_SET);
4927 evas_object_image_native_surface_set(o, ns);
4934 e_comp_object_native_surface_set(Evas_Object *obj, Eina_Bool set)
4936 Evas_Native_Surface ns;
4939 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
4940 if (cw->ec->input_only) return;
4941 if (cw->external_content) return;
4942 if (cw->render_update_lock.lock) return;
4945 memset(&ns, 0, sizeof(Evas_Native_Surface));
4949 /* native requires gl enabled, texture from pixmap enabled, and a non-shaped client */
4950 set = (!cw->ec->shaped);
4952 set = (!!cw->ns) || e_pixmap_native_surface_init(cw->ec->pixmap, &ns);
4956 _e_comp_object_native_surface_set(cw, set && (!cw->blanked) ? (cw->ns ? cw->ns : &ns) : NULL, EINA_TRUE);
4960 e_comp_object_native_surface_override(Evas_Object *obj, Evas_Native_Surface *ns)
4963 if (cw->ec->input_only) return;
4966 cw->ns = (Evas_Native_Surface*)eina_memdup((unsigned char*)ns, sizeof(Evas_Native_Surface), 0);
4967 _e_comp_object_alpha_set(cw);
4969 e_comp_object_native_surface_set(obj, cw->native);
4970 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4974 e_comp_object_blank(Evas_Object *obj, Eina_Bool set)
4980 if (cw->blanked == set) return;
4982 _e_comp_object_alpha_set(cw);
4985 _e_comp_object_native_surface_set(cw, NULL, EINA_FALSE);
4986 evas_object_image_data_set(cw->obj, NULL);
4990 e_comp_object_native_surface_set(obj, 1);
4991 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4995 _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)
5000 if (!_damage_trace) return;
5004 if (!evas_object_visible_get(cw->obj)) return;
5006 evas_object_geometry_get(cw->obj, &obj_x, &obj_y, NULL, NULL);
5008 o = evas_object_rectangle_add(e_comp->evas);
5009 evas_object_layer_set(o, E_LAYER_MAX);
5010 evas_object_name_set(o, "damage_trace");
5011 evas_object_move(o, dmg_x + obj_x, dmg_y + obj_y);
5012 evas_object_resize(o, dmg_w, dmg_h);
5013 evas_object_color_set(o, 0, 128, 0, 128);
5014 evas_object_render_op_set(o, EVAS_RENDER_BLEND);
5015 evas_object_pass_events_set(o, EINA_TRUE);
5016 evas_object_show(o);
5018 ELOGF("COMP", "add damage(%dx%d+%d+%d) origin(%dx%d+%d+%d)",
5020 dmg_w, dmg_h, dmg_x, dmg_y,
5021 origin->w, origin->h, origin->x, origin->y);
5023 _damage_trace_objs = eina_list_append(_damage_trace_objs, o);
5026 /* mark an object as dirty and setup damages */
5028 e_comp_object_dirty(Evas_Object *obj)
5031 Eina_Rectangle *rect;
5035 Eina_Bool dirty, visible;
5039 if (cw->external_content) return;
5040 if (!cw->redirected) return;
5041 if (cw->render_update_lock.lock)
5043 ELOGF("COMP", "Render update locked:%d", cw->ec, cw->render_update_lock.lock);
5046 /* only actually dirty if pixmap is available */
5047 if (!e_pixmap_resource_get(cw->ec->pixmap))
5049 // e_pixmap_size_get returns last attached buffer size
5050 // eventhough it is destroyed
5051 ERR("ERROR NO PIXMAP FOR ec:%p", cw->ec);
5054 dirty = e_pixmap_size_get(cw->ec->pixmap, &w, &h);
5055 visible = cw->visible;
5056 if (!dirty) w = h = 1;
5057 evas_object_image_pixels_dirty_set(cw->obj, cw->blanked ? 0 : dirty);
5059 evas_object_image_data_set(cw->obj, NULL);
5060 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
5061 evas_object_image_size_set(cw->obj, tw, th);
5062 if (cw->mask.obj) evas_object_resize(cw->mask.obj, w, h);
5063 if (cw->pending_updates)
5064 eina_tiler_area_size_set(cw->pending_updates, w, h);
5065 EINA_LIST_FOREACH(cw->obj_mirror, ll, o)
5067 evas_object_image_pixels_dirty_set(o, dirty);
5069 evas_object_image_data_set(o, NULL);
5070 evas_object_image_size_set(o, tw, th);
5071 visible |= evas_object_visible_get(o);
5075 ERR("ERROR FETCHING PIXMAP FOR %p", cw->ec);
5079 e_comp_object_native_surface_set(obj, 1);
5081 m = _e_comp_object_map_damage_transform_get(cw->ec);
5082 it = eina_tiler_iterator_new(cw->updates);
5083 EINA_ITERATOR_FOREACH(it, rect)
5085 /* evas converts damage according to rotation of ecore_evas in damage_region_set
5086 * of evas engine and doesn't convert damage according to evas_map.
5087 * so damage of evas_object_image use surface coordinate.
5091 int damage_x, damage_y, damage_w, damage_h;
5093 _e_comp_object_map_damage_transform_rect(cw->ec, m, rect->x, rect->y, rect->w, rect->h,
5094 &damage_x, &damage_y, &damage_w, &damage_h);
5095 evas_object_image_data_update_add(cw->obj, damage_x, damage_y, damage_w, damage_h);
5096 _e_comp_object_damage_trace_rect_set(obj, rect, damage_x, damage_y, damage_w, damage_h);
5100 evas_object_image_data_update_add(cw->obj, rect->x, rect->y, rect->w, rect->h);
5101 _e_comp_object_damage_trace_rect_set(obj, rect, rect->x, rect->y, rect->w, rect->h);
5104 EINA_LIST_FOREACH(cw->obj_mirror, ll, o)
5105 evas_object_image_data_update_add(o, rect->x, rect->y, rect->w, rect->h);
5106 if (cw->pending_updates)
5107 eina_tiler_rect_add(cw->pending_updates, rect);
5109 eina_iterator_free(it);
5110 if (m) e_map_free(m);
5111 if (cw->pending_updates)
5112 eina_tiler_clear(cw->updates);
5115 cw->pending_updates = cw->updates;
5116 cw->updates = eina_tiler_new(w, h);
5117 eina_tiler_tile_size_set(cw->updates, 1, 1);
5119 cw->update_count = cw->updates_full = cw->updates_exist = 0;
5120 evas_object_smart_callback_call(obj, "dirty", NULL);
5121 if (cw->visible || (!visible) || (!cw->pending_updates) || cw->native) return;
5122 /* force render if main object is hidden but mirrors are visible */
5123 RENDER_DEBUG("FORCING RENDER %p", cw->ec);
5124 e_comp_object_render(obj);
5128 e_comp_object_render(Evas_Object *obj)
5135 API_ENTRY EINA_FALSE;
5137 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5138 if (cw->ec->input_only) return EINA_TRUE;
5139 if (cw->external_content) return EINA_TRUE;
5140 if (cw->native) return EINA_FALSE;
5141 /* if comp object is not redirected state, comp object should not be set by newly committed data
5142 because image size of comp object is 1x1 and it should not be shown on canvas */
5143 if (!cw->redirected) return EINA_TRUE;
5144 if (cw->render_update_lock.lock)
5146 ELOGF("COMP", "Render update locked:%d", cw->ec, cw->render_update_lock.lock);
5149 e_comp_object_render_update_del(obj);
5150 if (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph)) return EINA_FALSE;
5152 if (!cw->pending_updates)
5154 WRN("RENDER [%p]: NO RECTS!", cw->ec);
5155 evas_object_image_data_set(cw->obj, NULL);
5156 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
5157 evas_object_image_data_set(o, NULL);
5161 evas_object_image_pixels_dirty_set(cw->obj, EINA_FALSE);
5163 RENDER_DEBUG("RENDER SIZE: %dx%d", pw, ph);
5165 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5168 e_pixmap_image_refresh(cw->ec->pixmap);
5169 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5172 if ((pix) && ((!cw->blanked) || (cw->obj_mirror)))
5173 e_pixmap_image_data_ref(cw->ec->pixmap);
5175 /* set pixel data */
5176 evas_object_image_data_set(cw->obj, cw->blanked ? NULL : pix);
5177 _e_comp_object_alpha_set(cw);
5178 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
5180 evas_object_image_data_set(o, pix);
5181 evas_object_image_alpha_set(o, evas_object_image_alpha_get(cw->obj));
5182 evas_object_image_pixels_dirty_set(o, EINA_FALSE);
5185 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
5187 e_comp_client_post_update_add(cw->ec);
5192 /* create a duplicate of an evas object */
5193 EINTERN Evas_Object *
5194 e_comp_object_util_mirror_add(Evas_Object *obj)
5198 unsigned int *pix = NULL;
5199 Eina_Bool argb = EINA_FALSE;
5204 cw = evas_object_data_get(obj, "comp_mirror");
5207 o = evas_object_image_filled_add(evas_object_evas_get(obj));
5208 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
5209 evas_object_image_smooth_scale_set(o, e_comp_config_get()->smooth_windows);
5210 evas_object_image_alpha_set(o, 1);
5211 evas_object_image_source_set(o, obj);
5214 if ((!cw->ec) || (!e_pixmap_size_get(cw->ec->pixmap, &w, &h))) return NULL;
5215 if (cw->external_content)
5217 ERR("%p of client %p is external content.", obj, cw->ec);
5220 o = evas_object_image_filled_add(evas_object_evas_get(obj));
5221 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
5222 evas_object_image_smooth_scale_set(o, e_comp_config_get()->smooth_windows);
5223 cw->obj_mirror = eina_list_append(cw->obj_mirror, o);
5224 evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, _e_comp_object_cb_mirror_del, cw);
5225 evas_object_event_callback_add(o, EVAS_CALLBACK_SHOW, _e_comp_object_cb_mirror_show, cw);
5226 evas_object_event_callback_add(o, EVAS_CALLBACK_HIDE, _e_comp_object_cb_mirror_hide, cw);
5227 evas_object_data_set(o, "E_Client_Mirror", cw->ec);
5228 evas_object_data_set(o, "comp_mirror", cw);
5230 evas_object_image_alpha_set(o, evas_object_image_alpha_get(cw->obj));
5231 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
5233 evas_object_image_size_set(o, tw, th);
5236 pix = evas_object_image_data_get(cw->obj, 0);
5242 evas_object_image_native_surface_set(o, cw->ns);
5245 Evas_Native_Surface ns;
5246 memset(&ns, 0, sizeof(Evas_Native_Surface));
5247 if (e_pixmap_native_surface_init(cw->ec->pixmap, &ns))
5248 evas_object_image_native_surface_set(o, &ns);
5253 /* FIXME: legacy code, please refer to commit 5e6831187a1 */
5254 argb = e_pixmap_image_is_argb(cw->ec->pixmap);
5256 (e_pixmap_image_exists(cw->ec->pixmap)))
5257 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5259 pix = evas_object_image_data_get(cw->obj, EINA_FALSE);
5266 dirty = evas_object_image_pixels_dirty_get(cw->obj);
5267 evas_object_image_pixels_dirty_set(o, dirty);
5268 evas_object_image_data_set(o, pix);
5269 evas_object_image_data_set(cw->obj, pix);
5271 evas_object_image_data_update_add(o, 0, 0, tw, th);
5276 //////////////////////////////////////////////////////
5279 e_comp_object_effect_allowed_get(Evas_Object *obj)
5281 API_ENTRY EINA_FALSE;
5283 if (!cw->shobj) return EINA_FALSE;
5284 if (cw->ec->override) return !e_comp_config_get()->match.disable_overrides;
5285 return !e_comp_config_get()->match.disable_borders;
5288 /* setup an api effect for a client */
5290 e_comp_object_effect_set(Evas_Object *obj, const char *effect)
5293 Eina_Stringshare *grp;
5294 E_Comp_Config *config;
5295 Eina_Bool loaded = EINA_FALSE;
5297 API_ENTRY EINA_FALSE;
5298 if (!cw->shobj) return EINA_FALSE; //input window
5300 if (!effect) effect = "none";
5301 snprintf(buf, sizeof(buf), "e/comp/effects/%s", effect);
5303 config = e_comp_config_get();
5304 if ((config) && (config->effect_file))
5306 if (edje_object_file_set(cw->effect_obj, config->effect_file, buf))
5308 cw->effect_set = EINA_TRUE;
5315 edje_object_file_get(cw->effect_obj, NULL, &grp);
5316 cw->effect_set = !eina_streq(effect, "none");
5317 if (!e_util_strcmp(buf, grp)) return cw->effect_set;
5318 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", buf))
5320 snprintf(buf, sizeof(buf), "e/comp/effects/auto/%s", effect);
5321 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", buf))
5322 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", "e/comp/effects/none"))
5324 if (cw->effect_running)
5326 if (!e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb")))
5329 cw->effect_set = EINA_FALSE;
5330 return cw->effect_set;
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 ELOGF("COMP", "EFFECT Set GROUP[%s]", cw->ec, buf);
5340 edje_object_part_swallow(cw->effect_obj, "e.swallow.content", cw->shobj);
5341 if (cw->effect_clip)
5343 evas_object_clip_unset(cw->clip);
5344 cw->effect_clip = 0;
5346 cw->effect_clip_able = !edje_object_data_get(cw->effect_obj, "noclip");
5348 _e_comp_object_dim_update(cw);
5350 return cw->effect_set;
5353 /* set params for embryo scripts in effect */
5355 e_comp_object_effect_params_set(Evas_Object *obj, int id, int *params, unsigned int count)
5357 Edje_Message_Int_Set *msg;
5361 EINA_SAFETY_ON_NULL_RETURN(params);
5362 EINA_SAFETY_ON_FALSE_RETURN(count);
5363 if (!cw->effect_set) return;
5365 msg = alloca(sizeof(Edje_Message_Int_Set) + ((count - 1) * sizeof(int)));
5366 msg->count = (int)count;
5367 for (x = 0; x < count; x++)
5368 msg->val[x] = params[x];
5369 edje_object_message_send(cw->effect_obj, EDJE_MESSAGE_INT_SET, id, msg);
5370 edje_object_message_signal_process(cw->effect_obj);
5374 _e_comp_object_effect_end_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
5376 Edje_Signal_Cb end_cb;
5378 E_Comp_Object *cw = data;
5380 edje_object_signal_callback_del_full(obj, "e,action,done", "e", _e_comp_object_effect_end_cb, NULL);
5381 cw->effect_running = 0;
5382 if (!_e_comp_object_animating_end(cw)) return;
5384 if (evas_object_data_get(cw->smart_obj, "effect_running"))
5386 evas_object_data_del(cw->smart_obj, "effect_running");
5387 _e_comp_object_event_simple(obj, E_EVENT_COMP_OBJECT_EFFECT_END);
5388 e_client_visibility_calculate();
5391 end_cb = evas_object_data_get(obj, "_e_comp.end_cb");
5392 if (!end_cb) return;
5393 end_data = evas_object_data_get(obj, "_e_comp.end_data");
5394 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_END, cw->ec);
5395 end_cb(end_data, cw->smart_obj, emission, source);
5398 /* clip effect to client's zone */
5400 e_comp_object_effect_clip(Evas_Object *obj)
5403 if (!cw->ec->zone) return;
5404 if (cw->effect_clip) e_comp_object_effect_unclip(cw->smart_obj);
5405 if (!cw->effect_clip_able) return;
5406 evas_object_clip_set(cw->smart_obj, cw->ec->zone->bg_clip_object);
5407 cw->effect_clip = 1;
5410 /* unclip effect from client's zone */
5412 e_comp_object_effect_unclip(Evas_Object *obj)
5415 if (!cw->effect_clip) return;
5416 evas_object_clip_unset(cw->smart_obj);
5417 cw->effect_clip = 0;
5420 /* start effect, running end_cb after */
5422 e_comp_object_effect_start(Evas_Object *obj, Edje_Signal_Cb end_cb, const void *end_data)
5424 API_ENTRY EINA_FALSE;
5425 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE); //NYI
5426 if (!cw->effect_set) return EINA_FALSE;
5428 if (cw->effect_running)
5430 e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb"));
5433 e_comp_object_effect_clip(obj);
5434 edje_object_signal_callback_del(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb);
5436 edje_object_signal_callback_add(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb, cw);
5437 evas_object_data_set(cw->effect_obj, "_e_comp.end_cb", end_cb);
5438 evas_object_data_set(cw->effect_obj, "_e_comp.end_data", end_data);
5439 evas_object_data_set(cw->smart_obj, "effect_running", (void*)1);
5441 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_START, cw->ec);
5442 _e_comp_object_event_simple(obj, E_EVENT_COMP_OBJECT_EFFECT_START);
5444 edje_object_signal_emit(cw->effect_obj, "e,action,go", "e");
5445 _e_comp_object_animating_begin(cw);
5446 cw->effect_running = 1;
5450 /* stop a currently-running effect immediately */
5452 e_comp_object_effect_stop(Evas_Object *obj, Edje_Signal_Cb end_cb)
5455 Edje_Signal_Cb end_cb_before = NULL;
5456 void *end_data_before = NULL;
5457 API_ENTRY EINA_FALSE;
5459 end_cb_before = evas_object_data_get(cw->effect_obj, "_e_comp.end_cb");
5460 end_data_before = evas_object_data_get(cw->effect_obj, "_e_comp.end_data");
5462 if (end_cb_before != end_cb) return EINA_TRUE;
5463 e_comp_object_effect_unclip(obj);
5464 if (cw->effect_clip)
5466 evas_object_clip_unset(cw->effect_obj);
5467 cw->effect_clip = 0;
5469 edje_object_signal_emit(cw->effect_obj, "e,action,stop", "e");
5470 edje_object_signal_callback_del_full(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb, cw);
5472 if (evas_object_data_get(cw->smart_obj, "effect_running"))
5474 evas_object_data_del(cw->smart_obj, "effect_running");
5475 e_client_visibility_calculate();
5478 cw->effect_running = 0;
5479 ret = _e_comp_object_animating_end(cw);
5481 if ((ret) && (end_cb_before))
5483 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_END, cw->ec);
5484 end_cb_before(end_data_before, cw->smart_obj, "e,action,done", "e");
5491 _e_comp_object_effect_mover_sort_cb(E_Comp_Object_Mover *a, E_Comp_Object_Mover *b)
5493 return a->pri - b->pri;
5496 /* add a function to trigger based on signal emissions for the purpose of modifying effects */
5497 E_API E_Comp_Object_Mover *
5498 e_comp_object_effect_mover_add(int pri, const char *sig, E_Comp_Object_Mover_Cb provider, const void *data)
5500 E_Comp_Object_Mover *prov;
5502 prov = E_NEW(E_Comp_Object_Mover, 1);
5503 EINA_SAFETY_ON_NULL_RETURN_VAL(prov, NULL);
5504 prov->func = provider;
5505 prov->data = (void*)data;
5508 _e_comp_object_movers = eina_inlist_sorted_insert(_e_comp_object_movers, EINA_INLIST_GET(prov),
5509 (Eina_Compare_Cb)_e_comp_object_effect_mover_sort_cb);
5514 e_comp_object_effect_mover_del(E_Comp_Object_Mover *prov)
5516 EINA_SAFETY_ON_NULL_RETURN(prov);
5517 _e_comp_object_movers = eina_inlist_remove(_e_comp_object_movers, EINA_INLIST_GET(prov));
5522 e_comp_object_effect_object_get(Evas_Object *obj)
5526 return cw->effect_obj;
5530 e_comp_object_effect_hiding_set(Evas_Object *obj, Eina_Bool set)
5532 API_ENTRY EINA_FALSE;
5533 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5534 if (!cw->effect_set) return EINA_FALSE;
5541 ////////////////////////////////////
5544 _e_comp_object_autoclose_cleanup(Eina_Bool already_del)
5546 if (e_comp->autoclose.obj)
5548 e_comp_ungrab_input(0, 1);
5549 if (e_comp->autoclose.del_cb)
5550 e_comp->autoclose.del_cb(e_comp->autoclose.data, e_comp->autoclose.obj);
5551 else if (!already_del)
5553 evas_object_hide(e_comp->autoclose.obj);
5554 E_FREE_FUNC(e_comp->autoclose.obj, evas_object_del);
5556 E_FREE_FUNC(e_comp->autoclose.rect, evas_object_del);
5558 e_comp->autoclose.obj = NULL;
5559 e_comp->autoclose.data = NULL;
5560 e_comp->autoclose.del_cb = NULL;
5561 e_comp->autoclose.key_cb = NULL;
5562 E_FREE_FUNC(e_comp->autoclose.key_handler, ecore_event_handler_del);
5566 _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)
5568 _e_comp_object_autoclose_cleanup(0);
5572 _e_comp_object_autoclose_setup(Evas_Object *obj)
5574 if (!e_comp->autoclose.rect)
5576 /* create rect just below autoclose object to catch mouse events */
5577 e_comp->autoclose.rect = evas_object_rectangle_add(e_comp->evas);
5578 evas_object_move(e_comp->autoclose.rect, 0, 0);
5579 evas_object_resize(e_comp->autoclose.rect, e_comp->w, e_comp->h);
5580 evas_object_show(e_comp->autoclose.rect);
5581 evas_object_name_set(e_comp->autoclose.rect, "e_comp->autoclose.rect");
5582 evas_object_color_set(e_comp->autoclose.rect, 0, 0, 0, 0);
5583 evas_object_event_callback_add(e_comp->autoclose.rect, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_autoclose_mouse_up_cb, e_comp);
5584 e_comp_grab_input(0, 1);
5586 evas_object_layer_set(e_comp->autoclose.rect, evas_object_layer_get(obj) - 1);
5587 evas_object_focus_set(obj, 1);
5591 _e_comp_object_autoclose_show(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
5593 _e_comp_object_autoclose_setup(obj);
5594 evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show);
5598 _e_comp_object_autoclose_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
5600 evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show);
5601 _e_comp_object_autoclose_cleanup(1);
5602 if (e_client_focused_get()) return;
5603 if (e_config->focus_policy != E_FOCUS_MOUSE)
5608 e_comp_object_util_autoclose(Evas_Object *obj, E_Comp_Object_Autoclose_Cb del_cb, E_Comp_Object_Key_Cb cb, const void *data)
5612 if (e_comp->autoclose.obj)
5614 if (e_comp->autoclose.obj == obj) return;
5615 evas_object_event_callback_del_full(e_comp->autoclose.obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5616 e_comp->autoclose.obj = obj;
5617 e_comp->autoclose.del_cb = del_cb;
5618 e_comp->autoclose.key_cb = cb;
5619 e_comp->autoclose.data = (void*)data;
5620 if (evas_object_visible_get(obj))
5621 _e_comp_object_autoclose_setup(obj);
5623 evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show, e_comp);
5624 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5627 e_comp->autoclose.obj = obj;
5628 e_comp->autoclose.del_cb = del_cb;
5629 e_comp->autoclose.key_cb = cb;
5630 e_comp->autoclose.data = (void*)data;
5631 if (evas_object_visible_get(obj))
5632 _e_comp_object_autoclose_setup(obj);
5634 evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show, e_comp);
5635 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5639 e_comp_object_is_animating(Evas_Object *obj)
5643 return cw->animating;
5647 e_comp_object_alpha_set(Evas_Object *obj, Eina_Bool alpha)
5651 if ((cw->external_content) &&
5652 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
5654 WRN("Can set up alpha value to ONLY evas \"image\" object. "
5655 "But current external content is %d object for %p.",
5656 cw->content_type, cw->ec);
5660 cw->user_alpha_set = EINA_TRUE;
5661 cw->user_alpha = alpha;
5663 if (!cw->obj) return;
5665 if (alpha == evas_object_image_alpha_get(cw->obj)) return;
5667 evas_object_image_alpha_set(cw->obj, alpha);
5669 if ((!cw->native) && (!cw->external_content))
5670 evas_object_image_data_set(cw->obj, NULL);
5674 e_comp_object_alpha_get(Evas_Object *obj)
5676 API_ENTRY EINA_FALSE;
5678 return evas_object_image_alpha_get(cw->obj);
5682 e_comp_object_mask_set(Evas_Object *obj, Eina_Bool set)
5684 Eina_Bool mask_set = EINA_FALSE;
5688 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5689 if (cw->ec->input_only) return;
5696 o = evas_object_rectangle_add(e_comp->evas);
5697 evas_object_color_set(o, 0, 0, 0, 0);
5698 evas_object_clip_set(o, cw->clip);
5699 evas_object_smart_member_add(o, obj);
5700 evas_object_move(o, 0, 0);
5701 evas_object_resize(o, cw->w, cw->h);
5702 /* save render op value to restore when clear a mask.
5704 * NOTE: DO NOT change the render op on ec->frame while mask object
5705 * is set. it will overwrite the changed op value. */
5706 cw->mask.saved_render_op = evas_object_render_op_get(obj);
5707 evas_object_render_op_set(obj, EVAS_RENDER_COPY);
5708 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5709 if (cw->visible) evas_object_show(o);
5712 evas_object_name_set(cw->mask.obj, "cw->mask_obj");
5713 ELOGF("COMP", " |mask_obj", cw->ec);
5714 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_MASK_OBJECT_SET, cw->ec);
5721 evas_object_smart_member_del(cw->mask.obj);
5722 E_FREE_FUNC(cw->mask.obj, evas_object_del);
5724 evas_object_render_op_set(obj, cw->mask.saved_render_op);
5725 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET, cw->ec);
5731 e_comp_object_mask_has(Evas_Object *obj)
5733 API_ENTRY EINA_FALSE;
5735 return (cw->mask.obj) ? EINA_TRUE : EINA_FALSE;
5739 e_comp_object_size_update(Evas_Object *obj, int w, int h)
5744 if ((cw->external_content) &&
5745 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
5747 WRN("Can set up size to ONLY evas \"image\" object. "
5748 "But current external content is %d object for %p.",
5749 cw->content_type, cw->ec);
5753 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
5755 evas_object_image_size_set(cw->obj, tw, th);
5759 e_comp_object_transform_bg_set(Evas_Object *obj, Eina_Bool set)
5761 Eina_Bool transform_set = EINA_FALSE;
5763 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5764 if (cw->ec->input_only) return;
5766 transform_set = !!set;
5770 if (!cw->transform_bg_obj)
5772 Evas_Object *o = evas_object_rectangle_add(e_comp->evas);
5773 evas_object_move(o, 0, 0);
5774 evas_object_resize(o, 1, 1);
5775 if (cw->transform_bg_color.a >= 255)
5776 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5778 evas_object_render_op_set(o, EVAS_RENDER_BLEND);
5779 evas_object_color_set(o,
5780 cw->transform_bg_color.r,
5781 cw->transform_bg_color.g,
5782 cw->transform_bg_color.b,
5783 cw->transform_bg_color.a);
5784 if (cw->visible) evas_object_show(o);
5786 cw->transform_bg_obj = o;
5787 evas_object_name_set(cw->transform_bg_obj, "cw->transform_bg_obj");
5789 _e_comp_object_transform_obj_stack_update(obj);
5793 if (cw->transform_bg_obj)
5795 evas_object_smart_member_del(cw->transform_bg_obj);
5796 E_FREE_FUNC(cw->transform_bg_obj, evas_object_del);
5802 e_comp_object_transform_bg_color_set(Evas_Object *obj, int r, int g, int b, int a)
5806 cw->transform_bg_color.r = r;
5807 cw->transform_bg_color.g = g;
5808 cw->transform_bg_color.b = b;
5809 cw->transform_bg_color.a = a;
5811 if (cw->transform_bg_obj)
5813 evas_object_color_set(cw->transform_bg_obj,
5814 cw->transform_bg_color.r,
5815 cw->transform_bg_color.g,
5816 cw->transform_bg_color.b,
5817 cw->transform_bg_color.a);
5822 e_comp_object_transform_bg_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
5825 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5826 if (cw->ec->input_only) return;
5827 if (!cw->transform_bg_obj) return;
5829 _e_comp_object_transform_obj_map_set(cw->transform_bg_obj, vertices);
5833 e_comp_object_transform_bg_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
5836 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5837 if (cw->ec->input_only) return;
5838 if (!cw->transform_bg_obj) return;
5840 _e_comp_object_transform_obj_map_set_with_zoom(cw->transform_bg_obj, vertices, zoom);
5844 e_comp_object_transform_transp_set(Evas_Object *obj, Eina_Bool set)
5846 Eina_Bool transform_set = EINA_FALSE;
5848 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5849 if (cw->ec->input_only) return;
5851 transform_set = !!set;
5855 if (!cw->transform_tranp_obj)
5857 Evas_Object *o = evas_object_rectangle_add(e_comp->evas);
5858 evas_object_move(o, 0, 0);
5859 evas_object_resize(o, 1, 1);
5860 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5861 evas_object_color_set(o, 0, 0, 0, 0);
5862 if (cw->visible) evas_object_show(o);
5864 cw->transform_tranp_obj = o;
5865 evas_object_name_set(cw->transform_tranp_obj, "cw->transform_trasp_obj");
5867 _e_comp_object_transform_obj_stack_update(obj);
5871 if (cw->transform_tranp_obj)
5873 evas_object_smart_member_del(cw->transform_tranp_obj);
5874 E_FREE_FUNC(cw->transform_tranp_obj, evas_object_del);
5880 e_comp_object_transform_transp_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
5883 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5884 if (cw->ec->input_only) return;
5885 if (!cw->transform_tranp_obj) return;
5887 _e_comp_object_transform_obj_map_set(cw->transform_tranp_obj, vertices);
5891 e_comp_object_transform_transp_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
5894 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5895 if (cw->ec->input_only) return;
5896 if (!cw->transform_tranp_obj) return;
5898 _e_comp_object_transform_obj_map_set_with_zoom(cw->transform_tranp_obj, vertices, zoom);
5902 e_comp_object_layer_update(Evas_Object *obj,
5903 Evas_Object *above, Evas_Object *below)
5905 E_Comp_Object *cw2 = NULL;
5906 Evas_Object *o = NULL;
5911 if (cw->ec->layer_block) return;
5912 if ((above) && (below))
5914 ERR("Invalid layer update request! cw=%p", cw);
5922 layer = evas_object_layer_get(o);
5923 cw2 = evas_object_data_get(o, "comp_obj");
5926 if (!e_util_strcmp(evas_object_name_get(o), "layer_obj")) break;
5928 o = evas_object_above_get(o);
5929 if ((!o) || (o == cw->smart_obj)) break;
5930 if (evas_object_layer_get(o) != layer)
5932 o = e_comp->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_ALERT)].obj;
5937 ec = e_client_top_get();
5938 if (ec) o = ec->frame;
5941 if (o) cw2 = evas_object_data_get(o, "comp_obj");
5945 _e_comp_object_layers_remove(cw);
5948 if (cw2->layer > cw->layer)
5949 _e_comp_object_layers_add(cw, NULL, NULL, 0);
5950 else if (cw2->layer == cw->layer)
5953 _e_comp_object_layers_add(cw, cw2, NULL, 0);
5955 _e_comp_object_layers_add(cw, NULL, NULL, above? 0 : 1);
5957 _e_comp_object_layers_add(cw, NULL, cw2, 0);
5960 _e_comp_object_layers_add(cw, NULL, NULL, 1);
5963 _e_comp_object_layers_add(cw, NULL, NULL, 0);
5967 e_comp_object_layer_get(Evas_Object *obj)
5974 e_comp_object_content_set(Evas_Object *obj,
5975 Evas_Object *content,
5976 E_Comp_Object_Content_Type type)
5978 API_ENTRY EINA_FALSE;
5980 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5981 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec->pixmap, EINA_FALSE);
5982 EINA_SAFETY_ON_NULL_RETURN_VAL(content, EINA_FALSE);
5986 ERR("Can't set e.swallow.content to requested content. "
5987 "Previous comp object should not be changed at all.");
5991 if (e_pixmap_usable_get(cw->ec->pixmap)) return EINA_FALSE;
5993 if ((type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE) &&
5994 (type != E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE))
5996 ERR("Content type %d for %p is not supported ec:%p pixmap:%p",
5997 type, content, cw->ec, cw->ec->pixmap);
6001 cw->external_content = EINA_TRUE;
6004 cw->content_type = type;
6005 e_util_size_debug_set(cw->obj, 1);
6006 evas_object_name_set(cw->obj, "cw->obj");
6007 _e_comp_object_alpha_set(cw);
6010 _e_comp_object_shadow_setup(cw);
6016 e_comp_object_content_unset(Evas_Object *obj)
6018 API_ENTRY EINA_FALSE;
6020 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6021 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec->pixmap, EINA_FALSE);
6023 if (!cw->obj && !cw->ec->visible)
6025 ELOGF("COMP", "is not visible yet. no need to unset", cw->ec);
6029 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE)
6031 ELOGF("COMP", "has been set to internal image object already", cw->ec);
6037 if (cw->frame_object)
6038 edje_object_part_unswallow(cw->frame_object, cw->obj);
6040 edje_object_part_unswallow(cw->shobj, cw->obj);
6042 evas_object_del(cw->obj);
6043 evas_object_hide(cw->obj);
6047 cw->external_content = EINA_FALSE;
6048 if (cw->ec->is_cursor)
6051 DBG("%p is cursor surface..", cw->ec);
6052 if (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph))
6054 evas_object_resize(cw->ec->frame, pw, ph);
6055 evas_object_hide(cw->ec->frame);
6060 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE;
6061 cw->obj = evas_object_image_filled_add(e_comp->evas);
6062 evas_object_image_border_center_fill_set(cw->obj, EVAS_BORDER_FILL_SOLID);
6063 e_util_size_debug_set(cw->obj, 1);
6064 evas_object_image_pixels_get_callback_set(cw->obj, _e_comp_object_pixels_get, cw);
6065 evas_object_image_pixels_noti_callback_set(cw->obj, _e_comp_object_pixels_noti, cw);
6066 evas_object_image_smooth_scale_set(cw->obj, e_comp_config_get()->smooth_windows);
6067 evas_object_name_set(cw->obj, "cw->obj");
6068 evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888);
6069 _e_comp_object_alpha_set(cw);
6072 _e_comp_object_shadow_setup(cw);
6077 _e_comp_intercept_show_helper(cw);
6081 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
6082 e_comp_object_dirty(cw->smart_obj);
6083 e_comp_object_render(cw->smart_obj);
6084 e_comp_object_render_update_add(obj);
6089 EINTERN Evas_Object *
6090 e_comp_object_content_get(Evas_Object *obj)
6094 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, NULL);
6096 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE)
6098 ELOGF("COMP", "has been set to internal image object. couldn't return internal image object", cw->ec);
6105 E_API E_Comp_Object_Content_Type
6106 e_comp_object_content_type_get(Evas_Object *obj)
6108 API_ENTRY E_COMP_OBJECT_CONTENT_TYPE_NONE;
6110 return cw->content_type;
6114 e_comp_object_dim_mask_update(Evas_Object *obj, Eina_Bool mask_set, int x, int y, int w, int h)
6117 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
6118 E_Comp_Config *conf = e_comp_config_get();
6119 if (cw->ec->input_only) return;
6120 if (!conf->dim_rect_enable) return;
6122 cw->dim.mask_set = mask_set;
6128 if (!cw->dim.enable) return;
6129 e_comp_object_dim_mask_set(cw->ec->frame, mask_set);
6133 e_comp_object_dim_mask_set(Evas_Object *obj, Eina_Bool set)
6135 Eina_Bool mask_set = EINA_FALSE;
6139 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
6140 E_Comp_Config *conf = e_comp_config_get();
6141 if (cw->ec->input_only) return;
6142 if (!conf->dim_rect_enable) return;
6148 if (cw->dim.mask_obj)
6150 evas_object_smart_member_del(cw->dim.mask_obj);
6151 E_FREE_FUNC(cw->dim.mask_obj, evas_object_del);
6154 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);
6155 o = evas_object_rectangle_add(e_comp->evas);
6156 evas_object_color_set(o, 0, 0, 0, 0);
6157 evas_object_smart_member_add(o, obj);
6158 evas_object_resize(o, cw->dim.mask_w, cw->dim.mask_h);
6159 evas_object_move(o, cw->dim.mask_x, cw->dim.mask_y);
6161 evas_object_render_op_set(o, EVAS_RENDER_COPY);
6162 if (cw->visible) evas_object_show(o);
6164 cw->dim.mask_obj = o;
6165 evas_object_name_set(cw->dim.mask_obj, "cw->dim_mask_obj");
6167 evas_object_layer_set(cw->dim.mask_obj, 9998);
6171 if (cw->dim.mask_obj)
6173 ELOGF("COMP", "DIM |Mask on Dim rect Removed", cw->ec);
6174 evas_object_smart_member_del(cw->dim.mask_obj);
6175 E_FREE_FUNC(cw->dim.mask_obj, evas_object_del);
6181 e_comp_object_dim_client_set(E_Client *ec)
6183 E_Comp_Config *conf = e_comp_config_get();
6185 if (!conf->dim_rect_enable) return ;
6186 if (dim_client == ec) return;
6188 Eina_Bool prev_dim = EINA_FALSE;
6189 ELOGF("COMP", "DIM |Client Set %p -> %p", ec, dim_client, ec);
6191 if (dim_client && _e_comp_object_dim_enable_get(dim_client, dim_client->frame))
6192 prev_dim = EINA_TRUE;
6194 if (prev_dim && dim_client->visible && ec)
6196 _e_comp_object_dim_enable_set(dim_client, dim_client->frame, EINA_FALSE, EINA_TRUE);
6197 _e_comp_object_dim_enable_set(ec, ec->frame, EINA_TRUE, EINA_TRUE);
6201 if (prev_dim) _e_comp_object_dim_enable_set(dim_client, dim_client->frame, EINA_FALSE, EINA_FALSE);
6202 if (ec) _e_comp_object_dim_enable_set(ec, ec->frame, EINA_TRUE, EINA_FALSE);
6208 e_comp_object_dim_client_get(void)
6210 E_Comp_Config *conf = e_comp_config_get();
6212 if (!conf->dim_rect_enable ) return NULL;
6218 _e_comp_object_dim_enable_set(E_Client *ec, Evas_Object *obj, Eina_Bool enable, Eina_Bool noeffect)
6221 char emit[32] = "\0";
6222 E_Comp_Config *conf = e_comp_config_get();
6225 if (!conf->dim_rect_enable) return;
6226 if (!cw->effect_obj) return;
6227 if (enable == cw->dim.enable) return;
6229 ELOGF("COMP", "DIM |set on Client [%d]", ec, enable);
6230 if (noeffect || !conf->dim_rect_effect)
6232 strncpy(emit, (enable ? "e,state,dim,on,noeffect" : "e,state,dim,off,noeffect"), sizeof(emit) - 1);
6236 strncpy(emit, (enable ? "e,state,dim,on" : "e,state,dim,off"), sizeof(emit) - 1);
6239 cw->dim.enable = enable;
6241 if (cw->dim.mask_set && !enable)
6243 e_comp_object_dim_mask_set(cw->ec->frame, enable);
6244 edje_object_signal_emit(cw->effect_obj, emit, "e");
6246 else if (cw->dim.mask_set && enable)
6248 edje_object_signal_emit(cw->effect_obj, emit, "e");
6249 e_comp_object_dim_mask_set(cw->ec->frame, enable);
6253 edje_object_signal_emit(cw->effect_obj, emit, "e");
6258 _e_comp_object_dim_enable_get(E_Client *ec, Evas_Object *obj)
6260 API_ENTRY EINA_FALSE;
6261 E_Comp_Config *conf = e_comp_config_get();
6263 if (!ec) return EINA_FALSE;
6264 if (!conf->dim_rect_enable) return EINA_FALSE;
6266 if (cw->dim.enable) return EINA_TRUE;
6272 _e_comp_object_dim_update(E_Comp_Object *cw)
6274 E_Comp_Config *conf = e_comp_config_get();
6277 if (!conf->dim_rect_enable) return;
6278 if (!cw->effect_obj) return;
6281 edje_object_signal_emit(cw->effect_obj, (cw->dim.enable ? "e,state,dim,on,noeffect" : "e,state,dim,off,noeffect"), "e");
6282 ELOGF("COMP", "DIM |Applied on Client dim.enable[%d]", cw->ec, cw->dim.enable);
6284 if (cw->dim.mask_set)
6286 e_comp_object_dim_mask_set(cw->ec->frame, cw->dim.mask_set);
6292 e_comp_object_clear(Evas_Object *obj)
6296 _e_comp_object_clear(cw);
6300 e_comp_object_hwc_update_exists(Evas_Object *obj)
6302 API_ENTRY EINA_FALSE;
6303 return cw->hwc_need_update;
6308 e_comp_object_hwc_update_set(Evas_Object *obj, Eina_Bool set)
6311 cw->hwc_need_update = set;
6315 e_comp_object_effect_object_part_swallow(Evas_Object *obj, const char *part_name, Evas_Object *swallow_obj)
6317 API_ENTRY EINA_FALSE;
6318 return edje_object_part_swallow(cw->effect_obj, part_name, swallow_obj);
6322 e_comp_object_indicator_swallow(Evas_Object *obj, Evas_Object *indicator)
6325 if (cw->indicator.obj != indicator)
6326 edje_object_part_unswallow(cw->shobj, cw->indicator.obj);
6327 cw->indicator.obj = indicator;
6328 edje_object_part_swallow(cw->shobj, "e.swallow.indicator", indicator);
6332 e_comp_object_indicator_unswallow(Evas_Object *obj, Evas_Object *indicator)
6335 if (cw->indicator.obj != indicator) return;
6336 cw->indicator.obj = NULL;
6337 edje_object_part_unswallow(cw->shobj, indicator);
6341 e_comp_object_indicator_size_set(Evas_Object *obj, int w, int h)
6344 Edje_Message_Int_Set *msg;
6346 if (!cw->indicator.obj) return;
6348 cw->indicator.w = w;
6349 cw->indicator.h = h;
6351 if (!cw->shobj) return;
6353 msg = alloca(sizeof(Edje_Message_Int_Set) + (sizeof(int)));
6357 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT_SET, 0, msg);
6358 edje_object_message_signal_process(cw->shobj);
6361 /* buffer transform and scale are applied to e_comp_object and e_pixmap internaly */
6363 e_comp_object_map_update(Evas_Object *obj)
6366 E_Client *ec = cw->ec;
6367 E_Comp_Wl_Client_Data *cdata;
6369 int x1, y1, x2, y2, x, y, bw, bh, tw, th;
6372 int l, remain = sizeof buffer;
6375 if (e_object_is_del(E_OBJECT(ec))) return;
6376 cdata = e_client_cdata_get(ec);
6379 /* if buffer had been flushed, buffer could be NULL. Then map will be applied
6380 * when new buffer is attached.
6382 if (!cdata->buffer_ref.buffer) return;
6384 if ((!cw->redirected) ||
6385 (e_client_video_hw_composition_check(ec)) ||
6386 (!e_comp_wl_output_buffer_transform_get(ec) &&
6387 cdata->scaler.buffer_viewport.buffer.scale == 1))
6389 if (evas_object_map_enable_get(cw->effect_obj))
6391 ELOGF("TRANSFORM", "map: disable", cw->ec);
6392 evas_object_map_enable_set(cw->effect_obj, EINA_FALSE);
6393 _e_comp_object_map_transform_rect(cw->ec, 0, 0, cw->w, cw->h, NULL, NULL, &tw, &th);
6394 evas_object_resize(cw->effect_obj, tw, th);
6401 EINA_SAFETY_ON_NULL_RETURN(map);
6403 e_pixmap_size_get(ec->pixmap, &bw, &bh);
6409 e_map_util_points_populate_from_geometry(map, ec->x, ec->y, bw, bh, 0);
6411 _e_comp_object_map_transform_pos(ec, x1, y1, &x, &y);
6412 e_map_point_image_uv_set(map, 0, x, y);
6413 l = snprintf(p, remain, "%d,%d", x, y);
6414 p += l, remain -= l;
6416 _e_comp_object_map_transform_pos(ec, x2, y1, &x, &y);
6417 e_map_point_image_uv_set(map, 1, x, y);
6418 l = snprintf(p, remain, " %d,%d", x, y);
6419 p += l, remain -= l;
6421 _e_comp_object_map_transform_pos(ec, x2, y2, &x, &y);
6422 e_map_point_image_uv_set(map, 2, x, y);
6423 l = snprintf(p, remain, " %d,%d", x, y);
6424 p += l, remain -= l;
6426 _e_comp_object_map_transform_pos(ec, x1, y2, &x, &y);
6427 e_map_point_image_uv_set(map, 3, x, y);
6428 l = snprintf(p, remain, " %d,%d", x, y);
6429 p += l, remain -= l;
6431 ELOGF("TRANSFORM", "map: point(%d,%d %dx%d) uv(%d,%d %d,%d %d,%d %d,%d=>%s)",
6433 ec->x, ec->y, bw, bh, x1, y1, x2, y1, x2, y2, x1, y2, buffer);
6435 e_comp_object_map_set(cw->effect_obj, map);
6436 e_comp_object_map_enable_set(cw->effect_obj, EINA_TRUE);
6440 /* if there's screen rotation with comp mode, then ec->effect_obj and
6441 * ec->obj should rotate. if not, in evas_map, update region is clipped.
6443 _e_comp_object_map_transform_rect(cw->ec, 0, 0, bw, bh, NULL, NULL, &tw, &th);
6444 evas_object_resize(cw->effect_obj, tw, th);
6448 e_comp_object_render_trace_set(Evas_Object *obj, Eina_Bool set)
6450 API_ENTRY EINA_FALSE;
6452 cw->render_trace = set;
6458 e_comp_object_native_usable_get(Evas_Object *obj)
6460 API_ENTRY EINA_FALSE;
6461 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6463 if (cw->ec->input_only) return EINA_FALSE;
6464 if (cw->external_content) return EINA_FALSE;
6465 if (e_comp_object_content_type_get(cw->ec->frame) != E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE) return EINA_FALSE;
6467 /* just return true value, if it is normal case */
6468 if (e_pixmap_usable_get(cw->ec->pixmap)) return EINA_TRUE;
6471 Evas_Native_Surface *ns;
6472 ns = evas_object_image_native_surface_get(cw->obj);
6474 /* client pixmap is not usable but cw->obj is drawable due to it holds valid native surface*/
6477 ELOGF("COMP", "Client pixmap is Not usable but still holds valid native surface", cw->ec);
6485 e_comp_object_image_filter_set(Evas_Object *obj, E_Comp_Image_Filter filter)
6487 API_ENTRY EINA_FALSE;
6488 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6489 if (e_object_is_del(E_OBJECT(cw->ec))) return EINA_FALSE;
6490 if (!e_client_cdata_get(cw->ec)) return EINA_FALSE;
6494 case E_COMP_IMAGE_FILTER_BLUR:
6495 efl_gfx_filter_program_set(cw->obj, "blur (20) padding_set (0)", "image_filter");
6497 case E_COMP_IMAGE_FILTER_GRAYSCALE:
6498 efl_gfx_filter_program_set(cw->obj, "grayscale ()", "image_filter");
6500 case E_COMP_IMAGE_FILTER_INVERSE:
6501 efl_gfx_filter_program_set(cw->obj, "inverse_color ()", "image_filter");
6503 case E_COMP_IMAGE_FILTER_NONE:
6505 efl_gfx_filter_program_set(cw->obj, NULL, "image_filter");
6509 cw->image_filter = filter;
6514 EINTERN E_Comp_Image_Filter
6515 e_comp_object_image_filter_get(Evas_Object *obj)
6517 API_ENTRY E_COMP_IMAGE_FILTER_NONE;
6518 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, E_COMP_IMAGE_FILTER_NONE);
6519 if (e_object_is_del(E_OBJECT(cw->ec))) return E_COMP_IMAGE_FILTER_NONE;
6520 if (!e_client_cdata_get(cw->ec)) return E_COMP_IMAGE_FILTER_NONE;
6522 return cw->image_filter;
6526 _e_comp_object_damage_trace_render_pre_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
6530 if (!_damage_trace) return;
6532 EINA_LIST_FREE(_damage_trace_post_objs, obj)
6533 evas_object_del(obj);
6535 _damage_trace_post_objs = NULL;
6539 _e_comp_object_damage_trace_render_post_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
6541 if (!_damage_trace) return;
6543 _damage_trace_post_objs = _damage_trace_objs;
6544 _damage_trace_objs = NULL;
6548 e_comp_object_damage_trace_debug(Eina_Bool onoff)
6550 if (_damage_trace == onoff) return;
6554 evas_event_callback_add(e_comp->evas,
6555 EVAS_CALLBACK_RENDER_PRE,
6556 _e_comp_object_damage_trace_render_pre_cb,
6559 evas_event_callback_add(e_comp->evas,
6560 EVAS_CALLBACK_RENDER_POST,
6561 _e_comp_object_damage_trace_render_post_cb,
6568 EINA_LIST_FREE(_damage_trace_objs, obj)
6569 evas_object_del(obj);
6571 _damage_trace_objs = NULL;
6573 EINA_LIST_FREE(_damage_trace_post_objs, obj)
6574 evas_object_del(obj);
6576 _damage_trace_post_objs = NULL;
6578 evas_event_callback_del(e_comp->evas,
6579 EVAS_CALLBACK_RENDER_PRE,
6580 _e_comp_object_damage_trace_render_pre_cb);
6582 evas_event_callback_del(e_comp->evas,
6583 EVAS_CALLBACK_RENDER_POST,
6584 _e_comp_object_damage_trace_render_post_cb);
6587 _damage_trace = onoff;
6591 e_comp_object_redirected_get(Evas_Object *obj)
6593 API_ENTRY EINA_FALSE;
6594 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6596 return cw->redirected;
6600 e_comp_object_color_visible_get(Evas_Object *obj)
6602 API_ENTRY EINA_FALSE;
6605 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6607 e_comp_object_color_get(obj, NULL, NULL, NULL, &a);
6611 evas_object_color_get(cw->effect_obj, NULL, NULL, NULL, &a);
6615 evas_object_color_get(cw->shobj, NULL, NULL, NULL, &a);
6619 evas_object_color_get(cw->obj, NULL, NULL, NULL, &a);
6627 e_comp_object_map_set(Evas_Object *obj, E_Map *em)
6629 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
6631 return e_map_set_to_comp_object(em, obj);
6635 e_comp_object_map_get(const Evas_Object *obj)
6637 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
6639 return e_map_get_from_comp_object(obj);
6643 e_comp_object_map_enable_set(Evas_Object *obj, Eina_Bool enable)
6645 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
6647 evas_object_map_enable_set(obj, enable);
6653 e_comp_object_render_update_lock(Evas_Object *obj)
6655 API_ENTRY EINA_FALSE;
6657 if (cw->render_update_lock.lock == 0)
6659 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET, cw->ec);
6660 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref,
6661 e_pixmap_resource_get(cw->ec->pixmap));
6662 e_comp_object_render_update_del(obj);
6663 ELOGF("COMP", "Render update lock enabled", cw->ec);
6666 cw->render_update_lock.lock++;
6672 e_comp_object_render_update_unlock(Evas_Object *obj)
6676 if (cw->render_update_lock.lock == 0)
6679 cw->render_update_lock.lock--;
6681 if (cw->render_update_lock.lock == 0)
6684 if (cw->render_update_lock.pending_move_set)
6686 evas_object_move(obj,
6687 cw->render_update_lock.pending_move_x,
6688 cw->render_update_lock.pending_move_y);
6689 cw->render_update_lock.pending_move_x = 0;
6690 cw->render_update_lock.pending_move_y = 0;
6691 cw->render_update_lock.pending_move_set = EINA_FALSE;
6694 if (cw->render_update_lock.pending_resize_set)
6696 evas_object_resize(obj,
6697 cw->render_update_lock.pending_resize_w,
6698 cw->render_update_lock.pending_resize_h);
6699 cw->render_update_lock.pending_resize_w = 0;
6700 cw->render_update_lock.pending_resize_h = 0;
6701 cw->render_update_lock.pending_resize_set = EINA_FALSE;
6704 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, NULL);
6706 if ((cw->ec->exp_iconify.buffer_flush) &&
6707 (e_policy_visibility_client_is_iconic(cw->ec)) &&
6708 (cw->ec->comp_data) && (!cw->ec->comp_data->buffer_ref.buffer))
6709 e_comp_object_clear(obj);
6711 e_comp_object_render_update_add(obj);
6713 ELOGF("COMP", "Render update lock disabled", cw->ec);
6718 e_comp_object_render_update_lock_get(Evas_Object *obj)
6720 API_ENTRY EINA_FALSE;
6722 if (cw->render_update_lock.lock > 0)
6729 e_comp_object_color_get(Evas_Object *obj, int *r, int *g, int *b, int *a)
6733 if (cw->transparent.set)
6735 if (r) *r = cw->transparent.user_r;
6736 if (g) *g = cw->transparent.user_g;
6737 if (b) *b = cw->transparent.user_b;
6738 if (a) *a = cw->transparent.user_a;
6742 evas_object_color_get(obj, r, g, b, a);