diff src/pounce.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 c9bd6decdec4
children 06065a4847ff
line wrap: on
line diff
--- a/src/pounce.c	Mon Oct 31 20:35:59 2005 +0000
+++ b/src/pounce.c	Mon Oct 31 22:02:30 2005 +0000
@@ -949,6 +949,34 @@
 }
 
 static void
+buddy_status_changed_cb(GaimBuddy *buddy, GaimStatus *old_status,
+                        GaimStatus *status)
+{
+	gboolean old_available, available;
+
+	available = gaim_status_is_available(status);
+	old_available = gaim_status_is_available(old_status);
+
+	if (available && !old_available)
+		gaim_pounce_execute(buddy->account, buddy->name,
+		                    GAIM_POUNCE_AWAY_RETURN);
+	else if (!available && old_available)
+		gaim_pounce_execute(buddy->account, buddy->name,
+		                    GAIM_POUNCE_AWAY);
+}
+
+static void
+buddy_idle_changed_cb(GaimBuddy *buddy, gboolean old_idle, gboolean idle)
+{
+	if (idle && !old_idle)
+		gaim_pounce_execute(buddy->account, buddy->name,
+		                    GAIM_POUNCE_IDLE);
+	else if (!idle && old_idle)
+		gaim_pounce_execute(buddy->account, buddy->name,
+		                    GAIM_POUNCE_IDLE_RETURN);
+}
+
+static void
 buddy_typing_cb(GaimAccount *account, const char *name, void *data)
 {
 	GaimConversation *conv;
@@ -983,18 +1011,10 @@
 	pounce_handlers = g_hash_table_new_full(g_str_hash, g_str_equal,
 											g_free, free_pounce_handler);
 
-	gaim_signal_connect(blist_handle, "buddy-idle",
-						handle, GAIM_CALLBACK(buddy_state_cb),
-						GINT_TO_POINTER(GAIM_POUNCE_IDLE));
-	gaim_signal_connect(blist_handle, "buddy-unidle",
-						handle, GAIM_CALLBACK(buddy_state_cb),
-						GINT_TO_POINTER(GAIM_POUNCE_IDLE_RETURN));
-	gaim_signal_connect(blist_handle, "buddy-away",
-						handle, GAIM_CALLBACK(buddy_state_cb),
-						GINT_TO_POINTER(GAIM_POUNCE_AWAY));
-	gaim_signal_connect(blist_handle, "buddy-back",
-						handle, GAIM_CALLBACK(buddy_state_cb),
-						GINT_TO_POINTER(GAIM_POUNCE_AWAY_RETURN));
+	gaim_signal_connect(blist_handle, "buddy-idle-changed",
+	                    handle, GAIM_CALLBACK(buddy_idle_changed_cb), NULL);
+	gaim_signal_connect(blist_handle, "buddy-status-changed",
+	                    handle, GAIM_CALLBACK(buddy_status_changed_cb), NULL);
 	gaim_signal_connect(blist_handle, "buddy-signed-on",
 						handle, GAIM_CALLBACK(buddy_state_cb),
 						GINT_TO_POINTER(GAIM_POUNCE_SIGNON));