[Xfce4-commits] <xfce4-notifyd:master> The daemon no longer needs to be killed on theme update.

Jérôme Guelfucci noreply at xfce.org
Fri Jan 18 19:48:01 CET 2013


Updating branch refs/heads/master
         to ceeb76b26a5d3e652ae5cd638bfe16ecfe0d68f4 (commit)
       from d9ab1de0f0d0d5e44a777b80e3b68f738dc5a04d (commit)

commit ceeb76b26a5d3e652ae5cd638bfe16ecfe0d68f4
Author: Jérôme Guelfucci <jeromeg at xfce.org>
Date:   Fri Jan 18 19:43:54 2013 +0100

    The daemon no longer needs to be killed on theme update.
    
    This is a bit tricky but far cleaner than killing the daemon.

 xfce4-notifyd-config/main.c        |   24 ----------------------
 xfce4-notifyd/main.c               |   28 +++++++++++++++++++++++++
 xfce4-notifyd/xfce-notify-daemon.c |   39 ++++++++++++++++++++++++++++++++---
 3 files changed, 63 insertions(+), 28 deletions(-)

diff --git a/xfce4-notifyd-config/main.c b/xfce4-notifyd-config/main.c
index 13bba2d..d3a4726 100644
--- a/xfce4-notifyd-config/main.c
+++ b/xfce4-notifyd-config/main.c
@@ -38,29 +38,6 @@
 
 #include "xfce4-notifyd-config.ui.h"
 
-/* unfortunately, currently we have to kill the daemon to
- * change themes.  this is only annoying because existing notifications
- * will get killed */
-static void
-xfce4_notifyd_config_kill_daemon(void)
-{
-    DBusGConnection *dbus_conn;
-    DBusGProxy *proxy;
-
-    dbus_conn = dbus_g_bus_get(DBUS_BUS_SESSION, NULL);
-    if(!dbus_conn)
-        return;
-
-    proxy = dbus_g_proxy_new_for_name(dbus_conn,
-                                      "org.freedesktop.Notifications",
-                                      "/org/freedesktop/Notifications",
-                                      "org.xfce.Notifyd");
-    dbus_g_proxy_call_no_reply(proxy, "Quit", G_TYPE_INVALID);
-
-    g_object_unref(G_OBJECT(proxy));
-    dbus_g_connection_unref(dbus_conn);
-}
-
 static gchar *
 xfce4_notifyd_slider_format_value(GtkScale *slider,
                                   gdouble value,
@@ -115,7 +92,6 @@ xfce4_notifyd_config_theme_changed(XfconfChannel *channel,
             gtk_combo_box_set_active_iter(GTK_COMBO_BOX(theme_combo),
                                           &iter);
             g_free(theme);
-            xfce4_notifyd_config_kill_daemon();
 
             /* TRANSLATORS: notify-send is a command name in the following string,
              * it must not be translated. */
diff --git a/xfce4-notifyd/main.c b/xfce4-notifyd/main.c
index a755b10..8fab30a 100644
--- a/xfce4-notifyd/main.c
+++ b/xfce4-notifyd/main.c
@@ -25,6 +25,8 @@
 #include <string.h>
 #endif
 
+#include <glib/gstdio.h>
+
 #include <gtk/gtk.h>
 
 #include <xfconf/xfconf.h>
@@ -39,8 +41,30 @@ main(int argc,
 {
     XfceNotifyDaemon *xndaemon;
     GError *error = NULL;
+    gchar  *temp_theme_file;
 
     xfconf_init(NULL);
+
+    /* For theming we need to rely on a trick.
+     *
+     * We can't use gtk_rc_parse to parse theme files because if we do
+     * so they get added to the list of rc files for Gtk widgets. Then,
+     * the next time you update the theme and parse a new GtkRc file,
+     * you still have the old values if the new theme does not override
+     * them.
+     *
+     * Thus, we create a temp file that we add to the list of default
+     * GtkRc files. This file will only contain an include to the actual
+     * theme file. That way we only have to call gtk_rc_reparse_all to
+     * update notifications' style.
+     *
+     * This has to be done before gtk_init. */
+
+    temp_theme_file = g_build_path(G_DIR_SEPARATOR_S, g_get_user_cache_dir(),
+                                   "xfce4-notifyd-theme.rc", NULL);
+
+    gtk_rc_add_default_file(temp_theme_file);
+
     gtk_init(&argc, &argv);
 
     xfce_textdomain(GETTEXT_PACKAGE, LOCALEDIR, "UTF-8");
@@ -69,6 +93,10 @@ main(int argc,
 
     gtk_main();
 
+    /* Remove the temp file for themes */
+    g_unlink(temp_theme_file);
+    g_free(temp_theme_file);
+
     g_object_unref(G_OBJECT(xndaemon));
 
     return 0;
diff --git a/xfce4-notifyd/xfce-notify-daemon.c b/xfce4-notifyd/xfce-notify-daemon.c
index 3c02712..ec2972a 100644
--- a/xfce4-notifyd/xfce-notify-daemon.c
+++ b/xfce4-notifyd/xfce-notify-daemon.c
@@ -1119,23 +1119,54 @@ static void
 xfce_notify_daemon_set_theme(XfceNotifyDaemon *xndaemon,
                              const gchar *theme)
 {
-    gchar *file, **files;
+    GError *error = NULL;
+    gchar  *file, **files;
+    gchar  *string;
+    gchar  *temp_theme_file;
+
+    DBG("New theme: %s", theme);
+
+    /* See main.c for an explanation on how the theming works and why
+     * we use this temp file including the real file */
+
+    temp_theme_file = g_build_path(G_DIR_SEPARATOR_S, g_get_user_cache_dir(),
+                                   "xfce4-notifyd-theme.rc", NULL);
 
     /* old-style ~/.themes ... */
     file = g_build_filename(xfce_get_homedir(), ".themes", theme,
                             "xfce-notify-4.0", "gtkrc", NULL);
     if(g_file_test(file, G_FILE_TEST_EXISTS)) {
-        gtk_rc_parse(file);
+        string = g_strconcat("include \"", file, "\"", NULL);
+        if (!g_file_set_contents (temp_theme_file, string, -1, &error)) {
+            xfce_dialog_show_error (NULL, error,
+                                    _("Failed to set new theme"));
+            g_error_free (error);
+        }
+        else
+            gtk_rc_reparse_all ();
+
         g_free(file);
+        g_free(string);
+        g_free(temp_theme_file);
+
         return;
     }
     g_free(file);
 
     file = g_strconcat("themes/", theme, "/xfce-notify-4.0/gtkrc", NULL);
     files = xfce_resource_lookup_all(XFCE_RESOURCE_DATA, file);
-    if(files[0])
-        gtk_rc_parse(files[0]);
 
+    string = g_strconcat("include \"", files[0], "\"", NULL);
+    if (!g_file_set_contents (temp_theme_file, string, -1, &error)) {
+        xfce_dialog_show_error (NULL, error,
+                                _("Failed to set new theme"));
+        g_error_free (error);
+    }
+    else
+        gtk_rc_reparse_all ();
+
+    g_free(string);
+    g_free(temp_theme_file);
     g_free(file);
     g_strfreev(files);
 }


More information about the Xfce4-commits mailing list