[elm] Elm list is now a SCROLLABLE layout.
authorGustavo Lima Chaves <glima@profusion.mobi>
Wed, 4 Jul 2012 21:43:05 +0000 (21:43 +0000)
committerGustavo Lima Chaves <glima@profusion.mobi>
Wed, 4 Jul 2012 21:43:05 +0000 (21:43 +0000)
This means it inherits from the layout class and implements the
scrollable interface.

SVN revision: 73310

src/bin/test_list.c
src/edje_externals/elm_list.c
src/examples/list_example_02.c
src/lib/elm_list.c
src/lib/elm_list.h
src/lib/elm_web.c

index 0dbeb40..f365a38 100644 (file)
@@ -127,12 +127,12 @@ Scroll to end
          break;
 
       case SCROLLER_POLICY_SET_ON: /* 5 */
-         elm_list_bounce_set(li, EINA_TRUE, EINA_TRUE);
-         elm_list_scroller_policy_set(li, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON);
+         elm_scroller_bounce_set(li, EINA_TRUE, EINA_TRUE);
+         elm_scroller_policy_set(li, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON);
          break;
 
       case SCROLLER_POLICY_SET_OFF: /* Back to AUTO next (6) */
-         elm_list_scroller_policy_set(li, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+         elm_scroller_policy_set(li, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
          break;
 
       case TOOLTIP_TEXT_SET: /* 7 */
@@ -142,7 +142,7 @@ Scroll to end
                 {
                   elm_object_item_tooltip_text_set(eina_list_data_get(eina_list_last(items)), "Tooltip set from API");
                 }
-              elm_list_scroller_policy_set(li, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_AUTO);
+              elm_scroller_policy_set(li, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_AUTO);
            }
          break;
 
@@ -205,7 +205,7 @@ Scroll to end
 
       case BOUNCE_SET: /* 16 */
          elm_list_horizontal_set(li, EINA_FALSE);
-         elm_list_bounce_set(li, EINA_TRUE, EINA_FALSE);
+         elm_scroller_bounce_set(li, EINA_TRUE, EINA_FALSE);
          break;
 
       case LIST_CLEAR: /* 17 */
index 25b38aa..0251300 100644 (file)
@@ -66,20 +66,20 @@ external_list_state_set(void *data __UNUSED__, Evas_Object *obj, const void *fro
      {
         policy_h = _scroller_policy_choices_setting_get(p->policy_h);
         policy_v = _scroller_policy_choices_setting_get(p->policy_v);
-        elm_list_scroller_policy_set(obj, policy_h, policy_v);
+        elm_scroller_policy_set(obj, policy_h, policy_v);
      }
    else if ((p->policy_h) || (p->policy_v))
      {
-        elm_list_scroller_policy_get(obj, &policy_h, &policy_v);
+        elm_scroller_policy_get(obj, &policy_h, &policy_v);
         if (p->policy_h)
           {
              policy_h = _scroller_policy_choices_setting_get(p->policy_h);
-             elm_list_scroller_policy_set(obj, policy_h, policy_v);
+             elm_scroller_policy_set(obj, policy_h, policy_v);
           }
         else
           {
              policy_v = _scroller_policy_choices_setting_get(p->policy_v);
-             elm_list_scroller_policy_set(obj, policy_h, policy_v);
+             elm_scroller_policy_set(obj, policy_h, policy_v);
           }
      }
 
@@ -114,10 +114,10 @@ external_list_param_set(void *data __UNUSED__, Evas_Object *obj, const Edje_Exte
         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
           {
              Elm_Scroller_Policy h, v;
-             elm_list_scroller_policy_get(obj, &h, &v);
+             elm_scroller_policy_get(obj, &h, &v);
              h = _scroller_policy_choices_setting_get(param->s);
              if (h == ELM_SCROLLER_POLICY_LAST) return EINA_FALSE;
-             elm_list_scroller_policy_set(obj, h, v);
+             elm_scroller_policy_set(obj, h, v);
              return EINA_TRUE;
           }
      }
@@ -126,10 +126,10 @@ external_list_param_set(void *data __UNUSED__, Evas_Object *obj, const Edje_Exte
         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
           {
              Elm_Scroller_Policy h, v;
-             elm_list_scroller_policy_get(obj, &h, &v);
+             elm_scroller_policy_get(obj, &h, &v);
              v = _scroller_policy_choices_setting_get(param->s);
              if (v == ELM_SCROLLER_POLICY_LAST) return EINA_FALSE;
-             elm_list_scroller_policy_set(obj, h, v);
+             elm_scroller_policy_set(obj, h, v);
              return EINA_TRUE;
           }
      }
@@ -203,7 +203,7 @@ external_list_param_get(void *data __UNUSED__, const Evas_Object *obj, Edje_Exte
         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
           {
              Elm_Scroller_Policy h, v;
-             elm_list_scroller_policy_get(obj, &h, &v);
+             elm_scroller_policy_get(obj, &h, &v);
 
              param->s = scroller_policy_choices[h];
              return EINA_TRUE;
@@ -214,7 +214,7 @@ external_list_param_get(void *data __UNUSED__, const Evas_Object *obj, Edje_Exte
         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
           {
              Elm_Scroller_Policy h, v;
-             elm_list_scroller_policy_get(obj, &h, &v);
+             elm_scroller_policy_get(obj, &h, &v);
 
              param->s = scroller_policy_choices[v];
              return EINA_TRUE;
index 3360131..f3810ca 100644 (file)
@@ -67,8 +67,8 @@ elm_main(int argc, char **argv)
    elm_list_select_mode_set(li, ELM_OBJECT_SELECT_MODE_ALWAYS);
 
    /* set bounce and scroller policy */
-   elm_list_bounce_set(li, EINA_TRUE, EINA_TRUE);
-   elm_list_scroller_policy_set(li, ELM_SCROLLER_POLICY_AUTO,
+   elm_scroller_bounce_set(li, EINA_TRUE, EINA_TRUE);
+   elm_scroller_policy_set(li, ELM_SCROLLER_POLICY_AUTO,
                                 ELM_SCROLLER_POLICY_ON);
 
    elm_list_go(li);
index 8075a74..66619ed 100644 (file)
 #include <Elementary.h>
 #include "elm_priv.h"
-#include "els_scroller.h"
+#include "elm_interface_scrollable.h"
+#include "elm_widget_layout.h"
+
+static const char LIST_SMART_NAME[] = "elm_list";
 
 #define SWIPE_MOVES 12
 
-typedef struct _Widget_Data Widget_Data;
-typedef struct _Elm_List_Item Elm_List_Item;
+#define ELM_LIST_DATA_GET(o, sd) \
+  Elm_List_Smart_Data * sd = evas_object_smart_data_get(o)
+
+#define ELM_LIST_DATA_GET_OR_RETURN(o, ptr)          \
+  ELM_LIST_DATA_GET(o, ptr);                         \
+  if (!ptr)                                          \
+    {                                                \
+       CRITICAL("No widget data for object %p (%s)", \
+                o, evas_object_type_get(o));         \
+       return;                                       \
+    }
+
+#define ELM_LIST_DATA_GET_OR_RETURN_VAL(o, ptr, val) \
+  ELM_LIST_DATA_GET(o, ptr);                         \
+  if (!ptr)                                          \
+    {                                                \
+       CRITICAL("No widget data for object %p (%s)", \
+                o, evas_object_type_get(o));         \
+       return val;                                   \
+    }
+
+#define ELM_LIST_CHECK(obj)                                             \
+  if (!obj || !elm_widget_type_check((obj), LIST_SMART_NAME, __func__)) \
+    return
+
+#define ELM_LIST_ITEM_CHECK(it)                             \
+  ELM_WIDGET_ITEM_CHECK_OR_RETURN((Elm_Widget_Item *)it, ); \
+  ELM_LIST_CHECK(it->base.widget);                          \
+  if (((Elm_List_Item *)it)->deleted)                       \
+    {                                                       \
+       ERR("ERROR: " #it " has been DELETED.\n");           \
+       return;                                              \
+    }
+
+#define ELM_LIST_ITEM_CHECK_OR_RETURN(it, ...)                         \
+  ELM_WIDGET_ITEM_CHECK_OR_RETURN((Elm_Widget_Item *)it, __VA_ARGS__); \
+  ELM_LIST_CHECK(it->base.widget) __VA_ARGS__;                         \
+  if (((Elm_List_Item *)it)->deleted)                                  \
+    {                                                                  \
+       ERR("ERROR: " #it " has been DELETED.\n");                      \
+       return __VA_ARGS__;                                             \
+    }
+
+typedef struct _Elm_List_Smart_Data Elm_List_Smart_Data;
+typedef struct _Elm_List_Item       Elm_List_Item;
+
+struct _Elm_List_Smart_Data
+{
+   Elm_Layout_Smart_Data                 base; /* base widget smart data as
+                                                * first member obligatory, as
+                                                * we're inheriting from it */
+
+   Evas_Object                          *box, *hit_rect;
+   const Elm_Scrollable_Smart_Interface *s_iface;
+
+   Eina_List                            *items, *selected, *to_delete;
+   Elm_Object_Item                      *last_selected_item;
+   Evas_Coord                            minw[2], minh[2];
+   Elm_Object_Select_Mode                select_mode;
+   int                                   movements;
+   int                                   walking;
+   Elm_List_Mode                         h_mode;
+   Elm_List_Mode                         mode;
 
-struct _Widget_Data
-{
-   Evas_Object *scr, *box, *self;
-   Eina_List *items, *selected, *to_delete;
-   Elm_Object_Item *last_selected_item;
-   Elm_List_Mode mode;
-   Elm_List_Mode h_mode;
-   Evas_Coord minw[2], minh[2];
-   Elm_Object_Select_Mode select_mode;
-   int walking;
-   int movements;
    struct
-     {
-        Evas_Coord x, y;
-     } history[SWIPE_MOVES];
-   Eina_Bool scr_minw : 1;
-   Eina_Bool scr_minh : 1;
-   Eina_Bool swipe : 1;
-   Eina_Bool fix_pending : 1;
-   Eina_Bool on_hold : 1;
-   Eina_Bool multi : 1;
-   Eina_Bool longpressed : 1;
-   Eina_Bool wasselected : 1;
+   {
+      Evas_Coord x, y;
+   } history[SWIPE_MOVES];
+
+   Eina_Bool                             was_selected : 1;
+   Eina_Bool                             fix_pending : 1;
+   Eina_Bool                             longpressed : 1;
+   Eina_Bool                             scr_minw : 1;
+   Eina_Bool                             scr_minh : 1;
+   Eina_Bool                             on_hold : 1;
+   Eina_Bool                             multi : 1;
+   Eina_Bool                             swipe : 1;
 };
 
 struct _Elm_List_Item
 {
    ELM_WIDGET_ITEM;
-   Widget_Data *wd;
-   Eina_List *node;
-   const char *label;
-   Evas_Object *icon, *end;
-   Evas_Smart_Cb func;
-   Ecore_Timer *long_timer;
-   Ecore_Timer *swipe_timer;
-   Eina_Bool deleted : 1;
-   Eina_Bool even : 1;
-   Eina_Bool is_even : 1;
-   Eina_Bool is_separator : 1;
-   Eina_Bool fixed : 1;
-   Eina_Bool selected : 1;
-   Eina_Bool highlighted : 1;
-   Eina_Bool dummy_icon : 1;
-   Eina_Bool dummy_end : 1;
-};
 
-static const char *widtype = NULL;
-static void _del_hook(Evas_Object *obj);
-static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl);
-static void _theme_hook(Evas_Object *obj);
-static void _sizing_eval(Evas_Object *obj);
-static void _disable_hook(Evas_Object *obj);
-static void _on_focus_hook(void *data, Evas_Object *obj);
-static void _signal_emit_hook(Evas_Object *obj, const char *emission, const char *source);
-static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _sub_del(void *data, Evas_Object *obj, void *event_info);
-static void _fix_items(Evas_Object *obj);
-static void _mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info);
-static void _mouse_up(void *data, Evas *evas, Evas_Object *obj, void *event_info);
-static void _mouse_move(void *data, Evas *evas, Evas_Object *obj, void *event_info);
-static void _edge_left(void *data, Evas_Object *scr, void *event_info);
-static void _edge_right(void *data, Evas_Object *scr, void *event_info);
-static void _edge_top(void *data, Evas_Object *scr, void *event_info);
-static void _edge_bottom(void *data, Evas_Object *scr, void *event_info);
-static Eina_Bool _item_multi_select_up(Widget_Data *wd);
-static Eina_Bool _item_multi_select_down(Widget_Data *wd);
-static Eina_Bool _item_single_select_up(Widget_Data *wd);
-static Eina_Bool _item_single_select_down(Widget_Data *wd);
-static Eina_Bool _event_hook(Evas_Object *obj, Evas_Object *src,
-                             Evas_Callback_Type type, void *event_info);
-static Eina_Bool _deselect_all_items(Widget_Data *wd);
+   Elm_List_Smart_Data *sd;
+
+   Ecore_Timer         *swipe_timer;
+   Ecore_Timer         *long_timer;
+   Evas_Object         *icon, *end;
+   Evas_Smart_Cb        func;
+
+   const char          *label;
+   Eina_List           *node;
+
+   Eina_Bool            is_separator : 1;
+   Eina_Bool            highlighted : 1;
+   Eina_Bool            dummy_icon : 1;
+   Eina_Bool            dummy_end : 1;
+   Eina_Bool            selected : 1;
+   Eina_Bool            deleted : 1;
+   Eina_Bool            is_even : 1;
+   Eina_Bool            fixed : 1;
+   Eina_Bool            even : 1;
+};
 
 static const char SIG_ACTIVATED[] = "activated";
 static const char SIG_CLICKED_DOUBLE[] = "clicked,double";
@@ -88,8 +120,9 @@ static const char SIG_EDGE_TOP[] = "edge,top";
 static const char SIG_EDGE_BOTTOM[] = "edge,bottom";
 static const char SIG_EDGE_LEFT[] = "edge,left";
 static const char SIG_EDGE_RIGHT[] = "edge,right";
-
-static const Evas_Smart_Cb_Description _signals[] = {
+static const char SIG_LANG_CHANGED[] = "language,changed";
+static const char SIG_SWIPE[] = "swipe";
+static const Evas_Smart_Cb_Description _smart_callbacks[] = {
    {SIG_ACTIVATED, ""},
    {SIG_CLICKED_DOUBLE, ""},
    {SIG_SELECTED, ""},
@@ -99,36 +132,45 @@ static const Evas_Smart_Cb_Description _signals[] = {
    {SIG_EDGE_BOTTOM, ""},
    {SIG_EDGE_LEFT, ""},
    {SIG_EDGE_RIGHT, ""},
+   {SIG_LANG_CHANGED, ""},
+   {SIG_SWIPE, ""},
    {NULL, NULL}
 };
 
-#define ELM_LIST_ITEM_CHECK_DELETED_RETURN(it, ...)                      \
-   ELM_OBJ_ITEM_CHECK_OR_RETURN(it, __VA_ARGS__);                        \
-if (((Elm_List_Item *)it)->deleted)                                     \
-{                                                                        \
-   ERR("ERROR: "#it" has been DELETED.\n");                              \
-   return __VA_ARGS__;                                                   \
-}
+static const Evas_Smart_Interface *_smart_interfaces[] =
+{
+   (Evas_Smart_Interface *)&ELM_SCROLLABLE_IFACE, NULL
+};
+
+static void _size_hints_changed_cb(void *, Evas *, Evas_Object *, void *);
+static void _mouse_up_cb(void *, Evas *, Evas_Object *, void *);
+static void _mouse_down_cb(void *, Evas *, Evas_Object *, void *);
+static void _mouse_move_cb(void *, Evas *, Evas_Object *, void *);
+static void _items_fix(Evas_Object *);
+
+EVAS_SMART_SUBCLASS_IFACE_NEW
+  (LIST_SMART_NAME, _elm_list, Elm_Layout_Smart_Class, Elm_Layout_Smart_Class,
+  elm_layout_smart_class_get, _smart_callbacks, _smart_interfaces);
 
 static inline void
 _elm_list_item_free(Elm_List_Item *it)
 {
    evas_object_event_callback_del_full
-      (VIEW(it), EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, it);
+     (VIEW(it), EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, it);
    evas_object_event_callback_del_full
-      (VIEW(it), EVAS_CALLBACK_MOUSE_UP, _mouse_up, it);
+     (VIEW(it), EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, it);
    evas_object_event_callback_del_full
-      (VIEW(it), EVAS_CALLBACK_MOUSE_MOVE, _mouse_move, it);
+     (VIEW(it), EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, it);
 
    if (it->icon)
      evas_object_event_callback_del_full
-        (it->icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
-         _changed_size_hints, WIDGET(it));
+       (it->icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+       _size_hints_changed_cb, WIDGET(it));
 
    if (it->end)
      evas_object_event_callback_del_full
-        (it->end, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
-         _changed_size_hints, WIDGET(it));
+       (it->end, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+       _size_hints_changed_cb, WIDGET(it));
 
    eina_stringshare_del(it->label);
 
@@ -141,39 +183,138 @@ _elm_list_item_free(Elm_List_Item *it)
 }
 
 static Eina_Bool
-_event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info)
+_item_multi_select_up(Elm_List_Smart_Data *sd)
 {
-   if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
-   Evas_Event_Key_Down *ev = event_info;
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return EINA_FALSE;
-   if (!wd->items) return EINA_FALSE;
-   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
-   if (elm_widget_disabled_get(obj)) return EINA_FALSE;
+   Elm_Object_Item *prev;
 
-   Elm_List_Item *it = NULL;
+   if (!sd->selected) return EINA_FALSE;
+   if (!sd->multi) return EINA_FALSE;
+
+   prev = elm_list_item_prev(sd->last_selected_item);
+   if (!prev) return EINA_TRUE;
+
+   if (elm_list_item_selected_get(prev))
+     {
+        elm_list_item_selected_set(sd->last_selected_item, EINA_FALSE);
+        sd->last_selected_item = prev;
+        elm_list_item_show(sd->last_selected_item);
+     }
+   else
+     {
+        elm_list_item_selected_set(prev, EINA_TRUE);
+        elm_list_item_show(prev);
+     }
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_item_multi_select_down(Elm_List_Smart_Data *sd)
+{
+   Elm_Object_Item *next;
+
+   if (!sd->selected) return EINA_FALSE;
+   if (!sd->multi) return EINA_FALSE;
+
+   next = elm_list_item_next(sd->last_selected_item);
+   if (!next) return EINA_TRUE;
+
+   if (elm_list_item_selected_get(next))
+     {
+        elm_list_item_selected_set(sd->last_selected_item, EINA_FALSE);
+        sd->last_selected_item = next;
+        elm_list_item_show(sd->last_selected_item);
+     }
+   else
+     {
+        elm_list_item_selected_set(next, EINA_TRUE);
+        elm_list_item_show(next);
+     }
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_all_items_unselect(Elm_List_Smart_Data *sd)
+{
+   if (!sd->selected) return EINA_FALSE;
+
+   while (sd->selected)
+     elm_list_item_selected_set
+       ((Elm_Object_Item *)sd->selected->data, EINA_FALSE);
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_item_single_select_up(Elm_List_Smart_Data *sd)
+{
+   Elm_Object_Item *prev;
+
+   if (!sd->selected) prev = eina_list_data_get(eina_list_last(sd->items));
+   else prev = elm_list_item_prev(sd->last_selected_item);
+   if (!prev) return EINA_FALSE;
+
+   _all_items_unselect(sd);
+
+   elm_list_item_selected_set(prev, EINA_TRUE);
+   elm_list_item_show(prev);
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_item_single_select_down(Elm_List_Smart_Data *sd)
+{
+   Elm_Object_Item *next;
+
+   if (!sd->selected) next = eina_list_data_get(sd->items);
+   else next = elm_list_item_next(sd->last_selected_item);
+   if (!next) return EINA_FALSE;
+
+   _all_items_unselect(sd);
+
+   elm_list_item_selected_set(next, EINA_TRUE);
+   elm_list_item_show(next);
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_elm_list_smart_event(Evas_Object *obj,
+                      Evas_Object *src __UNUSED__,
+                      Evas_Callback_Type type,
+                      void *event_info)
+{
    Evas_Coord x = 0;
    Evas_Coord y = 0;
-   Evas_Coord step_x = 0;
-   Evas_Coord step_y = 0;
    Evas_Coord v_w = 0;
    Evas_Coord v_h = 0;
+   Evas_Coord step_x = 0;
+   Evas_Coord step_y = 0;
    Evas_Coord page_x = 0;
    Evas_Coord page_y = 0;
+   Elm_List_Item *it = NULL;
+   Evas_Event_Key_Down *ev = event_info;
+
+   ELM_LIST_DATA_GET(obj, sd);
 
-   elm_smart_scroller_child_pos_get(wd->scr, &x, &y);
-   elm_smart_scroller_step_size_get(wd->scr, &step_x, &step_y);
-   elm_smart_scroller_page_size_get(wd->scr, &page_x, &page_y);
-   elm_smart_scroller_child_viewport_size_get(wd->scr, &v_w, &v_h);
+   if (elm_widget_disabled_get(obj)) return EINA_FALSE;
+   if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
+   if (!sd->items) return EINA_FALSE;
+   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
+
+   sd->s_iface->content_pos_get(obj, &x, &y);
+   sd->s_iface->step_size_get(obj, &step_x, &step_y);
+   sd->s_iface->page_size_get(obj, &page_x, &page_y);
+   sd->s_iface->content_viewport_size_get(obj, &v_w, &v_h);
 
    /* TODO: fix logic for horizontal mode */
    if ((!strcmp(ev->keyname, "Left")) ||
        ((!strcmp(ev->keyname, "KP_Left")) && !ev->string))
      {
-        if ((wd->h_mode) &&
+        if ((sd->h_mode) &&
             (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
-              (_item_multi_select_up(wd)))
-             || (_item_single_select_up(wd))))
+              (_item_multi_select_up(sd)))
+             || (_item_single_select_up(sd))))
           {
              ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
              return EINA_TRUE;
@@ -184,10 +325,10 @@ _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type ty
    else if ((!strcmp(ev->keyname, "Right")) ||
             ((!strcmp(ev->keyname, "KP_Right")) && !ev->string))
      {
-        if ((wd->h_mode) &&
+        if ((sd->h_mode) &&
             (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
-              (_item_multi_select_down(wd)))
-             || (_item_single_select_down(wd))))
+              (_item_multi_select_down(sd)))
+             || (_item_single_select_down(sd))))
           {
              ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
              return EINA_TRUE;
@@ -195,13 +336,13 @@ _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type ty
         else
           x += step_x;
      }
-   else if ((!strcmp(ev->keyname, "Up"))  ||
+   else if ((!strcmp(ev->keyname, "Up")) ||
             ((!strcmp(ev->keyname, "KP_Up")) && !ev->string))
      {
-        if ((!wd->h_mode) &&
+        if ((!sd->h_mode) &&
             (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
-              (_item_multi_select_up(wd)))
-             || (_item_single_select_up(wd))))
+              (_item_multi_select_up(sd)))
+             || (_item_single_select_up(sd))))
           {
              ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
              return EINA_TRUE;
@@ -212,10 +353,10 @@ _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type ty
    else if ((!strcmp(ev->keyname, "Down")) ||
             ((!strcmp(ev->keyname, "KP_Down")) && !ev->string))
      {
-        if ((!wd->h_mode) &&
+        if ((!sd->h_mode) &&
             (((evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
-              (_item_multi_select_down(wd)))
-             || (_item_single_select_down(wd))))
+              (_item_multi_select_down(sd)))
+             || (_item_single_select_down(sd))))
           {
              ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
              return EINA_TRUE;
@@ -226,7 +367,7 @@ _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type ty
    else if ((!strcmp(ev->keyname, "Home")) ||
             ((!strcmp(ev->keyname, "KP_Home")) && !ev->string))
      {
-        it = eina_list_data_get(wd->items);
+        it = eina_list_data_get(sd->items);
         elm_list_item_bring_in((Elm_Object_Item *)it);
         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
         return EINA_TRUE;
@@ -234,7 +375,7 @@ _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type ty
    else if ((!strcmp(ev->keyname, "End")) ||
             ((!strcmp(ev->keyname, "KP_End")) && !ev->string))
      {
-        it = eina_list_data_get(eina_list_last(wd->items));
+        it = eina_list_data_get(eina_list_last(sd->items));
         elm_list_item_bring_in((Elm_Object_Item *)it);
         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
         return EINA_TRUE;
@@ -242,7 +383,7 @@ _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type ty
    else if ((!strcmp(ev->keyname, "Prior")) ||
             ((!strcmp(ev->keyname, "KP_Prior")) && !ev->string))
      {
-        if (wd->h_mode)
+        if (sd->h_mode)
           {
              if (page_x < 0)
                x -= -(page_x * v_w) / 100;
@@ -260,7 +401,7 @@ _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type ty
    else if ((!strcmp(ev->keyname, "Next")) ||
             ((!strcmp(ev->keyname, "KP_Next")) && !ev->string))
      {
-        if (wd->h_mode)
+        if (sd->h_mode)
           {
              if (page_x < 0)
                x += -(page_x * v_w) / 100;
@@ -276,494 +417,565 @@ _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type ty
           }
      }
    else if (((!strcmp(ev->keyname, "Return")) ||
-            (!strcmp(ev->keyname, "KP_Enter")) ||
-            (!strcmp(ev->keyname, "space")))
-           && (!wd->multi) && (wd->selected))
+             (!strcmp(ev->keyname, "KP_Enter")) ||
+             (!strcmp(ev->keyname, "space")))
+            && (!sd->multi) && (sd->selected))
      {
-        it = (Elm_List_Item *) elm_list_selected_item_get(obj);
+        it = (Elm_List_Item *)elm_list_selected_item_get(obj);
         evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
      }
    else if (!strcmp(ev->keyname, "Escape"))
      {
-        if (!_deselect_all_items(wd)) return EINA_FALSE;
+        if (!_all_items_unselect(sd)) return EINA_FALSE;
         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
         return EINA_TRUE;
      }
    else return EINA_FALSE;
 
    ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
-   elm_smart_scroller_child_pos_set(wd->scr, x, y);
-   return EINA_TRUE;
-}
+   sd->s_iface->content_pos_set(obj, x, y);
 
-static void
-_translate_hook(Evas_Object *obj)
-{
-   evas_object_smart_callback_call(obj, "language,changed", NULL);
+   return EINA_TRUE;
 }
 
 static Eina_Bool
-_deselect_all_items(Widget_Data *wd)
+_elm_list_smart_translate(Evas_Object *obj)
 {
-   if (!wd->selected) return EINA_FALSE;
-   while (wd->selected)
-     elm_list_item_selected_set((Elm_Object_Item *) wd->selected->data,
-                                EINA_FALSE);
+   evas_object_smart_callback_call(obj, SIG_LANG_CHANGED, NULL);
 
    return EINA_TRUE;
 }
 
-static Eina_Bool
-_item_multi_select_up(Widget_Data *wd)
+static void
+_elm_list_deletions_process(Elm_List_Smart_Data *sd)
 {
-   if (!wd->selected) return EINA_FALSE;
-   if (!wd->multi) return EINA_FALSE;
+   Elm_List_Item *it;
 
-   Elm_Object_Item *prev = elm_list_item_prev(wd->last_selected_item);
-   if (!prev) return EINA_TRUE;
+   sd->walking++; // avoid nested deletion and also _sub_del() items_fix
 
-   if (elm_list_item_selected_get(prev))
+   EINA_LIST_FREE (sd->to_delete, it)
      {
-        elm_list_item_selected_set(wd->last_selected_item, EINA_FALSE);
-        wd->last_selected_item = prev;
-        elm_list_item_show(wd->last_selected_item);
-     }
-   else
-     {
-        elm_list_item_selected_set(prev, EINA_TRUE);
-        elm_list_item_show(prev);
+        sd->items = eina_list_remove_list(sd->items, it->node);
+
+        /* issuing free because of "locking" item del pre hook */
+        _elm_list_item_free(it);
+        elm_widget_item_free(it);
      }
-   return EINA_TRUE;
+
+   sd->walking--;
 }
 
-static Eina_Bool
-_item_multi_select_down(Widget_Data *wd)
+static void
+_elm_list_smart_sizing_eval(Evas_Object *obj)
 {
-   if (!wd->selected) return EINA_FALSE;
-   if (!wd->multi) return EINA_FALSE;
+   Evas_Coord vw, vh, minw, minh, maxw, maxh, w, h, vmw, vmh;
+   double xw, yw;
 
-   Elm_Object_Item *next = elm_list_item_next(wd->last_selected_item);
-   if (!next) return EINA_TRUE;
+   ELM_LIST_DATA_GET(obj, sd);
 
-   if (elm_list_item_selected_get(next))
+   /* parent class' early call */
+   if (!sd->s_iface) return;
+
+   evas_object_size_hint_min_get(sd->box, &minw, &minh);
+   evas_object_size_hint_max_get(sd->box, &maxw, &maxh);
+   evas_object_size_hint_weight_get(sd->box, &xw, &yw);
+
+   sd->s_iface->content_viewport_size_get(obj, &vw, &vh);
+   if (xw > 0.0)
      {
-        elm_list_item_selected_set(wd->last_selected_item, EINA_FALSE);
-        wd->last_selected_item = next;
-        elm_list_item_show(wd->last_selected_item);
+        if ((minw > 0) && (vw < minw)) vw = minw;
+        else if ((maxw > 0) && (vw > maxw))
+          vw = maxw;
      }
-   else
+   else if (minw > 0)
+     vw = minw;
+   if (yw > 0.0)
      {
-        elm_list_item_selected_set(next, EINA_TRUE);
-        elm_list_item_show(next);
+        if ((minh > 0) && (vh < minh)) vh = minh;
+        else if ((maxh > 0) && (vh > maxh))
+          vh = maxh;
      }
-   return EINA_TRUE;
-}
+   else if (minh > 0)
+     vh = minh;
 
-static Eina_Bool
-_item_single_select_up(Widget_Data *wd)
-{
-   Elm_Object_Item *prev;
+   evas_object_resize(sd->box, vw, vh);
+   w = -1;
+   h = -1;
 
-   if (!wd->selected) prev = eina_list_data_get(eina_list_last(wd->items));
-   else prev = elm_list_item_prev(wd->last_selected_item);
-   if (!prev) return EINA_FALSE;
+   edje_object_size_min_calc
+     (ELM_WIDGET_DATA(sd)->resize_obj, &vmw, &vmh);
 
-   _deselect_all_items(wd);
+   if (sd->scr_minw) w = vmw + minw;
+   if (sd->scr_minh) h = vmh + minh;
 
-   elm_list_item_selected_set(prev, EINA_TRUE);
-   elm_list_item_show(prev);
-   return EINA_TRUE;
+   evas_object_size_hint_max_get(obj, &maxw, &maxh);
+   if ((maxw > 0) && (w > maxw))
+     w = maxw;
+   if ((maxh > 0) && (h > maxh))
+     h = maxh;
+
+   evas_object_size_hint_min_set(obj, w, h);
 }
 
-static Eina_Bool
-_item_single_select_down(Widget_Data *wd)
+static void
+_elm_list_content_min_limit_cb(Evas_Object *obj,
+                                   Eina_Bool w,
+                                   Eina_Bool h)
 {
-   Elm_Object_Item *next;
+   ELM_LIST_DATA_GET(obj, sd);
 
-   if (!wd->selected) next = eina_list_data_get(wd->items);
-   else next = elm_list_item_next(wd->last_selected_item);
-   if (!next) return EINA_FALSE;
-
-   _deselect_all_items(wd);
+   sd->scr_minw = !!w;
+   sd->scr_minh = !!h;
 
-   elm_list_item_selected_set(next, EINA_TRUE);
-   elm_list_item_show(next);
-   return EINA_TRUE;
+   elm_layout_sizing_eval(obj);
 }
 
 static void
-_elm_list_process_deletions(Widget_Data *wd)
+_elm_list_mode_set_internal(Elm_List_Smart_Data *sd)
 {
-   Elm_List_Item *it;
-
-   wd->walking++; // avoid nested deletion and also _sub_del() fix_items
-
-   EINA_LIST_FREE(wd->to_delete, it)
+   if (sd->mode == ELM_LIST_LIMIT)
      {
-        wd->items = eina_list_remove_list(wd->items, it->node);
-        _elm_list_item_free(it);
-        elm_widget_item_free(it);
+        if (!sd->h_mode)
+          {
+             sd->scr_minw = EINA_TRUE;
+             sd->scr_minh = EINA_FALSE;
+          }
+        else
+          {
+             sd->scr_minw = EINA_FALSE;
+             sd->scr_minh = EINA_TRUE;
+          }
+     }
+   else if (sd->mode == ELM_LIST_EXPAND)
+     {
+        sd->scr_minw = EINA_TRUE;
+        sd->scr_minh = EINA_TRUE;
+     }
+   else
+     {
+        sd->scr_minw = EINA_FALSE;
+        sd->scr_minh = EINA_FALSE;
      }
 
-   wd->walking--;
+   elm_layout_sizing_eval(ELM_WIDGET_DATA(sd)->obj);
 }
 
 static inline void
-_elm_list_walk(Widget_Data *wd)
+_elm_list_walk(Elm_List_Smart_Data *sd)
 {
-   if (wd->walking < 0)
+   if (sd->walking < 0)
      {
         ERR("ERROR: walking was negative. fixed!\n");
-        wd->walking = 0;
+        sd->walking = 0;
      }
-   wd->walking++;
+   sd->walking++;
 }
 
 static inline void
-_elm_list_unwalk(Widget_Data *wd)
+_elm_list_unwalk(Elm_List_Smart_Data *sd)
 {
-   wd->walking--;
-   if (wd->walking < 0)
+   sd->walking--;
+   if (sd->walking < 0)
      {
         ERR("ERROR: walking became negative. fixed!\n");
-        wd->walking = 0;
+        sd->walking = 0;
      }
 
-   if (wd->walking)
+   if (sd->walking)
      return;
 
-   if (wd->to_delete)
-     _elm_list_process_deletions(wd);
+   if (sd->to_delete)
+     _elm_list_deletions_process(sd);
 
-   if (wd->fix_pending)
+   if (sd->fix_pending)
      {
-        wd->fix_pending = EINA_FALSE;
-        _fix_items(wd->self);
-        _sizing_eval(wd->self);
+        sd->fix_pending = EINA_FALSE;
+        _items_fix(ELM_WIDGET_DATA(sd)->obj);
+        elm_layout_sizing_eval(ELM_WIDGET_DATA(sd)->obj);
      }
 }
 
 static void
-_del_pre_hook(Evas_Object *obj)
+_items_fix(Evas_Object *obj)
 {
-   Widget_Data *wd = elm_widget_data_get(obj);
+   Evas_Coord minw[2] = { 0, 0 }, minh[2] = { 0, 0 };
    const Eina_List *l;
    Elm_List_Item *it;
+   Evas_Coord mw, mh;
+   int i, redo = 0;
 
-   evas_object_smart_callback_del(obj, "sub-object-del", _sub_del);
+   const char *style;
+   const char *it_odd;
+   const char *it_plain;
+   const char *it_compress;
+   const char *it_compress_odd;
 
-   if (!wd) return;
+   ELM_LIST_DATA_GET(obj, sd);
+
+   style = elm_widget_style_get(obj);
+   it_plain = sd->h_mode ? "h_item" : "item";
+   it_odd = sd->h_mode ? "h_item_odd" : "item_odd";
+   it_compress = sd->h_mode ? "h_item_compress" : "item_compress";
+   it_compress_odd = sd->h_mode ? "h_item_compress_odd" : "item_compress_odd";
+
+   if (sd->walking)
+     {
+        sd->fix_pending = EINA_TRUE;
+        return;
+     }
+
+   evas_object_ref(obj);
+   _elm_list_walk(sd); // watch out "return" before unwalk!
 
-   EINA_LIST_FOREACH(wd->items, l, it)
+   EINA_LIST_FOREACH (sd->items, l, it)
      {
+        if (it->deleted) continue;
         if (it->icon)
-           evas_object_event_callback_del(it->icon,
-                                          EVAS_CALLBACK_CHANGED_SIZE_HINTS,
-                                          _changed_size_hints);
+          {
+             evas_object_size_hint_min_get(it->icon, &mw, &mh);
+             if (mw > minw[0]) minw[0] = mw;
+             if (mh > minh[0]) minh[0] = mh;
+          }
         if (it->end)
-           evas_object_event_callback_del(it->end,
-                                          EVAS_CALLBACK_CHANGED_SIZE_HINTS,
-                                          _changed_size_hints);
+          {
+             evas_object_size_hint_min_get(it->end, &mw, &mh);
+             if (mw > minw[1]) minw[1] = mw;
+             if (mh > minh[1]) minh[1] = mh;
+          }
      }
 
-   evas_object_event_callback_del(wd->scr,
-                                  EVAS_CALLBACK_CHANGED_SIZE_HINTS,
-                                  _changed_size_hints);
-   evas_object_event_callback_del(wd->box,
-                                  EVAS_CALLBACK_CHANGED_SIZE_HINTS,
-                                  _changed_size_hints);
-}
+   if ((minw[0] != sd->minw[0]) || (minw[1] != sd->minw[1]) ||
+       (minh[0] != sd->minh[0]) || (minh[1] != sd->minh[1]))
+     {
+        sd->minw[0] = minw[0];
+        sd->minw[1] = minw[1];
+        sd->minh[0] = minh[0];
+        sd->minh[1] = minh[1];
+        redo = 1;
+     }
 
-static void
-_del_hook(Evas_Object *obj)
-{
-   Widget_Data *wd = elm_widget_data_get(obj);
-   Elm_List_Item *it;
-   Eina_List *n;
+   i = 0;
+   EINA_LIST_FOREACH (sd->items, l, it)
+     {
+        if (it->deleted)
+          continue;
 
-   if (!wd) return;
-   if (wd->walking)
-     ERR("ERROR: list deleted while walking.\n");
+        it->even = i & 0x1;
+        if ((it->even != it->is_even) || (!it->fixed) || (redo))
+          {
+             const char *stacking;
 
-   _elm_list_walk(wd);
-   EINA_LIST_FOREACH(wd->items, n, it) elm_widget_item_pre_notify_del(it);
-   _elm_list_unwalk(wd);
-   if (wd->to_delete)
-     ERR("ERROR: leaking nodes!\n");
+             /* FIXME: separators' themes seem to be b0rked */
+             if (it->is_separator)
+               elm_widget_theme_object_set
+                 (obj, VIEW(it), "separator", sd->h_mode ?
+                 "horizontal" : "vertical", style);
+             else if (sd->mode == ELM_LIST_COMPRESS)
+               {
+                  if (it->even)
+                    elm_widget_theme_object_set
+                      (obj, VIEW(it), "list", it_compress, style);
+                  else
+                    elm_widget_theme_object_set
+                      (obj, VIEW(it), "list", it_compress_odd, style);
+               }
+             else
+               {
+                  if (it->even)
+                    elm_widget_theme_object_set
+                      (obj, VIEW(it), "list", it_plain, style);
+                  else
+                    elm_widget_theme_object_set
+                      (obj, VIEW(it), "list", it_odd, style);
+               }
+             stacking = edje_object_data_get(VIEW(it), "stacking");
+             if (stacking)
+               {
+                  if (!strcmp(stacking, "below"))
+                    evas_object_lower(VIEW(it));
+                  else if (!strcmp(stacking, "above"))
+                    evas_object_raise(VIEW(it));
+               }
+             edje_object_part_text_escaped_set
+               (VIEW(it), "elm.text", it->label);
 
-   EINA_LIST_FREE(wd->items, it)
-     {
-        _elm_list_item_free(it);
-        elm_widget_item_free(it);
+             if ((!it->icon) && (minh[0] > 0))
+               {
+                  it->icon = evas_object_rectangle_add
+                      (evas_object_evas_get(VIEW(it)));
+                  evas_object_color_set(it->icon, 0, 0, 0, 0);
+                  it->dummy_icon = EINA_TRUE;
+               }
+             if ((!it->end) && (minh[1] > 0))
+               {
+                  it->end = evas_object_rectangle_add
+                      (evas_object_evas_get(VIEW(it)));
+                  evas_object_color_set(it->end, 0, 0, 0, 0);
+                  it->dummy_end = EINA_TRUE;
+               }
+             if (it->icon)
+               {
+                  evas_object_size_hint_min_set(it->icon, minw[0], minh[0]);
+                  evas_object_size_hint_max_set(it->icon, 99999, 99999);
+                  edje_object_part_swallow
+                    (VIEW(it), "elm.swallow.icon", it->icon);
+               }
+             if (it->end)
+               {
+                  evas_object_size_hint_min_set(it->end, minw[1], minh[1]);
+                  evas_object_size_hint_max_set(it->end, 99999, 99999);
+                  edje_object_part_swallow
+                    (VIEW(it), "elm.swallow.end", it->end);
+               }
+             if (!it->fixed)
+               {
+                  // this may call up user and it may modify the list item
+                  // but we're safe as we're flagged as walking.
+                  // just don't process further
+                  edje_object_message_signal_process(VIEW(it));
+                  if (it->deleted)
+                    continue;
+                  mw = mh = -1;
+                  elm_coords_finger_size_adjust(1, &mw, 1, &mh);
+                  edje_object_size_min_restricted_calc
+                    (VIEW(it), &mw, &mh, mw, mh);
+                  elm_coords_finger_size_adjust(1, &mw, 1, &mh);
+                  evas_object_size_hint_min_set(VIEW(it), mw, mh);
+                  evas_object_show(VIEW(it));
+               }
+             if ((it->selected) || (it->highlighted))
+               {
+                  const char *select_raise;
+
+                  // this may call up user and it may modify the list item
+                  // but we're safe as we're flagged as walking.
+                  // just don't process further
+                  edje_object_signal_emit
+                    (VIEW(it), "elm,state,selected", "elm");
+                  if (it->deleted)
+                    continue;
+
+                  select_raise = edje_object_data_get(VIEW(it), "selectraise");
+                  if ((select_raise) && (!strcmp(select_raise, "on")))
+                    evas_object_raise(VIEW(it));
+               }
+             if (it->base.disabled)
+               edje_object_signal_emit(VIEW(it), "elm,state,disabled", "elm");
+
+             it->fixed = EINA_TRUE;
+             it->is_even = it->even;
+          }
+        i++;
      }
-   eina_list_free(wd->selected);
-   free(wd);
+
+   _elm_list_mode_set_internal(sd);
+   _elm_list_unwalk(sd);
+
+   evas_object_unref(obj);
 }
 
 static void
-_show_region_hook(void *data, Evas_Object *obj)
+_size_hints_changed_cb(void *data,
+                       Evas *e __UNUSED__,
+                       Evas_Object *obj __UNUSED__,
+                       void *event_info __UNUSED__)
+{
+   _items_fix(data);
+   elm_layout_sizing_eval(data);
+}
+
+/* FIXME: take off later. maybe this show region coords belong in the
+ * interface (new api functions, set/get)? */
+static void
+_show_region_hook(void *data,
+                  Evas_Object *obj)
 {
-   Widget_Data *wd = elm_widget_data_get(data);
    Evas_Coord x, y, w, h;
-   if (!wd) return;
+
+   ELM_LIST_DATA_GET(data, sd);
+
    elm_widget_show_region_get(obj, &x, &y, &w, &h);
-   elm_smart_scroller_child_region_set(wd->scr, x, y, w, h);
+   sd->s_iface->content_region_set(obj, x, y, w, h);
 }
 
-static void
-_disable_hook(Evas_Object *obj)
+static Eina_Bool
+_elm_list_smart_disable(Evas_Object *obj)
 {
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
+   ELM_LIST_DATA_GET(obj, sd);
+
+   if (!ELM_WIDGET_CLASS(_elm_list_parent_sc)->disable(obj))
+     return EINA_FALSE;
+
    if (elm_widget_disabled_get(obj))
      {
-        _signal_emit_hook(obj, "elm,state,disabled", "elm");
         elm_widget_scroll_freeze_push(obj);
         elm_widget_scroll_hold_push(obj);
         /* FIXME: if we get to have a way to only un-highlight items
          * in the future, keeping them selected... */
-        _deselect_all_items(wd);
+        _all_items_unselect(sd);
      }
    else
      {
-        _signal_emit_hook(obj, "elm,state,enabled", "elm");
         elm_widget_scroll_freeze_pop(obj);
         elm_widget_scroll_hold_pop(obj);
      }
-}
-
-static void
-_sizing_eval(Evas_Object *obj)
-{
-
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
-   Evas_Coord  vw, vh, minw, minh, maxw, maxh, w, h, vmw, vmh;
-   double xw, yw;
 
-   evas_object_size_hint_min_get(wd->box, &minw, &minh);
-   evas_object_size_hint_max_get(wd->box, &maxw, &maxh);
-   evas_object_size_hint_weight_get(wd->box, &xw, &yw);
-   if (!wd->scr) return;
-   elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, &vh);
-   if (xw > 0.0)
-     {
-        if ((minw > 0) && (vw < minw)) vw = minw;
-        else if ((maxw > 0) && (vw > maxw)) vw = maxw;
-     }
-   else if (minw > 0) vw = minw;
-   if (yw > 0.0)
-     {
-        if ((minh > 0) && (vh < minh)) vh = minh;
-        else if ((maxh > 0) && (vh > maxh)) vh = maxh;
-     }
-   else if (minh > 0) vh = minh;
-   evas_object_resize(wd->box, vw, vh);
-   w = -1;
-   h = -1;
-   edje_object_size_min_calc(elm_smart_scroller_edje_object_get(wd->scr),
-                             &vmw, &vmh);
-   if (wd->scr_minw) w = vmw + minw;
-   if (wd->scr_minh) h = vmh + minh;
-
-   evas_object_size_hint_max_get(obj, &maxw, &maxh);
-   if ((maxw > 0) && (w > maxw))
-     w = maxw;
-   if ((maxh > 0) && (h > maxh))
-     h = maxh;
-
-   evas_object_size_hint_min_set(obj, w, h);
-}
-
-static void
-_signal_emit_hook(Evas_Object *obj, const char *emission, const char *source)
-{
-   Widget_Data *wd = elm_widget_data_get(obj);
-   edje_object_signal_emit(elm_smart_scroller_edje_object_get(wd->scr),
-                           emission, source);
-}
-
-static void
-_signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data)
-{
-   Widget_Data *wd = elm_widget_data_get(obj);
-   edje_object_signal_callback_add(elm_smart_scroller_edje_object_get(wd->scr),
-                                   emission, source, func_cb, data);
-}
-
-static void
-_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data)
-{
-   Widget_Data *wd = elm_widget_data_get(obj);
-   edje_object_signal_callback_del_full(
-      elm_smart_scroller_edje_object_get(wd->scr),
-      emission, source, func_cb, data);
+   return EINA_TRUE;
 }
 
 static void
-_mirrored_set(Evas_Object *obj, Eina_Bool rtl)
+_mirrored_set(Evas_Object *obj,
+              Eina_Bool rtl)
 {
-   Widget_Data *wd = elm_widget_data_get(obj);
+   ELM_LIST_DATA_GET(obj, sd);
    Elm_List_Item *it;
    Eina_List *n;
 
-   if (!wd) return;
-   if (wd->scr)
-     elm_smart_scroller_mirrored_set(wd->scr, rtl);
+   sd->s_iface->mirrored_set(obj, rtl);
 
-   EINA_LIST_FOREACH(wd->items, n, it)
-      edje_object_mirrored_set(VIEW(it), rtl);
+   EINA_LIST_FOREACH (sd->items, n, it)
+     edje_object_mirrored_set(VIEW(it), rtl);
 }
 
-static void
-_theme_hook(Evas_Object *obj)
+static Eina_Bool
+_elm_list_smart_theme(Evas_Object *obj)
 {
-   Widget_Data *wd = elm_widget_data_get(obj);
    Elm_List_Item *it;
+   const char *str;
    Eina_List *n;
 
-   if (!wd) return;
-   _elm_widget_mirrored_reload(obj);
+   ELM_LIST_DATA_GET(obj, sd);
+
+   if (!ELM_WIDGET_CLASS(_elm_list_parent_sc)->theme(obj)) return EINA_FALSE;
+
    _mirrored_set(obj, elm_widget_mirrored_get(obj));
 
-   if (wd->scr)
-     {
-        Evas_Object *edj;
-        const char *str;
+   str = edje_object_data_get
+       (ELM_WIDGET_DATA(sd)->resize_obj, "focus_highlight");
+   if ((str) && (!strcmp(str, "on")))
+     elm_widget_highlight_in_theme_set(obj, EINA_TRUE);
+   else
+     elm_widget_highlight_in_theme_set(obj, EINA_FALSE);
 
-        elm_smart_scroller_object_theme_set(obj, wd->scr, "list", "base",
-                                            elm_widget_style_get(obj));
-        edje_object_scale_set(wd->scr, elm_widget_scale_get(obj) * _elm_config->scale);
-        edj = elm_smart_scroller_edje_object_get(wd->scr);
-        str = edje_object_data_get(edj, "focus_highlight");
-        if ((str) && (!strcmp(str, "on")))
-          elm_widget_highlight_in_theme_set(obj, EINA_TRUE);
-        else
-          elm_widget_highlight_in_theme_set(obj, EINA_FALSE);
-        elm_object_style_set(wd->scr, elm_widget_style_get(obj));
-     }
-   EINA_LIST_FOREACH(wd->items, n, it)
+   EINA_LIST_FOREACH (sd->items, n, it)
      {
-        edje_object_scale_set(VIEW(it), elm_widget_scale_get(obj) * _elm_config->scale);
+        edje_object_scale_set
+          (VIEW(it), elm_widget_scale_get(obj) * elm_config_scale_get());
         it->fixed = 0;
      }
-   _fix_items(obj);
-   _sizing_eval(obj);
-}
 
-static void
-_on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
-{
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
-   if (elm_widget_focus_get(obj))
-     {
-        edje_object_signal_emit(wd->self, "elm,action,focus", "elm");
-        evas_object_focus_set(wd->self, EINA_TRUE);
+   _items_fix(obj);
+   elm_layout_sizing_eval(obj);
 
-        if ((wd->selected) && (!wd->last_selected_item))
-          wd->last_selected_item = eina_list_data_get(wd->selected);
-     }
-   else
-     {
-        edje_object_signal_emit(wd->self, "elm,action,unfocus", "elm");
-        evas_object_focus_set(wd->self, EINA_FALSE);
-     }
+   return EINA_TRUE;
 }
 
-static void
-_changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+static Eina_Bool
+_elm_list_smart_on_focus(Evas_Object *obj)
 {
-   Widget_Data *wd = elm_widget_data_get(data);
-   if (!wd) return;
-   _fix_items(data);
-   _sizing_eval(data);
+   ELM_LIST_DATA_GET(obj, sd);
+
+   if (!ELM_WIDGET_CLASS(_elm_list_parent_sc)->on_focus(obj))
+     return EINA_FALSE;
+
+   if (elm_widget_focus_get(obj) && sd->selected && !sd->last_selected_item)
+     sd->last_selected_item = eina_list_data_get(sd->selected);
+
+   return EINA_TRUE;
 }
 
-static void
-_sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info)
+static Eina_Bool
+_elm_list_smart_sub_object_del(Evas_Object *obj,
+                               Evas_Object *sobj)
 {
-   Widget_Data *wd = elm_widget_data_get(obj);
-   Evas_Object *sub = event_info;
    const Eina_List *l;
    Elm_List_Item *it;
 
-   if (!wd) return;
-   if (!sub) abort();
-   if ((sub == wd->box) || (sub == wd->scr)) return;
+   ELM_LIST_DATA_GET(obj, sd);
 
-   EINA_LIST_FOREACH(wd->items, l, it)
+   if (!ELM_WIDGET_CLASS(_elm_list_parent_sc)->sub_object_del(obj, sobj))
+     return EINA_FALSE;
+
+   if ((sobj == sd->box) || (sobj == obj)) goto end;
+
+   EINA_LIST_FOREACH (sd->items, l, it)
      {
-        if ((sub == it->icon) || (sub == it->end))
+        if ((sobj == it->icon) || (sobj == it->end))
           {
-             if (it->icon == sub) it->icon = NULL;
-             if (it->end == sub) it->end = NULL;
+             if (it->icon == sobj) it->icon = NULL;
+             if (it->end == sobj) it->end = NULL;
              evas_object_event_callback_del_full
-             (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints,
-              obj);
-             if (!wd->walking)
+               (sobj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _size_hints_changed_cb,
+               obj);
+             if (!sd->walking)
                {
-                  _fix_items(obj);
-                  _sizing_eval(obj);
+                  _items_fix(obj);
+                  elm_layout_sizing_eval(obj);
                }
              else
-               wd->fix_pending = EINA_TRUE;
+               sd->fix_pending = EINA_TRUE;
              break;
           }
      }
+
+end:
+   return EINA_TRUE;
 }
 
 static void
 _item_highlight(Elm_List_Item *it)
 {
-   Evas_Object *obj = WIDGET(it);
-   Widget_Data *wd = elm_widget_data_get(obj);
-   const char *selectraise;
+   Evas_Object *obj;
+   const char *select_raise;
+
+   ELM_LIST_ITEM_CHECK_OR_RETURN(it);
+   obj = WIDGET(it);
+   ELM_LIST_DATA_GET(obj, sd);
 
-   if (!wd) return;
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
    if ((it->highlighted) || (it->base.disabled) ||
-       (wd->select_mode == ELM_OBJECT_SELECT_MODE_NONE)) return;
+       (sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE)) return;
 
    evas_object_ref(obj);
-   _elm_list_walk(wd);
+   _elm_list_walk(sd);
 
    edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm");
-   selectraise = edje_object_data_get(VIEW(it), "selectraise");
-   if ((selectraise) && (!strcmp(selectraise, "on")))
+   select_raise = edje_object_data_get(VIEW(it), "selectraise");
+   if ((select_raise) && (!strcmp(select_raise, "on")))
      evas_object_raise(VIEW(it));
    it->highlighted = EINA_TRUE;
 
-   _elm_list_unwalk(wd);
+   _elm_list_unwalk(sd);
    evas_object_unref(obj);
 }
 
 static void
 _item_select(Elm_List_Item *it)
 {
-   Evas_Object *obj = WIDGET(it);
-   Widget_Data *wd = elm_widget_data_get(obj);
+   Evas_Object *obj;
+
+   ELM_LIST_ITEM_CHECK_OR_RETURN(it);
+   obj = WIDGET(it);
+   ELM_LIST_DATA_GET(obj, sd);
 
-   if (!wd) return;
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
-   if (it->base.disabled || (wd->select_mode == ELM_OBJECT_SELECT_MODE_NONE)) return;
+   if (it->base.disabled || (sd->select_mode == ELM_OBJECT_SELECT_MODE_NONE))
+     return;
    if (it->selected)
      {
-        if (wd->select_mode == ELM_OBJECT_SELECT_MODE_ALWAYS) goto call;
+        if (sd->select_mode == ELM_OBJECT_SELECT_MODE_ALWAYS) goto call;
         return;
      }
    it->selected = EINA_TRUE;
-   wd->selected = eina_list_append(wd->selected, it);
+   sd->selected = eina_list_append(sd->selected, it);
 
 call:
    evas_object_ref(obj);
-   _elm_list_walk(wd);
+   _elm_list_walk(sd);
 
    if (it->func) it->func((void *)it->base.data, WIDGET(it), it);
    evas_object_smart_callback_call(obj, SIG_SELECTED, it);
-   it->wd->last_selected_item = (Elm_Object_Item *)it;
+   it->sd->last_selected_item = (Elm_Object_Item *)it;
 
-   _elm_list_unwalk(wd);
+   _elm_list_unwalk(sd);
    evas_object_unref(obj);
 }
 
@@ -771,20 +983,19 @@ static void
 _item_unselect(Elm_List_Item *it)
 {
    Evas_Object *obj = WIDGET(it);
-   Widget_Data *wd = elm_widget_data_get(obj);
-   const char *stacking, *selectraise;
+   ELM_LIST_DATA_GET(obj, sd);
+   const char *stacking, *select_raise;
 
-   if (!wd) return;
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
+   ELM_LIST_ITEM_CHECK_OR_RETURN(it);
    if (!it->highlighted) return;
 
    evas_object_ref(obj);
-   _elm_list_walk(wd);
+   _elm_list_walk(sd);
 
    edje_object_signal_emit(VIEW(it), "elm,state,unselected", "elm");
    stacking = edje_object_data_get(VIEW(it), "stacking");
-   selectraise = edje_object_data_get(VIEW(it), "selectraise");
-   if ((selectraise) && (!strcmp(selectraise, "on")))
+   select_raise = edje_object_data_get(VIEW(it), "selectraise");
+   if ((select_raise) && (!strcmp(select_raise, "on")))
      {
         if ((stacking) && (!strcmp(stacking, "below")))
           evas_object_lower(VIEW(it));
@@ -793,11 +1004,11 @@ _item_unselect(Elm_List_Item *it)
    if (it->selected)
      {
         it->selected = EINA_FALSE;
-        wd->selected = eina_list_remove(wd->selected, it);
+        sd->selected = eina_list_remove(sd->selected, it);
         evas_object_smart_callback_call(WIDGET(it), SIG_UNSELECTED, it);
      }
 
-   _elm_list_unwalk(wd);
+   _elm_list_unwalk(sd);
    evas_object_unref(obj);
 }
 
@@ -805,100 +1016,58 @@ static Eina_Bool
 _swipe_cancel(void *data)
 {
    Elm_List_Item *it = data;
-   Widget_Data *wd = elm_widget_data_get(WIDGET(it));
 
-   if (!wd) return ECORE_CALLBACK_CANCEL;
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(it, ECORE_CALLBACK_CANCEL);
-   wd->swipe = EINA_FALSE;
-   wd->movements = 0;
-   return ECORE_CALLBACK_RENEW;
-}
+   ELM_LIST_ITEM_CHECK_OR_RETURN(it, ECORE_CALLBACK_CANCEL);
+   ELM_LIST_DATA_GET(WIDGET(it), sd);
 
-static void
-_mouse_move(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
-{
-   Elm_List_Item *it = data;
-   Evas_Object *obj2 = WIDGET(it);
-   Widget_Data *wd = elm_widget_data_get(obj2);
-   Evas_Event_Mouse_Move *ev = event_info;
-
-   if (!wd) return;
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
-
-   evas_object_ref(obj2);
-   _elm_list_walk(wd);
-
-   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
-     {
-        if (!wd->on_hold)
-          {
-             wd->on_hold = EINA_TRUE;
-             if (it->long_timer)
-               {
-                  ecore_timer_del(it->long_timer);
-                  it->long_timer = NULL;
-               }
-             if (!wd->wasselected)
-               _item_unselect(it);
-          }
-        if (wd->movements == SWIPE_MOVES) wd->swipe = EINA_TRUE;
-        else
-          {
-             wd->history[wd->movements].x = ev->cur.canvas.x;
-             wd->history[wd->movements].y = ev->cur.canvas.y;
-             if (abs((wd->history[wd->movements].x - wd->history[0].x)) > 40)
-               wd->swipe = EINA_TRUE;
-             else
-               wd->movements++;
-          }
-     }
+   sd->swipe = EINA_FALSE;
+   sd->movements = 0;
 
-   _elm_list_unwalk(wd);
-   evas_object_unref(obj2);
+   return ECORE_CALLBACK_RENEW;
 }
 
 static void
-_edge_left(void *data, Evas_Object *scr __UNUSED__, void *event_info __UNUSED__)
+_edge_left_cb(Evas_Object *obj,
+              void *data __UNUSED__)
 {
-   Evas_Object *obj = data;
    evas_object_smart_callback_call(obj, SIG_EDGE_LEFT, NULL);
 }
 
 static void
-_edge_right(void *data, Evas_Object *scr __UNUSED__, void *event_info __UNUSED__)
+_edge_right_cb(Evas_Object *obj,
+               void *data __UNUSED__)
 {
-   Evas_Object *obj = data;
    evas_object_smart_callback_call(obj, SIG_EDGE_RIGHT, NULL);
 }
 
 static void
-_edge_top(void *data, Evas_Object *scr __UNUSED__, void *event_info __UNUSED__)
+_edge_top_cb(Evas_Object *obj,
+             void *data __UNUSED__)
 {
-   Evas_Object *obj = data;
    evas_object_smart_callback_call(obj, SIG_EDGE_TOP, NULL);
 }
 
 static void
-_edge_bottom(void *data, Evas_Object *scr __UNUSED__, void *event_info __UNUSED__)
+_edge_bottom_cb(Evas_Object *obj,
+                void *data __UNUSED__)
 {
-   Evas_Object *obj = data;
    evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL);
 }
 
 static Eina_Bool
-_long_press(void *data)
+_long_press_cb(void *data)
 {
    Elm_List_Item *it = data;
-   Evas_Object *obj = WIDGET(it);
-   Widget_Data *wd = elm_widget_data_get(obj);
+   Evas_Object *obj;
 
-   if (!wd) goto end;
+   ELM_LIST_ITEM_CHECK_OR_RETURN(it, ECORE_CALLBACK_CANCEL);
+   obj = WIDGET(it);
+   ELM_LIST_DATA_GET(obj, sd);
 
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(it, ECORE_CALLBACK_CANCEL);
    it->long_timer = NULL;
    if (it->base.disabled) goto end;
 
-   wd->longpressed = EINA_TRUE;
+   sd->longpressed = EINA_TRUE;
    evas_object_smart_callback_call(WIDGET(it), SIG_LONGPRESSED, it);
 
 end:
@@ -906,77 +1075,135 @@ end:
 }
 
 static void
-_swipe(Elm_List_Item *it)
+_swipe_do(Elm_List_Item *it)
 {
    int i, sum = 0;
-   Widget_Data *wd = elm_widget_data_get(WIDGET(it));
 
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
-   if (!wd) return;
-   wd->swipe = EINA_FALSE;
-   for (i = 0; i < wd->movements; i++)
+   ELM_LIST_ITEM_CHECK_OR_RETURN(it);
+   ELM_LIST_DATA_GET(WIDGET(it), sd);
+
+   sd->swipe = EINA_FALSE;
+   for (i = 0; i < sd->movements; i++)
      {
-        sum += wd->history[i].x;
-        if (abs(wd->history[0].y - wd->history[i].y) > 10) return;
+        sum += sd->history[i].x;
+        if (abs(sd->history[0].y - sd->history[i].y) > 10) return;
      }
 
-   sum /= wd->movements;
-   if (abs(sum - wd->history[0].x) <= 10) return;
-   evas_object_smart_callback_call(WIDGET(it), "swipe", it);
+   sum /= sd->movements;
+   if (abs(sum - sd->history[0].x) <= 10) return;
+
+   evas_object_smart_callback_call(WIDGET(it), SIG_SWIPE, it);
 }
 
 static void
-_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+_mouse_move_cb(void *data,
+               Evas *evas __UNUSED__,
+               Evas_Object *o __UNUSED__,
+               void *event_info)
 {
+   Evas_Object *obj;
    Elm_List_Item *it = data;
-   Evas_Object *obj2 = WIDGET(it);
-   Widget_Data *wd = elm_widget_data_get(obj2);
+   Evas_Event_Mouse_Move *ev = event_info;
+
+   ELM_LIST_ITEM_CHECK_OR_RETURN(it);
+   obj = WIDGET(it);
+   ELM_LIST_DATA_GET(obj, sd);
+
+   evas_object_ref(obj);
+   _elm_list_walk(sd);
+
+   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
+     {
+        if (!sd->on_hold)
+          {
+             sd->on_hold = EINA_TRUE;
+             if (it->long_timer)
+               {
+                  ecore_timer_del(it->long_timer);
+                  it->long_timer = NULL;
+               }
+             if (!sd->was_selected)
+               _item_unselect(it);
+          }
+        if (sd->movements == SWIPE_MOVES) sd->swipe = EINA_TRUE;
+        else
+          {
+             sd->history[sd->movements].x = ev->cur.canvas.x;
+             sd->history[sd->movements].y = ev->cur.canvas.y;
+             if (abs((sd->history[sd->movements].x - sd->history[0].x)) > 40)
+               sd->swipe = EINA_TRUE;
+             else
+               sd->movements++;
+          }
+     }
+
+   _elm_list_unwalk(sd);
+   evas_object_unref(obj);
+}
+
+static void
+_mouse_down_cb(void *data,
+               Evas *evas __UNUSED__,
+               Evas_Object *o __UNUSED__,
+               void *event_info)
+{
    Evas_Event_Mouse_Down *ev = event_info;
+   Elm_List_Item *it = data;
+   Evas_Object *obj;
+
+   ELM_LIST_ITEM_CHECK_OR_RETURN(it);
+   obj = WIDGET(it);
+   ELM_LIST_DATA_GET(obj, sd);
 
-   if (!wd) return;
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
    if (ev->button != 1) return;
-   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) wd->on_hold = EINA_TRUE;
-   else wd->on_hold = EINA_FALSE;
-   if (wd->on_hold) return;
-   wd->wasselected = it->selected;
+   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) sd->on_hold = EINA_TRUE;
+   else sd->on_hold = EINA_FALSE;
 
-   evas_object_ref(obj2);
-   _elm_list_walk(wd);
+   if (sd->on_hold) return;
+   sd->was_selected = it->selected;
+
+   evas_object_ref(obj);
+   _elm_list_walk(sd);
 
    _item_highlight(it);
-   wd->longpressed = EINA_FALSE;
+   sd->longpressed = EINA_FALSE;
    if (it->long_timer) ecore_timer_del(it->long_timer);
-   it->long_timer = ecore_timer_add(_elm_config->longpress_timeout, _long_press, it);
+   it->long_timer = ecore_timer_add
+       (_elm_config->longpress_timeout, _long_press_cb, it);
    if (it->swipe_timer) ecore_timer_del(it->swipe_timer);
    it->swipe_timer = ecore_timer_add(0.4, _swipe_cancel, it);
+
    /* Always call the callbacks last - the user may delete our context! */
    if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
      {
         evas_object_smart_callback_call(WIDGET(it), SIG_CLICKED_DOUBLE, it);
         evas_object_smart_callback_call(WIDGET(it), SIG_ACTIVATED, it);
      }
-   wd->swipe = EINA_FALSE;
-   wd->movements = 0;
+   sd->swipe = EINA_FALSE;
+   sd->movements = 0;
 
-   _elm_list_unwalk(wd);
-   evas_object_unref(obj2);
+   _elm_list_unwalk(sd);
+   evas_object_unref(obj);
 }
 
 static void
-_mouse_up(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+_mouse_up_cb(void *data,
+             Evas *evas __UNUSED__,
+             Evas_Object *o __UNUSED__,
+             void *event_info)
 {
+   Evas_Object *obj;
    Elm_List_Item *it = data;
-   Evas_Object *obj2 = WIDGET(it);
-   Widget_Data *wd = elm_widget_data_get(obj2);
    Evas_Event_Mouse_Up *ev = event_info;
 
-   if (!wd) return;
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
+   ELM_LIST_ITEM_CHECK_OR_RETURN(it);
+   obj = WIDGET(it);
+   ELM_LIST_DATA_GET(obj, sd);
+
    if (ev->button != 1) return;
-   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) wd->on_hold = EINA_TRUE;
-   else wd->on_hold = EINA_FALSE;
-   wd->longpressed = EINA_FALSE;
+   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) sd->on_hold = EINA_TRUE;
+   else sd->on_hold = EINA_FALSE;
+   sd->longpressed = EINA_FALSE;
    if (it->long_timer)
      {
         ecore_timer_del(it->long_timer);
@@ -987,16 +1214,16 @@ _mouse_up(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *
         ecore_timer_del(it->swipe_timer);
         it->swipe_timer = NULL;
      }
-   if (wd->on_hold)
+   if (sd->on_hold)
      {
-        if (wd->swipe) _swipe(data);
-        wd->on_hold = EINA_FALSE;
+        if (sd->swipe) _swipe_do(data);
+        sd->on_hold = EINA_FALSE;
         return;
      }
-   if (wd->longpressed)
+   if (sd->longpressed)
      {
-        if (!wd->wasselected) _item_unselect(it);
-        wd->wasselected = 0;
+        if (!sd->was_selected) _item_unselect(it);
+        sd->was_selected = 0;
         return;
      }
 
@@ -1004,10 +1231,10 @@ _mouse_up(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *
      return;
    if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
 
-   evas_object_ref(obj2);
-   _elm_list_walk(wd);
+   evas_object_ref(obj);
+   _elm_list_walk(sd);
 
-   if (wd->multi)
+   if (sd->multi)
      {
         if (!it->selected)
           {
@@ -1020,8 +1247,8 @@ _mouse_up(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *
      {
         if (!it->selected)
           {
-             while (wd->selected)
-               _item_unselect(wd->selected->data);
+             while (sd->selected)
+               _item_unselect(sd->selected->data);
              _item_highlight(it);
              _item_select(it);
           }
@@ -1030,21 +1257,22 @@ _mouse_up(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *
              const Eina_List *l, *l_next;
              Elm_List_Item *it2;
 
-             EINA_LIST_FOREACH_SAFE(wd->selected, l, l_next, it2)
-                if (it2 != it) _item_unselect(it2);
+             EINA_LIST_FOREACH_SAFE (sd->selected, l, l_next, it2)
+               if (it2 != it) _item_unselect(it2);
              _item_highlight(it);
              _item_select(it);
           }
      }
 
-   _elm_list_unwalk(wd);
-   evas_object_unref(obj2);
+   _elm_list_unwalk(sd);
+   evas_object_unref(obj);
 }
 
 static void
-_item_disable(Elm_Object_Item *it)
+_item_disable_hook(Elm_Object_Item *it)
 {
    Elm_List_Item *item = (Elm_List_Item *)it;
+
    if (item->base.disabled)
      edje_object_signal_emit(VIEW(item), "elm,state,disabled", "elm");
    else
@@ -1052,7 +1280,9 @@ _item_disable(Elm_Object_Item *it)
 }
 
 static void
-_item_content_set_hook(Elm_Object_Item *it, const char *part, Evas_Object *content)
+_item_content_set_hook(Elm_Object_Item *it,
+                       const char *part,
+                       Evas_Object *content)
 {
    Elm_List_Item *item = (Elm_List_Item *)it;
    Evas_Object **icon_p = NULL;
@@ -1080,7 +1310,8 @@ _item_content_set_hook(Elm_Object_Item *it, const char *part, Evas_Object *conte
    if (dummy) evas_object_del(*icon_p);
    if (!content)
      {
-        content = evas_object_rectangle_add(evas_object_evas_get(WIDGET(item)));
+        content =
+          evas_object_rectangle_add(evas_object_evas_get(WIDGET(item)));
         evas_object_color_set(content, 0, 0, 0, 0);
      }
    if (*icon_p)
@@ -1089,12 +1320,14 @@ _item_content_set_hook(Elm_Object_Item *it, const char *part, Evas_Object *conte
         *icon_p = NULL;
      }
    *icon_p = content;
+
    if (VIEW(item))
      edje_object_part_swallow(VIEW(item), "elm.swallow.icon", content);
 }
 
 static Evas_Object *
-_item_content_get_hook(const Elm_Object_Item *it, const char *part)
+_item_content_get_hook(const Elm_Object_Item *it,
+                       const char *part)
 {
    Elm_List_Item *item = (Elm_List_Item *)it;
 
@@ -1108,11 +1341,13 @@ _item_content_get_hook(const Elm_Object_Item *it, const char *part)
         if (item->dummy_end) return NULL;
         return item->end;
      }
+
    return NULL;
 }
 
 static Evas_Object *
-_item_content_unset_hook(const Elm_Object_Item *it, const char *part)
+_item_content_unset_hook(const Elm_Object_Item *it,
+                         const char *part)
 {
    Elm_List_Item *item = (Elm_List_Item *)it;
 
@@ -1128,13 +1363,17 @@ _item_content_unset_hook(const Elm_Object_Item *it, const char *part)
         _item_content_set_hook((Elm_Object_Item *)it, part, NULL);
         return obj;
      }
+
    return NULL;
 }
 
 static void
-_item_text_set_hook(Elm_Object_Item *it, const char *part, const char *text)
+_item_text_set_hook(Elm_Object_Item *it,
+                    const char *part,
+                    const char *text)
 {
    Elm_List_Item *list_it = (Elm_List_Item *)it;
+
    if (part && strcmp(part, "default")) return;
    if (!eina_stringshare_replace(&list_it->label, text)) return;
    if (VIEW(list_it))
@@ -1142,7 +1381,8 @@ _item_text_set_hook(Elm_Object_Item *it, const char *part, const char *text)
 }
 
 static const char *
-_item_text_get_hook(const Elm_Object_Item *it, const char *part)
+_item_text_get_hook(const Elm_Object_Item *it,
+                    const char *part)
 {
    if (part && strcmp(part, "default")) return NULL;
    return ((Elm_List_Item *)it)->label;
@@ -1153,52 +1393,57 @@ _item_del_pre_hook(Elm_Object_Item *it)
 {
    Evas_Object *obj = WIDGET(it);
    Elm_List_Item *item = (Elm_List_Item *)it;
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return EINA_FALSE;
+
+   ELM_LIST_DATA_GET(obj, sd);
 
    if (item->selected) _item_unselect(item);
 
-   if (wd->walking > 0)
+   if (sd->walking > 0)
      {
         if (item->deleted) return EINA_FALSE;
         item->deleted = EINA_TRUE;
-        wd->to_delete = eina_list_append(wd->to_delete, item);
+        sd->to_delete = eina_list_append(sd->to_delete, item);
         return EINA_FALSE;
      }
 
-   wd->items = eina_list_remove_list(wd->items, item->node);
+   sd->items = eina_list_remove_list(sd->items, item->node);
 
    evas_object_ref(obj);
-   _elm_list_walk(wd);
+   _elm_list_walk(sd);
 
    _elm_list_item_free(item);
 
-   _elm_list_unwalk(wd);
+   _elm_list_unwalk(sd);
    evas_object_unref(obj);
 
    return EINA_TRUE;
 }
 
 static char *
-_access_info_cb(void *data, Evas_Object *obj __UNUSED__, Elm_Widget_Item *item __UNUSED__)
+_access_info_cb(void *data,
+                Evas_Object *obj __UNUSED__,
+                Elm_Widget_Item *item __UNUSED__)
 {
-   const char *txt = NULL;
    Elm_List_Item *it = (Elm_List_Item *)data;
+   const char *txt = NULL;
    if (!it) return NULL;
 
    if (!txt) txt = it->label;
    if (txt) return strdup(txt);
+
    return NULL;
 }
 
 static char *
-_access_state_cb(void *data, Evas_Object *obj __UNUSED__, Elm_Widget_Item *item __UNUSED__)
+_access_state_cb(void *data,
+                 Evas_Object *obj __UNUSED__,
+                 Elm_Widget_Item *item __UNUSED__)
 {
    Elm_List_Item *it = (Elm_List_Item *)data;
    if (!it) return NULL;
 
    if (it->base.disabled)
-      return strdup(E_("State: Disabled"));
+     return strdup(E_("State: Disabled"));
 
    return NULL;
 }
@@ -1213,19 +1458,25 @@ _access_on_highlight_cb(void *data)
 }
 
 static Elm_List_Item *
-_item_new(Evas_Object *obj, const char *label, Evas_Object *icon, Evas_Object *end, Evas_Smart_Cb func, const void *data)
+_item_new(Evas_Object *obj,
+          const char *label,
+          Evas_Object *icon,
+          Evas_Object *end,
+          Evas_Smart_Cb func,
+          const void *data)
 {
-   Widget_Data *wd = elm_widget_data_get(obj);
    Elm_List_Item *it;
 
-   if (!wd) return NULL;
+   ELM_LIST_DATA_GET(obj, sd);
+
    it = elm_widget_item_new(obj, Elm_List_Item);
-   it->wd = wd;
+   it->sd = sd;
    it->label = eina_stringshare_add(label);
    it->icon = icon;
    it->end = end;
    it->func = func;
    it->base.data = data;
+
    VIEW(it) = edje_object_add(evas_object_evas_get(obj));
 
    // ACCESS
@@ -1239,750 +1490,693 @@ _item_new(Evas_Object *obj, const char *label, Evas_Object *icon, Evas_Object *e
    _elm_access_callback_set(_elm_access_object_get(it->base.access_obj),
                             ELM_ACCESS_STATE,
                             _access_state_cb, it);
-   _elm_access_on_highlight_hook_set(_elm_access_object_get(it->base.access_obj),
-                                     _access_on_highlight_cb, it);
+   _elm_access_on_highlight_hook_set(
+     _elm_access_object_get(it->base.access_obj), _access_on_highlight_cb,
+     it);
 
    edje_object_mirrored_set(VIEW(it), elm_widget_mirrored_get(obj));
-   evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_DOWN,
-                                  _mouse_down, it);
-   evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_UP,
-                                  _mouse_up, it);
-   evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_MOVE,
-                                  _mouse_move, it);
-   evas_object_size_hint_weight_set(VIEW(it), EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+    evas_object_event_callback_add
+      (VIEW(it), EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, it);
+    evas_object_event_callback_add
+      (VIEW(it), EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, it);
+    evas_object_event_callback_add
+      (VIEW(it), EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, it);
+   evas_object_size_hint_weight_set
+     (VIEW(it), EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(VIEW(it), EVAS_HINT_FILL, EVAS_HINT_FILL);
+   edje_object_mirrored_set(VIEW(it), elm_widget_mirrored_get(obj));
+
+   evas_object_event_callback_add
+     (VIEW(it), EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, it);
+   evas_object_event_callback_add
+     (VIEW(it), EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, it);
+   evas_object_event_callback_add
+     (VIEW(it), EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, it);
+
    if (it->icon)
      {
         elm_widget_sub_object_add(obj, it->icon);
-        evas_object_event_callback_add(it->icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
-                                       _changed_size_hints, obj);
+        evas_object_event_callback_add
+          (it->icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _size_hints_changed_cb,
+          obj);
      }
    if (it->end)
      {
         elm_widget_sub_object_add(obj, it->end);
-        evas_object_event_callback_add(it->end, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
-                                       _changed_size_hints, obj);
+        evas_object_event_callback_add
+          (it->end, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _size_hints_changed_cb,
+          obj);
      }
-   elm_widget_item_disable_hook_set(it, _item_disable);
+
+   elm_widget_item_disable_hook_set(it, _item_disable_hook);
    elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
    elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
    elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
    elm_widget_item_text_set_hook_set(it, _item_text_set_hook);
    elm_widget_item_text_get_hook_set(it, _item_text_get_hook);
    elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
+
    return it;
 }
 
 static void
-_elm_list_mode_set_internal(Widget_Data *wd)
+_resize_cb(void *data,
+           Evas *e __UNUSED__,
+           Evas_Object *obj __UNUSED__,
+           void *event_info __UNUSED__)
 {
-   if (!wd->scr)
-     return;
+   elm_layout_sizing_eval(data);
+}
 
-   if (wd->mode == ELM_LIST_LIMIT)
-     {
-        if (!wd->h_mode)
-          {
-             wd->scr_minw = EINA_TRUE;
-             wd->scr_minh = EINA_FALSE;
-          }
-        else
-          {
-             wd->scr_minw = EINA_FALSE;
-             wd->scr_minh = EINA_TRUE;
-          }
-     }
-   else if (wd->mode == ELM_LIST_EXPAND)
-     {
-        wd->scr_minw = EINA_TRUE;
-        wd->scr_minh = EINA_TRUE;
-     }
-   else
+static Eina_Bool
+_elm_list_smart_focus_next(const Evas_Object *obj,
+                           Elm_Focus_Direction dir,
+                           Evas_Object **next)
+{
+   Eina_List *items = NULL;
+   Eina_List *elist = NULL;
+   Elm_List_Item *it;
+
+   ELM_LIST_CHECK(obj) EINA_FALSE;
+   ELM_LIST_DATA_GET(obj, sd);
+
+   if (_elm_config->access_mode != ELM_ACCESS_MODE_ON) return EINA_FALSE;
+
+   EINA_LIST_FOREACH (sd->items, elist, it)
      {
-        wd->scr_minw = EINA_FALSE;
-        wd->scr_minh = EINA_FALSE;
+        items = eina_list_append(items, it->base.access_obj);
+        if (it->icon) items = eina_list_append(items, it->icon);
+        if (it->end) items = eina_list_append(items, it->end);
      }
 
-   _sizing_eval(wd->self);
+   return elm_widget_focus_list_next_get
+            (obj, items, eina_list_data_get, dir, next);
+}
+
+static void
+_elm_list_smart_add(Evas_Object *obj)
+{
+   EVAS_SMART_DATA_ALLOC(obj, Elm_List_Smart_Data);
+
+   ELM_WIDGET_CLASS(_elm_list_parent_sc)->base.add(obj);
+
+   elm_widget_can_focus_set(obj, EINA_TRUE);
+
+   priv->mode = ELM_LIST_SCROLL;
 }
 
 static void
-_fix_items(Evas_Object *obj)
+_elm_list_smart_del(Evas_Object *obj)
 {
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
    const Eina_List *l;
    Elm_List_Item *it;
-   Evas_Coord minw[2] = { 0, 0 }, minh[2] = { 0, 0 };
-   Evas_Coord mw, mh;
-   int i, redo = 0;
-   const char *style = elm_widget_style_get(obj);
-   const char *it_plain = wd->h_mode ? "h_item" : "item";
-   const char *it_odd = wd->h_mode ? "h_item_odd" : "item_odd";
-   const char *it_compress = wd->h_mode ? "h_item_compress" : "item_compress";
-   const char *it_compress_odd = wd->h_mode ? "h_item_compress_odd" : "item_compress_odd";
 
-   if (wd->walking)
-     {
-        wd->fix_pending = EINA_TRUE;
-        return;
-     }
+   ELM_LIST_DATA_GET(obj, sd);
 
-   evas_object_ref(obj);
-   _elm_list_walk(wd); // watch out "return" before unwalk!
+   if (sd->walking)
+     ERR("ERROR: list deleted while walking.\n");
 
-   EINA_LIST_FOREACH(wd->items, l, it)
+   EINA_LIST_FOREACH (sd->items, l, it)
      {
-        if (it->deleted) continue;
         if (it->icon)
-          {
-             evas_object_size_hint_min_get(it->icon, &mw, &mh);
-             if (mw > minw[0]) minw[0] = mw;
-             if (mh > minh[0]) minh[0] = mh;
-          }
+          evas_object_event_callback_del
+            (it->icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+            _size_hints_changed_cb);
         if (it->end)
-          {
-             evas_object_size_hint_min_get(it->end, &mw, &mh);
-             if (mw > minw[1]) minw[1] = mw;
-             if (mh > minh[1]) minh[1] = mh;
-          }
-     }
-
-   if ((minw[0] != wd->minw[0]) || (minw[1] != wd->minw[1]) ||
-       (minh[0] != wd->minh[0]) || (minh[1] != wd->minh[1]))
-     {
-        wd->minw[0] = minw[0];
-        wd->minw[1] = minw[1];
-        wd->minh[0] = minh[0];
-        wd->minh[1] = minh[1];
-        redo = 1;
+          evas_object_event_callback_del
+            (it->end, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+            _size_hints_changed_cb);
      }
 
-   i = 0;
-   EINA_LIST_FOREACH(wd->items, l, it)
-     {
-        if (it->deleted)
-          continue;
-
-        it->even = i & 0x1;
-        if ((it->even != it->is_even) || (!it->fixed) || (redo))
-          {
-             const char *stacking;
-
-             /* FIXME: separators' themes seem to be b0rked */
-             if (it->is_separator)
-               _elm_theme_object_set(obj, VIEW(it), "separator",
-                                     wd->h_mode ? "horizontal" : "vertical",
-                                     style);
-             else if (wd->mode == ELM_LIST_COMPRESS)
-               {
-                  if (it->even)
-                    _elm_theme_object_set(obj, VIEW(it), "list",
-                                          it_compress, style);
-                  else
-                    _elm_theme_object_set(obj, VIEW(it), "list",
-                                          it_compress_odd, style);
-               }
-             else
-               {
-                  if (it->even)
-                    _elm_theme_object_set(obj, VIEW(it), "list", it_plain,
-                                          style);
-                  else
-                    _elm_theme_object_set(obj, VIEW(it), "list", it_odd,
-                                          style);
-               }
-             stacking = edje_object_data_get(VIEW(it), "stacking");
-             if (stacking)
-               {
-                  if (!strcmp(stacking, "below"))
-                    evas_object_lower(VIEW(it));
-                  else if (!strcmp(stacking, "above"))
-                    evas_object_raise(VIEW(it));
-               }
-             edje_object_part_text_escaped_set(VIEW(it), "elm.text", it->label);
-
-             if ((!it->icon) && (minh[0] > 0))
-               {
-                  it->icon = evas_object_rectangle_add(evas_object_evas_get(VIEW(it)));
-                  evas_object_color_set(it->icon, 0, 0, 0, 0);
-                  it->dummy_icon = EINA_TRUE;
-               }
-             if ((!it->end) && (minh[1] > 0))
-               {
-                  it->end = evas_object_rectangle_add(evas_object_evas_get(VIEW(it)));
-                  evas_object_color_set(it->end, 0, 0, 0, 0);
-                  it->dummy_end = EINA_TRUE;
-               }
-             if (it->icon)
-               {
-                  evas_object_size_hint_min_set(it->icon, minw[0], minh[0]);
-                  evas_object_size_hint_max_set(it->icon, 99999, 99999);
-                  edje_object_part_swallow(VIEW(it), "elm.swallow.icon", it->icon);
-               }
-             if (it->end)
-               {
-                  evas_object_size_hint_min_set(it->end, minw[1], minh[1]);
-                  evas_object_size_hint_max_set(it->end, 99999, 99999);
-                  edje_object_part_swallow(VIEW(it), "elm.swallow.end", it->end);
-               }
-             if (!it->fixed)
-               {
-                  // this may call up user and it may modify the list item
-                  // but we're safe as we're flagged as walking.
-                  // just don't process further
-                  edje_object_message_signal_process(VIEW(it));
-                  if (it->deleted)
-                    continue;
-                  mw = mh = -1;
-                  elm_coords_finger_size_adjust(1, &mw, 1, &mh);
-                  edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw, mh);
-                  elm_coords_finger_size_adjust(1, &mw, 1, &mh);
-                  evas_object_size_hint_min_set(VIEW(it), mw, mh);
-                  evas_object_show(VIEW(it));
-               }
-             if ((it->selected) || (it->highlighted))
-               {
-                  const char *selectraise;
-
-                  // this may call up user and it may modify the list item
-                  // but we're safe as we're flagged as walking.
-                  // just don't process further
-                  edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm");
-                  if (it->deleted)
-                    continue;
+   evas_object_event_callback_del
+     (obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+     _size_hints_changed_cb);
+   evas_object_event_callback_del
+     (sd->box, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _size_hints_changed_cb);
 
-                  selectraise = edje_object_data_get(VIEW(it), "selectraise");
-                  if ((selectraise) && (!strcmp(selectraise, "on")))
-                    evas_object_raise(VIEW(it));
-               }
-             if (it->base.disabled)
-               edje_object_signal_emit(VIEW(it), "elm,state,disabled",
-                                       "elm");
+   _elm_list_walk(sd);
 
-             it->fixed = EINA_TRUE;
-             it->is_even = it->even;
-          }
-        i++;
+   EINA_LIST_FREE (sd->items, it)
+     {
+        /* issuing free because of "locking" item del pre hook */
+        _elm_list_item_free(it);
+        elm_widget_item_free(it);
      }
 
-   mw = 0; mh = 0;
-   evas_object_size_hint_min_get(wd->box, &mw, &mh);
+   _elm_list_unwalk(sd);
+
+   if (sd->to_delete)
+     ERR("ERROR: leaking nodes!\n");
 
-   _elm_list_mode_set_internal(wd);
+   eina_list_free(sd->selected);
 
-   _elm_list_unwalk(wd);
-   evas_object_unref(obj);
+   ELM_WIDGET_CLASS(_elm_list_parent_sc)->base.del(obj);
 }
 
 static void
-_hold_on(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+_elm_list_smart_move(Evas_Object *obj,
+                     Evas_Coord x,
+                     Evas_Coord y)
 {
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
-   if (wd->scr)
-     elm_smart_scroller_hold_set(wd->scr, EINA_TRUE);
-}
+   ELM_LIST_DATA_GET(obj, sd);
 
-static void
-_hold_off(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
-{
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
-   if (wd->scr)
-     elm_smart_scroller_hold_set(wd->scr, EINA_FALSE);
-}
+   ELM_WIDGET_CLASS(_elm_list_parent_sc)->base.move(obj, x, y);
 
-static void
-_freeze_on(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
-{
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
-   if (wd->scr)
-     elm_smart_scroller_freeze_set(wd->scr, EINA_TRUE);
+   evas_object_move(sd->hit_rect, x, y);
 }
 
 static void
-_freeze_off(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+_elm_list_smart_resize(Evas_Object *obj,
+                       Evas_Coord w,
+                       Evas_Coord h)
 {
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
-   if (wd->scr)
-     elm_smart_scroller_freeze_set(wd->scr, EINA_FALSE);
+   ELM_LIST_DATA_GET(obj, sd);
+
+   ELM_WIDGET_CLASS(_elm_list_parent_sc)->base.resize(obj, w, h);
+
+   evas_object_resize(sd->hit_rect, w, h);
 }
 
 static void
-_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+_elm_list_smart_member_add(Evas_Object *obj,
+                           Evas_Object *member)
 {
-   _sizing_eval(data);
+   ELM_LIST_DATA_GET(obj, sd);
+
+   ELM_WIDGET_CLASS(_elm_list_parent_sc)->base.member_add(obj, member);
+
+   if (sd->hit_rect)
+     evas_object_raise(sd->hit_rect);
 }
 
-static Eina_Bool
-_focus_next_hook(const Evas_Object *obj,
-                 Elm_Focus_Direction dir,
-                 Evas_Object **next)
+static void
+_elm_list_smart_set_user(Elm_Layout_Smart_Class *sc)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return EINA_FALSE;
+   ELM_WIDGET_CLASS(sc)->base.add = _elm_list_smart_add;
+   ELM_WIDGET_CLASS(sc)->base.del = _elm_list_smart_del;
+   ELM_WIDGET_CLASS(sc)->base.move = _elm_list_smart_move;
+   ELM_WIDGET_CLASS(sc)->base.resize = _elm_list_smart_resize;
+   ELM_WIDGET_CLASS(sc)->base.member_add = _elm_list_smart_member_add;
 
-   Eina_List *items = NULL;
-   Eina_List *elist = NULL;
-   Elm_List_Item *it;
-   EINA_LIST_FOREACH(wd->items, elist, it)
-     {
-        items = eina_list_append(items, it->base.access_obj);
-        if (it->icon) items = eina_list_append(items, it->icon);
-        if (it->end) items = eina_list_append(items, it->end);
-     }
+   ELM_WIDGET_CLASS(sc)->sub_object_del = _elm_list_smart_sub_object_del;
+   ELM_WIDGET_CLASS(sc)->on_focus = _elm_list_smart_on_focus;
+   ELM_WIDGET_CLASS(sc)->focus_next = _elm_list_smart_focus_next;
+   ELM_WIDGET_CLASS(sc)->theme = _elm_list_smart_theme;
+   ELM_WIDGET_CLASS(sc)->disable = _elm_list_smart_disable;
+   ELM_WIDGET_CLASS(sc)->event = _elm_list_smart_event;
+   ELM_WIDGET_CLASS(sc)->translate = _elm_list_smart_translate;
 
-   return elm_widget_focus_list_next_get
-            (obj, items, eina_list_data_get, dir, next);
+   ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_list_smart_sizing_eval;
 }
 
 EAPI Evas_Object *
 elm_list_add(Evas_Object *parent)
 {
-   Evas_Object *obj;
    Evas *e;
-   Widget_Data *wd;
+   Evas_Object *obj;
    Evas_Coord minw, minh;
 
-   ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
 
-   ELM_SET_WIDTYPE(widtype, "list");
-   elm_widget_type_set(obj, "list");
-   elm_widget_sub_object_add(parent, obj);
-   elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
+   e = evas_object_evas_get(parent);
+   if (!e) return NULL;
 
-   // TODO: dynamic setting should be exist.
-   if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
-     elm_widget_focus_next_hook_set(obj, _focus_next_hook);
+   obj = evas_object_smart_add(e, _elm_list_smart_class_new());
 
-   elm_widget_data_set(obj, wd);
-   elm_widget_del_pre_hook_set(obj, _del_pre_hook);
-   elm_widget_del_hook_set(obj, _del_hook);
-   elm_widget_theme_hook_set(obj, _theme_hook);
-   elm_widget_disable_hook_set(obj, _disable_hook);
-   elm_widget_can_focus_set(obj, EINA_TRUE);
-   elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);
-   elm_widget_signal_callback_add_hook_set(obj, _signal_callback_add_hook);
-   elm_widget_signal_callback_del_hook_set(obj, _signal_callback_del_hook);
-   elm_widget_event_hook_set(obj, _event_hook);
-   elm_widget_translate_hook_set(obj, _translate_hook);
-
-   wd->self = obj;
-   wd->scr = elm_smart_scroller_add(e);
-   elm_smart_scroller_widget_set(wd->scr, obj);
-   elm_widget_resize_object_set(obj, wd->scr);
-   evas_object_event_callback_add(wd->scr, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
-                                  _changed_size_hints, obj);
-   edje_object_size_min_calc(elm_smart_scroller_edje_object_get(wd->scr), &minw, &minh);
-   evas_object_size_hint_min_set(obj, minw, minh);
-   evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize, obj);
+   if (!elm_widget_sub_object_add(parent, obj))
+     ERR("could not add %p as sub object of %p", obj, parent);
 
-   elm_smart_scroller_bounce_allow_set(wd->scr, EINA_FALSE,
-                                       _elm_config->thumbscroll_bounce_enable);
+   ELM_LIST_DATA_GET(obj, sd);
 
-   wd->box = elm_box_add(parent);
-   elm_box_homogeneous_set(wd->box, 1);
-   evas_object_size_hint_weight_set(wd->box, EVAS_HINT_EXPAND, 0.0);
-   evas_object_size_hint_align_set(wd->box, EVAS_HINT_FILL, 0.0);
-   elm_widget_on_show_region_hook_set(wd->box, _show_region_hook, obj);
-   elm_widget_sub_object_add(obj, wd->box);
-   elm_smart_scroller_child_set(wd->scr, wd->box);
-   evas_object_event_callback_add(wd->box, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
-                                  _changed_size_hints, obj);
+   elm_widget_theme_object_set
+     (obj, ELM_WIDGET_DATA(sd)->resize_obj, "list", "base",
+     elm_widget_style_get(obj));
 
-   evas_object_show(wd->box);
+   sd->hit_rect = evas_object_rectangle_add(evas_object_evas_get(obj));
+   evas_object_smart_member_add(sd->hit_rect, obj);
+   elm_widget_sub_object_add(obj, sd->hit_rect);
 
-   _theme_hook(obj);
+   /* common scroller hit rectangle setup -- it has to take place
+    * AFTER smart_member_add() */
+   evas_object_color_set(sd->hit_rect, 0, 0, 0, 0);
+   evas_object_show(sd->hit_rect);
+   evas_object_repeat_events_set(sd->hit_rect, EINA_TRUE);
 
-   wd->mode = ELM_LIST_SCROLL;
+   /* interface's add() routive issued AFTER the object's smart_add() */
+   sd->s_iface = evas_object_smart_interface_get
+       (obj, ELM_SCROLLABLE_IFACE_NAME);
 
-   evas_object_smart_callback_add(wd->scr, "edge,left", _edge_left, obj);
-   evas_object_smart_callback_add(wd->scr, "edge,right", _edge_right, obj);
-   evas_object_smart_callback_add(wd->scr, "edge,top", _edge_top, obj);
-   evas_object_smart_callback_add(wd->scr, "edge,bottom", _edge_bottom, obj);
+   sd->s_iface->edge_left_cb_set(obj, _edge_left_cb);
+   sd->s_iface->edge_right_cb_set(obj, _edge_right_cb);
+   sd->s_iface->edge_top_cb_set(obj, _edge_top_cb);
+   sd->s_iface->edge_bottom_cb_set(obj, _edge_bottom_cb);
 
-   evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
-   evas_object_smart_callback_add(obj, "scroll-hold-on", _hold_on, obj);
-   evas_object_smart_callback_add(obj, "scroll-hold-off", _hold_off, obj);
-   evas_object_smart_callback_add(obj, "scroll-freeze-on", _freeze_on, obj);
-   evas_object_smart_callback_add(obj, "scroll-freeze-off", _freeze_off, obj);
+   sd->s_iface->content_min_limit_cb_set(obj, _elm_list_content_min_limit_cb);
 
-   evas_object_smart_callbacks_descriptions_set(obj, _signals);
+   sd->s_iface->objects_set
+     (obj, ELM_WIDGET_DATA(sd)->resize_obj, sd->hit_rect);
+
+   /* the scrollable interface may set this */
+   evas_object_event_callback_add
+     (ELM_WIDGET_DATA(sd)->resize_obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+     _size_hints_changed_cb, obj);
+
+   edje_object_size_min_calc
+     (ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh);
+   evas_object_size_hint_min_set(obj, minw, minh);
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize_cb, obj);
+
+   sd->s_iface->bounce_allow_set
+     (obj, EINA_FALSE, _elm_config->thumbscroll_bounce_enable);
+
+   sd->box = elm_box_add(obj);
+   elm_box_homogeneous_set(sd->box, EINA_TRUE);
+   evas_object_size_hint_weight_set(sd->box, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(sd->box, EVAS_HINT_FILL, 0.0);
+
+   /* FIXME: change this ugly code path later */
+   elm_widget_on_show_region_hook_set(sd->box, _show_region_hook, obj);
+   elm_widget_sub_object_add(obj, sd->box);
+
+   sd->s_iface->content_set(obj, sd->box);
+   evas_object_event_callback_add
+     (sd->box, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _size_hints_changed_cb, obj);
+
+   _elm_list_smart_theme(obj);
 
-   _mirrored_set(obj, elm_widget_mirrored_get(obj));
-   _sizing_eval(obj);
    return obj;
 }
 
 EAPI void
 elm_list_go(Evas_Object *obj)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype);
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
-   _fix_items(obj);
+   ELM_LIST_CHECK(obj);
+
+   _items_fix(obj);
 }
 
 EAPI void
-elm_list_multi_select_set(Evas_Object *obj, Eina_Bool multi)
+elm_list_multi_select_set(Evas_Object *obj,
+                          Eina_Bool multi)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype);
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
-   wd->multi = multi;
+   ELM_LIST_CHECK(obj);
+   ELM_LIST_DATA_GET(obj, sd);
+
+   sd->multi = multi;
 }
 
 EAPI Eina_Bool
 elm_list_multi_select_get(const Evas_Object *obj)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return EINA_FALSE;
-   return wd->multi;
+   ELM_LIST_CHECK(obj) EINA_FALSE;
+   ELM_LIST_DATA_GET(obj, sd);
+
+   return sd->multi;
 }
 
 EAPI void
-elm_list_mode_set(Evas_Object *obj, Elm_List_Mode mode)
+elm_list_mode_set(Evas_Object *obj,
+                  Elm_List_Mode mode)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype);
+   ELM_LIST_CHECK(obj);
+   ELM_LIST_DATA_GET(obj, sd);
 
-   Widget_Data *wd;
-
-   wd = elm_widget_data_get(obj);
-   if (!wd)
-     return;
-   if (wd->mode == mode)
+   if (sd->mode == mode)
      return;
-   wd->mode = mode;
 
-   _elm_list_mode_set_internal(wd);
+   sd->mode = mode;
+
+   _elm_list_mode_set_internal(sd);
 }
 
 EAPI Elm_List_Mode
 elm_list_mode_get(const Evas_Object *obj)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype) ELM_LIST_LAST;
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return ELM_LIST_LAST;
-   return wd->mode;
+   ELM_LIST_CHECK(obj) ELM_LIST_LAST;
+   ELM_LIST_DATA_GET(obj, sd);
+
+   return sd->mode;
 }
 
 EAPI void
-elm_list_horizontal_set(Evas_Object *obj, Eina_Bool horizontal)
+elm_list_horizontal_set(Evas_Object *obj,
+                        Eina_Bool horizontal)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype);
-
-   Widget_Data *wd;
    Eina_Bool bounce = _elm_config->thumbscroll_bounce_enable;
 
-   wd = elm_widget_data_get(obj);
-   if (!wd)
-     return;
+   ELM_LIST_CHECK(obj);
+   ELM_LIST_DATA_GET(obj, sd);
 
-   if (wd->h_mode == horizontal)
+   horizontal = !!horizontal;
+
+   if (sd->h_mode == horizontal)
      return;
 
-   wd->h_mode = horizontal;
-   elm_box_horizontal_set(wd->box, horizontal);
+   sd->h_mode = horizontal;
+   elm_box_horizontal_set(sd->box, horizontal);
 
    if (horizontal)
      {
-        evas_object_size_hint_weight_set(wd->box, 0.0, EVAS_HINT_EXPAND);
-        evas_object_size_hint_align_set(wd->box, 0.0, EVAS_HINT_FILL);
-        elm_smart_scroller_bounce_allow_set(wd->scr, bounce, EINA_FALSE);
+        evas_object_size_hint_weight_set(sd->box, 0.0, EVAS_HINT_EXPAND);
+        evas_object_size_hint_align_set(sd->box, 0.0, EVAS_HINT_FILL);
+        sd->s_iface->bounce_allow_set(obj, bounce, EINA_FALSE);
      }
    else
      {
-        evas_object_size_hint_weight_set(wd->box, EVAS_HINT_EXPAND, 0.0);
-        evas_object_size_hint_align_set(wd->box, EVAS_HINT_FILL, 0.0);
-        elm_smart_scroller_bounce_allow_set(wd->scr, EINA_FALSE, bounce);
+        evas_object_size_hint_weight_set(sd->box, EVAS_HINT_EXPAND, 0.0);
+        evas_object_size_hint_align_set(sd->box, EVAS_HINT_FILL, 0.0);
+        sd->s_iface->bounce_allow_set(obj, EINA_FALSE, bounce);
      }
 
-   _elm_list_mode_set_internal(wd);
+   _elm_list_mode_set_internal(sd);
 }
 
 EAPI Eina_Bool
 elm_list_horizontal_get(const Evas_Object *obj)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
-
-   Widget_Data *wd;
+   ELM_LIST_CHECK(obj) EINA_FALSE;
+   ELM_LIST_DATA_GET(obj, sd);
 
-   wd = elm_widget_data_get(obj);
-   if (!wd)
-     return EINA_FALSE;
-
-   return wd->h_mode;
+   return sd->h_mode;
 }
 
 EAPI void
-elm_list_select_mode_set(Evas_Object *obj, Elm_Object_Select_Mode mode)
+elm_list_select_mode_set(Evas_Object *obj,
+                         Elm_Object_Select_Mode mode)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype);
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
+   ELM_LIST_CHECK(obj);
+   ELM_LIST_DATA_GET(obj, sd);
+
    if (mode >= ELM_OBJECT_SELECT_MODE_MAX)
      return;
