# HG changeset patch # User Christian Hammond # Date 1054529579 0 # Node ID 6e551616d051a306cecd9df93d161a1bb9672a2f # Parent 48c63ee4996159eab6b5362bac9809f535bbeb1e [gaim-migrate @ 6061] The callbacks on our protocols menu are now a lot less wasteful. committer: Tailor Script diff -r 48c63ee49961 -r 6e551616d051 src/gtkutils.c --- a/src/gtkutils.c Mon Jun 02 03:52:43 2003 +0000 +++ b/src/gtkutils.c Mon Jun 02 04:52:59 2003 +0000 @@ -523,6 +523,25 @@ return vbox; } +static void +__protocol_menu_cb(GtkWidget *optmenu, GCallback cb) +{ + GtkWidget *menu; + GtkWidget *item; + GaimProtocol protocol; + gpointer user_data; + + menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu)); + item = gtk_menu_get_active(GTK_MENU(menu)); + + protocol = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(item), "protocol")); + user_data = (g_object_get_data(G_OBJECT(optmenu), "user_data")); + + if (cb != NULL) + ((void (*)(GtkWidget *, GaimProtocol, gpointer))cb)(item, protocol, + user_data); +} + GtkWidget * gaim_gtk_protocol_option_menu_new(GaimProtocol protocol, GCallback cb, gpointer user_data) @@ -544,9 +563,14 @@ optmenu = gtk_option_menu_new(); gtk_widget_show(optmenu); + g_object_set_data(G_OBJECT(optmenu), "user_data", user_data); + menu = gtk_menu_new(); gtk_widget_show(menu); + g_signal_connect(G_OBJECT(optmenu), "changed", + G_CALLBACK(__protocol_menu_cb), cb); + for (p = gaim_plugins_get_protocols(), i = 0; p != NULL; p = p->next, i++) { @@ -577,10 +601,8 @@ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image); } - g_object_set_data(G_OBJECT(item), "user_data", user_data); - - g_signal_connect(G_OBJECT(item), "activate", - cb, GINT_TO_POINTER(prpl_info->protocol)); + g_object_set_data(G_OBJECT(item), "protocol", + GINT_TO_POINTER(prpl_info->protocol)); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); gtk_widget_show(item);