e_focus_policy: make a E_ZONE_HOOK_FOCUS_CLEAR callback 27/297527/1
authorSooChan Lim <sc1.lim@samsung.com>
Thu, 10 Aug 2023 00:51:26 +0000 (09:51 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Mon, 21 Aug 2023 07:58:38 +0000 (16:58 +0900)
The focus may be changed at E_ZONE_HOOK_FOCUS_CLEAR callback.

Change-Id: I2ec7e4c15579fd14865fa28066e83c6e59c7f9e2

src/bin/e_focus_policy_history.c
src/bin/e_focus_policy_topmost.c
src/bin/e_zone.c
src/bin/e_zone.h

index f13f84800aeddab2e3157a7c3a3a6a29ac9cb28d..6ac4174c43bf7f8c189a1a152882d52a6bc8c202 100644 (file)
@@ -13,6 +13,7 @@ struct _E_Focus_Policy_History_Impl
 
    Eina_List *ec_hooks;
    Eina_List *co_hooks;
+   Eina_List *zone_hooks;
 };
 
 static void
@@ -137,6 +138,12 @@ _focus_policy_history_hook_cb_comp_object_hide(void *data, E_Client *ec)
    return EINA_TRUE;
 }
 
+static void
+_focus_policy_history_hook_cb_zone_focus_clear(void *data, E_Zone *zone)
+{
+   // TODO:
+}
+
 static void
 _focus_policy_history_del(E_Focus_Policy_Impl *impl)
 {
@@ -146,6 +153,7 @@ _focus_policy_history_del(E_Focus_Policy_Impl *impl)
 
    ELOGF("FOCUS", "delete history focus policy.", NULL);
 
+   E_FREE_LIST(history_policy->zone_hooks, e_zone_hook_del);
    E_FREE_LIST(history_policy->co_hooks, e_comp_object_hook_del);
    E_FREE_LIST(history_policy->ec_hooks, e_client_hook_del);
 
@@ -183,6 +191,7 @@ e_focus_policy_iface_history_new(E_Zone* zone)
 {
    E_Focus_Policy_Iface *policy_iface;
    E_Focus_Policy_History *history_policy;
+   E_Zone_Hook *zone_hook;
 
    policy_iface = E_NEW(E_Focus_Policy_Iface, 1);
    EINA_SAFETY_ON_NULL_RETURN_VAL(policy_iface, NULL);
@@ -211,6 +220,10 @@ e_focus_policy_iface_history_new(E_Zone* zone)
    E_COMP_COMP_HOOK_APPEND(history_policy->co_hooks, E_COMP_OBJECT_HOOK_SHOW,  _focus_policy_history_hook_cb_comp_object_show, history_policy);
    E_COMP_COMP_HOOK_APPEND(history_policy->co_hooks, E_COMP_OBJECT_HOOK_HIDE,  _focus_policy_history_hook_cb_comp_object_hide, history_policy);
 
+   // e_zone hooks
+   zone_hook = e_zone_hook_add(E_ZONE_HOOK_FOCUS_CLEAR, _focus_policy_history_hook_cb_zone_focus_clear, history_policy);
+   if (zone_hook) history_policy->zone_hooks = eina_list_append(history_policy->zone_hooks, zone_hook);
+
    return policy_iface;
 
 fail:
index 47f89653477bb84c9d6c5686d32f75341765ac6b..c5948634e2e14398c4c3727e1a71875fa1a4986d 100644 (file)
@@ -13,6 +13,7 @@ struct _E_Focus_Policy_Topmost_Impl
 
    Eina_List *ec_hooks;
    Eina_List *co_hooks;
+   Eina_List *zone_hooks;
 };
 
 static void
@@ -95,6 +96,12 @@ _focus_policy_topmost_hook_cb_comp_object_move(void *data, E_Client *ec)
    return EINA_TRUE;
 }
 
