# HG changeset patch # User Evan Schoenberg # Date 1210558746 0 # Node ID d53f72735830adfe2a8a4808084b782f3e48a654 # Parent 67148f43fd2f7d1dd9d70d97f53587cee9b06140# Parent f714a7fa01f4dc5ef9aeec5ffdcf0f33c0a6f119 propagate from branch 'im.pidgin.pidgin' (head ba6112dabbb907fd5e93c30e0f5228e557949d69) to branch 'im.pidgin.pidgin.next.minor' (head f42c9025190a57ae55424302fd21d2b615a721a9) diff -r 67148f43fd2f -r d53f72735830 ChangeLog.API --- a/ChangeLog.API Mon May 12 02:03:13 2008 +0000 +++ b/ChangeLog.API Mon May 12 02:19:06 2008 +0000 @@ -1,6 +1,10 @@ Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul -version 2.x.x: +version 2.5.0: + libpurple: + Added: + * purple_serv_got_join_chat_failed + * chat-join-failed signal (see conversation-signals.dox) perl: Added: * Purple::Prefs::get_children_names. diff -r 67148f43fd2f -r d53f72735830 configure.ac --- a/configure.ac Mon May 12 02:03:13 2008 +0000 +++ b/configure.ac Mon May 12 02:19:06 2008 +0000 @@ -43,19 +43,19 @@ # # Make sure to update finch/libgnt/configure.ac with libgnt version changes. # -m4_define([purple_lt_current], [4]) +m4_define([purple_lt_current], [5]) m4_define([purple_major_version], [2]) -m4_define([purple_minor_version], [4]) -m4_define([purple_micro_version], [2]) +m4_define([purple_minor_version], [5]) +m4_define([purple_micro_version], [0]) 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], [4]) +m4_define([gnt_lt_current], [5]) m4_define([gnt_major_version], [2]) -m4_define([gnt_minor_version], [4]) -m4_define([gnt_micro_version], [2]) +m4_define([gnt_minor_version], [5]) +m4_define([gnt_micro_version], [0]) m4_define([gnt_version_suffix], [devel]) m4_define([gnt_version], [gnt_major_version.gnt_minor_version.gnt_micro_version]) diff -r 67148f43fd2f -r d53f72735830 doc/conversation-signals.dox --- a/doc/conversation-signals.dox Mon May 12 02:03:13 2008 +0000 +++ b/doc/conversation-signals.dox Mon May 12 02:19:06 2008 +0000 @@ -27,6 +27,7 @@ @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 @@ -302,6 +303,18 @@ @param new_arrival If the buddy is a new arrival. @endsignaldef + @signaldef chat-join-failed + @signalproto +void (*chat_join_failed)(PurpleConnection *gc, GHashTable *components); + @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 data The components passed to serv_join_chat() originally. + The hash function should be g_str_hash() and the equal + function should be g_str_equal(). + @endsignaldef + @signaldef chat-buddy-flags @signalproto void (*chat_buddy_flags)(PurpleConversation *conv, const char *name, diff -r 67148f43fd2f -r d53f72735830 libpurple/conversation.c --- a/libpurple/conversation.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/conversation.c Mon May 12 02:19:06 2008 +0000 @@ -2381,6 +2381,12 @@ 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_POINTER)); + purple_signal_register(handle, "chat-left", purple_marshal_VOID__POINTER, NULL, 1, purple_value_new(PURPLE_TYPE_SUBTYPE, diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/bonjour/bonjour.c --- a/libpurple/protocols/bonjour/bonjour.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/bonjour/bonjour.c Mon May 12 02:19:06 2008 +0000 @@ -487,6 +487,7 @@ NULL, NULL, NULL, + sizeof(PurplePluginProtocolInfo), /* struct_size */ NULL }; diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/gg/gg.c --- a/libpurple/protocols/gg/gg.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/gg/gg.c Mon May 12 02:19:06 2008 +0000 @@ -2152,6 +2152,7 @@ NULL, NULL, NULL, + sizeof(PurplePluginProtocolInfo), /* struct_size */ NULL }; /* }}} */ diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/irc/irc.c --- a/libpurple/protocols/irc/irc.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/irc/irc.c Mon May 12 02:19:06 2008 +0000 @@ -905,6 +905,7 @@ NULL, NULL, NULL, + sizeof(PurplePluginProtocolInfo), /* struct_size */ NULL }; diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/jabber/chat.c --- a/libpurple/protocols/jabber/chat.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/jabber/chat.c Mon May 12 02:19:06 2008 +0000 @@ -198,6 +198,12 @@ return chat_name; } +static void insert_in_hash_table(gpointer key, gpointer value, gpointer user_data) +{ + GHashTable *hash_table = (GHashTable *)user_data; + g_hash_table_insert(hash_table, g_strdup(key), g_strdup(value)); +} + void jabber_chat_join(PurpleConnection *gc, GHashTable *data) { JabberChat *chat; @@ -226,18 +232,21 @@ 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, data); 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, data); 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, data); g_free(buf); return; } @@ -256,6 +265,11 @@ chat->server = g_strdup(server); chat->handle = g_strdup(handle); + /* Copy the data hash table to chat->components */ + chat->components = g_hash_table_new_full(g_str_hash, g_str_equal, + g_free, g_free); + g_hash_table_foreach(data, insert_in_hash_table, chat->components); + chat->members = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, (GDestroyNotify)jabber_chat_member_free); @@ -316,6 +330,7 @@ g_free(chat->server); g_free(chat->handle); g_hash_table_destroy(chat->members); + g_hash_table_destroy(chat->components); g_free(chat); } diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/jabber/chat.h --- a/libpurple/protocols/jabber/chat.h Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/jabber/chat.h Mon May 12 02:19:06 2008 +0000 @@ -41,6 +41,7 @@ char *room; char *server; char *handle; + GHashTable *components; int id; PurpleConversation *conv; gboolean muc; diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/jabber/libxmpp.c --- a/libpurple/protocols/jabber/libxmpp.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/jabber/libxmpp.c Mon May 12 02:19:06 2008 +0000 @@ -116,7 +116,7 @@ jabber_send_attention, /* send_attention */ jabber_attention_types, /* attention_types */ - /* padding */ + sizeof(PurplePluginProtocolInfo), /* struct_size */ NULL }; diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/jabber/presence.c --- a/libpurple/protocols/jabber/presence.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/jabber/presence.c Mon May 12 02:19:06 2008 +0000 @@ -587,6 +587,7 @@ 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, chat->components); } purple_notify_error(js->gc, title, title, msg); g_free(title); diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/msn/msn.c --- a/libpurple/protocols/msn/msn.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/msn/msn.c Mon May 12 02:19:06 2008 +0000 @@ -132,6 +132,17 @@ return list; } +static GHashTable * +msn_get_account_text_table(PurpleAccount *unused) +{ + GHashTable *table; + + table = g_hash_table_new(g_str_hash, g_str_equal); + + g_hash_table_insert(table, "login_label", (gpointer)_("E-mail Address...")); + + return table; +} static PurpleCmdRet msn_cmd_nudge(PurpleConversation *conv, const gchar *cmd, gchar **args, gchar **error, void *data) @@ -2307,8 +2318,8 @@ msn_send_attention, /* send_attention */ msn_attention_types, /* attention_types */ - /* padding */ - NULL + sizeof(PurplePluginProtocolInfo), /* struct_size */ + msn_get_account_text_table, /* get_account_text_table */ }; static PurplePluginInfo info = diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/msnp9/msn.c --- a/libpurple/protocols/msnp9/msn.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/msnp9/msn.c Mon May 12 02:19:06 2008 +0000 @@ -133,6 +133,17 @@ return list; } +static GHashTable * +msn_get_account_text_table(PurpleAccount *unused) +{ + GHashTable *table; + + table = g_hash_table_new(g_str_hash, g_str_equal); + + g_hash_table_insert(table, "login_label", (gpointer)_("E-mail Address...")); + + return table; +} static PurpleCmdRet msn_cmd_nudge(PurpleConversation *conv, const gchar *cmd, gchar **args, gchar **error, void *data) @@ -2148,8 +2159,8 @@ msn_send_attention, /* send_attention */ msn_attention_types, /* attention_types */ - /* padding */ - NULL + sizeof(PurplePluginProtocolInfo), /* struct_size */ + msn_get_account_text_table, /* get_account_text_table */ }; static PurplePluginInfo info = diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/myspace/myspace.c --- a/libpurple/protocols/myspace/myspace.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/myspace/myspace.c Mon May 12 02:19:06 2008 +0000 @@ -2449,6 +2449,18 @@ return normalized; } +static GHashTable * +msim_get_account_text_table(PurpleAccount *unused) +{ + GHashTable *table; + + table = g_hash_table_new(g_str_hash, g_str_equal); + + g_hash_table_insert(table, "login_label", (gpointer)_("E-mail Address...")); + + return table; +} + /** Return whether the buddy can be messaged while offline. * * The protocol supports offline messages in just the same way as online @@ -3131,14 +3143,16 @@ NULL, /* unregister_user */ msim_send_attention, /* send_attention */ msim_attention_types, /* attention_types */ - NULL /* _purple_reserved4 */ + + sizeof(PurplePluginProtocolInfo), /* struct_size */ + msim_get_account_text_table, /* get_account_text_table */ }; /** Based on MSN's plugin info comments. */ static PurplePluginInfo info = { - PURPLE_PLUGIN_MAGIC, + PURPLE_PLUGIN_MAGIC, PURPLE_MAJOR_VERSION, PURPLE_MINOR_VERSION, PURPLE_PLUGIN_PROTOCOL, /**< type */ diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/novell/novell.c --- a/libpurple/protocols/novell/novell.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/novell/novell.c Mon May 12 02:19:06 2008 +0000 @@ -3517,6 +3517,7 @@ NULL, NULL, NULL, + sizeof(PurplePluginProtocolInfo), /* struct_size */ NULL }; diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/oscar/libaim.c --- a/libpurple/protocols/oscar/libaim.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/oscar/libaim.c Mon May 12 02:19:06 2008 +0000 @@ -96,7 +96,7 @@ NULL, /* send_attention */ NULL, /* get_attention_types */ - /* padding */ + sizeof(PurplePluginProtocolInfo), /* struct_size */ NULL }; diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/oscar/libicq.c --- a/libpurple/protocols/oscar/libicq.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/oscar/libicq.c Mon May 12 02:19:06 2008 +0000 @@ -96,7 +96,7 @@ NULL, /* send_attention */ NULL, /* get_attention_types */ - /* padding */ + sizeof(PurplePluginProtocolInfo), /* struct_size */ NULL }; diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/qq/qq.c --- a/libpurple/protocols/qq/qq.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/qq/qq.c Mon May 12 02:19:06 2008 +0000 @@ -706,6 +706,7 @@ NULL, NULL, NULL, + sizeof(PurplePluginProtocolInfo), /* struct_size */ NULL }; diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/silc/silc.c --- a/libpurple/protocols/silc/silc.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/silc/silc.c Mon May 12 02:19:06 2008 +0000 @@ -2071,6 +2071,7 @@ NULL, NULL, NULL, + sizeof(PurplePluginProtocolInfo), /* struct_size */ NULL }; diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/silc10/silc.c --- a/libpurple/protocols/silc10/silc.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/silc10/silc.c Mon May 12 02:19:06 2008 +0000 @@ -1800,10 +1800,10 @@ NULL, /* send_raw */ NULL, /* roomlist_room_serialize */ - /* padding */ NULL, NULL, NULL, + sizeof(PurplePluginProtocolInfo), /* struct_size */ NULL }; diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/simple/simple.c --- a/libpurple/protocols/simple/simple.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/simple/simple.c Mon May 12 02:19:06 2008 +0000 @@ -2052,6 +2052,7 @@ NULL, NULL, NULL, + sizeof(PurplePluginProtocolInfo), /* struct_size */ NULL }; diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/yahoo/yahoo.c --- a/libpurple/protocols/yahoo/yahoo.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo.c Mon May 12 02:19:06 2008 +0000 @@ -4383,7 +4383,7 @@ yahoo_send_attention, yahoo_attention_types, - /* padding */ + sizeof(PurplePluginProtocolInfo), /* struct_size */ NULL }; diff -r 67148f43fd2f -r d53f72735830 libpurple/protocols/zephyr/zephyr.c --- a/libpurple/protocols/zephyr/zephyr.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/protocols/zephyr/zephyr.c Mon May 12 02:19:06 2008 +0000 @@ -2907,10 +2907,10 @@ NULL, /* send_raw */ NULL, /* roomlist_room_serialize */ - /* padding */ NULL, NULL, NULL, + sizeof(PurplePluginProtocolInfo), /* struct_size */ NULL }; diff -r 67148f43fd2f -r d53f72735830 libpurple/prpl.h --- a/libpurple/prpl.h Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/prpl.h Mon May 12 02:19:06 2008 +0000 @@ -399,9 +399,45 @@ gboolean (*send_attention)(PurpleConnection *gc, const char *username, guint type); GList *(*get_attention_types)(PurpleAccount *acct); - void (*_purple_reserved4)(void); + /** + * The size of the PurplePluginProtocolInfo. This should always be sizeof(PurplePluginProtocolInfo). + * This allows adding more functions to this struct without requiring a major version bump. + */ + unsigned long struct_size; + + /* NOTE: + * If more functions are added, they should accessed using the following syntax: + * + * if (PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl, new_function)) + * prpl->new_function(...); + * + * instead of + * + * if (prpl->new_function != NULL) + * prpl->new_function(...); + * + * The PURPLE_PROTOCOL_PLUGIN_HAS_FUNC macro can be used for the older member + * functions (e.g. login, send_im etc.) too. + */ + + /** This allows protocols to specify additional strings to be used for + * various purposes. The idea is to stuff a bunch of strings in this hash + * table instead of expanding the struct for every addition. This hash + * table is allocated every call and MUST be unrefed by the caller. + * + * @param account The account to specify. This can be NULL. + * @return The protocol's string hash table. The hash table should be + * destroyed by the caller when it's no longer needed. + */ + GHashTable *(*get_account_text_table)(PurpleAccount *account); }; +#define PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl, member) \ + (((G_STRUCT_OFFSET(PurplePluginProtocolInfo, member) < G_STRUCT_OFFSET(PurplePluginProtocolInfo, struct_size)) \ + || (G_STRUCT_OFFSET(PurplePluginProtocolInfo, member) < prpl->struct_size)) && \ + prpl->member != NULL) + + #define PURPLE_IS_PROTOCOL_PLUGIN(plugin) \ ((plugin)->info->type == PURPLE_PLUGIN_PROTOCOL) diff -r 67148f43fd2f -r d53f72735830 libpurple/server.c --- a/libpurple/server.c Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/server.c Mon May 12 02:19:06 2008 +0000 @@ -967,6 +967,12 @@ purple_signal_emit(purple_conversations_get_handle(), "chat-left", conv); } +void purple_serv_got_join_chat_failed(PurpleConnection *gc, GHashTable *data) +{ + purple_signal_emit(purple_conversations_get_handle(), "chat-join-failed", + gc, data); +} + void serv_got_chat_in(PurpleConnection *g, int id, const char *who, PurpleMessageFlags flags, const char *message, time_t mtime) { diff -r 67148f43fd2f -r d53f72735830 libpurple/server.h --- a/libpurple/server.h Mon May 12 02:03:13 2008 +0000 +++ b/libpurple/server.h Mon May 12 02:19:06 2008 +0000 @@ -166,6 +166,17 @@ 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 data The components passed to serv_join_chat() originally. + * The hash function should be g_str_hash() and the equal + * function should be g_str_equal(). + */ +void purple_serv_got_join_chat_failed(PurpleConnection *gc, GHashTable *data); + 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 67148f43fd2f -r d53f72735830 pidgin/gtkaccount.c --- a/pidgin/gtkaccount.c Mon May 12 02:03:13 2008 +0000 +++ b/pidgin/gtkaccount.c Mon May 12 02:19:06 2008 +0000 @@ -255,6 +255,25 @@ } } +static gboolean +screenname_focus_cb(GtkWidget *widget, GdkEventFocus *event, AccountPrefsDialog *dialog) +{ + GHashTable *table; + const char *label; + + table = dialog->prpl_info->get_account_text_table(NULL); + label = g_hash_table_lookup(table, "login_label"); + + if(!strcmp(gtk_entry_get_text(GTK_ENTRY(widget)), label)) { + gtk_entry_set_text(GTK_ENTRY(widget), ""); + gtk_widget_modify_text(widget, GTK_STATE_NORMAL,NULL); + } + + g_hash_table_destroy(table); + + return FALSE; +} + static void screenname_changed_cb(GtkEntry *entry, AccountPrefsDialog *dialog) { @@ -270,6 +289,32 @@ } } +static gboolean +screenname_nofocus_cb(GtkWidget *widget, GdkEventFocus *event, AccountPrefsDialog *dialog) +{ + GdkColor color = {0, 34952, 35466, 34181}; + GHashTable *table; + const char *label; + + table = dialog->prpl_info->get_account_text_table(NULL); + label = g_hash_table_lookup(table, "login_label"); + + if (*gtk_entry_get_text(GTK_ENTRY(widget)) == '\0') { + /* We have to avoid hitting the screenname_changed_cb function + * because it enables buttons we don't want enabled yet ;) + */ + g_signal_handlers_block_by_func(widget, G_CALLBACK(screenname_changed_cb), dialog); + gtk_entry_set_text(GTK_ENTRY(widget), label); + /* Make sure we can hit it again */ + g_signal_handlers_unblock_by_func(widget, G_CALLBACK(screenname_changed_cb), dialog); + gtk_widget_modify_text(widget, GTK_STATE_NORMAL, &color); + } + + g_hash_table_destroy(table); + + return FALSE; +} + static void icon_filesel_choose_cb(const char *filename, gpointer data) { @@ -410,6 +455,25 @@ add_pref_box(dialog, vbox, _("_Username:"), dialog->screenname_entry); + if (dialog->account != NULL) + username = g_strdup(purple_account_get_username(dialog->account)); + + if (!username && PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(dialog->prpl_info, get_account_text_table)) { + GdkColor color = {0, 34952, 35466, 34181}; + GHashTable *table; + const char *label; + table = dialog->prpl_info->get_account_text_table(NULL); + label = g_hash_table_lookup(table, "login_label"); + + gtk_entry_set_text(GTK_ENTRY(dialog->screenname_entry), label); + g_signal_connect(G_OBJECT(dialog->screenname_entry), "focus-in-event", + G_CALLBACK(screenname_focus_cb), dialog); + g_signal_connect(G_OBJECT(dialog->screenname_entry), "focus-out-event", + G_CALLBACK(screenname_nofocus_cb), dialog); + gtk_widget_modify_text(dialog->screenname_entry, GTK_STATE_NORMAL, &color); + g_hash_table_destroy(table); + } + g_signal_connect(G_OBJECT(dialog->screenname_entry), "changed", G_CALLBACK(screenname_changed_cb), dialog); @@ -419,9 +483,6 @@ else user_splits = dialog->prpl_info->user_splits; - if (dialog->account != NULL) - username = g_strdup(purple_account_get_username(dialog->account)); - if (dialog->user_split_entries != NULL) { g_list_free(dialog->user_split_entries); dialog->user_split_entries = NULL; @@ -1513,6 +1574,8 @@ /* Show the window. */ gtk_widget_show(win); + if (!account) + gtk_widget_grab_focus(dialog->protocol_menu); } /**************************************************************************