[*]Un-Rollback to 'Merge [elm_multibuttonentry]Changed edc TEXT part to TEXTBLOCK...
[framework/uifw/elementary.git] / src / lib / elm_widget.c
index 9b01098..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, 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);
-   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;
@@ -136,7 +184,7 @@ _unfocus_parents(Evas_Object *obj)
 {
    for (; obj; obj = elm_widget_parent_get(obj))
      {
-        INTERNAL_ENTRY;
+        INTERNAL_ENTRY
         if (!sd->focused) return;
         sd->focused = 0;
      }
@@ -147,14 +195,17 @@ _focus_parents(Evas_Object *obj)
 {
    for (; obj; obj = elm_widget_parent_get(obj))
      {
-        INTERNAL_ENTRY;
+        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;
 
@@ -172,85 +223,90 @@ _sub_obj_del(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info
 }
 
 static void
-_sub_obj_hide(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__)
 {
-   _if_focused_revert(obj, EINA_TRUE);
+   elm_widget_focus_hide_handle(obj);
 }
 
 static void
-_sub_obj_mouse_down(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+_sub_obj_mouse_down(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_mouse_down_handle(obj);
 }
 
 static void
-_propagate_x_drag_lock(Evas_Object *obj, int dir)
+_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);
-           if (sd2)
-             {
-                sd2->child_drag_x_locked += dir;
-                _propagate_x_drag_lock(sd->parent_obj, dir);
-             }
-        }
+   if (sd->parent_obj)
+     {
+        Smart_Data *sd2 = evas_object_smart_data_get(sd->parent_obj);
+        if (sd2)
+          {
+             sd2->child_drag_x_locked += dir;
+             _propagate_x_drag_lock(sd->parent_obj, dir);
+          }
+     }
 }
 
 static void
-_propagate_y_drag_lock(Evas_Object *obj, int dir)
+_propagate_y_drag_lock(Evas_Object *obj,
+                       int          dir)
 {
    INTERNAL_ENTRY
-      if (sd->parent_obj)
-        {
-           Smart_Data *sd2 = evas_object_smart_data_get(sd->parent_obj);
-           if (sd2)
-             {
-                sd2->child_drag_y_locked += dir;
-                _propagate_y_drag_lock(sd->parent_obj, dir);
-             }
-        }
+   if (sd->parent_obj)
+     {
+        Smart_Data *sd2 = evas_object_smart_data_get(sd->parent_obj);
+        if (sd2)
+          {
+             sd2->child_drag_y_locked += dir;
+             _propagate_y_drag_lock(sd->parent_obj, 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:
-           {
-              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);
+          }
+        break;
+
       case EVAS_CALLBACK_KEY_UP:
-           {
-              Evas_Event_Key_Up *ev = event_info;
-              event_flags = &(ev->event_flags);
-              break;
-           }
+          {
+             Evas_Event_Key_Up *ev = event_info;
+             event_flags = &(ev->event_flags);
+          }
+        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);
+          }
+        break;
+
       default:
-         break;
+        break;
      }
 
    elm_widget_event_propagate(obj, type, event_info, event_flags);
@@ -260,23 +316,12 @@ 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
@@ -285,17 +330,21 @@ _parent_focus(Evas_Object *obj)
 
    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, Edje_Signal_Cb func_cb, 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, Edje_Signal_Cb func_cb, 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;
@@ -507,7 +634,7 @@ elm_widget_theme_specific(Evas_Object *obj, Elm_Theme *th, Eina_Bool force)
      }
    if (!force) return;
    EINA_LIST_FOREACH(sd->subobjs, l, child)
-      elm_widget_theme_specific(child, th, force);
+     elm_widget_theme_specific(child, th, force);
    if (sd->resize_obj) elm_widget_theme(sd->resize_obj);
    if (sd->hover_obj) elm_widget_theme(sd->hover_obj);
    EINA_LIST_FOREACH(sd->tooltips, l, tt) elm_tooltip_theme(tt);
@@ -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,7 +683,8 @@ 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)
@@ -604,7 +735,8 @@ 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)
@@ -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;
           }
@@ -747,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;
@@ -767,10 +922,6 @@ elm_widget_sub_object_del(Evas_Object *obj, Evas_Object *sobj)
           }
         if (abort_on_warn == 1) abort();
      }
-   if (!sd->child_can_focus)
-     {
-        if (_is_focusable(sobj)) sd->child_can_focus = 0;
-     }
    if (_elm_widget_is(sobj))
      {
         Smart_Data *sd2 = evas_object_smart_data_get(sobj);
@@ -785,6 +936,20 @@ 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);
@@ -797,7 +962,8 @@ elm_widget_sub_object_del(Evas_Object *obj, Evas_Object *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
@@ -850,7 +1016,11 @@ elm_widget_resize_object_set(Evas_Object *obj, Evas_Object *sobj)
         if (_elm_widget_is(sd->resize_obj))
           {
              Smart_Data *sd2 = evas_object_smart_data_get(sd->resize_obj);
-             if (sd2) sd2->parent_obj = 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);
           }
