diff plugins/statenotify.c @ 11935:cb73483c9f63

[gaim-migrate @ 14226] Here are buddy-status-changed and buddy-idle-changed signals, to replace buddy-away, buddy-back, buddy-idle, and buddy-unidle. It it now possible to detect when a buddy goes from one away-state to another away-state without coming back in between. I'm not really sure I like how buddy-idle-changed works here, but it felt better to keep it consistent. It currently only fires on idle and unidle and not on just-more-idle, though that's easy to change if we decide plugins might want to know as idle time increases. I think I got all the doxygen and ChangeLog.API stuff, someone yell if I missed something. committer: Tailor Script <tailor@pidgin.im>
author Etan Reisner <pidgin@unreliablesource.net>
date Mon, 31 Oct 2005 22:02:30 +0000
parents 077f956e41a1
children e856f985a0b9
line wrap: on
line diff
--- a/plugins/statenotify.c	Mon Oct 31 20:35:59 2005 +0000
+++ b/plugins/statenotify.c	Mon Oct 31 22:02:30 2005 +0000
@@ -36,31 +36,33 @@
 }
 
 static void
-buddy_away_cb(GaimBuddy *buddy, void *data)
+buddy_status_changed_cb(GaimBuddy *buddy, GaimStatus *old_status,
+                        GaimStatus *status, void *data)
 {
-	if (gaim_prefs_get_bool("/plugins/core/statenotify/notify_away"))
-		write_status(buddy, _("%s has gone away."));
+	gboolean available, old_available;
+
+	available = gaim_status_is_available(status);
+	old_available = gaim_status_is_available(old_status);
+
+	if (gaim_prefs_get_bool("/plugins/core/statenotify/notify_away")) {
+		if (available && !old_available)
+			write_status(buddy, _("%s is no longer away."));
+		else if (!available && old_available)
+			write_status(buddy, _("%s has gone away."));
+	}
 }
 
 static void
-buddy_unaway_cb(GaimBuddy *buddy, void *data)
-{
-	if (gaim_prefs_get_bool("/plugins/core/statenotify/notify_away"))
-		write_status(buddy, _("%s is no longer away."));
-}
-
-static void
-buddy_idle_cb(GaimBuddy *buddy, void *data)
+buddy_idle_changed_cb(GaimBuddy *buddy, gboolean old_idle, gboolean idle,
+                      void *data)
 {
-	if (gaim_prefs_get_bool("/plugins/core/statenotify/notify_idle"))
-		write_status(buddy, _("%s has become idle."));
-}
-
-static void
-buddy_unidle_cb(GaimBuddy *buddy, void *data)
-{
-	if (gaim_prefs_get_bool("/plugins/core/statenotify/notify_idle"))
-		write_status(buddy, _("%s is no longer idle."));
+	if (gaim_prefs_get_bool("/plugins/core/statenotify/notify_idle")) {
+		if (idle) {
+			write_status(buddy, _("%s has become idle."));
+		} else {
+			write_status(buddy, _("%s is no longer idle."));
+		}
+	}
 }
 
 static void
@@ -105,18 +107,14 @@
 {
 	void *blist_handle = gaim_blist_get_handle();
 
-	gaim_signal_connect(blist_handle, "buddy-away",
-						plugin, GAIM_CALLBACK(buddy_away_cb), NULL);
-	gaim_signal_connect(blist_handle, "buddy-back",
-						plugin, GAIM_CALLBACK(buddy_unaway_cb), NULL);
-	gaim_signal_connect(blist_handle, "buddy-idle",
-						plugin, GAIM_CALLBACK(buddy_idle_cb), NULL);
-	gaim_signal_connect(blist_handle, "buddy-unidle",
-						plugin, GAIM_CALLBACK(buddy_unidle_cb), NULL);
-	gaim_signal_connect(blist_handle, "buddy-signed-on",
-						plugin, GAIM_CALLBACK(buddy_signon_cb), NULL);
-	gaim_signal_connect(blist_handle, "buddy-signed-off",
-						plugin, GAIM_CALLBACK(buddy_signoff_cb), NULL);
+	gaim_signal_connect(blist_handle, "buddy-status-changed", plugin,
+	                    GAIM_CALLBACK(buddy_status_changed_cb), NULL);
+	gaim_signal_connect(blist_handle, "buddy-idle-changed", plugin,
+	                    GAIM_CALLBACK(buddy_idle_changed_cb), NULL);
+	gaim_signal_connect(blist_handle, "buddy-signed-on", plugin,
+	                    GAIM_CALLBACK(buddy_signon_cb), NULL);
+	gaim_signal_connect(blist_handle, "buddy-signed-off", plugin,
+	                    GAIM_CALLBACK(buddy_signoff_cb), NULL);
 
 	return TRUE;
 }