[gimp/gtk3-port: 138/229] Port theme and gtkrc file loading to CSS files using GtkCssProvider



commit 77b2a496c221dc102dffc4be6f184c3ce7ee2cd0
Author: Michael Natterer <mitch gimp org>
Date:   Wed Dec 29 15:16:23 2010 +0100

    Port theme and gtkrc file loading to CSS files using GtkCssProvider

 app/gui/themes.c |  108 +++++++++++++++++++++++++++++++++++-------------------
 libgimp/gimpui.c |   28 +++++++++++--
 2 files changed, 93 insertions(+), 43 deletions(-)
---
diff --git a/app/gui/themes.c b/app/gui/themes.c
index 3e0a6fd..d2c0dbe 100644
--- a/app/gui/themes.c
+++ b/app/gui/themes.c
@@ -53,7 +53,8 @@ static void   themes_theme_change_notify (GimpGuiConfig          *config,
 
 /*  private variables  */
 
-static GHashTable *themes_hash = NULL;
+static GHashTable       *themes_hash           = NULL;
+static GtkStyleProvider *themes_style_provider = NULL;
 
 
 /*  public functions  */
@@ -62,7 +63,6 @@ void
 themes_init (Gimp *gimp)
 {
   GimpGuiConfig *config;
-  gchar         *themerc;
 
   g_return_if_fail (GIMP_IS_GIMP (gimp));
 
@@ -87,15 +87,19 @@ themes_init (Gimp *gimp)
       g_free (path);
     }
 
-  themes_apply_theme (gimp, config->theme);
+  themes_style_provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
+
+  gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
+                                             themes_style_provider,
+                                             GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
 
-  themerc = gimp_personal_rc_file ("themerc");
-  gtk_rc_parse (themerc);
-  g_free (themerc);
+  g_object_unref (themes_style_provider);
 
   g_signal_connect (config, "notify::theme",
                     G_CALLBACK (themes_theme_change_notify),
                     gimp);
+
+  themes_theme_change_notify (config, NULL, gimp);
 }
 
 void
@@ -112,6 +116,12 @@ themes_exit (Gimp *gimp)
       g_hash_table_destroy (themes_hash);
       themes_hash = NULL;
     }
+
+  if (themes_style_provider)
+    {
+      g_object_unref (themes_style_provider);
+      themes_style_provider = NULL;
+    }
 }
 
 gchar **
@@ -209,81 +219,84 @@ static void
 themes_apply_theme (Gimp        *gimp,
                     const gchar *theme_name)
 {
-  GFile         *themerc;
+  GFile         *theme_css;
   GOutputStream *output;
   GError        *error = NULL;
 
   g_return_if_fail (GIMP_IS_GIMP (gimp));
 
-  themerc = gimp_personal_rc_gfile ("themerc");
+  theme_css = gimp_personal_rc_gfile ("theme.css");
 
   if (gimp->be_verbose)
-    g_print ("Writing '%s'\n", gimp_file_get_utf8_name (themerc));
+    g_print ("Writing '%s'\n", gimp_file_get_utf8_name (theme_css));
 
-  output = G_OUTPUT_STREAM (g_file_replace (themerc,
+  output = G_OUTPUT_STREAM (g_file_replace (theme_css,
                                             NULL, FALSE, G_FILE_CREATE_NONE,
                                             NULL, &error));
   if (! output)
     {
       gimp_message (gimp, NULL, GIMP_MESSAGE_ERROR,
                     _("Could not open '%s' for writing: %s"),
-                    gimp_file_get_utf8_name (themerc), error->message);
+                    gimp_file_get_utf8_name (theme_css), error->message);
       g_clear_error (&error);
     }
   else
     {
       const gchar *theme_dir = themes_get_theme_dir (gimp, theme_name);
-      gchar       *gtkrc_theme;
-      gchar       *gtkrc_user;
-      gchar       *esc_gtkrc_theme;
-      gchar       *esc_gtkrc_user;
+      gchar       *css_theme;
+      gchar       *css_user;
+      gchar       *esc_css_theme;
+      gchar       *esc_css_user;
 
       if (theme_dir)
         {
-          gtkrc_theme = g_build_filename (theme_dir, "gtkrc", NULL);
+          css_theme = g_build_filename (theme_dir, "gimp.css", NULL);
         }
       else
         {
           /*  get the hardcoded default theme gtkrc  */
-          gtkrc_theme = g_strdup (gimp_gtkrc ());
+          css_theme = g_build_filename (gimp_data_directory (),
+                                        "themes", "Default", "gimp.css",
+                                        NULL);
         }
 
-      gtkrc_user = gimp_personal_rc_file ("gtkrc");
+      css_user = gimp_personal_rc_file ("gimp.css");
 
-      esc_gtkrc_theme = g_strescape (gtkrc_theme, NULL);
-      esc_gtkrc_user  = g_strescape (gtkrc_user, NULL);
+      esc_css_theme = g_strescape (css_theme, NULL);
+      esc_css_user  = g_strescape (css_user, NULL);
 
       if (! gimp_output_stream_printf
             (output, NULL, NULL, &error,
-             "# GIMP themerc\n"
-             "#\n"
-             "# This file is written on GIMP startup and on every theme change.\n"
-             "# It is NOT supposed to be edited manually. Edit your personal\n"
-             "# gtkrc file instead (%s).\n"
+             "/* GIMP theme.css\n"
+             " *\n"
+             " * This file is written on GIMP startup and on every theme change.\n"
+             " * It is NOT supposed to be edited manually. Edit your personal\n"
+             " * gimp.css file instead (%s).\n"
+             " */\n"
              "\n"
-             "include \"%s\"\n"
-             "include \"%s\"\n"
+             "@import url(\"%s\");\n"
+             "@import url(\"%s\");\n"
              "\n"
-             "# end of themerc\n",
-             gtkrc_user,
-             esc_gtkrc_theme,
-             esc_gtkrc_user))
+             "/* end of theme.css */\n",
+             css_user,
+             esc_css_theme,
+             esc_css_user))
         {
           gimp_message (gimp, NULL, GIMP_MESSAGE_ERROR,
                         _("Error writing '%s': %s"),
-                        gimp_file_get_utf8_name (themerc), error->message);
+                        gimp_file_get_utf8_name (theme_css), error->message);
           g_clear_error (&error);
         }
 
