1 #include "e_desk_intern.h"
2 #include "e_desk_area_intern.h"
3 #include "e_client_intern.h"
4 #include "e_utils_intern.h"
5 #include "e_comp_screen_intern.h"
6 #include "e_comp_wl_subsurface_intern.h"
7 #include "e_output_intern.h"
8 #include "e_comp_object_intern.h"
9 #include "e_zone_intern.h"
10 #include "e_config_intern.h"
11 #include "e_policy_wl_intern.h"
12 #include "e_policy_intern.h"
14 #include <libds-tizen/screen.h>
16 /* E_Desk is a child object of E_Zone. A desk is essentially a background
17 * and an associated set of client windows. Each zone can have an arbitrary
21 typedef struct _E_Desk_Private E_Desk_Private;
22 #ifdef REFACTOR_DESK_AREA
23 typedef struct _E_Desk_Private_Client E_Desk_Private_Client;
25 typedef struct _E_Desk_Smart_Data E_Desk_Smart_Data;
27 #define DESK_EC_DATA_KEY "E_Desk_Client"
29 #define PRI(desk) ((E_Desk_Private *)e_object_data_get(E_OBJECT(desk)))
32 EINA_SAFETY_ON_NULL_RETURN(desk); \
33 E_Desk_Private *priv = PRI(desk)
35 #define E_DESK_SMART_DATA_GET(obj, ptr) \
36 E_Desk_Smart_Data *ptr = evas_object_smart_data_get(obj);
38 #define API_ENTRY_VAL(ret) \
39 EINA_SAFETY_ON_NULL_RETURN_VAL(desk, ret); \
40 E_Desk_Private *priv = PRI(desk)
42 #define E_DESK_SMART_DATA_GET_OR_RETURN(obj, ptr) \
43 E_DESK_SMART_DATA_GET(obj, ptr); \
46 typedef enum _E_Desk_Zoom_Animating_Type
48 E_DESK_ZOOM_ANIMATING_TYPE_NONE,
49 E_DESK_ZOOM_ANIMATING_TYPE_ENABLE,
50 E_DESK_ZOOM_ANIMATING_TYPE_DISABLE,
51 } E_Desk_Zoom_Animating_Type;
53 struct _E_Desk_Private
59 struct wl_signal client_add;
60 struct wl_signal desk_area_enable;
61 struct wl_signal desk_area_disable;
62 struct wl_signal desk_area_active_change;
63 struct wl_signal split_desk_activate;
64 struct wl_signal split_desk_deactivate;
67 struct ds_tizen_splitscreen *splitscreen;
68 struct wl_listener ds_tizen_splitscreen_destroy;
69 struct wl_listener ds_tizen_splitscreen_activate;
70 struct wl_listener ds_tizen_splitscreen_deactivate;
73 #ifdef REFACTOR_DESK_AREA
74 struct _E_Desk_Private_Client
80 struct wl_listener client_destroy;
81 struct wl_listener client_activate_done;
85 struct _E_Desk_Smart_Data
87 Evas_Object_Smart_Clipped_Data base;
93 double ratio_x, ratio_y;
95 double prev_ratio_x, prev_ratio_y;
96 int prev_cord_x, prev_cord_y;
98 Ecore_Animator *animator;
99 E_Desk_Zoom_Animating_Type animating_type;
103 static int _e_desk_hooks_delete = 0;
104 static int _e_desk_hooks_walking = 0;
106 static Eina_Inlist *_e_desk_hooks[] =
108 [E_DESK_HOOK_CLIENT_ADD] = NULL,
109 [E_DESK_HOOK_DESK_AREA_ENABLE] = NULL,
110 [E_DESK_HOOK_DESK_AREA_DISABLE] = NULL,
111 [E_DESK_HOOK_DESK_AREA_ACTIVE_CHANGE] = NULL,
112 [E_DESK_HOOK_SPLIT_DESK_ACTIVATE] = NULL,
113 [E_DESK_HOOK_SPLIT_DESK_DEACTIVATE] = NULL,
116 static void _e_desk_free(E_Desk *desk);
117 static void _e_desk_event_desk_show_free(void *data, void *ev);
118 static void _e_desk_event_desk_before_show_free(void *data, void *ev);
119 static void _e_desk_event_desk_after_show_free(void *data, void *ev);
120 static void _e_desk_show_begin(E_Desk *desk, int dx, int dy);
121 static void _e_desk_hide_begin(E_Desk *desk, int dx, int dy);
122 static void _e_desk_event_desk_geometry_change_free(void *data, void *ev);
124 static void _e_desk_smart_init(E_Desk *desk);
125 static void _e_desk_smart_add(Evas_Object *obj);
126 static void _e_desk_smart_del(Evas_Object *obj);
127 static void _e_desk_smart_client_add(Evas_Object *obj, E_Client *ec);
128 static void _e_desk_smart_client_del(Evas_Object *obj, E_Client *ec);
129 static void _e_desk_object_zoom(Evas_Object *obj, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy);
130 static void _e_desk_client_zoom(E_Client *ec, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy);
132 #ifdef REFACTOR_DESK_AREA
134 static Eina_Bool _e_desk_desk_area_base_new(E_Desk *desk);
137 static void _e_desk_hooks_clean(void);
138 static Eina_Bool _e_desk_hook_call(E_Desk_Hook_Point hookpoint, E_Desk *desk);
140 EVAS_SMART_SUBCLASS_NEW(E_DESK_SMART_OBJ_TYPE, _e_desk,
141 Evas_Smart_Class, Evas_Smart_Class,
142 evas_object_smart_clipped_class_get, NULL)
144 EINTERN int E_EVENT_DESK_SHOW = 0;
145 EINTERN int E_EVENT_DESK_BEFORE_SHOW = 0;
146 EINTERN int E_EVENT_DESK_AFTER_SHOW = 0;
147 EINTERN int E_EVENT_DESK_DESKSHOW = 0;
148 EINTERN int E_EVENT_DESK_NAME_CHANGE = 0;
149 E_API int E_EVENT_DESK_GEOMETRY_CHANGE = 0;
150 E_API int E_EVENT_DESK_ZOOM_SET = 0;
151 E_API int E_EVENT_DESK_ZOOM_UNSET = 0;
154 _e_desk_private_init(E_Desk *desk)
156 E_Desk_Private *priv;
158 priv = E_NEW(E_Desk_Private, 1);
164 wl_signal_init(&priv->events.client_add);
165 wl_signal_init(&priv->events.desk_area_enable);
166 wl_signal_init(&priv->events.desk_area_disable);
167 wl_signal_init(&priv->events.desk_area_active_change);
168 wl_signal_init(&priv->events.split_desk_activate);
169 wl_signal_init(&priv->events.split_desk_deactivate);
171 e_object_data_set(E_OBJECT(desk), priv);
177 _e_desk_private_finish(E_Desk *desk)
179 E_Desk_Private *priv;
183 #ifdef REFACTOR_DESK_AREA
184 wl_list_remove(&priv->ds_tizen_splitscreen_deactivate.link);
185 wl_list_remove(&priv->ds_tizen_splitscreen_activate.link);
186 wl_list_remove(&priv->ds_tizen_splitscreen_destroy.link);
189 e_object_data_set(E_OBJECT(desk), NULL);
197 _e_desk_event_simple_free(void *d EINA_UNUSED, E_Event_Desk *event)
202 e_object_unref(E_OBJECT(ev->desk));
207 _e_desk_event_simple_add(E_Desk *desk, int type)
211 ev = E_NEW(E_Event_Desk, 1);
214 e_object_ref(E_OBJECT(desk));
216 ecore_event_add(type, ev, (Ecore_End_Cb)_e_desk_event_simple_free, NULL);
222 E_EVENT_DESK_SHOW = ecore_event_type_new();
223 E_EVENT_DESK_BEFORE_SHOW = ecore_event_type_new();
224 E_EVENT_DESK_AFTER_SHOW = ecore_event_type_new();
225 E_EVENT_DESK_DESKSHOW = ecore_event_type_new();
226 E_EVENT_DESK_NAME_CHANGE = ecore_event_type_new();
227 E_EVENT_DESK_GEOMETRY_CHANGE = ecore_event_type_new();
228 E_EVENT_DESK_ZOOM_SET = ecore_event_type_new();
229 E_EVENT_DESK_ZOOM_UNSET = ecore_event_type_new();
235 e_desk_shutdown(void)
241 e_desk_new(E_Zone *zone, int x, int y)
245 E_Config_Desktop_Name *cfname;
248 static int desk_id = 0;
250 E_OBJECT_CHECK_RETURN(zone, NULL);
251 E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, NULL);
253 desk = E_OBJECT_ALLOC(E_Desk, E_DESK_TYPE, _e_desk_free);
254 if (!desk) return NULL;
256 if (!_e_desk_private_init(desk))
258 e_object_del(E_OBJECT(desk));
265 desk->id = desk_id++;
267 /* init smart object */
268 _e_desk_smart_init(desk);
270 /* Get current desktop's name */
271 EINA_LIST_FOREACH(e_config->desktop_names, l, cfname)
273 if ((cfname->zone >= 0) &&
274 ((int)zone->num != cfname->zone)) continue;
275 if ((cfname->desk_x != desk->x) || (cfname->desk_y != desk->y))
277 desk->name = eina_stringshare_ref(cfname->name);
284 snprintf(name, sizeof(name), _(e_config->desktop_default_name), x, y);
285 desk->name = eina_stringshare_add(name);
288 // new a base e_desk_area
289 #ifdef REFACTOR_DESK_AREA
290 desk->desk_area.base = e_desk_desk_area_add(desk,
291 desk->geom.x, desk->geom.y, desk->geom.w, desk->geom.h,
292 E_DESK_AREA_LAYER_NORMAL);
293 if (!desk->desk_area.base)
295 e_object_del(E_OBJECT(desk));
299 _e_desk_desk_area_base_new(desk);
306 e_desk_client_top_visible_get(E_Desk *desk)
310 E_OBJECT_CHECK_RETURN(desk, NULL);
311 E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, NULL);
313 E_CLIENT_REVERSE_FOREACH(ec)
314 if (e_desk_has_ec(desk, ec) && evas_object_visible_get(ec->frame)) return ec;
319 e_desk_name_set(E_Desk *desk, const char *name)
321 E_OBJECT_CHECK(desk);
322 E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
324 eina_stringshare_replace(&desk->name, name);
326 _e_desk_event_simple_add(desk, E_EVENT_DESK_NAME_CHANGE);
330 e_desk_name_add(int zone, int desk_x, int desk_y, const char *name)
332 E_Config_Desktop_Name *cfname;
334 e_desk_name_del(zone, desk_x, desk_y);
336 cfname = E_NEW(E_Config_Desktop_Name, 1);
339 cfname->desk_x = desk_x;
340 cfname->desk_y = desk_y;
341 if (name) cfname->name = eina_stringshare_add(name);
342 else cfname->name = NULL;
343 e_config->desktop_names = eina_list_append(e_config->desktop_names, cfname);
347 e_desk_name_del(int zone, int desk_x, int desk_y)
350 E_Config_Desktop_Name *cfname = NULL;
352 EINA_LIST_FOREACH(e_config->desktop_names, l, cfname)
354 if ((cfname->zone == zone) &&
355 (cfname->desk_x == desk_x) && (cfname->desk_y == desk_y))
357 e_config->desktop_names =
358 eina_list_remove_list(e_config->desktop_names, l);
359 if (cfname->name) eina_stringshare_del(cfname->name);
367 e_desk_name_update(void)
369 const Eina_List *z, *l;
372 E_Config_Desktop_Name *cfname;
376 EINA_LIST_FOREACH(e_comp->zones, z, zone)
378 for (d_x = 0; d_x < zone->desk_x_count; d_x++)
380 for (d_y = 0; d_y < zone->desk_y_count; d_y++)
382 desk = zone->desks[d_x + zone->desk_x_count * d_y];
385 EINA_LIST_FOREACH(e_config->desktop_names, l, cfname)
387 if ((cfname->zone >= 0) &&
388 ((int)zone->num != cfname->zone)) continue;
389 if ((cfname->desk_x != d_x) ||
390 (cfname->desk_y != d_y)) continue;
391 e_desk_name_set(desk, cfname->name);
398 snprintf(name, sizeof(name),
399 _(e_config->desktop_default_name),
401 e_desk_name_set(desk, name);
409 e_desk_show(E_Desk *desk)
411 E_Event_Desk_Show *ev = NULL;
412 E_Event_Desk_Before_Show *eev = NULL;
413 E_Event_Desk_After_Show *eeev = NULL;
414 Edje_Message_Float_Set *msg = NULL;
415 E_Desk *desk2 = NULL;
417 Ecore_Event *eev_ecore_event = NULL;
418 Ecore_Event *ev_ecore_event = NULL;
420 E_OBJECT_CHECK(desk);
421 E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
422 if (desk->visible) return;
424 desk2 = e_desk_at_xy_get(desk->zone, desk->zone->desk_x_current, desk->zone->desk_y_current);
425 if ((!starting) && (!desk2->visible)) return;
426 eev = E_NEW(E_Event_Desk_Before_Show, 1);
428 eev->desk = e_desk_current_get(desk->zone);
429 e_object_ref(E_OBJECT(eev->desk));
430 eev_ecore_event = ecore_event_add(E_EVENT_DESK_BEFORE_SHOW, eev,
431 _e_desk_event_desk_before_show_free, NULL);
438 dx = desk->x - desk2->x;
439 dy = desk->y - desk2->y;
441 _e_desk_hide_begin(desk2, dx, dy);
442 if (desk2->smart_obj)
443 evas_object_hide(desk2->smart_obj);
446 desk->zone->desk_x_prev = desk->zone->desk_x_current;
447 desk->zone->desk_y_prev = desk->zone->desk_y_current;
448 desk->zone->desk_x_current = desk->x;
449 desk->zone->desk_y_current = desk->y;
452 msg = alloca(sizeof(Edje_Message_Float_Set) + (4 * sizeof(double)));
455 msg->val[1] = desk->x;
456 msg->val[2] = desk->zone->desk_x_count;
457 msg->val[3] = desk->y;
458 msg->val[4] = desk->zone->desk_y_count;
459 if (desk->zone->bg_object)
460 edje_object_message_send(desk->zone->bg_object, EDJE_MESSAGE_FLOAT_SET, 0, msg);
462 #ifndef ENABLE_QUICK_INIT
464 if (desk->zone->bg_object) was_zone = 1;
466 _e_desk_show_begin(desk, dx, dy);
468 evas_object_show(desk->smart_obj);
470 #ifndef ENABLE_QUICK_INIT
472 e_bg_zone_update(desk->zone, E_BG_TRANSITION_DESK);
474 e_bg_zone_update(desk->zone, E_BG_TRANSITION_START);
477 ev = E_NEW(E_Event_Desk_Show, 1);
480 e_object_ref(E_OBJECT(desk));
481 ev_ecore_event = ecore_event_add(E_EVENT_DESK_SHOW, ev, _e_desk_event_desk_show_free, NULL);
483 eeev = E_NEW(E_Event_Desk_After_Show, 1);
484 if (!eeev) goto error;
485 eeev->desk = e_desk_current_get(desk->zone);
486 e_object_ref(E_OBJECT(eeev->desk));
487 ecore_event_add(E_EVENT_DESK_AFTER_SHOW, eeev,
488 _e_desk_event_desk_after_show_free, NULL);
496 ecore_event_del(ev_ecore_event);
497 e_object_unref(E_OBJECT(ev->desk));
503 ecore_event_del(eev_ecore_event);
504 e_object_unref(E_OBJECT(eev->desk));
510 e_desk_deskshow(E_Zone *zone)
515 E_OBJECT_CHECK(zone);
516 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
518 desk = e_desk_current_get(zone);
519 EINA_SAFETY_ON_NULL_RETURN(desk);
521 if (desk->deskshow_toggle)
523 /* uniconify raises windows and changes stacking order
524 * go top-down to avoid skipping windows
526 E_CLIENT_REVERSE_FOREACH(ec)
528 if (e_client_util_ignored_get(ec)) continue;
529 if (!e_desk_has_ec(desk, ec)) continue;
533 e_client_uniconify(ec);
540 * iconify raises, so we have to start from the bottom so we are going forward
544 if (e_client_util_ignored_get(ec)) continue;
545 if (!e_desk_has_ec(desk, ec)) continue;
546 if (ec->iconic) continue;
547 if (ec->netwm.state.skip_taskbar) continue;
548 if (ec->user_skip_winlist) continue;
550 e_client_iconify(ec);
553 desk->deskshow_toggle = !desk->deskshow_toggle;
555 _e_desk_event_simple_add(desk, E_EVENT_DESK_DESKSHOW);
559 e_desk_row_add(E_Zone *zone)
561 e_zone_desk_count_set(zone, zone->desk_x_count, zone->desk_y_count + 1);
565 e_desk_row_remove(E_Zone *zone)
567 e_zone_desk_count_set(zone, zone->desk_x_count, zone->desk_y_count - 1);
571 e_desk_col_add(E_Zone *zone)
573 e_zone_desk_count_set(zone, zone->desk_x_count + 1, zone->desk_y_count);
577 e_desk_col_remove(E_Zone *zone)
579 e_zone_desk_count_set(zone, zone->desk_x_count - 1, zone->desk_y_count);
583 e_desk_current_get(E_Zone *zone)
585 E_OBJECT_CHECK_RETURN(zone, NULL);
586 E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, NULL);
588 return e_desk_at_xy_get(zone, zone->desk_x_current, zone->desk_y_current);
592 e_desk_at_xy_get(E_Zone *zone, int x, int y)
594 E_OBJECT_CHECK_RETURN(zone, NULL);
595 E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, NULL);
597 if ((x >= zone->desk_x_count) || (y >= zone->desk_y_count))
599 else if ((x < 0) || (y < 0))
602 if (!zone->desks) return NULL;
603 return zone->desks[x + (y * zone->desk_x_count)];
607 e_desk_at_pos_get(E_Zone *zone, int pos)
611 E_OBJECT_CHECK_RETURN(zone, NULL);
612 E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, NULL);
614 y = pos / zone->desk_x_count;
615 x = pos - (y * zone->desk_x_count);
617 if ((x >= zone->desk_x_count) || (y >= zone->desk_y_count))
620 return zone->desks[x + (y * zone->desk_x_count)];
624 e_desk_xy_get(E_Desk *desk, int *x, int *y)
626 E_OBJECT_CHECK(desk);
627 E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
634 e_desk_next(E_Zone *zone)
638 E_OBJECT_CHECK(zone);
639 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
641 if ((zone->desk_x_count < 2) && (zone->desk_y_count < 2))
644 x = zone->desk_x_current;
645 y = zone->desk_y_current;
648 if (x >= zone->desk_x_count)
652 if (y >= zone->desk_y_count) y = 0;
655 e_desk_show(e_desk_at_xy_get(zone, x, y));
659 e_desk_prev(E_Zone *zone)
663 E_OBJECT_CHECK(zone);
664 E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
666 if ((zone->desk_x_count < 2) && (zone->desk_y_count < 2))
669 x = zone->desk_x_current;
670 y = zone->desk_y_current;
675 x = zone->desk_x_count - 1;
677 if (y < 0) y = zone->desk_y_count - 1;
679 e_desk_show(e_desk_at_xy_get(zone, x, y));
687 unsigned int count = 0;
689 EINA_LIST_FOREACH(e_comp->zones, l, zone)
693 e_zone_desk_count_get(zone, &cx, &cy);
700 _e_desk_client_data_del(E_Desk *desk, E_Client *ec)
702 evas_object_data_del(ec->frame, DESK_EC_DATA_KEY);
706 _e_desk_client_data_set(E_Desk *desk, E_Client *ec)
710 data = evas_object_data_get(ec->frame, DESK_EC_DATA_KEY);
715 ELOGF("E_DESK", "EC is already added to desk_id:%d", ec, desk->id);
719 evas_object_data_del(ec->frame, DESK_EC_DATA_KEY);
722 evas_object_data_set(ec->frame, DESK_EC_DATA_KEY, desk);
725 #ifdef REFACTOR_DESK_AREA
728 _e_client_event_desk_set_free(void *d EINA_UNUSED, E_Event_Client_Desk_Set *ev)
731 e_object_unref(E_OBJECT(ev->ec));
732 e_object_unref(E_OBJECT(ev->desk));
738 _e_desk_client_set(E_Desk *desk, E_Client *ec)
740 #ifdef REFACTOR_DESK_AREA
743 E_Event_Client_Desk_Set *ev;
745 old_desk = e_comp_desk_find_by_ec(ec);
749 old_desk->fullscreen_clients = eina_list_remove(old_desk->fullscreen_clients, ec);
751 desk->fullscreen_clients = eina_list_append(desk->fullscreen_clients, ec);
755 e_desk_client_del(old_desk, ec);
758 ec->desk = desk; // FIXME: This line must be deleted.
764 e_comp_object_effect_unclip(ec->frame);
765 e_comp_object_effect_set(ec->frame, NULL);
767 if (desk->visible || ec->sticky)
769 if ((!ec->hidden) && (!ec->iconic))
770 evas_object_show(ec->frame);
775 evas_object_hide(ec->frame);
779 e_client_comp_hidden_set(ec, (!desk->visible) && (!ec->sticky));
781 #ifdef REFACTOR_DESK_AREA
785 // e_client_desk_set_event_notify(ec);
786 ev = E_NEW(E_Event_Client_Desk_Set, 1);
791 e_object_ref(E_OBJECT(ec));
793 e_object_ref(E_OBJECT(old_desk));
794 ecore_event_add(E_EVENT_CLIENT_DESK_SET, ev, (Ecore_End_Cb)_e_client_event_desk_set_free, NULL);
797 if (e_zone_has_ec(old_desk->zone, ec))
799 e_client_res_change_geometry_save(ec);
800 e_client_res_change_geometry_restore(ec);
801 ec->pre_res_change.valid = 0;
806 if (e_config->transient.desktop)
811 EINA_LIST_FOREACH(ec->transients, l, child)
812 e_desk_client_add(desk, child);
815 evas_object_smart_callback_call(ec->frame, "desk_change", ec);
817 #ifdef REFACTOR_DESK_AREA
819 if (desk->desk_area.enable)
821 if (!ec->desk_area.desk_area)
824 eda = e_desk_desk_area_base_get(desk);
825 e_desk_area_ec_reassign(eda, ec);
828 e_desk_area_ec_enable_set(desk->desk_area.base, ec, EINA_TRUE);
833 #ifdef REFACTOR_DESK_AREA
835 _e_desk_private_client_del(E_Desk_Private_Client *desk_client)
837 E_Desk *desk = desk_client->desk;
838 E_Client *ec = desk_client->ec;
840 _e_desk_smart_client_del(desk->smart_obj, ec);
841 _e_desk_client_data_del(desk, ec);
843 wl_list_remove(&desk_client->client_activate_done.link);
844 wl_list_remove(&desk_client->client_destroy.link);
850 _desk_cb_client_destroy(struct wl_listener *listener, void *data)
852 E_Desk_Private_Client *desk_client;
856 desk_client = wl_container_of(listener, desk_client, client_destroy);
857 desk = desk_client->desk;
858 ec = desk_client->ec;
860 ELOGF("DESK", "CLIENT DESTROY. desk:%p", ec, desk);
862 _e_desk_private_client_del(desk_client);
866 _desk_cb_client_activate_done(struct wl_listener *listener, void *data)
868 E_Desk_Private_Client *desk_client;
872 desk_client = wl_container_of(listener, desk_client, client_activate_done);
873 desk = desk_client->desk;
874 ec = desk_client->ec;
876 ELOGF("DESK", "CLIENT ACTIVATE DONE. desk:%p", ec, desk);
878 if ((!ec->iconic) && (!ec->sticky))
883 if (!e_client_desk_iconify_skip_get(ec))
885 e_desk_visible_client_iconified_list_remove_all(desk);
891 e_desk_client_add(E_Desk *desk, E_Client *ec)
893 #ifdef REFACTOR_DESK_AREA
895 E_Desk_Private_Client *desk_client;
897 E_OBJECT_CHECK(desk);
898 E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
901 E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
903 if (e_desk_has_ec(desk, ec)) return;
905 ELOGF("DESK", "CLIENT ADD. desk:%p", ec, desk);
907 #ifdef REFACTOR_DESK_AREA
909 desk_client = E_NEW(E_Desk_Private_Client, 1);
910 EINA_SAFETY_ON_NULL_RETURN(desk_client);
912 desk_client->desk = desk;
913 desk_client->ec = ec;
915 // e_client listeners
916 desk_client->client_destroy.notify = _desk_cb_client_destroy;
917 e_client_destroy_listener_add(ec, &desk_client->client_destroy);
918 desk_client->client_activate_done.notify = _desk_cb_client_activate_done;
919 e_client_activate_done_listener_add(ec, &desk_client->client_activate_done);
922 _e_desk_client_set(desk, ec);
923 _e_desk_client_data_set(desk, ec);
925 #ifdef REFACTOR_DESK_AREA
926 eda = e_desk_desk_area_base_get(desk);
927 e_desk_area_ec_add(eda, ec);
929 _e_desk_smart_client_add(desk->smart_obj, ec);
931 wl_signal_emit_mutable(&PRI(desk)->events.client_add, desk);
932 _e_desk_hook_call(E_DESK_HOOK_CLIENT_ADD, desk);
934 if (desk->desk_area.enable)
937 eda = e_desk_desk_area_base_get(desk);
939 e_desk_area_ec_add(eda, ec);
940 e_desk_area_ec_enable_set(desk->desk_area.base, ec, EINA_TRUE);
944 _e_desk_smart_client_add(desk->smart_obj, ec);
946 wl_signal_emit_mutable(&PRI(desk)->events.client_add, desk);
947 _e_desk_hook_call(E_DESK_HOOK_CLIENT_ADD, desk);
952 #ifdef REFACTOR_DESK_AREA
953 static E_Desk_Private_Client *
954 _e_desk_private_client_get(E_Client *ec)
956 E_Desk_Private_Client *desk_client;
957 struct wl_listener *listener;
959 listener = e_client_destroy_listener_get(ec, _desk_cb_client_destroy);
960 if (!listener) return NULL;
962 return wl_container_of(listener, desk_client, client_destroy);
967 e_desk_client_del(E_Desk *desk, E_Client *ec)
969 #ifdef REFACTOR_DESK_AREA
970 E_Desk_Private_Client *desk_client;
973 E_OBJECT_CHECK(desk);
974 E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
977 E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
979 #ifdef REFACTOR_DESK_AREA
980 if (!e_desk_has_ec(desk, ec)) return;
982 ELOGF("DESK", "CLIENT REMOVE. desk:%p", ec, desk);
984 desk_client = _e_desk_private_client_get(ec);
985 EINA_SAFETY_ON_NULL_RETURN(desk_client);
987 eda = e_desk_desk_area_find_by_ec(desk, ec);
988 EINA_SAFETY_ON_NULL_RETURN(eda);
990 e_desk_area_ec_remove(eda, ec);
992 _e_desk_private_client_del(desk_client);
994 _e_desk_smart_client_del(desk->smart_obj, ec);
996 if (desk->desk_area.enable)
999 eda = e_desk_desk_area_base_get(desk);
1001 e_desk_area_ec_enable_set(desk->desk_area.base, ec, EINA_FALSE);
1002 e_desk_area_ec_remove(eda, ec);
1005 _e_desk_client_data_del(desk, ec);
1010 e_desk_geometry_set(E_Desk *desk, int x, int y, int w, int h)
1014 Eina_List *l = NULL, *ll = NULL;
1016 E_Event_Desk_Geometry_Change *ev = NULL;
1020 E_OBJECT_CHECK(desk);
1021 E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
1023 E_DESK_SMART_DATA_GET_OR_RETURN(desk->smart_obj, sd);
1025 if ((desk->geom.x == x) && (desk->geom.y == y) &&
1026 (desk->geom.w == w) && (desk->geom.h == h))
1029 dx = x - desk->geom.x;
1030 dy = y - desk->geom.y;
1031 EINA_RECTANGLE_SET(&desk->geom, x, y, w, h);
1033 EINA_LIST_FOREACH(sd->clients, l, ec)
1035 if (e_object_is_del(E_OBJECT(ec))) continue;
1037 /* even if the desktop geometry is chagned, the system partial windows such as virtual
1038 * keyboard and clipboard should be placed at the bottom of the desktop. */
1040 if (e_policy_client_is_keyboard(ec))
1044 else if (e_comp_wl_subsurface_check(ec))
1048 else if (ec->maximized)
1050 max = ec->maximized;
1051 ec->maximized = E_MAXIMIZE_NONE;
1052 e_client_maximize(ec, max);
1056 e_client_geometry_get(ec, &cx, &cy, NULL, NULL);
1057 e_client_util_move_without_frame(ec, cx + dx, cy + dy);
1061 // E Client as an member of smart object is not changed even though parent obj is changed
1062 // Workaround : update max geometry if ec is a member of desk->smart_obj
1063 EINA_LIST_FOREACH(evas_object_smart_members_get(desk->smart_obj), ll, m)
1065 ec = evas_object_data_get(m, "E_Client");
1066 if (ec && ec->maximized)
1068 if (e_object_is_del(E_OBJECT(ec))) continue;
1069 max = ec->maximized;
1070 ec->maximized = E_MAXIMIZE_NONE;
1071 e_client_maximize(ec, max);
1075 // apply geometry on smart obj
1076 evas_object_geometry_set(desk->smart_obj, x, y, w, h);
1078 ev = E_NEW(E_Event_Desk_Geometry_Change, 1);
1086 e_object_ref(E_OBJECT(desk));
1087 ecore_event_add(E_EVENT_DESK_GEOMETRY_CHANGE, ev,
1088 _e_desk_event_desk_geometry_change_free, NULL);
1091 e_comp_render_queue();
1095 _e_desk_zoom_animate_cb(void *data, double pos)
1101 double zoomx, zoomy;
1103 double diff_x, diff_y;
1104 double cBez[4] = {0.3, 0.0, 0.15, 1.0};
1106 desk = (E_Desk*)data;
1107 if (!desk) return ECORE_CALLBACK_CANCEL;
1109 E_DESK_SMART_DATA_GET_OR_RETURN(desk->smart_obj, sd) ECORE_CALLBACK_CANCEL;
1111 progress = ecore_animator_pos_map_n(pos, ECORE_POS_MAP_CUBIC_BEZIER, 4, cBez);
1113 diff_x = sd->zoom.prev_ratio_x - sd->zoom.ratio_x;
1114 diff_y = sd->zoom.prev_ratio_y - sd->zoom.ratio_y;
1116 zoomx = sd->zoom.ratio_x + (diff_x * (1-progress));
1117 zoomy = sd->zoom.ratio_y + (diff_y * (1-progress));
1118 cx = sd->zoom.cord_x;
1119 cy = sd->zoom.cord_y;
1121 EINA_LIST_FOREACH(sd->clients, l, ec)
1123 if ((e_client_visibility_get(ec) == E_VISIBILITY_UNOBSCURED) ||
1124 (e_comp_wl_subsurface_check(ec)))
1125 _e_desk_client_zoom(ec, zoomx, zoomy, cx, cy);
1130 EINA_LIST_FOREACH(sd->clients, l, ec)
1132 _e_desk_client_zoom(ec, zoomx, zoomy, cx, cy);
1135 if ((sd->zoom.ratio_x != 1.0) ||
1136 (sd->zoom.ratio_y != 1.0))
1139 sd->zoom.enabled = EINA_TRUE;
1142 sd->zoom.animating_type = E_DESK_ZOOM_ANIMATING_TYPE_NONE;
1143 sd->zoom.animator = NULL;
1146 return ECORE_CALLBACK_PASS_ON;
1150 e_desk_zoom_set(E_Desk *desk, double zoomx, double zoomy, int cx, int cy)
1154 E_Zone *zone = NULL;
1155 E_Output *eout = NULL;
1157 E_OBJECT_CHECK(desk);
1158 E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
1160 ELOGF("DESK", "ZOOM SET. desk:%p, zoom ratio(%f,%f) cpos(%d,%d)", NULL, desk, zoomx, zoomy, cx, cy);
1162 if (e_config->use_pp_zoom)
1164 if (e_comp_screen_pp_support())
1167 eout = e_output_find(zone->output_id);
1170 ERR("e_desk_zoom_set: fail get eout");
1173 if (!e_output_zoom_set(eout, zoomx, zoomy, cx, cy))
1174 ERR("e_desk_zoom_set: fail zoom set");
1176 DBG("e_desk_zoom_set: zoomx:%f, zoomy:%f, x:%d, y:%d", zoomx, zoomy, cx, cy);
1182 E_DESK_SMART_DATA_GET_OR_RETURN(desk->smart_obj, sd);
1184 if ((sd->zoom.ratio_x != zoomx) || (sd->zoom.ratio_y != zoomy) ||
1185 (sd->zoom.cord_x != cx) || (sd->zoom.cord_y != cy))
1187 sd->zoom.prev_ratio_x = sd->zoom.ratio_x;
1188 sd->zoom.prev_ratio_y = sd->zoom.ratio_y;
1189 sd->zoom.prev_cord_x = sd->zoom.cord_x;
1190 sd->zoom.prev_cord_y = sd->zoom.cord_y;
1192 sd->zoom.ratio_x = zoomx;
1193 sd->zoom.ratio_y = zoomy;
1194 sd->zoom.cord_x = cx;
1195 sd->zoom.cord_y = cy;
1197 if (e_config->desk_zoom_effect.enable)
1199 if (sd->zoom.animator)
1201 ecore_animator_del(sd->zoom.animator);
1202 sd->zoom.animator = NULL;
1205 sd->zoom.animating_type = E_DESK_ZOOM_ANIMATING_TYPE_ENABLE;
1206 sd->zoom.animator = ecore_animator_timeline_add(e_config->desk_zoom_effect.duration,
1207 _e_desk_zoom_animate_cb, desk);
1208 _e_desk_object_zoom(desk->smart_obj, zoomx, zoomy, cx, cy);
1212 _e_desk_object_zoom(desk->smart_obj, zoomx, zoomy, cx, cy);
1213 EINA_LIST_FOREACH(sd->clients, l, ec)
1215 _e_desk_client_zoom(ec, zoomx, zoomy, cx, cy);
1220 if (!sd->zoom.enabled)
1222 /* if desk_zoom_effect is enabled,
1223 then sd->zoom.enabled will be set after finishing effect */
1224 if (!e_config->desk_zoom_effect.enable)
1225 sd->zoom.enabled = EINA_TRUE;
1228 * NOTE: evas_object_map_enable_set is called in _e_desk_client_zoom()
1231 * evas_object_map_enable_set(desk->smart_obj, EINA_TRUE);
1232 * EINA_LIST_FOREACH(sd->clients, l, ec)
1233 * evas_object_map_enable_set(ec->frame, EINA_TRUE);
1238 _e_desk_event_simple_add(desk, E_EVENT_DESK_ZOOM_SET);
1242 e_desk_zoom_get(E_Desk *desk, double *zoomx, double *zoomy, int *cx, int *cy)
1244 E_Zone *zone = NULL;
1245 E_Output *eout = NULL;
1246 Eina_Bool res = EINA_FALSE;
1248 E_OBJECT_CHECK_RETURN(desk, EINA_FALSE);
1249 E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, EINA_FALSE);
1251 if (e_config->use_pp_zoom)
1253 if (e_comp_screen_pp_support())
1256 eout = e_output_find(zone->output_id);
1259 ERR("e_desk_zoom_set: fail get eout");
1263 res = e_output_zoom_get(eout, zoomx, zoomy, cx, cy);
1268 E_DESK_SMART_DATA_GET(desk->smart_obj, sd);
1269 EINA_SAFETY_ON_NULL_RETURN_VAL(sd, EINA_FALSE);
1271 if (zoomx) *zoomx = sd->zoom.ratio_x;
1272 if (zoomy) *zoomy = sd->zoom.ratio_y;
1273 if (cx) *cx = sd->zoom.cord_x;
1274 if (cy) *cy = sd->zoom.cord_y;
1280 e_desk_zoom_get_center_coordinate(E_Desk *desk, double zoomx, double zoomy, int rectx, int recty, int *cx, int *cy)
1282 E_Zone *zone = NULL;
1283 E_Output *eout = NULL;
1287 E_OBJECT_CHECK_RETURN(desk, EINA_FALSE);
1288 E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, EINA_FALSE);
1291 eout = e_output_find(zone->output_id);
1293 e_output_size_get(eout, &w, &h);
1298 if (e_config->use_pp_zoom)
1300 if (zoomx == 1 || rectx < 0 || zoomw + rectx >= w)
1303 if (zoomy == 1 || recty < 0 || zoomh + recty >= h)
1308 if (zoomx == 1 || zoomy == 1)
1315 *cx = (int)((zoomx * (double)rectx) / (zoomx - 1.0));
1320 *cy = (int)((zoomy * (double)recty) / (zoomy - 1.0));
1326 e_desk_zoom_unset(E_Desk *desk)
1330 E_Zone *zone = NULL;
1331 E_Output *eout = NULL;
1333 E_OBJECT_CHECK(desk);
1334 E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
1336 ELOGF("DESK", "ZOOM UNSET. desk:%p", NULL, desk);
1338 if (e_config->use_pp_zoom)
1340 if (e_comp_screen_pp_support())
1343 eout = e_output_find(zone->output_id);
1346 ERR("e_desk_zoom_unset: fail get eout");
1350 e_output_zoom_unset(eout);
1351 DBG("e_desk_zoom_unset");
1357 E_DESK_SMART_DATA_GET_OR_RETURN(desk->smart_obj, sd);
1359 if (!sd->zoom.enabled)
1361 if (sd->zoom.animating_type != E_DESK_ZOOM_ANIMATING_TYPE_ENABLE)
1367 sd->zoom.prev_ratio_x = sd->zoom.ratio_x;
1368 sd->zoom.prev_ratio_y = sd->zoom.ratio_y;
1369 sd->zoom.prev_cord_x = sd->zoom.cord_x;
1370 sd->zoom.prev_cord_y = sd->zoom.cord_y;
1372 sd->zoom.ratio_x = 1.0;
1373 sd->zoom.ratio_y = 1.0;
1374 sd->zoom.cord_x = 0;
1375 sd->zoom.cord_y = 0;
1376 sd->zoom.enabled = EINA_FALSE;
1378 if (e_config->desk_zoom_effect.enable)
1380 if (sd->zoom.animator)
1382 ecore_animator_del(sd->zoom.animator);
1383 sd->zoom.animator = NULL;
1386 sd->zoom.animating_type = E_DESK_ZOOM_ANIMATING_TYPE_DISABLE;
1387 sd->zoom.animator = ecore_animator_timeline_add(e_config->desk_zoom_effect.duration,
1388 _e_desk_zoom_animate_cb, desk);
1389 _e_desk_object_zoom(desk->smart_obj, sd->zoom.ratio_x, sd->zoom.ratio_y,
1390 sd->zoom.cord_x, sd->zoom.cord_y);
1394 _e_desk_object_zoom(desk->smart_obj, sd->zoom.ratio_x, sd->zoom.ratio_y,
1395 sd->zoom.cord_x, sd->zoom.cord_y);
1397 * NOTE: evas_object_map_enable_set is called in _e_desk_client_zoom()
1400 * evas_object_map_enable_set(desk->smart_obj, EINA_FALSE);
1402 EINA_LIST_FOREACH(sd->clients, l, ec)
1404 /* NOTE Is it really necessary?
1405 * Why isn't it enough to just call evas_object_map_enable_set(false)? */
1406 _e_desk_client_zoom(ec, sd->zoom.ratio_x, sd->zoom.ratio_y,
1407 sd->zoom.cord_x, sd->zoom.cord_y);
1408 //evas_object_map_enable_set(ec->frame, EINA_FALSE);
1413 _e_desk_event_simple_add(desk, E_EVENT_DESK_ZOOM_UNSET);
1417 e_desk_smart_member_add(E_Desk *desk, Evas_Object *obj)
1419 E_OBJECT_CHECK(desk);
1420 E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
1422 evas_object_smart_member_add(obj, desk->smart_obj);
1426 e_desk_smart_member_del(Evas_Object *obj)
1428 evas_object_smart_member_del(obj);
1432 e_desk_client_zoom_skip_set(E_Desk * desk, E_Client * ec)
1436 if (!desk) return EINA_FALSE;
1437 if (!ec) return EINA_FALSE;
1439 ec_desk = e_zone_desk_find_by_ec(desk->zone, ec);
1440 if (!ec_desk) return EINA_FALSE;
1442 ELOGF("DESK", "Client zoom skip set. desk:%p, ec_desk:%p)", ec, desk, ec_desk);
1444 if (!e_desk_has_ec(desk, ec)) return EINA_FALSE;
1445 e_desk_client_del(ec_desk, ec);
1451 e_desk_client_zoom_skip_unset(E_Desk *desk, E_Client *ec)
1455 if (!desk) return EINA_FALSE;
1456 if (!ec) return EINA_FALSE;
1458 ec_desk = e_zone_desk_find_by_ec(desk->zone, ec);
1459 if (!ec_desk) return EINA_FALSE;
1461 ELOGF("DESK", "Client zoom skip set. desk:%p, ec_desk:%p)", ec, desk, ec_desk);
1463 if (!e_desk_has_ec(desk, ec)) return EINA_FALSE;
1465 _e_desk_smart_client_add(desk->smart_obj, ec);
1471 e_desk_client_zoom_apply(E_Desk *desk, E_Client *ec)
1473 E_OBJECT_CHECK(desk);
1474 E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
1477 E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
1479 E_DESK_SMART_DATA_GET_OR_RETURN(desk->smart_obj, sd);
1480 if (!eina_list_data_find(sd->clients, ec))
1483 if (sd->zoom.enabled)
1485 _e_desk_client_zoom(ec,
1486 sd->zoom.ratio_x, sd->zoom.ratio_y,
1487 sd->zoom.cord_x, sd->zoom.cord_y);
1492 e_desk_zoom_is_animating(E_Desk *desk)
1494 E_DESK_SMART_DATA_GET(desk->smart_obj, sd);
1495 if (!sd) return EINA_FALSE;
1497 if (!e_config->desk_zoom_effect.enable) return EINA_FALSE;
1499 return !!sd->zoom.animator;
1503 e_desk_visible_client_iconify_all(E_Desk *desk)
1510 ELOGF("DESK", "ICONIFY ALL VISIBLE WINDOW", NULL);
1511 E_CLIENT_REVERSE_FOREACH(ec)
1513 if (!e_desk_has_ec(desk, ec)) continue;
1514 if (e_object_is_del(E_OBJECT(ec))) continue;
1515 if (!ec->visible) continue;
1516 if (ec->netwm.type == E_WINDOW_TYPE_DESKTOP) continue;
1517 if (e_client_desk_iconify_skip_get(ec)) continue;
1518 if (e_client_visibility_get(ec) == E_VISIBILITY_UNKNOWN) continue;
1519 if (e_client_visibility_get(ec) != E_VISIBILITY_UNOBSCURED)
1521 if (e_client_is_iconified_by_client(ec))
1525 ELOGF("DESK", "Add to iconified list...", ec);
1526 desk->iconified_list = eina_list_remove(desk->iconified_list, ec);
1527 desk->iconified_list = eina_list_append(desk->iconified_list, ec);
1531 EINA_LIST_REVERSE_FOREACH(desk->iconified_list, l, ec)
1533 e_client_iconified_type_set(ec, E_ICONIFIED_TYPE_DESK_ICONIFY_BY_CLIENT);
1534 e_policy_wl_iconify_state_change_send(ec, 1);
1535 e_client_iconify(ec);
1540 e_desk_visible_client_restore_all(E_Desk *desk)
1543 Eina_List *restore_list;
1547 if (!desk->iconified_list) return;
1549 ELOGF("DESK", "RESTORE ALL VISIBLE WINDOW", NULL);
1551 restore_list = eina_list_clone(desk->iconified_list);
1553 eina_list_free(desk->iconified_list);
1554 desk->iconified_list = NULL;
1557 EINA_LIST_REVERSE_FOREACH(restore_list, l, ec)
1559 ELOGF("DESK", "Restore from iconified list...", ec);
1560 e_client_iconified_type_set(ec, E_ICONIFIED_TYPE_NONE);
1561 e_policy_wl_iconify_state_change_send(ec, 0);
1562 e_client_uniconify(ec);
1564 eina_list_free(restore_list);
1568 e_desk_visible_client_iconified_list_remove(E_Desk *desk, E_Client *ec)
1570 if (!desk || !ec) return;
1571 if (!desk->iconified_list) return;
1573 ELOGF("DESK", "Remove from iconified list", ec);
1574 desk->iconified_list = eina_list_remove(desk->iconified_list, ec);
1578 e_desk_visible_client_iconified_list_remove_all(E_Desk *desk)
1581 if (!desk->iconified_list) return;
1583 ELOGF("DESK", "Remove iconified list all", NULL);
1584 eina_list_free(desk->iconified_list);
1585 desk->iconified_list = NULL;
1589 e_desk_visible_client_iconified_list_get(E_Desk *desk)
1591 if (!desk) return NULL;
1592 return desk->iconified_list;
1596 _e_desk_free(E_Desk *desk)
1601 if (e_config->use_desk_area)
1603 for (int i=E_DESK_AREA_LAYER_COUNT-1; i>=0; i--)
1605 EINA_LIST_FOREACH(desk->desk_area.list[i], l, eda)
1607 e_object_del(E_OBJECT(eda));
1609 eina_list_free(desk->desk_area.list[i]);
1610 desk->desk_area.list[i] = NULL;
1613 e_desk_desk_area_del(desk, desk->desk_area.base);
1614 desk->desk_area.base = NULL;
1615 desk->desk_area.active = NULL;
1619 E_FREE_FUNC(desk->smart_obj, evas_object_del);
1620 eina_stringshare_del(desk->name);
1622 E_FREE_LIST(desk->handlers, ecore_event_handler_del);
1624 _e_desk_private_finish(desk);
1629 _e_desk_event_desk_show_free(void *data EINA_UNUSED, void *event)
1631 E_Event_Desk_Show *ev;
1634 e_object_unref(E_OBJECT(ev->desk));
1639 _e_desk_event_desk_before_show_free(void *data EINA_UNUSED, void *event)
1641 E_Event_Desk_Before_Show *ev;
1644 e_object_unref(E_OBJECT(ev->desk));
1649 _e_desk_event_desk_after_show_free(void *data EINA_UNUSED, void *event)
1651 E_Event_Desk_After_Show *ev;
1654 e_object_unref(E_OBJECT(ev->desk));
1659 _e_desk_event_desk_geometry_change_free(void *data EINA_UNUSED, void *event)
1661 E_Event_Desk_Geometry_Change *ev = event;
1662 e_object_unref(E_OBJECT(ev->desk));
1667 _e_desk_transition_setup(E_Client *ec, int dx, int dy, int state)
1669 e_comp_object_effect_set(ec->frame, "none");
1675 _e_desk_show_end(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
1677 E_Client *ec = data;
1681 ec_zone = e_comp_zone_find_by_ec(ec);
1682 ec_desk = e_zone_desk_find_by_ec(ec_zone, ec);
1684 ec_desk->animate_count--;
1686 e_client_comp_hidden_set(ec, 0);
1687 e_comp_object_effect_unclip(ec->frame);
1689 if (!ec->visible) evas_object_show(ec->frame);
1691 if (ec_desk != e_desk_current_get(ec_zone)) return;
1695 _e_desk_hide_end(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
1697 E_Client *ec = data;
1700 ec_desk = e_comp_desk_find_by_ec(ec);
1702 ec_desk->animate_count--;
1704 evas_object_hide(ec->frame);
1708 _e_desk_show_begin(E_Desk *desk, int dx, int dy)
1712 if (dx < 0) dx = -1;
1714 if (dy < 0) dy = -1;
1717 desk->animate_count = 0;
1718 E_CLIENT_FOREACH(ec)
1720 if (e_client_util_ignored_get(ec) || (!e_zone_has_ec(desk->zone, ec)) || (ec->iconic)) continue;
1723 e_desk_client_add(desk, ec);
1724 evas_object_show(ec->frame);
1727 if ((!e_desk_has_ec(desk, ec)) || (ec->sticky)) continue;
1728 if ((!starting) && (!ec->new_client) && _e_desk_transition_setup(ec, dx, dy, 1))
1730 e_comp_object_effect_stop(ec->frame, _e_desk_hide_end);
1731 e_comp_object_effect_start(ec->frame, _e_desk_show_end, ec);
1732 desk->animate_count++;
1737 e_client_comp_hidden_set(ec, ec->hidden);
1738 evas_object_show(ec->frame);
1743 _e_desk_hide_begin(E_Desk *desk, int dx, int dy)
1747 if (dx < 0) dx = -1;
1749 if (dy < 0) dy = -1;
1752 desk->animate_count = 0;
1753 E_CLIENT_FOREACH(ec)
1755 if (e_client_util_ignored_get(ec)) continue;
1756 if ((!e_zone_has_ec(desk->zone, ec)) || (ec->iconic)) continue;
1757 if (ec->moving) continue;
1758 if ((!e_desk_has_ec(desk, ec)) || (ec->sticky)) continue;
1759 if ((!starting) && (!ec->new_client) && _e_desk_transition_setup(ec, -dx, -dy, 0))
1761 e_comp_object_effect_stop(ec->frame, _e_desk_show_end);
1762 e_comp_object_effect_start(ec->frame, _e_desk_hide_end, ec);
1763 desk->animate_count++;
1768 evas_object_show(ec->frame);
1769 ec->changes.visible = 0;
1770 evas_object_hide(ec->frame);
1772 e_client_comp_hidden_set(ec, EINA_TRUE);
1777 _e_desk_smart_init(E_Desk *desk)
1783 desk->smart_obj = evas_object_smart_add(e_comp->evas, _e_desk_smart_class_new());
1784 e_desk_geometry_set(desk, zone->x, zone->y, zone->w, zone->h);
1786 E_DESK_SMART_DATA_GET_OR_RETURN(desk->smart_obj, sd);
1788 sd->zoom.ratio_x = 1.0;
1789 sd->zoom.ratio_y = 1.0;
1790 sd->zoom.cord_x = 0;
1791 sd->zoom.cord_y = 0;
1795 _e_desk_smart_client_cb_resize(void *data, int type, void *event)
1798 E_Desk_Smart_Data *sd;
1799 E_Client *ec = NULL;
1801 if (!data) goto end;
1802 if (!event) goto end;
1809 if (!eina_list_data_find(sd->clients, ec))
1812 if (sd->zoom.animator)
1815 if (sd->zoom.enabled)
1816 _e_desk_client_zoom(ec,
1817 sd->zoom.ratio_x, sd->zoom.ratio_y,
1818 sd->zoom.cord_x, sd->zoom.cord_y);
1820 return ECORE_CALLBACK_PASS_ON;
1824 _e_desk_smart_add(Evas_Object *obj)
1826 EVAS_SMART_DATA_ALLOC(obj, E_Desk_Smart_Data);
1828 /* to apply zoom transformation whenever the client's size is changed. */
1829 E_LIST_HANDLER_APPEND(priv->handlers, E_EVENT_CLIENT_RESIZE, _e_desk_smart_client_cb_resize, priv);
1831 /* FIXME hard coded, it will be laid upper than unpacked clients */
1832 evas_object_layer_set(obj, E_LAYER_DESK_OBJECT);
1834 _e_desk_parent_sc->add(obj);
1838 _e_desk_smart_del(Evas_Object *obj)
1840 _e_desk_parent_sc->del(obj);
1842 E_DESK_SMART_DATA_GET_OR_RETURN(obj, sd);
1844 E_FREE_LIST(sd->handlers, ecore_event_handler_del);
1845 eina_list_free(sd->clients);
1848 evas_object_smart_data_set(obj, NULL);
1852 _e_desk_smart_member_add(Evas_Object *obj, Evas_Object *child)
1857 _e_desk_parent_sc->member_add(obj, child);
1859 ec = evas_object_data_get(child, "E_Client");
1862 ec_desk = e_comp_desk_find_by_ec(ec);
1864 e_desk_client_del(ec_desk, ec);
1869 _e_desk_smart_member_del(Evas_Object *obj, Evas_Object *child)
1871 E_Client *ec = NULL;
1872 Evas_Object *parent = NULL;
1876 _e_desk_parent_sc->member_del(obj, child);
1878 // if quickpanel packed into mover smart obj, _e_desk_smart_member_del is called
1879 // but parent is still e_desk, because mover's parent is the same e_desk
1880 // than don't add ec on the sd->clists
1881 parent = evas_object_smart_parent_get(child);
1882 if (parent && (parent == obj)) return;
1884 ec = evas_object_data_get(child, "E_Client");
1887 ec_zone = e_comp_zone_find_by_ec(ec);
1888 ec_desk = e_zone_desk_find_by_ec(ec_zone, ec);
1890 _e_desk_smart_client_add(ec_desk->smart_obj, ec);
1895 _e_desk_smart_set_user(Evas_Smart_Class *sc)
1897 sc->add = _e_desk_smart_add;
1898 sc->del = _e_desk_smart_del;
1899 sc->member_add = _e_desk_smart_member_add;
1900 sc->member_del = _e_desk_smart_member_del;
1904 _e_desk_smart_client_add(Evas_Object *obj, E_Client *ec)
1906 Evas_Object *parent = NULL;
1909 E_DESK_SMART_DATA_GET_OR_RETURN(obj, sd);
1911 ec_desk = e_comp_desk_find_by_ec(ec);
1912 if (!ec_desk) return;
1914 // if ec is a member of e_desk, don't add it in data.
1915 parent = evas_object_smart_parent_get(ec->frame);
1916 if (parent && (parent == ec_desk->smart_obj)) return;
1918 if (eina_list_data_find(sd->clients, ec))
1921 sd->clients = eina_list_append(sd->clients, ec);
1922 evas_object_smart_changed(obj);
1926 _e_desk_smart_client_del(Evas_Object *obj, E_Client *ec)
1928 E_DESK_SMART_DATA_GET_OR_RETURN(obj, sd);
1930 if (!eina_list_data_find(sd->clients, ec))
1933 if (sd->zoom.enabled)
1934 _e_desk_client_zoom(ec, 1.0, 1.0, 0, 0);
1936 sd->clients = eina_list_remove(sd->clients, ec);
1937 evas_object_smart_changed(obj);
1941 _e_desk_object_zoom(Evas_Object *obj, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy)
1946 if ((zoomx == 1.0) && (zoomy == 1.0))
1948 e_comp_object_map_enable_set(obj, EINA_FALSE);
1949 e_comp_object_map_set(obj, NULL);
1954 e_map_util_points_populate_from_object(map, obj);
1955 e_map_util_zoom(map, zoomx, zoomy, cx, cy);
1956 e_comp_object_map_set(obj, map);
1957 e_comp_object_map_enable_set(obj, EINA_TRUE);
1962 _e_desk_client_subsurf_create(void *data, E_Client *subc)
1964 E_Client *ec, *parent;
1967 if (ec != subc) return;
1969 if (ec->desk_zoom.transform)
1971 e_client_transform_core_remove(ec, ec->desk_zoom.transform);
1972 E_FREE_FUNC(ec->desk_zoom.transform, e_util_transform_del);
1975 parent = e_comp_wl_topmost_parent_get(ec);
1978 parent->transform_core.changed = EINA_TRUE;
1979 e_client_transform_core_update(parent);
1984 _e_desk_client_deskzoom_set(E_Client *ec, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy)
1986 if (e_comp_wl_subsurface_check(ec)) return;
1988 if ((zoomx == 1.0) && (zoomy == 1.0))
1990 if (ec->desk_zoom.transform)
1991 e_client_transform_core_remove(ec, ec->desk_zoom.transform);
1992 e_client_transform_core_update(ec);
1996 if (!ec->desk_zoom.transform)
1998 ec->desk_zoom.transform = e_util_transform_new();
1999 e_util_transform_role_set(ec->desk_zoom.transform, "desk_zoom");
2001 if (!ec->desk_zoom.hook_subsurf_create)
2003 ec->desk_zoom.hook_subsurf_create =
2004 e_comp_wl_hook_add(E_COMP_WL_HOOK_SUBSURFACE_CREATE,
2005 _e_desk_client_subsurf_create, ec);
2009 e_util_transform_zoom_set(ec->desk_zoom.transform, zoomx, zoomy, cx, cy);
2010 e_client_transform_core_add(ec, ec->desk_zoom.transform);
2012 e_client_transform_core_update(ec);
2016 _e_desk_client_zoom(E_Client *ec, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy)
2018 if (e_object_is_del(E_OBJECT(ec))) return;
2019 if (ec->is_cursor) return;
2021 if ((zoomx == 1.0) && (zoomy == 1.0))
2022 e_client_desk_zoom_enable_set(ec, EINA_FALSE);
2024 e_client_desk_zoom_enable_set(ec, EINA_TRUE);
2026 _e_desk_client_deskzoom_set(ec, zoomx, zoomy, cx, cy);
2028 if (evas_object_visible_get(ec->frame))
2031 e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
2032 e_comp_object_dirty(ec->frame);
2033 e_comp_object_render(ec->frame);
2038 _e_desk_desk_area_layer_map(E_Desk_Area_Layer layer)
2042 case E_DESK_AREA_LAYER_BACKGROUND: return 0;
2043 case E_DESK_AREA_LAYER_NORMAL_BELOW: return 1;
2044 case E_DESK_AREA_LAYER_NORMAL: return 2;
2045 case E_DESK_AREA_LAYER_NORMAL_ABOVE: return 3;
2046 case E_DESK_AREA_LAYER_NOTIFICATION_LOW: return 4;
2047 case E_DESK_AREA_LAYER_NOTIFICATION_NORMAL: return 5;
2048 case E_DESK_AREA_LAYER_NOTIFICATION_HIGH: return 6;
2049 case E_DESK_AREA_LAYER_NOTIFICATION_TOP: return 7;
2050 case E_DESK_AREA_LAYER_SYSTEM: return 8;
2056 e_desk_desk_area_add(E_Desk *desk, int x, int y, int w, int h, E_Desk_Area_Layer layer)
2060 unsigned int list_id;
2062 if (!e_config->use_desk_area) return NULL;
2064 E_OBJECT_CHECK_RETURN(desk, NULL);
2065 E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, NULL);
2067 id = desk->desk_area.id;
2069 eda = e_desk_area_new(desk, id, x, y, w, h, layer);
2075 list_id = _e_desk_desk_area_layer_map(layer);
2076 desk->desk_area.list[list_id] = eina_list_prepend(desk->desk_area.list[list_id], eda);
2077 desk->desk_area.id++;
2083 e_desk_desk_area_del(E_Desk *desk, E_Desk_Area *eda)
2085 unsigned int list_id;
2087 E_OBJECT_CHECK(desk);
2088 E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
2090 if (!e_config->use_desk_area) return;
2094 list_id = _e_desk_desk_area_layer_map(e_desk_area_layer_get(eda));
2095 desk->desk_area.list[list_id] = eina_list_remove(desk->desk_area.list[list_id], eda);
2098 #ifdef REFACTOR_DESK_AREA
2101 _e_desk_desk_area_base_new(E_Desk *desk)
2103 if (!desk) return EINA_FALSE;
2104 if (!e_config->use_desk_area) return EINA_FALSE;
2106 if (!desk->desk_area.base)
2108 // Add a base e_desk_area
2109 desk->desk_area.base = e_desk_desk_area_add(desk, desk->geom.x, desk->geom.y, desk->geom.w, desk->geom.h, E_DESK_AREA_LAYER_NORMAL);
2112 if (!desk->desk_area.base)
2119 EINTERN E_Desk_Area *
2120 e_desk_desk_area_base_get(E_Desk *desk)
2122 E_OBJECT_CHECK_RETURN(desk, NULL);
2123 E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, NULL);
2125 if (!e_config->use_desk_area) return NULL;
2127 return desk->desk_area.base;
2131 e_desk_desk_area_active_set(E_Desk *desk, E_Desk_Area *eda)
2133 E_OBJECT_CHECK(desk);
2134 E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
2136 if (!e_config->use_desk_area) return;
2137 if (desk->desk_area.active == eda) return;
2139 desk->desk_area.active = eda;
2141 wl_signal_emit_mutable(&PRI(desk)->events.desk_area_active_change, desk);
2142 _e_desk_hook_call(E_DESK_HOOK_DESK_AREA_ACTIVE_CHANGE, desk);
2145 EINTERN E_Desk_Area *
2146 e_desk_desk_area_active_get(E_Desk *desk)
2148 E_OBJECT_CHECK_RETURN(desk, NULL);
2149 E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, NULL);
2151 if (!e_config->use_desk_area) return NULL;
2153 return desk->desk_area.active;
2156 #ifdef REFACTOR_DESK_AREA
2159 _e_desk_desk_area_check_ec_in_desk_area(E_Desk *desk)
2162 Eina_List *ec_list = NULL;
2164 E_CLIENT_FOREACH(ec)
2166 if (!e_desk_has_ec(desk, ec)) continue;
2167 if (e_object_is_del(E_OBJECT(ec))) continue;
2168 if (ec->desk_area.desk_area) continue;
2170 ec_list = eina_list_append(ec_list, ec);
2173 EINA_LIST_FREE(ec_list, ec)
2174 e_desk_area_ec_reassign(desk->desk_area.base, ec);
2178 e_desk_desk_area_enable(E_Desk *desk)
2180 E_Desk_Area *eda = NULL;
2183 if (!e_config->use_desk_area) return EINA_FALSE;
2185 E_OBJECT_CHECK_RETURN(desk, EINA_FALSE);
2186 E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, EINA_FALSE);
2188 ELOGF("EDG", "Enable Desk_Area...", NULL);
2189 if (desk->desk_area.enable) return EINA_TRUE;
2190 desk->desk_area.enable = EINA_TRUE;
2192 wl_signal_emit_mutable(&PRI(desk)->events.desk_area_enable, desk);
2193 _e_desk_hook_call(E_DESK_HOOK_DESK_AREA_ENABLE, desk);
2195 // check all ec is included in desk group
2196 _e_desk_desk_area_check_ec_in_desk_area(desk);
2198 for (int i=0; i<E_DESK_AREA_LAYER_COUNT; i++)
2200 EINA_LIST_REVERSE_FOREACH(desk->desk_area.list[i], l, eda)
2202 e_desk_area_enable_set(eda, EINA_TRUE);
2210 e_desk_desk_area_disable(E_Desk *desk)
2212 E_Desk_Area *eda = NULL;
2215 if (!e_config->use_desk_area) return EINA_FALSE;
2217 E_OBJECT_CHECK_RETURN(desk, EINA_FALSE);
2218 E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, EINA_FALSE);
2220 ELOGF("EDG", "Disable Desk_Area...", NULL);
2221 if (!desk->desk_area.enable) return EINA_TRUE;
2222 desk->desk_area.enable = EINA_FALSE;
2224 wl_signal_emit_mutable(&PRI(desk)->events.desk_area_disable, desk);
2225 _e_desk_hook_call(E_DESK_HOOK_DESK_AREA_DISABLE, desk);
2227 for (int i=0; i<E_DESK_AREA_LAYER_COUNT; i++)
2229 EINA_LIST_REVERSE_FOREACH(desk->desk_area.list[i], l, eda)
2231 e_desk_area_enable_set(eda, EINA_FALSE);
2239 e_desk_desk_area_raise(E_Desk *desk, E_Desk_Area *eda)
2241 unsigned int list_id;
2243 if (!e_config->use_desk_area) return;
2245 E_OBJECT_CHECK(desk);
2246 E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
2250 ELOGF("EDG", "Raise Desk_Area... eda:%p", NULL, eda);
2252 list_id = _e_desk_desk_area_layer_map(e_desk_area_layer_get(eda));
2253 desk->desk_area.list[list_id] = eina_list_remove(desk->desk_area.list[list_id], eda);
2254 desk->desk_area.list[list_id] = eina_list_prepend(desk->desk_area.list[list_id], eda);
2256 e_desk_area_raise(eda);
2260 e_desk_desk_area_lower(E_Desk *desk, E_Desk_Area *eda)
2262 unsigned int list_id;
2264 if (!e_config->use_desk_area) return;
2266 E_OBJECT_CHECK(desk);
2267 E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
2271 ELOGF("EDG", "Lower Desk_Area...", NULL);
2273 list_id = _e_desk_desk_area_layer_map(e_desk_area_layer_get(eda));
2274 desk->desk_area.list[list_id] = eina_list_remove(desk->desk_area.list[list_id], eda);
2275 desk->desk_area.list[list_id] = eina_list_append(desk->desk_area.list[list_id], eda);
2277 e_desk_area_lower(eda);
2280 // get above E_Desk_Area in the same eda layer
2281 EINTERN E_Desk_Area *
2282 e_desk_desk_area_above_get(E_Desk *desk, E_Desk_Area *eda)
2284 Eina_List *l = NULL;
2285 E_Desk_Area *above = NULL;
2286 E_Desk_Area *temp = NULL;
2287 unsigned int list_id;
2289 if (!desk) return NULL;
2290 if (!eda) return NULL;
2292 list_id = _e_desk_desk_area_layer_map(e_desk_area_layer_get(eda));
2293 EINA_LIST_FOREACH(desk->desk_area.list[list_id], l, temp)
2301 ELOGF("EDG", "Get Above E_Desk_Area:%p... current:%p", NULL, above, eda);
2305 // get below E_Desk_Area in the same eda layer
2306 EINTERN E_Desk_Area *
2307 e_desk_desk_area_below_get(E_Desk *desk, E_Desk_Area *eda)
2309 Eina_List *l = NULL;
2310 E_Desk_Area *below = NULL;
2311 E_Desk_Area *temp = NULL;
2312 unsigned int list_id;
2314 if (!desk) return NULL;
2315 if (!eda) return NULL;
2317 list_id = _e_desk_desk_area_layer_map(e_desk_area_layer_get(eda));
2318 EINA_LIST_REVERSE_FOREACH(desk->desk_area.list[list_id], l, temp)
2326 ELOGF("EDG", "Get Below E_Desk_Area:%p... current:%p", NULL, below, eda);
2331 _e_desk_hooks_clean(void)
2337 for (x = 0; x < E_DESK_HOOK_LAST; x++)
2338 EINA_INLIST_FOREACH_SAFE(_e_desk_hooks[x], l, dh)
2340 if (!dh->delete_me) continue;
2341 _e_desk_hooks[x] = eina_inlist_remove(_e_desk_hooks[x], EINA_INLIST_GET(dh));
2345 _e_desk_hooks_delete = 0;
2349 _e_desk_hook_call(E_Desk_Hook_Point hookpoint, E_Desk *desk)
2353 e_object_ref(E_OBJECT(desk));
2354 _e_desk_hooks_walking++;
2355 EINA_INLIST_FOREACH(_e_desk_hooks[hookpoint], dh)
2357 if (dh->delete_me) continue;
2358 dh->func(dh->data, desk);
2360 _e_desk_hooks_walking--;
2361 if ((_e_desk_hooks_walking == 0) && (_e_desk_hooks_delete > 0))
2362 _e_desk_hooks_clean();
2364 return !!e_object_unref(E_OBJECT(desk));
2368 e_desk_hook_add(E_Desk_Hook_Point hookpoint, E_Desk_Hook_Cb func, const void *data)
2372 EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_DESK_HOOK_LAST, NULL);
2373 dh = E_NEW(E_Desk_Hook, 1);
2374 if (!dh) return NULL;
2376 dh->hookpoint = hookpoint;
2378 dh->data = (void*)data;
2380 _e_desk_hooks[hookpoint] = eina_inlist_append(_e_desk_hooks[hookpoint], EINA_INLIST_GET(dh));
2385 e_desk_hook_del(E_Desk_Hook * dh)
2388 if (_e_desk_hooks_walking == 0)
2390 _e_desk_hooks[dh->hookpoint] = eina_inlist_remove(_e_desk_hooks[dh->hookpoint], EINA_INLIST_GET(dh));
2394 _e_desk_hooks_delete++;
2398 e_desk_desk_area_info_print(E_Desk *desk)
2400 E_Desk_Area *eda = NULL;
2403 E_OBJECT_CHECK(desk);
2404 E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
2406 for (int i=E_DESK_AREA_LAYER_COUNT-1; i>=0; i--)
2408 EINA_LIST_FOREACH(desk->desk_area.list[i], l, eda)
2410 e_desk_area_info_print(eda);
2416 _e_desk_cb_splitscreen_destroy(struct wl_listener *listener EINA_UNUSED, void *data EINA_UNUSED)
2422 _e_desk_cb_split_desk_activate(struct wl_listener *listener, void *data)
2424 E_Desk_Private *priv;
2426 priv = container_of(listener, E_Desk_Private, ds_tizen_splitscreen_activate);
2428 // call the hook for activating the splitscreen in this zone
2429 wl_signal_emit_mutable(&priv->events.split_desk_activate, NULL);
2430 _e_desk_hook_call(E_DESK_HOOK_SPLIT_DESK_ACTIVATE, priv->desk);
2434 _e_desk_cb_split_desk_deactivate(struct wl_listener *listener, void *data)
2436 E_Desk_Private *priv;
2438 priv = container_of(listener, E_Desk_Private, ds_tizen_splitscreen_deactivate);
2440 // call the hook for deactivating the splitscreen in this desk
2441 wl_signal_emit_mutable(&priv->events.split_desk_deactivate, NULL);
2442 _e_desk_hook_call(E_DESK_HOOK_SPLIT_DESK_DEACTIVATE, priv->desk);
2446 e_desk_splitscreen_enable(E_Desk *desk,
2447 struct ds_tizen_splitscreen *splitscreen)
2450 struct ds_tizen_splitscreen_region *splitscreen_region;
2453 const char *eda_name;
2456 E_OBJECT_CHECK_RETURN(desk, EINA_FALSE);
2457 E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, EINA_FALSE);
2458 API_ENTRY_VAL(EINA_FALSE);
2460 priv->splitscreen = splitscreen;
2461 priv->ds_tizen_splitscreen_destroy.notify = _e_desk_cb_splitscreen_destroy;
2462 ds_tizen_splitscreen_add_destroy_listener(priv->splitscreen,
2463 &priv->ds_tizen_splitscreen_destroy);
2464 priv->ds_tizen_splitscreen_activate.notify = _e_desk_cb_split_desk_activate;
2465 ds_tizen_splitscreen_add_activate_listener(priv->splitscreen,
2466 &priv->ds_tizen_splitscreen_activate);
2467 priv->ds_tizen_splitscreen_deactivate.notify = _e_desk_cb_split_desk_deactivate;
2468 ds_tizen_splitscreen_add_deactivate_listener(priv->splitscreen,
2469 &priv->ds_tizen_splitscreen_deactivate);
2471 for (i = (E_DESK_AREA_LAYER_COUNT - 1); i >= 0; i--)
2473 EINA_LIST_FOREACH(desk->desk_area.list[i], l, eda)
2475 eda_name = e_desk_area_name_get(eda);
2476 // The eda->name can be an id of the desk group.
2479 ERR("E_Desk: eda->name is null.");
2483 e_desk_area_geometry_get(eda, &x, &y, &w, &h);
2484 splitscreen_region = ds_tizen_splitscreen_region_create(
2485 splitscreen, eda_name, x, y, w, h);
2486 if (!splitscreen_region)
2488 ERR("E_Desk: ds_tizen_splitscreen_region_create() failed.");
2492 if (!e_desk_area_splitscreen_region_enable(eda, splitscreen_region))
2494 ERR("E_Desk: e_desk_area_splitscreen_region_enable() failed.");
2504 e_desk_has_ec(E_Desk *desk, E_Client *ec)
2508 EINA_SAFETY_ON_NULL_RETURN_VAL(desk, EINA_FALSE);
2510 data = evas_object_data_get(ec->frame, DESK_EC_DATA_KEY);
2511 if (data == desk) return EINA_TRUE;
2516 #ifdef REFACTOR_DESK_AREA
2518 e_desk_top_ec_get(E_Desk *desk)
2522 EINA_SAFETY_ON_NULL_RETURN_VAL(desk, EINA_FALSE);
2524 // TODO: get the desk_area which is at top among the desk_areas in this desk
2525 eda = desk->desk_area.base;
2527 return e_desk_area_top_ec_get(eda);
2531 e_desk_bottom_ec_get(E_Desk *desk)
2535 EINA_SAFETY_ON_NULL_RETURN_VAL(desk, EINA_FALSE);
2537 // TODO: get the desk_area which is at bottom among the desk_areas in this desk
2538 eda = desk->desk_area.base;
2540 return e_desk_area_bottom_ec_get(eda);
2544 e_desk_desk_area_find_by_ec(E_Desk *desk, E_Client *ec)
2548 EINA_SAFETY_ON_NULL_RETURN_VAL(desk, NULL);
2549 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, NULL);
2551 if (!e_desk_has_ec(desk, ec)) return NULL;
2553 // TODO: find the desk_area which has the ec among the desk_areas in this desk
2554 eda = desk->desk_area.base;
2555 if (e_desk_area_has_ec(eda, ec))
2563 e_desk_client_add_listener_add(E_Desk *desk, struct wl_listener *listener)
2566 wl_signal_add(&priv->events.client_add, listener);
2570 e_desk_desk_area_enable_listener_add(E_Desk *desk, struct wl_listener *listener)
2573 wl_signal_add(&priv->events.desk_area_enable, listener);
2577 e_desk_desk_area_disable_listener_add(E_Desk *desk, struct wl_listener *listener)
2580 wl_signal_add(&priv->events.desk_area_disable, listener);
2584 e_desk_desk_area_active_change_listener_add(E_Desk *desk, struct wl_listener *listener)
2587 wl_signal_add(&priv->events.desk_area_active_change, listener);
2591 e_desk_ssplit_desk_activate_listener_add(E_Desk *desk, struct wl_listener *listener)
2594 wl_signal_add(&priv->events.split_desk_activate, listener);
2598 e_desk_split_desk_deactivate_listener_add(E_Desk *desk, struct wl_listener *listener)
2601 wl_signal_add(&priv->events.split_desk_deactivate, listener);