diff --git a/src/lib/ecore_evas/ecore_evas.c b/src/lib/ecore_evas/ecore_evas.c index 7f251175f8..36ec77e800 100644 --- a/src/lib/ecore_evas/ecore_evas.c +++ b/src/lib/ecore_evas/ecore_evas.c @@ -4465,7 +4465,7 @@ _direct_mouse_inout(Ecore_Evas *ee, const Ecore_Event_Mouse_IO *info, Efl_Pointe eo_event_callback_call(e, EVAS_CANVAS_EVENT_POINTER, evt); processed = ev->evas_done; - eo_del(evt); + eo_unref(evt); return processed; } diff --git a/src/lib/efl/interfaces/efl_event.eo b/src/lib/efl/interfaces/efl_event.eo index f00a0472cb..9cc2bcb122 100644 --- a/src/lib/efl/interfaces/efl_event.eo +++ b/src/lib/efl/interfaces/efl_event.eo @@ -37,5 +37,9 @@ interface Efl.Event reset { [[Resets the internal data to 0 or default values.]] } + dup { + [[Creates a copy of this event.]] + return: own(Efl.Event); + } } } diff --git a/src/lib/efl/interfaces/efl_pointer_event.c b/src/lib/efl/interfaces/efl_pointer_event.c index b55da3f407..536249e797 100644 --- a/src/lib/efl/interfaces/efl_pointer_event.c +++ b/src/lib/efl/interfaces/efl_pointer_event.c @@ -91,6 +91,21 @@ _efl_pointer_event_efl_event_reset(Eo *obj, Efl_Pointer_Event_Data *pd) pd->wheel.dir = EFL_ORIENT_VERTICAL; } +EOLIAN static Efl_Event * +_efl_pointer_event_efl_event_dup(Eo *obj, Efl_Pointer_Event_Data *pd) +{ + Efl_Pointer_Event_Data *ev; + Efl_Pointer_Event *evt; + + evt = _efl_pointer_event_instance_get(EFL_POINTER_EVENT_CLASS, NULL, obj, &ev); + if (!evt) return NULL; + + memcpy(ev, pd, sizeof(*ev)); + ev->eo = evt; + + return evt; +} + EOLIAN static void _efl_pointer_event_action_set(Eo *obj EINA_UNUSED, Efl_Pointer_Event_Data *pd, Efl_Pointer_Action act) { diff --git a/src/lib/efl/interfaces/efl_pointer_event.eo b/src/lib/efl/interfaces/efl_pointer_event.eo index 05268c852e..1fa303bbd5 100644 --- a/src/lib/efl/interfaces/efl_pointer_event.eo +++ b/src/lib/efl/interfaces/efl_pointer_event.eo @@ -126,6 +126,7 @@ class Efl.Pointer.Event (Eo.Base, Efl.Event) Eo.Base.constructor; class.destructor; Efl.Event.reset; + Efl.Event.dup; Efl.Event.timestamp.set; Efl.Event.timestamp.get; Efl.Event.event_type.set; diff --git a/src/modules/ecore_evas/engines/x/ecore_evas_x.c b/src/modules/ecore_evas/engines/x/ecore_evas_x.c index 1f56aaa8a1..9d117054ed 100644 --- a/src/modules/ecore_evas/engines/x/ecore_evas_x.c +++ b/src/modules/ecore_evas/engines/x/ecore_evas_x.c @@ -1271,7 +1271,7 @@ _feed_cancel_out(const Ecore_X_Event_Mouse_Out *e, Eina_Bool cancel) */ if (cancel) { - Ecore_Event_Mouse_Button cancel = { + Ecore_Event_Mouse_Button ev = { .event_window = (Ecore_Window) e->event_win, .modifiers = e->modifiers, .timestamp = e->time, @@ -1279,7 +1279,7 @@ _feed_cancel_out(const Ecore_X_Event_Mouse_Out *e, Eina_Bool cancel) .x = e->x, .y = e->y, }; - ecore_event_evas_mouse_button_cancel(NULL, ECORE_EVENT_MOUSE_BUTTON_CANCEL, &cancel); + ecore_event_evas_mouse_button_cancel(NULL, ECORE_EVENT_MOUSE_BUTTON_CANCEL, &ev); } Ecore_Event_Mouse_IO io = { @@ -1768,7 +1768,15 @@ _ecore_evas_x_event_window_hide(void *data EINA_UNUSED, int type EINA_UNUSED, vo if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON; if (ee->in) { - _feed_cancel_out(e, EINA_TRUE); + Ecore_X_Event_Mouse_Out out = { + .event_win = e->event_win, + .modifiers = 0, + .time = e->time, + .win = e->win, + .x = 0, + .y = 0, + }; + _feed_cancel_out(&out, EINA_TRUE); if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee); if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object); ee->in = EINA_FALSE;