e_focus: Get zone from focus object instead of client 10/320610/1
authorJunseok Kim <juns.kim@samsung.com>
Wed, 5 Feb 2025 04:01:44 +0000 (13:01 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 5 Mar 2025 05:00:11 +0000 (14:00 +0900)
Change-Id: Ia2158b9ebd4f712136965d20c2695467933f86b3

src/bin/windowmgr/e_focus_policy_history.c
src/bin/windowmgr/e_focus_policy_topmost.c

index e0390ef5ac137e0cdd0f8f2d7b13ea018f402804..2ce85b8dd1bab6504a24480af6a7fb72e5c07488 100644 (file)
@@ -141,7 +141,7 @@ _e_focus_policy_history_merge_focus_stack_with_defer_focus(E_Focus_Policy_Histor
         goto end;
      }
 
-   E_CLIENT_FOREACH(defer_ec)
+   E_ZONE_CLIENT_FOREACH(history_policy->zone, defer_ec)
      {
         if (!eina_list_data_find(history_policy->defer_focus_stack, defer_ec)) continue;
 
@@ -191,7 +191,7 @@ _e_focus_policy_history_candidate_focus_get(E_Focus_Policy_History *history_poli
 
    desk = e_desk_current_get(zone);
 
-   E_CLIENT_REVERSE_FOREACH(ec)
+   E_ZONE_CLIENT_REVERSE_FOREACH(zone, ec)
      {
         if (!eina_list_data_find(history_policy->defer_focus_stack, ec)) continue;
 
index 014a8c0cb9f6cc9463da2e1c32609cfb4f1308c4..9189595ee844097b89ea89b50ea1805f12707612 100644 (file)
@@ -59,7 +59,7 @@ struct _E_Focus_Policy_Topmost_Client
 #endif
 
 static Eina_Bool
-_e_focus_policy_topmost_focus_can_take_by_vis_obscured(E_Client *ec)
+_e_focus_policy_topmost_focus_can_take_by_vis_obscured(E_Focus_Policy_Topmost *topmost_policy, E_Client *ec)
 {
    switch (e_client_visibility_get(ec))
      {
@@ -78,7 +78,7 @@ _e_focus_policy_topmost_focus_can_take_by_vis_obscured(E_Client *ec)
 }
 
 static Eina_Bool
-_e_focus_policy_topmost_focus_can_take(E_Client *ec)
+_e_focus_policy_topmost_focus_can_take(E_Focus_Policy_Topmost *topmost_policy, E_Client *ec)
 {
    E_Zone *zone;
    E_Client *child_ec, *above_ec;
@@ -94,11 +94,12 @@ _e_focus_policy_topmost_focus_can_take(E_Client *ec)
    if (!ec->visible) return EINA_FALSE;
    if (ec->bg_state) return EINA_FALSE;
    if (ec->visibility.force_obscured) return EINA_FALSE;
-   if (!_e_focus_policy_topmost_focus_can_take_by_vis_obscured(ec)) return EINA_FALSE;
+   if (!_e_focus_policy_topmost_focus_can_take_by_vis_obscured(topmost_policy, ec)) return EINA_FALSE;
 
-   zone = e_comp_zone_find_by_ec(ec);
+   zone = topmost_policy->zone;
    if (zone)
      {
+        if (zone != e_comp_zone_find_by_ec(ec)) return EINA_FALSE;
         e_client_geometry_get(ec, &x, &y, &w, &h);
         if (!E_INTERSECTS(zone->x, zone->y, zone->w, zone->h, x, y, w, h))
           return EINA_FALSE;
@@ -114,7 +115,7 @@ _e_focus_policy_topmost_focus_can_take(E_Client *ec)
         if (!child_ec) return EINA_FALSE;
         if (above_ec != child_ec) return EINA_FALSE;
 
-        if (_e_focus_policy_topmost_focus_can_take(child_ec))
+        if (_e_focus_policy_topmost_focus_can_take(topmost_policy, child_ec))
           return EINA_FALSE;
         else if (e_client_check_fully_contain_by_above(child_ec, EINA_FALSE))
           return EINA_FALSE;
@@ -124,13 +125,13 @@ _e_focus_policy_topmost_focus_can_take(E_Client *ec)
 }
 
 static E_Client *
-_e_focus_policy_topmost_focusable_get(void)
+_e_focus_policy_topmost_focusable_get(E_Focus_Policy_Topmost *topmost_policy)
 {
    E_Client *ec;
 
-   E_CLIENT_REVERSE_FOREACH(ec)
+   E_ZONE_CLIENT_REVERSE_FOREACH(topmost_policy->zone, ec)
      {
-        if (_e_focus_policy_topmost_focus_can_take(ec))
+        if (_e_focus_policy_topmost_focus_can_take(topmost_policy, ec))
           return ec;
      }
 
@@ -146,7 +147,7 @@ _focus_policy_topmost_next_focus_set(E_Focus_Policy_Topmost *topmost_policy)
    focused_ec = topmost_policy->focused_ec;
 
    // next focusable ec
-   focusable_ec = _e_focus_policy_topmost_focusable_get();
+   focusable_ec = _e_focus_policy_topmost_focusable_get(topmost_policy);
    if (focusable_ec == focused_ec) return;
 
    if (focusable_ec)
@@ -411,7 +412,7 @@ _focus_policy_topmost_cb_client_move(struct wl_listener *listener, void *data)
 
    E_FOCUS_TOPMOST_TRACE(topmost_policy, ec);
 
-   zone = e_comp_zone_find_by_ec(ec);
+   zone = topmost_policy->zone;
    if (!zone) return;
 
    // no need to change the focused ec when ec is not focused.
@@ -586,7 +587,7 @@ _focus_policy_topmost_update(E_Focus_Policy_Impl *impl)
    focused_ec = topmost_policy->focused_ec;
 
    // next focusable ec
-   focusable_ec = _e_focus_policy_topmost_focusable_get();
+   focusable_ec = _e_focus_policy_topmost_focusable_get(topmost_policy);
    if (focusable_ec == focused_ec) return EINA_TRUE;
 
    e_client_frame_focus_set(focused_ec, EINA_FALSE);