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 *shobj; // shadow object
89 Evas_Object *effect_obj; // effects object
90 Evas_Object *transform_bg_obj; // transform backgroung with keep_ratio option
95 Evas_Object *transform_tranp_obj;// transform transp rect obj
96 Evas_Object *default_input_obj; // default input object
97 unsigned int layer; //e_comp_canvas_layer_map(cw->ec->layer)
98 Eina_List *obj_mirror; // extra mirror objects
99 Eina_Tiler *updates; //render update regions
100 Eina_Tiler *pending_updates; //render update regions which are about to render
102 Evas_Native_Surface *ns; //for custom gl rendering
104 struct wl_listener buffer_destroy_listener;
106 unsigned int update_count; // how many updates have happened to this obj
108 unsigned int opacity; // opacity set with _NET_WM_WINDOW_OPACITY
110 unsigned int animating; // it's busy animating
111 unsigned int failures; //number of consecutive e_pixmap_image_draw() failures
112 unsigned int force_visible; //number of visible obj_mirror objects
113 Eina_Bool delete_pending : 1; // delete pending
114 Eina_Bool defer_hide : 1; // flag to get hide to work on deferred hide
115 Eina_Bool showing : 1; // object is currently in "show" animation
116 Eina_Bool hiding : 1; // object is currently in "hide" animation
117 Eina_Bool visible : 1; // is visible
119 Eina_Bool shaped : 1; // is shaped
120 Eina_Bool update : 1; // has updates to fetch
121 Eina_Bool redirected : 1; // has updates to fetch
122 Eina_Bool native : 1; // native
124 Eina_Bool nocomp : 1; // nocomp applied
125 Eina_Bool hwc_need_update : 1; // this window updated while on e_plane to do hw composite
126 Eina_Bool real_hid : 1; // last hide was a real window unmap
128 Eina_Bool effect_set : 1; //effect_obj has a valid group
129 Eina_Bool effect_running : 1; //effect_obj is playing an animation
130 Eina_Bool effect_clip : 1; //effect_obj is clipped
131 Eina_Bool effect_clip_able : 1; //effect_obj will be clipped for effects
133 Eina_Bool updates_exist : 1;
134 Eina_Bool updates_full : 1; // entire object will be updated
136 Eina_Bool force_move : 1;
137 Eina_Bool frame_extends : 1; //frame may extend beyond object size
138 Eina_Bool blanked : 1; //window is rendering blank content (externally composited)
139 Eina_Bool external_content : 1; // e.swallow.content(obj) is set by external evas object
140 Eina_Bool user_alpha_set : 1;
141 Eina_Bool user_alpha : 1;
145 Evas_Object *obj; // mask object: transparent parts of this comp object allow to copy the alpha to current H/W plane.
146 Evas_Render_Op saved_render_op; // saved render operation value to restore when clear a mask.
153 } indicator; //indicator object for internal client
157 Evas_Object *mask_obj;
160 int mask_x, mask_y, mask_w, mask_h;
163 Eina_Bool render_trace : 1; // trace co->obj rendering on canvas
165 tbm_surface_h tbm_surface;
166 E_Comp_Image_Filter image_filter;
167 Eina_Bool set_mouse_callbacks;
172 E_Comp_Wl_Buffer_Ref buffer_ref;
173 Eina_Bool pending_move_set;
174 int pending_move_x, pending_move_y;
175 Eina_Bool pending_resize_set;
176 int pending_resize_w, pending_resize_h;
177 } render_update_lock;
189 typedef struct _E_Input_Rect_Data
195 typedef struct _E_Input_Rect_Smart_Data
197 Eina_List *input_rect_data_list;
199 } E_Input_Rect_Smart_Data;
201 struct E_Comp_Object_Mover
204 E_Comp_Object_Mover_Cb func;
210 static Eina_Inlist *_e_comp_object_movers = NULL;
211 static Evas_Smart *_e_comp_smart = NULL;
212 static Evas_Smart *_e_comp_input_obj_smart = NULL;
214 static int _e_comp_object_hooks_delete = 0;
215 static int _e_comp_object_hooks_walking = 0;
217 static Eina_Inlist *_e_comp_object_hooks[] =
219 [E_COMP_OBJECT_HOOK_EFFECT_START] = NULL,
220 [E_COMP_OBJECT_HOOK_EFFECT_END] = NULL,
221 [E_COMP_OBJECT_HOOK_RESTACK] = NULL,
222 [E_COMP_OBJECT_HOOK_OBJECT_SETUP] = NULL,
223 [E_COMP_OBJECT_HOOK_LAYER_SET] = NULL,
224 [E_COMP_OBJECT_HOOK_MASK_OBJECT_SET] = NULL,
225 [E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET] = NULL,
226 [E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET] = NULL,
227 //#ifdef REFACTOR_FOCUS_POLICY
228 [E_COMP_OBJECT_HOOK_LOWER] = NULL,
229 [E_COMP_OBJECT_HOOK_MOVE] = NULL,
230 [E_COMP_OBJECT_HOOK_SHOW] = NULL,
234 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
235 static int _e_comp_object_intercept_hooks_delete = 0;
236 static int _e_comp_object_intercept_hooks_walking = 0;
238 static Eina_Inlist *_e_comp_object_intercept_hooks[] =
240 [E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER] = NULL,
241 [E_COMP_OBJECT_INTERCEPT_HOOK_HIDE] = NULL,
245 static Eina_Bool _damage_trace = EINA_FALSE;
246 static Eina_List *_damage_trace_objs = NULL;
247 static Eina_List *_damage_trace_post_objs = NULL;
249 /* sekrit functionzzz */
250 EINTERN void e_client_focused_set(E_Client *ec);
252 /* emitted every time a new noteworthy comp object is added */
253 EINTERN int E_EVENT_COMP_OBJECT_ADD = -1;
255 /* ecore event define */
256 EINTERN int E_EVENT_COMP_OBJECT_IMG_RENDER = -1;
257 EINTERN int E_EVENT_COMP_OBJECT_EFFECT_START = -1;
258 EINTERN int E_EVENT_COMP_OBJECT_EFFECT_END = -1;
260 static void _e_comp_object_dim_enable_set(E_Client *ec, Evas_Object *obj, Eina_Bool enable, Eina_Bool noeffect);
261 static Eina_Bool _e_comp_object_dim_enable_get(E_Client *ec, Evas_Object *obj);
262 static void _e_comp_object_dim_update(E_Comp_Object *cw);
263 static void _e_comp_object_native_surface_set(E_Comp_Object *cw, Evas_Native_Surface *ns, Eina_Bool with_mirror);
264 static void _e_comp_object_layer_set(Evas_Object *obj, short layer);
266 static E_Client *dim_client = NULL;
269 _e_comp_object_hooks_clean(void)
272 E_Comp_Object_Hook *ch;
275 for (x = 0; x < E_COMP_OBJECT_HOOK_LAST; x++)
276 EINA_INLIST_FOREACH_SAFE(_e_comp_object_hooks[x], l, ch)
278 if (!ch->delete_me) continue;
279 _e_comp_object_hooks[x] = eina_inlist_remove(_e_comp_object_hooks[x], EINA_INLIST_GET(ch));
285 _e_comp_object_hook_call(E_Comp_Object_Hook_Point hookpoint, E_Client *ec)
287 E_Comp_Object_Hook *ch;
288 Eina_Bool ret = EINA_TRUE;
290 if (e_object_is_del(E_OBJECT(ec)))
292 if ((hookpoint != E_COMP_OBJECT_HOOK_EFFECT_START) &&
293 (hookpoint != E_COMP_OBJECT_HOOK_EFFECT_END) &&
294 (hookpoint != E_COMP_OBJECT_HOOK_OBJECT_SETUP) &&
295 (hookpoint != E_COMP_OBJECT_HOOK_LAYER_SET) &&
296 (hookpoint != E_COMP_OBJECT_HOOK_RESTACK) &&
297 (hookpoint != E_COMP_OBJECT_HOOK_MASK_OBJECT_SET) &&
298 (hookpoint != E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET) &&
299 (hookpoint != E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET)
300 #ifdef REFACTOR_FOCUS_POLICY
301 && (hookpoint != E_COMP_OBJECT_HOOK_LOWER) &&
302 (hookpoint != E_COMP_OBJECT_HOOK_MOVE) &&
303 (hookpoint != E_COMP_OBJECT_HOOK_SHOW)
310 e_object_ref(E_OBJECT(ec));
311 _e_comp_object_hooks_walking++;
312 EINA_INLIST_FOREACH(_e_comp_object_hooks[hookpoint], ch)
314 if (ch->delete_me) continue;
315 if (!(ch->func(ch->data, ec)))
321 _e_comp_object_hooks_walking--;
322 if ((_e_comp_object_hooks_walking == 0) && (_e_comp_object_hooks_delete > 0))
323 _e_comp_object_hooks_clean();
325 e_object_unref(E_OBJECT(ec));
330 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
332 _e_comp_object_intercept_hooks_clean(void)
335 E_Comp_Object_Intercept_Hook *ch;
338 for (x = 0; x < E_COMP_OBJECT_INTERCEPT_HOOK_LAST; x++)
339 EINA_INLIST_FOREACH_SAFE(_e_comp_object_intercept_hooks[x], l, ch)
341 if (!ch->delete_me) continue;
342 _e_comp_object_intercept_hooks[x] = eina_inlist_remove(_e_comp_object_intercept_hooks[x], EINA_INLIST_GET(ch));
348 _e_comp_object_intercept_hook_call(E_Comp_Object_Intercept_Hook_Point hookpoint, E_Client *ec)
350 E_Comp_Object_Intercept_Hook *ch;
351 Eina_Bool ret = EINA_TRUE;
353 if (e_object_is_del(E_OBJECT(ec))) return ret;
354 e_object_ref(E_OBJECT(ec));
355 _e_comp_object_intercept_hooks_walking++;
356 EINA_INLIST_FOREACH(_e_comp_object_intercept_hooks[hookpoint], ch)
358 if (ch->delete_me) continue;
359 if (!(ch->func(ch->data, ec)))
365 _e_comp_object_intercept_hooks_walking--;
366 if ((_e_comp_object_intercept_hooks_walking == 0) && (_e_comp_object_intercept_hooks_delete > 0))
367 _e_comp_object_intercept_hooks_clean();
369 e_object_unref(E_OBJECT(ec));
376 _e_comp_object_event_free(void *d EINA_UNUSED, void *event)
378 E_Event_Comp_Object *ev = event;
381 ec = evas_object_data_get(ev->comp_object, "E_Client");
385 e_object_unref(E_OBJECT(ec));
387 evas_object_unref(ev->comp_object);
392 _e_comp_object_event_add(Evas_Object *obj)
394 E_Event_Comp_Object *ev;
397 if (stopping) return;
398 ev = E_NEW(E_Event_Comp_Object, 1);
399 EINA_SAFETY_ON_NULL_RETURN(ev);
401 evas_object_ref(obj);
402 ev->comp_object = obj;
403 ec = evas_object_data_get(ev->comp_object, "E_Client");
407 e_object_ref(E_OBJECT(ec));
409 ecore_event_add(E_EVENT_COMP_OBJECT_ADD, ev, _e_comp_object_event_free, NULL);
413 _e_comp_object_simple_free(void *d EINA_UNUSED, void *event)
415 E_Event_Comp_Object *ev = event;
418 ec = evas_object_data_get(ev->comp_object, "E_Client");
422 e_object_unref(E_OBJECT(ec));
424 evas_object_unref(ev->comp_object);
429 _e_comp_object_event_simple(Evas_Object *obj, int type)
431 E_Event_Comp_Object *ev;
434 ev = E_NEW(E_Event_Comp_Object, 1);
437 evas_object_ref(obj);
438 ev->comp_object = obj;
439 ec = evas_object_data_get(ev->comp_object, "E_Client");
443 e_object_ref(E_OBJECT(ec));
445 ecore_event_add(type, ev, (Ecore_End_Cb)_e_comp_object_simple_free, NULL);
447 /////////////////////////////////////
450 _e_comp_object_cb_mirror_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
452 E_Comp_Object *cw = data;
454 cw->obj_mirror = eina_list_remove(cw->obj_mirror, obj);
458 _e_comp_object_cb_mirror_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
460 E_Comp_Object *cw = data;
462 if ((!cw->force_visible) && (!e_object_is_del(E_OBJECT(cw->ec))))
463 evas_object_smart_callback_call(cw->smart_obj, "visibility_force", cw->ec);
466 if (e_comp->hwc && !e_comp_is_on_overlay(cw->ec))
467 e_comp_hwc_client_end(cw->ec, __FUNCTION__);
471 _e_comp_object_cb_mirror_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
473 E_Comp_Object *cw = data;
476 if ((!cw->force_visible) && (!e_object_is_del(E_OBJECT(cw->ec))))
477 evas_object_smart_callback_call(cw->smart_obj, "visibility_normal", cw->ec);
480 /////////////////////////////////////
483 _e_comp_object_transform_obj_stack_update(Evas_Object *obj)
487 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
488 if (cw->ec->input_only) return;
490 layer = evas_object_layer_get(obj);
492 if (cw->transform_bg_obj)
494 if (layer != evas_object_layer_get(cw->transform_bg_obj))
496 evas_object_layer_set(cw->transform_bg_obj, layer);
499 evas_object_stack_below(cw->transform_bg_obj, obj);
502 if (cw->transform_tranp_obj)
504 if (layer != evas_object_layer_get(cw->transform_tranp_obj))
506 evas_object_layer_set(cw->transform_tranp_obj, layer);
509 evas_object_stack_below(cw->transform_tranp_obj, obj);
514 _e_comp_object_transform_obj_map_new(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
521 if (!map) return NULL;
523 e_map_util_points_populate_from_object_full(map, obj, 0);
524 e_map_util_points_color_set(map, 255, 255, 255, 255);
526 for (i = 0 ; i < 4 ; ++i)
531 e_util_transform_vertices_pos_round_get(vertices, i, &x, &y, 0, 0);
532 e_map_point_coord_set(map, i, x, y, 1.0);
539 _e_comp_object_transform_obj_map_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
545 E_Map *map = _e_comp_object_transform_obj_map_new(obj, vertices);
548 e_comp_object_map_set(obj, map);
549 e_comp_object_map_enable_set(obj, EINA_TRUE);
556 evas_object_map_enable_set(obj, EINA_FALSE);
561 _e_comp_object_transform_obj_map_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
567 E_Map *map = _e_comp_object_transform_obj_map_new(obj, vertices);
570 e_map_util_zoom(map, zoom.zoom_x, zoom.zoom_y, zoom.cx, zoom.cy);
572 e_comp_object_map_set(obj, map);
573 e_comp_object_map_enable_set(obj, EINA_TRUE);
580 evas_object_map_enable_set(obj, EINA_FALSE);
583 /////////////////////////////////////
585 static inline Eina_Bool
586 _e_comp_shaped_check(int w, int h, const Eina_Rectangle *rects, int num)
588 if (num > 1) return EINA_TRUE;
589 if ((rects[0].x == 0) && (rects[0].y == 0) &&
590 ((int)rects[0].w == w) && ((int)rects[0].h == h))
595 /////////////////////////////////////
597 /* add a client to the layer-client list */
599 _e_comp_object_layers_add(E_Comp_Object *cw, E_Comp_Object *above, E_Comp_Object *below, Eina_Bool prepend)
601 E_Comp_Object *layer_cw = NULL;
603 /* try to get the internal data for the layer;
604 * will return NULL for fake layers (eg. wayland)
606 if (e_comp->layers[cw->layer].obj)
608 if (evas_object_smart_smart_get(e_comp->layers[cw->layer].obj))
609 layer_cw = evas_object_smart_data_get(e_comp->layers[cw->layer].obj);
611 if (layer_cw == cw) layer_cw = NULL;
613 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));
615 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));
616 if ((!above) && (!below))
619 e_comp->layers[cw->layer].clients = eina_inlist_prepend(e_comp->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
621 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));
622 else //this is either the layer object or a tough actin tinactin^W^W^Wfast stacking client
623 e_comp->layers[cw->layer].clients = eina_inlist_append(e_comp->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
625 e_comp->layers[cw->layer].clients_count++;
626 #ifndef E_RELEASE_BUILD
629 E_Client *below_ec = e_client_below_get(cw->ec);
632 if (e_comp->layers[cw->layer].obj == below_ec->frame)
633 CRI("ACK! ec:%p", cw->ec);
640 _e_comp_object_layers_remove(E_Comp_Object *cw)
642 if (cw->ec && e_comp->layers[cw->layer].clients)
644 e_comp->layers[cw->layer].clients = eina_inlist_remove(e_comp->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
645 e_comp->layers[cw->layer].clients_count--;
648 e_comp->layers[cw->layer].objs = eina_inlist_remove(e_comp->layers[cw->layer].objs, EINA_INLIST_GET(cw));
649 e_comp->layers[cw->layer].objs_count--;
653 /////////////////////////////////////
655 _e_comp_object_alpha_set(E_Comp_Object *cw)
657 Eina_Bool alpha = cw->ec->argb;
659 if ((cw->external_content) &&
660 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
665 if (cw->blanked || cw->ns || cw->ec->shaped) alpha = EINA_TRUE;
666 if (cw->user_alpha_set) alpha = cw->user_alpha;
668 evas_object_image_alpha_set(cw->obj, alpha);
672 _e_comp_object_shadow(E_Comp_Object *cw)
674 if (e_client_util_shadow_state_get(cw->ec))
675 edje_object_signal_emit(cw->frame_object ?: cw->shobj, "e,state,shadow,on", "e");
677 edje_object_signal_emit(cw->frame_object ?: cw->shobj, "e,state,shadow,off", "e");
678 if (cw->frame_object)
679 edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e");
680 evas_object_smart_callback_call(cw->smart_obj, "shadow_change", cw->ec);
683 /* convert from the surface coordinates to the buffer coordinates */
685 _e_comp_object_map_transform_pos(E_Client *ec, int sx, int sy, int *dx, int *dy)
687 E_Comp_Wl_Buffer_Viewport *vp;
688 E_Comp_Wl_Client_Data *cdata;
692 cdata = e_client_cdata_get(ec);
694 if (!ec || !cdata || e_object_is_del(E_OBJECT(ec)))
701 vp = &cdata->scaler.buffer_viewport;
702 transform = e_comp_wl_output_buffer_transform_get(ec);
704 e_pixmap_size_get(ec->pixmap, &bw, &bh);
706 /* for subsurface, it should be swap 90 and 270 */
707 if (e_comp_wl_subsurface_check(ec))
710 case WL_OUTPUT_TRANSFORM_90: transform = WL_OUTPUT_TRANSFORM_270; break;
711 case WL_OUTPUT_TRANSFORM_270: transform = WL_OUTPUT_TRANSFORM_90; break;
712 case WL_OUTPUT_TRANSFORM_FLIPPED_90: transform = WL_OUTPUT_TRANSFORM_FLIPPED_270; break;
713 case WL_OUTPUT_TRANSFORM_FLIPPED_270: transform = WL_OUTPUT_TRANSFORM_FLIPPED_90; break;
719 case WL_OUTPUT_TRANSFORM_NORMAL:
720 default: tx = sx, ty = sy; break;
721 case WL_OUTPUT_TRANSFORM_90: tx = sy, ty = bw - sx; break;
722 case WL_OUTPUT_TRANSFORM_180: tx = bw - sx, ty = bh - sy; break;
723 case WL_OUTPUT_TRANSFORM_270: tx = bh - sy, ty = sx; break;
724 case WL_OUTPUT_TRANSFORM_FLIPPED: tx = bw - sx, ty = sy; break;
725 case WL_OUTPUT_TRANSFORM_FLIPPED_90: tx = sy, ty = sx; break;
726 case WL_OUTPUT_TRANSFORM_FLIPPED_180: tx = sx, ty = bh - sy; break;
727 case WL_OUTPUT_TRANSFORM_FLIPPED_270: tx = bh - sy, ty = bw - sx; break;
730 tx *= vp->buffer.scale;
731 ty *= vp->buffer.scale;
738 _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)
746 _e_comp_object_map_transform_pos(ec, x1, y1, &x1, &y1);
747 _e_comp_object_map_transform_pos(ec, x2, y2, &x2, &y2);
754 if (dw) *dw = MAX(x1, x2) - mx;
755 if (dh) *dh = MAX(y1, y2) - my;
759 _e_comp_object_map_damage_transform_rect(E_Client *ec, E_Map *m, int sx, int sy, int sw, int sh,
760 int *dx, int *dy, int *dw, int *dh)
762 E_Util_Transform_Rect rect = {sx, sy, sw, sh};
763 E_Util_Transform_Rect_Vertex sv, dv;
767 e_pixmap_size_get(ec->pixmap, &bw, &bh);
769 sv = e_util_transform_rect_to_vertices(&rect);
771 for (i = 0; i < 4; i++)
773 double x = 0.0, y = 0.0;
775 e_map_coords_get(m, sv.vertices[i].vertex[0], sv.vertices[i].vertex[1], &x, &y, 0);
777 /* if evas decide coordinate is outside of map, it returns (0, 0)
778 in this case, full damage is added.
780 if ((i != 0) && (x == 0.0) && (y == 0.0))
783 dv.vertices[i].vertex[0] = x;
784 dv.vertices[i].vertex[1] = y;
785 dv.vertices[i].vertex[2] = 1.0;
786 dv.vertices[i].vertex[3] = 1.0;
789 rect = e_util_transform_vertices_to_rect(&dv);
791 if (dx) *dx = rect.x;
792 if (dy) *dy = rect.y;
793 if (dw) *dw = rect.w;
794 if (dh) *dh = rect.h;
808 _e_comp_object_map_damage_transform_get(E_Client *ec)
815 if (!evas_object_map_enable_get(ec->frame))
818 m = e_client_map_get(ec);
822 e_pixmap_size_get(ec->pixmap, &bw, &bh);
823 if ((bw == 0) || (bh == 0))
836 e_map_point_coord_set(m2, 0, 0, 0, 0);
837 e_map_point_coord_set(m2, 1, bw, 0, 0);
838 e_map_point_coord_set(m2, 2, bw, bh, 0);
839 e_map_point_coord_set(m2, 3, 0, bh, 0);
841 for (i = 0; i < 4; i++)
845 e_map_point_coord_get(m, i, &map_x, &map_y, NULL);
846 e_map_point_image_uv_set(m2, i, map_x, map_y);
853 /////////////////////////////////////
855 /* handle evas mouse-in events on client object */
857 _e_comp_object_cb_mouse_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
859 Evas_Event_Mouse_In *ev = event_info;
860 E_Comp_Object *cw = data;
862 e_client_mouse_in(cw->ec, ev->output.x, ev->output.y);
865 /* handle evas mouse-out events on client object */
867 _e_comp_object_cb_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
869 Evas_Event_Mouse_Out *ev = event_info;
870 E_Comp_Object *cw = data;
872 e_client_mouse_out(cw->ec, ev->output.x, ev->output.y);
875 /* handle evas mouse wheel events on client object */
877 _e_comp_object_cb_mouse_wheel(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
879 Evas_Event_Mouse_Wheel *ev = event_info;
880 E_Comp_Object *cw = data;
881 E_Binding_Event_Wheel ev2;
884 if (e_client_action_get()) return;
885 e_bindings_evas_event_mouse_wheel_convert(ev, &ev2);
886 e_client_mouse_wheel(cw->ec, &ev->output, &ev2);
889 /* handle evas mouse down events on client object */
891 _e_comp_object_cb_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
893 Evas_Event_Mouse_Down *ev = event_info;
894 E_Comp_Object *cw = data;
895 E_Binding_Event_Mouse_Button ev2;
898 if (e_client_action_get()) return;
899 e_bindings_evas_event_mouse_down_button_convert(ev, &ev2);
900 e_client_mouse_down(cw->ec, ev->button, &ev->output, &ev2);
903 /* handle evas mouse up events on client object */
905 _e_comp_object_cb_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
907 Evas_Event_Mouse_Up *ev = event_info;
908 E_Comp_Object *cw = data;
909 E_Binding_Event_Mouse_Button ev2;
912 if (e_client_action_get() && (e_client_action_get() != cw->ec)) return;
913 e_bindings_evas_event_mouse_up_button_convert(ev, &ev2);
914 e_client_mouse_up(cw->ec, ev->button, &ev->output, &ev2);
917 /* handle evas mouse movement events on client object */
919 _e_comp_object_cb_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
921 Evas_Event_Mouse_Move *ev = event_info;
922 E_Comp_Object *cw = data;
925 if (e_client_action_get() && (e_client_action_get() != cw->ec)) return;
926 e_client_mouse_move(cw->ec, &ev->cur.output);
928 /////////////////////////////////////
930 /* helper function for checking compositor themes based on user-defined matches */
932 _e_comp_object_shadow_client_match(const E_Client *ec, E_Comp_Match *m)
934 if (((m->title) && (!ec->netwm.name)) ||
935 ((ec->netwm.name) && (m->title) && (!e_util_glob_match(ec->netwm.name, m->title))))
937 #if defined(__cplusplus) || defined(c_plusplus)
938 if (((m->clas) && (!ec->icccm.cpp_class)) ||
939 ((ec->icccm.cpp_class) && (m->clas) && (!e_util_glob_match(ec->icccm.cpp_class, m->clas))))
942 if (((m->clas) && (!ec->icccm.class)) ||
943 ((ec->icccm.class) && (m->clas) && (!e_util_glob_match(ec->icccm.class, m->clas))))
947 if (((m->role) && (!ec->icccm.window_role)) ||
948 ((ec->icccm.window_role) && (m->role) && (!e_util_glob_match(ec->icccm.window_role, m->role))))
954 if ((int)ec->netwm.type != m->primary_type)
957 else if (m->primary_type != E_WINDOW_TYPE_REAL_UNKNOWN)
960 if (m->borderless != 0)
964 if (e_client_util_borderless(ec))
966 if (!(((m->borderless == -1) && (!borderless)) ||
967 ((m->borderless == 1) && (borderless))))
974 if (((ec->icccm.transient_for != 0) ||
977 if (!(((m->dialog == -1) && (!dialog)) ||
978 ((m->dialog == 1) && (dialog))))
981 if (m->accepts_focus != 0)
983 int accepts_focus = 0;
985 if (ec->icccm.accepts_focus)
987 if (!(((m->accepts_focus == -1) && (!accepts_focus)) ||
988 ((m->accepts_focus == 1) && (accepts_focus))))
997 if (!(((m->vkbd == -1) && (!vkbd)) ||
998 ((m->vkbd == 1) && (vkbd))))
1003 if (!(((m->argb == -1) && (!ec->argb)) ||
1004 ((m->argb == 1) && (ec->argb))))
1007 if (m->fullscreen != 0)
1009 int fullscreen = ec->fullscreen;
1011 if (!(((m->fullscreen == -1) && (!fullscreen)) ||
1012 ((m->fullscreen == 1) && (fullscreen))))
1019 if (ec->netwm.state.modal)
1021 if (!(((m->modal == -1) && (!modal)) ||
1022 ((m->modal == 1) && (modal))))
1028 /* function for setting up a client's compositor frame theme (cw->shobj) */
1030 _e_comp_object_shadow_setup(E_Comp_Object *cw)
1034 Eina_List *list = NULL, *l;
1035 E_Input_Rect_Data *input_rect_data;
1036 E_Input_Rect_Smart_Data *input_rect_sd;
1038 Eina_Stringshare *reshadow_group = NULL;
1039 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;
1040 Eina_Stringshare *name, *title;
1041 E_Comp_Config *conf = e_comp_config_get();
1043 edje_object_file_get(cw->shobj, NULL, &reshadow_group);
1044 /* match correct client type */
1045 list = cw->ec->override ? conf->match.overrides : conf->match.borders;
1046 name = cw->ec->icccm.name;
1047 title = cw->ec->icccm.title;
1048 skip = (cw->ec->override ? conf->match.disable_overrides : conf->match.disable_borders) || (title && (!strncmp(title, "noshadow", 8)));
1049 fast = cw->ec->override ? conf->fast_overrides : conf->fast_borders;
1051 /* skipping here is mostly a hack for systray because I hate it */
1054 EINA_LIST_FOREACH(list, l, m)
1056 if (((m->name) && (!name)) ||
1057 ((name) && (m->name) && (!e_util_glob_match(name, m->name))))
1059 if (!_e_comp_object_shadow_client_match(cw->ec, m)) continue;
1063 no_shadow = m->no_shadow;
1064 if (m->shadow_style)
1066 /* fast effects are just themes with "/fast" appended and shorter effect times */
1069 snprintf(buf, sizeof(buf), "e/comp/frame/%s/fast", m->shadow_style);
1070 reshadow = ok = !e_util_strcmp(reshadow_group, buf);
1072 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", buf);
1074 /* default to non-fast style if fast not available */
1077 snprintf(buf, sizeof(buf), "e/comp/frame/%s", m->shadow_style);
1078 reshadow = ok = !e_util_strcmp(reshadow_group, buf);
1080 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", buf);
1082 if (ok && m->visibility_effect)
1083 eina_stringshare_refplace(&cw->visibility_effect, m->visibility_effect);
1090 if (skip || (cw->ec->e.state.video))
1092 reshadow = ok = !e_util_strcmp(reshadow_group, "e/comp/frame/none");
1094 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", "e/comp/frame/none");
1097 if (conf->shadow_style)
1101 snprintf(buf, sizeof(buf), "e/comp/frame/%s/fast", conf->shadow_style);
1102 reshadow = ok = !e_util_strcmp(reshadow_group, buf);
1104 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", buf);
1108 snprintf(buf, sizeof(buf), "e/comp/frame/%s", conf->shadow_style);
1109 reshadow = ok = !e_util_strcmp(reshadow_group, buf);
1111 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", buf);
1118 reshadow = ok = !e_util_strcmp(reshadow_group, "e/comp/frame/default/fast");
1120 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", "e/comp/frame/default/fast");
1124 reshadow = ok = !e_util_strcmp(reshadow_group, "e/comp/frame/default");
1126 ok = e_theme_edje_object_set(cw->shobj, "base/theme/comp", "e/comp/frame/default");
1131 /* reshadow means this entire function call has been a no-op since we're re-setting the current style */
1136 if (cw->ec->override)
1138 if ((!cw->ec->shaped) && (!no_shadow) && (!cw->ec->argb))
1139 edje_object_signal_emit(cw->shobj, "e,state,shadow,on", "e");
1141 edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e");
1142 evas_object_smart_callback_call(cw->smart_obj, "shadow_change", cw->ec);
1148 edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e");
1149 evas_object_smart_callback_call(cw->smart_obj, "shadow_change", cw->ec);
1152 _e_comp_object_shadow(cw);
1155 if (focus || cw->ec->focused || cw->ec->override)
1156 e_comp_object_signal_emit(cw->smart_obj, "e,state,focused", "e");
1158 e_comp_object_signal_emit(cw->smart_obj, "e,state,unfocused", "e");
1159 if (urgent || cw->ec->urgent)
1160 e_comp_object_signal_emit(cw->smart_obj, "e,state,urgent", "e");
1162 e_comp_object_signal_emit(cw->smart_obj, "e,state,not_urgent", "e");
1164 e_comp_object_signal_emit(cw->smart_obj, "e,state,shaded", "e");
1166 e_comp_object_signal_emit(cw->smart_obj, "e,state,sticky", "e");
1168 e_comp_object_signal_emit(cw->smart_obj, "e,state,hung", "e");
1169 /* visibility must always be enabled for re_manage clients to prevent
1170 * pop-in animations every time the user sees a persistent client again;
1171 * applying visibility for iconic clients prevents the client from getting
1174 if (cw->visible || cw->ec->re_manage)
1175 e_comp_object_signal_emit(cw->smart_obj, "e,state,visible", "e");
1177 e_comp_object_signal_emit(cw->smart_obj, "e,state,hidden", "e");
1179 /* breaks animation counter */
1180 if (cw->frame_object)
1182 edje_object_part_swallow(cw->frame_object, "e.swallow.client", cw->obj);
1183 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object);
1184 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object);
1185 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object);
1191 edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->obj);
1195 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
1198 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
1200 if (input_rect_data->obj)
1202 pass_event_flag = EINA_TRUE;
1208 if (cw->indicator.obj)
1210 Evas_Object *indicator;
1211 indicator = edje_object_part_swallow_get(cw->shobj, "e.swallow.indicator");
1212 if (indicator != cw->indicator.obj)
1214 edje_object_part_unswallow(cw->shobj, indicator);
1215 edje_object_part_swallow(cw->shobj, "e.swallow.indicator", cw->indicator.obj);
1216 e_comp_object_indicator_size_set(cw->smart_obj, cw->indicator.w, cw->indicator.h);
1220 evas_object_pass_events_set(cw->default_input_obj, pass_event_flag);
1221 evas_object_pass_events_set(cw->obj, pass_event_flag);
1226 /////////////////////////////////////////////
1229 _e_comp_object_animating_begin(E_Comp_Object *cw)
1232 if (cw->animating == 1)
1234 e_comp->animating++;
1236 e_object_ref(E_OBJECT(cw->ec));
1241 _e_comp_object_animating_end(E_Comp_Object *cw)
1250 if (cw->ec->launching)
1252 if (!cw->ec->extra_animating)
1254 ELOGF("COMP", "Un-Set launching flag..", cw->ec);
1255 cw->ec->launching = EINA_FALSE;
1256 if (cw->ec->first_mapped)
1258 ELOGF("LAUNCH", "SHOW real win", cw->ec);
1259 e_comp_object_signal_emit(cw->ec->frame, "e,action,launch_real,done", "e");
1262 e_comp_object_signal_emit(cw->ec->frame, "e,action,launch,done", "e");
1266 e_comp->animating--;
1267 cw->showing = cw->hiding = 0;
1269 if (e_comp->animating == 0)
1270 e_comp_visibility_calculation_set(EINA_TRUE);
1271 /* remove ref from animation start, account for possibility of deletion from unref */
1272 return !!e_object_unref(E_OBJECT(cw->ec));
1278 /* handle the end of a compositor animation */
1280 _e_comp_object_done_defer(void *data, Evas_Object *obj EINA_UNUSED, const char *emission, const char *source EINA_UNUSED)
1282 E_Comp_Object *cw = data;
1284 /* visible clients which have never been sized are a bug */
1285 if ((!cw->ec->new_client) && (!cw->ec->changes.size) && ((cw->w < 0) || (cw->h < 0)) && (!strcmp(emission, "e,action,show,done")))
1286 CRI("ACK! ec:%p", cw->ec);
1287 if (!_e_comp_object_animating_end(cw)) return;
1288 if (cw->animating) return;
1289 /* hide only after animation finishes to guarantee a full run of the animation */
1290 if (!cw->defer_hide) return;
1291 if ((!strcmp(emission, "e,action,hide,done")) ||
1292 (!strcmp(emission, "e,action,done")) ||
1293 ((cw->ec->iconic) && (!strcmp(emission, "e,action,show,done"))))
1295 ELOGF("COMP", "defer hide emission:%s", cw->ec, emission);
1296 evas_object_hide(cw->smart_obj);
1300 /* run a visibility compositor effect if available, return false if object is dead */
1302 _e_comp_object_effect_visibility_start(E_Comp_Object *cw, Eina_Bool state)
1308 if ((!cw->visibility_effect) || (!e_comp_object_effect_allowed_get(cw->smart_obj))) return EINA_TRUE;;
1309 if (!cw->effect_running)
1310 _e_comp_object_animating_begin(cw);
1311 if (!e_comp_object_effect_stop(cw->smart_obj, _e_comp_object_done_defer))
1312 return _e_comp_object_animating_end(cw);
1313 if (!e_comp_object_effect_set(cw->smart_obj, cw->visibility_effect))
1314 return _e_comp_object_animating_end(cw);
1316 evas_pointer_canvas_xy_get(e_comp->evas, &x, &y);
1319 zone = e_comp_zone_find_by_ec(cw->ec);
1321 zw = zone->w, zh = zone->h;
1326 zone = e_comp_object_util_zone_get(cw->smart_obj);
1327 if (!zone) zone = e_zone_current_get();
1334 e_comp_object_effect_params_set(cw->smart_obj, 1, (int[]){cw->x, cw->y,
1335 cw->w, cw->h, zw, zh, x, y}, 8);
1336 e_comp_object_effect_params_set(cw->smart_obj, 0, (int[]){state}, 1);
1337 e_comp_object_effect_start(cw->smart_obj, _e_comp_object_done_defer, cw);
1340 /////////////////////////////////////////////
1342 /* create necessary objects for clients that e manages */
1344 _e_comp_object_mouse_event_callback_set(E_Comp_Object *cw)
1346 if (cw->set_mouse_callbacks) return;
1347 if (!cw->smart_obj) return;
1349 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_IN, _e_comp_object_cb_mouse_in, cw);
1350 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_OUT, _e_comp_object_cb_mouse_out, cw);
1351 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_comp_object_cb_mouse_down, cw);
1352 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_cb_mouse_up, cw);
1353 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_comp_object_cb_mouse_move, cw);
1354 evas_object_event_callback_add(cw->smart_obj, EVAS_CALLBACK_MOUSE_WHEEL, _e_comp_object_cb_mouse_wheel, cw);
1356 cw->set_mouse_callbacks = EINA_TRUE;
1360 _e_comp_object_mouse_event_callback_unset(E_Comp_Object *cw)
1362 if (!cw->set_mouse_callbacks) return;
1363 if (!cw->smart_obj) return;
1365 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_IN, _e_comp_object_cb_mouse_in);
1366 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_OUT, _e_comp_object_cb_mouse_out);
1367 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_comp_object_cb_mouse_down);
1368 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_cb_mouse_up);
1369 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_comp_object_cb_mouse_move);
1370 evas_object_event_callback_del(cw->smart_obj, EVAS_CALLBACK_MOUSE_WHEEL, _e_comp_object_cb_mouse_wheel);
1372 cw->set_mouse_callbacks = EINA_FALSE;
1376 _e_comp_object_setup(E_Comp_Object *cw)
1378 cw->clip = evas_object_rectangle_add(e_comp->evas);
1379 evas_object_move(cw->clip, -9999, -9999);
1380 evas_object_resize(cw->clip, 999999, 999999);
1381 evas_object_smart_member_add(cw->clip, cw->smart_obj);
1382 cw->effect_obj = edje_object_add(e_comp->evas);
1383 evas_object_move(cw->effect_obj, cw->x, cw->y);
1384 evas_object_clip_set(cw->effect_obj, cw->clip);
1385 evas_object_smart_member_add(cw->effect_obj, cw->smart_obj);
1386 e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", "e/comp/effects/none");
1387 cw->shobj = edje_object_add(e_comp->evas);
1388 evas_object_data_set(cw->shobj, "comp_smart_obj", cw->smart_obj);
1389 edje_object_part_swallow(cw->effect_obj, "e.swallow.content", cw->shobj);
1390 edje_object_signal_callback_add(cw->shobj, "e,action,*,done", "e", _e_comp_object_done_defer, cw);
1392 /* name objects appropriately for nicer printing when using e_comp_util_wins_print() */
1393 if (cw->ec->override)
1395 evas_object_name_set(cw->shobj, "cw->shobj::WINDOW");
1396 evas_object_name_set(cw->effect_obj, "cw->effect_obj::WINDOW");
1397 evas_object_name_set(cw->clip, "cw->clip::WINDOW");
1399 else if (!cw->ec->input_only)
1401 evas_object_name_set(cw->shobj, "cw->shobj::CLIENT");
1402 evas_object_name_set(cw->effect_obj, "cw->effect_obj::CLIENT");
1403 evas_object_name_set(cw->clip, "cw->clip::CLIENT");
1405 cw->real_hid = !cw->ec->input_only;
1406 if (!cw->ec->input_only)
1408 e_util_size_debug_set(cw->effect_obj, 1);
1409 _e_comp_object_mouse_event_callback_set(cw);
1412 cw->default_input_obj = evas_object_rectangle_add(e_comp->evas);
1413 evas_object_name_set(cw->default_input_obj, "cw->default_input_obj");
1414 evas_object_move(cw->default_input_obj, cw->x, cw->y);
1415 evas_object_resize(cw->default_input_obj, cw->w, cw->h);
1416 evas_object_color_set(cw->default_input_obj, 0, 0, 0, 0);
1417 evas_object_smart_member_add(cw->default_input_obj, cw->smart_obj);
1419 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_OBJECT_SETUP, cw->ec);
1422 /////////////////////////////////////////////
1424 /* for fast path evas rendering; only called during render */
1426 _e_comp_object_pixels_get(void *data, Evas_Object *obj EINA_UNUSED)
1428 E_Comp_Object *cw = data;
1429 E_Client *ec = cw->ec;
1431 int bx, by, bxx, byy;
1433 if (e_object_is_del(E_OBJECT(ec))) return;
1434 if (cw->external_content) return;
1435 if (!e_pixmap_size_get(ec->pixmap, &pw, &ph)) return;
1436 e_pixmap_image_opaque_get(cw->ec->pixmap, &bx, &by, &bxx, &byy);
1439 bxx = pw - (bx + bxx), byy = ph - (by + byy);
1440 evas_object_image_border_set(cw->obj, bx, bxx, by, byy);
1442 else if (cw->client_inset.calc && (!cw->frame_object)) //CSD
1444 bx = -cw->client_inset.l + 4, by = -cw->client_inset.t + 4;
1445 bxx = -cw->client_inset.r, byy = -cw->client_inset.b;
1449 bx = by = bxx = byy = 0;
1450 evas_object_image_border_set(cw->obj, bx, bxx, by, byy);
1453 Edje_Message_Int_Set *msg;
1454 Edje_Message_Int msg2;
1455 Eina_Bool id = (bx || by || bxx || byy);
1457 msg = alloca(sizeof(Edje_Message_Int_Set) + (sizeof(int) * 3));
1463 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT_SET, 1, msg);
1465 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT, 0, &msg2);
1469 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
1470 e_comp_client_post_update_add(cw->ec);
1472 else if (e_comp_object_render(ec->frame))
1474 /* apply shape mask if necessary */
1475 if ((!cw->native) && (ec->shaped || ec->shape_changed))
1476 e_comp_object_shape_apply(ec->frame);
1477 ec->shape_changed = 0;
1479 /* shaped clients get precise mouse events to handle transparent pixels */
1480 evas_object_precise_is_inside_set(cw->obj, ec->shaped || ec->shaped_input);
1482 /* queue another render if client is still dirty; cannot refresh here. */
1483 if (e_pixmap_dirty_get(ec->pixmap) && e_pixmap_size_get(ec->pixmap, &pw, &ph))
1484 e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
1486 if (cw->render_trace)
1488 _e_comp_object_event_simple(ec->frame, E_EVENT_COMP_OBJECT_IMG_RENDER);
1494 _e_comp_object_pixels_noti(void *data, Evas_Object *obj EINA_UNUSED)
1496 E_Comp_Object *cw = data;
1497 E_Client *ec = cw->ec;
1499 if (e_object_is_del(E_OBJECT(ec))) return;
1500 if (cw->external_content) return;
1501 if (!e_comp->hwc) return;
1503 e_comp_client_render_list_add(cw->ec);
1505 if (!ec->hwc_window) return;
1507 e_hwc_windows_rendered_window_add(ec->hwc_window);
1510 /////////////////////////////////////////////
1513 _e_comp_object_client_pending_resize_add(E_Client *ec,
1516 unsigned int serial)
1518 E_Client_Pending_Resize *pnd;
1520 pnd = E_NEW(E_Client_Pending_Resize, 1);
1524 pnd->serial = serial;
1525 ec->pending_resize = eina_list_append(ec->pending_resize, pnd);
1529 _e_comp_intercept_move(void *data, Evas_Object *obj, int x, int y)
1531 E_Comp_Object *cw = data;
1534 if (cw->render_update_lock.lock)
1536 cw->render_update_lock.pending_move_x = x;
1537 cw->render_update_lock.pending_move_y = y;
1538 cw->render_update_lock.pending_move_set = EINA_TRUE;
1542 if ((e_pixmap_type_get(cw->ec->pixmap) != E_PIXMAP_TYPE_EXT_OBJECT) &&
1543 (e_pixmap_usable_get(cw->ec->pixmap)) &&
1544 (cw->external_content))
1546 /* delay to move until the external content is unset */
1547 cw->ec->changes.pos = 1;
1552 if (cw->ec->move_after_resize)
1554 if ((x != cw->ec->x) || (y != cw->ec->y))
1556 ELOGF("COMP", "Set Pos to (%d,%d). current ec_pos(%d,%d)", cw->ec, x, y, cw->ec->x, cw->ec->y);
1557 e_client_pos_set(cw->ec, x, y);
1558 cw->ec->changes.pos = 1;
1564 if ((cw->ec->resize_mode == E_POINTER_RESIZE_NONE) &&
1565 (cw->ec->manage_resize.resize_obj))
1567 e_client_pos_set(cw->ec, x, y);
1568 cw->ec->client.x = x + cw->client_inset.l;
1569 cw->ec->client.y = y + cw->client_inset.t;
1570 e_policy_visibility_client_defer_move(cw->ec);
1574 /* if frame_object does not exist, client_inset indicates CSD.
1575 * this means that ec->client matches cw->x/y, the opposite
1578 fx = (!cw->frame_object) * cw->client_inset.l;
1579 fy = (!cw->frame_object) * cw->client_inset.t;
1580 if ((cw->x == x + fx) && (cw->y == y + fy))
1582 if ((cw->ec->x != x) || (cw->ec->y != y))
1584 /* handle case where client tries to move to position and back very quickly */
1585 e_client_pos_set(cw->ec, x, y);
1586 cw->ec->client.x = x + cw->client_inset.l;
1587 cw->ec->client.y = y + cw->client_inset.t;
1591 if (!cw->ec->maximize_override)
1593 /* prevent moving in some directions while directionally maximized */
1594 if ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL)
1596 if ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_HORIZONTAL)
1599 ix = x + cw->client_inset.l;
1600 iy = y + cw->client_inset.t;
1601 if (cw->ec->maximized && (!cw->ec->maximize_override) && ((cw->ec->x != x) || (cw->ec->y != y)) &&
1602 ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) != E_MAXIMIZE_VERTICAL) &&
1603 ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) != E_MAXIMIZE_HORIZONTAL))
1605 /* prevent moving at all if move isn't allowed in current maximize state */
1606 if ((!e_config->allow_manip) && ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH)) return;
1607 /* queue unmaximize if we are allowing move and update unmaximize geometry */
1608 if ((!cw->ec->shading) && (!cw->ec->shaded))
1611 zone = e_comp_zone_find_by_ec(cw->ec);
1614 cw->ec->changes.need_unmaximize = 1;
1615 cw->ec->saved.x = ix - zone->x;
1616 cw->ec->saved.y = iy - zone->y;
1617 cw->ec->saved.w = cw->ec->client.w;
1618 cw->ec->saved.h = cw->ec->client.h;
1624 /* only update during resize if triggered by resize */
1625 if (e_client_util_resizing_get(cw->ec) && (!cw->force_move)) return;
1626 /* delay to move while surface waits paired commit serial*/
1627 if (e_client_pending_geometry_has(cw->ec))
1629 /* do nothing while waiting paired commit serial*/
1633 e_client_pos_set(cw->ec, x, y);
1634 if (cw->ec->new_client)
1636 /* don't actually do anything until first client idler loop */
1637 cw->ec->placed = ((!cw->ec->dialog) && (!cw->ec->parent));
1638 cw->ec->changes.pos = 1;
1643 /* only update xy position of client to avoid invalid
1644 * first damage region if it is not a new_client. */
1645 if (!cw->ec->shading)
1647 cw->ec->client.x = ix;
1648 cw->ec->client.y = iy;
1651 if (!cw->frame_object)
1653 evas_object_move(obj, x, y);
1655 #ifdef REFACTOR_FOCUS_POLICY
1656 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_MOVE, cw->ec);
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;
1668 if (cw->render_update_lock.lock)
1670 cw->render_update_lock.pending_resize_w = w;
1671 cw->render_update_lock.pending_resize_h = h;
1672 cw->render_update_lock.pending_resize_set = EINA_TRUE;
1676 if (!e_util_strcmp("input_panel_surface", cw->ec->icccm.window_role))
1678 e_client_size_set(cw->ec, w, h);
1679 evas_object_resize(obj, w, h);
1683 /* if frame_object does not exist, client_inset indicates CSD.
1684 * this means that ec->client matches cw->w/h, the opposite
1687 fw = (!cw->frame_object) * (-cw->client_inset.l - cw->client_inset.r);
1688 fh = (!cw->frame_object) * (-cw->client_inset.t - cw->client_inset.b);
1689 if ((cw->w == w + fw) && (cw->h == h + fh))
1691 if (cw->ec->shading || cw->ec->shaded) return;
1692 if (((cw->ec->w != w) || (cw->ec->h != h)) ||
1693 (cw->ec->client.w != w - cw->client_inset.l - cw->client_inset.r) ||
1694 (cw->ec->client.h != h - cw->client_inset.t - cw->client_inset.b))
1696 /* handle case where client tries to resize itself and back very quickly */
1697 e_client_size_set(cw->ec, w, h);
1698 cw->ec->client.w = w - cw->client_inset.l - cw->client_inset.r;
1699 cw->ec->client.h = h - cw->client_inset.t - cw->client_inset.b;
1700 evas_object_smart_callback_call(obj, "client_resize", NULL);
1704 /* guarantee that fullscreen is fullscreen */
1705 zone = e_comp_zone_find_by_ec(cw->ec);
1707 if (cw->ec->fullscreen && ((w != zone->w) || (h != zone->h)))
1709 /* calculate client size */
1710 iw = w - cw->client_inset.l - cw->client_inset.r;
1711 ih = h - cw->client_inset.t - cw->client_inset.b;
1712 if (cw->ec->maximized && (!cw->ec->maximize_override) && ((cw->ec->w != w) || (cw->ec->h != h)))
1714 /* prevent resizing while maximized depending on direction and config */
1715 if ((!e_config->allow_manip) && ((cw->ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH)) return;
1716 if ((!cw->ec->shading) && (!cw->ec->shaded))
1718 Eina_Bool reject = EINA_FALSE;
1719 if (cw->ec->maximized & E_MAXIMIZE_VERTICAL)
1721 if (cw->ec->client.h != ih)
1723 cw->ec->saved.h = ih;
1724 cw->ec->saved.y = cw->ec->client.y - zone->y;
1725 reject = cw->ec->changes.need_unmaximize = 1;
1728 if (cw->ec->maximized & E_MAXIMIZE_HORIZONTAL)
1730 if (cw->ec->client.w != iw)
1732 cw->ec->saved.w = iw;
1733 cw->ec->saved.x = cw->ec->client.x - zone->x;
1734 reject = cw->ec->changes.need_unmaximize = 1;
1744 if (cw->ec->new_client || (!cw->ec->visible) || (!cw->effect_obj))
1746 /* do nothing until client idler loops */
1747 if ((cw->ec->w != w) || (cw->ec->h != h))
1749 e_client_size_set(cw->ec, w, h);
1750 cw->ec->changes.size = 1;
1755 if ((!cw->ec->internal) && e_client_util_resizing_get(cw->ec) && cw->ec->netwm.sync.request &&
1756 ((cw->ec->w != w) || (cw->ec->h != h)))
1759 /* netwm sync resizes queue themselves and then trigger later on */
1760 _e_comp_object_client_pending_resize_add(cw->ec, iw, ih, cw->ec->netwm.sync.serial);
1762 if (e_client_pending_geometry_has(cw->ec))
1764 /* do nothing while waiting paired commit serial*/
1768 e_client_size_set(cw->ec, w, h);
1769 if ((!cw->ec->shading) && (!cw->ec->shaded))
1771 /* client geom never changes when shading since the client is never altered */
1772 cw->ec->client.w = iw;
1773 cw->ec->client.h = ih;
1774 if ((cw->ec->client.w < 0) || (cw->ec->client.h < 0)) CRI("WTF. ec:%p", cw->ec);
1777 /* The size of non-compositing window can be changed, so there is a
1778 * need to check that cw is H/W composited if cw is not redirected.
1779 * And of course we have to change size of evas object of H/W composited cw,
1780 * otherwise cw can't receive input events even if it is shown on the screen.
1782 Eina_Bool redirected = cw->redirected;
1784 redirected = e_comp_is_on_overlay(cw->ec);
1786 if ((!cw->ec->input_only) && (redirected) &&
1787 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE) &&
1788 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE) &&
1789 (e_pixmap_dirty_get(cw->ec->pixmap) ||
1790 (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph))))
1793 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE ||
1794 cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE)
1796 prev_w = cw->w, prev_h = cw->h;
1797 e_comp_object_frame_wh_adjust(obj, 0, 0, &fw, &fh);
1798 /* check shading and clamp to pixmap size for regular clients */
1799 if ((!cw->ec->shading) && (!cw->ec->shaded) && (!cw->ec->input_only) && (!cw->ec->override) &&
1800 (((w - fw != pw) || (h - fh != ph))))
1802 //INF("CALLBACK: REQ(%dx%d) != CUR(%dx%d)", w - fw, h - fh, pw, ph);
1803 evas_object_smart_callback_call(obj, "client_resize", NULL);
1805 if (cw->frame_object || cw->ec->input_only)
1806 e_comp_object_frame_wh_adjust(obj, pw, ph, &w, &h);
1809 if ((cw->w == w) && (cw->h == h))
1811 /* going to be a noop resize which won't trigger smart resize */
1812 RENDER_DEBUG("DAMAGE RESIZE(%p): %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
1813 if (cw->updates) eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
1815 evas_object_resize(obj, w, h);
1819 evas_object_smart_callback_call(obj, "client_resize", NULL);
1822 if ((!cw->frame_object) && (!cw->ec->input_only))
1824 /* "just do it" for overrides */
1825 evas_object_resize(obj, w, h);
1827 if (!cw->ec->override)
1829 /* shape probably changed for non-overrides */
1830 cw->ec->need_shape_merge |= cw->ec->shaped || cw->ec->shaped_input;
1831 cw->ec->need_shape_export |= cw->ec->shaped;
1832 if (cw->ec->shaped || cw->ec->shaped_input)
1836 /* this fixes positioning jiggles when using a resize mode
1837 * which also changes the client's position
1840 if (cw->frame_object)
1841 x = cw->x, y = cw->y;
1843 x = cw->ec->x, y = cw->ec->y;
1844 switch (cw->ec->resize_mode)
1846 case E_POINTER_RESIZE_BL:
1847 case E_POINTER_RESIZE_L:
1848 evas_object_move(obj, x + prev_w - cw->w, y);
1850 case E_POINTER_RESIZE_TL:
1851 evas_object_move(obj, x + prev_w - cw->w, y + prev_h - cw->h);
1853 case E_POINTER_RESIZE_T:
1854 case E_POINTER_RESIZE_TR:
1855 evas_object_move(obj, x, y + prev_h - cw->h);
1864 _e_comp_intercept_layer_set(void *data, Evas_Object *obj, int layer)
1866 E_Comp_Object *cw = data;
1867 E_Comp_Wl_Client_Data *child_cdata;
1868 unsigned int l = e_comp_canvas_layer_map(layer);
1871 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
1873 /* doing a compositor effect, follow directions */
1874 _e_comp_object_layer_set(obj, layer);
1875 if (layer == cw->ec->layer) //trying to put layer back
1879 /* if ec->layer and layer are the same but the client is not belong to the given(l)
1880 that means, layer is changed during layer_pending. in this case, need to update layer inlist*/
1881 if (cw->layer != l) goto layer_set;
1885 e_comp_render_queue();
1887 ec = e_client_above_get(cw->ec);
1888 /* skip subsurface: stacking subsurface is handled by e_comp_wl */
1889 while ((ec) && (e_comp_wl_subsurface_check(ec)))
1890 ec = e_client_above_get(ec);
1891 if (ec && (evas_object_layer_get(ec->frame) != evas_object_layer_get(obj)))
1893 ec = e_client_below_get(cw->ec);
1894 /* skip subsurface: stacking subsurface is handled by e_comp_wl */
1895 while ((ec) && (e_comp_wl_subsurface_check(ec)))
1896 ec = e_client_below_get(ec);
1897 if (ec && (evas_object_layer_get(ec->frame) == evas_object_layer_get(cw->smart_obj)))
1899 evas_object_stack_above(obj, ec->frame);
1904 if (ec && (cw->ec->parent == ec))
1906 if (e_client_transient_policy_get(cw->ec) == E_TRANSIENT_ABOVE)
1907 evas_object_stack_above(obj, ec->frame);
1909 evas_object_stack_below(obj, ec->frame);
1912 evas_object_stack_below(obj, ec ? ec->frame : e_comp->layers[cw->layer].obj);
1918 if (cw->layer == l) return;
1919 if (e_comp_canvas_client_layer_map(layer) == 9999)
1920 return; //invalid layer for clients not doing comp effects
1921 if (cw->ec->fullscreen)
1923 cw->ec->saved.layer = layer;
1926 oldraise = e_config->transient.raise;
1928 /* clamp to valid client layer */
1929 layer = e_comp_canvas_client_layer_map_nearest(layer);
1930 cw->ec->layer = layer;
1931 if (e_config->transient.layer)
1934 Eina_List *list = eina_list_clone(cw->ec->transients);
1936 /* We need to set raise to one, else the child wont
1937 * follow to the new layer. It should be like this,
1938 * even if the user usually doesn't want to raise
1941 e_config->transient.raise = 1;
1942 EINA_LIST_FREE(list, child)
1944 child_cdata = e_client_cdata_get(child);
1945 if (child_cdata && !child_cdata->mapped)
1947 ELOGF("COMP", "LAYER_SET CHILD. BUT not mapped. skip. child(ec:%p, win:0x%08zx)", cw->ec, child, e_client_util_win_get(child));
1950 e_client_layer_set(child, layer);
1954 e_config->transient.raise = oldraise;
1956 _e_comp_object_layers_remove(cw);
1957 cw->layer = e_comp_canvas_layer_map(layer);
1958 _e_comp_object_layers_add(cw, NULL, NULL, 0);
1959 //if (cw->ec->new_client)
1960 //INF("CLIENT STACKED %p: %u", cw->ec, layer);
1961 _e_comp_object_layer_set(obj, layer);
1962 if (!e_comp->layers[cw->layer].obj) return; //this is a layer marker
1963 evas_object_stack_below(obj, e_comp->layers[cw->layer].obj);
1964 if (evas_object_below_get(obj) == e_comp->layers[cw->layer].obj)
1966 /* can't stack a client above its own layer marker */
1967 CRI("STACKING ERROR!!! ec:%p (cw->layer:%d, ec->layer:%d)", cw->ec, cw->layer, cw->ec->layer);
1969 if (!cw->visible) return;
1970 e_comp_render_queue();
1971 _e_comp_object_transform_obj_stack_update(obj);
1974 typedef void (*E_Comp_Object_Stack_Func)(Evas_Object *obj, Evas_Object *stack);
1977 _e_comp_object_raise(Evas_Object *obj)
1979 evas_object_raise(obj);
1981 if (evas_object_smart_smart_get(obj))
1983 E_Client *ec = e_comp_object_client_get(obj);
1985 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
1990 _e_comp_object_lower(Evas_Object *obj)
1992 evas_object_lower(obj);
1994 if (evas_object_smart_smart_get(obj))
1996 E_Client *ec = e_comp_object_client_get(obj);
1998 #ifdef REFACTOR_FOCUS_POLICY
2000 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2001 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_LOWER, ec);
2004 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2010 _e_comp_object_stack_above(Evas_Object *obj, Evas_Object *target)
2012 evas_object_stack_above(obj, target);
2014 if (evas_object_smart_smart_get(obj))
2016 E_Client *ec = e_comp_object_client_get(obj);
2018 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2023 _e_comp_object_stack_below(Evas_Object *obj, Evas_Object *target)
2025 evas_object_stack_below(obj, target);
2027 if (evas_object_smart_smart_get(obj))
2029 E_Client *ec = e_comp_object_client_get(obj);
2031 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec);
2036 _e_comp_object_layer_set(Evas_Object *obj, short layer)
2038 evas_object_layer_set(obj, layer);
2040 if (evas_object_smart_smart_get(obj))
2042 E_Client *ec = e_comp_object_client_get(obj);
2044 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_LAYER_SET, ec);
2049 _e_comp_object_is_pending(E_Client *ec)
2053 if (!ec) return EINA_FALSE;
2055 topmost = e_comp_wl_topmost_parent_get(ec);
2057 return (topmost) ? topmost->layer_pending : EINA_FALSE;
2061 _e_comp_intercept_stack_helper(E_Comp_Object *cw, Evas_Object *stack, E_Comp_Object_Stack_Func stack_cb)
2063 E_Comp_Object *cw2 = NULL;
2066 Evas_Object *o = stack;
2067 Eina_Bool raising = stack_cb == _e_comp_object_stack_above;
2069 /* We should consider topmost's layer_pending for subsurface */
2070 if ((cw->ec->layer_block) || _e_comp_object_is_pending(cw->ec))
2072 if (_e_comp_object_is_pending(cw->ec))
2073 e_comp_object_layer_update(cw->smart_obj,
2074 raising? stack : NULL,
2075 raising? NULL : stack);
2077 /* obey compositor effects! */
2078 if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
2079 evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
2080 stack_cb(cw->smart_obj, stack);
2081 if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
2082 evas_object_data_del(cw->smart_obj, "client_restack");
2086 cw2 = evas_object_data_get(o, "comp_obj");
2088 /* assume someone knew what they were doing during client init */
2089 if (cw->ec->new_client)
2090 layer = cw->ec->layer;
2091 else if ((cw2) && _e_comp_object_is_pending(cw2->ec))
2092 layer = cw2->ec->layer;
2094 layer = evas_object_layer_get(stack);
2095 ecstack = e_client_below_get(cw->ec);
2096 if (layer != e_comp_canvas_layer_map_to(cw->layer))
2098 /* some FOOL is trying to restack a layer marker */
2099 if (cw->smart_obj == e_comp->layers[cw->layer].obj) return;
2100 evas_object_layer_set(cw->smart_obj, layer);
2101 /* we got our layer wrangled, return now! */
2102 if (layer != e_comp_canvas_layer_map_to(cw->layer)) return;
2105 /* check if we're stacking below another client */
2108 /* check for non-client layer object */
2109 if (!e_util_strcmp(evas_object_name_get(o), "layer_obj"))
2111 /* find an existing client to use for layering
2112 * by walking up the object stack
2114 * this is guaranteed to be pretty quick since we'll either:
2115 * - run out of client layers
2116 * - find a stacking client
2118 o = evas_object_above_get(o);
2119 if ((!o) || (o == cw->smart_obj)) break;
2120 if (evas_object_layer_get(o) != layer)
2122 /* reached the top client layer somehow
2123 * use top client object
2125 o = e_comp->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR)].obj;
2128 /* top client layer window hasn't been stacked yet. this probably shouldn't happen?
2129 * return here since the top client layer window
2134 ec = e_client_top_get();
2139 if (o) cw2 = evas_object_data_get(o, "comp_obj");
2142 if (cw2 && cw->layer != cw2->layer)
2145 /* remove existing layers */
2146 _e_comp_object_layers_remove(cw);
2149 if (o == stack) //if stacking above, cw2 is above; else cw2 is below
2150 _e_comp_object_layers_add(cw, raising ? cw2 : NULL, raising ? NULL : cw2, 0);
2151 else if (o == cw->smart_obj) //prepend (lower) if not stacking above
2152 _e_comp_object_layers_add(cw, NULL, NULL, !raising);
2153 else //if no stacking objects found, either raise or lower
2154 _e_comp_object_layers_add(cw, raising ? NULL : cw2, raising ? cw2 : NULL, 0);
2157 _e_comp_object_layers_add(cw, NULL, NULL, 0);
2159 /* find new object for stacking if cw2 is on state of layer_pending */
2160 if ((cw2) && _e_comp_object_is_pending(cw2->ec))
2162 E_Client *new_stack = NULL, *current_ec = NULL;
2163 current_ec = cw2->ec;
2166 while ((new_stack = e_client_below_get(current_ec)))
2168 current_ec = new_stack;
2169 if (new_stack == cw->ec) continue;
2170 if (new_stack->layer != cw2->ec->layer) break;
2171 if (!_e_comp_object_is_pending(new_stack)) break;
2173 if ((new_stack) && (new_stack->layer == cw2->ec->layer))
2174 stack = new_stack->frame;
2177 /* stack it above layer object */
2179 below_layer = (cw2->layer <= 0)? 0 : cw2->layer - 1 ;
2180 stack = e_comp->layers[below_layer].obj;
2185 while ((new_stack = e_client_above_get(current_ec)))
2187 current_ec = new_stack;
2188 if (new_stack == cw->ec) continue;
2189 if (new_stack->layer != cw2->ec->layer) break;
2190 if (!_e_comp_object_is_pending(new_stack)) break;
2192 if ((new_stack) && (new_stack->layer == cw2->ec->layer))
2193 stack = new_stack->frame;
2195 stack = e_comp->layers[cw2->layer].obj;
2199 /* set restack if stacking has changed */
2200 if (cw->ec->new_client || (!ecstack) || (ecstack->frame != o))
2201 evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
2202 stack_cb(cw->smart_obj, stack);
2203 if (e_comp->layers[cw->layer].obj)
2204 if (evas_object_below_get(cw->smart_obj) == e_comp->layers[cw->layer].obj)
2206 CRI("STACKING ERROR!!! ec:%p (cw->layer:%d, ec->layer:%d)", cw->ec, cw->layer, cw->ec->layer);
2208 if (cw->ec->new_client || (!ecstack) || (ecstack->frame != o))
2209 evas_object_data_del(cw->smart_obj, "client_restack");
2210 if (!cw->visible) return;
2211 e_comp_render_queue();
2215 _e_comp_intercept_stack_above(void *data, Evas_Object *obj, Evas_Object *above)
2217 EINA_SAFETY_ON_TRUE_RETURN(obj == above);
2219 if (evas_object_below_get(obj) == above)
2221 e_comp_object_layer_update(obj, above, NULL);
2225 TRACE_DS_BEGIN(COMP:INTERCEPT STACK ABOVE);
2226 _e_comp_intercept_stack_helper(data, above, _e_comp_object_stack_above);
2227 _e_comp_object_transform_obj_stack_update(obj);
2228 _e_comp_object_transform_obj_stack_update(above);
2233 _e_comp_intercept_stack_below(void *data, Evas_Object *obj, Evas_Object *below)
2235 EINA_SAFETY_ON_TRUE_RETURN(obj == below);
2236 if (evas_object_above_get(obj) == below)
2238 e_comp_object_layer_update(obj, NULL, below);
2242 TRACE_DS_BEGIN(COMP:INTERCEPT STACK BELOW);
2243 _e_comp_intercept_stack_helper(data, below, _e_comp_object_stack_below);
2244 if (evas_object_smart_smart_get(obj))
2245 _e_comp_object_transform_obj_stack_update(obj);
2246 if (evas_object_smart_smart_get(below))
2247 _e_comp_object_transform_obj_stack_update(below);
2252 _e_comp_intercept_lower(void *data, Evas_Object *obj)
2254 E_Comp_Object *cw = data;
2257 TRACE_DS_BEGIN(COMP:INTERCEPT LOWER);
2259 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
2261 if (cw->ec->layer_pending)
2262 e_comp_object_layer_update(obj, NULL, obj);
2264 _e_comp_object_lower(obj);
2267 if (!EINA_INLIST_GET(cw->ec)->prev) goto end; //already lowest on layer
2268 o = evas_object_below_get(obj);
2269 _e_comp_object_layers_remove(cw);
2270 /* prepend to client list since this client should be the first item now */
2271 _e_comp_object_layers_add(cw, NULL, NULL, 1);
2272 if (evas_object_layer_get(o) != evas_object_layer_get(obj)) goto end; //already at bottom!
2273 if (obj == e_comp->layers[cw->layer].obj) goto end; //never lower a layer marker!
2274 evas_object_data_set(obj, "client_restack", (void*)1);
2275 _e_comp_object_lower(obj);
2276 evas_object_data_del(obj, "client_restack");
2277 if (!cw->visible) goto end;
2278 e_comp_render_queue();
2279 _e_comp_object_transform_obj_stack_update(obj);
2282 #ifdef REFACTOR_FOCUS_POLICY
2283 // This code executes E_COMP_OBJECT_HOOK_LOWER callback at e_focus_policy_history.c
2285 if (!cw->ec->post_lower)
2286 e_client_focus_stack_lower(cw->ec);
2292 _e_comp_intercept_raise(void *data, Evas_Object *obj)
2294 E_Comp_Object *cw = data;
2297 TRACE_DS_BEGIN(COMP:INTERCEPT RAISE);
2299 if ((cw->ec->layer_block) || (cw->ec->layer_pending))
2301 if (cw->ec->layer_pending)
2303 int obj_layer = evas_object_layer_get(obj);
2304 if (cw->ec->layer != obj_layer)
2305 e_comp_object_layer_update(obj, NULL, NULL);
2308 _e_comp_object_raise(obj);
2311 if (!EINA_INLIST_GET(cw->ec)->next) goto end;//already highest on layer
2312 o = evas_object_above_get(obj);
2314 E_Client *ecabove = e_client_above_get(cw->ec);
2315 if (ecabove && (ecabove->frame == e_comp->layers[cw->layer].obj) &&
2316 (ecabove->frame == o)) goto end; //highest below marker
2318 if (evas_object_layer_get(o) != evas_object_layer_get(obj)) goto end; //already at top!
2319 if (obj == e_comp->layers[cw->layer].obj) //never raise a non-layer marker!
2320 _e_comp_object_raise(obj);
2325 /* still stack below override below the layer marker */
2326 for (op = o = e_comp->layers[cw->layer].obj;
2327 o && o != e_comp->layers[cw->layer - 1].obj;
2328 op = o, o = evas_object_below_get(o))
2330 if (evas_object_smart_smart_get(o))
2334 ec = e_comp_object_client_get(o);
2335 if (ec && (!ec->override)) break;
2338 _e_comp_object_stack_below(obj, op);
2339 e_client_focus_defer_set(cw->ec);
2341 if (!cw->visible) goto end;
2342 e_comp_render_queue();
2343 _e_comp_object_transform_obj_stack_update(obj);
2350 _e_comp_intercept_hide(void *data, Evas_Object *obj)
2352 E_Comp_Object *cw = data;
2354 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
2355 if( !_e_comp_object_intercept_hook_call(E_COMP_OBJECT_INTERCEPT_HOOK_HIDE, cw->ec))
2357 ELOGF("COMP", "Hide. intercepted", cw->ec);
2362 if (cw->ec->launching == EINA_TRUE)
2364 ELOGF("COMP", "Hide. Cancel launching flag", cw->ec);
2365 cw->ec->launching = EINA_FALSE;
2370 /* hidden flag = just do it */
2371 ELOGF("COMP", "Hide hidden evas_object:%p", cw->ec, obj);
2372 evas_object_hide(obj);
2376 if (cw->ec->input_only)
2378 /* input_only = who cares */
2379 ELOGF("COMP", "Hide input_only evas_object:%p", cw->ec, obj);
2380 evas_object_hide(obj);
2383 /* already hidden or currently animating */
2384 if ((!cw->visible) || (cw->animating && cw->hiding && (!cw->ec->iconic)))
2386 ELOGF("COMP", "Hide. but already hidden or currently animating", cw->ec);
2390 /* don't try hiding during shutdown */
2391 cw->defer_hide |= stopping;
2392 if (!cw->defer_hide)
2394 if ((!cw->ec->iconic) && (!cw->ec->override))
2395 /* unset delete requested so the client doesn't break */
2396 cw->ec->delete_requested = 0;
2397 if ((!cw->animating) || (!cw->hiding) || cw->ec->iconic)
2399 ELOGF("COMP", "Hide. but after iconify or hide animation, cw->animating:%d, cw->hiding:%d, iconic:%d",
2400 cw->ec, cw->animating, cw->hiding, cw->ec->iconic);
2403 e_comp_object_signal_emit(obj, "e,action,iconify", "e");
2406 e_comp_object_signal_emit(obj, "e,state,hidden", "e");
2408 _e_comp_object_animating_begin(cw);
2409 if (!_e_comp_object_effect_visibility_start(cw, 0)) return;
2411 evas_object_smart_callback_call(obj, "hiding", cw->ec);
2412 cw->defer_hide = !!cw->animating;
2414 e_comp_object_effect_set(obj, NULL);
2417 if (cw->animating) return;
2418 /* if we have no animations running, go ahead and hide */
2420 ELOGF("COMP", "Hide normal object:%p", cw->ec, obj);
2421 evas_object_hide(obj);
2425 _e_comp_intercept_show_helper(E_Comp_Object *cw)
2427 E_Client *ec = cw->ec;
2430 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
2432 if (ec->show_pending.count > 0)
2434 ELOGF("COMP", "show_helper. Show PENDING!!! show_pending:%d", ec, ec->show_pending.count);
2435 ec->show_pending.running = EINA_TRUE;
2439 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
2440 if (!_e_comp_object_intercept_hook_call(E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER, ec))
2442 ELOGF("COMP", "show_helper. intercepted", cw->ec);
2447 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,
2448 cw->visible, cw->animating, cw->defer_hide, cw->content_type, cw->updates, cw->w, cw->h,
2449 ec->iconic, ec->exp_iconify.by_client, ec->exp_iconify.type, ec->input_only, ec->ignored, ec->new_client);
2452 e_comp_object_signal_emit(cw->smart_obj, "e,state,sticky", "e");
2455 if (ec->iconic && cw->animating)
2457 /* triggered during iconify animation */
2458 e_comp_object_signal_emit(cw->smart_obj, "e,action,uniconify", "e");
2461 ELOGF("COMP", "show_helper. return. already cw->visible", ec);
2464 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE ||
2465 cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE)
2467 evas_object_move(cw->smart_obj, ec->x, ec->y);
2468 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2469 e_comp_object_frame_theme_set(cw->smart_obj, E_COMP_OBJECT_FRAME_RESHADOW);
2471 if (e_comp->image_filter != E_COMP_IMAGE_FILTER_NONE)
2472 e_comp_object_image_filter_set(cw->smart_obj, e_comp->image_filter);
2475 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2476 evas_object_show(cw->smart_obj);
2479 e_client_focus_defer_set(ec);
2483 if ((!cw->updates) && (!ec->input_only) && (!ec->ignored))
2487 pw = ec->client.w, ph = ec->client.h;
2489 if (!e_pixmap_size_get(ec->pixmap, &pw, &ph))
2491 ec->changes.visible = !ec->hidden;
2494 ELOGF("COMP", "show_helper. return. no pixmap size", ec);
2498 cw->updates = eina_tiler_new(pw, ph);
2501 ec->changes.visible = !ec->hidden;
2504 ELOGF("COMP", "show_helper. return. no cw->updates", ec);
2509 eina_tiler_tile_size_set(cw->updates, 1, 1);
2512 /* ignore until client idler first run */
2513 ec->changes.visible = !ec->hidden;
2516 ELOGF("COMP", "show_helper. return. new_client", ec);
2523 evas_object_move(cw->smart_obj, ec->x, ec->y);
2524 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2525 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2526 evas_object_show(cw->smart_obj);
2529 if (ec->netwm.type == E_WINDOW_TYPE_DND && !e_comp_wl->drag_client)
2531 /* start_drag not received */
2532 ec->changes.visible = 1;
2535 ELOGF("COMP", "show_helper. return. start_drag not received yet", ec);
2538 /* re-set geometry */
2539 evas_object_move(cw->smart_obj, ec->x, ec->y);
2540 /* force resize in case it hasn't happened yet, or just to update size */
2541 evas_object_resize(cw->smart_obj, ec->w, ec->h);
2542 if ((cw->w < 1) || (cw->h < 1))
2544 /* if resize didn't go through, try again */
2545 ec->visible = ec->changes.visible = 1;
2547 ELOGF("COMP", "show_helper. return. cw_size(%d,%d)", ec, cw->w, cw->h);
2550 /* if pixmap not available, clear pixmap since we're going to fetch it again */
2551 if (!e_pixmap_size_get(ec->pixmap, &w, &h))
2552 e_pixmap_clear(ec->pixmap);
2554 if (cw->real_hid && w && h)
2557 /* force comp theming in case it didn't happen already */
2558 e_comp_object_frame_theme_set(cw->smart_obj, E_COMP_OBJECT_FRAME_RESHADOW);
2559 if (e_comp->image_filter != E_COMP_IMAGE_FILTER_NONE)
2560 e_comp_object_image_filter_set(cw->smart_obj, e_comp->image_filter);
2563 /* only do the show if show is allowed */
2566 if (ec->internal) //internal clients render when they feel like it
2567 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
2569 if (!e_client_is_iconified_by_client(ec)||
2570 e_policy_visibility_client_is_uniconic(ec))
2572 ELOGF("COMP", "show_helper. evas_object_show!!!", ec);
2573 evas_object_show(cw->smart_obj);
2575 /* if comp object is shown in idle enterer before(E_CLIENT_HOOK_EVAL_FETCH),
2576 it is rendered in idle callback without native surface and
2577 compositor shows an empty frame if other objects aren't shown
2578 because job callback of e_comp called at the next loop.
2579 it causes a visual defect when windows are switched.
2583 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
2584 e_comp_object_dirty(cw->smart_obj);
2585 e_comp_object_render(cw->smart_obj);
2587 #ifdef REFACTOR_FOCUS_POLICY
2588 // This code executes E_COMP_OBJECT_HOOK_SHOW callback at e_focus_policy_history.c
2591 e_policy_visibility_client_is_uniconic(ec))
2593 if (ec->exp_iconify.not_raise &&
2594 e_client_check_above_focused(ec))
2595 e_client_focus_stack_append_current_focused(ec);
2597 e_client_focus_defer_set(ec);
2603 #ifdef REFACTOR_FOCUS_POLICY
2604 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_SHOW, cw->ec);
2609 _e_comp_intercept_show(void *data, Evas_Object *obj EINA_UNUSED)
2611 E_Comp_Object *cw = data;
2612 E_Client *ec = cw->ec;
2614 E_Input_Rect_Data *input_rect_data;
2615 E_Input_Rect_Smart_Data *input_rect_sd;
2618 if (ec->ignored) return;
2622 //INF("SHOW2 %p", ec);
2623 _e_comp_intercept_show_helper(cw);
2626 //INF("SHOW %p", ec);
2629 cw->effect_obj = evas_object_rectangle_add(e_comp->evas);
2630 evas_object_color_set(cw->effect_obj, 0, 0, 0, 0);
2631 evas_object_smart_member_add(cw->effect_obj, cw->smart_obj);
2632 evas_object_name_set(cw->effect_obj, "cw->effect_obj::input_only");
2636 if ((!cw->obj) && (cw->external_content))
2638 ERR("cw->obj for external content is not created! ec:%p", cw->ec);
2642 _e_comp_object_setup(cw);
2645 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE;
2646 cw->obj = evas_object_image_filled_add(e_comp->evas);
2647 evas_object_image_border_center_fill_set(cw->obj, EVAS_BORDER_FILL_SOLID);
2648 e_util_size_debug_set(cw->obj, 1);
2649 evas_object_image_pixels_get_callback_set(cw->obj, _e_comp_object_pixels_get, cw);
2650 evas_object_image_pixels_noti_callback_set(cw->obj, _e_comp_object_pixels_noti, cw);
2651 evas_object_image_smooth_scale_set(cw->obj, e_comp_config_get()->smooth_windows);
2652 evas_object_name_set(cw->obj, "cw->obj");
2653 evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888);
2655 _e_comp_object_alpha_set(cw);
2658 evas_object_color_set(cw->clip, ec->netwm.opacity, ec->netwm.opacity, ec->netwm.opacity, ec->netwm.opacity);
2661 _e_comp_object_map_transform_rect(cw->ec, 0, 0, cw->w, cw->h, NULL, NULL, &tw, &th);
2662 evas_object_geometry_set(cw->effect_obj, cw->x, cw->y, tw, th);
2665 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
2668 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
2670 if (input_rect_data->obj)
2672 evas_object_geometry_set(input_rect_data->obj,
2673 cw->x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
2674 cw->y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
2675 input_rect_data->rect.w, input_rect_data->rect.h);
2682 evas_object_resize(cw->mask.obj, cw->w, cw->h);
2684 _e_comp_intercept_show_helper(cw);
2688 _e_comp_intercept_focus(void *data, Evas_Object *obj, Eina_Bool focus)
2690 E_Comp_Object *cw = data;
2694 /* note: this is here as it seems there are enough apps that do not even
2695 * expect us to emulate a look of focus but not actually set x input
2696 * focus as we do - so simply abort any focus set on such windows */
2697 /* be strict about accepting focus hint */
2698 /* be strict about accepting focus hint */
2699 if ((!ec->icccm.accepts_focus) &&
2700 (!ec->icccm.take_focus))
2704 if (e_client_focused_get() == ec)
2705 e_client_focused_set(NULL);
2707 ELOGF("FOCUS", "FOCUS UNSET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2708 evas_object_focus_set(obj, focus);
2712 if (focus && ec->lock_focus_out) return;
2713 if (e_object_is_del(E_OBJECT(ec)) && focus)
2714 CRI("CAN'T FOCUS DELETED CLIENT! ec:%p", ec);
2716 /* filter focus setting based on current state */
2721 ELOGF("FOCUS", "FOCUS SET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2722 evas_object_focus_set(obj, focus);
2725 if ((ec->iconic) && (!ec->deskshow))
2727 if (!e_policy_visibility_client_is_uniconify_render_running(ec))
2729 /* don't focus an iconified window. that's silly! */
2730 ELOGF("FOCUS", "Do uniconify to set focus", ec);
2731 e_client_uniconify(ec);
2732 e_client_focus_latest_set(ec);
2740 if ((!ec->sticky) && (ec->desk) && (!ec->desk->visible))
2742 if (ec->desk->animate_count) return;
2743 e_desk_show(ec->desk);
2744 if (!ec->desk->visible) return;
2752 /* not yet visible, wait till the next time... */
2753 ec->want_focus = !ec->hidden;
2758 e_client_focused_set(ec);
2762 if (e_client_focused_get() == ec)
2763 e_client_focused_set(NULL);
2767 ELOGF("FOCUS", "FOCUS SET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2769 ELOGF("FOCUS", "FOCUS UNSET | evas_object(%p) (frame:%p)", ec, obj, ec->frame);
2771 evas_object_focus_set(obj, focus);
2775 _e_comp_intercept_color_set(void *data, Evas_Object *obj, int r, int g, int b, int a)
2777 E_Comp_Object *cw = data;
2779 if (cw->transparent.set)
2781 cw->transparent.user_r = r;
2782 cw->transparent.user_g = g;
2783 cw->transparent.user_b = b;
2784 cw->transparent.user_a = a;
2786 ELOGF("COMP", "Transparent user_color(%d,%d,%d,%d)",
2788 cw->transparent.user_r,
2789 cw->transparent.user_g,
2790 cw->transparent.user_b,
2791 cw->transparent.user_a);
2795 evas_object_color_set(obj, r, g, b, a);
2798 ////////////////////////////////////////////////////
2801 _e_comp_object_frame_recalc(E_Comp_Object *cw)
2803 int w, h, ox, oy, ow, oh;
2805 Eina_Bool pass_event_flag = EINA_FALSE;
2806 E_Input_Rect_Data *input_rect_data;
2807 E_Input_Rect_Smart_Data *input_rect_sd;
2809 if (cw->frame_object)
2811 if (cw->obj) edje_object_part_unswallow(cw->frame_object, cw->obj);
2812 evas_object_geometry_get(cw->frame_object, NULL, NULL, &w, &h);
2813 /* set a fixed size, force edje calc, check size difference */
2814 evas_object_resize(cw->frame_object, MAX(w, 50), MAX(h, 50));
2815 edje_object_message_signal_process(cw->frame_object);
2816 edje_object_calc_force(cw->frame_object);
2817 edje_object_part_geometry_get(cw->frame_object, "e.swallow.client", &ox, &oy, &ow, &oh);
2818 cw->client_inset.l = ox;
2819 cw->client_inset.r = MAX(w, 50) - (ox + ow);
2820 cw->client_inset.t = oy;
2821 cw->client_inset.b = MAX(h, 50) - (oy + oh);
2822 if (cw->obj) edje_object_part_swallow(cw->frame_object, "e.swallow.client", cw->obj);
2823 evas_object_resize(cw->frame_object, w, h);
2827 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
2830 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
2832 if (input_rect_data->obj)
2834 pass_event_flag = EINA_TRUE;
2840 evas_object_pass_events_set(cw->default_input_obj, pass_event_flag);
2841 evas_object_pass_events_set(cw->obj, pass_event_flag);
2845 cw->client_inset.l = 0;
2846 cw->client_inset.r = 0;
2847 cw->client_inset.t = 0;
2848 cw->client_inset.b = 0;
2850 cw->client_inset.calc = !!cw->frame_object;
2854 _e_comp_smart_cb_frame_recalc(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2856 E_Comp_Object *cw = data;
2860 /* - get current size
2862 * - readjust for new frame size
2865 w = cw->ec->w, h = cw->ec->h;
2866 e_comp_object_frame_wh_unadjust(obj, w, h, &pw, &ph);
2868 _e_comp_object_frame_recalc(cw);
2870 if (!cw->ec->fullscreen)
2871 e_comp_object_frame_wh_adjust(obj, cw->ec->client.w, cw->ec->client.h, &w, &h);
2873 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2874 if (cw->ec->shading || cw->ec->shaded) return;
2875 if (cw->ec->fullscreen)
2877 zone = e_comp_zone_find_by_ec(cw->ec);
2879 evas_object_resize(cw->ec->frame, zone->w, zone->h);
2881 else if (cw->ec->new_client)
2883 if ((cw->ec->w < 1) || (cw->ec->h < 1)) return;
2884 e_comp_object_frame_wh_adjust(obj, pw, ph, &w, &h);
2885 evas_object_resize(cw->ec->frame, w, h);
2887 else if ((w != cw->ec->w) || (h != cw->ec->h))
2888 evas_object_resize(cw->ec->frame, w, h);
2892 _e_comp_smart_cb_shading(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2894 E_Comp_Object *cw = data;
2896 if (!cw->ec) return; //NYI
2897 E_FREE_FUNC(cw->shade.anim, ecore_timer_del);
2899 cw->shade.x = cw->x;
2900 cw->shade.y = cw->y;
2901 e_comp_object_signal_emit(cw->smart_obj, "e,state,shading", "e");
2905 _e_comp_smart_cb_shaded(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2907 E_Comp_Object *cw = data;
2909 if (!cw->ec) return; //NYI
2910 E_FREE_FUNC(cw->shade.anim, ecore_timer_del);
2912 e_comp_object_signal_emit(cw->smart_obj, "e,state,shaded", "e");
2916 _e_comp_smart_cb_unshading(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2918 E_Comp_Object *cw = data;
2920 if (!cw->ec) return; //NYI
2921 E_FREE_FUNC(cw->shade.anim, ecore_timer_del);
2923 e_comp_object_signal_emit(cw->smart_obj, "e,state,unshading", "e");
2927 _e_comp_smart_cb_unshaded(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
2929 E_Comp_Object *cw = data;
2931 if (!cw->ec) return; //NYI
2932 E_FREE_FUNC(cw->shade.anim, ecore_timer_del);
2934 e_comp_object_signal_emit(cw->smart_obj, "e,state,unshaded", "e");
2938 _e_comp_smart_cb_maximize(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2940 E_Comp_Object *cw = data;
2942 _e_comp_object_shadow_setup(cw);
2943 if (cw->frame_object)
2945 _e_comp_object_shadow(cw);
2946 e_comp_object_signal_emit(cw->smart_obj, "e,action,maximize", "e");
2947 _e_comp_object_frame_recalc(cw);
2948 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2953 _e_comp_smart_cb_fullscreen(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
2955 E_Comp_Object *cw = data;
2957 if (_e_comp_object_shadow_setup(cw))
2958 e_comp_object_damage(cw->smart_obj, 0, 0, cw->ec->w, cw->ec->h);
2959 if (cw->frame_object)
2961 _e_comp_object_shadow(cw);
2962 e_comp_object_signal_emit(cw->smart_obj, "e,action,maximize,fullscreen", "e");
2963 _e_comp_object_frame_recalc(cw);
2964 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2969 _e_comp_smart_cb_unmaximize(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2971 E_Comp_Object *cw = data;
2973 if (cw->frame_object)
2975 _e_comp_object_shadow(cw);
2976 e_comp_object_signal_emit(obj, "e,action,unmaximize", "e");
2977 _e_comp_object_frame_recalc(cw);
2978 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
2983 _e_comp_smart_cb_unfullscreen(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
2985 E_Comp_Object *cw = data;
2987 if (_e_comp_object_shadow_setup(cw))
2990 cw->ec->changes.size = 1;
2992 if (cw->frame_object)
2994 _e_comp_object_shadow(cw);
2995 e_comp_object_signal_emit(obj, "e,action,unmaximize,unfullscreen", "e");
2996 _e_comp_object_frame_recalc(cw);
2997 evas_object_smart_callback_call(cw->smart_obj, "frame_recalc_done", &cw->client_inset);
3002 _e_comp_smart_cb_sticky(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3004 e_comp_object_signal_emit(obj, "e,state,sticky", "e");
3008 _e_comp_smart_cb_unsticky(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3010 e_comp_object_signal_emit(obj, "e,state,unsticky", "e");
3014 _e_comp_smart_cb_unhung(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3016 E_Comp_Object *cw = data;
3018 if (!cw->ec) return; //NYI
3019 e_comp_object_signal_emit(cw->smart_obj, "e,state,unhung", "e");
3023 _e_comp_smart_cb_hung(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
3025 E_Comp_Object *cw = data;
3027 if (!cw->ec) return; //NYI
3028 e_comp_object_signal_emit(cw->smart_obj, "e,state,hung", "e");
3032 _e_comp_smart_focus_in(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3034 e_comp_object_signal_emit(obj, "e,state,focused", "e");
3038 _e_comp_smart_focus_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3040 E_Comp_Object *cw = data;
3042 if (!e_object_is_del(E_OBJECT(cw->ec)))
3043 e_comp_object_signal_emit(obj, "e,state,unfocused", "e");
3047 _e_comp_input_obj_smart_add(Evas_Object *obj)
3049 E_Input_Rect_Smart_Data *input_rect_sd;
3050 input_rect_sd = E_NEW(E_Input_Rect_Smart_Data, 1);
3052 if (!input_rect_sd) return;
3053 evas_object_smart_data_set(obj, input_rect_sd);
3057 _e_comp_input_obj_smart_del(Evas_Object *obj)
3059 E_Input_Rect_Smart_Data *input_rect_sd;
3060 E_Input_Rect_Data *input_rect_data;
3062 input_rect_sd = evas_object_smart_data_get(obj);
3063 if (!input_rect_sd) return;
3065 EINA_LIST_FREE(input_rect_sd->input_rect_data_list, input_rect_data)
3067 if (input_rect_data->obj)
3069 evas_object_smart_member_del(input_rect_data->obj);
3070 E_FREE_FUNC(input_rect_data->obj, evas_object_del);
3072 E_FREE(input_rect_data);
3074 E_FREE(input_rect_sd);
3078 _e_comp_input_obj_smart_move(Evas_Object *obj, int x, int y)
3080 E_Input_Rect_Smart_Data *input_rect_sd;
3081 E_Input_Rect_Data *input_rect_data;
3085 input_rect_sd = evas_object_smart_data_get(obj);
3086 if (!input_rect_sd) return;
3088 cw = input_rect_sd->cw;
3089 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3091 if (input_rect_data->obj)
3093 evas_object_geometry_set(input_rect_data->obj,
3094 x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
3095 y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
3096 input_rect_data->rect.w, input_rect_data->rect.h);
3102 _e_comp_input_obj_smart_resize(Evas_Object *obj, int w, int h)
3104 E_Input_Rect_Smart_Data *input_rect_sd;
3105 E_Input_Rect_Data *input_rect_data;
3109 input_rect_sd = evas_object_smart_data_get(obj);
3110 if (!input_rect_sd) return;
3112 cw = input_rect_sd->cw;
3113 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3115 if (input_rect_data->obj)
3117 evas_object_geometry_set(input_rect_data->obj,
3118 cw->x + input_rect_data->rect.x + (!!cw->frame_object * cw->client_inset.l),
3119 cw->y + input_rect_data->rect.y + (!!cw->frame_object * cw->client_inset.t),
3120 input_rect_data->rect.w, input_rect_data->rect.h);
3126 _e_comp_input_obj_smart_show(Evas_Object *obj)
3128 E_Input_Rect_Smart_Data *input_rect_sd;
3129 E_Input_Rect_Data *input_rect_data;
3132 input_rect_sd = evas_object_smart_data_get(obj);
3133 if (!input_rect_sd) return;
3135 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3137 if (input_rect_data->obj)
3139 evas_object_show(input_rect_data->obj);
3145 _e_comp_input_obj_smart_hide(Evas_Object *obj)
3147 E_Input_Rect_Smart_Data *input_rect_sd;
3148 E_Input_Rect_Data *input_rect_data;
3151 input_rect_sd = evas_object_smart_data_get(obj);
3152 if (!input_rect_sd) return;
3154 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
3156 if (input_rect_data->obj)
3158 evas_object_hide(input_rect_data->obj);
3164 _e_comp_input_obj_smart_init(void)
3166 if (_e_comp_input_obj_smart) return;
3168 static const Evas_Smart_Class sc =
3170 INPUT_OBJ_SMART_NAME,
3171 EVAS_SMART_CLASS_VERSION,
3172 _e_comp_input_obj_smart_add,
3173 _e_comp_input_obj_smart_del,
3174 _e_comp_input_obj_smart_move,
3175 _e_comp_input_obj_smart_resize,
3176 _e_comp_input_obj_smart_show,
3177 _e_comp_input_obj_smart_hide,
3190 _e_comp_input_obj_smart = evas_smart_class_new(&sc);
3196 _e_comp_smart_add(Evas_Object *obj)
3200 cw = E_NEW(E_Comp_Object, 1);
3201 EINA_SAFETY_ON_NULL_RETURN(cw);
3203 cw->smart_obj = obj;
3204 cw->x = cw->y = cw->w = cw->h = -1;
3205 evas_object_smart_data_set(obj, cw);
3206 cw->opacity = 255.0;
3207 cw->external_content = 0;
3208 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_NONE;
3209 cw->transform_bg_color.r = 0;
3210 cw->transform_bg_color.g = 0;
3211 cw->transform_bg_color.b = 0;
3212 cw->transform_bg_color.a = 255;
3213 evas_object_data_set(obj, "comp_obj", cw);
3214 evas_object_move(obj, -1, -1);
3215 /* intercept ALL the callbacks! */
3216 evas_object_intercept_stack_above_callback_add(obj, _e_comp_intercept_stack_above, cw);
3217 evas_object_intercept_stack_below_callback_add(obj, _e_comp_intercept_stack_below, cw);
3218 evas_object_intercept_raise_callback_add(obj, _e_comp_intercept_raise, cw);
3219 evas_object_intercept_lower_callback_add(obj, _e_comp_intercept_lower, cw);
3220 evas_object_intercept_layer_set_callback_add(obj, _e_comp_intercept_layer_set, cw);
3221 evas_object_intercept_move_callback_add(obj, _e_comp_intercept_move, cw);
3222 evas_object_intercept_resize_callback_add(obj, _e_comp_intercept_resize, cw);
3223 evas_object_intercept_show_callback_add(obj, _e_comp_intercept_show, cw);
3224 evas_object_intercept_hide_callback_add(obj, _e_comp_intercept_hide, cw);
3225 evas_object_intercept_focus_set_callback_add(obj, _e_comp_intercept_focus, cw);
3226 evas_object_intercept_color_set_callback_add(obj, _e_comp_intercept_color_set, cw);
3228 evas_object_smart_callback_add(obj, "shading", _e_comp_smart_cb_shading, cw);
3229 evas_object_smart_callback_add(obj, "shaded", _e_comp_smart_cb_shaded, cw);
3230 evas_object_smart_callback_add(obj, "unshading", _e_comp_smart_cb_unshading, cw);
3231 evas_object_smart_callback_add(obj, "unshaded", _e_comp_smart_cb_unshaded, cw);
3233 evas_object_smart_callback_add(obj, "maximize", _e_comp_smart_cb_maximize, cw);
3234 evas_object_smart_callback_add(obj, "fullscreen", _e_comp_smart_cb_fullscreen, cw);
3235 evas_object_smart_callback_add(obj, "unmaximize", _e_comp_smart_cb_unmaximize, cw);
3236 evas_object_smart_callback_add(obj, "unfullscreen", _e_comp_smart_cb_unfullscreen, cw);
3238 evas_object_smart_callback_add(obj, "stick", _e_comp_smart_cb_sticky, cw);
3239 evas_object_smart_callback_add(obj, "unstick", _e_comp_smart_cb_unsticky, cw);
3241 evas_object_smart_callback_add(obj, "hung", _e_comp_smart_cb_hung, cw);
3242 evas_object_smart_callback_add(obj, "unhung", _e_comp_smart_cb_unhung, cw);
3244 evas_object_smart_callback_add(obj, "frame_recalc", _e_comp_smart_cb_frame_recalc, cw);
3246 evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_IN, _e_comp_smart_focus_in, cw);
3247 evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_OUT, _e_comp_smart_focus_out, cw);
3251 _e_comp_smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
3254 evas_object_color_set(cw->clip, r, g, b, a);
3255 evas_object_smart_callback_call(obj, "color_set", NULL);
3260 _e_comp_smart_clip_set(Evas_Object *obj, Evas_Object *clip)
3263 evas_object_clip_set(cw->clip, clip);
3267 _e_comp_smart_clip_unset(Evas_Object *obj)
3270 evas_object_clip_unset(cw->clip);
3274 _e_comp_smart_hide(Evas_Object *obj)
3276 TRACE_DS_BEGIN(COMP:SMART HIDE);
3281 evas_object_hide(cw->clip);
3282 if (cw->input_obj) evas_object_hide(cw->input_obj);
3283 evas_object_hide(cw->effect_obj);
3284 if (cw->default_input_obj) evas_object_hide(cw->default_input_obj);
3285 if (cw->transform_bg_obj) evas_object_hide(cw->transform_bg_obj);
3286 if (cw->transform_tranp_obj) evas_object_hide(cw->transform_tranp_obj);
3293 /* unset native surface if current displaying buffer was destroied */
3294 if (!cw->buffer_destroy_listener.notify)
3296 Evas_Native_Surface *ns;
3297 ns = evas_object_image_native_surface_get(cw->obj);
3298 if ((ns) && (ns->type == EVAS_NATIVE_SURFACE_WL) && (ns->data.wl.legacy_buffer))
3299 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
3302 if (!cw->ec->input_only)
3304 edje_object_freeze(cw->effect_obj);
3305 edje_object_freeze(cw->shobj);
3306 edje_object_play_set(cw->shobj, 0);
3307 if (cw->frame_object)
3308 edje_object_play_set(cw->frame_object, 0);
3310 /* ensure focus-out */
3311 if (cw->ec->focused &&
3312 (e_config->focus_policy_ext != E_FOCUS_EXT_TOP_STACK))
3314 ELOGF("FOCUS", "focus unset | smart_hide", cw->ec);
3315 e_client_frame_focus_set(cw->ec, EINA_FALSE);
3316 e_client_focus_defer_unset(cw->ec);
3318 e_comp_render_queue(); //force nocomp recheck
3324 _e_comp_smart_show(Evas_Object *obj)
3332 if ((cw->w < 0) || (cw->h < 0))
3333 CRI("ACK! ec:%p", cw->ec);
3335 TRACE_DS_BEGIN(COMP:SMART SHOW);
3337 e_comp_object_map_update(obj);
3339 EINA_LIST_FOREACH(cw->ec->e.state.video_child, l, tmp)
3340 evas_object_show(tmp->frame);
3342 evas_object_show(cw->clip);
3343 if (cw->input_obj) evas_object_show(cw->input_obj);
3344 if (!cw->ec->input_only)
3346 edje_object_thaw(cw->effect_obj);
3347 edje_object_thaw(cw->shobj);
3348 edje_object_play_set(cw->shobj, 1);
3349 if (cw->frame_object)
3350 edje_object_play_set(cw->frame_object, 1);
3352 evas_object_show(cw->effect_obj);
3353 if (cw->mask.obj) evas_object_show(cw->mask.obj);
3354 if (cw->transform_bg_obj) evas_object_show(cw->transform_bg_obj);
3355 if (cw->transform_tranp_obj) evas_object_show(cw->transform_tranp_obj);
3356 if (cw->default_input_obj) evas_object_show(cw->default_input_obj);
3357 e_comp_render_queue();
3358 if (cw->ec->input_only)
3363 if (cw->ec->iconic && (!cw->ec->new_client))
3365 if (e_client_is_iconified_by_client(cw->ec))
3367 ELOGF("COMP", "Set launching flag..", cw->ec);
3368 cw->ec->launching = EINA_TRUE;
3371 e_comp_object_signal_emit(cw->smart_obj, "e,action,uniconify", "e");
3373 else if (!cw->showing) /* if set, client was ec->hidden during show animation */
3376 ELOGF("COMP", "Set launching flag..", cw->ec);
3377 cw->ec->launching = EINA_TRUE;
3379 e_comp_object_signal_emit(cw->smart_obj, "e,state,visible", "e");
3380 _e_comp_object_animating_begin(cw);
3381 if (!_e_comp_object_effect_visibility_start(cw, 1))
3387 /* ensure some random effect doesn't lock the client offscreen */
3391 e_comp_object_effect_set(obj, NULL);
3394 _e_comp_object_dim_update(cw);
3400 _e_comp_smart_del(Evas_Object *obj)
3406 if (cw->buffer_destroy_listener.notify)
3408 wl_list_remove(&cw->buffer_destroy_listener.link);
3409 cw->buffer_destroy_listener.notify = NULL;
3412 if (cw->tbm_surface)
3414 tbm_surface_internal_unref(cw->tbm_surface);
3415 cw->tbm_surface = NULL;
3418 if (cw->render_update_lock.buffer_ref.buffer)
3420 ELOGF("COMP", "Clear buffer_ref of render_update_lock:%d",
3421 cw->ec, cw->render_update_lock.lock);
3422 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, NULL);
3425 e_comp_object_render_update_del(cw->smart_obj);
3426 E_FREE_FUNC(cw->updates, eina_tiler_free);
3427 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
3434 EINA_LIST_FREE(cw->obj_mirror, o)
3436 evas_object_image_data_set(o, NULL);
3437 evas_object_freeze_events_set(o, 1);
3438 evas_object_event_callback_del_full(o, EVAS_CALLBACK_DEL, _e_comp_object_cb_mirror_del, cw);
3442 _e_comp_object_layers_remove(cw);
3443 l = evas_object_data_get(obj, "comp_object-to_del");
3444 E_FREE_LIST(l, evas_object_del);
3445 _e_comp_object_mouse_event_callback_unset(cw);
3446 evas_object_del(cw->clip);
3447 evas_object_del(cw->effect_obj);
3448 evas_object_del(cw->shobj);
3449 evas_object_del(cw->frame_object);
3450 evas_object_del(cw->input_obj);
3451 evas_object_del(cw->obj);
3452 evas_object_del(cw->mask.obj);
3453 if (cw->dim.mask_obj) evas_object_del(cw->dim.mask_obj);
3454 evas_object_del(cw->transform_bg_obj);
3455 evas_object_del(cw->transform_tranp_obj);
3456 evas_object_del(cw->default_input_obj);
3457 eina_stringshare_del(cw->frame_theme);
3458 eina_stringshare_del(cw->frame_name);
3462 e_comp->animating--;
3464 e_object_unref(E_OBJECT(cw->ec));
3466 cw->ec->frame = NULL;
3471 _e_comp_smart_move(Evas_Object *obj, int x, int y)
3475 cw->x = x, cw->y = y;
3476 evas_object_move(cw->effect_obj, x, y);
3477 evas_object_move(cw->default_input_obj, x, y);
3478 if (cw->input_obj) evas_object_move(cw->input_obj, x, y);
3480 e_comp_object_map_update(obj);
3484 _e_comp_smart_resize(Evas_Object *obj, int w, int h)
3486 Eina_Bool first = EINA_FALSE;
3491 if (!cw->effect_obj) CRI("ACK! ec:%p", cw->ec);
3493 TRACE_DS_BEGIN(COMP:SMART RESIZE);
3495 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
3497 if (cw->w != w || cw->h != h)
3498 e_comp_object_map_update(obj);
3500 first = ((cw->w < 1) || (cw->h < 1));
3501 cw->w = w, cw->h = h;
3502 if ((!cw->ec->shading) && (!cw->ec->shaded))
3506 if (cw->frame_object)
3507 e_comp_object_frame_wh_unadjust(obj, w, h, &ww, &hh);
3510 /* verify pixmap:object size */
3511 if (e_pixmap_size_get(cw->ec->pixmap, &pw, &ph) && (!cw->ec->override))
3513 if ((ww != pw) || (hh != ph))
3514 ELOGF("COMP", "CW RSZ: %dx%d || PX: %dx%d.", cw->ec, ww, hh, pw, ph);
3516 evas_object_resize(cw->effect_obj, tw, th);
3517 evas_object_resize(cw->default_input_obj, w, h);
3519 evas_object_resize(cw->input_obj, w, h);
3521 evas_object_resize(cw->mask.obj, w, h);
3522 /* resize render update tiler */
3525 RENDER_DEBUG("DAMAGE UNFULL: %p", cw->ec);
3526 cw->updates_full = 0;
3527 if (cw->updates) eina_tiler_clear(cw->updates);
3531 RENDER_DEBUG("DAMAGE RESIZE(%p): %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
3532 if (cw->updates) eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
3537 evas_object_resize(cw->effect_obj, tw, th);
3538 evas_object_resize(cw->default_input_obj, w, h);
3545 e_comp_render_queue();
3551 _e_comp_smart_init(void)
3553 if (_e_comp_smart) return;
3555 static const Evas_Smart_Class sc =
3558 EVAS_SMART_CLASS_VERSION,
3562 _e_comp_smart_resize,
3565 _e_comp_smart_color_set,
3566 _e_comp_smart_clip_set,
3567 _e_comp_smart_clip_unset,
3577 _e_comp_smart = evas_smart_class_new(&sc);
3582 e_comp_object_init(void)
3584 E_EVENT_COMP_OBJECT_ADD = ecore_event_type_new();
3585 E_EVENT_COMP_OBJECT_IMG_RENDER = ecore_event_type_new();
3586 E_EVENT_COMP_OBJECT_EFFECT_START = ecore_event_type_new();
3587 E_EVENT_COMP_OBJECT_EFFECT_END = ecore_event_type_new();
3591 e_comp_object_shutdown(void)
3597 e_comp_object_mirror_visibility_check(Evas_Object *obj)
3599 API_ENTRY EINA_FALSE;
3600 return !!cw->force_visible;
3602 /////////////////////////////////////////////////////////
3605 _e_comp_object_util_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3608 Eina_Bool comp_object;
3610 comp_object = !!evas_object_data_get(obj, "comp_object");
3615 o = edje_object_part_swallow_get(obj, "e.swallow.content");
3617 e_comp_render_queue();
3619 l = evas_object_data_get(obj, "comp_object-to_del");
3620 E_FREE_LIST(l, evas_object_del);
3624 _e_comp_object_util_restack(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3626 if (e_comp_util_object_is_above_nocomp(obj) &&
3627 (!evas_object_data_get(obj, "comp_override")))
3629 evas_object_data_set(obj, "comp_override", (void*)1);
3630 e_comp_override_add();
3635 _e_comp_object_util_show(void *data EINA_UNUSED, Evas_Object *obj)
3637 Eina_Bool ref = EINA_TRUE;
3638 if (evas_object_visible_get(obj))
3642 d = evas_object_data_del(obj, "comp_hiding");
3644 /* currently trying to hide */
3647 /* already visible */
3651 evas_object_show(obj);
3654 evas_object_ref(obj);
3655 evas_object_data_set(obj, "comp_ref", (void*)1);
3657 edje_object_signal_emit(obj, "e,state,visible", "e");
3658 evas_object_data_set(obj, "comp_showing", (void*)1);
3659 if (e_comp_util_object_is_above_nocomp(obj))
3661 evas_object_data_set(obj, "comp_override", (void*)1);
3662 e_comp_override_add();
3667 _e_comp_object_util_hide(void *data EINA_UNUSED, Evas_Object *obj)
3669 if (!evas_object_visible_get(obj)) return;
3670 /* already hiding */
3671 if (evas_object_data_get(obj, "comp_hiding")) return;
3672 if (!evas_object_data_del(obj, "comp_showing"))
3674 evas_object_ref(obj);
3675 evas_object_data_set(obj, "comp_ref", (void*)1);
3677 edje_object_signal_emit(obj, "e,state,hidden", "e");
3678 evas_object_data_set(obj, "comp_hiding", (void*)1);
3680 if (evas_object_data_del(obj, "comp_override"))
3681 e_comp_override_timed_pop();
3685 _e_comp_object_util_done_defer(void *data, Evas_Object *obj, const char *emission, const char *source EINA_UNUSED)
3687 if (!e_util_strcmp(emission, "e,action,hide,done"))
3689 if (!evas_object_data_del(obj, "comp_hiding")) return;
3690 evas_object_intercept_hide_callback_del(obj, _e_comp_object_util_hide);
3691 evas_object_hide(obj);
3692 evas_object_intercept_hide_callback_add(obj, _e_comp_object_util_hide, data);
3695 evas_object_data_del(obj, "comp_showing");
3696 if (evas_object_data_del(obj, "comp_ref"))
3697 evas_object_unref(obj);
3701 _e_comp_object_util_moveresize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
3707 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
3711 E_API E_Comp_Object_Hook *
3712 e_comp_object_hook_add(E_Comp_Object_Hook_Point hookpoint, E_Comp_Object_Hook_Cb func, const void *data)
3714 E_Comp_Object_Hook *ch;
3716 EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_COMP_OBJECT_HOOK_LAST, NULL);
3717 ch = E_NEW(E_Comp_Object_Hook, 1);
3718 if (!ch) return NULL;
3719 ch->hookpoint = hookpoint;
3721 ch->data = (void*)data;
3722 _e_comp_object_hooks[hookpoint] = eina_inlist_append(_e_comp_object_hooks[hookpoint], EINA_INLIST_GET(ch));
3727 e_comp_object_hook_del(E_Comp_Object_Hook *ch)
3730 if (_e_comp_object_hooks_walking == 0)
3732 _e_comp_object_hooks[ch->hookpoint] = eina_inlist_remove(_e_comp_object_hooks[ch->hookpoint], EINA_INLIST_GET(ch));
3736 _e_comp_object_hooks_delete++;
3739 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
3740 E_API E_Comp_Object_Intercept_Hook *
3741 e_comp_object_intercept_hook_add(E_Comp_Object_Intercept_Hook_Point hookpoint, E_Comp_Object_Intercept_Hook_Cb func, const void *data)
3743 E_Comp_Object_Intercept_Hook *ch;
3745 EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_COMP_OBJECT_INTERCEPT_HOOK_LAST, NULL);
3746 ch = E_NEW(E_Comp_Object_Intercept_Hook, 1);
3747 if (!ch) return NULL;
3748 ch->hookpoint = hookpoint;
3750 ch->data = (void*)data;
3751 _e_comp_object_intercept_hooks[hookpoint] = eina_inlist_append(_e_comp_object_intercept_hooks[hookpoint], EINA_INLIST_GET(ch));
3756 e_comp_object_intercept_hook_del(E_Comp_Object_Intercept_Hook *ch)
3759 if (_e_comp_object_intercept_hooks_walking == 0)
3761 _e_comp_object_intercept_hooks[ch->hookpoint] = eina_inlist_remove(_e_comp_object_intercept_hooks[ch->hookpoint], EINA_INLIST_GET(ch));
3765 _e_comp_object_intercept_hooks_delete++;
3770 e_comp_object_util_add(Evas_Object *obj)
3774 E_Comp_Config *conf = e_comp_config_get();
3775 Eina_Bool skip = EINA_FALSE;
3781 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
3783 name = evas_object_name_get(obj);
3784 vis = evas_object_visible_get(obj);
3785 o = edje_object_add(e_comp->evas);
3786 evas_object_data_set(o, "comp_object", (void*)1);
3788 skip = (!strncmp(name, "noshadow", 8));
3790 evas_object_data_set(o, "comp_object_skip", (void*)1);
3792 if (conf->shadow_style)
3794 snprintf(buf, sizeof(buf), "e/comp/frame/%s", conf->shadow_style);
3795 ok = e_theme_edje_object_set(o, "base/theme/comp", buf);
3798 e_theme_edje_object_set(o, "base/theme/comp", "e/comp/frame/default");
3799 if (e_util_strcmp(evas_object_type_get(obj), "edje") || (!edje_object_data_get(obj, "noshadow")))
3800 edje_object_signal_emit(o, "e,state,shadow,on", "e");
3802 edje_object_signal_emit(o, "e,state,shadow,off", "e");
3804 evas_object_geometry_get(obj, &x, &y, &w, &h);
3805 evas_object_geometry_set(o, x, y, w, h);
3806 evas_object_pass_events_set(o, evas_object_pass_events_get(obj));
3808 edje_object_signal_callback_add(o, "e,action,*,done", "e", _e_comp_object_util_done_defer, NULL);
3810 evas_object_intercept_show_callback_add(o, _e_comp_object_util_show, NULL);
3811 evas_object_intercept_hide_callback_add(o, _e_comp_object_util_hide, NULL);
3812 evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _e_comp_object_util_moveresize, NULL);
3813 evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, _e_comp_object_util_del, NULL);
3814 evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE, _e_comp_object_util_moveresize, NULL);
3815 evas_object_event_callback_add(o, EVAS_CALLBACK_RESTACK, _e_comp_object_util_restack, NULL);
3817 e_comp_object_signal_emit(o, "e,state,hidden", "e");
3819 edje_object_part_swallow(o, "e.swallow.content", obj);
3821 _e_comp_object_event_add(o);
3824 evas_object_show(o);
3829 /* utility functions for deleting objects when their "owner" is deleted */
3831 e_comp_object_util_del_list_append(Evas_Object *obj, Evas_Object *to_del)
3836 EINA_SAFETY_ON_NULL_RETURN(to_del);
3837 l = evas_object_data_get(obj, "comp_object-to_del");
3838 evas_object_data_set(obj, "comp_object-to_del", eina_list_append(l, to_del));
3839 evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _e_comp_object_util_del);
3840 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_util_del, NULL);
3844 e_comp_object_util_del_list_remove(Evas_Object *obj, Evas_Object *to_del)
3849 EINA_SAFETY_ON_NULL_RETURN(to_del);
3850 l = evas_object_data_get(obj, "comp_object-to_del");
3852 evas_object_data_set(obj, "comp_object-to_del", eina_list_remove(l, to_del));
3855 /////////////////////////////////////////////////////////
3857 EINTERN Evas_Object *
3858 e_comp_object_client_add(E_Client *ec)
3863 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, NULL);
3864 if (ec->frame) return NULL;
3865 _e_comp_smart_init();
3866 o = evas_object_smart_add(e_comp->evas, _e_comp_smart);
3867 cw = evas_object_smart_data_get(o);
3868 if (!cw) return NULL;
3869 evas_object_data_set(o, "E_Client", ec);
3872 evas_object_data_set(o, "comp_object", (void*)1);
3874 _e_comp_object_event_add(o);
3879 /* utility functions for getting client inset */
3881 e_comp_object_frame_xy_adjust(Evas_Object *obj, int x, int y, int *ax, int *ay)
3884 if (!cw->client_inset.calc)
3890 if (ax) *ax = x - cw->client_inset.l;
3891 if (ay) *ay = y - cw->client_inset.t;
3895 e_comp_object_frame_xy_unadjust(Evas_Object *obj, int x, int y, int *ax, int *ay)
3898 if (!cw->client_inset.calc)
3904 if (ax) *ax = x + cw->client_inset.l;
3905 if (ay) *ay = y + cw->client_inset.t;
3909 e_comp_object_frame_wh_adjust(Evas_Object *obj, int w, int h, int *aw, int *ah)
3912 if (!cw->client_inset.calc)
3918 if (aw) *aw = w + cw->client_inset.l + cw->client_inset.r;
3919 if (ah) *ah = h + cw->client_inset.t + cw->client_inset.b;
3923 e_comp_object_frame_wh_unadjust(Evas_Object *obj, int w, int h, int *aw, int *ah)
3926 if (!cw->client_inset.calc)
3932 if (aw) *aw = w - cw->client_inset.l - cw->client_inset.r;
3933 if (ah) *ah = h - cw->client_inset.t - cw->client_inset.b;
3937 e_comp_object_client_get(Evas_Object *obj)
3942 /* FIXME: remove this when eo is used */
3943 o = evas_object_data_get(obj, "comp_smart_obj");
3945 return e_comp_object_client_get(o);
3946 return cw ? cw->ec : NULL;
3950 e_comp_object_frame_extends_get(Evas_Object *obj, int *x, int *y, int *w, int *h)
3953 if (cw->frame_extends)
3954 edje_object_parts_extends_calc(cw->frame_object, x, y, w, h);
3959 if (w) *w = cw->ec->w;
3960 if (h) *h = cw->ec->h;
3965 e_comp_object_util_zone_get(Evas_Object *obj)
3967 E_Zone *zone = NULL;
3971 zone = e_comp_zone_find_by_ec(cw->ec);
3976 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
3977 zone = e_comp_zone_xy_get(x, y);
3983 e_comp_object_util_center(Evas_Object *obj)
3985 int x, y, w, h, ow, oh;
3990 zone = e_comp_object_util_zone_get(obj);
3991 EINA_SAFETY_ON_NULL_RETURN(zone);
3992 e_zone_useful_geometry_get(zone, &x, &y, &w, &h);
3993 if (cw && (cw->ec->changes.size || cw->ec->new_client))
3994 ow = cw->ec->w, oh = cw->ec->h;
3996 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
3997 x = x + (w - ow) / 2;
3998 y = y + (h - oh) / 2;
3999 evas_object_move(obj, x, y);
4003 e_comp_object_util_center_on(Evas_Object *obj, Evas_Object *on)
4005 int x, y, w, h, ow, oh;
4008 EINA_SAFETY_ON_NULL_RETURN(on);
4009 evas_object_geometry_get(on, &x, &y, &w, &h);
4010 if (cw && (cw->ec->changes.size || cw->ec->new_client))
4011 ow = cw->ec->w, oh = cw->ec->h;
4013 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
4014 evas_object_move(obj, x + (w / 2) - (ow / 2), y + (h / 2) - (oh / 2));
4018 e_comp_object_util_fullscreen(Evas_Object *obj)
4023 e_client_fullscreen(cw->ec, E_FULLSCREEN_RESIZE);
4026 evas_object_move(obj, 0, 0);
4027 evas_object_resize(obj, e_comp->w, e_comp->h);
4032 e_comp_object_util_center_pos_get(Evas_Object *obj, int *x, int *y)
4040 ow = cw->w, oh = cw->h;
4042 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
4043 zone = e_comp_object_util_zone_get(obj);
4044 e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh);
4045 if (x) *x = zx + (zw - ow) / 2;
4046 if (y) *y = zy + (zh - oh) / 2;
4050 e_comp_object_input_objs_del(Evas_Object *obj)
4053 E_Input_Rect_Data *input_rect_data;
4054 E_Input_Rect_Smart_Data *input_rect_sd;
4059 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4060 if (!input_rect_sd) return;
4062 EINA_LIST_FREE(input_rect_sd->input_rect_data_list, input_rect_data)
4064 if (input_rect_data->obj)
4066 evas_object_smart_member_del(input_rect_data->obj);
4067 E_FREE_FUNC(input_rect_data->obj, evas_object_del);
4069 E_FREE(input_rect_data);
4074 e_comp_object_input_area_set(Evas_Object *obj, int x, int y, int w, int h)
4077 E_Input_Rect_Data *input_rect_data = NULL;
4078 E_Input_Rect_Smart_Data *input_rect_sd;
4079 int client_w, client_h;
4081 if (cw->ec->client.w)
4082 client_w = cw->ec->client.w;
4084 client_w = cw->ec->w;
4086 if (cw->ec->client.h)
4087 client_h = cw->ec->client.h;
4089 client_h = cw->ec->h;
4091 E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, client_w, client_h);
4095 _e_comp_input_obj_smart_init();
4096 cw->input_obj = evas_object_smart_add(e_comp->evas, _e_comp_input_obj_smart);
4097 evas_object_smart_member_add(cw->input_obj, cw->smart_obj);
4098 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4101 input_rect_sd->cw = cw;
4104 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4107 input_rect_data = E_NEW(E_Input_Rect_Data, 1);
4108 if (input_rect_data)
4110 EINA_RECTANGLE_SET(&input_rect_data->rect, x, y, w, h);
4111 input_rect_sd->input_rect_data_list = eina_list_append(input_rect_sd->input_rect_data_list, input_rect_data);
4115 if ((input_rect_data) &&
4116 (x || y || (w != cw->ec->client.w) || (h != cw->ec->client.h)))
4118 input_rect_data->obj = evas_object_rectangle_add(e_comp->evas);
4119 evas_object_name_set(input_rect_data->obj, "cw->input_obj");
4120 evas_object_color_set(input_rect_data->obj, 0, 0, 0, 0);
4121 evas_object_clip_set(input_rect_data->obj, cw->clip);
4122 evas_object_smart_member_add(input_rect_data->obj, cw->input_obj);
4123 evas_object_geometry_set(input_rect_data->obj,
4124 MAX(cw->ec->client.x + (!!cw->frame_object * cw->client_inset.l), 0) + x,
4125 MAX(cw->ec->client.y + (!!cw->frame_object * cw->client_inset.t), 0) + y, w, h);
4126 evas_object_pass_events_set(cw->default_input_obj, 1);
4127 evas_object_pass_events_set(cw->obj, 1);
4130 evas_object_show(input_rect_data->obj);
4131 evas_object_show(cw->input_obj);
4136 evas_object_smart_member_del(cw->input_obj);
4137 E_FREE_FUNC(cw->input_obj, evas_object_del);
4138 evas_object_pass_events_set(cw->default_input_obj, 0);
4139 evas_object_pass_events_set(cw->obj, 0);
4144 e_comp_object_input_rect_get(Evas_Object *obj, Eina_List **list)
4147 E_Input_Rect_Smart_Data *input_rect_sd;
4148 E_Input_Rect_Data *input_rect_data;
4151 if (!cw->input_obj) return;
4153 input_rect_sd = evas_object_smart_data_get(cw->input_obj);
4156 EINA_LIST_FOREACH(input_rect_sd->input_rect_data_list, l, input_rect_data)
4158 *list = eina_list_append(*list, &input_rect_data->rect);
4164 e_comp_object_frame_geometry_get(Evas_Object *obj, int *l, int *r, int *t, int *b)
4167 if (l) *l = cw->client_inset.l;
4168 if (r) *r = cw->client_inset.r;
4169 if (t) *t = cw->client_inset.t;
4170 if (b) *b = cw->client_inset.b;
4173 /* set geometry for CSD */
4175 e_comp_object_frame_geometry_set(Evas_Object *obj, int l, int r, int t, int b)
4181 if (cw->frame_object)
4182 CRI("ACK! ec:%p", cw->ec);
4183 if ((cw->client_inset.l == l) && (cw->client_inset.r == r) &&
4184 (cw->client_inset.t == t) && (cw->client_inset.b == b)) return;
4185 calc = cw->client_inset.calc;
4186 cw->client_inset.calc = l || r || t || b;
4187 eina_stringshare_replace(&cw->frame_theme, "borderless");
4188 if (cw->client_inset.calc)
4190 tw = cw->ec->w + ((l + r) - (cw->client_inset.l + cw->client_inset.r));
4191 th = cw->ec->h + ((t + b) - (cw->client_inset.t + cw->client_inset.b));
4192 e_client_size_set(cw->ec, tw, th);
4194 else if (cw->ec->maximized || cw->ec->fullscreen)
4196 cw->ec->saved.w -= ((l + r) - (cw->client_inset.l + cw->client_inset.r));
4197 cw->ec->saved.h -= ((t + b) - (cw->client_inset.t + cw->client_inset.b));
4199 if (!cw->ec->new_client)
4201 if (calc && cw->client_inset.calc)
4203 tx = cw->ec->x - (l - cw->client_inset.l);
4204 ty = cw->ec->y - (t - cw->client_inset.t);
4205 e_client_pos_set(cw->ec, tx, ty);
4207 cw->ec->changes.pos = cw->ec->changes.size = 1;
4210 cw->client_inset.l = l;
4211 cw->client_inset.r = r;
4212 cw->client_inset.t = t;
4213 cw->client_inset.b = b;
4217 e_comp_object_frame_allowed(Evas_Object *obj)
4219 API_ENTRY EINA_FALSE;
4220 return (!cw->ec->mwm.borderless) && (cw->frame_object || (!cw->client_inset.calc));
4224 e_comp_object_frame_title_set(Evas_Object *obj, const char *name)
4226 API_ENTRY EINA_FALSE;
4227 if (!e_util_strcmp(cw->frame_name, name)) return EINA_FALSE;
4228 eina_stringshare_replace(&cw->frame_name, name);
4229 if (cw->frame_object)
4230 edje_object_part_text_set(cw->frame_object, "e.text.title", cw->frame_name);
4235 e_comp_object_frame_exists(Evas_Object *obj)
4237 API_ENTRY EINA_FALSE;
4238 return !!cw->frame_object;
4242 e_comp_object_frame_theme_set(Evas_Object *obj, const char *name)
4244 Evas_Object *o, *pbg;
4247 Eina_Stringshare *theme;
4249 API_ENTRY EINA_FALSE;
4251 if (!e_util_strcmp(cw->frame_theme, name))
4252 return edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->frame_object ?: cw->obj);
4253 if (!e_util_strcmp(name, "COMP_RESHADOW"))
4254 return _e_comp_object_shadow_setup(cw);
4255 pbg = cw->frame_object;
4256 theme = eina_stringshare_add(name);
4258 if (cw->frame_object)
4262 w = cw->ec->w, h = cw->ec->h;
4263 e_comp_object_frame_wh_unadjust(obj, w, h, &cw->ec->w, &cw->ec->h);
4264 if ((cw->ec->w != w) || (cw->ec->h != h))
4266 cw->ec->changes.size = 1;
4269 E_FREE_FUNC(cw->frame_object, evas_object_del);
4270 if (!name) goto reshadow;
4272 o = edje_object_add(e_comp->evas);
4273 snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", name);
4274 ok = e_theme_edje_object_set(o, "base/theme/border", buf);
4275 if ((!ok) && (!e_util_strcmp(name, "borderless")))
4277 cw->frame_object = NULL;
4279 eina_stringshare_del(cw->frame_theme);
4280 cw->frame_theme = theme;
4285 if (theme != e_config->theme_default_border_style)
4287 snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", e_config->theme_default_border_style);
4288 ok = e_theme_edje_object_set(o, "base/theme/border", buf);
4292 ok = e_theme_edje_object_set(o, "base/theme/border",
4293 "e/widgets/border/default/border");
4294 if (ok && (theme == e_config->theme_default_border_style))
4296 /* Reset default border style to default */
4297 eina_stringshare_replace(&e_config->theme_default_border_style, "default");
4298 e_config_save_queue();
4305 cw->frame_object = o;
4306 eina_stringshare_del(cw->frame_theme);
4307 cw->frame_theme = theme;
4308 evas_object_name_set(o, "cw->frame_object");
4311 edje_object_part_text_set(o, "e.text.title", cw->frame_name);
4315 cw->ec->changes.icon = 1;
4321 CRI("USER IS USING A SHITTY THEME! ABORT!!!!");
4326 _e_comp_object_shadow_setup(cw);
4329 int old_x, old_y, new_x = 0, new_y = 0;
4331 old_x = cw->x, old_y = cw->y;
4333 _e_comp_smart_cb_frame_recalc(cw, cw->smart_obj, NULL);
4335 new_x = cw->ec->x, new_y = cw->ec->y;
4336 else if (cw->ec->placed || (!cw->ec->new_client))
4338 /* if no previous frame:
4339 * - reapply client_inset
4344 if (cw->ec->changes.size)
4352 zone = e_comp_zone_find_by_ec(cw->ec);
4355 x = cw->ec->client.x, y = cw->ec->client.y;
4356 x = MAX(zone->x, cw->ec->client.x - cw->client_inset.l);
4357 y = MAX(zone->y, cw->ec->client.y - cw->client_inset.t);
4359 new_x = x, new_y = y;
4362 if (old_x != new_x || old_y != new_y)
4364 /* this guarantees that we won't get blocked by the NOP check in the interceptor */
4365 cw->y = cw->x = -99999;
4366 evas_object_move(obj, new_x, new_y);
4370 if (cw->ec->maximized)
4372 cw->ec->changes.need_maximize = 1;
4375 evas_object_smart_callback_call(cw->smart_obj, "frame_changed", NULL);
4376 if (cw->frame_object)
4378 cw->frame_extends = !!edje_object_data_get(cw->frame_object, "frame_extends");
4381 cw->frame_extends = 0;
4382 evas_object_del(pbg);
4387 e_comp_object_signal_emit(Evas_Object *obj, const char *sig, const char *src)
4389 E_Comp_Object_Mover *prov;
4392 //INF("EMIT %p: %s %s", cw->ec, sig, src);
4393 edje_object_signal_emit(cw->shobj, sig, src);
4394 if (cw->frame_object) edje_object_signal_emit(cw->frame_object, sig, src);
4395 if ((cw->ec->override && e_comp_config_get()->match.disable_overrides) ||
4396 ((!cw->ec->override) && e_comp_config_get()->match.disable_borders))
4398 /* start with highest priority callback first */
4399 EINA_INLIST_REVERSE_FOREACH(_e_comp_object_movers, prov)
4401 if (!e_util_glob_match(sig, prov->sig)) continue;
4402 if (prov->func(prov->data, obj, sig)) break;
4407 e_comp_object_signal_callback_add(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb, const void *data)
4409 /* FIXME: at some point I guess this should use eo to inherit
4410 * -EDJE_OBJ_SUB_ID_SIGNAL_CALLBACK_ADD
4411 * -EDJE_OBJ_SUB_ID_SIGNAL_CALLBACK_DEL
4414 edje_object_signal_callback_add(cw->shobj, sig, src, cb, (void*)data);
4418 e_comp_object_signal_callback_del(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb)
4421 edje_object_signal_callback_del(cw->shobj, sig, src, cb);
4425 e_comp_object_signal_callback_del_full(Evas_Object *obj, const char *sig, const char *src, Edje_Signal_Cb cb, const void *data)
4428 edje_object_signal_callback_del_full(cw->shobj, sig, src, cb, (void*)data);
4432 e_comp_object_damage(Evas_Object *obj, int x, int y, int w, int h)
4435 Eina_Rectangle rect;
4438 if (cw->ec->input_only || (!cw->updates)) return;
4439 if (cw->nocomp) return;
4440 rect.x = x, rect.y = y;
4441 rect.w = w, rect.h = h;
4442 evas_object_smart_callback_call(obj, "damage", &rect);
4444 if (e_comp_is_on_overlay(cw->ec))
4446 /* It will not set hwc_need_update value if E modules already cleanup pixmap
4447 * resource on the E_COMP_WL_HOOK_BUFFER_CHANGE hook function. It means that
4448 * E module attempts to block screen update due to the particular policy.
4450 if (e_pixmap_resource_get(cw->ec->pixmap))
4451 cw->hwc_need_update = EINA_TRUE;
4454 /* ignore overdraw */
4455 if (cw->updates_full)
4457 RENDER_DEBUG("IGNORED %p: %d,%d %dx%d", cw->ec, x, y, w, h);
4458 e_comp_object_render_update_add(obj);
4460 if ((cw->ec->visible) && (!evas_object_visible_get(cw->smart_obj)) && (!cw->ec->iconic))
4461 evas_object_show(cw->smart_obj);
4465 /* clip rect to client surface */
4466 RENDER_DEBUG("DAMAGE(%d,%d %dx%d) CLIP(%dx%d)", x, y, w, h, cw->ec->client.w, cw->ec->client.h);
4467 E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, cw->ec->client.w, cw->ec->client.h);
4468 /* if rect is the total size of the client after clip, clear the updates
4469 * since this is guaranteed to be the whole region anyway
4471 eina_tiler_area_size_get(cw->updates, &tw, &th);
4472 if ((w > tw) || (h > th))
4474 RENDER_DEBUG("DAMAGE RESIZE %p: %dx%d", cw->ec, cw->ec->client.w, cw->ec->client.h);
4475 eina_tiler_clear(cw->updates);
4476 eina_tiler_area_size_set(cw->updates, cw->ec->client.w, cw->ec->client.h);
4478 tw = cw->ec->client.w, th = cw->ec->client.h;
4480 if ((!x) && (!y) && (w == tw) && (h == th))
4482 eina_tiler_clear(cw->updates);
4483 RENDER_DEBUG("DAMAGE FULL: %p", cw->ec);
4484 cw->updates_full = 1;
4485 cw->update_count = 0;
4488 if (cw->update_count > UPDATE_MAX)
4490 /* this is going to get really dumb, so just update the whole thing */
4491 eina_tiler_clear(cw->updates);
4492 cw->update_count = cw->updates_full = 1;
4493 eina_tiler_rect_add(cw->updates, &(Eina_Rectangle){0, 0, tw, th});
4494 RENDER_DEBUG("DAMAGE MAX: %dx%d", tw, th);
4498 eina_tiler_rect_add(cw->updates, &(Eina_Rectangle){x, y, w, h});
4499 RENDER_DEBUG("DAMAGE: %d,%d %dx%d", x, y, w, h);
4501 cw->updates_exist = 1;
4502 e_comp_object_render_update_add(obj);
4504 if ((cw->ec->visible) && (!evas_object_visible_get(cw->smart_obj)) && (!cw->ec->iconic))
4505 evas_object_show(cw->smart_obj);
4509 e_comp_object_damage_exists(Evas_Object *obj)
4511 API_ENTRY EINA_FALSE;
4512 return cw->updates_exist;
4516 e_comp_object_render_update_add(Evas_Object *obj)
4520 if (cw->ec->input_only || (!cw->updates) || (!cw->redirected)) return;
4521 if (cw->render_update_lock.lock) return;
4522 if (!e_pixmap_usable_get(cw->ec->pixmap)) return;
4526 e_comp->updates = eina_list_append(e_comp->updates, cw->ec);
4528 e_comp_render_queue();
4532 e_comp_object_render_update_del(Evas_Object *obj)
4536 if (cw->ec->input_only || (!cw->updates)) return;
4537 if (!cw->update) return;
4539 /* this gets called during comp animating to clear the update flag */
4540 if (e_comp->grabbed) return;
4541 e_comp->updates = eina_list_remove(e_comp->updates, cw->ec);
4542 if (!e_comp->updates)
4544 E_FREE_FUNC(e_comp->update_job, ecore_job_del);
4545 if (e_comp->render_animator)
4546 ecore_animator_freeze(e_comp->render_animator);
4551 e_comp_object_shape_apply(Evas_Object *obj)
4555 unsigned int i, *pix, *p;
4559 if (!cw->ec) return; //NYI
4560 if (cw->external_content) return;
4563 if ((cw->ec->shape_rects_num >= 1) &&
4564 (!_e_comp_shaped_check(cw->ec->client.w, cw->ec->client.h, cw->ec->shape_rects, cw->ec->shape_rects_num)))
4569 ERR("BUGGER: shape with native surface? cw=%p", cw);
4572 evas_object_image_size_get(cw->obj, &w, &h);
4573 if ((w < 1) || (h < 1)) return;
4576 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4577 _e_comp_object_alpha_set(cw);
4578 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4579 evas_object_image_alpha_set(o, 1);
4581 p = pix = evas_object_image_data_get(cw->obj, 1);
4584 evas_object_image_data_set(cw->obj, pix);
4589 unsigned char *spix, *sp;
4591 spix = calloc(w * h, sizeof(unsigned char));
4593 for (i = 0; i < cw->ec->shape_rects_num; i++)
4597 rx = cw->ec->shape_rects[i].x; ry = cw->ec->shape_rects[i].y;
4598 rw = cw->ec->shape_rects[i].w; rh = cw->ec->shape_rects[i].h;
4599 E_RECTS_CLIP_TO_RECT(rx, ry, rw, rh, 0, 0, w, h);
4600 sp = spix + (w * ry) + rx;
4601 for (py = 0; py < rh; py++)
4603 for (px = 0; px < rw; px++)
4611 for (py = 0; py < h; py++)
4613 for (px = 0; px < w; px++)
4615 unsigned int mask, imask;
4617 mask = ((unsigned int)(*sp)) << 24;
4619 imask |= imask >> 8;
4620 imask |= imask >> 8;
4621 *p = mask | (*p & imask);
4622 //if (*sp) *p = 0xff000000 | *p;
4623 //else *p = 0x00000000;
4632 for (py = 0; py < h; py++)
4634 for (px = 0; px < w; px++)
4638 evas_object_image_data_set(cw->obj, pix);
4639 evas_object_image_data_update_add(cw->obj, 0, 0, w, h);
4640 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4642 evas_object_image_data_set(o, pix);
4643 evas_object_image_data_update_add(o, 0, 0, w, h);
4645 // don't need to fix alpha chanel as blending
4646 // should be totally off here regardless of
4647 // alpha channel content
4651 _e_comp_object_clear(E_Comp_Object *cw)
4656 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
4658 if (cw->render_update_lock.lock) return;
4661 e_pixmap_clear(cw->ec->pixmap);
4663 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4664 evas_object_image_size_set(cw->obj, 1, 1);
4665 evas_object_image_data_set(cw->obj, NULL);
4666 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4668 evas_object_image_size_set(o, 1, 1);
4669 evas_object_image_data_set(o, NULL);
4672 e_comp_object_render_update_del(cw->smart_obj);
4676 _e_comp_object_transparent_set(Evas_Object *obj, Eina_Bool set)
4680 API_ENTRY EINA_FALSE;
4682 if (cw->transparent.set == set)
4687 evas_object_color_get(obj, &r, &g, &b, &a);
4688 evas_object_color_set(obj, 0, 0, 0, 0);
4690 cw->transparent.user_r = r;
4691 cw->transparent.user_g = g;
4692 cw->transparent.user_b = b;
4693 cw->transparent.user_a = a;
4695 ELOGF("COMP", "Transparent enabled user_color(%d,%d,%d,%d)",
4697 cw->transparent.user_r,
4698 cw->transparent.user_g,
4699 cw->transparent.user_b,
4700 cw->transparent.user_a);
4702 cw->transparent.set = EINA_TRUE;
4706 cw->transparent.set = EINA_FALSE;
4708 evas_object_color_set(obj,
4709 cw->transparent.user_r,
4710 cw->transparent.user_g,
4711 cw->transparent.user_b,
4712 cw->transparent.user_a);
4714 ELOGF("COMP", "Transparent disabled user_color(%d,%d,%d,%d)",
4716 cw->transparent.user_r,
4717 cw->transparent.user_g,
4718 cw->transparent.user_b,
4719 cw->transparent.user_a);
4725 /* helper function to simplify toggling of redirection for display servers which support it */
4727 e_comp_object_redirected_set(Evas_Object *obj, Eina_Bool set)
4732 if (cw->redirected == set) return;
4733 cw->redirected = set;
4734 if (cw->external_content) return;
4736 e_comp_object_map_update(obj);
4740 if (cw->updates_exist)
4741 e_comp_object_render_update_add(obj);
4743 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4745 _e_comp_object_transparent_set(obj, EINA_FALSE);
4746 evas_object_smart_callback_call(obj, "redirected", NULL);
4750 _e_comp_object_clear(cw);
4751 _e_comp_object_transparent_set(obj, EINA_TRUE);
4752 evas_object_smart_callback_call(obj, "unredirected", NULL);
4757 _e_comp_object_cb_buffer_destroy(struct wl_listener *listener, void *data EINA_UNUSED)
4760 cw = container_of(listener, E_Comp_Object, buffer_destroy_listener);
4762 if (cw->buffer_destroy_listener.notify)
4764 cw->buffer_destroy_listener.notify = NULL;
4765 wl_list_remove(&cw->buffer_destroy_listener.link);
4768 if (e_object_is_del(E_OBJECT(cw->ec)))
4770 if (!e_object_delay_del_ref_get(E_OBJECT(cw->ec)))
4775 /* if it's current displaying buffer, do not remove its content */
4776 if (!evas_object_visible_get(cw->ec->frame))
4777 _e_comp_object_native_surface_set(cw, NULL, EINA_TRUE);
4782 _e_comp_object_native_surface_set(E_Comp_Object *cw, Evas_Native_Surface *ns, Eina_Bool with_mirror)
4787 if (cw->buffer_destroy_listener.notify)
4789 wl_list_remove(&cw->buffer_destroy_listener.link);
4790 cw->buffer_destroy_listener.notify = NULL;
4793 if (cw->tbm_surface)
4795 tbm_surface_internal_unref(cw->tbm_surface);
4796 cw->tbm_surface = NULL;
4801 if ((ns->type == EVAS_NATIVE_SURFACE_WL) && (ns->data.wl.legacy_buffer))
4803 cw->buffer_destroy_listener.notify = _e_comp_object_cb_buffer_destroy;
4804 wl_resource_add_destroy_listener((struct wl_resource *)ns->data.wl.legacy_buffer, &cw->buffer_destroy_listener);
4806 else if ((ns->type == EVAS_NATIVE_SURFACE_TBM) && (ns->data.tbm.buffer))
4808 tbm_surface_internal_ref(ns->data.tbm.buffer);
4809 cw->tbm_surface = ns->data.tbm.buffer;
4813 TRACE_DS_BEGIN(NATIVE_SURFACE_SET);
4814 evas_object_image_native_surface_set(cw->obj, ns);
4818 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
4820 evas_object_image_alpha_set(o, !!cw->ns ? 1 : cw->ec->argb);
4821 TRACE_DS_BEGIN(NATIVE_SURFACE_SET);
4822 evas_object_image_native_surface_set(o, ns);
4829 e_comp_object_native_surface_set(Evas_Object *obj, Eina_Bool set)
4831 Evas_Native_Surface ns;
4834 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
4835 if (cw->ec->input_only) return;
4836 if (cw->external_content) return;
4837 if (cw->render_update_lock.lock) return;
4840 memset(&ns, 0, sizeof(Evas_Native_Surface));
4844 /* native requires gl enabled, texture from pixmap enabled, and a non-shaped client */
4845 set = (!cw->ec->shaped);
4847 set = (!!cw->ns) || e_pixmap_native_surface_init(cw->ec->pixmap, &ns);
4851 _e_comp_object_native_surface_set(cw, set && (!cw->blanked) ? (cw->ns ? cw->ns : &ns) : NULL, EINA_TRUE);
4855 e_comp_object_native_surface_override(Evas_Object *obj, Evas_Native_Surface *ns)
4858 if (cw->ec->input_only) return;
4861 cw->ns = (Evas_Native_Surface*)eina_memdup((unsigned char*)ns, sizeof(Evas_Native_Surface), 0);
4862 _e_comp_object_alpha_set(cw);
4864 e_comp_object_native_surface_set(obj, cw->native);
4865 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4869 e_comp_object_blank(Evas_Object *obj, Eina_Bool set)
4875 if (cw->blanked == set) return;
4877 _e_comp_object_alpha_set(cw);
4880 _e_comp_object_native_surface_set(cw, NULL, EINA_FALSE);
4881 evas_object_image_data_set(cw->obj, NULL);
4885 e_comp_object_native_surface_set(obj, 1);
4886 e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
4890 _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)
4895 if (!_damage_trace) return;
4899 if (!evas_object_visible_get(cw->obj)) return;
4901 evas_object_geometry_get(cw->obj, &obj_x, &obj_y, NULL, NULL);
4903 o = evas_object_rectangle_add(e_comp->evas);
4904 evas_object_layer_set(o, E_LAYER_MAX);
4905 evas_object_name_set(o, "damage_trace");
4906 evas_object_move(o, dmg_x + obj_x, dmg_y + obj_y);
4907 evas_object_resize(o, dmg_w, dmg_h);
4908 evas_object_color_set(o, 0, 128, 0, 128);
4909 evas_object_render_op_set(o, EVAS_RENDER_BLEND);
4910 evas_object_pass_events_set(o, EINA_TRUE);
4911 evas_object_show(o);
4913 ELOGF("COMP", "add damage(%dx%d+%d+%d) origin(%dx%d+%d+%d)",
4915 dmg_w, dmg_h, dmg_x, dmg_y,
4916 origin->w, origin->h, origin->x, origin->y);
4918 _damage_trace_objs = eina_list_append(_damage_trace_objs, o);
4921 /* mark an object as dirty and setup damages */
4923 e_comp_object_dirty(Evas_Object *obj)
4926 Eina_Rectangle *rect;
4930 Eina_Bool dirty, visible;
4934 if (cw->external_content) return;
4935 if (!cw->redirected) return;
4936 if (cw->render_update_lock.lock)
4938 ELOGF("COMP", "Render update locked:%d", cw->ec, cw->render_update_lock.lock);
4941 /* only actually dirty if pixmap is available */
4942 if (!e_pixmap_resource_get(cw->ec->pixmap))
4944 // e_pixmap_size_get returns last attached buffer size
4945 // eventhough it is destroyed
4946 ERR("ERROR NO PIXMAP FOR ec:%p", cw->ec);
4949 dirty = e_pixmap_size_get(cw->ec->pixmap, &w, &h);
4950 visible = cw->visible;
4951 if (!dirty) w = h = 1;
4952 evas_object_image_pixels_dirty_set(cw->obj, cw->blanked ? 0 : dirty);
4954 evas_object_image_data_set(cw->obj, NULL);
4955 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
4956 evas_object_image_size_set(cw->obj, tw, th);
4957 if (cw->mask.obj) evas_object_resize(cw->mask.obj, w, h);
4958 if (cw->pending_updates)
4959 eina_tiler_area_size_set(cw->pending_updates, w, h);
4960 EINA_LIST_FOREACH(cw->obj_mirror, ll, o)
4962 evas_object_image_pixels_dirty_set(o, dirty);
4964 evas_object_image_data_set(o, NULL);
4965 evas_object_image_size_set(o, tw, th);
4966 visible |= evas_object_visible_get(o);
4970 ERR("ERROR FETCHING PIXMAP FOR %p", cw->ec);
4974 e_comp_object_native_surface_set(obj, 1);
4976 m = _e_comp_object_map_damage_transform_get(cw->ec);
4977 it = eina_tiler_iterator_new(cw->updates);
4978 EINA_ITERATOR_FOREACH(it, rect)
4980 /* evas converts damage according to rotation of ecore_evas in damage_region_set
4981 * of evas engine and doesn't convert damage according to evas_map.
4982 * so damage of evas_object_image use surface coordinate.
4986 int damage_x, damage_y, damage_w, damage_h;
4988 _e_comp_object_map_damage_transform_rect(cw->ec, m, rect->x, rect->y, rect->w, rect->h,
4989 &damage_x, &damage_y, &damage_w, &damage_h);
4990 evas_object_image_data_update_add(cw->obj, damage_x, damage_y, damage_w, damage_h);
4991 _e_comp_object_damage_trace_rect_set(obj, rect, damage_x, damage_y, damage_w, damage_h);
4995 evas_object_image_data_update_add(cw->obj, rect->x, rect->y, rect->w, rect->h);
4996 _e_comp_object_damage_trace_rect_set(obj, rect, rect->x, rect->y, rect->w, rect->h);
4999 EINA_LIST_FOREACH(cw->obj_mirror, ll, o)
5000 evas_object_image_data_update_add(o, rect->x, rect->y, rect->w, rect->h);
5001 if (cw->pending_updates)
5002 eina_tiler_rect_add(cw->pending_updates, rect);
5004 eina_iterator_free(it);
5005 if (m) e_map_free(m);
5006 if (cw->pending_updates)
5007 eina_tiler_clear(cw->updates);
5010 cw->pending_updates = cw->updates;
5011 cw->updates = eina_tiler_new(w, h);
5012 eina_tiler_tile_size_set(cw->updates, 1, 1);
5014 cw->update_count = cw->updates_full = cw->updates_exist = 0;
5015 evas_object_smart_callback_call(obj, "dirty", NULL);
5016 if (cw->visible || (!visible) || (!cw->pending_updates) || cw->native) return;
5017 /* force render if main object is hidden but mirrors are visible */
5018 RENDER_DEBUG("FORCING RENDER %p", cw->ec);
5019 e_comp_object_render(obj);
5023 e_comp_object_render(Evas_Object *obj)
5030 API_ENTRY EINA_FALSE;
5032 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5033 if (cw->ec->input_only) return EINA_TRUE;
5034 if (cw->external_content) return EINA_TRUE;
5035 if (cw->native) return EINA_FALSE;
5036 /* if comp object is not redirected state, comp object should not be set by newly committed data
5037 because image size of comp object is 1x1 and it should not be shown on canvas */
5038 if (!cw->redirected) return EINA_TRUE;
5039 if (cw->render_update_lock.lock)
5041 ELOGF("COMP", "Render update locked:%d", cw->ec, cw->render_update_lock.lock);
5044 e_comp_object_render_update_del(obj);
5045 if (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph)) return EINA_FALSE;
5047 if (!cw->pending_updates)
5049 WRN("RENDER [%p]: NO RECTS!", cw->ec);
5050 evas_object_image_data_set(cw->obj, NULL);
5051 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
5052 evas_object_image_data_set(o, NULL);
5056 evas_object_image_pixels_dirty_set(cw->obj, EINA_FALSE);
5058 RENDER_DEBUG("RENDER SIZE: %dx%d", pw, ph);
5060 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5063 e_pixmap_image_refresh(cw->ec->pixmap);
5064 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5067 if ((pix) && ((!cw->blanked) || (cw->obj_mirror)))
5068 e_pixmap_image_data_ref(cw->ec->pixmap);
5070 /* set pixel data */
5071 evas_object_image_data_set(cw->obj, cw->blanked ? NULL : pix);
5072 _e_comp_object_alpha_set(cw);
5073 EINA_LIST_FOREACH(cw->obj_mirror, l, o)
5075 evas_object_image_data_set(o, pix);
5076 evas_object_image_alpha_set(o, evas_object_image_alpha_get(cw->obj));
5077 evas_object_image_pixels_dirty_set(o, EINA_FALSE);
5080 E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
5082 e_comp_client_post_update_add(cw->ec);
5087 /* create a duplicate of an evas object */
5089 e_comp_object_util_mirror_add(Evas_Object *obj)
5093 unsigned int *pix = NULL;
5094 Eina_Bool argb = EINA_FALSE;
5099 cw = evas_object_data_get(obj, "comp_mirror");
5102 o = evas_object_image_filled_add(evas_object_evas_get(obj));
5103 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
5104 evas_object_image_smooth_scale_set(o, e_comp_config_get()->smooth_windows);
5105 evas_object_image_alpha_set(o, 1);
5106 evas_object_image_source_set(o, obj);
5109 if ((!cw->ec) || (!e_pixmap_size_get(cw->ec->pixmap, &w, &h))) return NULL;
5110 if (cw->external_content)
5112 ERR("%p of client %p is external content.", obj, cw->ec);
5115 o = evas_object_image_filled_add(evas_object_evas_get(obj));
5116 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
5117 evas_object_image_smooth_scale_set(o, e_comp_config_get()->smooth_windows);
5118 cw->obj_mirror = eina_list_append(cw->obj_mirror, o);
5119 evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, _e_comp_object_cb_mirror_del, cw);
5120 evas_object_event_callback_add(o, EVAS_CALLBACK_SHOW, _e_comp_object_cb_mirror_show, cw);
5121 evas_object_event_callback_add(o, EVAS_CALLBACK_HIDE, _e_comp_object_cb_mirror_hide, cw);
5122 evas_object_data_set(o, "E_Client_Mirror", cw->ec);
5123 evas_object_data_set(o, "comp_mirror", cw);
5125 evas_object_image_alpha_set(o, evas_object_image_alpha_get(cw->obj));
5126 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
5128 evas_object_image_size_set(o, tw, th);
5131 pix = evas_object_image_data_get(cw->obj, 0);
5137 evas_object_image_native_surface_set(o, cw->ns);
5140 Evas_Native_Surface ns;
5141 memset(&ns, 0, sizeof(Evas_Native_Surface));
5142 if (e_pixmap_native_surface_init(cw->ec->pixmap, &ns))
5143 evas_object_image_native_surface_set(o, &ns);
5148 /* FIXME: legacy code, please refer to commit 5e6831187a1 */
5149 argb = e_pixmap_image_is_argb(cw->ec->pixmap);
5151 (e_pixmap_image_exists(cw->ec->pixmap)))
5152 pix = e_pixmap_image_data_get(cw->ec->pixmap);
5154 pix = evas_object_image_data_get(cw->obj, EINA_FALSE);
5161 dirty = evas_object_image_pixels_dirty_get(cw->obj);
5162 evas_object_image_pixels_dirty_set(o, dirty);
5163 evas_object_image_data_set(o, pix);
5164 evas_object_image_data_set(cw->obj, pix);
5166 evas_object_image_data_update_add(o, 0, 0, tw, th);
5171 //////////////////////////////////////////////////////
5174 e_comp_object_effect_allowed_get(Evas_Object *obj)
5176 API_ENTRY EINA_FALSE;
5178 if (!cw->shobj) return EINA_FALSE;
5179 if (cw->ec->override) return !e_comp_config_get()->match.disable_overrides;
5180 return !e_comp_config_get()->match.disable_borders;
5183 /* setup an api effect for a client */
5185 e_comp_object_effect_set(Evas_Object *obj, const char *effect)
5188 Eina_Stringshare *grp;
5189 E_Comp_Config *config;
5190 Eina_Bool loaded = EINA_FALSE;
5192 API_ENTRY EINA_FALSE;
5193 if (!cw->shobj) return EINA_FALSE; //input window
5195 if (!effect) effect = "none";
5196 snprintf(buf, sizeof(buf), "e/comp/effects/%s", effect);
5198 config = e_comp_config_get();
5199 if ((config) && (config->effect_file))
5201 if (edje_object_file_set(cw->effect_obj, config->effect_file, buf))
5203 cw->effect_set = EINA_TRUE;
5210 edje_object_file_get(cw->effect_obj, NULL, &grp);
5211 cw->effect_set = !eina_streq(effect, "none");
5212 if (!e_util_strcmp(buf, grp)) return cw->effect_set;
5213 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", buf))
5215 snprintf(buf, sizeof(buf), "e/comp/effects/auto/%s", effect);
5216 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", buf))
5217 if (!e_theme_edje_object_set(cw->effect_obj, "base/theme/comp", "e/comp/effects/none"))
5219 if (cw->effect_running)
5221 if (!e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb")))
5224 cw->effect_set = EINA_FALSE;
5225 return cw->effect_set;
5229 if (cw->effect_running)
5231 if (!e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb")))
5234 ELOGF("COMP", "EFFECT Set GROUP[%s]", cw->ec, buf);
5235 edje_object_part_swallow(cw->effect_obj, "e.swallow.content", cw->shobj);
5236 if (cw->effect_clip)
5238 evas_object_clip_unset(cw->clip);
5239 cw->effect_clip = 0;
5241 cw->effect_clip_able = !edje_object_data_get(cw->effect_obj, "noclip");
5243 _e_comp_object_dim_update(cw);
5245 return cw->effect_set;
5248 /* set params for embryo scripts in effect */
5250 e_comp_object_effect_params_set(Evas_Object *obj, int id, int *params, unsigned int count)
5252 Edje_Message_Int_Set *msg;
5256 EINA_SAFETY_ON_NULL_RETURN(params);
5257 EINA_SAFETY_ON_FALSE_RETURN(count);
5258 if (!cw->effect_set) return;
5260 msg = alloca(sizeof(Edje_Message_Int_Set) + ((count - 1) * sizeof(int)));
5261 msg->count = (int)count;
5262 for (x = 0; x < count; x++)
5263 msg->val[x] = params[x];
5264 edje_object_message_send(cw->effect_obj, EDJE_MESSAGE_INT_SET, id, msg);
5265 edje_object_message_signal_process(cw->effect_obj);
5269 _e_comp_object_effect_end_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
5271 Edje_Signal_Cb end_cb;
5273 E_Comp_Object *cw = data;
5275 edje_object_signal_callback_del_full(obj, "e,action,done", "e", _e_comp_object_effect_end_cb, NULL);
5276 cw->effect_running = 0;
5277 if (!_e_comp_object_animating_end(cw)) return;
5279 if (evas_object_data_get(cw->smart_obj, "effect_running"))
5281 evas_object_data_del(cw->smart_obj, "effect_running");
5282 _e_comp_object_event_simple(obj, E_EVENT_COMP_OBJECT_EFFECT_END);
5283 e_comp_visibility_calculation_set(EINA_TRUE);
5286 end_cb = evas_object_data_get(obj, "_e_comp.end_cb");
5287 if (!end_cb) return;
5288 end_data = evas_object_data_get(obj, "_e_comp.end_data");
5289 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_END, cw->ec);
5290 end_cb(end_data, cw->smart_obj, emission, source);
5293 /* clip effect to client's zone */
5295 e_comp_object_effect_clip(Evas_Object *obj)
5299 zone = e_comp_zone_find_by_ec(cw->ec);
5301 if (cw->effect_clip) e_comp_object_effect_unclip(cw->smart_obj);
5302 if (!cw->effect_clip_able) return;
5303 evas_object_clip_set(cw->smart_obj, zone->bg_clip_object);
5304 cw->effect_clip = 1;
5307 /* unclip effect from client's zone */
5309 e_comp_object_effect_unclip(Evas_Object *obj)
5312 if (!cw->effect_clip) return;
5313 evas_object_clip_unset(cw->smart_obj);
5314 cw->effect_clip = 0;
5317 /* start effect, running end_cb after */
5319 e_comp_object_effect_start(Evas_Object *obj, Edje_Signal_Cb end_cb, const void *end_data)
5321 API_ENTRY EINA_FALSE;
5322 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE); //NYI
5323 if (!cw->effect_set) return EINA_FALSE;
5325 if (cw->effect_running)
5327 e_comp_object_effect_stop(obj, evas_object_data_get(cw->effect_obj, "_e_comp.end_cb"));
5330 e_comp_object_effect_clip(obj);
5331 edje_object_signal_callback_del(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb);
5333 edje_object_signal_callback_add(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb, cw);
5334 evas_object_data_set(cw->effect_obj, "_e_comp.end_cb", end_cb);
5335 evas_object_data_set(cw->effect_obj, "_e_comp.end_data", end_data);
5336 evas_object_data_set(cw->smart_obj, "effect_running", (void*)1);
5338 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_START, cw->ec);
5339 _e_comp_object_event_simple(obj, E_EVENT_COMP_OBJECT_EFFECT_START);
5341 edje_object_signal_emit(cw->effect_obj, "e,action,go", "e");
5342 _e_comp_object_animating_begin(cw);
5343 cw->effect_running = 1;
5347 /* stop a currently-running effect immediately */
5349 e_comp_object_effect_stop(Evas_Object *obj, Edje_Signal_Cb end_cb)
5352 Edje_Signal_Cb end_cb_before = NULL;
5353 void *end_data_before = NULL;
5354 API_ENTRY EINA_FALSE;
5356 end_cb_before = evas_object_data_get(cw->effect_obj, "_e_comp.end_cb");
5357 end_data_before = evas_object_data_get(cw->effect_obj, "_e_comp.end_data");
5359 if (end_cb_before != end_cb) return EINA_TRUE;
5360 e_comp_object_effect_unclip(obj);
5361 if (cw->effect_clip)
5363 evas_object_clip_unset(cw->effect_obj);
5364 cw->effect_clip = 0;
5366 edje_object_signal_emit(cw->effect_obj, "e,action,stop", "e");
5367 edje_object_signal_callback_del_full(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb, cw);
5369 if (evas_object_data_get(cw->smart_obj, "effect_running"))
5371 evas_object_data_del(cw->smart_obj, "effect_running");
5372 e_comp_visibility_calculation_set(EINA_TRUE);
5375 cw->effect_running = 0;
5376 ret = _e_comp_object_animating_end(cw);
5378 if ((ret) && (end_cb_before))
5380 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_EFFECT_END, cw->ec);
5381 end_cb_before(end_data_before, cw->smart_obj, "e,action,done", "e");
5388 _e_comp_object_effect_mover_sort_cb(E_Comp_Object_Mover *a, E_Comp_Object_Mover *b)
5390 return a->pri - b->pri;
5393 /* add a function to trigger based on signal emissions for the purpose of modifying effects */
5394 E_API E_Comp_Object_Mover *
5395 e_comp_object_effect_mover_add(int pri, const char *sig, E_Comp_Object_Mover_Cb provider, const void *data)
5397 E_Comp_Object_Mover *prov;
5399 prov = E_NEW(E_Comp_Object_Mover, 1);
5400 EINA_SAFETY_ON_NULL_RETURN_VAL(prov, NULL);
5401 prov->func = provider;
5402 prov->data = (void*)data;
5405 _e_comp_object_movers = eina_inlist_sorted_insert(_e_comp_object_movers, EINA_INLIST_GET(prov),
5406 (Eina_Compare_Cb)_e_comp_object_effect_mover_sort_cb);
5411 e_comp_object_effect_mover_del(E_Comp_Object_Mover *prov)
5413 EINA_SAFETY_ON_NULL_RETURN(prov);
5414 _e_comp_object_movers = eina_inlist_remove(_e_comp_object_movers, EINA_INLIST_GET(prov));
5419 e_comp_object_effect_object_get(Evas_Object *obj)
5423 return cw->effect_obj;
5427 e_comp_object_effect_hiding_set(Evas_Object *obj, Eina_Bool set)
5429 API_ENTRY EINA_FALSE;
5430 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5431 if (!cw->effect_set) return EINA_FALSE;
5438 ////////////////////////////////////
5441 _e_comp_object_autoclose_cleanup(Eina_Bool already_del)
5443 if (e_comp->autoclose.obj)
5445 e_comp_ungrab_input(0, 1);
5446 if (e_comp->autoclose.del_cb)
5447 e_comp->autoclose.del_cb(e_comp->autoclose.data, e_comp->autoclose.obj);
5448 else if (!already_del)
5450 evas_object_hide(e_comp->autoclose.obj);
5451 E_FREE_FUNC(e_comp->autoclose.obj, evas_object_del);
5453 E_FREE_FUNC(e_comp->autoclose.rect, evas_object_del);
5455 e_comp->autoclose.obj = NULL;
5456 e_comp->autoclose.data = NULL;
5457 e_comp->autoclose.del_cb = NULL;
5458 e_comp->autoclose.key_cb = NULL;
5459 E_FREE_FUNC(e_comp->autoclose.key_handler, ecore_event_handler_del);
5463 _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)
5465 _e_comp_object_autoclose_cleanup(0);
5469 _e_comp_object_autoclose_setup(Evas_Object *obj)
5471 if (!e_comp->autoclose.rect)
5473 /* create rect just below autoclose object to catch mouse events */
5474 e_comp->autoclose.rect = evas_object_rectangle_add(e_comp->evas);
5475 evas_object_move(e_comp->autoclose.rect, 0, 0);
5476 evas_object_resize(e_comp->autoclose.rect, e_comp->w, e_comp->h);
5477 evas_object_show(e_comp->autoclose.rect);
5478 evas_object_name_set(e_comp->autoclose.rect, "e_comp->autoclose.rect");
5479 evas_object_color_set(e_comp->autoclose.rect, 0, 0, 0, 0);
5480 evas_object_event_callback_add(e_comp->autoclose.rect, EVAS_CALLBACK_MOUSE_UP, _e_comp_object_autoclose_mouse_up_cb, e_comp);
5481 e_comp_grab_input(0, 1);
5483 evas_object_layer_set(e_comp->autoclose.rect, evas_object_layer_get(obj) - 1);
5484 evas_object_focus_set(obj, 1);
5488 _e_comp_object_autoclose_show(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
5490 _e_comp_object_autoclose_setup(obj);
5491 evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show);
5495 _e_comp_object_autoclose_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
5497 evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show);
5498 _e_comp_object_autoclose_cleanup(1);
5499 if (e_client_focused_get()) return;
5500 if (e_config->focus_policy != E_FOCUS_MOUSE)
5505 e_comp_object_util_autoclose(Evas_Object *obj, E_Comp_Object_Autoclose_Cb del_cb, E_Comp_Object_Key_Cb cb, const void *data)
5509 if (e_comp->autoclose.obj)
5511 if (e_comp->autoclose.obj == obj) return;
5512 evas_object_event_callback_del_full(e_comp->autoclose.obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5513 e_comp->autoclose.obj = obj;
5514 e_comp->autoclose.del_cb = del_cb;
5515 e_comp->autoclose.key_cb = cb;
5516 e_comp->autoclose.data = (void*)data;
5517 if (evas_object_visible_get(obj))
5518 _e_comp_object_autoclose_setup(obj);
5520 evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show, e_comp);
5521 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5524 e_comp->autoclose.obj = obj;
5525 e_comp->autoclose.del_cb = del_cb;
5526 e_comp->autoclose.key_cb = cb;
5527 e_comp->autoclose.data = (void*)data;
5528 if (evas_object_visible_get(obj))
5529 _e_comp_object_autoclose_setup(obj);
5531 evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _e_comp_object_autoclose_show, e_comp);
5532 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, e_comp);
5536 e_comp_object_is_animating(Evas_Object *obj)
5540 return cw->animating;
5544 e_comp_object_alpha_set(Evas_Object *obj, Eina_Bool alpha)
5548 if ((cw->external_content) &&
5549 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
5551 WRN("Can set up alpha value to ONLY evas \"image\" object. "
5552 "But current external content is %d object for %p.",
5553 cw->content_type, cw->ec);
5557 cw->user_alpha_set = EINA_TRUE;
5558 cw->user_alpha = alpha;
5560 if (!cw->obj) return;
5562 if (alpha == evas_object_image_alpha_get(cw->obj)) return;
5564 evas_object_image_alpha_set(cw->obj, alpha);
5566 if ((!cw->native) && (!cw->external_content))
5567 evas_object_image_data_set(cw->obj, NULL);
5571 e_comp_object_alpha_get(Evas_Object *obj)
5573 API_ENTRY EINA_FALSE;
5575 return evas_object_image_alpha_get(cw->obj);
5579 e_comp_object_mask_set(Evas_Object *obj, Eina_Bool set)
5581 Eina_Bool mask_set = EINA_FALSE;
5585 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5586 if (cw->ec->input_only) return;
5593 o = evas_object_rectangle_add(e_comp->evas);
5594 evas_object_color_set(o, 0, 0, 0, 0);
5595 evas_object_clip_set(o, cw->clip);
5596 evas_object_smart_member_add(o, obj);
5597 evas_object_move(o, 0, 0);
5598 evas_object_resize(o, cw->w, cw->h);
5599 /* save render op value to restore when clear a mask.
5601 * NOTE: DO NOT change the render op on ec->frame while mask object
5602 * is set. it will overwrite the changed op value. */
5603 cw->mask.saved_render_op = evas_object_render_op_get(obj);
5604 evas_object_render_op_set(obj, EVAS_RENDER_COPY);
5605 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5606 if (cw->visible) evas_object_show(o);
5609 evas_object_name_set(cw->mask.obj, "cw->mask_obj");
5610 ELOGF("COMP", " |mask_obj", cw->ec);
5611 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_MASK_OBJECT_SET, cw->ec);
5618 evas_object_smart_member_del(cw->mask.obj);
5619 E_FREE_FUNC(cw->mask.obj, evas_object_del);
5621 evas_object_render_op_set(obj, cw->mask.saved_render_op);
5622 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET, cw->ec);
5628 e_comp_object_mask_has(Evas_Object *obj)
5630 API_ENTRY EINA_FALSE;
5632 return (cw->mask.obj) ? EINA_TRUE : EINA_FALSE;
5636 e_comp_object_size_update(Evas_Object *obj, int w, int h)
5641 if ((cw->external_content) &&
5642 (cw->content_type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE))
5644 WRN("Can set up size to ONLY evas \"image\" object. "
5645 "But current external content is %d object for %p.",
5646 cw->content_type, cw->ec);
5650 _e_comp_object_map_transform_rect(cw->ec, 0, 0, w, h, NULL, NULL, &tw, &th);
5652 evas_object_image_size_set(cw->obj, tw, th);
5656 e_comp_object_transform_bg_set(Evas_Object *obj, Eina_Bool set)
5658 Eina_Bool transform_set = EINA_FALSE;
5660 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5661 if (cw->ec->input_only) return;
5663 transform_set = !!set;
5667 if (!cw->transform_bg_obj)
5669 Evas_Object *o = evas_object_rectangle_add(e_comp->evas);
5670 evas_object_move(o, 0, 0);
5671 evas_object_resize(o, 1, 1);
5672 if (cw->transform_bg_color.a >= 255)
5673 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5675 evas_object_render_op_set(o, EVAS_RENDER_BLEND);
5676 evas_object_color_set(o,
5677 cw->transform_bg_color.r,
5678 cw->transform_bg_color.g,
5679 cw->transform_bg_color.b,
5680 cw->transform_bg_color.a);
5681 if (cw->visible) evas_object_show(o);
5683 cw->transform_bg_obj = o;
5684 evas_object_name_set(cw->transform_bg_obj, "cw->transform_bg_obj");
5686 _e_comp_object_transform_obj_stack_update(obj);
5690 if (cw->transform_bg_obj)
5692 evas_object_smart_member_del(cw->transform_bg_obj);
5693 E_FREE_FUNC(cw->transform_bg_obj, evas_object_del);
5699 e_comp_object_transform_bg_color_set(Evas_Object *obj, int r, int g, int b, int a)
5703 cw->transform_bg_color.r = r;
5704 cw->transform_bg_color.g = g;
5705 cw->transform_bg_color.b = b;
5706 cw->transform_bg_color.a = a;
5708 if (cw->transform_bg_obj)
5710 evas_object_color_set(cw->transform_bg_obj,
5711 cw->transform_bg_color.r,
5712 cw->transform_bg_color.g,
5713 cw->transform_bg_color.b,
5714 cw->transform_bg_color.a);
5719 e_comp_object_transform_bg_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
5722 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5723 if (cw->ec->input_only) return;
5724 if (!cw->transform_bg_obj) return;
5726 _e_comp_object_transform_obj_map_set(cw->transform_bg_obj, vertices);
5730 e_comp_object_transform_bg_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
5733 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5734 if (cw->ec->input_only) return;
5735 if (!cw->transform_bg_obj) return;
5737 _e_comp_object_transform_obj_map_set_with_zoom(cw->transform_bg_obj, vertices, zoom);
5741 e_comp_object_transform_transp_set(Evas_Object *obj, Eina_Bool set)
5743 Eina_Bool transform_set = EINA_FALSE;
5745 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5746 if (cw->ec->input_only) return;
5748 transform_set = !!set;
5752 if (!cw->transform_tranp_obj)
5754 Evas_Object *o = evas_object_rectangle_add(e_comp->evas);
5755 evas_object_move(o, 0, 0);
5756 evas_object_resize(o, 1, 1);
5757 evas_object_render_op_set(o, EVAS_RENDER_COPY);
5758 evas_object_color_set(o, 0, 0, 0, 0);
5759 if (cw->visible) evas_object_show(o);
5761 cw->transform_tranp_obj = o;
5762 evas_object_name_set(cw->transform_tranp_obj, "cw->transform_trasp_obj");
5764 _e_comp_object_transform_obj_stack_update(obj);
5768 if (cw->transform_tranp_obj)
5770 evas_object_smart_member_del(cw->transform_tranp_obj);
5771 E_FREE_FUNC(cw->transform_tranp_obj, evas_object_del);
5777 e_comp_object_transform_transp_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
5780 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5781 if (cw->ec->input_only) return;
5782 if (!cw->transform_tranp_obj) return;
5784 _e_comp_object_transform_obj_map_set(cw->transform_tranp_obj, vertices);
5788 e_comp_object_transform_transp_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, E_Util_Transform_Zoom zoom)
5791 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
5792 if (cw->ec->input_only) return;
5793 if (!cw->transform_tranp_obj) return;
5795 _e_comp_object_transform_obj_map_set_with_zoom(cw->transform_tranp_obj, vertices, zoom);
5799 e_comp_object_layer_update(Evas_Object *obj,
5800 Evas_Object *above, Evas_Object *below)
5802 E_Comp_Object *cw2 = NULL;
5803 Evas_Object *o = NULL;
5808 if (cw->ec->layer_block) return;
5809 if ((above) && (below))
5811 ERR("Invalid layer update request! cw=%p", cw);
5819 layer = evas_object_layer_get(o);
5820 cw2 = evas_object_data_get(o, "comp_obj");
5823 if (!e_util_strcmp(evas_object_name_get(o), "layer_obj")) break;
5825 o = evas_object_above_get(o);
5826 if ((!o) || (o == cw->smart_obj)) break;
5827 if (evas_object_layer_get(o) != layer)
5829 o = e_comp->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_ALERT)].obj;
5834 ec = e_client_top_get();
5835 if (ec) o = ec->frame;
5838 if (o) cw2 = evas_object_data_get(o, "comp_obj");
5842 _e_comp_object_layers_remove(cw);
5845 if (cw2->layer > cw->layer)
5846 _e_comp_object_layers_add(cw, NULL, NULL, 0);
5847 else if (cw2->layer == cw->layer)
5850 _e_comp_object_layers_add(cw, cw2, NULL, 0);
5852 _e_comp_object_layers_add(cw, NULL, NULL, above? 0 : 1);
5854 _e_comp_object_layers_add(cw, NULL, cw2, 0);
5857 _e_comp_object_layers_add(cw, NULL, NULL, 1);
5860 _e_comp_object_layers_add(cw, NULL, NULL, 0);
5864 e_comp_object_layer_get(Evas_Object *obj)
5871 e_comp_object_content_set(Evas_Object *obj,
5872 Evas_Object *content,
5873 E_Comp_Object_Content_Type type)
5875 API_ENTRY EINA_FALSE;
5877 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5878 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec->pixmap, EINA_FALSE);
5879 EINA_SAFETY_ON_NULL_RETURN_VAL(content, EINA_FALSE);
5883 ERR("Can't set e.swallow.content to requested content. "
5884 "Previous comp object should not be changed at all.");
5888 if (e_pixmap_usable_get(cw->ec->pixmap)) return EINA_FALSE;
5890 if ((type != E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE) &&
5891 (type != E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE))
5893 ERR("Content type %d for %p is not supported ec:%p pixmap:%p",
5894 type, content, cw->ec, cw->ec->pixmap);
5898 cw->external_content = EINA_TRUE;
5901 cw->content_type = type;
5902 e_util_size_debug_set(cw->obj, 1);
5903 evas_object_name_set(cw->obj, "cw->obj");
5904 _e_comp_object_alpha_set(cw);
5907 _e_comp_object_shadow_setup(cw);
5913 e_comp_object_content_unset(Evas_Object *obj)
5915 API_ENTRY EINA_FALSE;
5917 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
5918 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec->pixmap, EINA_FALSE);
5920 if (!cw->obj && !cw->ec->visible)
5922 ELOGF("COMP", "is not visible yet. no need to unset", cw->ec);
5926 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE)
5928 ELOGF("COMP", "has been set to internal image object already", cw->ec);
5934 if (cw->frame_object)
5935 edje_object_part_unswallow(cw->frame_object, cw->obj);
5937 edje_object_part_unswallow(cw->shobj, cw->obj);
5939 evas_object_del(cw->obj);
5940 evas_object_hide(cw->obj);
5944 cw->external_content = EINA_FALSE;
5945 if (cw->ec->is_cursor)
5948 DBG("%p is cursor surface..", cw->ec);
5949 if (!e_pixmap_size_get(cw->ec->pixmap, &pw, &ph))
5951 evas_object_resize(cw->ec->frame, pw, ph);
5952 evas_object_hide(cw->ec->frame);
5957 cw->content_type = E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE;
5958 cw->obj = evas_object_image_filled_add(e_comp->evas);
5959 evas_object_image_border_center_fill_set(cw->obj, EVAS_BORDER_FILL_SOLID);
5960 e_util_size_debug_set(cw->obj, 1);
5961 evas_object_image_pixels_get_callback_set(cw->obj, _e_comp_object_pixels_get, cw);
5962 evas_object_image_pixels_noti_callback_set(cw->obj, _e_comp_object_pixels_noti, cw);
5963 evas_object_image_smooth_scale_set(cw->obj, e_comp_config_get()->smooth_windows);
5964 evas_object_name_set(cw->obj, "cw->obj");
5965 evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888);
5966 _e_comp_object_alpha_set(cw);
5969 _e_comp_object_shadow_setup(cw);
5974 _e_comp_intercept_show_helper(cw);
5978 e_comp_object_damage(cw->smart_obj, 0, 0, cw->w, cw->h);
5979 e_comp_object_dirty(cw->smart_obj);
5980 e_comp_object_render(cw->smart_obj);
5981 e_comp_object_render_update_add(obj);
5986 EINTERN Evas_Object *
5987 e_comp_object_content_get(Evas_Object *obj)
5991 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, NULL);
5993 if (cw->content_type == E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE)
5995 ELOGF("COMP", "has been set to internal image object. couldn't return internal image object", cw->ec);
6002 E_API E_Comp_Object_Content_Type
6003 e_comp_object_content_type_get(Evas_Object *obj)
6005 API_ENTRY E_COMP_OBJECT_CONTENT_TYPE_NONE;
6007 return cw->content_type;
6011 e_comp_object_dim_mask_update(Evas_Object *obj, Eina_Bool mask_set, int x, int y, int w, int h)
6014 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
6015 E_Comp_Config *conf = e_comp_config_get();
6016 if (cw->ec->input_only) return;
6017 if (!conf->dim_rect_enable) return;
6019 cw->dim.mask_set = mask_set;
6025 if (!cw->dim.enable) return;
6026 e_comp_object_dim_mask_set(cw->ec->frame, mask_set);
6030 e_comp_object_dim_mask_set(Evas_Object *obj, Eina_Bool set)
6032 Eina_Bool mask_set = EINA_FALSE;
6036 EINA_SAFETY_ON_NULL_RETURN(cw->ec);
6037 E_Comp_Config *conf = e_comp_config_get();
6038 if (cw->ec->input_only) return;
6039 if (!conf->dim_rect_enable) return;
6045 if (cw->dim.mask_obj)
6047 evas_object_smart_member_del(cw->dim.mask_obj);
6048 E_FREE_FUNC(cw->dim.mask_obj, evas_object_del);
6051 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);
6052 o = evas_object_rectangle_add(e_comp->evas);
6053 evas_object_color_set(o, 0, 0, 0, 0);
6054 evas_object_smart_member_add(o, obj);
6055 evas_object_resize(o, cw->dim.mask_w, cw->dim.mask_h);
6056 evas_object_move(o, cw->dim.mask_x, cw->dim.mask_y);
6058 evas_object_render_op_set(o, EVAS_RENDER_COPY);
6059 if (cw->visible) evas_object_show(o);
6061 cw->dim.mask_obj = o;
6062 evas_object_name_set(cw->dim.mask_obj, "cw->dim_mask_obj");
6064 evas_object_layer_set(cw->dim.mask_obj, 9998);
6068 if (cw->dim.mask_obj)
6070 ELOGF("COMP", "DIM |Mask on Dim rect Removed", cw->ec);
6071 evas_object_smart_member_del(cw->dim.mask_obj);
6072 E_FREE_FUNC(cw->dim.mask_obj, evas_object_del);
6078 e_comp_object_dim_client_set(E_Client *ec)
6080 E_Comp_Config *conf = e_comp_config_get();
6082 if (!conf->dim_rect_enable) return ;
6083 if (dim_client == ec) return;
6085 Eina_Bool prev_dim = EINA_FALSE;
6086 ELOGF("COMP", "DIM |Client Set %p -> %p", ec, dim_client, ec);
6088 if (dim_client && _e_comp_object_dim_enable_get(dim_client, dim_client->frame))
6089 prev_dim = EINA_TRUE;
6091 if (prev_dim && dim_client->visible && ec)
6093 _e_comp_object_dim_enable_set(dim_client, dim_client->frame, EINA_FALSE, EINA_TRUE);
6094 _e_comp_object_dim_enable_set(ec, ec->frame, EINA_TRUE, EINA_TRUE);
6098 if (prev_dim) _e_comp_object_dim_enable_set(dim_client, dim_client->frame, EINA_FALSE, EINA_FALSE);
6099 if (ec) _e_comp_object_dim_enable_set(ec, ec->frame, EINA_TRUE, EINA_FALSE);
6105 e_comp_object_dim_client_get(void)
6107 E_Comp_Config *conf = e_comp_config_get();
6109 if (!conf->dim_rect_enable ) return NULL;
6115 _e_comp_object_dim_enable_set(E_Client *ec, Evas_Object *obj, Eina_Bool enable, Eina_Bool noeffect)
6118 char emit[32] = "\0";
6119 E_Comp_Config *conf = e_comp_config_get();
6122 if (!conf->dim_rect_enable) return;
6123 if (!cw->effect_obj) return;
6124 if (enable == cw->dim.enable) return;
6126 ELOGF("COMP", "DIM |set on Client [%d]", ec, enable);
6127 if (noeffect || !conf->dim_rect_effect)
6129 strncpy(emit, (enable ? "e,state,dim,on,noeffect" : "e,state,dim,off,noeffect"), sizeof(emit) - 1);
6133 strncpy(emit, (enable ? "e,state,dim,on" : "e,state,dim,off"), sizeof(emit) - 1);
6136 cw->dim.enable = enable;
6138 if (cw->dim.mask_set && !enable)
6140 e_comp_object_dim_mask_set(cw->ec->frame, enable);
6141 edje_object_signal_emit(cw->effect_obj, emit, "e");
6143 else if (cw->dim.mask_set && enable)
6145 edje_object_signal_emit(cw->effect_obj, emit, "e");
6146 e_comp_object_dim_mask_set(cw->ec->frame, enable);
6150 edje_object_signal_emit(cw->effect_obj, emit, "e");
6155 _e_comp_object_dim_enable_get(E_Client *ec, Evas_Object *obj)
6157 API_ENTRY EINA_FALSE;
6158 E_Comp_Config *conf = e_comp_config_get();
6160 if (!ec) return EINA_FALSE;
6161 if (!conf->dim_rect_enable) return EINA_FALSE;
6163 if (cw->dim.enable) return EINA_TRUE;
6169 _e_comp_object_dim_update(E_Comp_Object *cw)
6171 E_Comp_Config *conf = e_comp_config_get();
6174 if (!conf->dim_rect_enable) return;
6175 if (!cw->effect_obj) return;
6178 edje_object_signal_emit(cw->effect_obj, (cw->dim.enable ? "e,state,dim,on,noeffect" : "e,state,dim,off,noeffect"), "e");
6179 ELOGF("COMP", "DIM |Applied on Client dim.enable[%d]", cw->ec, cw->dim.enable);
6181 if (cw->dim.mask_set)
6183 e_comp_object_dim_mask_set(cw->ec->frame, cw->dim.mask_set);
6189 e_comp_object_clear(Evas_Object *obj)
6193 _e_comp_object_clear(cw);
6197 e_comp_object_hwc_update_exists(Evas_Object *obj)
6199 API_ENTRY EINA_FALSE;
6200 return cw->hwc_need_update;
6205 e_comp_object_hwc_update_set(Evas_Object *obj, Eina_Bool set)
6208 cw->hwc_need_update = set;
6212 e_comp_object_effect_object_part_swallow(Evas_Object *obj, const char *part_name, Evas_Object *swallow_obj)
6214 API_ENTRY EINA_FALSE;
6215 return edje_object_part_swallow(cw->effect_obj, part_name, swallow_obj);
6219 e_comp_object_indicator_swallow(Evas_Object *obj, Evas_Object *indicator)
6222 if (cw->indicator.obj != indicator)
6223 edje_object_part_unswallow(cw->shobj, cw->indicator.obj);
6224 cw->indicator.obj = indicator;
6225 edje_object_part_swallow(cw->shobj, "e.swallow.indicator", indicator);
6229 e_comp_object_indicator_unswallow(Evas_Object *obj, Evas_Object *indicator)
6232 if (cw->indicator.obj != indicator) return;
6233 cw->indicator.obj = NULL;
6234 edje_object_part_unswallow(cw->shobj, indicator);
6238 e_comp_object_indicator_size_set(Evas_Object *obj, int w, int h)
6241 Edje_Message_Int_Set *msg;
6243 if (!cw->indicator.obj) return;
6245 cw->indicator.w = w;
6246 cw->indicator.h = h;
6248 if (!cw->shobj) return;
6250 msg = alloca(sizeof(Edje_Message_Int_Set) + (sizeof(int)));
6254 edje_object_message_send(cw->shobj, EDJE_MESSAGE_INT_SET, 0, msg);
6255 edje_object_message_signal_process(cw->shobj);
6258 /* buffer transform and scale are applied to e_comp_object and e_pixmap internaly */
6260 e_comp_object_map_update(Evas_Object *obj)
6263 E_Client *ec = cw->ec;
6264 E_Comp_Wl_Client_Data *cdata;
6266 int x1, y1, x2, y2, x, y, bw, bh, tw, th;
6269 int l, remain = sizeof buffer;
6272 if (e_object_is_del(E_OBJECT(ec))) return;
6273 cdata = e_client_cdata_get(ec);
6276 /* if buffer had been flushed, buffer could be NULL. Then map will be applied
6277 * when new buffer is attached.
6279 if (!cdata->buffer_ref.buffer) return;
6281 if ((!cw->redirected) ||
6282 (e_client_video_hw_composition_check(ec)) ||
6283 (!e_comp_wl_output_buffer_transform_get(ec) &&
6284 cdata->scaler.buffer_viewport.buffer.scale == 1))
6286 if (evas_object_map_enable_get(cw->effect_obj))
6288 ELOGF("TRANSFORM", "map: disable", cw->ec);
6289 evas_object_map_enable_set(cw->effect_obj, EINA_FALSE);
6290 _e_comp_object_map_transform_rect(cw->ec, 0, 0, cw->w, cw->h, NULL, NULL, &tw, &th);
6291 evas_object_resize(cw->effect_obj, tw, th);
6298 EINA_SAFETY_ON_NULL_RETURN(map);
6300 e_pixmap_size_get(ec->pixmap, &bw, &bh);
6306 e_map_util_points_populate_from_geometry(map, ec->x, ec->y, bw, bh, 0);
6308 _e_comp_object_map_transform_pos(ec, x1, y1, &x, &y);
6309 e_map_point_image_uv_set(map, 0, x, y);
6310 l = snprintf(p, remain, "%d,%d", x, y);
6311 p += l, remain -= l;
6313 _e_comp_object_map_transform_pos(ec, x2, y1, &x, &y);
6314 e_map_point_image_uv_set(map, 1, x, y);
6315 l = snprintf(p, remain, " %d,%d", x, y);
6316 p += l, remain -= l;
6318 _e_comp_object_map_transform_pos(ec, x2, y2, &x, &y);
6319 e_map_point_image_uv_set(map, 2, x, y);
6320 l = snprintf(p, remain, " %d,%d", x, y);
6321 p += l, remain -= l;
6323 _e_comp_object_map_transform_pos(ec, x1, y2, &x, &y);
6324 e_map_point_image_uv_set(map, 3, x, y);
6325 l = snprintf(p, remain, " %d,%d", x, y);
6326 p += l, remain -= l;
6328 ELOGF("TRANSFORM", "map: point(%d,%d %dx%d) uv(%d,%d %d,%d %d,%d %d,%d=>%s)",
6330 ec->x, ec->y, bw, bh, x1, y1, x2, y1, x2, y2, x1, y2, buffer);
6332 e_comp_object_map_set(cw->effect_obj, map);
6333 e_comp_object_map_enable_set(cw->effect_obj, EINA_TRUE);
6337 /* if there's screen rotation with comp mode, then ec->effect_obj and
6338 * ec->obj should rotate. if not, in evas_map, update region is clipped.
6340 _e_comp_object_map_transform_rect(cw->ec, 0, 0, bw, bh, NULL, NULL, &tw, &th);
6341 evas_object_resize(cw->effect_obj, tw, th);
6345 e_comp_object_render_trace_set(Evas_Object *obj, Eina_Bool set)
6347 API_ENTRY EINA_FALSE;
6349 cw->render_trace = set;
6355 e_comp_object_native_usable_get(Evas_Object *obj)
6357 API_ENTRY EINA_FALSE;
6358 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6360 if (cw->ec->input_only) return EINA_FALSE;
6361 if (cw->external_content) return EINA_FALSE;
6362 if (e_comp_object_content_type_get(cw->ec->frame) != E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE) return EINA_FALSE;
6364 /* just return true value, if it is normal case */
6365 if (e_pixmap_usable_get(cw->ec->pixmap)) return EINA_TRUE;
6368 Evas_Native_Surface *ns;
6369 ns = evas_object_image_native_surface_get(cw->obj);
6371 /* client pixmap is not usable but cw->obj is drawable due to it holds valid native surface*/
6374 ELOGF("COMP", "Client pixmap is Not usable but still holds valid native surface", cw->ec);
6382 e_comp_object_image_filter_set(Evas_Object *obj, E_Comp_Image_Filter filter)
6384 API_ENTRY EINA_FALSE;
6385 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6386 if (e_object_is_del(E_OBJECT(cw->ec))) return EINA_FALSE;
6387 if (!e_client_cdata_get(cw->ec)) return EINA_FALSE;
6391 case E_COMP_IMAGE_FILTER_BLUR:
6392 efl_gfx_filter_program_set(cw->obj, "blur (20) padding_set (0)", "image_filter");
6394 case E_COMP_IMAGE_FILTER_GRAYSCALE:
6395 efl_gfx_filter_program_set(cw->obj, "grayscale ()", "image_filter");
6397 case E_COMP_IMAGE_FILTER_INVERSE:
6398 efl_gfx_filter_program_set(cw->obj, "inverse_color ()", "image_filter");
6400 case E_COMP_IMAGE_FILTER_NONE:
6402 efl_gfx_filter_program_set(cw->obj, NULL, "image_filter");
6406 cw->image_filter = filter;
6411 EINTERN E_Comp_Image_Filter
6412 e_comp_object_image_filter_get(Evas_Object *obj)
6414 API_ENTRY E_COMP_IMAGE_FILTER_NONE;
6415 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, E_COMP_IMAGE_FILTER_NONE);
6416 if (e_object_is_del(E_OBJECT(cw->ec))) return E_COMP_IMAGE_FILTER_NONE;
6417 if (!e_client_cdata_get(cw->ec)) return E_COMP_IMAGE_FILTER_NONE;
6419 return cw->image_filter;
6423 _e_comp_object_damage_trace_render_pre_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
6427 if (!_damage_trace) return;
6429 EINA_LIST_FREE(_damage_trace_post_objs, obj)
6430 evas_object_del(obj);
6432 _damage_trace_post_objs = NULL;
6436 _e_comp_object_damage_trace_render_post_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
6438 if (!_damage_trace) return;
6440 _damage_trace_post_objs = _damage_trace_objs;
6441 _damage_trace_objs = NULL;
6445 e_comp_object_damage_trace_debug(Eina_Bool onoff)
6447 if (_damage_trace == onoff) return;
6451 evas_event_callback_add(e_comp->evas,
6452 EVAS_CALLBACK_RENDER_PRE,
6453 _e_comp_object_damage_trace_render_pre_cb,
6456 evas_event_callback_add(e_comp->evas,
6457 EVAS_CALLBACK_RENDER_POST,
6458 _e_comp_object_damage_trace_render_post_cb,
6465 EINA_LIST_FREE(_damage_trace_objs, obj)
6466 evas_object_del(obj);
6468 _damage_trace_objs = NULL;
6470 EINA_LIST_FREE(_damage_trace_post_objs, obj)
6471 evas_object_del(obj);
6473 _damage_trace_post_objs = NULL;
6475 evas_event_callback_del(e_comp->evas,
6476 EVAS_CALLBACK_RENDER_PRE,
6477 _e_comp_object_damage_trace_render_pre_cb);
6479 evas_event_callback_del(e_comp->evas,
6480 EVAS_CALLBACK_RENDER_POST,
6481 _e_comp_object_damage_trace_render_post_cb);
6484 _damage_trace = onoff;
6488 e_comp_object_redirected_get(Evas_Object *obj)
6490 API_ENTRY EINA_FALSE;
6491 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6493 return cw->redirected;
6497 e_comp_object_color_visible_get(Evas_Object *obj)
6499 API_ENTRY EINA_FALSE;
6502 EINA_SAFETY_ON_NULL_RETURN_VAL(cw->ec, EINA_FALSE);
6504 e_comp_object_color_get(obj, NULL, NULL, NULL, &a);
6508 evas_object_color_get(cw->effect_obj, NULL, NULL, NULL, &a);
6512 evas_object_color_get(cw->shobj, NULL, NULL, NULL, &a);
6516 evas_object_color_get(cw->obj, NULL, NULL, NULL, &a);
6524 e_comp_object_map_set(Evas_Object *obj, E_Map *em)
6526 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
6528 return e_map_set_to_comp_object(em, obj);
6532 e_comp_object_map_get(const Evas_Object *obj)
6534 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
6536 return e_map_get_from_comp_object(obj);
6540 e_comp_object_map_enable_set(Evas_Object *obj, Eina_Bool enable)
6542 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
6544 evas_object_map_enable_set(obj, enable);
6550 e_comp_object_render_update_lock(Evas_Object *obj)
6552 E_Comp_Wl_Buffer *buffer;
6553 struct wayland_tbm_client_queue *cqueue;
6555 API_ENTRY EINA_FALSE;
6557 if (cw->render_update_lock.lock == 0)
6559 _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET, cw->ec);
6561 buffer = e_pixmap_resource_get(cw->ec->pixmap);
6562 if ((buffer) && (buffer->resource))
6564 cqueue = e_comp_wl_tbm_client_queue_get(cw->ec);
6566 wayland_tbm_server_client_queue_flush(cqueue);
6569 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, buffer);
6570 e_comp_object_render_update_del(obj);
6572 ELOGF("COMP", "Render update lock enabled", cw->ec);
6575 cw->render_update_lock.lock++;
6581 e_comp_object_render_update_unlock(Evas_Object *obj)
6585 if (cw->render_update_lock.lock == 0)
6588 cw->render_update_lock.lock--;
6590 if (cw->render_update_lock.lock == 0)
6593 if (cw->render_update_lock.pending_move_set)
6595 evas_object_move(obj,
6596 cw->render_update_lock.pending_move_x,
6597 cw->render_update_lock.pending_move_y);
6598 cw->render_update_lock.pending_move_x = 0;
6599 cw->render_update_lock.pending_move_y = 0;
6600 cw->render_update_lock.pending_move_set = EINA_FALSE;
6603 if (cw->render_update_lock.pending_resize_set)
6605 evas_object_resize(obj,
6606 cw->render_update_lock.pending_resize_w,
6607 cw->render_update_lock.pending_resize_h);
6608 cw->render_update_lock.pending_resize_w = 0;
6609 cw->render_update_lock.pending_resize_h = 0;
6610 cw->render_update_lock.pending_resize_set = EINA_FALSE;
6613 e_comp_wl_buffer_reference(&cw->render_update_lock.buffer_ref, NULL);
6615 if ((cw->ec->exp_iconify.buffer_flush) &&
6616 (e_policy_visibility_client_is_iconic(cw->ec)) &&
6617 (cw->ec->comp_data) && (!cw->ec->comp_data->buffer_ref.buffer))
6618 e_comp_object_clear(obj);
6620 e_comp_object_render_update_add(obj);
6622 ELOGF("COMP", "Render update lock disabled", cw->ec);
6627 e_comp_object_render_update_lock_get(Evas_Object *obj)
6629 API_ENTRY EINA_FALSE;
6631 if (cw->render_update_lock.lock > 0)
6638 e_comp_object_color_get(Evas_Object *obj, int *r, int *g, int *b, int *a)
6642 if (cw->transparent.set)
6644 if (r) *r = cw->transparent.user_r;
6645 if (g) *g = cw->transparent.user_g;
6646 if (b) *b = cw->transparent.user_b;
6647 if (a) *a = cw->transparent.user_a;
6651 evas_object_color_get(obj, r, g, b, a);
6656 e_comp_object_render_op_set(Evas_Object *obj, Evas_Render_Op op)
6660 evas_object_render_op_set(cw->obj, op);
6663 EINTERN Evas_Render_Op
6664 e_comp_object_render_op_get(Evas_Object *obj)
6666 API_ENTRY EVAS_RENDER_BLEND;
6668 return evas_object_render_op_get(cw->obj);