# HG changeset patch # User Etan Reisner # Date 1209611177 0 # Node ID 369d68b5b4d4d15b663fc41cba8b9ae3ea272fd2 # Parent 7e28f2b64982ff1423c7f789bb8040e488893fa4# Parent 9467ae6096fd00746e883b0ca66f57b94bee4209 merge of '7f78e4be502956bb580a87289cf2acfe6254ea62' and 'adc2c416311e49c2c9279f1452fea30a94be7bfb' diff -r 9467ae6096fd -r 369d68b5b4d4 ChangeLog diff -r 9467ae6096fd -r 369d68b5b4d4 ChangeLog.API --- a/ChangeLog.API Tue Apr 29 03:31:51 2008 +0000 +++ b/ChangeLog.API Thu May 01 03:06:17 2008 +0000 @@ -1,10 +1,6 @@ Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul -version 2.5.0: - libpurple: - Added: - * purple_serv_got_join_chat_failed - * chat-join-failed signal (see conversation-signals.dox) +version 2.x.x: perl: Added: * Purple::Prefs::get_children_names. diff -r 9467ae6096fd -r 369d68b5b4d4 configure.ac --- a/configure.ac Tue Apr 29 03:31:51 2008 +0000 +++ b/configure.ac Thu May 01 03:06:17 2008 +0000 @@ -43,19 +43,19 @@ # # Make sure to update finch/libgnt/configure.ac with libgnt version changes. # -m4_define([purple_lt_current], [5]) +m4_define([purple_lt_current], [4]) m4_define([purple_major_version], [2]) -m4_define([purple_minor_version], [5]) -m4_define([purple_micro_version], [0]) +m4_define([purple_minor_version], [4]) +m4_define([purple_micro_version], [2]) m4_define([purple_version_suffix], [devel]) m4_define([purple_version], [purple_major_version.purple_minor_version.purple_micro_version]) m4_define([purple_display_version], purple_version[]m4_ifdef([purple_version_suffix],[purple_version_suffix])) -m4_define([gnt_lt_current], [5]) +m4_define([gnt_lt_current], [4]) m4_define([gnt_major_version], [2]) -m4_define([gnt_minor_version], [5]) -m4_define([gnt_micro_version], [0]) +m4_define([gnt_minor_version], [4]) +m4_define([gnt_micro_version], [2]) m4_define([gnt_version_suffix], [devel]) m4_define([gnt_version], [gnt_major_version.gnt_minor_version.gnt_micro_version]) diff -r 9467ae6096fd -r 369d68b5b4d4 doc/conversation-signals.dox --- a/doc/conversation-signals.dox Tue Apr 29 03:31:51 2008 +0000 +++ b/doc/conversation-signals.dox Thu May 01 03:06:17 2008 +0000 @@ -27,7 +27,6 @@ @signal chat-invited-user @signal chat-invited @signal chat-joined - @signal chat-join-failed @signal chat-left @signal chat-topic-changed @signal conversation-extended-menu @@ -401,16 +400,6 @@ @param conv The conversation that joined the chat room. @endsignaldef - @signaldef chat-join-failed - @signalproto -void (*chat_join_failed)(PurpleConnection *gc, const char *name); - @endsignalproto - @signaldesc - Emitted when an account fails to join a chat room - @param gc The PurpleConnection of the account which failed to join the chat. - @param name The name of the chat. - @endsignaldef - @signaldef chat-left @signalproto void (*chat_left)(PurpleConversation *conv); diff -r 9467ae6096fd -r 369d68b5b4d4 finch/gntaccount.c --- a/finch/gntaccount.c Tue Apr 29 03:31:51 2008 +0000 +++ b/finch/gntaccount.c Thu May 01 03:06:17 2008 +0000 @@ -122,7 +122,7 @@ if (value == NULL || *value == '\0') { purple_notify_error(NULL, _("Error"), _("Account was not added"), - _("Screenname of an account must be non-empty.")); + _("Username of an account must be non-empty.")); return; } @@ -526,7 +526,7 @@ gnt_box_add_widget(GNT_BOX(window), hbox); dialog->screenname = entry = gnt_entry_new(NULL); - gnt_box_add_widget(GNT_BOX(hbox), gnt_label_new(_("Screen name:"))); + gnt_box_add_widget(GNT_BOX(hbox), gnt_label_new(_("Username:"))); gnt_box_add_widget(GNT_BOX(hbox), entry); /* User splits */ diff -r 9467ae6096fd -r 369d68b5b4d4 finch/gntblist.c --- a/finch/gntblist.c Tue Apr 29 03:31:51 2008 +0000 +++ b/finch/gntblist.c Thu May 01 03:06:17 2008 +0000 @@ -380,6 +380,27 @@ fnode = FINCH_GET_DATA(node); if (fnode && fnode->signed_timer) flag |= GNT_TEXT_FLAG_BLINK; + } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { + /* If the node is collapsed, then check to see if any of the priority buddies of + * any of the contacts within this group recently signed on/off, and set the blink + * flag appropriately. */ + /* XXX: Refs #5444 */ + /* XXX: there's no way I can ask if the node is expanded or not? *sigh* + * API addition would be necessary */ +#if 0 + if (!gnt_tree_get_expanded(GNT_TREE(ggblist->tree), node)) { + for (node = purple_blist_node_get_first_child(node); node; + node = purple_blist_node_get_sibling_next(node)) { + PurpleBlistNode *pnode; + pnode = purple_contact_get_priority_buddy((PurpleContact*)node); + fnode = FINCH_GET_DATA(node); + if (fnode && fnode->signed_timer) { + flag |= GNT_TEXT_FLAG_BLINK; + break; + } + } + } +#endif } return flag; @@ -560,7 +581,7 @@ PurpleBuddy *buddy; if (!username) - error = _("You must provide a screename for the buddy."); + error = _("You must provide a username for the buddy."); else if (!group) error = _("You must provide a group."); else if (!account) @@ -598,7 +619,7 @@ purple_request_fields_add_group(fields, group); - field = purple_request_field_string_new("screenname", _("Screen Name"), username, FALSE); + field = purple_request_field_string_new("screenname", _("Username"), username, FALSE); purple_request_field_group_add_field(group, field); field = purple_request_field_string_new("alias", _("Alias (optional)"), alias, FALSE); @@ -1034,7 +1055,11 @@ else val = g_strdup(purple_request_field_string_get_value(field)); - g_hash_table_replace(purple_chat_get_components(chat), g_strdup(id), val); /* val should not be free'd */ + if (!val) { + g_hash_table_remove(purple_chat_get_components(chat), id); + } else { + g_hash_table_replace(purple_chat_get_components(chat), g_strdup(id), val); /* val should not be free'd */ + } } } } @@ -1065,8 +1090,13 @@ } else { field = purple_request_field_string_new(pce->identifier, pce->label, g_hash_table_lookup(purple_chat_get_components(chat), pce->identifier), FALSE); + if (pce->secret) + purple_request_field_string_set_masked(field, TRUE); } + if (pce->required) + purple_request_field_set_required(field, TRUE); + purple_request_field_group_add_field(group, field); g_free(pce); } @@ -2597,7 +2627,7 @@ purple_request_fields(purple_get_blist(), _("Block/Unblock"), NULL, - _("Please enter the screen name or alias of the person " + _("Please enter the username or alias of the person " "you would like to Block/Unblock."), fields, _("OK"), G_CALLBACK(block_select_cb), @@ -2648,7 +2678,7 @@ purple_request_fields(purple_get_blist(), _("New Instant Message"), NULL, - _("Please enter the screen name or alias of the person " + _("Please enter the username or alias of the person " "you would like to IM."), fields, _("OK"), G_CALLBACK(send_im_select_cb), diff -r 9467ae6096fd -r 369d68b5b4d4 finch/gntlog.c --- a/finch/gntlog.c Tue Apr 29 03:31:51 2008 +0000 +++ b/finch/gntlog.c Thu May 01 03:06:17 2008 +0000 @@ -139,7 +139,8 @@ } -static void destroy_cb(GntWidget *w, struct log_viewer_hash_t *ht) { +static void destroy_cb(GntWidget *w, struct log_viewer_hash_t *ht) +{ FinchLogViewer *lv = syslog_viewer; if (ht != NULL) { @@ -162,12 +163,12 @@ gnt_widget_destroy(w); } -static void log_select_cb(GntWidget *w, gpointer old, gpointer new, FinchLogViewer *viewer) { +static void log_select_cb(GntWidget *w, gpointer old, gpointer new, FinchLogViewer *viewer) +{ GntTree *tree = GNT_TREE(w); PurpleLog *log = NULL; PurpleLogReadFlags flags; char *read = NULL, *strip, *newline; - int h; if (!viewer->search && !gnt_tree_get_parent_key(tree, new)) return; @@ -204,8 +205,6 @@ gnt_text_view_clear(GNT_TEXT_VIEW(viewer->text)); gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(viewer->text), strip, GNT_TEXT_FLAG_NORMAL); - gnt_widget_get_size(viewer->text, NULL, &h); - gnt_text_view_scroll(GNT_TEXT_VIEW(viewer->text), h - 2); g_free(read); g_free(strip); } @@ -321,6 +320,7 @@ /* Viewer ************/ lv->text = gnt_text_view_new(); gnt_box_add_widget(GNT_BOX(hbox), lv->text); + gnt_text_view_set_flag(GNT_TEXT_VIEW(lv->text), GNT_TEXT_VIEW_TOP_ALIGN); hbox = gnt_hbox_new(FALSE); gnt_box_add_widget(GNT_BOX(vbox), hbox); diff -r 9467ae6096fd -r 369d68b5b4d4 finch/gntrequest.c --- a/finch/gntrequest.c Tue Apr 29 03:31:51 2008 +0000 +++ b/finch/gntrequest.c Thu May 01 03:06:17 2008 +0000 @@ -295,8 +295,7 @@ * updating the fields at the end like here, it updates the appropriate field * instantly whenever a change is made. That allows it to make sure the * 'required' fields are entered before the user can hit OK. It's not the case - * here, althought it can be done. I am not honouring the 'required' fields - * for the moment. */ + * here, althought it can be done. */ for (list = purple_request_fields_get_groups(fields); list; list = list->next) { PurpleRequestFieldGroup *group = list->data; @@ -368,6 +367,15 @@ } } + purple_notify_close_with_handle(button); + + if (!purple_request_fields_all_required_filled(fields)) { + purple_notify_error(button, _("Error"), + _("You must fill all the required fields."), + _("The required fields are underlined.")); + return; + } + if (callback) callback(data, fields); @@ -587,7 +595,11 @@ if (type != PURPLE_REQUEST_FIELD_BOOLEAN && label) { - GntWidget *l = gnt_label_new(label); + GntWidget *l; + if (purple_request_field_is_required(field)) + l = gnt_label_new_with_format(label, GNT_TEXT_FLAG_UNDERLINE); + else + l = gnt_label_new(label); gnt_widget_set_size(l, 0, 1); gnt_box_add_widget(GNT_BOX(hbox), l); } diff -r 9467ae6096fd -r 369d68b5b4d4 finch/gntsound.c --- a/finch/gntsound.c Tue Apr 29 03:31:51 2008 +0000 +++ b/finch/gntsound.c Thu May 01 03:06:17 2008 +0000 @@ -103,7 +103,7 @@ {PURPLE_SOUND_CHAT_YOU_SAY, N_("You talk in chat"), "send_chat_msg", "send.wav", NULL}, {PURPLE_SOUND_CHAT_SAY, N_("Others talk in chat"), "chat_msg_recv", "receive.wav", NULL}, {PURPLE_SOUND_POUNCE_DEFAULT, NULL, "pounce_default", "alert.wav", NULL}, - {PURPLE_SOUND_CHAT_NICK, N_("Someone says your screen name in chat"), "nick_said", "alert.wav", NULL} + {PURPLE_SOUND_CHAT_NICK, N_("Someone says your username in chat"), "nick_said", "alert.wav", NULL} }; const char * diff -r 9467ae6096fd -r 369d68b5b4d4 libpurple/conversation.c --- a/libpurple/conversation.c Tue Apr 29 03:31:51 2008 +0000 +++ b/libpurple/conversation.c Thu May 01 03:06:17 2008 +0000 @@ -2368,12 +2368,6 @@ purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONVERSATION)); - purple_signal_register(handle, "chat-join-failed", - purple_marshal_VOID__POINTER_POINTER, NULL, 2, - purple_value_new(PURPLE_TYPE_SUBTYPE, - PURPLE_SUBTYPE_CONNECTION), - purple_value_new(PURPLE_TYPE_STRING)); - purple_signal_register(handle, "chat-left", purple_marshal_VOID__POINTER, NULL, 1, purple_value_new(PURPLE_TYPE_SUBTYPE, diff -r 9467ae6096fd -r 369d68b5b4d4 libpurple/plugins/newline.c --- a/libpurple/plugins/newline.c Tue Apr 29 03:31:51 2008 +0000 +++ b/libpurple/plugins/newline.c Thu May 01 03:06:17 2008 +0000 @@ -102,11 +102,11 @@ "core-plugin_pack-newline", /**< id */ N_("New Line"), /**< name */ - DISPLAY_VERSION, /**< version */ + DISPLAY_VERSION, /**< version */ N_("Prepends a newline to displayed message."), /**< summary */ N_("Prepends a newline to messages so that the " "rest of the message appears below the " - "screen name in the conversation window."), /**< description */ + "username in the conversation window."), /**< description */ "Stu Tomlinson ", /**< author */ PURPLE_WEBSITE, /**< homepage */ diff -r 9467ae6096fd -r 369d68b5b4d4 libpurple/protocols/jabber/buddy.c --- a/libpurple/protocols/jabber/buddy.c Tue Apr 29 03:31:51 2008 +0000 +++ b/libpurple/protocols/jabber/buddy.c Thu May 01 03:06:17 2008 +0000 @@ -56,8 +56,7 @@ { g_return_if_fail(jb != NULL); - if(jb->error_msg) - g_free(jb->error_msg); + g_free(jb->error_msg); while(jb->resources) jabber_buddy_resource_free(jb->resources->data); @@ -155,12 +154,8 @@ } jbr->priority = priority; jbr->state = state; - if(jbr->status) - g_free(jbr->status); - if (status) - jbr->status = g_markup_escape_text(status, -1); - else - jbr->status = NULL; + g_free(jbr->status); + jbr->status = status != NULL ? g_markup_escape_text(status, -1) : NULL; return jbr; } @@ -502,6 +497,11 @@ if(((JabberStream*)gc->proto_data)->pep) { /* XEP-0084: User Avatars */ if(img) { + /* + * TODO: This is pretty gross. The Jabber PRPL really shouldn't + * do voodoo to try to determine the image type, height + * and width. + */ /* A PNG header, including the IHDR, but nothing else */ const struct { guchar signature[8]; /* must be hex 89 50 4E 47 0D 0A 1A 0A */ diff -r 9467ae6096fd -r 369d68b5b4d4 libpurple/protocols/jabber/chat.c --- a/libpurple/protocols/jabber/chat.c Tue Apr 29 03:31:51 2008 +0000 +++ b/libpurple/protocols/jabber/chat.c Thu May 01 03:06:17 2008 +0000 @@ -222,39 +222,33 @@ if(!handle) handle = js->user->node; - tmp = g_strdup_printf("%s@%s", room, server); - room_jid = g_strdup(jabber_normalize(NULL, tmp)); - g_free(tmp); - if(!jabber_nodeprep_validate(room)) { char *buf = g_strdup_printf(_("%s is not a valid room name"), room); purple_notify_error(gc, _("Invalid Room Name"), _("Invalid Room Name"), buf); - purple_serv_got_join_chat_failed(gc, room_jid); - g_free(room_jid); g_free(buf); return; } else if(!jabber_nameprep_validate(server)) { char *buf = g_strdup_printf(_("%s is not a valid server name"), server); purple_notify_error(gc, _("Invalid Server Name"), _("Invalid Server Name"), buf); - purple_serv_got_join_chat_failed(gc, room_jid); - g_free(room_jid); g_free(buf); return; } else if(!jabber_resourceprep_validate(handle)) { char *buf = g_strdup_printf(_("%s is not a valid room handle"), handle); purple_notify_error(gc, _("Invalid Room Handle"), _("Invalid Room Handle"), buf); - purple_serv_got_join_chat_failed(gc, room_jid); g_free(buf); - g_free(room_jid); return; } if(jabber_chat_find(js, room, server)) return; + tmp = g_strdup_printf("%s@%s", room, server); + room_jid = g_strdup(jabber_normalize(NULL, tmp)); + g_free(tmp); + chat = g_new0(JabberChat, 1); chat->js = gc->proto_data; diff -r 9467ae6096fd -r 369d68b5b4d4 libpurple/protocols/jabber/presence.c --- a/libpurple/protocols/jabber/presence.c Tue Apr 29 03:31:51 2008 +0000 +++ b/libpurple/protocols/jabber/presence.c Thu May 01 03:06:17 2008 +0000 @@ -369,17 +369,29 @@ typedef struct _JabberPresenceCapabilities { JabberStream *js; - JabberBuddyResource *jbr; + JabberBuddy *jb; char *from; } JabberPresenceCapabilities; static void jabber_presence_set_capabilities(JabberCapsClientInfo *info, gpointer user_data) { JabberPresenceCapabilities *userdata = user_data; + JabberID *jid; + JabberBuddyResource *jbr; GList *iter; - if(userdata->jbr->caps) - jabber_caps_free_clientinfo(userdata->jbr->caps); - userdata->jbr->caps = info; + jid = jabber_id_new(userdata->from); + jbr = jabber_buddy_find_resource(userdata->jb, jid->resource); + jabber_id_free(jid); + + if(!jbr) { + g_free(userdata->from); + g_free(userdata); + return; + } + + if(jbr->caps) + jabber_caps_free_clientinfo(jbr->caps); + jbr->caps = info; if (info) { for(iter = info->features; iter; iter = g_list_next(iter)) { @@ -575,7 +587,6 @@ serv_got_chat_left(js->gc, chat->id); } else { title = g_strdup_printf(_("Error joining chat %s"), from); - purple_serv_got_join_chat_failed(js->gc, room_jid); } purple_notify_error(js->gc, title, title, msg); g_free(title); @@ -742,7 +753,7 @@ if(node && ver) { JabberPresenceCapabilities *userdata = g_new0(JabberPresenceCapabilities, 1); userdata->js = js; - userdata->jbr = jbr; + userdata->jb = jb; userdata->from = g_strdup(from); jabber_caps_get_info(js, from, node, ver, ext, jabber_presence_set_capabilities, userdata); } diff -r 9467ae6096fd -r 369d68b5b4d4 libpurple/protocols/jabber/usermood.c --- a/libpurple/protocols/jabber/usermood.c Tue Apr 29 03:31:51 2008 +0000 +++ b/libpurple/protocols/jabber/usermood.c Thu May 01 03:06:17 2008 +0000 @@ -147,7 +147,7 @@ static void do_mood_set_from_fields(PurpleConnection *gc, PurpleRequestFields *fields) { JabberStream *js; - int max_mood_idx; + const int max_mood_idx = sizeof(moodstrings) / sizeof(moodstrings[0]) - 1; int selected_mood = purple_request_fields_get_choice(fields, "mood"); if (!PURPLE_CONNECTION_IS_VALID(gc)) { @@ -157,9 +157,6 @@ js = gc->proto_data; - /* This is ugly, but protects us from unexpected values. */ - for (max_mood_idx = 0; moodstrings[max_mood_idx]; max_mood_idx++); - if (selected_mood < 0 || selected_mood >= max_mood_idx) { purple_debug_error("jabber", "Invalid mood index (%d) selected.\n", selected_mood); return; diff -r 9467ae6096fd -r 369d68b5b4d4 libpurple/protocols/msn/error.c --- a/libpurple/protocols/msn/error.c Tue Apr 29 03:31:51 2008 +0000 +++ b/libpurple/protocols/msn/error.c Thu May 01 03:06:17 2008 +0000 @@ -56,7 +56,7 @@ g_snprintf(msg, sizeof(msg), _("Already logged in")); break; case 208: - g_snprintf(msg, sizeof(msg), _("Invalid screen name")); + g_snprintf(msg, sizeof(msg), _("Invalid username")); break; case 209: g_snprintf(msg, sizeof(msg), _("Invalid friendly name")); diff -r 9467ae6096fd -r 369d68b5b4d4 libpurple/protocols/msn/userlist.c --- a/libpurple/protocols/msn/userlist.c Tue Apr 29 03:31:51 2008 +0000 +++ b/libpurple/protocols/msn/userlist.c Thu May 01 03:06:17 2008 +0000 @@ -714,7 +714,7 @@ char *str = g_strdup_printf(_("Unable to add \"%s\"."), who); purple_notify_error(NULL, NULL, str, - _("The screen name specified is invalid.")); + _("The username specified is invalid.")); g_free(str); return; diff -r 9467ae6096fd -r 369d68b5b4d4 libpurple/protocols/msnp9/error.c --- a/libpurple/protocols/msnp9/error.c Tue Apr 29 03:31:51 2008 +0000 +++ b/libpurple/protocols/msnp9/error.c Thu May 01 03:06:17 2008 +0000 @@ -56,7 +56,7 @@ g_snprintf(msg, sizeof(msg), _("Already logged in")); break; case 208: - g_snprintf(msg, sizeof(msg), _("Invalid screen name")); + g_snprintf(msg, sizeof(msg), _("Invalid username")); break; case 209: g_snprintf(msg, sizeof(msg), _("Invalid friendly name")); diff -r 9467ae6096fd -r 369d68b5b4d4 libpurple/protocols/msnp9/userlist.c --- a/libpurple/protocols/msnp9/userlist.c Tue Apr 29 03:31:51 2008 +0000 +++ b/libpurple/protocols/msnp9/userlist.c Thu May 01 03:06:17 2008 +0000 @@ -652,7 +652,7 @@ { char *str = g_strdup_printf(_("Unable to add \"%s\"."), who); purple_notify_error(NULL, NULL, str, - _("The screen name specified is invalid.")); + _("The username specified is invalid.")); g_free(str); } diff -r 9467ae6096fd -r 369d68b5b4d4 libpurple/protocols/novell/nmuser.c --- a/libpurple/protocols/novell/nmuser.c Tue Apr 29 03:31:51 2008 +0000 +++ b/libpurple/protocols/novell/nmuser.c Thu May 01 03:06:17 2008 +0000 @@ -1919,10 +1919,10 @@ case NMERR_AUTHENTICATION_FAILED: case NMERR_CREDENTIALS_MISSING: - return _("Incorrect screen name or password"); + return _("Incorrect username or password"); case NMERR_HOST_NOT_FOUND: - return _("Could not recognize the host of the screen name you entered"); + return _("Could not recognize the host of the username you entered"); case NMERR_ACCESS_DENIED: return _("Your account has been disabled because too many incorrect passwords were entered"); @@ -1935,7 +1935,7 @@ return _("You have reached your limit for the number of contacts allowed"); case NMERR_OBJECT_NOT_FOUND: - return _("You have entered an incorrect screen name"); + return _("You have entered an incorrect username"); case NMERR_DIRECTORY_UPDATE: return _("An error occurred while updating the directory"); diff -r 9467ae6096fd -r 369d68b5b4d4 libpurple/protocols/oscar/misc.c --- a/libpurple/protocols/oscar/misc.c Tue Apr 29 03:31:51 2008 +0000 +++ b/libpurple/protocols/oscar/misc.c Thu May 01 03:06:17 2008 +0000 @@ -39,7 +39,6 @@ void aim_genericreq_n(OscarData *od, FlapConnection *conn, guint16 family, guint16 subtype) { - FlapFrame *frame; aim_snacid_t snacid = 0x00000000; flap_connection_send_snac(od, conn, family, subtype, 0x0000, snacid, NULL); @@ -48,7 +47,6 @@ void aim_genericreq_n_snacid(OscarData *od, FlapConnection *conn, guint16 family, guint16 subtype) { - FlapFrame *frame; aim_snacid_t snacid; snacid = aim_cachesnac(od, family, subtype, 0x0000, NULL, 0); diff -r 9467ae6096fd -r 369d68b5b4d4 libpurple/protocols/simple/simple.c --- a/libpurple/protocols/simple/simple.c Tue Apr 29 03:31:51 2008 +0000 +++ b/libpurple/protocols/simple/simple.c Thu May 01 03:06:17 2008 +0000 @@ -1890,7 +1890,7 @@ if (strpbrk(username, " \t\v\r\n") != NULL) { purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, - _("SIP screen names may not contain whitespaces or @ symbols")); + _("SIP usernames may not contain whitespaces or @ symbols")); return; } diff -r 9467ae6096fd -r 369d68b5b4d4 libpurple/protocols/toc/toc.c --- a/libpurple/protocols/toc/toc.c Tue Apr 29 03:31:51 2008 +0000 +++ b/libpurple/protocols/toc/toc.c Thu May 01 03:06:17 2008 +0000 @@ -546,7 +546,7 @@ g_snprintf(buf, sizeof(buf), _("Failure unknown: %s."), w); break; case 980: - g_snprintf(buf, sizeof(buf), _("Incorrect screen name or password.")); + g_snprintf(buf, sizeof(buf), _("Incorrect username or password.")); break; case 981: g_snprintf(buf, sizeof(buf), _("The service is temporarily unavailable.")); diff -r 9467ae6096fd -r 369d68b5b4d4 libpurple/protocols/yahoo/yahoo.c --- a/libpurple/protocols/yahoo/yahoo.c Tue Apr 29 03:31:51 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo.c Thu May 01 03:06:17 2008 +0000 @@ -2124,7 +2124,7 @@ switch (err) { case 3: - msg = g_strdup(_("Invalid screen name.")); + msg = g_strdup(_("Invalid username.")); reason = PURPLE_CONNECTION_ERROR_INVALID_USERNAME; break; case 13: diff -r 9467ae6096fd -r 369d68b5b4d4 libpurple/server.c --- a/libpurple/server.c Tue Apr 29 03:31:51 2008 +0000 +++ b/libpurple/server.c Thu May 01 03:06:17 2008 +0000 @@ -967,12 +967,6 @@ purple_signal_emit(purple_conversations_get_handle(), "chat-left", conv); } -void purple_serv_got_join_chat_failed(PurpleConnection *gc, const char *name) -{ - purple_signal_emit(purple_conversations_get_handle(), "chat-join-failed", - gc, name); -} - void serv_got_chat_in(PurpleConnection *g, int id, const char *who, PurpleMessageFlags flags, const char *message, time_t mtime) { diff -r 9467ae6096fd -r 369d68b5b4d4 libpurple/server.h --- a/libpurple/server.h Tue Apr 29 03:31:51 2008 +0000 +++ b/libpurple/server.h Thu May 01 03:06:17 2008 +0000 @@ -166,15 +166,6 @@ PurpleConversation *serv_got_joined_chat(PurpleConnection *gc, int id, const char *name); -/** - * Called by a prpl when an attempt to join a chat via serv_join_chat() - * fails. - * - * @param gc The connection on which chat joining failed - * @param name The name of the chat which we did not join - */ -void purple_serv_got_join_chat_failed(PurpleConnection *gc, const char *name); - void serv_got_chat_left(PurpleConnection *g, int id); void serv_got_chat_in(PurpleConnection *g, int id, const char *who, PurpleMessageFlags flags, const char *message, time_t mtime); diff -r 9467ae6096fd -r 369d68b5b4d4 pidgin/gtkaccount.c --- a/pidgin/gtkaccount.c Tue Apr 29 03:31:51 2008 +0000 +++ b/pidgin/gtkaccount.c Thu May 01 03:06:17 2008 +0000 @@ -408,7 +408,7 @@ g_object_set(G_OBJECT(dialog->screenname_entry), "truncate-multiline", TRUE, NULL); #endif - add_pref_box(dialog, vbox, _("Screen _name:"), dialog->screenname_entry); + add_pref_box(dialog, vbox, _("_Username:"), dialog->screenname_entry); g_signal_connect(G_OBJECT(dialog->screenname_entry), "changed", G_CALLBACK(screenname_changed_cb), dialog); @@ -496,10 +496,6 @@ dialog->password_box = add_pref_box(dialog, vbox, _("_Password:"), dialog->password_entry); - /* Alias */ - dialog->alias_entry = gtk_entry_new(); - add_pref_box(dialog, vbox, _("_Local alias:"), dialog->alias_entry); - /* Remember Password */ dialog->remember_pass_check = gtk_check_button_new_with_mnemonic(_("Remember pass_word")); @@ -571,6 +567,10 @@ gtk_container_add(GTK_CONTAINER(frame), vbox); gtk_widget_show(vbox); + /* Alias */ + dialog->alias_entry = gtk_entry_new(); + add_pref_box(dialog, vbox, _("_Local alias:"), dialog->alias_entry); + /* New mail notifications */ dialog->new_mail_check = gtk_check_button_new_with_mnemonic(_("New _mail notifications")); @@ -654,6 +654,7 @@ set_dialog_icon(dialog, NULL, 0, NULL); } +#if 0 if (!dialog->prpl_info || (!(dialog->prpl_info->options & OPT_PROTO_MAIL_CHECK) && (dialog->prpl_info->icon_spec.format == NULL))) { @@ -661,6 +662,7 @@ /* Nothing to see :( aww. */ gtk_widget_hide(dialog->user_frame); } +#endif } static void @@ -1911,7 +1913,7 @@ /* Screen Name column */ column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, _("Screen Name")); + gtk_tree_view_column_set_title(column, _("Username")); gtk_tree_view_insert_column(GTK_TREE_VIEW(treeview), column, -1); gtk_tree_view_column_set_resizable(column, TRUE); diff -r 9467ae6096fd -r 369d68b5b4d4 pidgin/gtkblist.c --- a/pidgin/gtkblist.c Tue Apr 29 03:31:51 2008 +0000 +++ b/pidgin/gtkblist.c Thu May 01 03:06:17 2008 +0000 @@ -614,6 +614,78 @@ pidgin_blist_refresh(list); } +static void +chat_components_edit_ok(PurpleChat *chat, PurpleRequestFields *allfields) +{ + GList *groups, *fields; + + for (groups = purple_request_fields_get_groups(allfields); groups; groups = groups->next) { + fields = purple_request_field_group_get_fields(groups->data); + for (; fields; fields = fields->next) { + PurpleRequestField *field = fields->data; + const char *id; + char *val; + + id = purple_request_field_get_id(field); + if (purple_request_field_get_type(field) == PURPLE_REQUEST_FIELD_INTEGER) + val = g_strdup_printf("%d", purple_request_field_int_get_value(field)); + else + val = g_strdup(purple_request_field_string_get_value(field)); + + if (!val) { + g_hash_table_remove(purple_chat_get_components(chat), id); + } else { + g_hash_table_replace(purple_chat_get_components(chat), g_strdup(id), val); /* val should not be free'd */ + } + } + } +} + +static void chat_components_edit(GtkWidget *w, PurpleBlistNode *node) +{ + PurpleRequestFields *fields = purple_request_fields_new(); + PurpleRequestFieldGroup *group = purple_request_field_group_new(NULL); + PurpleRequestField *field; + GList *parts, *iter; + struct proto_chat_entry *pce; + PurpleConnection *gc; + PurpleChat *chat = (PurpleChat*)node; + + purple_request_fields_add_group(fields, group); + + gc = purple_account_get_connection(purple_chat_get_account(chat)); + parts = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc))->chat_info(gc); + + for (iter = parts; iter; iter = iter->next) { + pce = iter->data; + if (pce->is_int) { + int val; + const char *str = g_hash_table_lookup(purple_chat_get_components(chat), pce->identifier); + if (!str || sscanf(str, "%d", &val) != 1) + val = pce->min; + field = purple_request_field_int_new(pce->identifier, pce->label, val); + } else { + field = purple_request_field_string_new(pce->identifier, pce->label, + g_hash_table_lookup(purple_chat_get_components(chat), pce->identifier), FALSE); + if (pce->secret) + purple_request_field_string_set_masked(field, TRUE); + } + + if (pce->required) + purple_request_field_set_required(field, TRUE); + + purple_request_field_group_add_field(group, field); + g_free(pce); + } + + g_list_free(parts); + + purple_request_fields(NULL, _("Edit Chat"), NULL, _("Please Update the necessary fields."), + fields, _("Edit"), G_CALLBACK(chat_components_edit_ok), _("Cancel"), NULL, + NULL, NULL, NULL, + chat); +} + static void gtk_blist_menu_alias_cb(GtkWidget *w, PurpleBlistNode *node) { GtkTreeIter iter; @@ -1510,6 +1582,8 @@ pidgin_separator(menu); + pidgin_new_item_from_stock(menu, _("_Edit Settings..."), NULL, + G_CALLBACK(chat_components_edit), node, 0, 0, NULL); pidgin_new_item_from_stock(menu, _("_Alias..."), PIDGIN_STOCK_ALIAS, G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL); pidgin_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE, @@ -3665,13 +3739,13 @@ } return text; } - else - if (hidden_conv) { - char *tmp = esc; - esc = g_strdup_printf("%s", esc); - g_free(tmp); - } - return esc; + else if (hidden_conv) + { + char *tmp = esc; + esc = g_strdup_printf("%s", esc); + g_free(tmp); + } + return esc; } prpl = purple_find_prpl(purple_account_get_protocol_id(b->account)); @@ -6393,7 +6467,7 @@ gtk_table_attach_defaults(GTK_TABLE(table), data->account_box, 0, 2, 0, 1); - label = gtk_label_new_with_mnemonic(_("Buddy's _screen name:")); + label = gtk_label_new_with_mnemonic(_("Buddy's _username:")); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2); diff -r 9467ae6096fd -r 369d68b5b4d4 pidgin/gtkdialogs.c --- a/pidgin/gtkdialogs.c Tue Apr 29 03:31:51 2008 +0000 +++ b/pidgin/gtkdialogs.c Thu May 01 03:06:17 2008 +0000 @@ -760,7 +760,7 @@ purple_request_fields(purple_get_blist(), _("New Instant Message"), NULL, - _("Please enter the screen name or alias of the person " + _("Please enter the username or alias of the person " "you would like to IM."), fields, _("OK"), G_CALLBACK(pidgin_dialogs_im_cb), @@ -899,7 +899,7 @@ purple_request_fields(purple_get_blist(), _("Get User Info"), NULL, - _("Please enter the screen name or alias of the person " + _("Please enter the username or alias of the person " "whose info you would like to view."), fields, _("OK"), G_CALLBACK(pidgin_dialogs_info_cb), @@ -991,7 +991,7 @@ purple_request_fields(purple_get_blist(), _("View User Log"), NULL, - _("Please enter the screen name or alias of the person " + _("Please enter the username or alias of the person " "whose log you would like to view."), fields, _("OK"), G_CALLBACK(pidgin_dialogs_log_cb), diff -r 9467ae6096fd -r 369d68b5b4d4 pidgin/gtkprefs.c --- a/pidgin/gtkprefs.c Tue Apr 29 03:31:51 2008 +0000 +++ b/pidgin/gtkprefs.c Thu May 01 03:06:17 2008 +0000 @@ -825,6 +825,107 @@ gtk_widget_set_sensitive(GTK_WIDGET(data), FALSE); } + +#define CONVERSATION_CLOSE_ACCEL_PATH "
/Conversation/Close" + +/* Filled in in keyboard_shortcuts(). */ +static GtkAccelKey ctrl_w = { 0, 0, 0 }; +static GtkAccelKey escape = { 0, 0, 0 }; + +static guint escape_closes_conversation_cb_id = 0; + +static gboolean +accel_is_escape(GtkAccelKey *k) +{ + return (k->accel_key == escape.accel_key + && k->accel_mods == escape.accel_mods); +} + +/* Update the tickybox in Preferences when the keybinding for Conversation -> + * Close is changed via Gtk. + */ +static void +conversation_close_accel_changed_cb (GtkAccelMap *object, + gchar *accel_path, + guint accel_key, + GdkModifierType accel_mods, + gpointer checkbox_) +{ + GtkToggleButton *checkbox = GTK_TOGGLE_BUTTON(checkbox_); + GtkAccelKey new = { accel_key, accel_mods, 0 }; + + g_signal_handler_block(checkbox, escape_closes_conversation_cb_id); + gtk_toggle_button_set_active(checkbox, accel_is_escape(&new)); + g_signal_handler_unblock(checkbox, escape_closes_conversation_cb_id); +} + + +static void +escape_closes_conversation_cb(GtkWidget *w, + gpointer unused) +{ + gboolean active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)); + gboolean changed; + GtkAccelKey *new_key = active ? &escape : &ctrl_w; + + changed = gtk_accel_map_change_entry(CONVERSATION_CLOSE_ACCEL_PATH, + new_key->accel_key, new_key->accel_mods, TRUE); + + /* If another path is already bound to the new accelerator, + * _change_entry tries to delete that binding (because it was passed + * replace=TRUE). If that other path is locked, then _change_entry + * will fail. We don't ever lock any accelerator paths, so this case + * should never arise. + */ + if(!changed) + purple_notify_warning (NULL, NULL, + _("IT'S A LION! GET IN THE CAR!"), NULL); + + /* TODO: create pidgin_accels_schedule_save */ + pidgin_save_accels_cb(NULL, 0, 0, NULL, NULL); +} + + +/* Creates preferences for keyboard shortcuts that it's hard to change with the + * standard Gtk accelerator-changing mechanism. + */ +static void +keyboard_shortcuts(GtkWidget *page) +{ + GtkWidget *vbox = pidgin_make_frame(page, _("Keyboard Shortcuts")); + GtkWidget *checkbox; + GtkAccelKey current = { 0, 0, 0 }; + GtkAccelMap *map = gtk_accel_map_get(); + + /* Maybe it would be better just to hardcode the values? + * -- resiak, 2007-04-30 + */ + if (ctrl_w.accel_key == 0) + { + gtk_accelerator_parse ("w", &(ctrl_w.accel_key), + &(ctrl_w.accel_mods)); + g_assert(ctrl_w.accel_key != 0); + + gtk_accelerator_parse ("Escape", &(escape.accel_key), + &(escape.accel_mods)); + g_assert(escape.accel_key != 0); + } + + checkbox = gtk_check_button_new_with_mnemonic( + _("Cl_ose conversations with the Escape key")); + gtk_accel_map_lookup_entry(CONVERSATION_CLOSE_ACCEL_PATH, ¤t); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox), + accel_is_escape(¤t)); + + escape_closes_conversation_cb_id = g_signal_connect(checkbox, + "clicked", G_CALLBACK(escape_closes_conversation_cb), NULL); + + g_signal_connect(map, "changed::" CONVERSATION_CLOSE_ACCEL_PATH, + G_CALLBACK(conversation_close_accel_changed_cb), checkbox); + + gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0); +} + static GtkWidget * interface_page(void) { @@ -904,6 +1005,10 @@ g_list_free(names); + + keyboard_shortcuts(ret); + + gtk_widget_show_all(ret); g_object_unref(sg); return ret; diff -r 9467ae6096fd -r 369d68b5b4d4 pidgin/gtkrequest.c --- a/pidgin/gtkrequest.c Tue Apr 29 03:31:51 2008 +0000 +++ b/pidgin/gtkrequest.c Thu May 01 03:06:17 2008 +0000 @@ -1120,6 +1120,16 @@ gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); gtk_widget_show(img); + /* Cancel button */ + button = pidgin_dialog_add_button(GTK_DIALOG(win), text_to_stock(cancel_text), G_CALLBACK(multifield_cancel_cb), data); + GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); + + /* OK button */ + button = pidgin_dialog_add_button(GTK_DIALOG(win), text_to_stock(ok_text), G_CALLBACK(multifield_ok_cb), data); + data->ok_button = button; + GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); + gtk_window_set_default(GTK_WINDOW(win), button); + /* Setup the vbox */ vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); @@ -1393,18 +1403,8 @@ g_object_unref(sg); - /* Cancel button */ - button = pidgin_dialog_add_button(GTK_DIALOG(win), text_to_stock(cancel_text), G_CALLBACK(multifield_cancel_cb), data); - GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); - - /* OK button */ - button = pidgin_dialog_add_button(GTK_DIALOG(win), text_to_stock(ok_text), G_CALLBACK(multifield_ok_cb), data); - data->ok_button = button; - GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); - gtk_window_set_default(GTK_WINDOW(win), button); - if (!purple_request_fields_all_required_filled(fields)) - gtk_widget_set_sensitive(button, FALSE); + gtk_widget_set_sensitive(data->ok_button, FALSE); pidgin_auto_parent_window(win); diff -r 9467ae6096fd -r 369d68b5b4d4 pidgin/gtksavedstatuses.c --- a/pidgin/gtksavedstatuses.c Tue Apr 29 03:31:51 2008 +0000 +++ b/pidgin/gtksavedstatuses.c Thu May 01 03:06:17 2008 +0000 @@ -968,7 +968,7 @@ /* Screen Name column */ column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_title(column, _("Screen Name")); + gtk_tree_view_column_set_title(column, _("Username")); gtk_tree_view_insert_column(GTK_TREE_VIEW(dialog->treeview), column, -1); gtk_tree_view_column_set_resizable(column, TRUE); diff -r 9467ae6096fd -r 369d68b5b4d4 pidgin/gtksound.c --- a/pidgin/gtksound.c Tue Apr 29 03:31:51 2008 +0000 +++ b/pidgin/gtksound.c Thu May 01 03:06:17 2008 +0000 @@ -70,7 +70,7 @@ {N_("Others talk in chat"), "chat_msg_recv", "receive.wav"}, /* this isn't a terminator, it's the buddy pounce default sound event ;-) */ {NULL, "pounce_default", "alert.wav"}, - {N_("Someone says your screen name in chat"), "nick_said", "alert.wav"} + {N_("Someone says your username in chat"), "nick_said", "alert.wav"} }; static gboolean diff -r 9467ae6096fd -r 369d68b5b4d4 pidgin/plugins/gevolution/new_person_dialog.c --- a/pidgin/plugins/gevolution/new_person_dialog.c Tue Apr 29 03:31:51 2008 +0000 +++ b/pidgin/plugins/gevolution/new_person_dialog.c Thu May 01 03:06:17 2008 +0000 @@ -267,7 +267,7 @@ } else { - label = gtk_label_new(_("Please enter the buddy's screen name and " + label = gtk_label_new(_("Please enter the buddy's username and " "account type below.")); } @@ -291,7 +291,7 @@ /* Screen Name */ dialog->screenname = gtk_entry_new(); - add_pref_box(sg, vbox, _("Screen name:"), dialog->screenname); + add_pref_box(sg, vbox, _("Username:"), dialog->screenname); if (username != NULL) gtk_entry_set_text(GTK_ENTRY(dialog->screenname), username); diff -r 9467ae6096fd -r 369d68b5b4d4 pidgin/plugins/notify.c --- a/pidgin/plugins/notify.c Tue Apr 29 03:31:51 2008 +0000 +++ b/pidgin/plugins/notify.c Thu May 01 03:06:17 2008 +0000 @@ -705,7 +705,7 @@ G_CALLBACK(type_toggle_cb), "type_chat"); ref = toggle; - toggle = gtk_check_button_new_with_mnemonic(_("\t_Only when someone says your screen name")); + toggle = gtk_check_button_new_with_mnemonic(_("\t_Only when someone says your username")); gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), purple_prefs_get_bool("/plugins/gtk/X11/notify/type_chat_nick"));