]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-sound-manager.c
Updated Kannada translation
[empathy.git] / libempathy-gtk / empathy-sound-manager.c
index afa27bed43ca9209a0f39f63692069f6d3b616e0..3453e8f2cd176218185b27a33f4e9f15ca2365ac 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#include <config.h>
-
+#include "config.h"
 #include "empathy-sound-manager.h"
 
-#include <canberra-gtk.h>
 #include <glib/gi18n-lib.h>
-#include <gtk/gtk.h>
+
+#include "empathy-gsettings.h"
+#include "empathy-presence-manager.h"
+#include "empathy-utils.h"
 
 #define DEBUG_FLAG EMPATHY_DEBUG_OTHER
-#include <libempathy/empathy-debug.h>
-#include <libempathy/empathy-gsettings.h>
-#include <libempathy/empathy-utils.h>
+#include "empathy-debug.h"
 
 typedef struct {
   EmpathySound sound_id;
@@ -126,8 +125,11 @@ repeating_sounds_item_delete (gpointer data)
   if (repeatable_sound->replay_timeout_id != 0)
     g_source_remove (repeatable_sound->replay_timeout_id);
 
-  g_signal_handlers_disconnect_by_func (repeatable_sound->widget,
-      empathy_sound_widget_destroyed_cb, repeatable_sound);
+  if (repeatable_sound->widget != NULL)
+    {
+      g_signal_handlers_disconnect_by_func (repeatable_sound->widget,
+          empathy_sound_widget_destroyed_cb, repeatable_sound);
+    }
 
   g_object_unref (repeatable_sound->self);
 
@@ -160,6 +162,45 @@ empathy_sound_manager_dup_singleton (void)
   return manager;
 }
 
+static gboolean
+empathy_check_available_state (void)
+{
+  TpConnectionPresenceType most_available_requested_presence;
+  TpAccountManager *am;
+  GList *accounts;
+
+  /* We cannot use tp_account_manager_get_most_available_presence() or
+   * empathy_presence_manager_get_state() because it is the requested presence
+   * that matters, not the current presence.
+   * See https://bugzilla.gnome.org/show_bug.cgi?id=704454 */
+  most_available_requested_presence = TP_CONNECTION_PRESENCE_TYPE_UNSET;
+  am = tp_account_manager_dup ();
+  accounts = tp_account_manager_dup_valid_accounts (am);
+  while (accounts != NULL)
+    {
+      TpAccount *account = accounts->data;
+      TpConnectionPresenceType requested_presence;
+
+      requested_presence = tp_account_get_requested_presence (account,
+          NULL, NULL);
+
+      if (tp_connection_presence_type_cmp_availability (requested_presence,
+              most_available_requested_presence) > 0)
+        most_available_requested_presence = requested_presence;
+
+      g_object_unref (account);
+      accounts = g_list_delete_link (accounts, accounts);
+    }
+
+  g_object_unref (am);
+
+  if (most_available_requested_presence != TP_CONNECTION_PRESENCE_TYPE_AVAILABLE &&
+    most_available_requested_presence != TP_CONNECTION_PRESENCE_TYPE_UNSET)
+    return FALSE;
+
+  return TRUE;
+}
+
 static gboolean
 empathy_sound_pref_is_enabled (EmpathySoundManager *self,
     EmpathySound sound_id)
@@ -252,8 +293,11 @@ empathy_sound_play_internal (GtkWidget *widget, EmpathySound sound_id,
           gettext (entry->event_ca_description)) < 0)
     goto failed;
 
-  if (ca_gtk_proplist_set_for_widget (p, widget) < 0)
-    goto failed;
+  if (widget != NULL)
+    {
+      if (ca_gtk_proplist_set_for_widget (p, widget) < 0)
+        goto failed;
+    }
 
   ca_context_play_full (ca_gtk_context_get (), entry->sound_id, p, callback,
       user_data);
@@ -298,7 +342,7 @@ empathy_sound_manager_play_full (EmpathySoundManager *self,
     ca_finish_callback_t callback,
     gpointer user_data)
 {
-  g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
+  g_return_val_if_fail (widget == NULL || GTK_IS_WIDGET (widget), FALSE);
   g_return_val_if_fail (sound_id < LAST_EMPATHY_SOUND, FALSE);
 
   if (!empathy_sound_pref_is_enabled (self, sound_id))
@@ -329,7 +373,7 @@ empathy_sound_manager_play (EmpathySoundManager *self,
     GtkWidget *widget,
     EmpathySound sound_id)
 {
-  g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
+  g_return_val_if_fail (widget == NULL || GTK_IS_WIDGET (widget), FALSE);
   g_return_val_if_fail (sound_id < LAST_EMPATHY_SOUND, FALSE);
 
   return empathy_sound_manager_play_full (self, widget, sound_id, NULL, NULL);
@@ -401,7 +445,7 @@ empathy_sound_manager_start_playing (EmpathySoundManager *self,
   EmpathyRepeatableSound *repeatable_sound;
   gboolean playing = FALSE;
 
-  g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
+  g_return_val_if_fail (widget == NULL || GTK_IS_WIDGET (widget), FALSE);
   g_return_val_if_fail (sound_id < LAST_EMPATHY_SOUND, FALSE);
 
   if (!empathy_sound_pref_is_enabled (self, sound_id))
@@ -424,9 +468,12 @@ empathy_sound_manager_start_playing (EmpathySoundManager *self,
   g_hash_table_insert (self->priv->repeating_sounds, GINT_TO_POINTER (sound_id),
       repeatable_sound);
 
-  g_signal_connect (G_OBJECT (widget), "destroy",
-      G_CALLBACK (empathy_sound_widget_destroyed_cb),
-      repeatable_sound);
+  if (widget != NULL)
+    {
+      g_signal_connect (G_OBJECT (widget), "destroy",
+          G_CALLBACK (empathy_sound_widget_destroyed_cb),
+          repeatable_sound);
+    }
 
   playing = empathy_sound_play_internal (widget, sound_id, playing_finished_cb,
         repeatable_sound);