From 15fd8a0484cb688011012c6cbc08c50157ae2ca7 Mon Sep 17 00:00:00 2001 From: Doyoun Kang Date: Wed, 24 Jun 2020 10:54:47 +0900 Subject: [PATCH] desk group: add functionality for activating desk group Change-Id: I20f01ec6b16a694db107557f660d3a86a158d362 --- src/bin/e_desk.c | 15 +++++++++++++++ src/bin/e_desk.h | 2 ++ src/bin/e_desk_group.c | 36 ++++++++++++++++++++++++++++++++++-- src/bin/e_desk_group.h | 1 + 4 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/bin/e_desk.c b/src/bin/e_desk.c index e195d3d2f1..55ec7ee797 100644 --- a/src/bin/e_desk.c +++ b/src/bin/e_desk.c @@ -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) { diff --git a/src/bin/e_desk.h b/src/bin/e_desk.h index 21245f9971..92c239a527 100644 --- a/src/bin/e_desk.h +++ b/src/bin/e_desk.h @@ -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); diff --git a/src/bin/e_desk_group.c b/src/bin/e_desk_group.c index 86cbac4d97..737aa65a24 100644 --- a/src/bin/e_desk_group.c +++ b/src/bin/e_desk_group.c @@ -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 diff --git a/src/bin/e_desk_group.h b/src/bin/e_desk_group.h index d89a4affff..ce704c1646 100644 --- a/src/bin/e_desk_group.h +++ b/src/bin/e_desk_group.h @@ -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; -- 2.34.1