this emits focus and unfocus on those widgets.
fixes T7386
Depends on D7124
Differential Revision: https://phab.enlightenment.org/D7103
_efl_ui_button_legacy_efl_object_constructor(Eo *obj, void *_pd EINA_UNUSED)
{
obj = efl_constructor(efl_super(obj, EFL_UI_BUTTON_LEGACY_CLASS));
+ legacy_object_focus_handle(obj);
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
return obj;
}
{
obj = efl_constructor(efl_super(obj, EFL_UI_CHECK_LEGACY_CLASS));
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
+ legacy_object_focus_handle(obj);
return obj;
}
obj = efl_constructor(efl_super(obj, MY_CLASS));
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_IMAGE);
-
+ legacy_object_focus_handle(obj);
return obj;
}
{
obj = efl_constructor(efl_super(obj, EFL_UI_PROGRESSBAR_LEGACY_CLASS));
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
+ legacy_object_focus_handle(obj);
return obj;
}
{
obj = efl_constructor(efl_super(obj, EFL_UI_RADIO_LEGACY_CLASS));
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
+ legacy_object_focus_handle(obj);
return obj;
}
{
obj = efl_constructor(efl_super(obj, EFL_UI_VIDEO_LEGACY_CLASS));
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
+ legacy_object_focus_handle(obj);
+
return obj;
}
/* Widget Shadow End */
-
/* Efl.Part implementation */
EOLIAN static Efl_Object *
_elm_fileselector_efl_object_constructor(Eo *obj, Elm_Fileselector_Data *sd)
{
obj = efl_constructor(efl_super(obj, MY_CLASS));
+ legacy_child_focus_handle(obj);
sd->obj = obj;
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_PUSH_BUTTON);
+ legacy_object_focus_handle(obj);
return obj;
}
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_GROUPING);
+ legacy_child_focus_handle(obj);
return obj;
}
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_PUSH_BUTTON);
+ legacy_object_focus_handle(obj);
return obj;
}
EOLIAN static Eo *
_elm_multibuttonentry_efl_object_constructor(Eo *obj, Elm_Multibuttonentry_Data *sd EINA_UNUSED)
{
+
+ legacy_child_focus_handle(obj);
obj = efl_constructor(efl_super(obj, MY_CLASS));
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_PANEL);
- //listen to manager changes here
- efl_event_callback_add(obj, EFL_UI_FOCUS_OBJECT_EVENT_MANAGER_CHANGED, _legacy_manager_changed_cb, NULL);
-
return obj;
}
{
obj = efl_constructor(efl_super(obj, MY_CLASS));
sd->obj = obj;
+ legacy_child_focus_handle(obj);
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_PAGE_TAB_LIST);
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_DIALOG);
+ legacy_object_focus_handle(obj);
return obj;
}
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_TEXT);
+ legacy_child_focus_handle(obj);
return obj;
}
Elm.Widget.Item.item_focus { get; set; }
Efl.Ui.Focus.Object.focus { set; }
Efl.Ui.Focus.Object.focus_geometry { get; }
+ Efl.Ui.Focus.Object.focus_parent { get; }
+ Efl.Ui.Focus.Object.focus_manager { get; }
Efl.Access.Object.state_set { get; }
Efl.Access.Object.i18n_name { get; }
Efl.Access.Widget.Action.elm_actions { get; }
Evas_Object *obj;
obj = efl_parent_get(eo_item);
-
+ WIDGET(item) = obj;
VIEW_SET(item, elm_layout_add(obj));
if (!elm_layout_theme_set
(VIEW(item), "colorselector", "item", elm_widget_style_get(obj)))
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_COLOR_CHOOSER);
+ legacy_child_focus_handle(obj);
return obj;
}
}
//
+EOLIAN static Efl_Ui_Focus_Object*
+_elm_color_item_efl_ui_focus_object_focus_parent_get(const Eo *obj EINA_UNUSED, Elm_Color_Item_Data *pd)
+{
+ return WIDGET(pd);
+}
+
+EOLIAN static Efl_Ui_Focus_Manager*
+_elm_color_item_efl_ui_focus_object_focus_manager_get(const Eo *obj, Elm_Color_Item_Data *pd)
+{
+ return efl_ui_focus_object_focus_manager_get(WIDGET(pd));
+}
+
/* Standard widget overrides */
ELM_WIDGET_KEY_DOWN_DEFAULT_IMPLEMENT(elm_colorselector, Elm_Colorselector_Data)
{
obj = efl_constructor(efl_super(obj, EFL_UI_CLOCK_LEGACY_CLASS));
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
+ legacy_child_focus_handle(obj);
return obj;
}
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_LIST);
+ legacy_object_focus_handle(obj);
return obj;
}
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_ENTRY);
efl_event_callback_add(obj, EFL_EVENT_CALLBACK_ADD, _cb_added, NULL);
efl_event_callback_add(obj, EFL_EVENT_CALLBACK_DEL, _cb_deleted, NULL);
+ legacy_object_focus_handle(obj);
return obj;
}
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_LIST);
+ legacy_object_focus_handle(obj);
//TIZEN ONLY(20151012): expose flipselector top/bottom buttons for accessibility tree
if (elm_atspi_bridge_utils_is_screen_reader_enabled())
efl_event_callback_add(manager, EFL_UI_FOCUS_MANAGER_EVENT_FOCUS_CHANGED, _focus_manager_focused, state);
efl_event_callback_add(manager, EFL_EVENT_DEL, _focus_manager_del, state);
}
+
+typedef struct {
+ Eina_Bool focused;
+ Efl_Ui_Focus_Manager *registered_manager;
+ Eo *emittee;
+} Legacy_Object_Focus_State;
+
+static void
+_manager_focus_changed(void *data, const Efl_Event *ev EINA_UNUSED)
+{
+ Legacy_Object_Focus_State *state = data;
+ Eina_Bool currently_focused = efl_ui_focus_object_child_focus_get(state->emittee);
+
+ if (currently_focused == state->focused) return;
+
+ if (currently_focused)
+ evas_object_smart_callback_call(state->emittee, "focused", NULL);
+ else
+ evas_object_smart_callback_call(state->emittee, "unfocused", NULL);
+ state->focused = currently_focused;
+}
+
+static void
+_manager_focus_object_changed(void *data, const Efl_Event *ev EINA_UNUSED)
+{
+ Legacy_Object_Focus_State *state = data;
+ if (state->registered_manager)
+ efl_event_callback_del(state->registered_manager, EFL_UI_FOCUS_MANAGER_EVENT_FOCUS_CHANGED, _manager_focus_changed, state);
+ state->registered_manager = efl_ui_focus_object_focus_manager_get(state->emittee);
+ if (state->registered_manager)
+ efl_event_callback_add(state->registered_manager, EFL_UI_FOCUS_MANAGER_EVENT_FOCUS_CHANGED, _manager_focus_changed, state);
+}
+
+void
+legacy_child_focus_handle(Efl_Ui_Focus_Object *object)
+{
+ Legacy_Object_Focus_State *state = calloc(1, sizeof(Legacy_Object_Focus_State));
+ state->emittee = object;
+
+ efl_event_callback_add(object, EFL_UI_FOCUS_OBJECT_EVENT_MANAGER_CHANGED, _manager_focus_object_changed, state);
+ efl_event_callback_add(object, EFL_EVENT_DEL, _focus_manager_del, state);
+}
+
+static void
+_focus_event_changed(void *data EINA_UNUSED, const Efl_Event *event)
+{
+ if (efl_ui_focus_object_focus_get(event->object))
+ evas_object_smart_callback_call(event->object, "focused", NULL);
+ else
+ evas_object_smart_callback_call(event->object, "unfocused", NULL);
+}
+
+void
+legacy_object_focus_handle(Efl_Ui_Focus_Object *object)
+{
+ efl_event_callback_add(object, EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_CHANGED, _focus_event_changed, NULL);
+}
efl_event_callback_add(obj, EFL_EVENT_CALLBACK_ADD, _cb_added, NULL);
}
+EOLIAN static Efl_Object*
+_elm_glview_efl_object_constructor(Eo *obj, Elm_Glview_Data *pd)
+{
+ legacy_object_focus_handle(obj);
+ return efl_constructor(efl_super(obj, MY_CLASS));
+}
+
EOLIAN static Eo *
_elm_glview_efl_object_finalize(Eo *obj, Elm_Glview_Data *sd)
{
}
implements {
class.constructor;
+ Efl.Object.constructor;
Efl.Object.finalize;
Efl.Gfx.Entity.size { set; }
Efl.Ui.Focus.Object.on_focus_update;
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_POPUP_MENU);
+ legacy_child_focus_handle(obj);
return obj;
}
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_IMAGE_MAP);
+ legacy_object_focus_handle(obj);
return obj;
}
}
}
+/**
+ * This function sets up handlers for emitting "unfocused" / "focused" events.
+ * Once the passed manager object is active, "focused" is emitted, if it gets inactive "unfocused" is emitted
+ */
void legacy_efl_ui_focus_manager_widget_legacy_signals(Efl_Ui_Focus_Manager *manager, Efl_Ui_Focus_Manager *emittee);
+/**
+ * This function sets up handlers for emitting "unfocused" / "focused" events.
+ * Once the children of the passed object are getting focus, "focused" will be emitted on the object, "unfocused" otherwise.
+ */
+void legacy_child_focus_handle(Efl_Ui_Focus_Object *object);
+
+/**
+ * This function sets up handlers for emitting "unfocused" / "focused" events.
+ * Once the passed object is getting focus, "focused" will be emitted on the object, "unfocused" otherwise.
+ */
+void legacy_object_focus_handle(Efl_Ui_Focus_Object *object);
#undef EAPI
#define EAPI
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_SCROLL_PANE);
//TIZEN_ONLY(20180607): Restore legacy focus
if (!elm_widget_is_legacy(obj))
- //
- efl_event_callback_add(obj, EFL_UI_FOCUS_MANAGER_EVENT_FOCUS_CHANGED, _focused_element, obj);
+ {
+ efl_event_callback_add(obj, EFL_UI_FOCUS_MANAGER_EVENT_FOCUS_CHANGED, _focused_element, obj);
+ legacy_efl_ui_focus_manager_widget_legacy_signals(obj, obj);
+ }
+
return obj;
}
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_DOCUMENT_PRESENTATION);
+ legacy_object_focus_handle(obj);
return obj;
}
_elm_spinner_efl_object_constructor(Eo *obj, Elm_Spinner_Data *_pd EINA_UNUSED)
{
obj = efl_constructor(efl_super(obj, MY_CLASS));
+ legacy_child_focus_handle(obj);
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_SPIN_BUTTON);
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _elm_web_smart_callbacks);
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_HTML_CONTAINER);
-
+ legacy_object_focus_handle(obj);
return obj;
}