# HG changeset patch # User Yoshiki Yazawa # Date 1180332543 0 # Node ID 08e95637208f77c280840de1a5c3aa8a07c7fb72 # Parent b6b4eccc73098d35fda523bafab46536fa700532# Parent 58a286e231b736101e8cea21afdd86257d6da90d propagate from branch 'im.pidgin.pidgin' (head c7b6cd0e58a3953905afdaea801171859d00de1a) to branch 'im.pidgin.pidgin.yaz' (head 2c3ba35fd55df6c963aad5e3c33cfa6407e45f45) diff -r b6b4eccc7309 -r 08e95637208f ChangeLog --- a/ChangeLog Sat May 26 13:57:03 2007 +0000 +++ b/ChangeLog Mon May 28 06:09:03 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 b6b4eccc7309 -r 08e95637208f finch/gntaccount.c --- a/finch/gntaccount.c Sat May 26 13:57:03 2007 +0000 +++ b/finch/gntaccount.c Mon May 28 06:09:03 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 b6b4eccc7309 -r 08e95637208f finch/gntconn.c --- a/finch/gntconn.c Sat May 26 13:57:03 2007 +0000 +++ b/finch/gntconn.c Mon May 28 06:09:03 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 b6b4eccc7309 -r 08e95637208f libpurple/protocols/msn/notification.c --- a/libpurple/protocols/msn/notification.c Sat May 26 13:57:03 2007 +0000 +++ b/libpurple/protocols/msn/notification.c Mon May 28 06:09:03 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 b6b4eccc7309 -r 08e95637208f libpurple/protocols/msn/sync.c --- a/libpurple/protocols/msn/sync.c Sat May 26 13:57:03 2007 +0000 +++ b/libpurple/protocols/msn/sync.c Mon May 28 06:09:03 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 b6b4eccc7309 -r 08e95637208f libpurple/purple-remote --- a/libpurple/purple-remote Sat May 26 13:57:03 2007 +0000 +++ b/libpurple/purple-remote Mon May 28 06:09:03 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 b6b4eccc7309 -r 08e95637208f pidgin.spec.in --- a/pidgin.spec.in Sat May 26 13:57:03 2007 +0000 +++ b/pidgin.spec.in Mon May 28 06:09:03 2007 +0000 @@ -95,6 +95,7 @@ Obsoletes: gaim-gadugadu Obsoletes: pidgin-tcl < 2.0.0 Obsoletes: pidgin-silc < 2.0.0 +%{?_with_sasl:Requires: cyrus-sasl-plain, cyrus-sasl-md5} %package -n libpurple-devel Summary: Development headers, documentation, and libraries for libpurple @@ -449,6 +450,9 @@ %endif %changelog +* Sun May 27 2007 Stu Tomlinson +- add cyrus-sasl-plain & cyrus-sasl-md5 to Requires + * Thu May 24 2007 Stu Tomlinson - Silence errors from gtk-update-icon-cache - Change Mandriva build dependencies to reflect the correct (lower case) diff -r b6b4eccc7309 -r 08e95637208f pidgin/gtkblist.c --- a/pidgin/gtkblist.c Sat May 26 13:57:03 2007 +0000 +++ b/pidgin/gtkblist.c Mon May 28 06:09:03 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 b6b4eccc7309 -r 08e95637208f pidgin/gtkconv.c --- a/pidgin/gtkconv.c Sat May 26 13:57:03 2007 +0000 +++ b/pidgin/gtkconv.c Mon May 28 06:09:03 2007 +0000 @@ -7948,7 +7948,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 */ @@ -8355,7 +8357,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 b6b4eccc7309 -r 08e95637208f pidgin/gtkimhtml.c --- a/pidgin/gtkimhtml.c Sat May 26 13:57:03 2007 +0000 +++ b/pidgin/gtkimhtml.c Mon May 28 06:09:03 2007 +0000 @@ -4440,7 +4440,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 b6b4eccc7309 -r 08e95637208f pidgin/gtkimhtmltoolbar.c --- a/pidgin/gtkimhtmltoolbar.c Sat May 26 13:57:03 2007 +0000 +++ b/pidgin/gtkimhtmltoolbar.c Mon May 28 06:09:03 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); }