bu5hm4n pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=be251b04966f7bd73b4967a856269a71b3e9beab

commit be251b04966f7bd73b4967a856269a71b3e9beab
Author: Marcel Hollerbach <[email protected]>
Date:   Mon Dec 12 13:56:52 2016 +0100

    efl_ui_focus_manager: allow flushing of one single node
    
    this gives a massive performance boost
---
 src/lib/elementary/efl_ui_focus_manager.c | 58 +++++++++++++++++++++----------
 1 file 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 5140f20..e8c57a8 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);
 

-- 


Reply via email to