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;

-- 


Reply via email to