-   if (wd->select_mode != mode)
-     wd->select_mode = mode;
+
+   if (sd->select_mode != mode)
+     sd->select_mode = mode;
 }
 
 EAPI Elm_Object_Select_Mode
 elm_list_select_mode_get(const Evas_Object *obj)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype) ELM_OBJECT_SELECT_MODE_MAX;
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return ELM_OBJECT_SELECT_MODE_MAX;
-   return wd->select_mode;
+   ELM_LIST_CHECK(obj) ELM_OBJECT_SELECT_MODE_MAX;
+   ELM_LIST_DATA_GET(obj, sd);
+
+   return sd->select_mode;
 }
 
 EAPI void
-elm_list_bounce_set(Evas_Object *obj, Eina_Bool h_bounce, Eina_Bool v_bounce)
+elm_list_bounce_set(Evas_Object *obj,
+                    Eina_Bool h_bounce,
+                    Eina_Bool v_bounce)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype);
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
-   if (wd->scr)
-     elm_smart_scroller_bounce_allow_set(wd->scr, h_bounce, v_bounce);
+   ELM_LIST_CHECK(obj);
+   ELM_LIST_DATA_GET(obj, sd);
+
+   sd->s_iface->bounce_allow_set(obj, h_bounce, v_bounce);
 }
 
 EAPI void