+static void
+_focus_policy_topmost_hook_cb_zone_focus_clear(void *data, E_Zone *zone)
+{
+   // TODO:
+}
+
 static void
 _focus_policy_topmost_del(E_Focus_Policy_Impl *impl)
 {
@@ -102,6 +109,7 @@ _focus_policy_topmost_del(E_Focus_Policy_Impl *impl)
 
    if (!topmost_policy) return;
 
+   E_FREE_LIST(topmost_policy->zone_hooks, e_zone_hook_del);
    E_FREE_LIST(topmost_policy->co_hooks, e_comp_object_hook_del);
    E_FREE_LIST(topmost_policy->ec_hooks, e_client_hook_del);
 
@@ -137,6 +145,7 @@ e_focus_policy_iface_topmost_new(E_Zone* zone)
 {
    E_Focus_Policy_Iface *policy_iface;
    E_Focus_Policy_Topmost *topmost_policy;
+   E_Zone_Hook *zone_hook;
 
    policy_iface = E_NEW(E_Focus_Policy_Iface, 1);
    EINA_SAFETY_ON_NULL_RETURN_VAL(policy_iface, NULL);
@@ -163,6 +172,10 @@ e_focus_policy_iface_topmost_new(E_Zone* zone)
    E_COMP_COMP_HOOK_APPEND(topmost_policy->co_hooks, E_COMP_OBJECT_HOOK_LOWER, _focus_policy_hook_topmost_cb_comp_object_lower, topmost_policy);
    E_COMP_COMP_HOOK_APPEND(topmost_policy->co_hooks, E_COMP_OBJECT_HOOK_MOVE,  _focus_policy_topmost_hook_cb_comp_object_move, topmost_policy);
 
+   // e_zone hooks
+   zone_hook = e_zone_hook_add(E_ZONE_HOOK_FOCUS_CLEAR, _focus_policy_topmost_hook_cb_zone_focus_clear, topmost_policy);
+   if (zone_hook) topmost_policy->zone_hooks = eina_list_append(topmost_policy->zone_hooks, zone_hook);
+
    return policy_iface;
 
 fail:
index 8c70d425e69e3c32fbd37716da46c0d50079b3a3..072a5368c4425fdc83eba92e9ac5ed0a91c57a4d 100644 (file)
@@ -48,6 +48,9 @@ static Eina_Inlist *_e_zone_hooks[] =
    [E_ZONE_HOOK_DISPLAY_STATE_CHANGE] = NULL,
    [E_ZONE_HOOK_SPLISCREEN_ACTIVATE] = NULL,
    [E_ZONE_HOOK_SPLISCREEN_DEACTIVATE] = NULL,
+//#ifdef REFACTOR_FOCUS_POLICY
+   [E_ZONE_HOOK_FOCUS_CLEAR] = NULL,
+//#endif
 };
 
 
@@ -1685,3 +1688,13 @@ e_zone_visibility_calculate(E_Zone *zone)
 
    return e_visibility_changed;
 }
+
+#ifdef REFACTOR_FOCUS_POLICY
+EINTERN void
+e_zone_focus_clear(E_Zone *zone)
+{
+   EINA_SAFETY_ON_NULL_RETURN(zone);
+
+   _e_zone_hook_call(E_ZONE_HOOK_FOCUS_CLEAR, zone);
+}
+#endif
index 25e0fd0611c4dd3d186a763ff6e383d6fec41d21..4d9269b95a5c40adc68af4520688fc82df40ad36 100644 (file)
@@ -43,6 +43,9 @@ typedef enum _E_Zone_Hook_Point
    E_ZONE_HOOK_DISPLAY_STATE_CHANGE,
    E_ZONE_HOOK_SPLISCREEN_ACTIVATE,
    E_ZONE_HOOK_SPLISCREEN_DEACTIVATE,
+//#ifdef REFACTOR_FOCUS_POLICY
+   E_ZONE_HOOK_FOCUS_CLEAR,
+//#endif
    E_ZONE_HOOK_LAST
 } E_Zone_Hook_Point;
 
@@ -230,6 +233,9 @@ EINTERN void      e_zone_client_add(E_Zone *zone, E_Client *ec);
 EINTERN Eina_Bool e_zone_has_ec(E_Zone *zone, E_Client *ec);
 EINTERN Eina_Bool e_zone_is_displaying(E_Zone *zone);
 EINTERN Eina_Bool e_zone_visibility_calculate(E_Zone *zone);
+//#ifdef REFACTOR_FOCUS_POLICY
+EINTERN void      e_zone_focus_clear(E_Zone *zone);
+//#endif
 
 extern EINTERN int E_EVENT_ZONE_DESK_COUNT_SET;
 extern E_API int E_EVENT_ZONE_MOVE_RESIZE;