elementary: reduce events triggered by Efl.Ui.PositionManager. 71/219971/2
authorCedric BAIL <cedric.bail@free.fr>
Fri, 15 Nov 2019 19:05:36 +0000 (11:05 -0800)
committerkim hosang <hosang12.kim@samsung.com>
Thu, 12 Dec 2019 05:43:05 +0000 (05:43 +0000)
Reviewed-by: SangHyeon Jade Lee <sh10233.lee@samsung.com>
Reviewed-by: Marcel Hollerbach <mail@marcel-hollerbach.de>
Differential Revision: https://phab.enlightenment.org/D10687

Change-Id: I8e5a242d2bb1bef9d1bf1ee9461db053046edbcd

src/lib/elementary/efl_ui_collection.c
src/lib/elementary/efl_ui_collection_view.c
src/lib/elementary/efl_ui_position_manager_data_access_v1.eo
src/lib/elementary/efl_ui_position_manager_grid.c
src/lib/elementary/efl_ui_position_manager_list.c
src/lib/elementary/efl_wearable_position_manager_circle_list.c
src/tests/elementary/efl_ui_test_position_manager_common.c

index 4bee1c4..dfbd77b 100644 (file)
@@ -961,6 +961,7 @@ _efl_ui_collection_position_manager_set(Eo *obj, Efl_Ui_Collection_Data *pd, Efl
           {
             case 1:
               efl_ui_position_manager_data_access_v1_data_access_set(pd->pos_man,
+                efl_provider_find(obj, EFL_UI_WIN_CLASS),
                 &pd->obj_accessor, _obj_accessor_get_at, NULL,
                 &pd->size_accessor, _size_accessor_get_at, NULL,
                 eina_list_count(pd->items));
index 7096714..13b6409 100644 (file)
@@ -1648,6 +1648,7 @@ _efl_ui_collection_view_position_manager_set(Eo *obj, Efl_Ui_Collection_View_Dat
           {
             case 1:
               efl_ui_position_manager_data_access_v1_data_access_set(pd->manager,
+                efl_provider_find(obj, EFL_UI_WIN_CLASS),
                 efl_ref(obj), _batch_entity_cb, _unref_cb,
                 efl_ref(obj), _batch_size_cb, _unref_cb,
                 count);
@@ -1992,6 +1993,7 @@ _efl_ui_collection_view_model_changed(void *data, const Efl_Event *event)
      {
        case 1:
          efl_ui_position_manager_data_access_v1_data_access_set(pd->manager,
+           efl_provider_find(data, EFL_UI_WIN_CLASS),
            efl_ref(data), _batch_entity_cb, _unref_cb,
            efl_ref(data), _batch_size_cb, _unref_cb,
            count);
index ab55c09..d7d42c4 100644 (file)
@@ -116,6 +116,7 @@ interface @beta Efl.Ui.Position_Manager.Data_Access_V1 {
          set {
          }
          values {
+           canvas: Efl.Ui.Win; [[Will use this object to freeze/thaw canvas events.]]
            obj_access : Efl.Ui.Position_Manager.Object_Batch_Callback; [[Function callback for canvas objects, even if
                                                                          the start_id is valid, the returned objects
                                                                          may be $NULL.]]
index 7b0ed30..949cd66 100644 (file)
@@ -30,6 +30,8 @@ typedef struct {
    Eina_Bool size_cache_dirty;
    Eo *last_group;
    Eina_Future *rebuild_absolut_size;
+   Efl_Ui_Win *window;
+   Evas *canvas;
    Api_Callbacks callbacks;
 } Efl_Ui_Position_Manager_Grid_Data;
 
@@ -769,7 +771,7 @@ _efl_ui_position_manager_grid_efl_ui_position_manager_entity_version(Eo *obj EIN
 }
 
 EOLIAN static void
-_efl_ui_position_manager_grid_efl_ui_position_manager_data_access_v1_data_access_set(Eo *obj, Efl_Ui_Position_Manager_Grid_Data *pd, void *obj_access_data, Efl_Ui_Position_Manager_Object_Batch_Callback obj_access, Eina_Free_Cb obj_access_free_cb, void *size_access_data, Efl_Ui_Position_Manager_Size_Batch_Callback size_access, Eina_Free_Cb size_access_free_cb, int size)
+_efl_ui_position_manager_grid_efl_ui_position_manager_data_access_v1_data_access_set(Eo *obj, Efl_Ui_Position_Manager_Grid_Data *pd, Efl_Ui_Win *canvas, void *obj_access_data, Efl_Ui_Position_Manager_Object_Batch_Callback obj_access, Eina_Free_Cb obj_access_free_cb, void *size_access_data, Efl_Ui_Position_Manager_Size_Batch_Callback size_access, Eina_Free_Cb size_access_free_cb, int size)
 {
    // Cleanup cache first
    _group_cache_invalidate(obj, pd);
@@ -781,6 +783,9 @@ _efl_ui_position_manager_grid_efl_ui_position_manager_data_access_v1_data_access
      pd->callbacks.size.free_cb(pd->callbacks.size.data);
 
    // Set them
+   efl_replace(&pd->window, canvas);
+   efl_replace(&pd->canvas, canvas ? evas_object_evas_get(canvas) : NULL);
+
    pd->callbacks.object.data = obj_access_data;
    pd->callbacks.object.access = obj_access;
    pd->callbacks.object.free_cb = obj_access_free_cb;
@@ -797,7 +802,7 @@ EOLIAN static void
 _efl_ui_position_manager_grid_efl_object_invalidate(Eo *obj,
                                                     Efl_Ui_Position_Manager_Grid_Data *pd EINA_UNUSED)
 {
-   efl_ui_position_manager_data_access_v1_data_access_set(obj, NULL, NULL, NULL, NULL, NULL, NULL, 0);
+   efl_ui_position_manager_data_access_v1_data_access_set(obj, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0);
 
    efl_invalidate(efl_super(obj, EFL_UI_POSITION_MANAGER_GRID_CLASS));
 }
index 34d7e5f..bd9dd95 100644 (file)
@@ -25,6 +25,8 @@ typedef struct {
    int maximum_min_size;
    Vis_Segment prev_run;
    Efl_Gfx_Entity *last_group;
+   Efl_Ui_Win *window;
+   Evas *canvas;
    Api_Callbacks callbacks;
 } Efl_Ui_Position_Manager_List_Data;
 
@@ -193,6 +195,8 @@ _position_items(Eo *obj EINA_UNUSED, Efl_Ui_Position_Manager_List_Data *pd, Vis_
    else
      geom.x -= (relevant_space_size - cache_access(obj, pd, new.start_id));
 
+   evas_event_freeze(pd->canvas);
+
    for (i = new.start_id; i < new.end_id; ++i)
      {
         Eina_Size2D size;
@@ -291,6 +295,9 @@ _position_items(Eo *obj EINA_UNUSED, Efl_Ui_Position_Manager_List_Data *pd, Vis_
 
    efl_gfx_entity_position_set(first_group, first_group_pos);
    efl_gfx_entity_size_set(first_group, first_group_size);
+
+   evas_event_thaw(pd->canvas);
+   evas_event_thaw_eval(pd->canvas);
 }
 
 
@@ -503,7 +510,7 @@ _efl_ui_position_manager_list_efl_object_invalidate(Eo *obj, Efl_Ui_Position_Man
    if (pd->rebuild_absolut_size)
      eina_future_cancel(pd->rebuild_absolut_size);
 
-   efl_ui_position_manager_data_access_v1_data_access_set(obj, NULL, NULL, NULL, NULL, NULL, NULL, 0);
+   efl_ui_position_manager_data_access_v1_data_access_set(obj, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0);
 
    efl_invalidate(efl_super(obj, MY_CLASS));
 }
@@ -542,7 +549,7 @@ _efl_ui_position_manager_list_efl_ui_position_manager_entity_version(Eo *obj EIN
 }
 
 EOLIAN static void
-_efl_ui_position_manager_list_efl_ui_position_manager_data_access_v1_data_access_set(Eo *obj, Efl_Ui_Position_Manager_List_Data *pd, void *obj_access_data, Efl_Ui_Position_Manager_Object_Batch_Callback obj_access, Eina_Free_Cb obj_access_free_cb, void *size_access_data, Efl_Ui_Position_Manager_Size_Batch_Callback size_access, Eina_Free_Cb size_access_free_cb, int size)
+_efl_ui_position_manager_list_efl_ui_position_manager_data_access_v1_data_access_set(Eo *obj, Efl_Ui_Position_Manager_List_Data *pd, Efl_Ui_Win *canvas, void *obj_access_data, Efl_Ui_Position_Manager_Object_Batch_Callback obj_access, Eina_Free_Cb obj_access_free_cb, void *size_access_data, Efl_Ui_Position_Manager_Size_Batch_Callback size_access, Eina_Free_Cb size_access_free_cb, int size)
 {
    // Cleanup cache first
    cache_invalidate(obj, pd);
@@ -554,6 +561,9 @@ _efl_ui_position_manager_list_efl_ui_position_manager_data_access_v1_data_access
      pd->callbacks.size.free_cb(pd->callbacks.size.data);
 
    // Set them
+   efl_replace(&pd->window, canvas);
+   efl_replace(&pd->canvas, canvas ? evas_object_evas_get(canvas) : NULL);
+
    pd->callbacks.object.data = obj_access_data;
    pd->callbacks.object.access = obj_access;
    pd->callbacks.object.free_cb = obj_access_free_cb;
index 58ab801..477ce15 100644 (file)
@@ -29,6 +29,8 @@ typedef struct {
    int maximum_min_size;
    Vis_Segment prev_run;
    Efl_Gfx_Entity *last_group;
+   Efl_Ui_Win *window;
+   Evas *canvas;
    Api_Callbacks callbacks;
 } Efl_Wearable_Position_Manager_Circle_List_Data;
 
@@ -197,6 +199,8 @@ _position_items(Eo *obj EINA_UNUSED, Efl_Wearable_Position_Manager_Circle_List_D
    else
      geom.x -= (relevant_space_size - cache_access(obj, pd, new.start_id));
 
+   evas_event_freeze(pd->canvas);
+
    for (i = new.start_id; i < new.end_id; ++i)
      {
         Eina_Size2D size;
@@ -353,6 +357,9 @@ _position_items(Eo *obj EINA_UNUSED, Efl_Wearable_Position_Manager_Circle_List_D
 
    efl_gfx_entity_position_set(first_group, first_group_pos);
    efl_gfx_entity_size_set(first_group, first_group_size);
+
+   evas_event_thaw(pd->canvas);
+   evas_event_thaw_eval(pd->canvas);
 }
 
 
@@ -565,7 +572,7 @@ _efl_wearable_position_manager_circle_list_efl_object_invalidate(Eo *obj, Efl_We
    if (pd->rebuild_absolut_size)
      eina_future_cancel(pd->rebuild_absolut_size);
 
-   efl_ui_position_manager_data_access_v1_data_access_set(obj, NULL, NULL, NULL, NULL, NULL, NULL, 0);
+   efl_ui_position_manager_data_access_v1_data_access_set(obj, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0);
 
    efl_invalidate(efl_super(obj, MY_CLASS));
 }
@@ -604,7 +611,7 @@ _efl_wearable_position_manager_circle_list_efl_ui_position_manager_entity_versio
 }
 
 EOLIAN static void
-_efl_wearable_position_manager_circle_list_efl_ui_position_manager_data_access_v1_data_access_set(Eo *obj, Efl_Wearable_Position_Manager_Circle_List_Data *pd, void *obj_access_data, Efl_Ui_Position_Manager_Object_Batch_Callback obj_access, Eina_Free_Cb obj_access_free_cb, void *size_access_data, Efl_Ui_Position_Manager_Size_Batch_Callback size_access, Eina_Free_Cb size_access_free_cb, int size)
+_efl_wearable_position_manager_circle_list_efl_ui_position_manager_data_access_v1_data_access_set(Eo *obj, Efl_Wearable_Position_Manager_Circle_List_Data *pd, Efl_Ui_Win *canvas, void *obj_access_data, Efl_Ui_Position_Manager_Object_Batch_Callback obj_access, Eina_Free_Cb obj_access_free_cb, void *size_access_data, Efl_Ui_Position_Manager_Size_Batch_Callback size_access, Eina_Free_Cb size_access_free_cb, int size)
 {
    // Cleanup cache first
    cache_invalidate(obj, pd);
@@ -616,6 +623,9 @@ _efl_wearable_position_manager_circle_list_efl_ui_position_manager_data_access_v
      pd->callbacks.size.free_cb(pd->callbacks.size.data);
 
    // Set them
+   efl_replace(&pd->window, canvas);
+   efl_replace(&pd->canvas, canvas ? evas_object_evas_get(canvas) : NULL);
+
    pd->callbacks.object.data = obj_access_data;
    pd->callbacks.object.access = obj_access;
    pd->callbacks.object.free_cb = obj_access_free_cb;
index 63e31d4..ea73d01 100644 (file)
@@ -71,6 +71,7 @@ _initial_setup(void)
    arr_size = eina_inarray_new(sizeof(Eina_Size2D), 10);
 
    efl_ui_position_manager_data_access_v1_data_access_set(position_manager,
+      win,
       NULL, _obj_accessor_get_at, NULL,
       NULL, _size_accessor_get_at, NULL,
       0);