-elm_list_bounce_get(const Evas_Object *obj, Eina_Bool *h_bounce, Eina_Bool *v_bounce)
+elm_list_bounce_get(const Evas_Object *obj,
+                    Eina_Bool *h_bounce,
+                    Eina_Bool *v_bounce)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype);
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
-   elm_smart_scroller_bounce_allow_get(wd->scr, h_bounce, v_bounce);
+   ELM_LIST_CHECK(obj);
+   ELM_LIST_DATA_GET(obj, sd);
+
+   sd->s_iface->bounce_allow_get(obj, h_bounce, v_bounce);
 }
 
 EAPI void
-elm_list_scroller_policy_set(Evas_Object *obj, Elm_Scroller_Policy policy_h, Elm_Scroller_Policy policy_v)
+elm_list_scroller_policy_set(Evas_Object *obj,
+                             Elm_Scroller_Policy policy_h,
+                             Elm_Scroller_Policy policy_v)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype);
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if ((!wd) || (!wd->scr)) return;
+   ELM_LIST_CHECK(obj);
+   ELM_LIST_DATA_GET(obj, sd);
+
    if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
        (policy_v >= ELM_SCROLLER_POLICY_LAST))
      return;
-   elm_smart_scroller_policy_set(wd->scr, policy_h, policy_v);
+
+   sd->s_iface->policy_set(obj, policy_h, policy_v);
 }
 
 EAPI void
