zmike pushed a commit to branch master.

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

commit ebae12f06a944259b9b4c094bdb009c6391c67ea
Author: WooHyun Jung <wh0705.j...@samsung.com>
Date:   Tue Aug 20 09:09:14 2019 -0400

    elm_slider: remove dependency with efl_ui_slider
    
    Summary:
    This commit includes follwoing works.
    
    1. change parent class from EFL_UI_SLIDER_INTERVAL
      to EFL_UI_LAYOUT_BASE
    2. get all necessary codes from efl_ui_slider and
       efl_ui_slider_interval to elm_slider
    3. add callbacks to slider test code
    
    ref T7893
    
    Test Plan:
    1. elementary_test
    2. slider
    3. operate sliders on the window
    
    Reviewers: bu5hm4n, segfaultxavi, eagleeye, zmike
    
    Reviewed By: zmike
    
    Subscribers: zmike, cedric, #reviewers, #committers
    
    Tags: #efl
    
    Maniphest Tasks: T7893
    
    Differential Revision: https://phab.enlightenment.org/D9623
---
 src/bin/elementary/test_slider.c       |  16 +
 src/lib/elementary/elm_slider.c        | 939 +++++++++++++++++++++------------
 src/lib/elementary/elm_slider_eo.c     |   2 +-
 src/lib/elementary/elm_widget_slider.h |  13 +-
 src/tests/elementary/elm_test_slider.c |   8 +-
 5 files changed, 628 insertions(+), 350 deletions(-)

diff --git a/src/bin/elementary/test_slider.c b/src/bin/elementary/test_slider.c
index 1b0b2999c3..10c21441c7 100644
--- a/src/bin/elementary/test_slider.c
+++ b/src/bin/elementary/test_slider.c
@@ -24,6 +24,18 @@ _change_cb(void *data, Evas_Object *obj, void *event_info 
EINA_UNUSED)
    elm_slider_value_set(data, val);
 }
 
+void
+_drag_start_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info 
EINA_UNUSED)
+{
+   printf("drag,started! slider value : %d\n", 
(int)round(elm_slider_value_get(obj)));
+}
+
+void
+_drag_stop_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info 
EINA_UNUSED)
+{
+   printf("drag,stopped! slider value : %d\n", 
(int)round(elm_slider_value_get(obj)));
+}
+
 static void
 _ok_btn_clicked(void *data, Evas_Object *obj EINA_UNUSED,
                        void *event_info EINA_UNUSED)
