# HG changeset patch # User Sean Egan # Date 1091320305 0 # Node ID 8a540b8a5f705a742a320f45281f59d17cc25864 # Parent afd069368860e040e515d637554d9a3b9915a792 [gaim-migrate @ 10471] A bug fix for away message tooltips and some more removing-gaim_notify_errors. Here's the thought: for errors associated with a buddy, check to see if there's already a window open for him, if so, print the error to the window and present the window to the user. If not, you can go ahead and gaim_notify_error. So, things like checking profiles in the buddy list might potentially print errors to conversations. I think this is good, but we'll try it out a bit. If it's really good, we won't even gaim_notify_error and instead create a new convo window just for the error. committer: Tailor Script diff -r afd069368860 -r 8a540b8a5f70 src/conversation.c --- a/src/conversation.c Sat Jul 31 23:30:01 2004 +0000 +++ b/src/conversation.c Sun Aug 01 00:31:45 2004 +0000 @@ -1666,6 +1666,29 @@ gaim_conversation_write(c, who, message, flags, mtime); } +gboolean gaim_conv_present_error(const char *who, GaimAccount *account, const char *what) +{ + GaimConversation *conv; + GaimConvWindow *window; + + g_return_val_if_fail(who != NULL, FALSE); + g_return_val_if_fail(account !=NULL, FALSE); + g_return_val_if_fail(what != NULL, FALSE); + + conv = gaim_find_conversation_with_account(who, account); + if (conv != NULL) + gaim_conversation_write(conv, NULL, what, GAIM_MESSAGE_ERROR, time(NULL)); + else + return FALSE; + window = gaim_conversation_get_window(conv); + if (!gaim_conv_window_has_focus(window)) /* don't change the active conversation if the user is using this window */ + gaim_conv_window_switch_conversation(window, gaim_conversation_get_index(conv)); + + gaim_conv_window_raise(window); + + return TRUE; +} + void gaim_conv_im_send(GaimConvIm *im, const char *message) { diff -r afd069368860 -r 8a540b8a5f70 src/conversation.h --- a/src/conversation.h Sat Jul 31 23:30:01 2004 +0000 +++ b/src/conversation.h Sun Aug 01 00:31:45 2004 +0000 @@ -1001,6 +1001,21 @@ time_t mtime); /** + * Presents an IM-error to the user + * + * This is a helper function to find a conversation, write an error to it, and + * raise the window. If a conversation with this user doesn't already exist, + * the function will return FALSE and the calling function can attempt to present + * the error another way (gaim_notify_error, most likely) + * + * @param who The user this error is about + * @param account The account this error is on + * @param what The error + * @return TRUE if the error was presented, else FALSE + */ +gboolean gaim_conv_present_error(const char *who, GaimAccount *account, const char *what); + +/** * Sends a message to this IM conversation. * * @param im The IM. diff -r afd069368860 -r 8a540b8a5f70 src/gtkconv.c --- a/src/gtkconv.c Sat Jul 31 23:30:01 2004 +0000 +++ b/src/gtkconv.c Sun Aug 01 00:31:45 2004 +0000 @@ -5073,13 +5073,13 @@ } else if (flags & GAIM_MESSAGE_ERROR) { if (gaim_prefs_get_bool("/gaim/gtk/conversations/show_timestamps")) - g_snprintf(buf, BUF_LONG, "(%s) %s", + g_snprintf(buf, BUF_LONG, "(%s) %s", mdate, message); else g_snprintf(buf, BUF_LONG, "%s", message); g_snprintf(buf2, sizeof(buf2), - "%s", + "%s", sml_attrib, mdate, message); gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), buf2, 0); diff -r afd069368860 -r 8a540b8a5f70 src/protocols/oscar/oscar.c --- a/src/protocols/oscar/oscar.c Sat Jul 31 23:30:01 2004 +0000 +++ b/src/protocols/oscar/oscar.c Sun Aug 01 00:31:45 2004 +0000 @@ -1414,6 +1414,7 @@ gaim_connection_error(gc, _("Disconnected.")); } else if (conn->type == AIM_CONN_TYPE_CHAT) { struct chat_connection *c = find_oscar_chat_by_conn(gc, conn); + GaimConversation *conv = gaim_find_chat(gc, c->id); char *buf; gaim_debug_info("oscar", "disconnected from chat room %s\n", c->name); @@ -1424,7 +1425,10 @@ c->fd = -1; aim_conn_kill(od->sess, &conn); buf = g_strdup_printf(_("You have been disconnected from chat room %s."), c->name); - gaim_notify_error(gc, NULL, buf, NULL); + if (conv) + gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_ERROR, time(NULL)); + else + gaim_notify_error(gc, NULL, buf, NULL); g_free(buf); } else if (conn->type == AIM_CONN_TYPE_CHATNAV) { if (od->cnpa > 0) @@ -3678,7 +3682,6 @@ static int gaim_parse_misses(aim_session_t *sess, aim_frame_t *fr, ...) { GaimConnection *gc = sess->aux_data; GaimAccount *account = gaim_connection_get_account(gc); - GaimConversation *conv; char *buf; va_list ap; fu16_t chan, nummissed, reason; @@ -3748,10 +3751,7 @@ break; } - conv = gaim_find_conversation_with_account(userinfo->sn, account); - if (conv != NULL) - gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_ERROR, time(NULL)); - else + if (!gaim_conv_present_error(userinfo->sn, account, buf)) gaim_notify_error(sess->aux_data, NULL, buf, NULL); g_free(buf); @@ -3872,8 +3872,8 @@ } static int gaim_parse_msgerr(aim_session_t *sess, aim_frame_t *fr, ...) { + GaimConnection *gc = sess->aux_data; #if 0 - GaimConnection *gc = sess->aux_data; OscarData *od = gc->proto_data; GaimXfer *xfer; #endif @@ -3899,11 +3899,13 @@ #endif /* Data is assumed to be the destination sn */ - buf = g_strdup_printf(_("Your message to %s did not get sent:"), data); - gaim_notify_error(sess->aux_data, NULL, buf, - (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("No reason given.")); - g_free(buf); - + if (!gaim_conv_present_error(data, gaim_connection_get_account(gc), + (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("Your message did not get sent."))) { + buf = g_strdup_printf(_("Your message to %s did not get sent:"), data); + gaim_notify_error(sess->aux_data, NULL, buf, + (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("No reason given.")); + g_free(buf); + } return 1; } @@ -3945,7 +3947,7 @@ * happens when you request info of someone who is offline. */ static int gaim_parse_locerr(aim_session_t *sess, aim_frame_t *fr, ...) { - gchar *buf; + gchar *buf, *cbuf; va_list ap; fu16_t reason; char *destn; @@ -3957,12 +3959,15 @@ if (destn == NULL) return 1; - - buf = g_strdup_printf(_("User information for %s unavailable:"), destn); - - gaim_notify_error(sess->aux_data, NULL, buf, - (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("No reason given.")); - g_free(buf); + + cbuf = g_strdup_printf(_("User information not available: %s"), (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("No reason given.")); + if (!gaim_conv_present_error(destn, gaim_connection_get_account((GaimConnection*)sess->aux_data), cbuf)) { + buf = g_strdup_printf(_("User information for %s unavailable:"), destn); + gaim_notify_error(sess->aux_data, NULL, buf, + (reason < msgerrreasonlen) ? _(msgerrreason[reason]) : _("No reason given.")); + g_free(buf); + } + g_free(cbuf); return 1; } @@ -5522,7 +5527,8 @@ if (!aim_snvalid(buddy->name)) { gchar *buf; buf = g_strdup_printf(_("Could not add the buddy %s because the screen name is invalid. Screen names must either start with a letter and contain only letters, numbers and spaces, or contain only numbers."), buddy->name); - gaim_notify_error(gc, NULL, _("Unable To Add"), buf); + if (!gaim_conv_present_error(buddy->name, gaim_connection_get_account(gc), buf)) + gaim_notify_error(gc, NULL, _("Unable To Add"), buf); g_free(buf); /* Remove from local list */ @@ -5970,7 +5976,8 @@ case 0x000c: { /* you are over the limit, the cheat is to the limit, come on fhqwhgads */ gchar *buf; buf = g_strdup_printf(_("Could not add the buddy %s because you have too many buddies in your buddy list. Please remove one and try again."), (retval->name ? retval->name : _("(no name)"))); - gaim_notify_error(gc, NULL, _("Unable To Add"), buf); + if (!gaim_conv_present_error(retval->name, gaim_connection_get_account(gc), buf)) + gaim_notify_error(gc, NULL, _("Unable To Add"), buf); g_free(buf); } @@ -5983,7 +5990,8 @@ gchar *buf; gaim_debug_error("oscar", "ssi: Action 0x%04hx was unsuccessful with error 0x%04hx\n", retval->action, retval->ack); buf = g_strdup_printf(_("Could not add the buddy %s for an unknown reason. The most common reason for this is that you have the maximum number of allowed buddies in your buddy list."), (retval->name ? retval->name : _("(no name)"))); - gaim_notify_error(gc, NULL, _("Unable To Add"), buf); + if (!gaim_conv_present_error(retval->name, gaim_connection_get_account(gc), buf)) + gaim_notify_error(gc, NULL, _("Unable To Add"), buf); g_free(buf); } break; } @@ -6448,15 +6456,17 @@ g_free(charset); if (away_utf8 != NULL) { gchar *tmp1, *tmp2; - tmp1 = gaim_strcasereplace(away_utf8, "
", "\n"); + /* tmp1 = gaim_strcasereplace(away_utf8, "
", "\n"); This replacement is handled in strip_html. + * g_free(away_utf8); + */ + tmp2 = gaim_markup_strip_html(away_utf8); g_free(away_utf8); - tmp2 = gaim_markup_strip_html(tmp1); - g_free(tmp1); tmp1 = gaim_escape_html(tmp2); g_free(tmp2); tmp2 = gaim_str_sub_away_formatters(tmp1, gaim_account_get_username(gaim_connection_get_account(gc))); g_free(tmp1); g_string_append_printf(str, "\n%s: %s", _("Away Message"), tmp2); + g_free(tmp2); } }