add e_desk_group draft 94/227594/4 submit/tizen/20200313.050725
authorDoyoun Kang <doyoun.kang@samsung.com>
Fri, 13 Mar 2020 04:18:31 +0000 (13:18 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Fri, 13 Mar 2020 04:32:51 +0000 (13:32 +0900)
Change-Id: I2bf91bba2c7874b4434afdd0d97ce686c909168d

src/bin/Makefile.mk
src/bin/e_client.c
src/bin/e_client.h
src/bin/e_config.c
src/bin/e_config.h
src/bin/e_desk.c
src/bin/e_desk.h
src/bin/e_desk_group.c [new file with mode: 0644]
src/bin/e_desk_group.h [new file with mode: 0644]
src/bin/e_includes.h

index ad636c0..a5a2b79 100644 (file)
@@ -38,6 +38,7 @@ src/bin/e_config_data.h \
 src/bin/e_config.h \
 src/bin/e_dbusmenu.h \
 src/bin/e_desk.h \
+src/bin/e_desk_group.h \
 src/bin/e_dialog.h \
 src/bin/e_dnd.h \
 src/bin/e_dpms.h \
@@ -161,6 +162,7 @@ src/bin/e_config.c \
 src/bin/e_config_data.c \
 src/bin/e_dbusmenu.c \
 src/bin/e_desk.c \
+src/bin/e_desk_group.c \
 src/bin/e_dialog.c \
 src/bin/e_dpms.c \
 src/bin/e_dnd.c \
index 46e35dc..b7cc9fd 100644 (file)
@@ -1329,6 +1329,7 @@ _e_client_del(E_Client *ec)
      }
 
    ec->transform_core.result.enable = EINA_FALSE;
+   e_client_desk_group_set(ec, NULL);
 
    e_client_visibility_calculate();
 }
@@ -4480,6 +4481,16 @@ e_client_desk_set(E_Client *ec, E_Desk *desk)
 
    _e_client_hook_call(E_CLIENT_HOOK_DESK_SET, ec);
    evas_object_smart_callback_call(ec->frame, "desk_change", ec);
+
+   if (ec->desk->desk_group.enable)
+     {
+        if (!ec->desk_group.desk_group)
+          {
+             E_Desk_Group *edg;
+             edg = e_desk_desk_group_base_get(ec->desk);
+             e_client_desk_group_set(ec, edg);
+          }
+     }
 }
 
 E_API Eina_Bool
@@ -7800,10 +7811,71 @@ e_client_layer_set(E_Client *ec,
    return EINA_TRUE;
 }
 
+EINTERN Eina_Bool
+e_client_desk_group_layer_set(E_Client *ec, E_Desk_Group_Layer layer)
+{
+   E_OBJECT_CHECK_RETURN(ec, EINA_FALSE);
+   E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, EINA_FALSE);
+
+   ec->desk_group.layer = layer;
+   return EINA_TRUE;
+}
+
+EINTERN E_Desk_Group_Layer
+e_client_desk_group_layer_get(E_Client *ec)
+{
+   E_OBJECT_CHECK_RETURN(ec, E_DESK_GROUP_LAYER_BACKGROUND);
+
+   return ec->desk_group.layer;
+}
+
+EINTERN Eina_Bool
+e_client_desk_group_enable_set(E_Client *ec, Eina_Bool enable)
+{
+   E_OBJECT_CHECK_RETURN(ec, EINA_FALSE);
+   E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, EINA_FALSE);
+
+   ec->desk_group.enable = enable;
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_client_desk_group_set(E_Client *ec, E_Desk_Group *edg)
+{
+   E_Desk_Group *old_edg;
+
+   if (!ec) return EINA_FALSE;
+
+   if (ec->desk_group.desk_group == edg)
+     return EINA_TRUE;
+
+   old_edg = ec->desk_group.desk_group;
+   if (old_edg)
+     e_desk_group_ec_remove(old_edg, ec);
+
+   ec->desk_group.desk_group = edg;
+   e_desk_group_ec_add(edg, ec);
+
+   return EINA_TRUE;
+}
+
 E_API void
 e_client_raise(E_Client *ec)
 {
    if (!ec) return;
+
+   if (ec->desk_group.enable)
+     {
+        E_Desk_Group *edg;
+        edg = ec->desk_group.desk_group;
+        if (edg)
+          {
+             e_desk_group_ec_raise(edg, ec);
+             return;
+          }
+     }
+
    evas_object_raise(ec->frame);
 }
 
@@ -7811,6 +7883,18 @@ E_API void
 e_client_lower(E_Client *ec)
 {
    if (!ec) return;
+
+   if (ec->desk_group.enable)
+     {
+        E_Desk_Group *edg;
+        edg = ec->desk_group.desk_group;
+        if (edg)
+          {
+             e_desk_group_ec_lower(edg, ec);
+             return;
+          }
+     }
+
    evas_object_lower(ec->frame);
 }
 
index b3a07c4..2ba8e71 100644 (file)
@@ -998,6 +998,14 @@ struct E_Client
    } base_output_resolution;
 
    Eina_Bool hwc_visible_skip : 1;
+
+   struct
+   {
+      Eina_Bool     enable;
+      E_Desk_Group *desk_group;
+      int           layer;
+      int           layer_backup;
+   } desk_group;
 };
 
 #define e_client_focus_policy_click(ec) \
@@ -1209,6 +1217,13 @@ EINTERN Eina_Bool e_client_pending_geometry_has(E_Client *ec);
 E_API void e_client_frame_focus_set(E_Client *ec, Eina_Bool focus);
 
 E_API Eina_Bool e_client_layer_set(E_Client *ec, E_Layer layer);
+
+EINTERN Eina_Bool e_client_desk_group_layer_set(E_Client *ec, E_Desk_Group_Layer layer);
+EINTERN E_Desk_Group_Layer e_client_desk_group_layer_get(E_Client *ec);
+EINTERN Eina_Bool e_client_desk_group_enable_set(E_Client *ec, Eina_Bool enable);
+
+E_API Eina_Bool e_client_desk_group_set(E_Client *ec, E_Desk_Group *edg);
+
 E_API void      e_client_raise(E_Client *ec);
 E_API void      e_client_lower(E_Client *ec);
 
index 3892fe7..9bd435b 100644 (file)
@@ -303,6 +303,7 @@ _e_config_edd_init(Eina_Bool old)
    E_CONFIG_VAL(D, T, configured_output_resolution.h, INT);
    E_CONFIG_VAL(D, T, global_object_not_provide.launch_effect, UCHAR);
    E_CONFIG_VAL(D, T, use_thread_max_cpu, UCHAR);
+   E_CONFIG_VAL(D, T, use_desk_group, UCHAR);
 }
 
 static Eina_Bool
@@ -539,6 +540,7 @@ e_config_load(void)
    E_CONFIG_LIMIT(e_config->configured_output_resolution.use, 0, 1);
    E_CONFIG_LIMIT(e_config->global_object_not_provide.launch_effect, 0, 1);
    E_CONFIG_LIMIT(e_config->use_thread_max_cpu, 0, 1);
+   E_CONFIG_LIMIT(e_config->use_desk_group, 0, 1);
 }
 
 E_API int
index b955b25..e93fc09 100644 (file)
@@ -253,6 +253,7 @@ struct _E_Config
    } global_object_not_provide;
 
    Eina_Bool use_thread_max_cpu; //set cpu count to ecore thread max
+   Eina_Bool use_desk_group;
 };
 
 struct _E_Config_Desklock_Background
index 70dbbe0..f1f1827 100644 (file)
@@ -177,6 +177,13 @@ e_desk_new(E_Zone *zone, int x, int y)
 
    if (!ok)
      desk->window_profile = eina_stringshare_ref(e_config->desktop_default_window_profile);
