Index: src/blist.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/blist.c,v retrieving revision 1.145 diff -u -p -u -r1.145 blist.c --- src/blist.c 26 Apr 2004 20:33:31 -0000 1.145 +++ src/blist.c 15 May 2004 19:26:15 -0000 @@ -2723,6 +2723,13 @@ GList *gaim_buddy_get_extended_menu(Gaim return menu; } +GList *gaim_group_get_extended_menu(GaimGroup *g) { + GList *menu = NULL; + gaim_signal_emit(gaim_blist_get_handle(), "group-extended-menu", + g, &menu); + return menu; +} + int gaim_blist_get_group_size(GaimGroup *group, gboolean offline) { if(!group) @@ -2799,6 +2806,11 @@ gaim_blist_init(void) gaim_value_new(GAIM_TYPE_SUBTYPE, GAIM_SUBTYPE_BLIST_BUDDY), gaim_value_new(GAIM_TYPE_BOXED, "GList **")); + gaim_signal_register(handle, "group-extended-menu", + gaim_marshal_VOID__POINTER_POINTER, NULL, 2, + gaim_value_new(GAIM_TYPE_SUBTYPE, + GAIM_SUBTYPE_BLIST_GROUP), + gaim_value_new(GAIM_TYPE_BOXED, "GList **")); } void Index: src/blist.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/blist.h,v retrieving revision 1.51 diff -u -p -u -r1.51 blist.h --- src/blist.h 21 Apr 2004 01:34:22 -0000 1.51 +++ src/blist.h 15 May 2004 19:26:15 -0000 @@ -861,6 +861,12 @@ const char *gaim_buddy_get_setting(GaimB */ GList *gaim_buddy_get_extended_menu(GaimBuddy *b); +/** + * Retrieves the extended menu items for a group. + * @param g The group to obtain the extended menu items for +*/ +GList *gaim_group_get_extended_menu(GaimGroup *g); + /**************************************************************************/ /** @name UI Registration Functions */ Index: src/gtkblist.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/gtkblist.c,v retrieving revision 1.103 diff -u -p -u -r1.103 gtkblist.c --- src/gtkblist.c 9 May 2004 20:00:01 -0000 1.103 +++ src/gtkblist.c 15 May 2004 19:26:16 -0000 @@ -1077,6 +1077,13 @@ static void gaim_proto_menu_cb(GtkMenuIt pbm->callback(pbm->gc, b->name); } +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 void make_buddy_menu(GtkWidget *menu, GaimPluginProtocolInfo *prpl_info, GaimBuddy *b) { GList *list = NULL, *l = NULL; @@ -1198,9 +1205,12 @@ static gboolean gtk_blist_key_press_cb(G } static GtkWidget * -create_group_menu (GaimBlistNode *node) +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, @@ -1211,6 +1221,31 @@ create_group_menu (GaimBlistNode *node) G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL); 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 "-" titled 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); + return menu; } @@ -1363,7 +1398,8 @@ gaim_gtk_blist_show_context_menu(GaimBli /* Create a menu based on the thing we right-clicked on */ if (GAIM_BLIST_NODE_IS_GROUP(node)) { - menu = create_group_menu(node); + GaimGroup *g = (GaimGroup *)node; + menu = create_group_menu(node, g); } else if (GAIM_BLIST_NODE_IS_CHAT(node)) { GaimChat *c = (GaimChat *)node; GaimPlugin *prpl = NULL; Index: src/multi.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/multi.h,v retrieving revision 1.62 diff -u -p -u -r1.62 multi.h --- src/multi.h 19 Apr 2004 21:12:42 -0000 1.62 +++ src/multi.h 15 May 2004 19:26:16 -0000 @@ -45,6 +45,11 @@ struct proto_chat_menu { GaimConnection *gc; }; +struct proto_group_menu { + char *label; + void (*callback)(GaimGroup *); +}; + struct proto_chat_entry { char *label; char *identifier;