From 2b324779c996b38f9514c6e6f29c23b1ac6e2b28 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Fri, 15 Nov 2019 11:05:36 -0800 Subject: [PATCH] elementary: reduce events triggered by Efl.Ui.PositionManager. Reviewed-by: SangHyeon Jade Lee Reviewed-by: Marcel Hollerbach Differential Revision: https://phab.enlightenment.org/D10687 --- src/lib/elementary/efl_ui_collection.c | 1 + src/lib/elementary/efl_ui_collection_view.c | 2 ++ .../efl_ui_position_manager_data_access_v1.eo | 1 + src/lib/elementary/efl_ui_position_manager_grid.c | 9 +++++++-- src/lib/elementary/efl_ui_position_manager_list.c | 14 ++++++++++++-- .../efl_ui_test_position_manager_common.c | 1 + 6 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/lib/elementary/efl_ui_collection.c b/src/lib/elementary/efl_ui_collection.c index 3e54f79b24..43b1b19521 100644 --- a/src/lib/elementary/efl_ui_collection.c +++ b/src/lib/elementary/efl_ui_collection.c @@ -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)); diff --git a/src/lib/elementary/efl_ui_collection_view.c b/src/lib/elementary/efl_ui_collection_view.c index 14122c5771..dcf8f91462 100644 --- a/src/lib/elementary/efl_ui_collection_view.c +++ b/src/lib/elementary/efl_ui_collection_view.c @@ -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); diff --git a/src/lib/elementary/efl_ui_position_manager_data_access_v1.eo b/src/lib/elementary/efl_ui_position_manager_data_access_v1.eo index ab55c09c38..d7d42c4ad0 100644 --- a/src/lib/elementary/efl_ui_position_manager_data_access_v1.eo +++ b/src/lib/elementary/efl_ui_position_manager_data_access_v1.eo @@ -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.]] diff --git a/src/lib/elementary/efl_ui_position_manager_grid.c b/src/lib/elementary/efl_ui_position_manager_grid.c index 7b0ed303f5..949cd66e26 100644 --- a/src/lib/elementary/efl_ui_position_manager_grid.c +++ b/src/lib/elementary/efl_ui_position_manager_grid.c @@ -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)); } diff --git a/src/lib/elementary/efl_ui_position_manager_list.c b/src/lib/elementary/efl_ui_position_manager_list.c index 34d7e5f073..bd9dd95a08 100644 --- a/src/lib/elementary/efl_ui_position_manager_list.c +++ b/src/lib/elementary/efl_ui_position_manager_list.c @@ -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; diff --git a/src/tests/elementary/efl_ui_test_position_manager_common.c b/src/tests/elementary/efl_ui_test_position_manager_common.c index 63e31d472c..ea73d01e4e 100644 --- a/src/tests/elementary/efl_ui_test_position_manager_common.c +++ b/src/tests/elementary/efl_ui_test_position_manager_common.c @@ -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);