efl_ui_win: port to new focus api!

This commit is contained in:
Marcel Hollerbach 2017-09-27 01:07:20 +02:00
parent 76c202c3e5
commit 17e730e8e0
2 changed files with 26 additions and 91 deletions

View File

@ -1223,23 +1223,14 @@ _elm_win_focus_in(Ecore_Evas *ee)
ELM_WIN_DATA_ALIVE_CHECK(obj, sd);
if (sd->type != ELM_WIN_FAKE)
{
if (!elm_obj_widget_focus_order_get(obj))
Efl_Ui_Focus_Manager *man = sd->obj;
while(efl_ui_focus_manager_redirect_get(man))
{
elm_obj_widget_focus_steal(obj, NULL);
man = efl_ui_focus_manager_redirect_get(man);
}
else
{
Evas_Object *newest = NULL;
unsigned int newest_focus_order = 0;
newest = elm_widget_newest_focus_order_get
(obj, &newest_focus_order, EINA_TRUE);
if (newest &&
(_elm_widget_onscreen_is(newest) || (newest == obj)))
elm_obj_widget_focus_restore(obj);
else
evas_object_focus_set(obj, EINA_TRUE);
}
Evas_Object *focused = efl_ui_focus_manager_focus_get(man);
elm_obj_widget_on_focus_update(focused, NULL);
}
evas_object_smart_callback_call(obj, SIG_FOCUS_IN, NULL);
@ -1634,68 +1625,6 @@ _elm_win_state_change(Ecore_Evas *ee)
}
}
EOLIAN static Eina_Bool
_efl_ui_win_elm_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data *_pd EINA_UNUSED)
{
return EINA_TRUE;
}
EOLIAN static Eina_Bool
_efl_ui_win_elm_widget_focus_next(Eo *obj, Efl_Ui_Win_Data *_pd EINA_UNUSED, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
{
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
const Eina_List *items;
void *(*list_data_get)(const Eina_List *list);
/* Focus chain */
if (wd->subobjs)
{
if (!(items = elm_obj_widget_focus_custom_chain_get(obj)))
{
items = wd->subobjs;
if (!items)
return EINA_FALSE;
}
list_data_get = eina_list_data_get;
elm_widget_focus_list_next_get(obj, items, list_data_get, dir, next, next_item);
if (*next) return EINA_TRUE;
}
*next = (Evas_Object *)obj;
return EINA_FALSE;
}
EOLIAN static Eina_Bool
_efl_ui_win_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data *_pd EINA_UNUSED)
{
return EINA_TRUE;
}
EOLIAN static Eina_Bool
_efl_ui_win_elm_widget_focus_direction(Eo *obj, Efl_Ui_Win_Data *_pd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
{
const Eina_List *items;
void *(*list_data_get)(const Eina_List *list);
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
/* Focus chain */
if (wd->subobjs)
{
if (!(items = elm_obj_widget_focus_custom_chain_get(obj)))
items = wd->subobjs;
list_data_get = eina_list_data_get;
return elm_widget_focus_list_direction_get
(obj, base, items, list_data_get, degree, direction, direction_item, weight);
}
return EINA_FALSE;
}
EOLIAN static Eina_Bool
_efl_ui_win_elm_widget_on_focus_update(Eo *obj, Efl_Ui_Win_Data *sd, Elm_Object_Item *item EINA_UNUSED)
{
@ -2758,7 +2687,8 @@ _win_img_hide(void *data,
Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
elm_obj_widget_focus_hide_handle(data);
Efl_Ui_Win *real_win = elm_widget_top_get(data);
efl_ui_focus_manager_redirect_set(real_win, NULL);
}
static void
@ -2778,7 +2708,9 @@ _win_img_focus_in(void *data,
Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
elm_obj_widget_focus_steal(data, NULL);
Efl_Ui_Win *real_win = elm_widget_top_get(data);
efl_ui_focus_manager_redirect_set(real_win, data);
efl_ui_focus_manager_focus_set(data, efl_ui_focus_manager_root_get(data));
}
static void
@ -2787,7 +2719,8 @@ _win_img_focus_out(void *data,
Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
elm_obj_widget_focused_object_clear(data);
Efl_Ui_Win *real_win = elm_widget_top_get(data);
efl_ui_focus_manager_redirect_set(real_win, NULL);
}
static void
@ -3679,11 +3612,7 @@ _elm_win_translate(void)
void
_elm_win_focus_reconfigure(void)
{
const Eina_List *l;
Evas_Object *obj;
EINA_LIST_FOREACH(_elm_win_list, l, obj)
elm_obj_widget_focus_reconfigure(obj);
/* FOCUS-FIXME */
}
#ifdef HAVE_ELEMENTARY_X
@ -5041,6 +4970,8 @@ _elm_win_finalize_internal(Eo *obj, Efl_Ui_Win_Data *sd, const char *name, Elm_W
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
evas_object_focus_set(obj, EINA_TRUE);
if (getenv("ELM_FIRST_FRAME"))
evas_event_callback_add(ecore_evas_get(tmp_sd.ee), EVAS_CALLBACK_RENDER_POST,
_elm_win_first_frame_do, getenv("ELM_FIRST_FRAME"));
@ -6692,12 +6623,20 @@ _on_atspi_bus_connected(void *data EINA_UNUSED, const Efl_Event *event EINA_UNUS
efl_access_window_created_signal_emit(win);
if (elm_win_focus_get(win))
{
Evas_Object *target;
efl_access_window_activated_signal_emit(win);
/** Reemit focused event to inform atspi clients about currently
* focused object **/
unsigned int order = 0;
Evas_Object *target;
target = elm_widget_newest_focus_order_get(win, &order, EINA_TRUE);
{
Efl_Ui_Focus_Manager *m;
m = win;
while (efl_ui_focus_manager_redirect_get(m))
m = efl_ui_focus_manager_redirect_get(m);
target = efl_ui_focus_manager_focus_get(m);
}
if (target)
elm_interface_atspi_accessible_state_changed_signal_emit(target, ELM_ATSPI_STATE_FOCUSED, EINA_TRUE);
}

View File

@ -822,10 +822,6 @@ class Efl.Ui.Win (Elm.Widget, Efl.Canvas, Efl.Access.Window,
Efl.Gfx.Stack.raise; [[Places the window at the top of the stack, so
that it's not covered by any other window.]]
Efl.Gfx.Stack.lower; [[This action is ignored by the Window.]]
Elm.Widget.focus_direction;
Elm.Widget.focus_next_manager_is;
Elm.Widget.focus_direction_manager_is;
Elm.Widget.focus_next;
Elm.Widget.theme_apply;
Elm.Widget.focus { get; }
Elm.Widget.focus_highlight_style { get; set; }