-elm_list_scroller_policy_get(const Evas_Object *obj, Elm_Scroller_Policy *policy_h, Elm_Scroller_Policy *policy_v)
+elm_list_scroller_policy_get(const Evas_Object *obj,
+                             Elm_Scroller_Policy *policy_h,
+                             Elm_Scroller_Policy *policy_v)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype);
-   Widget_Data *wd = elm_widget_data_get(obj);
-   Elm_Smart_Scroller_Policy s_policy_h, s_policy_v;
-   if ((!wd) || (!wd->scr)) return;
-   elm_smart_scroller_policy_get(wd->scr, &s_policy_h, &s_policy_v);
-   if (policy_h) *policy_h = (Elm_Scroller_Policy) s_policy_h;
-   if (policy_v) *policy_v = (Elm_Scroller_Policy) s_policy_v;
+   ELM_LIST_CHECK(obj);
+   ELM_LIST_DATA_GET(obj, sd);
+
+   sd->s_iface->policy_get(obj, policy_h, policy_v);
 }
 
 EAPI void
 elm_list_clear(Evas_Object *obj)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype);
-   Widget_Data *wd = elm_widget_data_get(obj);
    Elm_List_Item *it;
 
-   if (!wd) return;
-   if (!wd->items) return;
+   ELM_LIST_CHECK(obj);
+   ELM_LIST_DATA_GET(obj, sd);
 
