zmike pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=d76d5db5cbfe98eebb2f59d8227bb429d1b867f7

commit d76d5db5cbfe98eebb2f59d8227bb429d1b867f7
Author: Marcel Hollerbach <[email protected]>
Date:   Tue Jul 9 08:49:12 2019 -0400

    Introduce efl_ui_scroll_util files.
    
    Summary:
    this brings API that connects the theme to the object. This reduces the
    amount of code that you need to write in order to develop a widget that
    can be scrollable.
    
    For now efl_ui_grid and efl_ui_scroller are replaced with it.
    efl_ui_list / efl_ui_list_view are not handeled with this, as they will
    be replaced with newer widgets.
    
    Right now this is only avaiable in the C API. However, wrapping this
    into a mixin should be easy.
    
    Reviewers: zmike, segfaultxavi
    
    Reviewed By: zmike
    
    Subscribers: cedric, #reviewers, #committers
    
    Tags: #efl
    
    Differential Revision: https://phab.enlightenment.org/D9245
---
 src/lib/elementary/efl_ui_grid.c        | 220 +-------------------
 src/lib/elementary/efl_ui_scroll_util.c | 329 ++++++++++++++++++++++++++++++
 src/lib/elementary/efl_ui_scroller.c    | 351 +-------------------------------
 src/lib/elementary/elm_priv.h           |  14 ++
 src/lib/elementary/meson.build          |   1 +
 5 files changed, 350 insertions(+), 565 deletions(-)

diff --git a/src/lib/elementary/efl_ui_grid.c b/src/lib/elementary/efl_ui_grid.c
index 5e1f50638d..d27899d907 100644
--- a/src/lib/elementary/efl_ui_grid.c
+++ b/src/lib/elementary/efl_ui_grid.c
@@ -263,138 +263,6 @@ _item_scroll_internal(Eo *obj,
    efl_ui_scrollable_scroll(pd->smanager, ipos, anim);
 }
 
