From 2db71e73b49d2540432afb3c9d6175937b651fb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Tue, 23 Sep 2014 04:20:22 +0200 Subject: [PATCH] theme: Build a StyleContext hierarchy that matches GTK+'s CSD In order to pick up all theme information from GTK+, a single style context is not enough; a style hierarchy that closely matches the widget hierarchy by GTK+'s client-side decorations will allow this soon. https://bugzilla.gnome.org/show_bug.cgi?id=741917 --- src/ui/theme-private.h | 4 ++ src/ui/theme.c | 103 +++++++++++++++++++++++++++++++---------- 2 files changed, 83 insertions(+), 24 deletions(-) diff --git a/src/ui/theme-private.h b/src/ui/theme-private.h index 7b0936f65..bd482bac7 100644 --- a/src/ui/theme-private.h +++ b/src/ui/theme-private.h @@ -684,6 +684,10 @@ typedef enum typedef enum { META_STYLE_ELEMENT_FRAME, + META_STYLE_ELEMENT_TITLEBAR, + META_STYLE_ELEMENT_TITLE, + META_STYLE_ELEMENT_BUTTON, + META_STYLE_ELEMENT_IMAGE, META_STYLE_ELEMENT_LAST } MetaStyleElement; diff --git a/src/ui/theme.c b/src/ui/theme.c index 326ac1898..c9ba282e4 100644 --- a/src/ui/theme.c +++ b/src/ui/theme.c @@ -42,6 +42,7 @@ #include #include #include +#include #include #define GDK_COLOR_RGBA(color) \ @@ -4999,44 +5000,98 @@ meta_theme_get_title_scale (MetaTheme *theme, return style->layout->title_scale; } +static GtkStyleContext * +create_style_context (GType widget_type, + GtkStyleContext *parent_style, + GtkCssProvider *provider, + const char *first_class, + ...) +{ + GtkStyleContext *style; + GtkWidgetPath *path; + const char *name; + va_list ap; + + style = gtk_style_context_new (); + gtk_style_context_set_parent (style, parent_style); + + if (parent_style) + path = gtk_widget_path_copy (gtk_style_context_get_path (parent_style)); + else + path = gtk_widget_path_new (); + + gtk_widget_path_append_type (path, widget_type); + + va_start (ap, first_class); + for (name = first_class; name; name = va_arg (ap, const char *)) + gtk_widget_path_iter_add_class (path, -1, name); + va_end (ap); + + gtk_style_context_set_path (style, path); + gtk_widget_path_unref (path); + + gtk_style_context_add_provider (style, GTK_STYLE_PROVIDER (provider), + GTK_STYLE_PROVIDER_PRIORITY_SETTINGS); + + return style; +} + MetaStyleInfo * meta_theme_create_style_info (GdkScreen *screen, const gchar *variant) { - GtkWidgetPath *path; MetaStyleInfo *style_info; - GtkStyleContext *style; + GtkCssProvider *provider; char *theme_name; g_object_get (gtk_settings_get_for_screen (screen), "gtk-theme-name", &theme_name, NULL); + if (theme_name && *theme_name) + provider = gtk_css_provider_get_named (theme_name, variant); + else + provider = gtk_css_provider_get_default (); + g_free (theme_name); + style_info = g_new0 (MetaStyleInfo, 1); style_info->refcount = 1; - path = gtk_widget_path_new (); - - style_info->styles[META_STYLE_ELEMENT_FRAME] = style = gtk_style_context_new (); - gtk_widget_path_append_type (path, META_TYPE_FRAMES); - gtk_widget_path_iter_add_class (path, -1, GTK_STYLE_CLASS_BACKGROUND); - gtk_widget_path_iter_add_class (path, -1, "window-frame"); - 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); - + style_info->styles[META_STYLE_ELEMENT_FRAME] = + create_style_context (META_TYPE_FRAMES, + NULL, + provider, + GTK_STYLE_CLASS_BACKGROUND, + "window-frame", + "ssd", + NULL); + style_info->styles[META_STYLE_ELEMENT_TITLEBAR] = + create_style_context (GTK_TYPE_HEADER_BAR, + style_info->styles[META_STYLE_ELEMENT_FRAME], + provider, + GTK_STYLE_CLASS_TITLEBAR, + GTK_STYLE_CLASS_HORIZONTAL, + "default-decoration", + "header-bar", + NULL); + style_info->styles[META_STYLE_ELEMENT_TITLE] = + create_style_context (GTK_TYPE_LABEL, + style_info->styles[META_STYLE_ELEMENT_TITLEBAR], + provider, + GTK_STYLE_CLASS_TITLE, + NULL); + style_info->styles[META_STYLE_ELEMENT_BUTTON] = + create_style_context (GTK_TYPE_BUTTON, + style_info->styles[META_STYLE_ELEMENT_TITLEBAR], + provider, + GTK_STYLE_CLASS_BUTTON, + "titlebutton", + NULL); + style_info->styles[META_STYLE_ELEMENT_IMAGE] = + create_style_context (GTK_TYPE_IMAGE, + style_info->styles[META_STYLE_ELEMENT_BUTTON], + provider, + NULL); return style_info; }