From: Cedric BAIL Date: Fri, 15 Nov 2019 19:05:36 +0000 (-0800) Subject: elementary: reduce events triggered by Efl.Ui.PositionManager. X-Git-Tag: submit/tizen/20191212.210604~15 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=94dac1b3b4004861b9ad519b04097714dfff46f5;p=platform%2Fupstream%2Fefl.git elementary: reduce events triggered by Efl.Ui.PositionManager. Reviewed-by: SangHyeon Jade Lee Reviewed-by: Marcel Hollerbach Differential Revision: https://phab.enlightenment.org/D10687 Change-Id: I8e5a242d2bb1bef9d1bf1ee9461db053046edbcd --- diff --git a/src/lib/elementary/efl_ui_collection.c b/src/lib/elementary/efl_ui_collection.c index 4bee1c4..dfbd77b 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 7096714..13b6409 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 ab55c09..d7d42c4 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 7b0ed30..949cd66 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 34d7e5f..bd9dd95 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/lib/elementary/efl_wearable_position_manager_circle_list.c b/src/lib/elementary/efl_wearable_position_manager_circle_list.c index 58ab801..477ce15 100644 --- a/src/lib/elementary/efl_wearable_position_manager_circle_list.c +++ b/src/lib/elementary/efl_wearable_position_manager_circle_list.c @@ -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; 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 63e31d4..ea73d01 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);