[*]Un-Rollback to 'Merge [elm_multibuttonentry]Changed edc TEXT part to TEXTBLOCK...
[framework/uifw/elementary.git] / src / lib / elm_widget.c
index 9ec9675..0a61b9c 100644 (file)
 
 static const char SMART_NAME[] = "elm_widget";
 
-#define API_ENTRY \
-   Smart_Data *sd = evas_object_smart_data_get(obj); \
-   if ((!obj) || (!sd) || (!_elm_widget_is(obj)))
-#define INTERNAL_ENTRY \
-   Smart_Data *sd = evas_object_smart_data_get(obj); \
-   if (!sd) return;
-
-typedef struct _Smart_Data Smart_Data;
-typedef struct _Edje_Signal_Data Edje_Signal_Data;
+#define API_ENTRY                                    \
+  Smart_Data * sd = evas_object_smart_data_get(obj); \
+  if ((!obj) || (!sd) || (!_elm_widget_is(obj)))
+#define INTERNAL_ENTRY                               \
+  Smart_Data * sd = evas_object_smart_data_get(obj); \
+  if (!sd) return;
+
+#undef elm_widget_text_set_hook_set
+#undef elm_widget_text_get_hook_set
+#undef elm_widget_content_set_hook_set
+#undef elm_widget_content_get_hook_set
+#undef elm_widget_content_unset_hook_set
+
+typedef struct _Smart_Data        Smart_Data;
+typedef struct _Edje_Signal_Data  Edje_Signal_Data;
 typedef struct _Elm_Event_Cb_Data Elm_Event_Cb_Data;
 
 struct _Smart_Data
 {
-   Evas_Object   *obj;
-   const char    *type;
-   Evas_Object   *parent_obj;
-   Evas_Coord     x, y, w, h;
-   Eina_List     *subobjs;
-   Evas_Object   *resize_obj;
-   Evas_Object   *hover_obj;
-   Eina_List     *tooltips, *cursors;
-   void         (*del_func) (Evas_Object *obj);
-   void         (*del_pre_func) (Evas_Object *obj);
-   void         (*focus_func) (Evas_Object *obj);
-   void         (*activate_func) (Evas_Object *obj);
-   void         (*disable_func) (Evas_Object *obj);
-   void         (*theme_func) (Evas_Object *obj);
-   Eina_Bool    (*event_func) (Evas_Object *obj, Evas_Object *source, Evas_Callback_Type type, void *event_info);
-   void         (*signal_func) (Evas_Object *obj, const char *emission,
-                               const char *source);
-   void         (*callback_add_func) (Evas_Object *obj, const char *emission,
-                               const char *source, void (*func) (void *data,
-                                  Evas_Object *o, const char *emission,
-                                  const char *source), void *data);
-   void         (*callback_del_func) (Evas_Object *obj, const char *emission,
-                                 const char *source, void (*func) (void *data,
-                                    Evas_Object *o, const char *emission,
-                                    const char *source), void *data);
-   void         (*changed_func) (Evas_Object *obj);
-   Eina_Bool    (*focus_next_func) (const Evas_Object *obj, Elm_Focus_Direction dir,
-                                    Evas_Object **next);
-   void         (*on_focus_func) (void *data, Evas_Object *obj);
-   void          *on_focus_data;
-   void         (*on_change_func) (void *data, Evas_Object *obj);
-   void          *on_change_data;
-   void         (*on_show_region_func) (void *data, Evas_Object *obj);
-   void          *on_show_region_data;
-   void         (*focus_region_func) (Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h);
-   void         (*on_focus_region_func) (const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h);
-   void          *data;
-   Evas_Coord     rx, ry, rw, rh;
-   int            scroll_hold;
-   int            scroll_freeze;
-   double         scale;
-   Elm_Theme     *theme;
-   const char    *style;
-   unsigned int   focus_order;
-   Eina_Bool      focus_order_on_calc;
-
-   int            child_drag_x_locked;
-   int            child_drag_y_locked;
-
-   Eina_List     *edje_signals;
-
-   Eina_Bool      drag_x_locked : 1;
-   Eina_Bool      drag_y_locked : 1;
-
-   Eina_Bool      can_focus : 1;
-   Eina_Bool      child_can_focus : 1;
-   Eina_Bool      focused : 1;
-   Eina_Bool      highlight_ignore : 1;
-   Eina_Bool      highlight_in_theme : 1;
-   Eina_Bool      disabled : 1;
-   Eina_Bool      is_mirrored : 1;
-   Eina_Bool      mirrored_auto_mode : 1; /* This is TRUE by default */
-
-   Eina_List     *focus_chain;
-   Eina_List     *event_cb;
+   Evas_Object *obj;
+   const char  *type;
+   Evas_Object *parent_obj;
+   Evas_Coord   x, y, w, h;
+   Eina_List   *subobjs;
+   Evas_Object *resize_obj;
+   Evas_Object *hover_obj;
+   Eina_List   *tooltips, *cursors;
+   void       (*del_func)(Evas_Object *obj);
+   void       (*del_pre_func)(Evas_Object *obj);
+   void       (*focus_func)(Evas_Object *obj);
+   void       (*activate_func)(Evas_Object *obj);
+   void       (*disable_func)(Evas_Object *obj);
+   void       (*theme_func)(Evas_Object *obj);
+   Eina_Bool  (*event_func)(Evas_Object       *obj,
+                            Evas_Object       *source,
+                            Evas_Callback_Type type,
+                            void              *event_info);
+   void       (*signal_func)(Evas_Object *obj,
+                             const char  *emission,
+                             const char  *source);
+   void       (*callback_add_func)(Evas_Object   *obj,
+                                   const char    *emission,
+                                   const char    *source,
+                                   Edje_Signal_Cb func,
+                                   void          *data);
+   void       (*callback_del_func)(Evas_Object   *obj,
+                                   const char    *emission,
+                                   const char    *source,
+                                   Edje_Signal_Cb func,
+                                   void          *data);
+   void       (*changed_func)(Evas_Object *obj);
+   Eina_Bool  (*focus_next_func)(const Evas_Object  *obj,
+                                 Elm_Focus_Direction dir,
+                                 Evas_Object       **next);
+   void       (*on_focus_func)(void        *data,
+                               Evas_Object *obj);
+   void        *on_focus_data;
+   void       (*on_change_func)(void        *data,
+                                Evas_Object *obj);
+   void        *on_change_data;
+   void       (*on_show_region_func)(void        *data,
+                                     Evas_Object *obj);
+   void        *on_show_region_data;
+   void       (*focus_region_func)(Evas_Object *obj,
+                                   Evas_Coord   x,
+                                   Evas_Coord   y,
+                                   Evas_Coord   w,
+                                   Evas_Coord   h);
+   void       (*on_focus_region_func)(const Evas_Object *obj,
+                                      Evas_Coord        *x,
+                                      Evas_Coord        *y,
+                                      Evas_Coord        *w,
+                                      Evas_Coord        *h);
+   Elm_Widget_On_Text_Set_Cb on_text_set_func;
+   Elm_Widget_On_Text_Get_Cb on_text_get_func;
+   Elm_Widget_On_Content_Set_Cb on_content_set_func;
+   Elm_Widget_On_Content_Get_Cb on_content_get_func;
+   Elm_Widget_On_Content_Unset_Cb on_content_unset_func;
+   void        *data;
+   Evas_Coord   rx, ry, rw, rh;
+   int          scroll_hold;
+   int          scroll_freeze;
+   double       scale;
+   Elm_Theme   *theme;
+   const char  *style;
+   unsigned int focus_order;
+   Eina_Bool    focus_order_on_calc;
+
+   int          child_drag_x_locked;
+   int          child_drag_y_locked;
+
+   Eina_List   *edje_signals;
+
+   Eina_Bool    drag_x_locked : 1;
+   Eina_Bool    drag_y_locked : 1;
+
+   Eina_Bool    can_focus : 1;
+   Eina_Bool    child_can_focus : 1;
+   Eina_Bool    focused : 1;
+   Eina_Bool    top_win_focused : 1;
+   Eina_Bool    tree_unfocusable : 1;
+   Eina_Bool    highlight_ignore : 1;
+   Eina_Bool    highlight_in_theme : 1;
+   Eina_Bool    disabled : 1;
+   Eina_Bool    is_mirrored : 1;
+   Eina_Bool    mirrored_auto_mode : 1;   /* This is TRUE by default */
+
+   Eina_List   *focus_chain;
+   Eina_List   *event_cb;
 };
 
 struct _Edje_Signal_Data
 {
-   Evas_Object *obj;
+   Evas_Object   *obj;
    Edje_Signal_Cb func;
-   const char *emission;
-   const char *source;
-   void *data;
+   const char    *emission;
+   const char    *source;
+   void          *data;
 };
 
-struct _Elm_Event_Cb_Data {
-     Elm_Event_Cb func;
-     const void *data;
+struct _Elm_Event_Cb_Data
+{
+   Elm_Event_Cb func;
+   const void  *data;
 };
 
 /* local subsystem functions */
 static void _smart_reconfigure(Smart_Data *sd);
 static void _smart_add(Evas_Object *obj);
 static void _smart_del(Evas_Object *obj);
-static void _smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
-static void _smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h);
+static void _smart_move(Evas_Object *obj,
+                        Evas_Coord   x,
+                        Evas_Coord   y);
+static void _smart_resize(Evas_Object *obj,
+                          Evas_Coord   w,
+                          Evas_Coord   h);
 static void _smart_show(Evas_Object *obj);
 static void _smart_hide(Evas_Object *obj);
-static void _smart_color_set(Evas_Object *obj, int r, int g, int b, int a);
-static void _smart_clip_set(Evas_Object *obj, Evas_Object * clip);
+static void _smart_color_set(Evas_Object *obj,
+                             int          r,
+                             int          g,
+                             int          b,
+                             int          a);
+static void _smart_clip_set(Evas_Object *obj,
+                            Evas_Object *clip);
 static void _smart_clip_unset(Evas_Object *obj);
 static void _smart_calculate(Evas_Object *obj);
 static void _smart_init(void);
 
-static void _if_focused_revert(Evas_Object *obj, Eina_Bool can_focus_only);
-static Evas_Object *_newest_focus_order_get(Evas_Object *obj, unsigned int *newest_focus_order, Eina_Bool can_focus_only);
+static void _if_focused_revert(Evas_Object *obj,
+                               Eina_Bool    can_focus_only);
+static Evas_Object *_newest_focus_order_get(Evas_Object  *obj,
+                                            unsigned int *newest_focus_order,
+                                            Eina_Bool     can_focus_only);
 
 /* local subsystem globals */
 static Evas_Smart *_e_smart = NULL;
