e_policy_desk: Seperate logic code from E_Desk to E_Policy_Desk 21/317321/1
authorJunseok Kim <juns.kim@samsung.com>
Mon, 19 Aug 2024 11:37:35 +0000 (20:37 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Mon, 9 Sep 2024 03:14:32 +0000 (12:14 +0900)
Change-Id: I6a628159a745e376bec8e5dd04db7e2332cb7e91

12 files changed:
src/bin/compmgr/e_comp_canvas.c
src/bin/core/e_desk.c
src/bin/core/e_desk_area.c
src/bin/core/e_desk_intern.h
src/bin/core/e_zone.c
src/bin/core/e_zone_intern.h
src/bin/windowmgr/e_policy.c
src/bin/windowmgr/e_policy_desk.c
src/bin/windowmgr/e_policy_desk_intern.h
src/bin/windowmgr/e_policy_intern.h
src/bin/windowmgr/e_policy_zone.c
src/include/e_desk.h

index 18246801a77fa37f08b4d973711d3c465413c3d3..22551c5db4d739d88ea9d3649f8453cbb99e9d1e 100644 (file)
@@ -14,6 +14,7 @@
 
 #ifdef CONTAINER_POLICY
 #include "e_policy_zone_intern.h"
+#include "e_policy_desk_intern.h"
 #endif
 
 static Eina_List *handlers;
@@ -131,6 +132,7 @@ e_comp_canvas_init(int w, int h)
    E_Tizen_Screen *tizen_screen;
 #ifdef CONTAINER_POLICY
    E_Policy_Zone *policy_zone;
+   e_policy_desk_init();
 #endif
 
    TRACE_DS_BEGIN(COMP_CANVAS:INIT);
index f91c78663d6eb5e34bfffc66482b5a2a6e6014ac..c95eded84c883b99165facec93ffd8ee1fc1a429 100644 (file)
@@ -1,18 +1,23 @@
 #include "e_desk_intern.h"
+#include "e_zone_intern.h"
 #include "e_desk_area_intern.h"
 #include "e_client_intern.h"
+
+#include "e_view_intern.h"
+#include "e_view_client_intern.h"
+
+#include <libds-tizen/screen.h>
+
+#ifdef CONTAINER_POLICY
+#else
 #include "e_utils_intern.h"
 #include "e_comp_wl_subsurface_intern.h"
 #include "e_output_intern.h"
-#include "e_zone_intern.h"
 #include "e_config_intern.h"
 #include "e_policy_wl_intern.h"
 #include "e_policy_intern.h"
 #include "e_display_intern.h"
-#include "e_view_intern.h"
-#include "e_view_client_intern.h"
-
-#include <libds-tizen/screen.h>
+#endif
 
 /* E_Desk is a child object of E_Zone. A desk is essentially a background
  * and an associated set of client windows. Each zone can have an arbitrary
  */
 
 typedef struct _E_Desk_Private    E_Desk_Private;
+#ifdef CONTAINER_POLICY
+#else
 typedef struct _E_Desk_Private_Client  E_Desk_Private_Client;
+#endif
+
+#ifdef CONTAINER_POLICY
+#else
 typedef struct _E_Desk_Smart_Data E_Desk_Smart_Data;
+#endif
 
 #define DESK_EC_DATA_KEY  "E_Desk_Client"
 
 #define PRI(desk) ((E_Desk_Private *)e_object_data_get(E_OBJECT(desk)))
 
+
 #define API_ENTRY \
    EINA_SAFETY_ON_NULL_RETURN(desk); \
    E_Desk_Private *priv = PRI(desk); \
    EINA_SAFETY_ON_NULL_RETURN(priv);
 
+#ifdef CONTAINER_POLICY
+#else
+
 #define E_DESK_SMART_DATA_GET(obj, ptr)                        \
    E_Desk_Smart_Data *ptr = evas_object_smart_data_get(obj);
 
@@ -43,13 +59,17 @@ typedef struct _E_Desk_Smart_Data E_Desk_Smart_Data;
 #define E_DESK_SMART_DATA_GET_OR_RETURN(obj, ptr)              \
    E_DESK_SMART_DATA_GET(obj, ptr);                            \
    if (!ptr) return
+#endif
 
+#ifdef CONTAINER_POLICY
+#else
 typedef enum _E_Desk_Zoom_Animating_Type
 {
    E_DESK_ZOOM_ANIMATING_TYPE_NONE,
    E_DESK_ZOOM_ANIMATING_TYPE_ENABLE,
    E_DESK_ZOOM_ANIMATING_TYPE_DISABLE,
 } E_Desk_Zoom_Animating_Type;
+#endif
 
 struct _E_Desk_Private
 {
@@ -58,12 +78,44 @@ struct _E_Desk_Private
    struct
      {
         struct wl_signal client_add;
+#ifdef CONTAINER_POLICY
+        struct wl_signal client_del;
+#endif
         struct wl_signal desk_area_enable;
         struct wl_signal desk_area_disable;
         struct wl_signal desk_area_active_change;
+#ifdef CONTAINER_POLICY
+        struct wl_signal desk_new;
+        struct wl_signal desk_free;
+        struct wl_signal top_visible_get;
+        struct wl_signal name_set;
+        struct wl_signal name_add;
+        struct wl_signal name_del;
+        struct wl_signal name_update;
+        struct wl_signal desk_show;
+        struct wl_signal desk_deskshow;
+        struct wl_signal geometry_set;
+        struct wl_signal zoom_set;
+        struct wl_signal zoom_get;
+        struct wl_signal zoom_get_center_coordinate;
+        struct wl_signal zoom_unset;
+        struct wl_signal smart_member_add;
+        struct wl_signal smart_member_del;
+        struct wl_signal client_zoom_skip_set;
+        struct wl_signal client_zoom_skip_unset;
+        struct wl_signal client_zoom_apply;
+        struct wl_signal zoom_is_animating;
+        struct wl_signal visible_client_iconify_all;
+        struct wl_signal visible_client_restore_all;
+        struct wl_signal client_iconified_list_remove;
+        struct wl_signal client_iconified_list_remove_all;
+#endif
      } events;
 };
 
+
+#ifdef CONTAINER_POLICY
+#else
 struct _E_Desk_Private_Client
 {
    E_Desk *desk;
@@ -92,7 +144,10 @@ struct _E_Desk_Smart_Data
       E_Desk_Zoom_Animating_Type animating_type;
    } zoom;
 };
+#endif
 
+#ifdef CONTAINER_POLICY
+#else
 static int _e_desk_hooks_delete = 0;
 static int _e_desk_hooks_walking = 0;
 
@@ -105,15 +160,17 @@ static Eina_Inlist *_e_desk_hooks[] =
    [E_DESK_HOOK_SPLIT_DESK_ACTIVATE] = NULL,
    [E_DESK_HOOK_SPLIT_DESK_DEACTIVATE] = NULL,
 };
+#endif
 
 static void      _e_desk_free(E_Desk *desk);
+#ifdef CONTAINER_POLICY
+#else
 static void      _e_desk_event_desk_show_free(void *data, void *ev);
 static void      _e_desk_event_desk_before_show_free(void *data, void *ev);
 static void      _e_desk_event_desk_after_show_free(void *data, void *ev);
 static void      _e_desk_show_begin(E_Desk *desk, int dx, int dy);
 static void      _e_desk_hide_begin(E_Desk *desk, int dx, int dy);
 static void      _e_desk_event_desk_geometry_change_free(void *data, void *ev);
-
 static void      _e_desk_smart_init(E_Desk *desk);
 static void      _e_desk_smart_add(Evas_Object *obj);
 static void      _e_desk_smart_del(Evas_Object *obj);
@@ -124,10 +181,14 @@ static void      _e_desk_client_zoom(E_Client *ec, double zoomx, double zoomy, E
 
 static void        _e_desk_hooks_clean(void);
 static Eina_Bool   _e_desk_hook_call(E_Desk_Hook_Point hookpoint, E_Desk *desk);
+#endif
 
+#ifdef CONTAINER_POLICY
+#else
 EVAS_SMART_SUBCLASS_NEW(E_DESK_SMART_OBJ_TYPE, _e_desk,
                         Evas_Smart_Class, Evas_Smart_Class,
                         evas_object_smart_clipped_class_get, NULL)
+#endif
 
 EINTERN int E_EVENT_DESK_SHOW = 0;
 EINTERN int E_EVENT_DESK_BEFORE_SHOW = 0;
@@ -150,9 +211,36 @@ _e_desk_private_init(E_Desk *desk)
    priv->desk = desk;
 
    wl_signal_init(&priv->events.client_add);
+   wl_signal_init(&priv->events.client_del);
    wl_signal_init(&priv->events.desk_area_enable);
    wl_signal_init(&priv->events.desk_area_disable);
    wl_signal_init(&priv->events.desk_area_active_change);
+#ifdef CONTAINER_POLICY
+   wl_signal_init(&priv->events.desk_new);
+   wl_signal_init(&priv->events.desk_free);
+   wl_signal_init(&priv->events.top_visible_get);
+   wl_signal_init(&priv->events.name_set);
+   wl_signal_init(&priv->events.name_add);
+   wl_signal_init(&priv->events.name_del);
+   wl_signal_init(&priv->events.name_update);
+   wl_signal_init(&priv->events.desk_show);
+   wl_signal_init(&priv->events.desk_deskshow);
+   wl_signal_init(&priv->events.geometry_set);
+   wl_signal_init(&priv->events.zoom_set);
+   wl_signal_init(&priv->events.zoom_get);
+   wl_signal_init(&priv->events.zoom_get_center_coordinate);
+   wl_signal_init(&priv->events.zoom_unset);
+   wl_signal_init(&priv->events.smart_member_add);
+   wl_signal_init(&priv->events.smart_member_del);
+   wl_signal_init(&priv->events.client_zoom_skip_set);
+   wl_signal_init(&priv->events.client_zoom_skip_unset);
+   wl_signal_init(&priv->events.client_zoom_apply);
+   wl_signal_init(&priv->events.zoom_is_animating);
+   wl_signal_init(&priv->events.visible_client_iconify_all);
+   wl_signal_init(&priv->events.visible_client_restore_all);
+   wl_signal_init(&priv->events.client_iconified_list_remove);
+   wl_signal_init(&priv->events.client_iconified_list_remove_all);
+#endif
 
    e_object_data_set(E_OBJECT(desk), priv);
 
@@ -174,6 +262,8 @@ _e_desk_private_finish(E_Desk *desk)
    free(priv);
 }
 
+#ifdef CONTAINER_POLICY
+#else
 static void
 _e_desk_event_simple_free(void *d EINA_UNUSED, E_Event_Desk *event)
 {
@@ -196,6 +286,7 @@ _e_desk_event_simple_add(E_Desk *desk, int type)
 
    ecore_event_add(type, ev, (Ecore_End_Cb)_e_desk_event_simple_free, NULL);
 }
+#endif
 
 EINTERN int
 e_desk_init(void)
@@ -222,10 +313,13 @@ EINTERN E_Desk *
 e_desk_new(E_Zone *zone, int x, int y)
 {
    E_Desk *desk;
+#ifdef CONTAINER_POLICY
+#else
    Eina_List *l;
    E_Config_Desktop_Name *cfname;
    char name[40];
    int ok = 0;
+#endif
    static int desk_id = 0;
 
    E_OBJECT_CHECK_RETURN(zone, NULL);
@@ -245,6 +339,9 @@ e_desk_new(E_Zone *zone, int x, int y)
    desk->y = y;
    desk->id = desk_id++;
 
+#ifdef CONTAINER_POLICY
+   wl_signal_emit(&PRI(desk)->events.desk_new, desk);
+#else
    /* init smart object */
    _e_desk_smart_init(desk);
 
@@ -275,6 +372,7 @@ e_desk_new(E_Zone *zone, int x, int y)
         e_object_del(E_OBJECT(desk));
         return NULL;
      }
+#endif
 
    return desk;
 }
@@ -282,14 +380,24 @@ e_desk_new(E_Zone *zone, int x, int y)
 EINTERN E_Client *
 e_desk_client_top_visible_get(E_Desk *desk)
 {
+#ifdef CONTAINER_POLICY
+   E_Desk_Data_Top_Visible_Get top_visible_data = {0,};
+   top_visible_data.desk = desk;
+#else
    E_Client *ec;
+#endif
 
    E_OBJECT_CHECK_RETURN(desk, NULL);
    E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, NULL);
 
+#ifdef CONTAINER_POLICY
+   wl_signal_emit(&PRI(desk)->events.top_visible_get, &top_visible_data);
+   return top_visible_data.visible_ec;
+#else
    E_CLIENT_REVERSE_FOREACH(ec)
      if (e_desk_has_ec(desk, ec) && e_view_client_visible_get(e_client_view_get(ec))) return ec;
    return NULL;
+#endif
 }
 
 EINTERN void
@@ -300,12 +408,36 @@ e_desk_name_set(E_Desk *desk, const char *name)
 
    eina_stringshare_replace(&desk->name, name);
 
+#ifdef CONTAINER_POLICY
+   wl_signal_emit(&PRI(desk)->events.name_set, NULL);
+#else
    _e_desk_event_simple_add(desk, E_EVENT_DESK_NAME_CHANGE);
+#endif
 }
 
 EINTERN void
 e_desk_name_add(int zone, int desk_x, int desk_y, const char *name)
 {
+#ifdef CONTAINER_POLICY
+   E_Desk_Data_Name name_data = {0,};
+   E_Zone *zone_ptr;
+   E_Desk *desk;
+   name_data.name = name;
+   name_data.desk_x = desk_x;
+   name_data.desk_y = desk_y;
+
+   zone_ptr = e_zone_get_by_id(zone);
+   // TODO: should we consider it as policy?
+   desk = e_desk_at_xy_get(zone_ptr, desk_x, desk_y);
+
+   if (!desk)
+     {
+        ERR("Desk at %d, %d is NULL...", desk_x, desk_y);
+        return;
+     }
+
+   wl_signal_emit(&PRI(desk)->events.name_add, &name_data);
+#else
    E_Config_Desktop_Name *cfname;
 
    e_desk_name_del(zone, desk_x, desk_y);
@@ -318,11 +450,31 @@ e_desk_name_add(int zone, int desk_x, int desk_y, const char *name)
    if (name) cfname->name = eina_stringshare_add(name);
    else cfname->name = NULL;
    e_config->desktop_names = eina_list_append(e_config->desktop_names, cfname);
+#endif
 }
 
 EINTERN void
 e_desk_name_del(int zone, int desk_x, int desk_y)
 {
+#ifdef CONTAINER_POLICY
+   E_Desk_Data_Name name_data = {0,};
+   E_Zone *zone_ptr;
+   E_Desk *desk;
+   name_data.desk_x = desk_x;
+   name_data.desk_y = desk_y;
+
+   zone_ptr = e_zone_get_by_id(zone);
+   // TODO: should we consider it as policy?
+   desk = e_desk_at_xy_get(zone_ptr, desk_x, desk_y);
+
+   if (!desk)
+     {
+        ERR("Desk at %d, %d is NULL...", desk_x, desk_y);
+        return;
+     }
+
+   wl_signal_emit(&PRI(desk)->events.name_del, &name_data);
+#else
    Eina_List *l = NULL;
    E_Config_Desktop_Name *cfname = NULL;
 
@@ -338,11 +490,18 @@ e_desk_name_del(int zone, int desk_x, int desk_y)
              break;
           }
      }
+#endif
 }
 
 EINTERN void
 e_desk_name_update(void)
 {
+#ifdef CONTAINER_POLICY
+   E_Desk *desk = e_desk_current_get(e_zone_current_get());
+   if (!desk) return;
+
+   wl_signal_emit(&PRI(desk)->events.name_update, NULL);
+#else
    const Eina_List *z, *l;
    E_Zone *zone;
    E_Desk *desk;
@@ -380,11 +539,14 @@ e_desk_name_update(void)
                }
           }
      }
+#endif
 }
 
 EINTERN void
 e_desk_show(E_Desk *desk)
 {
+#ifdef CONTAINER_POLICY
+#else
    E_Event_Desk_Show *ev = NULL;
    E_Event_Desk_Before_Show *eev = NULL;
    E_Event_Desk_After_Show *eeev = NULL;
@@ -393,11 +555,15 @@ e_desk_show(E_Desk *desk)
    int dx = 0, dy = 0;
    Ecore_Event *eev_ecore_event = NULL;
    Ecore_Event *ev_ecore_event = NULL;
+#endif
 
    E_OBJECT_CHECK(desk);
    E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
    if (desk->visible) return;
 
+#ifdef CONTAINER_POLICY
+   wl_signal_emit(&PRI(desk)->events.desk_show, NULL);
+#else
    desk2 = e_desk_at_xy_get(desk->zone, desk->zone->desk_x_current, desk->zone->desk_y_current);
    if ((!starting) && (!desk2->visible)) return;
    eev = E_NEW(E_Event_Desk_Before_Show, 1);
@@ -468,12 +634,12 @@ error:
         e_object_unref(E_OBJECT(eev->desk));
         free(eev);
      }
