e_comp_wl: Added hook function using pid variable and added CONNECTED_CLIENT_CREATE... 23/221023/6
authorJunseok, Kim <juns.kim@samsung.com>
Thu, 26 Dec 2019 09:45:30 +0000 (18:45 +0900)
committerJunseok, Kim <juns.kim@samsung.com>
Thu, 26 Dec 2019 12:24:15 +0000 (21:24 +0900)
Change-Id: I24c606a3bafc901f3ab15156a31918311c6a4e26

src/bin/e_comp_wl.c
src/bin/e_comp_wl.h

index 4939b1d43a766f6354399b40688d3547a178f89c..21b5d00777752c1d5af659a9309af33d746234a0 100644 (file)
@@ -54,6 +54,9 @@ static Eina_Bool need_send_motion = EINA_TRUE;
 static int _e_comp_wl_hooks_delete = 0;
 static int _e_comp_wl_hooks_walking = 0;
 
+static int _e_comp_wl_pid_hooks_delete = 0;
+static int _e_comp_wl_pid_hooks_walking = 0;
+
 static int _e_comp_wl_intercept_hooks_delete = 0;
 static int _e_comp_wl_intercept_hooks_walking = 0;
 
@@ -66,6 +69,11 @@ static Eina_Inlist *_e_comp_wl_hooks[] =
    [E_COMP_WL_HOOK_BUFFER_SIZE_CHANGE] = NULL,
 };
 
+static Eina_Inlist *_e_comp_wl_pid_hooks[] =
+{
+   [E_COMP_WL_PID_HOOK_CONNECTED_CLIENT_CREATE] = NULL,
+};
+
 static Eina_Inlist *_e_comp_wl_intercept_hooks[] =
 {
    [E_COMP_WL_INTERCEPT_HOOK_CURSOR_TIMER_MOUSE_IN] = NULL,
@@ -113,6 +121,37 @@ _e_comp_wl_hook_call(E_Comp_Wl_Hook_Point hookpoint, E_Client *ec)
    e_object_unref(E_OBJECT(ec));
 }
 
+static void
+_e_comp_wl_pid_hooks_clean(void)
+{
+   Eina_Inlist *l;
+   E_Comp_Wl_Pid_Hook *ch;
+   unsigned int x;
+   for (x = 0; x < E_COMP_WL_PID_HOOK_LAST; x++)
+     EINA_INLIST_FOREACH_SAFE(_e_comp_wl_pid_hooks[x], l, ch)
+       {
+          if (!ch->delete_me) continue;
+          _e_comp_wl_pid_hooks[x] = eina_inlist_remove(_e_comp_wl_pid_hooks[x], EINA_INLIST_GET(ch));
+         free(ch);
+       }
+}
+
+static void
+_e_comp_wl_pid_hook_call(E_Comp_Wl_Pid_Hook_Point hookpoint, pid_t pid)
+{
+   E_Comp_Wl_Pid_Hook *ch;
+
+   _e_comp_wl_pid_hooks_walking++;
+   EINA_INLIST_FOREACH(_e_comp_wl_pid_hooks[hookpoint], ch)
+     {
+        if (ch->delete_me) continue;
+        ch->func(ch->data, pid);
+     }
+   _e_comp_wl_pid_hooks_walking--;
+   if ((_e_comp_wl_pid_hooks_walking == 0) && (_e_comp_wl_pid_hooks_delete > 0))
+     _e_comp_wl_pid_hooks_clean();
+}
+
 static void
 _e_comp_wl_intercept_hooks_clean(void)
 {
@@ -4868,6 +4907,37 @@ e_comp_wl_hook_del(E_Comp_Wl_Hook *ch)
      _e_comp_wl_hooks_delete++;
 }
 
