efl_ui_focus_manager: the FOCUSED event now carries the last focused
object This is usefull to react on focused events
This commit is contained in:
parent
3139b0f7f5
commit
acb469439f
|
@ -154,6 +154,6 @@ interface Efl.Ui.Focus.Manager {
|
||||||
coords,dirty; [[Emitted once the graph is dirty, this means there are
|
coords,dirty; [[Emitted once the graph is dirty, this means there are
|
||||||
potential changes in border_elements you want to know about]]
|
potential changes in border_elements you want to know about]]
|
||||||
focused : Efl.Ui.Focus.Object; [[Emitted if the manager has focused an
|
focused : Efl.Ui.Focus.Object; [[Emitted if the manager has focused an
|
||||||
object]]
|
object, the passed focus object is the last focused object]]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1311,6 +1311,7 @@ EOLIAN static void
|
||||||
_efl_ui_focus_manager_calc_efl_ui_focus_manager_focus_set(Eo *obj, Efl_Ui_Focus_Manager_Calc_Data *pd, Efl_Ui_Focus_Object *focus)
|
_efl_ui_focus_manager_calc_efl_ui_focus_manager_focus_set(Eo *obj, Efl_Ui_Focus_Manager_Calc_Data *pd, Efl_Ui_Focus_Object *focus)
|
||||||
{
|
{
|
||||||
Node *node;
|
Node *node;
|
||||||
|
Efl_Ui_Focus_Object *last_focusable;
|
||||||
Efl_Ui_Focus_Manager *redirect_manager;
|
Efl_Ui_Focus_Manager *redirect_manager;
|
||||||
Eo *focusable;
|
Eo *focusable;
|
||||||
Node_Type type;
|
Node_Type type;
|
||||||
|
@ -1366,6 +1367,9 @@ _efl_ui_focus_manager_calc_efl_ui_focus_manager_focus_set(Eo *obj, Efl_Ui_Focus_
|
||||||
type = node->type;
|
type = node->type;
|
||||||
focusable = node->focusable;
|
focusable = node->focusable;
|
||||||
|
|
||||||
|
if (pd->focus_stack)
|
||||||
|
last_focusable = ((Node*)eina_list_last_data_get(pd->focus_stack))->focusable;
|
||||||
|
|
||||||
_focus_stack_unfocus_last(pd);
|
_focus_stack_unfocus_last(pd);
|
||||||
|
|
||||||
if (node->type == NODE_TYPE_NORMAL)
|
if (node->type == NODE_TYPE_NORMAL)
|
||||||
|
@ -1377,13 +1381,17 @@ _efl_ui_focus_manager_calc_efl_ui_focus_manager_focus_set(Eo *obj, Efl_Ui_Focus_
|
||||||
|
|
||||||
//populate the new change
|
//populate the new change
|
||||||
efl_ui_focus_object_focus_set(node->focusable, EINA_TRUE);
|
efl_ui_focus_object_focus_set(node->focusable, EINA_TRUE);
|
||||||
efl_event_callback_call(obj, EFL_UI_FOCUS_MANAGER_EVENT_FOCUSED, node_focusable);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//remove the object from the list and add it again
|
//remove the object from the list and add it again
|
||||||
pd->focus_stack = eina_list_remove(pd->focus_stack, node);
|
pd->focus_stack = eina_list_remove(pd->focus_stack, node);
|
||||||
pd->focus_stack = eina_list_append(pd->focus_stack, node);
|
pd->focus_stack = eina_list_append(pd->focus_stack, node);
|
||||||
|
|
||||||
|
if (node->type == NODE_TYPE_NORMAL)
|
||||||
|
{
|
||||||
|
efl_event_callback_call(obj, EFL_UI_FOCUS_MANAGER_EVENT_FOCUSED, last_focusable);
|
||||||
|
}
|
||||||
|
|
||||||
//set to NULL here, from the event earlier this pointer could be dead.
|
//set to NULL here, from the event earlier this pointer could be dead.
|
||||||
node = NULL;
|
node = NULL;
|
||||||
|
|
||||||
|
@ -1620,24 +1628,34 @@ _efl_ui_focus_manager_calc_efl_ui_focus_manager_logical_end(Eo *obj EINA_UNUSED,
|
||||||
EOLIAN static void
|
EOLIAN static void
|
||||||
_efl_ui_focus_manager_calc_efl_ui_focus_manager_reset_history(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Calc_Data *pd)
|
_efl_ui_focus_manager_calc_efl_ui_focus_manager_reset_history(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Calc_Data *pd)
|
||||||
{
|
{
|
||||||
|
Efl_Ui_Focus_Object *last_focusable;
|
||||||
|
|
||||||
if (!pd->focus_stack) return;
|
if (!pd->focus_stack) return;
|
||||||
|
|
||||||
|
last_focusable = ((Node*)eina_list_last_data_get(pd->focus_stack))->focusable;
|
||||||
|
|
||||||
_focus_stack_unfocus_last(pd);
|
_focus_stack_unfocus_last(pd);
|
||||||
|
|
||||||
pd->focus_stack = eina_list_free(pd->focus_stack);
|
pd->focus_stack = eina_list_free(pd->focus_stack);
|
||||||
|
|
||||||
|
efl_event_callback_call(obj, EFL_UI_FOCUS_MANAGER_EVENT_FOCUSED, last_focusable);
|
||||||
}
|
}
|
||||||
|
|
||||||
EOLIAN static void
|
EOLIAN static void
|
||||||
_efl_ui_focus_manager_calc_efl_ui_focus_manager_pop_history_stack(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Calc_Data *pd)
|
_efl_ui_focus_manager_calc_efl_ui_focus_manager_pop_history_stack(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Calc_Data *pd)
|
||||||
{
|
{
|
||||||
|
Efl_Ui_Focus_Object *last_focusable;
|
||||||
Node *last;
|
Node *last;
|
||||||
|
|
||||||
if (!pd->focus_stack) return;
|
if (!pd->focus_stack) return;
|
||||||
_focus_stack_unfocus_last(pd);
|
_focus_stack_unfocus_last(pd);
|
||||||
|
|
||||||
|
last_focusable = ((Node*)eina_list_last_data_get(pd->focus_stack))->focusable;
|
||||||
|
|
||||||
//get now the highest, and unfocus that!
|
//get now the highest, and unfocus that!
|
||||||
last = eina_list_last_data_get(pd->focus_stack);
|
last = eina_list_last_data_get(pd->focus_stack);
|
||||||
if (last) efl_ui_focus_object_focus_set(last->focusable, EINA_TRUE);
|
if (last) efl_ui_focus_object_focus_set(last->focusable, EINA_TRUE);
|
||||||
|
efl_event_callback_call(obj, EFL_UI_FOCUS_MANAGER_EVENT_FOCUSED, last_focusable);
|
||||||
}
|
}
|
||||||
|
|
||||||
EOLIAN static Efl_Ui_Focus_Object*
|
EOLIAN static Efl_Ui_Focus_Object*
|
||||||
|
|
|
@ -4235,12 +4235,13 @@ static void
|
||||||
_gengrid_element_focused(void *data, const Efl_Event *ev)
|
_gengrid_element_focused(void *data, const Efl_Event *ev)
|
||||||
{
|
{
|
||||||
ELM_GENGRID_DATA_GET(data, pd);
|
ELM_GENGRID_DATA_GET(data, pd);
|
||||||
|
Elm_Widget *focused = efl_ui_focus_manager_focus_get(ev->object);
|
||||||
Elm_Widget_Item *item;
|
Elm_Widget_Item *item;
|
||||||
|
|
||||||
if (efl_isa(ev->info, EFL_UI_FOCUS_COMPOSITION_ADAPTER_CLASS))
|
if (efl_isa(focused, EFL_UI_FOCUS_COMPOSITION_ADAPTER_CLASS))
|
||||||
item = efl_parent_get(ev->info);
|
item = efl_parent_get(focused);
|
||||||
else
|
else
|
||||||
item = efl_ui_focus_parent_provider_find_logical_parent(pd->provider, ev->info);
|
item = efl_ui_focus_parent_provider_find_logical_parent(pd->provider, focused);
|
||||||
|
|
||||||
if (efl_isa(item, ELM_GENGRID_ITEM_CLASS))
|
if (efl_isa(item, ELM_GENGRID_ITEM_CLASS))
|
||||||
{
|
{
|
||||||
|
|
|
@ -856,7 +856,7 @@ _focused_element(void *data, const Efl_Event *event)
|
||||||
{
|
{
|
||||||
Eina_Rect geom;
|
Eina_Rect geom;
|
||||||
Efl_Ui_Focus_Object *obj = data;
|
Efl_Ui_Focus_Object *obj = data;
|
||||||
Efl_Ui_Focus_Object *focus = event->info;
|
Efl_Ui_Focus_Object *focus = efl_ui_focus_manager_focus_get(event->object);
|
||||||
Elm_Scrollable_Smart_Interface_Data *pd;
|
Elm_Scrollable_Smart_Interface_Data *pd;
|
||||||
Eina_Position2D pos;
|
Eina_Position2D pos;
|
||||||
int pan_x, pan_y;
|
int pan_x, pan_y;
|
||||||
|
|
Loading…
Reference in New Issue