elm: update widgets that have documented focus and unfocused events
authorMarcel Hollerbach <mail@marcel-hollerbach.de>
Mon, 22 Oct 2018 11:39:06 +0000 (13:39 +0200)
committerSangHyeon Jade Lee <sh10233.lee@samsung.com>
Tue, 20 Nov 2018 07:10:36 +0000 (16:10 +0900)
this emits focus and unfocus on those widgets.

fixes T7386

Depends on D7124

Differential Revision: https://phab.enlightenment.org/D7103

31 files changed:
src/lib/elementary/efl_ui_button.c
src/lib/elementary/efl_ui_check.c
src/lib/elementary/efl_ui_image_zoomable.c
src/lib/elementary/efl_ui_progressbar.c
src/lib/elementary/efl_ui_radio.c
src/lib/elementary/efl_ui_video.c
src/lib/elementary/efl_ui_widget.c
src/lib/elementary/elc_fileselector.c
src/lib/elementary/elc_fileselector_button.c
src/lib/elementary/elc_fileselector_entry.c
src/lib/elementary/elc_hoversel.c
src/lib/elementary/elc_multibuttonentry.c
src/lib/elementary/elc_naviframe.c
src/lib/elementary/elc_popup.c
src/lib/elementary/elm_clock.c
src/lib/elementary/elm_color_item.eo
src/lib/elementary/elm_colorselector.c
src/lib/elementary/elm_datetime.c
src/lib/elementary/elm_diskselector.c
src/lib/elementary/elm_entry.c
src/lib/elementary/elm_flipselector.c
src/lib/elementary/elm_focus_legacy.c
src/lib/elementary/elm_glview.c
src/lib/elementary/elm_glview.eo
src/lib/elementary/elm_hover.c
src/lib/elementary/elm_map.c
src/lib/elementary/elm_priv.h
src/lib/elementary/elm_scroller.c
src/lib/elementary/elm_slideshow.c
src/lib/elementary/elm_spinner.c
src/lib/elementary/elm_web2.c

index 9b896c0..fbfac85 100644 (file)
@@ -440,6 +440,7 @@ EOLIAN static Eo *
 _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;
 }
index a2b22cf..322c7bd 100644 (file)
@@ -467,6 +467,7 @@ _efl_ui_check_legacy_efl_object_constructor(Eo *obj, void *pd EINA_UNUSED)
 {
    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;
 }
 
index af392b6..14035d2 100644 (file)
@@ -1984,7 +1984,7 @@ _efl_ui_image_zoomable_efl_object_constructor(Eo *obj, Efl_Ui_Image_Zoomable_Dat
    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;
 }
 
index 6e31b33..c1b14fb 100644 (file)
@@ -846,6 +846,7 @@ _efl_ui_progressbar_legacy_efl_object_constructor(Eo *obj, void *pd EINA_UNUSED)
 {
    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;
 }
 
index 3c54372..df80bba 100644 (file)
@@ -392,6 +392,7 @@ _efl_ui_radio_legacy_efl_object_constructor(Eo *obj, void *_pd EINA_UNUSED)
 {
    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;
 }
 
index c9afad2..3d7bf74 100644 (file)
@@ -439,6 +439,8 @@ _efl_ui_video_legacy_efl_object_constructor(Eo *obj, void *_pd EINA_UNUSED)
 {
    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;
 }
 
index 6970cb4..553d548 100644 (file)
@@ -8324,7 +8324,6 @@ _efl_ui_widget_part_shadow_efl_gfx_filter_filter_state_get(const Eo *obj, void *
 
 /* Widget Shadow End */
 
-
 /* Efl.Part implementation */
 
 EOLIAN static Efl_Object *
index 274dcd8..e23dfe7 100644 (file)
@@ -1940,6 +1940,7 @@ EOLIAN static Eo *
 _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);
index 76c60c1..2c86b7c 100644 (file)
@@ -278,6 +278,7 @@ _elm_fileselector_button_efl_object_constructor(Eo *obj, Elm_Fileselector_Button
    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;
 }
index d2b3b38..cc980c3 100644 (file)
@@ -308,6 +308,7 @@ _elm_fileselector_entry_efl_object_constructor(Eo *obj, Elm_Fileselector_Entry_D
    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;
 }
index 88eeff5..79d4884 100644 (file)
@@ -762,6 +762,7 @@ _elm_hoversel_efl_object_constructor(Eo *obj, Elm_Hoversel_Data *_pd EINA_UNUSED
    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;
 }
index 4277bac..091a2c4 100644 (file)
@@ -1996,14 +1996,13 @@ _legacy_manager_changed_cb(void *data EINA_UNUSED, const Efl_Event *ev)
 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;
 }
 
