--- a/src/gtkblist.c Sun May 23 08:06:38 2004 +0000 +++ b/src/gtkblist.c Sun May 23 17:27:45 2004 +0000 @@ -1059,19 +1059,75 @@ } } -static void gaim_proto_menu_cb(GtkMenuItem *item, GaimBuddy *b) + +static void +blist_node_menu_cb(GtkMenuItem *item, GaimBlistNode *node) +{ + GaimBlistNodeAction *act; + act = (GaimBlistNodeAction *) g_object_get_data(G_OBJECT(item), + "gaimcallback"); + if(act->callback) + act->callback(node, act->data); +} + + +static void +append_blist_node_action (GtkWidget *menu, GaimBlistNodeAction *act, + GaimBlistNode *node, gboolean *dup_separator) { - struct proto_buddy_menu *pbm = g_object_get_data(G_OBJECT(item), "gaimcallback"); - if (pbm->callback) - pbm->callback(pbm->gc, b->name); + if(act == NULL) { + if(! *dup_separator) { + gaim_separator(menu); + *dup_separator = TRUE; + } + } else { + GtkWidget *menuitem; + + *dup_separator = FALSE; + + menuitem = gtk_menu_item_new_with_mnemonic(act->label); + g_object_set_data(G_OBJECT(menuitem), "gaimcallback", act); + g_signal_connect(G_OBJECT(menuitem), "activate", + G_CALLBACK(blist_node_menu_cb), node); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + } } + +static void +append_blist_node_proto_menu (GtkWidget *menu, GaimConnection *gc, GaimBlistNode *node) +{ + GList *l, *ll; + gboolean dup_separator = FALSE; + GaimPluginProtocolInfo *prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); + + if(!prpl_info || !prpl_info->blist_node_menu) + return; + + for(l = ll = prpl_info->blist_node_menu(node); l; l = l->next) { + GaimBlistNodeAction *act = (GaimBlistNodeAction *) l->data; + append_blist_node_action(menu, act, node, &dup_separator); + } + g_list_free(ll); +} + + +static void +append_blist_node_extended_menu (GtkWidget *menu, GaimBlistNode *node) +{ + GList *l, *ll; + gboolean dup_separator = FALSE; + + for(l = ll = gaim_blist_node_get_extended_menu(node); l; l = l->next) { + GaimBlistNodeAction *act = (GaimBlistNodeAction *) l->data; + append_blist_node_action(menu, act, node, &dup_separator); + } + g_list_free(ll); +} + + static void make_buddy_menu(GtkWidget *menu, GaimPluginProtocolInfo *prpl_info, GaimBuddy *b) { - GList *list = NULL, *l = NULL; - gboolean dup_separator = FALSE; - GtkWidget *menuitem; - if (prpl_info && prpl_info->get_info) { gaim_new_item_from_stock(menu, _("Get _Info"), GAIM_STOCK_INFO, G_CALLBACK(gtk_blist_menu_info_cb), b, 0, 0, NULL); @@ -1083,65 +1139,14 @@ gaim_new_item_from_stock(menu, _("View _Log"), NULL, G_CALLBACK(gtk_blist_menu_showlog_cb), b, 0, 0, NULL); - if (prpl_info && prpl_info->buddy_menu) { - list = prpl_info->buddy_menu(b->account->gc, b->name); - - for(l = list; l; l = l->next) { - struct proto_buddy_menu *pbm = l->data; - - /* draw NULL menu items as a separator. - Also, do some simple checking to prevent - doubled-up separators */ - if(pbm == NULL) { - if(! dup_separator) { - gaim_separator(menu); - dup_separator = TRUE; - } - continue; - } else { - dup_separator = FALSE; - } - - menuitem = gtk_menu_item_new_with_mnemonic(pbm->label); - g_object_set_data(G_OBJECT(menuitem), "gaimcallback", pbm); - g_signal_connect(G_OBJECT(menuitem), "activate", - G_CALLBACK(gaim_proto_menu_cb), b); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - } - g_list_free(list); - } - - /* check for additional menu items which may be added by other - plugins. */ - list = gaim_buddy_get_extended_menu(b); - for(l = list; l; l = l->next) { - struct proto_buddy_menu *pbm = l->data; - - /* draw NULL menu items as a separator. see previous, - identical-looking code. */ - if(pbm == NULL) { - if(! dup_separator) { - gaim_separator(menu); - dup_separator = TRUE; - } - continue; - } else { - dup_separator = FALSE; - } - - menuitem = gtk_menu_item_new_with_mnemonic(pbm->label); - g_object_set_data(G_OBJECT(menuitem), "gaimcallback", pbm); - g_signal_connect(G_OBJECT(menuitem), "activate", - G_CALLBACK(gaim_proto_menu_cb), b); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - } - g_list_free(list); + append_blist_node_proto_menu(menu, b->account->gc, (GaimBlistNode *) b); + append_blist_node_extended_menu(menu, (GaimBlistNode *) b); /* moving on to the old ui-specific plugin menus */ - gaim_signal_emit(gaim_gtk_blist_get_handle(), - "drawing-menu", menu, b); + gaim_signal_emit(gaim_gtk_blist_get_handle(), "drawing-menu", menu, b); gaim_separator(menu); + gaim_new_item_from_stock(menu, _("_Alias..."), GAIM_STOCK_ALIAS, G_CALLBACK(gtk_blist_menu_alias_cb), b, 0, 0, NULL); gaim_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE, @@ -1183,20 +1188,11 @@ return FALSE; } -static void gaim_proto_group_menu_cb(GtkMenuItem *item, GaimGroup *g) -{ - struct proto_group_menu *pgm = g_object_get_data(G_OBJECT(item), "gaimcallback"); - if (pgm->callback) - pgm->callback(g); -} static GtkWidget * create_group_menu (GaimBlistNode *node, GaimGroup *g) { GtkWidget *menu; - GList *list = NULL, *l = NULL; - gboolean dup_separator = FALSE; - GtkWidget *menuitem; menu = gtk_menu_new(); gaim_new_item_from_stock(menu, _("Add a _Buddy"), GTK_STOCK_ADD, @@ -1208,39 +1204,11 @@ gaim_new_item_from_stock(menu, _("_Rename"), NULL, G_CALLBACK(show_rename_group), node, 0, 0, NULL); - list = gaim_group_get_extended_menu(g); - for(l = list; l; l = l->next) { - struct proto_group_menu *pgm = l->data; - - /* draw NULL menu items as a separator. see previous, - identical-looking code. (in make_buddy_menu)*/ - if(pgm == NULL) { - if(! dup_separator) { - gaim_separator(menu); - dup_separator = TRUE; - } - continue; - } else { - dup_separator = FALSE; - } - - menuitem = gtk_menu_item_new_with_mnemonic(pgm->label); - g_object_set_data(G_OBJECT(menuitem), "gaimcallback", pgm); - g_signal_connect(G_OBJECT(menuitem), "activate", - G_CALLBACK(gaim_proto_group_menu_cb), g); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - } - g_list_free(list); + append_blist_node_extended_menu(menu, node); return menu; } -static void gaim_proto_chat_menu_cb(GtkMenuItem *item, GaimChat *c) -{ - struct proto_chat_menu *pcm = g_object_get_data(G_OBJECT(item), "gaimcallback"); - if (pcm->callback) - pcm->callback(pcm->gc, c->components); -} static GtkWidget * create_chat_menu (GaimBlistNode *node, @@ -1249,78 +1217,25 @@ GaimPluginProtocolInfo *prpl_info) { GtkWidget *menu; - GList *list, *l; - GtkWidget *menuitem; - gboolean dup_separator = FALSE; - gboolean autojoin = (gaim_blist_node_get_bool(node, - "gtk-autojoin") || (gaim_blist_node_get_string(node, - "gtk-autojoin") != NULL)); + gboolean autojoin; menu = gtk_menu_new(); + autojoin = (gaim_blist_node_get_bool(node, "gtk-autojoin") || + (gaim_blist_node_get_string(node, "gtk-autojoin") != NULL)); + gaim_new_item_from_stock(menu, _("_Join"), GAIM_STOCK_CHAT, - G_CALLBACK(gtk_blist_menu_join_cb), node, 0, 0, NULL); + G_CALLBACK(gtk_blist_menu_join_cb), node, 0, 0, NULL); gaim_new_check_item(menu, _("Auto-Join"), - G_CALLBACK(gtk_blist_menu_autojoin_cb), node, - autojoin); - - if (prpl_info && prpl_info->chat_menu) { - list = prpl_info->chat_menu(c->account->gc, c->components); - while (list) { - struct proto_chat_menu *pcm = list->data; - - /* draw NULL menu items as a separator. - Also, do some simple checking to prevent - doubled-up separators */ - if(pcm == NULL) { - if(! dup_separator) { - gaim_separator(menu); - dup_separator = TRUE; - } - continue; - } else { - dup_separator = FALSE; - } - - menuitem = gtk_menu_item_new_with_mnemonic(pcm->label); - g_object_set_data(G_OBJECT(menuitem), "gaimcallback", pcm); - g_signal_connect(G_OBJECT(menuitem), "activate", - G_CALLBACK(gaim_proto_chat_menu_cb), c); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - list = list->next; - } - } - - /* check for additional menu items which may be added by other - plugins. */ - list = gaim_chat_get_extended_menu(c); - for(l = list; l; l = l->next) { - struct proto_chat_menu *pcm = l->data; - - /* draw NULL menu items as a separator. see previous, - identical-looking code. */ - if(pcm == NULL) { - if(! dup_separator) { - gaim_separator(menu); - dup_separator = TRUE; - } - continue; - } else { - dup_separator = FALSE; - } - - menuitem = gtk_menu_item_new_with_mnemonic(pcm->label); - g_object_set_data(G_OBJECT(menuitem), "gaimcallback", pcm); - g_signal_connect(G_OBJECT(menuitem), "activate", - G_CALLBACK(gaim_proto_chat_menu_cb), c); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - } - g_list_free(list); + G_CALLBACK(gtk_blist_menu_autojoin_cb), node, autojoin); + + append_blist_node_proto_menu(menu, c->account->gc, node); + append_blist_node_extended_menu(menu, node); /* moving on to the old ui-specific plugin menus */ - gaim_signal_emit(gaim_gtk_blist_get_handle(), - "drawing-menu", menu, c); + gaim_signal_emit(gaim_gtk_blist_get_handle(), "drawing-menu", menu, c); gaim_separator(menu); + gaim_new_item_from_stock(menu, _("_Alias..."), GAIM_STOCK_ALIAS, G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL); gaim_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE,