2 #include "e_client_intern.h"
3 #include "e_comp_object_intern.h"
5 #include <libds-tizen/screen.h>
7 typedef struct _E_Desk_Area_Private E_Desk_Area_Private;
8 typedef struct _E_Desk_Area_Private_Client E_Desk_Area_Private_Client;
10 #define PRI(eda) ((E_Desk_Area_Private *)e_object_data_get(E_OBJECT(eda)))
13 EINA_SAFETY_ON_NULL_RETURN(eda); \
14 E_Desk_Area_Private *priv = PRI(eda)
16 #define API_ENTRY_VAL(ret) \
17 EINA_SAFETY_ON_NULL_RETURN_VAL(eda, ret); \
18 E_Desk_Area_Private *priv = PRI(eda)
20 #ifdef REFACTOR_DESK_AREA
21 typedef struct _E_Desk_Area_Smart_Data E_Desk_Area_Smart_Data;
22 typedef void (*E_Desk_Area_Stack_Func)(Evas_Object *obj, Evas_Object *stack);
24 #define E_DESK_AREA_SMART_DATA_GET(obj, ptr) \
25 E_Desk_Area_Smart_Data *ptr = evas_object_smart_data_get(obj);
27 #define E_DESK_AREA_SMART_DATA_GET_OR_RETURN(obj, ptr) \
28 E_DESK_AREA_SMART_DATA_GET(obj, ptr); \
32 static int _e_desk_area_hooks_delete = 0;
33 static int _e_desk_area_hooks_walking = 0;
35 static Eina_Inlist *_e_desk_area_hooks[] =
37 [E_DESK_AREA_HOOK_SET_APPID] = NULL,
40 struct _E_Desk_Area_Private
44 struct ds_tizen_splitscreen_region *splitscreen_region;
45 struct wl_listener splitscreen_region_destroy;
46 struct wl_listener splitscreen_region_assign_appid;
49 struct _E_Desk_Area_Private_Client
55 struct wl_listener client_get_above;
56 struct wl_listener client_get_below;
57 struct wl_listener client_subsurface_stack_update;
59 // comp_object listeners
60 struct wl_listener comp_object_raise;
61 struct wl_listener comp_object_lower;
62 struct wl_listener comp_object_set_layer;
63 struct wl_listener comp_object_stack_above;
64 struct wl_listener comp_object_stack_below;
67 #ifdef REFACTOR_DESK_AREA
68 struct _E_Desk_Area_Smart_Data
70 Evas_Object_Smart_Clipped_Data base;
79 struct _E_Desk_Area_Hook
82 E_Desk_Area_Hook_Point hookpoint;
83 E_Desk_Area_Hook_Cb func;
85 unsigned char delete_me : 1;
88 static void _e_desk_area_hooks_clean(void);
89 static Eina_Bool _e_desk_area_hook_call(E_Desk_Area_Hook_Point hookpoint, E_Desk_Area *desk_area, void *appid);
91 #ifdef REFACTOR_DESK_AREA
92 EVAS_SMART_SUBCLASS_NEW(E_DESK_AREA_SMART_OBJ_TYPE, _e_desk_area,
93 Evas_Smart_Class, Evas_Smart_Class,
94 evas_object_smart_clipped_class_get, NULL)
97 #ifdef REFACTOR_DESK_AREA
100 _check_desk_area_client_layer_validation(E_Desk_Area_Client_Layer edgc_layer)
102 if ((edgc_layer >= E_DESK_AREA_CLIENT_LAYER_DESKTOP) &&
103 (edgc_layer < E_DESK_AREA_CLIENT_LAYER_MAX))
110 _e_desk_area_ec_prepend(E_Desk_Area *eda, E_Client *ec)
112 E_Desk_Area_Client_Layer edgc_layer;
114 edgc_layer = e_client_desk_area_client_layer_get(ec);
115 if (!_check_desk_area_client_layer_validation(edgc_layer)) return;
117 eda->ec_lists[edgc_layer] = eina_list_remove(eda->ec_lists[edgc_layer], ec);
118 eda->ec_lists[edgc_layer] = eina_list_prepend(eda->ec_lists[edgc_layer], ec);
120 e_client_desk_area_client_layer_set(ec, edgc_layer);
124 _e_desk_area_ec_append(E_Desk_Area *eda, E_Client *ec)
126 E_Desk_Area_Client_Layer edgc_layer;
128 edgc_layer = e_client_desk_area_client_layer_get(ec);
129 if (!_check_desk_area_client_layer_validation(edgc_layer)) return;
131 eda->ec_lists[edgc_layer] = eina_list_remove(eda->ec_lists[edgc_layer], ec);
132 eda->ec_lists[edgc_layer] = eina_list_append(eda->ec_lists[edgc_layer], ec);
134 e_client_desk_area_client_layer_set(ec, edgc_layer);
138 _e_desk_area_ec_prepend_relative(E_Desk_Area *eda, E_Client *ec, E_Client *above)
140 E_Desk_Area_Client_Layer edgc_layer;
141 E_Desk_Area_Client_Layer above_edgc_layer;
143 // update eda's ec_list order
144 edgc_layer = e_client_desk_area_client_layer_get(ec);
145 if (!_check_desk_area_client_layer_validation(edgc_layer)) return;
146 above_edgc_layer = e_client_desk_area_client_layer_get(above);
147 if (!_check_desk_area_client_layer_validation(above_edgc_layer)) return;
149 ELOGF("EDG", "STACK_ABOVE... eda:%p. layer:%d, above(win:%zx, ec:%p, layer:%d)", ec, eda, edgc_layer, e_client_util_win_get(above), above, above_edgc_layer);
151 if (edgc_layer == above_edgc_layer)
153 eda->ec_lists[edgc_layer] = eina_list_remove(eda->ec_lists[edgc_layer], ec);
154 eda->ec_lists[edgc_layer] = eina_list_prepend_relative(eda->ec_lists[edgc_layer], ec, above);
158 eda->ec_lists[edgc_layer] = eina_list_remove(eda->ec_lists[edgc_layer], ec);
159 eda->ec_lists[above_edgc_layer] = eina_list_prepend_relative(eda->ec_lists[above_edgc_layer], ec, above);
162 e_client_desk_area_client_layer_set(ec, above_edgc_layer);
166 _e_desk_area_ec_append_relative(E_Desk_Area *eda, E_Client *ec, E_Client *below)
168 E_Desk_Area_Client_Layer edgc_layer;
169 E_Desk_Area_Client_Layer below_edgc_layer;
171 // update eda's ec_list order
172 edgc_layer = e_client_desk_area_client_layer_get(ec);
173 if (!_check_desk_area_client_layer_validation(edgc_layer)) return;
174 below_edgc_layer = e_client_desk_area_client_layer_get(below);
175 if (!_check_desk_area_client_layer_validation(below_edgc_layer)) return;
177 ELOGF("EDG", "STACK_BELOW... eda:%p. layer:%d, below(win:%zx, ec:%p, layer:%d)", ec, eda, edgc_layer, e_client_util_win_get(below), below, below_edgc_layer);
179 if (edgc_layer == below_edgc_layer)
181 eda->ec_lists[edgc_layer] = eina_list_remove(eda->ec_lists[edgc_layer], ec);
182 eda->ec_lists[edgc_layer] = eina_list_append_relative(eda->ec_lists[edgc_layer], ec, below);
186 eda->ec_lists[edgc_layer] = eina_list_remove(eda->ec_lists[edgc_layer], ec);
187 eda->ec_lists[below_edgc_layer] = eina_list_append_relative(eda->ec_lists[below_edgc_layer], ec, below);
190 e_client_desk_area_client_layer_set(ec, below_edgc_layer);
195 _e_desk_geometry_info_set(E_Desk_Area *eda, int x, int y, int w, int h)
200 if (!eda->desk) return;
209 eda->scale_w = (double)w / (double)desk->geom.w;
210 eda->scale_h = (double)h / (double)desk->geom.h;
214 _e_desk_area_active_change(E_Desk_Area *eda, E_Desk *desk)
216 E_Desk_Area *prev_active_edg;
220 prev_active_edg = e_desk_desk_area_active_get(desk);
221 if (prev_active_edg == eda) return;
223 // 1. reset current active eda info
225 prev_active_edg->active = EINA_FALSE;
227 // 2. set new active eda info
230 eda->active = EINA_TRUE;
231 e_desk_desk_area_active_set(desk, eda);
235 e_desk_desk_area_active_set(desk, NULL);
240 _e_desk_area_cb_hook_subsurface_create(void *data, E_Client *ec)
242 EINA_SAFETY_ON_NULL_RETURN(ec);
244 if (ec->desk_area.transform)
246 e_client_transform_core_remove(ec, ec->desk_area.transform);
251 e_desk_area_init(void)
257 e_desk_area_shutdown(void)
263 _e_desk_area_private_init(E_Desk_Area *eda)
265 E_Desk_Area_Private *priv;
267 priv = E_NEW(E_Desk_Area_Private, 1);
273 e_object_data_set(E_OBJECT(eda), priv);
279 _e_desk_area_private_finish(E_Desk_Area *eda)
281 E_Desk_Area_Private *priv;
285 wl_list_remove(&priv->splitscreen_region_assign_appid.link);
286 wl_list_remove(&priv->splitscreen_region_destroy.link);
288 e_object_data_set(E_OBJECT(eda), NULL);
296 _e_desk_area_free(E_Desk_Area *eda)
298 #ifdef REFACTOR_DESK_AREA
300 for (int i = 0; i < E_DESK_AREA_CLIENT_LAYER_MAX; i++)
302 eina_list_free(eda->ec_lists[i]);
306 _e_desk_area_active_change(NULL, eda->desk);
309 E_FREE_FUNC(eda->hook_subsurf_create, e_comp_wl_hook_del);
311 _e_desk_area_private_finish(eda);
315 #ifdef REFACTOR_DESK_AREA
317 _e_desk_area_smart_add(Evas_Object *obj)
319 EVAS_SMART_DATA_ALLOC(obj, E_Desk_Area_Smart_Data);
321 _e_desk_area_parent_sc->add(obj);
325 _e_desk_area_smart_del(Evas_Object *obj)
327 _e_desk_area_parent_sc->del(obj);
329 E_DESK_AREA_SMART_DATA_GET_OR_RETURN(obj, sd);
331 E_FREE_LIST(sd->handlers, ecore_event_handler_del);
332 eina_list_free(sd->clients);
335 evas_object_smart_data_set(obj, NULL);
339 _e_desk_area_smart_member_add(Evas_Object *obj, Evas_Object *child)
341 _e_desk_area_parent_sc->member_add(obj, child);
345 _e_desk_area_smart_member_del(Evas_Object *obj, Evas_Object *child)
347 _e_desk_area_parent_sc->member_del(obj, child);
351 _e_desk_area_smart_set_user(Evas_Smart_Class *sc)
353 sc->add = _e_desk_area_smart_add;
354 sc->del = _e_desk_area_smart_del;
355 sc->member_add = _e_desk_area_smart_member_add;
356 sc->member_del = _e_desk_area_smart_member_del;
360 _desk_area_cb_client_get_above(struct wl_listener *listener, void *data)
362 E_Desk_Area_Private_Client *eda_client;
363 E_Client_Data_Get_Above *get_above_data = data;
368 eda_client = wl_container_of(listener, eda_client, client_get_above);
370 eda = eda_client->eda;
372 if (EINA_INLIST_GET(ec)->next) //check current layer
374 EINA_INLIST_FOREACH(EINA_INLIST_GET(ec)->next, ec2)
378 ELOGF("FATAL", "CHECK the ec inlist next", ec);
381 if (!e_object_is_del(E_OBJECT(ec2)))
383 get_above_data->above_ec = ec2;
389 if (ec->layer == E_LAYER_CLIENT_CURSOR) return;
390 if (e_comp_canvas_client_layer_map(ec->layer) == 9999) return;
392 g_rec_mutex_lock(&e_comp->ec_list_mutex);
394 /* go up the layers until we find one */
395 for (x = e_comp_canvas_layer_map(ec->layer) + 1; x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
397 if (!e_comp->layers[x].clients) continue;
399 EINA_INLIST_FOREACH(e_comp->layers[x].clients, ec2)
403 ELOGF("FATAL", "[eda:%p] EC exist above layer. ec layer_map:%d, cur layer_map:%d",
404 ec, eda, e_comp_canvas_layer_map(ec->layer), x);
407 if (!e_object_is_del(E_OBJECT(ec2)))
409 get_above_data->above_ec = ec2;
410 g_rec_mutex_unlock(&e_comp->ec_list_mutex);
416 g_rec_mutex_unlock(&e_comp->ec_list_mutex);
420 _desk_area_cb_client_get_below(struct wl_listener *listener, void *data)
422 E_Desk_Area_Private_Client *eda_client;
423 E_Client_Data_Get_Below *get_below_data = data;
428 E_Layer ec_layer, ec_layer_cw;
431 eda_client = wl_container_of(listener, eda_client, client_get_below);
433 eda = eda_client->eda;
435 if (EINA_INLIST_GET(ec)->prev) //check current layer
437 for (l = EINA_INLIST_GET(ec)->prev; l; l = l->prev)
439 ec2 = EINA_INLIST_CONTAINER_GET(l, E_Client);
442 ELOGF("FATAL", "CHECK the ec inlist prev", ec);
445 if (!e_object_is_del(E_OBJECT(ec2)))
447 get_below_data->below_ec = ec2;
453 // check layer validation
454 ec_layer = ec->layer;
455 if (ec->layer_block || ec->layer_pending)
457 cw_layer = e_comp_object_layer_get(ec->frame);
460 ec_layer_cw = e_comp_canvas_layer_map_to(cw_layer);
461 if (ec_layer != ec_layer_cw)
463 ELOGF("EDA", "[eda:%p] LAYER is not same. USE obj layer! (ec->layer:%d, obj:%d). block:%d, pending:%d)",
464 ec, eda, ec_layer, ec_layer_cw, ec->layer_block, ec->layer_pending);
465 ec_layer = ec_layer_cw;
470 if (ec_layer == E_LAYER_CLIENT_DESKTOP) return;
471 if (e_comp_canvas_client_layer_map(ec_layer) == 9999) return;
473 /* go down the layers until we find one */
474 x = e_comp_canvas_layer_map(ec_layer);
477 g_rec_mutex_lock(&e_comp->ec_list_mutex);
479 for (; x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
481 if (!e_comp->layers[x].clients) continue;
483 EINA_INLIST_REVERSE_FOREACH(e_comp->layers[x].clients, ec2)
487 ELOGF("FATAL", "[eda:%p] EC exist below layer. ec layer_map:%d, cur layer_map:%d",
488 ec, eda, e_comp_canvas_layer_map(ec_layer), x);
491 if (!e_object_is_del(E_OBJECT(ec2)))
493 get_below_data->below_ec = ec2;
494 g_rec_mutex_unlock(&e_comp->ec_list_mutex);
500 g_rec_mutex_unlock(&e_comp->ec_list_mutex);
504 _desk_area_cb_client_subsurface_stack_update(struct wl_listener *listener, void *data)
509 _desk_area_cb_comp_object_lower(struct wl_listener *listener, void *data)
515 _desk_area_cb_comp_object_raise(struct wl_listener *listener, void *data)
521 _desk_area_cb_comp_object_set_layer(struct wl_listener *listener, void *data)
527 _desk_area_cb_comp_object_stack_above(struct wl_listener *listener, void *data)
533 _desk_area_cb_comp_object_stack_below(struct wl_listener *listener, void *data)
539 _desk_area_smart_client_find(E_Desk_Area_Smart_Data *sd, E_Client *ec)
544 EINA_LIST_FOREACH(sd->clients, l, temp_ec)
546 if (temp_ec == ec) return EINA_TRUE;
553 _e_desk_area_smart_client_add(Evas_Object *obj, E_Client *ec)
555 E_DESK_AREA_SMART_DATA_GET_OR_RETURN(obj, sd);
557 if (_desk_area_smart_client_find(sd, ec))
560 sd->clients = eina_list_append(sd->clients, ec);
562 evas_object_smart_changed(obj);
566 _e_desk_area_smart_client_del(Evas_Object *obj, E_Client *ec)
568 E_DESK_AREA_SMART_DATA_GET_OR_RETURN(obj, sd);
570 if (!_desk_area_smart_client_find(sd, ec))
573 sd->clients = eina_list_remove(sd->clients, ec);
575 evas_object_smart_member_del(ec->frame);
577 evas_object_smart_changed(obj);
581 _e_desk_area_smart_init(E_Desk_Area *eda)
583 eda->smart_obj = evas_object_smart_add(e_comp->evas, _e_desk_area_smart_class_new());
585 E_DESK_AREA_SMART_DATA_GET_OR_RETURN(eda->smart_obj, sd);
591 EINTERN E_Desk_Area *
592 e_desk_area_new(E_Desk *desk, int id, int x, int y, int w, int h, E_Desk_Area_Layer eda_layer)
595 #ifdef REFACTOR_DESK_AREA
600 E_OBJECT_CHECK_RETURN(desk, NULL);
601 E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, NULL);
603 eda = E_OBJECT_ALLOC(E_Desk_Area, E_DESK_AREA_TYPE, _e_desk_area_free);
604 if (!eda) return NULL;
606 if (!_e_desk_area_private_init(eda))
608 e_object_del(E_OBJECT(eda));
615 _e_desk_geometry_info_set(eda, x, y, w, h);
617 eda->layer = eda_layer;
619 #ifdef REFACTOR_DESK_AREA
620 /* init smart object */
621 _e_desk_area_smart_init(eda);
623 /* init client's layers */
624 for (ec_layer = e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); ec_layer <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); ec_layer++)
627 obj = e_comp->layers[ec_layer].obj = evas_object_rectangle_add(e_comp->evas);
628 evas_object_layer_set(obj, e_comp_canvas_layer_map_to(ec_layer));
629 evas_object_name_set(obj, "layer_obj");
633 eda->hook_subsurf_create = e_comp_wl_hook_add(E_COMP_WL_HOOK_SUBSURFACE_CREATE,
634 _e_desk_area_cb_hook_subsurface_create,
640 #ifdef REFACTOR_DESK_AREA
642 void _e_desk_area_ec_geometry_apply(E_Desk_Area *eda, E_Client *ec)
645 E_Util_Transform *transform;
647 if (e_comp_wl_subsurface_check(ec))
650 transform = ec->desk_area.transform;
652 if (eda->transform_enabled)
654 if (!transform) return;
656 e_util_transform_move(transform, eda->x, eda->y, 0);
657 e_util_transform_scale(transform, eda->scale_w, eda->scale_h, 1.0);
658 e_client_transform_core_add(ec, transform);
660 e_client_transform_core_update(ec);
666 e_util_transform_move(transform, 0, 0, 0);
667 e_util_transform_scale(transform, 1.0, 1.0, 1.0);
668 e_client_transform_core_remove(ec, transform);
670 e_client_transform_core_update(ec);
673 if (ec->lock_client_size)
676 ec->maximized = E_MAXIMIZE_NONE;
677 e_client_maximize(ec, max);
682 void _e_desk_area_ec_geometry_restore(E_Desk_Area *eda, E_Client *ec)
684 e_client_transform_core_update(ec);
687 void _e_desk_area_enable(E_Desk_Area *eda)
696 for (i=0; i<E_DESK_AREA_CLIENT_LAYER_MAX; i++)
698 list = eina_list_clone(eda->ec_lists[i]);
699 EINA_LIST_REVERSE_FOREACH(list, l, ec)
701 e_desk_area_ec_enable_set(eda, ec, EINA_TRUE);
703 eina_list_free(list);
708 void _e_desk_area_disable(E_Desk_Area *eda)
713 Eina_List *list = NULL;
715 for (i=0; i<E_DESK_AREA_CLIENT_LAYER_MAX; i++)
717 list = eina_list_clone(eda->ec_lists[i]);
718 EINA_LIST_REVERSE_FOREACH(list, l, ec)
720 // unset ec's desk_area enable flag
721 e_desk_area_ec_enable_set(eda, ec, EINA_FALSE);
722 // restore original ec->layer
723 e_client_desk_area_original_layer_restore(ec);
724 // restore ec's original geometry (changing real geometry or using transform)
725 _e_desk_area_ec_geometry_restore(eda, ec);
727 e_desk_area_ec_remove(eda, ec);
729 eina_list_free(list);
732 eina_list_free(eda->ec_lists[i]);
733 eda->ec_lists[i] = NULL;
738 e_desk_area_enable_set(E_Desk_Area *eda, Eina_Bool enable)
740 if (!eda) return EINA_FALSE;
742 eda->enable = enable;
745 _e_desk_area_enable(eda);
749 _e_desk_area_disable(eda);
757 e_desk_area_name_get(E_Desk_Area *eda)
759 E_OBJECT_CHECK_RETURN(eda, NULL);
760 E_OBJECT_TYPE_CHECK_RETURN(eda, E_DESK_AREA_TYPE, NULL);
766 e_desk_area_geometry_set(E_Desk_Area *eda, int x, int y, int w, int h)
768 E_OBJECT_CHECK_RETURN(eda, EINA_FALSE);
769 E_OBJECT_TYPE_CHECK_RETURN(eda, E_DESK_AREA_TYPE, EINA_FALSE);
771 _e_desk_geometry_info_set(eda, x, y, w, h);
777 e_desk_area_geometry_get(E_Desk_Area *eda, int *x, int *y, int *w, int *h)
779 E_OBJECT_CHECK_RETURN(eda, EINA_FALSE);
780 E_OBJECT_TYPE_CHECK_RETURN(eda, E_DESK_AREA_TYPE, EINA_FALSE);
791 e_desk_area_layer_set(E_Desk_Area *eda, E_Desk_Area_Layer eda_layer)
793 E_OBJECT_CHECK_RETURN(eda, EINA_FALSE);
794 E_OBJECT_TYPE_CHECK_RETURN(eda, E_DESK_AREA_TYPE, EINA_FALSE);
796 eda->layer = eda_layer;
801 E_API E_Desk_Area_Layer
802 e_desk_area_layer_get(E_Desk_Area *eda)
804 E_OBJECT_CHECK_RETURN(eda, E_DESK_AREA_LAYER_NORMAL);
805 E_OBJECT_TYPE_CHECK_RETURN(eda, E_DESK_AREA_TYPE, E_DESK_AREA_LAYER_NORMAL);
811 e_desk_area_activate(E_Desk_Area *eda)
814 if (!eda->desk) return;
816 e_desk_area_raise(eda);
817 _e_desk_area_active_change(eda, eda->desk);
821 e_desk_area_is_activate(E_Desk_Area *eda)
823 if (!eda) return EINA_FALSE;
828 e_desk_area_raise(E_Desk_Area *eda)
833 Eina_List *ll = NULL;
837 for (i=0; i<E_DESK_AREA_CLIENT_LAYER_MAX; i++)
839 EINA_LIST_REVERSE_FOREACH_SAFE(eda->ec_lists[i], l, ll, ec)
841 evas_object_raise(ec->frame);
847 e_desk_area_lower(E_Desk_Area *eda)
852 Eina_List *ll = NULL;
856 for (i=E_DESK_AREA_CLIENT_LAYER_MAX-1; i>=0; i--)
858 //EINA_LIST_FOREACH(eda->ec_lists[i], l, ec)
859 EINA_LIST_FOREACH_SAFE(eda->ec_lists[i], l, ll, ec)
861 evas_object_lower(ec->frame);
866 #ifdef REFACTOR_DESK_AREA
868 static E_Desk_Area_Client_Layer
869 _e_desk_area_client_layer_convert_from_layer(E_Layer layer)
871 E_Desk_Area_Client_Layer edg_layer;
873 if (layer <= E_LAYER_CLIENT_DESKTOP)
874 edg_layer = E_DESK_AREA_CLIENT_LAYER_DESKTOP;
875 else if (layer <= E_LAYER_CLIENT_BELOW)
876 edg_layer = E_DESK_AREA_CLIENT_LAYER_BELOW;
877 else if (layer <= E_LAYER_CLIENT_NORMAL)
878 edg_layer = E_DESK_AREA_CLIENT_LAYER_NORMAL;
879 else if (layer <= E_LAYER_CLIENT_ABOVE)
880 edg_layer = E_DESK_AREA_CLIENT_LAYER_ABOVE;
881 else if (layer <= E_LAYER_CLIENT_NOTIFICATION_LOW)
882 edg_layer = E_DESK_AREA_CLIENT_LAYER_NOTIFICATION_LOW;
883 else if (layer <= E_LAYER_CLIENT_NOTIFICATION_NORMAL)
884 edg_layer = E_DESK_AREA_CLIENT_LAYER_NOTIFICATION_NORMAL;
885 else if (layer <= E_LAYER_CLIENT_NOTIFICATION_HIGH)
886 edg_layer = E_DESK_AREA_CLIENT_LAYER_NOTIFICATION_HIGH;
887 else if (layer <= E_LAYER_CLIENT_NOTIFICATION_TOP)
888 edg_layer = E_DESK_AREA_CLIENT_LAYER_NOTIFICATION_TOP;
890 edg_layer = E_DESK_AREA_CLIENT_LAYER_ALERT;
896 #ifdef REFACTOR_DESK_AREA
897 static E_Desk_Area_Private_Client *
898 _e_desk_area_ec_find_client(E_Desk_Area *eda, E_Client *ec)
901 E_Desk_Area_Private_Client *eda_client;
903 EINA_LIST_FOREACH(eda->clients, l, eda_client)
905 if (eda_client->ec == ec)
914 e_desk_area_ec_add(E_Desk_Area *eda, E_Client *ec)
916 #ifdef REFACTOR_DESK_AREA
918 E_Desk_Area_Client_Layer edgc_layer;
922 #ifdef REFACTOR_DESK_AREA
923 E_Desk_Area_Private_Client *eda_client;
925 E_OBJECT_CHECK_RETURN(eda, EINA_FALSE);
926 E_OBJECT_TYPE_CHECK_RETURN(eda, E_DESK_AREA_TYPE, EINA_FALSE);
927 E_OBJECT_CHECK_RETURN(ec, EINA_FALSE);
928 E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, EINA_FALSE);
930 if (_e_desk_area_ec_find_client(eda, ec)) return EINA_FALSE;
932 ELOGF("EAD", "CLIENT ADD", ec);
934 eda_client = E_NEW(E_Desk_Area_Private_Client, 1);
935 EINA_SAFETY_ON_NULL_RETURN_VAL(eda_client, EINA_FALSE);
937 eda_client->eda = eda;
940 // e_client listeners
941 eda_client->client_get_above.notify = _desk_area_cb_client_get_above;
942 e_client_get_above_listener_add(ec, &eda_client->client_get_above);
943 eda_client->client_get_below.notify = _desk_area_cb_client_get_below;
944 e_client_get_below_listener_add(ec, &eda_client->client_get_below);
945 eda_client->client_subsurface_stack_update.notify = _desk_area_cb_client_subsurface_stack_update;
946 e_client_subsurface_stack_update_listener_add(ec, &eda_client->client_subsurface_stack_update);
948 // e_comp_object listeners
949 eda_client->comp_object_lower.notify = _desk_area_cb_comp_object_lower;
950 e_comp_object_lower_listener_add(ec->frame, &eda_client->comp_object_lower);
951 eda_client->comp_object_raise.notify = _desk_area_cb_comp_object_raise;
952 e_comp_object_raise_listener_add(ec->frame, &eda_client->comp_object_raise);
953 eda_client->comp_object_set_layer.notify = _desk_area_cb_comp_object_set_layer;
954 e_comp_object_set_layer_listener_add(ec->frame, &eda_client->comp_object_set_layer);
955 eda_client->comp_object_stack_above.notify = _desk_area_cb_comp_object_stack_above;
956 e_comp_object_stack_above_listener_add(ec->frame, &eda_client->comp_object_stack_above);
957 eda_client->comp_object_stack_below.notify = _desk_area_cb_comp_object_stack_below;
958 e_comp_object_stack_below_listener_add(ec->frame, &eda_client->comp_object_stack_below);
960 eda->clients = eina_list_append(eda->clients, eda_client);
962 _e_desk_area_smart_client_add(eda->smart_obj, ec);
964 layer = e_client_desk_area_original_layer_get(ec);
965 edgc_layer = _e_desk_area_client_layer_convert_from_layer(layer);
967 eda->ec_lists[edgc_layer] = eina_list_prepend(eda->ec_lists[edgc_layer], ec);
969 e_client_desk_area_client_layer_set(ec, edgc_layer);
976 e_desk_area_ec_remove(E_Desk_Area *eda, E_Client *ec)
978 #ifdef REFACTOR_DESK_AREA
979 E_Desk_Area_Private_Client *eda_client;
982 E_OBJECT_TYPE_CHECK(eda, E_DESK_AREA_TYPE);
984 E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
986 // TODO: this code has to be refactoring
987 e_util_transform_del(ec->desk_area.transform);
988 ec->desk_area.transform = NULL;
990 eda_client = _e_desk_area_ec_find_client(eda, ec);
991 if (!eda_client) return;
993 ELOGF("EDA", "CLIENT DEL", ec);
995 _e_desk_area_smart_client_del(eda->smart_obj, ec);
997 eda->clients = eina_list_remove(eda->clients, eda_client);
1000 wl_list_remove(&eda_client->comp_object_stack_below.link);
1001 wl_list_remove(&eda_client->comp_object_stack_above.link);
1002 wl_list_remove(&eda_client->comp_object_set_layer.link);
1003 wl_list_remove(&eda_client->comp_object_lower.link);
1004 wl_list_remove(&eda_client->comp_object_raise.link);
1005 wl_list_remove(&eda_client->client_subsurface_stack_update.link);
1006 wl_list_remove(&eda_client->client_get_below.link);
1007 wl_list_remove(&eda_client->client_get_above.link);
1011 E_Desk_Area_Client_Layer edgc_layer;
1013 edgc_layer = e_client_desk_area_client_layer_get(ec);
1014 if (!_check_desk_area_client_layer_validation(edgc_layer)) return;
1016 eda->ec_lists[edgc_layer] = eina_list_remove(eda->ec_lists[edgc_layer], ec);
1020 #ifdef REFACTOR_DESK_AREA
1023 _find_above_ec_in_same_edgc_layer(E_Desk_Area *eda, E_Client *ec)
1026 E_Client *above = NULL;
1027 E_Client *temp = NULL;
1028 E_Desk_Area_Client_Layer edgc_layer;
1029 Eina_Bool find = EINA_FALSE;
1031 edgc_layer = e_client_desk_area_client_layer_get(ec);
1032 if (!_check_desk_area_client_layer_validation(edgc_layer)) return NULL;
1034 EINA_LIST_REVERSE_FOREACH(eda->ec_lists[edgc_layer], l, temp)
1048 // TODO: do we need check below->frame???
1054 _find_bottom_ec_in_above_edgc_layer(E_Desk_Area *eda, E_Client *ec)
1057 E_Client *bottom = NULL;
1058 E_Desk_Area_Client_Layer edgc_layer;
1061 edgc_layer = e_client_desk_area_client_layer_get(ec);
1062 if (!_check_desk_area_client_layer_validation(edgc_layer)) return NULL;
1064 for (i = edgc_layer+1; i < E_DESK_AREA_CLIENT_LAYER_MAX; i++)
1066 EINA_LIST_REVERSE_FOREACH(eda->ec_lists[i], l, bottom)
1068 // TODO: do we need check below->frame???
1078 _find_bottom_ec_in_above_edg(E_Desk_Area *eda)
1080 E_Desk_Area *above_edg = NULL;
1081 E_Client *bottom = NULL;
1085 above_edg = e_desk_desk_area_above_get(eda->desk, eda);
1088 for (i=E_DESK_AREA_CLIENT_LAYER_DESKTOP; i<E_DESK_AREA_CLIENT_LAYER_MAX; i++)
1090 EINA_LIST_REVERSE_FOREACH(above_edg->ec_lists[i], l, bottom)
1098 above_edg = e_desk_desk_area_above_get(above_edg->desk, above_edg);
1106 _find_below_ec_in_same_edgc_layer(E_Desk_Area *eda, E_Client *ec)
1109 E_Client *below = NULL;
1110 E_Client *temp = NULL;
1111 E_Desk_Area_Client_Layer edgc_layer;
1112 Eina_Bool find = EINA_FALSE;
1114 edgc_layer = e_client_desk_area_client_layer_get(ec);
1115 if (!_check_desk_area_client_layer_validation(edgc_layer)) return NULL;
1117 EINA_LIST_FOREACH(eda->ec_lists[edgc_layer], l, temp)
1131 // TODO: do we need check below->frame???
1137 _find_top_ec_in_below_edgc_layer(E_Desk_Area *eda, E_Client *ec)
1140 E_Client *top = NULL;
1141 E_Desk_Area_Client_Layer edgc_layer;
1144 edgc_layer = e_client_desk_area_client_layer_get(ec);
1145 if (!_check_desk_area_client_layer_validation(edgc_layer)) return NULL;
1147 for (i = edgc_layer-1; i >= E_DESK_AREA_CLIENT_LAYER_DESKTOP; i--)
1149 EINA_LIST_FOREACH(eda->ec_lists[i], l, top)
1151 // TODO: do we need check top->frame???
1161 _find_top_ec_in_below_edg(E_Desk_Area *eda)
1163 E_Desk_Area *below_edg = NULL;
1164 E_Client *top = NULL;
1168 below_edg = e_desk_desk_area_below_get(eda->desk, eda);
1171 for (i=E_DESK_AREA_CLIENT_LAYER_MAX-1; i>=E_DESK_AREA_CLIENT_LAYER_DESKTOP; i--)
1173 EINA_LIST_FOREACH(below_edg->ec_lists[i], l, top)
1181 below_edg = e_desk_desk_area_below_get(below_edg->desk, below_edg);
1189 e_desk_area_ec_raise(E_Desk_Area *eda, E_Client *ec)
1191 E_Client *below = NULL;
1192 E_Client *above = NULL;
1197 ELOGF("EDG", "RAISE... eda:%p", ec, eda);
1199 _e_desk_area_ec_prepend(eda, ec);
1201 // 1. find below ec in same edgc layer in same eda
1202 below = _find_below_ec_in_same_edgc_layer(eda, ec);
1203 if (below) goto find_below;
1205 // 2. find above ec in same edgc layer in same eda
1206 above = _find_above_ec_in_same_edgc_layer(eda, ec);
1207 if (above) goto find_above;
1209 // 3. find bottom ec in above edgc layer in same eda
1210 above = _find_bottom_ec_in_above_edgc_layer(eda, ec);
1211 if (above) goto find_above;
1213 // 4. find bottom ec in above eda
1214 above = _find_bottom_ec_in_above_edg(eda);
1215 if (above) goto find_above;
1217 // 5. if not found, just evas_object_raise
1218 ELOGF("EDG", "RAISE... call evas_object_raise", ec);
1219 evas_object_raise(ec->frame);
1225 ELOGF("EDG", "STACK_ABOVE... below(win:0x%08zx, ec:%p)", ec, e_client_util_win_get(below), below);
1228 ELOGF("EDG", "STACK_ABOVE... call evas_object_stack_above", ec);
1229 evas_object_stack_above(ec->frame, below->frame);
1237 ELOGF("EDG", "STACK_BELOW... above(win:0x%08zx, ec:%p)", ec, e_client_util_win_get(above), above);
1240 ELOGF("EDG", "STACK_BELOW... call evas_object_stack_below", ec);
1241 evas_object_stack_below(ec->frame, above->frame);
1248 e_desk_area_ec_lower(E_Desk_Area *eda, E_Client *ec)
1250 E_Client *above = NULL;
1251 E_Client *below = NULL;
1256 ELOGF("EDG", "LOWER... eda:%p", ec, eda);
1258 _e_desk_area_ec_append(eda, ec);
1260 // 1. find above ec in same edgc layer in same eda
1261 above = _find_above_ec_in_same_edgc_layer(eda, ec);
1262 if (above) goto find_above;
1264 // 2. find below ec in same edgc layer in same eda
1265 below = _find_below_ec_in_same_edgc_layer(eda, ec);
1266 if (below) goto find_below;
1268 // 3. find top ec in below edgc layer in same eda
1269 below = _find_top_ec_in_below_edgc_layer(eda, ec);
1270 if (below) goto find_below;
1272 // 4. find top ec in below eda
1273 below = _find_top_ec_in_below_edg(eda);
1274 if (below) goto find_below;
1276 // 5. if not found, just evas_object_raise
1277 ELOGF("EDG", "LOWER... call evas_object_raise", ec);
1278 evas_object_lower(ec->frame);
1284 ELOGF("EDG", "STACK_ABOVE... below(win:0x%08zx, ec:%p)", ec, e_client_util_win_get(below), below);
1287 ELOGF("EDG", "STACK_ABOVE... call evas_object_stack_above", ec);
1288 evas_object_stack_above(ec->frame, below->frame);
1296 ELOGF("EDG", "STACK_BELOW... above(win:0x%08zx, ec:%p)", ec, e_client_util_win_get(above), above);
1299 ELOGF("EDG", "STACK_BELOW... call evas_object_stack_below", ec);
1300 evas_object_stack_below(ec->frame, above->frame);
1307 e_desk_area_ec_stack_above(E_Desk_Area *eda, E_Client *ec, E_Client *above)
1311 if (!ec->frame) return;
1313 if (!above->frame) return;
1315 _e_desk_area_ec_prepend_relative(eda, ec, above);
1317 evas_object_stack_above(ec->frame, above->frame);
1321 e_desk_area_ec_stack_below(E_Desk_Area *eda, E_Client *ec, E_Client *below)
1325 if (!ec->frame) return;
1327 if (!below->frame) return;
1329 _e_desk_area_ec_append_relative(eda, ec, below);
1331 evas_object_stack_below(ec->frame, below->frame);
1335 e_desk_area_ec_edg_layer_set(E_Desk_Area *eda, E_Client *ec, E_Layer layer)
1337 E_Desk_Area_Client_Layer edg_layer;
1342 // save original layer
1344 edg_layer = eda->layer;
1345 evas_object_layer_set(ec->frame, edg_layer);
1349 _e_desk_area_ec_restack(E_Desk_Area *eda, E_Client *ec)
1351 E_Client *above = NULL, *below = NULL;
1353 // 1. find below ec in same edgc layer in same eda
1354 below = _find_below_ec_in_same_edgc_layer(eda, ec);
1355 if (below) goto find_below;
1357 // 2. find above ec in same edgc layer in same eda
1358 above = _find_above_ec_in_same_edgc_layer(eda, ec);
1359 if (above) goto find_above;
1361 // 3. find bottom ec in above edgc layer in same eda
1362 above = _find_bottom_ec_in_above_edgc_layer(eda, ec);
1363 if (above) goto find_above;
1365 // 4. find bottom ec in above eda
1366 above = _find_bottom_ec_in_above_edg(eda);
1367 if (above) goto find_above;
1369 // 5. if not found, just evas_object_raise
1370 ELOGF("EDG", "RESTACK raise... call evas_object_raise", ec);
1371 evas_object_raise(ec->frame);
1377 ELOGF("EDG", "STACK_ABOVE... below(win:0x%08zx, ec:%p)", ec, e_client_util_win_get(below), below);
1380 ELOGF("EDG", "STACK_ABOVE... call evas_object_stack_above", ec);
1381 evas_object_stack_above(ec->frame, below->frame);
1389 ELOGF("EDG", "STACK_BELOW... above(win:0x%08zx, ec:%p)", ec, e_client_util_win_get(above), above);
1392 ELOGF("EDG", "STACK_BELOW... call evas_object_stack_below", ec);
1393 evas_object_stack_below(ec->frame, above->frame);
1400 e_desk_area_ec_rearrange(E_Desk_Area *eda, E_Client *ec)
1403 E_Desk_Area_Client_Layer edgc_layer, prev_edgc_layer;
1405 ELOGF("EDG", "RE-ARRANGE... eda:%p", ec, eda);
1410 prev_edgc_layer = e_client_desk_area_client_layer_get(ec);
1411 if (!_check_desk_area_client_layer_validation(prev_edgc_layer)) return;
1413 eda->ec_lists[prev_edgc_layer] = eina_list_remove(eda->ec_lists[prev_edgc_layer], ec);
1415 layer = e_client_desk_area_original_layer_get(ec);
1416 edgc_layer = _e_desk_area_client_layer_convert_from_layer(layer);
1417 eda->ec_lists[edgc_layer] = eina_list_prepend(eda->ec_lists[edgc_layer], ec);
1419 e_client_desk_area_client_layer_set(ec, edgc_layer);
1421 _e_desk_area_ec_restack(eda, ec);
1425 e_desk_area_ec_stack_change(E_Desk_Area *eda, E_Client *ec)
1430 e_desk_area_ec_update(E_Desk_Area *eda, E_Client *ec)
1437 layer = e_client_desk_area_original_layer_get(ec);
1440 e_client_layer_set_by_desk_area(ec, layer);
1443 _e_desk_area_ec_geometry_apply(eda, ec);
1447 e_desk_area_all_ec_update(E_Desk_Area *eda)
1456 for (i=0; i<E_DESK_AREA_CLIENT_LAYER_MAX; i++)
1458 list = eina_list_clone(eda->ec_lists[i]);
1460 EINA_LIST_REVERSE_FOREACH(list, l, ec)
1462 e_desk_area_ec_update(eda, ec);
1465 eina_list_free(list);
1471 e_desk_area_ec_list_get(E_Desk_Area *eda)
1473 if (!eda) return NULL;
1479 e_desk_area_transform_enable_set(E_Desk_Area *eda, Eina_Bool enable)
1483 eda->transform_enabled = enable;
1487 e_desk_area_transform_enable_get(E_Desk_Area *eda)
1489 if (!eda) return EINA_FALSE;
1491 return eda->transform_enabled;
1497 e_desk_area_info_print(E_Desk_Area *eda)
1499 #ifdef REFACTOR_DESK_AREA
1505 ELOGF("EDG_INFO", "===========================================", NULL);
1506 ELOGF("EDG_INFO", "E_Desk_Area(%p), ID(%d), Geo(%d,%d,%d,%d), Layer:%d", NULL, eda, eda->id, eda->x, eda->y, eda->w, eda->h, eda->layer);
1507 ELOGF("EDG_INFO", "-------------------------------------------", NULL);
1508 for (int i=E_DESK_AREA_CLIENT_LAYER_MAX-1; i>=0; i--)
1510 EINA_LIST_FOREACH(eda->ec_lists[i], l, ec)
1512 ELOGF("EDG_INFO", "EDG_Layer[%d] Win:0x%08zx, EC:%p, frame:%p, ec->layer:%d, org_layer:%d, name:%s", NULL, i, e_client_util_win_get(ec), ec, ec->frame, ec->layer, ec->desk_area.layer_backup, ec->icccm.title ? ec->icccm.title:"NO NAME");
1515 ELOGF("EDG_INFO", "===========================================", NULL);
1520 _e_desk_area_hooks_clean(void)
1523 E_Desk_Area_Hook *dgh;
1526 for (x = 0; x < E_DESK_AREA_HOOK_LAST; x++)
1527 EINA_INLIST_FOREACH_SAFE(_e_desk_area_hooks[x], l, dgh)
1529 if (!dgh->delete_me) continue;
1530 _e_desk_area_hooks[x] = eina_inlist_remove(_e_desk_area_hooks[x], EINA_INLIST_GET(dgh));
1534 _e_desk_area_hooks_delete = 0;
1538 _e_desk_area_hook_call(E_Desk_Area_Hook_Point hookpoint, E_Desk_Area *desk_area, void *data)
1540 E_Desk_Area_Hook *dgh;
1542 e_object_ref(E_OBJECT(desk_area));
1543 _e_desk_area_hooks_walking++;
1544 EINA_INLIST_FOREACH(_e_desk_area_hooks[hookpoint], dgh)
1546 if (dgh->delete_me) continue;
1547 dgh->func(dgh->data, desk_area, data);
1549 _e_desk_area_hooks_walking--;
1550 if ((_e_desk_area_hooks_walking == 0) && (_e_desk_area_hooks_delete > 0))
1551 _e_desk_area_hooks_clean();
1553 return !!e_object_unref(E_OBJECT(desk_area));
1557 e_desk_area_hook_call(E_Desk_Area *eda, E_Desk_Area_Hook_Point hookpoint, void *data)
1559 return _e_desk_area_hook_call(hookpoint, eda, data);
1562 E_API E_Desk_Area_Hook *
1563 e_desk_area_hook_add(E_Desk_Area_Hook_Point hookpoint,
1564 E_Desk_Area_Hook_Cb func, const void *data)
1566 E_Desk_Area_Hook *dgh;
1568 EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_DESK_AREA_HOOK_LAST, NULL);
1569 dgh = E_NEW(E_Desk_Area_Hook, 1);
1570 if (!dgh) return NULL;
1572 dgh->hookpoint = hookpoint;
1574 dgh->data = (void*)data;
1576 _e_desk_area_hooks[hookpoint] =
1577 eina_inlist_append(_e_desk_area_hooks[hookpoint], EINA_INLIST_GET(dgh));
1583 e_desk_area_hook_del(E_Desk_Area_Hook * dgh)
1587 if (_e_desk_area_hooks_walking == 0)
1589 _e_desk_area_hooks[dgh->hookpoint] =
1590 eina_inlist_remove(_e_desk_area_hooks[dgh->hookpoint], EINA_INLIST_GET(dgh));
1594 _e_desk_area_hooks_delete++;
1597 #ifdef REFACTOR_DESK_AREA
1600 e_desk_area_ec_reassign(E_Desk_Area *eda, E_Client *ec)
1602 E_Desk_Area *old_edg;
1604 if (!ec) return EINA_FALSE;
1606 #if 0 // if this is removed.. then below if (eda != old_edg) is removed also...
1607 if (ec->desk_area.desk_area == eda)
1611 ELOGF("EDG", "Desk Group Set (new:%p, old:%p)", ec, eda, ec->desk_area.desk_area);
1612 old_edg = ec->desk_area.desk_area;
1614 e_desk_area_ec_remove(old_edg, ec);
1616 ec->desk_area.desk_area = eda;
1617 e_desk_area_ec_add(eda, ec);
1619 #if 0 // if this is removed.. then above if (ec->desk_area.desk_area == eda) is removed also...
1623 e_desk_area_ec_update(eda, ec);
1624 e_desk_area_ec_rearrange(ec->desk_area.desk_area, ec);
1631 e_desk_area_ec_enable_set(E_Desk_Area *eda, E_Client *ec, Eina_Bool enable)
1633 if (!eda) return EINA_FALSE;
1634 if (!ec) return EINA_FALSE;
1636 ec->desk_area.enable = enable;
1638 ELOGF("EDG", "Desk group enable set to %d", ec, enable);
1641 if (!ec->desk_area.transform)
1643 ec->desk_area.transform = e_util_transform_new();
1644 e_util_transform_role_set(ec->desk_area.transform, "desk_area");
1649 if (ec->desk_area.transform)
1651 e_util_transform_del(ec->desk_area.transform);
1652 ec->desk_area.transform = NULL;
1656 e_desk_area_ec_update(ec->desk_area.desk_area, ec);
1663 _desk_area_cb_splitscreen_region_destroy(struct wl_listener *listener EINA_UNUSED, void *data EINA_UNUSED)
1669 _desk_area_cb_splitscreen_region_assign_appid(struct wl_listener *listener EINA_UNUSED, void *data EINA_UNUSED)
1671 E_Desk_Area_Private *priv;
1672 const char *appid = data;
1674 priv = container_of(listener, E_Desk_Area_Private, splitscreen_region_assign_appid);
1676 e_desk_area_hook_call(priv->eda, E_DESK_AREA_HOOK_SET_APPID, (void *)appid);
1680 e_desk_area_splitscreen_region_enable(E_Desk_Area *eda, struct ds_tizen_splitscreen_region *splitscreen_region)
1682 API_ENTRY_VAL(EINA_FALSE);
1684 if (!splitscreen_region) return EINA_FALSE;
1686 priv->splitscreen_region = splitscreen_region;
1687 priv->splitscreen_region_destroy.notify = _desk_area_cb_splitscreen_region_destroy;
1688 ds_tizen_splitscreen_region_add_destroy_listener(
1689 priv->splitscreen_region, &priv->splitscreen_region_destroy);
1690 priv->splitscreen_region_assign_appid.notify = _desk_area_cb_splitscreen_region_assign_appid;
1691 ds_tizen_splitscreen_region_add_assign_appid_listener(
1692 priv->splitscreen_region, &priv->splitscreen_region_assign_appid);
1698 #ifdef REFACTOR_DESK_AREA
1700 e_desk_area_top_ec_get(E_Desk_Area *eda)
1705 g_rec_mutex_lock(&e_comp->ec_list_mutex);
1707 for (x = e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
1709 if (!e_comp->layers[x].clients) continue;
1711 EINA_INLIST_REVERSE_FOREACH(e_comp->layers[x].clients, ec)
1712 if (!e_object_is_del(E_OBJECT(ec)))
1714 g_rec_mutex_unlock(&e_comp->ec_list_mutex);
1719 g_rec_mutex_unlock(&e_comp->ec_list_mutex);
1725 e_desk_area_bottom_ec_get(E_Desk_Area *eda)
1730 g_rec_mutex_lock(&e_comp->ec_list_mutex);
1732 for (x = e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
1734 if (!e_comp->layers[x].clients) continue;
1736 EINA_INLIST_FOREACH(e_comp->layers[x].clients, ec)
1737 if (!e_object_is_del(E_OBJECT(ec)))
1739 g_rec_mutex_unlock(&e_comp->ec_list_mutex);
1744 g_rec_mutex_unlock(&e_comp->ec_list_mutex);