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;
[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,
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)
{
_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)
{
#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
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,
} 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
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;
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);