+
+   if (e_config->use_desk_group)
+     {
+        // Add a base e_desk_group
+        desk->desk_group.base = e_desk_desk_group_add(desk, desk->geom.x, desk->geom.y, desk->geom.w, desk->geom.h, E_DESK_GROUP_LAYER_NORMAL);
+     }
+
    return desk;
 }
 
@@ -1199,6 +1206,21 @@ e_desk_client_zoom_apply(E_Desk *desk, E_Client *ec)
 static void
 _e_desk_free(E_Desk *desk)
 {
+   Eina_List *l;
+   E_Desk_Group *edg;
+
+   if (e_config->use_desk_group)
+     {
+        EINA_LIST_FOREACH(desk->desk_group.list, l, edg)
+          {
+             e_desk_group_del(edg);
+          }
+        eina_list_free(desk->desk_group.list);
+        desk->desk_group.list = NULL;
+        desk->desk_group.base = NULL;
+        desk->desk_group.active = NULL;
+     }
+
    E_FREE_FUNC(desk->smart_obj, evas_object_del);
    eina_stringshare_del(desk->name);
    desk->name = NULL;
@@ -1563,3 +1585,160 @@ _e_desk_client_zoom(E_Client *ec, double zoomx, double zoomy, Evas_Coord cx, Eva
         e_comp_object_render(ec->frame);
      }
 }
+
+E_API E_Desk_Group *
+e_desk_desk_group_add(E_Desk *desk, int x, int y, int w, int h, E_Desk_Group_Layer layer)
+{
+   E_Desk_Group *edg;
+   int id;
+
+   if (!e_config->use_desk_group) return NULL;
+
+   E_OBJECT_CHECK_RETURN(desk, NULL);
+   E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, NULL);
+
+   id = desk->desk_group.id;
+
+   edg = e_desk_group_new(desk, id, x, y, w, h, layer);
+   if (!edg)
+     {
+        return NULL;
+     }
+
+   desk->desk_group.list = eina_list_append(desk->desk_group.list, edg);
+   desk->desk_group.id++;
+
+   return edg;
+}
+
+E_API void
+e_desk_desk_group_del(E_Desk *desk, E_Desk_Group *edg)
+{
+   E_OBJECT_CHECK(desk);
+   E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
+
+   if (!e_config->use_desk_group) return;
+
+   if (!edg) return;
+
+   desk->desk_group.list = eina_list_remove(desk->desk_group.list, edg);
+}
+
+E_API E_Desk_Group *
+e_desk_desk_group_get_by_id(E_Desk *desk, int id)
+{
+   E_Desk_Group *edg = NULL;
+   Eina_List *l;
+
+   E_OBJECT_CHECK_RETURN(desk, NULL);
+   E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, NULL);
+
+   EINA_LIST_FOREACH(desk->desk_group.list, l, edg)
+     {
+        if (edg->id == id)
+          break;
+     }
+
+   return edg;
+}
+
+E_API E_Desk_Group *
+e_desk_desk_group_base_get(E_Desk *desk)
+{
+   E_OBJECT_CHECK_RETURN(desk, NULL);
+   E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, NULL);
+
+   if (!e_config->use_desk_group) return NULL;
+
+   return desk->desk_group.base;
+}
+
+E_API E_Desk_Group *
+e_desk_desk_group_active_get(E_Desk *desk)
+{
+   E_OBJECT_CHECK_RETURN(desk, NULL);
+   E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, NULL);
+
+   if (!e_config->use_desk_group) return NULL;
+
+   return desk->desk_group.active;
+}
+
+static void
+_e_desk_desk_group_check_ec_in_desk_group(E_Desk *desk)
+{
+   E_Client *ec;
+
+   E_CLIENT_FOREACH(ec)
+     {
+        if (ec->desk != desk) continue;
+        if (e_object_is_del(E_OBJECT(ec))) continue;
+        if (ec->desk_group.desk_group) continue;
+
+        e_client_desk_group_set(ec, desk->desk_group.base);
+     }
+}
+
+E_API Eina_Bool
+e_desk_desk_group_enable(E_Desk *desk)
+{
+   E_Desk_Group *edg = NULL;
+   Eina_List *l;
+
+   if (!e_config->use_desk_group) return EINA_FALSE;
+
+   E_OBJECT_CHECK_RETURN(desk, EINA_FALSE);
+   E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, EINA_FALSE);
+
+   ELOGF("EDG", "Enable Desk_Group...", NULL);
+   if (desk->desk_group.enable) return EINA_TRUE;
+   desk->desk_group.enable = EINA_TRUE;
+
+   // check all ec is included in desk group
+   _e_desk_desk_group_check_ec_in_desk_group(desk);
+
+   EINA_LIST_FOREACH(desk->desk_group.list, l, edg)
+     {
+        e_desk_group_enable_set(edg, EINA_TRUE);
+     }
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_desk_desk_group_disable(E_Desk *desk)
+{
+   E_Desk_Group *edg = NULL;
+   Eina_List *l;
+
+   if (!e_config->use_desk_group) return EINA_FALSE;
+
+   E_OBJECT_CHECK_RETURN(desk, EINA_FALSE);
+   E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, EINA_FALSE);
+
+   ELOGF("EDG", "Disable Desk_Group...", NULL);
+   if (!desk->desk_group.enable) return EINA_TRUE;
+   desk->desk_group.enable = EINA_FALSE;
+
+   EINA_LIST_FOREACH(desk->desk_group.list, l, edg)
+     {
+        e_desk_group_enable_set(edg, EINA_FALSE);
+     }
+
+   return EINA_TRUE;
+}
+
+EINTERN void
+e_desk_desk_group_info_print(E_Desk *desk)
+{
+   E_Desk_Group *edg = NULL;
+   Eina_List *l;
+
+   E_OBJECT_CHECK(desk);
+   E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
+
+   EINA_LIST_FOREACH(desk->desk_group.list, l, edg)
+     {
+        e_desk_group_info_print(edg);
+     }
+}
index f9a41f6..8dba59f 100644 (file)
@@ -48,6 +48,15 @@ struct _E_Desk
 
    unsigned int animate_count;
    Eina_List           *handlers;
