e_focus_policy: make a E_COMP_OBJECT_HOOK_LOWER callback 21/297521/1
authorSooChan Lim <sc1.lim@samsung.com>
Wed, 9 Aug 2023 23:58:38 +0000 (08:58 +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_COMP_OBJECT_HOOK_LOWER callback.

Change-Id: Ib49b0c6c183d0da96c5553c5babf8723df086ec8

src/bin/e_comp_object.c
src/bin/e_comp_object.h
src/bin/e_focus_policy_history.c
src/bin/e_focus_policy_topmost.c
src/bin/e_policy_visibility.c
src/bin/e_policy_wl.c

index 66cc6ad..0e95259 100644 (file)
@@ -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();
 }
 
index dc786f8..e35474b 100644 (file)
@@ -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;
 
index 5b476f7..6614395 100644 (file)
@@ -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:
index 9900f71..65019c2 100644 (file)
@@ -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:
index 39f1433..0895ad4 100644 (file)
@@ -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);
index 1f9e6df..0eac927 100644 (file)
@@ -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