Mercurial > pidgin.yaz
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"));