From e577c28147303dccb81d30beb02b0d8fbec45f99 Mon Sep 17 00:00:00 2001 From: Eric Koegel Date: Fri, 23 Jun 2017 10:24:36 +0300 Subject: [PATCH] Use custom CSS for the iconview as a fallback (Bug #13609) This patch looks for the theme to provide custom CSS for the XfdesktopIconView if that doesn't exist then we use ToZ's CSS to theme it. It also watches for theme changes and updates accordingly. --- src/xfdesktop-application.c | 64 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/src/xfdesktop-application.c b/src/xfdesktop-application.c index 3bbda438..45efca86 100644 --- a/src/xfdesktop-application.c +++ b/src/xfdesktop-application.c @@ -137,7 +137,24 @@ struct _XfdesktopApplicationClass GApplicationClass parent; }; - +const gchar *ToZ_CSS = +"XfdesktopIconView.view {" +" background-color: rgba(0,0,0,0.0);" +" color: white;" +"}" +"XfdesktopIconView.view:active {" +" background-color: rgba(57,142,231,0.75);" +" color: rgba(57,142,231,0.75);" +" border-radius: 5px;" +"}" +"XfdesktopIconView.rubberband {" +" background-color: rgba(0,0,0,0.25);" +"}" +"XfdesktopIconView.view.label," +"XfdesktopIconView.view.label:active {" +" color: white;" +" text-shadow: 1px 2px black;" +"}"; G_DEFINE_TYPE(XfdesktopApplication, xfdesktop_application, G_TYPE_APPLICATION) @@ -622,8 +639,49 @@ xfdesktop_application_startup(GApplication *g_application) } static void +xfdesktop_application_theme_changed (GtkSettings *settings, + XfdesktopApplication *app) +{ + GtkCssProvider *provider = NULL; + static GtkCssProvider *custom_provider = NULL; + gchar *theme; + gchar *css; + + g_object_get(settings, "gtk-theme-name", &theme, NULL); + + provider = gtk_css_provider_get_named(theme, NULL); + css = gtk_css_provider_to_string (provider); + + if (g_strrstr (css, "XfdesktopIconView") != NULL) { + DBG("XfdesktopIconView section found in theme %s", theme); + if (custom_provider != NULL) { + gtk_style_context_remove_provider_for_screen (gdk_screen_get_default (), + GTK_STYLE_PROVIDER(custom_provider)); + g_clear_object (&custom_provider); + } + } else { + DBG("XfdesktopIconView section not found in theme %s, setting our fallback", theme); + if (custom_provider != NULL) { + gtk_style_context_remove_provider_for_screen (gdk_screen_get_default (), + GTK_STYLE_PROVIDER(custom_provider)); + g_clear_object (&custom_provider); + } + custom_provider = gtk_css_provider_new(); + gtk_css_provider_load_from_data(custom_provider, + ToZ_CSS, + -1, + NULL); + gtk_style_context_add_provider_for_screen (gdk_screen_get_default (), + GTK_STYLE_PROVIDER(custom_provider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + } + g_free(css); +} + +static void xfdesktop_application_start(XfdesktopApplication *app) { + GtkSettings *settings; GdkDisplay *gdpy; GError *error = NULL; gchar buf[1024]; @@ -632,6 +690,10 @@ xfdesktop_application_start(XfdesktopApplication *app) g_return_if_fail(app != NULL); + settings = gtk_settings_get_default(); + g_signal_connect (settings, "notify::gtk-theme-name", G_CALLBACK (xfdesktop_application_theme_changed), NULL); + xfdesktop_application_theme_changed (settings, app); + /* stop autostart timeout */ if(app->wait_for_wm_timeout_id != 0) g_source_remove(app->wait_for_wm_timeout_id); -- 2.11.0