+#endif
 }
 
 EINTERN void
 e_desk_deskshow(E_Zone *zone)
 {
-   E_Client *ec;
    E_Desk *desk;
 
    E_OBJECT_CHECK(zone);
@@ -482,6 +648,10 @@ e_desk_deskshow(E_Zone *zone)
    desk = e_desk_current_get(zone);
    EINA_SAFETY_ON_NULL_RETURN(desk);
 
+#ifdef CONTAINER_POLICY
+   // TODO: Should we move it to zone?
+   wl_signal_emit(&PRI(desk)->events.desk_show, NULL);
+#else
    if (desk->deskshow_toggle)
      {
         /* uniconify raises windows and changes stacking order
@@ -517,8 +687,11 @@ e_desk_deskshow(E_Zone *zone)
    desk->deskshow_toggle = !desk->deskshow_toggle;
 
    _e_desk_event_simple_add(desk, E_EVENT_DESK_DESKSHOW);
+#endif
 }
 
+#ifdef CONTAINER_POLICY
+#else
 EINTERN void
 e_desk_row_add(E_Zone *zone)
 {
@@ -548,7 +721,7 @@ e_desk_current_get(E_Zone *zone)
 {
    E_OBJECT_CHECK_RETURN(zone, NULL);
    E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, NULL);
-
+   
    E_Desk *desk = e_desk_at_xy_get(zone, zone->desk_x_current, zone->desk_y_current);
    return desk;
 }
@@ -571,11 +744,11 @@ e_desk_at_xy_get(E_Zone *zone, int x, int y)
 EINTERN E_Desk *
 e_desk_at_pos_get(E_Zone *zone, int pos)
 {
-   int x, y;
-
    E_OBJECT_CHECK_RETURN(zone, NULL);
    E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, NULL);
 
+   int x, y;
+
    y = pos / zone->desk_x_count;
    x = pos - (y * zone->desk_x_count);
 
@@ -584,6 +757,7 @@ e_desk_at_pos_get(E_Zone *zone, int pos)
 
    return zone->desks[x + (y * zone->desk_x_count)];
 }
+#endif
 
 EINTERN void
 e_desk_xy_get(E_Desk *desk, int *x, int *y)
@@ -595,6 +769,8 @@ e_desk_xy_get(E_Desk *desk, int *x, int *y)
    if (y) *y = desk->y;
 }
 
+#ifdef CONTAINER_POLICY
+#else
 EINTERN void
 e_desk_next(E_Zone *zone)
 {
@@ -603,6 +779,8 @@ e_desk_next(E_Zone *zone)
    E_OBJECT_CHECK(zone);
    E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
 
+   // FIXME: desk not available
+
    if ((zone->desk_x_count < 2) && (zone->desk_y_count < 2))
      return;
 
@@ -628,6 +806,8 @@ e_desk_prev(E_Zone *zone)
    E_OBJECT_CHECK(zone);
    E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
 
+   // FIXME: desk not available
+
    if ((zone->desk_x_count < 2) && (zone->desk_y_count < 2))
      return;
 
@@ -651,6 +831,8 @@ e_desks_count(void)
    E_Zone *zone;
    unsigned int count = 0;
 
+   // FIXME: desk not available
+
    EINA_LIST_FOREACH(e_comp->zones, l, zone)
      {
         int cx = 0, cy = 0;
@@ -660,7 +842,10 @@ e_desks_count(void)
      }
    return count;
 }
+#endif
 
+#ifdef CONTAINER_POLICY
+#else
 static void
 _e_desk_client_data_del(E_Desk *desk, E_Client *ec)
 {
@@ -777,12 +962,16 @@ _desk_cb_client_activate_done(struct wl_listener *listener, void *data)
         e_desk_visible_client_iconified_list_remove_all(desk);
      }
 }
+#endif
 
 EINTERN void
 e_desk_client_add(E_Desk *desk, E_Client *ec)
 {
+#ifdef CONTAINER_POLICY
+#else
    E_Desk_Area *eda;
    E_Desk_Private_Client *desk_client;
+#endif
 
    E_OBJECT_CHECK(desk);
    E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
@@ -792,6 +981,9 @@ e_desk_client_add(E_Desk *desk, E_Client *ec)
 
    if (e_desk_has_ec(desk, ec)) return;
 
+#ifdef CONTAINER_POLICY
+   wl_signal_emit(&PRI(desk)->events.client_add, ec);
+#else
    ELOGF("DESK", "CLIENT ADD. desk:%p", ec, desk);
 
    desk_client = E_NEW(E_Desk_Private_Client, 1);
@@ -816,8 +1008,11 @@ e_desk_client_add(E_Desk *desk, E_Client *ec)
 
    wl_signal_emit(&PRI(desk)->events.client_add, desk);
    _e_desk_hook_call(E_DESK_HOOK_CLIENT_ADD, desk);
+#endif
 }
 
+#ifdef CONTAINER_POLICY
+#else
 static E_Desk_Private_Client *
 _e_desk_private_client_get(E_Client *ec)
 {
@@ -829,12 +1024,16 @@ _e_desk_private_client_get(E_Client *ec)
 
    return wl_container_of(listener, desk_client, client_destroy);
 }
+#endif
 
 E_API void
 e_desk_client_del(E_Desk *desk, E_Client *ec)
 {
+#ifdef CONTAINER_POLICY
+#else
    E_Desk_Private_Client *desk_client;
    E_Desk_Area *eda;
+#endif
 
    E_OBJECT_CHECK(desk);
    E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
@@ -844,6 +1043,10 @@ e_desk_client_del(E_Desk *desk, E_Client *ec)
 
    if (!e_desk_has_ec(desk, ec)) return;
 
+#ifdef CONTAINER_POLICY
+   wl_signal_emit(&PRI(desk)->events.client_del, ec);
+#else
+
    ELOGF("DESK", "CLIENT REMOVE. desk:%p", ec, desk);
 
    desk_client = _e_desk_private_client_get(ec);
@@ -855,11 +1058,15 @@ e_desk_client_del(E_Desk *desk, E_Client *ec)
    e_desk_area_ec_remove(eda, ec);
 
    _e_desk_private_client_del(desk_client);
+#endif
 }
 
 E_API void
 e_desk_geometry_set(E_Desk *desk, int x, int y, int w, int h)
 {
+#ifdef CONTAINER_POLICY
+   E_Desk_Data_Geometry geom_data = {0,};
+#else
    E_Client *ec;
    E_Maximize max;
    Eina_List *l = NULL, *ll = NULL;
@@ -867,16 +1074,29 @@ e_desk_geometry_set(E_Desk *desk, int x, int y, int w, int h)
    E_Event_Desk_Geometry_Change *ev = NULL;
 
    int cx, cy, dx, dy;
+#endif
 
    E_OBJECT_CHECK(desk);
    E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
 
+#ifdef CONTAINER_POLICY
+#else
    E_DESK_SMART_DATA_GET_OR_RETURN(desk->smart_obj, sd);
+#endif
 
    if ((desk->geom.x == x) && (desk->geom.y == y) &&
        (desk->geom.w == w) && (desk->geom.h == h))
      return;
 
+#ifdef CONTAINER_POLICY
+   EINA_RECTANGLE_SET(&desk->geom, x, y, w, h);
+
+   geom_data.x = x;
+   geom_data.y = y;
+   geom_data.w = w;
+   geom_data.h = h;
+   wl_signal_emit(&PRI(desk)->events.geometry_set, &geom_data);
+#else
    dx = x - desk->geom.x;
    dy = y - desk->geom.y;
    EINA_RECTANGLE_SET(&desk->geom, x, y, w, h);
@@ -940,6 +1160,7 @@ e_desk_geometry_set(E_Desk *desk, int x, int y, int w, int h)
      }
 
    e_comp_render_queue();
+#endif
 }
 
 
@@ -955,6 +1176,8 @@ e_desk_geometry_get(E_Desk *desk, int *x, int *y, int *w, int *h)
    if (h) *h = desk->geom.h;
 }
 
+#ifdef CONTAINER_POLICY
+#else
 static Eina_Bool
 _e_desk_zoom_animate_cb(void *data, double pos)
 {
@@ -1009,18 +1232,31 @@ _e_desk_zoom_animate_cb(void *data, double pos)
 
    return ECORE_CALLBACK_PASS_ON;
 }
+#endif
 
 E_API void
 e_desk_zoom_set(E_Desk *desk, double zoomx, double zoomy, int cx, int cy)
 {
+#ifdef CONTAINER_POLICY
+   E_Desk_Data_Zoom zoom_data = {0,};
+#else
    E_Client *ec;
    Eina_List *l;
    E_Zone *zone = NULL;
    E_Output *eout = NULL;
+#endif
 
    E_OBJECT_CHECK(desk);
    E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
 
+#ifdef CONTAINER_POLICY
+   zoom_data.zoomx = zoomx;
+   zoom_data.zoomy = zoomy;
+   zoom_data.cx = cx;
+   zoom_data.cy = cy;
+
+   wl_signal_emit(&PRI(desk)->events.zoom_set, &zoom_data);
+#else
    ELOGF("DESK", "ZOOM SET. desk:%p, zoom ratio(%f,%f) cpos(%d,%d)", NULL, desk, zoomx, zoomy, cx, cy);
 
    if (e_config->use_pp_zoom)
@@ -1100,18 +1336,35 @@ e_desk_zoom_set(E_Desk *desk, double zoomx, double zoomy, int cx, int cy)
 
 end:
    _e_desk_event_simple_add(desk, E_EVENT_DESK_ZOOM_SET);
+#endif
 }
 
 E_API Eina_Bool
 e_desk_zoom_get(E_Desk *desk, double *zoomx, double *zoomy, int *cx, int *cy)
 {
+#ifdef CONTAINER_POLICY
+   E_Desk_Data_Zoom zoom_data = {0,};
+#else
    E_Zone *zone = NULL;
    E_Output *eout = NULL;
    Eina_Bool res = EINA_FALSE;
+#endif
 
    E_OBJECT_CHECK_RETURN(desk, EINA_FALSE);
    E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, EINA_FALSE);
 
+#ifdef CONTAINER_POLICY
+   wl_signal_emit(&PRI(desk)->events.zoom_get, &zoom_data);
+
+   if (zoom_data.result)
+     {
+        if (zoomx) *zoomx = zoom_data.zoomx;
+        if (zoomy) *zoomy = zoom_data.zoomy;
+        if (cx) *cx = zoom_data.cx;
+        if (cy) *cy = zoom_data.cy;
+     }
+   return zoom_data.result;
+#else
    if (e_config->use_pp_zoom)
      {
         if (e_display_pp_support())
@@ -1138,19 +1391,39 @@ e_desk_zoom_get(E_Desk *desk, double *zoomx, double *zoomy, int *cx, int *cy)
    if (cy) *cy = sd->zoom.cord_y;
 
    return EINA_TRUE;
+#endif
 }
 
 EINTERN Eina_Bool
 e_desk_zoom_get_center_coordinate(E_Desk *desk, double zoomx, double zoomy, int rectx, int recty, int *cx, int *cy)
 {
+#ifdef CONTAINER_POLICY
+   E_Desk_Data_Zoom zoom_data = {0,};
+#else
    E_Zone *zone = NULL;
    E_Output *eout = NULL;
    int w, h;
    int zoomw, zoomh;
+#endif
 
    E_OBJECT_CHECK_RETURN(desk, EINA_FALSE);
    E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, EINA_FALSE);
 
+#ifdef CONTAINER_POLICY
+   zoom_data.zoomx = zoomx;
+   zoom_data.zoomy = zoomy;
+   zoom_data.rectx = rectx;
+   zoom_data.recty = recty;
+
+   wl_signal_emit(&PRI(desk)->events.zoom_get_center_coordinate, &zoom_data);
+
+   if (zoom_data.result)
+     {
+        if (cx) *cx = zoom_data.cx;
+        if (cy) *cy = zoom_data.cy;
+     }
+   return zoom_data.result;
+#else
    zone = desk->zone;
    eout = e_output_find(zone->output_id);
 
@@ -1184,19 +1457,26 @@ e_desk_zoom_get_center_coordinate(E_Desk *desk, double zoomx, double zoomy, int
      *cy = (int)((zoomy * (double)recty) / (zoomy - 1.0));
 
    return EINA_TRUE;
+   #endif
 }
 
 E_API void
 e_desk_zoom_unset(E_Desk *desk)
 {
+#ifdef CONTAINER_POLICY
+#else
    E_Client *ec;
    Eina_List *l;
    E_Zone *zone = NULL;
    E_Output *eout = NULL;
+#endif
 
    E_OBJECT_CHECK(desk);
    E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
 
+#ifdef CONTAINER_POLICY
+   wl_signal_emit(&PRI(desk)->events.zoom_unset, NULL);
+#else
    ELOGF("DESK", "ZOOM UNSET. desk:%p", NULL, desk);
 
    if (e_config->use_pp_zoom)
@@ -1275,6 +1555,7 @@ e_desk_zoom_unset(E_Desk *desk)
 
 end:
    _e_desk_event_simple_add(desk, E_EVENT_DESK_ZOOM_UNSET);
+#endif
 }
 
 E_API void
@@ -1283,23 +1564,46 @@ e_desk_smart_member_add(E_Desk *desk, Evas_Object *obj)
    E_OBJECT_CHECK(desk);
    E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
 
+#ifdef CONTAINER_POLICY
+   wl_signal_emit(&PRI(desk)->events.smart_member_add, obj);
+#else
    evas_object_smart_member_add(obj, desk->smart_obj);
+#endif
 }
 
 E_API void
 e_desk_smart_member_del(Evas_Object *obj)
 {
+#ifdef CONTAINER_POLICY
+   E_Desk *desk;
+   desk = e_desk_current_get(e_zone_current_get());
+   if (!desk) return;
+
+   wl_signal_emit(&PRI(desk)->events.smart_member_del, obj);
+#else
    evas_object_smart_member_del(obj);
+#endif
 }
 
 E_API Eina_Bool
 e_desk_client_zoom_skip_set(E_Desk * desk, E_Client * ec)
 {
+#ifdef CONTAINER_POLICY
+   E_Desk_Data_Client_Zoom client_zoom_data = {0,};
+#else
    E_Desk *ec_desk;
+#endif
 
    if (!desk) return EINA_FALSE;
    if (!ec) return EINA_FALSE;
 
+#ifdef CONTAINER_POLICY
+   client_zoom_data.ec = ec;
+   wl_signal_emit(&PRI(desk)->events.client_zoom_skip_set, &client_zoom_data);
+
+   return client_zoom_data.result;
+#else
+   // TODO: Need to check the ec_desk?
    ec_desk = e_zone_desk_find_by_ec(desk->zone, ec);
    if (!ec_desk) return EINA_FALSE;
 
@@ -1312,16 +1616,27 @@ e_desk_client_zoom_skip_set(E_Desk * desk, E_Client * ec)
      desk_client->skip_zoom = EINA_TRUE;
 
    return EINA_TRUE;
+#endif
 }
 
 E_API Eina_Bool
 e_desk_client_zoom_skip_unset(E_Desk *desk, E_Client *ec)
 {
+#ifdef CONTAINER_POLICY
+   E_Desk_Data_Client_Zoom client_zoom_data = {0,};
+#else
    E_Desk *ec_desk;
+#endif
 
    if (!desk) return EINA_FALSE;
    if (!ec) return EINA_FALSE;
 
+#ifdef CONTAINER_POLICY
+   client_zoom_data.ec = ec;
+   wl_signal_emit(&PRI(desk)->events.client_zoom_skip_unset, &client_zoom_data);
+
+   return client_zoom_data.result;
+#else
    ec_desk = e_zone_desk_find_by_ec(desk->zone, ec);
    if (!ec_desk) return EINA_FALSE;
 
@@ -1336,17 +1651,25 @@ e_desk_client_zoom_skip_unset(E_Desk *desk, E_Client *ec)
    _e_desk_smart_client_add(desk->smart_obj, ec);
 
    return EINA_TRUE;
+#endif
 }
 
 EINTERN void
 e_desk_client_zoom_apply(E_Desk *desk, E_Client *ec)
 {
+#ifdef CONTAINER_POLICY
+   E_Desk_Data_Client_Zoom client_zoom_data = {0,};
+#endif
    E_OBJECT_CHECK(desk);
    E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
 
    E_OBJECT_CHECK(ec);
    E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
 
+#ifdef CONTAINER_POLICY
+   client_zoom_data.ec = ec;
+   wl_signal_emit(&PRI(desk)->events.client_zoom_apply, &client_zoom_data);
+#else
    E_DESK_SMART_DATA_GET_OR_RETURN(desk->smart_obj, sd);
    if (!eina_list_data_find(sd->clients, ec))
      return;
@@ -1357,27 +1680,41 @@ e_desk_client_zoom_apply(E_Desk *desk, E_Client *ec)
                             sd->zoom.ratio_x, sd->zoom.ratio_y,
                             sd->zoom.cord_x, sd->zoom.cord_y);
      }
+#endif
 }
 
 EINTERN Eina_Bool
 e_desk_zoom_is_animating(E_Desk *desk)
 {
+#ifdef CONTAINER_POLICY
+   E_Desk_Data_Zoom zoom_data = {0,};
+   wl_signal_emit(&PRI(desk)->events.zoom_is_animating, &zoom_data);
+
+   return zoom_data.result;
+#else
    E_DESK_SMART_DATA_GET(desk->smart_obj, sd);
    if (!sd) return EINA_FALSE;
 
    if (!e_config->desk_zoom_effect.enable) return EINA_FALSE;
 
    return !!sd->zoom.animator;
+#endif
 }
 
 E_API void
 e_desk_visible_client_iconify_all(E_Desk *desk)
 {
+#ifdef CONTAINER_POLICY
+#else
    E_Client *ec;
    Eina_List *l;
+#endif
 
    if (!desk) return;
 
+#ifdef CONTAINER_POLICY
+   wl_signal_emit(&PRI(desk)->events.visible_client_iconify_all, NULL);
+#else
    ELOGF("DESK", "ICONIFY ALL VISIBLE WINDOW", NULL);
    E_CLIENT_REVERSE_FOREACH(ec)
      {
@@ -1405,18 +1742,25 @@ e_desk_visible_client_iconify_all(E_Desk *desk)
         e_policy_wl_iconify_state_change_send(ec, 1);
         e_client_iconify(ec);
      }
+#endif
 }
 
 E_API void
 e_desk_visible_client_restore_all(E_Desk *desk)
 {
+#ifdef CONTAINER_POLICY
+#else
    E_Client *ec;
    Eina_List *restore_list;
    Eina_List *l;
+#endif
 
    if (!desk) return;
    if (!desk->iconified_list) return;
 
+#ifdef CONTAINER_POLICY
+   wl_signal_emit(&PRI(desk)->events.visible_client_restore_all, NULL);
+#else
    ELOGF("DESK", "RESTORE ALL VISIBLE WINDOW", NULL);
 
    restore_list = eina_list_clone(desk->iconified_list);
@@ -1433,6 +1777,7 @@ e_desk_visible_client_restore_all(E_Desk *desk)
         e_client_uniconify(ec);
      }
    eina_list_free(restore_list);
+#endif
 }
 
 E_API void
@@ -1441,8 +1786,12 @@ e_desk_visible_client_iconified_list_remove(E_Desk *desk, E_Client *ec)
    if (!desk || !ec) return;
    if (!desk->iconified_list) return;
 
+#ifdef CONTAINER_POLICY
+   wl_signal_emit(&PRI(desk)->events.client_iconified_list_remove, &ec);
+#else
    ELOGF("DESK", "Remove from iconified list", ec);
    desk->iconified_list = eina_list_remove(desk->iconified_list, ec);
+#endif
 }
 
 E_API void
@@ -1451,9 +1800,13 @@ e_desk_visible_client_iconified_list_remove_all(E_Desk *desk)
    if (!desk) return;
    if (!desk->iconified_list) return;
 
+#ifdef CONTAINER_POLICY
+   wl_signal_emit(&PRI(desk)->events.client_iconified_list_remove_all, NULL);
+#else
    ELOGF("DESK", "Remove iconified list all", NULL);
    eina_list_free(desk->iconified_list);
    desk->iconified_list = NULL;
+#endif
 }
 
 E_API Eina_List *
@@ -1466,9 +1819,15 @@ e_desk_visible_client_iconified_list_get(E_Desk *desk)
 static void
 _e_desk_free(E_Desk *desk)
 {
+#ifdef CONTAINER_POLICY
+#else
    Eina_List *l;
    E_Desk_Area *eda;
+#endif
 
+#ifdef CONTAINER_POLICY
+   wl_signal_emit(&PRI(desk)->events.desk_free, desk);
+#else
    for (int i=E_DESK_AREA_LAYER_COUNT-1; i>=0; i--)
       {
          EINA_LIST_FOREACH(desk->desk_area.list[i], l, eda)
@@ -1488,11 +1847,15 @@ _e_desk_free(E_Desk *desk)
    eina_stringshare_del(desk->name);
    desk->name = NULL;
    E_FREE_LIST(desk->handlers, ecore_event_handler_del);
-
+#endif
    _e_desk_private_finish(desk);
    free(desk);
 }
 
+
+#ifdef CONTAINER_POLICY
+#else
+// use event_simple_free
 static void
 _e_desk_event_desk_show_free(void *data EINA_UNUSED, void *event)
 {
@@ -1503,6 +1866,7 @@ _e_desk_event_desk_show_free(void *data EINA_UNUSED, void *event)
    free(ev);
 }
 
+// use event_simple_free
 static void
 _e_desk_event_desk_before_show_free(void *data EINA_UNUSED, void *event)
 {
@@ -1513,6 +1877,7 @@ _e_desk_event_desk_before_show_free(void *data EINA_UNUSED, void *event)
    free(ev);
 }
 
+// use event_simple_free
 static void
 _e_desk_event_desk_after_show_free(void *data EINA_UNUSED, void *event)
 {
@@ -1523,6 +1888,7 @@ _e_desk_event_desk_after_show_free(void *data EINA_UNUSED, void *event)
    free(ev);
 }
 
+// use event_simple_free
 static void
 _e_desk_event_desk_geometry_change_free(void *data EINA_UNUSED, void *event)
 {
@@ -1530,7 +1896,10 @@ _e_desk_event_desk_geometry_change_free(void *data EINA_UNUSED, void *event)
    e_object_unref(E_OBJECT(ev->desk));
    E_FREE(ev);
 }
+#endif
 
+#ifdef CONTAINER_POLICY
+#else
 static Eina_Bool
 _e_desk_transition_setup(E_Client *ec, int dx, int dy, int state)
 {
@@ -1572,7 +1941,10 @@ _e_desk_hide_end(void *data, E_View_Client *client, const char *emission, const
    ec->hidden = 1;
    e_view_client_hide(e_client_view_get(ec));
 }
+#endif
 
+#ifdef CONTAINER_POLICY
+#else
 static void
 _e_desk_show_begin(E_Desk *desk, int dx, int dy)
 {
@@ -1641,7 +2013,10 @@ _e_desk_hide_begin(E_Desk *desk, int dx, int dy)
         e_client_comp_hidden_set(ec, EINA_TRUE);
      }
 }
+#endif
 
+#ifdef CONTAINER_POLICY
+#else
 static void
 _e_desk_smart_init(E_Desk *desk)
 {
@@ -1659,7 +2034,10 @@ _e_desk_smart_init(E_Desk *desk)
    sd->zoom.cord_x = 0;
    sd->zoom.cord_y = 0;
 }
+#endif
 
+#ifdef CONTAINER_POLICY
+#else
 static Eina_Bool
 _e_desk_smart_client_cb_resize(void *data, int type, void *event)
 {
@@ -1768,7 +2146,10 @@ _e_desk_smart_set_user(Evas_Smart_Class *sc)
    sc->member_add = _e_desk_smart_member_add;
    sc->member_del = _e_desk_smart_member_del;
 }
+#endif
 
+#ifdef CONTAINER_POLICY
+#else
 static void
 _e_desk_smart_client_add(Evas_Object *obj, E_Client *ec)
 {
@@ -1908,6 +2289,7 @@ _e_desk_client_zoom(E_Client *ec, double zoomx, double zoomy, Evas_Coord cx, Eva
         e_view_client_render(e_client_view_get(ec));
      }
 }
+#endif
 
 static unsigned int
 _e_desk_desk_area_layer_map(E_Desk_Area_Layer layer)
@@ -1994,7 +2376,10 @@ e_desk_desk_area_active_set(E_Desk *desk, E_Desk_Area *eda)
    desk->desk_area.active = eda;
 
    wl_signal_emit(&PRI(desk)->events.desk_area_active_change, desk);
+#ifdef CONTAINER_POLICY
+#else
    _e_desk_hook_call(E_DESK_HOOK_DESK_AREA_ACTIVE_CHANGE, desk);
+#endif
 }
 
 EINTERN E_Desk_Area *
@@ -2094,6 +2479,8 @@ e_desk_desk_area_below_get(E_Desk *desk, E_Desk_Area *eda)
    return below;
 }
 
+#ifdef CONTAINER_POLICY
+#else
 static void
 _e_desk_hooks_clean(void)
 {
@@ -2130,7 +2517,10 @@ _e_desk_hook_call(E_Desk_Hook_Point hookpoint, E_Desk *desk)
 
    return !!e_object_unref(E_OBJECT(desk));
 }
+#endif
 
+#ifdef CONTAINER_POLICY
+#else
 E_API E_Desk_Hook *
 e_desk_hook_add(E_Desk_Hook_Point hookpoint, E_Desk_Hook_Cb func, const void *data)
 {
@@ -2178,6 +2568,7 @@ e_desk_desk_area_info_print(E_Desk *desk)
           }
      }
 }
+#endif
 
 EINTERN Eina_Bool
 e_desk_has_ec(E_Desk *desk, E_Client *ec)
@@ -2243,6 +2634,13 @@ e_desk_client_add_listener_add(E_Desk *desk, struct wl_listener *listener)
    wl_signal_add(&priv->events.client_add, listener);
 }
 
+EINTERN void
+e_desk_client_del_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.client_del, listener);
+}
+
 EINTERN void
 e_desk_desk_area_enable_listener_add(E_Desk *desk, struct wl_listener *listener)
 {
@@ -2263,3 +2661,173 @@ e_desk_desk_area_active_change_listener_add(E_Desk *desk, struct wl_listener *li
    API_ENTRY;
    wl_signal_add(&priv->events.desk_area_active_change, listener);
 }
+
+#ifdef CONTAINER_POLICY
+EINTERN void
+e_desk_desk_new_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.desk_new, listener);
+}
+
+EINTERN void
+e_desk_desk_free_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.desk_free, listener);
+}
+
+EINTERN void
+e_desk_top_visible_get_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.top_visible_get, listener);
+}
+
+EINTERN void
+e_desk_name_set_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.name_set, listener);
+}
+
+EINTERN void
+e_desk_name_add_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.name_add, listener);
+}
+
+EINTERN void
+e_desk_name_del_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.name_del, listener);
+}
+
+EINTERN void
+e_desk_name_update_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.name_update, listener);
+}
+
+EINTERN void
+e_desk_desk_show_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.desk_show, listener);
+}
+
+EINTERN void
+e_desk_desk_deskshow_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.desk_deskshow, listener);
+}
+
+EINTERN void
+e_desk_geometry_set_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.geometry_set, listener);
+}
+
+EINTERN void
+e_desk_zoom_set_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.zoom_set, listener);
+}
+
+EINTERN void
+e_desk_zoom_get_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.zoom_get, listener);
+}
+
+EINTERN void
+e_desk_zoom_get_center_coordinate_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.zoom_get_center_coordinate, listener);
+}
+
+EINTERN void
+e_desk_zoom_unset_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.zoom_unset, listener);
+}
+
+EINTERN void
+e_desk_smart_member_add_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.smart_member_add, listener);
+}
+
+EINTERN void
+e_desk_smart_member_del_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.smart_member_del, listener);
+}
+
+EINTERN void
+e_desk_client_zoom_skip_set_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.client_zoom_skip_set, listener);
+}
+
+EINTERN void
+e_desk_client_zoom_skip_unset_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.client_zoom_skip_unset, listener);
+}
+
+EINTERN void
+e_desk_client_zoom_apply_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.client_zoom_apply, listener);
+}
+
+EINTERN void
+e_desk_zoom_is_animating_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.zoom_is_animating, listener);
+}
+
+EINTERN void
+e_desk_visible_client_iconify_all_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.visible_client_iconify_all, listener);
+}
+
+EINTERN void
+e_desk_visible_client_restore_all_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.visible_client_restore_all, listener);
+}
+
+EINTERN void
+e_desk_client_iconified_list_remove_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.client_iconified_list_remove, listener);
+}
+
+EINTERN void
+e_desk_client_iconified_list_remove_all_listener_add(E_Desk *desk, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.client_iconified_list_remove_all, listener);
+}
+#endif
index a9159cd917ce88207431db39d843d8454252ead2..849c79b9a9932cd0df7bfb4381668714ca42b565 100644 (file)
@@ -2926,7 +2926,9 @@ e_desk_area_top_ec_get(E_Desk_Area *eda)
    E_Client *ec;
    unsigned int x;
 
-   g_rec_mutex_lock(&e_comp->ec_list_mutex);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(eda, NULL);
+
+   e_comp_ec_list_lock();;
 
    for (x = e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
      {
@@ -2951,7 +2953,9 @@ e_desk_area_bottom_ec_get(E_Desk_Area *eda)
    E_Client *ec;
    unsigned int x;
 
-   g_rec_mutex_lock(&e_comp->ec_list_mutex);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(eda, NULL);
+
+   e_comp_ec_list_lock();;
 
    for (x = e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
      {
index ad2a99e54ce9be5ec16eb3545aea5424e6c2f88b..53ccb6d1ec424ce116f3381b8136407d78bf93cb 100644 (file)
@@ -7,6 +7,45 @@
 #include <wayland-server.h>
 #include <libds-tizen/screen.h>
 
+#ifdef CONTAINER_POLICY
+typedef struct _E_Desk_Data_Top_Visible_Get
+{
+   E_Desk *desk;
+   E_Client *visible_ec;
+} E_Desk_Data_Top_Visible_Get;
+
+typedef struct _E_Desk_Data_Name
+{
+   const char *name;
+   int desk_x, desk_y;
+} E_Desk_Data_Name;
+
+typedef struct _E_Desk_Data_Desk_Control
+{
+   E_Zone *zone;
+} E_Desk_Data_Desk_Control;
+
+typedef struct _E_Desk_Data_Geometry
+{
+   int x, y, w, h;
+} E_Desk_Data_Geometry;
+
+typedef struct _E_Desk_Data_Zoom
+{
+   double zoomx, zoomy;
+   int cx, cy;
+   int rectx, recty;
+   Eina_Bool result;
+} E_Desk_Data_Zoom;
+
+typedef struct _E_Desk_Data_Client_Zoom
+{
+   E_Client *ec;
+   Eina_Bool result;
+} E_Desk_Data_Client_Zoom;
+
+#endif
+
 extern EINTERN int E_EVENT_DESK_SHOW;
 extern EINTERN int E_EVENT_DESK_BEFORE_SHOW;
 extern EINTERN int E_EVENT_DESK_AFTER_SHOW;
@@ -23,15 +62,21 @@ EINTERN void         e_desk_name_update(void);
 EINTERN void         e_desk_show(E_Desk *desk);
 EINTERN void         e_desk_deskshow(E_Zone *zone);
 EINTERN E_Client    *e_desk_client_top_visible_get(E_Desk *desk);
+#ifdef CONTAINER_POLICY
+#else
 EINTERN E_Desk      *e_desk_at_xy_get(E_Zone *zone, int x, int y);
 EINTERN E_Desk      *e_desk_at_pos_get(E_Zone *zone, int pos);
+#endif
 EINTERN void         e_desk_xy_get(E_Desk *desk, int *x, int *y);
+#ifdef CONTAINER_POLICY
+#else
 EINTERN void         e_desk_next(E_Zone *zone);
 EINTERN void         e_desk_prev(E_Zone *zone);
 EINTERN void         e_desk_row_add(E_Zone *zone);
 EINTERN void         e_desk_row_remove(E_Zone *zone);
 EINTERN void         e_desk_col_add(E_Zone *zone);
 EINTERN void         e_desk_col_remove(E_Zone *zone);
+#endif
 EINTERN Eina_Bool    e_desk_has_ec(E_Desk *desk, E_Client *ec);
 EINTERN E_Client    *e_desk_top_ec_get(E_Desk *desk);
 EINTERN E_Client    *e_desk_bottom_ec_get(E_Desk *desk);
@@ -53,8 +98,35 @@ EINTERN void         e_desk_desk_area_info_print(E_Desk *desk);
 
 // listeners
 EINTERN void e_desk_client_add_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_client_del_listener_add(E_Desk *desk, struct wl_listener *listener);
 EINTERN void e_desk_desk_area_enable_listener_add(E_Desk *desk, struct wl_listener *listener);
 EINTERN void e_desk_desk_area_disable_listener_add(E_Desk *desk, struct wl_listener *listener);
 EINTERN void e_desk_desk_area_active_change_listener_add(E_Desk *desk, struct wl_listener *listener);
+#ifdef CONTAINER_POLICY
+EINTERN void e_desk_desk_new_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_desk_free_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_top_visible_get_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_name_set_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_name_add_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_name_del_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_name_update_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_desk_show_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_desk_deskshow_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_geometry_set_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_zoom_set_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_zoom_get_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_zoom_get_center_coordinate_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_zoom_unset_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_smart_member_add_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_smart_member_del_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_client_zoom_skip_set_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_client_zoom_skip_unset_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_client_zoom_apply_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_zoom_is_animating_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_visible_client_iconify_all_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_visible_client_restore_all_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_client_iconified_list_remove_listener_add(E_Desk *desk, struct wl_listener *listener);
+EINTERN void e_desk_client_iconified_list_remove_all_listener_add(E_Desk *desk, struct wl_listener *listener);
+#endif
 
 #endif
index 0898a4e6b22e8eeb07c46185a880348afef32c50..eadd1d0356b34e543d7d70ff07414a998b8b2fb2 100644 (file)
@@ -3,6 +3,12 @@
 #include "e_desk_intern.h"
 #include "e_comp_intern.h"
 
+#include "e_focus_intern.h"
+#include "e_view_intern.h"
+#include "e_view_client_intern.h"
+
+#ifdef CONTAINER_POLICY
+#else
 #include "e_actions_intern.h"
 #include "e_appinfo_intern.h"
 #include "e_bindings_intern.h"
 #include "e_place_intern.h"
 #include "e_policy_intern.h"
 #include "e_maximize_intern.h"
-#include "e_focus_intern.h"
 #include "e_policy_visibility_intern.h"
 #include "e_comp_object_intern.h"
 #include "e_comp_canvas_intern.h"
 #include "e_comp_input_intern.h"
 #include "e_input_thread_client_intern.h"
-#include "e_view_intern.h"
-#include "e_view_client_intern.h"
+#endif
 
 #define ZONE_EC_DATA_KEY  "E_Zone_Client"
 
@@ -65,6 +69,16 @@ struct _E_Zone_Private
         struct wl_signal useful_geometry_get;
         struct wl_signal bg_mouse_down;
         struct wl_signal bg_mouse_up;
+        struct wl_signal desk_row_add;
+        struct wl_signal desk_row_remove;
+        struct wl_signal desk_col_add;
+        struct wl_signal desk_col_remove;
+        struct wl_signal desk_current_get;
+        struct wl_signal desk_at_xy_get;
+        struct wl_signal desk_at_pos_get;
+        struct wl_signal desk_next;
+        struct wl_signal desk_prev;
+        struct wl_signal desk_count;
 #endif
         struct wl_signal client_add;
 #ifdef CONTAINER_POLICY
@@ -160,6 +174,16 @@ _e_zone_private_init(E_Zone *zone)
    wl_signal_init(&priv->events.useful_geometry_get);
    wl_signal_init(&priv->events.bg_mouse_down);
    wl_signal_init(&priv->events.bg_mouse_up);
+   wl_signal_init(&priv->events.desk_row_add);
+   wl_signal_init(&priv->events.desk_row_remove);
+   wl_signal_init(&priv->events.desk_col_add);
+   wl_signal_init(&priv->events.desk_col_remove);
+   wl_signal_init(&priv->events.desk_current_get);
+   wl_signal_init(&priv->events.desk_at_xy_get);
+   wl_signal_init(&priv->events.desk_at_pos_get);
+   wl_signal_init(&priv->events.desk_next);
+   wl_signal_init(&priv->events.desk_prev);
+   wl_signal_init(&priv->events.desk_count);
 #endif
    wl_signal_init(&priv->events.client_add);
 #ifdef CONTAINER_POLICY
@@ -2500,3 +2524,198 @@ e_zone_focus_reset_listener_add(E_Zone *zone, struct wl_listener *listener)
    wl_signal_add(&priv->events.focus_reset, listener);
 }
 #endif
+
+
+
+#ifdef CONTAINER_POLICY
+EINTERN void
+e_desk_row_add(E_Zone *zone)
+{
+   E_Desk_Data_Desk_Control data = {0,};
+
+   data.zone = zone;
+   wl_signal_emit(&PRI(zone)->events.desk_row_add, &data);
+}
+
+EINTERN void
+e_desk_row_remove(E_Zone *zone)
+{
+   E_Desk_Data_Desk_Control data = {0,};
+
+   data.zone = zone;
+   wl_signal_emit(&PRI(zone)->events.desk_row_remove, &data);
+}
+
+EINTERN void
+e_desk_col_add(E_Zone *zone)
+{
+   E_Desk_Data_Desk_Control data = {0,};
+
+   data.zone = zone;
+   wl_signal_emit(&PRI(zone)->events.desk_col_add, &data);
+}
+
+EINTERN void
+e_desk_col_remove(E_Zone *zone)
+{
+   E_Desk_Data_Desk_Control data = {0,};
+
+   data.zone = zone;
+   wl_signal_emit(&PRI(zone)->events.desk_col_remove, &data);
+}
+
+E_API E_Desk *
+e_desk_current_get(E_Zone *zone)
+{
+   E_Zone_Data_Desk_Get data = {0,};
+
+   E_OBJECT_CHECK_RETURN(zone, NULL);
+   E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, NULL);
+
+   data.zone = zone;
+   wl_signal_emit(&PRI(zone)->events.desk_current_get, &data);
+
+   return data.desk;
+}
+
+EINTERN E_Desk *
+e_desk_at_xy_get(E_Zone *zone, int x, int y)
+{
+   E_Zone_Data_Desk_Get data = {0,};
+
+   E_OBJECT_CHECK_RETURN(zone, NULL);
+   E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, NULL);
+
+   data.zone = zone;
+   data.x = x;
+   data.y = y;
+
+   wl_signal_emit(&PRI(zone)->events.desk_at_xy_get, &data);
+
+   return data.desk;
+}
+
+EINTERN E_Desk *
+e_desk_at_pos_get(E_Zone *zone, int pos)
+{
+   E_Zone_Data_Desk_Get data = {0,};
+
+   E_OBJECT_CHECK_RETURN(zone, NULL);
+   E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, NULL);
+
+   data.zone = zone;
+   data.pos = pos;
+
+   wl_signal_emit(&PRI(zone)->events.desk_at_pos_get, &data);
+
+   return data.desk;
+}
+
+EINTERN void
+e_desk_next(E_Zone *zone)
+{
+   E_OBJECT_CHECK(zone);
+   E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
+
+   wl_signal_emit(&PRI(zone)->events.desk_next, NULL);
+}
+
+EINTERN void
+e_desk_prev(E_Zone *zone)
+{
+   E_OBJECT_CHECK(zone);
+   E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
+
+   wl_signal_emit(&PRI(zone)->events.desk_prev, NULL);
+}
+
+EINTERN unsigned int
+e_desks_count(void)
+{
+   Eina_List *l, *comp_zone_list;
+   E_Zone *zone;
+   unsigned int count = 0;
+
+   if (!(comp_zone_list = e_comp_zone_list_get())) return 0;
+
+   EINA_LIST_FOREACH(comp_zone_list, l, zone)
+     {
+        E_Zone_Data_Desk_Count data = {0,};
+        wl_signal_emit(&PRI(zone)->events.desk_count, &data);
+        count += data.count;
+     }
+
+   return count;
+}
+
+EINTERN void
+e_zone_desk_row_add_listener_add(E_Zone *zone, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.desk_row_add, listener);
+}
+
+EINTERN void
+e_zone_desk_row_remove_listener_add(E_Zone *zone, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.desk_row_remove, listener);
+}
+
+EINTERN void
+e_zone_desk_col_add_listener_add(E_Zone *zone, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.desk_col_add, listener);
+}
+
+EINTERN void
+e_zone_desk_col_remove_listener_add(E_Zone *zone, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.desk_col_remove, listener);
+}
+
+EINTERN void
+e_zone_desk_current_get_listener_add(E_Zone *zone, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.desk_current_get, listener);
+}
+
+EINTERN void
+e_zone_desk_at_xy_get_listener_add(E_Zone *zone, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.desk_at_xy_get, listener);
+}
+
+EINTERN void
+e_zone_desk_at_pos_get_listener_add(E_Zone *zone, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.desk_at_pos_get, listener);
+}
+
+EINTERN void
+e_zone_desk_next_listener_add(E_Zone *zone, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.desk_next, listener);
+}
+
+EINTERN void
+e_zone_desk_prev_listener_add(E_Zone *zone, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.desk_prev, listener);
+}
+
+EINTERN void
+e_zone_desk_count_listener_add(E_Zone *zone, struct wl_listener *listener)
+{
+   API_ENTRY;
+   wl_signal_add(&priv->events.desk_count, listener);
+}
+
+#endif
\ No newline at end of file
index 7ff76bfe88e605afda8670f45189b90eceb834ff..c1597bf4ad9a12df2d9b342e7003886e10c42029 100644 (file)
@@ -44,6 +44,22 @@ typedef struct _E_Zone_Data_Useful_Geometry
 } E_Zone_Data_Useful_Geometry;
 #endif
 
+#ifdef CONTAINER_POLICY
+typedef struct _E_Zone_Data_Desk_Get
+{
+   E_Zone *zone;
+   int x, y;
+   int pos;
+   E_Desk *desk;
+}E_Zone_Data_Desk_Get;
+
+typedef struct _E_Zone_Data_Desk_Count
+{
+   unsigned int count;
+} E_Zone_Data_Desk_Count;
+
+#endif
+
 EINTERN int e_zone_init(void);
 EINTERN int e_zone_shutdown(void);
 
@@ -106,4 +122,26 @@ EINTERN void e_zone_focus_clear_listener_add(E_Zone *zone, struct wl_listener *l
 EINTERN void e_zone_focus_reset_listener_add(E_Zone *zone, struct wl_listener *listener);
 #endif
 
+#ifdef CONTAINER_POLICY
+EINTERN void         e_desk_row_add(E_Zone *zone);
+EINTERN void         e_desk_row_remove(E_Zone *zone);
+EINTERN void         e_desk_col_add(E_Zone *zone);
+EINTERN void         e_desk_col_remove(E_Zone *zone);
+EINTERN E_Desk      *e_desk_at_xy_get(E_Zone *zone, int x, int y);
+EINTERN E_Desk      *e_desk_at_pos_get(E_Zone *zone, int pos);
+EINTERN void         e_desk_next(E_Zone *zone);
+EINTERN void         e_desk_prev(E_Zone *zone);
+
+EINTERN void e_zone_desk_row_add_listener_add(E_Zone *zone, struct wl_listener *listener);
+EINTERN void e_zone_desk_row_remove_listener_add(E_Zone *zone, struct wl_listener *listener);
+EINTERN void e_zone_desk_col_add_listener_add(E_Zone *zone, struct wl_listener *listener);
+EINTERN void e_zone_desk_col_remove_listener_add(E_Zone *zone, struct wl_listener *listener);
+EINTERN void e_zone_desk_current_get_listener_add(E_Zone *zone, struct wl_listener *listener);
+EINTERN void e_zone_desk_at_xy_get_listener_add(E_Zone *zone, struct wl_listener *listener);
+EINTERN void e_zone_desk_at_pos_get_listener_add(E_Zone *zone, struct wl_listener *listener);
+EINTERN void e_zone_desk_next_listener_add(E_Zone *zone, struct wl_listener *listener);
+EINTERN void e_zone_desk_prev_listener_add(E_Zone *zone, struct wl_listener *listener);
+EINTERN void e_zone_desk_count_listener_add(E_Zone *zone, struct wl_listener *listener);
+#endif
+
 #endif
index 885d2317602dfae2d903c064918e46463143a1aa..6eb09c48fa603ce692c4c3a653daee715bfd1384 100644 (file)
 #endif
 
 E_Policy *e_policy = NULL;
+#ifdef CONTAINER_POLICY
+#else
 Eina_Hash *hash_policy_desks = NULL;
+#endif
 Eina_Hash *hash_policy_clients = NULL;
 E_Policy_System_Info e_policy_system_info =
 {
@@ -95,7 +98,10 @@ static void        _e_policy_cb_hook_client_eval_post_new_client(void *d EINA_UN
 static void        _e_policy_cb_hook_pixmap_del(void *data EINA_UNUSED, E_Pixmap *cp);
 static void        _e_policy_cb_hook_pixmap_unusable(void *data EINA_UNUSED, E_Pixmap *cp);
 
+#ifdef CONTAINER_POLICY
+#else
 static void        _e_policy_cb_desk_data_free(void *data);
+#endif
 static void        _e_policy_cb_client_data_free(void *data);
 static Eina_Bool   _e_policy_cb_zone_add(void *data EINA_UNUSED, int type EINA_UNUSED, void *event);
 static Eina_Bool   _e_policy_cb_zone_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event);
@@ -177,7 +183,11 @@ _e_policy_cb_hook_desk_client_add(void *d, E_Desk *desk)
    if (ec->internal) goto delete_hook;
    if (ec->new_client) goto delete_hook;
 
+#ifdef CONTAINER_POLICY
+   pd = e_policy_desk_get(desk);
+#else
    pd = eina_hash_find(hash_policy_desks, &desk);
+#endif
    if (pd)
      _e_policy_client_maximize_policy_apply(pc);
    else
@@ -702,7 +712,11 @@ _e_policy_cb_hook_client_eval_post_fetch(void *d EINA_UNUSED, E_Client *ec)
 
    if (!_e_policy_client_normal_check(ec)) return;
 
+#ifdef CONTAINER_POLICY
+   pd = e_policy_desk_get(desk);
+#else
    pd = eina_hash_find(hash_policy_desks, &desk);
+#endif
    if (!pd) return;
 
    pc = eina_hash_find(hash_policy_clients, &ec);
@@ -902,11 +916,14 @@ _e_policy_cb_hook_pixmap_unusable(void *data EINA_UNUSED, E_Pixmap *cp)
    e_policy_client_unmap(ec);
 }
 
+#ifdef CONTAINER_POLICY
+#else
 static void
 _e_policy_cb_desk_data_free(void *data)
 {
    free(data);
 }
+#endif
 
 static void
 _e_policy_cb_client_data_free(void *data)
@@ -934,10 +951,16 @@ _e_policy_cb_zone_add(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
                                            zone->desks[i]->x,
                                            zone->desks[i]->y);
              if (d)
-               e_policy_desk_add(zone->desks[i]);
+               {
+                  e_policy_desk_add(zone->desks[i]);
+                  e_desk_show(zone->desks[i]);
+               }
           }
         else
-          e_policy_desk_add(zone->desks[i]);
+          {
+             e_policy_desk_add(zone->desks[i]);
+             e_desk_show(zone->desks[i]);
+          }
      }
 
    /* add and show softkey */
@@ -966,7 +989,11 @@ _e_policy_cb_zone_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
    n = zone->desk_y_count * zone->desk_x_count;
    for (i = 0; i < n; i++)
      {
+#ifdef CONTAINER_POLICY
+        pd = e_policy_desk_get(zone->desks[i]);
+#else
         pd = eina_hash_find(hash_policy_desks, &zone->desks[i]);
+#endif
         if (pd) e_policy_desk_del(pd);
      }
 
@@ -1005,17 +1032,32 @@ _e_policy_cb_zone_desk_count_set(void *data EINA_UNUSED, int type EINA_UNUSED, v
    E_Event_Zone_Desk_Count_Set *ev;
    E_Zone *zone;
    E_Desk *desk;
+#ifdef CONTAINER_POLICY
+#else
    Eina_Iterator *it;
+   Eina_Bool found;
+#endif
    E_Policy_Desk *pd;
    E_Config_Policy_Desk *d;
    int i, n;
-   Eina_Bool found;
    Eina_List *desks_del = NULL;
 
    ev = event;
    zone = ev->zone;
 
    /* remove deleted desk from hash */
+#ifdef CONTAINER_POLICY
+   n = zone->desk_y_count * zone->desk_x_count;
+   for (i = 0; i < n; i++)
+      {
+         pd = e_policy_desk_get(zone->desks[i]);
+         if (!pd)
+         {
+            desks_del = eina_list_append(desks_del, zone->desks[i]);
+            break;
+         }
+      }
+#else
    it = eina_hash_iterator_data_new(hash_policy_desks);
    while (eina_iterator_next(it, (void **)&pd))
      {
@@ -1035,10 +1077,15 @@ _e_policy_cb_zone_desk_count_set(void *data EINA_UNUSED, int type EINA_UNUSED, v
           desks_del = eina_list_append(desks_del, pd->desk);
      }
    eina_iterator_free(it);
+#endif
 
    EINA_LIST_FREE(desks_del, desk)
      {
+#ifdef CONTAINER_POLICY
+        pd = e_policy_desk_get(desk);
+#else
         pd = eina_hash_find(hash_policy_desks, &desk);
+#endif
         if (pd) e_policy_desk_del(pd);
      }
 
@@ -1052,10 +1099,16 @@ _e_policy_cb_zone_desk_count_set(void *data EINA_UNUSED, int type EINA_UNUSED, v
                                            zone->desks[i]->x,
                                            zone->desks[i]->y);
              if (d)
-               e_policy_desk_add(zone->desks[i]);
+               {
+                  e_policy_desk_add(zone->desks[i]);
+                  e_desk_show(zone->desks[i]);
+               }
           }
         else
-          e_policy_desk_add(zone->desks[i]);
+          {
+             e_policy_desk_add(zone->desks[i]);
+             e_desk_show(zone->desks[i]);
+          }
      }
 
    return ECORE_CALLBACK_PASS_ON;
@@ -1110,8 +1163,11 @@ _e_policy_cb_desk_show(void *data EINA_UNUSED, int type EINA_UNUSED, void *event
         softkey = e_policy_softkey_get(ev->desk->zone);
         if (!softkey)
           softkey = e_policy_softkey_add(ev->desk->zone);
-
+#ifdef CONTAINER_POLICY
+        if (e_policy_desk_get(ev->desk))
+#else
         if (eina_hash_find(hash_policy_desks, &ev->desk))
+#endif
           e_policy_softkey_show(softkey);
         else
           e_policy_softkey_hide(softkey);
@@ -1360,6 +1416,8 @@ _e_policy_cb_idle_enterer(void *data EINA_UNUSED)
    return ECORE_CALLBACK_RENEW;
 }
 
+#ifdef CONTAINER_POLICY
+#else
 EINTERN void
 e_policy_desk_add(E_Desk *desk)
 {
@@ -1367,8 +1425,14 @@ e_policy_desk_add(E_Desk *desk)
    E_Client *ec;
    E_Policy_Client *pc;
 
+   ELOGF("JUNSEOK", "\tdesk add, desk:%p", NULL, desk);
+
    pd = eina_hash_find(hash_policy_desks, &desk);
-   if (pd) return;
+   if (pd)
+   {
+   ELOGF("JUNSEOK", "\t\talready added desk:%p, returned", NULL, desk);
+      return;
+   }
 
    pd = E_NEW(E_Policy_Desk, 1);
    if (!pd) return;
@@ -1423,6 +1487,7 @@ e_policy_desk_del(E_Policy_Desk *pd)
 
    eina_hash_del_by_key(hash_policy_desks, &pd->desk);
 }
+#endif
 
 EINTERN E_Policy_Client *
 e_policy_client_launcher_get(E_Zone *zone)
@@ -1517,7 +1582,11 @@ e_policy_client_maximize(E_Client *ec)
    desk = e_zone_desk_find_by_ec(pc->zone, ec);
    EINA_SAFETY_ON_NULL_RETURN_VAL(desk, EINA_FALSE);
 
+#ifdef CONTAINER_POLICY
+   pd = e_policy_desk_get(desk);
+#else
    pd = eina_hash_find(hash_policy_desks, &desk);
+#endif
    if (!pd) return EINA_FALSE;
 
    if (pc->flt_policy_state)
@@ -1526,6 +1595,24 @@ e_policy_client_maximize(E_Client *ec)
    return _e_policy_client_maximize_policy_apply(pc);
 }
 
+#ifdef CONTAINER_POLICY
+EINTERN Eina_Bool
+e_policy_client_maximize_policy_apply(E_Policy_Client *pc)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(pc, EINA_FALSE);
+
+   return _e_policy_client_maximize_policy_apply(pc);
+}
+
+EINTERN void
+e_policy_client_maximize_policy_cancel(E_Policy_Client *pc)
+{
+   EINA_SAFETY_ON_NULL_RETURN(pc);
+
+   _e_policy_client_maximize_policy_cancel(pc);
+}
+#endif
+
 EINTERN void
 e_policy_keyboard_layout_apply(E_Client *ec EINA_UNUSED)
 {
@@ -2403,6 +2490,20 @@ e_policy_client_add(E_Client *ec)
    return pc;
 }
 
