return _e_client_position_inside_input_rect(ec, tx, ty);
}
-static Eina_Bool
-_e_client_visibility_zone_calculate(E_Zone *zone)
+EINTERN Eina_Bool
+e_client_visibility_zone_calculate(E_Zone *zone)
{
E_Client *ec;
return;
}
-static void
-_e_client_focus_calculate(E_Zone *zone)
+EINTERN void
+e_client_focus_calculate(E_Zone *zone)
{
E_Client *defered_focus_ec = NULL, *reverted_focus_ec = NULL;
E_Client *ec = NULL, *old_focused = NULL, *cec = NULL;
}
EINTERN void
-e_client_idler_before(void)
+e_client_idler_before(Eina_Bool *check_focus)
{
const Eina_List *l;
E_Client *ec;
- Eina_Bool check_focus = EINA_FALSE;
+
+ *check_focus = EINA_FALSE;
if (!e_client_clients_hash_exist()) return;
_e_client_eval(ec);
e_comp_visibility_calculation_set(EINA_TRUE);
if (ec->changes.accepts_focus)
- check_focus = EINA_TRUE;
+ *check_focus = EINA_TRUE;
ec->changes.accepts_focus = 0;
}
}
}
- if (e_comp_canvas_norender_get() <= 0)
- {
- E_Zone *zone;
- Eina_List *zl;
- Eina_Bool e_visibility_changed = EINA_FALSE;
-
- EINA_LIST_FOREACH(e_comp->zones, zl, zone)
- {
- if (e_comp_visibility_calculation_get())
- e_visibility_changed = _e_client_visibility_zone_calculate(zone);
- if (check_focus ||
- (e_client_focused_get() == NULL) ||
- (e_comp_visibility_calculation_get() && (defer_focus_stack != NULL)) ||
- (e_visibility_changed))
- {
- _e_client_focus_calculate(zone);
- }
- }
- e_comp_visibility_calculation_set(EINA_FALSE);
- }
-
-
TRACE_DS_END();
}
return focus_stack;
}
+EINTERN Eina_List *
+e_client_defer_focus_stack_get(void)
+{
+ return defer_focus_stack;
+}
+
YOLO EINTERN void
e_client_focus_stack_set(Eina_List *l)
{
E_API extern int E_EVENT_CLIENT_FOCUS_SKIP_SET;
E_API extern int E_EVENT_CLIENT_FOCUS_SKIP_UNSET;
-EINTERN void e_client_idler_before(void);
+EINTERN void e_client_idler_before(Eina_Bool *check_focus);
EINTERN Eina_Bool e_client_init(void);
EINTERN void e_client_shutdown(void);
E_API E_Client *e_client_from_surface_resource(struct wl_resource *surface_resource);
EINTERN void e_client_activate(E_Client *ec, Eina_Bool just_do_it);
E_API E_Client *e_client_focused_get(void);
EINTERN Eina_List *e_client_focus_stack_get(void);
+EINTERN Eina_List *e_client_defer_focus_stack_get(void);
EINTERN void e_client_focus_stack_clear(void);
EINTERN Eina_List *e_client_lost_windows_get(E_Zone *zone);
EINTERN void e_client_shade(E_Client *ec, E_Direction dir);
EINTERN Eina_Bool e_client_explicit_sync_set(E_Client *ec, Eina_Bool enable);
EINTERN int e_client_explicit_sync_acquire_fence_fd_get(E_Client *ec);
EINTERN Eina_Bool e_client_explicit_sync_acquire_fence_fd_set(E_Client *ec, int fd);
+EINTERN Eina_Bool e_client_visibility_zone_calculate(E_Zone *zone);
+EINTERN void e_client_focus_calculate(E_Zone *zone);
/**
* Move window to coordinates that do not account client decorations yet.
EINTERN void
e_comp_idler_before(void)
{
+ Eina_Bool check_focus = EINA_FALSE;
+ E_Zone *zone;
+ Eina_List *zl;
+ Eina_Bool e_visibility_changed = EINA_FALSE;
+
// TODO: call e_zone_idle_before() for each zone
- e_client_idler_before();
+ e_client_idler_before(&check_focus);
+
+ if (e_comp_canvas_norender_get() <= 0)
+ {
+ EINA_LIST_FOREACH(e_comp->zones, zl, zone)
+ {
+ if (e_comp_visibility_calculation_get())
+ e_visibility_changed = e_client_visibility_zone_calculate(zone);
+ if (check_focus ||
+ (e_client_focused_get() == NULL) ||
+ (e_comp_visibility_calculation_get() && (e_client_defer_focus_stack_get() != NULL)) ||
+ (e_visibility_changed))
+ {
+ e_client_focus_calculate(zone);
+ }
+ }
+ e_comp_visibility_calculation_set(EINA_FALSE);
+ }
}
EINTERN void