summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Müllner <[email protected]>2014-09-27 18:25:31 +0300
committerVictor Kareh <[email protected]>2018-08-28 09:38:37 -0400
commit18bfff32531e13d18c53f9a990fdf48a2cd52673 (patch)
tree8f6ada880c41f5a37a48457b4813d5fd11c8d76c
parented5eff6a2bf4a0d0a70d526726116d02442fdbac (diff)
downloadmarco-18bfff32531e13d18c53f9a990fdf48a2cd52673.tar.bz2
marco-18bfff32531e13d18c53f9a990fdf48a2cd52673.tar.xz
theme: Allow using custom colors from the GTK+ theme
Add an additional color type to pick up colors defined with @define-color in the GTK+ theme's CSS: gtk:custom(name,fallback) (where "name" refers to the name defined in GTK+'s CSS, and fallback refers to an alternative color spec which is used when the color referenced by "name" is not found) The main intent of the change is to allow designers to improve Adwaita's dark theme variant without having to compromise on colors which work in the light variant as well. https://bugzilla.gnome.org/show_bug.cgi?id=648709 NOTE: Patch copied from mutter and adapted for metacity.
-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;