index a4a4ce8..1d329d3 100644 (file)
@@ -1971,6 +1971,7 @@ _elm_naviframe_efl_object_constructor(Eo *obj, Elm_Naviframe_Data *sd)
 {
    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);
index f0289a5..1ee7e6d 100644 (file)
@@ -2348,6 +2348,7 @@ _elm_popup_efl_object_constructor(Eo *obj, Elm_Popup_Data *_pd EINA_UNUSED)
    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;
 }
index db85179..3fd8178 100644 (file)
@@ -808,6 +808,7 @@ _elm_clock_efl_object_constructor(Eo *obj, Elm_Clock_Data *_pd EINA_UNUSED)
    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;
 }
index 7a709dd..7908c61 100644 (file)
@@ -44,6 +44,8 @@ class Elm.Color.Item(Elm.Widget.Item, Efl.Ui.Focus.Object, Efl.Access.Widget.Act
       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; }
index 4f00141..d6f7dfe 100644 (file)
@@ -1859,7 +1859,7 @@ _elm_color_item_efl_object_constructor(Eo *eo_item, Elm_Color_Item_Data *item)
 
    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)))
@@ -2382,6 +2382,7 @@ _elm_colorselector_efl_object_constructor(Eo *obj, Elm_Colorselector_Data *_pd E
    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;
 }
@@ -2863,6 +2864,18 @@ _elm_color_item_efl_access_component_highlight_clear(Eo *eo_it EINA_UNUSED, Elm_
 }
 //
 
+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)
index b116bd4..42067a1 100644 (file)
@@ -32,6 +32,7 @@ _efl_ui_clock_legacy_efl_object_constructor(Eo *obj, void *pd EINA_UNUSED)
 {
    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;
 }
 
index 1c6d349..ce2e9d5 100644 (file)
@@ -1417,6 +1417,7 @@ _elm_diskselector_efl_object_constructor(Eo *obj, Elm_Diskselector_Data *_pd EIN
    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;
 }
index 96458f0..fc65b5d 100644 (file)
@@ -5708,6 +5708,7 @@ _elm_entry_efl_object_constructor(Eo *obj, Elm_Entry_Data *_pd EINA_UNUSED)
    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;
 }
index 9daf084..eeee7b6 100644 (file)
@@ -765,6 +765,7 @@ _elm_flipselector_efl_object_constructor(Eo *obj, Elm_Flipselector_Data *sd)
    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())
index 8e53af6..e53d4d9 100644 (file)
@@ -437,3 +437,60 @@ legacy_efl_ui_focus_manager_widget_legacy_signals(Efl_Ui_Focus_Manager *manager,
    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);
+}
index 5b66f7a..009506e 100644 (file)
@@ -368,6 +368,13 @@ _elm_glview_version_constructor(Eo *obj, Elm_Glview_Data *sd,
    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)
 {
index 74cc36f..05c5498 100644 (file)
@@ -188,6 +188,7 @@ class Elm.Glview (Efl.Ui.Widget, Efl.Gfx.View, Efl.Ui.Legacy)
    }
    implements {
       class.constructor;
+      Efl.Object.constructor;
       Efl.Object.finalize;
       Efl.Gfx.Entity.size { set; }
       Efl.Ui.Focus.Object.on_focus_update;
index 7c6505b..73ba410 100644 (file)
@@ -699,6 +699,7 @@ _elm_hover_efl_object_constructor(Eo *obj, Elm_Hover_Data *pd EINA_UNUSED)
    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;
 }
index 1da9859..0a72dd9 100644 (file)
@@ -4300,6 +4300,7 @@ _elm_map_efl_object_constructor(Eo *obj, Elm_Map_Data *sd)
    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;
 }
index 19d600c..6b0e7bc 100644 (file)
@@ -939,7 +939,22 @@ efl_ui_dir_is_horizontal(Efl_Ui_Dir dir, Eina_Bool def_val)
      }
 }
 
+/**
+ * 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
index 68c8127..c86b21a 100644 (file)
@@ -1141,8 +1141,11 @@ _elm_scroller_efl_object_constructor(Eo *obj, Elm_Scroller_Data *_pd EINA_UNUSED
    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;
 }
 
index 24d8288..925930b 100644 (file)
@@ -377,6 +377,7 @@ _elm_slideshow_efl_object_constructor(Eo *obj, Elm_Slideshow_Data *_pd EINA_UNUS
    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;
 }
index 3850c03..28f3570 100644 (file)
@@ -1704,6 +1704,7 @@ EOLIAN static Eo *
 _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);
index 1339a5c..3c82d92 100644 (file)
@@ -100,7 +100,7 @@ _elm_web_efl_object_constructor(Eo *obj, Elm_Web_Data *sd)
    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;
 }