@@ -244,6 +256,10 @@ test_slider(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_in
    evas_object_show(ic);
    evas_object_show(sl);
 
+   evas_object_smart_callback_add(sl, "slider,drag,start", _drag_start_cb, 
NULL);
+   evas_object_smart_callback_add(sl, "slider,drag,stop", _drag_stop_cb, NULL);
+
+
    // horizontally inverted slider
    ic = elm_icon_add(bx);
    snprintf(buf, sizeof(buf), "%s/images/logo_small.png", 
elm_app_data_dir_get());
diff --git a/src/lib/elementary/elm_slider.c b/src/lib/elementary/elm_slider.c
index eab59c1c0d..cc09ed14b7 100644
--- a/src/lib/elementary/elm_slider.c
+++ b/src/lib/elementary/elm_slider.c
@@ -81,7 +81,6 @@ _is_horizontal(Efl_Ui_Layout_Orientation dir)
 static void
 _units_set(Evas_Object *obj)
 {
-   EFL_UI_SLIDER_DATA_GET(obj, sd2);
    ELM_SLIDER_DATA_GET(obj, sd);
 
    if (sd->format_cb)
@@ -92,7 +91,7 @@ _units_set(Evas_Object *obj)
 
         eina_strbuf_reset(sd->format_strbuf);
         if (!sd->intvl_enable)
-          eina_value_set(&val, sd2->val);
+          eina_value_set(&val, sd->val);
         else
           {
              double v1, v2;
@@ -126,8 +125,6 @@ _units_set(Evas_Object *obj)
 static void
 _indicator_set(Evas_Object *obj)
 {
-   EFL_UI_SLIDER_DATA_GET(obj, sd2);
-   EFL_UI_SLIDER_INTERVAL_DATA_GET(obj, pd);
    ELM_SLIDER_DATA_GET(obj, sd);
 
    Eina_Value val;
@@ -138,7 +135,7 @@ _indicator_set(Evas_Object *obj)
    eina_value_setup(&val, EINA_VALUE_TYPE_DOUBLE);
    eina_strbuf_reset(sd->indi_format_strbuf);
 
-   eina_value_set(&val, sd2->val);
+   eina_value_set(&val, sd->val);
    sd->indi_format_cb(sd->indi_format_cb_data, sd->indi_format_strbuf, val);
 
    str = eina_strbuf_string_get(sd->indi_format_strbuf);
@@ -151,7 +148,7 @@ _indicator_set(Evas_Object *obj)
    if (sd->popup2)
      {
         eina_strbuf_reset(sd->indi_format_strbuf);
-        eina_value_set(&val, pd->intvl_to);
+        eina_value_set(&val, sd->intvl_to);
         sd->indi_format_cb(sd->indi_format_cb_data, sd->indi_format_strbuf, 
val);
         str = eina_strbuf_string_get(sd->indi_format_strbuf);
         elm_layout_text_set(obj, "elm.dragable2.slider:elm.indicator", str);
@@ -164,7 +161,6 @@ _indicator_set(Evas_Object *obj)
 static void
 _min_max_set(Evas_Object *obj)
 {
-   EFL_UI_SLIDER_DATA_GET(obj, sd2);
    ELM_SLIDER_DATA_GET(obj, sd);
    Eina_Strbuf *str;
    Eina_Value val;
@@ -174,13 +170,13 @@ _min_max_set(Evas_Object *obj)
 
    str = eina_strbuf_new();
 
-   eina_value_set(&val, sd2->val_max);
+   eina_value_set(&val, sd->val_max);
    sd->format_cb(sd->format_cb_data, str, val);
    elm_layout_text_set(obj, "elm.units.min", eina_strbuf_string_get(str));
 
    eina_strbuf_reset(str);
 
-   eina_value_set(&val, sd2->val_min);
+   eina_value_set(&val, sd->val_min);
    sd->format_cb(sd->format_cb_data, str, val);
    elm_layout_text_set(obj, "elm.units.max", eina_strbuf_string_get(str));
 
@@ -293,6 +289,190 @@ _wheel_indicator_timer_cb(void *data)
    return ECORE_CALLBACK_CANCEL;
 }
 
+static void
+_val_set(Evas_Object *obj)
+{
+   double pos, pos2;
+
+   ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd);
+   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+
+   if (sd->val_max > sd->val_min)
+     {
+        pos = (sd->val - sd->val_min) / (sd->val_max - sd->val_min);
+        pos2 = (sd->intvl_to - sd->val_min) / (sd->val_max - sd->val_min);
+     }
+   else
+     {
+        pos = 0.0;
+        pos2 = 0.0;
+     }
+
+   if (pos < 0.0) pos = 0.0;
+   else if (pos > 1.0)
+     pos = 1.0;
+
+   if (pos2 < 0.0) pos2 = 0.0;
+   else if (pos2 > 1.0)
+     pos2 = 1.0;
+
+   if (efl_ui_mirrored_get(obj) ^ 
efl_ui_layout_orientation_is_inverted(sd->dir))
+     {
+        pos = 1.0 - pos;
+        pos2 = 1.0 - pos2;
+     }
+
+   efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"),
+                         pos, pos);
+   if (sd->intvl_enable)
+     efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable2.slider"),
+                           pos2, pos2);
+
+   // emit accessibility event also if value was changed by API
+   if (_elm_config->atspi_mode)
+     efl_access_value_changed_signal_emit(obj);
+
+   evas_object_smart_changed(obj);
+}
+
+static void
+_val_fetch(Evas_Object *obj, Eina_Bool user_event)
+{
+   double posx = 0.0, posy = 0.0, pos = 0.0, val;
+   double posx2 = 0.0, posy2 = 0.0, pos2 = 0.0, val2 = 0.0;
+   Eina_Bool inverted = EINA_FALSE;
+   Eina_Bool evented = EINA_FALSE;
+
+   ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd);
+   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+
+   efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable.slider"),
+                         &posx, &posy);
+   if (efl_ui_layout_orientation_is_horizontal(sd->dir, EINA_TRUE)) pos = posx;
+   else pos = posy;
+
+   if (sd->intvl_enable)
+     {
+        efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable2.slider"),
+                              &posx2, &posy2);
+        if (efl_ui_layout_orientation_is_horizontal(sd->dir, EINA_TRUE)) pos2 
= posx2;
+        else pos2 = posy2;
+     }
+
+   if (efl_ui_mirrored_get(obj) ^ 
efl_ui_layout_orientation_is_inverted(sd->dir))
+     {
+        pos = 1.0 - pos;
+        pos2 = 1.0 - pos2;
+        inverted = EINA_TRUE;
+     }
+
+   val = (pos * (sd->val_max - sd->val_min)) + sd->val_min;
+
+   if (sd->intvl_enable)
+     {
+        val2 = (pos2 * (sd->val_max - sd->val_min)) + sd->val_min;
+        if (!inverted)
+          {
+             if (val > sd->intvl_to)
+               {
+                  val = sd->intvl_to;
+                  _val_set(obj);
+               }
+             else if (val2 < sd->intvl_from)
+               {
+                  val2 = sd->intvl_from;
+                  _val_set(obj);
+               }
+          }
+        else
+          {
+             if (val < sd->intvl_to)
+               {
+                  val = sd->intvl_to;
+                  _val_set(obj);
+               }
+             else if (val2 > sd->intvl_from)
+               {
+                  val2 = sd->intvl_from;
+                  _val_set(obj);
+               }
+          }
+     }
+   if (fabs(val - sd->val) > DBL_EPSILON)
+     {
+        sd->val = val;
+        sd->intvl_from = val;
+        if (user_event)
+          {
+             evas_object_smart_callback_call(obj, SIG_CHANGED, NULL);
+             ecore_timer_del(sd->delay);
+             sd->delay = ecore_timer_add(SLIDER_DELAY_CHANGED_INTERVAL, 
_delay_change, obj);
+             evented = EINA_TRUE;
+          }
+     }
+
+   if (sd->intvl_enable && fabs(val2 - sd->intvl_to) > DBL_EPSILON)
+     {
+        sd->intvl_to = val2;
+        /* avoid emitting two events and setting a timer twice */
+        if (user_event && (!evented))
+          {
+             evas_object_smart_callback_call(obj, SIG_CHANGED, NULL);
+             ecore_timer_del(sd->delay);
+             sd->delay = ecore_timer_add(SLIDER_DELAY_CHANGED_INTERVAL, 
_delay_change, obj);
+          }
+     }
+}
+
+static void
+_slider_update(Evas_Object *obj, Eina_Bool user_event)
+{
+   _val_fetch(obj, user_event);
+   evas_object_smart_changed(obj);
+}
+
+static void
+_drag(void *data,
+      Evas_Object *obj EINA_UNUSED,
+      const char *emission EINA_UNUSED,
+      const char *source EINA_UNUSED)
+{
+   _slider_update(data, EINA_TRUE);
+}
+
+static void
+_drag_start(void *data,
+            Evas_Object *obj EINA_UNUSED,
+            const char *emission EINA_UNUSED,
+            const char *source EINA_UNUSED)
+{
+   if (!efl_ui_focus_object_focus_get(data))
+     elm_object_focus_set(data, EINA_TRUE);
+   _slider_update(data, EINA_TRUE);
+   evas_object_smart_callback_call(data, SIG_DRAG_START, NULL);
+   elm_widget_scroll_freeze_push(data);
+}
+
+static void
+_drag_stop(void *data,
+           Evas_Object *obj EINA_UNUSED,
+           const char *emission EINA_UNUSED,
+           const char *source EINA_UNUSED)
+{
+   _slider_update(data, EINA_TRUE);
+   evas_object_smart_callback_call(data, SIG_DRAG_STOP, NULL);
+   elm_widget_scroll_freeze_pop(data);
+}
+
+static void
+_drag_step(void *data,
+           Evas_Object *obj EINA_UNUSED,
+           const char *emission EINA_UNUSED,
+           const char *source EINA_UNUSED)
+{
+   _slider_update(data, EINA_TRUE);
+}
+
 static void
 _drag_up(void *data,
          Evas_Object *obj EINA_UNUSED,
@@ -301,7 +481,7 @@ _drag_up(void *data,
 {
    double step;
 
-   EFL_UI_SLIDER_DATA_GET(data, sd);
+   ELM_SLIDER_DATA_GET(data, sd);
    step = sd->step;
 
    if (efl_ui_layout_orientation_is_inverted(sd->dir)) step *= -1.0;
@@ -319,7 +499,7 @@ _drag_down(void *data,
 {
    double step;
 
-   EFL_UI_SLIDER_DATA_GET(data, sd);
+   ELM_SLIDER_DATA_GET(data, sd);
    step = -sd->step;
 
    if (efl_ui_layout_orientation_is_inverted(sd->dir)) step *= -1.0;
@@ -332,7 +512,7 @@ _drag_down(void *data,
 static Eina_Bool
 _key_action_drag(Evas_Object *obj, const char *params)
 {
-   EFL_UI_SLIDER_DATA_GET(obj, sd);
+   ELM_SLIDER_DATA_GET(obj, sd);
    const char *dir = params;
 
    if (!strcmp(dir, "left"))
@@ -405,7 +585,7 @@ _elm_slider_efl_ui_widget_widget_input_event_handler(Eo 
*obj, Elm_Slider_Data *s
    else return EINA_FALSE;
 
    _popup_show(obj, NULL, NULL, NULL);
-   efl_ui_slider_val_fetch(obj, EINA_TRUE);
+   _val_fetch(obj, EINA_TRUE);
    evas_object_smart_changed(obj);
 
    return EINA_TRUE;
@@ -466,310 +646,81 @@ _track2_resize_cb(void *data,
 static void
 _popup_update(Evas_Object *obj, Elm_Slider_Data *sd, Evas_Object *popup)
 {
-   EFL_UI_SLIDER_DATA_GET(obj, sd2);
    if (elm_widget_is_legacy(obj))
      {
-        if (_is_horizontal(sd2->dir))
-          elm_widget_theme_object_set(obj, popup, "slider", 
"horizontal/popup", elm_widget_style_get(obj));
-        else
-          elm_widget_theme_object_set(obj, popup, "slider", "vertical/popup", 
elm_widget_style_get(obj));
-     }
-   else
-     elm_widget_element_update(obj, popup, PART_NAME_POPUP);
-   edje_object_scale_set(popup, efl_gfx_entity_scale_get(obj) *
-                         elm_config_scale_get());
-
-   if (!efl_ui_layout_orientation_is_inverted(sd2->dir))
-     edje_object_signal_emit(popup, "elm,state,inverted,off", "elm");
-   else
-     edje_object_signal_emit(popup, "elm,state,inverted,on", "elm");
-
-   if (sd->indicator_show)
-     edje_object_signal_emit(popup, "elm,state,val,show", "elm");
-   else
-     edje_object_signal_emit(popup, "elm,state,val,hide", "elm");
-}
-
-static void
-_popup_add(Elm_Slider_Data *sd, Eo *obj, Evas_Object **popup,
-           Evas_Object **track, Eina_Bool is_range)
-{
-   /* if theme has an overlayed slider mode, then lets support it */
-   if (!is_range
-       && !edje_object_part_exists(elm_layout_edje_get(obj), 
"elm.track.slider"))
-     return;
-   else if (is_range
-            && !edje_object_part_exists(elm_layout_edje_get(obj), 
"elm.track2.slider"))
-     return;
-
-   // XXX popup needs to adapt to theme etc.
-   *popup = edje_object_add(evas_object_evas_get(obj));
-   evas_object_smart_member_add(*popup, obj);
-   edje_object_signal_callback_add(*popup, "popup,hide,done", "elm", // XXX: 
for compat
-                                   _popup_hide_done, obj);
-   edje_object_signal_callback_add(*popup, "elm,popup,hide,done", "elm",
-                                   _popup_hide_done, obj);
-
-   _popup_update(obj, sd, *popup);
-
-   /* create a rectangle to track position+size of the dragable */
-   *track = evas_object_rectangle_add(evas_object_evas_get(obj));
-   evas_object_color_set(*track, 0, 0, 0, 0);
-   evas_object_pass_events_set(*track, EINA_TRUE);
-   if (!is_range)
-     {
-        evas_object_event_callback_add
-           (*track, EVAS_CALLBACK_MOVE, _track_move_cb, obj);
-        evas_object_event_callback_add
-           (*track, EVAS_CALLBACK_RESIZE, _track_resize_cb, obj);
-        elm_layout_content_set(obj, "elm.track.slider", *track);
-     }
-   else
-     {
-        evas_object_event_callback_add
-           (*track, EVAS_CALLBACK_MOVE, _track2_move_cb, obj);
-        evas_object_event_callback_add
-           (*track, EVAS_CALLBACK_RESIZE, _track2_resize_cb, obj);
-        elm_layout_content_set(obj, "elm.track2.slider", *track);
-     }
-}
-
-void
-_elm_slider_val_fetch(Evas_Object *obj, Elm_Slider_Data *pd, Eina_Bool 
user_event)
-{
-   double posx = 0.0, posy = 0.0, pos = 0.0, val;
-   double posx2 = 0.0, posy2 = 0.0, pos2 = 0.0, val2 = 0.0;
-   Eina_Bool inverted = EINA_FALSE;
-   Eina_Bool evented = EINA_FALSE;
-
-   EFL_UI_SLIDER_DATA_GET(obj, sd);
-   EFL_UI_SLIDER_INTERVAL_DATA_GET(obj, id);
-   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
-
-   efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable.slider"),
-                         &posx, &posy);
-   if (efl_ui_layout_orientation_is_horizontal(sd->dir, EINA_TRUE)) pos = posx;
-   else pos = posy;
-
-   if (pd->intvl_enable)
-     {
-        efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable2.slider"),
-                              &posx2, &posy2);
-        if (efl_ui_layout_orientation_is_horizontal(sd->dir, EINA_TRUE)) pos2 
= posx2;
-        else pos2 = posy2;
-     }
-
-   if (efl_ui_mirrored_get(obj) ^ 
efl_ui_layout_orientation_is_inverted(sd->dir))
-     {
-        pos = 1.0 - pos;
-        pos2 = 1.0 - pos2;
-        inverted = EINA_TRUE;
-     }
-
-   val = (pos * (sd->val_max - sd->val_min)) + sd->val_min;
-
-   if (pd->intvl_enable)
-     {
-        val2 = (pos2 * (sd->val_max - sd->val_min)) + sd->val_min;
-        if (!inverted)
-          {
-             if (val > id->intvl_to)
-               {
-                  val = id->intvl_to;
-                  efl_ui_slider_val_set(obj);
-               }
-             else if (val2 < id->intvl_from)
-               {
-                  val2 = id->intvl_from;
-                  efl_ui_slider_val_set(obj);
-               }
-          }
-        else
-          {
-             if (val < id->intvl_to)
-               {
-                  val = id->intvl_to;
-                  efl_ui_slider_val_set(obj);
-               }
-             else if (val2 > id->intvl_from)
-               {
-                  val2 = id->intvl_from;
-                  efl_ui_slider_val_set(obj);
-               }
-          }
-     }
-   if (fabs(val - sd->val) > DBL_EPSILON)
-     {
-        sd->val = val;
-        id->intvl_from = val;
-        if (user_event)
-          {
-             efl_event_callback_legacy_call(obj, EFL_UI_RANGE_EVENT_CHANGED, 
NULL);
-             ecore_timer_del(pd->delay);
-             pd->delay = ecore_timer_add(SLIDER_DELAY_CHANGED_INTERVAL, 
_delay_change, obj);
-             evented = EINA_TRUE;
-          }
-     }
-
-   if (pd->intvl_enable && fabs(val2 - id->intvl_to) > DBL_EPSILON)
-     {
-        id->intvl_to = val2;
-        /* avoid emitting two events and setting a timer twice */
-        if (user_event && (!evented))
-          {
-             efl_event_callback_legacy_call(obj, EFL_UI_RANGE_EVENT_CHANGED, 
NULL);
-             ecore_timer_del(pd->delay);
-             pd->delay = ecore_timer_add(SLIDER_DELAY_CHANGED_INTERVAL, 
_delay_change, obj);
-          }
-     }
-}
-
-void
-_elm_slider_val_set(Evas_Object *obj, Elm_Slider_Data *pd)
-{
-   double pos, pos2;
-
-   EFL_UI_SLIDER_DATA_GET(obj, sd);
-   EFL_UI_SLIDER_INTERVAL_DATA_GET(obj, id);
-   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
-
-   if (sd->val_max > sd->val_min)
-     {
-        pos = (sd->val - sd->val_min) / (sd->val_max - sd->val_min);
-        pos2 = (id->intvl_to - sd->val_min) / (sd->val_max - sd->val_min);
-     }
-   else
-     {
-        pos = 0.0;
-        pos2 = 0.0;
-     }
-
-   if (pos < 0.0) pos = 0.0;
-   else if (pos > 1.0)
-     pos = 1.0;
-
-   if (pos2 < 0.0) pos2 = 0.0;
-   else if (pos2 > 1.0)
-     pos2 = 1.0;
-
-   if (efl_ui_mirrored_get(obj) ^ 
efl_ui_layout_orientation_is_inverted(sd->dir))
-     {
-        pos = 1.0 - pos;
-        pos2 = 1.0 - pos2;
-     }
-
-   efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"),
-                         pos, pos);
-   if (pd->intvl_enable)
-     efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable2.slider"),
-                           pos2, pos2);
-
-   // emit accessibility event also if value was changed by API
-   if (_elm_config->atspi_mode)
-     efl_access_value_changed_signal_emit(obj);
-
-   evas_object_smart_changed(obj);
-}
-void
-_elm_slider_down_knob(Evas_Object *obj, Elm_Slider_Data *pd, double button_x, 
double button_y)
-{
-   EFL_UI_SLIDER_DATA_GET(obj, sd);
-   EFL_UI_SLIDER_INTERVAL_DATA_GET(obj, id);
-   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
-
-   if (!pd->intvl_enable)
-     {
-        efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"),
-                              button_x, button_y);
-     }
-   else
-     {
-        double posx = 0.0, posy = 0.0, posx2 = 0.0, posy2 = 0.0, diff1, diff2, 
diff3;
-
-        efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable.slider"),
-                              &posx, &posy);
-        efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable2.slider"),
-                              &posx2, &posy2);
-
-        if (efl_ui_layout_orientation_is_horizontal(sd->dir, EINA_TRUE))
-          {
-             diff1 = fabs(button_x - posx);
-             diff2 = fabs(button_x - posx2);
-             diff3 = button_x - posx;
-          }
-        else
-          {
-             diff1 = fabs(button_y - posy);
-             diff2 = fabs(button_y - posy2);
-             diff3 = button_y - posy;
-          }
-
-        if (diff1 < diff2)
-          {
-             efl_ui_drag_value_set(efl_part(wd->resize_obj, 
"elm.dragable.slider"),
-                                   button_x, button_y);
-             id->intvl_flag = 1;
-          }
-        else if (diff1 > diff2)
-          {
-             efl_ui_drag_value_set(efl_part(wd->resize_obj, 
"elm.dragable2.slider"),
-                                   button_x, button_y);
-             id->intvl_flag = 2;
-          }
-        else
-          {
-             if (diff3 < 0)
-               {
-                  efl_ui_drag_value_set(efl_part(wd->resize_obj, 
"elm.dragable.slider"),
-                                        button_x, button_y);
-                  id->intvl_flag = 1;
-               }
-             else
-               {
-                  efl_ui_drag_value_set(efl_part(wd->resize_obj, 
"elm.dragable2.slider"),
-                                        button_x, button_y);
-                  id->intvl_flag = 2;
-               }
-          }
+        if (_is_horizontal(sd->dir))
+          elm_widget_theme_object_set(obj, popup, "slider", 
"horizontal/popup", elm_widget_style_get(obj));
+        else
+          elm_widget_theme_object_set(obj, popup, "slider", "vertical/popup", 
elm_widget_style_get(obj));
      }
+   else
+     elm_widget_element_update(obj, popup, PART_NAME_POPUP);
+   edje_object_scale_set(popup, efl_gfx_entity_scale_get(obj) *
+                         elm_config_scale_get());
+
+   if (!efl_ui_layout_orientation_is_inverted(sd->dir))
+     edje_object_signal_emit(popup, "elm,state,inverted,off", "elm");
+   else
+     edje_object_signal_emit(popup, "elm,state,inverted,on", "elm");
+
+   if (sd->indicator_show)
+     edje_object_signal_emit(popup, "elm,state,val,show", "elm");
+   else
+     edje_object_signal_emit(popup, "elm,state,val,hide", "elm");
 }
 
-void
-_elm_slider_move_knob(Evas_Object *obj, Elm_Slider_Data *pd, double button_x, 
double button_y)
+static void
+_popup_add(Elm_Slider_Data *sd, Eo *obj, Evas_Object **popup,
+           Evas_Object **track, Eina_Bool is_range)
 {
-   EFL_UI_SLIDER_INTERVAL_DATA_GET(obj, id);
-   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+   /* if theme has an overlayed slider mode, then lets support it */
+   if (!is_range
+       && !edje_object_part_exists(elm_layout_edje_get(obj), 
"elm.track.slider"))
+     return;
+   else if (is_range
+            && !edje_object_part_exists(elm_layout_edje_get(obj), 
"elm.track2.slider"))
+     return;
+
+   // XXX popup needs to adapt to theme etc.
+   *popup = edje_object_add(evas_object_evas_get(obj));
+   evas_object_smart_member_add(*popup, obj);
+   edje_object_signal_callback_add(*popup, "popup,hide,done", "elm", // XXX: 
for compat
+                                   _popup_hide_done, obj);
+   edje_object_signal_callback_add(*popup, "elm,popup,hide,done", "elm",
+                                   _popup_hide_done, obj);
+
+   _popup_update(obj, sd, *popup);
 
-   if (!pd->intvl_enable)
+   /* create a rectangle to track position+size of the dragable */
+   *track = evas_object_rectangle_add(evas_object_evas_get(obj));
+   evas_object_color_set(*track, 0, 0, 0, 0);
+   evas_object_pass_events_set(*track, EINA_TRUE);
+   if (!is_range)
      {
-        efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"),
-                              button_x, button_y);
+        evas_object_event_callback_add
+           (*track, EVAS_CALLBACK_MOVE, _track_move_cb, obj);
+        evas_object_event_callback_add
+           (*track, EVAS_CALLBACK_RESIZE, _track_resize_cb, obj);
+        elm_layout_content_set(obj, "elm.track.slider", *track);
      }
    else
      {
-        if (id->intvl_flag == 1)
-          {
-             efl_ui_drag_value_set(efl_part(wd->resize_obj, 
"elm.dragable.slider"),
-                                   button_x, button_y);
-          }
-        else if (id->intvl_flag == 2)
-          {
-             efl_ui_drag_value_set(efl_part(wd->resize_obj, 
"elm.dragable2.slider"),
-                                   button_x, button_y);
-          }
-
+        evas_object_event_callback_add
+           (*track, EVAS_CALLBACK_MOVE, _track2_move_cb, obj);
+        evas_object_event_callback_add
+           (*track, EVAS_CALLBACK_RESIZE, _track2_resize_cb, obj);
+        elm_layout_content_set(obj, "elm.track2.slider", *track);
      }
 }
 
 static char *
-_elm_slider_theme_group_get(Evas_Object *obj, Elm_Slider_Data *sd)
+_elm_slider_theme_group_get(Evas_Object *obj EINA_UNUSED, Elm_Slider_Data *sd)
 {
-   EFL_UI_SLIDER_DATA_GET(obj, sd2);
    Eina_Strbuf *new_group = eina_strbuf_new();
 
    if (sd->intvl_enable)
      eina_strbuf_append(new_group, "range/");
-   if (_is_horizontal(sd2->dir))
+   if (_is_horizontal(sd->dir))
      eina_strbuf_append(new_group, "horizontal");
    else
      eina_strbuf_append(new_group, "vertical");
@@ -782,7 +733,6 @@ _elm_slider_efl_ui_widget_theme_apply(Eo *obj, 
Elm_Slider_Data *sd)
 {
    Eina_Error int_ret = EFL_UI_THEME_APPLY_ERROR_GENERIC;
    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EFL_UI_THEME_APPLY_ERROR_GENERIC);
-   EFL_UI_SLIDER_DATA_GET_OR_RETURN(obj, sd2, 
EFL_UI_THEME_APPLY_ERROR_GENERIC);
    char *group;
 
    group = _elm_slider_theme_group_get(obj, sd);
@@ -795,13 +745,13 @@ _elm_slider_efl_ui_widget_theme_apply(Eo *obj, 
Elm_Slider_Data *sd)
    int_ret = efl_ui_widget_theme_apply(efl_super(obj, MY_CLASS));
    if (int_ret == EFL_UI_THEME_APPLY_ERROR_GENERIC) return int_ret;
 
-   if (_is_horizontal(sd2->dir))
+   if (_is_horizontal(sd->dir))
      evas_object_size_hint_min_set
-       (sd2->spacer, (double)sd->size * efl_gfx_entity_scale_get(obj) *
+       (sd->spacer, (double)sd->size * efl_gfx_entity_scale_get(obj) *
        elm_config_scale_get(), 1);
    else
      evas_object_size_hint_min_set
-       (sd2->spacer, 1, (double)sd->size * efl_gfx_entity_scale_get(obj) *
+       (sd->spacer, 1, (double)sd->size * efl_gfx_entity_scale_get(obj) *
        elm_config_scale_get());
 
    if (sd->intvl_enable)
@@ -809,7 +759,7 @@ _elm_slider_efl_ui_widget_theme_apply(Eo *obj, 
Elm_Slider_Data *sd)
    else
      elm_layout_signal_emit(obj, "elm,slider,range,disable", "elm");
 
-   if (efl_ui_layout_orientation_is_inverted(sd2->dir))
+   if (efl_ui_layout_orientation_is_inverted(sd->dir))
      elm_layout_signal_emit(obj, "elm,state,inverted,on", "elm");
    else
      elm_layout_signal_emit(obj, "elm,state,inverted,off", "elm");
@@ -834,6 +784,7 @@ _elm_slider_efl_ui_widget_theme_apply(Eo *obj, 
Elm_Slider_Data *sd)
    _min_max_set(obj);
    _units_set(obj);
    _indicator_set(obj);
+   _val_set(obj);
 
    edje_object_message_signal_process(wd->resize_obj);
    if (sd->popup)
@@ -850,12 +801,96 @@ static void
 _spacer_down_cb(void *data,
                 Evas *e EINA_UNUSED,
                 Evas_Object *obj EINA_UNUSED,
-                void *event_info EINA_UNUSED)
+                void *event_info)
 {
-   ELM_SLIDER_DATA_GET(data, sd);
+   ELM_SLIDER_DATA_GET_OR_RETURN(data, sd);
+   ELM_WIDGET_DATA_GET_OR_RETURN(data, wd);
+
+   Evas_Event_Mouse_Down *ev = event_info;
+   Eina_Rect sr;
+   double button_x = 0.0, button_y = 0.0;
 
    sd->spacer_down = EINA_TRUE;
+   sr = efl_gfx_entity_geometry_get(sd->spacer);
+   sd->downx = ev->canvas.x - sr.x;
+   sd->downy = ev->canvas.y - sr.y;
+   if (_is_horizontal(sd->dir))
+     {
+        button_x = ((double)ev->canvas.x - (double)sr.x) / (double)sr.w;
+        if (button_x > 1) button_x = 1;
+        if (button_x < 0) button_x = 0;
+     }
+   else
+     {
+        button_y = ((double)ev->canvas.y - (double)sr.y) / (double)sr.h;
+        if (button_y > 1) button_y = 1;
+        if (button_y < 0) button_y = 0;
+     }
+
+   if (!sd->intvl_enable)
+     {
+        efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"),
+                              button_x, button_y);
+     }
+   else
+     {
+        double posx = 0.0, posy = 0.0, posx2 = 0.0, posy2 = 0.0, diff1, diff2, 
diff3;
+
+        efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable.slider"),
+                              &posx, &posy);
+        efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable2.slider"),
+                              &posx2, &posy2);
+
+        if (efl_ui_layout_orientation_is_horizontal(sd->dir, EINA_TRUE))
+          {
+             diff1 = fabs(button_x - posx);
+             diff2 = fabs(button_x - posx2);
+             diff3 = button_x - posx;
+          }
+        else
+          {
+             diff1 = fabs(button_y - posy);
+             diff2 = fabs(button_y - posy2);
+             diff3 = button_y - posy;
+          }
+
+        if (diff1 < diff2)
+          {
+             efl_ui_drag_value_set(efl_part(wd->resize_obj, 
"elm.dragable.slider"),
+                                   button_x, button_y);
+             sd->intvl_flag = 1;
+          }
+        else if (diff1 > diff2)
+          {
+             efl_ui_drag_value_set(efl_part(wd->resize_obj, 
"elm.dragable2.slider"),
+                                   button_x, button_y);
+             sd->intvl_flag = 2;
+          }
+        else
+          {
+             if (diff3 < 0)
+               {
+                  efl_ui_drag_value_set(efl_part(wd->resize_obj, 
"elm.dragable.slider"),
+                                        button_x, button_y);
+                  sd->intvl_flag = 1;
+               }
+             else
+               {
+                  efl_ui_drag_value_set(efl_part(wd->resize_obj, 
"elm.dragable2.slider"),
+                                        button_x, button_y);
+                  sd->intvl_flag = 2;
+               }
+          }
+     }
+
+   if (!efl_ui_focus_object_focus_get(data))
+     elm_object_focus_set(data, EINA_TRUE);
+
+   _slider_update(data, EINA_TRUE);
+
    elm_layout_signal_emit(data, "elm,state,indicator,show", "elm");
+
+   evas_object_smart_callback_call(data, SIG_DRAG_START, NULL);
 }
 
 static void
@@ -864,17 +899,80 @@ _spacer_move_cb(void *data,
                 Evas_Object *obj EINA_UNUSED,
                 void *event_info)
 {
-   ELM_SLIDER_DATA_GET(data, sd);
+   ELM_SLIDER_DATA_GET_OR_RETURN(data, sd);
+   ELM_WIDGET_DATA_GET_OR_RETURN(data, wd);
+
    Evas_Event_Mouse_Move *ev = event_info;
+   Eina_Rect sr;
+   double button_x = 0.0, button_y = 0.0;
 
    if (sd->spacer_down)
      {
+        Evas_Coord d = 0;
+
+        sr = efl_gfx_entity_geometry_get(sd->spacer);
+        if (_is_horizontal(sd->dir))
+          d = abs(ev->cur.canvas.x - sr.x - sd->downx);
+        else d = abs(ev->cur.canvas.y - sr.y - sd->downy);
+        if (d > (_elm_config->thumbscroll_threshold - 1))
+          {
+             if (!sd->frozen)
+               {
+                  elm_widget_scroll_freeze_push(data);
+                  sd->frozen = EINA_TRUE;
+               }
+             ev->event_flags &= ~EVAS_EVENT_FLAG_ON_HOLD;
+          }
+
         if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
           {
              if (sd->spacer_down) sd->spacer_down = EINA_FALSE;
+             _slider_update(data, EINA_TRUE);
+
+             evas_object_smart_callback_call(data, SIG_DRAG_STOP, NULL);
+
+             if (sd->frozen)
+               {
+                  elm_widget_scroll_freeze_pop(data);
+                  sd->frozen = EINA_FALSE;
+               }
              elm_layout_signal_emit(data, "elm,state,indicator,hide", "elm");
              return;
           }
+        if (_is_horizontal(sd->dir))
+          {
+             button_x = ((double)ev->cur.canvas.x - (double)sr.x) / 
(double)sr.w;
+             if (button_x > 1) button_x = 1;
+             if (button_x < 0) button_x = 0;
+          }
+        else
+          {
+             button_y = ((double)ev->cur.canvas.y - (double)sr.y) / 
(double)sr.h;
+             if (button_y > 1) button_y = 1;
+             if (button_y < 0) button_y = 0;
+          }
+
+        if (!sd->intvl_enable)
+          {
+             efl_ui_drag_value_set(efl_part(wd->resize_obj, 
"elm.dragable.slider"),
+                                   button_x, button_y);
+          }
+        else
+          {
+             if (sd->intvl_flag == 1)
+               {
+                  efl_ui_drag_value_set(efl_part(wd->resize_obj, 
"elm.dragable.slider"),
+                                        button_x, button_y);
+               }
+             else if (sd->intvl_flag == 2)
+               {
+                  efl_ui_drag_value_set(efl_part(wd->resize_obj, 
"elm.dragable2.slider"),
+                                        button_x, button_y);
+               }
+
+          }
+
+        _slider_update(data, EINA_TRUE);
      }
 }
 
