diff plugins/ticker/ticker.c @ 5170:13ffa9ae4282

[gaim-migrate @ 5534] This makes the buddy ticker plugin work again, and may cause some slight breakage in some plugins, since it slightly changes the behavior of: event_buddy_signon event_buddy_signoff event_buddy_away event_buddy_back Then again, it's nothing compared to the massive breakage being thought up for the very near future ;-) committer: Tailor Script <tailor@pidgin.im>
author Nathan Walp <nwalp@pidgin.im>
date Fri, 18 Apr 2003 21:49:45 +0000
parents b37d7d09ec83
children 2d84fe476406
line wrap: on
line diff
--- a/plugins/ticker/ticker.c	Fri Apr 18 21:01:38 2003 +0000
+++ b/plugins/ticker/ticker.c	Fri Apr 18 21:49:45 2003 +0000
@@ -28,7 +28,8 @@
 #include <string.h>
 #include <stdlib.h>
 #include "gaim.h"
-#include "prpl.h"
+#include "list.h"
+#include "gtklist.h"
 #ifdef _WIN32
 #include "win32dep.h"
 #endif
@@ -42,348 +43,151 @@
 static GModule *handle;
 
 typedef struct {
-	char buddy[ 128 ];
-	char alias[ 388 ];
-	GtkWidget *hbox;
+	struct buddy *buddy;
 	GtkWidget *ebox;
 	GtkWidget *label;
-	GtkWidget *pix;
+	GtkWidget *icon;
 } TickerData;
 
-GList *tickerbuds = (GList *) NULL;
-gboolean userclose = FALSE;
-GtkWidget *msgw;
+GList *tickerbuds = NULL;
 
 /* for win32 compatability */
 G_MODULE_IMPORT GSList *connections;
-G_MODULE_IMPORT GtkWidget *blist;
 
