#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))
{
}
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;
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;
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;
}
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;
}
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)
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.
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);