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.
This commit is contained in:
Jean-Philippe Andre 2017-04-12 20:13:59 +09:00
parent 8ff2dffe7c
commit 4b09ad7d6b
6 changed files with 28 additions and 12 deletions

View File

@ -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"

View File

@ -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;
}
}

View File

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

View File

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

View File

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

View File

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