# HG changeset patch # User Nathan Walp # Date 1047577941 0 # Node ID 01cae9259e2fa23a359a1eaa8231f26f6f4fc44d # Parent a0746ffce59953de91b2cc18526a6252718d8398 [gaim-migrate @ 5060] fixes a bug where if all your accounts got logged off, thus making the buddy list disappear, you could never get it back. That makes for a bad time when your internet connection goes out (like mine did last night) also makes some of the prpl tooltips spiffier, and re-does some of the handling of away messages in jabber, thus making it cooler. committer: Tailor Script diff -r a0746ffce599 -r 01cae9259e2f src/buddy.c --- a/src/buddy.c Thu Mar 13 10:16:59 2003 +0000 +++ b/src/buddy.c Thu Mar 13 17:52:21 2003 +0000 @@ -862,7 +862,7 @@ GtkTargetEntry gte[] = {{"GAIM_BUDDY", GTK_TARGET_SAME_APP, DRAG_ROW}, {"application/x-im-contact", 0, DRAG_BUDDY}}; - if (gtkblist) { + if (gtkblist && gtkblist->window) { gtk_widget_show(gtkblist->window); return; } @@ -1206,6 +1206,17 @@ static void gaim_gtk_blist_destroy(struct gaim_buddy_list *list) { gtk_widget_destroy(gtkblist->window); + + gtkblist->window = gtkblist->vbox = gtkblist->treeview = NULL; + gtkblist->treemodel = NULL; + gtkblist->idle_column = NULL; + gtkblist->warning_column = gtkblist->buddy_icon_column = NULL; + gtkblist->bbox = gtkblist->tipwindow = NULL; + protomenu = NULL; + awaymenu = NULL; + bpmenu = NULL; + + gtkblist->timeout = 0; } static void gaim_gtk_blist_set_visible(struct gaim_buddy_list *list, gboolean show) @@ -1270,7 +1281,7 @@ if (!docklet_count) { if (connections) { gaim_blist_set_visible(TRUE); - } else { + } else if(gtkblist && gtkblist->window) { gtk_window_present(GTK_WINDOW(gtkblist->window)); } } diff -r a0746ffce599 -r 01cae9259e2f src/gtkimhtml.c --- a/src/gtkimhtml.c Thu Mar 13 10:16:59 2003 +0000 +++ b/src/gtkimhtml.c Thu Mar 13 17:52:21 2003 +0000 @@ -302,15 +302,15 @@ g_signal_emit(arg1, signals[URL_CLICKED], 0, url); return FALSE; } else if(event_button->button == 3) { - GtkWidget *img, *item, *label, *menu; + GtkWidget *img, *item, *menu; struct url_data *tempdata = g_new(struct url_data, 1); tempdata->object = g_object_ref(arg1); tempdata->url = g_strdup(url); - + menu = gtk_menu_new(); - gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event_button->button, event_button->time); - + /* buttons and such */ img = gtk_image_new_from_stock(GTK_STOCK_COPY, GTK_ICON_SIZE_MENU); item = gtk_image_menu_item_new_with_mnemonic(_("_Copy Link Location")); @@ -326,7 +326,7 @@ tempdata); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); gtk_widget_show_all(menu); - + return TRUE; } } diff -r a0746ffce599 -r 01cae9259e2f src/protocols/jabber/jabber.c --- a/src/protocols/jabber/jabber.c Thu Mar 13 10:16:59 2003 +0000 +++ b/src/protocols/jabber/jabber.c Thu Mar 13 17:52:21 2003 +0000 @@ -1136,18 +1136,28 @@ { jab_res_info jri = jabber_find_resource(GJ_GC(gjc), name); - if(!jri || !jri->away_msg) + if(!jri) return _("Unknown"); return jri->away_msg; } +static const char *jabber_get_state_string(int s) { + switch(s) { + case UC_AWAY: + return _("Away"); + case UC_CHAT: + return _("Chatty"); + case UC_XA: + return _("Extended Away"); + case UC_DND: + return _("Do Not Disturb"); + default: + return _("Available"); + } +} static void jabber_track_away(gjconn gjc, jpacket p, char *type) { - char *show; - char *vshow = NULL; - char *status = NULL; - char *msg = NULL; jab_res_info jri = NULL; if(!p || !p->from || !p->from->user) @@ -1158,40 +1168,10 @@ if(!jri) return; - if (type && (strcasecmp(type, "unavailable") == 0)) { - vshow = _("Unavailable"); - } else { - if((show = xmlnode_get_tag_data(p->x, "show")) != NULL) { - if (!strcasecmp(show, "away")) { - vshow = _("Away"); - } else if (!strcasecmp(show, "chat")) { - vshow = _("Online"); - } else if (!strcasecmp(show, "xa")) { - vshow = _("Extended Away"); - } else if (!strcasecmp(show, "dnd")) { - vshow = _("Do Not Disturb"); - } - } - } - - status = g_strdup(xmlnode_get_tag_data(p->x, "status")); - - if(vshow != NULL || status != NULL ) { - /* kinda hokey, but it works :-) */ - msg = g_strdup_printf("%s%s%s", - (vshow == NULL? "" : vshow), - (vshow == NULL || status == NULL? "" : ": "), - (status == NULL? "" : status)); - } else { - msg = g_strdup(_("Online")); - } - - g_free(status); - if(jri->away_msg) g_free(jri->away_msg); - jri->away_msg = msg; + jri->away_msg = g_strdup(xmlnode_get_tag_data(p->x, "status")); } static void jabber_convo_closed(struct gaim_connection *gc, char *name) @@ -3155,7 +3135,7 @@ realwho = g_strdup_printf("%s/%s", buddy, jri->name); status = strdup_withhtml(jabber_lookup_away(gjc, realwho)); *ap++ = g_strdup_printf("Jabber ID: %s
\n", realwho); - *ap++ = g_strdup_printf("Status: %s
\n", status); + *ap++ = g_strdup_printf("Status: %s%s%s
\n", jabber_get_state_string(jri->state), status ? ": " : "", status ? status : ""); g_free(status); g_free(realwho); resources = resources->next; @@ -3204,18 +3184,32 @@ static char *jabber_tooltip_text(struct buddy *b) { - struct jabber_data *jd = b->account->gc->proto_data; - char *text = jabber_lookup_away(jd->gjc, b->name); - if (text) - return strip_html(text); + jab_res_info jri = jabber_find_resource(b->account->gc, b->name); + if(jri) { + char *text = strip_html(jabber_lookup_away(GC_GJ(b->account->gc), + b->name)); + char *ret = g_strdup_printf(_("Status: %s%s%s"), + jabber_get_state_string(jri->state), text ? ": " : "", + text ? text : ""); + + if(text) + g_free(text); + return ret; + } return NULL; } static char *jabber_status_text(struct buddy *b) { - struct jabber_data *jd = b->account->gc->proto_data; if (b->uc & UC_UNAVAILABLE) { - return strip_html(jabber_lookup_away(jd->gjc, b->name)); + char *ret = strip_html(jabber_lookup_away(GC_GJ(b->account->gc), + b->name)); + if(!ret) { + jab_res_info jri = jabber_find_resource(b->account->gc, b->name); + if(jri) + ret = g_strdup(jabber_get_state_string(jri->state)); + } + return ret; } return NULL; } @@ -3541,11 +3535,15 @@ gchar **ap = str_arr; gchar *buddy, *final; + jab_res_info jri; + if((buddy = get_realwho(gjc, from, TRUE, NULL)) == NULL) { g_strfreev(str_arr); return; } + jri = jabber_find_resource(GJ_GC(gjc), buddy); + *ap++ = g_strdup_printf("Jabber ID: %s
\n", buddy); for(vc_tp = vcard_template_data; vc_tp->label != NULL; ++vc_tp) { @@ -3569,8 +3567,11 @@ } } + status = strdup_withhtml(jabber_lookup_away(gjc, buddy)); - *ap++ = g_strdup_printf("Status: %s
\n", status); + *ap++ = g_strdup_printf("Status: %s%s%s
\n", + jri ? jabber_get_state_string(jri->state) : "", + jri && status ? ": " : "", status ? status : ""); g_free(status); /* diff -r a0746ffce599 -r 01cae9259e2f src/protocols/msn/msn.c --- a/src/protocols/msn/msn.c Thu Mar 13 10:16:59 2003 +0000 +++ b/src/protocols/msn/msn.c Thu Mar 13 17:52:21 2003 +0000 @@ -1639,12 +1639,12 @@ #endif static char *msn_status_text(struct buddy *b) { if (b->uc & UC_UNAVAILABLE) - return strip_html(msn_get_away_text(b->uc >> 1)); + return g_strdup(msn_get_away_text(b->uc >> 1)); return NULL; } static char *msn_tooltip_text(struct buddy *b) { - return strip_html(msn_get_away_text(b->uc >> 1)); + return g_strdup_printf(_("Status: %s"), msn_get_away_text(b->uc >> 1)); } static GList *msn_buddy_menu(struct gaim_connection *gc, char *who) diff -r a0746ffce599 -r 01cae9259e2f src/protocols/yahoo/yahoo.c --- a/src/protocols/yahoo/yahoo.c Thu Mar 13 10:16:59 2003 +0000 +++ b/src/protocols/yahoo/yahoo.c Thu Mar 13 17:52:21 2003 +0000 @@ -1083,10 +1083,17 @@ { struct yahoo_data *yd = (struct yahoo_data*)b->account->gc->proto_data; if (b->uc & UC_UNAVAILABLE) { + char *status; + char *ret; if ((b->uc >> 2) != YAHOO_STATUS_CUSTOM) - return g_strdup(yahoo_get_status_string(b->uc >> 2)); + status = g_strdup(yahoo_get_status_string(b->uc >> 2)); else - return strip_html(g_hash_table_lookup(yd->hash, b->name)); + status = strip_html(g_hash_table_lookup(yd->hash, b->name)); + if(status) { + ret = g_strdup_printf(_("Status: %s"), status); + g_free(status); + return ret; + } } return NULL; }