diff --git a/src/lib/elementary/efl_ui_stack.c b/src/lib/elementary/efl_ui_stack.c index 45f0bed6d4..8356b97df4 100644 --- a/src/lib/elementary/efl_ui_stack.c +++ b/src/lib/elementary/efl_ui_stack.c @@ -102,7 +102,7 @@ _content_data_del(Content_Data *cd) static void _anim_started_cb(void *data EINA_UNUSED, const Efl_Event *event) { - efl_canvas_object_freeze_events_set(efl_animation_player_target_get(event->object), EINA_TRUE); + efl_event_freeze(efl_animation_player_target_get(event->object)); } static Evas_Object* @@ -110,7 +110,7 @@ _end_anim(Transit_Data *td) { Efl_Canvas_Object *content = td->cd->content; - efl_canvas_object_freeze_events_set(content, td->freeze_events); + efl_event_thaw(content); td->cd->on_pushing = EINA_FALSE; td->cd->on_popping = EINA_FALSE; free(td); @@ -159,8 +159,6 @@ _show_content_with_anim(Efl_Ui_Stack *obj, Efl_Ui_Stack_Data *pd, Content_Data * Transit_Data *td = calloc(1, sizeof(Transit_Data)); td->cd = cd; - td->freeze_events = - efl_canvas_object_freeze_events_get(cd->content); pd->show_td = td; /* efl_ui_widget_resize_object_set() calls efl_gfx_entity_visible_set() @@ -184,7 +182,6 @@ _hide_content_with_anim(Efl_Ui_Stack *obj EINA_UNUSED, Efl_Ui_Stack_Data *pd, Co Transit_Data *td = calloc(1, sizeof(Transit_Data)); td->cd = cd; - td->freeze_events = efl_canvas_object_freeze_events_get(cd->content); pd->hide_td = td; efl_player_start(pd->hide); diff --git a/src/lib/elementary/efl_ui_stack_private.h b/src/lib/elementary/efl_ui_stack_private.h index b6b32f8e6e..f3d3b7a7c4 100644 --- a/src/lib/elementary/efl_ui_stack_private.h +++ b/src/lib/elementary/efl_ui_stack_private.h @@ -17,7 +17,6 @@ typedef struct _Transit_Data Transit_Data; struct _Transit_Data { Content_Data *cd; - Eina_Bool freeze_events; }; typedef struct _Efl_Ui_Stack_Data Efl_Ui_Stack_Data; diff --git a/src/lib/evas/Evas_Legacy.h b/src/lib/evas/Evas_Legacy.h index c83eac94e8..36c669db34 100644 --- a/src/lib/evas/Evas_Legacy.h +++ b/src/lib/evas/Evas_Legacy.h @@ -8121,6 +8121,42 @@ EAPI void evas_object_is_frame_object_set(Efl_Canvas_Object *obj, Eina_Bool is_f */ EAPI Eina_Bool evas_object_is_frame_object_get(const Efl_Canvas_Object *obj); +/** + * @brief Set whether an Evas object is to freeze (discard) events. + * + * If @c freeze is @c true, it will force events on @c obj to be discarded. + * Unlike @ref evas_object_pass_events_set, events will not be passed to next + * lower object. This API can be used for blocking events while @c obj is in + * transition. + * + * If @c freeze is @c false, events will be processed on that object as normal. + * + * @warning If you block only key/mouse up events with this API, you can't be + * sure of the state of any objects that have only key/mouse down events. + * + * @param[in] obj The object. + * @param[in] freeze Pass when @c obj is to freeze events ($true) or not + * ($false). + * + * @since 1.1 + * + * @ingroup Evas_Object_Group + */ +EAPI void evas_object_freeze_events_set(Efl_Canvas_Object *obj, Eina_Bool freeze); + +/** + * @brief Determine whether an object is set to freeze (discard) events. + * + * @param[in] obj The object. + * + * @return Pass when @c obj is to freeze events ($true) or not ($false). + * + * @since 1.1 + * + * @ingroup Evas_Object_Group + */ +EAPI Eina_Bool evas_object_freeze_events_get(const Efl_Canvas_Object *obj); + #include "canvas/efl_canvas_event_grabber.eo.legacy.h" #include "canvas/efl_canvas_animation_alpha.eo.legacy.h" diff --git a/src/lib/evas/canvas/efl_canvas_object.eo b/src/lib/evas/canvas/efl_canvas_object.eo index f66b6ac1f8..e97c0195a3 100644 --- a/src/lib/evas/canvas/efl_canvas_object.eo +++ b/src/lib/evas/canvas/efl_canvas_object.eo @@ -86,36 +86,6 @@ abstract @beta Efl.Canvas.Object extends Efl.Loop_Consumer implements Efl.Gfx.En render_op: Efl.Gfx.Render_Op; [[Blend or copy.]] } } - @property freeze_events { - set { - [[Set whether an Evas object is to freeze (discard) events. - - If $freeze is $true, it will force events on $obj to be - discarded. Unlike @.pass_events.set, events will not be - passed to next lower object. This API can be used for - blocking events while $obj is in transition. - - If $freeze is $false, events will be processed on that - object as normal. - - Warning: If you block only key/mouse up events with this API, - you can't be sure of the state of any objects that have only - key/mouse down events. - - @since 1.1 - ]] - } - get { - [[Determine whether an object is set to freeze (discard) events. - - @since 1.1 - ]] - } - values { - freeze: bool; [[Pass when $obj is to freeze events ($true) - or not ($false).]] - } - } @property clip { set { [[Clip one object to another. @@ -315,15 +285,13 @@ abstract @beta Efl.Canvas.Object extends Efl.Loop_Consumer implements Efl.Gfx.En be propagated on to the smart object of which $obj is a member. The default value is $true. - See also @.repeat_events.set, @.pass_events.set, - @.freeze_events.set. + See also @.repeat_events.set, @.pass_events.set. ]] } get { [[Retrieve whether an Evas object is set to propagate events. - See also @.repeat_events.get, @.pass_events.get, - @.freeze_events.get. + See also @.repeat_events.get, @.pass_events.get. ]] } values { @@ -342,15 +310,13 @@ abstract @beta Efl.Canvas.Object extends Efl.Loop_Consumer implements Efl.Gfx.En If $pass is $false events will be processed on that object as normal. - See also @.repeat_events.set, @.propagate_events.set, - @.freeze_events.set. + See also @.repeat_events.set, @.propagate_events.set ]] } get { [[Determine whether an object is set to pass (ignore) events. - See also @.repeat_events.get, @.propagate_events.get, - @.freeze_events.get. + See also @.repeat_events.get, @.propagate_events.get. ]] /* FIXME-doc Example: @@ -561,6 +527,8 @@ abstract @beta Efl.Canvas.Object extends Efl.Loop_Consumer implements Efl.Gfx.En Efl.Object.invalidate; Efl.Object.destructor; Efl.Object.provider_find; + Efl.Object.event_freeze; + Efl.Object.event_thaw; Efl.Object.debug_name_override; Efl.Gfx.Entity.visible { get; set; } Efl.Gfx.Color.color { get; set; } diff --git a/src/lib/evas/canvas/evas_events.c b/src/lib/evas/canvas/evas_events.c index 06d6923e6c..2a7c017fda 100644 --- a/src/lib/evas/canvas/evas_events.c +++ b/src/lib/evas/canvas/evas_events.c @@ -3715,23 +3715,47 @@ _feed_mouse_move_eval_internal(Eo *eo_obj, Evas_Object_Protected_Data *obj) evas->last_timestamp, NULL); } } - EOLIAN void -_efl_canvas_object_freeze_events_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Eina_Bool freeze) +_efl_canvas_object_efl_object_event_freeze(Eo *obj, Evas_Object_Protected_Data *pd) { - freeze = !!freeze; - if (obj->freeze_events == freeze) return; - obj->freeze_events = freeze; - evas_object_smart_member_cache_invalidate(eo_obj, EINA_FALSE, EINA_TRUE, - EINA_FALSE); - if (obj->freeze_events) return; - _feed_mouse_move_eval_internal(eo_obj, obj); + efl_event_freeze(efl_super(obj, EFL_CANVAS_OBJECT_CLASS)); + if (efl_event_freeze_count_get(obj) == 1) + { + pd->freeze_events = EINA_TRUE; + evas_object_smart_member_cache_invalidate(obj, EINA_FALSE, EINA_TRUE, + EINA_FALSE); + } } -EOLIAN Eina_Bool -_efl_canvas_object_freeze_events_get(const Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj) +EOLIAN void +_efl_canvas_object_efl_object_event_thaw(Eo *obj, Evas_Object_Protected_Data *pd) { - return obj->freeze_events; + if (efl_event_freeze_count_get(obj) == 1) + { + pd->freeze_events = EINA_FALSE; + evas_object_smart_member_cache_invalidate(obj, EINA_FALSE, EINA_TRUE, + EINA_FALSE); + _feed_mouse_move_eval_internal(obj, pd); + } + efl_event_thaw(efl_super(obj, EFL_CANVAS_OBJECT_CLASS)); +} + +EAPI void +evas_object_freeze_events_set(Eo *eo_obj, Eina_Bool freeze) +{ + if (freeze) + efl_event_freeze(eo_obj); + else + // The following check is needed, as eo does not accept more thaw calls than freeze calls. + // However, evas legacy stuff accepted multiple flase sets + if (efl_event_freeze_count_get(eo_obj) > 0) + efl_event_thaw(eo_obj); +} + +EAPI Eina_Bool +evas_object_freeze_events_get(const Eo *eo_obj EINA_UNUSED) +{ + return (efl_event_freeze_count_get(eo_obj) > 0); } EOLIAN void