e_desk: add desk hook feature 40/235240/3 accepted/tizen/unified/20200604.164545 submit/tizen/20200603.063956
authorDoyoun Kang <doyoun.kang@samsung.com>
Wed, 3 Jun 2020 04:02:54 +0000 (13:02 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Wed, 3 Jun 2020 04:59:32 +0000 (13:59 +0900)
Support below hooks
- E_DESK_HOOK_DESK_GROUP_ENABLE
- E_DESK_HOOK_DESK_GROUP_DISABLE

Change-Id: Iec32853b2c26d2f91daf72aab21d95d5eb660cbd

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

index db78ef2272529abc01de4765b1c60f5602a2e1d9..e195d3d2f1c73cf605df27c44f2c9bffb4f9a02b 100644 (file)
@@ -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; i<E_DESK_GROUP_LAYER_COUNT; i++)
      {
         EINA_LIST_REVERSE_FOREACH(desk->desk_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)
 {
index a6e71386f91b24278c94f6e63926b72b6a78b1f6..21245f99710586373b4e3931bf34edc1e9ae74c8 100644 (file)
@@ -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);