diff options
author | Marcel Hollerbach <marcel-hollerbach@t-online.de> | 2016-12-12 13:56:52 +0100 |
---|---|---|
committer | Marcel Hollerbach <marcel-hollerbach@t-online.de> | 2017-04-19 13:31:58 +0200 |
commit | 0e2922a9c6c2c2f6b36e1ecc136d0ecd3be7b3fe (patch) | |
tree | d9a3ae3764763ecc8583398e920503c8c7a99e9d | |
parent | 2c09acc75a324496553060ac6ad9af706f157a3a (diff) | |
download | efl-0e2922a9c6c2c2f6b36e1ecc136d0ecd3be7b3fe.tar.gz |
efl_ui_focus_manager: allow flushing of one single node
this gives a massive performance boost
-rw-r--r-- | src/lib/elementary/efl_ui_focus_manager.c | 58 |
1 files changed, 39 insertions, 19 deletions
diff --git a/src/lib/elementary/efl_ui_focus_manager.c b/src/lib/elementary/efl_ui_focus_manager.c index 5140f20c6b..e8c57a8318 100644 --- a/src/lib/elementary/efl_ui_focus_manager.c +++ b/src/lib/elementary/efl_ui_focus_manager.c @@ -406,30 +406,49 @@ convert_border_set(Efl_Ui_Focus_Manager_Data *pd, Node *node, Eina_List *focusab } static void -dirty_flush(Efl_Ui_Focus_Manager *obj, Efl_Ui_Focus_Manager_Data *pd) +dirty_flush_node(Efl_Ui_Focus_Manager *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Data *pd, Node *node) { - Node *node; + Eina_List *x_partners_pos, *x_partners_neg; + Eina_List *y_partners_pos, *y_partners_neg; + + _calculate_node(pd, node->focusable, DIMENSION_X, &x_partners_pos, &x_partners_neg); + _calculate_node(pd, node->focusable, DIMENSION_Y, &y_partners_pos, &y_partners_neg); + + convert_border_set(pd, node, x_partners_pos, EFL_UI_FOCUS_DIRECTION_RIGHT); + convert_border_set(pd, node, x_partners_neg, EFL_UI_FOCUS_DIRECTION_LEFT); + convert_border_set(pd, node, y_partners_neg, EFL_UI_FOCUS_DIRECTION_UP); + convert_border_set(pd, node, y_partners_pos, EFL_UI_FOCUS_DIRECTION_DOWN); + +#ifdef DEBUG + _debug_node(node); +#endif +} + +static void +dirty_flush(Efl_Ui_Focus_Manager *obj, Efl_Ui_Focus_Manager_Data *pd, Node *node) +{ + if (!eina_list_data_find(pd->dirty, node)) return; efl_event_callback_call(obj, EFL_UI_FOCUS_MANAGER_EVENT_PRE_FLUSH, NULL); - EINA_LIST_FREE(pd->dirty, node) - { - Eina_List *x_partners_pos, *x_partners_neg; - Eina_List *y_partners_pos, *y_partners_neg; + pd->dirty = eina_list_remove(pd->dirty, node); - _calculate_node(pd, node->focusable, DIMENSION_X, &x_partners_pos, &x_partners_neg); - _calculate_node(pd, node->focusable, DIMENSION_Y, &y_partners_pos, &y_partners_neg); + dirty_flush_node(obj, pd, node); +} - convert_border_set(pd, node, x_partners_pos, EFL_UI_FOCUS_DIRECTION_RIGHT); - convert_border_set(pd, node, x_partners_neg, EFL_UI_FOCUS_DIRECTION_LEFT); - convert_border_set(pd, node, y_partners_neg, EFL_UI_FOCUS_DIRECTION_UP); - convert_border_set(pd, node, y_partners_pos, EFL_UI_FOCUS_DIRECTION_DOWN); +static void +dirty_flush_all(Efl_Ui_Focus_Manager *obj, Efl_Ui_Focus_Manager_Data *pd) +{ + Node *node; -#ifdef DEBUG - _debug_node(node); -#endif + efl_event_callback_call(obj, EFL_UI_FOCUS_MANAGER_EVENT_PRE_FLUSH, NULL); + + EINA_LIST_FREE(pd->dirty, node) + { + dirty_flush_node(obj, pd, node); } } + static void dirty_add(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, Node *dirty) { @@ -781,7 +800,7 @@ _efl_ui_focus_manager_border_elements_get(Eo *obj, Efl_Ui_Focus_Manager_Data *pd { Border_Elements_Iterator *it; - dirty_flush(obj, pd); + dirty_flush_all(obj, pd); it = calloc(1, sizeof(Border_Elements_Iterator)); @@ -957,6 +976,9 @@ _request_move(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus_D return NULL; } + + dirty_flush(obj, pd, upper); + #ifdef DEBUG _debug_node(upper); #endif @@ -976,8 +998,6 @@ _request_move(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus_D EOLIAN static Efl_Ui_Focus_Object* _efl_ui_focus_manager_request_move(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus_Direction direction) { - dirty_flush(obj, pd); - EINA_SAFETY_ON_FALSE_RETURN_VAL(DIRECTION_CHECK(direction), NULL); if (pd->redirect) @@ -1163,7 +1183,7 @@ _efl_ui_focus_manager_fetch(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus res = calloc(1, sizeof(Efl_Ui_Focus_Relations)); - dirty_flush(obj, pd); + dirty_flush(obj, pd, n); #define DIR_CLONE(dir) _convert(G(n).directions[dir].partners); |