-void BuddyTickerDestroyWindow( GtkWidget *window );
-void BuddyTickerCreateWindow( void );
-void BuddyTickerAddUser( char *name, char *alias, const char *pb);
-void BuddyTickerRemoveUser( char *name );
-void BuddyTickerSetPixmap( char *name, const char *pb);
-void BuddyTickerClearList( void );
-void BuddyTickerSignOff( void );
-GList * BuddyTickerFindUser( char *name );
-int BuddyTickerMessageRemove( gpointer data );
-void BuddyTickerShow();
-
-void
-BuddyTickerDestroyWindow( GtkWidget *window )
-{
-	BuddyTickerClearList();
-	gtk_ticker_stop_scroll( GTK_TICKER( ticker ) );
-	gtk_widget_destroy( window );	
-	ticker = tickerwindow = (GtkWidget *) NULL;
-	userclose = TRUE;
+static void buddy_ticker_destroy_window(GtkWidget *window, gpointer data) {
+	gtk_widget_hide(window);
 }
 
-/* static char *msg = "Welcome to Gaim " VERSION ", brought to you by Rob Flynn (maintainer), Eric Warmenhoven, Mark Spencer, Jeramey Crawford, Jim Duchek, Syd Logan, and Sean Egan"; 
- */
-
-void
-BuddyTickerCreateWindow()
-{
+static void buddy_ticker_create_window() {
+	if(tickerwindow) {
+		gtk_widget_show(tickerwindow);
+		return;
+	}
 
-	if ( tickerwindow != (GtkWidget *) NULL ) 
-		return;
-	debug_printf("Making ticker\n");
-	tickerwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-	g_signal_connect (GTK_OBJECT(tickerwindow), "destroy",
-	G_CALLBACK (BuddyTickerDestroyWindow), "WM destroy");
-	gtk_window_set_title (GTK_WINDOW(tickerwindow), _("Gaim - Buddy Ticker"));
+	tickerwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+	g_signal_connect(G_OBJECT(tickerwindow), "destroy",
+			G_CALLBACK (buddy_ticker_destroy_window), NULL);
+	gtk_window_set_title (GTK_WINDOW(tickerwindow), _("Buddy Ticker"));
 	gtk_window_set_role (GTK_WINDOW(tickerwindow), "ticker");
-	gtk_widget_realize(tickerwindow);
 
 	ticker = gtk_ticker_new();
-	if (!ticker)
-		return;
-	gtk_ticker_set_spacing( GTK_TICKER( ticker ), 20 );
-	gtk_widget_set_size_request( ticker, 500, -1 );
-	gtk_container_add( GTK_CONTAINER( tickerwindow ), ticker );
-	gtk_ticker_set_interval( GTK_TICKER( ticker ), 500 );
-	gtk_ticker_set_scootch( GTK_TICKER( ticker ), 10 );
-	/* Damned egotists
-	   msgw = gtk_label_new( msg );
-	   gtk_ticker_add( GTK_TICKER( ticker ), msgw );
-	*/
-	gtk_ticker_start_scroll( GTK_TICKER( ticker ) );
+	gtk_ticker_set_spacing(GTK_TICKER(ticker), 20);
+	gtk_container_add(GTK_CONTAINER(tickerwindow), ticker);
+	gtk_ticker_set_interval(GTK_TICKER(ticker), 500);
+	gtk_ticker_set_scootch(GTK_TICKER(ticker), 10);
+	gtk_ticker_start_scroll(GTK_TICKER(ticker));
+	gtk_widget_set_size_request(ticker, 500, -1);
 
-	g_timeout_add( 60000, BuddyTickerMessageRemove, NULL);
-
-	gtk_widget_show_all (ticker);
-
+	gtk_widget_show_all(tickerwindow);
 }
 
-gint 
-ButtonPressCallback( GtkWidget *widget, GdkEvent *event, gpointer callback_data ) 
-{
-	TickerData *p = (TickerData *) callback_data;
-	struct gaim_buddy_list *gaimbuddylist;
-	GaimBlistNode *group;
-	GaimBlistNode *buddy;
-	struct buddy *b = NULL;
-	char *norm_name = g_strdup(normalize(p->buddy));
-
-	if (!(gaimbuddylist = gaim_get_blist()))
-		return TRUE;
+static gboolean buddy_click_cb(GtkWidget *widget, GdkEventButton *event, gpointer user_data) {
+	struct buddy *b = user_data;
 
-	group = gaimbuddylist->root;
-	while (group) {
-		buddy = group->child;
-		while (buddy) {
-			if (!gaim_utf8_strcasecmp(normalize(((struct buddy*)buddy)->name), norm_name))
-				b = (struct buddy*)buddy;
-			buddy = buddy->next;
-		}
-		group = group->next;
-	}
-	g_free(norm_name);
-
-	if (b->account)
-		gaim_conversation_new(GAIM_CONV_IM, b->account, p->buddy);
-	
+	gaim_conversation_new(GAIM_CONV_IM, b->account, b->name);
 	return TRUE;
 }
 
-void
-BuddyTickerAddUser( char *name, char *alias, const char *pb)
-{
-	TickerData *p;
-	GList *q;
+static TickerData *buddy_ticker_find_buddy(struct buddy *b) {
+	GList *tb;
+	for(tb = tickerbuds; tb; tb = tb->next) {
+		TickerData *td = tb->data;
+		if(td->buddy == b)
+			return td;
+	}
+	return NULL;
+}
+
+static void buddy_ticker_set_pixmap(struct buddy *b) {
+	TickerData *td = buddy_ticker_find_buddy(b);
+	GdkPixbuf *pixbuf;
 
-	if ( userclose == TRUE )
+	if(!td)
 		return;
-	
-	debug_printf("Adding %s\n", name);
+
+	if(!td->icon)
+		td->icon = gtk_image_new();
 
-	BuddyTickerCreateWindow();
+	pixbuf = gaim_gtk_blist_get_status_icon(b, GAIM_STATUS_ICON_SMALL);
+	gtk_image_set_from_pixbuf(GTK_IMAGE(td->icon), pixbuf);
+	g_object_unref(G_OBJECT(pixbuf));
+}
+
+static void buddy_ticker_add_buddy(struct buddy *b) {
+	GtkWidget *hbox;
+	TickerData *td;
+
+	buddy_ticker_create_window();
 	if (!ticker)
 		return;
 
-	q = (GList *) BuddyTickerFindUser( name );
-	if ( q != (GList *) NULL )
-		return;
-
-	p = (TickerData *) malloc( sizeof( TickerData ) );
-	p->hbox = (GtkWidget *) NULL;
-	p->label = (GtkWidget *) NULL;
-	p->pix = (GtkWidget *) NULL;
-	strcpy( p->buddy, name );
-	strcpy( p->alias, alias);
-	tickerbuds = g_list_append( tickerbuds, p );
-
-	p->hbox = gtk_hbox_new( FALSE, 0 );
-	gtk_ticker_add( GTK_TICKER( ticker ), p->hbox );
-	gtk_widget_show_all( p->hbox );
-
-	BuddyTickerSetPixmap(name, pb);
-
-	p->ebox = gtk_event_box_new();
-
-	/* click detection */
-
-	gtk_widget_set_events (p->ebox, GDK_BUTTON_PRESS_MASK);
-	g_signal_connect (GTK_OBJECT (p->ebox), "button_press_event",
-		G_CALLBACK(ButtonPressCallback), (gpointer) p);
-
-	gtk_box_pack_start_defaults( GTK_BOX( p->hbox ), p->ebox );
-	gtk_widget_show( p->ebox );
-
-	if (im_options & OPT_IM_ALIAS_TAB)
-		p->label = gtk_label_new( alias );
-	else
-		p->label = gtk_label_new( name );
-	gtk_container_add( GTK_CONTAINER(p->ebox), p->label ); 
-
-	gtk_widget_show( p->label );
-
-	gtk_widget_show( tickerwindow );
-}
-
-void 
-BuddyTickerRemoveUser( char *name )
-{
-	GList *p = (GList *) BuddyTickerFindUser( name );
-	TickerData *data;
-
-	if ( !p )
+	if(buddy_ticker_find_buddy(b))
 		return;
 
-	data = (TickerData *) p->data;
-
-	if ( userclose == TRUE )
-		return;
-	if ( data ) {
-		gtk_ticker_remove( GTK_TICKER( ticker ), data->hbox );
-		tickerbuds = g_list_remove( tickerbuds, data );
-		free( data );	
-	}
-}
+	td = g_new0(TickerData, 1);
+	td->buddy = b;
+	tickerbuds = g_list_append(tickerbuds, td);
 
-void
-BuddyTickerSetPixmap( char *name, const char *pb)
-{
-	GList *p;
-	TickerData *data;
-	char *file = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", pb, NULL);
-	
-	if ( userclose == TRUE )
-		return;
-	p = (GList *) BuddyTickerFindUser( name );
-	if ( p )
-		data = (TickerData *) p->data;
-	else
-		return;
-	if ( data->pix == (GtkWidget *) NULL ) {
-		data->pix = gtk_image_new_from_file(file);
-		gtk_box_pack_start_defaults( GTK_BOX( data->hbox ), data->pix );
-	} else {
-		gtk_widget_hide( data->pix );
-		gtk_image_set_from_file(GTK_IMAGE(data->pix), file);
-	}
-	gtk_widget_show( data->pix );
-}
+	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);
 
-void
-BuddyTickerSetAlias( char *name, char *alias) {
-	GList *p;
-	TickerData *data;
+	g_signal_connect(G_OBJECT(td->ebox), "button-press-event",
+		G_CALLBACK(buddy_click_cb), b);
 
-	if ( userclose == TRUE )
-		return;
-	p = (GList *) BuddyTickerFindUser( name );
-	if ( p )
-		data = (TickerData *) p->data;
-	else
-		return;
-	if (alias) {
-		g_snprintf(data->alias, sizeof(data->alias), alias);
-		
-		if (im_options & OPT_IM_ALIAS_TAB) 
-			gtk_label_set_text(GTK_LABEL(data->label), alias);
-	}
+	td->label = gtk_label_new(gaim_get_buddy_alias(b));
+	gtk_box_pack_start(GTK_BOX(hbox), td->label, FALSE, FALSE, 5);
+
+	gtk_widget_show_all(td->ebox);
+	gtk_widget_show(tickerwindow);
 }
 
-GList *
-BuddyTickerFindUser( char *name )
-{
-	GList *p = tickerbuds;
-
-	while ( p ) {
-		TickerData *q = (TickerData *) p->data;
-		if ( !strcmp( name, q->buddy ) )
-			return( p );
-		p = p->next;		
-	}
-	return (GList *) NULL;
-}
+static void buddy_ticker_remove_buddy(struct buddy *b) {
+	TickerData *td = buddy_ticker_find_buddy(b);
 
-void
-BuddyTickerSetNames()
-{
-	GList *p = tickerbuds;
-	while ( p ) {
-		TickerData *q = (TickerData *) p->data;
-		if (im_options & OPT_IM_ALIAS_TAB)
-			gtk_label_set_text(GTK_LABEL(q->label), q->alias);
-		else
-			gtk_label_set_text(GTK_LABEL(q->label), q->buddy);
-	p = p->next;
-	}
-}
+	if (!td)
+		return;
 
-int
-BuddyTickerMessageRemove( gpointer data )
-{
-	if ( userclose == TRUE )
-		return FALSE;
-	if ( tickerwindow == NULL )
-		return FALSE;
-	gtk_ticker_remove( GTK_TICKER( ticker ), msgw );
-	return FALSE;
-}
-
-int
-BuddyTickerLogonTimeout( gpointer data )
-{
-	return FALSE;
+	gtk_ticker_remove(GTK_TICKER(ticker), td->ebox);
+	tickerbuds = g_list_remove(tickerbuds, td);
+	g_free(td);
 }
 
-int
-BuddyTickerLogoutTimeout( gpointer data )
+static void buddy_ticker_show()
 {
-	char *name = (char *) data;
-
-	if ( userclose == TRUE )
-		return FALSE;
-	BuddyTickerRemoveUser( name );
+	struct gaim_buddy_list *list = gaim_get_blist();
+	GaimBlistNode *gnode, *bnode;
+	struct buddy *b;
 
-	return FALSE;
-}
-
-void
-BuddyTickerSignoff( void )
-{
-	GList *p = tickerbuds;
-	TickerData *q;
+	if(!list)
+		return;
 
-	while ( p ) {
-		q = (TickerData *) p->data;
-		if ( q )
-			BuddyTickerRemoveUser( q->buddy ); 
-		p = tickerbuds;
-	}
-	userclose = FALSE;
-	if ( tickerwindow )
-		gtk_widget_hide( tickerwindow );
-}
-
-void
-BuddyTickerClearList( void )
-{
-	GList *p = tickerbuds;
-
-	while ( p ) 
-		p = g_list_remove( p, p->data );
-	tickerbuds = (GList *) NULL;
-}
-
-void BuddyTickerShow()
-{
-	/* Someone should fix the ticker
-	struct group *g;
-	struct buddy *b;
-	GSList *grps, *buds;
-	const char *xpm;
-	for( grps = groups; grps; grps = grps->next ) {
-		g = (struct group *)grps->data;
-		for( buds = g->members; buds; buds = buds->next ) {
-			b = (struct buddy *)buds->data;
-			if(GAIM_BUDDY_IS_ONLINE(b)) {
-				xpm = NULL;
-				if (b->account->gc->prpl->list_icon)
-					xpm = b->account->gc->prpl->list_icon(b->account, b);
-				BuddyTickerAddUser( b->name, gaim_get_buddy_alias(b), xpm);
-			}
+	for(gnode = list->root; gnode; gnode = gnode->next) {
+		if(!GAIM_BLIST_NODE_IS_GROUP(gnode))
+			continue;
+		for(bnode = gnode->child; bnode; bnode = bnode->next) {
+			if(!GAIM_BLIST_NODE_IS_BUDDY(bnode))
+				continue;
+			b = (struct buddy *)bnode;
+			if(GAIM_BUDDY_IS_ONLINE(b))
+				buddy_ticker_add_buddy(b);
 		}
 	}
-	*/
 }
 
 void signon_cb(struct gaim_connection *gc, char *who) {
 	struct buddy *b = gaim_find_buddy(gc->account, who);
-	const char *xpm = NULL;
-
-	if (gc->prpl->list_icon)
-		xpm = gc->prpl->list_icon(b->account, b);
-	
-	BuddyTickerAddUser(who, gaim_get_buddy_alias(b), xpm);
+	if(buddy_ticker_find_buddy(b))
+		buddy_ticker_set_pixmap(b);
+	else
+		buddy_ticker_add_buddy(b);
 }
 
 void signoff_cb(struct gaim_connection *gc) {
-	if (connections && !connections->next) {
+	if (!connections) {
 		gtk_widget_destroy(tickerwindow);
 		tickerwindow = NULL;
 		ticker = NULL;
@@ -391,16 +195,17 @@
 }
 
 void buddy_signoff_cb(struct gaim_connection *gc, char *who) {
-	BuddyTickerRemoveUser(who);
+	struct buddy *b = gaim_find_buddy(gc->account, who);
+
+	buddy_ticker_remove_buddy(b);
 }
 
 void away_cb(struct gaim_connection *gc, char *who) {
 	struct buddy *b = gaim_find_buddy(gc->account, who);
-	const char *xpm = NULL;
-	
-	if (gc->prpl->list_icon)
-		xpm = gc->prpl->list_icon(b->account, b);
-	BuddyTickerSetPixmap(who, xpm);
+	if(buddy_ticker_find_buddy(b))
+		buddy_ticker_set_pixmap(b);
+	else
+		buddy_ticker_add_buddy(b);
 }
 
 /*
@@ -417,21 +222,23 @@
 
 G_MODULE_EXPORT char *gaim_plugin_init(GModule *h) {
 	handle = h;
-	
+
 	gaim_signal_connect(h, event_buddy_signon, signon_cb, NULL);
 	gaim_signal_connect(h, event_signoff, signoff_cb, NULL);
 	gaim_signal_connect(h, event_buddy_signoff, buddy_signoff_cb, NULL);
 	gaim_signal_connect(h, event_buddy_away, away_cb, NULL);
+	gaim_signal_connect(h, event_buddy_back, away_cb, NULL);
 
 	if (connections)
-		BuddyTickerShow();
+		buddy_ticker_show();
 	return NULL;
 }
 
 G_MODULE_EXPORT void gaim_plugin_remove() {
-	BuddyTickerDestroyWindow(tickerwindow);
+	buddy_ticker_destroy_window(tickerwindow, NULL);
 }
-struct gaim_plugin_description desc; 
+
+struct gaim_plugin_description desc;
 G_MODULE_EXPORT struct gaim_plugin_description *gaim_plugin_desc() {
 	desc.api_version = PLUGIN_API_VERSION;
 	desc.name = g_strdup(_("Buddy Ticker"));