-   eina_list_free(wd->selected);
-   wd->selected = NULL;
+   if (!sd->items) return;
 
-   if (wd->walking > 0)
+   eina_list_free(sd->selected);
+   sd->selected = NULL;
+
+   if (sd->walking > 0)
      {
         Eina_List *n;
 
-        EINA_LIST_FOREACH(wd->items, n, it)
+        EINA_LIST_FOREACH (sd->items, n, it)
           {
              if (it->deleted) continue;
              it->deleted = EINA_TRUE;
-             wd->to_delete = eina_list_append(wd->to_delete, it);
+             sd->to_delete = eina_list_append(sd->to_delete, it);
           }
         return;
      }
 
    evas_object_ref(obj);
-   _elm_list_walk(wd);
 
-   EINA_LIST_FREE(wd->items, it)
+   _elm_list_walk(sd);
+
+   EINA_LIST_FREE (sd->items, it)
      {
+        /* issuing free because of "locking" item del pre hook */
         _elm_list_item_free(it);
         elm_widget_item_free(it);
      }
 
-   _elm_list_unwalk(wd);
+   _elm_list_unwalk(sd);
+
+   _items_fix(obj);
+   elm_layout_sizing_eval(obj);
 
-   _fix_items(obj);
-   _sizing_eval(obj);
    evas_object_unref(obj);
 }
 
 EAPI const Eina_List *
 elm_list_items_get(const Evas_Object *obj)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return NULL;