+#ifdef CONTAINER_POLICY
+EINTERN E_Policy_Client *
+e_policy_client_get(E_Client *ec)
+{
+   E_Policy_Client *pc;
+
+   if (e_object_is_del(E_OBJECT(ec))) return NULL;
+
+   pc = eina_hash_find(hash_policy_clients, &ec);
+   if (pc) return pc;
+   return NULL;
+}
+#endif
+
 EINTERN int
 e_policy_init(void)
 {
@@ -2420,7 +2521,10 @@ e_policy_init(void)
    e_policy = pol;
 
    hash_policy_clients = eina_hash_pointer_new(_e_policy_cb_client_data_free);
+#ifdef CONTAINER_POLICY
+#else
    hash_policy_desks = eina_hash_pointer_new(_e_policy_cb_desk_data_free);
+#endif
 
    E_EVENT_POLICY_QUICKPANEL_VISIBLE_STATE_CHANGE = ecore_event_type_new();
 
@@ -2502,7 +2606,10 @@ e_policy_shutdown(void)
    E_FREE_LIST(hooks_ec, e_client_hook_del);
    E_FREE_LIST(handlers, ecore_event_handler_del);
 
+#ifdef CONTAINER_POLICY
+#else
    E_FREE_FUNC(hash_policy_desks, eina_hash_free);
+#endif
    E_FREE_FUNC(hash_policy_clients, eina_hash_free);
 
    e_policy_stack_shutdown();
index 247311a4667aa34b2ccc75a95672036df216d31b..5a0cb41f466bc2e457c858fc419e1f9ec6e00848 100644 (file)
 #include "e_policy_desk_intern.h"
 
 #ifdef CONTAINER_POLICY
+#include "e_policy_intern.h"
+#include "e_policy_softkey_intern.h"
+#include "e_desk_area_intern.h"
+#include "e_client_intern.h"
+#include "e_utils_intern.h"
+#include "e_comp_wl_subsurface_intern.h"
+#include "e_output_intern.h"
+#include "e_zone_intern.h"
+#include "e_config_intern.h"
+#include "e_policy_wl_intern.h"
+#include "e_display_intern.h"
+#include "e_view_intern.h"
+#include "e_view_client_intern.h"
 
+#define DESK_EC_DATA_KEY  "E_Desk_Client"
 
+typedef struct _E_Policy_Desk_Private_Client  E_Policy_Desk_Private_Client;
+typedef struct _E_Policy_Desk_Smart_Data E_Policy_Desk_Smart_Data;
+
+#define E_POLICY_DESK_SMART_DATA_GET(obj, ptr)                        \
+    E_Policy_Desk_Smart_Data *ptr = evas_object_smart_data_get(obj);
+
+#define E_POLICY_DESK_SMART_DATA_GET_OR_RETURN(obj, ptr)              \
+    E_POLICY_DESK_SMART_DATA_GET(obj, ptr);                            \
+if (!ptr) return
+
+EVAS_SMART_SUBCLASS_NEW(E_POLICY_DESK_SMART_OBJ_TYPE, _e_policy_desk,
+                        Evas_Smart_Class, Evas_Smart_Class,
+                        evas_object_smart_clipped_class_get, NULL)
+
+    typedef enum _E_Policy_Desk_Zoom_Animating_Type
+{
+   E_POLICY_DESK_ZOOM_ANIMATING_TYPE_NONE,
+   E_POLICY_DESK_ZOOM_ANIMATING_TYPE_ENABLE,
+   E_POLICY_DESK_ZOOM_ANIMATING_TYPE_DISABLE,
+} E_Policy_Desk_Zoom_Animating_Type;
+
+struct _E_Policy_Desk
+{
+   E_Desk          *desk;
+   E_Zone          *zone;
+
+   struct wl_listener desk_new;
+   struct wl_listener desk_free;
+   struct wl_listener top_visible_get;
+   struct wl_listener name_set;
+   struct wl_listener name_add;
+   struct wl_listener name_del;
+   struct wl_listener name_update;
+   struct wl_listener desk_show;
+   struct wl_listener desk_deskshow;
+   struct wl_listener desk_client_add;
+   struct wl_listener desk_client_del;
+   struct wl_listener geometry_set;
+   struct wl_listener zoom_set;
+   struct wl_listener zoom_get;
+   struct wl_listener zoom_get_center_coordinate;
+   struct wl_listener zoom_unset;
+   struct wl_listener smart_member_add;
+   struct wl_listener smart_member_del;
+   struct wl_listener client_zoom_skip_set;
+   struct wl_listener client_zoom_skip_unset;
+   struct wl_listener client_zoom_apply;
+   struct wl_listener zoom_is_animating;
+   struct wl_listener visible_client_iconify_all;
+   struct wl_listener visible_client_restore_all;
+   struct wl_listener client_iconified_list_remove;
+   struct wl_listener client_iconified_list_remove_all;
+};
+
+struct _E_Policy_Desk_Private_Client
+{
+   E_Desk *desk;
+   E_Client *ec;
+   Eina_Bool skip_zoom;
+
+   // client listeners
+   struct wl_listener client_destroy;
+   struct wl_listener client_activate_done;
+};
+
+struct _E_Policy_Desk_Smart_Data
+{
+   Evas_Object_Smart_Clipped_Data base;
+   Eina_List      *clients;
+   Eina_List      *handlers;
+
+   struct
+     {
+        double       ratio_x, ratio_y;
+        int          cord_x, cord_y;
+        double       prev_ratio_x, prev_ratio_y;
+        int          prev_cord_x,  prev_cord_y;
+        Eina_Bool    enabled;
+        Ecore_Animator *animator;
+        E_Policy_Desk_Zoom_Animating_Type animating_type;
+     } zoom;
+};
+
+Eina_Hash *hash_policy_desks = NULL;
+static int _e_policy_desk_hooks_delete = 0;
+static int _e_policy_desk_hooks_walking = 0;
+
+static Eina_Inlist *_e_policy_desk_hooks[] =
+{
+   [E_DESK_HOOK_CLIENT_ADD] = NULL,
+   [E_DESK_HOOK_DESK_AREA_ENABLE] = NULL,
+   [E_DESK_HOOK_DESK_AREA_DISABLE] = NULL,
+   [E_DESK_HOOK_DESK_AREA_ACTIVE_CHANGE] = NULL,
+   [E_DESK_HOOK_SPLIT_DESK_ACTIVATE] = NULL,
+   [E_DESK_HOOK_SPLIT_DESK_DEACTIVATE] = NULL,
+};
+
+
+static void      _e_policy_desk_object_zoom(Evas_Object *obj, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy);
+static void      _e_policy_desk_client_zoom(E_Client *ec, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy);
+
+static void      _e_policy_desk_cb_client_destroy(struct wl_listener *listener, void *data);
+static void      _e_policy_desk_cb_client_activate_done(struct wl_listener *listener, void *data);
+
+
+
+static void
+_e_policy_desk_cb_desk_data_free(void *data)
+{
+   free(data);
+}
+
+static void
+_e_policy_desk_event_desk_geometry_change_free(void *d EINA_UNUSED, void *event)
+{
+   E_Event_Desk_Geometry_Change *ev;
+
+   ev = (E_Event_Desk_Geometry_Change *) event;
+   e_object_unref(E_OBJECT(ev->desk));
+   free(ev);
+}
+
+static void
+_e_policy_desk_event_simple_free(void *d EINA_UNUSED, void *event)
+{
+   E_Event_Desk *ev;
+
+   ev = (E_Event_Desk *) event;
+   e_object_unref(E_OBJECT(ev->desk));
+   free(ev);
+}
+
+static Ecore_Event *
+_e_policy_desk_event_simple_add(E_Desk *desk, int type)
+{
+   E_Event_Desk *ev;
+
+   ev = E_NEW(E_Event_Desk, 1);
+   if (!ev) return NULL;
+   ev->desk = desk;
+   e_object_ref(E_OBJECT(desk));
+   return ecore_event_add(type, ev, _e_policy_desk_event_simple_free, NULL);
+}
+
+static void
+_e_policy_desk_hooks_clean(void)
+{
+   Eina_Inlist *l;
+   E_Desk_Hook *dh;
+   unsigned int x;
+
+   for (x = 0; x < E_DESK_HOOK_LAST; x++)
+     EINA_INLIST_FOREACH_SAFE(_e_policy_desk_hooks[x], l, dh)
+       {
+          if (!dh->delete_me) continue;
+          _e_policy_desk_hooks[x] = eina_inlist_remove(_e_policy_desk_hooks[x], EINA_INLIST_GET(dh));
+          free(dh);
+       }
+
+   _e_policy_desk_hooks_delete = 0;
+}
+
+static Eina_Bool
+_e_policy_desk_hook_call(E_Desk_Hook_Point hookpoint, E_Desk *desk)
+{
+   E_Desk_Hook *dh;
+
+   e_object_ref(E_OBJECT(desk));
+   _e_policy_desk_hooks_walking++;
+   EINA_INLIST_FOREACH(_e_policy_desk_hooks[hookpoint], dh)
+     {
+        if (dh->delete_me) continue;
+        dh->func(dh->data, desk);
+     }
+   _e_policy_desk_hooks_walking--;
+   if ((_e_policy_desk_hooks_walking == 0) && (_e_policy_desk_hooks_delete > 0))
+     _e_policy_desk_hooks_clean();
+
+   return !!e_object_unref(E_OBJECT(desk));
+}
+
+E_API E_Desk_Hook *
+e_desk_hook_add(E_Desk_Hook_Point hookpoint, E_Desk_Hook_Cb func, const void *data)
+{
+   E_Desk_Hook *dh;
+
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_DESK_HOOK_LAST, NULL);
+   dh = E_NEW(E_Desk_Hook, 1);
+   if (!dh) return NULL;
+
+   dh->hookpoint = hookpoint;
+   dh->func = func;
+   dh->data = (void*)data;
+
+   _e_policy_desk_hooks[hookpoint] = eina_inlist_append(_e_policy_desk_hooks[hookpoint], EINA_INLIST_GET(dh));
+   return dh;
+}
+
+E_API void
+e_desk_hook_del(E_Desk_Hook * dh)
+{
+   dh->delete_me = 1;
+   if (_e_policy_desk_hooks_walking == 0)
+     {
+        _e_policy_desk_hooks[dh->hookpoint] = eina_inlist_remove(_e_policy_desk_hooks[dh->hookpoint], EINA_INLIST_GET(dh));
+        free(dh);
+     }
+   else
+     _e_policy_desk_hooks_delete++;
+}
+
+EINTERN void
+e_desk_desk_area_info_print(E_Desk *desk)
+{
+   E_Desk_Area *eda = NULL;
+   Eina_List *l;
+
+   E_OBJECT_CHECK(desk);
+   E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
+
+   for (int i=E_DESK_AREA_LAYER_COUNT-1; i>=0; i--)
+     {
+        EINA_LIST_FOREACH(desk->desk_area.list[i], l, eda)
+          {
+             e_desk_area_info_print(eda);
+          }
+     }
+}
+
+
+static void
+_e_policy_desk_client_data_del(E_Desk *desk, E_Client *ec)
+{
+   e_view_data_del(e_view_client_view_get(e_client_view_get(ec)), DESK_EC_DATA_KEY);
+}
+
+static void
+_e_policy_desk_client_data_set(E_Desk *desk, E_Client *ec)
+{
+   E_Desk *data;
+
+   data = e_view_data_get(e_view_client_view_get(e_client_view_get(ec)), DESK_EC_DATA_KEY);
+   if (data)
+     {
+        if (data == desk)
+          {
+             ELOGF("E_DESK", "EC is already added to desk_id:%d", ec, desk->id);
+             return;
+          }
+
+        _e_policy_desk_client_data_del(desk, ec);
+     }
+
+   e_view_data_set(e_view_client_view_get(e_client_view_get(ec)), DESK_EC_DATA_KEY, desk);
+}
+
+static void
+_e_policy_desk_smart_init(E_Desk *desk)
+{
+   E_Zone *zone;
+
+   zone = desk->zone;
+
+   desk->smart_obj = evas_object_smart_add(e_comp_evas_get(), _e_policy_desk_smart_class_new());
+   e_desk_geometry_set(desk, zone->x, zone->y, zone->w, zone->h);
+
+   E_POLICY_DESK_SMART_DATA_GET_OR_RETURN(desk->smart_obj, sd);
+
+   sd->zoom.ratio_x = 1.0;
+   sd->zoom.ratio_y = 1.0;
+   sd->zoom.cord_x = 0;
+   sd->zoom.cord_y = 0;
+}
+
+static void
+_e_policy_desk_smart_client_add(Evas_Object *obj, E_Client *ec)
+{
+   Evas_Object *parent = NULL;
+   E_Desk *ec_desk;
+
+   E_POLICY_DESK_SMART_DATA_GET_OR_RETURN(obj, sd);
+
+   ec_desk = e_comp_desk_find_by_ec(ec);
+   if (!ec_desk) return;
+
+   // if ec is a member of e_desk, don't add it in data.
+   parent = evas_object_smart_parent_get(ec->frame);
+   if (parent && (parent == ec_desk->smart_obj)) return;
+
+   if (eina_list_data_find(sd->clients, ec))
+     return;
+
+   sd->clients = eina_list_append(sd->clients, ec);
+   evas_object_smart_changed(obj);
+}
+
+static void
+_e_policy_desk_smart_client_del(Evas_Object *obj, E_Client *ec)
+{
+   E_POLICY_DESK_SMART_DATA_GET_OR_RETURN(obj, sd);
+
+   if (!eina_list_data_find(sd->clients, ec))
+     return;
+
+   if (sd->zoom.enabled)
+     _e_policy_desk_client_zoom(ec, 1.0, 1.0, 0, 0);
+
+   sd->clients = eina_list_remove(sd->clients, ec);
+   evas_object_smart_changed(obj);
+}
+
+
+static void
+_e_policy_desk_client_set(E_Desk *desk, E_Client *ec)
+{
+   ec->desk = desk; // FIXME: This line must be deleted.
+
+   if (!ec->new_client)
+     {
+        if (e_client_view_get(ec))
+          {
+             e_view_client_effect_unclip(e_client_view_get(ec));
+             e_view_client_effect_set(e_client_view_get(ec), NULL);
+          }
+        if (desk->visible || ec->sticky)
+          {
+             if ((!ec->hidden) && (!ec->iconic))
+               e_view_client_show(e_client_view_get(ec));
+          }
+        else
+          {
+             ec->hidden = 1;
+             e_view_client_hide(e_client_view_get(ec));
+          }
+     }
+
+   e_client_comp_hidden_set(ec, (!desk->visible) && (!ec->sticky));
+
+   if (e_config->transient.desktop)
+     {
+        E_Client *child;
+        const Eina_List *l;
+
+        EINA_LIST_FOREACH(ec->transients, l, child)
+            e_desk_client_add(desk, child);
+     }
+}
+
+static E_Policy_Desk_Private_Client *
+_e_policy_desk_private_client_get(E_Client *ec)
+{
+   E_Policy_Desk_Private_Client *desk_client;
+   struct wl_listener *listener;
+
+   listener = e_client_destroy_listener_get(ec, _e_policy_desk_cb_client_destroy);
+   if (!listener) return NULL;
+
+   return wl_container_of(listener, desk_client, client_destroy);
+}
+
+static void
+_e_policy_desk_private_client_del(E_Policy_Desk_Private_Client *desk_client)
+{
+   E_Desk *desk = desk_client->desk;
+   E_Client *ec = desk_client->ec;
+
+   _e_policy_desk_smart_client_del(desk->smart_obj, ec);
+   _e_policy_desk_client_data_del(desk, ec);
+
+   wl_list_remove(&desk_client->client_activate_done.link);
+   wl_list_remove(&desk_client->client_destroy.link);
+
+   E_FREE(desk_client);
+}
+
+
+
+static Eina_Bool
+_e_policy_desk_transition_setup(E_Client *ec, int dx, int dy, int state)
+{
+   e_view_client_effect_set(e_client_view_get(ec), "none");
+
+   return EINA_FALSE;
+}
+
+static void
+_e_policy_desk_show_end(void *data, E_View_Client *client, const char *emission, const char *source)
+{
+   E_Client *ec = data;
+   E_Zone *ec_zone;
+   E_Desk *ec_desk;
+
+   ec_zone = e_comp_zone_find_by_ec(ec);
+   ec_desk = e_zone_desk_find_by_ec(ec_zone, ec);
+   if (ec_desk)
+     ec_desk->animate_count--;
+
+   e_client_comp_hidden_set(ec, 0);
+   e_view_client_effect_unclip(e_client_view_get(ec));
+   ec->hidden = 0;
+   if (!ec->visible)
+     e_view_client_show(e_client_view_get(ec));
+
+   if (ec_desk != e_desk_current_get(ec_zone)) return;
+}
+
+static void
+_e_policy_desk_hide_end(void *data, E_View_Client *client, const char *emission, const char *source)
+{
+   E_Client *ec = data;
+   E_Desk *ec_desk;
+
+   ec_desk = e_comp_desk_find_by_ec(ec);
+   if (ec_desk)
+     ec_desk->animate_count--;
+   ec->hidden = 1;
+   e_view_client_hide(e_client_view_get(ec));
+}
+
+static void
+_e_policy_desk_show_begin(E_Desk *desk, int dx, int dy)
+{
+   E_Client *ec;
+
+   if (dx < 0) dx = -1;
+   if (dx > 0) dx = 1;
+   if (dy < 0) dy = -1;
+   if (dy > 0) dy = 1;
+
+   desk->animate_count = 0;
+   E_CLIENT_FOREACH(ec)
+     {
+        if (e_client_util_ignored_get(ec) || (!e_zone_has_ec(desk->zone, ec)) || (ec->iconic)) continue;
+        if (ec->moving)
+          {
+             e_desk_client_add(desk, ec);
+             e_view_client_show(e_client_view_get(ec));
+             continue;
+          }
+        if ((!e_desk_has_ec(desk, ec)) || (ec->sticky)) continue;
+        if ((!starting) && (!ec->new_client) && _e_policy_desk_transition_setup(ec, dx, dy, 1))
+          {
+             e_view_client_effect_stop(e_client_view_get(ec), _e_policy_desk_hide_end);
+             e_view_client_effect_start(e_client_view_get(ec), _e_policy_desk_show_end, ec);
+             desk->animate_count++;
+          }
+        else
+          ec->hidden = 0;
+
+        e_client_comp_hidden_set(ec, ec->hidden);
+        e_view_client_show(e_client_view_get(ec));
+     }
+}
+
+static void
+_e_policy_desk_hide_begin(E_Desk *desk, int dx, int dy)
+{
+   E_Client *ec;
+
+   if (dx < 0) dx = -1;
+   if (dx > 0) dx = 1;
+   if (dy < 0) dy = -1;
+   if (dy > 0) dy = 1;
+
+   desk->animate_count = 0;
+   E_CLIENT_FOREACH(ec)
+     {
+        if (e_client_util_ignored_get(ec)) continue;
+        if ((!e_zone_has_ec(desk->zone, ec)) || (ec->iconic)) continue;
+        if (ec->moving) continue;
+        if ((!e_desk_has_ec(desk, ec)) || (ec->sticky)) continue;
+        if ((!starting) && (!ec->new_client) && _e_policy_desk_transition_setup(ec, -dx, -dy, 0))
+          {
+             e_view_client_effect_stop(e_client_view_get(ec), _e_policy_desk_show_end);
+             e_view_client_effect_start(e_client_view_get(ec), _e_policy_desk_hide_end, ec);
+             desk->animate_count++;
+          }
+        else
+          {
+             ec->hidden = 1;
+             e_view_client_show(e_client_view_get(ec));
+             ec->changes.visible = 0;
+             e_view_client_hide(e_client_view_get(ec));
+          }
+        e_client_comp_hidden_set(ec, EINA_TRUE);
+     }
+}
+
+static void
+_e_policy_desk_object_zoom(Evas_Object *obj, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy)
+{
+   E_Map *map;
+
+   if (!obj) return;
+   if ((zoomx == 1.0) && (zoomy == 1.0))
+     {
+        e_comp_object_map_enable_set(obj, EINA_FALSE);
+        e_comp_object_map_set(obj, NULL);
+        return;
+     }
+
+   map = e_map_new();
+   e_map_util_points_populate_from_object(map, obj);
+   e_map_util_zoom(map, zoomx, zoomy, cx, cy);
+   e_comp_object_map_set(obj, map);
+   e_comp_object_map_enable_set(obj, EINA_TRUE);
+   e_map_free(map);
+}
+
+static void
+_e_policy_desk_client_subsurf_create(void *data, E_Client *subc)
+{
+   E_Client *ec, *parent;
+   ec = data;
+
+   if (ec != subc) return;
+
+   if (ec->desk_zoom.transform)
+     {
+        e_client_transform_core_remove(ec, ec->desk_zoom.transform);
+        E_FREE_FUNC(ec->desk_zoom.transform, e_util_transform_del);
+     }
+
+   parent = e_comp_wl_topmost_parent_get(ec);
+   if (parent)
+     {
+        parent->transform_core.changed = EINA_TRUE;
+        e_client_transform_core_update(parent);
+     }
+}
+
+static void
+_e_policy_desk_client_deskzoom_set(E_Client *ec, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy)
+{
+   if (e_comp_wl_subsurface_check(ec)) return;
+
+   if ((zoomx == 1.0) && (zoomy == 1.0))
+     {
+        if (ec->desk_zoom.transform)
+          e_client_transform_core_remove(ec, ec->desk_zoom.transform);
+        e_client_transform_core_update(ec);
+        return;
+     }
+
+   if (!ec->desk_zoom.transform)
+     {
+        ec->desk_zoom.transform = e_util_transform_new();
+        e_util_transform_role_set(ec->desk_zoom.transform, "desk_zoom");
+
+        if (!ec->desk_zoom.hook_subsurf_create)
+          {
+             ec->desk_zoom.hook_subsurf_create =
+                 e_comp_wl_hook_add(E_COMP_WL_HOOK_SUBSURFACE_CREATE,
+                                    _e_policy_desk_client_subsurf_create, ec);
+          }
+     }
+
+   e_util_transform_zoom_set(ec->desk_zoom.transform, zoomx, zoomy, cx, cy);
+   e_client_transform_core_add(ec, ec->desk_zoom.transform);
+
+   e_client_transform_core_update(ec);
+}
+
+static void
+_e_policy_desk_client_zoom(E_Client *ec, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy)
+{
+   if (e_object_is_del(E_OBJECT(ec))) return;
+   if (ec->is_cursor) return;
+
+   E_Policy_Desk_Private_Client *desk_client = _e_policy_desk_private_client_get(ec);
+   EINA_SAFETY_ON_NULL_RETURN(desk_client);
+
+   if (desk_client->skip_zoom)
+     return;
+
+   if ((zoomx == 1.0) && (zoomy == 1.0))
+     e_client_desk_zoom_enable_set(ec, EINA_FALSE);
+   else
+     e_client_desk_zoom_enable_set(ec, EINA_TRUE);
+
+   _e_policy_desk_client_deskzoom_set(ec, zoomx, zoomy, cx, cy);
+
+   if (e_view_client_visible_get(e_client_view_get(ec)))
+     {
+        // force update
+        e_view_client_damage(e_client_view_get(ec), 0, 0, ec->w, ec->h);
+        e_view_client_dirty(e_client_view_get(ec));
+        e_view_client_render(e_client_view_get(ec));
+     }
+}
+
+static Eina_Bool
+_e_policy_desk_smart_client_cb_resize(void *data, int type, void *event)
+{
+   E_Event_Client *ev;
+   E_Policy_Desk_Smart_Data *sd;
+   E_Client *ec = NULL;
+
+   if (!data) goto end;
+   if (!event) goto end;
+
+   ev = event;
+   sd = data;
+   ec = ev->ec;
+   if (!ec) goto end;
+
+   if (!eina_list_data_find(sd->clients, ec))
+     goto end;
+
+   if (sd->zoom.animator)
+     goto end;
+
+   if (sd->zoom.enabled)
+     _e_policy_desk_client_zoom(ec,
+                                sd->zoom.ratio_x, sd->zoom.ratio_y,
+                                sd->zoom.cord_x, sd->zoom.cord_y);
+end:
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static void
+_e_policy_desk_smart_add(Evas_Object *obj)
+{
+   EVAS_SMART_DATA_ALLOC(obj, E_Policy_Desk_Smart_Data);
+
+   /* to apply zoom transformation whenever the client's size is changed. */
+   E_LIST_HANDLER_APPEND(priv->handlers, E_EVENT_CLIENT_RESIZE, _e_policy_desk_smart_client_cb_resize, priv);
+
+   /* FIXME hard coded, it will be laid upper than unpacked clients */
+   evas_object_layer_set(obj, E_LAYER_DESK_OBJECT);
+
+   _e_policy_desk_parent_sc->add(obj);
+}
+
+static void
+_e_policy_desk_smart_del(Evas_Object *obj)
+{
+   _e_policy_desk_parent_sc->del(obj);
+
+   E_POLICY_DESK_SMART_DATA_GET_OR_RETURN(obj, sd);
+
+   E_FREE_LIST(sd->handlers, ecore_event_handler_del);
+   eina_list_free(sd->clients);
+   free(sd);
+
+   evas_object_smart_data_set(obj, NULL);
+}
+
+static void
+_e_policy_desk_smart_member_add(Evas_Object *obj, Evas_Object *child)
+{
+   E_Client *ec;
+   E_Desk *ec_desk;
+
+   _e_policy_desk_parent_sc->member_add(obj, child);
+
+   ec = evas_object_data_get(child, "E_Client");
+   if (ec)
+     {
+        ec_desk = e_comp_desk_find_by_ec(ec);
+        if (ec_desk)
+          e_desk_client_del(ec_desk, ec);
+     }
+}
+
+static void
+_e_policy_desk_smart_member_del(Evas_Object *obj, Evas_Object *child)
+{
+   E_Client *ec = NULL;
+   Evas_Object *parent = NULL;
+   E_Zone*ec_zone;
+   E_Desk *ec_desk;
+
+   _e_policy_desk_parent_sc->member_del(obj, child);
+
+   // if quickpanel packed into mover smart obj, _e_policy_desk_smart_member_del is called
+   // but parent is still e_desk, because mover's parent is the same e_desk
+   // than don't add ec on the sd->clists
+   parent = evas_object_smart_parent_get(child);
+   if (parent && (parent == obj)) return;
+
+   ec = evas_object_data_get(child, "E_Client");
+   if (ec)
+     {
+        ec_zone = e_comp_zone_find_by_ec(ec);
+        ec_desk = e_zone_desk_find_by_ec(ec_zone, ec);
+        if (ec_desk)
+          _e_policy_desk_smart_client_add(ec_desk->smart_obj, ec);
+     }
+}
+
+static void
+_e_policy_desk_smart_set_user(Evas_Smart_Class *sc)
+{
+   sc->add = _e_policy_desk_smart_add;
+   sc->del = _e_policy_desk_smart_del;
+   sc->member_add = _e_policy_desk_smart_member_add;
+   sc->member_del = _e_policy_desk_smart_member_del;
+}
+#if 0
+static void
+_e_policy_desk_cb_desk_new(struct wl_listener *listener, void *data)
+{
+   E_Policy_Desk *pd;
+   E_Zone *zone;
+   E_Desk *desk;
+   Eina_List *l;
+   E_Config_Desktop_Name *cfname;
+   char name[40];
+   int ok = 0;
+
+   pd = wl_container_of(listener, pd, desk_new);
+   desk = data;
+   zone = desk->zone;
+
+   ELOGF("POL_DESK", "Desk NEW. desk:%p", NULL, desk);
+
+   /* init smart object */
+   _e_policy_desk_smart_init(desk);
+
+   /* Get current desktop's name */
+   EINA_LIST_FOREACH(e_config->desktop_names, l, cfname)
+     {
+        if ((cfname->zone >= 0) &&
+            ((int)zone->num != cfname->zone)) continue;
+        if ((cfname->desk_x != desk->x) || (cfname->desk_y != desk->y))
+          continue;
+        desk->name = eina_stringshare_ref(cfname->name);
+        ok = 1;
+        break;
+     }
+
+   if (!ok)
+     {
+        snprintf(name, sizeof(name), _(e_config->desktop_default_name), desk->x, desk->y);
+        desk->name = eina_stringshare_add(name);
+     }
+
+   // new a base e_desk_area
+   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);
+   if (!desk->desk_area.base)
+     {
+        e_object_del(E_OBJECT(desk));
+        return;
+     }
+}
+#endif
+
+static void
+_e_policy_desk_cb_desk_free(struct wl_listener *listener, void *data)
+{
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+   Eina_List *l;
+   E_Desk_Area *eda;
+
+   pd = wl_container_of(listener, pd, desk_free);
+   desk = data;
+
+   ELOGF("POL_DESK", "Desk FREE. desk:%p", NULL, desk);
+
+   for (int i=E_DESK_AREA_LAYER_COUNT-1; i>=0; i--)
+     {
+        EINA_LIST_FOREACH(desk->desk_area.list[i], l, eda)
+          {
+             e_object_del(E_OBJECT(eda));
+          }
+        eina_list_free(desk->desk_area.list[i]);
+        desk->desk_area.list[i] = NULL;
+     }
+
+   e_desk_desk_area_del(desk, desk->desk_area.base);
+   desk->desk_area.base = NULL;
+   desk->desk_area.active = NULL;
+
+
+   E_FREE_FUNC(desk->smart_obj, evas_object_del);
+   eina_stringshare_del(desk->name);
+   desk->name = NULL;
+   E_FREE_LIST(desk->handlers, ecore_event_handler_del);
+}
+
+static void
+_e_policy_desk_cb_top_visible_get(struct wl_listener *listener, void *data)
+{
+   E_Desk_Data_Top_Visible_Get *top_visible_data;
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+   E_Client *ec;
+
+   pd = wl_container_of(listener, pd, top_visible_get);
+   top_visible_data = data;
+   desk = top_visible_data->desk;
+
+   E_CLIENT_REVERSE_FOREACH(ec)
+       if (e_desk_has_ec(desk, ec) && e_view_client_visible_get(e_client_view_get(ec)))
+         {
+            top_visible_data->visible_ec = ec;
+            return;
+         }
+
+   top_visible_data->visible_ec = NULL;
+   return;
+}
+
+static void
+_e_policy_desk_cb_name_set(struct wl_listener *listener, void *data)
+{
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+
+   pd = wl_container_of(listener, pd, name_set);
+   desk = pd->desk;
+
+   _e_policy_desk_event_simple_add(desk, E_EVENT_DESK_NAME_CHANGE);
+}
+
+static void
+_e_policy_desk_cb_name_add(struct wl_listener *listener, void *data)
+{
+   E_Desk_Data_Name *name_data;
+   E_Policy_Desk *pd;
+   int zone;
+   int desk_x, desk_y;
+   const char *name;
+   E_Config_Desktop_Name *cfname;
+
+   pd = wl_container_of(listener, pd, name_add);
+   name_data = data;
+   zone = pd->zone->id;
+   desk_x = name_data->desk_x;
+   desk_y = name_data->desk_y;
+   name = name_data->name;
+
+   e_desk_name_del(zone, desk_x, desk_y);
+
+   cfname = E_NEW(E_Config_Desktop_Name, 1);
+   if (!cfname) return;
+   cfname->zone = zone;
+   cfname->desk_x = desk_x;
+   cfname->desk_y = desk_y;
+   if (name) cfname->name = eina_stringshare_add(name);
+   else cfname->name = NULL;
+   e_config->desktop_names = eina_list_append(e_config->desktop_names, cfname);
+}
+
+static void
+_e_policy_desk_cb_name_del(struct wl_listener *listener, void *data)
+{
+   E_Desk_Data_Name *name_data;
+   E_Policy_Desk *pd;
+   int zone;
+   int desk_x, desk_y;
+   E_Config_Desktop_Name *cfname;
+   Eina_List *l = NULL;
+
+   pd = wl_container_of(listener, pd, name_del);
+   name_data = data;
+   zone = pd->zone->id;
+   desk_x = name_data->desk_x;
+   desk_y = name_data->desk_y;
+
+   EINA_LIST_FOREACH(e_config->desktop_names, l, cfname)
+     {
+        if ((cfname->zone == zone) &&
+            (cfname->desk_x == desk_x) && (cfname->desk_y == desk_y))
+          {
+             e_config->desktop_names =
+                 eina_list_remove_list(e_config->desktop_names, l);
+             if (cfname->name) eina_stringshare_del(cfname->name);
+             E_FREE(cfname);
+             break;
+          }
+     }
+
+}
+
+static void
+_e_policy_desk_cb_name_update(struct wl_listener *listener, void *data)
+{
+   const Eina_List *z, *l;
+   Eina_List *comp_zone_list;
+   E_Zone *zone;
+   E_Desk *desk;
+   E_Config_Desktop_Name *cfname;
+   int d_x, d_y, ok;
+   char name[40];
+
+   if (!(comp_zone_list = e_comp_zone_list_get())) return;
+
+   EINA_LIST_FOREACH(comp_zone_list, z, zone)
+     {
+        for (d_x = 0; d_x < zone->desk_x_count; d_x++)
+          {
+             for (d_y = 0; d_y < zone->desk_y_count; d_y++)
+               {
+                  desk = zone->desks[d_x + zone->desk_x_count * d_y];
+                  ok = 0;
+
+                  EINA_LIST_FOREACH(e_config->desktop_names, l, cfname)
+                    {
+                       if ((cfname->zone >= 0) &&
+                           ((int)zone->num != cfname->zone)) continue;
+                       if ((cfname->desk_x != d_x) ||
+                           (cfname->desk_y != d_y)) continue;
+                       e_desk_name_set(desk, cfname->name);
+                       ok = 1;
+                       break;
+                    }
+
+                  if (!ok)
+                    {
+                       snprintf(name, sizeof(name),
+                                _(e_config->desktop_default_name),
+                                d_x, d_y);
+                       e_desk_name_set(desk, name);
+                    }
+               }
+          }
+     }
+}
+
+static void
+_e_policy_desk_cb_desk_show(struct wl_listener *listener, void *data)
+{
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+   Edje_Message_Float_Set *msg = NULL;
+   E_Desk *desk2 = NULL;
+   int dx = 0, dy = 0;
+   Ecore_Event *eev_ecore_event = NULL;
+   Ecore_Event *ev_ecore_event = NULL;
+
+   pd = wl_container_of(listener, pd, desk_show);
+   desk = pd->desk;
+
+   desk2 = e_desk_at_xy_get(desk->zone, desk->zone->desk_x_current, desk->zone->desk_y_current);
+   if ((!starting) && (!desk2->visible) && (desk != desk2)) return;
+
+   eev_ecore_event = _e_policy_desk_event_simple_add(desk, E_EVENT_DESK_BEFORE_SHOW);
+   if (!eev_ecore_event) goto error;
+
+   if (desk2->visible)
+     {
+        desk2->visible = 0;
+        if ((!dx) && (!dy))
+          {
+             dx = desk->x - desk2->x;
+             dy = desk->y - desk2->y;
+          }
+        _e_policy_desk_hide_begin(desk2, dx, dy);
+        if (desk2->smart_obj)
+          evas_object_hide(desk2->smart_obj);
+     }
+
+   desk->zone->desk_x_prev = desk->zone->desk_x_current;
+   desk->zone->desk_y_prev = desk->zone->desk_y_current;
+   desk->zone->desk_x_current = desk->x;
+   desk->zone->desk_y_current = desk->y;
+   desk->visible = 1;
+
+   msg = alloca(sizeof(Edje_Message_Float_Set) + (4 * sizeof(double)));
+   msg->count = 5;
+   msg->val[0] = 0.0;
+   msg->val[1] = desk->x;
+   msg->val[2] = desk->zone->desk_x_count;
+   msg->val[3] = desk->y;
+   msg->val[4] = desk->zone->desk_y_count;
+
+   _e_policy_desk_show_begin(desk, dx, dy);
+   if (desk->smart_obj)
+     evas_object_show(desk->smart_obj);
+
+   ev_ecore_event = _e_policy_desk_event_simple_add(desk, E_EVENT_DESK_SHOW);
+   if (!ev_ecore_event) goto error;
+
+   _e_policy_desk_event_simple_add(e_desk_current_get(desk->zone), E_EVENT_DESK_AFTER_SHOW);
+
+   return;
+
+error:
+   if (eev_ecore_event) ecore_event_del(eev_ecore_event);
+}
+
+static void
+_e_policy_desk_cb_desk_deskshow(struct wl_listener *listener, void *data)
+{
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+   E_Client *ec;
+
+   pd = wl_container_of(listener, pd, desk_deskshow);
+   desk = pd->desk;
+
+   if (desk->deskshow_toggle)
+     {
+        /* uniconify raises windows and changes stacking order
+         * go top-down to avoid skipping windows
+         */
+        E_CLIENT_REVERSE_FOREACH(ec)
+          {
+             if (e_client_util_ignored_get(ec)) continue;
+             if (!e_desk_has_ec(desk, ec)) continue;
+             if (ec->deskshow)
+               {
+                  ec->deskshow = 0;
+                  e_client_uniconify(ec);
+               }
+          }
+     }
+   else
+     {
+        /*
+         * iconify raises, so we have to start from the bottom so we are going forward
+         */
+        E_CLIENT_FOREACH(ec)
+          {
+             if (e_client_util_ignored_get(ec)) continue;
+             if (!e_desk_has_ec(desk, ec)) continue;
+             if (ec->iconic) continue;
+             if (ec->netwm.state.skip_taskbar) continue;
+             if (ec->user_skip_winlist) continue;
+             ec->deskshow = 1;
+             e_client_iconify(ec);
+          }
+     }
+   desk->deskshow_toggle = !desk->deskshow_toggle;
+
+   _e_policy_desk_event_simple_add(desk, E_EVENT_DESK_DESKSHOW);
+}
+
+static void
+_e_policy_desk_cb_desk_client_add(struct wl_listener *listener, void *data)
+{
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+   E_Client *ec;
+   E_Policy_Desk_Private_Client *desk_client;
+   E_Desk_Area *eda;
+
+   pd = wl_container_of(listener, pd, desk_client_add);
+   desk = pd->desk;
+   ec = (E_Client *) data;
+
+   ELOGF("POL_DESK", "CLIENT ADD. desk:%p", ec, desk);
+
+   desk_client = E_NEW(E_Policy_Desk_Private_Client, 1);
+   EINA_SAFETY_ON_NULL_RETURN(desk_client);
+
+   desk_client->desk = desk;
+   desk_client->ec = ec;
+
+   // e_client listeners
+   desk_client->client_destroy.notify = _e_policy_desk_cb_client_destroy;
+   e_client_destroy_listener_add(ec, &desk_client->client_destroy);
+   desk_client->client_activate_done.notify = _e_policy_desk_cb_client_activate_done;
+   e_client_activate_done_listener_add(ec, &desk_client->client_activate_done);
+
+   _e_policy_desk_client_set(desk, ec);
+   _e_policy_desk_client_data_set(desk, ec);
+
+   eda = e_desk_desk_area_base_get(desk);
+   e_desk_area_ec_add(eda, ec);
+
+   _e_policy_desk_smart_client_add(desk->smart_obj, ec);
+
+   _e_policy_desk_hook_call(E_DESK_HOOK_CLIENT_ADD, desk);
+}
+
+static void
+_e_policy_desk_cb_desk_client_del(struct wl_listener *listener, void *data)
+{
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+   E_Client *ec;
+   E_Policy_Desk_Private_Client *desk_client;
+   E_Desk_Area *eda;
+
+   pd = wl_container_of(listener, pd, desk_client_del);
+   desk = pd->desk;
+   ec = (E_Client *) data;
+
+   ELOGF("POL_DESK", "CLIENT REMOVE. desk:%p", ec, desk);
+
+   desk_client = _e_policy_desk_private_client_get(ec);
+   EINA_SAFETY_ON_NULL_RETURN(desk_client);
+
+   eda = e_desk_desk_area_find_by_ec(desk, ec);
+   EINA_SAFETY_ON_NULL_RETURN(eda);
+
+   e_desk_area_ec_remove(eda, ec);
+
+   _e_policy_desk_private_client_del(desk_client);
+}
+
+static void
+_e_policy_desk_cb_desk_geometry_set(struct wl_listener *listener, void *data)
+{
+   E_Desk_Data_Geometry *geom_data;
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+   E_Client *ec;
+   E_Maximize max;
+   Eina_List *l = NULL, *ll = NULL;
+   Evas_Object *m;
+   E_Event_Desk_Geometry_Change *ev = NULL;
+   int x, y, w, h;
+   int cx, cy, dx, dy;
+
+   pd = wl_container_of(listener, pd, geometry_set);
+   desk = pd->desk;
+   geom_data = (E_Desk_Data_Geometry *) data;
+   x = geom_data->x;
+   y = geom_data->y;
+   w = geom_data->w;
+   h = geom_data->h;
+
+   E_POLICY_DESK_SMART_DATA_GET_OR_RETURN(desk->smart_obj, sd);
+
+   dx = x - desk->geom.x;
+   dy = y - desk->geom.y;
+
+   EINA_LIST_FOREACH(sd->clients, l, ec)
+     {
+        if (e_object_is_del(E_OBJECT(ec))) continue;
+
+        /* even if the desktop geometry is chagned, the system partial windows such as virtual
+         * keyboard and clipboard should be placed at the bottom of the desktop. */
+        /* QUICK FIX */
+        if (e_policy_client_is_keyboard(ec))
+          {
+             continue;
+          }
+        else if (e_comp_wl_subsurface_check(ec))
+          {
+             continue;
+          }
+        else if (ec->maximized)
+          {
+             max = ec->maximized;
+             ec->maximized = E_MAXIMIZE_NONE;
+             e_client_maximize(ec, max);
+          }
+        else
+          {
+             e_client_geometry_get(ec, &cx, &cy, NULL, NULL);
+             e_client_util_move_without_frame(ec, cx + dx, cy + dy);
+          }
+     }
+
+   // E Client as an member of smart object is not changed even though parent obj is changed
+   // Workaround : update max geometry if ec is a member of desk->smart_obj
+   EINA_LIST_FOREACH(evas_object_smart_members_get(desk->smart_obj), ll, m)
+     {
+        ec = evas_object_data_get(m, "E_Client");
+        if (ec && ec->maximized)
+          {
+             if (e_object_is_del(E_OBJECT(ec))) continue;
+             max = ec->maximized;
+             ec->maximized = E_MAXIMIZE_NONE;
+             e_client_maximize(ec, max);
+          }
+     }
+
+   // apply geometry on smart obj
+   evas_object_geometry_set(desk->smart_obj, x, y, w, h);
+
+   ev = E_NEW(E_Event_Desk_Geometry_Change, 1);
+   if (ev)
+     {
+        ev->desk = desk;
+        ev->x = x;
+        ev->y = y;
+        ev->w = w;
+        ev->h = h;
+        e_object_ref(E_OBJECT(desk));
+        ecore_event_add(E_EVENT_DESK_GEOMETRY_CHANGE, ev, _e_policy_desk_event_desk_geometry_change_free, NULL);
+     }
+
+   e_comp_render_queue();
+}
+
+static Eina_Bool
+_e_policy_desk_zoom_animate_cb(void *data, double pos)
+{
+   E_Desk *desk;
+   E_Client *ec;
+   Eina_List *l;
+   int cx, cy;
+   double zoomx, zoomy;
+   double progress;
+   double diff_x, diff_y;
+   double cBez[4] = {0.3, 0.0, 0.15, 1.0};
+
+   desk = (E_Desk*)data;
+   if (!desk) return ECORE_CALLBACK_CANCEL;
+
+   E_POLICY_DESK_SMART_DATA_GET_OR_RETURN(desk->smart_obj, sd) ECORE_CALLBACK_CANCEL;
+
+   progress = ecore_animator_pos_map_n(pos, ECORE_POS_MAP_CUBIC_BEZIER, 4, cBez);
+
+   diff_x = sd->zoom.prev_ratio_x - sd->zoom.ratio_x;
+   diff_y = sd->zoom.prev_ratio_y - sd->zoom.ratio_y;
+
+   zoomx = sd->zoom.ratio_x + (diff_x * (1-progress));
+   zoomy = sd->zoom.ratio_y + (diff_y * (1-progress));
+   cx = sd->zoom.cord_x;
+   cy = sd->zoom.cord_y;
+
+   EINA_LIST_FOREACH(sd->clients, l, ec)
+     {
+        if ((e_client_visibility_get(ec) == E_VISIBILITY_UNOBSCURED) ||
+            (e_comp_wl_subsurface_check(ec)))
+          _e_policy_desk_client_zoom(ec, zoomx, zoomy, cx, cy);
+     }
+
+   if (pos >= 1.0)
+     {
+        EINA_LIST_FOREACH(sd->clients, l, ec)
+          {
+             _e_policy_desk_client_zoom(ec, zoomx, zoomy, cx, cy);
+          }
+
+        if ((sd->zoom.ratio_x != 1.0) ||
+            (sd->zoom.ratio_y != 1.0))
+          {
+             // Zoom enable done
+             sd->zoom.enabled = EINA_TRUE;
+          }
+
+        sd->zoom.animating_type = E_POLICY_DESK_ZOOM_ANIMATING_TYPE_NONE;
+        sd->zoom.animator = NULL;
+     }
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static void
+_e_policy_desk_cb_desk_zoom_set(struct wl_listener *listener, void *data)
+{
+   E_Desk_Data_Zoom *zoom_data;
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+   E_Client *ec;
+   Eina_List *l;
+   E_Zone *zone = NULL;
+   E_Output *eout = NULL;
+   double zoomx, zoomy;
+   int cx, cy;
+
+   pd = wl_container_of(listener, pd, zoom_set);
+   desk = pd->desk;
+   zoom_data = (E_Desk_Data_Zoom *) data;
+
+   zoomx = zoom_data->zoomx;
+   zoomy = zoom_data->zoomy;
+   cx = zoom_data->cx;
+   cy = zoom_data->cy;
+
+   ELOGF("POL_DESK", "ZOOM SET. desk:%p, zoom ratio(%f,%f) cpos(%d,%d)", NULL, desk, zoomx, zoomy, cx, cy);
+
+   if (e_config->use_pp_zoom)
+     {
+        if (e_display_pp_support())
+          {
+             zone = desk->zone;
+             eout = e_output_find(zone->output_id);
+             if (!eout)
+               {
+                  ERR("e_desk_zoom_set: fail get eout");
+                  goto end;
+               }
+             if (!e_output_zoom_set(eout, zoomx, zoomy, cx, cy))
+               ERR("e_desk_zoom_set: fail zoom set");
+             else
+               DBG("e_desk_zoom_set: zoomx:%f, zoomy:%f, x:%d, y:%d", zoomx, zoomy, cx, cy);
+
+             goto end;
+          }
+     }
+
+   E_POLICY_DESK_SMART_DATA_GET_OR_RETURN(desk->smart_obj, sd);
+
+   if ((sd->zoom.ratio_x != zoomx) || (sd->zoom.ratio_y != zoomy) ||
+       (sd->zoom.cord_x != cx) || (sd->zoom.cord_y != cy))
+     {
+        sd->zoom.prev_ratio_x = sd->zoom.ratio_x;
+        sd->zoom.prev_ratio_y = sd->zoom.ratio_y;
+        sd->zoom.prev_cord_x = sd->zoom.cord_x;
+        sd->zoom.prev_cord_y = sd->zoom.cord_y;
+
+        sd->zoom.ratio_x = zoomx;
+        sd->zoom.ratio_y = zoomy;
+        sd->zoom.cord_x = cx;
+        sd->zoom.cord_y = cy;
+
+        if (e_config->desk_zoom_effect.enable)
+          {
+             if (sd->zoom.animator)
+               {
+                  ecore_animator_del(sd->zoom.animator);
+                  sd->zoom.animator = NULL;
+               }
+
+             sd->zoom.animating_type = E_POLICY_DESK_ZOOM_ANIMATING_TYPE_ENABLE;
+             sd->zoom.animator = ecore_animator_timeline_add(e_config->desk_zoom_effect.duration,
+                                                             _e_policy_desk_zoom_animate_cb, desk);
+             _e_policy_desk_object_zoom(desk->smart_obj, zoomx, zoomy, cx, cy);
+          }
+        else
+          {
+             _e_policy_desk_object_zoom(desk->smart_obj, zoomx, zoomy, cx, cy);
+             EINA_LIST_FOREACH(sd->clients, l, ec)
+               {
+                  _e_policy_desk_client_zoom(ec, zoomx, zoomy, cx, cy);
+               }
+          }
+     }
+
+   if (!sd->zoom.enabled)
+     {
+        /* if desk_zoom_effect is enabled,
+           then sd->zoom.enabled will be set after finishing effect */
+        if (!e_config->desk_zoom_effect.enable)
+          sd->zoom.enabled = EINA_TRUE;
+
+        /*
+         * NOTE: evas_object_map_enable_set is called in _e_policy_desk_client_zoom()
+         */
+        /*
+         * evas_object_map_enable_set(desk->smart_obj, EINA_TRUE);
+         * EINA_LIST_FOREACH(sd->clients, l, ec)
+         *   evas_object_map_enable_set(ec->frame, EINA_TRUE);
+         */
+     }
+
+end:
+   _e_policy_desk_event_simple_add(desk, E_EVENT_DESK_ZOOM_SET);
+}
+
+static void
+_e_policy_desk_cb_desk_zoom_get(struct wl_listener *listener, void *data)
+{
+   E_Desk_Data_Zoom *zoom_data;
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+   E_Zone *zone = NULL;
+   E_Output *eout = NULL;
+   Eina_Bool res = EINA_FALSE;
+   double zoomx = 0, zoomy = 0;
+   int cx = 0, cy = 0;
+
+   pd = wl_container_of(listener, pd, zoom_get);
+   desk = pd->desk;
+   zoom_data = (E_Desk_Data_Zoom *) data;
+   zoom_data->result = EINA_FALSE;
+
+   if (e_config->use_pp_zoom)
+     {
+        if (e_display_pp_support())
+          {
+             zone = desk->zone;
+             eout = e_output_find(zone->output_id);
+             if (!eout)
+               {
+                  ERR("e_desk_zoom_set: fail get eout");
+                  return;
+               }
+
+             res = e_output_zoom_get(eout, &zoomx, &zoomy, &cx, &cy);
+             zoom_data->zoomx = zoomx;
+             zoom_data->zoomy = zoomy;
+             zoom_data->cx = cx;
+             zoom_data->cy = cy;
+             zoom_data->result = res;
+             return;
+          }
+     }
+
+   E_POLICY_DESK_SMART_DATA_GET(desk->smart_obj, sd);
+   if (!sd)
+     {
+        zoom_data->result = EINA_FALSE;
+        return;
+     }
+
+   zoom_data->zoomx = sd->zoom.ratio_x;
+   zoom_data->zoomy = sd->zoom.ratio_y;
+   zoom_data->cx = sd->zoom.cord_x;
+   zoom_data->cy = sd->zoom.cord_y;
+   zoom_data->result = EINA_TRUE;
+}
+
+static void
+_e_policy_desk_cb_desk_zoom_get_center_coordinate(struct wl_listener *listener, void *data)
+{
+   E_Desk_Data_Zoom *zoom_data;
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+   E_Zone *zone = NULL;
+   E_Output *eout = NULL;
+   double zoomx, zoomy;
+   int rectx, recty;
+   int w, h;
+   int zoomw, zoomh;
+
+   pd = wl_container_of(listener, pd, zoom_get_center_coordinate);
+   desk = pd->desk;
+   zoom_data = (E_Desk_Data_Zoom *) data;
+   zoom_data->result = EINA_FALSE;
+   zoomx = zoom_data->zoomx;
+   zoomy = zoom_data->zoomy;
+   rectx = zoom_data->rectx;
+   recty = zoom_data->recty;
+
+   zone = desk->zone;
+   eout = e_output_find(zone->output_id);
+
+   e_output_size_get(eout, &w, &h);
+
+   zoomw = w / zoomx;
+   zoomh = h / zoomy;
+
+   if (e_config->use_pp_zoom)
+     {
+        if (zoomx == 1 || rectx < 0 || zoomw + rectx >= w)
+          {
+             zoom_data->result = EINA_FALSE;
+             return;
+          }
+
+        if (zoomy == 1 || recty < 0 || zoomh + recty >= h)
+          {
+             zoom_data->result = EINA_FALSE;
+             return;
+          }
+     }
+   else
+     {
+        if (zoomx == 1 || zoomy == 1)
+          {
+             zoom_data->result = EINA_FALSE;
+             return;
+          }
+     }
+
+   if (rectx == 0)
+     zoom_data->cx = 0;
+   else
+     zoom_data->cx = (int)((zoomx * (double)rectx) / (zoomx - 1.0));
+
+   if (recty == 0)
+     zoom_data->cy = 0;
+   else
+     zoom_data->cy = (int)((zoomy * (double)recty) / (zoomy - 1.0));
+
+   zoom_data->result = EINA_TRUE;
+}
+
+static void
+_e_policy_desk_cb_desk_zoom_unset(struct wl_listener *listener, void *data)
+{
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+   E_Client *ec;
+   Eina_List *l;
+   E_Zone *zone = NULL;
+   E_Output *eout = NULL;
+
+   pd = wl_container_of(listener, pd, zoom_unset);
+   desk = pd->desk;
+
+   ELOGF("POL_DESK", "ZOOM UNSET. desk:%p", NULL, desk);
+
+   if (e_config->use_pp_zoom)
+     {
+        if (e_display_pp_support())
+          {
+             zone = desk->zone;
+             eout = e_output_find(zone->output_id);
+             if (!eout)
+               {
+                  ERR("e_desk_zoom_unset: fail get eout");
+                  goto end;
+               }
+
+             e_output_zoom_unset(eout);
+             DBG("e_desk_zoom_unset");
+
+             goto end;
+          }
+     }
+
+   E_POLICY_DESK_SMART_DATA_GET_OR_RETURN(desk->smart_obj, sd);
+
+   if (!sd->zoom.enabled)
+     {
+        if (sd->zoom.animating_type != E_POLICY_DESK_ZOOM_ANIMATING_TYPE_ENABLE)
+          {
+             goto end;
+          }
+     }
+
+   sd->zoom.prev_ratio_x = sd->zoom.ratio_x;
+   sd->zoom.prev_ratio_y = sd->zoom.ratio_y;
+   sd->zoom.prev_cord_x = sd->zoom.cord_x;
+   sd->zoom.prev_cord_y = sd->zoom.cord_y;
+
+   sd->zoom.ratio_x = 1.0;
+   sd->zoom.ratio_y = 1.0;
+   sd->zoom.cord_x = 0;
+   sd->zoom.cord_y = 0;
+   sd->zoom.enabled = EINA_FALSE;
+
+   if (e_config->desk_zoom_effect.enable)
+     {
+        if (sd->zoom.animator)
+          {
+             ecore_animator_del(sd->zoom.animator);
+             sd->zoom.animator = NULL;
+          }
+
+        sd->zoom.animating_type = E_POLICY_DESK_ZOOM_ANIMATING_TYPE_DISABLE;
+        sd->zoom.animator = ecore_animator_timeline_add(e_config->desk_zoom_effect.duration,
+                                                        _e_policy_desk_zoom_animate_cb, desk);
+        _e_policy_desk_object_zoom(desk->smart_obj, sd->zoom.ratio_x, sd->zoom.ratio_y,
+                                   sd->zoom.cord_x, sd->zoom.cord_y);
+     }
+   else
+     {
+        _e_policy_desk_object_zoom(desk->smart_obj, sd->zoom.ratio_x, sd->zoom.ratio_y,
+                                   sd->zoom.cord_x, sd->zoom.cord_y);
+        /*
+         * NOTE: evas_object_map_enable_set is called in _e_policy_desk_client_zoom()
+         */
+        /*
+         * evas_object_map_enable_set(desk->smart_obj, EINA_FALSE);
+         */
+        EINA_LIST_FOREACH(sd->clients, l, ec)
+          {
+             /* NOTE Is it really necessary?
+              * Why isn't it enough to just call evas_object_map_enable_set(false)? */
+             _e_policy_desk_client_zoom(ec, sd->zoom.ratio_x, sd->zoom.ratio_y,
+                                        sd->zoom.cord_x, sd->zoom.cord_y);
+             //evas_object_map_enable_set(ec->frame, EINA_FALSE);
+          }
+     }
+
+end:
+   _e_policy_desk_event_simple_add(desk, E_EVENT_DESK_ZOOM_UNSET);
+}
+
+static void
+_e_policy_desk_cb_smart_member_add(struct wl_listener *listener, void *data)
+{
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+   Evas_Object *new_member;
+
+   pd = wl_container_of(listener, pd, smart_member_add);
+   desk = pd->desk;
+   new_member = (Evas_Object *) data;
+
+   evas_object_smart_member_add(new_member, desk->smart_obj);
+}
+
+static void
+_e_policy_desk_cb_smart_member_del(struct wl_listener *listener, void *data)
+{
+   E_Policy_Desk *pd;
+   Evas_Object *obj;
+
+   pd = wl_container_of(listener, pd, smart_member_del);
+   obj = (Evas_Object *) data;
+
+   evas_object_smart_member_del(obj);
+}
+
+static void
+_e_policy_desk_cb_client_zoom_skip_set(struct wl_listener *listener, void *data)
+{
+   E_Desk_Data_Client_Zoom *zoom_data;
+   E_Policy_Desk *pd;
+   E_Desk *desk, *ec_desk;
+   E_Client *ec;
+
+   pd = wl_container_of(listener, pd, client_zoom_skip_set);
+   desk = pd->desk;
+   zoom_data = (E_Desk_Data_Client_Zoom *) data;
+   ec = zoom_data->ec;
+   zoom_data->result = EINA_FALSE;
+
+   // TODO: Need to check the ec_desk?
+   ec_desk = e_zone_desk_find_by_ec(desk->zone, ec);
+   if (!ec_desk) return;
+
+   ELOGF("POL_DESK", "Client zoom skip set. desk:%p, ec_desk:%p)", ec, desk, ec_desk);
+
+   if (!e_desk_has_ec(desk, ec)) return;
+
+   E_Policy_Desk_Private_Client *desk_client = _e_policy_desk_private_client_get(ec);
+   if (desk_client)
+     desk_client->skip_zoom = EINA_TRUE;
+
+   zoom_data->result = EINA_TRUE;
+   return;
+}
+
+static void
+_e_policy_desk_cb_client_zoom_skip_unset(struct wl_listener *listener, void *data)
+{
+   E_Desk_Data_Client_Zoom *zoom_data;
+   E_Policy_Desk *pd;
+   E_Desk *desk, *ec_desk;
+   E_Client *ec;
+
+   pd = wl_container_of(listener, pd, client_zoom_skip_unset);
+   desk = pd->desk;
+   zoom_data = (E_Desk_Data_Client_Zoom *) data;
+   ec = zoom_data->ec;
+   zoom_data->result = EINA_FALSE;
+
+   ec_desk = e_zone_desk_find_by_ec(desk->zone, ec);
+   if (!ec_desk) return;
+
+   ELOGF("DESK", "Client zoom skip set. desk:%p, ec_desk:%p)", ec, desk, ec_desk);
+
+   if (!e_desk_has_ec(desk, ec)) return;
+
+   E_Policy_Desk_Private_Client *desk_client = _e_policy_desk_private_client_get(ec);
+   if (desk_client)
+     desk_client->skip_zoom = EINA_FALSE;
+
+   _e_policy_desk_smart_client_add(desk->smart_obj, ec);
+
+   zoom_data->result = EINA_TRUE;
+   return;
+}
+
+static void
+_e_policy_desk_cb_client_zoom_apply(struct wl_listener *listener, void *data)
+{
+   E_Desk_Data_Client_Zoom *zoom_data;
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+   E_Client *ec;
+
+   pd = wl_container_of(listener, pd, client_zoom_apply);
+   desk = pd->desk;
+   zoom_data = (E_Desk_Data_Client_Zoom *) data;
+   ec = zoom_data->ec;
+
+   E_POLICY_DESK_SMART_DATA_GET_OR_RETURN(desk->smart_obj, sd);
+   if (!eina_list_data_find(sd->clients, ec))
+     return;
+
+   if (sd->zoom.enabled)
+     {
+        _e_policy_desk_client_zoom(ec,
+                                   sd->zoom.ratio_x, sd->zoom.ratio_y,
+                                   sd->zoom.cord_x, sd->zoom.cord_y);
+     }
+}
+
+static void
+_e_policy_desk_cb_zoom_is_animating(struct wl_listener *listener, void *data)
+{
+   E_Desk_Data_Client_Zoom *zoom_data;
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+
+   pd = wl_container_of(listener, pd, zoom_is_animating);
+   desk = pd->desk;
+   zoom_data = (E_Desk_Data_Client_Zoom *) data;
+   zoom_data->result = EINA_FALSE;
+
+   E_POLICY_DESK_SMART_DATA_GET(desk->smart_obj, sd);
+   if (!sd) return;
+
+   if (!e_config->desk_zoom_effect.enable) return;
+
+   zoom_data->result = !!sd->zoom.animator;
+   return;
+}
+
+static void
+_e_policy_desk_cb_visible_client_iconify_all(struct wl_listener *listener, void *data)
+{
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+   E_Client *ec;
+   Eina_List *l;
+
+   pd = wl_container_of(listener, pd, visible_client_iconify_all);
+   desk = pd->desk;
+
+   ELOGF("POL_DESK", "ICONIFY ALL VISIBLE WINDOW", NULL);
+   E_CLIENT_REVERSE_FOREACH(ec)
+     {
+        if (!e_desk_has_ec(desk, ec)) continue;
+        if (e_object_is_del(E_OBJECT(ec))) continue;
+        if (!ec->visible) continue;
+        if (ec->netwm.type == E_WINDOW_TYPE_DESKTOP) continue;
+        if (e_client_desk_iconify_skip_get(ec)) continue;
+        if (e_client_visibility_get(ec) == E_VISIBILITY_UNKNOWN) continue;
+        if (e_client_visibility_get(ec) != E_VISIBILITY_UNOBSCURED)
+          {
+             if (e_client_is_iconified_by_client(ec))
+               continue;
+          }
+
+        ELOGF("POL_DESK", "Add to iconified list...", ec);
+        desk->iconified_list = eina_list_remove(desk->iconified_list, ec);
+        desk->iconified_list = eina_list_append(desk->iconified_list, ec);
+     }
+
+   // bottom to top
+   EINA_LIST_REVERSE_FOREACH(desk->iconified_list, l, ec)
+     {
+        e_client_iconified_type_set(ec, E_ICONIFIED_TYPE_DESK_ICONIFY_BY_CLIENT);
+        e_policy_wl_iconify_state_change_send(ec, 1);
+        e_client_iconify(ec);
+     }
+}
+
+static void
+_e_policy_desk_cb_visible_client_restore_all(struct wl_listener *listener, void *data)
+{
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+   E_Client *ec;
+   Eina_List *restore_list;
+   Eina_List *l;
+
+   pd = wl_container_of(listener, pd, visible_client_restore_all);
+   desk = pd->desk;
+
+   ELOGF("POL_DESK", "RESTORE ALL VISIBLE WINDOW", NULL);
+
+   restore_list = eina_list_clone(desk->iconified_list);
+
+   eina_list_free(desk->iconified_list);
+   desk->iconified_list = NULL;
+
+   // bottom to top
+   EINA_LIST_REVERSE_FOREACH(restore_list, l, ec)
+     {
+        ELOGF("POL_DESK", "Restore from iconified list...", ec);
+        e_client_iconified_type_set(ec, E_ICONIFIED_TYPE_NONE);
+        e_policy_wl_iconify_state_change_send(ec, 0);
+        e_client_uniconify(ec);
+     }
+   eina_list_free(restore_list);
+}
+
+static void
+_e_policy_desk_cb_client_iconified_list_remove(struct wl_listener *listener, void *data)
+{
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+   E_Client *ec;
+
+   pd = wl_container_of(listener, pd, client_iconified_list_remove);
+   desk = pd->desk;
+   ec = (E_Client *) data;
+
+   ELOGF("POL_DESK", "Remove from iconified list", NULL);
+   desk->iconified_list = eina_list_remove(desk->iconified_list, ec);
+}
+
+static void
+_e_policy_desk_cb_client_iconified_list_remove_all(struct wl_listener *listener, void *data)
+{
+   E_Policy_Desk *pd;
+   E_Desk *desk;
+
+   pd = wl_container_of(listener, pd, client_iconified_list_remove_all);
+   desk = pd->desk;
+
+   ELOGF("POL_DESK", "Remove iconified list all", NULL);
+   eina_list_free(desk->iconified_list);
+   desk->iconified_list = NULL;
+}
+
+static void
+_e_policy_desk_cb_client_destroy(struct wl_listener *listener, void *data)
+{
+   E_Policy_Desk_Private_Client *desk_client;
+   E_Desk *desk;
+   E_Client *ec;
+
+   desk_client = wl_container_of(listener, desk_client, client_destroy);
+   desk = desk_client->desk;
+   ec = desk_client->ec;
+
+   ELOGF("POL_DESK", "CLIENT DESTROY. desk:%p", ec, desk);
+
+   _e_policy_desk_private_client_del(desk_client);
+}
+
+static void
+_e_policy_desk_cb_client_activate_done(struct wl_listener *listener, void *data)
+{
+   E_Policy_Desk_Private_Client *desk_client;
+   E_Desk *desk;
+   E_Client *ec;
+
+   desk_client = wl_container_of(listener, desk_client, client_activate_done);
+   desk = desk_client->desk;
+   ec = desk_client->ec;
+
+   ELOGF("POL_DESK", "CLIENT ACTIVATE DONE. desk:%p", ec, desk);
+
+   if ((!ec->iconic) && (!ec->sticky))
+     {
+        e_desk_show(desk);
+     }
+
+   if (!e_client_desk_iconify_skip_get(ec))
+     {
+        e_desk_visible_client_iconified_list_remove_all(desk);
+     }
+}
+
+EINTERN void
+e_policy_desk_add(E_Desk *desk)
+{
+   E_Policy_Desk *pd;
+   E_Client *ec;
+   E_Policy_Client *pc;
+
+   E_Zone *zone;
+   Eina_List *l;
+   E_Config_Desktop_Name *cfname;
+   char name[40];
+   int ok = 0;
+
+   pd = eina_hash_find(hash_policy_desks, &desk);
+   if (pd) return;
+
+   zone = desk->zone;
+
+   /* init smart object */
+   _e_policy_desk_smart_init(desk);
+
+   /* Get current desktop's name */
+   EINA_LIST_FOREACH(e_config->desktop_names, l, cfname)
+     {
+        if ((cfname->zone >= 0) &&
+            ((int)zone->num != cfname->zone)) continue;
+        if ((cfname->desk_x != desk->x) || (cfname->desk_y != desk->y))
+          continue;
+        desk->name = eina_stringshare_ref(cfname->name);
+        ok = 1;
+        break;
+     }
+
+   if (!ok)
+     {
+        snprintf(name, sizeof(name), _(e_config->desktop_default_name), desk->x, desk->y);
+        desk->name = eina_stringshare_add(name);
+     }
+
+   // new a base e_desk_area
+   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);
+   if (!desk->desk_area.base)
+     {
+        e_object_del(E_OBJECT(desk));
+        return;
+     }
+
+   pd = E_NEW(E_Policy_Desk, 1);
+   if (!pd) return;
+
+   ELOGF("POL_DESK", "Policy desk NEW. desk:%p, policy desk:%p", NULL, desk, pd);
+
+   pd->desk = desk;
+   pd->zone = desk->zone;
+
+   eina_hash_add(hash_policy_desks, &desk, pd);
+
+   /* add clients */
+   E_CLIENT_FOREACH(ec)
+     {
+        if (e_desk_has_ec(pd->desk, ec))
+          {
+             pc = e_policy_client_get(ec);
+             e_policy_client_maximize_policy_apply(pc);
+          }
+     }
+
+   //pd->desk_new.notify = _e_policy_desk_cb_desk_new;
+   //e_desk_desk_new_listener_add(pd->desk, &pd->desk_new);
+   pd->desk_free.notify = _e_policy_desk_cb_desk_free;
+   e_desk_desk_free_listener_add(pd->desk, &pd->desk_free);
+   pd->top_visible_get.notify = _e_policy_desk_cb_top_visible_get;
+   e_desk_top_visible_get_listener_add(pd->desk, &pd->top_visible_get);
+   pd->name_set.notify = _e_policy_desk_cb_name_set;
+   e_desk_name_set_listener_add(pd->desk, &pd->name_set);
+   pd->name_add.notify = _e_policy_desk_cb_name_add;
+   e_desk_name_add_listener_add(pd->desk, &pd->name_add);
+   pd->name_del.notify = _e_policy_desk_cb_name_del;
+   e_desk_name_del_listener_add(pd->desk, &pd->name_del);
+   pd->name_update.notify = _e_policy_desk_cb_name_update;
+   e_desk_name_update_listener_add(pd->desk, &pd->name_update);
+   pd->desk_show.notify = _e_policy_desk_cb_desk_show;
+   e_desk_desk_show_listener_add(pd->desk, &pd->desk_show);
+   pd->desk_deskshow.notify = _e_policy_desk_cb_desk_deskshow;
+   e_desk_desk_deskshow_listener_add(pd->desk, &pd->desk_deskshow);
+   pd->desk_client_add.notify = _e_policy_desk_cb_desk_client_add;
+   e_desk_client_add_listener_add(pd->desk, &pd->desk_client_add);
+   pd->desk_client_del.notify = _e_policy_desk_cb_desk_client_del;
+   e_desk_client_del_listener_add(pd->desk, &pd->desk_client_del);
+   pd->geometry_set.notify = _e_policy_desk_cb_desk_geometry_set;
+   e_desk_geometry_set_listener_add(pd->desk, &pd->geometry_set);
+   pd->zoom_set.notify = _e_policy_desk_cb_desk_zoom_set;
+   e_desk_zoom_set_listener_add(pd->desk, &pd->zoom_set);
+   pd->zoom_get.notify = _e_policy_desk_cb_desk_zoom_get;
+   e_desk_zoom_get_listener_add(pd->desk, &pd->zoom_get);
+   pd->zoom_get_center_coordinate.notify = _e_policy_desk_cb_desk_zoom_get_center_coordinate;
+   e_desk_zoom_get_center_coordinate_listener_add(pd->desk, &pd->zoom_get_center_coordinate);
+   pd->zoom_unset.notify = _e_policy_desk_cb_desk_zoom_unset;
+   e_desk_zoom_unset_listener_add(pd->desk, &pd->zoom_unset);
+   pd->smart_member_add.notify = _e_policy_desk_cb_smart_member_add;
+   e_desk_smart_member_add_listener_add(pd->desk, &pd->smart_member_add);
+   pd->smart_member_del.notify = _e_policy_desk_cb_smart_member_del;
+   e_desk_smart_member_del_listener_add(pd->desk, &pd->smart_member_del);
+   pd->client_zoom_skip_set.notify = _e_policy_desk_cb_client_zoom_skip_set;
+   e_desk_client_zoom_skip_set_listener_add(pd->desk, &pd->client_zoom_skip_set);
+   pd->client_zoom_skip_unset.notify = _e_policy_desk_cb_client_zoom_skip_unset;
+   e_desk_client_zoom_skip_unset_listener_add(pd->desk, &pd->client_zoom_skip_unset);
+   pd->client_zoom_apply.notify = _e_policy_desk_cb_client_zoom_apply;
+   e_desk_client_zoom_apply_listener_add(pd->desk, &pd->client_zoom_apply);
+   pd->zoom_is_animating.notify = _e_policy_desk_cb_zoom_is_animating;
+   e_desk_zoom_is_animating_listener_add(pd->desk, &pd->zoom_is_animating);
+   pd->visible_client_iconify_all.notify = _e_policy_desk_cb_visible_client_iconify_all;
+   e_desk_visible_client_iconify_all_listener_add(pd->desk, &pd->visible_client_iconify_all);
+   pd->visible_client_restore_all.notify = _e_policy_desk_cb_visible_client_restore_all;
+   e_desk_visible_client_restore_all_listener_add(pd->desk, &pd->visible_client_restore_all);
+   pd->client_iconified_list_remove.notify = _e_policy_desk_cb_client_iconified_list_remove;
+   e_desk_client_iconified_list_remove_listener_add(pd->desk, &pd->client_iconified_list_remove);
+   pd->client_iconified_list_remove_all.notify = _e_policy_desk_cb_client_iconified_list_remove_all;
+   e_desk_client_iconified_list_remove_all_listener_add(pd->desk, &pd->client_iconified_list_remove_all);
+}
+
+EINTERN void
+e_policy_desk_del(E_Policy_Desk *pd)
+{
+   E_Policy_Client *pc;
+   E_Client *ec;
+   E_Policy_Softkey *softkey;
+
+   /* hide and delete softkey */
+   if (e_config->use_softkey)
+     {
+        softkey = e_policy_softkey_get(pd->zone);
+        if (e_desk_current_get(pd->zone) == pd->desk)
+          e_policy_softkey_hide(softkey);
+     }
+
+   /* remove clients */
+   E_CLIENT_FOREACH(ec)
+     {
+        pc = e_policy_client_get(ec);
+        if (pc)
+          {
+             if (e_desk_has_ec(pd->desk, ec))
+               {
+                  e_policy_client_maximize_policy_cancel(pc);
+               }
+          }
+     }
+
+   eina_hash_del_by_key(hash_policy_desks, &pd->desk);
+}
+
+EINTERN E_Policy_Desk *
+e_policy_desk_get(E_Desk *desk)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(desk, NULL);
+
+   return eina_hash_find(hash_policy_desks, &desk);
+}
+
+EINTERN void
+e_policy_desk_init(void)
+{
+   hash_policy_desks = eina_hash_pointer_new(_e_policy_desk_cb_desk_data_free);
+}
+
+EINTERN void
+e_policy_desk_shutdown(void)
+{
+   E_FREE_FUNC(hash_policy_desks, eina_hash_free);
+}
 
 #endif
 