@@ -889,25 +987,52 @@ _spacer_up_cb(void *data,
    if (!sd->spacer_down) return;
    if (sd->spacer_down) sd->spacer_down = EINA_FALSE;
 
+   _slider_update(data, EINA_TRUE);
+
+   evas_object_smart_callback_call(data, SIG_DRAG_STOP, NULL);
+
+   if (sd->frozen)
+     {
+        elm_widget_scroll_freeze_pop(data);
+        sd->frozen = EINA_FALSE;
+     }
    elm_layout_signal_emit(data, "elm,state,indicator,hide", "elm");
 }
 
+static void
+_mouse_in_cb(void *data EINA_UNUSED,
+              Evas *e EINA_UNUSED,
+              Evas_Object *obj,
+              void *event_info EINA_UNUSED)
+{
+   efl_ui_widget_scroll_hold_push(obj);
+}
+
+static void
+_mouse_out_cb(void *data EINA_UNUSED,
+              Evas *e EINA_UNUSED,
+              Evas_Object *obj,
+              void *event_info EINA_UNUSED)
+{
+   efl_ui_widget_scroll_hold_pop(obj);
+}
+
 EOLIAN static void
 _elm_slider_efl_canvas_group_group_calculate(Eo *obj, Elm_Slider_Data *sd)
 {
    efl_canvas_group_need_recalculate_set(obj, EINA_FALSE);
    edje_object_freeze(obj);
-   EFL_UI_SLIDER_DATA_GET(obj, sd2);
 
-   if (_is_horizontal(sd2->dir))
+   if (_is_horizontal(sd->dir))
      evas_object_size_hint_min_set
-       (sd2->spacer, (double)sd->size * efl_gfx_entity_scale_get(obj) *
+       (sd->spacer, (double)sd->size * efl_gfx_entity_scale_get(obj) *
        elm_config_scale_get(), 1);
    else
      evas_object_size_hint_min_set
-       (sd2->spacer, 1, (double)sd->size * efl_gfx_entity_scale_get(obj) *
+       (sd->spacer, 1, (double)sd->size * efl_gfx_entity_scale_get(obj) *
        elm_config_scale_get());
 
+   _val_fetch(obj, EINA_FALSE); // need to check whether this should be called 
here
    _min_max_set(obj);
    _units_set(obj);
    _indicator_set(obj);
@@ -925,46 +1050,117 @@ _on_show(void *data EINA_UNUSED, Evas *e EINA_UNUSED, 
Evas_Object *obj,
      _popup_show(obj, NULL, NULL, NULL);
 }
 
+static char *
+_access_info_cb(void *data EINA_UNUSED, Evas_Object *obj)
+{
+   const char *txt = elm_widget_access_info_get(obj);
+
+   if (!txt) txt = elm_layout_text_get(obj, NULL);
+   if (txt) return strdup(txt);
+
+   return NULL;
+}
+
+static char *
+_access_state_cb(void *data EINA_UNUSED, Evas_Object *obj)
+{
+   char *ret;
+   Eina_Strbuf *buf = eina_strbuf_new();
+
+   if (elm_widget_disabled_get(obj))
+     eina_strbuf_append(buf, " state: disabled");
+
+   if (eina_strbuf_length_get(buf))
+     {
+        ret = eina_strbuf_string_steal(buf);
+        eina_strbuf_free(buf);
+        return ret;
+     }
+
+   eina_strbuf_free(buf);
+   return NULL;
+}
+
 EOLIAN static Eo *
 _elm_slider_efl_object_constructor(Eo *obj, Elm_Slider_Data *priv)
 {
    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL);
-   EFL_UI_SLIDER_DATA_GET_OR_RETURN(obj, sd, NULL)
+   char *group;
 
    if (!elm_widget_theme_klass_get(obj))
      elm_widget_theme_klass_set(obj, "slider");
    obj = efl_constructor(efl_super(obj, MY_CLASS));
+
+   efl_access_object_role_set(obj, EFL_ACCESS_ROLE_SLIDER);
    efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
    evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
 
+   group = _elm_slider_theme_group_get(obj, priv);
+   if (elm_widget_theme_object_set(obj, wd->resize_obj,
+                                       elm_widget_theme_klass_get(obj),
+                                       group,
+                                       elm_widget_theme_style_get(obj)) == 
EFL_UI_THEME_APPLY_ERROR_GENERIC)
+     CRI("Failed to set layout!");
+
+   free(group);
+
+   priv->dir = EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL;
+   priv->val_max = 1.0;
+   priv->step = SLIDER_STEP;
    priv->indicator_show = EINA_TRUE;
    priv->indicator_visible_mode = 
elm_config_slider_indicator_visible_mode_get();
    //TODO: customize this time duration from api or theme data.
    priv->wheel_indicator_duration = 0.25;
 
-   elm_layout_signal_callback_add(obj, "popup,show", "elm", _popup_show, obj); 
// XXX: for compat
-   elm_layout_signal_callback_add(obj, "popup,hide", "elm", _popup_hide, obj); 
// XXX: for compat
-   elm_layout_signal_callback_add(obj, "elm,popup,show", "elm", _popup_show, 
obj);
-   elm_layout_signal_callback_add(obj, "elm,popup,hide", "elm", _popup_hide, 
obj);
-   elm_layout_signal_callback_add(obj, "*", "popup,emit", _popup_emit, obj);
+   priv->spacer = efl_add(EFL_CANVAS_RECTANGLE_CLASS, obj,
+                          efl_gfx_color_set(efl_added, 0, 0, 0, 0));
+   efl_content_set(efl_part(obj, "elm.swallow.bar"), priv->spacer);
 
    if (!priv->intvl_enable)
      _popup_add(priv, obj, &priv->popup, &priv->track, priv->intvl_enable);
    else
      _popup_add(priv, obj, &priv->popup2, &priv->track2, priv->intvl_enable);
 
-   evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _on_show, NULL);
+   efl_ui_format_string_set(efl_part(obj, "indicator"), "%0.2f", 
EFL_UI_FORMAT_STRING_TYPE_SIMPLE);
 
    elm_widget_can_focus_set(obj, EINA_TRUE);
 
-   efl_ui_format_string_set(efl_part(obj, "indicator"), "%0.2f", 
EFL_UI_FORMAT_STRING_TYPE_SIMPLE);
+   // accessiblity
+   _elm_access_object_register(obj, wd->resize_obj);
+   _elm_access_text_set
+     (_elm_access_info_get(obj), ELM_ACCESS_TYPE, E_("slider"));
+   _elm_access_callback_set
+     (_elm_access_info_get(obj), ELM_ACCESS_INFO, _access_info_cb, NULL);
+   _elm_access_callback_set
+     (_elm_access_info_get(obj), ELM_ACCESS_STATE, _access_state_cb, NULL);
+
+   // add callbacks
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _on_show, NULL);
+
+   elm_layout_signal_callback_add(obj, "popup,show", "elm", _popup_show, obj); 
// XXX: for compat
+   elm_layout_signal_callback_add(obj, "popup,hide", "elm", _popup_hide, obj); 
// XXX: for compat
+   elm_layout_signal_callback_add(obj, "elm,popup,show", "elm", _popup_show, 
obj);
+   elm_layout_signal_callback_add(obj, "elm,popup,hide", "elm", _popup_hide, 
obj);
+   elm_layout_signal_callback_add(obj, "*", "popup,emit", _popup_emit, obj);
+
+   efl_layout_signal_callback_add(obj, "drag", "*", obj, _drag, NULL);
+   efl_layout_signal_callback_add(obj, "drag,start", "*", obj, _drag_start, 
NULL);
+   efl_layout_signal_callback_add(obj, "drag,stop", "*", obj, _drag_stop, 
NULL);
+   efl_layout_signal_callback_add(obj, "drag,step", "*", obj, _drag_step, 
NULL);
+   efl_layout_signal_callback_add(obj, "drag,page", "*", obj, _drag_stop, 
NULL);
 
    evas_object_event_callback_add
-     (sd->spacer, EVAS_CALLBACK_MOUSE_DOWN, _spacer_down_cb, obj);
+     (priv->spacer, EVAS_CALLBACK_MOUSE_DOWN, _spacer_down_cb, obj);
+   evas_object_event_callback_add
+     (priv->spacer, EVAS_CALLBACK_MOUSE_MOVE, _spacer_move_cb, obj);
+   evas_object_event_callback_add
+     (priv->spacer, EVAS_CALLBACK_MOUSE_UP, _spacer_up_cb, obj);
    evas_object_event_callback_add
-     (sd->spacer, EVAS_CALLBACK_MOUSE_MOVE, _spacer_move_cb, obj);
+     (obj, EVAS_CALLBACK_MOUSE_IN, _mouse_in_cb, obj);
    evas_object_event_callback_add
-     (sd->spacer, EVAS_CALLBACK_MOUSE_UP, _spacer_up_cb, obj);
+     (obj, EVAS_CALLBACK_MOUSE_OUT, _mouse_out_cb, obj);
+
+   evas_object_smart_changed(obj);
 
    return obj;
 }
