[metacity] libmetacity: consider minimum sizes in GTK+ theme



commit 46170e5d0993238f0e6e84b0940fc80b84e2d14a
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Sun Feb 7 15:55:45 2016 +0200

    libmetacity: consider minimum sizes in GTK+ theme
    
    GTK+ improved its CSS support, and the default theme started to
    make use of it, so we must update our theming code accordingly.
    Start by supporting min-width/min-height where it makes sense.
    
    Adapted from:
    https://git.gnome.org/browse/mutter/commit/?id=d5b69bcd542b759af661de2caa5a0e7fe6901e9f

 libmetacity/meta-frame-layout.h |    5 +++++
 libmetacity/meta-theme-gtk.c    |   30 +++++++++++++++++++++++++-----
 2 files changed, 30 insertions(+), 5 deletions(-)
---
diff --git a/libmetacity/meta-frame-layout.h b/libmetacity/meta-frame-layout.h
index 934c65b..a03d4aa 100644
--- a/libmetacity/meta-frame-layout.h
+++ b/libmetacity/meta-frame-layout.h
@@ -65,6 +65,11 @@ struct _MetaFrameLayout
 
     /** Space between titlebar elements */
     guint titlebar_spacing;
+
+    /** Min size of titlebar region */
+    GtkRequisition titlebar_min_size;
+    /** Min size of titlebar buttons */
+    GtkRequisition button_min_size;
   } gtk;
 
   struct {
diff --git a/libmetacity/meta-theme-gtk.c b/libmetacity/meta-theme-gtk.c
index 31ba274..fa756ee 100644
--- a/libmetacity/meta-theme-gtk.c
+++ b/libmetacity/meta-theme-gtk.c
@@ -173,6 +173,16 @@ get_padding_and_border (GtkStyleContext *style,
 }
 
 static void
+get_min_size (GtkStyleContext *style,
+              GtkRequisition  *requisition)
+{
+  gtk_style_context_get (style, gtk_style_context_get_state (style),
+                         "min-width", &requisition->width,
+                         "min-height", &requisition->height,
+                         NULL);
+}
+
+static void
 scale_border (GtkBorder *border,
               double     factor)
 {
@@ -190,6 +200,7 @@ frame_layout_sync_with_style (MetaFrameLayout *layout,
 {
   GtkStyleContext *style;
   GtkBorder border;
+  GtkRequisition requisition;
   int border_radius, max_radius;
 
   meta_style_info_set_flags (style_info, flags);
@@ -245,14 +256,17 @@ frame_layout_sync_with_style (MetaFrameLayout *layout,
       layout->bottom_right_corner_rounded_radius = MAX (border_radius, max_radius);
     }
 
+  get_min_size (style, &layout->gtk.titlebar_min_size);
   get_padding_and_border (style, &layout->gtk.titlebar_border);
   scale_border (&layout->gtk.titlebar_border, layout->title_scale);
 
   style = style_info->styles[META_STYLE_ELEMENT_BUTTON];
+  get_min_size (style, &layout->gtk.button_min_size);
   get_padding_and_border (style, &layout->button_border);
   scale_border (&layout->button_border, layout->title_scale);
 
   style = style_info->styles[META_STYLE_ELEMENT_IMAGE];
+  get_min_size (style, &requisition);
   get_padding_and_border (style, &border);
   scale_border (&border, layout->title_scale);
 
@@ -260,6 +274,11 @@ frame_layout_sync_with_style (MetaFrameLayout *layout,
   layout->button_border.right += border.right;
   layout->button_border.top += border.top;
   layout->button_border.bottom += border.bottom;
+
+  layout->gtk.button_min_size.width = MAX (layout->gtk.button_min_size.width,
+                                           requisition.width);
+  layout->gtk.button_min_size.height = MAX (layout->gtk.button_min_size.height,
+                                            requisition.height);
 }
 
 static void
@@ -288,10 +307,11 @@ meta_theme_gtk_get_frame_borders (MetaThemeImpl    *impl,
   if (!layout->has_title)
     text_height = 0;
 
-  buttons_height = layout->gtk.icon_size +
-    layout->button_border.top + layout->button_border.bottom;
+  buttons_height = MAX ((gint) layout->gtk.icon_size, layout->gtk.button_min_size.height) +
+                   layout->button_border.top + layout->button_border.bottom;
 
-  content_height = MAX (buttons_height, text_height) +
+  content_height = MAX (buttons_height, text_height);
+  content_height = MAX (content_height, layout->gtk.titlebar_min_size.height) +
                    layout->gtk.titlebar_border.top +
                    layout->gtk.titlebar_border.bottom;
 
@@ -499,9 +519,9 @@ meta_theme_gtk_calc_geometry (MetaThemeImpl          *impl,
                   (fgeom->content_border.right + borders.invisible.right);
   content_height = borders.visible.top - fgeom->content_border.top - fgeom->content_border.bottom;
 
-  button_width = layout->gtk.icon_size +
+  button_width = MAX ((gint) layout->gtk.icon_size, layout->gtk.button_min_size.width) +
                  layout->button_border.left + layout->button_border.right;
-  button_height = layout->gtk.icon_size +
+  button_height = MAX ((gint) layout->gtk.icon_size, layout->gtk.button_min_size.height) +
                   layout->button_border.top + layout->button_border.bottom;
 
   /* FIXME all this code sort of pretends that duplicate buttons


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