-static void
-_efl_ui_grid_bar_read_and_update(Eo *obj)
-{
-   EFL_UI_GRID_DATA_GET_OR_RETURN(obj, pd);
-   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
-   double vx = 0.0, vy = 0.0;
-
-   edje_object_part_drag_value_get
-     (wd->resize_obj, "efl.dragable.vbar", NULL, &vy);
-
-   edje_object_part_drag_value_get
-     (wd->resize_obj, "efl.dragable.hbar", &vx, NULL);
-
-   efl_ui_scrollbar_bar_position_set(pd->smanager, vx, vy);
-}
-
-static void
-_efl_ui_grid_reload_cb(void *data,
-                       Evas_Object *obj EINA_UNUSED,
-                       const char *emission EINA_UNUSED,
-                       const char *source EINA_UNUSED)
-{
-   Eo *list = data;
-   EFL_UI_GRID_DATA_GET_OR_RETURN(list, pd);
-
-   efl_ui_scrollbar_bar_visibility_update(pd->smanager);
-}
-
-static void
-_efl_ui_grid_vbar_drag_cb(void *data,
-                          Evas_Object *obj EINA_UNUSED,
-                          const char *emission EINA_UNUSED,
-                          const char *source EINA_UNUSED)
-{
-   _efl_ui_grid_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_grid_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_grid_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_grid_edje_drag_start_cb(void *data,
-                                Evas_Object *obj EINA_UNUSED,
-                                const char *emission EINA_UNUSED,
-                                const char *source EINA_UNUSED)
-{
-   Eo *list = data;
-   EFL_UI_GRID_DATA_GET_OR_RETURN(list, pd);
-
-   _efl_ui_grid_bar_read_and_update(list);
-
-   pd->freeze_want = efl_ui_scrollable_scroll_freeze_get(pd->smanager);
-   efl_ui_scrollable_scroll_freeze_set(pd->smanager, EINA_TRUE);
-   efl_event_callback_call(list, EFL_UI_EVENT_SCROLL_DRAG_START, NULL);
-}
-
-static void
-_efl_ui_grid_edje_drag_stop_cb(void *data,
-                               Evas_Object *obj EINA_UNUSED,
-                               const char *emission EINA_UNUSED,
-                               const char *source EINA_UNUSED)
-{
-   Eo *list = data;
-   EFL_UI_GRID_DATA_GET_OR_RETURN(list, pd);
-
-   _efl_ui_grid_bar_read_and_update(list);
-
-   efl_ui_scrollable_scroll_freeze_set(pd->smanager, pd->freeze_want);
-   efl_event_callback_call(list, EFL_UI_EVENT_SCROLL_DRAG_STOP, NULL);
-}
-
-static void
-_efl_ui_grid_edje_drag_cb(void *data,
-                          Evas_Object *obj EINA_UNUSED,
-                          const char *emission EINA_UNUSED,
-                          const char *source EINA_UNUSED)
-{
-   _efl_ui_grid_bar_read_and_update(data);
-}
-
-static void
-_efl_ui_grid_hbar_drag_cb(void *data,
-                          Evas_Object *obj EINA_UNUSED,
-                          const char *emission EINA_UNUSED,
-                          const char *source EINA_UNUSED)
-{
-   _efl_ui_grid_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_grid_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_grid_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_grid_bar_size_changed_cb(void *data, const Efl_Event *event 
EINA_UNUSED)
 {
@@ -452,90 +320,6 @@ _efl_ui_grid_bar_hide_cb(void *data, const Efl_Event 
*event)
      edje_object_signal_emit(wd->resize_obj, "efl,action,hide,vbar", "efl");
 }
 
-static void
-_scroll_edje_object_attach(Eo *obj)
-{
-   EFL_UI_GRID_DATA_GET_OR_RETURN(obj, pd);
-
-   efl_layout_signal_callback_add(obj, "reload", "efl",
-                                  obj, _efl_ui_grid_reload_cb, NULL);
-   efl_layout_signal_callback_add(obj, "drag", "efl.dragable.vbar",
-                                  obj, _efl_ui_grid_vbar_drag_cb, NULL);
-   efl_layout_signal_callback_add(obj, "drag,set", "efl.dragable.vbar",
-                                  obj, _efl_ui_grid_edje_drag_cb, NULL);
-   efl_layout_signal_callback_add(obj, "drag,start", "efl.dragable.vbar",
-                                  obj, _efl_ui_grid_edje_drag_start_cb, NULL);
-   efl_layout_signal_callback_add(obj, "drag,stop", "efl.dragable.vbar",
-                                  obj, _efl_ui_grid_edje_drag_stop_cb, NULL);
-   efl_layout_signal_callback_add(obj, "drag,step", "efl.dragable.vbar",
-                                  obj, _efl_ui_grid_edje_drag_cb, NULL);
-   efl_layout_signal_callback_add(obj, "drag,page", "efl.dragable.vbar",
-                                  obj, _efl_ui_grid_edje_drag_cb, NULL);
-   efl_layout_signal_callback_add(obj, "efl,vbar,press", "efl",
-                                  obj, _efl_ui_grid_vbar_press_cb, NULL);
-   efl_layout_signal_callback_add(obj, "efl,vbar,unpress", "efl",
-                                  obj, _efl_ui_grid_vbar_unpress_cb, NULL);
-
-   efl_layout_signal_callback_add(obj, "drag", "efl.dragable.hbar",
-                                  obj, _efl_ui_grid_hbar_drag_cb, NULL);
-   efl_layout_signal_callback_add(obj, "drag,set", "efl.dragable.hbar",
-                                  obj, _efl_ui_grid_edje_drag_cb, NULL);
-   efl_layout_signal_callback_add(obj, "drag,start", "efl.dragable.hbar",
-                                  obj, _efl_ui_grid_edje_drag_start_cb, NULL);
-   efl_layout_signal_callback_add(obj, "drag,stop", "efl.dragable.hbar",
-                                  obj, _efl_ui_grid_edje_drag_stop_cb, NULL);
-   efl_layout_signal_callback_add(obj, "drag,step", "efl.dragable.hbar",
-                                  obj, _efl_ui_grid_edje_drag_cb, NULL);
-   efl_layout_signal_callback_add(obj, "drag,page", "efl.dragable.hbar",
-                                  obj, _efl_ui_grid_edje_drag_cb, NULL);
-   efl_layout_signal_callback_add(obj, "efl,hbar,press", "efl",
-                                  obj, _efl_ui_grid_hbar_press_cb, NULL);
-   efl_layout_signal_callback_add(obj, "efl,hbar,unpress", "efl",
-                                  obj, _efl_ui_grid_hbar_unpress_cb, NULL);
-}
-
-static void
-_scroll_edje_object_detach(Eo *obj)
-{
-   EFL_UI_GRID_DATA_GET_OR_RETURN(obj, pd);
-
-   efl_layout_signal_callback_del(obj, "reload", "efl",
-                                  obj, _efl_ui_grid_reload_cb, NULL);
-   efl_layout_signal_callback_del(obj, "drag", "efl.dragable.vbar",
-                                  obj, _efl_ui_grid_vbar_drag_cb, NULL);
-   efl_layout_signal_callback_del(obj, "drag,set", "efl.dragable.vbar",
-                                  obj, _efl_ui_grid_edje_drag_cb, NULL);
-   efl_layout_signal_callback_del(obj, "drag,start", "efl.dragable.vbar",
-                                  obj, _efl_ui_grid_edje_drag_start_cb, NULL);
-   efl_layout_signal_callback_del(obj, "drag,stop", "efl.dragable.vbar",
-                                  obj, _efl_ui_grid_edje_drag_stop_cb, NULL);
-   efl_layout_signal_callback_del(obj, "drag,step", "efl.dragable.vbar",
-                                  obj, _efl_ui_grid_edje_drag_cb, NULL);
-   efl_layout_signal_callback_del(obj, "drag,page", "efl.dragable.vbar",
-                                  obj, _efl_ui_grid_edje_drag_cb, NULL);
-   efl_layout_signal_callback_del(obj, "efl,vbar,press", "efl",
-                                  obj, _efl_ui_grid_vbar_press_cb, NULL);
-   efl_layout_signal_callback_del(obj, "efl,vbar,unpress", "efl",
-                                  obj, _efl_ui_grid_vbar_unpress_cb, NULL);
-
-   efl_layout_signal_callback_del(obj, "drag", "efl.dragable.hbar",
-                                  obj, _efl_ui_grid_hbar_drag_cb, NULL);
-   efl_layout_signal_callback_del(obj, "drag,set", "efl.dragable.hbar",
-                                  obj, _efl_ui_grid_edje_drag_cb, NULL);
-   efl_layout_signal_callback_del(obj, "drag,start", "efl.dragable.hbar",
-                                  obj, _efl_ui_grid_edje_drag_start_cb, NULL);
-   efl_layout_signal_callback_del(obj, "drag,stop", "efl.dragable.hbar",
-                                  obj, _efl_ui_grid_edje_drag_stop_cb, NULL);
-   efl_layout_signal_callback_del(obj, "drag,step", "efl.dragable.hbar",
-                                  obj, _efl_ui_grid_edje_drag_cb, NULL);
-   efl_layout_signal_callback_del(obj, "drag,page", "efl.dragable.hbar",
-                                  obj, _efl_ui_grid_edje_drag_cb, NULL);
-   efl_layout_signal_callback_del(obj, "efl,hbar,press", "efl",
-                                  obj, _efl_ui_grid_hbar_press_cb, NULL);
-   efl_layout_signal_callback_del(obj, "efl,hbar,unpress", "efl",
-                                  obj, _efl_ui_grid_hbar_unpress_cb, NULL);
-}
-
 static void
 _efl_ui_grid_content_moved_cb(void *data, const Efl_Event *ev EINA_UNUSED)
 {
@@ -608,7 +392,7 @@ _efl_ui_grid_efl_object_finalize(Eo *obj,
         pd->item.size.h = 1;
      }
 
-   _scroll_edje_object_attach(obj);
+   efl_ui_scroll_connector_bind(obj, pd->smanager);
 
    //FIXME: Workaround code! fake Content for pan resize.
   // to remove this code, we need to customize pan class.
@@ -642,7 +426,7 @@ _efl_ui_grid_efl_object_finalize(Eo *obj,
 EOLIAN static void
 _efl_ui_grid_efl_object_invalidate(Eo *obj, Efl_Ui_Grid_Data *pd)
 {
-   _scroll_edje_object_detach(obj);
+   efl_ui_scroll_connector_unbind(obj);
 
    efl_event_callback_del(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SIZE_CHANGED,
                           _efl_ui_grid_bar_size_changed_cb, obj);
diff --git a/src/lib/elementary/efl_ui_scroll_util.c 
b/src/lib/elementary/efl_ui_scroll_util.c
new file mode 100644
index 0000000000..45ba2d3f6e
--- /dev/null
+++ b/src/lib/elementary/efl_ui_scroll_util.c
@@ -0,0 +1,329 @@
+#ifdef HAVE_CONFIG_H
+#include "elementary_config.h"
+#endif
+#define EFL_UI_SCROLL_MANAGER_PROTECTED
+#define EFL_UI_SCROLLBAR_PROTECTED
+
+#include <Elementary.h>
+#include <Efl_Ui.h>
+#include "elm_priv.h"
+
+typedef struct {
+   Eo *obj;
+   Eo *smanager;
+   int freeze_want;
+} Scroll_Connector_Context;
+
+static void
+_scroll_connector_bar_read_and_update(Scroll_Connector_Context *ctx)
+{
+   ELM_WIDGET_DATA_GET_OR_RETURN(ctx->obj, wd);
+   double vx = 0.0, vy = 0.0;
+
+   edje_object_part_drag_value_get
+     (wd->resize_obj, "efl.dragable.vbar", NULL, &vy);
+
+   edje_object_part_drag_value_get
+     (wd->resize_obj, "efl.dragable.hbar", &vx, NULL);
+
+   efl_ui_scrollbar_bar_position_set(ctx->smanager, vx, vy);
+}
+
+static void
+_scroll_connector_reload_cb(void *data,
+                       Evas_Object *obj EINA_UNUSED,
+                       const char *emission EINA_UNUSED,
+                       const char *source EINA_UNUSED)
+{
+   Scroll_Connector_Context *ctx = data;
+
+   efl_ui_scrollbar_bar_visibility_update(ctx->smanager);
+}
+
+
+static void
+_scroll_connector_edje_drag_cb(void *data,
+                          Evas_Object *obj EINA_UNUSED,
+                          const char *emission EINA_UNUSED,
+                          const char *source EINA_UNUSED)
+{
+   Scroll_Connector_Context *ctx = data;
+
+   _scroll_connector_bar_read_and_update(ctx);
+}
+
+static void
+_scroll_connector_edje_drag_start_cb(void *data,
+                                Evas_Object *obj EINA_UNUSED,
+                                const char *emission EINA_UNUSED,
+                                const char *source EINA_UNUSED)
+{
+   Scroll_Connector_Context *ctx = data;
+
+   _scroll_connector_bar_read_and_update(ctx);
+
+   ctx->freeze_want = efl_ui_scrollable_scroll_freeze_get(ctx->smanager);
+   efl_ui_scrollable_scroll_freeze_set(ctx->smanager, EINA_TRUE);
+   efl_event_callback_call(ctx->obj, EFL_UI_EVENT_SCROLL_DRAG_START, NULL);
+}
+
+static void
+_scroll_connector_edje_drag_stop_cb(void *data,
+                               Evas_Object *obj EINA_UNUSED,
+                               const char *emission EINA_UNUSED,
+                               const char *source EINA_UNUSED)
+{
+   Scroll_Connector_Context *ctx = data;
+
+   _scroll_connector_bar_read_and_update(ctx);
+   EINA_SAFETY_ON_TRUE_RETURN(ctx->freeze_want == -1);
+   efl_ui_scrollable_scroll_freeze_set(ctx->smanager, ctx->freeze_want);
+   ctx->freeze_want = -1;
+   efl_event_callback_call(ctx->obj, EFL_UI_EVENT_SCROLL_DRAG_STOP, NULL);
+}
+
+static void
+_scroll_connector_vbar_drag_cb(void *data,
+                          Evas_Object *obj EINA_UNUSED,
+                          const char *emission EINA_UNUSED,
+                          const char *source EINA_UNUSED)
+{
+   Scroll_Connector_Context *ctx = data;
+   Efl_Ui_Scrollbar_Direction type;
+
+   _scroll_connector_bar_read_and_update(ctx);
+
+   type = EFL_UI_SCROLLBAR_DIRECTION_VERTICAL;
+   efl_event_callback_call(ctx->obj, EFL_UI_SCROLLBAR_EVENT_BAR_DRAG, &type);
+}
+
+static void
+_scroll_connector_vbar_press_cb(void *data,
+                           Evas_Object *obj EINA_UNUSED,
+                           const char *emission EINA_UNUSED,
+                           const char *source EINA_UNUSED)
+{
+   Scroll_Connector_Context *ctx = data;
+   Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_VERTICAL;
+
+   efl_event_callback_call(ctx->obj, EFL_UI_SCROLLBAR_EVENT_BAR_PRESS, &type);
+}
+
+static void
+_scroll_connector_vbar_unpress_cb(void *data,
+                             Evas_Object *obj EINA_UNUSED,
+                             const char *emission EINA_UNUSED,
+                             const char *source EINA_UNUSED)
+{
+   Scroll_Connector_Context *ctx = data;
+   Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_VERTICAL;
+
+   efl_event_callback_call(ctx->obj, EFL_UI_SCROLLBAR_EVENT_BAR_UNPRESS, 
&type);
+}
+
+static void
+_scroll_connector_hbar_drag_cb(void *data,
+                          Evas_Object *obj EINA_UNUSED,
+                          const char *emission EINA_UNUSED,
+                          const char *source EINA_UNUSED)
+{
+   Scroll_Connector_Context *ctx = data;
+   Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL;
+
+   _scroll_connector_bar_read_and_update(ctx);
+   efl_event_callback_call(ctx->obj, EFL_UI_SCROLLBAR_EVENT_BAR_DRAG, &type);
+}
+
+static void
+_scroll_connector_hbar_press_cb(void *data,
+                           Evas_Object *obj EINA_UNUSED,
+                           const char *emission EINA_UNUSED,
+                           const char *source EINA_UNUSED)
+{
+   Scroll_Connector_Context *ctx = data;
+   Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL;
+
+   efl_event_callback_call(ctx->obj, EFL_UI_SCROLLBAR_EVENT_BAR_PRESS, &type);
+}
+
+static void
+_scroll_connector_hbar_unpress_cb(void *data,
+                             Evas_Object *obj EINA_UNUSED,
+                             const char *emission EINA_UNUSED,
+                             const char *source EINA_UNUSED)
+{
+   Scroll_Connector_Context *ctx = data;
+   Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL;
+
+   efl_event_callback_call(ctx->obj, EFL_UI_SCROLLBAR_EVENT_BAR_UNPRESS, 
&type);
+}
+
+static void
+_scroll_connector_bar_size_changed_cb(void *data, const Efl_Event *event 
EINA_UNUSED)
+{
+   Scroll_Connector_Context *ctx = data;
+   ELM_WIDGET_DATA_GET_OR_RETURN(ctx->obj, wd);
+
+   double width = 0.0, height = 0.0;
+
+   edje_object_calc_force(wd->resize_obj);
+   efl_ui_scrollbar_bar_size_get(ctx->smanager, &width, &height);
+   edje_object_part_drag_size_set(wd->resize_obj, "efl.dragable.hbar", width, 
1.0);
+   edje_object_part_drag_size_set(wd->resize_obj, "efl.dragable.vbar", 1.0, 
height);
+}
+
+static void
+_scroll_connector_bar_pos_changed_cb(void *data, const Efl_Event *event 
EINA_UNUSED)
+{
+   Scroll_Connector_Context *ctx = data;
+   ELM_WIDGET_DATA_GET_OR_RETURN(ctx->obj, wd);
+
+   double posx = 0.0, posy = 0.0;
+
+   efl_ui_scrollbar_bar_position_get(ctx->smanager, &posx, &posy);
+   edje_object_part_drag_value_set(wd->resize_obj, "efl.dragable.hbar", posx, 
0.0);
+   edje_object_part_drag_value_set(wd->resize_obj, "efl.dragable.vbar", 0.0, 
posy);
+}
+
+static void
+_scroll_connector_bar_show_cb(void *data, const Efl_Event *event)
+{
+   Scroll_Connector_Context *ctx = data;
+   ELM_WIDGET_DATA_GET_OR_RETURN(ctx->obj, wd);
+   Efl_Ui_Scrollbar_Direction type = *(Efl_Ui_Scrollbar_Direction 
*)(event->info);
+
+   if (type == EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL)
+     efl_layout_signal_emit(wd->resize_obj, "efl,action,show,hbar", "efl");
+   else if (type == EFL_UI_SCROLLBAR_DIRECTION_VERTICAL)
+     efl_layout_signal_emit(wd->resize_obj, "efl,action,show,vbar", "efl");
+}
+
+static void
+_scroll_connector_bar_hide_cb(void *data, const Efl_Event *event)
+{
+   Scroll_Connector_Context *ctx = data;
+   ELM_WIDGET_DATA_GET_OR_RETURN(ctx->obj, wd);
+   Efl_Ui_Scrollbar_Direction type = *(Efl_Ui_Scrollbar_Direction 
*)(event->info);
+
+   if (type == EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL)
+     efl_layout_signal_emit(wd->resize_obj, "efl,action,hide,hbar", "efl");
+   else if (type == EFL_UI_SCROLLBAR_DIRECTION_VERTICAL)
+     efl_layout_signal_emit(wd->resize_obj, "efl,action,hide,vbar", "efl");
+}
+static void
+_scroll_connector_resized_cb(void *data, const Efl_Event *ev EINA_UNUSED)
+{
+   Scroll_Connector_Context *ctx = data;
+   elm_layout_sizing_eval(ctx->obj);
+}
+
+static void
+_scroll_connector_size_hint_changed_cb(void *data, const Efl_Event *ev 
EINA_UNUSED)
+{
+   Scroll_Connector_Context *ctx = data;
+   elm_layout_sizing_eval(ctx->obj);
+}
+
+void
+efl_ui_scroll_connector_bind(Eo *obj, Eo *manager)
+{
+   Scroll_Connector_Context *ctx = calloc(1, sizeof(Scroll_Connector_Context));
+   ctx->obj = obj;
+   ctx->smanager = manager;
+   efl_key_data_set(obj, "__context", ctx);
+
+   //from the theme to the object
+   efl_layout_signal_callback_add(obj, "reload", "efl",
+                                  ctx, _scroll_connector_reload_cb, NULL);
+   efl_layout_signal_callback_add(obj, "drag", "efl.dragable.vbar",
+                                  ctx, _scroll_connector_vbar_drag_cb, NULL);
+   efl_layout_signal_callback_add(obj, "drag,set", "efl.dragable.vbar",
+                                  ctx, _scroll_connector_edje_drag_cb, NULL);
+   efl_layout_signal_callback_add(obj, "drag,start", "efl.dragable.vbar",
+                                  ctx, _scroll_connector_edje_drag_start_cb, 
NULL);
+   efl_layout_signal_callback_add(obj, "drag,stop", "efl.dragable.vbar",
+                                  ctx, _scroll_connector_edje_drag_stop_cb, 
NULL);
+   efl_layout_signal_callback_add(obj, "drag,step", "efl.dragable.vbar",
+                                  ctx, _scroll_connector_edje_drag_cb, NULL);
+   efl_layout_signal_callback_add(obj, "drag,page", "efl.dragable.vbar",
+                                  ctx, _scroll_connector_edje_drag_cb, NULL);
+   efl_layout_signal_callback_add(obj, "efl,vbar,press", "efl",
+                                  ctx, _scroll_connector_vbar_press_cb, NULL);
+   efl_layout_signal_callback_add(obj, "efl,vbar,unpress", "efl",
+                                  ctx, _scroll_connector_vbar_unpress_cb, 
NULL);
+   efl_layout_signal_callback_add(obj, "drag", "efl.dragable.hbar",
+                                  ctx, _scroll_connector_hbar_drag_cb, NULL);
+   efl_layout_signal_callback_add(obj, "drag,set", "efl.dragable.hbar",
+                                  ctx, _scroll_connector_edje_drag_cb, NULL);
+   efl_layout_signal_callback_add(obj, "drag,start", "efl.dragable.hbar",
+                                  ctx, _scroll_connector_edje_drag_start_cb, 
NULL);
+   efl_layout_signal_callback_add(obj, "drag,stop", "efl.dragable.hbar",
+                                  ctx, _scroll_connector_edje_drag_stop_cb, 
NULL);
+   efl_layout_signal_callback_add(obj, "drag,step", "efl.dragable.hbar",
+                                  ctx, _scroll_connector_edje_drag_cb, NULL);
+   efl_layout_signal_callback_add(obj, "drag,page", "efl.dragable.hbar",
+                                  ctx, _scroll_connector_edje_drag_cb, NULL);
+   efl_layout_signal_callback_add(obj, "efl,hbar,press", "efl",
+                                  ctx, _scroll_connector_hbar_press_cb, NULL);
+   efl_layout_signal_callback_add(obj, "efl,hbar,unpress", "efl",
+                                  ctx, _scroll_connector_hbar_unpress_cb, 
NULL);
+   //from the object to the theme
+   efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SIZE_CHANGED,
+                          _scroll_connector_bar_size_changed_cb, ctx);
+   efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_POS_CHANGED,
+                          _scroll_connector_bar_pos_changed_cb, ctx);
+   efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SHOW,
+                          _scroll_connector_bar_show_cb, ctx);
+   efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_HIDE,
+                          _scroll_connector_bar_hide_cb, ctx);
+   efl_event_callback_add(obj, EFL_GFX_ENTITY_EVENT_SIZE_CHANGED,
+                          _scroll_connector_resized_cb, ctx);
+   efl_event_callback_add(obj, EFL_GFX_ENTITY_EVENT_HINTS_CHANGED,
+                          _scroll_connector_size_hint_changed_cb, ctx);
+}
+
+void
+efl_ui_scroll_connector_unbind(Eo *obj)
+{
+   Scroll_Connector_Context *ctx;
+
+   ctx = efl_key_data_get(obj, "__context");
+   EINA_SAFETY_ON_NULL_RETURN(ctx);
+
+   efl_layout_signal_callback_del(obj, "reload", "efl",
+                                  ctx, _scroll_connector_reload_cb, NULL);
+   efl_layout_signal_callback_del(obj, "drag", "efl.dragable.vbar",
+                                  ctx, _scroll_connector_vbar_drag_cb, NULL);
+   efl_layout_signal_callback_del(obj, "drag,set", "efl.dragable.vbar",
+                                  ctx, _scroll_connector_edje_drag_cb, NULL);
+   efl_layout_signal_callback_del(obj, "drag,start", "efl.dragable.vbar",
+                                  ctx, _scroll_connector_edje_drag_start_cb, 
NULL);
+   efl_layout_signal_callback_del(obj, "drag,stop", "efl.dragable.vbar",
+                                  ctx, _scroll_connector_edje_drag_stop_cb, 
NULL);
+   efl_layout_signal_callback_del(obj, "drag,step", "efl.dragable.vbar",
+                                  ctx, _scroll_connector_edje_drag_cb, NULL);
+   efl_layout_signal_callback_del(obj, "drag,page", "efl.dragable.vbar",
+                                  ctx, _scroll_connector_edje_drag_cb, NULL);
+   efl_layout_signal_callback_del(obj, "efl,vbar,press", "efl",
+                                  ctx, _scroll_connector_vbar_press_cb, NULL);
+   efl_layout_signal_callback_del(obj, "efl,vbar,unpress", "efl",
+                                  ctx, _scroll_connector_vbar_unpress_cb, 
NULL);
+
+   efl_layout_signal_callback_del(obj, "drag", "efl.dragable.hbar",
+                                  ctx, _scroll_connector_hbar_drag_cb, NULL);
+   efl_layout_signal_callback_del(obj, "drag,set", "efl.dragable.hbar",
+                                  ctx, _scroll_connector_edje_drag_cb, NULL);
+   efl_layout_signal_callback_del(obj, "drag,start", "efl.dragable.hbar",
+                                  ctx, _scroll_connector_edje_drag_start_cb, 
NULL);
+   efl_layout_signal_callback_del(obj, "drag,stop", "efl.dragable.hbar",
+                                  ctx, _scroll_connector_edje_drag_stop_cb, 
NULL);
+   efl_layout_signal_callback_del(obj, "drag,step", "efl.dragable.hbar",
+                                  ctx, _scroll_connector_edje_drag_cb, NULL);
+   efl_layout_signal_callback_del(obj, "drag,page", "efl.dragable.hbar",
+                                  ctx, _scroll_connector_edje_drag_cb, NULL);
+   efl_layout_signal_callback_del(obj, "efl,hbar,press", "efl",
+                                  ctx, _scroll_connector_hbar_press_cb, NULL);
+   efl_layout_signal_callback_del(obj, "efl,hbar,unpress", "efl",
+                                  ctx, _scroll_connector_hbar_unpress_cb, 
NULL);
+   free(ctx);
+}
diff --git a/src/lib/elementary/efl_ui_scroller.c 
b/src/lib/elementary/efl_ui_scroller.c
index 50113c12b1..c731fe6572 100644
--- a/src/lib/elementary/efl_ui_scroller.c
+++ b/src/lib/elementary/efl_ui_scroller.c
@@ -211,329 +211,12 @@ _efl_ui_scroller_efl_content_content_unset(Eo *obj 
EINA_UNUSED, Efl_Ui_Scroller_
    return old_content;
 }
 
-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, "efl.dragable.vbar", NULL, &vy);
-   edje_object_part_drag_value_get
-      (wd->resize_obj, "efl.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, "efl.dragable.hbar", width, 
1.0);
-   edje_object_part_drag_size_set(wd->resize_obj, "efl.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, "efl.dragable.hbar", posx, 
0.0);
-   edje_object_part_drag_value_set(wd->resize_obj, "efl.dragable.vbar", 0.0, 
posy);
-   edje_object_signal_emit(wd->resize_obj, "efl,action,scroll", "efl");
-}
-
-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, "efl,action,show,hbar", "efl");
-   else if (type == EFL_UI_SCROLLBAR_DIRECTION_VERTICAL)
-     edje_object_signal_emit(wd->resize_obj, "efl,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, "efl,action,hide,hbar", "efl");
-   else if (type == EFL_UI_SCROLLBAR_DIRECTION_VERTICAL)
-     edje_object_signal_emit(wd->resize_obj, "efl,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",
-      obj, _efl_ui_scroller_reload_cb, NULL);
-   efl_layout_signal_callback_add
-     (obj, "drag", "efl.dragable.vbar",
-      obj, _efl_ui_scroller_vbar_drag_cb, NULL);
-   efl_layout_signal_callback_add
-     (obj, "drag,set", "efl.dragable.vbar",
-      obj, _efl_ui_scroller_edje_drag_cb, NULL);
-   efl_layout_signal_callback_add
-     (obj, "drag,start", "efl.dragable.vbar",
-      obj, _efl_ui_scroller_edje_drag_start_cb, NULL);
-   efl_layout_signal_callback_add
-     (obj, "drag,stop", "efl.dragable.vbar",
-      obj, _efl_ui_scroller_edje_drag_stop_cb, NULL);
-   efl_layout_signal_callback_add
-     (obj, "drag,step", "efl.dragable.vbar",
-      obj, _efl_ui_scroller_edje_drag_cb, NULL);
-   efl_layout_signal_callback_add
-     (obj, "drag,page", "efl.dragable.vbar",
-      obj, _efl_ui_scroller_edje_drag_cb, NULL);
-   efl_layout_signal_callback_add
-     (obj, "efl,vbar,press", "efl",
-      obj, _efl_ui_scroller_vbar_press_cb, NULL);
-   efl_layout_signal_callback_add
-     (obj, "efl,vbar,unpress", "efl",
-      obj, _efl_ui_scroller_vbar_unpress_cb, NULL);
-   efl_layout_signal_callback_add
-     (obj, "drag", "efl.dragable.hbar",
-      obj, _efl_ui_scroller_hbar_drag_cb, NULL);
-   efl_layout_signal_callback_add
-     (obj, "drag,set", "efl.dragable.hbar",
-      obj, _efl_ui_scroller_edje_drag_cb, NULL);
-   efl_layout_signal_callback_add
-     (obj, "drag,start", "efl.dragable.hbar",
-      obj, _efl_ui_scroller_edje_drag_start_cb, NULL);
-   efl_layout_signal_callback_add
-     (obj, "drag,stop", "efl.dragable.hbar",
-      obj, _efl_ui_scroller_edje_drag_stop_cb, NULL);
-   efl_layout_signal_callback_add
-     (obj, "drag,step", "efl.dragable.hbar",
-      obj, _efl_ui_scroller_edje_drag_cb, NULL);
-   efl_layout_signal_callback_add
-     (obj, "drag,page", "efl.dragable.hbar",
-      obj, _efl_ui_scroller_edje_drag_cb, NULL);
-   efl_layout_signal_callback_add
-     (obj, "efl,hbar,press", "efl",
-      obj, _efl_ui_scroller_hbar_press_cb, NULL);
-   efl_layout_signal_callback_add
-     (obj, "efl,hbar,unpress", "efl",
-      obj, _efl_ui_scroller_hbar_unpress_cb, NULL);
-}
-
-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",
-      obj, _efl_ui_scroller_reload_cb, NULL);
-   efl_layout_signal_callback_del
-     (obj, "drag", "efl.dragable.vbar",
-      obj, _efl_ui_scroller_vbar_drag_cb, NULL);
-   efl_layout_signal_callback_del
-     (obj, "drag,set", "efl.dragable.vbar",
-      obj, _efl_ui_scroller_edje_drag_cb, NULL);
-   efl_layout_signal_callback_del
-     (obj, "drag,start", "efl.dragable.vbar",
-      obj, _efl_ui_scroller_edje_drag_start_cb, NULL);
-   efl_layout_signal_callback_del
-     (obj, "drag,stop", "efl.dragable.vbar",
-      obj, _efl_ui_scroller_edje_drag_stop_cb, NULL);
-   efl_layout_signal_callback_del
-     (obj, "drag,step", "efl.dragable.vbar",
-      obj, _efl_ui_scroller_edje_drag_cb, NULL);
-   efl_layout_signal_callback_del
-     (obj, "drag,page", "efl.dragable.vbar",
-      obj, _efl_ui_scroller_edje_drag_cb, NULL);
-   efl_layout_signal_callback_del
-     (obj, "efl,vbar,press", "efl",
-      obj, _efl_ui_scroller_vbar_press_cb, NULL);
-   efl_layout_signal_callback_del
-     (obj, "efl,vbar,unpress", "efl",
-      obj, _efl_ui_scroller_vbar_unpress_cb, NULL);
-   efl_layout_signal_callback_del
-     (obj, "drag", "efl.dragable.hbar",
-      obj, _efl_ui_scroller_hbar_drag_cb, NULL);
-   efl_layout_signal_callback_del
-     (obj, "drag,set", "efl.dragable.hbar",
-      obj, _efl_ui_scroller_edje_drag_cb, NULL);
-   efl_layout_signal_callback_del
-     (obj, "drag,start", "efl.dragable.hbar",
-      obj, _efl_ui_scroller_edje_drag_start_cb, NULL);
-   efl_layout_signal_callback_del
-     (obj, "drag,stop", "efl.dragable.hbar",
-      obj, _efl_ui_scroller_edje_drag_stop_cb, NULL);
-   efl_layout_signal_callback_del
-     (obj, "drag,step", "efl.dragable.hbar",
-      obj, _efl_ui_scroller_edje_drag_cb, NULL);
-   efl_layout_signal_callback_del
-     (obj, "drag,page", "efl.dragable.hbar",
-      obj, _efl_ui_scroller_edje_drag_cb, NULL);
-   efl_layout_signal_callback_del
-     (obj, "efl,hbar,press", "efl",
-      obj, _efl_ui_scroller_hbar_press_cb, NULL);
-   efl_layout_signal_callback_del
-     (obj, "efl,hbar,unpress", "efl",
-      obj, _efl_ui_scroller_hbar_unpress_cb, NULL);
-}
-
 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);