@@ -1220,68 +1416,88 @@ EAPI void
 elm_slider_horizontal_set(Evas_Object *obj, Eina_Bool horizontal)
 {
    Efl_Ui_Layout_Orientation dir;
-   EFL_UI_SLIDER_DATA_GET_OR_RETURN(obj, sd2);
+   ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd);
 
    dir = horizontal ? EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL : 
EFL_UI_LAYOUT_ORIENTATION_VERTICAL;
-   dir |= (sd2->dir & EFL_UI_LAYOUT_ORIENTATION_INVERTED);
+   dir |= (sd->dir & EFL_UI_LAYOUT_ORIENTATION_INVERTED);
+
+   sd->dir = dir;
 
-   efl_ui_layout_orientation_set(obj, dir);
+   efl_ui_widget_theme_apply(obj);
 }
 
 EAPI Eina_Bool
 elm_slider_horizontal_get(const Evas_Object *obj)
 {
    EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
+   ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd, EINA_FALSE);
 
-   Efl_Ui_Layout_Orientation dir;
-   dir = efl_ui_layout_orientation_get(obj);
-
-   return _is_horizontal(dir);
+   return _is_horizontal(sd->dir);
 }
 
 EAPI void
 elm_slider_step_set(Evas_Object *obj, double step)
 {
-   efl_ui_range_step_set(obj, step);
+   ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd);
+
+   if (step <= 0)
+     {
+        ERR("Wrong param. The step(%lf) should be greater than 0.0", step);
+        return;
+     }
+   if (sd->step == step) return;
+
+   sd->step = step;
 }
 
 EAPI double
 elm_slider_step_get(const Evas_Object *obj)
 {
-   return efl_ui_range_step_get(obj);
+   ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd, 0.0);
+   return sd->step;
 }
 
 EAPI void
 elm_slider_value_set(Evas_Object *obj, double val)
 {
-   efl_ui_range_value_set(obj, val);
+   ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd);
+   if (EINA_DBL_EQ(val, sd->val)) return;
+
+   sd->val = val;
+
+   if (sd->val < sd->val_min) sd->val = sd->val_min;
+   if (sd->val > sd->val_max) sd->val = sd->val_max;
+
+   _val_set(obj);
 }
 
 EAPI double
 elm_slider_value_get(const Evas_Object *obj)
 {
-   return efl_ui_range_value_get(obj);
+   ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd, 0.0);
+   return sd->val;
 }
 
 EAPI void
 elm_slider_inverted_set(Evas_Object *obj, Eina_Bool inverted)
 {
    Efl_Ui_Layout_Orientation dir;
-   EFL_UI_SLIDER_DATA_GET_OR_RETURN(obj, sd2);
+   ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd);
 