-   return wd->items;
+   ELM_LIST_CHECK(obj) NULL;
+   ELM_LIST_DATA_GET(obj, sd);
+
+   return sd->items;
 }
 
 EAPI Elm_Object_Item *
 elm_list_selected_item_get(const Evas_Object *obj)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return NULL;
-   if (wd->selected) return (Elm_Object_Item *) wd->selected->data;
+   ELM_LIST_CHECK(obj) NULL;
+   ELM_LIST_DATA_GET(obj, sd);
+
+   if (sd->selected) return (Elm_Object_Item *)sd->selected->data;
+
    return NULL;
 }
 
 EAPI const Eina_List *
 elm_list_selected_items_get(const Evas_Object *obj)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return NULL;
-   return wd->selected;
+   ELM_LIST_CHECK(obj) NULL;
+   ELM_LIST_DATA_GET(obj, sd);
+
+   return sd->selected;
 }
 
 EAPI Elm_Object_Item *
-elm_list_item_append(Evas_Object *obj, const char *label, Evas_Object *icon, Evas_Object *end, Evas_Smart_Cb func, const void *data)
+elm_list_item_append(Evas_Object *obj,
+                     const char *label,
+                     Evas_Object *icon,
+                     Evas_Object *end,
+                     Evas_Smart_Cb func,
+                     const void *data)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
-   Widget_Data *wd = elm_widget_data_get(obj);
-   Elm_List_Item *it = _item_new(obj, label, icon, end, func, data);
+   Elm_List_Item *it;
+
+   ELM_LIST_CHECK(obj) NULL;
+   ELM_LIST_DATA_GET(obj, sd);
+
+   it = _item_new(obj, label, icon, end, func, data);
+
+   sd->items = eina_list_append(sd->items, it);
+   it->node = eina_list_last(sd->items);
+   elm_box_pack_end(sd->box, VIEW(it));
 
