forked from enlightenment/efl
efl_ui_focus_manager: allow flushing of one single node
this gives a massive performance boost
This commit is contained in:
parent
0df0d9d358
commit
be251b0496
|
@ -406,7 +406,38 @@ convert_border_set(Efl_Ui_Focus_Manager_Data *pd, Node *node, Eina_List *focusab
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
|
||||||
|
pd->dirty = eina_list_remove(pd->dirty, node);
|
||||||
|
|
||||||
|
dirty_flush_node(obj, pd, node);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dirty_flush_all(Efl_Ui_Focus_Manager *obj, Efl_Ui_Focus_Manager_Data *pd)
|
||||||
{
|
{
|
||||||
Node *node;
|
Node *node;
|
||||||
|
|
||||||
|
@ -414,22 +445,10 @@ dirty_flush(Efl_Ui_Focus_Manager *obj, Efl_Ui_Focus_Manager_Data *pd)
|
||||||
|
|
||||||
EINA_LIST_FREE(pd->dirty, node)
|
EINA_LIST_FREE(pd->dirty, node)
|
||||||
{
|
{
|
||||||
Eina_List *x_partners_pos, *x_partners_neg;
|
dirty_flush_node(obj, pd, node);
|
||||||
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
|
static void
|
||||||
dirty_add(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, Node *dirty)
|
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;
|
Border_Elements_Iterator *it;
|
||||||
|
|
||||||
dirty_flush(obj, pd);
|
dirty_flush_all(obj, pd);
|
||||||
|
|
||||||
it = calloc(1, sizeof(Border_Elements_Iterator));
|
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;
|
return NULL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dirty_flush(obj, pd, upper);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
_debug_node(upper);
|
_debug_node(upper);
|
||||||
#endif
|
#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*
|
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)
|
_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);
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(DIRECTION_CHECK(direction), NULL);
|
||||||
|
|
||||||
if (pd->redirect)
|
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));
|
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);
|
#define DIR_CLONE(dir) _convert(G(n).directions[dir].partners);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue