From 4ae52a9763daa7795f4a982ca205308177eadd6d Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 10 Aug 2023 08:58:38 +0900 Subject: [PATCH] e_focus_policy: make a E_COMP_OBJECT_HOOK_LOWER callback The focus may be changed at E_COMP_OBJECT_HOOK_LOWER callback. Change-Id: Ib49b0c6c183d0da96c5553c5babf8723df086ec8 --- src/bin/e_comp_object.c | 20 +++++++++++++++++++- src/bin/e_comp_object.h | 3 +++ src/bin/e_focus_policy_history.c | 13 +++++++++++++ src/bin/e_focus_policy_topmost.c | 13 +++++++++++++ src/bin/e_policy_visibility.c | 5 +++++ src/bin/e_policy_wl.c | 5 +++++ 6 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/bin/e_comp_object.c b/src/bin/e_comp_object.c index 66cc6ad..0e95259 100644 --- a/src/bin/e_comp_object.c +++ b/src/bin/e_comp_object.c @@ -224,6 +224,9 @@ static Eina_Inlist *_e_comp_object_hooks[] = [E_COMP_OBJECT_HOOK_MASK_OBJECT_SET] = NULL, [E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET] = NULL, [E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET] = NULL, +//#ifdef REFACTOR_FOCUS_POLICY + [E_COMP_OBJECT_HOOK_LOWER] = NULL, +//#endif }; #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_ @@ -291,7 +294,11 @@ _e_comp_object_hook_call(E_Comp_Object_Hook_Point hookpoint, E_Client *ec) (hookpoint != E_COMP_OBJECT_HOOK_RESTACK) && (hookpoint != E_COMP_OBJECT_HOOK_MASK_OBJECT_SET) && (hookpoint != E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET) && - (hookpoint != E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET)) + (hookpoint != E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET) +#ifdef REFACTOR_FOCUS_POLICY + && (hookpoint != E_COMP_OBJECT_HOOK_LOWER) +#endif + ) { return ret; } @@ -1980,7 +1987,14 @@ _e_comp_object_lower(Evas_Object *obj) { E_Client *ec = e_comp_object_client_get(obj); if (ec) +#ifdef REFACTOR_FOCUS_POLICY + { + _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec); + _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_LOWER, ec); + } +#else _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RESTACK, ec); +#endif } } @@ -2257,8 +2271,12 @@ _e_comp_intercept_lower(void *data, Evas_Object *obj) _e_comp_object_transform_obj_stack_update(obj); end: +#ifdef REFACTOR_FOCUS_POLICY + // This code executes E_COMP_OBJECT_HOOK_LOWER callback at e_focus_policy_history.c +#else if (!cw->ec->post_lower) e_client_focus_stack_lower(cw->ec); +#endif TRACE_DS_END(); } diff --git a/src/bin/e_comp_object.h b/src/bin/e_comp_object.h index dc786f8..e35474b 100644 --- a/src/bin/e_comp_object.h +++ b/src/bin/e_comp_object.h @@ -45,6 +45,9 @@ typedef enum _E_Comp_Object_Hook_Point E_COMP_OBJECT_HOOK_MASK_OBJECT_SET, E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET, E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET, +//#ifdef REFACTOR_FOCUS_POLICY + E_COMP_OBJECT_HOOK_LOWER, +//#endif E_COMP_OBJECT_HOOK_LAST, } E_Comp_Object_Hook_Point; diff --git a/src/bin/e_focus_policy_history.c b/src/bin/e_focus_policy_history.c index 5b476f7..6614395 100644 --- a/src/bin/e_focus_policy_history.c +++ b/src/bin/e_focus_policy_history.c @@ -12,6 +12,7 @@ struct _E_Focus_Policy_History_Impl GMutex focused_ec_mutex; Eina_List *ec_hooks; + Eina_List *co_hooks; }; static void @@ -92,6 +93,14 @@ _focus_policy_history_hook_cb_client_mouse_down(void *data, E_Client *ec) } } +static Eina_Bool +_focus_policy_hook_history_cb_comp_object_lower(void *data, E_Client *ec) +{ + // TODO: + + return EINA_TRUE; +} + static void _focus_policy_history_del(E_Focus_Policy_Impl *impl) { @@ -101,6 +110,7 @@ _focus_policy_history_del(E_Focus_Policy_Impl *impl) ELOGF("FOCUS", "delete history focus policy.", NULL); + E_FREE_LIST(history_policy->co_hooks, e_comp_object_hook_del); E_FREE_LIST(history_policy->ec_hooks, e_client_hook_del); g_mutex_clear(&history_policy->focused_ec_mutex); @@ -157,6 +167,9 @@ e_focus_policy_iface_history_new(E_Zone* zone) E_LIST_HOOK_APPEND(history_policy->ec_hooks, E_CLIENT_HOOK_MOUSE_OUT, _focus_policy_history_hook_cb_client_mouse_out, history_policy); E_LIST_HOOK_APPEND(history_policy->ec_hooks, E_CLIENT_HOOK_MOUSE_DOWN, _focus_policy_history_hook_cb_client_mouse_down, history_policy); + // e_comp_object hooks + E_COMP_COMP_HOOK_APPEND(history_policy->co_hooks, E_COMP_OBJECT_HOOK_LOWER, _focus_policy_hook_history_cb_comp_object_lower, history_policy); + return policy_iface; fail: diff --git a/src/bin/e_focus_policy_topmost.c b/src/bin/e_focus_policy_topmost.c index 9900f71..65019c2 100644 --- a/src/bin/e_focus_policy_topmost.c +++ b/src/bin/e_focus_policy_topmost.c @@ -12,6 +12,7 @@ struct _E_Focus_Policy_Topmost_Impl GMutex focused_ec_mutex; Eina_List *ec_hooks; + Eina_List *co_hooks; }; static void @@ -66,6 +67,14 @@ _focus_policy_topmost_hook_cb_client_mouse_down(void *data, E_Client *ec) } } +static Eina_Bool +_focus_policy_hook_topmost_cb_comp_object_lower(void *data, E_Client *ec) +{ + // TODO: + + return EINA_TRUE; +} + static void _focus_policy_topmost_del(E_Focus_Policy_Impl *impl) { @@ -73,6 +82,7 @@ _focus_policy_topmost_del(E_Focus_Policy_Impl *impl) if (!topmost_policy) return; + E_FREE_LIST(topmost_policy->co_hooks, e_comp_object_hook_del); E_FREE_LIST(topmost_policy->ec_hooks, e_client_hook_del); g_mutex_clear(&topmost_policy->focused_ec_mutex); @@ -127,6 +137,9 @@ e_focus_policy_iface_topmost_new(E_Zone* zone) E_LIST_HOOK_APPEND(topmost_policy->ec_hooks, E_CLIENT_HOOK_MOUSE_OUT, _focus_policy_topmost_hook_cb_client_mouse_out, topmost_policy); E_LIST_HOOK_APPEND(topmost_policy->ec_hooks, E_CLIENT_HOOK_MOUSE_DOWN, _focus_policy_topmost_hook_cb_client_mouse_down, topmost_policy); + // e_comp_object hooks + E_COMP_COMP_HOOK_APPEND(topmost_policy->co_hooks, E_COMP_OBJECT_HOOK_LOWER, _focus_policy_hook_topmost_cb_comp_object_lower, topmost_policy); + return policy_iface; fail: diff --git a/src/bin/e_policy_visibility.c b/src/bin/e_policy_visibility.c index 39f1433..0895ad4 100644 --- a/src/bin/e_policy_visibility.c +++ b/src/bin/e_policy_visibility.c @@ -1659,11 +1659,16 @@ _e_vis_client_job_exec_by_type(E_Vis_Client *vc, E_Vis_Job_Type type) break; case E_VIS_JOB_TYPE_LOWER: e_client_lower(ec); +#ifdef REFACTOR_FOCUS_POLICY + // This code is executed at E_COMP_OBJECT_HOOK_LOWER callback + // at e_focus_policy_topmost.c and at e_focus_policy_history.c +#else if (ec->focused) { if (!e_config->calc_vis_without_effect) e_client_revert_focus(ec); } +#endif break; case E_VIS_JOB_TYPE_HIDE: evas_object_hide(ec->frame); diff --git a/src/bin/e_policy_wl.c b/src/bin/e_policy_wl.c index 1f9e6df..0eac927 100644 --- a/src/bin/e_policy_wl.c +++ b/src/bin/e_policy_wl.c @@ -1757,11 +1757,16 @@ _tzpol_iface_cb_lower(struct wl_client *client EINA_UNUSED, struct wl_resource * e_client_lower(ec); +#ifdef REFACTOR_FOCUS_POLICY + // This code is executed at E_COMP_OBJECT_HOOK_LOWER callback + // at e_focus_policy_topmost.c and at e_focus_policy_history.c +#else if (ec->focused) { if (!e_config->calc_vis_without_effect) e_client_revert_focus(ec); } +#endif } static void -- 2.7.4