Mercurial > pidgin
changeset 9627:8a540b8a5f70
[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 <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Sun, 01 Aug 2004 00:31:45 +0000 |
parents | afd069368860 |
children | b85d6212d707 |
files | src/conversation.c src/conversation.h src/gtkconv.c src/protocols/oscar/oscar.c |
diffstat | 4 files changed, 75 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- 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) {
--- 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.
--- 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, "<FONT SIZE=\"2\">(%s)</FONT> <B>%s</B>", + g_snprintf(buf, BUF_LONG, "<FONT COLOR=\"#ff0000\"><FONT SIZE=\"2\">(%s)</FONT> <B>%s</B></FONT>", mdate, message); else g_snprintf(buf, BUF_LONG, "<FONT COLOR=\"#ff0000\"><B>%s</B></FONT>", message); g_snprintf(buf2, sizeof(buf2), - "<FONT %s><FONT SIZE=\"2\"><!--(%s) --></FONT><B>%s</B></FONT>", + "<FONT COLOR=\"#ff0000\"><FONT %s><FONT SIZE=\"2\"><!--(%s) --></FONT><B>%s</B></FONT></FONT>", sml_attrib, mdate, message); gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), buf2, 0);
--- 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, "<BR>", "\n"); + /* tmp1 = gaim_strcasereplace(away_utf8, "<BR>", "\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<b>%s:</b> %s", _("Away Message"), tmp2); + g_free(tmp2); } }