e_blur: add blur set/unset hook 82/307782/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Mon, 11 Mar 2024 04:33:53 +0000 (13:33 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 13 Mar 2024 05:03:49 +0000 (14:03 +0900)
Change-Id: I847edb61fab0554343f849a56aaa7e59a3804c9e

src/bin/e_blur.c
src/bin/e_blur_intern.h

index 06b16ad..1b7f99a 100644 (file)
@@ -1,4 +1,5 @@
 #include "e.h"
+#include "e_blur_intern.h"
 #include <pixman.h>
 #include <libds-tizen/blur.h>
 
@@ -36,10 +37,52 @@ struct _E_Blur_Object
    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)
 {
@@ -86,8 +129,13 @@ _e_blur_free(E_Blur *blur)
 
    _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);
@@ -173,12 +221,14 @@ _e_blur_cb_ds_tizen_blur_commit(struct wl_listener *listener, void *data)
                     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)
           {
@@ -189,12 +239,19 @@ _e_blur_cb_ds_tizen_blur_commit(struct wl_listener *listener, void *data)
                   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);
+          }
      }
 }
 
@@ -418,3 +475,39 @@ fail:
 
    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;
+}
index 354b194..1ddab9a 100644 (file)
@@ -3,6 +3,40 @@
 
 #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