forked from enlightenment/efl
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:
parent
8ff2dffe7c
commit
4b09ad7d6b
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue