summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/reference/gtk/running.sgml4
-rw-r--r--gtk/gtksettings.c57
2 files changed, 41 insertions, 20 deletions
diff --git a/docs/reference/gtk/running.sgml b/docs/reference/gtk/running.sgml
index 8065e194e8..05f0510472 100644
--- a/docs/reference/gtk/running.sgml
+++ b/docs/reference/gtk/running.sgml
@@ -322,6 +322,10 @@ additional environment variables.
that is specified by the gtk-theme-name setting. This is intended
mainly for easy debugging of theme issues.
</para>
+ <para>
+ It is also possible to specify a theme variant to load, by appending
+ the variant name with a colon, like this: `GTK_THEME=Adwaita:dark`.
+ </para>
</formalpara>
<para>
diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c
index ea043e36f8..5c834ef4b6 100644
--- a/gtk/gtksettings.c
+++ b/gtk/gtksettings.c
@@ -2976,47 +2976,63 @@ settings_update_provider (GdkScreen *screen,
}
}
-static char *
-get_theme_name (GtkSettings *settings)
+static void
+get_theme_name (GtkSettings *settings,
+ gchar **theme_name,
+ gchar **theme_variant)
{
- char *theme_name = NULL;
+ gboolean prefer_dark;
+
+ *theme_name = NULL;
+ *theme_variant = NULL;
if (g_getenv ("GTK_THEME"))
- theme_name = g_strdup (g_getenv ("GTK_THEME"));
+ *theme_name = g_strdup (g_getenv ("GTK_THEME"));
- if (theme_name && *theme_name)
- return theme_name;
+ if (*theme_name && **theme_name)
+ {
+ char *p;
+ p = strrchr (*theme_name, ':');
+ if (p) {
+ *p = '\0';
+ p++;
+ *theme_variant = g_strdup (p);
+ }
+
+g_print ("theme: %s variant: %s\n", *theme_name, *theme_variant);
+ return;
+ }
+
+ g_free (*theme_name);
- g_free (theme_name);
g_object_get (settings,
- "gtk-theme-name", &theme_name,
+ "gtk-theme-name", theme_name,
+ "gtk-application-prefer-dark-theme", &prefer_dark,
NULL);
- if (theme_name && *theme_name)
- return theme_name;
+ if (prefer_dark)
+ *theme_variant = g_strdup ("dark");
- g_free (theme_name);
- return g_strdup (DEFAULT_THEME_NAME);
+ if (*theme_name && **theme_name)
+ return;
+
+ g_free (*theme_name);
+ *theme_name = g_strdup (DEFAULT_THEME_NAME);
}
static void
settings_update_theme (GtkSettings *settings)
{
GtkSettingsPrivate *priv = settings->priv;
- gboolean prefer_dark_theme;
gchar *theme_name;
+ gchar *theme_variant;
gchar *theme_dir;
gchar *path;
- g_object_get (settings,
- "gtk-application-prefer-dark-theme", &prefer_dark_theme,
- NULL);
-
- theme_name = get_theme_name (settings);
+ get_theme_name (settings, &theme_name, &theme_variant);
_gtk_css_provider_load_named (priv->theme_provider,
- theme_name,
- prefer_dark_theme ? "dark" : NULL);
+ theme_name, theme_variant);
/* reload per-theme settings */
theme_dir = _gtk_css_provider_get_theme_dir ();
@@ -3026,6 +3042,7 @@ settings_update_theme (GtkSettings *settings)
gtk_settings_load_from_key_file (settings, path, GTK_SETTINGS_SOURCE_THEME);
g_free (theme_name);
+ g_free (theme_variant);
g_free (theme_dir);
g_free (path);
}