+
+   struct
+   {
+      Eina_Bool         enable;
+      int               id;
+      Eina_List        *list;
+      E_Desk_Group     *base;
+      E_Desk_Group     *active;
+   } desk_group;
 };
 
 struct _E_Event_Desk
@@ -108,6 +117,16 @@ E_API Eina_Bool    e_desk_client_zoom_skip_unset(E_Desk *desk, E_Client *ec);
 
 EINTERN void       e_desk_client_zoom_apply(E_Desk *desk, E_Client *ec);
 
+E_API E_Desk_Group *e_desk_desk_group_add(E_Desk *desk, int x, int y, int w, int h, E_Desk_Group_Layer layer);
+E_API void          e_desk_desk_group_del(E_Desk *desk, E_Desk_Group *edg);
+E_API E_Desk_Group *e_desk_desk_group_get_by_id(E_Desk *desk, int id);
+E_API E_Desk_Group *e_desk_desk_group_base_get(E_Desk *desk);
+E_API E_Desk_Group *e_desk_desk_group_active_get(E_Desk *desk);
+E_API Eina_Bool     e_desk_desk_group_enable(E_Desk *desk);
+E_API Eina_Bool     e_desk_desk_group_disable(E_Desk *desk);
+EINTERN void        e_desk_desk_group_info_print(E_Desk *desk);
+
+
 extern E_API int E_EVENT_DESK_SHOW;
 extern E_API int E_EVENT_DESK_BEFORE_SHOW;
 extern E_API int E_EVENT_DESK_AFTER_SHOW;
