[gnome-settings-daemon] Fix various background drawing issues

Daniel Williams dcbw at fedoraproject.org
Wed Dec 1 18:18:24 UTC 2010


commit d8cf27028460c473fc8aadb1ceaf822f31534ec7
Author: Dan Williams <dcbw at redhat.com>
Date:   Wed Dec 1 12:17:17 2010 -0600

    Fix various background drawing issues

 background-convert-to-gdbus.patch                  |  167 ++++++++++++++++++++
 ...d-draw-the-background-on-startup-if-show-.patch |   41 +++++
 gnome-settings-daemon.spec                         |   16 ++-
 3 files changed, 220 insertions(+), 4 deletions(-)
---
diff --git a/background-convert-to-gdbus.patch b/background-convert-to-gdbus.patch
new file mode 100644
index 0000000..c966941
--- /dev/null
+++ b/background-convert-to-gdbus.patch
@@ -0,0 +1,167 @@
+commit 6cf4514d7813835040484065f93d55abdfc91087
+Author: Dan Williams <dcbw at redhat.com>
+Date:   Wed Dec 1 11:32:17 2010 -0600
+
+    background: convert to GDBus (and fix delayed background drawing)
+    
+    For some reason the signal filter with plain DBus wasn't working
+    correctly, leading to no background when nautilus was for whatever
+    reason not autolaunched, and show-desktop-icons was TRUE.  In any
+    case it should be GDBus not libdbus, so port it.  That also
+    happens to fix the signal listening issue.
+
+    https://bugzilla.gnome.org/show_bug.cgi?id=636233
+
+diff --git a/plugins/background/gsd-background-manager.c b/plugins/background/gsd-background-manager.c
+index 30370fa..071eb85 100644
+--- a/plugins/background/gsd-background-manager.c
++++ b/plugins/background/gsd-background-manager.c
+@@ -32,10 +32,9 @@
+ 
+ #include <locale.h>
+ 
+-#include <dbus/dbus.h>
+-
+ #include <glib.h>
+ #include <glib/gi18n.h>
++#include <gio/gio.h>
+ #include <gdk/gdk.h>
+ #include <gdk/gdkx.h>
+ 
+@@ -54,7 +53,8 @@ struct GsdBackgroundManagerPrivate
+         GnomeBG     *bg;
+         guint        timeout_id;
+ 
+-        DBusConnection *dbus_connection;
++        GDBusProxy  *proxy;
++        guint        proxy_signal_id;
+ };
+ 
+ static void     gsd_background_manager_class_init  (GsdBackgroundManagerClass *klass);
+@@ -287,53 +287,77 @@ queue_draw_background (GsdBackgroundManager *manager)
+         return FALSE;
+ }
+ 
+-static DBusHandlerResult
+-on_bus_message (DBusConnection *connection,
+-                DBusMessage    *message,
+-                void           *user_data)
++static void
++queue_timeout (GsdBackgroundManager *manager)
+ {
+-        GsdBackgroundManager *manager = user_data;
+-
+-        if (dbus_message_is_signal (message,
+-                                    "org.gnome.SessionManager",
+-                                    "SessionRunning")) {
+-                /* If the session finishes then check if nautilus is
+-                 * running and if not, set the background.
+-                 *
+-                 * We wait a few seconds after the session is up
+-                 * because nautilus tells the session manager that its
+-                 * ready before it sets the background.
+-                 */
+-                manager->priv->timeout_id = g_timeout_add_seconds (8,
+-                                                                   (GSourceFunc)
+-                                                                   queue_draw_background,
+-                                                                   manager);
+-                dbus_connection_remove_filter (connection,
+-                                               on_bus_message,
+-                                               manager);
+-
+-                manager->priv->dbus_connection = NULL;
+-        }
++        if (manager->priv->timeout_id > 0)
++                return;
+ 
+-        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
++        /* If the session finishes then check if nautilus is
++         * running and if not, set the background.
++         *
++         * We wait a few seconds after the session is up
++         * because nautilus tells the session manager that its
++         * ready before it sets the background.
++         */
++        manager->priv->timeout_id = g_timeout_add_seconds (8,
++                                                           (GSourceFunc)
++                                                           queue_draw_background,
++                                                           manager);
+ }
+ 
+ static void
+-draw_background_after_session_loads (GsdBackgroundManager *manager)
++disconnect_session_manager_listener (GsdBackgroundManager *manager)
+ {
+-        DBusConnection *connection;
++        if (manager->priv->proxy && manager->priv->proxy_signal_id) {
++                g_signal_handler_disconnect (manager->priv->proxy,
++                                             manager->priv->proxy_signal_id);
++                manager->priv->proxy_signal_id = 0;
++        }
++}
+ 
+-        connection = dbus_bus_get (DBUS_BUS_SESSION, NULL);
++static void
++on_session_manager_signal (GDBusProxy   *proxy,
++                           const gchar  *sender_name,
++                           const gchar  *signal_name,
++                           GVariant     *parameters,
++                           gpointer      user_data)
++{
++        GsdBackgroundManager *manager = GSD_BACKGROUND_MANAGER (user_data);
+ 
+-        if (connection == NULL) {
+-                return;
++        if (g_strcmp0 (signal_name, "SessionRunning") == 0) {
++                queue_timeout (manager);
++                disconnect_session_manager_listener (manager);
+         }
++}
+ 
+-        if (!dbus_connection_add_filter (connection, on_bus_message, manager, NULL)) {
++static void
++draw_background_after_session_loads (GsdBackgroundManager *manager)
++{
++        GError *error = NULL;
++        GDBusProxyFlags flags;
++
++        flags = G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
++                G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START;
++        manager->priv->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
++                                                              flags,
++                                                              NULL, /* GDBusInterfaceInfo */
++                                                              "org.gnome.SessionManager",
++                                                              "/org/gnome/SessionManager",
++                                                              "org.gnome.SessionManager",
++                                                              NULL, /* GCancellable */
++                                                              &error);
++        if (manager->priv->proxy == NULL) {
++                g_warning ("Could not listen to session manager: %s",
++                           error->message);
++                g_error_free (error);
+                 return;
+-        };
++        }
+ 
+-        manager->priv->dbus_connection = connection;
++        manager->priv->proxy_signal_id = g_signal_connect (manager->priv->proxy,
++                                                           "g-signal",
++                                                           G_CALLBACK (on_session_manager_signal),
++                                                           manager);
+ }
+ 
+ 
+@@ -423,10 +447,9 @@ gsd_background_manager_stop (GsdBackgroundManager *manager)
+ 
+         disconnect_screen_signals (manager);
+ 
+-        if (manager->priv->dbus_connection != NULL) {
+-                dbus_connection_remove_filter (manager->priv->dbus_connection,
+-                                               on_bus_message,
+-                                               manager);
++        if (manager->priv->proxy) {
++                disconnect_session_manager_listener (manager);
++                g_object_unref (manager->priv->proxy);
+         }
+ 
+         g_signal_handlers_disconnect_by_func (manager->priv->settings,
diff --git a/background-draw-the-background-on-startup-if-show-.patch b/background-draw-the-background-on-startup-if-show-.patch
new file mode 100644
index 0000000..7b82ed9
--- /dev/null
+++ b/background-draw-the-background-on-startup-if-show-.patch
@@ -0,0 +1,41 @@
+From 5f4d6e23c0f1d37b36e3f4fcad2894af49a4dd33 Mon Sep 17 00:00:00 2001
+From: Owen W. Taylor <otaylor at fishsoup.net>
+Date: Tue, 30 Nov 2010 23:04:17 -0500
+Subject: [PATCH] background: draw the background on startup if show-desktop-icons unset
+
+When show-desktop-icons is not set, we need to call draw_bg() not just
+setup_bg(). Also remove a duplicate call to gnome_bg_load_from_preferences()
+which setup_bg already does.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=636191
+---
+ plugins/background/gsd-background-manager.c |    6 ++++--
+ 1 files changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/plugins/background/gsd-background-manager.c b/plugins/background/gsd-background-manager.c
+index 30370fa..0e96f1e 100644
+--- a/plugins/background/gsd-background-manager.c
++++ b/plugins/background/gsd-background-manager.c
+@@ -225,9 +225,10 @@ background_changed (GsdBackgroundManager *manager,
+         if (!nautilus_is_running () || !show_desktop_icons) {
+                 if (manager->priv->bg == NULL) {
+                         setup_bg (manager);
++                } else {
++                        gnome_bg_load_from_preferences (manager->priv->bg,
++                                                        manager->priv->settings);
+                 }
+-                gnome_bg_load_from_preferences (manager->priv->bg,
+-                                                manager->priv->settings);
+                 draw_background (manager, use_crossfade);
+         }
+ }
+@@ -403,6 +404,7 @@ gsd_background_manager_start (GsdBackgroundManager *manager,
+ 
+         if (!show_desktop_icons) {
+                 setup_bg (manager);
++                draw_background (manager, FALSE);
+         } else {
+                 draw_background_after_session_loads (manager);
+         }
+-- 
+1.7.3.2
\ No newline at end of file
diff --git a/gnome-settings-daemon.spec b/gnome-settings-daemon.spec
index 4b6bff9..1f98502 100644
--- a/gnome-settings-daemon.spec
+++ b/gnome-settings-daemon.spec
@@ -1,6 +1,6 @@
 Name:           gnome-settings-daemon
 Version:        2.91.5
-Release:        2%{?dist}
+Release:        3%{?dist}
 Summary:        The daemon sharing settings from GNOME to GTK+/KDE applications
 
 Group:          System Environment/Daemons
@@ -32,9 +32,14 @@ BuildRequires:  autoconf automake libtool
 BuildRequires:  libxklavier-devel
 BuildRequires:  gsettings-desktop-schemas-devel >= 0.1.2
 
+# https://bugzilla.gnome.org/show_bug.cgi?id=636191
+Patch0: background-draw-the-background-on-startup-if-show-.patch
+
+# https://bugzilla.gnome.org/show_bug.cgi?id=636233
+Patch1: background-convert-to-gdbus.patch
+
 # change font rendering
 #Patch3: slight-hinting.patch
-Patch4: autorun-Handle-rename-of-org.gnome.media-handling.patch
 
 %description
 A daemon to share settings from GNOME to other applications. It also
@@ -52,9 +57,9 @@ developing applications that use %{name}.
 
 %prep
 %setup -q
+%patch0 -p1 -b .draw-background
+%patch1 -p1 -b .draw-no-nautilus
 #%patch3 -p1 -b .slight-hinting
-# Upstream commit cb9a3a0e4144d
-%patch4 -p1 -b .media-handling
 
 %build
 # https://fedoraproject.org/wiki/Features/ChangeInImplicitDSOLinking
@@ -115,6 +120,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor >&/dev/null || :
 %{_libdir}/pkgconfig/gnome-settings-daemon.pc
 
 %changelog
+* Wed Dec  1 2010 Dan Williams <dcbw at redhat.com> - 2.91.5-3
+- Fix various cases of forgetting to draw the background
+
 * Tue Nov 30 2010 Owen Taylor <otaylor at redhat.com> - 2.91.5-2
 - Add a patch handling org.gnome.media-handling gsettings schema rename
 


More information about the scm-commits mailing list