Index: plugins/gestures/gestures.c =================================================================== RCS file: /cvsroot/gaim/gaim/plugins/gestures/gestures.c,v retrieving revision 1.19.2.1 diff -u -p -r1.19.2.1 gestures.c --- plugins/gestures/gestures.c 3 Sep 2004 21:34:16 -0000 1.19.2.1 +++ plugins/gestures/gestures.c 6 Sep 2004 18:22:21 -0000 @@ -304,7 +304,7 @@ init_plugin(GaimPlugin *plugin) gaim_prefs_add_none("/plugins/gtk/X11/gestures"); gaim_prefs_add_bool("/plugins/gtk/X11/gestures/visual", FALSE); - gaim_prefs_connect_callback("/plugins/gtk/X11/gestures/visual", + gaim_prefs_connect_callback(plugin, "/plugins/gtk/X11/gestures/visual", visual_pref_cb, NULL); } Index: src/blist.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/blist.c,v retrieving revision 1.169 diff -u -p -r1.169 blist.c --- src/blist.c 1 Sep 2004 01:13:21 -0000 1.169 +++ src/blist.c 6 Sep 2004 18:22:22 -0000 @@ -190,7 +190,7 @@ GaimBuddyList *gaim_blist_new() if (gbl->ui_ops != NULL && gbl->ui_ops->new_list != NULL) gbl->ui_ops->new_list(gbl); - gaim_prefs_connect_callback("/core/buddies/use_server_alias", + gaim_prefs_connect_callback(gaim_blist_get_handle(), "/core/buddies/use_server_alias", blist_pref_cb, NULL); return gbl; Index: src/conversation.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/conversation.c,v retrieving revision 1.630 diff -u -p -r1.630 conversation.c --- src/conversation.c 29 Aug 2004 16:59:47 -0000 1.630 +++ src/conversation.c 6 Sep 2004 18:22:23 -0000 @@ -2731,9 +2731,9 @@ gaim_conversations_init(void) gaim_prefs_add_bool("/core/conversations/im/send_typing", TRUE); /* Connect callbacks for changed preferences */ - gaim_prefs_connect_callback("/core/conversations/use_alias_for_title", + gaim_prefs_connect_callback(handle, "/core/conversations/use_alias_for_title", update_titles_pref_cb, NULL); - gaim_prefs_connect_callback("/core/buddies/use_server_alias", + gaim_prefs_connect_callback(handle, "/core/buddies/use_server_alias", update_titles_pref_cb, NULL); Index: src/gtkblist.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/gtkblist.c,v retrieving revision 1.174 diff -u -p -r1.174 gtkblist.c --- src/gtkblist.c 1 Sep 2004 00:46:42 -0000 1.174 +++ src/gtkblist.c 6 Sep 2004 18:22:26 -0000 @@ -417,8 +417,6 @@ map_shadow_windows (gpointer data) /**************** END WEIRD DROP SHADOW STUFF ***********************************/ #endif -static GSList *blist_prefs_callbacks = NULL; - /*************************************************** * Callbacks * ***************************************************/ @@ -3067,6 +3065,7 @@ static void _prefs_change_sort_method(co static void gaim_gtk_blist_show(GaimBuddyList *list) { + void *handle; GtkCellRenderer *rend; GtkTreeViewColumn *column; GtkWidget *sw; @@ -3153,7 +3152,7 @@ static void gaim_gtk_blist_show(GaimBudd dte, 5, GDK_ACTION_COPY | GDK_ACTION_MOVE); - g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-data-received", G_CALLBACK(gaim_gtk_blist_drag_data_rcv_cb), NULL); + g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-data-received", G_CALLBACK(gaim_gtk_blist_drag_data_rcv_cb), NULL); g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-data-get", G_CALLBACK(gaim_gtk_blist_drag_data_get_cb), NULL); /* Tooltips */ @@ -3286,60 +3285,39 @@ static void gaim_gtk_blist_show(GaimBudd /* attach prefs callbacks */ /* for the toolbar buttons */ - blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, - GINT_TO_POINTER( - gaim_prefs_connect_callback("/gaim/gtk/blist/button_style", - gaim_gtk_blist_update_toolbar, NULL))); - blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, - GINT_TO_POINTER( - gaim_prefs_connect_callback("/gaim/gtk/blist/show_buttons", - gaim_gtk_blist_update_toolbar, NULL))); + + handle = gaim_gtk_blist_get_handle(); + + gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/button_style", + gaim_gtk_blist_update_toolbar, NULL); + gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_buttons", + gaim_gtk_blist_update_toolbar, NULL); /* things that affect how buddies are displayed */ - blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, - GINT_TO_POINTER( - gaim_prefs_connect_callback("/gaim/gtk/blist/grey_idle_buddies", - _prefs_change_redo_list, NULL))); - blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, - GINT_TO_POINTER( - gaim_prefs_connect_callback("/gaim/gtk/blist/show_buddy_icons", - _prefs_change_redo_list, NULL))); - blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, - GINT_TO_POINTER( - gaim_prefs_connect_callback("/gaim/gtk/blist/show_warning_level", - _prefs_change_redo_list, NULL))); - blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, - GINT_TO_POINTER( - gaim_prefs_connect_callback("/gaim/gtk/blist/show_idle_time", - _prefs_change_redo_list, NULL))); - blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, - GINT_TO_POINTER( - gaim_prefs_connect_callback("/gaim/gtk/blist/show_empty_groups", - _prefs_change_redo_list, NULL))); - blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, - GINT_TO_POINTER( - gaim_prefs_connect_callback("/gaim/gtk/blist/show_offline_buddies", - _prefs_change_redo_list, NULL))); + gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/grey_idle_buddies", + _prefs_change_redo_list, NULL); + gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_buddy_icons", + _prefs_change_redo_list, NULL); + gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_warning_level", + _prefs_change_redo_list, NULL); + gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_idle_time", + _prefs_change_redo_list, NULL); + gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_empty_groups", + _prefs_change_redo_list, NULL); + gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_offline_buddies", + _prefs_change_redo_list, NULL); /* sorting */ - blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, - GINT_TO_POINTER( - gaim_prefs_connect_callback("/gaim/gtk/blist/sort_type", - _prefs_change_sort_method, NULL))); + gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/sort_type", + _prefs_change_sort_method, NULL); /* things that affect what columns are displayed */ - blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, - GINT_TO_POINTER( - gaim_prefs_connect_callback("/gaim/gtk/blist/show_buddy_icons", - gaim_gtk_blist_update_columns, NULL))); - blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, - GINT_TO_POINTER( - gaim_prefs_connect_callback("/gaim/gtk/blist/show_idle_time", - gaim_gtk_blist_update_columns, NULL))); - blist_prefs_callbacks = g_slist_prepend(blist_prefs_callbacks, - GINT_TO_POINTER( - gaim_prefs_connect_callback("/gaim/gtk/blist/show_warning_level", - gaim_gtk_blist_update_columns, NULL))); + gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_buddy_icons", + gaim_gtk_blist_update_columns, NULL); + gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_idle_time", + gaim_gtk_blist_update_columns, NULL); + gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_warning_level", + gaim_gtk_blist_update_columns, NULL); /* Setup some gaim signal handlers. */ gaim_signal_connect(gaim_connections_get_handle(), "signed-on", @@ -3869,10 +3847,7 @@ static void gaim_gtk_blist_destroy(GaimB awaymenu = NULL; gtkblist = NULL; - while(blist_prefs_callbacks) { - gaim_prefs_disconnect_callback(GPOINTER_TO_INT(blist_prefs_callbacks->data)); - blist_prefs_callbacks = g_slist_remove(blist_prefs_callbacks, blist_prefs_callbacks->data); - } + gaim_prefs_disconnect_by_handle(gaim_gtk_blist_get_handle()); } static void gaim_gtk_blist_set_visible(GaimBuddyList *list, gboolean show) Index: src/gtkconv.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/gtkconv.c,v retrieving revision 1.471 diff -u -p -r1.471 gtkconv.c --- src/gtkconv.c 31 Aug 2004 01:45:06 -0000 1.471 +++ src/gtkconv.c 6 Sep 2004 18:22:27 -0000 @@ -6384,34 +6384,34 @@ gaim_gtk_conversations_init(void) gaim_prefs_add_bool("/gaim/gtk/conversations/im/show_buddy_icons", TRUE); /* Connect callbacks. */ - gaim_prefs_connect_callback("/gaim/gtk/conversations/escape_closes", + gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/escape_closes", escape_closes_pref_cb, NULL); - gaim_prefs_connect_callback("/gaim/gtk/conversations/close_on_tabs", + gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/close_on_tabs", close_on_tabs_pref_cb, NULL); - gaim_prefs_connect_callback("/gaim/gtk/conversations/show_timestamps", + gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/show_timestamps", show_timestamps_pref_cb, NULL); - gaim_prefs_connect_callback("/gaim/gtk/conversations/html_shortcuts", + gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/html_shortcuts", html_shortcuts_pref_cb, NULL); - gaim_prefs_connect_callback("/gaim/gtk/conversations/smiley_shortcuts", + gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/smiley_shortcuts", smiley_shortcuts_pref_cb, NULL); - gaim_prefs_connect_callback("/gaim/gtk/conversations/show_formatting_toolbar", + gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/show_formatting_toolbar", show_formatting_toolbar_pref_cb, NULL); - gaim_prefs_connect_callback("/gaim/gtk/conversations/spellcheck", + gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/spellcheck", spellcheck_pref_cb, NULL); - gaim_prefs_connect_callback("/gaim/gtk/conversations/tab_side", + gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/tab_side", tab_side_pref_cb, NULL); - gaim_prefs_connect_callback("/gaim/gtk/conversations/placement", + gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/placement", conv_placement_pref_cb, NULL); gaim_prefs_trigger_callback("/gaim/gtk/conversations/placement"); - gaim_prefs_connect_callback("/gaim/gtk/conversations/button_type", + gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/button_type", button_type_pref_cb, NULL); /* IM callbacks */ - gaim_prefs_connect_callback("/gaim/gtk/conversations/im/animate_buddy_icons", + gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/im/animate_buddy_icons", animate_buddy_icons_pref_cb, NULL); - gaim_prefs_connect_callback("/gaim/gtk/conversations/im/show_buddy_icons", + gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/im/show_buddy_icons", show_buddy_icons_pref_cb, NULL); Index: src/gtkdebug.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/gtkdebug.c,v retrieving revision 1.44 diff -u -p -r1.44 gtkdebug.c --- src/gtkdebug.c 20 Aug 2004 05:11:30 -0000 1.44 +++ src/gtkdebug.c 6 Sep 2004 18:22:27 -0000 @@ -47,8 +47,6 @@ typedef struct gboolean timestamps; gboolean paused; - guint timestamps_handle; - } DebugWindow; static char debug_fg_colors[][8] = { @@ -70,8 +68,7 @@ struct _find { static gint debug_window_destroy(GtkWidget *w, GdkEvent *event, void *unused) { - if (debug_win->timestamps_handle != 0) - gaim_prefs_disconnect_callback(debug_win->timestamps_handle); + gaim_prefs_disconnect_by_handle(gaim_gtk_debug_get_handle()); /* If the "Save Log" dialog is open then close it */ gaim_request_close_with_handle(debug_win); @@ -298,9 +295,8 @@ debug_window_new(void) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), gaim_prefs_get_bool("/gaim/gtk/debug/timestamps")); - win->timestamps_handle = - gaim_prefs_connect_callback("/gaim/gtk/debug/timestamps", - timestamps_pref_cb, button); + gaim_prefs_connect_callback(gaim_gtk_debug_get_handle(), "/gaim/gtk/debug/timestamps", + timestamps_pref_cb, button); } /* Now our scrolled window... */ @@ -404,7 +400,7 @@ gaim_gtk_debug_init(void) gaim_prefs_add_int("/gaim/gtk/debug/width", 450); gaim_prefs_add_int("/gaim/gtk/debug/height", 250); - gaim_prefs_connect_callback("/gaim/gtk/debug/enabled", + gaim_prefs_connect_callback(NULL, "/gaim/gtk/debug/enabled", debug_enabled_cb, NULL); #define REGISTER_G_LOG_HANDLER(name) \ @@ -535,3 +531,11 @@ gaim_gtk_debug_get_ui_ops(void) { return &ops; } + +void * +gaim_gtk_debug_get_handle() { + static int handle; + + return &handle; +} + Index: src/gtkdebug.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/gtkdebug.h,v retrieving revision 1.7 diff -u -p -r1.7 gtkdebug.h --- src/gtkdebug.h 8 Aug 2004 05:37:58 -0000 1.7 +++ src/gtkdebug.h 6 Sep 2004 18:22:27 -0000 @@ -33,6 +33,13 @@ void gaim_gtk_debug_init(void); /** + * Get the handle for the GTK+ debug system. + * + * @return the handle to the debug system + */ +void *gaim_gtk_debug_get_handle(); + +/** * Shows the debug window. */ void gaim_gtk_debug_window_show(void); Index: src/gtkprefs.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/gtkprefs.c,v retrieving revision 1.204 diff -u -p -r1.204 gtkprefs.c --- src/gtkprefs.c 27 Aug 2004 22:23:31 -0000 1.204 +++ src/gtkprefs.c 6 Sep 2004 18:22:30 -0000 @@ -78,13 +78,6 @@ static GtkWidget *debugbutton = NULL; static int notebook_page = 0; static GtkTreeIter proto_iter, plugin_iter; -static guint browser_pref1_id = 0; -static guint browser_pref2_id = 0; -static guint proxy_pref_id = 0; -static guint sound_pref_id = 0; -static guint auto_resp_pref_id = 0; -static guint placement_pref_id = 0; - /* * PROTOTYPES */ @@ -368,6 +361,9 @@ delete_prefs(GtkWidget *asdf, void *gdsa gaim_plugins_unregister_probe_notify_cb(update_plugin_list); + /* Unregister callbacks. */ + gaim_prefs_disconnect_by_handle(prefs); + prefs = NULL; tree_v = NULL; sound_entry = NULL; @@ -378,14 +374,6 @@ delete_prefs(GtkWidget *asdf, void *gdsa g_object_unref(G_OBJECT(prefs_away_store)); prefs_away_store = NULL; - /* Unregister callbacks. */ - gaim_prefs_disconnect_callback(browser_pref1_id); - gaim_prefs_disconnect_callback(browser_pref2_id); - gaim_prefs_disconnect_callback(proxy_pref_id); - gaim_prefs_disconnect_callback(sound_pref_id); - gaim_prefs_disconnect_callback(auto_resp_pref_id); - gaim_prefs_disconnect_callback(placement_pref_id); - for (l = gaim_plugins_get_loaded(); l != NULL; l = l->next) { plug = l->data; @@ -1050,9 +1038,8 @@ GtkWidget *conv_page() { */ vbox2 = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, FALSE, 0); - placement_pref_id = gaim_prefs_connect_callback("/gaim/gtk/conversations/tabs", - conversation_usetabs_cb, - vbox2); + gaim_prefs_connect_callback(prefs, "/gaim/gtk/conversations/tabs", + conversation_usetabs_cb, vbox2); if (!gaim_prefs_get_bool("/gaim/gtk/conversations/tabs")) gtk_widget_set_sensitive(vbox2, FALSE); @@ -1195,8 +1182,8 @@ GtkWidget *network_page() { gtk_widget_set_sensitive(GTK_WIDGET(prefs_proxy_frame), FALSE); } - proxy_pref_id = gaim_prefs_connect_callback("/core/proxy/type", - proxy_changed_cb, prefs_proxy_frame); + gaim_prefs_connect_callback(prefs, "/core/proxy/type", + proxy_changed_cb, prefs_proxy_frame); table = gtk_table_new(4, 2, FALSE); gtk_container_set_border_width(GTK_CONTAINER(table), 5); @@ -1390,8 +1377,8 @@ GtkWidget *browser_page() { if (!strcmp(gaim_prefs_get_string("/gaim/gtk/browsers/browser"), "custom")) gtk_widget_set_sensitive(hbox, FALSE); - browser_pref1_id = gaim_prefs_connect_callback("/gaim/gtk/browsers/browser", - browser_changed1_cb, hbox); + gaim_prefs_connect_callback(prefs, "/gaim/gtk/browsers/browser", + browser_changed1_cb, hbox); } hbox = gtk_hbox_new(FALSE, 5); @@ -1406,8 +1393,8 @@ GtkWidget *browser_page() { if (strcmp(gaim_prefs_get_string("/gaim/gtk/browsers/browser"), "custom")) gtk_widget_set_sensitive(hbox, FALSE); - browser_pref2_id = gaim_prefs_connect_callback("/gaim/gtk/browsers/browser", - browser_changed2_cb, hbox); + gaim_prefs_connect_callback(prefs, "/gaim/gtk/browsers/browser", + browser_changed2_cb, hbox); gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0); @@ -1692,8 +1679,8 @@ GtkWidget *sound_page() { gtk_widget_set_sensitive(hbox, !strcmp(gaim_prefs_get_string("/gaim/gtk/sound/method"), "custom")); - sound_pref_id = gaim_prefs_connect_callback("/gaim/gtk/sound/method", - sound_changed_cb, hbox); + gaim_prefs_connect_callback(prefs, "/gaim/gtk/sound/method", + sound_changed_cb, hbox); gaim_set_accessible_label (entry, label); #endif /* _WIN32 */ @@ -2733,7 +2720,7 @@ gaim_gtk_prefs_init(void) gaim_prefs_add_string("/gaim/gtk/smileys/theme", "default"); /* Smiley Callbacks */ - gaim_prefs_connect_callback("/gaim/gtk/smileys/theme", + gaim_prefs_connect_callback(prefs, "/gaim/gtk/smileys/theme", smiley_theme_pref_cb, NULL); } Index: src/gtksound.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/gtksound.c,v retrieving revision 1.18 diff -u -p -r1.18 gtksound.c --- src/gtksound.c 20 Aug 2004 05:11:30 -0000 1.18 +++ src/gtksound.c 6 Sep 2004 18:22:31 -0000 @@ -118,7 +118,7 @@ static void gaim_gtk_sound_init(void) ao_initialize(); #endif /* USE_AO */ - gaim_prefs_connect_callback("/gaim/gtk/sound/method", + gaim_prefs_connect_callback(gaim_gtk_sound_get_handle(), "/gaim/gtk/sound/method", _pref_sound_method_changed, NULL); } @@ -394,3 +394,10 @@ char *gaim_gtk_sound_get_event_label(Gai return sounds[event].label; } + +void *gaim_gtk_sound_get_handle() +{ + static int handle; + + return &handle; +} Index: src/gtksound.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/gtksound.h,v retrieving revision 1.4 diff -u -p -r1.4 gtksound.h --- src/gtksound.h 8 Aug 2004 05:37:58 -0000 1.4 +++ src/gtksound.h 6 Sep 2004 18:22:31 -0000 @@ -30,6 +30,13 @@ /*@{*/ /** + * Get the handle for the GTK+ sound system. + * + * @return the handle to the sound system + */ +void *gaim_gtk_sound_get_handle(); + +/** * Gets GTK Sound UI opsA * * @return UI operations struct Index: src/log.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/log.c,v retrieving revision 1.103 diff -u -p -r1.103 log.c --- src/log.c 1 Sep 2004 00:48:36 -0000 1.103 +++ src/log.c 6 Sep 2004 18:22:32 -0000 @@ -345,7 +345,8 @@ void gaim_log_init(void) gaim_log_logger_add(&html_logger); gaim_log_logger_add(&txt_logger); gaim_log_logger_add(&old_logger); - gaim_prefs_connect_callback("/core/logging/format", + /* XXX: should we use a correct handle here? */ + gaim_prefs_connect_callback(NULL, "/core/logging/format", logger_pref_cb, NULL); gaim_prefs_trigger_callback("/core/logging/format"); Index: src/plugin.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/plugin.c,v retrieving revision 1.45.2.1 diff -u -p -r1.45.2.1 plugin.c --- src/plugin.c 3 Sep 2004 21:34:17 -0000 1.45.2.1 +++ src/plugin.c 6 Sep 2004 18:22:32 -0000 @@ -443,6 +443,8 @@ gaim_plugin_unload(GaimPlugin *plugin) /* I suppose this is the right place to call this... */ gaim_signal_emit(gaim_plugins_get_handle(), "plugin-unload", plugin); + gaim_prefs_disconnect_by_handle(plugin); + return TRUE; #else return TRUE; Index: src/prefs.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/prefs.c,v retrieving revision 1.437 diff -u -p -r1.437 prefs.c --- src/prefs.c 25 Jul 2004 22:13:03 -0000 1.437 +++ src/prefs.c 6 Sep 2004 18:22:33 -0000 @@ -44,6 +44,7 @@ struct pref_cb { GaimPrefCallback func; gpointer data; guint id; + void *handle; }; struct gaim_pref { @@ -96,7 +97,7 @@ static void prefs_save_cb(const char *na void gaim_prefs_init() { prefs_hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); - gaim_prefs_connect_callback("/", prefs_save_cb, NULL); + gaim_prefs_connect_callback(NULL, "/", prefs_save_cb, NULL); gaim_prefs_add_none("/core"); gaim_prefs_add_none("/plugins"); @@ -634,7 +635,7 @@ void gaim_prefs_rename(const char *oldna void gaim_prefs_rename_boolean_toggle(const char *oldname, const char *newname) { struct gaim_pref *oldpref, *newpref; - + gaim_debug_info("prefs", "Attempting to rename and toggle %s to %s\n", oldname, newname); oldpref = find_pref(oldname); @@ -648,14 +649,14 @@ void gaim_prefs_rename_boolean_toggle(co g_return_if_fail(oldpref->type == newpref->type); g_return_if_fail(oldpref->type == GAIM_PREF_BOOLEAN); g_return_if_fail(oldpref->first_child == NULL); /* can't rename parents */ - + gaim_prefs_set_bool(newname, !(oldpref->value.boolean)); remove_pref(oldpref); } -guint gaim_prefs_connect_callback(const char *name, GaimPrefCallback func, gpointer data) +guint gaim_prefs_connect_callback(void *handle, const char *name, GaimPrefCallback func, gpointer data) { struct gaim_pref *pref; struct pref_cb *cb; @@ -670,13 +671,14 @@ guint gaim_prefs_connect_callback(const cb->func = func; cb->data = data; cb->id = ++cb_id; + cb->handle = handle; pref->callbacks = g_slist_append(pref->callbacks, cb); return cb->id; } -gboolean disco_callback_helper(struct gaim_pref *pref, guint callback_id) { +static gboolean disco_callback_helper(struct gaim_pref *pref, guint callback_id) { GSList *cbs; struct gaim_pref *child; @@ -704,6 +706,33 @@ void gaim_prefs_disconnect_callback(guin disco_callback_helper(&prefs, callback_id); } +static void disco_callback_helper_handle(struct gaim_pref *pref, void *handle) { + GSList *cbs; + struct gaim_pref *child; + + if(!pref) + return; + + cbs = pref->callbacks; + while (cbs != NULL) { + struct pref_cb *cb = cbs->data; + if(cb->handle == handle) { + pref->callbacks = g_slist_remove(pref->callbacks, cb); + g_free(cb); + cbs = pref->callbacks; + } else + cbs = cbs->next; + } + + for(child = pref->first_child; child; child = child->sibling) + disco_callback_helper_handle(child, handle); +} + +void gaim_prefs_disconnect_by_handle(void *handle) { + g_return_if_fail(handle != NULL); + disco_callback_helper_handle(&prefs, handle); +} + static void gaim_prefs_write(FILE *f, struct gaim_pref *pref, int depth) { struct gaim_pref *tmp; char *esc; Index: src/prefs.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/prefs.h,v retrieving revision 1.17 diff -u -p -r1.17 prefs.h --- src/prefs.h 8 Aug 2004 05:37:58 -0000 1.17 +++ src/prefs.h 6 Sep 2004 18:22:33 -0000 @@ -224,7 +224,7 @@ GList *gaim_prefs_get_string_list(const /** * Add a callback to a pref (and its children) */ -guint gaim_prefs_connect_callback(const char *name, GaimPrefCallback cb, +guint gaim_prefs_connect_callback(void *handle, const char *name, GaimPrefCallback cb, gpointer data); /** @@ -233,6 +233,11 @@ guint gaim_prefs_connect_callback(const void gaim_prefs_disconnect_callback(guint callback_id); /** + * Remove all pref callbacks by handle + */ +void gaim_prefs_disconnect_by_handle(void *handle); + +/** * Trigger callbacks as if the pref changed */ void gaim_prefs_trigger_callback(const char *name); Index: src/proxy.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/proxy.c,v retrieving revision 1.108 diff -u -p -r1.108 proxy.c --- src/proxy.c 25 Aug 2004 03:09:07 -0000 1.108 +++ src/proxy.c 6 Sep 2004 18:22:34 -0000 @@ -1601,6 +1601,8 @@ proxy_pref_cb(const char *name, GaimPref void gaim_proxy_init(void) { + void *handle; + /* Initialize a default proxy info struct. */ global_proxy_info = gaim_proxy_info_new(); @@ -1613,14 +1615,23 @@ gaim_proxy_init(void) gaim_prefs_add_string("/core/proxy/password", ""); /* Setup callbacks for the preferences. */ - gaim_prefs_connect_callback("/core/proxy/type", + handle = gaim_proxy_get_handle(); + gaim_prefs_connect_callback(handle, "/core/proxy/type", proxy_pref_cb, NULL); - gaim_prefs_connect_callback("/core/proxy/host", + gaim_prefs_connect_callback(handle, "/core/proxy/host", proxy_pref_cb, NULL); - gaim_prefs_connect_callback("/core/proxy/port", + gaim_prefs_connect_callback(handle, "/core/proxy/port", proxy_pref_cb, NULL); - gaim_prefs_connect_callback("/core/proxy/username", + gaim_prefs_connect_callback(handle, "/core/proxy/username", proxy_pref_cb, NULL); - gaim_prefs_connect_callback("/core/proxy/password", + gaim_prefs_connect_callback(handle, "/core/proxy/password", proxy_pref_cb, NULL); } + +void * +gaim_proxy_get_handle() +{ + static int handle; + + return &handle; +} Index: src/proxy.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/proxy.h,v retrieving revision 1.27 diff -u -p -r1.27 proxy.h --- src/proxy.h 17 Feb 2004 02:17:43 -0000 1.27 +++ src/proxy.h 6 Sep 2004 18:22:34 -0000 @@ -69,6 +69,13 @@ extern "C" { /*@{*/ /** + * Get the handle for the proxy system. + * + * @return the handle to the proxy system + */ +void *gaim_proxy_get_handle(); + +/** * Creates a proxy information structure. * * @return The proxy information structure. Index: src/protocols/oscar/oscar.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/oscar/oscar.c,v retrieving revision 1.663.2.1 diff -u -p -r1.663.2.1 oscar.c --- src/protocols/oscar/oscar.c 3 Sep 2004 21:34:20 -0000 1.663.2.1 +++ src/protocols/oscar/oscar.c 6 Sep 2004 18:22:37 -0000 @@ -91,7 +91,7 @@ struct _OscarData { gboolean chpass; char *oldp; char *newp; - + GSList *oscar_chats; GSList *direct_ims; GSList *file_transfers; @@ -1721,7 +1721,7 @@ static void oscar_login(GaimAccount *acc sess->aux_data = gc; /* Connect to core Gaim signals */ - gaim_prefs_connect_callback("/plugins/prpl/oscar/recent_buddies", recent_buddies_cb, gc); + gaim_prefs_connect_callback(gc, "/plugins/prpl/oscar/recent_buddies", recent_buddies_cb, gc); conn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, NULL); if (conn == NULL) { @@ -1808,6 +1808,7 @@ static void oscar_close(GaimConnection * od->sess = NULL; g_free(gc->proto_data); gc->proto_data = NULL; + gaim_prefs_disconnect_by_handle(gc); gaim_debug_info("oscar", "Signed off.\n"); } @@ -7297,13 +7298,16 @@ recent_buddies_cb(const char *name, Gaim aim_session_t *sess = od->sess; fu32_t presence; + if (sess == NULL) + return; + presence = aim_ssi_getpresence(sess->ssi.local); if (value) { - presence |= 0x00400000; + presence &= ~0x00020000; aim_ssi_setpresence(sess, presence); } else { - presence &= ~0x00400000; + presence |= 0x00020000; aim_ssi_setpresence(sess, presence); } }