-   dir = sd2->dir & EFL_UI_LAYOUT_ORIENTATION_AXIS_BITMASK;
+   dir = sd->dir & EFL_UI_LAYOUT_ORIENTATION_AXIS_BITMASK;
    if (inverted) dir |= EFL_UI_LAYOUT_ORIENTATION_INVERTED;
 
-   efl_ui_layout_orientation_set(obj, dir);
+   sd->dir = dir;
+
+   efl_ui_widget_theme_apply(obj);
 }
 
 EAPI Eina_Bool
 elm_slider_inverted_get(const Evas_Object *obj)
 {
-   Efl_Ui_Layout_Orientation dir;
-   dir = efl_ui_layout_orientation_get(obj);
+   ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd, EINA_FALSE);
 
-   return efl_ui_layout_orientation_is_inverted(dir);
+   return efl_ui_layout_orientation_is_inverted(sd->dir);
 }
 
 typedef struct
@@ -1360,25 +1576,60 @@ elm_slider_range_enabled_get(const Evas_Object *obj)
 EAPI void
 elm_slider_range_set(Evas_Object *obj, double from, double to)
 {
-   efl_ui_slider_interval_value_set(obj, from, to);
+   ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd);
+   sd->intvl_from = from;
+   sd->val = from;
+   sd->intvl_to = to;
+
+   if (sd->intvl_from < sd->val_min) {
+        sd->intvl_from = sd->val_min;
+        sd->val = sd->val_min;
+   }
+   if (sd->intvl_to > sd->val_max) sd->intvl_to = sd->val_max;
+
+   _val_set(obj);
 }
 
 EAPI void
 elm_slider_range_get(const Evas_Object *obj, double *from, double *to)
 {
-   efl_ui_slider_interval_value_get(obj, from, to);
+   ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd);
+
+   if (from) *from = fmin(sd->intvl_from, sd->intvl_to);
+   if (to) *to = fmax(sd->intvl_from, sd->intvl_to);
 }
 
 EAPI void
 elm_slider_min_max_set(Evas_Object *obj, double min, double max)
 {
-   efl_ui_range_limits_set(obj, min, max);
+   ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd);
+
+   if (max < min)
+     {
+        ERR("Wrong params. min(%lf) is greater than max(%lf).", min, max);
+        return;
+     }
+   if (EINA_DBL_EQ(max, min))
+     {
+        ERR("min and max must have a different value");
+        return;
+     }
+   if ((EINA_DBL_EQ(sd->val_min, min)) && (EINA_DBL_EQ(sd->val_max, max))) 
return;
+   sd->val_min = min;
+   sd->val_max = max;
+   if (sd->val < sd->val_min) sd->val = sd->val_min;
+   if (sd->val > sd->val_max) sd->val = sd->val_max;
+
+   _val_set(obj);
 }
 
 EAPI void
 elm_slider_min_max_get(const Evas_Object *obj, double *min, double *max)
 {
-   efl_ui_range_limits_get(obj, min, max);
+   ELM_SLIDER_DATA_GET_OR_RETURN(obj, sd);
+
+   if (min) *min = sd->val_min;
+   if (max) *max = sd->val_max;
 }
 
 EAPI void
