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