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:
Marcel Hollerbach 2017-10-27 10:02:17 +02:00
parent 3139b0f7f5
commit acb469439f
4 changed files with 25 additions and 6 deletions

View File

@ -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]]
} }
} }

View File

@ -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*

View File

@ -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))
{ {

View File

@ -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;