+static void
+empathy_presence_manager_set_auto_away_cb (GSettings *gsettings,
+ const gchar *key,
+ gpointer user_data)
+{
+ EmpathyPresenceManager *presence_mgr = user_data;
+
+ empathy_presence_manager_set_auto_away (presence_mgr,
+ g_settings_get_boolean (gsettings, key));
+}
+
+#define GNOME_SHELL_BUS_NAME "org.gnome.Shell"
+
+static void
+list_names_cb (TpDBusDaemon *bus_daemon,
+ const gchar * const *names,
+ const GError *error,
+ gpointer user_data,
+ GObject *weak_object)
+{
+ EmpathyApp *self = (EmpathyApp *) weak_object;
+ guint i;
+
+ if (error != NULL)
+ goto out;
+
+ for (i = 0; names[i] != NULL; i++)
+ {
+ if (!tp_strdiff (names[i], GNOME_SHELL_BUS_NAME))
+ {
+ self->shell_running = TRUE;
+ break;
+ }
+ }
+
+out:
+ if (self->shell_running)
+ {
+ DEBUG ("GNOME Shell is running, don't create status icon");
+
+ /* Rely on GNOME Shell to watch session state */
+ empathy_presence_manager_set_auto_away (self->presence_mgr, FALSE);
+
+ empathy_roster_window_set_shell_running (
+ EMPATHY_ROSTER_WINDOW (self->window), TRUE);
+ }
+ else
+ {
+ gboolean autoaway;
+
+ self->icon = empathy_status_icon_new (GTK_WINDOW (self->window),
+ self->start_hidden);
+
+ /* Allow Empathy to watch session state */
+ autoaway = g_settings_get_boolean (self->gsettings,
+ EMPATHY_PREFS_AUTOAWAY);
+
+ g_signal_connect (self->gsettings,
+ "changed::" EMPATHY_PREFS_AUTOAWAY,
+ G_CALLBACK (empathy_presence_manager_set_auto_away_cb),
+ self->presence_mgr);
+
+ empathy_presence_manager_set_auto_away (self->presence_mgr, autoaway);
+ }
+}
+
+static void
+empathy_app_activate (GApplication *app)