summaryrefslogtreecommitdiff
path: root/plugins/background
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/background')
-rw-r--r--plugins/background/msd-background-manager.c105
1 files changed, 64 insertions, 41 deletions
diff --git a/plugins/background/msd-background-manager.c b/plugins/background/msd-background-manager.c
index c255dd3..6c692b4 100644
--- a/plugins/background/msd-background-manager.c
+++ b/plugins/background/msd-background-manager.c
@@ -32,8 +32,6 @@
#include <locale.h>
-#include <dbus/dbus.h>
-
#include <glib.h>
#include <glib/gi18n.h>
#include <gdk/gdk.h>
@@ -56,6 +54,8 @@
#endif
#define MATE_BG_SHOW_DESKTOP_ICONS "show-desktop-icons"
+#define MATE_SESSION_MANAGER_DBUS_NAME "org.mate.SessionManager"
+#define MATE_SESSION_MANAGER_DBUS_PATH "/org/mate/SessionManager"
#define MSD_BACKGROUND_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MSD_TYPE_BACKGROUND_MANAGER, MsdBackgroundManagerPrivate))
@@ -64,7 +64,8 @@ struct MsdBackgroundManagerPrivate {
MateBG *bg;
guint timeout_id;
- DBusConnection *dbus_connection;
+ GDBusProxy *proxy;
+ guint proxy_signal_id;
};
static void
@@ -332,53 +333,76 @@ queue_draw_background (MsdBackgroundManager *manager)
return FALSE;
}
-static DBusHandlerResult
-on_bus_message (DBusConnection* connection,
- DBusMessage* message,
- void* user_data)
+static void
+queue_timeout (MsdBackgroundManager *manager)
{
- MsdBackgroundManager* manager = user_data;
-
- if (dbus_message_is_signal(message, "org.mate.SessionManager", "SessionRunning"))
- {
- /* If the session finishes then check if caja is
- * running and if not, set the background.
- *
- * We wait a few seconds after the session is up
- * because caja 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 caja is
+ * running and if not, set the background.
+ *
+ * We wait a few seconds after the session is up
+ * because caja 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 (MsdBackgroundManager* manager)
+disconnect_session_manager_listener (MsdBackgroundManager* 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)
+{
+ MsdBackgroundManager *manager = MSD_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 (MsdBackgroundManager *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 */
+ MATE_SESSION_MANAGER_DBUS_NAME,
+ MATE_SESSION_MANAGER_DBUS_PATH,
+ MATE_SESSION_MANAGER_DBUS_NAME,
+ 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);
}
static void
@@ -473,11 +497,10 @@ msd_background_manager_stop (MsdBackgroundManager *manager)
disconnect_screen_signals(manager);
- if (manager->priv->dbus_connection != NULL)
+ if (manager->priv->proxy)
{
- dbus_connection_remove_filter(manager->priv->dbus_connection,
- on_bus_message,
- manager);
+ disconnect_session_manager_listener (manager);
+ g_object_unref (manager->priv->proxy);
}
g_signal_handlers_disconnect_by_func (manager->priv->settings,