index 956d385b3d534e467e1fcc57d477f3fc1f0f012f..48e1551e800e11f9138014ff11929d7ea6d568b9 100644 (file)
@@ -4,14 +4,20 @@
 #include "e_intern.h"
 #include "e_desk_intern.h"
 
+#ifdef CONTAINER_POLICY
+#define E_POLICY_DESK_SMART_OBJ_TYPE "E_Desk_Smart_Object"
+#endif
+
 typedef struct _E_Policy_Desk E_Policy_Desk;
 
 #ifdef CONTAINER_POLICY
-struct _E_Policy_Desk
-{
-   E_Desk          *desk;
-   E_Zone          *zone;
-};
+
+EINTERN void           e_policy_desk_add(E_Desk *desk);
+EINTERN void           e_policy_desk_del(E_Policy_Desk *pd);
+EINTERN E_Policy_Desk *e_policy_desk_get(E_Desk *desk);
+EINTERN void           e_policy_desk_init(void);
+EINTERN void           e_policy_desk_shutdown(void);
+
 #endif
 
 #endif
index fcd57f73d4d81a030639826a0f402b88a4929d7a..95cca29059969addf3106ff49700005e11f560a0 100644 (file)
@@ -125,10 +125,16 @@ EINTERN void      e_policy_user_geometry_set(E_Client *ec, E_Policy_Allow_User_G
 EINTERN void      e_policy_deferred_job(void);
 EINTERN void      e_policy_animatable_lock(E_Client *ec, E_Policy_Animatable_Lock animatable, Eina_Bool set);
 
+#ifdef CONTAINER_POLICY
+#else
 EINTERN void e_policy_desk_add(E_Desk *desk);
 EINTERN void e_policy_desk_del(E_Policy_Desk *pd);
+#endif
 
 EINTERN E_Policy_Client *e_policy_client_add(E_Client *ec);
+#ifdef CONTAINER_POLICY
+EINTERN E_Policy_Client *e_policy_client_get(E_Client *ec);
+#endif
 EINTERN Eina_Bool        e_policy_client_is_conformant(E_Client *ec);
 EINTERN Eina_Bool        e_policy_client_is_volume_tv(E_Client *ec);
 EINTERN Eina_Bool        e_policy_client_is_noti(E_Client *ec);
@@ -147,6 +153,10 @@ EINTERN void             e_policy_client_uniconify_by_visibility(E_Client *ec);
 EINTERN void             e_policy_client_iconic_state_change_send(E_Client *ec, int iconic);
 EINTERN void             e_policy_client_unmap(E_Client *ec);
 EINTERN Eina_Bool        e_policy_client_maximize(E_Client *ec);
+#ifdef CONTAINER_POLICY
+EINTERN Eina_Bool        e_policy_client_maximize_policy_apply(E_Policy_Client *pc);
+EINTERN void             e_policy_client_maximize_policy_cancel(E_Policy_Client *pc);
+#endif
 EINTERN E_Policy_Client *e_policy_client_launcher_get(E_Zone *zone);
 EINTERN void             e_policy_client_buffer_flush_cancel(E_Client *ec);
 
index 88fd196261d0179647f9428607e0dbc2836c7999..7216b4301a389074edeb162cf0e45dd7759ebc38 100644 (file)
@@ -44,6 +44,16 @@ struct _E_Policy_Zone
    struct wl_listener bg_mouse_down;
    struct wl_listener bg_mouse_up;
    struct wl_listener focus_focused_ec_changed;
+   struct wl_listener desk_row_add;
+   struct wl_listener desk_row_remove;
+   struct wl_listener desk_col_add;
+   struct wl_listener desk_col_remove;
+   struct wl_listener desk_current_get;
+   struct wl_listener desk_at_xy_get;
+   struct wl_listener desk_at_pos_get;
+   struct wl_listener desk_next;
+   struct wl_listener desk_prev;
+   struct wl_listener desk_count;
 
    struct
      {
@@ -1008,6 +1018,206 @@ _e_policy_zone_cb_client_add(struct wl_listener *listener, void *data)
    return;
 }
 
+
+static void
+_e_policy_zone_cb_desk_row_add(struct wl_listener *listener, void *data)
+{
+   E_Desk_Data_Desk_Control *desk_control_data;
+   E_Policy_Zone *policy_zone;
+   E_Zone *zone;
+
+   policy_zone = wl_container_of(listener, policy_zone, desk_row_add);
+   desk_control_data = (E_Desk_Data_Desk_Control *) data;
+   zone = desk_control_data->zone;
+
+   e_zone_desk_count_set(zone, zone->desk_x_count, zone->desk_y_count + 1);
+}
+
+static void
+_e_policy_zone_cb_desk_row_remove(struct wl_listener *listener, void *data)
+{
+   E_Desk_Data_Desk_Control *desk_control_data;
+   E_Policy_Zone *policy_zone;
+   E_Zone *zone;
+
+   policy_zone = wl_container_of(listener, policy_zone, desk_row_remove);
+   desk_control_data = (E_Desk_Data_Desk_Control *) data;
+   zone = desk_control_data->zone;
+
+   e_zone_desk_count_set(zone, zone->desk_x_count, zone->desk_y_count - 1);
+}
+
+static void
+_e_policy_zone_cb_desk_col_add(struct wl_listener *listener, void *data)
+{
+   E_Desk_Data_Desk_Control *desk_control_data;
+   E_Policy_Zone *policy_zone;
+   E_Zone *zone;
+
+   policy_zone = wl_container_of(listener, policy_zone, desk_col_add);
+   desk_control_data = (E_Desk_Data_Desk_Control *) data;
+   zone = desk_control_data->zone;
+
+   e_zone_desk_count_set(zone, zone->desk_x_count + 1, zone->desk_y_count);
+}
+
+static void
+_e_policy_zone_cb_desk_col_remove(struct wl_listener *listener, void *data)
+{
+   E_Desk_Data_Desk_Control *desk_control_data;
+   E_Policy_Zone *policy_zone;
+   E_Zone *zone;
+
+   policy_zone = wl_container_of(listener, policy_zone, desk_col_remove);
+   desk_control_data = (E_Desk_Data_Desk_Control *) data;
+   zone = desk_control_data->zone;
+
+   e_zone_desk_count_set(zone, zone->desk_x_count - 1, zone->desk_y_count);
+}
+
+static void
+_e_policy_zone_cb_desk_current_get(struct wl_listener *listener, void *data)
+{
+   E_Zone_Data_Desk_Get *desk_get_data;
+   E_Policy_Zone *policy_zone;
+   E_Zone *zone;
+
+   policy_zone = wl_container_of(listener, policy_zone, desk_current_get);
+   desk_get_data = (E_Zone_Data_Desk_Get *) data;
+   zone = desk_get_data->zone;
+
+   desk_get_data->desk = e_desk_at_xy_get(zone, zone->desk_x_current, zone->desk_y_current);
+}
+
+static void
+_e_policy_zone_cb_desk_at_xy_get(struct wl_listener *listener, void *data)
+{
+   E_Zone_Data_Desk_Get *desk_get_data;
+   E_Policy_Zone *policy_zone;
+   E_Zone *zone;
+   int x, y;
+
+   policy_zone = wl_container_of(listener, policy_zone, desk_at_xy_get);
+   desk_get_data = (E_Zone_Data_Desk_Get *) data;
+   zone = desk_get_data->zone;
+   x = desk_get_data->x;
+   y = desk_get_data->y;
+
+   if ((x >= zone->desk_x_count) || (y >= zone->desk_y_count))
+     {
+        desk_get_data->desk = NULL;
+        return;
+     }
+   else if ((x < 0) || (y < 0))
+     {
+        desk_get_data->desk = NULL;
+        return;
+     }
+
+   if (!zone->desks)
+     {
+        desk_get_data->desk = NULL;
+        return;
+     }
+
+   desk_get_data->desk = zone->desks[x + (y * zone->desk_x_count)];
+}
+
+static void
+_e_policy_zone_cb_desk_at_pos_get(struct wl_listener *listener, void *data)
+{
+   E_Zone_Data_Desk_Get *desk_get_data;
+   E_Policy_Zone *policy_zone;
+   E_Zone *zone;
+   int x, y, pos;
+
+   policy_zone = wl_container_of(listener, policy_zone, desk_at_pos_get);
+   desk_get_data = (E_Zone_Data_Desk_Get *) data;
+   zone = desk_get_data->zone;
+   pos = desk_get_data->pos;
+
+   y = pos / zone->desk_x_count;
+   x = pos - (y * zone->desk_x_count);
+
+   if ((x >= zone->desk_x_count) || (y >= zone->desk_y_count))
+     {
+        desk_get_data->desk = NULL;
+        return;
+     }
+
+   desk_get_data->desk = zone->desks[x + (y * zone->desk_x_count)];
+}
+
+static void
+_e_policy_zone_cb_desk_next(struct wl_listener *listener, void *data)
+{
+   E_Policy_Zone *policy_zone;
+   E_Zone *zone;
+   int x, y;
+
+   policy_zone = wl_container_of(listener, policy_zone, desk_next);
+   zone = policy_zone->zone;
+
+   if ((zone->desk_x_count < 2) && (zone->desk_y_count < 2))
+     return;
+
+   x = zone->desk_x_current;
+   y = zone->desk_y_current;
+
+   x++;
+   if (x >= zone->desk_x_count)
+     {
+        x = 0;
+        y++;
+        if (y >= zone->desk_y_count) y = 0;
+     }
+
+   e_desk_show(e_desk_at_xy_get(zone, x, y));
+}
+
+static void
+_e_policy_zone_cb_desk_prev(struct wl_listener *listener, void *data)
+{
+   E_Policy_Zone *policy_zone;
+   E_Zone *zone;
+   int x, y;
+
+   policy_zone = wl_container_of(listener, policy_zone, desk_prev);
+   zone = policy_zone->zone;
+
+   if ((zone->desk_x_count < 2) && (zone->desk_y_count < 2))
+     return;
+
+   x = zone->desk_x_current;
+   y = zone->desk_y_current;
+
+   x--;
+   if (x < 0)
+     {
+        x = zone->desk_x_count - 1;
+        y--;
+        if (y < 0) y = zone->desk_y_count - 1;
+     }
+   e_desk_show(e_desk_at_xy_get(zone, x, y));
+}
+
+static void
+_e_policy_zone_cb_desk_count(struct wl_listener *listener, void *data)
+{
+   E_Zone_Data_Desk_Count *count_data;
+   E_Policy_Zone *policy_zone;
+   E_Zone *zone;
+   int cx, cy;
+
+   policy_zone = wl_container_of(listener, policy_zone, desk_count);
+   count_data = data;
+   zone = policy_zone->zone;
+
+   e_zone_desk_count_get(zone, &cx, &cy);
+   count_data->count = cx * cy;
+}
+
+
 #ifdef EC_IS_NOT_VISIBLE
 # undef EC_IS_NOT_VISIBLE
 #endif
@@ -1428,10 +1638,16 @@ e_policy_zone_new(E_Zone *zone)
                                            zone->desks[i]->x,
                                            zone->desks[i]->y);
              if (d)
