[gnome-shell] [St] Implement max-width/max-height in the CSS parser



commit 721e1ea86385123ddd2bedd44f881d11e4fd3f49
Author: Dan Winship <danw gnome org>
Date:   Fri Feb 12 13:58:24 2010 -0500

    [St] Implement max-width/max-height in the CSS parser
    
    st_theme_node_adjust_preferred_width/height now limit the content area
    of an actor to the max, if given. (The requested width/height may be
    larger to make room for borders, etc.)
    
    https://bugzilla.gnome.org/show_bug.cgi?id=606755

 src/st/st-theme-node.c |   58 +++++++++++++++++++++++++++++++++++++++++------
 src/st/st-theme-node.h |    2 +
 2 files changed, 52 insertions(+), 8 deletions(-)
---
diff --git a/src/st/st-theme-node.c b/src/st/st-theme-node.c
index 03d1543..8875378 100644
--- a/src/st/st-theme-node.c
+++ b/src/st/st-theme-node.c
@@ -36,6 +36,8 @@ struct _StThemeNode {
   int height;
   int min_width;
   int min_height;
+  int max_width;
+  int max_height;
 
   char *background_image;
   StBorderImage *border_image;
@@ -1120,6 +1122,8 @@ ensure_geometry (StThemeNode *node)
   node->height = -1;
   node->min_width = -1;
   node->min_height = -1;
+  node->max_width = -1;
+  node->max_height = -1;
 
   for (i = 0; i < node->n_properties; i++)
     {
@@ -1138,14 +1142,22 @@ ensure_geometry (StThemeNode *node)
         do_size_property (node, decl, &node->min_width);
       else if (strcmp (property_name, "min-height") == 0)
         do_size_property (node, decl, &node->min_height);
+      else if (strcmp (property_name, "max-width") == 0)
+        do_size_property (node, decl, &node->max_width);
+      else if (strcmp (property_name, "max-height") == 0)
+        do_size_property (node, decl, &node->max_height);
     }
 
   if (node->width != -1)
     {
       if (node->min_width == -1)
         node->min_width = node->width;
-      else if (node->width <= node->min_width)
+      else if (node->width < node->min_width)
         node->width = node->min_width;
+      if (node->max_width == -1)
+        node->max_width = node->width;
+      else if (node->width > node->max_width)
+        node->width = node->max_width;
     }
   else
     node->width = node->min_width;
@@ -1154,8 +1166,12 @@ ensure_geometry (StThemeNode *node)
     {
       if (node->min_height == -1)
         node->min_height = node->height;
-      else if (node->height <= node->min_height)
+      else if (node->height < node->min_height)
         node->height = node->min_height;
+      if (node->max_height == -1)
+        node->max_height = node->height;
+      else if (node->height > node->max_height)
+        node->height = node->max_height;
     }
   else
     node->height = node->min_height;
@@ -1221,6 +1237,24 @@ st_theme_node_get_min_height (StThemeNode *node)
   return node->min_height;
 }
 
+int
+st_theme_node_get_max_width (StThemeNode *node)
+{
+  g_return_val_if_fail (ST_IS_THEME_NODE (node), -1);
+
+  ensure_geometry (node);
+  return node->max_width;
+}
+
+int
+st_theme_node_get_max_height (StThemeNode *node)
+{
+  g_return_val_if_fail (ST_IS_THEME_NODE (node), -1);
+
+  ensure_geometry (node);
+  return node->max_height;
+}
+
 static GetFromTermResult
 get_background_color_from_term (StThemeNode  *node,
                                 CRTerm       *term,
@@ -2255,9 +2289,10 @@ st_theme_node_adjust_for_height (StThemeNode  *node,
  * @for_height: (inout): the height to adjust
  *
  * Adjusts the minimum and natural width computed for an actor by
- * adding on the necessary space for borders and padding. This is a
- * convenience function meant to be called from the get_preferred_width()
- * method of a #ClutterActor subclass
+ * adding on the necessary space for borders and padding and taking
+ * into account any minimum or maximum width. This is a convenience
+ * function meant to be called from the get_preferred_width() method
+ * of a #ClutterActor subclass
  */
 void
 st_theme_node_adjust_preferred_width (StThemeNode  *node,
@@ -2283,6 +2318,8 @@ st_theme_node_adjust_preferred_width (StThemeNode  *node,
     {
       if (node->width != -1)
         *natural_width_p = node->width;
+      if (node->max_width != -1)
+        *natural_width_p = MIN (*natural_width_p, node->max_width);
       *natural_width_p += width_inc;
     }
 }
@@ -2319,9 +2356,10 @@ st_theme_node_adjust_for_width (StThemeNode  *node,
  * @for_height: (inout): the height to adjust
  *
  * Adjusts the minimum and natural height computed for an actor by
- * adding on the necessary space for borders and padding. This is a
- * convenience function meant to be called from the get_preferred_height()
- * method of a #ClutterActor subclass
+ * adding on the necessary space for borders and padding and taking
+ * into account any minimum or maximum height. This is a convenience
+ * function meant to be called from the get_preferred_height() method
+ * of a #ClutterActor subclass
  */
 void
 st_theme_node_adjust_preferred_height (StThemeNode  *node,
@@ -2346,6 +2384,8 @@ st_theme_node_adjust_preferred_height (StThemeNode  *node,
     {
       if (node->height != -1)
         *natural_height_p = node->height;
+      if (node->max_height != -1)
+        *natural_height_p = MIN (*natural_height_p, node->max_height);
       *natural_height_p += height_inc;
     }
 }
@@ -2426,6 +2466,8 @@ st_theme_node_geometry_equal (StThemeNode *node,
     return FALSE;
   if (node->min_width != other->min_width || node->min_height != other->min_height)
     return FALSE;
+  if (node->max_width != other->max_width || node->max_height != other->max_height)
+    return FALSE;
 
   return TRUE;
 }
diff --git a/src/st/st-theme-node.h b/src/st/st-theme-node.h
index afb8f0f..542b68c 100644
--- a/src/st/st-theme-node.h
+++ b/src/st/st-theme-node.h
@@ -133,6 +133,8 @@ int    st_theme_node_get_width         (StThemeNode  *node);
 int    st_theme_node_get_height        (StThemeNode  *node);
 int    st_theme_node_get_min_width     (StThemeNode  *node);
 int    st_theme_node_get_min_height    (StThemeNode  *node);
+int    st_theme_node_get_max_width     (StThemeNode  *node);
+int    st_theme_node_get_max_height    (StThemeNode  *node);
 
 StTextDecoration st_theme_node_get_text_decoration (StThemeNode *node);
 



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