fix evil scroller self-feeing loop scrollbar sizing issues.
authorCarsten Haitzler <raster@rasterman.com>
Wed, 18 Jul 2012 06:59:16 +0000 (06:59 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Wed, 18 Jul 2012 06:59:16 +0000 (06:59 +0000)
SVN revision: 74041

ChangeLog
src/lib/elm_interface_scrollable.c
src/lib/elm_interface_scrollable.h
src/lib/elm_scroller.c

index ea7c8a4..d0800d6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
 
        * Disable html mode pastes from cnp to work around thunderbird.
 
+2012-07-18  Carsten Haitzler (The Rasterman)
+
+       * Fix evil little bug where scrolelrs with scrollbars make
+        self-feeding loops expecially with min size hints on scrollers (which
+        the change in smart object infra broke too - fixed here).
+
index 6d55679..bba923e 100644 (file)
@@ -576,45 +576,56 @@ _elm_scroll_scroll_bar_h_visibility_adjust(
      evas_object_geometry_get(sid->pan_obj, NULL, NULL, &vw, &vh);
    if (sid->hbar_visible)
      {
-        if (sid->hbar_flags == ELM_SCROLLER_POLICY_AUTO)
+        if (sid->min_w)
           {
-             if ((sid->content) || (sid->extern_pan))
+             scroll_h_vis_change = 1;
+             sid->hbar_visible = EINA_FALSE;
+          }
+        else
+          {
+             if (sid->hbar_flags == ELM_SCROLLER_POLICY_AUTO)
                {
-                  if (w <= vw)
+                  if ((sid->content) || (sid->extern_pan))
+                    {
+                       if (w <= vw)
+                         {
+                            scroll_h_vis_change = 1;
+                            sid->hbar_visible = EINA_FALSE;
+                         }
+                    }
+                  else
                     {
                        scroll_h_vis_change = 1;
                        sid->hbar_visible = EINA_FALSE;
                     }
                }
-             else
+             else if (sid->hbar_flags == ELM_SCROLLER_POLICY_OFF)
                {
                   scroll_h_vis_change = 1;
                   sid->hbar_visible = EINA_FALSE;
                }
           }
-        else if (sid->hbar_flags == ELM_SCROLLER_POLICY_OFF)
-          {
-             scroll_h_vis_change = 1;
-             sid->hbar_visible = EINA_FALSE;
-          }
      }
    else
      {
-        if (sid->hbar_flags == ELM_SCROLLER_POLICY_AUTO)
+        if (!sid->min_w)
           {
-             if ((sid->content) || (sid->extern_pan))
+             if (sid->hbar_flags == ELM_SCROLLER_POLICY_AUTO)
                {
-                  if (w > vw)
+                  if ((sid->content) || (sid->extern_pan))
                     {
-                       scroll_h_vis_change = 1;
-                       sid->hbar_visible = EINA_TRUE;
+                       if (w > vw)
+                         {
+                            scroll_h_vis_change = 1;
+                            sid->hbar_visible = EINA_TRUE;
+                         }
                     }
                }
-          }
-        else if (sid->hbar_flags == ELM_SCROLLER_POLICY_ON)
-          {
-             scroll_h_vis_change = 1;
-             sid->hbar_visible = EINA_TRUE;
+             else if (sid->hbar_flags == ELM_SCROLLER_POLICY_ON)
+               {
+                  scroll_h_vis_change = 1;
+                  sid->hbar_visible = EINA_TRUE;
+               }
           }
      }
    if (scroll_h_vis_change)
@@ -627,13 +638,13 @@ _elm_scroll_scroll_bar_h_visibility_adjust(
              else
                edje_object_signal_emit
                  (sid->edje_obj, "elm,action,hide,hbar", "elm");
-             edje_object_message_signal_process(sid->edje_obj);
-             _elm_scroll_scroll_bar_size_adjust(sid);
           }
         else
           edje_object_signal_emit
             (sid->edje_obj, "elm,action,hide,hbar", "elm");
+        edje_object_message_signal_process(sid->edje_obj);
         _elm_scroll_scroll_bar_size_adjust(sid);
+        elm_layout_sizing_eval(sid->obj);
      }
 
    return scroll_h_vis_change;
@@ -653,45 +664,56 @@ _elm_scroll_scroll_bar_v_visibility_adjust(
      evas_object_geometry_get(sid->pan_obj, NULL, NULL, &vw, &vh);
    if (sid->vbar_visible)
      {
-        if (sid->vbar_flags == ELM_SCROLLER_POLICY_AUTO)
+        if (sid->min_h)
+          {
+             scroll_v_vis_change = 1;
+             sid->vbar_visible = EINA_FALSE;
+          }
+        else
           {
-             if ((sid->content) || (sid->extern_pan))
+             if (sid->vbar_flags == ELM_SCROLLER_POLICY_AUTO)
                {
-                  if (h <= vh)
+                  if ((sid->content) || (sid->extern_pan))
+                    {
+                       if (h <= vh)
+                         {
+                            scroll_v_vis_change = 1;
+                            sid->vbar_visible = EINA_FALSE;
+                         }
+                    }
+                  else
                     {
                        scroll_v_vis_change = 1;
                        sid->vbar_visible = EINA_FALSE;
                     }
                }
-             else
+             else if (sid->vbar_flags == ELM_SCROLLER_POLICY_OFF)
                {
                   scroll_v_vis_change = 1;
                   sid->vbar_visible = EINA_FALSE;
                }
           }
-        else if (sid->vbar_flags == ELM_SCROLLER_POLICY_OFF)
-          {
-             scroll_v_vis_change = 1;
-             sid->vbar_visible = EINA_FALSE;
-          }
      }
    else
      {
-        if (sid->vbar_flags == ELM_SCROLLER_POLICY_AUTO)
+        if (!sid->min_h)
           {
-             if ((sid->content) || (sid->extern_pan))
+             if (sid->vbar_flags == ELM_SCROLLER_POLICY_AUTO)
                {
-                  if (h > vh)
+                  if ((sid->content) || (sid->extern_pan))
                     {
-                       scroll_v_vis_change = 1;
-                       sid->vbar_visible = EINA_TRUE;
+                       if (h > vh)
+                         {
+                            scroll_v_vis_change = 1;
+                            sid->vbar_visible = EINA_TRUE;
+                         }
                     }
                }
-          }
-        else if (sid->vbar_flags == ELM_SCROLLER_POLICY_ON)
-          {
-             scroll_v_vis_change = 1;
-             sid->vbar_visible = EINA_TRUE;
+             else if (sid->vbar_flags == ELM_SCROLLER_POLICY_ON)
+               {
+                  scroll_v_vis_change = 1;
+                  sid->vbar_visible = EINA_TRUE;
+               }
           }
      }
    if (scroll_v_vis_change)
@@ -704,13 +726,13 @@ _elm_scroll_scroll_bar_v_visibility_adjust(
              else
                edje_object_signal_emit
                  (sid->edje_obj, "elm,action,hide,vbar", "elm");
-
-             edje_object_message_signal_process(sid->edje_obj);
-             _elm_scroll_scroll_bar_size_adjust(sid);
           }
         else
           edje_object_signal_emit
             (sid->edje_obj, "elm,action,hide,vbar", "elm");
+        edje_object_message_signal_process(sid->edje_obj);
+        _elm_scroll_scroll_bar_size_adjust(sid);
+        elm_layout_sizing_eval(sid->obj);
      }
 
    return scroll_v_vis_change;
@@ -990,8 +1012,8 @@ _elm_scroll_content_min_limit(Evas_Object *obj,
 {
    ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
 
-   if (!sid->pan_obj || !sid->edje_obj) return;
-
+   if (!sid->edje_obj) return;
+   
    if (!sid->cb_func.content_min_limit)
      {
         ERR("Content minimim size limiting is unimplemented -- you "
@@ -999,6 +1021,8 @@ _elm_scroll_content_min_limit(Evas_Object *obj,
         return;
      }
 
+   sid->min_w = !!w;
+   sid->min_h = !!h;
    sid->cb_func.content_min_limit(obj, w, h);
 }
 
@@ -3537,8 +3561,9 @@ _elm_scroll_policy_set(Evas_Object *obj,
    else
      edje_object_signal_emit
        (sid->edje_obj, "elm,action,show_notalways,vbar", "elm");
-
+   edje_object_message_signal_process(sid->edje_obj);
    _elm_scroll_scroll_bar_size_adjust(sid);
+   elm_layout_sizing_eval(sid->obj);
 }
 
 static void
index b945a6f..2c9541c 100644 (file)
@@ -301,6 +301,8 @@ struct _Elm_Scrollable_Smart_Interface_Data
    Eina_Bool  bouncemex : 1;
    Eina_Bool  freeze : 1;
    Eina_Bool  hold : 1;
+   Eina_Bool  min_w : 1;
+   Eina_Bool  min_h : 1;
 };
 
 typedef struct _Elm_Scrollable_Smart_Interface Elm_Scrollable_Smart_Interface;
index dd9153d..5a924f5 100644 (file)
@@ -341,7 +341,7 @@ _elm_scroller_smart_sizing_eval(Evas_Object *obj)
 
    if (sd->min_w) w = vmw + minw;
    if (sd->min_h) h = vmh + minh;
-
+   
    evas_object_size_hint_max_get(obj, &maxw, &maxh);
    if ((maxw > 0) && (w > maxw)) w = maxw;
    if ((maxh > 0) && (h > maxh)) h = maxh;