efl_canvas_object: remove event_freeze
authorMarcel Hollerbach <mail@marcel-hollerbach.de>
Sat, 23 Feb 2019 14:32:02 +0000 (15:32 +0100)
committerWonki Kim <wonki_.kim@samsung.com>
Fri, 8 Mar 2019 11:49:35 +0000 (20:49 +0900)
this is now done via Efl.Object.event_freeze / Efl.Object.event_thaw.

ref T7555

Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Differential Revision: https://phab.enlightenment.org/D8011

src/lib/elementary/efl_ui_stack.c
src/lib/elementary/efl_ui_stack_private.h
src/lib/evas/Evas_Legacy.h
src/lib/evas/canvas/efl_canvas_object.eo
src/lib/evas/canvas/evas_events.c

index 45f0bed..8356b97 100644 (file)
@@ -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);
index b6b32f8..f3d3b7a 100644 (file)
@@ -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;
index f2c329e..500b8d8 100755 (executable)
@@ -8364,6 +8364,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);
+
 /*********************************************************************************
  * TIZEN_ONLY(20171110): Import TIZEN_ONLY functions for
  *                       Edje textblock/text calculation/ellipsize feature.
index f66b6ac..e97c019 100644 (file)
@@ -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; }
index aa923a0..28740d2 100644 (file)
@@ -3852,23 +3852,47 @@ _feed_mouse_move_eval_internal(Eo *eo_obj, Evas_Object_Protected_Data *obj)
                                              evas->last_timestamp, NULL);
      }
 }
+EOLIAN void
+_efl_canvas_object_efl_object_event_freeze(Eo *obj, Evas_Object_Protected_Data *pd)
+{
+   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 void
-_efl_canvas_object_freeze_events_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Eina_Bool freeze)
+_efl_canvas_object_efl_object_event_thaw(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);
+   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));
 }
 
-EOLIAN Eina_Bool
-_efl_canvas_object_freeze_events_get(const Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj)
+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 obj->freeze_events;
+   return (efl_event_freeze_count_get(eo_obj) > 0);
 }
 
 EOLIAN void