jpeg pushed a commit to branch efl-1.19.

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

commit 6fb19e1ecb15329b6c29592e37622a3d067ee388
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Wed Apr 12 20:13:59 2017 +0900

    evas: Fix event propagation in elm_widget
    
    See the previous commit. efl_provider_find() could not
    find a canvas because the event object had no parent.
    
    This restores the slider in E's sound mixer.
    
    Note: Input events may expose the evas canvas object
    because of parenting. This will eventually need fixing,
    as only efl.ui.win should be exposed.
    
    If 8ff2dffe7c7a21278dis backported to 1.19 then this patch
    also needs to be merged as well.
---
 src/lib/evas/canvas/efl_input_event.c   | 15 +++++++++++++++
 src/lib/evas/canvas/efl_input_event.eo  |  5 ++++-
 src/lib/evas/canvas/efl_input_focus.c   |  6 ++----
 src/lib/evas/canvas/efl_input_key.c     |  5 ++---
 src/lib/evas/canvas/efl_input_pointer.c |  5 ++---
 src/lib/evas/canvas/evas_focus.c        |  4 +++-
 6 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/src/lib/evas/canvas/efl_input_event.c 
b/src/lib/evas/canvas/efl_input_event.c
index 8d93cb9..0c94f8f 100644
--- a/src/lib/evas/canvas/efl_input_event.c
+++ b/src/lib/evas/canvas/efl_input_event.c
@@ -47,6 +47,21 @@ _efl_input_event_fake_get(Eo *obj EINA_UNUSED, void *pd 
EINA_UNUSED)
    return EINA_FALSE;
 }
 
+EOLIAN static Efl_Object *
+_efl_input_event_efl_object_provider_find(Eo *obj, void *pd EINA_UNUSED, const 
Efl_Object *klass)
+{
+   // Note: provider_find should probably return self if self is a klass object
+   if (klass == EVAS_CANVAS_CLASS)
+     {
+        for (Eo *parent = efl_parent_get(obj); parent; parent = 
efl_parent_get(parent))
+          {
+             if (efl_isa(parent, klass))
+               return parent;
+          }
+     }
+   return efl_provider_find(efl_super(obj, MY_CLASS), klass);
+}
+
 #include "efl_input_event.eo.c"
 #include "efl_input_state.eo.c"
 #include "efl_input_interface.eo.c"
diff --git a/src/lib/evas/canvas/efl_input_event.eo 
b/src/lib/evas/canvas/efl_input_event.eo
index 718d203..d984c34 100644
--- a/src/lib/evas/canvas/efl_input_event.eo
+++ b/src/lib/evas/canvas/efl_input_event.eo
@@ -1,6 +1,6 @@
 import efl_input_types;
 
-mixin Efl.Input.Event
+mixin Efl.Input.Event (Efl.Interface, Efl.Object)
 {
    [[Represents a generic event data.
 
@@ -83,4 +83,7 @@ mixin Efl.Input.Event
          return: own(Efl.Input.Event); [[Instance of this input event]]
       }
    }
+   implements {
+      Efl.Object.provider_find;
+   }
 }
diff --git a/src/lib/evas/canvas/efl_input_focus.c 
b/src/lib/evas/canvas/efl_input_focus.c
index b76a836..fead3af 100644
--- a/src/lib/evas/canvas/efl_input_focus.c
+++ b/src/lib/evas/canvas/efl_input_focus.c
@@ -109,14 +109,12 @@ _efl_input_focus_efl_input_event_timestamp_get(Eo *obj 
EINA_UNUSED,
 }
 
 EOLIAN static Efl_Input_Focus *
-_efl_input_focus_efl_input_event_dup(Eo *obj EINA_UNUSED,
-                                     Efl_Input_Focus_Data *pd)
+_efl_input_focus_efl_input_event_dup(Eo *obj, Efl_Input_Focus_Data *pd)
 {
    Efl_Input_Focus_Data *ev;
    Efl_Input_Focus *evt;
 
-   // no parent
-   evt = efl_input_instance_get(MY_CLASS, NULL, (void **) &ev);
+   evt = efl_input_instance_get(MY_CLASS, efl_parent_get(obj), (void **) &ev);
    if (!evt || !ev) return NULL;
 
    ev->eo        = evt;
diff --git a/src/lib/evas/canvas/efl_input_key.c 
b/src/lib/evas/canvas/efl_input_key.c
index f017680..3cc6699 100644
--- a/src/lib/evas/canvas/efl_input_key.c
+++ b/src/lib/evas/canvas/efl_input_key.c
@@ -179,13 +179,12 @@ _efl_input_key_efl_input_event_reset(Eo *obj EINA_UNUSED, 
Efl_Input_Key_Data *pd
 }
 
 EOLIAN static Efl_Input_Event *
-_efl_input_key_efl_input_event_dup(Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd)
+_efl_input_key_efl_input_event_dup(Eo *obj, Efl_Input_Key_Data *pd)
 {
    Efl_Input_Key_Data *ev;
    Efl_Input_Key *evt;
 
-   // no parent
-   evt = efl_input_instance_get(EFL_INPUT_KEY_CLASS, NULL, (void **) &ev);
+   evt = efl_input_instance_get(MY_CLASS, efl_parent_get(obj), (void **) &ev);
    if (!evt || !ev) return NULL;
 
    memcpy(ev, pd, sizeof(*ev));
diff --git a/src/lib/evas/canvas/efl_input_pointer.c 
b/src/lib/evas/canvas/efl_input_pointer.c
index 6f7c9ea..c6e3d05 100644
--- a/src/lib/evas/canvas/efl_input_pointer.c
+++ b/src/lib/evas/canvas/efl_input_pointer.c
@@ -116,13 +116,12 @@ _efl_input_pointer_efl_input_event_reset(Eo *obj, 
Efl_Input_Pointer_Data *pd)
 }
 
 EOLIAN static Efl_Input_Event *
-_efl_input_pointer_efl_input_event_dup(Eo *obj EINA_UNUSED, 
Efl_Input_Pointer_Data *pd)
+_efl_input_pointer_efl_input_event_dup(Eo *obj, Efl_Input_Pointer_Data *pd)
 {
    Efl_Input_Pointer_Data *ev;
    Efl_Input_Pointer *evt;
 
-   // no parent
-   evt = efl_input_instance_get(EFL_INPUT_POINTER_CLASS, NULL, (void **) &ev);
+   evt = efl_input_instance_get(MY_CLASS, efl_parent_get(obj), (void **) &ev);
    if (!evt) return NULL;
 
    memcpy(ev, pd, sizeof(*ev));
diff --git a/src/lib/evas/canvas/evas_focus.c b/src/lib/evas/canvas/evas_focus.c
index d700e2c..293fb57 100644
--- a/src/lib/evas/canvas/evas_focus.c
+++ b/src/lib/evas/canvas/evas_focus.c
@@ -71,7 +71,9 @@ _evas_focus_dispatch_event(Evas_Object_Protected_Data *obj, 
Efl_Input_Device *se
    Evas_Callback_Type cb_evas, cb_obj_evas;
    const Efl_Event_Description *efl_object_focus_event;
 
-   evt = efl_input_instance_get(EFL_INPUT_FOCUS_CLASS, NULL, (void **) 
&ev_data);
+   evt = efl_input_instance_get(EFL_INPUT_FOCUS_CLASS,
+                                efl_provider_find(obj->object, 
EVAS_CANVAS_CLASS),
+                                (void **) &ev_data);
    if (!evt) return;
 
    ev_data->device = efl_ref(seat);

-- 


Reply via email to