[gtk+/native-layout] Added request_natural argument to get_desired_size()



commit 0330658a7f9f2b721a40b647f449612d7fb83125
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date:   Tue Apr 20 01:24:51 2010 -0400

    Added request_natural argument to get_desired_size()
    
    Currently get_desired_size() is more of an emulation of
    gtk_widget_size_request() for the minimum size as it bases the
    contextual request on the minimum preferred size; this argument
    lets you do the request with the natural preferred size as well.

 gtk/gtkextendedlayout.c |   30 +++++++++++++++++++++++-------
 gtk/gtkextendedlayout.h |    1 +
 2 files changed, 24 insertions(+), 7 deletions(-)
---
diff --git a/gtk/gtkextendedlayout.c b/gtk/gtkextendedlayout.c
index d63e265..72c9ff0 100644
--- a/gtk/gtkextendedlayout.c
+++ b/gtk/gtkextendedlayout.c
@@ -44,8 +44,8 @@ typedef struct
 typedef struct {
   DesiredSize desired_widths[N_CACHED_SIZES];
   DesiredSize desired_heights[N_CACHED_SIZES];
-  guint cached_width_age;
-  guint cached_height_age;
+  guint8 cached_width_age;
+  guint8 cached_height_age;
 } ExtendedLayoutCache;
 
 static GQuark quark_cache = 0;
@@ -74,7 +74,7 @@ gtk_extended_layout_get_type (void)
 /* looks for a cached size request for this for_size. If not
  * found, returns the oldest entry so it can be overwritten */
 static gboolean
-get_cached_desired_size (gfloat         for_size,
+get_cached_desired_size (gint           for_size,
 			 DesiredSize   *cached_sizes,
 			 DesiredSize  **result)
 {
@@ -168,7 +168,10 @@ compute_size_for_orientation (GtkExtendedLayout *layout,
       if (GTK_WIDGET_WIDTH_REQUEST_NEEDED (layout) == FALSE)
 	found_in_cache = get_cached_desired_size (for_size, cache->desired_widths, &cached_size);
       else
-	memset (cache->desired_widths, 0x0, N_CACHED_SIZES * sizeof (DesiredSize));
+	{
+	  memset (cache->desired_widths, 0x0, N_CACHED_SIZES * sizeof (DesiredSize));
+	  cache->cached_width_age = 1;
+	}
     }
   else
     {
@@ -177,7 +180,10 @@ compute_size_for_orientation (GtkExtendedLayout *layout,
       if (GTK_WIDGET_HEIGHT_REQUEST_NEEDED (layout) == FALSE)
 	found_in_cache = get_cached_desired_size (for_size, cache->desired_heights, &cached_size);
       else
-	memset (cache->desired_heights, 0x0, N_CACHED_SIZES * sizeof (DesiredSize));
+	{
+	  memset (cache->desired_heights, 0x0, N_CACHED_SIZES * sizeof (DesiredSize));
+	  cache->cached_height_age = 1;
+	}
     }
     
   if (!found_in_cache)
@@ -379,12 +385,17 @@ gtk_extended_layout_get_height_for_width (GtkExtendedLayout *layout,
  * gtk_extended_layout_get_desired_size:
  * @layout: a #GtkExtendedLayout instance
  * @width: the size which is available for allocation
+ * @request_natural: Whether to base the contextual request off of the 
+ *  base natural or the base minimum
  * @minimum_size: location for storing the minimum size, or %NULL
  * @natural_size: location for storing the natural size, or %NULL
  *
  * Retreives the minimum and natural size of a widget taking
  * into account the widget's preference for height-for-width management.
  *
+ * If request_natural is specified, the non-contextual natural value will
+ * be used to make the contextual request; otherwise the minimum will be used.
+ *
  * This is used to retreive a suitable size by container widgets whom dont 
  * impose any restrictions on the child placement, examples of these are 
  * #GtkWindow and #GtkScrolledWindow. 
@@ -393,6 +404,7 @@ gtk_extended_layout_get_height_for_width (GtkExtendedLayout *layout,
  */
 void
 gtk_extended_layout_get_desired_size (GtkExtendedLayout *layout,
+				      gboolean           request_natural,
                                       GtkRequisition    *minimum_size,
                                       GtkRequisition    *natural_size)
 {
@@ -404,12 +416,16 @@ gtk_extended_layout_get_desired_size (GtkExtendedLayout *layout,
   if (gtk_extended_layout_is_height_for_width (layout))
     {
       gtk_extended_layout_get_desired_width (layout, &min_width, &nat_width);
-      gtk_extended_layout_get_height_for_width (layout, min_width, &min_height, &nat_height);
+      gtk_extended_layout_get_height_for_width (layout, 
+						request_natural ? nat_width : min_width, 
+						&min_height, &nat_height);
     }
   else
     {
       gtk_extended_layout_get_desired_height (layout, &min_height, &nat_height);
-      gtk_extended_layout_get_width_for_height (layout, min_height, &min_width, &nat_width);
+      gtk_extended_layout_get_width_for_height (layout, 
+						request_natural ? nat_height : min_height, 
+						&min_width, &nat_width);
     }
 
   if (minimum_size)
diff --git a/gtk/gtkextendedlayout.h b/gtk/gtkextendedlayout.h
index 65faa9e..c3fdc0a 100644
--- a/gtk/gtkextendedlayout.h
+++ b/gtk/gtkextendedlayout.h
@@ -78,6 +78,7 @@ void      gtk_extended_layout_get_height_for_width (GtkExtendedLayout *layout,
 						    gint              *natural_height);
 
 void      gtk_extended_layout_get_desired_size     (GtkExtendedLayout *layout,
+						    gboolean           request_natural,
 						    GtkRequisition    *minimum_size,
 						    GtkRequisition    *natural_size);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]