discomfitor pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=839e45e49b4a574d904ee2022692956a304fd7a7
commit 839e45e49b4a574d904ee2022692956a304fd7a7 Author: Mike Blumenkrantz <zm...@osg.samsung.com> Date: Fri Jun 9 20:16:07 2017 -0400 evas: handle focus setting with async input init @fix --- src/lib/evas/canvas/evas_device.c | 6 ++++++ src/lib/evas/canvas/evas_focus.c | 15 +++++++++++++-- src/lib/evas/canvas/evas_object_main.c | 8 +++++++- src/lib/evas/include/evas_private.h | 1 + 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/lib/evas/canvas/evas_device.c b/src/lib/evas/canvas/evas_device.c index 92e21f84e0..e474540239 100644 --- a/src/lib/evas/canvas/evas_device.c +++ b/src/lib/evas/canvas/evas_device.c @@ -211,6 +211,12 @@ evas_device_add_full(Evas *eo_e, const char *name, const char *desc, efl_event_callback_call(eo_e, EFL_CANVAS_EVENT_DEVICE_ADDED, dev); // Keeping this event to do not break things... evas_event_callback_call(eo_e, EVAS_CALLBACK_DEVICE_CHANGED, dev); + if (e->pending_default_focus_obj && (e->default_seat == dev)) + { + Eo *eo_obj = e->pending_default_focus_obj; + e->pending_default_focus_obj = NULL; + evas_object_focus_set(eo_obj, 1); + } return dev; } diff --git a/src/lib/evas/canvas/evas_focus.c b/src/lib/evas/canvas/evas_focus.c index 293fb57b6c..30afdaa08e 100644 --- a/src/lib/evas/canvas/evas_focus.c +++ b/src/lib/evas/canvas/evas_focus.c @@ -132,6 +132,12 @@ _efl_canvas_object_seat_focus_del(Eo *eo_obj, if (!seat) seat = _default_seat_get(eo_obj); + if ((!seat) && obj->layer) + { + if (obj->layer->evas->pending_default_focus_obj == eo_obj) + obj->layer->evas->pending_default_focus_obj = NULL; + } + EINA_LIST_FOREACH(obj->focused_by_seats, l, dev) { if (dev != seat) @@ -166,10 +172,15 @@ _efl_canvas_object_seat_focus_add(Eo *eo_obj, event_id = _evas_event_counter; if (!seat) seat = _default_seat_get(eo_obj); - EINA_SAFETY_ON_NULL_RETURN_VAL(seat, EINA_FALSE); - if (efl_input_device_type_get(seat) != EFL_INPUT_DEVICE_CLASS_SEAT) + if (seat && (efl_input_device_type_get(seat) != EFL_INPUT_DEVICE_CLASS_SEAT)) return EINA_FALSE; + if (obj->layer && (!seat)) + { + obj->layer->evas->pending_default_focus_obj = eo_obj; + return EINA_TRUE; //questionable return + } + if (!efl_input_seat_event_filter_get(eo_obj, seat)) return EINA_FALSE; diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c index 0f323132f1..48b4efe216 100644 --- a/src/lib/evas/canvas/evas_object_main.c +++ b/src/lib/evas/canvas/evas_object_main.c @@ -1029,7 +1029,13 @@ _efl_canvas_object_efl_object_destructor(Eo *eo_obj, Evas_Object_Protected_Data EINA_LIST_FREE(obj->events_whitelist, dev) efl_event_callback_del(dev, EFL_EVENT_DEL, _whitelist_events_device_remove_cb, obj); if (obj->name) evas_object_name_set(eo_obj, NULL); - if (!obj->layer) + if (obj->layer) + { + if (obj->layer->evas) + if (obj->layer->evas->pending_default_focus_obj == eo_obj) + obj->layer->evas->pending_default_focus_obj = NULL; + } + else { efl_manual_free_set(eo_obj, EINA_FALSE); obj->clean_layer = 1; diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 5bacc34fd3..6189390698 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -935,6 +935,7 @@ struct _Evas_Public_Data int in_smart_calc; int smart_calc_count; + Eo *pending_default_focus_obj; Eina_Hash *focused_objects; //Key - seat; value - the focused object Eina_List *focused_by; //Which seat has the canvas focus void *attach_data; --