focus: do not revert to another client when client is unfocused

This was a nice idea to fix most focus bugs at once. However, due to the
runtime of e many things can get "randomly" focused, for exmaple: volume
control on the frame, internal dialogs, config value screens when
grabbing for keys, widgets when they get created in a gadget. The list
is quite long. However, fixing all those little bugs is hard and partly
impossible as the behaviour is correct in the context of a toolkit, not
in the context of a compositor.

Long term we should split window-focus and canvas-focus from each other,
then bugs like these would not be a problem anymore.
This commit is contained in:
Marcel Hollerbach 2022-01-09 15:33:18 +01:00 committed by Carsten Haitzler (Rasterman)
parent 9881953815
commit 35b8f86906
4 changed files with 11 additions and 8 deletions

View File

@ -1878,7 +1878,7 @@ _e_comp_intercept_focus(void *data, Evas_Object *obj, Eina_Bool focus)
else else
{ {
if (e_client_focused_get() == ec) { if (e_client_focused_get() == ec) {
e_client_revert_focus(ec); e_client_focused_set(NULL);
} }
} }
evas_object_focus_set(obj, focus); evas_object_focus_set(obj, focus);
@ -2353,8 +2353,9 @@ _e_comp_smart_hide(Evas_Object *obj)
edje_object_play_set(cw->frame_object, 0); edje_object_play_set(cw->frame_object, 0);
} }
/* ensure focus-out */ /* ensure focus-out */
if (cw->ec->focused) if (cw->ec->focused) {
evas_object_focus_set(cw->ec->frame, 0); e_client_revert_focus(cw->ec);
}
e_comp_render_queue(); //force nocomp recheck e_comp_render_queue(); //force nocomp recheck
e_comp_shape_queue(); e_comp_shape_queue();
} }

View File

@ -2884,7 +2884,7 @@ _e_comp_x_focus_out(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_X_Event_
else if (ev->detail == ECORE_X_EVENT_DETAIL_INFERIOR) else if (ev->detail == ECORE_X_EVENT_DETAIL_INFERIOR)
return ECORE_CALLBACK_PASS_ON; return ECORE_CALLBACK_PASS_ON;
} }
evas_object_focus_set(ec->frame, 0); e_client_revert_focus(ec);
return ECORE_CALLBACK_PASS_ON; return ECORE_CALLBACK_PASS_ON;
} }

View File

@ -454,8 +454,9 @@ e_desk_last_focused_focus(E_Desk *desk)
evas_object_raise(ecs->frame); evas_object_raise(ecs->frame);
return ecs; return ecs;
} }
if (e_client_focused_get()) if (e_client_focused_get()) {
evas_object_focus_set(e_client_focused_get()->frame, 0); e_client_revert_focus(e_client_focused_get());
}
return NULL; return NULL;
} }

View File

@ -35,8 +35,9 @@ e_focus_event_mouse_out(E_Client *ec)
{ {
if (!ec->lock_focus_in) if (!ec->lock_focus_in)
{ {
if (ec->focused) if (ec->focused) {
evas_object_focus_set(ec->frame, 0); e_client_revert_focus(ec);
}
} }
} }
E_FREE_FUNC(ec->raise_timer, ecore_timer_del); E_FREE_FUNC(ec->raise_timer, ecore_timer_del);