efl_ui_focus_manager: allow flushing of one single node
authorMarcel Hollerbach <marcel-hollerbach@t-online.de>
Mon, 12 Dec 2016 12:56:52 +0000 (13:56 +0100)
committerMarcel Hollerbach <marcel-hollerbach@t-online.de>
Thu, 20 Apr 2017 12:38:57 +0000 (14:38 +0200)
this gives a massive performance boost

src/lib/elementary/efl_ui_focus_manager.c

index 5140f20..e8c57a8 100644 (file)
@@ -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);