summaryrefslogtreecommitdiff
path: root/gtk/gtkrc.c
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2010-05-06 20:35:52 +0100
committerBastien Nocera <hadess@hadess.net>2010-05-10 01:15:14 +0100
commit4551509af1e5e3825646231530c31d2840a85ca3 (patch)
treeae89821261cf3370b5faeb9cbaf75fa8beff423f /gtk/gtkrc.c
parentb76557e9444a50d947061c2d90d19d0c13f2e003 (diff)
downloadgtk+-4551509af1e5e3825646231530c31d2840a85ca3.tar.gz
Make it easy for apps to have dark themes
Some types of applications would benefit from having "dark" themes, usually black backgrounds, such as: * Movie players * Photo management and display applications To make it easy for those applications to prefer a dark theme, we're adding the "gtk-application-prefer-dark-theme" GtkSetting, which will make the theme loading code automatically look for a "gtkrc-dark" file in the same directory you would usually find a gtkrc file. the same name and a "-dark" suffix. If no "-dark" gtkrc variant is available, the normal gtkrc will be used. https://bugzilla.gnome.org/show_bug.cgi?id=617955
Diffstat (limited to 'gtk/gtkrc.c')
-rw-r--r--gtk/gtkrc.c53
1 files changed, 41 insertions, 12 deletions
diff --git a/gtk/gtkrc.c b/gtk/gtkrc.c
index a23a605785..42963a1086 100644
--- a/gtk/gtkrc.c
+++ b/gtk/gtkrc.c
@@ -117,9 +117,10 @@ struct _GtkRcContext
/* The files we have parsed, to reread later if necessary */
GSList *rc_files;
- gchar *theme_name;
- gchar *key_theme_name;
- gchar *font_name;
+ gchar *theme_name;
+ gboolean prefer_dark_theme;
+ gchar *key_theme_name;
+ gchar *font_name;
gchar **pixmap_path;
@@ -160,9 +161,10 @@ static GtkStyle * gtk_rc_style_to_style (GtkRcContext *context,
static GtkStyle* gtk_rc_init_style (GtkRcContext *context,
GSList *rc_styles);
static void gtk_rc_parse_default_files (GtkRcContext *context);
-static void gtk_rc_parse_named (GtkRcContext *context,
+static gboolean gtk_rc_parse_named (GtkRcContext *context,
const gchar *name,
- const gchar *type);
+ const gchar *type,
+ const gchar *variant);
static void gtk_rc_context_parse_file (GtkRcContext *context,
const gchar *filename,
gint priority,
@@ -624,6 +626,7 @@ gtk_rc_settings_changed (GtkSettings *settings,
{
gchar *new_theme_name;
gchar *new_key_theme_name;
+ gboolean new_prefer_dark_theme;
if (context->reloading)
return;
@@ -631,12 +634,14 @@ gtk_rc_settings_changed (GtkSettings *settings,
g_object_get (settings,
"gtk-theme-name", &new_theme_name,
"gtk-key-theme-name", &new_key_theme_name,
+ "gtk-application-prefer-dark-theme", &new_prefer_dark_theme,
NULL);
if ((new_theme_name != context->theme_name &&
!(new_theme_name && context->theme_name && strcmp (new_theme_name, context->theme_name) == 0)) ||
(new_key_theme_name != context->key_theme_name &&
- !(new_key_theme_name && context->key_theme_name && strcmp (new_key_theme_name, context->key_theme_name) == 0)))
+ !(new_key_theme_name && context->key_theme_name && strcmp (new_key_theme_name, context->key_theme_name) == 0)) ||
+ new_prefer_dark_theme != context->prefer_dark_theme)
{
gtk_rc_reparse_all_for_settings (settings, TRUE);
}
@@ -692,6 +697,7 @@ gtk_rc_context_get (GtkSettings *settings)
"gtk-key-theme-name", &context->key_theme_name,
"gtk-font-name", &context->font_name,
"color-hash", &context->color_hash,
+ "gtk-application-prefer-dark-theme", &context->prefer_dark_theme,
NULL);
g_signal_connect (settings,
@@ -710,6 +716,10 @@ gtk_rc_context_get (GtkSettings *settings)
"notify::color-hash",
G_CALLBACK (gtk_rc_color_hash_changed),
context);
+ g_signal_connect (settings,
+ "notify::gtk-application-prefer-dark-theme",
+ G_CALLBACK (gtk_rc_settings_changed),
+ context);
context->pixmap_path = NULL;
@@ -785,22 +795,27 @@ _gtk_rc_context_destroy (GtkSettings *settings)
settings->rc_context = NULL;
}
-static void
+static gboolean
gtk_rc_parse_named (GtkRcContext *context,
const gchar *name,
- const gchar *type)
+ const gchar *type,
+ const gchar *variant)
{
gchar *path = NULL;
const gchar *home_dir;
gchar *subpath;
+ gboolean retval;
+
+ retval = FALSE;
if (type)
subpath = g_strconcat ("gtk-3.0-", type,
G_DIR_SEPARATOR_S "gtkrc",
NULL);
else
- subpath = g_strdup ("gtk-3.0" G_DIR_SEPARATOR_S "gtkrc");
-
+ subpath = g_strconcat ("gtk-3.0" G_DIR_SEPARATOR_S "gtkrc",
+ variant, NULL);
+
/* First look in the users home directory
*/
home_dir = g_get_home_dir ();
@@ -831,9 +846,12 @@ gtk_rc_parse_named (GtkRcContext *context,
{
gtk_rc_context_parse_file (context, path, GTK_PATH_PRIO_THEME, FALSE);
g_free (path);
+ retval = TRUE;
}
g_free (subpath);
+
+ return retval;
}
static void
@@ -1824,12 +1842,23 @@ gtk_rc_reparse_all_for_settings (GtkSettings *settings,
g_object_get (context->settings,
"gtk-theme-name", &context->theme_name,
"gtk-key-theme-name", &context->key_theme_name,
+ "gtk-application-prefer-dark-theme", &context->prefer_dark_theme,
NULL);
if (context->theme_name && context->theme_name[0])
- gtk_rc_parse_named (context, context->theme_name, NULL);
+ {
+ if (context->prefer_dark_theme)
+ {
+ if (!gtk_rc_parse_named (context, context->theme_name, NULL, "-dark"))
+ gtk_rc_parse_named (context, context->theme_name, NULL, NULL);
+ }
+ else
+ {
+ gtk_rc_parse_named (context, context->theme_name, NULL, NULL);
+ }
+ }
if (context->key_theme_name && context->key_theme_name[0])
- gtk_rc_parse_named (context, context->key_theme_name, "key");
+ gtk_rc_parse_named (context, context->key_theme_name, "key", NULL);
context->reloading = FALSE;