changeset 13150:d4698cf18986

[gaim-migrate @ 15513] SF Patch #1417663 from Sadrul It compiles and appears to work in a quick test. Nobody is maintaining the ticker plugin these days, so I'm going to trust Sadrul on this one. committer: Tailor Script <tailor@pidgin.im>
author Richard Laager <rlaager@wiktel.com>
date Tue, 07 Feb 2006 03:21:48 +0000
parents 18e621aa8a43
children 1646cd4f00ad
files plugins/ticker/ticker.c
diffstat 1 files changed, 61 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/plugins/ticker/ticker.c	Tue Feb 07 02:49:56 2006 +0000
+++ b/plugins/ticker/ticker.c	Tue Feb 07 03:21:48 2006 +0000
@@ -45,7 +45,7 @@
 static GtkWidget *ticker;
 
 typedef struct {
-	GaimBuddy *buddy;
+	GaimContact *contact;
 	GtkWidget *ebox;
 	GtkWidget *label;
 	GtkWidget *icon;
@@ -54,6 +54,8 @@
 
 GList *tickerbuds = NULL;
 
+static void buddy_ticker_update_contact(GaimContact *contact);
+
 static gboolean buddy_ticker_destroy_window(GtkWidget *window,
 		GdkEventAny *event, gpointer data) {
 	if(window)
@@ -87,24 +89,25 @@
 }
 
 static gboolean buddy_click_cb(GtkWidget *widget, GdkEventButton *event, gpointer user_data) {
-	GaimBuddy *b = user_data;
+	GaimContact *contact = user_data;
+	GaimBuddy *b = gaim_contact_get_priority_buddy(contact);
 
 	gaim_conversation_new(GAIM_CONV_TYPE_IM, b->account, b->name);
 	return TRUE;
 }
 
-static TickerData *buddy_ticker_find_buddy(GaimBuddy *b) {
+static TickerData *buddy_ticker_find_contact(GaimContact *c) {
 	GList *tb;
 	for(tb = tickerbuds; tb; tb = tb->next) {
 		TickerData *td = tb->data;
-		if(td->buddy == b)
+		if(td->contact == c)
 			return td;
 	}
 	return NULL;
 }
 
-static void buddy_ticker_set_pixmap(GaimBuddy *b) {
-	TickerData *td = buddy_ticker_find_buddy(b);
+static void buddy_ticker_set_pixmap(GaimContact *c) {
+	TickerData *td = buddy_ticker_find_contact(c);
 	GdkPixbuf *pixbuf;
 
 	if(!td)
@@ -113,7 +116,7 @@
 	if(!td->icon)
 		td->icon = gtk_image_new();
 
-	pixbuf = gaim_gtk_blist_get_status_icon((GaimBlistNode*)b,
+	pixbuf = gaim_gtk_blist_get_status_icon((GaimBlistNode*)c,
 			GAIM_STATUS_ICON_SMALL);
 	gtk_image_set_from_pixbuf(GTK_IMAGE(td->icon), pixbuf);
 	g_object_unref(G_OBJECT(pixbuf));
@@ -122,8 +125,7 @@
 static gboolean buddy_ticker_set_pixmap_cb(gpointer data) {
 	TickerData *td = data;
 
-gaim_debug(GAIM_DEBUG_ERROR, "XXX", "we're updating the pixmap, you bitch\n");
-	buddy_ticker_set_pixmap(td->buddy);
+	buddy_ticker_update_contact(td->contact);
 	td->timeout = 0;
 
 	return FALSE;
@@ -132,31 +134,37 @@
 static void buddy_ticker_add_buddy(GaimBuddy *b) {
 	GtkWidget *hbox;
 	TickerData *td;
+	GaimContact *contact;
+
+	contact = gaim_buddy_get_contact(b);
 
 	buddy_ticker_create_window();
 
 	if (!ticker)
 		return;
 
-	if (buddy_ticker_find_buddy(b))
+	if (buddy_ticker_find_contact(contact))
+	{
+		buddy_ticker_update_contact(contact);
 		return;
+	}
 
 	td = g_new0(TickerData, 1);
-	td->buddy = b;
+	td->contact = contact;
 	tickerbuds = g_list_append(tickerbuds, td);
 
 	td->ebox = gtk_event_box_new();
 	gtk_ticker_add(GTK_TICKER(ticker), td->ebox);
 	hbox = gtk_hbox_new(FALSE, 0);
 	gtk_container_add(GTK_CONTAINER(td->ebox), hbox);
-	buddy_ticker_set_pixmap(b);
-	gtk_box_pack_start(GTK_BOX(hbox), td->icon, FALSE, FALSE, 5);
+	buddy_ticker_set_pixmap(contact);
+	gtk_box_pack_start(GTK_BOX(hbox), td->icon, FALSE, FALSE, 0);
 
 	g_signal_connect(G_OBJECT(td->ebox), "button-press-event",
-		G_CALLBACK(buddy_click_cb), b);
+		G_CALLBACK(buddy_click_cb), contact);
 
-	td->label = gtk_label_new(gaim_buddy_get_alias(b));
-	gtk_box_pack_start(GTK_BOX(hbox), td->label, FALSE, FALSE, 5);
+	td->label = gtk_label_new(gaim_contact_get_alias(contact));
+	gtk_box_pack_start(GTK_BOX(hbox), td->label, FALSE, FALSE, 2);
 
 	gtk_widget_show_all(td->ebox);
 	gtk_widget_show(tickerwindow);
@@ -168,20 +176,42 @@
 	td->timeout = g_timeout_add(11000, buddy_ticker_set_pixmap_cb, td);
 }
 
-static void buddy_ticker_remove_buddy(GaimBuddy *b) {
-	TickerData *td = buddy_ticker_find_buddy(b);
+static void buddy_ticker_remove(TickerData *td) {
+	gtk_ticker_remove(GTK_TICKER(ticker), td->ebox);
+	tickerbuds = g_list_remove(tickerbuds, td);
+	if (td->timeout != 0)
+		g_source_remove(td->timeout);
+	g_free(td);
+}
+
+static void buddy_ticker_update_contact(GaimContact *contact) {
+	TickerData *td = buddy_ticker_find_contact(contact);
 
 	if (!td)
 		return;
 
 	/* pop up the ticker window again */
 	buddy_ticker_create_window();
+	if (gaim_contact_get_priority_buddy(contact) == NULL)
+		buddy_ticker_remove(td);
+	else {
+		buddy_ticker_set_pixmap(contact);
+		gtk_label_set_text(GTK_LABEL(td->label), gaim_contact_get_alias(contact));
+	}
+}
 
-	gtk_ticker_remove(GTK_TICKER(ticker), td->ebox);
-	tickerbuds = g_list_remove(tickerbuds, td);
-	if (td->timeout != 0)
-		g_source_remove(td->timeout);
-	g_free(td);
+static void buddy_ticker_remove_buddy(GaimBuddy *b) {
+	GaimContact *c = gaim_buddy_get_contact(b);
+	TickerData *td = buddy_ticker_find_contact(c);
+
+	if (!td)
+		return;
+
+	gaim_contact_invalidate_priority_buddy(c);
+
+	/* pop up the ticker window again */
+	buddy_ticker_create_window();
+	buddy_ticker_update_contact(c);
 }
 
 static void buddy_ticker_show()
@@ -213,8 +243,10 @@
 static void
 buddy_signon_cb(GaimBuddy *b)
 {
-	if(buddy_ticker_find_buddy(b))
-		buddy_ticker_set_pixmap(b);
+	GaimContact *c = gaim_buddy_get_contact(b);
+	gaim_contact_invalidate_priority_buddy(c);
+	if(buddy_ticker_find_contact(c))
+		buddy_ticker_update_contact(c);
 	else
 		buddy_ticker_add_buddy(b);
 }
@@ -230,8 +262,9 @@
 static void
 status_changed_cb(GaimBuddy *b, GaimStatus *os, GaimStatus *s)
 {
-	if(buddy_ticker_find_buddy(b))
-		buddy_ticker_set_pixmap(b);
+	GaimContact *c = gaim_buddy_get_contact(b);
+	if(buddy_ticker_find_contact(c))
+		buddy_ticker_set_pixmap(c);
 	else
 		buddy_ticker_add_buddy(b);
 }
@@ -256,9 +289,7 @@
 		while (t) {
 			td = t->data;
 			t = t->next;
-			if (td->buddy->account == gc->account) {
-				buddy_signoff_cb(td->buddy);
-			}
+			buddy_ticker_update_contact(td->contact);
 		}
 	}
 }