summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Müllner <fmuellner@gnome.org>2014-09-23 04:20:22 +0200
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2015-02-19 18:44:11 +0200
commitddabab931faa9fb8afd689c9a46d512a8a5c9729 (patch)
tree45d652d778dfbc191d74ea2f3e4cdbfb80af6cf4
parent6582c8a7b2d32a0e231771bb6206e289ddaf46cc (diff)
downloadmetacity-ddabab931faa9fb8afd689c9a46d512a8a5c9729.tar.gz
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
-rw-r--r--src/ui/theme.c102
-rw-r--r--src/ui/theme.h4
2 files changed, 83 insertions, 23 deletions
diff --git a/src/ui/theme.c b/src/ui/theme.c
index b89cad59..b4ea955b 100644
--- a/src/ui/theme.c
+++ b/src/ui/theme.c
@@ -60,6 +60,7 @@
#include <string.h>
#include <stdlib.h>
#define __USE_XOPEN
+#include <stdarg.h>
#include <math.h>
#define GDK_COLOR_RGBA(color) \
@@ -5439,43 +5440,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);
- 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);
+ else
+ provider = gtk_css_provider_get_default ();
+ g_free (theme_name);
- provider = gtk_css_provider_get_named (theme_name, variant);
- gtk_style_context_add_provider (style,
- GTK_STYLE_PROVIDER (provider),
- GTK_STYLE_PROVIDER_PRIORITY_SETTINGS);
- }
+ style_info = g_new0 (MetaStyleInfo, 1);
+ style_info->refcount = 1;
- 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;
}
diff --git a/src/ui/theme.h b/src/ui/theme.h
index 3966d928..da7ffe8b 100644
--- a/src/ui/theme.h
+++ b/src/ui/theme.h
@@ -640,6 +640,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;