[mutter/wip/cb2eb3: 35/55] theme: Calculate frame geometry borders from CSS



commit 02bb550bd629fd7dfe2372f7bfc9878cb2336699
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Sun Apr 29 15:23:41 2012 -0400

    theme: Calculate frame geometry borders from CSS
    
    Use the CSS 'border' and 'padding' properties rather than frame geometry.
    This is a bit messy, so I'll fix it up with a new path representing the
    titlebar soon.

 src/ui/frames.c         |    3 ++
 src/ui/preview-widget.c |    1 +
 src/ui/theme-parser.c   |   10 +--------
 src/ui/theme-private.h  |   18 +---------------
 src/ui/theme-viewer.c   |    1 +
 src/ui/theme.c          |   49 ++++++++++++++++++++--------------------------
 6 files changed, 29 insertions(+), 53 deletions(-)
---
diff --git a/src/ui/frames.c b/src/ui/frames.c
index f06326a..4e43b46 100644
--- a/src/ui/frames.c
+++ b/src/ui/frames.c
@@ -680,6 +680,7 @@ meta_frames_get_borders (MetaFrames *frames,
    * window size
    */
   meta_theme_get_frame_borders (frame->tv->theme,
+                                frame->tv->style_context,
                                 type,
                                 frame->text_height,
                                 flags,
@@ -1687,6 +1688,7 @@ populate_cache (MetaFrames *frames,
     }
   
   meta_theme_get_frame_borders (frame->tv->theme,
+                                frame->tv->style_context,
                                 frame_type,
                                 frame->text_height,
                                 frame_flags,
@@ -1803,6 +1805,7 @@ subtract_client_area (cairo_region_t *region,
                  META_CORE_GET_CLIENT_HEIGHT, &area.height,
                  META_CORE_GET_END);
   meta_theme_get_frame_borders (frame->tv->theme,
+                                frame->tv->style_context,
                                 type, frame->text_height, flags, 
                                 &borders);
 
diff --git a/src/ui/preview-widget.c b/src/ui/preview-widget.c
index a411e8a..857aa43 100644
--- a/src/ui/preview-widget.c
+++ b/src/ui/preview-widget.c
@@ -169,6 +169,7 @@ ensure_info (MetaPreview *preview)
     {
       if (preview->theme)
         meta_theme_get_frame_borders (preview->theme,
+                                      meta_theme_get_variant (preview->theme, NULL)->style_context,
                                       preview->type,
                                       preview->text_height,
                                       preview->flags,
diff --git a/src/ui/theme-parser.c b/src/ui/theme-parser.c
index 3825e22..6769046 100644
--- a/src/ui/theme-parser.c
+++ b/src/ui/theme-parser.c
@@ -1331,15 +1331,7 @@ parse_distance (GMarkupParseContext  *context,
   g_assert (val >= 0); /* yeah, "non-negative" not "positive" get over it */
   g_assert (info->layout);
 
-  if (strcmp (name, "left_width") == 0)
-    info->layout->left_width = val;
-  else if (strcmp (name, "right_width") == 0)
-    info->layout->right_width = val;
-  else if (strcmp (name, "bottom_height") == 0)
-    info->layout->bottom_height = val;
-  else if (strcmp (name, "title_vertical_pad") == 0)
-    info->layout->title_vertical_pad = val;
-  else if (strcmp (name, "right_titlebar_edge") == 0)
+  if (strcmp (name, "right_titlebar_edge") == 0)
     info->layout->right_titlebar_edge = val;
   else if (strcmp (name, "left_titlebar_edge") == 0)
     info->layout->left_titlebar_edge = val;
diff --git a/src/ui/theme-private.h b/src/ui/theme-private.h
index 26decab..7549a1e 100644
--- a/src/ui/theme-private.h
+++ b/src/ui/theme-private.h
@@ -134,22 +134,12 @@ struct _MetaFrameLayout
 {
   /** Reference count. */
   int refcount;
-  
-  /** Size of left side */
-  int left_width;
-  /** Size of right side */
-  int right_width;
-  /** Size of bottom side */
-  int bottom_height;
-  
+
   /** Border of blue title region
    * \bug (blue?!)
    **/
   GtkBorder title_border;
 
-  /** Extra height for inside of title region, above the font height */
-  int title_vertical_pad;
-  
   /** Right indent of buttons from edges of frame */
   int right_titlebar_edge;
   /** Left indent of buttons from edges of frame */
@@ -918,11 +908,6 @@ MetaFrameLayout* meta_frame_layout_new           (void);
 MetaFrameLayout* meta_frame_layout_copy          (const MetaFrameLayout *src);
 void             meta_frame_layout_ref           (MetaFrameLayout       *layout);
 void             meta_frame_layout_unref         (MetaFrameLayout       *layout);
-void             meta_frame_layout_get_borders   (const MetaFrameLayout *layout,
-                                                  int                    text_height,
-                                                  MetaFrameFlags         flags,
-                                                  MetaFrameType          type,
-                                                  MetaFrameBorders      *borders);
 gboolean         meta_frame_layout_validate      (const MetaFrameLayout *layout,
                                                   GError               **error);
 
@@ -1058,6 +1043,7 @@ void meta_theme_draw_frame_with_style (MetaTheme              *theme,
                                        GdkPixbuf              *icon);
 
 void meta_theme_get_frame_borders (MetaTheme         *theme,
+                                   GtkStyleContext   *style_context,
                                    MetaFrameType      type,
                                    int                text_height,
                                    MetaFrameFlags     flags,
diff --git a/src/ui/theme-viewer.c b/src/ui/theme-viewer.c
index a931899..45a3123 100644
--- a/src/ui/theme-viewer.c
+++ b/src/ui/theme-viewer.c
@@ -975,6 +975,7 @@ run_theme_benchmark (void)
   gtk_widget_realize (widget);
   
   meta_theme_get_frame_borders (global_theme,
+                                meta_theme_get_variant (global_theme, NULL)->style_context,
                                 META_FRAME_TYPE_NORMAL,
                                 get_text_height (widget),
                                 get_flags (widget),
diff --git a/src/ui/theme.c b/src/ui/theme.c
index bb1e769..6fb01a6 100644
--- a/src/ui/theme.c
+++ b/src/ui/theme.c
@@ -118,15 +118,8 @@ meta_frame_layout_new  (void)
 
   layout->refcount = 1;
 
-  /* Fill with -1 values to detect invalid themes */
-  layout->left_width = -1;
-  layout->right_width = -1;
-  layout->bottom_height = -1;
-
   init_border (&layout->title_border);
 
-  layout->title_vertical_pad = -1;
-  
   layout->right_titlebar_edge = -1;
   layout->left_titlebar_edge = -1;
 
@@ -221,14 +214,8 @@ meta_frame_layout_validate (const MetaFrameLayout *layout,
 
 #define CHECK_GEOMETRY_BORDER(bname) if (!validate_geometry_border (&layout->bname, #bname, error)) return 
FALSE
 
-  CHECK_GEOMETRY_VALUE (left_width);
-  CHECK_GEOMETRY_VALUE (right_width);
-  CHECK_GEOMETRY_VALUE (bottom_height);
-
   CHECK_GEOMETRY_BORDER (title_border);
 
-  CHECK_GEOMETRY_VALUE (title_vertical_pad);
-
   CHECK_GEOMETRY_VALUE (right_titlebar_edge);
   CHECK_GEOMETRY_VALUE (left_titlebar_edge);
 
@@ -311,15 +298,17 @@ get_style_flags (MetaFrameFlags flags)
   return gtk_flags;
 }
 
-void
+static void
 meta_frame_layout_get_borders (const MetaFrameLayout *layout,
+                               GtkStyleContext       *style_context,
                                int                    text_height,
                                MetaFrameFlags         flags,
                                MetaFrameType          type,
                                MetaFrameBorders      *borders)
 {
-  int buttons_height, title_height, draggable_borders;
-  
+  int draggable_borders;
+  GtkBorder padding;
+
   meta_frame_borders_clear (borders);
 
   /* For a full-screen window, we don't have any borders, visible or not. */
@@ -330,17 +319,19 @@ meta_frame_layout_get_borders (const MetaFrameLayout *layout,
 
   if (!layout->has_title)
     text_height = 0;
-  
-  buttons_height = layout->button_height +
-    layout->button_border.top + layout->button_border.bottom;
-  title_height = text_height +
-    layout->title_vertical_pad +
-    layout->title_border.top + layout->title_border.bottom;
 
-  borders->visible.top    = MAX (buttons_height, title_height);
-  borders->visible.left   = layout->left_width;
-  borders->visible.right  = layout->right_width;
-  borders->visible.bottom = layout->bottom_height;
+  gtk_style_context_get_border (style_context,
+                                get_style_flags (flags),
+                                &borders->visible);
+
+  gtk_style_context_get_padding (style_context,
+                                 get_style_flags (flags),
+                                 &padding);
+
+  borders->visible.left += padding.left;
+  borders->visible.right += padding.right;
+  borders->visible.top += padding.top;
+  borders->visible.bottom += padding.bottom;
 
   draggable_borders = meta_prefs_get_draggable_border_width ();
 
@@ -556,7 +547,7 @@ meta_frame_layout_calc_geometry (const MetaFrameLayout  *layout,
 
   MetaFrameBorders borders;
   
-  meta_frame_layout_get_borders (layout, text_height,
+  meta_frame_layout_get_borders (layout, ctx, text_height,
                                  flags, type,
                                  &borders);
 
@@ -800,7 +791,7 @@ meta_frame_layout_calc_geometry (const MetaFrameLayout  *layout,
           rect->clickable.height = button_height + button_y;
 
           if (i == n_right - 1)
-            rect->clickable.width += layout->right_titlebar_edge + layout->right_width + 
layout->button_border.right;
+            rect->clickable.width += layout->right_titlebar_edge + borders.visible.right + 
layout->button_border.right;
 
         }
       else
@@ -5119,6 +5110,7 @@ meta_theme_draw_frame (MetaTheme              *theme,
 
 void
 meta_theme_get_frame_borders (MetaTheme        *theme,
+                              GtkStyleContext  *style_context,
                               MetaFrameType     type,
                               int               text_height,
                               MetaFrameFlags    flags,
@@ -5137,6 +5129,7 @@ meta_theme_get_frame_borders (MetaTheme        *theme,
     return;
 
   meta_frame_layout_get_borders (style->layout,
+                                 style_context,
                                  text_height,
                                  flags, type,
                                  borders);


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