bdilly pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=b77f0086f5502edacfb71277bbb024247ca6f4b1

commit b77f0086f5502edacfb71277bbb024247ca6f4b1
Author: Guilherme Iscaro <[email protected]>
Date:   Fri Nov 18 13:00:34 2016 -0200

    Efl.Canvas: Use Efl.Input.Focus as event info for object,focus.in/out.
---
 src/lib/efl/interfaces/efl_canvas.eo   |  4 +-
 src/lib/evas/canvas/evas_callbacks.c   |  3 ++
 src/lib/evas/canvas/evas_focus.c       | 73 ++++++++++++++++++++++------------
 src/lib/evas/canvas/evas_object_main.c | 10 +----
 src/lib/evas/include/evas_private.h    |  3 ++
 5 files changed, 57 insertions(+), 36 deletions(-)

diff --git a/src/lib/efl/interfaces/efl_canvas.eo 
b/src/lib/efl/interfaces/efl_canvas.eo
index 0393465..0e2179f 100644
--- a/src/lib/efl/interfaces/efl_canvas.eo
+++ b/src/lib/efl/interfaces/efl_canvas.eo
@@ -162,8 +162,8 @@ interface Efl.Canvas ()
    events {
       focus,in: Efl.Input.Focus; [[Called when canvas got focus]]
       focus,out: Efl.Input.Focus; [[Called when canvas lost focus]]
-      object,focus,in: Efl.Canvas.Object; [[Called when object got focus]]
-      object,focus,out: Efl.Canvas.Object; [[Called when object lost focus]]
+      object,focus,in: Efl.Input.Focus; [[Called when object got focus]]
+      object,focus,out: Efl.Input.Focus; [[Called when object lost focus]]
       render,pre; [[Called when pre render happens]]
       render,post; [[Called when post render happens]]
       device,changed: Efl.Input.Device; [[Called when input device changed]]
diff --git a/src/lib/evas/canvas/evas_callbacks.c 
b/src/lib/evas/canvas/evas_callbacks.c
index 394eef7..6baef3e 100644
--- a/src/lib/evas/canvas/evas_callbacks.c
+++ b/src/lib/evas/canvas/evas_callbacks.c
@@ -204,6 +204,9 @@ _eo_evas_cb(void *data, const Efl_Event *event)
    if (event->desc == EFL_CANVAS_EVENT_FOCUS_IN ||
        event->desc == EFL_CANVAS_EVENT_FOCUS_OUT)
      event_info = NULL;
+   else if (event->desc == EFL_CANVAS_EVENT_OBJECT_FOCUS_IN ||
+            event->desc == EFL_CANVAS_EVENT_OBJECT_FOCUS_OUT)
+     event_info = efl_input_focus_object_get(event->info);
    else
      event_info = event->info;
 
diff --git a/src/lib/evas/canvas/evas_focus.c b/src/lib/evas/canvas/evas_focus.c
index 3245867..d65422a 100644
--- a/src/lib/evas/canvas/evas_focus.c
+++ b/src/lib/evas/canvas/evas_focus.c
@@ -1,5 +1,9 @@
+#define EFL_INTERNAL_UNSTABLE
+#define EFL_INPUT_EVENT_PROTECTED
+
 #include "evas_common_private.h"
 #include "evas_private.h"
+#include "interfaces/efl_common_internal.h"
 
 /* private calls */
 
@@ -59,26 +63,56 @@ _current_focus_get(Eo *evas_obj, Efl_Input_Device *key)
    return eina_hash_find(edata->focused_objects, &key);
 }
 
-static void
-_evas_object_unfocus(Evas_Object_Protected_Data *obj, Efl_Input_Device *seat)
+void
+_evas_focus_dispatch_event(Evas_Object_Protected_Data *obj, Efl_Input_Device 
*seat, Eina_Bool in)
 {
-   obj->focused_by_seats = eina_list_remove(obj->focused_by_seats, seat);
-   _evas_focus_set(obj->object, seat, EINA_FALSE);
+   Efl_Input_Focus_Data *ev_data;
+   Efl_Input_Focus *evt;
+   Evas_Callback_Type cb_evas, cb_obj_evas;
+   const Efl_Event_Description *efl_object_focus_event, 
*efl_object_focus_device_event;
+
+   evt = efl_input_instance_get(EFL_INPUT_FOCUS_CLASS, NULL, (void **) 
&ev_data);
+   if (!evt) return;
+
+   ev_data->device = efl_ref(seat);
+   ev_data->object = obj->object;
+   ev_data->timestamp = time(NULL);
+
+   if (in)
+     {
+        cb_obj_evas = EVAS_CALLBACK_FOCUS_IN;
+        cb_evas = EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_IN;
+        efl_object_focus_event = EFL_CANVAS_OBJECT_EVENT_FOCUS_IN;
+        efl_object_focus_device_event = 
EFL_CANVAS_OBJECT_EVENT_FOCUS_DEVICE_IN;
+     }
+   else
+     {
+        cb_obj_evas = EVAS_CALLBACK_FOCUS_OUT;
+        cb_evas = EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_OUT;
+        efl_object_focus_event = EFL_CANVAS_OBJECT_EVENT_FOCUS_OUT;
+        efl_object_focus_device_event = 
EFL_CANVAS_OBJECT_EVENT_FOCUS_DEVICE_OUT;
+     }
 
-   //Legacy events...
    if (seat == obj->layer->evas->default_seat)
      {
         evas_object_event_callback_call(obj->object, obj,
-                                        EVAS_CALLBACK_FOCUS_OUT,
+                                        cb_obj_evas,
                                         NULL, _evas_object_event_new(),
-                                        EFL_CANVAS_OBJECT_EVENT_FOCUS_OUT);
-        evas_event_callback_call(obj->layer->evas->evas,
-                                 EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_OUT,
-                                 obj->object);
+                                        efl_object_focus_event);
      }
