]> git.0d.be Git - empathy.git/commitdiff
Implement a logic for disabling notifications when away.
authorXavier Claessens <xclaesse@src.gnome.org>
Fri, 30 Jan 2009 17:07:26 +0000 (17:07 +0000)
committerXavier Claessens <xclaesse@src.gnome.org>
Fri, 30 Jan 2009 17:07:26 +0000 (17:07 +0000)
svn path=/trunk/; revision=2282

libempathy-gtk/empathy-ui-utils.c
libempathy-gtk/empathy-ui-utils.h
src/empathy-status-icon.c

index effeb7a01df3a240b0e9798878a48a59c1aad2b9..7b55587ea13300d166532fcaf8d152bf3a3bb803 100644 (file)
@@ -1572,13 +1572,29 @@ static EmpathySoundEntry sound_entries[LAST_EMPATHY_SOUND] = {
          N_("Voice call ended"), NULL },
 };
 
+static gboolean
+check_available (void)
+{
+       McPresence presence;
+       EmpathyIdle *idle;
+
+       idle = empathy_idle_dup_singleton ();
+       presence = empathy_idle_get_state (idle);
+       g_object_unref (idle);
+
+       if (presence != MC_PRESENCE_AVAILABLE &&
+           presence != MC_PRESENCE_UNSET) {
+               return FALSE;    
+       }
+
+       return TRUE;
+}
+
 static gboolean
 empathy_sound_pref_is_enabled (const char *key)
 {
        EmpathyConf *conf;
-       McPresence presence;
        gboolean res;
-       EmpathyIdle *idle;
 
        conf = empathy_conf_get ();
        res = FALSE;
@@ -1589,12 +1605,7 @@ empathy_sound_pref_is_enabled (const char *key)
                return FALSE;
        }
 
-       idle = empathy_idle_dup_singleton ();
-       presence = empathy_idle_get_state (idle);
-       g_object_unref (idle);
-
-       if (presence != MC_PRESENCE_AVAILABLE &&
-           presence != MC_PRESENCE_UNSET) {
+       if (!check_available ()) {
                empathy_conf_get_bool (conf, EMPATHY_PREFS_SOUNDS_DISABLED_AWAY,
                                       &res);
                if (res) {
@@ -1634,3 +1645,31 @@ empathy_sound_play (GtkWidget *widget,
                                        NULL);
        }
 }
+
+gboolean
+empathy_notification_should_show (void)
+{
+       EmpathyConf *conf;
+       gboolean res;
+
+       conf = empathy_conf_get ();
+       res = FALSE;
+
+       empathy_conf_get_bool (conf, EMPATHY_PREFS_NOTIFICATIONS_ENABLED, &res);
+
+       if (!res) {
+               return FALSE;
+       }
+
+       if (!check_available ()) {
+               empathy_conf_get_bool (conf,
+                                      EMPATHY_PREFS_NOTIFICATIONS_DISABLED_AWAY,
+                                      &res);
+               if (res) {
+                       return FALSE;
+               }
+       }
+
+       return TRUE;
+}
+
index 108b7bb894fabdcbd732c03ea516db2779c35ff5..b3b26f0bbc7de39394f251eed63ae370f7367748 100644 (file)
@@ -131,6 +131,9 @@ void        empathy_send_file_with_file_chooser         (EmpathyContact   *conta
 void        empathy_sound_play                          (GtkWidget        *widget,
                                                         EmpathySound      sound_id);
 
+/* Notifications */
+gboolean    empathy_notification_should_show            (void);
+
 G_END_DECLS
 
 #endif /*  __EMPATHY_UI_UTILS_H__ */
index a1d3704eadea15e02d2de3cb3d194c70c7069eaf..ea407fd81674bfeb08f54dc071b277e9b9090a89 100644 (file)
@@ -222,7 +222,10 @@ status_icon_event_added_cb (EmpathyEventManager *manager,
 
        status_icon_update_icon (icon);
        status_icon_update_tooltip (icon);
-       status_icon_update_notification (icon);
+
+       if (empathy_notification_should_show ()) {
+               status_icon_update_notification (icon);
+       }
 
        if (!priv->blink_timeout) {
                priv->blink_timeout = g_timeout_add (BLINK_TIMEOUT,
@@ -246,6 +249,10 @@ status_icon_event_removed_cb (EmpathyEventManager *manager,
 
        status_icon_update_tooltip (icon);
        status_icon_update_icon (icon);
+
+       /* update notification anyway, as it's safe and we might have been
+        * changed presence in the meanwhile
+        */     
        status_icon_update_notification (icon);
 
        if (!priv->event && priv->blink_timeout) {
@@ -325,8 +332,20 @@ status_icon_toggle_visibility (EmpathyStatusIcon *icon)
 static void
 status_icon_idle_notify_cb (EmpathyStatusIcon *icon)
 {
+       EmpathyStatusIconPriv *priv = GET_PRIV (icon);
+
        status_icon_update_icon (icon);
        status_icon_update_tooltip (icon);
+
+       if (!empathy_notification_should_show ()) {
+               /* dismiss the outstanding notification if present */
+
+               if (priv->notification) {
+                       notify_notification_close (priv->notification, NULL);
+                       g_object_unref (priv->notification);
+                       priv->notification = NULL;
+               }
+       }
 }
 
 static gboolean