diff options
Diffstat (limited to 'src/ui/frames.c')
-rw-r--r-- | src/ui/frames.c | 95 |
1 files changed, 91 insertions, 4 deletions
diff --git a/src/ui/frames.c b/src/ui/frames.c index 02613210..ebf46392 100644 --- a/src/ui/frames.c +++ b/src/ui/frames.c @@ -25,6 +25,7 @@ #include <config.h> #include <math.h> +#include <string.h> #include "boxes.h" #include "frames.h" #include "util.h" @@ -180,6 +181,74 @@ 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_THEME); + } + + if (theme_name) + g_free (theme_name); + + return style; +} + +static GtkStyleContext * +meta_frames_get_theme_variant (MetaFrames *frames, + const gchar *variant) +{ + GtkStyleContext *style; + + style = g_hash_table_lookup (frames->style_variants, variant); + if (style == NULL) + { + style = create_style_context (frames, variant); + g_hash_table_insert (frames->style_variants, g_strdup (variant), style); + } + + return style; +} + +static void +update_style_contexts (MetaFrames *frames) +{ + GtkStyleContext *style; + GList *variants, *variant; + + if (frames->normal_style) + g_object_unref (frames->normal_style); + frames->normal_style = create_style_context (frames, 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); + g_hash_table_insert (frames->style_variants, + g_strdup (variant->data), style); + } + g_list_free (variants); +} static void meta_frames_init (MetaFrames *frames) { @@ -194,6 +263,8 @@ meta_frames_init (MetaFrames *frames) frames->invalidate_cache_timeout_id = 0; frames->invalidate_frames = NULL; frames->cache = g_hash_table_new (g_direct_hash, g_direct_equal); + frames->style_variants = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, g_object_unref); meta_prefs_add_listener (prefs_changed_callback, frames); } @@ -208,13 +279,13 @@ listify_func (gpointer key, gpointer value, gpointer data) } static void -meta_frames_destroy (GtkWidget *object) +meta_frames_destroy (GtkWidget *widget) { GSList *winlist; GSList *tmp; MetaFrames *frames; - frames = META_FRAMES (object); + frames = META_FRAMES (widget); clear_tip (frames); @@ -232,7 +303,10 @@ meta_frames_destroy (GtkWidget *object) } g_slist_free (winlist); - GTK_WIDGET_CLASS (meta_frames_parent_class)->destroy (object); + g_object_unref (frames->normal_style); + g_hash_table_destroy (frames->style_variants); + + GTK_WIDGET_CLASS (meta_frames_parent_class)->destroy (widget); } static void @@ -409,6 +483,7 @@ meta_frames_style_set (GtkWidget *widget, meta_frames_font_changed (frames); + update_style_contexts (frames); g_hash_table_foreach (frames->frames, reattach_style_func, frames); @@ -557,10 +632,22 @@ static void meta_frames_attach_style (MetaFrames *frames, MetaUIFrame *frame) { + gboolean has_frame; + char *variant = NULL; if (frame->style != NULL) g_object_unref (frame->style); - frame->style = g_object_ref (gtk_widget_get_style_context (GTK_WIDGET (frames))); + meta_core_get (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), + frame->xwindow, + META_CORE_WINDOW_HAS_FRAME, &has_frame, + META_CORE_GET_THEME_VARIANT, &variant, + META_CORE_GET_END); + + if (variant == NULL || strcmp(variant, "normal") == 0) + frame->style = g_object_ref (frames->normal_style); + else + frame->style = g_object_ref (meta_frames_get_theme_variant (frames, + variant)); } void |