-   efl_event_callback_call(obj->object,
-                           EFL_CANVAS_OBJECT_EVENT_FOCUS_DEVICE_OUT,
-                           seat);
+   evas_event_callback_call(obj->layer->evas->evas,
+                            cb_evas, evt);
+   efl_event_callback_call(obj->object, efl_object_focus_device_event, seat);
+   efl_del(evt);
+}
+
+static void
+_evas_object_unfocus(Evas_Object_Protected_Data *obj, Efl_Input_Device *seat)
+{
+   obj->focused_by_seats = eina_list_remove(obj->focused_by_seats, seat);
+   _evas_focus_set(obj->object, seat, EINA_FALSE);
+
+   _evas_focus_dispatch_event(obj, seat, EINA_FALSE);
    _evas_post_event_callback_call(obj->layer->evas->evas,
                                   obj->layer->evas);
 }
@@ -161,18 +195,7 @@ _efl_canvas_object_seat_focus_add(Eo *eo_obj,
    obj->focused_by_seats = eina_list_append(obj->focused_by_seats, seat);
    _evas_focus_set(eo_obj, seat, EINA_TRUE);
 
-   //Legacy events...
-   if (seat == _default_seat_get(eo_obj))
-     {
-        evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_FOCUS_IN,
-                                        NULL, _evas_object_event_new(),
-                                        EFL_CANVAS_OBJECT_EVENT_FOCUS_IN);
-        evas_event_callback_call(obj->layer->evas->evas,
-                                 EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_IN, eo_obj);
-     }
-
-   efl_event_callback_call(eo_obj,
-                           EFL_CANVAS_OBJECT_EVENT_FOCUS_DEVICE_IN, seat);
+   _evas_focus_dispatch_event(obj, seat, EINA_TRUE);
  end:
    _evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas);
    return EINA_TRUE;
diff --git a/src/lib/evas/canvas/evas_object_main.c 
b/src/lib/evas/canvas/evas_object_main.c
index 46e8266..8466bab 100644
--- a/src/lib/evas/canvas/evas_object_main.c
+++ b/src/lib/evas/canvas/evas_object_main.c
@@ -706,15 +706,7 @@ _efl_canvas_object_efl_object_destructor(Eo *eo_obj, 
Evas_Object_Protected_Data
         efl_event_callback_del(dev, EFL_EVENT_DEL,
                                _evas_focus_device_del_cb, obj);
         eina_hash_del_by_key(edata->focused_objects, &dev);
-        //default seat - legacy support.
-        if (dev == edata->default_seat)
-          {
-             evas_object_event_callback_call(eo_obj, obj, 
EVAS_CALLBACK_FOCUS_OUT,
-                                             NULL, _evas_object_event_new(),
-                                             
EFL_CANVAS_OBJECT_EVENT_FOCUS_OUT);
-          }
-        efl_event_callback_call(eo_obj,
-                                EFL_CANVAS_OBJECT_EVENT_FOCUS_DEVICE_OUT, dev);
+        _evas_focus_dispatch_event(obj, dev, EINA_FALSE);
         if ((obj->layer) && (obj->layer->evas))
           _evas_post_event_callback_call(obj->layer->evas->evas, 
obj->layer->evas);
      }
diff --git a/src/lib/evas/include/evas_private.h 
b/src/lib/evas/include/evas_private.h
index 476c31c..f955e1d 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -1945,6 +1945,9 @@ Eina_Bool evas_vg_loader_svg(Evas_Object *vg, const 
Eina_File *f, const char *ke
 void *_evas_object_image_surface_get(Evas_Object *eo, 
Evas_Object_Protected_Data *obj);
 Eina_Bool _evas_image_proxy_source_clip_get(const Eo *eo_obj);
 
+void _evas_focus_dispatch_event(Evas_Object_Protected_Data *obj,
+                                Efl_Input_Device *seat, Eina_Bool in);
+
 extern Eina_Cow *evas_object_proxy_cow;
 extern Eina_Cow *evas_object_map_cow;
 extern Eina_Cow *evas_object_state_cow;

-- 


Reply via email to