[metacity/wip/gtk-theme: 55/61] theme: Use style information from GTK+



commit 5e67ff6900d3c60a944cbcaa8942b47c1ef7a004
Author: Florian Müllner <fmuellner gnome org>
Date:   Tue Sep 23 04:20:22 2014 +0200

    theme: Use style information from GTK+
    
    We now have everything in place to pick up geometry and drawing
    information from GTK+ rather than the metacity theme, so do just
    that; the metacity theme is now only used for some constants
    (title_scale, hide_buttons, ...), which we will replace soon.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=741917
    
    NOTE: Updated for metacity.

 src/ui/frames.c         |    4 +
 src/ui/preview-widget.c |    1 +
 src/ui/theme-viewer.c   |    1 +
 src/ui/theme.c          |  213 ++++++++++++++++++++++++++++++++++++++++++++---
 src/ui/theme.h          |    2 +
 src/ui/ui.c             |   19 ++--
 6 files changed, 218 insertions(+), 22 deletions(-)
---
diff --git a/src/ui/frames.c b/src/ui/frames.c
index 34624b6..972fb38 100644
--- a/src/ui/frames.c
+++ b/src/ui/frames.c
@@ -586,6 +586,7 @@ meta_frames_calc_geometry (MetaFrames        *frames,
   meta_prefs_get_button_layout (&button_layout);
 
   meta_theme_calc_geometry (meta_theme_get_current (),
+                            frame->style_info,
                             type,
                             frame->text_height,
                             flags,
@@ -762,6 +763,7 @@ meta_ui_frame_get_borders (MetaFrames       *frames,
    * window size
    */
   meta_theme_get_frame_borders (meta_theme_get_current (),
+                                frame->style_info,
                                 type,
                                 frame->text_height,
                                 flags,
@@ -2307,6 +2309,7 @@ populate_cache (MetaFrames *frames,
     }
 
   meta_theme_get_frame_borders (meta_theme_get_current (),
+                                frame->style_info,
                                 frame_type,
                                 frame->text_height,
                                 frame_flags,
@@ -2419,6 +2422,7 @@ subtract_client_area (cairo_region_t *region,
                  META_CORE_GET_CLIENT_HEIGHT, &area.height,
                  META_CORE_GET_END);
   meta_theme_get_frame_borders (meta_theme_get_current (),
+                                frame->style_info,
                                 type, frame->text_height, flags,
                                 &borders);
 
diff --git a/src/ui/preview-widget.c b/src/ui/preview-widget.c
index c46fc51..0b31d20 100644
--- a/src/ui/preview-widget.c
+++ b/src/ui/preview-widget.c
@@ -184,6 +184,7 @@ ensure_info (MetaPreview *preview)
     {
       if (preview->theme)
         meta_theme_get_frame_borders (preview->theme,
+                                      preview->style_info,
                                       preview->type,
                                       preview->text_height,
                                       preview->flags,
diff --git a/src/ui/theme-viewer.c b/src/ui/theme-viewer.c
index c772ff2..e5fb171 100644
--- a/src/ui/theme-viewer.c
+++ b/src/ui/theme-viewer.c
@@ -1044,6 +1044,7 @@ run_theme_benchmark (void)
   style_info = meta_theme_create_style_info (gtk_widget_get_screen (widget), NULL);
 
   meta_theme_get_frame_borders (global_theme,
+                                style_info,
                                 META_FRAME_TYPE_NORMAL,
                                 get_text_height (widget, style_info),
                                 get_flags (widget),
diff --git a/src/ui/theme.c b/src/ui/theme.c
index 006b46d..1c77124 100644
--- a/src/ui/theme.c
+++ b/src/ui/theme.c
@@ -725,7 +725,8 @@ meta_frame_layout_sync_with_style (MetaFrameLayout *layout,
 }
 
 static void
-meta_frame_layout_calc_geometry (const MetaFrameLayout  *layout,
+meta_frame_layout_calc_geometry (MetaFrameLayout        *layout,
+                                 MetaStyleInfo          *style_info,
                                  int                     text_height,
                                  MetaFrameFlags          flags,
                                  int                     client_width,
@@ -755,6 +756,8 @@ meta_frame_layout_calc_geometry (const MetaFrameLayout  *layout,
 
   MetaFrameBorders borders;
 
+  meta_frame_layout_sync_with_style (layout, style_info, flags);
+
   meta_frame_layout_get_borders (layout, text_height,
                                  flags,
                                  type,
@@ -4723,15 +4726,13 @@ get_button_rect (MetaButtonType           type,
     }
 }
 
+/* Used for metacity theme */
 static void
 meta_frame_style_draw_with_style (MetaFrameStyle          *style,
                                   MetaStyleInfo           *style_info,
                                   cairo_t                 *cr,
                                   const MetaFrameGeometry *fgeom,
-                                  int                      client_width,
-                                  int                      client_height,
                                   PangoLayout             *title_layout,
-                                  int                      text_height,
                                   MetaButtonState          button_states[META_BUTTON_TYPE_LAST],
                                   GdkPixbuf               *mini_icon,
                                   GdkPixbuf               *icon)
@@ -4959,6 +4960,173 @@ meta_frame_style_draw_with_style (MetaFrameStyle          *style,
     }
 }
 
+/* Used for GTK+ theme */
+static void
+meta_frame_style_draw_with_style_gtk (MetaFrameStyle          *frame_style,
+                                      MetaStyleInfo           *style_info,
+                                      cairo_t                 *cr,
+                                      const MetaFrameGeometry *fgeom,
+                                      PangoLayout             *title_layout,
+                                      MetaFrameFlags           flags,
+                                      MetaButtonState          button_states[META_BUTTON_TYPE_LAST],
+                                      GdkPixbuf               *mini_icon)
+{
+  GtkStyleContext *style;
+  GtkStateFlags state;
+  MetaButtonType button_type;
+  GdkRectangle visible_rect;
+  GdkRectangle titlebar_rect;
+  GdkRectangle button_rect;
+  const MetaFrameBorders *borders;
+
+  borders = &fgeom->borders;
+
+  visible_rect.x = borders->invisible.left;
+  visible_rect.y = borders->invisible.top;
+  visible_rect.width = fgeom->width - borders->invisible.left - borders->invisible.right;
+  visible_rect.height = fgeom->height - borders->invisible.top - borders->invisible.bottom;
+
+  meta_style_info_set_flags (style_info, flags);
+
+  style = style_info->styles[META_STYLE_ELEMENT_FRAME];
+  gtk_render_background (style, cr,
+                         visible_rect.x, visible_rect.y,
+                         visible_rect.width, visible_rect.height);
+  gtk_render_frame (style, cr,
+                    visible_rect.x, visible_rect.y,
+                    visible_rect.width, visible_rect.height);
+
+  titlebar_rect.x = visible_rect.x;
+  titlebar_rect.y = visible_rect.y;
+  titlebar_rect.width = visible_rect.width;
+  titlebar_rect.height = borders->visible.top;
+
+  style = style_info->styles[META_STYLE_ELEMENT_TITLEBAR];
+  gtk_render_background (style, cr,
+                         titlebar_rect.x, titlebar_rect.y,
+                         titlebar_rect.width, titlebar_rect.height);
+  gtk_render_frame (style, cr,
+                    titlebar_rect.x, titlebar_rect.y,
+                    titlebar_rect.width, titlebar_rect.height);
+
+  if (frame_style->layout->has_title && title_layout)
+    {
+      PangoRectangle logical;
+      int text_width, x, y;
+
+      pango_layout_set_width (title_layout, -1);
+      pango_layout_get_pixel_extents (title_layout, NULL, &logical);
+
+      text_width = MIN(fgeom->title_rect.width, logical.width);
+
+      if (text_width < logical.width)
+        pango_layout_set_width (title_layout, PANGO_SCALE * text_width);
+
+      /* Center within the frame if possible */
+      x = titlebar_rect.x + (titlebar_rect.width - text_width) / 2;
+      y = titlebar_rect.y + (titlebar_rect.height - logical.height) / 2;
+
+      if (x < fgeom->title_rect.x)
+        x = fgeom->title_rect.x;
+      else if (x + text_width > fgeom->title_rect.x + fgeom->title_rect.width)
+        x = fgeom->title_rect.x + fgeom->title_rect.width - text_width;
+
+      style = style_info->styles[META_STYLE_ELEMENT_TITLE];
+      gtk_render_layout (style, cr, x, y, title_layout);
+    }
+
+  style = style_info->styles[META_STYLE_ELEMENT_BUTTON];
+  state = gtk_style_context_get_state (style);
+  for (button_type = META_BUTTON_TYPE_CLOSE; button_type < META_BUTTON_TYPE_LAST; button_type++)
+    {
+      MetaButtonState button_state;
+
+      get_button_rect (button_type, fgeom, 0, &button_rect);
+
+      button_state = map_button_state (button_type, fgeom, 0, button_states);
+
+      if (button_state == META_BUTTON_STATE_PRELIGHT)
+        gtk_style_context_set_state (style, state | GTK_STATE_PRELIGHT);
+      else if (button_state == META_BUTTON_STATE_PRESSED)
+        gtk_style_context_set_state (style, state | GTK_STATE_ACTIVE);
+      else
+        gtk_style_context_set_state (style, state);
+
+      cairo_save (cr);
+      gdk_cairo_rectangle (cr, &button_rect);
+      cairo_clip (cr);
+
+      if (gdk_cairo_get_clip_rectangle (cr, NULL))
+        {
+          GdkPixbuf *pixbuf = NULL;
+          const char *icon_name = NULL;
+
+          gtk_render_background (style, cr,
+                                 button_rect.x, button_rect.y,
+                                 button_rect.width, button_rect.height);
+          gtk_render_frame (style, cr,
+                            button_rect.x, button_rect.y,
+                            button_rect.width, button_rect.height);
+
+          switch (button_type)
+            {
+              case META_BUTTON_TYPE_CLOSE:
+                icon_name = "window-close-symbolic";
+                break;
+              case META_BUTTON_TYPE_MAXIMIZE:
+                if (flags & META_FRAME_MAXIMIZED)
+                  icon_name = "window-restore-symbolic";
+                else
+                  icon_name = "window-maximize-symbolic";
+                break;
+              case META_BUTTON_TYPE_MINIMIZE:
+                icon_name = "window-minimize-symbolic";
+                break;
+              case META_BUTTON_TYPE_MENU:
+                icon_name = "open-menu-symbolic";
+                break;
+              case META_BUTTON_TYPE_APPMENU:
+                pixbuf = g_object_ref (mini_icon);
+                break;
+              default:
+                icon_name = NULL;
+                break;
+            }
+
+          if (icon_name)
+            {
+              GtkIconTheme *theme = gtk_icon_theme_get_default ();
+              GtkIconInfo *info;
+
+              info = gtk_icon_theme_lookup_icon (theme, icon_name, frame_style->layout->icon_size, 0);
+              pixbuf = gtk_icon_info_load_symbolic_for_context (info, style, NULL, NULL);
+            }
+
+          if (pixbuf)
+            {
+              float width, height;
+              int x, y;
+
+              width = gdk_pixbuf_get_width (pixbuf);
+              height = gdk_pixbuf_get_height (pixbuf);
+              x = button_rect.x + (button_rect.width - width) / 2;
+              y = button_rect.y + (button_rect.height - height) / 2;
+
+              cairo_translate (cr, x, y);
+              cairo_scale (cr,
+                           width / frame_style->layout->icon_size,
+                           height / frame_style->layout->icon_size);
+              gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
+                                           cairo_paint (cr);
+
+              g_object_unref (pixbuf);
+            }
+        }
+
+      cairo_restore (cr);
+    }
+}
+
 MetaFrameStyleSet*
 meta_frame_style_set_new (MetaFrameStyleSet *parent)
 {
@@ -5787,6 +5955,7 @@ meta_theme_draw_frame (MetaTheme              *theme,
     return;
 
   meta_frame_layout_calc_geometry (style->layout,
+                                   style_info,
                                    text_height,
                                    flags,
                                    client_width, client_height,
@@ -5795,19 +5964,33 @@ meta_theme_draw_frame (MetaTheme              *theme,
                                    &fgeom,
                                    theme);
 
-  meta_frame_style_draw_with_style (style,
-                                    style_info,
-                                    cr,
-                                    &fgeom,
-                                    client_width, client_height,
-                                    title_layout,
-                                    text_height,
-                                    button_states,
-                                    mini_icon, icon);
+  if (meta_prefs_get_theme ())
+    {
+      meta_frame_style_draw_with_style (style,
+                                        style_info,
+                                        cr,
+                                        &fgeom,
+                                        title_layout,
+                                        button_states,
+                                        mini_icon,
+                                        icon);
+    }
+  else
+    {
+      meta_frame_style_draw_with_style_gtk (style,
+                                            style_info,
+                                            cr,
+                                            &fgeom,
+                                            title_layout,
+                                            flags,
+                                            button_states,
+                                            mini_icon);
+    }
 }
 
 void
 meta_theme_get_frame_borders (MetaTheme        *theme,
+                              MetaStyleInfo    *style_info,
                               MetaFrameType     type,
                               int               text_height,
                               MetaFrameFlags    flags,
@@ -5825,6 +6008,8 @@ meta_theme_get_frame_borders (MetaTheme        *theme,
   if (style == NULL)
     return;
 
+  meta_frame_layout_sync_with_style (style->layout, style_info, flags);
+
   meta_frame_layout_get_borders (style->layout,
                                  text_height,
                                  flags,
@@ -5834,6 +6019,7 @@ meta_theme_get_frame_borders (MetaTheme        *theme,
 
 void
 meta_theme_calc_geometry (MetaTheme              *theme,
+                          MetaStyleInfo          *style_info,
                           MetaFrameType           type,
                           int                     text_height,
                           MetaFrameFlags          flags,
@@ -5853,6 +6039,7 @@ meta_theme_calc_geometry (MetaTheme              *theme,
     return;
 
   meta_frame_layout_calc_geometry (style->layout,
+                                   style_info,
                                    text_height,
                                    flags,
                                    client_width, client_height,
diff --git a/src/ui/theme.h b/src/ui/theme.h
index 86469e1..2c85496 100644
--- a/src/ui/theme.h
+++ b/src/ui/theme.h
@@ -1033,11 +1033,13 @@ void meta_theme_draw_frame (MetaTheme              *theme,
                             GdkPixbuf              *icon);
 
 void meta_theme_get_frame_borders (MetaTheme         *theme,
+                                   MetaStyleInfo     *style_info,
                                    MetaFrameType      type,
                                    int                text_height,
                                    MetaFrameFlags     flags,
                                    MetaFrameBorders  *borders);
 void meta_theme_calc_geometry (MetaTheme              *theme,
+                               MetaStyleInfo          *style_info,
                                MetaFrameType           type,
                                int                     text_height,
                                MetaFrameFlags          flags,
diff --git a/src/ui/ui.c b/src/ui/ui.c
index 3d9fb87..2710f05 100644
--- a/src/ui/ui.c
+++ b/src/ui/ui.c
@@ -675,14 +675,17 @@ meta_ui_theme_get_frame_borders (MetaUI           *ui,
 
   if (meta_ui_have_a_theme ())
     {
+      GdkDisplay *display = gdk_x11_lookup_xdisplay (ui->xdisplay);
+      GdkScreen *screen = gdk_display_get_screen (display, XScreenNumberOfScreen (ui->xscreen));
+      MetaStyleInfo *style_info = NULL;
+
+      style_info = meta_theme_create_style_info (screen, NULL);
+
       context = gtk_widget_get_pango_context (GTK_WIDGET (ui->frames));
       font_desc = meta_prefs_get_titlebar_font ();
 
       if (!font_desc)
         {
-          GdkDisplay *display = gdk_x11_lookup_xdisplay (ui->xdisplay);
-          GdkScreen *screen = gdk_display_get_screen (display, XScreenNumberOfScreen (ui->xscreen));
-
           if (meta_prefs_get_theme ())
             {
               GtkStyleContext *style = NULL;
@@ -704,13 +707,7 @@ meta_ui_theme_get_frame_borders (MetaUI           *ui,
             }
           else
             {
-              MetaStyleInfo *style_info = NULL;
-
-              style_info = meta_theme_create_style_info (screen, NULL);
               free_font_desc = meta_style_info_create_font_desc (style_info);
-
-              if (style_info != NULL)
-                meta_style_info_unref (style_info);
             }
 
           font_desc = (const PangoFontDescription *) free_font_desc;
@@ -719,11 +716,15 @@ meta_ui_theme_get_frame_borders (MetaUI           *ui,
       text_height = meta_pango_font_desc_get_text_height (font_desc, context);
 
       meta_theme_get_frame_borders (meta_theme_get_current (),
+                                    style_info,
                                     type, text_height, flags,
                                     borders);
 
       if (free_font_desc)
         pango_font_description_free (free_font_desc);
+
+      if (style_info != NULL)
+        meta_style_info_unref (style_info);
     }
   else
     {


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