diff --git a/src/bin/e_desk_group.c b/src/bin/e_desk_group.c
new file mode 100644 (file)
index 0000000..792fa34
--- /dev/null
@@ -0,0 +1,354 @@
+#include "e.h"
+
+EINTERN int
+e_desk_group_init(void)
+{
+   return 1;
+}
+
+EINTERN int
+e_desk_group_shutdown(void)
+{
+   return 1;
+}
+
+EINTERN E_Desk_Group *
+e_desk_group_new(E_Desk *desk, int id, int x, int y, int w, int h, E_Desk_Group_Layer layer)
+{
+   E_Desk_Group *edg;
+
+   E_OBJECT_CHECK_RETURN(desk, NULL);
+   E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, NULL);
+
+   edg = E_NEW(E_Desk_Group, 1);
+   if (!edg) return NULL;
+
+   edg->desk = desk;
+   edg->id = id;
+
+   edg->x = x;
+   edg->y = y;
+   edg->w = w;
+   edg->h = h;
+
+   edg->layer = layer;
+
+   return edg;
+}
+
+EINTERN void
+e_desk_group_del(E_Desk_Group *edg)
+{
+   if (!edg) return;
+
+   for (int i=0; i<E_DESK_GROUP_LAYER_COUNT; i++)
+     {
+        eina_list_free(edg->ec_lists[i]);
+     }
+
+   E_FREE(edg);
+}
+
+void _e_desk_group_enable(E_Desk_Group *edg)
+{
+   int i;
+   E_Client *ec;
+   Eina_List *l;
+
+   for (i=0; i<E_DESK_GROUP_LAYER_COUNT; i++)
+     {
+        EINA_LIST_FOREACH(edg->ec_lists[i], l, ec)
+          {
+             e_client_desk_group_enable_set(ec, EINA_TRUE);
+          }
+     }
+
+   e_desk_group_all_ec_update(edg);
+}
+
+void _e_desk_group_disable(E_Desk_Group *edg)
+{
+   int i;
+   E_Client *ec;
+   Eina_List *l;
+
+   for (i=0; i<E_DESK_GROUP_LAYER_COUNT; i++)
+     {
+        EINA_LIST_FOREACH(edg->ec_lists[i], l, ec)
+          {
+             e_client_desk_group_enable_set(ec, EINA_FALSE);
+          }
+     }
+}
+
+EINTERN Eina_Bool
+e_desk_group_enable_set(E_Desk_Group *edg, Eina_Bool enable)
+{
+   if (!edg) return EINA_FALSE;
+
+   edg->enable = enable;
+   if (enable)
+     {
+        _e_desk_group_enable(edg);
+     }
+   else
+     {
+        _e_desk_group_disable(edg);
+     }
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_desk_group_geometry_set(E_Desk_Group *edg, int x, int y, int w, int h)
+{
+   if (!edg) return EINA_FALSE;
+
+   edg->x = x;
+   edg->y = y;
+   edg->w = w;
+   edg->h = h;
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_desk_group_geometry_get(E_Desk_Group *edg, int *x, int *y, int *w, int *h)
+{
+   if (!edg) return EINA_FALSE;
+
+   if (x) *x = edg->x;
+   if (y) *y = edg->y;
+   if (w) *w = edg->w;
+   if (h) *h = edg->h;
+
+   return EINA_TRUE;
+}
+
+EINTERN Eina_Bool
+e_desk_group_layer_set(E_Desk_Group *edg, E_Desk_Group_Layer layer)
+{
+   if (!edg) return EINA_FALSE;
+
+   edg->layer = layer;
+   return EINA_TRUE;
+}
+
+E_API E_Desk_Group_Layer
+e_desk_group_layer_get(E_Desk_Group *edg)
+{
+   if (!edg) return E_DESK_GROUP_LAYER_NORMAL;
+
+   return edg->layer;
+}
+
+E_API void
+e_desk_group_activate(E_Desk_Group *edg)
+{
+   if (!edg) return;
+}
+
+E_API Eina_Bool
+e_desk_group_is_activate(E_Desk_Group *edg)
+{
+   if (!edg) return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
+E_API void
+e_desk_group_raise(E_Desk_Group *edg)
+{
+   int i;
+   E_Client *ec;
+   Eina_List *l;
+
+   if (!edg) return;
+
+   for (i=0; i<E_DESK_GROUP_LAYER_COUNT; i++)
+     {
+        EINA_LIST_FOREACH(edg->ec_lists[i], l, ec)
+          {
+             evas_object_raise(ec->frame);
+          }
+     }
+}
+
+E_API void
+e_desk_group_lower(E_Desk_Group *edg)
+{
+   int i;
+   E_Client *ec;
+   Eina_List *l;
+
+   if (!edg) return;
+
+   for (i=E_DESK_GROUP_LAYER_COUNT-1; i>=0; i--)
+     {
+        EINA_LIST_FOREACH(edg->ec_lists[i], l, ec)
+          {
+             evas_object_lower(ec->frame);
+          }
+     }
+}
+
+static unsigned int
+_e_desk_group_layer_map(E_Desk_Group_Layer layer)
+{
+   switch (layer)
+     {
+      case E_DESK_GROUP_LAYER_BACKGROUND: return 0;
+      case E_DESK_GROUP_LAYER_NORMAL_BELOW: return 1;
+      case E_DESK_GROUP_LAYER_NORMAL: return 2;
+      case E_DESK_GROUP_LAYER_NORMAL_ABOVE: return 3;
+      case E_DESK_GROUP_LAYER_NOTIFICATION_LOW: return 4;
+      case E_DESK_GROUP_LAYER_NOTIFICATION_NORMAL: return 5;
+      case E_DESK_GROUP_LAYER_NOTIFICATION_HIGH: return 6;
+      case E_DESK_GROUP_LAYER_NOTIFICATION_TOP: return 7;
+      case E_DESK_GROUP_LAYER_SYSTEM: return 7;
+      default: return 1;
+     }
+}
+
+static E_Desk_Group_Layer
+_e_desk_group_layer_convert_from_elayer(E_Layer elayer)
+{
+   E_Desk_Group_Layer edg_layer;
+
+   if (elayer < E_LAYER_CLIENT_BELOW)
+     edg_layer = E_DESK_GROUP_LAYER_BACKGROUND;
+   else if (elayer < E_LAYER_CLIENT_NORMAL)
+     edg_layer = E_DESK_GROUP_LAYER_NORMAL_BELOW;
+   else if (elayer < E_LAYER_CLIENT_ABOVE)
+     edg_layer = E_DESK_GROUP_LAYER_NORMAL;
+   else if (elayer < E_LAYER_CLIENT_NOTIFICATION_LOW)
+     edg_layer = E_DESK_GROUP_LAYER_NORMAL_ABOVE;
+   else if (elayer < E_LAYER_CLIENT_NOTIFICATION_NORMAL)
+     edg_layer = E_DESK_GROUP_LAYER_NOTIFICATION_LOW;
+   else if (elayer < E_LAYER_CLIENT_NOTIFICATION_HIGH)
+     edg_layer = E_DESK_GROUP_LAYER_NOTIFICATION_NORMAL;
+   else if (elayer < E_LAYER_CLIENT_NOTIFICATION_TOP)
+     edg_layer = E_DESK_GROUP_LAYER_NOTIFICATION_HIGH;
+   else if (elayer < E_LAYER_CLIENT_ALERT_LOW)
+     edg_layer = E_DESK_GROUP_LAYER_NOTIFICATION_TOP;
+   else
+     edg_layer = E_DESK_GROUP_LAYER_SYSTEM;
+
+   return edg_layer;
+}
+
+E_API Eina_Bool
+e_desk_group_ec_add(E_Desk_Group *edg, E_Client *ec)
+{
+   int edg_layer;
+   int index;
+
+   if (!edg) return EINA_FALSE;
+   if (!ec) return EINA_FALSE;
+
+   edg_layer = _e_desk_group_layer_convert_from_elayer(ec->layer);
+   index = _e_desk_group_layer_map(edg_layer);
+
+   edg->ec_lists[index] = eina_list_prepend(edg->ec_lists[index], ec);
+
+   e_client_desk_group_layer_set(ec, edg_layer);
+
+   return EINA_TRUE;
+}
+
+E_API void
+e_desk_group_ec_remove(E_Desk_Group *edg, E_Client *ec)
+{
+   int edg_layer;
+   int index;
+
+   if (!edg) return;
+   if (!ec) return;
+
+   edg_layer = e_client_desk_group_layer_get(ec);
+   index = _e_desk_group_layer_map(edg_layer);
+
+   edg->ec_lists[index] = eina_list_remove(edg->ec_lists[index], ec);
+}
+
+EINTERN void
+e_desk_group_ec_raise(E_Desk_Group *edg, E_Client *ec)
+{
+   if (!edg) return;
+   if (!ec) return;
+
+   evas_object_raise(ec->frame);
+
+   // update edg's ec_list order
+}
+
+EINTERN void
+e_desk_group_ec_lower(E_Desk_Group *edg, E_Client *ec)
+{
+   if (!edg) return;
+   if (!ec) return;
+
+   evas_object_lower(ec->frame);
+
+   // update edg's ec_list order
+}
+
+E_API void
+e_desk_group_ec_update(E_Desk_Group *edg, E_Client *ec)
+{
+   if (!edg) return;
+   if (!ec) return;
+
+   e_client_pos_set(ec, edg->x, edg->y);
+   e_client_size_set(ec, edg->w, edg->h);
+   ec->changes.pos = 1;
+}
+
+E_API void
+e_desk_group_all_ec_update(E_Desk_Group *edg)
+{
+   int i;
+   E_Client *ec;
+   Eina_List *l;
+
+   if (!edg) return;
+
+   for (i=0; i<E_DESK_GROUP_LAYER_COUNT; i++)
+     {
+        EINA_LIST_FOREACH(edg->ec_lists[i], l, ec)
+          {
+             e_desk_group_ec_update(edg, ec);
+          }
+     }
+}
+
+E_API Eina_List *
+e_desk_group_ec_list_get(E_Desk_Group *edg)
+{
+   if (!edg) return NULL;
+
+   return NULL;
+}
+
+
+// for debug
+EINTERN void
+e_desk_group_info_print(E_Desk_Group *edg)
+{
+   Eina_List *l;
+   E_Client *ec;
+
+   if (!edg) return;
+
+   ELOGF("EDG_INFO", "===========================================", NULL);
+   ELOGF("EDG_INFO", "E_Desk_Group(%p), ID(%d), Geo(%d,%d,%d,%d), Layer:%d", NULL, edg, edg->id, edg->x, edg->y, edg->w, edg->h, edg->layer);
+   ELOGF("EDG_INFO", "-------------------------------------------", NULL);
+   for (int i=E_DESK_GROUP_LAYER_COUNT-1; i>=0; i--)
+     {
+        EINA_LIST_FOREACH(edg->ec_lists[i], l, ec)
+          {
+             ELOGF("EDG_INFO", "EDG_Layer[%d] EC(win:%x, ec:%p), ec->layer:%d, org_layer:%d", NULL, i, e_client_util_win_get(ec), ec, ec->layer, ec->desk_group.layer_backup);
+          }
+     }
+   ELOGF("EDG_INFO", "===========================================", NULL);
+}
diff --git a/src/bin/e_desk_group.h b/src/bin/e_desk_group.h
new file mode 100644 (file)
index 0000000..1abfd54
--- /dev/null
@@ -0,0 +1,83 @@
+#ifdef E_TYPEDEFS
+
+typedef struct _E_Desk_Group E_Desk_Group;
+typedef struct _E_Event_Desk_Group E_Event_Desk_Group;
+
+typedef enum _E_Desk_Group_Layer
+{
+   E_DESK_GROUP_LAYER_BACKGROUND = 0,
+   E_DESK_GROUP_LAYER_NORMAL_BELOW = 150,
+   E_DESK_GROUP_LAYER_NORMAL = 200,
+   E_DESK_GROUP_LAYER_NORMAL_ABOVE = 250,
+   E_DESK_GROUP_LAYER_NOTIFICATION_LOW = 650,
+   E_DESK_GROUP_LAYER_NOTIFICATION_NORMAL = 700,
+   E_DESK_GROUP_LAYER_NOTIFICATION_HIGH = 750,
+   E_DESK_GROUP_LAYER_NOTIFICATION_TOP = 800,
+   E_DESK_GROUP_LAYER_SYSTEM = 990,
+} E_Desk_Group_Layer;
+
+# define E_DESK_GROUP_LAYER_COUNT 9
+
+#else
+#ifndef E_DESK_GROUP_H
+#define E_DESK_GROUP_H
+
+struct _E_Desk_Group
+{
+   E_Object             e_obj_inherit;
+
+   E_Desk              *desk;
+   int                  id;
+   E_Desk_Group_Layer   layer;
+   Eina_Stringshare    *name;
+
+   int                  x, y, w, h;
+
+   unsigned char        enable  : 1;
+   unsigned char        visible : 1;
+   Eina_List           *ec_lists[E_DESK_GROUP_LAYER_COUNT];
+
+   Eina_List           *handlers;
+};
+
+struct _E_Event_Desk_Group
+{
+   E_Desk_Group   *edg;
+};
+
+EINTERN int e_desk_group_init(void);
+EINTERN int e_desk_group_shutdown(void);
+
+EINTERN E_Desk_Group *e_desk_group_new(E_Desk *desk, int id, int x, int y, int w, int h, E_Desk_Group_Layer layer);
+EINTERN void          e_desk_group_del(E_Desk_Group *edg);
+
+EINTERN Eina_Bool     e_desk_group_enable_set(E_Desk_Group *edg, Eina_Bool enable);
+
+E_API   Eina_Bool     e_desk_group_geometry_set(E_Desk_Group *edg, int x, int y, int w, int h);
+E_API   Eina_Bool     e_desk_group_geometry_get(E_Desk_Group *edg, int *x, int *y, int *w, int *h);
+
+EINTERN Eina_Bool     e_desk_group_layer_set(E_Desk_Group *edg, E_Desk_Group_Layer layer);
+E_API   E_Desk_Group_Layer     e_desk_group_layer_get(E_Desk_Group *edg);
+
+E_API   void          e_desk_group_activate(E_Desk_Group *edg);
+E_API   Eina_Bool     e_desk_group_is_activate(E_Desk_Group *edg);
+
+E_API   void          e_desk_group_raise(E_Desk_Group *edg);
+E_API   void          e_desk_group_lower(E_Desk_Group *edg);
+
+
+E_API   Eina_Bool     e_desk_group_ec_add(E_Desk_Group *edg, E_Client *ec);
+E_API   void          e_desk_group_ec_remove(E_Desk_Group *edg, E_Client *ec);
+EINTERN void          e_desk_group_ec_raise(E_Desk_Group *edg, E_Client *ec);
+EINTERN void          e_desk_group_ec_lower(E_Desk_Group *edg, E_Client *ec);
+
+
+E_API   void          e_desk_group_ec_update(E_Desk_Group *edg, E_Client *ec);
+E_API   void          e_desk_group_all_ec_update(E_Desk_Group *edg);
+
+E_API   Eina_List    *e_desk_group_ec_list_get(E_Desk_Group *edg);
+
+// for debug
+EINTERN void          e_desk_group_info_print(E_Desk_Group *edg);
+#endif
+#endif
index 3e4cbc6..e969039 100644 (file)
@@ -4,6 +4,7 @@
 #include "e_error.h"
 #include "e_zone.h"
 #include "e_desk.h"
+#include "e_desk_group.h"
 #include "e_pixmap.h"
 #include "e_comp_object.h"
 #include "e_util_transform.h"