@@ -1478,10 +1729,6 @@ void _elm_slider_efl_ui_format_apply_formatted_value(Eo 
*obj EINA_UNUSED, Elm_Sl
 ELM_LAYOUT_CONTENT_ALIASES_IMPLEMENT(elm_slider)
 
 #define ELM_SLIDER_EXTRA_OPS \
-   ELM_LAYOUT_CONTENT_ALIASES_OPS(elm_slider), \
-   EFL_UI_SLIDER_VAL_FETCH_OPS(elm_slider), \
-   EFL_UI_SLIDER_VAL_SET_OPS(elm_slider), \
-   EFL_UI_SLIDER_DOWN_KNOB_OPS(elm_slider), \
-   EFL_UI_SLIDER_MOVE_KNOB_OPS(elm_slider)
+   ELM_LAYOUT_CONTENT_ALIASES_OPS(elm_slider)
 
 #include "elm_slider_eo.c"
diff --git a/src/lib/elementary/elm_slider_eo.c 
b/src/lib/elementary/elm_slider_eo.c
index 524235b8a1..220f1ace74 100644
--- a/src/lib/elementary/elm_slider_eo.c
+++ b/src/lib/elementary/elm_slider_eo.c
@@ -86,4 +86,4 @@ static const Efl_Class_Description _elm_slider_class_desc = {
    NULL
 };
 
-EFL_DEFINE_CLASS(elm_slider_class_get, &_elm_slider_class_desc, 
EFL_UI_SLIDER_INTERVAL_CLASS, ELM_LAYOUT_MIXIN, EFL_UI_LEGACY_INTERFACE, 
EFL_TEXT_INTERFACE, EFL_TEXT_MARKUP_INTERFACE, EFL_UI_FORMAT_MIXIN, NULL);
+EFL_DEFINE_CLASS(elm_slider_class_get, &_elm_slider_class_desc, 
EFL_UI_LAYOUT_BASE_CLASS, ELM_LAYOUT_MIXIN, EFL_UI_LEGACY_INTERFACE, 
EFL_TEXT_INTERFACE, EFL_TEXT_MARKUP_INTERFACE, EFL_UI_FORMAT_MIXIN, NULL);
diff --git a/src/lib/elementary/elm_widget_slider.h 
b/src/lib/elementary/elm_widget_slider.h
index c12ed7c011..8290045f8d 100644
--- a/src/lib/elementary/elm_widget_slider.h
+++ b/src/lib/elementary/elm_widget_slider.h
@@ -26,10 +26,18 @@
 typedef struct _Elm_Slider_Data Elm_Slider_Data;
 struct _Elm_Slider_Data
 {
-   Evas_Object          *popup, *popup2, *track, *track2;
+   Evas_Object          *popup, *popup2, *track, *track2, *spacer;
 
-   Ecore_Timer           *wheel_indicator_timer, *delay;
+   double                val, val_min, val_max, step;
+   double                intvl_from, intvl_to;
    double                wheel_indicator_duration;
+   int                   intvl_flag;
+
+   Evas_Coord                  downx, downy;
+   Efl_Ui_Layout_Orientation   dir;
+
+   Ecore_Timer           *wheel_indicator_timer, *delay;
+
    Elm_Slider_Indicator_Visible_Mode indicator_visible_mode; /**< 
indicator_visible_mode of the slider.
                                                                 This indicates 
when to show an indicator */
 
@@ -52,6 +60,7 @@ struct _Elm_Slider_Data
    Eina_Bool             popup_visible : 1;
    Eina_Bool             intvl_enable : 1;
    Eina_Bool             spacer_down : 1;
+   Eina_Bool             frozen : 1;
 };
 
 /**
diff --git a/src/tests/elementary/elm_test_slider.c 
b/src/tests/elementary/elm_test_slider.c
index 76201fa305..337b75444c 100644
--- a/src/tests/elementary/elm_test_slider.c
+++ b/src/tests/elementary/elm_test_slider.c
@@ -98,6 +98,10 @@ slider_changed(void *data EINA_UNUSED, Evas_Object *obj, 
void *event_info EINA_U
    if (event_counter == 1)
      evas_object_smart_callback_del(obj, "changed", slider_changed);
    else if (event_counter == 2)
+     evas_object_smart_callback_del(obj, "slider,drag,start", slider_changed);
+   else if (event_counter == 3)
+     evas_object_smart_callback_del(obj, "slider,drag,stop", slider_changed);
+   else if (event_counter == 4)
      ecore_main_loop_quit();
 }
 
@@ -112,6 +116,8 @@ EFL_START_TEST(elm_slider_events)
    slider = elm_slider_add(win);
    evas_object_smart_callback_add(slider, "changed", slider_changed, NULL);
    evas_object_smart_callback_add(slider, "delay,changed", slider_changed, 
NULL);
+   evas_object_smart_callback_add(slider, "slider,drag,start", slider_changed, 
NULL);
+   evas_object_smart_callback_add(slider, "slider,drag,stop", slider_changed, 
NULL);
    evas_object_show(slider);
    evas_object_show(win);
    evas_object_resize(slider, 400, 100);
@@ -131,7 +137,7 @@ EFL_START_TEST(elm_slider_events)
    evas_event_feed_mouse_move(e, sx + (sw / 2), sy + (sh / 2), 0, NULL);
    evas_event_feed_mouse_up(e, 1, 0, 0, NULL);
    ecore_main_loop_begin();
-   ck_assert_int_eq(event_counter, 2);
+   ck_assert_int_eq(event_counter, 4);
 }
 EFL_END_TEST
 

-- 


Reply via email to