-   wd->items = eina_list_append(wd->items, it);
-   it->node = eina_list_last(wd->items);
-   elm_box_pack_end(wd->box, VIEW(it));
    return (Elm_Object_Item *)it;
 }
 
 EAPI Elm_Object_Item *
-elm_list_item_prepend(Evas_Object *obj, const char *label, Evas_Object *icon, Evas_Object *end, Evas_Smart_Cb func, const void *data)
+elm_list_item_prepend(Evas_Object *obj,
+                      const char *label,
+                      Evas_Object *icon,
+                      Evas_Object *end,
+                      Evas_Smart_Cb func,
+                      const void *data)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
-   Widget_Data *wd = elm_widget_data_get(obj);
-   Elm_List_Item *it = _item_new(obj, label, icon, end, func, data);
+   Elm_List_Item *it;
+
+   ELM_LIST_CHECK(obj) NULL;
+   ELM_LIST_DATA_GET(obj, sd);
+
+   it = _item_new(obj, label, icon, end, func, data);
+
+   sd->items = eina_list_prepend(sd->items, it);
+   it->node = sd->items;
+   elm_box_pack_start(sd->box, VIEW(it));
 
-   wd->items = eina_list_prepend(wd->items, it);
-   it->node = wd->items;
-   elm_box_pack_start(wd->box, VIEW(it));
    return (Elm_Object_Item *)it;
 }
 
 EAPI Elm_Object_Item *
-elm_list_item_insert_before(Evas_Object *obj, Elm_Object_Item *before, const char *label, Evas_Object *icon, Evas_Object *end, Evas_Smart_Cb func, const void *data)
+elm_list_item_insert_before(Evas_Object *obj,
+                            Elm_Object_Item *before,
+                            const char *label,
+                            Evas_Object *icon,
+                            Evas_Object *end,
+                            Evas_Smart_Cb func,
+                            const void *data)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(before, NULL);
-
-   Widget_Data *wd;
    Elm_List_Item *it, *before_it;
 
-   wd = elm_widget_data_get(obj);
-   if (!wd) return NULL;
+   ELM_LIST_CHECK(obj) NULL;
+   ELM_LIST_ITEM_CHECK_OR_RETURN(before, NULL);
+   ELM_LIST_DATA_GET(obj, sd);
 
-   before_it = (Elm_List_Item *) before;
+   before_it = (Elm_List_Item *)before;
    if (!before_it->node) return NULL;
 
    it = _item_new(obj, label, icon, end, func, data);
-   wd->items = eina_list_prepend_relative_list(wd->items, it, before_it->node);
+   sd->items = eina_list_prepend_relative_list(sd->items, it, before_it->node);
    it->node = before_it->node->prev;
-   elm_box_pack_before(wd->box, VIEW(it), VIEW(before_it));
+   elm_box_pack_before(sd->box, VIEW(it), VIEW(before_it));
+
    return (Elm_Object_Item *)it;
 }
 
 EAPI Elm_Object_Item *
-elm_list_item_insert_after(Evas_Object *obj, Elm_Object_Item *after, const char *label, Evas_Object *icon, Evas_Object *end, Evas_Smart_Cb func, const void *data)
+elm_list_item_insert_after(Evas_Object *obj,
+                           Elm_Object_Item *after,
+                           const char *label,
+                           Evas_Object *icon,
+                           Evas_Object *end,
+                           Evas_Smart_Cb func,
+                           const void *data)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(after, NULL);
-
-   Widget_Data *wd;
    Elm_List_Item *it, *after_it;
 
-   wd = elm_widget_data_get(obj);
-   if (!wd) return NULL;
+   ELM_LIST_CHECK(obj) NULL;
+   ELM_LIST_ITEM_CHECK_OR_RETURN(after, NULL);
+   ELM_LIST_DATA_GET(obj, sd);
 
-   after_it = (Elm_List_Item *) after;
+   after_it = (Elm_List_Item *)after;
    if (!after_it->node) return NULL;
 
    it = _item_new(obj, label, icon, end, func, data);
-   wd->items = eina_list_append_relative_list(wd->items, it, after_it->node);
+   sd->items = eina_list_append_relative_list(sd->items, it, after_it->node);
    it->node = after_it->node->next;
-   elm_box_pack_after(wd->box, VIEW(it), VIEW(after_it));
+   elm_box_pack_after(sd->box, VIEW(it), VIEW(after_it));
+
    return (Elm_Object_Item *)it;
 }
 
 EAPI Elm_Object_Item *
-elm_list_item_sorted_insert(Evas_Object *obj, const char *label, Evas_Object *icon, Evas_Object *end, Evas_Smart_Cb func, const void *data, Eina_Compare_Cb cmp_func)
+elm_list_item_sorted_insert(Evas_Object *obj,
+                            const char *label,
+                            Evas_Object *icon,
+                            Evas_Object *end,
+                            Evas_Smart_Cb func,
+                            const void *data,
+                            Eina_Compare_Cb cmp_func)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
-   Widget_Data *wd = elm_widget_data_get(obj);
-   Elm_List_Item *it = _item_new(obj, label, icon, end, func, data);
    Eina_List *l;
+   Elm_List_Item *it;
 
-   wd->items = eina_list_sorted_insert(wd->items, cmp_func, it);
-   l = eina_list_data_find_list(wd->items, it);
+   ELM_LIST_CHECK(obj) NULL;
+   ELM_LIST_DATA_GET(obj, sd);
+
+   it = _item_new(obj, label, icon, end, func, data);
+
+   sd->items = eina_list_sorted_insert(sd->items, cmp_func, it);
+   l = eina_list_data_find_list(sd->items, it);
    l = eina_list_next(l);
    if (!l)
      {
-        it->node = eina_list_last(wd->items);
-        elm_box_pack_end(wd->box, VIEW(it));
+        it->node = eina_list_last(sd->items);
+        elm_box_pack_end(sd->box, VIEW(it));
      }
    else
      {
         Elm_List_Item *before = eina_list_data_get(l);
+
         it->node = before->node->prev;
-        elm_box_pack_before(wd->box, VIEW(it), VIEW(before));
+        elm_box_pack_before(sd->box, VIEW(it), VIEW(before));
      }
+
    return (Elm_Object_Item *)it;
 }
 
 EAPI void
-elm_list_item_separator_set(Elm_Object_Item *it, Eina_Bool setting)
+elm_list_item_separator_set(Elm_Object_Item *it,
+                            Eina_Bool setting)
 {
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
+   ELM_LIST_ITEM_CHECK_OR_RETURN(it);
+
    ((Elm_List_Item *)it)->is_separator = !!setting;
 }
 
 EAPI Eina_Bool
 elm_list_item_separator_get(const Elm_Object_Item *it)
 {
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(it, EINA_FALSE);
+   ELM_LIST_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
+
    return ((Elm_List_Item *)it)->is_separator;
 }
 
 EAPI void
