From 52977f9f399880d726f7c8c1818eb115ee5a20f2 Mon Sep 17 00:00:00 2001 From: Doyoun Kang Date: Wed, 3 Jun 2020 13:02:54 +0900 Subject: [PATCH] e_desk: add desk hook feature Support below hooks - E_DESK_HOOK_DESK_GROUP_ENABLE - E_DESK_HOOK_DESK_GROUP_DISABLE Change-Id: Iec32853b2c26d2f91daf72aab21d95d5eb660cbd --- src/bin/e_desk.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++ src/bin/e_desk.h | 23 ++++++++++++++ 2 files changed, 106 insertions(+) diff --git a/src/bin/e_desk.c b/src/bin/e_desk.c index db78ef2272..e195d3d2f1 100644 --- a/src/bin/e_desk.c +++ b/src/bin/e_desk.c @@ -28,6 +28,15 @@ struct _E_Desk_Smart_Data } zoom; }; +static int _e_desk_hooks_delete = 0; +static int _e_desk_hooks_walking = 0; + +static Eina_Inlist *_e_desk_hooks[] = +{ + [E_DESK_HOOK_DESK_GROUP_ENABLE] = NULL, + [E_DESK_HOOK_DESK_GROUP_DISABLE] = NULL, +}; + static void _e_desk_free(E_Desk *desk); 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); @@ -48,6 +57,9 @@ static void _e_desk_util_comp_hwc_disable_set(Eina_Bool enable); static Eina_Bool _e_desk_desk_group_base_new(E_Desk *desk); +static void _e_desk_hooks_clean(void); +static Eina_Bool _e_desk_hook_call(E_Desk_Hook_Point hookpoint, E_Desk *desk); + EVAS_SMART_SUBCLASS_NEW(E_DESK_SMART_OBJ_TYPE, _e_desk, Evas_Smart_Class, Evas_Smart_Class, evas_object_smart_clipped_class_get, NULL) @@ -1740,6 +1752,8 @@ e_desk_desk_group_enable(E_Desk *desk) if (desk->desk_group.enable) return EINA_TRUE; desk->desk_group.enable = EINA_TRUE; + _e_desk_hook_call(E_DESK_HOOK_DESK_GROUP_ENABLE, desk); + // check all ec is included in desk group _e_desk_desk_group_check_ec_in_desk_group(desk); @@ -1769,6 +1783,8 @@ e_desk_desk_group_disable(E_Desk *desk) if (!desk->desk_group.enable) return EINA_TRUE; desk->desk_group.enable = EINA_FALSE; + _e_desk_hook_call(E_DESK_HOOK_DESK_GROUP_DISABLE, desk); + for (int i=0; idesk_group.list[i], l, edg) @@ -1871,6 +1887,73 @@ e_desk_desk_group_below_get(E_Desk *desk, E_Desk_Group *edg) return below; } +static void +_e_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_desk_hooks[x], l, dh) + { + if (!dh->delete_me) continue; + _e_desk_hooks[x] = eina_inlist_remove(_e_desk_hooks[x], EINA_INLIST_GET(dh)); + free(dh); + } + + _e_desk_hooks_delete = 0; +} + +static Eina_Bool +_e_desk_hook_call(E_Desk_Hook_Point hookpoint, E_Desk *desk) +{ + E_Desk_Hook *dh; + + e_object_ref(E_OBJECT(desk)); + _e_desk_hooks_walking++; + EINA_INLIST_FOREACH(_e_desk_hooks[hookpoint], dh) + { + if (dh->delete_me) continue; + dh->func(dh->data, desk); + } + _e_desk_hooks_walking--; + if ((_e_desk_hooks_walking == 0) && (_e_desk_hooks_delete > 0)) + _e_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_desk_hooks[hookpoint] = eina_inlist_append(_e_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_desk_hooks_walking == 0) + { + _e_desk_hooks[dh->hookpoint] = eina_inlist_remove(_e_desk_hooks[dh->hookpoint], EINA_INLIST_GET(dh)); + free(dh); + } + else + _e_desk_hooks_delete++; +} + EINTERN void e_desk_desk_group_info_print(E_Desk *desk) { diff --git a/src/bin/e_desk.h b/src/bin/e_desk.h index a6e71386f9..21245f9971 100644 --- a/src/bin/e_desk.h +++ b/src/bin/e_desk.h @@ -35,6 +35,26 @@ typedef enum _E_Desk_Group_Layer #define E_DESK_TYPE 0xE0b01005 #define E_DESK_SMART_OBJ_TYPE "E_Desk_Smart_Object" +typedef struct _E_Desk_Hook E_Desk_Hook; + +typedef enum _E_Desk_Hook_Point +{ + E_DESK_HOOK_DESK_GROUP_ENABLE, + E_DESK_HOOK_DESK_GROUP_DISABLE, + E_DESK_HOOK_LAST +} E_Desk_Hook_Point; + +typedef void (*E_Desk_Hook_Cb)(void *data, E_Desk *desk); + +struct _E_Desk_Hook +{ + EINA_INLIST; + E_Desk_Hook_Point hookpoint; + E_Desk_Hook_Cb func; + void *data; + unsigned char delete_me : 1; +}; + typedef enum { E_DESKFLIP_ANIMATION_MODE_OFF, @@ -143,6 +163,9 @@ EINTERN void e_desk_desk_group_lower(E_Desk *desk, E_Desk_Group *edg); EINTERN E_Desk_Group *e_desk_desk_group_above_get(E_Desk *desk, E_Desk_Group *edg); EINTERN E_Desk_Group *e_desk_desk_group_below_get(E_Desk *desk, E_Desk_Group *edg); +E_API E_Desk_Hook *e_desk_hook_add(E_Desk_Hook_Point hookpoint, E_Desk_Hook_Cb func, const void *data); +E_API void e_desk_hook_del(E_Desk_Hook *dh); + EINTERN void e_desk_desk_group_info_print(E_Desk *desk); -- 2.34.1