summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/theme-format.txt12
-rw-r--r--src/ui/theme-parser.c2
-rw-r--r--src/ui/theme.c91
-rw-r--r--src/ui/theme.h5
4 files changed, 108 insertions, 2 deletions
diff --git a/doc/theme-format.txt b/doc/theme-format.txt
index 79ef133f..31b47c4e 100644
--- a/doc/theme-format.txt
+++ b/doc/theme-format.txt
@@ -22,6 +22,18 @@ This document has separate sections for each format version. You may
want to read the document in reverse order, since the base features
are discussed under version 1.
+New Features in Theme Format Version 3.4
+========================================
+
+An additional color type is added to pick up custom colors defined
+in the GTK+ theme's CSS:
+
+ gtk:custom(name,fallback)
+
+where <name> refers to a custom color defined with @define-color in
+the GTK+ theme, and <fallback> provides an alternative color definition
+in case the color referenced by <name> is not found.
+
New Features in Theme Format Version 3.3
========================================
diff --git a/src/ui/theme-parser.c b/src/ui/theme-parser.c
index b4186594..8f7c76fd 100644
--- a/src/ui/theme-parser.c
+++ b/src/ui/theme-parser.c
@@ -38,7 +38,7 @@
* look out for.
*/
#define THEME_MAJOR_VERSION 3
-#define THEME_MINOR_VERSION 3
+#define THEME_MINOR_VERSION 4
#define THEME_VERSION (1000 * THEME_MAJOR_VERSION + THEME_MINOR_VERSION)
#define MARCO_THEME_FILENAME_FORMAT "metacity-theme-%d.xml"
diff --git a/src/ui/theme.c b/src/ui/theme.c
index eb20285d..96dd25f0 100644
--- a/src/ui/theme.c
+++ b/src/ui/theme.c
@@ -1096,6 +1096,10 @@ meta_color_spec_new (MetaColorSpecType type)
size += sizeof (dummy.data.gtk);
break;
+ case META_COLOR_SPEC_GTK_CUSTOM:
+ size += sizeof (dummy.data.gtkcustom);
+ break;
+
case META_COLOR_SPEC_BLEND:
size += sizeof (dummy.data.blend);
break;
@@ -1127,6 +1131,14 @@ meta_color_spec_free (MetaColorSpec *spec)
DEBUG_FILL_STRUCT (&spec->data.gtk);
break;
+ case META_COLOR_SPEC_GTK_CUSTOM:
+ if (spec->data.gtkcustom.color_name)
+ g_free (spec->data.gtkcustom.color_name);
+ if (spec->data.gtkcustom.fallback)
+ meta_color_spec_free (spec->data.gtkcustom.fallback);
+ DEBUG_FILL_STRUCT (&spec->data.gtkcustom);
+ break;
+
case META_COLOR_SPEC_BLEND:
if (spec->data.blend.foreground)
meta_color_spec_free (spec->data.blend.foreground);
@@ -1153,7 +1165,67 @@ meta_color_spec_new_from_string (const char *str,
spec = NULL;
- if (str[0] == 'g' && str[1] == 't' && str[2] == 'k' && str[3] == ':')
+ if (str[0] == 'g' && str[1] == 't' && str[2] == 'k' && str[3] == ':' &&
+ str[4] == 'c' && str[5] == 'u' && str[6] == 's' && str[7] == 't' &&
+ str[8] == 'o' && str[9] == 'm')
+ {
+ const char *color_name_start, *fallback_str_start, *end;
+ char *color_name, *fallback_str;
+ MetaColorSpec *fallback = NULL;
+
+ if (str[10] != '(')
+ {
+ g_set_error (err, META_THEME_ERROR,
+ META_THEME_ERROR_FAILED,
+ _("GTK custom color specification must have color name and fallback in parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""),
+ str);
+ return NULL;
+ }
+
+ color_name_start = str + 11;
+
+ fallback_str_start = color_name_start;
+ while (*fallback_str_start && *fallback_str_start != ',')
+ {
+ if (!(g_ascii_isalnum (*fallback_str_start)
+ || *fallback_str_start == '-'
+ || *fallback_str_start == '_'))
+ {
+ g_set_error (err, META_THEME_ERROR,
+ META_THEME_ERROR_FAILED,
+ _("Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-_ are valid"),
+ *fallback_str_start);
+ return NULL;
+ }
+ fallback_str_start++;
+ }
+ fallback_str_start++;
+
+ end = strrchr (str, ')');
+
+ if (color_name_start == NULL || fallback_str_start == NULL || end == NULL)
+ {
+ g_set_error (err, META_THEME_ERROR,
+ META_THEME_ERROR_FAILED,
+ _("Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not fit the format"),
+ str);
+ return NULL;
+ }
+
+ fallback_str = g_strndup (fallback_str_start, end - fallback_str_start);
+ fallback = meta_color_spec_new_from_string (fallback_str, err);
+ g_free (fallback_str);
+
+ if (fallback == NULL)
+ return NULL;
+
+ color_name = g_strndup (color_name_start, fallback_str_start - color_name_start - 1);
+
+ spec = meta_color_spec_new (META_COLOR_SPEC_GTK_CUSTOM);
+ spec->data.gtkcustom.color_name = color_name;
+ spec->data.gtkcustom.fallback = fallback;
+ }
+ else if (str[0] == 'g' && str[1] == 't' && str[2] == 'k' && str[3] == ':')
{
/* GTK color */
const char *bracket;
@@ -1497,6 +1569,16 @@ meta_set_color_from_style (GdkRGBA *color,
}
}
+static void
+meta_set_custom_color_from_style (GdkRGBA *color,
+ GtkStyleContext *context,
+ char *color_name,
+ MetaColorSpec *fallback)
+{
+ if (!gtk_style_context_lookup_color (context, color_name, color))
+ meta_color_spec_render (fallback, context, color);
+}
+
void
meta_color_spec_render (MetaColorSpec *spec,
GtkStyleContext *style,
@@ -1519,6 +1601,13 @@ meta_color_spec_render (MetaColorSpec *spec,
spec->data.gtk.component);
break;
+ case META_COLOR_SPEC_GTK_CUSTOM:
+ meta_set_custom_color_from_style (color,
+ style,
+ spec->data.gtkcustom.color_name,
+ spec->data.gtkcustom.fallback);
+ break;
+
case META_COLOR_SPEC_BLEND:
{
GdkRGBA bg, fg;
diff --git a/src/ui/theme.h b/src/ui/theme.h
index e248b3b3..56144edc 100644
--- a/src/ui/theme.h
+++ b/src/ui/theme.h
@@ -232,6 +232,7 @@ typedef enum
{
META_COLOR_SPEC_BASIC,
META_COLOR_SPEC_GTK,
+ META_COLOR_SPEC_GTK_CUSTOM,
META_COLOR_SPEC_BLEND,
META_COLOR_SPEC_SHADE
} MetaColorSpecType;
@@ -262,6 +263,10 @@ struct _MetaColorSpec
GtkStateFlags state;
} gtk;
struct {
+ char *color_name;
+ MetaColorSpec *fallback;
+ } gtkcustom;
+ struct {
MetaColorSpec *foreground;
MetaColorSpec *background;
double alpha;