From 93fec0a890624733a487971c163fb5330d53bfdf Mon Sep 17 00:00:00 2001 From: "Junseok, Kim" Date: Thu, 26 Dec 2019 18:45:30 +0900 Subject: [PATCH] e_comp_wl: Added hook function using pid variable and added CONNECTED_CLIENT_CREATE hook. Change-Id: I24c606a3bafc901f3ab15156a31918311c6a4e26 (cherry picked from commit 77f59cec72a5759c9593924c5ea05a1e8ec1a43c) --- src/bin/e_comp_wl.c | 70 +++++++++++++++++++++++++++++++++++++++++++++ src/bin/e_comp_wl.h | 20 +++++++++++++ 2 files changed, 90 insertions(+) diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c index acec78081d..be77876514 100644 --- a/src/bin/e_comp_wl.c +++ b/src/bin/e_comp_wl.c @@ -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) { diff --git a/src/bin/e_comp_wl.h b/src/bin/e_comp_wl.h index 49693b4747..fee1b0d642 100644 --- a/src/bin/e_comp_wl.h +++ b/src/bin/e_comp_wl.h @@ -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); -- 2.34.1