@@ -871,7 +1041,8 @@ 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)
@@ -889,7 +1060,8 @@ elm_widget_hover_object_set(Evas_Object *obj, Evas_Object *sobj)
 }
 
 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;
@@ -897,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);
@@ -930,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;
@@ -945,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;
@@ -1025,7 +1242,9 @@ elm_widget_parent_widget_get(const Evas_Object *obj)
 }
 
 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);
@@ -1036,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;
@@ -1099,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)
@@ -1131,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;
 }
 
 /**
@@ -1173,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);
@@ -1209,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);
@@ -1244,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))
@@ -1269,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 */
 }
@@ -1292,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;
@@ -1301,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 */
@@ -1316,7 +1552,6 @@ elm_widget_focus_next_get(const Evas_Object *obj, Elm_Focus_Direction dir, Evas_
    return !elm_widget_focus_get(obj);
 }
 
-
 /**
  * @internal
  *
@@ -1337,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;
@@ -1398,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);
@@ -1420,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;
@@ -1428,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, Edje_Signal_Cb func, 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;
@@ -1455,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, Edje_Signal_Cb func)
+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;
@@ -1481,7 +1732,8 @@ 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)
@@ -1585,12 +1837,15 @@ 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->disabled || sd->tree_unfocusable) return;
         if (sd->focused) break;
         parent = o;
      }
@@ -1621,6 +1876,45 @@ elm_widget_focus_steal(Evas_Object *obj)
 }
 
 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;
@@ -1637,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;
@@ -1668,13 +1950,19 @@ 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;
@@ -1709,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;
@@ -1739,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;
 
@@ -1815,7 +2111,8 @@ 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;
@@ -1842,7 +2139,8 @@ elm_widget_scale_get(const Evas_Object *obj)
 }
 
 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)
@@ -1854,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)
 {
@@ -1869,7 +2216,8 @@ elm_widget_theme_get(const Evas_Object *obj)
 }
 
 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;
 
@@ -1886,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);
@@ -1901,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;
@@ -1939,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;
@@ -1977,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;
@@ -2050,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
  *
@@ -2070,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;
@@ -2162,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);
 
@@ -2188,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))
@@ -2216,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);
 }
@@ -2253,26 +2660,30 @@ _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);
 
    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);
+     (item, _elm_widget_item_tooltip_label_create, text,
+     _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);
@@ -2302,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;
 
@@ -2322,8 +2736,8 @@ _elm_widget_item_tooltip_content_cb_set(Elm_Widget_Item *item, Elm_Tooltip_Item_
    wit->del_cb = del_cb;
 
    elm_object_sub_tooltip_content_cb_set
-      (item->view, item->widget, _elm_widget_item_tooltip_create, wit,
-       _elm_widget_item_tooltip_del_cb);
+     (item->view, item->widget, _elm_widget_item_tooltip_create, wit,
+     _elm_widget_item_tooltip_del_cb);
 
    return;
 
@@ -2371,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);
@@ -2396,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);
@@ -2430,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);
@@ -2471,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);
@@ -2512,6 +2930,93 @@ _smart_reconfigure(Smart_Data *sd)
      }
 }
 
+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)
 {
@@ -2527,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)
      {
@@ -2555,13 +3067,14 @@ _newest_focus_order_get(Evas_Object *obj, unsigned int *newest_focus_order, Eina
 }
 
 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;
@@ -2584,7 +3097,7 @@ _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)
@@ -2627,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);
@@ -2649,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)
@@ -2665,7 +3182,8 @@ _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)
      {
@@ -2675,11 +3193,15 @@ _smart_hide(Evas_Object *obj)
 }
 
 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)
@@ -2691,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)
@@ -2711,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)
@@ -2725,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);
 }
 
@@ -2734,47 +3257,50 @@ 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 *obj, 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(obj))
      {
         Eina_List *l;
         INTERNAL_ENTRY
-           printf("+ %s(%p)\n", sd->type, obj);
+        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, obj)
@@ -2788,13 +3314,14 @@ _sub_obj_tree_dump(const Evas_Object *obj, int lvl)
 }
 
 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;
    INTERNAL_ENTRY
 
-      Eina_Bool visible = evas_object_visible_get(obj);
+   Eina_Bool visible = evas_object_visible_get(obj);
    Eina_Bool disabled = elm_widget_disabled_get(obj);
    Eina_Bool focused = elm_widget_focus_get(obj);
    Eina_Bool can_focus = elm_widget_can_focus_get(obj);
@@ -2813,7 +3340,7 @@ _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);
 
@@ -2826,13 +3353,12 @@ _sub_obj_tree_dot_dump(const Evas_Object *obj, FILE *output)
    if ((disabled) || (!visible))
      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
 
@@ -2848,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