-}
-
 static void
 _focused_element(void *data, const Efl_Event *event)
 {
@@ -566,7 +249,7 @@ _efl_ui_scroller_efl_object_constructor(Eo *obj,
 
 EOLIAN static Eo *
 _efl_ui_scroller_efl_object_finalize(Eo *obj,
-                                     Efl_Ui_Scroller_Data *sd EINA_UNUSED)
+                                     Efl_Ui_Scroller_Data *sd)
 {
    obj = efl_finalize(efl_super(obj, MY_CLASS));
 
@@ -583,20 +266,7 @@ _efl_ui_scroller_efl_object_finalize(Eo *obj,
 
    elm_widget_can_focus_set(obj, EINA_TRUE);
 
-   _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_ENTITY_EVENT_SIZE_CHANGED,
-                          _efl_ui_scroller_resized_cb, obj);
-   efl_event_callback_add(obj, EFL_GFX_ENTITY_EVENT_HINTS_CHANGED,
-                          _efl_ui_scroller_size_hint_changed_cb, obj);
+   efl_ui_scroll_connector_bind(obj, sd->smanager);
    efl_event_callback_add(sd->pan_obj, EFL_GFX_ENTITY_EVENT_SIZE_CHANGED,
                           _efl_ui_scroller_pan_resized_cb, obj);
 
@@ -606,22 +276,9 @@ _efl_ui_scroller_efl_object_finalize(Eo *obj,
 
 EOLIAN static void
 _efl_ui_scroller_efl_object_destructor(Eo *obj,
-                                       Efl_Ui_Scroller_Data *sd EINA_UNUSED)
+                                       Efl_Ui_Scroller_Data *sd)
 {
-   _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_ENTITY_EVENT_SIZE_CHANGED,
-                          _efl_ui_scroller_resized_cb, obj);
-   efl_event_callback_del(obj, EFL_GFX_ENTITY_EVENT_HINTS_CHANGED,
-                          _efl_ui_scroller_size_hint_changed_cb, obj);
+   efl_ui_scroll_connector_unbind(obj);
    efl_event_callback_del(sd->pan_obj, EFL_GFX_ENTITY_EVENT_SIZE_CHANGED,
                           _efl_ui_scroller_pan_resized_cb, obj);
    efl_del(sd->pan_obj);
diff --git a/src/lib/elementary/elm_priv.h b/src/lib/elementary/elm_priv.h
index 6af1ae3744..e621edf3c0 100644
--- a/src/lib/elementary/elm_priv.h
+++ b/src/lib/elementary/elm_priv.h
@@ -1025,5 +1025,19 @@ void _efl_ui_focus_event_redirector(Efl_Ui_Focus_Object 
*obj, Efl_Ui_Focus_Objec
 void efl_ui_widget_internal_set(Eo *obj, Eina_Bool internal);
 Eina_Bool efl_ui_widget_internal_get(Eo *obj);
 
+/**
+ * Connect the default scrollable theme signals with the object events and 
vice versa
+ *
+ * @param obj The object where to listen for theme signals
+ * @param manager The scroll manager object where to listen for events
+ */
+void efl_ui_scroll_connector_bind(Eo *obj, Eo *manager);
+
+/**
+ * Connect the default scrollable theme signals with the object events and 
vice versa
+ *
+ * @param obj The object where we are listening for events
+ */
+void efl_ui_scroll_connector_unbind(Eo *obj);
 
 #endif
diff --git a/src/lib/elementary/meson.build b/src/lib/elementary/meson.build
index 59d355cc71..92e780d728 100644
--- a/src/lib/elementary/meson.build
+++ b/src/lib/elementary/meson.build
@@ -937,6 +937,7 @@ elementary_src = [
   'efl_ui_clickable.c',
   'efl_ui_clickable_util.c',
   'efl_ui_format.c',
+  'efl_ui_scroll_util.c',
 ]
 
 elementary_deps = [emile, eo, efl, edje, ethumb, ethumb_client, emotion, 
ecore_imf, ecore_con, eldbus, efreet, efreet_mime, efreet_trash, eio, atspi, 
dl, intl]

-- 


Reply via email to