summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2012-12-16 17:54:33 -0500
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2015-01-07 13:56:10 +0200
commit6eef11c6b9a2684e3e4663f5804dd1f67c896003 (patch)
tree5875616c7a02e754933d5b10bae938ca32e68dfc
parent76aa07041ee56169d9c0af8fcdb36f841af111f2 (diff)
downloadmetacity-6eef11c6b9a2684e3e4663f5804dd1f67c896003.tar.gz
theme-viewer: use the same GtkStyleContext as mutter usually renders
https://bugzilla.gnome.org/show_bug.cgi?id=690317
-rw-r--r--src/ui/frames.c42
-rw-r--r--src/ui/preview-widget.c27
-rw-r--r--src/ui/preview-widget.h2
-rw-r--r--src/ui/theme-viewer.c18
-rw-r--r--src/ui/theme.c34
-rw-r--r--src/ui/theme.h3
6 files changed, 82 insertions, 44 deletions
diff --git a/src/ui/frames.c b/src/ui/frames.c
index e814c35c..16e465b8 100644
--- a/src/ui/frames.c
+++ b/src/ui/frames.c
@@ -187,39 +187,6 @@ prefs_changed_callback (MetaPreference pref,
}
static GtkStyleContext *
-create_style_context (MetaFrames *frames,
- const gchar *variant)
-{
- GtkStyleContext *style;
- GdkScreen *screen;
- char *theme_name;
-
- screen = gtk_widget_get_screen (GTK_WIDGET (frames));
- g_object_get (gtk_settings_get_for_screen (screen),
- "gtk-theme-name", &theme_name,
- NULL);
-
- style = gtk_style_context_new ();
- gtk_style_context_set_path (style,
- gtk_widget_get_path (GTK_WIDGET (frames)));
-
- if (theme_name && *theme_name)
- {
- GtkCssProvider *provider;
-
- provider = gtk_css_provider_get_named (theme_name, variant);
- gtk_style_context_add_provider (style,
- GTK_STYLE_PROVIDER (provider),
- GTK_STYLE_PROVIDER_PRIORITY_SETTINGS);
- }
-
- if (theme_name)
- g_free (theme_name);
-
- return style;
-}
-
-static GtkStyleContext *
meta_frames_get_theme_variant (MetaFrames *frames,
const gchar *variant)
{
@@ -228,7 +195,7 @@ meta_frames_get_theme_variant (MetaFrames *frames,
style = g_hash_table_lookup (frames->style_variants, variant);
if (style == NULL)
{
- style = create_style_context (frames, variant);
+ style = meta_theme_create_style_context (gtk_widget_get_screen (GTK_WIDGET (frames)), variant);
g_hash_table_insert (frames->style_variants, g_strdup (variant), style);
}
@@ -240,15 +207,18 @@ update_style_contexts (MetaFrames *frames)
{
GtkStyleContext *style;
GList *variants, *variant;
+ GdkScreen *screen;
+
+ screen = gtk_widget_get_screen (GTK_WIDGET (frames));
if (frames->normal_style)
g_object_unref (frames->normal_style);
- frames->normal_style = create_style_context (frames, NULL);
+ frames->normal_style = meta_theme_create_style_context (screen, NULL);
variants = g_hash_table_get_keys (frames->style_variants);
for (variant = variants; variant; variant = variants->next)
{
- style = create_style_context (frames, (char *)variant->data);
+ style = meta_theme_create_style_context (screen, (char *)variant->data);
g_hash_table_insert (frames->style_variants,
g_strdup (variant->data), style);
}
diff --git a/src/ui/preview-widget.c b/src/ui/preview-widget.c
index 39505e74..1d7aeb63 100644
--- a/src/ui/preview-widget.c
+++ b/src/ui/preview-widget.c
@@ -36,6 +36,8 @@ static void meta_preview_size_allocate (GtkWidget *widget,
GtkAllocation *allocation);
static gboolean meta_preview_draw (GtkWidget *widget,
cairo_t *cr);
+static void meta_preview_realize (GtkWidget *widget);
+static void meta_preview_dispose (GObject *object);
static void meta_preview_finalize (GObject *object);
G_DEFINE_TYPE (MetaPreview, meta_preview, GTK_TYPE_BIN);
@@ -48,8 +50,10 @@ meta_preview_class_init (MetaPreviewClass *class)
widget_class = (GtkWidgetClass*) class;
+ gobject_class->dispose = meta_preview_dispose;
gobject_class->finalize = meta_preview_finalize;
+ widget_class->realize = meta_preview_realize;
widget_class->draw = meta_preview_draw;
widget_class->get_preferred_width = meta_preview_get_preferred_width;
widget_class->get_preferred_height = meta_preview_get_preferred_height;
@@ -105,6 +109,16 @@ meta_preview_new (void)
}
static void
+meta_preview_dispose (GObject *object)
+{
+ MetaPreview *preview = META_PREVIEW (object);
+
+ g_clear_object (&preview->style_context);
+
+ G_OBJECT_CLASS (meta_preview_parent_class)->dispose (object);
+}
+
+static void
meta_preview_finalize (GObject *object)
{
MetaPreview *preview;
@@ -217,7 +231,7 @@ meta_preview_draw (GtkWidget *widget,
border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
meta_theme_draw_frame (preview->theme,
- gtk_widget_get_style_context (widget),
+ preview->style_context,
cr,
preview->type,
preview->flags,
@@ -236,6 +250,17 @@ meta_preview_draw (GtkWidget *widget,
return GTK_WIDGET_CLASS (meta_preview_parent_class)->draw (widget, cr);
}
+static void
+meta_preview_realize (GtkWidget *widget)
+{
+ MetaPreview *preview = META_PREVIEW (widget);
+
+ GTK_WIDGET_CLASS (meta_preview_parent_class)->realize (widget);
+
+ preview->style_context = meta_theme_create_style_context (gtk_widget_get_screen (widget),
+ NULL);
+}
+
#define NO_CHILD_WIDTH 80
#define NO_CHILD_HEIGHT 20
diff --git a/src/ui/preview-widget.h b/src/ui/preview-widget.h
index b59e231b..db85b130 100644
--- a/src/ui/preview-widget.h
+++ b/src/ui/preview-widget.h
@@ -39,6 +39,8 @@ struct _MetaPreview
{
GtkBin bin;
+ GtkStyleContext *style_context;
+
MetaTheme *theme;
char *title;
MetaFrameType type;
diff --git a/src/ui/theme-viewer.c b/src/ui/theme-viewer.c
index 351362c6..22c618a6 100644
--- a/src/ui/theme-viewer.c
+++ b/src/ui/theme-viewer.c
@@ -913,7 +913,8 @@ main (int argc, char **argv)
G_CALLBACK (gtk_main_quit), NULL);
gtk_widget_realize (window);
- style = gtk_widget_get_style_context (window);
+
+ style = meta_theme_create_style_context (gtk_widget_get_screen (window), NULL);
gtk_style_context_get (style, GTK_STATE_FLAG_NORMAL, "font", &font_desc, NULL);
g_assert (style);
@@ -986,13 +987,12 @@ get_flags (GtkWidget *widget)
}
static int
-get_text_height (GtkWidget *widget)
+get_text_height (GtkWidget *widget,
+ GtkStyleContext *style)
{
- GtkStyleContext *style;
PangoFontDescription *font_desc;
int text_height;
- style = gtk_widget_get_style_context (widget);
gtk_style_context_get (style, GTK_STATE_FLAG_NORMAL, "font", &font_desc, NULL);
text_height = meta_pango_font_desc_get_text_height (font_desc, gtk_widget_get_pango_context (widget));
pango_font_description_free (font_desc);
@@ -1014,6 +1014,7 @@ static void
run_theme_benchmark (void)
{
GtkWidget* widget;
+ GtkStyleContext *style_context;
cairo_surface_t *pixmap;
MetaFrameBorders borders;
MetaButtonState button_states[META_BUTTON_TYPE_LAST] =
@@ -1038,9 +1039,11 @@ run_theme_benchmark (void)
widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_realize (widget);
+ style_context = meta_theme_create_style_context (gtk_widget_get_screen (widget), NULL);
+
meta_theme_get_frame_borders (global_theme,
META_FRAME_TYPE_NORMAL,
- get_text_height (widget),
+ get_text_height (widget, style_context),
get_flags (widget),
&borders);
@@ -1082,13 +1085,13 @@ run_theme_benchmark (void)
cr = cairo_create (pixmap);
meta_theme_draw_frame (global_theme,
- gtk_widget_get_style_context (widget),
+ style_context,
cr,
META_FRAME_TYPE_NORMAL,
get_flags (widget),
client_width, client_height,
layout,
- get_text_height (widget),
+ get_text_height (widget, style_context),
&button_layout,
button_states,
meta_preview_get_mini_icon (),
@@ -1116,6 +1119,7 @@ run_theme_benchmark (void)
g_timer_destroy (timer);
g_object_unref (G_OBJECT (layout));
+ g_object_unref (style_context);
gtk_widget_destroy (widget);
#undef ITERATIONS
diff --git a/src/ui/theme.c b/src/ui/theme.c
index 8067b9aa..48dff5b4 100644
--- a/src/ui/theme.c
+++ b/src/ui/theme.c
@@ -51,6 +51,7 @@
*/
#include <config.h>
+#include "frames.h" /* for META_TYPE_FRAMES */
#include "theme.h"
#include "theme-parser.h"
#include "util.h"
@@ -5374,6 +5375,39 @@ meta_theme_get_title_scale (MetaTheme *theme,
return style->layout->title_scale;
}
+GtkStyleContext *
+meta_theme_create_style_context (GdkScreen *screen,
+ const gchar *variant)
+{
+ GtkWidgetPath *path;
+ GtkStyleContext *style;
+ char *theme_name;
+
+ g_object_get (gtk_settings_get_for_screen (screen),
+ "gtk-theme-name", &theme_name,
+ NULL);
+
+ style = gtk_style_context_new ();
+ path = gtk_widget_path_new ();
+ gtk_widget_path_append_type (path, META_TYPE_FRAMES);
+ gtk_style_context_set_path (style, path);
+ gtk_widget_path_unref (path);
+
+ if (theme_name && *theme_name)
+ {
+ GtkCssProvider *provider;
+
+ provider = gtk_css_provider_get_named (theme_name, variant);
+ gtk_style_context_add_provider (style,
+ GTK_STYLE_PROVIDER (provider),
+ GTK_STYLE_PROVIDER_PRIORITY_SETTINGS);
+ }
+
+ g_free (theme_name);
+
+ return style;
+}
+
void
meta_theme_draw_frame (MetaTheme *theme,
GtkStyleContext *style_gtk,
diff --git a/src/ui/theme.h b/src/ui/theme.h
index 7645cdef..862c3aab 100644
--- a/src/ui/theme.h
+++ b/src/ui/theme.h
@@ -973,6 +973,9 @@ double meta_theme_get_title_scale (MetaTheme *theme,
MetaFrameType type,
MetaFrameFlags flags);
+GtkStyleContext* meta_theme_create_style_context (GdkScreen *screen,
+ const gchar *variant);
+
void meta_theme_draw_frame (MetaTheme *theme,
GtkStyleContext *style_gtk,
cairo_t *cr,