@@ -140,8 +184,7 @@ _unfocus_parents(Evas_Object *obj)
 {
    for (; obj; obj = elm_widget_parent_get(obj))
      {
-        Smart_Data *sd = evas_object_smart_data_get(obj);
-        if (!sd) return;
+        INTERNAL_ENTRY
         if (!sd->focused) return;
         sd->focused = 0;
      }
@@ -152,15 +195,17 @@ _focus_parents(Evas_Object *obj)
 {
    for (; obj; obj = elm_widget_parent_get(obj))
      {
-        Smart_Data *sd = evas_object_smart_data_get(obj);
-        if (!sd) return;
+        INTERNAL_ENTRY
         if (sd->focused) return;
         sd->focused = 1;
      }
 }
 
 static void
-_sub_obj_del(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+_sub_obj_del(void        *data,
+             Evas        *e __UNUSED__,
+             Evas_Object *obj,
+             void        *event_info __UNUSED__)
 {
    Smart_Data *sd = data;
 
@@ -178,24 +223,28 @@ _sub_obj_del(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info
 }
 
 static void
-_sub_obj_mouse_down(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+_sub_obj_hide(void        *data __UNUSED__,
+              Evas        *e __UNUSED__,
+              Evas_Object *obj,
+              void        *event_info __UNUSED__)
 {
-   Evas_Object *o = obj;
-   do
-     {
-        if (_elm_widget_is(o)) break;
-        o = evas_object_smart_parent_get(o);
-     }
-   while (o);
-   if (!o) return;
-   if (!_is_focusable(o)) return;
-   elm_widget_focus_steal(o);
+   elm_widget_focus_hide_handle(obj);
 }
 
 static void
-_propagate_x_drag_lock(Evas_Object *obj, int dir)
+_sub_obj_mouse_down(void        *data __UNUSED__,
+                    Evas        *e __UNUSED__,
+                    Evas_Object *obj,
+                    void        *event_info __UNUSED__)
 {
-   Smart_Data *sd = evas_object_smart_data_get(obj);
+   elm_widget_focus_mouse_down_handle(obj);
+}
+
+static void
+_propagate_x_drag_lock(Evas_Object *obj,
+                       int          dir)
+{
+   INTERNAL_ENTRY
    if (sd->parent_obj)
      {
         Smart_Data *sd2 = evas_object_smart_data_get(sd->parent_obj);
@@ -208,9 +257,10 @@ _propagate_x_drag_lock(Evas_Object *obj, int dir)
 }
 
 static void
-_propagate_y_drag_lock(Evas_Object *obj, int dir)
+_propagate_y_drag_lock(Evas_Object *obj,
+                       int          dir)
 {
-   Smart_Data *sd = evas_object_smart_data_get(obj);
+   INTERNAL_ENTRY
    if (sd->parent_obj)
      {
         Smart_Data *sd2 = evas_object_smart_data_get(sd->parent_obj);
@@ -223,33 +273,39 @@ _propagate_y_drag_lock(Evas_Object *obj, int dir)
 }
 
 static void
-_propagate_event(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info)
+_propagate_event(void        *data,
+                 Evas        *e __UNUSED__,
+                 Evas_Object *obj,
+                 void        *event_info)
 {
-   INTERNAL_ENTRY;
-   Evas_Callback_Type type = (Evas_Callback_Type)(long) data;
+   INTERNAL_ENTRY
+   Evas_Callback_Type type = (Evas_Callback_Type)(long)data;
    Evas_Event_Flags *event_flags = NULL;
 
    switch (type)
      {
-     case EVAS_CALLBACK_KEY_DOWN:
+      case EVAS_CALLBACK_KEY_DOWN:
           {
-             Evas_Event_Key_Down *ev = event_info;
-             event_flags = &(ev->event_flags);
-             break;
+            Evas_Event_Key_Down *ev = event_info;
+            event_flags = &(ev->event_flags);
           }
-     case EVAS_CALLBACK_KEY_UP:
+        break;
+
+      case EVAS_CALLBACK_KEY_UP:
           {
              Evas_Event_Key_Up *ev = event_info;
              event_flags = &(ev->event_flags);
-             break;
           }
-     case EVAS_CALLBACK_MOUSE_WHEEL:
+        break;
+
+      case EVAS_CALLBACK_MOUSE_WHEEL:
           {
-             Evas_Event_Mouse_Wheel *ev = event_info;
-             event_flags = &(ev->event_flags);
-             break;
+            Evas_Event_Mouse_Wheel *ev = event_info;
+            event_flags = &(ev->event_flags);
           }
-     default:
+        break;
+
+      default:
         break;
      }
 
@@ -260,42 +316,35 @@ static void
 _parent_focus(Evas_Object *obj)
 {
    API_ENTRY return;
+   if (sd->focused) return;
 
    Evas_Object *o = elm_widget_parent_get(obj);
    sd->focus_order_on_calc = EINA_TRUE;
 
-   if (sd->focused) return;
-   if (o)
-     {
-       unsigned int i = 0;
-       Evas_Object *ret;
-
-       ret = _newest_focus_order_get(o, &i, EINA_TRUE);
-
-       /* we don't want to bump a common widget ancestor's
-          focus_order *twice* while parent focusing */
-       if (!ret || (!i) || (i != focus_order))
-         _parent_focus(o);
-     }
+   if (o) _parent_focus(o);
 
    if (!sd->focus_order_on_calc)
      return; /* we don't want to override it if by means of any of the
-               callbacks below one gets to calculate our order
-               first. */
+                callbacks below one gets to calculate our order
+                first. */
 
    focus_order++;
    sd->focus_order = focus_order;
-   sd->focused = EINA_TRUE;
-   if (sd->on_focus_func) sd->on_focus_func(sd->on_focus_data, obj);
-   if (sd->focus_func) sd->focus_func(obj);
-
-   _elm_widget_focus_region_show(obj);
-
+   if (sd->top_win_focused)
+     {
+        sd->focused = EINA_TRUE;
+        if (sd->on_focus_func) sd->on_focus_func(sd->on_focus_data, obj);
+        if (sd->focus_func) sd->focus_func(obj);
+        _elm_widget_focus_region_show(obj);
+     }
    sd->focus_order_on_calc = EINA_FALSE;
 }
 
 static void
-_elm_object_focus_chain_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+_elm_object_focus_chain_del_cb(void        *data,
+                               Evas        *e __UNUSED__,
+                               Evas_Object *obj,
+                               void        *event_info __UNUSED__)
 {
    Smart_Data *sd = data;
 
@@ -362,6 +411,18 @@ elm_widget_type_register(const char **ptr)
    widtypes = eina_list_append(widtypes, (void *)ptr);
 }
 
+/**
+ * @defgroup Widget Widget
+ *
+ * @internal
+ * Disposed api for making widgets
+ */
+EAPI void
+elm_widget_type_unregister(const char **ptr)
+{
+   widtypes = eina_list_remove(widtypes, (void *)ptr);
+}
+
 EAPI Eina_Bool
 elm_widget_api_check(int ver)
 {
@@ -384,77 +445,141 @@ elm_widget_add(Evas *evas)
 }
 
 EAPI void
-elm_widget_del_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj))
+elm_widget_del_hook_set(Evas_Object *obj,
+                        void       (*func)(Evas_Object *obj))
 {
    API_ENTRY return;
    sd->del_func = func;
 }
 
 EAPI void
-elm_widget_del_pre_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj))
+elm_widget_del_pre_hook_set(Evas_Object *obj,
+                            void       (*func)(Evas_Object *obj))
 {
    API_ENTRY return;
    sd->del_pre_func = func;
 }
 
 EAPI void
-elm_widget_focus_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj))
+elm_widget_focus_hook_set(Evas_Object *obj,
+                          void       (*func)(Evas_Object *obj))
 {
    API_ENTRY return;
    sd->focus_func = func;
 }
 
 EAPI void
-elm_widget_activate_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj))
+elm_widget_activate_hook_set(Evas_Object *obj,
+                             void       (*func)(Evas_Object *obj))
 {
    API_ENTRY return;
    sd->activate_func = func;
 }
 
 EAPI void
-elm_widget_disable_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj))
+elm_widget_disable_hook_set(Evas_Object *obj,
+                            void       (*func)(Evas_Object *obj))
 {
    API_ENTRY return;
    sd->disable_func = func;
 }
 
 EAPI void
-elm_widget_theme_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj))
+elm_widget_theme_hook_set(Evas_Object *obj,
+                          void       (*func)(Evas_Object *obj))
 {
    API_ENTRY return;
    sd->theme_func = func;
 }
 
 EAPI void
-elm_widget_event_hook_set(Evas_Object *obj, Eina_Bool (*func) (Evas_Object *obj, Evas_Object *source, Evas_Callback_Type type, void *event_info))
+elm_widget_event_hook_set(Evas_Object *obj,
+                          Eina_Bool  (*func)(Evas_Object       *obj,
+                                             Evas_Object       *source,
+                                             Evas_Callback_Type type,
+                                             void              *event_info))
 {
    API_ENTRY return;
    sd->event_func = func;
 }
 
 EAPI void
-elm_widget_changed_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj))
+elm_widget_text_set_hook_set(Evas_Object *obj,
+                             Elm_Widget_On_Text_Set_Cb func)
+{
+   API_ENTRY return;
+   sd->on_text_set_func = func;
+}
+
+EAPI void
+elm_widget_text_get_hook_set(Evas_Object *obj,
+                             Elm_Widget_On_Text_Get_Cb func)
+{
+   API_ENTRY return;
+   sd->on_text_get_func = func;
+}
+
+EAPI void
+elm_widget_content_set_hook_set(Evas_Object *obj,
+                                Elm_Widget_On_Content_Set_Cb func)
+{
+   API_ENTRY return;
+   sd->on_content_set_func = func;
+}
+
+EAPI void
+elm_widget_content_get_hook_set(Evas_Object *obj,
+                                Elm_Widget_On_Content_Get_Cb func)
+{
+   API_ENTRY return;
+   sd->on_content_get_func = func;
+}
+
+EAPI void
+elm_widget_content_unset_hook_set(Evas_Object *obj,
+                                  Elm_Widget_On_Content_Unset_Cb func)
+{
+   API_ENTRY return;
+   sd->on_content_unset_func = func;
+}
+
+EAPI void
+elm_widget_changed_hook_set(Evas_Object *obj,
+                            void       (*func)(Evas_Object *obj))
 {
    API_ENTRY return;
    sd->changed_func = func;
 }
 
 EAPI void
-elm_widget_signal_emit_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj, const char *emission, const char *source))
+elm_widget_signal_emit_hook_set(Evas_Object *obj,
+                                void       (*func)(Evas_Object *obj,
+                                                   const char *emission,
+                                                   const char *source))
 {
    API_ENTRY return;
    sd->signal_func = func;
 }
 
 EAPI void
-elm_widget_signal_callback_add_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data))
+elm_widget_signal_callback_add_hook_set(Evas_Object *obj,
+                                        void       (*func)(Evas_Object   *obj,
+                                                           const char    *emission,
+                                                           const char    *source,
+                                                           Edje_Signal_Cb func_cb,
+                                                           void          *data))
 {
    API_ENTRY return;
    sd->callback_add_func = func;
 }
 
 EAPI void
-elm_widget_signal_callback_del_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data))
+elm_widget_signal_callback_del_hook_set(Evas_Object *obj,
+                                        void       (*func)(Evas_Object   *obj,
+                                                           const char    *emission,
+                                                           const char    *source,
+                                                           Edje_Signal_Cb func_cb,
+                                                           void          *data))
 {
    API_ENTRY return;
    sd->callback_del_func = func;
@@ -478,7 +603,9 @@ elm_widget_theme(Evas_Object *obj)
 }
 
 EAPI void
