e_focus_policy: make a E_CLIENT_HOOK_FOCUS_UNSET callback 30/297530/1
authorSooChan Lim <sc1.lim@samsung.com>
Thu, 10 Aug 2023 01:07:32 +0000 (10:07 +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_CLIENT_HOOK_FOCUS_UNSET callback.

Change-Id: I308974522a7fcc91dea7cda1c36a3b4d61e1a4b4

src/bin/e_client.c
src/bin/e_focus_policy_history.c
src/bin/e_focus_policy_topmost.c

index 6dca758..193b488 100644 (file)
@@ -5171,6 +5171,52 @@ e_client_focus_set_with_pointer(E_Client *ec)
 EINTERN void
 e_client_focused_set(E_Client *ec)
 {
+#ifdef REFACTOR_FOCUS_POLICY
+   E_Client *focused_ec;
+   E_Zone *zone;
+
+   if (ec)
+     ELOGF("FOCUS", "CLIENT FOCUSED_SET : SET", ec);
+   else
+     ELOGF("FOCUS", "CLIENT FOCUSED_SET : UNSET", NULL);
+
+   zone = e_zone_current_get();
+   EINA_SAFETY_ON_NULL_RETURN(zone);
+
+   // unset the current focused_ec
+   focused_ec = e_focus_focused_ec_get(zone->focus);
+   if (ec == focused_ec) return;
+
+   TRACE_DS_BEGIN(CLIENT:FOCUSED SET);
+
+   // unset the current focused_ec if focused_ec is not being deleted
+   if (focused_ec &&
+       (e_object_ref_get(E_OBJECT(ec)) > 0) &&
+       !e_object_is_del(E_OBJECT(focused_ec)))
+     {
+        _e_client_hook_call(E_CLIENT_HOOK_FOCUS_UNSET, focused_ec);
+        _e_client_event_simple(ec, E_EVENT_CLIENT_FOCUS_OUT);
+     }
+
+   // clear the current focused_ec when ec is NULL
+   if (!ec)
+     {
+        e_zone_focus_clear(zone);
+        TRACE_DS_END();
+        return;
+     }
+
+   // set the new current focused_ec
+   _e_client_hook_call(E_CLIENT_HOOK_FOCUS_SET, ec);
+   _e_client_event_simple(ec, E_EVENT_CLIENT_FOCUS_IN);
+
+   // TODO: This is not for focus, but for Window Placement policy.
+   //       Move this code to the better place.
+   if (ec->sticky && ec->desk && (!ec->desk->visible))
+     e_client_desk_set(ec, e_desk_current_get(ec->zone));
+
+   TRACE_DS_END();
+#else
    E_Client *ec2, *ec_unfocus = focused;
    Eina_List *l, *ll;
 
@@ -5266,6 +5312,7 @@ e_client_focused_set(E_Client *ec)
      e_client_desk_set(ec, e_desk_current_get(ec->zone));
 
    TRACE_DS_END();
+#endif
 }
 
 EINTERN void
index cd30f52..1ab19a2 100644 (file)
@@ -107,6 +107,12 @@ _focus_policy_history_hook_cb_client_focus_set(void *data, E_Client *ec)
    // TODO:
 }
 
+static void
+_focus_policy_history_hook_cb_client_focus_unset(void *data, E_Client *ec)
+{
+   // TODO:
+}
+
 static Eina_Bool
 _focus_policy_hook_history_cb_comp_object_lower(void *data, E_Client *ec)
 {
@@ -227,6 +233,7 @@ 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_LIST_HOOK_APPEND(history_policy->ec_hooks, E_CLIENT_HOOK_FOCUS_SET, _focus_policy_history_hook_cb_client_focus_set, history_policy);
+   E_LIST_HOOK_APPEND(history_policy->ec_hooks, E_CLIENT_HOOK_FOCUS_UNSET, _focus_policy_history_hook_cb_client_focus_unset, 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);
index c594863..b31d22e 100644 (file)
@@ -80,6 +80,12 @@ _focus_policy_topmost_hook_cb_client_focus_set(void *data, E_Client *ec)
    // TODO:
 }
 
+static void
+_focus_policy_topmost_hook_cb_client_focus_unset(void *data, E_Client *ec)
+{
+   // TODO:
+}
+
 static Eina_Bool
 _focus_policy_hook_topmost_cb_comp_object_lower(void *data, E_Client *ec)
 {
@@ -167,6 +173,7 @@ 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_LIST_HOOK_APPEND(topmost_policy->ec_hooks, E_CLIENT_HOOK_FOCUS_SET, _focus_policy_topmost_hook_cb_client_focus_set, topmost_policy);
+   E_LIST_HOOK_APPEND(topmost_policy->ec_hooks, E_CLIENT_HOOK_FOCUS_UNSET, _focus_policy_topmost_hook_cb_client_focus_unset, 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);