+E_API E_Comp_Wl_Pid_Hook *
+e_comp_wl_pid_hook_add(E_Comp_Wl_Pid_Hook_Point hookpoint, E_Comp_Wl_Pid_Hook_Cb func, const void *data)
+{
+   E_Comp_Wl_Pid_Hook *ch;
+
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_COMP_WL_PID_HOOK_LAST, NULL);
+
+   ch = E_NEW(E_Comp_Wl_Pid_Hook, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ch, NULL);
+
+   ch->hookpoint = hookpoint;
+   ch->func = func;
+   ch->data = (void*)data;
+   _e_comp_wl_pid_hooks[hookpoint] = eina_inlist_append(_e_comp_wl_pid_hooks[hookpoint], EINA_INLIST_GET(ch));
+
+   return ch;
+}
+
+E_API void
+e_comp_wl_pid_hook_del(E_Comp_Wl_Pid_Hook *ch)
+{
+   ch->delete_me = 1;
+   if (_e_comp_wl_pid_hooks_walking == 0)
+     {
+        _e_comp_wl_pid_hooks[ch->hookpoint] = eina_inlist_remove(_e_comp_wl_pid_hooks[ch->hookpoint], EINA_INLIST_GET(ch));
+        free(ch);
+     }
+   else
+     _e_comp_wl_pid_hooks_delete++;
+}
+
 E_API E_Comp_Wl_Intercept_Hook *
 e_comp_wl_intercept_hook_add(E_Comp_Wl_Intercept_Hook_Point hookpoint, E_Comp_Wl_Intercept_Hook_Cb func, const void *data)
 {
index 81fdc9cf438a8253e29007849dc726494671ec39..392734a24cc5655b87588e2e2603da904b11d692 100644 (file)
@@ -1,5 +1,6 @@
 #ifdef E_TYPEDEFS
 typedef struct _E_Comp_Wl_Hook E_Comp_Wl_Hook;
+typedef struct _E_Comp_Wl_Pid_Hook E_Comp_Wl_Pid_Hook;
 #else
 # ifndef E_COMP_WL_H
 #  define E_COMP_WL_H
@@ -67,6 +68,12 @@ typedef enum _E_Comp_Wl_Hook_Point
    E_COMP_WL_HOOK_LAST,
 } E_Comp_Wl_Hook_Point;
 
+typedef enum _E_Comp_Wl_Pid_Hook_Point
+{
+   E_COMP_WL_PID_HOOK_CONNECTED_CLIENT_CREATE,
+   E_COMP_WL_PID_HOOK_LAST,
+} E_Comp_Wl_Pid_Hook_Point;
+
 typedef enum _E_Comp_Wl_Sh_Surf_Role
 {
    E_COMP_WL_SH_SURF_ROLE_NONE = 0,
@@ -83,6 +90,7 @@ typedef enum _E_Comp_Wl_Intercept_Hook_Point
 } E_Comp_Wl_Intercept_Hook_Point;
 
 typedef void (*E_Comp_Wl_Hook_Cb) (void *data, E_Client *ec);
+typedef void (*E_Comp_Wl_Pid_Hook_Cb) (void *data, pid_t pid);
 typedef Eina_Bool (*E_Comp_Wl_Intercept_Hook_Cb) (void *data, E_Client *ec);
 
 struct _E_Comp_Wl_Aux_Hint
@@ -526,6 +534,15 @@ struct _E_Comp_Wl_Hook
    unsigned char delete_me : 1;
 };
 
+struct _E_Comp_Wl_Pid_Hook
+{
+   EINA_INLIST;
+   E_Comp_Wl_Pid_Hook_Point hookpoint;
+   E_Comp_Wl_Pid_Hook_Cb func;
+   void *data;
+   unsigned char delete_me : 1;
+};
+
 struct _E_Comp_Wl_Intercept_Hook
 {
    EINA_INLIST;
@@ -558,6 +575,9 @@ E_API void        e_comp_wl_touch_cancel(void);
 E_API E_Comp_Wl_Hook *e_comp_wl_hook_add(E_Comp_Wl_Hook_Point hookpoint, E_Comp_Wl_Hook_Cb func, const void *data);
 E_API void e_comp_wl_hook_del(E_Comp_Wl_Hook *ch);
 
+E_API E_Comp_Wl_Pid_Hook *e_comp_wl_pid_hook_add(E_Comp_Wl_Pid_Hook_Point hookpoint, E_Comp_Wl_Pid_Hook_Cb func, const void *data);
+E_API void e_comp_wl_pid_hook_del(E_Comp_Wl_Pid_Hook *ch);
+
 E_API E_Comp_Wl_Intercept_Hook *e_comp_wl_intercept_hook_add(E_Comp_Wl_Intercept_Hook_Point hookpoint, E_Comp_Wl_Intercept_Hook_Cb func, const void *data);
 E_API void e_comp_wl_intercept_hook_del(E_Comp_Wl_Intercept_Hook *ch);