-elm_widget_theme_specific(Evas_Object *obj, Elm_Theme *th, Eina_Bool force)
+elm_widget_theme_specific(Evas_Object *obj,
+                          Elm_Theme   *th,
+                          Eina_Bool    force)
 {
    const Eina_List *l;
    Evas_Object *child;
@@ -526,7 +653,10 @@ elm_widget_theme_specific(Evas_Object *obj, Elm_Theme *th, Eina_Bool force)
  * @ingroup Widget
  */
 EAPI void
-elm_widget_focus_next_hook_set(Evas_Object *obj, Eina_Bool (*func) (const Evas_Object *obj, Elm_Focus_Direction dir, Evas_Object **next))
+elm_widget_focus_next_hook_set(Evas_Object *obj,
+                               Eina_Bool  (*func)(const Evas_Object   *obj,
+                                                   Elm_Focus_Direction dir,
+                                                   Evas_Object       **next))
 {
    API_ENTRY return;
    sd->focus_next_func = func;
@@ -553,13 +683,14 @@ elm_widget_mirrored_get(const Evas_Object *obj)
  * @param mirrored EINA_TRUE to set mirrored mode. EINA_FALSE to unset.
  */
 EAPI void
-elm_widget_mirrored_set(Evas_Object *obj, Eina_Bool mirrored)
+elm_widget_mirrored_set(Evas_Object *obj,
+                        Eina_Bool    mirrored)
 {
    API_ENTRY return;
    if (sd->is_mirrored != mirrored)
      {
-       sd->is_mirrored = mirrored;
-       elm_widget_theme(obj);
+        sd->is_mirrored = mirrored;
+        elm_widget_theme(obj);
      }
 }
 
@@ -578,7 +709,7 @@ _elm_widget_mirrored_reload(Evas_Object *obj)
    Eina_Bool mirrored = elm_mirrored_get();
    if (elm_widget_mirrored_automatic_get(obj) && (sd->is_mirrored != mirrored))
      {
-       sd->is_mirrored = mirrored;
+        sd->is_mirrored = mirrored;
      }
 }
 
@@ -604,12 +735,13 @@ elm_widget_mirrored_automatic_get(const Evas_Object *obj)
  * @param automatic EINA_TRUE for auto mirrored mode. EINA_FALSE for manual.
  */
 EAPI void
-elm_widget_mirrored_automatic_set(Evas_Object *obj, Eina_Bool automatic)
+elm_widget_mirrored_automatic_set(Evas_Object *obj,
+                                  Eina_Bool    automatic)
 {
    API_ENTRY return;
    if (sd->mirrored_auto_mode != automatic)
      {
-       sd->mirrored_auto_mode = automatic;
+        sd->mirrored_auto_mode = automatic;
 
         if (automatic)
           {
@@ -619,7 +751,10 @@ elm_widget_mirrored_automatic_set(Evas_Object *obj, Eina_Bool automatic)
 }
 
 EAPI void
-elm_widget_on_focus_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data)
+elm_widget_on_focus_hook_set(Evas_Object *obj,
+                             void       (*func)(void *data,
+                                                Evas_Object *obj),
+                             void        *data)
 {
    API_ENTRY return;
    sd->on_focus_func = func;
@@ -627,7 +762,10 @@ elm_widget_on_focus_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Ob
 }
 
 EAPI void
-elm_widget_on_change_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data)
+elm_widget_on_change_hook_set(Evas_Object *obj,
+                              void       (*func)(void *data,
+                                                 Evas_Object *obj),
+                              void        *data)
 {
    API_ENTRY return;
    sd->on_change_func = func;
@@ -635,7 +773,10 @@ elm_widget_on_change_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_O
 }
 
 EAPI void
-elm_widget_on_show_region_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data)
+elm_widget_on_show_region_hook_set(Evas_Object *obj,
+                                   void       (*func)(void *data,
+                                                      Evas_Object *obj),
+                                   void        *data)
 {
    API_ENTRY return;
    sd->on_show_region_func = func;
@@ -658,7 +799,12 @@ elm_widget_on_show_region_hook_set(Evas_Object *obj, void (*func) (void *data, E
  * @ingroup Widget
  */
 EAPI void
-elm_widget_focus_region_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h))
+elm_widget_focus_region_hook_set(Evas_Object *obj,
+                                 void       (*func)(Evas_Object *obj,
+                                                    Evas_Coord x,
+                                                    Evas_Coord y,
+                                                    Evas_Coord w,
+                                                    Evas_Coord h))
 {
    API_ENTRY return;
    sd->focus_region_func = func;
@@ -680,14 +826,20 @@ elm_widget_focus_region_hook_set(Evas_Object *obj, void (*func) (Evas_Object *ob
  * @ingroup Widget
  */
 EAPI void
-elm_widget_on_focus_region_hook_set(Evas_Object *obj, void (*func) (const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h))
+elm_widget_on_focus_region_hook_set(Evas_Object *obj,
+                                    void       (*func)(const Evas_Object *obj,
+                                                       Evas_Coord *x,
+                                                       Evas_Coord *y,
+                                                       Evas_Coord *w,
+                                                       Evas_Coord *h))
 {
    API_ENTRY return;
    sd->on_focus_region_func = func;
 }
 
 EAPI void
-elm_widget_data_set(Evas_Object *obj, void *data)
+elm_widget_data_set(Evas_Object *obj,
+                    void        *data)
 {
    API_ENTRY return;
    sd->data = data;
@@ -701,7 +853,8 @@ elm_widget_data_get(const Evas_Object *obj)
 }
 
 EAPI void
-elm_widget_sub_object_add(Evas_Object *obj, Evas_Object *sobj)
+elm_widget_sub_object_add(Evas_Object *obj,
+                          Evas_Object *sobj)
 {
    API_ENTRY return;
    double scale, pscale = elm_widget_scale_get(sobj);
@@ -718,6 +871,7 @@ elm_widget_sub_object_add(Evas_Object *obj, Evas_Object *sobj)
              if (sd2->parent_obj)
                elm_widget_sub_object_del(sd2->parent_obj, sobj);
              sd2->parent_obj = obj;
+             sd2->top_win_focused = sd->top_win_focused;
              if (!sd->child_can_focus && (_is_focusable(sobj)))
                sd->child_can_focus = EINA_TRUE;
           }
@@ -736,6 +890,8 @@ elm_widget_sub_object_add(Evas_Object *obj, Evas_Object *sobj)
    sd->subobjs = eina_list_append(sd->subobjs, sobj);
    evas_object_data_set(sobj, "elm-parent", obj);
    evas_object_event_callback_add(sobj, EVAS_CALLBACK_DEL, _sub_obj_del, sd);
+   if (_elm_widget_is(sobj))
+     evas_object_event_callback_add(sobj, EVAS_CALLBACK_HIDE, _sub_obj_hide, sd);
    evas_object_smart_callback_call(obj, "sub-object-add", sobj);
    scale = elm_widget_scale_get(sobj);
    th = elm_widget_theme_get(sobj);
@@ -745,7 +901,8 @@ elm_widget_sub_object_add(Evas_Object *obj, Evas_Object *sobj)
 }
 
 EAPI void
-elm_widget_sub_object_del(Evas_Object *obj, Evas_Object *sobj)
+elm_widget_sub_object_del(Evas_Object *obj,
+                          Evas_Object *sobj)
 {
    Evas_Object *sobj_parent;
    API_ENTRY return;
@@ -754,20 +911,16 @@ elm_widget_sub_object_del(Evas_Object *obj, Evas_Object *sobj)
    sobj_parent = evas_object_data_del(sobj, "elm-parent");
    if (sobj_parent != obj)
      {
-       static int abort_on_warn = -1;
-       ERR("removing sub object %p from parent %p, "
-           "but elm-parent is different %p!",
-           sobj, obj, sobj_parent);
-       if (EINA_UNLIKELY(abort_on_warn == -1))
-         {
-            if (getenv("ELM_ERROR_ABORT")) abort_on_warn = 1;
-            else abort_on_warn = 0;
-         }
-       if (abort_on_warn == 1) abort();
-     }
-   if (!sd->child_can_focus)
-     {
-       if (_is_focusable(sobj)) sd->child_can_focus = 0;
+        static int abort_on_warn = -1;
+        ERR("removing sub object %p from parent %p, "
+            "but elm-parent is different %p!",
+            sobj, obj, sobj_parent);
+        if (EINA_UNLIKELY(abort_on_warn == -1))
+          {
+             if (getenv("ELM_ERROR_ABORT")) abort_on_warn = 1;
+             else abort_on_warn = 0;
+          }
+        if (abort_on_warn == 1) abort();
      }
    if (_elm_widget_is(sobj))
      {
@@ -783,33 +936,53 @@ elm_widget_sub_object_del(Evas_Object *obj, Evas_Object *sobj)
         else
           sd->subobjs = eina_list_remove(sd->subobjs, sobj);
         if (elm_widget_focus_get(sobj)) _unfocus_parents(obj);
+        if ((sd->child_can_focus) && (_is_focusable(sobj)))
+          {
+             Evas_Object *subobj;
+             const Eina_List *l;
+             sd->child_can_focus = EINA_FALSE;
+             EINA_LIST_FOREACH(sd->subobjs, l, subobj)
+               {
+                  if (_is_focusable(subobj))
+                    {
+                       sd->child_can_focus = EINA_TRUE;
+                       break;
+                    }
+               }
+          }
      }
    else
      sd->subobjs = eina_list_remove(sd->subobjs, sobj);
    evas_object_event_callback_del_full(sobj, EVAS_CALLBACK_DEL,
                                        _sub_obj_del, sd);
+   if (_elm_widget_is(sobj))
+     evas_object_event_callback_del_full(sobj, EVAS_CALLBACK_HIDE,
+                                         _sub_obj_hide, sd);
    evas_object_smart_callback_call(obj, "sub-object-del", sobj);
 }
 
 EAPI void
-elm_widget_resize_object_set(Evas_Object *obj, Evas_Object *sobj)
+elm_widget_resize_object_set(Evas_Object *obj,
+                             Evas_Object *sobj)
 {
    API_ENTRY return;
    // orphan previous resize obj
    if (sd->resize_obj)
      {
-       evas_object_clip_unset(sd->resize_obj);
-       evas_object_data_del(sd->resize_obj, "elm-parent");
-       if (_elm_widget_is(sd->resize_obj))
-         {
-            Smart_Data *sd2 = evas_object_smart_data_get(sd->resize_obj);
-            if (sd2) sd2->parent_obj = NULL;
-         }
-       evas_object_event_callback_del_full(sd->resize_obj, EVAS_CALLBACK_DEL,
+        evas_object_clip_unset(sd->resize_obj);
+        evas_object_data_del(sd->resize_obj, "elm-parent");
+        if (_elm_widget_is(sd->resize_obj))
+          {
+             Smart_Data *sd2 = evas_object_smart_data_get(sd->resize_obj);
+             if (sd2) sd2->parent_obj = NULL;
+             evas_object_event_callback_del_full(sd->resize_obj, EVAS_CALLBACK_HIDE,
+                                                 _sub_obj_hide, sd);
+          }
+        evas_object_event_callback_del_full(sd->resize_obj, EVAS_CALLBACK_DEL,
                                             _sub_obj_del, sd);
-       evas_object_event_callback_del_full(sd->resize_obj, EVAS_CALLBACK_MOUSE_DOWN,
+        evas_object_event_callback_del_full(sd->resize_obj, EVAS_CALLBACK_MOUSE_DOWN,
                                             _sub_obj_mouse_down, sd);
-       evas_object_smart_member_del(sd->resize_obj);
+        evas_object_smart_member_del(sd->resize_obj);
         if (_elm_widget_is(sd->resize_obj))
           {
              if (elm_widget_focus_get(sd->resize_obj)) _unfocus_parents(obj);
@@ -823,6 +996,8 @@ elm_widget_resize_object_set(Evas_Object *obj, Evas_Object *sobj)
           {
              Smart_Data *sd2 = evas_object_smart_data_get(sobj);
              if (sd2) sd2->parent_obj = NULL;
+             evas_object_event_callback_del_full(sobj, EVAS_CALLBACK_HIDE,
+                                                 _sub_obj_hide, sd);
           }
         evas_object_event_callback_del_full(sobj, EVAS_CALLBACK_DEL,
                                             _sub_obj_del, sd);
@@ -838,20 +1013,26 @@ elm_widget_resize_object_set(Evas_Object *obj, Evas_Object *sobj)
    sd->resize_obj = sobj;
    if (sd->resize_obj)
      {
-       if (_elm_widget_is(sd->resize_obj))
-         {
-            Smart_Data *sd2 = evas_object_smart_data_get(sd->resize_obj);
-            if (sd2) sd2->parent_obj = obj;
-         }
-       evas_object_clip_set(sobj, evas_object_clip_get(obj));
-       evas_object_smart_member_add(sobj, obj);
-       evas_object_event_callback_add(sobj, EVAS_CALLBACK_DEL,
+        if (_elm_widget_is(sd->resize_obj))
+          {
+             Smart_Data *sd2 = evas_object_smart_data_get(sd->resize_obj);
+             if (sd2)
+               {
+                  sd2->parent_obj = obj;
+                  sd2->top_win_focused = sd->top_win_focused;
+               }
+             evas_object_event_callback_add(sobj, EVAS_CALLBACK_HIDE,
+                                            _sub_obj_hide, sd);
+          }
+        evas_object_clip_set(sobj, evas_object_clip_get(obj));
+        evas_object_smart_member_add(sobj, obj);
+        evas_object_event_callback_add(sobj, EVAS_CALLBACK_DEL,
                                        _sub_obj_del, sd);
-       evas_object_event_callback_add(sobj, EVAS_CALLBACK_MOUSE_DOWN,
+        evas_object_event_callback_add(sobj, EVAS_CALLBACK_MOUSE_DOWN,
                                        _sub_obj_mouse_down, sd);
-       _smart_reconfigure(sd);
-       evas_object_data_set(sobj, "elm-parent", obj);
-       evas_object_smart_callback_call(obj, "sub-object-add", sobj);
+        _smart_reconfigure(sd);
+        evas_object_data_set(sobj, "elm-parent", obj);
+        evas_object_smart_callback_call(obj, "sub-object-add", sobj);
         if (_elm_widget_is(sobj))
           {
              if (elm_widget_focus_get(sobj)) _focus_parents(obj);
@@ -860,25 +1041,27 @@ elm_widget_resize_object_set(Evas_Object *obj, Evas_Object *sobj)
 }
 
 EAPI void
-elm_widget_hover_object_set(Evas_Object *obj, Evas_Object *sobj)
+elm_widget_hover_object_set(Evas_Object *obj,
+                            Evas_Object *sobj)
 {
    API_ENTRY return;
    if (sd->hover_obj)
      {
-       evas_object_event_callback_del_full(sd->hover_obj, EVAS_CALLBACK_DEL,
-           _sub_obj_del, sd);
+        evas_object_event_callback_del_full(sd->hover_obj, EVAS_CALLBACK_DEL,
+                                            _sub_obj_del, sd);
      }
    sd->hover_obj = sobj;
    if (sd->hover_obj)
      {
-       evas_object_event_callback_add(sobj, EVAS_CALLBACK_DEL,
+        evas_object_event_callback_add(sobj, EVAS_CALLBACK_DEL,
                                        _sub_obj_del, sd);
-       _smart_reconfigure(sd);
+        _smart_reconfigure(sd);
      }
 }
 
 EAPI void
-elm_widget_can_focus_set(Evas_Object *obj, Eina_Bool can_focus)
+elm_widget_can_focus_set(Evas_Object *obj,
+                         Eina_Bool    can_focus)
 {
    API_ENTRY return;
    sd->can_focus = can_focus;
@@ -886,10 +1069,10 @@ elm_widget_can_focus_set(Evas_Object *obj, Eina_Bool can_focus)
      {
         evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN,
                                        _propagate_event,
-                                       (void *)(long) EVAS_CALLBACK_KEY_DOWN);
+                                       (void *)(long)EVAS_CALLBACK_KEY_DOWN);
         evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_UP,
                                        _propagate_event,
-                                       (void *)(long) EVAS_CALLBACK_KEY_UP);
+                                       (void *)(long)EVAS_CALLBACK_KEY_UP);
         evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_WHEEL,
                                        _propagate_event,
                                        (void *)(long)EVAS_CALLBACK_MOUSE_WHEEL);
@@ -919,8 +1102,52 @@ elm_widget_child_can_focus_get(const Evas_Object *obj)
    return sd->child_can_focus;
 }
 
+/**
+ * @internal
+ *
+ * This API makes the widget object and its children to be unfocusable.
+ *
+ * This API can be helpful for an object to be deleted.
+ * When an object will be deleted soon, it and its children may not
+ * want to get focus (by focus reverting or by other focus controls).
+ * Then, just use this API before deleting.
+ *
+ * @param obj The widget root of sub-tree
+ * @param tree_unfocusable If true, set the object sub-tree as unfocusable
+ *
+ * @ingroup Widget
+ */
 EAPI void
-elm_widget_highlight_ignore_set(Evas_Object *obj, Eina_Bool ignore)
+elm_widget_tree_unfocusable_set(Evas_Object *obj,
+                                Eina_Bool    tree_unfocusable)
+{
+   API_ENTRY return;
+
+   if (sd->tree_unfocusable == tree_unfocusable) return;
+   sd->tree_unfocusable = !!tree_unfocusable;
+   elm_widget_focus_tree_unfocusable_handle(obj);
+}
+
+/**
+ * @internal
+ *
+ * This returns true, if the object sub-tree is unfocusable.
+ *
+ * @param obj The widget root of sub-tree
+ * @return EINA_TRUE if the object sub-tree is unfocusable
+ *
+ * @ingroup Widget
+ */
+EAPI Eina_Bool
+elm_widget_tree_unfocusable_get(const Evas_Object *obj)
+{
+   API_ENTRY return EINA_FALSE;
+   return sd->tree_unfocusable;
+}
+
+EAPI void
+elm_widget_highlight_ignore_set(Evas_Object *obj,
+                                Eina_Bool    ignore)
 {
    API_ENTRY return;
    sd->highlight_ignore = !!ignore;
@@ -934,7 +1161,8 @@ elm_widget_highlight_ignore_get(const Evas_Object *obj)
 }
 
 EAPI void
-elm_widget_highlight_in_theme_set(Evas_Object *obj, Eina_Bool highlight)
+elm_widget_highlight_in_theme_set(Evas_Object *obj,
+                                  Eina_Bool    highlight)
 {
    API_ENTRY return;
    sd->highlight_in_theme = !!highlight;
@@ -965,8 +1193,8 @@ elm_widget_focused_object_get(const Evas_Object *obj)
    if (!sd->focused) return NULL;
    EINA_LIST_FOREACH(sd->subobjs, l, subobj)
      {
-       Evas_Object *fobj = elm_widget_focused_object_get(subobj);
-       if (fobj) return fobj;
+        Evas_Object *fobj = elm_widget_focused_object_get(subobj);
+        if (fobj) return fobj;
      }
    return (Evas_Object *)obj;
 }
@@ -992,29 +1220,31 @@ elm_widget_parent_widget_get(const Evas_Object *obj)
 
    if (_elm_widget_is(obj))
      {
-       Smart_Data *sd = evas_object_smart_data_get(obj);
-       if (!sd) return NULL;
-       parent = sd->parent_obj;
+        Smart_Data *sd = evas_object_smart_data_get(obj);
+        if (!sd) return NULL;
+        parent = sd->parent_obj;
      }
    else
      {
-       parent = evas_object_data_get(obj, "elm-parent");
-       if (!parent) parent = evas_object_smart_parent_get(obj);
+        parent = evas_object_data_get(obj, "elm-parent");
+        if (!parent) parent = evas_object_smart_parent_get(obj);
      }
 
    while (parent)
      {
-       Evas_Object *elm_parent;
-       if (_elm_widget_is(parent)) break;
-       elm_parent = evas_object_data_get(parent, "elm-parent");
+        Evas_Object *elm_parent;
+        if (_elm_widget_is(parent)) break;
+        elm_parent = evas_object_data_get(parent, "elm-parent");
         if (elm_parent) parent = elm_parent;
-       else parent = evas_object_smart_parent_get(parent);
+        else parent = evas_object_smart_parent_get(parent);
      }
    return parent;
 }
 
 EAPI void
-elm_widget_event_callback_add(Evas_Object *obj, Elm_Event_Cb func, const void *data)
+elm_widget_event_callback_add(Evas_Object *obj,
+                              Elm_Event_Cb func,
+                              const void  *data)
 {
    API_ENTRY return;
    EINA_SAFETY_ON_NULL_RETURN(func);
@@ -1025,24 +1255,29 @@ elm_widget_event_callback_add(Evas_Object *obj, Elm_Event_Cb func, const void *d
 }
 
 EAPI void *
-elm_widget_event_callback_del(Evas_Object *obj, Elm_Event_Cb func, const void *data)
+elm_widget_event_callback_del(Evas_Object *obj,
+                              Elm_Event_Cb func,
+                              const void  *data)
 {
    API_ENTRY return NULL;
    EINA_SAFETY_ON_NULL_RETURN_VAL(func, NULL);
    Eina_List *l;
    Elm_Event_Cb_Data *ecd;
    EINA_LIST_FOREACH(sd->event_cb, l, ecd)
-      if ((ecd->func == func) && (ecd->data == data))
-        {
-           free(ecd);
-           sd->event_cb = eina_list_remove_list(sd->event_cb, l);
-           return (void *)data;
-        }
+     if ((ecd->func == func) && (ecd->data == data))
+       {
+          free(ecd);
+          sd->event_cb = eina_list_remove_list(sd->event_cb, l);
+          return (void *)data;
+       }
    return NULL;
 }
 
 EAPI Eina_Bool
-elm_widget_event_propagate(Evas_Object *obj, Evas_Callback_Type type, void *event_info, Evas_Event_Flags *event_flags)
+elm_widget_event_propagate(Evas_Object       *obj,
+                           Evas_Callback_Type type,
+                           void              *event_info,
+                           Evas_Event_Flags  *event_flags)
 {
    API_ENTRY return EINA_FALSE; //TODO reduce.
    if (!_elm_widget_is(obj)) return EINA_FALSE;
@@ -1064,7 +1299,7 @@ elm_widget_event_propagate(Evas_Object *obj, Evas_Callback_Type type, void *even
           {
              if (ecd->func((void *)ecd->data, parent, obj, type, event_info) ||
                  (event_flags && ((*event_flags) & EVAS_EVENT_FLAG_ON_HOLD)))
-                 return EINA_TRUE;
+               return EINA_TRUE;
           }
         parent = sd->parent_obj;
      }
@@ -1088,7 +1323,8 @@ elm_widget_event_propagate(Evas_Object *obj, Evas_Callback_Type type, void *even
  * @ingroup Widget
  */
 EAPI void
-elm_widget_focus_custom_chain_set(Evas_Object *obj, Eina_List *objs)
+elm_widget_focus_custom_chain_set(Evas_Object *obj,
+                                  Eina_List   *objs)
 {
    API_ENTRY return;
    if (!sd->focus_next_func)
@@ -1120,7 +1356,7 @@ EAPI const Eina_List *
 elm_widget_focus_custom_chain_get(const Evas_Object *obj)
 {
    API_ENTRY return NULL;
-   return (const Eina_List *) sd->focus_chain;
+   return (const Eina_List *)sd->focus_chain;
 }
 
 /**
@@ -1162,7 +1398,9 @@ elm_widget_focus_custom_chain_unset(Evas_Object *obj)
  * @ingroup Widget
  */
 EAPI void
-elm_widget_focus_custom_chain_append(Evas_Object *obj, Evas_Object *child, Evas_Object *relative_child)
+elm_widget_focus_custom_chain_append(Evas_Object *obj,
+                                     Evas_Object *child,
+                                     Evas_Object *relative_child)
 {
    API_ENTRY return;
    EINA_SAFETY_ON_NULL_RETURN(child);
@@ -1198,7 +1436,9 @@ elm_widget_focus_custom_chain_append(Evas_Object *obj, Evas_Object *child, Evas_
  * @ingroup Widget
  */
 EAPI void
-elm_widget_focus_custom_chain_prepend(Evas_Object *obj, Evas_Object *child, Evas_Object *relative_child)
+elm_widget_focus_custom_chain_prepend(Evas_Object *obj,
+                                      Evas_Object *child,
+                                      Evas_Object *relative_child)
 {
    API_ENTRY return;
    EINA_SAFETY_ON_NULL_RETURN(child);
@@ -1233,7 +1473,8 @@ elm_widget_focus_custom_chain_prepend(Evas_Object *obj, Evas_Object *child, Evas
  * @ingroup Widget
  */
 EAPI void
-elm_widget_focus_cycle(Evas_Object *obj, Elm_Focus_Direction dir)
+elm_widget_focus_cycle(Evas_Object        *obj,
+                       Elm_Focus_Direction dir)
 {
    Evas_Object *target = NULL;
    if (!_elm_widget_is(obj))
@@ -1258,7 +1499,9 @@ elm_widget_focus_cycle(Evas_Object *obj, Elm_Focus_Direction dir)
  * @ingroup Widget
  */
 EAPI void
-elm_widget_focus_direction_go(Evas_Object *obj __UNUSED__, int x __UNUSED__, int y __UNUSED__)
+elm_widget_focus_direction_go(Evas_Object *obj __UNUSED__,
+                              int          x __UNUSED__,
+                              int          y __UNUSED__)
 {
    return; /* TODO */
 }
@@ -1281,7 +1524,9 @@ elm_widget_focus_direction_go(Evas_Object *obj __UNUSED__, int x __UNUSED__, int
  * @ingroup Widget
  */
 EAPI Eina_Bool
-elm_widget_focus_next_get(const Evas_Object *obj, Elm_Focus_Direction dir, Evas_Object **next)
+elm_widget_focus_next_get(const Evas_Object  *obj,
+                          Elm_Focus_Direction dir,
+                          Evas_Object       **next)
 {
    if (!next)
      return EINA_FALSE;
@@ -1290,7 +1535,9 @@ elm_widget_focus_next_get(const Evas_Object *obj, Elm_Focus_Direction dir, Evas_
    API_ENTRY return EINA_FALSE;
 
    /* Ignore if disabled */
-   if ((!evas_object_visible_get(obj)) || (elm_widget_disabled_get(obj)))
+   if ((!evas_object_visible_get(obj))
+       || (elm_widget_disabled_get(obj))
+       || (elm_widget_tree_unfocusable_get(obj)))
      return EINA_FALSE;
 
    /* Try use hook */
@@ -1305,7 +1552,6 @@ elm_widget_focus_next_get(const Evas_Object *obj, Elm_Focus_Direction dir, Evas_
    return !elm_widget_focus_get(obj);
 }
 
-
 /**
  * @internal
  *
@@ -1326,9 +1572,13 @@ elm_widget_focus_next_get(const Evas_Object *obj, Elm_Focus_Direction dir, Evas_
  * @ingroup Widget
  */
 EAPI Eina_Bool
-elm_widget_focus_list_next_get(const Evas_Object *obj, const Eina_List *items, void *(*list_data_get) (const Eina_List *list), Elm_Focus_Direction dir, Evas_Object **next)
+elm_widget_focus_list_next_get(const Evas_Object  *obj,
+                               const Eina_List    *items,
+                               void *(*list_data_get)(const Eina_List * list),
+                               Elm_Focus_Direction dir,
+                               Evas_Object       **next)
 {
-   Eina_List *(*list_next) (const Eina_List *list);
+   Eina_List *(*list_next)(const Eina_List * list);
 
    if (!next)
      return EINA_FALSE;
@@ -1387,7 +1637,7 @@ elm_widget_focus_list_next_get(const Evas_Object *obj, const Eina_List *items, v
    l = items;
 
    /* Get First possible */
-   for (;l != start; l = list_next(l))
+   for (; l != start; l = list_next(l))
      {
         Evas_Object *tmp = NULL;
         Evas_Object *cur = list_data_get(l);
@@ -1409,7 +1659,9 @@ elm_widget_focus_list_next_get(const Evas_Object *obj, const Eina_List *items, v
 }
 
 EAPI void
-elm_widget_signal_emit(Evas_Object *obj, const char *emission, const char *source)
+elm_widget_signal_emit(Evas_Object *obj,
+                       const char  *emission,
+                       const char  *source)
 {
    API_ENTRY return;
    if (!sd->signal_func) return;
@@ -1417,14 +1669,21 @@ elm_widget_signal_emit(Evas_Object *obj, const char *emission, const char *sourc
 }
 
 static void
-_edje_signal_callback(void *data, Evas_Object *obj __UNUSED__, const char *emission, const char *source)
+_edje_signal_callback(void        *data,
+                      Evas_Object *obj __UNUSED__,
+                      const char  *emission,
+                      const char  *source)
 {
    Edje_Signal_Data *esd = data;
    esd->func(esd->data, esd->obj, emission, source);
 }
 
 EAPI void
-elm_widget_signal_callback_add(Evas_Object *obj, const char *emission, const char *source, void (*func) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
+elm_widget_signal_callback_add(Evas_Object   *obj,
+                               const char    *emission,
+                               const char    *source,
+                               Edje_Signal_Cb func,
+                               void          *data)
 {
    Edje_Signal_Data *esd;
    API_ENTRY return;
@@ -1444,7 +1703,10 @@ elm_widget_signal_callback_add(Evas_Object *obj, const char *emission, const cha
 }
 
 EAPI void *
-elm_widget_signal_callback_del(Evas_Object *obj, const char *emission, const char *source, void (*func) (void *data, Evas_Object *o, const char *emission, const char *source))
+elm_widget_signal_callback_del(Evas_Object   *obj,
+                               const char    *emission,
+                               const char    *source,
+                               Edje_Signal_Cb func)
 {
    Edje_Signal_Data *esd;
    Eina_List *l;
@@ -1470,67 +1732,68 @@ elm_widget_signal_callback_del(Evas_Object *obj, const char *emission, const cha
 }
 
 EAPI void
-elm_widget_focus_set(Evas_Object *obj, int first)
+elm_widget_focus_set(Evas_Object *obj,
+                     int          first)
 {
    API_ENTRY return;
    if (!sd->focused)
      {
         focus_order++;
         sd->focus_order = focus_order;
-       sd->focused = EINA_TRUE;
-       if (sd->on_focus_func) sd->on_focus_func(sd->on_focus_data, obj);
+        sd->focused = EINA_TRUE;
+        if (sd->on_focus_func) sd->on_focus_func(sd->on_focus_data, obj);
      }
    if (sd->focus_func)
      {
-       sd->focus_func(obj);
-       return;
+        sd->focus_func(obj);
+        return;
      }
    else
      {
-       if (first)
-         {
-            if ((_is_focusable(sd->resize_obj)) &&
-                (!elm_widget_disabled_get(sd->resize_obj)))
-              {
-                 elm_widget_focus_set(sd->resize_obj, first);
-              }
-            else
-              {
-                 const Eina_List *l;
-                 Evas_Object *child;
-                 EINA_LIST_FOREACH(sd->subobjs, l, child)
-                   {
-                      if ((_is_focusable(child)) &&
-                          (!elm_widget_disabled_get(child)))
-                        {
-                           elm_widget_focus_set(child, first);
-                           break;
-                        }
-                   }
-              }
-         }
-       else
-         {
-            const Eina_List *l;
-            Evas_Object *child;
-            EINA_LIST_REVERSE_FOREACH(sd->subobjs, l, child)
-              {
-                 if ((_is_focusable(child)) &&
-                     (!elm_widget_disabled_get(child)))
-                   {
-                      elm_widget_focus_set(child, first);
-                      break;
-                   }
-              }
-            if (!l)
-              {
-                 if ((_is_focusable(sd->resize_obj)) &&
-                     (!elm_widget_disabled_get(sd->resize_obj)))
-                   {
-                      elm_widget_focus_set(sd->resize_obj, first);
-                   }
-              }
-         }
+        if (first)
+          {
+             if ((_is_focusable(sd->resize_obj)) &&
+                 (!elm_widget_disabled_get(sd->resize_obj)))
+               {
+                  elm_widget_focus_set(sd->resize_obj, first);
+               }
+             else
+               {
+                  const Eina_List *l;
+                  Evas_Object *child;
+                  EINA_LIST_FOREACH(sd->subobjs, l, child)
+                    {
+                       if ((_is_focusable(child)) &&
+                           (!elm_widget_disabled_get(child)))
+                         {
+                            elm_widget_focus_set(child, first);
+                            break;
+                         }
+                    }
+               }
+          }
+        else
+          {
+             const Eina_List *l;
+             Evas_Object *child;
+             EINA_LIST_REVERSE_FOREACH(sd->subobjs, l, child)
+               {
+                  if ((_is_focusable(child)) &&
+                      (!elm_widget_disabled_get(child)))
+                    {
+                       elm_widget_focus_set(child, first);
+                       break;
+                    }
+               }
+             if (!l)
+               {
+                  if ((_is_focusable(sd->resize_obj)) &&
+                      (!elm_widget_disabled_get(sd->resize_obj)))
+                    {
+                       elm_widget_focus_set(sd->resize_obj, first);
+                    }
+               }
+          }
      }
 }
 
@@ -1547,19 +1810,19 @@ elm_widget_focused_object_clear(Evas_Object *obj)
    API_ENTRY return;
    if (!sd->focused) return;
    if (elm_widget_focus_get(sd->resize_obj))
-      elm_widget_focused_object_clear(sd->resize_obj);
+     elm_widget_focused_object_clear(sd->resize_obj);
    else
      {
-       const Eina_List *l;
-       Evas_Object *child;
-       EINA_LIST_FOREACH(sd->subobjs, l, child)
-         {
-            if (elm_widget_focus_get(child))
-              {
-                 elm_widget_focused_object_clear(child);
-                 break;
-              }
-         }
+        const Eina_List *l;
+        Evas_Object *child;
+        EINA_LIST_FOREACH(sd->subobjs, l, child)
+          {
+             if (elm_widget_focus_get(child))
+               {
+                  elm_widget_focused_object_clear(child);
+                  break;
+               }
+          }
      }
    sd->focused = EINA_FALSE;
    if (sd->on_focus_func) sd->on_focus_func(sd->on_focus_data, obj);
@@ -1574,42 +1837,84 @@ elm_widget_focus_steal(Evas_Object *obj)
 
    if (sd->focused) return;
    if (sd->disabled) return;
+   if (!sd->can_focus) return;
+   if (sd->tree_unfocusable) return;
    parent = obj;
    for (;;)
      {
-       o = elm_widget_parent_get(parent);
-       if (!o) break;
-       sd = evas_object_smart_data_get(o);
-       if (sd->focused) break;
-       parent = o;
+        o = elm_widget_parent_get(parent);
+        if (!o) break;
+        sd = evas_object_smart_data_get(o);
+        if (sd->disabled || sd->tree_unfocusable) return;
+        if (sd->focused) break;
+        parent = o;
      }
    if (!elm_widget_parent_get(parent))
      elm_widget_focused_object_clear(parent);
    else
      {
-       parent = elm_widget_parent_get(parent);
-       sd = evas_object_smart_data_get(parent);
-        if (sd->resize_obj && elm_widget_focus_get(sd->resize_obj))
+        parent = elm_widget_parent_get(parent);
+        sd = evas_object_smart_data_get(parent);
+        if ((sd->resize_obj) && (elm_widget_focus_get(sd->resize_obj)))
           elm_widget_focused_object_clear(sd->resize_obj);
         else
-         {
-            const Eina_List *l;
-            Evas_Object *child;
-            EINA_LIST_FOREACH(sd->subobjs, l, child)
-              {
-                 if (elm_widget_focus_get(child))
-                   {
-                      elm_widget_focused_object_clear(child);
-                      break;
-                   }
-              }
-         }
+          {
+             const Eina_List *l;
+             Evas_Object *child;
+             EINA_LIST_FOREACH(sd->subobjs, l, child)
+               {
+                  if (elm_widget_focus_get(child))
+                    {
+                       elm_widget_focused_object_clear(child);
+                       break;
+                    }
+               }
+          }
      }
    _parent_focus(obj);
    return;
 }
 
 EAPI void
+elm_widget_focus_restore(Evas_Object *obj)
+{
+   Evas_Object *newest = NULL;
+   unsigned int newest_focus_order = 0;
+   API_ENTRY return;
+
+   newest = _newest_focus_order_get(obj, &newest_focus_order, EINA_TRUE);
+   if (newest)
+     {
+        elm_object_unfocus(newest);
+        elm_object_focus(newest);
+     }
+}
+
+void
+_elm_widget_top_win_focused_set(Evas_Object *obj, Eina_Bool top_win_focused)
+{
+   const Eina_List *l;
+   Evas_Object *child;
+   API_ENTRY return;
+
+   if (sd->top_win_focused == top_win_focused) return;
+   if (sd->resize_obj)
+     _elm_widget_top_win_focused_set(sd->resize_obj, top_win_focused);
+   EINA_LIST_FOREACH(sd->subobjs, l, child)
+     {
+        _elm_widget_top_win_focused_set(child, top_win_focused);
+     }
+   sd->top_win_focused = top_win_focused;
+}
+
+Eina_Bool
+_elm_widget_top_win_focused_get(const Evas_Object *obj)
+{
+   API_ENTRY return EINA_FALSE;
+   return sd->top_win_focused;
+}
+
+EAPI void
 elm_widget_activate(Evas_Object *obj)
 {
    API_ENTRY return;
@@ -1626,30 +1931,18 @@ elm_widget_change(Evas_Object *obj)
 }
 
 EAPI void
-elm_widget_disabled_set(Evas_Object *obj, int disabled)
+elm_widget_disabled_set(Evas_Object *obj,
+                        Eina_Bool    disabled)
 {
    API_ENTRY return;
 
    if (sd->disabled == disabled) return;
-   sd->disabled = disabled;
-   if (sd->focused)
-     {
-       Evas_Object *o, *parent;
-
-       parent = obj;
-       for (;;)
-         {
-            o = elm_widget_parent_get(parent);
-            if (!o) break;
-            parent = o;
-         }
-        if (elm_widget_focus_get(obj))
-          elm_widget_focus_cycle(parent, ELM_FOCUS_NEXT);
-     }
+   sd->disabled = !!disabled;
+   elm_widget_focus_disabled_handle(obj);
    if (sd->disable_func) sd->disable_func(obj);
 }
 
-EAPI int
+EAPI Eina_Bool
 elm_widget_disabled_get(const Evas_Object *obj)
 {
    API_ENTRY return 0;
@@ -1657,27 +1950,33 @@ elm_widget_disabled_get(const Evas_Object *obj)
 }
 
 EAPI void
-elm_widget_show_region_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
+elm_widget_show_region_set(Evas_Object *obj,
+                           Evas_Coord   x,
+                           Evas_Coord   y,
+                           Evas_Coord   w,
+                           Evas_Coord   h,
+                           Eina_Bool    forceshow)
 {
    Evas_Object *parent_obj, *child_obj;
    Evas_Coord px, py, cx, cy;
 
    API_ENTRY return;
-   if ((x == sd->rx) && (y == sd->ry) && (w == sd->rw) && (h == sd->rh)) return;
+   if (!forceshow && (x == sd->rx) && (y == sd->ry)
+            && (w == sd->rw) && (h == sd->rh)) return;
    sd->rx = x;
    sd->ry = y;
    sd->rw = w;
    sd->rh = h;
    if (sd->on_show_region_func)
-      sd->on_show_region_func(sd->on_show_region_data, obj);
+     sd->on_show_region_func(sd->on_show_region_data, obj);
 
    do
      {
         parent_obj = sd->parent_obj;
         child_obj = sd->obj;
+        if ((!parent_obj) || (!_elm_widget_is(parent_obj))) break;
         sd = evas_object_smart_data_get(parent_obj);
-
-        if ((!parent_obj) || (!sd) || (!_elm_widget_is(parent_obj))) break;
+        if (!sd) break;
 
         evas_object_geometry_get(parent_obj, &px, &py, NULL, NULL);
         evas_object_geometry_get(child_obj, &cx, &cy, NULL, NULL);
@@ -1698,7 +1997,11 @@ elm_widget_show_region_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Co
 }
 
 EAPI void
-elm_widget_show_region_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
+elm_widget_show_region_get(const Evas_Object *obj,
+                           Evas_Coord        *x,
+                           Evas_Coord        *y,
+                           Evas_Coord        *w,
+                           Evas_Coord        *h)
 {
    API_ENTRY return;
    if (x) *x = sd->rx;
@@ -1728,7 +2031,11 @@ elm_widget_show_region_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y,
  * @ingroup Widget
  */
 EAPI void
-elm_widget_focus_region_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
+elm_widget_focus_region_get(const Evas_Object *obj,
+                            Evas_Coord        *x,
+                            Evas_Coord        *y,
+                            Evas_Coord        *w,
+                            Evas_Coord        *h)
 {
    Smart_Data *sd;
 
@@ -1751,7 +2058,7 @@ elm_widget_scroll_hold_push(Evas_Object *obj)
    API_ENTRY return;
    sd->scroll_hold++;
    if (sd->scroll_hold == 1)
-      evas_object_smart_callback_call(obj, "scroll-hold-on", obj);
+     evas_object_smart_callback_call(obj, "scroll-hold-on", obj);
    if (sd->parent_obj) elm_widget_scroll_hold_push(sd->parent_obj);
    // FIXME: on delete/reparent hold pop
 }
@@ -1763,7 +2070,7 @@ elm_widget_scroll_hold_pop(Evas_Object *obj)
    sd->scroll_hold--;
    if (sd->scroll_hold < 0) sd->scroll_hold = 0;
    if (!sd->scroll_hold)
-      evas_object_smart_callback_call(obj, "scroll-hold-off", obj);
+     evas_object_smart_callback_call(obj, "scroll-hold-off", obj);
    if (sd->parent_obj) elm_widget_scroll_hold_pop(sd->parent_obj);
 }
 
@@ -1780,7 +2087,7 @@ elm_widget_scroll_freeze_push(Evas_Object *obj)
    API_ENTRY return;
    sd->scroll_freeze++;
    if (sd->scroll_freeze == 1)
-      evas_object_smart_callback_call(obj, "scroll-freeze-on", obj);
+     evas_object_smart_callback_call(obj, "scroll-freeze-on", obj);
    if (sd->parent_obj) elm_widget_scroll_freeze_push(sd->parent_obj);
    // FIXME: on delete/reparent freeze pop
 }
@@ -1792,7 +2099,7 @@ elm_widget_scroll_freeze_pop(Evas_Object *obj)
    sd->scroll_freeze--;
    if (sd->scroll_freeze < 0) sd->scroll_freeze = 0;
    if (!sd->scroll_freeze)
-      evas_object_smart_callback_call(obj, "scroll-freeze-off", obj);
+     evas_object_smart_callback_call(obj, "scroll-freeze-off", obj);
    if (sd->parent_obj) elm_widget_scroll_freeze_pop(sd->parent_obj);
 }
 
@@ -1804,14 +2111,15 @@ elm_widget_scroll_freeze_get(const Evas_Object *obj)
 }
 
 EAPI void
-elm_widget_scale_set(Evas_Object *obj, double scale)
+elm_widget_scale_set(Evas_Object *obj,
+                     double       scale)
 {
    API_ENTRY return;
    if (scale <= 0.0) scale = 0.0;
    if (sd->scale != scale)
      {
-       sd->scale = scale;
-       elm_widget_theme(obj);
+        sd->scale = scale;
+        elm_widget_theme(obj);
      }
 }
 
@@ -1822,16 +2130,17 @@ elm_widget_scale_get(const Evas_Object *obj)
    // FIXME: save walking up the tree by storing/caching parent scale
    if (sd->scale == 0.0)
      {
-       if (sd->parent_obj)
-           return elm_widget_scale_get(sd->parent_obj);
-       else
-           return 1.0;
+        if (sd->parent_obj)
+          return elm_widget_scale_get(sd->parent_obj);
+        else
+          return 1.0;
      }
    return sd->scale;
 }
 
 EAPI void
-elm_widget_theme_set(Evas_Object *obj, Elm_Theme *th)
+elm_widget_theme_set(Evas_Object *obj,
+                     Elm_Theme   *th)
 {
    API_ENTRY return;
    if (sd->theme != th)
@@ -1843,6 +2152,55 @@ elm_widget_theme_set(Evas_Object *obj, Elm_Theme *th)
      }
 }
 
+EAPI void
+elm_widget_text_part_set(Evas_Object *obj, const char *item, const char *label)
+{
+   API_ENTRY return;
+
+   if (!sd->on_text_set_func)
+     return;
+
+   sd->on_text_set_func(obj, item, label);
+}
+
+EAPI const char *
+elm_widget_text_part_get(const Evas_Object *obj, const char *item)
+{
+   API_ENTRY return NULL;
+
+   if (!sd->on_text_get_func)
+     return NULL;
+
+   return sd->on_text_get_func(obj, item);
+}
+
+EAPI void
+elm_widget_content_part_set(Evas_Object *obj, const char *part, Evas_Object *content)
+{
+   API_ENTRY return;
+
+   if (!sd->on_content_set_func)  return;
+   sd->on_content_set_func(obj, part, content);
+}
+
+EAPI Evas_Object *
+elm_widget_content_part_get(const Evas_Object *obj, const char *part)
+{
+   API_ENTRY return NULL;
+
+   if (!sd->on_content_get_func) return NULL;
+   return sd->on_content_get_func(obj, part);
+}
+
+EAPI Evas_Object *
+elm_widget_content_part_unset(Evas_Object *obj, const char *part)
+{
+   API_ENTRY return NULL;
+
+   if (!sd->on_content_unset_func) return NULL;
+   return sd->on_content_unset_func(obj, part);
+}
+
 EAPI Elm_Theme *
 elm_widget_theme_get(const Evas_Object *obj)
 {
@@ -1850,20 +2208,21 @@ elm_widget_theme_get(const Evas_Object *obj)
    if (!sd->theme)
      {
         if (sd->parent_obj)
-           return elm_widget_theme_get(sd->parent_obj);
+          return elm_widget_theme_get(sd->parent_obj);
         else
-           return NULL;
+          return NULL;
      }
    return sd->theme;
 }
 
 EAPI void
-elm_widget_style_set(Evas_Object *obj, const char *style)
+elm_widget_style_set(Evas_Object *obj,
+                     const char  *style)
 {
    API_ENTRY return;
 
    if (eina_stringshare_replace(&sd->style, style))
-      elm_widget_theme(obj);
+     elm_widget_theme(obj);
 }
 
 EAPI const char *
@@ -1875,7 +2234,8 @@ elm_widget_style_get(const Evas_Object *obj)
 }
 
 EAPI void
-elm_widget_type_set(Evas_Object *obj, const char *type)
+elm_widget_type_set(Evas_Object *obj,
+                    const char  *type)
 {
    API_ENTRY return;
    eina_stringshare_replace(&sd->type, type);
@@ -1890,35 +2250,40 @@ elm_widget_type_get(const Evas_Object *obj)
 }
 
 EAPI void
-elm_widget_tooltip_add(Evas_Object *obj, Elm_Tooltip *tt)
+elm_widget_tooltip_add(Evas_Object *obj,
+                       Elm_Tooltip *tt)
 {
    API_ENTRY return;
    sd->tooltips = eina_list_append(sd->tooltips, tt);
 }
 
 EAPI void
-elm_widget_tooltip_del(Evas_Object *obj, Elm_Tooltip *tt)
+elm_widget_tooltip_del(Evas_Object *obj,
+                       Elm_Tooltip *tt)
 {
    API_ENTRY return;
    sd->tooltips = eina_list_remove(sd->tooltips, tt);
 }
 
 EAPI void
-elm_widget_cursor_add(Evas_Object *obj, Elm_Cursor *cur)
+elm_widget_cursor_add(Evas_Object *obj,
+                      Elm_Cursor  *cur)
 {
    API_ENTRY return;
    sd->cursors = eina_list_append(sd->cursors, cur);
 }
 
 EAPI void
-elm_widget_cursor_del(Evas_Object *obj, Elm_Cursor *cur)
+elm_widget_cursor_del(Evas_Object *obj,
+                      Elm_Cursor  *cur)
 {
    API_ENTRY return;
    sd->cursors = eina_list_remove(sd->cursors, cur);
 }
 
 EAPI void
-elm_widget_drag_lock_x_set(Evas_Object *obj, Eina_Bool lock)
+elm_widget_drag_lock_x_set(Evas_Object *obj,
+                           Eina_Bool    lock)
 {
    API_ENTRY return;
    if (sd->drag_x_locked == lock) return;
@@ -1928,7 +2293,8 @@ elm_widget_drag_lock_x_set(Evas_Object *obj, Eina_Bool lock)
 }
 
 EAPI void
-elm_widget_drag_lock_y_set(Evas_Object *obj, Eina_Bool lock)
+elm_widget_drag_lock_y_set(Evas_Object *obj,
+                           Eina_Bool    lock)
 {
    API_ENTRY return;
    if (sd->drag_y_locked == lock) return;
@@ -1966,14 +2332,19 @@ elm_widget_drag_child_locked_y_get(const Evas_Object *obj)
 }
 
 EAPI Eina_Bool
-elm_widget_theme_object_set(Evas_Object *obj, Evas_Object *edj, const char *wname, const char *welement, const char *wstyle)
+elm_widget_theme_object_set(Evas_Object *obj,
+                            Evas_Object *edj,
+                            const char  *wname,
+                            const char  *welement,
+                            const char  *wstyle)
 {
    API_ENTRY return EINA_FALSE;
    return _elm_theme_object_set(obj, edj, wname, welement, wstyle);
 }
 
 EAPI Eina_Bool
-elm_widget_type_check(const Evas_Object *obj, const char *type)
+elm_widget_type_check(const Evas_Object *obj,
+                      const char        *type)
 {
    const char *provided, *expected = "(unknown)";
    static int abort_on_warn = -1;
@@ -1984,7 +2355,7 @@ elm_widget_type_check(const Evas_Object *obj, const char *type)
      {
         provided = evas_object_type_get(obj);
         if ((!provided) || (!provided[0]))
-           provided = "(unknown)";
+          provided = "(unknown)";
      }
    ERR("Passing Object: %p, of type: '%s' when expecting type: '%s'", obj, provided, expected);
    if (abort_on_warn == -1)
@@ -2015,19 +2386,19 @@ elm_widget_stringlist_get(const char *str)
    if (!str) return NULL;
    for (b = s = str; 1; s++)
      {
-       if ((*s == ' ') || (!*s))
-         {
-            char *t = malloc(s - b + 1);
-            if (t)
-              {
-                 strncpy(t, b, s - b);
-                 t[s - b] = 0;
-                 list = eina_list_append(list, eina_stringshare_add(t));
-                 free(t);
-              }
-            b = s + 1;
-         }
-       if (!*s) break;
+        if ((*s == ' ') || (!*s))
+          {
+             char *t = malloc(s - b + 1);
+             if (t)
+               {
+                  strncpy(t, b, s - b);
+                  t[s - b] = 0;
+                  list = eina_list_append(list, eina_stringshare_add(t));
+                  free(t);
+               }
+             b = s + 1;
+          }
+        if (!*s) break;
      }
    return list;
 }
@@ -2039,6 +2410,46 @@ elm_widget_stringlist_free(Eina_List *list)
    EINA_LIST_FREE(list, s) eina_stringshare_del(s);
 }
 
+EAPI void
+elm_widget_focus_hide_handle(Evas_Object *obj)
+{
+   _if_focused_revert(obj, EINA_TRUE);
+}
+
+EAPI void
+elm_widget_focus_mouse_down_handle(Evas_Object *obj)
+{
+   Evas_Object *o = obj;
+   do
+     {
+        if (_elm_widget_is(o)) break;
+        o = evas_object_smart_parent_get(o);
+     }
+   while (o);
+   if (!o) return;
+   if (!_is_focusable(o)) return;
+   elm_widget_focus_steal(o);
+}
+
+EAPI void
+elm_widget_focus_tree_unfocusable_handle(Evas_Object *obj)
+{
+   API_ENTRY return;
+
+   if (!elm_widget_parent_get(obj))
+     elm_widget_focused_object_clear(obj);
+   else
+     _if_focused_revert(obj, EINA_TRUE);
+}
+
+EAPI void
+elm_widget_focus_disabled_handle(Evas_Object *obj)
+{
+   API_ENTRY return;
+
+   elm_widget_focus_tree_unfocusable_handle(obj);
+}
+
 /**
  * @internal
  *
@@ -2059,7 +2470,8 @@ elm_widget_stringlist_free(Eina_List *list)
  * @ingroup Widget
  */
 EAPI Elm_Widget_Item *
-_elm_widget_item_new(Evas_Object *widget, size_t alloc_size)
+_elm_widget_item_new(Evas_Object *widget,
+                     size_t       alloc_size)
 {
    if (!_elm_widget_is(widget))
      return NULL;
@@ -2151,7 +2563,8 @@ _elm_widget_item_pre_notify_del(Elm_Widget_Item *item)
  * @ingroup Widget
  */
 EAPI void
-_elm_widget_item_del_cb_set(Elm_Widget_Item *item, Evas_Smart_Cb del_cb)
+_elm_widget_item_del_cb_set(Elm_Widget_Item *item,
+                            Evas_Smart_Cb    del_cb)
 {
    ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
 
@@ -2177,7 +2590,8 @@ _elm_widget_item_del_cb_set(Elm_Widget_Item *item, Evas_Smart_Cb del_cb)
  * @ingroup Widget
  */
 EAPI void
-_elm_widget_item_data_set(Elm_Widget_Item *item, const void *data)
+_elm_widget_item_data_set(Elm_Widget_Item *item,
+                          const void      *data)
 {
    ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
    if ((item->data) && (item->data != data))
@@ -2205,25 +2619,29 @@ typedef struct _Elm_Widget_Item_Tooltip Elm_Widget_Item_Tooltip;
 
 struct _Elm_Widget_Item_Tooltip
 {
-   Elm_Widget_Item             *item;
-   Elm_Tooltip_Item_Content_Cb  func;
-   Evas_Smart_Cb                del_cb;
-   const void                  *data;
+   Elm_Widget_Item            *item;
+   Elm_Tooltip_Item_Content_Cb func;
+   Evas_Smart_Cb               del_cb;
+   const void                 *data;
 };
 
 static Evas_Object *
-_elm_widget_item_tooltip_label_create(void *data, Evas_Object *obj, void *item __UNUSED__)
+_elm_widget_item_tooltip_label_create(void        *data,
+                                      Evas_Object *obj,
+                                      void        *item __UNUSED__)
 {
    Evas_Object *label = elm_label_add(obj);
    if (!label)
      return NULL;
    elm_object_style_set(label, "tooltip");
-   elm_label_label_set(label, data);
+   elm_object_text_set(label, data);
    return label;
 }
 
 static void
-_elm_widget_item_tooltip_label_del_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+_elm_widget_item_tooltip_label_del_cb(void        *data,
+                                      Evas_Object *obj __UNUSED__,
+                                      void        *event_info __UNUSED__)
 {
    eina_stringshare_del(data);
 }
@@ -2242,7 +2660,8 @@ _elm_widget_item_tooltip_label_del_cb(void *data, Evas_Object *obj __UNUSED__, v
  * @ingroup Widget
  */
 EAPI void
-_elm_widget_item_tooltip_text_set(Elm_Widget_Item *item, const char *text)
+_elm_widget_item_tooltip_text_set(Elm_Widget_Item *item,
+                                  const char      *text)
 {
    ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
    EINA_SAFETY_ON_NULL_RETURN(text);
@@ -2250,18 +2669,21 @@ _elm_widget_item_tooltip_text_set(Elm_Widget_Item *item, const char *text)
    text = eina_stringshare_add(text);
    _elm_widget_item_tooltip_content_cb_set
      (item, _elm_widget_item_tooltip_label_create, text,
-      _elm_widget_item_tooltip_label_del_cb);
+     _elm_widget_item_tooltip_label_del_cb);
 }
 
 static Evas_Object *
-_elm_widget_item_tooltip_create(void *data, Evas_Object *obj)
+_elm_widget_item_tooltip_create(void        *data,
+                                Evas_Object *obj)
 {
    Elm_Widget_Item_Tooltip *wit = data;
    return wit->func((void *)wit->data, obj, wit->item);
 }
 
 static void
-_elm_widget_item_tooltip_del_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
+_elm_widget_item_tooltip_del_cb(void        *data,
+                                Evas_Object *obj,
+                                void        *event_info __UNUSED__)
 {
    Elm_Widget_Item_Tooltip *wit = data;
    if (wit->del_cb) wit->del_cb((void *)wit->data, obj, wit->item);
@@ -2291,7 +2713,10 @@ _elm_widget_item_tooltip_del_cb(void *data, Evas_Object *obj, void *event_info _
  * @ingroup Widget
  */
 EAPI void
-_elm_widget_item_tooltip_content_cb_set(Elm_Widget_Item *item, Elm_Tooltip_Item_Content_Cb func, const void *data, Evas_Smart_Cb del_cb)
+_elm_widget_item_tooltip_content_cb_set(Elm_Widget_Item            *item,
+                                        Elm_Tooltip_Item_Content_Cb func,
+                                        const void                 *data,
+                                        Evas_Smart_Cb               del_cb)
 {
    Elm_Widget_Item_Tooltip *wit;
 
@@ -2312,14 +2737,14 @@ _elm_widget_item_tooltip_content_cb_set(Elm_Widget_Item *item, Elm_Tooltip_Item_
 
    elm_object_sub_tooltip_content_cb_set
      (item->view, item->widget, _elm_widget_item_tooltip_create, wit,
-      _elm_widget_item_tooltip_del_cb);
+     _elm_widget_item_tooltip_del_cb);
 
    return;
 
- error_noitem:
+error_noitem:
    if (del_cb) del_cb((void *)data, NULL, item);
    return;
- error:
+error:
    if (del_cb) del_cb((void *)data, item->widget, item);
 }
 
@@ -2360,7 +2785,8 @@ _elm_widget_item_tooltip_unset(Elm_Widget_Item *item)
  * @ingroup Widget
  */
 EAPI void
-_elm_widget_item_tooltip_style_set(Elm_Widget_Item *item, const char *style)
+_elm_widget_item_tooltip_style_set(Elm_Widget_Item *item,
+                                   const char      *style)
 {
    ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
    elm_object_tooltip_style_set(item->view, style);
@@ -2385,7 +2811,8 @@ _elm_widget_item_tooltip_style_get(const Elm_Widget_Item *item)
 }
 
 EAPI void
-_elm_widget_item_cursor_set(Elm_Widget_Item *item, const char *cursor)
+_elm_widget_item_cursor_set(Elm_Widget_Item *item,
+                            const char      *cursor)
 {
    ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
    elm_object_sub_cursor_set(item->view, item->widget, cursor);
@@ -2419,7 +2846,8 @@ _elm_widget_item_cursor_unset(Elm_Widget_Item *item)
  * @ingroup Widget
  */
 EAPI void
-_elm_widget_item_cursor_style_set(Elm_Widget_Item *item, const char *style)
+_elm_widget_item_cursor_style_set(Elm_Widget_Item *item,
+                                  const char      *style)
 {
    ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
    elm_object_cursor_style_set(item->view, style);
@@ -2460,7 +2888,8 @@ _elm_widget_item_cursor_style_get(const Elm_Widget_Item *item)
  * @ingroup Widget
  */
 EAPI void
-_elm_widget_item_cursor_engine_only_set(Elm_Widget_Item *item, Eina_Bool engine_only)
+_elm_widget_item_cursor_engine_only_set(Elm_Widget_Item *item,
+                                        Eina_Bool        engine_only)
 {
    ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
    elm_object_cursor_engine_only_set(item->view, engine_only);
@@ -2492,15 +2921,102 @@ _smart_reconfigure(Smart_Data *sd)
    if (sd->resize_obj)
      {
         evas_object_move(sd->resize_obj, sd->x, sd->y);
-       evas_object_resize(sd->resize_obj, sd->w, sd->h);
+        evas_object_resize(sd->resize_obj, sd->w, sd->h);
      }
    if (sd->hover_obj)
      {
         evas_object_move(sd->hover_obj, sd->x, sd->y);
-       evas_object_resize(sd->hover_obj, sd->w, sd->h);
+        evas_object_resize(sd->hover_obj, sd->w, sd->h);
      }
 }
 
+EAPI void
+_elm_widget_item_content_part_set(Elm_Widget_Item *item,
+                                 const char *part,
+                                 Evas_Object *content)
+{
+   ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
+   if (!item->on_content_set_func) return;
+   item->on_content_set_func((Elm_Object_Item *) item, part, content);
+}
+
+EAPI Evas_Object *
+_elm_widget_item_content_part_get(const Elm_Widget_Item *item,
+                                  const char *part)
+{
+   ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL);
+   if (!item->on_content_get_func) return NULL;
+   return item->on_content_get_func((Elm_Object_Item *) item, part);
+}
+
+EAPI Evas_Object *
+_elm_widget_item_content_part_unset(Elm_Widget_Item *item,
+                                    const char *part)
+{
+   ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL);
+   if (!item->on_content_unset_func) return NULL;
+   return item->on_content_unset_func((Elm_Object_Item *) item, part);
+}
+
+EAPI void
+_elm_widget_item_text_part_set(Elm_Widget_Item *item,
+                              const char *part,
+                              const char *label)
+{
+   ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
+   if (!item->on_text_set_func) return;
+   item->on_text_set_func((Elm_Object_Item *) item, part, label);
+}
+
+EAPI const char *
+_elm_widget_item_text_part_get(const Elm_Widget_Item *item,
+                               const char *part)
+{
+   ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL);
+   if (!item->on_text_get_func) return NULL;
+   return item->on_text_get_func((Elm_Object_Item *) item, part);
+}
+
+EAPI void
+_elm_widget_item_content_set_hook_set(Elm_Widget_Item *item,
+                                      Elm_Widget_On_Content_Set_Cb func)
+{
+   ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
+   item->on_content_set_func = func;
+}
+
+EAPI void
+_elm_widget_item_content_get_hook_set(Elm_Widget_Item *item,
+                                      Elm_Widget_On_Content_Get_Cb func)
+{
+   ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
+   item->on_content_get_func = func;
+}
+
+EAPI void
+_elm_widget_item_content_unset_hook_set(Elm_Widget_Item *item,
+                                        Elm_Widget_On_Content_Unset_Cb func)
+{
+   ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
+   item->on_content_unset_func = func;
+}
+
+EAPI void
+_elm_widget_item_text_set_hook_set(Elm_Widget_Item *item,
+                                   Elm_Widget_On_Text_Set_Cb func)
+{
+   ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
+   item->on_text_set_func = func;
+}
+
+EAPI void
+_elm_widget_item_text_get_hook_set(Elm_Widget_Item *item,
+                                   Elm_Widget_On_Text_Get_Cb func)
+{
+   ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
+   item->on_text_get_func = func;
+}
+
 static void
 _smart_add(Evas_Object *obj)
 {
@@ -2516,13 +3032,20 @@ _smart_add(Evas_Object *obj)
 }
 
 static Evas_Object *
-_newest_focus_order_get(Evas_Object *obj, unsigned int *newest_focus_order, Eina_Bool can_focus_only)
+_newest_focus_order_get(Evas_Object  *obj,
+                        unsigned int *newest_focus_order,
+                        Eina_Bool     can_focus_only)
 {
    const Eina_List *l;
    Evas_Object *child, *ret, *best;
 
    API_ENTRY return NULL;
-   if (!evas_object_visible_get(obj)) return NULL;
+
+   if (!evas_object_visible_get(obj)
+       || (elm_widget_disabled_get(obj))
+       || (elm_widget_tree_unfocusable_get(obj)))
+     return NULL;
+
    best = NULL;
    if (*newest_focus_order < sd->focus_order)
      {
@@ -2538,19 +3061,20 @@ _newest_focus_order_get(Evas_Object *obj, unsigned int *newest_focus_order, Eina
    if (can_focus_only)
      {
         if ((!best) || (!elm_widget_can_focus_get(best)))
-         return NULL;
+          return NULL;
      }
    return best;
 }
 
 static void
-_if_focused_revert(Evas_Object *obj, Eina_Bool can_focus_only)
+_if_focused_revert(Evas_Object *obj,
+                   Eina_Bool    can_focus_only)
 {
    Evas_Object *top;
    Evas_Object *newest = NULL;
    unsigned int newest_focus_order = 0;
 
-   INTERNAL_ENTRY;
+   INTERNAL_ENTRY
 
    if (!sd->focused) return;
    if (!sd->parent_obj) return;
@@ -2573,30 +3097,30 @@ _smart_del(Evas_Object *obj)
    Evas_Object *sobj;
    Edje_Signal_Data *esd;
 
-   INTERNAL_ENTRY;
+   INTERNAL_ENTRY
 
    if (sd->del_pre_func) sd->del_pre_func(obj);
    if (sd->resize_obj)
      {
-       sobj = sd->resize_obj;
-       sd->resize_obj = NULL;
-       evas_object_event_callback_del_full(sobj, EVAS_CALLBACK_DEL, _sub_obj_del, sd);
-       evas_object_smart_callback_call(sd->obj, "sub-object-del", sobj);
-       evas_object_del(sobj);
+        sobj = sd->resize_obj;
+        sd->resize_obj = NULL;
+        evas_object_event_callback_del_full(sobj, EVAS_CALLBACK_DEL, _sub_obj_del, sd);
+        evas_object_smart_callback_call(sd->obj, "sub-object-del", sobj);
+        evas_object_del(sobj);
      }
    if (sd->hover_obj)
      {
-       sobj = sd->hover_obj;
-       sd->hover_obj = NULL;
-       evas_object_event_callback_del_full(sobj, EVAS_CALLBACK_DEL, _sub_obj_del, sd);
-       evas_object_smart_callback_call(sd->obj, "sub-object-del", sobj);
-       evas_object_del(sobj);
+        sobj = sd->hover_obj;
+        sd->hover_obj = NULL;
+        evas_object_event_callback_del_full(sobj, EVAS_CALLBACK_DEL, _sub_obj_del, sd);
+        evas_object_smart_callback_call(sd->obj, "sub-object-del", sobj);
+        evas_object_del(sobj);
      }
    EINA_LIST_FREE(sd->subobjs, sobj)
      {
-       evas_object_event_callback_del_full(sobj, EVAS_CALLBACK_DEL, _sub_obj_del, sd);
-       evas_object_smart_callback_call(sd->obj, "sub-object-del", sobj);
-       evas_object_del(sobj);
+        evas_object_event_callback_del_full(sobj, EVAS_CALLBACK_DEL, _sub_obj_del, sd);
+        evas_object_smart_callback_call(sd->obj, "sub-object-del", sobj);
+        evas_object_del(sobj);
      }
    eina_list_free(sd->tooltips); /* should be empty anyway */
    eina_list_free(sd->cursors); /* should be empty anyway */
@@ -2616,18 +3140,22 @@ _smart_del(Evas_Object *obj)
 }
 
 static void
-_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
+_smart_move(Evas_Object *obj,
+            Evas_Coord   x,
+            Evas_Coord   y)
 {
-   INTERNAL_ENTRY;
+   INTERNAL_ENTRY
    sd->x = x;
    sd->y = y;
    _smart_reconfigure(sd);
 }
 
 static void
-_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
+_smart_resize(Evas_Object *obj,
+              Evas_Coord   w,
+              Evas_Coord   h)
 {
-   INTERNAL_ENTRY;
+   INTERNAL_ENTRY
    sd->w = w;
    sd->h = h;
    _smart_reconfigure(sd);
@@ -2638,7 +3166,7 @@ _smart_show(Evas_Object *obj)
 {
    Eina_List *list;
    Evas_Object *o;
-   INTERNAL_ENTRY;
+   INTERNAL_ENTRY
    if ((list = evas_object_smart_members_get(obj)))
      {
         EINA_LIST_FREE(list, o)
@@ -2654,22 +3182,26 @@ _smart_hide(Evas_Object *obj)
 {
    Eina_List *list;
    Evas_Object *o;
-   INTERNAL_ENTRY;
+   INTERNAL_ENTRY
+
    list = evas_object_smart_members_get(obj);
    EINA_LIST_FREE(list, o)
      {
         if (evas_object_data_get(o, "_elm_leaveme")) continue;
         evas_object_hide(o);
      }
-   _if_focused_revert(obj, EINA_TRUE);
 }
 
 static void
-_smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
+_smart_color_set(Evas_Object *obj,
+                 int          r,
+                 int          g,
+                 int          b,
+                 int          a)
 {
    Eina_List *list;
    Evas_Object *o;
-   INTERNAL_ENTRY;
+   INTERNAL_ENTRY
    if ((list = evas_object_smart_members_get(obj)))
      {
         EINA_LIST_FREE(list, o)
@@ -2681,11 +3213,12 @@ _smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
 }
 
 static void
-_smart_clip_set(Evas_Object *obj, Evas_Object *clip)
+_smart_clip_set(Evas_Object *obj,
+                Evas_Object *clip)
 {
    Eina_List *list;
    Evas_Object *o;
-   INTERNAL_ENTRY;
+   INTERNAL_ENTRY
    if ((list = evas_object_smart_members_get(obj)))
      {
         EINA_LIST_FREE(list, o)
@@ -2701,7 +3234,7 @@ _smart_clip_unset(Evas_Object *obj)
 {
    Eina_List *list;
    Evas_Object *o;
-   INTERNAL_ENTRY;
+   INTERNAL_ENTRY
    if ((list = evas_object_smart_members_get(obj)))
      {
         EINA_LIST_FREE(list, o)
@@ -2715,7 +3248,7 @@ _smart_clip_unset(Evas_Object *obj)
 static void
 _smart_calculate(Evas_Object *obj)
 {
-   INTERNAL_ENTRY;
+   INTERNAL_ENTRY
    if (sd->changed_func) sd->changed_func(obj);
 }
 
@@ -2724,66 +3257,69 @@ static void
 _smart_init(void)
 {
    if (_e_smart) return;
-     {
-       static const Evas_Smart_Class sc =
-         {
-            SMART_NAME,
-             EVAS_SMART_CLASS_VERSION,
-             _smart_add,
-             _smart_del,
-             _smart_move,
-             _smart_resize,
-             _smart_show,
-             _smart_hide,
-             _smart_color_set,
-             _smart_clip_set,
-             _smart_clip_unset,
-             _smart_calculate,
-             NULL,
-             NULL,
-             NULL,
-             NULL,
-             NULL,
-             NULL
-         };
-       _e_smart = evas_smart_class_new(&sc);
-     }
+   {
+      static const Evas_Smart_Class sc =
+      {
+         SMART_NAME,
+         EVAS_SMART_CLASS_VERSION,
+         _smart_add,
+         _smart_del,
+         _smart_move,
+         _smart_resize,
+         _smart_show,
+         _smart_hide,
+         _smart_color_set,
+         _smart_clip_set,
+         _smart_clip_unset,
+         _smart_calculate,
+         NULL,
+         NULL,
+         NULL,
+         NULL,
+         NULL,
+         NULL
+      };
+      _e_smart = evas_smart_class_new(&sc);
+   }
 }
 
 /* happy debug functions */
 #ifdef ELM_DEBUG
 static void
-_sub_obj_tree_dump(const Evas_Object *o, int lvl)
+_sub_obj_tree_dump(const Evas_Object *obj,
+                   int                lvl)
 {
    int i;
 
-   for (i = 0; i < lvl*3; i++)
+   for (i = 0; i < lvl * 3; i++)
      putchar(' ');
 
-   if (_elm_widget_is(o))
+   if (_elm_widget_is(obj))
      {
         Eina_List *l;
-        Smart_Data *sd = evas_object_smart_data_get(o);
-        printf("+ %s(%p)\n", sd->type, o);
+        INTERNAL_ENTRY
+        printf("+ %s(%p)\n",
+               sd->type,
+               obj);
         if (sd->resize_obj)
           _sub_obj_tree_dump(sd->resize_obj, lvl + 1);
-        EINA_LIST_FOREACH(sd->subobjs, l, o)
+        EINA_LIST_FOREACH(sd->subobjs, l, obj)
           {
-             if (o != sd->resize_obj)
-               _sub_obj_tree_dump(o, lvl + 1);
+             if (obj != sd->resize_obj)
+               _sub_obj_tree_dump(obj, lvl + 1);
           }
      }
    else
-     printf("+ %s(%p)\n", evas_object_type_get(o), o);
+     printf("+ %s(%p)\n", evas_object_type_get(obj), obj);
 }
 
 static void
-_sub_obj_tree_dot_dump(const Evas_Object *obj, FILE *output)
+_sub_obj_tree_dot_dump(const Evas_Object *obj,
+                       FILE              *output)
 {
    if (!_elm_widget_is(obj))
      return;
-
-   Smart_Data *sd = evas_object_smart_data_get(obj);
+   INTERNAL_ENTRY
 
    Eina_Bool visible = evas_object_visible_get(obj);
    Eina_Bool disabled = elm_widget_disabled_get(obj);
@@ -2804,26 +3340,25 @@ _sub_obj_tree_dot_dump(const Evas_Object *obj, FILE *output)
      }
 
    fprintf(output, "\"%p\" [ label = \"{%p|%s|%s|visible: %d|"
-           "disabled: %d|focused: %d/%d|focus order:%d}\"", obj, obj, sd->type,
+                   "disabled: %d|focused: %d/%d|focus order:%d}\"", obj, obj, sd->type,
            evas_object_name_get(obj), visible, disabled, focused, can_focus,
            sd->focus_order);
 
    if (focused)
-        fprintf(output, ", style=bold");
+     fprintf(output, ", style=bold");
 
    if (!visible)
-        fprintf(output, ", fontcolor=gray28");
+     fprintf(output, ", fontcolor=gray28");
 
    if ((disabled) || (!visible))
-        fprintf(output, ", color=gray");
-
+     fprintf(output, ", color=gray");
 
    fprintf(output, " ];\n");
 
    Eina_List *l;
    Evas_Object *o;
    EINA_LIST_FOREACH(sd->subobjs, l, o)
-      _sub_obj_tree_dot_dump(o, output);
+     _sub_obj_tree_dot_dump(o, output);
 }
 #endif
 
@@ -2839,12 +3374,13 @@ elm_widget_tree_dump(const Evas_Object *top)
 }
 
 EAPI void
-elm_widget_tree_dot_dump(const Evas_Object *top, FILE *output)
+elm_widget_tree_dot_dump(const Evas_Object *top,
+                         FILE              *output)
 {
 #ifdef ELM_DEBUG
    if (!_elm_widget_is(top))
      return;
-   fprintf(output, "graph "" { node [shape=record];\n");
+   fprintf(output, "graph " " { node [shape=record];\n");
    _sub_obj_tree_dot_dump(top, output);
    fprintf(output, "}\n");
 #else