widget: Remove all legacy event stuff in propagate
authorJean-Philippe Andre <jp.andre@samsung.com>
Thu, 17 Aug 2017 09:14:52 +0000 (18:14 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Wed, 23 Aug 2017 02:16:45 +0000 (11:16 +0900)
The EO API is now clean! Yay!

Ref T5363

src/lib/elementary/efl_ui_slider.c
src/lib/elementary/elc_hoversel.c
src/lib/elementary/elc_multibuttonentry.c
src/lib/elementary/elementary_config.h
src/lib/elementary/elm_code_widget.c
src/lib/elementary/elm_panel.c
src/lib/elementary/elm_priv.h
src/lib/elementary/elm_spinner.c
src/lib/elementary/elm_widget.c
src/lib/elementary/elm_widget.eo

index 4edf565..aa8c5d3 100644 (file)
@@ -567,13 +567,13 @@ _wheel_indicator_timer_cb(void *data)
 ELM_WIDGET_KEY_DOWN_DEFAULT_IMPLEMENT(slider, Efl_Ui_Slider_Data)
 
 EOLIAN static Eina_Bool
-_efl_ui_slider_elm_widget_widget_event(Eo *obj, Efl_Ui_Slider_Data *sd, const Efl_Event *eo_event, Evas_Object *src, Evas_Callback_Type type, void *event_info)
+_efl_ui_slider_elm_widget_widget_event(Eo *obj, Efl_Ui_Slider_Data *sd, const Efl_Event *eo_event, Evas_Object *src)
 {
    Eo *ev = eo_event->info;
 
    if (eo_event->desc == EFL_EVENT_KEY_DOWN)
      {
-        _slider_elm_widget_widget_event(obj, sd, eo_event, src, type, event_info);
+        _slider_elm_widget_widget_event(obj, sd, eo_event, src);
      }
    else if (eo_event->desc == EFL_EVENT_KEY_UP)
      {
index c933cd2..1d2e890 100644 (file)
@@ -1003,12 +1003,12 @@ _key_action_escape(Evas_Object *obj, const char *params EINA_UNUSED)
 ELM_WIDGET_KEY_DOWN_DEFAULT_IMPLEMENT(hoversel, Elm_Hoversel_Data)
 
 EOLIAN static Eina_Bool
-_elm_hoversel_elm_widget_widget_event(Eo *obj, Elm_Hoversel_Data *sd, const Efl_Event *eo_event, Evas_Object *src, Evas_Callback_Type type, void *event_info)
+_elm_hoversel_elm_widget_widget_event(Eo *obj, Elm_Hoversel_Data *sd, const Efl_Event *eo_event, Evas_Object *src)
 {
-   if (elm_obj_widget_event(efl_super(obj, MY_CLASS), eo_event, src, type, event_info))
+   if (elm_obj_widget_event(efl_super(obj, MY_CLASS), eo_event, src))
      return EINA_TRUE; // note: this was FALSE but likely wrong
 
-   return _hoversel_elm_widget_widget_event(obj, sd, eo_event, src, type, event_info);
+   return _hoversel_elm_widget_widget_event(obj, sd, eo_event, src);
 }
 
 static void
index 34d37ca..f9244f3 100644 (file)
@@ -971,12 +971,8 @@ _item_new(Elm_Multibuttonentry_Data *sd,
 //FIXME: having an empty event handling function and reacting on Evas
 //events on specific objects is crazy, someone should fix that.
 EOLIAN static Eina_Bool
-_elm_multibuttonentry_elm_widget_widget_event(Eo *obj EINA_UNUSED, Elm_Multibuttonentry_Data *sd EINA_UNUSED, const Efl_Event *eo_event EINA_UNUSED, Evas_Object *src, Evas_Callback_Type type, void *ev)
+_elm_multibuttonentry_elm_widget_widget_event(Eo *obj EINA_UNUSED, Elm_Multibuttonentry_Data *sd EINA_UNUSED, const Efl_Event *eo_event EINA_UNUSED, Evas_Object *src EINA_UNUSED)
 {
-   (void)src;
-   (void)type;
-   (void)ev;
-
    // ACCESS
    if (_elm_config->access_mode == ELM_ACCESS_MODE_ON) return EINA_FALSE;
 
index 16ffd71..9d7bf2a 100644 (file)
@@ -8,6 +8,7 @@
  */
 
 #define ELM_CONFIG_ICON_THEME_ELEMENTARY "_Elementary_Icon_Theme"
+#define ELM_WIDGET_PROTECTED
 #define EFL_CANVAS_OBJECT_PROTECTED
 #define EFL_CANVAS_GROUP_PROTECTED
 #define EFL_CANVAS_GROUP_BETA
index fc92348..8ce007b 100644 (file)
@@ -1734,8 +1734,7 @@ _elm_code_widget_scroll_event_cb(void *data, Evas_Object *obj EINA_UNUSED,
 }
 
 EOLIAN static Eina_Bool
-_elm_code_widget_elm_widget_widget_event(Eo *obj EINA_UNUSED, Elm_Code_Widget_Data *pd EINA_UNUSED, const Efl_Event *eo_event,
-                                         Evas_Object *src EINA_UNUSED, Evas_Callback_Type type EINA_UNUSED, void *event_info EINA_UNUSED)
+_elm_code_widget_elm_widget_widget_event(Eo *obj EINA_UNUSED, Elm_Code_Widget_Data *pd EINA_UNUSED, const Efl_Event *eo_event, Evas_Object *src EINA_UNUSED)
 {
    Eo *ev = eo_event->info;
 
index 93845ac..7fd4f9a 100644 (file)
@@ -761,10 +761,10 @@ _key_action_toggle(Evas_Object *obj, const char *params EINA_UNUSED)
 ELM_WIDGET_KEY_DOWN_DEFAULT_IMPLEMENT(panel, Elm_Panel_Data)
 
 EOLIAN static Eina_Bool
-_elm_panel_elm_widget_widget_event(Eo *obj, Elm_Panel_Data *pd, const Efl_Event *eo_event, Evas_Object *src, Evas_Callback_Type type, void *event_info)
+_elm_panel_elm_widget_widget_event(Eo *obj, Elm_Panel_Data *pd, const Efl_Event *eo_event, Evas_Object *src)
 {
    if (src != obj) return EINA_FALSE;
-   return _panel_elm_widget_widget_event(obj, pd, eo_event, src, type, event_info);
+   return _panel_elm_widget_widget_event(obj, pd, eo_event, src);
 }
 
 static Eina_Bool
index fb0cfb9..48983d4 100644 (file)
@@ -643,7 +643,7 @@ const Elm_Layout_Part_Alias_Description *elm_layout_text_aliases_get(const Eo *o
 
 #define ELM_WIDGET_KEY_DOWN_DEFAULT_IMPLEMENT(_pfx, _typ) \
 EOLIAN static Eina_Bool \
-_##_pfx##_elm_widget_widget_event(Eo *obj, _typ *_pd EINA_UNUSED, const Efl_Event *eo_event, Evas_Object *src EINA_UNUSED, Evas_Callback_Type type EINA_UNUSED, void *event_info EINA_UNUSED) \
+_##_pfx##_elm_widget_widget_event(Eo *obj, _typ *_pd EINA_UNUSED, const Efl_Event *eo_event, Evas_Object *src EINA_UNUSED) \
 { \
    Evas_Event_Key_Down *ev; \
    if (eo_event->desc != EFL_EVENT_KEY_DOWN) return EINA_FALSE; \
index 0db1088..00e7bcd 100644 (file)
@@ -727,7 +727,7 @@ _key_action_toggle(Evas_Object *obj, const char *params EINA_UNUSED)
 }
 
 EOLIAN static Eina_Bool
-_elm_spinner_elm_widget_widget_event(Eo *obj, Elm_Spinner_Data *sd EINA_UNUSED, const Efl_Event *eo_event, Evas_Object *src EINA_UNUSED, Evas_Callback_Type type EINA_UNUSED, void *event_info EINA_UNUSED)
+_elm_spinner_elm_widget_widget_event(Eo *obj, Elm_Spinner_Data *sd EINA_UNUSED, const Efl_Event *eo_event, Evas_Object *src EINA_UNUSED)
 {
    Eo *ev = eo_event->info;
 
index 511ef8c..fa9793e 100644 (file)
@@ -109,9 +109,7 @@ static void
 _on_sub_obj_del(void *data, const Efl_Event *event);
 static void
 _on_sub_obj_hide(void *data, const Efl_Event *event);
-static void
-_propagate_event(void *data, const Efl_Event *event);
-static Eina_Bool elm_widget_event_propagate(Evas_Object *obj, const Efl_Event *eo_event, Evas_Callback_Type type, void *event_info, Evas_Event_Flags *event_flags);
+static void _propagate_event(void *data, const Efl_Event *eo_event);
 
 EFL_CALLBACKS_ARRAY_DEFINE(elm_widget_subitems_callbacks,
                           { EFL_EVENT_DEL, _on_sub_obj_del },
@@ -984,11 +982,9 @@ _propagate_y_drag_lock(Evas_Object *obj,
      }
 }
 
-static void
-_propagate_event(void *data EINA_UNUSED, const Efl_Event *event)
+static Eina_Bool
+_propagate_event_legacy(Eo *parent, const Efl_Event *event, Eo *obj, Elm_Event_Cb_Data *ecd)
 {
-   Eo *obj = event->object;
-   INTERNAL_ENTRY;
    Evas_Callback_Type type;
    Evas_Event_Flags *event_flags, prev_flags;
    union {
@@ -998,38 +994,40 @@ _propagate_event(void *data EINA_UNUSED, const Efl_Event *event)
       void                   *any;
    } event_info;
 
-   if ((evas_focus_get(evas_object_evas_get(obj)) != elm_widget_top_get(obj)) &&
-       efl_isa(obj, EFL_UI_WIN_CLASS))
-     return;
-
    if (event->desc == EFL_EVENT_KEY_DOWN)
      {
         event_info.down = efl_input_legacy_info_get(event->info);
-        EINA_SAFETY_ON_NULL_RETURN(event_info.down);
+        EINA_SAFETY_ON_NULL_RETURN_VAL(event_info.down, EINA_FALSE);
         type = EVAS_CALLBACK_KEY_DOWN;
         event_flags = &event_info.down->event_flags;
      }
    else if (event->desc == EFL_EVENT_KEY_UP)
      {
         event_info.up = efl_input_legacy_info_get(event->info);
-        EINA_SAFETY_ON_NULL_RETURN(event_info.up);
+        EINA_SAFETY_ON_NULL_RETURN_VAL(event_info.up, EINA_FALSE);
         type = EVAS_CALLBACK_KEY_UP;
         event_flags = &event_info.up->event_flags;
      }
    else if (event->desc == EFL_EVENT_POINTER_WHEEL)
      {
         event_info.wheel = efl_input_legacy_info_get(event->info);
-        EINA_SAFETY_ON_NULL_RETURN(event_info.wheel);
+        EINA_SAFETY_ON_NULL_RETURN_VAL(event_info.wheel, EINA_FALSE);
         type = EVAS_CALLBACK_MOUSE_WHEEL;
         event_flags = &event_info.wheel->event_flags;
      }
    else
-     return;
+     return EINA_FALSE;
 
    prev_flags = *event_flags;
-   elm_widget_event_propagate(obj, event, type, event_info.any, event_flags);
-   if (prev_flags != *event_flags)
-     efl_input_event_flags_set(event->info, *event_flags);
+   if (ecd->func((void *)ecd->data, parent, obj, type, event_info.any) ||
+       (event_flags && ((*event_flags) & EVAS_EVENT_FLAG_ON_HOLD)))
+     {
+        if (prev_flags != *event_flags)
+          efl_input_event_flags_set(event->info, *event_flags);
+        return EINA_TRUE;
+     }
+
+   return EINA_FALSE;
 }
 
 /**
@@ -2002,22 +2000,22 @@ elm_widget_event_callback_del(Eo *obj, Elm_Event_Cb func, const void *data)
    return NULL;
 }
 
-static Eina_Bool
-elm_widget_event_propagate(Eo *obj, const Efl_Event *eo_event,
-                           Evas_Callback_Type type, void *event_info,
-                           Evas_Event_Flags *event_flags)
+static void
+_propagate_event(void *data EINA_UNUSED, const Efl_Event *eo_event)
 {
+   Evas_Object *obj = eo_event->object;
    Evas_Object *parent = obj;
    Elm_Event_Cb_Data *ecd;
    Eina_List *l, *l_prev;
 
-   while (parent &&
-          (!(event_flags && ((*event_flags) & EVAS_EVENT_FLAG_ON_HOLD))))
-     {
-        ELM_WIDGET_CHECK(parent) EINA_FALSE;
-        Elm_Widget_Smart_Data *sd = efl_data_scope_get(parent, MY_CLASS);
+   if ((evas_focus_get(evas_object_evas_get(obj)) != elm_widget_top_get(obj)) &&
+       efl_isa(obj, EFL_UI_WIN_CLASS))
+     return;
 
-        Eina_Bool int_ret = EINA_FALSE;
+   while (parent && !efl_input_processed_get(eo_event->info))
+     {
+        Elm_Widget_Smart_Data *sd = efl_data_scope_safe_get(parent, MY_CLASS);
+        if (!sd) return;
 
         if (elm_widget_disabled_get(obj))
           {
@@ -2025,19 +2023,17 @@ elm_widget_event_propagate(Eo *obj, const Efl_Event *eo_event,
              continue;
           }
 
-        int_ret = elm_obj_widget_event(parent, eo_event, obj, type, event_info);
-        if (int_ret) return EINA_TRUE;
+        if (elm_obj_widget_event(parent, eo_event, obj))
+          return;
 
         EINA_LIST_FOREACH_SAFE(sd->event_cb, l, l_prev, ecd)
           {
-             if (ecd->func((void *)ecd->data, parent, obj, type, event_info) ||
-                 (event_flags && ((*event_flags) & EVAS_EVENT_FLAG_ON_HOLD)))
-                return EINA_TRUE;
+             if (_propagate_event_legacy(parent, eo_event, obj, ecd))
+               return;
           }
+
         parent = sd->parent_obj;
      }
-
-   return EINA_FALSE;
 }
 
 /**
@@ -6210,7 +6206,7 @@ _elm_widget_disable(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EINA_UNUSED)
 }
 
 EOLIAN static Eina_Bool
-_elm_widget_widget_event(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EINA_UNUSED, const Efl_Event *eo_event EINA_UNUSED, Evas_Object *source EINA_UNUSED, Evas_Callback_Type type EINA_UNUSED, void *event_info EINA_UNUSED)
+_elm_widget_widget_event(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EINA_UNUSED, const Efl_Event *eo_event EINA_UNUSED, Evas_Object *source EINA_UNUSED)
 {
    return EINA_FALSE;
 }
index f2428c4..40a7014 100644 (file)
@@ -4,7 +4,6 @@ import efl_input_types;
 /* FIXME: This shouldn't be here. */
 type list_data_get_func_type: __undefined_type; [[Elementary list data get function type]]
 type region_hook_func_type: __undefined_type; [[Elementary region hook function type]]
-type @extern Evas.Callback_Type: __undefined_type; [[Evas event type]]
 
 enum Elm.Activate
 {
@@ -82,6 +81,26 @@ abstract Elm.Widget (Efl.Canvas.Group, Elm.Interface.Atspi_Accessible,
                  for the available style names, or to the themes in use.]]
          }
       }
+      widget_event @protected {
+         [[Virtual function handling input events on the widget.
+
+           This method should return $true if the event has been processed.
+           Only key down, key up and pointer wheel events will be propagated
+           through this function.
+
+           It is common for the event to be also marked as processed as in
+           @Efl.Input.Event.processed, if this operation was successful. This
+           makes sure other widgets will not also process this input event.
+         ]]
+         params {
+            @in eo_event: const(ptr(Efl.Event));
+               [[EO event struct with an Efl.Input.Event as info.]]
+            @in source: Efl.Canvas.Object;
+               [[Source object where the event originated. Often same as this.]]
+         }
+         return: bool; [[$true on success, $false otherwise]]
+         legacy: null;
+      }
 
       @property focus {
         [[Focus property]]
@@ -495,17 +514,6 @@ abstract Elm.Widget (Efl.Canvas.Group, Elm.Interface.Atspi_Accessible,
          return: bool; [[$true on success, $false otherwise]]
          legacy: null;
       }
-      widget_event {
-         [['Virtual' function handling input events on the widget.]]
-         params {
-            @in eo_event: const(ptr(Efl.Event)); [[EO event info with an Efl.Input.Event]]
-            @in source: Efl.Canvas.Object; [[Source object]]
-            @in type: Evas.Callback_Type; [[Callback type]]
-            @in event_info: void_ptr; [[Event info]]
-         }
-         return: bool; [[$true on success, $false otherwise]]
-         legacy: null;
-      }
       access {
          [['Virtual' function on the widget being set access.]]
          params {