-elm_list_item_selected_set(Elm_Object_Item *it, Eina_Bool selected)
+elm_list_item_selected_set(Elm_Object_Item *it,
+                           Eina_Bool selected)
 {
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
-   Evas_Object *obj = WIDGET(it);
-   Widget_Data *wd = elm_widget_data_get(obj);
    Elm_List_Item *item = (Elm_List_Item *)it;
-   if (!wd) return;
+   Evas_Object *obj;
+
+   ELM_LIST_ITEM_CHECK_OR_RETURN(it);
+   obj = WIDGET(it);
+   ELM_LIST_DATA_GET(obj, sd);
 
    selected = !!selected;
    if (item->selected == selected) return;
 
    evas_object_ref(obj);
-   _elm_list_walk(wd);
+   _elm_list_walk(sd);
 
    if (selected)
      {
-        if (!wd->multi)
+        if (!sd->multi)
           {
-             while (wd->selected)
-               _item_unselect(wd->selected->data);
+             while (sd->selected)
+               _item_unselect(sd->selected->data);
           }
         _item_highlight(item);
         _item_select(item);
@@ -1990,63 +2184,69 @@ elm_list_item_selected_set(Elm_Object_Item *it, Eina_Bool selected)
    else
      _item_unselect(item);
 
-   _elm_list_unwalk(wd);
+   _elm_list_unwalk(sd);
    evas_object_unref(obj);
 }
 
 EAPI Eina_Bool
 elm_list_item_selected_get(const Elm_Object_Item *it)
 {
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(it, EINA_FALSE);
+   ELM_LIST_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
+
    return ((Elm_List_Item *)it)->selected;
 }
 
 EAPI void
 elm_list_item_show(Elm_Object_Item *it)
 {
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
-   Widget_Data *wd = elm_widget_data_get(WIDGET(it));
-   if (!wd) return;
    Evas_Coord bx, by, bw, bh;
    Evas_Coord x, y, w, h;
 
-   evas_smart_objects_calculate(evas_object_evas_get(wd->box));
-   evas_object_geometry_get(wd->box, &bx, &by, &bw, &bh);
+   ELM_LIST_ITEM_CHECK_OR_RETURN(it);
+   ELM_LIST_DATA_GET(WIDGET(it), sd);
+
+   evas_smart_objects_calculate(evas_object_evas_get(sd->box));
+   evas_object_geometry_get(sd->box, &bx, &by, &bw, &bh);
    evas_object_geometry_get(VIEW(it), &x, &y, &w, &h);
    x -= bx;
    y -= by;
-   if (wd->scr) elm_smart_scroller_child_region_show(wd->scr, x, y, w, h);
+
+   sd->s_iface->content_region_show(WIDGET(it), x, y, w, h);
 }
 
 EAPI void
 elm_list_item_bring_in(Elm_Object_Item *it)
 {
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(it);
-   Widget_Data *wd = elm_widget_data_get(WIDGET(it));
-   if (!wd) return;
    Evas_Coord bx, by, bw, bh;
    Evas_Coord x, y, w, h;
 
-   evas_smart_objects_calculate(evas_object_evas_get(wd->box));
-   evas_object_geometry_get(wd->box, &bx, &by, &bw, &bh);
+   ELM_LIST_ITEM_CHECK_OR_RETURN(it);
+   ELM_LIST_DATA_GET(WIDGET(it), sd);
+
+   evas_smart_objects_calculate(evas_object_evas_get(sd->box));
+   evas_object_geometry_get(sd->box, &bx, &by, &bw, &bh);
    evas_object_geometry_get(VIEW(it), &x, &y, &w, &h);
    x -= bx;
    y -= by;
-   if (wd->scr) elm_smart_scroller_region_bring_in(wd->scr, x, y, w, h);
+
+   sd->s_iface->region_bring_in(WIDGET(it), x, y, w, h);
 }
 
 EAPI Evas_Object *
 elm_list_item_object_get(const Elm_Object_Item *it)
 {
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(it, NULL);
+   ELM_LIST_ITEM_CHECK_OR_RETURN(it, NULL);
+
    return VIEW(it);
 }
 
 EAPI Elm_Object_Item *
 elm_list_item_prev(const Elm_Object_Item *it)
 {
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(it, NULL);
    Elm_List_Item *item = (Elm_List_Item *)it;
+
+   ELM_LIST_ITEM_CHECK_OR_RETURN(it, NULL);
+
    if (item->node->prev) return item->node->prev->data;
    else return NULL;
 }
@@ -2054,8 +2254,10 @@ elm_list_item_prev(const Elm_Object_Item *it)
 EAPI Elm_Object_Item *
 elm_list_item_next(const Elm_Object_Item *it)
 {
-   ELM_LIST_ITEM_CHECK_DELETED_RETURN(it, NULL);
    Elm_List_Item *item = (Elm_List_Item *)it;
+
+   ELM_LIST_ITEM_CHECK_OR_RETURN(it, NULL);
+
    if (item->node->next) return item->node->next->data;
    else return NULL;
 }
@@ -2063,19 +2265,21 @@ elm_list_item_next(const Elm_Object_Item *it)
 EAPI Elm_Object_Item *
 elm_list_first_item_get(const Evas_Object *obj)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return NULL;
-   if (!wd->items) return NULL;
-   return eina_list_data_get(wd->items);
+   ELM_LIST_CHECK(obj) NULL;
+   ELM_LIST_DATA_GET(obj, sd);
+
+   if (!sd->items) return NULL;
+
+   return eina_list_data_get(sd->items);
 }
 
 EAPI Elm_Object_Item *
 elm_list_last_item_get(const Evas_Object *obj)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
-   Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return NULL;
-   if (!wd->items) return NULL;
-   return eina_list_data_get(eina_list_last(wd->items));
+   ELM_LIST_CHECK(obj) NULL;
+   ELM_LIST_DATA_GET(obj, sd);
+
+   if (!sd->items) return NULL;
+
+   return eina_list_data_get(eina_list_last(sd->items));
 }
index cbb5e8a..c266861 100644 (file)
@@ -2,46 +2,53 @@
  * @defgroup List List
  * @ingroup Elementary
  *
+ * @image html list_inheritance_tree.png
+ * @image latex list_inheritance_tree.eps
+ *
  * @image html img/widget/list/preview-00.png
  * @image latex img/widget/list/preview-00.eps width=\textwidth
  *
  * @image html img/list.png
  * @image latex img/list.eps width=\textwidth
  *
- * A list widget is a container whose children are displayed vertically or
- * horizontally, in order, and can be selected.
- * The list can accept only one or multiple items selection. Also has many
+ * A list widget is a container whose children are displayed
+ * vertically or horizontally, in order, and can be selected. The list
+ * can accept only one or multiple item selections. Also has many
  * modes of items displaying.
  *
- * A list is a very simple type of list widget.  For more robust
- * lists, @ref Genlist should probably be used.
+ * A list is a very simple type of list widget. For more robust lists,
+ * @ref Genlist should probably be used.
+ *
+ * This widget inherits from the @ref Layout one, so that all the
+ * functions acting on it also work for list objects.
  *
- * Smart callbacks one can listen to:
+ * This widget emits the following signals, besides the ones sent from
+ * @ref Layout:
  * - @c "activated" - The user has double-clicked or pressed
  *   (enter|return|spacebar) on an item. The @c event_info parameter
  *   is the item that was activated.
  * - @c "clicked,double" - The user has double-clicked an item.
  *   The @c event_info parameter is the item that was double-clicked.
- * - "selected" - when the user selected an item
- * - "unselected" - when the user unselected an item
- * - "longpressed" - an item in the list is long-pressed
- * - "edge,top" - the list is scrolled until the top edge
- * - "edge,bottom" - the list is scrolled until the bottom edge
- * - "edge,left" - the list is scrolled until the left edge
- * - "edge,right" - the list is scrolled until the right edge
- * - "language,changed" - the program's language changed
- *
- * Available styles for it:
+ * - @c "selected" - when the user selected an item
+ * - @c "unselected" - when the user unselected an item
+ * - @c "longpressed" - an item in the list is long-pressed
+ * - @c "edge,top" - the list is scrolled until the top edge
+ * - @c "edge,bottom" - the list is scrolled until the bottom edge
+ * - @c "edge,left" - the list is scrolled until the left edge
+ * - @c "edge,right" - the list is scrolled until the right edge
+ * - @c "language,changed" - the program's language changed
+ *
+ * Available styles for it are:
  * - @c "default"
  *
- * Default content parts of the list items that you can use for are:
- * @li "start" - A start position object in the list item
- * @li "end" - A end position object in the list item
+ * Default content parts of the list items that you can use are:
+ * @li @c "start" - A start position object in the list item
+ * @li @c "end" - An end position object in the list item
  *
- * Default text parts of the list items that you can use for are:
- * @li "default" - label in the list item
+ * Default text parts of the list items that you can use are:
+ * @li @c "default" - label in the list item
  *
- * Supported elm_object_item common APIs.
+ * Supported @c elm_object_item common APIs.
  * @li @ref elm_object_item_disabled_set
  * @li @ref elm_object_item_disabled_get
  * @li @ref elm_object_item_part_text_set
  * @li @ref elm_object_item_part_content_get
  * @li @ref elm_object_item_part_content_unset
  *
+ * This widget implements the @b @ref elm-scrollable-interface
+ * interface, so that all (non-deprecated) functions for the base @ref
+ * Scroller widget also work for lists.
+ *
+ * Some calls on the list's API are marked as @b deprecated, as they
+ * just wrap the scrollable widgets counterpart functions. Use the
+ * ones we point you to, for each case of deprecation here, instead --
+ * eventually the deprecated ones will be discarded (next major
+ * release).
+ *
  * List of examples:
  * @li @ref list_example_01
  * @li @ref list_example_02
  * @enum Elm_List_Mode
  * @typedef Elm_List_Mode
  *
- * Set list's resize behavior, transverse axis scroll and
- * items cropping. See each mode's description for more details.
+ * Set list's resizing behavior, transverse axis scrolling and items
+ * cropping. See each mode's description for more details.
  *
  * @note Default value is #ELM_LIST_SCROLL.
  *
- * Values <b> don't </b> work as bitmask, only one can be chosen.
+ * Values here @b don't work as bitmasks -- only one can be chosen at
+ * a time.
  *
  * @see elm_list_mode_set()
  * @see elm_list_mode_get()
  */
 typedef enum
 {
-   ELM_LIST_COMPRESS = 0, /**< Won't set any of its size hints to inform how a possible container should resize it. Then, if it's not created as a "resize object", it might end with zero dimensions. The list will respect the container's geometry and, if any of its items won't fit into its transverse axis, one won't be able to scroll it in that direction. */
-   ELM_LIST_SCROLL, /**< Default value. Won't set any of its size hints to inform how a possible container should resize it. Then, if it's not created as a "resize object", it might end with zero dimensions. The list will respect the container's geometry and, if any of its items won't fit into its transverse axis, one will be able to scroll it in that direction (large items will get cropped). */
-   ELM_LIST_LIMIT, /**< Set a minimum size hint on the list object, so that containers may respect it (and resize itself to fit the child properly). More specifically, a minimum size hint will be set for its transverse axis, so that the @b largest item in that direction fits well. Can have effects bounded by setting the list object's maximum size hints. */
-   ELM_LIST_EXPAND, /**< Besides setting a minimum size on the transverse axis, just like the previous mode, will set a minimum size on the longitudinal axis too, trying to reserve space to all its children to be visible at a time. Can have effects bounded by setting the list object's maximum size hints. */
+   ELM_LIST_COMPRESS = 0, /**< The list @b won't set any of its size hints to inform how a possible container should resize it. Then, if it's not created as a "resize object", it might end with zeroed dimensions. The list will respect the container's geometry and, if any of its items won't fit into its @b transverse axis, one won't be able to scroll it in that direction. */
+   ELM_LIST_SCROLL, /**< Default value. This is the same as #ELM_LIST_COMPRESS, with the exception that if any of its items won't fit into its transverse axis, one @b will be able to scroll it in that direction. */
+   ELM_LIST_LIMIT, /**< Sets a minimum size hint on the list object, so that containers may respect it (and resize itself to fit the child properly). More specifically, a @b minimum size hint will be set for its @b transverse axis, so that the @b largest item in that direction fits well. This is naturally bound by the list object's maximum size hints, set externally. */
+   ELM_LIST_EXPAND, /**< Besides setting a minimum size on the transverse axis, just like on #ELM_LIST_LIMIT, the list will set a minimum size on the @b longitudinal axis, trying to reserve space to all its children to be visible at a time. . This is naturally bound by the list object's maximum size hints, set externally. */
    ELM_LIST_LAST /**< Indicates error if returned by elm_list_mode_get() */
 } Elm_List_Mode;
 
@@ -156,15 +174,21 @@ EAPI Eina_Bool                    elm_list_multi_select_get(const Evas_Object *o
  * Set which mode to use for the list object.
  *
  * @param obj The list object
- * @param mode One of #Elm_List_Mode: #ELM_LIST_COMPRESS, #ELM_LIST_SCROLL, #ELM_LIST_LIMIT or #ELM_LIST_EXPAND.
+ * @param mode One of #Elm_List_Mode: #ELM_LIST_COMPRESS,
+ * #ELM_LIST_SCROLL, #ELM_LIST_LIMIT or #ELM_LIST_EXPAND.
  *
  * Set list's resize behavior, transverse axis scroll and
  * items cropping. See each mode's description for more details.
  *
  * @note Default value is #ELM_LIST_SCROLL.
  *
- * Only one can be set, if a previous one was set, it will be changed
- * by the new mode set. Bitmask won't work as well.
+ * Only one mode at a time can be set. If a previous one was set, it
+ * will be changed by the new mode after this call. Bitmasks won't
+ * work here as well.
+ *
+ * @warning This function's behavior will clash with those of
+ * elm_scroller_content_min_limit(), so use either one of them, but
+ * not both.
  *
  * @see elm_list_mode_get()
  *
@@ -265,11 +289,13 @@ elm_list_select_mode_get(const Evas_Object *obj);
  * @param h_bounce Whether to bounce or not in the horizontal axis.
  * @param v_bounce Whether to bounce or not in the vertical axis.
  *
+ * @deprecated Use elm_scroller_bounce_set() instead.
+ *
  * @see elm_scroller_bounce_set()
  *
  * @ingroup List
  */
-EAPI void                         elm_list_bounce_set(Evas_Object *obj, Eina_Bool h_bounce, Eina_Bool v_bounce);
+EINA_DEPRECATED EAPI void         elm_list_bounce_set(Evas_Object *obj, Eina_Bool h_bounce, Eina_Bool v_bounce);
 
 /**
  * Get the bouncing behaviour of the internal scroller.
@@ -283,12 +309,14 @@ EAPI void                         elm_list_bounce_set(Evas_Object *obj, Eina_Boo
  * @param v_bounce Pointer to store the bounce state of the vertical
  * axis.
  *
+ * @deprecated Use elm_scroller_bounce_get() instead.
+ *
  * @see elm_scroller_bounce_get()
  * @see elm_list_bounce_set()
  *
  * @ingroup List
  */
-EAPI void                         elm_list_bounce_get(const Evas_Object *obj, Eina_Bool *h_bounce, Eina_Bool *v_bounce);
+EINA_DEPRECATED EAPI void         elm_list_bounce_get(const Evas_Object *obj, Eina_Bool *h_bounce, Eina_Bool *v_bounce);
 
 /**
  * Set the scrollbar policy.
@@ -297,16 +325,21 @@ EAPI void                         elm_list_bounce_get(const Evas_Object *obj, Ei
  * @param policy_h Horizontal scrollbar policy.
  * @param policy_v Vertical scrollbar policy.
  *
- * This sets the scrollbar visibility policy for the given scroller. #ELM_SCROLLER_POLICY_AUTO
- * means the scrollbar is made visible if it is needed, and otherwise kept
- * hidden. #ELM_SCROLLER_POLICY_ON turns it on all the time, and #ELM_SCROLLER_POLICY_OFF
- * always keeps it off. This applies respectively for the horizontal and vertical scrollbars.
+ * This sets the scrollbar visibility policy for the given
+ * scroller. #ELM_SCROLLER_POLICY_AUTO means the scrollbar is made
+ * visible if it is needed, and otherwise kept
+ * hidden. #ELM_SCROLLER_POLICY_ON turns it on all the time, and
+ * #ELM_SCROLLER_POLICY_OFF always keeps it off. This applies
+ * respectively for the horizontal and vertical scrollbars.
  *
- * The both are disabled by default, i.e., are set to #ELM_SCROLLER_POLICY_OFF.
+ * The both are disabled by default, i.e., are set to
+ * #ELM_SCROLLER_POLICY_OFF.
+ *
+ * @deprecated Use elm_scroller_policy_set() instead.
  *
  * @ingroup List
  */
-EAPI void                         elm_list_scroller_policy_set(Evas_Object *obj, Elm_Scroller_Policy policy_h, Elm_Scroller_Policy policy_v);
+EINA_DEPRECATED EAPI void         elm_list_scroller_policy_set(Evas_Object *obj, Elm_Scroller_Policy policy_h, Elm_Scroller_Policy policy_v);
 
 /**
  * Get the scrollbar policy.
@@ -317,9 +350,11 @@ EAPI void                         elm_list_scroller_policy_set(Evas_Object *obj,
  * @param policy_h Pointer to store horizontal scrollbar policy.
  * @param policy_v Pointer to store vertical scrollbar policy.
  *
+ * @deprecated Use elm_scroller_policy_get() instead.
+ *
  * @ingroup List
  */
-EAPI void                         elm_list_scroller_policy_get(const Evas_Object *obj, Elm_Scroller_Policy *policy_h, Elm_Scroller_Policy *policy_v);
+EINA_DEPRECATED EAPI void         elm_list_scroller_policy_get(const Evas_Object *obj, Elm_Scroller_Policy *policy_h, Elm_Scroller_Policy *policy_v);
 
 /**
  * Append a new item to the list object.
index b085ff4..220d085 100644 (file)
@@ -1091,7 +1091,7 @@ _ewk_view_popup_create_cb(void *data,
 
    list = elm_list_add(obj);
    elm_list_select_mode_set(data, ELM_OBJECT_SELECT_MODE_ALWAYS);
-   elm_list_bounce_set(list, EINA_FALSE, EINA_FALSE);
+   elm_scroller_bounce_set(list, EINA_FALSE, EINA_FALSE);
    elm_list_mode_set(list, ELM_LIST_EXPAND);
    evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);