add E_Desk_Group_Hook 94/290594/1
authorSooChan Lim <sc1.lim@samsung.com>
Fri, 10 Mar 2023 08:59:18 +0000 (17:59 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 29 Mar 2023 09:56:01 +0000 (18:56 +0900)
Change-Id: If73021444670b9c8dc27e3142d4a3d19982da92c

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

index 1163ad7..4d670cb 100644 (file)
@@ -1,5 +1,25 @@
 #include "e.h"
 
+static int _e_desk_group_hooks_delete = 0;
+static int _e_desk_group_hooks_walking = 0;
+
+static Eina_Inlist *_e_desk_group_hooks[] =
+{
+   [E_DESK_GROUP_HOOK_SET_APPID] = NULL,
+};
+
+struct _E_Desk_Group_Hook
+{
+   EINA_INLIST;
+   E_Desk_Group_Hook_Point hookpoint;
+   E_Desk_Group_Hook_Cb    func;
+   void                   *data;
+   unsigned char           delete_me : 1;
+};
+
+static void        _e_desk_group_hooks_clean(void);
+static Eina_Bool   _e_desk_group_hook_call(E_Desk_Group_Hook_Point hookpoint, E_Desk_Group *desk_group);
+
 static Eina_Bool
 _check_desk_group_client_layer_validation(E_Desk_Group_Client_Layer edgc_layer)
 {
@@ -930,3 +950,81 @@ e_desk_group_info_print(E_Desk_Group *edg)
      }
    ELOGF("EDG_INFO", "===========================================", NULL);
 }
+
+static void
+_e_desk_group_hooks_clean(void)
+{
+   Eina_Inlist *l;
+   E_Desk_Group_Hook *dgh;
+   unsigned int x;
+
+   for (x = 0; x < E_DESK_GROUP_HOOK_LAST; x++)
+     EINA_INLIST_FOREACH_SAFE(_e_desk_group_hooks[x], l, dgh)
+       {
+          if (!dgh->delete_me) continue;
+          _e_desk_group_hooks[x] = eina_inlist_remove(_e_desk_group_hooks[x], EINA_INLIST_GET(dgh));
+          free(dgh);
+       }
+
+   _e_desk_group_hooks_delete = 0;
+}
+
+static Eina_Bool
+_e_desk_group_hook_call(E_Desk_Group_Hook_Point hookpoint, E_Desk_Group *desk_group)
+{
+   E_Desk_Group_Hook *dgh;
+
+   e_object_ref(E_OBJECT(desk_group));
+   _e_desk_group_hooks_walking++;
+   EINA_INLIST_FOREACH(_e_desk_group_hooks[hookpoint], dgh)
+     {
+        if (dgh->delete_me) continue;
+        dgh->func(dgh->data, desk_group);
+     }
+   _e_desk_group_hooks_walking--;
+   if ((_e_desk_group_hooks_walking == 0) && (_e_desk_group_hooks_delete > 0))
+     _e_desk_group_hooks_clean();
+
+   return !!e_object_unref(E_OBJECT(desk_group));
+}
+
+EINTERN Eina_Bool
+e_desk_group_hook_call(E_Desk_Group *edg, E_Desk_Group_Hook_Point hookpoint)
+{
+   return _e_desk_group_hook_call(hookpoint, edg);
+}
+
+E_API E_Desk_Group_Hook *
+e_desk_group_hook_add(E_Desk_Group_Hook_Point hookpoint,
+      E_Desk_Group_Hook_Cb func, const void *data)
+{
+   E_Desk_Group_Hook *dgh;
+
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_DESK_GROUP_HOOK_LAST, NULL);
+   dgh = E_NEW(E_Desk_Group_Hook, 1);
+   if (!dgh) return NULL;
+
+   dgh->hookpoint = hookpoint;
+   dgh->func = func;
+   dgh->data = (void*)data;
+
+   _e_desk_group_hooks[hookpoint] =
+      eina_inlist_append(_e_desk_group_hooks[hookpoint], EINA_INLIST_GET(dgh));
+
+   return dgh;
+}
+
+E_API void
+e_desk_group_hook_del(E_Desk_Group_Hook * dgh)
+{
+   dgh->delete_me = 1;
+
+   if (_e_desk_group_hooks_walking == 0)
+     {
+        _e_desk_group_hooks[dgh->hookpoint] =
+            eina_inlist_remove(_e_desk_group_hooks[dgh->hookpoint], EINA_INLIST_GET(dgh));
+        free(dgh);
+     }
+   else
+     _e_desk_group_hooks_delete++;
+}
index 477210e..121cef4 100644 (file)
@@ -21,6 +21,16 @@ typedef enum _E_Desk_Group_Client_Layer
 #ifndef E_DESK_GROUP_H
 #define E_DESK_GROUP_H
 
+typedef struct _E_Desk_Group_Hook E_Desk_Group_Hook;
+
+typedef enum _E_Desk_Group_Hook_Point
+{
+   E_DESK_GROUP_HOOK_SET_APPID,
+   E_DESK_GROUP_HOOK_LAST
+} E_Desk_Group_Hook_Point;
+
+typedef void (*E_Desk_Group_Hook_Cb)(void *data, E_Desk_Group *desk_group);
+
 struct _E_Desk_Group
 {
    E_Object             e_obj_inherit;
@@ -87,6 +97,10 @@ 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);
 
+EINTERN Eina_Bool        e_desk_group_hook_call(E_Desk_Group *edg, E_Desk_Group_Hook_Point hookpoint);
+E_API E_Desk_Group_Hook *e_desk_group_hook_add(E_Desk_Group_Hook_Point hookpoint, E_Desk_Group_Hook_Cb func, const void *data);
+E_API void               e_desk_group_hook_del(E_Desk_Group_Hook *dgh);
+
 extern E_API int E_EVENT_DESK_GROUP_CHANGE;
 
 #endif