#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)
{
}
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++;
+}
#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;
// 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