# HG changeset patch # User Richard Laager # Date 1271630341 0 # Node ID 378cceb9131d3d0e6b54763e75f297cebd70bdc4 # Parent e59f29a9dbf18a6ad0c248018a3980ad0638939d Add an autojoin connection signal UIs should use this so plugins can delay autojoining by blocking this signal and re-emitting it later. For example, IRC Helper now delays autojoins until after it has identified with NickServ/AuthServ/etc. diff -r e59f29a9dbf1 -r 378cceb9131d doc/connection-signals.dox --- a/doc/connection-signals.dox Sat Apr 17 22:22:52 2010 +0000 +++ b/doc/connection-signals.dox Sun Apr 18 22:39:01 2010 +0000 @@ -3,6 +3,7 @@ @signals @signal signing-on @signal signed-on + @signal autojoin @signal signing-off @signal signed-off @signal connection-error @@ -30,6 +31,21 @@ @param gc The connection that has signed on. @endsignaldef + @signaldef autojoin + @signalproto +gboolean (*autojoin)(PurpleConnection *gc); + @endsignalproto + @signaldesc + Emitted when a connection has signed on, after the signed-on signal, to + signal UIs to autojoin chats if they wish. UIs should connect to this + with @c PURPLE_SIGNAL_PRIORITY_HIGHEST to allow plugins to block this + signal before the UI sees it and then re-emit it later. + @param gc The connection that has signed on. + @return @c TRUE if the signal was handled or @c FALSE otherwise. In + practice, the return value is irrelevant, as it really only + exists so plugins can block the UI's autojoin. + @endsignaldef + @signaldef signing-off @signalproto void (*signing_off)(PurpleConnection *gc); diff -r e59f29a9dbf1 -r 378cceb9131d finch/gntblist.c --- a/finch/gntblist.c Sat Apr 17 22:22:52 2010 +0000 +++ b/finch/gntblist.c Sun Apr 18 22:39:01 2010 +0000 @@ -144,7 +144,7 @@ static void blist_show(PurpleBuddyList *list); static void update_node_display(PurpleBlistNode *buddy, FinchBlist *ggblist); static void update_buddy_display(PurpleBuddy *buddy, FinchBlist *ggblist); -static void account_signed_on_cb(PurpleConnection *pc, gpointer null); +static gboolean account_autojoin_cb(PurpleConnection *pc, gpointer null); static void finch_request_add_buddy(PurpleAccount *account, const char *username, const char *grp, const char *alias); static void menu_group_set_cb(GntMenuItem *item, gpointer null); @@ -2213,8 +2213,10 @@ purple_prefs_connect_callback(finch_blist_get_handle(), PREF_ROOT "/grouping", redraw_blist, NULL); - purple_signal_connect(purple_connections_get_handle(), "signed-on", purple_blist_get_handle(), - G_CALLBACK(account_signed_on_cb), NULL); + purple_signal_connect_priority(purple_connections_get_handle(), + "autojoin", purple_blist_get_handle(), + G_CALLBACK(account_autojoin_cb), NULL, + PURPLE_SIGNAL_PRIORITY_HIGHEST); finch_blist_install_manager(&default_manager); @@ -2684,10 +2686,11 @@ return FALSE; } -static void -account_signed_on_cb(PurpleConnection *gc, gpointer null) +static gboolean +account_autojoin_cb(PurpleConnection *gc, gpointer null) { g_idle_add(auto_join_chats, gc); + return TRUE; } static void toggle_pref_cb(GntMenuItem *item, gpointer n) diff -r e59f29a9dbf1 -r 378cceb9131d libpurple/connection.c --- a/libpurple/connection.c Sat Apr 17 22:22:52 2010 +0000 +++ b/libpurple/connection.c Sun Apr 18 22:39:01 2010 +0000 @@ -372,6 +372,7 @@ purple_blist_add_account(account); purple_signal_emit(purple_connections_get_handle(), "signed-on", gc); + purple_signal_emit_return_1(purple_connections_get_handle(), "autojoin", gc); serv_set_permit_deny(gc); @@ -715,6 +716,11 @@ purple_value_new(PURPLE_TYPE_ENUM), purple_value_new(PURPLE_TYPE_STRING)); + purple_signal_register(handle, "autojoin", + purple_marshal_BOOLEAN__POINTER, NULL, 1, + purple_value_new(PURPLE_TYPE_SUBTYPE, + PURPLE_SUBTYPE_CONNECTION)); + } void diff -r e59f29a9dbf1 -r 378cceb9131d pidgin/gtkblist.c --- a/pidgin/gtkblist.c Sat Apr 17 22:22:52 2010 +0000 +++ b/pidgin/gtkblist.c Sun Apr 18 22:39:01 2010 +0000 @@ -7461,7 +7461,7 @@ return gtkblist; } -static void account_signon_cb(PurpleConnection *gc, gpointer z) +static gboolean autojoin_cb(PurpleConnection *gc, gpointer data) { PurpleAccount *account = purple_connection_get_account(gc); PurpleBlistNode *gnode, *cnode; @@ -7487,6 +7487,9 @@ serv_join_chat(gc, chat->components); } } + + /* Stop processing; we handled the autojoins. */ + return TRUE; } void * @@ -7563,10 +7566,6 @@ cached_emblems = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); - purple_signal_connect(purple_connections_get_handle(), "signed-on", - gtk_blist_handle, PURPLE_CALLBACK(account_signon_cb), - NULL); - /* Initialize prefs */ purple_prefs_add_none(PIDGIN_PREFS_ROOT "/blist"); purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/blist/show_buddy_icons", TRUE); @@ -7625,6 +7624,9 @@ purple_signal_connect(purple_blist_get_handle(), "buddy-privacy-changed", gtk_blist_handle, PURPLE_CALLBACK(pidgin_blist_update_privacy_cb), NULL); + purple_signal_connect_priority(purple_connections_get_handle(), "autojoin", + gtk_blist_handle, PURPLE_CALLBACK(autojoin_cb), + NULL, PURPLE_SIGNAL_PRIORITY_HIGHEST); } void @@ -7740,7 +7742,6 @@ return; } - if (!gtk_tree_model_iter_children(GTK_TREE_MODEL(gtkblist->treemodel), &more_z, &groupiter)) { gtk_tree_store_insert(gtkblist->treemodel, iter, &groupiter, 0); return;