#ifdef HAVE_CONFIG_H # include "elementary_config.h" #endif #define ELM_LAYOUT_PROTECTED #define EFL_UI_SCROLL_MANAGER_PROTECTED #define EFL_UI_SCROLLBAR_PROTECTED #define EFL_UI_SCROLLBAR_BETA #include #include "elm_priv.h" #include "efl_ui_widget_scroller.h" #include "elm_widget_layout.h" #define MY_CLASS EFL_UI_SCROLLER_CLASS #define MY_CLASS_PFX efl_ui_scroller #define MY_CLASS_NAME "Efl.Ui.Scroller" #define EFL_UI_SCROLLER_DATA_GET(o, sd) \ Efl_Ui_Scroller_Data * sd = efl_data_scope_safe_get(o, EFL_UI_SCROLLER_CLASS) #define EFL_UI_SCROLLER_DATA_GET_OR_RETURN(o, ptr, ...) \ EFL_UI_SCROLLER_DATA_GET(o, ptr); \ if (EINA_UNLIKELY(!ptr)) \ { \ ERR("No widget data for object %p (%s)", \ o, evas_object_type_get(o)); \ return __VA_ARGS__; \ } static void _efl_ui_scroller_content_del_cb(void *data, const Efl_Event *event EINA_UNUSED) { EFL_UI_SCROLLER_DATA_GET_OR_RETURN(data, sd); sd->content = NULL; if (!sd->smanager) return; efl_ui_scrollbar_bar_visibility_update(sd->smanager); } EOLIAN static Eina_Bool _efl_ui_scroller_efl_content_content_set(Eo *obj, Efl_Ui_Scroller_Data *sd, Evas_Object *content) { if (sd->content) { efl_content_set(sd->pan_obj, NULL); efl_event_callback_del(sd->content, EFL_EVENT_DEL, _efl_ui_scroller_content_del_cb, obj); } sd->content = content; if (!content) return EINA_TRUE; efl_event_callback_add(sd->content, EFL_EVENT_DEL, _efl_ui_scroller_content_del_cb, obj); efl_content_set(sd->pan_obj, content); elm_layout_sizing_eval(obj); return EINA_TRUE; } static void _efl_ui_scroller_bar_read_and_update(Eo *obj) { EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd); ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); double vx, vy; edje_object_part_drag_value_get (wd->resize_obj, "elm.dragable.vbar", NULL, &vy); edje_object_part_drag_value_get (wd->resize_obj, "elm.dragable.hbar", &vx, NULL); efl_ui_scrollbar_bar_position_set(sd->smanager, vx, vy); } static void _efl_ui_scroller_reload_cb(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { Eo *scroller = data; EFL_UI_SCROLLER_DATA_GET_OR_RETURN(scroller, sd); efl_ui_scrollbar_bar_visibility_update(sd->smanager); } static void _efl_ui_scroller_vbar_drag_cb(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { _efl_ui_scroller_bar_read_and_update(data); Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_VERTICAL; efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_DRAG, &type); } static void _efl_ui_scroller_vbar_press_cb(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_VERTICAL; efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_PRESS, &type); } static void _efl_ui_scroller_vbar_unpress_cb(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_VERTICAL; efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_UNPRESS, &type); } static void _efl_ui_scroller_edje_drag_start_cb(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { Eo *scroller = data; EFL_UI_SCROLLER_DATA_GET_OR_RETURN(scroller, sd); _efl_ui_scroller_bar_read_and_update(scroller); sd->freeze_want = efl_ui_scrollable_scroll_freeze_get(sd->smanager); efl_ui_scrollable_scroll_freeze_set(sd->smanager, EINA_TRUE); efl_event_callback_call(scroller, EFL_UI_EVENT_SCROLL_DRAG_START, NULL); } static void _efl_ui_scroller_edje_drag_stop_cb(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { Eo *scroller = data; EFL_UI_SCROLLER_DATA_GET_OR_RETURN(scroller, sd); _efl_ui_scroller_bar_read_and_update(scroller); efl_ui_scrollable_scroll_freeze_set(sd->smanager, sd->freeze_want); efl_event_callback_call(scroller, EFL_UI_EVENT_SCROLL_DRAG_STOP, NULL); } static void _efl_ui_scroller_edje_drag_cb(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { _efl_ui_scroller_bar_read_and_update(data); } static void _efl_ui_scroller_hbar_drag_cb(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { _efl_ui_scroller_bar_read_and_update(data); Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL; efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_DRAG, &type); } static void _efl_ui_scroller_hbar_press_cb(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL; efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_PRESS, &type); } static void _efl_ui_scroller_hbar_unpress_cb(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL; efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_UNPRESS, &type); } static void _efl_ui_scroller_bar_size_changed_cb(void *data, const Efl_Event *event EINA_UNUSED) { Eo *obj = data; EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd); ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); double width = 0.0, height = 0.0; edje_object_calc_force(wd->resize_obj); efl_ui_scrollbar_bar_size_get(sd->smanager, &width, &height); edje_object_part_drag_size_set(wd->resize_obj, "elm.dragable.hbar", width, 1.0); edje_object_part_drag_size_set(wd->resize_obj, "elm.dragable.vbar", 1.0, height); } static void _efl_ui_scroller_bar_pos_changed_cb(void *data, const Efl_Event *event EINA_UNUSED) { Eo *obj = data; EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd); ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); double posx = 0.0, posy = 0.0; efl_ui_scrollbar_bar_position_get(sd->smanager, &posx, &posy); edje_object_part_drag_value_set(wd->resize_obj, "elm.dragable.hbar", posx, 0.0); edje_object_part_drag_value_set(wd->resize_obj, "elm.dragable.vbar", 0.0, posy); } static void _efl_ui_scroller_bar_show_cb(void *data, const Efl_Event *event) { Eo *obj = data; EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd); ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); Efl_Ui_Scrollbar_Direction type = *(Efl_Ui_Scrollbar_Direction *)(event->info); if (type == EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL) edje_object_signal_emit(wd->resize_obj, "action,show,hbar", "efl"); else if (type == EFL_UI_SCROLLBAR_DIRECTION_VERTICAL) edje_object_signal_emit(wd->resize_obj, "action,show,vbar", "efl"); } static void _efl_ui_scroller_bar_hide_cb(void *data, const Efl_Event *event) { Eo *obj = data; EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd); ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); Efl_Ui_Scrollbar_Direction type = *(Efl_Ui_Scrollbar_Direction *)(event->info); if (type == EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL) edje_object_signal_emit(wd->resize_obj, "action,hide,hbar", "efl"); else if (type == EFL_UI_SCROLLBAR_DIRECTION_VERTICAL) edje_object_signal_emit(wd->resize_obj, "action,hide,vbar", "efl"); } static void _scroll_edje_object_attach(Eo *obj) { EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd); efl_layout_signal_callback_add (obj, "reload", "efl", _efl_ui_scroller_reload_cb, obj); efl_layout_signal_callback_add (obj, "drag", "elm.dragable.vbar", _efl_ui_scroller_vbar_drag_cb, obj); efl_layout_signal_callback_add (obj, "drag,set", "elm.dragable.vbar", _efl_ui_scroller_edje_drag_cb, obj); efl_layout_signal_callback_add (obj, "drag,start", "elm.dragable.vbar", _efl_ui_scroller_edje_drag_start_cb, obj); efl_layout_signal_callback_add (obj, "drag,stop", "elm.dragable.vbar", _efl_ui_scroller_edje_drag_stop_cb, obj); efl_layout_signal_callback_add (obj, "drag,step", "elm.dragable.vbar", _efl_ui_scroller_edje_drag_cb, obj); efl_layout_signal_callback_add (obj, "drag,page", "elm.dragable.vbar", _efl_ui_scroller_edje_drag_cb, obj); efl_layout_signal_callback_add (obj, "vbar,press", "efl", _efl_ui_scroller_vbar_press_cb, obj); efl_layout_signal_callback_add (obj, "vbar,unpress", "efl", _efl_ui_scroller_vbar_unpress_cb, obj); efl_layout_signal_callback_add (obj, "drag", "elm.dragable.hbar", _efl_ui_scroller_hbar_drag_cb, obj); efl_layout_signal_callback_add (obj, "drag,set", "elm.dragable.hbar", _efl_ui_scroller_edje_drag_cb, obj); efl_layout_signal_callback_add (obj, "drag,start", "elm.dragable.hbar", _efl_ui_scroller_edje_drag_start_cb, obj); efl_layout_signal_callback_add (obj, "drag,stop", "elm.dragable.hbar", _efl_ui_scroller_edje_drag_stop_cb, obj); efl_layout_signal_callback_add (obj, "drag,step", "elm.dragable.hbar", _efl_ui_scroller_edje_drag_cb, obj); efl_layout_signal_callback_add (obj, "drag,page", "elm.dragable.hbar", _efl_ui_scroller_edje_drag_cb, obj); efl_layout_signal_callback_add (obj, "hbar,press", "efl", _efl_ui_scroller_hbar_press_cb, obj); efl_layout_signal_callback_add (obj, "hbar,unpress", "efl", _efl_ui_scroller_hbar_unpress_cb, obj); } static void _scroll_edje_object_detach(Evas_Object *obj) { EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd); efl_layout_signal_callback_del (obj, "reload", "efl", _efl_ui_scroller_reload_cb, obj); efl_layout_signal_callback_del (obj, "drag", "elm.dragable.vbar", _efl_ui_scroller_vbar_drag_cb, obj); efl_layout_signal_callback_del (obj, "drag,set", "elm.dragable.vbar", _efl_ui_scroller_edje_drag_cb, obj); efl_layout_signal_callback_del (obj, "drag,start", "elm.dragable.vbar", _efl_ui_scroller_edje_drag_start_cb, obj); efl_layout_signal_callback_del (obj, "drag,stop", "elm.dragable.vbar", _efl_ui_scroller_edje_drag_stop_cb, obj); efl_layout_signal_callback_del (obj, "drag,step", "elm.dragable.vbar", _efl_ui_scroller_edje_drag_cb, obj); efl_layout_signal_callback_del (obj, "drag,page", "elm.dragable.vbar", _efl_ui_scroller_edje_drag_cb, obj); efl_layout_signal_callback_del (obj, "vbar,press", "efl", _efl_ui_scroller_vbar_press_cb, obj); efl_layout_signal_callback_del (obj, "vbar,unpress", "efl", _efl_ui_scroller_vbar_unpress_cb, obj); efl_layout_signal_callback_del (obj, "drag", "elm.dragable.hbar", _efl_ui_scroller_hbar_drag_cb, obj); efl_layout_signal_callback_del (obj, "drag,set", "elm.dragable.hbar", _efl_ui_scroller_edje_drag_cb, obj); efl_layout_signal_callback_del (obj, "drag,start", "elm.dragable.hbar", _efl_ui_scroller_edje_drag_start_cb, obj); efl_layout_signal_callback_del (obj, "drag,stop", "elm.dragable.hbar", _efl_ui_scroller_edje_drag_stop_cb, obj); efl_layout_signal_callback_del (obj, "drag,step", "elm.dragable.hbar", _efl_ui_scroller_edje_drag_cb, obj); efl_layout_signal_callback_del (obj, "drag,page", "elm.dragable.hbar", _efl_ui_scroller_edje_drag_cb, obj); efl_layout_signal_callback_del (obj, "hbar,press", "efl", _efl_ui_scroller_hbar_press_cb, obj); efl_layout_signal_callback_del (obj, "hbar,unpress", "efl", _efl_ui_scroller_hbar_unpress_cb, obj); } static void _efl_ui_scroller_pan_resized_cb(void *data, const Efl_Event *ev EINA_UNUSED) { elm_layout_sizing_eval(data); } static void _efl_ui_scroller_resized_cb(void *data, const Efl_Event *ev EINA_UNUSED) { elm_layout_sizing_eval(data); } static void _efl_ui_scroller_size_hint_changed_cb(void *data, const Efl_Event *ev EINA_UNUSED) { elm_layout_sizing_eval(data); } EOLIAN static Eo * _efl_ui_scroller_efl_object_constructor(Eo *obj, Efl_Ui_Scroller_Data *sd EINA_UNUSED) { obj = efl_constructor(efl_super(obj, MY_CLASS)); return obj; } EOLIAN static Eo * _efl_ui_scroller_efl_object_finalize(Eo *obj, Efl_Ui_Scroller_Data *sd EINA_UNUSED) { obj = efl_finalize(efl_super(obj, MY_CLASS)); ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL); efl_ui_layout_theme_set(obj, "scroller", "base", efl_ui_widget_style_get(obj)); sd->smanager = efl_add(EFL_UI_SCROLL_MANAGER_CLASS, obj); efl_ui_mirrored_set(sd->smanager, efl_ui_mirrored_get(obj)); sd->pan_obj = efl_add(EFL_UI_PAN_CLASS, obj); efl_ui_scroll_manager_pan_set(sd->smanager, sd->pan_obj); edje_object_part_swallow(wd->resize_obj, "elm.swallow.content", sd->pan_obj); _scroll_edje_object_attach(obj); efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SIZE_CHANGED, _efl_ui_scroller_bar_size_changed_cb, obj); efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_POS_CHANGED, _efl_ui_scroller_bar_pos_changed_cb, obj); efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SHOW, _efl_ui_scroller_bar_show_cb, obj); efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_HIDE, _efl_ui_scroller_bar_hide_cb, obj); efl_event_callback_add(obj, EFL_GFX_EVENT_RESIZE, _efl_ui_scroller_resized_cb, obj); efl_event_callback_add(obj, EFL_GFX_EVENT_CHANGE_SIZE_HINTS, _efl_ui_scroller_size_hint_changed_cb, obj); efl_event_callback_add(sd->pan_obj, EFL_GFX_EVENT_RESIZE, _efl_ui_scroller_pan_resized_cb, obj); return obj; } EOLIAN static void _efl_ui_scroller_efl_object_destructor(Eo *obj, Efl_Ui_Scroller_Data *sd EINA_UNUSED) { _scroll_edje_object_detach(obj); efl_event_callback_del(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SIZE_CHANGED, _efl_ui_scroller_bar_size_changed_cb, obj); efl_event_callback_del(obj, EFL_UI_SCROLLBAR_EVENT_BAR_POS_CHANGED, _efl_ui_scroller_bar_pos_changed_cb, obj); efl_event_callback_del(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SHOW, _efl_ui_scroller_bar_show_cb, obj); efl_event_callback_del(obj, EFL_UI_SCROLLBAR_EVENT_BAR_HIDE, _efl_ui_scroller_bar_hide_cb, obj); efl_event_callback_del(obj, EFL_GFX_EVENT_RESIZE, _efl_ui_scroller_resized_cb, obj); efl_event_callback_del(obj, EFL_GFX_EVENT_CHANGE_SIZE_HINTS, _efl_ui_scroller_size_hint_changed_cb, obj); efl_event_callback_del(sd->pan_obj, EFL_GFX_EVENT_RESIZE, _efl_ui_scroller_pan_resized_cb, obj); efl_del(sd->pan_obj); sd->pan_obj = NULL; efl_del(sd->smanager); sd->smanager = NULL; efl_destructor(efl_super(obj, MY_CLASS)); } EOLIAN static void _efl_ui_scroller_elm_layout_sizing_eval(Eo *obj, Efl_Ui_Scroller_Data *sd) { Eina_Size2D min = {0, 0}, max = {0, 0}, size = {-1, -1}; Eina_Rect view = {}; Evas_Coord vmw = 0, vmh = 0; double xw = 0.0, yw = 0.0; ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); if (sd->content) { min = efl_gfx_size_hint_combined_min_get(sd->content); max = efl_gfx_size_hint_max_get(sd->content); efl_gfx_size_hint_weight_get(sd->content, &xw, &yw); } if (sd->smanager) view = efl_ui_scrollable_viewport_geometry_get(sd->smanager); if (xw > 0.0) { if ((min.w > 0) && (view.w < min.w)) view.w = min.w; else if ((max.w > 0) && (view.w > max.w)) view.w = max.w; } else if (min.w > 0) view.w = min.w; if (yw > 0.0) { if ((min.h > 0) && (view.h < min.h)) view.h = min.h; else if ((max.h > 0) && (view.h > max.h)) view.h = max.h; } else if (min.h > 0) view.h = min.h; if (sd->content) efl_gfx_size_set(sd->content, EINA_SIZE2D(view.w, view.h)); edje_object_size_min_calc(wd->resize_obj, &vmw, &vmh); if (sd->match_content_w) size.w = vmw + min.w; if (sd->match_content_h) size.h = vmh + min.h; max = efl_gfx_size_hint_max_get(obj); if ((max.w > 0) && (size.w > max.w)) size.w = max.w; if ((max.h > 0) && (size.h > max.h)) size.h = max.h; efl_gfx_size_hint_min_set(obj, size); } EOLIAN static Efl_Ui_Theme_Apply _efl_ui_scroller_efl_ui_widget_theme_apply(Eo *obj, Efl_Ui_Scroller_Data *sd) { Efl_Ui_Theme_Apply int_ret = EFL_UI_THEME_APPLY_FAILED; int_ret = efl_ui_widget_theme_apply(efl_super(obj, MY_CLASS)); if (!int_ret) return EFL_UI_THEME_APPLY_FAILED; efl_ui_mirrored_set(sd->smanager, efl_ui_mirrored_get(obj)); elm_layout_sizing_eval(obj); return int_ret; } EOLIAN static Eina_Size2D _efl_ui_scroller_efl_ui_scrollable_interactive_content_size_get(Eo *obj EINA_UNUSED, Efl_Ui_Scroller_Data *sd) { return efl_ui_scrollable_content_size_get(sd->smanager); } EOLIAN static Eina_Rect _efl_ui_scroller_efl_ui_scrollable_interactive_viewport_geometry_get(Eo *obj EINA_UNUSED, Efl_Ui_Scroller_Data *sd) { return efl_ui_scrollable_viewport_geometry_get(sd->smanager); } EOLIAN static void _efl_ui_scroller_efl_ui_scrollable_interactive_bounce_enabled_set(Eo *obj EINA_UNUSED, Efl_Ui_Scroller_Data *sd, Eina_Bool horiz, Eina_Bool vert) { efl_ui_scrollable_bounce_enabled_set(sd->smanager, horiz, vert); } EOLIAN static void _efl_ui_scroller_efl_ui_scrollable_interactive_bounce_enabled_get(Eo *obj EINA_UNUSED, Efl_Ui_Scroller_Data *sd, Eina_Bool *horiz, Eina_Bool *vert) { efl_ui_scrollable_bounce_enabled_get(sd->smanager, horiz, vert); } EOLIAN static Eina_Bool _efl_ui_scroller_efl_ui_scrollable_interactive_scroll_hold_get(Eo *obj EINA_UNUSED, Efl_Ui_Scroller_Data *sd) { return efl_ui_scrollable_scroll_hold_get(sd->smanager); } EOLIAN static void _efl_ui_scroller_efl_ui_scrollable_interactive_scroll_hold_set(Eo *obj EINA_UNUSED, Efl_Ui_Scroller_Data *sd, Eina_Bool hold) { efl_ui_scrollable_scroll_hold_set(sd->smanager, hold); } EOLIAN static Eina_Bool _efl_ui_scroller_efl_ui_scrollable_interactive_scroll_freeze_get(Eo *obj EINA_UNUSED, Efl_Ui_Scroller_Data *sd) { return efl_ui_scrollable_scroll_freeze_get(sd->smanager); } EOLIAN static void _efl_ui_scroller_efl_ui_scrollable_interactive_scroll_freeze_set(Eo *obj EINA_UNUSED, Efl_Ui_Scroller_Data *sd, Eina_Bool freeze) { efl_ui_scrollable_scroll_freeze_set(sd->smanager, freeze); } EOLIAN static void _efl_ui_scroller_efl_ui_scrollable_interactive_match_content_set(Eo *obj EINA_UNUSED, Efl_Ui_Scroller_Data *sd, Eina_Bool match_content_w, Eina_Bool match_content_h) { sd->match_content_w = !!match_content_w; sd->match_content_h = !!match_content_h; efl_ui_scrollable_match_content_set(sd->smanager, match_content_w, match_content_h); elm_layout_sizing_eval(obj); } EOLIAN static void _efl_ui_scroller_efl_ui_scrollbar_bar_mode_set(Eo *obj EINA_UNUSED, Efl_Ui_Scroller_Data *sd, Efl_Ui_Scrollbar_Mode hmode, Efl_Ui_Scrollbar_Mode vmode) { efl_ui_scrollbar_bar_mode_set(sd->smanager, hmode, vmode); } EOLIAN static void _efl_ui_scroller_efl_ui_scrollbar_bar_mode_get(Eo *obj EINA_UNUSED, Efl_Ui_Scroller_Data *sd, Efl_Ui_Scrollbar_Mode *hmode, Efl_Ui_Scrollbar_Mode *vmode) { efl_ui_scrollbar_bar_mode_get(sd->smanager, hmode, vmode); } EOLIAN static void _efl_ui_scroller_efl_ui_scrollable_interactive_scroll(Eo *obj EINA_UNUSED, Efl_Ui_Scroller_Data *sd, Eina_Rect rc, Eina_Bool animation) { efl_ui_scrollable_scroll(sd->smanager, rc, animation); } /* Internal EO APIs and hidden overrides */ #define EFL_UI_SCROLLER_EXTRA_OPS \ ELM_LAYOUT_SIZING_EVAL_OPS(efl_ui_scroller) #include "efl_ui_scroller.eo.c"