desk group: add functionality for activating desk group 82/236982/5 accepted/tizen/unified/20200625.110521 submit/tizen/20200625.043839
authorDoyoun Kang <doyoun.kang@samsung.com>
Wed, 24 Jun 2020 01:54:47 +0000 (10:54 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Wed, 24 Jun 2020 06:20:23 +0000 (06:20 +0000)
Change-Id: I20f01ec6b16a694db107557f660d3a86a158d362

src/bin/e_desk.c
src/bin/e_desk.h
src/bin/e_desk_group.c
src/bin/e_desk_group.h

index e195d3d..55ec7ee 100644 (file)
@@ -35,6 +35,7 @@ static Eina_Inlist *_e_desk_hooks[] =
 {
    [E_DESK_HOOK_DESK_GROUP_ENABLE] = NULL,
    [E_DESK_HOOK_DESK_GROUP_DISABLE] = NULL,
+   [E_DESK_HOOK_DESK_GROUP_ACTIVE_CHANGE] = NULL,
 };
 
 static void      _e_desk_free(E_Desk *desk);
@@ -1711,6 +1712,20 @@ e_desk_desk_group_base_get(E_Desk *desk)
    return desk->desk_group.base;
 }
 
+EINTERN void
+e_desk_desk_group_active_set(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 (desk->desk_group.active == edg) return;
+
+   desk->desk_group.active = edg;
+
+   _e_desk_hook_call(E_DESK_HOOK_DESK_GROUP_ACTIVE_CHANGE, desk);
+}
+
 E_API E_Desk_Group *
 e_desk_desk_group_active_get(E_Desk *desk)
 {
index 21245f9..92c239a 100644 (file)
@@ -41,6 +41,7 @@ typedef enum _E_Desk_Hook_Point
 {
    E_DESK_HOOK_DESK_GROUP_ENABLE,
    E_DESK_HOOK_DESK_GROUP_DISABLE,
+   E_DESK_HOOK_DESK_GROUP_ACTIVE_CHANGE,
    E_DESK_HOOK_LAST
 } E_Desk_Hook_Point;
 
@@ -155,6 +156,7 @@ E_API E_Desk_Group *e_desk_desk_group_add(E_Desk *desk, int x, int y, int w, int
 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);
+EINTERN void        e_desk_desk_group_active_set(E_Desk *desk, E_Desk_Group *edg);
 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);
index 86cbac4..737aa65 100644 (file)
@@ -95,6 +95,32 @@ _e_desk_geometry_info_set(E_Desk_Group *edg, int x, int y, int w, int h)
    edg->scale_h = (double)h / (double)desk->geom.h;
 }
 
+static void
+_e_desk_group_active_change(E_Desk_Group *edg, E_Desk *desk)
+{
+   E_Desk_Group *prev_active_edg;
+
+   if (!desk) return;
+
+   prev_active_edg = e_desk_desk_group_active_get(desk);
+   if (prev_active_edg == edg) return;
+
+   // 1. reset current active edg info
+   if (prev_active_edg)
+     prev_active_edg->active = EINA_FALSE;
+
+   // 2. set new active edg info
+   if (edg)
+     {
+        edg->active = EINA_TRUE;
+        e_desk_desk_group_active_set(desk, edg);
+     }
+   else
+     {
+        e_desk_desk_group_active_set(desk, NULL);
+     }
+}
+
 EINTERN int
 e_desk_group_init(void)
 {
@@ -138,6 +164,9 @@ e_desk_group_del(E_Desk_Group *edg)
         eina_list_free(edg->ec_lists[i]);
      }
 
+   if (edg->active)
+     _e_desk_group_active_change(NULL, edg->desk);
+
    E_FREE(edg);
 }
 
@@ -275,14 +304,17 @@ E_API void
 e_desk_group_activate(E_Desk_Group *edg)
 {
    if (!edg) return;
+   if (!edg->desk) return;
+
+   e_desk_group_raise(edg);
+   _e_desk_group_active_change(edg, edg->desk);
 }
 
 E_API Eina_Bool
 e_desk_group_is_activate(E_Desk_Group *edg)
 {
    if (!edg) return EINA_FALSE;
-
-   return EINA_TRUE;
+   return edg->active;
 }
 
 E_API void
index d89a4af..ce704c1 100644 (file)
@@ -35,6 +35,7 @@ struct _E_Desk_Group
 
    unsigned char        enable  : 1;
    unsigned char        visible : 1;
+   unsigned char        active  : 1;
    Eina_List           *ec_lists[E_DESK_GROUP_CLIENT_LAYER_MAX];
 
    Eina_List           *handlers;