forked from enlightenment/efl
efl_ui_focus_manager: reduce the amount of relying on events
with this commit we are not replying on event invocations anymore, but rather on direct flag observation in the focus manager itself. This reduces the amount of events that are emitted as a consequence to elements beeing marked dirty segnificantly. startup time of elementary_test goes from 0.50 to 0.46s. Differential Revision: https://phab.enlightenment.org/D12072
This commit is contained in:
parent
4e24854f46
commit
8d034f08e8
|
@ -96,6 +96,15 @@ interface Efl.Ui.Focus.Manager {
|
||||||
over the border objects.]]
|
over the border objects.]]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@property border_elements_changed {
|
||||||
|
[[Return $true if the border elements have changed since the last invocation of @.border_elements.get]]
|
||||||
|
get {
|
||||||
|
|
||||||
|
}
|
||||||
|
values {
|
||||||
|
changed : bool; [[$true if there was a change, $false if not]]
|
||||||
|
}
|
||||||
|
}
|
||||||
@property viewport_elements {
|
@property viewport_elements {
|
||||||
[[Elements that are at the border of the viewport
|
[[Elements that are at the border of the viewport
|
||||||
|
|
||||||
|
|
|
@ -85,6 +85,7 @@ typedef struct {
|
||||||
int freeze;
|
int freeze;
|
||||||
|
|
||||||
Node *root;
|
Node *root;
|
||||||
|
Eina_Bool border_elements_changed;
|
||||||
} Efl_Ui_Focus_Manager_Calc_Data;
|
} Efl_Ui_Focus_Manager_Calc_Data;
|
||||||
|
|
||||||
static Eina_Mempool *_node_mempool;
|
static Eina_Mempool *_node_mempool;
|
||||||
|
@ -247,7 +248,6 @@ node_item_free(Node *item)
|
||||||
Eina_List *l;
|
Eina_List *l;
|
||||||
Eo *obj = item->manager;
|
Eo *obj = item->manager;
|
||||||
FOCUS_DATA(obj);
|
FOCUS_DATA(obj);
|
||||||
Eina_Bool dirty_added = EINA_FALSE;
|
|
||||||
|
|
||||||
/*cleanup graph parts*/
|
/*cleanup graph parts*/
|
||||||
|
|
||||||
|
@ -264,7 +264,7 @@ node_item_free(Node *item)
|
||||||
if (partner->type != NODE_TYPE_ONLY_LOGICAL) \
|
if (partner->type != NODE_TYPE_ONLY_LOGICAL) \
|
||||||
{ \
|
{ \
|
||||||
dirty_add(obj, pd, partner); \
|
dirty_add(obj, pd, partner); \
|
||||||
dirty_added = EINA_TRUE; \
|
pd->border_elements_changed = EINA_TRUE; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -278,7 +278,7 @@ node_item_free(Node *item)
|
||||||
}
|
}
|
||||||
|
|
||||||
//the unregistering of a item should ever result in atleast a coords_dirty call
|
//the unregistering of a item should ever result in atleast a coords_dirty call
|
||||||
if (dirty_added)
|
if (pd->border_elements_changed)
|
||||||
efl_event_callback_call(obj, EFL_UI_FOCUS_MANAGER_EVENT_COORDS_DIRTY, NULL);
|
efl_event_callback_call(obj, EFL_UI_FOCUS_MANAGER_EVENT_COORDS_DIRTY, NULL);
|
||||||
|
|
||||||
/*cleanup manager householdings*/
|
/*cleanup manager householdings*/
|
||||||
|
@ -475,7 +475,9 @@ dirty_add(Eo *obj, Efl_Ui_Focus_Manager_Calc_Data *pd, Node *dirty)
|
||||||
pd->dirty = eina_list_append(pd->dirty, dirty);
|
pd->dirty = eina_list_append(pd->dirty, dirty);
|
||||||
dirty->on_list = EINA_TRUE;
|
dirty->on_list = EINA_TRUE;
|
||||||
|
|
||||||
efl_event_callback_call(obj, EFL_UI_FOCUS_MANAGER_EVENT_COORDS_DIRTY, NULL);
|
if (!pd->border_elements_changed)
|
||||||
|
efl_event_callback_call(obj, EFL_UI_FOCUS_MANAGER_EVENT_COORDS_DIRTY, NULL);
|
||||||
|
pd->border_elements_changed = EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -924,6 +926,7 @@ _efl_ui_focus_manager_calc_efl_object_constructor(Eo *obj, Efl_Ui_Focus_Manager_
|
||||||
pd->node_hash = eina_hash_pointer_new(_free_node);
|
pd->node_hash = eina_hash_pointer_new(_free_node);
|
||||||
|
|
||||||
pd->graph_ctx.offset_focusable = offsetof(Node, focusable);
|
pd->graph_ctx.offset_focusable = offsetof(Node, focusable);
|
||||||
|
pd->border_elements_changed = EINA_TRUE;
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
@ -1110,9 +1113,18 @@ _elements_iterator_new(const Eo *obj, Efl_Ui_Focus_Manager_Calc_Data *pd)
|
||||||
EOLIAN static Eina_Iterator*
|
EOLIAN static Eina_Iterator*
|
||||||
_efl_ui_focus_manager_calc_efl_ui_focus_manager_border_elements_get(const Eo *obj, Efl_Ui_Focus_Manager_Calc_Data *pd)
|
_efl_ui_focus_manager_calc_efl_ui_focus_manager_border_elements_get(const Eo *obj, Efl_Ui_Focus_Manager_Calc_Data *pd)
|
||||||
{
|
{
|
||||||
|
pd->border_elements_changed = EINA_FALSE;
|
||||||
return (Eina_Iterator*) _elements_iterator_new(obj, pd);
|
return (Eina_Iterator*) _elements_iterator_new(obj, pd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
EOLIAN static Eina_Bool
|
||||||
|
_efl_ui_focus_manager_calc_efl_ui_focus_manager_border_elements_changed_get(const Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Calc_Data *pd)
|
||||||
|
{
|
||||||
|
return pd->border_elements_changed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
EOLIAN static Eina_Iterator*
|
EOLIAN static Eina_Iterator*
|
||||||
_efl_ui_focus_manager_calc_efl_ui_focus_manager_viewport_elements_get(const Eo *obj, Efl_Ui_Focus_Manager_Calc_Data *pd, Eina_Rect viewport)
|
_efl_ui_focus_manager_calc_efl_ui_focus_manager_viewport_elements_get(const Eo *obj, Efl_Ui_Focus_Manager_Calc_Data *pd, Eina_Rect viewport)
|
||||||
{
|
{
|
||||||
|
|
|
@ -70,6 +70,7 @@ class @beta Efl.Ui.Focus.Manager_Calc extends Efl.Object implements Efl.Ui.Focus
|
||||||
Efl.Ui.Focus.Manager.manager_focus {get; set;}
|
Efl.Ui.Focus.Manager.manager_focus {get; set;}
|
||||||
Efl.Ui.Focus.Manager.redirect {set; get;}
|
Efl.Ui.Focus.Manager.redirect {set; get;}
|
||||||
Efl.Ui.Focus.Manager.border_elements {get;}
|
Efl.Ui.Focus.Manager.border_elements {get;}
|
||||||
|
Efl.Ui.Focus.Manager.border_elements_changed {get;}
|
||||||
Efl.Ui.Focus.Manager.viewport_elements {get;}
|
Efl.Ui.Focus.Manager.viewport_elements {get;}
|
||||||
Efl.Ui.Focus.Manager.root {set; get;}
|
Efl.Ui.Focus.Manager.root {set; get;}
|
||||||
Efl.Ui.Focus.Manager.request_subchild;
|
Efl.Ui.Focus.Manager.request_subchild;
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
#define MY_DATA(o, p) Efl_Ui_Focus_Manager_Sub_Data *p = efl_data_scope_get(o, MY_CLASS);
|
#define MY_DATA(o, p) Efl_Ui_Focus_Manager_Sub_Data *p = efl_data_scope_get(o, MY_CLASS);
|
||||||
typedef struct {
|
typedef struct {
|
||||||
Efl_Ui_Focus_Manager *manager;//the manager where current_border is currently registered
|
Efl_Ui_Focus_Manager *manager;//the manager where current_border is currently registered
|
||||||
Eina_Bool self_dirty;
|
|
||||||
Eina_List *current_border; //the current set of widgets which is registered as borders
|
Eina_List *current_border; //the current set of widgets which is registered as borders
|
||||||
} Efl_Ui_Focus_Manager_Sub_Data;
|
} Efl_Ui_Focus_Manager_Sub_Data;
|
||||||
|
|
||||||
|
@ -94,7 +93,6 @@ _border_flush(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd)
|
||||||
|
|
||||||
eina_list_free(pd->current_border);
|
eina_list_free(pd->current_border);
|
||||||
pd->current_border = selection;
|
pd->current_border = selection;
|
||||||
pd->self_dirty = EINA_FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -116,7 +114,7 @@ _parent_manager_pre_flush(void *data, const Efl_Event *ev EINA_UNUSED)
|
||||||
{
|
{
|
||||||
MY_DATA(data, pd);
|
MY_DATA(data, pd);
|
||||||
|
|
||||||
if (!pd->self_dirty) return; //we are not interested
|
if (!efl_ui_focus_manager_border_elements_changed_get(data)) return;
|
||||||
|
|
||||||
_border_flush(data, pd);
|
_border_flush(data, pd);
|
||||||
}
|
}
|
||||||
|
@ -151,14 +149,6 @@ EFL_CALLBACKS_ARRAY_DEFINE(parent_manager,
|
||||||
{EFL_UI_FOCUS_MANAGER_EVENT_DIRTY_LOGIC_FREEZE_CHANGED, _freeze_changed_cb}
|
{EFL_UI_FOCUS_MANAGER_EVENT_DIRTY_LOGIC_FREEZE_CHANGED, _freeze_changed_cb}
|
||||||
);
|
);
|
||||||
|
|
||||||
static void
|
|
||||||
_self_manager_dirty(void *data EINA_UNUSED, const Efl_Event *ev EINA_UNUSED)
|
|
||||||
{
|
|
||||||
MY_DATA(data, pd);
|
|
||||||
|
|
||||||
pd->self_dirty = EINA_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_logical_manager_change(void *data EINA_UNUSED, const Efl_Event *ev)
|
_logical_manager_change(void *data EINA_UNUSED, const Efl_Event *ev)
|
||||||
{
|
{
|
||||||
|
@ -217,7 +207,6 @@ _manager_change(void *data, const Efl_Event *ev EINA_UNUSED)
|
||||||
}
|
}
|
||||||
|
|
||||||
EFL_CALLBACKS_ARRAY_DEFINE(self_manager,
|
EFL_CALLBACKS_ARRAY_DEFINE(self_manager,
|
||||||
{EFL_UI_FOCUS_MANAGER_EVENT_COORDS_DIRTY, _self_manager_dirty},
|
|
||||||
{EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_PARENT_CHANGED, _logical_manager_change},
|
{EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_PARENT_CHANGED, _logical_manager_change},
|
||||||
{EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_MANAGER_CHANGED, _manager_change}
|
{EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_MANAGER_CHANGED, _manager_change}
|
||||||
);
|
);
|
||||||
|
@ -228,8 +217,6 @@ _efl_ui_focus_manager_sub_efl_object_constructor(Eo *obj, Efl_Ui_Focus_Manager_S
|
||||||
obj = efl_constructor(efl_super(obj, MY_CLASS));
|
obj = efl_constructor(efl_super(obj, MY_CLASS));
|
||||||
efl_event_callback_array_add(obj, self_manager(), obj);
|
efl_event_callback_array_add(obj, self_manager(), obj);
|
||||||
|
|
||||||
pd->self_dirty = EINA_TRUE;
|
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue