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); --