#include "e.h"
+#include "e_blur_intern.h"
#include <pixman.h>
#include <libds-tizen/blur.h>
Evas_Object *obj;
};
+static int _e_blur_hooks_delete = 0;
+static int _e_blur_hooks_walking = 0;
+
+static Eina_Inlist *_e_blur_hooks[] =
+{
+ [E_BLUR_HOOK_SET] = NULL,
+ [E_BLUR_HOOK_UNSET] = NULL,
+};
+
static E_Blur_Manager *_blur_manager = NULL;
static void _e_blur_ec_set(E_Blur *blur, E_Client *ec);
+static void
+_e_blur_hooks_clean(void)
+{
+ Eina_Inlist *l;
+ E_Blur_Hook *ch;
+ unsigned int x;
+ for (x = 0; x < E_BLUR_HOOK_LAST; x++)
+ EINA_INLIST_FOREACH_SAFE(_e_blur_hooks[x], l, ch)
+ {
+ if (!ch->delete_me) continue;
+ _e_blur_hooks[x] = eina_inlist_remove(_e_blur_hooks[x], EINA_INLIST_GET(ch));
+ free(ch);
+ }
+
+ _e_blur_hooks_delete = 0;
+}
+
+static void
+_e_blur_hook_call(E_Blur_Hook_Point hookpoint, E_Blur *blur)
+{
+ E_Blur_Hook *ch;
+
+ _e_blur_hooks_walking++;
+ EINA_INLIST_FOREACH(_e_blur_hooks[hookpoint], ch)
+ {
+ if (ch->delete_me) continue;
+ ch->func(ch->data, blur);
+ }
+ _e_blur_hooks_walking--;
+ if ((_e_blur_hooks_walking == 0) && (_e_blur_hooks_delete > 0))
+ _e_blur_hooks_clean();
+}
+
static E_Blur_Object *
_e_blur_object_create(int x, int y, int w, int h)
{
_e_blur_ec_set(blur, NULL);
- EINA_LIST_FREE(blur->blur_objs, blur_obj)
- _e_blur_object_destroy(blur_obj);
+ if (eina_list_count(blur->blur_objs))
+ {
+ EINA_LIST_FREE(blur->blur_objs, blur_obj)
+ _e_blur_object_destroy(blur_obj);
+
+ _e_blur_hook_call(E_BLUR_HOOK_UNSET, blur);
+ }
pixman_region32_fini(&blur->region);
free(blur);
evas_object_show(blur_obj->obj);
blur->blur_objs = eina_list_append(blur->blur_objs, blur_obj);
-
+
ELOGF("E_BLUR", "E_Blur:%p set blur_obj:%p %dx%d+%d+%d radius:%d",
blur->ec, blur, blur_obj,
blur_obj->w, blur_obj->h, blur_obj->x, blur_obj->y,
blur->radius);
}
+
+ _e_blur_hook_call(E_BLUR_HOOK_SET, blur);
}
else if (state->committed & DS_TIZEN_BLUR_STATE_RADIUS)
{
ELOGF("E_BLUR", "E_Blur:%p set blur_obj:%p radius:%d",
blur->ec, blur, blur_obj, blur->radius);
}
+
+ _e_blur_hook_call(E_BLUR_HOOK_SET, blur);
}
}
else
{
- EINA_LIST_FREE(blur->blur_objs, blur_obj)
- _e_blur_object_destroy(blur_obj);
+ if (eina_list_count(blur->blur_objs))
+ {
+ EINA_LIST_FREE(blur->blur_objs, blur_obj)
+ _e_blur_object_destroy(blur_obj);
+
+ _e_blur_hook_call(E_BLUR_HOOK_UNSET, blur);
+ }
}
}
return EINA_FALSE;
}
+
+EINTERN E_Blur_Hook *
+e_blur_hook_add(E_Blur_Hook_Point hookpoint, E_Blur_Hook_Cb func, const void *data)
+{
+ E_Blur_Hook *ch;
+
+ EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_BLUR_HOOK_LAST, NULL);
+ ch = E_NEW(E_Blur_Hook, 1);
+ if (!ch) return NULL;
+ ch->hookpoint = hookpoint;
+ ch->func = func;
+ ch->data = (void*)data;
+ _e_blur_hooks[hookpoint] = eina_inlist_append(_e_blur_hooks[hookpoint], EINA_INLIST_GET(ch));
+ return ch;
+}
+
+EINTERN void
+e_blur_hook_del(E_Blur_Hook *ch)
+{
+ ch->delete_me = 1;
+ if (_e_blur_hooks_walking == 0)
+ {
+ _e_blur_hooks[ch->hookpoint] = eina_inlist_remove(_e_blur_hooks[ch->hookpoint], EINA_INLIST_GET(ch));
+ free(ch);
+ }
+ else
+ _e_blur_hooks_delete++;
+}
+
+EINTERN E_Client *
+e_blur_client_get(E_Blur *blur)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(blur, NULL);
+
+ return blur->ec;
+}
#include "e_intern.h"
+#define E_BLUR_HOOK_APPEND(list, type, callback, data) \
+ do \
+ { \
+ E_Blur_Hook *_ch; \
+ _ch = e_blur_hook_add(type, callback, data); \
+ assert(_ch); \
+ list = eina_list_append(list, _ch); \
+ } \
+ while (0)
+
+typedef struct _E_Blur E_Blur;
+typedef struct _E_Blur_Hook E_Blur_Hook;
+typedef void (*E_Blur_Hook_Cb) (void *data, E_Blur *blur);
+
+typedef enum _E_Blur_Hook_Point
+{
+ E_BLUR_HOOK_SET,
+ E_BLUR_HOOK_UNSET,
+ E_BLUR_HOOK_LAST
+} E_Blur_Hook_Point;
+
+struct _E_Blur_Hook
+{
+ EINA_INLIST;
+ E_Blur_Hook_Point hookpoint;
+ E_Blur_Hook_Cb func;
+ void *data;
+ unsigned char delete_me : 1;
+};
+
EINTERN Eina_Bool e_blur_manager_init(void);
+EINTERN E_Client *e_blur_client_get(E_Blur *blur);
+EINTERN E_Blur_Hook *e_blur_hook_add(E_Blur_Hook_Point hookpoint, E_Blur_Hook_Cb func, const void *data);
+EINTERN void e_blur_hook_del(E_Blur_Hook *ch);
+
#endif // E_BLUR_INTERN_H