From: Nathan W. <fac...@us...> - 2003-04-07 23:17:46
|
Update of /cvsroot/gaim/gaim/src In directory sc8-pr-cvs1:/tmp/cvs-serv4884/src Modified Files: buddy.c gtkconv.c gtklist.h list.c list.h multi.c perl.c server.c Log Message: logout icons Index: buddy.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/buddy.c,v retrieving revision 1.507 retrieving revision 1.508 diff -u -d -r1.507 -r1.508 --- buddy.c 7 Apr 2003 16:47:16 -0000 1.507 +++ buddy.c 7 Apr 2003 23:16:49 -0000 1.508 @@ -411,19 +411,6 @@ gaim_gtk_blist_refresh(gaim_get_blist()); } -/* This is called 10 seconds after the buddy logs in. It removes the "logged in" icon and replaces it with - * the normal status icon. Make sure they didn't sign off in the mean-time though. */ - -static gboolean gaim_reset_present_icon (GaimBlistNode *b) -{ - if (((struct buddy *)b)->present == 2) { - ((struct buddy *)b)->present = 1; - gaim_gtk_blist_update(NULL, b); - } - - return FALSE; -} - static void gaim_gtk_blist_drag_data_get_cb (GtkWidget *widget, GdkDragContext *dc, GtkSelectionData *data, @@ -742,7 +729,7 @@ nicktext ? _("\n<b>Nickname:</b>") : "", nicktext ? nicktext : "", idletime ? _("\n<b>Idle:</b>") : "", idletime ? idletime : "", b->evil ? _("\n<b>Warned:</b>") : "", b->evil ? warning : "", - !b->present ? _("\n<b>Status:</b> Offline") : "", + !GAIM_BUDDY_IS_ONLINE(b) ? _("\n<b>Status:</b> Offline") : "", statustext ? "\n" : "", statustext ? statustext : "", !g_ascii_strcasecmp(b->name, "robflynn") ? "\n<b>Description:</b> Spooky" : ""); @@ -761,7 +748,7 @@ } -static GdkPixbuf *gaim_gtk_blist_get_status_icon(struct buddy *b, GaimStatusIconSize size) +static GdkPixbuf *gaim_gtk_blist_get_status_icon(struct buddy *b, GaimStatusIconSize size) { GdkPixbuf *status = NULL; GdkPixbuf *scale = NULL; @@ -780,27 +767,23 @@ if (prpl->list_icon) protoname = prpl->list_icon(b->account, b); - if (prpl->list_emblems) + if (b->present != GAIM_BUDDY_SIGNING_OFF && prpl->list_emblems) prpl->list_emblems(b, &se, &sw, &nw, &ne); - + if (size == GAIM_STATUS_ICON_SMALL) { scalesize = 15; sw = nw = ne = NULL; /* So that only the se icon will composite */ } - if (b->present == 2) { - struct gaim_gtk_blist_node *gtknode; - /* If b->present is 2, that means this buddy has just signed on. We use the "login" icon for the - * status, and we set a timeout to change it to a normal icon after 10 seconds. */ + if (b->present == GAIM_BUDDY_SIGNING_ON) { filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", "login.png", NULL); status = gdk_pixbuf_new_from_file(filename,NULL); g_free(filename); - - gtknode = GAIM_GTK_BLIST_NODE((GaimBlistNode*)b); - if (gtknode->timer > 0) - g_source_remove(gtknode->timer); - gtknode->timer = g_timeout_add(10000, (GSourceFunc)gaim_reset_present_icon, b); + } else if (b->present == GAIM_BUDDY_SIGNING_OFF) { + filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", "logout.png", NULL); + status = gdk_pixbuf_new_from_file(filename,NULL); + g_free(filename); /* "Hey, what's all this crap?" you ask. Status icons will be themeable too, and then it will look up protoname from the theme */ @@ -906,7 +889,7 @@ /* Idle grey buddies affects the whole row. This converts the status icon to greyscale. */ - if (!b->present) + if (b->present == GAIM_BUDDY_OFFLINE) gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.0, FALSE); else if (b->idle && blist_options & OPT_BLIST_GREY_IDLERS) gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.25, FALSE); @@ -930,7 +913,7 @@ if (buf) { - if (!b->present) + if (!GAIM_BUDDY_IS_ONLINE(b)) gdk_pixbuf_saturate_and_pixelate(buf, buf, 0.0, FALSE); if (b->idle && blist_options & OPT_BLIST_GREY_IDLERS) gdk_pixbuf_saturate_and_pixelate(buf, buf, 0.25, FALSE); @@ -955,7 +938,7 @@ time_t t; if (!(blist_options & OPT_BLIST_SHOW_ICONS)) { - if ((b->idle && blist_options & OPT_BLIST_GREY_IDLERS && !selected) || b->present == 0) { + if ((b->idle && blist_options & OPT_BLIST_GREY_IDLERS && !selected) || !GAIM_BUDDY_IS_ONLINE(b)) { text = g_strdup_printf("<span color='dim grey'>%s</span>", esc); g_free(esc); @@ -1026,8 +1009,8 @@ statustext != NULL ? statustext : "", idletime != NULL ? idletime : "", warning != NULL ? warning : "", - !b->present ? _("Offline ") : ""); - } else if (statustext == NULL && idletime == NULL && warning == NULL && b->present) { + !GAIM_BUDDY_IS_ONLINE(b) ? _("Offline ") : ""); + } else if (statustext == NULL && idletime == NULL && warning == NULL && GAIM_BUDDY_IS_ONLINE(b)) { text = g_strdup(esc); } else { text = g_strdup_printf("%s\n" @@ -1036,7 +1019,7 @@ statustext != NULL ? statustext : "", idletime != NULL ? idletime : "", warning != NULL ? warning : "", - !b->present ? _("Offline ") : ""); + !GAIM_BUDDY_IS_ONLINE(b) ? _("Offline ") : ""); } if (idletime) g_free(idletime); @@ -1100,11 +1083,6 @@ blist->ui_data = g_new0(struct gaim_gtk_buddy_list, 1); } -static void gaim_gtk_blist_new_node(GaimBlistNode *node) -{ - node->ui_data = g_new0(struct gaim_gtk_blist_node, 1); -} - void gaim_gtk_blist_update_columns() { if (blist_options & OPT_BLIST_SHOW_ICONS) { @@ -1400,19 +1378,8 @@ static void gaim_gtk_blist_remove(struct gaim_buddy_list *list, GaimBlistNode *node) { - struct gaim_gtk_blist_node *gtknode; GtkTreeIter iter; - if (!node->ui_data) - return; - - gtknode = (struct gaim_gtk_blist_node *)node->ui_data; - - if (gtknode->timer > 0) { - g_source_remove(gtknode->timer); - gtknode->timer = 0; - } - /* For some reason, we're called before we have a buddy list sometimes */ if(!gtkblist) return; @@ -1489,7 +1456,6 @@ static void gaim_gtk_blist_update(struct gaim_buddy_list *list, GaimBlistNode *node) { - struct gaim_gtk_blist_node *gtknode; GtkTreeIter iter; GtkTreePath *expand = NULL; gboolean new_entry = FALSE; @@ -1497,13 +1463,10 @@ if (!gtkblist) return; - gtknode = GAIM_GTK_BLIST_NODE(node); - - if (!get_iter_from_node(node, &iter)) { /* This is a newly added node */ new_entry = TRUE; if (GAIM_BLIST_NODE_IS_BUDDY(node)) { - if (((struct buddy*)node)->present || ((blist_options & OPT_BLIST_SHOW_OFFLINE) && ((struct buddy*)node)->account->gc)) { + if (((struct buddy*)node)->present != GAIM_BUDDY_OFFLINE || ((blist_options & OPT_BLIST_SHOW_OFFLINE) && ((struct buddy*)node)->account->gc)) { GtkTreeIter groupiter; GaimBlistNode *oldersibling; GtkTreeIter oldersiblingiter; @@ -1556,7 +1519,7 @@ } } - if (GAIM_BLIST_NODE_IS_BUDDY(node) && (((struct buddy*)node)->present || ((blist_options & OPT_BLIST_SHOW_OFFLINE) && ((struct buddy*)node)->account->gc))) { + if (GAIM_BLIST_NODE_IS_BUDDY(node) && (((struct buddy*)node)->present != GAIM_BUDDY_OFFLINE || ((blist_options & OPT_BLIST_SHOW_OFFLINE) && ((struct buddy*)node)->account->gc))) { GdkPixbuf *status, *avatar; char *mark; char *warning = NULL, *idle = NULL; @@ -1745,7 +1708,7 @@ static struct gaim_blist_ui_ops blist_ui_ops = { gaim_gtk_blist_new_list, - gaim_gtk_blist_new_node, + NULL, gaim_gtk_blist_show, gaim_gtk_blist_update, gaim_gtk_blist_remove, Index: gtkconv.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/gtkconv.c,v retrieving revision 1.95 retrieving revision 1.96 diff -u -d -r1.95 -r1.96 --- gtkconv.c 6 Apr 2003 22:18:29 -0000 1.95 +++ gtkconv.c 7 Apr 2003 23:16:53 -0000 1.96 @@ -2239,7 +2239,7 @@ continue; buddy = (struct buddy *)bnode; - if (buddy->account == gc->account && buddy->present) + if (buddy->account == gc->account && GAIM_BUDDY_IS_ONLINE(buddy)) tmp = g_list_append(tmp, buddy->name); } } Index: gtklist.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/gtklist.h,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- gtklist.h 7 Apr 2003 16:57:44 -0000 1.20 +++ gtklist.h 7 Apr 2003 23:16:55 -0000 1.21 @@ -72,15 +72,6 @@ GaimBlistNode *selected_node; /**< The currently selected node */ }; -/** - * A GTK+ buddy list node. - */ -struct gaim_gtk_blist_node -{ - unsigned int timer; /**< The timer handle. */ -}; - -#define GAIM_GTK_BLIST_NODE(node) ((struct gaim_gtk_blist_node *)(node)->ui_data) #define GAIM_GTK_BLIST(list) ((struct gaim_gtk_buddy_list *)(list)->ui_data) #define GAIM_IS_GTK_BLIST(list) \ ((list)->ui_ops == gaim_get_gtk_blist_ui_ops()) Index: list.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/list.c,v retrieving revision 1.61 retrieving revision 1.62 diff -u -d -r1.61 -r1.62 --- list.c 7 Apr 2003 04:49:04 -0000 1.61 +++ list.c 7 Apr 2003 23:16:56 -0000 1.62 @@ -122,13 +122,40 @@ ops->update(gaimbuddylist, (GaimBlistNode*)buddy); } +static gboolean presence_update_timeout_cb(struct buddy *buddy) { + struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; + + if(buddy->present == GAIM_BUDDY_SIGNING_ON) + buddy->present = GAIM_BUDDY_ONLINE; + else if(buddy->present == GAIM_BUDDY_SIGNING_OFF) + buddy->present = GAIM_BUDDY_OFFLINE; + + buddy->timer = 0; + + if (ops) + ops->update(gaimbuddylist, (GaimBlistNode*)buddy); + + return FALSE; +} + void gaim_blist_update_buddy_presence(struct buddy *buddy, int presence) { struct gaim_blist_ui_ops *ops = gaimbuddylist->ui_ops; + gboolean do_timer = FALSE; + + if (!GAIM_BUDDY_IS_ONLINE(buddy) && presence) { + buddy->present = GAIM_BUDDY_SIGNING_ON; + do_timer = TRUE; + } else if(GAIM_BUDDY_IS_ONLINE(buddy) && !presence) { + buddy->present = GAIM_BUDDY_SIGNING_OFF; + do_timer = TRUE; + } + + if(do_timer) { + if(buddy->timer > 0) + g_source_remove(buddy->timer); + buddy->timer = g_timeout_add(10000, (GSourceFunc)presence_update_timeout_cb, buddy); + } - if (!buddy->present && presence) - buddy->present = 2; - else if (buddy->present != 2 || !presence) - buddy->present = presence; if (ops) ops->update(gaimbuddylist, (GaimBlistNode*)buddy); } @@ -484,7 +511,7 @@ buddy = group->child; while (buddy) { if (account == ((struct buddy*)buddy)->account) { - ((struct buddy*)buddy)->present = 0; + ((struct buddy*)buddy)->present = GAIM_BUDDY_OFFLINE; if(ops) ops->remove(gaimbuddylist, buddy); } @@ -1419,7 +1446,7 @@ for(node = group->node.child; node; node = node->next) { if(GAIM_BLIST_NODE_IS_BUDDY(node)) { struct buddy *b = (struct buddy *)node; - if(b->present) + if(GAIM_BUDDY_IS_ONLINE(b)) count++; } } Index: list.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/list.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- list.h 5 Apr 2003 10:45:31 -0000 1.8 +++ list.h 7 Apr 2003 23:16:57 -0000 1.9 @@ -40,6 +40,17 @@ #define GAIM_BLIST_NODE_IS_BUDDY(n) ((n)->type == GAIM_BLIST_BUDDY_NODE) #define GAIM_BLIST_NODE_IS_GROUP(n) ((n)->type == GAIM_BLIST_GROUP_NODE) +enum gaim_buddy_presence_state { + GAIM_BUDDY_SIGNING_OFF = -1, + GAIM_BUDDY_OFFLINE = 0, + GAIM_BUDDY_ONLINE, + GAIM_BUDDY_SIGNING_ON, +}; + +#define GAIM_BUDDY_IS_ONLINE(b) ((b)->present == GAIM_BUDDY_ONLINE || \ + (b)->present == GAIM_BUDDY_SIGNING_ON) + + /**************************************************************************/ /* Data Structures */ /**************************************************************************/ @@ -52,7 +63,7 @@ enum gaim_blist_node_type type; /**< The type of node this is */ GaimBlistNode *prev; /**< The sibling before this buddy. */ GaimBlistNode *next; /**< The sibling after this buddy. */ - GaimBlistNode *parent; /**< The parent of this node */ + GaimBlistNode *parent; /**< The parent of this node */ GaimBlistNode *child; /**< The child of this node */ void *ui_data; /**< The UI can put data here. */ }; @@ -65,15 +76,16 @@ char *name; /**< The screenname of the buddy. */ char *alias; /**< The user-set alias of the buddy */ char *server_alias; /**< The server-specified alias of the buddy. (i.e. MSN "Friendly Names") */ - int present; /**< This is 0 if the buddy appears offline, 1 if he appears online, and 2 if + enum gaim_buddy_presence_state present; /**< This is 0 if the buddy appears offline, 1 if he appears online, and 2 if he has recently signed on */ int evil; /**< The warning level */ time_t signon; /**< The time the buddy signed on. */ int idle; /**< The time the buddy has been idle in minutes. */ - int uc; /**< This is a cryptic bitmask that makes sense only to the prpl. This will get changed */ + int uc; /**< This is a cryptic bitmask that makes sense only to the prpl. This will get changed */ void *proto_data; /**< This allows the prpl to associate whatever data it wants with a buddy */ struct gaim_account *account; /**< the account this buddy belongs to */ GHashTable *settings; /**< per-buddy settings from the XML buddy list, set by plugins and the likes. */ + guint timer; /**< The timer handle. */ }; /** Index: multi.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/multi.c,v retrieving revision 1.187 retrieving revision 1.188 diff -u -d -r1.187 -r1.188 --- multi.c 5 Apr 2003 05:01:39 -0000 1.187 +++ multi.c 7 Apr 2003 23:16:58 -0000 1.188 @@ -171,7 +171,7 @@ continue; n = (struct buddy *)bnode; if(n->account == gc->account) { - n->present = 0; + n->present = GAIM_BUDDY_OFFLINE; } } } Index: perl.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/perl.c,v retrieving revision 1.101 retrieving revision 1.102 diff -u -d -r1.101 -r1.102 --- perl.c 25 Mar 2003 01:41:54 -0000 1.101 +++ perl.c 7 Apr 2003 23:16:59 -0000 1.102 @@ -712,7 +712,7 @@ if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) continue; b = (struct buddy *)bnode; - if (b->account == gc->account && b->present) XST_mPV(i++, b->name); + if (b->account == gc->account && GAIM_BUDDY_IS_ONLINE(b)) XST_mPV(i++, b->name); } } XSRETURN(i); @@ -785,7 +785,7 @@ XSRETURN(0); XST_mPV(0, buddy->name); XST_mPV(1, gaim_get_buddy_alias(buddy)); - XST_mPV(2, buddy->present ? "Online" : "Offline"); + XST_mPV(2, GAIM_BUDDY_IS_ONLINE(buddy) ? "Online" : "Offline"); XST_mIV(3, buddy->evil); XST_mIV(4, buddy->signon); XST_mIV(5, buddy->idle); Index: server.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/server.c,v retrieving revision 1.293 retrieving revision 1.294 diff -u -d -r1.293 -r1.294 --- server.c 7 Apr 2003 17:11:23 -0000 1.293 +++ server.c 7 Apr 2003 23:17:02 -0000 1.294 @@ -893,7 +893,7 @@ if (loggedin) { - if (!b->present == 1) { + if (!GAIM_BUDDY_IS_ONLINE(b)) { struct gaim_conversation *c = gaim_find_conversation(b->name); if (c && (im_options & OPT_IM_LOGON)) { char *tmp = g_strdup_printf(_("%s logged in."), gaim_get_buddy_alias(b)); @@ -917,7 +917,7 @@ system_log(log_signon, gc, b, OPT_LOG_BUDDY_SIGNON); } } else { - if (b->present == 1) { + if (GAIM_BUDDY_IS_ONLINE(b)) { struct gaim_conversation *c = gaim_find_conversation(b->name); if (c && (im_options & OPT_IM_LOGON)) { char *tmp = g_strdup_printf(_("%s logged out."), gaim_get_buddy_alias(b)); |