# HG changeset patch # User William Ehlhardt # Date 1180310174 0 # Node ID 5ba545dfe2d660276996b5c14ce45548d276a944 # Parent 34bf1a607d51080b6d5becd958f4d3c2e78ebf9c# Parent 0f65c1856f551c15a95006631827361ee0b12195 propagate from branch 'im.pidgin.pidgin' (head 667956be4f81c42d9061470e5111d09a1516db33) to branch 'im.pidgin.soc.2007.certmgr' (head 4ed26aa0a5a9d2ba90ba39db45c423a1d5c1489c) diff -r 34bf1a607d51 -r 5ba545dfe2d6 ChangeLog --- a/ChangeLog Fri May 25 22:34:16 2007 +0000 +++ b/ChangeLog Sun May 27 23:56:14 2007 +0000 @@ -1,5 +1,10 @@ Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul +version 2.0.2 (??/??/????): + + Finch: + * Auto account reconnecting + version 2.0.1 (05/24/2007): * Buddy list update speedups when buddy icons are not being displayed. (Scott Wolchok) diff -r 34bf1a607d51 -r 5ba545dfe2d6 finch/gntaccount.c --- a/finch/gntaccount.c Fri May 25 22:34:16 2007 +0000 +++ b/finch/gntaccount.c Sun May 27 23:56:14 2007 +0000 @@ -717,6 +717,15 @@ gnt_tree_remove(GNT_TREE(accounts.tree), account); } +static void +account_abled_cb(PurpleAccount *account, gpointer user_data) +{ + if (accounts.window == NULL) + return; + gnt_tree_set_choice(GNT_TREE(accounts.tree), account, + GPOINTER_TO_INT(user_data)); +} + void finch_accounts_init() { GList *iter; @@ -727,7 +736,13 @@ purple_signal_connect(purple_accounts_get_handle(), "account-removed", finch_accounts_get_handle(), PURPLE_CALLBACK(account_removed_callback), NULL); - + purple_signal_connect(purple_accounts_get_handle(), "account-disabled", + finch_accounts_get_handle(), + PURPLE_CALLBACK(account_abled_cb), GINT_TO_POINTER(FALSE)); + purple_signal_connect(purple_accounts_get_handle(), "account-enabled", + finch_accounts_get_handle(), + PURPLE_CALLBACK(account_abled_cb), GINT_TO_POINTER(TRUE)); + for (iter = purple_accounts_get_all(); iter; iter = iter->next) { if (purple_account_get_enabled(iter->data, FINCH_UI)) break; diff -r 34bf1a607d51 -r 5ba545dfe2d6 finch/gntconn.c --- a/finch/gntconn.c Fri May 25 22:34:16 2007 +0000 +++ b/finch/gntconn.c Sun May 27 23:56:14 2007 +0000 @@ -24,34 +24,116 @@ */ #include "account.h" #include "core.h" +#include "connection.c" +#include "debug.h" #include "request.h" #include "gntconn.h" #include "finch.h" +#define INITIAL_RECON_DELAY_MIN 8000 +#define INITIAL_RECON_DELAY_MAX 60000 + +#define MAX_RECON_DELAY 600000 + +typedef struct { + int delay; + guint timeout; +} FinchAutoRecon; + +/** + * Contains accounts that are auto-reconnecting. + * The key is a pointer to the PurpleAccount and the + * value is a pointer to a FinchAutoRecon. + */ +static GHashTable *hash = NULL; + +static void +free_auto_recon(gpointer data) +{ + FinchAutoRecon *info = data; + + if (info->timeout != 0) + g_source_remove(info->timeout); + + g_free(info); +} + + +static gboolean +do_signon(gpointer data) +{ + PurpleAccount *account = data; + FinchAutoRecon *info; + PurpleStatus *status; + + purple_debug_info("autorecon", "do_signon called\n"); + g_return_val_if_fail(account != NULL, FALSE); + info = g_hash_table_lookup(hash, account); + + if (info) + info->timeout = 0; + + status = purple_account_get_active_status(account); + if (purple_status_is_online(status)) + { + purple_debug_info("autorecon", "calling purple_account_connect\n"); + purple_account_connect(account); + purple_debug_info("autorecon", "done calling purple_account_connect\n"); + } + + return FALSE; +} + static void finch_connection_report_disconnect(PurpleConnection *gc, const char *text) { - char *act, *primary, *secondary; + FinchAutoRecon *info; PurpleAccount *account = purple_connection_get_account(gc); - act = g_strdup_printf(_("%s (%s)"), purple_account_get_username(account), - purple_account_get_protocol_name(account)); + info = g_hash_table_lookup(hash, account); - primary = g_strdup_printf(_("%s disconnected."), act); - secondary = g_strdup_printf(_("%s was disconnected due to the following error:\n%s"), - act, text); + if (!gc->wants_to_die) { + if (info == NULL) { + info = g_new0(FinchAutoRecon, 1); + g_hash_table_insert(hash, account, info); + info->delay = g_random_int_range(INITIAL_RECON_DELAY_MIN, INITIAL_RECON_DELAY_MAX); + } else { + info->delay = MIN(2 * info->delay, MAX_RECON_DELAY); + if (info->timeout != 0) + g_source_remove(info->timeout); + } + info->timeout = g_timeout_add(info->delay, do_signon, account); + } else { + char *act, *primary, *secondary; + act = g_strdup_printf(_("%s (%s)"), purple_account_get_username(account), + purple_account_get_protocol_name(account)); - purple_request_action(account, _("Connection Error"), primary, secondary, 1, - account, NULL, NULL, - account, 2, - _("OK"), NULL, - _("Connect"), - PURPLE_CALLBACK(purple_account_connect)); + primary = g_strdup_printf(_("%s disconnected."), act); + secondary = g_strdup_printf(_("%s\n\n" + "Finch will not attempt to reconnect the account until you " + "correct the error and re-enable the account."), text); + purple_notify_error(NULL, NULL, primary, secondary); + + g_free(act); + g_free(primary); + g_free(secondary); + purple_account_set_enabled(account, FINCH_UI, FALSE); + } +} - g_free(act); - g_free(primary); - g_free(secondary); +static void +account_removed_cb(PurpleAccount *account, gpointer user_data) +{ + g_hash_table_remove(hash, account); +} + +static void * +finch_connection_get_handle(void) +{ + static int handle; + + return &handle; } static PurpleConnectionUiOps ops = @@ -75,8 +157,18 @@ } void finch_connections_init() -{} +{ + hash = g_hash_table_new_full( + g_direct_hash, g_direct_equal, + NULL, free_auto_recon); + + purple_signal_connect(purple_accounts_get_handle(), "account-removed", + finch_connection_get_handle(), + PURPLE_CALLBACK(account_removed_cb), NULL); +} void finch_connections_uninit() -{} - +{ + purple_signals_disconnect_by_handle(finch_connection_get_handle()); + g_hash_table_destroy(hash); +} diff -r 34bf1a607d51 -r 5ba545dfe2d6 libpurple/protocols/msn/notification.c --- a/libpurple/protocols/msn/notification.c Fri May 25 22:34:16 2007 +0000 +++ b/libpurple/protocols/msn/notification.c Sun May 27 23:56:14 2007 +0000 @@ -901,6 +901,7 @@ syn_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { MsnSession *session; + MsnSync *sync; int total_users; session = cmdproc->session; @@ -919,22 +920,12 @@ total_users = atoi(cmd->params[2]); - if (total_users == 0) - { - msn_session_finish_login(session); - } - else - { - /* syn_table */ - MsnSync *sync; + sync = msn_sync_new(session); + sync->total_users = total_users; + sync->old_cbs_table = cmdproc->cbs_table; - sync = msn_sync_new(session); - sync->total_users = total_users; - sync->old_cbs_table = cmdproc->cbs_table; - - session->sync = sync; - cmdproc->cbs_table = sync->cbs_table; - } + session->sync = sync; + cmdproc->cbs_table = sync->cbs_table; } /************************************************************************** diff -r 34bf1a607d51 -r 5ba545dfe2d6 libpurple/protocols/msn/sync.c --- a/libpurple/protocols/msn/sync.c Fri May 25 22:34:16 2007 +0000 +++ b/libpurple/protocols/msn/sync.c Sun May 27 23:56:14 2007 +0000 @@ -99,8 +99,19 @@ /* HACK */ if (group_id == 0) + { /* Group of ungroupped buddies */ + if (session->sync->total_users == 0) + { + cmdproc->cbs_table = session->sync->old_cbs_table; + + msn_session_finish_login(session); + + msn_sync_destroy(session->sync); + session->sync = NULL; + } return; + } if ((purple_find_group(name)) == NULL) { diff -r 34bf1a607d51 -r 5ba545dfe2d6 libpurple/purple-remote --- a/libpurple/purple-remote Fri May 25 22:34:16 2007 +0000 +++ b/libpurple/purple-remote Sun May 27 23:56:14 2007 +0000 @@ -94,7 +94,7 @@ def execute(uri): match = re.match(urlregexp, uri) protocol = match.group(2) - if protocol == "xmpp" + if protocol == "xmpp": protocol = "jabber" if protocol == "aim" or protocol == "icq": protocol = "oscar" diff -r 34bf1a607d51 -r 5ba545dfe2d6 pidgin/gtkblist.c --- a/pidgin/gtkblist.c Fri May 25 22:34:16 2007 +0000 +++ b/pidgin/gtkblist.c Sun May 27 23:56:14 2007 +0000 @@ -5781,6 +5781,8 @@ gtk_box_pack_end(GTK_BOX(rowbox), data->alias_entry, TRUE, TRUE, 0); gtk_entry_set_activates_default(GTK_ENTRY(data->alias_entry), TRUE); pidgin_set_accessible_label (data->alias_entry, label); + if (name != NULL) + gtk_widget_grab_focus(data->alias_entry); rowbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), rowbox, FALSE, FALSE, 0); diff -r 34bf1a607d51 -r 5ba545dfe2d6 pidgin/gtkconv.c --- a/pidgin/gtkconv.c Fri May 25 22:34:16 2007 +0000 +++ b/pidgin/gtkconv.c Sun May 27 23:56:14 2007 +0000 @@ -7919,7 +7919,9 @@ entry = gtk_entry_new(); gtk_entry_set_has_frame(GTK_ENTRY(entry), FALSE); gtk_entry_set_width_chars(GTK_ENTRY(entry), 10); +#if GTK_CHECK_VERSION(2,4,0) gtk_entry_set_alignment(GTK_ENTRY(entry), 0.5); +#endif gtk_box_pack_start(GTK_BOX(gtkconv->tabby), entry, TRUE, TRUE, 0); /* after the tab label */ @@ -8326,7 +8328,9 @@ } ebox = gtk_event_box_new(); +#if GTK_CHECK_VERSION(2,4,0) gtk_event_box_set_visible_window(GTK_EVENT_BOX(ebox), FALSE); +#endif gtk_container_add(GTK_CONTAINER(ebox), gtkconv->tabby); g_signal_connect(G_OBJECT(ebox), "button-press-event", G_CALLBACK(alias_double_click_cb), gtkconv); diff -r 34bf1a607d51 -r 5ba545dfe2d6 pidgin/gtkimhtml.c --- a/pidgin/gtkimhtml.c Fri May 25 22:34:16 2007 +0000 +++ b/pidgin/gtkimhtml.c Sun May 27 23:56:14 2007 +0000 @@ -4432,7 +4432,9 @@ if (imhtml_smiley && imhtml_smiley->flags & GTK_IMHTML_SMILEY_CUSTOM) { ebox = gtk_event_box_new(); +#if GTK_CHECK_VERSION(2,4,0) gtk_event_box_set_visible_window(GTK_EVENT_BOX(ebox), FALSE); +#endif gtk_widget_show(ebox); } diff -r 34bf1a607d51 -r 5ba545dfe2d6 pidgin/gtkimhtmltoolbar.c --- a/pidgin/gtkimhtmltoolbar.c Fri May 25 22:34:16 2007 +0000 +++ b/pidgin/gtkimhtmltoolbar.c Sun May 27 23:56:14 2007 +0000 @@ -71,7 +71,9 @@ do_small(GtkWidget *smalltb, GtkIMHtmlToolbar *toolbar) { g_return_if_fail(toolbar != NULL); - gtk_imhtml_font_shrink(GTK_IMHTML(toolbar->imhtml)); + /* Only shrink the font on activation, not deactivation as well */ + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(smalltb))) + gtk_imhtml_font_shrink(GTK_IMHTML(toolbar->imhtml)); gtk_widget_grab_focus(toolbar->imhtml); } @@ -79,7 +81,9 @@ do_big(GtkWidget *large, GtkIMHtmlToolbar *toolbar) { g_return_if_fail(toolbar); - gtk_imhtml_font_grow(GTK_IMHTML(toolbar->imhtml)); + /* Only grow the font on activation, not deactivation as well */ + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(large))) + gtk_imhtml_font_grow(GTK_IMHTML(toolbar->imhtml)); gtk_widget_grab_focus(toolbar->imhtml); }