e_comp_wl: Added hook function using pid variable and added CONNECTED_CLIENT_CREATE... 01/222401/1
authorJunseok, Kim <juns.kim@samsung.com>
Thu, 26 Dec 2019 09:45:30 +0000 (18:45 +0900)
committerJunSeok Kim <juns.kim@samsung.com>
Tue, 14 Jan 2020 11:12:49 +0000 (11:12 +0000)
Change-Id: I24c606a3bafc901f3ab15156a31918311c6a4e26
(cherry picked from commit 77f59cec72a5759c9593924c5ea05a1e8ec1a43c)

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

index acec78081d9e2001f2c4e0d6ab70c739ae17fd0a..be7787651438177d455ba035d96d13a3e96369c5 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)
 {
@@ -4893,6 +4932,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 49693b4747f8ae53b44236000d821d16372c12ad..fee1b0d642bb24fbbc56913a3fa352908f542f09 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
@@ -529,6 +537,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;
@@ -561,6 +578,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);