[metacity/wip/gtk-theme: 5/41] theme: Build a StyleContext hierarchy that matches GTK+'s CSD
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [metacity/wip/gtk-theme: 5/41] theme: Build a StyleContext hierarchy that matches GTK+'s CSD
- Date: Wed, 7 Jan 2015 12:36:31 +0000 (UTC)
commit fdb14ba509195d68affec83feb5dea4bd6462b2a
Author: Florian Müllner <fmuellner gnome org>
Date: Tue Sep 23 04:20:22 2014 +0200
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.c | 102 +++++++++++++++++++++++++++++++++++++++++++------------
src/ui/theme.h | 4 ++
2 files changed, 83 insertions(+), 23 deletions(-)
---
diff --git a/src/ui/theme.c b/src/ui/theme.c
index e563854..7631465 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) \
@@ -5415,43 +5416,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 13bd4a1..8eeb2b9 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;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]