-               e_policy_desk_add(zone->desks[i]);
+               {
+                  e_policy_desk_add(zone->desks[i]);
+                  e_desk_show(zone->desks[i]);
+               }
           }
         else
-          e_policy_desk_add(zone->desks[i]);
+          {
+             e_policy_desk_add(zone->desks[i]);
+             e_desk_show(zone->desks[i]);
+          }
      }
 
    // TODO: adjust each focus poicy to each zone.
@@ -1482,6 +1698,27 @@ e_policy_zone_new(E_Zone *zone)
    policy_zone->bg_mouse_up.notify = _e_policy_zone_cb_bg_mouse_up;
    e_zone_bg_mouse_up_listener_add(zone, &policy_zone->bg_mouse_up);
 
+   policy_zone->desk_row_add.notify = _e_policy_zone_cb_desk_row_add;
+   e_zone_desk_row_add_listener_add(policy_zone->zone, &policy_zone->desk_row_add);
+   policy_zone->desk_row_remove.notify = _e_policy_zone_cb_desk_row_remove;
+   e_zone_desk_row_remove_listener_add(policy_zone->zone, &policy_zone->desk_row_remove);
+   policy_zone->desk_col_add.notify = _e_policy_zone_cb_desk_col_add;
+   e_zone_desk_col_add_listener_add(policy_zone->zone, &policy_zone->desk_col_add);
+   policy_zone->desk_col_remove.notify = _e_policy_zone_cb_desk_col_remove;
+   e_zone_desk_col_remove_listener_add(policy_zone->zone, &policy_zone->desk_col_remove);
+   policy_zone->desk_current_get.notify = _e_policy_zone_cb_desk_current_get;
+   e_zone_desk_current_get_listener_add(policy_zone->zone, &policy_zone->desk_current_get);
+   policy_zone->desk_at_xy_get.notify = _e_policy_zone_cb_desk_at_xy_get;
+   e_zone_desk_at_xy_get_listener_add(policy_zone->zone, &policy_zone->desk_at_xy_get);
+   policy_zone->desk_at_pos_get.notify = _e_policy_zone_cb_desk_at_pos_get;
+   e_zone_desk_at_pos_get_listener_add(policy_zone->zone, &policy_zone->desk_at_pos_get);
+   policy_zone->desk_next.notify = _e_policy_zone_cb_desk_next;
+   e_zone_desk_next_listener_add(policy_zone->zone, &policy_zone->desk_next);
+   policy_zone->desk_prev.notify = _e_policy_zone_cb_desk_prev;
+   e_zone_desk_prev_listener_add(policy_zone->zone, &policy_zone->desk_prev);
+   policy_zone->desk_count.notify = _e_policy_zone_cb_desk_count;
+   e_zone_desk_count_listener_add(policy_zone->zone, &policy_zone->desk_count);
+
    policy_zone->focus_focused_ec_changed.notify = _policy_zone_cb_focus_focused_ec_changed;
    e_focus_focused_ec_changed_listener_add(zone->focus, &policy_zone->focus_focused_ec_changed);
 
index 9f921ecaad858128ea41c069c51967da64955657..a2b1ee72826f69fcf94c24aa61f4a02a5b5de035 100644 (file)
@@ -6,7 +6,10 @@
 #include <e_client.h>
 
 #define E_DESK_TYPE 0xE0b01005
+#ifdef CONTAINER_POLICY
+#else
 #define E_DESK_SMART_OBJ_TYPE "E_Desk_Smart_Object"
+#endif
 #define E_DESK_AREA_LAYER_COUNT 9
 
 typedef struct _E_Desk_Hook E_Desk_Hook;