-      g_free (esc_gtkrc_theme);
-      g_free (esc_gtkrc_user);
-      g_free (gtkrc_theme);
-      g_free (gtkrc_user);
+      g_free (esc_css_theme);
+      g_free (esc_css_user);
+      g_free (css_theme);
+      g_free (css_user);
 
       g_object_unref (output);
     }
 
-  g_object_unref (themerc);
+  g_object_unref (theme_css);
 }
 
 static void
@@ -326,7 +339,26 @@ themes_theme_change_notify (GimpGuiConfig *config,
                             GParamSpec    *pspec,
                             Gimp          *gimp)
 {
+  gchar  *theme_css;
+  GError *error = NULL;
+
   themes_apply_theme (gimp, config->theme);
 
-  gtk_rc_reparse_all ();
+  theme_css = gimp_personal_rc_file ("theme.css");
+
+  if (gimp->be_verbose)
+    g_print ("Parsing '%s'\n",
+             gimp_filename_to_utf8 (theme_css));
+
+  if (! gtk_css_provider_load_from_path (GTK_CSS_PROVIDER (themes_style_provider),
+                                         theme_css, &error))
+    {
+      g_printerr ("%s: error parsing %s: %s\n", G_STRFUNC,
+                  gimp_filename_to_utf8 (theme_css), error->message);
+      g_clear_error (&error);
+    }
+
+  g_free (theme_css);
+
+  gtk_style_context_reset_widgets (gdk_screen_get_default ());
 }
diff --git a/libgimp/gimpui.c b/libgimp/gimpui.c
index 1b31877..8e460f1 100644
--- a/libgimp/gimpui.c
+++ b/libgimp/gimpui.c
@@ -91,8 +91,10 @@ void
 gimp_ui_init (const gchar *prog_name,
               gboolean     preview)
 {
-  const gchar *display_name;
-  gchar       *themerc;
+  const gchar    *display_name;
+  GtkCssProvider *css_provider;
+  gchar          *theme_css;
+  GError         *error = NULL;
 
   g_return_if_fail (prog_name != NULL);
 
@@ -125,9 +127,25 @@ gimp_ui_init (const gchar *prog_name,
 
   gtk_init (NULL, NULL);
 
-  themerc = gimp_personal_rc_file ("themerc");
-  gtk_rc_add_default_file (themerc);
-  g_free (themerc);
+  css_provider = gtk_css_provider_new ();
+
+  gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
+                                             GTK_STYLE_PROVIDER (css_provider),
+                                             GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+
+  g_object_unref (css_provider);
+
+  theme_css = gimp_personal_rc_file ("theme.css");
+
+  if (! gtk_css_provider_load_from_path (css_provider,
+                                         theme_css, &error))
+    {
+      g_printerr ("%s: error parsing %s: %s\n", G_STRFUNC,
+                  gimp_filename_to_utf8 (theme_css), error->message);
+      g_clear_error (&error);
+    }
+
+  g_free (theme_css);
 
   gdk_set_program_class (gimp_wm_class ());
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]